<?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>77485</bug_id>
          
          <creation_ts>2012-01-31 15:27:35 -0800</creation_ts>
          <short_desc>Add FractionalLayoutUnit type for sub-pixel layout</short_desc>
          <delta_ts>2012-02-10 16:00:52 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>76571</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Levi Weintraub">leviw</reporter>
          <assigned_to name="Levi Weintraub">leviw</assigned_to>
          <cc>darin</cc>
    
    <cc>eae</cc>
    
    <cc>eric</cc>
    
    <cc>hyatt</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>546560</commentid>
    <comment_count>0</comment_count>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-01-31 15:27:35 -0800</bug_when>
    <thetext>Adding AppUnit type which is the basic unit for layout in sub-pixel layout.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546603</commentid>
    <comment_count>1</comment_count>
      <attachid>124841</attachid>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-01-31 16:10:45 -0800</bug_when>
    <thetext>Created attachment 124841
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546605</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-01-31 16:13:59 -0800</bug_when>
    <thetext>Attachment 124841 did not pass style-queue:

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

Source/WebCore/platform/AppUnit.h:76:  wtf_ceil is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Total errors found: 1 in 4 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>546617</commentid>
    <comment_count>3</comment_count>
      <attachid>124841</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-01-31 16:28:10 -0800</bug_when>
    <thetext>Comment on attachment 124841
Patch

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

&gt; Source/WebCore/platform/AppUnit.h:289
&gt; +    if ((a.rawValue() &gt;= 0 &amp;&amp; b.rawValue() &gt;= 0) || (a.rawValue() &lt; 0 &amp;&amp; b.rawValue() &lt; 0)) {
&gt; +        if (returnVal.rawValue() &lt; 0)
&gt; +            return AppUnit::max();
&gt; +        return returnVal;

since rawValue is signed, seems we care about the case of -max * max == -max.

&gt; Source/WebCore/platform/AppUnit.h:298
&gt; +    AppUnit returnVal;

&quot;result&quot; is shorter.  Your call.

&gt; Source/WebCore/platform/AppUnit.h:300
&gt; +    returnVal.setRawValue((a.rawValue() / kFixedPointDenominator) * b.rawValue());
&gt; +    ASSERT((a.rawValue() &gt;= 0 &amp;&amp; b.rawValue() &gt;= 0 &amp;&amp; returnVal.rawValue() &gt;= 0)

I wonder if we should rename rawValue to value() given how much its typed here. :)

&gt; Source/WebCore/platform/AppUnit.h:314
&gt; +inline float operator*(const AppUnit&amp; a, float b)
&gt; +{
&gt; +    return a.toFloat() * b;
&gt; +}

(float)(AppUnit(a) * b) != a * b.toFloat()... right?  I&apos;m realizing that if we&apos;re not careful we could have operators which are subtly different like this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546632</commentid>
    <comment_count>4</comment_count>
      <attachid>124841</attachid>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-01-31 16:43:38 -0800</bug_when>
    <thetext>Comment on attachment 124841
Patch

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

&gt;&gt; Source/WebCore/platform/AppUnit.h:289
&gt;&gt; +        return returnVal;
&gt; 
&gt; since rawValue is signed, seems we care about the case of -max * max == -max.

Check out the if above. We only get into this case if both raw values are + or -.

&gt;&gt; Source/WebCore/platform/AppUnit.h:300
&gt;&gt; +    ASSERT((a.rawValue() &gt;= 0 &amp;&amp; b.rawValue() &gt;= 0 &amp;&amp; returnVal.rawValue() &gt;= 0)
&gt; 
&gt; I wonder if we should rename rawValue to value() given how much its typed here. :)

I went with rawValue to ward of misuse. rawValue is public because there are a very small number of cases where we needed it outside of AppUnit.h.

&gt;&gt; Source/WebCore/platform/AppUnit.h:314
&gt;&gt; +}
&gt; 
&gt; (float)(AppUnit(a) * b) != a * b.toFloat()... right?  I&apos;m realizing that if we&apos;re not careful we could have operators which are subtly different like this.

This is entirely true. When interacting with floating point, we opt to return floats with the assumption/hope that this is what&apos;s ultimately wanted and used. We&apos;d end up doing a lot more work and losing precision in a case like this:
float f = foo;
AppUnit a = bar;
float result = f * bar;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546669</commentid>
    <comment_count>5</comment_count>
      <attachid>124841</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2012-01-31 17:18:17 -0800</bug_when>
    <thetext>Comment on attachment 124841
Patch

AppUnit? Where does that name come from?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546678</commentid>
    <comment_count>6</comment_count>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-01-31 17:27:53 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 124841 [details])
&gt; AppUnit? Where does that name come from?

From Gecko: https://wiki.mozilla.org/Mozilla2:Units

We&apos;re not wedded to the name, though, if you have any suggestions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>550484</commentid>
    <comment_count>7</comment_count>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-02-06 17:51:47 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; (In reply to comment #5)
&gt; &gt; (From update of attachment 124841 [details] [details])
&gt; &gt; AppUnit? Where does that name come from?
&gt; 
&gt; From Gecko: https://wiki.mozilla.org/Mozilla2:Units
&gt; 
&gt; We&apos;re not wedded to the name, though, if you have any suggestions.

I should add that our plan is to rename AppUnit to LayoutUnit once we&apos;ve landed sub-pixel layout, thereby giving it a better name and removing the current abstraction.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551153</commentid>
    <comment_count>8</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2012-02-07 11:19:07 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; I should add that our plan is to rename AppUnit to LayoutUnit once we&apos;ve landed sub-pixel layout, thereby giving it a better name and removing the current abstraction.

If that’s the plan, then I suggest FractionalLayoutUnit rather than AppUnit as the temporary name.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551225</commentid>
    <comment_count>9</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2012-02-07 12:14:37 -0800</bug_when>
    <thetext>Or maybe SubpixelLayoutUnit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551229</commentid>
    <comment_count>10</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-02-07 12:17:56 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; Or maybe SubpixelLayoutUnit.

Or SubpixelUnit?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551233</commentid>
    <comment_count>11</comment_count>
      <attachid>125898</attachid>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-02-07 12:21:47 -0800</bug_when>
    <thetext>Created attachment 125898
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551237</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-07 12:24:31 -0800</bug_when>
    <thetext>Attachment 125898 did not pass style-queue:

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

Source/WebCore/platform/FractionalLayoutUnit.h:76:  wtf_ceil is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Total errors found: 1 in 4 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>551303</commentid>
    <comment_count>13</comment_count>
      <attachid>125898</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-02-07 13:27:15 -0800</bug_when>
    <thetext>Comment on attachment 125898
Patch

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

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:81
&gt; +        return (m_value &gt; 0 ? m_value + kFixedPointDenominator - 1 : m_value - kFixedPointDenominator + 1) / kFixedPointDenominator;

might be clearer written out like round.  Doens&apos;t really matter.

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:112
&gt; +        return ::abs(value) &lt; std::numeric_limits&lt;int&gt;::max() / 60;

Why not use the denominator constant?

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:148
&gt; +    return FractionalLayoutUnit(a) &lt;= b;

It&apos;s slightly odd to me that whenever you deal with floats you convert the unit to a float before comparison, but whenever dealing with ints you convert the int to a unit for comparision.  That&apos;s probably right.  But still strikes me as odd that they&apos;re different.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551329</commentid>
    <comment_count>14</comment_count>
      <attachid>125898</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-02-07 13:46:08 -0800</bug_when>
    <thetext>Comment on attachment 125898
Patch

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

I think we need another round.

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:126
&gt; +inline bool operator&lt;=(const FractionalLayoutUnit&amp; a, const FractionalLayoutUnit&amp; b)

Isn&apos;t this defined automagically as &lt; || == ?  I&apos;m surpised you need to write all these.

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:269
&gt; +inline bool operator==(const FractionalLayoutUnit&amp; a, int b)
&gt; +{
&gt; +    return a.toInt() == b;
&gt; +}
&gt; +
&gt; +inline bool operator==(const int a, const FractionalLayoutUnit&amp; b)
&gt; +{
&gt; +    return a == b.toInt();
&gt; +}

This one is also off, since you tend to use FractionalLayoutUnit(int) instead?

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:274
&gt; +inline bool operator==(const FractionalLayoutUnit&amp; a, float b)
&gt; +{
&gt; +    return a == FractionalLayoutUnit(b);
&gt; +}

This seems to be the opposite of your normal pattern...

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:285
&gt; +    returnVal.setRawValue((a.rawValue() / kFixedPointDenominator) * b.rawValue());

So this loses precison on a... but not on b?  Odd.

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:299
&gt; +    returnVal.setRawValue((a.rawValue() / kFixedPointDenominator) * b.rawValue());

Again, losing precision on a, but not b.  I think you want to use long long temporaries.

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:359
&gt; +    returnVal.setRawValue(kFixedPointDenominator * (a.rawValue() / b.rawValue()));

(a/b) / (c/b) == (a/b) * (b/c) == a/c?

So you could have just written this as:
AppUnit returnVal(a.rawValue() / b.rawValue())

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:481
&gt; +    a = a + b.toFloat();

These toFloats() shouldn&apos;t be needed.

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:499
&gt; +    a = a - b.toFloat();

Here too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551574</commentid>
    <comment_count>15</comment_count>
      <attachid>125898</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2012-02-07 17:04:10 -0800</bug_when>
    <thetext>Comment on attachment 125898
Patch

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

&gt;&gt; Source/WebCore/platform/FractionalLayoutUnit.h:126
&gt;&gt; +inline bool operator&lt;=(const FractionalLayoutUnit&amp; a, const FractionalLayoutUnit&amp; b)
&gt; 
&gt; Isn&apos;t this defined automagically as &lt; || == ?  I&apos;m surpised you need to write all these.

It’s not. This is correct.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551575</commentid>
    <comment_count>16</comment_count>
      <attachid>125898</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2012-02-07 17:05:06 -0800</bug_when>
    <thetext>Comment on attachment 125898
Patch

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

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:264
&gt; +inline bool operator==(const FractionalLayoutUnit&amp; a, int b)
&gt; +{
&gt; +    return a.toInt() == b;
&gt; +}

This doesn’t sound right. If you compare a double with an int then 0.1 is not equal to 0.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551577</commentid>
    <comment_count>17</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-02-07 17:08:11 -0800</bug_when>
    <thetext>(In reply to comment #15)
&gt; (From update of attachment 125898 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=125898&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WebCore/platform/FractionalLayoutUnit.h:126
&gt; &gt;&gt; +inline bool operator&lt;=(const FractionalLayoutUnit&amp; a, const FractionalLayoutUnit&amp; b)
&gt; &gt; 
&gt; &gt; Isn&apos;t this defined automagically as &lt; || == ?  I&apos;m surpised you need to write all these.
&gt; 
&gt; It’s not. This is correct.

It seems it might be useful to have a template base-class which did that sort of automagic operator defintions for you. :)   The advantage of this approach is it&apos;s explicit (which can be useful for tricky comparisons), but I suspect most times we override &lt;=, we&apos;d rather just have an automagic &lt;= defined as &lt; or ||.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552498</commentid>
    <comment_count>18</comment_count>
      <attachid>126154</attachid>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-02-08 14:31:24 -0800</bug_when>
    <thetext>Created attachment 126154
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552503</commentid>
    <comment_count>19</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-08 14:36:54 -0800</bug_when>
    <thetext>Attachment 126154 did not pass style-queue:

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

Source/WebCore/platform/FractionalLayoutUnit.h:76:  wtf_ceil is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Total errors found: 1 in 4 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>552595</commentid>
    <comment_count>20</comment_count>
      <attachid>126154</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-02-08 16:15:38 -0800</bug_when>
    <thetext>Comment on attachment 126154
Patch

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

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:276
&gt; +inline bool operator==(const FractionalLayoutUnit&amp; a, float b)
&gt; +{
&gt; +    return a.toFloat() == b;
&gt; +}

Did we decide that .toFloat() was correct here?  You want this comparison to be exact, I assume?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552596</commentid>
    <comment_count>21</comment_count>
      <attachid>126154</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-02-08 16:16:01 -0800</bug_when>
    <thetext>Comment on attachment 126154
Patch

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

&gt; Source/WebCore/platform/FractionalLayoutUnit.h:289
&gt; +        return AppUnit::max();

Doubt this compiles. :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552676</commentid>
    <comment_count>22</comment_count>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-02-08 17:32:34 -0800</bug_when>
    <thetext>(In reply to comment #20)
&gt; (From update of attachment 126154 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=126154&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/FractionalLayoutUnit.h:276
&gt; &gt; +inline bool operator==(const FractionalLayoutUnit&amp; a, float b)
&gt; &gt; +{
&gt; &gt; +    return a.toFloat() == b;
&gt; &gt; +}
&gt; 
&gt; Did we decide that .toFloat() was correct here?  You want this comparison to be exact, I assume?

Yes. And I tested these changes on our branch and found a bug as well :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552704</commentid>
    <comment_count>23</comment_count>
      <attachid>126210</attachid>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-02-08 17:52:07 -0800</bug_when>
    <thetext>Created attachment 126210
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552711</commentid>
    <comment_count>24</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-08 17:57:34 -0800</bug_when>
    <thetext>Attachment 126210 did not pass style-queue:

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

Source/WebCore/platform/FractionalLayoutUnit.h:76:  wtf_ceil is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Total errors found: 1 in 4 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>554454</commentid>
    <comment_count>25</comment_count>
    <who name="Emil A Eklund">eae</who>
    <bug_when>2012-02-10 15:44:25 -0800</bug_when>
    <thetext>Ping?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554456</commentid>
    <comment_count>26</comment_count>
      <attachid>126210</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-02-10 15:48:56 -0800</bug_when>
    <thetext>Comment on attachment 126210
Patch

OK.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554469</commentid>
    <comment_count>27</comment_count>
      <attachid>126210</attachid>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-02-10 16:00:47 -0800</bug_when>
    <thetext>Comment on attachment 126210
Patch

Clearing flags on attachment: 126210

Committed r107453: &lt;http://trac.webkit.org/changeset/107453&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554470</commentid>
    <comment_count>28</comment_count>
    <who name="Levi Weintraub">leviw</who>
    <bug_when>2012-02-10 16:00:52 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>124841</attachid>
            <date>2012-01-31 16:10:45 -0800</date>
            <delta_ts>2012-02-07 12:21:43 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77485-20120131161044.patch</filename>
            <type>text/plain</type>
            <size>18144</size>
            <attacher name="Levi Weintraub">leviw</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwNjQwNSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBACisyMDEyLTAxLTMxICBFbWlsIEEg
RWtsdW5kICA8ZWFlQGNocm9taXVtLm9yZz4gYW5kIExldmkgV2VpbnRyYXViICA8bGV2aXdAY2hy
b21pdW0ub3JnPgorCisgICAgICAgIEFkZCBBcHBVbml0IHR5cGUgZm9yIHN1Yi1waXhlbCBsYXlv
dXQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc3NDg1
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIGZp
eGVkIHBvaW50IGltcGxlbWVudGF0aW9uIChBcHBVbml0KS4KKworICAgICAgICBBcHBVbml0IHJl
cHJlc2VudHMgdmFsdWVzIGFzIG11bHRpcGxlcyBvZiAxLzYwdGggcGl4ZWwuIFRoaXMgYWxsb3dz
IHVzCisgICAgICAgIHRvIHJlcHJlc2VudCBzdWItcGl4ZWwgdmFsdWVzIHVzaW5nIGludGVnZXIg
bWF0aCBhbmQgYXZvaWRzIGZsb2F0aW5nCisgICAgICAgIHBvaW50IHByZWNpc2lvbiBwcm9ibGVt
cy4KKworICAgICAgICBObyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9X
ZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2o6CisgICAgICAgICogcGxhdGZvcm0vQXBwVW5pdC5oOiBBZGRlZC4KKwogMjAxMi0wMS0zMSAg
U2hlcmlmZiBCb3QgIDx3ZWJraXQucmV2aWV3LmJvdEBnbWFpbC5jb20+CiAKICAgICAgICAgVW5y
ZXZpZXdlZCwgcm9sbGluZyBvdXQgcjEwNjM3Ni4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNv
cmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dl
YkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCShyZXZpc2lvbiAxMDY0MDUpCisrKyBTb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAt
MjYzNzgsNiArMjYzNzgsMTAgQEAKIAkJCU5hbWU9InBsYXRmb3JtIgogCQkJPgogCQkJPEZpbGUK
KwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXEFwcFVuaXQuaCIKKwkJCQk+CisJCQk8L0Zp
bGU+CisJCQk8RmlsZQogCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cQXJlbmEuY3BwIgog
CQkJCT4KIAkJCTwvRmlsZT4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDEwNjQwNSkKKysrIFNvdXJjZS9XZWJD
b3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAt
NDk2MCw2ICs0OTYwLDcgQEAKIAkJQjhEQkRCNEMxMzBCMEY4QTAwRjVDREIxIC8qIFNldFNlbGVj
dGlvbkNvbW1hbmQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEI4REJEQjQ4MTMwQjBGOEEwMEY1Q0RCMSAvKiBTZXRTZWxlY3Rpb25Db21tYW5kLmggKi87
IH07CiAJCUI4REJEQjREMTMwQjBGOEEwMEY1Q0RCMSAvKiBTcGVsbGluZ0NvcnJlY3Rpb25Db21t
YW5kLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEI4
REJEQjQ5MTMwQjBGOEEwMEY1Q0RCMSAvKiBTcGVsbGluZ0NvcnJlY3Rpb25Db21tYW5kLmNwcCAq
LzsgfTsKIAkJQjhEQkRCNEUxMzBCMEY4QTAwRjVDREIxIC8qIFNwZWxsaW5nQ29ycmVjdGlvbkNv
bW1hbmQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEI4
REJEQjRBMTMwQjBGOEEwMEY1Q0RCMSAvKiBTcGVsbGluZ0NvcnJlY3Rpb25Db21tYW5kLmggKi87
IH07CisJCUJBQjIyQUQ0MTRCN0EwMkQwMEQ4QUJBNiAvKiBBcHBVbml0LmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQUI3NzE1MDE0NDRDQkI0MDBFQzRD
NEMgLyogQXBwVW5pdC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7
IH07IH07CiAJCUJBQ0YyOTAxMTNCMkEwRDUwMDc4MUY5MCAvKiBMYXlvdXRUeXBlcy5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkFDRjI5MDAxM0IyQTBE
NTAwNzgxRjkwIC8qIExheW91dFR5cGVzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAo
UHJpdmF0ZSwgKTsgfTsgfTsKIAkJQkMwMEYwMDQwRTBBMTg1NTAwRkQwNEUzIC8qIERPTUZpbGUu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDMDBFRkZF
MEUwQTE4NTUwMEZEMDRFMyAvKiBET01GaWxlLmggKi87IH07CiAJCUJDMDBGMDA1MEUwQTE4NTUw
MEZEMDRFMyAvKiBET01GaWxlLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQkMwMEVGRkYwRTBBMTg1NTAwRkQwNEUzIC8qIERPTUZpbGUubW0gKi87IH07
CkBAIC0xMTgzNyw2ICsxMTgzOCw3IEBACiAJCUI4REJEQjQ4MTMwQjBGOEEwMEY1Q0RCMSAvKiBT
ZXRTZWxlY3Rpb25Db21tYW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNl
dFNlbGVjdGlvbkNvbW1hbmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQjhEQkRC
NDkxMzBCMEY4QTAwRjVDREIxIC8qIFNwZWxsaW5nQ29ycmVjdGlvbkNvbW1hbmQuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gU3BlbGxpbmdDb3JyZWN0aW9uQ29tbWFu
ZC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUI4REJEQjRBMTMwQjBGOEEwMEY1
Q0RCMSAvKiBTcGVsbGluZ0NvcnJlY3Rpb25Db21tYW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IFNwZWxsaW5nQ29ycmVjdGlvbkNvbW1hbmQuaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKKwkJQkFCNzcxNTAxNDQ0Q0JCNDAwRUM0QzRDIC8qIEFwcFVuaXQuaCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQXBwVW5pdC5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlCQUNGMjkwMDEzQjJBMEQ1MDA3ODFGOTAgLyogTGF5b3V0VHlwZXMuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTGF5b3V0VHlwZXMuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkMwMEVGRkUwRTBBMTg1NTAwRkQwNEUzIC8qIERPTUZpbGUu
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRE9NRmlsZS5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQlCQzAwRUZGRjBFMEExODU1MDBGRDA0RTMgLyogRE9NRmlsZS5t
bSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IERPTUZpbGUubW07IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xOTU2NSw2ICsxOTU2Nyw3IEBACiAJCQkJNTE2
MDMwMDkwQ0M0MjQ1NDAwQzhBQzI1IC8qIHBvc2l4ICovLAogCQkJCTFBMkU2RTU2MENDNTUxRTAw
MDRBMjA2MiAvKiBzcWwgKi8sCiAJCQkJQjJDM0Q5RUMwRDAwNkMxRDAwRUY2RjI2IC8qIHRleHQg
Ki8sCisJCQkJQkFCNzcxNTAxNDQ0Q0JCNDAwRUM0QzRDIC8qIEFwcFVuaXQuaCAqLywKIAkJCQlC
Q0ZCMkY3NDA5N0EyRTFBMDBCQTcwM0QgLyogQXJlbmEuY3BwICovLAogCQkJCUJDRkIyRjc1MDk3
QTJFMUEwMEJBNzAzRCAvKiBBcmVuYS5oICovLAogCQkJCTJFRjFCRkY2MTIxQ0IwQkQwMEMyNzYy
NyAvKiBBc3luY0ZpbGVTdHJlYW0uaCAqLywKQEAgLTIxMDA5LDYgKzIxMDEyLDcgQEAKIAkJCQkx
QTJBQUM1OTBEQzJBM0IxMDBBMjBEOUEgLyogQXBwbGljYXRpb25DYWNoZVN0b3JhZ2UuaCBpbiBI
ZWFkZXJzICovLAogCQkJCTlCNDE3MDY0MTI1NjYyQjMwMDZCMjhGQyAvKiBBcHBseUJsb2NrRWxl
bWVudENvbW1hbmQuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzMzA5REQ5MDk5RTY0OTIwMDU2RTU4
MSAvKiBBcHBseVN0eWxlQ29tbWFuZC5oIGluIEhlYWRlcnMgKi8sCisJCQkJQkFCMjJBRDQxNEI3
QTAyRDAwRDhBQkE2IC8qIEFwcFVuaXQuaCBpbiBIZWFkZXJzICovLAogCQkJCTUxMkREOEY2MEQ5
MUU2QUYwMDBGODlFRSAvKiBBcmNoaXZlLmggaW4gSGVhZGVycyAqLywKIAkJCQk1MTJERDhGRDBE
OTFFNkFGMDAwRjg5RUUgLyogQXJjaGl2ZUZhY3RvcnkuaCBpbiBIZWFkZXJzICovLAogCQkJCTUx
MkREOEZDMEQ5MUU2QUYwMDBGODlFRSAvKiBBcmNoaXZlUmVzb3VyY2UuaCBpbiBIZWFkZXJzICov
LApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vQXBwVW5pdC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0FwcFVuaXQuaAkocmV2aXNpb24gMCkKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL0FwcFVuaXQuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1MjIg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGlu
IHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xl
IEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisg
KiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2lmbmRlZiBBcHBVbml0X2gKKyNkZWZpbmUgQXBwVW5pdF9oCisKKyNpbmNsdWRlIDxsaW1p
dHMuaD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworc3RhdGljIGNvbnN0IGludCBrRml4ZWRQb2ludERlbm9taW5hdG9yID0g
NjA7Citjb25zdCBpbnQgaW50TWF4Rm9yQXBwVW5pdCA9IElOVF9NQVggLyBrRml4ZWRQb2ludERl
bm9taW5hdG9yOworY29uc3QgaW50IGludE1pbkZvckFwcFVuaXQgPSAtaW50TWF4Rm9yQXBwVW5p
dDsKKworY2xhc3MgQXBwVW5pdCB7CitwdWJsaWM6CisgICAgQXBwVW5pdCgpIDogbV92YWx1ZSgw
KSB7IH0KKyAgICBBcHBVbml0KGludCB2YWx1ZSkgeyBBU1NFUlQoaXNJbkJvdW5kcyh2YWx1ZSkp
OyBtX3ZhbHVlID0gdmFsdWUgKiBrRml4ZWRQb2ludERlbm9taW5hdG9yOyB9CisgICAgQXBwVW5p
dCh1bnNpZ25lZCBzaG9ydCB2YWx1ZSkgeyBBU1NFUlQoaXNJbkJvdW5kcyh2YWx1ZSkpOyBtX3Zh
bHVlID0gdmFsdWUgKiBrRml4ZWRQb2ludERlbm9taW5hdG9yOyB9CisgICAgQXBwVW5pdCh1bnNp
Z25lZCBpbnQgdmFsdWUpIHsgQVNTRVJUKGlzSW5Cb3VuZHModmFsdWUpKTsgbV92YWx1ZSA9IHZh
bHVlICoga0ZpeGVkUG9pbnREZW5vbWluYXRvcjsgfQorICAgIEFwcFVuaXQoZmxvYXQgdmFsdWUp
IHsgQVNTRVJUKGlzSW5Cb3VuZHModmFsdWUpKTsgbV92YWx1ZSA9IHZhbHVlICoga0ZpeGVkUG9p
bnREZW5vbWluYXRvcjsgfQorICAgIEFwcFVuaXQoZG91YmxlIHZhbHVlKSB7IEFTU0VSVChpc0lu
Qm91bmRzKHZhbHVlKSk7IG1fdmFsdWUgPSB2YWx1ZSAqIGtGaXhlZFBvaW50RGVub21pbmF0b3I7
IH0KKyAgICBBcHBVbml0KGNvbnN0IEFwcFVuaXQmIHZhbHVlKSB7IG1fdmFsdWUgPSB2YWx1ZS5y
YXdWYWx1ZSgpOyB9CisKKyAgICBpbmxpbmUgaW50IHRvSW50KCkgY29uc3QgeyByZXR1cm4gbV92
YWx1ZSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7IH0KKyAgICBpbmxpbmUgdW5zaWduZWQgdG9V
bnNpZ25lZCgpIGNvbnN0IHsgQVNTRVJUKG1fdmFsdWUgPj0gMCk7IHJldHVybiB0b0ludCgpOyB9
CisgICAgaW5saW5lIGZsb2F0IHRvRmxvYXQoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxm
bG9hdD4obV92YWx1ZSkgLyBrRml4ZWRQb2ludERlbm9taW5hdG9yOyB9CisgICAgaW5saW5lIGRv
dWJsZSB0b0RvdWJsZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4obV92YWx1
ZSkgLyBrRml4ZWRQb2ludERlbm9taW5hdG9yOyB9CisKKyAgICBvcGVyYXRvciBpbnQoKSBjb25z
dCB7IHJldHVybiB0b0ludCgpOyB9CisgICAgb3BlcmF0b3IgdW5zaWduZWQoKSBjb25zdCB7IHJl
dHVybiB0b1Vuc2lnbmVkKCk7IH0KKyAgICBvcGVyYXRvciBsb25nIHVuc2lnbmVkIGludCgpIGNv
bnN0IHsgcmV0dXJuIHRvVW5zaWduZWQoKTsgfQorICAgIG9wZXJhdG9yIGZsb2F0KCkgY29uc3Qg
eyByZXR1cm4gdG9GbG9hdCgpOyB9CisgICAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3QgeyByZXR1
cm4gdG9Eb3VibGUoKTsgfQorICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX3Zh
bHVlOyB9CisKKyAgICBpbmxpbmUgaW50IHJhd1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1
ZTsgfQorICAgIGlubGluZSB2b2lkIHNldFJhd1ZhbHVlKGludCB2YWx1ZSkgeyBtX3ZhbHVlID0g
dmFsdWU7IH0KKworICAgIGlubGluZSBBcHBVbml0IGFicygpCisgICAgeworICAgICAgICBBcHBV
bml0IHJldHVyblZhbHVlOworICAgICAgICByZXR1cm5WYWx1ZS5zZXRSYXdWYWx1ZSg6OmFicyht
X3ZhbHVlKSk7CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICB9CisjaWYgT1MoREFS
V0lOKQorICAgIGlubGluZSBpbnQgd3RmX2NlaWwoKQorI2Vsc2UKKyAgICBpbmxpbmUgaW50IGNl
aWwoKQorI2VuZGlmCisgICAgeworICAgICAgICByZXR1cm4gKG1fdmFsdWUgPiAwID8gbV92YWx1
ZSArIGtGaXhlZFBvaW50RGVub21pbmF0b3IgLSAxIDogbV92YWx1ZSAtIGtGaXhlZFBvaW50RGVu
b21pbmF0b3IgKyAxKSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7CisgICAgfQorICAgIGlubGlu
ZSBpbnQgcm91bmQoKQorICAgIHsKKyAgICAgICAgaWYgKG1fdmFsdWUgPiAwKQorICAgICAgICAg
ICAgcmV0dXJuIChtX3ZhbHVlICsgKGtGaXhlZFBvaW50RGVub21pbmF0b3IgLyAyKSkgLyBrRml4
ZWRQb2ludERlbm9taW5hdG9yOworICAgICAgICByZXR1cm4gKG1fdmFsdWUgLSAoa0ZpeGVkUG9p
bnREZW5vbWluYXRvciAvIDIpKSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7CisgICAgfQorCisg
ICAgaW5saW5lIGludCBmbG9vcigpCisgICAgeworICAgICAgICByZXR1cm4gdG9JbnQoKTsKKyAg
ICB9CisKKyAgICBzdGF0aWMgZmxvYXQgZXBzaWxvbigpIHsgcmV0dXJuIDEgLyBrRml4ZWRQb2lu
dERlbm9taW5hdG9yOyB9CisgICAgc3RhdGljIGNvbnN0IEFwcFVuaXQgbWF4KCkKKyAgICB7Cisg
ICAgICAgIEFwcFVuaXQgbTsKKyAgICAgICAgbS5tX3ZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0
czxpbnQ+OjptYXgoKTsKKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorICAgIHN0YXRpYyBjb25z
dCBBcHBVbml0IG1pbigpCisgICAgeworICAgICAgICBBcHBVbml0IG07CisgICAgICAgIG0ubV92
YWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCk7CisgICAgICAgIHJldHVybiBt
OworICAgIH0KKyAgICAKK3ByaXZhdGU6CisgICAgaW5saW5lIGJvb2wgaXNJbkJvdW5kcyhpbnQg
dmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gOjphYnModmFsdWUpIDwgc3RkOjpudW1lcmlj
X2xpbWl0czxpbnQ+OjptYXgoKSAvIDYwOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBpc0luQm91
bmRzKHVuc2lnbmVkIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlIDwgc3RkOjpu
dW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSAvIDYwOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBp
c0luQm91bmRzKGRvdWJsZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiA6OmFicyh2YWx1
ZSkgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpIC8gNjA7CisgICAgfQorCisgICAg
aW50IG1fdmFsdWU7Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEFwcFVuaXQm
IGEsIGNvbnN0IEFwcFVuaXQmIGIpCit7CisgICAgcmV0dXJuIGEucmF3VmFsdWUoKSA8PSBiLnJh
d1ZhbHVlKCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgQXBwVW5pdCYgYSwg
ZmxvYXQgYikKK3sKKyAgICByZXR1cm4gYS50b0Zsb2F0KCkgPD0gYjsKK30KKworaW5saW5lIGJv
b2wgb3BlcmF0b3I8PShjb25zdCBBcHBVbml0JiBhLCBpbnQgYikKK3sKKyAgICByZXR1cm4gYSA8
PSBBcHBVbml0KGIpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGZsb2F0IGEs
IGNvbnN0IEFwcFVuaXQmIGIpCit7CisgICAgcmV0dXJuIGEgPD0gYi50b0Zsb2F0KCk7Cit9CisK
K2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgaW50IGEsIGNvbnN0IEFwcFVuaXQmIGIpCit7
CisgICAgcmV0dXJuIEFwcFVuaXQoYSkgPD0gYjsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+
PShjb25zdCBBcHBVbml0JiBhLCBjb25zdCBBcHBVbml0JiBiKQoreworICAgIHJldHVybiBhLnJh
d1ZhbHVlKCkgPj0gYi5yYXdWYWx1ZSgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNv
bnN0IEFwcFVuaXQmIGEsIGludCBiKQoreworICAgIHJldHVybiBhID49IEFwcFVuaXQoYik7Cit9
CisKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgZmxvYXQgYSwgY29uc3QgQXBwVW5pdCYg
YikKK3sKKyAgICByZXR1cm4gYSA+PSBiLnRvRmxvYXQoKTsKK30KKworaW5saW5lIGJvb2wgb3Bl
cmF0b3I+PShjb25zdCBBcHBVbml0JiBhLCBmbG9hdCBiKQoreworICAgIHJldHVybiBhLnRvRmxv
YXQoKSA+PSBiOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGludCBhLCBjb25z
dCBBcHBVbml0JiBiKQoreworICAgIHJldHVybiBBcHBVbml0KGEpID49IGI7Cit9CisKK2lubGlu
ZSBib29sIG9wZXJhdG9yPChjb25zdCBBcHBVbml0JiBhLCBjb25zdCBBcHBVbml0JiBiKQorewor
ICAgIHJldHVybiBhLnJhd1ZhbHVlKCkgPCBiLnJhd1ZhbHVlKCk7Cit9CisKK2lubGluZSBib29s
IG9wZXJhdG9yPChjb25zdCBBcHBVbml0JiBhLCBpbnQgYikKK3sKKyAgICByZXR1cm4gYSA8IEFw
cFVuaXQoYik7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBBcHBVbml0JiBhLCBm
bG9hdCBiKQoreworICAgIHJldHVybiBhLnRvRmxvYXQoKSA8IGI7Cit9CisKK2lubGluZSBib29s
IG9wZXJhdG9yPChjb25zdCBpbnQgYSwgY29uc3QgQXBwVW5pdCYgYikKK3sKKyAgICByZXR1cm4g
QXBwVW5pdChhKSA8IGI7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBmbG9hdCBh
LCBjb25zdCBBcHBVbml0JiBiKQoreworICAgIHJldHVybiBhIDwgYi50b0Zsb2F0KCk7Cit9CisK
K2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBBcHBVbml0JiBhLCBjb25zdCBBcHBVbml0JiBi
KQoreworICAgIHJldHVybiBhLnJhd1ZhbHVlKCkgPiBiLnJhd1ZhbHVlKCk7Cit9CisKK2lubGlu
ZSBib29sIG9wZXJhdG9yPihjb25zdCBBcHBVbml0JiBhLCBkb3VibGUgYikKK3sKKyAgICByZXR1
cm4gYS50b0RvdWJsZSgpID4gYjsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEFw
cFVuaXQmIGEsIGZsb2F0IGIpCit7CisgICAgcmV0dXJuIGEudG9GbG9hdCgpID4gYjsKK30KKwor
aW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEFwcFVuaXQmIGEsIGludCBiKQoreworICAgIHJl
dHVybiBhID4gQXBwVW5pdChiKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGlu
dCBhLCBjb25zdCBBcHBVbml0JiBiKQoreworICAgIHJldHVybiBBcHBVbml0KGEpID4gYjsKK30K
KworaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGZsb2F0IGEsIGNvbnN0IEFwcFVuaXQmIGIp
Cit7CisgICAgcmV0dXJuIGEgPiBiLnRvRmxvYXQoKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0
b3I+KGNvbnN0IGRvdWJsZSBhLCBjb25zdCBBcHBVbml0JiBiKQoreworICAgIHJldHVybiBhID4g
Yi50b0RvdWJsZSgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFwcFVuaXQm
IGEsIGNvbnN0IEFwcFVuaXQmIGIpCit7CisgICAgcmV0dXJuIGEucmF3VmFsdWUoKSAhPSBiLnJh
d1ZhbHVlKCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQXBwVW5pdCYgYSwg
ZmxvYXQgYikKK3sKKyAgICByZXR1cm4gYSAhPSBBcHBVbml0KGIpOworfQorCitpbmxpbmUgYm9v
bCBvcGVyYXRvciE9KGNvbnN0IGludCBhLCBjb25zdCBBcHBVbml0JiBiKQoreworICAgIHJldHVy
biBBcHBVbml0KGEpICE9IGI7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQXBw
VW5pdCYgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgIT0gQXBwVW5pdChiKTsKK30KKworaW5s
aW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBcHBVbml0JiBhLCBjb25zdCBBcHBVbml0JiBiKQor
eworICAgIHJldHVybiBhLnJhd1ZhbHVlKCkgPT0gYi5yYXdWYWx1ZSgpOworfQorCitpbmxpbmUg
Ym9vbCBvcGVyYXRvcj09KGNvbnN0IEFwcFVuaXQmIGEsIGludCBiKQoreworICAgIHJldHVybiBh
LnRvSW50KCkgPT0gYjsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpbnQgYSwg
Y29uc3QgQXBwVW5pdCYgYikKK3sKKyAgICByZXR1cm4gYSA9PSBiLnRvSW50KCk7Cit9CisKK2lu
bGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQXBwVW5pdCYgYSwgZmxvYXQgYikKK3sKKyAgICBy
ZXR1cm4gYSA9PSBBcHBVbml0KGIpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0
IGZsb2F0IGEsIGNvbnN0IEFwcFVuaXQmIGIpCit7CisgICAgcmV0dXJuIGEgPT0gYi50b0Zsb2F0
KCk7Cit9CisKKy8vIEZvciBtdWx0aXBsaWNhdGlvbiB0aGF0J3MgcHJvbmUgdG8gb3ZlcmZsb3cs
IHRoaXMgYm91bmRzIGl0IHRvIEFwcFVuaXQ6Om1heCgpIGFuZCA6Om1pbigpCitpbmxpbmUgQXBw
VW5pdCBib3VuZGVkTXVsdGlwbHkoY29uc3QgQXBwVW5pdCYgYSwgY29uc3QgQXBwVW5pdCYgYikK
K3sKKyAgICBBcHBVbml0IHJldHVyblZhbDsKKyAgICByZXR1cm5WYWwuc2V0UmF3VmFsdWUoKGEu
cmF3VmFsdWUoKSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3IpICogYi5yYXdWYWx1ZSgpKTsKKyAg
ICBpZiAoKGEucmF3VmFsdWUoKSA+PSAwICYmIGIucmF3VmFsdWUoKSA+PSAwKSB8fCAoYS5yYXdW
YWx1ZSgpIDwgMCAmJiBiLnJhd1ZhbHVlKCkgPCAwKSkgeworICAgICAgICBpZiAocmV0dXJuVmFs
LnJhd1ZhbHVlKCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFwcFVuaXQ6Om1heCgpOworICAg
ICAgICByZXR1cm4gcmV0dXJuVmFsOworICAgIH0KKyAgICBpZiAocmV0dXJuVmFsLnJhd1ZhbHVl
KCkgPiAwKQorICAgICAgICByZXR1cm4gQXBwVW5pdDo6bWluKCk7CisgICAgcmV0dXJuIHJldHVy
blZhbDsKK30KKworaW5saW5lIEFwcFVuaXQgb3BlcmF0b3IqKGNvbnN0IEFwcFVuaXQmIGEsIGNv
bnN0IEFwcFVuaXQmIGIpCit7CisgICAgQXBwVW5pdCByZXR1cm5WYWw7CisgICAgcmV0dXJuVmFs
LnNldFJhd1ZhbHVlKChhLnJhd1ZhbHVlKCkgLyBrRml4ZWRQb2ludERlbm9taW5hdG9yKSAqIGIu
cmF3VmFsdWUoKSk7CisgICAgQVNTRVJUKChhLnJhd1ZhbHVlKCkgPj0gMCAmJiBiLnJhd1ZhbHVl
KCkgPj0gMCAmJiByZXR1cm5WYWwucmF3VmFsdWUoKSA+PSAwKQorICAgICAgICAgICB8fCAoYS5y
YXdWYWx1ZSgpIDwgMCAmJiBiLnJhd1ZhbHVlKCkgPCAwICYmIHJldHVyblZhbC5yYXdWYWx1ZSgp
ID49IDApCisgICAgICAgICAgIHx8ICgoYS5yYXdWYWx1ZSgpIDwgMCB8fCBiLnJhd1ZhbHVlKCkg
PCAwKSAmJiByZXR1cm5WYWwucmF3VmFsdWUoKSA8PSAwKSk7CisgICAgcmV0dXJuIHJldHVyblZh
bDsKK30gICAgCisKK2lubGluZSBkb3VibGUgb3BlcmF0b3IqKGNvbnN0IEFwcFVuaXQmIGEsIGRv
dWJsZSBiKQoreworICAgIHJldHVybiBhLnRvRG91YmxlKCkgKiBiOworfQorCitpbmxpbmUgZmxv
YXQgb3BlcmF0b3IqKGNvbnN0IEFwcFVuaXQmIGEsIGZsb2F0IGIpCit7CisgICAgcmV0dXJuIGEu
dG9GbG9hdCgpICogYjsKK30KKworaW5saW5lIEFwcFVuaXQgb3BlcmF0b3IqKGNvbnN0IEFwcFVu
aXQmIGEsIGludCBiKQoreworICAgIHJldHVybiBhICogQXBwVW5pdChiKTsKK30KKworaW5saW5l
IEFwcFVuaXQgb3BlcmF0b3IqKGNvbnN0IEFwcFVuaXQmIGEsIHVuc2lnbmVkIGIpCit7CisgICAg
cmV0dXJuIGEgKiBBcHBVbml0KGIpOworfQorCitpbmxpbmUgQXBwVW5pdCBvcGVyYXRvciooY29u
c3QgQXBwVW5pdCYgYSwgbG9uZyB1bnNpZ25lZCBpbnQgYikKK3sKKyAgICByZXR1cm4gYSAqIEFw
cFVuaXQoYik7Cit9CisKK2lubGluZSBBcHBVbml0IG9wZXJhdG9yKihsb25nIHVuc2lnbmVkIGlu
dCBhLCBjb25zdCBBcHBVbml0JiBiKQoreworICAgIHJldHVybiBBcHBVbml0KGEpICogYjsKK30K
KworaW5saW5lIEFwcFVuaXQgb3BlcmF0b3IqKHVuc2lnbmVkIGEsIGNvbnN0IEFwcFVuaXQmIGIp
Cit7CisgICAgcmV0dXJuIEFwcFVuaXQoYSkgKiBiOworfQorCitpbmxpbmUgQXBwVW5pdCBvcGVy
YXRvciooY29uc3QgaW50IGEsIGNvbnN0IEFwcFVuaXQmIGIpCit7CisgICAgcmV0dXJuIEFwcFVu
aXQoYSkgKiBiOworfQorCitpbmxpbmUgZmxvYXQgb3BlcmF0b3IqKGNvbnN0IGZsb2F0IGEsIGNv
bnN0IEFwcFVuaXQmIGIpCit7CisgICAgcmV0dXJuIGEgKiBiLnRvRmxvYXQoKTsKK30KKworaW5s
aW5lIGRvdWJsZSBvcGVyYXRvciooY29uc3QgZG91YmxlIGEsIGNvbnN0IEFwcFVuaXQmIGIpCit7
CisgICAgcmV0dXJuIGEgKiBiLnRvRG91YmxlKCk7Cit9CisKK2lubGluZSBBcHBVbml0IG9wZXJh
dG9yLyhjb25zdCBBcHBVbml0JiBhLCBjb25zdCBBcHBVbml0JiBiKQoreworICAgIEFwcFVuaXQg
cmV0dXJuVmFsOworICAgIHJldHVyblZhbC5zZXRSYXdWYWx1ZShrRml4ZWRQb2ludERlbm9taW5h
dG9yICogKGEucmF3VmFsdWUoKSAvIGIucmF3VmFsdWUoKSkpOworICAgIEFTU0VSVCgoKGEucmF3
VmFsdWUoKSA+PSAwKSAmJiAoYi5yYXdWYWx1ZSgpID49IDApICYmIChyZXR1cm5WYWwucmF3VmFs
dWUoKSA+PSAwKSkKKyAgICAgICAgICAgfHwgKChhLnJhd1ZhbHVlKCkgPCAwKSAmJiAoYi5yYXdW
YWx1ZSgpIDwgMCkgJiYgKHJldHVyblZhbC5yYXdWYWx1ZSgpID49IDApKQorICAgICAgICAgICB8
fCAoKChhLnJhd1ZhbHVlKCkgPCAwKSB8fCAoYi5yYXdWYWx1ZSgpIDwgMCkpICYmIChyZXR1cm5W
YWwucmF3VmFsdWUoKSA8PSAwKSkpOworICAgIHJldHVybiByZXR1cm5WYWw7Cit9ICAgIAorCitp
bmxpbmUgZmxvYXQgb3BlcmF0b3IvKGNvbnN0IEFwcFVuaXQmIGEsIGZsb2F0IGIpCit7CisgICAg
cmV0dXJuIGEudG9GbG9hdCgpIC8gYjsKK30KKworaW5saW5lIGRvdWJsZSBvcGVyYXRvci8oY29u
c3QgQXBwVW5pdCYgYSwgZG91YmxlIGIpCit7CisgICAgcmV0dXJuIGEudG9Eb3VibGUoKSAvIGI7
Cit9CisKK2lubGluZSBBcHBVbml0IG9wZXJhdG9yLyhjb25zdCBBcHBVbml0JiBhLCBpbnQgYikK
K3sKKyAgICByZXR1cm4gYSAvIEFwcFVuaXQoYik7Cit9CisKK2lubGluZSBBcHBVbml0IG9wZXJh
dG9yLyhjb25zdCBBcHBVbml0JiBhLCB1bnNpZ25lZCBpbnQgYikKK3sKKyAgICByZXR1cm4gYSAv
IEFwcFVuaXQoYik7Cit9CisKK2lubGluZSBmbG9hdCBvcGVyYXRvci8oY29uc3QgZmxvYXQgYSwg
Y29uc3QgQXBwVW5pdCYgYikKK3sKKyAgICByZXR1cm4gYSAvIGIudG9GbG9hdCgpOworfQorCitp
bmxpbmUgQXBwVW5pdCBvcGVyYXRvci8oY29uc3QgaW50IGEsIGNvbnN0IEFwcFVuaXQmIGIpCit7
CisgICAgcmV0dXJuIEFwcFVuaXQoYSkgLyBiOworfQorCitpbmxpbmUgQXBwVW5pdCBvcGVyYXRv
ci8odW5zaWduZWQgaW50IGEsIGNvbnN0IEFwcFVuaXQmIGIpCit7CisgICAgcmV0dXJuIEFwcFVu
aXQoYSkgLyBiOworfQorCitpbmxpbmUgQXBwVW5pdCBvcGVyYXRvcisoY29uc3QgQXBwVW5pdCYg
YSwgY29uc3QgQXBwVW5pdCYgYikKK3sKKyAgICBBcHBVbml0IHJldHVyblZhbDsKKyAgICByZXR1
cm5WYWwuc2V0UmF3VmFsdWUoYS5yYXdWYWx1ZSgpICsgYi5yYXdWYWx1ZSgpKTsKKyAgICByZXR1
cm4gcmV0dXJuVmFsOworfQorCitpbmxpbmUgQXBwVW5pdCBvcGVyYXRvcisoY29uc3QgQXBwVW5p
dCYgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgKyBBcHBVbml0KGIpOworfQorCitpbmxpbmUg
ZmxvYXQgb3BlcmF0b3IrKGNvbnN0IEFwcFVuaXQmIGEsIGZsb2F0IGIpCit7CisgICAgcmV0dXJu
IGEudG9GbG9hdCgpICsgYjsKK30KKworaW5saW5lIGRvdWJsZSBvcGVyYXRvcisoY29uc3QgQXBw
VW5pdCYgYSwgZG91YmxlIGIpCit7CisgICAgcmV0dXJuIGEudG9Eb3VibGUoKSArIGI7Cit9CisK
K2lubGluZSBBcHBVbml0IG9wZXJhdG9yKyhjb25zdCBpbnQgYSwgY29uc3QgQXBwVW5pdCYgYikK
K3sKKyAgICByZXR1cm4gQXBwVW5pdChhKSArIGI7Cit9CisKK2lubGluZSBmbG9hdCBvcGVyYXRv
cisoY29uc3QgZmxvYXQgYSwgY29uc3QgQXBwVW5pdCYgYikKK3sKKyAgICByZXR1cm4gYSArIGIu
dG9GbG9hdCgpOworfQorCitpbmxpbmUgQXBwVW5pdCBvcGVyYXRvci0oY29uc3QgQXBwVW5pdCYg
YSwgY29uc3QgQXBwVW5pdCYgYikKK3sKKyAgICBBcHBVbml0IHJldHVyblZhbDsKKyAgICByZXR1
cm5WYWwuc2V0UmF3VmFsdWUoYS5yYXdWYWx1ZSgpIC0gYi5yYXdWYWx1ZSgpKTsKKyAgICByZXR1
cm4gcmV0dXJuVmFsOworfQorCitpbmxpbmUgQXBwVW5pdCBvcGVyYXRvci0oY29uc3QgQXBwVW5p
dCYgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgLSBBcHBVbml0KGIpOworfQorCitpbmxpbmUg
ZmxvYXQgb3BlcmF0b3ItKGNvbnN0IEFwcFVuaXQmIGEsIGZsb2F0IGIpCit7CisgICAgcmV0dXJu
IGEudG9GbG9hdCgpIC0gYjsKK30KKworaW5saW5lIEFwcFVuaXQgb3BlcmF0b3ItKGNvbnN0IGlu
dCBhLCBjb25zdCBBcHBVbml0JiBiKQoreworICAgIHJldHVybiBBcHBVbml0KGEpIC0gYjsKK30K
KworaW5saW5lIGZsb2F0IG9wZXJhdG9yLShjb25zdCBmbG9hdCBhLCBjb25zdCBBcHBVbml0JiBi
KQoreworICAgIHJldHVybiBhIC0gYi50b0Zsb2F0KCk7Cit9CisKK2lubGluZSBBcHBVbml0IG9w
ZXJhdG9yLShjb25zdCBBcHBVbml0JiBhKQoreworICAgIEFwcFVuaXQgcmV0dXJuVmFsOworICAg
IHJldHVyblZhbC5zZXRSYXdWYWx1ZSgtYS5yYXdWYWx1ZSgpKTsKKyAgICByZXR1cm4gcmV0dXJu
VmFsOworfQorCitpbmxpbmUgQXBwVW5pdCYgb3BlcmF0b3IrPShBcHBVbml0JiBhLCBjb25zdCBB
cHBVbml0JiBiKQoreworICAgIGEgPSBhICsgYjsKKyAgICByZXR1cm4gYTsKK30KKworaW5saW5l
IEFwcFVuaXQmIG9wZXJhdG9yKz0oQXBwVW5pdCYgYSwgaW50IGIpCit7CisgICAgYSA9IGEgKyBi
OworICAgIHJldHVybiBhOworfQorCitpbmxpbmUgZmxvYXQmIG9wZXJhdG9yKz0oZmxvYXQmIGEs
IGNvbnN0IEFwcFVuaXQmIGIpCit7CisgICAgYSA9IGEgKyBiLnRvRmxvYXQoKTsKKyAgICByZXR1
cm4gYTsKK30KKworaW5saW5lIEFwcFVuaXQmIG9wZXJhdG9yLT0oQXBwVW5pdCYgYSwgaW50IGIp
Cit7CisgICAgYSA9IGEgLSBiOworICAgIHJldHVybiBhOworfQorCitpbmxpbmUgQXBwVW5pdCYg
b3BlcmF0b3ItPShBcHBVbml0JiBhLCBjb25zdCBBcHBVbml0JiBiKQoreworICAgIGEgPSBhIC0g
YjsKKyAgICByZXR1cm4gYTsKK30KKworaW5saW5lIGZsb2F0JiBvcGVyYXRvci09KGZsb2F0JiBh
LCBjb25zdCBBcHBVbml0JiBiKQoreworICAgIGEgPSBhIC0gYi50b0Zsb2F0KCk7CisgICAgcmV0
dXJuIGE7Cit9CisKK2lubGluZSBBcHBVbml0JiBvcGVyYXRvcio9KEFwcFVuaXQmIGEsIGludCBi
KQoreworICAgIGEgPSBhICogYjsKKyAgICByZXR1cm4gYTsKK30KKworaW5saW5lIEFwcFVuaXQm
IG9wZXJhdG9yKj0oQXBwVW5pdCYgYSwgZmxvYXQgYikKK3sKKyAgICBhID0gYSAqIGI7CisgICAg
cmV0dXJuIGE7Cit9CisKK2lubGluZSBpbnQgc25hcFNpemVUb1BpeGVsKEFwcFVuaXQgc2l6ZSwg
QXBwVW5pdCBsb2NhdGlvbikgCit7CisgICAgcmV0dXJuIChsb2NhdGlvbiArIHNpemUpLnJvdW5k
KCkgLSBsb2NhdGlvbi5yb3VuZCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAvLyBBcHBVbml0X2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>125898</attachid>
            <date>2012-02-07 12:21:47 -0800</date>
            <delta_ts>2012-02-08 14:31:20 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77485-20120207122146.patch</filename>
            <type>text/plain</type>
            <size>20592</size>
            <attacher name="Levi Weintraub">leviw</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwNjk3MCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBACisyMDEyLTAyLTA3ICBFbWlsIEEg
RWtsdW5kICA8ZWFlQGNocm9taXVtLm9yZz4gYW5kIExldmkgV2VpbnRyYXViICA8bGV2aXdAY2hy
b21pdW0ub3JnPgorCisgICAgICAgIEFkZCBGcmFjdGlvbmFsTGF5b3V0VW5pdCB0eXBlIGZvciBz
dWItcGl4ZWwgbGF5b3V0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD03NzQ4NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEFkZCBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiAoRnJhY3Rpb25hbExheW91dFVu
aXQpLgorCisgICAgICAgIEZyYWN0aW9uYWxMYXlvdXRVbml0IHJlcHJlc2VudHMgdmFsdWVzIGFz
IG11bHRpcGxlcyBvZiAxLzYwdGggcGl4ZWwuIFRoaXMgYWxsb3dzIHVzCisgICAgICAgIHRvIHJl
cHJlc2VudCBzdWItcGl4ZWwgdmFsdWVzIHVzaW5nIGludGVnZXIgbWF0aCBhbmQgYXZvaWRzIGZs
b2F0aW5nIHBvaW50IHByZWNpc2lvbgorICAgICAgICBwcm9ibGVtcy4KKworICAgICAgICBObyBu
ZXcgdGVzdHMuCisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAg
ICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogcGxh
dGZvcm0vRnJhY3Rpb25hbExheW91dFVuaXQuaDogQWRkZWQuCisKIDIwMTItMDItMDcgIERhbmEg
SmFuc2VucyAgPGRhbmFrakBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgW0Nocm9taXVtXSBNZW1v
cnkgYnVnIGR1cmluZyBvY2NsdXNpb24gdHJhY2tpbmcgaWYgVmVjdG9yOjphcHBlbmQoKSBuZWVk
cyB0byByZWFsbG9jYXRlIHRoZSBidWZmZXIKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
dmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dlYkNv
cmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCShyZXZpc2lvbiAxMDY5NzApCisrKyBTb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAtMjY2
MTQsNiArMjY2MTQsMTAgQEAKIAkJCQk+CiAJCQk8L0ZpbGU+CiAJCQk8RmlsZQorCQkJCVJlbGF0
aXZlUGF0aD0iLi5ccGxhdGZvcm1cRnJhY3Rpb25hbExheW91dFVuaXQuaCIKKwkJCQk+CisJCQk8
L0ZpbGU+CisJCQk8RmlsZQogCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cR2VvbG9jYXRp
b25TZXJ2aWNlLmNwcCIKIAkJCQk+CiAJCQk8L0ZpbGU+CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9X
ZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxMDY5NzAp
CisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdv
cmtpbmcgY29weSkKQEAgLTQ5NzksNiArNDk3OSw3IEBACiAJCUI4REJEQjRDMTMwQjBGOEEwMEY1
Q0RCMSAvKiBTZXRTZWxlY3Rpb25Db21tYW5kLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBCOERCREI0ODEzMEIwRjhBMDBGNUNEQjEgLyogU2V0U2VsZWN0
aW9uQ29tbWFuZC5oICovOyB9OwogCQlCOERCREI0RDEzMEIwRjhBMDBGNUNEQjEgLyogU3BlbGxp
bmdDb3JyZWN0aW9uQ29tbWFuZC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBCOERCREI0OTEzMEIwRjhBMDBGNUNEQjEgLyogU3BlbGxpbmdDb3JyZWN0
aW9uQ29tbWFuZC5jcHAgKi87IH07CiAJCUI4REJEQjRFMTMwQjBGOEEwMEY1Q0RCMSAvKiBTcGVs
bGluZ0NvcnJlY3Rpb25Db21tYW5kLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBCOERCREI0QTEzMEIwRjhBMDBGNUNEQjEgLyogU3BlbGxpbmdDb3JyZWN0
aW9uQ29tbWFuZC5oICovOyB9OworCQlCQUIyMkFENDE0QjdBMDJEMDBEOEFCQTYgLyogRnJhY3Rp
b25hbExheW91dFVuaXQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEJBQjc3MTUwMTQ0NENCQjQwMEVDNEM0QyAvKiBGcmFjdGlvbmFsTGF5b3V0VW5pdC5o
ICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUJBQ0Yy
OTAxMTNCMkEwRDUwMDc4MUY5MCAvKiBMYXlvdXRUeXBlcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkFDRjI5MDAxM0IyQTBENTAwNzgxRjkwIC8qIExh
eW91dFR5cGVzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsg
fTsKIAkJQkMwMEYwMDQwRTBBMTg1NTAwRkQwNEUzIC8qIERPTUZpbGUuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDMDBFRkZFMEUwQTE4NTUwMEZEMDRF
MyAvKiBET01GaWxlLmggKi87IH07CiAJCUJDMDBGMDA1MEUwQTE4NTUwMEZEMDRFMyAvKiBET01G
aWxlLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkMw
MEVGRkYwRTBBMTg1NTAwRkQwNEUzIC8qIERPTUZpbGUubW0gKi87IH07CkBAIC0xMTg3Niw2ICsx
MTg3Nyw3IEBACiAJCUI4REJEQjQ4MTMwQjBGOEEwMEY1Q0RCMSAvKiBTZXRTZWxlY3Rpb25Db21t
YW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNldFNlbGVjdGlvbkNvbW1h
bmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQjhEQkRCNDkxMzBCMEY4QTAwRjVD
REIxIC8qIFNwZWxsaW5nQ29ycmVjdGlvbkNvbW1hbmQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gU3BlbGxpbmdDb3JyZWN0aW9uQ29tbWFuZC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCUI4REJEQjRBMTMwQjBGOEEwMEY1Q0RCMSAvKiBTcGVsbGlu
Z0NvcnJlY3Rpb25Db21tYW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNw
ZWxsaW5nQ29ycmVjdGlvbkNvbW1hbmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJ
QkFCNzcxNTAxNDQ0Q0JCNDAwRUM0QzRDIC8qIEZyYWN0aW9uYWxMYXlvdXRVbml0LmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEZyYWN0aW9uYWxMYXlvdXRVbml0Lmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJBQ0YyOTAwMTNCMkEwRDUwMDc4MUY5MCAvKiBMYXlv
dXRUeXBlcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBMYXlvdXRUeXBlcy5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQzAwRUZGRTBFMEExODU1MDBGRDA0RTMg
LyogRE9NRmlsZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBET01GaWxlLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDMDBFRkZGMEUwQTE4NTUwMEZEMDRFMyAv
KiBET01GaWxlLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gRE9N
RmlsZS5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE5Njg5LDYgKzE5NjkxLDcg
QEAKIAkJCQlDNTdGRURFMDEyMTJFRTlDMDA5N0JFNjUgLyogRmlsZVN5c3RlbS5jcHAgKi8sCiAJ
CQkJNTE0QjNGNzIwQzcyMjA0NzAwMDUzMERGIC8qIEZpbGVTeXN0ZW0uaCAqLywKIAkJCQlCQzA3
M0JBOTBDMzk5QjFGMDAwRjU5NzkgLyogRmxvYXRDb252ZXJzaW9uLmggKi8sCisJCQkJQkFCNzcx
NTAxNDQ0Q0JCNDAwRUM0QzRDIC8qIEZyYWN0aW9uYWxMYXlvdXRVbml0LmggKi8sCiAJCQkJQTg3
NDhCREYxMkNCRjJEQzAwMUZCQTQxIC8qIEhhc2hUb29scy5oICovLAogCQkJCUQ2RkRBRUYyMTQ5
QzA2MTkwMDM3QjFFMSAvKiBIaXN0b2dyYW1TdXBwb3J0LmNwcCAqLywKIAkJCQlENjMwRTJBQjE0
OUJGMzQ0MDA1QjJGOTMgLyogSGlzdG9ncmFtU3VwcG9ydC5oICovLApAQCAtMjEwODQsNiArMjEw
ODcsNyBAQAogCQkJCTFBMkFBQzU5MERDMkEzQjEwMEEyMEQ5QSAvKiBBcHBsaWNhdGlvbkNhY2hl
U3RvcmFnZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOUI0MTcwNjQxMjU2NjJCMzAwNkIyOEZDIC8q
IEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTMzMDlERDkw
OTlFNjQ5MjAwNTZFNTgxIC8qIEFwcGx5U3R5bGVDb21tYW5kLmggaW4gSGVhZGVycyAqLywKKwkJ
CQlCQUIyMkFENDE0QjdBMDJEMDBEOEFCQTYgLyogRnJhY3Rpb25hbExheW91dFVuaXQuaCBpbiBI
ZWFkZXJzICovLAogCQkJCTUxMkREOEY2MEQ5MUU2QUYwMDBGODlFRSAvKiBBcmNoaXZlLmggaW4g
SGVhZGVycyAqLywKIAkJCQk1MTJERDhGRDBEOTFFNkFGMDAwRjg5RUUgLyogQXJjaGl2ZUZhY3Rv
cnkuaCBpbiBIZWFkZXJzICovLAogCQkJCTUxMkREOEZDMEQ5MUU2QUYwMDBGODlFRSAvKiBBcmNo
aXZlUmVzb3VyY2UuaCBpbiBIZWFkZXJzICovLApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vRnJhY3Rpb25hbExheW91dFVuaXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9GcmFjdGlvbmFsTGF5b3V0VW5pdC5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vRnJhY3Rpb25hbExheW91dFVuaXQuaAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSw1MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBt
ZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJT
IEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q
WVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICog
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2lmbmRlZiBGcmFjdGlvbmFsTGF5b3V0VW5pdF9oCisjZGVmaW5lIEZyYWN0
aW9uYWxMYXlvdXRVbml0X2gKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGxpbWl0
cz4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMg
Y29uc3QgaW50IGtGaXhlZFBvaW50RGVub21pbmF0b3IgPSA2MDsKK2NvbnN0IGludCBpbnRNYXhG
b3JMYXlvdXRVbml0ID0gSU5UX01BWCAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7Citjb25zdCBp
bnQgaW50TWluRm9yTGF5b3V0VW5pdCA9IC1pbnRNYXhGb3JMYXlvdXRVbml0OworCitjbGFzcyBG
cmFjdGlvbmFsTGF5b3V0VW5pdCB7CitwdWJsaWM6CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQo
KSA6IG1fdmFsdWUoMCkgeyB9CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQoaW50IHZhbHVlKSB7
IEFTU0VSVChpc0luQm91bmRzKHZhbHVlKSk7IG1fdmFsdWUgPSB2YWx1ZSAqIGtGaXhlZFBvaW50
RGVub21pbmF0b3I7IH0KKyAgICBGcmFjdGlvbmFsTGF5b3V0VW5pdCh1bnNpZ25lZCBzaG9ydCB2
YWx1ZSkgeyBBU1NFUlQoaXNJbkJvdW5kcyh2YWx1ZSkpOyBtX3ZhbHVlID0gdmFsdWUgKiBrRml4
ZWRQb2ludERlbm9taW5hdG9yOyB9CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQodW5zaWduZWQg
aW50IHZhbHVlKSB7IEFTU0VSVChpc0luQm91bmRzKHZhbHVlKSk7IG1fdmFsdWUgPSB2YWx1ZSAq
IGtGaXhlZFBvaW50RGVub21pbmF0b3I7IH0KKyAgICBGcmFjdGlvbmFsTGF5b3V0VW5pdChmbG9h
dCB2YWx1ZSkgeyBBU1NFUlQoaXNJbkJvdW5kcyh2YWx1ZSkpOyBtX3ZhbHVlID0gdmFsdWUgKiBr
Rml4ZWRQb2ludERlbm9taW5hdG9yOyB9CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQoZG91Ymxl
IHZhbHVlKSB7IEFTU0VSVChpc0luQm91bmRzKHZhbHVlKSk7IG1fdmFsdWUgPSB2YWx1ZSAqIGtG
aXhlZFBvaW50RGVub21pbmF0b3I7IH0KKyAgICBGcmFjdGlvbmFsTGF5b3V0VW5pdChjb25zdCBG
cmFjdGlvbmFsTGF5b3V0VW5pdCYgdmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVlLnJhd1ZhbHVlKCk7
IH0KKworICAgIGlubGluZSBpbnQgdG9JbnQoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlIC8ga0Zp
eGVkUG9pbnREZW5vbWluYXRvcjsgfQorICAgIGlubGluZSB1bnNpZ25lZCB0b1Vuc2lnbmVkKCkg
Y29uc3QgeyBBU1NFUlQobV92YWx1ZSA+PSAwKTsgcmV0dXJuIHRvSW50KCk7IH0KKyAgICBpbmxp
bmUgZmxvYXQgdG9GbG9hdCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihtX3Zh
bHVlKSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7IH0KKyAgICBpbmxpbmUgZG91YmxlIHRvRG91
YmxlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX3ZhbHVlKSAvIGtGaXhl
ZFBvaW50RGVub21pbmF0b3I7IH0KKworICAgIG9wZXJhdG9yIGludCgpIGNvbnN0IHsgcmV0dXJu
IHRvSW50KCk7IH0KKyAgICBvcGVyYXRvciB1bnNpZ25lZCgpIGNvbnN0IHsgcmV0dXJuIHRvVW5z
aWduZWQoKTsgfQorICAgIG9wZXJhdG9yIGxvbmcgdW5zaWduZWQgaW50KCkgY29uc3QgeyByZXR1
cm4gdG9VbnNpZ25lZCgpOyB9CisgICAgb3BlcmF0b3IgZmxvYXQoKSBjb25zdCB7IHJldHVybiB0
b0Zsb2F0KCk7IH0KKyAgICBvcGVyYXRvciBkb3VibGUoKSBjb25zdCB7IHJldHVybiB0b0RvdWJs
ZSgpOyB9CisgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKwor
ICAgIGlubGluZSBpbnQgcmF3VmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisgICAg
aW5saW5lIHZvaWQgc2V0UmF3VmFsdWUoaW50IHZhbHVlKSB7IG1fdmFsdWUgPSB2YWx1ZTsgfQor
CisgICAgaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0IGFicygpCisgICAgeworICAgICAgICBG
cmFjdGlvbmFsTGF5b3V0VW5pdCByZXR1cm5WYWx1ZTsKKyAgICAgICAgcmV0dXJuVmFsdWUuc2V0
UmF3VmFsdWUoOjphYnMobV92YWx1ZSkpOworICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Cisg
ICAgfQorI2lmIE9TKERBUldJTikKKyAgICBpbmxpbmUgaW50IHd0Zl9jZWlsKCkKKyNlbHNlCisg
ICAgaW5saW5lIGludCBjZWlsKCkKKyNlbmRpZgorICAgIHsKKyAgICAgICAgcmV0dXJuIChtX3Zh
bHVlID4gMCA/IG1fdmFsdWUgKyBrRml4ZWRQb2ludERlbm9taW5hdG9yIC0gMSA6IG1fdmFsdWUg
LSBrRml4ZWRQb2ludERlbm9taW5hdG9yICsgMSkgLyBrRml4ZWRQb2ludERlbm9taW5hdG9yOwor
ICAgIH0KKyAgICBpbmxpbmUgaW50IHJvdW5kKCkKKyAgICB7CisgICAgICAgIGlmIChtX3ZhbHVl
ID4gMCkKKyAgICAgICAgICAgIHJldHVybiAobV92YWx1ZSArIChrRml4ZWRQb2ludERlbm9taW5h
dG9yIC8gMikpIC8ga0ZpeGVkUG9pbnREZW5vbWluYXRvcjsKKyAgICAgICAgcmV0dXJuIChtX3Zh
bHVlIC0gKGtGaXhlZFBvaW50RGVub21pbmF0b3IgLyAyKSkgLyBrRml4ZWRQb2ludERlbm9taW5h
dG9yOworICAgIH0KKworICAgIGlubGluZSBpbnQgZmxvb3IoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRvSW50KCk7CisgICAgfQorCisgICAgc3RhdGljIGZsb2F0IGVwc2lsb24oKSB7IHJldHVy
biAxIC8ga0ZpeGVkUG9pbnREZW5vbWluYXRvcjsgfQorICAgIHN0YXRpYyBjb25zdCBGcmFjdGlv
bmFsTGF5b3V0VW5pdCBtYXgoKQorICAgIHsKKyAgICAgICAgRnJhY3Rpb25hbExheW91dFVuaXQg
bTsKKyAgICAgICAgbS5tX3ZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsK
KyAgICAgICAgcmV0dXJuIG07CisgICAgfQorICAgIHN0YXRpYyBjb25zdCBGcmFjdGlvbmFsTGF5
b3V0VW5pdCBtaW4oKQorICAgIHsKKyAgICAgICAgRnJhY3Rpb25hbExheW91dFVuaXQgbTsKKyAg
ICAgICAgbS5tX3ZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKTsKKyAgICAg
ICAgcmV0dXJuIG07CisgICAgfQorICAgIAorcHJpdmF0ZToKKyAgICBpbmxpbmUgYm9vbCBpc0lu
Qm91bmRzKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiA6OmFicyh2YWx1ZSkgPCBz
dGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpIC8gNjA7CisgICAgfQorICAgIGlubGluZSBi
b29sIGlzSW5Cb3VuZHModW5zaWduZWQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gdmFs
dWUgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpIC8gNjA7CisgICAgfQorICAgIGlu
bGluZSBib29sIGlzSW5Cb3VuZHMoZG91YmxlIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IDo6YWJzKHZhbHVlKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLyA2MDsKKyAg
ICB9CisKKyAgICBpbnQgbV92YWx1ZTsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29u
c3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBi
KQoreworICAgIHJldHVybiBhLnJhd1ZhbHVlKCkgPD0gYi5yYXdWYWx1ZSgpOworfQorCitpbmxp
bmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBmbG9hdCBi
KQoreworICAgIHJldHVybiBhLnRvRmxvYXQoKSA8PSBiOworfQorCitpbmxpbmUgYm9vbCBvcGVy
YXRvcjw9KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBpbnQgYikKK3sKKyAgICByZXR1
cm4gYSA8PSBGcmFjdGlvbmFsTGF5b3V0VW5pdChiKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0
b3I8PShjb25zdCBmbG9hdCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAg
ICByZXR1cm4gYSA8PSBiLnRvRmxvYXQoKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8PShj
b25zdCBpbnQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgcmV0dXJu
IEZyYWN0aW9uYWxMYXlvdXRVbml0KGEpIDw9IGI7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9y
Pj0oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRV
bml0JiBiKQoreworICAgIHJldHVybiBhLnJhd1ZhbHVlKCkgPj0gYi5yYXdWYWx1ZSgpOworfQor
CitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBp
bnQgYikKK3sKKyAgICByZXR1cm4gYSA+PSBGcmFjdGlvbmFsTGF5b3V0VW5pdChiKTsKK30KKwor
aW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBmbG9hdCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5
b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4gYSA+PSBiLnRvRmxvYXQoKTsKK30KKworaW5saW5l
IGJvb2wgb3BlcmF0b3I+PShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgZmxvYXQgYikK
K3sKKyAgICByZXR1cm4gYS50b0Zsb2F0KCkgPj0gYjsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0
b3I+PShjb25zdCBpbnQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAg
cmV0dXJuIEZyYWN0aW9uYWxMYXlvdXRVbml0KGEpID49IGI7Cit9CisKK2lubGluZSBib29sIG9w
ZXJhdG9yPChjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgY29uc3QgRnJhY3Rpb25hbExh
eW91dFVuaXQmIGIpCit7CisgICAgcmV0dXJuIGEucmF3VmFsdWUoKSA8IGIucmF3VmFsdWUoKTsK
K30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBh
LCBpbnQgYikKK3sKKyAgICByZXR1cm4gYSA8IEZyYWN0aW9uYWxMYXlvdXRVbml0KGIpOworfQor
CitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGZs
b2F0IGIpCit7CisgICAgcmV0dXJuIGEudG9GbG9hdCgpIDwgYjsKK30KKworaW5saW5lIGJvb2wg
b3BlcmF0b3I8KGNvbnN0IGludCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sK
KyAgICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQoYSkgPCBiOworfQorCitpbmxpbmUgYm9v
bCBvcGVyYXRvcjwoY29uc3QgZmxvYXQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIp
Cit7CisgICAgcmV0dXJuIGEgPCBiLnRvRmxvYXQoKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0
b3I+KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0
VW5pdCYgYikKK3sKKyAgICByZXR1cm4gYS5yYXdWYWx1ZSgpID4gYi5yYXdWYWx1ZSgpOworfQor
CitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGRv
dWJsZSBiKQoreworICAgIHJldHVybiBhLnRvRG91YmxlKCkgPiBiOworfQorCitpbmxpbmUgYm9v
bCBvcGVyYXRvcj4oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGZsb2F0IGIpCit7Cisg
ICAgcmV0dXJuIGEudG9GbG9hdCgpID4gYjsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNv
bnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBpbnQgYikKK3sKKyAgICByZXR1cm4gYSA+IEZy
YWN0aW9uYWxMYXlvdXRVbml0KGIpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3Qg
aW50IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBGcmFj
dGlvbmFsTGF5b3V0VW5pdChhKSA+IGI7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPihjb25z
dCBmbG9hdCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4g
YSA+IGIudG9GbG9hdCgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgZG91Ymxl
IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBhID4gYi50
b0RvdWJsZSgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZyYWN0aW9uYWxM
YXlvdXRVbml0JiBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICByZXR1
cm4gYS5yYXdWYWx1ZSgpICE9IGIucmF3VmFsdWUoKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgZmxvYXQgYikKK3sKKyAgICByZXR1
cm4gYSAhPSBGcmFjdGlvbmFsTGF5b3V0VW5pdChiKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0
b3IhPShjb25zdCBpbnQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAg
cmV0dXJuIEZyYWN0aW9uYWxMYXlvdXRVbml0KGEpICE9IGI7Cit9CisKK2lubGluZSBib29sIG9w
ZXJhdG9yIT0oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGludCBiKQoreworICAgIHJl
dHVybiBhICE9IEZyYWN0aW9uYWxMYXlvdXRVbml0KGIpOworfQorCitpbmxpbmUgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBjb25zdCBGcmFjdGlvbmFsTGF5
b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4gYS5yYXdWYWx1ZSgpID09IGIucmF3VmFsdWUoKTsK
K30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYg
YSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEudG9JbnQoKSA9PSBiOworfQorCitpbmxpbmUgYm9v
bCBvcGVyYXRvcj09KGNvbnN0IGludCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikK
K3sKKyAgICByZXR1cm4gYSA9PSBiLnRvSW50KCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9y
PT0oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGZsb2F0IGIpCit7CisgICAgcmV0dXJu
IGEgPT0gRnJhY3Rpb25hbExheW91dFVuaXQoYik7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9y
PT0oY29uc3QgZmxvYXQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAg
cmV0dXJuIGEgPT0gYi50b0Zsb2F0KCk7Cit9CisKKy8vIEZvciBtdWx0aXBsaWNhdGlvbiB0aGF0
J3MgcHJvbmUgdG8gb3ZlcmZsb3csIHRoaXMgYm91bmRzIGl0IHRvIEZyYWN0aW9uYWxMYXlvdXRV
bml0OjptYXgoKSBhbmQgOjptaW4oKQoraW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0IGJvdW5k
ZWRNdWx0aXBseShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgY29uc3QgRnJhY3Rpb25h
bExheW91dFVuaXQmIGIpCit7CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQgcmV0dXJuVmFsOwor
ICAgIHJldHVyblZhbC5zZXRSYXdWYWx1ZSgoYS5yYXdWYWx1ZSgpIC8ga0ZpeGVkUG9pbnREZW5v
bWluYXRvcikgKiBiLnJhd1ZhbHVlKCkpOworICAgIGlmICgoYS5yYXdWYWx1ZSgpID49IDAgJiYg
Yi5yYXdWYWx1ZSgpID49IDApIHx8IChhLnJhd1ZhbHVlKCkgPCAwICYmIGIucmF3VmFsdWUoKSA8
IDApKSB7CisgICAgICAgIGlmIChyZXR1cm5WYWwucmF3VmFsdWUoKSA8IDApCisgICAgICAgICAg
ICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQ6Om1heCgpOworICAgICAgICByZXR1cm4gcmV0
dXJuVmFsOworICAgIH0KKyAgICBpZiAocmV0dXJuVmFsLnJhd1ZhbHVlKCkgPiAwKQorICAgICAg
ICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQ6Om1pbigpOworICAgIHJldHVybiByZXR1cm5W
YWw7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVyYXRvciooY29uc3QgRnJh
Y3Rpb25hbExheW91dFVuaXQmIGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQorewor
ICAgIEZyYWN0aW9uYWxMYXlvdXRVbml0IHJldHVyblZhbDsKKyAgICByZXR1cm5WYWwuc2V0UmF3
VmFsdWUoKGEucmF3VmFsdWUoKSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3IpICogYi5yYXdWYWx1
ZSgpKTsKKyAgICBBU1NFUlQoKGEucmF3VmFsdWUoKSA+PSAwICYmIGIucmF3VmFsdWUoKSA+PSAw
ICYmIHJldHVyblZhbC5yYXdWYWx1ZSgpID49IDApCisgICAgICAgICAgIHx8IChhLnJhd1ZhbHVl
KCkgPCAwICYmIGIucmF3VmFsdWUoKSA8IDAgJiYgcmV0dXJuVmFsLnJhd1ZhbHVlKCkgPj0gMCkK
KyAgICAgICAgICAgfHwgKChhLnJhd1ZhbHVlKCkgPCAwIHx8IGIucmF3VmFsdWUoKSA8IDApICYm
IHJldHVyblZhbC5yYXdWYWx1ZSgpIDw9IDApKTsKKyAgICByZXR1cm4gcmV0dXJuVmFsOworfSAg
ICAKKworaW5saW5lIGRvdWJsZSBvcGVyYXRvciooY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQm
IGEsIGRvdWJsZSBiKQoreworICAgIHJldHVybiBhLnRvRG91YmxlKCkgKiBiOworfQorCitpbmxp
bmUgZmxvYXQgb3BlcmF0b3IqKGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBmbG9hdCBi
KQoreworICAgIHJldHVybiBhLnRvRmxvYXQoKSAqIGI7Cit9CisKK2lubGluZSBGcmFjdGlvbmFs
TGF5b3V0VW5pdCBvcGVyYXRvciooY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGludCBi
KQoreworICAgIHJldHVybiBhICogRnJhY3Rpb25hbExheW91dFVuaXQoYik7Cit9CisKK2lubGlu
ZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVyYXRvciooY29uc3QgRnJhY3Rpb25hbExheW91dFVu
aXQmIGEsIHVuc2lnbmVkIGIpCit7CisgICAgcmV0dXJuIGEgKiBGcmFjdGlvbmFsTGF5b3V0VW5p
dChiKTsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0IG9wZXJhdG9yKihjb25zdCBG
cmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgbG9uZyB1bnNpZ25lZCBpbnQgYikKK3sKKyAgICByZXR1
cm4gYSAqIEZyYWN0aW9uYWxMYXlvdXRVbml0KGIpOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExh
eW91dFVuaXQgb3BlcmF0b3IqKGxvbmcgdW5zaWduZWQgaW50IGEsIGNvbnN0IEZyYWN0aW9uYWxM
YXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBGcmFjdGlvbmFsTGF5b3V0VW5pdChhKSAqIGI7
Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVyYXRvcioodW5zaWduZWQgYSwg
Y29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgcmV0dXJuIEZyYWN0aW9uYWxM
YXlvdXRVbml0KGEpICogYjsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0IG9wZXJh
dG9yKihjb25zdCBpbnQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAg
cmV0dXJuIEZyYWN0aW9uYWxMYXlvdXRVbml0KGEpICogYjsKK30KKworaW5saW5lIGZsb2F0IG9w
ZXJhdG9yKihjb25zdCBmbG9hdCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sK
KyAgICByZXR1cm4gYSAqIGIudG9GbG9hdCgpOworfQorCitpbmxpbmUgZG91YmxlIG9wZXJhdG9y
Kihjb25zdCBkb3VibGUgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAg
cmV0dXJuIGEgKiBiLnRvRG91YmxlKCk7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5p
dCBvcGVyYXRvci8oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGNvbnN0IEZyYWN0aW9u
YWxMYXlvdXRVbml0JiBiKQoreworICAgIEZyYWN0aW9uYWxMYXlvdXRVbml0IHJldHVyblZhbDsK
KyAgICByZXR1cm5WYWwuc2V0UmF3VmFsdWUoa0ZpeGVkUG9pbnREZW5vbWluYXRvciAqIChhLnJh
d1ZhbHVlKCkgLyBiLnJhd1ZhbHVlKCkpKTsKKyAgICBBU1NFUlQoKChhLnJhd1ZhbHVlKCkgPj0g
MCkgJiYgKGIucmF3VmFsdWUoKSA+PSAwKSAmJiAocmV0dXJuVmFsLnJhd1ZhbHVlKCkgPj0gMCkp
CisgICAgICAgICAgIHx8ICgoYS5yYXdWYWx1ZSgpIDwgMCkgJiYgKGIucmF3VmFsdWUoKSA8IDAp
ICYmIChyZXR1cm5WYWwucmF3VmFsdWUoKSA+PSAwKSkKKyAgICAgICAgICAgfHwgKCgoYS5yYXdW
YWx1ZSgpIDwgMCkgfHwgKGIucmF3VmFsdWUoKSA8IDApKSAmJiAocmV0dXJuVmFsLnJhd1ZhbHVl
KCkgPD0gMCkpKTsKKyAgICByZXR1cm4gcmV0dXJuVmFsOworfSAgICAKKworaW5saW5lIGZsb2F0
IG9wZXJhdG9yLyhjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgZmxvYXQgYikKK3sKKyAg
ICByZXR1cm4gYS50b0Zsb2F0KCkgLyBiOworfQorCitpbmxpbmUgZG91YmxlIG9wZXJhdG9yLyhj
b25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgZG91YmxlIGIpCit7CisgICAgcmV0dXJuIGEu
dG9Eb3VibGUoKSAvIGI7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVyYXRv
ci8oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGludCBiKQoreworICAgIHJldHVybiBh
IC8gRnJhY3Rpb25hbExheW91dFVuaXQoYik7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0
VW5pdCBvcGVyYXRvci8oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIHVuc2lnbmVkIGlu
dCBiKQoreworICAgIHJldHVybiBhIC8gRnJhY3Rpb25hbExheW91dFVuaXQoYik7Cit9CisKK2lu
bGluZSBmbG9hdCBvcGVyYXRvci8oY29uc3QgZmxvYXQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91
dFVuaXQmIGIpCit7CisgICAgcmV0dXJuIGEgLyBiLnRvRmxvYXQoKTsKK30KKworaW5saW5lIEZy
YWN0aW9uYWxMYXlvdXRVbml0IG9wZXJhdG9yLyhjb25zdCBpbnQgYSwgY29uc3QgRnJhY3Rpb25h
bExheW91dFVuaXQmIGIpCit7CisgICAgcmV0dXJuIEZyYWN0aW9uYWxMYXlvdXRVbml0KGEpIC8g
YjsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0IG9wZXJhdG9yLyh1bnNpZ25lZCBp
bnQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgcmV0dXJuIEZyYWN0
aW9uYWxMYXlvdXRVbml0KGEpIC8gYjsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0
IG9wZXJhdG9yKyhjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgY29uc3QgRnJhY3Rpb25h
bExheW91dFVuaXQmIGIpCit7CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQgcmV0dXJuVmFsOwor
ICAgIHJldHVyblZhbC5zZXRSYXdWYWx1ZShhLnJhd1ZhbHVlKCkgKyBiLnJhd1ZhbHVlKCkpOwor
ICAgIHJldHVybiByZXR1cm5WYWw7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBv
cGVyYXRvcisoY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGludCBiKQoreworICAgIHJl
dHVybiBhICsgRnJhY3Rpb25hbExheW91dFVuaXQoYik7Cit9CisKK2lubGluZSBmbG9hdCBvcGVy
YXRvcisoY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGZsb2F0IGIpCit7CisgICAgcmV0
dXJuIGEudG9GbG9hdCgpICsgYjsKK30KKworaW5saW5lIGRvdWJsZSBvcGVyYXRvcisoY29uc3Qg
RnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGRvdWJsZSBiKQoreworICAgIHJldHVybiBhLnRvRG91
YmxlKCkgKyBiOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExheW91dFVuaXQgb3BlcmF0b3IrKGNv
bnN0IGludCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4g
RnJhY3Rpb25hbExheW91dFVuaXQoYSkgKyBiOworfQorCitpbmxpbmUgZmxvYXQgb3BlcmF0b3Ir
KGNvbnN0IGZsb2F0IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJl
dHVybiBhICsgYi50b0Zsb2F0KCk7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBv
cGVyYXRvci0oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGNvbnN0IEZyYWN0aW9uYWxM
YXlvdXRVbml0JiBiKQoreworICAgIEZyYWN0aW9uYWxMYXlvdXRVbml0IHJldHVyblZhbDsKKyAg
ICByZXR1cm5WYWwuc2V0UmF3VmFsdWUoYS5yYXdWYWx1ZSgpIC0gYi5yYXdWYWx1ZSgpKTsKKyAg
ICByZXR1cm4gcmV0dXJuVmFsOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExheW91dFVuaXQgb3Bl
cmF0b3ItKGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBpbnQgYikKK3sKKyAgICByZXR1
cm4gYSAtIEZyYWN0aW9uYWxMYXlvdXRVbml0KGIpOworfQorCitpbmxpbmUgZmxvYXQgb3BlcmF0
b3ItKGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBmbG9hdCBiKQoreworICAgIHJldHVy
biBhLnRvRmxvYXQoKSAtIGI7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVy
YXRvci0oY29uc3QgaW50IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAg
IHJldHVybiBGcmFjdGlvbmFsTGF5b3V0VW5pdChhKSAtIGI7Cit9CisKK2lubGluZSBmbG9hdCBv
cGVyYXRvci0oY29uc3QgZmxvYXQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7
CisgICAgcmV0dXJuIGEgLSBiLnRvRmxvYXQoKTsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlv
dXRVbml0IG9wZXJhdG9yLShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSkKK3sKKyAgICBG
cmFjdGlvbmFsTGF5b3V0VW5pdCByZXR1cm5WYWw7CisgICAgcmV0dXJuVmFsLnNldFJhd1ZhbHVl
KC1hLnJhd1ZhbHVlKCkpOworICAgIHJldHVybiByZXR1cm5WYWw7Cit9CisKK2lubGluZSBGcmFj
dGlvbmFsTGF5b3V0VW5pdCYgb3BlcmF0b3IrPShGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgY29u
c3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgYSA9IGEgKyBiOworICAgIHJldHVy
biBhOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExheW91dFVuaXQmIG9wZXJhdG9yKz0oRnJhY3Rp
b25hbExheW91dFVuaXQmIGEsIGludCBiKQoreworICAgIGEgPSBhICsgYjsKKyAgICByZXR1cm4g
YTsKK30KKworaW5saW5lIGZsb2F0JiBvcGVyYXRvcis9KGZsb2F0JiBhLCBjb25zdCBGcmFjdGlv
bmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICBhID0gYSArIGIudG9GbG9hdCgpOworICAgIHJldHVy
biBhOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExheW91dFVuaXQmIG9wZXJhdG9yLT0oRnJhY3Rp
b25hbExheW91dFVuaXQmIGEsIGludCBiKQoreworICAgIGEgPSBhIC0gYjsKKyAgICByZXR1cm4g
YTsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0JiBvcGVyYXRvci09KEZyYWN0aW9u
YWxMYXlvdXRVbml0JiBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICBh
ID0gYSAtIGI7CisgICAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBmbG9hdCYgb3BlcmF0b3ItPShm
bG9hdCYgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgYSA9IGEgLSBi
LnRvRmxvYXQoKTsKKyAgICByZXR1cm4gYTsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRV
bml0JiBvcGVyYXRvcio9KEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBpbnQgYikKK3sKKyAgICBh
ID0gYSAqIGI7CisgICAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5p
dCYgb3BlcmF0b3IqPShGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgZmxvYXQgYikKK3sKKyAgICBh
ID0gYSAqIGI7CisgICAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBpbnQgc25hcFNpemVUb1BpeGVs
KEZyYWN0aW9uYWxMYXlvdXRVbml0IHNpemUsIEZyYWN0aW9uYWxMYXlvdXRVbml0IGxvY2F0aW9u
KSAKK3sKKyAgICByZXR1cm4gKGxvY2F0aW9uICsgc2l6ZSkucm91bmQoKSAtIGxvY2F0aW9uLnJv
dW5kKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEZyYWN0aW9u
YWxMYXlvdXRVbml0X2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126154</attachid>
            <date>2012-02-08 14:31:24 -0800</date>
            <delta_ts>2012-02-08 17:52:03 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77485-20120208143123.patch</filename>
            <type>text/plain</type>
            <size>19986</size>
            <attacher name="Levi Weintraub">leviw</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwNjk5MCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBACisyMDEyLTAyLTA3ICBFbWlsIEEg
RWtsdW5kICA8ZWFlQGNocm9taXVtLm9yZz4gYW5kIExldmkgV2VpbnRyYXViICA8bGV2aXdAY2hy
b21pdW0ub3JnPgorCisgICAgICAgIEFkZCBGcmFjdGlvbmFsTGF5b3V0VW5pdCB0eXBlIGZvciBz
dWItcGl4ZWwgbGF5b3V0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD03NzQ4NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEFkZCBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiAoRnJhY3Rpb25hbExheW91dFVu
aXQpLgorCisgICAgICAgIEZyYWN0aW9uYWxMYXlvdXRVbml0IHJlcHJlc2VudHMgdmFsdWVzIGFz
IG11bHRpcGxlcyBvZiAxLzYwdGggcGl4ZWwuIFRoaXMgYWxsb3dzIHVzCisgICAgICAgIHRvIHJl
cHJlc2VudCBzdWItcGl4ZWwgdmFsdWVzIHVzaW5nIGludGVnZXIgbWF0aCBhbmQgYXZvaWRzIGZs
b2F0aW5nIHBvaW50IHByZWNpc2lvbgorICAgICAgICBwcm9ibGVtcy4KKworICAgICAgICBObyBu
ZXcgdGVzdHMuCisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAg
ICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogcGxh
dGZvcm0vRnJhY3Rpb25hbExheW91dFVuaXQuaDogQWRkZWQuCisKIDIwMTItMDItMDcgIE1hdHRo
ZXcgRGVsYW5leSAgPG1kZWxhbmV5QGFwcGxlLmNvbT4KIAogICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc5MTIKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dl
YkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCShyZXZpc2lvbiAxMDY5OTApCisrKyBTb3Vy
Y2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpA
QCAtMjY2MTQsNiArMjY2MTQsMTAgQEAKIAkJCQk+CiAJCQk8L0ZpbGU+CiAJCQk8RmlsZQorCQkJ
CVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cRnJhY3Rpb25hbExheW91dFVuaXQuaCIKKwkJCQk+
CisJCQk8L0ZpbGU+CisJCQk8RmlsZQogCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cR2Vv
bG9jYXRpb25TZXJ2aWNlLmNwcCIKIAkJCQk+CiAJCQk8L0ZpbGU+CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAx
MDY5OTApCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2oJKHdvcmtpbmcgY29weSkKQEAgLTQ5NzksNiArNDk3OSw3IEBACiAJCUI4REJEQjRDMTMwQjBG
OEEwMEY1Q0RCMSAvKiBTZXRTZWxlY3Rpb25Db21tYW5kLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCOERCREI0ODEzMEIwRjhBMDBGNUNEQjEgLyogU2V0
U2VsZWN0aW9uQ29tbWFuZC5oICovOyB9OwogCQlCOERCREI0RDEzMEIwRjhBMDBGNUNEQjEgLyog
U3BlbGxpbmdDb3JyZWN0aW9uQ29tbWFuZC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBCOERCREI0OTEzMEIwRjhBMDBGNUNEQjEgLyogU3BlbGxpbmdD
b3JyZWN0aW9uQ29tbWFuZC5jcHAgKi87IH07CiAJCUI4REJEQjRFMTMwQjBGOEEwMEY1Q0RCMSAv
KiBTcGVsbGluZ0NvcnJlY3Rpb25Db21tYW5kLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBCOERCREI0QTEzMEIwRjhBMDBGNUNEQjEgLyogU3BlbGxpbmdD
b3JyZWN0aW9uQ29tbWFuZC5oICovOyB9OworCQlCQUIyMkFENDE0QjdBMDJEMDBEOEFCQTYgLyog
RnJhY3Rpb25hbExheW91dFVuaXQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEJBQjc3MTUwMTQ0NENCQjQwMEVDNEM0QyAvKiBGcmFjdGlvbmFsTGF5b3V0
VW5pdC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJ
CUJBQ0YyOTAxMTNCMkEwRDUwMDc4MUY5MCAvKiBMYXlvdXRUeXBlcy5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkFDRjI5MDAxM0IyQTBENTAwNzgxRjkw
IC8qIExheW91dFR5cGVzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwg
KTsgfTsgfTsKIAkJQkMwMEYwMDQwRTBBMTg1NTAwRkQwNEUzIC8qIERPTUZpbGUuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDMDBFRkZFMEUwQTE4NTUw
MEZEMDRFMyAvKiBET01GaWxlLmggKi87IH07CiAJCUJDMDBGMDA1MEUwQTE4NTUwMEZEMDRFMyAv
KiBET01GaWxlLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gQkMwMEVGRkYwRTBBMTg1NTAwRkQwNEUzIC8qIERPTUZpbGUubW0gKi87IH07CkBAIC0xMTg3
Nyw2ICsxMTg3OCw3IEBACiAJCUI4REJEQjQ4MTMwQjBGOEEwMEY1Q0RCMSAvKiBTZXRTZWxlY3Rp
b25Db21tYW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNldFNlbGVjdGlv
bkNvbW1hbmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQjhEQkRCNDkxMzBCMEY4
QTAwRjVDREIxIC8qIFNwZWxsaW5nQ29ycmVjdGlvbkNvbW1hbmQuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gU3BlbGxpbmdDb3JyZWN0aW9uQ29tbWFuZC5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUI4REJEQjRBMTMwQjBGOEEwMEY1Q0RCMSAvKiBT
cGVsbGluZ0NvcnJlY3Rpb25Db21tYW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IFNwZWxsaW5nQ29ycmVjdGlvbkNvbW1hbmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJQkFCNzcxNTAxNDQ0Q0JCNDAwRUM0QzRDIC8qIEZyYWN0aW9uYWxMYXlvdXRVbml0Lmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEZyYWN0aW9uYWxMYXlvdXRVbml0Lmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJBQ0YyOTAwMTNCMkEwRDUwMDc4MUY5MCAv
KiBMYXlvdXRUeXBlcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBMYXlvdXRU
eXBlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQzAwRUZGRTBFMEExODU1MDBG
RDA0RTMgLyogRE9NRmlsZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBET01G
aWxlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDMDBFRkZGMEUwQTE4NTUwMEZE
MDRFMyAvKiBET01GaWxlLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRo
ID0gRE9NRmlsZS5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE5Njk0LDYgKzE5
Njk2LDcgQEAKIAkJCQlDNTdGRURFMDEyMTJFRTlDMDA5N0JFNjUgLyogRmlsZVN5c3RlbS5jcHAg
Ki8sCiAJCQkJNTE0QjNGNzIwQzcyMjA0NzAwMDUzMERGIC8qIEZpbGVTeXN0ZW0uaCAqLywKIAkJ
CQlCQzA3M0JBOTBDMzk5QjFGMDAwRjU5NzkgLyogRmxvYXRDb252ZXJzaW9uLmggKi8sCisJCQkJ
QkFCNzcxNTAxNDQ0Q0JCNDAwRUM0QzRDIC8qIEZyYWN0aW9uYWxMYXlvdXRVbml0LmggKi8sCiAJ
CQkJQTg3NDhCREYxMkNCRjJEQzAwMUZCQTQxIC8qIEhhc2hUb29scy5oICovLAogCQkJCUQ2RkRB
RUYyMTQ5QzA2MTkwMDM3QjFFMSAvKiBIaXN0b2dyYW1TdXBwb3J0LmNwcCAqLywKIAkJCQlENjMw
RTJBQjE0OUJGMzQ0MDA1QjJGOTMgLyogSGlzdG9ncmFtU3VwcG9ydC5oICovLApAQCAtMjEwODks
NiArMjEwOTIsNyBAQAogCQkJCTFBMkFBQzU5MERDMkEzQjEwMEEyMEQ5QSAvKiBBcHBsaWNhdGlv
bkNhY2hlU3RvcmFnZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOUI0MTcwNjQxMjU2NjJCMzAwNkIy
OEZDIC8qIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTMz
MDlERDkwOTlFNjQ5MjAwNTZFNTgxIC8qIEFwcGx5U3R5bGVDb21tYW5kLmggaW4gSGVhZGVycyAq
LywKKwkJCQlCQUIyMkFENDE0QjdBMDJEMDBEOEFCQTYgLyogRnJhY3Rpb25hbExheW91dFVuaXQu
aCBpbiBIZWFkZXJzICovLAogCQkJCTUxMkREOEY2MEQ5MUU2QUYwMDBGODlFRSAvKiBBcmNoaXZl
LmggaW4gSGVhZGVycyAqLywKIAkJCQk1MTJERDhGRDBEOTFFNkFGMDAwRjg5RUUgLyogQXJjaGl2
ZUZhY3RvcnkuaCBpbiBIZWFkZXJzICovLAogCQkJCTUxMkREOEZDMEQ5MUU2QUYwMDBGODlFRSAv
KiBBcmNoaXZlUmVzb3VyY2UuaCBpbiBIZWFkZXJzICovLApJbmRleDogU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vRnJhY3Rpb25hbExheW91dFVuaXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9GcmFjdGlvbmFsTGF5b3V0VW5pdC5oCShyZXZpc2lvbiAwKQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vRnJhY3Rpb25hbExheW91dFVuaXQuaAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw1MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBGcmFjdGlvbmFsTGF5b3V0VW5pdF9oCisjZGVmaW5l
IEZyYWN0aW9uYWxMYXlvdXRVbml0X2gKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUg
PGxpbWl0cz4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitz
dGF0aWMgY29uc3QgaW50IGtGaXhlZFBvaW50RGVub21pbmF0b3IgPSA2MDsKK2NvbnN0IGludCBp
bnRNYXhGb3JMYXlvdXRVbml0ID0gSU5UX01BWCAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7Citj
b25zdCBpbnQgaW50TWluRm9yTGF5b3V0VW5pdCA9IC1pbnRNYXhGb3JMYXlvdXRVbml0OworCitj
bGFzcyBGcmFjdGlvbmFsTGF5b3V0VW5pdCB7CitwdWJsaWM6CisgICAgRnJhY3Rpb25hbExheW91
dFVuaXQoKSA6IG1fdmFsdWUoMCkgeyB9CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQoaW50IHZh
bHVlKSB7IEFTU0VSVChpc0luQm91bmRzKHZhbHVlKSk7IG1fdmFsdWUgPSB2YWx1ZSAqIGtGaXhl
ZFBvaW50RGVub21pbmF0b3I7IH0KKyAgICBGcmFjdGlvbmFsTGF5b3V0VW5pdCh1bnNpZ25lZCBz
aG9ydCB2YWx1ZSkgeyBBU1NFUlQoaXNJbkJvdW5kcyh2YWx1ZSkpOyBtX3ZhbHVlID0gdmFsdWUg
KiBrRml4ZWRQb2ludERlbm9taW5hdG9yOyB9CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQodW5z
aWduZWQgaW50IHZhbHVlKSB7IEFTU0VSVChpc0luQm91bmRzKHZhbHVlKSk7IG1fdmFsdWUgPSB2
YWx1ZSAqIGtGaXhlZFBvaW50RGVub21pbmF0b3I7IH0KKyAgICBGcmFjdGlvbmFsTGF5b3V0VW5p
dChmbG9hdCB2YWx1ZSkgeyBBU1NFUlQoaXNJbkJvdW5kcyh2YWx1ZSkpOyBtX3ZhbHVlID0gdmFs
dWUgKiBrRml4ZWRQb2ludERlbm9taW5hdG9yOyB9CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQo
ZG91YmxlIHZhbHVlKSB7IEFTU0VSVChpc0luQm91bmRzKHZhbHVlKSk7IG1fdmFsdWUgPSB2YWx1
ZSAqIGtGaXhlZFBvaW50RGVub21pbmF0b3I7IH0KKyAgICBGcmFjdGlvbmFsTGF5b3V0VW5pdChj
b25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgdmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVlLnJhd1Zh
bHVlKCk7IH0KKworICAgIGlubGluZSBpbnQgdG9JbnQoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVl
IC8ga0ZpeGVkUG9pbnREZW5vbWluYXRvcjsgfQorICAgIGlubGluZSB1bnNpZ25lZCB0b1Vuc2ln
bmVkKCkgY29uc3QgeyBBU1NFUlQobV92YWx1ZSA+PSAwKTsgcmV0dXJuIHRvSW50KCk7IH0KKyAg
ICBpbmxpbmUgZmxvYXQgdG9GbG9hdCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0
PihtX3ZhbHVlKSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7IH0KKyAgICBpbmxpbmUgZG91Ymxl
IHRvRG91YmxlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX3ZhbHVlKSAv
IGtGaXhlZFBvaW50RGVub21pbmF0b3I7IH0KKworICAgIG9wZXJhdG9yIGludCgpIGNvbnN0IHsg
cmV0dXJuIHRvSW50KCk7IH0KKyAgICBvcGVyYXRvciB1bnNpZ25lZCgpIGNvbnN0IHsgcmV0dXJu
IHRvVW5zaWduZWQoKTsgfQorICAgIG9wZXJhdG9yIGZsb2F0KCkgY29uc3QgeyByZXR1cm4gdG9G
bG9hdCgpOyB9CisgICAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3QgeyByZXR1cm4gdG9Eb3VibGUo
KTsgfQorICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisKKyAg
ICBpbmxpbmUgaW50IHJhd1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQorICAgIGlu
bGluZSB2b2lkIHNldFJhd1ZhbHVlKGludCB2YWx1ZSkgeyBtX3ZhbHVlID0gdmFsdWU7IH0KKyAg
ICBpbmxpbmUgdm9pZCBzZXRSYXdWYWx1ZShsb25nIGxvbmcgdmFsdWUpIHsgQVNTRVJUKDo6YWJz
KHZhbHVlKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpOyBtX3ZhbHVlID0gdmFs
dWU7IH0KKworICAgIGlubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBhYnMoKQorICAgIHsKKyAg
ICAgICAgRnJhY3Rpb25hbExheW91dFVuaXQgcmV0dXJuVmFsdWU7CisgICAgICAgIHJldHVyblZh
bHVlLnNldFJhd1ZhbHVlKDo6YWJzKG1fdmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHJldHVyblZh
bHVlOworICAgIH0KKyNpZiBPUyhEQVJXSU4pCisgICAgaW5saW5lIGludCB3dGZfY2VpbCgpCisj
ZWxzZQorICAgIGlubGluZSBpbnQgY2VpbCgpCisjZW5kaWYKKyAgICB7CisgICAgICAgIGlmICht
X3ZhbHVlID4gMCkKKyAgICAgICAgICAgIHJldHVybiAobV92YWx1ZSArIGtGaXhlZFBvaW50RGVu
b21pbmF0b3IgLSAxKSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7CisgICAgICAgIHJldHVybiAo
bV92YWx1ZSAtIGtGaXhlZFBvaW50RGVub21pbmF0b3IgKyAxKSAvIGtGaXhlZFBvaW50RGVub21p
bmF0b3I7CisgICAgfQorICAgIGlubGluZSBpbnQgcm91bmQoKQorICAgIHsKKyAgICAgICAgaWYg
KG1fdmFsdWUgPiAwKQorICAgICAgICAgICAgcmV0dXJuIChtX3ZhbHVlICsgKGtGaXhlZFBvaW50
RGVub21pbmF0b3IgLyAyKSkgLyBrRml4ZWRQb2ludERlbm9taW5hdG9yOworICAgICAgICByZXR1
cm4gKG1fdmFsdWUgLSAoa0ZpeGVkUG9pbnREZW5vbWluYXRvciAvIDIpKSAvIGtGaXhlZFBvaW50
RGVub21pbmF0b3I7CisgICAgfQorCisgICAgaW5saW5lIGludCBmbG9vcigpCisgICAgeworICAg
ICAgICByZXR1cm4gdG9JbnQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZmxvYXQgZXBzaWxvbigp
IHsgcmV0dXJuIDEgLyBrRml4ZWRQb2ludERlbm9taW5hdG9yOyB9CisgICAgc3RhdGljIGNvbnN0
IEZyYWN0aW9uYWxMYXlvdXRVbml0IG1heCgpCisgICAgeworICAgICAgICBGcmFjdGlvbmFsTGF5
b3V0VW5pdCBtOworICAgICAgICBtLm1fdmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46
Om1heCgpOworICAgICAgICByZXR1cm4gbTsKKyAgICB9CisgICAgc3RhdGljIGNvbnN0IEZyYWN0
aW9uYWxMYXlvdXRVbml0IG1pbigpCisgICAgeworICAgICAgICBGcmFjdGlvbmFsTGF5b3V0VW5p
dCBtOworICAgICAgICBtLm1fdmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigp
OworICAgICAgICByZXR1cm4gbTsKKyAgICB9CisgICAgCitwcml2YXRlOgorICAgIGlubGluZSBi
b29sIGlzSW5Cb3VuZHMoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDo6YWJzKHZh
bHVlKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLyBrRml4ZWRQb2ludERlbm9t
aW5hdG9yOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBpc0luQm91bmRzKHVuc2lnbmVkIHZhbHVl
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlIDwgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+
OjptYXgoKSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7CisgICAgfQorICAgIGlubGluZSBib29s
IGlzSW5Cb3VuZHMoZG91YmxlIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDo6YWJzKHZh
bHVlKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLyBrRml4ZWRQb2ludERlbm9t
aW5hdG9yOworICAgIH0KKworICAgIGludCBtX3ZhbHVlOworfTsKKworaW5saW5lIGJvb2wgb3Bl
cmF0b3I8PShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgY29uc3QgRnJhY3Rpb25hbExh
eW91dFVuaXQmIGIpCit7CisgICAgcmV0dXJuIGEucmF3VmFsdWUoKSA8PSBiLnJhd1ZhbHVlKCk7
Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQm
IGEsIGZsb2F0IGIpCit7CisgICAgcmV0dXJuIGEudG9GbG9hdCgpIDw9IGI7Cit9CisKK2lubGlu
ZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGludCBiKQor
eworICAgIHJldHVybiBhIDw9IEZyYWN0aW9uYWxMYXlvdXRVbml0KGIpOworfQorCitpbmxpbmUg
Ym9vbCBvcGVyYXRvcjw9KGNvbnN0IGZsb2F0IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0
JiBiKQoreworICAgIHJldHVybiBhIDw9IGIudG9GbG9hdCgpOworfQorCitpbmxpbmUgYm9vbCBv
cGVyYXRvcjw9KGNvbnN0IGludCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sK
KyAgICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQoYSkgPD0gYjsKK30KKworaW5saW5lIGJv
b2wgb3BlcmF0b3I+PShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgY29uc3QgRnJhY3Rp
b25hbExheW91dFVuaXQmIGIpCit7CisgICAgcmV0dXJuIGEucmF3VmFsdWUoKSA+PSBiLnJhd1Zh
bHVlKCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRnJhY3Rpb25hbExheW91
dFVuaXQmIGEsIGludCBiKQoreworICAgIHJldHVybiBhID49IEZyYWN0aW9uYWxMYXlvdXRVbml0
KGIpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGZsb2F0IGEsIGNvbnN0IEZy
YWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBhID49IGIudG9GbG9hdCgpOwor
fQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBh
LCBmbG9hdCBiKQoreworICAgIHJldHVybiBhLnRvRmxvYXQoKSA+PSBiOworfQorCitpbmxpbmUg
Ym9vbCBvcGVyYXRvcj49KGNvbnN0IGludCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYg
YikKK3sKKyAgICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQoYSkgPj0gYjsKK30KKworaW5s
aW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBjb25zdCBG
cmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4gYS5yYXdWYWx1ZSgpIDwgYi5y
YXdWYWx1ZSgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRnJhY3Rpb25hbExh
eW91dFVuaXQmIGEsIGludCBiKQoreworICAgIHJldHVybiBhIDwgRnJhY3Rpb25hbExheW91dFVu
aXQoYik7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBGcmFjdGlvbmFsTGF5b3V0
VW5pdCYgYSwgZmxvYXQgYikKK3sKKyAgICByZXR1cm4gYS50b0Zsb2F0KCkgPCBiOworfQorCitp
bmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgaW50IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRV
bml0JiBiKQoreworICAgIHJldHVybiBGcmFjdGlvbmFsTGF5b3V0VW5pdChhKSA8IGI7Cit9CisK
K2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBmbG9hdCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5
b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4gYSA8IGIudG9GbG9hdCgpOworfQorCitpbmxpbmUg
Ym9vbCBvcGVyYXRvcj4oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGNvbnN0IEZyYWN0
aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBhLnJhd1ZhbHVlKCkgPiBiLnJhd1Zh
bHVlKCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBGcmFjdGlvbmFsTGF5b3V0
VW5pdCYgYSwgZG91YmxlIGIpCit7CisgICAgcmV0dXJuIGEudG9Eb3VibGUoKSA+IGI7Cit9CisK
K2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgZmxv
YXQgYikKK3sKKyAgICByZXR1cm4gYS50b0Zsb2F0KCkgPiBiOworfQorCitpbmxpbmUgYm9vbCBv
cGVyYXRvcj4oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGludCBiKQoreworICAgIHJl
dHVybiBhID4gRnJhY3Rpb25hbExheW91dFVuaXQoYik7Cit9CisKK2lubGluZSBib29sIG9wZXJh
dG9yPihjb25zdCBpbnQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAg
cmV0dXJuIEZyYWN0aW9uYWxMYXlvdXRVbml0KGEpID4gYjsKK30KKworaW5saW5lIGJvb2wgb3Bl
cmF0b3I+KGNvbnN0IGZsb2F0IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQorewor
ICAgIHJldHVybiBhID4gYi50b0Zsb2F0KCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPihj
b25zdCBkb3VibGUgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgcmV0
dXJuIGEgPiBiLnRvRG91YmxlKCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3Qg
RnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQor
eworICAgIHJldHVybiBhLnJhd1ZhbHVlKCkgIT0gYi5yYXdWYWx1ZSgpOworfQorCitpbmxpbmUg
Ym9vbCBvcGVyYXRvciE9KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBmbG9hdCBiKQor
eworICAgIHJldHVybiBhICE9IEZyYWN0aW9uYWxMYXlvdXRVbml0KGIpOworfQorCitpbmxpbmUg
Ym9vbCBvcGVyYXRvciE9KGNvbnN0IGludCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYg
YikKK3sKKyAgICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQoYSkgIT0gYjsKK30KKworaW5s
aW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgaW50IGIp
Cit7CisgICAgcmV0dXJuIGEgIT0gRnJhY3Rpb25hbExheW91dFVuaXQoYik7Cit9CisKK2lubGlu
ZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGNvbnN0IEZy
YWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBhLnJhd1ZhbHVlKCkgPT0gYi5y
YXdWYWx1ZSgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZyYWN0aW9uYWxM
YXlvdXRVbml0JiBhLCBpbnQgYikKK3sKKyAgICByZXR1cm4gYSA9PSBGcmFjdGlvbkxheW91dFVu
aXQoYik7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgaW50IGEsIGNvbnN0IEZy
YWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBGcmFjdGlvbkxheW91dFVuaXQo
YSkgPT0gYjsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGcmFjdGlvbmFsTGF5
b3V0VW5pdCYgYSwgZmxvYXQgYikKK3sKKyAgICByZXR1cm4gYS50b0Zsb2F0KCkgPT0gYjsKK30K
KworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmbG9hdCBhLCBjb25zdCBGcmFjdGlvbmFs
TGF5b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4gYSA9PSBiLnRvRmxvYXQoKTsKK30KKworLy8g
Rm9yIG11bHRpcGxpY2F0aW9uIHRoYXQncyBwcm9uZSB0byBvdmVyZmxvdywgdGhpcyBib3VuZHMg
aXQgdG8gRnJhY3Rpb25hbExheW91dFVuaXQ6Om1heCgpIGFuZCA6Om1pbigpCitpbmxpbmUgRnJh
Y3Rpb25hbExheW91dFVuaXQgYm91bmRlZE11bHRpcGx5KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRV
bml0JiBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICBGcmFjdGlvbmFs
TGF5b3V0VW5pdCByZXR1cm5WYWw7CisgICAgbG9uZyBsb25nIHJhd1ZhbCA9IHN0YXRpY19jYXN0
PGxvbmcgbG9uZz4oYS5yYXdWYWx1ZSgpKSAqIGIucmF3VmFsdWUoKSAvIGtGaXhlZFBvaW50RGVu
b21pbmF0b3I7CisgICAgaWYgKHJhd1ZhbCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4
KCkpCisgICAgICAgIHJldHVybiBBcHBVbml0OjptYXgoKTsKKyAgICBpZiAocmF3VmFsIDwgc3Rk
OjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSkKKyAgICAgICAgcmV0dXJuIEFwcFVuaXQ6Om1p
bigpOworICAgIHJldHVyblZhbC5zZXRSYXdWYWx1ZShyYXdWYWwpOworICAgIHJldHVybiByZXR1
cm5WYWw7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVyYXRvciooY29uc3Qg
RnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQor
eworICAgIEZyYWN0aW9uYWxMYXlvdXRVbml0IHJldHVyblZhbDsKKyAgICBsb25nIGxvbmcgcmF3
VmFsID0gc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihhLnJhd1ZhbHVlKCkpICogYi5yYXdWYWx1ZSgp
IC8ga0ZpeGVkUG9pbnREZW5vbWluYXRvcjsKKyAgICByZXR1cm5WYWwuc2V0UmF3VmFsdWUoKGEu
cmF3VmFsdWUoKSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3IpICogYi5yYXdWYWx1ZSgpKTsKKyAg
ICByZXR1cm4gcmV0dXJuVmFsOworfSAgICAKKworaW5saW5lIGRvdWJsZSBvcGVyYXRvciooY29u
c3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGRvdWJsZSBiKQoreworICAgIHJldHVybiBhLnRv
RG91YmxlKCkgKiBiOworfQorCitpbmxpbmUgZmxvYXQgb3BlcmF0b3IqKGNvbnN0IEZyYWN0aW9u
YWxMYXlvdXRVbml0JiBhLCBmbG9hdCBiKQoreworICAgIHJldHVybiBhLnRvRmxvYXQoKSAqIGI7
Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVyYXRvciooY29uc3QgRnJhY3Rp
b25hbExheW91dFVuaXQmIGEsIGludCBiKQoreworICAgIHJldHVybiBhICogRnJhY3Rpb25hbExh
eW91dFVuaXQoYik7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVyYXRvcioo
Y29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIHVuc2lnbmVkIGIpCit7CisgICAgcmV0dXJu
IGEgKiBGcmFjdGlvbmFsTGF5b3V0VW5pdChiKTsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlv
dXRVbml0IG9wZXJhdG9yKih1bnNpZ25lZCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYg
YikKK3sKKyAgICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQoYSkgKiBiOworfQorCitpbmxp
bmUgRnJhY3Rpb25hbExheW91dFVuaXQgb3BlcmF0b3IqKGNvbnN0IGludCBhLCBjb25zdCBGcmFj
dGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQo
YSkgKiBiOworfQorCitpbmxpbmUgZmxvYXQgb3BlcmF0b3IqKGNvbnN0IGZsb2F0IGEsIGNvbnN0
IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBhICogYi50b0Zsb2F0KCk7
Cit9CisKK2lubGluZSBkb3VibGUgb3BlcmF0b3IqKGNvbnN0IGRvdWJsZSBhLCBjb25zdCBGcmFj
dGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4gYSAqIGIudG9Eb3VibGUoKTsKK30K
KworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0IG9wZXJhdG9yLyhjb25zdCBGcmFjdGlvbmFs
TGF5b3V0VW5pdCYgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgRnJh
Y3Rpb25hbExheW91dFVuaXQgcmV0dXJuVmFsOworICAgIGxvbmcgbG9uZyByYXdWYWwgPSBzdGF0
aWNfY2FzdDxsb25nIGxvbmc+KGtGaXhlZFBvaW50RGVub21pbmF0b3IpICogYS5yYXdWYWx1ZSgp
IC8gYi5yYXdWYWx1ZSgpOworICAgIHJldHVyblZhbC5zZXRSYXdWYWx1ZShyYXdWYWwpOworICAg
IHJldHVybiByZXR1cm5WYWw7Cit9ICAgIAorCitpbmxpbmUgZmxvYXQgb3BlcmF0b3IvKGNvbnN0
IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBmbG9hdCBiKQoreworICAgIHJldHVybiBhLnRvRmxv
YXQoKSAvIGI7Cit9CisKK2lubGluZSBkb3VibGUgb3BlcmF0b3IvKGNvbnN0IEZyYWN0aW9uYWxM
YXlvdXRVbml0JiBhLCBkb3VibGUgYikKK3sKKyAgICByZXR1cm4gYS50b0RvdWJsZSgpIC8gYjsK
K30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0IG9wZXJhdG9yLyhjb25zdCBGcmFjdGlv
bmFsTGF5b3V0VW5pdCYgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgLyBGcmFjdGlvbmFsTGF5
b3V0VW5pdChiKTsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0IG9wZXJhdG9yLyhj
b25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgdW5zaWduZWQgaW50IGIpCit7CisgICAgcmV0
dXJuIGEgLyBGcmFjdGlvbmFsTGF5b3V0VW5pdChiKTsKK30KKworaW5saW5lIGZsb2F0IG9wZXJh
dG9yLyhjb25zdCBmbG9hdCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAg
ICByZXR1cm4gYSAvIGIudG9GbG9hdCgpOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExheW91dFVu
aXQgb3BlcmF0b3IvKGNvbnN0IGludCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikK
K3sKKyAgICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQoYSkgLyBiOworfQorCitpbmxpbmUg
RnJhY3Rpb25hbExheW91dFVuaXQgb3BlcmF0b3IvKHVuc2lnbmVkIGludCBhLCBjb25zdCBGcmFj
dGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQo
YSkgLyBiOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExheW91dFVuaXQgb3BlcmF0b3IrKGNvbnN0
IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikK
K3sKKyAgICBGcmFjdGlvbmFsTGF5b3V0VW5pdCByZXR1cm5WYWw7CisgICAgcmV0dXJuVmFsLnNl
dFJhd1ZhbHVlKGEucmF3VmFsdWUoKSArIGIucmF3VmFsdWUoKSk7CisgICAgcmV0dXJuIHJldHVy
blZhbDsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0IG9wZXJhdG9yKyhjb25zdCBG
cmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgKyBGcmFjdGlv
bmFsTGF5b3V0VW5pdChiKTsKK30KKworaW5saW5lIGZsb2F0IG9wZXJhdG9yKyhjb25zdCBGcmFj
dGlvbmFsTGF5b3V0VW5pdCYgYSwgZmxvYXQgYikKK3sKKyAgICByZXR1cm4gYS50b0Zsb2F0KCkg
KyBiOworfQorCitpbmxpbmUgZG91YmxlIG9wZXJhdG9yKyhjb25zdCBGcmFjdGlvbmFsTGF5b3V0
VW5pdCYgYSwgZG91YmxlIGIpCit7CisgICAgcmV0dXJuIGEudG9Eb3VibGUoKSArIGI7Cit9CisK
K2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVyYXRvcisoY29uc3QgaW50IGEsIGNvbnN0
IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBGcmFjdGlvbmFsTGF5b3V0
VW5pdChhKSArIGI7Cit9CisKK2lubGluZSBmbG9hdCBvcGVyYXRvcisoY29uc3QgZmxvYXQgYSwg
Y29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgcmV0dXJuIGEgKyBiLnRvRmxv
YXQoKTsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0IG9wZXJhdG9yLShjb25zdCBG
cmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7
CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQgcmV0dXJuVmFsOworICAgIHJldHVyblZhbC5zZXRS
YXdWYWx1ZShhLnJhd1ZhbHVlKCkgLSBiLnJhd1ZhbHVlKCkpOworICAgIHJldHVybiByZXR1cm5W
YWw7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVyYXRvci0oY29uc3QgRnJh
Y3Rpb25hbExheW91dFVuaXQmIGEsIGludCBiKQoreworICAgIHJldHVybiBhIC0gRnJhY3Rpb25h
bExheW91dFVuaXQoYik7Cit9CisKK2lubGluZSBmbG9hdCBvcGVyYXRvci0oY29uc3QgRnJhY3Rp
b25hbExheW91dFVuaXQmIGEsIGZsb2F0IGIpCit7CisgICAgcmV0dXJuIGEudG9GbG9hdCgpIC0g
YjsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0IG9wZXJhdG9yLShjb25zdCBpbnQg
YSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgcmV0dXJuIEZyYWN0aW9u
YWxMYXlvdXRVbml0KGEpIC0gYjsKK30KKworaW5saW5lIGZsb2F0IG9wZXJhdG9yLShjb25zdCBm
bG9hdCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4gYSAt
IGIudG9GbG9hdCgpOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExheW91dFVuaXQgb3BlcmF0b3It
KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhKQoreworICAgIEZyYWN0aW9uYWxMYXlvdXRV
bml0IHJldHVyblZhbDsKKyAgICByZXR1cm5WYWwuc2V0UmF3VmFsdWUoLWEucmF3VmFsdWUoKSk7
CisgICAgcmV0dXJuIHJldHVyblZhbDsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0
JiBvcGVyYXRvcis9KEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBjb25zdCBGcmFjdGlvbmFsTGF5
b3V0VW5pdCYgYikKK3sKKyAgICBhID0gYSArIGI7CisgICAgcmV0dXJuIGE7Cit9CisKK2lubGlu
ZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgb3BlcmF0b3IrPShGcmFjdGlvbmFsTGF5b3V0VW5pdCYg
YSwgaW50IGIpCit7CisgICAgYSA9IGEgKyBiOworICAgIHJldHVybiBhOworfQorCitpbmxpbmUg
ZmxvYXQmIG9wZXJhdG9yKz0oZmxvYXQmIGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBi
KQoreworICAgIGEgPSBhICsgYjsKKyAgICByZXR1cm4gYTsKK30KKworaW5saW5lIEZyYWN0aW9u
YWxMYXlvdXRVbml0JiBvcGVyYXRvci09KEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBpbnQgYikK
K3sKKyAgICBhID0gYSAtIGI7CisgICAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBGcmFjdGlvbmFs
TGF5b3V0VW5pdCYgb3BlcmF0b3ItPShGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgY29uc3QgRnJh
Y3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgYSA9IGEgLSBiOworICAgIHJldHVybiBhOwor
fQorCitpbmxpbmUgZmxvYXQmIG9wZXJhdG9yLT0oZmxvYXQmIGEsIGNvbnN0IEZyYWN0aW9uYWxM
YXlvdXRVbml0JiBiKQoreworICAgIGEgPSBhIC0gYjsKKyAgICByZXR1cm4gYTsKK30KKworaW5s
aW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0JiBvcGVyYXRvcio9KEZyYWN0aW9uYWxMYXlvdXRVbml0
JiBhLCBpbnQgYikKK3sKKyAgICBhID0gYSAqIGI7CisgICAgcmV0dXJuIGE7Cit9CisKK2lubGlu
ZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgb3BlcmF0b3IqPShGcmFjdGlvbmFsTGF5b3V0VW5pdCYg
YSwgZmxvYXQgYikKK3sKKyAgICBhID0gYSAqIGI7CisgICAgcmV0dXJuIGE7Cit9CisKK2lubGlu
ZSBpbnQgc25hcFNpemVUb1BpeGVsKEZyYWN0aW9uYWxMYXlvdXRVbml0IHNpemUsIEZyYWN0aW9u
YWxMYXlvdXRVbml0IGxvY2F0aW9uKSAKK3sKKyAgICByZXR1cm4gKGxvY2F0aW9uICsgc2l6ZSku
cm91bmQoKSAtIGxvY2F0aW9uLnJvdW5kKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
KworI2VuZGlmIC8vIEZyYWN0aW9uYWxMYXlvdXRVbml0X2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126210</attachid>
            <date>2012-02-08 17:52:07 -0800</date>
            <delta_ts>2012-02-10 16:00:47 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77485-20120208175206.patch</filename>
            <type>text/plain</type>
            <size>20015</size>
            <attacher name="Levi Weintraub">leviw</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwNzE1NCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIyIEBACisyMDEyLTAyLTA4ICBFbWlsIEEg
RWtsdW5kICA8ZWFlQGNocm9taXVtLm9yZz4gYW5kIExldmkgV2VpbnRyYXViICA8bGV2aXdAY2hy
b21pdW0ub3JnPgorCisgICAgICAgIEFkZCBGcmFjdGlvbmFsTGF5b3V0VW5pdCB0eXBlIGZvciBz
dWItcGl4ZWwgbGF5b3V0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD03NzQ4NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEFkZCBmaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiAoRnJhY3Rpb25hbExheW91dFVu
aXQpLgorCisgICAgICAgIEZyYWN0aW9uYWxMYXlvdXRVbml0IHJlcHJlc2VudHMgdmFsdWVzIGFz
IG11bHRpcGxlcyBvZiAxLzYwdGggcGl4ZWwuIFRoaXMgYWxsb3dzIHVzCisgICAgICAgIHRvIHJl
cHJlc2VudCBzdWItcGl4ZWwgdmFsdWVzIHVzaW5nIGludGVnZXIgbWF0aCBhbmQgYXZvaWRzIGZs
b2F0aW5nIHBvaW50IHByZWNpc2lvbgorICAgICAgICBwcm9ibGVtcy4KKworICAgICAgICBObyBu
ZXcgdGVzdHMuCisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAg
ICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogcGxh
dGZvcm0vRnJhY3Rpb25hbExheW91dFVuaXQuaDogQWRkZWQuCisKIDIwMTItMDItMDggIEFkYW0g
S2xlaW4gIDxhZGFta0BjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgU2ltcGxpZnkgYW5kIGNvcnJl
Y3QgbXV0YXRpb24gZGVsaXZlcnkgdGltaW5nIGZvciBKU0MKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCShyZXZpc2lvbiAxMDcxNTQpCisrKyBT
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5
KQpAQCAtMjY2MTQsNiArMjY2MTQsMTAgQEAKIAkJCQk+CiAJCQk8L0ZpbGU+CiAJCQk8RmlsZQor
CQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cRnJhY3Rpb25hbExheW91dFVuaXQuaCIKKwkJ
CQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQogCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1c
R2VvbG9jYXRpb25TZXJ2aWNlLmNwcCIKIAkJCQk+CiAJCQk8L0ZpbGU+CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lv
biAxMDcxNTQpCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTQ5ODAsNiArNDk4MCw3IEBACiAJCUI4REJEQjRDMTMw
QjBGOEEwMEY1Q0RCMSAvKiBTZXRTZWxlY3Rpb25Db21tYW5kLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCOERCREI0ODEzMEIwRjhBMDBGNUNEQjEgLyog
U2V0U2VsZWN0aW9uQ29tbWFuZC5oICovOyB9OwogCQlCOERCREI0RDEzMEIwRjhBMDBGNUNEQjEg
LyogU3BlbGxpbmdDb3JyZWN0aW9uQ29tbWFuZC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCOERCREI0OTEzMEIwRjhBMDBGNUNEQjEgLyogU3BlbGxp
bmdDb3JyZWN0aW9uQ29tbWFuZC5jcHAgKi87IH07CiAJCUI4REJEQjRFMTMwQjBGOEEwMEY1Q0RC
MSAvKiBTcGVsbGluZ0NvcnJlY3Rpb25Db21tYW5kLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCOERCREI0QTEzMEIwRjhBMDBGNUNEQjEgLyogU3BlbGxp
bmdDb3JyZWN0aW9uQ29tbWFuZC5oICovOyB9OworCQlCQUIyMkFENDE0QjdBMDJEMDBEOEFCQTYg
LyogRnJhY3Rpb25hbExheW91dFVuaXQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEJBQjc3MTUwMTQ0NENCQjQwMEVDNEM0QyAvKiBGcmFjdGlvbmFsTGF5
b3V0VW5pdC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07
CiAJCUJBQ0YyOTAxMTNCMkEwRDUwMDc4MUY5MCAvKiBMYXlvdXRUeXBlcy5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkFDRjI5MDAxM0IyQTBENTAwNzgx
RjkwIC8qIExheW91dFR5cGVzLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0
ZSwgKTsgfTsgfTsKIAkJQkMwMEYwMDQwRTBBMTg1NTAwRkQwNEUzIC8qIERPTUZpbGUuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDMDBFRkZFMEUwQTE4
NTUwMEZEMDRFMyAvKiBET01GaWxlLmggKi87IH07CiAJCUJDMDBGMDA1MEUwQTE4NTUwMEZEMDRF
MyAvKiBET01GaWxlLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gQkMwMEVGRkYwRTBBMTg1NTAwRkQwNEUzIC8qIERPTUZpbGUubW0gKi87IH07CkBAIC0x
MTg3OSw2ICsxMTg4MCw3IEBACiAJCUI4REJEQjQ4MTMwQjBGOEEwMEY1Q0RCMSAvKiBTZXRTZWxl
Y3Rpb25Db21tYW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNldFNlbGVj
dGlvbkNvbW1hbmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQjhEQkRCNDkxMzBC
MEY4QTAwRjVDREIxIC8qIFNwZWxsaW5nQ29ycmVjdGlvbkNvbW1hbmQuY3BwICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gU3BlbGxpbmdDb3JyZWN0aW9uQ29tbWFuZC5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUI4REJEQjRBMTMwQjBGOEEwMEY1Q0RCMSAv
KiBTcGVsbGluZ0NvcnJlY3Rpb25Db21tYW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IFNwZWxsaW5nQ29ycmVjdGlvbkNvbW1hbmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKKwkJQkFCNzcxNTAxNDQ0Q0JCNDAwRUM0QzRDIC8qIEZyYWN0aW9uYWxMYXlvdXRVbml0
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEZyYWN0aW9uYWxMYXlvdXRVbml0
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJBQ0YyOTAwMTNCMkEwRDUwMDc4MUY5
MCAvKiBMYXlvdXRUeXBlcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBMYXlv
dXRUeXBlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQzAwRUZGRTBFMEExODU1
MDBGRDA0RTMgLyogRE9NRmlsZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBE
T01GaWxlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDMDBFRkZGMEUwQTE4NTUw
MEZEMDRFMyAvKiBET01GaWxlLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBw
YXRoID0gRE9NRmlsZS5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE5Njk2LDYg
KzE5Njk4LDcgQEAKIAkJCQlDNTdGRURFMDEyMTJFRTlDMDA5N0JFNjUgLyogRmlsZVN5c3RlbS5j
cHAgKi8sCiAJCQkJNTE0QjNGNzIwQzcyMjA0NzAwMDUzMERGIC8qIEZpbGVTeXN0ZW0uaCAqLywK
IAkJCQlCQzA3M0JBOTBDMzk5QjFGMDAwRjU5NzkgLyogRmxvYXRDb252ZXJzaW9uLmggKi8sCisJ
CQkJQkFCNzcxNTAxNDQ0Q0JCNDAwRUM0QzRDIC8qIEZyYWN0aW9uYWxMYXlvdXRVbml0LmggKi8s
CiAJCQkJQTg3NDhCREYxMkNCRjJEQzAwMUZCQTQxIC8qIEhhc2hUb29scy5oICovLAogCQkJCUQ2
RkRBRUYyMTQ5QzA2MTkwMDM3QjFFMSAvKiBIaXN0b2dyYW1TdXBwb3J0LmNwcCAqLywKIAkJCQlE
NjMwRTJBQjE0OUJGMzQ0MDA1QjJGOTMgLyogSGlzdG9ncmFtU3VwcG9ydC5oICovLApAQCAtMjEw
OTAsNiArMjEwOTMsNyBAQAogCQkJCTFBMkFBQzU5MERDMkEzQjEwMEEyMEQ5QSAvKiBBcHBsaWNh
dGlvbkNhY2hlU3RvcmFnZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOUI0MTcwNjQxMjU2NjJCMzAw
NkIyOEZDIC8qIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJ
OTMzMDlERDkwOTlFNjQ5MjAwNTZFNTgxIC8qIEFwcGx5U3R5bGVDb21tYW5kLmggaW4gSGVhZGVy
cyAqLywKKwkJCQlCQUIyMkFENDE0QjdBMDJEMDBEOEFCQTYgLyogRnJhY3Rpb25hbExheW91dFVu
aXQuaCBpbiBIZWFkZXJzICovLAogCQkJCTUxMkREOEY2MEQ5MUU2QUYwMDBGODlFRSAvKiBBcmNo
aXZlLmggaW4gSGVhZGVycyAqLywKIAkJCQk1MTJERDhGRDBEOTFFNkFGMDAwRjg5RUUgLyogQXJj
aGl2ZUZhY3RvcnkuaCBpbiBIZWFkZXJzICovLAogCQkJCTUxMkREOEZDMEQ5MUU2QUYwMDBGODlF
RSAvKiBBcmNoaXZlUmVzb3VyY2UuaCBpbiBIZWFkZXJzICovLApJbmRleDogU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vRnJhY3Rpb25hbExheW91dFVuaXQuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9GcmFjdGlvbmFsTGF5b3V0VW5pdC5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vRnJhY3Rpb25hbExheW91dFVuaXQuaAkocmV2aXNpb24g
MCkKQEAgLTAsMCArMSw1MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIg
dGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBm
cm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdI
VCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IK
KyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBGcmFjdGlvbmFsTGF5b3V0VW5pdF9oCisjZGVm
aW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0X2gKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1
ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitzdGF0aWMgY29uc3QgaW50IGtGaXhlZFBvaW50RGVub21pbmF0b3IgPSA2MDsKK2NvbnN0IGlu
dCBpbnRNYXhGb3JMYXlvdXRVbml0ID0gSU5UX01BWCAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7
Citjb25zdCBpbnQgaW50TWluRm9yTGF5b3V0VW5pdCA9IC1pbnRNYXhGb3JMYXlvdXRVbml0Owor
CitjbGFzcyBGcmFjdGlvbmFsTGF5b3V0VW5pdCB7CitwdWJsaWM6CisgICAgRnJhY3Rpb25hbExh
eW91dFVuaXQoKSA6IG1fdmFsdWUoMCkgeyB9CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQoaW50
IHZhbHVlKSB7IEFTU0VSVChpc0luQm91bmRzKHZhbHVlKSk7IG1fdmFsdWUgPSB2YWx1ZSAqIGtG
aXhlZFBvaW50RGVub21pbmF0b3I7IH0KKyAgICBGcmFjdGlvbmFsTGF5b3V0VW5pdCh1bnNpZ25l
ZCBzaG9ydCB2YWx1ZSkgeyBBU1NFUlQoaXNJbkJvdW5kcyh2YWx1ZSkpOyBtX3ZhbHVlID0gdmFs
dWUgKiBrRml4ZWRQb2ludERlbm9taW5hdG9yOyB9CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQo
dW5zaWduZWQgaW50IHZhbHVlKSB7IEFTU0VSVChpc0luQm91bmRzKHZhbHVlKSk7IG1fdmFsdWUg
PSB2YWx1ZSAqIGtGaXhlZFBvaW50RGVub21pbmF0b3I7IH0KKyAgICBGcmFjdGlvbmFsTGF5b3V0
VW5pdChmbG9hdCB2YWx1ZSkgeyBBU1NFUlQoaXNJbkJvdW5kcyh2YWx1ZSkpOyBtX3ZhbHVlID0g
dmFsdWUgKiBrRml4ZWRQb2ludERlbm9taW5hdG9yOyB9CisgICAgRnJhY3Rpb25hbExheW91dFVu
aXQoZG91YmxlIHZhbHVlKSB7IEFTU0VSVChpc0luQm91bmRzKHZhbHVlKSk7IG1fdmFsdWUgPSB2
YWx1ZSAqIGtGaXhlZFBvaW50RGVub21pbmF0b3I7IH0KKyAgICBGcmFjdGlvbmFsTGF5b3V0VW5p
dChjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgdmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVlLnJh
d1ZhbHVlKCk7IH0KKworICAgIGlubGluZSBpbnQgdG9JbnQoKSBjb25zdCB7IHJldHVybiBtX3Zh
bHVlIC8ga0ZpeGVkUG9pbnREZW5vbWluYXRvcjsgfQorICAgIGlubGluZSB1bnNpZ25lZCB0b1Vu
c2lnbmVkKCkgY29uc3QgeyBBU1NFUlQobV92YWx1ZSA+PSAwKTsgcmV0dXJuIHRvSW50KCk7IH0K
KyAgICBpbmxpbmUgZmxvYXQgdG9GbG9hdCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGZs
b2F0PihtX3ZhbHVlKSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7IH0KKyAgICBpbmxpbmUgZG91
YmxlIHRvRG91YmxlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX3ZhbHVl
KSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7IH0KKworICAgIG9wZXJhdG9yIGludCgpIGNvbnN0
IHsgcmV0dXJuIHRvSW50KCk7IH0KKyAgICBvcGVyYXRvciB1bnNpZ25lZCgpIGNvbnN0IHsgcmV0
dXJuIHRvVW5zaWduZWQoKTsgfQorICAgIG9wZXJhdG9yIGZsb2F0KCkgY29uc3QgeyByZXR1cm4g
dG9GbG9hdCgpOyB9CisgICAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3QgeyByZXR1cm4gdG9Eb3Vi
bGUoKTsgfQorICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisK
KyAgICBpbmxpbmUgaW50IHJhd1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQorICAg
IGlubGluZSB2b2lkIHNldFJhd1ZhbHVlKGludCB2YWx1ZSkgeyBtX3ZhbHVlID0gdmFsdWU7IH0K
KyAgICBpbmxpbmUgdm9pZCBzZXRSYXdWYWx1ZShsb25nIGxvbmcgdmFsdWUpIHsgQVNTRVJUKDo6
YWJzKHZhbHVlKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpOyBtX3ZhbHVlID0g
dmFsdWU7IH0KKworICAgIGlubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBhYnMoKQorICAgIHsK
KyAgICAgICAgRnJhY3Rpb25hbExheW91dFVuaXQgcmV0dXJuVmFsdWU7CisgICAgICAgIHJldHVy
blZhbHVlLnNldFJhd1ZhbHVlKDo6YWJzKG1fdmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHJldHVy
blZhbHVlOworICAgIH0KKyNpZiBPUyhEQVJXSU4pCisgICAgaW5saW5lIGludCB3dGZfY2VpbCgp
CisjZWxzZQorICAgIGlubGluZSBpbnQgY2VpbCgpCisjZW5kaWYKKyAgICB7CisgICAgICAgIGlm
IChtX3ZhbHVlID4gMCkKKyAgICAgICAgICAgIHJldHVybiAobV92YWx1ZSArIGtGaXhlZFBvaW50
RGVub21pbmF0b3IgLSAxKSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7CisgICAgICAgIHJldHVy
biAobV92YWx1ZSAtIGtGaXhlZFBvaW50RGVub21pbmF0b3IgKyAxKSAvIGtGaXhlZFBvaW50RGVu
b21pbmF0b3I7CisgICAgfQorICAgIGlubGluZSBpbnQgcm91bmQoKQorICAgIHsKKyAgICAgICAg
aWYgKG1fdmFsdWUgPiAwKQorICAgICAgICAgICAgcmV0dXJuIChtX3ZhbHVlICsgKGtGaXhlZFBv
aW50RGVub21pbmF0b3IgLyAyKSkgLyBrRml4ZWRQb2ludERlbm9taW5hdG9yOworICAgICAgICBy
ZXR1cm4gKG1fdmFsdWUgLSAoa0ZpeGVkUG9pbnREZW5vbWluYXRvciAvIDIpKSAvIGtGaXhlZFBv
aW50RGVub21pbmF0b3I7CisgICAgfQorCisgICAgaW5saW5lIGludCBmbG9vcigpCisgICAgewor
ICAgICAgICByZXR1cm4gdG9JbnQoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZmxvYXQgZXBzaWxv
bigpIHsgcmV0dXJuIDEgLyBrRml4ZWRQb2ludERlbm9taW5hdG9yOyB9CisgICAgc3RhdGljIGNv
bnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0IG1heCgpCisgICAgeworICAgICAgICBGcmFjdGlvbmFs
TGF5b3V0VW5pdCBtOworICAgICAgICBtLm1fdmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGlu
dD46Om1heCgpOworICAgICAgICByZXR1cm4gbTsKKyAgICB9CisgICAgc3RhdGljIGNvbnN0IEZy
YWN0aW9uYWxMYXlvdXRVbml0IG1pbigpCisgICAgeworICAgICAgICBGcmFjdGlvbmFsTGF5b3V0
VW5pdCBtOworICAgICAgICBtLm1fdmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1p
bigpOworICAgICAgICByZXR1cm4gbTsKKyAgICB9CisgICAgCitwcml2YXRlOgorICAgIGlubGlu
ZSBib29sIGlzSW5Cb3VuZHMoaW50IHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDo6YWJz
KHZhbHVlKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLyBrRml4ZWRQb2ludERl
bm9taW5hdG9yOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBpc0luQm91bmRzKHVuc2lnbmVkIHZh
bHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlIDwgc3RkOjpudW1lcmljX2xpbWl0czxp
bnQ+OjptYXgoKSAvIGtGaXhlZFBvaW50RGVub21pbmF0b3I7CisgICAgfQorICAgIGlubGluZSBi
b29sIGlzSW5Cb3VuZHMoZG91YmxlIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDo6YWJz
KHZhbHVlKSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLyBrRml4ZWRQb2ludERl
bm9taW5hdG9yOworICAgIH0KKworICAgIGludCBtX3ZhbHVlOworfTsKKworaW5saW5lIGJvb2wg
b3BlcmF0b3I8PShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgY29uc3QgRnJhY3Rpb25h
bExheW91dFVuaXQmIGIpCit7CisgICAgcmV0dXJuIGEucmF3VmFsdWUoKSA8PSBiLnJhd1ZhbHVl
KCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRnJhY3Rpb25hbExheW91dFVu
aXQmIGEsIGZsb2F0IGIpCit7CisgICAgcmV0dXJuIGEudG9GbG9hdCgpIDw9IGI7Cit9CisKK2lu
bGluZSBib29sIG9wZXJhdG9yPD0oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGludCBi
KQoreworICAgIHJldHVybiBhIDw9IEZyYWN0aW9uYWxMYXlvdXRVbml0KGIpOworfQorCitpbmxp
bmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGZsb2F0IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRV
bml0JiBiKQoreworICAgIHJldHVybiBhIDw9IGIudG9GbG9hdCgpOworfQorCitpbmxpbmUgYm9v
bCBvcGVyYXRvcjw9KGNvbnN0IGludCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikK
K3sKKyAgICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQoYSkgPD0gYjsKK30KKworaW5saW5l
IGJvb2wgb3BlcmF0b3I+PShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgY29uc3QgRnJh
Y3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgcmV0dXJuIGEucmF3VmFsdWUoKSA+PSBiLnJh
d1ZhbHVlKCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgRnJhY3Rpb25hbExh
eW91dFVuaXQmIGEsIGludCBiKQoreworICAgIHJldHVybiBhID49IEZyYWN0aW9uYWxMYXlvdXRV
bml0KGIpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGZsb2F0IGEsIGNvbnN0
IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBhID49IGIudG9GbG9hdCgp
OworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0
JiBhLCBmbG9hdCBiKQoreworICAgIHJldHVybiBhLnRvRmxvYXQoKSA+PSBiOworfQorCitpbmxp
bmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGludCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5p
dCYgYikKK3sKKyAgICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQoYSkgPj0gYjsKK30KKwor
aW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBjb25z
dCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4gYS5yYXdWYWx1ZSgpIDwg
Yi5yYXdWYWx1ZSgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRnJhY3Rpb25h
bExheW91dFVuaXQmIGEsIGludCBiKQoreworICAgIHJldHVybiBhIDwgRnJhY3Rpb25hbExheW91
dFVuaXQoYik7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBGcmFjdGlvbmFsTGF5
b3V0VW5pdCYgYSwgZmxvYXQgYikKK3sKKyAgICByZXR1cm4gYS50b0Zsb2F0KCkgPCBiOworfQor
CitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgaW50IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlv
dXRVbml0JiBiKQoreworICAgIHJldHVybiBGcmFjdGlvbmFsTGF5b3V0VW5pdChhKSA8IGI7Cit9
CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBmbG9hdCBhLCBjb25zdCBGcmFjdGlvbmFs
TGF5b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4gYSA8IGIudG9GbG9hdCgpOworfQorCitpbmxp
bmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGNvbnN0IEZy
YWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBhLnJhd1ZhbHVlKCkgPiBiLnJh
d1ZhbHVlKCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBGcmFjdGlvbmFsTGF5
b3V0VW5pdCYgYSwgZG91YmxlIGIpCit7CisgICAgcmV0dXJuIGEudG9Eb3VibGUoKSA+IGI7Cit9
CisKK2lubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwg
ZmxvYXQgYikKK3sKKyAgICByZXR1cm4gYS50b0Zsb2F0KCkgPiBiOworfQorCitpbmxpbmUgYm9v
bCBvcGVyYXRvcj4oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGludCBiKQoreworICAg
IHJldHVybiBhID4gRnJhY3Rpb25hbExheW91dFVuaXQoYik7Cit9CisKK2lubGluZSBib29sIG9w
ZXJhdG9yPihjb25zdCBpbnQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7Cisg
ICAgcmV0dXJuIEZyYWN0aW9uYWxMYXlvdXRVbml0KGEpID4gYjsKK30KKworaW5saW5lIGJvb2wg
b3BlcmF0b3I+KGNvbnN0IGZsb2F0IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQor
eworICAgIHJldHVybiBhID4gYi50b0Zsb2F0KCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9y
Pihjb25zdCBkb3VibGUgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAg
cmV0dXJuIGEgPiBiLnRvRG91YmxlKCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29u
c3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBi
KQoreworICAgIHJldHVybiBhLnJhd1ZhbHVlKCkgIT0gYi5yYXdWYWx1ZSgpOworfQorCitpbmxp
bmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBmbG9hdCBi
KQoreworICAgIHJldHVybiBhICE9IEZyYWN0aW9uYWxMYXlvdXRVbml0KGIpOworfQorCitpbmxp
bmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGludCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5p
dCYgYikKK3sKKyAgICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQoYSkgIT0gYjsKK30KKwor
aW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgaW50
IGIpCit7CisgICAgcmV0dXJuIGEgIT0gRnJhY3Rpb25hbExheW91dFVuaXQoYik7Cit9CisKK2lu
bGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGNvbnN0
IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBhLnJhd1ZhbHVlKCkgPT0g
Yi5yYXdWYWx1ZSgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZyYWN0aW9u
YWxMYXlvdXRVbml0JiBhLCBpbnQgYikKK3sKKyAgICByZXR1cm4gYSA9PSBGcmFjdGlvbkxheW91
dFVuaXQoYik7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgaW50IGEsIGNvbnN0
IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBGcmFjdGlvbkxheW91dFVu
aXQoYSkgPT0gYjsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGcmFjdGlvbmFs
TGF5b3V0VW5pdCYgYSwgZmxvYXQgYikKK3sKKyAgICByZXR1cm4gYS50b0Zsb2F0KCkgPT0gYjsK
K30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmbG9hdCBhLCBjb25zdCBGcmFjdGlv
bmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICByZXR1cm4gYSA9PSBiLnRvRmxvYXQoKTsKK30KKwor
Ly8gRm9yIG11bHRpcGxpY2F0aW9uIHRoYXQncyBwcm9uZSB0byBvdmVyZmxvdywgdGhpcyBib3Vu
ZHMgaXQgdG8gRnJhY3Rpb25hbExheW91dFVuaXQ6Om1heCgpIGFuZCA6Om1pbigpCitpbmxpbmUg
RnJhY3Rpb25hbExheW91dFVuaXQgYm91bmRlZE11bHRpcGx5KGNvbnN0IEZyYWN0aW9uYWxMYXlv
dXRVbml0JiBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICBGcmFjdGlv
bmFsTGF5b3V0VW5pdCByZXR1cm5WYWw7CisgICAgbG9uZyBsb25nIHJhd1ZhbCA9IHN0YXRpY19j
YXN0PGxvbmcgbG9uZz4oYS5yYXdWYWx1ZSgpKSAqIGIucmF3VmFsdWUoKSAvIGtGaXhlZFBvaW50
RGVub21pbmF0b3I7CisgICAgaWYgKHJhd1ZhbCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6
bWF4KCkpCisgICAgICAgIHJldHVybiBGcmFjdGlvbmFsTGF5b3V0VW5pdDo6bWF4KCk7CisgICAg
aWYgKHJhd1ZhbCA8IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkpCisgICAgICAgIHJl
dHVybiBGcmFjdGlvbmFsTGF5b3V0VW5pdDo6bWluKCk7CisgICAgcmV0dXJuVmFsLnNldFJhd1Zh
bHVlKHJhd1ZhbCk7CisgICAgcmV0dXJuIHJldHVyblZhbDsKK30KKworaW5saW5lIEZyYWN0aW9u
YWxMYXlvdXRVbml0IG9wZXJhdG9yKihjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgY29u
c3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQg
cmV0dXJuVmFsOworICAgIGxvbmcgbG9uZyByYXdWYWwgPSBzdGF0aWNfY2FzdDxsb25nIGxvbmc+
KGEucmF3VmFsdWUoKSkgKiBiLnJhd1ZhbHVlKCkgLyBrRml4ZWRQb2ludERlbm9taW5hdG9yOwor
ICAgIHJldHVyblZhbC5zZXRSYXdWYWx1ZSgoYS5yYXdWYWx1ZSgpIC8ga0ZpeGVkUG9pbnREZW5v
bWluYXRvcikgKiBiLnJhd1ZhbHVlKCkpOworICAgIHJldHVybiByZXR1cm5WYWw7Cit9ICAgIAor
CitpbmxpbmUgZG91YmxlIG9wZXJhdG9yKihjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwg
ZG91YmxlIGIpCit7CisgICAgcmV0dXJuIGEudG9Eb3VibGUoKSAqIGI7Cit9CisKK2lubGluZSBm
bG9hdCBvcGVyYXRvciooY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGZsb2F0IGIpCit7
CisgICAgcmV0dXJuIGEudG9GbG9hdCgpICogYjsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlv
dXRVbml0IG9wZXJhdG9yKihjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgaW50IGIpCit7
CisgICAgcmV0dXJuIGEgKiBGcmFjdGlvbmFsTGF5b3V0VW5pdChiKTsKK30KKworaW5saW5lIEZy
YWN0aW9uYWxMYXlvdXRVbml0IG9wZXJhdG9yKihjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYg
YSwgdW5zaWduZWQgYikKK3sKKyAgICByZXR1cm4gYSAqIEZyYWN0aW9uYWxMYXlvdXRVbml0KGIp
OworfQorCitpbmxpbmUgRnJhY3Rpb25hbExheW91dFVuaXQgb3BlcmF0b3IqKHVuc2lnbmVkIGEs
IGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBGcmFjdGlvbmFs
TGF5b3V0VW5pdChhKSAqIGI7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVy
YXRvciooY29uc3QgaW50IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAg
IHJldHVybiBGcmFjdGlvbmFsTGF5b3V0VW5pdChhKSAqIGI7Cit9CisKK2lubGluZSBmbG9hdCBv
cGVyYXRvciooY29uc3QgZmxvYXQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7
CisgICAgcmV0dXJuIGEgKiBiLnRvRmxvYXQoKTsKK30KKworaW5saW5lIGRvdWJsZSBvcGVyYXRv
ciooY29uc3QgZG91YmxlIGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAg
IHJldHVybiBhICogYi50b0RvdWJsZSgpOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExheW91dFVu
aXQgb3BlcmF0b3IvKGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBjb25zdCBGcmFjdGlv
bmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICBGcmFjdGlvbmFsTGF5b3V0VW5pdCByZXR1cm5WYWw7
CisgICAgbG9uZyBsb25nIHJhd1ZhbCA9IHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oa0ZpeGVkUG9p
bnREZW5vbWluYXRvcikgKiBhLnJhd1ZhbHVlKCkgLyBiLnJhd1ZhbHVlKCk7CisgICAgcmV0dXJu
VmFsLnNldFJhd1ZhbHVlKHJhd1ZhbCk7CisgICAgcmV0dXJuIHJldHVyblZhbDsKK30gICAgCisK
K2lubGluZSBmbG9hdCBvcGVyYXRvci8oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGZs
b2F0IGIpCit7CisgICAgcmV0dXJuIGEudG9GbG9hdCgpIC8gYjsKK30KKworaW5saW5lIGRvdWJs
ZSBvcGVyYXRvci8oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGRvdWJsZSBiKQorewor
ICAgIHJldHVybiBhLnRvRG91YmxlKCkgLyBiOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExheW91
dFVuaXQgb3BlcmF0b3IvKGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBpbnQgYikKK3sK
KyAgICByZXR1cm4gYSAvIEZyYWN0aW9uYWxMYXlvdXRVbml0KGIpOworfQorCitpbmxpbmUgRnJh
Y3Rpb25hbExheW91dFVuaXQgb3BlcmF0b3IvKGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBh
LCB1bnNpZ25lZCBpbnQgYikKK3sKKyAgICByZXR1cm4gYSAvIEZyYWN0aW9uYWxMYXlvdXRVbml0
KGIpOworfQorCitpbmxpbmUgZmxvYXQgb3BlcmF0b3IvKGNvbnN0IGZsb2F0IGEsIGNvbnN0IEZy
YWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBhIC8gYi50b0Zsb2F0KCk7Cit9
CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVyYXRvci8oY29uc3QgaW50IGEsIGNv
bnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIHJldHVybiBGcmFjdGlvbmFsTGF5
b3V0VW5pdChhKSAvIGI7Cit9CisKK2lubGluZSBGcmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVyYXRv
ci8odW5zaWduZWQgaW50IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAg
IHJldHVybiBGcmFjdGlvbmFsTGF5b3V0VW5pdChhKSAvIGI7Cit9CisKK2lubGluZSBGcmFjdGlv
bmFsTGF5b3V0VW5pdCBvcGVyYXRvcisoY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGNv
bnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIEZyYWN0aW9uYWxMYXlvdXRVbml0
IHJldHVyblZhbDsKKyAgICByZXR1cm5WYWwuc2V0UmF3VmFsdWUoYS5yYXdWYWx1ZSgpICsgYi5y
YXdWYWx1ZSgpKTsKKyAgICByZXR1cm4gcmV0dXJuVmFsOworfQorCitpbmxpbmUgRnJhY3Rpb25h
bExheW91dFVuaXQgb3BlcmF0b3IrKGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBpbnQg
YikKK3sKKyAgICByZXR1cm4gYSArIEZyYWN0aW9uYWxMYXlvdXRVbml0KGIpOworfQorCitpbmxp
bmUgZmxvYXQgb3BlcmF0b3IrKGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBmbG9hdCBi
KQoreworICAgIHJldHVybiBhLnRvRmxvYXQoKSArIGI7Cit9CisKK2lubGluZSBkb3VibGUgb3Bl
cmF0b3IrKGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBkb3VibGUgYikKK3sKKyAgICBy
ZXR1cm4gYS50b0RvdWJsZSgpICsgYjsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0
IG9wZXJhdG9yKyhjb25zdCBpbnQgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7
CisgICAgcmV0dXJuIEZyYWN0aW9uYWxMYXlvdXRVbml0KGEpICsgYjsKK30KKworaW5saW5lIGZs
b2F0IG9wZXJhdG9yKyhjb25zdCBmbG9hdCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYg
YikKK3sKKyAgICByZXR1cm4gYSArIGIudG9GbG9hdCgpOworfQorCitpbmxpbmUgRnJhY3Rpb25h
bExheW91dFVuaXQgb3BlcmF0b3ItKGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBjb25z
dCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAgICBGcmFjdGlvbmFsTGF5b3V0VW5pdCBy
ZXR1cm5WYWw7CisgICAgcmV0dXJuVmFsLnNldFJhd1ZhbHVlKGEucmF3VmFsdWUoKSAtIGIucmF3
VmFsdWUoKSk7CisgICAgcmV0dXJuIHJldHVyblZhbDsKK30KKworaW5saW5lIEZyYWN0aW9uYWxM
YXlvdXRVbml0IG9wZXJhdG9yLShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgaW50IGIp
Cit7CisgICAgcmV0dXJuIGEgLSBGcmFjdGlvbmFsTGF5b3V0VW5pdChiKTsKK30KKworaW5saW5l
IGZsb2F0IG9wZXJhdG9yLShjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYSwgZmxvYXQgYikK
K3sKKyAgICByZXR1cm4gYS50b0Zsb2F0KCkgLSBiOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExh
eW91dFVuaXQgb3BlcmF0b3ItKGNvbnN0IGludCBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5p
dCYgYikKK3sKKyAgICByZXR1cm4gRnJhY3Rpb25hbExheW91dFVuaXQoYSkgLSBiOworfQorCitp
bmxpbmUgZmxvYXQgb3BlcmF0b3ItKGNvbnN0IGZsb2F0IGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlv
dXRVbml0JiBiKQoreworICAgIHJldHVybiBhIC0gYi50b0Zsb2F0KCk7Cit9CisKK2lubGluZSBG
cmFjdGlvbmFsTGF5b3V0VW5pdCBvcGVyYXRvci0oY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQm
IGEpCit7CisgICAgRnJhY3Rpb25hbExheW91dFVuaXQgcmV0dXJuVmFsOworICAgIHJldHVyblZh
bC5zZXRSYXdWYWx1ZSgtYS5yYXdWYWx1ZSgpKTsKKyAgICByZXR1cm4gcmV0dXJuVmFsOworfQor
CitpbmxpbmUgRnJhY3Rpb25hbExheW91dFVuaXQmIG9wZXJhdG9yKz0oRnJhY3Rpb25hbExheW91
dFVuaXQmIGEsIGNvbnN0IEZyYWN0aW9uYWxMYXlvdXRVbml0JiBiKQoreworICAgIGEgPSBhICsg
YjsKKyAgICByZXR1cm4gYTsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0JiBvcGVy
YXRvcis9KEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBpbnQgYikKK3sKKyAgICBhID0gYSArIGI7
CisgICAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBmbG9hdCYgb3BlcmF0b3IrPShmbG9hdCYgYSwg
Y29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgYSA9IGEgKyBiOworICAgIHJl
dHVybiBhOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExheW91dFVuaXQmIG9wZXJhdG9yLT0oRnJh
Y3Rpb25hbExheW91dFVuaXQmIGEsIGludCBiKQoreworICAgIGEgPSBhIC0gYjsKKyAgICByZXR1
cm4gYTsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0JiBvcGVyYXRvci09KEZyYWN0
aW9uYWxMYXlvdXRVbml0JiBhLCBjb25zdCBGcmFjdGlvbmFsTGF5b3V0VW5pdCYgYikKK3sKKyAg
ICBhID0gYSAtIGI7CisgICAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBmbG9hdCYgb3BlcmF0b3It
PShmbG9hdCYgYSwgY29uc3QgRnJhY3Rpb25hbExheW91dFVuaXQmIGIpCit7CisgICAgYSA9IGEg
LSBiOworICAgIHJldHVybiBhOworfQorCitpbmxpbmUgRnJhY3Rpb25hbExheW91dFVuaXQmIG9w
ZXJhdG9yKj0oRnJhY3Rpb25hbExheW91dFVuaXQmIGEsIGludCBiKQoreworICAgIGEgPSBhICog
YjsKKyAgICByZXR1cm4gYTsKK30KKworaW5saW5lIEZyYWN0aW9uYWxMYXlvdXRVbml0JiBvcGVy
YXRvcio9KEZyYWN0aW9uYWxMYXlvdXRVbml0JiBhLCBmbG9hdCBiKQoreworICAgIGEgPSBhICog
YjsKKyAgICByZXR1cm4gYTsKK30KKworaW5saW5lIGludCBzbmFwU2l6ZVRvUGl4ZWwoRnJhY3Rp
b25hbExheW91dFVuaXQgc2l6ZSwgRnJhY3Rpb25hbExheW91dFVuaXQgbG9jYXRpb24pIAorewor
ICAgIHJldHVybiAobG9jYXRpb24gKyBzaXplKS5yb3VuZCgpIC0gbG9jYXRpb24ucm91bmQoKTsK
K30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRnJhY3Rpb25hbExheW91
dFVuaXRfaAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>