<?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>73397</bug_id>
          
          <creation_ts>2011-11-29 22:06:56 -0800</creation_ts>
          <short_desc>[BlackBerry] Upstream BlackBerry porting of pluginView</short_desc>
          <delta_ts>2022-02-28 04:03:29 -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>73185</dependson>
    
    <dependson>73513</dependson>
          <blocked>74483</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Charles Wei">charles.wei</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dbates</cc>
    
    <cc>leo.yang</cc>
    
    <cc>staikos</cc>
    
    <cc>tonikitoo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>511387</commentid>
    <comment_count>0</comment_count>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-29 22:06:56 -0800</bug_when>
    <thetext>This bug is to upstream BlackBerry porting of PluginView of the PluginFramework.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511400</commentid>
    <comment_count>1</comment_count>
      <attachid>117128</attachid>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-29 22:27:01 -0800</bug_when>
    <thetext>Created attachment 117128
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>511731</commentid>
    <comment_count>2</comment_count>
      <attachid>117128</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2011-11-30 07:24:02 -0800</bug_when>
    <thetext>Comment on attachment 117128
Patch

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

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1054
&gt; +bool PluginView::platformGetValueStatic(NPNVariable variable, void* value, NPError* result)

Maybe a static local function?

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1092
&gt; +        *((void **) value) = (void*)&amp;(((NPSetWindowCallbackStruct*)m_npWindow.ws_info)-&gt;zoomFactor);

can we avoid the c-cast here?

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1103
&gt; +                void** v = (void**) value;

ditto

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1120
&gt; +            BlackBerry::Platform::Graphics::Window *window =

* position

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1124
&gt; +                void** v = (void**) value;
&gt; +                *v = (void*) window-&gt;windowGroup();

ditto (c-cast)

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1144
&gt; +                void** v = (void**) value;
&gt; +                *v = (void*) context;

ditto

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1159
&gt; +        void** v = (void**) value;
&gt; +        *v = (void*) m_private-&gt;m_pluginUniquePrefix.c_str();

ditto</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512321</commentid>
    <comment_count>3</comment_count>
      <attachid>117128</attachid>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-30 18:41:09 -0800</bug_when>
    <thetext>Comment on attachment 117128
Patch

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

&gt;&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1054
&gt;&gt; +bool PluginView::platformGetValueStatic(NPNVariable variable, void* value, NPError* result)
&gt; 
&gt; Maybe a static local function?

This is defined in the cross-platform PluginView.h as a static member function.

&gt;&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1092
&gt;&gt; +        *((void **) value) = (void*)&amp;(((NPSetWindowCallbackStruct*)m_npWindow.ws_info)-&gt;zoomFactor);
&gt; 
&gt; can we avoid the c-cast here?

Yes

&gt;&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1103
&gt;&gt; +                void** v = (void**) value;
&gt; 
&gt; ditto

Yes

&gt;&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1120
&gt;&gt; +            BlackBerry::Platform::Graphics::Window *window =
&gt; 
&gt; * position

Yes

&gt;&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1124
&gt;&gt; +                *v = (void*) window-&gt;windowGroup();
&gt; 
&gt; ditto (c-cast)

window-&gt;windowGroup() returns const char*,   there isn&apos;t an easy c++ way to cast that to void*, so I would suggest we keep this.

&gt;&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1144
&gt;&gt; +                *v = (void*) context;
&gt; 
&gt; ditto

Yes

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1158
&gt; +        void** v = (void**) value;

This can be static_cast

&gt;&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1159
&gt;&gt; +        *v = (void*) m_private-&gt;m_pluginUniquePrefix.c_str();
&gt; 
&gt; ditto

No easy C++ cast from const char* to void*,  so I would suggest we keep it here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512337</commentid>
    <comment_count>4</comment_count>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-30 18:54:05 -0800</bug_when>
    <thetext>const char* to void* cast can be achieved:  

reinterpret_cast&lt;void*&gt;(const_cast&lt;char*&gt;())

Do we really want that?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512350</commentid>
    <comment_count>5</comment_count>
      <attachid>117311</attachid>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-30 19:15:30 -0800</bug_when>
    <thetext>Created attachment 117311
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512388</commentid>
    <comment_count>6</comment_count>
      <attachid>117311</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-11-30 20:06:32 -0800</bug_when>
    <thetext>Comment on attachment 117311
Patch

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

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

This include is unnecessary as HTMLPlugInElement.h (included below) includes HTMLFrameOwnerElement.h =&gt; HTMLElement.h =&gt; StyledElement.h, which includes this file.

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

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

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

This file is unnecessary as PlatformContextSkia.h (included below)  includes GraphicsContext.h, which includes this file.

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

This file is unnecessary as TouchList.h (below) includes this file.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:63
&gt; +#include &lt;BlackBerryPlatformWindow.h&gt;

We should move this include to after line 73 so that it&apos;s grouped with the other BlackBerry platform headers.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:81
&gt; +#define UNINIT_COORD 0xffffffff

This should be a C++ constant and shouldn&apos;t have an underscore in its name:

const unsigned UninitializedCoordinate = 0xffffffff;

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:103
&gt; +static NPRect toNPRect(const IntRect&amp; rect)
&gt; +{
&gt; +    NPRect npRect;
&gt; +    npRect.top = rect.y();
&gt; +    npRect.left = rect.x();
&gt; +    npRect.bottom = rect.y() + rect.height();
&gt; +    npRect.right = rect.x() + rect.width();
&gt; +    return npRect;
&gt; +}
&gt; +
&gt; +static NPRect toNPRect(const BlackBerry::Platform::IntRect&amp; rect)
&gt; +{
&gt; +    NPRect npRect;
&gt; +    npRect.top = rect.y();
&gt; +    npRect.left = rect.x();
&gt; +    npRect.bottom = rect.y() + rect.height();
&gt; +    npRect.right = rect.x() + rect.width();
&gt; +    return npRect;
&gt; +}

This is OK AS-IS. That being said, these functions are identical up to the datatype of their argument. Can we make this a template function?

Also, the name of this function doesn&apos;t conform to the WebKit Code Style Guidelines per (8) of section Names. We can rename this function in separate bug.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:106
&gt; +// Standard plugin widget stuff.

Remove this comment. It&apos;s inane.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:146
&gt; +    // do not call setNPWindowIfNeeded immediately, will be called on paint()

Nit: do =&gt; Do

Also, this comment is missing a period.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:149
&gt; +    // (i) in order to move/resize the plugin window at the same time as the

Nit: in =&gt; In

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:154
&gt; +    // (ii) if we are running layout tests from DRT, paint() won&apos;t ever get called

if =&gt; If

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:155
&gt; +    // so we need to call setNPWindowIfNeeded() if window geometry has changed

Missing a period at the end of this sentence.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:312
&gt; +    double zoomFactorH = (double)m_private-&gt;m_pluginBufferSize.width() / (double)frameRect().width();
&gt; +    double zoomFactorW = (double)m_private-&gt;m_pluginBufferSize.height() / (double)frameRect().height();

Nit: We should use C++ style casts.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:428
&gt; +    // sanity check.

Remove this comment. It&apos;s inane. I take it this &quot;sanity check&quot; is unusual to do since we have this comment. It would have been better if the comment explained why? Regardless, we should just remove this comment.

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

Nit: The indentation here is off. The &quot;||&quot; should be left-aligned with the &apos;p&apos; in platformKeyEvent on line 469.

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

This looks weird.  We don&apos;t need to fix this now, but we should eventually come back to this code. What other mouse events are there? Does control ever reach here? Maybe this should be an ASSERT_NOT_REACHED().

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

Can we use OwnArrayPtr here? Then we can remove the delete[] on line 576.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:951
&gt; +void PluginView::setNPWindowRect(const IntRect&amp; rc)

This argument is unused and depending on our compiler warning level may raise a warning. We should just remove the argument name.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:987
&gt; +        // FLASH WORKAROUND: Only set initially. Multiple calls to
&gt; +        // setNPWindow() cause the plugin to crash in windowed mode.

This should read:

// Only set the width and height of the plugin content the first time setNPWindow() is called so as to workaround
// an issue in Flash where multiple calls to setNPWindow() cause the plugin to crash in windowed mode.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1000
&gt; +    BlackBerry::Platform::Graphics::Window *window =
&gt; +        frameView-&gt;hostWindow()-&gt;platformPageClient()-&gt;platformWindow();

I would write this on one line to improve readability.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1007
&gt; +    // FIXME: Passing zoomFactor to setwindow make windowed plugin scale incorrectly.

Nit: I suggest adding an empty line above this FIXME comment so as to make it stand out.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1013
&gt; +    setCallingPlugin(false);

Nit: I suggest adding a empty line above this line so as to demarcate the end of the zoom factor code above.

We should define a RAII object that calls setCallingPlugin(true) in its constructor and calls setCallingPlugin(false) in its destructor. We can do this in a follow up patch.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1025
&gt; +    //       since the window manager should take care of that for us.

Nit: Remove the leading whitespace (before the word &quot;since&quot;) in this comment such that there is exactly one space after the &quot;//&quot; in this line.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1039
&gt; +    FILE* fileHandle = fopen((filename.utf8()).data(), &quot;r&quot;);

Nit: (filename.utf8()) =&gt; filename.utf8()

That is, the parentheses around &quot;filename.utf8()&quot; aren&apos;t necessary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512504</commentid>
    <comment_count>7</comment_count>
      <attachid>117347</attachid>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-30 22:58:52 -0800</bug_when>
    <thetext>Created attachment 117347
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512530</commentid>
    <comment_count>8</comment_count>
      <attachid>117347</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-11-30 23:33:28 -0800</bug_when>
    <thetext>Comment on attachment 117347
Patch

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

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

Can we use OwnArrayPtr here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>512537</commentid>
    <comment_count>9</comment_count>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-11-30 23:40:59 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 117347 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=117347&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:528
&gt; &gt; +        npTouchEvent.points = new NPTouchPoint[touchList-&gt;length()];
&gt; 
&gt; Can we use OwnArrayPtr here?

 I would rather not,  npTouchEvent.points  is defined as raw pointer,  change it to OwnArrayPtr changes too many platform-specific code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518039</commentid>
    <comment_count>10</comment_count>
      <attachid>117347</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-12-08 19:24:23 -0800</bug_when>
    <thetext>Comment on attachment 117347
Patch

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

This patch is better. There are still a few minor things that we could improve.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:68
&gt; +#include &lt;BlackBerryPlatformPrimitives.h&gt;

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

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:390
&gt; +#else
&gt; +#warning &quot;Implement me!&quot;
&gt; +    ASSERT_NOT_REACHED();
&gt; +#endif

We always build with Skia enabled. Therefore remove this code and the #if USE(SKIA) on line 268.

&gt;&gt;&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:528
&gt;&gt;&gt; +        npTouchEvent.points = new NPTouchPoint[touchList-&gt;length()];
&gt;&gt; 
&gt;&gt; Can we use OwnArrayPtr here?
&gt; 
&gt; I would rather not,  npTouchEvent.points  is defined as raw pointer,  change it to OwnArrayPtr changes too many platform-specific code.

I don&apos;t understand why we would need to modify the declaration of NPTouchEvent::points to be of type OwnArrayPtr.  Can&apos;t we just define a local variable in this function of type OwnArrayPtr&lt;NPTouchPoint&gt; called touchPoints. Then set npTouchEvent.points = touchPoints.get() and remove &quot;delete[] npTouchEvent.points&quot; (line 559). The code would have the following form:

...
OwnArrayPtr&lt;NPTouchPoint&gt; touchPoints;
unsigned numberOfTouchPoints = touchList-&gt;length();

if (numberOfTouchPoints) {
    touchPoints = adoptArrayPtr(new NPTouchPoint[numberOfTouchPoints]);
    for (unsigned i = 0; i &lt; numberOfTouchPoints; ++i) {
        Touch* touchItem = touchList-&gt;item(i);
        touchPoints[i].touchId = touchItem-&gt;identifier();
        ...
        touchPoints[i].pageY = touchItem-&gt;pageY();
    }
}

npTouchEvent.points = touchPoints.get();

NPEvent npEvent;
npEvent.type = NP_TouchEvent;
npEvent.data = &amp;npTouchEvent;

if (dispatchNPEvent(npEvent)) {
    ...
} else if (npTouchEvent.type == TOUCH_EVENT_DOUBLETAP) {
   ...
}

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1070
&gt; +    default:
&gt; +        return false;
&gt; +    }

NPNVariable is an enum type. Instead of having a default statement we should list all of the other enums values here and fall through to a return false, like:

case NPNVxDisplay:
case NPNVxtAppContext:
...
case NPNVprivateModeBool:
    return false;

Then add an ASSERT_NOT_REACHED() after the switch statement and &quot;return false;&quot;. By using this approach we&apos;ll get a compiler error should someone define a new enum value in NPNVariable.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:1158
&gt; +    default:
&gt; +        return platformGetValueStatic(variable, value, result);
&gt; +        // FIXME: Should we return false?
&gt; +    }

We should use a similar approach here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520616</commentid>
    <comment_count>11</comment_count>
      <attachid>119141</attachid>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-12-13 19:40:56 -0800</bug_when>
    <thetext>Created attachment 119141
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520724</commentid>
    <comment_count>12</comment_count>
      <attachid>119167</attachid>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-12-13 23:35:59 -0800</bug_when>
    <thetext>Created attachment 119167
Patch V5

Resubmit the patch and set the review flag and commit-queue flag.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>520908</commentid>
    <comment_count>13</comment_count>
      <attachid>119167</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2011-12-14 07:02:15 -0800</bug_when>
    <thetext>Comment on attachment 119167
Patch V5

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

Looks good to me.

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:680
&gt; +        // Clip against any frames that the widget is inside. Note that if the frames are also clipped
&gt; +        // by a div, that will not be included in this calculation. That is an improvement that still
&gt; +        // needs to be made.

It should be a FIXME

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:704
&gt; +        while (current-&gt;parent() &amp;&amp; visible) {
&gt; +            // Determine if it is visible in this scrollview.
&gt; +            visibleContentRect = current-&gt;parent()-&gt;visibleContentRect();
&gt; +
&gt; +            // Special case for the root ScrollView. Its size does not match the actual window size.
&gt; +            if (current-&gt;parent() == root())
&gt; +                visibleContentRect.setSize(windowSize);
&gt; +
&gt; +            contentRect.intersect(visibleContentRect);
&gt; +            visible = !contentRect.isEmpty();
&gt; +
&gt; +            // Offset to visible coordinates in scrollview widget&apos;s coordinate system (except in the case of
&gt; +            // the top scroll view).
&gt; +            if (current-&gt;parent()-&gt;parent())
&gt; +                contentRect.move(-visibleContentRect.x(), -visibleContentRect.y());
&gt; +
&gt; +            current = current-&gt;parent();
&gt; +
&gt; +            // Don&apos;t include the offset for the root window or we get the wrong coordinates.
&gt; +            if (current-&gt;parent()) {
&gt; +                // Move content rect into the parent scrollview&apos;s coordinates.
&gt; +                IntRect curFrameRect = current-&gt;frameRect();
&gt; +                contentRect.move(curFrameRect.x(), curFrameRect.y());

This whole block could be simplified, I think. see WebPagePrivate::getRecursiveVisibleWindowRect. Maybe in a follow up though</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>522447</commentid>
    <comment_count>14</comment_count>
      <attachid>119167</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-12-15 19:11:49 -0800</bug_when>
    <thetext>Comment on attachment 119167
Patch V5

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

&gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:532
&gt; +            npTouchEvent.points[i].touchId = touchItem-&gt;identifier();
&gt; +            npTouchEvent.points[i].clientX = touchItem-&gt;pageX() - frameRect().x();
&gt; +            npTouchEvent.points[i].clientY = touchItem-&gt;pageY() - frameRect().y();
&gt; +            npTouchEvent.points[i].screenX = touchItem-&gt;screenX();
&gt; +            npTouchEvent.points[i].screenY = touchItem-&gt;screenY();
&gt; +            npTouchEvent.points[i].pageX = touchItem-&gt;pageX();
&gt; +            npTouchEvent.points[i].pageY = touchItem-&gt;pageY();

Although the compiler will probably cache npTouchEvent.points, you may want to consider dereferencing touchPoints (i.e. touchPoints[i]) instead of dereferencing points and then dereferencing the ith point. That is, I would have written these lines as:

touchPoints[i]. touchId = = touchItem-&gt;identifier();
touchPoints[i].clientX = touchItem-&gt;pageX() - frameRect().x();
...
touchPoints[i].pageY = touchItem-&gt;pageY();</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>522485</commentid>
    <comment_count>15</comment_count>
    <who name="Leo Yang">leo.yang</who>
    <bug_when>2011-12-15 20:41:35 -0800</bug_when>
    <thetext>Committed r103019: &lt;http://trac.webkit.org/changeset/103019&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>522541</commentid>
    <comment_count>16</comment_count>
    <who name="Charles Wei">charles.wei</who>
    <bug_when>2011-12-15 22:27:36 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; (From update of attachment 119167 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=119167&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/plugins/blackberry/PluginViewBlackBerry.cpp:532
&gt; &gt; +            npTouchEvent.points[i].touchId = touchItem-&gt;identifier();
&gt; &gt; +            npTouchEvent.points[i].clientX = touchItem-&gt;pageX() - frameRect().x();
&gt; &gt; +            npTouchEvent.points[i].clientY = touchItem-&gt;pageY() - frameRect().y();
&gt; &gt; +            npTouchEvent.points[i].screenX = touchItem-&gt;screenX();
&gt; &gt; +            npTouchEvent.points[i].screenY = touchItem-&gt;screenY();
&gt; &gt; +            npTouchEvent.points[i].pageX = touchItem-&gt;pageX();
&gt; &gt; +            npTouchEvent.points[i].pageY = touchItem-&gt;pageY();
&gt; 
&gt; Although the compiler will probably cache npTouchEvent.points, you may want to consider dereferencing touchPoints (i.e. touchPoints[i]) instead of dereferencing points and then dereferencing the ith point. That is, I would have written these lines as:
&gt; 
&gt; touchPoints[i]. touchId = = touchItem-&gt;identifier();
&gt; touchPoints[i].clientX = touchItem-&gt;pageX() - frameRect().x();
&gt; ...
&gt; touchPoints[i].pageY = touchItem-&gt;pageY();


Thanks, Daniel.  Your comments have been addressed and the patch has been landed. Thanks again for your review and comments.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117128</attachid>
            <date>2011-11-29 22:27:01 -0800</date>
            <delta_ts>2011-11-30 19:15:17 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73397-20111130142733.patch</filename>
            <type>text/plain</type>
            <size>45927</size>
            <attacher name="Charles Wei">charles.wei</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwMTQ1MCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBACisyMDExLTExLTI5ICBXZWkgQ2hh
cmxlcyAgPGNoYXJsZXMud2VpQHRvcmNobW9iaWxlLmNvbS5jbj4KKworICAgICAgICBbQmxhY2ti
ZXJyeV0gVXBzdHJlYW0gQmxhY2tCZXJyeSBwb3J0aW5nIG9mIHBsdWdpblZpZXcKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczMzk3CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIGZvciBu
b3cuCisKKyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld0JsYWNrQmVycnku
Y3BwOiBBZGRlZC4KKwogMjAxMS0xMS0yOSAgRGF2aWQgTGV2aW4gIDxsZXZpbkBjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgQWRkIGEgd2F5IHRvIHJldmVydCBhIHZhcmlhYmxlIHRvIGl0cyBwcmV2
aW91cyB2YWx1ZSBhZnRlciBsZWF2aW5nIGEgc2NvcGUuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld0JsYWNrQmVycnkuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5WaWV3QmxhY2tCZXJyeS5j
cHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1
Z2luVmlld0JsYWNrQmVycnkuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEzODcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBDb2xsYWJvcmEgTHRkLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdpcmlzaCBSYW1ha3Jpc2huYW4gPGdpcmlz
aEBmb3J3YXJkYmlhcy5pbj4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZXNlYXJjaCBJbiBNb3Rp
b24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIlBsdWdpblZpZXcuaCIKKworI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVy
LmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgorI2luY2x1ZGUgIkV2ZW50LmgiCisjaW5jbHVkZSAi
RXZlbnROYW1lcy5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3Lmgi
CisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisj
aW5jbHVkZSAiSFRNTFBsdWdJbkVsZW1lbnQuaCIKKyNpbmNsdWRlICJIb3N0V2luZG93LmgiCisj
aW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJKU0RPTUJpbmRpbmcuaCIKKyNpbmNsdWRlICJL
ZXlib2FyZEV2ZW50LmgiCisjaW5jbHVkZSAiTW91c2VFdmVudC5oIgorI2luY2x1ZGUgIk5QQ2Fs
bGJhY2tzQmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVk
ZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKKyNpbmNsdWRlICJQ
bGF0Zm9ybUtleWJvYXJkRXZlbnQuaCIKKyNpbmNsdWRlICJQbHVnaW5EZWJ1Zy5oIgorI2luY2x1
ZGUgIlBsdWdpbk1haW5UaHJlYWRTY2hlZHVsZXIuaCIKKyNpbmNsdWRlICJQbHVnaW5QYWNrYWdl
LmgiCisjaW5jbHVkZSAiUGx1Z2luVmlld1ByaXZhdGVCbGFja0JlcnJ5LmgiCisjaW5jbHVkZSAi
UmVuZGVyTGF5ZXIuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5oIgorI2luY2x1ZGUgIlRvdWNoLmgi
CisjaW5jbHVkZSAiVG91Y2hFdmVudC5oIgorI2luY2x1ZGUgIlRvdWNoTGlzdC5oIgorI2luY2x1
ZGUgIldoZWVsRXZlbnQuaCIKKyNpbmNsdWRlICJucHJ1bnRpbWVfaW1wbC5oIgorI2luY2x1ZGUg
InJ1bnRpbWVfcm9vdC5oIgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVdpbmRvdy5oPgor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2luY2x1ZGUgIkNocm9tZS5oIgor
I2luY2x1ZGUgIkNocm9tZUNsaWVudC5oIgorI2luY2x1ZGUgIlBsdWdpbkxheWVyV2ViS2l0VGhy
ZWFkLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmg+
CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtSW50UmVjdFJlZ2lvbi5oPgorI2luY2x1ZGUg
PEJsYWNrQmVycnlQbGF0Zm9ybVByaW1pdGl2ZXMuaD4KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4K
KyNpbmNsdWRlIDxydW50aW1lL0pTTG9jay5oPgorI2luY2x1ZGUgPHJ1bnRpbWUvSlNWYWx1ZS5o
PgorI2luY2x1ZGUgPHN5cy9rZXljb2Rlcy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2RlZmlu
ZSBVTklOSVRfQ09PUkQgMHhmZmZmZmZmZgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRp
YyBOUFJlY3QgdG9OUFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBOUFJlY3QgbnBS
ZWN0OworICAgIG5wUmVjdC50b3AgPSByZWN0LnkoKTsKKyAgICBucFJlY3QubGVmdCA9IHJlY3Qu
eCgpOworICAgIG5wUmVjdC5ib3R0b20gPSByZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCk7CisgICAg
bnBSZWN0LnJpZ2h0ID0gcmVjdC54KCkgKyByZWN0LndpZHRoKCk7CisgICAgcmV0dXJuIG5wUmVj
dDsKK30KKworc3RhdGljIE5QUmVjdCB0b05QUmVjdChjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6SW50UmVjdCYgcmVjdCkKK3sKKyAgICBOUFJlY3QgbnBSZWN0OworICAgIG5wUmVjdC50b3Ag
PSByZWN0LnkoKTsKKyAgICBucFJlY3QubGVmdCA9IHJlY3QueCgpOworICAgIG5wUmVjdC5ib3R0
b20gPSByZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCk7CisgICAgbnBSZWN0LnJpZ2h0ID0gcmVjdC54
KCkgKyByZWN0LndpZHRoKCk7CisgICAgcmV0dXJuIG5wUmVjdDsKK30KKworCisvLyBTdGFuZGFy
ZCBwbHVnaW4gd2lkZ2V0IHN0dWZmLgorCit1c2luZyBKU0M6OkV4ZWNTdGF0ZTsKK3VzaW5nIEpT
Qzo6SW50ZXJwcmV0ZXI7Cit1c2luZyBKU0M6OkpTTG9jazsKK3VzaW5nIEpTQzo6SlNPYmplY3Q7
Cit1c2luZyBKU0M6OlVTdHJpbmc7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1l
c3BhY2UgV1RGOwordXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKKwordm9pZCBQbHVnaW5WaWV3
Ojp1cGRhdGVQbHVnaW5XaWRnZXQoKQoreworICAgIGlmICghcGFyZW50KCkgfHwgIW1fcHJpdmF0
ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKHBhcmVudCgpLT5pc0ZyYW1lVmlldygp
KTsKKyAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBh
cmVudCgpKTsKKworICAgIEludFJlY3Qgb2xkV2luZG93UmVjdCA9IG1fd2luZG93UmVjdDsKKyAg
ICBJbnRSZWN0IG9sZENsaXBSZWN0ID0gbV9jbGlwUmVjdDsKKworICAgIG1fd2luZG93UmVjdCA9
IEludFJlY3QoZnJhbWVWaWV3LT5jb250ZW50c1RvV2luZG93KGZyYW1lUmVjdCgpLmxvY2F0aW9u
KCkpLCBmcmFtZVJlY3QoKS5zaXplKCkpOworCisgICAgLy8gTWFwIHJlY3QgdG8gY29udGVudCBj
b29yZGluYXRlIHNwYWNlIG9mIG1haW4gZnJhbWUuCisgICAgbV93aW5kb3dSZWN0Lm1vdmUocm9v
dCgpLT5zY3JvbGxPZmZzZXQoKSk7CisKKyAgICBtX2NsaXBSZWN0ID0gY2FsY3VsYXRlQ2xpcFJl
Y3QoKTsKKyAgICBJbnRSZWN0IGYgPSBmcmFtZVJlY3QoKTsKKworICAgIC8vIE5vdGlmeSB0aGUg
cGx1Z2luIGlmIGl0IG1heSBvciBtYXkgbm90IGJlIG9uL29mZnNjcmVlbi4KKyAgICBoYW5kbGVT
Y3JvbGxFdmVudCgpOworCisgICAgYm9vbCB6b29tRmFjdG9yQ2hhbmdlZCA9ICgoTlBTZXRXaW5k
b3dDYWxsYmFja1N0cnVjdCopbV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3RvcgorICAgICAg
ICAhPSBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmN1cnJl
bnRab29tRmFjdG9yKCk7CisKKyAgICBpZiAoIXpvb21GYWN0b3JDaGFuZ2VkICYmIG1fd2luZG93
UmVjdCA9PSBvbGRXaW5kb3dSZWN0ICYmIG1fY2xpcFJlY3QgPT0gb2xkQ2xpcFJlY3QpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIGRvIG5vdCBjYWxsIHNldE5QV2luZG93SWZOZWVkZWQgaW1t
ZWRpYXRlbHksIHdpbGwgYmUgY2FsbGVkIG9uIHBhaW50KCkKKyAgICBtX3ByaXZhdGUtPm1faGFz
UGVuZGluZ0dlb21ldHJ5Q2hhbmdlID0gdHJ1ZTsKKworICAgIC8vIChpKSBpbiBvcmRlciB0byBt
b3ZlL3Jlc2l6ZSB0aGUgcGx1Z2luIHdpbmRvdyBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZQorICAg
IC8vIHJlc3Qgb2YgZnJhbWUgZHVyaW5nIGUuZy4gc2Nyb2xsaW5nLCB3ZSBzZXQgdGhlIHdpbmRv
dyBnZW9tZXRyeQorICAgIC8vIGluIHRoZSBwYWludCgpIGZ1bmN0aW9uLCBidXQgYXMgcGFpbnQo
KSBpc24ndCBjYWxsZWQgd2hlbiB0aGUKKyAgICAvLyBwbHVnaW4gd2luZG93IGlzIG91dHNpZGUg
dGhlIGZyYW1lIHdoaWNoIGNhbiBiZSBjYXVzZWQgYnkgYQorICAgIC8vIHNjcm9sbCwgd2UgbmVl
ZCB0byBtb3ZlL3Jlc2l6ZSBpbW1lZGlhdGVseS4KKyAgICAvLyAoaWkpIGlmIHdlIGFyZSBydW5u
aW5nIGxheW91dCB0ZXN0cyBmcm9tIERSVCwgcGFpbnQoKSB3b24ndCBldmVyIGdldCBjYWxsZWQK
KyAgICAvLyBzbyB3ZSBuZWVkIHRvIGNhbGwgc2V0TlBXaW5kb3dJZk5lZWRlZCgpIGlmIHdpbmRv
dyBnZW9tZXRyeSBoYXMgY2hhbmdlZAorICAgIGlmIChtX2NsaXBSZWN0LmlzRW1wdHkoKSB8fCAo
cGxhdGZvcm1QbHVnaW5XaWRnZXQoKSAmJiAobV93aW5kb3dSZWN0ICE9IG9sZFdpbmRvd1JlY3Qg
fHwgbV9jbGlwUmVjdCAhPSBvbGRDbGlwUmVjdCB8fCB6b29tRmFjdG9yQ2hhbmdlZCkpKQorICAg
ICAgICBzZXROUFdpbmRvd0lmTmVlZGVkKCk7CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgZ2V0IHJl
cGFpbnRlZCBhZnRlcndhcmRzLiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgZG93bndhcmQKKyAgICAv
LyBzY3JvbGxpbmcgdG8gbW92ZSB0aGUgcGx1Z2luIHdpZGdldCBwcm9wZXJseS4KKyAgICBpbnZh
bGlkYXRlKCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0Rm9jdXMoYm9vbCBmb2N1c2VkKQor
eworICAgIGlmICghbV9wcml2YXRlIHx8IG1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQgPT0gZm9jdXNl
ZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKHBsYXRmb3JtUGx1Z2luV2lkZ2V0KCkg
PT0gcGxhdGZvcm1XaWRnZXQoKSk7CisgICAgV2lkZ2V0OjpzZXRGb2N1cyhmb2N1c2VkKTsKKwor
ICAgIGlmIChmb2N1c2VkKQorICAgICAgICBoYW5kbGVGb2N1c0luRXZlbnQoKTsKKyAgICBlbHNl
CisgICAgICAgIGhhbmRsZUZvY3VzT3V0RXZlbnQoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3Ojpz
aG93KCkKK3sKKyAgICBzZXRTZWxmVmlzaWJsZSh0cnVlKTsKKyAgICBXaWRnZXQ6OnNob3coKTsK
KyAgICB1cGRhdGVQbHVnaW5XaWRnZXQoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoaWRlKCkK
K3sKKyAgICBzZXRTZWxmVmlzaWJsZShmYWxzZSk7CisgICAgV2lkZ2V0OjpoaWRlKCk7CisgICAg
dXBkYXRlUGx1Z2luV2lkZ2V0KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6dXBkYXRlQnVmZmVy
KGNvbnN0IEludFJlY3QmIGJ1ZmZlclJlY3QpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIFVwZGF0ZSB0aGUgem9vbSBmYWN0b3IgaGVyZSwgaXQgaGFw
cGVucyByaWdodCBiZWZvcmUgc2V0TlBXaW5kb3dJZk5lZWRlZAorICAgIC8vIGVuc3VyaW5nIHRo
YXQgdGhlIHBsdWdpbiBoYXMgZXZlcnkgb3Bwb3J0dW5pdHkgdG8gZ2V0IHRoZSB6b29tIGZhY3Rv
ciBiZWZvcmUKKyAgICAvLyBpdCBwYWludHMgYW55dGhpbmcuCisgICAgaWYgKEZyYW1lVmlldyog
ZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpKQorICAgICAgICBt
X3ByaXZhdGUtPnNldFpvb21GYWN0b3IoZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3Jt
UGFnZUNsaWVudCgpLT5jdXJyZW50Wm9vbUZhY3RvcigpKTsKKworICAgIHNldE5QV2luZG93SWZO
ZWVkZWQoKTsKKworICAgIC8vIEJ1aWxkIGFuZCBkaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGx1
Z2luIHRvIG5vdGlmeSBpdCB3ZSBhcmUgYWJvdXQgdG8gZHJhdyB3aGF0ZXZlcgorICAgIC8vIGlz
IGluIHRoZSBmcm9udCBidWZmZXIuIFRoaXMgaXMgaXQncyBvcHBvcnR1bml0eSB0byBkbyBhIHN3
YXAuCisgICAgSW50UmVjdCBleHBvc2VkUmVjdChidWZmZXJSZWN0KTsKKyAgICBleHBvc2VkUmVj
dC5pbnRlcnNlY3QoSW50UmVjdChJbnRQb2ludCgwLCAwKSwgZnJhbWVSZWN0KCkuc2l6ZSgpKSk7
CisKKyAgICAvLyBPbmx5IGFzayB0aGUgcGx1Z2luIHRvIGRyYXcgaWYgdGhlIGV4cG9zZWQgcmVj
dCB3YXMgZXhwbGljaXRseSBpbnZhbGlkYXRlZAorICAgIC8vIGJ5IHRoZSBwbHVnaW4uCisgICAg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb24gZXhwb3NlZFJlZ2lvbiA9IEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjppbnRlcnNlY3RSZWdpb25zKG1fcHJpdmF0
ZS0+bV9pbnZhbGlkYXRlUmVnaW9uLCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdChleHBv
c2VkUmVjdCkpOworICAgIGlmICghZXhwb3NlZFJlZ2lvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAg
bV9wcml2YXRlLT5tX2ludmFsaWRhdGVSZWdpb24gPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50
UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKG1fcHJpdmF0ZS0+bV9pbnZhbGlkYXRlUmVnaW9u
LCBleHBvc2VkUmVnaW9uKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QmxhY2tCZXJyeTo6UGxhdGZv
cm06OkludFJlY3Q+IGV4cG9zZWRSZWN0cyA9IGV4cG9zZWRSZWdpb24ucmVjdHMoKTsKKyAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGV4cG9zZWRSZWN0cy5zaXplKCk7ICsraSkgewor
ICAgICAgICAgICAgTlBEcmF3RXZlbnQgZHJhdzsKKyAgICAgICAgICAgIGRyYXcucGx1Z2luUmVj
dCA9IHRvTlBSZWN0KG1fd2luZG93UmVjdCk7CisgICAgICAgICAgICBkcmF3LmNsaXBSZWN0ID0g
dG9OUFJlY3QobV9jbGlwUmVjdCk7CisgICAgICAgICAgICBkcmF3LmRyYXdSZWN0ID0gKE5QUmVj
dCopYWxsb2NhKHNpemVvZihOUFJlY3QpKTsKKyAgICAgICAgICAgIGRyYXcuZHJhd1JlY3RDb3Vu
dCA9IDE7CisgICAgICAgICAgICAqZHJhdy5kcmF3UmVjdCA9IHRvTlBSZWN0KGV4cG9zZWRSZWN0
cy5hdChpKSk7CisgICAgICAgICAgICBkcmF3Lnpvb21GYWN0b3IgPSAoKE5QU2V0V2luZG93Q2Fs
bGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21GYWN0b3I7CisKKyAgICAgICAg
ICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICAgICAgICAgIG5wRXZlbnQudHlwZSA9IE5QX0RyYXdF
dmVudDsKKyAgICAgICAgICAgIG5wRXZlbnQuZGF0YSA9ICZkcmF3OworCisgICAgICAgICAgICAv
LyBGSVhNRTogUmV0dXJuIGVhcmx5IGlmIHRoaXMgZmFpbHM/IE9yIGp1c3QgcmVwYWludD8KKyAg
ICAgICAgICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KK30K
Kwordm9pZCBQbHVnaW5WaWV3OjpwYWludChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKCFtX3ByaXZhdGUgfHwgIW1faXNTdGFydGVkKSB7
CisgICAgICAgIHBhaW50TWlzc2luZ1BsdWdpbkljb24oY29udGV4dCwgcmVjdCk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgdGhlIHpvb20gZmFjdG9yIGhlcmUsIGl0
IGhhcHBlbnMgcmlnaHQgYmVmb3JlIHNldE5QV2luZG93SWZOZWVkZWQKKyAgICAvLyBlbnN1cmlu
ZyB0aGF0IHRoZSBwbHVnaW4gaGFzIGV2ZXJ5IG9wcG9ydHVuaXR5IHRvIGdldCB0aGUgem9vbSBm
YWN0b3IgYmVmb3JlCisgICAgLy8gaXQgcGFpbnRzIGFueXRoaW5nLgorICAgIGlmIChGcmFtZVZp
ZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkKKyAgICAg
ICAgbV9wcml2YXRlLT5zZXRab29tRmFjdG9yKGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0
Zm9ybVBhZ2VDbGllbnQoKS0+Y3VycmVudFpvb21GYWN0b3IoKSk7CisKKyAgICBpZiAoY29udGV4
dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBzZXROUFdpbmRv
d0lmTmVlZGVkKCk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYg
KG1fcHJpdmF0ZS0+bV9wbGF0Zm9ybUxheWVyKQorICAgICAgICByZXR1cm47CisjZW5kaWYKKwor
ICAgIC8vIEJ1aWxkIGFuZCBkaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGx1Z2luIHRvIG5vdGlm
eSBpdCB3ZSBhcmUgYWJvdXQgdG8gZHJhdyB3aGF0ZXZlcgorICAgIC8vIGlzIGluIHRoZSBmcm9u
dCBidWZmZXIuIFRoaXMgaXMgaXQncyBvcHBvcnR1bml0eSB0byBkbyBhIHN3YXAuCisgICAgSW50
UmVjdCByZWN0Q2xpcChyZWN0KTsKKyAgICByZWN0Q2xpcC5pbnRlcnNlY3QoZnJhbWVSZWN0KCkp
OworCisgICAgSW50UmVjdCBleHBvc2VkUmVjdChyZWN0Q2xpcCk7CisgICAgZXhwb3NlZFJlY3Qu
bW92ZSgtZnJhbWVSZWN0KCkueCgpLCAtZnJhbWVSZWN0KCkueSgpKTsKKworICAgIHVwZGF0ZUJ1
ZmZlcihleHBvc2VkUmVjdCk7CisKKyAgICBQdGhyZWFkUmVhZExvY2tlciBmcm9udExvY2soJm1f
cHJpdmF0ZS0+bV9mcm9udEJ1ZmZlclJ3TG9jayk7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6R3JhcGhpY3M6OkJ1ZmZlciogZnJvbnRCdWZmZXIgPQorICAgICAgICBtX3ByaXZhdGUtPm1f
cGx1Z2luQnVmZmVyc1ttX3ByaXZhdGUtPm1fcGx1Z2luRnJvbnRCdWZmZXJdOworCisgICAgLy8g
RG9uJ3QgcGFpbnQgYW55dGhpbmcgaWYgdGhlcmUgaXMgbm8gYnVmZmVyLgorICAgIGlmICghZnJv
bnRCdWZmZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpHcmFwaGljczo6QmFja2luZ0ltYWdlKiBiYWNraW5nSW1hZ2UgPQorICAgICAgICBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmxvY2tCdWZmZXJCYWNraW5nSW1hZ2UoZnJvbnRC
dWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlJlYWRBY2Nlc3MpOwor
ICAgIGlmICghYmFja2luZ0ltYWdlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBEcmF3IHRo
ZSBjaGFuZ2VkIGJ1ZmZlciBjb250ZW50cyB0byB0aGUgc2NyZWVuLgorICAgIGNvbnRleHQtPnNh
dmUoKTsKKworI2lmIFVTRShTS0lBKQorICAgIGNvbnN0IFNrQml0bWFwJiBwbHVnaW5JbWFnZSA9
ICpiYWNraW5nSW1hZ2U7CisgICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzID0g
Y29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7CisgICAgQVNTRVJUKGdyYXBoaWNzKTsKKyAgICBT
a0NhbnZhcyogY2FudmFzID0gZ3JhcGhpY3MtPmNhbnZhcygpOworCisgICAgLy8gU291cmNlIHJl
Y3RhbmdsZSB3ZSB3aWxsIGRyYXcgdG8gdGhlIHNjcmVlbi4KKyAgICBTa0lSZWN0IHNrU3JjUmVj
dDsKKyAgICBza1NyY1JlY3Quc2V0KGV4cG9zZWRSZWN0LngoKSwgZXhwb3NlZFJlY3QueSgpLAor
ICAgICAgICAgICAgICAgICAgZXhwb3NlZFJlY3QueCgpICsgZXhwb3NlZFJlY3Qud2lkdGgoKSwK
KyAgICAgICAgICAgICAgICAgIGV4cG9zZWRSZWN0LnkoKSArIGV4cG9zZWRSZWN0LmhlaWdodCgp
KTsKKworICAgIC8vIFByZXBhcmUgdGhlIGhvbGUgcHVuY2ggcmVjdGFuZ2xlLgorICAgIFNrSVJl
Y3QgdW5jbGlwcGVkSG9sZVB1bmNoUmVjdDsKKyAgICB1bmNsaXBwZWRIb2xlUHVuY2hSZWN0LnNl
dChtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC54KCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbV9wcml2YXRlLT5tX2hvbGVQdW5jaFJlY3QueSgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LngoKSArIG1fcHJpdmF0
ZS0+bV9ob2xlUHVuY2hSZWN0LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbV9wcml2YXRlLT5tX2hvbGVQdW5jaFJlY3QueSgpICsgbV9wcml2YXRlLT5tX2hvbGVQdW5j
aFJlY3QuaGVpZ2h0KCkpOworCisgICAgLy8gaG9sZVB1bmNoUmVjdCBpcyBjbGlwcGVkLgorICAg
IFNrSVJlY3QgaG9sZVB1bmNoUmVjdDsKKworICAgIC8vIEFsbCBzb3VyY2UgcmVjdGFuZ2xlcyBh
cmUgc2NhbGVkIGJ5IHRoZSB6b29tIGZhY3RvciBiZWNhdXNlIHRoZSBzb3VyY2UgYml0bWFwIG1h
eSBiZSBhCisgICAgLy8gaGlnaGVyIHJlc29sdXRpb24gdGhhbiB0aGUgMToxIHBhZ2UuIFRoaXMg
YWxsb3dzIHRoZSBmbGFzaCBwbGF5ZXIgdG8gc2NhbGUgdGhlIGNvbnRlbnQKKyAgICAvLyBpdCBp
cyBkcmF3aW5nIHRvIG1hdGNoIHRoZSBzY2FsZSBvZiB0aGUgcGFnZS4KKyAgICBkb3VibGUgem9v
bUZhY3RvckggPSAoZG91YmxlKW1fcHJpdmF0ZS0+bV9wbHVnaW5CdWZmZXJTaXplLndpZHRoKCkg
LyAoZG91YmxlKWZyYW1lUmVjdCgpLndpZHRoKCk7CisgICAgZG91YmxlIHpvb21GYWN0b3JXID0g
KGRvdWJsZSltX3ByaXZhdGUtPm1fcGx1Z2luQnVmZmVyU2l6ZS5oZWlnaHQoKSAvIChkb3VibGUp
ZnJhbWVSZWN0KCkuaGVpZ2h0KCk7CisgICAgZG91YmxlIHpvb21GYWN0b3IgPSAoem9vbUZhY3Rv
ckggKyB6b29tRmFjdG9yVykgLyAyLjA7CisKKyAgICAvLyBUaGlzIG1ldGhvZCBkcmF3cyBhIGhv
bGUgaWYgc3BlY2lmaWVkLgorICAgIGlmICghbV9wcml2YXRlLT5tX2hvbGVQdW5jaFJlY3QuaXNF
bXB0eSgpCisgICAgICAgICYmIGhvbGVQdW5jaFJlY3QuaW50ZXJzZWN0KHVuY2xpcHBlZEhvbGVQ
dW5jaFJlY3QsIHNrU3JjUmVjdCkpIHsKKworICAgICAgICAvLyBEcmF3IHRoZSB0b3AgY2h1bmsg
aWYgbmVlZGVkLgorICAgICAgICBpZiAoaG9sZVB1bmNoUmVjdC5mVG9wID4gc2tTcmNSZWN0LmZU
b3ApIHsKKyAgICAgICAgICAgIFNrSVJlY3Qgc3JjUmVjdDsKKyAgICAgICAgICAgIHNyY1JlY3Qu
c2V0KHNrU3JjUmVjdC5mTGVmdCAqIHpvb21GYWN0b3IsIHNrU3JjUmVjdC5mVG9wICogem9vbUZh
Y3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrU3JjUmVjdC5mUmlnaHQgKiB6b29tRmFj
dG9yLCBob2xlUHVuY2hSZWN0LmZUb3AgKiB6b29tRmFjdG9yKTsKKworICAgICAgICAgICAgU2tS
ZWN0IGRzdFJlY3Q7CisgICAgICAgICAgICBkc3RSZWN0LnNldChza1NyY1JlY3QuZkxlZnQsIHNr
U3JjUmVjdC5mVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgc2tTcmNSZWN0LmZSaWdodCwg
aG9sZVB1bmNoUmVjdC5mVG9wKTsKKyAgICAgICAgICAgIGRzdFJlY3Qub2Zmc2V0KGZyYW1lUmVj
dCgpLngoKSwgZnJhbWVSZWN0KCkueSgpKTsKKworICAgICAgICAgICAgY2FudmFzLT5kcmF3Qml0
bWFwUmVjdChwbHVnaW5JbWFnZSwgJnNyY1JlY3QsIGRzdFJlY3QpOworICAgICAgICB9CisKKyAg
ICAgICAgLy8gRHJhdyB0aGUgbGVmdCBjaHVuayBpZiBuZWVkZWQuCisgICAgICAgIGlmIChob2xl
UHVuY2hSZWN0LmZMZWZ0ID4gc2tTcmNSZWN0LmZMZWZ0KSB7CisgICAgICAgICAgICBTa0lSZWN0
IHNyY1JlY3Q7CisgICAgICAgICAgICBzcmNSZWN0LnNldChza1NyY1JlY3QuZkxlZnQgKiB6b29t
RmFjdG9yLCBob2xlUHVuY2hSZWN0LmZUb3AgKiB6b29tRmFjdG9yLAorICAgICAgICAgICAgICAg
ICAgICAgICAgaG9sZVB1bmNoUmVjdC5mTGVmdCAqIHpvb21GYWN0b3IsIGhvbGVQdW5jaFJlY3Qu
ZkJvdHRvbSAqIHpvb21GYWN0b3IpOworCisgICAgICAgICAgICBTa1JlY3QgZHN0UmVjdDsKKyAg
ICAgICAgICAgIGRzdFJlY3Quc2V0KHNrU3JjUmVjdC5mTGVmdCwgaG9sZVB1bmNoUmVjdC5mVG9w
LAorICAgICAgICAgICAgICAgICAgICAgICAgaG9sZVB1bmNoUmVjdC5mTGVmdCwgaG9sZVB1bmNo
UmVjdC5mQm90dG9tKTsKKyAgICAgICAgICAgIGRzdFJlY3Qub2Zmc2V0KGZyYW1lUmVjdCgpLngo
KSwgZnJhbWVSZWN0KCkueSgpKTsKKworICAgICAgICAgICAgY2FudmFzLT5kcmF3Qml0bWFwUmVj
dChwbHVnaW5JbWFnZSwgJnNyY1JlY3QsIGRzdFJlY3QpOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gRHJhdyB0aGUgaG9sZSBjaHVuay4KKyAgICAgICAgeworICAgICAgICAgICAgU2tQYWludCBw
YWludDsKKyAgICAgICAgICAgIHBhaW50LnNldFhmZXJtb2RlTW9kZShTa1hmZXJtb2RlOjprU3Jj
X01vZGUpOworCisgICAgICAgICAgICBTa0lSZWN0IHNyY1JlY3Q7CisgICAgICAgICAgICBzcmNS
ZWN0LnNldChob2xlUHVuY2hSZWN0LmZMZWZ0ICogem9vbUZhY3RvciwgaG9sZVB1bmNoUmVjdC5m
VG9wICogem9vbUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvbGVQdW5jaFJlY3Qu
ZlJpZ2h0ICogem9vbUZhY3RvciwgaG9sZVB1bmNoUmVjdC5mQm90dG9tICogem9vbUZhY3Rvcik7
CisKKyAgICAgICAgICAgIFNrUmVjdCBkc3RSZWN0OworICAgICAgICAgICAgZHN0UmVjdC5zZXQo
aG9sZVB1bmNoUmVjdC5mTGVmdCwgaG9sZVB1bmNoUmVjdC5mVG9wLAorICAgICAgICAgICAgICAg
ICAgICAgICAgaG9sZVB1bmNoUmVjdC5mUmlnaHQsIGhvbGVQdW5jaFJlY3QuZkJvdHRvbSk7Cisg
ICAgICAgICAgICBkc3RSZWN0Lm9mZnNldChmcmFtZVJlY3QoKS54KCksIGZyYW1lUmVjdCgpLnko
KSk7CisKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd0JpdG1hcFJlY3QocGx1Z2luSW1hZ2UsICZz
cmNSZWN0LCBkc3RSZWN0LCAmcGFpbnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRHJhdyB0
aGUgcmlnaHQgY2h1bmsgaWYgbmVlZGVkLgorICAgICAgICBpZiAoaG9sZVB1bmNoUmVjdC5mUmln
aHQgPCBza1NyY1JlY3QuZlJpZ2h0KSB7CisgICAgICAgICAgICBTa0lSZWN0IHNyY1JlY3Q7Cisg
ICAgICAgICAgICBzcmNSZWN0LnNldChob2xlUHVuY2hSZWN0LmZSaWdodCAqIHpvb21GYWN0b3Is
IGhvbGVQdW5jaFJlY3QuZlRvcCAqIHpvb21GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAg
ICBza1NyY1JlY3QuZlJpZ2h0ICogem9vbUZhY3RvciwgaG9sZVB1bmNoUmVjdC5mQm90dG9tICog
em9vbUZhY3Rvcik7CisKKyAgICAgICAgICAgIFNrUmVjdCBkc3RSZWN0OworICAgICAgICAgICAg
ZHN0UmVjdC5zZXQoaG9sZVB1bmNoUmVjdC5mUmlnaHQsIGhvbGVQdW5jaFJlY3QuZlRvcCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHNrU3JjUmVjdC5mUmlnaHQsIGhvbGVQdW5jaFJlY3QuZkJv
dHRvbSk7CisgICAgICAgICAgICBkc3RSZWN0Lm9mZnNldChmcmFtZVJlY3QoKS54KCksIGZyYW1l
UmVjdCgpLnkoKSk7CisKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd0JpdG1hcFJlY3QocGx1Z2lu
SW1hZ2UsICZzcmNSZWN0LCBkc3RSZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERyYXcg
dGhlIGJvdHRvbSBjaHVuayBpZiBuZWVkZWQuCisgICAgICAgIGlmIChob2xlUHVuY2hSZWN0LmZC
b3R0b20gPCBza1NyY1JlY3QuZkJvdHRvbSkgeworICAgICAgICAgICAgU2tJUmVjdCBzcmNSZWN0
OworICAgICAgICAgICAgc3JjUmVjdC5zZXQoc2tTcmNSZWN0LmZMZWZ0ICogem9vbUZhY3Rvciwg
aG9sZVB1bmNoUmVjdC5mQm90dG9tICogem9vbUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHNrU3JjUmVjdC5mUmlnaHQgKiB6b29tRmFjdG9yLCBza1NyY1JlY3QuZkJvdHRvbSAqIHpv
b21GYWN0b3IpOworCisgICAgICAgICAgICBTa1JlY3QgZHN0UmVjdDsKKyAgICAgICAgICAgIGRz
dFJlY3Quc2V0KHNrU3JjUmVjdC5mTGVmdCwgaG9sZVB1bmNoUmVjdC5mQm90dG9tLAorICAgICAg
ICAgICAgICAgICAgICAgICAgc2tTcmNSZWN0LmZSaWdodCwgc2tTcmNSZWN0LmZCb3R0b20pOwor
ICAgICAgICAgICAgZHN0UmVjdC5vZmZzZXQoZnJhbWVSZWN0KCkueCgpLCBmcmFtZVJlY3QoKS55
KCkpOworCisgICAgICAgICAgICBjYW52YXMtPmRyYXdCaXRtYXBSZWN0KHBsdWdpbkltYWdlLCAm
c3JjUmVjdCwgZHN0UmVjdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBTa0lS
ZWN0IHNyY1JlY3Q7CisgICAgICAgIHNyY1JlY3Quc2V0KHNrU3JjUmVjdC5mTGVmdCAqIHpvb21G
YWN0b3IsIHNrU3JjUmVjdC5mVG9wICogem9vbUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAg
c2tTcmNSZWN0LmZSaWdodCAqIHpvb21GYWN0b3IsIHNrU3JjUmVjdC5mQm90dG9tICogem9vbUZh
Y3Rvcik7CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUu
CisgICAgICAgIFNrUmVjdCBkc3RSZWN0OworICAgICAgICBkc3RSZWN0LnNldChyZWN0Q2xpcC54
KCksIHJlY3RDbGlwLnkoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjdENsaXAueCgpICsgcmVj
dENsaXAud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjdENsaXAueSgpICsgcmVjdENs
aXAuaGVpZ2h0KCkpOworCisgICAgICAgIC8vIERvbid0IHB1bmNoIGEgaG9sZS4KKyAgICAgICAg
Y2FudmFzLT5kcmF3Qml0bWFwUmVjdChwbHVnaW5JbWFnZSwgJnNyY1JlY3QsIGRzdFJlY3QpOwor
ICAgIH0KKyNlbHNlCisjd2FybmluZyAiSW1wbGVtZW50IG1lISIKKyAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyNlbmRpZgorCisgICAgY29udGV4dC0+cmVzdG9yZSgpOworCisgICAgQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpyZWxlYXNlQnVmZmVyQmFja2luZ0ltYWdlKGZyb250
QnVmZmVyKTsKK30KKworCitib29sIFBsdWdpblZpZXc6OmRpc3BhdGNoRnVsbFNjcmVlbk5QRXZl
bnQoTlBFdmVudCYgZXZlbnQpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIEFTU0VSVChtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuKTsKKyAgICBy
ZXR1cm4gZGlzcGF0Y2hOUEV2ZW50KGV2ZW50KTsKK30KKworLy8gRklYTUU6IFVuaWZ5IGFjcm9z
cyBwb3J0cy4KK2Jvb2wgUGx1Z2luVmlldzo6ZGlzcGF0Y2hOUEV2ZW50KE5QRXZlbnQmIGV2ZW50
KQoreworICAgIC8vIHNhbml0eSBjaGVjay4KKyAgICBpZiAoIW1fcGx1Z2luIHx8ICFtX3BsdWdp
bi0+cGx1Z2luRnVuY3MoKS0+ZXZlbnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFBs
dWdpblZpZXc6OnNldEN1cnJlbnRQbHVnaW5WaWV3KHRoaXMpOworICAgIEpTQzo6SlNMb2NrOjpE
cm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzKEpTQzo6U2lsZW5jZUFzc2VydGlvbnNPbmx5KTsKKyAg
ICBzZXRDYWxsaW5nUGx1Z2luKHRydWUpOworCisgICAgYm9vbCBhY2NlcHRlZCA9IG1fcGx1Z2lu
LT5wbHVnaW5GdW5jcygpLT5ldmVudChtX2luc3RhbmNlLCAmZXZlbnQpOworCisgICAgc2V0Q2Fs
bGluZ1BsdWdpbihmYWxzZSk7CisgICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBsdWdpblZpZXco
MCk7CisKKyAgICByZXR1cm4gYWNjZXB0ZWQ7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxl
S2V5Ym9hcmRFdmVudChLZXlib2FyZEV2ZW50KiBldmVudCkKK3sKKyAgICBOUEV2ZW50IG5wRXZl
bnQ7CisgICAgTlBLZXlib2FyZEV2ZW50IGtleUV2ZW50OworICAgIGNvbnN0IFBsYXRmb3JtS2V5
Ym9hcmRFdmVudCAqcGxhdGZvcm1LZXlFdmVudCA9IGV2ZW50LT5rZXlFdmVudCgpOworCisgICAg
a2V5RXZlbnQubW9kaWZpZXJzID0gMDsKKworICAgIGlmIChwbGF0Zm9ybUtleUV2ZW50LT5zaGlm
dEtleSgpKQorICAgICAgICBrZXlFdmVudC5tb2RpZmllcnMgfD0gS0VZTU9EX1NISUZUOworCisg
ICAgaWYgKHBsYXRmb3JtS2V5RXZlbnQtPmN0cmxLZXkoKSkKKyAgICAgICAga2V5RXZlbnQubW9k
aWZpZXJzIHw9IEtFWU1PRF9DVFJMOworCisgICAgaWYgKHBsYXRmb3JtS2V5RXZlbnQtPmFsdEtl
eSgpKQorICAgICAgICBrZXlFdmVudC5tb2RpZmllcnMgfD0gS0VZTU9EX0FMVDsKKworICAgIGlm
IChwbGF0Zm9ybUtleUV2ZW50LT5tZXRhS2V5KCkpCisgICAgICAgIGtleUV2ZW50Lm1vZGlmaWVy
cyB8PSBLRVlNT0RfQUxUR1I7CisKKyAgICBrZXlFdmVudC5jYXAgPSBwbGF0Zm9ybUtleUV2ZW50
LT51bm1vZGlmaWVkQ2hhcmFjdGVyKCk7CisgICAga2V5RXZlbnQuc3ltID0ga2V5RXZlbnQuY2Fw
OworICAgIGtleUV2ZW50LnNjYW4gPSAwOworICAgIGtleUV2ZW50LmZsYWdzID0gMDsKKworICAg
IGlmIChwbGF0Zm9ybUtleUV2ZW50LT50eXBlKCkgPT0gUGxhdGZvcm1LZXlib2FyZEV2ZW50OjpS
YXdLZXlEb3duCisgICAgICAgICAgICB8fCBwbGF0Zm9ybUtleUV2ZW50LT50eXBlKCkgPT0gUGxh
dGZvcm1LZXlib2FyZEV2ZW50OjpLZXlEb3duKSB7CisgICAgICAgIGtleUV2ZW50LmZsYWdzID0g
S0VZX0RPV04gfCBLRVlfU1lNX1ZBTElEIHwgS0VZX0NBUF9WQUxJRDsKKyAgICB9IGVsc2UgaWYg
KHBsYXRmb3JtS2V5RXZlbnQtPnR5cGUoKSA9PSBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6OktleVVw
KQorICAgICAgICBrZXlFdmVudC5mbGFncyA9IEtFWV9TWU1fVkFMSUQgfCBLRVlfQ0FQX1ZBTElE
OworCisgICAgbnBFdmVudC50eXBlID0gTlBfS2V5RXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0g
JmtleUV2ZW50OworICAgIGlmIChkaXNwYXRjaE5QRXZlbnQobnBFdmVudCkpCisgICAgICAgIGV2
ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZVdo
ZWVsRXZlbnQoV2hlZWxFdmVudCogZXZlbnQpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmICghbV9wcml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAgICAg
Zm9jdXNQbHVnaW5FbGVtZW50KCk7CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgTlBXaGVl
bEV2ZW50IHdoZWVsRXZlbnQ7CisKKyAgICB3aGVlbEV2ZW50LnggPSBldmVudC0+b2Zmc2V0WCgp
OworICAgIHdoZWVsRXZlbnQueSA9IGV2ZW50LT5vZmZzZXRZKCk7CisKKyAgICB3aGVlbEV2ZW50
LmZsYWdzID0gMDsKKworICAgIHdoZWVsRXZlbnQueERlbHRhID0gZXZlbnQtPnJhd0RlbHRhWCgp
OworICAgIHdoZWVsRXZlbnQueURlbHRhID0gZXZlbnQtPnJhd0RlbHRhWSgpOworCisgICAgbnBF
dmVudC50eXBlID0gTlBfV2hlZWxFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAmd2hlZWxFdmVu
dDsKKworICAgIGlmIChkaXNwYXRjaE5QRXZlbnQobnBFdmVudCkpIHsKKyAgICAgICAgZXZlbnQt
PnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgICAgIGV2ZW50LT5zZXRQbHVnaW5IYW5kbGVkKCk7
CisgICAgfQorfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZVRvdWNoRXZlbnQoVG91Y2hFdmVu
dCogZXZlbnQpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmICghbV9wcml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAgICAgZm9jdXNQbHVnaW5FbGVtZW50
KCk7CisKKyAgICBOUFRvdWNoRXZlbnQgbnBUb3VjaEV2ZW50OworCisgICAgaWYgKGV2ZW50LT5p
c0RvdWJsZVRhcCgpKQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0RP
VUJMRVRBUDsKKyAgICBlbHNlIGlmIChldmVudC0+aXNUb3VjaEhvbGQoKSkKKyAgICAgICAgbnBU
b3VjaEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9UT1VDSEhPTEQ7CisgICAgZWxzZSBpZiAoZXZl
bnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkudG91Y2hzdGFydEV2ZW50KQorICAgICAgICBucFRv
dWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX1NUQVJUOworICAgIGVsc2UgaWYgKGV2ZW50LT50
eXBlKCkgPT0gZXZlbnROYW1lcygpLnRvdWNoZW5kRXZlbnQpCisgICAgICAgIG5wVG91Y2hFdmVu
dC50eXBlID0gVE9VQ0hfRVZFTlRfRU5EOworICAgIGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0g
ZXZlbnROYW1lcygpLnRvdWNobW92ZUV2ZW50KQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9
IFRPVUNIX0VWRU5UX01PVkU7CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5h
bWVzKCkudG91Y2hjYW5jZWxFdmVudCkKKyAgICAgICAgbnBUb3VjaEV2ZW50LnR5cGUgPSBUT1VD
SF9FVkVOVF9DQU5DRUw7CisgICAgZWxzZQorICAgICAgICByZXR1cm47CisKKyAgICBUb3VjaExp
c3QqIHRvdWNoTGlzdDsKKyAgICAvLyBUaGUgdG91Y2hlcyBsaXN0IGlzIGVtcHR5IGlmIGluIGEg
dG91Y2ggZW5kIGV2ZW50LiBVc2UgY2hhbmdlZFRvdWNoZXMgaW5zdGVhZC4KKyAgICBpZiAobnBU
b3VjaEV2ZW50LnR5cGUgPT0gVE9VQ0hfRVZFTlRfRE9VQkxFVEFQIHx8IG5wVG91Y2hFdmVudC50
eXBlID09IFRPVUNIX0VWRU5UX0VORCkKKyAgICAgICAgdG91Y2hMaXN0ID0gZXZlbnQtPmNoYW5n
ZWRUb3VjaGVzKCk7CisgICAgZWxzZQorICAgICAgICB0b3VjaExpc3QgPSBldmVudC0+dG91Y2hl
cygpOworCisgICAgbnBUb3VjaEV2ZW50LnBvaW50cyA9IDA7CisgICAgbnBUb3VjaEV2ZW50LnNp
emUgPSB0b3VjaExpc3QtPmxlbmd0aCgpOworCisgICAgaWYgKHRvdWNoTGlzdC0+bGVuZ3RoKCkp
IHsKKyAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50cyA9IG5ldyBOUFRvdWNoUG9pbnRbdG91Y2hM
aXN0LT5sZW5ndGgoKV07CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0b3VjaExp
c3QtPmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIFRvdWNoKiB0b3VjaEl0ZW0gPSB0b3Vj
aExpc3QtPml0ZW0oaSk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnRvdWNo
SWQgPSB0b3VjaEl0ZW0tPmlkZW50aWZpZXIoKTsKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5w
b2ludHNbaV0uY2xpZW50WCA9IHRvdWNoSXRlbS0+cGFnZVgoKSAtIGZyYW1lUmVjdCgpLngoKTsK
KyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHNbaV0uY2xpZW50WSA9IHRvdWNoSXRlbS0+
cGFnZVkoKSAtIGZyYW1lUmVjdCgpLnkoKTsKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2lu
dHNbaV0uc2NyZWVuWCA9IHRvdWNoSXRlbS0+c2NyZWVuWCgpOworICAgICAgICAgICAgbnBUb3Vj
aEV2ZW50LnBvaW50c1tpXS5zY3JlZW5ZID0gdG91Y2hJdGVtLT5zY3JlZW5ZKCk7CisgICAgICAg
ICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnBhZ2VYID0gdG91Y2hJdGVtLT5wYWdlWCgpOwor
ICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5wYWdlWSA9IHRvdWNoSXRlbS0+cGFn
ZVkoKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5w
RXZlbnQudHlwZSA9IE5QX1RvdWNoRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gJm5wVG91Y2hF
dmVudDsKKworICAgIGlmIChkaXNwYXRjaE5QRXZlbnQobnBFdmVudCkpIHsKKyAgICAgICAgZXZl
bnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgICAgIGV2ZW50LT5zZXRQbHVnaW5IYW5kbGVk
KCk7CisgICAgfSBlbHNlIGlmIChucFRvdWNoRXZlbnQudHlwZSA9PSBUT1VDSF9FVkVOVF9ET1VC
TEVUQVApIHsKKyAgICAgICAgLy8gU2VuZCBUb3VjaCBVcCBpZiBkb3VibGUgdGFwIG5vdCBjb25z
dW1lZAorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0VORDsKKyAgICAg
ICAgbnBFdmVudC5kYXRhID0gJm5wVG91Y2hFdmVudDsKKyAgICAgICAgaWYgKGRpc3BhdGNoTlBF
dmVudChucEV2ZW50KSkgeworICAgICAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7
CisgICAgICAgICAgICBldmVudC0+c2V0UGx1Z2luSGFuZGxlZCgpOworICAgICAgICB9CisgICAg
fQorCisgICAgZGVsZXRlW10gbnBUb3VjaEV2ZW50LnBvaW50czsKK30KKwordm9pZCBQbHVnaW5W
aWV3OjpoYW5kbGVNb3VzZUV2ZW50KE1vdXNlRXZlbnQqIGV2ZW50KQoreworICAgIGlmICghbV9w
cml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1fcHJpdmF0ZS0+bV9pc0ZvY3Vz
ZWQpCisgICAgICAgIGZvY3VzUGx1Z2luRWxlbWVudCgpOworCisgICAgTlBFdmVudCBucEV2ZW50
OworICAgIE5QTW91c2VFdmVudCBtb3VzZUV2ZW50OworCisgICAgbW91c2VFdmVudC54ID0gZXZl
bnQtPm9mZnNldFgoKTsKKyAgICBtb3VzZUV2ZW50LnkgPSBldmVudC0+b2Zmc2V0WSgpOworCisg
ICAgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLm1vdXNlZG93bkV2ZW50KSB7Cisg
ICAgICAgIG1vdXNlRXZlbnQudHlwZSA9IE1PVVNFX0JVVFRPTl9ET1dOOworICAgICAgICBwYXJl
bnRGcmFtZSgpLT5ldmVudEhhbmRsZXIoKS0+c2V0Q2FwdHVyaW5nTW91c2VFdmVudHNOb2RlKG5v
ZGUoKSk7CisgICAgfSBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5tb3Vz
ZW1vdmVFdmVudCkKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9VU0VfTU9USU9OOworICAg
IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLm1vdXNlb3V0RXZlbnQpCisg
ICAgICAgIG1vdXNlRXZlbnQudHlwZSA9IE1PVVNFX09VVEJPVU5EOworICAgIGVsc2UgaWYgKGV2
ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLm1vdXNlb3ZlckV2ZW50KQorICAgICAgICBtb3Vz
ZUV2ZW50LnR5cGUgPSBNT1VTRV9PVkVSOworICAgIGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0g
ZXZlbnROYW1lcygpLm1vdXNldXBFdmVudCkgeworICAgICAgICBtb3VzZUV2ZW50LnR5cGUgPSBN
T1VTRV9CVVRUT05fVVA7CisgICAgICAgIHBhcmVudEZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5z
ZXRDYXB0dXJpbmdNb3VzZUV2ZW50c05vZGUoMCk7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVy
bjsKKworICAgIG1vdXNlRXZlbnQuYnV0dG9uID0gZXZlbnQtPmJ1dHRvbigpOworICAgIG1vdXNl
RXZlbnQuZmxhZ3MgPSAwOworCisgICAgbnBFdmVudC50eXBlID0gTlBfTW91c2VFdmVudDsKKyAg
ICBucEV2ZW50LmRhdGEgPSAmbW91c2VFdmVudDsKKworICAgIGlmIChkaXNwYXRjaE5QRXZlbnQo
bnBFdmVudCkpIHsKKyAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgICAg
IGV2ZW50LT5zZXRQbHVnaW5IYW5kbGVkKCk7CisgICAgfQorfQorCit2b2lkIFBsdWdpblZpZXc6
OmhhbmRsZUZvY3VzSW5FdmVudCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJl
dHVybjsKKworICAgIGlmIChtX3ByaXZhdGUtPm1faXNGb2N1c2VkKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX3ByaXZhdGUtPm1faXNGb2N1c2VkID0gdHJ1ZTsKKworICAgIE5QRXZlbnQgbnBF
dmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9Gb2N1c0dhaW5lZEV2ZW50OworICAgIG5wRXZl
bnQuZGF0YSA9IDA7CisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBs
dWdpblZpZXc6OmhhbmRsZUZvY3VzT3V0RXZlbnQoKQoreworICAgIGlmICghbV9wcml2YXRlKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQgPSBmYWxzZTsKKworICAg
IE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9Gb2N1c0xvc3RFdmVudDsK
KyAgICBucEV2ZW50LmRhdGEgPSAwOworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30K
Kwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVQYXVzZUV2ZW50KCkKK3sKKyAgICBOUEV2ZW50IG5w
RXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfUGF1c2VFdmVudDsKKyAgICBucEV2ZW50LmRh
dGEgPSAwOworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQbHVnaW5W
aWV3OjpoYW5kbGVSZXN1bWVFdmVudCgpCit7CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5w
RXZlbnQudHlwZSA9IE5QX1Jlc3VtZUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisgICAg
ZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZVNj
cm9sbEV2ZW50KCkKK3sKKyAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZy
YW1lVmlldyo+KHBhcmVudCgpKTsKKworICAgIC8vIEFzIGEgc3BlY2lhbCBjYXNlLCBpZiB0aGUg
ZnJhbWVWaWV3IGV4dGVudCBpbiBlaXRoZXIgZGltZW5zaW9uIGlzCisgICAgLy8gZW1wdHksIHRo
ZW4gc2VuZCBhbiBvbiBzY3JlZW4gZXZlbnQuIFRoaXMgaXMgaW1wb3J0YW50IGZvciBzaXRlcyBs
aWtlCisgICAgLy8gcGljbmlrLmNvbSB3aGljaCB1c2UgYSBoaWRkZW4gaWZyYW1lIChyZWFkOiB3
aWR0aCA9IDAgYW5kIGhlaWdodCA9IDApCisgICAgLy8gd2l0aCBhbiBlbWJlZGRlZCBzd2YgdG8g
ZXhlY3V0ZSBzb21lIGphdmFzY3JpcHQuIFVubGVzcyB3ZSBzZW5kIGFuCisgICAgLy8gb24gc2Ny
ZWVuIGV2ZW50IHRoZSBzd2Ygd2lsbCBub3QgZXhlY3V0ZSB0aGUgamF2YXNjcmlwdCBhbmQgdGhl
IHJlYWwKKyAgICAvLyBzaXRlIHdpbGwgbmV2ZXIgbG9hZC4KKyAgICBib29sIG9uU2NyZWVuRXZl
bnQgPSBmcmFtZVZpZXcgJiYgKCFmcmFtZVZpZXctPndpZHRoKCkgfHwgIWZyYW1lVmlldy0+aGVp
Z2h0KCkpOworCisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IG1fY2xp
cFJlY3QuaXNFbXB0eSgpICYmICFvblNjcmVlbkV2ZW50ID8gTlBfT2ZmU2NyZWVuRXZlbnQgOiBO
UF9PblNjcmVlbkV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisgICAgZGlzcGF0Y2hOUEV2
ZW50KG5wRXZlbnQpOworfQorCitJbnRSZWN0IFBsdWdpblZpZXc6OmNhbGN1bGF0ZUNsaXBSZWN0
KCkgY29uc3QKK3sKKyAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1l
Vmlldyo+KHBhcmVudCgpKTsKKyAgICBib29sIHZpc2libGUgPSBmcmFtZVZpZXcgJiYgaXNWaXNp
YmxlKCk7CisKKyAgICBpZiAodmlzaWJsZSAmJiBmcmFtZVZpZXctPndpZHRoKCkgJiYgZnJhbWVW
aWV3LT5oZWlnaHQoKSkgeworICAgICAgICBJbnRTaXplIHdpbmRvd1NpemUgPSBmcmFtZVZpZXct
Pmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnZpZXdwb3J0U2l6ZSgpOworCisg
ICAgICAgIC8vIEdldCB0aGUgY2xpcHBlZCByZWN0YW5nbGUgZm9yIHRoaXMgcGxheWVyIHdpdGhp
biB0aGUgY3VycmVudCBmcmFtZS4KKyAgICAgICAgSW50UmVjdCB2aXNpYmxlQ29udGVudFJlY3Q7
CisgICAgICAgIEludFJlY3QgY29udGVudFJlY3QgPSBtX2VsZW1lbnQtPnJlbmRlcmVyKCktPmFi
c29sdXRlQ2xpcHBlZE92ZXJmbG93UmVjdCgpOworICAgICAgICBGbG9hdFBvaW50IGNvbnRlbnRM
b2NhbCA9IG1fZWxlbWVudC0+cmVuZGVyZXIoKS0+YWJzb2x1dGVUb0xvY2FsKEZsb2F0UG9pbnQo
Y29udGVudFJlY3QubG9jYXRpb24oKSkpOworCisgICAgICAgIGNvbnRlbnRSZWN0LnNldExvY2F0
aW9uKHJvdW5kZWRJbnRQb2ludChjb250ZW50TG9jYWwpKTsKKyAgICAgICAgY29udGVudFJlY3Qu
bW92ZShmcmFtZVJlY3QoKS54KCksIGZyYW1lUmVjdCgpLnkoKSk7CisKKyAgICAgICAgLy8gQ2xp
cCBhZ2FpbnN0IGFueSBmcmFtZXMgdGhhdCB0aGUgd2lkZ2V0IGlzIGluc2lkZS4gTm90ZSB0aGF0
IGlmIHRoZSBmcmFtZXMgYXJlIGFsc28gY2xpcHBlZAorICAgICAgICAvLyBieSBhIGRpdiwgdGhh
dCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGlzIGNhbGN1bGF0aW9uLiBUaGF0IGlzIGFuIGlt
cHJvdmVtZW50IHRoYXQgc3RpbGwKKyAgICAgICAgLy8gbmVlZHMgdG8gYmUgbWFkZS4KKyAgICAg
ICAgY29uc3QgV2lkZ2V0KiBjdXJyZW50ID0gdGhpczsKKyAgICAgICAgd2hpbGUgKGN1cnJlbnQt
PnBhcmVudCgpICYmIHZpc2libGUpIHsKKyAgICAgICAgICAgIC8vIERldGVybWluZSBpZiBpdCBp
cyB2aXNpYmxlIGluIHRoaXMgc2Nyb2xsdmlldy4KKyAgICAgICAgICAgIHZpc2libGVDb250ZW50
UmVjdCA9IGN1cnJlbnQtPnBhcmVudCgpLT52aXNpYmxlQ29udGVudFJlY3QoKTsKKworICAgICAg
ICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB0aGUgcm9vdCBTY3JvbGxWaWV3LiBJdHMgc2l6ZSBk
b2VzIG5vdCBtYXRjaCB0aGUgYWN0dWFsIHdpbmRvdyBzaXplLgorICAgICAgICAgICAgaWYgKGN1
cnJlbnQtPnBhcmVudCgpID09IHJvb3QoKSkKKyAgICAgICAgICAgICAgICB2aXNpYmxlQ29udGVu
dFJlY3Quc2V0U2l6ZSh3aW5kb3dTaXplKTsKKworICAgICAgICAgICAgY29udGVudFJlY3QuaW50
ZXJzZWN0KHZpc2libGVDb250ZW50UmVjdCk7CisgICAgICAgICAgICB2aXNpYmxlID0gIWNvbnRl
bnRSZWN0LmlzRW1wdHkoKTsKKworICAgICAgICAgICAgLy8gT2Zmc2V0IHRvIHZpc2libGUgY29v
cmRpbmF0ZXMgaW4gc2Nyb2xsdmlldyB3aWRnZXQncyBjb29yZGluYXRlIHN5c3RlbSAoZXhjZXB0
IGluIHRoZSBjYXNlIG9mCisgICAgICAgICAgICAvLyB0aGUgdG9wIHNjcm9sbCB2aWV3KS4KKyAg
ICAgICAgICAgIGlmIChjdXJyZW50LT5wYXJlbnQoKS0+cGFyZW50KCkpCisgICAgICAgICAgICAg
ICAgY29udGVudFJlY3QubW92ZSgtdmlzaWJsZUNvbnRlbnRSZWN0LngoKSwgLXZpc2libGVDb250
ZW50UmVjdC55KCkpOworCisgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cGFyZW50KCk7
CisKKyAgICAgICAgICAgIC8vIERvbid0IGluY2x1ZGUgdGhlIG9mZnNldCBmb3IgdGhlIHJvb3Qg
d2luZG93IG9yIHdlIGdldCB0aGUgd3JvbmcgY29vcmRpbmF0ZXMuCisgICAgICAgICAgICBpZiAo
Y3VycmVudC0+cGFyZW50KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBNb3ZlIGNvbnRlbnQgcmVj
dCBpbnRvIHRoZSBwYXJlbnQgc2Nyb2xsdmlldydzIGNvb3JkaW5hdGVzLgorICAgICAgICAgICAg
ICAgIEludFJlY3QgY3VyRnJhbWVSZWN0ID0gY3VycmVudC0+ZnJhbWVSZWN0KCk7CisgICAgICAg
ICAgICAgICAgY29udGVudFJlY3QubW92ZShjdXJGcmFtZVJlY3QueCgpLCBjdXJGcmFtZVJlY3Qu
eSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb250ZW50
UmVjdDsKKyAgICB9CisKKyAgICByZXR1cm4gSW50UmVjdCgpOworfQorCit2b2lkIFBsdWdpblZp
ZXc6OmhhbmRsZU9uTG9hZEV2ZW50KCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKG1fcHJpdmF0ZS0+bV9zZW50T25Mb2FkKQorICAgICAgICByZXR1
cm47CisKKyAgICBtX3ByaXZhdGUtPm1fc2VudE9uTG9hZCA9IHRydWU7CisKKyAgICBOUEV2ZW50
IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfT25Mb2FkRXZlbnQ7CisgICAgbnBFdmVu
dC5kYXRhID0gMDsKKworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKKworICAgIC8vIFNl
bmQgYW4gaW5pdGlhbCBPblNjcmVlbi9PZmZTY3JlZW4gZXZlbnQuIEl0IG11c3QgYWx3YXlzIGNv
bWUgYWZ0ZXIgb25Mb2FkIGlzIHNlbnQuCisgICAgaGFuZGxlU2Nyb2xsRXZlbnQoKTsKK30KKwor
dm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVGcmVlTWVtb3J5RXZlbnQoKQoreworICAgIE5QRXZlbnQg
bnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9GcmVlTWVtb3J5RXZlbnQ7CisgICAgbnBF
dmVudC5kYXRhID0gMDsKKworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30KKwordm9p
ZCBQbHVnaW5WaWV3OjpoYW5kbGVCYWNrZ3JvdW5kRXZlbnQoKQoreworICAgIE5QRXZlbnQgbnBF
dmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9CYWNrZ3JvdW5kRXZlbnQ7CisgICAgbnBFdmVu
dC5kYXRhID0gMDsKKworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQ
bHVnaW5WaWV3OjpoYW5kbGVGb3JlZ3JvdW5kRXZlbnQoKQoreworICAgIHNldE5QV2luZG93SWZO
ZWVkZWQoKTsKKworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9G
b3JlZ3JvdW5kRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKworICAgIGRpc3BhdGNoTlBF
dmVudChucEV2ZW50KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVGdWxsU2NyZWVuQWxs
b3dlZEV2ZW50KCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0Z1bGxTY3JlZW5SZWFk
eUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisKKyAgICBpZiAoRnJhbWVWaWV3KiBmcmFt
ZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSkpIHsKKyAgICAgICAgZnJh
bWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5kaWRQbHVnaW5FbnRl
ckZ1bGxTY3JlZW4odGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigp
KTsKKworICAgICAgICBpZiAoIWRpc3BhdGNoTlBFdmVudChucEV2ZW50KSkKKyAgICAgICAgICAg
IGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+ZGlkUGx1Z2lu
RXhpdEZ1bGxTY3JlZW4odGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0
cigpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV9wcml2YXRlLT5tX2lzRnVsbFNjcmVl
biA9IHRydWU7CisgICAgfQorfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUZ1bGxTY3JlZW5F
eGl0RXZlbnQoKQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfRnVsbFNjcmVlbkV4aXRF
dmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZl
bnQpOworCisgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVW
aWV3Kj4ocGFyZW50KCkpKQorICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZv
cm1QYWdlQ2xpZW50KCktPmRpZFBsdWdpbkV4aXRGdWxsU2NyZWVuKHRoaXMsIG1fcHJpdmF0ZS0+
bV9wbHVnaW5VbmlxdWVQcmVmaXguY19zdHIoKSk7CisKKyAgICBtX3ByaXZhdGUtPm1faXNGdWxs
U2NyZWVuID0gZmFsc2U7CisgICAgaW52YWxpZGF0ZSgpOworfQorCit2b2lkIFBsdWdpblZpZXc6
OmhhbmRsZUlkbGVFdmVudChib29sIGVudGVySWRsZSkKK3sKKyAgICBOUEV2ZW50IG5wRXZlbnQ7
CisgICAgbnBFdmVudC5kYXRhID0gMDsKKworICAgIGlmIChlbnRlcklkbGUpCisgICAgICAgIG5w
RXZlbnQudHlwZSA9IE5QX0VudGVySWRsZUV2ZW50OworICAgIGVsc2UKKyAgICAgICAgbnBFdmVu
dC50eXBlID0gTlBfRXhpdElkbGVFdmVudDsKKworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50
KTsKK30KKworCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUFwcEFjdGl2YXRlZEV2ZW50KCkKK3sK
KyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKyAgICBucEV2ZW50
LnR5cGUgPSBOUF9BcHBBY3RpdmF0ZWRFdmVudDsKKworICAgIGRpc3BhdGNoTlBFdmVudChucEV2
ZW50KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVBcHBEZWFjdGl2YXRlZEV2ZW50KCkK
K3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gUGx1Z2lu
IHdhbnRzIHRvIGtub3cgdGhhdCBpdCBoYXMgdG8gZXhpdCBmdWxsc2NyZWVuIG9uIGRlYWN0aXZh
dGlvbi4KKyAgICBpZiAobV9wcml2YXRlLT5tX2lzRnVsbFNjcmVlbikKKyAgICAgICAgaGFuZGxl
RnVsbFNjcmVlbkV4aXRFdmVudCgpOworCisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZl
bnQuZGF0YSA9IDA7CisgICAgbnBFdmVudC50eXBlID0gTlBfQXBwRGVhY3RpdmF0ZWRFdmVudDsK
KworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQbHVnaW5WaWV3Ojpo
YW5kbGVBcHBTdGFuZGJ5RXZlbnQoKQoreworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBzZW5k
IGFuIFFOUF9BcHBTdGFuZGJ5RXZlbnQKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVu
dC5kYXRhID0gMDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9BcHBTdGFuZEJ5RXZlbnQ7CisKKyAg
ICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxl
T3JpZW50YXRpb25FdmVudChpbnQgYW5nbGUpCit7CisgICAgTlBFdmVudCBucEV2ZW50OworICAg
IG5wRXZlbnQudHlwZSA9IE5QX09yaWVudGF0aW9uRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0g
KHZvaWQqKWFuZ2xlOworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lk
IFBsdWdpblZpZXc6OmhhbmRsZVN3aXBlRXZlbnQoKQoreworICAgIGlmICghbV9wcml2YXRlKQor
ICAgICAgICByZXR1cm47CisKKyAgICAvLyBQbHVnaW4gb25seSB3YW50cyB0byBrbm93IHRoYXQg
aXQgaGFzIHRvIGV4aXQgZnVsbHNjcmVlbi4KKyAgICBpZiAobV9wcml2YXRlLT5tX2lzRnVsbFNj
cmVlbikKKyAgICAgICAgaGFuZGxlRnVsbFNjcmVlbkV4aXRFdmVudCgpOworfQorCit2b2lkIFBs
dWdpblZpZXc6OmhhbmRsZVNjcmVlblBvd2VyRXZlbnQoYm9vbCBwb3dlcmVkKQoreworICAgIE5Q
RXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworCisgICAgaWYgKHBvd2VyZWQp
CisgICAgICAgIG5wRXZlbnQudHlwZSA9IE5QX1NjcmVlblBvd2VyVXBFdmVudDsKKyAgICBlbHNl
CisgICAgICAgIG5wRXZlbnQudHlwZSA9IE5QX1NjcmVlblBvd2VyRG93bkV2ZW50OworCisgICAg
ZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OnNldFBhcmVu
dChTY3JvbGxWaWV3KiBwYXJlbnRXaWRnZXQpCit7CisgICAgLy8gSWYgcGFyZW50V2lkZ2V0IGlz
IDAsIGxldHMgdW5yZWdpc3RlciB0aGUgcGx1Z2luIHdpdGggdGhlIGN1cnJlbnQgcGFyZW50Lgor
ICAgIGlmIChtX3ByaXZhdGUgJiYgKCFwYXJlbnRXaWRnZXQgfHwgcGFyZW50V2lkZ2V0ICE9IHBh
cmVudCgpKSkgeworICAgICAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2Fz
dDxGcmFtZVZpZXcqPihwYXJlbnQoKSkpIHsKKyAgICAgICAgICAgIGlmIChtX3ByaXZhdGUtPm1f
aXNCYWNrZ3JvdW5kUGxheWluZykKKyAgICAgICAgICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5k
b3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPm9uUGx1Z2luU3RvcEJhY2tncm91bmRQbGF5KHRo
aXMsIG1fcHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19zdHIoKSk7CisKKyAgICAgICAg
ICAgIGlmIChtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuKQorICAgICAgICAgICAgICAgIGhhbmRs
ZUZ1bGxTY3JlZW5FeGl0RXZlbnQoKTsKKworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHVubG9j
ayB0aGUgaWRsZSAoaWYgd2UgaGF2ZSBsb2NrZWQgaXQpLgorICAgICAgICAgICAgbV9wcml2YXRl
LT5wcmV2ZW50SWRsZShmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCByZWxlYXNl
IGFueSBrZWVwVmlzaWJsZVJlY3RzIGlmIHRoZXkgd2VyZSBzZXQuCisgICAgICAgICAgICBtX3By
aXZhdGUtPmNsZWFyVmlzaWJsZVJlY3RzKCk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisgICAgICAgICAgICAvLyBJZiB3ZSBoYWQgYSBob2xlIHB1bmNoIHJlY3Qgc2V0LCBj
bGVhciBpdC4KKyAgICAgICAgICAgIGlmIChtX3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllciAmJiAh
bV9wcml2YXRlLT5tX2hvbGVQdW5jaFJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIG1f
cHJpdmF0ZS0+bV9wbGF0Zm9ybUxheWVyLT5zZXRIb2xlUHVuY2hSZWN0KEludFJlY3QoKSk7Cisj
ZW5kaWYKKyAgICAgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VD
bGllbnQoKS0+cmVnaXN0ZXJQbHVnaW4odGhpcywgZmFsc2UgLypzaG91bGRSZWdpc3RlciovKTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIFdpZGdldDo6c2V0UGFyZW50KHBhcmVudFdpZGdldCk7
CisKKyAgICBpZiAocGFyZW50V2lkZ2V0KSB7CisgICAgICAgIGluaXQoKTsKKworICAgICAgICBG
cmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudFdpZGdl
dCk7CisKKyAgICAgICAgaWYgKGZyYW1lVmlldyAmJiBtX3ByaXZhdGUpIHsKKyAgICAgICAgICAg
IGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+cmVnaXN0ZXJQ
bHVnaW4odGhpcywgdHJ1ZSAvKnNob3VsZFJlZ2lzdGVyKi8pOworICAgICAgICAgICAgaWYgKGZy
YW1lVmlldy0+ZnJhbWUoKQorICAgICAgICAgICAgICAgJiYgZnJhbWVWaWV3LT5mcmFtZSgpLT5s
b2FkZXIoKQorICAgICAgICAgICAgICAgJiYgZnJhbWVWaWV3LT5mcmFtZSgpLT5sb2FkZXIoKS0+
ZnJhbWVIYXNMb2FkZWQoKSkKKyAgICAgICAgICAgICAgICBoYW5kbGVPbkxvYWRFdmVudCgpOwor
CisgICAgICAgICAgICBpZiAobV9wcml2YXRlLT5tX2lzQmFja2dyb3VuZFBsYXlpbmcpCisgICAg
ICAgICAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgp
LT5vblBsdWdpblN0YXJ0QmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVu
aXF1ZVByZWZpeC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBQbHVnaW5W
aWV3OjpzZXROUFdpbmRvd1JlY3QoY29uc3QgSW50UmVjdCYgcmMpCit7CisgICAgc2V0TlBXaW5k
b3dJZk5lZWRlZCgpOworfQorCit2b2lkIFBsdWdpblZpZXc6OnNldE5QV2luZG93SWZOZWVkZWQo
KQoreworICAgIGlmICghbV9wcml2YXRlIHx8ICFtX2lzU3RhcnRlZCB8fCAhcGFyZW50KCkgfHwg
IW1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5zZXR3aW5kb3cpCisgICAgICAgIHJldHVybjsKKwor
ICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50
KCkpOworICAgIGlmICghZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVu
dCgpLT5pc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBJZiB0aGUgcGx1Z2lu
IGRpZG4ndCBsb2FkIHN1Y2Vzc2Z1bGx5LCBubyBwb2ludCBpbiBjYWxsaW5nIHNldHdpbmRvdwor
ICAgIGlmIChtX3N0YXR1cyAhPSBQbHVnaW5TdGF0dXNMb2FkZWRTdWNjZXNzZnVsbHkpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmIChtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuKQorICAgICAg
ICByZXR1cm47CisKKyAgICBpZiAoIW1fcHJpdmF0ZS0+bV9oYXNQZW5kaW5nR2VvbWV0cnlDaGFu
Z2UpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcHJpdmF0ZS0+bV9oYXNQZW5kaW5nR2VvbWV0
cnlDaGFuZ2UgPSBmYWxzZTsKKworICAgIG1fbnBXaW5kb3cueCA9IG1fd2luZG93UmVjdC54KCk7
CisgICAgbV9ucFdpbmRvdy55ID0gbV93aW5kb3dSZWN0LnkoKTsKKworICAgIG1fbnBXaW5kb3cu
Y2xpcFJlY3QubGVmdCA9IG1heCgwLCBtX2NsaXBSZWN0LngoKSk7CisgICAgbV9ucFdpbmRvdy5j
bGlwUmVjdC50b3AgPSBtYXgoMCwgbV9jbGlwUmVjdC55KCkpOworICAgIG1fbnBXaW5kb3cuY2xp
cFJlY3QucmlnaHQgPSBtYXgoMCwgbV9jbGlwUmVjdC5tYXhYKCkpOworICAgIG1fbnBXaW5kb3cu
Y2xpcFJlY3QuYm90dG9tID0gbWF4KDAsIG1fY2xpcFJlY3QubWF4WSgpKTsKKworICAgIGlmICht
X3BsdWdpbi0+cXVpcmtzKCkuY29udGFpbnMoUGx1Z2luUXVpcmtEb250Q2FsbFNldFdpbmRvd01v
cmVUaGFuT25jZSkpIHsKKyAgICAgICAgLy8gRkxBU0ggV09SS0FST1VORDogT25seSBzZXQgaW5p
dGlhbGx5LiBNdWx0aXBsZSBjYWxscyB0bworICAgICAgICAvLyBzZXROUFdpbmRvdygpIGNhdXNl
IHRoZSBwbHVnaW4gdG8gY3Jhc2ggaW4gd2luZG93ZWQgbW9kZS4KKyAgICAgICAgaWYgKCFtX2lz
V2luZG93ZWQgfHwgbV9ucFdpbmRvdy53aWR0aCA9PSBVTklOSVRfQ09PUkQgfHwgbV9ucFdpbmRv
dy5oZWlnaHQgPT0gVU5JTklUX0NPT1JEKSB7CisgICAgICAgICAgICBtX25wV2luZG93LndpZHRo
ID0gbV93aW5kb3dSZWN0LndpZHRoKCk7CisgICAgICAgICAgICBtX25wV2luZG93LmhlaWdodCA9
IG1fd2luZG93UmVjdC5oZWlnaHQoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAg
IG1fbnBXaW5kb3cud2lkdGggPSBtX3dpbmRvd1JlY3Qud2lkdGgoKTsKKyAgICAgICAgbV9ucFdp
bmRvdy5oZWlnaHQgPSBtX3dpbmRvd1JlY3QuaGVpZ2h0KCk7CisgICAgfQorCisgICAgbV9ucFdp
bmRvdy50eXBlID0gTlBXaW5kb3dUeXBlRHJhd2FibGU7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6R3JhcGhpY3M6OldpbmRvdyAqd2luZG93ID0KKyAgICAgICAgZnJhbWVWaWV3LT5ob3N0
V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5wbGF0Zm9ybVdpbmRvdygpOworICAgIGlm
ICh3aW5kb3cpCisgICAgICAgICgoTlBTZXRXaW5kb3dDYWxsYmFja1N0cnVjdCopbV9ucFdpbmRv
dy53c19pbmZvKS0+d2luZG93R3JvdXAgPSB3aW5kb3ctPndpbmRvd0dyb3VwKCk7CisKKyAgICBQ
bHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldyh0aGlzKTsKKyAgICBKU0M6OkpTTG9jazo6
RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrcyhKU0M6OlNpbGVuY2VBc3NlcnRpb25zT25seSk7Cisg
ICAgc2V0Q2FsbGluZ1BsdWdpbih0cnVlKTsKKyAgICAvLyBGSVhNRTogUGFzc2luZyB6b29tRmFj
dG9yIHRvIHNldHdpbmRvdyBtYWtlIHdpbmRvd2VkIHBsdWdpbiBzY2FsZSBpbmNvcnJlY3RseS4K
KyAgICAvLyBIYW5kbGluZyB0aGUgem9vbSBmYWN0b3IgcHJvcGVybHkgaW4gdGhlIHBsdWdpbiBz
aWRlIG1heSBiZSBhIGJldHRlciBzb2x1dGlvbi4KKyAgICBkb3VibGUgb2xkWm9vbUZhY3RvciA9
ICgoTlBTZXRXaW5kb3dDYWxsYmFja1N0cnVjdCopbV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZh
Y3RvcjsKKyAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5m
byktPnpvb21GYWN0b3IgPSAxLjsKKyAgICBtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+c2V0d2lu
ZG93KG1faW5zdGFuY2UsICZtX25wV2luZG93KTsKKyAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tT
dHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21GYWN0b3IgPSBvbGRab29tRmFjdG9yOwor
ICAgIHNldENhbGxpbmdQbHVnaW4oZmFsc2UpOworICAgIFBsdWdpblZpZXc6OnNldEN1cnJlbnRQ
bHVnaW5WaWV3KDApOworfQorCit2b2lkIFBsdWdpblZpZXc6OnNldFBhcmVudFZpc2libGUoYm9v
bCB2aXNpYmxlKQoreworICAgIGlmIChpc1BhcmVudFZpc2libGUoKSA9PSB2aXNpYmxlKQorICAg
ICAgICByZXR1cm47CisKKyAgICBXaWRnZXQ6OnNldFBhcmVudFZpc2libGUodmlzaWJsZSk7CisK
KyAgICAvLyBGSVhNRTogV2UgbWlnaHQgd2FudCB0byB0ZWxsIHRoZSBwbHVnaW4gdG8gaGlkZSBp
dCdzIHdpbmRvdyBoZXJlLCBidXQgaXQgZG9lc24ndCBtYXR0ZXIKKyAgICAvLyAgICAgICBzaW5j
ZSB0aGUgd2luZG93IG1hbmFnZXIgc2hvdWxkIHRha2UgY2FyZSBvZiB0aGF0IGZvciB1cy4KK30K
KworTlBFcnJvciBQbHVnaW5WaWV3OjpoYW5kbGVQb3N0UmVhZEZpbGUoVmVjdG9yPGNoYXI+JiBi
dWZmZXIsIHVpbnQzMl90IGxlbiwgY29uc3QgY2hhciogYnVmKQoreworICAgIFN0cmluZyBmaWxl
bmFtZShidWYsIGxlbik7CisKKyAgICBpZiAoZmlsZW5hbWUuc3RhcnRzV2l0aCgiZmlsZTovLy8i
KSkKKyAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoOCk7CisKKyAgICBsb25n
IGxvbmcgc2l6ZTsKKyAgICBpZiAoIWdldEZpbGVTaXplKGZpbGVuYW1lLCBzaXplKSkKKyAgICAg
ICAgcmV0dXJuIE5QRVJSX0ZJTEVfTk9UX0ZPVU5EOworCisgICAgRklMRSogZmlsZUhhbmRsZSA9
IGZvcGVuKChmaWxlbmFtZS51dGY4KCkpLmRhdGEoKSwgInIiKTsKKyAgICBpZiAoIWZpbGVIYW5k
bGUpCisgICAgICAgIHJldHVybiBOUEVSUl9GSUxFX05PVF9GT1VORDsKKworICAgIGJ1ZmZlci5y
ZXNpemUoc2l6ZSk7CisgICAgaW50IGJ5dGVzUmVhZCA9IGZyZWFkKGJ1ZmZlci5kYXRhKCksIDEs
IHNpemUsIGZpbGVIYW5kbGUpOworCisgICAgZmNsb3NlKGZpbGVIYW5kbGUpOworCisgICAgaWYg
KGJ5dGVzUmVhZCA8PSAwKQorICAgICAgICByZXR1cm4gTlBFUlJfRklMRV9OT1RfRk9VTkQ7CisK
KyAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK2Jvb2wgUGx1Z2luVmlldzo6cGxhdGZv
cm1HZXRWYWx1ZVN0YXRpYyhOUE5WYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCogdmFsdWUsIE5QRXJy
b3IqIHJlc3VsdCkKK3sKKyAgICBzd2l0Y2ggKHZhcmlhYmxlKSB7CisgICAgY2FzZSBOUE5WVG9v
bGtpdDoKKyAgICAgICAgKnN0YXRpY19jYXN0PHVpbnQzMl90Kj4odmFsdWUpID0gMDsKKyAgICAg
ICAgKnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAg
IGNhc2UgTlBOVlN1cHBvcnRzWEVtYmVkQm9vbDoKKyAgICAgICAgKnN0YXRpY19jYXN0PE5QQm9v
bCo+KHZhbHVlKSA9IHRydWU7CisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIE5QTlZqYXZhc2NyaXB0RW5hYmxlZEJvb2w6
CisgICAgICAgICpzdGF0aWNfY2FzdDxOUEJvb2wqPih2YWx1ZSkgPSB0cnVlOworICAgICAgICAq
cmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgY2Fz
ZSBOUE5WU3VwcG9ydHNXaW5kb3dsZXNzOgorICAgICAgICAqc3RhdGljX2Nhc3Q8TlBCb29sKj4o
dmFsdWUpID0gdHJ1ZTsKKyAgICAgICAgKnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgTlBOVk5QQ2FsbGJhY2tzUHRyOiB7CisgICAgICAg
ICooKHZvaWQgKiopIHZhbHVlKSA9ICh2b2lkKikmc19OcENhbGxiYWNrczsKKyAgICAgICAgKnJl
c3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAg
ICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIFBsdWdp
blZpZXc6OnBsYXRmb3JtR2V0VmFsdWUoTlBOVmFyaWFibGUgdmFyaWFibGUsIHZvaWQqIHZhbHVl
LCBOUEVycm9yKiByZXN1bHQpCit7CisgICAgc3dpdGNoICh2YXJpYWJsZSkgeworICAgIGNhc2Ug
TlBOVlpvb21GYWN0b3I6IHsKKyAgICAgICAgKigodm9pZCAqKikgdmFsdWUpID0gKHZvaWQqKSYo
KChOUFNldFdpbmRvd0NhbGxiYWNrU3RydWN0KiltX25wV2luZG93LndzX2luZm8pLT56b29tRmFj
dG9yKTsKKyAgICAgICAgKnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisKKyAgICBjYXNlIE5QTlZSb290V2luZG93R3JvdXA6IHsKKyAgICAgICAg
RnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7
CisgICAgICAgIGlmIChmcmFtZVZpZXcpIHsKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpHcmFwaGljczo6V2luZG93ICp3aW5kb3cgPQorICAgICAgICAgICAgICAgIGZyYW1lVmll
dy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+cGxhdGZvcm1XaW5kb3coKTsK
KyAgICAgICAgICAgIGlmICh3aW5kb3cpIHsKKyAgICAgICAgICAgICAgICB2b2lkKiogdiA9ICh2
b2lkKiopIHZhbHVlOworICAgICAgICAgICAgICAgICp2ID0gKHZvaWQqKSB3aW5kb3ctPnJvb3RH
cm91cCgpOworCisgICAgICAgICAgICAgICAgaWYgKCp2KSB7CisgICAgICAgICAgICAgICAgICAg
ICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgKnJlc3VsdCA9IE5QRVJSX0dFTkVSSUNfRVJST1I7CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisKKyAgICBjYXNlIE5QTlZCcm93c2VyV2luZG93R3JvdXA6IHsKKyAgICAgICAgRnJh
bWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7Cisg
ICAgICAgIGlmIChmcmFtZVZpZXcpIHsKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpHcmFwaGljczo6V2luZG93ICp3aW5kb3cgPQorICAgICAgICAgICAgICAgIGZyYW1lVmlldy0+
aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+cGxhdGZvcm1XaW5kb3coKTsKKyAg
ICAgICAgICAgIGlmICh3aW5kb3cpIHsKKyAgICAgICAgICAgICAgICB2b2lkKiogdiA9ICh2b2lk
KiopIHZhbHVlOworICAgICAgICAgICAgICAgICp2ID0gKHZvaWQqKSB3aW5kb3ctPndpbmRvd0dy
b3VwKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoKnYpIHsKKyAgICAgICAgICAgICAgICAgICAg
KnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAg
ICAqcmVzdWx0ID0gTlBFUlJfR0VORVJJQ19FUlJPUjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIGNhc2UgTlBOVkJyb3dzZXJEaXNwbGF5Q29udGV4dDogeworICAgICAgICBG
cmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKTsK
KyAgICAgICAgaWYgKGZyYW1lVmlldykgeworICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkdyYXBoaWNzOjpQbGF0Zm9ybURpc3BsYXlDb250ZXh0SGFuZGxlIGNvbnRleHQgPQorICAg
ICAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6cGxhdGZvcm1EaXNw
bGF5Q29udGV4dCgpOworICAgICAgICAgICAgaWYgKGNvbnRleHQpIHsKKyAgICAgICAgICAgICAg
ICB2b2lkKiogdiA9ICh2b2lkKiopIHZhbHVlOworICAgICAgICAgICAgICAgICp2ID0gKHZvaWQq
KSBjb250ZXh0OworCisgICAgICAgICAgICAgICAgaWYgKCp2KSB7CisgICAgICAgICAgICAgICAg
ICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAg
ICAgICAgKnJlc3VsdCA9IE5QRVJSX0dFTkVSSUNfRVJST1I7CisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9CisKKyAgICBjYXNlIE5QTlZQbHVnaW5XaW5kb3dQcmVmaXg6IHsKKyAgICAgICAg
dm9pZCoqIHYgPSAodm9pZCoqKSB2YWx1ZTsKKyAgICAgICAgKnYgPSAodm9pZCopIG1fcHJpdmF0
ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19zdHIoKTsKKworICAgICAgICBpZiAoKnYpIHsKKyAg
ICAgICAgICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9CisKKyAgICAgICAgKnJlc3VsdCA9IE5QRVJSX0dFTkVSSUNfRVJST1I7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICBy
ZXR1cm4gcGxhdGZvcm1HZXRWYWx1ZVN0YXRpYyh2YXJpYWJsZSwgdmFsdWUsIHJlc3VsdCk7Cisg
ICAgICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgcmV0dXJuIGZhbHNlPworICAgIH0KK30KKworLy8g
VGhpcyBpcyBhIHB1cmUgdmlydHVhbCBpbmhlcml0ZWQgZnJvbSBXaWRnZXQgY2xhc3MgYW5kIGFs
bCBpbnZhbGlkYXRlcworLy8gYXJlIGZ1bm5lbGVkIHRocm91Z2ggdGhpcyBtZXRob2QuIFdlIGZv
cndhcmQgdGhlbSBvbiB0byBlaXRoZXIgdGhlCisvLyBjb21wb3NpdGluZyBsYXllciBvciB0aGUg
UGx1Z2luVmlldzo6aW52YWxpZGF0ZVdpbmRvd2xlc3NQbHVnaW5SZWN0IG1ldGhvZC4KK3ZvaWQg
UGx1Z2luVmlldzo6aW52YWxpZGF0ZVJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBp
ZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gUmVjb3JkIHRoZSByZWdp
b24gdGhhdCB3ZSd2ZSBiZWVuIGFza2VkIHRvIGludmFsaWRhdGUKKyAgICBtX3ByaXZhdGUtPm1f
aW52YWxpZGF0ZVJlZ2lvbiA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjp1
bmlvblJlZ2lvbnMoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3QocmVjdCksIG1fcHJpdmF0
ZS0+bV9pbnZhbGlkYXRlUmVnaW9uKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKyAgICBpZiAobV9wcml2YXRlLT5tX3BsYXRmb3JtTGF5ZXIpIHsKKyAgICAgICAgbV9wcml2
YXRlLT5tX3BsYXRmb3JtTGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOworICAgICAgICByZXR1cm47
CisgICAgfQorI2VuZGlmCisKKyAgICBpbnZhbGlkYXRlV2luZG93bGVzc1BsdWdpblJlY3QocmVj
dCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aW52YWxpZGF0ZVJlY3QoTlBSZWN0KiByZWN0KQor
eworICAgIGlmICghcmVjdCkgeworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisgICAgaW52YWxpZGF0ZVJlY3QoSW50UmVjdChyZWN0LT5sZWZ0LCByZWN0LT50
b3AsIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wKSk7
Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aW52YWxpZGF0ZVJlZ2lvbihOUFJlZ2lvbiByZWdpb24p
Cit7CisgICAgaW52YWxpZGF0ZSgpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmZvcmNlUmVkcmF3
KCkKK3sKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK2Jvb2wgUGx1Z2luVmlldzo6cGxhdGZvcm1T
dGFydCgpCit7CisgICAgQVNTRVJUKG1faXNTdGFydGVkKTsKKyAgICBBU1NFUlQobV9zdGF0dXMg
PT0gUGx1Z2luU3RhdHVzTG9hZGVkU3VjY2Vzc2Z1bGx5KTsKKworICAgIG1fcHJpdmF0ZSA9IG5l
dyBQbHVnaW5WaWV3UHJpdmF0ZSh0aGlzKTsKKworICAgIGlmIChtX3BsdWdpbi0+cGx1Z2luRnVu
Y3MoKS0+Z2V0dmFsdWUpIHsKKyAgICAgICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBsdWdpblZp
ZXcodGhpcyk7CisgICAgICAgIEpTQzo6SlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tz
KEpTQzo6U2lsZW5jZUFzc2VydGlvbnNPbmx5KTsKKyAgICAgICAgc2V0Q2FsbGluZ1BsdWdpbih0
cnVlKTsKKyAgICAgICAgbV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPmdldHZhbHVlKG1faW5zdGFu
Y2UsIE5QUFZwbHVnaW5OZWVkc1hFbWJlZCwgJm1fbmVlZHNYRW1iZWQpOworICAgICAgICBzZXRD
YWxsaW5nUGx1Z2luKGZhbHNlKTsKKyAgICAgICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBsdWdp
blZpZXcoMCk7CisgICAgfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAg
IGlmIChtX3BhcmVudEZyYW1lLT5wYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKS0+YWxsb3dzQWNj
ZWxlcmF0ZWRDb21wb3NpdGluZygpCisgICAgICAgICYmIG1fcGFyZW50RnJhbWUtPnBhZ2UoKS0+
c2V0dGluZ3MoKQorICAgICAgICAmJiBtX3BhcmVudEZyYW1lLT5wYWdlKCktPnNldHRpbmdzKCkt
PmFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFibGVkKCkpIHsKKyAgICAgICAgbV9wcml2YXRlLT5t
X3BsYXRmb3JtTGF5ZXIgPSBQbHVnaW5MYXllcldlYktpdFRocmVhZDo6Y3JlYXRlKHRoaXMpOwor
ICAgICAgICAvLyBUcmlnZ2VyIGxheWVyIGNvbXB1dGF0aW9uIGluIFJlbmRlckxheWVyQ29tcG9z
aXRvcgorICAgICAgICBtX2VsZW1lbnQtPnNldE5lZWRzU3R5bGVSZWNhbGMoU3ludGhldGljU3R5
bGVDaGFuZ2UpOworICAgIH0KKyNlbmRpZgorCisgICAgbV9ucFdpbmRvdy50eXBlID0gTlBXaW5k
b3dUeXBlRHJhd2FibGU7CisgICAgbV9ucFdpbmRvdy53aW5kb3cgPSAwOyAvLyBOb3QgdXNlZD8K
KyAgICBtX25wV2luZG93LnggPSAwOworICAgIG1fbnBXaW5kb3cueSA9IDA7CisgICAgbV9ucFdp
bmRvdy53aWR0aCA9IFVOSU5JVF9DT09SRDsKKyAgICBtX25wV2luZG93LmhlaWdodCA9IFVOSU5J
VF9DT09SRDsKKyAgICBtX25wV2luZG93LndzX2luZm8gPSBuZXcgTlBTZXRXaW5kb3dDYWxsYmFj
a1N0cnVjdDsKKyAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3Nf
aW5mbyktPnpvb21GYWN0b3IgPSAxLjsKKyAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3Qq
KW1fbnBXaW5kb3cud3NfaW5mbyktPndpbmRvd0dyb3VwID0gMDsKKworICAgIHNob3coKTsKKwor
ICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBh
cmVudCgpKSkKKyAgICAgICAgaGFuZGxlT3JpZW50YXRpb25FdmVudChmcmFtZVZpZXctPmhvc3RX
aW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPm9yaWVudGF0aW9uKCkpOworCisgICAgaWYg
KCEobV9wbHVnaW4tPnF1aXJrcygpLmNvbnRhaW5zKFBsdWdpblF1aXJrRGVmZXJGaXJzdFNldFdp
bmRvd0NhbGwpKSkgeworICAgICAgICB1cGRhdGVQbHVnaW5XaWRnZXQoKTsKKyAgICAgICAgc2V0
TlBXaW5kb3dJZk5lZWRlZCgpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lk
IFBsdWdpblZpZXc6OnBsYXRmb3JtRGVzdHJveSgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgd2lsbCB1bmxvY2sgdGhlIGlkbGUgKGlmIHdl
IGhhdmUgbG9ja2VkIGl0KS4KKyAgICBtX3ByaXZhdGUtPnByZXZlbnRJZGxlKGZhbHNlKTsKKwor
ICAgIC8vIFRoaXMgd2lsbCByZWxlYXNlIGFueSBrZWVwVmlzaWJsZVJlY3RzIGlmIHRoZXkgd2Vy
ZSBzZXQuCisgICAgbV9wcml2YXRlLT5jbGVhclZpc2libGVSZWN0cygpOworCisgICAgLy8gVGhp
cyB3aWxsIGVuc3VyZSB0aGF0IHdlIHVucmVnaXN0ZXJlZCB0aGUgcGx1Z2luLgorICAgIGlmIChG
cmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkg
eworICAgICAgICBpZiAobV9wcml2YXRlLT5tX2lzQmFja2dyb3VuZFBsYXlpbmcpCisgICAgICAg
ICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPm9uUGx1
Z2luU3RvcEJhY2tncm91bmRQbGF5KHRoaXMsIG1fcHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVm
aXguY19zdHIoKSk7CisKKyAgICAgICAgLy8gSWYgd2Ugd2VyZSBzdGlsbCBmdWxsc2NyZWVuLCBl
bnN1cmUgd2Ugbm90aWZ5IGV2ZXJ5b25lIHdlJ3JlIG5vdC4KKyAgICAgICAgaWYgKG1fcHJpdmF0
ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAgICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+
cGxhdGZvcm1QYWdlQ2xpZW50KCktPmRpZFBsdWdpbkV4aXRGdWxsU2NyZWVuKHRoaXMsIG1fcHJp
dmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19zdHIoKSk7CisKKyAgICAgICAgaWYgKG1fcHJp
dmF0ZS0+bV9vcmllbnRhdGlvbkxvY2tlZCkKKyAgICAgICAgICAgIGZyYW1lVmlldy0+aG9zdFdp
bmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+dW5sb2NrT3JpZW50YXRpb24oKTsKKworICAg
ICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnJlZ2lz
dGVyUGx1Z2luKHRoaXMsIGZhbHNlIC8qc2hvdWxkUmVnaXN0ZXIqLyk7CisgICAgfQorCisgICAg
bV9wcml2YXRlLT5tX2lzQmFja2dyb3VuZFBsYXlpbmcgPSBmYWxzZTsKKyAgICBtX3ByaXZhdGUt
Pm1faXNGdWxsU2NyZWVuID0gZmFsc2U7CisKKyAgICBkZWxldGUgbV9wcml2YXRlOworICAgIG1f
cHJpdmF0ZSA9IDA7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFsdCgpCit7Cit9CisKK3ZvaWQg
UGx1Z2luVmlldzo6cmVzdGFydCgpCit7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6Z2V0V2luZG93
SW5mbyhWZWN0b3I8UGx1Z2luV2luZG93SW5mbz4mIHdpbmRvd0xpc3QpCit7CisgICAgaWYgKCFt
X3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0dmFsdWUpCisgICAgICAgIHJldHVybjsKKworICAg
IHZvaWQqIHZhbFB0ciA9IDA7CisKKyAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmll
dyh0aGlzKTsKKyAgICBKU0M6OkpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrcyhKU0M6
OlNpbGVuY2VBc3NlcnRpb25zT25seSk7CisgICAgc2V0Q2FsbGluZ1BsdWdpbih0cnVlKTsKKyAg
ICBtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0dmFsdWUobV9pbnN0YW5jZSwgTlBQVnBsdWdp
blNjcmVlbldpbmRvdywgJnZhbFB0cik7CisgICAgc2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7Cisg
ICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBsdWdpblZpZXcoMCk7CisKKyAgICBpZiAoIXZhbFB0
cikKKyAgICAgICAgcmV0dXJuOworCisgICAgTlBTY3JlZW5XaW5kb3dIYW5kbGVzKiBzY3JlZW5X
aW5IYW5kbGVzID0gc3RhdGljX2Nhc3Q8TlBTY3JlZW5XaW5kb3dIYW5kbGVzKj4odmFsUHRyKTsK
KworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NyZWVuV2luSGFuZGxlcy0+bnVtT2ZXaW5kb3dz
OyBpKyspIHsKKyAgICAgICAgUGx1Z2luV2luZG93SW5mbyBpbmZvOworICAgICAgICBpbmZvLndp
bmRvd1B0ciA9IHNjcmVlbldpbkhhbmRsZXMtPndpbmRvd0hhbmRsZXNbaV07CisKKyAgICAgICAg
TlBSZWN0KiByYyA9IHNjcmVlbldpbkhhbmRsZXMtPndpbmRvd1JlY3RzW2ldOworICAgICAgICBp
bmZvLndpbmRvd1JlY3QgPSBJbnRSZWN0KHJjLT5sZWZ0LCByYy0+dG9wLCByYy0+cmlnaHQgLSBy
Yy0+bGVmdCwgcmMtPmJvdHRvbSAtIHJjLT50b3ApOworCisgICAgICAgIHdpbmRvd0xpc3QuYXBw
ZW5kKGluZm8pOworICAgIH0KK30KKworQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpC
dWZmZXIqIFBsdWdpblZpZXc6OmxvY2tGcm9udEJ1ZmZlckZvclJlYWQoKSBjb25zdAoreworICAg
IGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBidWZmZXIgPSBtX3ByaXZhdGUtPmxvY2tSZWFkRnJv
bnRCdWZmZXJJbnRlcm5hbCgpOworCisgICAgaWYgKCFidWZmZXIpCisgICAgICAgIG1fcHJpdmF0
ZS0+dW5sb2NrUmVhZEZyb250QnVmZmVyKCk7CisKKyAgICByZXR1cm4gYnVmZmVyOworfQorCit2
b2lkIFBsdWdpblZpZXc6OnVubG9ja0Zyb250QnVmZmVyKCkgY29uc3QKK3sKKyAgICBpZiAoIW1f
cHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworICAgIG1fcHJpdmF0ZS0+dW5sb2NrUmVhZEZyb250
QnVmZmVyKCk7Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCitQbGF0Zm9y
bUxheWVyKiBQbHVnaW5WaWV3OjpwbGF0Zm9ybUxheWVyKCkgY29uc3QKK3sKKyAgICBpZiAoIW1f
cHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIG1fcHJpdmF0ZS0+bV9wbGF0
Zm9ybUxheWVyLmdldCgpOworfQorI2VuZGlmCisKK0ludFJlY3QgUGx1Z2luVmlldzo6ZW5zdXJl
VmlzaWJsZVJlY3QoKQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm4gSW50
UmVjdCgpOworICAgIHJldHVybiBtX3ByaXZhdGUtPm1fa2VlcFZpc2libGVSZWN0OworfQorCit2
b2lkIFBsdWdpblZpZXc6OnNldEJhY2tncm91bmRQbGF5KGJvb2wgdmFsdWUpCit7CisgICAgaWYg
KCFtX3ByaXZhdGUgfHwgbV9wcml2YXRlLT5tX2lzQmFja2dyb3VuZFBsYXlpbmcgPT0gdmFsdWUp
CisgICAgICAgIHJldHVybjsKKworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nh
c3Q8RnJhbWVWaWV3Kj4obV9wcml2YXRlLT5tX3ZpZXctPnBhcmVudCgpKTsKKyAgICBtX3ByaXZh
dGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZyA9IHZhbHVlOworICAgIGlmIChtX3ByaXZhdGUtPm1f
aXNCYWNrZ3JvdW5kUGxheWluZykKKyAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBs
YXRmb3JtUGFnZUNsaWVudCgpLT5vblBsdWdpblN0YXJ0QmFja2dyb3VuZFBsYXkodGhpcywgbV9w
cml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKKyAgICBlbHNlCisgICAgICAg
IGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+b25QbHVnaW5T
dG9wQmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5j
X3N0cigpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117311</attachid>
            <date>2011-11-30 19:15:30 -0800</date>
            <delta_ts>2011-11-30 22:58:33 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73397-20111201111605.patch</filename>
            <type>text/plain</type>
            <size>46172</size>
            <attacher name="Charles Wei">charles.wei</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwMTU4OSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBACisyMDExLTExLTMwICBXZWkgQ2hh
cmxlcyAgPGNoYXJsZXMud2VpQHRvcmNobW9iaWxlLmNvbS5jbj4KKworICAgICAgICBbQmxhY2tC
ZXJyeV0gVXBzdHJlYW0gQmxhY2tCZXJyeSBwb3J0aW5nIG9mIHBsdWdpblZpZXcKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczMzk3CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIGZvciBu
b3cuCisKKyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld0JsYWNrQmVycnku
Y3BwOiBBZGRlZC4KKwogMjAxMS0xMS0zMCAgTmF2ZWVuIEJvYmJpbGkgIDxxZ2hjMzZAbW90b3Jv
bGEuY29tPgogCiAgICAgICAgIHdpbmRvdy5nZXRNYXRjaGVkQ1NTUnVsZXMoKSBub3Qgc3VwcG9y
dGluZyBwc2V1ZG8gZWxlbWVudApJbmRleDogU291cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFja2Jl
cnJ5L1BsdWdpblZpZXdCbGFja0JlcnJ5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld0JsYWNrQmVycnkuY3BwCShyZXZpc2lvbiAw
KQorKysgU291cmNlL1dlYkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1BsdWdpblZpZXdCbGFja0Jl
cnJ5LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMzg3IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgMjAwOSBHaXJpc2ggUmFtYWtyaXNobmFuIDxnaXJpc2hAZm9yd2FyZGJpYXMu
aW4+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJQbHVnaW5WaWV3LmgiCisKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgorI2luY2x1ZGUg
IkVsZW1lbnQuaCIKKyNpbmNsdWRlICJFdmVudC5oIgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIK
KyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxQ
bHVnSW5FbGVtZW50LmgiCisjaW5jbHVkZSAiSG9zdFdpbmRvdy5oIgorI2luY2x1ZGUgIkltYWdl
LmgiCisjaW5jbHVkZSAiSlNET01CaW5kaW5nLmgiCisjaW5jbHVkZSAiS2V5Ym9hcmRFdmVudC5o
IgorI2luY2x1ZGUgIk1vdXNlRXZlbnQuaCIKKyNpbmNsdWRlICJOUENhbGxiYWNrc0JsYWNrQmVy
cnkuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNp
bmNsdWRlICJQbGF0Zm9ybUNvbnRleHRTa2lhLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1LZXlib2Fy
ZEV2ZW50LmgiCisjaW5jbHVkZSAiUGx1Z2luRGVidWcuaCIKKyNpbmNsdWRlICJQbHVnaW5NYWlu
VGhyZWFkU2NoZWR1bGVyLmgiCisjaW5jbHVkZSAiUGx1Z2luUGFja2FnZS5oIgorI2luY2x1ZGUg
IlBsdWdpblZpZXdQcml2YXRlQmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIlJlbmRlckxheWVyLmgi
CisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJUb3VjaC5oIgorI2luY2x1ZGUgIlRv
dWNoRXZlbnQuaCIKKyNpbmNsdWRlICJUb3VjaExpc3QuaCIKKyNpbmNsdWRlICJXaGVlbEV2ZW50
LmgiCisjaW5jbHVkZSAibnBydW50aW1lX2ltcGwuaCIKKyNpbmNsdWRlICJydW50aW1lX3Jvb3Qu
aCIKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1XaW5kb3cuaD4KKworI2lmIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKKyNpbmNsdWRlICJDaHJvbWUuaCIKKyNpbmNsdWRlICJDaHJv
bWVDbGllbnQuaCIKKyNpbmNsdWRlICJQbHVnaW5MYXllcldlYktpdFRocmVhZC5oIgorI2VuZGlm
CisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1HcmFwaGljcy5oPgorI2luY2x1ZGUgPEJs
YWNrQmVycnlQbGF0Zm9ybUludFJlY3RSZWdpb24uaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxh
dGZvcm1QcmltaXRpdmVzLmg+CisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8cnVu
dGltZS9KU0xvY2suaD4KKyNpbmNsdWRlIDxydW50aW1lL0pTVmFsdWUuaD4KKyNpbmNsdWRlIDxz
eXMva2V5Y29kZXMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNkZWZpbmUgVU5JTklUX0NPT1JE
IDB4ZmZmZmZmZmYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgTlBSZWN0IHRvTlBS
ZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgTlBSZWN0IG5wUmVjdDsKKyAgICBucFJl
Y3QudG9wID0gcmVjdC55KCk7CisgICAgbnBSZWN0LmxlZnQgPSByZWN0LngoKTsKKyAgICBucFJl
Y3QuYm90dG9tID0gcmVjdC55KCkgKyByZWN0LmhlaWdodCgpOworICAgIG5wUmVjdC5yaWdodCA9
IHJlY3QueCgpICsgcmVjdC53aWR0aCgpOworICAgIHJldHVybiBucFJlY3Q7Cit9CisKK3N0YXRp
YyBOUFJlY3QgdG9OUFJlY3QoY29uc3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3QmIHJl
Y3QpCit7CisgICAgTlBSZWN0IG5wUmVjdDsKKyAgICBucFJlY3QudG9wID0gcmVjdC55KCk7Cisg
ICAgbnBSZWN0LmxlZnQgPSByZWN0LngoKTsKKyAgICBucFJlY3QuYm90dG9tID0gcmVjdC55KCkg
KyByZWN0LmhlaWdodCgpOworICAgIG5wUmVjdC5yaWdodCA9IHJlY3QueCgpICsgcmVjdC53aWR0
aCgpOworICAgIHJldHVybiBucFJlY3Q7Cit9CisKKworLy8gU3RhbmRhcmQgcGx1Z2luIHdpZGdl
dCBzdHVmZi4KKwordXNpbmcgSlNDOjpFeGVjU3RhdGU7Cit1c2luZyBKU0M6OkludGVycHJldGVy
OwordXNpbmcgSlNDOjpKU0xvY2s7Cit1c2luZyBKU0M6OkpTT2JqZWN0OwordXNpbmcgSlNDOjpV
U3RyaW5nOworCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIFdURjsKK3Vz
aW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CisKK3ZvaWQgUGx1Z2luVmlldzo6dXBkYXRlUGx1Z2lu
V2lkZ2V0KCkKK3sKKyAgICBpZiAoIXBhcmVudCgpIHx8ICFtX3ByaXZhdGUpCisgICAgICAgIHJl
dHVybjsKKworICAgIEFTU0VSVChwYXJlbnQoKS0+aXNGcmFtZVZpZXcoKSk7CisgICAgRnJhbWVW
aWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7CisKKyAg
ICBJbnRSZWN0IG9sZFdpbmRvd1JlY3QgPSBtX3dpbmRvd1JlY3Q7CisgICAgSW50UmVjdCBvbGRD
bGlwUmVjdCA9IG1fY2xpcFJlY3Q7CisKKyAgICBtX3dpbmRvd1JlY3QgPSBJbnRSZWN0KGZyYW1l
Vmlldy0+Y29udGVudHNUb1dpbmRvdyhmcmFtZVJlY3QoKS5sb2NhdGlvbigpKSwgZnJhbWVSZWN0
KCkuc2l6ZSgpKTsKKworICAgIC8vIE1hcCByZWN0IHRvIGNvbnRlbnQgY29vcmRpbmF0ZSBzcGFj
ZSBvZiBtYWluIGZyYW1lLgorICAgIG1fd2luZG93UmVjdC5tb3ZlKHJvb3QoKS0+c2Nyb2xsT2Zm
c2V0KCkpOworCisgICAgbV9jbGlwUmVjdCA9IGNhbGN1bGF0ZUNsaXBSZWN0KCk7CisgICAgSW50
UmVjdCBmID0gZnJhbWVSZWN0KCk7CisKKyAgICAvLyBOb3RpZnkgdGhlIHBsdWdpbiBpZiBpdCBt
YXkgb3IgbWF5IG5vdCBiZSBvbi9vZmZzY3JlZW4uCisgICAgaGFuZGxlU2Nyb2xsRXZlbnQoKTsK
KworICAgIGJvb2wgem9vbUZhY3RvckNoYW5nZWQgPSAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1
Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21GYWN0b3IKKyAgICAgICAgIT0gZnJhbWVWaWV3
LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5jdXJyZW50Wm9vbUZhY3Rvcigp
OworCisgICAgaWYgKCF6b29tRmFjdG9yQ2hhbmdlZCAmJiBtX3dpbmRvd1JlY3QgPT0gb2xkV2lu
ZG93UmVjdCAmJiBtX2NsaXBSZWN0ID09IG9sZENsaXBSZWN0KQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBkbyBub3QgY2FsbCBzZXROUFdpbmRvd0lmTmVlZGVkIGltbWVkaWF0ZWx5LCB3aWxs
IGJlIGNhbGxlZCBvbiBwYWludCgpCisgICAgbV9wcml2YXRlLT5tX2hhc1BlbmRpbmdHZW9tZXRy
eUNoYW5nZSA9IHRydWU7CisKKyAgICAvLyAoaSkgaW4gb3JkZXIgdG8gbW92ZS9yZXNpemUgdGhl
IHBsdWdpbiB3aW5kb3cgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUKKyAgICAvLyByZXN0IG9mIGZy
YW1lIGR1cmluZyBlLmcuIHNjcm9sbGluZywgd2Ugc2V0IHRoZSB3aW5kb3cgZ2VvbWV0cnkKKyAg
ICAvLyBpbiB0aGUgcGFpbnQoKSBmdW5jdGlvbiwgYnV0IGFzIHBhaW50KCkgaXNuJ3QgY2FsbGVk
IHdoZW4gdGhlCisgICAgLy8gcGx1Z2luIHdpbmRvdyBpcyBvdXRzaWRlIHRoZSBmcmFtZSB3aGlj
aCBjYW4gYmUgY2F1c2VkIGJ5IGEKKyAgICAvLyBzY3JvbGwsIHdlIG5lZWQgdG8gbW92ZS9yZXNp
emUgaW1tZWRpYXRlbHkuCisgICAgLy8gKGlpKSBpZiB3ZSBhcmUgcnVubmluZyBsYXlvdXQgdGVz
dHMgZnJvbSBEUlQsIHBhaW50KCkgd29uJ3QgZXZlciBnZXQgY2FsbGVkCisgICAgLy8gc28gd2Ug
bmVlZCB0byBjYWxsIHNldE5QV2luZG93SWZOZWVkZWQoKSBpZiB3aW5kb3cgZ2VvbWV0cnkgaGFz
IGNoYW5nZWQKKyAgICBpZiAobV9jbGlwUmVjdC5pc0VtcHR5KCkgfHwgKHBsYXRmb3JtUGx1Z2lu
V2lkZ2V0KCkgJiYgKG1fd2luZG93UmVjdCAhPSBvbGRXaW5kb3dSZWN0IHx8IG1fY2xpcFJlY3Qg
IT0gb2xkQ2xpcFJlY3QgfHwgem9vbUZhY3RvckNoYW5nZWQpKSkKKyAgICAgICAgc2V0TlBXaW5k
b3dJZk5lZWRlZCgpOworCisgICAgLy8gTWFrZSBzdXJlIHdlIGdldCByZXBhaW50ZWQgYWZ0ZXJ3
YXJkcy4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGRvd253YXJkCisgICAgLy8gc2Nyb2xsaW5nIHRv
IG1vdmUgdGhlIHBsdWdpbiB3aWRnZXQgcHJvcGVybHkuCisgICAgaW52YWxpZGF0ZSgpOworfQor
Cit2b2lkIFBsdWdpblZpZXc6OnNldEZvY3VzKGJvb2wgZm9jdXNlZCkKK3sKKyAgICBpZiAoIW1f
cHJpdmF0ZSB8fCBtX3ByaXZhdGUtPm1faXNGb2N1c2VkID09IGZvY3VzZWQpCisgICAgICAgIHJl
dHVybjsKKworICAgIEFTU0VSVChwbGF0Zm9ybVBsdWdpbldpZGdldCgpID09IHBsYXRmb3JtV2lk
Z2V0KCkpOworICAgIFdpZGdldDo6c2V0Rm9jdXMoZm9jdXNlZCk7CisKKyAgICBpZiAoZm9jdXNl
ZCkKKyAgICAgICAgaGFuZGxlRm9jdXNJbkV2ZW50KCk7CisgICAgZWxzZQorICAgICAgICBoYW5k
bGVGb2N1c091dEV2ZW50KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2hvdygpCit7CisgICAg
c2V0U2VsZlZpc2libGUodHJ1ZSk7CisgICAgV2lkZ2V0OjpzaG93KCk7CisgICAgdXBkYXRlUGx1
Z2luV2lkZ2V0KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGlkZSgpCit7CisgICAgc2V0U2Vs
ZlZpc2libGUoZmFsc2UpOworICAgIFdpZGdldDo6aGlkZSgpOworICAgIHVwZGF0ZVBsdWdpbldp
ZGdldCgpOworfQorCit2b2lkIFBsdWdpblZpZXc6OnVwZGF0ZUJ1ZmZlcihjb25zdCBJbnRSZWN0
JiBidWZmZXJSZWN0KQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBVcGRhdGUgdGhlIHpvb20gZmFjdG9yIGhlcmUsIGl0IGhhcHBlbnMgcmlnaHQgYmVm
b3JlIHNldE5QV2luZG93SWZOZWVkZWQKKyAgICAvLyBlbnN1cmluZyB0aGF0IHRoZSBwbHVnaW4g
aGFzIGV2ZXJ5IG9wcG9ydHVuaXR5IHRvIGdldCB0aGUgem9vbSBmYWN0b3IgYmVmb3JlCisgICAg
Ly8gaXQgcGFpbnRzIGFueXRoaW5nLgorICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0
YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkKKyAgICAgICAgbV9wcml2YXRlLT5zZXRa
b29tRmFjdG9yKGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+
Y3VycmVudFpvb21GYWN0b3IoKSk7CisKKyAgICBzZXROUFdpbmRvd0lmTmVlZGVkKCk7CisKKyAg
ICAvLyBCdWlsZCBhbmQgZGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsdWdpbiB0byBub3RpZnkg
aXQgd2UgYXJlIGFib3V0IHRvIGRyYXcgd2hhdGV2ZXIKKyAgICAvLyBpcyBpbiB0aGUgZnJvbnQg
YnVmZmVyLiBUaGlzIGlzIGl0J3Mgb3Bwb3J0dW5pdHkgdG8gZG8gYSBzd2FwLgorICAgIEludFJl
Y3QgZXhwb3NlZFJlY3QoYnVmZmVyUmVjdCk7CisgICAgZXhwb3NlZFJlY3QuaW50ZXJzZWN0KElu
dFJlY3QoSW50UG9pbnQoMCwgMCksIGZyYW1lUmVjdCgpLnNpemUoKSkpOworCisgICAgLy8gT25s
eSBhc2sgdGhlIHBsdWdpbiB0byBkcmF3IGlmIHRoZSBleHBvc2VkIHJlY3Qgd2FzIGV4cGxpY2l0
bHkgaW52YWxpZGF0ZWQKKyAgICAvLyBieSB0aGUgcGx1Z2luLgorICAgIEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpJbnRSZWN0UmVnaW9uIGV4cG9zZWRSZWdpb24gPSBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6SW50UmVjdFJlZ2lvbjo6aW50ZXJzZWN0UmVnaW9ucyhtX3ByaXZhdGUtPm1faW52YWxpZGF0
ZVJlZ2lvbiwgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3QoZXhwb3NlZFJlY3QpKTsKKyAg
ICBpZiAoIWV4cG9zZWRSZWdpb24uaXNFbXB0eSgpKSB7CisgICAgICAgIG1fcHJpdmF0ZS0+bV9p
bnZhbGlkYXRlUmVnaW9uID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb246OnN1
YnRyYWN0UmVnaW9ucyhtX3ByaXZhdGUtPm1faW52YWxpZGF0ZVJlZ2lvbiwgZXhwb3NlZFJlZ2lv
bik7CisgICAgICAgIHN0ZDo6dmVjdG9yPEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0PiBl
eHBvc2VkUmVjdHMgPSBleHBvc2VkUmVnaW9uLnJlY3RzKCk7CisgICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBleHBvc2VkUmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIE5Q
RHJhd0V2ZW50IGRyYXc7CisgICAgICAgICAgICBkcmF3LnBsdWdpblJlY3QgPSB0b05QUmVjdCht
X3dpbmRvd1JlY3QpOworICAgICAgICAgICAgZHJhdy5jbGlwUmVjdCA9IHRvTlBSZWN0KG1fY2xp
cFJlY3QpOworICAgICAgICAgICAgZHJhdy5kcmF3UmVjdCA9IChOUFJlY3QqKWFsbG9jYShzaXpl
b2YoTlBSZWN0KSk7CisgICAgICAgICAgICBkcmF3LmRyYXdSZWN0Q291bnQgPSAxOworICAgICAg
ICAgICAgKmRyYXcuZHJhd1JlY3QgPSB0b05QUmVjdChleHBvc2VkUmVjdHMuYXQoaSkpOworICAg
ICAgICAgICAgZHJhdy56b29tRmFjdG9yID0gKChOUFNldFdpbmRvd0NhbGxiYWNrU3RydWN0Kilt
X25wV2luZG93LndzX2luZm8pLT56b29tRmFjdG9yOworCisgICAgICAgICAgICBOUEV2ZW50IG5w
RXZlbnQ7CisgICAgICAgICAgICBucEV2ZW50LnR5cGUgPSBOUF9EcmF3RXZlbnQ7CisgICAgICAg
ICAgICBucEV2ZW50LmRhdGEgPSAmZHJhdzsKKworICAgICAgICAgICAgLy8gRklYTUU6IFJldHVy
biBlYXJseSBpZiB0aGlzIGZhaWxzPyBPciBqdXN0IHJlcGFpbnQ/CisgICAgICAgICAgICBkaXNw
YXRjaE5QRXZlbnQobnBFdmVudCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUGx1Z2lu
Vmlldzo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0
KQoreworICAgIGlmICghbV9wcml2YXRlIHx8ICFtX2lzU3RhcnRlZCkgeworICAgICAgICBwYWlu
dE1pc3NpbmdQbHVnaW5JY29uKGNvbnRleHQsIHJlY3QpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgLy8gVXBkYXRlIHRoZSB6b29tIGZhY3RvciBoZXJlLCBpdCBoYXBwZW5zIHJpZ2h0
IGJlZm9yZSBzZXROUFdpbmRvd0lmTmVlZGVkCisgICAgLy8gZW5zdXJpbmcgdGhhdCB0aGUgcGx1
Z2luIGhhcyBldmVyeSBvcHBvcnR1bml0eSB0byBnZXQgdGhlIHpvb20gZmFjdG9yIGJlZm9yZQor
ICAgIC8vIGl0IHBhaW50cyBhbnl0aGluZy4KKyAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcg
PSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSkpCisgICAgICAgIG1fcHJpdmF0ZS0+
c2V0Wm9vbUZhY3RvcihmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50
KCktPmN1cnJlbnRab29tRmFjdG9yKCkpOworCisgICAgaWYgKGNvbnRleHQtPnBhaW50aW5nRGlz
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2V0TlBXaW5kb3dJZk5lZWRlZCgpOwor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmIChtX3ByaXZhdGUtPm1f
cGxhdGZvcm1MYXllcikKKyAgICAgICAgcmV0dXJuOworI2VuZGlmCisKKyAgICAvLyBCdWlsZCBh
bmQgZGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsdWdpbiB0byBub3RpZnkgaXQgd2UgYXJlIGFi
b3V0IHRvIGRyYXcgd2hhdGV2ZXIKKyAgICAvLyBpcyBpbiB0aGUgZnJvbnQgYnVmZmVyLiBUaGlz
IGlzIGl0J3Mgb3Bwb3J0dW5pdHkgdG8gZG8gYSBzd2FwLgorICAgIEludFJlY3QgcmVjdENsaXAo
cmVjdCk7CisgICAgcmVjdENsaXAuaW50ZXJzZWN0KGZyYW1lUmVjdCgpKTsKKworICAgIEludFJl
Y3QgZXhwb3NlZFJlY3QocmVjdENsaXApOworICAgIGV4cG9zZWRSZWN0Lm1vdmUoLWZyYW1lUmVj
dCgpLngoKSwgLWZyYW1lUmVjdCgpLnkoKSk7CisKKyAgICB1cGRhdGVCdWZmZXIoZXhwb3NlZFJl
Y3QpOworCisgICAgUHRocmVhZFJlYWRMb2NrZXIgZnJvbnRMb2NrKCZtX3ByaXZhdGUtPm1fZnJv
bnRCdWZmZXJSd0xvY2spOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpC
dWZmZXIqIGZyb250QnVmZmVyID0KKyAgICAgICAgbV9wcml2YXRlLT5tX3BsdWdpbkJ1ZmZlcnNb
bV9wcml2YXRlLT5tX3BsdWdpbkZyb250QnVmZmVyXTsKKworICAgIC8vIERvbid0IHBhaW50IGFu
eXRoaW5nIGlmIHRoZXJlIGlzIG5vIGJ1ZmZlci4KKyAgICBpZiAoIWZyb250QnVmZmVyKQorICAg
ICAgICByZXR1cm47CisKKyAgICBjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OkJhY2tpbmdJbWFnZSogYmFja2luZ0ltYWdlID0KKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkdyYXBoaWNzOjpsb2NrQnVmZmVyQmFja2luZ0ltYWdlKGZyb250QnVmZmVyLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpSZWFkQWNjZXNzKTsKKyAgICBpZiAoIWJhY2tp
bmdJbWFnZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRHJhdyB0aGUgY2hhbmdlZCBidWZm
ZXIgY29udGVudHMgdG8gdGhlIHNjcmVlbi4KKyAgICBjb250ZXh0LT5zYXZlKCk7CisKKyNpZiBV
U0UoU0tJQSkKKyAgICBjb25zdCBTa0JpdG1hcCYgcGx1Z2luSW1hZ2UgPSAqYmFja2luZ0ltYWdl
OworICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBncmFwaGljcyA9IGNvbnRleHQtPnBsYXRm
b3JtQ29udGV4dCgpOworICAgIEFTU0VSVChncmFwaGljcyk7CisgICAgU2tDYW52YXMqIGNhbnZh
cyA9IGdyYXBoaWNzLT5jYW52YXMoKTsKKworICAgIC8vIFNvdXJjZSByZWN0YW5nbGUgd2Ugd2ls
bCBkcmF3IHRvIHRoZSBzY3JlZW4uCisgICAgU2tJUmVjdCBza1NyY1JlY3Q7CisgICAgc2tTcmNS
ZWN0LnNldChleHBvc2VkUmVjdC54KCksIGV4cG9zZWRSZWN0LnkoKSwKKyAgICAgICAgICAgICAg
ICAgIGV4cG9zZWRSZWN0LngoKSArIGV4cG9zZWRSZWN0LndpZHRoKCksCisgICAgICAgICAgICAg
ICAgICBleHBvc2VkUmVjdC55KCkgKyBleHBvc2VkUmVjdC5oZWlnaHQoKSk7CisKKyAgICAvLyBQ
cmVwYXJlIHRoZSBob2xlIHB1bmNoIHJlY3RhbmdsZS4KKyAgICBTa0lSZWN0IHVuY2xpcHBlZEhv
bGVQdW5jaFJlY3Q7CisgICAgdW5jbGlwcGVkSG9sZVB1bmNoUmVjdC5zZXQobV9wcml2YXRlLT5t
X2hvbGVQdW5jaFJlY3QueCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJp
dmF0ZS0+bV9ob2xlUHVuY2hSZWN0LnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC54KCkgKyBtX3ByaXZhdGUtPm1faG9sZVB1bmNo
UmVjdC53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJpdmF0ZS0+
bV9ob2xlUHVuY2hSZWN0LnkoKSArIG1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LmhlaWdodCgp
KTsKKworICAgIC8vIGhvbGVQdW5jaFJlY3QgaXMgY2xpcHBlZC4KKyAgICBTa0lSZWN0IGhvbGVQ
dW5jaFJlY3Q7CisKKyAgICAvLyBBbGwgc291cmNlIHJlY3RhbmdsZXMgYXJlIHNjYWxlZCBieSB0
aGUgem9vbSBmYWN0b3IgYmVjYXVzZSB0aGUgc291cmNlIGJpdG1hcCBtYXkgYmUgYQorICAgIC8v
IGhpZ2hlciByZXNvbHV0aW9uIHRoYW4gdGhlIDE6MSBwYWdlLiBUaGlzIGFsbG93cyB0aGUgZmxh
c2ggcGxheWVyIHRvIHNjYWxlIHRoZSBjb250ZW50CisgICAgLy8gaXQgaXMgZHJhd2luZyB0byBt
YXRjaCB0aGUgc2NhbGUgb2YgdGhlIHBhZ2UuCisgICAgZG91YmxlIHpvb21GYWN0b3JIID0gKGRv
dWJsZSltX3ByaXZhdGUtPm1fcGx1Z2luQnVmZmVyU2l6ZS53aWR0aCgpIC8gKGRvdWJsZSlmcmFt
ZVJlY3QoKS53aWR0aCgpOworICAgIGRvdWJsZSB6b29tRmFjdG9yVyA9IChkb3VibGUpbV9wcml2
YXRlLT5tX3BsdWdpbkJ1ZmZlclNpemUuaGVpZ2h0KCkgLyAoZG91YmxlKWZyYW1lUmVjdCgpLmhl
aWdodCgpOworICAgIGRvdWJsZSB6b29tRmFjdG9yID0gKHpvb21GYWN0b3JIICsgem9vbUZhY3Rv
clcpIC8gMi4wOworCisgICAgLy8gVGhpcyBtZXRob2QgZHJhd3MgYSBob2xlIGlmIHNwZWNpZmll
ZC4KKyAgICBpZiAoIW1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LmlzRW1wdHkoKQorICAgICAg
ICAmJiBob2xlUHVuY2hSZWN0LmludGVyc2VjdCh1bmNsaXBwZWRIb2xlUHVuY2hSZWN0LCBza1Ny
Y1JlY3QpKSB7CisKKyAgICAgICAgLy8gRHJhdyB0aGUgdG9wIGNodW5rIGlmIG5lZWRlZC4KKyAg
ICAgICAgaWYgKGhvbGVQdW5jaFJlY3QuZlRvcCA+IHNrU3JjUmVjdC5mVG9wKSB7CisgICAgICAg
ICAgICBTa0lSZWN0IHNyY1JlY3Q7CisgICAgICAgICAgICBzcmNSZWN0LnNldChza1NyY1JlY3Qu
ZkxlZnQgKiB6b29tRmFjdG9yLCBza1NyY1JlY3QuZlRvcCAqIHpvb21GYWN0b3IsCisgICAgICAg
ICAgICAgICAgICAgICAgICBza1NyY1JlY3QuZlJpZ2h0ICogem9vbUZhY3RvciwgaG9sZVB1bmNo
UmVjdC5mVG9wICogem9vbUZhY3Rvcik7CisKKyAgICAgICAgICAgIFNrUmVjdCBkc3RSZWN0Owor
ICAgICAgICAgICAgZHN0UmVjdC5zZXQoc2tTcmNSZWN0LmZMZWZ0LCBza1NyY1JlY3QuZlRvcCwK
KyAgICAgICAgICAgICAgICAgICAgICAgIHNrU3JjUmVjdC5mUmlnaHQsIGhvbGVQdW5jaFJlY3Qu
ZlRvcCk7CisgICAgICAgICAgICBkc3RSZWN0Lm9mZnNldChmcmFtZVJlY3QoKS54KCksIGZyYW1l
UmVjdCgpLnkoKSk7CisKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd0JpdG1hcFJlY3QocGx1Z2lu
SW1hZ2UsICZzcmNSZWN0LCBkc3RSZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERyYXcg
dGhlIGxlZnQgY2h1bmsgaWYgbmVlZGVkLgorICAgICAgICBpZiAoaG9sZVB1bmNoUmVjdC5mTGVm
dCA+IHNrU3JjUmVjdC5mTGVmdCkgeworICAgICAgICAgICAgU2tJUmVjdCBzcmNSZWN0OworICAg
ICAgICAgICAgc3JjUmVjdC5zZXQoc2tTcmNSZWN0LmZMZWZ0ICogem9vbUZhY3RvciwgaG9sZVB1
bmNoUmVjdC5mVG9wICogem9vbUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvbGVQ
dW5jaFJlY3QuZkxlZnQgKiB6b29tRmFjdG9yLCBob2xlUHVuY2hSZWN0LmZCb3R0b20gKiB6b29t
RmFjdG9yKTsKKworICAgICAgICAgICAgU2tSZWN0IGRzdFJlY3Q7CisgICAgICAgICAgICBkc3RS
ZWN0LnNldChza1NyY1JlY3QuZkxlZnQsIGhvbGVQdW5jaFJlY3QuZlRvcCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGhvbGVQdW5jaFJlY3QuZkxlZnQsIGhvbGVQdW5jaFJlY3QuZkJvdHRvbSk7
CisgICAgICAgICAgICBkc3RSZWN0Lm9mZnNldChmcmFtZVJlY3QoKS54KCksIGZyYW1lUmVjdCgp
LnkoKSk7CisKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd0JpdG1hcFJlY3QocGx1Z2luSW1hZ2Us
ICZzcmNSZWN0LCBkc3RSZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERyYXcgdGhlIGhv
bGUgY2h1bmsuCisgICAgICAgIHsKKyAgICAgICAgICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgICAg
ICAgICBwYWludC5zZXRYZmVybW9kZU1vZGUoU2tYZmVybW9kZTo6a1NyY19Nb2RlKTsKKworICAg
ICAgICAgICAgU2tJUmVjdCBzcmNSZWN0OworICAgICAgICAgICAgc3JjUmVjdC5zZXQoaG9sZVB1
bmNoUmVjdC5mTGVmdCAqIHpvb21GYWN0b3IsIGhvbGVQdW5jaFJlY3QuZlRvcCAqIHpvb21GYWN0
b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBob2xlUHVuY2hSZWN0LmZSaWdodCAqIHpvb21G
YWN0b3IsIGhvbGVQdW5jaFJlY3QuZkJvdHRvbSAqIHpvb21GYWN0b3IpOworCisgICAgICAgICAg
ICBTa1JlY3QgZHN0UmVjdDsKKyAgICAgICAgICAgIGRzdFJlY3Quc2V0KGhvbGVQdW5jaFJlY3Qu
ZkxlZnQsIGhvbGVQdW5jaFJlY3QuZlRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvbGVQ
dW5jaFJlY3QuZlJpZ2h0LCBob2xlUHVuY2hSZWN0LmZCb3R0b20pOworICAgICAgICAgICAgZHN0
UmVjdC5vZmZzZXQoZnJhbWVSZWN0KCkueCgpLCBmcmFtZVJlY3QoKS55KCkpOworCisgICAgICAg
ICAgICBjYW52YXMtPmRyYXdCaXRtYXBSZWN0KHBsdWdpbkltYWdlLCAmc3JjUmVjdCwgZHN0UmVj
dCwgJnBhaW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERyYXcgdGhlIHJpZ2h0IGNodW5r
IGlmIG5lZWRlZC4KKyAgICAgICAgaWYgKGhvbGVQdW5jaFJlY3QuZlJpZ2h0IDwgc2tTcmNSZWN0
LmZSaWdodCkgeworICAgICAgICAgICAgU2tJUmVjdCBzcmNSZWN0OworICAgICAgICAgICAgc3Jj
UmVjdC5zZXQoaG9sZVB1bmNoUmVjdC5mUmlnaHQgKiB6b29tRmFjdG9yLCBob2xlUHVuY2hSZWN0
LmZUb3AgKiB6b29tRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgc2tTcmNSZWN0LmZS
aWdodCAqIHpvb21GYWN0b3IsIGhvbGVQdW5jaFJlY3QuZkJvdHRvbSAqIHpvb21GYWN0b3IpOwor
CisgICAgICAgICAgICBTa1JlY3QgZHN0UmVjdDsKKyAgICAgICAgICAgIGRzdFJlY3Quc2V0KGhv
bGVQdW5jaFJlY3QuZlJpZ2h0LCBob2xlUHVuY2hSZWN0LmZUb3AsCisgICAgICAgICAgICAgICAg
ICAgICAgICBza1NyY1JlY3QuZlJpZ2h0LCBob2xlUHVuY2hSZWN0LmZCb3R0b20pOworICAgICAg
ICAgICAgZHN0UmVjdC5vZmZzZXQoZnJhbWVSZWN0KCkueCgpLCBmcmFtZVJlY3QoKS55KCkpOwor
CisgICAgICAgICAgICBjYW52YXMtPmRyYXdCaXRtYXBSZWN0KHBsdWdpbkltYWdlLCAmc3JjUmVj
dCwgZHN0UmVjdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEcmF3IHRoZSBib3R0b20gY2h1
bmsgaWYgbmVlZGVkLgorICAgICAgICBpZiAoaG9sZVB1bmNoUmVjdC5mQm90dG9tIDwgc2tTcmNS
ZWN0LmZCb3R0b20pIHsKKyAgICAgICAgICAgIFNrSVJlY3Qgc3JjUmVjdDsKKyAgICAgICAgICAg
IHNyY1JlY3Quc2V0KHNrU3JjUmVjdC5mTGVmdCAqIHpvb21GYWN0b3IsIGhvbGVQdW5jaFJlY3Qu
ZkJvdHRvbSAqIHpvb21GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBza1NyY1JlY3Qu
ZlJpZ2h0ICogem9vbUZhY3Rvciwgc2tTcmNSZWN0LmZCb3R0b20gKiB6b29tRmFjdG9yKTsKKwor
ICAgICAgICAgICAgU2tSZWN0IGRzdFJlY3Q7CisgICAgICAgICAgICBkc3RSZWN0LnNldChza1Ny
Y1JlY3QuZkxlZnQsIGhvbGVQdW5jaFJlY3QuZkJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHNrU3JjUmVjdC5mUmlnaHQsIHNrU3JjUmVjdC5mQm90dG9tKTsKKyAgICAgICAgICAgIGRz
dFJlY3Qub2Zmc2V0KGZyYW1lUmVjdCgpLngoKSwgZnJhbWVSZWN0KCkueSgpKTsKKworICAgICAg
ICAgICAgY2FudmFzLT5kcmF3Qml0bWFwUmVjdChwbHVnaW5JbWFnZSwgJnNyY1JlY3QsIGRzdFJl
Y3QpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2tJUmVjdCBzcmNSZWN0Owor
ICAgICAgICBzcmNSZWN0LnNldChza1NyY1JlY3QuZkxlZnQgKiB6b29tRmFjdG9yLCBza1NyY1Jl
Y3QuZlRvcCAqIHpvb21GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgIHNrU3JjUmVjdC5mUmln
aHQgKiB6b29tRmFjdG9yLCBza1NyY1JlY3QuZkJvdHRvbSAqIHpvb21GYWN0b3IpOworCisgICAg
ICAgIC8vIENhbGN1bGF0ZSB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlLgorICAgICAgICBTa1Jl
Y3QgZHN0UmVjdDsKKyAgICAgICAgZHN0UmVjdC5zZXQocmVjdENsaXAueCgpLCByZWN0Q2xpcC55
KCksCisgICAgICAgICAgICAgICAgICAgIHJlY3RDbGlwLngoKSArIHJlY3RDbGlwLndpZHRoKCks
CisgICAgICAgICAgICAgICAgICAgIHJlY3RDbGlwLnkoKSArIHJlY3RDbGlwLmhlaWdodCgpKTsK
KworICAgICAgICAvLyBEb24ndCBwdW5jaCBhIGhvbGUuCisgICAgICAgIGNhbnZhcy0+ZHJhd0Jp
dG1hcFJlY3QocGx1Z2luSW1hZ2UsICZzcmNSZWN0LCBkc3RSZWN0KTsKKyAgICB9CisjZWxzZQor
I3dhcm5pbmcgIkltcGxlbWVudCBtZSEiCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisjZW5k
aWYKKworICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpHcmFwaGljczo6cmVsZWFzZUJ1ZmZlckJhY2tpbmdJbWFnZShmcm9udEJ1ZmZlcik7Cit9CisK
KworYm9vbCBQbHVnaW5WaWV3OjpkaXNwYXRjaEZ1bGxTY3JlZW5OUEV2ZW50KE5QRXZlbnQmIGV2
ZW50KQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBBU1NFUlQobV9wcml2YXRlLT5tX2lzRnVsbFNjcmVlbik7CisgICAgcmV0dXJuIGRpc3BhdGNo
TlBFdmVudChldmVudCk7Cit9CisKKy8vIEZJWE1FOiBVbmlmeSBhY3Jvc3MgcG9ydHMuCitib29s
IFBsdWdpblZpZXc6OmRpc3BhdGNoTlBFdmVudChOUEV2ZW50JiBldmVudCkKK3sKKyAgICAvLyBz
YW5pdHkgY2hlY2suCisgICAgaWYgKCFtX3BsdWdpbiB8fCAhbV9wbHVnaW4tPnBsdWdpbkZ1bmNz
KCktPmV2ZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBQbHVnaW5WaWV3OjpzZXRD
dXJyZW50UGx1Z2luVmlldyh0aGlzKTsKKyAgICBKU0M6OkpTTG9jazo6RHJvcEFsbExvY2tzIGRy
b3BBbGxMb2NrcyhKU0M6OlNpbGVuY2VBc3NlcnRpb25zT25seSk7CisgICAgc2V0Q2FsbGluZ1Bs
dWdpbih0cnVlKTsKKworICAgIGJvb2wgYWNjZXB0ZWQgPSBtX3BsdWdpbi0+cGx1Z2luRnVuY3Mo
KS0+ZXZlbnQobV9pbnN0YW5jZSwgJmV2ZW50KTsKKworICAgIHNldENhbGxpbmdQbHVnaW4oZmFs
c2UpOworICAgIFBsdWdpblZpZXc6OnNldEN1cnJlbnRQbHVnaW5WaWV3KDApOworCisgICAgcmV0
dXJuIGFjY2VwdGVkOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUtleWJvYXJkRXZlbnQo
S2V5Ym9hcmRFdmVudCogZXZlbnQpCit7CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIE5QS2V5
Ym9hcmRFdmVudCBrZXlFdmVudDsKKyAgICBjb25zdCBQbGF0Zm9ybUtleWJvYXJkRXZlbnQgKnBs
YXRmb3JtS2V5RXZlbnQgPSBldmVudC0+a2V5RXZlbnQoKTsKKworICAgIGtleUV2ZW50Lm1vZGlm
aWVycyA9IDA7CisKKyAgICBpZiAocGxhdGZvcm1LZXlFdmVudC0+c2hpZnRLZXkoKSkKKyAgICAg
ICAga2V5RXZlbnQubW9kaWZpZXJzIHw9IEtFWU1PRF9TSElGVDsKKworICAgIGlmIChwbGF0Zm9y
bUtleUV2ZW50LT5jdHJsS2V5KCkpCisgICAgICAgIGtleUV2ZW50Lm1vZGlmaWVycyB8PSBLRVlN
T0RfQ1RSTDsKKworICAgIGlmIChwbGF0Zm9ybUtleUV2ZW50LT5hbHRLZXkoKSkKKyAgICAgICAg
a2V5RXZlbnQubW9kaWZpZXJzIHw9IEtFWU1PRF9BTFQ7CisKKyAgICBpZiAocGxhdGZvcm1LZXlF
dmVudC0+bWV0YUtleSgpKQorICAgICAgICBrZXlFdmVudC5tb2RpZmllcnMgfD0gS0VZTU9EX0FM
VEdSOworCisgICAga2V5RXZlbnQuY2FwID0gcGxhdGZvcm1LZXlFdmVudC0+dW5tb2RpZmllZENo
YXJhY3RlcigpOworICAgIGtleUV2ZW50LnN5bSA9IGtleUV2ZW50LmNhcDsKKyAgICBrZXlFdmVu
dC5zY2FuID0gMDsKKyAgICBrZXlFdmVudC5mbGFncyA9IDA7CisKKyAgICBpZiAocGxhdGZvcm1L
ZXlFdmVudC0+dHlwZSgpID09IFBsYXRmb3JtS2V5Ym9hcmRFdmVudDo6UmF3S2V5RG93bgorICAg
ICAgICAgICAgfHwgcGxhdGZvcm1LZXlFdmVudC0+dHlwZSgpID09IFBsYXRmb3JtS2V5Ym9hcmRF
dmVudDo6S2V5RG93bikgeworICAgICAgICBrZXlFdmVudC5mbGFncyA9IEtFWV9ET1dOIHwgS0VZ
X1NZTV9WQUxJRCB8IEtFWV9DQVBfVkFMSUQ7CisgICAgfSBlbHNlIGlmIChwbGF0Zm9ybUtleUV2
ZW50LT50eXBlKCkgPT0gUGxhdGZvcm1LZXlib2FyZEV2ZW50OjpLZXlVcCkKKyAgICAgICAga2V5
RXZlbnQuZmxhZ3MgPSBLRVlfU1lNX1ZBTElEIHwgS0VZX0NBUF9WQUxJRDsKKworICAgIG5wRXZl
bnQudHlwZSA9IE5QX0tleUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICZrZXlFdmVudDsKKyAg
ICBpZiAoZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpKQorICAgICAgICBldmVudC0+c2V0RGVmYXVs
dEhhbmRsZWQoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVXaGVlbEV2ZW50KFdoZWVs
RXZlbnQqIGV2ZW50KQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisK
KyAgICBpZiAoIW1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQpCisgICAgICAgIGZvY3VzUGx1Z2luRWxl
bWVudCgpOworCisgICAgTlBFdmVudCBucEV2ZW50OworICAgIE5QV2hlZWxFdmVudCB3aGVlbEV2
ZW50OworCisgICAgd2hlZWxFdmVudC54ID0gZXZlbnQtPm9mZnNldFgoKTsKKyAgICB3aGVlbEV2
ZW50LnkgPSBldmVudC0+b2Zmc2V0WSgpOworCisgICAgd2hlZWxFdmVudC5mbGFncyA9IDA7CisK
KyAgICB3aGVlbEV2ZW50LnhEZWx0YSA9IGV2ZW50LT5yYXdEZWx0YVgoKTsKKyAgICB3aGVlbEV2
ZW50LnlEZWx0YSA9IGV2ZW50LT5yYXdEZWx0YVkoKTsKKworICAgIG5wRXZlbnQudHlwZSA9IE5Q
X1doZWVsRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gJndoZWVsRXZlbnQ7CisKKyAgICBpZiAo
ZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpKSB7CisgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFu
ZGxlZCgpOworICAgICAgICBldmVudC0+c2V0UGx1Z2luSGFuZGxlZCgpOworICAgIH0KK30KKwor
dm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVUb3VjaEV2ZW50KFRvdWNoRXZlbnQqIGV2ZW50KQorewor
ICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1fcHJpdmF0
ZS0+bV9pc0ZvY3VzZWQpCisgICAgICAgIGZvY3VzUGx1Z2luRWxlbWVudCgpOworCisgICAgTlBU
b3VjaEV2ZW50IG5wVG91Y2hFdmVudDsKKworICAgIGlmIChldmVudC0+aXNEb3VibGVUYXAoKSkK
KyAgICAgICAgbnBUb3VjaEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9ET1VCTEVUQVA7CisgICAg
ZWxzZSBpZiAoZXZlbnQtPmlzVG91Y2hIb2xkKCkpCisgICAgICAgIG5wVG91Y2hFdmVudC50eXBl
ID0gVE9VQ0hfRVZFTlRfVE9VQ0hIT0xEOworICAgIGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0g
ZXZlbnROYW1lcygpLnRvdWNoc3RhcnRFdmVudCkKKyAgICAgICAgbnBUb3VjaEV2ZW50LnR5cGUg
PSBUT1VDSF9FVkVOVF9TVEFSVDsKKyAgICBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50
TmFtZXMoKS50b3VjaGVuZEV2ZW50KQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNI
X0VWRU5UX0VORDsKKyAgICBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS50
b3VjaG1vdmVFdmVudCkKKyAgICAgICAgbnBUb3VjaEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9N
T1ZFOworICAgIGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLnRvdWNoY2Fu
Y2VsRXZlbnQpCisgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRfQ0FOQ0VM
OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuOworCisgICAgVG91Y2hMaXN0KiB0b3VjaExpc3Q7
CisgICAgLy8gVGhlIHRvdWNoZXMgbGlzdCBpcyBlbXB0eSBpZiBpbiBhIHRvdWNoIGVuZCBldmVu
dC4gVXNlIGNoYW5nZWRUb3VjaGVzIGluc3RlYWQuCisgICAgaWYgKG5wVG91Y2hFdmVudC50eXBl
ID09IFRPVUNIX0VWRU5UX0RPVUJMRVRBUCB8fCBucFRvdWNoRXZlbnQudHlwZSA9PSBUT1VDSF9F
VkVOVF9FTkQpCisgICAgICAgIHRvdWNoTGlzdCA9IGV2ZW50LT5jaGFuZ2VkVG91Y2hlcygpOwor
ICAgIGVsc2UKKyAgICAgICAgdG91Y2hMaXN0ID0gZXZlbnQtPnRvdWNoZXMoKTsKKworICAgIG5w
VG91Y2hFdmVudC5wb2ludHMgPSAwOworICAgIG5wVG91Y2hFdmVudC5zaXplID0gdG91Y2hMaXN0
LT5sZW5ndGgoKTsKKworICAgIGlmICh0b3VjaExpc3QtPmxlbmd0aCgpKSB7CisgICAgICAgIG5w
VG91Y2hFdmVudC5wb2ludHMgPSBuZXcgTlBUb3VjaFBvaW50W3RvdWNoTGlzdC0+bGVuZ3RoKCld
OworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdG91Y2hMaXN0LT5sZW5ndGgoKTsg
aSsrKSB7CisgICAgICAgICAgICBUb3VjaCogdG91Y2hJdGVtID0gdG91Y2hMaXN0LT5pdGVtKGkp
OworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS50b3VjaElkID0gdG91Y2hJdGVt
LT5pZGVudGlmaWVyKCk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLmNsaWVu
dFggPSB0b3VjaEl0ZW0tPnBhZ2VYKCkgLSBmcmFtZVJlY3QoKS54KCk7CisgICAgICAgICAgICBu
cFRvdWNoRXZlbnQucG9pbnRzW2ldLmNsaWVudFkgPSB0b3VjaEl0ZW0tPnBhZ2VZKCkgLSBmcmFt
ZVJlY3QoKS55KCk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnNjcmVlblgg
PSB0b3VjaEl0ZW0tPnNjcmVlblgoKTsKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHNb
aV0uc2NyZWVuWSA9IHRvdWNoSXRlbS0+c2NyZWVuWSgpOworICAgICAgICAgICAgbnBUb3VjaEV2
ZW50LnBvaW50c1tpXS5wYWdlWCA9IHRvdWNoSXRlbS0+cGFnZVgoKTsKKyAgICAgICAgICAgIG5w
VG91Y2hFdmVudC5wb2ludHNbaV0ucGFnZVkgPSB0b3VjaEl0ZW0tPnBhZ2VZKCk7CisKKyAgICAg
ICAgfQorICAgIH0KKworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBO
UF9Ub3VjaEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICZucFRvdWNoRXZlbnQ7CisKKyAgICBp
ZiAoZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpKSB7CisgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0
SGFuZGxlZCgpOworICAgICAgICBldmVudC0+c2V0UGx1Z2luSGFuZGxlZCgpOworICAgIH0gZWxz
ZSBpZiAobnBUb3VjaEV2ZW50LnR5cGUgPT0gVE9VQ0hfRVZFTlRfRE9VQkxFVEFQKSB7CisgICAg
ICAgIC8vIFNlbmQgVG91Y2ggVXAgaWYgZG91YmxlIHRhcCBub3QgY29uc3VtZWQKKyAgICAgICAg
bnBUb3VjaEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9FTkQ7CisgICAgICAgIG5wRXZlbnQuZGF0
YSA9ICZucFRvdWNoRXZlbnQ7CisgICAgICAgIGlmIChkaXNwYXRjaE5QRXZlbnQobnBFdmVudCkp
IHsKKyAgICAgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOworICAgICAgICAgICAg
ZXZlbnQtPnNldFBsdWdpbkhhbmRsZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlbGV0
ZVtdIG5wVG91Y2hFdmVudC5wb2ludHM7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlTW91
c2VFdmVudChNb3VzZUV2ZW50KiBldmVudCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgaWYgKCFtX3ByaXZhdGUtPm1faXNGb2N1c2VkKQorICAgICAgICBm
b2N1c1BsdWdpbkVsZW1lbnQoKTsKKworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBOUE1vdXNl
RXZlbnQgbW91c2VFdmVudDsKKworICAgIG1vdXNlRXZlbnQueCA9IGV2ZW50LT5vZmZzZXRYKCk7
CisgICAgbW91c2VFdmVudC55ID0gZXZlbnQtPm9mZnNldFkoKTsKKworICAgIGlmIChldmVudC0+
dHlwZSgpID09IGV2ZW50TmFtZXMoKS5tb3VzZWRvd25FdmVudCkgeworICAgICAgICBtb3VzZUV2
ZW50LnR5cGUgPSBNT1VTRV9CVVRUT05fRE9XTjsKKyAgICAgICAgcGFyZW50RnJhbWUoKS0+ZXZl
bnRIYW5kbGVyKCktPnNldENhcHR1cmluZ01vdXNlRXZlbnRzTm9kZShub2RlKCkpOworICAgIH0g
ZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2Vtb3ZlRXZlbnQpCisg
ICAgICAgIG1vdXNlRXZlbnQudHlwZSA9IE1PVVNFX01PVElPTjsKKyAgICBlbHNlIGlmIChldmVu
dC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5tb3VzZW91dEV2ZW50KQorICAgICAgICBtb3VzZUV2
ZW50LnR5cGUgPSBNT1VTRV9PVVRCT1VORDsKKyAgICBlbHNlIGlmIChldmVudC0+dHlwZSgpID09
IGV2ZW50TmFtZXMoKS5tb3VzZW92ZXJFdmVudCkKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0g
TU9VU0VfT1ZFUjsKKyAgICBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5t
b3VzZXVwRXZlbnQpIHsKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9VU0VfQlVUVE9OX1VQ
OworICAgICAgICBwYXJlbnRGcmFtZSgpLT5ldmVudEhhbmRsZXIoKS0+c2V0Q2FwdHVyaW5nTW91
c2VFdmVudHNOb2RlKDApOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm47CisKKyAgICBtb3Vz
ZUV2ZW50LmJ1dHRvbiA9IGV2ZW50LT5idXR0b24oKTsKKyAgICBtb3VzZUV2ZW50LmZsYWdzID0g
MDsKKworICAgIG5wRXZlbnQudHlwZSA9IE5QX01vdXNlRXZlbnQ7CisgICAgbnBFdmVudC5kYXRh
ID0gJm1vdXNlRXZlbnQ7CisKKyAgICBpZiAoZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpKSB7Cisg
ICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOworICAgICAgICBldmVudC0+c2V0UGx1
Z2luSGFuZGxlZCgpOworICAgIH0KK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVGb2N1c0lu
RXZlbnQoKQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBp
ZiAobV9wcml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcml2
YXRlLT5tX2lzRm9jdXNlZCA9IHRydWU7CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBF
dmVudC50eXBlID0gTlBfRm9jdXNHYWluZWRFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOwor
ICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5k
bGVGb2N1c091dEV2ZW50KCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKCFtX3ByaXZhdGUtPm1faXNGb2N1c2VkKQorICAgICAgICByZXR1cm47CisK
KyAgICBtX3ByaXZhdGUtPm1faXNGb2N1c2VkID0gZmFsc2U7CisKKyAgICBOUEV2ZW50IG5wRXZl
bnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfRm9jdXNMb3N0RXZlbnQ7CisgICAgbnBFdmVudC5k
YXRhID0gMDsKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2lu
Vmlldzo6aGFuZGxlUGF1c2VFdmVudCgpCit7CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5w
RXZlbnQudHlwZSA9IE5QX1BhdXNlRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKyAgICBk
aXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlUmVz
dW1lRXZlbnQoKQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBO
UF9SZXN1bWVFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworICAgIGRpc3BhdGNoTlBFdmVu
dChucEV2ZW50KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVTY3JvbGxFdmVudCgpCit7
CisgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJl
bnQoKSk7CisKKyAgICAvLyBBcyBhIHNwZWNpYWwgY2FzZSwgaWYgdGhlIGZyYW1lVmlldyBleHRl
bnQgaW4gZWl0aGVyIGRpbWVuc2lvbiBpcworICAgIC8vIGVtcHR5LCB0aGVuIHNlbmQgYW4gb24g
c2NyZWVuIGV2ZW50LiBUaGlzIGlzIGltcG9ydGFudCBmb3Igc2l0ZXMgbGlrZQorICAgIC8vIHBp
Y25pay5jb20gd2hpY2ggdXNlIGEgaGlkZGVuIGlmcmFtZSAocmVhZDogd2lkdGggPSAwIGFuZCBo
ZWlnaHQgPSAwKQorICAgIC8vIHdpdGggYW4gZW1iZWRkZWQgc3dmIHRvIGV4ZWN1dGUgc29tZSBq
YXZhc2NyaXB0LiBVbmxlc3Mgd2Ugc2VuZCBhbgorICAgIC8vIG9uIHNjcmVlbiBldmVudCB0aGUg
c3dmIHdpbGwgbm90IGV4ZWN1dGUgdGhlIGphdmFzY3JpcHQgYW5kIHRoZSByZWFsCisgICAgLy8g
c2l0ZSB3aWxsIG5ldmVyIGxvYWQuCisgICAgYm9vbCBvblNjcmVlbkV2ZW50ID0gZnJhbWVWaWV3
ICYmICghZnJhbWVWaWV3LT53aWR0aCgpIHx8ICFmcmFtZVZpZXctPmhlaWdodCgpKTsKKworICAg
IE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBtX2NsaXBSZWN0LmlzRW1wdHko
KSAmJiAhb25TY3JlZW5FdmVudCA/IE5QX09mZlNjcmVlbkV2ZW50IDogTlBfT25TY3JlZW5FdmVu
dDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsK
K30KKworSW50UmVjdCBQbHVnaW5WaWV3OjpjYWxjdWxhdGVDbGlwUmVjdCgpIGNvbnN0Cit7Cisg
ICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQo
KSk7CisgICAgYm9vbCB2aXNpYmxlID0gZnJhbWVWaWV3ICYmIGlzVmlzaWJsZSgpOworCisgICAg
aWYgKHZpc2libGUgJiYgZnJhbWVWaWV3LT53aWR0aCgpICYmIGZyYW1lVmlldy0+aGVpZ2h0KCkp
IHsKKyAgICAgICAgSW50U2l6ZSB3aW5kb3dTaXplID0gZnJhbWVWaWV3LT5ob3N0V2luZG93KCkt
PnBsYXRmb3JtUGFnZUNsaWVudCgpLT52aWV3cG9ydFNpemUoKTsKKworICAgICAgICAvLyBHZXQg
dGhlIGNsaXBwZWQgcmVjdGFuZ2xlIGZvciB0aGlzIHBsYXllciB3aXRoaW4gdGhlIGN1cnJlbnQg
ZnJhbWUuCisgICAgICAgIEludFJlY3QgdmlzaWJsZUNvbnRlbnRSZWN0OworICAgICAgICBJbnRS
ZWN0IGNvbnRlbnRSZWN0ID0gbV9lbGVtZW50LT5yZW5kZXJlcigpLT5hYnNvbHV0ZUNsaXBwZWRP
dmVyZmxvd1JlY3QoKTsKKyAgICAgICAgRmxvYXRQb2ludCBjb250ZW50TG9jYWwgPSBtX2VsZW1l
bnQtPnJlbmRlcmVyKCktPmFic29sdXRlVG9Mb2NhbChGbG9hdFBvaW50KGNvbnRlbnRSZWN0Lmxv
Y2F0aW9uKCkpKTsKKworICAgICAgICBjb250ZW50UmVjdC5zZXRMb2NhdGlvbihyb3VuZGVkSW50
UG9pbnQoY29udGVudExvY2FsKSk7CisgICAgICAgIGNvbnRlbnRSZWN0Lm1vdmUoZnJhbWVSZWN0
KCkueCgpLCBmcmFtZVJlY3QoKS55KCkpOworCisgICAgICAgIC8vIENsaXAgYWdhaW5zdCBhbnkg
ZnJhbWVzIHRoYXQgdGhlIHdpZGdldCBpcyBpbnNpZGUuIE5vdGUgdGhhdCBpZiB0aGUgZnJhbWVz
IGFyZSBhbHNvIGNsaXBwZWQKKyAgICAgICAgLy8gYnkgYSBkaXYsIHRoYXQgd2lsbCBub3QgYmUg
aW5jbHVkZWQgaW4gdGhpcyBjYWxjdWxhdGlvbi4gVGhhdCBpcyBhbiBpbXByb3ZlbWVudCB0aGF0
IHN0aWxsCisgICAgICAgIC8vIG5lZWRzIHRvIGJlIG1hZGUuCisgICAgICAgIGNvbnN0IFdpZGdl
dCogY3VycmVudCA9IHRoaXM7CisgICAgICAgIHdoaWxlIChjdXJyZW50LT5wYXJlbnQoKSAmJiB2
aXNpYmxlKSB7CisgICAgICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaXQgaXMgdmlzaWJsZSBpbiB0
aGlzIHNjcm9sbHZpZXcuCisgICAgICAgICAgICB2aXNpYmxlQ29udGVudFJlY3QgPSBjdXJyZW50
LT5wYXJlbnQoKS0+dmlzaWJsZUNvbnRlbnRSZWN0KCk7CisKKyAgICAgICAgICAgIC8vIFNwZWNp
YWwgY2FzZSBmb3IgdGhlIHJvb3QgU2Nyb2xsVmlldy4gSXRzIHNpemUgZG9lcyBub3QgbWF0Y2gg
dGhlIGFjdHVhbCB3aW5kb3cgc2l6ZS4KKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5wYXJlbnQo
KSA9PSByb290KCkpCisgICAgICAgICAgICAgICAgdmlzaWJsZUNvbnRlbnRSZWN0LnNldFNpemUo
d2luZG93U2l6ZSk7CisKKyAgICAgICAgICAgIGNvbnRlbnRSZWN0LmludGVyc2VjdCh2aXNpYmxl
Q29udGVudFJlY3QpOworICAgICAgICAgICAgdmlzaWJsZSA9ICFjb250ZW50UmVjdC5pc0VtcHR5
KCk7CisKKyAgICAgICAgICAgIC8vIE9mZnNldCB0byB2aXNpYmxlIGNvb3JkaW5hdGVzIGluIHNj
cm9sbHZpZXcgd2lkZ2V0J3MgY29vcmRpbmF0ZSBzeXN0ZW0gKGV4Y2VwdCBpbiB0aGUgY2FzZSBv
ZgorICAgICAgICAgICAgLy8gdGhlIHRvcCBzY3JvbGwgdmlldykuCisgICAgICAgICAgICBpZiAo
Y3VycmVudC0+cGFyZW50KCktPnBhcmVudCgpKQorICAgICAgICAgICAgICAgIGNvbnRlbnRSZWN0
Lm1vdmUoLXZpc2libGVDb250ZW50UmVjdC54KCksIC12aXNpYmxlQ29udGVudFJlY3QueSgpKTsK
KworICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBhcmVudCgpOworCisgICAgICAgICAg
ICAvLyBEb24ndCBpbmNsdWRlIHRoZSBvZmZzZXQgZm9yIHRoZSByb290IHdpbmRvdyBvciB3ZSBn
ZXQgdGhlIHdyb25nIGNvb3JkaW5hdGVzLgorICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnBhcmVu
dCgpKSB7CisgICAgICAgICAgICAgICAgLy8gTW92ZSBjb250ZW50IHJlY3QgaW50byB0aGUgcGFy
ZW50IHNjcm9sbHZpZXcncyBjb29yZGluYXRlcy4KKyAgICAgICAgICAgICAgICBJbnRSZWN0IGN1
ckZyYW1lUmVjdCA9IGN1cnJlbnQtPmZyYW1lUmVjdCgpOworICAgICAgICAgICAgICAgIGNvbnRl
bnRSZWN0Lm1vdmUoY3VyRnJhbWVSZWN0LngoKSwgY3VyRnJhbWVSZWN0LnkoKSk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY29udGVudFJlY3Q7CisgICAgfQor
CisgICAgcmV0dXJuIEludFJlY3QoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVPbkxv
YWRFdmVudCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmIChtX3ByaXZhdGUtPm1fc2VudE9uTG9hZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9w
cml2YXRlLT5tX3NlbnRPbkxvYWQgPSB0cnVlOworCisgICAgTlBFdmVudCBucEV2ZW50OworICAg
IG5wRXZlbnQudHlwZSA9IE5QX09uTG9hZEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisK
KyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7CisKKyAgICAvLyBTZW5kIGFuIGluaXRpYWwg
T25TY3JlZW4vT2ZmU2NyZWVuIGV2ZW50LiBJdCBtdXN0IGFsd2F5cyBjb21lIGFmdGVyIG9uTG9h
ZCBpcyBzZW50LgorICAgIGhhbmRsZVNjcm9sbEV2ZW50KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmll
dzo6aGFuZGxlRnJlZU1lbW9yeUV2ZW50KCkKK3sKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAg
bnBFdmVudC50eXBlID0gTlBfRnJlZU1lbW9yeUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7
CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6
aGFuZGxlQmFja2dyb3VuZEV2ZW50KCkKK3sKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBF
dmVudC50eXBlID0gTlBfQmFja2dyb3VuZEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisK
KyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFu
ZGxlRm9yZWdyb3VuZEV2ZW50KCkKK3sKKyAgICBzZXROUFdpbmRvd0lmTmVlZGVkKCk7CisKKyAg
ICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfRm9yZWdyb3VuZEV2ZW50
OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7
Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlRnVsbFNjcmVlbkFsbG93ZWRFdmVudCgpCit7
CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIE5QRXZlbnQgbnBF
dmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9GdWxsU2NyZWVuUmVhZHlFdmVudDsKKyAgICBu
cEV2ZW50LmRhdGEgPSAwOworCisgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGlj
X2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpKSB7CisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdp
bmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+ZGlkUGx1Z2luRW50ZXJGdWxsU2NyZWVuKHRo
aXMsIG1fcHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19zdHIoKSk7CisKKyAgICAgICAg
aWYgKCFkaXNwYXRjaE5QRXZlbnQobnBFdmVudCkpCisgICAgICAgICAgICBmcmFtZVZpZXctPmhv
c3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmRpZFBsdWdpbkV4aXRGdWxsU2NyZWVu
KHRoaXMsIG1fcHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19zdHIoKSk7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4gPSB0cnVlOworICAg
IH0KK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVGdWxsU2NyZWVuRXhpdEV2ZW50KCkKK3sK
KyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgTlBFdmVudCBucEV2
ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0Z1bGxTY3JlZW5FeGl0RXZlbnQ7CisgICAgbnBF
dmVudC5kYXRhID0gMDsKKworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKKworICAgIGlm
IChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgp
KSkKKyAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgp
LT5kaWRQbHVnaW5FeGl0RnVsbFNjcmVlbih0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVl
UHJlZml4LmNfc3RyKCkpOworCisgICAgbV9wcml2YXRlLT5tX2lzRnVsbFNjcmVlbiA9IGZhbHNl
OworICAgIGludmFsaWRhdGUoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVJZGxlRXZl
bnQoYm9vbCBlbnRlcklkbGUpCit7CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQu
ZGF0YSA9IDA7CisKKyAgICBpZiAoZW50ZXJJZGxlKQorICAgICAgICBucEV2ZW50LnR5cGUgPSBO
UF9FbnRlcklkbGVFdmVudDsKKyAgICBlbHNlCisgICAgICAgIG5wRXZlbnQudHlwZSA9IE5QX0V4
aXRJZGxlRXZlbnQ7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKKwordm9p
ZCBQbHVnaW5WaWV3OjpoYW5kbGVBcHBBY3RpdmF0ZWRFdmVudCgpCit7CisgICAgTlBFdmVudCBu
cEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisgICAgbnBFdmVudC50eXBlID0gTlBfQXBw
QWN0aXZhdGVkRXZlbnQ7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3Zv
aWQgUGx1Z2luVmlldzo6aGFuZGxlQXBwRGVhY3RpdmF0ZWRFdmVudCgpCit7CisgICAgaWYgKCFt
X3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFBsdWdpbiB3YW50cyB0byBrbm93
IHRoYXQgaXQgaGFzIHRvIGV4aXQgZnVsbHNjcmVlbiBvbiBkZWFjdGl2YXRpb24uCisgICAgaWYg
KG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAgICAgIGhhbmRsZUZ1bGxTY3JlZW5FeGl0
RXZlbnQoKTsKKworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOwor
ICAgIG5wRXZlbnQudHlwZSA9IE5QX0FwcERlYWN0aXZhdGVkRXZlbnQ7CisKKyAgICBkaXNwYXRj
aE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlQXBwU3RhbmRi
eUV2ZW50KCkKK3sKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgc2VuZCBhbiBRTlBfQXBwU3Rh
bmRieUV2ZW50CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7Cisg
ICAgbnBFdmVudC50eXBlID0gTlBfQXBwU3RhbmRCeUV2ZW50OworCisgICAgZGlzcGF0Y2hOUEV2
ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZU9yaWVudGF0aW9uRXZl
bnQoaW50IGFuZ2xlKQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUg
PSBOUF9PcmllbnRhdGlvbkV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICh2b2lkKilhbmdsZTsK
KworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQbHVnaW5WaWV3Ojpo
YW5kbGVTd2lwZUV2ZW50KCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gUGx1Z2luIG9ubHkgd2FudHMgdG8ga25vdyB0aGF0IGl0IGhhcyB0byBleGl0
IGZ1bGxzY3JlZW4uCisgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAgICAg
IGhhbmRsZUZ1bGxTY3JlZW5FeGl0RXZlbnQoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5k
bGVTY3JlZW5Qb3dlckV2ZW50KGJvb2wgcG93ZXJlZCkKK3sKKyAgICBOUEV2ZW50IG5wRXZlbnQ7
CisgICAgbnBFdmVudC5kYXRhID0gMDsKKworICAgIGlmIChwb3dlcmVkKQorICAgICAgICBucEV2
ZW50LnR5cGUgPSBOUF9TY3JlZW5Qb3dlclVwRXZlbnQ7CisgICAgZWxzZQorICAgICAgICBucEV2
ZW50LnR5cGUgPSBOUF9TY3JlZW5Qb3dlckRvd25FdmVudDsKKworICAgIGRpc3BhdGNoTlBFdmVu
dChucEV2ZW50KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpzZXRQYXJlbnQoU2Nyb2xsVmlldyog
cGFyZW50V2lkZ2V0KQoreworICAgIC8vIElmIHBhcmVudFdpZGdldCBpcyAwLCBsZXRzIHVucmVn
aXN0ZXIgdGhlIHBsdWdpbiB3aXRoIHRoZSBjdXJyZW50IHBhcmVudC4KKyAgICBpZiAobV9wcml2
YXRlICYmICghcGFyZW50V2lkZ2V0IHx8IHBhcmVudFdpZGdldCAhPSBwYXJlbnQoKSkpIHsKKyAg
ICAgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4o
cGFyZW50KCkpKSB7CisgICAgICAgICAgICBpZiAobV9wcml2YXRlLT5tX2lzQmFja2dyb3VuZFBs
YXlpbmcpCisgICAgICAgICAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3Jt
UGFnZUNsaWVudCgpLT5vblBsdWdpblN0b3BCYWNrZ3JvdW5kUGxheSh0aGlzLCBtX3ByaXZhdGUt
Pm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpOworCisgICAgICAgICAgICBpZiAobV9wcml2
YXRlLT5tX2lzRnVsbFNjcmVlbikKKyAgICAgICAgICAgICAgICBoYW5kbGVGdWxsU2NyZWVuRXhp
dEV2ZW50KCk7CisKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB1bmxvY2sgdGhlIGlkbGUgKGlm
IHdlIGhhdmUgbG9ja2VkIGl0KS4KKyAgICAgICAgICAgIG1fcHJpdmF0ZS0+cHJldmVudElkbGUo
ZmFsc2UpOworCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgcmVsZWFzZSBhbnkga2VlcFZpc2li
bGVSZWN0cyBpZiB0aGV5IHdlcmUgc2V0LgorICAgICAgICAgICAgbV9wcml2YXRlLT5jbGVhclZp
c2libGVSZWN0cygpOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICAg
ICAgICAgLy8gSWYgd2UgaGFkIGEgaG9sZSBwdW5jaCByZWN0IHNldCwgY2xlYXIgaXQuCisgICAg
ICAgICAgICBpZiAobV9wcml2YXRlLT5tX3BsYXRmb3JtTGF5ZXIgJiYgIW1fcHJpdmF0ZS0+bV9o
b2xlUHVuY2hSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBtX3ByaXZhdGUtPm1fcGxh
dGZvcm1MYXllci0+c2V0SG9sZVB1bmNoUmVjdChJbnRSZWN0KCkpOworI2VuZGlmCisgICAgICAg
ICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnJlZ2lz
dGVyUGx1Z2luKHRoaXMsIGZhbHNlIC8qc2hvdWxkUmVnaXN0ZXIqLyk7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBXaWRnZXQ6OnNldFBhcmVudChwYXJlbnRXaWRnZXQpOworCisgICAgaWYgKHBh
cmVudFdpZGdldCkgeworICAgICAgICBpbml0KCk7CisKKyAgICAgICAgRnJhbWVWaWV3KiBmcmFt
ZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnRXaWRnZXQpOworCisgICAgICAg
IGlmIChmcmFtZVZpZXcgJiYgbV9wcml2YXRlKSB7CisgICAgICAgICAgICBmcmFtZVZpZXctPmhv
c3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnJlZ2lzdGVyUGx1Z2luKHRoaXMsIHRy
dWUgLypzaG91bGRSZWdpc3RlciovKTsKKyAgICAgICAgICAgIGlmIChmcmFtZVZpZXctPmZyYW1l
KCkKKyAgICAgICAgICAgICAgICYmIGZyYW1lVmlldy0+ZnJhbWUoKS0+bG9hZGVyKCkKKyAgICAg
ICAgICAgICAgICYmIGZyYW1lVmlldy0+ZnJhbWUoKS0+bG9hZGVyKCktPmZyYW1lSGFzTG9hZGVk
KCkpCisgICAgICAgICAgICAgICAgaGFuZGxlT25Mb2FkRXZlbnQoKTsKKworICAgICAgICAgICAg
aWYgKG1fcHJpdmF0ZS0+bV9pc0JhY2tncm91bmRQbGF5aW5nKQorICAgICAgICAgICAgICAgIGZy
YW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+b25QbHVnaW5TdGFy
dEJhY2tncm91bmRQbGF5KHRoaXMsIG1fcHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19z
dHIoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0TlBXaW5k
b3dSZWN0KGNvbnN0IEludFJlY3QmIHJjKQoreworICAgIHNldE5QV2luZG93SWZOZWVkZWQoKTsK
K30KKwordm9pZCBQbHVnaW5WaWV3OjpzZXROUFdpbmRvd0lmTmVlZGVkKCkKK3sKKyAgICBpZiAo
IW1fcHJpdmF0ZSB8fCAhbV9pc1N0YXJ0ZWQgfHwgIXBhcmVudCgpIHx8ICFtX3BsdWdpbi0+cGx1
Z2luRnVuY3MoKS0+c2V0d2luZG93KQorICAgICAgICByZXR1cm47CisKKyAgICBGcmFtZVZpZXcq
IGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKTsKKyAgICBpZiAo
IWZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+aXNBY3RpdmUo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSWYgdGhlIHBsdWdpbiBkaWRuJ3QgbG9hZCBz
dWNlc3NmdWxseSwgbm8gcG9pbnQgaW4gY2FsbGluZyBzZXR3aW5kb3cKKyAgICBpZiAobV9zdGF0
dXMgIT0gUGx1Z2luU3RhdHVzTG9hZGVkU3VjY2Vzc2Z1bGx5KQorICAgICAgICByZXR1cm47CisK
KyAgICBpZiAobV9wcml2YXRlLT5tX2lzRnVsbFNjcmVlbikKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaWYgKCFtX3ByaXZhdGUtPm1faGFzUGVuZGluZ0dlb21ldHJ5Q2hhbmdlKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBtX3ByaXZhdGUtPm1faGFzUGVuZGluZ0dlb21ldHJ5Q2hhbmdlID0gZmFs
c2U7CisKKyAgICBtX25wV2luZG93LnggPSBtX3dpbmRvd1JlY3QueCgpOworICAgIG1fbnBXaW5k
b3cueSA9IG1fd2luZG93UmVjdC55KCk7CisKKyAgICBtX25wV2luZG93LmNsaXBSZWN0LmxlZnQg
PSBtYXgoMCwgbV9jbGlwUmVjdC54KCkpOworICAgIG1fbnBXaW5kb3cuY2xpcFJlY3QudG9wID0g
bWF4KDAsIG1fY2xpcFJlY3QueSgpKTsKKyAgICBtX25wV2luZG93LmNsaXBSZWN0LnJpZ2h0ID0g
bWF4KDAsIG1fY2xpcFJlY3QubWF4WCgpKTsKKyAgICBtX25wV2luZG93LmNsaXBSZWN0LmJvdHRv
bSA9IG1heCgwLCBtX2NsaXBSZWN0Lm1heFkoKSk7CisKKyAgICBpZiAobV9wbHVnaW4tPnF1aXJr
cygpLmNvbnRhaW5zKFBsdWdpblF1aXJrRG9udENhbGxTZXRXaW5kb3dNb3JlVGhhbk9uY2UpKSB7
CisgICAgICAgIC8vIEZMQVNIIFdPUktBUk9VTkQ6IE9ubHkgc2V0IGluaXRpYWxseS4gTXVsdGlw
bGUgY2FsbHMgdG8KKyAgICAgICAgLy8gc2V0TlBXaW5kb3coKSBjYXVzZSB0aGUgcGx1Z2luIHRv
IGNyYXNoIGluIHdpbmRvd2VkIG1vZGUuCisgICAgICAgIGlmICghbV9pc1dpbmRvd2VkIHx8IG1f
bnBXaW5kb3cud2lkdGggPT0gVU5JTklUX0NPT1JEIHx8IG1fbnBXaW5kb3cuaGVpZ2h0ID09IFVO
SU5JVF9DT09SRCkgeworICAgICAgICAgICAgbV9ucFdpbmRvdy53aWR0aCA9IG1fd2luZG93UmVj
dC53aWR0aCgpOworICAgICAgICAgICAgbV9ucFdpbmRvdy5oZWlnaHQgPSBtX3dpbmRvd1JlY3Qu
aGVpZ2h0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtX25wV2luZG93Lndp
ZHRoID0gbV93aW5kb3dSZWN0LndpZHRoKCk7CisgICAgICAgIG1fbnBXaW5kb3cuaGVpZ2h0ID0g
bV93aW5kb3dSZWN0LmhlaWdodCgpOworICAgIH0KKworICAgIG1fbnBXaW5kb3cudHlwZSA9IE5Q
V2luZG93VHlwZURyYXdhYmxlOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNz
OjpXaW5kb3cgKndpbmRvdyA9CisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0
Zm9ybVBhZ2VDbGllbnQoKS0+cGxhdGZvcm1XaW5kb3coKTsKKyAgICBpZiAod2luZG93KQorICAg
ICAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPndp
bmRvd0dyb3VwID0gd2luZG93LT53aW5kb3dHcm91cCgpOworCisgICAgUGx1Z2luVmlldzo6c2V0
Q3VycmVudFBsdWdpblZpZXcodGhpcyk7CisgICAgSlNDOjpKU0xvY2s6OkRyb3BBbGxMb2NrcyBk
cm9wQWxsTG9ja3MoSlNDOjpTaWxlbmNlQXNzZXJ0aW9uc09ubHkpOworICAgIHNldENhbGxpbmdQ
bHVnaW4odHJ1ZSk7CisgICAgLy8gRklYTUU6IFBhc3Npbmcgem9vbUZhY3RvciB0byBzZXR3aW5k
b3cgbWFrZSB3aW5kb3dlZCBwbHVnaW4gc2NhbGUgaW5jb3JyZWN0bHkuCisgICAgLy8gSGFuZGxp
bmcgdGhlIHpvb20gZmFjdG9yIHByb3Blcmx5IGluIHRoZSBwbHVnaW4gc2lkZSBtYXkgYmUgYSBi
ZXR0ZXIgc29sdXRpb24uCisgICAgZG91YmxlIG9sZFpvb21GYWN0b3IgPSAoKE5QU2V0V2luZG93
Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21GYWN0b3I7CisgICAgKChO
UFNldFdpbmRvd0NhbGxiYWNrU3RydWN0KiltX25wV2luZG93LndzX2luZm8pLT56b29tRmFjdG9y
ID0gMS47CisgICAgbV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPnNldHdpbmRvdyhtX2luc3RhbmNl
LCAmbV9ucFdpbmRvdyk7CisgICAgKChOUFNldFdpbmRvd0NhbGxiYWNrU3RydWN0KiltX25wV2lu
ZG93LndzX2luZm8pLT56b29tRmFjdG9yID0gb2xkWm9vbUZhY3RvcjsKKyAgICBzZXRDYWxsaW5n
UGx1Z2luKGZhbHNlKTsKKyAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldygwKTsK
K30KKwordm9pZCBQbHVnaW5WaWV3OjpzZXRQYXJlbnRWaXNpYmxlKGJvb2wgdmlzaWJsZSkKK3sK
KyAgICBpZiAoaXNQYXJlbnRWaXNpYmxlKCkgPT0gdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgV2lkZ2V0OjpzZXRQYXJlbnRWaXNpYmxlKHZpc2libGUpOworCisgICAgLy8gRklYTUU6
IFdlIG1pZ2h0IHdhbnQgdG8gdGVsbCB0aGUgcGx1Z2luIHRvIGhpZGUgaXQncyB3aW5kb3cgaGVy
ZSwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyCisgICAgLy8gICAgICAgc2luY2UgdGhlIHdpbmRvdyBt
YW5hZ2VyIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhhdCBmb3IgdXMuCit9CisKK05QRXJyb3IgUGx1
Z2luVmlldzo6aGFuZGxlUG9zdFJlYWRGaWxlKFZlY3RvcjxjaGFyPiYgYnVmZmVyLCB1aW50MzJf
dCBsZW4sIGNvbnN0IGNoYXIqIGJ1ZikKK3sKKyAgICBTdHJpbmcgZmlsZW5hbWUoYnVmLCBsZW4p
OworCisgICAgaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoImZpbGU6Ly8vIikpCisgICAgICAgIGZp
bGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDgpOworCisgICAgbG9uZyBsb25nIHNpemU7Cisg
ICAgaWYgKCFnZXRGaWxlU2l6ZShmaWxlbmFtZSwgc2l6ZSkpCisgICAgICAgIHJldHVybiBOUEVS
Ul9GSUxFX05PVF9GT1VORDsKKworICAgIEZJTEUqIGZpbGVIYW5kbGUgPSBmb3BlbigoZmlsZW5h
bWUudXRmOCgpKS5kYXRhKCksICJyIik7CisgICAgaWYgKCFmaWxlSGFuZGxlKQorICAgICAgICBy
ZXR1cm4gTlBFUlJfRklMRV9OT1RfRk9VTkQ7CisKKyAgICBidWZmZXIucmVzaXplKHNpemUpOwor
ICAgIGludCBieXRlc1JlYWQgPSBmcmVhZChidWZmZXIuZGF0YSgpLCAxLCBzaXplLCBmaWxlSGFu
ZGxlKTsKKworICAgIGZjbG9zZShmaWxlSGFuZGxlKTsKKworICAgIGlmIChieXRlc1JlYWQgPD0g
MCkKKyAgICAgICAgcmV0dXJuIE5QRVJSX0ZJTEVfTk9UX0ZPVU5EOworCisgICAgcmV0dXJuIE5Q
RVJSX05PX0VSUk9SOworfQorCitib29sIFBsdWdpblZpZXc6OnBsYXRmb3JtR2V0VmFsdWVTdGF0
aWMoTlBOVmFyaWFibGUgdmFyaWFibGUsIHZvaWQqIHZhbHVlLCBOUEVycm9yKiByZXN1bHQpCit7
CisgICAgc3dpdGNoICh2YXJpYWJsZSkgeworICAgIGNhc2UgTlBOVlRvb2xraXQ6CisgICAgICAg
ICpzdGF0aWNfY2FzdDx1aW50MzJfdCo+KHZhbHVlKSA9IDA7CisgICAgICAgICpyZXN1bHQgPSBO
UEVSUl9OT19FUlJPUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIE5QTlZTdXBw
b3J0c1hFbWJlZEJvb2w6CisgICAgICAgICpzdGF0aWNfY2FzdDxOUEJvb2wqPih2YWx1ZSkgPSB0
cnVlOworICAgICAgICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgIHJldHVybiB0
cnVlOworCisgICAgY2FzZSBOUE5WamF2YXNjcmlwdEVuYWJsZWRCb29sOgorICAgICAgICAqc3Rh
dGljX2Nhc3Q8TlBCb29sKj4odmFsdWUpID0gdHJ1ZTsKKyAgICAgICAgKnJlc3VsdCA9IE5QRVJS
X05PX0VSUk9SOworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgTlBOVlN1cHBvcnRz
V2luZG93bGVzczoKKyAgICAgICAgKnN0YXRpY19jYXN0PE5QQm9vbCo+KHZhbHVlKSA9IHRydWU7
CisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgcmV0dXJuIHRydWU7
CisKKyAgICBjYXNlIE5QTlZOUENhbGxiYWNrc1B0cjogeworICAgICAgICAqKCh2b2lkICoqKSB2
YWx1ZSkgPSAodm9pZCopJnNfTnBDYWxsYmFja3M7CisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9O
T19FUlJPUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBQbHVnaW5WaWV3OjpwbGF0Zm9y
bUdldFZhbHVlKE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkKiB2YWx1ZSwgTlBFcnJvciogcmVz
dWx0KQoreworICAgIHN3aXRjaCAodmFyaWFibGUpIHsKKyAgICBjYXNlIE5QTlZab29tRmFjdG9y
OiB7CisgICAgICAgICooc3RhdGljX2Nhc3Q8dm9pZCoqPih2YWx1ZSkpID0gc3RhdGljX2Nhc3Q8
dm9pZCo+KCYoKHN0YXRpY19jYXN0PE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqPihtX25wV2lu
ZG93LndzX2luZm8pKSktPnpvb21GYWN0b3IpOworICAgICAgICAqcmVzdWx0ID0gTlBFUlJfTk9f
RVJST1I7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNhc2UgTlBOVlJvb3RX
aW5kb3dHcm91cDogeworICAgICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0
PEZyYW1lVmlldyo+KHBhcmVudCgpKTsKKyAgICAgICAgaWYgKGZyYW1lVmlldykgeworICAgICAg
ICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3cgKndpbmRvdyA9Cisg
ICAgICAgICAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVu
dCgpLT5wbGF0Zm9ybVdpbmRvdygpOworICAgICAgICAgICAgaWYgKHdpbmRvdykgeworICAgICAg
ICAgICAgICAgIHZvaWQqKiB0ZW1wVmFsdWUgPSBzdGF0aWNfY2FzdDx2b2lkKio+KHZhbHVlKTsK
KyAgICAgICAgICAgICAgICAqdGVtcFZhbHVlID0gKHZvaWQqKXdpbmRvdy0+cm9vdEdyb3VwKCk7
CisKKyAgICAgICAgICAgICAgICBpZiAoKnRlbXBWYWx1ZSkgeworICAgICAgICAgICAgICAgICAg
ICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg
ICAgICpyZXN1bHQgPSBOUEVSUl9HRU5FUklDX0VSUk9SOworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgY2FzZSBOUE5WQnJvd3NlcldpbmRvd0dyb3VwOiB7CisgICAgICAgIEZy
YW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOwor
ICAgICAgICBpZiAoZnJhbWVWaWV3KSB7CisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6R3JhcGhpY3M6OldpbmRvdyogd2luZG93ID0KKyAgICAgICAgICAgICAgICBmcmFtZVZpZXct
Pmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnBsYXRmb3JtV2luZG93KCk7Cisg
ICAgICAgICAgICBpZiAod2luZG93KSB7CisgICAgICAgICAgICAgICAgdm9pZCoqIHRlbXBWYWx1
ZSA9IHN0YXRpY19jYXN0PHZvaWQqKj4odmFsdWUpOworICAgICAgICAgICAgICAgICp0ZW1wVmFs
dWUgPSByZWludGVycHJldF9jYXN0PHZvaWQqPihjb25zdF9jYXN0PGNoYXIqPih3aW5kb3ctPndp
bmRvd0dyb3VwKCkpKTsKKworICAgICAgICAgICAgICAgIGlmICgqdGVtcFZhbHVlKSB7CisgICAg
ICAgICAgICAgICAgICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICB9CisKKyAgICAgICAgKnJlc3VsdCA9IE5QRVJSX0dFTkVSSUNfRVJST1I7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjYXNlIE5QTlZCcm93c2VyRGlzcGxheUNvbnRl
eHQ6IHsKKyAgICAgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZp
ZXcqPihwYXJlbnQoKSk7CisgICAgICAgIGlmIChmcmFtZVZpZXcpIHsKKyAgICAgICAgICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6UGxhdGZvcm1EaXNwbGF5Q29udGV4dEhhbmRs
ZSBjb250ZXh0ID0KKyAgICAgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhp
Y3M6OnBsYXRmb3JtRGlzcGxheUNvbnRleHQoKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0KSB7
CisgICAgICAgICAgICAgICAgdm9pZCoqIHRlbXBWYWx1ZSA9IHN0YXRpY19jYXN0PHZvaWQqKj4o
dmFsdWUpOworICAgICAgICAgICAgICAgICp0ZW1wVmFsdWUgPSBzdGF0aWNfY2FzdDx2b2lkKj4o
Y29udGV4dCk7CisKKyAgICAgICAgICAgICAgICBpZiAoKnRlbXBWYWx1ZSkgeworICAgICAgICAg
ICAgICAgICAgICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorCisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9HRU5FUklDX0VSUk9SOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgY2FzZSBOUE5WUGx1Z2luV2luZG93UHJlZml4OiB7Cisg
ICAgICAgIHZvaWQqKiB0ZW1wVmFsdWUgPSBzdGF0aWNfY2FzdDx2b2lkKio+KHZhbHVlKTsKKyAg
ICAgICAgKnRlbXBWYWx1ZSA9IHN0YXRpY19jYXN0PHZvaWQqPihjb25zdF9jYXN0PGNoYXIqPiht
X3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpKTsKKworICAgICAgICBpZiAo
KnRlbXBWYWx1ZSkgeworICAgICAgICAgICAgKnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAqcmVzdWx0ID0gTlBF
UlJfR0VORVJJQ19FUlJPUjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGRl
ZmF1bHQ6CisgICAgICAgIHJldHVybiBwbGF0Zm9ybUdldFZhbHVlU3RhdGljKHZhcmlhYmxlLCB2
YWx1ZSwgcmVzdWx0KTsKKyAgICAgICAgLy8gRklYTUU6IFNob3VsZCB3ZSByZXR1cm4gZmFsc2U/
CisgICAgfQorfQorCisvLyBUaGlzIGlzIGEgcHVyZSB2aXJ0dWFsIGluaGVyaXRlZCBmcm9tIFdp
ZGdldCBjbGFzcyBhbmQgYWxsIGludmFsaWRhdGVzCisvLyBhcmUgZnVubmVsZWQgdGhyb3VnaCB0
aGlzIG1ldGhvZC4gV2UgZm9yd2FyZCB0aGVtIG9uIHRvIGVpdGhlciB0aGUKKy8vIGNvbXBvc2l0
aW5nIGxheWVyIG9yIHRoZSBQbHVnaW5WaWV3OjppbnZhbGlkYXRlV2luZG93bGVzc1BsdWdpblJl
Y3QgbWV0aG9kLgordm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVjdChjb25zdCBJbnRSZWN0
JiByZWN0KQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICAv
LyBSZWNvcmQgdGhlIHJlZ2lvbiB0aGF0IHdlJ3ZlIGJlZW4gYXNrZWQgdG8gaW52YWxpZGF0ZQor
ICAgIG1fcHJpdmF0ZS0+bV9pbnZhbGlkYXRlUmVnaW9uID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkludFJlY3RSZWdpb246OnVuaW9uUmVnaW9ucyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVj
dChyZWN0KSwgbV9wcml2YXRlLT5tX2ludmFsaWRhdGVSZWdpb24pOworCisjaWYgVVNFKEFDQ0VM
RVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmIChtX3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllcikg
eworICAgICAgICBtX3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIGludmFsaWRhdGVXaW5kb3ds
ZXNzUGx1Z2luUmVjdChyZWN0KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVj
dChOUFJlY3QqIHJlY3QpCit7CisgICAgaWYgKCFyZWN0KSB7CisgICAgICAgIGludmFsaWRhdGUo
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnZhbGlkYXRlUmVjdChJbnRSZWN0KHJl
Y3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0LCByZWN0LT5ib3R0
b20gLSByZWN0LT50b3ApKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVnaW9u
KE5QUmVnaW9uIHJlZ2lvbikKK3sKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgUGx1Z2lu
Vmlldzo6Zm9yY2VSZWRyYXcoKQoreworICAgIGludmFsaWRhdGUoKTsKK30KKworYm9vbCBQbHVn
aW5WaWV3OjpwbGF0Zm9ybVN0YXJ0KCkKK3sKKyAgICBBU1NFUlQobV9pc1N0YXJ0ZWQpOworICAg
IEFTU0VSVChtX3N0YXR1cyA9PSBQbHVnaW5TdGF0dXNMb2FkZWRTdWNjZXNzZnVsbHkpOworCisg
ICAgbV9wcml2YXRlID0gbmV3IFBsdWdpblZpZXdQcml2YXRlKHRoaXMpOworCisgICAgaWYgKG1f
cGx1Z2luLT5wbHVnaW5GdW5jcygpLT5nZXR2YWx1ZSkgeworICAgICAgICBQbHVnaW5WaWV3Ojpz
ZXRDdXJyZW50UGx1Z2luVmlldyh0aGlzKTsKKyAgICAgICAgSlNDOjpKU0xvY2s6OkRyb3BBbGxM
b2NrcyBkcm9wQWxsTG9ja3MoSlNDOjpTaWxlbmNlQXNzZXJ0aW9uc09ubHkpOworICAgICAgICBz
ZXRDYWxsaW5nUGx1Z2luKHRydWUpOworICAgICAgICBtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+
Z2V0dmFsdWUobV9pbnN0YW5jZSwgTlBQVnBsdWdpbk5lZWRzWEVtYmVkLCAmbV9uZWVkc1hFbWJl
ZCk7CisgICAgICAgIHNldENhbGxpbmdQbHVnaW4oZmFsc2UpOworICAgICAgICBQbHVnaW5WaWV3
OjpzZXRDdXJyZW50UGx1Z2luVmlldygwKTsKKyAgICB9CisKKyNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCisgICAgaWYgKG1fcGFyZW50RnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPmNs
aWVudCgpLT5hbGxvd3NBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkKKyAgICAgICAgJiYgbV9wYXJl
bnRGcmFtZS0+cGFnZSgpLT5zZXR0aW5ncygpCisgICAgICAgICYmIG1fcGFyZW50RnJhbWUtPnBh
Z2UoKS0+c2V0dGluZ3MoKS0+YWNjZWxlcmF0ZWRDb21wb3NpdGluZ0VuYWJsZWQoKSkgeworICAg
ICAgICBtX3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllciA9IFBsdWdpbkxheWVyV2ViS2l0VGhyZWFk
OjpjcmVhdGUodGhpcyk7CisgICAgICAgIC8vIFRyaWdnZXIgbGF5ZXIgY29tcHV0YXRpb24gaW4g
UmVuZGVyTGF5ZXJDb21wb3NpdG9yCisgICAgICAgIG1fZWxlbWVudC0+c2V0TmVlZHNTdHlsZVJl
Y2FsYyhTeW50aGV0aWNTdHlsZUNoYW5nZSk7CisgICAgfQorI2VuZGlmCisKKyAgICBtX25wV2lu
ZG93LnR5cGUgPSBOUFdpbmRvd1R5cGVEcmF3YWJsZTsKKyAgICBtX25wV2luZG93LndpbmRvdyA9
IDA7IC8vIE5vdCB1c2VkPworICAgIG1fbnBXaW5kb3cueCA9IDA7CisgICAgbV9ucFdpbmRvdy55
ID0gMDsKKyAgICBtX25wV2luZG93LndpZHRoID0gVU5JTklUX0NPT1JEOworICAgIG1fbnBXaW5k
b3cuaGVpZ2h0ID0gVU5JTklUX0NPT1JEOworICAgIG1fbnBXaW5kb3cud3NfaW5mbyA9IG5ldyBO
UFNldFdpbmRvd0NhbGxiYWNrU3RydWN0OworICAgICgoTlBTZXRXaW5kb3dDYWxsYmFja1N0cnVj
dCopbV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3RvciA9IDEuOworICAgICgoTlBTZXRXaW5k
b3dDYWxsYmFja1N0cnVjdCopbV9ucFdpbmRvdy53c19pbmZvKS0+d2luZG93R3JvdXAgPSAwOwor
CisgICAgc2hvdygpOworCisgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nh
c3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpKQorICAgICAgICBoYW5kbGVPcmllbnRhdGlvbkV2ZW50
KGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+b3JpZW50YXRp
b24oKSk7CisKKyAgICBpZiAoIShtX3BsdWdpbi0+cXVpcmtzKCkuY29udGFpbnMoUGx1Z2luUXVp
cmtEZWZlckZpcnN0U2V0V2luZG93Q2FsbCkpKSB7CisgICAgICAgIHVwZGF0ZVBsdWdpbldpZGdl
dCgpOworICAgICAgICBzZXROUFdpbmRvd0lmTmVlZGVkKCk7CisgICAgfQorCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6cGxhdGZvcm1EZXN0cm95KCkKK3sKKyAgICBp
ZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhpcyB3aWxsIHVubG9j
ayB0aGUgaWRsZSAoaWYgd2UgaGF2ZSBsb2NrZWQgaXQpLgorICAgIG1fcHJpdmF0ZS0+cHJldmVu
dElkbGUoZmFsc2UpOworCisgICAgLy8gVGhpcyB3aWxsIHJlbGVhc2UgYW55IGtlZXBWaXNpYmxl
UmVjdHMgaWYgdGhleSB3ZXJlIHNldC4KKyAgICBtX3ByaXZhdGUtPmNsZWFyVmlzaWJsZVJlY3Rz
KCk7CisKKyAgICAvLyBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgd2UgdW5yZWdpc3RlcmVkIHRoZSBw
bHVnaW4uCisgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVW
aWV3Kj4ocGFyZW50KCkpKSB7CisgICAgICAgIGlmIChtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5k
UGxheWluZykKKyAgICAgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBh
Z2VDbGllbnQoKS0+b25QbHVnaW5TdG9wQmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2YXRlLT5t
X3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKKworICAgICAgICAvLyBJZiB3ZSB3ZXJlIHN0
aWxsIGZ1bGxzY3JlZW4sIGVuc3VyZSB3ZSBub3RpZnkgZXZlcnlvbmUgd2UncmUgbm90LgorICAg
ICAgICBpZiAobV9wcml2YXRlLT5tX2lzRnVsbFNjcmVlbikKKyAgICAgICAgICAgIGZyYW1lVmll
dy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+ZGlkUGx1Z2luRXhpdEZ1bGxT
Y3JlZW4odGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKKwor
ICAgICAgICBpZiAobV9wcml2YXRlLT5tX29yaWVudGF0aW9uTG9ja2VkKQorICAgICAgICAgICAg
ZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT51bmxvY2tPcmll
bnRhdGlvbigpOworCisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBh
Z2VDbGllbnQoKS0+cmVnaXN0ZXJQbHVnaW4odGhpcywgZmFsc2UgLypzaG91bGRSZWdpc3Rlciov
KTsKKyAgICB9CisKKyAgICBtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZyA9IGZhbHNl
OworICAgIG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4gPSBmYWxzZTsKKworICAgIGRlbGV0ZSBt
X3ByaXZhdGU7CisgICAgbV9wcml2YXRlID0gMDsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYWx0
KCkKK3sKK30KKwordm9pZCBQbHVnaW5WaWV3OjpyZXN0YXJ0KCkKK3sKK30KKwordm9pZCBQbHVn
aW5WaWV3OjpnZXRXaW5kb3dJbmZvKFZlY3RvcjxQbHVnaW5XaW5kb3dJbmZvPiYgd2luZG93TGlz
dCkKK3sKKyAgICBpZiAoIW1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5nZXR2YWx1ZSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgdm9pZCogdmFsUHRyID0gMDsKKworICAgIFBsdWdpblZpZXc6OnNl
dEN1cnJlbnRQbHVnaW5WaWV3KHRoaXMpOworICAgIEpTQzo6SlNMb2NrOjpEcm9wQWxsTG9ja3Mg
ZHJvcEFsbExvY2tzKEpTQzo6U2lsZW5jZUFzc2VydGlvbnNPbmx5KTsKKyAgICBzZXRDYWxsaW5n
UGx1Z2luKHRydWUpOworICAgIG1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5nZXR2YWx1ZShtX2lu
c3RhbmNlLCBOUFBWcGx1Z2luU2NyZWVuV2luZG93LCAmdmFsUHRyKTsKKyAgICBzZXRDYWxsaW5n
UGx1Z2luKGZhbHNlKTsKKyAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldygwKTsK
KworICAgIGlmICghdmFsUHRyKQorICAgICAgICByZXR1cm47CisKKyAgICBOUFNjcmVlbldpbmRv
d0hhbmRsZXMqIHNjcmVlbldpbkhhbmRsZXMgPSBzdGF0aWNfY2FzdDxOUFNjcmVlbldpbmRvd0hh
bmRsZXMqPih2YWxQdHIpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY3JlZW5XaW5IYW5k
bGVzLT5udW1PZldpbmRvd3M7IGkrKykgeworICAgICAgICBQbHVnaW5XaW5kb3dJbmZvIGluZm87
CisgICAgICAgIGluZm8ud2luZG93UHRyID0gc2NyZWVuV2luSGFuZGxlcy0+d2luZG93SGFuZGxl
c1tpXTsKKworICAgICAgICBOUFJlY3QqIHJjID0gc2NyZWVuV2luSGFuZGxlcy0+d2luZG93UmVj
dHNbaV07CisgICAgICAgIGluZm8ud2luZG93UmVjdCA9IEludFJlY3QocmMtPmxlZnQsIHJjLT50
b3AsIHJjLT5yaWdodCAtIHJjLT5sZWZ0LCByYy0+Ym90dG9tIC0gcmMtPnRvcCk7CisKKyAgICAg
ICAgd2luZG93TGlzdC5hcHBlbmQoaW5mbyk7CisgICAgfQorfQorCitCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogUGx1Z2luVmlldzo6bG9ja0Zyb250QnVmZmVyRm9yUmVh
ZCgpIGNvbnN0Cit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGJ1ZmZlciA9IG1fcHJp
dmF0ZS0+bG9ja1JlYWRGcm9udEJ1ZmZlckludGVybmFsKCk7CisKKyAgICBpZiAoIWJ1ZmZlcikK
KyAgICAgICAgbV9wcml2YXRlLT51bmxvY2tSZWFkRnJvbnRCdWZmZXIoKTsKKworICAgIHJldHVy
biBidWZmZXI7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6dW5sb2NrRnJvbnRCdWZmZXIoKSBjb25z
dAoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisgICAgbV9wcml2YXRl
LT51bmxvY2tSZWFkRnJvbnRCdWZmZXIoKTsKK30KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKK1BsYXRmb3JtTGF5ZXIqIFBsdWdpblZpZXc6OnBsYXRmb3JtTGF5ZXIoKSBjb25z
dAoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4g
bV9wcml2YXRlLT5tX3BsYXRmb3JtTGF5ZXIuZ2V0KCk7Cit9CisjZW5kaWYKKworSW50UmVjdCBQ
bHVnaW5WaWV3OjplbnN1cmVWaXNpYmxlUmVjdCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisg
ICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisgICAgcmV0dXJuIG1fcHJpdmF0ZS0+bV9rZWVwVmlz
aWJsZVJlY3Q7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0QmFja2dyb3VuZFBsYXkoYm9vbCB2
YWx1ZSkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSB8fCBtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5k
UGxheWluZyA9PSB2YWx1ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWVWaWV3KiBmcmFt
ZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3ByaXZhdGUtPm1fdmlldy0+cGFyZW50
KCkpOworICAgIG1fcHJpdmF0ZS0+bV9pc0JhY2tncm91bmRQbGF5aW5nID0gdmFsdWU7CisgICAg
aWYgKG1fcHJpdmF0ZS0+bV9pc0JhY2tncm91bmRQbGF5aW5nKQorICAgICAgICBmcmFtZVZpZXct
Pmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPm9uUGx1Z2luU3RhcnRCYWNrZ3Jv
dW5kUGxheSh0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpOwor
ICAgIGVsc2UKKyAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNs
aWVudCgpLT5vblBsdWdpblN0b3BCYWNrZ3JvdW5kUGxheSh0aGlzLCBtX3ByaXZhdGUtPm1fcGx1
Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
Kwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117347</attachid>
            <date>2011-11-30 22:58:52 -0800</date>
            <delta_ts>2011-12-13 19:40:47 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73397-20111201145927.patch</filename>
            <type>text/plain</type>
            <size>45998</size>
            <attacher name="Charles Wei">charles.wei</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwMTYxMykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBACisyMDExLTExLTMwICBXZWkgQ2hh
cmxlcyAgPGNoYXJsZXMud2VpQHRvcmNobW9iaWxlLmNvbS5jbj4KKworICAgICAgICBbQmxhY2tC
ZXJyeV0gVXBzdHJlYW0gQmxhY2tCZXJyeSBwb3J0aW5nIG9mIHBsdWdpblZpZXcKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczMzk3CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIGZvciBu
b3cuCisKKyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld0JsYWNrQmVycnku
Y3BwOiBBZGRlZC4KKwogMjAxMS0xMS0zMCAgSGFucyBNdWxsZXIgIDxobXVsbGVyQGFkb2JlLmNv
bT4KIAogICAgICAgICBYSFIgJ3Byb2dyZXNzJyBldmVudCBjb2RlIGFzc3VtZXMgd3JvbmdseSB0
aGF0IGV4cGVjdGVkTGVuZ3RoID49IDAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxh
Y2tiZXJyeS9QbHVnaW5WaWV3QmxhY2tCZXJyeS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1BsdWdpblZpZXdCbGFja0JlcnJ5LmNwcAkocmV2aXNp
b24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5WaWV3Qmxh
Y2tCZXJyeS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTM3MiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog
Q29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDkgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRi
aWFzLmluPgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVk
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiUGx1Z2luVmlldy5oIgorCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNs
dWRlICJFdmVudC5oIgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKKyNpbmNsdWRlICJGcmFtZS5o
IgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1
ZGUgIkhUTUxQbHVnSW5FbGVtZW50LmgiCisjaW5jbHVkZSAiSG9zdFdpbmRvdy5oIgorI2luY2x1
ZGUgIkpTRE9NQmluZGluZy5oIgorI2luY2x1ZGUgIktleWJvYXJkRXZlbnQuaCIKKyNpbmNsdWRl
ICJNb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiTlBDYWxsYmFja3NCbGFja0JlcnJ5LmgiCisjaW5j
bHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGxh
dGZvcm1Db250ZXh0U2tpYS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVudC5oIgor
I2luY2x1ZGUgIlBsdWdpbkRlYnVnLmgiCisjaW5jbHVkZSAiUGx1Z2luTWFpblRocmVhZFNjaGVk
dWxlci5oIgorI2luY2x1ZGUgIlBsdWdpblBhY2thZ2UuaCIKKyNpbmNsdWRlICJQbHVnaW5WaWV3
UHJpdmF0ZUJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJSZW5kZXJMYXllci5oIgorI2luY2x1ZGUg
IlNldHRpbmdzLmgiCisjaW5jbHVkZSAiVG91Y2hFdmVudC5oIgorI2luY2x1ZGUgIlRvdWNoTGlz
dC5oIgorI2luY2x1ZGUgIldoZWVsRXZlbnQuaCIKKyNpbmNsdWRlICJucHJ1bnRpbWVfaW1wbC5o
IgorI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudC5oIgor
I2luY2x1ZGUgIlBsdWdpbkxheWVyV2ViS2l0VGhyZWFkLmgiCisjZW5kaWYKKworI2luY2x1ZGUg
PEJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRm
b3JtSW50UmVjdFJlZ2lvbi5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVByaW1pdGl2
ZXMuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1XaW5kb3cuaD4KKworI2luY2x1ZGUg
PHJ1bnRpbWUvSlNMb2NrLmg+CisjaW5jbHVkZSA8cnVudGltZS9KU1ZhbHVlLmg+CisjaW5jbHVk
ZSA8c3lzL2tleWNvZGVzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCitjb25zdCB1bnNpZ25lZCBV
bmluaXRpYWxpemVkQ29vcmRpbmF0ZSA9IDB4ZmZmZmZmZmY7CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKwordGVtcGxhdGU8Y2xhc3MgVD4gc3RhdGljIE5QUmVjdCB0b05QUmVjdChjb25zdCBUJiBy
ZWN0KQoreworICAgIE5QUmVjdCBucFJlY3Q7CisgICAgbnBSZWN0LnRvcCA9IHJlY3QueSgpOwor
ICAgIG5wUmVjdC5sZWZ0ID0gcmVjdC54KCk7CisgICAgbnBSZWN0LmJvdHRvbSA9IHJlY3QueSgp
ICsgcmVjdC5oZWlnaHQoKTsKKyAgICBucFJlY3QucmlnaHQgPSByZWN0LngoKSArIHJlY3Qud2lk
dGgoKTsKKyAgICByZXR1cm4gbnBSZWN0OworfQorCit1c2luZyBKU0M6OkV4ZWNTdGF0ZTsKK3Vz
aW5nIEpTQzo6SW50ZXJwcmV0ZXI7Cit1c2luZyBKU0M6OkpTTG9jazsKK3VzaW5nIEpTQzo6SlNP
YmplY3Q7Cit1c2luZyBKU0M6OlVTdHJpbmc7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2lu
ZyBuYW1lc3BhY2UgV1RGOwordXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKKwordm9pZCBQbHVn
aW5WaWV3Ojp1cGRhdGVQbHVnaW5XaWRnZXQoKQoreworICAgIGlmICghcGFyZW50KCkgfHwgIW1f
cHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKHBhcmVudCgpLT5pc0ZyYW1l
VmlldygpKTsKKyAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmll
dyo+KHBhcmVudCgpKTsKKworICAgIEludFJlY3Qgb2xkV2luZG93UmVjdCA9IG1fd2luZG93UmVj
dDsKKyAgICBJbnRSZWN0IG9sZENsaXBSZWN0ID0gbV9jbGlwUmVjdDsKKworICAgIG1fd2luZG93
UmVjdCA9IEludFJlY3QoZnJhbWVWaWV3LT5jb250ZW50c1RvV2luZG93KGZyYW1lUmVjdCgpLmxv
Y2F0aW9uKCkpLCBmcmFtZVJlY3QoKS5zaXplKCkpOworCisgICAgLy8gTWFwIHJlY3QgdG8gY29u
dGVudCBjb29yZGluYXRlIHNwYWNlIG9mIG1haW4gZnJhbWUuCisgICAgbV93aW5kb3dSZWN0Lm1v
dmUocm9vdCgpLT5zY3JvbGxPZmZzZXQoKSk7CisKKyAgICBtX2NsaXBSZWN0ID0gY2FsY3VsYXRl
Q2xpcFJlY3QoKTsKKyAgICBJbnRSZWN0IGYgPSBmcmFtZVJlY3QoKTsKKworICAgIC8vIE5vdGlm
eSB0aGUgcGx1Z2luIGlmIGl0IG1heSBvciBtYXkgbm90IGJlIG9uL29mZnNjcmVlbi4KKyAgICBo
YW5kbGVTY3JvbGxFdmVudCgpOworCisgICAgYm9vbCB6b29tRmFjdG9yQ2hhbmdlZCA9ICgoTlBT
ZXRXaW5kb3dDYWxsYmFja1N0cnVjdCopbV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3Rvcgor
ICAgICAgICAhPSBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCkt
PmN1cnJlbnRab29tRmFjdG9yKCk7CisKKyAgICBpZiAoIXpvb21GYWN0b3JDaGFuZ2VkICYmIG1f
d2luZG93UmVjdCA9PSBvbGRXaW5kb3dSZWN0ICYmIG1fY2xpcFJlY3QgPT0gb2xkQ2xpcFJlY3Qp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIERvIG5vdCBjYWxsIHNldE5QV2luZG93SWZOZWVk
ZWQgaW1tZWRpYXRlbHksIHdpbGwgYmUgY2FsbGVkIG9uIHBhaW50KCkuCisgICAgbV9wcml2YXRl
LT5tX2hhc1BlbmRpbmdHZW9tZXRyeUNoYW5nZSA9IHRydWU7CisKKyAgICAvLyAoaSkgSW4gb3Jk
ZXIgdG8gbW92ZS9yZXNpemUgdGhlIHBsdWdpbiB3aW5kb3cgYXQgdGhlIHNhbWUgdGltZSBhcyB0
aGUKKyAgICAvLyByZXN0IG9mIGZyYW1lIGR1cmluZyBlLmcuIHNjcm9sbGluZywgd2Ugc2V0IHRo
ZSB3aW5kb3cgZ2VvbWV0cnkKKyAgICAvLyBpbiB0aGUgcGFpbnQoKSBmdW5jdGlvbiwgYnV0IGFz
IHBhaW50KCkgaXNuJ3QgY2FsbGVkIHdoZW4gdGhlCisgICAgLy8gcGx1Z2luIHdpbmRvdyBpcyBv
dXRzaWRlIHRoZSBmcmFtZSB3aGljaCBjYW4gYmUgY2F1c2VkIGJ5IGEKKyAgICAvLyBzY3JvbGws
IHdlIG5lZWQgdG8gbW92ZS9yZXNpemUgaW1tZWRpYXRlbHkuCisgICAgLy8gKGlpKSBJZiB3ZSBh
cmUgcnVubmluZyBsYXlvdXQgdGVzdHMgZnJvbSBEUlQsIHBhaW50KCkgd29uJ3QgZXZlciBnZXQg
Y2FsbGVkCisgICAgLy8gc28gd2UgbmVlZCB0byBjYWxsIHNldE5QV2luZG93SWZOZWVkZWQoKSBp
ZiB3aW5kb3cgZ2VvbWV0cnkgaGFzIGNoYW5nZWQuCisgICAgaWYgKG1fY2xpcFJlY3QuaXNFbXB0
eSgpIHx8IChwbGF0Zm9ybVBsdWdpbldpZGdldCgpICYmIChtX3dpbmRvd1JlY3QgIT0gb2xkV2lu
ZG93UmVjdCB8fCBtX2NsaXBSZWN0ICE9IG9sZENsaXBSZWN0IHx8IHpvb21GYWN0b3JDaGFuZ2Vk
KSkpCisgICAgICAgIHNldE5QV2luZG93SWZOZWVkZWQoKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3
ZSBnZXQgcmVwYWludGVkIGFmdGVyd2FyZHMuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBkb3dud2Fy
ZAorICAgIC8vIHNjcm9sbGluZyB0byBtb3ZlIHRoZSBwbHVnaW4gd2lkZ2V0IHByb3Blcmx5Lgor
ICAgIGludmFsaWRhdGUoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpzZXRGb2N1cyhib29sIGZv
Y3VzZWQpCit7CisgICAgaWYgKCFtX3ByaXZhdGUgfHwgbV9wcml2YXRlLT5tX2lzRm9jdXNlZCA9
PSBmb2N1c2VkKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQocGxhdGZvcm1QbHVnaW5X
aWRnZXQoKSA9PSBwbGF0Zm9ybVdpZGdldCgpKTsKKyAgICBXaWRnZXQ6OnNldEZvY3VzKGZvY3Vz
ZWQpOworCisgICAgaWYgKGZvY3VzZWQpCisgICAgICAgIGhhbmRsZUZvY3VzSW5FdmVudCgpOwor
ICAgIGVsc2UKKyAgICAgICAgaGFuZGxlRm9jdXNPdXRFdmVudCgpOworfQorCit2b2lkIFBsdWdp
blZpZXc6OnNob3coKQoreworICAgIHNldFNlbGZWaXNpYmxlKHRydWUpOworICAgIFdpZGdldDo6
c2hvdygpOworICAgIHVwZGF0ZVBsdWdpbldpZGdldCgpOworfQorCit2b2lkIFBsdWdpblZpZXc6
OmhpZGUoKQoreworICAgIHNldFNlbGZWaXNpYmxlKGZhbHNlKTsKKyAgICBXaWRnZXQ6OmhpZGUo
KTsKKyAgICB1cGRhdGVQbHVnaW5XaWRnZXQoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3Ojp1cGRh
dGVCdWZmZXIoY29uc3QgSW50UmVjdCYgYnVmZmVyUmVjdCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0
ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVXBkYXRlIHRoZSB6b29tIGZhY3RvciBoZXJl
LCBpdCBoYXBwZW5zIHJpZ2h0IGJlZm9yZSBzZXROUFdpbmRvd0lmTmVlZGVkCisgICAgLy8gZW5z
dXJpbmcgdGhhdCB0aGUgcGx1Z2luIGhhcyBldmVyeSBvcHBvcnR1bml0eSB0byBnZXQgdGhlIHpv
b20gZmFjdG9yIGJlZm9yZQorICAgIC8vIGl0IHBhaW50cyBhbnl0aGluZy4KKyAgICBpZiAoRnJh
bWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSkpCisg
ICAgICAgIG1fcHJpdmF0ZS0+c2V0Wm9vbUZhY3RvcihmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+
cGxhdGZvcm1QYWdlQ2xpZW50KCktPmN1cnJlbnRab29tRmFjdG9yKCkpOworCisgICAgc2V0TlBX
aW5kb3dJZk5lZWRlZCgpOworCisgICAgLy8gQnVpbGQgYW5kIGRpc3BhdGNoIGFuIGV2ZW50IHRv
IHRoZSBwbHVnaW4gdG8gbm90aWZ5IGl0IHdlIGFyZSBhYm91dCB0byBkcmF3IHdoYXRldmVyCisg
ICAgLy8gaXMgaW4gdGhlIGZyb250IGJ1ZmZlci4gVGhpcyBpcyBpdCdzIG9wcG9ydHVuaXR5IHRv
IGRvIGEgc3dhcC4KKyAgICBJbnRSZWN0IGV4cG9zZWRSZWN0KGJ1ZmZlclJlY3QpOworICAgIGV4
cG9zZWRSZWN0LmludGVyc2VjdChJbnRSZWN0KEludFBvaW50KDAsIDApLCBmcmFtZVJlY3QoKS5z
aXplKCkpKTsKKworICAgIC8vIE9ubHkgYXNrIHRoZSBwbHVnaW4gdG8gZHJhdyBpZiB0aGUgZXhw
b3NlZCByZWN0IHdhcyBleHBsaWNpdGx5IGludmFsaWRhdGVkCisgICAgLy8gYnkgdGhlIHBsdWdp
bi4KKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBleHBvc2VkUmVnaW9u
ID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb246OmludGVyc2VjdFJlZ2lvbnMo
bV9wcml2YXRlLT5tX2ludmFsaWRhdGVSZWdpb24sIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRS
ZWN0KGV4cG9zZWRSZWN0KSk7CisgICAgaWYgKCFleHBvc2VkUmVnaW9uLmlzRW1wdHkoKSkgewor
ICAgICAgICBtX3ByaXZhdGUtPm1faW52YWxpZGF0ZVJlZ2lvbiA9IEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFjdFJlZ2lvbnMobV9wcml2YXRlLT5tX2ludmFsaWRh
dGVSZWdpb24sIGV4cG9zZWRSZWdpb24pOworICAgICAgICBzdGQ6OnZlY3RvcjxCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6SW50UmVjdD4gZXhwb3NlZFJlY3RzID0gZXhwb3NlZFJlZ2lvbi5yZWN0cygp
OworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZXhwb3NlZFJlY3RzLnNpemUoKTsg
KytpKSB7CisgICAgICAgICAgICBOUERyYXdFdmVudCBkcmF3OworICAgICAgICAgICAgZHJhdy5w
bHVnaW5SZWN0ID0gdG9OUFJlY3QobV93aW5kb3dSZWN0KTsKKyAgICAgICAgICAgIGRyYXcuY2xp
cFJlY3QgPSB0b05QUmVjdChtX2NsaXBSZWN0KTsKKyAgICAgICAgICAgIGRyYXcuZHJhd1JlY3Qg
PSAoTlBSZWN0KilhbGxvY2Eoc2l6ZW9mKE5QUmVjdCkpOworICAgICAgICAgICAgZHJhdy5kcmF3
UmVjdENvdW50ID0gMTsKKyAgICAgICAgICAgICpkcmF3LmRyYXdSZWN0ID0gdG9OUFJlY3QoZXhw
b3NlZFJlY3RzLmF0KGkpKTsKKyAgICAgICAgICAgIGRyYXcuem9vbUZhY3RvciA9ICgoTlBTZXRX
aW5kb3dDYWxsYmFja1N0cnVjdCopbV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3RvcjsKKwor
ICAgICAgICAgICAgTlBFdmVudCBucEV2ZW50OworICAgICAgICAgICAgbnBFdmVudC50eXBlID0g
TlBfRHJhd0V2ZW50OworICAgICAgICAgICAgbnBFdmVudC5kYXRhID0gJmRyYXc7CisKKyAgICAg
ICAgICAgIC8vIEZJWE1FOiBSZXR1cm4gZWFybHkgaWYgdGhpcyBmYWlscz8gT3IganVzdCByZXBh
aW50PworICAgICAgICAgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworICAgICAgICB9Cisg
ICAgfQorfQorCit2b2lkIFBsdWdpblZpZXc6OnBhaW50KEdyYXBoaWNzQ29udGV4dCogY29udGV4
dCwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSB8fCAhbV9pc1N0
YXJ0ZWQpIHsKKyAgICAgICAgcGFpbnRNaXNzaW5nUGx1Z2luSWNvbihjb250ZXh0LCByZWN0KTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgem9vbSBmYWN0b3Ig
aGVyZSwgaXQgaGFwcGVucyByaWdodCBiZWZvcmUgc2V0TlBXaW5kb3dJZk5lZWRlZAorICAgIC8v
IGVuc3VyaW5nIHRoYXQgdGhlIHBsdWdpbiBoYXMgZXZlcnkgb3Bwb3J0dW5pdHkgdG8gZ2V0IHRo
ZSB6b29tIGZhY3RvciBiZWZvcmUKKyAgICAvLyBpdCBwYWludHMgYW55dGhpbmcuCisgICAgaWYg
KEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkp
KQorICAgICAgICBtX3ByaXZhdGUtPnNldFpvb21GYWN0b3IoZnJhbWVWaWV3LT5ob3N0V2luZG93
KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5jdXJyZW50Wm9vbUZhY3RvcigpKTsKKworICAgIGlm
IChjb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHNl
dE5QV2luZG93SWZOZWVkZWQoKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KyAgICBpZiAobV9wcml2YXRlLT5tX3BsYXRmb3JtTGF5ZXIpCisgICAgICAgIHJldHVybjsKKyNl
bmRpZgorCisgICAgLy8gQnVpbGQgYW5kIGRpc3BhdGNoIGFuIGV2ZW50IHRvIHRoZSBwbHVnaW4g
dG8gbm90aWZ5IGl0IHdlIGFyZSBhYm91dCB0byBkcmF3IHdoYXRldmVyCisgICAgLy8gaXMgaW4g
dGhlIGZyb250IGJ1ZmZlci4gVGhpcyBpcyBpdCdzIG9wcG9ydHVuaXR5IHRvIGRvIGEgc3dhcC4K
KyAgICBJbnRSZWN0IHJlY3RDbGlwKHJlY3QpOworICAgIHJlY3RDbGlwLmludGVyc2VjdChmcmFt
ZVJlY3QoKSk7CisKKyAgICBJbnRSZWN0IGV4cG9zZWRSZWN0KHJlY3RDbGlwKTsKKyAgICBleHBv
c2VkUmVjdC5tb3ZlKC1mcmFtZVJlY3QoKS54KCksIC1mcmFtZVJlY3QoKS55KCkpOworCisgICAg
dXBkYXRlQnVmZmVyKGV4cG9zZWRSZWN0KTsKKworICAgIFB0aHJlYWRSZWFkTG9ja2VyIGZyb250
TG9jaygmbV9wcml2YXRlLT5tX2Zyb250QnVmZmVyUndMb2NrKTsKKworICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBmcm9udEJ1ZmZlciA9CisgICAgICAgIG1fcHJp
dmF0ZS0+bV9wbHVnaW5CdWZmZXJzW21fcHJpdmF0ZS0+bV9wbHVnaW5Gcm9udEJ1ZmZlcl07CisK
KyAgICAvLyBEb24ndCBwYWludCBhbnl0aGluZyBpZiB0aGVyZSBpcyBubyBidWZmZXIuCisgICAg
aWYgKCFmcm9udEJ1ZmZlcikKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCYWNraW5nSW1hZ2UqIGJhY2tpbmdJbWFnZSA9CisgICAg
ICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6bG9ja0J1ZmZlckJhY2tpbmdJbWFn
ZShmcm9udEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6UmVhZEFj
Y2Vzcyk7CisgICAgaWYgKCFiYWNraW5nSW1hZ2UpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IERyYXcgdGhlIGNoYW5nZWQgYnVmZmVyIGNvbnRlbnRzIHRvIHRoZSBzY3JlZW4uCisgICAgY29u
dGV4dC0+c2F2ZSgpOworCisjaWYgVVNFKFNLSUEpCisgICAgY29uc3QgU2tCaXRtYXAmIHBsdWdp
bkltYWdlID0gKmJhY2tpbmdJbWFnZTsKKyAgICBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogZ3Jh
cGhpY3MgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBBU1NFUlQoZ3JhcGhpY3Mp
OworICAgIFNrQ2FudmFzKiBjYW52YXMgPSBncmFwaGljcy0+Y2FudmFzKCk7CisKKyAgICAvLyBT
b3VyY2UgcmVjdGFuZ2xlIHdlIHdpbGwgZHJhdyB0byB0aGUgc2NyZWVuLgorICAgIFNrSVJlY3Qg
c2tTcmNSZWN0OworICAgIHNrU3JjUmVjdC5zZXQoZXhwb3NlZFJlY3QueCgpLCBleHBvc2VkUmVj
dC55KCksCisgICAgICAgICAgICAgICAgICBleHBvc2VkUmVjdC54KCkgKyBleHBvc2VkUmVjdC53
aWR0aCgpLAorICAgICAgICAgICAgICAgICAgZXhwb3NlZFJlY3QueSgpICsgZXhwb3NlZFJlY3Qu
aGVpZ2h0KCkpOworCisgICAgLy8gUHJlcGFyZSB0aGUgaG9sZSBwdW5jaCByZWN0YW5nbGUuCisg
ICAgU2tJUmVjdCB1bmNsaXBwZWRIb2xlUHVuY2hSZWN0OworICAgIHVuY2xpcHBlZEhvbGVQdW5j
aFJlY3Quc2V0KG1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LngoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC55KCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbV9wcml2YXRlLT5tX2hvbGVQdW5jaFJlY3QueCgpICsg
bV9wcml2YXRlLT5tX2hvbGVQdW5jaFJlY3Qud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC55KCkgKyBtX3ByaXZhdGUtPm1f
aG9sZVB1bmNoUmVjdC5oZWlnaHQoKSk7CisKKyAgICAvLyBob2xlUHVuY2hSZWN0IGlzIGNsaXBw
ZWQuCisgICAgU2tJUmVjdCBob2xlUHVuY2hSZWN0OworCisgICAgLy8gQWxsIHNvdXJjZSByZWN0
YW5nbGVzIGFyZSBzY2FsZWQgYnkgdGhlIHpvb20gZmFjdG9yIGJlY2F1c2UgdGhlIHNvdXJjZSBi
aXRtYXAgbWF5IGJlIGEKKyAgICAvLyBoaWdoZXIgcmVzb2x1dGlvbiB0aGFuIHRoZSAxOjEgcGFn
ZS4gVGhpcyBhbGxvd3MgdGhlIGZsYXNoIHBsYXllciB0byBzY2FsZSB0aGUgY29udGVudAorICAg
IC8vIGl0IGlzIGRyYXdpbmcgdG8gbWF0Y2ggdGhlIHNjYWxlIG9mIHRoZSBwYWdlLgorICAgIGRv
dWJsZSB6b29tRmFjdG9ySCA9IHN0YXRpY19jYXN0PGRvdWJsZT4obV9wcml2YXRlLT5tX3BsdWdp
bkJ1ZmZlclNpemUud2lkdGgoKSkgLyBzdGF0aWNfY2FzdDxkb3VibGU+KGZyYW1lUmVjdCgpLndp
ZHRoKCkpOworICAgIGRvdWJsZSB6b29tRmFjdG9yVyA9IHN0YXRpY19jYXN0PGRvdWJsZT4obV9w
cml2YXRlLT5tX3BsdWdpbkJ1ZmZlclNpemUuaGVpZ2h0KCkpIC8gc3RhdGljX2Nhc3Q8ZG91Ymxl
PihmcmFtZVJlY3QoKS5oZWlnaHQoKSk7CisgICAgZG91YmxlIHpvb21GYWN0b3IgPSAoem9vbUZh
Y3RvckggKyB6b29tRmFjdG9yVykgLyAyLjA7CisKKyAgICAvLyBUaGlzIG1ldGhvZCBkcmF3cyBh
IGhvbGUgaWYgc3BlY2lmaWVkLgorICAgIGlmICghbV9wcml2YXRlLT5tX2hvbGVQdW5jaFJlY3Qu
aXNFbXB0eSgpCisgICAgICAgICYmIGhvbGVQdW5jaFJlY3QuaW50ZXJzZWN0KHVuY2xpcHBlZEhv
bGVQdW5jaFJlY3QsIHNrU3JjUmVjdCkpIHsKKworICAgICAgICAvLyBEcmF3IHRoZSB0b3AgY2h1
bmsgaWYgbmVlZGVkLgorICAgICAgICBpZiAoaG9sZVB1bmNoUmVjdC5mVG9wID4gc2tTcmNSZWN0
LmZUb3ApIHsKKyAgICAgICAgICAgIFNrSVJlY3Qgc3JjUmVjdDsKKyAgICAgICAgICAgIHNyY1Jl
Y3Quc2V0KHNrU3JjUmVjdC5mTGVmdCAqIHpvb21GYWN0b3IsIHNrU3JjUmVjdC5mVG9wICogem9v
bUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrU3JjUmVjdC5mUmlnaHQgKiB6b29t
RmFjdG9yLCBob2xlUHVuY2hSZWN0LmZUb3AgKiB6b29tRmFjdG9yKTsKKworICAgICAgICAgICAg
U2tSZWN0IGRzdFJlY3Q7CisgICAgICAgICAgICBkc3RSZWN0LnNldChza1NyY1JlY3QuZkxlZnQs
IHNrU3JjUmVjdC5mVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgc2tTcmNSZWN0LmZSaWdo
dCwgaG9sZVB1bmNoUmVjdC5mVG9wKTsKKyAgICAgICAgICAgIGRzdFJlY3Qub2Zmc2V0KGZyYW1l
UmVjdCgpLngoKSwgZnJhbWVSZWN0KCkueSgpKTsKKworICAgICAgICAgICAgY2FudmFzLT5kcmF3
Qml0bWFwUmVjdChwbHVnaW5JbWFnZSwgJnNyY1JlY3QsIGRzdFJlY3QpOworICAgICAgICB9CisK
KyAgICAgICAgLy8gRHJhdyB0aGUgbGVmdCBjaHVuayBpZiBuZWVkZWQuCisgICAgICAgIGlmICho
b2xlUHVuY2hSZWN0LmZMZWZ0ID4gc2tTcmNSZWN0LmZMZWZ0KSB7CisgICAgICAgICAgICBTa0lS
ZWN0IHNyY1JlY3Q7CisgICAgICAgICAgICBzcmNSZWN0LnNldChza1NyY1JlY3QuZkxlZnQgKiB6
b29tRmFjdG9yLCBob2xlUHVuY2hSZWN0LmZUb3AgKiB6b29tRmFjdG9yLAorICAgICAgICAgICAg
ICAgICAgICAgICAgaG9sZVB1bmNoUmVjdC5mTGVmdCAqIHpvb21GYWN0b3IsIGhvbGVQdW5jaFJl
Y3QuZkJvdHRvbSAqIHpvb21GYWN0b3IpOworCisgICAgICAgICAgICBTa1JlY3QgZHN0UmVjdDsK
KyAgICAgICAgICAgIGRzdFJlY3Quc2V0KHNrU3JjUmVjdC5mTGVmdCwgaG9sZVB1bmNoUmVjdC5m
VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgaG9sZVB1bmNoUmVjdC5mTGVmdCwgaG9sZVB1
bmNoUmVjdC5mQm90dG9tKTsKKyAgICAgICAgICAgIGRzdFJlY3Qub2Zmc2V0KGZyYW1lUmVjdCgp
LngoKSwgZnJhbWVSZWN0KCkueSgpKTsKKworICAgICAgICAgICAgY2FudmFzLT5kcmF3Qml0bWFw
UmVjdChwbHVnaW5JbWFnZSwgJnNyY1JlY3QsIGRzdFJlY3QpOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gRHJhdyB0aGUgaG9sZSBjaHVuay4KKyAgICAgICAgeworICAgICAgICAgICAgU2tQYWlu
dCBwYWludDsKKyAgICAgICAgICAgIHBhaW50LnNldFhmZXJtb2RlTW9kZShTa1hmZXJtb2RlOjpr
U3JjX01vZGUpOworCisgICAgICAgICAgICBTa0lSZWN0IHNyY1JlY3Q7CisgICAgICAgICAgICBz
cmNSZWN0LnNldChob2xlUHVuY2hSZWN0LmZMZWZ0ICogem9vbUZhY3RvciwgaG9sZVB1bmNoUmVj
dC5mVG9wICogem9vbUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvbGVQdW5jaFJl
Y3QuZlJpZ2h0ICogem9vbUZhY3RvciwgaG9sZVB1bmNoUmVjdC5mQm90dG9tICogem9vbUZhY3Rv
cik7CisKKyAgICAgICAgICAgIFNrUmVjdCBkc3RSZWN0OworICAgICAgICAgICAgZHN0UmVjdC5z
ZXQoaG9sZVB1bmNoUmVjdC5mTGVmdCwgaG9sZVB1bmNoUmVjdC5mVG9wLAorICAgICAgICAgICAg
ICAgICAgICAgICAgaG9sZVB1bmNoUmVjdC5mUmlnaHQsIGhvbGVQdW5jaFJlY3QuZkJvdHRvbSk7
CisgICAgICAgICAgICBkc3RSZWN0Lm9mZnNldChmcmFtZVJlY3QoKS54KCksIGZyYW1lUmVjdCgp
LnkoKSk7CisKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd0JpdG1hcFJlY3QocGx1Z2luSW1hZ2Us
ICZzcmNSZWN0LCBkc3RSZWN0LCAmcGFpbnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRHJh
dyB0aGUgcmlnaHQgY2h1bmsgaWYgbmVlZGVkLgorICAgICAgICBpZiAoaG9sZVB1bmNoUmVjdC5m
UmlnaHQgPCBza1NyY1JlY3QuZlJpZ2h0KSB7CisgICAgICAgICAgICBTa0lSZWN0IHNyY1JlY3Q7
CisgICAgICAgICAgICBzcmNSZWN0LnNldChob2xlUHVuY2hSZWN0LmZSaWdodCAqIHpvb21GYWN0
b3IsIGhvbGVQdW5jaFJlY3QuZlRvcCAqIHpvb21GYWN0b3IsCisgICAgICAgICAgICAgICAgICAg
ICAgICBza1NyY1JlY3QuZlJpZ2h0ICogem9vbUZhY3RvciwgaG9sZVB1bmNoUmVjdC5mQm90dG9t
ICogem9vbUZhY3Rvcik7CisKKyAgICAgICAgICAgIFNrUmVjdCBkc3RSZWN0OworICAgICAgICAg
ICAgZHN0UmVjdC5zZXQoaG9sZVB1bmNoUmVjdC5mUmlnaHQsIGhvbGVQdW5jaFJlY3QuZlRvcCwK
KyAgICAgICAgICAgICAgICAgICAgICAgIHNrU3JjUmVjdC5mUmlnaHQsIGhvbGVQdW5jaFJlY3Qu
ZkJvdHRvbSk7CisgICAgICAgICAgICBkc3RSZWN0Lm9mZnNldChmcmFtZVJlY3QoKS54KCksIGZy
YW1lUmVjdCgpLnkoKSk7CisKKyAgICAgICAgICAgIGNhbnZhcy0+ZHJhd0JpdG1hcFJlY3QocGx1
Z2luSW1hZ2UsICZzcmNSZWN0LCBkc3RSZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERy
YXcgdGhlIGJvdHRvbSBjaHVuayBpZiBuZWVkZWQuCisgICAgICAgIGlmIChob2xlUHVuY2hSZWN0
LmZCb3R0b20gPCBza1NyY1JlY3QuZkJvdHRvbSkgeworICAgICAgICAgICAgU2tJUmVjdCBzcmNS
ZWN0OworICAgICAgICAgICAgc3JjUmVjdC5zZXQoc2tTcmNSZWN0LmZMZWZ0ICogem9vbUZhY3Rv
ciwgaG9sZVB1bmNoUmVjdC5mQm90dG9tICogem9vbUZhY3RvciwKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHNrU3JjUmVjdC5mUmlnaHQgKiB6b29tRmFjdG9yLCBza1NyY1JlY3QuZkJvdHRvbSAq
IHpvb21GYWN0b3IpOworCisgICAgICAgICAgICBTa1JlY3QgZHN0UmVjdDsKKyAgICAgICAgICAg
IGRzdFJlY3Quc2V0KHNrU3JjUmVjdC5mTGVmdCwgaG9sZVB1bmNoUmVjdC5mQm90dG9tLAorICAg
ICAgICAgICAgICAgICAgICAgICAgc2tTcmNSZWN0LmZSaWdodCwgc2tTcmNSZWN0LmZCb3R0b20p
OworICAgICAgICAgICAgZHN0UmVjdC5vZmZzZXQoZnJhbWVSZWN0KCkueCgpLCBmcmFtZVJlY3Qo
KS55KCkpOworCisgICAgICAgICAgICBjYW52YXMtPmRyYXdCaXRtYXBSZWN0KHBsdWdpbkltYWdl
LCAmc3JjUmVjdCwgZHN0UmVjdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBT
a0lSZWN0IHNyY1JlY3Q7CisgICAgICAgIHNyY1JlY3Quc2V0KHNrU3JjUmVjdC5mTGVmdCAqIHpv
b21GYWN0b3IsIHNrU3JjUmVjdC5mVG9wICogem9vbUZhY3RvciwKKyAgICAgICAgICAgICAgICAg
ICAgc2tTcmNSZWN0LmZSaWdodCAqIHpvb21GYWN0b3IsIHNrU3JjUmVjdC5mQm90dG9tICogem9v
bUZhY3Rvcik7CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5n
bGUuCisgICAgICAgIFNrUmVjdCBkc3RSZWN0OworICAgICAgICBkc3RSZWN0LnNldChyZWN0Q2xp
cC54KCksIHJlY3RDbGlwLnkoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjdENsaXAueCgpICsg
cmVjdENsaXAud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVjdENsaXAueSgpICsgcmVj
dENsaXAuaGVpZ2h0KCkpOworCisgICAgICAgIC8vIERvbid0IHB1bmNoIGEgaG9sZS4KKyAgICAg
ICAgY2FudmFzLT5kcmF3Qml0bWFwUmVjdChwbHVnaW5JbWFnZSwgJnNyY1JlY3QsIGRzdFJlY3Qp
OworICAgIH0KKyNlbHNlCisjd2FybmluZyAiSW1wbGVtZW50IG1lISIKKyAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyNlbmRpZgorCisgICAgY29udGV4dC0+cmVzdG9yZSgpOworCisgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpyZWxlYXNlQnVmZmVyQmFja2luZ0ltYWdlKGZy
b250QnVmZmVyKTsKK30KKworCitib29sIFBsdWdpblZpZXc6OmRpc3BhdGNoRnVsbFNjcmVlbk5Q
RXZlbnQoTlBFdmVudCYgZXZlbnQpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIEFTU0VSVChtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuKTsKKyAg
ICByZXR1cm4gZGlzcGF0Y2hOUEV2ZW50KGV2ZW50KTsKK30KKworLy8gRklYTUU6IFVuaWZ5IGFj
cm9zcyBwb3J0cy4KK2Jvb2wgUGx1Z2luVmlldzo6ZGlzcGF0Y2hOUEV2ZW50KE5QRXZlbnQmIGV2
ZW50KQoreworICAgIGlmICghbV9wbHVnaW4gfHwgIW1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5l
dmVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUGx1Z2luVmlldzo6c2V0Q3VycmVu
dFBsdWdpblZpZXcodGhpcyk7CisgICAgSlNDOjpKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxs
TG9ja3MoSlNDOjpTaWxlbmNlQXNzZXJ0aW9uc09ubHkpOworICAgIHNldENhbGxpbmdQbHVnaW4o
dHJ1ZSk7CisKKyAgICBib29sIGFjY2VwdGVkID0gbV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPmV2
ZW50KG1faW5zdGFuY2UsICZldmVudCk7CisKKyAgICBzZXRDYWxsaW5nUGx1Z2luKGZhbHNlKTsK
KyAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldygwKTsKKworICAgIHJldHVybiBh
Y2NlcHRlZDsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVLZXlib2FyZEV2ZW50KEtleWJv
YXJkRXZlbnQqIGV2ZW50KQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBOUEtleWJvYXJk
RXZlbnQga2V5RXZlbnQ7CisgICAgY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50ICpwbGF0Zm9y
bUtleUV2ZW50ID0gZXZlbnQtPmtleUV2ZW50KCk7CisKKyAgICBrZXlFdmVudC5tb2RpZmllcnMg
PSAwOworCisgICAgaWYgKHBsYXRmb3JtS2V5RXZlbnQtPnNoaWZ0S2V5KCkpCisgICAgICAgIGtl
eUV2ZW50Lm1vZGlmaWVycyB8PSBLRVlNT0RfU0hJRlQ7CisKKyAgICBpZiAocGxhdGZvcm1LZXlF
dmVudC0+Y3RybEtleSgpKQorICAgICAgICBrZXlFdmVudC5tb2RpZmllcnMgfD0gS0VZTU9EX0NU
Ukw7CisKKyAgICBpZiAocGxhdGZvcm1LZXlFdmVudC0+YWx0S2V5KCkpCisgICAgICAgIGtleUV2
ZW50Lm1vZGlmaWVycyB8PSBLRVlNT0RfQUxUOworCisgICAgaWYgKHBsYXRmb3JtS2V5RXZlbnQt
Pm1ldGFLZXkoKSkKKyAgICAgICAga2V5RXZlbnQubW9kaWZpZXJzIHw9IEtFWU1PRF9BTFRHUjsK
KworICAgIGtleUV2ZW50LmNhcCA9IHBsYXRmb3JtS2V5RXZlbnQtPnVubW9kaWZpZWRDaGFyYWN0
ZXIoKTsKKyAgICBrZXlFdmVudC5zeW0gPSBrZXlFdmVudC5jYXA7CisgICAga2V5RXZlbnQuc2Nh
biA9IDA7CisgICAga2V5RXZlbnQuZmxhZ3MgPSAwOworCisgICAgaWYgKHBsYXRmb3JtS2V5RXZl
bnQtPnR5cGUoKSA9PSBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6OlJhd0tleURvd24KKyAgICAgICAg
fHwgcGxhdGZvcm1LZXlFdmVudC0+dHlwZSgpID09IFBsYXRmb3JtS2V5Ym9hcmRFdmVudDo6S2V5
RG93bikgeworICAgICAgICBrZXlFdmVudC5mbGFncyA9IEtFWV9ET1dOIHwgS0VZX1NZTV9WQUxJ
RCB8IEtFWV9DQVBfVkFMSUQ7CisgICAgfSBlbHNlIGlmIChwbGF0Zm9ybUtleUV2ZW50LT50eXBl
KCkgPT0gUGxhdGZvcm1LZXlib2FyZEV2ZW50OjpLZXlVcCkKKyAgICAgICAga2V5RXZlbnQuZmxh
Z3MgPSBLRVlfU1lNX1ZBTElEIHwgS0VZX0NBUF9WQUxJRDsKKworICAgIG5wRXZlbnQudHlwZSA9
IE5QX0tleUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICZrZXlFdmVudDsKKyAgICBpZiAoZGlz
cGF0Y2hOUEV2ZW50KG5wRXZlbnQpKQorICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQo
KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVXaGVlbEV2ZW50KFdoZWVsRXZlbnQqIGV2
ZW50KQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAo
IW1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQpCisgICAgICAgIGZvY3VzUGx1Z2luRWxlbWVudCgpOwor
CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIE5QV2hlZWxFdmVudCB3aGVlbEV2ZW50OworCisg
ICAgd2hlZWxFdmVudC54ID0gZXZlbnQtPm9mZnNldFgoKTsKKyAgICB3aGVlbEV2ZW50LnkgPSBl
dmVudC0+b2Zmc2V0WSgpOworCisgICAgd2hlZWxFdmVudC5mbGFncyA9IDA7CisKKyAgICB3aGVl
bEV2ZW50LnhEZWx0YSA9IGV2ZW50LT5yYXdEZWx0YVgoKTsKKyAgICB3aGVlbEV2ZW50LnlEZWx0
YSA9IGV2ZW50LT5yYXdEZWx0YVkoKTsKKworICAgIG5wRXZlbnQudHlwZSA9IE5QX1doZWVsRXZl
bnQ7CisgICAgbnBFdmVudC5kYXRhID0gJndoZWVsRXZlbnQ7CisKKyAgICBpZiAoZGlzcGF0Y2hO
UEV2ZW50KG5wRXZlbnQpKSB7CisgICAgICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwor
ICAgICAgICBldmVudC0+c2V0UGx1Z2luSGFuZGxlZCgpOworICAgIH0KK30KKwordm9pZCBQbHVn
aW5WaWV3OjpoYW5kbGVUb3VjaEV2ZW50KFRvdWNoRXZlbnQqIGV2ZW50KQoreworICAgIGlmICgh
bV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1fcHJpdmF0ZS0+bV9pc0Zv
Y3VzZWQpCisgICAgICAgIGZvY3VzUGx1Z2luRWxlbWVudCgpOworCisgICAgTlBUb3VjaEV2ZW50
IG5wVG91Y2hFdmVudDsKKworICAgIGlmIChldmVudC0+aXNEb3VibGVUYXAoKSkKKyAgICAgICAg
bnBUb3VjaEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9ET1VCTEVUQVA7CisgICAgZWxzZSBpZiAo
ZXZlbnQtPmlzVG91Y2hIb2xkKCkpCisgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hf
RVZFTlRfVE9VQ0hIT0xEOworICAgIGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1l
cygpLnRvdWNoc3RhcnRFdmVudCkKKyAgICAgICAgbnBUb3VjaEV2ZW50LnR5cGUgPSBUT1VDSF9F
VkVOVF9TVEFSVDsKKyAgICBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS50
b3VjaGVuZEV2ZW50KQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0VO
RDsKKyAgICBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS50b3VjaG1vdmVF
dmVudCkKKyAgICAgICAgbnBUb3VjaEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9NT1ZFOworICAg
IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLnRvdWNoY2FuY2VsRXZlbnQp
CisgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRfQ0FOQ0VMOworICAgIGVs
c2UgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIFRvdWNoTGlzdCogdG91Y2hMaXN0OworICAgIC8vIFRoZSB0b3VjaGVzIGxpc3Qg
aXMgZW1wdHkgaWYgaW4gYSB0b3VjaCBlbmQgZXZlbnQuIFVzZSBjaGFuZ2VkVG91Y2hlcyBpbnN0
ZWFkLgorICAgIGlmIChucFRvdWNoRXZlbnQudHlwZSA9PSBUT1VDSF9FVkVOVF9ET1VCTEVUQVAg
fHwgbnBUb3VjaEV2ZW50LnR5cGUgPT0gVE9VQ0hfRVZFTlRfRU5EKQorICAgICAgICB0b3VjaExp
c3QgPSBldmVudC0+Y2hhbmdlZFRvdWNoZXMoKTsKKyAgICBlbHNlCisgICAgICAgIHRvdWNoTGlz
dCA9IGV2ZW50LT50b3VjaGVzKCk7CisKKyAgICBucFRvdWNoRXZlbnQucG9pbnRzID0gMDsKKyAg
ICBucFRvdWNoRXZlbnQuc2l6ZSA9IHRvdWNoTGlzdC0+bGVuZ3RoKCk7CisKKyAgICBpZiAodG91
Y2hMaXN0LT5sZW5ndGgoKSkgeworICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzID0gbmV3IE5Q
VG91Y2hQb2ludFt0b3VjaExpc3QtPmxlbmd0aCgpXTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IHRvdWNoTGlzdC0+bGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgVG91Y2gq
IHRvdWNoSXRlbSA9IHRvdWNoTGlzdC0+aXRlbShpKTsKKyAgICAgICAgICAgIG5wVG91Y2hFdmVu
dC5wb2ludHNbaV0udG91Y2hJZCA9IHRvdWNoSXRlbS0+aWRlbnRpZmllcigpOworICAgICAgICAg
ICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5jbGllbnRYID0gdG91Y2hJdGVtLT5wYWdlWCgpIC0g
ZnJhbWVSZWN0KCkueCgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5jbGll
bnRZID0gdG91Y2hJdGVtLT5wYWdlWSgpIC0gZnJhbWVSZWN0KCkueSgpOworICAgICAgICAgICAg
bnBUb3VjaEV2ZW50LnBvaW50c1tpXS5zY3JlZW5YID0gdG91Y2hJdGVtLT5zY3JlZW5YKCk7Cisg
ICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnNjcmVlblkgPSB0b3VjaEl0ZW0tPnNj
cmVlblkoKTsKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHNbaV0ucGFnZVggPSB0b3Vj
aEl0ZW0tPnBhZ2VYKCk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnBhZ2VZ
ID0gdG91Y2hJdGVtLT5wYWdlWSgpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBOUEV2ZW50
IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfVG91Y2hFdmVudDsKKyAgICBucEV2ZW50
LmRhdGEgPSAmbnBUb3VjaEV2ZW50OworCisgICAgaWYgKGRpc3BhdGNoTlBFdmVudChucEV2ZW50
KSkgeworICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKKyAgICAgICAgZXZlbnQt
PnNldFBsdWdpbkhhbmRsZWQoKTsKKyAgICB9IGVsc2UgaWYgKG5wVG91Y2hFdmVudC50eXBlID09
IFRPVUNIX0VWRU5UX0RPVUJMRVRBUCkgeworICAgICAgICAvLyBTZW5kIFRvdWNoIFVwIGlmIGRv
dWJsZSB0YXAgbm90IGNvbnN1bWVkCisgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hf
RVZFTlRfRU5EOworICAgICAgICBucEV2ZW50LmRhdGEgPSAmbnBUb3VjaEV2ZW50OworICAgICAg
ICBpZiAoZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpKSB7CisgICAgICAgICAgICBldmVudC0+c2V0
RGVmYXVsdEhhbmRsZWQoKTsKKyAgICAgICAgICAgIGV2ZW50LT5zZXRQbHVnaW5IYW5kbGVkKCk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGVbXSBucFRvdWNoRXZlbnQucG9pbnRzOwor
fQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZU1vdXNlRXZlbnQoTW91c2VFdmVudCogZXZlbnQp
Cit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9w
cml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAgICAgZm9jdXNQbHVnaW5FbGVtZW50KCk7CisKKyAg
ICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgTlBNb3VzZUV2ZW50IG1vdXNlRXZlbnQ7CisKKyAgICBt
b3VzZUV2ZW50LnggPSBldmVudC0+b2Zmc2V0WCgpOworICAgIG1vdXNlRXZlbnQueSA9IGV2ZW50
LT5vZmZzZXRZKCk7CisKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91
c2Vkb3duRXZlbnQpIHsKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9VU0VfQlVUVE9OX0RP
V047CisgICAgICAgIHBhcmVudEZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5zZXRDYXB0dXJpbmdN
b3VzZUV2ZW50c05vZGUobm9kZSgpKTsKKyAgICB9IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0g
ZXZlbnROYW1lcygpLm1vdXNlbW92ZUV2ZW50KQorICAgICAgICBtb3VzZUV2ZW50LnR5cGUgPSBN
T1VTRV9NT1RJT047CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCku
bW91c2VvdXRFdmVudCkKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9VU0VfT1VUQk9VTkQ7
CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2VvdmVyRXZl
bnQpCisgICAgICAgIG1vdXNlRXZlbnQudHlwZSA9IE1PVVNFX09WRVI7CisgICAgZWxzZSBpZiAo
ZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2V1cEV2ZW50KSB7CisgICAgICAgIG1v
dXNlRXZlbnQudHlwZSA9IE1PVVNFX0JVVFRPTl9VUDsKKyAgICAgICAgcGFyZW50RnJhbWUoKS0+
ZXZlbnRIYW5kbGVyKCktPnNldENhcHR1cmluZ01vdXNlRXZlbnRzTm9kZSgwKTsKKyAgICB9IGVs
c2UKKyAgICAgICAgcmV0dXJuOworCisgICAgbW91c2VFdmVudC5idXR0b24gPSBldmVudC0+YnV0
dG9uKCk7CisgICAgbW91c2VFdmVudC5mbGFncyA9IDA7CisKKyAgICBucEV2ZW50LnR5cGUgPSBO
UF9Nb3VzZUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICZtb3VzZUV2ZW50OworCisgICAgaWYg
KGRpc3BhdGNoTlBFdmVudChucEV2ZW50KSkgeworICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhh
bmRsZWQoKTsKKyAgICAgICAgZXZlbnQtPnNldFBsdWdpbkhhbmRsZWQoKTsKKyAgICB9Cit9CisK
K3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlRm9jdXNJbkV2ZW50KCkKK3sKKyAgICBpZiAoIW1fcHJp
dmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQp
CisgICAgICAgIHJldHVybjsKKworICAgIG1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQgPSB0cnVlOwor
CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0ZvY3VzR2FpbmVk
RXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVu
dCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlRm9jdXNPdXRFdmVudCgpCit7CisgICAg
aWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9wcml2YXRlLT5t
X2lzRm9jdXNlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcml2YXRlLT5tX2lzRm9jdXNl
ZCA9IGZhbHNlOworCisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5Q
X0ZvY3VzTG9zdEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisgICAgZGlzcGF0Y2hOUEV2
ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZVBhdXNlRXZlbnQoKQor
eworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9QYXVzZUV2ZW50
OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOwor
fQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZVJlc3VtZUV2ZW50KCkKK3sKKyAgICBOUEV2ZW50
IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfUmVzdW1lRXZlbnQ7CisgICAgbnBFdmVu
dC5kYXRhID0gMDsKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1
Z2luVmlldzo6aGFuZGxlU2Nyb2xsRXZlbnQoKQoreworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3
ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOworCisgICAgLy8gQXMgYSBzcGVj
aWFsIGNhc2UsIGlmIHRoZSBmcmFtZVZpZXcgZXh0ZW50IGluIGVpdGhlciBkaW1lbnNpb24gaXMK
KyAgICAvLyBlbXB0eSwgdGhlbiBzZW5kIGFuIG9uIHNjcmVlbiBldmVudC4gVGhpcyBpcyBpbXBv
cnRhbnQgZm9yIHNpdGVzIGxpa2UKKyAgICAvLyBwaWNuaWsuY29tIHdoaWNoIHVzZSBhIGhpZGRl
biBpZnJhbWUgKHJlYWQ6IHdpZHRoID0gMCBhbmQgaGVpZ2h0ID0gMCkKKyAgICAvLyB3aXRoIGFu
IGVtYmVkZGVkIHN3ZiB0byBleGVjdXRlIHNvbWUgamF2YXNjcmlwdC4gVW5sZXNzIHdlIHNlbmQg
YW4KKyAgICAvLyBvbiBzY3JlZW4gZXZlbnQgdGhlIHN3ZiB3aWxsIG5vdCBleGVjdXRlIHRoZSBq
YXZhc2NyaXB0IGFuZCB0aGUgcmVhbAorICAgIC8vIHNpdGUgd2lsbCBuZXZlciBsb2FkLgorICAg
IGJvb2wgb25TY3JlZW5FdmVudCA9IGZyYW1lVmlldyAmJiAoIWZyYW1lVmlldy0+d2lkdGgoKSB8
fCAhZnJhbWVWaWV3LT5oZWlnaHQoKSk7CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBF
dmVudC50eXBlID0gbV9jbGlwUmVjdC5pc0VtcHR5KCkgJiYgIW9uU2NyZWVuRXZlbnQgPyBOUF9P
ZmZTY3JlZW5FdmVudCA6IE5QX09uU2NyZWVuRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsK
KyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK0ludFJlY3QgUGx1Z2luVmlldzo6
Y2FsY3VsYXRlQ2xpcFJlY3QoKSBjb25zdAoreworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0g
c3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOworICAgIGJvb2wgdmlzaWJsZSA9IGZy
YW1lVmlldyAmJiBpc1Zpc2libGUoKTsKKworICAgIGlmICh2aXNpYmxlICYmIGZyYW1lVmlldy0+
d2lkdGgoKSAmJiBmcmFtZVZpZXctPmhlaWdodCgpKSB7CisgICAgICAgIEludFNpemUgd2luZG93
U2l6ZSA9IGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+dmll
d3BvcnRTaXplKCk7CisKKyAgICAgICAgLy8gR2V0IHRoZSBjbGlwcGVkIHJlY3RhbmdsZSBmb3Ig
dGhpcyBwbGF5ZXIgd2l0aGluIHRoZSBjdXJyZW50IGZyYW1lLgorICAgICAgICBJbnRSZWN0IHZp
c2libGVDb250ZW50UmVjdDsKKyAgICAgICAgSW50UmVjdCBjb250ZW50UmVjdCA9IG1fZWxlbWVu
dC0+cmVuZGVyZXIoKS0+YWJzb2x1dGVDbGlwcGVkT3ZlcmZsb3dSZWN0KCk7CisgICAgICAgIEZs
b2F0UG9pbnQgY29udGVudExvY2FsID0gbV9lbGVtZW50LT5yZW5kZXJlcigpLT5hYnNvbHV0ZVRv
TG9jYWwoRmxvYXRQb2ludChjb250ZW50UmVjdC5sb2NhdGlvbigpKSk7CisKKyAgICAgICAgY29u
dGVudFJlY3Quc2V0TG9jYXRpb24ocm91bmRlZEludFBvaW50KGNvbnRlbnRMb2NhbCkpOworICAg
ICAgICBjb250ZW50UmVjdC5tb3ZlKGZyYW1lUmVjdCgpLngoKSwgZnJhbWVSZWN0KCkueSgpKTsK
KworICAgICAgICAvLyBDbGlwIGFnYWluc3QgYW55IGZyYW1lcyB0aGF0IHRoZSB3aWRnZXQgaXMg
aW5zaWRlLiBOb3RlIHRoYXQgaWYgdGhlIGZyYW1lcyBhcmUgYWxzbyBjbGlwcGVkCisgICAgICAg
IC8vIGJ5IGEgZGl2LCB0aGF0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoaXMgY2FsY3VsYXRp
b24uIFRoYXQgaXMgYW4gaW1wcm92ZW1lbnQgdGhhdCBzdGlsbAorICAgICAgICAvLyBuZWVkcyB0
byBiZSBtYWRlLgorICAgICAgICBjb25zdCBXaWRnZXQqIGN1cnJlbnQgPSB0aGlzOworICAgICAg
ICB3aGlsZSAoY3VycmVudC0+cGFyZW50KCkgJiYgdmlzaWJsZSkgeworICAgICAgICAgICAgLy8g
RGV0ZXJtaW5lIGlmIGl0IGlzIHZpc2libGUgaW4gdGhpcyBzY3JvbGx2aWV3LgorICAgICAgICAg
ICAgdmlzaWJsZUNvbnRlbnRSZWN0ID0gY3VycmVudC0+cGFyZW50KCktPnZpc2libGVDb250ZW50
UmVjdCgpOworCisgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHRoZSByb290IFNjcm9s
bFZpZXcuIEl0cyBzaXplIGRvZXMgbm90IG1hdGNoIHRoZSBhY3R1YWwgd2luZG93IHNpemUuCisg
ICAgICAgICAgICBpZiAoY3VycmVudC0+cGFyZW50KCkgPT0gcm9vdCgpKQorICAgICAgICAgICAg
ICAgIHZpc2libGVDb250ZW50UmVjdC5zZXRTaXplKHdpbmRvd1NpemUpOworCisgICAgICAgICAg
ICBjb250ZW50UmVjdC5pbnRlcnNlY3QodmlzaWJsZUNvbnRlbnRSZWN0KTsKKyAgICAgICAgICAg
IHZpc2libGUgPSAhY29udGVudFJlY3QuaXNFbXB0eSgpOworCisgICAgICAgICAgICAvLyBPZmZz
ZXQgdG8gdmlzaWJsZSBjb29yZGluYXRlcyBpbiBzY3JvbGx2aWV3IHdpZGdldCdzIGNvb3JkaW5h
dGUgc3lzdGVtIChleGNlcHQgaW4gdGhlIGNhc2Ugb2YKKyAgICAgICAgICAgIC8vIHRoZSB0b3Ag
c2Nyb2xsIHZpZXcpLgorICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnBhcmVudCgpLT5wYXJlbnQo
KSkKKyAgICAgICAgICAgICAgICBjb250ZW50UmVjdC5tb3ZlKC12aXNpYmxlQ29udGVudFJlY3Qu
eCgpLCAtdmlzaWJsZUNvbnRlbnRSZWN0LnkoKSk7CisKKyAgICAgICAgICAgIGN1cnJlbnQgPSBj
dXJyZW50LT5wYXJlbnQoKTsKKworICAgICAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgb2Zm
c2V0IGZvciB0aGUgcm9vdCB3aW5kb3cgb3Igd2UgZ2V0IHRoZSB3cm9uZyBjb29yZGluYXRlcy4K
KyAgICAgICAgICAgIGlmIChjdXJyZW50LT5wYXJlbnQoKSkgeworICAgICAgICAgICAgICAgIC8v
IE1vdmUgY29udGVudCByZWN0IGludG8gdGhlIHBhcmVudCBzY3JvbGx2aWV3J3MgY29vcmRpbmF0
ZXMuCisgICAgICAgICAgICAgICAgSW50UmVjdCBjdXJGcmFtZVJlY3QgPSBjdXJyZW50LT5mcmFt
ZVJlY3QoKTsKKyAgICAgICAgICAgICAgICBjb250ZW50UmVjdC5tb3ZlKGN1ckZyYW1lUmVjdC54
KCksIGN1ckZyYW1lUmVjdC55KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgcmV0dXJuIGNvbnRlbnRSZWN0OworICAgIH0KKworICAgIHJldHVybiBJbnRSZWN0KCk7Cit9
CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlT25Mb2FkRXZlbnQoKQoreworICAgIGlmICghbV9w
cml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9wcml2YXRlLT5tX3NlbnRPbkxv
YWQpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcHJpdmF0ZS0+bV9zZW50T25Mb2FkID0gdHJ1
ZTsKKworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9PbkxvYWRF
dmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZl
bnQpOworCisgICAgLy8gU2VuZCBhbiBpbml0aWFsIE9uU2NyZWVuL09mZlNjcmVlbiBldmVudC4g
SXQgbXVzdCBhbHdheXMgY29tZSBhZnRlciBvbkxvYWQgaXMgc2VudC4KKyAgICBoYW5kbGVTY3Jv
bGxFdmVudCgpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUZyZWVNZW1vcnlFdmVudCgp
Cit7CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0ZyZWVNZW1v
cnlFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5w
RXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUJhY2tncm91bmRFdmVudCgpCit7
CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0JhY2tncm91bmRF
dmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZl
bnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUZvcmVncm91bmRFdmVudCgpCit7Cisg
ICAgc2V0TlBXaW5kb3dJZk5lZWRlZCgpOworCisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5w
RXZlbnQudHlwZSA9IE5QX0ZvcmVncm91bmRFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOwor
CisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6Omhh
bmRsZUZ1bGxTY3JlZW5BbGxvd2VkRXZlbnQoKQoreworICAgIGlmICghbV9wcml2YXRlKQorICAg
ICAgICByZXR1cm47CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0g
TlBfRnVsbFNjcmVlblJlYWR5RXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKworICAgIGlm
IChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgp
KSkgeworICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50
KCktPmRpZFBsdWdpbkVudGVyRnVsbFNjcmVlbih0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5p
cXVlUHJlZml4LmNfc3RyKCkpOworCisgICAgICAgIGlmICghZGlzcGF0Y2hOUEV2ZW50KG5wRXZl
bnQpKQorICAgICAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNs
aWVudCgpLT5kaWRQbHVnaW5FeGl0RnVsbFNjcmVlbih0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2lu
VW5pcXVlUHJlZml4LmNfc3RyKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX3ByaXZh
dGUtPm1faXNGdWxsU2NyZWVuID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6
aGFuZGxlRnVsbFNjcmVlbkV4aXRFdmVudCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAg
ICAgIHJldHVybjsKKworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBO
UF9GdWxsU2NyZWVuRXhpdEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisKKyAgICBkaXNw
YXRjaE5QRXZlbnQobnBFdmVudCk7CisKKyAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBz
dGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSkpCisgICAgICAgIGZyYW1lVmlldy0+aG9z
dFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+ZGlkUGx1Z2luRXhpdEZ1bGxTY3JlZW4o
dGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKKworICAgIG1f
cHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4gPSBmYWxzZTsKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisK
K3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlSWRsZUV2ZW50KGJvb2wgZW50ZXJJZGxlKQoreworICAg
IE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworCisgICAgaWYgKGVudGVy
SWRsZSkKKyAgICAgICAgbnBFdmVudC50eXBlID0gTlBfRW50ZXJJZGxlRXZlbnQ7CisgICAgZWxz
ZQorICAgICAgICBucEV2ZW50LnR5cGUgPSBOUF9FeGl0SWRsZUV2ZW50OworCisgICAgZGlzcGF0
Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlQXBwQWN0
aXZhdGVkRXZlbnQoKQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LmRhdGEg
PSAwOworICAgIG5wRXZlbnQudHlwZSA9IE5QX0FwcEFjdGl2YXRlZEV2ZW50OworCisgICAgZGlz
cGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUFwcERl
YWN0aXZhdGVkRXZlbnQoKQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47
CisKKyAgICAvLyBQbHVnaW4gd2FudHMgdG8ga25vdyB0aGF0IGl0IGhhcyB0byBleGl0IGZ1bGxz
Y3JlZW4gb24gZGVhY3RpdmF0aW9uLgorICAgIGlmIChtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVu
KQorICAgICAgICBoYW5kbGVGdWxsU2NyZWVuRXhpdEV2ZW50KCk7CisKKyAgICBOUEV2ZW50IG5w
RXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9BcHBE
ZWFjdGl2YXRlZEV2ZW50OworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2
b2lkIFBsdWdpblZpZXc6OmhhbmRsZUFwcFN0YW5kYnlFdmVudCgpCit7CisgICAgLy8gRklYTUU6
IFRoaXMgc2hvdWxkIHNlbmQgYW4gUU5QX0FwcFN0YW5kYnlFdmVudAorICAgIE5QRXZlbnQgbnBF
dmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworICAgIG5wRXZlbnQudHlwZSA9IE5QX0FwcFN0
YW5kQnlFdmVudDsKKworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQ
bHVnaW5WaWV3OjpoYW5kbGVPcmllbnRhdGlvbkV2ZW50KGludCBhbmdsZSkKK3sKKyAgICBOUEV2
ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfT3JpZW50YXRpb25FdmVudDsKKyAg
ICBucEV2ZW50LmRhdGEgPSAodm9pZCopYW5nbGU7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBF
dmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlU3dpcGVFdmVudCgpCit7CisgICAg
aWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFBsdWdpbiBvbmx5IHdh
bnRzIHRvIGtub3cgdGhhdCBpdCBoYXMgdG8gZXhpdCBmdWxsc2NyZWVuLgorICAgIGlmIChtX3By
aXZhdGUtPm1faXNGdWxsU2NyZWVuKQorICAgICAgICBoYW5kbGVGdWxsU2NyZWVuRXhpdEV2ZW50
KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlU2NyZWVuUG93ZXJFdmVudChib29sIHBv
d2VyZWQpCit7CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisK
KyAgICBpZiAocG93ZXJlZCkKKyAgICAgICAgbnBFdmVudC50eXBlID0gTlBfU2NyZWVuUG93ZXJV
cEV2ZW50OworICAgIGVsc2UKKyAgICAgICAgbnBFdmVudC50eXBlID0gTlBfU2NyZWVuUG93ZXJE
b3duRXZlbnQ7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1
Z2luVmlldzo6c2V0UGFyZW50KFNjcm9sbFZpZXcqIHBhcmVudFdpZGdldCkKK3sKKyAgICAvLyBJ
ZiBwYXJlbnRXaWRnZXQgaXMgMCwgbGV0cyB1bnJlZ2lzdGVyIHRoZSBwbHVnaW4gd2l0aCB0aGUg
Y3VycmVudCBwYXJlbnQuCisgICAgaWYgKG1fcHJpdmF0ZSAmJiAoIXBhcmVudFdpZGdldCB8fCBw
YXJlbnRXaWRnZXQgIT0gcGFyZW50KCkpKSB7CisgICAgICAgIGlmIChGcmFtZVZpZXcqIGZyYW1l
VmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkgeworICAgICAgICAgICAg
aWYgKG1fcHJpdmF0ZS0+bV9pc0JhY2tncm91bmRQbGF5aW5nKQorICAgICAgICAgICAgICAgIGZy
YW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+b25QbHVnaW5TdG9w
QmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0
cigpKTsKKworICAgICAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAg
ICAgICAgICAgICAgaGFuZGxlRnVsbFNjcmVlbkV4aXRFdmVudCgpOworCisgICAgICAgICAgICAv
LyBUaGlzIHdpbGwgdW5sb2NrIHRoZSBpZGxlIChpZiB3ZSBoYXZlIGxvY2tlZCBpdCkuCisgICAg
ICAgICAgICBtX3ByaXZhdGUtPnByZXZlbnRJZGxlKGZhbHNlKTsKKworICAgICAgICAgICAgLy8g
VGhpcyB3aWxsIHJlbGVhc2UgYW55IGtlZXBWaXNpYmxlUmVjdHMgaWYgdGhleSB3ZXJlIHNldC4K
KyAgICAgICAgICAgIG1fcHJpdmF0ZS0+Y2xlYXJWaXNpYmxlUmVjdHMoKTsKKworI2lmIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAgICAgICAgIC8vIElmIHdlIGhhZCBhIGhvbGUg
cHVuY2ggcmVjdCBzZXQsIGNsZWFyIGl0LgorICAgICAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9w
bGF0Zm9ybUxheWVyICYmICFtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC5pc0VtcHR5KCkpCisg
ICAgICAgICAgICAgICAgbV9wcml2YXRlLT5tX3BsYXRmb3JtTGF5ZXItPnNldEhvbGVQdW5jaFJl
Y3QoSW50UmVjdCgpKTsKKyNlbmRpZgorICAgICAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93
KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5yZWdpc3RlclBsdWdpbih0aGlzLCBmYWxzZSAvKnNo
b3VsZFJlZ2lzdGVyKi8pOworICAgICAgICB9CisgICAgfQorCisgICAgV2lkZ2V0OjpzZXRQYXJl
bnQocGFyZW50V2lkZ2V0KTsKKworICAgIGlmIChwYXJlbnRXaWRnZXQpIHsKKyAgICAgICAgaW5p
dCgpOworCisgICAgICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVW
aWV3Kj4ocGFyZW50V2lkZ2V0KTsKKworICAgICAgICBpZiAoZnJhbWVWaWV3ICYmIG1fcHJpdmF0
ZSkgeworICAgICAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNs
aWVudCgpLT5yZWdpc3RlclBsdWdpbih0aGlzLCB0cnVlIC8qc2hvdWxkUmVnaXN0ZXIqLyk7Cisg
ICAgICAgICAgICBpZiAoZnJhbWVWaWV3LT5mcmFtZSgpCisgICAgICAgICAgICAgICAmJiBmcmFt
ZVZpZXctPmZyYW1lKCktPmxvYWRlcigpCisgICAgICAgICAgICAgICAmJiBmcmFtZVZpZXctPmZy
YW1lKCktPmxvYWRlcigpLT5mcmFtZUhhc0xvYWRlZCgpKQorICAgICAgICAgICAgICAgIGhhbmRs
ZU9uTG9hZEV2ZW50KCk7CisKKyAgICAgICAgICAgIGlmIChtX3ByaXZhdGUtPm1faXNCYWNrZ3Jv
dW5kUGxheWluZykKKyAgICAgICAgICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxh
dGZvcm1QYWdlQ2xpZW50KCktPm9uUGx1Z2luU3RhcnRCYWNrZ3JvdW5kUGxheSh0aGlzLCBtX3By
aXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQor
fQorCit2b2lkIFBsdWdpblZpZXc6OnNldE5QV2luZG93UmVjdChjb25zdCBJbnRSZWN0JikKK3sK
KyAgICBzZXROUFdpbmRvd0lmTmVlZGVkKCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0TlBX
aW5kb3dJZk5lZWRlZCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUgfHwgIW1faXNTdGFydGVkIHx8
ICFwYXJlbnQoKSB8fCAhbV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPnNldHdpbmRvdykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFt
ZVZpZXcqPihwYXJlbnQoKSk7CisgICAgaWYgKCFmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxh
dGZvcm1QYWdlQ2xpZW50KCktPmlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IElmIHRoZSBwbHVnaW4gZGlkbid0IGxvYWQgc3VjZXNzZnVsbHksIG5vIHBvaW50IGluIGNhbGxp
bmcgc2V0d2luZG93CisgICAgaWYgKG1fc3RhdHVzICE9IFBsdWdpblN0YXR1c0xvYWRlZFN1Y2Nl
c3NmdWxseSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0Z1bGxT
Y3JlZW4pCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9wcml2YXRlLT5tX2hhc1BlbmRp
bmdHZW9tZXRyeUNoYW5nZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcml2YXRlLT5tX2hh
c1BlbmRpbmdHZW9tZXRyeUNoYW5nZSA9IGZhbHNlOworCisgICAgbV9ucFdpbmRvdy54ID0gbV93
aW5kb3dSZWN0LngoKTsKKyAgICBtX25wV2luZG93LnkgPSBtX3dpbmRvd1JlY3QueSgpOworCisg
ICAgbV9ucFdpbmRvdy5jbGlwUmVjdC5sZWZ0ID0gbWF4KDAsIG1fY2xpcFJlY3QueCgpKTsKKyAg
ICBtX25wV2luZG93LmNsaXBSZWN0LnRvcCA9IG1heCgwLCBtX2NsaXBSZWN0LnkoKSk7CisgICAg
bV9ucFdpbmRvdy5jbGlwUmVjdC5yaWdodCA9IG1heCgwLCBtX2NsaXBSZWN0Lm1heFgoKSk7Cisg
ICAgbV9ucFdpbmRvdy5jbGlwUmVjdC5ib3R0b20gPSBtYXgoMCwgbV9jbGlwUmVjdC5tYXhZKCkp
OworCisgICAgaWYgKG1fcGx1Z2luLT5xdWlya3MoKS5jb250YWlucyhQbHVnaW5RdWlya0RvbnRD
YWxsU2V0V2luZG93TW9yZVRoYW5PbmNlKSkgeworICAgICAgICAvLyBPbmx5IHNldCB0aGUgd2lk
dGggYW5kIGhlaWdodCBvZiB0aGUgcGx1Z2luIGNvbnRlbnQgdGhlIGZpcnN0IHRpbWUgc2V0TlBX
aW5kb3coKSBpcyBjYWxsZWQKKyAgICAgICAgLy8gc28gYXMgdG8gd29ya2Fyb3VuZCBhbiBpc3N1
ZSBpbiBGbGFzaCB3aGVyZSBtdWx0aXBsZSBjYWxscyB0byBzZXROUFdpbmRvdygpIGNhdXNlIHRo
ZSBwbHVnaW4KKyAgICAgICAgLy8gdG8gY3Jhc2ggaW4gd2luZG93ZWQgbW9kZS4KKyAgICAgICAg
aWYgKCFtX2lzV2luZG93ZWQgfHwgbV9ucFdpbmRvdy53aWR0aCA9PSBVbmluaXRpYWxpemVkQ29v
cmRpbmF0ZSB8fCBtX25wV2luZG93LmhlaWdodCA9PSBVbmluaXRpYWxpemVkQ29vcmRpbmF0ZSkg
eworICAgICAgICAgICAgbV9ucFdpbmRvdy53aWR0aCA9IG1fd2luZG93UmVjdC53aWR0aCgpOwor
ICAgICAgICAgICAgbV9ucFdpbmRvdy5oZWlnaHQgPSBtX3dpbmRvd1JlY3QuaGVpZ2h0KCk7Cisg
ICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtX25wV2luZG93LndpZHRoID0gbV93aW5k
b3dSZWN0LndpZHRoKCk7CisgICAgICAgIG1fbnBXaW5kb3cuaGVpZ2h0ID0gbV93aW5kb3dSZWN0
LmhlaWdodCgpOworICAgIH0KKworICAgIG1fbnBXaW5kb3cudHlwZSA9IE5QV2luZG93VHlwZURy
YXdhYmxlOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3cqIHdp
bmRvdyA9IGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+cGxh
dGZvcm1XaW5kb3coKTsKKyAgICBpZiAod2luZG93KQorICAgICAgICAoKE5QU2V0V2luZG93Q2Fs
bGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPndpbmRvd0dyb3VwID0gd2luZG93LT53
aW5kb3dHcm91cCgpOworCisgICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBsdWdpblZpZXcodGhp
cyk7CisgICAgSlNDOjpKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3MoSlNDOjpTaWxl
bmNlQXNzZXJ0aW9uc09ubHkpOworICAgIHNldENhbGxpbmdQbHVnaW4odHJ1ZSk7CisKKyAgICAv
LyBGSVhNRTogUGFzc2luZyB6b29tRmFjdG9yIHRvIHNldHdpbmRvdyBtYWtlIHdpbmRvd2VkIHBs
dWdpbiBzY2FsZSBpbmNvcnJlY3RseS4KKyAgICAvLyBIYW5kbGluZyB0aGUgem9vbSBmYWN0b3Ig
cHJvcGVybHkgaW4gdGhlIHBsdWdpbiBzaWRlIG1heSBiZSBhIGJldHRlciBzb2x1dGlvbi4KKyAg
ICBkb3VibGUgb2xkWm9vbUZhY3RvciA9ICgoTlBTZXRXaW5kb3dDYWxsYmFja1N0cnVjdCopbV9u
cFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3RvcjsKKyAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tT
dHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21GYWN0b3IgPSAxLjsKKyAgICBtX3BsdWdp
bi0+cGx1Z2luRnVuY3MoKS0+c2V0d2luZG93KG1faW5zdGFuY2UsICZtX25wV2luZG93KTsKKyAg
ICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21G
YWN0b3IgPSBvbGRab29tRmFjdG9yOworCisgICAgc2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7Cisg
ICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBsdWdpblZpZXcoMCk7Cit9CisKK3ZvaWQgUGx1Z2lu
Vmlldzo6c2V0UGFyZW50VmlzaWJsZShib29sIHZpc2libGUpCit7CisgICAgaWYgKGlzUGFyZW50
VmlzaWJsZSgpID09IHZpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIFdpZGdldDo6c2V0
UGFyZW50VmlzaWJsZSh2aXNpYmxlKTsKKworICAgIC8vIEZJWE1FOiBXZSBtaWdodCB3YW50IHRv
IHRlbGwgdGhlIHBsdWdpbiB0byBoaWRlIGl0J3Mgd2luZG93IGhlcmUsIGJ1dCBpdCBkb2Vzbid0
IG1hdHRlcgorICAgIC8vIHNpbmNlIHRoZSB3aW5kb3cgbWFuYWdlciBzaG91bGQgdGFrZSBjYXJl
IG9mIHRoYXQgZm9yIHVzLgorfQorCitOUEVycm9yIFBsdWdpblZpZXc6OmhhbmRsZVBvc3RSZWFk
RmlsZShWZWN0b3I8Y2hhcj4mIGJ1ZmZlciwgdWludDMyX3QgbGVuLCBjb25zdCBjaGFyKiBidWYp
Cit7CisgICAgU3RyaW5nIGZpbGVuYW1lKGJ1ZiwgbGVuKTsKKworICAgIGlmIChmaWxlbmFtZS5z
dGFydHNXaXRoKCJmaWxlOi8vLyIpKQorICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0
cmluZyg4KTsKKworICAgIGxvbmcgbG9uZyBzaXplOworICAgIGlmICghZ2V0RmlsZVNpemUoZmls
ZW5hbWUsIHNpemUpKQorICAgICAgICByZXR1cm4gTlBFUlJfRklMRV9OT1RfRk9VTkQ7CisKKyAg
ICBGSUxFKiBmaWxlSGFuZGxlID0gZm9wZW4oZmlsZW5hbWUudXRmOCgpLmRhdGEoKSwgInIiKTsK
KyAgICBpZiAoIWZpbGVIYW5kbGUpCisgICAgICAgIHJldHVybiBOUEVSUl9GSUxFX05PVF9GT1VO
RDsKKworICAgIGJ1ZmZlci5yZXNpemUoc2l6ZSk7CisgICAgaW50IGJ5dGVzUmVhZCA9IGZyZWFk
KGJ1ZmZlci5kYXRhKCksIDEsIHNpemUsIGZpbGVIYW5kbGUpOworCisgICAgZmNsb3NlKGZpbGVI
YW5kbGUpOworCisgICAgaWYgKGJ5dGVzUmVhZCA8PSAwKQorICAgICAgICByZXR1cm4gTlBFUlJf
RklMRV9OT1RfRk9VTkQ7CisKKyAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK2Jvb2wg
UGx1Z2luVmlldzo6cGxhdGZvcm1HZXRWYWx1ZVN0YXRpYyhOUE5WYXJpYWJsZSB2YXJpYWJsZSwg
dm9pZCogdmFsdWUsIE5QRXJyb3IqIHJlc3VsdCkKK3sKKyAgICBzd2l0Y2ggKHZhcmlhYmxlKSB7
CisgICAgY2FzZSBOUE5WVG9vbGtpdDoKKyAgICAgICAgKnN0YXRpY19jYXN0PHVpbnQzMl90Kj4o
dmFsdWUpID0gMDsKKyAgICAgICAgKnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgTlBOVlN1cHBvcnRzWEVtYmVkQm9vbDoKKyAgICAgICAg
KnN0YXRpY19jYXN0PE5QQm9vbCo+KHZhbHVlKSA9IHRydWU7CisgICAgICAgICpyZXN1bHQgPSBO
UEVSUl9OT19FUlJPUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIE5QTlZqYXZh
c2NyaXB0RW5hYmxlZEJvb2w6CisgICAgICAgICpzdGF0aWNfY2FzdDxOUEJvb2wqPih2YWx1ZSkg
PSB0cnVlOworICAgICAgICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgY2FzZSBOUE5WU3VwcG9ydHNXaW5kb3dsZXNzOgorICAgICAgICAqc3Rh
dGljX2Nhc3Q8TlBCb29sKj4odmFsdWUpID0gdHJ1ZTsKKyAgICAgICAgKnJlc3VsdCA9IE5QRVJS
X05PX0VSUk9SOworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgTlBOVk5QQ2FsbGJh
Y2tzUHRyOiB7CisgICAgICAgICooKHZvaWQgKiopIHZhbHVlKSA9ICh2b2lkKikmc19OcENhbGxi
YWNrczsKKyAgICAgICAgKnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorfQorCitib29sIFBsdWdpblZpZXc6OnBsYXRmb3JtR2V0VmFsdWUoTlBOVmFyaWFibGUgdmFy
aWFibGUsIHZvaWQqIHZhbHVlLCBOUEVycm9yKiByZXN1bHQpCit7CisgICAgc3dpdGNoICh2YXJp
YWJsZSkgeworICAgIGNhc2UgTlBOVlpvb21GYWN0b3I6IHsKKyAgICAgICAgKihzdGF0aWNfY2Fz
dDx2b2lkKio+KHZhbHVlKSkgPSBzdGF0aWNfY2FzdDx2b2lkKj4oJigoc3RhdGljX2Nhc3Q8TlBT
ZXRXaW5kb3dDYWxsYmFja1N0cnVjdCo+KG1fbnBXaW5kb3cud3NfaW5mbykpKS0+em9vbUZhY3Rv
cik7CisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCisgICAgY2FzZSBOUE5WUm9vdFdpbmRvd0dyb3VwOiB7CisgICAgICAgIEZy
YW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOwor
ICAgICAgICBpZiAoZnJhbWVWaWV3KSB7CisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6R3JhcGhpY3M6OldpbmRvdyAqd2luZG93ID0KKyAgICAgICAgICAgICAgICBmcmFtZVZpZXct
Pmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPnBsYXRmb3JtV2luZG93KCk7Cisg
ICAgICAgICAgICBpZiAod2luZG93KSB7CisgICAgICAgICAgICAgICAgdm9pZCoqIHRlbXBWYWx1
ZSA9IHN0YXRpY19jYXN0PHZvaWQqKj4odmFsdWUpOworICAgICAgICAgICAgICAgICp0ZW1wVmFs
dWUgPSAodm9pZCopd2luZG93LT5yb290R3JvdXAoKTsKKworICAgICAgICAgICAgICAgIGlmICgq
dGVtcFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJP
UjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKnJlc3VsdCA9IE5QRVJSX0dFTkVS
SUNfRVJST1I7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjYXNlIE5QTlZC
cm93c2VyV2luZG93R3JvdXA6IHsKKyAgICAgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0
aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7CisgICAgICAgIGlmIChmcmFtZVZpZXcpIHsK
KyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93KiB3aW5k
b3cgPQorICAgICAgICAgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBh
Z2VDbGllbnQoKS0+cGxhdGZvcm1XaW5kb3coKTsKKyAgICAgICAgICAgIGlmICh3aW5kb3cpIHsK
KyAgICAgICAgICAgICAgICB2b2lkKiogdGVtcFZhbHVlID0gc3RhdGljX2Nhc3Q8dm9pZCoqPih2
YWx1ZSk7CisgICAgICAgICAgICAgICAgKnRlbXBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9p
ZCo+KGNvbnN0X2Nhc3Q8Y2hhcio+KHdpbmRvdy0+d2luZG93R3JvdXAoKSkpOworCisgICAgICAg
ICAgICAgICAgaWYgKCp0ZW1wVmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgKnJlc3VsdCA9
IE5QRVJSX05PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAqcmVzdWx0
ID0gTlBFUlJfR0VORVJJQ19FUlJPUjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIGNhc2UgTlBOVkJyb3dzZXJEaXNwbGF5Q29udGV4dDogeworICAgICAgICBGcmFtZVZpZXcq
IGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKTsKKyAgICAgICAg
aWYgKGZyYW1lVmlldykgeworICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpQbGF0Zm9ybURpc3BsYXlDb250ZXh0SGFuZGxlIGNvbnRleHQgPQorICAgICAgICAgICAg
ICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6cGxhdGZvcm1EaXNwbGF5Q29udGV4
dCgpOworICAgICAgICAgICAgaWYgKGNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICB2b2lkKiog
dGVtcFZhbHVlID0gc3RhdGljX2Nhc3Q8dm9pZCoqPih2YWx1ZSk7CisgICAgICAgICAgICAgICAg
KnRlbXBWYWx1ZSA9IHN0YXRpY19jYXN0PHZvaWQqPihjb250ZXh0KTsKKworICAgICAgICAgICAg
ICAgIGlmICgqdGVtcFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBOUEVS
Ul9OT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKnJlc3VsdCA9IE5Q
RVJSX0dFTkVSSUNfRVJST1I7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBj
YXNlIE5QTlZQbHVnaW5XaW5kb3dQcmVmaXg6IHsKKyAgICAgICAgdm9pZCoqIHRlbXBWYWx1ZSA9
IHN0YXRpY19jYXN0PHZvaWQqKj4odmFsdWUpOworICAgICAgICAqdGVtcFZhbHVlID0gc3RhdGlj
X2Nhc3Q8dm9pZCo+KGNvbnN0X2Nhc3Q8Y2hhcio+KG1fcHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQ
cmVmaXguY19zdHIoKSkpOworCisgICAgICAgIGlmICgqdGVtcFZhbHVlKSB7CisgICAgICAgICAg
ICAqcmVzdWx0ID0gTlBFUlJfTk9fRVJST1I7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgfQorCisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9HRU5FUklDX0VSUk9SOworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIHBs
YXRmb3JtR2V0VmFsdWVTdGF0aWModmFyaWFibGUsIHZhbHVlLCByZXN1bHQpOworICAgICAgICAv
LyBGSVhNRTogU2hvdWxkIHdlIHJldHVybiBmYWxzZT8KKyAgICB9Cit9CisKKy8vIFRoaXMgaXMg
YSBwdXJlIHZpcnR1YWwgaW5oZXJpdGVkIGZyb20gV2lkZ2V0IGNsYXNzIGFuZCBhbGwgaW52YWxp
ZGF0ZXMKKy8vIGFyZSBmdW5uZWxlZCB0aHJvdWdoIHRoaXMgbWV0aG9kLiBXZSBmb3J3YXJkIHRo
ZW0gb24gdG8gZWl0aGVyIHRoZQorLy8gY29tcG9zaXRpbmcgbGF5ZXIgb3IgdGhlIFBsdWdpblZp
ZXc6OmludmFsaWRhdGVXaW5kb3dsZXNzUGx1Z2luUmVjdCBtZXRob2QuCit2b2lkIFBsdWdpblZp
ZXc6OmludmFsaWRhdGVSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKCFtX3By
aXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFJlY29yZCB0aGUgcmVnaW9uIHRoYXQg
d2UndmUgYmVlbiBhc2tlZCB0byBpbnZhbGlkYXRlCisgICAgbV9wcml2YXRlLT5tX2ludmFsaWRh
dGVSZWdpb24gPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6dW5pb25SZWdp
b25zKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0KHJlY3QpLCBtX3ByaXZhdGUtPm1faW52
YWxpZGF0ZVJlZ2lvbik7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAg
aWYgKG1fcHJpdmF0ZS0+bV9wbGF0Zm9ybUxheWVyKSB7CisgICAgICAgIG1fcHJpdmF0ZS0+bV9w
bGF0Zm9ybUxheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyNlbmRpZgorCisgICAgaW52YWxpZGF0ZVdpbmRvd2xlc3NQbHVnaW5SZWN0KHJlY3QpOworfQor
Cit2b2lkIFBsdWdpblZpZXc6OmludmFsaWRhdGVSZWN0KE5QUmVjdCogcmVjdCkKK3sKKyAgICBp
ZiAoIXJlY3QpIHsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICByZXR1cm47CisgICAg
fQorICAgIGludmFsaWRhdGVSZWN0KEludFJlY3QocmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0
LT5yaWdodCAtIHJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcCkpOworfQorCit2
b2lkIFBsdWdpblZpZXc6OmludmFsaWRhdGVSZWdpb24oTlBSZWdpb24gcmVnaW9uKQoreworICAg
IGludmFsaWRhdGUoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3Ojpmb3JjZVJlZHJhdygpCit7Cisg
ICAgaW52YWxpZGF0ZSgpOworfQorCitib29sIFBsdWdpblZpZXc6OnBsYXRmb3JtU3RhcnQoKQor
eworICAgIEFTU0VSVChtX2lzU3RhcnRlZCk7CisgICAgQVNTRVJUKG1fc3RhdHVzID09IFBsdWdp
blN0YXR1c0xvYWRlZFN1Y2Nlc3NmdWxseSk7CisKKyAgICBtX3ByaXZhdGUgPSBuZXcgUGx1Z2lu
Vmlld1ByaXZhdGUodGhpcyk7CisKKyAgICBpZiAobV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPmdl
dHZhbHVlKSB7CisgICAgICAgIFBsdWdpblZpZXc6OnNldEN1cnJlbnRQbHVnaW5WaWV3KHRoaXMp
OworICAgICAgICBKU0M6OkpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrcyhKU0M6OlNp
bGVuY2VBc3NlcnRpb25zT25seSk7CisgICAgICAgIHNldENhbGxpbmdQbHVnaW4odHJ1ZSk7Cisg
ICAgICAgIG1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5nZXR2YWx1ZShtX2luc3RhbmNlLCBOUFBW
cGx1Z2luTmVlZHNYRW1iZWQsICZtX25lZWRzWEVtYmVkKTsKKyAgICAgICAgc2V0Q2FsbGluZ1Bs
dWdpbihmYWxzZSk7CisgICAgICAgIFBsdWdpblZpZXc6OnNldEN1cnJlbnRQbHVnaW5WaWV3KDAp
OworICAgIH0KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBpZiAobV9w
YXJlbnRGcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmFsbG93c0FjY2VsZXJhdGVk
Q29tcG9zaXRpbmcoKQorICAgICAgICAmJiBtX3BhcmVudEZyYW1lLT5wYWdlKCktPnNldHRpbmdz
KCkKKyAgICAgICAgJiYgbV9wYXJlbnRGcmFtZS0+cGFnZSgpLT5zZXR0aW5ncygpLT5hY2NlbGVy
YXRlZENvbXBvc2l0aW5nRW5hYmxlZCgpKSB7CisgICAgICAgIG1fcHJpdmF0ZS0+bV9wbGF0Zm9y
bUxheWVyID0gUGx1Z2luTGF5ZXJXZWJLaXRUaHJlYWQ6OmNyZWF0ZSh0aGlzKTsKKyAgICAgICAg
Ly8gVHJpZ2dlciBsYXllciBjb21wdXRhdGlvbiBpbiBSZW5kZXJMYXllckNvbXBvc2l0b3IKKyAg
ICAgICAgbV9lbGVtZW50LT5zZXROZWVkc1N0eWxlUmVjYWxjKFN5bnRoZXRpY1N0eWxlQ2hhbmdl
KTsKKyAgICB9CisjZW5kaWYKKworICAgIG1fbnBXaW5kb3cudHlwZSA9IE5QV2luZG93VHlwZURy
YXdhYmxlOworICAgIG1fbnBXaW5kb3cud2luZG93ID0gMDsgLy8gTm90IHVzZWQ/CisgICAgbV9u
cFdpbmRvdy54ID0gMDsKKyAgICBtX25wV2luZG93LnkgPSAwOworICAgIG1fbnBXaW5kb3cud2lk
dGggPSBVbmluaXRpYWxpemVkQ29vcmRpbmF0ZTsKKyAgICBtX25wV2luZG93LmhlaWdodCA9IFVu
aW5pdGlhbGl6ZWRDb29yZGluYXRlOworICAgIG1fbnBXaW5kb3cud3NfaW5mbyA9IG5ldyBOUFNl
dFdpbmRvd0NhbGxiYWNrU3RydWN0OworICAgICgoTlBTZXRXaW5kb3dDYWxsYmFja1N0cnVjdCop
bV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3RvciA9IDEuOworICAgICgoTlBTZXRXaW5kb3dD
YWxsYmFja1N0cnVjdCopbV9ucFdpbmRvdy53c19pbmZvKS0+d2luZG93R3JvdXAgPSAwOworCisg
ICAgc2hvdygpOworCisgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8
RnJhbWVWaWV3Kj4ocGFyZW50KCkpKQorICAgICAgICBoYW5kbGVPcmllbnRhdGlvbkV2ZW50KGZy
YW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+b3JpZW50YXRpb24o
KSk7CisKKyAgICBpZiAoIShtX3BsdWdpbi0+cXVpcmtzKCkuY29udGFpbnMoUGx1Z2luUXVpcmtE
ZWZlckZpcnN0U2V0V2luZG93Q2FsbCkpKSB7CisgICAgICAgIHVwZGF0ZVBsdWdpbldpZGdldCgp
OworICAgICAgICBzZXROUFdpbmRvd0lmTmVlZGVkKCk7CisgICAgfQorCisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6cGxhdGZvcm1EZXN0cm95KCkKK3sKKyAgICBpZiAo
IW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhpcyB3aWxsIHVubG9jayB0
aGUgaWRsZSAoaWYgd2UgaGF2ZSBsb2NrZWQgaXQpLgorICAgIG1fcHJpdmF0ZS0+cHJldmVudElk
bGUoZmFsc2UpOworCisgICAgLy8gVGhpcyB3aWxsIHJlbGVhc2UgYW55IGtlZXBWaXNpYmxlUmVj
dHMgaWYgdGhleSB3ZXJlIHNldC4KKyAgICBtX3ByaXZhdGUtPmNsZWFyVmlzaWJsZVJlY3RzKCk7
CisKKyAgICAvLyBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgd2UgdW5yZWdpc3RlcmVkIHRoZSBwbHVn
aW4uCisgICAgaWYgKEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3
Kj4ocGFyZW50KCkpKSB7CisgICAgICAgIGlmIChtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxh
eWluZykKKyAgICAgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VD
bGllbnQoKS0+b25QbHVnaW5TdG9wQmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2YXRlLT5tX3Bs
dWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKKworICAgICAgICAvLyBJZiB3ZSB3ZXJlIHN0aWxs
IGZ1bGxzY3JlZW4sIGVuc3VyZSB3ZSBub3RpZnkgZXZlcnlvbmUgd2UncmUgbm90LgorICAgICAg
ICBpZiAobV9wcml2YXRlLT5tX2lzRnVsbFNjcmVlbikKKyAgICAgICAgICAgIGZyYW1lVmlldy0+
aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+ZGlkUGx1Z2luRXhpdEZ1bGxTY3Jl
ZW4odGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKKworICAg
ICAgICBpZiAobV9wcml2YXRlLT5tX29yaWVudGF0aW9uTG9ja2VkKQorICAgICAgICAgICAgZnJh
bWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT51bmxvY2tPcmllbnRh
dGlvbigpOworCisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VD
bGllbnQoKS0+cmVnaXN0ZXJQbHVnaW4odGhpcywgZmFsc2UgLypzaG91bGRSZWdpc3RlciovKTsK
KyAgICB9CisKKyAgICBtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZyA9IGZhbHNlOwor
ICAgIG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4gPSBmYWxzZTsKKworICAgIGRlbGV0ZSBtX3By
aXZhdGU7CisgICAgbV9wcml2YXRlID0gMDsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYWx0KCkK
K3sKK30KKwordm9pZCBQbHVnaW5WaWV3OjpyZXN0YXJ0KCkKK3sKK30KKwordm9pZCBQbHVnaW5W
aWV3OjpnZXRXaW5kb3dJbmZvKFZlY3RvcjxQbHVnaW5XaW5kb3dJbmZvPiYgd2luZG93TGlzdCkK
K3sKKyAgICBpZiAoIW1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5nZXR2YWx1ZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgdm9pZCogdmFsUHRyID0gMDsKKworICAgIFBsdWdpblZpZXc6OnNldEN1
cnJlbnRQbHVnaW5WaWV3KHRoaXMpOworICAgIEpTQzo6SlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJv
cEFsbExvY2tzKEpTQzo6U2lsZW5jZUFzc2VydGlvbnNPbmx5KTsKKyAgICBzZXRDYWxsaW5nUGx1
Z2luKHRydWUpOworICAgIG1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5nZXR2YWx1ZShtX2luc3Rh
bmNlLCBOUFBWcGx1Z2luU2NyZWVuV2luZG93LCAmdmFsUHRyKTsKKyAgICBzZXRDYWxsaW5nUGx1
Z2luKGZhbHNlKTsKKyAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldygwKTsKKwor
ICAgIGlmICghdmFsUHRyKQorICAgICAgICByZXR1cm47CisKKyAgICBOUFNjcmVlbldpbmRvd0hh
bmRsZXMqIHNjcmVlbldpbkhhbmRsZXMgPSBzdGF0aWNfY2FzdDxOUFNjcmVlbldpbmRvd0hhbmRs
ZXMqPih2YWxQdHIpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY3JlZW5XaW5IYW5kbGVz
LT5udW1PZldpbmRvd3M7IGkrKykgeworICAgICAgICBQbHVnaW5XaW5kb3dJbmZvIGluZm87Cisg
ICAgICAgIGluZm8ud2luZG93UHRyID0gc2NyZWVuV2luSGFuZGxlcy0+d2luZG93SGFuZGxlc1tp
XTsKKworICAgICAgICBOUFJlY3QqIHJjID0gc2NyZWVuV2luSGFuZGxlcy0+d2luZG93UmVjdHNb
aV07CisgICAgICAgIGluZm8ud2luZG93UmVjdCA9IEludFJlY3QocmMtPmxlZnQsIHJjLT50b3As
IHJjLT5yaWdodCAtIHJjLT5sZWZ0LCByYy0+Ym90dG9tIC0gcmMtPnRvcCk7CisKKyAgICAgICAg
d2luZG93TGlzdC5hcHBlbmQoaW5mbyk7CisgICAgfQorfQorCitCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6R3JhcGhpY3M6OkJ1ZmZlciogUGx1Z2luVmlldzo6bG9ja0Zyb250QnVmZmVyRm9yUmVhZCgp
IGNvbnN0Cit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybiAwOworCisgICAg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGJ1ZmZlciA9IG1fcHJpdmF0
ZS0+bG9ja1JlYWRGcm9udEJ1ZmZlckludGVybmFsKCk7CisKKyAgICBpZiAoIWJ1ZmZlcikKKyAg
ICAgICAgbV9wcml2YXRlLT51bmxvY2tSZWFkRnJvbnRCdWZmZXIoKTsKKworICAgIHJldHVybiBi
dWZmZXI7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6dW5sb2NrRnJvbnRCdWZmZXIoKSBjb25zdAor
eworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisgICAgbV9wcml2YXRlLT51
bmxvY2tSZWFkRnJvbnRCdWZmZXIoKTsKK30KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKK1BsYXRmb3JtTGF5ZXIqIFBsdWdpblZpZXc6OnBsYXRmb3JtTGF5ZXIoKSBjb25zdAor
eworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gbV9w
cml2YXRlLT5tX3BsYXRmb3JtTGF5ZXIuZ2V0KCk7Cit9CisjZW5kaWYKKworSW50UmVjdCBQbHVn
aW5WaWV3OjplbnN1cmVWaXNpYmxlUmVjdCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAg
ICAgIHJldHVybiBJbnRSZWN0KCk7CisgICAgcmV0dXJuIG1fcHJpdmF0ZS0+bV9rZWVwVmlzaWJs
ZVJlY3Q7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0QmFja2dyb3VuZFBsYXkoYm9vbCB2YWx1
ZSkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSB8fCBtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxh
eWluZyA9PSB2YWx1ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWVWaWV3KiBmcmFtZVZp
ZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihtX3ByaXZhdGUtPm1fdmlldy0+cGFyZW50KCkp
OworICAgIG1fcHJpdmF0ZS0+bV9pc0JhY2tncm91bmRQbGF5aW5nID0gdmFsdWU7CisgICAgaWYg
KG1fcHJpdmF0ZS0+bV9pc0JhY2tncm91bmRQbGF5aW5nKQorICAgICAgICBmcmFtZVZpZXctPmhv
c3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPm9uUGx1Z2luU3RhcnRCYWNrZ3JvdW5k
UGxheSh0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpOworICAg
IGVsc2UKKyAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVu
dCgpLT5vblBsdWdpblN0b3BCYWNrZ3JvdW5kUGxheSh0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2lu
VW5pcXVlUHJlZml4LmNfc3RyKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119141</attachid>
            <date>2011-12-13 19:40:56 -0800</date>
            <delta_ts>2011-12-13 23:35:59 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-73397-20111214114217.patch</filename>
            <type>text/plain</type>
            <size>46866</size>
            <attacher name="Charles Wei">charles.wei</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwMjczMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBACisyMDExLTEyLTEzICBXZWkgQ2hh
cmxlcyAgPGNoYXJsZXMud2VpQHRvcmNobW9iaWxlLmNvbS5jbj4KKworICAgICAgICBbQmxhY2tC
ZXJyeV0gVXBzdHJlYW0gQmxhY2tCZXJyeSBwb3J0aW5nIG9mIHBsdWdpblZpZXcKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczMzk3CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIGZvciBu
b3cuCisKKyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld0JsYWNrQmVycnku
Y3BwOiBBZGRlZC4KKwogMjAxMS0xMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBw
bGUuY29tPgogCiAgICAgICAgIEFkZCBhIHZlcnkgYmFyZS1ib25lcyBpbXBsZW1lbnRhdGlvbiBv
ZiBiaW5kIGFuZCBGdW5jdGlvbiB0byBXVEYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMv
YmxhY2tiZXJyeS9QbHVnaW5WaWV3QmxhY2tCZXJyeS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1BsdWdpblZpZXdCbGFja0JlcnJ5LmNwcAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5WaWV3
QmxhY2tCZXJyeS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTM5MyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndh
cmRiaWFzLmluPgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1p
dGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiUGx1Z2luVmlldy5oIgorCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNp
bmNsdWRlICJFdmVudC5oIgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKKyNpbmNsdWRlICJGcmFt
ZS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2lu
Y2x1ZGUgIkhUTUxQbHVnSW5FbGVtZW50LmgiCisjaW5jbHVkZSAiSG9zdFdpbmRvdy5oIgorI2lu
Y2x1ZGUgIkpTRE9NQmluZGluZy5oIgorI2luY2x1ZGUgIktleWJvYXJkRXZlbnQuaCIKKyNpbmNs
dWRlICJNb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiTlBDYWxsYmFja3NCbGFja0JlcnJ5LmgiCisj
aW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAi
UGxhdGZvcm1Db250ZXh0U2tpYS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVudC5o
IgorI2luY2x1ZGUgIlBsdWdpbkRlYnVnLmgiCisjaW5jbHVkZSAiUGx1Z2luTWFpblRocmVhZFNj
aGVkdWxlci5oIgorI2luY2x1ZGUgIlBsdWdpblBhY2thZ2UuaCIKKyNpbmNsdWRlICJQbHVnaW5W
aWV3UHJpdmF0ZUJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJSZW5kZXJMYXllci5oIgorI2luY2x1
ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiVG91Y2hFdmVudC5oIgorI2luY2x1ZGUgIlRvdWNo
TGlzdC5oIgorI2luY2x1ZGUgIldoZWVsRXZlbnQuaCIKKyNpbmNsdWRlICJucHJ1bnRpbWVfaW1w
bC5oIgorI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudC5o
IgorI2luY2x1ZGUgIlBsdWdpbkxheWVyV2ViS2l0VGhyZWFkLmgiCisjZW5kaWYKKworI2luY2x1
ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBs
YXRmb3JtSW50UmVjdFJlZ2lvbi5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVdpbmRv
dy5oPgorCisjaW5jbHVkZSA8cnVudGltZS9KU0xvY2suaD4KKyNpbmNsdWRlIDxydW50aW1lL0pT
VmFsdWUuaD4KKyNpbmNsdWRlIDxzeXMva2V5Y29kZXMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisK
K2NvbnN0IHVuc2lnbmVkIFVuaW5pdGlhbGl6ZWRDb29yZGluYXRlID0gMHhmZmZmZmZmZjsKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCit0ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgTlBSZWN0IHRv
TlBSZWN0KGNvbnN0IFQmIHJlY3QpCit7CisgICAgTlBSZWN0IG5wUmVjdDsKKyAgICBucFJlY3Qu
dG9wID0gcmVjdC55KCk7CisgICAgbnBSZWN0LmxlZnQgPSByZWN0LngoKTsKKyAgICBucFJlY3Qu
Ym90dG9tID0gcmVjdC55KCkgKyByZWN0LmhlaWdodCgpOworICAgIG5wUmVjdC5yaWdodCA9IHJl
Y3QueCgpICsgcmVjdC53aWR0aCgpOworICAgIHJldHVybiBucFJlY3Q7Cit9CisKK3VzaW5nIEpT
Qzo6RXhlY1N0YXRlOwordXNpbmcgSlNDOjpJbnRlcnByZXRlcjsKK3VzaW5nIEpTQzo6SlNMb2Nr
OwordXNpbmcgSlNDOjpKU09iamVjdDsKK3VzaW5nIEpTQzo6VVN0cmluZzsKKwordXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBXVEY7Cit1c2luZyBuYW1lc3BhY2UgSFRNTE5h
bWVzOworCit2b2lkIFBsdWdpblZpZXc6OnVwZGF0ZVBsdWdpbldpZGdldCgpCit7CisgICAgaWYg
KCFwYXJlbnQoKSB8fCAhbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQo
cGFyZW50KCktPmlzRnJhbWVWaWV3KCkpOworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3Rh
dGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOworCisgICAgSW50UmVjdCBvbGRXaW5kb3dS
ZWN0ID0gbV93aW5kb3dSZWN0OworICAgIEludFJlY3Qgb2xkQ2xpcFJlY3QgPSBtX2NsaXBSZWN0
OworCisgICAgbV93aW5kb3dSZWN0ID0gSW50UmVjdChmcmFtZVZpZXctPmNvbnRlbnRzVG9XaW5k
b3coZnJhbWVSZWN0KCkubG9jYXRpb24oKSksIGZyYW1lUmVjdCgpLnNpemUoKSk7CisKKyAgICAv
LyBNYXAgcmVjdCB0byBjb250ZW50IGNvb3JkaW5hdGUgc3BhY2Ugb2YgbWFpbiBmcmFtZS4KKyAg
ICBtX3dpbmRvd1JlY3QubW92ZShyb290KCktPnNjcm9sbE9mZnNldCgpKTsKKworICAgIG1fY2xp
cFJlY3QgPSBjYWxjdWxhdGVDbGlwUmVjdCgpOworICAgIEludFJlY3QgZiA9IGZyYW1lUmVjdCgp
OworCisgICAgLy8gTm90aWZ5IHRoZSBwbHVnaW4gaWYgaXQgbWF5IG9yIG1heSBub3QgYmUgb24v
b2Zmc2NyZWVuLgorICAgIGhhbmRsZVNjcm9sbEV2ZW50KCk7CisKKyAgICBib29sIHpvb21GYWN0
b3JDaGFuZ2VkID0gKChOUFNldFdpbmRvd0NhbGxiYWNrU3RydWN0KiltX25wV2luZG93LndzX2lu
Zm8pLT56b29tRmFjdG9yCisgICAgICAgICE9IGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0
Zm9ybVBhZ2VDbGllbnQoKS0+Y3VycmVudFpvb21GYWN0b3IoKTsKKworICAgIGlmICghem9vbUZh
Y3RvckNoYW5nZWQgJiYgbV93aW5kb3dSZWN0ID09IG9sZFdpbmRvd1JlY3QgJiYgbV9jbGlwUmVj
dCA9PSBvbGRDbGlwUmVjdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRG8gbm90IGNhbGwg
c2V0TlBXaW5kb3dJZk5lZWRlZCBpbW1lZGlhdGVseSwgd2lsbCBiZSBjYWxsZWQgb24gcGFpbnQo
KS4KKyAgICBtX3ByaXZhdGUtPm1faGFzUGVuZGluZ0dlb21ldHJ5Q2hhbmdlID0gdHJ1ZTsKKwor
ICAgIC8vIChpKSBJbiBvcmRlciB0byBtb3ZlL3Jlc2l6ZSB0aGUgcGx1Z2luIHdpbmRvdyBhdCB0
aGUgc2FtZSB0aW1lIGFzIHRoZQorICAgIC8vIHJlc3Qgb2YgZnJhbWUgZHVyaW5nIGUuZy4gc2Ny
b2xsaW5nLCB3ZSBzZXQgdGhlIHdpbmRvdyBnZW9tZXRyeQorICAgIC8vIGluIHRoZSBwYWludCgp
IGZ1bmN0aW9uLCBidXQgYXMgcGFpbnQoKSBpc24ndCBjYWxsZWQgd2hlbiB0aGUKKyAgICAvLyBw
bHVnaW4gd2luZG93IGlzIG91dHNpZGUgdGhlIGZyYW1lIHdoaWNoIGNhbiBiZSBjYXVzZWQgYnkg
YQorICAgIC8vIHNjcm9sbCwgd2UgbmVlZCB0byBtb3ZlL3Jlc2l6ZSBpbW1lZGlhdGVseS4KKyAg
ICAvLyAoaWkpIElmIHdlIGFyZSBydW5uaW5nIGxheW91dCB0ZXN0cyBmcm9tIERSVCwgcGFpbnQo
KSB3b24ndCBldmVyIGdldCBjYWxsZWQKKyAgICAvLyBzbyB3ZSBuZWVkIHRvIGNhbGwgc2V0TlBX
aW5kb3dJZk5lZWRlZCgpIGlmIHdpbmRvdyBnZW9tZXRyeSBoYXMgY2hhbmdlZC4KKyAgICBpZiAo
bV9jbGlwUmVjdC5pc0VtcHR5KCkgfHwgKHBsYXRmb3JtUGx1Z2luV2lkZ2V0KCkgJiYgKG1fd2lu
ZG93UmVjdCAhPSBvbGRXaW5kb3dSZWN0IHx8IG1fY2xpcFJlY3QgIT0gb2xkQ2xpcFJlY3QgfHwg
em9vbUZhY3RvckNoYW5nZWQpKSkKKyAgICAgICAgc2V0TlBXaW5kb3dJZk5lZWRlZCgpOworCisg
ICAgLy8gTWFrZSBzdXJlIHdlIGdldCByZXBhaW50ZWQgYWZ0ZXJ3YXJkcy4gVGhpcyBpcyBuZWNl
c3NhcnkgZm9yIGRvd253YXJkCisgICAgLy8gc2Nyb2xsaW5nIHRvIG1vdmUgdGhlIHBsdWdpbiB3
aWRnZXQgcHJvcGVybHkuCisgICAgaW52YWxpZGF0ZSgpOworfQorCit2b2lkIFBsdWdpblZpZXc6
OnNldEZvY3VzKGJvb2wgZm9jdXNlZCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSB8fCBtX3ByaXZh
dGUtPm1faXNGb2N1c2VkID09IGZvY3VzZWQpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VS
VChwbGF0Zm9ybVBsdWdpbldpZGdldCgpID09IHBsYXRmb3JtV2lkZ2V0KCkpOworICAgIFdpZGdl
dDo6c2V0Rm9jdXMoZm9jdXNlZCk7CisKKyAgICBpZiAoZm9jdXNlZCkKKyAgICAgICAgaGFuZGxl
Rm9jdXNJbkV2ZW50KCk7CisgICAgZWxzZQorICAgICAgICBoYW5kbGVGb2N1c091dEV2ZW50KCk7
Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2hvdygpCit7CisgICAgc2V0U2VsZlZpc2libGUodHJ1
ZSk7CisgICAgV2lkZ2V0OjpzaG93KCk7CisgICAgdXBkYXRlUGx1Z2luV2lkZ2V0KCk7Cit9CisK
K3ZvaWQgUGx1Z2luVmlldzo6aGlkZSgpCit7CisgICAgc2V0U2VsZlZpc2libGUoZmFsc2UpOwor
ICAgIFdpZGdldDo6aGlkZSgpOworICAgIHVwZGF0ZVBsdWdpbldpZGdldCgpOworfQorCit2b2lk
IFBsdWdpblZpZXc6OnVwZGF0ZUJ1ZmZlcihjb25zdCBJbnRSZWN0JiBidWZmZXJSZWN0KQorewor
ICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBVcGRhdGUgdGhl
IHpvb20gZmFjdG9yIGhlcmUsIGl0IGhhcHBlbnMgcmlnaHQgYmVmb3JlIHNldE5QV2luZG93SWZO
ZWVkZWQKKyAgICAvLyBlbnN1cmluZyB0aGF0IHRoZSBwbHVnaW4gaGFzIGV2ZXJ5IG9wcG9ydHVu
aXR5IHRvIGdldCB0aGUgem9vbSBmYWN0b3IgYmVmb3JlCisgICAgLy8gaXQgcGFpbnRzIGFueXRo
aW5nLgorICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmll
dyo+KHBhcmVudCgpKSkKKyAgICAgICAgbV9wcml2YXRlLT5zZXRab29tRmFjdG9yKGZyYW1lVmll
dy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+Y3VycmVudFpvb21GYWN0b3Io
KSk7CisKKyAgICBzZXROUFdpbmRvd0lmTmVlZGVkKCk7CisKKyAgICAvLyBCdWlsZCBhbmQgZGlz
cGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsdWdpbiB0byBub3RpZnkgaXQgd2UgYXJlIGFib3V0IHRv
IGRyYXcgd2hhdGV2ZXIKKyAgICAvLyBpcyBpbiB0aGUgZnJvbnQgYnVmZmVyLiBUaGlzIGlzIGl0
J3Mgb3Bwb3J0dW5pdHkgdG8gZG8gYSBzd2FwLgorICAgIEludFJlY3QgZXhwb3NlZFJlY3QoYnVm
ZmVyUmVjdCk7CisgICAgZXhwb3NlZFJlY3QuaW50ZXJzZWN0KEludFJlY3QoSW50UG9pbnQoMCwg
MCksIGZyYW1lUmVjdCgpLnNpemUoKSkpOworCisgICAgLy8gT25seSBhc2sgdGhlIHBsdWdpbiB0
byBkcmF3IGlmIHRoZSBleHBvc2VkIHJlY3Qgd2FzIGV4cGxpY2l0bHkgaW52YWxpZGF0ZWQKKyAg
ICAvLyBieSB0aGUgcGx1Z2luLgorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVn
aW9uIGV4cG9zZWRSZWdpb24gPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6
aW50ZXJzZWN0UmVnaW9ucyhtX3ByaXZhdGUtPm1faW52YWxpZGF0ZVJlZ2lvbiwgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkludFJlY3QoZXhwb3NlZFJlY3QpKTsKKyAgICBpZiAoIWV4cG9zZWRSZWdp
b24uaXNFbXB0eSgpKSB7CisgICAgICAgIG1fcHJpdmF0ZS0+bV9pbnZhbGlkYXRlUmVnaW9uID0g
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyhtX3By
aXZhdGUtPm1faW52YWxpZGF0ZVJlZ2lvbiwgZXhwb3NlZFJlZ2lvbik7CisgICAgICAgIHN0ZDo6
dmVjdG9yPEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0PiBleHBvc2VkUmVjdHMgPSBleHBv
c2VkUmVnaW9uLnJlY3RzKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBleHBv
c2VkUmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIE5QRHJhd0V2ZW50IGRyYXc7Cisg
ICAgICAgICAgICBkcmF3LnBsdWdpblJlY3QgPSB0b05QUmVjdChtX3dpbmRvd1JlY3QpOworICAg
ICAgICAgICAgZHJhdy5jbGlwUmVjdCA9IHRvTlBSZWN0KG1fY2xpcFJlY3QpOworICAgICAgICAg
ICAgZHJhdy5kcmF3UmVjdCA9IChOUFJlY3QqKWFsbG9jYShzaXplb2YoTlBSZWN0KSk7CisgICAg
ICAgICAgICBkcmF3LmRyYXdSZWN0Q291bnQgPSAxOworICAgICAgICAgICAgKmRyYXcuZHJhd1Jl
Y3QgPSB0b05QUmVjdChleHBvc2VkUmVjdHMuYXQoaSkpOworICAgICAgICAgICAgZHJhdy56b29t
RmFjdG9yID0gKChOUFNldFdpbmRvd0NhbGxiYWNrU3RydWN0KiltX25wV2luZG93LndzX2luZm8p
LT56b29tRmFjdG9yOworCisgICAgICAgICAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgICAgICAg
ICBucEV2ZW50LnR5cGUgPSBOUF9EcmF3RXZlbnQ7CisgICAgICAgICAgICBucEV2ZW50LmRhdGEg
PSAmZHJhdzsKKworICAgICAgICAgICAgLy8gRklYTUU6IFJldHVybiBlYXJseSBpZiB0aGlzIGZh
aWxzPyBPciBqdXN0IHJlcGFpbnQ/CisgICAgICAgICAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVu
dCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6cGFpbnQoR3JhcGhp
Y3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmICghbV9w
cml2YXRlIHx8ICFtX2lzU3RhcnRlZCkgeworICAgICAgICBwYWludE1pc3NpbmdQbHVnaW5JY29u
KGNvbnRleHQsIHJlY3QpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVXBkYXRl
IHRoZSB6b29tIGZhY3RvciBoZXJlLCBpdCBoYXBwZW5zIHJpZ2h0IGJlZm9yZSBzZXROUFdpbmRv
d0lmTmVlZGVkCisgICAgLy8gZW5zdXJpbmcgdGhhdCB0aGUgcGx1Z2luIGhhcyBldmVyeSBvcHBv
cnR1bml0eSB0byBnZXQgdGhlIHpvb20gZmFjdG9yIGJlZm9yZQorICAgIC8vIGl0IHBhaW50cyBh
bnl0aGluZy4KKyAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFt
ZVZpZXcqPihwYXJlbnQoKSkpCisgICAgICAgIG1fcHJpdmF0ZS0+c2V0Wm9vbUZhY3RvcihmcmFt
ZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmN1cnJlbnRab29tRmFj
dG9yKCkpOworCisgICAgaWYgKGNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgc2V0TlBXaW5kb3dJZk5lZWRlZCgpOworCisjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorICAgIGlmIChtX3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllcikKKyAg
ICAgICAgcmV0dXJuOworI2VuZGlmCisKKyAgICAvLyBCdWlsZCBhbmQgZGlzcGF0Y2ggYW4gZXZl
bnQgdG8gdGhlIHBsdWdpbiB0byBub3RpZnkgaXQgd2UgYXJlIGFib3V0IHRvIGRyYXcgd2hhdGV2
ZXIKKyAgICAvLyBpcyBpbiB0aGUgZnJvbnQgYnVmZmVyLiBUaGlzIGlzIGl0J3Mgb3Bwb3J0dW5p
dHkgdG8gZG8gYSBzd2FwLgorICAgIEludFJlY3QgcmVjdENsaXAocmVjdCk7CisgICAgcmVjdENs
aXAuaW50ZXJzZWN0KGZyYW1lUmVjdCgpKTsKKworICAgIEludFJlY3QgZXhwb3NlZFJlY3QocmVj
dENsaXApOworICAgIGV4cG9zZWRSZWN0Lm1vdmUoLWZyYW1lUmVjdCgpLngoKSwgLWZyYW1lUmVj
dCgpLnkoKSk7CisKKyAgICB1cGRhdGVCdWZmZXIoZXhwb3NlZFJlY3QpOworCisgICAgUHRocmVh
ZFJlYWRMb2NrZXIgZnJvbnRMb2NrKCZtX3ByaXZhdGUtPm1fZnJvbnRCdWZmZXJSd0xvY2spOwor
CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGZyb250QnVmZmVy
ID0KKyAgICAgICAgbV9wcml2YXRlLT5tX3BsdWdpbkJ1ZmZlcnNbbV9wcml2YXRlLT5tX3BsdWdp
bkZyb250QnVmZmVyXTsKKworICAgIC8vIERvbid0IHBhaW50IGFueXRoaW5nIGlmIHRoZXJlIGlz
IG5vIGJ1ZmZlci4KKyAgICBpZiAoIWZyb250QnVmZmVyKQorICAgICAgICByZXR1cm47CisKKyAg
ICBjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJhY2tpbmdJbWFnZSogYmFj
a2luZ0ltYWdlID0KKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpsb2Nr
QnVmZmVyQmFja2luZ0ltYWdlKGZyb250QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkdyYXBoaWNzOjpSZWFkQWNjZXNzKTsKKyAgICBpZiAoIWJhY2tpbmdJbWFnZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gRHJhdyB0aGUgY2hhbmdlZCBidWZmZXIgY29udGVudHMgdG8gdGhl
IHNjcmVlbi4KKyAgICBjb250ZXh0LT5zYXZlKCk7CisKKyAgICBjb25zdCBTa0JpdG1hcCYgcGx1
Z2luSW1hZ2UgPSAqYmFja2luZ0ltYWdlOworICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBn
cmFwaGljcyA9IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOworICAgIEFTU0VSVChncmFwaGlj
cyk7CisgICAgU2tDYW52YXMqIGNhbnZhcyA9IGdyYXBoaWNzLT5jYW52YXMoKTsKKworICAgIC8v
IFNvdXJjZSByZWN0YW5nbGUgd2Ugd2lsbCBkcmF3IHRvIHRoZSBzY3JlZW4uCisgICAgU2tJUmVj
dCBza1NyY1JlY3Q7CisgICAgc2tTcmNSZWN0LnNldChleHBvc2VkUmVjdC54KCksIGV4cG9zZWRS
ZWN0LnkoKSwKKyAgICAgICAgICAgICAgICAgIGV4cG9zZWRSZWN0LngoKSArIGV4cG9zZWRSZWN0
LndpZHRoKCksCisgICAgICAgICAgICAgICAgICBleHBvc2VkUmVjdC55KCkgKyBleHBvc2VkUmVj
dC5oZWlnaHQoKSk7CisKKyAgICAvLyBQcmVwYXJlIHRoZSBob2xlIHB1bmNoIHJlY3RhbmdsZS4K
KyAgICBTa0lSZWN0IHVuY2xpcHBlZEhvbGVQdW5jaFJlY3Q7CisgICAgdW5jbGlwcGVkSG9sZVB1
bmNoUmVjdC5zZXQobV9wcml2YXRlLT5tX2hvbGVQdW5jaFJlY3QueCgpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LnkoKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC54KCkg
KyBtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC53aWR0aCgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LnkoKSArIG1fcHJpdmF0ZS0+
bV9ob2xlUHVuY2hSZWN0LmhlaWdodCgpKTsKKworICAgIC8vIGhvbGVQdW5jaFJlY3QgaXMgY2xp
cHBlZC4KKyAgICBTa0lSZWN0IGhvbGVQdW5jaFJlY3Q7CisKKyAgICAvLyBBbGwgc291cmNlIHJl
Y3RhbmdsZXMgYXJlIHNjYWxlZCBieSB0aGUgem9vbSBmYWN0b3IgYmVjYXVzZSB0aGUgc291cmNl
IGJpdG1hcCBtYXkgYmUgYQorICAgIC8vIGhpZ2hlciByZXNvbHV0aW9uIHRoYW4gdGhlIDE6MSBw
YWdlLiBUaGlzIGFsbG93cyB0aGUgZmxhc2ggcGxheWVyIHRvIHNjYWxlIHRoZSBjb250ZW50Cisg
ICAgLy8gaXQgaXMgZHJhd2luZyB0byBtYXRjaCB0aGUgc2NhbGUgb2YgdGhlIHBhZ2UuCisgICAg
ZG91YmxlIHpvb21GYWN0b3JIID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX3ByaXZhdGUtPm1fcGx1
Z2luQnVmZmVyU2l6ZS53aWR0aCgpKSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oZnJhbWVSZWN0KCku
d2lkdGgoKSk7CisgICAgZG91YmxlIHpvb21GYWN0b3JXID0gc3RhdGljX2Nhc3Q8ZG91YmxlPiht
X3ByaXZhdGUtPm1fcGx1Z2luQnVmZmVyU2l6ZS5oZWlnaHQoKSkgLyBzdGF0aWNfY2FzdDxkb3Vi
bGU+KGZyYW1lUmVjdCgpLmhlaWdodCgpKTsKKyAgICBkb3VibGUgem9vbUZhY3RvciA9ICh6b29t
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
LCBza1NyY1JlY3QuZlJpZ2h0LCBob2xlUHVuY2hSZWN0LmZCb3R0b20pOworICAgICAgICAgICAg
ZHN0UmVjdC5vZmZzZXQoZnJhbWVSZWN0KCkueCgpLCBmcmFtZVJlY3QoKS55KCkpOworCisgICAg
ICAgICAgICBjYW52YXMtPmRyYXdCaXRtYXBSZWN0KHBsdWdpbkltYWdlLCAmc3JjUmVjdCwgZHN0
UmVjdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEcmF3IHRoZSBib3R0b20gY2h1bmsgaWYg
bmVlZGVkLgorICAgICAgICBpZiAoaG9sZVB1bmNoUmVjdC5mQm90dG9tIDwgc2tTcmNSZWN0LmZC
b3R0b20pIHsKKyAgICAgICAgICAgIFNrSVJlY3Qgc3JjUmVjdDsKKyAgICAgICAgICAgIHNyY1Jl
Y3Quc2V0KHNrU3JjUmVjdC5mTGVmdCAqIHpvb21GYWN0b3IsIGhvbGVQdW5jaFJlY3QuZkJvdHRv
bSAqIHpvb21GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBza1NyY1JlY3QuZlJpZ2h0
ICogem9vbUZhY3Rvciwgc2tTcmNSZWN0LmZCb3R0b20gKiB6b29tRmFjdG9yKTsKKworICAgICAg
ICAgICAgU2tSZWN0IGRzdFJlY3Q7CisgICAgICAgICAgICBkc3RSZWN0LnNldChza1NyY1JlY3Qu
ZkxlZnQsIGhvbGVQdW5jaFJlY3QuZkJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNr
U3JjUmVjdC5mUmlnaHQsIHNrU3JjUmVjdC5mQm90dG9tKTsKKyAgICAgICAgICAgIGRzdFJlY3Qu
b2Zmc2V0KGZyYW1lUmVjdCgpLngoKSwgZnJhbWVSZWN0KCkueSgpKTsKKworICAgICAgICAgICAg
Y2FudmFzLT5kcmF3Qml0bWFwUmVjdChwbHVnaW5JbWFnZSwgJnNyY1JlY3QsIGRzdFJlY3QpOwor
ICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2tJUmVjdCBzcmNSZWN0OworICAgICAg
ICBzcmNSZWN0LnNldChza1NyY1JlY3QuZkxlZnQgKiB6b29tRmFjdG9yLCBza1NyY1JlY3QuZlRv
cCAqIHpvb21GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgIHNrU3JjUmVjdC5mUmlnaHQgKiB6
b29tRmFjdG9yLCBza1NyY1JlY3QuZkJvdHRvbSAqIHpvb21GYWN0b3IpOworCisgICAgICAgIC8v
IENhbGN1bGF0ZSB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlLgorICAgICAgICBTa1JlY3QgZHN0
UmVjdDsKKyAgICAgICAgZHN0UmVjdC5zZXQocmVjdENsaXAueCgpLCByZWN0Q2xpcC55KCksCisg
ICAgICAgICAgICAgICAgICAgIHJlY3RDbGlwLngoKSArIHJlY3RDbGlwLndpZHRoKCksCisgICAg
ICAgICAgICAgICAgICAgIHJlY3RDbGlwLnkoKSArIHJlY3RDbGlwLmhlaWdodCgpKTsKKworICAg
ICAgICAvLyBEb24ndCBwdW5jaCBhIGhvbGUuCisgICAgICAgIGNhbnZhcy0+ZHJhd0JpdG1hcFJl
Y3QocGx1Z2luSW1hZ2UsICZzcmNSZWN0LCBkc3RSZWN0KTsKKyAgICB9CisKKyAgICBjb250ZXh0
LT5yZXN0b3JlKCk7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OnJlbGVh
c2VCdWZmZXJCYWNraW5nSW1hZ2UoZnJvbnRCdWZmZXIpOworfQorCisKK2Jvb2wgUGx1Z2luVmll
dzo6ZGlzcGF0Y2hGdWxsU2NyZWVuTlBFdmVudChOUEV2ZW50JiBldmVudCkKK3sKKyAgICBpZiAo
IW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQVNTRVJUKG1fcHJpdmF0
ZS0+bV9pc0Z1bGxTY3JlZW4pOworICAgIHJldHVybiBkaXNwYXRjaE5QRXZlbnQoZXZlbnQpOwor
fQorCisvLyBGSVhNRTogVW5pZnkgYWNyb3NzIHBvcnRzLgorYm9vbCBQbHVnaW5WaWV3OjpkaXNw
YXRjaE5QRXZlbnQoTlBFdmVudCYgZXZlbnQpCit7CisgICAgaWYgKCFtX3BsdWdpbiB8fCAhbV9w
bHVnaW4tPnBsdWdpbkZ1bmNzKCktPmV2ZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldyh0aGlzKTsKKyAgICBKU0M6OkpTTG9j
azo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrcyhKU0M6OlNpbGVuY2VBc3NlcnRpb25zT25seSk7
CisgICAgc2V0Q2FsbGluZ1BsdWdpbih0cnVlKTsKKworICAgIGJvb2wgYWNjZXB0ZWQgPSBtX3Bs
dWdpbi0+cGx1Z2luRnVuY3MoKS0+ZXZlbnQobV9pbnN0YW5jZSwgJmV2ZW50KTsKKworICAgIHNl
dENhbGxpbmdQbHVnaW4oZmFsc2UpOworICAgIFBsdWdpblZpZXc6OnNldEN1cnJlbnRQbHVnaW5W
aWV3KDApOworCisgICAgcmV0dXJuIGFjY2VwdGVkOworfQorCit2b2lkIFBsdWdpblZpZXc6Omhh
bmRsZUtleWJvYXJkRXZlbnQoS2V5Ym9hcmRFdmVudCogZXZlbnQpCit7CisgICAgTlBFdmVudCBu
cEV2ZW50OworICAgIE5QS2V5Ym9hcmRFdmVudCBrZXlFdmVudDsKKyAgICBjb25zdCBQbGF0Zm9y
bUtleWJvYXJkRXZlbnQgKnBsYXRmb3JtS2V5RXZlbnQgPSBldmVudC0+a2V5RXZlbnQoKTsKKwor
ICAgIGtleUV2ZW50Lm1vZGlmaWVycyA9IDA7CisKKyAgICBpZiAocGxhdGZvcm1LZXlFdmVudC0+
c2hpZnRLZXkoKSkKKyAgICAgICAga2V5RXZlbnQubW9kaWZpZXJzIHw9IEtFWU1PRF9TSElGVDsK
KworICAgIGlmIChwbGF0Zm9ybUtleUV2ZW50LT5jdHJsS2V5KCkpCisgICAgICAgIGtleUV2ZW50
Lm1vZGlmaWVycyB8PSBLRVlNT0RfQ1RSTDsKKworICAgIGlmIChwbGF0Zm9ybUtleUV2ZW50LT5h
bHRLZXkoKSkKKyAgICAgICAga2V5RXZlbnQubW9kaWZpZXJzIHw9IEtFWU1PRF9BTFQ7CisKKyAg
ICBpZiAocGxhdGZvcm1LZXlFdmVudC0+bWV0YUtleSgpKQorICAgICAgICBrZXlFdmVudC5tb2Rp
ZmllcnMgfD0gS0VZTU9EX0FMVEdSOworCisgICAga2V5RXZlbnQuY2FwID0gcGxhdGZvcm1LZXlF
dmVudC0+dW5tb2RpZmllZENoYXJhY3RlcigpOworICAgIGtleUV2ZW50LnN5bSA9IGtleUV2ZW50
LmNhcDsKKyAgICBrZXlFdmVudC5zY2FuID0gMDsKKyAgICBrZXlFdmVudC5mbGFncyA9IDA7CisK
KyAgICBpZiAocGxhdGZvcm1LZXlFdmVudC0+dHlwZSgpID09IFBsYXRmb3JtS2V5Ym9hcmRFdmVu
dDo6UmF3S2V5RG93bgorICAgICAgICB8fCBwbGF0Zm9ybUtleUV2ZW50LT50eXBlKCkgPT0gUGxh
dGZvcm1LZXlib2FyZEV2ZW50OjpLZXlEb3duKSB7CisgICAgICAgIGtleUV2ZW50LmZsYWdzID0g
S0VZX0RPV04gfCBLRVlfU1lNX1ZBTElEIHwgS0VZX0NBUF9WQUxJRDsKKyAgICB9IGVsc2UgaWYg
KHBsYXRmb3JtS2V5RXZlbnQtPnR5cGUoKSA9PSBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6OktleVVw
KQorICAgICAgICBrZXlFdmVudC5mbGFncyA9IEtFWV9TWU1fVkFMSUQgfCBLRVlfQ0FQX1ZBTElE
OworCisgICAgbnBFdmVudC50eXBlID0gTlBfS2V5RXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0g
JmtleUV2ZW50OworICAgIGlmIChkaXNwYXRjaE5QRXZlbnQobnBFdmVudCkpCisgICAgICAgIGV2
ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZVdo
ZWVsRXZlbnQoV2hlZWxFdmVudCogZXZlbnQpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmICghbV9wcml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAgICAg
Zm9jdXNQbHVnaW5FbGVtZW50KCk7CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgTlBXaGVl
bEV2ZW50IHdoZWVsRXZlbnQ7CisKKyAgICB3aGVlbEV2ZW50LnggPSBldmVudC0+b2Zmc2V0WCgp
OworICAgIHdoZWVsRXZlbnQueSA9IGV2ZW50LT5vZmZzZXRZKCk7CisKKyAgICB3aGVlbEV2ZW50
LmZsYWdzID0gMDsKKworICAgIHdoZWVsRXZlbnQueERlbHRhID0gZXZlbnQtPnJhd0RlbHRhWCgp
OworICAgIHdoZWVsRXZlbnQueURlbHRhID0gZXZlbnQtPnJhd0RlbHRhWSgpOworCisgICAgbnBF
dmVudC50eXBlID0gTlBfV2hlZWxFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAmd2hlZWxFdmVu
dDsKKworICAgIGlmIChkaXNwYXRjaE5QRXZlbnQobnBFdmVudCkpIHsKKyAgICAgICAgZXZlbnQt
PnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgICAgIGV2ZW50LT5zZXRQbHVnaW5IYW5kbGVkKCk7
CisgICAgfQorfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZVRvdWNoRXZlbnQoVG91Y2hFdmVu
dCogZXZlbnQpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmICghbV9wcml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAgICAgZm9jdXNQbHVnaW5FbGVtZW50
KCk7CisKKyAgICBOUFRvdWNoRXZlbnQgbnBUb3VjaEV2ZW50OworCisgICAgaWYgKGV2ZW50LT5p
c0RvdWJsZVRhcCgpKQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0RP
VUJMRVRBUDsKKyAgICBlbHNlIGlmIChldmVudC0+aXNUb3VjaEhvbGQoKSkKKyAgICAgICAgbnBU
b3VjaEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9UT1VDSEhPTEQ7CisgICAgZWxzZSBpZiAoZXZl
bnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkudG91Y2hzdGFydEV2ZW50KQorICAgICAgICBucFRv
dWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX1NUQVJUOworICAgIGVsc2UgaWYgKGV2ZW50LT50
eXBlKCkgPT0gZXZlbnROYW1lcygpLnRvdWNoZW5kRXZlbnQpCisgICAgICAgIG5wVG91Y2hFdmVu
dC50eXBlID0gVE9VQ0hfRVZFTlRfRU5EOworICAgIGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0g
ZXZlbnROYW1lcygpLnRvdWNobW92ZUV2ZW50KQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9
IFRPVUNIX0VWRU5UX01PVkU7CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5h
bWVzKCkudG91Y2hjYW5jZWxFdmVudCkKKyAgICAgICAgbnBUb3VjaEV2ZW50LnR5cGUgPSBUT1VD
SF9FVkVOVF9DQU5DRUw7CisgICAgZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVG91Y2hMaXN0KiB0b3VjaExpc3Q7Cisg
ICAgLy8gVGhlIHRvdWNoZXMgbGlzdCBpcyBlbXB0eSBpZiBpbiBhIHRvdWNoIGVuZCBldmVudC4g
VXNlIGNoYW5nZWRUb3VjaGVzIGluc3RlYWQuCisgICAgaWYgKG5wVG91Y2hFdmVudC50eXBlID09
IFRPVUNIX0VWRU5UX0RPVUJMRVRBUCB8fCBucFRvdWNoRXZlbnQudHlwZSA9PSBUT1VDSF9FVkVO
VF9FTkQpCisgICAgICAgIHRvdWNoTGlzdCA9IGV2ZW50LT5jaGFuZ2VkVG91Y2hlcygpOworICAg
IGVsc2UKKyAgICAgICAgdG91Y2hMaXN0ID0gZXZlbnQtPnRvdWNoZXMoKTsKKworICAgIG5wVG91
Y2hFdmVudC5wb2ludHMgPSAwOworICAgIG5wVG91Y2hFdmVudC5zaXplID0gdG91Y2hMaXN0LT5s
ZW5ndGgoKTsKKworICAgIE93bkFycmF5UHRyPE5QVG91Y2hQb2ludD4gdG91Y2hQb2ludHM7Cisg
ICAgaWYgKHRvdWNoTGlzdC0+bGVuZ3RoKCkpIHsKKyAgICAgICAgdG91Y2hQb2ludHMgPSBhZG9w
dEFycmF5UHRyKG5ldyBOUFRvdWNoUG9pbnRbdG91Y2hMaXN0LT5sZW5ndGgoKV0pOworICAgICAg
ICBucFRvdWNoRXZlbnQucG9pbnRzID0gdG91Y2hQb2ludHMuZ2V0KCk7CisgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCB0b3VjaExpc3QtPmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAg
ICAgIFRvdWNoKiB0b3VjaEl0ZW0gPSB0b3VjaExpc3QtPml0ZW0oaSk7CisgICAgICAgICAgICBu
cFRvdWNoRXZlbnQucG9pbnRzW2ldLnRvdWNoSWQgPSB0b3VjaEl0ZW0tPmlkZW50aWZpZXIoKTsK
KyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHNbaV0uY2xpZW50WCA9IHRvdWNoSXRlbS0+
cGFnZVgoKSAtIGZyYW1lUmVjdCgpLngoKTsKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2lu
dHNbaV0uY2xpZW50WSA9IHRvdWNoSXRlbS0+cGFnZVkoKSAtIGZyYW1lUmVjdCgpLnkoKTsKKyAg
ICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHNbaV0uc2NyZWVuWCA9IHRvdWNoSXRlbS0+c2Ny
ZWVuWCgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5zY3JlZW5ZID0gdG91
Y2hJdGVtLT5zY3JlZW5ZKCk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnBh
Z2VYID0gdG91Y2hJdGVtLT5wYWdlWCgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50
c1tpXS5wYWdlWSA9IHRvdWNoSXRlbS0+cGFnZVkoKTsKKworICAgICAgICB9CisgICAgfQorCisg
ICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX1RvdWNoRXZlbnQ7Cisg
ICAgbnBFdmVudC5kYXRhID0gJm5wVG91Y2hFdmVudDsKKworICAgIGlmIChkaXNwYXRjaE5QRXZl
bnQobnBFdmVudCkpIHsKKyAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAg
ICAgIGV2ZW50LT5zZXRQbHVnaW5IYW5kbGVkKCk7CisgICAgfSBlbHNlIGlmIChucFRvdWNoRXZl
bnQudHlwZSA9PSBUT1VDSF9FVkVOVF9ET1VCTEVUQVApIHsKKyAgICAgICAgLy8gU2VuZCBUb3Vj
aCBVcCBpZiBkb3VibGUgdGFwIG5vdCBjb25zdW1lZAorICAgICAgICBucFRvdWNoRXZlbnQudHlw
ZSA9IFRPVUNIX0VWRU5UX0VORDsKKyAgICAgICAgbnBFdmVudC5kYXRhID0gJm5wVG91Y2hFdmVu
dDsKKyAgICAgICAgaWYgKGRpc3BhdGNoTlBFdmVudChucEV2ZW50KSkgeworICAgICAgICAgICAg
ZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgICAgICAgICBldmVudC0+c2V0UGx1Z2lu
SGFuZGxlZCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRs
ZU1vdXNlRXZlbnQoTW91c2VFdmVudCogZXZlbnQpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisg
ICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9wcml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAg
ICAgZm9jdXNQbHVnaW5FbGVtZW50KCk7CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgTlBN
b3VzZUV2ZW50IG1vdXNlRXZlbnQ7CisKKyAgICBtb3VzZUV2ZW50LnggPSBldmVudC0+b2Zmc2V0
WCgpOworICAgIG1vdXNlRXZlbnQueSA9IGV2ZW50LT5vZmZzZXRZKCk7CisKKyAgICBpZiAoZXZl
bnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2Vkb3duRXZlbnQpIHsKKyAgICAgICAgbW91
c2VFdmVudC50eXBlID0gTU9VU0VfQlVUVE9OX0RPV047CisgICAgICAgIHBhcmVudEZyYW1lKCkt
PmV2ZW50SGFuZGxlcigpLT5zZXRDYXB0dXJpbmdNb3VzZUV2ZW50c05vZGUobm9kZSgpKTsKKyAg
ICB9IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLm1vdXNlbW92ZUV2ZW50
KQorICAgICAgICBtb3VzZUV2ZW50LnR5cGUgPSBNT1VTRV9NT1RJT047CisgICAgZWxzZSBpZiAo
ZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2VvdXRFdmVudCkKKyAgICAgICAgbW91
c2VFdmVudC50eXBlID0gTU9VU0VfT1VUQk9VTkQ7CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUo
KSA9PSBldmVudE5hbWVzKCkubW91c2VvdmVyRXZlbnQpCisgICAgICAgIG1vdXNlRXZlbnQudHlw
ZSA9IE1PVVNFX09WRVI7CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVz
KCkubW91c2V1cEV2ZW50KSB7CisgICAgICAgIG1vdXNlRXZlbnQudHlwZSA9IE1PVVNFX0JVVFRP
Tl9VUDsKKyAgICAgICAgcGFyZW50RnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCktPnNldENhcHR1cmlu
Z01vdXNlRXZlbnRzTm9kZSgwKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuOworCisgICAg
bW91c2VFdmVudC5idXR0b24gPSBldmVudC0+YnV0dG9uKCk7CisgICAgbW91c2VFdmVudC5mbGFn
cyA9IDA7CisKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9Nb3VzZUV2ZW50OworICAgIG5wRXZlbnQu
ZGF0YSA9ICZtb3VzZUV2ZW50OworCisgICAgaWYgKGRpc3BhdGNoTlBFdmVudChucEV2ZW50KSkg
eworICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKKyAgICAgICAgZXZlbnQtPnNl
dFBsdWdpbkhhbmRsZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlRm9j
dXNJbkV2ZW50KCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
cHJpdmF0ZS0+bV9pc0ZvY3VzZWQgPSB0cnVlOworCisgICAgTlBFdmVudCBucEV2ZW50OworICAg
IG5wRXZlbnQudHlwZSA9IE5QX0ZvY3VzR2FpbmVkRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0g
MDsKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6
aGFuZGxlRm9jdXNPdXRFdmVudCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJl
dHVybjsKKworICAgIGlmICghbV9wcml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgbV9wcml2YXRlLT5tX2lzRm9jdXNlZCA9IGZhbHNlOworCisgICAgTlBFdmVudCBu
cEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0ZvY3VzTG9zdEV2ZW50OworICAgIG5wRXZl
bnQuZGF0YSA9IDA7CisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBs
dWdpblZpZXc6OmhhbmRsZVBhdXNlRXZlbnQoKQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAg
ICBucEV2ZW50LnR5cGUgPSBOUF9QYXVzZUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7Cisg
ICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRs
ZVJlc3VtZUV2ZW50KCkKK3sKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBl
ID0gTlBfUmVzdW1lRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKyAgICBkaXNwYXRjaE5Q
RXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlU2Nyb2xsRXZlbnQo
KQoreworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4o
cGFyZW50KCkpOworCisgICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UsIGlmIHRoZSBmcmFtZVZpZXcg
ZXh0ZW50IGluIGVpdGhlciBkaW1lbnNpb24gaXMKKyAgICAvLyBlbXB0eSwgdGhlbiBzZW5kIGFu
IG9uIHNjcmVlbiBldmVudC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHNpdGVzIGxpa2UKKyAgICAv
LyBwaWNuaWsuY29tIHdoaWNoIHVzZSBhIGhpZGRlbiBpZnJhbWUgKHJlYWQ6IHdpZHRoID0gMCBh
bmQgaGVpZ2h0ID0gMCkKKyAgICAvLyB3aXRoIGFuIGVtYmVkZGVkIHN3ZiB0byBleGVjdXRlIHNv
bWUgamF2YXNjcmlwdC4gVW5sZXNzIHdlIHNlbmQgYW4KKyAgICAvLyBvbiBzY3JlZW4gZXZlbnQg
dGhlIHN3ZiB3aWxsIG5vdCBleGVjdXRlIHRoZSBqYXZhc2NyaXB0IGFuZCB0aGUgcmVhbAorICAg
IC8vIHNpdGUgd2lsbCBuZXZlciBsb2FkLgorICAgIGJvb2wgb25TY3JlZW5FdmVudCA9IGZyYW1l
VmlldyAmJiAoIWZyYW1lVmlldy0+d2lkdGgoKSB8fCAhZnJhbWVWaWV3LT5oZWlnaHQoKSk7CisK
KyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gbV9jbGlwUmVjdC5pc0Vt
cHR5KCkgJiYgIW9uU2NyZWVuRXZlbnQgPyBOUF9PZmZTY3JlZW5FdmVudCA6IE5QX09uU2NyZWVu
RXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVu
dCk7Cit9CisKK0ludFJlY3QgUGx1Z2luVmlldzo6Y2FsY3VsYXRlQ2xpcFJlY3QoKSBjb25zdAor
eworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFy
ZW50KCkpOworICAgIGJvb2wgdmlzaWJsZSA9IGZyYW1lVmlldyAmJiBpc1Zpc2libGUoKTsKKwor
ICAgIGlmICh2aXNpYmxlICYmIGZyYW1lVmlldy0+d2lkdGgoKSAmJiBmcmFtZVZpZXctPmhlaWdo
dCgpKSB7CisgICAgICAgIEludFNpemUgd2luZG93U2l6ZSA9IGZyYW1lVmlldy0+aG9zdFdpbmRv
dygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+dmlld3BvcnRTaXplKCk7CisKKyAgICAgICAgLy8g
R2V0IHRoZSBjbGlwcGVkIHJlY3RhbmdsZSBmb3IgdGhpcyBwbGF5ZXIgd2l0aGluIHRoZSBjdXJy
ZW50IGZyYW1lLgorICAgICAgICBJbnRSZWN0IHZpc2libGVDb250ZW50UmVjdDsKKyAgICAgICAg
SW50UmVjdCBjb250ZW50UmVjdCA9IG1fZWxlbWVudC0+cmVuZGVyZXIoKS0+YWJzb2x1dGVDbGlw
cGVkT3ZlcmZsb3dSZWN0KCk7CisgICAgICAgIEZsb2F0UG9pbnQgY29udGVudExvY2FsID0gbV9l
bGVtZW50LT5yZW5kZXJlcigpLT5hYnNvbHV0ZVRvTG9jYWwoRmxvYXRQb2ludChjb250ZW50UmVj
dC5sb2NhdGlvbigpKSk7CisKKyAgICAgICAgY29udGVudFJlY3Quc2V0TG9jYXRpb24ocm91bmRl
ZEludFBvaW50KGNvbnRlbnRMb2NhbCkpOworICAgICAgICBjb250ZW50UmVjdC5tb3ZlKGZyYW1l
UmVjdCgpLngoKSwgZnJhbWVSZWN0KCkueSgpKTsKKworICAgICAgICAvLyBDbGlwIGFnYWluc3Qg
YW55IGZyYW1lcyB0aGF0IHRoZSB3aWRnZXQgaXMgaW5zaWRlLiBOb3RlIHRoYXQgaWYgdGhlIGZy
YW1lcyBhcmUgYWxzbyBjbGlwcGVkCisgICAgICAgIC8vIGJ5IGEgZGl2LCB0aGF0IHdpbGwgbm90
IGJlIGluY2x1ZGVkIGluIHRoaXMgY2FsY3VsYXRpb24uIFRoYXQgaXMgYW4gaW1wcm92ZW1lbnQg
dGhhdCBzdGlsbAorICAgICAgICAvLyBuZWVkcyB0byBiZSBtYWRlLgorICAgICAgICBjb25zdCBX
aWRnZXQqIGN1cnJlbnQgPSB0aGlzOworICAgICAgICB3aGlsZSAoY3VycmVudC0+cGFyZW50KCkg
JiYgdmlzaWJsZSkgeworICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGl0IGlzIHZpc2libGUg
aW4gdGhpcyBzY3JvbGx2aWV3LgorICAgICAgICAgICAgdmlzaWJsZUNvbnRlbnRSZWN0ID0gY3Vy
cmVudC0+cGFyZW50KCktPnZpc2libGVDb250ZW50UmVjdCgpOworCisgICAgICAgICAgICAvLyBT
cGVjaWFsIGNhc2UgZm9yIHRoZSByb290IFNjcm9sbFZpZXcuIEl0cyBzaXplIGRvZXMgbm90IG1h
dGNoIHRoZSBhY3R1YWwgd2luZG93IHNpemUuCisgICAgICAgICAgICBpZiAoY3VycmVudC0+cGFy
ZW50KCkgPT0gcm9vdCgpKQorICAgICAgICAgICAgICAgIHZpc2libGVDb250ZW50UmVjdC5zZXRT
aXplKHdpbmRvd1NpemUpOworCisgICAgICAgICAgICBjb250ZW50UmVjdC5pbnRlcnNlY3Qodmlz
aWJsZUNvbnRlbnRSZWN0KTsKKyAgICAgICAgICAgIHZpc2libGUgPSAhY29udGVudFJlY3QuaXNF
bXB0eSgpOworCisgICAgICAgICAgICAvLyBPZmZzZXQgdG8gdmlzaWJsZSBjb29yZGluYXRlcyBp
biBzY3JvbGx2aWV3IHdpZGdldCdzIGNvb3JkaW5hdGUgc3lzdGVtIChleGNlcHQgaW4gdGhlIGNh
c2Ugb2YKKyAgICAgICAgICAgIC8vIHRoZSB0b3Agc2Nyb2xsIHZpZXcpLgorICAgICAgICAgICAg
aWYgKGN1cnJlbnQtPnBhcmVudCgpLT5wYXJlbnQoKSkKKyAgICAgICAgICAgICAgICBjb250ZW50
UmVjdC5tb3ZlKC12aXNpYmxlQ29udGVudFJlY3QueCgpLCAtdmlzaWJsZUNvbnRlbnRSZWN0Lnko
KSk7CisKKyAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQoKTsKKworICAgICAg
ICAgICAgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgb2Zmc2V0IGZvciB0aGUgcm9vdCB3aW5kb3cgb3Ig
d2UgZ2V0IHRoZSB3cm9uZyBjb29yZGluYXRlcy4KKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5w
YXJlbnQoKSkgeworICAgICAgICAgICAgICAgIC8vIE1vdmUgY29udGVudCByZWN0IGludG8gdGhl
IHBhcmVudCBzY3JvbGx2aWV3J3MgY29vcmRpbmF0ZXMuCisgICAgICAgICAgICAgICAgSW50UmVj
dCBjdXJGcmFtZVJlY3QgPSBjdXJyZW50LT5mcmFtZVJlY3QoKTsKKyAgICAgICAgICAgICAgICBj
b250ZW50UmVjdC5tb3ZlKGN1ckZyYW1lUmVjdC54KCksIGN1ckZyYW1lUmVjdC55KCkpOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRSZWN0OworICAg
IH0KKworICAgIHJldHVybiBJbnRSZWN0KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxl
T25Mb2FkRXZlbnQoKQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisK
KyAgICBpZiAobV9wcml2YXRlLT5tX3NlbnRPbkxvYWQpCisgICAgICAgIHJldHVybjsKKworICAg
IG1fcHJpdmF0ZS0+bV9zZW50T25Mb2FkID0gdHJ1ZTsKKworICAgIE5QRXZlbnQgbnBFdmVudDsK
KyAgICBucEV2ZW50LnR5cGUgPSBOUF9PbkxvYWRFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAw
OworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworCisgICAgLy8gU2VuZCBhbiBpbml0
aWFsIE9uU2NyZWVuL09mZlNjcmVlbiBldmVudC4gSXQgbXVzdCBhbHdheXMgY29tZSBhZnRlciBv
bkxvYWQgaXMgc2VudC4KKyAgICBoYW5kbGVTY3JvbGxFdmVudCgpOworfQorCit2b2lkIFBsdWdp
blZpZXc6OmhhbmRsZUZyZWVNZW1vcnlFdmVudCgpCit7CisgICAgTlBFdmVudCBucEV2ZW50Owor
ICAgIG5wRXZlbnQudHlwZSA9IE5QX0ZyZWVNZW1vcnlFdmVudDsKKyAgICBucEV2ZW50LmRhdGEg
PSAwOworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZp
ZXc6OmhhbmRsZUJhY2tncm91bmRFdmVudCgpCit7CisgICAgTlBFdmVudCBucEV2ZW50OworICAg
IG5wRXZlbnQudHlwZSA9IE5QX0JhY2tncm91bmRFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAw
OworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6
OmhhbmRsZUZvcmVncm91bmRFdmVudCgpCit7CisgICAgc2V0TlBXaW5kb3dJZk5lZWRlZCgpOwor
CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0ZvcmVncm91bmRF
dmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZl
bnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUZ1bGxTY3JlZW5BbGxvd2VkRXZlbnQo
KQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBOUEV2ZW50
IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfRnVsbFNjcmVlblJlYWR5RXZlbnQ7Cisg
ICAgbnBFdmVudC5kYXRhID0gMDsKKworICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0
YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkgeworICAgICAgICBmcmFtZVZpZXctPmhv
c3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmRpZFBsdWdpbkVudGVyRnVsbFNjcmVl
bih0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpOworCisgICAg
ICAgIGlmICghZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpKQorICAgICAgICAgICAgZnJhbWVWaWV3
LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5kaWRQbHVnaW5FeGl0RnVsbFNj
cmVlbih0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuID0gdHJ1ZTsK
KyAgICB9Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlRnVsbFNjcmVlbkV4aXRFdmVudCgp
Cit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIE5QRXZlbnQg
bnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9GdWxsU2NyZWVuRXhpdEV2ZW50OworICAg
IG5wRXZlbnQuZGF0YSA9IDA7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7CisKKyAg
ICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJl
bnQoKSkpCisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGll
bnQoKS0+ZGlkUGx1Z2luRXhpdEZ1bGxTY3JlZW4odGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVu
aXF1ZVByZWZpeC5jX3N0cigpKTsKKworICAgIG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4gPSBm
YWxzZTsKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlSWRs
ZUV2ZW50KGJvb2wgZW50ZXJJZGxlKQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2
ZW50LmRhdGEgPSAwOworCisgICAgaWYgKGVudGVySWRsZSkKKyAgICAgICAgbnBFdmVudC50eXBl
ID0gTlBfRW50ZXJJZGxlRXZlbnQ7CisgICAgZWxzZQorICAgICAgICBucEV2ZW50LnR5cGUgPSBO
UF9FeGl0SWRsZUV2ZW50OworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCisK
K3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlQXBwQWN0aXZhdGVkRXZlbnQoKQoreworICAgIE5QRXZl
bnQgbnBFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworICAgIG5wRXZlbnQudHlwZSA9IE5Q
X0FwcEFjdGl2YXRlZEV2ZW50OworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQor
Cit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUFwcERlYWN0aXZhdGVkRXZlbnQoKQoreworICAgIGlm
ICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBQbHVnaW4gd2FudHMgdG8g
a25vdyB0aGF0IGl0IGhhcyB0byBleGl0IGZ1bGxzY3JlZW4gb24gZGVhY3RpdmF0aW9uLgorICAg
IGlmIChtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuKQorICAgICAgICBoYW5kbGVGdWxsU2NyZWVu
RXhpdEV2ZW50KCk7CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0g
MDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9BcHBEZWFjdGl2YXRlZEV2ZW50OworCisgICAgZGlz
cGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUFwcFN0
YW5kYnlFdmVudCgpCit7CisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHNlbmQgYW4gUU5QX0Fw
cFN0YW5kYnlFdmVudAorICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAw
OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0FwcFN0YW5kQnlFdmVudDsKKworICAgIGRpc3BhdGNo
TlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVPcmllbnRhdGlv
bkV2ZW50KGludCBhbmdsZSkKK3sKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50
eXBlID0gTlBfT3JpZW50YXRpb25FdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAodm9pZCopYW5n
bGU7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmll
dzo6aGFuZGxlU3dpcGVFdmVudCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJl
dHVybjsKKworICAgIC8vIFBsdWdpbiBvbmx5IHdhbnRzIHRvIGtub3cgdGhhdCBpdCBoYXMgdG8g
ZXhpdCBmdWxsc2NyZWVuLgorICAgIGlmIChtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuKQorICAg
ICAgICBoYW5kbGVGdWxsU2NyZWVuRXhpdEV2ZW50KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6
aGFuZGxlU2NyZWVuUG93ZXJFdmVudChib29sIHBvd2VyZWQpCit7CisgICAgTlBFdmVudCBucEV2
ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisKKyAgICBpZiAocG93ZXJlZCkKKyAgICAgICAg
bnBFdmVudC50eXBlID0gTlBfU2NyZWVuUG93ZXJVcEV2ZW50OworICAgIGVsc2UKKyAgICAgICAg
bnBFdmVudC50eXBlID0gTlBfU2NyZWVuUG93ZXJEb3duRXZlbnQ7CisKKyAgICBkaXNwYXRjaE5Q
RXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0UGFyZW50KFNjcm9sbFZp
ZXcqIHBhcmVudFdpZGdldCkKK3sKKyAgICAvLyBJZiBwYXJlbnRXaWRnZXQgaXMgMCwgbGV0cyB1
bnJlZ2lzdGVyIHRoZSBwbHVnaW4gd2l0aCB0aGUgY3VycmVudCBwYXJlbnQuCisgICAgaWYgKG1f
cHJpdmF0ZSAmJiAoIXBhcmVudFdpZGdldCB8fCBwYXJlbnRXaWRnZXQgIT0gcGFyZW50KCkpKSB7
CisgICAgICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmll
dyo+KHBhcmVudCgpKSkgeworICAgICAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0JhY2tncm91
bmRQbGF5aW5nKQorICAgICAgICAgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0
Zm9ybVBhZ2VDbGllbnQoKS0+b25QbHVnaW5TdG9wQmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2
YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKKworICAgICAgICAgICAgaWYgKG1f
cHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAgICAgICAgICAgICAgaGFuZGxlRnVsbFNjcmVl
bkV4aXRFdmVudCgpOworCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdW5sb2NrIHRoZSBpZGxl
IChpZiB3ZSBoYXZlIGxvY2tlZCBpdCkuCisgICAgICAgICAgICBtX3ByaXZhdGUtPnByZXZlbnRJ
ZGxlKGZhbHNlKTsKKworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHJlbGVhc2UgYW55IGtlZXBW
aXNpYmxlUmVjdHMgaWYgdGhleSB3ZXJlIHNldC4KKyAgICAgICAgICAgIG1fcHJpdmF0ZS0+Y2xl
YXJWaXNpYmxlUmVjdHMoKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAg
ICAgICAgICAgIC8vIElmIHdlIGhhZCBhIGhvbGUgcHVuY2ggcmVjdCBzZXQsIGNsZWFyIGl0Lgor
ICAgICAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9wbGF0Zm9ybUxheWVyICYmICFtX3ByaXZhdGUt
Pm1faG9sZVB1bmNoUmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgbV9wcml2YXRlLT5t
X3BsYXRmb3JtTGF5ZXItPnNldEhvbGVQdW5jaFJlY3QoSW50UmVjdCgpKTsKKyNlbmRpZgorICAg
ICAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5y
ZWdpc3RlclBsdWdpbih0aGlzLCBmYWxzZSAvKnNob3VsZFJlZ2lzdGVyKi8pOworICAgICAgICB9
CisgICAgfQorCisgICAgV2lkZ2V0OjpzZXRQYXJlbnQocGFyZW50V2lkZ2V0KTsKKworICAgIGlm
IChwYXJlbnRXaWRnZXQpIHsKKyAgICAgICAgaW5pdCgpOworCisgICAgICAgIEZyYW1lVmlldyog
ZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50V2lkZ2V0KTsKKworICAg
ICAgICBpZiAoZnJhbWVWaWV3ICYmIG1fcHJpdmF0ZSkgeworICAgICAgICAgICAgZnJhbWVWaWV3
LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5yZWdpc3RlclBsdWdpbih0aGlz
LCB0cnVlIC8qc2hvdWxkUmVnaXN0ZXIqLyk7CisgICAgICAgICAgICBpZiAoZnJhbWVWaWV3LT5m
cmFtZSgpCisgICAgICAgICAgICAgICAmJiBmcmFtZVZpZXctPmZyYW1lKCktPmxvYWRlcigpCisg
ICAgICAgICAgICAgICAmJiBmcmFtZVZpZXctPmZyYW1lKCktPmxvYWRlcigpLT5mcmFtZUhhc0xv
YWRlZCgpKQorICAgICAgICAgICAgICAgIGhhbmRsZU9uTG9hZEV2ZW50KCk7CisKKyAgICAgICAg
ICAgIGlmIChtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZykKKyAgICAgICAgICAgICAg
ICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPm9uUGx1Z2lu
U3RhcnRCYWNrZ3JvdW5kUGxheSh0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4
LmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFBsdWdpblZpZXc6OnNldE5Q
V2luZG93UmVjdChjb25zdCBJbnRSZWN0JikKK3sKKyAgICBzZXROUFdpbmRvd0lmTmVlZGVkKCk7
Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0TlBXaW5kb3dJZk5lZWRlZCgpCit7CisgICAgaWYg
KCFtX3ByaXZhdGUgfHwgIW1faXNTdGFydGVkIHx8ICFwYXJlbnQoKSB8fCAhbV9wbHVnaW4tPnBs
dWdpbkZ1bmNzKCktPnNldHdpbmRvdykKKyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWVWaWV3
KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7CisgICAgaWYg
KCFmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmlzQWN0aXZl
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIElmIHRoZSBwbHVnaW4gZGlkbid0IGxvYWQg
c3VjZXNzZnVsbHksIG5vIHBvaW50IGluIGNhbGxpbmcgc2V0d2luZG93CisgICAgaWYgKG1fc3Rh
dHVzICE9IFBsdWdpblN0YXR1c0xvYWRlZFN1Y2Nlc3NmdWxseSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmICghbV9wcml2YXRlLT5tX2hhc1BlbmRpbmdHZW9tZXRyeUNoYW5nZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV9wcml2YXRlLT5tX2hhc1BlbmRpbmdHZW9tZXRyeUNoYW5nZSA9IGZh
bHNlOworCisgICAgbV9ucFdpbmRvdy54ID0gbV93aW5kb3dSZWN0LngoKTsKKyAgICBtX25wV2lu
ZG93LnkgPSBtX3dpbmRvd1JlY3QueSgpOworCisgICAgbV9ucFdpbmRvdy5jbGlwUmVjdC5sZWZ0
ID0gbWF4KDAsIG1fY2xpcFJlY3QueCgpKTsKKyAgICBtX25wV2luZG93LmNsaXBSZWN0LnRvcCA9
IG1heCgwLCBtX2NsaXBSZWN0LnkoKSk7CisgICAgbV9ucFdpbmRvdy5jbGlwUmVjdC5yaWdodCA9
IG1heCgwLCBtX2NsaXBSZWN0Lm1heFgoKSk7CisgICAgbV9ucFdpbmRvdy5jbGlwUmVjdC5ib3R0
b20gPSBtYXgoMCwgbV9jbGlwUmVjdC5tYXhZKCkpOworCisgICAgaWYgKG1fcGx1Z2luLT5xdWly
a3MoKS5jb250YWlucyhQbHVnaW5RdWlya0RvbnRDYWxsU2V0V2luZG93TW9yZVRoYW5PbmNlKSkg
eworICAgICAgICAvLyBPbmx5IHNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGx1Z2lu
IGNvbnRlbnQgdGhlIGZpcnN0IHRpbWUgc2V0TlBXaW5kb3coKSBpcyBjYWxsZWQKKyAgICAgICAg
Ly8gc28gYXMgdG8gd29ya2Fyb3VuZCBhbiBpc3N1ZSBpbiBGbGFzaCB3aGVyZSBtdWx0aXBsZSBj
YWxscyB0byBzZXROUFdpbmRvdygpIGNhdXNlIHRoZSBwbHVnaW4KKyAgICAgICAgLy8gdG8gY3Jh
c2ggaW4gd2luZG93ZWQgbW9kZS4KKyAgICAgICAgaWYgKCFtX2lzV2luZG93ZWQgfHwgbV9ucFdp
bmRvdy53aWR0aCA9PSBVbmluaXRpYWxpemVkQ29vcmRpbmF0ZSB8fCBtX25wV2luZG93LmhlaWdo
dCA9PSBVbmluaXRpYWxpemVkQ29vcmRpbmF0ZSkgeworICAgICAgICAgICAgbV9ucFdpbmRvdy53
aWR0aCA9IG1fd2luZG93UmVjdC53aWR0aCgpOworICAgICAgICAgICAgbV9ucFdpbmRvdy5oZWln
aHQgPSBtX3dpbmRvd1JlY3QuaGVpZ2h0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAg
ICAgICBtX25wV2luZG93LndpZHRoID0gbV93aW5kb3dSZWN0LndpZHRoKCk7CisgICAgICAgIG1f
bnBXaW5kb3cuaGVpZ2h0ID0gbV93aW5kb3dSZWN0LmhlaWdodCgpOworICAgIH0KKworICAgIG1f
bnBXaW5kb3cudHlwZSA9IE5QV2luZG93VHlwZURyYXdhYmxlOworCisgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3cqIHdpbmRvdyA9IGZyYW1lVmlldy0+aG9zdFdpbmRv
dygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+cGxhdGZvcm1XaW5kb3coKTsKKyAgICBpZiAod2lu
ZG93KQorICAgICAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3Nf
aW5mbyktPndpbmRvd0dyb3VwID0gd2luZG93LT53aW5kb3dHcm91cCgpOworCisgICAgUGx1Z2lu
Vmlldzo6c2V0Q3VycmVudFBsdWdpblZpZXcodGhpcyk7CisgICAgSlNDOjpKU0xvY2s6OkRyb3BB
bGxMb2NrcyBkcm9wQWxsTG9ja3MoSlNDOjpTaWxlbmNlQXNzZXJ0aW9uc09ubHkpOworICAgIHNl
dENhbGxpbmdQbHVnaW4odHJ1ZSk7CisKKyAgICAvLyBGSVhNRTogUGFzc2luZyB6b29tRmFjdG9y
IHRvIHNldHdpbmRvdyBtYWtlIHdpbmRvd2VkIHBsdWdpbiBzY2FsZSBpbmNvcnJlY3RseS4KKyAg
ICAvLyBIYW5kbGluZyB0aGUgem9vbSBmYWN0b3IgcHJvcGVybHkgaW4gdGhlIHBsdWdpbiBzaWRl
IG1heSBiZSBhIGJldHRlciBzb2x1dGlvbi4KKyAgICBkb3VibGUgb2xkWm9vbUZhY3RvciA9ICgo
TlBTZXRXaW5kb3dDYWxsYmFja1N0cnVjdCopbV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3Rv
cjsKKyAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbykt
Pnpvb21GYWN0b3IgPSAxLjsKKyAgICBtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+c2V0d2luZG93
KG1faW5zdGFuY2UsICZtX25wV2luZG93KTsKKyAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1
Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21GYWN0b3IgPSBvbGRab29tRmFjdG9yOworCisg
ICAgc2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7CisgICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBs
dWdpblZpZXcoMCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0UGFyZW50VmlzaWJsZShib29s
IHZpc2libGUpCit7CisgICAgaWYgKGlzUGFyZW50VmlzaWJsZSgpID09IHZpc2libGUpCisgICAg
ICAgIHJldHVybjsKKworICAgIFdpZGdldDo6c2V0UGFyZW50VmlzaWJsZSh2aXNpYmxlKTsKKwor
ICAgIC8vIEZJWE1FOiBXZSBtaWdodCB3YW50IHRvIHRlbGwgdGhlIHBsdWdpbiB0byBoaWRlIGl0
J3Mgd2luZG93IGhlcmUsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlcgorICAgIC8vIHNpbmNlIHRoZSB3
aW5kb3cgbWFuYWdlciBzaG91bGQgdGFrZSBjYXJlIG9mIHRoYXQgZm9yIHVzLgorfQorCitOUEVy
cm9yIFBsdWdpblZpZXc6OmhhbmRsZVBvc3RSZWFkRmlsZShWZWN0b3I8Y2hhcj4mIGJ1ZmZlciwg
dWludDMyX3QgbGVuLCBjb25zdCBjaGFyKiBidWYpCit7CisgICAgU3RyaW5nIGZpbGVuYW1lKGJ1
ZiwgbGVuKTsKKworICAgIGlmIChmaWxlbmFtZS5zdGFydHNXaXRoKCJmaWxlOi8vLyIpKQorICAg
ICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyg4KTsKKworICAgIGxvbmcgbG9uZyBz
aXplOworICAgIGlmICghZ2V0RmlsZVNpemUoZmlsZW5hbWUsIHNpemUpKQorICAgICAgICByZXR1
cm4gTlBFUlJfRklMRV9OT1RfRk9VTkQ7CisKKyAgICBGSUxFKiBmaWxlSGFuZGxlID0gZm9wZW4o
ZmlsZW5hbWUudXRmOCgpLmRhdGEoKSwgInIiKTsKKyAgICBpZiAoIWZpbGVIYW5kbGUpCisgICAg
ICAgIHJldHVybiBOUEVSUl9GSUxFX05PVF9GT1VORDsKKworICAgIGJ1ZmZlci5yZXNpemUoc2l6
ZSk7CisgICAgaW50IGJ5dGVzUmVhZCA9IGZyZWFkKGJ1ZmZlci5kYXRhKCksIDEsIHNpemUsIGZp
bGVIYW5kbGUpOworCisgICAgZmNsb3NlKGZpbGVIYW5kbGUpOworCisgICAgaWYgKGJ5dGVzUmVh
ZCA8PSAwKQorICAgICAgICByZXR1cm4gTlBFUlJfRklMRV9OT1RfRk9VTkQ7CisKKyAgICByZXR1
cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK2Jvb2wgUGx1Z2luVmlldzo6cGxhdGZvcm1HZXRWYWx1
ZVN0YXRpYyhOUE5WYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCogdmFsdWUsIE5QRXJyb3IqIHJlc3Vs
dCkKK3sKKyAgICBzd2l0Y2ggKHZhcmlhYmxlKSB7CisgICAgY2FzZSBOUE5WVG9vbGtpdDoKKyAg
ICAgICAgKnN0YXRpY19jYXN0PHVpbnQzMl90Kj4odmFsdWUpID0gMDsKKyAgICAgICAgKnJlc3Vs
dCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgTlBO
VlN1cHBvcnRzWEVtYmVkQm9vbDoKKyAgICAgICAgKnN0YXRpY19jYXN0PE5QQm9vbCo+KHZhbHVl
KSA9IHRydWU7CisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgcmV0
dXJuIHRydWU7CisKKyAgICBjYXNlIE5QTlZqYXZhc2NyaXB0RW5hYmxlZEJvb2w6CisgICAgICAg
ICpzdGF0aWNfY2FzdDxOUEJvb2wqPih2YWx1ZSkgPSB0cnVlOworICAgICAgICAqcmVzdWx0ID0g
TlBFUlJfTk9fRVJST1I7CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBOUE5WU3Vw
cG9ydHNXaW5kb3dsZXNzOgorICAgICAgICAqc3RhdGljX2Nhc3Q8TlBCb29sKj4odmFsdWUpID0g
dHJ1ZTsKKyAgICAgICAgKnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICByZXR1cm4g
dHJ1ZTsKKworICAgIGNhc2UgTlBOVk5QQ2FsbGJhY2tzUHRyOgorICAgICAgICAqKCh2b2lkICoq
KSB2YWx1ZSkgPSAodm9pZCopJnNfTnBDYWxsYmFja3M7CisgICAgICAgICpyZXN1bHQgPSBOUEVS
Ul9OT19FUlJPUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIE5QTlZ4RGlzcGxh
eToKKyAgICBjYXNlIE5QTlZ4dEFwcENvbnRleHQ6CisgICAgY2FzZSBOUE5WbmV0c2NhcGVXaW5k
b3c6CisgICAgY2FzZSBOUE5WYXNkRW5hYmxlZEJvb2w6CisgICAgY2FzZSBOUE5WaXNPZmZsaW5l
Qm9vbDoKKyAgICBjYXNlIE5QTlZzZXJ2aWNlTWFuYWdlcjoKKyAgICBjYXNlIE5QTlZET01FbGVt
ZW50OgorICAgIGNhc2UgTlBOVkRPTVdpbmRvdzoKKyAgICBjYXNlIE5QTlZXaW5kb3dOUE9iamVj
dDoKKyAgICBjYXNlIE5QTlZQbHVnaW5FbGVtZW50TlBPYmplY3Q6CisgICAgY2FzZSBOUE5WcHJp
dmF0ZU1vZGVCb29sOgorICAgIGNhc2UgTlBOVlpvb21GYWN0b3I6CisgICAgY2FzZSBOUE5WUm9v
dFdpbmRvd0dyb3VwOgorICAgIGNhc2UgTlBOVkJyb3dzZXJXaW5kb3dHcm91cDoKKyAgICBjYXNl
IE5QTlZCcm93c2VyRGlzcGxheUNvbnRleHQ6CisgICAgY2FzZSBOUE5WUGx1Z2luV2luZG93UHJl
Zml4OgorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9v
bCBQbHVnaW5WaWV3OjpwbGF0Zm9ybUdldFZhbHVlKE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lk
KiB2YWx1ZSwgTlBFcnJvciogcmVzdWx0KQoreworICAgIHN3aXRjaCAodmFyaWFibGUpIHsKKyAg
ICBjYXNlIE5QTlZab29tRmFjdG9yOgorICAgICAgICAqKHN0YXRpY19jYXN0PHZvaWQqKj4odmFs
dWUpKSA9IHN0YXRpY19jYXN0PHZvaWQqPigmKChzdGF0aWNfY2FzdDxOUFNldFdpbmRvd0NhbGxi
YWNrU3RydWN0Kj4obV9ucFdpbmRvdy53c19pbmZvKSkpLT56b29tRmFjdG9yKTsKKyAgICAgICAg
KnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNh
c2UgTlBOVlJvb3RXaW5kb3dHcm91cDogeworICAgICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9
IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKTsKKyAgICAgICAgaWYgKGZyYW1lVmll
dykgeworICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3cg
KndpbmRvdyA9IGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+
cGxhdGZvcm1XaW5kb3coKTsKKyAgICAgICAgICAgIGlmICh3aW5kb3cpIHsKKyAgICAgICAgICAg
ICAgICB2b2lkKiogdGVtcFZhbHVlID0gc3RhdGljX2Nhc3Q8dm9pZCoqPih2YWx1ZSk7CisgICAg
ICAgICAgICAgICAgKnRlbXBWYWx1ZSA9ICh2b2lkKil3aW5kb3ctPnJvb3RHcm91cCgpOworCisg
ICAgICAgICAgICAgICAgaWYgKCp0ZW1wVmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgKnJl
c3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKnJl
c3VsdCA9IE5QRVJSX0dFTkVSSUNfRVJST1I7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICBjYXNlIE5QTlZCcm93c2VyV2luZG93R3JvdXA6IHsKKyAgICAgICAgRnJhbWVWaWV3
KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7CisgICAgICAg
IGlmIChmcmFtZVZpZXcpIHsKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6V2luZG93KiB3aW5kb3cgPSBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1Q
YWdlQ2xpZW50KCktPnBsYXRmb3JtV2luZG93KCk7CisgICAgICAgICAgICBpZiAod2luZG93KSB7
CisgICAgICAgICAgICAgICAgdm9pZCoqIHRlbXBWYWx1ZSA9IHN0YXRpY19jYXN0PHZvaWQqKj4o
dmFsdWUpOworICAgICAgICAgICAgICAgICp0ZW1wVmFsdWUgPSByZWludGVycHJldF9jYXN0PHZv
aWQqPihjb25zdF9jYXN0PGNoYXIqPih3aW5kb3ctPndpbmRvd0dyb3VwKCkpKTsKKworICAgICAg
ICAgICAgICAgIGlmICgqdGVtcFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICpyZXN1bHQg
PSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpyZXN1bHQg
PSBOUEVSUl9HRU5FUklDX0VSUk9SOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgY2FzZSBOUE5WQnJvd3NlckRpc3BsYXlDb250ZXh0OiB7CisgICAgICAgIEZyYW1lVmlldyog
ZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOworICAgICAgICBp
ZiAoZnJhbWVWaWV3KSB7CisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhp
Y3M6OlBsYXRmb3JtRGlzcGxheUNvbnRleHRIYW5kbGUgY29udGV4dCA9IEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpHcmFwaGljczo6cGxhdGZvcm1EaXNwbGF5Q29udGV4dCgpOworICAgICAgICAgICAg
aWYgKGNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICB2b2lkKiogdGVtcFZhbHVlID0gc3RhdGlj
X2Nhc3Q8dm9pZCoqPih2YWx1ZSk7CisgICAgICAgICAgICAgICAgKnRlbXBWYWx1ZSA9IHN0YXRp
Y19jYXN0PHZvaWQqPihjb250ZXh0KTsKKworICAgICAgICAgICAgICAgIGlmICgqdGVtcFZhbHVl
KSB7CisgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9HRU5FUklDX0VSUk9SOwor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY2FzZSBOUE5WUGx1Z2luV2luZG93
UHJlZml4OiB7CisgICAgICAgIHZvaWQqKiB0ZW1wVmFsdWUgPSBzdGF0aWNfY2FzdDx2b2lkKio+
KHZhbHVlKTsKKyAgICAgICAgKnRlbXBWYWx1ZSA9IHN0YXRpY19jYXN0PHZvaWQqPihjb25zdF9j
YXN0PGNoYXIqPihtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpKTsKKwor
ICAgICAgICBpZiAoKnRlbXBWYWx1ZSkgeworICAgICAgICAgICAgKnJlc3VsdCA9IE5QRVJSX05P
X0VSUk9SOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgKnJl
c3VsdCA9IE5QRVJSX0dFTkVSSUNfRVJST1I7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICBjYXNlIE5QTlZ4RGlzcGxheToKKyAgICBjYXNlIE5QTlZ4dEFwcENvbnRleHQ6Cisg
ICAgY2FzZSBOUE5WbmV0c2NhcGVXaW5kb3c6CisgICAgY2FzZSBOUE5WamF2YXNjcmlwdEVuYWJs
ZWRCb29sOgorICAgIGNhc2UgTlBOVmFzZEVuYWJsZWRCb29sOgorICAgIGNhc2UgTlBOVmlzT2Zm
bGluZUJvb2w6CisgICAgY2FzZSBOUE5Wc2VydmljZU1hbmFnZXI6CisgICAgY2FzZSBOUE5WRE9N
RWxlbWVudDoKKyAgICBjYXNlIE5QTlZET01XaW5kb3c6CisgICAgY2FzZSBOUE5WVG9vbGtpdDoK
KyAgICBjYXNlIE5QTlZTdXBwb3J0c1hFbWJlZEJvb2w6CisgICAgY2FzZSBOUE5WV2luZG93TlBP
YmplY3Q6CisgICAgY2FzZSBOUE5WUGx1Z2luRWxlbWVudE5QT2JqZWN0OgorICAgIGNhc2UgTlBO
VlN1cHBvcnRzV2luZG93bGVzczoKKyAgICBjYXNlIE5QTlZwcml2YXRlTW9kZUJvb2w6CisgICAg
Y2FzZSBOUE5WTlBDYWxsYmFja3NQdHI6CisgICAgICAgIHJldHVybiBwbGF0Zm9ybUdldFZhbHVl
U3RhdGljKHZhcmlhYmxlLCB2YWx1ZSwgcmVzdWx0KTsKKworICAgIGRlZmF1bHQ6CisgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQor
CisvLyBUaGlzIGlzIGEgcHVyZSB2aXJ0dWFsIGluaGVyaXRlZCBmcm9tIFdpZGdldCBjbGFzcyBh
bmQgYWxsIGludmFsaWRhdGVzCisvLyBhcmUgZnVubmVsZWQgdGhyb3VnaCB0aGlzIG1ldGhvZC4g
V2UgZm9yd2FyZCB0aGVtIG9uIHRvIGVpdGhlciB0aGUKKy8vIGNvbXBvc2l0aW5nIGxheWVyIG9y
IHRoZSBQbHVnaW5WaWV3OjppbnZhbGlkYXRlV2luZG93bGVzc1BsdWdpblJlY3QgbWV0aG9kLgor
dm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQorewor
ICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBSZWNvcmQgdGhl
IHJlZ2lvbiB0aGF0IHdlJ3ZlIGJlZW4gYXNrZWQgdG8gaW52YWxpZGF0ZQorICAgIG1fcHJpdmF0
ZS0+bV9pbnZhbGlkYXRlUmVnaW9uID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdp
b246OnVuaW9uUmVnaW9ucyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdChyZWN0KSwgbV9w
cml2YXRlLT5tX2ludmFsaWRhdGVSZWdpb24pOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorICAgIGlmIChtX3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllcikgeworICAgICAgICBt
X3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIGludmFsaWRhdGVXaW5kb3dsZXNzUGx1Z2luUmVj
dChyZWN0KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVjdChOUFJlY3QqIHJl
Y3QpCit7CisgICAgaWYgKCFyZWN0KSB7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBpbnZhbGlkYXRlUmVjdChJbnRSZWN0KHJlY3QtPmxlZnQsIHJl
Y3QtPnRvcCwgcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSByZWN0LT50
b3ApKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVnaW9uKE5QUmVnaW9uIHJl
Z2lvbikKK3sKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6Zm9yY2VS
ZWRyYXcoKQoreworICAgIGludmFsaWRhdGUoKTsKK30KKworYm9vbCBQbHVnaW5WaWV3OjpwbGF0
Zm9ybVN0YXJ0KCkKK3sKKyAgICBBU1NFUlQobV9pc1N0YXJ0ZWQpOworICAgIEFTU0VSVChtX3N0
YXR1cyA9PSBQbHVnaW5TdGF0dXNMb2FkZWRTdWNjZXNzZnVsbHkpOworCisgICAgbV9wcml2YXRl
ID0gbmV3IFBsdWdpblZpZXdQcml2YXRlKHRoaXMpOworCisgICAgaWYgKG1fcGx1Z2luLT5wbHVn
aW5GdW5jcygpLT5nZXR2YWx1ZSkgeworICAgICAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1
Z2luVmlldyh0aGlzKTsKKyAgICAgICAgSlNDOjpKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxs
TG9ja3MoSlNDOjpTaWxlbmNlQXNzZXJ0aW9uc09ubHkpOworICAgICAgICBzZXRDYWxsaW5nUGx1
Z2luKHRydWUpOworICAgICAgICBtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0dmFsdWUobV9p
bnN0YW5jZSwgTlBQVnBsdWdpbk5lZWRzWEVtYmVkLCAmbV9uZWVkc1hFbWJlZCk7CisgICAgICAg
IHNldENhbGxpbmdQbHVnaW4oZmFsc2UpOworICAgICAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50
UGx1Z2luVmlldygwKTsKKyAgICB9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisgICAgaWYgKG1fcGFyZW50RnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5hbGxv
d3NBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkKKyAgICAgICAgJiYgbV9wYXJlbnRGcmFtZS0+cGFn
ZSgpLT5zZXR0aW5ncygpCisgICAgICAgICYmIG1fcGFyZW50RnJhbWUtPnBhZ2UoKS0+c2V0dGlu
Z3MoKS0+YWNjZWxlcmF0ZWRDb21wb3NpdGluZ0VuYWJsZWQoKSkgeworICAgICAgICBtX3ByaXZh
dGUtPm1fcGxhdGZvcm1MYXllciA9IFBsdWdpbkxheWVyV2ViS2l0VGhyZWFkOjpjcmVhdGUodGhp
cyk7CisgICAgICAgIC8vIFRyaWdnZXIgbGF5ZXIgY29tcHV0YXRpb24gaW4gUmVuZGVyTGF5ZXJD
b21wb3NpdG9yCisgICAgICAgIG1fZWxlbWVudC0+c2V0TmVlZHNTdHlsZVJlY2FsYyhTeW50aGV0
aWNTdHlsZUNoYW5nZSk7CisgICAgfQorI2VuZGlmCisKKyAgICBtX25wV2luZG93LnR5cGUgPSBO
UFdpbmRvd1R5cGVEcmF3YWJsZTsKKyAgICBtX25wV2luZG93LndpbmRvdyA9IDA7IC8vIE5vdCB1
c2VkPworICAgIG1fbnBXaW5kb3cueCA9IDA7CisgICAgbV9ucFdpbmRvdy55ID0gMDsKKyAgICBt
X25wV2luZG93LndpZHRoID0gVW5pbml0aWFsaXplZENvb3JkaW5hdGU7CisgICAgbV9ucFdpbmRv
dy5oZWlnaHQgPSBVbmluaXRpYWxpemVkQ29vcmRpbmF0ZTsKKyAgICBtX25wV2luZG93LndzX2lu
Zm8gPSBuZXcgTlBTZXRXaW5kb3dDYWxsYmFja1N0cnVjdDsKKyAgICAoKE5QU2V0V2luZG93Q2Fs
bGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21GYWN0b3IgPSAxLjsKKyAgICAo
KE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPndpbmRvd0dy
b3VwID0gMDsKKworICAgIHNob3coKTsKKworICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9
IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkKKyAgICAgICAgaGFuZGxlT3JpZW50
YXRpb25FdmVudChmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCkt
Pm9yaWVudGF0aW9uKCkpOworCisgICAgaWYgKCEobV9wbHVnaW4tPnF1aXJrcygpLmNvbnRhaW5z
KFBsdWdpblF1aXJrRGVmZXJGaXJzdFNldFdpbmRvd0NhbGwpKSkgeworICAgICAgICB1cGRhdGVQ
bHVnaW5XaWRnZXQoKTsKKyAgICAgICAgc2V0TlBXaW5kb3dJZk5lZWRlZCgpOworICAgIH0KKwor
ICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFBsdWdpblZpZXc6OnBsYXRmb3JtRGVzdHJveSgp
Cit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMg
d2lsbCB1bmxvY2sgdGhlIGlkbGUgKGlmIHdlIGhhdmUgbG9ja2VkIGl0KS4KKyAgICBtX3ByaXZh
dGUtPnByZXZlbnRJZGxlKGZhbHNlKTsKKworICAgIC8vIFRoaXMgd2lsbCByZWxlYXNlIGFueSBr
ZWVwVmlzaWJsZVJlY3RzIGlmIHRoZXkgd2VyZSBzZXQuCisgICAgbV9wcml2YXRlLT5jbGVhclZp
c2libGVSZWN0cygpOworCisgICAgLy8gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHdlIHVucmVnaXN0
ZXJlZCB0aGUgcGx1Z2luLgorICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19j
YXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkgeworICAgICAgICBpZiAobV9wcml2YXRlLT5tX2lz
QmFja2dyb3VuZFBsYXlpbmcpCisgICAgICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+
cGxhdGZvcm1QYWdlQ2xpZW50KCktPm9uUGx1Z2luU3RvcEJhY2tncm91bmRQbGF5KHRoaXMsIG1f
cHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19zdHIoKSk7CisKKyAgICAgICAgLy8gSWYg
d2Ugd2VyZSBzdGlsbCBmdWxsc2NyZWVuLCBlbnN1cmUgd2Ugbm90aWZ5IGV2ZXJ5b25lIHdlJ3Jl
IG5vdC4KKyAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAgICAgICAg
ICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmRpZFBsdWdp
bkV4aXRGdWxsU2NyZWVuKHRoaXMsIG1fcHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19z
dHIoKSk7CisKKyAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9vcmllbnRhdGlvbkxvY2tlZCkKKyAg
ICAgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+
dW5sb2NrT3JpZW50YXRpb24oKTsKKworICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+
cGxhdGZvcm1QYWdlQ2xpZW50KCktPnJlZ2lzdGVyUGx1Z2luKHRoaXMsIGZhbHNlIC8qc2hvdWxk
UmVnaXN0ZXIqLyk7CisgICAgfQorCisgICAgbV9wcml2YXRlLT5tX2lzQmFja2dyb3VuZFBsYXlp
bmcgPSBmYWxzZTsKKyAgICBtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuID0gZmFsc2U7CisKKyAg
ICBkZWxldGUgbV9wcml2YXRlOworICAgIG1fcHJpdmF0ZSA9IDA7Cit9CisKK3ZvaWQgUGx1Z2lu
Vmlldzo6aGFsdCgpCit7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6cmVzdGFydCgpCit7Cit9CisK
K3ZvaWQgUGx1Z2luVmlldzo6Z2V0V2luZG93SW5mbyhWZWN0b3I8UGx1Z2luV2luZG93SW5mbz4m
IHdpbmRvd0xpc3QpCit7CisgICAgaWYgKCFtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0dmFs
dWUpCisgICAgICAgIHJldHVybjsKKworICAgIHZvaWQqIHZhbFB0ciA9IDA7CisKKyAgICBQbHVn
aW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldyh0aGlzKTsKKyAgICBKU0M6OkpTTG9jazo6RHJv
cEFsbExvY2tzIGRyb3BBbGxMb2NrcyhKU0M6OlNpbGVuY2VBc3NlcnRpb25zT25seSk7CisgICAg
c2V0Q2FsbGluZ1BsdWdpbih0cnVlKTsKKyAgICBtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0
dmFsdWUobV9pbnN0YW5jZSwgTlBQVnBsdWdpblNjcmVlbldpbmRvdywgJnZhbFB0cik7CisgICAg
c2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7CisgICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBsdWdp
blZpZXcoMCk7CisKKyAgICBpZiAoIXZhbFB0cikKKyAgICAgICAgcmV0dXJuOworCisgICAgTlBT
Y3JlZW5XaW5kb3dIYW5kbGVzKiBzY3JlZW5XaW5IYW5kbGVzID0gc3RhdGljX2Nhc3Q8TlBTY3Jl
ZW5XaW5kb3dIYW5kbGVzKj4odmFsUHRyKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Ny
ZWVuV2luSGFuZGxlcy0+bnVtT2ZXaW5kb3dzOyBpKyspIHsKKyAgICAgICAgUGx1Z2luV2luZG93
SW5mbyBpbmZvOworICAgICAgICBpbmZvLndpbmRvd1B0ciA9IHNjcmVlbldpbkhhbmRsZXMtPndp
bmRvd0hhbmRsZXNbaV07CisKKyAgICAgICAgTlBSZWN0KiByYyA9IHNjcmVlbldpbkhhbmRsZXMt
PndpbmRvd1JlY3RzW2ldOworICAgICAgICBpbmZvLndpbmRvd1JlY3QgPSBJbnRSZWN0KHJjLT5s
ZWZ0LCByYy0+dG9wLCByYy0+cmlnaHQgLSByYy0+bGVmdCwgcmMtPmJvdHRvbSAtIHJjLT50b3Ap
OworCisgICAgICAgIHdpbmRvd0xpc3QuYXBwZW5kKGluZm8pOworICAgIH0KK30KKworQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIFBsdWdpblZpZXc6OmxvY2tGcm9udEJ1
ZmZlckZvclJlYWQoKSBjb25zdAoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBidWZm
ZXIgPSBtX3ByaXZhdGUtPmxvY2tSZWFkRnJvbnRCdWZmZXJJbnRlcm5hbCgpOworCisgICAgaWYg
KCFidWZmZXIpCisgICAgICAgIG1fcHJpdmF0ZS0+dW5sb2NrUmVhZEZyb250QnVmZmVyKCk7CisK
KyAgICByZXR1cm4gYnVmZmVyOworfQorCit2b2lkIFBsdWdpblZpZXc6OnVubG9ja0Zyb250QnVm
ZmVyKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworICAg
IG1fcHJpdmF0ZS0+dW5sb2NrUmVhZEZyb250QnVmZmVyKCk7Cit9CisKKyNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCitQbGF0Zm9ybUxheWVyKiBQbHVnaW5WaWV3OjpwbGF0Zm9ybUxh
eWVyKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgcmV0dXJuIG1fcHJpdmF0ZS0+bV9wbGF0Zm9ybUxheWVyLmdldCgpOworfQorI2VuZGlmCisK
K0ludFJlY3QgUGx1Z2luVmlldzo6ZW5zdXJlVmlzaWJsZVJlY3QoKQoreworICAgIGlmICghbV9w
cml2YXRlKQorICAgICAgICByZXR1cm4gSW50UmVjdCgpOworICAgIHJldHVybiBtX3ByaXZhdGUt
Pm1fa2VlcFZpc2libGVSZWN0OworfQorCit2b2lkIFBsdWdpblZpZXc6OnNldEJhY2tncm91bmRQ
bGF5KGJvb2wgdmFsdWUpCit7CisgICAgaWYgKCFtX3ByaXZhdGUgfHwgbV9wcml2YXRlLT5tX2lz
QmFja2dyb3VuZFBsYXlpbmcgPT0gdmFsdWUpCisgICAgICAgIHJldHVybjsKKworICAgIEZyYW1l
VmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV9wcml2YXRlLT5tX3Zp
ZXctPnBhcmVudCgpKTsKKyAgICBtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZyA9IHZh
bHVlOworICAgIGlmIChtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZykKKyAgICAgICAg
ZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5vblBsdWdpblN0
YXJ0QmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5j
X3N0cigpKTsKKyAgICBlbHNlCisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0
Zm9ybVBhZ2VDbGllbnQoKS0+b25QbHVnaW5TdG9wQmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2
YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119167</attachid>
            <date>2011-12-13 23:35:59 -0800</date>
            <delta_ts>2022-02-28 04:03:29 -0800</delta_ts>
            <desc>Patch V5</desc>
            <filename>patch_V5.patch</filename>
            <type>text/plain</type>
            <size>46866</size>
            <attacher name="Charles Wei">charles.wei</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwMjczMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBACisyMDExLTEyLTEzICBXZWkgQ2hh
cmxlcyAgPGNoYXJsZXMud2VpQHRvcmNobW9iaWxlLmNvbS5jbj4KKworICAgICAgICBbQmxhY2tC
ZXJyeV0gVXBzdHJlYW0gQmxhY2tCZXJyeSBwb3J0aW5nIG9mIHBsdWdpblZpZXcKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczMzk3CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIGZvciBu
b3cuCisKKyAgICAgICAgKiBwbHVnaW5zL2JsYWNrYmVycnkvUGx1Z2luVmlld0JsYWNrQmVycnku
Y3BwOiBBZGRlZC4KKwogMjAxMS0xMi0xMyAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBw
bGUuY29tPgogCiAgICAgICAgIEFkZCBhIHZlcnkgYmFyZS1ib25lcyBpbXBsZW1lbnRhdGlvbiBv
ZiBiaW5kIGFuZCBGdW5jdGlvbiB0byBXVEYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMv
YmxhY2tiZXJyeS9QbHVnaW5WaWV3QmxhY2tCZXJyeS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcGx1Z2lucy9ibGFja2JlcnJ5L1BsdWdpblZpZXdCbGFja0JlcnJ5LmNwcAkocmV2
aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsdWdpbnMvYmxhY2tiZXJyeS9QbHVnaW5WaWV3
QmxhY2tCZXJyeS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTM5MyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndh
cmRiaWFzLmluPgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1p
dGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiUGx1Z2luVmlldy5oIgorCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNp
bmNsdWRlICJFdmVudC5oIgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKKyNpbmNsdWRlICJGcmFt
ZS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2lu
Y2x1ZGUgIkhUTUxQbHVnSW5FbGVtZW50LmgiCisjaW5jbHVkZSAiSG9zdFdpbmRvdy5oIgorI2lu
Y2x1ZGUgIkpTRE9NQmluZGluZy5oIgorI2luY2x1ZGUgIktleWJvYXJkRXZlbnQuaCIKKyNpbmNs
dWRlICJNb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiTlBDYWxsYmFja3NCbGFja0JlcnJ5LmgiCisj
aW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAi
UGxhdGZvcm1Db250ZXh0U2tpYS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVudC5o
IgorI2luY2x1ZGUgIlBsdWdpbkRlYnVnLmgiCisjaW5jbHVkZSAiUGx1Z2luTWFpblRocmVhZFNj
aGVkdWxlci5oIgorI2luY2x1ZGUgIlBsdWdpblBhY2thZ2UuaCIKKyNpbmNsdWRlICJQbHVnaW5W
aWV3UHJpdmF0ZUJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJSZW5kZXJMYXllci5oIgorI2luY2x1
ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiVG91Y2hFdmVudC5oIgorI2luY2x1ZGUgIlRvdWNo
TGlzdC5oIgorI2luY2x1ZGUgIldoZWVsRXZlbnQuaCIKKyNpbmNsdWRlICJucHJ1bnRpbWVfaW1w
bC5oIgorI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudC5o
IgorI2luY2x1ZGUgIlBsdWdpbkxheWVyV2ViS2l0VGhyZWFkLmgiCisjZW5kaWYKKworI2luY2x1
ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBs
YXRmb3JtSW50UmVjdFJlZ2lvbi5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVdpbmRv
dy5oPgorCisjaW5jbHVkZSA8cnVudGltZS9KU0xvY2suaD4KKyNpbmNsdWRlIDxydW50aW1lL0pT
VmFsdWUuaD4KKyNpbmNsdWRlIDxzeXMva2V5Y29kZXMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisK
K2NvbnN0IHVuc2lnbmVkIFVuaW5pdGlhbGl6ZWRDb29yZGluYXRlID0gMHhmZmZmZmZmZjsKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCit0ZW1wbGF0ZTxjbGFzcyBUPiBzdGF0aWMgTlBSZWN0IHRv
TlBSZWN0KGNvbnN0IFQmIHJlY3QpCit7CisgICAgTlBSZWN0IG5wUmVjdDsKKyAgICBucFJlY3Qu
dG9wID0gcmVjdC55KCk7CisgICAgbnBSZWN0LmxlZnQgPSByZWN0LngoKTsKKyAgICBucFJlY3Qu
Ym90dG9tID0gcmVjdC55KCkgKyByZWN0LmhlaWdodCgpOworICAgIG5wUmVjdC5yaWdodCA9IHJl
Y3QueCgpICsgcmVjdC53aWR0aCgpOworICAgIHJldHVybiBucFJlY3Q7Cit9CisKK3VzaW5nIEpT
Qzo6RXhlY1N0YXRlOwordXNpbmcgSlNDOjpJbnRlcnByZXRlcjsKK3VzaW5nIEpTQzo6SlNMb2Nr
OwordXNpbmcgSlNDOjpKU09iamVjdDsKK3VzaW5nIEpTQzo6VVN0cmluZzsKKwordXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBXVEY7Cit1c2luZyBuYW1lc3BhY2UgSFRNTE5h
bWVzOworCit2b2lkIFBsdWdpblZpZXc6OnVwZGF0ZVBsdWdpbldpZGdldCgpCit7CisgICAgaWYg
KCFwYXJlbnQoKSB8fCAhbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQo
cGFyZW50KCktPmlzRnJhbWVWaWV3KCkpOworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3Rh
dGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOworCisgICAgSW50UmVjdCBvbGRXaW5kb3dS
ZWN0ID0gbV93aW5kb3dSZWN0OworICAgIEludFJlY3Qgb2xkQ2xpcFJlY3QgPSBtX2NsaXBSZWN0
OworCisgICAgbV93aW5kb3dSZWN0ID0gSW50UmVjdChmcmFtZVZpZXctPmNvbnRlbnRzVG9XaW5k
b3coZnJhbWVSZWN0KCkubG9jYXRpb24oKSksIGZyYW1lUmVjdCgpLnNpemUoKSk7CisKKyAgICAv
LyBNYXAgcmVjdCB0byBjb250ZW50IGNvb3JkaW5hdGUgc3BhY2Ugb2YgbWFpbiBmcmFtZS4KKyAg
ICBtX3dpbmRvd1JlY3QubW92ZShyb290KCktPnNjcm9sbE9mZnNldCgpKTsKKworICAgIG1fY2xp
cFJlY3QgPSBjYWxjdWxhdGVDbGlwUmVjdCgpOworICAgIEludFJlY3QgZiA9IGZyYW1lUmVjdCgp
OworCisgICAgLy8gTm90aWZ5IHRoZSBwbHVnaW4gaWYgaXQgbWF5IG9yIG1heSBub3QgYmUgb24v
b2Zmc2NyZWVuLgorICAgIGhhbmRsZVNjcm9sbEV2ZW50KCk7CisKKyAgICBib29sIHpvb21GYWN0
b3JDaGFuZ2VkID0gKChOUFNldFdpbmRvd0NhbGxiYWNrU3RydWN0KiltX25wV2luZG93LndzX2lu
Zm8pLT56b29tRmFjdG9yCisgICAgICAgICE9IGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0
Zm9ybVBhZ2VDbGllbnQoKS0+Y3VycmVudFpvb21GYWN0b3IoKTsKKworICAgIGlmICghem9vbUZh
Y3RvckNoYW5nZWQgJiYgbV93aW5kb3dSZWN0ID09IG9sZFdpbmRvd1JlY3QgJiYgbV9jbGlwUmVj
dCA9PSBvbGRDbGlwUmVjdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRG8gbm90IGNhbGwg
c2V0TlBXaW5kb3dJZk5lZWRlZCBpbW1lZGlhdGVseSwgd2lsbCBiZSBjYWxsZWQgb24gcGFpbnQo
KS4KKyAgICBtX3ByaXZhdGUtPm1faGFzUGVuZGluZ0dlb21ldHJ5Q2hhbmdlID0gdHJ1ZTsKKwor
ICAgIC8vIChpKSBJbiBvcmRlciB0byBtb3ZlL3Jlc2l6ZSB0aGUgcGx1Z2luIHdpbmRvdyBhdCB0
aGUgc2FtZSB0aW1lIGFzIHRoZQorICAgIC8vIHJlc3Qgb2YgZnJhbWUgZHVyaW5nIGUuZy4gc2Ny
b2xsaW5nLCB3ZSBzZXQgdGhlIHdpbmRvdyBnZW9tZXRyeQorICAgIC8vIGluIHRoZSBwYWludCgp
IGZ1bmN0aW9uLCBidXQgYXMgcGFpbnQoKSBpc24ndCBjYWxsZWQgd2hlbiB0aGUKKyAgICAvLyBw
bHVnaW4gd2luZG93IGlzIG91dHNpZGUgdGhlIGZyYW1lIHdoaWNoIGNhbiBiZSBjYXVzZWQgYnkg
YQorICAgIC8vIHNjcm9sbCwgd2UgbmVlZCB0byBtb3ZlL3Jlc2l6ZSBpbW1lZGlhdGVseS4KKyAg
ICAvLyAoaWkpIElmIHdlIGFyZSBydW5uaW5nIGxheW91dCB0ZXN0cyBmcm9tIERSVCwgcGFpbnQo
KSB3b24ndCBldmVyIGdldCBjYWxsZWQKKyAgICAvLyBzbyB3ZSBuZWVkIHRvIGNhbGwgc2V0TlBX
aW5kb3dJZk5lZWRlZCgpIGlmIHdpbmRvdyBnZW9tZXRyeSBoYXMgY2hhbmdlZC4KKyAgICBpZiAo
bV9jbGlwUmVjdC5pc0VtcHR5KCkgfHwgKHBsYXRmb3JtUGx1Z2luV2lkZ2V0KCkgJiYgKG1fd2lu
ZG93UmVjdCAhPSBvbGRXaW5kb3dSZWN0IHx8IG1fY2xpcFJlY3QgIT0gb2xkQ2xpcFJlY3QgfHwg
em9vbUZhY3RvckNoYW5nZWQpKSkKKyAgICAgICAgc2V0TlBXaW5kb3dJZk5lZWRlZCgpOworCisg
ICAgLy8gTWFrZSBzdXJlIHdlIGdldCByZXBhaW50ZWQgYWZ0ZXJ3YXJkcy4gVGhpcyBpcyBuZWNl
c3NhcnkgZm9yIGRvd253YXJkCisgICAgLy8gc2Nyb2xsaW5nIHRvIG1vdmUgdGhlIHBsdWdpbiB3
aWRnZXQgcHJvcGVybHkuCisgICAgaW52YWxpZGF0ZSgpOworfQorCit2b2lkIFBsdWdpblZpZXc6
OnNldEZvY3VzKGJvb2wgZm9jdXNlZCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSB8fCBtX3ByaXZh
dGUtPm1faXNGb2N1c2VkID09IGZvY3VzZWQpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VS
VChwbGF0Zm9ybVBsdWdpbldpZGdldCgpID09IHBsYXRmb3JtV2lkZ2V0KCkpOworICAgIFdpZGdl
dDo6c2V0Rm9jdXMoZm9jdXNlZCk7CisKKyAgICBpZiAoZm9jdXNlZCkKKyAgICAgICAgaGFuZGxl
Rm9jdXNJbkV2ZW50KCk7CisgICAgZWxzZQorICAgICAgICBoYW5kbGVGb2N1c091dEV2ZW50KCk7
Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2hvdygpCit7CisgICAgc2V0U2VsZlZpc2libGUodHJ1
ZSk7CisgICAgV2lkZ2V0OjpzaG93KCk7CisgICAgdXBkYXRlUGx1Z2luV2lkZ2V0KCk7Cit9CisK
K3ZvaWQgUGx1Z2luVmlldzo6aGlkZSgpCit7CisgICAgc2V0U2VsZlZpc2libGUoZmFsc2UpOwor
ICAgIFdpZGdldDo6aGlkZSgpOworICAgIHVwZGF0ZVBsdWdpbldpZGdldCgpOworfQorCit2b2lk
IFBsdWdpblZpZXc6OnVwZGF0ZUJ1ZmZlcihjb25zdCBJbnRSZWN0JiBidWZmZXJSZWN0KQorewor
ICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBVcGRhdGUgdGhl
IHpvb20gZmFjdG9yIGhlcmUsIGl0IGhhcHBlbnMgcmlnaHQgYmVmb3JlIHNldE5QV2luZG93SWZO
ZWVkZWQKKyAgICAvLyBlbnN1cmluZyB0aGF0IHRoZSBwbHVnaW4gaGFzIGV2ZXJ5IG9wcG9ydHVu
aXR5IHRvIGdldCB0aGUgem9vbSBmYWN0b3IgYmVmb3JlCisgICAgLy8gaXQgcGFpbnRzIGFueXRo
aW5nLgorICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmll
dyo+KHBhcmVudCgpKSkKKyAgICAgICAgbV9wcml2YXRlLT5zZXRab29tRmFjdG9yKGZyYW1lVmll
dy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+Y3VycmVudFpvb21GYWN0b3Io
KSk7CisKKyAgICBzZXROUFdpbmRvd0lmTmVlZGVkKCk7CisKKyAgICAvLyBCdWlsZCBhbmQgZGlz
cGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsdWdpbiB0byBub3RpZnkgaXQgd2UgYXJlIGFib3V0IHRv
IGRyYXcgd2hhdGV2ZXIKKyAgICAvLyBpcyBpbiB0aGUgZnJvbnQgYnVmZmVyLiBUaGlzIGlzIGl0
J3Mgb3Bwb3J0dW5pdHkgdG8gZG8gYSBzd2FwLgorICAgIEludFJlY3QgZXhwb3NlZFJlY3QoYnVm
ZmVyUmVjdCk7CisgICAgZXhwb3NlZFJlY3QuaW50ZXJzZWN0KEludFJlY3QoSW50UG9pbnQoMCwg
MCksIGZyYW1lUmVjdCgpLnNpemUoKSkpOworCisgICAgLy8gT25seSBhc2sgdGhlIHBsdWdpbiB0
byBkcmF3IGlmIHRoZSBleHBvc2VkIHJlY3Qgd2FzIGV4cGxpY2l0bHkgaW52YWxpZGF0ZWQKKyAg
ICAvLyBieSB0aGUgcGx1Z2luLgorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0UmVn
aW9uIGV4cG9zZWRSZWdpb24gPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6
aW50ZXJzZWN0UmVnaW9ucyhtX3ByaXZhdGUtPm1faW52YWxpZGF0ZVJlZ2lvbiwgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkludFJlY3QoZXhwb3NlZFJlY3QpKTsKKyAgICBpZiAoIWV4cG9zZWRSZWdp
b24uaXNFbXB0eSgpKSB7CisgICAgICAgIG1fcHJpdmF0ZS0+bV9pbnZhbGlkYXRlUmVnaW9uID0g
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyhtX3By
aXZhdGUtPm1faW52YWxpZGF0ZVJlZ2lvbiwgZXhwb3NlZFJlZ2lvbik7CisgICAgICAgIHN0ZDo6
dmVjdG9yPEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0PiBleHBvc2VkUmVjdHMgPSBleHBv
c2VkUmVnaW9uLnJlY3RzKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBleHBv
c2VkUmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIE5QRHJhd0V2ZW50IGRyYXc7Cisg
ICAgICAgICAgICBkcmF3LnBsdWdpblJlY3QgPSB0b05QUmVjdChtX3dpbmRvd1JlY3QpOworICAg
ICAgICAgICAgZHJhdy5jbGlwUmVjdCA9IHRvTlBSZWN0KG1fY2xpcFJlY3QpOworICAgICAgICAg
ICAgZHJhdy5kcmF3UmVjdCA9IChOUFJlY3QqKWFsbG9jYShzaXplb2YoTlBSZWN0KSk7CisgICAg
ICAgICAgICBkcmF3LmRyYXdSZWN0Q291bnQgPSAxOworICAgICAgICAgICAgKmRyYXcuZHJhd1Jl
Y3QgPSB0b05QUmVjdChleHBvc2VkUmVjdHMuYXQoaSkpOworICAgICAgICAgICAgZHJhdy56b29t
RmFjdG9yID0gKChOUFNldFdpbmRvd0NhbGxiYWNrU3RydWN0KiltX25wV2luZG93LndzX2luZm8p
LT56b29tRmFjdG9yOworCisgICAgICAgICAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgICAgICAg
ICBucEV2ZW50LnR5cGUgPSBOUF9EcmF3RXZlbnQ7CisgICAgICAgICAgICBucEV2ZW50LmRhdGEg
PSAmZHJhdzsKKworICAgICAgICAgICAgLy8gRklYTUU6IFJldHVybiBlYXJseSBpZiB0aGlzIGZh
aWxzPyBPciBqdXN0IHJlcGFpbnQ/CisgICAgICAgICAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVu
dCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6cGFpbnQoR3JhcGhp
Y3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmICghbV9w
cml2YXRlIHx8ICFtX2lzU3RhcnRlZCkgeworICAgICAgICBwYWludE1pc3NpbmdQbHVnaW5JY29u
KGNvbnRleHQsIHJlY3QpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVXBkYXRl
IHRoZSB6b29tIGZhY3RvciBoZXJlLCBpdCBoYXBwZW5zIHJpZ2h0IGJlZm9yZSBzZXROUFdpbmRv
d0lmTmVlZGVkCisgICAgLy8gZW5zdXJpbmcgdGhhdCB0aGUgcGx1Z2luIGhhcyBldmVyeSBvcHBv
cnR1bml0eSB0byBnZXQgdGhlIHpvb20gZmFjdG9yIGJlZm9yZQorICAgIC8vIGl0IHBhaW50cyBh
bnl0aGluZy4KKyAgICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFt
ZVZpZXcqPihwYXJlbnQoKSkpCisgICAgICAgIG1fcHJpdmF0ZS0+c2V0Wm9vbUZhY3RvcihmcmFt
ZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmN1cnJlbnRab29tRmFj
dG9yKCkpOworCisgICAgaWYgKGNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgc2V0TlBXaW5kb3dJZk5lZWRlZCgpOworCisjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorICAgIGlmIChtX3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllcikKKyAg
ICAgICAgcmV0dXJuOworI2VuZGlmCisKKyAgICAvLyBCdWlsZCBhbmQgZGlzcGF0Y2ggYW4gZXZl
bnQgdG8gdGhlIHBsdWdpbiB0byBub3RpZnkgaXQgd2UgYXJlIGFib3V0IHRvIGRyYXcgd2hhdGV2
ZXIKKyAgICAvLyBpcyBpbiB0aGUgZnJvbnQgYnVmZmVyLiBUaGlzIGlzIGl0J3Mgb3Bwb3J0dW5p
dHkgdG8gZG8gYSBzd2FwLgorICAgIEludFJlY3QgcmVjdENsaXAocmVjdCk7CisgICAgcmVjdENs
aXAuaW50ZXJzZWN0KGZyYW1lUmVjdCgpKTsKKworICAgIEludFJlY3QgZXhwb3NlZFJlY3QocmVj
dENsaXApOworICAgIGV4cG9zZWRSZWN0Lm1vdmUoLWZyYW1lUmVjdCgpLngoKSwgLWZyYW1lUmVj
dCgpLnkoKSk7CisKKyAgICB1cGRhdGVCdWZmZXIoZXhwb3NlZFJlY3QpOworCisgICAgUHRocmVh
ZFJlYWRMb2NrZXIgZnJvbnRMb2NrKCZtX3ByaXZhdGUtPm1fZnJvbnRCdWZmZXJSd0xvY2spOwor
CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGZyb250QnVmZmVy
ID0KKyAgICAgICAgbV9wcml2YXRlLT5tX3BsdWdpbkJ1ZmZlcnNbbV9wcml2YXRlLT5tX3BsdWdp
bkZyb250QnVmZmVyXTsKKworICAgIC8vIERvbid0IHBhaW50IGFueXRoaW5nIGlmIHRoZXJlIGlz
IG5vIGJ1ZmZlci4KKyAgICBpZiAoIWZyb250QnVmZmVyKQorICAgICAgICByZXR1cm47CisKKyAg
ICBjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJhY2tpbmdJbWFnZSogYmFj
a2luZ0ltYWdlID0KKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpsb2Nr
QnVmZmVyQmFja2luZ0ltYWdlKGZyb250QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkdyYXBoaWNzOjpSZWFkQWNjZXNzKTsKKyAgICBpZiAoIWJhY2tpbmdJbWFnZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gRHJhdyB0aGUgY2hhbmdlZCBidWZmZXIgY29udGVudHMgdG8gdGhl
IHNjcmVlbi4KKyAgICBjb250ZXh0LT5zYXZlKCk7CisKKyAgICBjb25zdCBTa0JpdG1hcCYgcGx1
Z2luSW1hZ2UgPSAqYmFja2luZ0ltYWdlOworICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBn
cmFwaGljcyA9IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOworICAgIEFTU0VSVChncmFwaGlj
cyk7CisgICAgU2tDYW52YXMqIGNhbnZhcyA9IGdyYXBoaWNzLT5jYW52YXMoKTsKKworICAgIC8v
IFNvdXJjZSByZWN0YW5nbGUgd2Ugd2lsbCBkcmF3IHRvIHRoZSBzY3JlZW4uCisgICAgU2tJUmVj
dCBza1NyY1JlY3Q7CisgICAgc2tTcmNSZWN0LnNldChleHBvc2VkUmVjdC54KCksIGV4cG9zZWRS
ZWN0LnkoKSwKKyAgICAgICAgICAgICAgICAgIGV4cG9zZWRSZWN0LngoKSArIGV4cG9zZWRSZWN0
LndpZHRoKCksCisgICAgICAgICAgICAgICAgICBleHBvc2VkUmVjdC55KCkgKyBleHBvc2VkUmVj
dC5oZWlnaHQoKSk7CisKKyAgICAvLyBQcmVwYXJlIHRoZSBob2xlIHB1bmNoIHJlY3RhbmdsZS4K
KyAgICBTa0lSZWN0IHVuY2xpcHBlZEhvbGVQdW5jaFJlY3Q7CisgICAgdW5jbGlwcGVkSG9sZVB1
bmNoUmVjdC5zZXQobV9wcml2YXRlLT5tX2hvbGVQdW5jaFJlY3QueCgpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIG1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LnkoKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC54KCkg
KyBtX3ByaXZhdGUtPm1faG9sZVB1bmNoUmVjdC53aWR0aCgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG1fcHJpdmF0ZS0+bV9ob2xlUHVuY2hSZWN0LnkoKSArIG1fcHJpdmF0ZS0+
bV9ob2xlUHVuY2hSZWN0LmhlaWdodCgpKTsKKworICAgIC8vIGhvbGVQdW5jaFJlY3QgaXMgY2xp
cHBlZC4KKyAgICBTa0lSZWN0IGhvbGVQdW5jaFJlY3Q7CisKKyAgICAvLyBBbGwgc291cmNlIHJl
Y3RhbmdsZXMgYXJlIHNjYWxlZCBieSB0aGUgem9vbSBmYWN0b3IgYmVjYXVzZSB0aGUgc291cmNl
IGJpdG1hcCBtYXkgYmUgYQorICAgIC8vIGhpZ2hlciByZXNvbHV0aW9uIHRoYW4gdGhlIDE6MSBw
YWdlLiBUaGlzIGFsbG93cyB0aGUgZmxhc2ggcGxheWVyIHRvIHNjYWxlIHRoZSBjb250ZW50Cisg
ICAgLy8gaXQgaXMgZHJhd2luZyB0byBtYXRjaCB0aGUgc2NhbGUgb2YgdGhlIHBhZ2UuCisgICAg
ZG91YmxlIHpvb21GYWN0b3JIID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX3ByaXZhdGUtPm1fcGx1
Z2luQnVmZmVyU2l6ZS53aWR0aCgpKSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oZnJhbWVSZWN0KCku
d2lkdGgoKSk7CisgICAgZG91YmxlIHpvb21GYWN0b3JXID0gc3RhdGljX2Nhc3Q8ZG91YmxlPiht
X3ByaXZhdGUtPm1fcGx1Z2luQnVmZmVyU2l6ZS5oZWlnaHQoKSkgLyBzdGF0aWNfY2FzdDxkb3Vi
bGU+KGZyYW1lUmVjdCgpLmhlaWdodCgpKTsKKyAgICBkb3VibGUgem9vbUZhY3RvciA9ICh6b29t
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
LCBza1NyY1JlY3QuZlJpZ2h0LCBob2xlUHVuY2hSZWN0LmZCb3R0b20pOworICAgICAgICAgICAg
ZHN0UmVjdC5vZmZzZXQoZnJhbWVSZWN0KCkueCgpLCBmcmFtZVJlY3QoKS55KCkpOworCisgICAg
ICAgICAgICBjYW52YXMtPmRyYXdCaXRtYXBSZWN0KHBsdWdpbkltYWdlLCAmc3JjUmVjdCwgZHN0
UmVjdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEcmF3IHRoZSBib3R0b20gY2h1bmsgaWYg
bmVlZGVkLgorICAgICAgICBpZiAoaG9sZVB1bmNoUmVjdC5mQm90dG9tIDwgc2tTcmNSZWN0LmZC
b3R0b20pIHsKKyAgICAgICAgICAgIFNrSVJlY3Qgc3JjUmVjdDsKKyAgICAgICAgICAgIHNyY1Jl
Y3Quc2V0KHNrU3JjUmVjdC5mTGVmdCAqIHpvb21GYWN0b3IsIGhvbGVQdW5jaFJlY3QuZkJvdHRv
bSAqIHpvb21GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBza1NyY1JlY3QuZlJpZ2h0
ICogem9vbUZhY3Rvciwgc2tTcmNSZWN0LmZCb3R0b20gKiB6b29tRmFjdG9yKTsKKworICAgICAg
ICAgICAgU2tSZWN0IGRzdFJlY3Q7CisgICAgICAgICAgICBkc3RSZWN0LnNldChza1NyY1JlY3Qu
ZkxlZnQsIGhvbGVQdW5jaFJlY3QuZkJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNr
U3JjUmVjdC5mUmlnaHQsIHNrU3JjUmVjdC5mQm90dG9tKTsKKyAgICAgICAgICAgIGRzdFJlY3Qu
b2Zmc2V0KGZyYW1lUmVjdCgpLngoKSwgZnJhbWVSZWN0KCkueSgpKTsKKworICAgICAgICAgICAg
Y2FudmFzLT5kcmF3Qml0bWFwUmVjdChwbHVnaW5JbWFnZSwgJnNyY1JlY3QsIGRzdFJlY3QpOwor
ICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2tJUmVjdCBzcmNSZWN0OworICAgICAg
ICBzcmNSZWN0LnNldChza1NyY1JlY3QuZkxlZnQgKiB6b29tRmFjdG9yLCBza1NyY1JlY3QuZlRv
cCAqIHpvb21GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgIHNrU3JjUmVjdC5mUmlnaHQgKiB6
b29tRmFjdG9yLCBza1NyY1JlY3QuZkJvdHRvbSAqIHpvb21GYWN0b3IpOworCisgICAgICAgIC8v
IENhbGN1bGF0ZSB0aGUgZGVzdGluYXRpb24gcmVjdGFuZ2xlLgorICAgICAgICBTa1JlY3QgZHN0
UmVjdDsKKyAgICAgICAgZHN0UmVjdC5zZXQocmVjdENsaXAueCgpLCByZWN0Q2xpcC55KCksCisg
ICAgICAgICAgICAgICAgICAgIHJlY3RDbGlwLngoKSArIHJlY3RDbGlwLndpZHRoKCksCisgICAg
ICAgICAgICAgICAgICAgIHJlY3RDbGlwLnkoKSArIHJlY3RDbGlwLmhlaWdodCgpKTsKKworICAg
ICAgICAvLyBEb24ndCBwdW5jaCBhIGhvbGUuCisgICAgICAgIGNhbnZhcy0+ZHJhd0JpdG1hcFJl
Y3QocGx1Z2luSW1hZ2UsICZzcmNSZWN0LCBkc3RSZWN0KTsKKyAgICB9CisKKyAgICBjb250ZXh0
LT5yZXN0b3JlKCk7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OnJlbGVh
c2VCdWZmZXJCYWNraW5nSW1hZ2UoZnJvbnRCdWZmZXIpOworfQorCisKK2Jvb2wgUGx1Z2luVmll
dzo6ZGlzcGF0Y2hGdWxsU2NyZWVuTlBFdmVudChOUEV2ZW50JiBldmVudCkKK3sKKyAgICBpZiAo
IW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQVNTRVJUKG1fcHJpdmF0
ZS0+bV9pc0Z1bGxTY3JlZW4pOworICAgIHJldHVybiBkaXNwYXRjaE5QRXZlbnQoZXZlbnQpOwor
fQorCisvLyBGSVhNRTogVW5pZnkgYWNyb3NzIHBvcnRzLgorYm9vbCBQbHVnaW5WaWV3OjpkaXNw
YXRjaE5QRXZlbnQoTlBFdmVudCYgZXZlbnQpCit7CisgICAgaWYgKCFtX3BsdWdpbiB8fCAhbV9w
bHVnaW4tPnBsdWdpbkZ1bmNzKCktPmV2ZW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldyh0aGlzKTsKKyAgICBKU0M6OkpTTG9j
azo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrcyhKU0M6OlNpbGVuY2VBc3NlcnRpb25zT25seSk7
CisgICAgc2V0Q2FsbGluZ1BsdWdpbih0cnVlKTsKKworICAgIGJvb2wgYWNjZXB0ZWQgPSBtX3Bs
dWdpbi0+cGx1Z2luRnVuY3MoKS0+ZXZlbnQobV9pbnN0YW5jZSwgJmV2ZW50KTsKKworICAgIHNl
dENhbGxpbmdQbHVnaW4oZmFsc2UpOworICAgIFBsdWdpblZpZXc6OnNldEN1cnJlbnRQbHVnaW5W
aWV3KDApOworCisgICAgcmV0dXJuIGFjY2VwdGVkOworfQorCit2b2lkIFBsdWdpblZpZXc6Omhh
bmRsZUtleWJvYXJkRXZlbnQoS2V5Ym9hcmRFdmVudCogZXZlbnQpCit7CisgICAgTlBFdmVudCBu
cEV2ZW50OworICAgIE5QS2V5Ym9hcmRFdmVudCBrZXlFdmVudDsKKyAgICBjb25zdCBQbGF0Zm9y
bUtleWJvYXJkRXZlbnQgKnBsYXRmb3JtS2V5RXZlbnQgPSBldmVudC0+a2V5RXZlbnQoKTsKKwor
ICAgIGtleUV2ZW50Lm1vZGlmaWVycyA9IDA7CisKKyAgICBpZiAocGxhdGZvcm1LZXlFdmVudC0+
c2hpZnRLZXkoKSkKKyAgICAgICAga2V5RXZlbnQubW9kaWZpZXJzIHw9IEtFWU1PRF9TSElGVDsK
KworICAgIGlmIChwbGF0Zm9ybUtleUV2ZW50LT5jdHJsS2V5KCkpCisgICAgICAgIGtleUV2ZW50
Lm1vZGlmaWVycyB8PSBLRVlNT0RfQ1RSTDsKKworICAgIGlmIChwbGF0Zm9ybUtleUV2ZW50LT5h
bHRLZXkoKSkKKyAgICAgICAga2V5RXZlbnQubW9kaWZpZXJzIHw9IEtFWU1PRF9BTFQ7CisKKyAg
ICBpZiAocGxhdGZvcm1LZXlFdmVudC0+bWV0YUtleSgpKQorICAgICAgICBrZXlFdmVudC5tb2Rp
ZmllcnMgfD0gS0VZTU9EX0FMVEdSOworCisgICAga2V5RXZlbnQuY2FwID0gcGxhdGZvcm1LZXlF
dmVudC0+dW5tb2RpZmllZENoYXJhY3RlcigpOworICAgIGtleUV2ZW50LnN5bSA9IGtleUV2ZW50
LmNhcDsKKyAgICBrZXlFdmVudC5zY2FuID0gMDsKKyAgICBrZXlFdmVudC5mbGFncyA9IDA7CisK
KyAgICBpZiAocGxhdGZvcm1LZXlFdmVudC0+dHlwZSgpID09IFBsYXRmb3JtS2V5Ym9hcmRFdmVu
dDo6UmF3S2V5RG93bgorICAgICAgICB8fCBwbGF0Zm9ybUtleUV2ZW50LT50eXBlKCkgPT0gUGxh
dGZvcm1LZXlib2FyZEV2ZW50OjpLZXlEb3duKSB7CisgICAgICAgIGtleUV2ZW50LmZsYWdzID0g
S0VZX0RPV04gfCBLRVlfU1lNX1ZBTElEIHwgS0VZX0NBUF9WQUxJRDsKKyAgICB9IGVsc2UgaWYg
KHBsYXRmb3JtS2V5RXZlbnQtPnR5cGUoKSA9PSBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6OktleVVw
KQorICAgICAgICBrZXlFdmVudC5mbGFncyA9IEtFWV9TWU1fVkFMSUQgfCBLRVlfQ0FQX1ZBTElE
OworCisgICAgbnBFdmVudC50eXBlID0gTlBfS2V5RXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0g
JmtleUV2ZW50OworICAgIGlmIChkaXNwYXRjaE5QRXZlbnQobnBFdmVudCkpCisgICAgICAgIGV2
ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZVdo
ZWVsRXZlbnQoV2hlZWxFdmVudCogZXZlbnQpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmICghbV9wcml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAgICAg
Zm9jdXNQbHVnaW5FbGVtZW50KCk7CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgTlBXaGVl
bEV2ZW50IHdoZWVsRXZlbnQ7CisKKyAgICB3aGVlbEV2ZW50LnggPSBldmVudC0+b2Zmc2V0WCgp
OworICAgIHdoZWVsRXZlbnQueSA9IGV2ZW50LT5vZmZzZXRZKCk7CisKKyAgICB3aGVlbEV2ZW50
LmZsYWdzID0gMDsKKworICAgIHdoZWVsRXZlbnQueERlbHRhID0gZXZlbnQtPnJhd0RlbHRhWCgp
OworICAgIHdoZWVsRXZlbnQueURlbHRhID0gZXZlbnQtPnJhd0RlbHRhWSgpOworCisgICAgbnBF
dmVudC50eXBlID0gTlBfV2hlZWxFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAmd2hlZWxFdmVu
dDsKKworICAgIGlmIChkaXNwYXRjaE5QRXZlbnQobnBFdmVudCkpIHsKKyAgICAgICAgZXZlbnQt
PnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgICAgIGV2ZW50LT5zZXRQbHVnaW5IYW5kbGVkKCk7
CisgICAgfQorfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZVRvdWNoRXZlbnQoVG91Y2hFdmVu
dCogZXZlbnQpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmICghbV9wcml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAgICAgZm9jdXNQbHVnaW5FbGVtZW50
KCk7CisKKyAgICBOUFRvdWNoRXZlbnQgbnBUb3VjaEV2ZW50OworCisgICAgaWYgKGV2ZW50LT5p
c0RvdWJsZVRhcCgpKQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0RP
VUJMRVRBUDsKKyAgICBlbHNlIGlmIChldmVudC0+aXNUb3VjaEhvbGQoKSkKKyAgICAgICAgbnBU
b3VjaEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9UT1VDSEhPTEQ7CisgICAgZWxzZSBpZiAoZXZl
bnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkudG91Y2hzdGFydEV2ZW50KQorICAgICAgICBucFRv
dWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX1NUQVJUOworICAgIGVsc2UgaWYgKGV2ZW50LT50
eXBlKCkgPT0gZXZlbnROYW1lcygpLnRvdWNoZW5kRXZlbnQpCisgICAgICAgIG5wVG91Y2hFdmVu
dC50eXBlID0gVE9VQ0hfRVZFTlRfRU5EOworICAgIGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0g
ZXZlbnROYW1lcygpLnRvdWNobW92ZUV2ZW50KQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9
IFRPVUNIX0VWRU5UX01PVkU7CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5h
bWVzKCkudG91Y2hjYW5jZWxFdmVudCkKKyAgICAgICAgbnBUb3VjaEV2ZW50LnR5cGUgPSBUT1VD
SF9FVkVOVF9DQU5DRUw7CisgICAgZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVG91Y2hMaXN0KiB0b3VjaExpc3Q7Cisg
ICAgLy8gVGhlIHRvdWNoZXMgbGlzdCBpcyBlbXB0eSBpZiBpbiBhIHRvdWNoIGVuZCBldmVudC4g
VXNlIGNoYW5nZWRUb3VjaGVzIGluc3RlYWQuCisgICAgaWYgKG5wVG91Y2hFdmVudC50eXBlID09
IFRPVUNIX0VWRU5UX0RPVUJMRVRBUCB8fCBucFRvdWNoRXZlbnQudHlwZSA9PSBUT1VDSF9FVkVO
VF9FTkQpCisgICAgICAgIHRvdWNoTGlzdCA9IGV2ZW50LT5jaGFuZ2VkVG91Y2hlcygpOworICAg
IGVsc2UKKyAgICAgICAgdG91Y2hMaXN0ID0gZXZlbnQtPnRvdWNoZXMoKTsKKworICAgIG5wVG91
Y2hFdmVudC5wb2ludHMgPSAwOworICAgIG5wVG91Y2hFdmVudC5zaXplID0gdG91Y2hMaXN0LT5s
ZW5ndGgoKTsKKworICAgIE93bkFycmF5UHRyPE5QVG91Y2hQb2ludD4gdG91Y2hQb2ludHM7Cisg
ICAgaWYgKHRvdWNoTGlzdC0+bGVuZ3RoKCkpIHsKKyAgICAgICAgdG91Y2hQb2ludHMgPSBhZG9w
dEFycmF5UHRyKG5ldyBOUFRvdWNoUG9pbnRbdG91Y2hMaXN0LT5sZW5ndGgoKV0pOworICAgICAg
ICBucFRvdWNoRXZlbnQucG9pbnRzID0gdG91Y2hQb2ludHMuZ2V0KCk7CisgICAgICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCB0b3VjaExpc3QtPmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAg
ICAgIFRvdWNoKiB0b3VjaEl0ZW0gPSB0b3VjaExpc3QtPml0ZW0oaSk7CisgICAgICAgICAgICBu
cFRvdWNoRXZlbnQucG9pbnRzW2ldLnRvdWNoSWQgPSB0b3VjaEl0ZW0tPmlkZW50aWZpZXIoKTsK
KyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHNbaV0uY2xpZW50WCA9IHRvdWNoSXRlbS0+
cGFnZVgoKSAtIGZyYW1lUmVjdCgpLngoKTsKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2lu
dHNbaV0uY2xpZW50WSA9IHRvdWNoSXRlbS0+cGFnZVkoKSAtIGZyYW1lUmVjdCgpLnkoKTsKKyAg
ICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHNbaV0uc2NyZWVuWCA9IHRvdWNoSXRlbS0+c2Ny
ZWVuWCgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5zY3JlZW5ZID0gdG91
Y2hJdGVtLT5zY3JlZW5ZKCk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnBh
Z2VYID0gdG91Y2hJdGVtLT5wYWdlWCgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50
c1tpXS5wYWdlWSA9IHRvdWNoSXRlbS0+cGFnZVkoKTsKKworICAgICAgICB9CisgICAgfQorCisg
ICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX1RvdWNoRXZlbnQ7Cisg
ICAgbnBFdmVudC5kYXRhID0gJm5wVG91Y2hFdmVudDsKKworICAgIGlmIChkaXNwYXRjaE5QRXZl
bnQobnBFdmVudCkpIHsKKyAgICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAg
ICAgIGV2ZW50LT5zZXRQbHVnaW5IYW5kbGVkKCk7CisgICAgfSBlbHNlIGlmIChucFRvdWNoRXZl
bnQudHlwZSA9PSBUT1VDSF9FVkVOVF9ET1VCTEVUQVApIHsKKyAgICAgICAgLy8gU2VuZCBUb3Vj
aCBVcCBpZiBkb3VibGUgdGFwIG5vdCBjb25zdW1lZAorICAgICAgICBucFRvdWNoRXZlbnQudHlw
ZSA9IFRPVUNIX0VWRU5UX0VORDsKKyAgICAgICAgbnBFdmVudC5kYXRhID0gJm5wVG91Y2hFdmVu
dDsKKyAgICAgICAgaWYgKGRpc3BhdGNoTlBFdmVudChucEV2ZW50KSkgeworICAgICAgICAgICAg
ZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7CisgICAgICAgICAgICBldmVudC0+c2V0UGx1Z2lu
SGFuZGxlZCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRs
ZU1vdXNlRXZlbnQoTW91c2VFdmVudCogZXZlbnQpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisg
ICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9wcml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAg
ICAgZm9jdXNQbHVnaW5FbGVtZW50KCk7CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgTlBN
b3VzZUV2ZW50IG1vdXNlRXZlbnQ7CisKKyAgICBtb3VzZUV2ZW50LnggPSBldmVudC0+b2Zmc2V0
WCgpOworICAgIG1vdXNlRXZlbnQueSA9IGV2ZW50LT5vZmZzZXRZKCk7CisKKyAgICBpZiAoZXZl
bnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2Vkb3duRXZlbnQpIHsKKyAgICAgICAgbW91
c2VFdmVudC50eXBlID0gTU9VU0VfQlVUVE9OX0RPV047CisgICAgICAgIHBhcmVudEZyYW1lKCkt
PmV2ZW50SGFuZGxlcigpLT5zZXRDYXB0dXJpbmdNb3VzZUV2ZW50c05vZGUobm9kZSgpKTsKKyAg
ICB9IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLm1vdXNlbW92ZUV2ZW50
KQorICAgICAgICBtb3VzZUV2ZW50LnR5cGUgPSBNT1VTRV9NT1RJT047CisgICAgZWxzZSBpZiAo
ZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2VvdXRFdmVudCkKKyAgICAgICAgbW91
c2VFdmVudC50eXBlID0gTU9VU0VfT1VUQk9VTkQ7CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUo
KSA9PSBldmVudE5hbWVzKCkubW91c2VvdmVyRXZlbnQpCisgICAgICAgIG1vdXNlRXZlbnQudHlw
ZSA9IE1PVVNFX09WRVI7CisgICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVz
KCkubW91c2V1cEV2ZW50KSB7CisgICAgICAgIG1vdXNlRXZlbnQudHlwZSA9IE1PVVNFX0JVVFRP
Tl9VUDsKKyAgICAgICAgcGFyZW50RnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCktPnNldENhcHR1cmlu
Z01vdXNlRXZlbnRzTm9kZSgwKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuOworCisgICAg
bW91c2VFdmVudC5idXR0b24gPSBldmVudC0+YnV0dG9uKCk7CisgICAgbW91c2VFdmVudC5mbGFn
cyA9IDA7CisKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9Nb3VzZUV2ZW50OworICAgIG5wRXZlbnQu
ZGF0YSA9ICZtb3VzZUV2ZW50OworCisgICAgaWYgKGRpc3BhdGNoTlBFdmVudChucEV2ZW50KSkg
eworICAgICAgICBldmVudC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKKyAgICAgICAgZXZlbnQtPnNl
dFBsdWdpbkhhbmRsZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlRm9j
dXNJbkV2ZW50KCkKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0ZvY3VzZWQpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
cHJpdmF0ZS0+bV9pc0ZvY3VzZWQgPSB0cnVlOworCisgICAgTlBFdmVudCBucEV2ZW50OworICAg
IG5wRXZlbnQudHlwZSA9IE5QX0ZvY3VzR2FpbmVkRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0g
MDsKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6
aGFuZGxlRm9jdXNPdXRFdmVudCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJl
dHVybjsKKworICAgIGlmICghbV9wcml2YXRlLT5tX2lzRm9jdXNlZCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgbV9wcml2YXRlLT5tX2lzRm9jdXNlZCA9IGZhbHNlOworCisgICAgTlBFdmVudCBu
cEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0ZvY3VzTG9zdEV2ZW50OworICAgIG5wRXZl
bnQuZGF0YSA9IDA7CisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBs
dWdpblZpZXc6OmhhbmRsZVBhdXNlRXZlbnQoKQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAg
ICBucEV2ZW50LnR5cGUgPSBOUF9QYXVzZUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7Cisg
ICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRs
ZVJlc3VtZUV2ZW50KCkKK3sKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBl
ID0gTlBfUmVzdW1lRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKyAgICBkaXNwYXRjaE5Q
RXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlU2Nyb2xsRXZlbnQo
KQoreworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4o
cGFyZW50KCkpOworCisgICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UsIGlmIHRoZSBmcmFtZVZpZXcg
ZXh0ZW50IGluIGVpdGhlciBkaW1lbnNpb24gaXMKKyAgICAvLyBlbXB0eSwgdGhlbiBzZW5kIGFu
IG9uIHNjcmVlbiBldmVudC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHNpdGVzIGxpa2UKKyAgICAv
LyBwaWNuaWsuY29tIHdoaWNoIHVzZSBhIGhpZGRlbiBpZnJhbWUgKHJlYWQ6IHdpZHRoID0gMCBh
bmQgaGVpZ2h0ID0gMCkKKyAgICAvLyB3aXRoIGFuIGVtYmVkZGVkIHN3ZiB0byBleGVjdXRlIHNv
bWUgamF2YXNjcmlwdC4gVW5sZXNzIHdlIHNlbmQgYW4KKyAgICAvLyBvbiBzY3JlZW4gZXZlbnQg
dGhlIHN3ZiB3aWxsIG5vdCBleGVjdXRlIHRoZSBqYXZhc2NyaXB0IGFuZCB0aGUgcmVhbAorICAg
IC8vIHNpdGUgd2lsbCBuZXZlciBsb2FkLgorICAgIGJvb2wgb25TY3JlZW5FdmVudCA9IGZyYW1l
VmlldyAmJiAoIWZyYW1lVmlldy0+d2lkdGgoKSB8fCAhZnJhbWVWaWV3LT5oZWlnaHQoKSk7CisK
KyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gbV9jbGlwUmVjdC5pc0Vt
cHR5KCkgJiYgIW9uU2NyZWVuRXZlbnQgPyBOUF9PZmZTY3JlZW5FdmVudCA6IE5QX09uU2NyZWVu
RXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gMDsKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVu
dCk7Cit9CisKK0ludFJlY3QgUGx1Z2luVmlldzo6Y2FsY3VsYXRlQ2xpcFJlY3QoKSBjb25zdAor
eworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFy
ZW50KCkpOworICAgIGJvb2wgdmlzaWJsZSA9IGZyYW1lVmlldyAmJiBpc1Zpc2libGUoKTsKKwor
ICAgIGlmICh2aXNpYmxlICYmIGZyYW1lVmlldy0+d2lkdGgoKSAmJiBmcmFtZVZpZXctPmhlaWdo
dCgpKSB7CisgICAgICAgIEludFNpemUgd2luZG93U2l6ZSA9IGZyYW1lVmlldy0+aG9zdFdpbmRv
dygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+dmlld3BvcnRTaXplKCk7CisKKyAgICAgICAgLy8g
R2V0IHRoZSBjbGlwcGVkIHJlY3RhbmdsZSBmb3IgdGhpcyBwbGF5ZXIgd2l0aGluIHRoZSBjdXJy
ZW50IGZyYW1lLgorICAgICAgICBJbnRSZWN0IHZpc2libGVDb250ZW50UmVjdDsKKyAgICAgICAg
SW50UmVjdCBjb250ZW50UmVjdCA9IG1fZWxlbWVudC0+cmVuZGVyZXIoKS0+YWJzb2x1dGVDbGlw
cGVkT3ZlcmZsb3dSZWN0KCk7CisgICAgICAgIEZsb2F0UG9pbnQgY29udGVudExvY2FsID0gbV9l
bGVtZW50LT5yZW5kZXJlcigpLT5hYnNvbHV0ZVRvTG9jYWwoRmxvYXRQb2ludChjb250ZW50UmVj
dC5sb2NhdGlvbigpKSk7CisKKyAgICAgICAgY29udGVudFJlY3Quc2V0TG9jYXRpb24ocm91bmRl
ZEludFBvaW50KGNvbnRlbnRMb2NhbCkpOworICAgICAgICBjb250ZW50UmVjdC5tb3ZlKGZyYW1l
UmVjdCgpLngoKSwgZnJhbWVSZWN0KCkueSgpKTsKKworICAgICAgICAvLyBDbGlwIGFnYWluc3Qg
YW55IGZyYW1lcyB0aGF0IHRoZSB3aWRnZXQgaXMgaW5zaWRlLiBOb3RlIHRoYXQgaWYgdGhlIGZy
YW1lcyBhcmUgYWxzbyBjbGlwcGVkCisgICAgICAgIC8vIGJ5IGEgZGl2LCB0aGF0IHdpbGwgbm90
IGJlIGluY2x1ZGVkIGluIHRoaXMgY2FsY3VsYXRpb24uIFRoYXQgaXMgYW4gaW1wcm92ZW1lbnQg
dGhhdCBzdGlsbAorICAgICAgICAvLyBuZWVkcyB0byBiZSBtYWRlLgorICAgICAgICBjb25zdCBX
aWRnZXQqIGN1cnJlbnQgPSB0aGlzOworICAgICAgICB3aGlsZSAoY3VycmVudC0+cGFyZW50KCkg
JiYgdmlzaWJsZSkgeworICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGl0IGlzIHZpc2libGUg
aW4gdGhpcyBzY3JvbGx2aWV3LgorICAgICAgICAgICAgdmlzaWJsZUNvbnRlbnRSZWN0ID0gY3Vy
cmVudC0+cGFyZW50KCktPnZpc2libGVDb250ZW50UmVjdCgpOworCisgICAgICAgICAgICAvLyBT
cGVjaWFsIGNhc2UgZm9yIHRoZSByb290IFNjcm9sbFZpZXcuIEl0cyBzaXplIGRvZXMgbm90IG1h
dGNoIHRoZSBhY3R1YWwgd2luZG93IHNpemUuCisgICAgICAgICAgICBpZiAoY3VycmVudC0+cGFy
ZW50KCkgPT0gcm9vdCgpKQorICAgICAgICAgICAgICAgIHZpc2libGVDb250ZW50UmVjdC5zZXRT
aXplKHdpbmRvd1NpemUpOworCisgICAgICAgICAgICBjb250ZW50UmVjdC5pbnRlcnNlY3Qodmlz
aWJsZUNvbnRlbnRSZWN0KTsKKyAgICAgICAgICAgIHZpc2libGUgPSAhY29udGVudFJlY3QuaXNF
bXB0eSgpOworCisgICAgICAgICAgICAvLyBPZmZzZXQgdG8gdmlzaWJsZSBjb29yZGluYXRlcyBp
biBzY3JvbGx2aWV3IHdpZGdldCdzIGNvb3JkaW5hdGUgc3lzdGVtIChleGNlcHQgaW4gdGhlIGNh
c2Ugb2YKKyAgICAgICAgICAgIC8vIHRoZSB0b3Agc2Nyb2xsIHZpZXcpLgorICAgICAgICAgICAg
aWYgKGN1cnJlbnQtPnBhcmVudCgpLT5wYXJlbnQoKSkKKyAgICAgICAgICAgICAgICBjb250ZW50
UmVjdC5tb3ZlKC12aXNpYmxlQ29udGVudFJlY3QueCgpLCAtdmlzaWJsZUNvbnRlbnRSZWN0Lnko
KSk7CisKKyAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQoKTsKKworICAgICAg
ICAgICAgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgb2Zmc2V0IGZvciB0aGUgcm9vdCB3aW5kb3cgb3Ig
d2UgZ2V0IHRoZSB3cm9uZyBjb29yZGluYXRlcy4KKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5w
YXJlbnQoKSkgeworICAgICAgICAgICAgICAgIC8vIE1vdmUgY29udGVudCByZWN0IGludG8gdGhl
IHBhcmVudCBzY3JvbGx2aWV3J3MgY29vcmRpbmF0ZXMuCisgICAgICAgICAgICAgICAgSW50UmVj
dCBjdXJGcmFtZVJlY3QgPSBjdXJyZW50LT5mcmFtZVJlY3QoKTsKKyAgICAgICAgICAgICAgICBj
b250ZW50UmVjdC5tb3ZlKGN1ckZyYW1lUmVjdC54KCksIGN1ckZyYW1lUmVjdC55KCkpOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRSZWN0OworICAg
IH0KKworICAgIHJldHVybiBJbnRSZWN0KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxl
T25Mb2FkRXZlbnQoKQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisK
KyAgICBpZiAobV9wcml2YXRlLT5tX3NlbnRPbkxvYWQpCisgICAgICAgIHJldHVybjsKKworICAg
IG1fcHJpdmF0ZS0+bV9zZW50T25Mb2FkID0gdHJ1ZTsKKworICAgIE5QRXZlbnQgbnBFdmVudDsK
KyAgICBucEV2ZW50LnR5cGUgPSBOUF9PbkxvYWRFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAw
OworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworCisgICAgLy8gU2VuZCBhbiBpbml0
aWFsIE9uU2NyZWVuL09mZlNjcmVlbiBldmVudC4gSXQgbXVzdCBhbHdheXMgY29tZSBhZnRlciBv
bkxvYWQgaXMgc2VudC4KKyAgICBoYW5kbGVTY3JvbGxFdmVudCgpOworfQorCit2b2lkIFBsdWdp
blZpZXc6OmhhbmRsZUZyZWVNZW1vcnlFdmVudCgpCit7CisgICAgTlBFdmVudCBucEV2ZW50Owor
ICAgIG5wRXZlbnQudHlwZSA9IE5QX0ZyZWVNZW1vcnlFdmVudDsKKyAgICBucEV2ZW50LmRhdGEg
PSAwOworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZp
ZXc6OmhhbmRsZUJhY2tncm91bmRFdmVudCgpCit7CisgICAgTlBFdmVudCBucEV2ZW50OworICAg
IG5wRXZlbnQudHlwZSA9IE5QX0JhY2tncm91bmRFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAw
OworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6
OmhhbmRsZUZvcmVncm91bmRFdmVudCgpCit7CisgICAgc2V0TlBXaW5kb3dJZk5lZWRlZCgpOwor
CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0ZvcmVncm91bmRF
dmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZl
bnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUZ1bGxTY3JlZW5BbGxvd2VkRXZlbnQo
KQoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICBOUEV2ZW50
IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfRnVsbFNjcmVlblJlYWR5RXZlbnQ7Cisg
ICAgbnBFdmVudC5kYXRhID0gMDsKKworICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0
YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkgeworICAgICAgICBmcmFtZVZpZXctPmhv
c3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmRpZFBsdWdpbkVudGVyRnVsbFNjcmVl
bih0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpOworCisgICAg
ICAgIGlmICghZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpKQorICAgICAgICAgICAgZnJhbWVWaWV3
LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5kaWRQbHVnaW5FeGl0RnVsbFNj
cmVlbih0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuID0gdHJ1ZTsK
KyAgICB9Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlRnVsbFNjcmVlbkV4aXRFdmVudCgp
Cit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIE5QRXZlbnQg
bnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9GdWxsU2NyZWVuRXhpdEV2ZW50OworICAg
IG5wRXZlbnQuZGF0YSA9IDA7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7CisKKyAg
ICBpZiAoRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJl
bnQoKSkpCisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGll
bnQoKS0+ZGlkUGx1Z2luRXhpdEZ1bGxTY3JlZW4odGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVu
aXF1ZVByZWZpeC5jX3N0cigpKTsKKworICAgIG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4gPSBm
YWxzZTsKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlSWRs
ZUV2ZW50KGJvb2wgZW50ZXJJZGxlKQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2
ZW50LmRhdGEgPSAwOworCisgICAgaWYgKGVudGVySWRsZSkKKyAgICAgICAgbnBFdmVudC50eXBl
ID0gTlBfRW50ZXJJZGxlRXZlbnQ7CisgICAgZWxzZQorICAgICAgICBucEV2ZW50LnR5cGUgPSBO
UF9FeGl0SWRsZUV2ZW50OworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCisK
K3ZvaWQgUGx1Z2luVmlldzo6aGFuZGxlQXBwQWN0aXZhdGVkRXZlbnQoKQoreworICAgIE5QRXZl
bnQgbnBFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAwOworICAgIG5wRXZlbnQudHlwZSA9IE5Q
X0FwcEFjdGl2YXRlZEV2ZW50OworCisgICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQor
Cit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUFwcERlYWN0aXZhdGVkRXZlbnQoKQoreworICAgIGlm
ICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBQbHVnaW4gd2FudHMgdG8g
a25vdyB0aGF0IGl0IGhhcyB0byBleGl0IGZ1bGxzY3JlZW4gb24gZGVhY3RpdmF0aW9uLgorICAg
IGlmIChtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuKQorICAgICAgICBoYW5kbGVGdWxsU2NyZWVu
RXhpdEV2ZW50KCk7CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0g
MDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9BcHBEZWFjdGl2YXRlZEV2ZW50OworCisgICAgZGlz
cGF0Y2hOUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFBsdWdpblZpZXc6OmhhbmRsZUFwcFN0
YW5kYnlFdmVudCgpCit7CisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHNlbmQgYW4gUU5QX0Fw
cFN0YW5kYnlFdmVudAorICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAw
OworICAgIG5wRXZlbnQudHlwZSA9IE5QX0FwcFN0YW5kQnlFdmVudDsKKworICAgIGRpc3BhdGNo
TlBFdmVudChucEV2ZW50KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVPcmllbnRhdGlv
bkV2ZW50KGludCBhbmdsZSkKK3sKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50
eXBlID0gTlBfT3JpZW50YXRpb25FdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAodm9pZCopYW5n
bGU7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmll
dzo6aGFuZGxlU3dpcGVFdmVudCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJl
dHVybjsKKworICAgIC8vIFBsdWdpbiBvbmx5IHdhbnRzIHRvIGtub3cgdGhhdCBpdCBoYXMgdG8g
ZXhpdCBmdWxsc2NyZWVuLgorICAgIGlmIChtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuKQorICAg
ICAgICBoYW5kbGVGdWxsU2NyZWVuRXhpdEV2ZW50KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6
aGFuZGxlU2NyZWVuUG93ZXJFdmVudChib29sIHBvd2VyZWQpCit7CisgICAgTlBFdmVudCBucEV2
ZW50OworICAgIG5wRXZlbnQuZGF0YSA9IDA7CisKKyAgICBpZiAocG93ZXJlZCkKKyAgICAgICAg
bnBFdmVudC50eXBlID0gTlBfU2NyZWVuUG93ZXJVcEV2ZW50OworICAgIGVsc2UKKyAgICAgICAg
bnBFdmVudC50eXBlID0gTlBfU2NyZWVuUG93ZXJEb3duRXZlbnQ7CisKKyAgICBkaXNwYXRjaE5Q
RXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0UGFyZW50KFNjcm9sbFZp
ZXcqIHBhcmVudFdpZGdldCkKK3sKKyAgICAvLyBJZiBwYXJlbnRXaWRnZXQgaXMgMCwgbGV0cyB1
bnJlZ2lzdGVyIHRoZSBwbHVnaW4gd2l0aCB0aGUgY3VycmVudCBwYXJlbnQuCisgICAgaWYgKG1f
cHJpdmF0ZSAmJiAoIXBhcmVudFdpZGdldCB8fCBwYXJlbnRXaWRnZXQgIT0gcGFyZW50KCkpKSB7
CisgICAgICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmll
dyo+KHBhcmVudCgpKSkgeworICAgICAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0JhY2tncm91
bmRQbGF5aW5nKQorICAgICAgICAgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0
Zm9ybVBhZ2VDbGllbnQoKS0+b25QbHVnaW5TdG9wQmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2
YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKKworICAgICAgICAgICAgaWYgKG1f
cHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAgICAgICAgICAgICAgaGFuZGxlRnVsbFNjcmVl
bkV4aXRFdmVudCgpOworCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdW5sb2NrIHRoZSBpZGxl
IChpZiB3ZSBoYXZlIGxvY2tlZCBpdCkuCisgICAgICAgICAgICBtX3ByaXZhdGUtPnByZXZlbnRJ
ZGxlKGZhbHNlKTsKKworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHJlbGVhc2UgYW55IGtlZXBW
aXNpYmxlUmVjdHMgaWYgdGhleSB3ZXJlIHNldC4KKyAgICAgICAgICAgIG1fcHJpdmF0ZS0+Y2xl
YXJWaXNpYmxlUmVjdHMoKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAg
ICAgICAgICAgIC8vIElmIHdlIGhhZCBhIGhvbGUgcHVuY2ggcmVjdCBzZXQsIGNsZWFyIGl0Lgor
ICAgICAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9wbGF0Zm9ybUxheWVyICYmICFtX3ByaXZhdGUt
Pm1faG9sZVB1bmNoUmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgbV9wcml2YXRlLT5t
X3BsYXRmb3JtTGF5ZXItPnNldEhvbGVQdW5jaFJlY3QoSW50UmVjdCgpKTsKKyNlbmRpZgorICAg
ICAgICAgICAgZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5y
ZWdpc3RlclBsdWdpbih0aGlzLCBmYWxzZSAvKnNob3VsZFJlZ2lzdGVyKi8pOworICAgICAgICB9
CisgICAgfQorCisgICAgV2lkZ2V0OjpzZXRQYXJlbnQocGFyZW50V2lkZ2V0KTsKKworICAgIGlm
IChwYXJlbnRXaWRnZXQpIHsKKyAgICAgICAgaW5pdCgpOworCisgICAgICAgIEZyYW1lVmlldyog
ZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50V2lkZ2V0KTsKKworICAg
ICAgICBpZiAoZnJhbWVWaWV3ICYmIG1fcHJpdmF0ZSkgeworICAgICAgICAgICAgZnJhbWVWaWV3
LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5yZWdpc3RlclBsdWdpbih0aGlz
LCB0cnVlIC8qc2hvdWxkUmVnaXN0ZXIqLyk7CisgICAgICAgICAgICBpZiAoZnJhbWVWaWV3LT5m
cmFtZSgpCisgICAgICAgICAgICAgICAmJiBmcmFtZVZpZXctPmZyYW1lKCktPmxvYWRlcigpCisg
ICAgICAgICAgICAgICAmJiBmcmFtZVZpZXctPmZyYW1lKCktPmxvYWRlcigpLT5mcmFtZUhhc0xv
YWRlZCgpKQorICAgICAgICAgICAgICAgIGhhbmRsZU9uTG9hZEV2ZW50KCk7CisKKyAgICAgICAg
ICAgIGlmIChtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZykKKyAgICAgICAgICAgICAg
ICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPm9uUGx1Z2lu
U3RhcnRCYWNrZ3JvdW5kUGxheSh0aGlzLCBtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4
LmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFBsdWdpblZpZXc6OnNldE5Q
V2luZG93UmVjdChjb25zdCBJbnRSZWN0JikKK3sKKyAgICBzZXROUFdpbmRvd0lmTmVlZGVkKCk7
Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0TlBXaW5kb3dJZk5lZWRlZCgpCit7CisgICAgaWYg
KCFtX3ByaXZhdGUgfHwgIW1faXNTdGFydGVkIHx8ICFwYXJlbnQoKSB8fCAhbV9wbHVnaW4tPnBs
dWdpbkZ1bmNzKCktPnNldHdpbmRvdykKKyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWVWaWV3
KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7CisgICAgaWYg
KCFmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmlzQWN0aXZl
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIElmIHRoZSBwbHVnaW4gZGlkbid0IGxvYWQg
c3VjZXNzZnVsbHksIG5vIHBvaW50IGluIGNhbGxpbmcgc2V0d2luZG93CisgICAgaWYgKG1fc3Rh
dHVzICE9IFBsdWdpblN0YXR1c0xvYWRlZFN1Y2Nlc3NmdWxseSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmICghbV9wcml2YXRlLT5tX2hhc1BlbmRpbmdHZW9tZXRyeUNoYW5nZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV9wcml2YXRlLT5tX2hhc1BlbmRpbmdHZW9tZXRyeUNoYW5nZSA9IGZh
bHNlOworCisgICAgbV9ucFdpbmRvdy54ID0gbV93aW5kb3dSZWN0LngoKTsKKyAgICBtX25wV2lu
ZG93LnkgPSBtX3dpbmRvd1JlY3QueSgpOworCisgICAgbV9ucFdpbmRvdy5jbGlwUmVjdC5sZWZ0
ID0gbWF4KDAsIG1fY2xpcFJlY3QueCgpKTsKKyAgICBtX25wV2luZG93LmNsaXBSZWN0LnRvcCA9
IG1heCgwLCBtX2NsaXBSZWN0LnkoKSk7CisgICAgbV9ucFdpbmRvdy5jbGlwUmVjdC5yaWdodCA9
IG1heCgwLCBtX2NsaXBSZWN0Lm1heFgoKSk7CisgICAgbV9ucFdpbmRvdy5jbGlwUmVjdC5ib3R0
b20gPSBtYXgoMCwgbV9jbGlwUmVjdC5tYXhZKCkpOworCisgICAgaWYgKG1fcGx1Z2luLT5xdWly
a3MoKS5jb250YWlucyhQbHVnaW5RdWlya0RvbnRDYWxsU2V0V2luZG93TW9yZVRoYW5PbmNlKSkg
eworICAgICAgICAvLyBPbmx5IHNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGx1Z2lu
IGNvbnRlbnQgdGhlIGZpcnN0IHRpbWUgc2V0TlBXaW5kb3coKSBpcyBjYWxsZWQKKyAgICAgICAg
Ly8gc28gYXMgdG8gd29ya2Fyb3VuZCBhbiBpc3N1ZSBpbiBGbGFzaCB3aGVyZSBtdWx0aXBsZSBj
YWxscyB0byBzZXROUFdpbmRvdygpIGNhdXNlIHRoZSBwbHVnaW4KKyAgICAgICAgLy8gdG8gY3Jh
c2ggaW4gd2luZG93ZWQgbW9kZS4KKyAgICAgICAgaWYgKCFtX2lzV2luZG93ZWQgfHwgbV9ucFdp
bmRvdy53aWR0aCA9PSBVbmluaXRpYWxpemVkQ29vcmRpbmF0ZSB8fCBtX25wV2luZG93LmhlaWdo
dCA9PSBVbmluaXRpYWxpemVkQ29vcmRpbmF0ZSkgeworICAgICAgICAgICAgbV9ucFdpbmRvdy53
aWR0aCA9IG1fd2luZG93UmVjdC53aWR0aCgpOworICAgICAgICAgICAgbV9ucFdpbmRvdy5oZWln
aHQgPSBtX3dpbmRvd1JlY3QuaGVpZ2h0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAg
ICAgICBtX25wV2luZG93LndpZHRoID0gbV93aW5kb3dSZWN0LndpZHRoKCk7CisgICAgICAgIG1f
bnBXaW5kb3cuaGVpZ2h0ID0gbV93aW5kb3dSZWN0LmhlaWdodCgpOworICAgIH0KKworICAgIG1f
bnBXaW5kb3cudHlwZSA9IE5QV2luZG93VHlwZURyYXdhYmxlOworCisgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3cqIHdpbmRvdyA9IGZyYW1lVmlldy0+aG9zdFdpbmRv
dygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+cGxhdGZvcm1XaW5kb3coKTsKKyAgICBpZiAod2lu
ZG93KQorICAgICAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3Nf
aW5mbyktPndpbmRvd0dyb3VwID0gd2luZG93LT53aW5kb3dHcm91cCgpOworCisgICAgUGx1Z2lu
Vmlldzo6c2V0Q3VycmVudFBsdWdpblZpZXcodGhpcyk7CisgICAgSlNDOjpKU0xvY2s6OkRyb3BB
bGxMb2NrcyBkcm9wQWxsTG9ja3MoSlNDOjpTaWxlbmNlQXNzZXJ0aW9uc09ubHkpOworICAgIHNl
dENhbGxpbmdQbHVnaW4odHJ1ZSk7CisKKyAgICAvLyBGSVhNRTogUGFzc2luZyB6b29tRmFjdG9y
IHRvIHNldHdpbmRvdyBtYWtlIHdpbmRvd2VkIHBsdWdpbiBzY2FsZSBpbmNvcnJlY3RseS4KKyAg
ICAvLyBIYW5kbGluZyB0aGUgem9vbSBmYWN0b3IgcHJvcGVybHkgaW4gdGhlIHBsdWdpbiBzaWRl
IG1heSBiZSBhIGJldHRlciBzb2x1dGlvbi4KKyAgICBkb3VibGUgb2xkWm9vbUZhY3RvciA9ICgo
TlBTZXRXaW5kb3dDYWxsYmFja1N0cnVjdCopbV9ucFdpbmRvdy53c19pbmZvKS0+em9vbUZhY3Rv
cjsKKyAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbykt
Pnpvb21GYWN0b3IgPSAxLjsKKyAgICBtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+c2V0d2luZG93
KG1faW5zdGFuY2UsICZtX25wV2luZG93KTsKKyAgICAoKE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1
Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21GYWN0b3IgPSBvbGRab29tRmFjdG9yOworCisg
ICAgc2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7CisgICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBs
dWdpblZpZXcoMCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0UGFyZW50VmlzaWJsZShib29s
IHZpc2libGUpCit7CisgICAgaWYgKGlzUGFyZW50VmlzaWJsZSgpID09IHZpc2libGUpCisgICAg
ICAgIHJldHVybjsKKworICAgIFdpZGdldDo6c2V0UGFyZW50VmlzaWJsZSh2aXNpYmxlKTsKKwor
ICAgIC8vIEZJWE1FOiBXZSBtaWdodCB3YW50IHRvIHRlbGwgdGhlIHBsdWdpbiB0byBoaWRlIGl0
J3Mgd2luZG93IGhlcmUsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlcgorICAgIC8vIHNpbmNlIHRoZSB3
aW5kb3cgbWFuYWdlciBzaG91bGQgdGFrZSBjYXJlIG9mIHRoYXQgZm9yIHVzLgorfQorCitOUEVy
cm9yIFBsdWdpblZpZXc6OmhhbmRsZVBvc3RSZWFkRmlsZShWZWN0b3I8Y2hhcj4mIGJ1ZmZlciwg
dWludDMyX3QgbGVuLCBjb25zdCBjaGFyKiBidWYpCit7CisgICAgU3RyaW5nIGZpbGVuYW1lKGJ1
ZiwgbGVuKTsKKworICAgIGlmIChmaWxlbmFtZS5zdGFydHNXaXRoKCJmaWxlOi8vLyIpKQorICAg
ICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyg4KTsKKworICAgIGxvbmcgbG9uZyBz
aXplOworICAgIGlmICghZ2V0RmlsZVNpemUoZmlsZW5hbWUsIHNpemUpKQorICAgICAgICByZXR1
cm4gTlBFUlJfRklMRV9OT1RfRk9VTkQ7CisKKyAgICBGSUxFKiBmaWxlSGFuZGxlID0gZm9wZW4o
ZmlsZW5hbWUudXRmOCgpLmRhdGEoKSwgInIiKTsKKyAgICBpZiAoIWZpbGVIYW5kbGUpCisgICAg
ICAgIHJldHVybiBOUEVSUl9GSUxFX05PVF9GT1VORDsKKworICAgIGJ1ZmZlci5yZXNpemUoc2l6
ZSk7CisgICAgaW50IGJ5dGVzUmVhZCA9IGZyZWFkKGJ1ZmZlci5kYXRhKCksIDEsIHNpemUsIGZp
bGVIYW5kbGUpOworCisgICAgZmNsb3NlKGZpbGVIYW5kbGUpOworCisgICAgaWYgKGJ5dGVzUmVh
ZCA8PSAwKQorICAgICAgICByZXR1cm4gTlBFUlJfRklMRV9OT1RfRk9VTkQ7CisKKyAgICByZXR1
cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK2Jvb2wgUGx1Z2luVmlldzo6cGxhdGZvcm1HZXRWYWx1
ZVN0YXRpYyhOUE5WYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCogdmFsdWUsIE5QRXJyb3IqIHJlc3Vs
dCkKK3sKKyAgICBzd2l0Y2ggKHZhcmlhYmxlKSB7CisgICAgY2FzZSBOUE5WVG9vbGtpdDoKKyAg
ICAgICAgKnN0YXRpY19jYXN0PHVpbnQzMl90Kj4odmFsdWUpID0gMDsKKyAgICAgICAgKnJlc3Vs
dCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgTlBO
VlN1cHBvcnRzWEVtYmVkQm9vbDoKKyAgICAgICAgKnN0YXRpY19jYXN0PE5QQm9vbCo+KHZhbHVl
KSA9IHRydWU7CisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgcmV0
dXJuIHRydWU7CisKKyAgICBjYXNlIE5QTlZqYXZhc2NyaXB0RW5hYmxlZEJvb2w6CisgICAgICAg
ICpzdGF0aWNfY2FzdDxOUEJvb2wqPih2YWx1ZSkgPSB0cnVlOworICAgICAgICAqcmVzdWx0ID0g
TlBFUlJfTk9fRVJST1I7CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBOUE5WU3Vw
cG9ydHNXaW5kb3dsZXNzOgorICAgICAgICAqc3RhdGljX2Nhc3Q8TlBCb29sKj4odmFsdWUpID0g
dHJ1ZTsKKyAgICAgICAgKnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICByZXR1cm4g
dHJ1ZTsKKworICAgIGNhc2UgTlBOVk5QQ2FsbGJhY2tzUHRyOgorICAgICAgICAqKCh2b2lkICoq
KSB2YWx1ZSkgPSAodm9pZCopJnNfTnBDYWxsYmFja3M7CisgICAgICAgICpyZXN1bHQgPSBOUEVS
Ul9OT19FUlJPUjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIE5QTlZ4RGlzcGxh
eToKKyAgICBjYXNlIE5QTlZ4dEFwcENvbnRleHQ6CisgICAgY2FzZSBOUE5WbmV0c2NhcGVXaW5k
b3c6CisgICAgY2FzZSBOUE5WYXNkRW5hYmxlZEJvb2w6CisgICAgY2FzZSBOUE5WaXNPZmZsaW5l
Qm9vbDoKKyAgICBjYXNlIE5QTlZzZXJ2aWNlTWFuYWdlcjoKKyAgICBjYXNlIE5QTlZET01FbGVt
ZW50OgorICAgIGNhc2UgTlBOVkRPTVdpbmRvdzoKKyAgICBjYXNlIE5QTlZXaW5kb3dOUE9iamVj
dDoKKyAgICBjYXNlIE5QTlZQbHVnaW5FbGVtZW50TlBPYmplY3Q6CisgICAgY2FzZSBOUE5WcHJp
dmF0ZU1vZGVCb29sOgorICAgIGNhc2UgTlBOVlpvb21GYWN0b3I6CisgICAgY2FzZSBOUE5WUm9v
dFdpbmRvd0dyb3VwOgorICAgIGNhc2UgTlBOVkJyb3dzZXJXaW5kb3dHcm91cDoKKyAgICBjYXNl
IE5QTlZCcm93c2VyRGlzcGxheUNvbnRleHQ6CisgICAgY2FzZSBOUE5WUGx1Z2luV2luZG93UHJl
Zml4OgorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9v
bCBQbHVnaW5WaWV3OjpwbGF0Zm9ybUdldFZhbHVlKE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lk
KiB2YWx1ZSwgTlBFcnJvciogcmVzdWx0KQoreworICAgIHN3aXRjaCAodmFyaWFibGUpIHsKKyAg
ICBjYXNlIE5QTlZab29tRmFjdG9yOgorICAgICAgICAqKHN0YXRpY19jYXN0PHZvaWQqKj4odmFs
dWUpKSA9IHN0YXRpY19jYXN0PHZvaWQqPigmKChzdGF0aWNfY2FzdDxOUFNldFdpbmRvd0NhbGxi
YWNrU3RydWN0Kj4obV9ucFdpbmRvdy53c19pbmZvKSkpLT56b29tRmFjdG9yKTsKKyAgICAgICAg
KnJlc3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNh
c2UgTlBOVlJvb3RXaW5kb3dHcm91cDogeworICAgICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9
IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKTsKKyAgICAgICAgaWYgKGZyYW1lVmll
dykgeworICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3cg
KndpbmRvdyA9IGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+
cGxhdGZvcm1XaW5kb3coKTsKKyAgICAgICAgICAgIGlmICh3aW5kb3cpIHsKKyAgICAgICAgICAg
ICAgICB2b2lkKiogdGVtcFZhbHVlID0gc3RhdGljX2Nhc3Q8dm9pZCoqPih2YWx1ZSk7CisgICAg
ICAgICAgICAgICAgKnRlbXBWYWx1ZSA9ICh2b2lkKil3aW5kb3ctPnJvb3RHcm91cCgpOworCisg
ICAgICAgICAgICAgICAgaWYgKCp0ZW1wVmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgKnJl
c3VsdCA9IE5QRVJSX05PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKnJl
c3VsdCA9IE5QRVJSX0dFTkVSSUNfRVJST1I7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICBjYXNlIE5QTlZCcm93c2VyV2luZG93R3JvdXA6IHsKKyAgICAgICAgRnJhbWVWaWV3
KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSk7CisgICAgICAg
IGlmIChmcmFtZVZpZXcpIHsKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6V2luZG93KiB3aW5kb3cgPSBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1Q
YWdlQ2xpZW50KCktPnBsYXRmb3JtV2luZG93KCk7CisgICAgICAgICAgICBpZiAod2luZG93KSB7
CisgICAgICAgICAgICAgICAgdm9pZCoqIHRlbXBWYWx1ZSA9IHN0YXRpY19jYXN0PHZvaWQqKj4o
dmFsdWUpOworICAgICAgICAgICAgICAgICp0ZW1wVmFsdWUgPSByZWludGVycHJldF9jYXN0PHZv
aWQqPihjb25zdF9jYXN0PGNoYXIqPih3aW5kb3ctPndpbmRvd0dyb3VwKCkpKTsKKworICAgICAg
ICAgICAgICAgIGlmICgqdGVtcFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICpyZXN1bHQg
PSBOUEVSUl9OT19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpyZXN1bHQg
PSBOUEVSUl9HRU5FUklDX0VSUk9SOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgY2FzZSBOUE5WQnJvd3NlckRpc3BsYXlDb250ZXh0OiB7CisgICAgICAgIEZyYW1lVmlldyog
ZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpOworICAgICAgICBp
ZiAoZnJhbWVWaWV3KSB7CisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhp
Y3M6OlBsYXRmb3JtRGlzcGxheUNvbnRleHRIYW5kbGUgY29udGV4dCA9IEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpHcmFwaGljczo6cGxhdGZvcm1EaXNwbGF5Q29udGV4dCgpOworICAgICAgICAgICAg
aWYgKGNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICB2b2lkKiogdGVtcFZhbHVlID0gc3RhdGlj
X2Nhc3Q8dm9pZCoqPih2YWx1ZSk7CisgICAgICAgICAgICAgICAgKnRlbXBWYWx1ZSA9IHN0YXRp
Y19jYXN0PHZvaWQqPihjb250ZXh0KTsKKworICAgICAgICAgICAgICAgIGlmICgqdGVtcFZhbHVl
KSB7CisgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBOUEVSUl9OT19FUlJPUjsKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICAgICpyZXN1bHQgPSBOUEVSUl9HRU5FUklDX0VSUk9SOwor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY2FzZSBOUE5WUGx1Z2luV2luZG93
UHJlZml4OiB7CisgICAgICAgIHZvaWQqKiB0ZW1wVmFsdWUgPSBzdGF0aWNfY2FzdDx2b2lkKio+
KHZhbHVlKTsKKyAgICAgICAgKnRlbXBWYWx1ZSA9IHN0YXRpY19jYXN0PHZvaWQqPihjb25zdF9j
YXN0PGNoYXIqPihtX3ByaXZhdGUtPm1fcGx1Z2luVW5pcXVlUHJlZml4LmNfc3RyKCkpKTsKKwor
ICAgICAgICBpZiAoKnRlbXBWYWx1ZSkgeworICAgICAgICAgICAgKnJlc3VsdCA9IE5QRVJSX05P
X0VSUk9SOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgKnJl
c3VsdCA9IE5QRVJSX0dFTkVSSUNfRVJST1I7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICBjYXNlIE5QTlZ4RGlzcGxheToKKyAgICBjYXNlIE5QTlZ4dEFwcENvbnRleHQ6Cisg
ICAgY2FzZSBOUE5WbmV0c2NhcGVXaW5kb3c6CisgICAgY2FzZSBOUE5WamF2YXNjcmlwdEVuYWJs
ZWRCb29sOgorICAgIGNhc2UgTlBOVmFzZEVuYWJsZWRCb29sOgorICAgIGNhc2UgTlBOVmlzT2Zm
bGluZUJvb2w6CisgICAgY2FzZSBOUE5Wc2VydmljZU1hbmFnZXI6CisgICAgY2FzZSBOUE5WRE9N
RWxlbWVudDoKKyAgICBjYXNlIE5QTlZET01XaW5kb3c6CisgICAgY2FzZSBOUE5WVG9vbGtpdDoK
KyAgICBjYXNlIE5QTlZTdXBwb3J0c1hFbWJlZEJvb2w6CisgICAgY2FzZSBOUE5WV2luZG93TlBP
YmplY3Q6CisgICAgY2FzZSBOUE5WUGx1Z2luRWxlbWVudE5QT2JqZWN0OgorICAgIGNhc2UgTlBO
VlN1cHBvcnRzV2luZG93bGVzczoKKyAgICBjYXNlIE5QTlZwcml2YXRlTW9kZUJvb2w6CisgICAg
Y2FzZSBOUE5WTlBDYWxsYmFja3NQdHI6CisgICAgICAgIHJldHVybiBwbGF0Zm9ybUdldFZhbHVl
U3RhdGljKHZhcmlhYmxlLCB2YWx1ZSwgcmVzdWx0KTsKKworICAgIGRlZmF1bHQ6CisgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQor
CisvLyBUaGlzIGlzIGEgcHVyZSB2aXJ0dWFsIGluaGVyaXRlZCBmcm9tIFdpZGdldCBjbGFzcyBh
bmQgYWxsIGludmFsaWRhdGVzCisvLyBhcmUgZnVubmVsZWQgdGhyb3VnaCB0aGlzIG1ldGhvZC4g
V2UgZm9yd2FyZCB0aGVtIG9uIHRvIGVpdGhlciB0aGUKKy8vIGNvbXBvc2l0aW5nIGxheWVyIG9y
IHRoZSBQbHVnaW5WaWV3OjppbnZhbGlkYXRlV2luZG93bGVzc1BsdWdpblJlY3QgbWV0aG9kLgor
dm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQorewor
ICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBSZWNvcmQgdGhl
IHJlZ2lvbiB0aGF0IHdlJ3ZlIGJlZW4gYXNrZWQgdG8gaW52YWxpZGF0ZQorICAgIG1fcHJpdmF0
ZS0+bV9pbnZhbGlkYXRlUmVnaW9uID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3RSZWdp
b246OnVuaW9uUmVnaW9ucyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdChyZWN0KSwgbV9w
cml2YXRlLT5tX2ludmFsaWRhdGVSZWdpb24pOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorICAgIGlmIChtX3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllcikgeworICAgICAgICBt
X3ByaXZhdGUtPm1fcGxhdGZvcm1MYXllci0+c2V0TmVlZHNEaXNwbGF5KCk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIGludmFsaWRhdGVXaW5kb3dsZXNzUGx1Z2luUmVj
dChyZWN0KTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVjdChOUFJlY3QqIHJl
Y3QpCit7CisgICAgaWYgKCFyZWN0KSB7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBpbnZhbGlkYXRlUmVjdChJbnRSZWN0KHJlY3QtPmxlZnQsIHJl
Y3QtPnRvcCwgcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSByZWN0LT50
b3ApKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVnaW9uKE5QUmVnaW9uIHJl
Z2lvbikKK3sKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6Zm9yY2VS
ZWRyYXcoKQoreworICAgIGludmFsaWRhdGUoKTsKK30KKworYm9vbCBQbHVnaW5WaWV3OjpwbGF0
Zm9ybVN0YXJ0KCkKK3sKKyAgICBBU1NFUlQobV9pc1N0YXJ0ZWQpOworICAgIEFTU0VSVChtX3N0
YXR1cyA9PSBQbHVnaW5TdGF0dXNMb2FkZWRTdWNjZXNzZnVsbHkpOworCisgICAgbV9wcml2YXRl
ID0gbmV3IFBsdWdpblZpZXdQcml2YXRlKHRoaXMpOworCisgICAgaWYgKG1fcGx1Z2luLT5wbHVn
aW5GdW5jcygpLT5nZXR2YWx1ZSkgeworICAgICAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1
Z2luVmlldyh0aGlzKTsKKyAgICAgICAgSlNDOjpKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxs
TG9ja3MoSlNDOjpTaWxlbmNlQXNzZXJ0aW9uc09ubHkpOworICAgICAgICBzZXRDYWxsaW5nUGx1
Z2luKHRydWUpOworICAgICAgICBtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0dmFsdWUobV9p
bnN0YW5jZSwgTlBQVnBsdWdpbk5lZWRzWEVtYmVkLCAmbV9uZWVkc1hFbWJlZCk7CisgICAgICAg
IHNldENhbGxpbmdQbHVnaW4oZmFsc2UpOworICAgICAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50
UGx1Z2luVmlldygwKTsKKyAgICB9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisgICAgaWYgKG1fcGFyZW50RnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpLT5hbGxv
d3NBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkKKyAgICAgICAgJiYgbV9wYXJlbnRGcmFtZS0+cGFn
ZSgpLT5zZXR0aW5ncygpCisgICAgICAgICYmIG1fcGFyZW50RnJhbWUtPnBhZ2UoKS0+c2V0dGlu
Z3MoKS0+YWNjZWxlcmF0ZWRDb21wb3NpdGluZ0VuYWJsZWQoKSkgeworICAgICAgICBtX3ByaXZh
dGUtPm1fcGxhdGZvcm1MYXllciA9IFBsdWdpbkxheWVyV2ViS2l0VGhyZWFkOjpjcmVhdGUodGhp
cyk7CisgICAgICAgIC8vIFRyaWdnZXIgbGF5ZXIgY29tcHV0YXRpb24gaW4gUmVuZGVyTGF5ZXJD
b21wb3NpdG9yCisgICAgICAgIG1fZWxlbWVudC0+c2V0TmVlZHNTdHlsZVJlY2FsYyhTeW50aGV0
aWNTdHlsZUNoYW5nZSk7CisgICAgfQorI2VuZGlmCisKKyAgICBtX25wV2luZG93LnR5cGUgPSBO
UFdpbmRvd1R5cGVEcmF3YWJsZTsKKyAgICBtX25wV2luZG93LndpbmRvdyA9IDA7IC8vIE5vdCB1
c2VkPworICAgIG1fbnBXaW5kb3cueCA9IDA7CisgICAgbV9ucFdpbmRvdy55ID0gMDsKKyAgICBt
X25wV2luZG93LndpZHRoID0gVW5pbml0aWFsaXplZENvb3JkaW5hdGU7CisgICAgbV9ucFdpbmRv
dy5oZWlnaHQgPSBVbmluaXRpYWxpemVkQ29vcmRpbmF0ZTsKKyAgICBtX25wV2luZG93LndzX2lu
Zm8gPSBuZXcgTlBTZXRXaW5kb3dDYWxsYmFja1N0cnVjdDsKKyAgICAoKE5QU2V0V2luZG93Q2Fs
bGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPnpvb21GYWN0b3IgPSAxLjsKKyAgICAo
KE5QU2V0V2luZG93Q2FsbGJhY2tTdHJ1Y3QqKW1fbnBXaW5kb3cud3NfaW5mbyktPndpbmRvd0dy
b3VwID0gMDsKKworICAgIHNob3coKTsKKworICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9
IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkKKyAgICAgICAgaGFuZGxlT3JpZW50
YXRpb25FdmVudChmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCkt
Pm9yaWVudGF0aW9uKCkpOworCisgICAgaWYgKCEobV9wbHVnaW4tPnF1aXJrcygpLmNvbnRhaW5z
KFBsdWdpblF1aXJrRGVmZXJGaXJzdFNldFdpbmRvd0NhbGwpKSkgeworICAgICAgICB1cGRhdGVQ
bHVnaW5XaWRnZXQoKTsKKyAgICAgICAgc2V0TlBXaW5kb3dJZk5lZWRlZCgpOworICAgIH0KKwor
ICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFBsdWdpblZpZXc6OnBsYXRmb3JtRGVzdHJveSgp
Cit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMg
d2lsbCB1bmxvY2sgdGhlIGlkbGUgKGlmIHdlIGhhdmUgbG9ja2VkIGl0KS4KKyAgICBtX3ByaXZh
dGUtPnByZXZlbnRJZGxlKGZhbHNlKTsKKworICAgIC8vIFRoaXMgd2lsbCByZWxlYXNlIGFueSBr
ZWVwVmlzaWJsZVJlY3RzIGlmIHRoZXkgd2VyZSBzZXQuCisgICAgbV9wcml2YXRlLT5jbGVhclZp
c2libGVSZWN0cygpOworCisgICAgLy8gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHdlIHVucmVnaXN0
ZXJlZCB0aGUgcGx1Z2luLgorICAgIGlmIChGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19j
YXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKSkgeworICAgICAgICBpZiAobV9wcml2YXRlLT5tX2lz
QmFja2dyb3VuZFBsYXlpbmcpCisgICAgICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+
cGxhdGZvcm1QYWdlQ2xpZW50KCktPm9uUGx1Z2luU3RvcEJhY2tncm91bmRQbGF5KHRoaXMsIG1f
cHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19zdHIoKSk7CisKKyAgICAgICAgLy8gSWYg
d2Ugd2VyZSBzdGlsbCBmdWxsc2NyZWVuLCBlbnN1cmUgd2Ugbm90aWZ5IGV2ZXJ5b25lIHdlJ3Jl
IG5vdC4KKyAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9pc0Z1bGxTY3JlZW4pCisgICAgICAgICAg
ICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCktPmRpZFBsdWdp
bkV4aXRGdWxsU2NyZWVuKHRoaXMsIG1fcHJpdmF0ZS0+bV9wbHVnaW5VbmlxdWVQcmVmaXguY19z
dHIoKSk7CisKKyAgICAgICAgaWYgKG1fcHJpdmF0ZS0+bV9vcmllbnRhdGlvbkxvY2tlZCkKKyAg
ICAgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0Zm9ybVBhZ2VDbGllbnQoKS0+
dW5sb2NrT3JpZW50YXRpb24oKTsKKworICAgICAgICBmcmFtZVZpZXctPmhvc3RXaW5kb3coKS0+
cGxhdGZvcm1QYWdlQ2xpZW50KCktPnJlZ2lzdGVyUGx1Z2luKHRoaXMsIGZhbHNlIC8qc2hvdWxk
UmVnaXN0ZXIqLyk7CisgICAgfQorCisgICAgbV9wcml2YXRlLT5tX2lzQmFja2dyb3VuZFBsYXlp
bmcgPSBmYWxzZTsKKyAgICBtX3ByaXZhdGUtPm1faXNGdWxsU2NyZWVuID0gZmFsc2U7CisKKyAg
ICBkZWxldGUgbV9wcml2YXRlOworICAgIG1fcHJpdmF0ZSA9IDA7Cit9CisKK3ZvaWQgUGx1Z2lu
Vmlldzo6aGFsdCgpCit7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6cmVzdGFydCgpCit7Cit9CisK
K3ZvaWQgUGx1Z2luVmlldzo6Z2V0V2luZG93SW5mbyhWZWN0b3I8UGx1Z2luV2luZG93SW5mbz4m
IHdpbmRvd0xpc3QpCit7CisgICAgaWYgKCFtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0dmFs
dWUpCisgICAgICAgIHJldHVybjsKKworICAgIHZvaWQqIHZhbFB0ciA9IDA7CisKKyAgICBQbHVn
aW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldyh0aGlzKTsKKyAgICBKU0M6OkpTTG9jazo6RHJv
cEFsbExvY2tzIGRyb3BBbGxMb2NrcyhKU0M6OlNpbGVuY2VBc3NlcnRpb25zT25seSk7CisgICAg
c2V0Q2FsbGluZ1BsdWdpbih0cnVlKTsKKyAgICBtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0
dmFsdWUobV9pbnN0YW5jZSwgTlBQVnBsdWdpblNjcmVlbldpbmRvdywgJnZhbFB0cik7CisgICAg
c2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7CisgICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBsdWdp
blZpZXcoMCk7CisKKyAgICBpZiAoIXZhbFB0cikKKyAgICAgICAgcmV0dXJuOworCisgICAgTlBT
Y3JlZW5XaW5kb3dIYW5kbGVzKiBzY3JlZW5XaW5IYW5kbGVzID0gc3RhdGljX2Nhc3Q8TlBTY3Jl
ZW5XaW5kb3dIYW5kbGVzKj4odmFsUHRyKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2Ny
ZWVuV2luSGFuZGxlcy0+bnVtT2ZXaW5kb3dzOyBpKyspIHsKKyAgICAgICAgUGx1Z2luV2luZG93
SW5mbyBpbmZvOworICAgICAgICBpbmZvLndpbmRvd1B0ciA9IHNjcmVlbldpbkhhbmRsZXMtPndp
bmRvd0hhbmRsZXNbaV07CisKKyAgICAgICAgTlBSZWN0KiByYyA9IHNjcmVlbldpbkhhbmRsZXMt
PndpbmRvd1JlY3RzW2ldOworICAgICAgICBpbmZvLndpbmRvd1JlY3QgPSBJbnRSZWN0KHJjLT5s
ZWZ0LCByYy0+dG9wLCByYy0+cmlnaHQgLSByYy0+bGVmdCwgcmMtPmJvdHRvbSAtIHJjLT50b3Ap
OworCisgICAgICAgIHdpbmRvd0xpc3QuYXBwZW5kKGluZm8pOworICAgIH0KK30KKworQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIFBsdWdpblZpZXc6OmxvY2tGcm9udEJ1
ZmZlckZvclJlYWQoKSBjb25zdAoreworICAgIGlmICghbV9wcml2YXRlKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBidWZm
ZXIgPSBtX3ByaXZhdGUtPmxvY2tSZWFkRnJvbnRCdWZmZXJJbnRlcm5hbCgpOworCisgICAgaWYg
KCFidWZmZXIpCisgICAgICAgIG1fcHJpdmF0ZS0+dW5sb2NrUmVhZEZyb250QnVmZmVyKCk7CisK
KyAgICByZXR1cm4gYnVmZmVyOworfQorCit2b2lkIFBsdWdpblZpZXc6OnVubG9ja0Zyb250QnVm
ZmVyKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuOworICAg
IG1fcHJpdmF0ZS0+dW5sb2NrUmVhZEZyb250QnVmZmVyKCk7Cit9CisKKyNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCitQbGF0Zm9ybUxheWVyKiBQbHVnaW5WaWV3OjpwbGF0Zm9ybUxh
eWVyKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fcHJpdmF0ZSkKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgcmV0dXJuIG1fcHJpdmF0ZS0+bV9wbGF0Zm9ybUxheWVyLmdldCgpOworfQorI2VuZGlmCisK
K0ludFJlY3QgUGx1Z2luVmlldzo6ZW5zdXJlVmlzaWJsZVJlY3QoKQoreworICAgIGlmICghbV9w
cml2YXRlKQorICAgICAgICByZXR1cm4gSW50UmVjdCgpOworICAgIHJldHVybiBtX3ByaXZhdGUt
Pm1fa2VlcFZpc2libGVSZWN0OworfQorCit2b2lkIFBsdWdpblZpZXc6OnNldEJhY2tncm91bmRQ
bGF5KGJvb2wgdmFsdWUpCit7CisgICAgaWYgKCFtX3ByaXZhdGUgfHwgbV9wcml2YXRlLT5tX2lz
QmFja2dyb3VuZFBsYXlpbmcgPT0gdmFsdWUpCisgICAgICAgIHJldHVybjsKKworICAgIEZyYW1l
VmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV9wcml2YXRlLT5tX3Zp
ZXctPnBhcmVudCgpKTsKKyAgICBtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZyA9IHZh
bHVlOworICAgIGlmIChtX3ByaXZhdGUtPm1faXNCYWNrZ3JvdW5kUGxheWluZykKKyAgICAgICAg
ZnJhbWVWaWV3LT5ob3N0V2luZG93KCktPnBsYXRmb3JtUGFnZUNsaWVudCgpLT5vblBsdWdpblN0
YXJ0QmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5j
X3N0cigpKTsKKyAgICBlbHNlCisgICAgICAgIGZyYW1lVmlldy0+aG9zdFdpbmRvdygpLT5wbGF0
Zm9ybVBhZ2VDbGllbnQoKS0+b25QbHVnaW5TdG9wQmFja2dyb3VuZFBsYXkodGhpcywgbV9wcml2
YXRlLT5tX3BsdWdpblVuaXF1ZVByZWZpeC5jX3N0cigpKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisK
</data>
<flag name="review"
          id="119088"
          type_id="1"
          status="+"
          setter="dbates"
    />
          </attachment>
      

    </bug>

</bugzilla>