<?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>73185</bug_id>
          
          <creation_ts>2011-11-27 22:26:36 -0800</creation_ts>
          <short_desc>[blackberry] Upstream BlackBerry porting of plugin framework</short_desc>
          <delta_ts>2011-11-30 19:53:58 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>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>
          <dependson>73513</dependson>
          <blocked>73144</blocked>
    
    <blocked>73397</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Charles Wei">charles.wei</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>dbates</cc>
    
    <cc>japhet</cc>
    
    <cc>levin+threading</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>staikos</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>509566</commentid>
    <comment_count>0</comment_count>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-27 22:26:36 -0800</bug_when>
    <thetext>This bug is to upstream BlackBerry&apos;s porting of plugin-framework.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509589</commentid>
    <comment_count>1</comment_count>
      <attachid>116702</attachid>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-27 23:17:13 -0800</bug_when>
    <thetext>Created attachment 116702
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509595</commentid>
    <comment_count>2</comment_count>
      <attachid>116702</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-11-27 23:24:30 -0800</bug_when>
    <thetext>Comment on attachment 116702
Patch

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

Random drive by nit:

&gt; Source/WebCore/plugins/blackberry/PluginPackageBlackBerry.cpp:84
&gt; +    NPP_GetMIMEDescriptionProcPtr gm = (NPP_GetMIMEDescriptionProcPtr) dlsym(m_module, &quot;NP_GetMIMEDescription&quot;);
&gt; +    NPP_GetValueProcPtr gv = (NPP_GetValueProcPtr) dlsym(m_module, &quot;NP_GetValue&quot;);

This variable names are pretty short.  Usually we like complete words in variable names.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509596</commentid>
    <comment_count>3</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-11-27 23:25:10 -0800</bug_when>
    <thetext>(Mostly I was just curious about this patch and that nit jumped out at me; please feel free to ignore me.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509599</commentid>
    <comment_count>4</comment_count>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-27 23:31:30 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (Mostly I was just curious about this patch and that nit jumped out at me; please feel free to ignore me.)

Thanks, Adam. I will collect all the comments and submit another patch to address them. :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>509619</commentid>
    <comment_count>5</comment_count>
      <attachid>116702</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-11-28 00:29:04 -0800</bug_when>
    <thetext>Comment on attachment 116702
Patch

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

&gt; Source/WebCore/plugins/blackberry/PluginPackageBlackBerry.cpp:191
&gt; +unsigned int PluginPackage::hash() const

Nit: unsigned int =&gt; unsigned.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:32
&gt; +#include &quot;Document.h&quot;

This include is unnecessary as Element.h (included below) includes this file.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:38
&gt; +#include &quot;FrameLoadRequest.h&quot;

This include is unnecessary as PluginView.h (included above) includes this file.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:40
&gt; +#include &quot;FrameLoader.h&quot;
&gt; +#include &quot;FrameTree.h&quot;

These includes are unnecessary as Frame.h (included above) includes these files.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:54
&gt; +#include &quot;PlatformMouseEvent.h&quot;

This include is unnecessary as EventHandler.h (included by Frame.h above) includes this file.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:59
&gt; +#include &quot;ScriptController.h&quot;

This include is unnecessary as Frame.h (included above) includes this file.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:88
&gt; +// -------

This comment doesn&apos;t add any value. Please remove it.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:90
&gt; +class PthreadMutexLocker {
&gt; +public:

Nit: We are underutilizing the idea of a class here since all of the member functions and instance variables are public in this class. It&apos;s sufficient to make this a struct and then we can remove the &quot;public:&quot; line.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:91
&gt; +    PthreadMutexLocker(pthread_mutex_t* mutex): m_mutex(mutex)

The initialization list should be on its own line and indented. For an example of this, see section &quot;Other Punctuation&quot; of &lt;http://www.webkit.org/coding/coding-style.html&gt;.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:105
&gt; +class PthreadReadLocker {
&gt; +public:

Nit: We are underutilizing the idea of a class here since all of the member functions and instance variables are public in this class. It&apos;s sufficient to make this a struct and then we can remove the &quot;public:&quot; line.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:106
&gt; +    PthreadReadLocker(pthread_rwlock_t* rwlock): m_rwlock(rwlock)

The initialization list should be on its own line and indented. For an example of this, see section &quot;Other Punctuation&quot; of &lt;http://www.webkit.org/coding/coding-style.html&gt;.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:120
&gt; +class PthreadWriteLocker {
&gt; +public:

Nit: We are underutilizing the idea of a class here since all of the member functions and instance variables are public in this class. It&apos;s sufficient to make this a struct and then we can remove the &quot;public:&quot; line.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:121
&gt; +    PthreadWriteLocker(pthread_rwlock_t* rwlock): m_rwlock(rwlock)

The initialization list should be on its own line and indented. For an example of this, see section &quot;Other Punctuation&quot; of &lt;http://www.webkit.org/coding/coding-style.html&gt;.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:141
&gt; +void npSetHolePunchHandler(void *data)

The &apos;*&apos; should be on the left.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:143
&gt; +    HolePunchData* d = static_cast&lt;HolePunchData*&gt;(data);

Nit: I suggest using OwnPtr here since we are taking ownership of this data. Then we can omit the &quot;delete d&quot; (line 146) at the end of this function.

Also, can we come up with a more descriptive name for this variable? Or at the very least, call it data, instead of &apos;d&apos;.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:153
&gt; +static NPRect toNPRect(const WebCore::IntRect&amp; rect)

Do we need the WebCore:: prefix here?

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:207
&gt; +    PluginViewPrivate(PluginView* view):
&gt; +        m_view(view)

This should read:

PluginViewPrivate(PluginView* view)
    : m_view(view)

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:231
&gt; +        snprintf(uniqueId, 50, &quot;PluginViewBB-%08x%08x-&quot;, s_counter++, (int)this);

Nit: Instead of hardcoding 50 here, we should use sizeof(uniqueId) so as to ensure we restrict snprintf to the size of the buffer, uniqueId.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:402
&gt; +        BlackBerry::Platform::Graphics::Buffer* buffer =
&gt; +            m_pluginBuffers[(m_pluginFrontBuffer + 1) % 2];

Nit: I would write this on one line.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:420
&gt; +

Remove this empty line as it doesn&apos;t increase the readability of this function body.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:445
&gt; +

Remove this empty line as it doesn&apos;t increase the readability of this function body.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:456
&gt; +        for (int i = 0; i &lt; 2; i++) {

Nit: Instead of harcoding the size of the m_pluginBuffer array (2) we should use WTF_ARRAY_LENGTH(), which is defined in wtf/StdLibExtras.h.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:500
&gt; +        for (int i = 0; (i &lt; 2) &amp;&amp; success; i++) {

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:520
&gt; +        for (int i = 0; i &lt; 2; i++) {

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:537
&gt; +        for (int i = 0; i &lt; 2; i++) {

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:542
&gt; +            if (m_pluginBuffers[i]) {
&gt; +                BlackBerry::Platform::Graphics::destroyBuffer(m_pluginBuffers[i]);
&gt; +                m_pluginBuffers[i] = 0;
&gt; +            }
&gt; +        }

Nit: The code in this for-loop is identical to code in the for-loop at line 456. We should look to extract this code into a common subroutine.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:551
&gt; +// -------

This comment is inane. Please remove it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510405</commentid>
    <comment_count>6</comment_count>
      <attachid>116868</attachid>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-28 19:11:49 -0800</bug_when>
    <thetext>Created attachment 116868
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510436</commentid>
    <comment_count>7</comment_count>
      <attachid>116868</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-11-28 20:14:47 -0800</bug_when>
    <thetext>Comment on attachment 116868
Patch

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

We need to iterate on these files and clean them up. Notice, PluginViewBlackBerry.cpp is almost 2000 lines long. We need to look to break out the functionality into this file into separate files as well as look to decompose some of the larger functions in this file, say paint(), into smaller functions so as to improve the readability of our plugin code. This refactoring can be done in separate bugs.

&gt; Source/WebCore/ChangeLog:8
&gt; +        This patch is to upstream BlackBerry porting of Plugin framework.

This change log is very long. I suggest removing the list of functions and just leave the list of added files since this patch is only adding files.

&gt; Source/WebCore/plugins/blackberry/PluginDataBlackBerry.cpp:44
&gt; +

Nit: I suggest removing this empty line since it doesn&apos;t improve the readability of this for-loop.

&gt; Source/WebCore/plugins/blackberry/PluginDataBlackBerry.cpp:48
&gt; +

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginDataBlackBerry.cpp:51
&gt; +

Nit: I suggest removing this empty line since it doesn&apos;t improve the readability of this function.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:546
&gt; +    ////////////////////////////////////////////////////////////////////////////////
&gt; +    // Static NPAPI Callbacks
&gt; +    ////////////////////////////////////////////////////////////////////////////////

Nit: This kind of stylized comment is excessive. Also, the use of the word &quot;static&quot; seems a bit disingenuous here. From my understanding, functions within an anonymous namespace have external linkage compared to static functions which have internal linkage. I take it that the word &quot;static&quot; here is meant to describe the non-member, non-friend quality of these functions. Regardless, I don&apos;t think the word &quot;static&quot; provides much value and hence I suggest removing it.

Therefore, I would change this comment block so that it reads:

// NPAPI callbacks

OR

// NPAPI callback functions

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:549
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Can we use static_cast?

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:556
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:563
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:570
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:577
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:584
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:591
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:598
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:605
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:612
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:619
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:626
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:633
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:640
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:647
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:654
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:661
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:668
&gt; +        WebCore::PluginView* pv = (WebCore::PluginView *)instance-&gt;ndata;

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:674
&gt; +    {

This brace should be on the previous line (line 673).

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:753
&gt; +    if (m_clipRect.isEmpty()
&gt; +        || (platformPluginWidget() &amp;&amp; (m_windowRect != oldWindowRect || m_clipRect != oldClipRect || zoomFactorChanged)))
&gt; +        setNPWindowIfNeeded();

Because the condition expression of this if-statement spans multiple lines, we need to use braces for this if-statement.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:831
&gt; +void PluginView::paint(GraphicsContext* context, const IntRect&amp; rect)

Wow. This function is 179 lines long. We should look to break out the painting into subroutines. We can do this in a follow up patch.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1034
&gt; +    setCallingPlugin(true);
&gt; +
&gt; +    bool accepted = m_plugin-&gt;pluginFuncs()-&gt;event(m_instance, &amp;event);
&gt; +
&gt; +    setCallingPlugin(false);

This pattern of calling setCallingPlugin(true) and setCallingPlugin(false) comes up throughout this patch. Instead of balancing setCallingPlugin(true) and setCallingPlugin(false) we should define a RAII object that on construction calls setCallingPlugin(true) and on destruction calls setCallingPlugin(false). We can do this in a separate bug.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1044
&gt; +    const PlatformKeyboardEvent *platformKeyEvent = event-&gt;keyEvent();

The &apos;*&apos; should be on the left.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1066
&gt; +    if (platformKeyEvent-&gt;type() == PlatformKeyboardEvent::RawKeyDown
&gt; +            || platformKeyEvent-&gt;type() == PlatformKeyboardEvent::KeyDown) {

Nit: I would just write this on one line. Then we can remove the curly braces.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1141
&gt; +        npTouchEvent.points = new NPTouchPoint[touchList-&gt;length()];

We should use OwnArrayPtr here. Then we can remove the delete[] on line 1172.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1800
&gt; +    IntRect r(rect-&gt;left, rect-&gt;top, rect-&gt;right - rect-&gt;left, rect-&gt;bottom - rect-&gt;top);
&gt; +    invalidateRect(r);

Nit: The variable r is only being referenced on line 1800. I suggest we just inline the IntRect constructor call into line 1800.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1920
&gt; +    NPScreenWindowHandles* screenWinHandles = (NPScreenWindowHandles*)valPtr;

We should use static_cast instead of C-style casts.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1939
&gt; +    BlackBerry::Platform::Graphics::Buffer* buffer =
&gt; +        m_private-&gt;lockReadFrontBufferInternal();

Nit: I would write this on one line.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1951
&gt; +

Nit: I suggest removing this empty line since it doesn&apos;t help improve the readability of this function body, which is already short.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1960
&gt; +

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1969
&gt; +

Ditto.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1978
&gt; +    if (m_private-&gt;m_isBackgroundPlaying != value) {

Nit: I suggest using an early-return style here so that we can remove one level of indentation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510449</commentid>
    <comment_count>8</comment_count>
      <attachid>116879</attachid>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-28 20:47:05 -0800</bug_when>
    <thetext>Created attachment 116879
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510456</commentid>
    <comment_count>9</comment_count>
      <attachid>116879</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2011-11-28 20:55:00 -0800</bug_when>
    <thetext>Comment on attachment 116879
Patch

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

&gt; Source/WebCore/plugins/blackberry/PluginPackageBlackBerry.cpp:103
&gt; +    String s = gm();

&apos;s&apos; does not have much meaning.

nor does &apos;gm&apos;

&gt; Source/WebCore/plugins/blackberry/PluginPackageBlackBerry.cpp:110
&gt; +            Vector&lt;String&gt; exts;

ditto with &apos;exts&apos;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510486</commentid>
    <comment_count>10</comment_count>
      <attachid>116892</attachid>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-28 22:04:00 -0800</bug_when>
    <thetext>Created attachment 116892
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510492</commentid>
    <comment_count>11</comment_count>
      <attachid>116892</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-11-28 22:13:32 -0800</bug_when>
    <thetext>Comment on attachment 116892
Patch

Thanks Charles.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510536</commentid>
    <comment_count>12</comment_count>
      <attachid>116892</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-11-28 23:39:55 -0800</bug_when>
    <thetext>Comment on attachment 116892
Patch

Clearing flags on attachment: 116892

Committed r101331: &lt;http://trac.webkit.org/changeset/101331&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>510537</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-11-28 23:40:00 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511297</commentid>
    <comment_count>14</comment_count>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-29 18:39:35 -0800</bug_when>
    <thetext>Re-open it for more patches to come.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511301</commentid>
    <comment_count>15</comment_count>
      <attachid>117097</attachid>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-29 18:50:47 -0800</bug_when>
    <thetext>Created attachment 117097
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511309</commentid>
    <comment_count>16</comment_count>
      <attachid>117097</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2011-11-29 19:17:10 -0800</bug_when>
    <thetext>Comment on attachment 117097
Patch

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

&gt; Source/WebCore/plugins/blackberry/PluginViewHelperBlackBerry.cpp:20
&gt; +#include &quot;PluginViewHelperBlackBerry.h&quot;

HelperXXX files are not recomended in WebKit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511311</commentid>
    <comment_count>17</comment_count>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-29 19:19:34 -0800</bug_when>
    <thetext>(In reply to comment #16)
&gt; (From update of attachment 117097 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=117097&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/plugins/blackberry/PluginViewHelperBlackBerry.cpp:20
&gt; &gt; +#include &quot;PluginViewHelperBlackBerry.h&quot;
&gt; 
&gt; HelperXXX files are not recomended in WebKit.

Thanks, Antonio.  What do you suggest we should name it  ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511343</commentid>
    <comment_count>18</comment_count>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2011-11-29 20:43:58 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; (In reply to comment #16)
&gt; &gt; (From update of attachment 117097 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=117097&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/plugins/blackberry/PluginViewHelperBlackBerry.cpp:20
&gt; &gt; &gt; +#include &quot;PluginViewHelperBlackBerry.h&quot;
&gt; &gt; 
&gt; &gt; HelperXXX files are not recomended in WebKit.
&gt; 
&gt; Thanks, Antonio.  What do you suggest we should name it  ?

Maybe NPCallbacksBlackBerry, Charles?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511381</commentid>
    <comment_count>19</comment_count>
      <attachid>117122</attachid>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-29 21:59:19 -0800</bug_when>
    <thetext>Created attachment 117122
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511383</commentid>
    <comment_count>20</comment_count>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-29 22:02:42 -0800</bug_when>
    <thetext>Patch re-submitted after renaming from PluginViewHelperBlackBerry to NPCallbacksBlackBerry,  following Antonio&apos;s suggestion.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511735</commentid>
    <comment_count>21</comment_count>
      <attachid>117122</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2011-11-30 07:30:04 -0800</bug_when>
    <thetext>Comment on attachment 117122
Patch

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

there are some nits, but it looks good r+.

Please fix them before landing :)

&gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:77
&gt; +    PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; +    PluginViewPrivate* viewPrivate = view-&gt;getPrivate();

maybe we could make it a helper static local function: toPluginView (or a better name)?

&gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:84
&gt; +    PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; +    PluginViewPrivate* viewPrivate = view-&gt;getPrivate();

... and use it here

&gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:91
&gt; +    PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; +    PluginViewPrivate* viewPrivate = view-&gt;getPrivate();

... and here

&gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:98
&gt; +    PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; +    PluginViewPrivate* viewPrivate = view-&gt;getPrivate();

... and here

&gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:105
&gt; +    PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; +    PluginViewPrivate* viewPrivate = view-&gt;getPrivate();

... and here

&gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:112
&gt; +    PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; +    PluginViewPrivate* viewPrivate = view-&gt;getPrivate();

... and here

&gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:119
&gt; +    PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; +    PluginViewPrivate* viewPrivate = view-&gt;getPrivate();

... and here

&gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:126
&gt; +    PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; +    PluginViewPrivate* viewPrivate = view-&gt;getPrivate();

... and here

&gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:133
&gt; +    PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; +    PluginViewPrivate* viewPrivate = view-&gt;getPrivate();

... and here

&gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:140
&gt; +    PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; +    PluginViewPrivate* viewPrivate = view-&gt;getPrivate();

... and here

&gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:156
&gt; +NPSurface lockReadFrontBuffer(NPP instance)
&gt; +{
&gt; +PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; +PluginViewPrivate* viewPrivate = view-&gt;getPrivate();
&gt; +return viewPrivate-&gt;lockReadFrontBuffer();
&gt; +}

... and here

ps: identation issue here!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511785</commentid>
    <comment_count>22</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-11-30 08:54:22 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; Re-open it for more patches to come.

Please don&apos;t do this. A bug should only be re-opened if the patch has been rolled out. Instead, please file a new bug with a new patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512378</commentid>
    <comment_count>23</comment_count>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-30 19:51:11 -0800</bug_when>
    <thetext>
&gt; 
&gt; there are some nits, but it looks good r+.
&gt; 
&gt; Please fix them before landing :)
&gt; 
&gt; &gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:77
&gt; &gt; +    PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; &gt; +    PluginViewPrivate* viewPrivate = view-&gt;getPrivate();
&gt; 
&gt; maybe we could make it a helper static local function: toPluginView (or a better name)?
&gt; 

----  This view-&gt;getPrivate() is defined in the base class PluginView. in the upper directory, which has not been landed. So we will keep this as is for now until the PluginView.h is also upstreamed. 

&gt; &gt; Source/WebCore/plugins/blackberry/NPCallbacksBlackBerry.cpp:156
&gt; &gt; +NPSurface lockReadFrontBuffer(NPP instance)
&gt; &gt; +{
&gt; &gt; +PluginView* view = static_cast&lt;PluginView*&gt;(instance-&gt;ndata);
&gt; &gt; +PluginViewPrivate* viewPrivate = view-&gt;getPrivate();
&gt; &gt; +return viewPrivate-&gt;lockReadFrontBuffer();
&gt; &gt; +}
&gt; &gt; 
&gt; ps: identation issue here!

---- This will be fixed in the new patch.

Thanks Antonio, for the review.  I am moving the thread to a new bug,  73513, for better tracking since there are too many discussions here , and as suggested, I should not re-open this bug since it&apos;s already automatically closed by the system.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116702</attachid>
            <date>2011-11-27 23:17:13 -0800</date>
            <delta_ts>2011-11-28 19:11:36 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73185-20111128151800.patch</filename>
            <type>text/plain</type>
            <size>80652</size>
            <attacher name="Charles Wei">charles.wei</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwMTIyMikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEyMyBAQAorMjAxMS0xMS0yNyAgV2VpIENo
YXJsZXMgIDxjaGFybGVzLndlaUB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgVXBzdHJl
YW0gQmxhY2tCZXJyeSBwb3J0aW5nIG9mIHBsdWdpbiBmcmFtZXdvcmsKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczMTg1CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBpcyB0byB1cHN0cmVh
bSBCbGFja0JlcnJ5IHBvcnRpbmcgb2YgUGx1Z2luIGZyYW1ld29yay4KKyAgICAgICAgQmxhY2tC
ZXJyeSBwb3J0aW5nIG9mIHBsdWdpbiBoYXMgdGhlIGZvbGxvd2luZyBtYWluIGNvbnRyaWJ1dG9y
czoKKworICAgICAgICBOaWNrIFJldGVsbGUgICAgPG5yYXRlbGxlQHJpbS5jb20+CisgICAgICAg
IEphY29iIFBldHNvdml0cyA8anBldHNvdml0c0ByaW0uY29tPgorICAgICAgICBBZGFtIFRyZWF0
ICAgICAgPGF0cmVhdEByaW0uY29tPgorICAgICAgICBHZW5ldmlldmUgTWFyayAgPGdtYWtAcmlt
LmNvbT4KKyAgICAgICAgR2VvcmdlIFN0YWlrb3MgIDxnc3RhaWtvc0ByaW0uY29tPgorICAgICAg
ICBNaWtlIEZlbnRvbiAgICAgPG1pZmVudG9uQHJpbS5jb20+CisgICAgICAgIEFydmlkIE5pbHNz
b24gICA8YW5pbHNvbkByaW0uY29tPgorICAgICAgICBSb2JpbiBDYW8gICAgICAgPHJvYmluLmNh
b0B0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgTm8gbmV3IHRlc3RzLiBObyBuZXcgdGVz
dCBjYXNlcyBmb3Igbm93LgorCisgICAgICAgICogcGx1Z2lucy9ibGFja2JlcnJ5OiBBZGRlZC4K
KyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luRGF0YUJsYWNrQmVycnkuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpbkRhdGE6OmluaXRQbHVnaW5zKToKKyAgICAg
ICAgKFdlYkNvcmU6OlBsdWdpbkRhdGE6OnJlZnJlc2gpOgorICAgICAgICAqIHBsdWdpbnMvYmxh
Y2tiZXJyeS9QbHVnaW5QYWNrYWdlQmxhY2tCZXJyeS5jcHA6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZTo6bnBuTWVtRnJlZSk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5QYWNrYWdlOjplcXVh
bCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5QYWNrYWdlOjpmZXRjaEluZm8pOgorICAgICAg
ICAoV2ViQ29yZTo6UGx1Z2luUGFja2FnZTo6c2l0ZXNXaXRoRGF0YSk6CisgICAgICAgIChXZWJD
b3JlOjpQbHVnaW5QYWNrYWdlOjpjbGVhclNpdGVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlBs
dWdpblBhY2thZ2U6OnRyeUdldFNpdGVzV2l0aERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6UGx1
Z2luUGFja2FnZTo6dHJ5Q2xlYXJTaXRlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5Q
YWNrYWdlOjpoYXNoKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblBhY2thZ2U6OmxvYWQpOgor
ICAgICAgICAoV2ViQ29yZTo6UGx1Z2luUGFja2FnZTo6TlBWZXJzaW9uKToKKyAgICAgICAgKiBw
bHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld0JsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAg
ICAgKFB0aHJlYWRNdXRleExvY2tlcjo6UHRocmVhZE11dGV4TG9ja2VyKToKKyAgICAgICAgKFB0
aHJlYWRNdXRleExvY2tlcjo6flB0aHJlYWRNdXRleExvY2tlcik6CisgICAgICAgIChQdGhyZWFk
UmVhZExvY2tlcjo6UHRocmVhZFJlYWRMb2NrZXIpOgorICAgICAgICAoUHRocmVhZFJlYWRMb2Nr
ZXI6On5QdGhyZWFkUmVhZExvY2tlcik6CisgICAgICAgIChQdGhyZWFkV3JpdGVMb2NrZXI6OlB0
aHJlYWRXcml0ZUxvY2tlcik6CisgICAgICAgIChQdGhyZWFkV3JpdGVMb2NrZXI6On5QdGhyZWFk
V3JpdGVMb2NrZXIpOgorICAgICAgICAobnBTZXRIb2xlUHVuY2hIYW5kbGVyKToKKyAgICAgICAg
KFdlYkNvcmU6OnRvTlBSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRl
OjpQbHVnaW5WaWV3UHJpdmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0
ZTo6flBsdWdpblZpZXdQcml2YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2
YXRlOjp0b0J1ZmZlclR5cGUpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGU6
OnNldFpvb21GYWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGU6OnNl
dFZpc2libGVSZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6Y2xl
YXJWaXNpYmxlUmVjdHMpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGU6OnNo
b3dLZXlib2FyZCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6cmVxdWVz
dEZ1bGxTY3JlZW4pOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGU6OmV4aXRG
dWxsU2NyZWVuKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlOjpyZXF1ZXN0
Q2VudGVyRml0Wm9vbSk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6bG9j
a09yaWVudGF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlOjp1bmxv
Y2tPcmllbnRhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6cHJl
dmVudElkbGUpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGU6OnNldEhvbGVQ
dW5jaCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6bG9ja0JhY2tCdWZm
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGU6OnVubG9ja0JhY2tCdWZm
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGU6OmxvY2tSZWFkRnJvbnRC
dWZmZXJJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6bG9j
a1JlYWRGcm9udEJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6
dW5sb2NrUmVhZEZyb250QnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2
YXRlOjpzd2FwQnVmZmVycyk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6
Y3JlYXRlQnVmZmVycyk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6cmVz
aXplQnVmZmVycyk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6ZGVzdHJv
eUJ1ZmZlcnMpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6dXBkYXRlUGx1Z2luV2lk
Z2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OnNldEZvY3VzKToKKyAgICAgICAg
KFdlYkNvcmU6OlBsdWdpblZpZXc6OnNob3cpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmll
dzo6aGlkZSk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3Ojp1cGRhdGVCdWZmZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6cGFpbnQpOgorICAgICAgICAoV2ViQ29yZTo6
UGx1Z2luVmlldzo6ZGlzcGF0Y2hGdWxsU2NyZWVuTlBFdmVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpQbHVnaW5WaWV3OjpkaXNwYXRjaE5QRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2lu
Vmlldzo6aGFuZGxlS2V5Ym9hcmRFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3
OjpoYW5kbGVXaGVlbEV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmhhbmRs
ZVRvdWNoRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6aGFuZGxlTW91c2VF
dmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpoYW5kbGVGb2N1c0luRXZlbnQp
OgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6aGFuZGxlRm9jdXNPdXRFdmVudCk6Cisg
ICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpoYW5kbGVQYXVzZUV2ZW50KToKKyAgICAgICAg
KFdlYkNvcmU6OlBsdWdpblZpZXc6OmhhbmRsZVJlc3VtZUV2ZW50KToKKyAgICAgICAgKFdlYkNv
cmU6OlBsdWdpblZpZXc6OmhhbmRsZVNjcm9sbEV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBs
dWdpblZpZXc6OmNhbGN1bGF0ZUNsaXBSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZp
ZXc6OmhhbmRsZU9uTG9hZEV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6Omhh
bmRsZUZyZWVNZW1vcnlFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpoYW5k
bGVCYWNrZ3JvdW5kRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6aGFuZGxl
Rm9yZWdyb3VuZEV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmhhbmRsZUZ1
bGxTY3JlZW5BbGxvd2VkRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6aGFu
ZGxlRnVsbFNjcmVlbkV4aXRFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3Ojpo
YW5kbGVJZGxlRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6aGFuZGxlQXBw
QWN0aXZhdGVkRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6aGFuZGxlQXBw
RGVhY3RpdmF0ZWRFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpoYW5kbGVB
cHBTdGFuZGJ5RXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6aGFuZGxlT3Jp
ZW50YXRpb25FdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpoYW5kbGVTd2lw
ZUV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmhhbmRsZVNjcmVlblBvd2Vy
RXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6c2V0UGFyZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OnNldE5QV2luZG93UmVjdCk6CisgICAgICAgIChXZWJD
b3JlOjpQbHVnaW5WaWV3OjpzZXROUFdpbmRvd0lmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6
OlBsdWdpblZpZXc6OnNldFBhcmVudFZpc2libGUpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2lu
Vmlldzo6aGFuZGxlUG9zdFJlYWRGaWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6
OnBsYXRmb3JtR2V0VmFsdWVTdGF0aWMpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6
cGxhdGZvcm1HZXRWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjppbnZhbGlk
YXRlUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVnaW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmZvcmNlUmVkcmF3KToKKyAgICAgICAg
KFdlYkNvcmU6OlBsdWdpblZpZXc6OnBsYXRmb3JtU3RhcnQpOgorICAgICAgICAoV2ViQ29yZTo6
UGx1Z2luVmlldzo6cGxhdGZvcm1EZXN0cm95KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZp
ZXc6OmhhbHQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6cmVzdGFydCk6CisgICAg
ICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpnZXRXaW5kb3dJbmZvKToKKyAgICAgICAgKFdlYkNv
cmU6OlBsdWdpblZpZXc6OmxvY2tGcm9udEJ1ZmZlckZvclJlYWQpOgorICAgICAgICAoV2ViQ29y
ZTo6UGx1Z2luVmlldzo6dW5sb2NrRnJvbnRCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6UGx1
Z2luVmlldzo6cGxhdGZvcm1MYXllcik6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3Ojpl
bnN1cmVWaXNpYmxlUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpzZXRCYWNr
Z3JvdW5kUGxheSk6CisKIDIwMTEtMTEtMjcgIEx1a2UgTWFjcGhlcnNvbiAgIDxtYWNwaGVyc29u
QGNocm9taXVtLm9yZz4KIAogICAgICAgICBJbXBsZW1lbnQgQ1NTUHJvcGVydHlUZXh0QWxpZ24g
aW4gQ1NTU3R5bGVBcHBseVByb3BlcnR5LgpJbmRleDogU291cmNlL1dlYkNvcmUvcGx1Z2lucy9i
bGFja2JlcnJ5L1BsdWdpbkRhdGFCbGFja0JlcnJ5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luRGF0YUJsYWNrQmVycnkuY3BwCShyZXZp
c2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1BsdWdpbkRhdGFC
bGFja0JlcnJ5LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24s
IE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiUGx1Z2luRGF0YS5oIgorCisjaW5jbHVkZSAiUGx1Z2luRGF0YWJhc2UuaCIKKyNpbmNsdWRl
ICJQbHVnaW5QYWNrYWdlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBQbHVnaW5E
YXRhOjppbml0UGx1Z2lucyhjb25zdCBQYWdlKikKK3sKKyAgICBQbHVnaW5EYXRhYmFzZSogZGIg
PSBQbHVnaW5EYXRhYmFzZTo6aW5zdGFsbGVkUGx1Z2lucygpOworICAgIGNvbnN0IFZlY3RvcjxQ
bHVnaW5QYWNrYWdlKj4mIHBsdWdpbnMgPSBkYi0+cGx1Z2lucygpOworCisgICAgZm9yICh1bnNp
Z25lZCBpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBsdWdp
blBhY2thZ2UqIHBhY2thZ2UgPSBwbHVnaW5zW2ldOworCisgICAgICAgIFBsdWdpbkluZm8gaW5m
bzsKKyAgICAgICAgaW5mby5uYW1lID0gcGFja2FnZS0+bmFtZSgpOworICAgICAgICBpbmZvLmZp
bGUgPSBwYWNrYWdlLT5maWxlTmFtZSgpOworICAgICAgICBpbmZvLmRlc2MgPSBwYWNrYWdlLT5k
ZXNjcmlwdGlvbigpOworCisgICAgICAgIGNvbnN0IE1JTUVUb0Rlc2NyaXB0aW9uc01hcCYgbWlt
ZVRvRGVzY3JpcHRpb25zID0gcGFja2FnZS0+bWltZVRvRGVzY3JpcHRpb25zKCk7CisgICAgICAg
IE1JTUVUb0Rlc2NyaXB0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbWltZVRvRGVzY3Jp
cHRpb25zLmVuZCgpOworICAgICAgICBmb3IgKE1JTUVUb0Rlc2NyaXB0aW9uc01hcDo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBtaW1lVG9EZXNjcmlwdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KSB7CisgICAgICAgICAgICBNaW1lQ2xhc3NJbmZvIG1pbWU7CisKKyAgICAgICAgICAgIG1pbWUu
dHlwZSA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIG1pbWUuZGVzYyA9IGl0LT5zZWNvbmQ7Cisg
ICAgICAgICAgICBtaW1lLmV4dGVuc2lvbnMgPSBwYWNrYWdlLT5taW1lVG9FeHRlbnNpb25zKCku
Z2V0KG1pbWUudHlwZSk7CisKKyAgICAgICAgICAgIGluZm8ubWltZXMuYXBwZW5kKG1pbWUpOwor
ICAgICAgICB9CisKKyAgICAgICAgbV9wbHVnaW5zLmFwcGVuZChpbmZvKTsKKyAgICB9CisKK30K
Kwordm9pZCBQbHVnaW5EYXRhOjpyZWZyZXNoKCkKK3sKKyAgICBQbHVnaW5EYXRhYmFzZSogZGIg
PSBQbHVnaW5EYXRhYmFzZTo6aW5zdGFsbGVkUGx1Z2lucygpOworICAgIGRiLT5yZWZyZXNoKCk7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsdWdp
bnMvYmxhY2tiZXJyeS9QbHVnaW5QYWNrYWdlQmxhY2tCZXJyeS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1BsdWdpblBhY2thZ2VCbGFja0JlcnJ5
LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9Q
bHVnaW5QYWNrYWdlQmxhY2tCZXJyeS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjU5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIEx0ZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGlt
aXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIlBsdWdpblBhY2thZ2UuaCIKKworI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnku
aCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBsdWdpbkRlYnVnLmgi
CisjaW5jbHVkZSAibnBydW50aW1lX2ltcGwuaCIKKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5j
bHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvU3RyaW5n
SGFzaGVyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCitleHRlcm4gaW50IGVy
cm5vOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgbnBuTWVtRnJlZSh2b2lkKiBwdHIp
Cit7CisgICAgLy8gV2UgY291bGQgdXNlIGZhc3RGcmVlIGhlcmUsIGJ1dCB0aGVyZSBtaWdodCBi
ZSBwbHVnLWlucyB0aGF0IG1peCBOUE5fTWVtQWxsb2MvTlBOX01lbUZyZWUgd2l0aCBtYWxsb2Mg
YW5kIGZyZWUsCisgICAgLy8gc28gaGF2aW5nIHRoZW0gYmUgZXF1aXZhbGVudCBzZWVtcyBsaWtl
IGEgZ29vZCBpZGVhLgorICAgIGZyZWUocHRyKTsKK30KKworYm9vbCBQbHVnaW5QYWNrYWdlOjpl
cXVhbChQbHVnaW5QYWNrYWdlIGNvbnN0JiBhLCBQbHVnaW5QYWNrYWdlIGNvbnN0JiBiKQorewor
ICAgIGlmIChhLm1fbmFtZSAhPSBiLm1fbmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgaWYgKGEubV9kZXNjcmlwdGlvbiAhPSBiLm1fZGVzY3JpcHRpb24pCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGlmIChhLm1fbWltZVRvRXh0ZW5zaW9ucy5zaXplKCkgIT0gYi5tX21p
bWVUb0V4dGVuc2lvbnMuc2l6ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBNSU1F
VG9FeHRlbnNpb25zTWFwOjpjb25zdF9pdGVyYXRvcjo6S2V5cyBlbmQgPSBhLm1fbWltZVRvRXh0
ZW5zaW9ucy5lbmQoKS5rZXlzKCk7CisgICAgZm9yIChNSU1FVG9FeHRlbnNpb25zTWFwOjpjb25z
dF9pdGVyYXRvcjo6S2V5cyBpdCA9IGEubV9taW1lVG9FeHRlbnNpb25zLmJlZ2luKCkua2V5cygp
OyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgaWYgKCFiLm1fbWltZVRvRXh0ZW5zaW9ucy5j
b250YWlucygqaXQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJl
dHVybiB0cnVlOworfQorCitib29sIFBsdWdpblBhY2thZ2U6OmZldGNoSW5mbygpCit7CisgICAg
aWYgKCFsb2FkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEZJWE1FOiBGaW5k
IGEgYmV0dGVyIHdheSB0byBnZXQgYXJvdW5kIHRoZSBmZXRjaGluZm8gbG9hZC4KKyAgICAvLyBX
ZSBhcmUgZmV0Y2hpbmcgdGhlIGluZm8uIFRlY2huaWNhbGx5IHdlIGhhdmUgbm90IGxvYWRlZCB0
aGUgcGx1Z2luLiBQbHVnaW5WaWV3OjpJbml0IHdpbGwgbG9hZCB0aGUgcGx1Z2luIHNvIGRlY3Jl
bWVudCB0aGUgY291bnRlcgorICAgIG1fbG9hZENvdW50LS07CisKKyAgICB0eXBlZGVmIGNoYXIg
KigqTlBQX0dldE1JTUVEZXNjcmlwdGlvblByb2NQdHIpKCk7CisgICAgTlBQX0dldE1JTUVEZXNj
cmlwdGlvblByb2NQdHIgZ20gPSAoTlBQX0dldE1JTUVEZXNjcmlwdGlvblByb2NQdHIpIGRsc3lt
KG1fbW9kdWxlLCAiTlBfR2V0TUlNRURlc2NyaXB0aW9uIik7CisgICAgTlBQX0dldFZhbHVlUHJv
Y1B0ciBndiA9IChOUFBfR2V0VmFsdWVQcm9jUHRyKSBkbHN5bShtX21vZHVsZSwgIk5QX0dldFZh
bHVlIik7CisKKyAgICBpZiAoIWdtIHx8ICFndikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgY2hhciogYnVmID0gMDsKKyAgICBOUEVycm9yIGVyciA9IGd2KDAsIE5QUFZwbHVnaW5OYW1l
U3RyaW5nLCAodm9pZCAqKSAmYnVmKTsKKyAgICBpZiAoZXJyICE9IE5QRVJSX05PX0VSUk9SKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtX25hbWUgPSBidWY7CisKKyAgICBlcnIgPSBn
digwLCBOUFBWcGx1Z2luRGVzY3JpcHRpb25TdHJpbmcsICh2b2lkICopICZidWYpOworICAgIGlm
IChlcnIgIT0gTlBFUlJfTk9fRVJST1IpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1f
ZGVzY3JpcHRpb24gPSBidWY7CisgICAgZGV0ZXJtaW5lTW9kdWxlVmVyc2lvbkZyb21EZXNjcmlw
dGlvbigpOworCisgICAgU3RyaW5nIHMgPSBnbSgpOworICAgIFZlY3RvcjxTdHJpbmc+IHR5cGVz
OworICAgIHMuc3BsaXQoVUNoYXIoJzsnKSwgZmFsc2UsIHR5cGVzKTsKKyAgICBmb3IgKHVuc2ln
bmVkIGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFZlY3RvcjxT
dHJpbmc+IG1pbWU7CisgICAgICAgIHR5cGVzW2ldLnNwbGl0KFVDaGFyKCc6JyksIHRydWUsIG1p
bWUpOworICAgICAgICBpZiAobWltZS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBWZWN0b3I8
U3RyaW5nPiBleHRzOworICAgICAgICAgICAgaWYgKG1pbWUuc2l6ZSgpID4gMSkKKyAgICAgICAg
ICAgICAgICBtaW1lWzFdLnNwbGl0KFVDaGFyKCcsJyksIGZhbHNlLCBleHRzKTsKKyAgICAgICAg
ICAgIGRldGVybWluZVF1aXJrcyhtaW1lWzBdKTsKKyAgICAgICAgICAgIG1fbWltZVRvRXh0ZW5z
aW9ucy5hZGQobWltZVswXSwgZXh0cyk7CisgICAgICAgICAgICBpZiAobWltZS5zaXplKCkgPiAy
KQorICAgICAgICAgICAgICAgIG1fbWltZVRvRGVzY3JpcHRpb25zLmFkZChtaW1lWzBdLCBtaW1l
WzJdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitWZWN0b3I8
U3RyaW5nPiBQbHVnaW5QYWNrYWdlOjpzaXRlc1dpdGhEYXRhKCkKK3sKKyAgICBWZWN0b3I8U3Ry
aW5nPiBzaXRlczsKKyAgICB0cnlHZXRTaXRlc1dpdGhEYXRhKHNpdGVzKTsKKworICAgIHJldHVy
biBzaXRlczsKK30KKworYm9vbCBQbHVnaW5QYWNrYWdlOjpjbGVhclNpdGVEYXRhKGNvbnN0IFN0
cmluZyYgc2l0ZSwgdWludDY0X3QgZmxhZ3MsIHVpbnQ2NF90IG1heEFnZSkKK3sKKyAgICBib29s
IHJlc3VsdCA9IHRyeUNsZWFyU2l0ZURhdGEoc2l0ZSwgZmxhZ3MsIG1heEFnZSk7CisKKyAgICBy
ZXR1cm4gcmVzdWx0OworfQorCitib29sIFBsdWdpblBhY2thZ2U6OnRyeUdldFNpdGVzV2l0aERh
dGEoVmVjdG9yPFN0cmluZz4mIHNpdGVzKQoreworICAgIGlmICghbG9hZCgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTogRmluZCBhIGJldHRlciB3YXkgdG8gZW5zdXJl
IHRoZSBwbHVnaW4gaXMgbG9hZGVkLgorICAgIC8vIFBsdWdpblZpZXc6OkluaXQgd2lsbCBsb2Fk
IHRoZSBwbHVnaW4gc28gZGVjcmVtZW50IHRoZSBjb3VudGVyCisgICAgbV9sb2FkQ291bnQtLTsK
KworICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnLWluIHN1cHBvcnRzIE5QUF9HZXRTaXRlc1dpdGhE
YXRhLgorICAgIGlmICghbV9wbHVnaW5GdW5jcy5nZXRzaXRlc3dpdGhkYXRhKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBjaGFyKiogc2l0ZUFycmF5ID0gbV9wbHVnaW5GdW5jcy5nZXRz
aXRlc3dpdGhkYXRhKCk7CisKKyAgICAvLyBUaGVyZSB3ZXJlIG5vIHNpdGVzIHdpdGggZGF0YS4K
KyAgICBpZiAoIXNpdGVBcnJheSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBmb3IgKGlu
dCBpID0gMDsgc2l0ZUFycmF5W2ldOyArK2kpIHsKKyAgICAgICAgY2hhciogc2l0ZSA9IHNpdGVB
cnJheVtpXTsKKworICAgICAgICBTdHJpbmcgc2l0ZVN0cmluZyA9IFN0cmluZzo6ZnJvbVVURjgo
c2l0ZSk7CisgICAgICAgIGlmICghc2l0ZVN0cmluZy5pc051bGwoKSkKKyAgICAgICAgICAgIHNp
dGVzLmFwcGVuZChzaXRlU3RyaW5nKTsKKworICAgICAgICBucG5NZW1GcmVlKHNpdGUpOworICAg
IH0KKworICAgIG5wbk1lbUZyZWUoc2l0ZUFycmF5KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
Ym9vbCBQbHVnaW5QYWNrYWdlOjp0cnlDbGVhclNpdGVEYXRhKGNvbnN0IFN0cmluZyYgc2l0ZSwg
dWludDY0X3QgZmxhZ3MsIHVpbnQ2NF90IG1heEFnZSkKK3sKKyAgICBpZiAoIWxvYWQoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6IEZpbmQgYSBiZXR0ZXIgd2F5IHRv
IGVuc3VyZSB0aGUgcGx1Z2luIGlzIGxvYWRlZC4KKyAgICAvLyBQbHVnaW5WaWV3OjpJbml0IHdp
bGwgbG9hZCB0aGUgcGx1Z2luIHNvIGRlY3JlbWVudCB0aGUgY291bnRlcgorICAgIG1fbG9hZENv
dW50LS07CisKKyAgICAvLyBDaGVjayBpZiB0aGUgcGx1Zy1pbiBzdXBwb3J0cyBOUFBfQ2xlYXJT
aXRlRGF0YS4KKyAgICBpZiAoIW1fcGx1Z2luRnVuY3MuY2xlYXJzaXRlZGF0YSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgQ1N0cmluZyBzaXRlU3RyaW5nOworICAgIGlmICghc2l0ZS5p
c051bGwoKSkKKyAgICAgICAgc2l0ZVN0cmluZyA9IHNpdGUudXRmOCgpOworCisgICAgcmV0dXJu
IG1fcGx1Z2luRnVuY3MuY2xlYXJzaXRlZGF0YShzaXRlU3RyaW5nLmRhdGEoKSwgZmxhZ3MsIG1h
eEFnZSkgPT0gTlBFUlJfTk9fRVJST1I7Cit9CisKK3Vuc2lnbmVkIGludCBQbHVnaW5QYWNrYWdl
OjpoYXNoKCkgY29uc3QKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBoYXNoQ29kZXNbXSA9IHsKKyAg
ICAgICAgbV9uYW1lLmltcGwoKS0+aGFzaCgpLAorICAgICAgICBtX2Rlc2NyaXB0aW9uLmltcGwo
KS0+aGFzaCgpLAorICAgICAgICBtX21pbWVUb0V4dGVuc2lvbnMuc2l6ZSgpCisgICAgfTsKKwor
ICAgIHJldHVybiBTdHJpbmdIYXNoZXI6OmNvbXB1dGVIYXNoKHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgVUNoYXIqPihoYXNoQ29kZXMpLCBzaXplb2YoaGFzaENvZGVzKSAvIHNpemVvZihVQ2hhcikp
OworfQorCitib29sIFBsdWdpblBhY2thZ2U6OmxvYWQoKQoreworICAgIGlmIChtX2lzTG9hZGVk
KSB7CisgICAgICAgIG1fbG9hZENvdW50Kys7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KworICAgIGlmIChtX2ZyZWVMaWJyYXJ5VGltZXIuaXNBY3RpdmUoKSkgeworICAgICAgICBBU1NF
UlQobV9tb2R1bGUpOworICAgICAgICBtX2ZyZWVMaWJyYXJ5VGltZXIuc3RvcCgpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIEFTU0VSVCghbV9sb2FkQ291bnQpOworICAgICAgICBtX21vZHVsZSA9
IGRsb3BlbihtX3BhdGgudXRmOCgpLmRhdGEoKSwgUlRMRF9MQVpZKTsKKyAgICB9CisKKyAgICBp
ZiAoIW1fbW9kdWxlKSB7CisgICAgICAgIExPRyhQbHVnaW5zLCAiJXMgbm90IGxvYWRlZCAoJXMp
IiwgbV9wYXRoLnV0ZjgoKS5kYXRhKCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHByaW50
ZigiUGx1Z2luUGFja2FnZTo6bG9hZCgpIC0gJXMgbm90IGxvYWRlZCAoJXMpIiwgbV9wYXRoLnV0
ZjgoKS5kYXRhKCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICBtX2lzTG9hZGVkID0gdHJ1ZTsKKworICAgIE5QX0luaXRpYWxpemVGdW5jUHRy
IE5QX0luaXRpYWxpemU7CisgICAgTlBFcnJvciBucEVycjsKKworICAgIE5QX0luaXRpYWxpemUg
PSAoTlBfSW5pdGlhbGl6ZUZ1bmNQdHIpZGxzeW0obV9tb2R1bGUsICJOUF9Jbml0aWFsaXplIik7
CisgICAgbV9OUFBfU2h1dGRvd24gPSAoTlBQX1NodXRkb3duUHJvY1B0cilkbHN5bShtX21vZHVs
ZSwgIk5QX1NodXRkb3duIik7CisKKyAgICBpZiAoIU5QX0luaXRpYWxpemUgfHwgIW1fTlBQX1No
dXRkb3duKQorICAgICAgICBnb3RvIGFib3J0OworCisgICAgbWVtc2V0KCZtX3BsdWdpbkZ1bmNz
LCAwLCBzaXplb2YobV9wbHVnaW5GdW5jcykpOworICAgIG1fcGx1Z2luRnVuY3Muc2l6ZSA9IHNp
emVvZihtX3BsdWdpbkZ1bmNzKTsKKworICAgIGluaXRpYWxpemVCcm93c2VyRnVuY3MoKTsKKwor
ICAgIG5wRXJyID0gTlBfSW5pdGlhbGl6ZSgmbV9icm93c2VyRnVuY3MsICAmbV9wbHVnaW5GdW5j
cyk7CisKKyAgICBpZiAobnBFcnIgIT0gTlBFUlJfTk9fRVJST1IpCisgICAgICAgIGdvdG8gYWJv
cnQ7CisKKyAgICBtX2xvYWRDb3VudCA9IDE7CisgICAgcmV0dXJuIHRydWU7CisKK2Fib3J0Ogor
ICAgIHVubG9hZFdpdGhvdXRTaHV0ZG93bigpOworICAgIHJldHVybiBmYWxzZTsKK30KKworI2lm
IEVOQUJMRShORVRTQ0FQRV9QTFVHSU5fQVBJKQordWludDE2X3QgUGx1Z2luUGFja2FnZTo6TlBW
ZXJzaW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gTlBWRVJTX0hBU19QTFVHSU5fVEhSRUFEX0FT
WU5DX0NBTEw7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291
cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1BsdWdpblZpZXdCbGFja0JlcnJ5LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmll
d0JsYWNrQmVycnkuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvcGx1Z2lucy9i
bGFja2JlcnJ5L1BsdWdpblZpZXdCbGFja0JlcnJ5LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSwyMDAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIEx0ZC4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBHaXJpc2ggUmFtYWty
aXNobmFuIDxnaXJpc2hAZm9yd2FyZGJpYXMuaW4+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVz
ZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQbHVnaW5WaWV3LmgiCisKKyNpbmNsdWRlICJE
b2N1bWVudC5oIgorI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisjaW5jbHVkZSAiRWxlbWVu
dC5oIgorI2luY2x1ZGUgIkV2ZW50LmgiCisjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgorI2luY2x1
ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgorI2luY2x1ZGUgIkZy
YW1lTG9hZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVUcmVlLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3
LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgi
CisjaW5jbHVkZSAiSFRNTFBsdWdJbkVsZW1lbnQuaCIKKyNpbmNsdWRlICJIb3N0V2luZG93Lmgi
CisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJKU0RPTUJpbmRpbmcuaCIKKyNpbmNsdWRl
ICJLZXlib2FyZEV2ZW50LmgiCisjaW5jbHVkZSAiTW91c2VFdmVudC5oIgorI2luY2x1ZGUgIk5v
dEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29u
dGV4dFNraWEuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUtleWJvYXJkRXZlbnQuaCIKKyNpbmNsdWRl
ICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKKyNpbmNsdWRlICJQbHVnaW5EZWJ1Zy5oIgorI2luY2x1
ZGUgIlBsdWdpbk1haW5UaHJlYWRTY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJQbHVnaW5QYWNrYWdl
LmgiCisjaW5jbHVkZSAiUmVuZGVyTGF5ZXIuaCIKKyNpbmNsdWRlICJTY3JpcHRDb250cm9sbGVy
LmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJUb3VjaC5oIgorI2luY2x1ZGUg
IlRvdWNoRXZlbnQuaCIKKyNpbmNsdWRlICJUb3VjaExpc3QuaCIKKyNpbmNsdWRlICJXaGVlbEV2
ZW50LmgiCisjaW5jbHVkZSAibnBydW50aW1lX2ltcGwuaCIKKyNpbmNsdWRlICJydW50aW1lX3Jv
b3QuaCIKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1XaW5kb3cuaD4KKworI2lmIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKKyNpbmNsdWRlICJDaHJvbWUuaCIKKyNpbmNsdWRlICJD
aHJvbWVDbGllbnQuaCIKKyNpbmNsdWRlICJQbHVnaW5MYXllcldlYktpdFRocmVhZC5oIgorI2Vu
ZGlmCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1HcmFwaGljcy5oPgorI2luY2x1ZGUg
PEJsYWNrQmVycnlQbGF0Zm9ybUludFJlY3RSZWdpb24uaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5
UGxhdGZvcm1QcmltaXRpdmVzLmg+CisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8
cnVudGltZS9KU0xvY2suaD4KKyNpbmNsdWRlIDxydW50aW1lL0pTVmFsdWUuaD4KKyNpbmNsdWRl
IDxzeXMva2V5Y29kZXMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNkZWZpbmUgVU5JTklUX0NP
T1JEIDB4ZmZmZmZmZmYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc19jb3VudGVyID0gMDsKKworLy8g
LS0tLS0tLQorY2xhc3MgUHRocmVhZE11dGV4TG9ja2VyIHsKK3B1YmxpYzoKKyAgICBQdGhyZWFk
TXV0ZXhMb2NrZXIocHRocmVhZF9tdXRleF90KiBtdXRleCk6IG1fbXV0ZXgobXV0ZXgpCisgICAg
eworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2sobV9tdXRleCk7CisgICAgfQorCisgICAgflB0
aHJlYWRNdXRleExvY2tlcigpCisgICAgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jayht
X211dGV4KTsKKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X3QqIG1fbXV0ZXg7Cit9OworCitj
bGFzcyBQdGhyZWFkUmVhZExvY2tlciB7CitwdWJsaWM6CisgICAgUHRocmVhZFJlYWRMb2NrZXIo
cHRocmVhZF9yd2xvY2tfdCogcndsb2NrKTogbV9yd2xvY2socndsb2NrKQorICAgIHsKKyAgICAg
ICAgcHRocmVhZF9yd2xvY2tfcmRsb2NrKG1fcndsb2NrKTsKKyAgICB9CisKKyAgICB+UHRocmVh
ZFJlYWRMb2NrZXIoKQorICAgIHsKKyAgICAgICAgcHRocmVhZF9yd2xvY2tfdW5sb2NrKG1fcnds
b2NrKTsKKyAgICB9CisKKyAgICBwdGhyZWFkX3J3bG9ja190KiBtX3J3bG9jazsKK307CisKK2Ns
YXNzIFB0aHJlYWRXcml0ZUxvY2tlciB7CitwdWJsaWM6CisgICAgUHRocmVhZFdyaXRlTG9ja2Vy
KHB0aHJlYWRfcndsb2NrX3QqIHJ3bG9jayk6IG1fcndsb2NrKHJ3bG9jaykKKyAgICB7CisgICAg
ICAgIHB0aHJlYWRfcndsb2NrX3dybG9jayhtX3J3bG9jayk7CisgICAgfQorCisgICAgflB0aHJl
YWRXcml0ZUxvY2tlcigpCisgICAgeworICAgICAgICBwdGhyZWFkX3J3bG9ja191bmxvY2sobV9y
d2xvY2spOworICAgIH0KKworICAgIHB0aHJlYWRfcndsb2NrX3QqIG1fcndsb2NrOworfTsKKwor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKK3N0cnVjdCBIb2xlUHVuY2hEYXRhIHsK
KyAgICBpbnQgeCwgeTsKKyAgICBpbnQgdywgaDsKKyAgICBSZWZQdHI8V2ViQ29yZTo6UGxhdGZv
cm1MYXllcj4gbGF5ZXI7Cit9OworCit2b2lkIG5wU2V0SG9sZVB1bmNoSGFuZGxlcih2b2lkICpk
YXRhKQoreworICAgIEhvbGVQdW5jaERhdGEqIGQgPSBzdGF0aWNfY2FzdDxIb2xlUHVuY2hEYXRh
Kj4oZGF0YSk7CisgICAgaWYgKGQtPmxheWVyKQorICAgICAgICBkLT5sYXllci0+c2V0SG9sZVB1
bmNoUmVjdChXZWJDb3JlOjpJbnRSZWN0KGQtPngsIGQtPnksIGQtPncsIGQtPmgpKTsKKyAgICBk
ZWxldGUgZDsKK30KKyNlbmRpZgorCisvLyAtLS0tLS0tLQorbmFtZXNwYWNlIFdlYkNvcmUgewor
CitzdGF0aWMgTlBSZWN0IHRvTlBSZWN0KGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHJlY3QpCit7
CisgICAgTlBSZWN0IG5wUmVjdDsKKyAgICBucFJlY3QudG9wID0gcmVjdC55KCk7CisgICAgbnBS
ZWN0LmxlZnQgPSByZWN0LngoKTsKKyAgICBucFJlY3QuYm90dG9tID0gcmVjdC55KCkgKyByZWN0
LmhlaWdodCgpOworICAgIG5wUmVjdC5yaWdodCA9IHJlY3QueCgpICsgcmVjdC53aWR0aCgpOwor
ICAgIHJldHVybiBucFJlY3Q7Cit9CisKK3N0YXRpYyBOUFJlY3QgdG9OUFJlY3QoY29uc3QgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3QmIHJlY3QpCit7CisgICAgTlBSZWN0IG5wUmVjdDsK
KyAgICBucFJlY3QudG9wID0gcmVjdC55KCk7CisgICAgbnBSZWN0LmxlZnQgPSByZWN0LngoKTsK
KyAgICBucFJlY3QuYm90dG9tID0gcmVjdC55KCkgKyByZWN0LmhlaWdodCgpOworICAgIG5wUmVj
dC5yaWdodCA9IHJlY3QueCgpICsgcmVjdC53aWR0aCgpOworICAgIHJldHVybiBucFJlY3Q7Cit9
CisKK2NsYXNzIFBsdWdpblZpZXdQcml2YXRlIHsKK3B1YmxpYzoKKyAgICBQbHVnaW5WaWV3KiBt
X3ZpZXc7CisKK3B1YmxpYzoKKyAgICBwdGhyZWFkX211dGV4X3QgbV9iYWNrQnVmZmVyTXV0ZXg7
CisgICAgcHRocmVhZF9yd2xvY2tfdCBtX2Zyb250QnVmZmVyUndMb2NrOworCisgICAgQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIG1fcGx1Z2luQnVmZmVyc1syXTsKKyAg
ICBJbnRTaXplIG1fcGx1Z2luQnVmZmVyU2l6ZTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
R3JhcGhpY3M6OkJ1ZmZlclR5cGUgbV9wbHVnaW5CdWZmZXJUeXBlOworICAgIGludCBtX3BsdWdp
bkZyb250QnVmZmVyOworCisgICAgSW50UmVjdCBtX2hvbGVQdW5jaFJlY3Q7CisgICAgSW50UmVj
dCBtX2tlZXBWaXNpYmxlUmVjdDsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KyAgICBSZWZQdHI8UGxhdGZvcm1MYXllcj4gbV9wbGF0Zm9ybUxheWVyOworI2VuZGlmCisKKyAg
ICBib29sIG1faWRsZVByZXZlbnRlZDsKKyAgICBib29sIG1faGFzUGVuZGluZ0dlb21ldHJ5Q2hh
bmdlOworICAgIGJvb2wgbV9zZW50T25Mb2FkOworICAgIGJvb2wgbV9pc0Z1bGxTY3JlZW47Cisg
ICAgYm9vbCBtX2lzRm9jdXNlZDsKKyAgICBib29sIG1fb3JpZW50YXRpb25Mb2NrZWQ7CisgICAg
Ym9vbCBtX2lzQmFja2dyb3VuZFBsYXlpbmc7CisKKyAgICBzdGQ6OnN0cmluZyBtX3BsdWdpblVu
aXF1ZVByZWZpeDsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIG1f
aW52YWxpZGF0ZVJlZ2lvbjsKKworcHVibGljOgorICAgIFBsdWdpblZpZXdQcml2YXRlKFBsdWdp
blZpZXcqIHZpZXcpOgorICAgICAgICBtX3ZpZXcodmlldykKKyAgICAgICAgLCBtX3BsdWdpbkJ1
ZmZlclR5cGUoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpQbHVnaW5CdWZmZXJXaXRo
QWxwaGEpCisgICAgICAgICwgbV9wbHVnaW5Gcm9udEJ1ZmZlcigwKQorICAgICAgICAsIG1faWRs
ZVByZXZlbnRlZChmYWxzZSkKKyAgICAgICAgLCBtX2hhc1BlbmRpbmdHZW9tZXRyeUNoYW5nZSh0
cnVlKQorICAgICAgICAsIG1fc2VudE9uTG9hZChmYWxzZSkKKyAgICAgICAgLCBtX2lzRnVsbFNj
cmVlbihmYWxzZSkKKyAgICAgICAgLCBtX2lzRm9jdXNlZChmYWxzZSkKKyAgICAgICAgLCBtX29y
aWVudGF0aW9uTG9ja2VkKGZhbHNlKQorICAgICAgICAsIG1faXNCYWNrZ3JvdW5kUGxheWluZyhm
YWxzZSkKKyAgICB7CisgICAgICAgIG1fcGx1Z2luQnVmZmVyc1swXSA9IDA7CisgICAgICAgIG1f
cGx1Z2luQnVmZmVyc1sxXSA9IDA7CisKKyAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfdCBtdXRl
eEF0dHJpYnV0ZXM7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4QXR0cmli
dXRlcyk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4QXR0cmlidXRl
cywgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUpOworCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5p
dCgmbV9iYWNrQnVmZmVyTXV0ZXgsICZtdXRleEF0dHJpYnV0ZXMpOworICAgICAgICBwdGhyZWFk
X3J3bG9ja19pbml0KCZtX2Zyb250QnVmZmVyUndMb2NrLCAwKTsKKworICAgICAgICBwdGhyZWFk
X211dGV4YXR0cl9kZXN0cm95KCZtdXRleEF0dHJpYnV0ZXMpOworCisgICAgICAgIGNoYXIgdW5p
cXVlSWRbNTBdOworICAgICAgICBzbnByaW50Zih1bmlxdWVJZCwgNTAsICJQbHVnaW5WaWV3QkIt
JTA4eCUwOHgtIiwgc19jb3VudGVyKyssIChpbnQpdGhpcyk7CisgICAgICAgIG1fcGx1Z2luVW5p
cXVlUHJlZml4ID0gdW5pcXVlSWQ7CisgICAgfQorCisgICAgflBsdWdpblZpZXdQcml2YXRlKCkK
KyAgICB7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICAgICBpZiAobV9w
bGF0Zm9ybUxheWVyKQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UGx1Z2luTGF5ZXJXZWJLaXRU
aHJlYWQqPihtX3BsYXRmb3JtTGF5ZXIuZ2V0KCkpLT5zZXRQbHVnaW5WaWV3KDApOworI2VuZGlm
CisKKyAgICAgICAgZGVzdHJveUJ1ZmZlcnMoKTsKKworICAgICAgICBwdGhyZWFkX211dGV4X2Rl
c3Ryb3koJm1fYmFja0J1ZmZlck11dGV4KTsKKyAgICAgICAgcHRocmVhZF9yd2xvY2tfZGVzdHJv
eSgmbV9mcm9udEJ1ZmZlclJ3TG9jayk7CisgICAgfQorCisgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkdyYXBoaWNzOjpCdWZmZXJUeXBlIHRvQnVmZmVyVHlwZShOUFN1cmZhY2VGb3JtYXQgZm9y
bWF0KQorICAgIHsKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBGT1JN
QVRfUkdCXzU2NToKKyAgICAgICAgICAgIHJldHVybiBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3Jh
cGhpY3M6OlBsdWdpbkJ1ZmZlcjsKKyAgICAgICAgY2FzZSBGT1JNQVRfUkdCQV84ODg4OgorICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpH
cmFwaGljczo6UGx1Z2luQnVmZmVyV2l0aEFscGhhOworICAgICAgICB9CisgICAgfQorCisgICAg
dm9pZCBzZXRab29tRmFjdG9yKGZsb2F0IHpvb21GYWN0b3IpCisgICAgeworICAgICAgICBpZiAo
KChOUFNldFdpbmRvd0NhbGxiYWNrU3RydWN0KiltX3ZpZXctPm1fbnBXaW5kb3cud3NfaW5mbykt
Pnpvb21GYWN0b3IgIT0gem9vbUZhY3RvcikKKyAgICAgICAgICAgIG1faGFzUGVuZGluZ0dlb21l
dHJ5Q2hhbmdlID0gdHJ1ZTsKKworICAgICAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3Qq
KW1fdmlldy0+bV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3RvciA9IHpvb21GYWN0b3I7Cisg
ICAgfQorCisgICAgdm9pZCBzZXRWaXNpYmxlUmVjdHMoY29uc3QgTlBSZWN0IHJlY3RzW10sIGlu
dDMyX3QgY291bnQpCisgICAgeworICAgICAgICBtX2tlZXBWaXNpYmxlUmVjdCA9IEludFJlY3Qo
KTsKKworICAgICAgICBpZiAoIW1fdmlldy0+cGFyZW50KCkgfHwgIWNvdW50KQorICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewor
ICAgICAgICAgICAgSW50UmVjdCBhZGRSZWN0ID0gSW50UmVjdChyZWN0c1tpXS5sZWZ0LCByZWN0
c1tpXS50b3AsIHJlY3RzW2ldLnJpZ2h0IC0gcmVjdHNbaV0ubGVmdCwgcmVjdHNbaV0uYm90dG9t
IC0gcmVjdHNbaV0udG9wKTsKKyAgICAgICAgICAgIG1fa2VlcFZpc2libGVSZWN0LnVuaXRlKGFk
ZFJlY3QpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRG9uJ3QgY2F1c2UgYSBwb3NzaWJsZSBz
Y3JvbGwgaWYgdGhlIHJlc3VsdCBpcyBhbiBlbXB0eSByZWN0YW5nbGUuCisgICAgICAgIGlmICht
X2tlZXBWaXNpYmxlUmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAg
ICAgLy8gQWRqdXN0IHRoZSByZWN0IHRvIHRoZSBwYXJlbnQgd2luZG93IGFuZCB0aGVuIGFkanVz
dCBmb3Igc2Nyb2xsaW5nLgorICAgICAgICBtX2tlZXBWaXNpYmxlUmVjdCA9IG1fdmlldy0+Y29u
dmVydFRvQ29udGFpbmluZ1dpbmRvdyhtX2tlZXBWaXNpYmxlUmVjdCk7CisgICAgICAgIEZyYW1l
VmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV92aWV3LT5wYXJlbnQo
KSk7CisgICAgICAgIG1fa2VlcFZpc2libGVSZWN0Lm1vdmUoZnJhbWVWaWV3LT5zY3JvbGxQb3Np
dGlvbigpLngoKSwgZnJhbWVWaWV3LT5zY3JvbGxQb3NpdGlvbigpLnkoKSk7CisKKyAgICAgICAg
ZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5lbnN1cmVDb250
ZW50VmlzaWJsZSgpOworICAgIH0KKworICAgIHZvaWQgY2xlYXJWaXNpYmxlUmVjdHMoKQorICAg
IHsKKyAgICAgICAgaWYgKCFtX2tlZXBWaXNpYmxlUmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAg
ICBzZXRWaXNpYmxlUmVjdHMoMCwgMCk7CisgICAgfQorCisgICAgdm9pZCBzaG93S2V5Ym9hcmQo
Ym9vbCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGlj
X2Nhc3Q8RnJhbWVWaWV3Kj4obV92aWV3LT5wYXJlbnQoKSk7CisgICAgICAgIGZyYW1lVmlldy0+
aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+c2hvd1ZpcnR1YWxLZXlib2FyZCh2
YWx1ZSk7CisgICAgfQorCisgICAgdm9pZCByZXF1ZXN0RnVsbFNjcmVlbigpCisgICAgeworICAg
ICAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPiht
X3ZpZXctPnBhcmVudCgpKSkKKyAgICAgICAgICAgIGlmIChmcmFtZVZpZXctPmhvc3RXaW5kb3co
KS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnNob3VsZFBsdWdpbkVudGVyRnVsbFNjcmVlbihtX3Zp
ZXcsIG1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpKQorICAgICAgICAgICAgICAgIG1fdmll
dy0+aGFuZGxlRnVsbFNjcmVlbkFsbG93ZWRFdmVudCgpOworICAgIH0KKworICAgIHZvaWQgZXhp
dEZ1bGxTY3JlZW4oKQorICAgIHsKKyAgICAgICAgbV92aWV3LT5oYW5kbGVGdWxsU2NyZWVuRXhp
dEV2ZW50KCk7CisgICAgfQorCisgICAgdm9pZCByZXF1ZXN0Q2VudGVyRml0Wm9vbSgpCisgICAg
eworICAgICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+
KG1fdmlldy0+cGFyZW50KCkpOworCisgICAgICAgIGlmICghZnJhbWVWaWV3KQorICAgICAgICAg
ICAgcmV0dXJuOworCisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBh
Z2VDbGllbnQoKS0+em9vbVRvQ29udGVudFJlY3QobV92aWV3LT5tX3dpbmRvd1JlY3QpOworICAg
IH0KKworICAgIHZvaWQgbG9ja09yaWVudGF0aW9uKGJvb2wgbGFuZHNjYXBlKQorICAgIHsKKyAg
ICAgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3Zp
ZXctPnBhcmVudCgpKTsKKworICAgICAgICBpZiAoIWZyYW1lVmlldykKKyAgICAgICAgICAgIHJl
dHVybjsKKworICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xp
ZW50KCktPmxvY2tPcmllbnRhdGlvbihsYW5kc2NhcGUpOworICAgICAgICBtX29yaWVudGF0aW9u
TG9ja2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHVubG9ja09yaWVudGF0aW9uKCkKKyAg
ICB7CisgICAgICAgIGlmICghbV9vcmllbnRhdGlvbkxvY2tlZCkKKyAgICAgICAgICAgIHJldHVy
bjsKKworICAgICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmll
dyo+KG1fdmlldy0+cGFyZW50KCkpOworCisgICAgICAgIGlmICghZnJhbWVWaWV3KQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9y
bVBhZ2VDbGllbnQoKS0+dW5sb2NrT3JpZW50YXRpb24oKTsKKyAgICAgICAgbV9vcmllbnRhdGlv
bkxvY2tlZCA9IGZhbHNlOworICAgIH0KKworICAgIHZvaWQgcHJldmVudElkbGUoYm9vbCBwcmV2
ZW50SWRsZSkKKyAgICB7CisgICAgICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nh
c3Q8RnJhbWVWaWV3Kj4obV92aWV3LT5wYXJlbnQoKSk7CisKKyAgICAgICAgaWYgKHByZXZlbnRJ
ZGxlID09IG1faWRsZVByZXZlbnRlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBp
ZiAoIWZyYW1lVmlldykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmcmFtZVZpZXct
Pmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnNldFByZXZlbnRzU2NyZWVuRGlt
bWluZyhwcmV2ZW50SWRsZSk7CisgICAgICAgIG1faWRsZVByZXZlbnRlZCA9IHByZXZlbnRJZGxl
OworICAgIH0KKworICAgIHZvaWQgc2V0SG9sZVB1bmNoKGludCB4LCBpbnQgeSwgaW50IHdpZHRo
LCBpbnQgaGVpZ2h0KQorICAgIHsKKyAgICAgICAgaWYgKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAw
KQorICAgICAgICAgICAgbV9ob2xlUHVuY2hSZWN0ID0gSW50UmVjdCh4LCB5LCB3aWR0aCwgaGVp
Z2h0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV9ob2xlUHVuY2hSZWN0ID0gSW50UmVj
dCgpOworCisgICAgICAgIC8vIENsaXAgdGhlIGhvbGUgcHVuY2ggcmVjdGFuZ2xlIGluIGNhc2Ug
YSBwbHVnaW4gaXMgJ292ZXJ6ZWFsb3VzJywgb3IgCisgICAgICAgIC8vIGRvZXMgbm90IGNsZWFu
IHVwIHRoZSBob2xlIHB1bmNoIHJlY3RhbmdsZSBjb3JyZWN0bHkgd2hlbiBleGl0aW5nIAorICAg
ICAgICAvLyBmdWxsc2NyZWVuICh3aWxsIG1hc2sgYnVncyBpbiB0aGUgcGx1Z2luKS4KKyAgICAg
ICAgbV9ob2xlUHVuY2hSZWN0LmludGVyc2VjdChJbnRSZWN0KEludFBvaW50KDAsIDApLCBtX3Zp
ZXctPmZyYW1lUmVjdCgpLnNpemUoKSkpOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQorICAgICAgICBpZiAobV9wbGF0Zm9ybUxheWVyKSB7CisgICAgICAgICAgICBJbnRSZWN0
IHJlY3QgPSBtX2hvbGVQdW5jaFJlY3Q7CisKKyAgICAgICAgICAgIC8vIFRyYW5zbGF0ZSBmcm9t
IHBsdWdpbiBjb29yZGluYXRlcyB0byBjb250ZW50cyBjb29yZGluYXRlcy4KKyAgICAgICAgICAg
IGlmICghbV9ob2xlUHVuY2hSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICByZWN0Lm1v
dmUobV92aWV3LT5mcmFtZVJlY3QoKS54KCksIG1fdmlldy0+ZnJhbWVSZWN0KCkueSgpKTsKKwor
ICAgICAgICAgICAgT3duUHRyPEhvbGVQdW5jaERhdGE+IGhwID0gYWRvcHRQdHIobmV3IEhvbGVQ
dW5jaERhdGEpOworICAgICAgICAgICAgaHAtPnggPSBtX2hvbGVQdW5jaFJlY3QueCgpOworICAg
ICAgICAgICAgaHAtPnkgPSBtX2hvbGVQdW5jaFJlY3QueSgpOworICAgICAgICAgICAgaHAtPncg
PSBtX2hvbGVQdW5jaFJlY3Qud2lkdGgoKTsKKyAgICAgICAgICAgIGhwLT5oID0gbV9ob2xlUHVu
Y2hSZWN0LmhlaWdodCgpOworICAgICAgICAgICAgaHAtPmxheWVyID0gbV9wbGF0Zm9ybUxheWVy
OworCisgICAgICAgICAgICAvLyBOb3RpZnkgY29tcG9zaXRpbmcgbGF5ZXIgYW5kIHBhZ2UgY2xp
ZW50IGluIG9yZGVyIHRvIGJlIGFibGUgdG8KKyAgICAgICAgICAgIC8vIHB1bmNoIHRocm91Z2gg
Y29tcG9zaXRlZCBhbmQgbm9uLWNvbXBvc2l0ZWQgcGFydHMgb2YgdGhlIHBhZ2UuCisgICAgICAg
ICAgICBjYWxsT25NYWluVGhyZWFkKG5wU2V0SG9sZVB1bmNoSGFuZGxlciwgaHAubGVha1B0cigp
KTsgLy8gbnBTZXRIb2xlUHVuY2hIYW5kbGVyKCkgdGFrZXMgb3duZXJzaGlwIG9mIGhwLgorICAg
ICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBOUFN1cmZhY2UgbG9ja0JhY2tCdWZmZXIoKQor
ICAgIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2JhY2tCdWZmZXJNdXRleCk7Cisg
ICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBidWZmZXIgPQor
ICAgICAgICAgICAgbV9wbHVnaW5CdWZmZXJzWyhtX3BsdWdpbkZyb250QnVmZmVyICsgMSkgJSAy
XTsKKworICAgICAgICBpZiAoIWJ1ZmZlciB8fCAhQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpwbGF0Zm9ybUJ1ZmZlckhhbmRsZShidWZmZXIpKSB7CisgICAgICAgICAgICB1bmxvY2tC
YWNrQnVmZmVyKCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAg
IHJldHVybiBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OnBsYXRmb3JtQnVmZmVySGFu
ZGxlKGJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCB1bmxvY2tCYWNrQnVmZmVyKCkKKyAgICB7
CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2JhY2tCdWZmZXJNdXRleCk7CisgICAg
fQorCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGxvY2tSZWFk
RnJvbnRCdWZmZXJJbnRlcm5hbCgpCisgICAgeworICAgICAgICBwdGhyZWFkX3J3bG9ja19yZGxv
Y2soJm1fZnJvbnRCdWZmZXJSd0xvY2spOworCisgICAgICAgIHJldHVybiBtX3BsdWdpbkJ1ZmZl
cnNbbV9wbHVnaW5Gcm9udEJ1ZmZlcl07CisgICAgfQorCisgICAgTlBTdXJmYWNlIGxvY2tSZWFk
RnJvbnRCdWZmZXIoKQorICAgIHsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpCdWZmZXIqIGJ1ZmZlciA9IGxvY2tSZWFkRnJvbnRCdWZmZXJJbnRlcm5hbCgpOworCisg
ICAgICAgIGlmICghYnVmZmVyIHx8ICFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OnBs
YXRmb3JtQnVmZmVySGFuZGxlKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIHVubG9ja1JlYWRGcm9u
dEJ1ZmZlcigpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBy
ZXR1cm4gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpwbGF0Zm9ybUJ1ZmZlckhhbmRs
ZShidWZmZXIpOworICAgIH0KKworICAgIHZvaWQgdW5sb2NrUmVhZEZyb250QnVmZmVyKCkKKyAg
ICB7CisgICAgICAgIHB0aHJlYWRfcndsb2NrX3VubG9jaygmbV9mcm9udEJ1ZmZlclJ3TG9jayk7
CisgICAgfQorCisgICAgdm9pZCBzd2FwQnVmZmVycygpCisgICAgeworICAgICAgICBQdGhyZWFk
TXV0ZXhMb2NrZXIgYmFja0xvY2soJm1fYmFja0J1ZmZlck11dGV4KTsKKyAgICAgICAgUHRocmVh
ZFdyaXRlTG9ja2VyIGZyb250TG9jaygmbV9mcm9udEJ1ZmZlclJ3TG9jayk7CisKKyAgICAgICAg
bV9wbHVnaW5Gcm9udEJ1ZmZlciA9IChtX3BsdWdpbkZyb250QnVmZmVyICsgMSkgJSAyOworICAg
IH0KKworICAgIGJvb2wgY3JlYXRlQnVmZmVycyhOUFN1cmZhY2VGb3JtYXQgZm9ybWF0LCBpbnQg
d2lkdGgsIGludCBoZWlnaHQpCisgICAgeworICAgICAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOwor
CisgICAgICAgIFB0aHJlYWRNdXRleExvY2tlciBiYWNrTG9jaygmbV9iYWNrQnVmZmVyTXV0ZXgp
OworICAgICAgICBQdGhyZWFkV3JpdGVMb2NrZXIgZnJvbnRMb2NrKCZtX2Zyb250QnVmZmVyUndM
b2NrKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAg
ICAgaWYgKG1fcGx1Z2luQnVmZmVyc1tpXSkgeworICAgICAgICAgICAgICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6ZGVzdHJveUJ1ZmZlcihtX3BsdWdpbkJ1ZmZlcnNbaV0pOwor
ICAgICAgICAgICAgICAgIG1fcGx1Z2luQnVmZmVyc1tpXSA9IDA7CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKQorICAgICAgICAgICAg
ICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAg
bV9wbHVnaW5CdWZmZXJzW2ldID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjcmVh
dGVCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRT
aXplKHdpZHRoLCBoZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICB0b0J1ZmZlclR5cGUoZm9y
bWF0KSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIW1fcGx1Z2luQnVmZmVyc1tpXSkKKyAgICAg
ICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIG1fcGx1Z2luQnVmZmVyU2l6
ZSA9IEludFNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBtX3BsdWdpbkJ1ZmZlclR5
cGUgPSB0b0J1ZmZlclR5cGUoZm9ybWF0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IG1fcGx1Z2luQnVmZmVyU2l6ZSA9IEludFNpemUoKTsKKyAgICAgICAgICAgIG1fcGx1Z2luQnVm
ZmVyVHlwZSA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6UGx1Z2luQnVmZmVyV2l0
aEFscGhhOworICAgICAgICAgICAgZGVzdHJveUJ1ZmZlcnMoKTsKKyAgICAgICAgfQorCisgICAg
ICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKworICAgIGJvb2wgcmVzaXplQnVmZmVycyhOUFN1
cmZhY2VGb3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgeworICAgICAg
ICBib29sIHN1Y2Nlc3MgPSB0cnVlOworCisgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGJ1ZmZl
ciBjcmVhdGVkLCB0aGVuIHRyeSB0byBjcmVhdGUgaXQuCisgICAgICAgIGlmICghbV9wbHVnaW5C
dWZmZXJTaXplLndpZHRoKCkgfHwgIW1fcGx1Z2luQnVmZmVyU2l6ZS5oZWlnaHQoKSkKKyAgICAg
ICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXJzKGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisKKyAg
ICAgICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KQorICAgICAgICAgICAgcmV0dXJuIGRlc3Ryb3lC
dWZmZXJzKCk7CisKKyAgICAgICAgUHRocmVhZE11dGV4TG9ja2VyIGJhY2tMb2NrKCZtX2JhY2tC
dWZmZXJNdXRleCk7CisgICAgICAgIFB0aHJlYWRXcml0ZUxvY2tlciBmcm9udExvY2soJm1fZnJv
bnRCdWZmZXJSd0xvY2spOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyAoaSA8IDIpICYmIHN1
Y2Nlc3M7IGkrKykgeworICAgICAgICAgICAgc3VjY2VzcyAmPSBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6R3JhcGhpY3M6OnJlYWxsb2NCdWZmZXIobV9wbHVnaW5CdWZmZXJzW2ldLAorICAgICAgICAg
ICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRTaXplKHdpZHRoLCBoZWlnaHQpLAorICAg
ICAgICAgICAgICAgIHRvQnVmZmVyVHlwZShmb3JtYXQpKTsKKyAgICAgICAgfQorCisgICAgICAg
IGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICBtX3BsdWdpbkJ1ZmZlclNpemUgPSBJbnRTaXpl
KHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgbV9wbHVnaW5CdWZmZXJUeXBlID0gdG9CdWZm
ZXJUeXBlKGZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisg
ICAgICAgIC8vIEF0dGVtcHQgdG8gdW5kbyBpZiB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBuZXcgc2l6
ZS9mb3JtYXQuIFdlIGNhbid0IGd1YXJhbnRlZQorICAgICAgICAvLyB3ZSB3aWxsIGdldCBpdCBi
YWNrIHRob3VnaC4KKyAgICAgICAgaWYgKCFtX3BsdWdpbkJ1ZmZlclNpemUud2lkdGgoKSB8fCAh
bV9wbHVnaW5CdWZmZXJTaXplLmhlaWdodCgpKSB7CisgICAgICAgICAgICBkZXN0cm95QnVmZmVy
cygpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgYm9v
bCB1bmRvbmUgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewor
ICAgICAgICAgICAgdW5kb25lICY9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6cmVh
bGxvY0J1ZmZlcihtX3BsdWdpbkJ1ZmZlcnNbaV0sCisgICAgICAgICAgICAgICAgbV9wbHVnaW5C
dWZmZXJTaXplLCBtX3BsdWdpbkJ1ZmZlclR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8g
SWYgd2UgZmFpbCB0byB1bmRvLCBkZWxldGUgdGhlIGJ1ZmZlcnMgYWx0b2dldGhlci4KKyAgICAg
ICAgaWYgKCF1bmRvbmUpCisgICAgICAgICAgICBkZXN0cm95QnVmZmVycygpOworCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGRlc3Ryb3lCdWZmZXJzKCkKKyAgICB7
CisgICAgICAgIFB0aHJlYWRNdXRleExvY2tlciBiYWNrTG9jaygmbV9iYWNrQnVmZmVyTXV0ZXgp
OworICAgICAgICBQdGhyZWFkV3JpdGVMb2NrZXIgZnJvbnRMb2NrKCZtX2Zyb250QnVmZmVyUndM
b2NrKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAg
ICAgaWYgKG1fcGx1Z2luQnVmZmVyc1tpXSkgeworICAgICAgICAgICAgICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6ZGVzdHJveUJ1ZmZlcihtX3BsdWdpbkJ1ZmZlcnNbaV0pOwor
ICAgICAgICAgICAgICAgIG1fcGx1Z2luQnVmZmVyc1tpXSA9IDA7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgICAgbV9wbHVnaW5CdWZmZXJTaXplID0gSW50U2l6ZSgpOworCisgICAg
ICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwor
Ly8gLS0tLS0tLQorCitleHRlcm4gIkMiIHsKKworbmFtZXNwYWNlIHsKKyAgICAvLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLworICAgIC8vIFN0YXRpYyBOUEFQSSBDYWxsYmFja3MKKyAgICAvLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLworICAgIHZvaWQgc2V0VmlzaWJsZVJlY3RzKE5QUCBpbnN0YW5jZSwg
Y29uc3QgTlBSZWN0IHJlY3RzW10sIGludDMyX3QgY291bnQpCisgICAgeworICAgICAgICBXZWJD
b3JlOjpQbHVnaW5WaWV3KiBwdiA9IChXZWJDb3JlOjpQbHVnaW5WaWV3ICopaW5zdGFuY2UtPm5k
YXRhOworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZSogcHJpdiA9IHB2LT5nZXRQ
cml2YXRlKCk7CisgICAgICAgIHByaXYtPnNldFZpc2libGVSZWN0cyhyZWN0cywgY291bnQpOwor
ICAgIH0KKworICAgIHZvaWQgY2xlYXJWaXNpYmxlUmVjdHMoTlBQIGluc3RhbmNlKQorICAgIHsK
KyAgICAgICAgV2ViQ29yZTo6UGx1Z2luVmlldyogcHYgPSAoV2ViQ29yZTo6UGx1Z2luVmlldyAq
KWluc3RhbmNlLT5uZGF0YTsKKyAgICAgICAgV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGUqIHBy
aXYgPSBwdi0+Z2V0UHJpdmF0ZSgpOworICAgICAgICBwcml2LT5jbGVhclZpc2libGVSZWN0cygp
OworICAgIH0KKworICAgIHZvaWQgc2hvd0tleWJvYXJkKE5QUCBpbnN0YW5jZSwgYm9vbCB2YWx1
ZSkKKyAgICB7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXcqIHB2ID0gKFdlYkNvcmU6OlBs
dWdpblZpZXcgKilpbnN0YW5jZS0+bmRhdGE7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXdQ
cml2YXRlKiBwcml2ID0gcHYtPmdldFByaXZhdGUoKTsKKyAgICAgICAgcHJpdi0+c2hvd0tleWJv
YXJkKHZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkIHJlcXVlc3RGdWxsU2NyZWVuKE5QUCBpbnN0
YW5jZSkKKyAgICB7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXcqIHB2ID0gKFdlYkNvcmU6
OlBsdWdpblZpZXcgKilpbnN0YW5jZS0+bmRhdGE7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZp
ZXdQcml2YXRlKiBwcml2ID0gcHYtPmdldFByaXZhdGUoKTsKKyAgICAgICAgcHJpdi0+cmVxdWVz
dEZ1bGxTY3JlZW4oKTsKKyAgICB9CisKKyAgICB2b2lkIGV4aXRGdWxsU2NyZWVuKE5QUCBpbnN0
YW5jZSkKKyAgICB7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXcqIHB2ID0gKFdlYkNvcmU6
OlBsdWdpblZpZXcgKilpbnN0YW5jZS0+bmRhdGE7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZp
ZXdQcml2YXRlKiBwcml2ID0gcHYtPmdldFByaXZhdGUoKTsKKyAgICAgICAgcHJpdi0+ZXhpdEZ1
bGxTY3JlZW4oKTsKKyAgICB9CisKKyAgICB2b2lkIHJlcXVlc3RDZW50ZXJGaXRab29tKE5QUCBp
bnN0YW5jZSkKKyAgICB7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXcqIHB2ID0gKFdlYkNv
cmU6OlBsdWdpblZpZXcgKilpbnN0YW5jZS0+bmRhdGE7CisgICAgICAgIFdlYkNvcmU6OlBsdWdp
blZpZXdQcml2YXRlKiBwcml2ID0gcHYtPmdldFByaXZhdGUoKTsKKyAgICAgICAgcHJpdi0+cmVx
dWVzdENlbnRlckZpdFpvb20oKTsKKyAgICB9CisKKyAgICB2b2lkIGxvY2tPcmllbnRhdGlvbihO
UFAgaW5zdGFuY2UsIGJvb2wgbGFuZHNjYXBlKQorICAgIHsKKyAgICAgICAgV2ViQ29yZTo6UGx1
Z2luVmlldyogcHYgPSAoV2ViQ29yZTo6UGx1Z2luVmlldyAqKWluc3RhbmNlLT5uZGF0YTsKKyAg
ICAgICAgV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGUqIHByaXYgPSBwdi0+Z2V0UHJpdmF0ZSgp
OworICAgICAgICBwcml2LT5sb2NrT3JpZW50YXRpb24obGFuZHNjYXBlKTsKKyAgICB9CisKKyAg
ICB2b2lkIHVubG9ja09yaWVudGF0aW9uKE5QUCBpbnN0YW5jZSkKKyAgICB7CisgICAgICAgIFdl
YkNvcmU6OlBsdWdpblZpZXcqIHB2ID0gKFdlYkNvcmU6OlBsdWdpblZpZXcgKilpbnN0YW5jZS0+
bmRhdGE7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlKiBwcml2ID0gcHYtPmdl
dFByaXZhdGUoKTsKKyAgICAgICAgcHJpdi0+dW5sb2NrT3JpZW50YXRpb24oKTsKKyAgICB9CisK
KyAgICB2b2lkIHByZXZlbnRJZGxlKE5QUCBpbnN0YW5jZSwgYm9vbCBwcmV2ZW50SWRsZSkKKyAg
ICB7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXcqIHB2ID0gKFdlYkNvcmU6OlBsdWdpblZp
ZXcgKilpbnN0YW5jZS0+bmRhdGE7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRl
KiBwcml2ID0gcHYtPmdldFByaXZhdGUoKTsKKyAgICAgICAgcHJpdi0+cHJldmVudElkbGUocHJl
dmVudElkbGUpOworICAgIH0KKworICAgIE5QU3VyZmFjZSBsb2NrQmFja0J1ZmZlcihOUFAgaW5z
dGFuY2UpCisgICAgeworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3KiBwdiA9IChXZWJDb3Jl
OjpQbHVnaW5WaWV3ICopaW5zdGFuY2UtPm5kYXRhOworICAgICAgICBXZWJDb3JlOjpQbHVnaW5W
aWV3UHJpdmF0ZSogcHJpdiA9IHB2LT5nZXRQcml2YXRlKCk7CisgICAgICAgIHJldHVybiBwcml2
LT5sb2NrQmFja0J1ZmZlcigpOworICAgIH0KKworICAgIHZvaWQgdW5sb2NrQmFja0J1ZmZlcihO
UFAgaW5zdGFuY2UpCisgICAgeworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3KiBwdiA9IChX
ZWJDb3JlOjpQbHVnaW5WaWV3ICopaW5zdGFuY2UtPm5kYXRhOworICAgICAgICBXZWJDb3JlOjpQ
bHVnaW5WaWV3UHJpdmF0ZSogcHJpdiA9IHB2LT5nZXRQcml2YXRlKCk7CisgICAgICAgIHByaXYt
PnVubG9ja0JhY2tCdWZmZXIoKTsKKyAgICB9CisKKyAgICBOUFN1cmZhY2UgbG9ja1JlYWRGcm9u
dEJ1ZmZlcihOUFAgaW5zdGFuY2UpCisgICAgeworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3
KiBwdiA9IChXZWJDb3JlOjpQbHVnaW5WaWV3ICopaW5zdGFuY2UtPm5kYXRhOworICAgICAgICBX
ZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZSogcHJpdiA9IHB2LT5nZXRQcml2YXRlKCk7CisgICAg
ICAgIHJldHVybiBwcml2LT5sb2NrUmVhZEZyb250QnVmZmVyKCk7CisgICAgfQorCisgICAgdm9p
ZCB1bmxvY2tSZWFkRnJvbnRCdWZmZXIoTlBQIGluc3RhbmNlKQorICAgIHsKKyAgICAgICAgV2Vi
Q29yZTo6UGx1Z2luVmlldyogcHYgPSAoV2ViQ29yZTo6UGx1Z2luVmlldyAqKWluc3RhbmNlLT5u
ZGF0YTsKKyAgICAgICAgV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGUqIHByaXYgPSBwdi0+Z2V0
UHJpdmF0ZSgpOworICAgICAgICBwcml2LT51bmxvY2tSZWFkRnJvbnRCdWZmZXIoKTsKKyAgICB9
CisKKyAgICB2b2lkIHN3YXBCdWZmZXJzKE5QUCBpbnN0YW5jZSkKKyAgICB7CisgICAgICAgIFdl
YkNvcmU6OlBsdWdpblZpZXcqIHB2ID0gKFdlYkNvcmU6OlBsdWdpblZpZXcgKilpbnN0YW5jZS0+
bmRhdGE7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlKiBwcml2ID0gcHYtPmdl
dFByaXZhdGUoKTsKKyAgICAgICAgcHJpdi0+c3dhcEJ1ZmZlcnMoKTsKKyAgICB9CisKKyAgICBi
b29sIGNyZWF0ZUJ1ZmZlcnMoTlBQIGluc3RhbmNlLCBOUFN1cmZhY2VGb3JtYXQgZm9ybWF0LCBp
bnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgeworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3
KiBwdiA9IChXZWJDb3JlOjpQbHVnaW5WaWV3ICopaW5zdGFuY2UtPm5kYXRhOworICAgICAgICBX
ZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZSogcHJpdiA9IHB2LT5nZXRQcml2YXRlKCk7CisgICAg
ICAgIHJldHVybiBwcml2LT5jcmVhdGVCdWZmZXJzKGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Cisg
ICAgfQorCisgICAgYm9vbCBkZXN0cm95QnVmZmVycyhOUFAgaW5zdGFuY2UpCisgICAgeworICAg
ICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3KiBwdiA9IChXZWJDb3JlOjpQbHVnaW5WaWV3ICopaW5z
dGFuY2UtPm5kYXRhOworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZSogcHJpdiA9
IHB2LT5nZXRQcml2YXRlKCk7CisgICAgICAgIHJldHVybiBwcml2LT5kZXN0cm95QnVmZmVycygp
OworICAgIH0KKworICAgIGJvb2wgcmVzaXplQnVmZmVycyhOUFAgaW5zdGFuY2UsIE5QU3VyZmFj
ZUZvcm1hdCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKKyAgICB7CisgICAgICAgIFdl
YkNvcmU6OlBsdWdpblZpZXcqIHB2ID0gKFdlYkNvcmU6OlBsdWdpblZpZXcgKilpbnN0YW5jZS0+
bmRhdGE7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlKiBwcml2ID0gcHYtPmdl
dFByaXZhdGUoKTsKKyAgICAgICAgcmV0dXJuIHByaXYtPnJlc2l6ZUJ1ZmZlcnMoZm9ybWF0LCB3
aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisKKyAgICB2b2lkIHNldEhvbGVQdW5jaChOUFAgaW5zdGFu
Y2UsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorICAgIHsKKyAgICAgICAg
V2ViQ29yZTo6UGx1Z2luVmlldyogcHYgPSAoV2ViQ29yZTo6UGx1Z2luVmlldyAqKWluc3RhbmNl
LT5uZGF0YTsKKyAgICAgICAgV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGUqIHByaXYgPSBwdi0+
Z2V0UHJpdmF0ZSgpOworICAgICAgICBwcml2LT5zZXRIb2xlUHVuY2goeCwgeSwgd2lkdGgsIGhl
aWdodCk7CisgICAgfQorCisgICAgTlBDYWxsYmFja3Mgc19OcENhbGxiYWNrcyA9CisgICAgewor
ICAgICAgICBzZXRWaXNpYmxlUmVjdHMsCisgICAgICAgIGNsZWFyVmlzaWJsZVJlY3RzLAorICAg
ICAgICBzaG93S2V5Ym9hcmQsCisgICAgICAgIHJlcXVlc3RGdWxsU2NyZWVuLAorICAgICAgICBl
eGl0RnVsbFNjcmVlbiwKKyAgICAgICAgcmVxdWVzdENlbnRlckZpdFpvb20sCisgICAgICAgIGxv
Y2tPcmllbnRhdGlvbiwKKyAgICAgICAgdW5sb2NrT3JpZW50YXRpb24sCisgICAgICAgIHByZXZl
bnRJZGxlLAorICAgICAgICBsb2NrQmFja0J1ZmZlciwKKyAgICAgICAgdW5sb2NrQmFja0J1ZmZl
ciwKKyAgICAgICAgbG9ja1JlYWRGcm9udEJ1ZmZlciwKKyAgICAgICAgdW5sb2NrUmVhZEZyb250
QnVmZmVyLAorICAgICAgICBzd2FwQnVmZmVycywKKyAgICAgICAgY3JlYXRlQnVmZmVycywKKyAg
ICAgICAgZGVzdHJveUJ1ZmZlcnMsCisgICAgICAgIHJlc2l6ZUJ1ZmZlcnMsCisgICAgICAgIHNl
dEhvbGVQdW5jaAorICAgIH07Cit9IC8vIGFub255bW91cyBuYW1lc3BhY2UKK30gLy8gZXh0ZXJu
ICJDIgorCisvLyAtLS0tLS0tIFN0YW5kYXJkIHBsdWdpbiB3aWRnZXQgc3R1ZmYuCisKK3VzaW5n
IEpTQzo6RXhlY1N0YXRlOwordXNpbmcgSlNDOjpJbnRlcnByZXRlcjsKK3VzaW5nIEpTQzo6SlNM
b2NrOwordXNpbmcgSlNDOjpKU09iamVjdDsKK3VzaW5nIEpTQzo6VVN0cmluZzsKKwordXNpbmcg
bmFtZXNwYWNlIHN0ZDsKKwordXNpbmcgbmFtZXNwYWNlIFdURjsKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCit2b2lkIFBsdWdpblZpZXc6OnVw
ZGF0ZVBsdWdpbldpZGdldCgpCit7CisgICAgaWYgKCFwYXJlbnQoKSB8fCAhbV9wcml2YXRlKQor
ICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQocGFyZW50KCktPmlzRnJhbWVWaWV3KCkpOwor
ICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50
KCkpOworCisgICAgSW50UmVjdCBvbGRXaW5kb3dSZWN0ID0gbV93aW5kb3dSZWN0OworICAgIElu
dFJlY3Qgb2xkQ2xpcFJlY3QgPSBtX2NsaXBSZWN0OworCisgICAgbV93aW5kb3dSZWN0ID0gSW50
UmVjdChmcmFtZVZpZXctPmNvbnRlbnRzVG9XaW5kb3coZnJhbWVSZWN0KCkubG9jYXRpb24oKSks
IGZyYW1lUmVjdCgpLnNpemUoKSk7CisKKyAgICAvLyBNYXAgcmVjdCB0byBjb250ZW50IGNvb3Jk
aW5hdGUgc3BhY2Ugb2YgbWFpbiBmcmFtZS4KKyAgICBtX3dpbmRvd1JlY3QubW92ZShyb290KCkt
PnNjcm9sbE9mZnNldCgpKTsKKworICAgIG1fY2xpcFJlY3QgPSBjYWxjdWxhdGVDbGlwUmVjdCgp
OworICAgIEludFJlY3QgZiA9IGZyYW1lUmVjdCgpOworCisgICAgLy8gTm90aWZ5IHRoZSBwbHVn
aW4gaWYgaXQgbWF5IG9yIG1heSBub3QgYmUgb24vb2Zmc2NyZWVuLgorICAgIGhhbmRsZVNjcm9s
bEV2ZW50KCk7CisKKyAgICBib29sIHpvb21GYWN0b3JDaGFuZ2VkID0gKChOUFNldFdpbmRvd0Nh
bGxiYWNrU3RydWN0KiltX25wV2luZG93LndzX2luZm8pLT56b29tRmFjdG9yCisgICAgICAgICE9
IGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+Y3VycmVudFpv
b21GYWN0b3IoKTsKKworICAgIGlmICghem9vbUZhY3RvckNoYW5nZWQgJiYgbV93aW5kb3dSZWN0
ID09IG9sZFdpbmRvd1JlY3QgJiYgbV9jbGlwUmVjdCA9PSBvbGRDbGlwUmVjdCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gZG8gbm90IGNhbGwgc2V0TlBXaW5kb3dJZk5lZWRlZCBpbW1lZGlh
dGVseSwgd2lsbCBiZSBjYWxsZWQgb24gcGFpbnQoKQorICAgIG1fcHJpdmF0ZS0+bV9oYXNQZW5k
aW5nR2VvbWV0cnlDaGFuZ2UgPSB0cnVlOworCisgICAgLy8gKGkpIGluIG9yZGVyIHRvIG1vdmUv
cmVzaXplIHRoZSBwbHVnaW4gd2luZG93IGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlCisgICAgLy8g
cmVzdCBvZiBmcmFtZSBkdXJpbmcgZS5nLiBzY3JvbGxpbmcsIHdlIHNldCB0aGUgd2luZG93IGdl
b21ldHJ5CisgICAgLy8gaW4gdGhlIHBhaW50KCkgZnVuY3Rpb24sIGJ1dCBhcyBwYWludCgpIGlz
bid0IGNhbGxlZCB3aGVuIHRoZQorICAgIC8vIHBsdWdpbiB3aW5kb3cgaXMgb3V0c2lkZSB0aGUg
ZnJhbWUgd2hpY2ggY2FuIGJlIGNhdXNlZCBieSBhCisgICAgLy8gc2Nyb2xsLCB3ZSBuZWVkIHRv
IG1vdmUvcmVzaXplIGltbWVkaWF0ZWx5LgorICAgIC8vIChpaSkgaWYgd2UgYXJlIHJ1bm5pbmcg
bGF5b3V0IHRlc3RzIGZyb20gRFJULCBwYWludCgpIHdvbid0IGV2ZXIgZ2V0IGNhbGxlZAorICAg
IC8vIHNvIHdlIG5lZWQgdG8gY2FsbCBzZXROUFdpbmRvd0lmTmVlZGVkKCkgaWYgd2luZG93IGdl
b21ldHJ5IGhhcyBjaGFuZ2VkCisgICAgaWYgKG1fY2xpcFJlY3QuaXNFbXB0eSgpCisgICAgICAg
IHx8IChwbGF0Zm9ybVBsdWdpbldpZGdldCgpICYmIChtX3dpbmRvd1JlY3QgIT0gb2xkV2luZG93
UmVjdCB8fCBtX2NsaXBSZWN0ICE9IG9sZENsaXBSZWN0IHx8IHpvb21GYWN0b3JDaGFuZ2VkKSkp
CisgICAgICAgIHNldE5QV2luZG93SWZOZWVkZWQoKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBn
ZXQgcmVwYWludGVkIGFmdGVyd2FyZHMuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBkb3dud2FyZAor
ICAgIC8vIHNjcm9sbGluZyB0byBtb3ZlIHRoZSBwbHVnaW4gd2lkZ2V0IHByb3Blcmx5LgorICAg
IGludmFsaWRhdGUoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpzZXRGb2N1cyhib29sIGZvY3Vz
ZWQpCit7CisgICAgaWYgKCFtX3ByaXZhdGUgfHwgbV9wcml2YXRlLT5tX2lzRm9jdXNlZCA9PSBm
b2N1c2VkKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQocGxhdGZvcm1QbHVnaW5XaWRn
ZXQoKSA9PSBwbGF0Zm9ybVdpZGdldCgpKTsKKyAgICBXaWRnZXQ6OnNldEZvY3VzKGZvY3VzZWQp
OworCisgICAgaWYgKGZvY3VzZWQpCisgICAgICAgIGhhbmRsZUZvY3VzSW5FdmVudCgpOworICAg
IGVsc2UKKyAgICAgICAgaGFuZGxlRm9jdXNPdXRFdmVudCgpOworfQorCit2b2lkIFBsdWdpblZp
ZXc6OnNob3coKQoreworICAgIHNldFNlbGZWaXNpYmxlKHRydWUpOworICAgIFdpZGdldDo6c2hv
dygpOworICAgIHVwZGF0ZVBsdWdpbldpZGdldCgpOworfQorCit2b2lkIFBsdWdpblZpZXc6Omhp
ZGUoKQoreworICAgIHNldFNlbGZWaXNpYmxlKGZhbHNlKTsKKyAgICBXaWRnZXQ6OmhpZGUoKTsK
KyAgICB1cGRhdGVQbHVnaW5XaWRnZXQoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3Ojp1cGRhdGVC
dWZmZXIoY29uc3QgSW50UmVjdCYgYnVmZmVyUmVjdCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVXBkYXRlIHRoZSB6b29tIGZhY3RvciBoZXJlLCBp
dCBoYXBwZW5zIHJpZ2h0IGJlZm9yZSBzZXROUFdpbmRvd0lmTmVlZGVkCisgICAgLy8gZW5zdXJp
bmcgdGhhdCB0aGUgcGx1Z2luIGhhcyBldmVyeSBvcHBvcnR1bml0eSB0byBnZXQgdGhlIHpvb20g
ZmFjdG9yIGJlZm9yZQorICAgIC8vIGl0IHBhaW50cyBhbnl0aGluZy4KKyAgICBpZiAoRnJhbWVW
aWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSkpCisgICAg
ICAgIG1fcHJpdmF0ZS0+c2V0Wm9vbUZhY3RvcihmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxh
dGZvcm1QYWdlQ2xpZW50KCktPmN1cnJlbnRab29tRmFjdG9yKCkpOworCisgICAgc2V0TlBXaW5k
b3dJZk5lZWRlZCgpOworCisgICAgLy8gQnVpbGQgYW5kIGRpc3BhdGNoIGFuIGV2ZW50IHRvIHRo
ZSBwbHVnaW4gdG8gbm90aWZ5IGl0IHdlIGFyZSBhYm91dCB0byBkcmF3IHdoYXRldmVyCisgICAg
Ly8gaXMgaW4gdGhlIGZyb250IGJ1ZmZlci4gVGhpcyBpcyBpdCdzIG9wcG9ydHVuaXR5IHRvIGRv
IGEgc3dhcC4KKyAgICBJbnRSZWN0IGV4cG9zZWRSZWN0KGJ1ZmZlclJlY3QpOworICAgIGV4cG9z
ZWRSZWN0LmludGVyc2VjdChJbnRSZWN0KEludFBvaW50KDAsIDApLCBmcmFtZVJlY3QoKS5zaXpl
KCkpKTsKKworICAgIC8vIE9ubHkgYXNrIHRoZSBwbHVnaW4gdG8gZHJhdyBpZiB0aGUgZXhwb3Nl
ZCByZWN0IHdhcyBleHBsaWNpdGx5IGludmFsaWRhdGVkCisgICAgLy8gYnkgdGhlIHBsdWdpbi4K
KyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBleHBvc2VkUmVnaW9uID0g
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb246OmludGVyc2VjdFJlZ2lvbnMobV9w
cml2YXRlLT5tX2ludmFsaWRhdGVSZWdpb24sIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0
KGV4cG9zZWRSZWN0KSk7CisgICAgaWYgKCFleHBvc2VkUmVnaW9uLmlzRW1wdHkoKSkgeworICAg
ICAgICBtX3ByaXZhdGUtPm1faW52YWxpZGF0ZVJlZ2lvbiA9IEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFjdFJlZ2lvbnMobV9wcml2YXRlLT5tX2ludmFsaWRhdGVS
ZWdpb24sIGV4cG9zZWRSZWdpb24pOworICAgICAgICBzdGQ6OnZlY3RvcjxCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6SW50UmVjdD4gZXhwb3NlZFJlY3RzID0gZXhwb3NlZFJlZ2lvbi5yZWN0cygpOwor
ICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZXhwb3NlZFJlY3RzLnNpemUoKTsgKytp
KSB7CisgICAgICAgICAgICBOUERyYXdFdmVudCBkcmF3OworICAgICAgICAgICAgZHJhdy5wbHVn
aW5SZWN0ID0gdG9OUFJlY3QobV93aW5kb3dSZWN0KTsKKyAgICAgICAgICAgIGRyYXcuY2xpcFJl
Y3QgPSB0b05QUmVjdChtX2NsaXBSZWN0KTsKKyAgICAgICAgICAgIGRyYXcuZHJhd1JlY3QgPSAo
TlBSZWN0KilhbGxvY2Eoc2l6ZW9mKE5QUmVjdCkpOworICAgICAgICAgICAgZHJhdy5kcmF3UmVj
dENvdW50ID0gMTsKKyAgICAgICAgICAgICpkcmF3LmRyYXdSZWN0ID0gdG9OUFJlY3QoZXhwb3Nl
ZFJlY3RzLmF0KGkpKTsKKyAgICAgICAgICAgIGRyYXcuem9vbUZhY3RvciA9ICgoTlBTZXRXaW5k
b3dDYWxsYmFja1N0cnVjdCopbV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3RvcjsKKworICAg
ICAgICAgICAgTlBFdmVudCBucEV2ZW50OworICAgICAgICAgICAgbnBFdmVudC50eXBlID0gTlBf
RHJhd0V2ZW50OworICAgICAgICAgICAgbnBFdmVudC5kYXRhID0gJmRyYXc7CisKKyAgICAgICAg
ICAgIC8vIEZJWE1FOiBSZXR1cm4gZWFybHkgaWYgdGhpcyBmYWlscz8gT3IganVzdCByZXBhaW50
PworICAgICAgICAgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworICAgICAgICB9CisgICAg
fQorfQorCit2b2lkIFBsdWdpblZpZXc6OnBhaW50KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwg
Y29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSB8fCAhbV9pc1N0YXJ0
ZWQpIHsKKyAgICAgICAgcGFpbnRNaXNzaW5nUGx1Z2luSWNvbihjb250ZXh0LCByZWN0KTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgem9vbSBmYWN0b3IgaGVy
ZSwgaXQgaGFwcGVucyByaWdodCBiZWZvcmUgc2V0TlBXaW5kb3dJZk5lZWRlZAorICAgIC8vIGVu
c3VyaW5nIHRoYXQgdGhlIHBsdWdpbiBoYXMgZXZlcnkgb3Bwb3J0dW5pdHkgdG8gZ2V0IHRoZSB6
b29tIGZhY3RvciBiZWZvcmUKKyAgICAvLyBpdCBwYWludHMgYW55dGhpbmcuCisgICAgaWYgKEZy
YW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpKQor
ICAgICAgICBtX3ByaXZhdGUtPnNldFpvb21GYWN0b3IoZnJhbWVWaWV3LT5ob3N0V2luZG93KCkt
PnBsYXRmb3JtUGFnZUNsaWVudCgpLT5jdXJyZW50Wm9vbUZhY3RvcigpKTsKKworICAgIGlmIChj
b250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHNldE5Q
V2luZG93SWZOZWVkZWQoKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAg
ICBpZiAobV9wcml2YXRlLT5tX3BsYXRmb3JtTGF5ZXIpCisgICAgICAgIHJldHVybjsKKyNlbmRp
ZgorCisgICAgLy8gQnVpbGQgYW5kIGRpc3BhdGNoIGFuIGV2ZW50IHRvIHRoZSBwbHVnaW4gdG8g
bm90aWZ5IGl0IHdlIGFyZSBhYm91dCB0byBkcmF3IHdoYXRldmVyCisgICAgLy8gaXMgaW4gdGhl
IGZyb250IGJ1ZmZlci4gVGhpcyBpcyBpdCdzIG9wcG9ydHVuaXR5IHRvIGRvIGEgc3dhcC4KKyAg
ICBJbnRSZWN0IHJlY3RDbGlwKHJlY3QpOworICAgIHJlY3RDbGlwLmludGVyc2VjdChmcmFtZVJl
Y3QoKSk7CisKKyAgICBJbnRSZWN0IGV4cG9zZWRSZWN0KHJlY3RDbGlwKTsKKyAgICBleHBvc2Vk
UmVjdC5tb3ZlKC1mcmFtZVJlY3QoKS54KCksIC1mcmFtZVJlY3QoKS55KCkpOworCisgICAgdXBk
YXRlQnVmZmVyKGV4cG9zZWRSZWN0KTsKKworICAgIFB0aHJlYWRSZWFkTG9ja2VyIGZyb250TG9j
aygmbV9wcml2YXRlLT5tX2Zyb250QnVmZmVyUndMb2NrKTsKKworICAgIEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBmcm9udEJ1ZmZlciA9CisgICAgICAgIG1fcHJpdmF0
ZS0+bV9wbHVnaW5CdWZmZXJzW21fcHJpdmF0ZS0+bV9wbHVnaW5Gcm9udEJ1ZmZlcl07CisKKyAg
ICAvLyBEb24ndCBwYWludCBhbnl0aGluZyBpZiB0aGVyZSBpcyBubyBidWZmZXIuCisgICAgaWYg
KCFmcm9udEJ1ZmZlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdyYXBoaWNzOjpCYWNraW5nSW1hZ2UqIGJhY2tpbmdJbWFnZSA9CisgICAgICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6bG9ja0J1ZmZlckJhY2tpbmdJbWFnZShm
cm9udEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6UmVhZEFjY2Vz
cyk7CisgICAgaWYgKCFiYWNraW5nSW1hZ2UpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIERy
YXcgdGhlIGNoYW5nZWQgYnVmZmVyIGNvbnRlbnRzIHRvIHRoZSBzY3JlZW4uCisgICAgY29udGV4
dC0+c2F2ZSgpOworCisjaWYgVVNFKFNLSUEpCisgICAgY29uc3QgU2tCaXRtYXAmIHBsdWdpbklt
YWdlID0gKmJhY2tpbmdJbWFnZTsKKyAgICBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogZ3JhcGhp
Y3MgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBBU1NFUlQoZ3JhcGhpY3MpOwor
ICAgIFNrQ2FudmFzKiBjYW52YXMgPSBncmFwaGljcy0+Y2FudmFzKCk7CisKKyAgICAvLyBTb3Vy
Y2UgcmVjdGFuZ2xlIHdlIHdpbGwgZHJhdyB0byB0aGUgc2NyZWVuLgorICAgIFNrSVJlY3Qgc2tT
cmNSZWN0OworICAgIHNrU3JjUmVjdC5zZXQoZXhwb3NlZFJlY3QueCgpLCBleHBvc2VkUmVjdC55
KCksCisgICAgICAgICAgICAgICAgICBleHBvc2VkUmVjdC54KCkgKyBleHBvc2VkUmVjdC53aWR0
aCgpLAorICAgICAgICAgICAgICAgICAgZXhwb3NlZFJlY3QueSgpICsgZXhwb3NlZFJlY3QuaGVp
Z2h0KCkpOworCisgICAgLy8gUHJlcGFyZSB0aGUgaG9sZSBwdW5jaCByZWN0YW5nbGUuCisgICAg
U2tJUmVjdCB1bmNsaXBwZWRIb2xlUHVuY2hSZWN0OworICAgIHVuY2xpcHBlZEhvbGVQdW5jaFJl
Y3Quc2V0KG1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LngoKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC55KCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbV9wcml2YXRlLT5tX2hvbGVQdW5jaFJlY3QueCgpICsgbV9w
cml2YXRlLT5tX2hvbGVQdW5jaFJlY3Qud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC55KCkgKyBtX3ByaXZhdGUtPm1faG9s
ZVB1bmNoUmVjdC5oZWlnaHQoKSk7CisKKyAgICAvLyBob2xlUHVuY2hSZWN0IGlzIGNsaXBwZWQu
CisgICAgU2tJUmVjdCBob2xlUHVuY2hSZWN0OworCisgICAgLy8gQWxsIHNvdXJjZSByZWN0YW5n
bGVzIGFyZSBzY2FsZWQgYnkgdGhlIHpvb20gZmFjdG9yIGJlY2F1c2UgdGhlIHNvdXJjZSBiaXRt
YXAgbWF5IGJlIGEKKyAgICAvLyBoaWdoZXIgcmVzb2x1dGlvbiB0aGFuIHRoZSAxOjEgcGFnZS4g
VGhpcyBhbGxvd3MgdGhlIGZsYXNoIHBsYXllciB0byBzY2FsZSB0aGUgY29udGVudAorICAgIC8v
IGl0IGlzIGRyYXdpbmcgdG8gbWF0Y2ggdGhlIHNjYWxlIG9mIHRoZSBwYWdlLgorICAgIGRvdWJs
ZSB6b29tRmFjdG9ySCA9IChkb3VibGUpbV9wcml2YXRlLT5tX3BsdWdpbkJ1ZmZlclNpemUud2lk
dGgoKSAvIChkb3VibGUpZnJhbWVSZWN0KCkud2lkdGgoKTsKKyAgICBkb3VibGUgem9vbUZhY3Rv
clcgPSAoZG91YmxlKW1fcHJpdmF0ZS0+bV9wbHVnaW5CdWZmZXJTaXplLmhlaWdodCgpIC8gKGRv
dWJsZSlmcmFtZVJlY3QoKS5oZWlnaHQoKTsKKyAgICBkb3VibGUgem9vbUZhY3RvciA9ICh6b29t
RmFjdG9ySCArIHpvb21GYWN0b3JXKSAvIDIuMDsKKworICAgIC8vIFRoaXMgbWV0aG9kIGRyYXdz
IGEgaG9sZSBpZiBzcGVjaWZpZWQuCisgICAgaWYgKCFtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVj
dC5pc0VtcHR5KCkKKyAgICAgICAgJiYgaG9sZVB1bmNoUmVjdC5pbnRlcnNlY3QodW5jbGlwcGVk
SG9sZVB1bmNoUmVjdCwgc2tTcmNSZWN0KSkgeworCisgICAgICAgIC8vIERyYXcgdGhlIHRvcCBj
aHVuayBpZiBuZWVkZWQuCisgICAgICAgIGlmIChob2xlUHVuY2hSZWN0LmZUb3AgPiBza1NyY1Jl
Y3QuZlRvcCkgeworICAgICAgICAgICAgU2tJUmVjdCBzcmNSZWN0OworICAgICAgICAgICAgc3Jj
UmVjdC5zZXQoc2tTcmNSZWN0LmZMZWZ0ICogem9vbUZhY3Rvciwgc2tTcmNSZWN0LmZUb3AgKiB6
b29tRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgc2tTcmNSZWN0LmZSaWdodCAqIHpv
b21GYWN0b3IsIGhvbGVQdW5jaFJlY3QuZlRvcCAqIHpvb21GYWN0b3IpOworCisgICAgICAgICAg
ICBTa1JlY3QgZHN0UmVjdDsKKyAgICAgICAgICAgIGRzdFJlY3Quc2V0KHNrU3JjUmVjdC5mTGVm
dCwgc2tTcmNSZWN0LmZUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICBza1NyY1JlY3QuZlJp
Z2h0LCBob2xlUHVuY2hSZWN0LmZUb3ApOworICAgICAgICAgICAgZHN0UmVjdC5vZmZzZXQoZnJh
bWVSZWN0KCkueCgpLCBmcmFtZVJlY3QoKS55KCkpOworCisgICAgICAgICAgICBjYW52YXMtPmRy
YXdCaXRtYXBSZWN0KHBsdWdpbkltYWdlLCAmc3JjUmVjdCwgZHN0UmVjdCk7CisgICAgICAgIH0K
KworICAgICAgICAvLyBEcmF3IHRoZSBsZWZ0IGNodW5rIGlmIG5lZWRlZC4KKyAgICAgICAgaWYg
KGhvbGVQdW5jaFJlY3QuZkxlZnQgPiBza1NyY1JlY3QuZkxlZnQpIHsKKyAgICAgICAgICAgIFNr
SVJlY3Qgc3JjUmVjdDsKKyAgICAgICAgICAgIHNyY1JlY3Quc2V0KHNrU3JjUmVjdC5mTGVmdCAq
IHpvb21GYWN0b3IsIGhvbGVQdW5jaFJlY3QuZlRvcCAqIHpvb21GYWN0b3IsCisgICAgICAgICAg
ICAgICAgICAgICAgICBob2xlUHVuY2hSZWN0LmZMZWZ0ICogem9vbUZhY3RvciwgaG9sZVB1bmNo
UmVjdC5mQm90dG9tICogem9vbUZhY3Rvcik7CisKKyAgICAgICAgICAgIFNrUmVjdCBkc3RSZWN0
OworICAgICAgICAgICAgZHN0UmVjdC5zZXQoc2tTcmNSZWN0LmZMZWZ0LCBob2xlUHVuY2hSZWN0
LmZUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICBob2xlUHVuY2hSZWN0LmZMZWZ0LCBob2xl
UHVuY2hSZWN0LmZCb3R0b20pOworICAgICAgICAgICAgZHN0UmVjdC5vZmZzZXQoZnJhbWVSZWN0
KCkueCgpLCBmcmFtZVJlY3QoKS55KCkpOworCisgICAgICAgICAgICBjYW52YXMtPmRyYXdCaXRt
YXBSZWN0KHBsdWdpbkltYWdlLCAmc3JjUmVjdCwgZHN0UmVjdCk7CisgICAgICAgIH0KKworICAg
ICAgICAvLyBEcmF3IHRoZSBob2xlIGNodW5rLgorICAgICAgICB7CisgICAgICAgICAgICBTa1Bh
aW50IHBhaW50OworICAgICAgICAgICAgcGFpbnQuc2V0WGZlcm1vZGVNb2RlKFNrWGZlcm1vZGU6
OmtTcmNfTW9kZSk7CisKKyAgICAgICAgICAgIFNrSVJlY3Qgc3JjUmVjdDsKKyAgICAgICAgICAg
IHNyY1JlY3Quc2V0KGhvbGVQdW5jaFJlY3QuZkxlZnQgKiB6b29tRmFjdG9yLCBob2xlUHVuY2hS
ZWN0LmZUb3AgKiB6b29tRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgaG9sZVB1bmNo
UmVjdC5mUmlnaHQgKiB6b29tRmFjdG9yLCBob2xlUHVuY2hSZWN0LmZCb3R0b20gKiB6b29tRmFj
dG9yKTsKKworICAgICAgICAgICAgU2tSZWN0IGRzdFJlY3Q7CisgICAgICAgICAgICBkc3RSZWN0
LnNldChob2xlUHVuY2hSZWN0LmZMZWZ0LCBob2xlUHVuY2hSZWN0LmZUb3AsCisgICAgICAgICAg
ICAgICAgICAgICAgICBob2xlUHVuY2hSZWN0LmZSaWdodCwgaG9sZVB1bmNoUmVjdC5mQm90dG9t
KTsKKyAgICAgICAgICAgIGRzdFJlY3Qub2Zmc2V0KGZyYW1lUmVjdCgpLngoKSwgZnJhbWVSZWN0
KCkueSgpKTsKKworICAgICAgICAgICAgY2FudmFzLT5kcmF3Qml0bWFwUmVjdChwbHVnaW5JbWFn
ZSwgJnNyY1JlY3QsIGRzdFJlY3QsICZwYWludCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBE
cmF3IHRoZSByaWdodCBjaHVuayBpZiBuZWVkZWQuCisgICAgICAgIGlmIChob2xlUHVuY2hSZWN0
LmZSaWdodCA8IHNrU3JjUmVjdC5mUmlnaHQpIHsKKyAgICAgICAgICAgIFNrSVJlY3Qgc3JjUmVj
dDsKKyAgICAgICAgICAgIHNyY1JlY3Quc2V0KGhvbGVQdW5jaFJlY3QuZlJpZ2h0ICogem9vbUZh
Y3RvciwgaG9sZVB1bmNoUmVjdC5mVG9wICogem9vbUZhY3RvciwKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHNrU3JjUmVjdC5mUmlnaHQgKiB6b29tRmFjdG9yLCBob2xlUHVuY2hSZWN0LmZCb3R0
b20gKiB6b29tRmFjdG9yKTsKKworICAgICAgICAgICAgU2tSZWN0IGRzdFJlY3Q7CisgICAgICAg
ICAgICBkc3RSZWN0LnNldChob2xlUHVuY2hSZWN0LmZSaWdodCwgaG9sZVB1bmNoUmVjdC5mVG9w
LAorICAgICAgICAgICAgICAgICAgICAgICAgc2tTcmNSZWN0LmZSaWdodCwgaG9sZVB1bmNoUmVj
dC5mQm90dG9tKTsKKyAgICAgICAgICAgIGRzdFJlY3Qub2Zmc2V0KGZyYW1lUmVjdCgpLngoKSwg
ZnJhbWVSZWN0KCkueSgpKTsKKworICAgICAgICAgICAgY2FudmFzLT5kcmF3Qml0bWFwUmVjdChw
bHVnaW5JbWFnZSwgJnNyY1JlY3QsIGRzdFJlY3QpOworICAgICAgICB9CisKKyAgICAgICAgLy8g
RHJhdyB0aGUgYm90dG9tIGNodW5rIGlmIG5lZWRlZC4KKyAgICAgICAgaWYgKGhvbGVQdW5jaFJl
Y3QuZkJvdHRvbSA8IHNrU3JjUmVjdC5mQm90dG9tKSB7CisgICAgICAgICAgICBTa0lSZWN0IHNy
Y1JlY3Q7CisgICAgICAgICAgICBzcmNSZWN0LnNldChza1NyY1JlY3QuZkxlZnQgKiB6b29tRmFj
dG9yLCBob2xlUHVuY2hSZWN0LmZCb3R0b20gKiB6b29tRmFjdG9yLAorICAgICAgICAgICAgICAg
ICAgICAgICAgc2tTcmNSZWN0LmZSaWdodCAqIHpvb21GYWN0b3IsIHNrU3JjUmVjdC5mQm90dG9t
ICogem9vbUZhY3Rvcik7CisKKyAgICAgICAgICAgIFNrUmVjdCBkc3RSZWN0OworICAgICAgICAg
ICAgZHN0UmVjdC5zZXQoc2tTcmNSZWN0LmZMZWZ0LCBob2xlUHVuY2hSZWN0LmZCb3R0b20sCisg
ICAgICAgICAgICAgICAgICAgICAgICBza1NyY1JlY3QuZlJpZ2h0LCBza1NyY1JlY3QuZkJvdHRv
bSk7CisgICAgICAgICAgICBkc3RSZWN0Lm9mZnNldChmcmFtZVJlY3QoKS54KCksIGZyYW1lUmVj
dCgpLnkoKSk7CisKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd0JpdG1hcFJlY3QocGx1Z2luSW1h
Z2UsICZzcmNSZWN0LCBkc3RSZWN0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAg
IFNrSVJlY3Qgc3JjUmVjdDsKKyAgICAgICAgc3JjUmVjdC5zZXQoc2tTcmNSZWN0LmZMZWZ0ICog
em9vbUZhY3Rvciwgc2tTcmNSZWN0LmZUb3AgKiB6b29tRmFjdG9yLAorICAgICAgICAgICAgICAg
ICAgICBza1NyY1JlY3QuZlJpZ2h0ICogem9vbUZhY3Rvciwgc2tTcmNSZWN0LmZCb3R0b20gKiB6
b29tRmFjdG9yKTsKKworICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRlc3RpbmF0aW9uIHJlY3Rh
bmdsZS4KKyAgICAgICAgU2tSZWN0IGRzdFJlY3Q7CisgICAgICAgIGRzdFJlY3Quc2V0KHJlY3RD
bGlwLngoKSwgcmVjdENsaXAueSgpLAorICAgICAgICAgICAgICAgICAgICByZWN0Q2xpcC54KCkg
KyByZWN0Q2xpcC53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICByZWN0Q2xpcC55KCkgKyBy
ZWN0Q2xpcC5oZWlnaHQoKSk7CisKKyAgICAgICAgLy8gRG9uJ3QgcHVuY2ggYSBob2xlLgorICAg
ICAgICBjYW52YXMtPmRyYXdCaXRtYXBSZWN0KHBsdWdpbkltYWdlLCAmc3JjUmVjdCwgZHN0UmVj
dCk7CisgICAgfQorI2Vsc2UKKyN3YXJuaW5nICJJbXBsZW1lbnQgbWUhIgorICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworI2VuZGlmCisKKyAgICBjb250ZXh0LT5yZXN0b3JlKCk7CisKKyAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OnJlbGVhc2VCdWZmZXJCYWNraW5nSW1hZ2Uo
ZnJvbnRCdWZmZXIpOworfQorCisKK2Jvb2wgUGx1Z2luVmlldzo6ZGlzcGF0Y2hGdWxsU2NyZWVu
TlBFdmVudChOUEV2ZW50JiBldmVudCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgQVNTRVJUKG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pOwor
ICAgIHJldHVybiBkaXNwYXRjaE5QRXZlbnQoZXZlbnQpOworfQorCisvLyBGSVhNRTogVW5pZnkg
YWNyb3NzIHBvcnRzLgorYm9vbCBQbHVnaW5WaWV3OjpkaXNwYXRjaE5QRXZlbnQoTlBFdmVudCYg
ZXZlbnQpCit7CisgICAgLy8gc2FuaXR5IGNoZWNrLgorICAgIGlmICghbV9wbHVnaW4gfHwgIW1f
cGx1Z2luLT5wbHVnaW5GdW5jcygpLT5ldmVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBsdWdpblZpZXcodGhpcyk7CisgICAgSlNDOjpKU0xv
Y2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3MoSlNDOjpTaWxlbmNlQXNzZXJ0aW9uc09ubHkp
OworICAgIHNldENhbGxpbmdQbHVnaW4odHJ1ZSk7CisKKyAgICBib29sIGFjY2VwdGVkID0gbV9w
bHVnaW4tPnBsdWdpbkZ1bmNzKCktPmV2ZW50KG1faW5zdGFuY2UsICZldmVudCk7CisKKyAgICBz
ZXRDYWxsaW5nUGx1Z2luKGZhbHNlKTsKKyAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1Z2lu
VmlldygwKTsKKworICAgIHJldHVybiBhY2NlcHRlZDsKK30KKwordm9pZCBQbHVnaW5WaWV3Ojpo
YW5kbGVLZXlib2FyZEV2ZW50KEtleWJvYXJkRXZlbnQqIGV2ZW50KQoreworICAgIE5QRXZlbnQg
bnBFdmVudDsKKyAgICBOUEtleWJvYXJkRXZlbnQga2V5RXZlbnQ7CisgICAgY29uc3QgUGxhdGZv
cm1LZXlib2FyZEV2ZW50ICpwbGF0Zm9ybUtleUV2ZW50ID0gZXZlbnQtPmtleUV2ZW50KCk7CisK
KyAgICBrZXlFdmVudC5tb2RpZmllcnMgPSAwOworCisgICAgaWYgKHBsYXRmb3JtS2V5RXZlbnQt
PnNoaWZ0S2V5KCkpCisgICAgICAgIGtleUV2ZW50Lm1vZGlmaWVycyB8PSBLRVlNT0RfU0hJRlQ7
CisKKyAgICBpZiAocGxhdGZvcm1LZXlFdmVudC0+Y3RybEtleSgpKQorICAgICAgICBrZXlFdmVu
dC5tb2RpZmllcnMgfD0gS0VZTU9EX0NUUkw7CisKKyAgICBpZiAocGxhdGZvcm1LZXlFdmVudC0+
YWx0S2V5KCkpCisgICAgICAgIGtleUV2ZW50Lm1vZGlmaWVycyB8PSBLRVlNT0RfQUxUOworCisg
ICAgaWYgKHBsYXRmb3JtS2V5RXZlbnQtPm1ldGFLZXkoKSkKKyAgICAgICAga2V5RXZlbnQubW9k
aWZpZXJzIHw9IEtFWU1PRF9BTFRHUjsKKworICAgIGtleUV2ZW50LmNhcCA9IHBsYXRmb3JtS2V5
RXZlbnQtPnVubW9kaWZpZWRDaGFyYWN0ZXIoKTsKKyAgICBrZXlFdmVudC5zeW0gPSBrZXlFdmVu
dC5jYXA7CisgICAga2V5RXZlbnQuc2NhbiA9IDA7CisgICAga2V5RXZlbnQuZmxhZ3MgPSAwOwor
CisgICAgaWYgKHBsYXRmb3JtS2V5RXZlbnQtPnR5cGUoKSA9PSBQbGF0Zm9ybUtleWJvYXJkRXZl
bnQ6OlJhd0tleURvd24KKyAgICAgICAgICAgIHx8IHBsYXRmb3JtS2V5RXZlbnQtPnR5cGUoKSA9
PSBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6OktleURvd24pIHsKKyAgICAgICAga2V5RXZlbnQuZmxh
Z3MgPSBLRVlfRE9XTiB8IEtFWV9TWU1fVkFMSUQgfCBLRVlfQ0FQX1ZBTElEOworICAgIH0gZWxz
ZSBpZiAocGxhdGZvcm1LZXlFdmVudC0+dHlwZSgpID09IFBsYXRmb3JtS2V5Ym9hcmRFdmVudDo6
S2V5VXApCisgICAgICAgIGtleUV2ZW50LmZsYWdzID0gS0VZX1NZTV9WQUxJRCB8IEtFWV9DQVBf
VkFMSUQ7CisKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9LZXlFdmVudDsKKyAgICBucEV2ZW50LmRh
dGEgPSAma2V5RXZlbnQ7CisgICAgaWYgKGRpc3BhdGNoTlBFdmVudChucEV2ZW50KSkKKyAgICAg
ICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFu
ZGxlV2hlZWxFdmVudChXaGVlbEV2ZW50KiBldmVudCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFtX3ByaXZhdGUtPm1faXNGb2N1c2VkKQorICAg
ICAgICBmb2N1c1BsdWdpbkVsZW1lbnQoKTsKKworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBO
UFdoZWVsRXZlbnQgd2hlZWxFdmVudDsKKworICAgIHdoZWVsRXZlbnQueCA9IGV2ZW50LT5vZmZz
ZXRYKCk7CisgICAgd2hlZWxFdmVudC55ID0gZXZlbnQtPm9mZnNldFkoKTsKKworICAgIHdoZWVs
RXZlbnQuZmxhZ3MgPSAwOworCisgICAgd2hlZWxFdmVudC54RGVsdGEgPSBldmVudC0+cmF3RGVs
dGFYKCk7CisgICAgd2hlZWxFdmVudC55RGVsdGEgPSBldmVudC0+cmF3RGVsdGFZKCk7CisKKyAg
ICBucEV2ZW50LnR5cGUgPSBOUF9XaGVlbEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICZ3aGVl
bEV2ZW50OworCisgICAgaWYgKGRpc3BhdGNoTlBFdmVudChucEV2ZW50KSkgeworICAgICAgICBl
dmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKKyAgICAgICAgZXZlbnQtPnNldFBsdWdpbkhhbmRs
ZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlVG91Y2hFdmVudChUb3Vj
aEV2ZW50KiBldmVudCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKCFtX3ByaXZhdGUtPm1faXNGb2N1c2VkKQorICAgICAgICBmb2N1c1BsdWdpbkVs
ZW1lbnQoKTsKKworICAgIE5QVG91Y2hFdmVudCBucFRvdWNoRXZlbnQ7CisKKyAgICBpZiAoZXZl
bnQtPmlzRG91YmxlVGFwKCkpCisgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZF
TlRfRE9VQkxFVEFQOworICAgIGVsc2UgaWYgKGV2ZW50LT5pc1RvdWNoSG9sZCgpKQorICAgICAg
ICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX1RPVUNISE9MRDsKKyAgICBlbHNlIGlm
IChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS50b3VjaHN0YXJ0RXZlbnQpCisgICAgICAg
IG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRfU1RBUlQ7CisgICAgZWxzZSBpZiAoZXZl
bnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkudG91Y2hlbmRFdmVudCkKKyAgICAgICAgbnBUb3Vj
aEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9FTkQ7CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUo
KSA9PSBldmVudE5hbWVzKCkudG91Y2htb3ZlRXZlbnQpCisgICAgICAgIG5wVG91Y2hFdmVudC50
eXBlID0gVE9VQ0hfRVZFTlRfTU9WRTsKKyAgICBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2
ZW50TmFtZXMoKS50b3VjaGNhbmNlbEV2ZW50KQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9
IFRPVUNIX0VWRU5UX0NBTkNFTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybjsKKworICAgIFRv
dWNoTGlzdCogdG91Y2hMaXN0OworICAgIC8vIFRoZSB0b3VjaGVzIGxpc3QgaXMgZW1wdHkgaWYg
aW4gYSB0b3VjaCBlbmQgZXZlbnQuIFVzZSBjaGFuZ2VkVG91Y2hlcyBpbnN0ZWFkLgorICAgIGlm
IChucFRvdWNoRXZlbnQudHlwZSA9PSBUT1VDSF9FVkVOVF9ET1VCTEVUQVAgfHwgbnBUb3VjaEV2
ZW50LnR5cGUgPT0gVE9VQ0hfRVZFTlRfRU5EKQorICAgICAgICB0b3VjaExpc3QgPSBldmVudC0+
Y2hhbmdlZFRvdWNoZXMoKTsKKyAgICBlbHNlCisgICAgICAgIHRvdWNoTGlzdCA9IGV2ZW50LT50
b3VjaGVzKCk7CisKKyAgICBucFRvdWNoRXZlbnQucG9pbnRzID0gMDsKKyAgICBucFRvdWNoRXZl
bnQuc2l6ZSA9IHRvdWNoTGlzdC0+bGVuZ3RoKCk7CisKKyAgICBpZiAodG91Y2hMaXN0LT5sZW5n
dGgoKSkgeworICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzID0gbmV3IE5QVG91Y2hQb2ludFt0
b3VjaExpc3QtPmxlbmd0aCgpXTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHRv
dWNoTGlzdC0+bGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgVG91Y2gqIHRvdWNoSXRlbSA9
IHRvdWNoTGlzdC0+aXRlbShpKTsKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHNbaV0u
dG91Y2hJZCA9IHRvdWNoSXRlbS0+aWRlbnRpZmllcigpOworICAgICAgICAgICAgbnBUb3VjaEV2
ZW50LnBvaW50c1tpXS5jbGllbnRYID0gdG91Y2hJdGVtLT5wYWdlWCgpIC0gZnJhbWVSZWN0KCku
eCgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5jbGllbnRZID0gdG91Y2hJ
dGVtLT5wYWdlWSgpIC0gZnJhbWVSZWN0KCkueSgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50
LnBvaW50c1tpXS5zY3JlZW5YID0gdG91Y2hJdGVtLT5zY3JlZW5YKCk7CisgICAgICAgICAgICBu
cFRvdWNoRXZlbnQucG9pbnRzW2ldLnNjcmVlblkgPSB0b3VjaEl0ZW0tPnNjcmVlblkoKTsKKyAg
ICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHNbaV0ucGFnZVggPSB0b3VjaEl0ZW0tPnBhZ2VY
KCk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnBhZ2VZID0gdG91Y2hJdGVt
LT5wYWdlWSgpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7Cisg
ICAgbnBFdmVudC50eXBlID0gTlBfVG91Y2hFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAmbnBU
b3VjaEV2ZW50OworCisgICAgaWYgKGRpc3BhdGNoTlBFdmVudChucEV2ZW50KSkgeworICAgICAg
ICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKKyAgICAgICAgZXZlbnQtPnNldFBsdWdpbkhh
bmRsZWQoKTsKKyAgICB9IGVsc2UgaWYgKG5wVG91Y2hFdmVudC50eXBlID09IFRPVUNIX0VWRU5U
X0RPVUJMRVRBUCkgeworICAgICAgICAvLyBTZW5kIFRvdWNoIFVwIGlmIGRvdWJsZSB0YXAgbm90
IGNvbnN1bWVkCisgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRfRU5EOwor
ICAgICAgICBucEV2ZW50LmRhdGEgPSAmbnBUb3VjaEV2ZW50OworICAgICAgICBpZiAoZGlzcGF0
Y2hOUEV2ZW50KG5wRXZlbnQpKSB7CisgICAgICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRs
ZWQoKTsKKyAgICAgICAgICAgIGV2ZW50LT5zZXRQbHVnaW5IYW5kbGVkKCk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBkZWxldGVbXSBucFRvdWNoRXZlbnQucG9pbnRzOworfQorCit2b2lkIFBs
dWdpblZpZXc6OmhhbmRsZU1vdXNlRXZlbnQoTW91c2VFdmVudCogZXZlbnQpCit7CisgICAgaWYg
KCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9wcml2YXRlLT5tX2lz
Rm9jdXNlZCkKKyAgICAgICAgZm9jdXNQbHVnaW5FbGVtZW50KCk7CisKKyAgICBOUEV2ZW50IG5w
RXZlbnQ7CisgICAgTlBNb3VzZUV2ZW50IG1vdXNlRXZlbnQ7CisKKyAgICBtb3VzZUV2ZW50Lngg
PSBldmVudC0+b2Zmc2V0WCgpOworICAgIG1vdXNlRXZlbnQueSA9IGV2ZW50LT5vZmZzZXRZKCk7
CisKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2Vkb3duRXZlbnQp
IHsKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9VU0VfQlVUVE9OX0RPV047CisgICAgICAg
IHBhcmVudEZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5zZXRDYXB0dXJpbmdNb3VzZUV2ZW50c05v
ZGUobm9kZSgpKTsKKyAgICB9IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygp
Lm1vdXNlbW92ZUV2ZW50KQorICAgICAgICBtb3VzZUV2ZW50LnR5cGUgPSBNT1VTRV9NT1RJT047
CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2VvdXRFdmVu
dCkKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9VU0VfT1VUQk9VTkQ7CisgICAgZWxzZSBp
ZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2VvdmVyRXZlbnQpCisgICAgICAg
IG1vdXNlRXZlbnQudHlwZSA9IE1PVVNFX09WRVI7CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUo
KSA9PSBldmVudE5hbWVzKCkubW91c2V1cEV2ZW50KSB7CisgICAgICAgIG1vdXNlRXZlbnQudHlw
ZSA9IE1PVVNFX0JVVFRPTl9VUDsKKyAgICAgICAgcGFyZW50RnJhbWUoKS0+ZXZlbnRIYW5kbGVy
KCktPnNldENhcHR1cmluZ01vdXNlRXZlbnRzTm9kZSgwKTsKKyAgICB9IGVsc2UKKyAgICAgICAg
cmV0dXJuOworCisgICAgbW91c2VFdmVudC5idXR0b24gPSBldmVudC0+YnV0dG9uKCk7CisgICAg
bW91c2VFdmVudC5mbGFncyA9IDA7CisKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9Nb3VzZUV2ZW50
OworICAgIG5wRXZlbnQuZGF0YSA9ICZtb3VzZUV2ZW50OworCisgICAgaWYgKGRpc3BhdGNoTlBF
dmVudChucEV2ZW50KSkgeworICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKKyAg
ICAgICAgZXZlbnQtPnNldFBsdWdpbkhhbmRsZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgUGx1Z2lu
Vmlldzo6aGFuZGxlRm9jdXNJbkV2ZW50KCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQgPSB0cnVlOworCisgICAgTlBFdmVu
dCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0ZvY3VzR2FpbmVkRXZlbnQ7CisgICAg
bnBFdmVudC5kYXRhID0gMDsKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3Zv
aWQgUGx1Z2luVmlldzo6aGFuZGxlRm9jdXNPdXRFdmVudCgpCit7CisgICAgaWYgKCFtX3ByaXZh
dGUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9wcml2YXRlLT5tX2lzRm9jdXNlZCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcml2YXRlLT5tX2lzRm9jdXNlZCA9IGZhbHNlOwor
CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0ZvY3VzTG9zdEV2
ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQp
OworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZVBhdXNlRXZlbnQoKQoreworICAgIE5QRXZl
bnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9QYXVzZUV2ZW50OworICAgIG5wRXZl
bnQuZGF0YSA9IDA7CisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBs
dWdpblZpZXc6OmhhbmRsZVJlc3VtZUV2ZW50KCkKK3sKKyAgICBOUEV2ZW50IG5wRXZlbnQ7Cisg
ICAgbnBFdmVudC50eXBlID0gTlBfUmVzdW1lRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsK
KyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFu
ZGxlU2Nyb2xsRXZlbnQoKQoreworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nh
c3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOworCisgICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UsIGlm
IHRoZSBmcmFtZVZpZXcgZXh0ZW50IGluIGVpdGhlciBkaW1lbnNpb24gaXMKKyAgICAvLyBlbXB0
eSwgdGhlbiBzZW5kIGFuIG9uIHNjcmVlbiBldmVudC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHNp
dGVzIGxpa2UKKyAgICAvLyBwaWNuaWsuY29tIHdoaWNoIHVzZSBhIGhpZGRlbiBpZnJhbWUgKHJl
YWQ6IHdpZHRoID0gMCBhbmQgaGVpZ2h0ID0gMCkKKyAgICAvLyB3aXRoIGFuIGVtYmVkZGVkIHN3
ZiB0byBleGVjdXRlIHNvbWUgamF2YXNjcmlwdC4gVW5sZXNzIHdlIHNlbmQgYW4KKyAgICAvLyBv
biBzY3JlZW4gZXZlbnQgdGhlIHN3ZiB3aWxsIG5vdCBleGVjdXRlIHRoZSBqYXZhc2NyaXB0IGFu
ZCB0aGUgcmVhbAorICAgIC8vIHNpdGUgd2lsbCBuZXZlciBsb2FkLgorICAgIGJvb2wgb25TY3Jl
ZW5FdmVudCA9IGZyYW1lVmlldyAmJiAoIWZyYW1lVmlldy0+d2lkdGgoKSB8fCAhZnJhbWVWaWV3
LT5oZWlnaHQoKSk7CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0g
bV9jbGlwUmVjdC5pc0VtcHR5KCkgJiYgIW9uU2NyZWVuRXZlbnQgPyBOUF9PZmZTY3JlZW5FdmVu
dCA6IE5QX09uU2NyZWVuRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKyAgICBkaXNwYXRj
aE5QRXZlbnQobnBFdmVudCk7Cit9CisKK0ludFJlY3QgUGx1Z2luVmlldzo6Y2FsY3VsYXRlQ2xp
cFJlY3QoKSBjb25zdAoreworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8
RnJhbWVWaWV3Kj4ocGFyZW50KCkpOworICAgIGJvb2wgdmlzaWJsZSA9IGZyYW1lVmlldyAmJiBp
c1Zpc2libGUoKTsKKworICAgIGlmICh2aXNpYmxlICYmIGZyYW1lVmlldy0+d2lkdGgoKSAmJiBm
cmFtZVZpZXctPmhlaWdodCgpKSB7CisgICAgICAgIEludFNpemUgd2luZG93U2l6ZSA9IGZyYW1l
Vmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+dmlld3BvcnRTaXplKCk7
CisKKyAgICAgICAgLy8gR2V0IHRoZSBjbGlwcGVkIHJlY3RhbmdsZSBmb3IgdGhpcyBwbGF5ZXIg
d2l0aGluIHRoZSBjdXJyZW50IGZyYW1lLgorICAgICAgICBJbnRSZWN0IHZpc2libGVDb250ZW50
UmVjdDsKKyAgICAgICAgSW50UmVjdCBjb250ZW50UmVjdCA9IG1fZWxlbWVudC0+cmVuZGVyZXIo
KS0+YWJzb2x1dGVDbGlwcGVkT3ZlcmZsb3dSZWN0KCk7CisgICAgICAgIEZsb2F0UG9pbnQgY29u
dGVudExvY2FsID0gbV9lbGVtZW50LT5yZW5kZXJlcigpLT5hYnNvbHV0ZVRvTG9jYWwoRmxvYXRQ
b2ludChjb250ZW50UmVjdC5sb2NhdGlvbigpKSk7CisKKyAgICAgICAgY29udGVudFJlY3Quc2V0
TG9jYXRpb24ocm91bmRlZEludFBvaW50KGNvbnRlbnRMb2NhbCkpOworICAgICAgICBjb250ZW50
UmVjdC5tb3ZlKGZyYW1lUmVjdCgpLngoKSwgZnJhbWVSZWN0KCkueSgpKTsKKworICAgICAgICAv
LyBDbGlwIGFnYWluc3QgYW55IGZyYW1lcyB0aGF0IHRoZSB3aWRnZXQgaXMgaW5zaWRlLiBOb3Rl
IHRoYXQgaWYgdGhlIGZyYW1lcyBhcmUgYWxzbyBjbGlwcGVkCisgICAgICAgIC8vIGJ5IGEgZGl2
LCB0aGF0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoaXMgY2FsY3VsYXRpb24uIFRoYXQgaXMg
YW4gaW1wcm92ZW1lbnQgdGhhdCBzdGlsbAorICAgICAgICAvLyBuZWVkcyB0byBiZSBtYWRlLgor
ICAgICAgICBjb25zdCBXaWRnZXQqIGN1cnJlbnQgPSB0aGlzOworICAgICAgICB3aGlsZSAoY3Vy
cmVudC0+cGFyZW50KCkgJiYgdmlzaWJsZSkgeworICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlm
IGl0IGlzIHZpc2libGUgaW4gdGhpcyBzY3JvbGx2aWV3LgorICAgICAgICAgICAgdmlzaWJsZUNv
bnRlbnRSZWN0ID0gY3VycmVudC0+cGFyZW50KCktPnZpc2libGVDb250ZW50UmVjdCgpOworCisg
ICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHRoZSByb290IFNjcm9sbFZpZXcuIEl0cyBz
aXplIGRvZXMgbm90IG1hdGNoIHRoZSBhY3R1YWwgd2luZG93IHNpemUuCisgICAgICAgICAgICBp
ZiAoY3VycmVudC0+cGFyZW50KCkgPT0gcm9vdCgpKQorICAgICAgICAgICAgICAgIHZpc2libGVD
b250ZW50UmVjdC5zZXRTaXplKHdpbmRvd1NpemUpOworCisgICAgICAgICAgICBjb250ZW50UmVj
dC5pbnRlcnNlY3QodmlzaWJsZUNvbnRlbnRSZWN0KTsKKyAgICAgICAgICAgIHZpc2libGUgPSAh
Y29udGVudFJlY3QuaXNFbXB0eSgpOworCisgICAgICAgICAgICAvLyBPZmZzZXQgdG8gdmlzaWJs
ZSBjb29yZGluYXRlcyBpbiBzY3JvbGx2aWV3IHdpZGdldCdzIGNvb3JkaW5hdGUgc3lzdGVtIChl
eGNlcHQgaW4gdGhlIGNhc2Ugb2YKKyAgICAgICAgICAgIC8vIHRoZSB0b3Agc2Nyb2xsIHZpZXcp
LgorICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnBhcmVudCgpLT5wYXJlbnQoKSkKKyAgICAgICAg
ICAgICAgICBjb250ZW50UmVjdC5tb3ZlKC12aXNpYmxlQ29udGVudFJlY3QueCgpLCAtdmlzaWJs
ZUNvbnRlbnRSZWN0LnkoKSk7CisKKyAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJl
bnQoKTsKKworICAgICAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgb2Zmc2V0IGZvciB0aGUg
cm9vdCB3aW5kb3cgb3Igd2UgZ2V0IHRoZSB3cm9uZyBjb29yZGluYXRlcy4KKyAgICAgICAgICAg
IGlmIChjdXJyZW50LT5wYXJlbnQoKSkgeworICAgICAgICAgICAgICAgIC8vIE1vdmUgY29udGVu
dCByZWN0IGludG8gdGhlIHBhcmVudCBzY3JvbGx2aWV3J3MgY29vcmRpbmF0ZXMuCisgICAgICAg
ICAgICAgICAgSW50UmVjdCBjdXJGcmFtZVJlY3QgPSBjdXJyZW50LT5mcmFtZVJlY3QoKTsKKyAg
ICAgICAgICAgICAgICBjb250ZW50UmVjdC5tb3ZlKGN1ckZyYW1lUmVjdC54KCksIGN1ckZyYW1l
UmVjdC55KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNv
bnRlbnRSZWN0OworICAgIH0KKworICAgIHJldHVybiBJbnRSZWN0KCk7Cit9CisKK3ZvaWQgUGx1
Z2luVmlldzo6aGFuZGxlT25Mb2FkRXZlbnQoKQoreworICAgIGlmICghbV9wcml2YXRlKQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAobV9wcml2YXRlLT5tX3NlbnRPbkxvYWQpCisgICAgICAg
IHJldHVybjsKKworICAgIG1fcHJpdmF0ZS0+bV9zZW50T25Mb2FkID0gdHJ1ZTsKKworICAgIE5Q
RXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9PbkxvYWRFdmVudDsKKyAgICBu
cEV2ZW50LmRhdGEgPSAwOworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworCisgICAg
Ly8gU2VuZCBhbiBpbml0aWFsIE9uU2NyZWVuL09mZlNjcmVlbiBldmVudC4gSXQgbXVzdCBhbHdh
eXMgY29tZSBhZnRlciBvbkxvYWQgaXMgc2VudC4KKyAgICBoYW5kbGVTY3JvbGxFdmVudCgpOwor
fQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUZyZWVNZW1vcnlFdmVudCgpCit7CisgICAgTlBF
dmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0ZyZWVNZW1vcnlFdmVudDsKKyAg
ICBucEV2ZW50LmRhdGEgPSAwOworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQor
Cit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUJhY2tncm91bmRFdmVudCgpCit7CisgICAgTlBFdmVu
dCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0JhY2tncm91bmRFdmVudDsKKyAgICBu
cEV2ZW50LmRhdGEgPSAwOworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2
b2lkIFBsdWdpblZpZXc6OmhhbmRsZUZvcmVncm91bmRFdmVudCgpCit7CisgICAgc2V0TlBXaW5k
b3dJZk5lZWRlZCgpOworCisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9
IE5QX0ZvcmVncm91bmRFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworCisgICAgZGlzcGF0
Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUZ1bGxTY3Jl
ZW5BbGxvd2VkRXZlbnQoKQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47
CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfRnVsbFNjcmVl
blJlYWR5RXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKworICAgIGlmIChGcmFtZVZpZXcq
IGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkgeworICAgICAg
ICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmRpZFBsdWdp
bkVudGVyRnVsbFNjcmVlbih0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNf
c3RyKCkpOworCisgICAgICAgIGlmICghZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpKQorICAgICAg
ICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5kaWRQ
bHVnaW5FeGl0RnVsbFNjcmVlbih0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4
LmNfc3RyKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX3ByaXZhdGUtPm1faXNGdWxs
U2NyZWVuID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlRnVsbFNj
cmVlbkV4aXRFdmVudCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsK
KworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9GdWxsU2NyZWVu
RXhpdEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQo
bnBFdmVudCk7CisKKyAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxG
cmFtZVZpZXcqPihwYXJlbnQoKSkpCisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5w
bGF0Zm9ybVBhZ2VDbGllbnQoKS0+ZGlkUGx1Z2luRXhpdEZ1bGxTY3JlZW4odGhpcywgbV9wcml2
YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKKworICAgIG1fcHJpdmF0ZS0+bV9p
c0Z1bGxTY3JlZW4gPSBmYWxzZTsKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgUGx1Z2lu
Vmlldzo6aGFuZGxlSWRsZUV2ZW50KGJvb2wgZW50ZXJJZGxlKQoreworICAgIE5QRXZlbnQgbnBF
dmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworCisgICAgaWYgKGVudGVySWRsZSkKKyAgICAg
ICAgbnBFdmVudC50eXBlID0gTlBfRW50ZXJJZGxlRXZlbnQ7CisgICAgZWxzZQorICAgICAgICBu
cEV2ZW50LnR5cGUgPSBOUF9FeGl0SWRsZUV2ZW50OworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5w
RXZlbnQpOworfQorCisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlQXBwQWN0aXZhdGVkRXZlbnQo
KQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworICAgIG5w
RXZlbnQudHlwZSA9IE5QX0FwcEFjdGl2YXRlZEV2ZW50OworCisgICAgZGlzcGF0Y2hOUEV2ZW50
KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUFwcERlYWN0aXZhdGVkRXZl
bnQoKQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBQ
bHVnaW4gd2FudHMgdG8ga25vdyB0aGF0IGl0IGhhcyB0byBleGl0IGZ1bGxzY3JlZW4gb24gZGVh
Y3RpdmF0aW9uLgorICAgIGlmIChtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuKQorICAgICAgICBo
YW5kbGVGdWxsU2NyZWVuRXhpdEV2ZW50KCk7CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAg
bnBFdmVudC5kYXRhID0gMDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9BcHBEZWFjdGl2YXRlZEV2
ZW50OworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZp
ZXc6OmhhbmRsZUFwcFN0YW5kYnlFdmVudCgpCit7CisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxk
IHNlbmQgYW4gUU5QX0FwcFN0YW5kYnlFdmVudAorICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBu
cEV2ZW50LmRhdGEgPSAwOworICAgIG5wRXZlbnQudHlwZSA9IE5QX0FwcFN0YW5kQnlFdmVudDsK
KworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQbHVnaW5WaWV3Ojpo
YW5kbGVPcmllbnRhdGlvbkV2ZW50KGludCBhbmdsZSkKK3sKKyAgICBOUEV2ZW50IG5wRXZlbnQ7
CisgICAgbnBFdmVudC50eXBlID0gTlBfT3JpZW50YXRpb25FdmVudDsKKyAgICBucEV2ZW50LmRh
dGEgPSAodm9pZCopYW5nbGU7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisK
K3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlU3dpcGVFdmVudCgpCit7CisgICAgaWYgKCFtX3ByaXZh
dGUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFBsdWdpbiBvbmx5IHdhbnRzIHRvIGtub3cg
dGhhdCBpdCBoYXMgdG8gZXhpdCBmdWxsc2NyZWVuLgorICAgIGlmIChtX3ByaXZhdGUtPm1faXNG
dWxsU2NyZWVuKQorICAgICAgICBoYW5kbGVGdWxsU2NyZWVuRXhpdEV2ZW50KCk7Cit9CisKK3Zv
aWQgUGx1Z2luVmlldzo6aGFuZGxlU2NyZWVuUG93ZXJFdmVudChib29sIHBvd2VyZWQpCit7Cisg
ICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisKKyAgICBpZiAocG93
ZXJlZCkKKyAgICAgICAgbnBFdmVudC50eXBlID0gTlBfU2NyZWVuUG93ZXJVcEV2ZW50OworICAg
IGVsc2UKKyAgICAgICAgbnBFdmVudC50eXBlID0gTlBfU2NyZWVuUG93ZXJEb3duRXZlbnQ7CisK
KyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0
UGFyZW50KFNjcm9sbFZpZXcqIHBhcmVudFdpZGdldCkKK3sKKyAgICAvLyBJZiBwYXJlbnRXaWRn
ZXQgaXMgMCwgbGV0cyB1bnJlZ2lzdGVyIHRoZSBwbHVnaW4gd2l0aCB0aGUgY3VycmVudCBwYXJl
bnQuCisgICAgaWYgKG1fcHJpdmF0ZSAmJiAoIXBhcmVudFdpZGdldCB8fCBwYXJlbnRXaWRnZXQg
IT0gcGFyZW50KCkpKSB7CisgICAgICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRp
Y19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkgeworICAgICAgICAgICAgaWYgKG1fcHJpdmF0
ZS0+bV9pc0JhY2tncm91bmRQbGF5aW5nKQorICAgICAgICAgICAgICAgIGZyYW1lVmlldy0+aG9z
dFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+b25QbHVnaW5TdG9wQmFja2dyb3VuZFBs
YXkodGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKKworICAg
ICAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAgICAgICAgICAgICAg
aGFuZGxlRnVsbFNjcmVlbkV4aXRFdmVudCgpOworCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwg
dW5sb2NrIHRoZSBpZGxlIChpZiB3ZSBoYXZlIGxvY2tlZCBpdCkuCisgICAgICAgICAgICBtX3By
aXZhdGUtPnByZXZlbnRJZGxlKGZhbHNlKTsKKworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHJl
bGVhc2UgYW55IGtlZXBWaXNpYmxlUmVjdHMgaWYgdGhleSB3ZXJlIHNldC4KKyAgICAgICAgICAg
IG1fcHJpdmF0ZS0+Y2xlYXJWaXNpYmxlUmVjdHMoKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKyAgICAgICAgICAgIC8vIElmIHdlIGhhZCBhIGhvbGUgcHVuY2ggcmVjdCBz
ZXQsIGNsZWFyIGl0LgorICAgICAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9wbGF0Zm9ybUxheWVy
ICYmICFtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAg
ICAgbV9wcml2YXRlLT5tX3BsYXRmb3JtTGF5ZXItPnNldEhvbGVQdW5jaFJlY3QoSW50UmVjdCgp
KTsKKyNlbmRpZgorICAgICAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3Jt
UGFnZUNsaWVudCgpLT5yZWdpc3RlclBsdWdpbih0aGlzLCBmYWxzZSAvKnNob3VsZFJlZ2lzdGVy
Ki8pOworICAgICAgICB9CisgICAgfQorCisgICAgV2lkZ2V0OjpzZXRQYXJlbnQocGFyZW50V2lk
Z2V0KTsKKworICAgIGlmIChwYXJlbnRXaWRnZXQpIHsKKyAgICAgICAgaW5pdCgpOworCisgICAg
ICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50
V2lkZ2V0KTsKKworICAgICAgICBpZiAoZnJhbWVWaWV3ICYmIG1fcHJpdmF0ZSkgeworICAgICAg
ICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5yZWdp
c3RlclBsdWdpbih0aGlzLCB0cnVlIC8qc2hvdWxkUmVnaXN0ZXIqLyk7CisgICAgICAgICAgICBp
ZiAoZnJhbWVWaWV3LT5mcmFtZSgpCisgICAgICAgICAgICAgICAmJiBmcmFtZVZpZXctPmZyYW1l
KCktPmxvYWRlcigpCisgICAgICAgICAgICAgICAmJiBmcmFtZVZpZXctPmZyYW1lKCktPmxvYWRl
cigpLT5mcmFtZUhhc0xvYWRlZCgpKQorICAgICAgICAgICAgICAgIGhhbmRsZU9uTG9hZEV2ZW50
KCk7CisKKyAgICAgICAgICAgIGlmIChtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZykK
KyAgICAgICAgICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xp
ZW50KCktPm9uUGx1Z2luU3RhcnRCYWNrZ3JvdW5kUGxheSh0aGlzLCBtX3ByaXZhdGUtPm1fcGx1
Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFBs
dWdpblZpZXc6OnNldE5QV2luZG93UmVjdChjb25zdCBJbnRSZWN0JiByYykKK3sKKyAgICBzZXRO
UFdpbmRvd0lmTmVlZGVkKCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0TlBXaW5kb3dJZk5l
ZWRlZCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUgfHwgIW1faXNTdGFydGVkIHx8ICFwYXJlbnQo
KSB8fCAhbV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPnNldHdpbmRvdykKKyAgICAgICAgcmV0dXJu
OworCisgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihw
YXJlbnQoKSk7CisgICAgaWYgKCFmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdl
Q2xpZW50KCktPmlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIElmIHRoZSBw
bHVnaW4gZGlkbid0IGxvYWQgc3VjZXNzZnVsbHksIG5vIHBvaW50IGluIGNhbGxpbmcgc2V0d2lu
ZG93CisgICAgaWYgKG1fc3RhdHVzICE9IFBsdWdpblN0YXR1c0xvYWRlZFN1Y2Nlc3NmdWxseSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisg
ICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9wcml2YXRlLT5tX2hhc1BlbmRpbmdHZW9tZXRy
eUNoYW5nZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcml2YXRlLT5tX2hhc1BlbmRpbmdH
ZW9tZXRyeUNoYW5nZSA9IGZhbHNlOworCisgICAgbV9ucFdpbmRvdy54ID0gbV93aW5kb3dSZWN0
LngoKTsKKyAgICBtX25wV2luZG93LnkgPSBtX3dpbmRvd1JlY3QueSgpOworCisgICAgbV9ucFdp
bmRvdy5jbGlwUmVjdC5sZWZ0ID0gbWF4KDAsIG1fY2xpcFJlY3QueCgpKTsKKyAgICBtX25wV2lu
ZG93LmNsaXBSZWN0LnRvcCA9IG1heCgwLCBtX2NsaXBSZWN0LnkoKSk7CisgICAgbV9ucFdpbmRv
dy5jbGlwUmVjdC5yaWdodCA9IG1heCgwLCBtX2NsaXBSZWN0Lm1heFgoKSk7CisgICAgbV9ucFdp
bmRvdy5jbGlwUmVjdC5ib3R0b20gPSBtYXgoMCwgbV9jbGlwUmVjdC5tYXhZKCkpOworCisgICAg
aWYgKG1fcGx1Z2luLT5xdWlya3MoKS5jb250YWlucyhQbHVnaW5RdWlya0RvbnRDYWxsU2V0V2lu
ZG93TW9yZVRoYW5PbmNlKSkgeworICAgICAgICAvLyBGTEFTSCBXT1JLQVJPVU5EOiBPbmx5IHNl
dCBpbml0aWFsbHkuIE11bHRpcGxlIGNhbGxzIHRvCisgICAgICAgIC8vIHNldE5QV2luZG93KCkg
Y2F1c2UgdGhlIHBsdWdpbiB0byBjcmFzaCBpbiB3aW5kb3dlZCBtb2RlLgorICAgICAgICBpZiAo
IW1faXNXaW5kb3dlZCB8fCBtX25wV2luZG93LndpZHRoID09IFVOSU5JVF9DT09SRCB8fCBtX25w
V2luZG93LmhlaWdodCA9PSBVTklOSVRfQ09PUkQpIHsKKyAgICAgICAgICAgIG1fbnBXaW5kb3cu
d2lkdGggPSBtX3dpbmRvd1JlY3Qud2lkdGgoKTsKKyAgICAgICAgICAgIG1fbnBXaW5kb3cuaGVp
Z2h0ID0gbV93aW5kb3dSZWN0LmhlaWdodCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgbV9ucFdpbmRvdy53aWR0aCA9IG1fd2luZG93UmVjdC53aWR0aCgpOworICAgICAgICBt
X25wV2luZG93LmhlaWdodCA9IG1fd2luZG93UmVjdC5oZWlnaHQoKTsKKyAgICB9CisKKyAgICBt
X25wV2luZG93LnR5cGUgPSBOUFdpbmRvd1R5cGVEcmF3YWJsZTsKKworICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93ICp3aW5kb3cgPQorICAgICAgICBmcmFtZVZpZXct
Pmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnBsYXRmb3JtV2luZG93KCk7Cisg
ICAgaWYgKHdpbmRvdykKKyAgICAgICAgKChOUFNldFdpbmRvd0NhbGxiYWNrU3RydWN0KiltX25w
V2luZG93LndzX2luZm8pLT53aW5kb3dHcm91cCA9IHdpbmRvdy0+d2luZG93R3JvdXAoKTsKKwor
ICAgIFBsdWdpblZpZXc6OnNldEN1cnJlbnRQbHVnaW5WaWV3KHRoaXMpOworICAgIEpTQzo6SlNM
b2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzKEpTQzo6U2lsZW5jZUFzc2VydGlvbnNPbmx5
KTsKKyAgICBzZXRDYWxsaW5nUGx1Z2luKHRydWUpOworICAgIC8vIEZJWE1FOiBQYXNzaW5nIHpv
b21GYWN0b3IgdG8gc2V0d2luZG93IG1ha2Ugd2luZG93ZWQgcGx1Z2luIHNjYWxlIGluY29ycmVj
dGx5LgorICAgIC8vIEhhbmRsaW5nIHRoZSB6b29tIGZhY3RvciBwcm9wZXJseSBpbiB0aGUgcGx1
Z2luIHNpZGUgbWF5IGJlIGEgYmV0dGVyIHNvbHV0aW9uLgorICAgIGRvdWJsZSBvbGRab29tRmFj
dG9yID0gKChOUFNldFdpbmRvd0NhbGxiYWNrU3RydWN0KiltX25wV2luZG93LndzX2luZm8pLT56
b29tRmFjdG9yOworICAgICgoTlBTZXRXaW5kb3dDYWxsYmFja1N0cnVjdCopbV9ucFdpbmRvdy53
c19pbmZvKS0+em9vbUZhY3RvciA9IDEuOworICAgIG1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5z
ZXR3aW5kb3cobV9pbnN0YW5jZSwgJm1fbnBXaW5kb3cpOworICAgICgoTlBTZXRXaW5kb3dDYWxs
YmFja1N0cnVjdCopbV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3RvciA9IG9sZFpvb21GYWN0
b3I7CisgICAgc2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7CisgICAgUGx1Z2luVmlldzo6c2V0Q3Vy
cmVudFBsdWdpblZpZXcoMCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0UGFyZW50VmlzaWJs
ZShib29sIHZpc2libGUpCit7CisgICAgaWYgKGlzUGFyZW50VmlzaWJsZSgpID09IHZpc2libGUp
CisgICAgICAgIHJldHVybjsKKworICAgIFdpZGdldDo6c2V0UGFyZW50VmlzaWJsZSh2aXNpYmxl
KTsKKworICAgIC8vIEZJWE1FOiBXZSBtaWdodCB3YW50IHRvIHRlbGwgdGhlIHBsdWdpbiB0byBo
aWRlIGl0J3Mgd2luZG93IGhlcmUsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlcgorICAgIC8vICAgICAg
IHNpbmNlIHRoZSB3aW5kb3cgbWFuYWdlciBzaG91bGQgdGFrZSBjYXJlIG9mIHRoYXQgZm9yIHVz
LgorfQorCitOUEVycm9yIFBsdWdpblZpZXc6OmhhbmRsZVBvc3RSZWFkRmlsZShWZWN0b3I8Y2hh
cj4mIGJ1ZmZlciwgdWludDMyX3QgbGVuLCBjb25zdCBjaGFyKiBidWYpCit7CisgICAgU3RyaW5n
IGZpbGVuYW1lKGJ1ZiwgbGVuKTsKKworICAgIGlmIChmaWxlbmFtZS5zdGFydHNXaXRoKCJmaWxl
Oi8vLyIpKQorICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyg4KTsKKworICAg
IGxvbmcgbG9uZyBzaXplOworICAgIGlmICghZ2V0RmlsZVNpemUoZmlsZW5hbWUsIHNpemUpKQor
ICAgICAgICByZXR1cm4gTlBFUlJfRklMRV9OT1RfRk9VTkQ7CisKKyAgICBGSUxFKiBmaWxlSGFu
ZGxlID0gZm9wZW4oKGZpbGVuYW1lLnV0ZjgoKSkuZGF0YSgpLCAiciIpOworICAgIGlmICghZmls
ZUhhbmRsZSkKKyAgICAgICAgcmV0dXJuIE5QRVJSX0ZJTEVfTk9UX0ZPVU5EOworCisgICAgYnVm
ZmVyLnJlc2l6ZShzaXplKTsKKyAgICBpbnQgYnl0ZXNSZWFkID0gZnJlYWQoYnVmZmVyLmRhdGEo
KSwgMSwgc2l6ZSwgZmlsZUhhbmRsZSk7CisKKyAgICBmY2xvc2UoZmlsZUhhbmRsZSk7CisKKyAg
ICBpZiAoYnl0ZXNSZWFkIDw9IDApCisgICAgICAgIHJldHVybiBOUEVSUl9GSUxFX05PVF9GT1VO
RDsKKworICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKK30KKworYm9vbCBQbHVnaW5WaWV3Ojpw
bGF0Zm9ybUdldFZhbHVlU3RhdGljKE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkKiB2YWx1ZSwg
TlBFcnJvciogcmVzdWx0KQoreworICAgIHN3aXRjaCAodmFyaWFibGUpIHsKKyAgICBjYXNlIE5Q
TlZUb29sa2l0OgorICAgICAgICAqc3RhdGljX2Nhc3Q8dWludDMyX3QqPih2YWx1ZSkgPSAwOwor
ICAgICAgICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgIHJldHVybiB0cnVlOwor
CisgICAgY2FzZSBOUE5WU3VwcG9ydHNYRW1iZWRCb29sOgorICAgICAgICAqc3RhdGljX2Nhc3Q8
TlBCb29sKj4odmFsdWUpID0gdHJ1ZTsKKyAgICAgICAgKnJlc3VsdCA9IE5QRVJSX05PX0VSUk9S
OworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgTlBOVmphdmFzY3JpcHRFbmFibGVk
Qm9vbDoKKyAgICAgICAgKnN0YXRpY19jYXN0PE5QQm9vbCo+KHZhbHVlKSA9IHRydWU7CisgICAg
ICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAg
ICBjYXNlIE5QTlZTdXBwb3J0c1dpbmRvd2xlc3M6CisgICAgICAgICpzdGF0aWNfY2FzdDxOUEJv
b2wqPih2YWx1ZSkgPSB0cnVlOworICAgICAgICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7Cisg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBOUE5WTlBDYWxsYmFja3NQdHI6IHsKKyAg
ICAgICAgKigodm9pZCAqKikgdmFsdWUpID0gKHZvaWQqKSZzX05wQ2FsbGJhY2tzOworICAgICAg
ICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wg
UGx1Z2luVmlldzo6cGxhdGZvcm1HZXRWYWx1ZShOUE5WYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCog
dmFsdWUsIE5QRXJyb3IqIHJlc3VsdCkKK3sKKyAgICBzd2l0Y2ggKHZhcmlhYmxlKSB7CisgICAg
Y2FzZSBOUE5WWm9vbUZhY3RvcjogeworICAgICAgICAqKCh2b2lkICoqKSB2YWx1ZSkgPSAodm9p
ZCopJigoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpv
b21GYWN0b3IpOworICAgICAgICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKworICAgIGNhc2UgTlBOVlJvb3RXaW5kb3dHcm91cDogeworICAg
ICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVu
dCgpKTsKKyAgICAgICAgaWYgKGZyYW1lVmlldykgeworICAgICAgICAgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3cgKndpbmRvdyA9CisgICAgICAgICAgICAgICAgZnJh
bWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5wbGF0Zm9ybVdpbmRv
dygpOworICAgICAgICAgICAgaWYgKHdpbmRvdykgeworICAgICAgICAgICAgICAgIHZvaWQqKiB2
ID0gKHZvaWQqKikgdmFsdWU7CisgICAgICAgICAgICAgICAgKnYgPSAodm9pZCopIHdpbmRvdy0+
cm9vdEdyb3VwKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoKnYpIHsKKyAgICAgICAgICAgICAg
ICAgICAgKnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwor
ICAgICAgICAqcmVzdWx0ID0gTlBFUlJfR0VORVJJQ19FUlJPUjsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIGNhc2UgTlBOVkJyb3dzZXJXaW5kb3dHcm91cDogeworICAgICAg
ICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgp
KTsKKyAgICAgICAgaWYgKGZyYW1lVmlldykgeworICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OkdyYXBoaWNzOjpXaW5kb3cgKndpbmRvdyA9CisgICAgICAgICAgICAgICAgZnJhbWVW
aWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5wbGF0Zm9ybVdpbmRvdygp
OworICAgICAgICAgICAgaWYgKHdpbmRvdykgeworICAgICAgICAgICAgICAgIHZvaWQqKiB2ID0g
KHZvaWQqKikgdmFsdWU7CisgICAgICAgICAgICAgICAgKnYgPSAodm9pZCopIHdpbmRvdy0+d2lu
ZG93R3JvdXAoKTsKKworICAgICAgICAgICAgICAgIGlmICgqdikgeworICAgICAgICAgICAgICAg
ICAgICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisg
ICAgICAgICpyZXN1bHQgPSBOUEVSUl9HRU5FUklDX0VSUk9SOworICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorCisgICAgY2FzZSBOUE5WQnJvd3NlckRpc3BsYXlDb250ZXh0OiB7CisgICAg
ICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50
KCkpOworICAgICAgICBpZiAoZnJhbWVWaWV3KSB7CisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6R3JhcGhpY3M6OlBsYXRmb3JtRGlzcGxheUNvbnRleHRIYW5kbGUgY29udGV4dCA9
CisgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpwbGF0Zm9y
bURpc3BsYXlDb250ZXh0KCk7CisgICAgICAgICAgICBpZiAoY29udGV4dCkgeworICAgICAgICAg
ICAgICAgIHZvaWQqKiB2ID0gKHZvaWQqKikgdmFsdWU7CisgICAgICAgICAgICAgICAgKnYgPSAo
dm9pZCopIGNvbnRleHQ7CisKKyAgICAgICAgICAgICAgICBpZiAoKnYpIHsKKyAgICAgICAgICAg
ICAgICAgICAgKnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KworICAgICAgICAqcmVzdWx0ID0gTlBFUlJfR0VORVJJQ19FUlJPUjsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKworICAgIGNhc2UgTlBOVlBsdWdpbldpbmRvd1ByZWZpeDogeworICAg
ICAgICB2b2lkKiogdiA9ICh2b2lkKiopIHZhbHVlOworICAgICAgICAqdiA9ICh2b2lkKikgbV9w
cml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpOworCisgICAgICAgIGlmICgqdikg
eworICAgICAgICAgICAgKnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAqcmVzdWx0ID0gTlBFUlJfR0VORVJJQ19F
UlJPUjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAg
ICAgIHJldHVybiBwbGF0Zm9ybUdldFZhbHVlU3RhdGljKHZhcmlhYmxlLCB2YWx1ZSwgcmVzdWx0
KTsKKyAgICAgICAgLy8gRklYTUU6IFNob3VsZCB3ZSByZXR1cm4gZmFsc2U/CisgICAgfQorfQor
CisvLyBUaGlzIGlzIGEgcHVyZSB2aXJ0dWFsIGluaGVyaXRlZCBmcm9tIFdpZGdldCBjbGFzcyBh
bmQgYWxsIGludmFsaWRhdGVzCisvLyBhcmUgZnVubmVsZWQgdGhyb3VnaCB0aGlzIG1ldGhvZC4g
V2UgZm9yd2FyZCB0aGVtIG9uIHRvIGVpdGhlciB0aGUKKy8vIGNvbXBvc2l0aW5nIGxheWVyIG9y
IHRoZSBQbHVnaW5WaWV3OjppbnZhbGlkYXRlV2luZG93bGVzc1BsdWdpblJlY3QgbWV0aG9kLgor
dm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQorewor
ICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBSZWNvcmQgdGhl
IHJlZ2lvbiB0aGF0IHdlJ3ZlIGJlZW4gYXNrZWQgdG8gaW52YWxpZGF0ZQorICAgIG1fcHJpdmF0
ZS0+bV9pbnZhbGlkYXRlUmVnaW9uID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdp
b246OnVuaW9uUmVnaW9ucyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdChyZWN0KSwgbV9w
cml2YXRlLT5tX2ludmFsaWRhdGVSZWdpb24pOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorICAgIGlmIChtX3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllcikgeworICAgICAgICBt
X3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIGludmFsaWRhdGVXaW5kb3dsZXNzUGx1Z2luUmVj
dChyZWN0KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVjdChOUFJlY3QqIHJl
Y3QpCit7CisgICAgaWYgKCFyZWN0KSB7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBJbnRSZWN0IHIocmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0
LT5yaWdodCAtIHJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcCk7CisgICAgaW52
YWxpZGF0ZVJlY3Qocik7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aW52YWxpZGF0ZVJlZ2lvbihO
UFJlZ2lvbiByZWdpb24pCit7CisgICAgaW52YWxpZGF0ZSgpOworfQorCit2b2lkIFBsdWdpblZp
ZXc6OmZvcmNlUmVkcmF3KCkKK3sKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK2Jvb2wgUGx1Z2lu
Vmlldzo6cGxhdGZvcm1TdGFydCgpCit7CisgICAgQVNTRVJUKG1faXNTdGFydGVkKTsKKyAgICBB
U1NFUlQobV9zdGF0dXMgPT0gUGx1Z2luU3RhdHVzTG9hZGVkU3VjY2Vzc2Z1bGx5KTsKKworICAg
IG1fcHJpdmF0ZSA9IG5ldyBQbHVnaW5WaWV3UHJpdmF0ZSh0aGlzKTsKKworICAgIGlmIChtX3Bs
dWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0dmFsdWUpIHsKKyAgICAgICAgUGx1Z2luVmlldzo6c2V0
Q3VycmVudFBsdWdpblZpZXcodGhpcyk7CisgICAgICAgIEpTQzo6SlNMb2NrOjpEcm9wQWxsTG9j
a3MgZHJvcEFsbExvY2tzKEpTQzo6U2lsZW5jZUFzc2VydGlvbnNPbmx5KTsKKyAgICAgICAgc2V0
Q2FsbGluZ1BsdWdpbih0cnVlKTsKKyAgICAgICAgbV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPmdl
dHZhbHVlKG1faW5zdGFuY2UsIE5QUFZwbHVnaW5OZWVkc1hFbWJlZCwgJm1fbmVlZHNYRW1iZWQp
OworICAgICAgICBzZXRDYWxsaW5nUGx1Z2luKGZhbHNlKTsKKyAgICAgICAgUGx1Z2luVmlldzo6
c2V0Q3VycmVudFBsdWdpblZpZXcoMCk7CisgICAgfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorICAgIGlmIChtX3BhcmVudEZyYW1lLT5wYWdlKCktPmNocm9tZSgpLT5jbGll
bnQoKS0+YWxsb3dzQWNjZWxlcmF0ZWRDb21wb3NpdGluZygpCisgICAgICAgICYmIG1fcGFyZW50
RnJhbWUtPnBhZ2UoKS0+c2V0dGluZ3MoKQorICAgICAgICAmJiBtX3BhcmVudEZyYW1lLT5wYWdl
KCktPnNldHRpbmdzKCktPmFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFibGVkKCkpIHsKKyAgICAg
ICAgbV9wcml2YXRlLT5tX3BsYXRmb3JtTGF5ZXIgPSBQbHVnaW5MYXllcldlYktpdFRocmVhZDo6
Y3JlYXRlKHRoaXMpOworICAgICAgICAvLyBUcmlnZ2VyIGxheWVyIGNvbXB1dGF0aW9uIGluIFJl
bmRlckxheWVyQ29tcG9zaXRvcgorICAgICAgICBtX2VsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNh
bGMoU3ludGhldGljU3R5bGVDaGFuZ2UpOworICAgIH0KKyNlbmRpZgorCisgICAgbV9ucFdpbmRv
dy50eXBlID0gTlBXaW5kb3dUeXBlRHJhd2FibGU7CisgICAgbV9ucFdpbmRvdy53aW5kb3cgPSAw
OyAvLyBOb3QgdXNlZD8KKyAgICBtX25wV2luZG93LnggPSAwOworICAgIG1fbnBXaW5kb3cueSA9
IDA7CisgICAgbV9ucFdpbmRvdy53aWR0aCA9IFVOSU5JVF9DT09SRDsKKyAgICBtX25wV2luZG93
LmhlaWdodCA9IFVOSU5JVF9DT09SRDsKKyAgICBtX25wV2luZG93LndzX2luZm8gPSBuZXcgTlBT
ZXRXaW5kb3dDYWxsYmFja1N0cnVjdDsKKyAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3Qq
KW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21GYWN0b3IgPSAxLjsKKyAgICAoKE5QU2V0V2luZG93
Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPndpbmRvd0dyb3VwID0gMDsKKwor
ICAgIHNob3coKTsKKworICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0
PEZyYW1lVmlldyo+KHBhcmVudCgpKSkKKyAgICAgICAgaGFuZGxlT3JpZW50YXRpb25FdmVudChm
cmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPm9yaWVudGF0aW9u
KCkpOworCisgICAgaWYgKCEobV9wbHVnaW4tPnF1aXJrcygpLmNvbnRhaW5zKFBsdWdpblF1aXJr
RGVmZXJGaXJzdFNldFdpbmRvd0NhbGwpKSkgeworICAgICAgICB1cGRhdGVQbHVnaW5XaWRnZXQo
KTsKKyAgICAgICAgc2V0TlBXaW5kb3dJZk5lZWRlZCgpOworICAgIH0KKworICAgIHJldHVybiB0
cnVlOworfQorCit2b2lkIFBsdWdpblZpZXc6OnBsYXRmb3JtRGVzdHJveSgpCit7CisgICAgaWYg
KCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgd2lsbCB1bmxvY2sg
dGhlIGlkbGUgKGlmIHdlIGhhdmUgbG9ja2VkIGl0KS4KKyAgICBtX3ByaXZhdGUtPnByZXZlbnRJ
ZGxlKGZhbHNlKTsKKworICAgIC8vIFRoaXMgd2lsbCByZWxlYXNlIGFueSBrZWVwVmlzaWJsZVJl
Y3RzIGlmIHRoZXkgd2VyZSBzZXQuCisgICAgbV9wcml2YXRlLT5jbGVhclZpc2libGVSZWN0cygp
OworCisgICAgLy8gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHdlIHVucmVnaXN0ZXJlZCB0aGUgcGx1
Z2luLgorICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmll
dyo+KHBhcmVudCgpKSkgeworICAgICAgICBpZiAobV9wcml2YXRlLT5tX2lzQmFja2dyb3VuZFBs
YXlpbmcpCisgICAgICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdl
Q2xpZW50KCktPm9uUGx1Z2luU3RvcEJhY2tncm91bmRQbGF5KHRoaXMsIG1fcHJpdmF0ZS0+bV9w
bHVnaW5VbmlxdWVQcmVmaXguY19zdHIoKSk7CisKKyAgICAgICAgLy8gSWYgd2Ugd2VyZSBzdGls
bCBmdWxsc2NyZWVuLCBlbnN1cmUgd2Ugbm90aWZ5IGV2ZXJ5b25lIHdlJ3JlIG5vdC4KKyAgICAg
ICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAgICAgICAgICBmcmFtZVZpZXct
Pmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmRpZFBsdWdpbkV4aXRGdWxsU2Ny
ZWVuKHRoaXMsIG1fcHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19zdHIoKSk7CisKKyAg
ICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9vcmllbnRhdGlvbkxvY2tlZCkKKyAgICAgICAgICAgIGZy
YW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+dW5sb2NrT3JpZW50
YXRpb24oKTsKKworICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdl
Q2xpZW50KCktPnJlZ2lzdGVyUGx1Z2luKHRoaXMsIGZhbHNlIC8qc2hvdWxkUmVnaXN0ZXIqLyk7
CisgICAgfQorCisgICAgbV9wcml2YXRlLT5tX2lzQmFja2dyb3VuZFBsYXlpbmcgPSBmYWxzZTsK
KyAgICBtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuID0gZmFsc2U7CisKKyAgICBkZWxldGUgbV9w
cml2YXRlOworICAgIG1fcHJpdmF0ZSA9IDA7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFsdCgp
Cit7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6cmVzdGFydCgpCit7Cit9CisKK3ZvaWQgUGx1Z2lu
Vmlldzo6Z2V0V2luZG93SW5mbyhWZWN0b3I8UGx1Z2luV2luZG93SW5mbz4mIHdpbmRvd0xpc3Qp
Cit7CisgICAgaWYgKCFtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0dmFsdWUpCisgICAgICAg
IHJldHVybjsKKworICAgIHZvaWQqIHZhbFB0ciA9IDA7CisKKyAgICBQbHVnaW5WaWV3OjpzZXRD
dXJyZW50UGx1Z2luVmlldyh0aGlzKTsKKyAgICBKU0M6OkpTTG9jazo6RHJvcEFsbExvY2tzIGRy
b3BBbGxMb2NrcyhKU0M6OlNpbGVuY2VBc3NlcnRpb25zT25seSk7CisgICAgc2V0Q2FsbGluZ1Bs
dWdpbih0cnVlKTsKKyAgICBtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0dmFsdWUobV9pbnN0
YW5jZSwgTlBQVnBsdWdpblNjcmVlbldpbmRvdywgJnZhbFB0cik7CisgICAgc2V0Q2FsbGluZ1Bs
dWdpbihmYWxzZSk7CisgICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBsdWdpblZpZXcoMCk7CisK
KyAgICBpZiAoIXZhbFB0cikKKyAgICAgICAgcmV0dXJuOworCisgICAgTlBTY3JlZW5XaW5kb3dI
YW5kbGVzKiBzY3JlZW5XaW5IYW5kbGVzID0gKE5QU2NyZWVuV2luZG93SGFuZGxlcyopdmFsUHRy
OworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY3JlZW5XaW5IYW5kbGVzLT5udW1PZldpbmRv
d3M7IGkrKykgeworICAgICAgICBQbHVnaW5XaW5kb3dJbmZvIGluZm87CisgICAgICAgIGluZm8u
d2luZG93UHRyID0gc2NyZWVuV2luSGFuZGxlcy0+d2luZG93SGFuZGxlc1tpXTsKKworICAgICAg
ICBOUFJlY3QqIHJjID0gc2NyZWVuV2luSGFuZGxlcy0+d2luZG93UmVjdHNbaV07CisgICAgICAg
IGluZm8ud2luZG93UmVjdCA9IEludFJlY3QocmMtPmxlZnQsIHJjLT50b3AsIHJjLT5yaWdodCAt
IHJjLT5sZWZ0LCByYy0+Ym90dG9tIC0gcmMtPnRvcCk7CisKKyAgICAgICAgd2luZG93TGlzdC5h
cHBlbmQoaW5mbyk7CisgICAgfQorfQorCitCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OkJ1ZmZlciogUGx1Z2luVmlldzo6bG9ja0Zyb250QnVmZmVyRm9yUmVhZCgpIGNvbnN0Cit7Cisg
ICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGJ1ZmZlciA9CisgICAgICAgIG1fcHJpdmF0ZS0+
bG9ja1JlYWRGcm9udEJ1ZmZlckludGVybmFsKCk7CisKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAg
ICAgbV9wcml2YXRlLT51bmxvY2tSZWFkRnJvbnRCdWZmZXIoKTsKKworICAgIHJldHVybiBidWZm
ZXI7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6dW5sb2NrRnJvbnRCdWZmZXIoKSBjb25zdAorewor
ICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3ByaXZhdGUtPnVu
bG9ja1JlYWRGcm9udEJ1ZmZlcigpOworfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQorUGxhdGZvcm1MYXllciogUGx1Z2luVmlldzo6cGxhdGZvcm1MYXllcigpIGNvbnN0Cit7
CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIG1f
cHJpdmF0ZS0+bV9wbGF0Zm9ybUxheWVyLmdldCgpOworfQorI2VuZGlmCisKK0ludFJlY3QgUGx1
Z2luVmlldzo6ZW5zdXJlVmlzaWJsZVJlY3QoKQoreworICAgIGlmICghbV9wcml2YXRlKQorICAg
ICAgICByZXR1cm4gSW50UmVjdCgpOworCisgICAgcmV0dXJuIG1fcHJpdmF0ZS0+bV9rZWVwVmlz
aWJsZVJlY3Q7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0QmFja2dyb3VuZFBsYXkoYm9vbCB2
YWx1ZSkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYg
KG1fcHJpdmF0ZS0+bV9pc0JhY2tncm91bmRQbGF5aW5nICE9IHZhbHVlKSB7CisgICAgICAgIEZy
YW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV9wcml2YXRlLT5t
X3ZpZXctPnBhcmVudCgpKTsKKyAgICAgICAgbV9wcml2YXRlLT5tX2lzQmFja2dyb3VuZFBsYXlp
bmcgPSB2YWx1ZTsKKyAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0JhY2tncm91bmRQbGF5aW5n
KQorICAgICAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVu
dCgpLT5vblBsdWdpblN0YXJ0QmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2YXRlLT5tX3BsdWdp
blVuaXF1ZVByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnJhbWVW
aWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5vblBsdWdpblN0b3BCYWNr
Z3JvdW5kUGxheSh0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkp
OworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisvLyAtLS0tLS0tCisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116868</attachid>
            <date>2011-11-28 19:11:49 -0800</date>
            <delta_ts>2011-11-28 20:46:42 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73185-20111129111239.patch</filename>
            <type>text/plain</type>
            <size>80576</size>
            <attacher name="Charles Wei">charles.wei</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwMTMxNikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEyMyBAQAorMjAxMS0xMS0yOCAgV2VpIENo
YXJsZXMgIDxjaGFybGVzLndlaUB0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgW2JsYWNr
YmVycnldIFVwc3RyZWFtIEJsYWNrQmVycnkgcG9ydGluZyBvZiBwbHVnaW4gZnJhbWV3b3JrCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MzE4NQorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgcGF0Y2gg
aXMgdG8gdXBzdHJlYW0gQmxhY2tCZXJyeSBwb3J0aW5nIG9mIFBsdWdpbiBmcmFtZXdvcmsuCisg
ICAgICAgIEJsYWNrQmVycnkgcG9ydGluZyBvZiBwbHVnaW4gaGFzIHRoZSBmb2xsb3dpbmcgbWFp
biBjb250cmlidXRvcnM6CisKKyAgICAgICAgTmljayBSZXRlbGxlICAgIDxucmF0ZWxsZUByaW0u
Y29tPgorICAgICAgICBKYWNvYiBQZXRzb3ZpdHMgPGpwZXRzb3ZpdHNAcmltLmNvbT4KKyAgICAg
ICAgQWRhbSBUcmVhdCAgICAgIDxhdHJlYXRAcmltLmNvbT4KKyAgICAgICAgR2VuZXZpZXZlIE1h
cmsgIDxnbWFrQHJpbS5jb20+CisgICAgICAgIEdlb3JnZSBTdGFpa29zICA8Z3N0YWlrb3NAcmlt
LmNvbT4KKyAgICAgICAgTWlrZSBGZW50b24gICAgIDxtaWZlbnRvbkByaW0uY29tPgorICAgICAg
ICBBcnZpZCBOaWxzc29uICAgPGFuaWxzb25AcmltLmNvbT4KKyAgICAgICAgUm9iaW4gQ2FvICAg
ICAgIDxyb2Jpbi5jYW9AdG9yY2htb2JpbGUuY29tLmNuPgorCisgICAgICAgIE5vIG5ldyB0ZXN0
IGNhc2VzIGZvciBub3cuCisKKyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnk6IEFkZGVkLgor
ICAgICAgICAqIHBsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5EYXRhQmxhY2tCZXJyeS5jcHA6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luRGF0YTo6aW5pdFBsdWdpbnMpOgorICAgICAg
ICAoV2ViQ29yZTo6UGx1Z2luRGF0YTo6cmVmcmVzaCk6CisgICAgICAgICogcGx1Z2lucy9ibGFj
a2JlcnJ5L1BsdWdpblBhY2thZ2VCbGFja0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpucG5NZW1GcmVlKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblBhY2thZ2U6OmVxdWFs
KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblBhY2thZ2U6OmZldGNoSW5mbyk6CisgICAgICAg
IChXZWJDb3JlOjpQbHVnaW5QYWNrYWdlOjpzaXRlc1dpdGhEYXRhKToKKyAgICAgICAgKFdlYkNv
cmU6OlBsdWdpblBhY2thZ2U6OmNsZWFyU2l0ZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6UGx1
Z2luUGFja2FnZTo6dHJ5R2V0U2l0ZXNXaXRoRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpQbHVn
aW5QYWNrYWdlOjp0cnlDbGVhclNpdGVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblBh
Y2thZ2U6Omhhc2gpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luUGFja2FnZTo6bG9hZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpQbHVnaW5QYWNrYWdlOjpOUFZlcnNpb24pOgorICAgICAgICAqIHBs
dWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5WaWV3QmxhY2tCZXJyeS5jcHA6IEFkZGVkLgorICAgICAg
ICAoUHRocmVhZE11dGV4TG9ja2VyOjpQdGhyZWFkTXV0ZXhMb2NrZXIpOgorICAgICAgICAoUHRo
cmVhZE11dGV4TG9ja2VyOjp+UHRocmVhZE11dGV4TG9ja2VyKToKKyAgICAgICAgKFB0aHJlYWRS
ZWFkTG9ja2VyOjpQdGhyZWFkUmVhZExvY2tlcik6CisgICAgICAgIChQdGhyZWFkUmVhZExvY2tl
cjo6flB0aHJlYWRSZWFkTG9ja2VyKToKKyAgICAgICAgKFB0aHJlYWRXcml0ZUxvY2tlcjo6UHRo
cmVhZFdyaXRlTG9ja2VyKToKKyAgICAgICAgKFB0aHJlYWRXcml0ZUxvY2tlcjo6flB0aHJlYWRX
cml0ZUxvY2tlcik6CisgICAgICAgIChucFNldEhvbGVQdW5jaEhhbmRsZXIpOgorICAgICAgICAo
V2ViQ29yZTo6dG9OUFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGU6
OlBsdWdpblZpZXdQcml2YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRl
Ojp+UGx1Z2luVmlld1ByaXZhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZh
dGU6OnRvQnVmZmVyVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6
c2V0Wm9vbUZhY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6c2V0
VmlzaWJsZVJlY3RzKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlOjpjbGVh
clZpc2libGVSZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6c2hv
d0tleWJvYXJkKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlOjpyZXF1ZXN0
RnVsbFNjcmVlbik6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6ZXhpdEZ1
bGxTY3JlZW4pOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGU6OnJlcXVlc3RD
ZW50ZXJGaXRab29tKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlOjpsb2Nr
T3JpZW50YXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGU6OnVubG9j
a09yaWVudGF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlOjpwcmV2
ZW50SWRsZSk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6c2V0SG9sZVB1
bmNoKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlOjpsb2NrQmFja0J1ZmZl
cik6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6dW5sb2NrQmFja0J1ZmZl
cik6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZTo6bG9ja1JlYWRGcm9udEJ1
ZmZlckludGVybmFsKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlOjpsb2Nr
UmVhZEZyb250QnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlOjp1
bmxvY2tSZWFkRnJvbnRCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZh
dGU6OnN3YXBCdWZmZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlOjpj
cmVhdGVCdWZmZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlOjpyZXNp
emVCdWZmZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlOjpkZXN0cm95
QnVmZmVycyk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3Ojp1cGRhdGVQbHVnaW5XaWRn
ZXQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6c2V0Rm9jdXMpOgorICAgICAgICAo
V2ViQ29yZTo6UGx1Z2luVmlldzo6c2hvdyk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3
OjpoaWRlKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OnVwZGF0ZUJ1ZmZlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpwYWludCk6CisgICAgICAgIChXZWJDb3JlOjpQ
bHVnaW5WaWV3OjpkaXNwYXRjaEZ1bGxTY3JlZW5OUEV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6
OlBsdWdpblZpZXc6OmRpc3BhdGNoTlBFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5W
aWV3OjpoYW5kbGVLZXlib2FyZEV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6
OmhhbmRsZVdoZWVsRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6aGFuZGxl
VG91Y2hFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpoYW5kbGVNb3VzZUV2
ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmhhbmRsZUZvY3VzSW5FdmVudCk6
CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpoYW5kbGVGb2N1c091dEV2ZW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmhhbmRsZVBhdXNlRXZlbnQpOgorICAgICAgICAo
V2ViQ29yZTo6UGx1Z2luVmlldzo6aGFuZGxlUmVzdW1lRXZlbnQpOgorICAgICAgICAoV2ViQ29y
ZTo6UGx1Z2luVmlldzo6aGFuZGxlU2Nyb2xsRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1
Z2luVmlldzo6Y2FsY3VsYXRlQ2xpcFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmll
dzo6aGFuZGxlT25Mb2FkRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6aGFu
ZGxlRnJlZU1lbW9yeUV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmhhbmRs
ZUJhY2tncm91bmRFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpoYW5kbGVG
b3JlZ3JvdW5kRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6aGFuZGxlRnVs
bFNjcmVlbkFsbG93ZWRFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpoYW5k
bGVGdWxsU2NyZWVuRXhpdEV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6Omhh
bmRsZUlkbGVFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpoYW5kbGVBcHBB
Y3RpdmF0ZWRFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpoYW5kbGVBcHBE
ZWFjdGl2YXRlZEV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmhhbmRsZUFw
cFN0YW5kYnlFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpoYW5kbGVPcmll
bnRhdGlvbkV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmhhbmRsZVN3aXBl
RXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6aGFuZGxlU2NyZWVuUG93ZXJF
dmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpzZXRQYXJlbnQpOgorICAgICAg
ICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6c2V0TlBXaW5kb3dSZWN0KToKKyAgICAgICAgKFdlYkNv
cmU6OlBsdWdpblZpZXc6OnNldE5QV2luZG93SWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6
UGx1Z2luVmlldzo6c2V0UGFyZW50VmlzaWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5W
aWV3OjpoYW5kbGVQb3N0UmVhZEZpbGUpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6
cGxhdGZvcm1HZXRWYWx1ZVN0YXRpYyk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3Ojpw
bGF0Zm9ybUdldFZhbHVlKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmludmFsaWRh
dGVSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmludmFsaWRhdGVSZWdpb24p
OgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmlldzo6Zm9yY2VSZWRyYXcpOgorICAgICAgICAo
V2ViQ29yZTo6UGx1Z2luVmlldzo6cGxhdGZvcm1TdGFydCk6CisgICAgICAgIChXZWJDb3JlOjpQ
bHVnaW5WaWV3OjpwbGF0Zm9ybURlc3Ryb3kpOgorICAgICAgICAoV2ViQ29yZTo6UGx1Z2luVmll
dzo6aGFsdCk6CisgICAgICAgIChXZWJDb3JlOjpQbHVnaW5WaWV3OjpyZXN0YXJ0KToKKyAgICAg
ICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmdldFdpbmRvd0luZm8pOgorICAgICAgICAoV2ViQ29y
ZTo6UGx1Z2luVmlldzo6bG9ja0Zyb250QnVmZmVyRm9yUmVhZCk6CisgICAgICAgIChXZWJDb3Jl
OjpQbHVnaW5WaWV3Ojp1bmxvY2tGcm9udEJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpQbHVn
aW5WaWV3OjpwbGF0Zm9ybUxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OmVu
c3VyZVZpc2libGVSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlBsdWdpblZpZXc6OnNldEJhY2tn
cm91bmRQbGF5KToKKwogMjAxMS0xMS0yOCAgVGltb3RoeSBIYXRjaGVyICA8dGltb3RoeUBhcHBs
ZS5jb20+CiAKICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIGtub3dpbmcgd2hlbiBhIFRyZWVFbGVt
ZW50IGlzIGFkZGVkIG9yIGNoYW5nZWQgYW55d2hlcmUgaW4gYSBUcmVlT3V0bGluZS4KSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5EYXRhQmxhY2tCZXJyeS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1BsdWdp
bkRhdGFCbGFja0JlcnJ5LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsdWdp
bnMvYmxhY2tiZXJyeS9QbHVnaW5EYXRhQmxhY2tCZXJyeS5jcHAJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9u
IExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
CisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExl
c3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0
byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBsdWdpbkRhdGEuaCIKKworI2luY2x1ZGUgIlBs
dWdpbkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiUGx1Z2luUGFja2FnZS5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK3ZvaWQgUGx1Z2luRGF0YTo6aW5pdFBsdWdpbnMoY29uc3QgUGFnZSopCit7
CisgICAgUGx1Z2luRGF0YWJhc2UqIGRiID0gUGx1Z2luRGF0YWJhc2U6Omluc3RhbGxlZFBsdWdp
bnMoKTsKKyAgICBjb25zdCBWZWN0b3I8UGx1Z2luUGFja2FnZSo+JiBwbHVnaW5zID0gZGItPnBs
dWdpbnMoKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBwbHVnaW5zLnNpemUoKTsg
KytpKSB7CisgICAgICAgIFBsdWdpblBhY2thZ2UqIHBhY2thZ2UgPSBwbHVnaW5zW2ldOworCisg
ICAgICAgIFBsdWdpbkluZm8gaW5mbzsKKyAgICAgICAgaW5mby5uYW1lID0gcGFja2FnZS0+bmFt
ZSgpOworICAgICAgICBpbmZvLmZpbGUgPSBwYWNrYWdlLT5maWxlTmFtZSgpOworICAgICAgICBp
bmZvLmRlc2MgPSBwYWNrYWdlLT5kZXNjcmlwdGlvbigpOworCisgICAgICAgIGNvbnN0IE1JTUVU
b0Rlc2NyaXB0aW9uc01hcCYgbWltZVRvRGVzY3JpcHRpb25zID0gcGFja2FnZS0+bWltZVRvRGVz
Y3JpcHRpb25zKCk7CisgICAgICAgIE1JTUVUb0Rlc2NyaXB0aW9uc01hcDo6Y29uc3RfaXRlcmF0
b3IgZW5kID0gbWltZVRvRGVzY3JpcHRpb25zLmVuZCgpOworICAgICAgICBmb3IgKE1JTUVUb0Rl
c2NyaXB0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtaW1lVG9EZXNjcmlwdGlvbnMuYmVn
aW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICBNaW1lQ2xhc3NJbmZvIG1pbWU7
CisKKyAgICAgICAgICAgIG1pbWUudHlwZSA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIG1pbWUu
ZGVzYyA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICBtaW1lLmV4dGVuc2lvbnMgPSBwYWNrYWdl
LT5taW1lVG9FeHRlbnNpb25zKCkuZ2V0KG1pbWUudHlwZSk7CisKKyAgICAgICAgICAgIGluZm8u
bWltZXMuYXBwZW5kKG1pbWUpOworICAgICAgICB9CisKKyAgICAgICAgbV9wbHVnaW5zLmFwcGVu
ZChpbmZvKTsKKyAgICB9CisKK30KKwordm9pZCBQbHVnaW5EYXRhOjpyZWZyZXNoKCkKK3sKKyAg
ICBQbHVnaW5EYXRhYmFzZSogZGIgPSBQbHVnaW5EYXRhYmFzZTo6aW5zdGFsbGVkUGx1Z2lucygp
OworICAgIGRiLT5yZWZyZXNoKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5QYWNrYWdlQmxhY2tCZXJy
eS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1Bs
dWdpblBhY2thZ2VCbGFja0JlcnJ5LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3Jl
L3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5QYWNrYWdlQmxhY2tCZXJyeS5jcHAJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFw
cGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29s
bGFib3JhIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBS
ZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBsdWdpblBhY2thZ2UuaCIKKworI2luY2x1
ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2lu
Y2x1ZGUgIlBsdWdpbkRlYnVnLmgiCisjaW5jbHVkZSAibnBydW50aW1lX2ltcGwuaCIKKworI2lu
Y2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4K
KyNpbmNsdWRlIDx3dGYvU3RyaW5nSGFzaGVyLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmlu
Zy5oPgorCitleHRlcm4gaW50IGVycm5vOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQg
bnBuTWVtRnJlZSh2b2lkKiBwdHIpCit7CisgICAgLy8gV2UgY291bGQgdXNlIGZhc3RGcmVlIGhl
cmUsIGJ1dCB0aGVyZSBtaWdodCBiZSBwbHVnLWlucyB0aGF0IG1peCBOUE5fTWVtQWxsb2MvTlBO
X01lbUZyZWUgd2l0aCBtYWxsb2MgYW5kIGZyZWUsCisgICAgLy8gc28gaGF2aW5nIHRoZW0gYmUg
ZXF1aXZhbGVudCBzZWVtcyBsaWtlIGEgZ29vZCBpZGVhLgorICAgIGZyZWUocHRyKTsKK30KKwor
Ym9vbCBQbHVnaW5QYWNrYWdlOjplcXVhbChQbHVnaW5QYWNrYWdlIGNvbnN0JiBhLCBQbHVnaW5Q
YWNrYWdlIGNvbnN0JiBiKQoreworICAgIGlmIChhLm1fbmFtZSAhPSBiLm1fbmFtZSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGEubV9kZXNjcmlwdGlvbiAhPSBiLm1fZGVzY3Jp
cHRpb24pCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChhLm1fbWltZVRvRXh0ZW5z
aW9ucy5zaXplKCkgIT0gYi5tX21pbWVUb0V4dGVuc2lvbnMuc2l6ZSgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBNSU1FVG9FeHRlbnNpb25zTWFwOjpjb25zdF9pdGVyYXRvcjo6S2V5
cyBlbmQgPSBhLm1fbWltZVRvRXh0ZW5zaW9ucy5lbmQoKS5rZXlzKCk7CisgICAgZm9yIChNSU1F
VG9FeHRlbnNpb25zTWFwOjpjb25zdF9pdGVyYXRvcjo6S2V5cyBpdCA9IGEubV9taW1lVG9FeHRl
bnNpb25zLmJlZ2luKCkua2V5cygpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgaWYgKCFi
Lm1fbWltZVRvRXh0ZW5zaW9ucy5jb250YWlucygqaXQpKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFBsdWdpblBhY2thZ2U6
OmZldGNoSW5mbygpCit7CisgICAgaWYgKCFsb2FkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIC8vIEZJWE1FOiBGaW5kIGEgYmV0dGVyIHdheSB0byBnZXQgYXJvdW5kIHRoZSBmZXRj
aGluZm8gbG9hZC4KKyAgICAvLyBXZSBhcmUgZmV0Y2hpbmcgdGhlIGluZm8uIFRlY2huaWNhbGx5
IHdlIGhhdmUgbm90IGxvYWRlZCB0aGUgcGx1Z2luLiBQbHVnaW5WaWV3OjpJbml0IHdpbGwgbG9h
ZCB0aGUgcGx1Z2luIHNvIGRlY3JlbWVudCB0aGUgY291bnRlcgorICAgIG1fbG9hZENvdW50LS07
CisKKyAgICB0eXBlZGVmIGNoYXIgKigqTlBQX0dldE1JTUVEZXNjcmlwdGlvblByb2NQdHIpKCk7
CisgICAgTlBQX0dldE1JTUVEZXNjcmlwdGlvblByb2NQdHIgZ20gPSAoTlBQX0dldE1JTUVEZXNj
cmlwdGlvblByb2NQdHIpIGRsc3ltKG1fbW9kdWxlLCAiTlBfR2V0TUlNRURlc2NyaXB0aW9uIik7
CisgICAgTlBQX0dldFZhbHVlUHJvY1B0ciBndiA9IChOUFBfR2V0VmFsdWVQcm9jUHRyKSBkbHN5
bShtX21vZHVsZSwgIk5QX0dldFZhbHVlIik7CisKKyAgICBpZiAoIWdtIHx8ICFndikKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgY2hhciogYnVmID0gMDsKKyAgICBOUEVycm9yIGVyciA9
IGd2KDAsIE5QUFZwbHVnaW5OYW1lU3RyaW5nLCAodm9pZCAqKSAmYnVmKTsKKyAgICBpZiAoZXJy
ICE9IE5QRVJSX05PX0VSUk9SKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtX25hbWUg
PSBidWY7CisKKyAgICBlcnIgPSBndigwLCBOUFBWcGx1Z2luRGVzY3JpcHRpb25TdHJpbmcsICh2
b2lkICopICZidWYpOworICAgIGlmIChlcnIgIT0gTlBFUlJfTk9fRVJST1IpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIG1fZGVzY3JpcHRpb24gPSBidWY7CisgICAgZGV0ZXJtaW5lTW9k
dWxlVmVyc2lvbkZyb21EZXNjcmlwdGlvbigpOworCisgICAgU3RyaW5nIHMgPSBnbSgpOworICAg
IFZlY3RvcjxTdHJpbmc+IHR5cGVzOworICAgIHMuc3BsaXQoVUNoYXIoJzsnKSwgZmFsc2UsIHR5
cGVzKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdHlwZXMuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgVmVjdG9yPFN0cmluZz4gbWltZTsKKyAgICAgICAgdHlwZXNbaV0uc3BsaXQoVUNo
YXIoJzonKSwgdHJ1ZSwgbWltZSk7CisgICAgICAgIGlmIChtaW1lLnNpemUoKSA+IDApIHsKKyAg
ICAgICAgICAgIFZlY3RvcjxTdHJpbmc+IGV4dHM7CisgICAgICAgICAgICBpZiAobWltZS5zaXpl
KCkgPiAxKQorICAgICAgICAgICAgICAgIG1pbWVbMV0uc3BsaXQoVUNoYXIoJywnKSwgZmFsc2Us
IGV4dHMpOworICAgICAgICAgICAgZGV0ZXJtaW5lUXVpcmtzKG1pbWVbMF0pOworICAgICAgICAg
ICAgbV9taW1lVG9FeHRlbnNpb25zLmFkZChtaW1lWzBdLCBleHRzKTsKKyAgICAgICAgICAgIGlm
IChtaW1lLnNpemUoKSA+IDIpCisgICAgICAgICAgICAgICAgbV9taW1lVG9EZXNjcmlwdGlvbnMu
YWRkKG1pbWVbMF0sIG1pbWVbMl0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK1ZlY3RvcjxTdHJpbmc+IFBsdWdpblBhY2thZ2U6OnNpdGVzV2l0aERhdGEoKQor
eworICAgIFZlY3RvcjxTdHJpbmc+IHNpdGVzOworICAgIHRyeUdldFNpdGVzV2l0aERhdGEoc2l0
ZXMpOworCisgICAgcmV0dXJuIHNpdGVzOworfQorCitib29sIFBsdWdpblBhY2thZ2U6OmNsZWFy
U2l0ZURhdGEoY29uc3QgU3RyaW5nJiBzaXRlLCB1aW50NjRfdCBmbGFncywgdWludDY0X3QgbWF4
QWdlKQoreworICAgIGJvb2wgcmVzdWx0ID0gdHJ5Q2xlYXJTaXRlRGF0YShzaXRlLCBmbGFncywg
bWF4QWdlKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgUGx1Z2luUGFja2FnZTo6
dHJ5R2V0U2l0ZXNXaXRoRGF0YShWZWN0b3I8U3RyaW5nPiYgc2l0ZXMpCit7CisgICAgaWYgKCFs
b2FkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEZJWE1FOiBGaW5kIGEgYmV0
dGVyIHdheSB0byBlbnN1cmUgdGhlIHBsdWdpbiBpcyBsb2FkZWQuCisgICAgLy8gUGx1Z2luVmll
dzo6SW5pdCB3aWxsIGxvYWQgdGhlIHBsdWdpbiBzbyBkZWNyZW1lbnQgdGhlIGNvdW50ZXIKKyAg
ICBtX2xvYWRDb3VudC0tOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWctaW4gc3VwcG9ydHMg
TlBQX0dldFNpdGVzV2l0aERhdGEuCisgICAgaWYgKCFtX3BsdWdpbkZ1bmNzLmdldHNpdGVzd2l0
aGRhdGEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNoYXIqKiBzaXRlQXJyYXkgPSBt
X3BsdWdpbkZ1bmNzLmdldHNpdGVzd2l0aGRhdGEoKTsKKworICAgIC8vIFRoZXJlIHdlcmUgbm8g
c2l0ZXMgd2l0aCBkYXRhLgorICAgIGlmICghc2l0ZUFycmF5KQorICAgICAgICByZXR1cm4gdHJ1
ZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBzaXRlQXJyYXlbaV07ICsraSkgeworICAgICAgICBj
aGFyKiBzaXRlID0gc2l0ZUFycmF5W2ldOworCisgICAgICAgIFN0cmluZyBzaXRlU3RyaW5nID0g
U3RyaW5nOjpmcm9tVVRGOChzaXRlKTsKKyAgICAgICAgaWYgKCFzaXRlU3RyaW5nLmlzTnVsbCgp
KQorICAgICAgICAgICAgc2l0ZXMuYXBwZW5kKHNpdGVTdHJpbmcpOworCisgICAgICAgIG5wbk1l
bUZyZWUoc2l0ZSk7CisgICAgfQorCisgICAgbnBuTWVtRnJlZShzaXRlQXJyYXkpOworICAgIHJl
dHVybiB0cnVlOworfQorCitib29sIFBsdWdpblBhY2thZ2U6OnRyeUNsZWFyU2l0ZURhdGEoY29u
c3QgU3RyaW5nJiBzaXRlLCB1aW50NjRfdCBmbGFncywgdWludDY0X3QgbWF4QWdlKQoreworICAg
IGlmICghbG9hZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTogRmlu
ZCBhIGJldHRlciB3YXkgdG8gZW5zdXJlIHRoZSBwbHVnaW4gaXMgbG9hZGVkLgorICAgIC8vIFBs
dWdpblZpZXc6OkluaXQgd2lsbCBsb2FkIHRoZSBwbHVnaW4gc28gZGVjcmVtZW50IHRoZSBjb3Vu
dGVyCisgICAgbV9sb2FkQ291bnQtLTsKKworICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnLWluIHN1
cHBvcnRzIE5QUF9DbGVhclNpdGVEYXRhLgorICAgIGlmICghbV9wbHVnaW5GdW5jcy5jbGVhcnNp
dGVkYXRhKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBDU3RyaW5nIHNpdGVTdHJpbmc7
CisgICAgaWYgKCFzaXRlLmlzTnVsbCgpKQorICAgICAgICBzaXRlU3RyaW5nID0gc2l0ZS51dGY4
KCk7CisKKyAgICByZXR1cm4gbV9wbHVnaW5GdW5jcy5jbGVhcnNpdGVkYXRhKHNpdGVTdHJpbmcu
ZGF0YSgpLCBmbGFncywgbWF4QWdlKSA9PSBOUEVSUl9OT19FUlJPUjsKK30KKwordW5zaWduZWQg
UGx1Z2luUGFja2FnZTo6aGFzaCgpIGNvbnN0Cit7CisgICAgY29uc3QgdW5zaWduZWQgaGFzaENv
ZGVzW10gPSB7CisgICAgICAgIG1fbmFtZS5pbXBsKCktPmhhc2goKSwKKyAgICAgICAgbV9kZXNj
cmlwdGlvbi5pbXBsKCktPmhhc2goKSwKKyAgICAgICAgbV9taW1lVG9FeHRlbnNpb25zLnNpemUo
KQorICAgIH07CisKKyAgICByZXR1cm4gU3RyaW5nSGFzaGVyOjpjb21wdXRlSGFzaChyZWludGVy
cHJldF9jYXN0PGNvbnN0IFVDaGFyKj4oaGFzaENvZGVzKSwgc2l6ZW9mKGhhc2hDb2RlcykgLyBz
aXplb2YoVUNoYXIpKTsKK30KKworYm9vbCBQbHVnaW5QYWNrYWdlOjpsb2FkKCkKK3sKKyAgICBp
ZiAobV9pc0xvYWRlZCkgeworICAgICAgICBtX2xvYWRDb3VudCsrOworICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobV9mcmVlTGlicmFyeVRpbWVyLmlzQWN0aXZlKCkpIHsK
KyAgICAgICAgQVNTRVJUKG1fbW9kdWxlKTsKKyAgICAgICAgbV9mcmVlTGlicmFyeVRpbWVyLnN0
b3AoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlQoIW1fbG9hZENvdW50KTsKKyAgICAg
ICAgbV9tb2R1bGUgPSBkbG9wZW4obV9wYXRoLnV0ZjgoKS5kYXRhKCksIFJUTERfTEFaWSk7Cisg
ICAgfQorCisgICAgaWYgKCFtX21vZHVsZSkgeworICAgICAgICBMT0coUGx1Z2lucywgIiVzIG5v
dCBsb2FkZWQgKCVzKSIsIG1fcGF0aC51dGY4KCkuZGF0YSgpLCBzdHJlcnJvcihlcnJubykpOwor
ICAgICAgICBwcmludGYoIlBsdWdpblBhY2thZ2U6OmxvYWQoKSAtICVzIG5vdCBsb2FkZWQgKCVz
KSIsIG1fcGF0aC51dGY4KCkuZGF0YSgpLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9pc0xvYWRlZCA9IHRydWU7CisKKyAgICBOUF9Jbml0
aWFsaXplRnVuY1B0ciBOUF9Jbml0aWFsaXplOworICAgIE5QRXJyb3IgbnBFcnI7CisKKyAgICBO
UF9Jbml0aWFsaXplID0gKE5QX0luaXRpYWxpemVGdW5jUHRyKWRsc3ltKG1fbW9kdWxlLCAiTlBf
SW5pdGlhbGl6ZSIpOworICAgIG1fTlBQX1NodXRkb3duID0gKE5QUF9TaHV0ZG93blByb2NQdHIp
ZGxzeW0obV9tb2R1bGUsICJOUF9TaHV0ZG93biIpOworCisgICAgaWYgKCFOUF9Jbml0aWFsaXpl
IHx8ICFtX05QUF9TaHV0ZG93bikKKyAgICAgICAgZ290byBhYm9ydDsKKworICAgIG1lbXNldCgm
bV9wbHVnaW5GdW5jcywgMCwgc2l6ZW9mKG1fcGx1Z2luRnVuY3MpKTsKKyAgICBtX3BsdWdpbkZ1
bmNzLnNpemUgPSBzaXplb2YobV9wbHVnaW5GdW5jcyk7CisKKyAgICBpbml0aWFsaXplQnJvd3Nl
ckZ1bmNzKCk7CisKKyAgICBucEVyciA9IE5QX0luaXRpYWxpemUoJm1fYnJvd3NlckZ1bmNzLCAg
Jm1fcGx1Z2luRnVuY3MpOworCisgICAgaWYgKG5wRXJyICE9IE5QRVJSX05PX0VSUk9SKQorICAg
ICAgICBnb3RvIGFib3J0OworCisgICAgbV9sb2FkQ291bnQgPSAxOworICAgIHJldHVybiB0cnVl
OworCithYm9ydDoKKyAgICB1bmxvYWRXaXRob3V0U2h1dGRvd24oKTsKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKKyNpZiBFTkFCTEUoTkVUU0NBUEVfUExVR0lOX0FQSSkKK3VpbnQxNl90IFBsdWdp
blBhY2thZ2U6Ok5QVmVyc2lvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIE5QVkVSU19IQVNfUExV
R0lOX1RIUkVBRF9BU1lOQ19DQUxMOworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5WaWV3Qmxh
Y2tCZXJyeS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFja2Jl
cnJ5L1BsdWdpblZpZXdCbGFja0JlcnJ5LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5WaWV3QmxhY2tCZXJyeS5jcHAJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsMTk5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBB
cHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4IENv
bGxhYm9yYSBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkg
R2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRiaWFzLmluPgorICogQ29weXJpZ2h0
IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09N
UFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGx1Z2luVmlldy5oIgor
CisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5j
bHVkZSAiRXZlbnQuaCIKKyNpbmNsdWRlICJFdmVudE5hbWVzLmgiCisjaW5jbHVkZSAiRnJhbWUu
aCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
KyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJIVE1MUGx1Z0luRWxlbWVudC5oIgor
I2luY2x1ZGUgIkhvc3RXaW5kb3cuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIkpT
RE9NQmluZGluZy5oIgorI2luY2x1ZGUgIktleWJvYXJkRXZlbnQuaCIKKyNpbmNsdWRlICJNb3Vz
ZUV2ZW50LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgi
CisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtS2V5
Ym9hcmRFdmVudC5oIgorI2luY2x1ZGUgIlBsdWdpbkRlYnVnLmgiCisjaW5jbHVkZSAiUGx1Z2lu
TWFpblRocmVhZFNjaGVkdWxlci5oIgorI2luY2x1ZGUgIlBsdWdpblBhY2thZ2UuaCIKKyNpbmNs
dWRlICJSZW5kZXJMYXllci5oIgorI2luY2x1ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiVG91
Y2guaCIKKyNpbmNsdWRlICJUb3VjaEV2ZW50LmgiCisjaW5jbHVkZSAiVG91Y2hMaXN0LmgiCisj
aW5jbHVkZSAiV2hlZWxFdmVudC5oIgorI2luY2x1ZGUgIm5wcnVudGltZV9pbXBsLmgiCisjaW5j
bHVkZSAicnVudGltZV9yb290LmgiCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtV2luZG93
Lmg+CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisjaW5jbHVkZSAiQ2hyb21l
LmgiCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50LmgiCisjaW5jbHVkZSAiUGx1Z2luTGF5ZXJXZWJL
aXRUaHJlYWQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtR3JhcGhp
Y3MuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1JbnRSZWN0UmVnaW9uLmg+CisjaW5j
bHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtUHJpbWl0aXZlcy5oPgorCisjaW5jbHVkZSA8cHRocmVh
ZC5oPgorI2luY2x1ZGUgPHJ1bnRpbWUvSlNMb2NrLmg+CisjaW5jbHVkZSA8cnVudGltZS9KU1Zh
bHVlLmg+CisjaW5jbHVkZSA8c3lzL2tleWNvZGVzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisj
ZGVmaW5lIFVOSU5JVF9DT09SRCAweGZmZmZmZmZmCisjZGVmaW5lIFBMVUdJTl9CVUZGRVJTIDIK
K3N0YXRpYyB1bnNpZ25lZCBzX2NvdW50ZXIgPSAwOworCitzdHJ1Y3QgUHRocmVhZE11dGV4TG9j
a2VyIHsKKyAgICBQdGhyZWFkTXV0ZXhMb2NrZXIocHRocmVhZF9tdXRleF90KiBtdXRleCkKKyAg
ICAgICAgOiBtX211dGV4KG11dGV4KQorICAgIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2Nr
KG1fbXV0ZXgpOworICAgIH0KKworICAgIH5QdGhyZWFkTXV0ZXhMb2NrZXIoKQorICAgIHsKKyAg
ICAgICAgcHRocmVhZF9tdXRleF91bmxvY2sobV9tdXRleCk7CisgICAgfQorCisgICAgcHRocmVh
ZF9tdXRleF90KiBtX211dGV4OworfTsKKworc3RydWN0IFB0aHJlYWRSZWFkTG9ja2VyIHsKKyAg
ICBQdGhyZWFkUmVhZExvY2tlcihwdGhyZWFkX3J3bG9ja190KiByd2xvY2spCisgICAgICAgIDog
bV9yd2xvY2socndsb2NrKQorICAgIHsKKyAgICAgICAgcHRocmVhZF9yd2xvY2tfcmRsb2NrKG1f
cndsb2NrKTsKKyAgICB9CisKKyAgICB+UHRocmVhZFJlYWRMb2NrZXIoKQorICAgIHsKKyAgICAg
ICAgcHRocmVhZF9yd2xvY2tfdW5sb2NrKG1fcndsb2NrKTsKKyAgICB9CisKKyAgICBwdGhyZWFk
X3J3bG9ja190KiBtX3J3bG9jazsKK307CisKK3N0cnVjdCBQdGhyZWFkV3JpdGVMb2NrZXIgewor
ICAgIFB0aHJlYWRXcml0ZUxvY2tlcihwdGhyZWFkX3J3bG9ja190KiByd2xvY2spCisgICAgICAg
IDogbV9yd2xvY2socndsb2NrKQorICAgIHsKKyAgICAgICAgcHRocmVhZF9yd2xvY2tfd3Jsb2Nr
KG1fcndsb2NrKTsKKyAgICB9CisKKyAgICB+UHRocmVhZFdyaXRlTG9ja2VyKCkKKyAgICB7Cisg
ICAgICAgIHB0aHJlYWRfcndsb2NrX3VubG9jayhtX3J3bG9jayk7CisgICAgfQorCisgICAgcHRo
cmVhZF9yd2xvY2tfdCogbV9yd2xvY2s7Cit9OworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorc3RydWN0IEhvbGVQdW5jaERhdGEgeworICAgIGludCB4LCB5OworICAgIGludCB3
LCBoOworICAgIFJlZlB0cjxXZWJDb3JlOjpQbGF0Zm9ybUxheWVyPiBsYXllcjsKK307CisKK3Zv
aWQgbnBTZXRIb2xlUHVuY2hIYW5kbGVyKHZvaWQqIGhvbGVQdW5jaERhdGEpCit7CisgICAgT3du
UHRyPEhvbGVQdW5jaERhdGE+IGRhdGEgPSBhZG9wdFB0cihzdGF0aWNfY2FzdDxIb2xlUHVuY2hE
YXRhKj4oaG9sZVB1bmNoRGF0YSkpOworICAgIGlmIChkYXRhLT5sYXllcikKKyAgICAgICAgZGF0
YS0+bGF5ZXItPnNldEhvbGVQdW5jaFJlY3QoV2ViQ29yZTo6SW50UmVjdChkYXRhLT54LCBkYXRh
LT55LCBkYXRhLT53LCBkYXRhLT5oKSk7Cit9CisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitzdGF0aWMgTlBSZWN0IHRvTlBSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAg
TlBSZWN0IG5wUmVjdDsKKyAgICBucFJlY3QudG9wID0gcmVjdC55KCk7CisgICAgbnBSZWN0Lmxl
ZnQgPSByZWN0LngoKTsKKyAgICBucFJlY3QuYm90dG9tID0gcmVjdC55KCkgKyByZWN0LmhlaWdo
dCgpOworICAgIG5wUmVjdC5yaWdodCA9IHJlY3QueCgpICsgcmVjdC53aWR0aCgpOworICAgIHJl
dHVybiBucFJlY3Q7Cit9CisKK3N0YXRpYyBOUFJlY3QgdG9OUFJlY3QoY29uc3QgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkludFJlY3QmIHJlY3QpCit7CisgICAgTlBSZWN0IG5wUmVjdDsKKyAgICBu
cFJlY3QudG9wID0gcmVjdC55KCk7CisgICAgbnBSZWN0LmxlZnQgPSByZWN0LngoKTsKKyAgICBu
cFJlY3QuYm90dG9tID0gcmVjdC55KCkgKyByZWN0LmhlaWdodCgpOworICAgIG5wUmVjdC5yaWdo
dCA9IHJlY3QueCgpICsgcmVjdC53aWR0aCgpOworICAgIHJldHVybiBucFJlY3Q7Cit9CisKK2Ns
YXNzIFBsdWdpblZpZXdQcml2YXRlIHsKK3B1YmxpYzoKKyAgICBQbHVnaW5WaWV3KiBtX3ZpZXc7
CisKK3B1YmxpYzoKKyAgICBwdGhyZWFkX211dGV4X3QgbV9iYWNrQnVmZmVyTXV0ZXg7CisgICAg
cHRocmVhZF9yd2xvY2tfdCBtX2Zyb250QnVmZmVyUndMb2NrOworCisgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIG1fcGx1Z2luQnVmZmVyc1tQTFVHSU5fQlVGRkVS
U107CisgICAgSW50U2l6ZSBtX3BsdWdpbkJ1ZmZlclNpemU7CisgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OkdyYXBoaWNzOjpCdWZmZXJUeXBlIG1fcGx1Z2luQnVmZmVyVHlwZTsKKyAgICBpbnQg
bV9wbHVnaW5Gcm9udEJ1ZmZlcjsKKworICAgIEludFJlY3QgbV9ob2xlUHVuY2hSZWN0OworICAg
IEludFJlY3QgbV9rZWVwVmlzaWJsZVJlY3Q7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisgICAgUmVmUHRyPFBsYXRmb3JtTGF5ZXI+IG1fcGxhdGZvcm1MYXllcjsKKyNlbmRp
ZgorCisgICAgYm9vbCBtX2lkbGVQcmV2ZW50ZWQ7CisgICAgYm9vbCBtX2hhc1BlbmRpbmdHZW9t
ZXRyeUNoYW5nZTsKKyAgICBib29sIG1fc2VudE9uTG9hZDsKKyAgICBib29sIG1faXNGdWxsU2Ny
ZWVuOworICAgIGJvb2wgbV9pc0ZvY3VzZWQ7CisgICAgYm9vbCBtX29yaWVudGF0aW9uTG9ja2Vk
OworICAgIGJvb2wgbV9pc0JhY2tncm91bmRQbGF5aW5nOworCisgICAgc3RkOjpzdHJpbmcgbV9w
bHVnaW5VbmlxdWVQcmVmaXg7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJl
Z2lvbiBtX2ludmFsaWRhdGVSZWdpb247CisKK3B1YmxpYzoKKyAgICBQbHVnaW5WaWV3UHJpdmF0
ZShQbHVnaW5WaWV3KiB2aWV3KQorICAgICAgICA6IG1fdmlldyh2aWV3KQorICAgICAgICAsIG1f
cGx1Z2luQnVmZmVyVHlwZShCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlBsdWdpbkJ1
ZmZlcldpdGhBbHBoYSkKKyAgICAgICAgLCBtX3BsdWdpbkZyb250QnVmZmVyKDApCisgICAgICAg
ICwgbV9pZGxlUHJldmVudGVkKGZhbHNlKQorICAgICAgICAsIG1faGFzUGVuZGluZ0dlb21ldHJ5
Q2hhbmdlKHRydWUpCisgICAgICAgICwgbV9zZW50T25Mb2FkKGZhbHNlKQorICAgICAgICAsIG1f
aXNGdWxsU2NyZWVuKGZhbHNlKQorICAgICAgICAsIG1faXNGb2N1c2VkKGZhbHNlKQorICAgICAg
ICAsIG1fb3JpZW50YXRpb25Mb2NrZWQoZmFsc2UpCisgICAgICAgICwgbV9pc0JhY2tncm91bmRQ
bGF5aW5nKGZhbHNlKQorICAgIHsKKyAgICAgICAgbV9wbHVnaW5CdWZmZXJzWzBdID0gMDsKKyAg
ICAgICAgbV9wbHVnaW5CdWZmZXJzWzFdID0gMDsKKworICAgICAgICBwdGhyZWFkX211dGV4YXR0
cl90IG11dGV4QXR0cmlidXRlczsKKyAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmbXV0
ZXhBdHRyaWJ1dGVzKTsKKyAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmbXV0ZXhB
dHRyaWJ1dGVzLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisKKyAgICAgICAgcHRocmVhZF9t
dXRleF9pbml0KCZtX2JhY2tCdWZmZXJNdXRleCwgJm11dGV4QXR0cmlidXRlcyk7CisgICAgICAg
IHB0aHJlYWRfcndsb2NrX2luaXQoJm1fZnJvbnRCdWZmZXJSd0xvY2ssIDApOworCisgICAgICAg
IHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4QXR0cmlidXRlcyk7CisKKyAgICAgICAg
Y2hhciB1bmlxdWVJZFs1MF07CisgICAgICAgIHNucHJpbnRmKHVuaXF1ZUlkLCBzaXplb2YodW5p
cXVlSWQpLCAiUGx1Z2luVmlld0JCLSUwOHglMDh4LSIsIHNfY291bnRlcisrLCAoaW50KXRoaXMp
OworICAgICAgICBtX3BsdWdpblVuaXF1ZVByZWZpeCA9IHVuaXF1ZUlkOworICAgIH0KKworICAg
IH5QbHVnaW5WaWV3UHJpdmF0ZSgpCisgICAgeworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKKyAgICAgICAgaWYgKG1fcGxhdGZvcm1MYXllcikKKyAgICAgICAgICAgIHN0YXRpY19j
YXN0PFBsdWdpbkxheWVyV2ViS2l0VGhyZWFkKj4obV9wbGF0Zm9ybUxheWVyLmdldCgpKS0+c2V0
UGx1Z2luVmlldygwKTsKKyNlbmRpZgorCisgICAgICAgIGRlc3Ryb3lCdWZmZXJzKCk7CisKKyAg
ICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtX2JhY2tCdWZmZXJNdXRleCk7CisgICAgICAg
IHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3koJm1fZnJvbnRCdWZmZXJSd0xvY2spOworICAgIH0KKwor
ICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyVHlwZSB0b0J1ZmZlclR5
cGUoTlBTdXJmYWNlRm9ybWF0IGZvcm1hdCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoZm9ybWF0
KSB7CisgICAgICAgIGNhc2UgRk9STUFUX1JHQl81NjU6CisgICAgICAgICAgICByZXR1cm4gQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpQbHVnaW5CdWZmZXI7CisgICAgICAgIGNhc2Ug
Rk9STUFUX1JHQkFfODg4ODoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlBsdWdpbkJ1ZmZlcldpdGhBbHBoYTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2V0Wm9vbUZhY3RvcihmbG9hdCB6b29tRmFjdG9y
KQorICAgIHsKKyAgICAgICAgaWYgKCgoTlBTZXRXaW5kb3dDYWxsYmFja1N0cnVjdCopbV92aWV3
LT5tX25wV2luZG93LndzX2luZm8pLT56b29tRmFjdG9yICE9IHpvb21GYWN0b3IpCisgICAgICAg
ICAgICBtX2hhc1BlbmRpbmdHZW9tZXRyeUNoYW5nZSA9IHRydWU7CisKKyAgICAgICAgKChOUFNl
dFdpbmRvd0NhbGxiYWNrU3RydWN0KiltX3ZpZXctPm1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21G
YWN0b3IgPSB6b29tRmFjdG9yOworICAgIH0KKworICAgIHZvaWQgc2V0VmlzaWJsZVJlY3RzKGNv
bnN0IE5QUmVjdCByZWN0c1tdLCBpbnQzMl90IGNvdW50KQorICAgIHsKKyAgICAgICAgbV9rZWVw
VmlzaWJsZVJlY3QgPSBJbnRSZWN0KCk7CisKKyAgICAgICAgaWYgKCFtX3ZpZXctPnBhcmVudCgp
IHx8ICFjb3VudCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3IgKGludCBpID0g
MDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEludFJlY3QgYWRkUmVjdCA9IEludFJl
Y3QocmVjdHNbaV0ubGVmdCwgcmVjdHNbaV0udG9wLCByZWN0c1tpXS5yaWdodCAtIHJlY3RzW2ld
LmxlZnQsIHJlY3RzW2ldLmJvdHRvbSAtIHJlY3RzW2ldLnRvcCk7CisgICAgICAgICAgICBtX2tl
ZXBWaXNpYmxlUmVjdC51bml0ZShhZGRSZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERv
bid0IGNhdXNlIGEgcG9zc2libGUgc2Nyb2xsIGlmIHRoZSByZXN1bHQgaXMgYW4gZW1wdHkgcmVj
dGFuZ2xlLgorICAgICAgICBpZiAobV9rZWVwVmlzaWJsZVJlY3QuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIEFkanVzdCB0aGUgcmVjdCB0byB0aGUgcGFyZW50
IHdpbmRvdyBhbmQgdGhlbiBhZGp1c3QgZm9yIHNjcm9sbGluZy4KKyAgICAgICAgbV9rZWVwVmlz
aWJsZVJlY3QgPSBtX3ZpZXctPmNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3cobV9rZWVwVmlzaWJs
ZVJlY3QpOworICAgICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1l
Vmlldyo+KG1fdmlldy0+cGFyZW50KCkpOworICAgICAgICBtX2tlZXBWaXNpYmxlUmVjdC5tb3Zl
KGZyYW1lVmlldy0+c2Nyb2xsUG9zaXRpb24oKS54KCksIGZyYW1lVmlldy0+c2Nyb2xsUG9zaXRp
b24oKS55KCkpOworCisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBh
Z2VDbGllbnQoKS0+ZW5zdXJlQ29udGVudFZpc2libGUoKTsKKyAgICB9CisKKyAgICB2b2lkIGNs
ZWFyVmlzaWJsZVJlY3RzKCkKKyAgICB7CisgICAgICAgIGlmICghbV9rZWVwVmlzaWJsZVJlY3Qu
aXNFbXB0eSgpKQorICAgICAgICAgICAgc2V0VmlzaWJsZVJlY3RzKDAsIDApOworICAgIH0KKwor
ICAgIHZvaWQgc2hvd0tleWJvYXJkKGJvb2wgdmFsdWUpCisgICAgeworICAgICAgICBGcmFtZVZp
ZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fdmlldy0+cGFyZW50KCkp
OworICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCkt
PnNob3dWaXJ0dWFsS2V5Ym9hcmQodmFsdWUpOworICAgIH0KKworICAgIHZvaWQgcmVxdWVzdEZ1
bGxTY3JlZW4oKQorICAgIHsKKyAgICAgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3Rh
dGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV92aWV3LT5wYXJlbnQoKSkpCisgICAgICAgICAgICBpZiAo
ZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5zaG91bGRQbHVn
aW5FbnRlckZ1bGxTY3JlZW4obV92aWV3LCBtX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKSkK
KyAgICAgICAgICAgICAgICBtX3ZpZXctPmhhbmRsZUZ1bGxTY3JlZW5BbGxvd2VkRXZlbnQoKTsK
KyAgICB9CisKKyAgICB2b2lkIGV4aXRGdWxsU2NyZWVuKCkKKyAgICB7CisgICAgICAgIG1fdmll
dy0+aGFuZGxlRnVsbFNjcmVlbkV4aXRFdmVudCgpOworICAgIH0KKworICAgIHZvaWQgcmVxdWVz
dENlbnRlckZpdFpvb20oKQorICAgIHsKKyAgICAgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBz
dGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3ZpZXctPnBhcmVudCgpKTsKKworICAgICAgICBpZiAo
IWZyYW1lVmlldykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmcmFtZVZpZXctPmhv
c3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnpvb21Ub0NvbnRlbnRSZWN0KG1fdmll
dy0+bV93aW5kb3dSZWN0KTsKKyAgICB9CisKKyAgICB2b2lkIGxvY2tPcmllbnRhdGlvbihib29s
IGxhbmRzY2FwZSkKKyAgICB7CisgICAgICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGlj
X2Nhc3Q8RnJhbWVWaWV3Kj4obV92aWV3LT5wYXJlbnQoKSk7CisKKyAgICAgICAgaWYgKCFmcmFt
ZVZpZXcpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2lu
ZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5sb2NrT3JpZW50YXRpb24obGFuZHNjYXBlKTsK
KyAgICAgICAgbV9vcmllbnRhdGlvbkxvY2tlZCA9IHRydWU7CisgICAgfQorCisgICAgdm9pZCB1
bmxvY2tPcmllbnRhdGlvbigpCisgICAgeworICAgICAgICBpZiAoIW1fb3JpZW50YXRpb25Mb2Nr
ZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcg
PSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3ZpZXctPnBhcmVudCgpKTsKKworICAgICAgICBp
ZiAoIWZyYW1lVmlldykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmcmFtZVZpZXct
Pmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnVubG9ja09yaWVudGF0aW9uKCk7
CisgICAgICAgIG1fb3JpZW50YXRpb25Mb2NrZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lk
IHByZXZlbnRJZGxlKGJvb2wgcHJldmVudElkbGUpCisgICAgeworICAgICAgICBGcmFtZVZpZXcq
IGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fdmlldy0+cGFyZW50KCkpOwor
CisgICAgICAgIGlmIChwcmV2ZW50SWRsZSA9PSBtX2lkbGVQcmV2ZW50ZWQpCisgICAgICAgICAg
ICByZXR1cm47CisKKyAgICAgICAgaWYgKCFmcmFtZVZpZXcpCisgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgp
LT5zZXRQcmV2ZW50c1NjcmVlbkRpbW1pbmcocHJldmVudElkbGUpOworICAgICAgICBtX2lkbGVQ
cmV2ZW50ZWQgPSBwcmV2ZW50SWRsZTsKKyAgICB9CisKKyAgICB2b2lkIHNldEhvbGVQdW5jaChp
bnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKKyAgICB7CisgICAgICAgIGlmICh3
aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkKKyAgICAgICAgICAgIG1faG9sZVB1bmNoUmVjdCA9IElu
dFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1f
aG9sZVB1bmNoUmVjdCA9IEludFJlY3QoKTsKKworICAgICAgICAvLyBDbGlwIHRoZSBob2xlIHB1
bmNoIHJlY3RhbmdsZSBpbiBjYXNlIGEgcGx1Z2luIGlzICdvdmVyemVhbG91cycsIG9yIAorICAg
ICAgICAvLyBkb2VzIG5vdCBjbGVhbiB1cCB0aGUgaG9sZSBwdW5jaCByZWN0YW5nbGUgY29ycmVj
dGx5IHdoZW4gZXhpdGluZyAKKyAgICAgICAgLy8gZnVsbHNjcmVlbiAod2lsbCBtYXNrIGJ1Z3Mg
aW4gdGhlIHBsdWdpbikuCisgICAgICAgIG1faG9sZVB1bmNoUmVjdC5pbnRlcnNlY3QoSW50UmVj
dChJbnRQb2ludCgwLCAwKSwgbV92aWV3LT5mcmFtZVJlY3QoKS5zaXplKCkpKTsKKworI2lmIFVT
RShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAgICAgaWYgKG1fcGxhdGZvcm1MYXllcikg
eworICAgICAgICAgICAgSW50UmVjdCByZWN0ID0gbV9ob2xlUHVuY2hSZWN0OworCisgICAgICAg
ICAgICAvLyBUcmFuc2xhdGUgZnJvbSBwbHVnaW4gY29vcmRpbmF0ZXMgdG8gY29udGVudHMgY29v
cmRpbmF0ZXMuCisgICAgICAgICAgICBpZiAoIW1faG9sZVB1bmNoUmVjdC5pc0VtcHR5KCkpCisg
ICAgICAgICAgICAgICAgcmVjdC5tb3ZlKG1fdmlldy0+ZnJhbWVSZWN0KCkueCgpLCBtX3ZpZXct
PmZyYW1lUmVjdCgpLnkoKSk7CisKKyAgICAgICAgICAgIE93blB0cjxIb2xlUHVuY2hEYXRhPiBo
cCA9IGFkb3B0UHRyKG5ldyBIb2xlUHVuY2hEYXRhKTsKKyAgICAgICAgICAgIGhwLT54ID0gbV9o
b2xlUHVuY2hSZWN0LngoKTsKKyAgICAgICAgICAgIGhwLT55ID0gbV9ob2xlUHVuY2hSZWN0Lnko
KTsKKyAgICAgICAgICAgIGhwLT53ID0gbV9ob2xlUHVuY2hSZWN0LndpZHRoKCk7CisgICAgICAg
ICAgICBocC0+aCA9IG1faG9sZVB1bmNoUmVjdC5oZWlnaHQoKTsKKyAgICAgICAgICAgIGhwLT5s
YXllciA9IG1fcGxhdGZvcm1MYXllcjsKKworICAgICAgICAgICAgLy8gTm90aWZ5IGNvbXBvc2l0
aW5nIGxheWVyIGFuZCBwYWdlIGNsaWVudCBpbiBvcmRlciB0byBiZSBhYmxlIHRvCisgICAgICAg
ICAgICAvLyBwdW5jaCB0aHJvdWdoIGNvbXBvc2l0ZWQgYW5kIG5vbi1jb21wb3NpdGVkIHBhcnRz
IG9mIHRoZSBwYWdlLgorICAgICAgICAgICAgY2FsbE9uTWFpblRocmVhZChucFNldEhvbGVQdW5j
aEhhbmRsZXIsIGhwLmxlYWtQdHIoKSk7IC8vIG5wU2V0SG9sZVB1bmNoSGFuZGxlcigpIHRha2Vz
IG93bmVyc2hpcCBvZiBocC4KKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgTlBTdXJm
YWNlIGxvY2tCYWNrQnVmZmVyKCkKKyAgICB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygm
bV9iYWNrQnVmZmVyTXV0ZXgpOworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhp
Y3M6OkJ1ZmZlciogYnVmZmVyID0gbV9wbHVnaW5CdWZmZXJzWyhtX3BsdWdpbkZyb250QnVmZmVy
ICsgMSkgJSBQTFVHSU5fQlVGRkVSU107CisKKyAgICAgICAgaWYgKCFidWZmZXIgfHwgIUJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6cGxhdGZvcm1CdWZmZXJIYW5kbGUoYnVmZmVyKSkg
eworICAgICAgICAgICAgdW5sb2NrQmFja0J1ZmZlcigpOworICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpwbGF0Zm9ybUJ1ZmZlckhhbmRsZShidWZmZXIpOworICAgIH0KKworICAgIHZvaWQgdW5s
b2NrQmFja0J1ZmZlcigpCisgICAgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9i
YWNrQnVmZmVyTXV0ZXgpOworICAgIH0KKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6QnVmZmVyKiBsb2NrUmVhZEZyb250QnVmZmVySW50ZXJuYWwoKQorICAgIHsKKyAgICAg
ICAgcHRocmVhZF9yd2xvY2tfcmRsb2NrKCZtX2Zyb250QnVmZmVyUndMb2NrKTsKKyAgICAgICAg
cmV0dXJuIG1fcGx1Z2luQnVmZmVyc1ttX3BsdWdpbkZyb250QnVmZmVyXTsKKyAgICB9CisKKyAg
ICBOUFN1cmZhY2UgbG9ja1JlYWRGcm9udEJ1ZmZlcigpCisgICAgeworICAgICAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogYnVmZmVyID0gbG9ja1JlYWRGcm9udEJ1
ZmZlckludGVybmFsKCk7CisKKyAgICAgICAgaWYgKCFidWZmZXIgfHwgIUJsYWNrQmVycnk6OlBs
YXRmb3JtOjpHcmFwaGljczo6cGxhdGZvcm1CdWZmZXJIYW5kbGUoYnVmZmVyKSkgeworICAgICAg
ICAgICAgdW5sb2NrUmVhZEZyb250QnVmZmVyKCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgfQorCisgICAgICAgIHJldHVybiBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OnBsYXRmb3JtQnVmZmVySGFuZGxlKGJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCB1bmxvY2tS
ZWFkRnJvbnRCdWZmZXIoKQorICAgIHsKKyAgICAgICAgcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZt
X2Zyb250QnVmZmVyUndMb2NrKTsKKyAgICB9CisKKyAgICB2b2lkIHN3YXBCdWZmZXJzKCkKKyAg
ICB7CisgICAgICAgIFB0aHJlYWRNdXRleExvY2tlciBiYWNrTG9jaygmbV9iYWNrQnVmZmVyTXV0
ZXgpOworICAgICAgICBQdGhyZWFkV3JpdGVMb2NrZXIgZnJvbnRMb2NrKCZtX2Zyb250QnVmZmVy
UndMb2NrKTsKKyAgICAgICAgbV9wbHVnaW5Gcm9udEJ1ZmZlciA9IChtX3BsdWdpbkZyb250QnVm
ZmVyICsgMSkgJSAyOworICAgIH0KKworICAgIGJvb2wgY3JlYXRlQnVmZmVycyhOUFN1cmZhY2VG
b3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgeworICAgICAgICBib29s
IHN1Y2Nlc3MgPSB0cnVlOworCisgICAgICAgIFB0aHJlYWRNdXRleExvY2tlciBiYWNrTG9jaygm
bV9iYWNrQnVmZmVyTXV0ZXgpOworICAgICAgICBQdGhyZWFkV3JpdGVMb2NrZXIgZnJvbnRMb2Nr
KCZtX2Zyb250QnVmZmVyUndMb2NrKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBM
VUdJTl9CVUZGRVJTOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtX3BsdWdpbkJ1ZmZlcnNbaV0p
IHsKKyAgICAgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmRlc3Ry
b3lCdWZmZXIobV9wbHVnaW5CdWZmZXJzW2ldKTsKKyAgICAgICAgICAgICAgICBtX3BsdWdpbkJ1
ZmZlcnNbaV0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod2lkdGggPD0g
MCB8fCBoZWlnaHQgPD0gMCkKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAg
ICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1fcGx1Z2luQnVmZmVyc1tpXSA9IEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Y3JlYXRlQnVmZmVyKAorICAgICAgICAgICAgICAg
ICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50U2l6ZSh3aWR0aCwgaGVpZ2h0KSwKKyAgICAg
ICAgICAgICAgICAgICAgdG9CdWZmZXJUeXBlKGZvcm1hdCkpOworCisgICAgICAgICAgICAgICAg
aWYgKCFtX3BsdWdpbkJ1ZmZlcnNbaV0pCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBm
YWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWNjZXNzKSB7
CisgICAgICAgICAgICBtX3BsdWdpbkJ1ZmZlclNpemUgPSBJbnRTaXplKHdpZHRoLCBoZWlnaHQp
OworICAgICAgICAgICAgbV9wbHVnaW5CdWZmZXJUeXBlID0gdG9CdWZmZXJUeXBlKGZvcm1hdCk7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX3BsdWdpbkJ1ZmZlclNpemUgPSBJbnRT
aXplKCk7CisgICAgICAgICAgICBtX3BsdWdpbkJ1ZmZlclR5cGUgPSBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6R3JhcGhpY3M6OlBsdWdpbkJ1ZmZlcldpdGhBbHBoYTsKKyAgICAgICAgICAgIGRlc3Ry
b3lCdWZmZXJzKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9
CisKKyAgICBib29sIHJlc2l6ZUJ1ZmZlcnMoTlBTdXJmYWNlRm9ybWF0IGZvcm1hdCwgaW50IHdp
ZHRoLCBpbnQgaGVpZ2h0KQorICAgIHsKKyAgICAgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKwor
ICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBidWZmZXIgY3JlYXRlZCwgdGhlbiB0cnkgdG8gY3Jl
YXRlIGl0LgorICAgICAgICBpZiAoIW1fcGx1Z2luQnVmZmVyU2l6ZS53aWR0aCgpIHx8ICFtX3Bs
dWdpbkJ1ZmZlclNpemUuaGVpZ2h0KCkpCisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVy
cyhmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgIGlmICghd2lkdGggfHwgIWhlaWdo
dCkKKyAgICAgICAgICAgIHJldHVybiBkZXN0cm95QnVmZmVycygpOworCisgICAgICAgIFB0aHJl
YWRNdXRleExvY2tlciBiYWNrTG9jaygmbV9iYWNrQnVmZmVyTXV0ZXgpOworICAgICAgICBQdGhy
ZWFkV3JpdGVMb2NrZXIgZnJvbnRMb2NrKCZtX2Zyb250QnVmZmVyUndMb2NrKTsKKworICAgICAg
ICBmb3IgKGludCBpID0gMDsgKGkgPCBQTFVHSU5fQlVGRkVSUykgJiYgc3VjY2VzczsgaSsrKSB7
CisgICAgICAgICAgICBzdWNjZXNzICY9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6
cmVhbGxvY0J1ZmZlcihtX3BsdWdpbkJ1ZmZlcnNbaV0sCisgICAgICAgICAgICAgICAgQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkludFNpemUod2lkdGgsIGhlaWdodCksCisgICAgICAgICAgICAgICAg
dG9CdWZmZXJUeXBlKGZvcm1hdCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1Y2Nlc3Mp
IHsKKyAgICAgICAgICAgIG1fcGx1Z2luQnVmZmVyU2l6ZSA9IEludFNpemUod2lkdGgsIGhlaWdo
dCk7CisgICAgICAgICAgICBtX3BsdWdpbkJ1ZmZlclR5cGUgPSB0b0J1ZmZlclR5cGUoZm9ybWF0
KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXR0
ZW1wdCB0byB1bmRvIGlmIHdlIGZhaWxlZCB0byBnZXQgdGhlIG5ldyBzaXplL2Zvcm1hdC4gV2Ug
Y2FuJ3QgZ3VhcmFudGVlCisgICAgICAgIC8vIHdlIHdpbGwgZ2V0IGl0IGJhY2sgdGhvdWdoLgor
ICAgICAgICBpZiAoIW1fcGx1Z2luQnVmZmVyU2l6ZS53aWR0aCgpIHx8ICFtX3BsdWdpbkJ1ZmZl
clNpemUuaGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIGRlc3Ryb3lCdWZmZXJzKCk7CisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBib29sIHVuZG9uZSA9IHRy
dWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUExVR0lOX0JVRkZFUlM7IGkrKykgewor
ICAgICAgICAgICAgdW5kb25lICY9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6cmVh
bGxvY0J1ZmZlcihtX3BsdWdpbkJ1ZmZlcnNbaV0sCisgICAgICAgICAgICAgICAgbV9wbHVnaW5C
dWZmZXJTaXplLCBtX3BsdWdpbkJ1ZmZlclR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8g
SWYgd2UgZmFpbCB0byB1bmRvLCBkZWxldGUgdGhlIGJ1ZmZlcnMgYWx0b2dldGhlci4KKyAgICAg
ICAgaWYgKCF1bmRvbmUpCisgICAgICAgICAgICBkZXN0cm95QnVmZmVycygpOworCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIGRlc3Ryb3lCdWZmZXJzKCkKKyAgICB7
CisgICAgICAgIFB0aHJlYWRNdXRleExvY2tlciBiYWNrTG9jaygmbV9iYWNrQnVmZmVyTXV0ZXgp
OworICAgICAgICBQdGhyZWFkV3JpdGVMb2NrZXIgZnJvbnRMb2NrKCZtX2Zyb250QnVmZmVyUndM
b2NrKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBMVUdJTl9CVUZGRVJTOyBpKysp
IHsKKyAgICAgICAgICAgIGlmIChtX3BsdWdpbkJ1ZmZlcnNbaV0pIHsKKyAgICAgICAgICAgICAg
ICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmRlc3Ryb3lCdWZmZXIobV9wbHVnaW5C
dWZmZXJzW2ldKTsKKyAgICAgICAgICAgICAgICBtX3BsdWdpbkJ1ZmZlcnNbaV0gPSAwOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1fcGx1Z2luQnVmZmVyU2l6ZSA9IEludFNp
emUoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9OworCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCisKKworZXh0ZXJuICJDIiB7CisKK25hbWVzcGFjZSB7CisgICAgLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8KKyAgICAvLyBTdGF0aWMgTlBBUEkgQ2FsbGJhY2tzCisgICAgLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8KKyAgICB2b2lkIHNldFZpc2libGVSZWN0cyhOUFAgaW5zdGFuY2Us
IGNvbnN0IE5QUmVjdCByZWN0c1tdLCBpbnQzMl90IGNvdW50KQorICAgIHsKKyAgICAgICAgV2Vi
Q29yZTo6UGx1Z2luVmlldyogcHYgPSAoV2ViQ29yZTo6UGx1Z2luVmlldyAqKWluc3RhbmNlLT5u
ZGF0YTsKKyAgICAgICAgV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGUqIHByaXYgPSBwdi0+Z2V0
UHJpdmF0ZSgpOworICAgICAgICBwcml2LT5zZXRWaXNpYmxlUmVjdHMocmVjdHMsIGNvdW50KTsK
KyAgICB9CisKKyAgICB2b2lkIGNsZWFyVmlzaWJsZVJlY3RzKE5QUCBpbnN0YW5jZSkKKyAgICB7
CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXcqIHB2ID0gKFdlYkNvcmU6OlBsdWdpblZpZXcg
KilpbnN0YW5jZS0+bmRhdGE7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlKiBw
cml2ID0gcHYtPmdldFByaXZhdGUoKTsKKyAgICAgICAgcHJpdi0+Y2xlYXJWaXNpYmxlUmVjdHMo
KTsKKyAgICB9CisKKyAgICB2b2lkIHNob3dLZXlib2FyZChOUFAgaW5zdGFuY2UsIGJvb2wgdmFs
dWUpCisgICAgeworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3KiBwdiA9IChXZWJDb3JlOjpQ
bHVnaW5WaWV3ICopaW5zdGFuY2UtPm5kYXRhOworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3
UHJpdmF0ZSogcHJpdiA9IHB2LT5nZXRQcml2YXRlKCk7CisgICAgICAgIHByaXYtPnNob3dLZXli
b2FyZCh2YWx1ZSk7CisgICAgfQorCisgICAgdm9pZCByZXF1ZXN0RnVsbFNjcmVlbihOUFAgaW5z
dGFuY2UpCisgICAgeworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3KiBwdiA9IChXZWJDb3Jl
OjpQbHVnaW5WaWV3ICopaW5zdGFuY2UtPm5kYXRhOworICAgICAgICBXZWJDb3JlOjpQbHVnaW5W
aWV3UHJpdmF0ZSogcHJpdiA9IHB2LT5nZXRQcml2YXRlKCk7CisgICAgICAgIHByaXYtPnJlcXVl
c3RGdWxsU2NyZWVuKCk7CisgICAgfQorCisgICAgdm9pZCBleGl0RnVsbFNjcmVlbihOUFAgaW5z
dGFuY2UpCisgICAgeworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3KiBwdiA9IChXZWJDb3Jl
OjpQbHVnaW5WaWV3ICopaW5zdGFuY2UtPm5kYXRhOworICAgICAgICBXZWJDb3JlOjpQbHVnaW5W
aWV3UHJpdmF0ZSogcHJpdiA9IHB2LT5nZXRQcml2YXRlKCk7CisgICAgICAgIHByaXYtPmV4aXRG
dWxsU2NyZWVuKCk7CisgICAgfQorCisgICAgdm9pZCByZXF1ZXN0Q2VudGVyRml0Wm9vbShOUFAg
aW5zdGFuY2UpCisgICAgeworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3KiBwdiA9IChXZWJD
b3JlOjpQbHVnaW5WaWV3ICopaW5zdGFuY2UtPm5kYXRhOworICAgICAgICBXZWJDb3JlOjpQbHVn
aW5WaWV3UHJpdmF0ZSogcHJpdiA9IHB2LT5nZXRQcml2YXRlKCk7CisgICAgICAgIHByaXYtPnJl
cXVlc3RDZW50ZXJGaXRab29tKCk7CisgICAgfQorCisgICAgdm9pZCBsb2NrT3JpZW50YXRpb24o
TlBQIGluc3RhbmNlLCBib29sIGxhbmRzY2FwZSkKKyAgICB7CisgICAgICAgIFdlYkNvcmU6OlBs
dWdpblZpZXcqIHB2ID0gKFdlYkNvcmU6OlBsdWdpblZpZXcgKilpbnN0YW5jZS0+bmRhdGE7Cisg
ICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlKiBwcml2ID0gcHYtPmdldFByaXZhdGUo
KTsKKyAgICAgICAgcHJpdi0+bG9ja09yaWVudGF0aW9uKGxhbmRzY2FwZSk7CisgICAgfQorCisg
ICAgdm9pZCB1bmxvY2tPcmllbnRhdGlvbihOUFAgaW5zdGFuY2UpCisgICAgeworICAgICAgICBX
ZWJDb3JlOjpQbHVnaW5WaWV3KiBwdiA9IChXZWJDb3JlOjpQbHVnaW5WaWV3ICopaW5zdGFuY2Ut
Pm5kYXRhOworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZSogcHJpdiA9IHB2LT5n
ZXRQcml2YXRlKCk7CisgICAgICAgIHByaXYtPnVubG9ja09yaWVudGF0aW9uKCk7CisgICAgfQor
CisgICAgdm9pZCBwcmV2ZW50SWRsZShOUFAgaW5zdGFuY2UsIGJvb2wgcHJldmVudElkbGUpCisg
ICAgeworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3KiBwdiA9IChXZWJDb3JlOjpQbHVnaW5W
aWV3ICopaW5zdGFuY2UtPm5kYXRhOworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0
ZSogcHJpdiA9IHB2LT5nZXRQcml2YXRlKCk7CisgICAgICAgIHByaXYtPnByZXZlbnRJZGxlKHBy
ZXZlbnRJZGxlKTsKKyAgICB9CisKKyAgICBOUFN1cmZhY2UgbG9ja0JhY2tCdWZmZXIoTlBQIGlu
c3RhbmNlKQorICAgIHsKKyAgICAgICAgV2ViQ29yZTo6UGx1Z2luVmlldyogcHYgPSAoV2ViQ29y
ZTo6UGx1Z2luVmlldyAqKWluc3RhbmNlLT5uZGF0YTsKKyAgICAgICAgV2ViQ29yZTo6UGx1Z2lu
Vmlld1ByaXZhdGUqIHByaXYgPSBwdi0+Z2V0UHJpdmF0ZSgpOworICAgICAgICByZXR1cm4gcHJp
di0+bG9ja0JhY2tCdWZmZXIoKTsKKyAgICB9CisKKyAgICB2b2lkIHVubG9ja0JhY2tCdWZmZXIo
TlBQIGluc3RhbmNlKQorICAgIHsKKyAgICAgICAgV2ViQ29yZTo6UGx1Z2luVmlldyogcHYgPSAo
V2ViQ29yZTo6UGx1Z2luVmlldyAqKWluc3RhbmNlLT5uZGF0YTsKKyAgICAgICAgV2ViQ29yZTo6
UGx1Z2luVmlld1ByaXZhdGUqIHByaXYgPSBwdi0+Z2V0UHJpdmF0ZSgpOworICAgICAgICBwcml2
LT51bmxvY2tCYWNrQnVmZmVyKCk7CisgICAgfQorCisgICAgTlBTdXJmYWNlIGxvY2tSZWFkRnJv
bnRCdWZmZXIoTlBQIGluc3RhbmNlKQorICAgIHsKKyAgICAgICAgV2ViQ29yZTo6UGx1Z2luVmll
dyogcHYgPSAoV2ViQ29yZTo6UGx1Z2luVmlldyAqKWluc3RhbmNlLT5uZGF0YTsKKyAgICAgICAg
V2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGUqIHByaXYgPSBwdi0+Z2V0UHJpdmF0ZSgpOworICAg
ICAgICByZXR1cm4gcHJpdi0+bG9ja1JlYWRGcm9udEJ1ZmZlcigpOworICAgIH0KKworICAgIHZv
aWQgdW5sb2NrUmVhZEZyb250QnVmZmVyKE5QUCBpbnN0YW5jZSkKKyAgICB7CisgICAgICAgIFdl
YkNvcmU6OlBsdWdpblZpZXcqIHB2ID0gKFdlYkNvcmU6OlBsdWdpblZpZXcgKilpbnN0YW5jZS0+
bmRhdGE7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlKiBwcml2ID0gcHYtPmdl
dFByaXZhdGUoKTsKKyAgICAgICAgcHJpdi0+dW5sb2NrUmVhZEZyb250QnVmZmVyKCk7CisgICAg
fQorCisgICAgdm9pZCBzd2FwQnVmZmVycyhOUFAgaW5zdGFuY2UpCisgICAgeworICAgICAgICBX
ZWJDb3JlOjpQbHVnaW5WaWV3KiBwdiA9IChXZWJDb3JlOjpQbHVnaW5WaWV3ICopaW5zdGFuY2Ut
Pm5kYXRhOworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZSogcHJpdiA9IHB2LT5n
ZXRQcml2YXRlKCk7CisgICAgICAgIHByaXYtPnN3YXBCdWZmZXJzKCk7CisgICAgfQorCisgICAg
Ym9vbCBjcmVhdGVCdWZmZXJzKE5QUCBpbnN0YW5jZSwgTlBTdXJmYWNlRm9ybWF0IGZvcm1hdCwg
aW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorICAgIHsKKyAgICAgICAgV2ViQ29yZTo6UGx1Z2luVmll
dyogcHYgPSAoV2ViQ29yZTo6UGx1Z2luVmlldyAqKWluc3RhbmNlLT5uZGF0YTsKKyAgICAgICAg
V2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGUqIHByaXYgPSBwdi0+Z2V0UHJpdmF0ZSgpOworICAg
ICAgICByZXR1cm4gcHJpdi0+Y3JlYXRlQnVmZmVycyhmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwor
ICAgIH0KKworICAgIGJvb2wgZGVzdHJveUJ1ZmZlcnMoTlBQIGluc3RhbmNlKQorICAgIHsKKyAg
ICAgICAgV2ViQ29yZTo6UGx1Z2luVmlldyogcHYgPSAoV2ViQ29yZTo6UGx1Z2luVmlldyAqKWlu
c3RhbmNlLT5uZGF0YTsKKyAgICAgICAgV2ViQ29yZTo6UGx1Z2luVmlld1ByaXZhdGUqIHByaXYg
PSBwdi0+Z2V0UHJpdmF0ZSgpOworICAgICAgICByZXR1cm4gcHJpdi0+ZGVzdHJveUJ1ZmZlcnMo
KTsKKyAgICB9CisKKyAgICBib29sIHJlc2l6ZUJ1ZmZlcnMoTlBQIGluc3RhbmNlLCBOUFN1cmZh
Y2VGb3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgeworICAgICAgICBX
ZWJDb3JlOjpQbHVnaW5WaWV3KiBwdiA9IChXZWJDb3JlOjpQbHVnaW5WaWV3ICopaW5zdGFuY2Ut
Pm5kYXRhOworICAgICAgICBXZWJDb3JlOjpQbHVnaW5WaWV3UHJpdmF0ZSogcHJpdiA9IHB2LT5n
ZXRQcml2YXRlKCk7CisgICAgICAgIHJldHVybiBwcml2LT5yZXNpemVCdWZmZXJzKGZvcm1hdCwg
d2lkdGgsIGhlaWdodCk7CisgICAgfQorCisgICAgdm9pZCBzZXRIb2xlUHVuY2goTlBQIGluc3Rh
bmNlLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKKyAgICB7CisgICAgICAg
IFdlYkNvcmU6OlBsdWdpblZpZXcqIHB2ID0gKFdlYkNvcmU6OlBsdWdpblZpZXcgKilpbnN0YW5j
ZS0+bmRhdGE7CisgICAgICAgIFdlYkNvcmU6OlBsdWdpblZpZXdQcml2YXRlKiBwcml2ID0gcHYt
PmdldFByaXZhdGUoKTsKKyAgICAgICAgcHJpdi0+c2V0SG9sZVB1bmNoKHgsIHksIHdpZHRoLCBo
ZWlnaHQpOworICAgIH0KKworICAgIE5QQ2FsbGJhY2tzIHNfTnBDYWxsYmFja3MgPQorICAgIHsK
KyAgICAgICAgc2V0VmlzaWJsZVJlY3RzLAorICAgICAgICBjbGVhclZpc2libGVSZWN0cywKKyAg
ICAgICAgc2hvd0tleWJvYXJkLAorICAgICAgICByZXF1ZXN0RnVsbFNjcmVlbiwKKyAgICAgICAg
ZXhpdEZ1bGxTY3JlZW4sCisgICAgICAgIHJlcXVlc3RDZW50ZXJGaXRab29tLAorICAgICAgICBs
b2NrT3JpZW50YXRpb24sCisgICAgICAgIHVubG9ja09yaWVudGF0aW9uLAorICAgICAgICBwcmV2
ZW50SWRsZSwKKyAgICAgICAgbG9ja0JhY2tCdWZmZXIsCisgICAgICAgIHVubG9ja0JhY2tCdWZm
ZXIsCisgICAgICAgIGxvY2tSZWFkRnJvbnRCdWZmZXIsCisgICAgICAgIHVubG9ja1JlYWRGcm9u
dEJ1ZmZlciwKKyAgICAgICAgc3dhcEJ1ZmZlcnMsCisgICAgICAgIGNyZWF0ZUJ1ZmZlcnMsCisg
ICAgICAgIGRlc3Ryb3lCdWZmZXJzLAorICAgICAgICByZXNpemVCdWZmZXJzLAorICAgICAgICBz
ZXRIb2xlUHVuY2gKKyAgICB9OworfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCit9IC8vIGV4dGVy
biAiQyIKKworLy8gU3RhbmRhcmQgcGx1Z2luIHdpZGdldCBzdHVmZi4KKwordXNpbmcgSlNDOjpF
eGVjU3RhdGU7Cit1c2luZyBKU0M6OkludGVycHJldGVyOwordXNpbmcgSlNDOjpKU0xvY2s7Cit1
c2luZyBKU0M6OkpTT2JqZWN0OwordXNpbmcgSlNDOjpVU3RyaW5nOworCit1c2luZyBuYW1lc3Bh
Y2Ugc3RkOworCit1c2luZyBuYW1lc3BhY2UgV1RGOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3VzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CisKK3ZvaWQgUGx1Z2luVmlldzo6dXBkYXRlUGx1
Z2luV2lkZ2V0KCkKK3sKKyAgICBpZiAoIXBhcmVudCgpIHx8ICFtX3ByaXZhdGUpCisgICAgICAg
IHJldHVybjsKKworICAgIEFTU0VSVChwYXJlbnQoKS0+aXNGcmFtZVZpZXcoKSk7CisgICAgRnJh
bWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7CisK
KyAgICBJbnRSZWN0IG9sZFdpbmRvd1JlY3QgPSBtX3dpbmRvd1JlY3Q7CisgICAgSW50UmVjdCBv
bGRDbGlwUmVjdCA9IG1fY2xpcFJlY3Q7CisKKyAgICBtX3dpbmRvd1JlY3QgPSBJbnRSZWN0KGZy
YW1lVmlldy0+Y29udGVudHNUb1dpbmRvdyhmcmFtZVJlY3QoKS5sb2NhdGlvbigpKSwgZnJhbWVS
ZWN0KCkuc2l6ZSgpKTsKKworICAgIC8vIE1hcCByZWN0IHRvIGNvbnRlbnQgY29vcmRpbmF0ZSBz
cGFjZSBvZiBtYWluIGZyYW1lLgorICAgIG1fd2luZG93UmVjdC5tb3ZlKHJvb3QoKS0+c2Nyb2xs
T2Zmc2V0KCkpOworCisgICAgbV9jbGlwUmVjdCA9IGNhbGN1bGF0ZUNsaXBSZWN0KCk7CisgICAg
SW50UmVjdCBmID0gZnJhbWVSZWN0KCk7CisKKyAgICAvLyBOb3RpZnkgdGhlIHBsdWdpbiBpZiBp
dCBtYXkgb3IgbWF5IG5vdCBiZSBvbi9vZmZzY3JlZW4uCisgICAgaGFuZGxlU2Nyb2xsRXZlbnQo
KTsKKworICAgIGJvb2wgem9vbUZhY3RvckNoYW5nZWQgPSAoKE5QU2V0V2luZG93Q2FsbGJhY2tT
dHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21GYWN0b3IKKyAgICAgICAgIT0gZnJhbWVW
aWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5jdXJyZW50Wm9vbUZhY3Rv
cigpOworCisgICAgaWYgKCF6b29tRmFjdG9yQ2hhbmdlZCAmJiBtX3dpbmRvd1JlY3QgPT0gb2xk
V2luZG93UmVjdCAmJiBtX2NsaXBSZWN0ID09IG9sZENsaXBSZWN0KQorICAgICAgICByZXR1cm47
CisKKyAgICAvLyBkbyBub3QgY2FsbCBzZXROUFdpbmRvd0lmTmVlZGVkIGltbWVkaWF0ZWx5LCB3
aWxsIGJlIGNhbGxlZCBvbiBwYWludCgpCisgICAgbV9wcml2YXRlLT5tX2hhc1BlbmRpbmdHZW9t
ZXRyeUNoYW5nZSA9IHRydWU7CisKKyAgICAvLyAoaSkgaW4gb3JkZXIgdG8gbW92ZS9yZXNpemUg
dGhlIHBsdWdpbiB3aW5kb3cgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUKKyAgICAvLyByZXN0IG9m
IGZyYW1lIGR1cmluZyBlLmcuIHNjcm9sbGluZywgd2Ugc2V0IHRoZSB3aW5kb3cgZ2VvbWV0cnkK
KyAgICAvLyBpbiB0aGUgcGFpbnQoKSBmdW5jdGlvbiwgYnV0IGFzIHBhaW50KCkgaXNuJ3QgY2Fs
bGVkIHdoZW4gdGhlCisgICAgLy8gcGx1Z2luIHdpbmRvdyBpcyBvdXRzaWRlIHRoZSBmcmFtZSB3
aGljaCBjYW4gYmUgY2F1c2VkIGJ5IGEKKyAgICAvLyBzY3JvbGwsIHdlIG5lZWQgdG8gbW92ZS9y
ZXNpemUgaW1tZWRpYXRlbHkuCisgICAgLy8gKGlpKSBpZiB3ZSBhcmUgcnVubmluZyBsYXlvdXQg
dGVzdHMgZnJvbSBEUlQsIHBhaW50KCkgd29uJ3QgZXZlciBnZXQgY2FsbGVkCisgICAgLy8gc28g
d2UgbmVlZCB0byBjYWxsIHNldE5QV2luZG93SWZOZWVkZWQoKSBpZiB3aW5kb3cgZ2VvbWV0cnkg
aGFzIGNoYW5nZWQKKyAgICBpZiAobV9jbGlwUmVjdC5pc0VtcHR5KCkKKyAgICAgICAgfHwgKHBs
YXRmb3JtUGx1Z2luV2lkZ2V0KCkgJiYgKG1fd2luZG93UmVjdCAhPSBvbGRXaW5kb3dSZWN0IHx8
IG1fY2xpcFJlY3QgIT0gb2xkQ2xpcFJlY3QgfHwgem9vbUZhY3RvckNoYW5nZWQpKSkKKyAgICAg
ICAgc2V0TlBXaW5kb3dJZk5lZWRlZCgpOworCisgICAgLy8gTWFrZSBzdXJlIHdlIGdldCByZXBh
aW50ZWQgYWZ0ZXJ3YXJkcy4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGRvd253YXJkCisgICAgLy8g
c2Nyb2xsaW5nIHRvIG1vdmUgdGhlIHBsdWdpbiB3aWRnZXQgcHJvcGVybHkuCisgICAgaW52YWxp
ZGF0ZSgpOworfQorCit2b2lkIFBsdWdpblZpZXc6OnNldEZvY3VzKGJvb2wgZm9jdXNlZCkKK3sK
KyAgICBpZiAoIW1fcHJpdmF0ZSB8fCBtX3ByaXZhdGUtPm1faXNGb2N1c2VkID09IGZvY3VzZWQp
CisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVChwbGF0Zm9ybVBsdWdpbldpZGdldCgpID09
IHBsYXRmb3JtV2lkZ2V0KCkpOworICAgIFdpZGdldDo6c2V0Rm9jdXMoZm9jdXNlZCk7CisKKyAg
ICBpZiAoZm9jdXNlZCkKKyAgICAgICAgaGFuZGxlRm9jdXNJbkV2ZW50KCk7CisgICAgZWxzZQor
ICAgICAgICBoYW5kbGVGb2N1c091dEV2ZW50KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2hv
dygpCit7CisgICAgc2V0U2VsZlZpc2libGUodHJ1ZSk7CisgICAgV2lkZ2V0OjpzaG93KCk7Cisg
ICAgdXBkYXRlUGx1Z2luV2lkZ2V0KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGlkZSgpCit7
CisgICAgc2V0U2VsZlZpc2libGUoZmFsc2UpOworICAgIFdpZGdldDo6aGlkZSgpOworICAgIHVw
ZGF0ZVBsdWdpbldpZGdldCgpOworfQorCit2b2lkIFBsdWdpblZpZXc6OnVwZGF0ZUJ1ZmZlcihj
b25zdCBJbnRSZWN0JiBidWZmZXJSZWN0KQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAg
ICByZXR1cm47CisKKyAgICAvLyBVcGRhdGUgdGhlIHpvb20gZmFjdG9yIGhlcmUsIGl0IGhhcHBl
bnMgcmlnaHQgYmVmb3JlIHNldE5QV2luZG93SWZOZWVkZWQKKyAgICAvLyBlbnN1cmluZyB0aGF0
IHRoZSBwbHVnaW4gaGFzIGV2ZXJ5IG9wcG9ydHVuaXR5IHRvIGdldCB0aGUgem9vbSBmYWN0b3Ig
YmVmb3JlCisgICAgLy8gaXQgcGFpbnRzIGFueXRoaW5nLgorICAgIGlmIChGcmFtZVZpZXcqIGZy
YW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkKKyAgICAgICAgbV9w
cml2YXRlLT5zZXRab29tRmFjdG9yKGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBh
Z2VDbGllbnQoKS0+Y3VycmVudFpvb21GYWN0b3IoKSk7CisKKyAgICBzZXROUFdpbmRvd0lmTmVl
ZGVkKCk7CisKKyAgICAvLyBCdWlsZCBhbmQgZGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsdWdp
biB0byBub3RpZnkgaXQgd2UgYXJlIGFib3V0IHRvIGRyYXcgd2hhdGV2ZXIKKyAgICAvLyBpcyBp
biB0aGUgZnJvbnQgYnVmZmVyLiBUaGlzIGlzIGl0J3Mgb3Bwb3J0dW5pdHkgdG8gZG8gYSBzd2Fw
LgorICAgIEludFJlY3QgZXhwb3NlZFJlY3QoYnVmZmVyUmVjdCk7CisgICAgZXhwb3NlZFJlY3Qu
aW50ZXJzZWN0KEludFJlY3QoSW50UG9pbnQoMCwgMCksIGZyYW1lUmVjdCgpLnNpemUoKSkpOwor
CisgICAgLy8gT25seSBhc2sgdGhlIHBsdWdpbiB0byBkcmF3IGlmIHRoZSBleHBvc2VkIHJlY3Qg
d2FzIGV4cGxpY2l0bHkgaW52YWxpZGF0ZWQKKyAgICAvLyBieSB0aGUgcGx1Z2luLgorICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIGV4cG9zZWRSZWdpb24gPSBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6aW50ZXJzZWN0UmVnaW9ucyhtX3ByaXZhdGUt
Pm1faW52YWxpZGF0ZVJlZ2lvbiwgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3QoZXhwb3Nl
ZFJlY3QpKTsKKyAgICBpZiAoIWV4cG9zZWRSZWdpb24uaXNFbXB0eSgpKSB7CisgICAgICAgIG1f
cHJpdmF0ZS0+bV9pbnZhbGlkYXRlUmVnaW9uID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJl
Y3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyhtX3ByaXZhdGUtPm1faW52YWxpZGF0ZVJlZ2lvbiwg
ZXhwb3NlZFJlZ2lvbik7CisgICAgICAgIHN0ZDo6dmVjdG9yPEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpJbnRSZWN0PiBleHBvc2VkUmVjdHMgPSBleHBvc2VkUmVnaW9uLnJlY3RzKCk7CisgICAgICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBleHBvc2VkUmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgICAgIE5QRHJhd0V2ZW50IGRyYXc7CisgICAgICAgICAgICBkcmF3LnBsdWdpblJlY3Qg
PSB0b05QUmVjdChtX3dpbmRvd1JlY3QpOworICAgICAgICAgICAgZHJhdy5jbGlwUmVjdCA9IHRv
TlBSZWN0KG1fY2xpcFJlY3QpOworICAgICAgICAgICAgZHJhdy5kcmF3UmVjdCA9IChOUFJlY3Qq
KWFsbG9jYShzaXplb2YoTlBSZWN0KSk7CisgICAgICAgICAgICBkcmF3LmRyYXdSZWN0Q291bnQg
PSAxOworICAgICAgICAgICAgKmRyYXcuZHJhd1JlY3QgPSB0b05QUmVjdChleHBvc2VkUmVjdHMu
YXQoaSkpOworICAgICAgICAgICAgZHJhdy56b29tRmFjdG9yID0gKChOUFNldFdpbmRvd0NhbGxi
YWNrU3RydWN0KiltX25wV2luZG93LndzX2luZm8pLT56b29tRmFjdG9yOworCisgICAgICAgICAg
ICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgICAgICAgICBucEV2ZW50LnR5cGUgPSBOUF9EcmF3RXZl
bnQ7CisgICAgICAgICAgICBucEV2ZW50LmRhdGEgPSAmZHJhdzsKKworICAgICAgICAgICAgLy8g
RklYTUU6IFJldHVybiBlYXJseSBpZiB0aGlzIGZhaWxzPyBPciBqdXN0IHJlcGFpbnQ/CisgICAg
ICAgICAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7CisgICAgICAgIH0KKyAgICB9Cit9CisK
K3ZvaWQgUGx1Z2luVmlldzo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJ
bnRSZWN0JiByZWN0KQoreworICAgIGlmICghbV9wcml2YXRlIHx8ICFtX2lzU3RhcnRlZCkgewor
ICAgICAgICBwYWludE1pc3NpbmdQbHVnaW5JY29uKGNvbnRleHQsIHJlY3QpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSB6b29tIGZhY3RvciBoZXJlLCBpdCBo
YXBwZW5zIHJpZ2h0IGJlZm9yZSBzZXROUFdpbmRvd0lmTmVlZGVkCisgICAgLy8gZW5zdXJpbmcg
dGhhdCB0aGUgcGx1Z2luIGhhcyBldmVyeSBvcHBvcnR1bml0eSB0byBnZXQgdGhlIHpvb20gZmFj
dG9yIGJlZm9yZQorICAgIC8vIGl0IHBhaW50cyBhbnl0aGluZy4KKyAgICBpZiAoRnJhbWVWaWV3
KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSkpCisgICAgICAg
IG1fcHJpdmF0ZS0+c2V0Wm9vbUZhY3RvcihmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZv
cm1QYWdlQ2xpZW50KCktPmN1cnJlbnRab29tRmFjdG9yKCkpOworCisgICAgaWYgKGNvbnRleHQt
PnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2V0TlBXaW5kb3dJ
Zk5lZWRlZCgpOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmICht
X3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllcikKKyAgICAgICAgcmV0dXJuOworI2VuZGlmCisKKyAg
ICAvLyBCdWlsZCBhbmQgZGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsdWdpbiB0byBub3RpZnkg
aXQgd2UgYXJlIGFib3V0IHRvIGRyYXcgd2hhdGV2ZXIKKyAgICAvLyBpcyBpbiB0aGUgZnJvbnQg
YnVmZmVyLiBUaGlzIGlzIGl0J3Mgb3Bwb3J0dW5pdHkgdG8gZG8gYSBzd2FwLgorICAgIEludFJl
Y3QgcmVjdENsaXAocmVjdCk7CisgICAgcmVjdENsaXAuaW50ZXJzZWN0KGZyYW1lUmVjdCgpKTsK
KworICAgIEludFJlY3QgZXhwb3NlZFJlY3QocmVjdENsaXApOworICAgIGV4cG9zZWRSZWN0Lm1v
dmUoLWZyYW1lUmVjdCgpLngoKSwgLWZyYW1lUmVjdCgpLnkoKSk7CisKKyAgICB1cGRhdGVCdWZm
ZXIoZXhwb3NlZFJlY3QpOworCisgICAgUHRocmVhZFJlYWRMb2NrZXIgZnJvbnRMb2NrKCZtX3By
aXZhdGUtPm1fZnJvbnRCdWZmZXJSd0xvY2spOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkdyYXBoaWNzOjpCdWZmZXIqIGZyb250QnVmZmVyID0KKyAgICAgICAgbV9wcml2YXRlLT5tX3Bs
dWdpbkJ1ZmZlcnNbbV9wcml2YXRlLT5tX3BsdWdpbkZyb250QnVmZmVyXTsKKworICAgIC8vIERv
bid0IHBhaW50IGFueXRoaW5nIGlmIHRoZXJlIGlzIG5vIGJ1ZmZlci4KKyAgICBpZiAoIWZyb250
QnVmZmVyKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6R3JhcGhpY3M6OkJhY2tpbmdJbWFnZSogYmFja2luZ0ltYWdlID0KKyAgICAgICAgQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpsb2NrQnVmZmVyQmFja2luZ0ltYWdlKGZyb250QnVm
ZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpSZWFkQWNjZXNzKTsKKyAg
ICBpZiAoIWJhY2tpbmdJbWFnZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRHJhdyB0aGUg
Y2hhbmdlZCBidWZmZXIgY29udGVudHMgdG8gdGhlIHNjcmVlbi4KKyAgICBjb250ZXh0LT5zYXZl
KCk7CisKKyNpZiBVU0UoU0tJQSkKKyAgICBjb25zdCBTa0JpdG1hcCYgcGx1Z2luSW1hZ2UgPSAq
YmFja2luZ0ltYWdlOworICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBncmFwaGljcyA9IGNv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOworICAgIEFTU0VSVChncmFwaGljcyk7CisgICAgU2tD
YW52YXMqIGNhbnZhcyA9IGdyYXBoaWNzLT5jYW52YXMoKTsKKworICAgIC8vIFNvdXJjZSByZWN0
YW5nbGUgd2Ugd2lsbCBkcmF3IHRvIHRoZSBzY3JlZW4uCisgICAgU2tJUmVjdCBza1NyY1JlY3Q7
CisgICAgc2tTcmNSZWN0LnNldChleHBvc2VkUmVjdC54KCksIGV4cG9zZWRSZWN0LnkoKSwKKyAg
ICAgICAgICAgICAgICAgIGV4cG9zZWRSZWN0LngoKSArIGV4cG9zZWRSZWN0LndpZHRoKCksCisg
ICAgICAgICAgICAgICAgICBleHBvc2VkUmVjdC55KCkgKyBleHBvc2VkUmVjdC5oZWlnaHQoKSk7
CisKKyAgICAvLyBQcmVwYXJlIHRoZSBob2xlIHB1bmNoIHJlY3RhbmdsZS4KKyAgICBTa0lSZWN0
IHVuY2xpcHBlZEhvbGVQdW5jaFJlY3Q7CisgICAgdW5jbGlwcGVkSG9sZVB1bmNoUmVjdC5zZXQo
bV9wcml2YXRlLT5tX2hvbGVQdW5jaFJlY3QueCgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LnkoKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC54KCkgKyBtX3ByaXZhdGUt
Pm1faG9sZVB1bmNoUmVjdC53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LnkoKSArIG1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hS
ZWN0LmhlaWdodCgpKTsKKworICAgIC8vIGhvbGVQdW5jaFJlY3QgaXMgY2xpcHBlZC4KKyAgICBT
a0lSZWN0IGhvbGVQdW5jaFJlY3Q7CisKKyAgICAvLyBBbGwgc291cmNlIHJlY3RhbmdsZXMgYXJl
IHNjYWxlZCBieSB0aGUgem9vbSBmYWN0b3IgYmVjYXVzZSB0aGUgc291cmNlIGJpdG1hcCBtYXkg
YmUgYQorICAgIC8vIGhpZ2hlciByZXNvbHV0aW9uIHRoYW4gdGhlIDE6MSBwYWdlLiBUaGlzIGFs
bG93cyB0aGUgZmxhc2ggcGxheWVyIHRvIHNjYWxlIHRoZSBjb250ZW50CisgICAgLy8gaXQgaXMg
ZHJhd2luZyB0byBtYXRjaCB0aGUgc2NhbGUgb2YgdGhlIHBhZ2UuCisgICAgZG91YmxlIHpvb21G
YWN0b3JIID0gKGRvdWJsZSltX3ByaXZhdGUtPm1fcGx1Z2luQnVmZmVyU2l6ZS53aWR0aCgpIC8g
KGRvdWJsZSlmcmFtZVJlY3QoKS53aWR0aCgpOworICAgIGRvdWJsZSB6b29tRmFjdG9yVyA9IChk
b3VibGUpbV9wcml2YXRlLT5tX3BsdWdpbkJ1ZmZlclNpemUuaGVpZ2h0KCkgLyAoZG91YmxlKWZy
YW1lUmVjdCgpLmhlaWdodCgpOworICAgIGRvdWJsZSB6b29tRmFjdG9yID0gKHpvb21GYWN0b3JI
ICsgem9vbUZhY3RvclcpIC8gMi4wOworCisgICAgLy8gVGhpcyBtZXRob2QgZHJhd3MgYSBob2xl
IGlmIHNwZWNpZmllZC4KKyAgICBpZiAoIW1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LmlzRW1w
dHkoKQorICAgICAgICAmJiBob2xlUHVuY2hSZWN0LmludGVyc2VjdCh1bmNsaXBwZWRIb2xlUHVu
Y2hSZWN0LCBza1NyY1JlY3QpKSB7CisKKyAgICAgICAgLy8gRHJhdyB0aGUgdG9wIGNodW5rIGlm
IG5lZWRlZC4KKyAgICAgICAgaWYgKGhvbGVQdW5jaFJlY3QuZlRvcCA+IHNrU3JjUmVjdC5mVG9w
KSB7CisgICAgICAgICAgICBTa0lSZWN0IHNyY1JlY3Q7CisgICAgICAgICAgICBzcmNSZWN0LnNl
dChza1NyY1JlY3QuZkxlZnQgKiB6b29tRmFjdG9yLCBza1NyY1JlY3QuZlRvcCAqIHpvb21GYWN0
b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBza1NyY1JlY3QuZlJpZ2h0ICogem9vbUZhY3Rv
ciwgaG9sZVB1bmNoUmVjdC5mVG9wICogem9vbUZhY3Rvcik7CisKKyAgICAgICAgICAgIFNrUmVj
dCBkc3RSZWN0OworICAgICAgICAgICAgZHN0UmVjdC5zZXQoc2tTcmNSZWN0LmZMZWZ0LCBza1Ny
Y1JlY3QuZlRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrU3JjUmVjdC5mUmlnaHQsIGhv
bGVQdW5jaFJlY3QuZlRvcCk7CisgICAgICAgICAgICBkc3RSZWN0Lm9mZnNldChmcmFtZVJlY3Qo
KS54KCksIGZyYW1lUmVjdCgpLnkoKSk7CisKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd0JpdG1h
cFJlY3QocGx1Z2luSW1hZ2UsICZzcmNSZWN0LCBkc3RSZWN0KTsKKyAgICAgICAgfQorCisgICAg
ICAgIC8vIERyYXcgdGhlIGxlZnQgY2h1bmsgaWYgbmVlZGVkLgorICAgICAgICBpZiAoaG9sZVB1
bmNoUmVjdC5mTGVmdCA+IHNrU3JjUmVjdC5mTGVmdCkgeworICAgICAgICAgICAgU2tJUmVjdCBz
cmNSZWN0OworICAgICAgICAgICAgc3JjUmVjdC5zZXQoc2tTcmNSZWN0LmZMZWZ0ICogem9vbUZh
Y3RvciwgaG9sZVB1bmNoUmVjdC5mVG9wICogem9vbUZhY3RvciwKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGhvbGVQdW5jaFJlY3QuZkxlZnQgKiB6b29tRmFjdG9yLCBob2xlUHVuY2hSZWN0LmZC
b3R0b20gKiB6b29tRmFjdG9yKTsKKworICAgICAgICAgICAgU2tSZWN0IGRzdFJlY3Q7CisgICAg
ICAgICAgICBkc3RSZWN0LnNldChza1NyY1JlY3QuZkxlZnQsIGhvbGVQdW5jaFJlY3QuZlRvcCwK
KyAgICAgICAgICAgICAgICAgICAgICAgIGhvbGVQdW5jaFJlY3QuZkxlZnQsIGhvbGVQdW5jaFJl
Y3QuZkJvdHRvbSk7CisgICAgICAgICAgICBkc3RSZWN0Lm9mZnNldChmcmFtZVJlY3QoKS54KCks
IGZyYW1lUmVjdCgpLnkoKSk7CisKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd0JpdG1hcFJlY3Qo
cGx1Z2luSW1hZ2UsICZzcmNSZWN0LCBkc3RSZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IERyYXcgdGhlIGhvbGUgY2h1bmsuCisgICAgICAgIHsKKyAgICAgICAgICAgIFNrUGFpbnQgcGFp
bnQ7CisgICAgICAgICAgICBwYWludC5zZXRYZmVybW9kZU1vZGUoU2tYZmVybW9kZTo6a1NyY19N
b2RlKTsKKworICAgICAgICAgICAgU2tJUmVjdCBzcmNSZWN0OworICAgICAgICAgICAgc3JjUmVj
dC5zZXQoaG9sZVB1bmNoUmVjdC5mTGVmdCAqIHpvb21GYWN0b3IsIGhvbGVQdW5jaFJlY3QuZlRv
cCAqIHpvb21GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBob2xlUHVuY2hSZWN0LmZS
aWdodCAqIHpvb21GYWN0b3IsIGhvbGVQdW5jaFJlY3QuZkJvdHRvbSAqIHpvb21GYWN0b3IpOwor
CisgICAgICAgICAgICBTa1JlY3QgZHN0UmVjdDsKKyAgICAgICAgICAgIGRzdFJlY3Quc2V0KGhv
bGVQdW5jaFJlY3QuZkxlZnQsIGhvbGVQdW5jaFJlY3QuZlRvcCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGhvbGVQdW5jaFJlY3QuZlJpZ2h0LCBob2xlUHVuY2hSZWN0LmZCb3R0b20pOworICAg
ICAgICAgICAgZHN0UmVjdC5vZmZzZXQoZnJhbWVSZWN0KCkueCgpLCBmcmFtZVJlY3QoKS55KCkp
OworCisgICAgICAgICAgICBjYW52YXMtPmRyYXdCaXRtYXBSZWN0KHBsdWdpbkltYWdlLCAmc3Jj
UmVjdCwgZHN0UmVjdCwgJnBhaW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERyYXcgdGhl
IHJpZ2h0IGNodW5rIGlmIG5lZWRlZC4KKyAgICAgICAgaWYgKGhvbGVQdW5jaFJlY3QuZlJpZ2h0
IDwgc2tTcmNSZWN0LmZSaWdodCkgeworICAgICAgICAgICAgU2tJUmVjdCBzcmNSZWN0OworICAg
ICAgICAgICAgc3JjUmVjdC5zZXQoaG9sZVB1bmNoUmVjdC5mUmlnaHQgKiB6b29tRmFjdG9yLCBo
b2xlUHVuY2hSZWN0LmZUb3AgKiB6b29tRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAg
c2tTcmNSZWN0LmZSaWdodCAqIHpvb21GYWN0b3IsIGhvbGVQdW5jaFJlY3QuZkJvdHRvbSAqIHpv
b21GYWN0b3IpOworCisgICAgICAgICAgICBTa1JlY3QgZHN0UmVjdDsKKyAgICAgICAgICAgIGRz
dFJlY3Quc2V0KGhvbGVQdW5jaFJlY3QuZlJpZ2h0LCBob2xlUHVuY2hSZWN0LmZUb3AsCisgICAg
ICAgICAgICAgICAgICAgICAgICBza1NyY1JlY3QuZlJpZ2h0LCBob2xlUHVuY2hSZWN0LmZCb3R0
b20pOworICAgICAgICAgICAgZHN0UmVjdC5vZmZzZXQoZnJhbWVSZWN0KCkueCgpLCBmcmFtZVJl
Y3QoKS55KCkpOworCisgICAgICAgICAgICBjYW52YXMtPmRyYXdCaXRtYXBSZWN0KHBsdWdpbklt
YWdlLCAmc3JjUmVjdCwgZHN0UmVjdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEcmF3IHRo
ZSBib3R0b20gY2h1bmsgaWYgbmVlZGVkLgorICAgICAgICBpZiAoaG9sZVB1bmNoUmVjdC5mQm90
dG9tIDwgc2tTcmNSZWN0LmZCb3R0b20pIHsKKyAgICAgICAgICAgIFNrSVJlY3Qgc3JjUmVjdDsK
KyAgICAgICAgICAgIHNyY1JlY3Quc2V0KHNrU3JjUmVjdC5mTGVmdCAqIHpvb21GYWN0b3IsIGhv
bGVQdW5jaFJlY3QuZkJvdHRvbSAqIHpvb21GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAg
ICBza1NyY1JlY3QuZlJpZ2h0ICogem9vbUZhY3Rvciwgc2tTcmNSZWN0LmZCb3R0b20gKiB6b29t
RmFjdG9yKTsKKworICAgICAgICAgICAgU2tSZWN0IGRzdFJlY3Q7CisgICAgICAgICAgICBkc3RS
ZWN0LnNldChza1NyY1JlY3QuZkxlZnQsIGhvbGVQdW5jaFJlY3QuZkJvdHRvbSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHNrU3JjUmVjdC5mUmlnaHQsIHNrU3JjUmVjdC5mQm90dG9tKTsKKyAg
ICAgICAgICAgIGRzdFJlY3Qub2Zmc2V0KGZyYW1lUmVjdCgpLngoKSwgZnJhbWVSZWN0KCkueSgp
KTsKKworICAgICAgICAgICAgY2FudmFzLT5kcmF3Qml0bWFwUmVjdChwbHVnaW5JbWFnZSwgJnNy
Y1JlY3QsIGRzdFJlY3QpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2tJUmVj
dCBzcmNSZWN0OworICAgICAgICBzcmNSZWN0LnNldChza1NyY1JlY3QuZkxlZnQgKiB6b29tRmFj
dG9yLCBza1NyY1JlY3QuZlRvcCAqIHpvb21GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgIHNr
U3JjUmVjdC5mUmlnaHQgKiB6b29tRmFjdG9yLCBza1NyY1JlY3QuZkJvdHRvbSAqIHpvb21GYWN0
b3IpOworCisgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlLgor
ICAgICAgICBTa1JlY3QgZHN0UmVjdDsKKyAgICAgICAgZHN0UmVjdC5zZXQocmVjdENsaXAueCgp
LCByZWN0Q2xpcC55KCksCisgICAgICAgICAgICAgICAgICAgIHJlY3RDbGlwLngoKSArIHJlY3RD
bGlwLndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgIHJlY3RDbGlwLnkoKSArIHJlY3RDbGlw
LmhlaWdodCgpKTsKKworICAgICAgICAvLyBEb24ndCBwdW5jaCBhIGhvbGUuCisgICAgICAgIGNh
bnZhcy0+ZHJhd0JpdG1hcFJlY3QocGx1Z2luSW1hZ2UsICZzcmNSZWN0LCBkc3RSZWN0KTsKKyAg
ICB9CisjZWxzZQorI3dhcm5pbmcgIkltcGxlbWVudCBtZSEiCisgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CisjZW5kaWYKKworICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKKworICAgIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpHcmFwaGljczo6cmVsZWFzZUJ1ZmZlckJhY2tpbmdJbWFnZShmcm9udEJ1
ZmZlcik7Cit9CisKKworYm9vbCBQbHVnaW5WaWV3OjpkaXNwYXRjaEZ1bGxTY3JlZW5OUEV2ZW50
KE5QRXZlbnQmIGV2ZW50KQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBBU1NFUlQobV9wcml2YXRlLT5tX2lzRnVsbFNjcmVlbik7CisgICAgcmV0
dXJuIGRpc3BhdGNoTlBFdmVudChldmVudCk7Cit9CisKKy8vIEZJWE1FOiBVbmlmeSBhY3Jvc3Mg
cG9ydHMuCitib29sIFBsdWdpblZpZXc6OmRpc3BhdGNoTlBFdmVudChOUEV2ZW50JiBldmVudCkK
K3sKKyAgICAvLyBzYW5pdHkgY2hlY2suCisgICAgaWYgKCFtX3BsdWdpbiB8fCAhbV9wbHVnaW4t
PnBsdWdpbkZ1bmNzKCktPmV2ZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBQbHVn
aW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldyh0aGlzKTsKKyAgICBKU0M6OkpTTG9jazo6RHJv
cEFsbExvY2tzIGRyb3BBbGxMb2NrcyhKU0M6OlNpbGVuY2VBc3NlcnRpb25zT25seSk7CisgICAg
c2V0Q2FsbGluZ1BsdWdpbih0cnVlKTsKKworICAgIGJvb2wgYWNjZXB0ZWQgPSBtX3BsdWdpbi0+
cGx1Z2luRnVuY3MoKS0+ZXZlbnQobV9pbnN0YW5jZSwgJmV2ZW50KTsKKworICAgIHNldENhbGxp
bmdQbHVnaW4oZmFsc2UpOworICAgIFBsdWdpblZpZXc6OnNldEN1cnJlbnRQbHVnaW5WaWV3KDAp
OworCisgICAgcmV0dXJuIGFjY2VwdGVkOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUtl
eWJvYXJkRXZlbnQoS2V5Ym9hcmRFdmVudCogZXZlbnQpCit7CisgICAgTlBFdmVudCBucEV2ZW50
OworICAgIE5QS2V5Ym9hcmRFdmVudCBrZXlFdmVudDsKKyAgICBjb25zdCBQbGF0Zm9ybUtleWJv
YXJkRXZlbnQgKnBsYXRmb3JtS2V5RXZlbnQgPSBldmVudC0+a2V5RXZlbnQoKTsKKworICAgIGtl
eUV2ZW50Lm1vZGlmaWVycyA9IDA7CisKKyAgICBpZiAocGxhdGZvcm1LZXlFdmVudC0+c2hpZnRL
ZXkoKSkKKyAgICAgICAga2V5RXZlbnQubW9kaWZpZXJzIHw9IEtFWU1PRF9TSElGVDsKKworICAg
IGlmIChwbGF0Zm9ybUtleUV2ZW50LT5jdHJsS2V5KCkpCisgICAgICAgIGtleUV2ZW50Lm1vZGlm
aWVycyB8PSBLRVlNT0RfQ1RSTDsKKworICAgIGlmIChwbGF0Zm9ybUtleUV2ZW50LT5hbHRLZXko
KSkKKyAgICAgICAga2V5RXZlbnQubW9kaWZpZXJzIHw9IEtFWU1PRF9BTFQ7CisKKyAgICBpZiAo
cGxhdGZvcm1LZXlFdmVudC0+bWV0YUtleSgpKQorICAgICAgICBrZXlFdmVudC5tb2RpZmllcnMg
fD0gS0VZTU9EX0FMVEdSOworCisgICAga2V5RXZlbnQuY2FwID0gcGxhdGZvcm1LZXlFdmVudC0+
dW5tb2RpZmllZENoYXJhY3RlcigpOworICAgIGtleUV2ZW50LnN5bSA9IGtleUV2ZW50LmNhcDsK
KyAgICBrZXlFdmVudC5zY2FuID0gMDsKKyAgICBrZXlFdmVudC5mbGFncyA9IDA7CisKKyAgICBp
ZiAocGxhdGZvcm1LZXlFdmVudC0+dHlwZSgpID09IFBsYXRmb3JtS2V5Ym9hcmRFdmVudDo6UmF3
S2V5RG93bgorICAgICAgICAgICAgfHwgcGxhdGZvcm1LZXlFdmVudC0+dHlwZSgpID09IFBsYXRm
b3JtS2V5Ym9hcmRFdmVudDo6S2V5RG93bikgeworICAgICAgICBrZXlFdmVudC5mbGFncyA9IEtF
WV9ET1dOIHwgS0VZX1NZTV9WQUxJRCB8IEtFWV9DQVBfVkFMSUQ7CisgICAgfSBlbHNlIGlmIChw
bGF0Zm9ybUtleUV2ZW50LT50eXBlKCkgPT0gUGxhdGZvcm1LZXlib2FyZEV2ZW50OjpLZXlVcCkK
KyAgICAgICAga2V5RXZlbnQuZmxhZ3MgPSBLRVlfU1lNX1ZBTElEIHwgS0VZX0NBUF9WQUxJRDsK
KworICAgIG5wRXZlbnQudHlwZSA9IE5QX0tleUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICZr
ZXlFdmVudDsKKyAgICBpZiAoZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpKQorICAgICAgICBldmVu
dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVXaGVl
bEV2ZW50KFdoZWVsRXZlbnQqIGV2ZW50KQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAg
ICByZXR1cm47CisKKyAgICBpZiAoIW1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQpCisgICAgICAgIGZv
Y3VzUGx1Z2luRWxlbWVudCgpOworCisgICAgTlBFdmVudCBucEV2ZW50OworICAgIE5QV2hlZWxF
dmVudCB3aGVlbEV2ZW50OworCisgICAgd2hlZWxFdmVudC54ID0gZXZlbnQtPm9mZnNldFgoKTsK
KyAgICB3aGVlbEV2ZW50LnkgPSBldmVudC0+b2Zmc2V0WSgpOworCisgICAgd2hlZWxFdmVudC5m
bGFncyA9IDA7CisKKyAgICB3aGVlbEV2ZW50LnhEZWx0YSA9IGV2ZW50LT5yYXdEZWx0YVgoKTsK
KyAgICB3aGVlbEV2ZW50LnlEZWx0YSA9IGV2ZW50LT5yYXdEZWx0YVkoKTsKKworICAgIG5wRXZl
bnQudHlwZSA9IE5QX1doZWVsRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gJndoZWVsRXZlbnQ7
CisKKyAgICBpZiAoZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpKSB7CisgICAgICAgIGV2ZW50LT5z
ZXREZWZhdWx0SGFuZGxlZCgpOworICAgICAgICBldmVudC0+c2V0UGx1Z2luSGFuZGxlZCgpOwor
ICAgIH0KK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVUb3VjaEV2ZW50KFRvdWNoRXZlbnQq
IGV2ZW50KQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBp
ZiAoIW1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQpCisgICAgICAgIGZvY3VzUGx1Z2luRWxlbWVudCgp
OworCisgICAgTlBUb3VjaEV2ZW50IG5wVG91Y2hFdmVudDsKKworICAgIGlmIChldmVudC0+aXNE
b3VibGVUYXAoKSkKKyAgICAgICAgbnBUb3VjaEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9ET1VC
TEVUQVA7CisgICAgZWxzZSBpZiAoZXZlbnQtPmlzVG91Y2hIb2xkKCkpCisgICAgICAgIG5wVG91
Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRfVE9VQ0hIT0xEOworICAgIGVsc2UgaWYgKGV2ZW50
LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLnRvdWNoc3RhcnRFdmVudCkKKyAgICAgICAgbnBUb3Vj
aEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9TVEFSVDsKKyAgICBlbHNlIGlmIChldmVudC0+dHlw
ZSgpID09IGV2ZW50TmFtZXMoKS50b3VjaGVuZEV2ZW50KQorICAgICAgICBucFRvdWNoRXZlbnQu
dHlwZSA9IFRPVUNIX0VWRU5UX0VORDsKKyAgICBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2
ZW50TmFtZXMoKS50b3VjaG1vdmVFdmVudCkKKyAgICAgICAgbnBUb3VjaEV2ZW50LnR5cGUgPSBU
T1VDSF9FVkVOVF9NT1ZFOworICAgIGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1l
cygpLnRvdWNoY2FuY2VsRXZlbnQpCisgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hf
RVZFTlRfQ0FOQ0VMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuOworCisgICAgVG91Y2hMaXN0
KiB0b3VjaExpc3Q7CisgICAgLy8gVGhlIHRvdWNoZXMgbGlzdCBpcyBlbXB0eSBpZiBpbiBhIHRv
dWNoIGVuZCBldmVudC4gVXNlIGNoYW5nZWRUb3VjaGVzIGluc3RlYWQuCisgICAgaWYgKG5wVG91
Y2hFdmVudC50eXBlID09IFRPVUNIX0VWRU5UX0RPVUJMRVRBUCB8fCBucFRvdWNoRXZlbnQudHlw
ZSA9PSBUT1VDSF9FVkVOVF9FTkQpCisgICAgICAgIHRvdWNoTGlzdCA9IGV2ZW50LT5jaGFuZ2Vk
VG91Y2hlcygpOworICAgIGVsc2UKKyAgICAgICAgdG91Y2hMaXN0ID0gZXZlbnQtPnRvdWNoZXMo
KTsKKworICAgIG5wVG91Y2hFdmVudC5wb2ludHMgPSAwOworICAgIG5wVG91Y2hFdmVudC5zaXpl
ID0gdG91Y2hMaXN0LT5sZW5ndGgoKTsKKworICAgIGlmICh0b3VjaExpc3QtPmxlbmd0aCgpKSB7
CisgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHMgPSBuZXcgTlBUb3VjaFBvaW50W3RvdWNoTGlz
dC0+bGVuZ3RoKCldOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdG91Y2hMaXN0
LT5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBUb3VjaCogdG91Y2hJdGVtID0gdG91Y2hM
aXN0LT5pdGVtKGkpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS50b3VjaElk
ID0gdG91Y2hJdGVtLT5pZGVudGlmaWVyKCk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9p
bnRzW2ldLmNsaWVudFggPSB0b3VjaEl0ZW0tPnBhZ2VYKCkgLSBmcmFtZVJlY3QoKS54KCk7Cisg
ICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLmNsaWVudFkgPSB0b3VjaEl0ZW0tPnBh
Z2VZKCkgLSBmcmFtZVJlY3QoKS55KCk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRz
W2ldLnNjcmVlblggPSB0b3VjaEl0ZW0tPnNjcmVlblgoKTsKKyAgICAgICAgICAgIG5wVG91Y2hF
dmVudC5wb2ludHNbaV0uc2NyZWVuWSA9IHRvdWNoSXRlbS0+c2NyZWVuWSgpOworICAgICAgICAg
ICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5wYWdlWCA9IHRvdWNoSXRlbS0+cGFnZVgoKTsKKyAg
ICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHNbaV0ucGFnZVkgPSB0b3VjaEl0ZW0tPnBhZ2VZ
KCk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2
ZW50LnR5cGUgPSBOUF9Ub3VjaEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICZucFRvdWNoRXZl
bnQ7CisKKyAgICBpZiAoZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpKSB7CisgICAgICAgIGV2ZW50
LT5zZXREZWZhdWx0SGFuZGxlZCgpOworICAgICAgICBldmVudC0+c2V0UGx1Z2luSGFuZGxlZCgp
OworICAgIH0gZWxzZSBpZiAobnBUb3VjaEV2ZW50LnR5cGUgPT0gVE9VQ0hfRVZFTlRfRE9VQkxF
VEFQKSB7CisgICAgICAgIC8vIFNlbmQgVG91Y2ggVXAgaWYgZG91YmxlIHRhcCBub3QgY29uc3Vt
ZWQKKyAgICAgICAgbnBUb3VjaEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9FTkQ7CisgICAgICAg
IG5wRXZlbnQuZGF0YSA9ICZucFRvdWNoRXZlbnQ7CisgICAgICAgIGlmIChkaXNwYXRjaE5QRXZl
bnQobnBFdmVudCkpIHsKKyAgICAgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwor
ICAgICAgICAgICAgZXZlbnQtPnNldFBsdWdpbkhhbmRsZWQoKTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIGRlbGV0ZVtdIG5wVG91Y2hFdmVudC5wb2ludHM7Cit9CisKK3ZvaWQgUGx1Z2luVmll
dzo6aGFuZGxlTW91c2VFdmVudChNb3VzZUV2ZW50KiBldmVudCkKK3sKKyAgICBpZiAoIW1fcHJp
dmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFtX3ByaXZhdGUtPm1faXNGb2N1c2Vk
KQorICAgICAgICBmb2N1c1BsdWdpbkVsZW1lbnQoKTsKKworICAgIE5QRXZlbnQgbnBFdmVudDsK
KyAgICBOUE1vdXNlRXZlbnQgbW91c2VFdmVudDsKKworICAgIG1vdXNlRXZlbnQueCA9IGV2ZW50
LT5vZmZzZXRYKCk7CisgICAgbW91c2VFdmVudC55ID0gZXZlbnQtPm9mZnNldFkoKTsKKworICAg
IGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5tb3VzZWRvd25FdmVudCkgeworICAg
ICAgICBtb3VzZUV2ZW50LnR5cGUgPSBNT1VTRV9CVVRUT05fRE9XTjsKKyAgICAgICAgcGFyZW50
RnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCktPnNldENhcHR1cmluZ01vdXNlRXZlbnRzTm9kZShub2Rl
KCkpOworICAgIH0gZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2Vt
b3ZlRXZlbnQpCisgICAgICAgIG1vdXNlRXZlbnQudHlwZSA9IE1PVVNFX01PVElPTjsKKyAgICBl
bHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5tb3VzZW91dEV2ZW50KQorICAg
ICAgICBtb3VzZUV2ZW50LnR5cGUgPSBNT1VTRV9PVVRCT1VORDsKKyAgICBlbHNlIGlmIChldmVu
dC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5tb3VzZW92ZXJFdmVudCkKKyAgICAgICAgbW91c2VF
dmVudC50eXBlID0gTU9VU0VfT1ZFUjsKKyAgICBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2
ZW50TmFtZXMoKS5tb3VzZXVwRXZlbnQpIHsKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9V
U0VfQlVUVE9OX1VQOworICAgICAgICBwYXJlbnRGcmFtZSgpLT5ldmVudEhhbmRsZXIoKS0+c2V0
Q2FwdHVyaW5nTW91c2VFdmVudHNOb2RlKDApOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm47
CisKKyAgICBtb3VzZUV2ZW50LmJ1dHRvbiA9IGV2ZW50LT5idXR0b24oKTsKKyAgICBtb3VzZUV2
ZW50LmZsYWdzID0gMDsKKworICAgIG5wRXZlbnQudHlwZSA9IE5QX01vdXNlRXZlbnQ7CisgICAg
bnBFdmVudC5kYXRhID0gJm1vdXNlRXZlbnQ7CisKKyAgICBpZiAoZGlzcGF0Y2hOUEV2ZW50KG5w
RXZlbnQpKSB7CisgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOworICAgICAgICBl
dmVudC0+c2V0UGx1Z2luSGFuZGxlZCgpOworICAgIH0KK30KKwordm9pZCBQbHVnaW5WaWV3Ojpo
YW5kbGVGb2N1c0luRXZlbnQoKQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAobV9wcml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV9wcml2YXRlLT5tX2lzRm9jdXNlZCA9IHRydWU7CisKKyAgICBOUEV2ZW50IG5wRXZl
bnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfRm9jdXNHYWluZWRFdmVudDsKKyAgICBucEV2ZW50
LmRhdGEgPSAwOworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQbHVn
aW5WaWV3OjpoYW5kbGVGb2N1c091dEV2ZW50KCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaWYgKCFtX3ByaXZhdGUtPm1faXNGb2N1c2VkKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX3ByaXZhdGUtPm1faXNGb2N1c2VkID0gZmFsc2U7CisKKyAgICBO
UEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfRm9jdXNMb3N0RXZlbnQ7Cisg
ICAgbnBFdmVudC5kYXRhID0gMDsKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisK
K3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlUGF1c2VFdmVudCgpCit7CisgICAgTlBFdmVudCBucEV2
ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX1BhdXNlRXZlbnQ7CisgICAgbnBFdmVudC5kYXRh
ID0gMDsKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmll
dzo6aGFuZGxlUmVzdW1lRXZlbnQoKQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2
ZW50LnR5cGUgPSBOUF9SZXN1bWVFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworICAgIGRp
c3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVTY3Jv
bGxFdmVudCgpCit7CisgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFt
ZVZpZXcqPihwYXJlbnQoKSk7CisKKyAgICAvLyBBcyBhIHNwZWNpYWwgY2FzZSwgaWYgdGhlIGZy
YW1lVmlldyBleHRlbnQgaW4gZWl0aGVyIGRpbWVuc2lvbiBpcworICAgIC8vIGVtcHR5LCB0aGVu
IHNlbmQgYW4gb24gc2NyZWVuIGV2ZW50LiBUaGlzIGlzIGltcG9ydGFudCBmb3Igc2l0ZXMgbGlr
ZQorICAgIC8vIHBpY25pay5jb20gd2hpY2ggdXNlIGEgaGlkZGVuIGlmcmFtZSAocmVhZDogd2lk
dGggPSAwIGFuZCBoZWlnaHQgPSAwKQorICAgIC8vIHdpdGggYW4gZW1iZWRkZWQgc3dmIHRvIGV4
ZWN1dGUgc29tZSBqYXZhc2NyaXB0LiBVbmxlc3Mgd2Ugc2VuZCBhbgorICAgIC8vIG9uIHNjcmVl
biBldmVudCB0aGUgc3dmIHdpbGwgbm90IGV4ZWN1dGUgdGhlIGphdmFzY3JpcHQgYW5kIHRoZSBy
ZWFsCisgICAgLy8gc2l0ZSB3aWxsIG5ldmVyIGxvYWQuCisgICAgYm9vbCBvblNjcmVlbkV2ZW50
ID0gZnJhbWVWaWV3ICYmICghZnJhbWVWaWV3LT53aWR0aCgpIHx8ICFmcmFtZVZpZXctPmhlaWdo
dCgpKTsKKworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBtX2NsaXBS
ZWN0LmlzRW1wdHkoKSAmJiAhb25TY3JlZW5FdmVudCA/IE5QX09mZlNjcmVlbkV2ZW50IDogTlBf
T25TY3JlZW5FdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworICAgIGRpc3BhdGNoTlBFdmVu
dChucEV2ZW50KTsKK30KKworSW50UmVjdCBQbHVnaW5WaWV3OjpjYWxjdWxhdGVDbGlwUmVjdCgp
IGNvbnN0Cit7CisgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZp
ZXcqPihwYXJlbnQoKSk7CisgICAgYm9vbCB2aXNpYmxlID0gZnJhbWVWaWV3ICYmIGlzVmlzaWJs
ZSgpOworCisgICAgaWYgKHZpc2libGUgJiYgZnJhbWVWaWV3LT53aWR0aCgpICYmIGZyYW1lVmll
dy0+aGVpZ2h0KCkpIHsKKyAgICAgICAgSW50U2l6ZSB3aW5kb3dTaXplID0gZnJhbWVWaWV3LT5o
b3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT52aWV3cG9ydFNpemUoKTsKKworICAg
ICAgICAvLyBHZXQgdGhlIGNsaXBwZWQgcmVjdGFuZ2xlIGZvciB0aGlzIHBsYXllciB3aXRoaW4g
dGhlIGN1cnJlbnQgZnJhbWUuCisgICAgICAgIEludFJlY3QgdmlzaWJsZUNvbnRlbnRSZWN0Owor
ICAgICAgICBJbnRSZWN0IGNvbnRlbnRSZWN0ID0gbV9lbGVtZW50LT5yZW5kZXJlcigpLT5hYnNv
bHV0ZUNsaXBwZWRPdmVyZmxvd1JlY3QoKTsKKyAgICAgICAgRmxvYXRQb2ludCBjb250ZW50TG9j
YWwgPSBtX2VsZW1lbnQtPnJlbmRlcmVyKCktPmFic29sdXRlVG9Mb2NhbChGbG9hdFBvaW50KGNv
bnRlbnRSZWN0LmxvY2F0aW9uKCkpKTsKKworICAgICAgICBjb250ZW50UmVjdC5zZXRMb2NhdGlv
bihyb3VuZGVkSW50UG9pbnQoY29udGVudExvY2FsKSk7CisgICAgICAgIGNvbnRlbnRSZWN0Lm1v
dmUoZnJhbWVSZWN0KCkueCgpLCBmcmFtZVJlY3QoKS55KCkpOworCisgICAgICAgIC8vIENsaXAg
YWdhaW5zdCBhbnkgZnJhbWVzIHRoYXQgdGhlIHdpZGdldCBpcyBpbnNpZGUuIE5vdGUgdGhhdCBp
ZiB0aGUgZnJhbWVzIGFyZSBhbHNvIGNsaXBwZWQKKyAgICAgICAgLy8gYnkgYSBkaXYsIHRoYXQg
d2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhpcyBjYWxjdWxhdGlvbi4gVGhhdCBpcyBhbiBpbXBy
b3ZlbWVudCB0aGF0IHN0aWxsCisgICAgICAgIC8vIG5lZWRzIHRvIGJlIG1hZGUuCisgICAgICAg
IGNvbnN0IFdpZGdldCogY3VycmVudCA9IHRoaXM7CisgICAgICAgIHdoaWxlIChjdXJyZW50LT5w
YXJlbnQoKSAmJiB2aXNpYmxlKSB7CisgICAgICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaXQgaXMg
dmlzaWJsZSBpbiB0aGlzIHNjcm9sbHZpZXcuCisgICAgICAgICAgICB2aXNpYmxlQ29udGVudFJl
Y3QgPSBjdXJyZW50LT5wYXJlbnQoKS0+dmlzaWJsZUNvbnRlbnRSZWN0KCk7CisKKyAgICAgICAg
ICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlIHJvb3QgU2Nyb2xsVmlldy4gSXRzIHNpemUgZG9l
cyBub3QgbWF0Y2ggdGhlIGFjdHVhbCB3aW5kb3cgc2l6ZS4KKyAgICAgICAgICAgIGlmIChjdXJy
ZW50LT5wYXJlbnQoKSA9PSByb290KCkpCisgICAgICAgICAgICAgICAgdmlzaWJsZUNvbnRlbnRS
ZWN0LnNldFNpemUod2luZG93U2l6ZSk7CisKKyAgICAgICAgICAgIGNvbnRlbnRSZWN0LmludGVy
c2VjdCh2aXNpYmxlQ29udGVudFJlY3QpOworICAgICAgICAgICAgdmlzaWJsZSA9ICFjb250ZW50
UmVjdC5pc0VtcHR5KCk7CisKKyAgICAgICAgICAgIC8vIE9mZnNldCB0byB2aXNpYmxlIGNvb3Jk
aW5hdGVzIGluIHNjcm9sbHZpZXcgd2lkZ2V0J3MgY29vcmRpbmF0ZSBzeXN0ZW0gKGV4Y2VwdCBp
biB0aGUgY2FzZSBvZgorICAgICAgICAgICAgLy8gdGhlIHRvcCBzY3JvbGwgdmlldykuCisgICAg
ICAgICAgICBpZiAoY3VycmVudC0+cGFyZW50KCktPnBhcmVudCgpKQorICAgICAgICAgICAgICAg
IGNvbnRlbnRSZWN0Lm1vdmUoLXZpc2libGVDb250ZW50UmVjdC54KCksIC12aXNpYmxlQ29udGVu
dFJlY3QueSgpKTsKKworICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBhcmVudCgpOwor
CisgICAgICAgICAgICAvLyBEb24ndCBpbmNsdWRlIHRoZSBvZmZzZXQgZm9yIHRoZSByb290IHdp
bmRvdyBvciB3ZSBnZXQgdGhlIHdyb25nIGNvb3JkaW5hdGVzLgorICAgICAgICAgICAgaWYgKGN1
cnJlbnQtPnBhcmVudCgpKSB7CisgICAgICAgICAgICAgICAgLy8gTW92ZSBjb250ZW50IHJlY3Qg
aW50byB0aGUgcGFyZW50IHNjcm9sbHZpZXcncyBjb29yZGluYXRlcy4KKyAgICAgICAgICAgICAg
ICBJbnRSZWN0IGN1ckZyYW1lUmVjdCA9IGN1cnJlbnQtPmZyYW1lUmVjdCgpOworICAgICAgICAg
ICAgICAgIGNvbnRlbnRSZWN0Lm1vdmUoY3VyRnJhbWVSZWN0LngoKSwgY3VyRnJhbWVSZWN0Lnko
KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY29udGVudFJl
Y3Q7CisgICAgfQorCisgICAgcmV0dXJuIEludFJlY3QoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3
OjpoYW5kbGVPbkxvYWRFdmVudCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJl
dHVybjsKKworICAgIGlmIChtX3ByaXZhdGUtPm1fc2VudE9uTG9hZCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgbV9wcml2YXRlLT5tX3NlbnRPbkxvYWQgPSB0cnVlOworCisgICAgTlBFdmVudCBu
cEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX09uTG9hZEV2ZW50OworICAgIG5wRXZlbnQu
ZGF0YSA9IDA7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7CisKKyAgICAvLyBTZW5k
IGFuIGluaXRpYWwgT25TY3JlZW4vT2ZmU2NyZWVuIGV2ZW50LiBJdCBtdXN0IGFsd2F5cyBjb21l
IGFmdGVyIG9uTG9hZCBpcyBzZW50LgorICAgIGhhbmRsZVNjcm9sbEV2ZW50KCk7Cit9CisKK3Zv
aWQgUGx1Z2luVmlldzo6aGFuZGxlRnJlZU1lbW9yeUV2ZW50KCkKK3sKKyAgICBOUEV2ZW50IG5w
RXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfRnJlZU1lbW9yeUV2ZW50OworICAgIG5wRXZl
bnQuZGF0YSA9IDA7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQg
UGx1Z2luVmlldzo6aGFuZGxlQmFja2dyb3VuZEV2ZW50KCkKK3sKKyAgICBOUEV2ZW50IG5wRXZl
bnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfQmFja2dyb3VuZEV2ZW50OworICAgIG5wRXZlbnQu
ZGF0YSA9IDA7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1
Z2luVmlldzo6aGFuZGxlRm9yZWdyb3VuZEV2ZW50KCkKK3sKKyAgICBzZXROUFdpbmRvd0lmTmVl
ZGVkKCk7CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfRm9y
ZWdyb3VuZEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisKKyAgICBkaXNwYXRjaE5QRXZl
bnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlRnVsbFNjcmVlbkFsbG93
ZWRFdmVudCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAg
IE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9GdWxsU2NyZWVuUmVhZHlF
dmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworCisgICAgaWYgKEZyYW1lVmlldyogZnJhbWVW
aWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpKSB7CisgICAgICAgIGZyYW1l
Vmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+ZGlkUGx1Z2luRW50ZXJG
dWxsU2NyZWVuKHRoaXMsIG1fcHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19zdHIoKSk7
CisKKyAgICAgICAgaWYgKCFkaXNwYXRjaE5QRXZlbnQobnBFdmVudCkpCisgICAgICAgICAgICBm
cmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmRpZFBsdWdpbkV4
aXRGdWxsU2NyZWVuKHRoaXMsIG1fcHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19zdHIo
KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4g
PSB0cnVlOworICAgIH0KK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVGdWxsU2NyZWVuRXhp
dEV2ZW50KCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
TlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0Z1bGxTY3JlZW5FeGl0RXZl
bnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50
KTsKKworICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmll
dyo+KHBhcmVudCgpKSkKKyAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3Jt
UGFnZUNsaWVudCgpLT5kaWRQbHVnaW5FeGl0RnVsbFNjcmVlbih0aGlzLCBtX3ByaXZhdGUtPm1f
cGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpOworCisgICAgbV9wcml2YXRlLT5tX2lzRnVsbFNj
cmVlbiA9IGZhbHNlOworICAgIGludmFsaWRhdGUoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3Ojpo
YW5kbGVJZGxlRXZlbnQoYm9vbCBlbnRlcklkbGUpCit7CisgICAgTlBFdmVudCBucEV2ZW50Owor
ICAgIG5wRXZlbnQuZGF0YSA9IDA7CisKKyAgICBpZiAoZW50ZXJJZGxlKQorICAgICAgICBucEV2
ZW50LnR5cGUgPSBOUF9FbnRlcklkbGVFdmVudDsKKyAgICBlbHNlCisgICAgICAgIG5wRXZlbnQu
dHlwZSA9IE5QX0V4aXRJZGxlRXZlbnQ7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7
Cit9CisKKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVBcHBBY3RpdmF0ZWRFdmVudCgpCit7Cisg
ICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisgICAgbnBFdmVudC50
eXBlID0gTlBfQXBwQWN0aXZhdGVkRXZlbnQ7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVu
dCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlQXBwRGVhY3RpdmF0ZWRFdmVudCgpCit7
CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFBsdWdpbiB3
YW50cyB0byBrbm93IHRoYXQgaXQgaGFzIHRvIGV4aXQgZnVsbHNjcmVlbiBvbiBkZWFjdGl2YXRp
b24uCisgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAgICAgIGhhbmRsZUZ1
bGxTY3JlZW5FeGl0RXZlbnQoKTsKKworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50
LmRhdGEgPSAwOworICAgIG5wRXZlbnQudHlwZSA9IE5QX0FwcERlYWN0aXZhdGVkRXZlbnQ7CisK
KyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFu
ZGxlQXBwU3RhbmRieUV2ZW50KCkKK3sKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgc2VuZCBh
biBRTlBfQXBwU3RhbmRieUV2ZW50CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQu
ZGF0YSA9IDA7CisgICAgbnBFdmVudC50eXBlID0gTlBfQXBwU3RhbmRCeUV2ZW50OworCisgICAg
ZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZU9y
aWVudGF0aW9uRXZlbnQoaW50IGFuZ2xlKQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBu
cEV2ZW50LnR5cGUgPSBOUF9PcmllbnRhdGlvbkV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICh2
b2lkKilhbmdsZTsKKworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQ
bHVnaW5WaWV3OjpoYW5kbGVTd2lwZUV2ZW50KCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gUGx1Z2luIG9ubHkgd2FudHMgdG8ga25vdyB0aGF0IGl0
IGhhcyB0byBleGl0IGZ1bGxzY3JlZW4uCisgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3Jl
ZW4pCisgICAgICAgIGhhbmRsZUZ1bGxTY3JlZW5FeGl0RXZlbnQoKTsKK30KKwordm9pZCBQbHVn
aW5WaWV3OjpoYW5kbGVTY3JlZW5Qb3dlckV2ZW50KGJvb2wgcG93ZXJlZCkKK3sKKyAgICBOUEV2
ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKworICAgIGlmIChwb3dlcmVkKQor
ICAgICAgICBucEV2ZW50LnR5cGUgPSBOUF9TY3JlZW5Qb3dlclVwRXZlbnQ7CisgICAgZWxzZQor
ICAgICAgICBucEV2ZW50LnR5cGUgPSBOUF9TY3JlZW5Qb3dlckRvd25FdmVudDsKKworICAgIGRp
c3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpzZXRQYXJlbnQo
U2Nyb2xsVmlldyogcGFyZW50V2lkZ2V0KQoreworICAgIC8vIElmIHBhcmVudFdpZGdldCBpcyAw
LCBsZXRzIHVucmVnaXN0ZXIgdGhlIHBsdWdpbiB3aXRoIHRoZSBjdXJyZW50IHBhcmVudC4KKyAg
ICBpZiAobV9wcml2YXRlICYmICghcGFyZW50V2lkZ2V0IHx8IHBhcmVudFdpZGdldCAhPSBwYXJl
bnQoKSkpIHsKKyAgICAgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8
RnJhbWVWaWV3Kj4ocGFyZW50KCkpKSB7CisgICAgICAgICAgICBpZiAobV9wcml2YXRlLT5tX2lz
QmFja2dyb3VuZFBsYXlpbmcpCisgICAgICAgICAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93
KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5vblBsdWdpblN0b3BCYWNrZ3JvdW5kUGxheSh0aGlz
LCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpOworCisgICAgICAgICAg
ICBpZiAobV9wcml2YXRlLT5tX2lzRnVsbFNjcmVlbikKKyAgICAgICAgICAgICAgICBoYW5kbGVG
dWxsU2NyZWVuRXhpdEV2ZW50KCk7CisKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB1bmxvY2sg
dGhlIGlkbGUgKGlmIHdlIGhhdmUgbG9ja2VkIGl0KS4KKyAgICAgICAgICAgIG1fcHJpdmF0ZS0+
cHJldmVudElkbGUoZmFsc2UpOworCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgcmVsZWFzZSBh
bnkga2VlcFZpc2libGVSZWN0cyBpZiB0aGV5IHdlcmUgc2V0LgorICAgICAgICAgICAgbV9wcml2
YXRlLT5jbGVhclZpc2libGVSZWN0cygpOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQorICAgICAgICAgICAgLy8gSWYgd2UgaGFkIGEgaG9sZSBwdW5jaCByZWN0IHNldCwgY2xl
YXIgaXQuCisgICAgICAgICAgICBpZiAobV9wcml2YXRlLT5tX3BsYXRmb3JtTGF5ZXIgJiYgIW1f
cHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBtX3By
aXZhdGUtPm1fcGxhdGZvcm1MYXllci0+c2V0SG9sZVB1bmNoUmVjdChJbnRSZWN0KCkpOworI2Vu
ZGlmCisgICAgICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xp
ZW50KCktPnJlZ2lzdGVyUGx1Z2luKHRoaXMsIGZhbHNlIC8qc2hvdWxkUmVnaXN0ZXIqLyk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBXaWRnZXQ6OnNldFBhcmVudChwYXJlbnRXaWRnZXQpOwor
CisgICAgaWYgKHBhcmVudFdpZGdldCkgeworICAgICAgICBpbml0KCk7CisKKyAgICAgICAgRnJh
bWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnRXaWRnZXQp
OworCisgICAgICAgIGlmIChmcmFtZVZpZXcgJiYgbV9wcml2YXRlKSB7CisgICAgICAgICAgICBm
cmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnJlZ2lzdGVyUGx1
Z2luKHRoaXMsIHRydWUgLypzaG91bGRSZWdpc3RlciovKTsKKyAgICAgICAgICAgIGlmIChmcmFt
ZVZpZXctPmZyYW1lKCkKKyAgICAgICAgICAgICAgICYmIGZyYW1lVmlldy0+ZnJhbWUoKS0+bG9h
ZGVyKCkKKyAgICAgICAgICAgICAgICYmIGZyYW1lVmlldy0+ZnJhbWUoKS0+bG9hZGVyKCktPmZy
YW1lSGFzTG9hZGVkKCkpCisgICAgICAgICAgICAgICAgaGFuZGxlT25Mb2FkRXZlbnQoKTsKKwor
ICAgICAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0JhY2tncm91bmRQbGF5aW5nKQorICAgICAg
ICAgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+
b25QbHVnaW5TdGFydEJhY2tncm91bmRQbGF5KHRoaXMsIG1fcHJpdmF0ZS0+bV9wbHVnaW5Vbmlx
dWVQcmVmaXguY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUGx1Z2luVmll
dzo6c2V0TlBXaW5kb3dSZWN0KGNvbnN0IEludFJlY3QmIHJjKQoreworICAgIHNldE5QV2luZG93
SWZOZWVkZWQoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpzZXROUFdpbmRvd0lmTmVlZGVkKCkK
K3sKKyAgICBpZiAoIW1fcHJpdmF0ZSB8fCAhbV9pc1N0YXJ0ZWQgfHwgIXBhcmVudCgpIHx8ICFt
X3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+c2V0d2luZG93KQorICAgICAgICByZXR1cm47CisKKyAg
ICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgp
KTsKKyAgICBpZiAoIWZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQo
KS0+aXNBY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSWYgdGhlIHBsdWdpbiBk
aWRuJ3QgbG9hZCBzdWNlc3NmdWxseSwgbm8gcG9pbnQgaW4gY2FsbGluZyBzZXR3aW5kb3cKKyAg
ICBpZiAobV9zdGF0dXMgIT0gUGx1Z2luU3RhdHVzTG9hZGVkU3VjY2Vzc2Z1bGx5KQorICAgICAg
ICByZXR1cm47CisKKyAgICBpZiAobV9wcml2YXRlLT5tX2lzRnVsbFNjcmVlbikKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKCFtX3ByaXZhdGUtPm1faGFzUGVuZGluZ0dlb21ldHJ5Q2hhbmdl
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3ByaXZhdGUtPm1faGFzUGVuZGluZ0dlb21ldHJ5
Q2hhbmdlID0gZmFsc2U7CisKKyAgICBtX25wV2luZG93LnggPSBtX3dpbmRvd1JlY3QueCgpOwor
ICAgIG1fbnBXaW5kb3cueSA9IG1fd2luZG93UmVjdC55KCk7CisKKyAgICBtX25wV2luZG93LmNs
aXBSZWN0LmxlZnQgPSBtYXgoMCwgbV9jbGlwUmVjdC54KCkpOworICAgIG1fbnBXaW5kb3cuY2xp
cFJlY3QudG9wID0gbWF4KDAsIG1fY2xpcFJlY3QueSgpKTsKKyAgICBtX25wV2luZG93LmNsaXBS
ZWN0LnJpZ2h0ID0gbWF4KDAsIG1fY2xpcFJlY3QubWF4WCgpKTsKKyAgICBtX25wV2luZG93LmNs
aXBSZWN0LmJvdHRvbSA9IG1heCgwLCBtX2NsaXBSZWN0Lm1heFkoKSk7CisKKyAgICBpZiAobV9w
bHVnaW4tPnF1aXJrcygpLmNvbnRhaW5zKFBsdWdpblF1aXJrRG9udENhbGxTZXRXaW5kb3dNb3Jl
VGhhbk9uY2UpKSB7CisgICAgICAgIC8vIEZMQVNIIFdPUktBUk9VTkQ6IE9ubHkgc2V0IGluaXRp
YWxseS4gTXVsdGlwbGUgY2FsbHMgdG8KKyAgICAgICAgLy8gc2V0TlBXaW5kb3coKSBjYXVzZSB0
aGUgcGx1Z2luIHRvIGNyYXNoIGluIHdpbmRvd2VkIG1vZGUuCisgICAgICAgIGlmICghbV9pc1dp
bmRvd2VkIHx8IG1fbnBXaW5kb3cud2lkdGggPT0gVU5JTklUX0NPT1JEIHx8IG1fbnBXaW5kb3cu
aGVpZ2h0ID09IFVOSU5JVF9DT09SRCkgeworICAgICAgICAgICAgbV9ucFdpbmRvdy53aWR0aCA9
IG1fd2luZG93UmVjdC53aWR0aCgpOworICAgICAgICAgICAgbV9ucFdpbmRvdy5oZWlnaHQgPSBt
X3dpbmRvd1JlY3QuaGVpZ2h0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBt
X25wV2luZG93LndpZHRoID0gbV93aW5kb3dSZWN0LndpZHRoKCk7CisgICAgICAgIG1fbnBXaW5k
b3cuaGVpZ2h0ID0gbV93aW5kb3dSZWN0LmhlaWdodCgpOworICAgIH0KKworICAgIG1fbnBXaW5k
b3cudHlwZSA9IE5QV2luZG93VHlwZURyYXdhYmxlOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkdyYXBoaWNzOjpXaW5kb3cgKndpbmRvdyA9CisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdp
bmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+cGxhdGZvcm1XaW5kb3coKTsKKyAgICBpZiAo
d2luZG93KQorICAgICAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cu
d3NfaW5mbyktPndpbmRvd0dyb3VwID0gd2luZG93LT53aW5kb3dHcm91cCgpOworCisgICAgUGx1
Z2luVmlldzo6c2V0Q3VycmVudFBsdWdpblZpZXcodGhpcyk7CisgICAgSlNDOjpKU0xvY2s6OkRy
b3BBbGxMb2NrcyBkcm9wQWxsTG9ja3MoSlNDOjpTaWxlbmNlQXNzZXJ0aW9uc09ubHkpOworICAg
IHNldENhbGxpbmdQbHVnaW4odHJ1ZSk7CisgICAgLy8gRklYTUU6IFBhc3Npbmcgem9vbUZhY3Rv
ciB0byBzZXR3aW5kb3cgbWFrZSB3aW5kb3dlZCBwbHVnaW4gc2NhbGUgaW5jb3JyZWN0bHkuCisg
ICAgLy8gSGFuZGxpbmcgdGhlIHpvb20gZmFjdG9yIHByb3Blcmx5IGluIHRoZSBwbHVnaW4gc2lk
ZSBtYXkgYmUgYSBiZXR0ZXIgc29sdXRpb24uCisgICAgZG91YmxlIG9sZFpvb21GYWN0b3IgPSAo
KE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21GYWN0
b3I7CisgICAgKChOUFNldFdpbmRvd0NhbGxiYWNrU3RydWN0KiltX25wV2luZG93LndzX2luZm8p
LT56b29tRmFjdG9yID0gMS47CisgICAgbV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPnNldHdpbmRv
dyhtX2luc3RhbmNlLCAmbV9ucFdpbmRvdyk7CisgICAgKChOUFNldFdpbmRvd0NhbGxiYWNrU3Ry
dWN0KiltX25wV2luZG93LndzX2luZm8pLT56b29tRmFjdG9yID0gb2xkWm9vbUZhY3RvcjsKKyAg
ICBzZXRDYWxsaW5nUGx1Z2luKGZhbHNlKTsKKyAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1
Z2luVmlldygwKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpzZXRQYXJlbnRWaXNpYmxlKGJvb2wg
dmlzaWJsZSkKK3sKKyAgICBpZiAoaXNQYXJlbnRWaXNpYmxlKCkgPT0gdmlzaWJsZSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgV2lkZ2V0OjpzZXRQYXJlbnRWaXNpYmxlKHZpc2libGUpOworCisg
ICAgLy8gRklYTUU6IFdlIG1pZ2h0IHdhbnQgdG8gdGVsbCB0aGUgcGx1Z2luIHRvIGhpZGUgaXQn
cyB3aW5kb3cgaGVyZSwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyCisgICAgLy8gICAgICAgc2luY2Ug
dGhlIHdpbmRvdyBtYW5hZ2VyIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhhdCBmb3IgdXMuCit9CisK
K05QRXJyb3IgUGx1Z2luVmlldzo6aGFuZGxlUG9zdFJlYWRGaWxlKFZlY3RvcjxjaGFyPiYgYnVm
ZmVyLCB1aW50MzJfdCBsZW4sIGNvbnN0IGNoYXIqIGJ1ZikKK3sKKyAgICBTdHJpbmcgZmlsZW5h
bWUoYnVmLCBsZW4pOworCisgICAgaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoImZpbGU6Ly8vIikp
CisgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDgpOworCisgICAgbG9uZyBs
b25nIHNpemU7CisgICAgaWYgKCFnZXRGaWxlU2l6ZShmaWxlbmFtZSwgc2l6ZSkpCisgICAgICAg
IHJldHVybiBOUEVSUl9GSUxFX05PVF9GT1VORDsKKworICAgIEZJTEUqIGZpbGVIYW5kbGUgPSBm
b3BlbigoZmlsZW5hbWUudXRmOCgpKS5kYXRhKCksICJyIik7CisgICAgaWYgKCFmaWxlSGFuZGxl
KQorICAgICAgICByZXR1cm4gTlBFUlJfRklMRV9OT1RfRk9VTkQ7CisKKyAgICBidWZmZXIucmVz
aXplKHNpemUpOworICAgIGludCBieXRlc1JlYWQgPSBmcmVhZChidWZmZXIuZGF0YSgpLCAxLCBz
aXplLCBmaWxlSGFuZGxlKTsKKworICAgIGZjbG9zZShmaWxlSGFuZGxlKTsKKworICAgIGlmIChi
eXRlc1JlYWQgPD0gMCkKKyAgICAgICAgcmV0dXJuIE5QRVJSX0ZJTEVfTk9UX0ZPVU5EOworCisg
ICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworfQorCitib29sIFBsdWdpblZpZXc6OnBsYXRmb3Jt
R2V0VmFsdWVTdGF0aWMoTlBOVmFyaWFibGUgdmFyaWFibGUsIHZvaWQqIHZhbHVlLCBOUEVycm9y
KiByZXN1bHQpCit7CisgICAgc3dpdGNoICh2YXJpYWJsZSkgeworICAgIGNhc2UgTlBOVlRvb2xr
aXQ6CisgICAgICAgICpzdGF0aWNfY2FzdDx1aW50MzJfdCo+KHZhbHVlKSA9IDA7CisgICAgICAg
ICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBj
YXNlIE5QTlZTdXBwb3J0c1hFbWJlZEJvb2w6CisgICAgICAgICpzdGF0aWNfY2FzdDxOUEJvb2wq
Pih2YWx1ZSkgPSB0cnVlOworICAgICAgICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBOUE5WamF2YXNjcmlwdEVuYWJsZWRCb29sOgor
ICAgICAgICAqc3RhdGljX2Nhc3Q8TlBCb29sKj4odmFsdWUpID0gdHJ1ZTsKKyAgICAgICAgKnJl
c3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2Ug
TlBOVlN1cHBvcnRzV2luZG93bGVzczoKKyAgICAgICAgKnN0YXRpY19jYXN0PE5QQm9vbCo+KHZh
bHVlKSA9IHRydWU7CisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAg
cmV0dXJuIHRydWU7CisKKyAgICBjYXNlIE5QTlZOUENhbGxiYWNrc1B0cjogeworICAgICAgICAq
KCh2b2lkICoqKSB2YWx1ZSkgPSAodm9pZCopJnNfTnBDYWxsYmFja3M7CisgICAgICAgICpyZXN1
bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAg
ZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBQbHVnaW5W
aWV3OjpwbGF0Zm9ybUdldFZhbHVlKE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkKiB2YWx1ZSwg
TlBFcnJvciogcmVzdWx0KQoreworICAgIHN3aXRjaCAodmFyaWFibGUpIHsKKyAgICBjYXNlIE5Q
TlZab29tRmFjdG9yOiB7CisgICAgICAgICooKHZvaWQgKiopIHZhbHVlKSA9ICh2b2lkKikmKCgo
TlBTZXRXaW5kb3dDYWxsYmFja1N0cnVjdCopbV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3Rv
cik7CisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCisgICAgY2FzZSBOUE5WUm9vdFdpbmRvd0dyb3VwOiB7CisgICAgICAgIEZy
YW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOwor
ICAgICAgICBpZiAoZnJhbWVWaWV3KSB7CisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6R3JhcGhpY3M6OldpbmRvdyAqd2luZG93ID0KKyAgICAgICAgICAgICAgICBmcmFtZVZpZXct
Pmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnBsYXRmb3JtV2luZG93KCk7Cisg
ICAgICAgICAgICBpZiAod2luZG93KSB7CisgICAgICAgICAgICAgICAgdm9pZCoqIHYgPSAodm9p
ZCoqKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAqdiA9ICh2b2lkKikgd2luZG93LT5yb290R3Jv
dXAoKTsKKworICAgICAgICAgICAgICAgIGlmICgqdikgeworICAgICAgICAgICAgICAgICAgICAq
cmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAg
ICpyZXN1bHQgPSBOUEVSUl9HRU5FUklDX0VSUk9SOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgY2FzZSBOUE5WQnJvd3NlcldpbmRvd0dyb3VwOiB7CisgICAgICAgIEZyYW1l
VmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOworICAg
ICAgICBpZiAoZnJhbWVWaWV3KSB7CisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
R3JhcGhpY3M6OldpbmRvdyAqd2luZG93ID0KKyAgICAgICAgICAgICAgICBmcmFtZVZpZXctPmhv
c3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnBsYXRmb3JtV2luZG93KCk7CisgICAg
ICAgICAgICBpZiAod2luZG93KSB7CisgICAgICAgICAgICAgICAgdm9pZCoqIHYgPSAodm9pZCoq
KSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAqdiA9ICh2b2lkKikgd2luZG93LT53aW5kb3dHcm91
cCgpOworCisgICAgICAgICAgICAgICAgaWYgKCp2KSB7CisgICAgICAgICAgICAgICAgICAgICpy
ZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
KnJlc3VsdCA9IE5QRVJSX0dFTkVSSUNfRVJST1I7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICBjYXNlIE5QTlZCcm93c2VyRGlzcGxheUNvbnRleHQ6IHsKKyAgICAgICAgRnJh
bWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7Cisg
ICAgICAgIGlmIChmcmFtZVZpZXcpIHsKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpHcmFwaGljczo6UGxhdGZvcm1EaXNwbGF5Q29udGV4dEhhbmRsZSBjb250ZXh0ID0KKyAgICAg
ICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OnBsYXRmb3JtRGlzcGxh
eUNvbnRleHQoKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0KSB7CisgICAgICAgICAgICAgICAg
dm9pZCoqIHYgPSAodm9pZCoqKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAqdiA9ICh2b2lkKikg
Y29udGV4dDsKKworICAgICAgICAgICAgICAgIGlmICgqdikgeworICAgICAgICAgICAgICAgICAg
ICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg
ICAgICpyZXN1bHQgPSBOUEVSUl9HRU5FUklDX0VSUk9SOworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgY2FzZSBOUE5WUGx1Z2luV2luZG93UHJlZml4OiB7CisgICAgICAgIHZv
aWQqKiB2ID0gKHZvaWQqKikgdmFsdWU7CisgICAgICAgICp2ID0gKHZvaWQqKSBtX3ByaXZhdGUt
Pm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCk7CisKKyAgICAgICAgaWYgKCp2KSB7CisgICAg
ICAgICAgICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgfQorCisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9HRU5FUklDX0VSUk9SOwor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0
dXJuIHBsYXRmb3JtR2V0VmFsdWVTdGF0aWModmFyaWFibGUsIHZhbHVlLCByZXN1bHQpOworICAg
ICAgICAvLyBGSVhNRTogU2hvdWxkIHdlIHJldHVybiBmYWxzZT8KKyAgICB9Cit9CisKKy8vIFRo
aXMgaXMgYSBwdXJlIHZpcnR1YWwgaW5oZXJpdGVkIGZyb20gV2lkZ2V0IGNsYXNzIGFuZCBhbGwg
aW52YWxpZGF0ZXMKKy8vIGFyZSBmdW5uZWxlZCB0aHJvdWdoIHRoaXMgbWV0aG9kLiBXZSBmb3J3
YXJkIHRoZW0gb24gdG8gZWl0aGVyIHRoZQorLy8gY29tcG9zaXRpbmcgbGF5ZXIgb3IgdGhlIFBs
dWdpblZpZXc6OmludmFsaWRhdGVXaW5kb3dsZXNzUGx1Z2luUmVjdCBtZXRob2QuCit2b2lkIFBs
dWdpblZpZXc6OmludmFsaWRhdGVSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYg
KCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFJlY29yZCB0aGUgcmVnaW9u
IHRoYXQgd2UndmUgYmVlbiBhc2tlZCB0byBpbnZhbGlkYXRlCisgICAgbV9wcml2YXRlLT5tX2lu
dmFsaWRhdGVSZWdpb24gPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6dW5p
b25SZWdpb25zKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0KHJlY3QpLCBtX3ByaXZhdGUt
Pm1faW52YWxpZGF0ZVJlZ2lvbik7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisgICAgaWYgKG1fcHJpdmF0ZS0+bV9wbGF0Zm9ybUxheWVyKSB7CisgICAgICAgIG1fcHJpdmF0
ZS0+bV9wbGF0Zm9ybUxheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKyNlbmRpZgorCisgICAgaW52YWxpZGF0ZVdpbmRvd2xlc3NQbHVnaW5SZWN0KHJlY3Qp
OworfQorCit2b2lkIFBsdWdpblZpZXc6OmludmFsaWRhdGVSZWN0KE5QUmVjdCogcmVjdCkKK3sK
KyAgICBpZiAoIXJlY3QpIHsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICByZXR1cm47
CisgICAgfQorICAgIEludFJlY3QgcihyZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0
IC0gcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wKTsKKyAgICBpbnZhbGlkYXRl
UmVjdChyKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVnaW9uKE5QUmVnaW9u
IHJlZ2lvbikKK3sKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6Zm9y
Y2VSZWRyYXcoKQoreworICAgIGludmFsaWRhdGUoKTsKK30KKworYm9vbCBQbHVnaW5WaWV3Ojpw
bGF0Zm9ybVN0YXJ0KCkKK3sKKyAgICBBU1NFUlQobV9pc1N0YXJ0ZWQpOworICAgIEFTU0VSVCht
X3N0YXR1cyA9PSBQbHVnaW5TdGF0dXNMb2FkZWRTdWNjZXNzZnVsbHkpOworCisgICAgbV9wcml2
YXRlID0gbmV3IFBsdWdpblZpZXdQcml2YXRlKHRoaXMpOworCisgICAgaWYgKG1fcGx1Z2luLT5w
bHVnaW5GdW5jcygpLT5nZXR2YWx1ZSkgeworICAgICAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50
UGx1Z2luVmlldyh0aGlzKTsKKyAgICAgICAgSlNDOjpKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9w
QWxsTG9ja3MoSlNDOjpTaWxlbmNlQXNzZXJ0aW9uc09ubHkpOworICAgICAgICBzZXRDYWxsaW5n
UGx1Z2luKHRydWUpOworICAgICAgICBtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0dmFsdWUo
bV9pbnN0YW5jZSwgTlBQVnBsdWdpbk5lZWRzWEVtYmVkLCAmbV9uZWVkc1hFbWJlZCk7CisgICAg
ICAgIHNldENhbGxpbmdQbHVnaW4oZmFsc2UpOworICAgICAgICBQbHVnaW5WaWV3OjpzZXRDdXJy
ZW50UGx1Z2luVmlldygwKTsKKyAgICB9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisgICAgaWYgKG1fcGFyZW50RnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5h
bGxvd3NBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkKKyAgICAgICAgJiYgbV9wYXJlbnRGcmFtZS0+
cGFnZSgpLT5zZXR0aW5ncygpCisgICAgICAgICYmIG1fcGFyZW50RnJhbWUtPnBhZ2UoKS0+c2V0
dGluZ3MoKS0+YWNjZWxlcmF0ZWRDb21wb3NpdGluZ0VuYWJsZWQoKSkgeworICAgICAgICBtX3By
aXZhdGUtPm1fcGxhdGZvcm1MYXllciA9IFBsdWdpbkxheWVyV2ViS2l0VGhyZWFkOjpjcmVhdGUo
dGhpcyk7CisgICAgICAgIC8vIFRyaWdnZXIgbGF5ZXIgY29tcHV0YXRpb24gaW4gUmVuZGVyTGF5
ZXJDb21wb3NpdG9yCisgICAgICAgIG1fZWxlbWVudC0+c2V0TmVlZHNTdHlsZVJlY2FsYyhTeW50
aGV0aWNTdHlsZUNoYW5nZSk7CisgICAgfQorI2VuZGlmCisKKyAgICBtX25wV2luZG93LnR5cGUg
PSBOUFdpbmRvd1R5cGVEcmF3YWJsZTsKKyAgICBtX25wV2luZG93LndpbmRvdyA9IDA7IC8vIE5v
dCB1c2VkPworICAgIG1fbnBXaW5kb3cueCA9IDA7CisgICAgbV9ucFdpbmRvdy55ID0gMDsKKyAg
ICBtX25wV2luZG93LndpZHRoID0gVU5JTklUX0NPT1JEOworICAgIG1fbnBXaW5kb3cuaGVpZ2h0
ID0gVU5JTklUX0NPT1JEOworICAgIG1fbnBXaW5kb3cud3NfaW5mbyA9IG5ldyBOUFNldFdpbmRv
d0NhbGxiYWNrU3RydWN0OworICAgICgoTlBTZXRXaW5kb3dDYWxsYmFja1N0cnVjdCopbV9ucFdp
bmRvdy53c19pbmZvKS0+em9vbUZhY3RvciA9IDEuOworICAgICgoTlBTZXRXaW5kb3dDYWxsYmFj
a1N0cnVjdCopbV9ucFdpbmRvdy53c19pbmZvKS0+d2luZG93R3JvdXAgPSAwOworCisgICAgc2hv
dygpOworCisgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVW
aWV3Kj4ocGFyZW50KCkpKQorICAgICAgICBoYW5kbGVPcmllbnRhdGlvbkV2ZW50KGZyYW1lVmll
dy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+b3JpZW50YXRpb24oKSk7CisK
KyAgICBpZiAoIShtX3BsdWdpbi0+cXVpcmtzKCkuY29udGFpbnMoUGx1Z2luUXVpcmtEZWZlckZp
cnN0U2V0V2luZG93Q2FsbCkpKSB7CisgICAgICAgIHVwZGF0ZVBsdWdpbldpZGdldCgpOworICAg
ICAgICBzZXROUFdpbmRvd0lmTmVlZGVkKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9
CisKK3ZvaWQgUGx1Z2luVmlldzo6cGxhdGZvcm1EZXN0cm95KCkKK3sKKyAgICBpZiAoIW1fcHJp
dmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhpcyB3aWxsIHVubG9jayB0aGUgaWRs
ZSAoaWYgd2UgaGF2ZSBsb2NrZWQgaXQpLgorICAgIG1fcHJpdmF0ZS0+cHJldmVudElkbGUoZmFs
c2UpOworCisgICAgLy8gVGhpcyB3aWxsIHJlbGVhc2UgYW55IGtlZXBWaXNpYmxlUmVjdHMgaWYg
dGhleSB3ZXJlIHNldC4KKyAgICBtX3ByaXZhdGUtPmNsZWFyVmlzaWJsZVJlY3RzKCk7CisKKyAg
ICAvLyBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgd2UgdW5yZWdpc3RlcmVkIHRoZSBwbHVnaW4uCisg
ICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFy
ZW50KCkpKSB7CisgICAgICAgIGlmIChtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZykK
KyAgICAgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQo
KS0+b25QbHVnaW5TdG9wQmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVu
aXF1ZVByZWZpeC5jX3N0cigpKTsKKworICAgICAgICAvLyBJZiB3ZSB3ZXJlIHN0aWxsIGZ1bGxz
Y3JlZW4sIGVuc3VyZSB3ZSBub3RpZnkgZXZlcnlvbmUgd2UncmUgbm90LgorICAgICAgICBpZiAo
bV9wcml2YXRlLT5tX2lzRnVsbFNjcmVlbikKKyAgICAgICAgICAgIGZyYW1lVmlldy0+aG9zdFdp
bmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+ZGlkUGx1Z2luRXhpdEZ1bGxTY3JlZW4odGhp
cywgbV9wcml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKKworICAgICAgICBp
ZiAobV9wcml2YXRlLT5tX29yaWVudGF0aW9uTG9ja2VkKQorICAgICAgICAgICAgZnJhbWVWaWV3
LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT51bmxvY2tPcmllbnRhdGlvbigp
OworCisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQo
KS0+cmVnaXN0ZXJQbHVnaW4odGhpcywgZmFsc2UgLypzaG91bGRSZWdpc3RlciovKTsKKyAgICB9
CisKKyAgICBtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZyA9IGZhbHNlOworICAgIG1f
cHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4gPSBmYWxzZTsKKworICAgIGRlbGV0ZSBtX3ByaXZhdGU7
CisgICAgbV9wcml2YXRlID0gMDsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYWx0KCkKK3sKK30K
Kwordm9pZCBQbHVnaW5WaWV3OjpyZXN0YXJ0KCkKK3sKK30KKwordm9pZCBQbHVnaW5WaWV3Ojpn
ZXRXaW5kb3dJbmZvKFZlY3RvcjxQbHVnaW5XaW5kb3dJbmZvPiYgd2luZG93TGlzdCkKK3sKKyAg
ICBpZiAoIW1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5nZXR2YWx1ZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgdm9pZCogdmFsUHRyID0gMDsKKworICAgIFBsdWdpblZpZXc6OnNldEN1cnJlbnRQ
bHVnaW5WaWV3KHRoaXMpOworICAgIEpTQzo6SlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExv
Y2tzKEpTQzo6U2lsZW5jZUFzc2VydGlvbnNPbmx5KTsKKyAgICBzZXRDYWxsaW5nUGx1Z2luKHRy
dWUpOworICAgIG1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5nZXR2YWx1ZShtX2luc3RhbmNlLCBO
UFBWcGx1Z2luU2NyZWVuV2luZG93LCAmdmFsUHRyKTsKKyAgICBzZXRDYWxsaW5nUGx1Z2luKGZh
bHNlKTsKKyAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldygwKTsKKworICAgIGlm
ICghdmFsUHRyKQorICAgICAgICByZXR1cm47CisKKyAgICBOUFNjcmVlbldpbmRvd0hhbmRsZXMq
IHNjcmVlbldpbkhhbmRsZXMgPSAoTlBTY3JlZW5XaW5kb3dIYW5kbGVzKil2YWxQdHI7CisKKyAg
ICBmb3IgKGludCBpID0gMDsgaSA8IHNjcmVlbldpbkhhbmRsZXMtPm51bU9mV2luZG93czsgaSsr
KSB7CisgICAgICAgIFBsdWdpbldpbmRvd0luZm8gaW5mbzsKKyAgICAgICAgaW5mby53aW5kb3dQ
dHIgPSBzY3JlZW5XaW5IYW5kbGVzLT53aW5kb3dIYW5kbGVzW2ldOworCisgICAgICAgIE5QUmVj
dCogcmMgPSBzY3JlZW5XaW5IYW5kbGVzLT53aW5kb3dSZWN0c1tpXTsKKyAgICAgICAgaW5mby53
aW5kb3dSZWN0ID0gSW50UmVjdChyYy0+bGVmdCwgcmMtPnRvcCwgcmMtPnJpZ2h0IC0gcmMtPmxl
ZnQsIHJjLT5ib3R0b20gLSByYy0+dG9wKTsKKworICAgICAgICB3aW5kb3dMaXN0LmFwcGVuZChp
bmZvKTsKKyAgICB9Cit9CisKK0JsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVy
KiBQbHVnaW5WaWV3Ojpsb2NrRnJvbnRCdWZmZXJGb3JSZWFkKCkgY29uc3QKK3sKKyAgICBpZiAo
IW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6R3JhcGhpY3M6OkJ1ZmZlciogYnVmZmVyID0KKyAgICAgICAgbV9wcml2YXRlLT5sb2NrUmVh
ZEZyb250QnVmZmVySW50ZXJuYWwoKTsKKworICAgIGlmICghYnVmZmVyKQorICAgICAgICBtX3By
aXZhdGUtPnVubG9ja1JlYWRGcm9udEJ1ZmZlcigpOworCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30K
Kwordm9pZCBQbHVnaW5WaWV3Ojp1bmxvY2tGcm9udEJ1ZmZlcigpIGNvbnN0Cit7CisgICAgaWYg
KCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcHJpdmF0ZS0+dW5sb2NrUmVh
ZEZyb250QnVmZmVyKCk7Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCitQ
bGF0Zm9ybUxheWVyKiBQbHVnaW5WaWV3OjpwbGF0Zm9ybUxheWVyKCkgY29uc3QKK3sKKyAgICBp
ZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gbV9wcml2YXRl
LT5tX3BsYXRmb3JtTGF5ZXIuZ2V0KCk7Cit9CisjZW5kaWYKKworSW50UmVjdCBQbHVnaW5WaWV3
OjplbnN1cmVWaXNpYmxlUmVjdCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJl
dHVybiBJbnRSZWN0KCk7CisKKyAgICByZXR1cm4gbV9wcml2YXRlLT5tX2tlZXBWaXNpYmxlUmVj
dDsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpzZXRCYWNrZ3JvdW5kUGxheShib29sIHZhbHVlKQor
eworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9wcml2
YXRlLT5tX2lzQmFja2dyb3VuZFBsYXlpbmcgIT0gdmFsdWUpIHsKKyAgICAgICAgRnJhbWVWaWV3
KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3ByaXZhdGUtPm1fdmlldy0+
cGFyZW50KCkpOworICAgICAgICBtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZyA9IHZh
bHVlOworICAgICAgICBpZiAobV9wcml2YXRlLT5tX2lzQmFja2dyb3VuZFBsYXlpbmcpCisgICAg
ICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPm9u
UGx1Z2luU3RhcnRCYWNrZ3JvdW5kUGxheSh0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVl
UHJlZml4LmNfc3RyKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmcmFtZVZpZXctPmhv
c3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPm9uUGx1Z2luU3RvcEJhY2tncm91bmRQ
bGF5KHRoaXMsIG1fcHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19zdHIoKSk7CisgICAg
fQorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116879</attachid>
            <date>2011-11-28 20:47:05 -0800</date>
            <delta_ts>2011-11-28 22:03:43 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73185-20111129124755.patch</filename>
            <type>text/plain</type>
            <size>11723</size>
            <attacher name="Charles Wei">charles.wei</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwMTMyMikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI4IEBACisyMDExLTExLTI4ICBXZWkgQ2hh
cmxlcyAgPGNoYXJsZXMud2VpQHRvcmNobW9iaWxlLmNvbS5jbj4KKworICAgICAgICBbYmxhY2ti
ZXJyeV0gVXBzdHJlYW0gQmxhY2tCZXJyeSBwb3J0aW5nIG9mIHBsdWdpbiBmcmFtZXdvcmsKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczMTg1CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBp
cyB0byB1cHN0cmVhbSBCbGFja0JlcnJ5IHBvcnRpbmcgb2YgUGx1Z2luIGZyYW1ld29yay4KKyAg
ICAgICAgQmxhY2tCZXJyeSBwb3J0aW5nIG9mIHBsdWdpbiBoYXMgdGhlIGZvbGxvd2luZyBtYWlu
IGNvbnRyaWJ1dG9yczoKKworICAgICAgICBOaWNrIFJldGVsbGUgICAgPG5yYXRlbGxlQHJpbS5j
b20+CisgICAgICAgIEphY29iIFBldHNvdml0cyA8anBldHNvdml0c0ByaW0uY29tPgorICAgICAg
ICBBZGFtIFRyZWF0ICAgICAgPGF0cmVhdEByaW0uY29tPgorICAgICAgICBHZW5ldmlldmUgTWFy
ayAgPGdtYWtAcmltLmNvbT4KKyAgICAgICAgR2VvcmdlIFN0YWlrb3MgIDxnc3RhaWtvc0ByaW0u
Y29tPgorICAgICAgICBNaWtlIEZlbnRvbiAgICAgPG1pZmVudG9uQHJpbS5jb20+CisgICAgICAg
IEFydmlkIE5pbHNzb24gICA8YW5pbHNvbkByaW0uY29tPgorICAgICAgICBSb2JpbiBDYW8gICAg
ICAgPHJvYmluLmNhb0B0b3JjaG1vYmlsZS5jb20uY24+CisKKyAgICAgICAgTm8gbmV3IHRlc3Rz
IGZvciBub3cuCisKKyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnk6IEFkZGVkLgorICAgICAg
ICAqIHBsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5EYXRhQmxhY2tCZXJyeS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5QYWNrYWdlQmxhY2tCZXJyeS5jcHA6
IEFkZGVkLgorCiAyMDExLTExLTI4ICBWYW5nZWxpcyBLb2trZXZpcyAgPHZhbmdlbGlzQGNocm9t
aXVtLm9yZz4KIAogICAgICAgICBbY2hyb21pdW1dIERpc2FibGUgY29tcG9zaXRpbmcgZm9yIFJU
TCBwYWdlcyBldmVuIGluIGZvcmNlQ29tcG9zaXRpbmdNb2RlCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luRGF0YUJsYWNrQmVycnkuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5EYXRhQmxhY2tCZXJy
eS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkv
UGx1Z2luRGF0YUJsYWNrQmVycnkuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU5IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vu
c2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29m
dHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxv
b3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJQbHVnaW5EYXRhLmgiCisKKyNpbmNsdWRlICJQbHVnaW5EYXRhYmFzZS5o
IgorI2luY2x1ZGUgIlBsdWdpblBhY2thZ2UuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2
b2lkIFBsdWdpbkRhdGE6OmluaXRQbHVnaW5zKGNvbnN0IFBhZ2UqKQoreworICAgIFBsdWdpbkRh
dGFiYXNlKiBkYiA9IFBsdWdpbkRhdGFiYXNlOjppbnN0YWxsZWRQbHVnaW5zKCk7CisgICAgY29u
c3QgVmVjdG9yPFBsdWdpblBhY2thZ2UqPiYgcGx1Z2lucyA9IGRiLT5wbHVnaW5zKCk7CisKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcGx1Z2lucy5zaXplKCk7ICsraSkgeworICAgICAg
ICBQbHVnaW5QYWNrYWdlKiBwYWNrYWdlID0gcGx1Z2luc1tpXTsKKworICAgICAgICBQbHVnaW5J
bmZvIGluZm87CisgICAgICAgIGluZm8ubmFtZSA9IHBhY2thZ2UtPm5hbWUoKTsKKyAgICAgICAg
aW5mby5maWxlID0gcGFja2FnZS0+ZmlsZU5hbWUoKTsKKyAgICAgICAgaW5mby5kZXNjID0gcGFj
a2FnZS0+ZGVzY3JpcHRpb24oKTsKKworICAgICAgICBjb25zdCBNSU1FVG9EZXNjcmlwdGlvbnNN
YXAmIG1pbWVUb0Rlc2NyaXB0aW9ucyA9IHBhY2thZ2UtPm1pbWVUb0Rlc2NyaXB0aW9ucygpOwor
ICAgICAgICBNSU1FVG9EZXNjcmlwdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1pbWVU
b0Rlc2NyaXB0aW9ucy5lbmQoKTsKKyAgICAgICAgZm9yIChNSU1FVG9EZXNjcmlwdGlvbnNNYXA6
OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWltZVRvRGVzY3JpcHRpb25zLmJlZ2luKCk7IGl0ICE9IGVu
ZDsgKytpdCkgeworICAgICAgICAgICAgTWltZUNsYXNzSW5mbyBtaW1lOworICAgICAgICAgICAg
bWltZS50eXBlID0gaXQtPmZpcnN0OworICAgICAgICAgICAgbWltZS5kZXNjID0gaXQtPnNlY29u
ZDsKKyAgICAgICAgICAgIG1pbWUuZXh0ZW5zaW9ucyA9IHBhY2thZ2UtPm1pbWVUb0V4dGVuc2lv
bnMoKS5nZXQobWltZS50eXBlKTsKKyAgICAgICAgICAgIGluZm8ubWltZXMuYXBwZW5kKG1pbWUp
OworICAgICAgICB9CisgICAgICAgIG1fcGx1Z2lucy5hcHBlbmQoaW5mbyk7CisgICAgfQorfQor
Cit2b2lkIFBsdWdpbkRhdGE6OnJlZnJlc2goKQoreworICAgIFBsdWdpbkRhdGFiYXNlKiBkYiA9
IFBsdWdpbkRhdGFiYXNlOjppbnN0YWxsZWRQbHVnaW5zKCk7CisgICAgZGItPnJlZnJlc2goKTsK
K30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGx1Z2lu
cy9ibGFja2JlcnJ5L1BsdWdpblBhY2thZ2VCbGFja0JlcnJ5LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luUGFja2FnZUJsYWNrQmVycnku
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1Bs
dWdpblBhY2thZ2VCbGFja0JlcnJ5LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNTkgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBDb2xsYWJvcmEgTHRkLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1p
dGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiUGx1Z2luUGFja2FnZS5oIgorCisjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5o
IgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGx1Z2luRGVidWcuaCIK
KyNpbmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNs
dWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHd0Zi9TdHJpbmdI
YXNoZXIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK2V4dGVybiBpbnQgZXJy
bm87CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBucG5NZW1GcmVlKHZvaWQqIHB0cikK
K3sKKyAgICAvLyBXZSBjb3VsZCB1c2UgZmFzdEZyZWUgaGVyZSwgYnV0IHRoZXJlIG1pZ2h0IGJl
IHBsdWctaW5zIHRoYXQgbWl4IE5QTl9NZW1BbGxvYy9OUE5fTWVtRnJlZSB3aXRoIG1hbGxvYyBh
bmQgZnJlZSwKKyAgICAvLyBzbyBoYXZpbmcgdGhlbSBiZSBlcXVpdmFsZW50IHNlZW1zIGxpa2Ug
YSBnb29kIGlkZWEuCisgICAgZnJlZShwdHIpOworfQorCitib29sIFBsdWdpblBhY2thZ2U6OmVx
dWFsKFBsdWdpblBhY2thZ2UgY29uc3QmIGEsIFBsdWdpblBhY2thZ2UgY29uc3QmIGIpCit7Cisg
ICAgaWYgKGEubV9uYW1lICE9IGIubV9uYW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBpZiAoYS5tX2Rlc2NyaXB0aW9uICE9IGIubV9kZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKGEubV9taW1lVG9FeHRlbnNpb25zLnNpemUoKSAhPSBiLm1fbWlt
ZVRvRXh0ZW5zaW9ucy5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIE1JTUVU
b0V4dGVuc2lvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yOjpLZXlzIGVuZCA9IGEubV9taW1lVG9FeHRl
bnNpb25zLmVuZCgpLmtleXMoKTsKKyAgICBmb3IgKE1JTUVUb0V4dGVuc2lvbnNNYXA6OmNvbnN0
X2l0ZXJhdG9yOjpLZXlzIGl0ID0gYS5tX21pbWVUb0V4dGVuc2lvbnMuYmVnaW4oKS5rZXlzKCk7
IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoIWIubV9taW1lVG9FeHRlbnNpb25zLmNv
bnRhaW5zKCppdCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK2Jvb2wgUGx1Z2luUGFja2FnZTo6ZmV0Y2hJbmZvKCkKK3sKKyAgICBp
ZiAoIWxvYWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6IEZpbmQg
YSBiZXR0ZXIgd2F5IHRvIGdldCBhcm91bmQgdGhlIGZldGNoaW5mbyBsb2FkLgorICAgIC8vIFdl
IGFyZSBmZXRjaGluZyB0aGUgaW5mby4gVGVjaG5pY2FsbHkgd2UgaGF2ZSBub3QgbG9hZGVkIHRo
ZSBwbHVnaW4uIFBsdWdpblZpZXc6OkluaXQgd2lsbCBsb2FkIHRoZSBwbHVnaW4gc28gZGVjcmVt
ZW50IHRoZSBjb3VudGVyCisgICAgbV9sb2FkQ291bnQtLTsKKworICAgIHR5cGVkZWYgY2hhciAq
KCpOUFBfR2V0TUlNRURlc2NyaXB0aW9uUHJvY1B0cikoKTsKKyAgICBOUFBfR2V0TUlNRURlc2Ny
aXB0aW9uUHJvY1B0ciBnbSA9IChOUFBfR2V0TUlNRURlc2NyaXB0aW9uUHJvY1B0cikgZGxzeW0o
bV9tb2R1bGUsICJOUF9HZXRNSU1FRGVzY3JpcHRpb24iKTsKKyAgICBOUFBfR2V0VmFsdWVQcm9j
UHRyIGd2ID0gKE5QUF9HZXRWYWx1ZVByb2NQdHIpIGRsc3ltKG1fbW9kdWxlLCAiTlBfR2V0VmFs
dWUiKTsKKworICAgIGlmICghZ20gfHwgIWd2KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBjaGFyKiBidWYgPSAwOworICAgIE5QRXJyb3IgZXJyID0gZ3YoMCwgTlBQVnBsdWdpbk5hbWVT
dHJpbmcsICh2b2lkICopICZidWYpOworICAgIGlmIChlcnIgIT0gTlBFUlJfTk9fRVJST1IpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1fbmFtZSA9IGJ1ZjsKKworICAgIGVyciA9IGd2
KDAsIE5QUFZwbHVnaW5EZXNjcmlwdGlvblN0cmluZywgKHZvaWQgKikgJmJ1Zik7CisgICAgaWYg
KGVyciAhPSBOUEVSUl9OT19FUlJPUikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbV9k
ZXNjcmlwdGlvbiA9IGJ1ZjsKKyAgICBkZXRlcm1pbmVNb2R1bGVWZXJzaW9uRnJvbURlc2NyaXB0
aW9uKCk7CisKKyAgICBTdHJpbmcgcyA9IGdtKCk7CisgICAgVmVjdG9yPFN0cmluZz4gdHlwZXM7
CisgICAgcy5zcGxpdChVQ2hhcignOycpLCBmYWxzZSwgdHlwZXMpOworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7ICsraSkgeworICAgICAgICBWZWN0b3I8U3RyaW5n
PiBtaW1lOworICAgICAgICB0eXBlc1tpXS5zcGxpdChVQ2hhcignOicpLCB0cnVlLCBtaW1lKTsK
KyAgICAgICAgaWYgKG1pbWUuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgVmVjdG9yPFN0cmlu
Zz4gZXh0czsKKyAgICAgICAgICAgIGlmIChtaW1lLnNpemUoKSA+IDEpCisgICAgICAgICAgICAg
ICAgbWltZVsxXS5zcGxpdChVQ2hhcignLCcpLCBmYWxzZSwgZXh0cyk7CisgICAgICAgICAgICBk
ZXRlcm1pbmVRdWlya3MobWltZVswXSk7CisgICAgICAgICAgICBtX21pbWVUb0V4dGVuc2lvbnMu
YWRkKG1pbWVbMF0sIGV4dHMpOworICAgICAgICAgICAgaWYgKG1pbWUuc2l6ZSgpID4gMikKKyAg
ICAgICAgICAgICAgICBtX21pbWVUb0Rlc2NyaXB0aW9ucy5hZGQobWltZVswXSwgbWltZVsyXSk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworVmVjdG9yPFN0cmlu
Zz4gUGx1Z2luUGFja2FnZTo6c2l0ZXNXaXRoRGF0YSgpCit7CisgICAgVmVjdG9yPFN0cmluZz4g
c2l0ZXM7CisgICAgdHJ5R2V0U2l0ZXNXaXRoRGF0YShzaXRlcyk7CisKKyAgICByZXR1cm4gc2l0
ZXM7Cit9CisKK2Jvb2wgUGx1Z2luUGFja2FnZTo6Y2xlYXJTaXRlRGF0YShjb25zdCBTdHJpbmcm
IHNpdGUsIHVpbnQ2NF90IGZsYWdzLCB1aW50NjRfdCBtYXhBZ2UpCit7CisgICAgYm9vbCByZXN1
bHQgPSB0cnlDbGVhclNpdGVEYXRhKHNpdGUsIGZsYWdzLCBtYXhBZ2UpOworCisgICAgcmV0dXJu
IHJlc3VsdDsKK30KKworYm9vbCBQbHVnaW5QYWNrYWdlOjp0cnlHZXRTaXRlc1dpdGhEYXRhKFZl
Y3RvcjxTdHJpbmc+JiBzaXRlcykKK3sKKyAgICBpZiAoIWxvYWQoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgLy8gRklYTUU6IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGVuc3VyZSB0aGUg
cGx1Z2luIGlzIGxvYWRlZC4KKyAgICAvLyBQbHVnaW5WaWV3OjpJbml0IHdpbGwgbG9hZCB0aGUg
cGx1Z2luIHNvIGRlY3JlbWVudCB0aGUgY291bnRlcgorICAgIG1fbG9hZENvdW50LS07CisKKyAg
ICAvLyBDaGVjayBpZiB0aGUgcGx1Zy1pbiBzdXBwb3J0cyBOUFBfR2V0U2l0ZXNXaXRoRGF0YS4K
KyAgICBpZiAoIW1fcGx1Z2luRnVuY3MuZ2V0c2l0ZXN3aXRoZGF0YSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgY2hhcioqIHNpdGVBcnJheSA9IG1fcGx1Z2luRnVuY3MuZ2V0c2l0ZXN3
aXRoZGF0YSgpOworCisgICAgLy8gVGhlcmUgd2VyZSBubyBzaXRlcyB3aXRoIGRhdGEuCisgICAg
aWYgKCFzaXRlQXJyYXkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgZm9yIChpbnQgaSA9
IDA7IHNpdGVBcnJheVtpXTsgKytpKSB7CisgICAgICAgIGNoYXIqIHNpdGUgPSBzaXRlQXJyYXlb
aV07CisKKyAgICAgICAgU3RyaW5nIHNpdGVTdHJpbmcgPSBTdHJpbmc6OmZyb21VVEY4KHNpdGUp
OworICAgICAgICBpZiAoIXNpdGVTdHJpbmcuaXNOdWxsKCkpCisgICAgICAgICAgICBzaXRlcy5h
cHBlbmQoc2l0ZVN0cmluZyk7CisKKyAgICAgICAgbnBuTWVtRnJlZShzaXRlKTsKKyAgICB9CisK
KyAgICBucG5NZW1GcmVlKHNpdGVBcnJheSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wg
UGx1Z2luUGFja2FnZTo6dHJ5Q2xlYXJTaXRlRGF0YShjb25zdCBTdHJpbmcmIHNpdGUsIHVpbnQ2
NF90IGZsYWdzLCB1aW50NjRfdCBtYXhBZ2UpCit7CisgICAgaWYgKCFsb2FkKCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIC8vIEZJWE1FOiBGaW5kIGEgYmV0dGVyIHdheSB0byBlbnN1
cmUgdGhlIHBsdWdpbiBpcyBsb2FkZWQuCisgICAgLy8gUGx1Z2luVmlldzo6SW5pdCB3aWxsIGxv
YWQgdGhlIHBsdWdpbiBzbyBkZWNyZW1lbnQgdGhlIGNvdW50ZXIKKyAgICBtX2xvYWRDb3VudC0t
OworCisgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWctaW4gc3VwcG9ydHMgTlBQX0NsZWFyU2l0ZURh
dGEuCisgICAgaWYgKCFtX3BsdWdpbkZ1bmNzLmNsZWFyc2l0ZWRhdGEpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIENTdHJpbmcgc2l0ZVN0cmluZzsKKyAgICBpZiAoIXNpdGUuaXNOdWxs
KCkpCisgICAgICAgIHNpdGVTdHJpbmcgPSBzaXRlLnV0ZjgoKTsKKworICAgIHJldHVybiBtX3Bs
dWdpbkZ1bmNzLmNsZWFyc2l0ZWRhdGEoc2l0ZVN0cmluZy5kYXRhKCksIGZsYWdzLCBtYXhBZ2Up
ID09IE5QRVJSX05PX0VSUk9SOworfQorCit1bnNpZ25lZCBQbHVnaW5QYWNrYWdlOjpoYXNoKCkg
Y29uc3QKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBoYXNoQ29kZXNbXSA9IHsKKyAgICAgICAgbV9u
YW1lLmltcGwoKS0+aGFzaCgpLAorICAgICAgICBtX2Rlc2NyaXB0aW9uLmltcGwoKS0+aGFzaCgp
LAorICAgICAgICBtX21pbWVUb0V4dGVuc2lvbnMuc2l6ZSgpCisgICAgfTsKKworICAgIHJldHVy
biBTdHJpbmdIYXNoZXI6OmNvbXB1dGVIYXNoKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUNoYXIq
PihoYXNoQ29kZXMpLCBzaXplb2YoaGFzaENvZGVzKSAvIHNpemVvZihVQ2hhcikpOworfQorCiti
b29sIFBsdWdpblBhY2thZ2U6OmxvYWQoKQoreworICAgIGlmIChtX2lzTG9hZGVkKSB7CisgICAg
ICAgIG1fbG9hZENvdW50Kys7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlm
IChtX2ZyZWVMaWJyYXJ5VGltZXIuaXNBY3RpdmUoKSkgeworICAgICAgICBBU1NFUlQobV9tb2R1
bGUpOworICAgICAgICBtX2ZyZWVMaWJyYXJ5VGltZXIuc3RvcCgpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIEFTU0VSVCghbV9sb2FkQ291bnQpOworICAgICAgICBtX21vZHVsZSA9IGRsb3Blbiht
X3BhdGgudXRmOCgpLmRhdGEoKSwgUlRMRF9MQVpZKTsKKyAgICB9CisKKyAgICBpZiAoIW1fbW9k
dWxlKSB7CisgICAgICAgIExPRyhQbHVnaW5zLCAiJXMgbm90IGxvYWRlZCAoJXMpIiwgbV9wYXRo
LnV0ZjgoKS5kYXRhKCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHByaW50ZigiUGx1Z2lu
UGFja2FnZTo6bG9hZCgpIC0gJXMgbm90IGxvYWRlZCAoJXMpIiwgbV9wYXRoLnV0ZjgoKS5kYXRh
KCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICBtX2lzTG9hZGVkID0gdHJ1ZTsKKworICAgIE5QX0luaXRpYWxpemVGdW5jUHRyIE5QX0luaXRp
YWxpemU7CisgICAgTlBFcnJvciBucEVycjsKKworICAgIE5QX0luaXRpYWxpemUgPSAoTlBfSW5p
dGlhbGl6ZUZ1bmNQdHIpZGxzeW0obV9tb2R1bGUsICJOUF9Jbml0aWFsaXplIik7CisgICAgbV9O
UFBfU2h1dGRvd24gPSAoTlBQX1NodXRkb3duUHJvY1B0cilkbHN5bShtX21vZHVsZSwgIk5QX1No
dXRkb3duIik7CisKKyAgICBpZiAoIU5QX0luaXRpYWxpemUgfHwgIW1fTlBQX1NodXRkb3duKQor
ICAgICAgICBnb3RvIGFib3J0OworCisgICAgbWVtc2V0KCZtX3BsdWdpbkZ1bmNzLCAwLCBzaXpl
b2YobV9wbHVnaW5GdW5jcykpOworICAgIG1fcGx1Z2luRnVuY3Muc2l6ZSA9IHNpemVvZihtX3Bs
dWdpbkZ1bmNzKTsKKworICAgIGluaXRpYWxpemVCcm93c2VyRnVuY3MoKTsKKworICAgIG5wRXJy
ID0gTlBfSW5pdGlhbGl6ZSgmbV9icm93c2VyRnVuY3MsICAmbV9wbHVnaW5GdW5jcyk7CisKKyAg
ICBpZiAobnBFcnIgIT0gTlBFUlJfTk9fRVJST1IpCisgICAgICAgIGdvdG8gYWJvcnQ7CisKKyAg
ICBtX2xvYWRDb3VudCA9IDE7CisgICAgcmV0dXJuIHRydWU7CisKK2Fib3J0OgorICAgIHVubG9h
ZFdpdGhvdXRTaHV0ZG93bigpOworICAgIHJldHVybiBmYWxzZTsKK30KKworI2lmIEVOQUJMRShO
RVRTQ0FQRV9QTFVHSU5fQVBJKQordWludDE2X3QgUGx1Z2luUGFja2FnZTo6TlBWZXJzaW9uKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gTlBWRVJTX0hBU19QTFVHSU5fVEhSRUFEX0FTWU5DX0NBTEw7
Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>116892</attachid>
            <date>2011-11-28 22:04:00 -0800</date>
            <delta_ts>2011-11-29 18:50:33 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73185-20111129140451.patch</filename>
            <type>text/plain</type>
            <size>11282</size>
            <attacher name="Charles Wei">charles.wei</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwMTMyNSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE2IEBACisyMDExLTExLTI4ICBXZWkgQ2hh
cmxlcyAgPGNoYXJsZXMud2VpQHRvcmNobW9iaWxlLmNvbS5jbj4KKworICAgICAgICBbYmxhY2ti
ZXJyeV0gVXBzdHJlYW0gQmxhY2tCZXJyeSBwb3J0aW5nIG9mIHBsdWdpbiBmcmFtZXdvcmsKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczMTg1CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3Rz
IGZvciBub3cuCisKKyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnk6IEFkZGVkLgorICAgICAg
ICAqIHBsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5EYXRhQmxhY2tCZXJyeS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5QYWNrYWdlQmxhY2tCZXJyeS5jcHA6
IEFkZGVkLgorCiAyMDExLTExLTI4ICBTdGVwaGVuIFdoaXRlICA8c2Vub3JibGFuY29AY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFtjaHJvbWl1bV0gRml4IFNWRyBmaWx0ZXJzIHdoZW4gcnVubmlu
ZyBpbiBhY2NlbGVyYXRlZCBkcmF3aW5nIG1vZGUuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbHVn
aW5zL2JsYWNrYmVycnkvUGx1Z2luRGF0YUJsYWNrQmVycnkuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5EYXRhQmxhY2tCZXJyeS5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2lu
RGF0YUJsYWNrQmVycnkuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDU5IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK
KyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJv
c3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJQbHVnaW5EYXRhLmgiCisKKyNpbmNsdWRlICJQbHVnaW5EYXRhYmFzZS5oIgorI2lu
Y2x1ZGUgIlBsdWdpblBhY2thZ2UuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIFBs
dWdpbkRhdGE6OmluaXRQbHVnaW5zKGNvbnN0IFBhZ2UqKQoreworICAgIFBsdWdpbkRhdGFiYXNl
KiBkYiA9IFBsdWdpbkRhdGFiYXNlOjppbnN0YWxsZWRQbHVnaW5zKCk7CisgICAgY29uc3QgVmVj
dG9yPFBsdWdpblBhY2thZ2UqPiYgcGx1Z2lucyA9IGRiLT5wbHVnaW5zKCk7CisKKyAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgcGx1Z2lucy5zaXplKCk7ICsraSkgeworICAgICAgICBQbHVn
aW5QYWNrYWdlKiBwYWNrYWdlID0gcGx1Z2luc1tpXTsKKworICAgICAgICBQbHVnaW5JbmZvIGlu
Zm87CisgICAgICAgIGluZm8ubmFtZSA9IHBhY2thZ2UtPm5hbWUoKTsKKyAgICAgICAgaW5mby5m
aWxlID0gcGFja2FnZS0+ZmlsZU5hbWUoKTsKKyAgICAgICAgaW5mby5kZXNjID0gcGFja2FnZS0+
ZGVzY3JpcHRpb24oKTsKKworICAgICAgICBjb25zdCBNSU1FVG9EZXNjcmlwdGlvbnNNYXAmIG1p
bWVUb0Rlc2NyaXB0aW9ucyA9IHBhY2thZ2UtPm1pbWVUb0Rlc2NyaXB0aW9ucygpOworICAgICAg
ICBNSU1FVG9EZXNjcmlwdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1pbWVUb0Rlc2Ny
aXB0aW9ucy5lbmQoKTsKKyAgICAgICAgZm9yIChNSU1FVG9EZXNjcmlwdGlvbnNNYXA6OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gbWltZVRvRGVzY3JpcHRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytp
dCkgeworICAgICAgICAgICAgTWltZUNsYXNzSW5mbyBtaW1lOworICAgICAgICAgICAgbWltZS50
eXBlID0gaXQtPmZpcnN0OworICAgICAgICAgICAgbWltZS5kZXNjID0gaXQtPnNlY29uZDsKKyAg
ICAgICAgICAgIG1pbWUuZXh0ZW5zaW9ucyA9IHBhY2thZ2UtPm1pbWVUb0V4dGVuc2lvbnMoKS5n
ZXQobWltZS50eXBlKTsKKyAgICAgICAgICAgIGluZm8ubWltZXMuYXBwZW5kKG1pbWUpOworICAg
ICAgICB9CisgICAgICAgIG1fcGx1Z2lucy5hcHBlbmQoaW5mbyk7CisgICAgfQorfQorCit2b2lk
IFBsdWdpbkRhdGE6OnJlZnJlc2goKQoreworICAgIFBsdWdpbkRhdGFiYXNlKiBkYiA9IFBsdWdp
bkRhdGFiYXNlOjppbnN0YWxsZWRQbHVnaW5zKCk7CisgICAgZGItPnJlZnJlc2goKTsKK30KKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFj
a2JlcnJ5L1BsdWdpblBhY2thZ2VCbGFja0JlcnJ5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luUGFja2FnZUJsYWNrQmVycnkuY3BwCShy
ZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1BsdWdpblBh
Y2thZ2VCbGFja0JlcnJ5LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBDb2xsYWJvcmEgTHRkLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiUGx1Z2luUGFja2FnZS5oIgorCisjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgorI2lu
Y2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGx1Z2luRGVidWcuaCIKKyNpbmNs
dWRlICJucHJ1bnRpbWVfaW1wbC5oIgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxl
cnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHd0Zi9TdHJpbmdIYXNoZXIu
aD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK2V4dGVybiBpbnQgZXJybm87CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBucG5NZW1GcmVlKHZvaWQqIHB0cikKK3sKKyAg
ICAvLyBXZSBjb3VsZCB1c2UgZmFzdEZyZWUgaGVyZSwgYnV0IHRoZXJlIG1pZ2h0IGJlIHBsdWct
aW5zIHRoYXQgbWl4IE5QTl9NZW1BbGxvYy9OUE5fTWVtRnJlZSB3aXRoIG1hbGxvYyBhbmQgZnJl
ZSwKKyAgICAvLyBzbyBoYXZpbmcgdGhlbSBiZSBlcXVpdmFsZW50IHNlZW1zIGxpa2UgYSBnb29k
IGlkZWEuCisgICAgZnJlZShwdHIpOworfQorCitib29sIFBsdWdpblBhY2thZ2U6OmVxdWFsKFBs
dWdpblBhY2thZ2UgY29uc3QmIGEsIFBsdWdpblBhY2thZ2UgY29uc3QmIGIpCit7CisgICAgaWYg
KGEubV9uYW1lICE9IGIubV9uYW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAo
YS5tX2Rlc2NyaXB0aW9uICE9IGIubV9kZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgaWYgKGEubV9taW1lVG9FeHRlbnNpb25zLnNpemUoKSAhPSBiLm1fbWltZVRvRXh0
ZW5zaW9ucy5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIE1JTUVUb0V4dGVu
c2lvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yOjpLZXlzIGVuZCA9IGEubV9taW1lVG9FeHRlbnNpb25z
LmVuZCgpLmtleXMoKTsKKyAgICBmb3IgKE1JTUVUb0V4dGVuc2lvbnNNYXA6OmNvbnN0X2l0ZXJh
dG9yOjpLZXlzIGl0ID0gYS5tX21pbWVUb0V4dGVuc2lvbnMuYmVnaW4oKS5rZXlzKCk7IGl0ICE9
IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoIWIubV9taW1lVG9FeHRlbnNpb25zLmNvbnRhaW5z
KCppdCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK2Jvb2wgUGx1Z2luUGFja2FnZTo6ZmV0Y2hJbmZvKCkKK3sKKyAgICBpZiAoIWxv
YWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6IEZpbmQgYSBiZXR0
ZXIgd2F5IHRvIGdldCBhcm91bmQgdGhlIGZldGNoaW5mbyBsb2FkLgorICAgIC8vIFdlIGFyZSBm
ZXRjaGluZyB0aGUgaW5mby4gVGVjaG5pY2FsbHkgd2UgaGF2ZSBub3QgbG9hZGVkIHRoZSBwbHVn
aW4uIFBsdWdpblZpZXc6OkluaXQgd2lsbCBsb2FkIHRoZSBwbHVnaW4gc28gZGVjcmVtZW50IHRo
ZSBjb3VudGVyCisgICAgbV9sb2FkQ291bnQtLTsKKworICAgIHR5cGVkZWYgY2hhciAqKCpOUFBf
R2V0TUlNRURlc2NyaXB0aW9uUHJvY1B0cikoKTsKKyAgICBOUFBfR2V0TUlNRURlc2NyaXB0aW9u
UHJvY1B0ciBnZXREZXNjcmlwdGlvbiA9IChOUFBfR2V0TUlNRURlc2NyaXB0aW9uUHJvY1B0cikg
ZGxzeW0obV9tb2R1bGUsICJOUF9HZXRNSU1FRGVzY3JpcHRpb24iKTsKKyAgICBOUFBfR2V0VmFs
dWVQcm9jUHRyIGdldFZhbHVlID0gKE5QUF9HZXRWYWx1ZVByb2NQdHIpIGRsc3ltKG1fbW9kdWxl
LCAiTlBfR2V0VmFsdWUiKTsKKworICAgIGlmICghZ2V0RGVzY3JpcHRpb24gfHwgIWdldFZhbHVl
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjaGFyKiBidWYgPSAwOworICAgIE5QRXJy
b3IgZXJyID0gZ2V0VmFsdWUoMCwgTlBQVnBsdWdpbk5hbWVTdHJpbmcsICh2b2lkICopICZidWYp
OworICAgIGlmIChlcnIgIT0gTlBFUlJfTk9fRVJST1IpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIG1fbmFtZSA9IGJ1ZjsKKworICAgIGVyciA9IGdldFZhbHVlKDAsIE5QUFZwbHVnaW5E
ZXNjcmlwdGlvblN0cmluZywgKHZvaWQgKikgJmJ1Zik7CisgICAgaWYgKGVyciAhPSBOUEVSUl9O
T19FUlJPUikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbV9kZXNjcmlwdGlvbiA9IGJ1
ZjsKKyAgICBkZXRlcm1pbmVNb2R1bGVWZXJzaW9uRnJvbURlc2NyaXB0aW9uKCk7CisKKyAgICBT
dHJpbmcgcyA9IGdldERlc2NyaXB0aW9uKCk7CisgICAgVmVjdG9yPFN0cmluZz4gdHlwZXM7Cisg
ICAgcy5zcGxpdChVQ2hhcignOycpLCBmYWxzZSwgdHlwZXMpOworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7ICsraSkgeworICAgICAgICBWZWN0b3I8U3RyaW5nPiBt
aW1lOworICAgICAgICB0eXBlc1tpXS5zcGxpdChVQ2hhcignOicpLCB0cnVlLCBtaW1lKTsKKyAg
ICAgICAgaWYgKG1pbWUuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgVmVjdG9yPFN0cmluZz4g
ZXh0ZW5zaW9uczsKKyAgICAgICAgICAgIGlmIChtaW1lLnNpemUoKSA+IDEpCisgICAgICAgICAg
ICAgICAgbWltZVsxXS5zcGxpdChVQ2hhcignLCcpLCBmYWxzZSwgZXh0ZW5zaW9ucyk7CisgICAg
ICAgICAgICBkZXRlcm1pbmVRdWlya3MobWltZVswXSk7CisgICAgICAgICAgICBtX21pbWVUb0V4
dGVuc2lvbnMuYWRkKG1pbWVbMF0sIGV4dGVuc2lvbnMpOworICAgICAgICAgICAgaWYgKG1pbWUu
c2l6ZSgpID4gMikKKyAgICAgICAgICAgICAgICBtX21pbWVUb0Rlc2NyaXB0aW9ucy5hZGQobWlt
ZVswXSwgbWltZVsyXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworVmVjdG9yPFN0cmluZz4gUGx1Z2luUGFja2FnZTo6c2l0ZXNXaXRoRGF0YSgpCit7CisgICAg
VmVjdG9yPFN0cmluZz4gc2l0ZXM7CisgICAgdHJ5R2V0U2l0ZXNXaXRoRGF0YShzaXRlcyk7CisK
KyAgICByZXR1cm4gc2l0ZXM7Cit9CisKK2Jvb2wgUGx1Z2luUGFja2FnZTo6Y2xlYXJTaXRlRGF0
YShjb25zdCBTdHJpbmcmIHNpdGUsIHVpbnQ2NF90IGZsYWdzLCB1aW50NjRfdCBtYXhBZ2UpCit7
CisgICAgYm9vbCByZXN1bHQgPSB0cnlDbGVhclNpdGVEYXRhKHNpdGUsIGZsYWdzLCBtYXhBZ2Up
OworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBQbHVnaW5QYWNrYWdlOjp0cnlHZXRT
aXRlc1dpdGhEYXRhKFZlY3RvcjxTdHJpbmc+JiBzaXRlcykKK3sKKyAgICBpZiAoIWxvYWQoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6IEZpbmQgYSBiZXR0ZXIgd2F5
IHRvIGVuc3VyZSB0aGUgcGx1Z2luIGlzIGxvYWRlZC4KKyAgICAvLyBQbHVnaW5WaWV3OjpJbml0
IHdpbGwgbG9hZCB0aGUgcGx1Z2luIHNvIGRlY3JlbWVudCB0aGUgY291bnRlcgorICAgIG1fbG9h
ZENvdW50LS07CisKKyAgICAvLyBDaGVjayBpZiB0aGUgcGx1Zy1pbiBzdXBwb3J0cyBOUFBfR2V0
U2l0ZXNXaXRoRGF0YS4KKyAgICBpZiAoIW1fcGx1Z2luRnVuY3MuZ2V0c2l0ZXN3aXRoZGF0YSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY2hhcioqIHNpdGVBcnJheSA9IG1fcGx1Z2lu
RnVuY3MuZ2V0c2l0ZXN3aXRoZGF0YSgpOworCisgICAgLy8gVGhlcmUgd2VyZSBubyBzaXRlcyB3
aXRoIGRhdGEuCisgICAgaWYgKCFzaXRlQXJyYXkpCisgICAgICAgIHJldHVybiB0cnVlOworCisg
ICAgZm9yIChpbnQgaSA9IDA7IHNpdGVBcnJheVtpXTsgKytpKSB7CisgICAgICAgIGNoYXIqIHNp
dGUgPSBzaXRlQXJyYXlbaV07CisKKyAgICAgICAgU3RyaW5nIHNpdGVTdHJpbmcgPSBTdHJpbmc6
OmZyb21VVEY4KHNpdGUpOworICAgICAgICBpZiAoIXNpdGVTdHJpbmcuaXNOdWxsKCkpCisgICAg
ICAgICAgICBzaXRlcy5hcHBlbmQoc2l0ZVN0cmluZyk7CisKKyAgICAgICAgbnBuTWVtRnJlZShz
aXRlKTsKKyAgICB9CisKKyAgICBucG5NZW1GcmVlKHNpdGVBcnJheSk7CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK2Jvb2wgUGx1Z2luUGFja2FnZTo6dHJ5Q2xlYXJTaXRlRGF0YShjb25zdCBTdHJp
bmcmIHNpdGUsIHVpbnQ2NF90IGZsYWdzLCB1aW50NjRfdCBtYXhBZ2UpCit7CisgICAgaWYgKCFs
b2FkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEZJWE1FOiBGaW5kIGEgYmV0
dGVyIHdheSB0byBlbnN1cmUgdGhlIHBsdWdpbiBpcyBsb2FkZWQuCisgICAgLy8gUGx1Z2luVmll
dzo6SW5pdCB3aWxsIGxvYWQgdGhlIHBsdWdpbiBzbyBkZWNyZW1lbnQgdGhlIGNvdW50ZXIKKyAg
ICBtX2xvYWRDb3VudC0tOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWctaW4gc3VwcG9ydHMg
TlBQX0NsZWFyU2l0ZURhdGEuCisgICAgaWYgKCFtX3BsdWdpbkZ1bmNzLmNsZWFyc2l0ZWRhdGEp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIENTdHJpbmcgc2l0ZVN0cmluZzsKKyAgICBp
ZiAoIXNpdGUuaXNOdWxsKCkpCisgICAgICAgIHNpdGVTdHJpbmcgPSBzaXRlLnV0ZjgoKTsKKwor
ICAgIHJldHVybiBtX3BsdWdpbkZ1bmNzLmNsZWFyc2l0ZWRhdGEoc2l0ZVN0cmluZy5kYXRhKCks
IGZsYWdzLCBtYXhBZ2UpID09IE5QRVJSX05PX0VSUk9SOworfQorCit1bnNpZ25lZCBQbHVnaW5Q
YWNrYWdlOjpoYXNoKCkgY29uc3QKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBoYXNoQ29kZXNbXSA9
IHsKKyAgICAgICAgbV9uYW1lLmltcGwoKS0+aGFzaCgpLAorICAgICAgICBtX2Rlc2NyaXB0aW9u
LmltcGwoKS0+aGFzaCgpLAorICAgICAgICBtX21pbWVUb0V4dGVuc2lvbnMuc2l6ZSgpCisgICAg
fTsKKworICAgIHJldHVybiBTdHJpbmdIYXNoZXI6OmNvbXB1dGVIYXNoKHJlaW50ZXJwcmV0X2Nh
c3Q8Y29uc3QgVUNoYXIqPihoYXNoQ29kZXMpLCBzaXplb2YoaGFzaENvZGVzKSAvIHNpemVvZihV
Q2hhcikpOworfQorCitib29sIFBsdWdpblBhY2thZ2U6OmxvYWQoKQoreworICAgIGlmIChtX2lz
TG9hZGVkKSB7CisgICAgICAgIG1fbG9hZENvdW50Kys7CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKworICAgIGlmIChtX2ZyZWVMaWJyYXJ5VGltZXIuaXNBY3RpdmUoKSkgeworICAgICAg
ICBBU1NFUlQobV9tb2R1bGUpOworICAgICAgICBtX2ZyZWVMaWJyYXJ5VGltZXIuc3RvcCgpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVCghbV9sb2FkQ291bnQpOworICAgICAgICBtX21v
ZHVsZSA9IGRsb3BlbihtX3BhdGgudXRmOCgpLmRhdGEoKSwgUlRMRF9MQVpZKTsKKyAgICB9CisK
KyAgICBpZiAoIW1fbW9kdWxlKSB7CisgICAgICAgIExPRyhQbHVnaW5zLCAiJXMgbm90IGxvYWRl
ZCAoJXMpIiwgbV9wYXRoLnV0ZjgoKS5kYXRhKCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAg
IHByaW50ZigiUGx1Z2luUGFja2FnZTo6bG9hZCgpIC0gJXMgbm90IGxvYWRlZCAoJXMpIiwgbV9w
YXRoLnV0ZjgoKS5kYXRhKCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9CisKKyAgICBtX2lzTG9hZGVkID0gdHJ1ZTsKKworICAgIE5QX0luaXRpYWxpemVG
dW5jUHRyIE5QX0luaXRpYWxpemU7CisgICAgTlBFcnJvciBucEVycjsKKworICAgIE5QX0luaXRp
YWxpemUgPSAoTlBfSW5pdGlhbGl6ZUZ1bmNQdHIpZGxzeW0obV9tb2R1bGUsICJOUF9Jbml0aWFs
aXplIik7CisgICAgbV9OUFBfU2h1dGRvd24gPSAoTlBQX1NodXRkb3duUHJvY1B0cilkbHN5bSht
X21vZHVsZSwgIk5QX1NodXRkb3duIik7CisKKyAgICBpZiAoIU5QX0luaXRpYWxpemUgfHwgIW1f
TlBQX1NodXRkb3duKQorICAgICAgICBnb3RvIGFib3J0OworCisgICAgbWVtc2V0KCZtX3BsdWdp
bkZ1bmNzLCAwLCBzaXplb2YobV9wbHVnaW5GdW5jcykpOworICAgIG1fcGx1Z2luRnVuY3Muc2l6
ZSA9IHNpemVvZihtX3BsdWdpbkZ1bmNzKTsKKworICAgIGluaXRpYWxpemVCcm93c2VyRnVuY3Mo
KTsKKworICAgIG5wRXJyID0gTlBfSW5pdGlhbGl6ZSgmbV9icm93c2VyRnVuY3MsICAmbV9wbHVn
aW5GdW5jcyk7CisKKyAgICBpZiAobnBFcnIgIT0gTlBFUlJfTk9fRVJST1IpCisgICAgICAgIGdv
dG8gYWJvcnQ7CisKKyAgICBtX2xvYWRDb3VudCA9IDE7CisgICAgcmV0dXJuIHRydWU7CisKK2Fi
b3J0OgorICAgIHVubG9hZFdpdGhvdXRTaHV0ZG93bigpOworICAgIHJldHVybiBmYWxzZTsKK30K
KworI2lmIEVOQUJMRShORVRTQ0FQRV9QTFVHSU5fQVBJKQordWludDE2X3QgUGx1Z2luUGFja2Fn
ZTo6TlBWZXJzaW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gTlBWRVJTX0hBU19QTFVHSU5fVEhS
RUFEX0FTWU5DX0NBTEw7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117097</attachid>
            <date>2011-11-29 18:50:47 -0800</date>
            <delta_ts>2011-11-29 21:59:05 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73185-20111130105118.patch</filename>
            <type>text/plain</type>
            <size>26062</size>
            <attacher name="Charles Wei">charles.wei</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwMTQ0MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE3IEBACisyMDExLTExLTI5ICBXZWkgQ2hh
cmxlcyAgPGNoYXJsZXMud2VpQHRvcmNobW9iaWxlLmNvbS5jbj4KKworICAgICAgICBbYmxhY2ti
ZXJyeV0gVXBzdHJlYW0gQmxhY2tCZXJyeSBwb3J0aW5nIG9mIHBsdWdpbiBmcmFtZXdvcmsKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczMTg1CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3Rz
IGZvciBub3cuCisKKyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld0hlbHBl
ckJsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnkvUGx1
Z2luVmlld0hlbHBlckJsYWNrQmVycnkuaDogQWRkZWQuCisgICAgICAgICogcGx1Z2lucy9ibGFj
a2JlcnJ5L1BsdWdpblZpZXdQcml2YXRlQmxhY2tCZXJyeS5jcHA6IEFkZGVkLgorICAgICAgICAq
IHBsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5WaWV3UHJpdmF0ZUJsYWNrQmVycnkuaDogQWRkZWQu
CisKIDIwMTEtMTEtMjkgIEplc3NpZSBCZXJsaW4gIDxqYmVybGluQGFwcGxlLmNvbT4KIAogICAg
ICAgICBXS0tleVZhbHVlU3RvcmFnZU1hbmFnZXJHZXRLZXlWYWx1ZVN0b3JhZ2VPcmlnaW5zIG1h
eSBub3QgcmVwb3J0IHRoZSBjb3JyZWN0IGxpc3Qgb2Ygb3JpZ2lucwpJbmRleDogU291cmNlL1dl
YkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1BsdWdpblZpZXdIZWxwZXJCbGFja0JlcnJ5LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmll
d0hlbHBlckJsYWNrQmVycnkuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvcGx1
Z2lucy9ibGFja2JlcnJ5L1BsdWdpblZpZXdIZWxwZXJCbGFja0JlcnJ5LmNwcAkocmV2aXNpb24g
MCkKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVzZWFyY2gg
SW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBsdWdpblZpZXdIZWxwZXJCbGFj
a0JlcnJ5LmgiCisKKyNpbmNsdWRlICJQbHVnaW5WaWV3UHJpdmF0ZUJsYWNrQmVycnkuaCIKKwor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyNpbmNsdWRlICJQbHVnaW5MYXllcldl
YktpdFRocmVhZC5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUHRocmVhZE11
dGV4TG9ja2VyOjpQdGhyZWFkTXV0ZXhMb2NrZXIocHRocmVhZF9tdXRleF90KiBtdXRleCkKKyAg
ICA6IG1fbXV0ZXgobXV0ZXgpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKG1fbXV0ZXgpOwor
fQorCitQdGhyZWFkTXV0ZXhMb2NrZXI6On5QdGhyZWFkTXV0ZXhMb2NrZXIoKQoreworICAgIHB0
aHJlYWRfbXV0ZXhfdW5sb2NrKG1fbXV0ZXgpOworfQorCitQdGhyZWFkUmVhZExvY2tlcjo6UHRo
cmVhZFJlYWRMb2NrZXIocHRocmVhZF9yd2xvY2tfdCogcndsb2NrKQorICAgIDogbV9yd2xvY2so
cndsb2NrKQoreworICAgIHB0aHJlYWRfcndsb2NrX3JkbG9jayhtX3J3bG9jayk7Cit9CisKK1B0
aHJlYWRSZWFkTG9ja2VyOjp+UHRocmVhZFJlYWRMb2NrZXIoKQoreworICAgIHB0aHJlYWRfcnds
b2NrX3VubG9jayhtX3J3bG9jayk7Cit9CisKK1B0aHJlYWRXcml0ZUxvY2tlcjo6UHRocmVhZFdy
aXRlTG9ja2VyKHB0aHJlYWRfcndsb2NrX3QqIHJ3bG9jaykKKyAgICA6IG1fcndsb2NrKHJ3bG9j
aykKK3sKKyAgICBwdGhyZWFkX3J3bG9ja193cmxvY2sobV9yd2xvY2spOworfQorCitQdGhyZWFk
V3JpdGVMb2NrZXI6On5QdGhyZWFkV3JpdGVMb2NrZXIoKQoreworICAgIHB0aHJlYWRfcndsb2Nr
X3VubG9jayhtX3J3bG9jayk7Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
Cit2b2lkIG5wU2V0SG9sZVB1bmNoSGFuZGxlcih2b2lkKiBob2xlUHVuY2hEYXRhKQoreworICAg
IE93blB0cjxIb2xlUHVuY2hEYXRhPiBkYXRhID0gYWRvcHRQdHIoc3RhdGljX2Nhc3Q8SG9sZVB1
bmNoRGF0YSo+KGhvbGVQdW5jaERhdGEpKTsKKyAgICBpZiAoZGF0YS0+bGF5ZXIpCisgICAgICAg
IGRhdGEtPmxheWVyLT5zZXRIb2xlUHVuY2hSZWN0KEludFJlY3QoZGF0YS0+eCwgZGF0YS0+eSwg
ZGF0YS0+dywgZGF0YS0+aCkpOworfQorI2VuZGlmCisKKy8vIE5QQVBJIGNhbGxiYWNrIGZ1bmN0
aW9ucworCit2b2lkIHNldFZpc2libGVSZWN0cyhOUFAgaW5zdGFuY2UsIGNvbnN0IE5QUmVjdCBy
ZWN0c1tdLCBpbnQzMl90IGNvdW50KQoreworICAgIFBsdWdpblZpZXcqIHZpZXcgPSBzdGF0aWNf
Y2FzdDxQbHVnaW5WaWV3Kj4oaW5zdGFuY2UtPm5kYXRhKTsKKyAgICBQbHVnaW5WaWV3UHJpdmF0
ZSogdmlld1ByaXZhdGUgPSB2aWV3LT5nZXRQcml2YXRlKCk7CisgICAgdmlld1ByaXZhdGUtPnNl
dFZpc2libGVSZWN0cyhyZWN0cywgY291bnQpOworfQorCit2b2lkIGNsZWFyVmlzaWJsZVJlY3Rz
KE5QUCBpbnN0YW5jZSkKK3sKKyAgICBQbHVnaW5WaWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8UGx1
Z2luVmlldyo+KGluc3RhbmNlLT5uZGF0YSk7CisgICAgUGx1Z2luVmlld1ByaXZhdGUqIHZpZXdQ
cml2YXRlID0gdmlldy0+Z2V0UHJpdmF0ZSgpOworICAgIHZpZXdQcml2YXRlLT5jbGVhclZpc2li
bGVSZWN0cygpOworfQorCit2b2lkIHNob3dLZXlib2FyZChOUFAgaW5zdGFuY2UsIGJvb2wgdmFs
dWUpCit7CisgICAgUGx1Z2luVmlldyogdmlldyA9IHN0YXRpY19jYXN0PFBsdWdpblZpZXcqPihp
bnN0YW5jZS0+bmRhdGEpOworICAgIFBsdWdpblZpZXdQcml2YXRlKiB2aWV3UHJpdmF0ZSA9IHZp
ZXctPmdldFByaXZhdGUoKTsKKyAgICB2aWV3UHJpdmF0ZS0+c2hvd0tleWJvYXJkKHZhbHVlKTsK
K30KKwordm9pZCByZXF1ZXN0RnVsbFNjcmVlbihOUFAgaW5zdGFuY2UpCit7CisgICAgUGx1Z2lu
VmlldyogdmlldyA9IHN0YXRpY19jYXN0PFBsdWdpblZpZXcqPihpbnN0YW5jZS0+bmRhdGEpOwor
ICAgIFBsdWdpblZpZXdQcml2YXRlKiB2aWV3UHJpdmF0ZSA9IHZpZXctPmdldFByaXZhdGUoKTsK
KyAgICB2aWV3UHJpdmF0ZS0+cmVxdWVzdEZ1bGxTY3JlZW4oKTsKK30KKwordm9pZCBleGl0RnVs
bFNjcmVlbihOUFAgaW5zdGFuY2UpCit7CisgICAgUGx1Z2luVmlldyogdmlldyA9IHN0YXRpY19j
YXN0PFBsdWdpblZpZXcqPihpbnN0YW5jZS0+bmRhdGEpOworICAgIFBsdWdpblZpZXdQcml2YXRl
KiB2aWV3UHJpdmF0ZSA9IHZpZXctPmdldFByaXZhdGUoKTsKKyAgICB2aWV3UHJpdmF0ZS0+ZXhp
dEZ1bGxTY3JlZW4oKTsKK30KKwordm9pZCByZXF1ZXN0Q2VudGVyRml0Wm9vbShOUFAgaW5zdGFu
Y2UpCit7CisgICAgUGx1Z2luVmlldyogdmlldyA9IHN0YXRpY19jYXN0PFBsdWdpblZpZXcqPihp
bnN0YW5jZS0+bmRhdGEpOworICAgIFBsdWdpblZpZXdQcml2YXRlKiB2aWV3UHJpdmF0ZSA9IHZp
ZXctPmdldFByaXZhdGUoKTsKKyAgICB2aWV3UHJpdmF0ZS0+cmVxdWVzdENlbnRlckZpdFpvb20o
KTsKK30KKwordm9pZCBsb2NrT3JpZW50YXRpb24oTlBQIGluc3RhbmNlLCBib29sIGxhbmRzY2Fw
ZSkKK3sKKyAgICBQbHVnaW5WaWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8UGx1Z2luVmlldyo+KGlu
c3RhbmNlLT5uZGF0YSk7CisgICAgUGx1Z2luVmlld1ByaXZhdGUqIHZpZXdQcml2YXRlID0gdmll
dy0+Z2V0UHJpdmF0ZSgpOworICAgIHZpZXdQcml2YXRlLT5sb2NrT3JpZW50YXRpb24obGFuZHNj
YXBlKTsKK30KKwordm9pZCB1bmxvY2tPcmllbnRhdGlvbihOUFAgaW5zdGFuY2UpCit7CisgICAg
UGx1Z2luVmlldyogdmlldyA9IHN0YXRpY19jYXN0PFBsdWdpblZpZXcqPihpbnN0YW5jZS0+bmRh
dGEpOworICAgIFBsdWdpblZpZXdQcml2YXRlKiB2aWV3UHJpdmF0ZSA9IHZpZXctPmdldFByaXZh
dGUoKTsKKyAgICB2aWV3UHJpdmF0ZS0+dW5sb2NrT3JpZW50YXRpb24oKTsKK30KKwordm9pZCBw
cmV2ZW50SWRsZShOUFAgaW5zdGFuY2UsIGJvb2wgcHJldmVudElkbGUpCit7CisgICAgUGx1Z2lu
VmlldyogdmlldyA9IHN0YXRpY19jYXN0PFBsdWdpblZpZXcqPihpbnN0YW5jZS0+bmRhdGEpOwor
ICAgIFBsdWdpblZpZXdQcml2YXRlKiB2aWV3UHJpdmF0ZSA9IHZpZXctPmdldFByaXZhdGUoKTsK
KyAgICB2aWV3UHJpdmF0ZS0+cHJldmVudElkbGUocHJldmVudElkbGUpOworfQorCitOUFN1cmZh
Y2UgbG9ja0JhY2tCdWZmZXIoTlBQIGluc3RhbmNlKQoreworICAgIFBsdWdpblZpZXcqIHZpZXcg
PSBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3Kj4oaW5zdGFuY2UtPm5kYXRhKTsKKyAgICBQbHVnaW5W
aWV3UHJpdmF0ZSogdmlld1ByaXZhdGUgPSB2aWV3LT5nZXRQcml2YXRlKCk7CisgICAgcmV0dXJu
IHZpZXdQcml2YXRlLT5sb2NrQmFja0J1ZmZlcigpOworfQorCit2b2lkIHVubG9ja0JhY2tCdWZm
ZXIoTlBQIGluc3RhbmNlKQoreworICAgIFBsdWdpblZpZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxQ
bHVnaW5WaWV3Kj4oaW5zdGFuY2UtPm5kYXRhKTsKKyAgICBQbHVnaW5WaWV3UHJpdmF0ZSogdmll
d1ByaXZhdGUgPSB2aWV3LT5nZXRQcml2YXRlKCk7CisgICAgdmlld1ByaXZhdGUtPnVubG9ja0Jh
Y2tCdWZmZXIoKTsKK30KKworTlBTdXJmYWNlIGxvY2tSZWFkRnJvbnRCdWZmZXIoTlBQIGluc3Rh
bmNlKQoreworUGx1Z2luVmlldyogdmlldyA9IHN0YXRpY19jYXN0PFBsdWdpblZpZXcqPihpbnN0
YW5jZS0+bmRhdGEpOworUGx1Z2luVmlld1ByaXZhdGUqIHZpZXdQcml2YXRlID0gdmlldy0+Z2V0
UHJpdmF0ZSgpOworcmV0dXJuIHZpZXdQcml2YXRlLT5sb2NrUmVhZEZyb250QnVmZmVyKCk7Cit9
CisKK3ZvaWQgdW5sb2NrUmVhZEZyb250QnVmZmVyKE5QUCBpbnN0YW5jZSkKK3sKKyAgICBQbHVn
aW5WaWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8UGx1Z2luVmlldyo+KGluc3RhbmNlLT5uZGF0YSk7
CisgICAgUGx1Z2luVmlld1ByaXZhdGUqIHZpZXdQcml2YXRlID0gdmlldy0+Z2V0UHJpdmF0ZSgp
OworICAgIHZpZXdQcml2YXRlLT51bmxvY2tSZWFkRnJvbnRCdWZmZXIoKTsKK30KKwordm9pZCBz
d2FwQnVmZmVycyhOUFAgaW5zdGFuY2UpCit7CisgICAgUGx1Z2luVmlldyogdmlldyA9IHN0YXRp
Y19jYXN0PFBsdWdpblZpZXcqPihpbnN0YW5jZS0+bmRhdGEpOworICAgIFBsdWdpblZpZXdQcml2
YXRlKiB2aWV3UHJpdmF0ZSA9IHZpZXctPmdldFByaXZhdGUoKTsKKyAgICB2aWV3UHJpdmF0ZS0+
c3dhcEJ1ZmZlcnMoKTsKK30KKworYm9vbCBjcmVhdGVCdWZmZXJzKE5QUCBpbnN0YW5jZSwgTlBT
dXJmYWNlRm9ybWF0IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIFBsdWdp
blZpZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3Kj4oaW5zdGFuY2UtPm5kYXRhKTsK
KyAgICBQbHVnaW5WaWV3UHJpdmF0ZSogdmlld1ByaXZhdGUgPSB2aWV3LT5nZXRQcml2YXRlKCk7
CisgICAgcmV0dXJuIHZpZXdQcml2YXRlLT5jcmVhdGVCdWZmZXJzKGZvcm1hdCwgd2lkdGgsIGhl
aWdodCk7Cit9CisKK2Jvb2wgZGVzdHJveUJ1ZmZlcnMoTlBQIGluc3RhbmNlKQoreworICAgIFBs
dWdpblZpZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3Kj4oaW5zdGFuY2UtPm5kYXRh
KTsKKyAgICBQbHVnaW5WaWV3UHJpdmF0ZSogdmlld1ByaXZhdGUgPSB2aWV3LT5nZXRQcml2YXRl
KCk7CisgICAgcmV0dXJuIHZpZXdQcml2YXRlLT5kZXN0cm95QnVmZmVycygpOworfQorCitib29s
IHJlc2l6ZUJ1ZmZlcnMoTlBQIGluc3RhbmNlLCBOUFN1cmZhY2VGb3JtYXQgZm9ybWF0LCBpbnQg
d2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgUGx1Z2luVmlldyogdmlldyA9IHN0YXRpY19jYXN0
PFBsdWdpblZpZXcqPihpbnN0YW5jZS0+bmRhdGEpOworICAgIFBsdWdpblZpZXdQcml2YXRlKiB2
aWV3UHJpdmF0ZSA9IHZpZXctPmdldFByaXZhdGUoKTsKKyAgICByZXR1cm4gdmlld1ByaXZhdGUt
PnJlc2l6ZUJ1ZmZlcnMoZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKK30KKwordm9pZCBzZXRIb2xl
UHVuY2goTlBQIGluc3RhbmNlLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkK
K3sKKyAgICBQbHVnaW5WaWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8UGx1Z2luVmlldyo+KGluc3Rh
bmNlLT5uZGF0YSk7CisgICAgUGx1Z2luVmlld1ByaXZhdGUqIHZpZXdQcml2YXRlID0gdmlldy0+
Z2V0UHJpdmF0ZSgpOworICAgIHZpZXdQcml2YXRlLT5zZXRIb2xlUHVuY2goeCwgeSwgd2lkdGgs
IGhlaWdodCk7Cit9CisKK05QQ2FsbGJhY2tzIHNfTnBDYWxsYmFja3MgPSB7CisgICAgc2V0Vmlz
aWJsZVJlY3RzLAorICAgIGNsZWFyVmlzaWJsZVJlY3RzLAorICAgIHNob3dLZXlib2FyZCwKKyAg
ICByZXF1ZXN0RnVsbFNjcmVlbiwKKyAgICBleGl0RnVsbFNjcmVlbiwKKyAgICByZXF1ZXN0Q2Vu
dGVyRml0Wm9vbSwKKyAgICBsb2NrT3JpZW50YXRpb24sCisgICAgdW5sb2NrT3JpZW50YXRpb24s
CisgICAgcHJldmVudElkbGUsCisgICAgbG9ja0JhY2tCdWZmZXIsCisgICAgdW5sb2NrQmFja0J1
ZmZlciwKKyAgICBsb2NrUmVhZEZyb250QnVmZmVyLAorICAgIHVubG9ja1JlYWRGcm9udEJ1ZmZl
ciwKKyAgICBzd2FwQnVmZmVycywKKyAgICBjcmVhdGVCdWZmZXJzLAorICAgIGRlc3Ryb3lCdWZm
ZXJzLAorICAgIHJlc2l6ZUJ1ZmZlcnMsCisgICAgc2V0SG9sZVB1bmNoCit9OworCit9IC8vIE5h
bWVzcGFjZSBXZWJDb3JlCisKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJy
eS9QbHVnaW5WaWV3SGVscGVyQmxhY2tCZXJyeS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5WaWV3SGVscGVyQmxhY2tCZXJyeS5oCShyZXZp
c2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1BsdWdpblZpZXdI
ZWxwZXJCbGFja0JlcnJ5LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQor
ICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9z
dG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBQbHVnaW5WaWV3SGVscGVy
QmxhY2tCZXJyeV9oCisjZGVmaW5lIFBsdWdpblZpZXdIZWxwZXJCbGFja0JlcnJ5X2gKKworI2lu
Y2x1ZGUgPFBsdWdpblZpZXcuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworc3RydWN0IFB0aHJlYWRNdXRleExvY2tlciB7CisgICAgUHRocmVhZE11dGV4
TG9ja2VyKHB0aHJlYWRfbXV0ZXhfdCopOworICAgIH5QdGhyZWFkTXV0ZXhMb2NrZXIoKTsKKwor
ICAgIHB0aHJlYWRfbXV0ZXhfdCogbV9tdXRleDsKK307CisKK3N0cnVjdCBQdGhyZWFkUmVhZExv
Y2tlciB7CisgICAgUHRocmVhZFJlYWRMb2NrZXIocHRocmVhZF9yd2xvY2tfdCopOworICAgIH5Q
dGhyZWFkUmVhZExvY2tlcigpOworCisgICAgcHRocmVhZF9yd2xvY2tfdCogbV9yd2xvY2s7Cit9
OworCitzdHJ1Y3QgUHRocmVhZFdyaXRlTG9ja2VyIHsKKyAgICBQdGhyZWFkV3JpdGVMb2NrZXIo
cHRocmVhZF9yd2xvY2tfdCopOworICAgIH5QdGhyZWFkV3JpdGVMb2NrZXIoKTsKKworICAgIHB0
aHJlYWRfcndsb2NrX3QqIG1fcndsb2NrOworfTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKK3N0cnVjdCBIb2xlUHVuY2hEYXRhIHsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQg
dywgaDsKKyAgICBSZWZQdHI8UGxhdGZvcm1MYXllcj4gbGF5ZXI7Cit9OworCit2b2lkIG5wU2V0
SG9sZVB1bmNoSGFuZGxlcih2b2lkKiBob2xlUHVuY2hEYXRhKTsKKyNlbmRpZgorCisvLyBTdGF0
aWMgTlBBUEkgQ2FsbGJhY2tzCisKK3ZvaWQgc2V0VmlzaWJsZVJlY3RzKE5QUCBpbnN0YW5jZSwg
Y29uc3QgTlBSZWN0IHJlY3RzW10sIGludDMyX3QgY291bnQpOwordm9pZCBjbGVhclZpc2libGVS
ZWN0cyhOUFAgaW5zdGFuY2UpOwordm9pZCBzaG93S2V5Ym9hcmQoTlBQIGluc3RhbmNlLCBib29s
IHZhbHVlKTsKK3ZvaWQgcmVxdWVzdEZ1bGxTY3JlZW4oTlBQIGluc3RhbmNlKTsKK3ZvaWQgZXhp
dEZ1bGxTY3JlZW4oTlBQIGluc3RhbmNlKTsKK3ZvaWQgcmVxdWVzdENlbnRlckZpdFpvb20oTlBQ
IGluc3RhbmNlKTsKK3ZvaWQgbG9ja09yaWVudGF0aW9uKE5QUCBpbnN0YW5jZSwgYm9vbCBsYW5k
c2NhcGUpOwordm9pZCB1bmxvY2tPcmllbnRhdGlvbihOUFAgaW5zdGFuY2UpOwordm9pZCBwcmV2
ZW50SWRsZShOUFAgaW5zdGFuY2UsIGJvb2wgcHJldmVudElkbGUpOworTlBTdXJmYWNlIGxvY2tC
YWNrQnVmZmVyKE5QUCBpbnN0YW5jZSk7Cit2b2lkIHVubG9ja0JhY2tCdWZmZXIoTlBQIGluc3Rh
bmNlKTsKK05QU3VyZmFjZSBsb2NrUmVhZEZyb250QnVmZmVyKE5QUCBpbnN0YW5jZSk7Cit2b2lk
IHVubG9ja1JlYWRGcm9udEJ1ZmZlcihOUFAgaW5zdGFuY2UpOwordm9pZCBzd2FwQnVmZmVycyhO
UFAgaW5zdGFuY2UpOworYm9vbCBjcmVhdGVCdWZmZXJzKE5QUCBpbnN0YW5jZSwgTlBTdXJmYWNl
Rm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworYm9vbCBkZXN0cm95QnVmZmVycyhOUFAg
aW5zdGFuY2UpOworYm9vbCByZXNpemVCdWZmZXJzKE5QUCBpbnN0YW5jZSwgTlBTdXJmYWNlRm9y
bWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwordm9pZCBzZXRIb2xlUHVuY2goTlBQIGluc3Rh
bmNlLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKK2V4dGVybiBOUENh
bGxiYWNrcyBzX05wQ2FsbGJhY2tzOworCit9IC8vIE5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRp
ZgpJbmRleDogU291cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1BsdWdpblZpZXdQcml2
YXRlQmxhY2tCZXJyeS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGx1Z2lucy9i
bGFja2JlcnJ5L1BsdWdpblZpZXdQcml2YXRlQmxhY2tCZXJyeS5jcHAJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld1ByaXZhdGVCbGFj
a0JlcnJ5LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBN
QSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IlBsdWdpblZpZXdQcml2YXRlQmxhY2tCZXJyeS5oIgorCisjaW5jbHVkZSAiRnJhbWVWaWV3Lmgi
CisjaW5jbHVkZSAiSG9zdFdpbmRvdy5oIgorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKyNpbmNsdWRlICJQbHVnaW5MYXllcldlYktpdFRocmVhZC5oIgorI2VuZGlmCisjaW5jbHVk
ZSAiUGx1Z2luVmlld0hlbHBlckJsYWNrQmVycnkuaCIKKyNpbmNsdWRlIDx3dGYvTWFpblRocmVh
ZC5oPgorCitzdGF0aWMgdW5zaWduZWQgc19jb3VudGVyID0gMDsKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitQbHVnaW5WaWV3UHJpdmF0ZTo6UGx1Z2luVmlld1ByaXZhdGUoUGx1Z2luVmlldyog
dmlldykKKyAgICA6IG1fdmlldyh2aWV3KQorICAgICwgbV9wbHVnaW5CdWZmZXJUeXBlKEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6UGx1Z2luQnVmZmVyV2l0aEFscGhhKQorICAgICwg
bV9wbHVnaW5Gcm9udEJ1ZmZlcigwKQorICAgICwgbV9pZGxlUHJldmVudGVkKGZhbHNlKQorICAg
ICwgbV9oYXNQZW5kaW5nR2VvbWV0cnlDaGFuZ2UodHJ1ZSkKKyAgICAsIG1fc2VudE9uTG9hZChm
YWxzZSkKKyAgICAsIG1faXNGdWxsU2NyZWVuKGZhbHNlKQorICAgICwgbV9pc0ZvY3VzZWQoZmFs
c2UpCisgICAgLCBtX29yaWVudGF0aW9uTG9ja2VkKGZhbHNlKQorICAgICwgbV9pc0JhY2tncm91
bmRQbGF5aW5nKGZhbHNlKQoreworICAgIG1fcGx1Z2luQnVmZmVyc1swXSA9IDA7CisgICAgbV9w
bHVnaW5CdWZmZXJzWzFdID0gMDsKKworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhBdHRy
aWJ1dGVzOworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4QXR0cmlidXRlcyk7Cisg
ICAgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmbXV0ZXhBdHRyaWJ1dGVzLCBQVEhSRUFEX01V
VEVYX1JFQ1VSU0lWRSk7CisKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJm1fYmFja0J1ZmZlck11
dGV4LCAmbXV0ZXhBdHRyaWJ1dGVzKTsKKyAgICBwdGhyZWFkX3J3bG9ja19pbml0KCZtX2Zyb250
QnVmZmVyUndMb2NrLCAwKTsKKworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4
QXR0cmlidXRlcyk7CisKKyAgICBjaGFyIHVuaXF1ZUlkWzUwXTsKKyAgICBzbnByaW50Zih1bmlx
dWVJZCwgc2l6ZW9mKHVuaXF1ZUlkKSwgIlBsdWdpblZpZXdCQi0lMDh4JTA4eC0iLCBzX2NvdW50
ZXIrKywgKGludCl0aGlzKTsKKyAgICBtX3BsdWdpblVuaXF1ZVByZWZpeCA9IHVuaXF1ZUlkOwor
fQorCitQbHVnaW5WaWV3UHJpdmF0ZTo6flBsdWdpblZpZXdQcml2YXRlKCkKK3sKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgICAgIGlmIChtX3BsYXRmb3JtTGF5ZXIpCisg
ICAgICAgICAgICBzdGF0aWNfY2FzdDxQbHVnaW5MYXllcldlYktpdFRocmVhZCo+KG1fcGxhdGZv
cm1MYXllci5nZXQoKSktPnNldFBsdWdpblZpZXcoMCk7CisjZW5kaWYKKworICAgIGRlc3Ryb3lC
dWZmZXJzKCk7CisKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1fYmFja0J1ZmZlck11dGV4
KTsKKyAgICBwdGhyZWFkX3J3bG9ja19kZXN0cm95KCZtX2Zyb250QnVmZmVyUndMb2NrKTsKK30K
KworQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXJUeXBlIFBsdWdpblZpZXdQ
cml2YXRlOjp0b0J1ZmZlclR5cGUoTlBTdXJmYWNlRm9ybWF0IGZvcm1hdCkKK3sKKyAgICBzd2l0
Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgRk9STUFUX1JHQl81NjU6CisgICAgICAgIHJldHVybiBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlBsdWdpbkJ1ZmZlcjsKKyAgICBjYXNlIEZP
Uk1BVF9SR0JBXzg4ODg6CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6UGx1Z2luQnVmZmVyV2l0aEFscGhhOworICAgIH0KK30KKwor
dm9pZCBQbHVnaW5WaWV3UHJpdmF0ZTo6c2V0Wm9vbUZhY3RvcihmbG9hdCB6b29tRmFjdG9yKQor
eworICAgIGlmICgoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fdmlldy0+bV9ucFdpbmRv
dy53c19pbmZvKS0+em9vbUZhY3RvciAhPSB6b29tRmFjdG9yKQorICAgICAgICBtX2hhc1BlbmRp
bmdHZW9tZXRyeUNoYW5nZSA9IHRydWU7CisKKyAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1
Y3QqKW1fdmlldy0+bV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3RvciA9IHpvb21GYWN0b3I7
Cit9CisKK3ZvaWQgUGx1Z2luVmlld1ByaXZhdGU6OnNldFZpc2libGVSZWN0cyhjb25zdCBOUFJl
Y3QgcmVjdHNbXSwgaW50MzJfdCBjb3VudCkKK3sKKyAgICBtX2tlZXBWaXNpYmxlUmVjdCA9IElu
dFJlY3QoKTsKKworICAgIGlmICghbV92aWV3LT5wYXJlbnQoKSB8fCAhY291bnQpCisgICAgICAg
IHJldHVybjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAg
ICBJbnRSZWN0IGFkZFJlY3QgPSBJbnRSZWN0KHJlY3RzW2ldLmxlZnQsIHJlY3RzW2ldLnRvcCwg
cmVjdHNbaV0ucmlnaHQgLSByZWN0c1tpXS5sZWZ0LCByZWN0c1tpXS5ib3R0b20gLSByZWN0c1tp
XS50b3ApOworICAgICAgICBtX2tlZXBWaXNpYmxlUmVjdC51bml0ZShhZGRSZWN0KTsKKyAgICB9
CisKKyAgICAvLyBEb24ndCBjYXVzZSBhIHBvc3NpYmxlIHNjcm9sbCBpZiB0aGUgcmVzdWx0IGlz
IGFuIGVtcHR5IHJlY3RhbmdsZS4KKyAgICBpZiAobV9rZWVwVmlzaWJsZVJlY3QuaXNFbXB0eSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBBZGp1c3QgdGhlIHJlY3QgdG8gdGhlIHBhcmVu
dCB3aW5kb3cgYW5kIHRoZW4gYWRqdXN0IGZvciBzY3JvbGxpbmcuCisgICAgbV9rZWVwVmlzaWJs
ZVJlY3QgPSBtX3ZpZXctPmNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3cobV9rZWVwVmlzaWJsZVJl
Y3QpOworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4o
bV92aWV3LT5wYXJlbnQoKSk7CisgICAgbV9rZWVwVmlzaWJsZVJlY3QubW92ZShmcmFtZVZpZXct
PnNjcm9sbFBvc2l0aW9uKCkueCgpLCBmcmFtZVZpZXctPnNjcm9sbFBvc2l0aW9uKCkueSgpKTsK
KworICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+ZW5z
dXJlQ29udGVudFZpc2libGUoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3UHJpdmF0ZTo6Y2xlYXJW
aXNpYmxlUmVjdHMoKQoreworICAgIGlmICghbV9rZWVwVmlzaWJsZVJlY3QuaXNFbXB0eSgpKQor
ICAgICAgICBzZXRWaXNpYmxlUmVjdHMoMCwgMCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlld1ByaXZh
dGU6OnNob3dLZXlib2FyZChib29sIHZhbHVlKQoreworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3
ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV92aWV3LT5wYXJlbnQoKSk7CisgICAgZnJhbWVW
aWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5zaG93VmlydHVhbEtleWJv
YXJkKHZhbHVlKTsKK30KKwordm9pZCBQbHVnaW5WaWV3UHJpdmF0ZTo6cmVxdWVzdEZ1bGxTY3Jl
ZW4oKQoreworICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1l
Vmlldyo+KG1fdmlldy0+cGFyZW50KCkpKQorICAgICAgICBpZiAoZnJhbWVWaWV3LT5ob3N0V2lu
ZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5zaG91bGRQbHVnaW5FbnRlckZ1bGxTY3JlZW4o
bV92aWV3LCBtX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKSkKKyAgICAgICAgICAgIG1fdmll
dy0+aGFuZGxlRnVsbFNjcmVlbkFsbG93ZWRFdmVudCgpOworfQorCit2b2lkIFBsdWdpblZpZXdQ
cml2YXRlOjpleGl0RnVsbFNjcmVlbigpCit7CisgICAgbV92aWV3LT5oYW5kbGVGdWxsU2NyZWVu
RXhpdEV2ZW50KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlld1ByaXZhdGU6OnJlcXVlc3RDZW50ZXJG
aXRab29tKCkKK3sKKyAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1l
Vmlldyo+KG1fdmlldy0+cGFyZW50KCkpOworCisgICAgaWYgKCFmcmFtZVZpZXcpCisgICAgICAg
IHJldHVybjsKKworICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGll
bnQoKS0+em9vbVRvQ29udGVudFJlY3QobV92aWV3LT5tX3dpbmRvd1JlY3QpOworfQorCit2b2lk
IFBsdWdpblZpZXdQcml2YXRlOjpsb2NrT3JpZW50YXRpb24oYm9vbCBsYW5kc2NhcGUpCit7Cisg
ICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3ZpZXct
PnBhcmVudCgpKTsKKworICAgIGlmICghZnJhbWVWaWV3KQorICAgICAgICByZXR1cm47CisKKyAg
ICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmxvY2tPcmll
bnRhdGlvbihsYW5kc2NhcGUpOworICAgIG1fb3JpZW50YXRpb25Mb2NrZWQgPSB0cnVlOworfQor
Cit2b2lkIFBsdWdpblZpZXdQcml2YXRlOjp1bmxvY2tPcmllbnRhdGlvbigpCit7CisgICAgaWYg
KCFtX29yaWVudGF0aW9uTG9ja2VkKQorICAgICAgICByZXR1cm47CisKKyAgICBGcmFtZVZpZXcq
IGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fdmlldy0+cGFyZW50KCkpOwor
CisgICAgaWYgKCFmcmFtZVZpZXcpCisgICAgICAgIHJldHVybjsKKworICAgIGZyYW1lVmlldy0+
aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+dW5sb2NrT3JpZW50YXRpb24oKTsK
KyAgICBtX29yaWVudGF0aW9uTG9ja2VkID0gZmFsc2U7Cit9CisKK3ZvaWQgUGx1Z2luVmlld1By
aXZhdGU6OnByZXZlbnRJZGxlKGJvb2wgcHJldmVudElkbGUpCit7CisgICAgRnJhbWVWaWV3KiBm
cmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3ZpZXctPnBhcmVudCgpKTsKKwor
ICAgIGlmIChwcmV2ZW50SWRsZSA9PSBtX2lkbGVQcmV2ZW50ZWQpCisgICAgICAgIHJldHVybjsK
KworICAgIGlmICghZnJhbWVWaWV3KQorICAgICAgICByZXR1cm47CisKKyAgICBmcmFtZVZpZXct
Pmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnNldFByZXZlbnRzU2NyZWVuRGlt
bWluZyhwcmV2ZW50SWRsZSk7CisgICAgbV9pZGxlUHJldmVudGVkID0gcHJldmVudElkbGU7Cit9
CisKK3ZvaWQgUGx1Z2luVmlld1ByaXZhdGU6OnNldEhvbGVQdW5jaChpbnQgeCwgaW50IHksIGlu
dCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpZiAod2lkdGggPiAwICYmIGhlaWdodCA+IDAp
CisgICAgICAgIG1faG9sZVB1bmNoUmVjdCA9IEludFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7
CisgICAgZWxzZQorICAgICAgICBtX2hvbGVQdW5jaFJlY3QgPSBJbnRSZWN0KCk7CisKKyAgICAv
LyBDbGlwIHRoZSBob2xlIHB1bmNoIHJlY3RhbmdsZSBpbiBjYXNlIGEgcGx1Z2luIGlzICdvdmVy
emVhbG91cycsIG9yIAorICAgIC8vIGRvZXMgbm90IGNsZWFuIHVwIHRoZSBob2xlIHB1bmNoIHJl
Y3RhbmdsZSBjb3JyZWN0bHkgd2hlbiBleGl0aW5nIAorICAgIC8vIGZ1bGxzY3JlZW4gKHdpbGwg
bWFzayBidWdzIGluIHRoZSBwbHVnaW4pLgorICAgIG1faG9sZVB1bmNoUmVjdC5pbnRlcnNlY3Qo
SW50UmVjdChJbnRQb2ludCgwLCAwKSwgbV92aWV3LT5mcmFtZVJlY3QoKS5zaXplKCkpKTsKKwor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBpZiAobV9wbGF0Zm9ybUxheWVy
KSB7CisgICAgICAgIEludFJlY3QgcmVjdCA9IG1faG9sZVB1bmNoUmVjdDsKKworICAgICAgICAv
LyBUcmFuc2xhdGUgZnJvbSBwbHVnaW4gY29vcmRpbmF0ZXMgdG8gY29udGVudHMgY29vcmRpbmF0
ZXMuCisgICAgICAgIGlmICghbV9ob2xlUHVuY2hSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAg
IHJlY3QubW92ZShtX3ZpZXctPmZyYW1lUmVjdCgpLngoKSwgbV92aWV3LT5mcmFtZVJlY3QoKS55
KCkpOworCisgICAgICAgIE93blB0cjxIb2xlUHVuY2hEYXRhPiBocCA9IGFkb3B0UHRyKG5ldyBI
b2xlUHVuY2hEYXRhKTsKKyAgICAgICAgaHAtPnggPSBtX2hvbGVQdW5jaFJlY3QueCgpOworICAg
ICAgICBocC0+eSA9IG1faG9sZVB1bmNoUmVjdC55KCk7CisgICAgICAgIGhwLT53ID0gbV9ob2xl
UHVuY2hSZWN0LndpZHRoKCk7CisgICAgICAgIGhwLT5oID0gbV9ob2xlUHVuY2hSZWN0LmhlaWdo
dCgpOworICAgICAgICBocC0+bGF5ZXIgPSBtX3BsYXRmb3JtTGF5ZXI7CisKKyAgICAgICAgLy8g
Tm90aWZ5IGNvbXBvc2l0aW5nIGxheWVyIGFuZCBwYWdlIGNsaWVudCBpbiBvcmRlciB0byBiZSBh
YmxlIHRvCisgICAgICAgIC8vIHB1bmNoIHRocm91Z2ggY29tcG9zaXRlZCBhbmQgbm9uLWNvbXBv
c2l0ZWQgcGFydHMgb2YgdGhlIHBhZ2UuCisgICAgICAgIGNhbGxPbk1haW5UaHJlYWQobnBTZXRI
b2xlUHVuY2hIYW5kbGVyLCBocC5sZWFrUHRyKCkpOyAvLyBucFNldEhvbGVQdW5jaEhhbmRsZXIo
KSB0YWtlcyBvd25lcnNoaXAgb2YgaHAuCisgICAgfQorI2VuZGlmCit9CisKK05QU3VyZmFjZSBQ
bHVnaW5WaWV3UHJpdmF0ZTo6bG9ja0JhY2tCdWZmZXIoKQoreworICAgIHB0aHJlYWRfbXV0ZXhf
bG9jaygmbV9iYWNrQnVmZmVyTXV0ZXgpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6QnVmZmVyKiBidWZmZXIgPSBtX3BsdWdpbkJ1ZmZlcnNbKG1fcGx1Z2luRnJvbnRCdWZm
ZXIgKyAxKSAlIFBMVUdJTl9CVUZGRVJTXTsKKworICAgIGlmICghYnVmZmVyIHx8ICFCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OnBsYXRmb3JtQnVmZmVySGFuZGxlKGJ1ZmZlcikpIHsK
KyAgICAgICAgdW5sb2NrQmFja0J1ZmZlcigpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisK
KyAgICByZXR1cm4gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpwbGF0Zm9ybUJ1ZmZl
ckhhbmRsZShidWZmZXIpOworfQorCit2b2lkIFBsdWdpblZpZXdQcml2YXRlOjp1bmxvY2tCYWNr
QnVmZmVyKCkKK3sKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9iYWNrQnVmZmVyTXV0ZXgp
OworfQorCitCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogUGx1Z2luVmll
d1ByaXZhdGU6OmxvY2tSZWFkRnJvbnRCdWZmZXJJbnRlcm5hbCgpCit7CisgICAgcHRocmVhZF9y
d2xvY2tfcmRsb2NrKCZtX2Zyb250QnVmZmVyUndMb2NrKTsKKyAgICByZXR1cm4gbV9wbHVnaW5C
dWZmZXJzW21fcGx1Z2luRnJvbnRCdWZmZXJdOworfQorCitOUFN1cmZhY2UgUGx1Z2luVmlld1By
aXZhdGU6OmxvY2tSZWFkRnJvbnRCdWZmZXIoKQoreworICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpHcmFwaGljczo6QnVmZmVyKiBidWZmZXIgPSBsb2NrUmVhZEZyb250QnVmZmVySW50ZXJuYWwo
KTsKKworICAgIGlmICghYnVmZmVyIHx8ICFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OnBsYXRmb3JtQnVmZmVySGFuZGxlKGJ1ZmZlcikpIHsKKyAgICAgICAgdW5sb2NrUmVhZEZyb250
QnVmZmVyKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OnBsYXRmb3JtQnVmZmVySGFuZGxlKGJ1ZmZlcik7Cit9
CisKK3ZvaWQgUGx1Z2luVmlld1ByaXZhdGU6OnVubG9ja1JlYWRGcm9udEJ1ZmZlcigpCit7Cisg
ICAgcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZtX2Zyb250QnVmZmVyUndMb2NrKTsKK30KKwordm9p
ZCBQbHVnaW5WaWV3UHJpdmF0ZTo6c3dhcEJ1ZmZlcnMoKQoreworICAgIFB0aHJlYWRNdXRleExv
Y2tlciBiYWNrTG9jaygmbV9iYWNrQnVmZmVyTXV0ZXgpOworICAgIFB0aHJlYWRXcml0ZUxvY2tl
ciBmcm9udExvY2soJm1fZnJvbnRCdWZmZXJSd0xvY2spOworICAgIG1fcGx1Z2luRnJvbnRCdWZm
ZXIgPSAobV9wbHVnaW5Gcm9udEJ1ZmZlciArIDEpICUgMjsKK30KKworYm9vbCBQbHVnaW5WaWV3
UHJpdmF0ZTo6Y3JlYXRlQnVmZmVycyhOUFN1cmZhY2VGb3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgs
IGludCBoZWlnaHQpCit7CisgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKworICAgIFB0aHJlYWRN
dXRleExvY2tlciBiYWNrTG9jaygmbV9iYWNrQnVmZmVyTXV0ZXgpOworICAgIFB0aHJlYWRXcml0
ZUxvY2tlciBmcm9udExvY2soJm1fZnJvbnRCdWZmZXJSd0xvY2spOworCisgICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBQTFVHSU5fQlVGRkVSUzsgaSsrKSB7CisgICAgICAgIGlmIChtX3BsdWdpbkJ1
ZmZlcnNbaV0pIHsKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6
ZGVzdHJveUJ1ZmZlcihtX3BsdWdpbkJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgbV9wbHVnaW5C
dWZmZXJzW2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhl
aWdodCA8PSAwKQorICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgIGVsc2Ugewor
ICAgICAgICAgICAgbV9wbHVnaW5CdWZmZXJzW2ldID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06Okdy
YXBoaWNzOjpjcmVhdGVCdWZmZXIoCisgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkludFNpemUod2lkdGgsIGhlaWdodCksCisgICAgICAgICAgICAgICAgdG9CdWZmZXJUeXBl
KGZvcm1hdCkpOworCisgICAgICAgICAgICBpZiAoIW1fcGx1Z2luQnVmZmVyc1tpXSkKKyAgICAg
ICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAo
c3VjY2VzcykgeworICAgICAgICBtX3BsdWdpbkJ1ZmZlclNpemUgPSBJbnRTaXplKHdpZHRoLCBo
ZWlnaHQpOworICAgICAgICBtX3BsdWdpbkJ1ZmZlclR5cGUgPSB0b0J1ZmZlclR5cGUoZm9ybWF0
KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3BsdWdpbkJ1ZmZlclNpemUgPSBJbnRTaXplKCk7
CisgICAgICAgIG1fcGx1Z2luQnVmZmVyVHlwZSA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6UGx1Z2luQnVmZmVyV2l0aEFscGhhOworICAgICAgICBkZXN0cm95QnVmZmVycygpOwor
ICAgIH0KKworICAgIHJldHVybiBzdWNjZXNzOworfQorCitib29sIFBsdWdpblZpZXdQcml2YXRl
OjpyZXNpemVCdWZmZXJzKE5QU3VyZmFjZUZvcm1hdCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhl
aWdodCkKK3sKKyAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOworCisgICAgLy8gSWYgdGhlcmUgaXMg
bm8gYnVmZmVyIGNyZWF0ZWQsIHRoZW4gdHJ5IHRvIGNyZWF0ZSBpdC4KKyAgICBpZiAoIW1fcGx1
Z2luQnVmZmVyU2l6ZS53aWR0aCgpIHx8ICFtX3BsdWdpbkJ1ZmZlclNpemUuaGVpZ2h0KCkpCisg
ICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXJzKGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisKKyAg
ICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpCisgICAgICAgIHJldHVybiBkZXN0cm95QnVmZmVycygp
OworCisgICAgUHRocmVhZE11dGV4TG9ja2VyIGJhY2tMb2NrKCZtX2JhY2tCdWZmZXJNdXRleCk7
CisgICAgUHRocmVhZFdyaXRlTG9ja2VyIGZyb250TG9jaygmbV9mcm9udEJ1ZmZlclJ3TG9jayk7
CisKKyAgICBmb3IgKGludCBpID0gMDsgKGkgPCBQTFVHSU5fQlVGRkVSUykgJiYgc3VjY2Vzczsg
aSsrKSB7CisgICAgICAgIHN1Y2Nlc3MgJj0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNz
OjpyZWFsbG9jQnVmZmVyKG1fcGx1Z2luQnVmZmVyc1tpXSwKKyAgICAgICAgICAgIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpJbnRTaXplKHdpZHRoLCBoZWlnaHQpLAorICAgICAgICAgICAgdG9CdWZm
ZXJUeXBlKGZvcm1hdCkpOworICAgIH0KKworICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgIG1f
cGx1Z2luQnVmZmVyU2l6ZSA9IEludFNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIG1fcGx1
Z2luQnVmZmVyVHlwZSA9IHRvQnVmZmVyVHlwZShmb3JtYXQpOworICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisKKyAgICAvLyBBdHRlbXB0IHRvIHVuZG8gaWYgd2UgZmFpbGVkIHRvIGdldCB0
aGUgbmV3IHNpemUvZm9ybWF0LiBXZSBjYW4ndCBndWFyYW50ZWUKKyAgICAvLyB3ZSB3aWxsIGdl
dCBpdCBiYWNrIHRob3VnaC4KKyAgICBpZiAoIW1fcGx1Z2luQnVmZmVyU2l6ZS53aWR0aCgpIHx8
ICFtX3BsdWdpbkJ1ZmZlclNpemUuaGVpZ2h0KCkpIHsKKyAgICAgICAgZGVzdHJveUJ1ZmZlcnMo
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgdW5kb25lID0gdHJ1
ZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBMVUdJTl9CVUZGRVJTOyBpKyspIHsKKyAgICAg
ICAgdW5kb25lICY9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6cmVhbGxvY0J1ZmZl
cihtX3BsdWdpbkJ1ZmZlcnNbaV0sCisgICAgICAgICAgICBtX3BsdWdpbkJ1ZmZlclNpemUsIG1f
cGx1Z2luQnVmZmVyVHlwZSk7CisgICAgfQorCisgICAgLy8gSWYgd2UgZmFpbCB0byB1bmRvLCBk
ZWxldGUgdGhlIGJ1ZmZlcnMgYWx0b2dldGhlci4KKyAgICBpZiAoIXVuZG9uZSkKKyAgICAgICAg
ZGVzdHJveUJ1ZmZlcnMoKTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBQbHVnaW5W
aWV3UHJpdmF0ZTo6ZGVzdHJveUJ1ZmZlcnMoKQoreworICAgIFB0aHJlYWRNdXRleExvY2tlciBi
YWNrTG9jaygmbV9iYWNrQnVmZmVyTXV0ZXgpOworICAgIFB0aHJlYWRXcml0ZUxvY2tlciBmcm9u
dExvY2soJm1fZnJvbnRCdWZmZXJSd0xvY2spOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQ
TFVHSU5fQlVGRkVSUzsgaSsrKSB7CisgICAgICAgIGlmIChtX3BsdWdpbkJ1ZmZlcnNbaV0pIHsK
KyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6ZGVzdHJveUJ1ZmZl
cihtX3BsdWdpbkJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgbV9wbHVnaW5CdWZmZXJzW2ldID0g
MDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtX3BsdWdpbkJ1ZmZlclNpemUgPSBJbnRTaXplKCk7
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5WaWV3UHJpdmF0ZUJs
YWNrQmVycnkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVy
cnkvUGx1Z2luVmlld1ByaXZhdGVCbGFja0JlcnJ5LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld1ByaXZhdGVCbGFja0JlcnJ5LmgJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEg
UmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMw
MSAgVVNBCisgKi8KKworI2lmbmRlZiBQbHVnaW5WaWV3UHJpdmF0ZUJsYWNrQmVycnlfaAorI2Rl
ZmluZSBQbHVnaW5WaWV3UHJpdmF0ZUJsYWNrQmVycnlfaAorCisjaW5jbHVkZSAiUGx1Z2luVmll
dy5oIgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2RlZmluZSBQTFVHSU5fQlVGRkVSUyAyCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUGx1Z2luVmlld1ByaXZhdGUgeworCitwdWJs
aWM6CisgICAgUGx1Z2luVmlld1ByaXZhdGUoUGx1Z2luVmlldyopOworICAgIH5QbHVnaW5WaWV3
UHJpdmF0ZSgpOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXJU
eXBlIHRvQnVmZmVyVHlwZShOUFN1cmZhY2VGb3JtYXQpOworICAgIHZvaWQgc2V0Wm9vbUZhY3Rv
cihmbG9hdCk7CisgICAgdm9pZCBzZXRWaXNpYmxlUmVjdHMoY29uc3QgTlBSZWN0IHJlY3RzW10s
IGludDMyX3QgY291bnQpOworICAgIHZvaWQgY2xlYXJWaXNpYmxlUmVjdHMoKTsKKyAgICB2b2lk
IHNob3dLZXlib2FyZChib29sIHZhbHVlKTsKKyAgICB2b2lkIHJlcXVlc3RGdWxsU2NyZWVuKCk7
CisgICAgdm9pZCBleGl0RnVsbFNjcmVlbigpOworICAgIHZvaWQgcmVxdWVzdENlbnRlckZpdFpv
b20oKTsKKyAgICB2b2lkIGxvY2tPcmllbnRhdGlvbihib29sIGxhbmRzY2FwZSk7CisgICAgdm9p
ZCB1bmxvY2tPcmllbnRhdGlvbigpOworICAgIHZvaWQgcHJldmVudElkbGUoYm9vbCBwcmV2ZW50
SWRsZSk7CisgICAgdm9pZCBzZXRIb2xlUHVuY2goaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGlu
dCBoZWlnaHQpOworICAgIE5QU3VyZmFjZSBsb2NrQmFja0J1ZmZlcigpOworICAgIHZvaWQgdW5s
b2NrQmFja0J1ZmZlcigpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVm
ZmVyKiBsb2NrUmVhZEZyb250QnVmZmVySW50ZXJuYWwoKTsKKyAgICBOUFN1cmZhY2UgbG9ja1Jl
YWRGcm9udEJ1ZmZlcigpOworICAgIHZvaWQgdW5sb2NrUmVhZEZyb250QnVmZmVyKCk7CisgICAg
dm9pZCBzd2FwQnVmZmVycygpOworICAgIGJvb2wgY3JlYXRlQnVmZmVycyhOUFN1cmZhY2VGb3Jt
YXQsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgYm9vbCByZXNpemVCdWZmZXJzKE5QU3Vy
ZmFjZUZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICBib29sIGRlc3Ryb3lCdWZm
ZXJzKCk7CisKK3ByaXZhdGU6CisgICAgUGx1Z2luVmlldyogbV92aWV3OworICAgIHB0aHJlYWRf
bXV0ZXhfdCBtX2JhY2tCdWZmZXJNdXRleDsKKyAgICBwdGhyZWFkX3J3bG9ja190IG1fZnJvbnRC
dWZmZXJSd0xvY2s7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZl
ciogbV9wbHVnaW5CdWZmZXJzW1BMVUdJTl9CVUZGRVJTXTsKKyAgICBJbnRTaXplIG1fcGx1Z2lu
QnVmZmVyU2l6ZTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlclR5
cGUgbV9wbHVnaW5CdWZmZXJUeXBlOworICAgIGludCBtX3BsdWdpbkZyb250QnVmZmVyOworCisg
ICAgSW50UmVjdCBtX2hvbGVQdW5jaFJlY3Q7CisgICAgSW50UmVjdCBtX2tlZXBWaXNpYmxlUmVj
dDsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBSZWZQdHI8UGxhdGZv
cm1MYXllcj4gbV9wbGF0Zm9ybUxheWVyOworI2VuZGlmCisKKyAgICBib29sIG1faWRsZVByZXZl
bnRlZDsKKyAgICBib29sIG1faGFzUGVuZGluZ0dlb21ldHJ5Q2hhbmdlOworICAgIGJvb2wgbV9z
ZW50T25Mb2FkOworICAgIGJvb2wgbV9pc0Z1bGxTY3JlZW47CisgICAgYm9vbCBtX2lzRm9jdXNl
ZDsKKyAgICBib29sIG1fb3JpZW50YXRpb25Mb2NrZWQ7CisgICAgYm9vbCBtX2lzQmFja2dyb3Vu
ZFBsYXlpbmc7CisKKyAgICBzdGQ6OnN0cmluZyBtX3BsdWdpblVuaXF1ZVByZWZpeDsKKworICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIG1faW52YWxpZGF0ZVJlZ2lvbjsK
KyAgICBmcmllbmQgY2xhc3MgUGx1Z2luVmlldzsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117122</attachid>
            <date>2011-11-29 21:59:19 -0800</date>
            <delta_ts>2011-11-30 07:30:04 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73185-20111130135952.patch</filename>
            <type>text/plain</type>
            <size>25984</size>
            <attacher name="Charles Wei">charles.wei</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwMTQ0OSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE3IEBACisyMDExLTExLTI5ICBXZWkgQ2hh
cmxlcyAgPGNoYXJsZXMud2VpQHRvcmNobW9iaWxlLmNvbS5jbj4KKworICAgICAgICBbYmxhY2ti
ZXJyeV0gVXBzdHJlYW0gQmxhY2tCZXJyeSBwb3J0aW5nIG9mIHBsdWdpbiBmcmFtZXdvcmsKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczMTg1CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3Rz
IGZvciBub3cuCisKKyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnkvTlBDYWxsYmFja3NCbGFj
a0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAgICogcGx1Z2lucy9ibGFja2JlcnJ5L05QQ2FsbGJh
Y2tzQmxhY2tCZXJyeS5oOiBBZGRlZC4KKyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnkvUGx1
Z2luVmlld1ByaXZhdGVCbGFja0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAgICogcGx1Z2lucy9i
bGFja2JlcnJ5L1BsdWdpblZpZXdQcml2YXRlQmxhY2tCZXJyeS5oOiBBZGRlZC4KKwogMjAxMS0x
MS0yOSAgRGF2aWQgTGV2aW4gIDxsZXZpbkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgQWRkIGEg
d2F5IHRvIHJldmVydCBhIHZhcmlhYmxlIHRvIGl0cyBwcmV2aW91cyB2YWx1ZSBhZnRlciBsZWF2
aW5nIGEgc2NvcGUuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvTlBD
YWxsYmFja3NCbGFja0JlcnJ5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbHVn
aW5zL2JsYWNrYmVycnkvTlBDYWxsYmFja3NCbGFja0JlcnJ5LmNwcAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9OUENhbGxiYWNrc0JsYWNrQmVycnku
Y3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2Vy
IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjEx
MC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTlBDYWxs
YmFja3NCbGFja0JlcnJ5LmgiCisKKyNpbmNsdWRlICJQbHVnaW5WaWV3UHJpdmF0ZUJsYWNrQmVy
cnkuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyNpbmNsdWRlICJQbHVn
aW5MYXllcldlYktpdFRocmVhZC5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
UHRocmVhZE11dGV4TG9ja2VyOjpQdGhyZWFkTXV0ZXhMb2NrZXIocHRocmVhZF9tdXRleF90KiBt
dXRleCkKKyAgICA6IG1fbXV0ZXgobXV0ZXgpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKG1f
bXV0ZXgpOworfQorCitQdGhyZWFkTXV0ZXhMb2NrZXI6On5QdGhyZWFkTXV0ZXhMb2NrZXIoKQor
eworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG1fbXV0ZXgpOworfQorCitQdGhyZWFkUmVhZExv
Y2tlcjo6UHRocmVhZFJlYWRMb2NrZXIocHRocmVhZF9yd2xvY2tfdCogcndsb2NrKQorICAgIDog
bV9yd2xvY2socndsb2NrKQoreworICAgIHB0aHJlYWRfcndsb2NrX3JkbG9jayhtX3J3bG9jayk7
Cit9CisKK1B0aHJlYWRSZWFkTG9ja2VyOjp+UHRocmVhZFJlYWRMb2NrZXIoKQoreworICAgIHB0
aHJlYWRfcndsb2NrX3VubG9jayhtX3J3bG9jayk7Cit9CisKK1B0aHJlYWRXcml0ZUxvY2tlcjo6
UHRocmVhZFdyaXRlTG9ja2VyKHB0aHJlYWRfcndsb2NrX3QqIHJ3bG9jaykKKyAgICA6IG1fcnds
b2NrKHJ3bG9jaykKK3sKKyAgICBwdGhyZWFkX3J3bG9ja193cmxvY2sobV9yd2xvY2spOworfQor
CitQdGhyZWFkV3JpdGVMb2NrZXI6On5QdGhyZWFkV3JpdGVMb2NrZXIoKQoreworICAgIHB0aHJl
YWRfcndsb2NrX3VubG9jayhtX3J3bG9jayk7Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCit2b2lkIG5wU2V0SG9sZVB1bmNoSGFuZGxlcih2b2lkKiBob2xlUHVuY2hEYXRh
KQoreworICAgIE93blB0cjxIb2xlUHVuY2hEYXRhPiBkYXRhID0gYWRvcHRQdHIoc3RhdGljX2Nh
c3Q8SG9sZVB1bmNoRGF0YSo+KGhvbGVQdW5jaERhdGEpKTsKKyAgICBpZiAoZGF0YS0+bGF5ZXIp
CisgICAgICAgIGRhdGEtPmxheWVyLT5zZXRIb2xlUHVuY2hSZWN0KEludFJlY3QoZGF0YS0+eCwg
ZGF0YS0+eSwgZGF0YS0+dywgZGF0YS0+aCkpOworfQorI2VuZGlmCisKKy8vIE5QQVBJIGNhbGxi
YWNrIGZ1bmN0aW9ucworCit2b2lkIHNldFZpc2libGVSZWN0cyhOUFAgaW5zdGFuY2UsIGNvbnN0
IE5QUmVjdCByZWN0c1tdLCBpbnQzMl90IGNvdW50KQoreworICAgIFBsdWdpblZpZXcqIHZpZXcg
PSBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3Kj4oaW5zdGFuY2UtPm5kYXRhKTsKKyAgICBQbHVnaW5W
aWV3UHJpdmF0ZSogdmlld1ByaXZhdGUgPSB2aWV3LT5nZXRQcml2YXRlKCk7CisgICAgdmlld1By
aXZhdGUtPnNldFZpc2libGVSZWN0cyhyZWN0cywgY291bnQpOworfQorCit2b2lkIGNsZWFyVmlz
aWJsZVJlY3RzKE5QUCBpbnN0YW5jZSkKK3sKKyAgICBQbHVnaW5WaWV3KiB2aWV3ID0gc3RhdGlj
X2Nhc3Q8UGx1Z2luVmlldyo+KGluc3RhbmNlLT5uZGF0YSk7CisgICAgUGx1Z2luVmlld1ByaXZh
dGUqIHZpZXdQcml2YXRlID0gdmlldy0+Z2V0UHJpdmF0ZSgpOworICAgIHZpZXdQcml2YXRlLT5j
bGVhclZpc2libGVSZWN0cygpOworfQorCit2b2lkIHNob3dLZXlib2FyZChOUFAgaW5zdGFuY2Us
IGJvb2wgdmFsdWUpCit7CisgICAgUGx1Z2luVmlldyogdmlldyA9IHN0YXRpY19jYXN0PFBsdWdp
blZpZXcqPihpbnN0YW5jZS0+bmRhdGEpOworICAgIFBsdWdpblZpZXdQcml2YXRlKiB2aWV3UHJp
dmF0ZSA9IHZpZXctPmdldFByaXZhdGUoKTsKKyAgICB2aWV3UHJpdmF0ZS0+c2hvd0tleWJvYXJk
KHZhbHVlKTsKK30KKwordm9pZCByZXF1ZXN0RnVsbFNjcmVlbihOUFAgaW5zdGFuY2UpCit7Cisg
ICAgUGx1Z2luVmlldyogdmlldyA9IHN0YXRpY19jYXN0PFBsdWdpblZpZXcqPihpbnN0YW5jZS0+
bmRhdGEpOworICAgIFBsdWdpblZpZXdQcml2YXRlKiB2aWV3UHJpdmF0ZSA9IHZpZXctPmdldFBy
aXZhdGUoKTsKKyAgICB2aWV3UHJpdmF0ZS0+cmVxdWVzdEZ1bGxTY3JlZW4oKTsKK30KKwordm9p
ZCBleGl0RnVsbFNjcmVlbihOUFAgaW5zdGFuY2UpCit7CisgICAgUGx1Z2luVmlldyogdmlldyA9
IHN0YXRpY19jYXN0PFBsdWdpblZpZXcqPihpbnN0YW5jZS0+bmRhdGEpOworICAgIFBsdWdpblZp
ZXdQcml2YXRlKiB2aWV3UHJpdmF0ZSA9IHZpZXctPmdldFByaXZhdGUoKTsKKyAgICB2aWV3UHJp
dmF0ZS0+ZXhpdEZ1bGxTY3JlZW4oKTsKK30KKwordm9pZCByZXF1ZXN0Q2VudGVyRml0Wm9vbShO
UFAgaW5zdGFuY2UpCit7CisgICAgUGx1Z2luVmlldyogdmlldyA9IHN0YXRpY19jYXN0PFBsdWdp
blZpZXcqPihpbnN0YW5jZS0+bmRhdGEpOworICAgIFBsdWdpblZpZXdQcml2YXRlKiB2aWV3UHJp
dmF0ZSA9IHZpZXctPmdldFByaXZhdGUoKTsKKyAgICB2aWV3UHJpdmF0ZS0+cmVxdWVzdENlbnRl
ckZpdFpvb20oKTsKK30KKwordm9pZCBsb2NrT3JpZW50YXRpb24oTlBQIGluc3RhbmNlLCBib29s
IGxhbmRzY2FwZSkKK3sKKyAgICBQbHVnaW5WaWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8UGx1Z2lu
Vmlldyo+KGluc3RhbmNlLT5uZGF0YSk7CisgICAgUGx1Z2luVmlld1ByaXZhdGUqIHZpZXdQcml2
YXRlID0gdmlldy0+Z2V0UHJpdmF0ZSgpOworICAgIHZpZXdQcml2YXRlLT5sb2NrT3JpZW50YXRp
b24obGFuZHNjYXBlKTsKK30KKwordm9pZCB1bmxvY2tPcmllbnRhdGlvbihOUFAgaW5zdGFuY2Up
Cit7CisgICAgUGx1Z2luVmlldyogdmlldyA9IHN0YXRpY19jYXN0PFBsdWdpblZpZXcqPihpbnN0
YW5jZS0+bmRhdGEpOworICAgIFBsdWdpblZpZXdQcml2YXRlKiB2aWV3UHJpdmF0ZSA9IHZpZXct
PmdldFByaXZhdGUoKTsKKyAgICB2aWV3UHJpdmF0ZS0+dW5sb2NrT3JpZW50YXRpb24oKTsKK30K
Kwordm9pZCBwcmV2ZW50SWRsZShOUFAgaW5zdGFuY2UsIGJvb2wgcHJldmVudElkbGUpCit7Cisg
ICAgUGx1Z2luVmlldyogdmlldyA9IHN0YXRpY19jYXN0PFBsdWdpblZpZXcqPihpbnN0YW5jZS0+
bmRhdGEpOworICAgIFBsdWdpblZpZXdQcml2YXRlKiB2aWV3UHJpdmF0ZSA9IHZpZXctPmdldFBy
aXZhdGUoKTsKKyAgICB2aWV3UHJpdmF0ZS0+cHJldmVudElkbGUocHJldmVudElkbGUpOworfQor
CitOUFN1cmZhY2UgbG9ja0JhY2tCdWZmZXIoTlBQIGluc3RhbmNlKQoreworICAgIFBsdWdpblZp
ZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3Kj4oaW5zdGFuY2UtPm5kYXRhKTsKKyAg
ICBQbHVnaW5WaWV3UHJpdmF0ZSogdmlld1ByaXZhdGUgPSB2aWV3LT5nZXRQcml2YXRlKCk7Cisg
ICAgcmV0dXJuIHZpZXdQcml2YXRlLT5sb2NrQmFja0J1ZmZlcigpOworfQorCit2b2lkIHVubG9j
a0JhY2tCdWZmZXIoTlBQIGluc3RhbmNlKQoreworICAgIFBsdWdpblZpZXcqIHZpZXcgPSBzdGF0
aWNfY2FzdDxQbHVnaW5WaWV3Kj4oaW5zdGFuY2UtPm5kYXRhKTsKKyAgICBQbHVnaW5WaWV3UHJp
dmF0ZSogdmlld1ByaXZhdGUgPSB2aWV3LT5nZXRQcml2YXRlKCk7CisgICAgdmlld1ByaXZhdGUt
PnVubG9ja0JhY2tCdWZmZXIoKTsKK30KKworTlBTdXJmYWNlIGxvY2tSZWFkRnJvbnRCdWZmZXIo
TlBQIGluc3RhbmNlKQoreworUGx1Z2luVmlldyogdmlldyA9IHN0YXRpY19jYXN0PFBsdWdpblZp
ZXcqPihpbnN0YW5jZS0+bmRhdGEpOworUGx1Z2luVmlld1ByaXZhdGUqIHZpZXdQcml2YXRlID0g
dmlldy0+Z2V0UHJpdmF0ZSgpOworcmV0dXJuIHZpZXdQcml2YXRlLT5sb2NrUmVhZEZyb250QnVm
ZmVyKCk7Cit9CisKK3ZvaWQgdW5sb2NrUmVhZEZyb250QnVmZmVyKE5QUCBpbnN0YW5jZSkKK3sK
KyAgICBQbHVnaW5WaWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8UGx1Z2luVmlldyo+KGluc3RhbmNl
LT5uZGF0YSk7CisgICAgUGx1Z2luVmlld1ByaXZhdGUqIHZpZXdQcml2YXRlID0gdmlldy0+Z2V0
UHJpdmF0ZSgpOworICAgIHZpZXdQcml2YXRlLT51bmxvY2tSZWFkRnJvbnRCdWZmZXIoKTsKK30K
Kwordm9pZCBzd2FwQnVmZmVycyhOUFAgaW5zdGFuY2UpCit7CisgICAgUGx1Z2luVmlldyogdmll
dyA9IHN0YXRpY19jYXN0PFBsdWdpblZpZXcqPihpbnN0YW5jZS0+bmRhdGEpOworICAgIFBsdWdp
blZpZXdQcml2YXRlKiB2aWV3UHJpdmF0ZSA9IHZpZXctPmdldFByaXZhdGUoKTsKKyAgICB2aWV3
UHJpdmF0ZS0+c3dhcEJ1ZmZlcnMoKTsKK30KKworYm9vbCBjcmVhdGVCdWZmZXJzKE5QUCBpbnN0
YW5jZSwgTlBTdXJmYWNlRm9ybWF0IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorewor
ICAgIFBsdWdpblZpZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3Kj4oaW5zdGFuY2Ut
Pm5kYXRhKTsKKyAgICBQbHVnaW5WaWV3UHJpdmF0ZSogdmlld1ByaXZhdGUgPSB2aWV3LT5nZXRQ
cml2YXRlKCk7CisgICAgcmV0dXJuIHZpZXdQcml2YXRlLT5jcmVhdGVCdWZmZXJzKGZvcm1hdCwg
d2lkdGgsIGhlaWdodCk7Cit9CisKK2Jvb2wgZGVzdHJveUJ1ZmZlcnMoTlBQIGluc3RhbmNlKQor
eworICAgIFBsdWdpblZpZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3Kj4oaW5zdGFu
Y2UtPm5kYXRhKTsKKyAgICBQbHVnaW5WaWV3UHJpdmF0ZSogdmlld1ByaXZhdGUgPSB2aWV3LT5n
ZXRQcml2YXRlKCk7CisgICAgcmV0dXJuIHZpZXdQcml2YXRlLT5kZXN0cm95QnVmZmVycygpOwor
fQorCitib29sIHJlc2l6ZUJ1ZmZlcnMoTlBQIGluc3RhbmNlLCBOUFN1cmZhY2VGb3JtYXQgZm9y
bWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgUGx1Z2luVmlldyogdmlldyA9IHN0
YXRpY19jYXN0PFBsdWdpblZpZXcqPihpbnN0YW5jZS0+bmRhdGEpOworICAgIFBsdWdpblZpZXdQ
cml2YXRlKiB2aWV3UHJpdmF0ZSA9IHZpZXctPmdldFByaXZhdGUoKTsKKyAgICByZXR1cm4gdmll
d1ByaXZhdGUtPnJlc2l6ZUJ1ZmZlcnMoZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKK30KKwordm9p
ZCBzZXRIb2xlUHVuY2goTlBQIGluc3RhbmNlLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50
IGhlaWdodCkKK3sKKyAgICBQbHVnaW5WaWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8UGx1Z2luVmll
dyo+KGluc3RhbmNlLT5uZGF0YSk7CisgICAgUGx1Z2luVmlld1ByaXZhdGUqIHZpZXdQcml2YXRl
ID0gdmlldy0+Z2V0UHJpdmF0ZSgpOworICAgIHZpZXdQcml2YXRlLT5zZXRIb2xlUHVuY2goeCwg
eSwgd2lkdGgsIGhlaWdodCk7Cit9CisKK05QQ2FsbGJhY2tzIHNfTnBDYWxsYmFja3MgPSB7Cisg
ICAgc2V0VmlzaWJsZVJlY3RzLAorICAgIGNsZWFyVmlzaWJsZVJlY3RzLAorICAgIHNob3dLZXli
b2FyZCwKKyAgICByZXF1ZXN0RnVsbFNjcmVlbiwKKyAgICBleGl0RnVsbFNjcmVlbiwKKyAgICBy
ZXF1ZXN0Q2VudGVyRml0Wm9vbSwKKyAgICBsb2NrT3JpZW50YXRpb24sCisgICAgdW5sb2NrT3Jp
ZW50YXRpb24sCisgICAgcHJldmVudElkbGUsCisgICAgbG9ja0JhY2tCdWZmZXIsCisgICAgdW5s
b2NrQmFja0J1ZmZlciwKKyAgICBsb2NrUmVhZEZyb250QnVmZmVyLAorICAgIHVubG9ja1JlYWRG
cm9udEJ1ZmZlciwKKyAgICBzd2FwQnVmZmVycywKKyAgICBjcmVhdGVCdWZmZXJzLAorICAgIGRl
c3Ryb3lCdWZmZXJzLAorICAgIHJlc2l6ZUJ1ZmZlcnMsCisgICAgc2V0SG9sZVB1bmNoCit9Owor
Cit9IC8vIE5hbWVzcGFjZSBXZWJDb3JlCisKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMv
YmxhY2tiZXJyeS9OUENhbGxiYWNrc0JsYWNrQmVycnkuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvTlBDYWxsYmFja3NCbGFja0JlcnJ5LmgJKHJldmlz
aW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvTlBDYWxsYmFja3NC
bGFja0JlcnJ5LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBN
QSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBOUENhbGxiYWNrc0JsYWNrQmVycnlf
aAorI2RlZmluZSBOUENhbGxiYWNrc0JsYWNrQmVycnlfaAorCisjaW5jbHVkZSA8UGx1Z2luVmll
dy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdHJ1
Y3QgUHRocmVhZE11dGV4TG9ja2VyIHsKKyAgICBQdGhyZWFkTXV0ZXhMb2NrZXIocHRocmVhZF9t
dXRleF90Kik7CisgICAgflB0aHJlYWRNdXRleExvY2tlcigpOworCisgICAgcHRocmVhZF9tdXRl
eF90KiBtX211dGV4OworfTsKKworc3RydWN0IFB0aHJlYWRSZWFkTG9ja2VyIHsKKyAgICBQdGhy
ZWFkUmVhZExvY2tlcihwdGhyZWFkX3J3bG9ja190Kik7CisgICAgflB0aHJlYWRSZWFkTG9ja2Vy
KCk7CisKKyAgICBwdGhyZWFkX3J3bG9ja190KiBtX3J3bG9jazsKK307CisKK3N0cnVjdCBQdGhy
ZWFkV3JpdGVMb2NrZXIgeworICAgIFB0aHJlYWRXcml0ZUxvY2tlcihwdGhyZWFkX3J3bG9ja190
Kik7CisgICAgflB0aHJlYWRXcml0ZUxvY2tlcigpOworCisgICAgcHRocmVhZF9yd2xvY2tfdCog
bV9yd2xvY2s7Cit9OworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorc3RydWN0
IEhvbGVQdW5jaERhdGEgeworICAgIGludCB4LCB5OworICAgIGludCB3LCBoOworICAgIFJlZlB0
cjxQbGF0Zm9ybUxheWVyPiBsYXllcjsKK307CisKK3ZvaWQgbnBTZXRIb2xlUHVuY2hIYW5kbGVy
KHZvaWQqIGhvbGVQdW5jaERhdGEpOworI2VuZGlmCisKKy8vIFN0YXRpYyBOUEFQSSBDYWxsYmFj
a3MKKwordm9pZCBzZXRWaXNpYmxlUmVjdHMoTlBQIGluc3RhbmNlLCBjb25zdCBOUFJlY3QgcmVj
dHNbXSwgaW50MzJfdCBjb3VudCk7Cit2b2lkIGNsZWFyVmlzaWJsZVJlY3RzKE5QUCBpbnN0YW5j
ZSk7Cit2b2lkIHNob3dLZXlib2FyZChOUFAgaW5zdGFuY2UsIGJvb2wgdmFsdWUpOwordm9pZCBy
ZXF1ZXN0RnVsbFNjcmVlbihOUFAgaW5zdGFuY2UpOwordm9pZCBleGl0RnVsbFNjcmVlbihOUFAg
aW5zdGFuY2UpOwordm9pZCByZXF1ZXN0Q2VudGVyRml0Wm9vbShOUFAgaW5zdGFuY2UpOwordm9p
ZCBsb2NrT3JpZW50YXRpb24oTlBQIGluc3RhbmNlLCBib29sIGxhbmRzY2FwZSk7Cit2b2lkIHVu
bG9ja09yaWVudGF0aW9uKE5QUCBpbnN0YW5jZSk7Cit2b2lkIHByZXZlbnRJZGxlKE5QUCBpbnN0
YW5jZSwgYm9vbCBwcmV2ZW50SWRsZSk7CitOUFN1cmZhY2UgbG9ja0JhY2tCdWZmZXIoTlBQIGlu
c3RhbmNlKTsKK3ZvaWQgdW5sb2NrQmFja0J1ZmZlcihOUFAgaW5zdGFuY2UpOworTlBTdXJmYWNl
IGxvY2tSZWFkRnJvbnRCdWZmZXIoTlBQIGluc3RhbmNlKTsKK3ZvaWQgdW5sb2NrUmVhZEZyb250
QnVmZmVyKE5QUCBpbnN0YW5jZSk7Cit2b2lkIHN3YXBCdWZmZXJzKE5QUCBpbnN0YW5jZSk7Citi
b29sIGNyZWF0ZUJ1ZmZlcnMoTlBQIGluc3RhbmNlLCBOUFN1cmZhY2VGb3JtYXQsIGludCB3aWR0
aCwgaW50IGhlaWdodCk7Citib29sIGRlc3Ryb3lCdWZmZXJzKE5QUCBpbnN0YW5jZSk7Citib29s
IHJlc2l6ZUJ1ZmZlcnMoTlBQIGluc3RhbmNlLCBOUFN1cmZhY2VGb3JtYXQsIGludCB3aWR0aCwg
aW50IGhlaWdodCk7Cit2b2lkIHNldEhvbGVQdW5jaChOUFAgaW5zdGFuY2UsIGludCB4LCBpbnQg
eSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworZXh0ZXJuIE5QQ2FsbGJhY2tzIHNfTnBDYWxs
YmFja3M7CisKK30gLy8gTmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld1ByaXZhdGVCbGFja0JlcnJ5LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2lu
Vmlld1ByaXZhdGVCbGFja0JlcnJ5LmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3Jl
L3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5WaWV3UHJpdmF0ZUJsYWNrQmVycnkuY3BwCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDM3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZXNl
YXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg
UHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVz
c2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBp
ZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBV
U0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGx1Z2luVmlld1ByaXZh
dGVCbGFja0JlcnJ5LmgiCisKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJIb3N0
V2luZG93LmgiCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2luY2x1ZGUgIlBs
dWdpbkxheWVyV2ViS2l0VGhyZWFkLmgiCisjZW5kaWYKKyNpbmNsdWRlICJOUENhbGxiYWNrc0Js
YWNrQmVycnkuaCIKKyNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgorCitzdGF0aWMgdW5zaWdu
ZWQgc19jb3VudGVyID0gMDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQbHVnaW5WaWV3UHJp
dmF0ZTo6UGx1Z2luVmlld1ByaXZhdGUoUGx1Z2luVmlldyogdmlldykKKyAgICA6IG1fdmlldyh2
aWV3KQorICAgICwgbV9wbHVnaW5CdWZmZXJUeXBlKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6UGx1Z2luQnVmZmVyV2l0aEFscGhhKQorICAgICwgbV9wbHVnaW5Gcm9udEJ1ZmZlcigw
KQorICAgICwgbV9pZGxlUHJldmVudGVkKGZhbHNlKQorICAgICwgbV9oYXNQZW5kaW5nR2VvbWV0
cnlDaGFuZ2UodHJ1ZSkKKyAgICAsIG1fc2VudE9uTG9hZChmYWxzZSkKKyAgICAsIG1faXNGdWxs
U2NyZWVuKGZhbHNlKQorICAgICwgbV9pc0ZvY3VzZWQoZmFsc2UpCisgICAgLCBtX29yaWVudGF0
aW9uTG9ja2VkKGZhbHNlKQorICAgICwgbV9pc0JhY2tncm91bmRQbGF5aW5nKGZhbHNlKQorewor
ICAgIG1fcGx1Z2luQnVmZmVyc1swXSA9IDA7CisgICAgbV9wbHVnaW5CdWZmZXJzWzFdID0gMDsK
KworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhBdHRyaWJ1dGVzOworICAgIHB0aHJlYWRf
bXV0ZXhhdHRyX2luaXQoJm11dGV4QXR0cmlidXRlcyk7CisgICAgcHRocmVhZF9tdXRleGF0dHJf
c2V0dHlwZSgmbXV0ZXhBdHRyaWJ1dGVzLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisKKyAg
ICBwdGhyZWFkX211dGV4X2luaXQoJm1fYmFja0J1ZmZlck11dGV4LCAmbXV0ZXhBdHRyaWJ1dGVz
KTsKKyAgICBwdGhyZWFkX3J3bG9ja19pbml0KCZtX2Zyb250QnVmZmVyUndMb2NrLCAwKTsKKwor
ICAgIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4QXR0cmlidXRlcyk7CisKKyAgICBj
aGFyIHVuaXF1ZUlkWzUwXTsKKyAgICBzbnByaW50Zih1bmlxdWVJZCwgc2l6ZW9mKHVuaXF1ZUlk
KSwgIlBsdWdpblZpZXdCQi0lMDh4JTA4eC0iLCBzX2NvdW50ZXIrKywgKGludCl0aGlzKTsKKyAg
ICBtX3BsdWdpblVuaXF1ZVByZWZpeCA9IHVuaXF1ZUlkOworfQorCitQbHVnaW5WaWV3UHJpdmF0
ZTo6flBsdWdpblZpZXdQcml2YXRlKCkKK3sKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisgICAgICAgIGlmIChtX3BsYXRmb3JtTGF5ZXIpCisgICAgICAgICAgICBzdGF0aWNfY2Fz
dDxQbHVnaW5MYXllcldlYktpdFRocmVhZCo+KG1fcGxhdGZvcm1MYXllci5nZXQoKSktPnNldFBs
dWdpblZpZXcoMCk7CisjZW5kaWYKKworICAgIGRlc3Ryb3lCdWZmZXJzKCk7CisKKyAgICBwdGhy
ZWFkX211dGV4X2Rlc3Ryb3koJm1fYmFja0J1ZmZlck11dGV4KTsKKyAgICBwdGhyZWFkX3J3bG9j
a19kZXN0cm95KCZtX2Zyb250QnVmZmVyUndMb2NrKTsKK30KKworQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkdyYXBoaWNzOjpCdWZmZXJUeXBlIFBsdWdpblZpZXdQcml2YXRlOjp0b0J1ZmZlclR5cGUo
TlBTdXJmYWNlRm9ybWF0IGZvcm1hdCkKK3sKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNh
c2UgRk9STUFUX1JHQl81NjU6CisgICAgICAgIHJldHVybiBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
R3JhcGhpY3M6OlBsdWdpbkJ1ZmZlcjsKKyAgICBjYXNlIEZPUk1BVF9SR0JBXzg4ODg6CisgICAg
ZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6
UGx1Z2luQnVmZmVyV2l0aEFscGhhOworICAgIH0KK30KKwordm9pZCBQbHVnaW5WaWV3UHJpdmF0
ZTo6c2V0Wm9vbUZhY3RvcihmbG9hdCB6b29tRmFjdG9yKQoreworICAgIGlmICgoKE5QU2V0V2lu
ZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fdmlldy0+bV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3Rv
ciAhPSB6b29tRmFjdG9yKQorICAgICAgICBtX2hhc1BlbmRpbmdHZW9tZXRyeUNoYW5nZSA9IHRy
dWU7CisKKyAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fdmlldy0+bV9ucFdpbmRv
dy53c19pbmZvKS0+em9vbUZhY3RvciA9IHpvb21GYWN0b3I7Cit9CisKK3ZvaWQgUGx1Z2luVmll
d1ByaXZhdGU6OnNldFZpc2libGVSZWN0cyhjb25zdCBOUFJlY3QgcmVjdHNbXSwgaW50MzJfdCBj
b3VudCkKK3sKKyAgICBtX2tlZXBWaXNpYmxlUmVjdCA9IEludFJlY3QoKTsKKworICAgIGlmICgh
bV92aWV3LT5wYXJlbnQoKSB8fCAhY291bnQpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBJbnRSZWN0IGFkZFJlY3QgPSBJ
bnRSZWN0KHJlY3RzW2ldLmxlZnQsIHJlY3RzW2ldLnRvcCwgcmVjdHNbaV0ucmlnaHQgLSByZWN0
c1tpXS5sZWZ0LCByZWN0c1tpXS5ib3R0b20gLSByZWN0c1tpXS50b3ApOworICAgICAgICBtX2tl
ZXBWaXNpYmxlUmVjdC51bml0ZShhZGRSZWN0KTsKKyAgICB9CisKKyAgICAvLyBEb24ndCBjYXVz
ZSBhIHBvc3NpYmxlIHNjcm9sbCBpZiB0aGUgcmVzdWx0IGlzIGFuIGVtcHR5IHJlY3RhbmdsZS4K
KyAgICBpZiAobV9rZWVwVmlzaWJsZVJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBBZGp1c3QgdGhlIHJlY3QgdG8gdGhlIHBhcmVudCB3aW5kb3cgYW5kIHRoZW4gYWRq
dXN0IGZvciBzY3JvbGxpbmcuCisgICAgbV9rZWVwVmlzaWJsZVJlY3QgPSBtX3ZpZXctPmNvbnZl
cnRUb0NvbnRhaW5pbmdXaW5kb3cobV9rZWVwVmlzaWJsZVJlY3QpOworICAgIEZyYW1lVmlldyog
ZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV92aWV3LT5wYXJlbnQoKSk7Cisg
ICAgbV9rZWVwVmlzaWJsZVJlY3QubW92ZShmcmFtZVZpZXctPnNjcm9sbFBvc2l0aW9uKCkueCgp
LCBmcmFtZVZpZXctPnNjcm9sbFBvc2l0aW9uKCkueSgpKTsKKworICAgIGZyYW1lVmlldy0+aG9z
dFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+ZW5zdXJlQ29udGVudFZpc2libGUoKTsK
K30KKwordm9pZCBQbHVnaW5WaWV3UHJpdmF0ZTo6Y2xlYXJWaXNpYmxlUmVjdHMoKQoreworICAg
IGlmICghbV9rZWVwVmlzaWJsZVJlY3QuaXNFbXB0eSgpKQorICAgICAgICBzZXRWaXNpYmxlUmVj
dHMoMCwgMCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlld1ByaXZhdGU6OnNob3dLZXlib2FyZChib29s
IHZhbHVlKQoreworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVW
aWV3Kj4obV92aWV3LT5wYXJlbnQoKSk7CisgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBs
YXRmb3JtUGFnZUNsaWVudCgpLT5zaG93VmlydHVhbEtleWJvYXJkKHZhbHVlKTsKK30KKwordm9p
ZCBQbHVnaW5WaWV3UHJpdmF0ZTo6cmVxdWVzdEZ1bGxTY3JlZW4oKQoreworICAgIGlmIChGcmFt
ZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fdmlldy0+cGFyZW50
KCkpKQorICAgICAgICBpZiAoZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNs
aWVudCgpLT5zaG91bGRQbHVnaW5FbnRlckZ1bGxTY3JlZW4obV92aWV3LCBtX3BsdWdpblVuaXF1
ZVByZWZpeC5jX3N0cigpKSkKKyAgICAgICAgICAgIG1fdmlldy0+aGFuZGxlRnVsbFNjcmVlbkFs
bG93ZWRFdmVudCgpOworfQorCit2b2lkIFBsdWdpblZpZXdQcml2YXRlOjpleGl0RnVsbFNjcmVl
bigpCit7CisgICAgbV92aWV3LT5oYW5kbGVGdWxsU2NyZWVuRXhpdEV2ZW50KCk7Cit9CisKK3Zv
aWQgUGx1Z2luVmlld1ByaXZhdGU6OnJlcXVlc3RDZW50ZXJGaXRab29tKCkKK3sKKyAgICBGcmFt
ZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fdmlldy0+cGFyZW50
KCkpOworCisgICAgaWYgKCFmcmFtZVZpZXcpCisgICAgICAgIHJldHVybjsKKworICAgIGZyYW1l
Vmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+em9vbVRvQ29udGVudFJl
Y3QobV92aWV3LT5tX3dpbmRvd1JlY3QpOworfQorCit2b2lkIFBsdWdpblZpZXdQcml2YXRlOjps
b2NrT3JpZW50YXRpb24oYm9vbCBsYW5kc2NhcGUpCit7CisgICAgRnJhbWVWaWV3KiBmcmFtZVZp
ZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3ZpZXctPnBhcmVudCgpKTsKKworICAgIGlm
ICghZnJhbWVWaWV3KQorICAgICAgICByZXR1cm47CisKKyAgICBmcmFtZVZpZXctPmhvc3RXaW5k
b3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmxvY2tPcmllbnRhdGlvbihsYW5kc2NhcGUpOwor
ICAgIG1fb3JpZW50YXRpb25Mb2NrZWQgPSB0cnVlOworfQorCit2b2lkIFBsdWdpblZpZXdQcml2
YXRlOjp1bmxvY2tPcmllbnRhdGlvbigpCit7CisgICAgaWYgKCFtX29yaWVudGF0aW9uTG9ja2Vk
KQorICAgICAgICByZXR1cm47CisKKyAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19j
YXN0PEZyYW1lVmlldyo+KG1fdmlldy0+cGFyZW50KCkpOworCisgICAgaWYgKCFmcmFtZVZpZXcp
CisgICAgICAgIHJldHVybjsKKworICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9y
bVBhZ2VDbGllbnQoKS0+dW5sb2NrT3JpZW50YXRpb24oKTsKKyAgICBtX29yaWVudGF0aW9uTG9j
a2VkID0gZmFsc2U7Cit9CisKK3ZvaWQgUGx1Z2luVmlld1ByaXZhdGU6OnByZXZlbnRJZGxlKGJv
b2wgcHJldmVudElkbGUpCit7CisgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2Fz
dDxGcmFtZVZpZXcqPihtX3ZpZXctPnBhcmVudCgpKTsKKworICAgIGlmIChwcmV2ZW50SWRsZSA9
PSBtX2lkbGVQcmV2ZW50ZWQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghZnJhbWVWaWV3
KQorICAgICAgICByZXR1cm47CisKKyAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZv
cm1QYWdlQ2xpZW50KCktPnNldFByZXZlbnRzU2NyZWVuRGltbWluZyhwcmV2ZW50SWRsZSk7Cisg
ICAgbV9pZGxlUHJldmVudGVkID0gcHJldmVudElkbGU7Cit9CisKK3ZvaWQgUGx1Z2luVmlld1By
aXZhdGU6OnNldEhvbGVQdW5jaChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkK
K3sKKyAgICBpZiAod2lkdGggPiAwICYmIGhlaWdodCA+IDApCisgICAgICAgIG1faG9sZVB1bmNo
UmVjdCA9IEludFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgZWxzZQorICAgICAgICBt
X2hvbGVQdW5jaFJlY3QgPSBJbnRSZWN0KCk7CisKKyAgICAvLyBDbGlwIHRoZSBob2xlIHB1bmNo
IHJlY3RhbmdsZSBpbiBjYXNlIGEgcGx1Z2luIGlzICdvdmVyemVhbG91cycsIG9yIAorICAgIC8v
IGRvZXMgbm90IGNsZWFuIHVwIHRoZSBob2xlIHB1bmNoIHJlY3RhbmdsZSBjb3JyZWN0bHkgd2hl
biBleGl0aW5nIAorICAgIC8vIGZ1bGxzY3JlZW4gKHdpbGwgbWFzayBidWdzIGluIHRoZSBwbHVn
aW4pLgorICAgIG1faG9sZVB1bmNoUmVjdC5pbnRlcnNlY3QoSW50UmVjdChJbnRQb2ludCgwLCAw
KSwgbV92aWV3LT5mcmFtZVJlY3QoKS5zaXplKCkpKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKyAgICBpZiAobV9wbGF0Zm9ybUxheWVyKSB7CisgICAgICAgIEludFJlY3Qg
cmVjdCA9IG1faG9sZVB1bmNoUmVjdDsKKworICAgICAgICAvLyBUcmFuc2xhdGUgZnJvbSBwbHVn
aW4gY29vcmRpbmF0ZXMgdG8gY29udGVudHMgY29vcmRpbmF0ZXMuCisgICAgICAgIGlmICghbV9o
b2xlUHVuY2hSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJlY3QubW92ZShtX3ZpZXctPmZy
YW1lUmVjdCgpLngoKSwgbV92aWV3LT5mcmFtZVJlY3QoKS55KCkpOworCisgICAgICAgIE93blB0
cjxIb2xlUHVuY2hEYXRhPiBocCA9IGFkb3B0UHRyKG5ldyBIb2xlUHVuY2hEYXRhKTsKKyAgICAg
ICAgaHAtPnggPSBtX2hvbGVQdW5jaFJlY3QueCgpOworICAgICAgICBocC0+eSA9IG1faG9sZVB1
bmNoUmVjdC55KCk7CisgICAgICAgIGhwLT53ID0gbV9ob2xlUHVuY2hSZWN0LndpZHRoKCk7Cisg
ICAgICAgIGhwLT5oID0gbV9ob2xlUHVuY2hSZWN0LmhlaWdodCgpOworICAgICAgICBocC0+bGF5
ZXIgPSBtX3BsYXRmb3JtTGF5ZXI7CisKKyAgICAgICAgLy8gTm90aWZ5IGNvbXBvc2l0aW5nIGxh
eWVyIGFuZCBwYWdlIGNsaWVudCBpbiBvcmRlciB0byBiZSBhYmxlIHRvCisgICAgICAgIC8vIHB1
bmNoIHRocm91Z2ggY29tcG9zaXRlZCBhbmQgbm9uLWNvbXBvc2l0ZWQgcGFydHMgb2YgdGhlIHBh
Z2UuCisgICAgICAgIGNhbGxPbk1haW5UaHJlYWQobnBTZXRIb2xlUHVuY2hIYW5kbGVyLCBocC5s
ZWFrUHRyKCkpOyAvLyBucFNldEhvbGVQdW5jaEhhbmRsZXIoKSB0YWtlcyBvd25lcnNoaXAgb2Yg
aHAuCisgICAgfQorI2VuZGlmCit9CisKK05QU3VyZmFjZSBQbHVnaW5WaWV3UHJpdmF0ZTo6bG9j
a0JhY2tCdWZmZXIoKQoreworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9iYWNrQnVmZmVyTXV0
ZXgpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBidWZmZXIg
PSBtX3BsdWdpbkJ1ZmZlcnNbKG1fcGx1Z2luRnJvbnRCdWZmZXIgKyAxKSAlIFBMVUdJTl9CVUZG
RVJTXTsKKworICAgIGlmICghYnVmZmVyIHx8ICFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhp
Y3M6OnBsYXRmb3JtQnVmZmVySGFuZGxlKGJ1ZmZlcikpIHsKKyAgICAgICAgdW5sb2NrQmFja0J1
ZmZlcigpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkdyYXBoaWNzOjpwbGF0Zm9ybUJ1ZmZlckhhbmRsZShidWZmZXIpOworfQor
Cit2b2lkIFBsdWdpblZpZXdQcml2YXRlOjp1bmxvY2tCYWNrQnVmZmVyKCkKK3sKKyAgICBwdGhy
ZWFkX211dGV4X3VubG9jaygmbV9iYWNrQnVmZmVyTXV0ZXgpOworfQorCitCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogUGx1Z2luVmlld1ByaXZhdGU6OmxvY2tSZWFkRnJv
bnRCdWZmZXJJbnRlcm5hbCgpCit7CisgICAgcHRocmVhZF9yd2xvY2tfcmRsb2NrKCZtX2Zyb250
QnVmZmVyUndMb2NrKTsKKyAgICByZXR1cm4gbV9wbHVnaW5CdWZmZXJzW21fcGx1Z2luRnJvbnRC
dWZmZXJdOworfQorCitOUFN1cmZhY2UgUGx1Z2luVmlld1ByaXZhdGU6OmxvY2tSZWFkRnJvbnRC
dWZmZXIoKQoreworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBi
dWZmZXIgPSBsb2NrUmVhZEZyb250QnVmZmVySW50ZXJuYWwoKTsKKworICAgIGlmICghYnVmZmVy
IHx8ICFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OnBsYXRmb3JtQnVmZmVySGFuZGxl
KGJ1ZmZlcikpIHsKKyAgICAgICAgdW5sb2NrUmVhZEZyb250QnVmZmVyKCk7CisgICAgICAgIHJl
dHVybiAwOworICAgIH0KKworICAgIHJldHVybiBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhp
Y3M6OnBsYXRmb3JtQnVmZmVySGFuZGxlKGJ1ZmZlcik7Cit9CisKK3ZvaWQgUGx1Z2luVmlld1By
aXZhdGU6OnVubG9ja1JlYWRGcm9udEJ1ZmZlcigpCit7CisgICAgcHRocmVhZF9yd2xvY2tfdW5s
b2NrKCZtX2Zyb250QnVmZmVyUndMb2NrKTsKK30KKwordm9pZCBQbHVnaW5WaWV3UHJpdmF0ZTo6
c3dhcEJ1ZmZlcnMoKQoreworICAgIFB0aHJlYWRNdXRleExvY2tlciBiYWNrTG9jaygmbV9iYWNr
QnVmZmVyTXV0ZXgpOworICAgIFB0aHJlYWRXcml0ZUxvY2tlciBmcm9udExvY2soJm1fZnJvbnRC
dWZmZXJSd0xvY2spOworICAgIG1fcGx1Z2luRnJvbnRCdWZmZXIgPSAobV9wbHVnaW5Gcm9udEJ1
ZmZlciArIDEpICUgMjsKK30KKworYm9vbCBQbHVnaW5WaWV3UHJpdmF0ZTo6Y3JlYXRlQnVmZmVy
cyhOUFN1cmZhY2VGb3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAg
Ym9vbCBzdWNjZXNzID0gdHJ1ZTsKKworICAgIFB0aHJlYWRNdXRleExvY2tlciBiYWNrTG9jaygm
bV9iYWNrQnVmZmVyTXV0ZXgpOworICAgIFB0aHJlYWRXcml0ZUxvY2tlciBmcm9udExvY2soJm1f
ZnJvbnRCdWZmZXJSd0xvY2spOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQTFVHSU5fQlVG
RkVSUzsgaSsrKSB7CisgICAgICAgIGlmIChtX3BsdWdpbkJ1ZmZlcnNbaV0pIHsKKyAgICAgICAg
ICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6ZGVzdHJveUJ1ZmZlcihtX3BsdWdp
bkJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgbV9wbHVnaW5CdWZmZXJzW2ldID0gMDsKKyAgICAg
ICAgfQorCisgICAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKQorICAgICAgICAg
ICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbV9wbHVnaW5C
dWZmZXJzW2ldID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjcmVhdGVCdWZmZXIo
CisgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFNpemUod2lkdGgsIGhl
aWdodCksCisgICAgICAgICAgICAgICAgdG9CdWZmZXJUeXBlKGZvcm1hdCkpOworCisgICAgICAg
ICAgICBpZiAoIW1fcGx1Z2luQnVmZmVyc1tpXSkKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0g
ZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3VjY2VzcykgeworICAgICAgICBt
X3BsdWdpbkJ1ZmZlclNpemUgPSBJbnRTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBtX3Bs
dWdpbkJ1ZmZlclR5cGUgPSB0b0J1ZmZlclR5cGUoZm9ybWF0KTsKKyAgICB9IGVsc2UgeworICAg
ICAgICBtX3BsdWdpbkJ1ZmZlclNpemUgPSBJbnRTaXplKCk7CisgICAgICAgIG1fcGx1Z2luQnVm
ZmVyVHlwZSA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6UGx1Z2luQnVmZmVyV2l0
aEFscGhhOworICAgICAgICBkZXN0cm95QnVmZmVycygpOworICAgIH0KKworICAgIHJldHVybiBz
dWNjZXNzOworfQorCitib29sIFBsdWdpblZpZXdQcml2YXRlOjpyZXNpemVCdWZmZXJzKE5QU3Vy
ZmFjZUZvcm1hdCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBib29sIHN1
Y2Nlc3MgPSB0cnVlOworCisgICAgLy8gSWYgdGhlcmUgaXMgbm8gYnVmZmVyIGNyZWF0ZWQsIHRo
ZW4gdHJ5IHRvIGNyZWF0ZSBpdC4KKyAgICBpZiAoIW1fcGx1Z2luQnVmZmVyU2l6ZS53aWR0aCgp
IHx8ICFtX3BsdWdpbkJ1ZmZlclNpemUuaGVpZ2h0KCkpCisgICAgICAgIHJldHVybiBjcmVhdGVC
dWZmZXJzKGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBpZiAoIXdpZHRoIHx8ICFoZWln
aHQpCisgICAgICAgIHJldHVybiBkZXN0cm95QnVmZmVycygpOworCisgICAgUHRocmVhZE11dGV4
TG9ja2VyIGJhY2tMb2NrKCZtX2JhY2tCdWZmZXJNdXRleCk7CisgICAgUHRocmVhZFdyaXRlTG9j
a2VyIGZyb250TG9jaygmbV9mcm9udEJ1ZmZlclJ3TG9jayk7CisKKyAgICBmb3IgKGludCBpID0g
MDsgKGkgPCBQTFVHSU5fQlVGRkVSUykgJiYgc3VjY2VzczsgaSsrKSB7CisgICAgICAgIHN1Y2Nl
c3MgJj0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpyZWFsbG9jQnVmZmVyKG1fcGx1
Z2luQnVmZmVyc1tpXSwKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRTaXpl
KHdpZHRoLCBoZWlnaHQpLAorICAgICAgICAgICAgdG9CdWZmZXJUeXBlKGZvcm1hdCkpOworICAg
IH0KKworICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgIG1fcGx1Z2luQnVmZmVyU2l6ZSA9IElu
dFNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIG1fcGx1Z2luQnVmZmVyVHlwZSA9IHRvQnVm
ZmVyVHlwZShmb3JtYXQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBB
dHRlbXB0IHRvIHVuZG8gaWYgd2UgZmFpbGVkIHRvIGdldCB0aGUgbmV3IHNpemUvZm9ybWF0LiBX
ZSBjYW4ndCBndWFyYW50ZWUKKyAgICAvLyB3ZSB3aWxsIGdldCBpdCBiYWNrIHRob3VnaC4KKyAg
ICBpZiAoIW1fcGx1Z2luQnVmZmVyU2l6ZS53aWR0aCgpIHx8ICFtX3BsdWdpbkJ1ZmZlclNpemUu
aGVpZ2h0KCkpIHsKKyAgICAgICAgZGVzdHJveUJ1ZmZlcnMoKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIGJvb2wgdW5kb25lID0gdHJ1ZTsKKyAgICBmb3IgKGludCBpID0g
MDsgaSA8IFBMVUdJTl9CVUZGRVJTOyBpKyspIHsKKyAgICAgICAgdW5kb25lICY9IEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpHcmFwaGljczo6cmVhbGxvY0J1ZmZlcihtX3BsdWdpbkJ1ZmZlcnNbaV0s
CisgICAgICAgICAgICBtX3BsdWdpbkJ1ZmZlclNpemUsIG1fcGx1Z2luQnVmZmVyVHlwZSk7Cisg
ICAgfQorCisgICAgLy8gSWYgd2UgZmFpbCB0byB1bmRvLCBkZWxldGUgdGhlIGJ1ZmZlcnMgYWx0
b2dldGhlci4KKyAgICBpZiAoIXVuZG9uZSkKKyAgICAgICAgZGVzdHJveUJ1ZmZlcnMoKTsKKwor
ICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBQbHVnaW5WaWV3UHJpdmF0ZTo6ZGVzdHJveUJ1
ZmZlcnMoKQoreworICAgIFB0aHJlYWRNdXRleExvY2tlciBiYWNrTG9jaygmbV9iYWNrQnVmZmVy
TXV0ZXgpOworICAgIFB0aHJlYWRXcml0ZUxvY2tlciBmcm9udExvY2soJm1fZnJvbnRCdWZmZXJS
d0xvY2spOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQTFVHSU5fQlVGRkVSUzsgaSsrKSB7
CisgICAgICAgIGlmIChtX3BsdWdpbkJ1ZmZlcnNbaV0pIHsKKyAgICAgICAgICAgIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpHcmFwaGljczo6ZGVzdHJveUJ1ZmZlcihtX3BsdWdpbkJ1ZmZlcnNbaV0p
OworICAgICAgICAgICAgbV9wbHVnaW5CdWZmZXJzW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0K
KyAgICBtX3BsdWdpbkJ1ZmZlclNpemUgPSBJbnRTaXplKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Bs
dWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5WaWV3UHJpdmF0ZUJsYWNrQmVycnkuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld1ByaXZhdGVC
bGFja0JlcnJ5LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNr
YmVycnkvUGx1Z2luVmlld1ByaXZhdGVCbGFja0JlcnJ5LmgJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExp
bWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRl
ZiBQbHVnaW5WaWV3UHJpdmF0ZUJsYWNrQmVycnlfaAorI2RlZmluZSBQbHVnaW5WaWV3UHJpdmF0
ZUJsYWNrQmVycnlfaAorCisjaW5jbHVkZSAiUGx1Z2luVmlldy5oIgorI2luY2x1ZGUgPHB0aHJl
YWQuaD4KKworI2RlZmluZSBQTFVHSU5fQlVGRkVSUyAyCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworY2xhc3MgUGx1Z2luVmlld1ByaXZhdGUgeworCitwdWJsaWM6CisgICAgUGx1Z2luVmlld1By
aXZhdGUoUGx1Z2luVmlldyopOworICAgIH5QbHVnaW5WaWV3UHJpdmF0ZSgpOworCisgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXJUeXBlIHRvQnVmZmVyVHlwZShOUFN1
cmZhY2VGb3JtYXQpOworICAgIHZvaWQgc2V0Wm9vbUZhY3RvcihmbG9hdCk7CisgICAgdm9pZCBz
ZXRWaXNpYmxlUmVjdHMoY29uc3QgTlBSZWN0IHJlY3RzW10sIGludDMyX3QgY291bnQpOworICAg
IHZvaWQgY2xlYXJWaXNpYmxlUmVjdHMoKTsKKyAgICB2b2lkIHNob3dLZXlib2FyZChib29sIHZh
bHVlKTsKKyAgICB2b2lkIHJlcXVlc3RGdWxsU2NyZWVuKCk7CisgICAgdm9pZCBleGl0RnVsbFNj
cmVlbigpOworICAgIHZvaWQgcmVxdWVzdENlbnRlckZpdFpvb20oKTsKKyAgICB2b2lkIGxvY2tP
cmllbnRhdGlvbihib29sIGxhbmRzY2FwZSk7CisgICAgdm9pZCB1bmxvY2tPcmllbnRhdGlvbigp
OworICAgIHZvaWQgcHJldmVudElkbGUoYm9vbCBwcmV2ZW50SWRsZSk7CisgICAgdm9pZCBzZXRI
b2xlUHVuY2goaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgIE5QU3Vy
ZmFjZSBsb2NrQmFja0J1ZmZlcigpOworICAgIHZvaWQgdW5sb2NrQmFja0J1ZmZlcigpOworICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBsb2NrUmVhZEZyb250QnVm
ZmVySW50ZXJuYWwoKTsKKyAgICBOUFN1cmZhY2UgbG9ja1JlYWRGcm9udEJ1ZmZlcigpOworICAg
IHZvaWQgdW5sb2NrUmVhZEZyb250QnVmZmVyKCk7CisgICAgdm9pZCBzd2FwQnVmZmVycygpOwor
ICAgIGJvb2wgY3JlYXRlQnVmZmVycyhOUFN1cmZhY2VGb3JtYXQsIGludCB3aWR0aCwgaW50IGhl
aWdodCk7CisgICAgYm9vbCByZXNpemVCdWZmZXJzKE5QU3VyZmFjZUZvcm1hdCwgaW50IHdpZHRo
LCBpbnQgaGVpZ2h0KTsKKyAgICBib29sIGRlc3Ryb3lCdWZmZXJzKCk7CisKK3ByaXZhdGU6Cisg
ICAgUGx1Z2luVmlldyogbV92aWV3OworICAgIHB0aHJlYWRfbXV0ZXhfdCBtX2JhY2tCdWZmZXJN
dXRleDsKKyAgICBwdGhyZWFkX3J3bG9ja190IG1fZnJvbnRCdWZmZXJSd0xvY2s7CisKKyAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogbV9wbHVnaW5CdWZmZXJzW1BM
VUdJTl9CVUZGRVJTXTsKKyAgICBJbnRTaXplIG1fcGx1Z2luQnVmZmVyU2l6ZTsKKyAgICBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlclR5cGUgbV9wbHVnaW5CdWZmZXJUeXBl
OworICAgIGludCBtX3BsdWdpbkZyb250QnVmZmVyOworCisgICAgSW50UmVjdCBtX2hvbGVQdW5j
aFJlY3Q7CisgICAgSW50UmVjdCBtX2tlZXBWaXNpYmxlUmVjdDsKKworI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKyAgICBSZWZQdHI8UGxhdGZvcm1MYXllcj4gbV9wbGF0Zm9ybUxh
eWVyOworI2VuZGlmCisKKyAgICBib29sIG1faWRsZVByZXZlbnRlZDsKKyAgICBib29sIG1faGFz
UGVuZGluZ0dlb21ldHJ5Q2hhbmdlOworICAgIGJvb2wgbV9zZW50T25Mb2FkOworICAgIGJvb2wg
bV9pc0Z1bGxTY3JlZW47CisgICAgYm9vbCBtX2lzRm9jdXNlZDsKKyAgICBib29sIG1fb3JpZW50
YXRpb25Mb2NrZWQ7CisgICAgYm9vbCBtX2lzQmFja2dyb3VuZFBsYXlpbmc7CisKKyAgICBzdGQ6
OnN0cmluZyBtX3BsdWdpblVuaXF1ZVByZWZpeDsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpJbnRSZWN0UmVnaW9uIG1faW52YWxpZGF0ZVJlZ2lvbjsKKyAgICBmcmllbmQgY2xhc3MgUGx1
Z2luVmlldzsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCg==
</data>
<flag name="review"
          id="116451"
          type_id="1"
          status="+"
          setter="tonikitoo"
    />
          </attachment>
      

    </bug>

</bugzilla>