<?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>146129</bug_id>
          
          <creation_ts>2015-06-18 16:30:56 -0700</creation_ts>
          <short_desc>CheckedArithmetic&apos;s operator bool() and operator==() is broken.</short_desc>
          <delta_ts>2015-06-19 13:28:14 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Template Framework</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Mark Lam">mark.lam</reporter>
          <assigned_to name="Mark Lam">mark.lam</assigned_to>
          <cc>andersca</cc>
    
    <cc>benjamin</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mmirman</cc>
    
    <cc>msaboff</cc>
    
    <cc>oliver</cc>
    
    <cc>ossy</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1103079</commentid>
    <comment_count>0</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-06-18 16:30:56 -0700</bug_when>
    <thetext>The existing operator UnspecifiedBoolType*() in CheckedArithmetic is erroneously allowing the Checked value to be implicitly casted into any integer and pointer types.  This is because it is doing a reinterpret_cast&lt;UnspecifiedBoolType*&gt;(1) whereas the idiom relies on the cast of a member e.g. reinterpret_cast&lt;UnspecifiedBoolType*&gt;(&amp;Checked::m_value).  As a result, ImageBufferData::putData() was getting an implicit cast of a Checked value to 1.

Also, 2 of CheckedArithmetic&apos;s operator==() will crash if used on an overflowed value, while a 3rd one does not.  The 3rd one should be consistent and also crash if used on an overflowed Checked value.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103089</commentid>
    <comment_count>1</comment_count>
      <attachid>255152</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-06-18 16:51:05 -0700</bug_when>
    <thetext>Created attachment 255152
the patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103093</commentid>
    <comment_count>2</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-06-18 16:55:33 -0700</bug_when>
    <thetext>FYI, this patch has already been tested locally with the layout tests, jsc tests, and api tests, all with a debug build.  No issues were found.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103094</commentid>
    <comment_count>3</comment_count>
      <attachid>255152</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-06-18 16:57:16 -0700</bug_when>
    <thetext>Comment on attachment 255152
the patch.

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

r=me

&gt; Source/WTF/ChangeLog:13
&gt; +        reinterpret_cast&lt;UnspecifiedBoolType*&gt;(&amp;Checked::m_value).  As a result,
&gt; +        ImageBufferData::putData() was getting an implicit cast of a Checked value to 1.

I don&apos;t see any change to ImageBufferData::putData in this patch, and I don&apos;t see a regression test for ImageBuffer. What gives?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103098</commentid>
    <comment_count>4</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-06-18 17:09:53 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Comment on attachment 255152 [details]
&gt; the patch.
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=255152&amp;action=review
&gt; 
&gt; r=me
&gt; 
&gt; &gt; Source/WTF/ChangeLog:13
&gt; &gt; +        reinterpret_cast&lt;UnspecifiedBoolType*&gt;(&amp;Checked::m_value).  As a result,
&gt; &gt; +        ImageBufferData::putData() was getting an implicit cast of a Checked value to 1.
&gt; 
&gt; I don&apos;t see any change to ImageBufferData::putData in this patch, and I
&gt; don&apos;t see a regression test for ImageBuffer. What gives?

We talked offline, but I&apos;ll document the details here in case anyone else is interested.

The case of bad implicit casting in ImageBufferData::putData() is now prevented by the use of explicit operator bool().  ImageBufferData::putData() is doing an &quot;if (width &lt;= 0 || height &lt;= 0)&quot; statement where width and height are of type Checked&lt;int&gt;.  We don&apos;t need to change ImageBufferData::putData() because the new Checked::operator&lt;=() does the right thing for it automatically.

I didn&apos;t try to create a test for ImageBufferData::putData() because I don&apos;t know how to jump through all the hoops to get a width and height value into that code path in platform/graphics/cg/ImageBufferDataCG.cpp to exercise that specific comparison (that was previously doing the bad cast).  The issue was detected at compile time by the switch to Checked::operator bool().  With the new patch, the compile time error is resolved.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103100</commentid>
    <comment_count>5</comment_count>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2015-06-18 17:15:18 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #3)
&gt; &gt; Comment on attachment 255152 [details]
&gt; &gt; the patch.
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=255152&amp;action=review
&gt; &gt; 
&gt; &gt; r=me
&gt; &gt; 
&gt; &gt; &gt; Source/WTF/ChangeLog:13
&gt; &gt; &gt; +        reinterpret_cast&lt;UnspecifiedBoolType*&gt;(&amp;Checked::m_value).  As a result,
&gt; &gt; &gt; +        ImageBufferData::putData() was getting an implicit cast of a Checked value to 1.
&gt; &gt; 
&gt; &gt; I don&apos;t see any change to ImageBufferData::putData in this patch, and I
&gt; &gt; don&apos;t see a regression test for ImageBuffer. What gives?
&gt; 
&gt; We talked offline, but I&apos;ll document the details here in case anyone else is
&gt; interested.
&gt; 
&gt; The case of bad implicit casting in ImageBufferData::putData() is now
&gt; prevented by the use of explicit operator bool(). 
&gt; ImageBufferData::putData() is doing an &quot;if (width &lt;= 0 || height &lt;= 0)&quot;
&gt; statement where width and height are of type Checked&lt;int&gt;.  We don&apos;t need to
&gt; change ImageBufferData::putData() because the new Checked::operator&lt;=() does
&gt; the right thing for it automatically.

Sorry i don&apos;t understand this. The whole purpose of the horrifying member pointer insanity was prevent that kind of implicit conversion. Does that no longer work? If so we need to go through everything that uses that trick and fix them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103103</commentid>
    <comment_count>6</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-06-18 17:22:34 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; &gt; The case of bad implicit casting in ImageBufferData::putData() is now
&gt; &gt; prevented by the use of explicit operator bool(). 
&gt; &gt; ImageBufferData::putData() is doing an &quot;if (width &lt;= 0 || height &lt;= 0)&quot;
&gt; &gt; statement where width and height are of type Checked&lt;int&gt;.  We don&apos;t need to
&gt; &gt; change ImageBufferData::putData() because the new Checked::operator&lt;=() does
&gt; &gt; the right thing for it automatically.
&gt; 
&gt; Sorry i don&apos;t understand this. The whole purpose of the horrifying member
&gt; pointer insanity was prevent that kind of implicit conversion. Does that no
&gt; longer work? If so we need to go through everything that uses that trick and
&gt; fix them.

The old approach (before we have the ability to use an explicit operator bool()) was to rely on the fact that C++ does not implicitly casts addresses of class members to other int / pointer types.  Hence, the following pattern would work as expected at preventing implicit casts into int types:   

    typedef T* (RefPtr::*UnspecifiedBoolType);
    operator UnspecifiedBoolType() const { return m_ptr ? &amp;RefPtr::m_ptr : nullptr; }

However, CheckedArithmetic was not doing this instead:

    typedef void* (Checked::*UnspecifiedBoolType);
    operator UnspecifiedBoolType*() const
    {
        ...
        return (m_value) ? reinterpret_cast&lt;UnspecifiedBoolType*&gt;(1) : 0;
    }

Note that it was not using the address of a class member for the cast.  It was using the literal 1.  When I changed it to reinterpret_cast&lt;UnspecifiedBoolType*&gt;(&amp;Checked::m_value), we started seeing the compile time error.  Ditto for replacing this cast operator with explicit operator bool().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103105</commentid>
    <comment_count>7</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-06-18 17:25:13 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; However, CheckedArithmetic was not doing this instead:

typo: &quot;CheckedArithmetic was doing this instead:&quot;

&gt;         return (m_value) ? reinterpret_cast&lt;UnspecifiedBoolType*&gt;(1) : 0;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103107</commentid>
    <comment_count>8</comment_count>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2015-06-18 17:28:09 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; &gt; However, CheckedArithmetic was not doing this instead:
&gt; 
&gt; typo: &quot;CheckedArithmetic was doing this instead:&quot;
&gt; 
&gt; &gt;         return (m_value) ? reinterpret_cast&lt;UnspecifiedBoolType*&gt;(1) : 0;

We use the cast (1) in many places as well - C++ behaviour is spec&apos;d on the type of the return value, not the value that is returned from that function. A calcite is not allowed to make a semantic change on defined behaviour.

Hence we get back to the question: why was this not failing before? The boolean comparison should not have worked.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103117</commentid>
    <comment_count>9</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-06-18 18:16:30 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; We use the cast (1) in many places as well - C++ behaviour is spec&apos;d on the
&gt; type of the return value, not the value that is returned from that function.
&gt; A calcite is not allowed to make a semantic change on defined behaviour.

You are right.  We do use it in several places.  So those should be fixed.

Here&apos;s a small test to compare the behavior of the 2 idioms:

1. casting &amp;member:
   ===============
    template &lt;typename T&gt;
    class Clazz {
    public:
        Clazz(T value) : m_value(value) { }

        typedef T (Clazz::*UnspecifiedBoolType);
        operator UnspecifiedBoolType() const { return m_value ? &amp;Clazz::m_value : 0; }

        T m_value;
    };


    int main(int argc, const char** argv) {
        Clazz&lt;int&gt; c1(0x1000);
        Clazz&lt;int&gt; c2(0);

        // int val = c1;    // This causes a compile time error with both approaches.
        if (c1 &lt; 0)
            printf(&quot;Path taken: c1 &lt; 0\n&quot;);
        if (c1 &gt; 0)
            printf(&quot;Path taken: c1 &gt; 0\n&quot;);
        if (c1 &lt; (void*)10)
            printf(&quot;Path taken: c1 &lt; 10\n&quot;);
        if (c1 &gt; (void*)10)
            printf(&quot;Path taken: c1 &gt; 10\n&quot;);

        if (c1)
            printf(&quot;Path taken: c1\n&quot;);

        if (c2)
            printf(&quot;Path taken: c2\n&quot;);
    }

    Output:
    ======
    test.cpp:25:16: error: invalid operands to binary expression (&apos;Clazz&lt;int&gt;&apos; and &apos;int&apos;)
            if (c1 &lt; 0)
                ~~ ^ ~
    test.cpp:27:16: error: invalid operands to binary expression (&apos;Clazz&lt;int&gt;&apos; and &apos;int&apos;)
            if (c1 &gt; 0)
                ~~ ^ ~
    test.cpp:29:16: error: invalid operands to binary expression (&apos;Clazz&lt;int&gt;&apos; and &apos;void *&apos;)
            if (c1 &lt; (void*)10)
                ~~ ^ ~~~~~~~~~
    test.cpp:31:16: error: invalid operands to binary expression (&apos;Clazz&lt;int&gt;&apos; and &apos;void *&apos;)
            if (c1 &gt; (void*)10)
                ~~ ^ ~~~~~~~~~
    4 errors generated.


2. casting literal 1:
   =================
    template &lt;typename T&gt;
    class Clazz {
    public:
        Clazz(T value) : m_value(value) { }

        typedef void* (Clazz::*UnspecifiedBoolType);
        operator UnspecifiedBoolType*() const { return m_value ? reinterpret_cast&lt;UnspecifiedBoolType*&gt;(1) : 0; }

        T m_value;
    };


    int main(int argc, const char** argv) {
        Clazz&lt;int&gt; c1(0x1000);
        Clazz&lt;int&gt; c2(0);

        // int val = c1;    // This causes a compile time error with both approaches.
        if (c1 &lt; 0)
            printf(&quot;Path taken: c1 &lt; 0\n&quot;);
        if (c1 &gt; 0)
            printf(&quot;Path taken: c1 &gt; 0\n&quot;);
        if (c1 &lt; (void*)10)
            printf(&quot;Path taken: c1 &lt; 10\n&quot;);
        if (c1 &gt; (void*)10)
            printf(&quot;Path taken: c1 &gt; 10\n&quot;);

        if (c1)
            printf(&quot;Path taken: c1\n&quot;);

        if (c2)
            printf(&quot;Path taken: c2\n&quot;);
    }

    Output:
    ======
    $ ./test.o 
    Path taken: c1 &gt; 0
    Path taken: c1 &lt; 10
    Path taken: c1

Hence, the casting of literal 1 approach is not quite giving us the same thing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103118</commentid>
    <comment_count>10</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-06-18 18:18:30 -0700</bug_when>
    <thetext>Oliver, if you agree with the correctness of this patch, I would like to land it.  I will file a separate bug later to fix all the other places that casts literal 1.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103272</commentid>
    <comment_count>11</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-06-19 10:24:33 -0700</bug_when>
    <thetext>Here&apos;s another example that illustrates why the reinterpret_cast&lt;UnspecifiedBoolType*&gt;(1) approach is bad:

        Clazz&lt;int&gt; c1(0x1000);
        void* ptr = c1 + 1;

Basically, we can still do pointer math with it, whereas the &amp;Clazz::m_value approach yields a compile time error.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103277</commentid>
    <comment_count>12</comment_count>
      <attachid>255152</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-06-19 10:27:51 -0700</bug_when>
    <thetext>Comment on attachment 255152
the patch.

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

&gt;&gt;&gt;&gt; Source/WTF/ChangeLog:13
&gt;&gt;&gt;&gt; +        ImageBufferData::putData() was getting an implicit cast of a Checked value to 1.
&gt;&gt;&gt; 
&gt;&gt;&gt; I don&apos;t see any change to ImageBufferData::putData in this patch, and I don&apos;t see a regression test for ImageBuffer. What gives?
&gt;&gt; 
&gt;&gt; We talked offline, but I&apos;ll document the details here in case anyone else is interested.
&gt;&gt; 
&gt;&gt; The case of bad implicit casting in ImageBufferData::putData() is now prevented by the use of explicit operator bool().  ImageBufferData::putData() is doing an &quot;if (width &lt;= 0 || height &lt;= 0)&quot; statement where width and height are of type Checked&lt;int&gt;.  We don&apos;t need to change ImageBufferData::putData() because the new Checked::operator&lt;=() does the right thing for it automatically.
&gt;&gt; 
&gt;&gt; I didn&apos;t try to create a test for ImageBufferData::putData() because I don&apos;t know how to jump through all the hoops to get a width and height value into that code path in platform/graphics/cg/ImageBufferDataCG.cpp to exercise that specific comparison (that was previously doing the bad cast).  The issue was detected at compile time by the switch to Checked::operator bool().  With the new patch, the compile time error is resolved.
&gt; 
&gt; Sorry i don&apos;t understand this. The whole purpose of the horrifying member pointer insanity was prevent that kind of implicit conversion. Does that no longer work? If so we need to go through everything that uses that trick and fix them.

I&apos;ll update the comment to say &quot;implicit cast of a Checked value to (void*)1 and doing incorrect pointer comparisons on it.&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103280</commentid>
    <comment_count>13</comment_count>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2015-06-19 10:32:33 -0700</bug_when>
    <thetext>Ok, you should have a follow up bug to correct the existing casts of 1, and also you should probably file a bug on the compiler as that behaviour is incorrect.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103290</commentid>
    <comment_count>14</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-06-19 10:47:24 -0700</bug_when>
    <thetext>Thanks for the reviews.  Landed in r185755: &lt;http://trac.webkit.org/r185755&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103374</commentid>
    <comment_count>15</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2015-06-19 13:09:14 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; Thanks for the reviews.  Landed in r185755: &lt;http://trac.webkit.org/r185755&gt;.

It broke the EFL and GTK build. :-(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1103381</commentid>
    <comment_count>16</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-06-19 13:28:14 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; (In reply to comment #14)
&gt; &gt; Thanks for the reviews.  Landed in r185755: &lt;http://trac.webkit.org/r185755&gt;.
&gt; 
&gt; It broke the EFL and GTK build. :-(

Too bad the EWS has not been working for so long, and was not able to warn about this build failure.  The issue is now fixed in r185764: &lt;http://trac.webkit.org/r185764&gt;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>255152</attachid>
            <date>2015-06-18 16:51:05 -0700</date>
            <delta_ts>2015-06-19 10:37:16 -0700</delta_ts>
            <desc>the patch.</desc>
            <filename>bug-146129.patch</filename>
            <type>text/plain</type>
            <size>22083</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxODU3MjQpCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDQ4IEBACisyMDE1LTA2LTE4ICBNYXJrIExhbSAgPG1hcmsubGFt
QGFwcGxlLmNvbT4KKworICAgICAgICBDaGVja2VkQXJpdGhtZXRpYydzIG9wZXJhdG9yIGJvb2wo
KSBhbmQgb3BlcmF0b3I9PSgpIGlzIGJyb2tlbi4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE0NjEyOQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIFRoZSBleGlzdGluZyBvcGVyYXRvciBVbnNwZWNpZmllZEJv
b2xUeXBlKigpIGluIENoZWNrZWRBcml0aG1ldGljIGlzIGVycm9uZW91c2x5CisgICAgICAgIGFs
bG93aW5nIHRoZSBDaGVja2VkIHZhbHVlIHRvIGJlIGltcGxpY2l0bHkgY2FzdGVkIGludG8gYW55
IGludGVnZXIgYW5kIHBvaW50ZXIKKyAgICAgICAgdHlwZXMuICBUaGlzIGlzIGJlY2F1c2UgaXQg
aXMgZG9pbmcgYSByZWludGVycHJldF9jYXN0PFVuc3BlY2lmaWVkQm9vbFR5cGUqPigxKQorICAg
ICAgICB3aGVyZWFzIHRoZSBpZGlvbSByZWxpZXMgb24gdGhlIGNhc3Qgb2YgYSBtZW1iZXIgZS5n
LgorICAgICAgICByZWludGVycHJldF9jYXN0PFVuc3BlY2lmaWVkQm9vbFR5cGUqPigmQ2hlY2tl
ZDo6bV92YWx1ZSkuICBBcyBhIHJlc3VsdCwKKyAgICAgICAgSW1hZ2VCdWZmZXJEYXRhOjpwdXRE
YXRhKCkgd2FzIGdldHRpbmcgYW4gaW1wbGljaXQgY2FzdCBvZiBhIENoZWNrZWQgdmFsdWUgdG8g
MS4KKworICAgICAgICBBbHNvLCAyIG9mIENoZWNrZWRBcml0aG1ldGljJ3Mgb3BlcmF0b3I9PSgp
IHdpbGwgY3Jhc2ggaWYgdXNlZCBvbiBhbiBvdmVyZmxvd2VkCisgICAgICAgIHZhbHVlLCB3aGls
ZSBhIDNyZCBvbmUgZG9lcyBub3QuICBUaGUgM3JkIG9uZSBzaG91bGQgYmUgY29uc2lzdGVudCBh
bmQgYWxzbyBjcmFzaAorICAgICAgICBpZiB1c2VkIG9uIGFuIG92ZXJmbG93ZWQgQ2hlY2tlZCB2
YWx1ZS4KKworICAgICAgICBJbiB0aGlzIGZpeCwgd2UgcmVwbGFjZSBvcGVyYXRvciBVbnNwZWNp
ZmllZEJvb2xUeXBlKigpIHdpdGggYW4gZXhwbGljaXQgb3BlcmF0b3IKKyAgICAgICAgYm9vbCgp
LiAgV2UgYWxzbyBhZGQgdGhlIG1pc3Npbmcgb3BlcmF0b3JzIDwsIDw9LCA+LCBhbmQgPj0uICBU
aGF0IHRha2VzIGNhcmUgb2YKKyAgICAgICAgdGhlIGNvbXBhcmlzb25zIGluIEltYWdlQnVmZmVy
RGF0YTo6cHV0RGF0YSgpLgorCisgICAgICAgICogd3RmL0NoZWNrZWRBcml0aG1ldGljLmg6Cisg
ICAgICAgIChXVEY6OkNyYXNoT25PdmVyZmxvdzo6b3ZlcmZsb3dlZCk6CisgICAgICAgIChXVEY6
OkNyYXNoT25PdmVyZmxvdzo6Y3Jhc2gpOgorICAgICAgICAoV1RGOjpSZWNvcmRPdmVyZmxvdzo6
Y3Jhc2gpOgorCisgICAgICAgIChXVEY6OkNoZWNrZWQ6Om9wZXJhdG9yISk6CisgICAgICAgIChX
VEY6OkNoZWNrZWQ6Om9wZXJhdG9yIGJvb2wpOgorICAgICAgICAoV1RGOjpDaGVja2VkOjp1bnNh
ZmVHZXQpOgorICAgICAgICAtIERvbid0IGNhbGwgQ1JBU0goKSBkaXJlY3RseS4gIERlbGVnYXRl
IHRvIHRoZSBoYW5kbGVyLgorCisgICAgICAgIChXVEY6OkNoZWNrZWQ6Om9wZXJhdG9yPT0pOgor
ICAgICAgICAtIFNob3VsZCBjYWxsIHRoZSBoYW5kbGVyJ3MgY3Jhc2goKSB0byBiZSBjb25zaXN0
ZW50IHdpdGggdGhlIG90aGVyIDIgdmVyc2lvbnMgb2YKKyAgICAgICAgICBvcGVyYXRvcj09IHdo
aWNoIHdpbGwgY3Jhc2ggaW4gdW5zYWZlR2V0KCkgaWYgdXNlZCBvbiBhbiBvdmVyZmxvd2VkIENo
ZWNrZWQKKyAgICAgICAgICB2YWx1ZS4KKworICAgICAgICAoV1RGOjpDaGVja2VkOjpvcGVyYXRv
cjwpOgorICAgICAgICAoV1RGOjpDaGVja2VkOjpvcGVyYXRvcjw9KToKKyAgICAgICAgKFdURjo6
Q2hlY2tlZDo6b3BlcmF0b3I+KToKKyAgICAgICAgKFdURjo6Q2hlY2tlZDo6b3BlcmF0b3I+PSk6
CisgICAgICAgIC0gQWRkIG1pc3Npbmcgb3BlcmF0b3JzLgorCisgICAgICAgIChXVEY6OkNoZWNr
ZWQ6Om9wZXJhdG9yIFVuc3BlY2lmaWVkQm9vbFR5cGUqKTogRGVsZXRlZC4KKwogMjAxNS0wNi0x
NyAgQW5kcmVhcyBLbGluZyAgPGFrbGluZ0BhcHBsZS5jb20+CiAKICAgICAgICAgU2VnbWVudGVk
VmVjdG9yIHNob3VsZCB3YXN0ZSBsZXNzIG1lbW9yeS4KSW5kZXg6IFNvdXJjZS9XVEYvd3RmL0No
ZWNrZWRBcml0aG1ldGljLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvQ2hlY2tlZEFy
aXRobWV0aWMuaAkocmV2aXNpb24gMTg1NzExKQorKysgU291cmNlL1dURi93dGYvQ2hlY2tlZEFy
aXRobWV0aWMuaAkod29ya2luZyBjb3B5KQpAQCAtNzUsMTEgKzc1LDE2IEBAIGNsYXNzIENyYXNo
T25PdmVyZmxvdyB7CiBwdWJsaWM6CiAgICAgc3RhdGljIE5PX1JFVFVSTl9EVUVfVE9fQ1JBU0gg
dm9pZCBvdmVyZmxvd2VkKCkKICAgICB7Ci0gICAgICAgIENSQVNIKCk7CisgICAgICAgIGNyYXNo
KCk7CiAgICAgfQogCiAgICAgdm9pZCBjbGVhck92ZXJmbG93KCkgeyB9CiAKKyAgICBzdGF0aWMg
Tk9fUkVUVVJOX0RVRV9UT19DUkFTSCB2b2lkIGNyYXNoKCkKKyAgICB7CisgICAgICAgIENSQVNI
KCk7CisgICAgfQorCiBwdWJsaWM6CiAgICAgYm9vbCBoYXNPdmVyZmxvd2VkKCkgY29uc3QgeyBy
ZXR1cm4gZmFsc2U7IH0KIH07CkBAIC0xMDEsNiArMTA2LDExIEBAIHByb3RlY3RlZDoKICAgICAg
ICAgbV9vdmVyZmxvd2VkID0gZmFsc2U7CiAgICAgfQogCisgICAgc3RhdGljIE5PX1JFVFVSTl9E
VUVfVE9fQ1JBU0ggdm9pZCBjcmFzaCgpCisgICAgeworICAgICAgICBDUkFTSCgpOworICAgIH0K
KwogcHVibGljOgogICAgIGJvb2wgaGFzT3ZlcmZsb3dlZCgpIGNvbnN0IHsgcmV0dXJuIG1fb3Zl
cmZsb3dlZDsgfQogCkBAIC01MTcsMjMgKzUyNywyMiBAQCBwdWJsaWM6CiAgICAgYm9vbCBvcGVy
YXRvciEoKSBjb25zdAogICAgIHsKICAgICAgICAgaWYgKHRoaXMtPmhhc092ZXJmbG93ZWQoKSkK
LSAgICAgICAgICAgIENSQVNIKCk7CisgICAgICAgICAgICB0aGlzLT5jcmFzaCgpOwogICAgICAg
ICByZXR1cm4gIW1fdmFsdWU7CiAgICAgfQogCi0gICAgdHlwZWRlZiB2b2lkKiAoQ2hlY2tlZDo6
KlVuc3BlY2lmaWVkQm9vbFR5cGUpOwotICAgIG9wZXJhdG9yIFVuc3BlY2lmaWVkQm9vbFR5cGUq
KCkgY29uc3QKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QKICAgICB7CiAgICAg
ICAgIGlmICh0aGlzLT5oYXNPdmVyZmxvd2VkKCkpCi0gICAgICAgICAgICBDUkFTSCgpOwotICAg
ICAgICByZXR1cm4gKG1fdmFsdWUpID8gcmVpbnRlcnByZXRfY2FzdDxVbnNwZWNpZmllZEJvb2xU
eXBlKj4oMSkgOiAwOworICAgICAgICAgICAgdGhpcy0+Y3Jhc2goKTsKKyAgICAgICAgcmV0dXJu
IG1fdmFsdWU7CiAgICAgfQogCiAgICAgLy8gVmFsdWUgYWNjZXNzb3JzLiB1bnNhZmVHZXQoKSB3
aWxsIGNyYXNoIGlmIHRoZXJlJ3MgYmVlbiBhbiBvdmVyZmxvdy4KICAgICBUIHVuc2FmZUdldCgp
IGNvbnN0CiAgICAgewogICAgICAgICBpZiAodGhpcy0+aGFzT3ZlcmZsb3dlZCgpKQotICAgICAg
ICAgICAgQ1JBU0goKTsKKyAgICAgICAgICAgIHRoaXMtPmNyYXNoKCk7CiAgICAgICAgIHJldHVy
biBtX3ZhbHVlOwogICAgIH0KICAgICAKQEAgLTYxMiw3ICs2MjEsNyBAQCBwdWJsaWM6CiAgICAg
dGVtcGxhdGUgPHR5cGVuYW1lIFU+IGJvb2wgb3BlcmF0b3I9PShVIHJocykKICAgICB7CiAgICAg
ICAgIGlmICh0aGlzLT5oYXNPdmVyZmxvd2VkKCkpCi0gICAgICAgICAgICB0aGlzLT5vdmVyZmxv
d2VkKCk7CisgICAgICAgICAgICB0aGlzLT5jcmFzaCgpOwogICAgICAgICByZXR1cm4gc2FmZUVx
dWFscyhtX3ZhbHVlLCByaHMpOwogICAgIH0KICAgICAKQEAgLTYyNiw2ICs2MzUsNDcgQEAgcHVi
bGljOgogICAgICAgICByZXR1cm4gISgqdGhpcyA9PSByaHMpOwogICAgIH0KIAorICAgIC8vIE90
aGVyIGNvbXBhcmlzb25zCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFY+IGJvb2wgb3BlcmF0b3I8
KENoZWNrZWQ8VCwgVj4gcmhzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuc2FmZUdl
dCgpIDwgcmhzLnVuc2FmZUdldCgpOworICAgIH0KKworICAgIHRlbXBsYXRlIGJvb2wgb3BlcmF0
b3I8KFQgcmhzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuc2FmZUdldCgpIDwgcmhz
OworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBWPiBib29sIG9wZXJhdG9yPD0oQ2hl
Y2tlZDxULCBWPiByaHMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdW5zYWZlR2V0KCkg
PD0gcmhzLnVuc2FmZUdldCgpOworICAgIH0KKworICAgIHRlbXBsYXRlIGJvb2wgb3BlcmF0b3I8
PShUIHJocykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB1bnNhZmVHZXQoKSA8PSByaHM7
CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFY+IGJvb2wgb3BlcmF0b3I+KENoZWNr
ZWQ8VCwgVj4gcmhzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuc2FmZUdldCgpID4g
cmhzLnVuc2FmZUdldCgpOworICAgIH0KKworICAgIHRlbXBsYXRlIGJvb2wgb3BlcmF0b3I+KFQg
cmhzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuc2FmZUdldCgpID4gcmhzOworICAg
IH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBWPiBib29sIG9wZXJhdG9yPj0oQ2hlY2tlZDxU
LCBWPiByaHMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdW5zYWZlR2V0KCkgPj0gcmhz
LnVuc2FmZUdldCgpOworICAgIH0KKworICAgIHRlbXBsYXRlIGJvb2wgb3BlcmF0b3I+PShUIHJo
cykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB1bnNhZmVHZXQoKSA+PSByaHM7CisgICAg
fQorCiBwcml2YXRlOgogICAgIC8vIERpc2FsbG93IGltcGxpY2l0IGNvbnZlcnNpb24gb2YgZmxv
YXRpbmcgcG9pbnQgdG8gaW50ZWdlciB0eXBlcwogICAgIENoZWNrZWQoZmxvYXQpOwpJbmRleDog
VG9vbHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0NoYW5nZUxvZwkocmV2aXNpb24g
MTg1NzI0KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzAg
QEAKKzIwMTUtMDYtMTggIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgorCisgICAgICAg
IENoZWNrZWRBcml0aG1ldGljJ3Mgb3BlcmF0b3IgYm9vbCgpIGFuZCBvcGVyYXRvcj09KCkgaXMg
YnJva2VuLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTQ2MTI5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
QWRkZWQgQVBJIHRlc3RzIGZvciBvcGVyYXRvciA9PSwgIT0sIDwsIDw9LCA+LCBhbmQgPj0sIGFu
ZCB0ZXN0ZWQgZm9yIGJvdGggbm9ybWFsCisgICAgICAgIGFuZCBvdmVyZmxvdyBzY2VuYXJpb3Mg
aW4gdXNhZ2Ugb2YgdGhlIENoZWNrZWQgYXJpdGhtZXRpYyBjbGFzcy4KKworICAgICAgICAqIFRl
c3RXZWJLaXRBUEkvVGVzdHMvV1RGL0NoZWNrZWRBcml0aG1ldGljT3BlcmF0aW9ucy5jcHA6Cisg
ICAgICAgIChUZXN0V2ViS2l0QVBJOjpPdmVyZmxvd0NyYXNoTG9nZ2VyOjpvdmVyZmxvd2VkKToK
KyAgICAgICAgKFRlc3RXZWJLaXRBUEk6Ok92ZXJmbG93Q3Jhc2hMb2dnZXI6OmNsZWFyT3ZlcmZs
b3cpOgorICAgICAgICAoVGVzdFdlYktpdEFQSTo6T3ZlcmZsb3dDcmFzaExvZ2dlcjo6Y3Jhc2gp
OgorICAgICAgICAoVGVzdFdlYktpdEFQSTo6T3ZlcmZsb3dDcmFzaExvZ2dlcjo6cmVzZXQpOgor
ICAgICAgICAoVGVzdFdlYktpdEFQSTo6T3ZlcmZsb3dDcmFzaExvZ2dlcjo6aGFzT3ZlcmZsb3dl
ZCk6CisgICAgICAgIChUZXN0V2ViS2l0QVBJOjpPdmVyZmxvd0NyYXNoTG9nZ2VyOjpvdmVyZmxv
d0NvdW50KToKKyAgICAgICAgKFRlc3RXZWJLaXRBUEk6Ok92ZXJmbG93Q3Jhc2hMb2dnZXI6OmRp
ZENyYXNoKToKKyAgICAgICAgLSBjcmFzaCBsb2dnZXIgZm9yIHZlcmlmeWluZyB0aGF0IGEgY3Jh
c2ggb2NjdXJzIHdoZW4gZXhwZWN0ZWQuIAorCisgICAgICAgIChUZXN0V2ViS2l0QVBJOjpyZXNl
dE92ZXJmbG93KToKKyAgICAgICAgLSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcmVzZXR0aW5n
IGEgdGVzdCB2YWx1ZSB0byBhbiBpbml0aWFsIG92ZXJmbG93ZWQgc3RhdGUKKyAgICAgICAgICBi
ZWZvcmUgYSBjcmFzaC4gIFdlIHdpbGwgdXNlIHRoaXMgdmFsdWUgaW4gdGhlIG92ZXJmbG93IHRl
c3RpbmcuCisKKyAgICAgICAgKFRlc3RXZWJLaXRBUEk6OkNoZWNrZWRBcml0aG1ldGljVGVzdGVy
OjpydW4pOgorICAgICAgICAtIEFkZGVkIG5ldyB0ZXN0cyBmb3IgYWxsIHRoZSBjb21wYXJpc29u
IG9wZXJhdG9ycy4KKwogMjAxNS0wNi0xOCAgSm9uIExlZSAgPGpvbmxlZUBhcHBsZS5jb20+CiAK
ICAgICAgICAgVW5yZXZpZXdlZC4gQWRkIE1hdHQgRGFpdGVyIGFzIGEgY29udHJpYnV0b3IuCklu
ZGV4OiBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dURi9DaGVja2VkQXJpdGhtZXRpY09wZXJh
dGlvbnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV1RGL0No
ZWNrZWRBcml0aG1ldGljT3BlcmF0aW9ucy5jcHAJKHJldmlzaW9uIDE4NTcxMSkKKysrIFRvb2xz
L1Rlc3RXZWJLaXRBUEkvVGVzdHMvV1RGL0NoZWNrZWRBcml0aG1ldGljT3BlcmF0aW9ucy5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTI1LDkgKzI1LDU0IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIK
ICNpbmNsdWRlIDx3dGYvQ2hlY2tlZEFyaXRobWV0aWMuaD4KKyNpbmNsdWRlIDx3dGYvRGF0YUxv
Zy5oPiAvLyBtbGFtCiAKIG5hbWVzcGFjZSBUZXN0V2ViS2l0QVBJIHsKIAorY2xhc3MgT3ZlcmZs
b3dDcmFzaExvZ2dlciB7Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBvdmVyZmxvd2VkKCkKKyAgICB7
CisgICAgICAgIG1fb3ZlcmZsb3dDb3VudCsrOworICAgIH0KKyAgICAKKyAgICB2b2lkIGNsZWFy
T3ZlcmZsb3coKQorICAgIHsKKyAgICAgICAgbV9vdmVyZmxvd0NvdW50ID0gMDsKKyAgICB9Cisg
ICAgCisgICAgc3RhdGljIHZvaWQgY3Jhc2goKQorICAgIHsKKyAgICAgICAgc19kaWRDcmFzaCA9
IHRydWU7CisgICAgfQorICAgIAorcHVibGljOgorICAgIHZvaWQgcmVzZXQoKQorICAgIHsKKyAg
ICAgICAgbV9vdmVyZmxvd0NvdW50ID0gMDsKKyAgICAgICAgc19kaWRDcmFzaCA9IGZhbHNlOwor
ICAgIH0KKyAgICAKKyAgICBib29sIGhhc092ZXJmbG93ZWQoKSBjb25zdCB7IHJldHVybiBtX292
ZXJmbG93Q291bnQgPiAwOyB9CisgICAgaW50IG92ZXJmbG93Q291bnQoKSBjb25zdCB7IHJldHVy
biBtX292ZXJmbG93Q291bnQ7IH0KKworICAgIGJvb2wgZGlkQ3Jhc2goKSBjb25zdCB7IHJldHVy
biBzX2RpZENyYXNoOyB9CisgICAgCitwcml2YXRlOgorICAgIGludCBtX292ZXJmbG93Q291bnQg
eyAwIH07CisgICAgc3RhdGljIGJvb2wgc19kaWRDcmFzaDsKK307CisKK2Jvb2wgT3ZlcmZsb3dD
cmFzaExvZ2dlcjo6c19kaWRDcmFzaCA9IGZhbHNlOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgdHlw
ZT4KK3N0YXRpYyB2b2lkIHJlc2V0T3ZlcmZsb3coQ2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNo
TG9nZ2VyPiYgdmFsdWUpCit7CisgICAgdmFsdWUucmVzZXQoKTsKKyAgICB2YWx1ZSA9IDEwMDsK
KyAgICB2YWx1ZSAqPSBzdGQ6Om51bWVyaWNfbGltaXRzPHR5cGU+OjptYXgoKTsKK30KKwogI2Rl
ZmluZSBDaGVja2VkQXJpdGhtZXRpY1Rlc3QodHlwZSwgQ29lcmNlciwgTWl4ZWRTaWduZWRuZXNz
VGVzdGVyKSBcCiAgICAgVEVTVChXVEYsIENoZWNrZWRfIyN0eXBlKSBcCiAgICAgeyBcCkBAIC0x
MjEsNiArMTY2LDIwMSBAQCBwdWJsaWM6CiAgICAgICAgIHZhbHVlID0gMTA7CiAgICAgICAgIEVY
UEVDVF9FUSh0cnVlLCAodmFsdWUgKiBDaGVja2VkPHR5cGUsIFJlY29yZE92ZXJmbG93PihzdGQ6
Om51bWVyaWNfbGltaXRzPHR5cGU+OjptYXgoKSkpLmhhc092ZXJmbG93ZWQoKSk7CiAKKworICAg
ICAgICBDaGVja2VkPHR5cGUsIE92ZXJmbG93Q3Jhc2hMb2dnZXI+IG52YWx1ZTsgLy8gdG8gaG9s
ZCBhIG5vdCBvdmVyZmxvd2VkIHZhbHVlLgorICAgICAgICBDaGVja2VkPHR5cGUsIE92ZXJmbG93
Q3Jhc2hMb2dnZXI+IG92YWx1ZTsgLy8gdG8gaG9sZCBhbiBvdmVyZmxvd2VkIHZhbHVlLgorICAg
ICAgICBib29sIHVudXNlZDsKKworICAgICAgICBfdmFsdWUgPSA3NTsKKyAgICAgICAgdHlwZSBf
bGFyZ2VWYWx1ZSA9IDEwMDsKKyAgICAgICAgdHlwZSBfc21hbGxWYWx1ZSA9IDUwOworCisgICAg
ICAgIHZhbHVlID0gX3NtYWxsVmFsdWU7CisgICAgICAgIG52YWx1ZSA9IF92YWx1ZTsKKyAgICAg
ICAgb3ZhbHVlID0gX3ZhbHVlOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgT3ZlcmZsb3dD
cmFzaExvZ2dlciBpcyB3b3JraW5nIGFzIGV4cGVjdGVkLgorICAgICAgICBFWFBFQ1RfRVEoZmFs
c2UsIChvdmFsdWUuaGFzT3ZlcmZsb3dlZCgpKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAo
cmVzZXRPdmVyZmxvdyhvdmFsdWUpLCBvdmFsdWUuaGFzT3ZlcmZsb3dlZCgpKSk7CisgICAgICAg
IEVYUEVDVF9FUShmYWxzZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgb3ZhbHVlLmRpZENyYXNo
KCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsICh1bnVzZWQgPSAob3ZhbHVlID09IG92YWx1
ZSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgKHJlc2V0
T3ZlcmZsb3cob3ZhbHVlKSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKworICAgICAgICBFWFBFQ1Rf
RVEoZmFsc2UsIG52YWx1ZS5oYXNPdmVyZmxvd2VkKCkpOworICAgICAgICBFWFBFQ1RfRVEoZmFs
c2UsIG52YWx1ZS5kaWRDcmFzaCgpKTsKKworICAgICAgICAvLyBUZXN0IG9wZXJhdG9yPT0gdGhh
dCBzaG91bGQgbm90IG92ZXJmbG93IG5vciBjcmFzaC4KKyAgICAgICAgRVhQRUNUX0VRKHRydWUs
IChudmFsdWUgPT0gbnZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAobnZhbHVlID09
IENoZWNrZWQ8dHlwZSwgT3ZlcmZsb3dDcmFzaExvZ2dlcj4oX3ZhbHVlKSkpOworICAgICAgICBF
WFBFQ1RfRVEoZmFsc2UsIChudmFsdWUgPT0gdmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRy
dWUsIChudmFsdWUgPT0gX3ZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgKG52YWx1
ZSA9PSBDaGVja2VkPHR5cGUsIE92ZXJmbG93Q3Jhc2hMb2dnZXI+KHN0ZDo6bnVtZXJpY19saW1p
dHM8dHlwZT46Om1heCgpKSkpOworICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIChudmFsdWUgPT0g
c3RkOjpudW1lcmljX2xpbWl0czx0eXBlPjo6bWF4KCkpKTsKKworICAgICAgICBFWFBFQ1RfRVEo
ZmFsc2UsIG52YWx1ZS5oYXNPdmVyZmxvd2VkKCkpOworICAgICAgICBFWFBFQ1RfRVEoZmFsc2Us
IG52YWx1ZS5kaWRDcmFzaCgpKTsKKworICAgICAgICAvLyBUZXN0IG9wZXJhdG9yIT0gdGhhdCBz
aG91bGQgbm90IG92ZXJmbG93IG5vciBjcmFzaC4KKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCAo
bnZhbHVlICE9IG52YWx1ZSkpOworICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIChudmFsdWUgIT0g
Q2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihfdmFsdWUpKSk7CisgICAgICAgIEVY
UEVDVF9FUSh0cnVlLCAobnZhbHVlICE9IHZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUShmYWxz
ZSwgKG52YWx1ZSAhPSBfdmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChudmFsdWUg
IT0gQ2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihzdGQ6Om51bWVyaWNfbGltaXRz
PHR5cGU+OjptYXgoKSkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChudmFsdWUgIT0gc3Rk
OjpudW1lcmljX2xpbWl0czx0eXBlPjo6bWF4KCkpKTsKKworICAgICAgICBFWFBFQ1RfRVEoZmFs
c2UsIG52YWx1ZS5oYXNPdmVyZmxvd2VkKCkpOworICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIG52
YWx1ZS5kaWRDcmFzaCgpKTsKKworICAgICAgICAvLyBUZXN0IG9wZXJhdG9yPCB0aGF0IHNob3Vs
ZCBub3Qgb3ZlcmZsb3cgbm9yIGNyYXNoLgorICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIChudmFs
dWUgPCBudmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCAobnZhbHVlIDwgdmFsdWUp
KTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChudmFsdWUgPCBDaGVja2VkPHR5cGUsIE92ZXJm
bG93Q3Jhc2hMb2dnZXI+KF9sYXJnZVZhbHVlKSkpOworICAgICAgICBFWFBFQ1RfRVEoZmFsc2Us
IChudmFsdWUgPCBDaGVja2VkPHR5cGUsIE92ZXJmbG93Q3Jhc2hMb2dnZXI+KF92YWx1ZSkpKTsK
KyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCAobnZhbHVlIDwgQ2hlY2tlZDx0eXBlLCBPdmVyZmxv
d0NyYXNoTG9nZ2VyPihfc21hbGxWYWx1ZSkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChu
dmFsdWUgPCBfbGFyZ2VWYWx1ZSkpOworICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIChudmFsdWUg
PCBfdmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCAobnZhbHVlIDwgX3NtYWxsVmFs
dWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChudmFsdWUgPCBDaGVja2VkPHR5cGUsIE92
ZXJmbG93Q3Jhc2hMb2dnZXI+KHN0ZDo6bnVtZXJpY19saW1pdHM8dHlwZT46Om1heCgpKSkpOwor
ICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKG52YWx1ZSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8dHlw
ZT46Om1heCgpKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCBudmFsdWUuaGFzT3ZlcmZs
b3dlZCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCBudmFsdWUuZGlkQ3Jhc2goKSk7CisK
KyAgICAgICAgLy8gVGVzdCBvcGVyYXRvcjw9IHRoYXQgc2hvdWxkIG5vdCBvdmVyZmxvdyBub3Ig
Y3Jhc2guCisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAobnZhbHVlIDw9IG52YWx1ZSkpOworICAg
ICAgICBFWFBFQ1RfRVEoZmFsc2UsIChudmFsdWUgPD0gdmFsdWUpKTsKKyAgICAgICAgRVhQRUNU
X0VRKHRydWUsIChudmFsdWUgPD0gQ2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihf
bGFyZ2VWYWx1ZSkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChudmFsdWUgPD0gQ2hlY2tl
ZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihfdmFsdWUpKSk7CisgICAgICAgIEVYUEVDVF9F
UShmYWxzZSwgKG52YWx1ZSA8PSBDaGVja2VkPHR5cGUsIE92ZXJmbG93Q3Jhc2hMb2dnZXI+KF9z
bWFsbFZhbHVlKSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKG52YWx1ZSA8PSBfbGFyZ2VW
YWx1ZSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKG52YWx1ZSA8PSBfdmFsdWUpKTsKKyAg
ICAgICAgRVhQRUNUX0VRKGZhbHNlLCAobnZhbHVlIDw9IF9zbWFsbFZhbHVlKSk7CisgICAgICAg
IEVYUEVDVF9FUSh0cnVlLCAobnZhbHVlIDw9IENoZWNrZWQ8dHlwZSwgT3ZlcmZsb3dDcmFzaExv
Z2dlcj4oc3RkOjpudW1lcmljX2xpbWl0czx0eXBlPjo6bWF4KCkpKSk7CisgICAgICAgIEVYUEVD
VF9FUSh0cnVlLCAobnZhbHVlIDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8dHlwZT46Om1heCgpKSk7
CisKKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCBudmFsdWUuaGFzT3ZlcmZsb3dlZCgpKTsKKyAg
ICAgICAgRVhQRUNUX0VRKGZhbHNlLCBudmFsdWUuZGlkQ3Jhc2goKSk7CisKKyAgICAgICAgLy8g
VGVzdCBvcGVyYXRvcj4gdGhhdCBzaG91bGQgbm90IG92ZXJmbG93IG5vciBjcmFzaC4KKyAgICAg
ICAgRVhQRUNUX0VRKGZhbHNlLCAobnZhbHVlID4gbnZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9F
USh0cnVlLCAobnZhbHVlID4gdmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCAobnZh
bHVlID4gQ2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihfbGFyZ2VWYWx1ZSkpKTsK
KyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCAobnZhbHVlID4gQ2hlY2tlZDx0eXBlLCBPdmVyZmxv
d0NyYXNoTG9nZ2VyPihfdmFsdWUpKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAobnZhbHVl
ID4gQ2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihfc21hbGxWYWx1ZSkpKTsKKyAg
ICAgICAgRVhQRUNUX0VRKGZhbHNlLCAobnZhbHVlID4gX2xhcmdlVmFsdWUpKTsKKyAgICAgICAg
RVhQRUNUX0VRKGZhbHNlLCAobnZhbHVlID4gX3ZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUSh0
cnVlLCAobnZhbHVlID4gX3NtYWxsVmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCAo
bnZhbHVlID4gQ2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihzdGQ6Om51bWVyaWNf
bGltaXRzPHR5cGU+OjptYXgoKSkpKTsKKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCAobnZhbHVl
ID4gc3RkOjpudW1lcmljX2xpbWl0czx0eXBlPjo6bWF4KCkpKTsKKworICAgICAgICBFWFBFQ1Rf
RVEoZmFsc2UsIG52YWx1ZS5oYXNPdmVyZmxvd2VkKCkpOworICAgICAgICBFWFBFQ1RfRVEoZmFs
c2UsIG52YWx1ZS5kaWRDcmFzaCgpKTsKKworICAgICAgICAvLyBUZXN0IG9wZXJhdG9yPj0gdGhh
dCBzaG91bGQgbm90IG92ZXJmbG93IG5vciBjcmFzaC4KKyAgICAgICAgRVhQRUNUX0VRKHRydWUs
IChudmFsdWUgPj0gbnZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAobnZhbHVlID49
IHZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUShmYWxzZSwgKG52YWx1ZSA+PSBDaGVja2VkPHR5
cGUsIE92ZXJmbG93Q3Jhc2hMb2dnZXI+KF9sYXJnZVZhbHVlKSkpOworICAgICAgICBFWFBFQ1Rf
RVEodHJ1ZSwgKG52YWx1ZSA+PSBDaGVja2VkPHR5cGUsIE92ZXJmbG93Q3Jhc2hMb2dnZXI+KF92
YWx1ZSkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChudmFsdWUgPj0gQ2hlY2tlZDx0eXBl
LCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihfc21hbGxWYWx1ZSkpKTsKKyAgICAgICAgRVhQRUNUX0VR
KGZhbHNlLCAobnZhbHVlID49IF9sYXJnZVZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVl
LCAobnZhbHVlID49IF92YWx1ZSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKG52YWx1ZSA+
PSBfc21hbGxWYWx1ZSkpOworICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIChudmFsdWUgPj0gQ2hl
Y2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihzdGQ6Om51bWVyaWNfbGltaXRzPHR5cGU+
OjptYXgoKSkpKTsKKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCAobnZhbHVlID49IHN0ZDo6bnVt
ZXJpY19saW1pdHM8dHlwZT46Om1heCgpKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCBu
dmFsdWUuaGFzT3ZlcmZsb3dlZCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCBudmFsdWUu
ZGlkQ3Jhc2goKSk7CisKKyAgICAgICAgLy8gVGVzdCBvcGVyYXRvcj09IHdpdGggYW4gb3ZlcmZs
b3dlZCB2YWx1ZS4KKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92YWx1
ZSksIHVudXNlZCA9IChvdmFsdWUgPT0gb3ZhbHVlKSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKyAg
ICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9IChv
dmFsdWUgPT0gQ2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihfdmFsdWUpKSwgb3Zh
bHVlLmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93
KG92YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgPT0gdmFsdWUpLCBvdmFsdWUuZGlkQ3Jhc2goKSkp
OworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2Vk
ID0gKG92YWx1ZSA9PSBfdmFsdWUpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworICAgICAgICBFWFBF
Q1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2VkID0gKG92YWx1ZSA9PSBf
dmFsdWUgKiBzdGQ6Om51bWVyaWNfbGltaXRzPHR5cGU+OjptYXgoKSksIG92YWx1ZS5kaWRDcmFz
aCgpKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAocmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1
bnVzZWQgPSAob3ZhbHVlID09IENoZWNrZWQ8dHlwZSwgT3ZlcmZsb3dDcmFzaExvZ2dlcj4oc3Rk
OjpudW1lcmljX2xpbWl0czx0eXBlPjo6bWF4KCkpKSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKyAg
ICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9IChv
dmFsdWUgPT0gc3RkOjpudW1lcmljX2xpbWl0czx0eXBlPjo6bWF4KCkpLCBvdmFsdWUuZGlkQ3Jh
c2goKSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwg
dW51c2VkID0gKG92YWx1ZSA9PSBudmFsdWUpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworICAgICAg
ICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2VkID0gKG52YWx1
ZSA9PSBvdmFsdWUpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworCisgICAgICAgIEVYUEVDVF9FUShm
YWxzZSwgbnZhbHVlLmhhc092ZXJmbG93ZWQoKSk7CisKKyAgICAgICAgLy8gVGVzdCBvcGVyYXRv
ciE9IHdpdGggYW4gb3ZlcmZsb3dlZCB2YWx1ZS4KKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChy
ZXNldE92ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgIT0gb3ZhbHVlKSwgb3ZhbHVl
LmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92
YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgIT0gQ2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9n
Z2VyPihfdmFsdWUpKSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRy
dWUsIChyZXNldE92ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgIT0gdmFsdWUpLCBv
dmFsdWUuZGlkQ3Jhc2goKSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZs
b3cob3ZhbHVlKSwgdW51c2VkID0gKG92YWx1ZSAhPSBfdmFsdWUpLCBvdmFsdWUuZGlkQ3Jhc2go
KSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51
c2VkID0gKG92YWx1ZSAhPSBfdmFsdWUgKiBzdGQ6Om51bWVyaWNfbGltaXRzPHR5cGU+OjptYXgo
KSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAocmVzZXRP
dmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVlICE9IENoZWNrZWQ8dHlwZSwgT3ZlcmZs
b3dDcmFzaExvZ2dlcj4oc3RkOjpudW1lcmljX2xpbWl0czx0eXBlPjo6bWF4KCkpKSwgb3ZhbHVl
LmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92
YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgIT0gc3RkOjpudW1lcmljX2xpbWl0czx0eXBlPjo6bWF4
KCkpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0
T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2VkID0gKG92YWx1ZSAhPSBudmFsdWUpLCBvdmFsdWUuZGlk
Q3Jhc2goKSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVl
KSwgdW51c2VkID0gKG52YWx1ZSAhPSBvdmFsdWUpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworCisg
ICAgICAgIEVYUEVDVF9FUShmYWxzZSwgbnZhbHVlLmhhc092ZXJmbG93ZWQoKSk7CisKKyAgICAg
ICAgLy8gVGVzdCBvcGVyYXRvcjwgd2l0aCBhbiBvdmVyZmxvd2VkIHZhbHVlLgorICAgICAgICBF
WFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2VkID0gKG92YWx1ZSA8
IG92YWx1ZSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAo
cmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVlIDwgdmFsdWUpLCBvdmFsdWUu
ZGlkQ3Jhc2goKSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3Zh
bHVlKSwgdW51c2VkID0gKG92YWx1ZSA8IENoZWNrZWQ8dHlwZSwgT3ZlcmZsb3dDcmFzaExvZ2dl
cj4oX2xhcmdlVmFsdWUpKSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VR
KHRydWUsIChyZXNldE92ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgPCBDaGVja2Vk
PHR5cGUsIE92ZXJmbG93Q3Jhc2hMb2dnZXI+KF92YWx1ZSkpLCBvdmFsdWUuZGlkQ3Jhc2goKSkp
OworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2Vk
ID0gKG92YWx1ZSA8IENoZWNrZWQ8dHlwZSwgT3ZlcmZsb3dDcmFzaExvZ2dlcj4oX3NtYWxsVmFs
dWUpKSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNl
dE92ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgPCBfbGFyZ2VWYWx1ZSksIG92YWx1
ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAocmVzZXRPdmVyZmxvdyhv
dmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVlIDwgX3ZhbHVlKSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsK
KyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9
IChvdmFsdWUgPCBfc21hbGxWYWx1ZSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVY
UEVDVF9FUSh0cnVlLCAocmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVlIDwg
Q2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihzdGQ6Om51bWVyaWNfbGltaXRzPHR5
cGU+OjptYXgoKSkpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1
ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2VkID0gKG92YWx1ZSA8IHN0ZDo6bnVtZXJp
Y19saW1pdHM8dHlwZT46Om1heCgpKSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQ
RUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgPCBu
dmFsdWUpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJl
c2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2VkID0gKG52YWx1ZSA8IG92YWx1ZSksIG92YWx1ZS5k
aWRDcmFzaCgpKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKGZhbHNlLCBudmFsdWUuaGFzT3ZlcmZs
b3dlZCgpKTsKKworICAgICAgICAvLyBUZXN0IG9wZXJhdG9yPD0gd2l0aCBhbiBvdmVyZmxvd2Vk
IHZhbHVlLgorICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwg
dW51c2VkID0gKG92YWx1ZSA8PSBvdmFsdWUpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworICAgICAg
ICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2VkID0gKG92YWx1
ZSA8PSB2YWx1ZSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVl
LCAocmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVlIDw9IENoZWNrZWQ8dHlw
ZSwgT3ZlcmZsb3dDcmFzaExvZ2dlcj4oX2xhcmdlVmFsdWUpKSwgb3ZhbHVlLmRpZENyYXNoKCkp
KTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92YWx1ZSksIHVudXNl
ZCA9IChvdmFsdWUgPD0gQ2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihfdmFsdWUp
KSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92
ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgPD0gQ2hlY2tlZDx0eXBlLCBPdmVyZmxv
d0NyYXNoTG9nZ2VyPihfc21hbGxWYWx1ZSkpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworICAgICAg
ICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2VkID0gKG92YWx1
ZSA8PSBfbGFyZ2VWYWx1ZSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVYUEVDVF9F
USh0cnVlLCAocmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVlIDw9IF92YWx1
ZSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAocmVzZXRP
dmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVlIDw9IF9zbWFsbFZhbHVlKSwgb3ZhbHVl
LmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92
YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgPD0gQ2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9n
Z2VyPihzdGQ6Om51bWVyaWNfbGltaXRzPHR5cGU+OjptYXgoKSkpLCBvdmFsdWUuZGlkQ3Jhc2go
KSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51
c2VkID0gKG92YWx1ZSA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPHR5cGU+OjptYXgoKSksIG92YWx1
ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAocmVzZXRPdmVyZmxvdyhv
dmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVlIDw9IG52YWx1ZSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7
CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAocmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQg
PSAobnZhbHVlIDw9IG92YWx1ZSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisKKyAgICAgICAgRVhQ
RUNUX0VRKGZhbHNlLCBudmFsdWUuaGFzT3ZlcmZsb3dlZCgpKTsKKworICAgICAgICAvLyBUZXN0
IG9wZXJhdG9yPiB3aXRoIGFuIG92ZXJmbG93ZWQgdmFsdWUuCisgICAgICAgIEVYUEVDVF9FUSh0
cnVlLCAocmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVlID4gb3ZhbHVlKSwg
b3ZhbHVlLmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJm
bG93KG92YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgPiB2YWx1ZSksIG92YWx1ZS5kaWRDcmFzaCgp
KSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAocmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1bnVz
ZWQgPSAob3ZhbHVlID4gQ2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihfbGFyZ2VW
YWx1ZSkpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJl
c2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2VkID0gKG92YWx1ZSA+IENoZWNrZWQ8dHlwZSwgT3Zl
cmZsb3dDcmFzaExvZ2dlcj4oX3ZhbHVlKSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAgICAg
IEVYUEVDVF9FUSh0cnVlLCAocmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVl
ID4gQ2hlY2tlZDx0eXBlLCBPdmVyZmxvd0NyYXNoTG9nZ2VyPihfc21hbGxWYWx1ZSkpLCBvdmFs
dWUuZGlkQ3Jhc2goKSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3co
b3ZhbHVlKSwgdW51c2VkID0gKG92YWx1ZSA+IF9sYXJnZVZhbHVlKSwgb3ZhbHVlLmRpZENyYXNo
KCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92YWx1ZSksIHVu
dXNlZCA9IChvdmFsdWUgPiBfdmFsdWUpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworICAgICAgICBF
WFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2VkID0gKG92YWx1ZSA+
IF9zbWFsbFZhbHVlKSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRy
dWUsIChyZXNldE92ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgPiBDaGVja2VkPHR5
cGUsIE92ZXJmbG93Q3Jhc2hMb2dnZXI+KHN0ZDo6bnVtZXJpY19saW1pdHM8dHlwZT46Om1heCgp
KSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAocmVzZXRP
dmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVlID4gc3RkOjpudW1lcmljX2xpbWl0czx0
eXBlPjo6bWF4KCkpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1
ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2VkID0gKG92YWx1ZSA+IG52YWx1ZSksIG92
YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVYUEVDVF9FUSh0cnVlLCAocmVzZXRPdmVyZmxv
dyhvdmFsdWUpLCB1bnVzZWQgPSAobnZhbHVlID4gb3ZhbHVlKSwgb3ZhbHVlLmRpZENyYXNoKCkp
KTsKKworICAgICAgICBFWFBFQ1RfRVEoZmFsc2UsIG52YWx1ZS5oYXNPdmVyZmxvd2VkKCkpOwor
CisgICAgICAgIC8vIFRlc3Qgb3BlcmF0b3I+PSB3aXRoIGFuIG92ZXJmbG93ZWQgdmFsdWUuCisg
ICAgICAgIEVYUEVDVF9FUSh0cnVlLCAocmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAo
b3ZhbHVlID49IG92YWx1ZSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVYUEVDVF9F
USh0cnVlLCAocmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVlID49IHZhbHVl
KSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92
ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgPj0gQ2hlY2tlZDx0eXBlLCBPdmVyZmxv
d0NyYXNoTG9nZ2VyPihfbGFyZ2VWYWx1ZSkpLCBvdmFsdWUuZGlkQ3Jhc2goKSkpOworICAgICAg
ICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51c2VkID0gKG92YWx1
ZSA+PSBDaGVja2VkPHR5cGUsIE92ZXJmbG93Q3Jhc2hMb2dnZXI+KF92YWx1ZSkpLCBvdmFsdWUu
ZGlkQ3Jhc2goKSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3Zh
bHVlKSwgdW51c2VkID0gKG92YWx1ZSA+PSBDaGVja2VkPHR5cGUsIE92ZXJmbG93Q3Jhc2hMb2dn
ZXI+KF9zbWFsbFZhbHVlKSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAgICAgIEVYUEVDVF9F
USh0cnVlLCAocmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAob3ZhbHVlID49IF9sYXJn
ZVZhbHVlKSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChy
ZXNldE92ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgPj0gX3ZhbHVlKSwgb3ZhbHVl
LmRpZENyYXNoKCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92
YWx1ZSksIHVudXNlZCA9IChvdmFsdWUgPj0gX3NtYWxsVmFsdWUpLCBvdmFsdWUuZGlkQ3Jhc2go
KSkpOworICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgKHJlc2V0T3ZlcmZsb3cob3ZhbHVlKSwgdW51
c2VkID0gKG92YWx1ZSA+PSBDaGVja2VkPHR5cGUsIE92ZXJmbG93Q3Jhc2hMb2dnZXI+KHN0ZDo6
bnVtZXJpY19saW1pdHM8dHlwZT46Om1heCgpKSksIG92YWx1ZS5kaWRDcmFzaCgpKSk7CisgICAg
ICAgIEVYUEVDVF9FUSh0cnVlLCAocmVzZXRPdmVyZmxvdyhvdmFsdWUpLCB1bnVzZWQgPSAob3Zh
bHVlID49IHN0ZDo6bnVtZXJpY19saW1pdHM8dHlwZT46Om1heCgpKSwgb3ZhbHVlLmRpZENyYXNo
KCkpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92YWx1ZSksIHVu
dXNlZCA9IChvdmFsdWUgPj0gbnZhbHVlKSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKyAgICAgICAg
RVhQRUNUX0VRKHRydWUsIChyZXNldE92ZXJmbG93KG92YWx1ZSksIHVudXNlZCA9IChudmFsdWUg
Pj0gb3ZhbHVlKSwgb3ZhbHVlLmRpZENyYXNoKCkpKTsKKworICAgICAgICBFWFBFQ1RfRVEoZmFs
c2UsIG52YWx1ZS5oYXNPdmVyZmxvd2VkKCkpOworCiAgICAgICAgIE1peGVkU2lnbmVkbmVzc1Rl
c3Rlcjo6cnVuKCk7CiAgICAgfQogfTsK
</data>
<flag name="review"
          id="280201"
          type_id="1"
          status="+"
          setter="oliver"
    />
          </attachment>
      

    </bug>

</bugzilla>