<?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>144628</bug_id>
          
          <creation_ts>2015-05-05 08:37:57 -0700</creation_ts>
          <short_desc>[Curl] WebSocket platform part is not implemented.</short_desc>
          <delta_ts>2015-05-15 06:53:47 -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>WebCore Misc.</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>peavo</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>achristensen</cc>
    
    <cc>bfulgham</cc>
    
    <cc>darin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1091768</commentid>
    <comment_count>0</comment_count>
    <who name="">peavo</who>
    <bug_when>2015-05-05 08:37:57 -0700</bug_when>
    <thetext>The Curl platform code for WebSockets has not been implemented yet.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1091769</commentid>
    <comment_count>1</comment_count>
      <attachid>252386</attachid>
    <who name="">peavo</who>
    <bug_when>2015-05-05 08:41:39 -0700</bug_when>
    <thetext>Created attachment 252386
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1091770</commentid>
    <comment_count>2</comment_count>
    <who name="">peavo</who>
    <bug_when>2015-05-05 08:43:20 -0700</bug_when>
    <thetext>The patch passes all http websocket tests :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1091779</commentid>
    <comment_count>3</comment_count>
      <attachid>252386</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-05-05 09:04:39 -0700</bug_when>
    <thetext>Comment on attachment 252386
Patch

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

Code looks OK, but lots of room for improvement.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:57
&gt; +class SocketStreamHandle : public RefCounted&lt;SocketStreamHandle&gt;, public SocketStreamHandleBase {

Are we guaranteed that all the ref/deref are on the same thread? I am concerned that is not so.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:59
&gt; +    static PassRefPtr&lt;SocketStreamHandle&gt; create(const URL&amp; url, SocketStreamHandleClient* client) { return adoptRef(new SocketStreamHandle(url, client)); }

Should return Ref, not PassRefPtr.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:63
&gt; +protected:

A class that is never used as a base class should not have any protected members at all. These should all be private, not protected.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:69
&gt; +    bool readData(CURL* curlHandle);
&gt; +    bool sendData(CURL* curlHandle);
&gt; +    bool waitForAvailableData(CURL* curlHandle, int selectTimeoutMS);

These CURL* don’t need argument names in the header, and also, should be CURL&amp;.

The selectTimeoutMS is an old fashioned choice and not what we should do in new code. A better type for the argument would be std::chrono::microseconds or perhaps std::chrono::milliseconds. Either way we would avoid all the comments about units and actually get compile time checking for it.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:72
&gt; +    static void worker(void*);

This should be a lambda inside the member function that needs it, not a static member function.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:90
&gt; +    class SocketData {

This seems like a peculiar class. Maybe it should just be a struct instead of a class.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:106
&gt; +        const char* m_data;

This needs to be a std::unique_ptr&lt;const char[]&gt;; doing all the new and delete by hand is not a good idea.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:57
&gt;      setClient(0);

nullptr

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:100
&gt; +    char* data = new char[bufferSize];

Should use unique_ptr, not manual new/delete.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:108
&gt; +        callOnMainThread(didReceiveData, this);

It would be better to use a lambda here rather than the mess with a static data member and a case of the data pointer inside it. If we had a thread safe reference count then we could use have the lambda capture a reference count to the handle, and then we would not need to use cancelCallOnMainThread in the destructor.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:222
&gt; +    SocketStreamHandle* handle = reinterpret_cast&lt;SocketStreamHandle*&gt;(context);

This should be static_cast, not reinterpret_cast.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:233
&gt; +    auto receiveData = m_receiveData;
&gt; +    m_receiveData.clear();

This should use WTF::move rather than copy and clear. Much more efficient and required if we change SocketData to read-only, which we should do.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:237
&gt; +    for (auto socketData : receiveData) {

This needs to be auto&amp; to avoid copying the socket data.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:252
&gt; +    SocketStreamHandle* handle = reinterpret_cast&lt;SocketStreamHandle*&gt;(context);

This should be static_cast instead.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1091803</commentid>
    <comment_count>4</comment_count>
    <who name="">peavo</who>
    <bug_when>2015-05-05 10:13:35 -0700</bug_when>
    <thetext>Thanks for reviewing :) Will upload another patch soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1092716</commentid>
    <comment_count>5</comment_count>
      <attachid>252612</attachid>
    <who name="">peavo</who>
    <bug_when>2015-05-07 13:26:51 -0700</bug_when>
    <thetext>Created attachment 252612
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1092719</commentid>
    <comment_count>6</comment_count>
    <who name="">peavo</who>
    <bug_when>2015-05-07 13:31:26 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:69
&gt; &gt; +    bool readData(CURL* curlHandle);
&gt; &gt; +    bool sendData(CURL* curlHandle);
&gt; &gt; +    bool waitForAvailableData(CURL* curlHandle, int selectTimeoutMS);
&gt; 
&gt; These CURL* don’t need argument names in the header, and also, should be
&gt; CURL&amp;.
&gt; 

I didn&apos;t change the parameter type, as CURL&amp; didn&apos;t compile, since CURL is of type void.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1092797</commentid>
    <comment_count>7</comment_count>
      <attachid>252612</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-05-07 15:29:59 -0700</bug_when>
    <thetext>Comment on attachment 252612
Patch

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

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:49
&gt; +#include &lt;wtf/threading.h&gt;

This should have a capital &quot;t&quot;.

The headers here aren’t sorted alphabetically the way the WebKit style guide says they should be.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:87
&gt; +    class SocketData {

This should just be a struct, not a class. I don’t see us getting any benefit from making it a class.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:89
&gt; +        SocketData(const char* data, int size)

I think it’s too subtle that this takes ownership of the data. Making this a struct might help.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:100
&gt; +        SocketData(SocketData&amp;&amp; other)
&gt; +        {
&gt; +            m_data = WTF::move(other.m_data);
&gt; +            m_size = other.m_size;
&gt; +            other.m_size = 0;
&gt; +        }

Is it important that the other’s size gets set to 0 when moving? If not, then I suggest we just let the compiler generate this.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:104
&gt; +        ~SocketData()
&gt; +        {
&gt; +        }

No need to define this.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:69
&gt; +    char* copy = new char[length];

This should go right into a std::unique_ptr when it’s allocated.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:101
&gt; +        m_receiveData.append(SocketData(data.release(), bytesRead));

This shows us we have a poor design for SocketData. It’s not good to call unique_ptr.release just to put something into another unique_ptr. If SocketData was a struct we could just write:

    m_receiveData.append(SocketData { WTF::move(data), bytesRead });

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:127
&gt; +        auto sendData = WTF::move(m_sendData.at(0));
&gt; +        m_sendData.remove(0);

Should use takeFirst, not move/at/remove. And the fact that a Vector doesn’t have a takeFirst should make you realize that this should be a Duque, not a Vector.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:143
&gt; +            char* copy = new char[restLength];

Should go right into a std::unique_ptr.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:173
&gt; +    if (!m_workerThread) {

Early return would be better than nesting the entire function inside an if.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:174
&gt; +        ref();

Need a comment explaining where the deref that matches this is.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:184
&gt; +            CString host = m_url.host().ascii();

The String::ascii() function should not be used unless there is a guarantee that all characters are ASCII. I don’t think there is a guarantee that all characters from URL::host will be ASCII. Maybe you want latin1() or utf8()?

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:217
&gt; +    if (m_workerThread) {

Early return would be better than nesting the entire function inside an if.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:218
&gt; +        m_stopThread = true;

Probably needs to be an atomic bool, not just a normal bool.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:220
&gt; +        m_workerThread = 0;

nullptr</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1093224</commentid>
    <comment_count>8</comment_count>
      <attachid>252729</attachid>
    <who name="">peavo</who>
    <bug_when>2015-05-08 10:26:11 -0700</bug_when>
    <thetext>Created attachment 252729
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1093225</commentid>
    <comment_count>9</comment_count>
    <who name="">peavo</who>
    <bug_when>2015-05-08 10:27:41 -0700</bug_when>
    <thetext>(In reply to comment #7)

Thanks again for helpful review :)

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:220
&gt; &gt; +        m_workerThread = 0;
&gt; 
&gt; nullptr

I didn&apos;t change this, as m_workerThread does not seem to be of pointer type.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1093584</commentid>
    <comment_count>10</comment_count>
      <attachid>252729</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-05-10 14:31:32 -0700</bug_when>
    <thetext>Comment on attachment 252729
Patch

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

lets not use this unnecessary std::unique_ptr

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:48
&gt; +#if PLATFORM(WIN)
&gt; +#include &lt;windows.h&gt;
&gt; +#include &lt;winsock2.h&gt;
&gt; +#endif
&gt; +
&gt; +#include &lt;curl/curl.h&gt;
&gt; +
&gt; +#include &lt;mutex&gt;
&gt; +
&gt; +#include &lt;wtf/Deque.h&gt;
&gt;  #include &lt;wtf/RefCounted.h&gt;
&gt; +#include &lt;wtf/Threading.h&gt;

These aren’t sorted in the normal WebKit project way.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:88
&gt; +        const char* data() const { return m_data.get(); }
&gt; +        int size() const { return m_size; }

No need for these.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:90
&gt; +        std::unique_ptr&lt;const char[]&gt; m_data;

Should just name this data.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:91
&gt; +        int m_size;

Should just name this size. I also suggest initializing it to zero instead of leaving it uninitialized.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:99
&gt; +    Deque&lt;std::unique_ptr&lt;SocketData&gt;&gt; m_sendData;
&gt; +    Deque&lt;std::unique_ptr&lt;SocketData&gt;&gt; m_receiveData;

These should be Deque&lt;SocketData&gt; instead of Deque&lt;std::unique_ptr&lt;SocketData&gt;). There’s no need for all the extra heap allocation.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:51
&gt; +    startThread();

Should probably ASSERT(isMainThread()) here.

But also, why do we need to start the thread? I don’t think we do.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:57
&gt; +    stopThread();

Should just be ASSERT(!m_workerThread). The handle is ref&apos;d as long as the thread is going.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:58
&gt; +    setClient(nullptr);

I don’t understand the value of doing this. The setClient function has no side effects, and once the handle is deleted the null pointer can be overwritten by other random values. I don’t think this class needs a destructor at all, although perhaps the logging and assertions would be OK.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:70
&gt; +    std::unique_ptr&lt;const char[]&gt; copy(new const char[length]);
&gt; +    memcpy(const_cast&lt;char*&gt;(copy.get()), data, length);

Should be able to allocate a std::unique_ptr&lt;char[]&gt; and then pass it to a function expecting a std::unique_ptr&lt;const char[]&gt; and have it be converted. We’d avoid a const_cast that way.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:124
&gt; +    std::lock_guard&lt;std::mutex&gt; lock(m_mutexSend);

Do we really need to lock during the actual send? This seems like a really long time to hold a lock.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:144
&gt; +            std::unique_ptr&lt;const char[]&gt; copy(new const char[restLength]);
&gt; +            memcpy(const_cast&lt;char*&gt;(copy.get()), sendData-&gt;data() + totalBytesSent, restLength);
&gt; +            m_sendData.prepend(std::unique_ptr&lt;SocketData&gt;(new SocketData { WTF::move(copy), restLength } ));

Would be nice to share this code with platformSend.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:158
&gt; +    timeout.tv_sec = 0;
&gt; +    timeout.tv_usec = std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(selectTimeout).count();

This can do something crazy thing if selectTimeout is 1 second or more or if it’s negative.

http://stackoverflow.com/questions/17402657/how-to-convert-stdchronosystem-clockduration-into-struct-timeval

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:188
&gt; +        CString host = m_url.host().utf8();
&gt; +        curl_easy_setopt(curlHandle, CURLOPT_URL, host.data());

No need for the local variable here.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:200
&gt; +            if (refCount() &gt; 1)
&gt; +                didOpenSocket();

This check of refCount is peculiar. Is this an important optimization?

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:217
&gt; +void SocketStreamHandle::stopThread()

This function needs an ASSERT(isMainThread())</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1093836</commentid>
    <comment_count>11</comment_count>
      <attachid>252878</attachid>
    <who name="">peavo</who>
    <bug_when>2015-05-11 11:50:48 -0700</bug_when>
    <thetext>Created attachment 252878
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1093844</commentid>
    <comment_count>12</comment_count>
    <who name="">peavo</who>
    <bug_when>2015-05-11 12:03:19 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; Comment on attachment 252729 [details]
&gt; Patch
&gt; 

Thank you for your patience :)

&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=252729&amp;action=review
&gt; 
&gt; lets not use this unnecessary std::unique_ptr
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:48
&gt; &gt; +#if PLATFORM(WIN)
&gt; &gt; +#include &lt;windows.h&gt;
&gt; &gt; +#include &lt;winsock2.h&gt;
&gt; &gt; +#endif
&gt; &gt; +
&gt; &gt; +#include &lt;curl/curl.h&gt;
&gt; &gt; +
&gt; &gt; +#include &lt;mutex&gt;
&gt; &gt; +
&gt; &gt; +#include &lt;wtf/Deque.h&gt;
&gt; &gt;  #include &lt;wtf/RefCounted.h&gt;
&gt; &gt; +#include &lt;wtf/Threading.h&gt;
&gt; 
&gt; These aren’t sorted in the normal WebKit project way.
&gt; 

winsock2.h is needed before curl.h is included, so I kept this.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:51
&gt; &gt; +    startThread();
&gt; 
&gt; Should probably ASSERT(isMainThread()) here.
&gt; 
&gt; But also, why do we need to start the thread? I don’t think we do.
&gt; 

startThread() seems to be needed here, many tests timed out without it.

&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:70
&gt; &gt; +    std::unique_ptr&lt;const char[]&gt; copy(new const char[length]);
&gt; &gt; +    memcpy(const_cast&lt;char*&gt;(copy.get()), data, length);
&gt; 
&gt; Should be able to allocate a std::unique_ptr&lt;char[]&gt; and then pass it to a
&gt; function expecting a std::unique_ptr&lt;const char[]&gt; and have it be converted.
&gt; We’d avoid a const_cast that way.
&gt;

MSVC didn&apos;t want to convert this, I got the error:

error C2664: &apos;std::unique_ptr&lt;const char [],std::default_delete&lt;_Ty&gt;&gt;::unique_ptr(const std::unique_ptr&lt;_Ty,std::default_delete&lt;_Ty&gt;&gt; &amp;)&apos; : 
cannot convert argument 1 from &apos;std::unique_ptr&lt;char [],std::default_delete&lt;_Ty&gt;&gt;&apos; to &apos;std::unique_ptr&lt;const char [],std::default_delete&lt;_Ty&gt;&gt; &amp;&amp;&apos;

 
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:200
&gt; &gt; +            if (refCount() &gt; 1)
&gt; &gt; +                didOpenSocket();
&gt; 
&gt; This check of refCount is peculiar. Is this an important optimization?
&gt; 

I&apos;m also not too happy with this :) I added it to fix a crash where the call was invoked on the main thread after all other references were released, and the SocketStreamClient was deleted. Accessing the SocketStreamClient in didOpenSocket() then caused a crash.

I had to add a SocketData constructor since m_sendData.append(SocketData { WTF::move(copy), length }) didn&apos;t compile with MSVC. The error I got was:

error C2440 : &apos;&lt;function-style-cast&gt;&apos; : cannot convert from &apos;initializer-list&apos; to &apos;WebCore::SocketStreamHandle::SocketData&apos;
1&gt;          No constructor could take the source type, or constructor overload resolution was ambiguous

I also had to add a move constructor, otherwise I got an error stating that 
Deque.h (line 422) was trying to reference the deleted unique_ptr copy constructor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1093932</commentid>
    <comment_count>13</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-05-11 16:09:18 -0700</bug_when>
    <thetext>&gt; MSVC didn&apos;t want to convert this, I got the error:
&gt; 
&gt; error C2664: &apos;std::unique_ptr&lt;const char
&gt; [],std::default_delete&lt;_Ty&gt;&gt;::unique_ptr(const
&gt; std::unique_ptr&lt;_Ty,std::default_delete&lt;_Ty&gt;&gt; &amp;)&apos; : 
&gt; cannot convert argument 1 from &apos;std::unique_ptr&lt;char
&gt; [],std::default_delete&lt;_Ty&gt;&gt;&apos; to &apos;std::unique_ptr&lt;const char
&gt; [],std::default_delete&lt;_Ty&gt;&gt; &amp;&amp;&apos;
If this really is a bug in MSVC, could you use const_cast to add const instead of taking it away?  That would be nicer.
&gt; I had to add a SocketData constructor since m_sendData.append(SocketData {
&gt; WTF::move(copy), length }) didn&apos;t compile with MSVC. The error I got was:
&gt; 
&gt; error C2440 : &apos;&lt;function-style-cast&gt;&apos; : cannot convert from
&gt; &apos;initializer-list&apos; to &apos;WebCore::SocketStreamHandle::SocketData&apos;
&gt; 1&gt;          No constructor could take the source type, or constructor
&gt; overload resolution was ambiguous
Does it work to call the constructor without any initializer-list? (no {})</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1093968</commentid>
    <comment_count>14</comment_count>
      <attachid>252878</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-05-11 17:28:48 -0700</bug_when>
    <thetext>Comment on attachment 252878
Patch

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

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:77
&gt; +    std::unique_ptr&lt;const char[]&gt; createCopy(const char* data, int length);

Should be static.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:99
&gt; +        SocketData(std::unique_ptr&lt;const char[]&gt;&amp;&amp; source, int length)
&gt; +        {
&gt; +            data = WTF::move(source);
&gt; +            size = length;
&gt; +        }
&gt; +
&gt; +        SocketData(SocketData&amp;&amp; other)
&gt; +        {
&gt; +            data = WTF::move(other.data);
&gt; +            size = other.size;
&gt; +            other.size = 0;
&gt; +        }

I don’t understand why you had to define these.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:71
&gt; +    m_sendData.append(SocketData(WTF::move(copy), length));

Should just be SocketData { WTF::move(copy), length } and then it should work without a constructor.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:215
&gt; +            if (refCount() &gt; 1)
&gt; +                didOpenSocket();

Needs a comment explaining why it’s here. Something like how you replied to my query about this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1094456</commentid>
    <comment_count>15</comment_count>
      <attachid>253030</attachid>
    <who name="">peavo</who>
    <bug_when>2015-05-13 03:53:59 -0700</bug_when>
    <thetext>Created attachment 253030
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1094457</commentid>
    <comment_count>16</comment_count>
    <who name="">peavo</who>
    <bug_when>2015-05-13 04:01:34 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; Comment on attachment 252878 [details]
&gt; Patch
&gt;

Thanks again :)
 
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:99
&gt; &gt; +        SocketData(std::unique_ptr&lt;const char[]&gt;&amp;&amp; source, int length)
&gt; &gt; +        {
&gt; &gt; +            data = WTF::move(source);
&gt; &gt; +            size = length;
&gt; &gt; +        }
&gt; &gt; +
&gt; &gt; +        SocketData(SocketData&amp;&amp; other)
&gt; &gt; +        {
&gt; &gt; +            data = WTF::move(other.data);
&gt; &gt; +            size = other.size;
&gt; &gt; +            other.size = 0;
&gt; &gt; +        }
&gt; 
&gt; I don’t understand why you had to define these.
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/SocketStreamHandleCurl.cpp:71
&gt; &gt; +    m_sendData.append(SocketData(WTF::move(copy), length));
&gt; 
&gt; Should just be SocketData { WTF::move(copy), length } and then it should
&gt; work without a constructor.
&gt; 

I&apos;m sorry, but I don&apos;t seem to be able to get rid of these constructors.
When I remove them, I get the following error:

1&gt;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xmemory0(611): error C2280: &apos;std::unique_ptr&lt;char [],std::default_delete&lt;_Ty&gt;&gt;::unique_ptr(const std::unique_ptr&lt;_Ty,std::default_delete&lt;_Ty&gt;&gt; &amp;)&apos; : attempting to reference a deleted function
1&gt;          with
1&gt;          [
1&gt;              _Ty=char []
1&gt;          ]
1&gt;          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\memory(1618) : see declaration of &apos;std::unique_ptr&lt;char [],std::default_delete&lt;_Ty&gt;&gt;::unique_ptr&apos;
1&gt;          with
1&gt;          [
1&gt;              _Ty=char []
1&gt;          ]
1&gt;          This diagnostic occurred in the compiler generated function &apos;WebCore::SocketStreamHandle::SocketData::SocketData(const WebCore::SocketStreamHandle::SocketData &amp;)&apos;
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

I believe this happens because Deque::append and Deque::prepend makes MSVC generate a SocketData copy constructor, which is not possible since the copy constructor in unique_ptr is deleted.

There seems to be reports of similar problems:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/ace575e6-3969-4672-9db1-85c9d6588e4a/cant-put-class-with-uniqueptr-member-in-stl-container?forum=vclanguage

http://stackoverflow.com/questions/10133591/using-smart-pointers-in-a-struct-or-class

Is this a MSVC problem? I assume gcc doesn&apos;t have these problems.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1094458</commentid>
    <comment_count>17</comment_count>
    <who name="">peavo</who>
    <bug_when>2015-05-13 04:03:28 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; &gt; MSVC didn&apos;t want to convert this, I got the error:
&gt; &gt; 
&gt; &gt; error C2664: &apos;std::unique_ptr&lt;const char
&gt; &gt; [],std::default_delete&lt;_Ty&gt;&gt;::unique_ptr(const
&gt; &gt; std::unique_ptr&lt;_Ty,std::default_delete&lt;_Ty&gt;&gt; &amp;)&apos; : 
&gt; &gt; cannot convert argument 1 from &apos;std::unique_ptr&lt;char
&gt; &gt; [],std::default_delete&lt;_Ty&gt;&gt;&apos; to &apos;std::unique_ptr&lt;const char
&gt; &gt; [],std::default_delete&lt;_Ty&gt;&gt; &amp;&amp;&apos;
&gt; If this really is a bug in MSVC, could you use const_cast to add const
&gt; instead of taking it away?  That would be nicer.
&gt; &gt; I had to add a SocketData constructor since m_sendData.append(SocketData {
&gt; &gt; WTF::move(copy), length }) didn&apos;t compile with MSVC. The error I got was:
&gt; &gt; 
&gt; &gt; error C2440 : &apos;&lt;function-style-cast&gt;&apos; : cannot convert from
&gt; &gt; &apos;initializer-list&apos; to &apos;WebCore::SocketStreamHandle::SocketData&apos;
&gt; &gt; 1&gt;          No constructor could take the source type, or constructor
&gt; &gt; overload resolution was ambiguous
&gt; Does it work to call the constructor without any initializer-list? (no {})

Thanks for looking into this :)

I removed the const modifier from the unique_ptr member in the last patch to avoid all the casting. I hope this is acceptable :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1094510</commentid>
    <comment_count>18</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-05-13 12:09:05 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; I believe this happens because Deque::append and Deque::prepend makes MSVC
&gt; generate a SocketData copy constructor, which is not possible since the copy
&gt; constructor in unique_ptr is deleted.

As you say, I think this is indeed an MSVC bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1094511</commentid>
    <comment_count>19</comment_count>
      <attachid>253030</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2015-05-13 12:09:18 -0700</bug_when>
    <thetext>Comment on attachment 253030
Patch

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

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:92
&gt; +        SocketData(std::unique_ptr&lt;char[]&gt;&amp;&amp; source, int length)
&gt; +        {
&gt; +            data = WTF::move(source);
&gt; +            size = length;
&gt; +        }

Really irritating that we have to do this to work around a bug in MSVC, but I’m pretty sure that is indeed what we are doing, working around a bug. Two separate related bugs, I guess.

&gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:99
&gt; +        SocketData(SocketData&amp;&amp; other)
&gt; +        {
&gt; +            data = WTF::move(other.data);
&gt; +            size = other.size;
&gt; +            other.size = 0;
&gt; +        }

Really irritating that we have to do this to work around a bug in MSVC, but I’m pretty sure that is indeed what we are doing, working around a bug. Two separate related bugs, I guess.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1094521</commentid>
    <comment_count>20</comment_count>
    <who name="">peavo</who>
    <bug_when>2015-05-13 12:20:23 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; Comment on attachment 253030 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=253030&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/SocketStreamHandle.h:92
&gt; &gt; +        SocketData(std::unique_ptr&lt;char[]&gt;&amp;&amp; source, int length)
&gt; &gt; +        {
&gt; &gt; +            data = WTF::move(source);
&gt; &gt; +            size = length;
&gt; &gt; +        }
&gt; 
&gt; Really irritating that we have to do this to work around a bug in MSVC, but
&gt; I’m pretty sure that is indeed what we are doing, working around a bug. Two
&gt; separate related bugs, I guess.
&gt; 

Thanks for reviewing :) I can try to remember to revisit this code when we move to the next MSVC version.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1095112</commentid>
    <comment_count>21</comment_count>
    <who name="">peavo</who>
    <bug_when>2015-05-15 06:53:47 -0700</bug_when>
    <thetext>Committed r184389: &lt;http://trac.webkit.org/changeset/184389&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>252386</attachid>
            <date>2015-05-05 08:41:39 -0700</date>
            <delta_ts>2015-05-07 13:26:42 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-144628-20150505174018.patch</filename>
            <type>text/plain</type>
            <size>12289</size>
            <attacher>peavo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4MzgwNikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMxIEBACisyMDE1LTA1LTA1ICBQZXIgQXJu
ZSBWb2xsYW4gIDxwZWF2b0BvdXRsb29rLmNvbT4KKworICAgICAgICBbQ3VybF0gV2ViU29ja2V0
IHBsYXRmb3JtIHBhcnQgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0NjI4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIEN1cmwgcGxhdGZvcm0gY29kZSBpbXBsZW1l
bnRhdGlvbiBmb3IgV2ViU29ja2V0cy4KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9Tb2NrZXRTdHJlYW1IYW5kbGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhh
bmRsZTo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6U29j
a2V0RGF0YTo6U29ja2V0RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5k
bGU6OlNvY2tldERhdGE6On5Tb2NrZXREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0
cmVhbUhhbmRsZTo6U29ja2V0RGF0YTo6ZGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRT
dHJlYW1IYW5kbGU6OlNvY2tldERhdGE6OnNpemUpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdv
cmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVDdXJsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNv
Y2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3RyZWFtSGFuZGxlKToKKyAgICAgICAgKFdlYkNvcmU6
OlNvY2tldFN0cmVhbUhhbmRsZTo6flNvY2tldFN0cmVhbUhhbmRsZSk6CisgICAgICAgIChXZWJD
b3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OnBsYXRmb3JtU2VuZCk6CisgICAgICAgIChXZWJDb3Jl
OjpTb2NrZXRTdHJlYW1IYW5kbGU6OnBsYXRmb3JtQ2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6
U29ja2V0U3RyZWFtSGFuZGxlOjpyZWFkRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRT
dHJlYW1IYW5kbGU6OnNlbmREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhh
bmRsZTo6d2FpdEZvckF2YWlsYWJsZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3Ry
ZWFtSGFuZGxlOjpzdGFydFRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1I
YW5kbGU6Ondvcmtlcik6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OmRp
ZFJlY2VpdmVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6ZGlk
T3BlblNvY2tldCk6CisKIDIwMTUtMDUtMDUgIEphdmllciBGZXJuYW5kZXogIDxqZmVybmFuZGV6
QGlnYWxpYS5jb20+CiAKICAgICAgICAgW0NTUyBCb3ggQWxpZ25tZW50XSBVcGdyYWRlIGFsaWdu
LWNvbnRlbnQgcGFyc2luZyB0byBDU1MzIEJveCBBbGlnbm1lbnQgc3BlYwpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJl
YW1IYW5kbGUuaAkocmV2aXNpb24gMTgzODA2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNCwz
NyArMzQsODcgQEAKIAogI2luY2x1ZGUgIlNvY2tldFN0cmVhbUhhbmRsZUJhc2UuaCIKIAorI2lm
IFBMQVRGT1JNKFdJTikKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2luc29jazIu
aD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3VybC9jdXJsLmg+CisKKyNpbmNsdWRlIDxtdXRleD4K
KyNpbmNsdWRlIDx0aHJlYWQ+CisKICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1
ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL3RocmVhZGluZy5oPgogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKLSAgICBjbGFzcyBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZTsKLSAg
ICBjbGFzcyBDcmVkZW50aWFsOwotICAgIGNsYXNzIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudDsK
K2NsYXNzIEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlOworY2xhc3MgQ3JlZGVudGlhbDsKK2NsYXNz
IFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudDsKKworY2xhc3MgU29ja2V0U3RyZWFtSGFuZGxlIDog
cHVibGljIFJlZkNvdW50ZWQ8U29ja2V0U3RyZWFtSGFuZGxlPiwgcHVibGljIFNvY2tldFN0cmVh
bUhhbmRsZUJhc2UgeworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNvY2tldFN0cmVh
bUhhbmRsZT4gY3JlYXRlKGNvbnN0IFVSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQq
IGNsaWVudCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IFNvY2tldFN0cmVhbUhhbmRsZSh1cmwsIGNs
aWVudCkpOyB9CisKKyAgICB2aXJ0dWFsIH5Tb2NrZXRTdHJlYW1IYW5kbGUoKTsKKworcHJvdGVj
dGVkOgorICAgIGludCBwbGF0Zm9ybVNlbmQoY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCkg
b3ZlcnJpZGU7CisgICAgdm9pZCBwbGF0Zm9ybUNsb3NlKCkgb3ZlcnJpZGU7CisKKyAgICBib29s
IHJlYWREYXRhKENVUkwqIGN1cmxIYW5kbGUpOworICAgIGJvb2wgc2VuZERhdGEoQ1VSTCogY3Vy
bEhhbmRsZSk7CisgICAgYm9vbCB3YWl0Rm9yQXZhaWxhYmxlRGF0YShDVVJMKiBjdXJsSGFuZGxl
LCBpbnQgc2VsZWN0VGltZW91dE1TKTsKKworICAgIHZvaWQgc3RhcnRUaHJlYWQoKTsKKyAgICBz
dGF0aWMgdm9pZCB3b3JrZXIodm9pZCopOworCisgICAgc3RhdGljIHZvaWQgZGlkUmVjZWl2ZURh
dGEodm9pZCogY29udGV4dCk7CisgICAgdm9pZCBkaWRSZWNlaXZlRGF0YSgpOworICAgIHN0YXRp
YyB2b2lkIGRpZE9wZW5Tb2NrZXQodm9pZCogY29udGV4dCk7CisgICAgdm9pZCBkaWRPcGVuU29j
a2V0KCk7CisKK3ByaXZhdGU6CisgICAgU29ja2V0U3RyZWFtSGFuZGxlKGNvbnN0IFVSTCYsIFNv
Y2tldFN0cmVhbUhhbmRsZUNsaWVudCopOworCisgICAgLy8gTm8gYXV0aGVudGljYXRpb24gZm9y
IHN0cmVhbXMgcGVyIHNlLCBidXQgcHJveHkgbWF5IGFzayBmb3IgY3JlZGVudGlhbHMuCisgICAg
dm9pZCBkaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoY29uc3QgQXV0aGVudGljYXRp
b25DaGFsbGVuZ2UmKTsKKyAgICB2b2lkIHJlY2VpdmVkQ3JlZGVudGlhbChjb25zdCBBdXRoZW50
aWNhdGlvbkNoYWxsZW5nZSYsIGNvbnN0IENyZWRlbnRpYWwmKTsKKyAgICB2b2lkIHJlY2VpdmVk
UmVxdWVzdFRvQ29udGludWVXaXRob3V0Q3JlZGVudGlhbChjb25zdCBBdXRoZW50aWNhdGlvbkNo
YWxsZW5nZSYpOworICAgIHZvaWQgcmVjZWl2ZWRDYW5jZWxsYXRpb24oY29uc3QgQXV0aGVudGlj
YXRpb25DaGFsbGVuZ2UmKTsKKyAgICB2b2lkIHJlY2VpdmVkUmVxdWVzdFRvUGVyZm9ybURlZmF1
bHRIYW5kbGluZyhjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpOworICAgIHZvaWQgcmVj
ZWl2ZWRDaGFsbGVuZ2VSZWplY3Rpb24oY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKTsK
IAotICAgIGNsYXNzIFNvY2tldFN0cmVhbUhhbmRsZSA6IHB1YmxpYyBSZWZDb3VudGVkPFNvY2tl
dFN0cmVhbUhhbmRsZT4sIHB1YmxpYyBTb2NrZXRTdHJlYW1IYW5kbGVCYXNlIHsKKyAgICBjbGFz
cyBTb2NrZXREYXRhIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNv
Y2tldFN0cmVhbUhhbmRsZT4gY3JlYXRlKGNvbnN0IFVSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5k
bGVDbGllbnQqIGNsaWVudCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IFNvY2tldFN0cmVhbUhhbmRs
ZSh1cmwsIGNsaWVudCkpOyB9CisgICAgICAgIFNvY2tldERhdGEoY29uc3QgY2hhciogZGF0YSwg
aW50IHNpemUpCisgICAgICAgICAgICA6IG1fZGF0YShkYXRhKQorICAgICAgICAgICAgLCBtX3Np
emUoc2l6ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgflNvY2tldERhdGEoKQor
ICAgICAgICB7CisgICAgICAgIH0KIAotICAgICAgICB2aXJ0dWFsIH5Tb2NrZXRTdHJlYW1IYW5k
bGUoKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCBpbnQgcGxhdGZvcm1TZW5k
KGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcGxh
dGZvcm1DbG9zZSgpOworICAgICAgICBjb25zdCBjaGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4g
bV9kYXRhOyB9CisgICAgICAgIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CiAK
ICAgICBwcml2YXRlOgotICAgICAgICBTb2NrZXRTdHJlYW1IYW5kbGUoY29uc3QgVVJMJiwgU29j
a2V0U3RyZWFtSGFuZGxlQ2xpZW50Kik7Ci0KLSAgICAgICAgLy8gTm8gYXV0aGVudGljYXRpb24g
Zm9yIHN0cmVhbXMgcGVyIHNlLCBidXQgcHJveHkgbWF5IGFzayBmb3IgY3JlZGVudGlhbHMuCi0g
ICAgICAgIHZvaWQgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKGNvbnN0IEF1dGhl
bnRpY2F0aW9uQ2hhbGxlbmdlJik7Ci0gICAgICAgIHZvaWQgcmVjZWl2ZWRDcmVkZW50aWFsKGNv
bnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJiwgY29uc3QgQ3JlZGVudGlhbCYpOwotICAgICAg
ICB2b2lkIHJlY2VpdmVkUmVxdWVzdFRvQ29udGludWVXaXRob3V0Q3JlZGVudGlhbChjb25zdCBB
dXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpOwotICAgICAgICB2b2lkIHJlY2VpdmVkQ2FuY2VsbGF0
aW9uKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7Ci0gICAgICAgIHZvaWQgcmVjZWl2
ZWRSZXF1ZXN0VG9QZXJmb3JtRGVmYXVsdEhhbmRsaW5nKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlJik7Ci0gICAgICAgIHZvaWQgcmVjZWl2ZWRDaGFsbGVuZ2VSZWplY3Rpb24oY29uc3Qg
QXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKTsKKyAgICAgICAgY29uc3QgY2hhciogbV9kYXRhOwor
ICAgICAgICBpbnQgbV9zaXplOwogICAgIH07CiAKLX0gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCisg
ICAgVGhyZWFkSWRlbnRpZmllciBtX3dvcmtlclRocmVhZCB7IDAgfTsKKyAgICBib29sIG1fc3Rv
cFRocmVhZCB7IGZhbHNlIH07CisgICAgc3RkOjptdXRleCBtX211dGV4U2VuZDsKKyAgICBzdGQ6
Om11dGV4IG1fbXV0ZXhSZWNlaXZlOworICAgIFZlY3RvcjxTb2NrZXREYXRhPiBtX3NlbmREYXRh
OworICAgIFZlY3RvcjxTb2NrZXREYXRhPiBtX3JlY2VpdmVEYXRhOworfTsKKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQogCi0jZW5kaWYgIC8vIFNvY2tldFN0cmVhbUhhbmRsZV9oCisjZW5kaWYg
Ly8gU29ja2V0U3RyZWFtSGFuZGxlX2gKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVDdXJsLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlQ3VybC5j
cHAJKHJldmlzaW9uIDE4MzgwNikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVDdXJsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsMTAg
KzM0LDEyIEBACiAKICNpZiBVU0UoQ1VSTCkKIAotI2luY2x1ZGUgIlVSTC5oIgogI2luY2x1ZGUg
IkxvZ2dpbmcuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlNvY2tl
dFN0cmVhbUhhbmRsZUNsaWVudC5oIgorI2luY2x1ZGUgIlVSTC5oIgorI2luY2x1ZGUgPHd0Zi9N
YWluVGhyZWFkLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKQEAgLTQ1LDI3ICs0NywyMTkgQEAgU29ja2V0U3RyZWFtSGFuZGxlOjpTb2Nr
ZXRTdHJlYW1IYW5kbGUoYwogICAgIDogU29ja2V0U3RyZWFtSGFuZGxlQmFzZSh1cmwsIGNsaWVu
dCkKIHsKICAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBuZXcgY2xpZW50
ICVwIiwgdGhpcywgbV9jbGllbnQpOwotICAgIG5vdEltcGxlbWVudGVkKCk7CisKKyAgICBzdGFy
dFRocmVhZCgpOwogfQogCiBTb2NrZXRTdHJlYW1IYW5kbGU6On5Tb2NrZXRTdHJlYW1IYW5kbGUo
KQogewogICAgIExPRyhOZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxlICVwIGRlbGV0ZSIsIHRo
aXMpOwogICAgIHNldENsaWVudCgwKTsKLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHBsYXRm
b3JtQ2xvc2UoKTsKKyAgICBjYW5jZWxDYWxsT25NYWluVGhyZWFkKGRpZE9wZW5Tb2NrZXQsIHRo
aXMpOworICAgIGNhbmNlbENhbGxPbk1haW5UaHJlYWQoZGlkUmVjZWl2ZURhdGEsIHRoaXMpOwog
fQogCi1pbnQgU29ja2V0U3RyZWFtSGFuZGxlOjpwbGF0Zm9ybVNlbmQoY29uc3QgY2hhciosIGlu
dCkKK2ludCBTb2NrZXRTdHJlYW1IYW5kbGU6OnBsYXRmb3JtU2VuZChjb25zdCBjaGFyKiBkYXRh
LCBpbnQgbGVuZ3RoKQogewogICAgIExPRyhOZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxlICVw
IHBsYXRmb3JtU2VuZCIsIHRoaXMpOwotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJu
IDA7CisKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgc3RhcnRUaHJlYWQoKTsK
KworICAgIGNoYXIqIGNvcHkgPSBuZXcgY2hhcltsZW5ndGhdOworICAgIG1lbWNweShjb3B5LCBk
YXRhLCBsZW5ndGgpOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9t
dXRleFNlbmQpOworICAgIG1fc2VuZERhdGEuYXBwZW5kKFNvY2tldERhdGEoY29weSwgbGVuZ3Ro
KSk7CisgICAgcmV0dXJuIGxlbmd0aDsKIH0KIAogdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OnBs
YXRmb3JtQ2xvc2UoKQogewogICAgIExPRyhOZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxlICVw
IHBsYXRmb3JtQ2xvc2UiLCB0aGlzKTsKLSAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgQVNT
RVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIGlmIChtX3dvcmtlclRocmVhZCkgeworICAgICAg
ICBtX3N0b3BUaHJlYWQgPSB0cnVlOworICAgICAgICB3YWl0Rm9yVGhyZWFkQ29tcGxldGlvbiht
X3dvcmtlclRocmVhZCk7CisgICAgICAgIG1fd29ya2VyVGhyZWFkID0gMDsKKyAgICB9CisKKyAg
ICBpZiAobV9jbGllbnQpCisgICAgICAgIG1fY2xpZW50LT5kaWRDbG9zZVNvY2tldFN0cmVhbSh0
aGlzKTsKK30KKworYm9vbCBTb2NrZXRTdHJlYW1IYW5kbGU6OnJlYWREYXRhKENVUkwqIGN1cmxI
YW5kbGUpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBjb25zdCBpbnQg
YnVmZmVyU2l6ZSA9IDEwMjQ7CisgICAgY2hhciogZGF0YSA9IG5ldyBjaGFyW2J1ZmZlclNpemVd
OworICAgIHNpemVfdCBieXRlc1JlYWQgPSAwOworCisgICAgQ1VSTGNvZGUgcmV0ID0gY3VybF9l
YXN5X3JlY3YoY3VybEhhbmRsZSwgZGF0YSwgYnVmZmVyU2l6ZSwgJmJ5dGVzUmVhZCk7CisKKyAg
ICBpZiAocmV0ID09IENVUkxFX09LICYmIGJ5dGVzUmVhZCA+PSAwKSB7CisgICAgICAgIHN0ZDo6
dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtX211dGV4UmVjZWl2ZSk7CisgICAgICAgIG1f
cmVjZWl2ZURhdGEuYXBwZW5kKFNvY2tldERhdGEoZGF0YSwgYnl0ZXNSZWFkKSk7CisgICAgICAg
IGNhbGxPbk1haW5UaHJlYWQoZGlkUmVjZWl2ZURhdGEsIHRoaXMpOworICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisKKyAgICBkZWxldGUgW10gZGF0YTsKKworICAgIGlmIChyZXQgPT0gQ1VS
TEVfQUdBSU4pCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQor
Citib29sIFNvY2tldFN0cmVhbUhhbmRsZTo6c2VuZERhdGEoQ1VSTCogY3VybEhhbmRsZSkKK3sK
KyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6
Om11dGV4PiBsb2NrKG1fbXV0ZXhTZW5kKTsKKworICAgIHdoaWxlIChtX3NlbmREYXRhLnNpemUo
KSkgeworICAgICAgICBhdXRvIHNlbmREYXRhID0gbV9zZW5kRGF0YS5hdCgwKTsKKyAgICAgICAg
bV9zZW5kRGF0YS5yZW1vdmUoMCk7CisKKyAgICAgICAgaW50IHRvdGFsQnl0ZXNTZW50ID0gMDsK
KyAgICAgICAgd2hpbGUgKHRvdGFsQnl0ZXNTZW50IDwgc2VuZERhdGEuc2l6ZSgpKSB7CisgICAg
ICAgICAgICBzaXplX3QgYnl0ZXNTZW50ID0gMDsKKyAgICAgICAgICAgIENVUkxjb2RlIHJldCA9
IGN1cmxfZWFzeV9zZW5kKGN1cmxIYW5kbGUsIHNlbmREYXRhLmRhdGEoKSArIHRvdGFsQnl0ZXNT
ZW50LCBzZW5kRGF0YS5zaXplKCkgLSB0b3RhbEJ5dGVzU2VudCwgJmJ5dGVzU2VudCk7CisgICAg
ICAgICAgICBpZiAocmV0ID09IENVUkxFX09LKQorICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNT
ZW50ICs9IGJ5dGVzU2VudDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluc2VydCByZW1haW5pbmcgZGF0YSBpbnRvIHNl
bmQgcXVldWUuCisKKyAgICAgICAgaWYgKHRvdGFsQnl0ZXNTZW50IDwgc2VuZERhdGEuc2l6ZSgp
KSB7CisgICAgICAgICAgICBjb25zdCBpbnQgcmVzdExlbmd0aCA9IHNlbmREYXRhLnNpemUoKSAt
IHRvdGFsQnl0ZXNTZW50OworICAgICAgICAgICAgY2hhciogY29weSA9IG5ldyBjaGFyW3Jlc3RM
ZW5ndGhdOworICAgICAgICAgICAgbWVtY3B5KGNvcHksIHNlbmREYXRhLmRhdGEoKSArIHRvdGFs
Qnl0ZXNTZW50LCByZXN0TGVuZ3RoKTsKKyAgICAgICAgICAgIG1fc2VuZERhdGEuaW5zZXJ0KDAs
IFNvY2tldERhdGEoY29weSwgcmVzdExlbmd0aCkpOworICAgICAgICAgICAgZGVsZXRlW10gc2Vu
ZERhdGEuZGF0YSgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAg
ICAgICAgZGVsZXRlW10gc2VuZERhdGEuZGF0YSgpOworICAgIH0KKworICAgIHJldHVybiB0cnVl
OworfQorCitib29sIFNvY2tldFN0cmVhbUhhbmRsZTo6d2FpdEZvckF2YWlsYWJsZURhdGEoQ1VS
TCogY3VybEhhbmRsZSwgaW50IHNlbGVjdFRpbWVvdXRNUykKK3sKKyAgICBBU1NFUlQoIWlzTWFp
blRocmVhZCgpKTsKKworICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgdGltZW91dC50
dl9zZWMgPSAwOworICAgIHRpbWVvdXQudHZfdXNlYyA9IHNlbGVjdFRpbWVvdXRNUyAqIDEwMDA7
IC8vIHNlbGVjdCB3YWl0cyBtaWNyb3NlY29uZHMKKworICAgIGxvbmcgc29ja2V0OworICAgIGlm
IChjdXJsX2Vhc3lfZ2V0aW5mbyhjdXJsSGFuZGxlLCBDVVJMSU5GT19MQVNUU09DS0VULCAmc29j
a2V0KSAhPSBDVVJMRV9PSykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZmRfc2V0IGZk
cmVhZDsKKyAgICBGRF9aRVJPKCZmZHJlYWQpOworICAgIEZEX1NFVChzb2NrZXQsICZmZHJlYWQp
OworICAgIGludCByYyA9IDo6c2VsZWN0KDAsICZmZHJlYWQsIG51bGxwdHIsIG51bGxwdHIsICZ0
aW1lb3V0KTsKKyAgICByZXR1cm4gcmMgPT0gMTsKK30KKwordm9pZCBTb2NrZXRTdHJlYW1IYW5k
bGU6OnN0YXJ0VGhyZWFkKCkKK3sKKyAgICBpZiAoIW1fd29ya2VyVGhyZWFkKQorICAgICAgICBt
X3dvcmtlclRocmVhZCA9IGNyZWF0ZVRocmVhZCh3b3JrZXIsIHRoaXMsICJXZWJTb2NrZXQgdGhy
ZWFkIik7Cit9CisKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjp3b3JrZXIodm9pZCogY29udGV4
dCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIFNvY2tldFN0cmVhbUhh
bmRsZSogaGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxTb2NrZXRTdHJlYW1IYW5kbGUqPihjb250
ZXh0KTsKKworICAgIENVUkwqIGN1cmxIYW5kbGUgPSBjdXJsX2Vhc3lfaW5pdCgpOworCisgICAg
aWYgKCFjdXJsSGFuZGxlKQorICAgICAgICByZXR1cm47CisKKyAgICBDU3RyaW5nIGhvc3QgPSBo
YW5kbGUtPm1fdXJsLmhvc3QoKS5hc2NpaSgpOworICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybEhh
bmRsZSwgQ1VSTE9QVF9VUkwsIGhvc3QuZGF0YSgpKTsKKyAgICBjdXJsX2Vhc3lfc2V0b3B0KGN1
cmxIYW5kbGUsIENVUkxPUFRfUE9SVCwgaGFuZGxlLT5tX3VybC5wb3J0KCkpOworICAgIGN1cmxf
ZWFzeV9zZXRvcHQoY3VybEhhbmRsZSwgQ1VSTE9QVF9DT05ORUNUX09OTFkpOworCisgICAgLy8g
Q29ubmVjdCB0byBob3N0CisgICAgaWYgKGN1cmxfZWFzeV9wZXJmb3JtKGN1cmxIYW5kbGUpICE9
IENVUkxFX09LKQorICAgICAgICByZXR1cm47CisKKyAgICBjYWxsT25NYWluVGhyZWFkKGRpZE9w
ZW5Tb2NrZXQsIGhhbmRsZSk7CisKKyAgICB3aGlsZSAoIWhhbmRsZS0+bV9zdG9wVGhyZWFkKSB7
CisgICAgICAgIC8vIFNlbmQgcXVldWVkIGRhdGEKKyAgICAgICAgaGFuZGxlLT5zZW5kRGF0YShj
dXJsSGFuZGxlKTsKKworICAgICAgICAvLyBXYWl0IHVudGlsIHNvY2tldCBoYXMgYXZhaWxhYmxl
IGRhdGEKKyAgICAgICAgaGFuZGxlLT53YWl0Rm9yQXZhaWxhYmxlRGF0YShjdXJsSGFuZGxlLCAy
MCk7CisKKyAgICAgICAgLy8gUmVhZCBhdmFpbGFibGUgZGF0YQorICAgICAgICBoYW5kbGUtPnJl
YWREYXRhKGN1cmxIYW5kbGUpOworICAgIH0KKworICAgIGN1cmxfZWFzeV9jbGVhbnVwKGN1cmxI
YW5kbGUpOworfQorCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6ZGlkUmVjZWl2ZURhdGEodm9p
ZCogY29udGV4dCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgU29ja2V0
U3RyZWFtSGFuZGxlKiBoYW5kbGUgPSByZWludGVycHJldF9jYXN0PFNvY2tldFN0cmVhbUhhbmRs
ZSo+KGNvbnRleHQpOworICAgIGhhbmRsZS0+ZGlkUmVjZWl2ZURhdGEoKTsKK30KKwordm9pZCBT
b2NrZXRTdHJlYW1IYW5kbGU6OmRpZFJlY2VpdmVEYXRhKCkKK3sKKyAgICBBU1NFUlQoaXNNYWlu
VGhyZWFkKCkpOworCisgICAgbV9tdXRleFJlY2VpdmUubG9jaygpOworCisgICAgYXV0byByZWNl
aXZlRGF0YSA9IG1fcmVjZWl2ZURhdGE7CisgICAgbV9yZWNlaXZlRGF0YS5jbGVhcigpOworCisg
ICAgbV9tdXRleFJlY2VpdmUudW5sb2NrKCk7CisKKyAgICBmb3IgKGF1dG8gc29ja2V0RGF0YSA6
IHJlY2VpdmVEYXRhKSB7CisgICAgICAgIGlmIChzb2NrZXREYXRhLnNpemUoKSA+IDApIHsKKyAg
ICAgICAgICAgIGlmIChtX2NsaWVudCkKKyAgICAgICAgICAgICAgICBtX2NsaWVudC0+ZGlkUmVj
ZWl2ZVNvY2tldFN0cmVhbURhdGEodGhpcywgc29ja2V0RGF0YS5kYXRhKCksIHNvY2tldERhdGEu
c2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwbGF0Zm9ybUNsb3NlKCk7CisK
KyAgICAgICAgZGVsZXRlW10gc29ja2V0RGF0YS5kYXRhKCk7CisgICAgfQorfQorCit2b2lkIFNv
Y2tldFN0cmVhbUhhbmRsZTo6ZGlkT3BlblNvY2tldCh2b2lkKiBjb250ZXh0KQoreworICAgIEFT
U0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBTb2NrZXRTdHJlYW1IYW5kbGUqIGhhbmRsZSA9
IHJlaW50ZXJwcmV0X2Nhc3Q8U29ja2V0U3RyZWFtSGFuZGxlKj4oY29udGV4dCk7CisgICAgaGFu
ZGxlLT5kaWRPcGVuU29ja2V0KCk7Cit9CisKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjpkaWRP
cGVuU29ja2V0KCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgbV9zdGF0
ZSA9IE9wZW47CisgICAgaWYgKG1fY2xpZW50KQorICAgICAgICBtX2NsaWVudC0+ZGlkT3BlblNv
Y2tldFN0cmVhbSh0aGlzKTsKIH0KIAogdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OmRpZFJlY2Vp
dmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYp
CkBAIC05OCw2ICsyOTIsNiBAQCB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6cmVjZWl2ZWRDaGFs
bGVuCiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAotfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>252612</attachid>
            <date>2015-05-07 13:26:51 -0700</date>
            <delta_ts>2015-05-08 10:26:02 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-144628-20150507222519.patch</filename>
            <type>text/plain</type>
            <size>12099</size>
            <attacher>peavo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4Mzk0MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMxIEBACisyMDE1LTA1LTA3ICBQZXIgQXJu
ZSBWb2xsYW4gIDxwZWF2b0BvdXRsb29rLmNvbT4KKworICAgICAgICBbQ3VybF0gV2ViU29ja2V0
IHBsYXRmb3JtIHBhcnQgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0NjI4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIEN1cmwgcGxhdGZvcm0gY29kZSBpbXBsZW1l
bnRhdGlvbiBmb3IgV2ViU29ja2V0cy4KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9Tb2NrZXRTdHJlYW1IYW5kbGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhh
bmRsZTo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6U29j
a2V0RGF0YTo6U29ja2V0RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5k
bGU6OlNvY2tldERhdGE6On5Tb2NrZXREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0
cmVhbUhhbmRsZTo6U29ja2V0RGF0YTo6ZGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRT
dHJlYW1IYW5kbGU6OlNvY2tldERhdGE6OnNpemUpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdv
cmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVDdXJsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNv
Y2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3RyZWFtSGFuZGxlKToKKyAgICAgICAgKFdlYkNvcmU6
OlNvY2tldFN0cmVhbUhhbmRsZTo6flNvY2tldFN0cmVhbUhhbmRsZSk6CisgICAgICAgIChXZWJD
b3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OnBsYXRmb3JtU2VuZCk6CisgICAgICAgIChXZWJDb3Jl
OjpTb2NrZXRTdHJlYW1IYW5kbGU6OnBsYXRmb3JtQ2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6
U29ja2V0U3RyZWFtSGFuZGxlOjpyZWFkRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRT
dHJlYW1IYW5kbGU6OnNlbmREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhh
bmRsZTo6d2FpdEZvckF2YWlsYWJsZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3Ry
ZWFtSGFuZGxlOjpzdGFydFRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1I
YW5kbGU6OnN0b3BUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxl
OjpkaWRSZWNlaXZlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6
OmRpZE9wZW5Tb2NrZXQpOgorCiAyMDE1LTA1LTA2ICBEZWFuIEphY2tzb24gIDxkaW5vQGFwcGxl
LmNvbT4KIAogICAgICAgICBIYW5kbGUgYmFja2Ryb3Agdmlld3MgdGhhdCBoYXZlIHRvIHRpbGUK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1I
YW5kbGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvU29ja2V0U3RyZWFtSGFuZGxlLmgJKHJldmlzaW9uIDE4Mzk0MSkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGUuaAkod29ya2luZyBj
b3B5KQpAQCAtMzQsMzcgKzM0LDkxIEBACiAKICNpbmNsdWRlICJTb2NrZXRTdHJlYW1IYW5kbGVC
YXNlLmgiCiAKKyNpZiBQTEFURk9STShXSU4pCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1
ZGUgPHdpbnNvY2syLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGN1cmwvY3VybC5oPgorCisjaW5j
bHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCiAjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQ
dHIuaD4KICNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi90aHJlYWRp
bmcuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi0gICAgY2xhc3MgQXV0aGVudGljYXRpb25D
aGFsbGVuZ2U7Ci0gICAgY2xhc3MgQ3JlZGVudGlhbDsKLSAgICBjbGFzcyBTb2NrZXRTdHJlYW1I
YW5kbGVDbGllbnQ7CitjbGFzcyBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZTsKK2NsYXNzIENyZWRl
bnRpYWw7CitjbGFzcyBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQ7CiAKLSAgICBjbGFzcyBTb2Nr
ZXRTdHJlYW1IYW5kbGUgOiBwdWJsaWMgUmVmQ291bnRlZDxTb2NrZXRTdHJlYW1IYW5kbGU+LCBw
dWJsaWMgU29ja2V0U3RyZWFtSGFuZGxlQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBzdGF0
aWMgUGFzc1JlZlB0cjxTb2NrZXRTdHJlYW1IYW5kbGU+IGNyZWF0ZShjb25zdCBVUkwmIHVybCwg
U29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50KiBjbGllbnQpIHsgcmV0dXJuIGFkb3B0UmVmKG5ldyBT
b2NrZXRTdHJlYW1IYW5kbGUodXJsLCBjbGllbnQpKTsgfQorY2xhc3MgU29ja2V0U3RyZWFtSGFu
ZGxlIDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPFNvY2tldFN0cmVhbUhhbmRsZT4sIHB1
YmxpYyBTb2NrZXRTdHJlYW1IYW5kbGVCYXNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPFNv
Y2tldFN0cmVhbUhhbmRsZT4gY3JlYXRlKGNvbnN0IFVSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5k
bGVDbGllbnQqIGNsaWVudCkgeyByZXR1cm4gYWRvcHRSZWYoKm5ldyBTb2NrZXRTdHJlYW1IYW5k
bGUodXJsLCBjbGllbnQpKTsgfQogCi0gICAgICAgIHZpcnR1YWwgflNvY2tldFN0cmVhbUhhbmRs
ZSgpOworICAgIHZpcnR1YWwgflNvY2tldFN0cmVhbUhhbmRsZSgpOwogCi0gICAgcHJvdGVjdGVk
OgotICAgICAgICB2aXJ0dWFsIGludCBwbGF0Zm9ybVNlbmQoY29uc3QgY2hhciogZGF0YSwgaW50
IGxlbmd0aCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBwbGF0Zm9ybUNsb3NlKCk7Citwcml2YXRl
OgorICAgIFNvY2tldFN0cmVhbUhhbmRsZShjb25zdCBVUkwmLCBTb2NrZXRTdHJlYW1IYW5kbGVD
bGllbnQqKTsKIAotICAgIHByaXZhdGU6Ci0gICAgICAgIFNvY2tldFN0cmVhbUhhbmRsZShjb25z
dCBVUkwmLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQqKTsKKyAgICBpbnQgcGxhdGZvcm1TZW5k
KGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpIG92ZXJyaWRlOworICAgIHZvaWQgcGxhdGZv
cm1DbG9zZSgpIG92ZXJyaWRlOworCisgICAgYm9vbCByZWFkRGF0YShDVVJMKik7CisgICAgYm9v
bCBzZW5kRGF0YShDVVJMKik7CisgICAgYm9vbCB3YWl0Rm9yQXZhaWxhYmxlRGF0YShDVVJMKiwg
c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBzZWxlY3RUaW1lb3V0KTsKKworICAgIHZvaWQgc3Rh
cnRUaHJlYWQoKTsKKyAgICB2b2lkIHN0b3BUaHJlYWQoKTsKIAotICAgICAgICAvLyBObyBhdXRo
ZW50aWNhdGlvbiBmb3Igc3RyZWFtcyBwZXIgc2UsIGJ1dCBwcm94eSBtYXkgYXNrIGZvciBjcmVk
ZW50aWFscy4KLSAgICAgICAgdm9pZCBkaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2Uo
Y29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKTsKLSAgICAgICAgdm9pZCByZWNlaXZlZENy
ZWRlbnRpYWwoY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmLCBjb25zdCBDcmVkZW50aWFs
Jik7Ci0gICAgICAgIHZvaWQgcmVjZWl2ZWRSZXF1ZXN0VG9Db250aW51ZVdpdGhvdXRDcmVkZW50
aWFsKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7Ci0gICAgICAgIHZvaWQgcmVjZWl2
ZWRDYW5jZWxsYXRpb24oY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKTsKLSAgICAgICAg
dm9pZCByZWNlaXZlZFJlcXVlc3RUb1BlcmZvcm1EZWZhdWx0SGFuZGxpbmcoY29uc3QgQXV0aGVu
dGljYXRpb25DaGFsbGVuZ2UmKTsKLSAgICAgICAgdm9pZCByZWNlaXZlZENoYWxsZW5nZVJlamVj
dGlvbihjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpOworICAgIHZvaWQgZGlkUmVjZWl2
ZURhdGEoKTsKKyAgICB2b2lkIGRpZE9wZW5Tb2NrZXQoKTsKKworICAgIC8vIE5vIGF1dGhlbnRp
Y2F0aW9uIGZvciBzdHJlYW1zIHBlciBzZSwgYnV0IHByb3h5IG1heSBhc2sgZm9yIGNyZWRlbnRp
YWxzLgorICAgIHZvaWQgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKGNvbnN0IEF1
dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7CisgICAgdm9pZCByZWNlaXZlZENyZWRlbnRpYWwoY29u
c3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmLCBjb25zdCBDcmVkZW50aWFsJik7CisgICAgdm9p
ZCByZWNlaXZlZFJlcXVlc3RUb0NvbnRpbnVlV2l0aG91dENyZWRlbnRpYWwoY29uc3QgQXV0aGVu
dGljYXRpb25DaGFsbGVuZ2UmKTsKKyAgICB2b2lkIHJlY2VpdmVkQ2FuY2VsbGF0aW9uKGNvbnN0
IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7CisgICAgdm9pZCByZWNlaXZlZFJlcXVlc3RUb1Bl
cmZvcm1EZWZhdWx0SGFuZGxpbmcoY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKTsKKyAg
ICB2b2lkIHJlY2VpdmVkQ2hhbGxlbmdlUmVqZWN0aW9uKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlJik7CisKKyAgICBjbGFzcyBTb2NrZXREYXRhIHsKKyAgICBwdWJsaWM6CisgICAgICAg
IFNvY2tldERhdGEoY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUpCisgICAgICAgICAgICA6IG1f
ZGF0YShkYXRhKQorICAgICAgICAgICAgLCBtX3NpemUoc2l6ZSkKKyAgICAgICAgeworICAgICAg
ICB9CisKKyAgICAgICAgU29ja2V0RGF0YShTb2NrZXREYXRhJiYgb3RoZXIpCisgICAgICAgIHsK
KyAgICAgICAgICAgIG1fZGF0YSA9IFdURjo6bW92ZShvdGhlci5tX2RhdGEpOworICAgICAgICAg
ICAgbV9zaXplID0gb3RoZXIubV9zaXplOworICAgICAgICAgICAgb3RoZXIubV9zaXplID0gMDsK
KyAgICAgICAgfQorCisgICAgICAgIH5Tb2NrZXREYXRhKCkKKyAgICAgICAgeworICAgICAgICB9
CisKKyAgICAgICAgY29uc3QgY2hhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5nZXQo
KTsgfQorICAgICAgICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQorCisgICAg
cHJpdmF0ZToKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IGNoYXJbXT4gbV9kYXRhOwor
ICAgICAgICBpbnQgbV9zaXplOwogICAgIH07CiAKLX0gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCisg
ICAgVGhyZWFkSWRlbnRpZmllciBtX3dvcmtlclRocmVhZCB7IDAgfTsKKyAgICBib29sIG1fc3Rv
cFRocmVhZCB7IGZhbHNlIH07CisgICAgc3RkOjptdXRleCBtX211dGV4U2VuZDsKKyAgICBzdGQ6
Om11dGV4IG1fbXV0ZXhSZWNlaXZlOworICAgIFZlY3RvcjxTb2NrZXREYXRhPiBtX3NlbmREYXRh
OworICAgIFZlY3RvcjxTb2NrZXREYXRhPiBtX3JlY2VpdmVEYXRhOworfTsKKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQogCi0jZW5kaWYgIC8vIFNvY2tldFN0cmVhbUhhbmRsZV9oCisjZW5kaWYg
Ly8gU29ja2V0U3RyZWFtSGFuZGxlX2gKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVDdXJsLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlQ3VybC5j
cHAJKHJldmlzaW9uIDE4Mzk0MSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y3VybC9Tb2NrZXRTdHJlYW1IYW5kbGVDdXJsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsMTAg
KzM0LDEyIEBACiAKICNpZiBVU0UoQ1VSTCkKIAotI2luY2x1ZGUgIlVSTC5oIgogI2luY2x1ZGUg
IkxvZ2dpbmcuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlNvY2tl
dFN0cmVhbUhhbmRsZUNsaWVudC5oIgorI2luY2x1ZGUgIlVSTC5oIgorI2luY2x1ZGUgPHd0Zi9N
YWluVGhyZWFkLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKQEAgLTQ1LDI3ICs0NywyMDcgQEAgU29ja2V0U3RyZWFtSGFuZGxlOjpTb2Nr
ZXRTdHJlYW1IYW5kbGUoYwogICAgIDogU29ja2V0U3RyZWFtSGFuZGxlQmFzZSh1cmwsIGNsaWVu
dCkKIHsKICAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBuZXcgY2xpZW50
ICVwIiwgdGhpcywgbV9jbGllbnQpOwotICAgIG5vdEltcGxlbWVudGVkKCk7CisKKyAgICBzdGFy
dFRocmVhZCgpOwogfQogCiBTb2NrZXRTdHJlYW1IYW5kbGU6On5Tb2NrZXRTdHJlYW1IYW5kbGUo
KQogewogICAgIExPRyhOZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxlICVwIGRlbGV0ZSIsIHRo
aXMpOwotICAgIHNldENsaWVudCgwKTsKLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHN0b3BU
aHJlYWQoKTsKKyAgICBzZXRDbGllbnQobnVsbHB0cik7CiB9CiAKLWludCBTb2NrZXRTdHJlYW1I
YW5kbGU6OnBsYXRmb3JtU2VuZChjb25zdCBjaGFyKiwgaW50KQoraW50IFNvY2tldFN0cmVhbUhh
bmRsZTo6cGxhdGZvcm1TZW5kKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCiB7CiAgICAg
TE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgcGxhdGZvcm1TZW5kIiwgdGhpcyk7
Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKKworICAgIEFTU0VSVChpc01h
aW5UaHJlYWQoKSk7CisKKyAgICBzdGFydFRocmVhZCgpOworCisgICAgY2hhciogY29weSA9IG5l
dyBjaGFyW2xlbmd0aF07CisgICAgbWVtY3B5KGNvcHksIGRhdGEsIGxlbmd0aCk7CisKKyAgICBz
dGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX211dGV4U2VuZCk7CisgICAgbV9zZW5k
RGF0YS5hcHBlbmQoU29ja2V0RGF0YShjb3B5LCBsZW5ndGgpKTsKKyAgICByZXR1cm4gbGVuZ3Ro
OwogfQogCiB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1DbG9zZSgpCiB7CiAgICAg
TE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgcGxhdGZvcm1DbG9zZSIsIHRoaXMp
OwotICAgIG5vdEltcGxlbWVudGVkKCk7CisKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwor
CisgICAgc3RvcFRocmVhZCgpOworCisgICAgaWYgKG1fY2xpZW50KQorICAgICAgICBtX2NsaWVu
dC0+ZGlkQ2xvc2VTb2NrZXRTdHJlYW0odGhpcyk7Cit9CisKK2Jvb2wgU29ja2V0U3RyZWFtSGFu
ZGxlOjpyZWFkRGF0YShDVVJMKiBjdXJsSGFuZGxlKQoreworICAgIEFTU0VSVCghaXNNYWluVGhy
ZWFkKCkpOworCisgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSAxMDI0OworICAgIHN0ZDo6dW5p
cXVlX3B0cjxjaGFyW10+IGRhdGEobmV3IGNoYXJbYnVmZmVyU2l6ZV0pOworICAgIHNpemVfdCBi
eXRlc1JlYWQgPSAwOworCisgICAgQ1VSTGNvZGUgcmV0ID0gY3VybF9lYXN5X3JlY3YoY3VybEhh
bmRsZSwgZGF0YS5nZXQoKSwgYnVmZmVyU2l6ZSwgJmJ5dGVzUmVhZCk7CisKKyAgICBpZiAocmV0
ID09IENVUkxFX09LICYmIGJ5dGVzUmVhZCA+PSAwKSB7CisgICAgICAgIG1fbXV0ZXhSZWNlaXZl
LmxvY2soKTsKKyAgICAgICAgbV9yZWNlaXZlRGF0YS5hcHBlbmQoU29ja2V0RGF0YShkYXRhLnJl
bGVhc2UoKSwgYnl0ZXNSZWFkKSk7CisgICAgICAgIG1fbXV0ZXhSZWNlaXZlLnVubG9jaygpOwor
CisgICAgICAgIHJlZigpOworCisgICAgICAgIGNhbGxPbk1haW5UaHJlYWQoW3RoaXNdIHsKKyAg
ICAgICAgICAgIGRpZFJlY2VpdmVEYXRhKCk7CisgICAgICAgICAgICBkZXJlZigpOworICAgICAg
ICB9KTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAocmV0ID09IENV
UkxFX0FHQUlOKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKK30K
KworYm9vbCBTb2NrZXRTdHJlYW1IYW5kbGU6OnNlbmREYXRhKENVUkwqIGN1cmxIYW5kbGUpCit7
CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3Rk
OjptdXRleD4gbG9jayhtX211dGV4U2VuZCk7CisgICAgd2hpbGUgKG1fc2VuZERhdGEuc2l6ZSgp
KSB7CisgICAgICAgIGF1dG8gc2VuZERhdGEgPSBXVEY6Om1vdmUobV9zZW5kRGF0YS5hdCgwKSk7
CisgICAgICAgIG1fc2VuZERhdGEucmVtb3ZlKDApOworCisgICAgICAgIGludCB0b3RhbEJ5dGVz
U2VudCA9IDA7CisgICAgICAgIHdoaWxlICh0b3RhbEJ5dGVzU2VudCA8IHNlbmREYXRhLnNpemUo
KSkgeworICAgICAgICAgICAgc2l6ZV90IGJ5dGVzU2VudCA9IDA7CisgICAgICAgICAgICBDVVJM
Y29kZSByZXQgPSBjdXJsX2Vhc3lfc2VuZChjdXJsSGFuZGxlLCBzZW5kRGF0YS5kYXRhKCkgKyB0
b3RhbEJ5dGVzU2VudCwgc2VuZERhdGEuc2l6ZSgpIC0gdG90YWxCeXRlc1NlbnQsICZieXRlc1Nl
bnQpOworICAgICAgICAgICAgaWYgKHJldCA9PSBDVVJMRV9PSykKKyAgICAgICAgICAgICAgICB0
b3RhbEJ5dGVzU2VudCArPSBieXRlc1NlbnQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnNlcnQgcmVtYWluaW5nIGRh
dGEgaW50byBzZW5kIHF1ZXVlLgorCisgICAgICAgIGlmICh0b3RhbEJ5dGVzU2VudCA8IHNlbmRE
YXRhLnNpemUoKSkgeworICAgICAgICAgICAgY29uc3QgaW50IHJlc3RMZW5ndGggPSBzZW5kRGF0
YS5zaXplKCkgLSB0b3RhbEJ5dGVzU2VudDsKKyAgICAgICAgICAgIGNoYXIqIGNvcHkgPSBuZXcg
Y2hhcltyZXN0TGVuZ3RoXTsKKyAgICAgICAgICAgIG1lbWNweShjb3B5LCBzZW5kRGF0YS5kYXRh
KCkgKyB0b3RhbEJ5dGVzU2VudCwgcmVzdExlbmd0aCk7CisgICAgICAgICAgICBtX3NlbmREYXRh
Lmluc2VydCgwLCBTb2NrZXREYXRhKGNvcHksIHJlc3RMZW5ndGgpKTsKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBTb2NrZXRTdHJlYW1IYW5kbGU6OndhaXRGb3JBdmFpbGFibGVEYXRhKENVUkwqIGN1cmxIYW5k
bGUsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgc2VsZWN0VGltZW91dCkKK3sKKyAgICBBU1NF
UlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAg
dGltZW91dC50dl9zZWMgPSAwOworICAgIHRpbWVvdXQudHZfdXNlYyA9IHN0ZDo6Y2hyb25vOjpk
dXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KHNlbGVjdFRpbWVvdXQpLmNv
dW50KCk7CisKKyAgICBsb25nIHNvY2tldDsKKyAgICBpZiAoY3VybF9lYXN5X2dldGluZm8oY3Vy
bEhhbmRsZSwgQ1VSTElORk9fTEFTVFNPQ0tFVCwgJnNvY2tldCkgIT0gQ1VSTEVfT0spCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGZkX3NldCBmZHJlYWQ7CisgICAgRkRfWkVSTygmZmRy
ZWFkKTsKKyAgICBGRF9TRVQoc29ja2V0LCAmZmRyZWFkKTsKKyAgICBpbnQgcmMgPSA6OnNlbGVj
dCgwLCAmZmRyZWFkLCBudWxscHRyLCBudWxscHRyLCAmdGltZW91dCk7CisgICAgcmV0dXJuIHJj
ID09IDE7Cit9CisKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjpzdGFydFRocmVhZCgpCit7Cisg
ICAgaWYgKCFtX3dvcmtlclRocmVhZCkgeworICAgICAgICByZWYoKTsKKyAgICAgICAgbV93b3Jr
ZXJUaHJlYWQgPSBjcmVhdGVUaHJlYWQoIldlYlNvY2tldCB0aHJlYWQiLCBbdGhpc10geworCisg
ICAgICAgICAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgICAgICAgICAgQ1VSTCog
Y3VybEhhbmRsZSA9IGN1cmxfZWFzeV9pbml0KCk7CisKKyAgICAgICAgICAgIGlmICghY3VybEhh
bmRsZSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIENTdHJpbmcgaG9z
dCA9IG1fdXJsLmhvc3QoKS5hc2NpaSgpOworICAgICAgICAgICAgY3VybF9lYXN5X3NldG9wdChj
dXJsSGFuZGxlLCBDVVJMT1BUX1VSTCwgaG9zdC5kYXRhKCkpOworICAgICAgICAgICAgY3VybF9l
YXN5X3NldG9wdChjdXJsSGFuZGxlLCBDVVJMT1BUX1BPUlQsIG1fdXJsLnBvcnQoKSk7CisgICAg
ICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmxIYW5kbGUsIENVUkxPUFRfQ09OTkVDVF9PTkxZ
KTsKKworICAgICAgICAgICAgLy8gQ29ubmVjdCB0byBob3N0CisgICAgICAgICAgICBpZiAoY3Vy
bF9lYXN5X3BlcmZvcm0oY3VybEhhbmRsZSkgIT0gQ1VSTEVfT0spCisgICAgICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgICAgICByZWYoKTsKKworICAgICAgICAgICAgY2FsbE9uTWFpblRo
cmVhZChbdGhpc10geworICAgICAgICAgICAgICAgIGlmIChyZWZDb3VudCgpID4gMSkKKyAgICAg
ICAgICAgICAgICAgICAgZGlkT3BlblNvY2tldCgpOworICAgICAgICAgICAgICAgIGRlcmVmKCk7
CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgd2hpbGUgKCFtX3N0b3BUaHJlYWQpIHsK
KyAgICAgICAgICAgICAgICAvLyBTZW5kIHF1ZXVlZCBkYXRhCisgICAgICAgICAgICAgICAgc2Vu
ZERhdGEoY3VybEhhbmRsZSk7CisKKyAgICAgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHNvY2tl
dCBoYXMgYXZhaWxhYmxlIGRhdGEKKyAgICAgICAgICAgICAgICBpZiAod2FpdEZvckF2YWlsYWJs
ZURhdGEoY3VybEhhbmRsZSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpKQorICAgICAg
ICAgICAgICAgICAgICByZWFkRGF0YShjdXJsSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgY3VybF9lYXN5X2NsZWFudXAoY3VybEhhbmRsZSk7CisgICAgICAgIH0pOworICAg
IH0KK30KKwordm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OnN0b3BUaHJlYWQoKQoreworICAgIGlm
IChtX3dvcmtlclRocmVhZCkgeworICAgICAgICBtX3N0b3BUaHJlYWQgPSB0cnVlOworICAgICAg
ICB3YWl0Rm9yVGhyZWFkQ29tcGxldGlvbihtX3dvcmtlclRocmVhZCk7CisgICAgICAgIG1fd29y
a2VyVGhyZWFkID0gMDsKKyAgICAgICAgZGVyZWYoKTsKKyAgICB9Cit9CisKK3ZvaWQgU29ja2V0
U3RyZWFtSGFuZGxlOjpkaWRSZWNlaXZlRGF0YSgpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVh
ZCgpKTsKKworICAgIG1fbXV0ZXhSZWNlaXZlLmxvY2soKTsKKworICAgIGF1dG8gcmVjZWl2ZURh
dGEgPSBXVEY6Om1vdmUobV9yZWNlaXZlRGF0YSk7CisKKyAgICBtX211dGV4UmVjZWl2ZS51bmxv
Y2soKTsKKworICAgIGZvciAoYXV0byYgc29ja2V0RGF0YSA6IHJlY2VpdmVEYXRhKSB7CisgICAg
ICAgIGlmIChzb2NrZXREYXRhLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChtX2NsaWVu
dCAmJiBzdGF0ZSgpID09IE9wZW4pCisgICAgICAgICAgICAgICAgbV9jbGllbnQtPmRpZFJlY2Vp
dmVTb2NrZXRTdHJlYW1EYXRhKHRoaXMsIHNvY2tldERhdGEuZGF0YSgpLCBzb2NrZXREYXRhLnNp
emUoKSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcGxhdGZvcm1DbG9zZSgpOworICAg
IH0KK30KKwordm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OmRpZE9wZW5Tb2NrZXQoKQoreworICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBtX3N0YXRlID0gT3BlbjsKKyAgICBpZiAo
bV9jbGllbnQpCisgICAgICAgIG1fY2xpZW50LT5kaWRPcGVuU29ja2V0U3RyZWFtKHRoaXMpOwog
fQogCiB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6ZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJikKQEAgLTk4LDYgKzI4MCw2IEBA
IHZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjpyZWNlaXZlZENoYWxsZW4KICAgICBub3RJbXBsZW1l
bnRlZCgpOwogfQogCi19ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQorfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQogCiAjZW5kaWYK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>252729</attachid>
            <date>2015-05-08 10:26:11 -0700</date>
            <delta_ts>2015-05-11 11:50:39 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-144628-20150508192438.patch</filename>
            <type>text/plain</type>
            <size>11941</size>
            <attacher>peavo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4Mzk5NSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI5IEBACisyMDE1LTA1LTA4ICBQZXIgQXJu
ZSBWb2xsYW4gIDxwZWF2b0BvdXRsb29rLmNvbT4KKworICAgICAgICBbQ3VybF0gV2ViU29ja2V0
IHBsYXRmb3JtIHBhcnQgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0NjI4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIEN1cmwgcGxhdGZvcm0gY29kZSBpbXBsZW1l
bnRhdGlvbiBmb3IgV2ViU29ja2V0cy4KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9Tb2NrZXRTdHJlYW1IYW5kbGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhh
bmRsZTo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6U29j
a2V0RGF0YTo6ZGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OlNv
Y2tldERhdGE6OnNpemUpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRT
dHJlYW1IYW5kbGVDdXJsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRs
ZTo6U29ja2V0U3RyZWFtSGFuZGxlKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhh
bmRsZTo6flNvY2tldFN0cmVhbUhhbmRsZSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJl
YW1IYW5kbGU6OnBsYXRmb3JtU2VuZCk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1I
YW5kbGU6OnBsYXRmb3JtQ2xvc2UpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFu
ZGxlOjpyZWFkRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OnNl
bmREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6d2FpdEZvckF2
YWlsYWJsZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpzdGFy
dFRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OnN0b3BUaHJl
YWQpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpkaWRSZWNlaXZlRGF0
YSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OmRpZE9wZW5Tb2NrZXQp
OgorCiAyMDE1LTA1LTA4ICBYYWJpZXIgUm9kcmlndWV6IENhbHZhciAgPGNhbHZhcmlzQGlnYWxp
YS5jb20+IGFuZCBZb3Vlbm4gRmFibGV0IDx5b3Vlbm4uZmFibGV0QGNyZi5jYW5vbi5mcj4KIAog
ICAgICAgICBbU3RyZWFtcyBBUEldIFJlYWRhYmxlU3RyZWFtIGNvbnN0cnVjdG9yIHN0YXJ0IGZ1
bmN0aW9uIHNob3VsZCBiZSBhYmxlIHRvIGVycm9yIHRoZSBzdHJlYW0KSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGUuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFt
SGFuZGxlLmgJKHJldmlzaW9uIDE4Mzk5NSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGUuaAkod29ya2luZyBjb3B5KQpAQCAtMzQsMzcg
KzM0LDcxIEBACiAKICNpbmNsdWRlICJTb2NrZXRTdHJlYW1IYW5kbGVCYXNlLmgiCiAKLSNpbmNs
dWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2lmIFBMQVRGT1JNKFdJTikKKyNpbmNsdWRlIDx3aW5k
b3dzLmg+CisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3VybC9j
dXJsLmg+CisKKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPHd0Zi9EZXF1ZS5oPgogI2lu
Y2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKLSAgICBjbGFzcyBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZTsK
LSAgICBjbGFzcyBDcmVkZW50aWFsOwotICAgIGNsYXNzIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVu
dDsKLQotICAgIGNsYXNzIFNvY2tldFN0cmVhbUhhbmRsZSA6IHB1YmxpYyBSZWZDb3VudGVkPFNv
Y2tldFN0cmVhbUhhbmRsZT4sIHB1YmxpYyBTb2NrZXRTdHJlYW1IYW5kbGVCYXNlIHsKLSAgICBw
dWJsaWM6Ci0gICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNvY2tldFN0cmVhbUhhbmRsZT4gY3Jl
YXRlKGNvbnN0IFVSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQqIGNsaWVudCkgeyBy
ZXR1cm4gYWRvcHRSZWYobmV3IFNvY2tldFN0cmVhbUhhbmRsZSh1cmwsIGNsaWVudCkpOyB9Ci0K
LSAgICAgICAgdmlydHVhbCB+U29ja2V0U3RyZWFtSGFuZGxlKCk7Ci0KLSAgICBwcm90ZWN0ZWQ6
Ci0gICAgICAgIHZpcnR1YWwgaW50IHBsYXRmb3JtU2VuZChjb25zdCBjaGFyKiBkYXRhLCBpbnQg
bGVuZ3RoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHBsYXRmb3JtQ2xvc2UoKTsKLQotICAgIHBy
aXZhdGU6Ci0gICAgICAgIFNvY2tldFN0cmVhbUhhbmRsZShjb25zdCBVUkwmLCBTb2NrZXRTdHJl
YW1IYW5kbGVDbGllbnQqKTsKLQotICAgICAgICAvLyBObyBhdXRoZW50aWNhdGlvbiBmb3Igc3Ry
ZWFtcyBwZXIgc2UsIGJ1dCBwcm94eSBtYXkgYXNrIGZvciBjcmVkZW50aWFscy4KLSAgICAgICAg
dm9pZCBkaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoY29uc3QgQXV0aGVudGljYXRp
b25DaGFsbGVuZ2UmKTsKLSAgICAgICAgdm9pZCByZWNlaXZlZENyZWRlbnRpYWwoY29uc3QgQXV0
aGVudGljYXRpb25DaGFsbGVuZ2UmLCBjb25zdCBDcmVkZW50aWFsJik7Ci0gICAgICAgIHZvaWQg
cmVjZWl2ZWRSZXF1ZXN0VG9Db250aW51ZVdpdGhvdXRDcmVkZW50aWFsKGNvbnN0IEF1dGhlbnRp
Y2F0aW9uQ2hhbGxlbmdlJik7Ci0gICAgICAgIHZvaWQgcmVjZWl2ZWRDYW5jZWxsYXRpb24oY29u
c3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKTsKLSAgICAgICAgdm9pZCByZWNlaXZlZFJlcXVl
c3RUb1BlcmZvcm1EZWZhdWx0SGFuZGxpbmcoY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2Um
KTsKLSAgICAgICAgdm9pZCByZWNlaXZlZENoYWxsZW5nZVJlamVjdGlvbihjb25zdCBBdXRoZW50
aWNhdGlvbkNoYWxsZW5nZSYpOworY2xhc3MgQXV0aGVudGljYXRpb25DaGFsbGVuZ2U7CitjbGFz
cyBDcmVkZW50aWFsOworY2xhc3MgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50OworCitjbGFzcyBT
b2NrZXRTdHJlYW1IYW5kbGUgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8U29ja2V0U3Ry
ZWFtSGFuZGxlPiwgcHVibGljIFNvY2tldFN0cmVhbUhhbmRsZUJhc2UgeworcHVibGljOgorICAg
IHN0YXRpYyBSZWY8U29ja2V0U3RyZWFtSGFuZGxlPiBjcmVhdGUoY29uc3QgVVJMJiB1cmwsIFNv
Y2tldFN0cmVhbUhhbmRsZUNsaWVudCogY2xpZW50KSB7IHJldHVybiBhZG9wdFJlZigqbmV3IFNv
Y2tldFN0cmVhbUhhbmRsZSh1cmwsIGNsaWVudCkpOyB9CisKKyAgICB2aXJ0dWFsIH5Tb2NrZXRT
dHJlYW1IYW5kbGUoKTsKKworcHJpdmF0ZToKKyAgICBTb2NrZXRTdHJlYW1IYW5kbGUoY29uc3Qg
VVJMJiwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50Kik7CisKKyAgICBpbnQgcGxhdGZvcm1TZW5k
KGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpIG92ZXJyaWRlOworICAgIHZvaWQgcGxhdGZv
cm1DbG9zZSgpIG92ZXJyaWRlOworCisgICAgYm9vbCByZWFkRGF0YShDVVJMKik7CisgICAgYm9v
bCBzZW5kRGF0YShDVVJMKik7CisgICAgYm9vbCB3YWl0Rm9yQXZhaWxhYmxlRGF0YShDVVJMKiwg
c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBzZWxlY3RUaW1lb3V0KTsKKworICAgIHZvaWQgc3Rh
cnRUaHJlYWQoKTsKKyAgICB2b2lkIHN0b3BUaHJlYWQoKTsKKworICAgIHZvaWQgZGlkUmVjZWl2
ZURhdGEoKTsKKyAgICB2b2lkIGRpZE9wZW5Tb2NrZXQoKTsKKworICAgIC8vIE5vIGF1dGhlbnRp
Y2F0aW9uIGZvciBzdHJlYW1zIHBlciBzZSwgYnV0IHByb3h5IG1heSBhc2sgZm9yIGNyZWRlbnRp
YWxzLgorICAgIHZvaWQgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKGNvbnN0IEF1
dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7CisgICAgdm9pZCByZWNlaXZlZENyZWRlbnRpYWwoY29u
c3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmLCBjb25zdCBDcmVkZW50aWFsJik7CisgICAgdm9p
ZCByZWNlaXZlZFJlcXVlc3RUb0NvbnRpbnVlV2l0aG91dENyZWRlbnRpYWwoY29uc3QgQXV0aGVu
dGljYXRpb25DaGFsbGVuZ2UmKTsKKyAgICB2b2lkIHJlY2VpdmVkQ2FuY2VsbGF0aW9uKGNvbnN0
IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7CisgICAgdm9pZCByZWNlaXZlZFJlcXVlc3RUb1Bl
cmZvcm1EZWZhdWx0SGFuZGxpbmcoY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKTsKKyAg
ICB2b2lkIHJlY2VpdmVkQ2hhbGxlbmdlUmVqZWN0aW9uKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlJik7CisKKyAgICBzdHJ1Y3QgU29ja2V0RGF0YSB7CisgICAgICAgIGNvbnN0IGNoYXIq
IGRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuZ2V0KCk7IH0KKyAgICAgICAgaW50IHNpemUo
KSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29u
c3QgY2hhcltdPiBtX2RhdGE7CisgICAgICAgIGludCBtX3NpemU7CiAgICAgfTsKIAotfSAgLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKyAgICBUaHJlYWRJZGVudGlmaWVyIG1fd29ya2VyVGhyZWFkIHsg
MCB9OworICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1fc3RvcFRocmVhZCB7IGZhbHNlIH07CisgICAg
c3RkOjptdXRleCBtX211dGV4U2VuZDsKKyAgICBzdGQ6Om11dGV4IG1fbXV0ZXhSZWNlaXZlOwor
ICAgIERlcXVlPHN0ZDo6dW5pcXVlX3B0cjxTb2NrZXREYXRhPj4gbV9zZW5kRGF0YTsKKyAgICBE
ZXF1ZTxzdGQ6OnVuaXF1ZV9wdHI8U29ja2V0RGF0YT4+IG1fcmVjZWl2ZURhdGE7Cit9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKLSNlbmRpZiAgLy8gU29ja2V0U3RyZWFtSGFuZGxlX2gK
KyNlbmRpZiAvLyBTb2NrZXRTdHJlYW1IYW5kbGVfaApJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUN1cmwuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5k
bGVDdXJsLmNwcAkocmV2aXNpb24gMTgzOTk1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUN1cmwuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0zNCwxMCArMzQsMTIgQEAKIAogI2lmIFVTRShDVVJMKQogCi0jaW5jbHVkZSAiVVJMLmgiCiAj
aW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVk
ZSAiU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50LmgiCisjaW5jbHVkZSAiVVJMLmgiCisjaW5jbHVk
ZSA8d3RmL01haW5UaHJlYWQuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAKIG5h
bWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNDUsMjcgKzQ3LDIxMSBAQCBTb2NrZXRTdHJlYW1IYW5k
bGU6OlNvY2tldFN0cmVhbUhhbmRsZShjCiAgICAgOiBTb2NrZXRTdHJlYW1IYW5kbGVCYXNlKHVy
bCwgY2xpZW50KQogewogICAgIExPRyhOZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxlICVwIG5l
dyBjbGllbnQgJXAiLCB0aGlzLCBtX2NsaWVudCk7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKwor
ICAgIHN0YXJ0VGhyZWFkKCk7CiB9CiAKIFNvY2tldFN0cmVhbUhhbmRsZTo6flNvY2tldFN0cmVh
bUhhbmRsZSgpCiB7CiAgICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAgZGVs
ZXRlIiwgdGhpcyk7Ci0gICAgc2V0Q2xpZW50KDApOwotICAgIG5vdEltcGxlbWVudGVkKCk7Cisg
ICAgc3RvcFRocmVhZCgpOworICAgIHNldENsaWVudChudWxscHRyKTsKIH0KIAotaW50IFNvY2tl
dFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1TZW5kKGNvbnN0IGNoYXIqLCBpbnQpCitpbnQgU29ja2V0
U3RyZWFtSGFuZGxlOjpwbGF0Zm9ybVNlbmQoY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCkK
IHsKICAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBwbGF0Zm9ybVNlbmQi
LCB0aGlzKTsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVybiAwOworCisgICAgQVNT
RVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIHN0YXJ0VGhyZWFkKCk7CisKKyAgICBzdGQ6OnVu
aXF1ZV9wdHI8Y29uc3QgY2hhcltdPiBjb3B5KG5ldyBjb25zdCBjaGFyW2xlbmd0aF0pOworICAg
IG1lbWNweShjb25zdF9jYXN0PGNoYXIqPihjb3B5LmdldCgpKSwgZGF0YSwgbGVuZ3RoKTsKKwor
ICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fbXV0ZXhTZW5kKTsKKyAgICBt
X3NlbmREYXRhLmFwcGVuZChzdGQ6OnVuaXF1ZV9wdHI8U29ja2V0RGF0YT4obmV3IFNvY2tldERh
dGEgeyBXVEY6Om1vdmUoY29weSksIGxlbmd0aCB9ICkpOworICAgIHJldHVybiBsZW5ndGg7CiB9
CiAKIHZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjpwbGF0Zm9ybUNsb3NlKCkKIHsKICAgICBMT0co
TmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBwbGF0Zm9ybUNsb3NlIiwgdGhpcyk7Ci0g
ICAgbm90SW1wbGVtZW50ZWQoKTsKKworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAg
ICBzdG9wVGhyZWFkKCk7CisKKyAgICBpZiAobV9jbGllbnQpCisgICAgICAgIG1fY2xpZW50LT5k
aWRDbG9zZVNvY2tldFN0cmVhbSh0aGlzKTsKK30KKworYm9vbCBTb2NrZXRTdHJlYW1IYW5kbGU6
OnJlYWREYXRhKENVUkwqIGN1cmxIYW5kbGUpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQo
KSk7CisKKyAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IDEwMjQ7CisgICAgc3RkOjp1bmlxdWVf
cHRyPGNvbnN0IGNoYXJbXT4gZGF0YShuZXcgY29uc3QgY2hhcltidWZmZXJTaXplXSk7CisgICAg
c2l6ZV90IGJ5dGVzUmVhZCA9IDA7CisKKyAgICBDVVJMY29kZSByZXQgPSBjdXJsX2Vhc3lfcmVj
dihjdXJsSGFuZGxlLCBjb25zdF9jYXN0PGNoYXIqPihkYXRhLmdldCgpKSwgYnVmZmVyU2l6ZSwg
JmJ5dGVzUmVhZCk7CisKKyAgICBpZiAocmV0ID09IENVUkxFX09LICYmIGJ5dGVzUmVhZCA+PSAw
KSB7CisgICAgICAgIG1fbXV0ZXhSZWNlaXZlLmxvY2soKTsKKyAgICAgICAgbV9yZWNlaXZlRGF0
YS5hcHBlbmQoc3RkOjp1bmlxdWVfcHRyPFNvY2tldERhdGE+KG5ldyBTb2NrZXREYXRhIHsgV1RG
Ojptb3ZlKGRhdGEpLCBieXRlc1JlYWQgfSApKTsKKyAgICAgICAgbV9tdXRleFJlY2VpdmUudW5s
b2NrKCk7CisKKyAgICAgICAgcmVmKCk7CisKKyAgICAgICAgY2FsbE9uTWFpblRocmVhZChbdGhp
c10geworICAgICAgICAgICAgZGlkUmVjZWl2ZURhdGEoKTsKKyAgICAgICAgICAgIGRlcmVmKCk7
CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChy
ZXQgPT0gQ1VSTEVfQUdBSU4pCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZh
bHNlOworfQorCitib29sIFNvY2tldFN0cmVhbUhhbmRsZTo6c2VuZERhdGEoQ1VSTCogY3VybEhh
bmRsZSkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIHN0ZDo6bG9ja19n
dWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fbXV0ZXhTZW5kKTsKKyAgICB3aGlsZSAobV9zZW5kRGF0
YS5zaXplKCkpIHsKKyAgICAgICAgYXV0byBzZW5kRGF0YSA9IG1fc2VuZERhdGEudGFrZUZpcnN0
KCk7CisKKyAgICAgICAgaW50IHRvdGFsQnl0ZXNTZW50ID0gMDsKKyAgICAgICAgd2hpbGUgKHRv
dGFsQnl0ZXNTZW50IDwgc2VuZERhdGEtPnNpemUoKSkgeworICAgICAgICAgICAgc2l6ZV90IGJ5
dGVzU2VudCA9IDA7CisgICAgICAgICAgICBDVVJMY29kZSByZXQgPSBjdXJsX2Vhc3lfc2VuZChj
dXJsSGFuZGxlLCBzZW5kRGF0YS0+ZGF0YSgpICsgdG90YWxCeXRlc1NlbnQsIHNlbmREYXRhLT5z
aXplKCkgLSB0b3RhbEJ5dGVzU2VudCwgJmJ5dGVzU2VudCk7CisgICAgICAgICAgICBpZiAocmV0
ID09IENVUkxFX09LKQorICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNTZW50ICs9IGJ5dGVzU2Vu
dDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
CisgICAgICAgIC8vIEluc2VydCByZW1haW5pbmcgZGF0YSBpbnRvIHNlbmQgcXVldWUuCisKKyAg
ICAgICAgaWYgKHRvdGFsQnl0ZXNTZW50IDwgc2VuZERhdGEtPnNpemUoKSkgeworICAgICAgICAg
ICAgY29uc3QgaW50IHJlc3RMZW5ndGggPSBzZW5kRGF0YS0+c2l6ZSgpIC0gdG90YWxCeXRlc1Nl
bnQ7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgY2hhcltdPiBjb3B5KG5ldyBj
b25zdCBjaGFyW3Jlc3RMZW5ndGhdKTsKKyAgICAgICAgICAgIG1lbWNweShjb25zdF9jYXN0PGNo
YXIqPihjb3B5LmdldCgpKSwgc2VuZERhdGEtPmRhdGEoKSArIHRvdGFsQnl0ZXNTZW50LCByZXN0
TGVuZ3RoKTsKKyAgICAgICAgICAgIG1fc2VuZERhdGEucHJlcGVuZChzdGQ6OnVuaXF1ZV9wdHI8
U29ja2V0RGF0YT4obmV3IFNvY2tldERhdGEgeyBXVEY6Om1vdmUoY29weSksIHJlc3RMZW5ndGgg
fSApKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IHJldHVybiB0cnVlOworfQorCitib29sIFNvY2tldFN0cmVhbUhhbmRsZTo6d2FpdEZvckF2YWls
YWJsZURhdGEoQ1VSTCogY3VybEhhbmRsZSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBzZWxl
Y3RUaW1lb3V0KQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisgICAgc3RydWN0
IHRpbWV2YWwgdGltZW91dDsKKyAgICB0aW1lb3V0LnR2X3NlYyA9IDA7CisgICAgdGltZW91dC50
dl91c2VjID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pY3Jvc2Vj
b25kcz4oc2VsZWN0VGltZW91dCkuY291bnQoKTsKKworICAgIGxvbmcgc29ja2V0OworICAgIGlm
IChjdXJsX2Vhc3lfZ2V0aW5mbyhjdXJsSGFuZGxlLCBDVVJMSU5GT19MQVNUU09DS0VULCAmc29j
a2V0KSAhPSBDVVJMRV9PSykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZmRfc2V0IGZk
cmVhZDsKKyAgICBGRF9aRVJPKCZmZHJlYWQpOworICAgIEZEX1NFVChzb2NrZXQsICZmZHJlYWQp
OworICAgIGludCByYyA9IDo6c2VsZWN0KDAsICZmZHJlYWQsIG51bGxwdHIsIG51bGxwdHIsICZ0
aW1lb3V0KTsKKyAgICByZXR1cm4gcmMgPT0gMTsKK30KKwordm9pZCBTb2NrZXRTdHJlYW1IYW5k
bGU6OnN0YXJ0VGhyZWFkKCkKK3sKKyAgICBpZiAobV93b3JrZXJUaHJlYWQpCisgICAgICAgIHJl
dHVybjsKKworICAgIHJlZigpOyAvLyBzdG9wVGhyZWFkKCkgd2lsbCBjYWxsIGRlcmVmKCkuCisK
KyAgICBtX3dvcmtlclRocmVhZCA9IGNyZWF0ZVRocmVhZCgiV2ViU29ja2V0IHRocmVhZCIsIFt0
aGlzXSB7CisKKyAgICAgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICAgICAgQ1VS
TCogY3VybEhhbmRsZSA9IGN1cmxfZWFzeV9pbml0KCk7CisKKyAgICAgICAgaWYgKCFjdXJsSGFu
ZGxlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIENTdHJpbmcgaG9zdCA9IG1fdXJs
Lmhvc3QoKS51dGY4KCk7CisgICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybEhhbmRsZSwgQ1VS
TE9QVF9VUkwsIGhvc3QuZGF0YSgpKTsKKyAgICAgICAgY3VybF9lYXN5X3NldG9wdChjdXJsSGFu
ZGxlLCBDVVJMT1BUX1BPUlQsIG1fdXJsLnBvcnQoKSk7CisgICAgICAgIGN1cmxfZWFzeV9zZXRv
cHQoY3VybEhhbmRsZSwgQ1VSTE9QVF9DT05ORUNUX09OTFkpOworCisgICAgICAgIC8vIENvbm5l
Y3QgdG8gaG9zdAorICAgICAgICBpZiAoY3VybF9lYXN5X3BlcmZvcm0oY3VybEhhbmRsZSkgIT0g
Q1VSTEVfT0spCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcmVmKCk7CisKKyAgICAg
ICAgY2FsbE9uTWFpblRocmVhZChbdGhpc10geworICAgICAgICAgICAgaWYgKHJlZkNvdW50KCkg
PiAxKQorICAgICAgICAgICAgICAgIGRpZE9wZW5Tb2NrZXQoKTsKKyAgICAgICAgICAgIGRlcmVm
KCk7CisgICAgICAgIH0pOworCisgICAgICAgIHdoaWxlICghbV9zdG9wVGhyZWFkKSB7CisgICAg
ICAgICAgICAvLyBTZW5kIHF1ZXVlZCBkYXRhCisgICAgICAgICAgICBzZW5kRGF0YShjdXJsSGFu
ZGxlKTsKKworICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBzb2NrZXQgaGFzIGF2YWlsYWJsZSBk
YXRhCisgICAgICAgICAgICBpZiAod2FpdEZvckF2YWlsYWJsZURhdGEoY3VybEhhbmRsZSwgc3Rk
OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpKQorICAgICAgICAgICAgICAgIHJlYWREYXRhKGN1
cmxIYW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgY3VybF9lYXN5X2NsZWFudXAoY3VybEhh
bmRsZSk7CisgICAgfSk7Cit9CisKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjpzdG9wVGhyZWFk
KCkKK3sKKyAgICBpZiAoIW1fd29ya2VyVGhyZWFkKQorICAgICAgICByZXR1cm47CisKKyAgICBt
X3N0b3BUaHJlYWQgPSB0cnVlOworICAgIHdhaXRGb3JUaHJlYWRDb21wbGV0aW9uKG1fd29ya2Vy
VGhyZWFkKTsKKyAgICBtX3dvcmtlclRocmVhZCA9IDA7CisgICAgZGVyZWYoKTsKK30KKwordm9p
ZCBTb2NrZXRTdHJlYW1IYW5kbGU6OmRpZFJlY2VpdmVEYXRhKCkKK3sKKyAgICBBU1NFUlQoaXNN
YWluVGhyZWFkKCkpOworCisgICAgbV9tdXRleFJlY2VpdmUubG9jaygpOworCisgICAgYXV0byBy
ZWNlaXZlRGF0YSA9IFdURjo6bW92ZShtX3JlY2VpdmVEYXRhKTsKKworICAgIG1fbXV0ZXhSZWNl
aXZlLnVubG9jaygpOworCisgICAgZm9yIChhdXRvJiBzb2NrZXREYXRhIDogcmVjZWl2ZURhdGEp
IHsKKyAgICAgICAgaWYgKHNvY2tldERhdGEtPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGlm
IChtX2NsaWVudCAmJiBzdGF0ZSgpID09IE9wZW4pCisgICAgICAgICAgICAgICAgbV9jbGllbnQt
PmRpZFJlY2VpdmVTb2NrZXRTdHJlYW1EYXRhKHRoaXMsIHNvY2tldERhdGEtPmRhdGEoKSwgc29j
a2V0RGF0YS0+c2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwbGF0Zm9ybUNs
b3NlKCk7CisgICAgfQorfQorCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6ZGlkT3BlblNvY2tl
dCgpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIG1fc3RhdGUgPSBPcGVu
OworCisgICAgaWYgKG1fY2xpZW50KQorICAgICAgICBtX2NsaWVudC0+ZGlkT3BlblNvY2tldFN0
cmVhbSh0aGlzKTsKIH0KIAogdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OmRpZFJlY2VpdmVBdXRo
ZW50aWNhdGlvbkNoYWxsZW5nZShjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpCkBAIC05
OCw2ICsyODQsNiBAQCB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6cmVjZWl2ZWRDaGFsbGVuCiAg
ICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAotfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>252878</attachid>
            <date>2015-05-11 11:50:48 -0700</date>
            <delta_ts>2015-05-13 03:53:49 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-144628-20150511204923.patch</filename>
            <type>text/plain</type>
            <size>12499</size>
            <attacher>peavo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4NDExMSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI5IEBACisyMDE1LTA1LTExICBQZXIgQXJu
ZSBWb2xsYW4gIDxwZWF2b0BvdXRsb29rLmNvbT4KKworICAgICAgICBbQ3VybF0gV2ViU29ja2V0
IHBsYXRmb3JtIHBhcnQgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0NjI4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIEN1cmwgcGxhdGZvcm0gY29kZSBpbXBsZW1l
bnRhdGlvbiBmb3IgV2ViU29ja2V0cy4KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9Tb2NrZXRTdHJlYW1IYW5kbGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhh
bmRsZTo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6U29j
a2V0RGF0YTo6U29ja2V0RGF0YSk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL1Nv
Y2tldFN0cmVhbUhhbmRsZUN1cmwuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFt
SGFuZGxlOjpTb2NrZXRTdHJlYW1IYW5kbGUpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3Ry
ZWFtSGFuZGxlOjp+U29ja2V0U3RyZWFtSGFuZGxlKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tl
dFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1TZW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0
cmVhbUhhbmRsZTo6cGxhdGZvcm1DbG9zZSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJl
YW1IYW5kbGU6OnJlYWREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRs
ZTo6c2VuZERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjp3YWl0
Rm9yQXZhaWxhYmxlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6
OnN0YXJ0VGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6c3Rv
cFRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OmRpZFJlY2Vp
dmVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6ZGlkT3BlblNv
Y2tldCk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OmNyZWF0ZUNvcHkp
OgorCiAyMDE1LTA1LTExICBEYW5pZWwgQmF0ZXMgIDxkYWJhdGVzQGFwcGxlLmNvbT4KIAogICAg
ICAgICBbaU9TXSBDbG9zZSBhbGwgb3BlbiBkYXRhYmFzZXMgaW4gZXhwaXJhdGlvbiBoYW5kbGVy
IG9mIHByb2Nlc3MgYXNzZXJ0aW9uCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZS5oCShyZXZpc2lvbiAx
ODQxMDYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3Ry
ZWFtSGFuZGxlLmgJKHdvcmtpbmcgY29weSkKQEAgLTM0LDM3ICszNCw4MiBAQAogCiAjaW5jbHVk
ZSAiU29ja2V0U3RyZWFtSGFuZGxlQmFzZS5oIgogCi0jaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIu
aD4KKyNpZiBQTEFURk9STShXSU4pCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNlbmRpZgorCisj
aW5jbHVkZSA8Y3VybC9jdXJsLmg+CisKKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPHd0
Zi9EZXF1ZS5oPgogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1Ro
cmVhZGluZy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLSAgICBjbGFzcyBBdXRoZW50aWNh
dGlvbkNoYWxsZW5nZTsKLSAgICBjbGFzcyBDcmVkZW50aWFsOwotICAgIGNsYXNzIFNvY2tldFN0
cmVhbUhhbmRsZUNsaWVudDsKLQotICAgIGNsYXNzIFNvY2tldFN0cmVhbUhhbmRsZSA6IHB1Ymxp
YyBSZWZDb3VudGVkPFNvY2tldFN0cmVhbUhhbmRsZT4sIHB1YmxpYyBTb2NrZXRTdHJlYW1IYW5k
bGVCYXNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNvY2tldFN0
cmVhbUhhbmRsZT4gY3JlYXRlKGNvbnN0IFVSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGll
bnQqIGNsaWVudCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IFNvY2tldFN0cmVhbUhhbmRsZSh1cmws
IGNsaWVudCkpOyB9Ci0KLSAgICAgICAgdmlydHVhbCB+U29ja2V0U3RyZWFtSGFuZGxlKCk7Ci0K
LSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHZpcnR1YWwgaW50IHBsYXRmb3JtU2VuZChjb25zdCBj
aGFyKiBkYXRhLCBpbnQgbGVuZ3RoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHBsYXRmb3JtQ2xv
c2UoKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFNvY2tldFN0cmVhbUhhbmRsZShjb25zdCBV
UkwmLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQqKTsKLQotICAgICAgICAvLyBObyBhdXRoZW50
aWNhdGlvbiBmb3Igc3RyZWFtcyBwZXIgc2UsIGJ1dCBwcm94eSBtYXkgYXNrIGZvciBjcmVkZW50
aWFscy4KLSAgICAgICAgdm9pZCBkaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoY29u
c3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKTsKLSAgICAgICAgdm9pZCByZWNlaXZlZENyZWRl
bnRpYWwoY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmLCBjb25zdCBDcmVkZW50aWFsJik7
Ci0gICAgICAgIHZvaWQgcmVjZWl2ZWRSZXF1ZXN0VG9Db250aW51ZVdpdGhvdXRDcmVkZW50aWFs
KGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7Ci0gICAgICAgIHZvaWQgcmVjZWl2ZWRD
YW5jZWxsYXRpb24oY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKTsKLSAgICAgICAgdm9p
ZCByZWNlaXZlZFJlcXVlc3RUb1BlcmZvcm1EZWZhdWx0SGFuZGxpbmcoY29uc3QgQXV0aGVudGlj
YXRpb25DaGFsbGVuZ2UmKTsKLSAgICAgICAgdm9pZCByZWNlaXZlZENoYWxsZW5nZVJlamVjdGlv
bihjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpOworY2xhc3MgQXV0aGVudGljYXRpb25D
aGFsbGVuZ2U7CitjbGFzcyBDcmVkZW50aWFsOworY2xhc3MgU29ja2V0U3RyZWFtSGFuZGxlQ2xp
ZW50OworCitjbGFzcyBTb2NrZXRTdHJlYW1IYW5kbGUgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNv
dW50ZWQ8U29ja2V0U3RyZWFtSGFuZGxlPiwgcHVibGljIFNvY2tldFN0cmVhbUhhbmRsZUJhc2Ug
eworcHVibGljOgorICAgIHN0YXRpYyBSZWY8U29ja2V0U3RyZWFtSGFuZGxlPiBjcmVhdGUoY29u
c3QgVVJMJiB1cmwsIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCogY2xpZW50KSB7IHJldHVybiBh
ZG9wdFJlZigqbmV3IFNvY2tldFN0cmVhbUhhbmRsZSh1cmwsIGNsaWVudCkpOyB9CisKKyAgICB2
aXJ0dWFsIH5Tb2NrZXRTdHJlYW1IYW5kbGUoKTsKKworcHJpdmF0ZToKKyAgICBTb2NrZXRTdHJl
YW1IYW5kbGUoY29uc3QgVVJMJiwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50Kik7CisKKyAgICBp
bnQgcGxhdGZvcm1TZW5kKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpIG92ZXJyaWRlOwor
ICAgIHZvaWQgcGxhdGZvcm1DbG9zZSgpIG92ZXJyaWRlOworCisgICAgYm9vbCByZWFkRGF0YShD
VVJMKik7CisgICAgYm9vbCBzZW5kRGF0YShDVVJMKik7CisgICAgYm9vbCB3YWl0Rm9yQXZhaWxh
YmxlRGF0YShDVVJMKiwgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBzZWxlY3RUaW1lb3V0KTsK
KworICAgIHZvaWQgc3RhcnRUaHJlYWQoKTsKKyAgICB2b2lkIHN0b3BUaHJlYWQoKTsKKworICAg
IHZvaWQgZGlkUmVjZWl2ZURhdGEoKTsKKyAgICB2b2lkIGRpZE9wZW5Tb2NrZXQoKTsKKworICAg
IHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBjaGFyW10+IGNyZWF0ZUNvcHkoY29uc3QgY2hhciogZGF0
YSwgaW50IGxlbmd0aCk7CisKKyAgICAvLyBObyBhdXRoZW50aWNhdGlvbiBmb3Igc3RyZWFtcyBw
ZXIgc2UsIGJ1dCBwcm94eSBtYXkgYXNrIGZvciBjcmVkZW50aWFscy4KKyAgICB2b2lkIGRpZFJl
Y2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5n
ZSYpOworICAgIHZvaWQgcmVjZWl2ZWRDcmVkZW50aWFsKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlJiwgY29uc3QgQ3JlZGVudGlhbCYpOworICAgIHZvaWQgcmVjZWl2ZWRSZXF1ZXN0VG9D
b250aW51ZVdpdGhvdXRDcmVkZW50aWFsKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7
CisgICAgdm9pZCByZWNlaXZlZENhbmNlbGxhdGlvbihjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxs
ZW5nZSYpOworICAgIHZvaWQgcmVjZWl2ZWRSZXF1ZXN0VG9QZXJmb3JtRGVmYXVsdEhhbmRsaW5n
KGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7CisgICAgdm9pZCByZWNlaXZlZENoYWxs
ZW5nZVJlamVjdGlvbihjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpOworCisgICAgc3Ry
dWN0IFNvY2tldERhdGEgeworICAgICAgICBTb2NrZXREYXRhKHN0ZDo6dW5pcXVlX3B0cjxjb25z
dCBjaGFyW10+JiYgc291cmNlLCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBk
YXRhID0gV1RGOjptb3ZlKHNvdXJjZSk7CisgICAgICAgICAgICBzaXplID0gbGVuZ3RoOworICAg
ICAgICB9CisKKyAgICAgICAgU29ja2V0RGF0YShTb2NrZXREYXRhJiYgb3RoZXIpCisgICAgICAg
IHsKKyAgICAgICAgICAgIGRhdGEgPSBXVEY6Om1vdmUob3RoZXIuZGF0YSk7CisgICAgICAgICAg
ICBzaXplID0gb3RoZXIuc2l6ZTsKKyAgICAgICAgICAgIG90aGVyLnNpemUgPSAwOworICAgICAg
ICB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IGNoYXJbXT4gZGF0YTsKKyAgICAg
ICAgaW50IHNpemUgeyAwIH07CiAgICAgfTsKIAotfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKKyAg
ICBUaHJlYWRJZGVudGlmaWVyIG1fd29ya2VyVGhyZWFkIHsgMCB9OworICAgIHN0ZDo6YXRvbWlj
PGJvb2w+IG1fc3RvcFRocmVhZCB7IGZhbHNlIH07CisgICAgc3RkOjptdXRleCBtX211dGV4U2Vu
ZDsKKyAgICBzdGQ6Om11dGV4IG1fbXV0ZXhSZWNlaXZlOworICAgIERlcXVlPFNvY2tldERhdGE+
IG1fc2VuZERhdGE7CisgICAgRGVxdWU8U29ja2V0RGF0YT4gbV9yZWNlaXZlRGF0YTsKK307CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAotI2VuZGlmICAvLyBTb2NrZXRTdHJlYW1IYW5kbGVf
aAorI2VuZGlmIC8vIFNvY2tldFN0cmVhbUhhbmRsZV9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlQ3VybC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhh
bmRsZUN1cmwuY3BwCShyZXZpc2lvbiAxODQxMDYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlQ3VybC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTM0LDEwICszNCwxMiBAQAogCiAjaWYgVVNFKENVUkwpCiAKLSNpbmNsdWRlICJVUkwuaCIK
ICNpbmNsdWRlICJMb2dnaW5nLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNs
dWRlICJTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQuaCIKKyNpbmNsdWRlICJVUkwuaCIKKyNpbmNs
dWRlIDx3dGYvTWFpblRocmVhZC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAog
bmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC00NSwyNyArNDcsMjM2IEBAIFNvY2tldFN0cmVhbUhh
bmRsZTo6U29ja2V0U3RyZWFtSGFuZGxlKGMKICAgICA6IFNvY2tldFN0cmVhbUhhbmRsZUJhc2Uo
dXJsLCBjbGllbnQpCiB7CiAgICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUgJXAg
bmV3IGNsaWVudCAlcCIsIHRoaXMsIG1fY2xpZW50KTsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwor
ICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgc3RhcnRUaHJlYWQoKTsKIH0KIAogU29j
a2V0U3RyZWFtSGFuZGxlOjp+U29ja2V0U3RyZWFtSGFuZGxlKCkKIHsKICAgICBMT0coTmV0d29y
aywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBkZWxldGUiLCB0aGlzKTsKLSAgICBzZXRDbGllbnQo
MCk7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBBU1NFUlQoIW1fd29ya2VyVGhyZWFkKTsK
IH0KIAotaW50IFNvY2tldFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1TZW5kKGNvbnN0IGNoYXIqLCBp
bnQpCitpbnQgU29ja2V0U3RyZWFtSGFuZGxlOjpwbGF0Zm9ybVNlbmQoY29uc3QgY2hhciogZGF0
YSwgaW50IGxlbmd0aCkKIHsKICAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAl
cCBwbGF0Zm9ybVNlbmQiLCB0aGlzKTsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIHJldHVy
biAwOworCisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIHN0YXJ0VGhyZWFkKCk7
CisKKyAgICBhdXRvIGNvcHkgPSBjcmVhdGVDb3B5KGRhdGEsIGxlbmd0aCk7CisKKyAgICBzdGQ6
OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX211dGV4U2VuZCk7CisgICAgbV9zZW5kRGF0
YS5hcHBlbmQoU29ja2V0RGF0YShXVEY6Om1vdmUoY29weSksIGxlbmd0aCkpOworCisgICAgcmV0
dXJuIGxlbmd0aDsKIH0KIAogdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OnBsYXRmb3JtQ2xvc2Uo
KQogewogICAgIExPRyhOZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxlICVwIHBsYXRmb3JtQ2xv
c2UiLCB0aGlzKTsKLSAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgQVNTRVJUKGlzTWFpblRo
cmVhZCgpKTsKKworICAgIHN0b3BUaHJlYWQoKTsKKworICAgIGlmIChtX2NsaWVudCkKKyAgICAg
ICAgbV9jbGllbnQtPmRpZENsb3NlU29ja2V0U3RyZWFtKHRoaXMpOworfQorCitib29sIFNvY2tl
dFN0cmVhbUhhbmRsZTo6cmVhZERhdGEoQ1VSTCogY3VybEhhbmRsZSkKK3sKKyAgICBBU1NFUlQo
IWlzTWFpblRocmVhZCgpKTsKKworICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gMTAyNDsKKyAg
ICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgY2hhcltdPiBkYXRhKG5ldyBjb25zdCBjaGFyW2J1ZmZl
clNpemVdKTsKKyAgICBzaXplX3QgYnl0ZXNSZWFkID0gMDsKKworICAgIENVUkxjb2RlIHJldCA9
IGN1cmxfZWFzeV9yZWN2KGN1cmxIYW5kbGUsIGNvbnN0X2Nhc3Q8Y2hhcio+KGRhdGEuZ2V0KCkp
LCBidWZmZXJTaXplLCAmYnl0ZXNSZWFkKTsKKworICAgIGlmIChyZXQgPT0gQ1VSTEVfT0sgJiYg
Ynl0ZXNSZWFkID49IDApIHsKKyAgICAgICAgbV9tdXRleFJlY2VpdmUubG9jaygpOworICAgICAg
ICBtX3JlY2VpdmVEYXRhLmFwcGVuZChTb2NrZXREYXRhKFdURjo6bW92ZShkYXRhKSwgYnl0ZXNS
ZWFkKSk7CisgICAgICAgIG1fbXV0ZXhSZWNlaXZlLnVubG9jaygpOworCisgICAgICAgIHJlZigp
OworCisgICAgICAgIGNhbGxPbk1haW5UaHJlYWQoW3RoaXNdIHsKKyAgICAgICAgICAgIGRpZFJl
Y2VpdmVEYXRhKCk7CisgICAgICAgICAgICBkZXJlZigpOworICAgICAgICB9KTsKKworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAocmV0ID09IENVUkxFX0FHQUlOKQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTb2NrZXRT
dHJlYW1IYW5kbGU6OnNlbmREYXRhKENVUkwqIGN1cmxIYW5kbGUpCit7CisgICAgQVNTRVJUKCFp
c01haW5UaHJlYWQoKSk7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworCisgICAgICAgIG1fbXV0ZXhT
ZW5kLmxvY2soKTsKKyAgICAgICAgaWYgKCFtX3NlbmREYXRhLnNpemUoKSkgeworICAgICAgICAg
ICAgbV9tdXRleFNlbmQudW5sb2NrKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICBhdXRvIHNlbmREYXRhID0gbV9zZW5kRGF0YS50YWtlRmlyc3QoKTsKKyAgICAgICAg
bV9tdXRleFNlbmQudW5sb2NrKCk7CisKKyAgICAgICAgaW50IHRvdGFsQnl0ZXNTZW50ID0gMDsK
KyAgICAgICAgd2hpbGUgKHRvdGFsQnl0ZXNTZW50IDwgc2VuZERhdGEuc2l6ZSkgeworICAgICAg
ICAgICAgc2l6ZV90IGJ5dGVzU2VudCA9IDA7CisgICAgICAgICAgICBDVVJMY29kZSByZXQgPSBj
dXJsX2Vhc3lfc2VuZChjdXJsSGFuZGxlLCBzZW5kRGF0YS5kYXRhLmdldCgpICsgdG90YWxCeXRl
c1NlbnQsIHNlbmREYXRhLnNpemUgLSB0b3RhbEJ5dGVzU2VudCwgJmJ5dGVzU2VudCk7CisgICAg
ICAgICAgICBpZiAocmV0ID09IENVUkxFX09LKQorICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNT
ZW50ICs9IGJ5dGVzU2VudDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluc2VydCByZW1haW5pbmcgZGF0YSBpbnRvIHNl
bmQgcXVldWUuCisKKyAgICAgICAgaWYgKHRvdGFsQnl0ZXNTZW50IDwgc2VuZERhdGEuc2l6ZSkg
eworICAgICAgICAgICAgY29uc3QgaW50IHJlc3RMZW5ndGggPSBzZW5kRGF0YS5zaXplIC0gdG90
YWxCeXRlc1NlbnQ7CisgICAgICAgICAgICBhdXRvIGNvcHkgPSBjcmVhdGVDb3B5KHNlbmREYXRh
LmRhdGEuZ2V0KCkgKyB0b3RhbEJ5dGVzU2VudCwgcmVzdExlbmd0aCk7CisKKyAgICAgICAgICAg
IHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1fbXV0ZXhTZW5kKTsKKyAgICAgICAg
ICAgIG1fc2VuZERhdGEucHJlcGVuZChTb2NrZXREYXRhKFdURjo6bW92ZShjb3B5KSwgcmVzdExl
bmd0aCkpOworCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTb2NrZXRTdHJlYW1IYW5kbGU6OndhaXRGb3JB
dmFpbGFibGVEYXRhKENVUkwqIGN1cmxIYW5kbGUsIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMg
c2VsZWN0VGltZW91dCkKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIHN0
ZDo6Y2hyb25vOjptaWNyb3NlY29uZHMgdXNlYyA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0
PHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KHNlbGVjdFRpbWVvdXQpOworCisgICAgc3RydWN0
IHRpbWV2YWwgdGltZW91dDsKKyAgICBpZiAodXNlYyA8PSBzdGQ6OmNocm9ubzo6bWljcm9zZWNv
bmRzKDApKSB7CisgICAgICAgIHRpbWVvdXQudHZfc2VjID0gMDsKKyAgICAgICAgdGltZW91dC50
dl91c2VjID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IHVzZWMu
Y291bnQoKSAvIDEwMDAwMDA7CisgICAgICAgIHRpbWVvdXQudHZfdXNlYyA9IHVzZWMuY291bnQo
KSAlIDEwMDAwMDA7CisgICAgfQorCisgICAgbG9uZyBzb2NrZXQ7CisgICAgaWYgKGN1cmxfZWFz
eV9nZXRpbmZvKGN1cmxIYW5kbGUsIENVUkxJTkZPX0xBU1RTT0NLRVQsICZzb2NrZXQpICE9IENV
UkxFX09LKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmZF9zZXQgZmRyZWFkOworICAg
IEZEX1pFUk8oJmZkcmVhZCk7CisgICAgRkRfU0VUKHNvY2tldCwgJmZkcmVhZCk7CisgICAgaW50
IHJjID0gOjpzZWxlY3QoMCwgJmZkcmVhZCwgbnVsbHB0ciwgbnVsbHB0ciwgJnRpbWVvdXQpOwor
ICAgIHJldHVybiByYyA9PSAxOworfQorCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6c3RhcnRU
aHJlYWQoKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBpZiAobV93b3Jr
ZXJUaHJlYWQpCisgICAgICAgIHJldHVybjsKKworICAgIHJlZigpOyAvLyBzdG9wVGhyZWFkKCkg
d2lsbCBjYWxsIGRlcmVmKCkuCisKKyAgICBtX3dvcmtlclRocmVhZCA9IGNyZWF0ZVRocmVhZCgi
V2ViU29ja2V0IHRocmVhZCIsIFt0aGlzXSB7CisKKyAgICAgICAgQVNTRVJUKCFpc01haW5UaHJl
YWQoKSk7CisKKyAgICAgICAgQ1VSTCogY3VybEhhbmRsZSA9IGN1cmxfZWFzeV9pbml0KCk7CisK
KyAgICAgICAgaWYgKCFjdXJsSGFuZGxlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAg
IGN1cmxfZWFzeV9zZXRvcHQoY3VybEhhbmRsZSwgQ1VSTE9QVF9VUkwsIG1fdXJsLmhvc3QoKS51
dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgY3VybF9lYXN5X3NldG9wdChjdXJsSGFuZGxlLCBDVVJM
T1BUX1BPUlQsIG1fdXJsLnBvcnQoKSk7CisgICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybEhh
bmRsZSwgQ1VSTE9QVF9DT05ORUNUX09OTFkpOworCisgICAgICAgIC8vIENvbm5lY3QgdG8gaG9z
dAorICAgICAgICBpZiAoY3VybF9lYXN5X3BlcmZvcm0oY3VybEhhbmRsZSkgIT0gQ1VSTEVfT0sp
CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcmVmKCk7CisKKyAgICAgICAgY2FsbE9u
TWFpblRocmVhZChbdGhpc10geworICAgICAgICAgICAgaWYgKHJlZkNvdW50KCkgPiAxKQorICAg
ICAgICAgICAgICAgIGRpZE9wZW5Tb2NrZXQoKTsKKyAgICAgICAgICAgIGRlcmVmKCk7CisgICAg
ICAgIH0pOworCisgICAgICAgIHdoaWxlICghbV9zdG9wVGhyZWFkKSB7CisgICAgICAgICAgICAv
LyBTZW5kIHF1ZXVlZCBkYXRhCisgICAgICAgICAgICBzZW5kRGF0YShjdXJsSGFuZGxlKTsKKwor
ICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBzb2NrZXQgaGFzIGF2YWlsYWJsZSBkYXRhCisgICAg
ICAgICAgICBpZiAod2FpdEZvckF2YWlsYWJsZURhdGEoY3VybEhhbmRsZSwgc3RkOjpjaHJvbm86
Om1pbGxpc2Vjb25kcygyMCkpKQorICAgICAgICAgICAgICAgIHJlYWREYXRhKGN1cmxIYW5kbGUp
OworICAgICAgICB9CisKKyAgICAgICAgY3VybF9lYXN5X2NsZWFudXAoY3VybEhhbmRsZSk7Cisg
ICAgfSk7Cit9CisKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjpzdG9wVGhyZWFkKCkKK3sKKyAg
ICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgaWYgKCFtX3dvcmtlclRocmVhZCkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9zdG9wVGhyZWFkID0gdHJ1ZTsKKyAgICB3YWl0Rm9yVGhy
ZWFkQ29tcGxldGlvbihtX3dvcmtlclRocmVhZCk7CisgICAgbV93b3JrZXJUaHJlYWQgPSAwOwor
ICAgIGRlcmVmKCk7Cit9CisKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjpkaWRSZWNlaXZlRGF0
YSgpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIG1fbXV0ZXhSZWNlaXZl
LmxvY2soKTsKKworICAgIGF1dG8gcmVjZWl2ZURhdGEgPSBXVEY6Om1vdmUobV9yZWNlaXZlRGF0
YSk7CisKKyAgICBtX211dGV4UmVjZWl2ZS51bmxvY2soKTsKKworICAgIGZvciAoYXV0byYgc29j
a2V0RGF0YSA6IHJlY2VpdmVEYXRhKSB7CisgICAgICAgIGlmIChzb2NrZXREYXRhLnNpemUgPiAw
KSB7CisgICAgICAgICAgICBpZiAobV9jbGllbnQgJiYgc3RhdGUoKSA9PSBPcGVuKQorICAgICAg
ICAgICAgICAgIG1fY2xpZW50LT5kaWRSZWNlaXZlU29ja2V0U3RyZWFtRGF0YSh0aGlzLCBzb2Nr
ZXREYXRhLmRhdGEuZ2V0KCksIHNvY2tldERhdGEuc2l6ZSk7CisgICAgICAgIH0gZWxzZQorICAg
ICAgICAgICAgcGxhdGZvcm1DbG9zZSgpOworICAgIH0KK30KKwordm9pZCBTb2NrZXRTdHJlYW1I
YW5kbGU6OmRpZE9wZW5Tb2NrZXQoKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisK
KyAgICBtX3N0YXRlID0gT3BlbjsKKworICAgIGlmIChtX2NsaWVudCkKKyAgICAgICAgbV9jbGll
bnQtPmRpZE9wZW5Tb2NrZXRTdHJlYW0odGhpcyk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxjb25z
dCBjaGFyW10+IFNvY2tldFN0cmVhbUhhbmRsZTo6Y3JlYXRlQ29weShjb25zdCBjaGFyKiBkYXRh
LCBpbnQgbGVuZ3RoKQoreworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBjaGFyW10+IGNvcHko
bmV3IGNvbnN0IGNoYXJbbGVuZ3RoXSk7CisgICAgbWVtY3B5KGNvbnN0X2Nhc3Q8Y2hhcio+KGNv
cHkuZ2V0KCkpLCBkYXRhLCBsZW5ndGgpOworCisgICAgcmV0dXJuIFdURjo6bW92ZShjb3B5KTsK
IH0KIAogdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OmRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNo
YWxsZW5nZShjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpCkBAIC05OCw2ICszMDksNiBA
QCB2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6cmVjZWl2ZWRDaGFsbGVuCiAgICAgbm90SW1wbGVt
ZW50ZWQoKTsKIH0KIAotfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKIAogI2VuZGlmCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>253030</attachid>
            <date>2015-05-13 03:53:59 -0700</date>
            <delta_ts>2015-05-15 06:52:52 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-144628-20150513125230.patch</filename>
            <type>text/plain</type>
            <size>12758</size>
            <attacher>peavo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4NDI4MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI5IEBACisyMDE1LTA1LTEzICBQZXIgQXJu
ZSBWb2xsYW4gIDxwZWF2b0BvdXRsb29rLmNvbT4KKworICAgICAgICBbQ3VybF0gV2ViU29ja2V0
IHBsYXRmb3JtIHBhcnQgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ0NjI4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIEN1cmwgcGxhdGZvcm0gY29kZSBpbXBsZW1l
bnRhdGlvbiBmb3IgV2ViU29ja2V0cy4KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9Tb2NrZXRTdHJlYW1IYW5kbGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhh
bmRsZTo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6U29j
a2V0RGF0YTo6U29ja2V0RGF0YSk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL1Nv
Y2tldFN0cmVhbUhhbmRsZUN1cmwuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFt
SGFuZGxlOjpTb2NrZXRTdHJlYW1IYW5kbGUpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3Ry
ZWFtSGFuZGxlOjp+U29ja2V0U3RyZWFtSGFuZGxlKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tl
dFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1TZW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0
cmVhbUhhbmRsZTo6cGxhdGZvcm1DbG9zZSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJl
YW1IYW5kbGU6OnJlYWREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRs
ZTo6c2VuZERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjp3YWl0
Rm9yQXZhaWxhYmxlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6
OnN0YXJ0VGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6c3Rv
cFRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OmRpZFJlY2Vp
dmVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6ZGlkT3BlblNv
Y2tldCk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OmNyZWF0ZUNvcHkp
OgorCiAyMDE1LTA1LTEyICBaYW4gRG9iZXJzZWsgIDx6ZG9iZXJzZWtAaWdhbGlhLmNvbT4KIAog
ICAgICAgICBSZWR1Y2UgVHJhbnNmb3JtYXRpb25NYXRyaXggY29waWVzIGluIE1hdHJpeFRyYW5z
Zm9ybU9wZXJhdGlvbiwgTWF0cml4M0RUcmFuc2Zvcm1PcGVyYXRpb24KSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGUuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFt
SGFuZGxlLmgJKHJldmlzaW9uIDE4NDIwMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9Tb2NrZXRTdHJlYW1IYW5kbGUuaAkod29ya2luZyBjb3B5KQpAQCAtMzQsMzcg
KzM0LDgyIEBACiAKICNpbmNsdWRlICJTb2NrZXRTdHJlYW1IYW5kbGVCYXNlLmgiCiAKLSNpbmNs
dWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2lmIFBMQVRGT1JNKFdJTikKKyNpbmNsdWRlIDx3aW5z
b2NrMi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdXJsL2N1cmwuaD4KKworI2luY2x1ZGUgPG11
dGV4PgorCisjaW5jbHVkZSA8d3RmL0RlcXVlLmg+CiAjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQu
aD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAot
ICAgIGNsYXNzIEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlOwotICAgIGNsYXNzIENyZWRlbnRpYWw7
Ci0gICAgY2xhc3MgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50OwotCi0gICAgY2xhc3MgU29ja2V0
U3RyZWFtSGFuZGxlIDogcHVibGljIFJlZkNvdW50ZWQ8U29ja2V0U3RyZWFtSGFuZGxlPiwgcHVi
bGljIFNvY2tldFN0cmVhbUhhbmRsZUJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGlj
IFBhc3NSZWZQdHI8U29ja2V0U3RyZWFtSGFuZGxlPiBjcmVhdGUoY29uc3QgVVJMJiB1cmwsIFNv
Y2tldFN0cmVhbUhhbmRsZUNsaWVudCogY2xpZW50KSB7IHJldHVybiBhZG9wdFJlZihuZXcgU29j
a2V0U3RyZWFtSGFuZGxlKHVybCwgY2xpZW50KSk7IH0KLQotICAgICAgICB2aXJ0dWFsIH5Tb2Nr
ZXRTdHJlYW1IYW5kbGUoKTsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCBpbnQg
cGxhdGZvcm1TZW5kKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgpOwotICAgICAgICB2aXJ0
dWFsIHZvaWQgcGxhdGZvcm1DbG9zZSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgU29ja2V0
U3RyZWFtSGFuZGxlKGNvbnN0IFVSTCYsIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCopOwotCi0g
ICAgICAgIC8vIE5vIGF1dGhlbnRpY2F0aW9uIGZvciBzdHJlYW1zIHBlciBzZSwgYnV0IHByb3h5
IG1heSBhc2sgZm9yIGNyZWRlbnRpYWxzLgotICAgICAgICB2b2lkIGRpZFJlY2VpdmVBdXRoZW50
aWNhdGlvbkNoYWxsZW5nZShjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpOwotICAgICAg
ICB2b2lkIHJlY2VpdmVkQ3JlZGVudGlhbChjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYs
IGNvbnN0IENyZWRlbnRpYWwmKTsKLSAgICAgICAgdm9pZCByZWNlaXZlZFJlcXVlc3RUb0NvbnRp
bnVlV2l0aG91dENyZWRlbnRpYWwoY29uc3QgQXV0aGVudGljYXRpb25DaGFsbGVuZ2UmKTsKLSAg
ICAgICAgdm9pZCByZWNlaXZlZENhbmNlbGxhdGlvbihjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxs
ZW5nZSYpOwotICAgICAgICB2b2lkIHJlY2VpdmVkUmVxdWVzdFRvUGVyZm9ybURlZmF1bHRIYW5k
bGluZyhjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpOwotICAgICAgICB2b2lkIHJlY2Vp
dmVkQ2hhbGxlbmdlUmVqZWN0aW9uKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7Citj
bGFzcyBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZTsKK2NsYXNzIENyZWRlbnRpYWw7CitjbGFzcyBT
b2NrZXRTdHJlYW1IYW5kbGVDbGllbnQ7CisKK2NsYXNzIFNvY2tldFN0cmVhbUhhbmRsZSA6IHB1
YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxTb2NrZXRTdHJlYW1IYW5kbGU+LCBwdWJsaWMgU29j
a2V0U3RyZWFtSGFuZGxlQmFzZSB7CitwdWJsaWM6CisgICAgc3RhdGljIFJlZjxTb2NrZXRTdHJl
YW1IYW5kbGU+IGNyZWF0ZShjb25zdCBVUkwmIHVybCwgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50
KiBjbGllbnQpIHsgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU29ja2V0U3RyZWFtSGFuZGxlKHVybCwg
Y2xpZW50KSk7IH0KKworICAgIHZpcnR1YWwgflNvY2tldFN0cmVhbUhhbmRsZSgpOworCitwcml2
YXRlOgorICAgIFNvY2tldFN0cmVhbUhhbmRsZShjb25zdCBVUkwmLCBTb2NrZXRTdHJlYW1IYW5k
bGVDbGllbnQqKTsKKworICAgIGludCBwbGF0Zm9ybVNlbmQoY29uc3QgY2hhciogZGF0YSwgaW50
IGxlbmd0aCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwbGF0Zm9ybUNsb3NlKCkgb3ZlcnJpZGU7CisK
KyAgICBib29sIHJlYWREYXRhKENVUkwqKTsKKyAgICBib29sIHNlbmREYXRhKENVUkwqKTsKKyAg
ICBib29sIHdhaXRGb3JBdmFpbGFibGVEYXRhKENVUkwqLCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNv
bmRzIHNlbGVjdFRpbWVvdXQpOworCisgICAgdm9pZCBzdGFydFRocmVhZCgpOworICAgIHZvaWQg
c3RvcFRocmVhZCgpOworCisgICAgdm9pZCBkaWRSZWNlaXZlRGF0YSgpOworICAgIHZvaWQgZGlk
T3BlblNvY2tldCgpOworCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IGNyZWF0
ZUNvcHkoY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCk7CisKKyAgICAvLyBObyBhdXRoZW50
aWNhdGlvbiBmb3Igc3RyZWFtcyBwZXIgc2UsIGJ1dCBwcm94eSBtYXkgYXNrIGZvciBjcmVkZW50
aWFscy4KKyAgICB2b2lkIGRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShjb25zdCBB
dXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpOworICAgIHZvaWQgcmVjZWl2ZWRDcmVkZW50aWFsKGNv
bnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJiwgY29uc3QgQ3JlZGVudGlhbCYpOworICAgIHZv
aWQgcmVjZWl2ZWRSZXF1ZXN0VG9Db250aW51ZVdpdGhvdXRDcmVkZW50aWFsKGNvbnN0IEF1dGhl
bnRpY2F0aW9uQ2hhbGxlbmdlJik7CisgICAgdm9pZCByZWNlaXZlZENhbmNlbGxhdGlvbihjb25z
dCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpOworICAgIHZvaWQgcmVjZWl2ZWRSZXF1ZXN0VG9Q
ZXJmb3JtRGVmYXVsdEhhbmRsaW5nKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7Cisg
ICAgdm9pZCByZWNlaXZlZENoYWxsZW5nZVJlamVjdGlvbihjb25zdCBBdXRoZW50aWNhdGlvbkNo
YWxsZW5nZSYpOworCisgICAgc3RydWN0IFNvY2tldERhdGEgeworICAgICAgICBTb2NrZXREYXRh
KHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+JiYgc291cmNlLCBpbnQgbGVuZ3RoKQorICAgICAgICB7
CisgICAgICAgICAgICBkYXRhID0gV1RGOjptb3ZlKHNvdXJjZSk7CisgICAgICAgICAgICBzaXpl
ID0gbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgU29ja2V0RGF0YShTb2NrZXREYXRhJiYg
b3RoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGEgPSBXVEY6Om1vdmUob3RoZXIuZGF0
YSk7CisgICAgICAgICAgICBzaXplID0gb3RoZXIuc2l6ZTsKKyAgICAgICAgICAgIG90aGVyLnNp
emUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gZGF0
YTsKKyAgICAgICAgaW50IHNpemUgeyAwIH07CiAgICAgfTsKIAotfSAgLy8gbmFtZXNwYWNlIFdl
YkNvcmUKKyAgICBUaHJlYWRJZGVudGlmaWVyIG1fd29ya2VyVGhyZWFkIHsgMCB9OworICAgIHN0
ZDo6YXRvbWljPGJvb2w+IG1fc3RvcFRocmVhZCB7IGZhbHNlIH07CisgICAgc3RkOjptdXRleCBt
X211dGV4U2VuZDsKKyAgICBzdGQ6Om11dGV4IG1fbXV0ZXhSZWNlaXZlOworICAgIERlcXVlPFNv
Y2tldERhdGE+IG1fc2VuZERhdGE7CisgICAgRGVxdWU8U29ja2V0RGF0YT4gbV9yZWNlaXZlRGF0
YTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAotI2VuZGlmICAvLyBTb2NrZXRTdHJl
YW1IYW5kbGVfaAorI2VuZGlmIC8vIFNvY2tldFN0cmVhbUhhbmRsZV9oCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlQ3VybC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tl
dFN0cmVhbUhhbmRsZUN1cmwuY3BwCShyZXZpc2lvbiAxODQyMDApCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvU29ja2V0U3RyZWFtSGFuZGxlQ3VybC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTM0LDEwICszNCwxMiBAQAogCiAjaWYgVVNFKENVUkwpCiAKLSNpbmNsdWRl
ICJVUkwuaCIKICNpbmNsdWRlICJMb2dnaW5nLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQu
aCIKICNpbmNsdWRlICJTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQuaCIKKyNpbmNsdWRlICJVUkwu
aCIKKyNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJp
bmcuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC00NSwyNyArNDcsMjM5IEBAIFNvY2tl
dFN0cmVhbUhhbmRsZTo6U29ja2V0U3RyZWFtSGFuZGxlKGMKICAgICA6IFNvY2tldFN0cmVhbUhh
bmRsZUJhc2UodXJsLCBjbGllbnQpCiB7CiAgICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1I
YW5kbGUgJXAgbmV3IGNsaWVudCAlcCIsIHRoaXMsIG1fY2xpZW50KTsKLSAgICBub3RJbXBsZW1l
bnRlZCgpOworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgc3RhcnRUaHJlYWQoKTsK
IH0KIAogU29ja2V0U3RyZWFtSGFuZGxlOjp+U29ja2V0U3RyZWFtSGFuZGxlKCkKIHsKICAgICBM
T0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBkZWxldGUiLCB0aGlzKTsKLSAgICBz
ZXRDbGllbnQoMCk7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBBU1NFUlQoIW1fd29ya2Vy
VGhyZWFkKTsKIH0KIAotaW50IFNvY2tldFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1TZW5kKGNvbnN0
IGNoYXIqLCBpbnQpCitpbnQgU29ja2V0U3RyZWFtSGFuZGxlOjpwbGF0Zm9ybVNlbmQoY29uc3Qg
Y2hhciogZGF0YSwgaW50IGxlbmd0aCkKIHsKICAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVh
bUhhbmRsZSAlcCBwbGF0Zm9ybVNlbmQiLCB0aGlzKTsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwot
ICAgIHJldHVybiAwOworCisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIHN0YXJ0
VGhyZWFkKCk7CisKKyAgICBhdXRvIGNvcHkgPSBjcmVhdGVDb3B5KGRhdGEsIGxlbmd0aCk7CisK
KyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtX211dGV4U2VuZCk7CisgICAg
bV9zZW5kRGF0YS5hcHBlbmQoU29ja2V0RGF0YSB7IFdURjo6bW92ZShjb3B5KSwgbGVuZ3RoIH0p
OworCisgICAgcmV0dXJuIGxlbmd0aDsKIH0KIAogdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OnBs
YXRmb3JtQ2xvc2UoKQogewogICAgIExPRyhOZXR3b3JrLCAiU29ja2V0U3RyZWFtSGFuZGxlICVw
IHBsYXRmb3JtQ2xvc2UiLCB0aGlzKTsKLSAgICBub3RJbXBsZW1lbnRlZCgpOworCisgICAgQVNT
RVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIHN0b3BUaHJlYWQoKTsKKworICAgIGlmIChtX2Ns
aWVudCkKKyAgICAgICAgbV9jbGllbnQtPmRpZENsb3NlU29ja2V0U3RyZWFtKHRoaXMpOworfQor
Citib29sIFNvY2tldFN0cmVhbUhhbmRsZTo6cmVhZERhdGEoQ1VSTCogY3VybEhhbmRsZSkKK3sK
KyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIGNvbnN0IGludCBidWZmZXJTaXpl
ID0gMTAyNDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBkYXRhKG5ldyBjaGFyW2J1ZmZl
clNpemVdKTsKKyAgICBzaXplX3QgYnl0ZXNSZWFkID0gMDsKKworICAgIENVUkxjb2RlIHJldCA9
IGN1cmxfZWFzeV9yZWN2KGN1cmxIYW5kbGUsIGRhdGEuZ2V0KCksIGJ1ZmZlclNpemUsICZieXRl
c1JlYWQpOworCisgICAgaWYgKHJldCA9PSBDVVJMRV9PSyAmJiBieXRlc1JlYWQgPj0gMCkgewor
ICAgICAgICBtX211dGV4UmVjZWl2ZS5sb2NrKCk7CisgICAgICAgIG1fcmVjZWl2ZURhdGEuYXBw
ZW5kKFNvY2tldERhdGEgeyBXVEY6Om1vdmUoZGF0YSksIHN0YXRpY19jYXN0PGludD4oYnl0ZXNS
ZWFkKSB9KTsKKyAgICAgICAgbV9tdXRleFJlY2VpdmUudW5sb2NrKCk7CisKKyAgICAgICAgcmVm
KCk7CisKKyAgICAgICAgY2FsbE9uTWFpblRocmVhZChbdGhpc10geworICAgICAgICAgICAgZGlk
UmVjZWl2ZURhdGEoKTsKKyAgICAgICAgICAgIGRlcmVmKCk7CisgICAgICAgIH0pOworCisgICAg
ICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChyZXQgPT0gQ1VSTEVfQUdBSU4pCisg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFNvY2tl
dFN0cmVhbUhhbmRsZTo6c2VuZERhdGEoQ1VSTCogY3VybEhhbmRsZSkKK3sKKyAgICBBU1NFUlQo
IWlzTWFpblRocmVhZCgpKTsKKworICAgIHdoaWxlICh0cnVlKSB7CisKKyAgICAgICAgbV9tdXRl
eFNlbmQubG9jaygpOworICAgICAgICBpZiAoIW1fc2VuZERhdGEuc2l6ZSgpKSB7CisgICAgICAg
ICAgICBtX211dGV4U2VuZC51bmxvY2soKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIGF1dG8gc2VuZERhdGEgPSBtX3NlbmREYXRhLnRha2VGaXJzdCgpOworICAgICAg
ICBtX211dGV4U2VuZC51bmxvY2soKTsKKworICAgICAgICBpbnQgdG90YWxCeXRlc1NlbnQgPSAw
OworICAgICAgICB3aGlsZSAodG90YWxCeXRlc1NlbnQgPCBzZW5kRGF0YS5zaXplKSB7CisgICAg
ICAgICAgICBzaXplX3QgYnl0ZXNTZW50ID0gMDsKKyAgICAgICAgICAgIENVUkxjb2RlIHJldCA9
IGN1cmxfZWFzeV9zZW5kKGN1cmxIYW5kbGUsIHNlbmREYXRhLmRhdGEuZ2V0KCkgKyB0b3RhbEJ5
dGVzU2VudCwgc2VuZERhdGEuc2l6ZSAtIHRvdGFsQnl0ZXNTZW50LCAmYnl0ZXNTZW50KTsKKyAg
ICAgICAgICAgIGlmIChyZXQgPT0gQ1VSTEVfT0spCisgICAgICAgICAgICAgICAgdG90YWxCeXRl
c1NlbnQgKz0gYnl0ZXNTZW50OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5zZXJ0IHJlbWFpbmluZyBkYXRhIGludG8g
c2VuZCBxdWV1ZS4KKworICAgICAgICBpZiAodG90YWxCeXRlc1NlbnQgPCBzZW5kRGF0YS5zaXpl
KSB7CisgICAgICAgICAgICBjb25zdCBpbnQgcmVzdExlbmd0aCA9IHNlbmREYXRhLnNpemUgLSB0
b3RhbEJ5dGVzU2VudDsKKyAgICAgICAgICAgIGF1dG8gY29weSA9IGNyZWF0ZUNvcHkoc2VuZERh
dGEuZGF0YS5nZXQoKSArIHRvdGFsQnl0ZXNTZW50LCByZXN0TGVuZ3RoKTsKKworICAgICAgICAg
ICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobV9tdXRleFNlbmQpOworICAgICAg
ICAgICAgbV9zZW5kRGF0YS5wcmVwZW5kKFNvY2tldERhdGEgeyBXVEY6Om1vdmUoY29weSksIHJl
c3RMZW5ndGggfSk7CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFNvY2tldFN0cmVhbUhhbmRsZTo6d2Fp
dEZvckF2YWlsYWJsZURhdGEoQ1VSTCogY3VybEhhbmRsZSwgc3RkOjpjaHJvbm86Om1pbGxpc2Vj
b25kcyBzZWxlY3RUaW1lb3V0KQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisg
ICAgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyB1c2VjID0gc3RkOjpjaHJvbm86OmR1cmF0aW9u
X2Nhc3Q8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4oc2VsZWN0VGltZW91dCk7CisKKyAgICBz
dHJ1Y3QgdGltZXZhbCB0aW1lb3V0OworICAgIGlmICh1c2VjIDw9IHN0ZDo6Y2hyb25vOjptaWNy
b3NlY29uZHMoMCkpIHsKKyAgICAgICAgdGltZW91dC50dl9zZWMgPSAwOworICAgICAgICB0aW1l
b3V0LnR2X3VzZWMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpbWVvdXQudHZfc2VjID0g
dXNlYy5jb3VudCgpIC8gMTAwMDAwMDsKKyAgICAgICAgdGltZW91dC50dl91c2VjID0gdXNlYy5j
b3VudCgpICUgMTAwMDAwMDsKKyAgICB9CisKKyAgICBsb25nIHNvY2tldDsKKyAgICBpZiAoY3Vy
bF9lYXN5X2dldGluZm8oY3VybEhhbmRsZSwgQ1VSTElORk9fTEFTVFNPQ0tFVCwgJnNvY2tldCkg
IT0gQ1VSTEVfT0spCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZkX3NldCBmZHJlYWQ7
CisgICAgRkRfWkVSTygmZmRyZWFkKTsKKyAgICBGRF9TRVQoc29ja2V0LCAmZmRyZWFkKTsKKyAg
ICBpbnQgcmMgPSA6OnNlbGVjdCgwLCAmZmRyZWFkLCBudWxscHRyLCBudWxscHRyLCAmdGltZW91
dCk7CisgICAgcmV0dXJuIHJjID09IDE7Cit9CisKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjpz
dGFydFRocmVhZCgpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIGlmICht
X3dvcmtlclRocmVhZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgcmVmKCk7IC8vIHN0b3BUaHJl
YWQoKSB3aWxsIGNhbGwgZGVyZWYoKS4KKworICAgIG1fd29ya2VyVGhyZWFkID0gY3JlYXRlVGhy
ZWFkKCJXZWJTb2NrZXQgdGhyZWFkIiwgW3RoaXNdIHsKKworICAgICAgICBBU1NFUlQoIWlzTWFp
blRocmVhZCgpKTsKKworICAgICAgICBDVVJMKiBjdXJsSGFuZGxlID0gY3VybF9lYXN5X2luaXQo
KTsKKworICAgICAgICBpZiAoIWN1cmxIYW5kbGUpCisgICAgICAgICAgICByZXR1cm47CisKKyAg
ICAgICAgY3VybF9lYXN5X3NldG9wdChjdXJsSGFuZGxlLCBDVVJMT1BUX1VSTCwgbV91cmwuaG9z
dCgpLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmxIYW5kbGUs
IENVUkxPUFRfUE9SVCwgbV91cmwucG9ydCgpKTsKKyAgICAgICAgY3VybF9lYXN5X3NldG9wdChj
dXJsSGFuZGxlLCBDVVJMT1BUX0NPTk5FQ1RfT05MWSk7CisKKyAgICAgICAgLy8gQ29ubmVjdCB0
byBob3N0CisgICAgICAgIGlmIChjdXJsX2Vhc3lfcGVyZm9ybShjdXJsSGFuZGxlKSAhPSBDVVJM
RV9PSykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICByZWYoKTsKKworICAgICAgICBj
YWxsT25NYWluVGhyZWFkKFt0aGlzXSB7CisgICAgICAgICAgICAvLyBDaGVjayByZWZlcmVuY2Ug
Y291bnQgdG8gZml4IGEgY3Jhc2guCisgICAgICAgICAgICAvLyBXaGVuIHRoZSBjYWxsIGlzIGlu
dm9rZWQgb24gdGhlIG1haW4gdGhyZWFkIGFmdGVyIGFsbCBvdGhlciByZWZlcmVuY2VzIGFyZSBy
ZWxlYXNlZCwgdGhlIFNvY2tldFN0cmVhbUNsaWVudAorICAgICAgICAgICAgLy8gaXMgYWxyZWFk
eSBkZWxldGVkLiBBY2Nlc3NpbmcgdGhlIFNvY2tldFN0cmVhbUNsaWVudCBpbiBkaWRPcGVuU29j
a2V0KCkgd2lsbCB0aGVuIGNhdXNlIGEgY3Jhc2guCisgICAgICAgICAgICBpZiAocmVmQ291bnQo
KSA+IDEpCisgICAgICAgICAgICAgICAgZGlkT3BlblNvY2tldCgpOworICAgICAgICAgICAgZGVy
ZWYoKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgd2hpbGUgKCFtX3N0b3BUaHJlYWQpIHsKKyAg
ICAgICAgICAgIC8vIFNlbmQgcXVldWVkIGRhdGEKKyAgICAgICAgICAgIHNlbmREYXRhKGN1cmxI
YW5kbGUpOworCisgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHNvY2tldCBoYXMgYXZhaWxhYmxl
IGRhdGEKKyAgICAgICAgICAgIGlmICh3YWl0Rm9yQXZhaWxhYmxlRGF0YShjdXJsSGFuZGxlLCBz
dGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSkpCisgICAgICAgICAgICAgICAgcmVhZERhdGEo
Y3VybEhhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICBjdXJsX2Vhc3lfY2xlYW51cChjdXJs
SGFuZGxlKTsKKyAgICB9KTsKK30KKwordm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OnN0b3BUaHJl
YWQoKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBpZiAoIW1fd29ya2Vy
VGhyZWFkKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3N0b3BUaHJlYWQgPSB0cnVlOworICAg
IHdhaXRGb3JUaHJlYWRDb21wbGV0aW9uKG1fd29ya2VyVGhyZWFkKTsKKyAgICBtX3dvcmtlclRo
cmVhZCA9IDA7CisgICAgZGVyZWYoKTsKK30KKwordm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OmRp
ZFJlY2VpdmVEYXRhKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgbV9t
dXRleFJlY2VpdmUubG9jaygpOworCisgICAgYXV0byByZWNlaXZlRGF0YSA9IFdURjo6bW92ZSht
X3JlY2VpdmVEYXRhKTsKKworICAgIG1fbXV0ZXhSZWNlaXZlLnVubG9jaygpOworCisgICAgZm9y
IChhdXRvJiBzb2NrZXREYXRhIDogcmVjZWl2ZURhdGEpIHsKKyAgICAgICAgaWYgKHNvY2tldERh
dGEuc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGlmIChtX2NsaWVudCAmJiBzdGF0ZSgpID09IE9w
ZW4pCisgICAgICAgICAgICAgICAgbV9jbGllbnQtPmRpZFJlY2VpdmVTb2NrZXRTdHJlYW1EYXRh
KHRoaXMsIHNvY2tldERhdGEuZGF0YS5nZXQoKSwgc29ja2V0RGF0YS5zaXplKTsKKyAgICAgICAg
fSBlbHNlCisgICAgICAgICAgICBwbGF0Zm9ybUNsb3NlKCk7CisgICAgfQorfQorCit2b2lkIFNv
Y2tldFN0cmVhbUhhbmRsZTo6ZGlkT3BlblNvY2tldCgpCit7CisgICAgQVNTRVJUKGlzTWFpblRo
cmVhZCgpKTsKKworICAgIG1fc3RhdGUgPSBPcGVuOworCisgICAgaWYgKG1fY2xpZW50KQorICAg
ICAgICBtX2NsaWVudC0+ZGlkT3BlblNvY2tldFN0cmVhbSh0aGlzKTsKK30KKworc3RkOjp1bmlx
dWVfcHRyPGNoYXJbXT4gU29ja2V0U3RyZWFtSGFuZGxlOjpjcmVhdGVDb3B5KGNvbnN0IGNoYXIq
IGRhdGEsIGludCBsZW5ndGgpCit7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gY29weShu
ZXcgY2hhcltsZW5ndGhdKTsKKyAgICBtZW1jcHkoY29weS5nZXQoKSwgZGF0YSwgbGVuZ3RoKTsK
KworICAgIHJldHVybiBXVEY6Om1vdmUoY29weSk7CiB9CiAKIHZvaWQgU29ja2V0U3RyZWFtSGFu
ZGxlOjpkaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoY29uc3QgQXV0aGVudGljYXRp
b25DaGFsbGVuZ2UmKQpAQCAtOTgsNiArMzEyLDYgQEAgdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6
OnJlY2VpdmVkQ2hhbGxlbgogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKLX0gIC8vIG5hbWVz
cGFjZSBXZWJDb3JlCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZgo=
</data>
<flag name="review"
          id="277886"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>