<?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>28272</bug_id>
          
          <creation_ts>2009-08-13 12:08:47 -0700</creation_ts>
          <short_desc>WINCE PORT: graphics files only for WINCE</short_desc>
          <delta_ts>2010-11-03 07:41:02 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Other</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>27511</blocked>
    
    <blocked>37440</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Yong Li">yong.li.webkit</reporter>
          <assigned_to name="Patrick R. Gansterer">paroga</assigned_to>
          <cc>aroben</cc>
    
    <cc>joybro201</cc>
    
    <cc>manyoso</cc>
    
    <cc>skyul</cc>
    
    <cc>staikos</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>139962</commentid>
    <comment_count>0</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-13 12:08:47 -0700</bug_when>
    <thetext>derived from 27511 because there are too many comments in there.

patches are going to be post soon</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139972</commentid>
    <comment_count>1</comment_count>
      <attachid>34768</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-13 12:28:35 -0700</bug_when>
    <thetext>Created attachment 34768
1) SharedBitmap

createInstance() should be changed to create().

But this needs modifications on some landed files. Can we do this afterward?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139973</commentid>
    <comment_count>2</comment_count>
      <attachid>34769</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-13 12:29:47 -0700</bug_when>
    <thetext>Created attachment 34769
2) ImageWince.cpp

implement some platform-specific BitmapImage methods.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144095</commentid>
    <comment_count>3</comment_count>
      <attachid>34768</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-01 18:45:06 -0700</bug_when>
    <thetext>Comment on attachment 34768
1) SharedBitmap

+ BitmapMap g_bitmapMap

Static initializers are forbidden.

+ int discardBitmapHandles()

Functions like this should be static.

+ SharedBitmap::SharedBitmap
+ SharedBitmap::SharedBitmap

Initializer list as wrong indent.

+ SharedBitmap::~SharedBitmap

Missing blank line before this function.

+ delete[] m_pixels

Why not OwnArray?

+ memset(m_pixels, 0, bufferSize * (is16bit() ? 2 : 4));

Size calculation should be factored into an separate function.

+ void _clear()

This and its ilk are improper style.

+ explicit SharedBitmap

The explicit keyword is needed only for one-argument constructors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144097</commentid>
    <comment_count>4</comment_count>
      <attachid>34769</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-01 18:49:21 -0700</bug_when>
    <thetext>Comment on attachment 34769
2) ImageWince.cpp

+ static inline int stableRound

Why is this function WINCE specific?

+ PassRefPtr&lt;WebCore::SharedBuffer&gt; loadResourceIntoBuffer(const char* name);

Why are we declaring a function in a cpp file?

Also, these things should be happening in the WebCore namespace.

Aside from these minor issues, this patch actually looks somewhat reasonable.  I&apos;m not a graphics expert, however.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144098</commentid>
    <comment_count>5</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-09-01 18:51:12 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 34768 [details])
&gt; + BitmapMap g_bitmapMap
&gt; 
&gt; Static initializers are forbidden.

Forbidden by you?

&gt; 
&gt; + int discardBitmapHandles()
&gt; 
&gt; Functions like this should be static.

it&apos;s supposed to be called from outside</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212209</commentid>
    <comment_count>6</comment_count>
      <attachid>53310</attachid>
    <who name="Kwang Yul Seo">skyul</who>
    <bug_when>2010-04-13 21:31:35 -0700</bug_when>
    <thetext>Created attachment 53310
1) SharedBitmap

Change g_drawPattern and g_drawImage to s_drawPattern and s_drawImage respectively.
Change g_dcProvider to s_dcProvider ane make it static as it is not used elsewhere.
Change g_bitmapMap to bitmapMap function as static initializers are forbidden.
Use AffineTransform instead of TransformationMatrix.
Change methods names which start with underscore: _clear -&gt; clearInternal, _set -&gt; setInternal.
Remove explicit keyword from SharedBitmap constructors as they take multiple arguments.
Indent initializer list properly.
Use C++ style casts.
Fix other miscellaneous style errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>240352</commentid>
    <comment_count>7</comment_count>
      <attachid>53310</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-06-19 09:29:54 -0700</bug_when>
    <thetext>Comment on attachment 53310
1) SharedBitmap

WebCore/platform/graphics/wince/SharedBitmap.cpp:86
 +  PassRefPtr&lt;SharedBitmap&gt; SharedBitmap::createInstance(bool is16bit, int w, int h, bool initPixels)
One letter variable names are not good.


WebCore/platform/graphics/wince/SharedBitmap.cpp:88
 +      SharedBitmap* rtn = new SharedBitmap(is16bit, w, h, initPixels);
&quot;rtn&quot; is not good name.  resultantBitmap?


WebCore/platform/graphics/wince/SharedBitmap.cpp:109
 +  SharedBitmap::SharedBitmap(bool _is16bit, int w, int h, bool initPixels)
_is16bit should be is16bit.  w and h should be width and height.


WebCore/platform/graphics/wince/SharedBitmap.cpp:143
 +      if (m_pixels) {
We prefer early exit in WebKit. So this should be:
if (!m_pixels)
    return;


WebCore/platform/graphics/wince/SharedBitmap.cpp:246
 +  HBITMAP SharedBitmap::createHandle(void** pixels, BitmapInfo* bmpInfo, int h, bool use16bit) const
One letter variable name is not good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276571</commentid>
    <comment_count>8</comment_count>
      <attachid>67058</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-09-09 10:51:07 -0700</bug_when>
    <thetext>Created attachment 67058
2) ImageWinCE.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276578</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-09 10:53:54 -0700</bug_when>
    <thetext>Attachment 67058 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/platform/graphics/wince/ImageWinCE.cpp:40:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 1 in 2 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>278976</commentid>
    <comment_count>10</comment_count>
      <attachid>67058</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-09-14 09:39:06 -0700</bug_when>
    <thetext>Comment on attachment 67058
2) ImageWinCE.cpp

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

&gt; WebCore/platform/graphics/wince/ImageWinCE.cpp:46
&gt; +    NativeImagePtr ret = SharedBitmap::createInstance(false, width(), height(), false);
A non-abbreviated variable name (like &quot;image&quot;) would be better.

&gt; WebCore/platform/graphics/wince/ImageWinCE.cpp:100
&gt; +        if (bmp &amp;&amp; bmp-&gt;height() == (size_t)srcSize.height() &amp;&amp; bmp-&gt;width() == (size_t)srcSize.width()) {
I suggest using an early-continue and static_cast/

&gt; WebCore/platform/graphics/wince/ImageWinCE.cpp:125
&gt; +    RefPtr&lt;SharedBitmap&gt; bmp = frameAtIndex(m_currentFrame);
&gt; +    if (mayFillWithSolidColor())
&gt; +        fillWithSolidColor(ctxt, dstRect, solidColor(), styleColorSpace, compositeOp);
&gt; +    else {
&gt; +        IntRect intSrcRect(srcRectIn);
&gt; +
&gt; +        if (bmp-&gt;width() != m_source.size().width()) {
It looks like bmp is only used in the else case. Can it be declared inside the else?

&gt; WebCore/platform/graphics/wince/ImageWinCE.cpp:126
&gt; +            double rate = (double)bmp-&gt;width() / m_source.size().width();
static_cast would be better.

&quot;scaleFactor&quot; seems like a better name than &quot;rate&quot;.

&gt; WebCore/platform/graphics/wince/ImageWinCE.cpp:129
&gt; +            int temp = stableRound(srcRectIn.right() * rate);
&gt; +            intSrcRect.setX(stableRound(srcRectIn.x() * rate));
&gt; +            intSrcRect.setWidth(temp - intSrcRect.x());
Why is temp needed? Can&apos;t you do this instead?

intSrcRect.setWidth(stableRound(srcRectIn.width() * rate));

&gt; WebCore/platform/graphics/wince/ImageWinCE.cpp:132
&gt; +            temp = stableRound(srcRectIn.bottom() * rate);
&gt; +            intSrcRect.setY(stableRound(srcRectIn.y() * rate));
&gt; +            intSrcRect.setHeight(temp - intSrcRect.y());
Same question here.

&gt; WebCore/platform/graphics/wince/ImageWinCE.cpp:151
&gt; +    RefPtr&lt;SharedBitmap&gt; bmp = nativeImageForCurrentFrame();
&gt; +    if (bmp)
&gt; +        bmp-&gt;drawPattern(ctxt, tileRectIn, patternTransform, phase, styleColorSpace, op, destRect, m_source.size());
An early return would be nicer here.

&gt; WebCore/platform/graphics/wince/ImageWinCE.cpp:171
&gt; +    if (bmp-&gt;width() == 1 &amp;&amp; bmp-&gt;validHeight() == 1) {
I think this would be cleaner if you reversed the condition and used an early return.

&gt; WebCore/platform/graphics/wince/ImageWinCE.cpp:175
&gt; +            unsigned short c = ((unsigned short *)bmp-&gt;bytes())[0];
reinterpret_cast would be better.

&gt; WebCore/platform/graphics/wince/ImageWinCE.cpp:184
&gt; +            unsigned c = ((unsigned *)bmp-&gt;bytes())[0];
reinterpret_cast would be better.

The code looks fine, but you should consider these comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280124</commentid>
    <comment_count>11</comment_count>
      <attachid>67058</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-09-16 09:00:20 -0700</bug_when>
    <thetext>Comment on attachment 67058
2) ImageWinCE.cpp

Clearing flags on attachment: 67058

Committed r67624: &lt;http://trac.webkit.org/changeset/67624&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>298374</commentid>
    <comment_count>12</comment_count>
      <attachid>71636</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-10-23 05:43:26 -0700</bug_when>
    <thetext>Created attachment 71636
1) SharedBitmap

There are some parts of uncool code in the patch:
E.g: HDC SharedBitmap::DCProvider::getDC(SharedBitmap* bmp, unsigned* key1, unsigned* key2)

I&apos;d like to commit the patch as it is at the moment, because many code in the other WinCE files require this constructs.
E.g: ScopeDCProvider in GraphicsContextWinCE

If it&apos;s ok, I want to clean this up in further patches, so we can see the codechanges of the already comitted code in context with the other changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>298375</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-10-23 05:46:00 -0700</bug_when>
    <thetext>Attachment 71636 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/platform/graphics/wince/SharedBitmap.h:30:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/graphics/wince/SharedBitmap.h:145:  Could not find a newline character at the end of the file.  [whitespace/ending_newline] [5]
WebCore/platform/graphics/wince/SharedBitmap.cpp:31:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/graphics/wince/SharedBitmap.cpp:33:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 4 in 3 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300134</commentid>
    <comment_count>14</comment_count>
      <attachid>71636</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-10-27 05:06:49 -0700</bug_when>
    <thetext>Comment on attachment 71636
1) SharedBitmap

Can this class be unified with ImageBuffer? It seems to me they serve essentially the same purpose, i.e., providing some memory into which you can draw.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300139</commentid>
    <comment_count>15</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-10-27 05:13:59 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; (From update of attachment 71636 [details])
&gt; Can this class be unified with ImageBuffer? It seems to me they serve essentially the same purpose, i.e., providing some memory into which you can draw.
I don&apos;t think so, because SharedBitmap works on top of HBITMAP.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300141</commentid>
    <comment_count>16</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-10-27 05:20:19 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; (In reply to comment #14)
&gt; &gt; (From update of attachment 71636 [details] [details])
&gt; &gt; Can this class be unified with ImageBuffer? It seems to me they serve essentially the same purpose, i.e., providing some memory into which you can draw.
&gt; I don&apos;t think so, because SharedBitmap works on top of HBITMAP.

Presumably ImageBuffer would, too. I don&apos;t know how ImageBuffer is implemented currently on WinCE. But it should just wrap an HBITMAP. You&apos;ll need this for things like &lt;canvas&gt; anyway.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300232</commentid>
    <comment_count>17</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2010-10-27 08:12:43 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; (In reply to comment #15)
&gt; &gt; (In reply to comment #14)
&gt; &gt; &gt; (From update of attachment 71636 [details] [details] [details])
&gt; &gt; &gt; Can this class be unified with ImageBuffer? It seems to me they serve essentially the same purpose, i.e., providing some memory into which you can draw.
&gt; &gt; I don&apos;t think so, because SharedBitmap works on top of HBITMAP.
&gt; Presumably ImageBuffer would, too. I don&apos;t know how ImageBuffer is implemented currently on WinCE. But it should just wrap an HBITMAP. You&apos;ll need this for things like &lt;canvas&gt; anyway.

ImageBuffer uses SharedBitmap. SharedBitmap is a helper class for HBITMAP</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>302930</commentid>
    <comment_count>18</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-11-01 14:19:11 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; (In reply to comment #16)
&gt; &gt; (In reply to comment #15)
&gt; &gt; &gt; (In reply to comment #14)
&gt; &gt; &gt; &gt; (From update of attachment 71636 [details] [details] [details] [details])
&gt; &gt; &gt; &gt; Can this class be unified with ImageBuffer? It seems to me they serve essentially the same purpose, i.e., providing some memory into which you can draw.
&gt; &gt; &gt; I don&apos;t think so, because SharedBitmap works on top of HBITMAP.
&gt; &gt; Presumably ImageBuffer would, too. I don&apos;t know how ImageBuffer is implemented currently on WinCE. But it should just wrap an HBITMAP. You&apos;ll need this for things like &lt;canvas&gt; anyway.
&gt; 
&gt; ImageBuffer uses SharedBitmap. SharedBitmap is a helper class for HBITMAP

I guess what I really mean is that the code seems misplaced. A class named &quot;SharedBitmap&quot; sounds like it would be just that: a ref-counted wrapper around an HBITMAP. But this class is a lot more than that. If you try to rename the class to reflect this, you start coming up with names like GraphicsContext and ImageBuffer. Which makes me wonder: why is this code not in those classes directly? Why is his helper class needed at all? It seems like it&apos;s adding an unnecessary extra layer to the already-complicated graphics code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>302955</commentid>
    <comment_count>19</comment_count>
      <attachid>71636</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-11-01 14:47:31 -0700</bug_when>
    <thetext>Comment on attachment 71636
1) SharedBitmap

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

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:49
&gt; +    SharedBitmap* resultantBitmap = new SharedBitmap(size, bitCount, initPixels);
&gt; +    if (resultantBitmap &amp;&amp; !resultantBitmap-&gt;bytes()) {
&gt; +        delete resultantBitmap;
&gt; +        return 0;
&gt; +    }
&gt; +    return adoptRef(resultantBitmap);

This should be:

RefPtr&lt;SharedBitmap&gt; resultantBitmap = adoptRef(new ...);
if (...)
    return 0;
return resultantBitmap.release();

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:59
&gt; +    PassRefPtr&lt;SharedBitmap&gt; result = create(size, BitmapInfo::BitCount32, false);
&gt; +    if (result) {
&gt; +        memcpy(result-&gt;bytes(), data.data(), data.size() * sizeof(unsigned));
&gt; +        result-&gt;setHasAlpha(hasAlpha);
&gt; +    }
&gt; +    return result;

result should be a RefPtr and you should return result.release().

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:62
&gt; +SharedBitmap::SharedBitmap(const BitmapInfo&amp; bmpInfo, HBITMAP hbmp, void* pixels)

This constructor doesn&apos;t seem to be used.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:79
&gt; +    , m_reference(1)

This member doesn&apos;t seem to be used.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:111
&gt; +    if (m_hbitmap)
&gt; +        DeleteObject(m_hbitmap);
&gt; +    else
&gt; +        delete[] m_pixels;

Using OwnPtr/OwnArrayPtr would be better.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:165
&gt; +    unsigned short* p16 = reinterpret_cast&lt;unsigned short*&gt;(newPixels);
&gt; +    const unsigned* p32 = reinterpret_cast&lt;const unsigned*&gt;(m_pixels);

static_cast should work here.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:167
&gt; +    const bool skips = paddedWidth != width;

We don&apos;t normally mark locals const like this.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:169
&gt; +    const unsigned short* const p16end = p16 + bufferSize;

...or this (second const).

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:288
&gt; +    if (!hbitmap) {

An early-return would be better.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:296
&gt; +        StretchDIBits(hdc, dstRect.x(), dstRect.y(), dstRect.width(), dstRect.height()
&gt; +            , srcRect.x(), srcRect.y(), srcRect.width(), srcRect.height(), m_pixels, &amp;m_bmpInfo, DIB_RGB_COLORS, rop);

This comma should be on the previous line.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:304
&gt; +            bool success = alphaBlendIfSupported(hdc, dstRect.x(), dstRect.y(), dstRect.width(), dstRect.height(), hmemdc.get()
&gt; +                , srcRect.x(), srcRect.y(), srcRect.width(), srcRect.height(), blend);

and this one

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:308
&gt; +            TransparentBlt(hdc, dstRect.x(), dstRect.y(), dstRect.width(), dstRect.height(), hmemdc.get()
&gt; +                , srcRect.x(), srcRect.y(), srcRect.width(), srcRect.height(), transparentColor());

and this one

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:331
&gt; +    if (newBmp) {

An early-return would be better.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:336
&gt; +        StretchDIBits(dcNew.get(), 0, 0, copyWidth, copyHeight, rect.x(), rect.y(), copyWidth, copyHeight
&gt; +            , bytes(), &amp;bitmapInfo(), DIB_RGB_COLORS, SRCCOPY);

and this one

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:353
&gt; +    PassRefPtr&lt;SharedBitmap&gt; newBmp = create(IntSize(copyWidth, copyHeight), useAlpha &amp;&amp; is32bit() ? BitmapInfo::BitCount32 : BitmapInfo::BitCount16, false);

This should be a RefPtr and you should return newBmp.release().

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:361
&gt; +    StretchDIBits(dcNew.get(), 0, 0, copyWidth, copyHeight, rect.x(), rect.y(), copyWidth, copyHeight
&gt; +        , bytes(), &amp;bitmapInfo(), DIB_RGB_COLORS, SRCCOPY);

Comma should be on the previous line.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:369
&gt; +    if (hBrush) {

Early-return would be better. Do we really need the null-check at all?

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:388
&gt; +            StretchDIBits(hdc, dstX, dstY, sourceW, sourceH, sourceX, sourceY, sourceW, sourceH
&gt; +                , bmp-&gt;bytes(), &amp;bmp-&gt;bitmapInfo(), DIB_RGB_COLORS, SRCCOPY);

Comma should be on the previous line.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:521
&gt; +    {

Why is this extra scope needed?

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:536
&gt; +        if (hbmpTemp) {

Early-return would be better.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:574
&gt; +                bool success = alphaBlendIfSupported(hdc, dstRectWin.left, dstRectWin.top, dstRectWin.right - dstRectWin.left, dstRectWin.bottom - dstRectWin.top
&gt; +                    , hmemdc.get(), 0, 0, srcRectWin.right, srcRectWin.bottom, blend);
&gt; +                ASSERT_UNUSED(success, success);
&gt; +            } else if (useAlpha &amp;&amp; !hasAlphaBlendSupport() || op == CompositeSourceOver &amp;&amp; usesTransparentColor())
&gt; +                TransparentBlt(hdc, dstRectWin.left, dstRectWin.top, dstRectWin.right - dstRectWin.left
&gt; +                    , dstRectWin.bottom - dstRectWin.top, hmemdc.get(), 0, 0, srcRectWin.right, srcRectWin.bottom, transparentColor());
&gt; +            else {
&gt; +                DWORD bmpOp = op == CompositeCopy ? SRCCOPY
&gt; +                            : op == CompositeSourceOver ? SRCCOPY
&gt; +                            : op == CompositeXOR ? PATINVERT
&gt; +                            : op == CompositeClear ? WHITENESS
&gt; +                            : SRCCOPY; // FIXEME: other types?
&gt; +
&gt; +                StretchDIBits(hdc, dstRectWin.left, dstRectWin.top, dstRectWin.right - dstRectWin.left
&gt; +                    , dstRectWin.bottom - dstRectWin.top, 0, 0, srcRectWin.right, srcRectWin.bottom
&gt; +                    , pixels, &amp;bmpInfo, DIB_RGB_COLORS, bmpOp);

Please fix the leading commas.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:582
&gt; +SharedBitmap::DCProvider s_dcProvider;
&gt; +SharedBitmap::DCProvider* SharedBitmap::m_dcProvider = &amp;s_dcProvider;

Why is the s_dcProvider needed? Why not just do m_dcProvider = new DCProvider?

The current s_dcProvider should be marked static if it needs to stay. m_dcProvider should be named s_dcProvider.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:584
&gt; +HDC SharedBitmap::DCProvider::getDC(SharedBitmap* bmp, unsigned* key1, unsigned* key2)

Why do we have key2 if it&apos;s never used?

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:590
&gt; +    if (hdc) {

Early-return would be better. Is the null-check really needed?

&gt; WebCore/platform/graphics/wince/SharedBitmap.h:44
&gt; +    virtual ~SharedBitmap();

Why is this virtual?

&gt; WebCore/platform/graphics/wince/SharedBitmap.h:146
&gt; +#endif // SharedBitmap_h
&gt;  \ No newline at end of file

Please add a newline.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303086</commentid>
    <comment_count>20</comment_count>
      <attachid>72602</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-11-01 16:59:17 -0700</bug_when>
    <thetext>Created attachment 72602
1) SharedBitmap</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303089</commentid>
    <comment_count>21</comment_count>
      <attachid>72603</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-11-01 17:01:36 -0700</bug_when>
    <thetext>Created attachment 72603
1) SharedBitmap</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303090</commentid>
    <comment_count>22</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-11-01 17:02:12 -0700</bug_when>
    <thetext>Attachment 72602 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/platform/graphics/wince/SharedBitmap.h:28:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/graphics/wince/SharedBitmap.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/graphics/wince/SharedBitmap.h:144:  Could not find a newline character at the end of the file.  [whitespace/ending_newline] [5]
WebCore/platform/graphics/wince/SharedBitmap.cpp:31:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/graphics/wince/SharedBitmap.cpp:33:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 5 in 3 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303091</commentid>
    <comment_count>23</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-11-01 17:03:19 -0700</bug_when>
    <thetext>Attachment 72603 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/platform/graphics/wince/SharedBitmap.h:28:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/graphics/wince/SharedBitmap.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/graphics/wince/SharedBitmap.cpp:31:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/graphics/wince/SharedBitmap.cpp:33:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 4 in 3 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303974</commentid>
    <comment_count>24</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-11-03 04:22:19 -0700</bug_when>
    <thetext>(In reply to comment #23)
&gt; Attachment 72603 [details] did not pass style-queue:
&gt; 
&gt; Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
&gt; WebCore/platform/graphics/wince/SharedBitmap.h:28:  Alphabetical sorting problem.  [build/include_order] [4]
&gt; WebCore/platform/graphics/wince/SharedBitmap.h:31:  Alphabetical sorting problem.  [build/include_order] [4]
&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:31:  Alphabetical sorting problem.  [build/include_order] [4]
&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:33:  Alphabetical sorting problem.  [build/include_order] [4]
&gt; Total errors found: 4 in 3 files
&gt; 
&gt; 
&gt; If any of these errors are false positives, please file a bug against check-webkit-style.

You should fix these style errors. You can run check-webkit-style yourself from the command line:

check-webkit-style file1 file2...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303979</commentid>
    <comment_count>25</comment_count>
      <attachid>72603</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-11-03 04:36:52 -0700</bug_when>
    <thetext>Comment on attachment 72603
1) SharedBitmap

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

I think this is worth one more pass.


&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:47
&gt; +    return resultantBitmap;

This should be: return resultantBitmap.release();

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:57
&gt; +    return result;

Ditto.

By using RefPtr::release you save an extra ref/deref.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:92
&gt; +    if (m_hbitmap)
&gt; +        DeleteObject(m_hbitmap);

I still think it would be good to use an OwnPtr for m_hbitmap.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:109
&gt; +        wmemset(reinterpret_cast&lt;wchar_t*&gt;(m_pixels), 0xFFFF, bufferSize);

static_cast should work fine here.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:114
&gt; +    unsigned* pixel = reinterpret_cast&lt;unsigned*&gt;(m_pixels);

And here.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:115
&gt; +    const unsigned* const bufferEnd = pixel + bufferSize;

I think you can omit the second const here, to match standard WebKit style.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:164
&gt; +        m_pixelData.swap(newPixelData);

Another way to write this: m_pixelData = newPixelData.release();

I don&apos;t think one way is clearly better than the other.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:194
&gt; +HBITMAP SharedBitmap::createHandle(void** pixels, BitmapInfo* bmpInfo, int height, bool use16bit) const

This should return a PassOwnPtr&lt;HBITMAP&gt;. You can do this even if you don&apos;t make m_hbitmap an OwnPtr.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:203
&gt; +    HBITMAP hbmp = CreateDIBSection(0, bmpInfo, DIB_RGB_COLORS, pixels, 0, 0);

This should be an OwnPtr. Then you can return hbmp.release() at the end.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:292
&gt; +    } else
&gt; +        TransparentBlt(hdc, dstRect.x(), dstRect.y(), dstRect.width(), dstRect.height(), hmemdc.get(),
&gt; +            srcRect.x(), srcRect.y(), srcRect.width(), srcRect.height(), transparentColor());

You should use braces around the body of the else because it is more than one line (even though it&apos;s only a single statement).

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:351
&gt; +    HBRUSH hBrush = CreatePatternBrush(hbmp);

You could use an OwnPtr for this.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:383
&gt; +static void normalizePhase(LONG&amp; phase, int limit)

Since this uses an out-parameter, it should have a name like &quot;getNormalizedPhase&quot;. But why does it use an out-parameter? A return value seems better. That would let you shorten this function quite a bit.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:489
&gt; +    RECT dstRectWin =
&gt; +    {

The brace should be on the previous line.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:549
&gt; +    } else if (useAlpha &amp;&amp; !hasAlphaBlendSupport() || op == CompositeSourceOver &amp;&amp; usesTransparentColor())
&gt; +        TransparentBlt(hdc, dstRectWin.left, dstRectWin.top, dstRectWin.right - dstRectWin.left,
&gt; +            dstRectWin.bottom - dstRectWin.top, hmemdc.get(), 0, 0, srcRectWin.right, srcRectWin.bottom, transparentColor());
&gt; +    else {

Need braces here.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:565
&gt; +HDC SharedBitmap::DCProvider::getDC(SharedBitmap* bmp, unsigned* key1)

key1 could just be key now.

Maybe this function should return an OwnPtr&lt;HDC&gt;...

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:582
&gt; +void SharedBitmap::DCProvider::releaseDC(SharedBitmap*, HDC hdc, unsigned key1)

...and this function should take a PassOwnPtr&lt;HDC&gt;?

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:600
&gt; +        unsigned short* dst = reinterpret_cast&lt;unsigned short*&gt;(m_pixels);

static_cast should be fine here.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:612
&gt; +    unsigned* dst = reinterpret_cast&lt;unsigned*&gt;(m_pixels);

static_cast should be fine here.

&gt; WebCore/platform/graphics/wince/SharedBitmap.h:35
&gt; +enum CompositeOperator;

Foroward-declaring enums doesn&apos;t normally work. Is this declaration really helping?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303984</commentid>
    <comment_count>26</comment_count>
      <attachid>72813</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-11-03 05:26:35 -0700</bug_when>
    <thetext>Created attachment 72813
Patch

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

&gt;&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:57
&gt;&gt; +    return result;
&gt; 
&gt; Ditto.
&gt; 
&gt; By using RefPtr::release you save an extra ref/deref.

Ohh, good to know.

&gt;&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:92
&gt;&gt; +        DeleteObject(m_hbitmap);
&gt; 
&gt; I still think it would be good to use an OwnPtr for m_hbitmap.

Upps, missed this point.

&gt;&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:565
&gt;&gt; +HDC SharedBitmap::DCProvider::getDC(SharedBitmap* bmp, unsigned* key1)
&gt; 
&gt; key1 could just be key now.
&gt; 
&gt; Maybe this function should return an OwnPtr&lt;HDC&gt;...

They do nearly the same as GraphicsContext::getWindowsContext().
Maybe we should change them too?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303997</commentid>
    <comment_count>27</comment_count>
      <attachid>72813</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-11-03 06:15:08 -0700</bug_when>
    <thetext>Comment on attachment 72813
Patch

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

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:54
&gt; +    if (result) {

This could be an early return instead.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:79
&gt; +    m_pixelData.set(new unsigned[bufferSize]);

I think the more modern way to do this is:

m_pixelData = adoptArrayPtr(new unsigned[bufferSize]);

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:176
&gt; +        m_hbitmap.clear();

Some people have started to use: m_hbitmap = nullptr;

I don&apos;t know if that&apos;s the recommended style for all new code.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:199
&gt; +    OwnPtr&lt;HBITMAP&gt; hbmp(CreateDIBSection(0, bmpInfo, DIB_RGB_COLORS, pixels, 0, 0));

You could write this as: OwnPtr&lt;HBITMAP&gt; hbmp = adoptPtr(CreateDIBSection(...));

I don&apos;t know whether that&apos;s the recommended style for all new code. I find it slightly more readable.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:296
&gt; +HBITMAP SharedBitmap::clipBitmap(const IntRect&amp; rect, bool useAlpha, BitmapInfo&amp; bmpInfo, void*&amp; pixels)

This could return a PassOwnPtr&lt;HBITMAP&gt;.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:309
&gt; +    HBITMAP newBmp = CreateDIBSection(0, &amp;bmpInfo, DIB_RGB_COLORS, &amp;pixels, 0, 0);

...and you could store this in an OwnPtr.

&gt; WebCore/platform/graphics/wince/SharedBitmap.cpp:343
&gt; +    return newBmp;

This should be: return newBmp.release();

&gt; WebCore/platform/graphics/wince/SharedBitmap.h:146
&gt; +#endif // SharedBitmap_h
&gt;  \ No newline at end of file

You should add a newline.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>304018</commentid>
    <comment_count>28</comment_count>
      <attachid>72819</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-11-03 07:07:10 -0700</bug_when>
    <thetext>Created attachment 72819
1) SharedBitmap

Added GraphicsContext changes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>304020</commentid>
    <comment_count>29</comment_count>
      <attachid>72819</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-11-03 07:11:22 -0700</bug_when>
    <thetext>Comment on attachment 72819
1) SharedBitmap

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

&gt; WebCore/platform/graphics/wince/GraphicsContextWinCE.cpp:467
&gt; -TransparentLayerDC::TransparentLayerDC(GraphicsContextPlatformPrivate* data, IntRect&amp; origRect, const IntRect* rectBeforeTransform, int alpha, bool paintImage)
&gt; +TransparentLayerDC::TransparentLayerDC(GraphicsContextPlatformPrivate* data, IntRect&amp; origRect, const IntRect* rectBeforeTransform, int alpha, bool paintImage, bool paintGradient)

This change seems to have snuck in.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>304030</commentid>
    <comment_count>30</comment_count>
      <attachid>72819</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-11-03 07:40:26 -0700</bug_when>
    <thetext>Comment on attachment 72819
1) SharedBitmap

Clearing flags on attachment: 72819

Manually committed r71237: &lt;http://trac.webkit.org/changeset/71237&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>304031</commentid>
    <comment_count>31</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-11-03 07:41:02 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34768</attachid>
            <date>2009-08-13 12:28:35 -0700</date>
            <delta_ts>2010-10-23 05:43:26 -0700</delta_ts>
            <desc>1) SharedBitmap</desc>
            <filename>28272_1.patch</filename>
            <type>text/plain</type>
            <size>29820</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OWRmNGFhYy4uYmYwMGMyNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNSBAQAorMjAwOS0wOC0xMyAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IFNoYXJlZEJpdG1hcCBpcyBhIGhlbHBlciBjbGFz
cyB1c2VkIGFzIAorICAgICAgICBOYXRpdmVJbWFnZVB0ciBmb3IgV0lOQ0UuIEl0J3Mgd2lkZSB1
c2VkIGJ5IFdJTkNFIGdyYXBoaWNzCisgICAgICAgIGZpbGVzIGFzIGEgcmVwbGFjZW1lbnQgb2Yg
SEJJVE1BUC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTI4MjcyCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRt
YXAuaDogQWRkZWQuCisKIDIwMDktMDgtMTMgIFN0ZXZlIEJsb2NrICA8c3RldmVibG9ja0Bnb29n
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVyLgpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkN2RjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5jcHAKQEAgLTAsMCArMSw2OTMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9u
LCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIlNoYXJlZEJpdG1hcC5oIgorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5j
bHVkZSAiR3JhcGhpY3NUeXBlcy5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4Lmgi
CisjaW5jbHVkZSAiV2luY2VHcmFwaGljc0V4dHJhcy5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0
Lmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKKyNpZm5kZWYgTkRFQlVHCitzdHJ1Y3QgU2hhcmVkQml0bWFw
TGVha0NvdW50ZXIgeworICAgIH5TaGFyZWRCaXRtYXBMZWFrQ291bnRlcigpOworfTsKK3N0YXRp
YyBTaGFyZWRCaXRtYXBMZWFrQ291bnRlciBzaGFyZWRCaXRtYXBMZWFrQ291bnRlcjsKKyNlbmRp
ZgorCit0eXBlZGVmIEhhc2hTZXQ8U2hhcmVkQml0bWFwKj4gQml0bWFwTWFwOworQml0bWFwTWFw
IGdfYml0bWFwTWFwOworCisjaWZuZGVmIE5ERUJVRworU2hhcmVkQml0bWFwTGVha0NvdW50ZXI6
On5TaGFyZWRCaXRtYXBMZWFrQ291bnRlcigpCit7CisgICAgaWYgKCFnX2JpdG1hcE1hcC5pc0Vt
cHR5KCkpCisgICAgICAgIHByaW50ZigiXG5MRUFLOiAldSAlc1xuXG4iLCBnX2JpdG1hcE1hcC5z
aXplKCksICJTaGFyZWRCaXRtYXAgb2JqZWN0cyIpOworfQorI2VuZGlmCisKK3N0YXRpYyBTaGFy
ZWRCaXRtYXA6OkRyYXdQYXR0ZXJuRnVuYyBnX2RyYXdQYXR0ZXJuID0gMDsKK3N0YXRpYyBTaGFy
ZWRCaXRtYXA6OkRyYXdJbWFnZUZ1bmMgZ19kcmF3SW1hZ2UgPSAwOworCitpbnQgZGlzY2FyZEJp
dG1hcEhhbmRsZXMoKQoreworICAgIGludCBkZWxldGVkID0gMDsKKyAgICBmb3IgKEJpdG1hcE1h
cDo6aXRlcmF0b3IgaSA9IGdfYml0bWFwTWFwLmJlZ2luKCk7IGkgIT0gZ19iaXRtYXBNYXAuZW5k
KCk7ICsraSkgeworICAgICAgICBpZiAoKCppKS0+ZnJlZU1lbW9yeSgpKQorICAgICAgICAgICAg
KytkZWxldGVkOworICAgIH0KKyAgICByZXR1cm4gZGVsZXRlZDsKK30KKworU2hhcmVkQml0bWFw
OjpEcmF3SW1hZ2VGdW5jIFNoYXJlZEJpdG1hcDo6c2V0RHJhd0ltYWdlRnVuYyhEcmF3SW1hZ2VG
dW5jIGZ1bmMpCit7CisgICAgRHJhd0ltYWdlRnVuYyBvbGRGdW5jID0gZ19kcmF3SW1hZ2U7Cisg
ICAgZ19kcmF3SW1hZ2UgPSBmdW5jOworICAgIHJldHVybiBvbGRGdW5jOworfQorCitTaGFyZWRC
aXRtYXA6OkRyYXdQYXR0ZXJuRnVuYyBTaGFyZWRCaXRtYXA6OnNldERyYXdQYXR0ZXJuRnVuYyhE
cmF3UGF0dGVybkZ1bmMgZnVuYykKK3sKKyAgICBEcmF3UGF0dGVybkZ1bmMgb2xkRnVuYyA9IGdf
ZHJhd1BhdHRlcm47CisgICAgZ19kcmF3UGF0dGVybiA9IGZ1bmM7CisgICAgcmV0dXJuIG9sZEZ1
bmM7Cit9CisKK1Bhc3NSZWZQdHI8U2hhcmVkQml0bWFwPiBTaGFyZWRCaXRtYXA6OmNyZWF0ZUlu
c3RhbmNlKGJvb2wgaXMxNmJpdCwgaW50IHcsIGludCBoLCBib29sIGluaXRQaXhlbHMpCit7Cisg
ICAgU2hhcmVkQml0bWFwKiBydG4gPSBuZXcgU2hhcmVkQml0bWFwKGlzMTZiaXQsIHcsIGgsIGlu
aXRQaXhlbHMpOworICAgIGlmIChydG4gJiYgIXJ0bi0+Ynl0ZXMoKSkgeworICAgICAgICBkZWxl
dGUgcnRuOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGFkb3B0UmVmKHJ0
bik7Cit9CisKK1NoYXJlZEJpdG1hcDo6U2hhcmVkQml0bWFwKGNvbnN0IEJpdG1hcEluZm8mIGJt
cEluZm8sIEhCSVRNQVAgaGJtcCwgdm9pZCogcGl4ZWxzKQorOiBtX2JtcEluZm8oYm1wSW5mbykK
KywgbV9sb2NrZWQoZmFsc2UpCissIG1fdXNlc1RyYW5zcGFyZW50Q29sb3IoZmFsc2UpCissIG1f
dHJhbnNwYXJlbnRDb2xvcihSR0IoMCwgMCwgMCkpCissIG1fcGl4ZWxzKHBpeGVscykKKywgbV9o
Yml0bWFwKGhibXApCissIG1faGFzQWxwaGEoZmFsc2UpCissIG1fdmFsaWRIZWlnaHQoYm1wSW5m
by5oZWlnaHQoKSkKK3sKKyAgICBnX2JpdG1hcE1hcC5hZGQodGhpcyk7Cit9CisKK1NoYXJlZEJp
dG1hcDo6U2hhcmVkQml0bWFwKGJvb2wgX2lzMTZiaXQsIGludCB3LCBpbnQgaCwgYm9vbCBpbml0
UGl4ZWxzKQorOiBtX2JtcEluZm8oX2lzMTZiaXQsIHcsIGgpCissIG1fcmVmZXJlbmNlKDEpCiss
IG1fbG9ja2VkKGZhbHNlKQorLCBtX3VzZXNUcmFuc3BhcmVudENvbG9yKGZhbHNlKQorLCBtX3Ry
YW5zcGFyZW50Q29sb3IoUkdCKDAsIDAsIDApKQorLCBtX3BpeGVscygwKQorLCBtX2hhc0FscGhh
KGZhbHNlKQorLCBtX3ZhbGlkSGVpZ2h0KGFicyhoKSkKKywgbV9oYml0bWFwKDApCit7CisgICAg
Z19iaXRtYXBNYXAuYWRkKHRoaXMpOworCisgICAgdW5zaWduZWQgYnVmZmVyU2l6ZSA9IG1fYm1w
SW5mby5udW1QaXhlbHMoKTsKKyAgICBpZiAoX2lzMTZiaXQpCisgICAgICAgIGJ1ZmZlclNpemUg
Lz0gMjsKKworICAgIG1fcGl4ZWxzID0gbmV3IHVuc2lnbmVkW2J1ZmZlclNpemVdOworCisgICAg
aWYgKGluaXRQaXhlbHMpCisgICAgICAgIHJlc2V0UGl4ZWxzKCk7Cit9CitTaGFyZWRCaXRtYXA6
On5TaGFyZWRCaXRtYXAoKQoreworICAgIGdfYml0bWFwTWFwLnJlbW92ZSh0aGlzKTsKKyAgICBp
ZiAobV9oYml0bWFwKQorICAgICAgICBEZWxldGVPYmplY3QobV9oYml0bWFwKTsKKyAgICBlbHNl
CisgICAgICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6cmVz
ZXRQaXhlbHMoYm9vbCBibGFjaykKK3sKKyAgICBpZiAobV9waXhlbHMpIHsKKyAgICAgICAgdW5z
aWduZWQgYnVmZmVyU2l6ZSA9IG1fYm1wSW5mby5udW1QaXhlbHMoKTsKKyAgICAgICAgaWYgKGJs
YWNrKQorICAgICAgICAgICAgbWVtc2V0KG1fcGl4ZWxzLCAwLCBidWZmZXJTaXplICogKGlzMTZi
aXQoKSA/IDIgOiA0KSk7CisgICAgICAgIGVsc2UgaWYgKGlzMTZiaXQoKSkgeworICAgICAgICAg
ICAgLy8gRmlsbCBpdCB3aXRoIHdoaXRlIGNvbG9yCisjaWYgSU1BR0VfTk9fQUxQSEFfVVNFX1JH
QjU1NQorICAgICAgICAgICAgd21lbXNldCgod2NoYXJfdCopbV9waXhlbHMsIDB4N0ZGRiwgYnVm
ZmVyU2l6ZSk7CisjZWxzZQorICAgICAgICAgICAgd21lbXNldCgod2NoYXJfdCopbV9waXhlbHMs
IDB4RkZGRiwgYnVmZmVyU2l6ZSk7CisjZW5kaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgIC8vIE1ha2UgaXQgd2hpdGUgYnV0IHRyYW5zcGFyZW50CisgICAgICAgICAgICB1bnNpZ25l
ZCogcGl4ZWwgPSAodW5zaWduZWQqKW1fcGl4ZWxzOworICAgICAgICAgICAgY29uc3QgdW5zaWdu
ZWQqIGNvbnN0IGJ1ZmZlckVuZCA9IHBpeGVsICsgYnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIHdo
aWxlIChwaXhlbCA8IGJ1ZmZlckVuZCkKKyAgICAgICAgICAgICAgICAqcGl4ZWwrKyA9IDB4MDBG
RkZGRkY7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hv
cnQgY29udmVydDMyVG8xNih1bnNpZ25lZCBwaXhlbCkKK3sKKyNpZiBJTUFHRV9OT19BTFBIQV9V
U0VfUkdCNTU1CisgICAgdW5zaWduZWQgc2hvcnQgciA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAm
IDB4MDBGODAwMDApID4+IDkpOworICAgIHVuc2lnbmVkIHNob3J0IGcgPSB1bnNpZ25lZCBzaG9y
dCgocGl4ZWwgJiAweDAwMDBGODAwKSA+PiA2KTsKKyAgICB1bnNpZ25lZCBzaG9ydCBiID0gdW5z
aWduZWQgc2hvcnQoKHBpeGVsICYgMHgwMDAwMDBGOCkgPj4gMyk7CisjZWxzZSAvLyBSR0I1NjUK
KyAgICB1bnNpZ25lZCBzaG9ydCByID0gdW5zaWduZWQgc2hvcnQoKHBpeGVsICYgMHgwMEY4MDAw
MCkgPj4gOCk7CisgICAgdW5zaWduZWQgc2hvcnQgZyA9IHVuc2lnbmVkIHNob3J0KChwaXhlbCAm
IDB4MDAwMEZDMDApID4+IDUpOworICAgIHVuc2lnbmVkIHNob3J0IGIgPSB1bnNpZ25lZCBzaG9y
dCgocGl4ZWwgJiAweDAwMDAwMEY4KSA+PiAzKTsKKyNlbmRpZgorICAgIHJldHVybiByIHwgZyB8
IGI7Cit9CisKK2Jvb2wgU2hhcmVkQml0bWFwOjp0bzE2Yml0KCkKK3sKKyAgICBpZiAobV9sb2Nr
ZWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoaXMxNmJpdCgpKQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKworICAgIEJpdG1hcEluZm8gbmV3Qm1wSW5mbyh0cnVlLCBtX2JtcEluZm8u
d2lkdGgoKSwgbV9ibXBJbmZvLmhlaWdodCgpKTsKKworICAgIE1lbW9yeUFsbG9jYXRpb25DYW5G
YWlsIGNhbkZhaWw7CisgICAgaW50IHdpZHRoID0gbmV3Qm1wSW5mby53aWR0aCgpOworICAgIGlu
dCBwYWRkZWRXaWR0aCA9IG5ld0JtcEluZm8ucGFkZGVkV2lkdGgoKTsKKyAgICBpbnQgYnVmZmVy
U2l6ZSA9IHBhZGRlZFdpZHRoICogbmV3Qm1wSW5mby5oZWlnaHQoKTsKKyAgICB2b2lkKiBuZXdQ
aXhlbHMgPSBuZXcgdW5zaWduZWRbYnVmZmVyU2l6ZSAvIDJdOworCisgICAgaWYgKCFuZXdQaXhl
bHMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHNob3J0KiBwMTYgPSAo
dW5zaWduZWQgc2hvcnQqKW5ld1BpeGVsczsKKyAgICBjb25zdCB1bnNpZ25lZCogcDMyID0gKGNv
bnN0IHVuc2lnbmVkKiltX3BpeGVsczsKKworICAgIGNvbnN0IGJvb2wgc2tpcHMgPSBwYWRkZWRX
aWR0aCAhPSB3aWR0aDsKKworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBjb25zdCBwMTZlbmQg
PSBwMTYgKyBidWZmZXJTaXplOworICAgIHdoaWxlIChwMTYgPCBwMTZlbmQpIHsKKyAgICAgICAg
Zm9yICh1bnNpZ25lZCBzaG9ydCogcDE2bGluZUVuZCA9IHAxNiArIHdpZHRoOyBwMTYgPCBwMTZs
aW5lRW5kOyApCisgICAgICAgICAgICAqcDE2KysgPSBjb252ZXJ0MzJUbzE2KCpwMzIrKyk7CisK
KyAgICAgICAgaWYgKHNraXBzKQorICAgICAgICAgICAgKnAxNisrID0gMDsKKyAgICB9CisKKwor
ICAgIGlmIChtX2hiaXRtYXApIHsKKyAgICAgICAgRGVsZXRlT2JqZWN0KG1faGJpdG1hcCk7Cisg
ICAgICAgIG1faGJpdG1hcCA9IDA7CisgICAgfSBlbHNlCisgICAgICAgIGRlbGV0ZVtdIG1fcGl4
ZWxzOworCisgICAgbV9waXhlbHMgPSBuZXdQaXhlbHM7CisgICAgbV9ibXBJbmZvID0gbmV3Qm1w
SW5mbzsKKworICAgIHNldEhhc0FscGhhKGZhbHNlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
Ym9vbCBTaGFyZWRCaXRtYXA6OmZyZWVNZW1vcnkoKQoreworICAgIGlmICghbV9sb2NrZWQpIHsK
KyAgICAgICAgaWYgKG1faGJpdG1hcCkgeworICAgICAgICAgICAgRGVsZXRlT2JqZWN0KG1faGJp
dG1hcCk7CisgICAgICAgICAgICBtX2hiaXRtYXAgPSAwOworICAgICAgICAgICAgbV9waXhlbHMg
PSAwOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAobV9waXhl
bHMpIHsKKyAgICAgICAgICAgIGRlbGV0ZVtdIG1fcGl4ZWxzOworICAgICAgICAgICAgbV9waXhl
bHMgPSAwOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAg
cmV0dXJuIGZhbHNlOworfQorCitIQklUTUFQIFNoYXJlZEJpdG1hcDo6Y3JlYXRlSGFuZGxlKHZv
aWQqKiBwaXhlbHMsIEJpdG1hcEluZm8qIGJtcEluZm8sIGludCBoLCBib29sIHVzZTE2Yml0KSBj
b25zdAoreworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybiAwOworCisgICAgTWVt
b3J5QWxsb2NhdGlvbkNhbkZhaWwgY2FuRmFpbDsKKworICAgIGlmIChoID09IC0xKQorICAgICAg
ICBoID0gaGVpZ2h0KCk7CisgICAgKmJtcEluZm8gPSBCaXRtYXBJbmZvKHVzZTE2Yml0IHx8IGlz
MTZiaXQoKSwgd2lkdGgoKSwgaCk7CisKKyAgICBIQklUTUFQIGhibXAgPSBNZW1vcnlNYW5hZ2Vy
OjpjcmVhdGVESUJTZWN0aW9uKGJtcEluZm8sIHBpeGVscyk7CisKKyAgICBpZiAoIWhibXApCisg
ICAgICAgIHJldHVybiAwOworCisgICAgT3duUHRyPEhEQz4gYm1wREMoQ3JlYXRlQ29tcGF0aWJs
ZURDKDApKTsKKyAgICBIR0RJT0JKIGhPbGRCbXAgPSBTZWxlY3RPYmplY3QoYm1wREMuZ2V0KCks
IGhibXApOworCisgICAgU3RyZXRjaERJQml0cyhibXBEQy5nZXQoKSwgMCwgMCwgd2lkdGgoKSwg
aCwgMCwgMCwgd2lkdGgoKSwgaAorICAgICAgICAsIG1fcGl4ZWxzLCAmbV9ibXBJbmZvLCBESUJf
UkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAgICBTZWxlY3RPYmplY3QoYm1wREMuZ2V0KCksIGhP
bGRCbXApOworCisgICAgcmV0dXJuIGhibXA7Cit9CisKK2Jvb2wgU2hhcmVkQml0bWFwOjplbnN1
cmVIYW5kbGUoKQoreworICAgIGlmIChtX2hiaXRtYXApCisgICAgICAgIHJldHVybiB0cnVlOwor
CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1f
bG9ja2VkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBCaXRtYXBJbmZvIGJtcEluZm87
CisgICAgdm9pZCogcGl4ZWxzOworICAgIG1faGJpdG1hcCA9IGNyZWF0ZUhhbmRsZSgmcGl4ZWxz
LCAmYm1wSW5mbywgLTEsICFoYXNBbHBoYSgpKTsKKworICAgIGlmICghbV9oYml0bWFwKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBkZWxldGVbXSBtX3BpeGVsczsKKyAgICBtX3BpeGVs
cyA9IHBpeGVsczsKKyAgICBtX2JtcEluZm8gPSBibXBJbmZvOworCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3KEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29u
c3QgSW50UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3Bl
cmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJu
OworICAgIGN0eHQtPmRyYXdCaXRtYXAodGhpcywgZHN0UmVjdCwgc3JjUmVjdCwgY29tcG9zaXRl
T3ApOworfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6ZHJhdyhIREMgaGRjLCBjb25zdCBJbnRSZWN0
JiBkc3RSZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21w
b3NpdGVPcCkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm47CisKKyAgICBp
ZiAoZHN0UmVjdC5pc0VtcHR5KCkgfHwgc3JjUmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGlmIChnX2RyYXdJbWFnZSAmJiBnX2RyYXdJbWFnZSh0aGlzLCBoZGMsIGRzdFJl
Y3QsIHNyY1JlY3QsIGNvbXBvc2l0ZU9wKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSEJJVE1B
UCBoYml0bWFwID0gMDsKKyAgICBib29sIHVzaW5nSGFuZGxlID0gY29tcG9zaXRlT3AgPT0gQ29t
cG9zaXRlU291cmNlT3ZlciAmJiAoCisjaWYgIWRlZmluZWQoTk9fQUxQSEFCTEVORCkKKyAgICAg
ICAgaGFzQWxwaGEoKSB8fAorI2VuZGlmCisgICAgICAgIHVzZXNUcmFuc3BhcmVudENvbG9yKCkp
OworCisgICAgaWYgKHVzaW5nSGFuZGxlKSB7CisgICAgICAgIGlmIChlbnN1cmVIYW5kbGUoKSkK
KyAgICAgICAgICAgIGhiaXRtYXAgPSBtX2hiaXRtYXA7CisgICAgICAgIGVsc2UgeworICAgICAg
ICAgICAgdm9pZCogcGl4ZWxzOworICAgICAgICAgICAgQml0bWFwSW5mbyBibXBJbmZvOworICAg
ICAgICAgICAgaGJpdG1hcCA9IGNyZWF0ZUhhbmRsZSgmcGl4ZWxzLCAmYm1wSW5mbywgLTEsIHVz
ZXNUcmFuc3BhcmVudENvbG9yKCkpOworICAgICAgICB9CisgICAgfQorICAgIGlmICghaGJpdG1h
cCkgeworICAgICAgICAvLyBGSVhNRTogaGFuZGxlIG90aGVyIGNvbXBvc2l0ZSBvcGVyYXRpb24g
dHlwZXM/CisgICAgICAgIERXT1JEIHJvcCA9IGNvbXBvc2l0ZU9wID09IENvbXBvc2l0ZUNvcHkg
PyBTUkNDT1BZCisgICAgICAgICAgICA6IGNvbXBvc2l0ZU9wID09IENvbXBvc2l0ZVhPUiA/IFBB
VElOVkVSVAorICAgICAgICAgICAgOiBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVDbGVhciA/IFdI
SVRFTkVTUworICAgICAgICAgICAgOiBTUkNDT1BZOworCisgICAgICAgIFN0cmV0Y2hESUJpdHMo
aGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5o
ZWlnaHQoKQorICAgICAgICAgICAgLCBzcmNSZWN0LngoKSwgc3JjUmVjdC55KCksIHNyY1JlY3Qu
d2lkdGgoKSwgc3JjUmVjdC5oZWlnaHQoKSwgbV9waXhlbHMsICZtX2JtcEluZm8sIERJQl9SR0Jf
Q09MT1JTLCByb3ApOworICAgIH0gZWxzZSB7CisgICAgICAgIE93blB0cjxIREM+IGhtZW1kYyhD
cmVhdGVDb21wYXRpYmxlREMoaGRjKSk7CisgICAgICAgIEhHRElPQkogaE9sZEJtcCA9IFNlbGVj
dE9iamVjdChobWVtZGMuZ2V0KCksIGhiaXRtYXApOworCisjaWYgIWRlZmluZWQoTk9fQUxQSEFC
TEVORCkKKyAgICAgICAgaWYgKCF1c2VzVHJhbnNwYXJlbnRDb2xvcigpKSB7CisgICAgICAgICAg
ICBzdGF0aWMgY29uc3QgQkxFTkRGVU5DVElPTiBibGVuZCA9IHsgQUNfU1JDX09WRVIsIDAsIDI1
NSwgQUNfU1JDX0FMUEhBIH07CisgICAgICAgICAgICBBbHBoYUJsZW5kKGhkYywgZHN0UmVjdC54
KCksIGRzdFJlY3QueSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCksIGhtZW1k
Yy5nZXQoKQorICAgICAgICAgICAgICAgICwgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNS
ZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksIGJsZW5kKTsKKyAgICAgICAgfSBlbHNlCisj
ZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNwYXJlbnRCbHQoaGRjLCBkc3RSZWN0
LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgaG1l
bWRjLmdldCgpCisgICAgICAgICAgICAgICAgLCBzcmNSZWN0LngoKSwgc3JjUmVjdC55KCksIHNy
Y1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWlnaHQoKSwgdHJhbnNwYXJlbnRDb2xvcigpKTsKKyAg
ICAgICAgfQorCisgICAgICAgIFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCksIGhPbGRCbXApOwor
ICAgICAgICBpZiAoaGJpdG1hcCAhPSBtX2hiaXRtYXApCisgICAgICAgICAgICBEZWxldGVPYmpl
Y3QoaGJpdG1hcCk7CisgICAgfQorfQorCisKK0hCSVRNQVAgU2hhcmVkQml0bWFwOjpjbGlwQml0
bWFwKGNvbnN0IEludFJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBib29sIHVzZUFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFw
SW5mbyYgYm1wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBw
aXhlbHMpCit7CisgICAgaWYgKCFieXRlcygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlu
dCBvbGRXaWR0aCA9IHdpZHRoKCk7CisgICAgaW50IG9sZEhlaWdodCA9IGhlaWdodCgpOworICAg
IGludCBjb3B5V2lkdGggPSBzdGQ6Om1pbjxpbnQ+KHJlY3Qud2lkdGgoKSwgb2xkV2lkdGggLSBy
ZWN0LngoKSk7CisgICAgaW50IGNvcHlIZWlnaHQgPSBzdGQ6Om1pbjxpbnQ+KHJlY3QuaGVpZ2h0
KCksIG9sZEhlaWdodCAtIHJlY3QueSgpKTsKKyAgICBpZiAoIWNvcHlXaWR0aCB8fCAhY29weUhl
aWdodCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBibXBJbmZvID0gQml0bWFwSW5mbyghKHVz
ZUFscGhhICYmIGlzMzJiaXQoKSksIGNvcHlXaWR0aCwgY29weUhlaWdodCk7CisgICAgSEJJVE1B
UCBuZXdCbXAgPSBNZW1vcnlNYW5hZ2VyOjpjcmVhdGVESUJTZWN0aW9uKCZibXBJbmZvLCAmcGl4
ZWxzKTsKKworICAgIGlmIChuZXdCbXApIHsKKyAgICAgICAgT3duUHRyPEhEQz4gZGNOZXcoOjpD
cmVhdGVDb21wYXRpYmxlREMoMCkpOworICAgICAgICBIR0RJT0JKIHRtcE5ldyA9IDo6U2VsZWN0
T2JqZWN0KGRjTmV3LmdldCgpLCBuZXdCbXApOworCisgICAgICAgIFN0cmV0Y2hESUJpdHMoZGNO
ZXcuZ2V0KCksIDAsIDAsIGNvcHlXaWR0aCwgY29weUhlaWdodCwgcmVjdC54KCksIHJlY3QueSgp
LCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQKKyAgICAgICAgICAgICwgYnl0ZXMoKSwgJmJpdG1hcElu
Zm8oKSwgRElCX1JHQl9DT0xPUlMsIFNSQ0NPUFkpOworCisgICAgICAgIFNlbGVjdE9iamVjdChk
Y05ldy5nZXQoKSwgdG1wTmV3KTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3Qm1wOworfQorCisK
K1Bhc3NSZWZQdHI8U2hhcmVkQml0bWFwPiBTaGFyZWRCaXRtYXA6OmNsaXBCaXRtYXAoY29uc3Qg
SW50UmVjdCYgcmVjdCwgYm9vbCB1c2VBbHBoYSkKK3sKKyAgICBpbnQgb2xkV2lkdGggPSB3aWR0
aCgpOworICAgIGludCBvbGRIZWlnaHQgPSBoZWlnaHQoKTsKKyAgICBpbnQgY29weVdpZHRoID0g
c3RkOjptaW48aW50PihyZWN0LndpZHRoKCksIG9sZFdpZHRoIC0gcmVjdC54KCkpOworICAgIGlu
dCBjb3B5SGVpZ2h0ID0gc3RkOjptaW48aW50PihyZWN0LmhlaWdodCgpLCBvbGRIZWlnaHQgLSBy
ZWN0LnkoKSk7CisgICAgaWYgKCFjb3B5V2lkdGggfHwgIWNvcHlIZWlnaHQpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgU2hhcmVkQml0bWFwKiBuZXdCbXAgPSBuZXcgU2hhcmVkQml0bWFwKCEo
dXNlQWxwaGEgJiYgaXMzMmJpdCgpKSwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LCBmYWxzZSk7CisK
KyAgICBpZiAoIW5ld0JtcCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIW5ld0JtcC0+
Ynl0ZXMoKSkgeworICAgICAgICBkZWxldGUgbmV3Qm1wOworICAgICAgICByZXR1cm4gMDsKKyAg
ICB9CisKKyAgICBEQ0hvbGRlciBkY05ldyhuZXdCbXApOworCisgICAgU3RyZXRjaERJQml0cyhk
Y05ldy5nZXQoKSwgMCwgMCwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LCByZWN0LngoKSwgcmVjdC55
KCksIGNvcHlXaWR0aCwgY29weUhlaWdodAorICAgICAgICAsIGJ5dGVzKCksICZiaXRtYXBJbmZv
KCksIERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKKworICAgIHJldHVybiBhZG9wdFJlZihuZXdC
bXApOworfQorCitzdGF0aWMgdm9pZCBkcmF3UGF0dGVyblNpbXBsZShIREMgaGRjLCBjb25zdCBS
RUNUJiBkZXN0UmVjdCwgSEJJVE1BUCBoYm1wLCBjb25zdCBQT0lOVCYgcGhhc2UpCit7CisgICAg
SEJSVVNIIGhCcnVzaCA9IENyZWF0ZVBhdHRlcm5CcnVzaChoYm1wKTsKKyAgICBpZiAoaEJydXNo
KSB7CisgICAgICAgIFBPSU5UIG9sZE9yZzsKKyAgICAgICAgU2V0QnJ1c2hPcmdFeChoZGMsIGRl
c3RSZWN0LmxlZnQgLSBwaGFzZS54LCBkZXN0UmVjdC50b3AgLSBwaGFzZS55LCAmb2xkT3JnKTsK
KyAgICAgICAgRmlsbFJlY3QoaGRjLCAmZGVzdFJlY3QsIGhCcnVzaCk7CisgICAgICAgIERlbGV0
ZU9iamVjdChoQnJ1c2gpOworICAgICAgICBTZXRCcnVzaE9yZ0V4KGhkYywgb2xkT3JnLngsIG9s
ZE9yZy55LCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdQYXR0ZXJuU2ltcGxlKEhE
QyBoZGMsIGNvbnN0IFJFQ1QmIGRlc3RSZWN0LCBjb25zdCBTaGFyZWRCaXRtYXAqIGJtcCwgY29u
c3QgU0laRSYgYm1wU2l6ZSwgY29uc3QgUE9JTlQmIHBoYXNlKQoreworICAgIGludCBkc3RZID0g
ZGVzdFJlY3QudG9wOworICAgIGZvciAoaW50IHNvdXJjZVkgPSBwaGFzZS55OyBkc3RZIDwgZGVz
dFJlY3QuYm90dG9tOyApIHsKKyAgICAgICAgaW50IHNvdXJjZUggPSBzdGQ6Om1pbjxpbnQ+KGJt
cFNpemUuY3kgLSBzb3VyY2VZLCBkZXN0UmVjdC5ib3R0b20gLSBkc3RZKTsKKyAgICAgICAgaW50
IGRzdFggPSBkZXN0UmVjdC5sZWZ0OworICAgICAgICBmb3IgKGludCBzb3VyY2VYID0gcGhhc2Uu
eDsgZHN0WCA8IGRlc3RSZWN0LnJpZ2h0OyApIHsKKyAgICAgICAgICAgIGludCBzb3VyY2VXID0g
c3RkOjptaW48aW50PihibXBTaXplLmN4IC0gc291cmNlWCwgZGVzdFJlY3QucmlnaHQgLSBkc3RY
KTsKKworICAgICAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFgsIGRzdFksIHNvdXJjZVcs
IHNvdXJjZUgsIHNvdXJjZVgsIHNvdXJjZVksIHNvdXJjZVcsIHNvdXJjZUgKKyAgICAgICAgICAg
ICAgICAsIGJtcC0+Ynl0ZXMoKSwgJmJtcC0+Yml0bWFwSW5mbygpLCBESUJfUkdCX0NPTE9SUywg
U1JDQ09QWSk7CisKKyAgICAgICAgICAgIGRzdFggKz0gc291cmNlVzsKKyAgICAgICAgICAgIHNv
dXJjZVggPSAwOworICAgICAgICB9CisKKyAgICAgICAgZHN0WSArPSBzb3VyY2VIOworICAgICAg
ICBzb3VyY2VZID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgbm9ybWFsaXplUGhhc2UoTE9ORyYgcGhh
c2UsIGludCBsaW1pdCkKK3sKKyAgICBpZiAoIXBoYXNlKQorICAgICAgICByZXR1cm47CisgICAg
aWYgKGxpbWl0IDwgMikgeworICAgICAgICBwaGFzZSA9IDA7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisgICAgaWYgKGxpbWl0ID09IDIpIHsKKyAgICAgICAgcGhhc2UgPSBwaGFzZSAmIDE7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBoYXNlIDwgMCkgeworICAgICAgICBwaGFz
ZSA9IC1waGFzZTsKKyAgICAgICAgaWYgKHBoYXNlID4gbGltaXQpCisgICAgICAgICAgICBwaGFz
ZSA9IChMT05HKSgodW5zaWduZWQpcGhhc2UgJSAodW5zaWduZWQpbGltaXQpOworICAgICAgICBp
ZiAocGhhc2UpCisgICAgICAgICAgICBwaGFzZSA9IGxpbWl0IC0gcGhhc2U7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgaWYgKHBoYXNlIDwgbGltaXQpCisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIHBoYXNlID0gKExPTkcpKCh1bnNpZ25lZClwaGFzZSAlICh1bnNpZ25lZClsaW1pdCk7Cisg
ICAgfQorfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6ZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0
KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IFRyYW5zZm9ybWF0aW9u
TWF0cml4JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
RmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3Qm
IGRlc3RSZWN0LCBjb25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSkKK3sKKyAgICBpZiAoIW1f
cGl4ZWxzKQorICAgICAgICByZXR1cm47CisgICAgY3R4dC0+ZHJhd0JpdG1hcFBhdHRlcm4odGhp
cywgdGlsZVJlY3RJbiwgcGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIG9wLCBkZXN0UmVjdCwgb3Jp
Z1NvdXJjZVNpemUpOworfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6ZHJhd1BhdHRlcm4oSERDIGhk
YywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgRmxvYXRSZWN0
JiB0aWxlUmVjdEluLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9y
bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21w
b3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6
ZSYgb3JpZ1NvdXJjZVNpemUpCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKGdfZHJhd1BhdHRlcm4pIHsKKyAgICAgICAgZ19kcmF3UGF0dGVybih0aGlz
LCBoZGMsIHRyYW5zZm9ybSwgdGlsZVJlY3RJbiwgcGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIG9w
LCBkZXN0UmVjdCwgb3JpZ1NvdXJjZVNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgaWYgKHRpbGVSZWN0SW4ud2lkdGgoKSA8PSAwIHx8IHRpbGVSZWN0SW4uaGVpZ2h0KCkgPD0g
MCkKKyAgICAgICAgcmV0dXJuOworCisgICAgYm9vbCB1c2VBbHBoYSA9IG9wID09IENvbXBvc2l0
ZVNvdXJjZU92ZXIgJiYgaGFzQWxwaGEoKSAmJiBpczMyYml0KCk7CisKKyAgICBpbnQgYm1wV2lk
dGggPSB3aWR0aCgpOworICAgIGludCBibXBIZWlnaHQgPSBoZWlnaHQoKTsKKworICAgIEZsb2F0
UmVjdCB0aWxlUmVjdCh0aWxlUmVjdEluKTsKKyAgICBpZiAoYm1wV2lkdGggIT0gb3JpZ1NvdXJj
ZVNpemUud2lkdGgoKSkgeworICAgICAgICBkb3VibGUgcmF0ZSA9IChkb3VibGUpYm1wV2lkdGgg
LyBvcmlnU291cmNlU2l6ZS53aWR0aCgpOworICAgICAgICBkb3VibGUgdGVtcCA9IHRpbGVSZWN0
LndpZHRoKCkgKiByYXRlOworICAgICAgICB0aWxlUmVjdC5zZXRYKHRpbGVSZWN0LngoKSAqIHJh
dGUpOworICAgICAgICB0aWxlUmVjdC5zZXRXaWR0aCh0ZW1wKTsKKyAgICAgICAgdGVtcCA9IHRp
bGVSZWN0LmhlaWdodCgpICogcmF0ZTsKKyAgICAgICAgdGlsZVJlY3Quc2V0WSh0aWxlUmVjdC55
KCkgKiByYXRlKTsKKyAgICAgICAgdGlsZVJlY3Quc2V0SGVpZ2h0KHRlbXApOworICAgIH0KKwor
ICAgIE93blB0cjxIQklUTUFQPiBjbGlwcGVkQm1wOworCisgICAgaWYgKHRpbGVSZWN0LngoKSB8
fCB0aWxlUmVjdC55KCkgfHwgdGlsZVJlY3Qud2lkdGgoKSAhPSBibXBXaWR0aCB8fCB0aWxlUmVj
dC5oZWlnaHQoKSAhPSBibXBIZWlnaHQpIHsKKyAgICAgICAgQml0bWFwSW5mbyBwYXR0ZXJuQm1w
SW5mbzsKKyAgICAgICAgdm9pZCogcGF0dGVyblBpeGVsczsKKyAgICAgICAgY2xpcHBlZEJtcC5z
ZXQoY2xpcEJpdG1hcChJbnRSZWN0KHRpbGVSZWN0KSwgdXNlQWxwaGEsIHBhdHRlcm5CbXBJbmZv
LCBwYXR0ZXJuUGl4ZWxzKSk7CisgICAgICAgIGlmICghY2xpcHBlZEJtcCkKKyAgICAgICAgICAg
IHJldHVybjsKKworICAgICAgICBibXBXaWR0aCA9IHRpbGVSZWN0LndpZHRoKCk7CisgICAgICAg
IGJtcEhlaWdodCA9IHRpbGVSZWN0LmhlaWdodCgpOworICAgIH0KKworICAgIFRyYW5zZm9ybWF0
aW9uTWF0cml4IHRmID0gdHJhbnNmb3JtOworICAgIHRmICo9IHBhdHRlcm5UcmFuc2Zvcm07CisK
KyAgICBGbG9hdFJlY3QgdHJSZWN0ID0gdGYubWFwUmVjdChkZXN0UmVjdCk7CisKKyAgICBSRUNU
IGNsaXBCb3g7CisgICAgaW50IGNsaXBUeXBlID0gR2V0Q2xpcEJveChoZGMsICZjbGlwQm94KTsK
KyAgICBpZiAoY2xpcFR5cGUgPT0gU0lNUExFUkVHSU9OKQorICAgICAgICB0clJlY3QuaW50ZXJz
ZWN0KEZsb2F0UmVjdChjbGlwQm94LmxlZnQsIGNsaXBCb3gudG9wLCBjbGlwQm94LnJpZ2h0IC0g
Y2xpcEJveC5sZWZ0LCBjbGlwQm94LmJvdHRvbSAtIGNsaXBCb3gudG9wKSk7CisgICAgZWxzZSBp
ZiAoY2xpcFR5cGUgPT0gQ09NUExFWFJFR0lPTikgeworICAgICAgICBPd25QdHI8SFJHTj4gY2xp
cFJnbihDcmVhdGVSZWN0UmduKDAsIDAsIDAsIDApKTsKKyAgICAgICAgaWYgKEdldENsaXBSZ24o
aGRjLCBjbGlwUmduLmdldCgpKSA+IDApIHsKKyAgICAgICAgICAgIERXT1JEIHJlZ2lvbkRhdGFT
aXplID0gR2V0UmVnaW9uRGF0YShjbGlwUmduLmdldCgpLCBzaXplb2YoUkdOREFUQSksIDApOwor
ICAgICAgICAgICAgaWYgKHJlZ2lvbkRhdGFTaXplKSB7CisgICAgICAgICAgICAgICAgUkdOREFU
QSogcmVnaW9uRGF0YSA9IG5ldyBSR05EQVRBW3JlZ2lvbkRhdGFTaXplXTsKKyAgICAgICAgICAg
ICAgICBHZXRSZWdpb25EYXRhKGNsaXBSZ24uZ2V0KCksIHJlZ2lvbkRhdGFTaXplLCByZWdpb25E
YXRhKTsKKyAgICAgICAgICAgICAgICBSRUNUKiByZWN0ID0gKFJFQ1QqKXJlZ2lvbkRhdGEtPkJ1
ZmZlcjsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVnaW9uRGF0
YS0+cmRoLm5Db3VudDsgKytpLCArK3JlY3QpCisgICAgICAgICAgICAgICAgICAgIHRyUmVjdC5p
bnRlcnNlY3QoRmxvYXRSZWN0KHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQgLSBy
ZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSByZWN0LT50b3ApKTsKKyAgICAgICAgICAgICAgICBk
ZWxldGVbXSByZWdpb25EYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisg
ICAgaWYgKHRyUmVjdC53aWR0aCgpIDw9IDAgfHwgdHJSZWN0LmhlaWdodCgpIDw9IDApCisgICAg
ICAgIHJldHVybjsKKworICAgIHRyUmVjdC5pbmZsYXRlKDEpOworICAgIEludFJlY3QgdmlzaWJs
ZURzdFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KHRmLmludmVyc2UoKS5tYXBSZWN0KHRyUmVjdCkp
OworICAgIHZpc2libGVEc3RSZWN0LmludGVyc2VjdChJbnRSZWN0KGRlc3RSZWN0KSk7CisKKyAg
ICBpZiAodmlzaWJsZURzdFJlY3Qud2lkdGgoKSA8PSAwIHx8IHZpc2libGVEc3RSZWN0LmhlaWdo
dCgpIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIHRyUmVjdCA9IHRmLm1hcFJlY3Qodmlz
aWJsZURzdFJlY3QpOworICAgIFJFQ1QgZHN0UmVjdFdpbiA9CisgICAgeworICAgICAgICBzdGFi
bGVSb3VuZCh0clJlY3QueCgpKSwKKyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0LnkoKSksCisg
ICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC5yaWdodCgpKSwKKyAgICAgICAgc3RhYmxlUm91bmQo
dHJSZWN0LmJvdHRvbSgpKSwKKyAgICB9OworICAgIGlmIChkc3RSZWN0V2luLnJpZ2h0IDw9IGRz
dFJlY3RXaW4ubGVmdCB8fCBkc3RSZWN0V2luLmJvdHRvbSA8PSBkc3RSZWN0V2luLnRvcCkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgU0laRSBibXBTaXplID0geyBibXBXaWR0aCwgYm1wSGVpZ2h0
IH07CisKKyAgICAvLyBSZWxhdGl2ZSB0byBkZXN0aW5hdGlvbiwgaW4gYml0bWFwIHBpeGVscwor
ICAgIFBPSU5UIHBoYXNlV2luID0geyBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC54KCkgLSBw
aGFzZS54KCkpLCBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC55KCkgLSBwaGFzZS55KCkpIH07
CisgICAgbm9ybWFsaXplUGhhc2UocGhhc2VXaW4ueCwgYm1wU2l6ZS5jeCk7CisgICAgbm9ybWFs
aXplUGhhc2UocGhhc2VXaW4ueSwgYm1wU2l6ZS5jeSk7CisKKyAgICB7CisgICAgICAgIFJFQ1Qg
c3JjUmVjdFdpbiA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwLAor
ICAgICAgICAgICAgc3RhYmxlUm91bmQodmlzaWJsZURzdFJlY3QucmlnaHQoKSkgLSBzdGFibGVS
b3VuZCh2aXNpYmxlRHN0UmVjdC54KCkpLAorICAgICAgICAgICAgc3RhYmxlUm91bmQodmlzaWJs
ZURzdFJlY3QuYm90dG9tKCkpIC0gc3RhYmxlUm91bmQodmlzaWJsZURzdFJlY3QueSgpKQorICAg
ICAgICB9OworICAgICAgICBpZiAoc3JjUmVjdFdpbi5yaWdodCA8PSAwIHx8IHNyY1JlY3RXaW4u
Ym90dG9tIDw9IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgQml0bWFwSW5mbyBi
bXBJbmZvKCF1c2VBbHBoYSwgc3JjUmVjdFdpbi5yaWdodCwgc3JjUmVjdFdpbi5ib3R0b20pOwor
ICAgICAgICB2b2lkKiBwaXhlbHM7CisgICAgICAgIE93blB0cjxIQklUTUFQPiBoYm1wVGVtcChN
ZW1vcnlNYW5hZ2VyOjpjcmVhdGVESUJTZWN0aW9uKCZibXBJbmZvLCAmcGl4ZWxzKSk7CisKKyAg
ICAgICAgaWYgKGhibXBUZW1wKSB7CisgICAgICAgICAgICBPd25QdHI8SERDPiBobWVtZGMoQ3Jl
YXRlQ29tcGF0aWJsZURDKGhkYykpOworICAgICAgICAgICAgSEdESU9CSiBvbGRCbXAgPSBTZWxl
Y3RPYmplY3QoaG1lbWRjLmdldCgpLCBoYm1wVGVtcC5nZXQoKSk7CisgICAgICAgICAgICBpZiAo
Y2xpcHBlZEJtcCkKKyAgICAgICAgICAgICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0
KCksIHNyY1JlY3RXaW4sIGNsaXBwZWRCbXAuZ2V0KCksIHBoYXNlV2luKTsKKyAgICAgICAgICAg
IGVsc2UgaWYgKChvcCAhPSBDb21wb3NpdGVTb3VyY2VPdmVyIHx8IGNhblVzZURJQml0cygpKSAm
JiBzcmNSZWN0V2luLnJpZ2h0IDw9IGJtcFNpemUuY3ggKiAyICYmIHNyY1JlY3RXaW4uYm90dG9t
IDw9IGJtcFNpemUuY3kgKiAyKQorICAgICAgICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGht
ZW1kYy5nZXQoKSwgc3JjUmVjdFdpbiwgdGhpcywgYm1wU2l6ZSwgcGhhc2VXaW4pOworICAgICAg
ICAgICAgZWxzZSBpZiAoZW5zdXJlSGFuZGxlKCkpCisgICAgICAgICAgICAgICAgZHJhd1BhdHRl
cm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNSZWN0V2luLCBnZXRIYW5kbGUoKSwgcGhhc2VXaW4p
OworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdm9pZCogcGl4ZWxzOworICAg
ICAgICAgICAgICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICAgICAgICAgICAgICBpZiAoSEJJ
VE1BUCBoYm1wID0gY3JlYXRlSGFuZGxlKCZwaXhlbHMsICZibXBJbmZvLCAtMSwgZmFsc2UpKSB7
CisgICAgICAgICAgICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwgc3Jj
UmVjdFdpbiwgaGJtcCwgcGhhc2VXaW4pOworICAgICAgICAgICAgICAgICAgICBEZWxldGVPYmpl
Y3QoaGJtcCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAg
U2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgb2xkQm1wKTsKKyAgICAgICAgICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmIGRlZmluZWQo
Tk9fQUxQSEFCTEVORCkKKyAgICAgICAgICAgIGlmICh1c2VBbHBoYSB8fChvcCA9PSBDb21wb3Np
dGVTb3VyY2VPdmVyICYmIHVzZXNUcmFuc3BhcmVudENvbG9yKCkpKQorI2Vsc2UKKyAgICAgICAg
ICAgIGlmICh1c2VBbHBoYSkgeworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBCTEVOREZV
TkNUSU9OIGJsZW5kID0geyBBQ19TUkNfT1ZFUiwgMCwgMjU1LCBBQ19TUkNfQUxQSEEgfTsKKyAg
ICAgICAgICAgICAgICBBbHBoYUJsZW5kKGhkYywgZHN0UmVjdFdpbi5sZWZ0LCBkc3RSZWN0V2lu
LnRvcCwgZHN0UmVjdFdpbi5yaWdodCAtIGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi5ib3R0
b20gLSBkc3RSZWN0V2luLnRvcAorICAgICAgICAgICAgICAgICAgICAsIGhtZW1kYy5nZXQoKSwg
MCwgMCwgc3JjUmVjdFdpbi5yaWdodCwgc3JjUmVjdFdpbi5ib3R0b20sIGJsZW5kKTsKKyAgICAg
ICAgICAgIH0gZWxzZSBpZiAob3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciAmJiB1c2VzVHJhbnNw
YXJlbnRDb2xvcigpKQorI2VuZGlmCisgICAgICAgICAgICAgICAgVHJhbnNwYXJlbnRCbHQoaGRj
LCBkc3RSZWN0V2luLmxlZnQsIGRzdFJlY3RXaW4udG9wLCBkc3RSZWN0V2luLnJpZ2h0IC0gZHN0
UmVjdFdpbi5sZWZ0CisgICAgICAgICAgICAgICAgICAgICwgZHN0UmVjdFdpbi5ib3R0b20gLSBk
c3RSZWN0V2luLnRvcCwgaG1lbWRjLmdldCgpLCAwLCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNS
ZWN0V2luLmJvdHRvbSwgdHJhbnNwYXJlbnRDb2xvcigpKTsKKyAgICAgICAgICAgIGVsc2Ugewor
ICAgICAgICAgICAgICAgIERXT1JEIGJtcE9wID0gb3AgPT0gQ29tcG9zaXRlQ29weSA/IFNSQ0NP
UFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wID09IENvbXBvc2l0ZVNvdXJjZU92
ZXIgPyBTUkNDT1BZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcCA9PSBDb21wb3Np
dGVYT1IgPyBQQVRJTlZFUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wID09IENv
bXBvc2l0ZUNsZWFyID8gV0hJVEVORVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBT
UkNDT1BZOyAvLyBGSVhFTUU6IG90aGVyIHR5cGVzPworCisgICAgICAgICAgICAgICAgU3RyZXRj
aERJQml0cyhoZGMsIGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4u
cmlnaHQgLSBkc3RSZWN0V2luLmxlZnQKKyAgICAgICAgICAgICAgICAgICAgLCBkc3RSZWN0V2lu
LmJvdHRvbSAtIGRzdFJlY3RXaW4udG9wLCAwLCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0
V2luLmJvdHRvbQorICAgICAgICAgICAgICAgICAgICAsIHBpeGVscywgJmJtcEluZm8sIERJQl9S
R0JfQ09MT1JTLCBibXBPcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTZWxlY3RPYmpl
Y3QoaG1lbWRjLmdldCgpLCBvbGRCbXApOworICAgICAgICB9CisgICAgfQorfQorCitTaGFyZWRC
aXRtYXA6OkRDUHJvdmlkZXIgZ19kY1Byb3ZpZGVyOworU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVy
KiBTaGFyZWRCaXRtYXA6Om1fZGNQcm92aWRlciA9ICZnX2RjUHJvdmlkZXI7CisKK0hEQyBTaGFy
ZWRCaXRtYXA6OkRDUHJvdmlkZXI6OmdldERDKFNoYXJlZEJpdG1hcCogYm1wLCB1bnNpZ25lZCog
a2V5MSwgdW5zaWduZWQqIGtleTIpCit7CisgICAgaWYgKCFibXAgfHwgIWJtcC0+ZW5zdXJlSGFu
ZGxlKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgSERDIGhkYyA9IDo6Q3JlYXRlQ29tcGF0
aWJsZURDKDApOworICAgIGlmIChoZGMpIHsKKyAgICAgICAgKmtleTEgPSAodW5zaWduZWQpU2Vs
ZWN0T2JqZWN0KGhkYywgYm1wLT5nZXRIYW5kbGUoKSk7CisgICAgICAgIFJFQ1QgcmVjdCA9IHsg
MCwgMCwgYm1wLT53aWR0aCgpLCBibXAtPmhlaWdodCgpIH07CisgICAgICAgIE93blB0cjxIUkdO
PiBjbGlwUmduKENyZWF0ZVJlY3RSZ25JbmRpcmVjdCgmcmVjdCkpOworICAgICAgICBTZWxlY3RD
bGlwUmduKGhkYywgY2xpcFJnbi5nZXQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGhkYzsKK30K
Kwordm9pZCBTaGFyZWRCaXRtYXA6OkRDUHJvdmlkZXI6OnJlbGVhc2VEQyhTaGFyZWRCaXRtYXAq
LCBIREMgaGRjLCB1bnNpZ25lZCBrZXkxLCB1bnNpZ25lZCBrZXkyKQoreworICAgIGlmICghaGRj
KQorICAgICAgICByZXR1cm47CisKKyAgICBTZWxlY3RPYmplY3QoaGRjLCAoSEdESU9CSilrZXkx
KTsKKyAgICBEZWxldGVEQyhoZGMpOworfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6Y2xlYXJQaXhl
bHMoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1
cm47CisKKyAgICBJbnRSZWN0IGJtcFJlY3QoMCwgMCwgd2lkdGgoKSwgaGVpZ2h0KCkpOworICAg
IGJtcFJlY3QuaW50ZXJzZWN0KHIpOworICAgIGlmIChpczE2Yml0KCkpIHsKKyAgICAgICAgaW50
IHcgPSBtX2JtcEluZm8ucGFkZGVkV2lkdGgoKTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQqIGRz
dCA9ICh1bnNpZ25lZCBzaG9ydCopbV9waXhlbHM7CisgICAgICAgIGRzdCArPSBibXBSZWN0Lnko
KSAqIHcgKyBibXBSZWN0LngoKTsKKyAgICAgICAgaW50IHdvcmRzVG9TZXQgPSBibXBSZWN0Lndp
ZHRoKCk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBkc3RFbmQgPSBkc3QgKyBibXBS
ZWN0LmhlaWdodCgpICogdzsKKyAgICAgICAgd2hpbGUgKGRzdCA8IGRzdEVuZCkgeworICAgICAg
ICAgICAgd21lbXNldCgod2NoYXJfdCopZHN0LCAwLCB3b3Jkc1RvU2V0KTsKKyAgICAgICAgICAg
IGRzdCArPSB3OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHcgPSB3aWR0
aCgpOworICAgICAgICB1bnNpZ25lZCogZHN0ID0gKHVuc2lnbmVkKiltX3BpeGVsczsKKyAgICAg
ICAgZHN0ICs9IGJtcFJlY3QueSgpICogdyArIGJtcFJlY3QueCgpOworICAgICAgICBpbnQgd29y
ZHNUb1NldCA9IGJtcFJlY3Qud2lkdGgoKSAqIDI7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkKiBk
c3RFbmQgPSBkc3QgKyBibXBSZWN0LmhlaWdodCgpICogdzsKKyAgICAgICAgd2hpbGUgKGRzdCA8
IGRzdEVuZCkgeworICAgICAgICAgICAgd21lbXNldCgod2NoYXJfdCopZHN0LCAwLCB3b3Jkc1Rv
U2V0KTsKKyAgICAgICAgICAgIGRzdCArPSB3OworICAgICAgICB9CisgICAgfQorfQorCit9CisK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFw
LmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Njc2NDMKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oCkBAIC0wLDAg
KzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgor
ICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUg
ZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5j
bHVkZSAiQml0bWFwSW5mby5oIgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVk
ZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3aW5nZGkuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCisgICAgZW51bSBDb21wb3NpdGVPcGVyYXRvcjsKKyAgICBjbGFzcyBGbG9hdFBv
aW50OworICAgIGNsYXNzIEZsb2F0UmVjdDsKKyAgICBjbGFzcyBHcmFwaGljc0NvbnRleHQ7Cisg
ICAgY2xhc3MgSW50UmVjdDsKKyAgICBjbGFzcyBJbnRTaXplOworICAgIGNsYXNzIFRyYW5zZm9y
bWF0aW9uTWF0cml4OworCisgICAgY2xhc3MgU2hhcmVkQml0bWFwOiBwdWJsaWMgUmVmQ291bnRl
ZDxTaGFyZWRCaXRtYXA+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIH5TaGFyZWRCaXRtYXAoKTsK
KyAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8U2hhcmVkQml0bWFwPiBjcmVhdGVJbnN0YW5jZShi
b29sIGlzMTZiaXQsIGludCB3LCBpbnQgaCwgYm9vbCBpbml0UGl4ZWxzKTsKKyAgICAgICAgY29u
c3QgQml0bWFwSW5mbyYgYml0bWFwSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mbzsgfQor
ICAgICAgICB2b2lkKiBieXRlcygpIHsgcmV0dXJuIG1fcGl4ZWxzOyB9CisgICAgICAgIGNvbnN0
IHZvaWQqIGJ5dGVzKCkgY29uc3QgeyByZXR1cm4gbV9waXhlbHM7IH0KKyAgICAgICAgdW5zaWdu
ZWQgd2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8ud2lkdGgoKTsgfQorICAgICAgICB1
bnNpZ25lZCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8uaGVpZ2h0KCk7IH0KKyAg
ICAgICAgdW5zaWduZWQgdmFsaWRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX3ZhbGlkSGVpZ2h0
OyB9CisgICAgICAgIHZvaWQgc2V0VmFsaWRIZWlnaHQodW5zaWduZWQgdmFsaWRIZWlnaHQpIHsg
bV92YWxpZEhlaWdodCA9IHZhbGlkSGVpZ2h0OyB9CisgICAgICAgIHZvaWQgcmVzZXRQaXhlbHMo
Ym9vbCBibGFjayA9IGZhbHNlKTsKKyAgICAgICAgdm9pZCBjbGVhclBpeGVscyhjb25zdCBJbnRS
ZWN0JiByKTsKKyAgICAgICAgYm9vbCBsb2NrZWQoKSBjb25zdCB7IHJldHVybiBtX2xvY2tlZDsg
fQorICAgICAgICB2b2lkIGxvY2soKSB7IG1fbG9ja2VkID0gdHJ1ZTsgfQorICAgICAgICB2b2lk
IHVubG9jaygpIHsgbV9sb2NrZWQgPSBmYWxzZTsgfQorICAgICAgICBib29sIGZyZWVNZW1vcnko
KTsKKyAgICAgICAgYm9vbCBpczE2Yml0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmlzMTZi
aXQoKTsgfQorICAgICAgICBib29sIGlzMzJiaXQoKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8u
aXMzMmJpdCgpOyB9CisgICAgICAgIGJvb2wgdG8xNmJpdCgpOworICAgICAgICBib29sIGhhc0Fs
cGhhKCkgY29uc3QgeyByZXR1cm4gbV9oYXNBbHBoYTsgfQorICAgICAgICB2b2lkIHNldEhhc0Fs
cGhhKGJvb2wgYWxwaGEpIHsgbV9oYXNBbHBoYSA9IGFscGhhOyB9CisgICAgICAgIGJvb2wgZW5z
dXJlSGFuZGxlKCk7CisgICAgICAgIEhCSVRNQVAgZ2V0SGFuZGxlKCkgeyByZXR1cm4gbV9oYml0
bWFwOyB9CisgICAgICAgIEhCSVRNQVAgY3JlYXRlSGFuZGxlKHZvaWQqKiBwaXhlbHMsIEJpdG1h
cEluZm8qIGJtcEluZm8sIGludCBoID0gLTEsIGJvb2wgdXNlMTZiaXQgPSB0cnVlKSBjb25zdDsK
KyAgICAgICAgYm9vbCB1c2VzVHJhbnNwYXJlbnRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdXNl
c1RyYW5zcGFyZW50Q29sb3I7IH0KKyAgICAgICAgQ09MT1JSRUYgdHJhbnNwYXJlbnRDb2xvcigp
IGNvbnN0IHsgcmV0dXJuIG1fdHJhbnNwYXJlbnRDb2xvcjsgfQorICAgICAgICB2b2lkIHNldFRy
YW5zcGFyZW50Q29sb3IoQ09MT1JSRUYgYykKKyAgICAgICAgeworICAgICAgICAgICAgbV91c2Vz
VHJhbnNwYXJlbnRDb2xvciA9IHRydWU7CisgICAgICAgICAgICBtX3RyYW5zcGFyZW50Q29sb3Ig
PSBjOworICAgICAgICB9CisgICAgICAgIGJvb2wgY2FuVXNlRElCaXRzKCkgY29uc3QgeyByZXR1
cm4gIWhhc0FscGhhKCkgJiYgIXVzZXNUcmFuc3BhcmVudENvbG9yKCk7IH0KKworICAgICAgICBI
QklUTUFQIGNsaXBCaXRtYXAoY29uc3QgSW50UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJvb2wgdXNlQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRt
YXBJbmZvJiBibXBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHBpeGVs
cyk7CisKKyAgICAgICAgUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IGNsaXBCaXRtYXAoY29uc3Qg
SW50UmVjdCYgcmVjdCwgYm9vbCB1c2VBbHBoYSk7CisKKyAgICAgICAgdm9pZCBkcmF3KEdyYXBo
aWNzQ29udGV4dCogY3R4dCwgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYg
c3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApOworICAgICAgICB2b2lkIGRy
YXdQYXR0ZXJuKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVj
dEluLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVy
YXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1Nv
dXJjZVNpemUpOworICAgICAgICB2b2lkIGRyYXcoSERDLCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0
LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCk7
CisgICAgICAgIHZvaWQgZHJhd1BhdHRlcm4oSERDLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCYsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRy
aXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9h
dFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVz
dFJlY3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKTsKKworICAgICAgICB0eXBlZGVm
IHZvaWQgKCpEcmF3UGF0dGVybkZ1bmMpKFNoYXJlZEJpdG1hcCogYm1wLCBIREMsIGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29u
c3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpOwor
ICAgICAgICB0eXBlZGVmIGJvb2wgKCpEcmF3SW1hZ2VGdW5jKSAoU2hhcmVkQml0bWFwKiBibXAs
IEhEQywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29t
cG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApOworCisgICAgICAgIHN0YXRpYyBEcmF3UGF0dGVy
bkZ1bmMgc2V0RHJhd1BhdHRlcm5GdW5jKERyYXdQYXR0ZXJuRnVuYyBmdW5jKTsKKyAgICAgICAg
c3RhdGljIERyYXdJbWFnZUZ1bmMgc2V0RHJhd0ltYWdlRnVuYyhEcmF3SW1hZ2VGdW5jIGZ1bmMp
OworCisgICAgICAgIGNsYXNzIERDUHJvdmlkZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAg
ICAgICB2aXJ0dWFsIEhEQyBnZXREQyhTaGFyZWRCaXRtYXAqLCB1bnNpZ25lZCoga2V5MSwgdW5z
aWduZWQqIGtleTIpOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VEQyhTaGFyZWRC
aXRtYXAqLCBIREMgaGRjLCB1bnNpZ25lZCBrZXkxLCB1bnNpZ25lZCBrZXkyKTsKKyAgICAgICAg
fTsKKworICAgICAgICBzdGF0aWMgRENQcm92aWRlciogbV9kY1Byb3ZpZGVyOworCisgICAgICAg
IEhEQyBnZXREQyh1bnNpZ25lZCoga2V5MSwgdW5zaWduZWQqIGtleTIpIHsgcmV0dXJuIG1fZGNQ
cm92aWRlci0+Z2V0REModGhpcywga2V5MSwga2V5Mik7IH0KKyAgICAgICAgdm9pZCByZWxlYXNl
REMoSERDIGhkYywgdW5zaWduZWQga2V5MSwgdW5zaWduZWQga2V5MikgeyBtX2RjUHJvdmlkZXIt
PnJlbGVhc2VEQyh0aGlzLCBoZGMsIGtleTEsIGtleTIpOyB9CisKKyAgICAgICAgY2xhc3MgRENI
b2xkZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBEQ0hvbGRlcihTaGFyZWRCaXRt
YXAqIGJtcCA9IDApIHsgX3NldChibXApOyB9CisgICAgICAgICAgICB+RENIb2xkZXIoKSB7IF9j
bGVhcigpOyB9CisgICAgICAgICAgICB2b2lkIHNldChTaGFyZWRCaXRtYXAqIGJtcCA9IDApCisg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2NsZWFyKCk7CisgICAgICAgICAgICAgICAg
X3NldChibXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSERDIGdldCgpIGNvbnN0IHsg
cmV0dXJuIG1faGRjOyB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBEQ0hvbGRlciYg
b3BlcmF0b3I9KGNvbnN0IERDSG9sZGVyJik7CisgICAgICAgICAgICBEQ0hvbGRlcihjb25zdCBE
Q0hvbGRlciYpOworICAgICAgICAgICAgdm9pZCBfY2xlYXIoKQorICAgICAgICAgICAgeworICAg
ICAgICAgICAgICAgIGlmIChtX2hkYykKKyAgICAgICAgICAgICAgICAgICAgbV9iaXRtYXAtPnJl
bGVhc2VEQyhtX2hkYywgbV9rZXkxLCBtX2tleTIpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgdm9pZCBfc2V0KFNoYXJlZEJpdG1hcCogYm1wKQorICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgIG1fYml0bWFwID0gYm1wOworICAgICAgICAgICAgICAgIG1faGRjID0gYm1wID8gYm1w
LT5nZXREQygmbV9rZXkxLCAmbV9rZXkyKSA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBTaGFyZWRCaXRtYXAqIG1fYml0bWFwOworICAgICAgICAgICAgSERDIG1faGRjOworICAgICAg
ICAgICAgdW5zaWduZWQgbV9rZXkxOworICAgICAgICAgICAgdW5zaWduZWQgbV9rZXkyOworICAg
ICAgICB9OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgZXhwbGljaXQgU2hhcmVkQml0bWFwKGJv
b2wgaXMxNmJpdCwgaW50IHcsIGludCBoLCBib29sIGluaXRQaXhlbHMpOworICAgICAgICBleHBs
aWNpdCBTaGFyZWRCaXRtYXAoY29uc3QgQml0bWFwSW5mbyYgYm1wSW5mbywgSEJJVE1BUCBoYm1w
LCB2b2lkKiBwaXhlbHMpOworICAgICAgICBCaXRtYXBJbmZvIG1fYm1wSW5mbzsKKyAgICAgICAg
aW50IG1fcmVmZXJlbmNlOworICAgICAgICBIQklUTUFQIG1faGJpdG1hcDsKKyAgICAgICAgdm9p
ZCogbV9waXhlbHM7CisgICAgICAgIENPTE9SUkVGIG1fdHJhbnNwYXJlbnRDb2xvcjsKKyAgICAg
ICAgaW50IG1fdmFsaWRIZWlnaHQ7CisgICAgICAgIGJvb2wgbV9sb2NrZWQ7CisgICAgICAgIGJv
b2wgbV91c2VzVHJhbnNwYXJlbnRDb2xvcjsKKyAgICAgICAgYm9vbCBtX2hhc0FscGhhOworICAg
IH07CisKK30K
</data>
<flag name="review"
          id="18972"
          type_id="1"
          status="-"
          setter="abarth"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34769</attachid>
            <date>2009-08-13 12:29:47 -0700</date>
            <delta_ts>2010-10-23 05:43:26 -0700</delta_ts>
            <desc>2) ImageWince.cpp</desc>
            <filename>28272_2.patch</filename>
            <type>text/plain</type>
            <size>8267</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
OWRmNGFhYy4uYTUyYjc1NiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0wOC0xMyAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEltYWdlV2luY2UuY3BwIGNvbnRhaW5zIGltcGxl
bWVudGF0aW9uCisgICAgICAgIG9mIHNvbWUgcGxhdGZvcm0tc3BlY2lmaWMgQml0bWFwSW1hZ2Ug
bWV0aG9kcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MjgyNzIKKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlV2luY2UuY3Bw
OiBBZGRlZC4KKwogMjAwOS0wOC0xMyAgU3RldmUgQmxvY2sgIDxzdGV2ZWJsb2NrQGdvb2dsZS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0ltYWdlV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9JbWFnZVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi4zMmY3N2EzCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9JbWFnZVdpbmNlLmNwcApAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKworI2luY2x1ZGUgIkJpdG1h
cEltYWdlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiTm90SW1w
bGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNoYXJl
ZEJ1ZmZlci5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSA8
d3RmL093blB0ci5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCitzdGF0aWMgaW5saW5lIGlu
dCBzdGFibGVSb3VuZChkb3VibGUgZCkKK3sKKyAgICBpZiAoZCA+IDApCisgICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxpbnQ+KGQgKyAwLjUpOworCisgICAgaW50IGkgPSBzdGF0aWNfY2FzdDxp
bnQ+KGQpOworICAgIHJldHVybiBpIC0gZCA+IDAuNSA/IGkgLSAxIDogaTsKK30KKworLy8gVGhp
cyBmdW5jdGlvbiBsb2FkcyByZXNvdXJjZXMgZnJvbSBXZWJLaXQKK1Bhc3NSZWZQdHI8V2ViQ29y
ZTo6U2hhcmVkQnVmZmVyPiBsb2FkUmVzb3VyY2VJbnRvQnVmZmVyKGNvbnN0IGNoYXIqIG5hbWUp
OworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Jvb2wgRnJhbWVEYXRhOjpjbGVhcihib29sIGNs
ZWFyTWV0YURhdGEpCit7CisgICAgaWYgKGNsZWFyTWV0YURhdGEpCisgICAgICAgIG1faGF2ZU1l
dGFkYXRhID0gZmFsc2U7CisKKyAgICBpZiAobV9mcmFtZSkgeworICAgICAgICBtX2ZyYW1lID0g
MDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIEJpdG1hcEltYWdlOjppbml0UGxhdGZvcm1EYXRhKCkKK3sKK30KKwordm9pZCBCaXRt
YXBJbWFnZTo6aW52YWxpZGF0ZVBsYXRmb3JtRGF0YSgpCit7Cit9CisKK2Jvb2wgQml0bWFwSW1h
Z2U6OmdldEhCSVRNQVAoSEJJVE1BUCBibXApCit7CisgICAgcmV0dXJuIGdldEhCSVRNQVBPZlNp
emUoYm1wLCAwKTsKK30KKworYm9vbCBCaXRtYXBJbWFnZTo6Z2V0SEJJVE1BUE9mU2l6ZShIQklU
TUFQIGJtcCwgTFBTSVpFIHNpemUpCit7CisgICAgaWYgKCFibXApCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIEJJVE1BUCBibXBJbmZvOworICAgIEdldE9iamVjdChibXAsIHNpemVvZihC
SVRNQVApLCAmYm1wSW5mbyk7CisKKyAgICBBU1NFUlQoYm1wSW5mby5ibUJpdHNQaXhlbCA9PSAz
Mik7CisgICAgaW50IGJ1ZmZlclNpemUgPSBibXBJbmZvLmJtV2lkdGhCeXRlcyAqIGJtcEluZm8u
Ym1IZWlnaHQ7CisKKyAgICBPd25QdHI8SERDPiBoZGMoQ3JlYXRlQ29tcGF0aWJsZURDKDApKTsK
KyAgICBIR0RJT0JKIGhPbGRCbXAgPSBTZWxlY3RPYmplY3QoaGRjLmdldCgpLCBibXApOworCisg
ICAgeworICAgICAgICBHcmFwaGljc0NvbnRleHQgZ2MoaGRjLmdldCgpKTsKKworICAgICAgICBJ
bnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcEltYWdlOjpzaXplKCk7CisgICAgICAgIGlmIChzaXpl
KQorICAgICAgICAgICAgZHJhd0ZyYW1lTWF0Y2hpbmdTb3VyY2VTaXplKCZnYywgRmxvYXRSZWN0
KDAsIDAsIGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEludFNpemUoKnNpemUp
LCBDb21wb3NpdGVDb3B5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZHJhdygmZ2MsIEZs
b2F0UmVjdCgwLCAwLCBibXBJbmZvLmJtV2lkdGgsIGJtcEluZm8uYm1IZWlnaHQpLCBGbG9hdFJl
Y3QoMCwgMCwgaW1hZ2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIENvbXBvc2l0
ZUNvcHkpOworICAgIH0KKworICAgIFNlbGVjdE9iamVjdChoZGMuZ2V0KCksIGhPbGRCbXApOwor
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNo
aW5nU291cmNlU2l6ZShHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0
UmVjdCwgY29uc3QgSW50U2l6ZSYgc3JjU2l6ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRl
T3ApCit7CisgICAgaW50IGZyYW1lcyA9IGZyYW1lQ291bnQoKTsKKyAgICBmb3IgKGludCBpID0g
MDsgaSA8IGZyYW1lczsgKytpKSB7CisgICAgICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCA9
IGZyYW1lQXRJbmRleChpKTsKKyAgICAgICAgaWYgKGJtcCAmJiBibXAtPmhlaWdodCgpID09IChz
aXplX3Qpc3JjU2l6ZS5oZWlnaHQoKSAmJiBibXAtPndpZHRoKCkgPT0gKHNpemVfdClzcmNTaXpl
LndpZHRoKCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRG
cmFtZTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gaTsKKyAgICAgICAgICAgIGRyYXco
Y3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0KDAsIDAsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5o
ZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKKyAgICAgICAgICAgIG1fY3VycmVudEZyYW1lID0gY3Vy
cmVudEZyYW1lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAg
Ly8gTm8gaW1hZ2Ugb2YgdGhlIGNvcnJlY3Qgc2l6ZSB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGRy
YXdpbmcgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICBJbnRTaXplIGltYWdlU2l6ZSA9IEJpdG1hcElt
YWdlOjpzaXplKCk7CisgICAgZHJhdyhjdHh0LCBkc3RSZWN0LCBGbG9hdFJlY3QoMCwgMCwgaW1h
Z2VTaXplLndpZHRoKCksIGltYWdlU2l6ZS5oZWlnaHQoKSksIGNvbXBvc2l0ZU9wKTsKK30KKwor
dm9pZCBCaXRtYXBJbWFnZTo6ZHJhdyhHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0
UmVjdCYgZHN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0SW4sIENvbXBvc2l0ZU9wZXJh
dG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGlmICghbV9zb3VyY2UuaW5pdGlhbGl6ZWQoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgc3RhcnRBbmltYXRpb24oKTsKKworICAgIGlmIChtYXlGaWxs
V2l0aFNvbGlkQ29sb3IoKSkgeworICAgICAgICBmaWxsV2l0aFNvbGlkQ29sb3IoY3R4dCwgZHN0
UmVjdCwgc29saWRDb2xvcigpLCBjb21wb3NpdGVPcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisgICAgCisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gYm1wID0gZnJhbWVBdEluZGV4KG1fY3Vy
cmVudEZyYW1lKTsKKworICAgIEludFJlY3QgaW50U3JjUmVjdChzcmNSZWN0SW4pOworICAgIGlm
IChibXAtPndpZHRoKCkgIT0gbV9zb3VyY2Uuc2l6ZSgpLndpZHRoKCkpIHsKKyAgICAgICAgZG91
YmxlIHJhdGUgPSAoZG91YmxlKWJtcC0+d2lkdGgoKSAvIG1fc291cmNlLnNpemUoKS53aWR0aCgp
OworICAgICAgICBpbnQgdGVtcCA9IHN0YWJsZVJvdW5kKHNyY1JlY3RJbi5yaWdodCgpICogcmF0
ZSk7CisgICAgICAgIGludFNyY1JlY3Quc2V0WChzdGFibGVSb3VuZChzcmNSZWN0SW4ueCgpICog
cmF0ZSkpOworICAgICAgICBpbnRTcmNSZWN0LnNldFdpZHRoKHRlbXAgLSBpbnRTcmNSZWN0Lngo
KSk7CisgICAgICAgIHRlbXAgPSBzdGFibGVSb3VuZChzcmNSZWN0SW4uYm90dG9tKCkgKiByYXRl
KTsKKyAgICAgICAgaW50U3JjUmVjdC5zZXRZKHN0YWJsZVJvdW5kKHNyY1JlY3RJbi55KCkgKiBy
YXRlKSk7CisgICAgICAgIGludFNyY1JlY3Quc2V0SGVpZ2h0KHRlbXAgLSBpbnRTcmNSZWN0Lnko
KSk7CisgICAgfQorCisgICAgYm1wLT5kcmF3KGN0eHQsIGVuY2xvc2luZ0ludFJlY3QoZHN0UmVj
dCksIGludFNyY1JlY3QsIGNvbXBvc2l0ZU9wKTsKK30KKworUGFzc1JlZlB0cjxJbWFnZT4gSW1h
Z2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgUmVmUHRy
PFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0gbG9hZFJlc291cmNlSW50b0J1ZmZlcihuYW1lKTsKKyAg
ICBSZWZQdHI8Qml0bWFwSW1hZ2U+IGltZyA9IEJpdG1hcEltYWdlOjpjcmVhdGUoKTsKKyAgICBp
bWctPnNldERhdGEoYnVmZmVyLnJlbGVhc2UoKSwgdHJ1ZSk7CisgICAgcmV0dXJuIGltZzsKK30K
Kwordm9pZCBJbWFnZTo6ZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBG
bG9hdFJlY3QmIHRpbGVSZWN0LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcGF0dGVyblRy
YW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNl
LCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCkKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEJpdG1hcEltYWdlOjpkcmF3UGF0dGVybihH
cmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3Qg
VHJhbnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNv
bnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QpCit7CisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gYm1w
ID0gbmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKyAgICBpZiAoYm1wKQorICAgICAgICBi
bXAtPmRyYXdQYXR0ZXJuKGN0eHQsIHRpbGVSZWN0SW4sIHBhdHRlcm5UcmFuc2Zvcm0sIHBoYXNl
LCBvcCwgZGVzdFJlY3QsIG1fc291cmNlLnNpemUoKSk7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6
OmNoZWNrRm9yU29saWRDb2xvcigpCit7CisgICAgaWYgKG1fY2hlY2tlZEZvclNvbGlkQ29sb3Ip
CisgICAgICAgIHJldHVybjsKKworICAgIGlmIChmcmFtZUNvdW50KCkgIT0gMSkgeworICAgICAg
ICBtX2lzU29saWRDb2xvciA9IGZhbHNlOworICAgICAgICBtX2NoZWNrZWRGb3JTb2xpZENvbG9y
ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFJlZlB0cjxTaGFyZWRCaXRt
YXA+IGJtcCA9IGZyYW1lQXRJbmRleCgwKTsKKyAgICBpZiAoIWJtcCB8fCAhYm1wLT52YWxpZEhl
aWdodCgpKSB7CisgICAgICAgIG1faXNTb2xpZENvbG9yID0gZmFsc2U7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAoYm1wLT53aWR0aCgpID09IDEgJiYgYm1wLT52YWxpZEhlaWdo
dCgpID09IDEpIHsKKyAgICAgICAgbV9pc1NvbGlkQ29sb3IgPSB0cnVlOworCisgICAgICAgIGlm
IChibXAtPmlzMTZiaXQoKSkgeworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgYyA9ICgodW5z
aWduZWQgc2hvcnQgKilibXAtPmJ5dGVzKCkpWzBdOworI2lmIElNQUdFX05PX0FMUEhBX1VTRV9S
R0I1NTUKKyAgICAgICAgICAgIGludCByID0gKGMgPj4gNykgJiAweEY4OworICAgICAgICAgICAg
aW50IGcgPSAoYyA+PiAyKSAmIDB4Rjg7CisgICAgICAgICAgICBpbnQgYiA9IChjIDw8IDMpICYg
MHhGODsKKyNlbHNlCisgICAgICAgICAgICBpbnQgciA9IChjID4+IDgpICYgMHhGODsKKyAgICAg
ICAgICAgIGludCBnID0gKGMgPj4gMykgJiAweEZDOworICAgICAgICAgICAgaW50IGIgPSAoYyA8
PCAzKSAmIDB4Rjg7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChibXAtPnVzZXNUcmFuc3BhcmVu
dENvbG9yKCkgJiYgYm1wLT50cmFuc3BhcmVudENvbG9yKCkgPT0gUkdCKHIsIGcsIGIpKQorICAg
ICAgICAgICAgICAgIG1fc29saWRDb2xvciA9IENvbG9yKHIsIGcsIGIsIDApOworICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgIG1fc29saWRDb2xvciA9IENvbG9yKHIsIGcsIGIpOwor
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5zaWduZWQgYyA9ICgodW5zaWduZWQgKili
bXAtPmJ5dGVzKCkpWzBdOworICAgICAgICAgICAgbV9zb2xpZENvbG9yID0gQ29sb3IoYyk7Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoYm1wLT52YWxpZEhlaWdodCgpID09IGJtcC0+aGVpZ2h0
KCkpCisgICAgICAgICAgICBtX2NoZWNrZWRGb3JTb2xpZENvbG9yID0gdHJ1ZTsKKyAgICB9IGVs
c2UgeworICAgICAgICBtX2lzU29saWRDb2xvciA9IGZhbHNlOworICAgICAgICBtX2NoZWNrZWRG
b3JTb2xpZENvbG9yID0gdHJ1ZTsKKyAgICB9Cit9CisKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQo=
</data>
<flag name="review"
          id="18973"
          type_id="1"
          status="-"
          setter="abarth"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53310</attachid>
            <date>2010-04-13 21:31:35 -0700</date>
            <delta_ts>2010-10-23 05:43:26 -0700</delta_ts>
            <desc>1) SharedBitmap</desc>
            <filename>SharedBitmap.patch</filename>
            <type>text/plain</type>
            <size>31693</size>
            <attacher name="Kwang Yul Seo">skyul</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzU1NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDkgQEAKKzIwMTAtMDQtMTMgIEt3YW5nIFl1bCBTZW8gIDxza3l1bEBjb21wYW55
MTAwLm5ldD4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBXSU5DRSBQT1JUOiBncmFwaGljcyBmaWxlcyBvbmx5IGZvciBXSU5DRQorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjgyNzIKKworICAgICAgICBTaGFy
ZWRCaXRtYXAgaXMgYSBoZWxwZXIgY2xhc3MgdXNlZCBhcyBOYXRpdmVJbWFnZVB0ciBmb3IgV2lu
Q0UuCisgICAgICAgIEl0J3Mgd2lkZSB1c2VkIGJ5IFdpbkNFIGdyYXBoaWNzIGZpbGVzIGFzIGEg
cmVwbGFjZW1lbnQgb2YgSEJJVE1BUC4KKworICAgICAgICBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkg
WW9uZyBMaSA8eW9uZy5saUB0b3JjaG1vYmlsZS5jb20+CisKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OmJpdG1hcE1hcCk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXBMZWFrQ291bnRlcjo6
flNoYXJlZEJpdG1hcExlYWtDb3VudGVyKToKKyAgICAgICAgKFdlYkNvcmU6OmRpc2NhcmRCaXRt
YXBIYW5kbGVzKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6c2V0RHJhd0ltYWdl
RnVuYyk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OnNldERyYXdQYXR0ZXJuRnVu
Yyk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OmNyZWF0ZUluc3RhbmNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6U2hhcmVkQml0bWFwKToKKyAgICAgICAgKFdl
YkNvcmU6OlNoYXJlZEJpdG1hcDo6flNoYXJlZEJpdG1hcCk6CisgICAgICAgIChXZWJDb3JlOjpT
aGFyZWRCaXRtYXA6OnJlc2V0UGl4ZWxzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvbnZlcnQzMlRv
MTYpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjp0bzE2Yml0KToKKyAgICAgICAg
KFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6ZnJlZU1lbW9yeSk6CisgICAgICAgIChXZWJDb3JlOjpT
aGFyZWRCaXRtYXA6OmNyZWF0ZUhhbmRsZSk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRt
YXA6OmVuc3VyZUhhbmRsZSk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OmRyYXcp
OgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpjbGlwQml0bWFwKToKKyAgICAgICAg
KFdlYkNvcmU6OmRyYXdQYXR0ZXJuU2ltcGxlKToKKyAgICAgICAgKFdlYkNvcmU6Om5vcm1hbGl6
ZVBoYXNlKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6ZHJhd1BhdHRlcm4pOgor
ICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyOjpnZXREQyk6CisgICAg
ICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OkRDUHJvdmlkZXI6OnJlbGVhc2VEQyk6CisgICAg
ICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OmNsZWFyUGl4ZWxzKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6Z2V0REMpOgorICAgICAgICAo
V2ViQ29yZTo6RENQcm92aWRlcjo6cmVsZWFzZURDKToKKyAgICAgICAgKFdlYkNvcmU6OkRDUHJv
dmlkZXI6OkRDSG9sZGVyOjpEQ0hvbGRlcik6CisgICAgICAgIChXZWJDb3JlOjpEQ1Byb3ZpZGVy
OjpEQ0hvbGRlcjo6fkRDSG9sZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkRDUHJvdmlkZXI6OkRD
SG9sZGVyOjpzZXQpOgorICAgICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6RENIb2xkZXI6Omdl
dCk6CisgICAgICAgIChXZWJDb3JlOjpEQ1Byb3ZpZGVyOjpEQ0hvbGRlcjo6Y2xlYXJJbnRlcm5h
bCk6CisgICAgICAgIChXZWJDb3JlOjpEQ1Byb3ZpZGVyOjpEQ0hvbGRlcjo6c2V0SW50ZXJuYWwp
OgorCiAyMDEwLTA0LTEzICBHZW9mZnJleSBHYXJlbiAgPGdnYXJlbkBhcHBsZS5jb20+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgT2xpdmVyIEh1bnQuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCShyZXZpc2lvbiAwKQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDcwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNo
IE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFO
WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiU2hhcmVkQml0bWFwLmgiCisKKyNpbmNsdWRlICJBZmZpbmVU
cmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJHcmFw
aGljc1R5cGVzLmgiCisjaW5jbHVkZSAiV2luY2VHcmFwaGljc0V4dHJhcy5oIgorCisjaW5jbHVk
ZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYv
T3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKKyNpZm5kZWYgTkRFQlVHCitzdHJ1Y3QgU2hhcmVkQml0bWFwTGVha0NvdW50ZXIg
eworICAgIH5TaGFyZWRCaXRtYXBMZWFrQ291bnRlcigpOworfTsKK3N0YXRpYyBTaGFyZWRCaXRt
YXBMZWFrQ291bnRlciBzaGFyZWRCaXRtYXBMZWFrQ291bnRlcjsKKyNlbmRpZgorCit0eXBlZGVm
IEhhc2hTZXQ8U2hhcmVkQml0bWFwKj4gQml0bWFwTWFwOworCitCaXRtYXBNYXAqIGJpdG1hcE1h
cCgpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChCaXRtYXBNYXAsIGJpdG1hcE1hcCwgKCkp
OworICAgIHJldHVybiAmYml0bWFwTWFwOworfQorCisjaWZuZGVmIE5ERUJVRworU2hhcmVkQml0
bWFwTGVha0NvdW50ZXI6On5TaGFyZWRCaXRtYXBMZWFrQ291bnRlcigpCit7CisgICAgaWYgKCFi
aXRtYXBNYXAoKS0+aXNFbXB0eSgpKQorICAgICAgICBwcmludGYoIlxuTEVBSzogJXUgJXNcblxu
IiwgYml0bWFwTWFwKCktPnNpemUoKSwgIlNoYXJlZEJpdG1hcCBvYmplY3RzIik7Cit9CisjZW5k
aWYKKworc3RhdGljIFNoYXJlZEJpdG1hcDo6RHJhd1BhdHRlcm5GdW5jIHNfZHJhd1BhdHRlcm4g
PSAwOworc3RhdGljIFNoYXJlZEJpdG1hcDo6RHJhd0ltYWdlRnVuYyBzX2RyYXdJbWFnZSA9IDA7
CisKK2ludCBkaXNjYXJkQml0bWFwSGFuZGxlcygpCit7CisgICAgaW50IGRlbGV0ZWQgPSAwOwor
ICAgIGZvciAoQml0bWFwTWFwOjppdGVyYXRvciBpID0gYml0bWFwTWFwKCktPmJlZ2luKCk7IGkg
IT0gYml0bWFwTWFwKCktPmVuZCgpOyArK2kpIHsKKyAgICAgICAgaWYgKCgqaSktPmZyZWVNZW1v
cnkoKSkKKyAgICAgICAgICAgICsrZGVsZXRlZDsKKyAgICB9CisgICAgcmV0dXJuIGRlbGV0ZWQ7
Cit9CisKK1NoYXJlZEJpdG1hcDo6RHJhd0ltYWdlRnVuYyBTaGFyZWRCaXRtYXA6OnNldERyYXdJ
bWFnZUZ1bmMoRHJhd0ltYWdlRnVuYyBmdW5jKQoreworICAgIERyYXdJbWFnZUZ1bmMgb2xkRnVu
YyA9IHNfZHJhd0ltYWdlOworICAgIHNfZHJhd0ltYWdlID0gZnVuYzsKKyAgICByZXR1cm4gb2xk
RnVuYzsKK30KKworU2hhcmVkQml0bWFwOjpEcmF3UGF0dGVybkZ1bmMgU2hhcmVkQml0bWFwOjpz
ZXREcmF3UGF0dGVybkZ1bmMoRHJhd1BhdHRlcm5GdW5jIGZ1bmMpCit7CisgICAgRHJhd1BhdHRl
cm5GdW5jIG9sZEZ1bmMgPSBzX2RyYXdQYXR0ZXJuOworICAgIHNfZHJhd1BhdHRlcm4gPSBmdW5j
OworICAgIHJldHVybiBvbGRGdW5jOworfQorCitQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4gU2hh
cmVkQml0bWFwOjpjcmVhdGVJbnN0YW5jZShib29sIGlzMTZiaXQsIGludCB3LCBpbnQgaCwgYm9v
bCBpbml0UGl4ZWxzKQoreworICAgIFNoYXJlZEJpdG1hcCogcnRuID0gbmV3IFNoYXJlZEJpdG1h
cChpczE2Yml0LCB3LCBoLCBpbml0UGl4ZWxzKTsKKyAgICBpZiAocnRuICYmICFydG4tPmJ5dGVz
KCkpIHsKKyAgICAgICAgZGVsZXRlIHJ0bjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAg
IHJldHVybiBhZG9wdFJlZihydG4pOworfQorCitTaGFyZWRCaXRtYXA6OlNoYXJlZEJpdG1hcChj
b25zdCBCaXRtYXBJbmZvJiBibXBJbmZvLCBIQklUTUFQIGhibXAsIHZvaWQqIHBpeGVscykKKyAg
ICA6IG1fYm1wSW5mbyhibXBJbmZvKQorICAgICwgbV9sb2NrZWQoZmFsc2UpCisgICAgLCBtX3Vz
ZXNUcmFuc3BhcmVudENvbG9yKGZhbHNlKQorICAgICwgbV90cmFuc3BhcmVudENvbG9yKFJHQigw
LCAwLCAwKSkKKyAgICAsIG1fcGl4ZWxzKHBpeGVscykKKyAgICAsIG1faGJpdG1hcChoYm1wKQor
ICAgICwgbV9oYXNBbHBoYShmYWxzZSkKKyAgICAsIG1fdmFsaWRIZWlnaHQoYm1wSW5mby5oZWln
aHQoKSkKK3sKKyAgICBiaXRtYXBNYXAoKS0+YWRkKHRoaXMpOworfQorCitTaGFyZWRCaXRtYXA6
OlNoYXJlZEJpdG1hcChib29sIF9pczE2Yml0LCBpbnQgdywgaW50IGgsIGJvb2wgaW5pdFBpeGVs
cykKKyAgICA6IG1fYm1wSW5mbyhfaXMxNmJpdCwgdywgaCkKKyAgICAsIG1fcmVmZXJlbmNlKDEp
CisgICAgLCBtX2xvY2tlZChmYWxzZSkKKyAgICAsIG1fdXNlc1RyYW5zcGFyZW50Q29sb3IoZmFs
c2UpCisgICAgLCBtX3RyYW5zcGFyZW50Q29sb3IoUkdCKDAsIDAsIDApKQorICAgICwgbV9waXhl
bHMoMCkKKyAgICAsIG1faGFzQWxwaGEoZmFsc2UpCisgICAgLCBtX3ZhbGlkSGVpZ2h0KGFicyho
KSkKKyAgICAsIG1faGJpdG1hcCgwKQoreworICAgIGJpdG1hcE1hcCgpLT5hZGQodGhpcyk7CisK
KyAgICB1bnNpZ25lZCBidWZmZXJTaXplID0gbV9ibXBJbmZvLm51bVBpeGVscygpOworICAgIGlm
IChfaXMxNmJpdCkKKyAgICAgICAgYnVmZmVyU2l6ZSAvPSAyOworCisgICAgbV9waXhlbHMgPSBu
ZXcgdW5zaWduZWRbYnVmZmVyU2l6ZV07CisKKyAgICBpZiAoaW5pdFBpeGVscykKKyAgICAgICAg
cmVzZXRQaXhlbHMoKTsKK30KKworU2hhcmVkQml0bWFwOjp+U2hhcmVkQml0bWFwKCkKK3sKKyAg
ICBiaXRtYXBNYXAoKS0+cmVtb3ZlKHRoaXMpOworICAgIGlmIChtX2hiaXRtYXApCisgICAgICAg
IERlbGV0ZU9iamVjdChtX2hiaXRtYXApOworICAgIGVsc2UKKyAgICAgICAgZGVsZXRlW10gbV9w
aXhlbHM7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpyZXNldFBpeGVscyhib29sIGJsYWNrKQor
eworICAgIGlmIChtX3BpeGVscykgeworICAgICAgICB1bnNpZ25lZCBidWZmZXJTaXplID0gbV9i
bXBJbmZvLm51bVBpeGVscygpOworICAgICAgICBpZiAoYmxhY2spIHsKKyAgICAgICAgICAgIHVu
c2lnbmVkIGJ1ZmZlclNpemVJbkJ5dGVzID0gYnVmZmVyU2l6ZSAqIChpczE2Yml0KCkgPyAyIDog
NCk7CisgICAgICAgICAgICBtZW1zZXQobV9waXhlbHMsIDAsIGJ1ZmZlclNpemVJbkJ5dGVzKTsK
KyAgICAgICAgfSBlbHNlIGlmIChpczE2Yml0KCkpIHsKKyAgICAgICAgICAgIC8vIEZpbGwgaXQg
d2l0aCB3aGl0ZSBjb2xvcgorI2lmIElNQUdFX05PX0FMUEhBX1VTRV9SR0I1NTUKKyAgICAgICAg
ICAgIHdtZW1zZXQocmVpbnRlcnByZXRfY2FzdDx3Y2hhcl90Kj4obV9waXhlbHMpLCAweDdGRkYs
IGJ1ZmZlclNpemUpOworI2Vsc2UKKyAgICAgICAgICAgIHdtZW1zZXQocmVpbnRlcnByZXRfY2Fz
dDx3Y2hhcl90Kj4obV9waXhlbHMpLCAweEZGRkYsIGJ1ZmZlclNpemUpOworI2VuZGlmCisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBNYWtlIGl0IHdoaXRlIGJ1dCB0cmFuc3BhcmVu
dAorICAgICAgICAgICAgdW5zaWduZWQqIHBpeGVsID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25l
ZCo+KG1fcGl4ZWxzKTsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkKiBjb25zdCBidWZmZXJF
bmQgPSBwaXhlbCArIGJ1ZmZlclNpemU7CisgICAgICAgICAgICB3aGlsZSAocGl4ZWwgPCBidWZm
ZXJFbmQpCisgICAgICAgICAgICAgICAgKnBpeGVsKysgPSAweDAwRkZGRkZGOworICAgICAgICB9
CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGNvbnZlcnQzMlRvMTYo
dW5zaWduZWQgcGl4ZWwpCit7CisjaWYgSU1BR0VfTk9fQUxQSEFfVVNFX1JHQjU1NQorICAgIHVu
c2lnbmVkIHNob3J0IHIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oKHBpeGVsICYgMHgw
MEY4MDAwMCkgPj4gOSk7CisgICAgdW5zaWduZWQgc2hvcnQgZyA9IHN0YXRpY19jYXN0PHVuc2ln
bmVkIHNob3J0PigocGl4ZWwgJiAweDAwMDBGODAwKSA+PiA2KTsKKyAgICB1bnNpZ25lZCBzaG9y
dCBiID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KChwaXhlbCAmIDB4MDAwMDAwRjgpID4+
IDMpOworI2Vsc2UgLy8gUkdCNTY1CisgICAgdW5zaWduZWQgc2hvcnQgciA9IHN0YXRpY19jYXN0
PHVuc2lnbmVkIHNob3J0PigocGl4ZWwgJiAweDAwRjgwMDAwKSA+PiA4KTsKKyAgICB1bnNpZ25l
ZCBzaG9ydCBnID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KChwaXhlbCAmIDB4MDAwMEZD
MDApID4+IDUpOworICAgIHVuc2lnbmVkIHNob3J0IGIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBz
aG9ydD4oKHBpeGVsICYgMHgwMDAwMDBGOCkgPj4gMyk7CisjZW5kaWYKKyAgICByZXR1cm4gciB8
IGcgfCBiOworfQorCitib29sIFNoYXJlZEJpdG1hcDo6dG8xNmJpdCgpCit7CisgICAgaWYgKG1f
bG9ja2VkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGlzMTZiaXQoKSkKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisKKyAgICBCaXRtYXBJbmZvIG5ld0JtcEluZm8odHJ1ZSwgbV9ibXBJ
bmZvLndpZHRoKCksIG1fYm1wSW5mby5oZWlnaHQoKSk7CisKKyAgICBNZW1vcnlBbGxvY2F0aW9u
Q2FuRmFpbCBjYW5GYWlsOworICAgIGludCB3aWR0aCA9IG5ld0JtcEluZm8ud2lkdGgoKTsKKyAg
ICBpbnQgcGFkZGVkV2lkdGggPSBuZXdCbXBJbmZvLnBhZGRlZFdpZHRoKCk7CisgICAgaW50IGJ1
ZmZlclNpemUgPSBwYWRkZWRXaWR0aCAqIG5ld0JtcEluZm8uaGVpZ2h0KCk7CisgICAgdm9pZCog
bmV3UGl4ZWxzID0gbmV3IHVuc2lnbmVkW2J1ZmZlclNpemUgLyAyXTsKKworICAgIGlmICghbmV3
UGl4ZWxzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBzaG9ydCogcDE2
ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBzaG9ydCo+KG5ld1BpeGVscyk7CisgICAgY29u
c3QgdW5zaWduZWQqIHAzMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQqPihtX3Bp
eGVscyk7CisKKyAgICBjb25zdCBib29sIHNraXBzID0gcGFkZGVkV2lkdGggIT0gd2lkdGg7CisK
KyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogY29uc3QgcDE2ZW5kID0gcDE2ICsgYnVmZmVyU2l6
ZTsKKyAgICB3aGlsZSAocDE2IDwgcDE2ZW5kKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgc2hv
cnQqIHAxNmxpbmVFbmQgPSBwMTYgKyB3aWR0aDsgcDE2IDwgcDE2bGluZUVuZDsgKQorICAgICAg
ICAgICAgKnAxNisrID0gY29udmVydDMyVG8xNigqcDMyKyspOworCisgICAgICAgIGlmIChza2lw
cykKKyAgICAgICAgICAgICpwMTYrKyA9IDA7CisgICAgfQorCisKKyAgICBpZiAobV9oYml0bWFw
KSB7CisgICAgICAgIERlbGV0ZU9iamVjdChtX2hiaXRtYXApOworICAgICAgICBtX2hiaXRtYXAg
PSAwOworICAgIH0gZWxzZQorICAgICAgICBkZWxldGVbXSBtX3BpeGVsczsKKworICAgIG1fcGl4
ZWxzID0gbmV3UGl4ZWxzOworICAgIG1fYm1wSW5mbyA9IG5ld0JtcEluZm87CisKKyAgICBzZXRI
YXNBbHBoYShmYWxzZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2hhcmVkQml0bWFw
OjpmcmVlTWVtb3J5KCkKK3sKKyAgICBpZiAobV9sb2NrZWQpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmIChtX2hiaXRtYXApIHsKKyAgICAgICAgRGVsZXRlT2JqZWN0KG1faGJpdG1h
cCk7CisgICAgICAgIG1faGJpdG1hcCA9IDA7CisgICAgICAgIG1fcGl4ZWxzID0gMDsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKG1fcGl4ZWxzKSB7CisgICAgICAgIGRl
bGV0ZVtdIG1fcGl4ZWxzOworICAgICAgICBtX3BpeGVscyA9IDA7CisgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworSEJJVE1BUCBTaGFyZWRCaXRt
YXA6OmNyZWF0ZUhhbmRsZSh2b2lkKiogcGl4ZWxzLCBCaXRtYXBJbmZvKiBibXBJbmZvLCBpbnQg
aCwgYm9vbCB1c2UxNmJpdCkgY29uc3QKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7CisKKyAgICBp
ZiAoaCA9PSAtMSkKKyAgICAgICAgaCA9IGhlaWdodCgpOworICAgICpibXBJbmZvID0gQml0bWFw
SW5mbyh1c2UxNmJpdCB8fCBpczE2Yml0KCksIHdpZHRoKCksIGgpOworCisgICAgSEJJVE1BUCBo
Ym1wID0gTWVtb3J5TWFuYWdlcjo6Y3JlYXRlRElCU2VjdGlvbihibXBJbmZvLCBwaXhlbHMpOwor
CisgICAgaWYgKCFoYm1wKQorICAgICAgICByZXR1cm4gMDsKKworICAgIE93blB0cjxIREM+IGJt
cERDKENyZWF0ZUNvbXBhdGlibGVEQygwKSk7CisgICAgSEdESU9CSiBoT2xkQm1wID0gU2VsZWN0
T2JqZWN0KGJtcERDLmdldCgpLCBoYm1wKTsKKworICAgIFN0cmV0Y2hESUJpdHMoYm1wREMuZ2V0
KCksIDAsIDAsIHdpZHRoKCksIGgsIDAsIDAsIHdpZHRoKCksIGgKKyAgICAgICAgLCBtX3BpeGVs
cywgJm1fYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsIFNSQ0NPUFkpOworCisgICAgU2VsZWN0T2Jq
ZWN0KGJtcERDLmdldCgpLCBoT2xkQm1wKTsKKworICAgIHJldHVybiBoYm1wOworfQorCitib29s
IFNoYXJlZEJpdG1hcDo6ZW5zdXJlSGFuZGxlKCkKK3sKKyAgICBpZiAobV9oYml0bWFwKQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIGlmIChtX2xvY2tlZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Qml0bWFwSW5mbyBibXBJbmZvOworICAgIHZvaWQqIHBpeGVsczsKKyAgICBtX2hiaXRtYXAgPSBj
cmVhdGVIYW5kbGUoJnBpeGVscywgJmJtcEluZm8sIC0xLCAhaGFzQWxwaGEoKSk7CisKKyAgICBp
ZiAoIW1faGJpdG1hcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZGVsZXRlW10gbV9w
aXhlbHM7CisgICAgbV9waXhlbHMgPSBwaXhlbHM7CisgICAgbV9ibXBJbmZvID0gYm1wSW5mbzsK
KworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6ZHJhdyhHcmFwaGlj
c0NvbnRleHQqIGN0eHQsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJlY3QmIHNy
Y1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGlmICghbV9waXhl
bHMpCisgICAgICAgIHJldHVybjsKKyAgICBjdHh0LT5kcmF3Qml0bWFwKHRoaXMsIGRzdFJlY3Qs
IHNyY1JlY3QsIGNvbXBvc2l0ZU9wKTsKK30KKwordm9pZCBTaGFyZWRCaXRtYXA6OmRyYXcoSERD
IGhkYywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29t
cG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgaWYgKGRzdFJlY3QuaXNFbXB0eSgpIHx8IHNyY1JlY3QuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoc19kcmF3SW1hZ2UgJiYgc19kcmF3SW1h
Z2UodGhpcywgaGRjLCBkc3RSZWN0LCBzcmNSZWN0LCBjb21wb3NpdGVPcCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIEhCSVRNQVAgaGJpdG1hcCA9IDA7CisgICAgYm9vbCB1c2luZ0hhbmRsZSA9
IGNvbXBvc2l0ZU9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgJiYgKGZhbHNlCisjaWYgIWRlZmlu
ZWQoTk9fQUxQSEFCTEVORCkKKyAgICAgICAgfHwgaGFzQWxwaGEoKQorI2VuZGlmCisgICAgICAg
IHx8IHVzZXNUcmFuc3BhcmVudENvbG9yKCkpOworCisgICAgaWYgKHVzaW5nSGFuZGxlKSB7Cisg
ICAgICAgIGlmIChlbnN1cmVIYW5kbGUoKSkKKyAgICAgICAgICAgIGhiaXRtYXAgPSBtX2hiaXRt
YXA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdm9pZCogcGl4ZWxzOworICAgICAgICAg
ICAgQml0bWFwSW5mbyBibXBJbmZvOworICAgICAgICAgICAgaGJpdG1hcCA9IGNyZWF0ZUhhbmRs
ZSgmcGl4ZWxzLCAmYm1wSW5mbywgLTEsIHVzZXNUcmFuc3BhcmVudENvbG9yKCkpOworICAgICAg
ICB9CisgICAgfQorICAgIGlmICghaGJpdG1hcCkgeworICAgICAgICAvLyBGSVhNRTogaGFuZGxl
IG90aGVyIGNvbXBvc2l0ZSBvcGVyYXRpb24gdHlwZXM/CisgICAgICAgIERXT1JEIHJvcCA9IGNv
bXBvc2l0ZU9wID09IENvbXBvc2l0ZUNvcHkgPyBTUkNDT1BZCisgICAgICAgICAgICA6IGNvbXBv
c2l0ZU9wID09IENvbXBvc2l0ZVhPUiA/IFBBVElOVkVSVAorICAgICAgICAgICAgOiBjb21wb3Np
dGVPcCA9PSBDb21wb3NpdGVDbGVhciA/IFdISVRFTkVTUworICAgICAgICAgICAgOiBTUkNDT1BZ
OworCisgICAgICAgIFN0cmV0Y2hESUJpdHMoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCks
IGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKQorICAgICAgICAgICAgLCBzcmNSZWN0
LngoKSwgc3JjUmVjdC55KCksIHNyY1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWlnaHQoKSwgbV9w
aXhlbHMsICZtX2JtcEluZm8sIERJQl9SR0JfQ09MT1JTLCByb3ApOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIE93blB0cjxIREM+IGhtZW1kYyhDcmVhdGVDb21wYXRpYmxlREMoaGRjKSk7CisgICAg
ICAgIEhHRElPQkogaE9sZEJtcCA9IFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCksIGhiaXRtYXAp
OworCisjaWYgIWRlZmluZWQoTk9fQUxQSEFCTEVORCkKKyAgICAgICAgaWYgKCF1c2VzVHJhbnNw
YXJlbnRDb2xvcigpKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgQkxFTkRGVU5DVElPTiBi
bGVuZCA9IHsgQUNfU1JDX09WRVIsIDAsIDI1NSwgQUNfU1JDX0FMUEhBIH07CisgICAgICAgICAg
ICBBbHBoYUJsZW5kKGhkYywgZHN0UmVjdC54KCksIGRzdFJlY3QueSgpLCBkc3RSZWN0LndpZHRo
KCksIGRzdFJlY3QuaGVpZ2h0KCksIGhtZW1kYy5nZXQoKQorICAgICAgICAgICAgICAgICwgc3Jj
UmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCks
IGJsZW5kKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAg
VHJhbnNwYXJlbnRCbHQoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lk
dGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgaG1lbWRjLmdldCgpCisgICAgICAgICAgICAgICAgLCBz
cmNSZWN0LngoKSwgc3JjUmVjdC55KCksIHNyY1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWlnaHQo
KSwgdHJhbnNwYXJlbnRDb2xvcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIFNlbGVjdE9iamVj
dChobWVtZGMuZ2V0KCksIGhPbGRCbXApOworICAgICAgICBpZiAoaGJpdG1hcCAhPSBtX2hiaXRt
YXApCisgICAgICAgICAgICBEZWxldGVPYmplY3QoaGJpdG1hcCk7CisgICAgfQorfQorCisKK0hC
SVRNQVAgU2hhcmVkQml0bWFwOjpjbGlwQml0bWFwKGNvbnN0IEludFJlY3QmIHJlY3QsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUFscGhhLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgQml0bWFwSW5mbyYgYm1wSW5mbywKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHZvaWQqJiBwaXhlbHMpCit7CisgICAgaWYgKCFieXRlcygpKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIGludCBvbGRXaWR0aCA9IHdpZHRoKCk7CisgICAgaW50
IG9sZEhlaWdodCA9IGhlaWdodCgpOworICAgIGludCBjb3B5V2lkdGggPSBzdGQ6Om1pbjxpbnQ+
KHJlY3Qud2lkdGgoKSwgb2xkV2lkdGggLSByZWN0LngoKSk7CisgICAgaW50IGNvcHlIZWlnaHQg
PSBzdGQ6Om1pbjxpbnQ+KHJlY3QuaGVpZ2h0KCksIG9sZEhlaWdodCAtIHJlY3QueSgpKTsKKyAg
ICBpZiAoIWNvcHlXaWR0aCB8fCAhY29weUhlaWdodCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICBibXBJbmZvID0gQml0bWFwSW5mbyghKHVzZUFscGhhICYmIGlzMzJiaXQoKSksIGNvcHlXaWR0
aCwgY29weUhlaWdodCk7CisgICAgSEJJVE1BUCBuZXdCbXAgPSBNZW1vcnlNYW5hZ2VyOjpjcmVh
dGVESUJTZWN0aW9uKCZibXBJbmZvLCAmcGl4ZWxzKTsKKworICAgIGlmIChuZXdCbXApIHsKKyAg
ICAgICAgT3duUHRyPEhEQz4gZGNOZXcoOjpDcmVhdGVDb21wYXRpYmxlREMoMCkpOworICAgICAg
ICBIR0RJT0JKIHRtcE5ldyA9IDo6U2VsZWN0T2JqZWN0KGRjTmV3LmdldCgpLCBuZXdCbXApOwor
CisgICAgICAgIFN0cmV0Y2hESUJpdHMoZGNOZXcuZ2V0KCksIDAsIDAsIGNvcHlXaWR0aCwgY29w
eUhlaWdodCwgcmVjdC54KCksIHJlY3QueSgpLCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQKKyAgICAg
ICAgICAgICwgYnl0ZXMoKSwgJmJpdG1hcEluZm8oKSwgRElCX1JHQl9DT0xPUlMsIFNSQ0NPUFkp
OworCisgICAgICAgIFNlbGVjdE9iamVjdChkY05ldy5nZXQoKSwgdG1wTmV3KTsKKyAgICB9CisK
KyAgICByZXR1cm4gbmV3Qm1wOworfQorCisKK1Bhc3NSZWZQdHI8U2hhcmVkQml0bWFwPiBTaGFy
ZWRCaXRtYXA6OmNsaXBCaXRtYXAoY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCB1c2VBbHBoYSkK
K3sKKyAgICBpbnQgb2xkV2lkdGggPSB3aWR0aCgpOworICAgIGludCBvbGRIZWlnaHQgPSBoZWln
aHQoKTsKKyAgICBpbnQgY29weVdpZHRoID0gc3RkOjptaW48aW50PihyZWN0LndpZHRoKCksIG9s
ZFdpZHRoIC0gcmVjdC54KCkpOworICAgIGludCBjb3B5SGVpZ2h0ID0gc3RkOjptaW48aW50Pihy
ZWN0LmhlaWdodCgpLCBvbGRIZWlnaHQgLSByZWN0LnkoKSk7CisgICAgaWYgKCFjb3B5V2lkdGgg
fHwgIWNvcHlIZWlnaHQpCisgICAgICAgIHJldHVybiAwOworCisgICAgU2hhcmVkQml0bWFwKiBu
ZXdCbXAgPSBuZXcgU2hhcmVkQml0bWFwKCEodXNlQWxwaGEgJiYgaXMzMmJpdCgpKSwgY29weVdp
ZHRoLCBjb3B5SGVpZ2h0LCBmYWxzZSk7CisKKyAgICBpZiAoIW5ld0JtcCkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICBpZiAoIW5ld0JtcC0+Ynl0ZXMoKSkgeworICAgICAgICBkZWxldGUgbmV3
Qm1wOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBEQ0hvbGRlciBkY05ldyhuZXdC
bXApOworCisgICAgU3RyZXRjaERJQml0cyhkY05ldy5nZXQoKSwgMCwgMCwgY29weVdpZHRoLCBj
b3B5SGVpZ2h0LCByZWN0LngoKSwgcmVjdC55KCksIGNvcHlXaWR0aCwgY29weUhlaWdodAorICAg
ICAgICAsIGJ5dGVzKCksICZiaXRtYXBJbmZvKCksIERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsK
KworICAgIHJldHVybiBhZG9wdFJlZihuZXdCbXApOworfQorCitzdGF0aWMgdm9pZCBkcmF3UGF0
dGVyblNpbXBsZShIREMgaGRjLCBjb25zdCBSRUNUJiBkZXN0UmVjdCwgSEJJVE1BUCBoYm1wLCBj
b25zdCBQT0lOVCYgcGhhc2UpCit7CisgICAgSEJSVVNIIGhCcnVzaCA9IENyZWF0ZVBhdHRlcm5C
cnVzaChoYm1wKTsKKyAgICBpZiAoaEJydXNoKSB7CisgICAgICAgIFBPSU5UIG9sZE9yZzsKKyAg
ICAgICAgU2V0QnJ1c2hPcmdFeChoZGMsIGRlc3RSZWN0LmxlZnQgLSBwaGFzZS54LCBkZXN0UmVj
dC50b3AgLSBwaGFzZS55LCAmb2xkT3JnKTsKKyAgICAgICAgRmlsbFJlY3QoaGRjLCAmZGVzdFJl
Y3QsIGhCcnVzaCk7CisgICAgICAgIERlbGV0ZU9iamVjdChoQnJ1c2gpOworICAgICAgICBTZXRC
cnVzaE9yZ0V4KGhkYywgb2xkT3JnLngsIG9sZE9yZy55LCAwKTsKKyAgICB9Cit9CisKK3N0YXRp
YyB2b2lkIGRyYXdQYXR0ZXJuU2ltcGxlKEhEQyBoZGMsIGNvbnN0IFJFQ1QmIGRlc3RSZWN0LCBj
b25zdCBTaGFyZWRCaXRtYXAqIGJtcCwgY29uc3QgU0laRSYgYm1wU2l6ZSwgY29uc3QgUE9JTlQm
IHBoYXNlKQoreworICAgIGludCBkc3RZID0gZGVzdFJlY3QudG9wOworICAgIGZvciAoaW50IHNv
dXJjZVkgPSBwaGFzZS55OyBkc3RZIDwgZGVzdFJlY3QuYm90dG9tOyApIHsKKyAgICAgICAgaW50
IHNvdXJjZUggPSBzdGQ6Om1pbjxpbnQ+KGJtcFNpemUuY3kgLSBzb3VyY2VZLCBkZXN0UmVjdC5i
b3R0b20gLSBkc3RZKTsKKyAgICAgICAgaW50IGRzdFggPSBkZXN0UmVjdC5sZWZ0OworICAgICAg
ICBmb3IgKGludCBzb3VyY2VYID0gcGhhc2UueDsgZHN0WCA8IGRlc3RSZWN0LnJpZ2h0OyApIHsK
KyAgICAgICAgICAgIGludCBzb3VyY2VXID0gc3RkOjptaW48aW50PihibXBTaXplLmN4IC0gc291
cmNlWCwgZGVzdFJlY3QucmlnaHQgLSBkc3RYKTsKKworICAgICAgICAgICAgU3RyZXRjaERJQml0
cyhoZGMsIGRzdFgsIGRzdFksIHNvdXJjZVcsIHNvdXJjZUgsIHNvdXJjZVgsIHNvdXJjZVksIHNv
dXJjZVcsIHNvdXJjZUgKKyAgICAgICAgICAgICAgICAsIGJtcC0+Ynl0ZXMoKSwgJmJtcC0+Yml0
bWFwSW5mbygpLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAgICAgICAgICAgIGRzdFgg
Kz0gc291cmNlVzsKKyAgICAgICAgICAgIHNvdXJjZVggPSAwOworICAgICAgICB9CisKKyAgICAg
ICAgZHN0WSArPSBzb3VyY2VIOworICAgICAgICBzb3VyY2VZID0gMDsKKyAgICB9Cit9CisKK3Zv
aWQgbm9ybWFsaXplUGhhc2UoTE9ORyYgcGhhc2UsIGludCBsaW1pdCkKK3sKKyAgICBpZiAoIXBo
YXNlKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGxpbWl0IDwgMikgeworICAgICAgICBwaGFz
ZSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxpbWl0ID09IDIpIHsKKyAg
ICAgICAgcGhhc2UgPSBwaGFzZSAmIDE7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYg
KHBoYXNlIDwgMCkgeworICAgICAgICBwaGFzZSA9IC1waGFzZTsKKyAgICAgICAgaWYgKHBoYXNl
ID4gbGltaXQpCisgICAgICAgICAgICBwaGFzZSA9IHN0YXRpY19jYXN0PExPTkc+KHN0YXRpY19j
YXN0PHVuc2lnbmVkPihwaGFzZSkgJSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obGltaXQpKTsKKyAg
ICAgICAgaWYgKHBoYXNlKQorICAgICAgICAgICAgcGhhc2UgPSBsaW1pdCAtIHBoYXNlOworICAg
IH0gZWxzZSB7CisgICAgICAgIGlmIChwaGFzZSA8IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICBwaGFzZSA9IHN0YXRpY19jYXN0PExPTkc+KHN0YXRpY19jYXN0PHVuc2lnbmVk
PihwaGFzZSkgJSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obGltaXQpKTsKKyAgICB9Cit9CisKK3Zv
aWQgU2hhcmVkQml0bWFwOjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0
IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJh
bnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2Us
IENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBJ
bnRTaXplJiBvcmlnU291cmNlU2l6ZSkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICBy
ZXR1cm47CisgICAgY3R4dC0+ZHJhd0JpdG1hcFBhdHRlcm4odGhpcywgdGlsZVJlY3RJbiwgcGF0
dGVyblRyYW5zZm9ybSwgcGhhc2UsIG9wLCBkZXN0UmVjdCwgb3JpZ1NvdXJjZVNpemUpOworfQor
Cit2b2lkIFNoYXJlZEJpdG1hcDo6ZHJhd1BhdHRlcm4oSERDIGhkYywgY29uc3QgQWZmaW5lVHJh
bnNmb3JtJiB0cmFuc2Zvcm0sIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgQWZm
aW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9h
dFJlY3QmIGRlc3RSZWN0LCBjb25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSkKK3sKKyAgICBp
ZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoc19kcmF3UGF0dGVybikg
eworICAgICAgICBzX2RyYXdQYXR0ZXJuKHRoaXMsIGhkYywgdHJhbnNmb3JtLCB0aWxlUmVjdElu
LCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgb3AsIGRlc3RSZWN0LCBvcmlnU291cmNlU2l6ZSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGlsZVJlY3RJbi53aWR0aCgpIDw9
IDAgfHwgdGlsZVJlY3RJbi5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBi
b29sIHVzZUFscGhhID0gb3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciAmJiBoYXNBbHBoYSgpICYm
IGlzMzJiaXQoKTsKKworICAgIGludCBibXBXaWR0aCA9IHdpZHRoKCk7CisgICAgaW50IGJtcEhl
aWdodCA9IGhlaWdodCgpOworCisgICAgRmxvYXRSZWN0IHRpbGVSZWN0KHRpbGVSZWN0SW4pOwor
ICAgIGlmIChibXBXaWR0aCAhPSBvcmlnU291cmNlU2l6ZS53aWR0aCgpKSB7CisgICAgICAgIGRv
dWJsZSByYXRlID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihibXBXaWR0aCkgLyBvcmlnU291cmNlU2l6
ZS53aWR0aCgpOworICAgICAgICBkb3VibGUgdGVtcCA9IHRpbGVSZWN0LndpZHRoKCkgKiByYXRl
OworICAgICAgICB0aWxlUmVjdC5zZXRYKHRpbGVSZWN0LngoKSAqIHJhdGUpOworICAgICAgICB0
aWxlUmVjdC5zZXRXaWR0aCh0ZW1wKTsKKyAgICAgICAgdGVtcCA9IHRpbGVSZWN0LmhlaWdodCgp
ICogcmF0ZTsKKyAgICAgICAgdGlsZVJlY3Quc2V0WSh0aWxlUmVjdC55KCkgKiByYXRlKTsKKyAg
ICAgICAgdGlsZVJlY3Quc2V0SGVpZ2h0KHRlbXApOworICAgIH0KKworICAgIE93blB0cjxIQklU
TUFQPiBjbGlwcGVkQm1wOworCisgICAgaWYgKHRpbGVSZWN0LngoKSB8fCB0aWxlUmVjdC55KCkg
fHwgdGlsZVJlY3Qud2lkdGgoKSAhPSBibXBXaWR0aCB8fCB0aWxlUmVjdC5oZWlnaHQoKSAhPSBi
bXBIZWlnaHQpIHsKKyAgICAgICAgQml0bWFwSW5mbyBwYXR0ZXJuQm1wSW5mbzsKKyAgICAgICAg
dm9pZCogcGF0dGVyblBpeGVsczsKKyAgICAgICAgY2xpcHBlZEJtcC5zZXQoY2xpcEJpdG1hcChJ
bnRSZWN0KHRpbGVSZWN0KSwgdXNlQWxwaGEsIHBhdHRlcm5CbXBJbmZvLCBwYXR0ZXJuUGl4ZWxz
KSk7CisgICAgICAgIGlmICghY2xpcHBlZEJtcCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAg
ICAgICBibXBXaWR0aCA9IHRpbGVSZWN0LndpZHRoKCk7CisgICAgICAgIGJtcEhlaWdodCA9IHRp
bGVSZWN0LmhlaWdodCgpOworICAgIH0KKworICAgIEFmZmluZVRyYW5zZm9ybSB0ZiA9IHRyYW5z
Zm9ybTsKKyAgICB0ZiAqPSBwYXR0ZXJuVHJhbnNmb3JtOworCisgICAgRmxvYXRSZWN0IHRyUmVj
dCA9IHRmLm1hcFJlY3QoZGVzdFJlY3QpOworCisgICAgUkVDVCBjbGlwQm94OworICAgIGludCBj
bGlwVHlwZSA9IEdldENsaXBCb3goaGRjLCAmY2xpcEJveCk7CisgICAgaWYgKGNsaXBUeXBlID09
IFNJTVBMRVJFR0lPTikKKyAgICAgICAgdHJSZWN0LmludGVyc2VjdChGbG9hdFJlY3QoY2xpcEJv
eC5sZWZ0LCBjbGlwQm94LnRvcCwgY2xpcEJveC5yaWdodCAtIGNsaXBCb3gubGVmdCwgY2xpcEJv
eC5ib3R0b20gLSBjbGlwQm94LnRvcCkpOworICAgIGVsc2UgaWYgKGNsaXBUeXBlID09IENPTVBM
RVhSRUdJT04pIHsKKyAgICAgICAgT3duUHRyPEhSR04+IGNsaXBSZ24oQ3JlYXRlUmVjdFJnbigw
LCAwLCAwLCAwKSk7CisgICAgICAgIGlmIChHZXRDbGlwUmduKGhkYywgY2xpcFJnbi5nZXQoKSkg
PiAwKSB7CisgICAgICAgICAgICBEV09SRCByZWdpb25EYXRhU2l6ZSA9IEdldFJlZ2lvbkRhdGEo
Y2xpcFJnbi5nZXQoKSwgc2l6ZW9mKFJHTkRBVEEpLCAwKTsKKyAgICAgICAgICAgIGlmIChyZWdp
b25EYXRhU2l6ZSkgeworICAgICAgICAgICAgICAgIFJHTkRBVEEqIHJlZ2lvbkRhdGEgPSBuZXcg
UkdOREFUQVtyZWdpb25EYXRhU2l6ZV07CisgICAgICAgICAgICAgICAgR2V0UmVnaW9uRGF0YShj
bGlwUmduLmdldCgpLCByZWdpb25EYXRhU2l6ZSwgcmVnaW9uRGF0YSk7CisgICAgICAgICAgICAg
ICAgUkVDVCogcmVjdCA9IChSRUNUKilyZWdpb25EYXRhLT5CdWZmZXI7CisgICAgICAgICAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlZ2lvbkRhdGEtPnJkaC5uQ291bnQ7ICsraSwg
KytyZWN0KQorICAgICAgICAgICAgICAgICAgICB0clJlY3QuaW50ZXJzZWN0KEZsb2F0UmVjdChy
ZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgcmVjdC0+Ym90
dG9tIC0gcmVjdC0+dG9wKSk7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gcmVnaW9uRGF0YTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0clJlY3Qud2lkdGgo
KSA8PSAwIHx8IHRyUmVjdC5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICB0
clJlY3QuaW5mbGF0ZSgxKTsKKyAgICBJbnRSZWN0IHZpc2libGVEc3RSZWN0ID0gZW5jbG9zaW5n
SW50UmVjdCh0Zi5pbnZlcnNlKCkubWFwUmVjdCh0clJlY3QpKTsKKyAgICB2aXNpYmxlRHN0UmVj
dC5pbnRlcnNlY3QoSW50UmVjdChkZXN0UmVjdCkpOworCisgICAgaWYgKHZpc2libGVEc3RSZWN0
LndpZHRoKCkgPD0gMCB8fCB2aXNpYmxlRHN0UmVjdC5oZWlnaHQoKSA8PSAwKQorICAgICAgICBy
ZXR1cm47CisKKyAgICB0clJlY3QgPSB0Zi5tYXBSZWN0KHZpc2libGVEc3RSZWN0KTsKKyAgICBS
RUNUIGRzdFJlY3RXaW4gPQorICAgIHsKKyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0LngoKSks
CisgICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC55KCkpLAorICAgICAgICBzdGFibGVSb3VuZCh0
clJlY3QucmlnaHQoKSksCisgICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC5ib3R0b20oKSksCisg
ICAgfTsKKyAgICBpZiAoZHN0UmVjdFdpbi5yaWdodCA8PSBkc3RSZWN0V2luLmxlZnQgfHwgZHN0
UmVjdFdpbi5ib3R0b20gPD0gZHN0UmVjdFdpbi50b3ApCisgICAgICAgIHJldHVybjsKKworICAg
IFNJWkUgYm1wU2l6ZSA9IHsgYm1wV2lkdGgsIGJtcEhlaWdodCB9OworCisgICAgLy8gUmVsYXRp
dmUgdG8gZGVzdGluYXRpb24sIGluIGJpdG1hcCBwaXhlbHMKKyAgICBQT0lOVCBwaGFzZVdpbiA9
IHsgc3RhYmxlUm91bmQodmlzaWJsZURzdFJlY3QueCgpIC0gcGhhc2UueCgpKSwgc3RhYmxlUm91
bmQodmlzaWJsZURzdFJlY3QueSgpIC0gcGhhc2UueSgpKSB9OworICAgIG5vcm1hbGl6ZVBoYXNl
KHBoYXNlV2luLngsIGJtcFNpemUuY3gpOworICAgIG5vcm1hbGl6ZVBoYXNlKHBoYXNlV2luLnks
IGJtcFNpemUuY3kpOworCisgICAgeworICAgICAgICBSRUNUIHNyY1JlY3RXaW4gPQorICAgICAg
ICB7CisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIHN0YWJsZVJv
dW5kKHZpc2libGVEc3RSZWN0LnJpZ2h0KCkpIC0gc3RhYmxlUm91bmQodmlzaWJsZURzdFJlY3Qu
eCgpKSwKKyAgICAgICAgICAgIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LmJvdHRvbSgpKSAt
IHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LnkoKSkKKyAgICAgICAgfTsKKyAgICAgICAgaWYg
KHNyY1JlY3RXaW4ucmlnaHQgPD0gMCB8fCBzcmNSZWN0V2luLmJvdHRvbSA8PSAwKQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIEJpdG1hcEluZm8gYm1wSW5mbyghdXNlQWxwaGEsIHNy
Y1JlY3RXaW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tKTsKKyAgICAgICAgdm9pZCogcGl4ZWxz
OworICAgICAgICBPd25QdHI8SEJJVE1BUD4gaGJtcFRlbXAoTWVtb3J5TWFuYWdlcjo6Y3JlYXRl
RElCU2VjdGlvbigmYm1wSW5mbywgJnBpeGVscykpOworCisgICAgICAgIGlmIChoYm1wVGVtcCkg
eworICAgICAgICAgICAgT3duUHRyPEhEQz4gaG1lbWRjKENyZWF0ZUNvbXBhdGlibGVEQyhoZGMp
KTsKKyAgICAgICAgICAgIEhHRElPQkogb2xkQm1wID0gU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQo
KSwgaGJtcFRlbXAuZ2V0KCkpOworICAgICAgICAgICAgaWYgKGNsaXBwZWRCbXApCisgICAgICAg
ICAgICAgICAgZHJhd1BhdHRlcm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNSZWN0V2luLCBjbGlw
cGVkQm1wLmdldCgpLCBwaGFzZVdpbik7CisgICAgICAgICAgICBlbHNlIGlmICgob3AgIT0gQ29t
cG9zaXRlU291cmNlT3ZlciB8fCBjYW5Vc2VESUJpdHMoKSkgJiYgc3JjUmVjdFdpbi5yaWdodCA8
PSBibXBTaXplLmN4ICogMiAmJiBzcmNSZWN0V2luLmJvdHRvbSA8PSBibXBTaXplLmN5ICogMikK
KyAgICAgICAgICAgICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RX
aW4sIHRoaXMsIGJtcFNpemUsIHBoYXNlV2luKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGVuc3Vy
ZUhhbmRsZSgpKQorICAgICAgICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQo
KSwgc3JjUmVjdFdpbiwgZ2V0SGFuZGxlKCksIHBoYXNlV2luKTsKKyAgICAgICAgICAgIGVsc2Ug
eworICAgICAgICAgICAgICAgIHZvaWQqIHBpeGVsczsKKyAgICAgICAgICAgICAgICBCaXRtYXBJ
bmZvIGJtcEluZm87CisgICAgICAgICAgICAgICAgaWYgKEhCSVRNQVAgaGJtcCA9IGNyZWF0ZUhh
bmRsZSgmcGl4ZWxzLCAmYm1wSW5mbywgLTEsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAg
ICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RXaW4sIGhibXAsIHBoYXNl
V2luKTsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRlT2JqZWN0KGhibXApOworICAgICAgICAg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFNlbGVjdE9iamVjdChobWVtZGMu
Z2V0KCksIG9sZEJtcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisKKyNpZiBkZWZpbmVkKE5PX0FMUEhBQkxFTkQpCisgICAg
ICAgICAgICBpZiAodXNlQWxwaGEgfHwgKG9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgJiYgdXNl
c1RyYW5zcGFyZW50Q29sb3IoKSkpCisjZWxzZQorICAgICAgICAgICAgaWYgKHVzZUFscGhhKSB7
CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IEJMRU5ERlVOQ1RJT04gYmxlbmQgPSB7IEFD
X1NSQ19PVkVSLCAwLCAyNTUsIEFDX1NSQ19BTFBIQSB9OworICAgICAgICAgICAgICAgIEFscGhh
QmxlbmQoaGRjLCBkc3RSZWN0V2luLmxlZnQsIGRzdFJlY3RXaW4udG9wLCBkc3RSZWN0V2luLnJp
Z2h0IC0gZHN0UmVjdFdpbi5sZWZ0LCBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9w
CisgICAgICAgICAgICAgICAgICAgICwgaG1lbWRjLmdldCgpLCAwLCAwLCBzcmNSZWN0V2luLnJp
Z2h0LCBzcmNSZWN0V2luLmJvdHRvbSwgYmxlbmQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChv
cCA9PSBDb21wb3NpdGVTb3VyY2VPdmVyICYmIHVzZXNUcmFuc3BhcmVudENvbG9yKCkpCisjZW5k
aWYKKyAgICAgICAgICAgICAgICBUcmFuc3BhcmVudEJsdChoZGMsIGRzdFJlY3RXaW4ubGVmdCwg
ZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RSZWN0V2luLmxlZnQKKyAgICAg
ICAgICAgICAgICAgICAgLCBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9wLCBobWVt
ZGMuZ2V0KCksIDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tLCB0cmFu
c3BhcmVudENvbG9yKCkpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgRFdP
UkQgYm1wT3AgPSBvcCA9PSBDb21wb3NpdGVDb3B5ID8gU1JDQ09QWQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIDogb3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciA/IFNSQ0NPUFkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICA6IG9wID09IENvbXBvc2l0ZVhPUiA/IFBBVElOVkVSVAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3AgPT0gQ29tcG9zaXRlQ2xlYXIgPyBXSElU
RU5FU1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNSQ0NPUFk7IC8vIEZJWEVNRTog
b3RoZXIgdHlwZXM/CisKKyAgICAgICAgICAgICAgICBTdHJldGNoRElCaXRzKGhkYywgZHN0UmVj
dFdpbi5sZWZ0LCBkc3RSZWN0V2luLnRvcCwgZHN0UmVjdFdpbi5yaWdodCAtIGRzdFJlY3RXaW4u
bGVmdAorICAgICAgICAgICAgICAgICAgICAsIGRzdFJlY3RXaW4uYm90dG9tIC0gZHN0UmVjdFdp
bi50b3AsIDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tCisgICAgICAg
ICAgICAgICAgICAgICwgcGl4ZWxzLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsIGJtcE9wKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCksIG9s
ZEJtcCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBTaGFyZWRCaXRtYXA6OkRDUHJv
dmlkZXIgc19kY1Byb3ZpZGVyOworU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyKiBTaGFyZWRCaXRt
YXA6Om1fZGNQcm92aWRlciA9ICZzX2RjUHJvdmlkZXI7CisKK0hEQyBTaGFyZWRCaXRtYXA6OkRD
UHJvdmlkZXI6OmdldERDKFNoYXJlZEJpdG1hcCogYm1wLCB1bnNpZ25lZCoga2V5MSwgdW5zaWdu
ZWQqIGtleTIpCit7CisgICAgaWYgKCFibXAgfHwgIWJtcC0+ZW5zdXJlSGFuZGxlKCkpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgSERDIGhkYyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURDKDApOwor
ICAgIGlmIChoZGMpIHsKKyAgICAgICAgKmtleTEgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVk
PihTZWxlY3RPYmplY3QoaGRjLCBibXAtPmdldEhhbmRsZSgpKSk7CisgICAgICAgIFJFQ1QgcmVj
dCA9IHsgMCwgMCwgYm1wLT53aWR0aCgpLCBibXAtPmhlaWdodCgpIH07CisgICAgICAgIE93blB0
cjxIUkdOPiBjbGlwUmduKENyZWF0ZVJlY3RSZ25JbmRpcmVjdCgmcmVjdCkpOworICAgICAgICBT
ZWxlY3RDbGlwUmduKGhkYywgY2xpcFJnbi5nZXQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGhk
YzsKK30KKwordm9pZCBTaGFyZWRCaXRtYXA6OkRDUHJvdmlkZXI6OnJlbGVhc2VEQyhTaGFyZWRC
aXRtYXAqLCBIREMgaGRjLCB1bnNpZ25lZCBrZXkxLCB1bnNpZ25lZCBrZXkyKQoreworICAgIGlm
ICghaGRjKQorICAgICAgICByZXR1cm47CisKKyAgICBTZWxlY3RPYmplY3QoaGRjLCByZWludGVy
cHJldF9jYXN0PEhHRElPQko+KGtleTEpKTsKKyAgICBEZWxldGVEQyhoZGMpOworfQorCit2b2lk
IFNoYXJlZEJpdG1hcDo6Y2xlYXJQaXhlbHMoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBpZiAo
IW1fcGl4ZWxzKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IGJtcFJlY3QoMCwgMCwg
d2lkdGgoKSwgaGVpZ2h0KCkpOworICAgIGJtcFJlY3QuaW50ZXJzZWN0KHIpOworICAgIGlmIChp
czE2Yml0KCkpIHsKKyAgICAgICAgaW50IHcgPSBtX2JtcEluZm8ucGFkZGVkV2lkdGgoKTsKKyAg
ICAgICAgdW5zaWduZWQgc2hvcnQqIGRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hv
cnQqPihtX3BpeGVscyk7CisgICAgICAgIGRzdCArPSBibXBSZWN0LnkoKSAqIHcgKyBibXBSZWN0
LngoKTsKKyAgICAgICAgaW50IHdvcmRzVG9TZXQgPSBibXBSZWN0LndpZHRoKCk7CisgICAgICAg
IGNvbnN0IHVuc2lnbmVkIHNob3J0KiBkc3RFbmQgPSBkc3QgKyBibXBSZWN0LmhlaWdodCgpICog
dzsKKyAgICAgICAgd2hpbGUgKGRzdCA8IGRzdEVuZCkgeworICAgICAgICAgICAgd21lbXNldChy
ZWludGVycHJldF9jYXN0PHdjaGFyX3QqPihkc3QpLCAwLCB3b3Jkc1RvU2V0KTsKKyAgICAgICAg
ICAgIGRzdCArPSB3OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHcgPSB3
aWR0aCgpOworICAgICAgICB1bnNpZ25lZCogZHN0ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25l
ZCo+KG1fcGl4ZWxzKTsKKyAgICAgICAgZHN0ICs9IGJtcFJlY3QueSgpICogdyArIGJtcFJlY3Qu
eCgpOworICAgICAgICBpbnQgd29yZHNUb1NldCA9IGJtcFJlY3Qud2lkdGgoKSAqIDI7CisgICAg
ICAgIGNvbnN0IHVuc2lnbmVkKiBkc3RFbmQgPSBkc3QgKyBibXBSZWN0LmhlaWdodCgpICogdzsK
KyAgICAgICAgd2hpbGUgKGRzdCA8IGRzdEVuZCkgeworICAgICAgICAgICAgd21lbXNldChyZWlu
dGVycHJldF9jYXN0PHdjaGFyX3QqPihkc3QpLCAwLCB3b3Jkc1RvU2V0KTsKKyAgICAgICAgICAg
IGRzdCArPSB3OworICAgICAgICB9CisgICAgfQorfQorCit9CisKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaAkocmV2aXNpb24gMCkKKysr
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmgJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9y
Y2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQg
QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYg
U2hhcmVkQml0bWFwX2gKKyNkZWZpbmUgU2hhcmVkQml0bWFwX2gKKworI2luY2x1ZGUgIkJpdG1h
cEluZm8uaCIKKworI2luY2x1ZGUgPHdpbmdkaS5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRy
Lmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitlbnVtIENvbXBvc2l0ZU9wZXJhdG9yOworY2xhc3MgRmxvYXRQb2ludDsKK2NsYXNzIEZsb2F0
UmVjdDsKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIEludFJlY3Q7CitjbGFzcyBJbnRT
aXplOworY2xhc3MgQWZmaW5lVHJhbnNmb3JtOworCitjbGFzcyBTaGFyZWRCaXRtYXA6IHB1Ymxp
YyBSZWZDb3VudGVkPFNoYXJlZEJpdG1hcD4geworcHVibGljOgorICAgIH5TaGFyZWRCaXRtYXAo
KTsKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IGNyZWF0ZUluc3RhbmNlKGJv
b2wgaXMxNmJpdCwgaW50IHcsIGludCBoLCBib29sIGluaXRQaXhlbHMpOworICAgIGNvbnN0IEJp
dG1hcEluZm8mIGJpdG1hcEluZm8oKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm87IH0KKyAgICB2
b2lkKiBieXRlcygpIHsgcmV0dXJuIG1fcGl4ZWxzOyB9CisgICAgY29uc3Qgdm9pZCogYnl0ZXMo
KSBjb25zdCB7IHJldHVybiBtX3BpeGVsczsgfQorICAgIHVuc2lnbmVkIHdpZHRoKCkgY29uc3Qg
eyByZXR1cm4gbV9ibXBJbmZvLndpZHRoKCk7IH0KKyAgICB1bnNpZ25lZCBoZWlnaHQoKSBjb25z
dCB7IHJldHVybiBtX2JtcEluZm8uaGVpZ2h0KCk7IH0KKyAgICB1bnNpZ25lZCB2YWxpZEhlaWdo
dCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsaWRIZWlnaHQ7IH0KKyAgICB2b2lkIHNldFZhbGlkSGVp
Z2h0KHVuc2lnbmVkIHZhbGlkSGVpZ2h0KSB7IG1fdmFsaWRIZWlnaHQgPSB2YWxpZEhlaWdodDsg
fQorICAgIHZvaWQgcmVzZXRQaXhlbHMoYm9vbCBibGFjayA9IGZhbHNlKTsKKyAgICB2b2lkIGNs
ZWFyUGl4ZWxzKGNvbnN0IEludFJlY3QmIHIpOworICAgIGJvb2wgbG9ja2VkKCkgY29uc3QgeyBy
ZXR1cm4gbV9sb2NrZWQ7IH0KKyAgICB2b2lkIGxvY2soKSB7IG1fbG9ja2VkID0gdHJ1ZTsgfQor
ICAgIHZvaWQgdW5sb2NrKCkgeyBtX2xvY2tlZCA9IGZhbHNlOyB9CisgICAgYm9vbCBmcmVlTWVt
b3J5KCk7CisgICAgYm9vbCBpczE2Yml0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmlzMTZi
aXQoKTsgfQorICAgIGJvb2wgaXMzMmJpdCgpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mby5pczMy
Yml0KCk7IH0KKyAgICBib29sIHRvMTZiaXQoKTsKKyAgICBib29sIGhhc0FscGhhKCkgY29uc3Qg
eyByZXR1cm4gbV9oYXNBbHBoYTsgfQorICAgIHZvaWQgc2V0SGFzQWxwaGEoYm9vbCBhbHBoYSkg
eyBtX2hhc0FscGhhID0gYWxwaGE7IH0KKyAgICBib29sIGVuc3VyZUhhbmRsZSgpOworICAgIEhC
SVRNQVAgZ2V0SGFuZGxlKCkgeyByZXR1cm4gbV9oYml0bWFwOyB9CisgICAgSEJJVE1BUCBjcmVh
dGVIYW5kbGUodm9pZCoqIHBpeGVscywgQml0bWFwSW5mbyogYm1wSW5mbywgaW50IGggPSAtMSwg
Ym9vbCB1c2UxNmJpdCA9IHRydWUpIGNvbnN0OworICAgIGJvb2wgdXNlc1RyYW5zcGFyZW50Q29s
b3IoKSBjb25zdCB7IHJldHVybiBtX3VzZXNUcmFuc3BhcmVudENvbG9yOyB9CisgICAgQ09MT1JS
RUYgdHJhbnNwYXJlbnRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdHJhbnNwYXJlbnRDb2xvcjsg
fQorICAgIHZvaWQgc2V0VHJhbnNwYXJlbnRDb2xvcihDT0xPUlJFRiBjKQorICAgIHsKKyAgICAg
ICAgbV91c2VzVHJhbnNwYXJlbnRDb2xvciA9IHRydWU7CisgICAgICAgIG1fdHJhbnNwYXJlbnRD
b2xvciA9IGM7CisgICAgfQorICAgIGJvb2wgY2FuVXNlRElCaXRzKCkgY29uc3QgeyByZXR1cm4g
IWhhc0FscGhhKCkgJiYgIXVzZXNUcmFuc3BhcmVudENvbG9yKCk7IH0KKworICAgIEhCSVRNQVAg
Y2xpcEJpdG1hcChjb25zdCBJbnRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBi
b29sIHVzZUFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXBJbmZvJiBibXBJbmZv
LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgcGl4ZWxzKTsKKworICAgIFBhc3NSZWZQ
dHI8U2hhcmVkQml0bWFwPiBjbGlwQml0bWFwKGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgdXNl
QWxwaGEpOworCisgICAgdm9pZCBkcmF3KEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgSW50
UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3Ig
Y29tcG9zaXRlT3ApOworICAgIHZvaWQgZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiBjdHh0
LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0
dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhh
c2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25z
dCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSk7CisgICAgdm9pZCBkcmF3KEhEQywgY29uc3QgSW50
UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3Ig
Y29tcG9zaXRlT3ApOworICAgIHZvaWQgZHJhd1BhdHRlcm4oSERDLCBjb25zdCBBZmZpbmVUcmFu
c2Zvcm0mLCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IEFmZmluZVRyYW5zZm9y
bSYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2lu
dCYgcGhhc2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0
LCBjb25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSk7CisKKyAgICB0eXBlZGVmIHZvaWQgKCpE
cmF3UGF0dGVybkZ1bmMpKFNoYXJlZEJpdG1hcCogYm1wLCBIREMsIGNvbnN0IEFmZmluZVRyYW5z
Zm9ybSYsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgQWZmaW5lVHJhbnNmb3Jt
JiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50
JiBwaGFzZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3Qs
IGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKTsKKyAgICB0eXBlZGVmIGJvb2wgKCpEcmF3
SW1hZ2VGdW5jKSAoU2hhcmVkQml0bWFwKiBibXAsIEhEQywgY29uc3QgSW50UmVjdCYgZHN0UmVj
dCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3Ap
OworCisgICAgc3RhdGljIERyYXdQYXR0ZXJuRnVuYyBzZXREcmF3UGF0dGVybkZ1bmMoRHJhd1Bh
dHRlcm5GdW5jIGZ1bmMpOworICAgIHN0YXRpYyBEcmF3SW1hZ2VGdW5jIHNldERyYXdJbWFnZUZ1
bmMoRHJhd0ltYWdlRnVuYyBmdW5jKTsKKworICAgIGNsYXNzIERDUHJvdmlkZXIgeworICAgIHB1
YmxpYzoKKyAgICAgICAgdmlydHVhbCBIREMgZ2V0REMoU2hhcmVkQml0bWFwKiwgdW5zaWduZWQq
IGtleTEsIHVuc2lnbmVkKiBrZXkyKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VEQyhT
aGFyZWRCaXRtYXAqLCBIREMgaGRjLCB1bnNpZ25lZCBrZXkxLCB1bnNpZ25lZCBrZXkyKTsKKyAg
ICB9OworCisgICAgc3RhdGljIERDUHJvdmlkZXIqIG1fZGNQcm92aWRlcjsKKworICAgIEhEQyBn
ZXREQyh1bnNpZ25lZCoga2V5MSwgdW5zaWduZWQqIGtleTIpIHsgcmV0dXJuIG1fZGNQcm92aWRl
ci0+Z2V0REModGhpcywga2V5MSwga2V5Mik7IH0KKyAgICB2b2lkIHJlbGVhc2VEQyhIREMgaGRj
LCB1bnNpZ25lZCBrZXkxLCB1bnNpZ25lZCBrZXkyKSB7IG1fZGNQcm92aWRlci0+cmVsZWFzZURD
KHRoaXMsIGhkYywga2V5MSwga2V5Mik7IH0KKworICAgIGNsYXNzIERDSG9sZGVyIHsKKyAgICBw
dWJsaWM6CisgICAgICAgIERDSG9sZGVyKFNoYXJlZEJpdG1hcCogYm1wID0gMCkgeyBzZXRJbnRl
cm5hbChibXApOyB9CisgICAgICAgIH5EQ0hvbGRlcigpIHsgY2xlYXJJbnRlcm5hbCgpOyB9Cisg
ICAgICAgIHZvaWQgc2V0KFNoYXJlZEJpdG1hcCogYm1wID0gMCkKKyAgICAgICAgeworICAgICAg
ICAgICAgY2xlYXJJbnRlcm5hbCgpOworICAgICAgICAgICAgc2V0SW50ZXJuYWwoYm1wKTsKKyAg
ICAgICAgfQorICAgICAgICBIREMgZ2V0KCkgY29uc3QgeyByZXR1cm4gbV9oZGM7IH0KKyAgICBw
cml2YXRlOgorICAgICAgICBEQ0hvbGRlciYgb3BlcmF0b3I9KGNvbnN0IERDSG9sZGVyJik7Cisg
ICAgICAgIERDSG9sZGVyKGNvbnN0IERDSG9sZGVyJik7CisgICAgICAgIHZvaWQgY2xlYXJJbnRl
cm5hbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtX2hkYykKKyAgICAgICAgICAgICAg
ICBtX2JpdG1hcC0+cmVsZWFzZURDKG1faGRjLCBtX2tleTEsIG1fa2V5Mik7CisgICAgICAgIH0K
KyAgICAgICAgdm9pZCBzZXRJbnRlcm5hbChTaGFyZWRCaXRtYXAqIGJtcCkKKyAgICAgICAgewor
ICAgICAgICAgICAgbV9iaXRtYXAgPSBibXA7CisgICAgICAgICAgICBtX2hkYyA9IGJtcCA/IGJt
cC0+Z2V0REMoJm1fa2V5MSwgJm1fa2V5MikgOiAwOworICAgICAgICB9CisgICAgICAgIFNoYXJl
ZEJpdG1hcCogbV9iaXRtYXA7CisgICAgICAgIEhEQyBtX2hkYzsKKyAgICAgICAgdW5zaWduZWQg
bV9rZXkxOworICAgICAgICB1bnNpZ25lZCBtX2tleTI7CisgICAgfTsKKworcHJpdmF0ZToKKyAg
ICBTaGFyZWRCaXRtYXAoYm9vbCBpczE2Yml0LCBpbnQgdywgaW50IGgsIGJvb2wgaW5pdFBpeGVs
cyk7CisgICAgU2hhcmVkQml0bWFwKGNvbnN0IEJpdG1hcEluZm8mIGJtcEluZm8sIEhCSVRNQVAg
aGJtcCwgdm9pZCogcGl4ZWxzKTsKKyAgICBCaXRtYXBJbmZvIG1fYm1wSW5mbzsKKyAgICBpbnQg
bV9yZWZlcmVuY2U7CisgICAgSEJJVE1BUCBtX2hiaXRtYXA7CisgICAgdm9pZCogbV9waXhlbHM7
CisgICAgQ09MT1JSRUYgbV90cmFuc3BhcmVudENvbG9yOworICAgIGludCBtX3ZhbGlkSGVpZ2h0
OworICAgIGJvb2wgbV9sb2NrZWQ7CisgICAgYm9vbCBtX3VzZXNUcmFuc3BhcmVudENvbG9yOwor
ICAgIGJvb2wgbV9oYXNBbHBoYTsKK307CisKK30KKworI2VuZGlmIC8vIFNoYXJlZEJpdG1hcF9o
Cg==
</data>
<flag name="review"
          id="37001"
          type_id="1"
          status="-"
          setter="tkent"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67058</attachid>
            <date>2010-09-09 10:51:07 -0700</date>
            <delta_ts>2010-09-16 09:00:20 -0700</delta_ts>
            <desc>2) ImageWinCE.cpp</desc>
            <filename>0001-ImageWinCE.patch</filename>
            <type>text/plain</type>
            <size>8302</size>
            <attacher name="Patrick R. Gansterer">paroga</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MDMxZTgxNy4uOTUxMzFiMSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMCBAQAorMjAxMC0wOS0wOSAgUGF0cmljayBHYW5z
dGVyZXIgIDxwYXJvZ2FAcGFyb2dhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBbV0lOQ0VdIEFkZCBwbGF0Zm9ybS1zcGVjaWZpYyBJbWFnZSBt
ZXRob2RzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0y
ODI3MgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvSW1hZ2VXaW5DRS5jcHA6
IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UkdCQTMyQnVmZmVyOjphc05ld05hdGl2ZUltYWdl
KToKKyAgICAgICAgKFdlYkNvcmU6OkZyYW1lRGF0YTo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29y
ZTo6Qml0bWFwSW1hZ2U6OmdldEhCSVRNQVBPZlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Qml0
bWFwSW1hZ2U6OmRyYXdGcmFtZU1hdGNoaW5nU291cmNlU2l6ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpCaXRtYXBJbWFnZTo6ZHJhdyk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZTo6ZHJhd1BhdHRl
cm4pOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRyYXdQYXR0ZXJuKToKKyAgICAg
ICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpjaGVja0ZvclNvbGlkQ29sb3IpOgorCiAyMDEwLTA5
LTA5ICBQYXRyaWNrIEdhbnN0ZXJlciAgPHBhcm9nYUBwYXJvZ2EuY29tPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy93aW5jZS9JbWFnZVdpbkNFLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvSW1hZ2VXaW5DRS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
ZTMwYTczMwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2lu
Y2UvSW1hZ2VXaW5DRS5jcHAKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo
dCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAg
UGF0cmljayBHYW5zdGVyZXIgPHBhcm9nYUBwYXJvZ2EuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJJbWFnZS5oIgorCisjaW5jbHVkZSAiQml0bWFwSW1hZ2UuaCIKKyNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZURlY29kZXIuaCIKKyNpbmNsdWRlICJO
b3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAi
U2hhcmVkQnVmZmVyLmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNs
dWRlICJXaW5jZUdyYXBoaWNzRXh0cmFzLmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCisj
aW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK05hdGl2ZUltYWdl
UHRyIFJHQkEzMkJ1ZmZlcjo6YXNOZXdOYXRpdmVJbWFnZSgpIGNvbnN0Cit7CisgICAgTmF0aXZl
SW1hZ2VQdHIgcmV0ID0gU2hhcmVkQml0bWFwOjpjcmVhdGVJbnN0YW5jZShmYWxzZSwgd2lkdGgo
KSwgaGVpZ2h0KCksIGZhbHNlKTsKKworICAgIG1lbWNweShyZXQtPmJ5dGVzKCksIG1fYnl0ZXMu
ZGF0YSgpLCBtX2J5dGVzLnNpemUoKSAqIHNpemVvZihQaXhlbERhdGEpKTsKKworICAgIHJldHVy
biByZXQ7Cit9CisKK2Jvb2wgRnJhbWVEYXRhOjpjbGVhcihib29sIGNsZWFyTWV0YURhdGEpCit7
CisgICAgaWYgKGNsZWFyTWV0YURhdGEpCisgICAgICAgIG1faGF2ZU1ldGFkYXRhID0gZmFsc2U7
CisKKyAgICBpZiAobV9mcmFtZSkgeworICAgICAgICBtX2ZyYW1lID0gMDsKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJpdG1hcElt
YWdlOjpnZXRIQklUTUFQT2ZTaXplKEhCSVRNQVAgYm1wLCBMUFNJWkUgc2l6ZSkKK3sKKyAgICBp
ZiAoIWJtcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQklUTUFQIGJtcEluZm87Cisg
ICAgR2V0T2JqZWN0KGJtcCwgc2l6ZW9mKEJJVE1BUCksICZibXBJbmZvKTsKKworICAgIEFTU0VS
VChibXBJbmZvLmJtQml0c1BpeGVsID09IDMyKTsKKyAgICBpbnQgYnVmZmVyU2l6ZSA9IGJtcElu
Zm8uYm1XaWR0aEJ5dGVzICogYm1wSW5mby5ibUhlaWdodDsKKworICAgIE93blB0cjxIREM+IGhk
YyhDcmVhdGVDb21wYXRpYmxlREMoMCkpOworICAgIEhHRElPQkogaE9sZEJtcCA9IFNlbGVjdE9i
amVjdChoZGMuZ2V0KCksIGJtcCk7CisKKyAgICB7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dCBn
YyhoZGMuZ2V0KCkpOworCisgICAgICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6
OnNpemUoKTsKKyAgICAgICAgaWYgKHNpemUpCisgICAgICAgICAgICBkcmF3RnJhbWVNYXRjaGlu
Z1NvdXJjZVNpemUoJmdjLCBGbG9hdFJlY3QoMCwgMCwgYm1wSW5mby5ibVdpZHRoLCBibXBJbmZv
LmJtSGVpZ2h0KSwgSW50U2l6ZSgqc2l6ZSksIERldmljZUNvbG9yU3BhY2UsIENvbXBvc2l0ZUNv
cHkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkcmF3KCZnYywgRmxvYXRSZWN0KDAsIDAs
IGJtcEluZm8uYm1XaWR0aCwgYm1wSW5mby5ibUhlaWdodCksIEZsb2F0UmVjdCgwLCAwLCBpbWFn
ZVNpemUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgRGV2aWNlQ29sb3JTcGFjZSwgQ29t
cG9zaXRlQ29weSk7CisgICAgfQorCisgICAgU2VsZWN0T2JqZWN0KGhkYy5nZXQoKSwgaE9sZEJt
cCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhd0ZyYW1l
TWF0Y2hpbmdTb3VyY2VTaXplKEdyYXBoaWNzQ29udGV4dCogY3R4dCwgY29uc3QgRmxvYXRSZWN0
JiBkc3RSZWN0LCBjb25zdCBJbnRTaXplJiBzcmNTaXplLCBDb2xvclNwYWNlIHN0eWxlQ29sb3JT
cGFjZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAgaW50IGZyYW1lcyA9
IGZyYW1lQ291bnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7Cisg
ICAgICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IGJtcCA9IGZyYW1lQXRJbmRleChpKTsKKyAgICAg
ICAgaWYgKGJtcCAmJiBibXAtPmhlaWdodCgpID09IChzaXplX3Qpc3JjU2l6ZS5oZWlnaHQoKSAm
JiBibXAtPndpZHRoKCkgPT0gKHNpemVfdClzcmNTaXplLndpZHRoKCkpIHsKKyAgICAgICAgICAg
IHNpemVfdCBjdXJyZW50RnJhbWUgPSBtX2N1cnJlbnRGcmFtZTsKKyAgICAgICAgICAgIG1fY3Vy
cmVudEZyYW1lID0gaTsKKyAgICAgICAgICAgIGRyYXcoY3R4dCwgZHN0UmVjdCwgRmxvYXRSZWN0
KDAsIDAsIHNyY1NpemUud2lkdGgoKSwgc3JjU2l6ZS5oZWlnaHQoKSksIHN0eWxlQ29sb3JTcGFj
ZSwgY29tcG9zaXRlT3ApOworICAgICAgICAgICAgbV9jdXJyZW50RnJhbWUgPSBjdXJyZW50RnJh
bWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBObyBp
bWFnZSBvZiB0aGUgY29ycmVjdCBzaXplIHdhcyBmb3VuZCwgZmFsbGJhY2sgdG8gZHJhd2luZyB0
aGUgY3VycmVudCBmcmFtZQorICAgIEludFNpemUgaW1hZ2VTaXplID0gQml0bWFwSW1hZ2U6OnNp
emUoKTsKKyAgICBkcmF3KGN0eHQsIGRzdFJlY3QsIEZsb2F0UmVjdCgwLCAwLCBpbWFnZVNpemUu
d2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKSwgc3R5bGVDb2xvclNwYWNlLCBjb21wb3NpdGVP
cCk7Cit9CisKK3ZvaWQgQml0bWFwSW1hZ2U6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBj
b25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdEluLCBDb2xv
clNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7
CisgICAgaWYgKCFtX3NvdXJjZS5pbml0aWFsaXplZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBSZWZQdHI8U2hhcmVkQml0bWFwPiBibXAgPSBmcmFtZUF0SW5kZXgobV9jdXJyZW50RnJhbWUp
OworICAgIGlmIChtYXlGaWxsV2l0aFNvbGlkQ29sb3IoKSkKKyAgICAgICAgZmlsbFdpdGhTb2xp
ZENvbG9yKGN0eHQsIGRzdFJlY3QsIHNvbGlkQ29sb3IoKSwgc3R5bGVDb2xvclNwYWNlLCBjb21w
b3NpdGVPcCk7CisgICAgZWxzZSB7CisgICAgICAgIEludFJlY3QgaW50U3JjUmVjdChzcmNSZWN0
SW4pOworCisgICAgICAgIGlmIChibXAtPndpZHRoKCkgIT0gbV9zb3VyY2Uuc2l6ZSgpLndpZHRo
KCkpIHsKKyAgICAgICAgICAgIGRvdWJsZSByYXRlID0gKGRvdWJsZSlibXAtPndpZHRoKCkgLyBt
X3NvdXJjZS5zaXplKCkud2lkdGgoKTsKKyAgICAgICAgICAgIGludCB0ZW1wID0gc3RhYmxlUm91
bmQoc3JjUmVjdEluLnJpZ2h0KCkgKiByYXRlKTsKKyAgICAgICAgICAgIGludFNyY1JlY3Quc2V0
WChzdGFibGVSb3VuZChzcmNSZWN0SW4ueCgpICogcmF0ZSkpOworICAgICAgICAgICAgaW50U3Jj
UmVjdC5zZXRXaWR0aCh0ZW1wIC0gaW50U3JjUmVjdC54KCkpOworICAgICAgICAgICAgdGVtcCA9
IHN0YWJsZVJvdW5kKHNyY1JlY3RJbi5ib3R0b20oKSAqIHJhdGUpOworICAgICAgICAgICAgaW50
U3JjUmVjdC5zZXRZKHN0YWJsZVJvdW5kKHNyY1JlY3RJbi55KCkgKiByYXRlKSk7CisgICAgICAg
ICAgICBpbnRTcmNSZWN0LnNldEhlaWdodCh0ZW1wIC0gaW50U3JjUmVjdC55KCkpOworICAgICAg
ICB9CisgICAgICAgIGJtcC0+ZHJhdyhjdHh0LCBlbmNsb3NpbmdJbnRSZWN0KGRzdFJlY3QpLCBp
bnRTcmNSZWN0LCBzdHlsZUNvbG9yU3BhY2UsIGNvbXBvc2l0ZU9wKTsKKyAgICB9CisKKyAgICBz
dGFydEFuaW1hdGlvbigpOworfQorCit2b2lkIEltYWdlOjpkcmF3UGF0dGVybihHcmFwaGljc0Nv
bnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJlY3QsIGNvbnN0IEFmZmluZVRyYW5z
Zm9ybSYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZs
b2F0UG9pbnQmIHBoYXNlLCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29tcG9zaXRlT3Bl
cmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QpCit7CisgICAgbm90SW1wbGVtZW50
ZWQoKTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0
KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IEFmZmluZVRyYW5zZm9y
bSYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0
UG9pbnQmIHBoYXNlLCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0
b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QpCit7CisgICAgUmVmUHRyPFNoYXJlZEJp
dG1hcD4gYm1wID0gbmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKyAgICBpZiAoYm1wKQor
ICAgICAgICBibXAtPmRyYXdQYXR0ZXJuKGN0eHQsIHRpbGVSZWN0SW4sIHBhdHRlcm5UcmFuc2Zv
cm0sIHBoYXNlLCBzdHlsZUNvbG9yU3BhY2UsIG9wLCBkZXN0UmVjdCwgbV9zb3VyY2Uuc2l6ZSgp
KTsKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6Y2hlY2tGb3JTb2xpZENvbG9yKCkKK3sKKyAgICBp
ZiAobV9jaGVja2VkRm9yU29saWRDb2xvcikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGZy
YW1lQ291bnQoKSAhPSAxKSB7CisgICAgICAgIG1faXNTb2xpZENvbG9yID0gZmFsc2U7CisgICAg
ICAgIG1fY2hlY2tlZEZvclNvbGlkQ29sb3IgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gYm1wID0gZnJhbWVBdEluZGV4KDApOworICAg
IGlmICghYm1wIHx8ICFibXAtPnZhbGlkSGVpZ2h0KCkpIHsKKyAgICAgICAgbV9pc1NvbGlkQ29s
b3IgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChibXAtPndpZHRo
KCkgPT0gMSAmJiBibXAtPnZhbGlkSGVpZ2h0KCkgPT0gMSkgeworICAgICAgICBtX2lzU29saWRD
b2xvciA9IHRydWU7CisKKyAgICAgICAgaWYgKGJtcC0+aXMxNmJpdCgpKSB7CisgICAgICAgICAg
ICB1bnNpZ25lZCBzaG9ydCBjID0gKCh1bnNpZ25lZCBzaG9ydCAqKWJtcC0+Ynl0ZXMoKSlbMF07
CisgICAgICAgICAgICBpbnQgciA9IChjID4+IDcpICYgMHhGODsKKyAgICAgICAgICAgIGludCBn
ID0gKGMgPj4gMikgJiAweEY4OworICAgICAgICAgICAgaW50IGIgPSAoYyA8PCAzKSAmIDB4Rjg7
CisgICAgICAgICAgICBpZiAoYm1wLT51c2VzVHJhbnNwYXJlbnRDb2xvcigpICYmIGJtcC0+dHJh
bnNwYXJlbnRDb2xvcigpID09IFJHQihyLCBnLCBiKSkKKyAgICAgICAgICAgICAgICBtX3NvbGlk
Q29sb3IgPSBDb2xvcihyLCBnLCBiLCAwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICBtX3NvbGlkQ29sb3IgPSBDb2xvcihyLCBnLCBiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIHVuc2lnbmVkIGMgPSAoKHVuc2lnbmVkICopYm1wLT5ieXRlcygpKVswXTsKKyAg
ICAgICAgICAgIG1fc29saWRDb2xvciA9IENvbG9yKGMpOworICAgICAgICB9CisKKyAgICAgICAg
aWYgKGJtcC0+dmFsaWRIZWlnaHQoKSA9PSBibXAtPmhlaWdodCgpKQorICAgICAgICAgICAgbV9j
aGVja2VkRm9yU29saWRDb2xvciA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9pc1Nv
bGlkQ29sb3IgPSBmYWxzZTsKKyAgICAgICAgbV9jaGVja2VkRm9yU29saWRDb2xvciA9IHRydWU7
CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>71636</attachid>
            <date>2010-10-23 05:43:26 -0700</date>
            <delta_ts>2010-11-01 16:59:17 -0700</delta_ts>
            <desc>1) SharedBitmap</desc>
            <filename>bug-28272.patch</filename>
            <type>text/plain</type>
            <size>30242</size>
            <attacher name="Patrick R. Gansterer">paroga</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZWViNDk4My4uZGM3ODBjNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MyBAQAorMjAxMC0xMC0yMyAgUGF0cmljayBHYW5z
dGVyZXIgIDxwYXJvZ2FAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBbV0lOQ0VdIEFkZCBTaGFyZWRCaXRtYXAKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI4MjcyCisKKyAgICAgICAgU2hh
cmVkQml0bWFwIGlzIGEgaGVscGVyIGNsYXNzIHVzZWQgYXMgTmF0aXZlSW1hZ2VQdHIgZm9yIFdp
bkNFLgorICAgICAgICBJdCdzIHdpZGUgdXNlZCBieSBXaW5DRSBncmFwaGljcyBmaWxlcyBhcyBh
IHJlcGxhY2VtZW50IG9mIEhCSVRNQVAuCisKKyAgICAgICAgT3JpZ2luYWxseSB3cml0dGVuIGJ5
IFlvbmcgTGkgPHlvbmcubGlAdG9yY2htb2JpbGUuY29tPi4KKworICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6U2hhcmVkQml0bWFwOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFw
OjpTaGFyZWRCaXRtYXApOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjp+U2hhcmVk
Qml0bWFwKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6cmVzZXRQaXhlbHMpOgor
ICAgICAgICAoV2ViQ29yZTo6Y29udmVydDMyVG8xNik6CisgICAgICAgIChXZWJDb3JlOjpTaGFy
ZWRCaXRtYXA6OnRvMTZiaXQpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpmcmVl
TWVtb3J5KToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6Y3JlYXRlSGFuZGxlKToK
KyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6ZW5zdXJlSGFuZGxlKToKKyAgICAgICAg
KFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6ZHJhdyk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRC
aXRtYXA6OmNsaXBCaXRtYXApOgorICAgICAgICAoV2ViQ29yZTo6ZHJhd1BhdHRlcm5TaW1wbGUp
OgorICAgICAgICAoV2ViQ29yZTo6bm9ybWFsaXplUGhhc2UpOgorICAgICAgICAoV2ViQ29yZTo6
U2hhcmVkQml0bWFwOjpkcmF3UGF0dGVybik6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRt
YXA6OkRDUHJvdmlkZXI6OmdldERDKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6
RENQcm92aWRlcjo6cmVsZWFzZURDKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6
Y2xlYXJQaXhlbHMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJp
dG1hcC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkRDUHJvdmlkZXI6OmdldERDKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRDUHJvdmlkZXI6OnJlbGVhc2VEQyk6CisgICAgICAgIChXZWJDb3Jl
OjpEQ1Byb3ZpZGVyOjpEQ0hvbGRlcjo6RENIb2xkZXIpOgorICAgICAgICAoV2ViQ29yZTo6RENQ
cm92aWRlcjo6RENIb2xkZXI6On5EQ0hvbGRlcik6CisgICAgICAgIChXZWJDb3JlOjpEQ1Byb3Zp
ZGVyOjpEQ0hvbGRlcjo6c2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkRDUHJvdmlkZXI6OkRDSG9s
ZGVyOjpnZXQpOgorICAgICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6RENIb2xkZXI6OmNsZWFy
SW50ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6RENIb2xkZXI6OnNldElu
dGVybmFsKToKKwogMjAxMC0xMC0yMiAgUGF0cmljayBHYW5zdGVyZXIgIDxwYXJvZ2FAd2Via2l0
Lm9yZz4KIAogICAgICAgICBVbnJldmlld2VkLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLjUwYzFlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5jcHAKQEAgLTAsMCArMSw2MzkgQEAKKy8qCisgKiAgQ29w
eXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFBhdHJpY2sgR2Fuc3RlcmVyIDxwYXJvZ2FAcGFy
b2dhLmNvbT4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNoYXJl
ZEJpdG1hcC5oIgorCisjaW5jbHVkZSAiR0RJRXh0cmFzLmgiCisjaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NUeXBlcy5oIgorI2luY2x1ZGUgIlRyYW5zZm9y
bWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSAiV2luY2VHcmFwaGljc0V4dHJhcy5oIgorI2luY2x1
ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWRMZWFrQ291bnRlci5o
PgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCisjaWZuZGVmIE5ERUJVRworc3RhdGljIFdURjo6UmVmQ291bnRl
ZExlYWtDb3VudGVyIHNoYXJlZEJpdG1hcExlYWtDb3VudGVyKCJTaGFyZWRCaXRtYXAiKTsKKyNl
bmRpZgorCisKK1Bhc3NSZWZQdHI8U2hhcmVkQml0bWFwPiBTaGFyZWRCaXRtYXA6OmNyZWF0ZShj
b25zdCBJbnRTaXplJiBzaXplLCBCaXRtYXBJbmZvOjpCaXRDb3VudCBiaXRDb3VudCwgYm9vbCBp
bml0UGl4ZWxzKQoreworICAgIFNoYXJlZEJpdG1hcCogcmVzdWx0YW50Qml0bWFwID0gbmV3IFNo
YXJlZEJpdG1hcChzaXplLCBiaXRDb3VudCwgaW5pdFBpeGVscyk7CisgICAgaWYgKHJlc3VsdGFu
dEJpdG1hcCAmJiAhcmVzdWx0YW50Qml0bWFwLT5ieXRlcygpKSB7CisgICAgICAgIGRlbGV0ZSBy
ZXN1bHRhbnRCaXRtYXA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gYWRv
cHRSZWYocmVzdWx0YW50Qml0bWFwKTsKK30KKworUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IFNo
YXJlZEJpdG1hcDo6Y3JlYXRlKGNvbnN0IFZlY3Rvcjx1bnNpZ25lZD4mIGRhdGEsIGNvbnN0IElu
dFNpemUmIHNpemUsIGJvb2wgaGFzQWxwaGEpCit7CisgICAgUGFzc1JlZlB0cjxTaGFyZWRCaXRt
YXA+IHJlc3VsdCA9IGNyZWF0ZShzaXplLCBCaXRtYXBJbmZvOjpCaXRDb3VudDMyLCBmYWxzZSk7
CisgICAgaWYgKHJlc3VsdCkgeworICAgICAgICBtZW1jcHkocmVzdWx0LT5ieXRlcygpLCBkYXRh
LmRhdGEoKSwgZGF0YS5zaXplKCkgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICAgICAgcmVzdWx0
LT5zZXRIYXNBbHBoYShoYXNBbHBoYSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisK
K1NoYXJlZEJpdG1hcDo6U2hhcmVkQml0bWFwKGNvbnN0IEJpdG1hcEluZm8mIGJtcEluZm8sIEhC
SVRNQVAgaGJtcCwgdm9pZCogcGl4ZWxzKQorICAgIDogbV9ibXBJbmZvKGJtcEluZm8pCisgICAg
LCBtX2xvY2tlZChmYWxzZSkKKyAgICAsIG1fdXNlc1RyYW5zcGFyZW50Q29sb3IoZmFsc2UpCisg
ICAgLCBtX3RyYW5zcGFyZW50Q29sb3IoUkdCKDAsIDAsIDApKQorICAgICwgbV9waXhlbHMocGl4
ZWxzKQorICAgICwgbV9oYml0bWFwKGhibXApCisgICAgLCBtX2hhc0FscGhhKGZhbHNlKQorICAg
ICwgbV92YWxpZEhlaWdodChibXBJbmZvLmhlaWdodCgpKQoreworI2lmbmRlZiBOREVCVUcKKyAg
ICBzaGFyZWRCaXRtYXBMZWFrQ291bnRlci5pbmNyZW1lbnQoKTsKKyNlbmRpZgorfQorCitTaGFy
ZWRCaXRtYXA6OlNoYXJlZEJpdG1hcChjb25zdCBJbnRTaXplJiBzaXplLCBCaXRtYXBJbmZvOjpC
aXRDb3VudCBiaXRDb3VudCwgYm9vbCBpbml0UGl4ZWxzKQorICAgIDogbV9ibXBJbmZvKEJpdG1h
cEluZm86OmNyZWF0ZUJvdHRvbVVwKHNpemUsIGJpdENvdW50KSkKKyAgICAsIG1fcmVmZXJlbmNl
KDEpCisgICAgLCBtX2xvY2tlZChmYWxzZSkKKyAgICAsIG1fdXNlc1RyYW5zcGFyZW50Q29sb3Io
ZmFsc2UpCisgICAgLCBtX3RyYW5zcGFyZW50Q29sb3IoUkdCKDAsIDAsIDApKQorICAgICwgbV9w
aXhlbHMoMCkKKyAgICAsIG1faGFzQWxwaGEoZmFsc2UpCisgICAgLCBtX3ZhbGlkSGVpZ2h0KGFi
cyhzaXplLmhlaWdodCgpKSkKKyAgICAsIG1faGJpdG1hcCgwKQoreworI2lmbmRlZiBOREVCVUcK
KyAgICBzaGFyZWRCaXRtYXBMZWFrQ291bnRlci5pbmNyZW1lbnQoKTsKKyNlbmRpZgorCisgICAg
dW5zaWduZWQgYnVmZmVyU2l6ZSA9IG1fYm1wSW5mby5udW1QaXhlbHMoKTsKKyAgICBpZiAoYml0
Q291bnQgPT0gQml0bWFwSW5mbzo6Qml0Q291bnQxNikKKyAgICAgICAgYnVmZmVyU2l6ZSAvPSAy
OworCisgICAgbV9waXhlbHMgPSBuZXcgdW5zaWduZWRbYnVmZmVyU2l6ZV07CisKKyAgICBpZiAo
aW5pdFBpeGVscykKKyAgICAgICAgcmVzZXRQaXhlbHMoKTsKK30KKworU2hhcmVkQml0bWFwOjp+
U2hhcmVkQml0bWFwKCkKK3sKKyNpZm5kZWYgTkRFQlVHCisgICAgc2hhcmVkQml0bWFwTGVha0Nv
dW50ZXIuZGVjcmVtZW50KCk7CisjZW5kaWYKKworICAgIGlmIChtX2hiaXRtYXApCisgICAgICAg
IERlbGV0ZU9iamVjdChtX2hiaXRtYXApOworICAgIGVsc2UKKyAgICAgICAgZGVsZXRlW10gbV9w
aXhlbHM7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpyZXNldFBpeGVscyhib29sIGJsYWNrKQor
eworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKworICAgIHVuc2lnbmVkIGJ1
ZmZlclNpemUgPSBtX2JtcEluZm8ubnVtUGl4ZWxzKCk7CisgICAgaWYgKGJsYWNrKSB7CisgICAg
ICAgIHVuc2lnbmVkIGJ1ZmZlclNpemVJbkJ5dGVzID0gYnVmZmVyU2l6ZSAqIChpczE2Yml0KCkg
PyAyIDogNCk7CisgICAgICAgIG1lbXNldChtX3BpeGVscywgMCwgYnVmZmVyU2l6ZUluQnl0ZXMp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlzMTZiaXQoKSkgeworICAgICAg
ICAvLyBGaWxsIGl0IHdpdGggd2hpdGUgY29sb3IKKyAgICAgICAgd21lbXNldChyZWludGVycHJl
dF9jYXN0PHdjaGFyX3QqPihtX3BpeGVscyksIDB4RkZGRiwgYnVmZmVyU2l6ZSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICAvLyBNYWtlIGl0IHdoaXRlIGJ1dCB0cmFuc3BhcmVudAor
ICAgIHVuc2lnbmVkKiBwaXhlbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQqPihtX3BpeGVs
cyk7CisgICAgY29uc3QgdW5zaWduZWQqIGNvbnN0IGJ1ZmZlckVuZCA9IHBpeGVsICsgYnVmZmVy
U2l6ZTsKKyAgICB3aGlsZSAocGl4ZWwgPCBidWZmZXJFbmQpCisgICAgICAgICpwaXhlbCsrID0g
MHgwMEZGRkZGRjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBjb252ZXJ0MzJU
bzE2KHVuc2lnbmVkIHBpeGVsKQoreworICAgIHVuc2lnbmVkIHNob3J0IHIgPSBzdGF0aWNfY2Fz
dDx1bnNpZ25lZCBzaG9ydD4oKHBpeGVsICYgMHgwMEY4MDAwMCkgPj4gOCk7CisgICAgdW5zaWdu
ZWQgc2hvcnQgZyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PigocGl4ZWwgJiAweDAwMDBG
QzAwKSA+PiA1KTsKKyAgICB1bnNpZ25lZCBzaG9ydCBiID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQg
c2hvcnQ+KChwaXhlbCAmIDB4MDAwMDAwRjgpID4+IDMpOworICAgIHJldHVybiByIHwgZyB8IGI7
Cit9CisKK2Jvb2wgU2hhcmVkQml0bWFwOjp0bzE2Yml0KCkKK3sKKyAgICBpZiAobV9sb2NrZWQp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoaXMxNmJpdCgpKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIEJpdG1hcEluZm8gbmV3Qm1wSW5mbyA9IEJpdG1hcEluZm86OmNyZWF0
ZShtX2JtcEluZm8uc2l6ZSgpLCBCaXRtYXBJbmZvOjpCaXRDb3VudDE2KTsKKworICAgIGludCB3
aWR0aCA9IG5ld0JtcEluZm8ud2lkdGgoKTsKKyAgICBpbnQgcGFkZGVkV2lkdGggPSBuZXdCbXBJ
bmZvLnBhZGRlZFdpZHRoKCk7CisgICAgaW50IGJ1ZmZlclNpemUgPSBwYWRkZWRXaWR0aCAqIG5l
d0JtcEluZm8uaGVpZ2h0KCk7CisgICAgdm9pZCogbmV3UGl4ZWxzID0gbmV3IHVuc2lnbmVkW2J1
ZmZlclNpemUgLyAyXTsKKworICAgIGlmICghbmV3UGl4ZWxzKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICB1bnNpZ25lZCBzaG9ydCogcDE2ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25l
ZCBzaG9ydCo+KG5ld1BpeGVscyk7CisgICAgY29uc3QgdW5zaWduZWQqIHAzMiA9IHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQqPihtX3BpeGVscyk7CisKKyAgICBjb25zdCBib29sIHNr
aXBzID0gcGFkZGVkV2lkdGggIT0gd2lkdGg7CisKKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCog
Y29uc3QgcDE2ZW5kID0gcDE2ICsgYnVmZmVyU2l6ZTsKKyAgICB3aGlsZSAocDE2IDwgcDE2ZW5k
KSB7CisgICAgICAgIGZvciAodW5zaWduZWQgc2hvcnQqIHAxNmxpbmVFbmQgPSBwMTYgKyB3aWR0
aDsgcDE2IDwgcDE2bGluZUVuZDsgKQorICAgICAgICAgICAgKnAxNisrID0gY29udmVydDMyVG8x
NigqcDMyKyspOworCisgICAgICAgIGlmIChza2lwcykKKyAgICAgICAgICAgICpwMTYrKyA9IDA7
CisgICAgfQorCisgICAgaWYgKG1faGJpdG1hcCkgeworICAgICAgICBEZWxldGVPYmplY3QobV9o
Yml0bWFwKTsKKyAgICAgICAgbV9oYml0bWFwID0gMDsKKyAgICB9IGVsc2UKKyAgICAgICAgZGVs
ZXRlW10gbV9waXhlbHM7CisKKyAgICBtX3BpeGVscyA9IG5ld1BpeGVsczsKKyAgICBtX2JtcElu
Zm8gPSBuZXdCbXBJbmZvOworCisgICAgc2V0SGFzQWxwaGEoZmFsc2UpOworICAgIHJldHVybiB0
cnVlOworfQorCitib29sIFNoYXJlZEJpdG1hcDo6ZnJlZU1lbW9yeSgpCit7CisgICAgaWYgKG1f
bG9ja2VkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobV9oYml0bWFwKSB7Cisg
ICAgICAgIERlbGV0ZU9iamVjdChtX2hiaXRtYXApOworICAgICAgICBtX2hiaXRtYXAgPSAwOwor
ICAgICAgICBtX3BpeGVscyA9IDA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IGlmIChtX3BpeGVscykgeworICAgICAgICBkZWxldGVbXSBtX3BpeGVsczsKKyAgICAgICAgbV9w
aXhlbHMgPSAwOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK0hCSVRNQVAgU2hhcmVkQml0bWFwOjpjcmVhdGVIYW5kbGUodm9pZCoqIHBpeGVs
cywgQml0bWFwSW5mbyogYm1wSW5mbywgaW50IGhlaWdodCwgYm9vbCB1c2UxNmJpdCkgY29uc3QK
K3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChoZWln
aHQgPT0gLTEpCisgICAgICAgIGhlaWdodCA9IHRoaXMtPmhlaWdodCgpOworICAgICpibXBJbmZv
ID0gQml0bWFwSW5mbzo6Y3JlYXRlQm90dG9tVXAoSW50U2l6ZSh3aWR0aCgpLCBoZWlnaHQpLCAo
dXNlMTZiaXQgfHwgaXMxNmJpdCgpKSA/IEJpdG1hcEluZm86OkJpdENvdW50MTYgOiBCaXRtYXBJ
bmZvOjpCaXRDb3VudDMyKTsKKworICAgIEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24o
MCwgYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsIHBpeGVscywgMCwgMCk7CisKKyAgICBpZiAoIWhi
bXApCisgICAgICAgIHJldHVybiAwOworCisgICAgT3duUHRyPEhEQz4gYm1wREMoQ3JlYXRlQ29t
cGF0aWJsZURDKDApKTsKKyAgICBIR0RJT0JKIGhPbGRCbXAgPSBTZWxlY3RPYmplY3QoYm1wREMu
Z2V0KCksIGhibXApOworCisgICAgU3RyZXRjaERJQml0cyhibXBEQy5nZXQoKSwgMCwgMCwgd2lk
dGgoKSwgaGVpZ2h0LCAwLCAwLCB3aWR0aCgpLCBoZWlnaHQsIG1fcGl4ZWxzLCAmbV9ibXBJbmZv
LCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAgICBTZWxlY3RPYmplY3QoYm1wREMuZ2V0
KCksIGhPbGRCbXApOworCisgICAgcmV0dXJuIGhibXA7Cit9CisKK2Jvb2wgU2hhcmVkQml0bWFw
OjplbnN1cmVIYW5kbGUoKQoreworICAgIGlmIChtX2hiaXRtYXApCisgICAgICAgIHJldHVybiB0
cnVlOworCisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
aWYgKG1fbG9ja2VkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBCaXRtYXBJbmZvIGJt
cEluZm87CisgICAgdm9pZCogcGl4ZWxzOworICAgIG1faGJpdG1hcCA9IGNyZWF0ZUhhbmRsZSgm
cGl4ZWxzLCAmYm1wSW5mbywgLTEsICFoYXNBbHBoYSgpKTsKKworICAgIGlmICghbV9oYml0bWFw
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBkZWxldGVbXSBtX3BpeGVsczsKKyAgICBt
X3BpeGVscyA9IHBpeGVsczsKKyAgICBtX2JtcEluZm8gPSBibXBJbmZvOworCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3KEdyYXBoaWNzQ29udGV4dCogY3R4
dCwgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29sb3JT
cGFjZSBzdHlsZUNvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQorewor
ICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKyAgICBjdHh0LT5kcmF3Qml0bWFw
KHRoaXMsIGRzdFJlY3QsIHNyY1JlY3QsIHN0eWxlQ29sb3JTcGFjZSwgY29tcG9zaXRlT3ApOwor
fQorCit2b2lkIFNoYXJlZEJpdG1hcDo6ZHJhdyhIREMgaGRjLCBjb25zdCBJbnRSZWN0JiBkc3RS
ZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVP
cCkKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZHN0
UmVjdC5pc0VtcHR5KCkgfHwgc3JjUmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIEhCSVRNQVAgaGJpdG1hcCA9IDA7CisgICAgYm9vbCB1c2luZ0hhbmRsZSA9IGNvbXBvc2l0
ZU9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgJiYgKGhhc0FscGhhKCkgJiYgaGFzQWxwaGFCbGVu
ZFN1cHBvcnQoKSB8fCB1c2VzVHJhbnNwYXJlbnRDb2xvcigpKTsKKworICAgIGlmICh1c2luZ0hh
bmRsZSkgeworICAgICAgICBpZiAoZW5zdXJlSGFuZGxlKCkpCisgICAgICAgICAgICBoYml0bWFw
ID0gbV9oYml0bWFwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHZvaWQqIHBpeGVsczsK
KyAgICAgICAgICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICAgICAgICAgIGhiaXRtYXAgPSBj
cmVhdGVIYW5kbGUoJnBpeGVscywgJmJtcEluZm8sIC0xLCB1c2VzVHJhbnNwYXJlbnRDb2xvcigp
KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWhiaXRtYXApIHsKKyAgICAgICAgLy8gRklY
TUU6IGhhbmRsZSBvdGhlciBjb21wb3NpdGUgb3BlcmF0aW9uIHR5cGVzPworICAgICAgICBEV09S
RCByb3AgPSBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVDb3B5ID8gU1JDQ09QWQorICAgICAgICAg
ICAgOiBjb21wb3NpdGVPcCA9PSBDb21wb3NpdGVYT1IgPyBQQVRJTlZFUlQKKyAgICAgICAgICAg
IDogY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlQ2xlYXIgPyBXSElURU5FU1MKKyAgICAgICAgICAg
IDogU1JDQ09QWTsKKworICAgICAgICBTdHJldGNoRElCaXRzKGhkYywgZHN0UmVjdC54KCksIGRz
dFJlY3QueSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCkKKyAgICAgICAgICAg
ICwgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVp
Z2h0KCksIG1fcGl4ZWxzLCAmbV9ibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgcm9wKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBPd25QdHI8SERDPiBobWVtZGMoQ3JlYXRlQ29tcGF0aWJsZURDKGhk
YykpOworICAgICAgICBIR0RJT0JKIGhPbGRCbXAgPSBTZWxlY3RPYmplY3QoaG1lbWRjLmdldCgp
LCBoYml0bWFwKTsKKworICAgICAgICBpZiAoIXVzZXNUcmFuc3BhcmVudENvbG9yKCkgJiYgaGFz
QWxwaGFCbGVuZFN1cHBvcnQoKSkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IEJMRU5ERlVO
Q1RJT04gYmxlbmQgPSB7IEFDX1NSQ19PVkVSLCAwLCAyNTUsIEFDX1NSQ19BTFBIQSB9OworICAg
ICAgICAgICAgYm9vbCBzdWNjZXNzID0gYWxwaGFCbGVuZElmU3VwcG9ydGVkKGhkYywgZHN0UmVj
dC54KCksIGRzdFJlY3QueSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCksIGht
ZW1kYy5nZXQoKQorICAgICAgICAgICAgICAgICwgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBz
cmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksIGJsZW5kKTsKKyAgICAgICAgICAgIEFT
U0VSVF9VTlVTRUQoc3VjY2Vzcywgc3VjY2Vzcyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAg
ICAgVHJhbnNwYXJlbnRCbHQoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qu
d2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgaG1lbWRjLmdldCgpCisgICAgICAgICAgICAgICAg
LCBzcmNSZWN0LngoKSwgc3JjUmVjdC55KCksIHNyY1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWln
aHQoKSwgdHJhbnNwYXJlbnRDb2xvcigpKTsKKworICAgICAgICBTZWxlY3RPYmplY3QoaG1lbWRj
LmdldCgpLCBoT2xkQm1wKTsKKyAgICAgICAgaWYgKGhiaXRtYXAgIT0gbV9oYml0bWFwKQorICAg
ICAgICAgICAgRGVsZXRlT2JqZWN0KGhiaXRtYXApOworICAgIH0KK30KKworSEJJVE1BUCBTaGFy
ZWRCaXRtYXA6OmNsaXBCaXRtYXAoY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCB1c2VBbHBoYSwg
Qml0bWFwSW5mbyYgYm1wSW5mbywgdm9pZComIHBpeGVscykKK3sKKyAgICBpZiAoIWJ5dGVzKCkp
CisgICAgICAgIHJldHVybiAwOworCisgICAgaW50IG9sZFdpZHRoID0gd2lkdGgoKTsKKyAgICBp
bnQgb2xkSGVpZ2h0ID0gaGVpZ2h0KCk7CisgICAgaW50IGNvcHlXaWR0aCA9IHN0ZDo6bWluPGlu
dD4ocmVjdC53aWR0aCgpLCBvbGRXaWR0aCAtIHJlY3QueCgpKTsKKyAgICBpbnQgY29weUhlaWdo
dCA9IHN0ZDo6bWluPGludD4ocmVjdC5oZWlnaHQoKSwgb2xkSGVpZ2h0IC0gcmVjdC55KCkpOwor
ICAgIGlmICghY29weVdpZHRoIHx8ICFjb3B5SGVpZ2h0KQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIGJtcEluZm8gPSBCaXRtYXBJbmZvOjpjcmVhdGVCb3R0b21VcChJbnRTaXplKGNvcHlXaWR0
aCwgY29weUhlaWdodCksICh1c2VBbHBoYSAmJiBpczMyYml0KCkpID8gQml0bWFwSW5mbzo6Qml0
Q291bnQzMiA6IEJpdG1hcEluZm86OkJpdENvdW50MTYpOworICAgIEhCSVRNQVAgbmV3Qm1wID0g
Q3JlYXRlRElCU2VjdGlvbigwLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAs
IDApOworCisgICAgaWYgKG5ld0JtcCkgeworICAgICAgICBPd25QdHI8SERDPiBkY05ldyhDcmVh
dGVDb21wYXRpYmxlREMoMCkpOworICAgICAgICBIR0RJT0JKIHRtcE5ldyA9IFNlbGVjdE9iamVj
dChkY05ldy5nZXQoKSwgbmV3Qm1wKTsKKworICAgICAgICBTdHJldGNoRElCaXRzKGRjTmV3Lmdl
dCgpLCAwLCAwLCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQsIHJlY3QueCgpLCByZWN0LnkoKSwgY29w
eVdpZHRoLCBjb3B5SGVpZ2h0CisgICAgICAgICAgICAsIGJ5dGVzKCksICZiaXRtYXBJbmZvKCks
IERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKKworICAgICAgICBTZWxlY3RPYmplY3QoZGNOZXcu
Z2V0KCksIHRtcE5ldyk7CisgICAgfQorCisgICAgcmV0dXJuIG5ld0JtcDsKK30KKworUGFzc1Jl
ZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJlZEJpdG1hcDo6Y2xpcEJpdG1hcChjb25zdCBJbnRSZWN0
JiByZWN0LCBib29sIHVzZUFscGhhKQoreworICAgIGludCBvbGRXaWR0aCA9IHdpZHRoKCk7Cisg
ICAgaW50IG9sZEhlaWdodCA9IGhlaWdodCgpOworICAgIGludCBjb3B5V2lkdGggPSBzdGQ6Om1p
bjxpbnQ+KHJlY3Qud2lkdGgoKSwgb2xkV2lkdGggLSByZWN0LngoKSk7CisgICAgaW50IGNvcHlI
ZWlnaHQgPSBzdGQ6Om1pbjxpbnQ+KHJlY3QuaGVpZ2h0KCksIG9sZEhlaWdodCAtIHJlY3QueSgp
KTsKKyAgICBpZiAoIWNvcHlXaWR0aCB8fCAhY29weUhlaWdodCkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4gbmV3Qm1wID0gY3JlYXRlKEludFNpemUo
Y29weVdpZHRoLCBjb3B5SGVpZ2h0KSwgdXNlQWxwaGEgJiYgaXMzMmJpdCgpID8gQml0bWFwSW5m
bzo6Qml0Q291bnQzMiA6IEJpdG1hcEluZm86OkJpdENvdW50MTYsIGZhbHNlKTsKKworICAgIGlm
ICghbmV3Qm1wIHx8ICFuZXdCbXAtPmJ5dGVzKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAg
RENIb2xkZXIgZGNOZXcobmV3Qm1wLmdldCgpKTsKKworICAgIFN0cmV0Y2hESUJpdHMoZGNOZXcu
Z2V0KCksIDAsIDAsIGNvcHlXaWR0aCwgY29weUhlaWdodCwgcmVjdC54KCksIHJlY3QueSgpLCBj
b3B5V2lkdGgsIGNvcHlIZWlnaHQKKyAgICAgICAgLCBieXRlcygpLCAmYml0bWFwSW5mbygpLCBE
SUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAgICByZXR1cm4gbmV3Qm1wOworfQorCitzdGF0
aWMgdm9pZCBkcmF3UGF0dGVyblNpbXBsZShIREMgaGRjLCBjb25zdCBSRUNUJiBkZXN0UmVjdCwg
SEJJVE1BUCBoYm1wLCBjb25zdCBQT0lOVCYgcGhhc2UpCit7CisgICAgSEJSVVNIIGhCcnVzaCA9
IENyZWF0ZVBhdHRlcm5CcnVzaChoYm1wKTsKKyAgICBpZiAoaEJydXNoKSB7CisgICAgICAgIFBP
SU5UIG9sZE9yZzsKKyAgICAgICAgU2V0QnJ1c2hPcmdFeChoZGMsIGRlc3RSZWN0LmxlZnQgLSBw
aGFzZS54LCBkZXN0UmVjdC50b3AgLSBwaGFzZS55LCAmb2xkT3JnKTsKKyAgICAgICAgRmlsbFJl
Y3QoaGRjLCAmZGVzdFJlY3QsIGhCcnVzaCk7CisgICAgICAgIERlbGV0ZU9iamVjdChoQnJ1c2gp
OworICAgICAgICBTZXRCcnVzaE9yZ0V4KGhkYywgb2xkT3JnLngsIG9sZE9yZy55LCAwKTsKKyAg
ICB9Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdQYXR0ZXJuU2ltcGxlKEhEQyBoZGMsIGNvbnN0IFJF
Q1QmIGRlc3RSZWN0LCBjb25zdCBTaGFyZWRCaXRtYXAqIGJtcCwgY29uc3QgU0laRSYgYm1wU2l6
ZSwgY29uc3QgUE9JTlQmIHBoYXNlKQoreworICAgIGludCBkc3RZID0gZGVzdFJlY3QudG9wOwor
ICAgIGZvciAoaW50IHNvdXJjZVkgPSBwaGFzZS55OyBkc3RZIDwgZGVzdFJlY3QuYm90dG9tOyAp
IHsKKyAgICAgICAgaW50IHNvdXJjZUggPSBzdGQ6Om1pbjxpbnQ+KGJtcFNpemUuY3kgLSBzb3Vy
Y2VZLCBkZXN0UmVjdC5ib3R0b20gLSBkc3RZKTsKKyAgICAgICAgaW50IGRzdFggPSBkZXN0UmVj
dC5sZWZ0OworICAgICAgICBmb3IgKGludCBzb3VyY2VYID0gcGhhc2UueDsgZHN0WCA8IGRlc3RS
ZWN0LnJpZ2h0OyApIHsKKyAgICAgICAgICAgIGludCBzb3VyY2VXID0gc3RkOjptaW48aW50Pihi
bXBTaXplLmN4IC0gc291cmNlWCwgZGVzdFJlY3QucmlnaHQgLSBkc3RYKTsKKworICAgICAgICAg
ICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFgsIGRzdFksIHNvdXJjZVcsIHNvdXJjZUgsIHNvdXJj
ZVgsIHNvdXJjZVksIHNvdXJjZVcsIHNvdXJjZUgKKyAgICAgICAgICAgICAgICAsIGJtcC0+Ynl0
ZXMoKSwgJmJtcC0+Yml0bWFwSW5mbygpLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAg
ICAgICAgICAgIGRzdFggKz0gc291cmNlVzsKKyAgICAgICAgICAgIHNvdXJjZVggPSAwOworICAg
ICAgICB9CisKKyAgICAgICAgZHN0WSArPSBzb3VyY2VIOworICAgICAgICBzb3VyY2VZID0gMDsK
KyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG5vcm1hbGl6ZVBoYXNlKExPTkcmIHBoYXNlLCBpbnQg
bGltaXQpCit7CisgICAgaWYgKCFwaGFzZSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChsaW1p
dCA8IDIpIHsKKyAgICAgICAgcGhhc2UgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorICAg
IGlmIChsaW1pdCA9PSAyKSB7CisgICAgICAgIHBoYXNlID0gcGhhc2UgJiAxOworICAgICAgICBy
ZXR1cm47CisgICAgfQorICAgIGlmIChwaGFzZSA8IDApIHsKKyAgICAgICAgcGhhc2UgPSAtcGhh
c2U7CisgICAgICAgIGlmIChwaGFzZSA+IGxpbWl0KQorICAgICAgICAgICAgcGhhc2UgPSBzdGF0
aWNfY2FzdDxMT05HPihzdGF0aWNfY2FzdDx1bnNpZ25lZD4ocGhhc2UpICUgc3RhdGljX2Nhc3Q8
dW5zaWduZWQ+KGxpbWl0KSk7CisgICAgICAgIGlmIChwaGFzZSkKKyAgICAgICAgICAgIHBoYXNl
ID0gbGltaXQgLSBwaGFzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocGhhc2UgPCBsaW1p
dCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcGhhc2UgPSBzdGF0aWNfY2FzdDxMT05H
PihzdGF0aWNfY2FzdDx1bnNpZ25lZD4ocGhhc2UpICUgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGxp
bWl0KSk7CisgICAgfQorfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6ZHJhd1BhdHRlcm4oR3JhcGhp
Y3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IEFmZmlu
ZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29tcG9z
aXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUm
IG9yaWdTb3VyY2VTaXplKQoreworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsK
KyAgICBjdHh0LT5kcmF3Qml0bWFwUGF0dGVybih0aGlzLCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJh
bnNmb3JtLCBwaGFzZSwgc3R5bGVDb2xvclNwYWNlLCBvcCwgZGVzdFJlY3QsIG9yaWdTb3VyY2VT
aXplKTsKK30KKwordm9pZCBTaGFyZWRCaXRtYXA6OmRyYXdQYXR0ZXJuKEhEQyBoZGMsIGNvbnN0
IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtLCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4s
IGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb2xvclNwYWNlIHN0eWxlQ29sb3JT
cGFjZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNv
bnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKQoreworICAgIGlmICghbV9waXhlbHMpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmICh0aWxlUmVjdEluLndpZHRoKCkgPD0gMCB8fCB0aWxlUmVj
dEluLmhlaWdodCgpIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIGJvb2wgdXNlQWxwaGEg
PSBvcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVyICYmIGhhc0FscGhhKCkgJiYgaXMzMmJpdCgpOwor
CisgICAgaW50IGJtcFdpZHRoID0gd2lkdGgoKTsKKyAgICBpbnQgYm1wSGVpZ2h0ID0gaGVpZ2h0
KCk7CisKKyAgICBGbG9hdFJlY3QgdGlsZVJlY3QodGlsZVJlY3RJbik7CisgICAgaWYgKGJtcFdp
ZHRoICE9IG9yaWdTb3VyY2VTaXplLndpZHRoKCkpIHsKKyAgICAgICAgZG91YmxlIHJhdGUgPSBz
dGF0aWNfY2FzdDxkb3VibGU+KGJtcFdpZHRoKSAvIG9yaWdTb3VyY2VTaXplLndpZHRoKCk7Cisg
ICAgICAgIGRvdWJsZSB0ZW1wID0gdGlsZVJlY3Qud2lkdGgoKSAqIHJhdGU7CisgICAgICAgIHRp
bGVSZWN0LnNldFgodGlsZVJlY3QueCgpICogcmF0ZSk7CisgICAgICAgIHRpbGVSZWN0LnNldFdp
ZHRoKHRlbXApOworICAgICAgICB0ZW1wID0gdGlsZVJlY3QuaGVpZ2h0KCkgKiByYXRlOworICAg
ICAgICB0aWxlUmVjdC5zZXRZKHRpbGVSZWN0LnkoKSAqIHJhdGUpOworICAgICAgICB0aWxlUmVj
dC5zZXRIZWlnaHQodGVtcCk7CisgICAgfQorCisgICAgT3duUHRyPEhCSVRNQVA+IGNsaXBwZWRC
bXA7CisKKyAgICBpZiAodGlsZVJlY3QueCgpIHx8IHRpbGVSZWN0LnkoKSB8fCB0aWxlUmVjdC53
aWR0aCgpICE9IGJtcFdpZHRoIHx8IHRpbGVSZWN0LmhlaWdodCgpICE9IGJtcEhlaWdodCkgewor
ICAgICAgICBCaXRtYXBJbmZvIHBhdHRlcm5CbXBJbmZvOworICAgICAgICB2b2lkKiBwYXR0ZXJu
UGl4ZWxzOworICAgICAgICBjbGlwcGVkQm1wLnNldChjbGlwQml0bWFwKEludFJlY3QodGlsZVJl
Y3QpLCB1c2VBbHBoYSwgcGF0dGVybkJtcEluZm8sIHBhdHRlcm5QaXhlbHMpKTsKKyAgICAgICAg
aWYgKCFjbGlwcGVkQm1wKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGJtcFdpZHRo
ID0gdGlsZVJlY3Qud2lkdGgoKTsKKyAgICAgICAgYm1wSGVpZ2h0ID0gdGlsZVJlY3QuaGVpZ2h0
KCk7CisgICAgfQorCisgICAgQWZmaW5lVHJhbnNmb3JtIHRmID0gdHJhbnNmb3JtOworICAgIHRm
ICo9IHBhdHRlcm5UcmFuc2Zvcm07CisKKyAgICBGbG9hdFJlY3QgdHJSZWN0ID0gdGYubWFwUmVj
dChkZXN0UmVjdCk7CisKKyAgICBSRUNUIGNsaXBCb3g7CisgICAgaW50IGNsaXBUeXBlID0gR2V0
Q2xpcEJveChoZGMsICZjbGlwQm94KTsKKyAgICBpZiAoY2xpcFR5cGUgPT0gU0lNUExFUkVHSU9O
KQorICAgICAgICB0clJlY3QuaW50ZXJzZWN0KEZsb2F0UmVjdChjbGlwQm94LmxlZnQsIGNsaXBC
b3gudG9wLCBjbGlwQm94LnJpZ2h0IC0gY2xpcEJveC5sZWZ0LCBjbGlwQm94LmJvdHRvbSAtIGNs
aXBCb3gudG9wKSk7CisgICAgZWxzZSBpZiAoY2xpcFR5cGUgPT0gQ09NUExFWFJFR0lPTikgewor
ICAgICAgICBPd25QdHI8SFJHTj4gY2xpcFJnbihDcmVhdGVSZWN0UmduKDAsIDAsIDAsIDApKTsK
KyAgICAgICAgaWYgKEdldENsaXBSZ24oaGRjLCBjbGlwUmduLmdldCgpKSA+IDApIHsKKyAgICAg
ICAgICAgIERXT1JEIHJlZ2lvbkRhdGFTaXplID0gR2V0UmVnaW9uRGF0YShjbGlwUmduLmdldCgp
LCBzaXplb2YoUkdOREFUQSksIDApOworICAgICAgICAgICAgaWYgKHJlZ2lvbkRhdGFTaXplKSB7
CisgICAgICAgICAgICAgICAgVmVjdG9yPFJHTkRBVEE+IHJlZ2lvbkRhdGEocmVnaW9uRGF0YVNp
emUpOworICAgICAgICAgICAgICAgIEdldFJlZ2lvbkRhdGEoY2xpcFJnbi5nZXQoKSwgcmVnaW9u
RGF0YVNpemUsIHJlZ2lvbkRhdGEuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBSRUNUKiByZWN0
ID0gcmVpbnRlcnByZXRfY2FzdDxSRUNUKj4ocmVnaW9uRGF0YVswXS5CdWZmZXIpOworICAgICAg
ICAgICAgICAgIGZvciAoRFdPUkQgaSA9IDA7IGkgPCByZWdpb25EYXRhWzBdLnJkaC5uQ291bnQ7
ICsraSwgKytyZWN0KQorICAgICAgICAgICAgICAgICAgICB0clJlY3QuaW50ZXJzZWN0KEZsb2F0
UmVjdChyZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgcmVj
dC0+Ym90dG9tIC0gcmVjdC0+dG9wKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBpZiAodHJSZWN0LndpZHRoKCkgPD0gMCB8fCB0clJlY3QuaGVpZ2h0KCkgPD0gMCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgdHJSZWN0LmluZmxhdGUoMSk7CisgICAgSW50UmVjdCB2
aXNpYmxlRHN0UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QodGYuaW52ZXJzZSgpLm1hcFJlY3QodHJS
ZWN0KSk7CisgICAgdmlzaWJsZURzdFJlY3QuaW50ZXJzZWN0KEludFJlY3QoZGVzdFJlY3QpKTsK
KworICAgIGlmICh2aXNpYmxlRHN0UmVjdC53aWR0aCgpIDw9IDAgfHwgdmlzaWJsZURzdFJlY3Qu
aGVpZ2h0KCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdHJSZWN0ID0gdGYubWFwUmVj
dCh2aXNpYmxlRHN0UmVjdCk7CisgICAgUkVDVCBkc3RSZWN0V2luID0KKyAgICB7CisgICAgICAg
IHN0YWJsZVJvdW5kKHRyUmVjdC54KCkpLAorICAgICAgICBzdGFibGVSb3VuZCh0clJlY3QueSgp
KSwKKyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0LnJpZ2h0KCkpLAorICAgICAgICBzdGFibGVS
b3VuZCh0clJlY3QuYm90dG9tKCkpLAorICAgIH07CisgICAgaWYgKGRzdFJlY3RXaW4ucmlnaHQg
PD0gZHN0UmVjdFdpbi5sZWZ0IHx8IGRzdFJlY3RXaW4uYm90dG9tIDw9IGRzdFJlY3RXaW4udG9w
KQorICAgICAgICByZXR1cm47CisKKyAgICBTSVpFIGJtcFNpemUgPSB7IGJtcFdpZHRoLCBibXBI
ZWlnaHQgfTsKKworICAgIC8vIFJlbGF0aXZlIHRvIGRlc3RpbmF0aW9uLCBpbiBiaXRtYXAgcGl4
ZWxzCisgICAgUE9JTlQgcGhhc2VXaW4gPSB7IHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0Lngo
KSAtIHBoYXNlLngoKSksIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LnkoKSAtIHBoYXNlLnko
KSkgfTsKKyAgICBub3JtYWxpemVQaGFzZShwaGFzZVdpbi54LCBibXBTaXplLmN4KTsKKyAgICBu
b3JtYWxpemVQaGFzZShwaGFzZVdpbi55LCBibXBTaXplLmN5KTsKKworICAgIHsKKyAgICAgICAg
UkVDVCBzcmNSZWN0V2luID0KKyAgICAgICAgeworICAgICAgICAgICAgMCwKKyAgICAgICAgICAg
IDAsCisgICAgICAgICAgICBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC5yaWdodCgpKSAtIHN0
YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LngoKSksCisgICAgICAgICAgICBzdGFibGVSb3VuZCh2
aXNpYmxlRHN0UmVjdC5ib3R0b20oKSkgLSBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC55KCkp
CisgICAgICAgIH07CisgICAgICAgIGlmIChzcmNSZWN0V2luLnJpZ2h0IDw9IDAgfHwgc3JjUmVj
dFdpbi5ib3R0b20gPD0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBCaXRtYXBJ
bmZvIGJtcEluZm8gPSBCaXRtYXBJbmZvOjpjcmVhdGVCb3R0b21VcChJbnRTaXplKHNyY1JlY3RX
aW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tKSwgdXNlQWxwaGEgPyBCaXRtYXBJbmZvOjpCaXRD
b3VudDMyIDogQml0bWFwSW5mbzo6Qml0Q291bnQxNik7CisgICAgICAgIHZvaWQqIHBpeGVsczsK
KyAgICAgICAgT3duUHRyPEhCSVRNQVA+IGhibXBUZW1wKENyZWF0ZURJQlNlY3Rpb24oMCwgJmJt
cEluZm8sIERJQl9SR0JfQ09MT1JTLCAmcGl4ZWxzLCAwLCAwKSk7CisKKyAgICAgICAgaWYgKGhi
bXBUZW1wKSB7CisgICAgICAgICAgICBPd25QdHI8SERDPiBobWVtZGMoQ3JlYXRlQ29tcGF0aWJs
ZURDKGhkYykpOworICAgICAgICAgICAgSEdESU9CSiBvbGRCbXAgPSBTZWxlY3RPYmplY3QoaG1l
bWRjLmdldCgpLCBoYm1wVGVtcC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoY2xpcHBlZEJtcCkK
KyAgICAgICAgICAgICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RX
aW4sIGNsaXBwZWRCbXAuZ2V0KCksIHBoYXNlV2luKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKChv
cCAhPSBDb21wb3NpdGVTb3VyY2VPdmVyIHx8IGNhblVzZURJQml0cygpKSAmJiBzcmNSZWN0V2lu
LnJpZ2h0IDw9IGJtcFNpemUuY3ggKiAyICYmIHNyY1JlY3RXaW4uYm90dG9tIDw9IGJtcFNpemUu
Y3kgKiAyKQorICAgICAgICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwg
c3JjUmVjdFdpbiwgdGhpcywgYm1wU2l6ZSwgcGhhc2VXaW4pOworICAgICAgICAgICAgZWxzZSBp
ZiAoZW5zdXJlSGFuZGxlKCkpCisgICAgICAgICAgICAgICAgZHJhd1BhdHRlcm5TaW1wbGUoaG1l
bWRjLmdldCgpLCBzcmNSZWN0V2luLCBnZXRIYW5kbGUoKSwgcGhhc2VXaW4pOworICAgICAgICAg
ICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdm9pZCogcGl4ZWxzOworICAgICAgICAgICAgICAg
IEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICAgICAgICAgICAgICBpZiAoSEJJVE1BUCBoYm1wID0g
Y3JlYXRlSGFuZGxlKCZwaXhlbHMsICZibXBJbmZvLCAtMSwgZmFsc2UpKSB7CisgICAgICAgICAg
ICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwgc3JjUmVjdFdpbiwgaGJt
cCwgcGhhc2VXaW4pOworICAgICAgICAgICAgICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7Cisg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU2VsZWN0T2JqZWN0
KGhtZW1kYy5nZXQoKSwgb2xkQm1wKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHVzZUFscGhh
ICYmIGhhc0FscGhhQmxlbmRTdXBwb3J0KCkpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29u
c3QgQkxFTkRGVU5DVElPTiBibGVuZCA9IHsgQUNfU1JDX09WRVIsIDAsIDI1NSwgQUNfU1JDX0FM
UEhBIH07CisgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gYWxwaGFCbGVuZElmU3VwcG9y
dGVkKGhkYywgZHN0UmVjdFdpbi5sZWZ0LCBkc3RSZWN0V2luLnRvcCwgZHN0UmVjdFdpbi5yaWdo
dCAtIGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi5ib3R0b20gLSBkc3RSZWN0V2luLnRvcAor
ICAgICAgICAgICAgICAgICAgICAsIGhtZW1kYy5nZXQoKSwgMCwgMCwgc3JjUmVjdFdpbi5yaWdo
dCwgc3JjUmVjdFdpbi5ib3R0b20sIGJsZW5kKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVU5V
U0VEKHN1Y2Nlc3MsIHN1Y2Nlc3MpOworICAgICAgICAgICAgfSBlbHNlIGlmICh1c2VBbHBoYSAm
JiAhaGFzQWxwaGFCbGVuZFN1cHBvcnQoKSB8fCBvcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVyICYm
IHVzZXNUcmFuc3BhcmVudENvbG9yKCkpCisgICAgICAgICAgICAgICAgVHJhbnNwYXJlbnRCbHQo
aGRjLCBkc3RSZWN0V2luLmxlZnQsIGRzdFJlY3RXaW4udG9wLCBkc3RSZWN0V2luLnJpZ2h0IC0g
ZHN0UmVjdFdpbi5sZWZ0CisgICAgICAgICAgICAgICAgICAgICwgZHN0UmVjdFdpbi5ib3R0b20g
LSBkc3RSZWN0V2luLnRvcCwgaG1lbWRjLmdldCgpLCAwLCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBz
cmNSZWN0V2luLmJvdHRvbSwgdHJhbnNwYXJlbnRDb2xvcigpKTsKKyAgICAgICAgICAgIGVsc2Ug
eworICAgICAgICAgICAgICAgIERXT1JEIGJtcE9wID0gb3AgPT0gQ29tcG9zaXRlQ29weSA/IFNS
Q0NPUFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wID09IENvbXBvc2l0ZVNvdXJj
ZU92ZXIgPyBTUkNDT1BZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcCA9PSBDb21w
b3NpdGVYT1IgPyBQQVRJTlZFUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wID09
IENvbXBvc2l0ZUNsZWFyID8gV0hJVEVORVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
OiBTUkNDT1BZOyAvLyBGSVhFTUU6IG90aGVyIHR5cGVzPworCisgICAgICAgICAgICAgICAgU3Ry
ZXRjaERJQml0cyhoZGMsIGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RX
aW4ucmlnaHQgLSBkc3RSZWN0V2luLmxlZnQKKyAgICAgICAgICAgICAgICAgICAgLCBkc3RSZWN0
V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9wLCAwLCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNS
ZWN0V2luLmJvdHRvbQorICAgICAgICAgICAgICAgICAgICAsIHBpeGVscywgJmJtcEluZm8sIERJ
Ql9SR0JfQ09MT1JTLCBibXBPcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTZWxlY3RP
YmplY3QoaG1lbWRjLmdldCgpLCBvbGRCbXApOworICAgICAgICB9CisgICAgfQorfQorCitTaGFy
ZWRCaXRtYXA6OkRDUHJvdmlkZXIgc19kY1Byb3ZpZGVyOworU2hhcmVkQml0bWFwOjpEQ1Byb3Zp
ZGVyKiBTaGFyZWRCaXRtYXA6Om1fZGNQcm92aWRlciA9ICZzX2RjUHJvdmlkZXI7CisKK0hEQyBT
aGFyZWRCaXRtYXA6OkRDUHJvdmlkZXI6OmdldERDKFNoYXJlZEJpdG1hcCogYm1wLCB1bnNpZ25l
ZCoga2V5MSwgdW5zaWduZWQqIGtleTIpCit7CisgICAgaWYgKCFibXAgfHwgIWJtcC0+ZW5zdXJl
SGFuZGxlKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgSERDIGhkYyA9IENyZWF0ZUNvbXBh
dGlibGVEQygwKTsKKyAgICBpZiAoaGRjKSB7CisgICAgICAgICprZXkxID0gcmVpbnRlcnByZXRf
Y2FzdDx1bnNpZ25lZD4oU2VsZWN0T2JqZWN0KGhkYywgYm1wLT5nZXRIYW5kbGUoKSkpOworICAg
ICAgICBSRUNUIHJlY3QgPSB7IDAsIDAsIGJtcC0+d2lkdGgoKSwgYm1wLT5oZWlnaHQoKSB9Owor
ICAgICAgICBPd25QdHI8SFJHTj4gY2xpcFJnbihDcmVhdGVSZWN0UmduSW5kaXJlY3QoJnJlY3Qp
KTsKKyAgICAgICAgU2VsZWN0Q2xpcFJnbihoZGMsIGNsaXBSZ24uZ2V0KCkpOworICAgIH0KKwor
ICAgIHJldHVybiBoZGM7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyOjpyZWxl
YXNlREMoU2hhcmVkQml0bWFwKiwgSERDIGhkYywgdW5zaWduZWQga2V5MSwgdW5zaWduZWQga2V5
MikKK3sKKyAgICBpZiAoIWhkYykKKyAgICAgICAgcmV0dXJuOworCisgICAgU2VsZWN0T2JqZWN0
KGhkYywgcmVpbnRlcnByZXRfY2FzdDxIR0RJT0JKPihrZXkxKSk7CisgICAgRGVsZXRlREMoaGRj
KTsKK30KKwordm9pZCBTaGFyZWRCaXRtYXA6OmNsZWFyUGl4ZWxzKGNvbnN0IEludFJlY3QmIHJl
Y3QpCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVj
dCBibXBSZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBibXBSZWN0LmludGVyc2Vj
dChyZWN0KTsKKyAgICBpZiAoaXMxNmJpdCgpKSB7CisgICAgICAgIHVuc2lnbmVkIHcgPSBtX2Jt
cEluZm8ucGFkZGVkV2lkdGgoKTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQqIGRzdCA9IHJlaW50
ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihtX3BpeGVscyk7CisgICAgICAgIGRzdCArPSBi
bXBSZWN0LnkoKSAqIHcgKyBibXBSZWN0LngoKTsKKyAgICAgICAgaW50IHdvcmRzVG9TZXQgPSBi
bXBSZWN0LndpZHRoKCk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBkc3RFbmQgPSBk
c3QgKyBibXBSZWN0LmhlaWdodCgpICogdzsKKyAgICAgICAgd2hpbGUgKGRzdCA8IGRzdEVuZCkg
eworICAgICAgICAgICAgd21lbXNldChyZWludGVycHJldF9jYXN0PHdjaGFyX3QqPihkc3QpLCAw
LCB3b3Jkc1RvU2V0KTsKKyAgICAgICAgICAgIGRzdCArPSB3OworICAgICAgICB9CisgICAgfSBl
bHNlIHsKKyAgICAgICAgdW5zaWduZWQgdyA9IHdpZHRoKCk7CisgICAgICAgIHVuc2lnbmVkKiBk
c3QgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkKj4obV9waXhlbHMpOworICAgICAgICBkc3Qg
Kz0gYm1wUmVjdC55KCkgKiB3ICsgYm1wUmVjdC54KCk7CisgICAgICAgIGludCB3b3Jkc1RvU2V0
ID0gYm1wUmVjdC53aWR0aCgpICogMjsKKyAgICAgICAgY29uc3QgdW5zaWduZWQqIGRzdEVuZCA9
IGRzdCArIGJtcFJlY3QuaGVpZ2h0KCkgKiB3OworICAgICAgICB3aGlsZSAoZHN0IDwgZHN0RW5k
KSB7CisgICAgICAgICAgICB3bWVtc2V0KHJlaW50ZXJwcmV0X2Nhc3Q8d2NoYXJfdCo+KGRzdCks
IDAsIHdvcmRzVG9TZXQpOworICAgICAgICAgICAgZHN0ICs9IHc7CisgICAgICAgIH0KKyAgICB9
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLmQzYjU0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL1NoYXJlZEJpdG1hcC5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogIENvcHlyaWdo
dCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogIENvcHlyaWdodCAoQykgMjAxMCBQYXRyaWNrIEdhbnN0ZXJlciA8cGFyb2dhQHBhcm9nYS5j
b20+CisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgorICovCisKKyNpZm5kZWYgU2hhcmVkQml0bWFwX2gKKyNkZWZpbmUgU2hhcmVkQml0
bWFwX2gKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkJpdG1hcElu
Zm8uaCIKKyNpbmNsdWRlICJDb2xvclNwYWNlLmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIu
aD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4K
KyNpbmNsdWRlIDx3aW5nZGkuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitlbnVtIENvbXBv
c2l0ZU9wZXJhdG9yOworY2xhc3MgRmxvYXRQb2ludDsKK2NsYXNzIEZsb2F0UmVjdDsKK2NsYXNz
IEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIEludFJlY3Q7CitjbGFzcyBJbnRTaXplOworY2xhc3Mg
VHJhbnNmb3JtYXRpb25NYXRyaXg7CisKK2NsYXNzIFNoYXJlZEJpdG1hcDogcHVibGljIFJlZkNv
dW50ZWQ8U2hhcmVkQml0bWFwPiB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+U2hhcmVkQml0bWFw
KCk7CisgICAgc3RhdGljIFBhc3NSZWZQdHI8U2hhcmVkQml0bWFwPiBjcmVhdGUoY29uc3QgSW50
U2l6ZSYsIEJpdG1hcEluZm86OkJpdENvdW50ID0gQml0bWFwSW5mbzo6Qml0Q291bnQzMiwgYm9v
bCBpbml0UGl4ZWxzID0gdHJ1ZSk7CisgICAgc3RhdGljIFBhc3NSZWZQdHI8U2hhcmVkQml0bWFw
PiBjcmVhdGUoY29uc3QgVmVjdG9yPHVuc2lnbmVkPiYsIGNvbnN0IEludFNpemUmLCBib29sIGhh
c0FscGhhID0gdHJ1ZSk7CisKKyAgICBjb25zdCBCaXRtYXBJbmZvJiBiaXRtYXBJbmZvKCkgY29u
c3QgeyByZXR1cm4gbV9ibXBJbmZvOyB9CisgICAgdm9pZCogYnl0ZXMoKSB7IHJldHVybiBtX3Bp
eGVsczsgfQorICAgIGNvbnN0IHZvaWQqIGJ5dGVzKCkgY29uc3QgeyByZXR1cm4gbV9waXhlbHM7
IH0KKyAgICB1bnNpZ25lZCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mby53aWR0aCgp
OyB9CisgICAgdW5zaWduZWQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmhlaWdo
dCgpOyB9CisgICAgdW5zaWduZWQgdmFsaWRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX3ZhbGlk
SGVpZ2h0OyB9CisgICAgdm9pZCBzZXRWYWxpZEhlaWdodCh1bnNpZ25lZCB2YWxpZEhlaWdodCkg
eyBtX3ZhbGlkSGVpZ2h0ID0gdmFsaWRIZWlnaHQ7IH0KKyAgICB2b2lkIHJlc2V0UGl4ZWxzKGJv
b2wgYmxhY2sgPSBmYWxzZSk7CisgICAgdm9pZCBjbGVhclBpeGVscyhjb25zdCBJbnRSZWN0JiBy
KTsKKyAgICBib29sIGxvY2tlZCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9ja2VkOyB9CisgICAgdm9p
ZCBsb2NrKCkgeyBtX2xvY2tlZCA9IHRydWU7IH0KKyAgICB2b2lkIHVubG9jaygpIHsgbV9sb2Nr
ZWQgPSBmYWxzZTsgfQorICAgIGJvb2wgZnJlZU1lbW9yeSgpOworICAgIGJvb2wgaXMxNmJpdCgp
IGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mby5pczE2Yml0KCk7IH0KKyAgICBib29sIGlzMzJiaXQo
KSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8uaXMzMmJpdCgpOyB9CisgICAgYm9vbCB0bzE2Yml0
KCk7CisgICAgYm9vbCBoYXNBbHBoYSgpIGNvbnN0IHsgcmV0dXJuIG1faGFzQWxwaGE7IH0KKyAg
ICB2b2lkIHNldEhhc0FscGhhKGJvb2wgYWxwaGEpIHsgbV9oYXNBbHBoYSA9IGFscGhhOyB9Cisg
ICAgYm9vbCBlbnN1cmVIYW5kbGUoKTsKKyAgICBIQklUTUFQIGdldEhhbmRsZSgpIHsgcmV0dXJu
IG1faGJpdG1hcDsgfQorICAgIEhCSVRNQVAgY3JlYXRlSGFuZGxlKHZvaWQqKiBwaXhlbHMsIEJp
dG1hcEluZm8qIGJtcEluZm8sIGludCBoID0gLTEsIGJvb2wgdXNlMTZiaXQgPSB0cnVlKSBjb25z
dDsKKyAgICBib29sIHVzZXNUcmFuc3BhcmVudENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV91c2Vz
VHJhbnNwYXJlbnRDb2xvcjsgfQorICAgIENPTE9SUkVGIHRyYW5zcGFyZW50Q29sb3IoKSBjb25z
dCB7IHJldHVybiBtX3RyYW5zcGFyZW50Q29sb3I7IH0KKyAgICB2b2lkIHNldFRyYW5zcGFyZW50
Q29sb3IoQ09MT1JSRUYgYykKKyAgICB7CisgICAgICAgIG1fdXNlc1RyYW5zcGFyZW50Q29sb3Ig
PSB0cnVlOworICAgICAgICBtX3RyYW5zcGFyZW50Q29sb3IgPSBjOworICAgIH0KKyAgICBib29s
IGNhblVzZURJQml0cygpIGNvbnN0IHsgcmV0dXJuICFoYXNBbHBoYSgpICYmICF1c2VzVHJhbnNw
YXJlbnRDb2xvcigpOyB9CisKKyAgICBIQklUTUFQIGNsaXBCaXRtYXAoY29uc3QgSW50UmVjdCYg
cmVjdCwgYm9vbCB1c2VBbHBoYSwgQml0bWFwSW5mbyYgYm1wSW5mbywgdm9pZComIHBpeGVscyk7
CisKKyAgICBQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4gY2xpcEJpdG1hcChjb25zdCBJbnRSZWN0
JiByZWN0LCBib29sIHVzZUFscGhhKTsKKworICAgIHZvaWQgZHJhdyhHcmFwaGljc0NvbnRleHQq
IGN0eHQsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENv
bG9yU3BhY2Ugc3R5bGVDb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCk7
CisgICAgdm9pZCBkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0
UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3Jt
LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29sb3JTcGFj
ZSBzdHlsZUNvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBGbG9hdFJlY3Qm
IGRlc3RSZWN0LCBjb25zdCBJbnRTaXplJiBvcmlnU291cmNlU2l6ZSk7CisgICAgdm9pZCBkcmF3
KEhEQywgY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgY29uc3QgSW50UmVjdCYgc3JjUmVjdCwgQ29t
cG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApOworICAgIHZvaWQgZHJhd1BhdHRlcm4oSERDLCBj
b25zdCBBZmZpbmVUcmFuc2Zvcm0mLCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0
IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAg
Y29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbG9yU3BhY2Ugc3R5bGVDb2xvclNwYWNlLCBDb21w
b3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6
ZSYgb3JpZ1NvdXJjZVNpemUpOworCisgICAgY2xhc3MgRENQcm92aWRlciB7CisgICAgcHVibGlj
OgorICAgICAgICB2aXJ0dWFsIEhEQyBnZXREQyhTaGFyZWRCaXRtYXAqLCB1bnNpZ25lZCosIHVu
c2lnbmVkKik7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlREMoU2hhcmVkQml0bWFwKiwg
SERDLCB1bnNpZ25lZCwgdW5zaWduZWQpOworICAgIH07CisKKyAgICBzdGF0aWMgRENQcm92aWRl
ciogbV9kY1Byb3ZpZGVyOworCisgICAgSERDIGdldERDKHVuc2lnbmVkKiBrZXkxLCB1bnNpZ25l
ZCoga2V5MikgeyByZXR1cm4gbV9kY1Byb3ZpZGVyLT5nZXREQyh0aGlzLCBrZXkxLCBrZXkyKTsg
fQorICAgIHZvaWQgcmVsZWFzZURDKEhEQyBoZGMsIHVuc2lnbmVkIGtleTEsIHVuc2lnbmVkIGtl
eTIpIHsgbV9kY1Byb3ZpZGVyLT5yZWxlYXNlREModGhpcywgaGRjLCBrZXkxLCBrZXkyKTsgfQor
CisgICAgY2xhc3MgRENIb2xkZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgRENIb2xkZXIoU2hh
cmVkQml0bWFwKiBibXAgPSAwKSB7IHNldEludGVybmFsKGJtcCk7IH0KKyAgICAgICAgfkRDSG9s
ZGVyKCkgeyBjbGVhckludGVybmFsKCk7IH0KKyAgICAgICAgdm9pZCBzZXQoU2hhcmVkQml0bWFw
KiBibXAgPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBjbGVhckludGVybmFsKCk7CisgICAg
ICAgICAgICBzZXRJbnRlcm5hbChibXApOworICAgICAgICB9CisgICAgICAgIEhEQyBnZXQoKSBj
b25zdCB7IHJldHVybiBtX2hkYzsgfQorICAgIHByaXZhdGU6CisgICAgICAgIERDSG9sZGVyJiBv
cGVyYXRvcj0oY29uc3QgRENIb2xkZXImKTsKKyAgICAgICAgRENIb2xkZXIoY29uc3QgRENIb2xk
ZXImKTsKKyAgICAgICAgdm9pZCBjbGVhckludGVybmFsKCkKKyAgICAgICAgeworICAgICAgICAg
ICAgaWYgKG1faGRjKQorICAgICAgICAgICAgICAgIG1fYml0bWFwLT5yZWxlYXNlREMobV9oZGMs
IG1fa2V5MSwgbV9rZXkyKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldEludGVybmFsKFNo
YXJlZEJpdG1hcCogYm1wKQorICAgICAgICB7CisgICAgICAgICAgICBtX2JpdG1hcCA9IGJtcDsK
KyAgICAgICAgICAgIG1faGRjID0gYm1wID8gYm1wLT5nZXREQygmbV9rZXkxLCAmbV9rZXkyKSA6
IDA7CisgICAgICAgIH0KKyAgICAgICAgU2hhcmVkQml0bWFwKiBtX2JpdG1hcDsKKyAgICAgICAg
SERDIG1faGRjOworICAgICAgICB1bnNpZ25lZCBtX2tleTE7CisgICAgICAgIHVuc2lnbmVkIG1f
a2V5MjsKKyAgICB9OworCitwcml2YXRlOgorICAgIFNoYXJlZEJpdG1hcChjb25zdCBJbnRTaXpl
JiwgQml0bWFwSW5mbzo6Qml0Q291bnQsIGJvb2wgaW5pdFBpeGVscyk7CisgICAgU2hhcmVkQml0
bWFwKGNvbnN0IEJpdG1hcEluZm8mIGJtcEluZm8sIEhCSVRNQVAgaGJtcCwgdm9pZCogcGl4ZWxz
KTsKKyAgICBCaXRtYXBJbmZvIG1fYm1wSW5mbzsKKyAgICBpbnQgbV9yZWZlcmVuY2U7CisgICAg
SEJJVE1BUCBtX2hiaXRtYXA7CisgICAgdm9pZCogbV9waXhlbHM7CisgICAgQ09MT1JSRUYgbV90
cmFuc3BhcmVudENvbG9yOworICAgIGludCBtX3ZhbGlkSGVpZ2h0OworICAgIGJvb2wgbV9sb2Nr
ZWQ7CisgICAgYm9vbCBtX3VzZXNUcmFuc3BhcmVudENvbG9yOworICAgIGJvb2wgbV9oYXNBbHBo
YTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFNoYXJlZEJpdG1h
cF9oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=
</data>
<flag name="review"
          id="61727"
          type_id="1"
          status="-"
          setter="aroben"
    />
    <flag name="commit-queue"
          id="61728"
          type_id="3"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72602</attachid>
            <date>2010-11-01 16:59:17 -0700</date>
            <delta_ts>2010-11-01 17:01:36 -0700</delta_ts>
            <desc>1) SharedBitmap</desc>
            <filename>patch.patch</filename>
            <type>text/plain</type>
            <size>29645</size>
            <attacher name="Patrick R. Gansterer">paroga</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDcxMDc0KQorKysgV2ViQ29yZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkK
QEAgLTEsMyArMSw0MyBAQAorMjAxMC0xMS0wMSAgUGF0cmljayBHYW5zdGVyZXIgIDxwYXJvZ2FA
d2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBbV0lOQ0VdIEFkZCBTaGFyZWRCaXRtYXAKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTI4MjcyCisKKyAgICAgICAgU2hhcmVkQml0bWFwIGlzIGEg
aGVscGVyIGNsYXNzIHVzZWQgYXMgTmF0aXZlSW1hZ2VQdHIgZm9yIFdpbkNFLgorICAgICAgICBJ
dCdzIHdpZGUgdXNlZCBieSBXaW5DRSBncmFwaGljcyBmaWxlcyBhcyBhIHJlcGxhY2VtZW50IG9m
IEhCSVRNQVAuCisKKyAgICAgICAgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFlvbmcgTGkgPHlvbmcu
bGlAdG9yY2htb2JpbGUuY29tPi4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L1NoYXJlZEJpdG1hcC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFw
OjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpTaGFyZWRCaXRtYXAp
OgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjp+U2hhcmVkQml0bWFwKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6cmVzZXRQaXhlbHMpOgorICAgICAgICAoV2ViQ29y
ZTo6Y29udmVydDMyVG8xNik6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OnRvMTZi
aXQpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpmcmVlTWVtb3J5KToKKyAgICAg
ICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6Y3JlYXRlSGFuZGxlKToKKyAgICAgICAgKFdlYkNv
cmU6OlNoYXJlZEJpdG1hcDo6ZW5zdXJlSGFuZGxlKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJl
ZEJpdG1hcDo6ZHJhdyk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OmNsaXBCaXRt
YXApOgorICAgICAgICAoV2ViQ29yZTo6ZHJhd1BhdHRlcm5TaW1wbGUpOgorICAgICAgICAoV2Vi
Q29yZTo6bm9ybWFsaXplUGhhc2UpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpk
cmF3UGF0dGVybik6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OkRDUHJvdmlkZXI6
OmdldERDKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6RENQcm92aWRlcjo6cmVs
ZWFzZURDKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6Y2xlYXJQaXhlbHMpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OkRDUHJvdmlkZXI6OmdldERDKToKKyAgICAgICAgKFdlYkNvcmU6
OkRDUHJvdmlkZXI6OnJlbGVhc2VEQyk6CisgICAgICAgIChXZWJDb3JlOjpEQ1Byb3ZpZGVyOjpE
Q0hvbGRlcjo6RENIb2xkZXIpOgorICAgICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6RENIb2xk
ZXI6On5EQ0hvbGRlcik6CisgICAgICAgIChXZWJDb3JlOjpEQ1Byb3ZpZGVyOjpEQ0hvbGRlcjo6
c2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkRDUHJvdmlkZXI6OkRDSG9sZGVyOjpnZXQpOgorICAg
ICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6RENIb2xkZXI6OmNsZWFySW50ZXJuYWwpOgorICAg
ICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6RENIb2xkZXI6OnNldEludGVybmFsKToKKwogMjAx
MC0xMS0wMSAgU2ltb24gRnJhc2VyICA8c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KIAogICAgICAg
ICBSZXZpZXdlZCBieSBEYW4gQmVybnN0ZWluLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCShyZXZpc2lvbiAwKQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDYyMiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3Jj
aCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICBDb3B5cmlnaHQgKEMpIDIw
MTAgUGF0cmljayBHYW5zdGVyZXIgPHBhcm9nYUBwYXJvZ2EuY29tPgorICoKKyAqICBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisg
KiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg
KiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2hhcmVkQml0bWFwLmgiCisKKyNpbmNsdWRlICJH
RElFeHRyYXMuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJHcmFw
aGljc1R5cGVzLmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRl
ICJXaW5jZUdyYXBoaWNzRXh0cmFzLmgiCisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNs
dWRlIDx3dGYvUmVmQ291bnRlZExlYWtDb3VudGVyLmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5o
PgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyNpZm5k
ZWYgTkRFQlVHCitzdGF0aWMgV1RGOjpSZWZDb3VudGVkTGVha0NvdW50ZXIgc2hhcmVkQml0bWFw
TGVha0NvdW50ZXIoIlNoYXJlZEJpdG1hcCIpOworI2VuZGlmCisKKworUGFzc1JlZlB0cjxTaGFy
ZWRCaXRtYXA+IFNoYXJlZEJpdG1hcDo6Y3JlYXRlKGNvbnN0IEludFNpemUmIHNpemUsIEJpdG1h
cEluZm86OkJpdENvdW50IGJpdENvdW50LCBib29sIGluaXRQaXhlbHMpCit7CisgICAgUmVmUHRy
PFNoYXJlZEJpdG1hcD4gcmVzdWx0YW50Qml0bWFwID0gYWRvcHRSZWYobmV3IFNoYXJlZEJpdG1h
cChzaXplLCBiaXRDb3VudCwgaW5pdFBpeGVscykpOworICAgIGlmIChyZXN1bHRhbnRCaXRtYXAg
JiYgIXJlc3VsdGFudEJpdG1hcC0+Ynl0ZXMoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0
dXJuIHJlc3VsdGFudEJpdG1hcDsKK30KKworUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJl
ZEJpdG1hcDo6Y3JlYXRlKGNvbnN0IFZlY3Rvcjx1bnNpZ25lZD4mIGRhdGEsIGNvbnN0IEludFNp
emUmIHNpemUsIGJvb2wgaGFzQWxwaGEpCit7CisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gcmVz
dWx0ID0gY3JlYXRlKHNpemUsIEJpdG1hcEluZm86OkJpdENvdW50MzIsIGZhbHNlKTsKKyAgICBp
ZiAocmVzdWx0KSB7CisgICAgICAgIG1lbWNweShyZXN1bHQtPmJ5dGVzKCksIGRhdGEuZGF0YSgp
LCBkYXRhLnNpemUoKSAqIHNpemVvZih1bnNpZ25lZCkpOworICAgICAgICByZXN1bHQtPnNldEhh
c0FscGhhKGhhc0FscGhhKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworU2hhcmVk
Qml0bWFwOjpTaGFyZWRCaXRtYXAoY29uc3QgSW50U2l6ZSYgc2l6ZSwgQml0bWFwSW5mbzo6Qml0
Q291bnQgYml0Q291bnQsIGJvb2wgaW5pdFBpeGVscykKKyAgICA6IG1fYm1wSW5mbyhCaXRtYXBJ
bmZvOjpjcmVhdGVCb3R0b21VcChzaXplLCBiaXRDb3VudCkpCisgICAgLCBtX2xvY2tlZChmYWxz
ZSkKKyAgICAsIG1fdXNlc1RyYW5zcGFyZW50Q29sb3IoZmFsc2UpCisgICAgLCBtX3RyYW5zcGFy
ZW50Q29sb3IoUkdCKDAsIDAsIDApKQorICAgICwgbV9waXhlbHMoMCkKKyAgICAsIG1faGFzQWxw
aGEoZmFsc2UpCisgICAgLCBtX3ZhbGlkSGVpZ2h0KGFicyhzaXplLmhlaWdodCgpKSkKKyAgICAs
IG1faGJpdG1hcCgwKQoreworI2lmbmRlZiBOREVCVUcKKyAgICBzaGFyZWRCaXRtYXBMZWFrQ291
bnRlci5pbmNyZW1lbnQoKTsKKyNlbmRpZgorCisgICAgdW5zaWduZWQgYnVmZmVyU2l6ZSA9IG1f
Ym1wSW5mby5udW1QaXhlbHMoKTsKKyAgICBpZiAoYml0Q291bnQgPT0gQml0bWFwSW5mbzo6Qml0
Q291bnQxNikKKyAgICAgICAgYnVmZmVyU2l6ZSAvPSAyOworCisgICAgbV9waXhlbERhdGEuc2V0
KG5ldyB1bnNpZ25lZFtidWZmZXJTaXplXSk7CisgICAgbV9waXhlbHMgPSBtX3BpeGVsRGF0YS5n
ZXQoKTsKKworICAgIGlmIChpbml0UGl4ZWxzKQorICAgICAgICByZXNldFBpeGVscygpOworfQor
CitTaGFyZWRCaXRtYXA6On5TaGFyZWRCaXRtYXAoKQoreworI2lmbmRlZiBOREVCVUcKKyAgICBz
aGFyZWRCaXRtYXBMZWFrQ291bnRlci5kZWNyZW1lbnQoKTsKKyNlbmRpZgorCisgICAgaWYgKG1f
aGJpdG1hcCkKKyAgICAgICAgRGVsZXRlT2JqZWN0KG1faGJpdG1hcCk7Cit9CisKK3ZvaWQgU2hh
cmVkQml0bWFwOjpyZXNldFBpeGVscyhib29sIGJsYWNrKQoreworICAgIGlmICghbV9waXhlbHMp
CisgICAgICAgIHJldHVybjsKKworICAgIHVuc2lnbmVkIGJ1ZmZlclNpemUgPSBtX2JtcEluZm8u
bnVtUGl4ZWxzKCk7CisgICAgaWYgKGJsYWNrKSB7CisgICAgICAgIHVuc2lnbmVkIGJ1ZmZlclNp
emVJbkJ5dGVzID0gYnVmZmVyU2l6ZSAqIChpczE2Yml0KCkgPyAyIDogNCk7CisgICAgICAgIG1l
bXNldChtX3BpeGVscywgMCwgYnVmZmVyU2l6ZUluQnl0ZXMpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgaWYgKGlzMTZiaXQoKSkgeworICAgICAgICAvLyBGaWxsIGl0IHdpdGggd2hp
dGUgY29sb3IKKyAgICAgICAgd21lbXNldChyZWludGVycHJldF9jYXN0PHdjaGFyX3QqPihtX3Bp
eGVscyksIDB4RkZGRiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAvLyBNYWtlIGl0IHdoaXRlIGJ1dCB0cmFuc3BhcmVudAorICAgIHVuc2lnbmVkKiBwaXhlbCA9
IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQqPihtX3BpeGVscyk7CisgICAgY29uc3QgdW5zaWdu
ZWQqIGNvbnN0IGJ1ZmZlckVuZCA9IHBpeGVsICsgYnVmZmVyU2l6ZTsKKyAgICB3aGlsZSAocGl4
ZWwgPCBidWZmZXJFbmQpCisgICAgICAgICpwaXhlbCsrID0gMHgwMEZGRkZGRjsKK30KKworc3Rh
dGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBjb252ZXJ0MzJUbzE2KHVuc2lnbmVkIHBpeGVsKQor
eworICAgIHVuc2lnbmVkIHNob3J0IHIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oKHBp
eGVsICYgMHgwMEY4MDAwMCkgPj4gOCk7CisgICAgdW5zaWduZWQgc2hvcnQgZyA9IHN0YXRpY19j
YXN0PHVuc2lnbmVkIHNob3J0PigocGl4ZWwgJiAweDAwMDBGQzAwKSA+PiA1KTsKKyAgICB1bnNp
Z25lZCBzaG9ydCBiID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KChwaXhlbCAmIDB4MDAw
MDAwRjgpID4+IDMpOworICAgIHJldHVybiByIHwgZyB8IGI7Cit9CisKK2Jvb2wgU2hhcmVkQml0
bWFwOjp0bzE2Yml0KCkKK3sKKyAgICBpZiAobV9sb2NrZWQpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAoaXMxNmJpdCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIEJpdG1h
cEluZm8gbmV3Qm1wSW5mbyA9IEJpdG1hcEluZm86OmNyZWF0ZShtX2JtcEluZm8uc2l6ZSgpLCBC
aXRtYXBJbmZvOjpCaXRDb3VudDE2KTsKKworICAgIGludCB3aWR0aCA9IG5ld0JtcEluZm8ud2lk
dGgoKTsKKyAgICBpbnQgcGFkZGVkV2lkdGggPSBuZXdCbXBJbmZvLnBhZGRlZFdpZHRoKCk7Cisg
ICAgaW50IGJ1ZmZlclNpemUgPSBwYWRkZWRXaWR0aCAqIG5ld0JtcEluZm8uaGVpZ2h0KCk7Cisg
ICAgT3duQXJyYXlQdHI8dW5zaWduZWQ+IG5ld1BpeGVsRGF0YShuZXcgdW5zaWduZWRbYnVmZmVy
U2l6ZSAvIDJdKTsKKyAgICB2b2lkKiBuZXdQaXhlbHMgPSBuZXdQaXhlbERhdGEuZ2V0KCk7CisK
KyAgICBpZiAoIW5ld1BpeGVscykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWdu
ZWQgc2hvcnQqIHAxNiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0Kj4obmV3UGl4ZWxzKTsK
KyAgICBjb25zdCB1bnNpZ25lZCogcDMyID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQqPiht
X3BpeGVscyk7CisKKyAgICBib29sIHNraXBzID0gcGFkZGVkV2lkdGggIT0gd2lkdGg7CisKKyAg
ICBjb25zdCB1bnNpZ25lZCBzaG9ydCogcDE2ZW5kID0gcDE2ICsgYnVmZmVyU2l6ZTsKKyAgICB3
aGlsZSAocDE2IDwgcDE2ZW5kKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgc2hvcnQqIHAxNmxp
bmVFbmQgPSBwMTYgKyB3aWR0aDsgcDE2IDwgcDE2bGluZUVuZDsgKQorICAgICAgICAgICAgKnAx
NisrID0gY29udmVydDMyVG8xNigqcDMyKyspOworCisgICAgICAgIGlmIChza2lwcykKKyAgICAg
ICAgICAgICpwMTYrKyA9IDA7CisgICAgfQorCisgICAgaWYgKG1faGJpdG1hcCkgeworICAgICAg
ICBEZWxldGVPYmplY3QobV9oYml0bWFwKTsKKyAgICAgICAgbV9oYml0bWFwID0gMDsKKyAgICB9
IGVsc2UKKyAgICAgICAgbV9waXhlbERhdGEuc3dhcChuZXdQaXhlbERhdGEpOworCisgICAgbV9w
aXhlbHMgPSBuZXdQaXhlbHM7CisgICAgbV9ibXBJbmZvID0gbmV3Qm1wSW5mbzsKKworICAgIHNl
dEhhc0FscGhhKGZhbHNlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTaGFyZWRCaXRt
YXA6OmZyZWVNZW1vcnkoKQoreworICAgIGlmIChtX2xvY2tlZCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgaWYgKG1faGJpdG1hcCkgeworICAgICAgICBEZWxldGVPYmplY3QobV9oYml0
bWFwKTsKKyAgICAgICAgbV9oYml0bWFwID0gMDsKKyAgICAgICAgbV9waXhlbHMgPSAwOworICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobV9waXhlbHMpIHsKKyAgICAgICAg
bV9waXhlbERhdGEuY2xlYXIoKTsKKyAgICAgICAgbV9waXhlbHMgPSAwOworICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0hCSVRNQVAgU2hhcmVk
Qml0bWFwOjpjcmVhdGVIYW5kbGUodm9pZCoqIHBpeGVscywgQml0bWFwSW5mbyogYm1wSW5mbywg
aW50IGhlaWdodCwgYm9vbCB1c2UxNmJpdCkgY29uc3QKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChoZWlnaHQgPT0gLTEpCisgICAgICAgIGhlaWdo
dCA9IHRoaXMtPmhlaWdodCgpOworICAgICpibXBJbmZvID0gQml0bWFwSW5mbzo6Y3JlYXRlQm90
dG9tVXAoSW50U2l6ZSh3aWR0aCgpLCBoZWlnaHQpLCAodXNlMTZiaXQgfHwgaXMxNmJpdCgpKSA/
IEJpdG1hcEluZm86OkJpdENvdW50MTYgOiBCaXRtYXBJbmZvOjpCaXRDb3VudDMyKTsKKworICAg
IEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgYm1wSW5mbywgRElCX1JHQl9DT0xP
UlMsIHBpeGVscywgMCwgMCk7CisKKyAgICBpZiAoIWhibXApCisgICAgICAgIHJldHVybiAwOwor
CisgICAgT3duUHRyPEhEQz4gYm1wREMoQ3JlYXRlQ29tcGF0aWJsZURDKDApKTsKKyAgICBIR0RJ
T0JKIGhPbGRCbXAgPSBTZWxlY3RPYmplY3QoYm1wREMuZ2V0KCksIGhibXApOworCisgICAgU3Ry
ZXRjaERJQml0cyhibXBEQy5nZXQoKSwgMCwgMCwgd2lkdGgoKSwgaGVpZ2h0LCAwLCAwLCB3aWR0
aCgpLCBoZWlnaHQsIG1fcGl4ZWxzLCAmbV9ibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgU1JDQ09Q
WSk7CisKKyAgICBTZWxlY3RPYmplY3QoYm1wREMuZ2V0KCksIGhPbGRCbXApOworCisgICAgcmV0
dXJuIGhibXA7Cit9CisKK2Jvb2wgU2hhcmVkQml0bWFwOjplbnN1cmVIYW5kbGUoKQoreworICAg
IGlmIChtX2hiaXRtYXApCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFtX3BpeGVs
cykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1fbG9ja2VkKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBCaXRtYXBJbmZvIGJtcEluZm87CisgICAgdm9pZCogcGl4ZWxz
OworICAgIG1faGJpdG1hcCA9IGNyZWF0ZUhhbmRsZSgmcGl4ZWxzLCAmYm1wSW5mbywgLTEsICFo
YXNBbHBoYSgpKTsKKworICAgIGlmICghbV9oYml0bWFwKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBtX3BpeGVsRGF0YS5jbGVhcigpOworICAgIG1fcGl4ZWxzID0gcGl4ZWxzOworICAg
IG1fYm1wSW5mbyA9IGJtcEluZm87CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTaGFy
ZWRCaXRtYXA6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBJbnRSZWN0JiBkc3RS
ZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwg
Q29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAg
ICAgICAgcmV0dXJuOworICAgIGN0eHQtPmRyYXdCaXRtYXAodGhpcywgZHN0UmVjdCwgc3JjUmVj
dCwgc3R5bGVDb2xvclNwYWNlLCBjb21wb3NpdGVPcCk7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFw
OjpkcmF3KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJlY3QmIHNy
Y1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGlmICghbV9waXhl
bHMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSB8fCBzcmNS
ZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSEJJVE1BUCBoYml0bWFwID0g
MDsKKyAgICBib29sIHVzaW5nSGFuZGxlID0gY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlU291cmNl
T3ZlciAmJiAoaGFzQWxwaGEoKSAmJiBoYXNBbHBoYUJsZW5kU3VwcG9ydCgpIHx8IHVzZXNUcmFu
c3BhcmVudENvbG9yKCkpOworCisgICAgaWYgKHVzaW5nSGFuZGxlKSB7CisgICAgICAgIGlmIChl
bnN1cmVIYW5kbGUoKSkKKyAgICAgICAgICAgIGhiaXRtYXAgPSBtX2hiaXRtYXA7CisgICAgICAg
IGVsc2UgeworICAgICAgICAgICAgdm9pZCogcGl4ZWxzOworICAgICAgICAgICAgQml0bWFwSW5m
byBibXBJbmZvOworICAgICAgICAgICAgaGJpdG1hcCA9IGNyZWF0ZUhhbmRsZSgmcGl4ZWxzLCAm
Ym1wSW5mbywgLTEsIHVzZXNUcmFuc3BhcmVudENvbG9yKCkpOworICAgICAgICB9CisgICAgfQor
ICAgIGlmICghaGJpdG1hcCkgeworICAgICAgICAvLyBGSVhNRTogaGFuZGxlIG90aGVyIGNvbXBv
c2l0ZSBvcGVyYXRpb24gdHlwZXM/CisgICAgICAgIERXT1JEIHJvcCA9IGNvbXBvc2l0ZU9wID09
IENvbXBvc2l0ZUNvcHkgPyBTUkNDT1BZCisgICAgICAgICAgICA6IGNvbXBvc2l0ZU9wID09IENv
bXBvc2l0ZVhPUiA/IFBBVElOVkVSVAorICAgICAgICAgICAgOiBjb21wb3NpdGVPcCA9PSBDb21w
b3NpdGVDbGVhciA/IFdISVRFTkVTUworICAgICAgICAgICAgOiBTUkNDT1BZOworCisgICAgICAg
IFN0cmV0Y2hESUJpdHMoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lk
dGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwKKyAgICAgICAgICAgIHNyY1JlY3QueCgpLCBzcmNSZWN0
LnkoKSwgc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgpLCBtX3BpeGVscywgJm1fYm1w
SW5mbywgRElCX1JHQl9DT0xPUlMsIHJvcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBPd25QdHI8SERDPiBobWVtZGMoQ3JlYXRlQ29tcGF0aWJsZURDKGhkYykpOworICAgIEhHRElP
QkogaE9sZEJtcCA9IFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCksIGhiaXRtYXApOworCisgICAg
aWYgKCF1c2VzVHJhbnNwYXJlbnRDb2xvcigpICYmIGhhc0FscGhhQmxlbmRTdXBwb3J0KCkpIHsK
KyAgICAgICAgc3RhdGljIGNvbnN0IEJMRU5ERlVOQ1RJT04gYmxlbmQgPSB7IEFDX1NSQ19PVkVS
LCAwLCAyNTUsIEFDX1NSQ19BTFBIQSB9OworICAgICAgICBib29sIHN1Y2Nlc3MgPSBhbHBoYUJs
ZW5kSWZTdXBwb3J0ZWQoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lk
dGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgaG1lbWRjLmdldCgpLAorICAgICAgICAgICAgc3JjUmVj
dC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksIGJs
ZW5kKTsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChzdWNjZXNzLCBzdWNjZXNzKTsKKyAgICB9IGVs
c2UKKyAgICAgICAgVHJhbnNwYXJlbnRCbHQoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCks
IGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgaG1lbWRjLmdldCgpLAorICAgICAg
ICAgICAgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3Qu
aGVpZ2h0KCksIHRyYW5zcGFyZW50Q29sb3IoKSk7CisKKyAgICBTZWxlY3RPYmplY3QoaG1lbWRj
LmdldCgpLCBoT2xkQm1wKTsKKyAgICBpZiAoaGJpdG1hcCAhPSBtX2hiaXRtYXApCisgICAgICAg
IERlbGV0ZU9iamVjdChoYml0bWFwKTsKK30KKworSEJJVE1BUCBTaGFyZWRCaXRtYXA6OmNsaXBC
aXRtYXAoY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCB1c2VBbHBoYSwgQml0bWFwSW5mbyYgYm1w
SW5mbywgdm9pZComIHBpeGVscykKK3sKKyAgICBpZiAoIWJ5dGVzKCkpCisgICAgICAgIHJldHVy
biAwOworCisgICAgaW50IG9sZFdpZHRoID0gd2lkdGgoKTsKKyAgICBpbnQgb2xkSGVpZ2h0ID0g
aGVpZ2h0KCk7CisgICAgaW50IGNvcHlXaWR0aCA9IHN0ZDo6bWluPGludD4ocmVjdC53aWR0aCgp
LCBvbGRXaWR0aCAtIHJlY3QueCgpKTsKKyAgICBpbnQgY29weUhlaWdodCA9IHN0ZDo6bWluPGlu
dD4ocmVjdC5oZWlnaHQoKSwgb2xkSGVpZ2h0IC0gcmVjdC55KCkpOworICAgIGlmICghY29weVdp
ZHRoIHx8ICFjb3B5SGVpZ2h0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGJtcEluZm8gPSBC
aXRtYXBJbmZvOjpjcmVhdGVCb3R0b21VcChJbnRTaXplKGNvcHlXaWR0aCwgY29weUhlaWdodCks
ICh1c2VBbHBoYSAmJiBpczMyYml0KCkpID8gQml0bWFwSW5mbzo6Qml0Q291bnQzMiA6IEJpdG1h
cEluZm86OkJpdENvdW50MTYpOworICAgIEhCSVRNQVAgbmV3Qm1wID0gQ3JlYXRlRElCU2VjdGlv
bigwLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAsIDApOworCisgICAgaWYg
KCFuZXdCbXApCisgICAgICAgIHJldHVybiAwOworCisgICAgT3duUHRyPEhEQz4gZGNOZXcoQ3Jl
YXRlQ29tcGF0aWJsZURDKDApKTsKKyAgICBIR0RJT0JKIHRtcE5ldyA9IFNlbGVjdE9iamVjdChk
Y05ldy5nZXQoKSwgbmV3Qm1wKTsKKworICAgIFN0cmV0Y2hESUJpdHMoZGNOZXcuZ2V0KCksIDAs
IDAsIGNvcHlXaWR0aCwgY29weUhlaWdodCwgcmVjdC54KCksIHJlY3QueSgpLCBjb3B5V2lkdGgs
IGNvcHlIZWlnaHQsCisgICAgICAgIGJ5dGVzKCksICZiaXRtYXBJbmZvKCksIERJQl9SR0JfQ09M
T1JTLCBTUkNDT1BZKTsKKworICAgIFNlbGVjdE9iamVjdChkY05ldy5nZXQoKSwgdG1wTmV3KTsK
KyAgICByZXR1cm4gbmV3Qm1wOworfQorCitQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4gU2hhcmVk
Qml0bWFwOjpjbGlwQml0bWFwKGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgdXNlQWxwaGEpCit7
CisgICAgaW50IG9sZFdpZHRoID0gd2lkdGgoKTsKKyAgICBpbnQgb2xkSGVpZ2h0ID0gaGVpZ2h0
KCk7CisgICAgaW50IGNvcHlXaWR0aCA9IHN0ZDo6bWluPGludD4ocmVjdC53aWR0aCgpLCBvbGRX
aWR0aCAtIHJlY3QueCgpKTsKKyAgICBpbnQgY29weUhlaWdodCA9IHN0ZDo6bWluPGludD4ocmVj
dC5oZWlnaHQoKSwgb2xkSGVpZ2h0IC0gcmVjdC55KCkpOworICAgIGlmICghY29weVdpZHRoIHx8
ICFjb3B5SGVpZ2h0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJlZlB0cjxTaGFyZWRCaXRt
YXA+IG5ld0JtcCA9IGNyZWF0ZShJbnRTaXplKGNvcHlXaWR0aCwgY29weUhlaWdodCksIHVzZUFs
cGhhICYmIGlzMzJiaXQoKSA/IEJpdG1hcEluZm86OkJpdENvdW50MzIgOiBCaXRtYXBJbmZvOjpC
aXRDb3VudDE2LCBmYWxzZSk7CisKKyAgICBpZiAoIW5ld0JtcCB8fCAhbmV3Qm1wLT5ieXRlcygp
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIERDSG9sZGVyIGRjTmV3KG5ld0JtcC5nZXQoKSk7
CisKKyAgICBTdHJldGNoRElCaXRzKGRjTmV3LmdldCgpLCAwLCAwLCBjb3B5V2lkdGgsIGNvcHlI
ZWlnaHQsIHJlY3QueCgpLCByZWN0LnkoKSwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LAorICAgICAg
ICBieXRlcygpLCAmYml0bWFwSW5mbygpLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAg
ICByZXR1cm4gbmV3Qm1wOworfQorCitzdGF0aWMgdm9pZCBkcmF3UGF0dGVyblNpbXBsZShIREMg
aGRjLCBjb25zdCBSRUNUJiBkZXN0UmVjdCwgSEJJVE1BUCBoYm1wLCBjb25zdCBQT0lOVCYgcGhh
c2UpCit7CisgICAgSEJSVVNIIGhCcnVzaCA9IENyZWF0ZVBhdHRlcm5CcnVzaChoYm1wKTsKKyAg
ICBpZiAoIWhCcnVzaCkKKyAgICAgICAgcmV0dXJuOworCisgICAgUE9JTlQgb2xkT3JnOworICAg
IFNldEJydXNoT3JnRXgoaGRjLCBkZXN0UmVjdC5sZWZ0IC0gcGhhc2UueCwgZGVzdFJlY3QudG9w
IC0gcGhhc2UueSwgJm9sZE9yZyk7CisgICAgRmlsbFJlY3QoaGRjLCAmZGVzdFJlY3QsIGhCcnVz
aCk7CisgICAgRGVsZXRlT2JqZWN0KGhCcnVzaCk7CisgICAgU2V0QnJ1c2hPcmdFeChoZGMsIG9s
ZE9yZy54LCBvbGRPcmcueSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdQYXR0ZXJuU2ltcGxl
KEhEQyBoZGMsIGNvbnN0IFJFQ1QmIGRlc3RSZWN0LCBjb25zdCBTaGFyZWRCaXRtYXAqIGJtcCwg
Y29uc3QgU0laRSYgYm1wU2l6ZSwgY29uc3QgUE9JTlQmIHBoYXNlKQoreworICAgIGludCBkc3RZ
ID0gZGVzdFJlY3QudG9wOworICAgIGZvciAoaW50IHNvdXJjZVkgPSBwaGFzZS55OyBkc3RZIDwg
ZGVzdFJlY3QuYm90dG9tOyApIHsKKyAgICAgICAgaW50IHNvdXJjZUggPSBzdGQ6Om1pbjxpbnQ+
KGJtcFNpemUuY3kgLSBzb3VyY2VZLCBkZXN0UmVjdC5ib3R0b20gLSBkc3RZKTsKKyAgICAgICAg
aW50IGRzdFggPSBkZXN0UmVjdC5sZWZ0OworICAgICAgICBmb3IgKGludCBzb3VyY2VYID0gcGhh
c2UueDsgZHN0WCA8IGRlc3RSZWN0LnJpZ2h0OyApIHsKKyAgICAgICAgICAgIGludCBzb3VyY2VX
ID0gc3RkOjptaW48aW50PihibXBTaXplLmN4IC0gc291cmNlWCwgZGVzdFJlY3QucmlnaHQgLSBk
c3RYKTsKKworICAgICAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFgsIGRzdFksIHNvdXJj
ZVcsIHNvdXJjZUgsIHNvdXJjZVgsIHNvdXJjZVksIHNvdXJjZVcsIHNvdXJjZUgsCisgICAgICAg
ICAgICAgICAgYm1wLT5ieXRlcygpLCAmYm1wLT5iaXRtYXBJbmZvKCksIERJQl9SR0JfQ09MT1JT
LCBTUkNDT1BZKTsKKworICAgICAgICAgICAgZHN0WCArPSBzb3VyY2VXOworICAgICAgICAgICAg
c291cmNlWCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBkc3RZICs9IHNvdXJjZUg7CisgICAg
ICAgIHNvdXJjZVkgPSAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbm9ybWFsaXplUGhhc2Uo
TE9ORyYgcGhhc2UsIGludCBsaW1pdCkKK3sKKyAgICBpZiAoIXBoYXNlKQorICAgICAgICByZXR1
cm47CisgICAgaWYgKGxpbWl0IDwgMikgeworICAgICAgICBwaGFzZSA9IDA7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgaWYgKGxpbWl0ID09IDIpIHsKKyAgICAgICAgcGhhc2UgPSBwaGFz
ZSAmIDE7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBoYXNlIDwgMCkgeworICAg
ICAgICBwaGFzZSA9IC1waGFzZTsKKyAgICAgICAgaWYgKHBoYXNlID4gbGltaXQpCisgICAgICAg
ICAgICBwaGFzZSA9IHN0YXRpY19jYXN0PExPTkc+KHN0YXRpY19jYXN0PHVuc2lnbmVkPihwaGFz
ZSkgJSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obGltaXQpKTsKKyAgICAgICAgaWYgKHBoYXNlKQor
ICAgICAgICAgICAgcGhhc2UgPSBsaW1pdCAtIHBoYXNlOworICAgIH0gZWxzZSB7CisgICAgICAg
IGlmIChwaGFzZSA8IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBwaGFzZSA9
IHN0YXRpY19jYXN0PExPTkc+KHN0YXRpY19jYXN0PHVuc2lnbmVkPihwaGFzZSkgJSBzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4obGltaXQpKTsKKyAgICB9Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpk
cmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJl
Y3RJbiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbG9yU3BhY2Ugc3R5bGVD
b2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVj
dCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpCit7CisgICAgaWYgKCFtX3BpeGVscykK
KyAgICAgICAgcmV0dXJuOworICAgIGN0eHQtPmRyYXdCaXRtYXBQYXR0ZXJuKHRoaXMsIHRpbGVS
ZWN0SW4sIHBhdHRlcm5UcmFuc2Zvcm0sIHBoYXNlLCBzdHlsZUNvbG9yU3BhY2UsIG9wLCBkZXN0
UmVjdCwgb3JpZ1NvdXJjZVNpemUpOworfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6ZHJhd1BhdHRl
cm4oSERDIGhkYywgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0sIGNvbnN0IEZsb2F0
UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3Jt
LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbG9y
U3BhY2Ugc3R5bGVDb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRS
ZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpCit7CisgICAgaWYg
KCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHRpbGVSZWN0SW4ud2lkdGgo
KSA8PSAwIHx8IHRpbGVSZWN0SW4uaGVpZ2h0KCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgYm9vbCB1c2VBbHBoYSA9IG9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgJiYgaGFzQWxwaGEo
KSAmJiBpczMyYml0KCk7CisKKyAgICBpbnQgYm1wV2lkdGggPSB3aWR0aCgpOworICAgIGludCBi
bXBIZWlnaHQgPSBoZWlnaHQoKTsKKworICAgIEZsb2F0UmVjdCB0aWxlUmVjdCh0aWxlUmVjdElu
KTsKKyAgICBpZiAoYm1wV2lkdGggIT0gb3JpZ1NvdXJjZVNpemUud2lkdGgoKSkgeworICAgICAg
ICBkb3VibGUgcmF0ZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4oYm1wV2lkdGgpIC8gb3JpZ1NvdXJj
ZVNpemUud2lkdGgoKTsKKyAgICAgICAgZG91YmxlIHRlbXAgPSB0aWxlUmVjdC53aWR0aCgpICog
cmF0ZTsKKyAgICAgICAgdGlsZVJlY3Quc2V0WCh0aWxlUmVjdC54KCkgKiByYXRlKTsKKyAgICAg
ICAgdGlsZVJlY3Quc2V0V2lkdGgodGVtcCk7CisgICAgICAgIHRlbXAgPSB0aWxlUmVjdC5oZWln
aHQoKSAqIHJhdGU7CisgICAgICAgIHRpbGVSZWN0LnNldFkodGlsZVJlY3QueSgpICogcmF0ZSk7
CisgICAgICAgIHRpbGVSZWN0LnNldEhlaWdodCh0ZW1wKTsKKyAgICB9CisKKyAgICBPd25QdHI8
SEJJVE1BUD4gY2xpcHBlZEJtcDsKKworICAgIGlmICh0aWxlUmVjdC54KCkgfHwgdGlsZVJlY3Qu
eSgpIHx8IHRpbGVSZWN0LndpZHRoKCkgIT0gYm1wV2lkdGggfHwgdGlsZVJlY3QuaGVpZ2h0KCkg
IT0gYm1wSGVpZ2h0KSB7CisgICAgICAgIEJpdG1hcEluZm8gcGF0dGVybkJtcEluZm87CisgICAg
ICAgIHZvaWQqIHBhdHRlcm5QaXhlbHM7CisgICAgICAgIGNsaXBwZWRCbXAuc2V0KGNsaXBCaXRt
YXAoSW50UmVjdCh0aWxlUmVjdCksIHVzZUFscGhhLCBwYXR0ZXJuQm1wSW5mbywgcGF0dGVyblBp
eGVscykpOworICAgICAgICBpZiAoIWNsaXBwZWRCbXApCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgYm1wV2lkdGggPSB0aWxlUmVjdC53aWR0aCgpOworICAgICAgICBibXBIZWlnaHQg
PSB0aWxlUmVjdC5oZWlnaHQoKTsKKyAgICB9CisKKyAgICBBZmZpbmVUcmFuc2Zvcm0gdGYgPSB0
cmFuc2Zvcm07CisgICAgdGYgKj0gcGF0dGVyblRyYW5zZm9ybTsKKworICAgIEZsb2F0UmVjdCB0
clJlY3QgPSB0Zi5tYXBSZWN0KGRlc3RSZWN0KTsKKworICAgIFJFQ1QgY2xpcEJveDsKKyAgICBp
bnQgY2xpcFR5cGUgPSBHZXRDbGlwQm94KGhkYywgJmNsaXBCb3gpOworICAgIGlmIChjbGlwVHlw
ZSA9PSBTSU1QTEVSRUdJT04pCisgICAgICAgIHRyUmVjdC5pbnRlcnNlY3QoRmxvYXRSZWN0KGNs
aXBCb3gubGVmdCwgY2xpcEJveC50b3AsIGNsaXBCb3gucmlnaHQgLSBjbGlwQm94LmxlZnQsIGNs
aXBCb3guYm90dG9tIC0gY2xpcEJveC50b3ApKTsKKyAgICBlbHNlIGlmIChjbGlwVHlwZSA9PSBD
T01QTEVYUkVHSU9OKSB7CisgICAgICAgIE93blB0cjxIUkdOPiBjbGlwUmduKENyZWF0ZVJlY3RS
Z24oMCwgMCwgMCwgMCkpOworICAgICAgICBpZiAoR2V0Q2xpcFJnbihoZGMsIGNsaXBSZ24uZ2V0
KCkpID4gMCkgeworICAgICAgICAgICAgRFdPUkQgcmVnaW9uRGF0YVNpemUgPSBHZXRSZWdpb25E
YXRhKGNsaXBSZ24uZ2V0KCksIHNpemVvZihSR05EQVRBKSwgMCk7CisgICAgICAgICAgICBpZiAo
cmVnaW9uRGF0YVNpemUpIHsKKyAgICAgICAgICAgICAgICBWZWN0b3I8UkdOREFUQT4gcmVnaW9u
RGF0YShyZWdpb25EYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgR2V0UmVnaW9uRGF0YShjbGlw
UmduLmdldCgpLCByZWdpb25EYXRhU2l6ZSwgcmVnaW9uRGF0YS5kYXRhKCkpOworICAgICAgICAg
ICAgICAgIFJFQ1QqIHJlY3QgPSByZWludGVycHJldF9jYXN0PFJFQ1QqPihyZWdpb25EYXRhWzBd
LkJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZm9yIChEV09SRCBpID0gMDsgaSA8IHJlZ2lvbkRh
dGFbMF0ucmRoLm5Db3VudDsgKytpLCArK3JlY3QpCisgICAgICAgICAgICAgICAgICAgIHRyUmVj
dC5pbnRlcnNlY3QoRmxvYXRSZWN0KHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQg
LSByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSByZWN0LT50b3ApKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0clJlY3Qud2lkdGgoKSA8PSAwIHx8IHRyUmVj
dC5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICB0clJlY3QuaW5mbGF0ZSgx
KTsKKyAgICBJbnRSZWN0IHZpc2libGVEc3RSZWN0ID0gZW5jbG9zaW5nSW50UmVjdCh0Zi5pbnZl
cnNlKCkubWFwUmVjdCh0clJlY3QpKTsKKyAgICB2aXNpYmxlRHN0UmVjdC5pbnRlcnNlY3QoSW50
UmVjdChkZXN0UmVjdCkpOworCisgICAgaWYgKHZpc2libGVEc3RSZWN0LndpZHRoKCkgPD0gMCB8
fCB2aXNpYmxlRHN0UmVjdC5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICB0
clJlY3QgPSB0Zi5tYXBSZWN0KHZpc2libGVEc3RSZWN0KTsKKyAgICBSRUNUIGRzdFJlY3RXaW4g
PQorICAgIHsKKyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0LngoKSksCisgICAgICAgIHN0YWJs
ZVJvdW5kKHRyUmVjdC55KCkpLAorICAgICAgICBzdGFibGVSb3VuZCh0clJlY3QucmlnaHQoKSks
CisgICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC5ib3R0b20oKSksCisgICAgfTsKKyAgICBpZiAo
ZHN0UmVjdFdpbi5yaWdodCA8PSBkc3RSZWN0V2luLmxlZnQgfHwgZHN0UmVjdFdpbi5ib3R0b20g
PD0gZHN0UmVjdFdpbi50b3ApCisgICAgICAgIHJldHVybjsKKworICAgIFNJWkUgYm1wU2l6ZSA9
IHsgYm1wV2lkdGgsIGJtcEhlaWdodCB9OworCisgICAgLy8gUmVsYXRpdmUgdG8gZGVzdGluYXRp
b24sIGluIGJpdG1hcCBwaXhlbHMKKyAgICBQT0lOVCBwaGFzZVdpbiA9IHsgc3RhYmxlUm91bmQo
dmlzaWJsZURzdFJlY3QueCgpIC0gcGhhc2UueCgpKSwgc3RhYmxlUm91bmQodmlzaWJsZURzdFJl
Y3QueSgpIC0gcGhhc2UueSgpKSB9OworICAgIG5vcm1hbGl6ZVBoYXNlKHBoYXNlV2luLngsIGJt
cFNpemUuY3gpOworICAgIG5vcm1hbGl6ZVBoYXNlKHBoYXNlV2luLnksIGJtcFNpemUuY3kpOwor
CisgICAgUkVDVCBzcmNSZWN0V2luID0geworICAgICAgICAwLAorICAgICAgICAwLAorICAgICAg
ICBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC5yaWdodCgpKSAtIHN0YWJsZVJvdW5kKHZpc2li
bGVEc3RSZWN0LngoKSksCisgICAgICAgIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LmJvdHRv
bSgpKSAtIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LnkoKSkKKyAgICB9OworICAgIGlmIChz
cmNSZWN0V2luLnJpZ2h0IDw9IDAgfHwgc3JjUmVjdFdpbi5ib3R0b20gPD0gMCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgQml0bWFwSW5mbyBibXBJbmZvID0gQml0bWFwSW5mbzo6Y3JlYXRlQm90
dG9tVXAoSW50U2l6ZShzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSksIHVzZUFs
cGhhID8gQml0bWFwSW5mbzo6Qml0Q291bnQzMiA6IEJpdG1hcEluZm86OkJpdENvdW50MTYpOwor
ICAgIHZvaWQqIHBpeGVsczsKKyAgICBPd25QdHI8SEJJVE1BUD4gaGJtcFRlbXAoQ3JlYXRlRElC
U2VjdGlvbigwLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAsIDApKTsKKwor
ICAgIGlmICghaGJtcFRlbXApCisgICAgICAgIHJldHVybjsKKworICAgIE93blB0cjxIREM+IGht
ZW1kYyhDcmVhdGVDb21wYXRpYmxlREMoaGRjKSk7CisgICAgSEdESU9CSiBvbGRCbXAgPSBTZWxl
Y3RPYmplY3QoaG1lbWRjLmdldCgpLCBoYm1wVGVtcC5nZXQoKSk7CisgICAgaWYgKGNsaXBwZWRC
bXApCisgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwgc3JjUmVjdFdpbiwg
Y2xpcHBlZEJtcC5nZXQoKSwgcGhhc2VXaW4pOworICAgIGVsc2UgaWYgKChvcCAhPSBDb21wb3Np
dGVTb3VyY2VPdmVyIHx8IGNhblVzZURJQml0cygpKSAmJiBzcmNSZWN0V2luLnJpZ2h0IDw9IGJt
cFNpemUuY3ggKiAyICYmIHNyY1JlY3RXaW4uYm90dG9tIDw9IGJtcFNpemUuY3kgKiAyKQorICAg
ICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RXaW4sIHRoaXMsIGJt
cFNpemUsIHBoYXNlV2luKTsKKyAgICBlbHNlIGlmIChlbnN1cmVIYW5kbGUoKSkKKyAgICAgICAg
ZHJhd1BhdHRlcm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNSZWN0V2luLCBnZXRIYW5kbGUoKSwg
cGhhc2VXaW4pOworICAgIGVsc2UgeworICAgICAgICB2b2lkKiBwaXhlbHM7CisgICAgICAgIEJp
dG1hcEluZm8gYm1wSW5mbzsKKyAgICAgICAgaWYgKEhCSVRNQVAgaGJtcCA9IGNyZWF0ZUhhbmRs
ZSgmcGl4ZWxzLCAmYm1wSW5mbywgLTEsIGZhbHNlKSkgeworICAgICAgICAgICAgZHJhd1BhdHRl
cm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNSZWN0V2luLCBoYm1wLCBwaGFzZVdpbik7CisgICAg
ICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICBTZWxlY3RPYmplY3QoaG1lbWRjLmdldCgpLCBvbGRCbXApOworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHVzZUFscGhhICYmIGhhc0FscGhhQmxlbmRT
dXBwb3J0KCkpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IEJMRU5ERlVOQ1RJT04gYmxlbmQgPSB7
IEFDX1NSQ19PVkVSLCAwLCAyNTUsIEFDX1NSQ19BTFBIQSB9OworICAgICAgICBib29sIHN1Y2Nl
c3MgPSBhbHBoYUJsZW5kSWZTdXBwb3J0ZWQoaGRjLCBkc3RSZWN0V2luLmxlZnQsIGRzdFJlY3RX
aW4udG9wLCBkc3RSZWN0V2luLnJpZ2h0IC0gZHN0UmVjdFdpbi5sZWZ0LCBkc3RSZWN0V2luLmJv
dHRvbSAtIGRzdFJlY3RXaW4udG9wLAorICAgICAgICAgICAgaG1lbWRjLmdldCgpLCAwLCAwLCBz
cmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSwgYmxlbmQpOworICAgICAgICBBU1NF
UlRfVU5VU0VEKHN1Y2Nlc3MsIHN1Y2Nlc3MpOworICAgIH0gZWxzZSBpZiAodXNlQWxwaGEgJiYg
IWhhc0FscGhhQmxlbmRTdXBwb3J0KCkgfHwgb3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciAmJiB1
c2VzVHJhbnNwYXJlbnRDb2xvcigpKQorICAgICAgICBUcmFuc3BhcmVudEJsdChoZGMsIGRzdFJl
Y3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RSZWN0V2lu
LmxlZnQsCisgICAgICAgICAgICBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9wLCBo
bWVtZGMuZ2V0KCksIDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tLCB0
cmFuc3BhcmVudENvbG9yKCkpOworICAgIGVsc2UgeworICAgICAgICBEV09SRCBibXBPcCA9IG9w
ID09IENvbXBvc2l0ZUNvcHkgPyBTUkNDT1BZCisgICAgICAgICAgICAgICAgICAgIDogb3AgPT0g
Q29tcG9zaXRlU291cmNlT3ZlciA/IFNSQ0NPUFkKKyAgICAgICAgICAgICAgICAgICAgOiBvcCA9
PSBDb21wb3NpdGVYT1IgPyBQQVRJTlZFUlQKKyAgICAgICAgICAgICAgICAgICAgOiBvcCA9PSBD
b21wb3NpdGVDbGVhciA/IFdISVRFTkVTUworICAgICAgICAgICAgICAgICAgICA6IFNSQ0NPUFk7
IC8vIEZJWEVNRTogb3RoZXIgdHlwZXM/CisKKyAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRz
dFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RSZWN0
V2luLmxlZnQsCisgICAgICAgICAgICBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9w
LCAwLCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSwKKyAgICAgICAgICAg
IHBpeGVscywgJmJtcEluZm8sIERJQl9SR0JfQ09MT1JTLCBibXBPcCk7CisgICAgfQorICAgIFNl
bGVjdE9iamVjdChobWVtZGMuZ2V0KCksIG9sZEJtcCk7Cit9CisKK1NoYXJlZEJpdG1hcDo6RENQ
cm92aWRlciogU2hhcmVkQml0bWFwOjpzX2RjUHJvdmlkZXIgPSBuZXcgU2hhcmVkQml0bWFwOjpE
Q1Byb3ZpZGVyOworCitIREMgU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyOjpnZXREQyhTaGFyZWRC
aXRtYXAqIGJtcCwgdW5zaWduZWQqIGtleTEpCit7CisgICAgaWYgKCFibXAgfHwgIWJtcC0+ZW5z
dXJlSGFuZGxlKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgSERDIGhkYyA9IENyZWF0ZUNv
bXBhdGlibGVEQygwKTsKKyAgICBpZiAoIWhkYykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAq
a2V5MSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQ+KFNlbGVjdE9iamVjdChoZGMsIGJtcC0+
Z2V0SGFuZGxlKCkpKTsKKyAgICBSRUNUIHJlY3QgPSB7IDAsIDAsIGJtcC0+d2lkdGgoKSwgYm1w
LT5oZWlnaHQoKSB9OworICAgIE93blB0cjxIUkdOPiBjbGlwUmduKENyZWF0ZVJlY3RSZ25JbmRp
cmVjdCgmcmVjdCkpOworICAgIFNlbGVjdENsaXBSZ24oaGRjLCBjbGlwUmduLmdldCgpKTsKKwor
ICAgIHJldHVybiBoZGM7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyOjpyZWxl
YXNlREMoU2hhcmVkQml0bWFwKiwgSERDIGhkYywgdW5zaWduZWQga2V5MSkKK3sKKyAgICBpZiAo
IWhkYykKKyAgICAgICAgcmV0dXJuOworCisgICAgU2VsZWN0T2JqZWN0KGhkYywgcmVpbnRlcnBy
ZXRfY2FzdDxIR0RJT0JKPihrZXkxKSk7CisgICAgRGVsZXRlREMoaGRjKTsKK30KKwordm9pZCBT
aGFyZWRCaXRtYXA6OmNsZWFyUGl4ZWxzKGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYg
KCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBibXBSZWN0KDAsIDAs
IHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBibXBSZWN0LmludGVyc2VjdChyZWN0KTsKKyAgICBp
ZiAoaXMxNmJpdCgpKSB7CisgICAgICAgIHVuc2lnbmVkIHcgPSBtX2JtcEluZm8ucGFkZGVkV2lk
dGgoKTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQqIGRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5z
aWduZWQgc2hvcnQqPihtX3BpeGVscyk7CisgICAgICAgIGRzdCArPSBibXBSZWN0LnkoKSAqIHcg
KyBibXBSZWN0LngoKTsKKyAgICAgICAgaW50IHdvcmRzVG9TZXQgPSBibXBSZWN0LndpZHRoKCk7
CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBkc3RFbmQgPSBkc3QgKyBibXBSZWN0Lmhl
aWdodCgpICogdzsKKyAgICAgICAgd2hpbGUgKGRzdCA8IGRzdEVuZCkgeworICAgICAgICAgICAg
d21lbXNldChyZWludGVycHJldF9jYXN0PHdjaGFyX3QqPihkc3QpLCAwLCB3b3Jkc1RvU2V0KTsK
KyAgICAgICAgICAgIGRzdCArPSB3OworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICB1bnNpZ25lZCB3ID0gd2lkdGgoKTsKKyAgICB1bnNpZ25lZCogZHN0ID0gcmVpbnRl
cnByZXRfY2FzdDx1bnNpZ25lZCo+KG1fcGl4ZWxzKTsKKyAgICBkc3QgKz0gYm1wUmVjdC55KCkg
KiB3ICsgYm1wUmVjdC54KCk7CisgICAgaW50IHdvcmRzVG9TZXQgPSBibXBSZWN0LndpZHRoKCkg
KiAyOworICAgIGNvbnN0IHVuc2lnbmVkKiBkc3RFbmQgPSBkc3QgKyBibXBSZWN0LmhlaWdodCgp
ICogdzsKKyAgICB3aGlsZSAoZHN0IDwgZHN0RW5kKSB7CisgICAgICAgIHdtZW1zZXQocmVpbnRl
cnByZXRfY2FzdDx3Y2hhcl90Kj4oZHN0KSwgMCwgd29yZHNUb1NldCk7CisgICAgICAgIGRzdCAr
PSB3OworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQoNClByb3BlcnR5IGNoYW5n
ZXMgb246IFdlYkNvcmVccGxhdGZvcm1cZ3JhcGhpY3Ncd2luY2VcU2hhcmVkQml0bWFwLmNwcA0K
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fXw0KQWRkZWQ6IHN2bjplb2wtc3R5bGUNCiAgICsgbmF0aXZlDQoNCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oDQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
DQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFw
LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogIENvcHlyaWdodCAoQykg
MjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogIENv
cHlyaWdodCAoQykgMjAxMCBQYXRyaWNrIEdhbnN0ZXJlciA8cGFyb2dhQHBhcm9nYS5jb20+Cisg
KgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICovCisKKyNpZm5kZWYgU2hhcmVkQml0bWFwX2gKKyNkZWZpbmUgU2hhcmVkQml0bWFwX2gK
KworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkJpdG1hcEluZm8uaCIK
KyNpbmNsdWRlICJDb2xvclNwYWNlLmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNp
bmNsdWRlIDx3dGYvT3duQXJyYXlQdHIuaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgor
I2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3aW5nZGkuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitlbnVtIENvbXBvc2l0ZU9wZXJhdG9yOworY2xhc3MgRmxvYXRQb2ludDsK
K2NsYXNzIEZsb2F0UmVjdDsKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIEludFJlY3Q7
CitjbGFzcyBJbnRTaXplOworY2xhc3MgVHJhbnNmb3JtYXRpb25NYXRyaXg7CisKK2NsYXNzIFNo
YXJlZEJpdG1hcDogcHVibGljIFJlZkNvdW50ZWQ8U2hhcmVkQml0bWFwPiB7CitwdWJsaWM6Cisg
ICAgflNoYXJlZEJpdG1hcCgpOworICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4g
Y3JlYXRlKGNvbnN0IEludFNpemUmLCBCaXRtYXBJbmZvOjpCaXRDb3VudCA9IEJpdG1hcEluZm86
OkJpdENvdW50MzIsIGJvb2wgaW5pdFBpeGVscyA9IHRydWUpOworICAgIHN0YXRpYyBQYXNzUmVm
UHRyPFNoYXJlZEJpdG1hcD4gY3JlYXRlKGNvbnN0IFZlY3Rvcjx1bnNpZ25lZD4mLCBjb25zdCBJ
bnRTaXplJiwgYm9vbCBoYXNBbHBoYSA9IHRydWUpOworCisgICAgY29uc3QgQml0bWFwSW5mbyYg
Yml0bWFwSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mbzsgfQorICAgIHZvaWQqIGJ5dGVz
KCkgeyByZXR1cm4gbV9waXhlbHM7IH0KKyAgICBjb25zdCB2b2lkKiBieXRlcygpIGNvbnN0IHsg
cmV0dXJuIG1fcGl4ZWxzOyB9CisgICAgdW5zaWduZWQgd2lkdGgoKSBjb25zdCB7IHJldHVybiBt
X2JtcEluZm8ud2lkdGgoKTsgfQorICAgIHVuc2lnbmVkIGhlaWdodCgpIGNvbnN0IHsgcmV0dXJu
IG1fYm1wSW5mby5oZWlnaHQoKTsgfQorICAgIHVuc2lnbmVkIHZhbGlkSGVpZ2h0KCkgY29uc3Qg
eyByZXR1cm4gbV92YWxpZEhlaWdodDsgfQorICAgIHZvaWQgc2V0VmFsaWRIZWlnaHQodW5zaWdu
ZWQgdmFsaWRIZWlnaHQpIHsgbV92YWxpZEhlaWdodCA9IHZhbGlkSGVpZ2h0OyB9CisgICAgdm9p
ZCByZXNldFBpeGVscyhib29sIGJsYWNrID0gZmFsc2UpOworICAgIHZvaWQgY2xlYXJQaXhlbHMo
Y29uc3QgSW50UmVjdCYgcik7CisgICAgYm9vbCBsb2NrZWQoKSBjb25zdCB7IHJldHVybiBtX2xv
Y2tlZDsgfQorICAgIHZvaWQgbG9jaygpIHsgbV9sb2NrZWQgPSB0cnVlOyB9CisgICAgdm9pZCB1
bmxvY2soKSB7IG1fbG9ja2VkID0gZmFsc2U7IH0KKyAgICBib29sIGZyZWVNZW1vcnkoKTsKKyAg
ICBib29sIGlzMTZiaXQoKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8uaXMxNmJpdCgpOyB9Cisg
ICAgYm9vbCBpczMyYml0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmlzMzJiaXQoKTsgfQor
ICAgIGJvb2wgdG8xNmJpdCgpOworICAgIGJvb2wgaGFzQWxwaGEoKSBjb25zdCB7IHJldHVybiBt
X2hhc0FscGhhOyB9CisgICAgdm9pZCBzZXRIYXNBbHBoYShib29sIGFscGhhKSB7IG1faGFzQWxw
aGEgPSBhbHBoYTsgfQorICAgIGJvb2wgZW5zdXJlSGFuZGxlKCk7CisgICAgSEJJVE1BUCBnZXRI
YW5kbGUoKSB7IHJldHVybiBtX2hiaXRtYXA7IH0KKyAgICBIQklUTUFQIGNyZWF0ZUhhbmRsZSh2
b2lkKiogcGl4ZWxzLCBCaXRtYXBJbmZvKiBibXBJbmZvLCBpbnQgaCA9IC0xLCBib29sIHVzZTE2
Yml0ID0gdHJ1ZSkgY29uc3Q7CisgICAgYm9vbCB1c2VzVHJhbnNwYXJlbnRDb2xvcigpIGNvbnN0
IHsgcmV0dXJuIG1fdXNlc1RyYW5zcGFyZW50Q29sb3I7IH0KKyAgICBDT0xPUlJFRiB0cmFuc3Bh
cmVudENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV90cmFuc3BhcmVudENvbG9yOyB9CisgICAgdm9p
ZCBzZXRUcmFuc3BhcmVudENvbG9yKENPTE9SUkVGIGMpCisgICAgeworICAgICAgICBtX3VzZXNU
cmFuc3BhcmVudENvbG9yID0gdHJ1ZTsKKyAgICAgICAgbV90cmFuc3BhcmVudENvbG9yID0gYzsK
KyAgICB9CisgICAgYm9vbCBjYW5Vc2VESUJpdHMoKSBjb25zdCB7IHJldHVybiAhaGFzQWxwaGEo
KSAmJiAhdXNlc1RyYW5zcGFyZW50Q29sb3IoKTsgfQorCisgICAgSEJJVE1BUCBjbGlwQml0bWFw
KGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgdXNlQWxwaGEsIEJpdG1hcEluZm8mIGJtcEluZm8s
IHZvaWQqJiBwaXhlbHMpOworCisgICAgUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IGNsaXBCaXRt
YXAoY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCB1c2VBbHBoYSk7CisKKyAgICB2b2lkIGRyYXco
R3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRS
ZWN0JiBzcmNSZWN0LCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0
b3IgY29tcG9zaXRlT3ApOworICAgIHZvaWQgZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiBj
dHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYg
cGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYg
cGhhc2UsIENvbG9yU3BhY2Ugc3R5bGVDb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwg
Y29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUp
OworICAgIHZvaWQgZHJhdyhIREMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJl
Y3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKTsKKyAgICB2b2lkIGRy
YXdQYXR0ZXJuKEhEQywgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgY29uc3QgRmxvYXRSZWN0JiB0
aWxlUmVjdEluLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb2xvclNwYWNlIHN0eWxl
Q29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJl
Y3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKTsKKworICAgIGNsYXNzIERDUHJvdmlk
ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCBIREMgZ2V0REMoU2hhcmVkQml0bWFw
KiwgdW5zaWduZWQqKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VEQyhTaGFyZWRCaXRt
YXAqLCBIREMsIHVuc2lnbmVkKTsKKyAgICB9OworCisgICAgc3RhdGljIERDUHJvdmlkZXIqIHNf
ZGNQcm92aWRlcjsKKworICAgIEhEQyBnZXREQyh1bnNpZ25lZCoga2V5MSkgeyByZXR1cm4gc19k
Y1Byb3ZpZGVyLT5nZXREQyh0aGlzLCBrZXkxKTsgfQorICAgIHZvaWQgcmVsZWFzZURDKEhEQyBo
ZGMsIHVuc2lnbmVkIGtleTEpIHsgc19kY1Byb3ZpZGVyLT5yZWxlYXNlREModGhpcywgaGRjLCBr
ZXkxKTsgfQorCisgICAgY2xhc3MgRENIb2xkZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgRENI
b2xkZXIoU2hhcmVkQml0bWFwKiBibXAgPSAwKSB7IHNldEludGVybmFsKGJtcCk7IH0KKyAgICAg
ICAgfkRDSG9sZGVyKCkgeyBjbGVhckludGVybmFsKCk7IH0KKyAgICAgICAgdm9pZCBzZXQoU2hh
cmVkQml0bWFwKiBibXAgPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBjbGVhckludGVybmFs
KCk7CisgICAgICAgICAgICBzZXRJbnRlcm5hbChibXApOworICAgICAgICB9CisgICAgICAgIEhE
QyBnZXQoKSBjb25zdCB7IHJldHVybiBtX2hkYzsgfQorICAgIHByaXZhdGU6CisgICAgICAgIERD
SG9sZGVyJiBvcGVyYXRvcj0oY29uc3QgRENIb2xkZXImKTsKKyAgICAgICAgRENIb2xkZXIoY29u
c3QgRENIb2xkZXImKTsKKyAgICAgICAgdm9pZCBjbGVhckludGVybmFsKCkKKyAgICAgICAgewor
ICAgICAgICAgICAgaWYgKG1faGRjKQorICAgICAgICAgICAgICAgIG1fYml0bWFwLT5yZWxlYXNl
REMobV9oZGMsIG1fa2V5MSk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRJbnRlcm5hbChT
aGFyZWRCaXRtYXAqIGJtcCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9iaXRtYXAgPSBibXA7
CisgICAgICAgICAgICBtX2hkYyA9IGJtcCA/IGJtcC0+Z2V0REMoJm1fa2V5MSkgOiAwOworICAg
ICAgICB9CisgICAgICAgIFNoYXJlZEJpdG1hcCogbV9iaXRtYXA7CisgICAgICAgIEhEQyBtX2hk
YzsKKyAgICAgICAgdW5zaWduZWQgbV9rZXkxOworICAgIH07CisKK3ByaXZhdGU6CisgICAgU2hh
cmVkQml0bWFwKGNvbnN0IEludFNpemUmLCBCaXRtYXBJbmZvOjpCaXRDb3VudCwgYm9vbCBpbml0
UGl4ZWxzKTsKKyAgICBCaXRtYXBJbmZvIG1fYm1wSW5mbzsKKyAgICBIQklUTUFQIG1faGJpdG1h
cDsKKyAgICB2b2lkKiBtX3BpeGVsczsKKyAgICBPd25BcnJheVB0cjx1bnNpZ25lZD4gbV9waXhl
bERhdGE7CisgICAgQ09MT1JSRUYgbV90cmFuc3BhcmVudENvbG9yOworICAgIGludCBtX3ZhbGlk
SGVpZ2h0OworICAgIGJvb2wgbV9sb2NrZWQ7CisgICAgYm9vbCBtX3VzZXNUcmFuc3BhcmVudENv
bG9yOworICAgIGJvb2wgbV9oYXNBbHBoYTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
KworI2VuZGlmIC8vIFNoYXJlZEJpdG1hcF9oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoN
ClByb3BlcnR5IGNoYW5nZXMgb246IFdlYkNvcmVccGxhdGZvcm1cZ3JhcGhpY3Ncd2luY2VcU2hh
cmVkQml0bWFwLmgNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX18NCkFkZGVkOiBzdm46ZW9sLXN0eWxlDQogICArIG5hdGl2
ZQ0KDQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72603</attachid>
            <date>2010-11-01 17:01:36 -0700</date>
            <delta_ts>2010-11-03 05:26:35 -0700</delta_ts>
            <desc>1) SharedBitmap</desc>
            <filename>patch.patch</filename>
            <type>text/plain</type>
            <size>29617</size>
            <attacher name="Patrick R. Gansterer">paroga</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDcxMDc0KQorKysgV2ViQ29yZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkK
QEAgLTEsMyArMSw0MyBAQAorMjAxMC0xMS0wMSAgUGF0cmljayBHYW5zdGVyZXIgIDxwYXJvZ2FA
d2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBbV0lOQ0VdIEFkZCBTaGFyZWRCaXRtYXAKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTI4MjcyCisKKyAgICAgICAgU2hhcmVkQml0bWFwIGlzIGEg
aGVscGVyIGNsYXNzIHVzZWQgYXMgTmF0aXZlSW1hZ2VQdHIgZm9yIFdpbkNFLgorICAgICAgICBJ
dCdzIHdpZGUgdXNlZCBieSBXaW5DRSBncmFwaGljcyBmaWxlcyBhcyBhIHJlcGxhY2VtZW50IG9m
IEhCSVRNQVAuCisKKyAgICAgICAgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFlvbmcgTGkgPHlvbmcu
bGlAdG9yY2htb2JpbGUuY29tPi4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L1NoYXJlZEJpdG1hcC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFw
OjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpTaGFyZWRCaXRtYXAp
OgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjp+U2hhcmVkQml0bWFwKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6cmVzZXRQaXhlbHMpOgorICAgICAgICAoV2ViQ29y
ZTo6Y29udmVydDMyVG8xNik6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OnRvMTZi
aXQpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpmcmVlTWVtb3J5KToKKyAgICAg
ICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6Y3JlYXRlSGFuZGxlKToKKyAgICAgICAgKFdlYkNv
cmU6OlNoYXJlZEJpdG1hcDo6ZW5zdXJlSGFuZGxlKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJl
ZEJpdG1hcDo6ZHJhdyk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OmNsaXBCaXRt
YXApOgorICAgICAgICAoV2ViQ29yZTo6ZHJhd1BhdHRlcm5TaW1wbGUpOgorICAgICAgICAoV2Vi
Q29yZTo6bm9ybWFsaXplUGhhc2UpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpk
cmF3UGF0dGVybik6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OkRDUHJvdmlkZXI6
OmdldERDKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6RENQcm92aWRlcjo6cmVs
ZWFzZURDKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6Y2xlYXJQaXhlbHMpOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OkRDUHJvdmlkZXI6OmdldERDKToKKyAgICAgICAgKFdlYkNvcmU6
OkRDUHJvdmlkZXI6OnJlbGVhc2VEQyk6CisgICAgICAgIChXZWJDb3JlOjpEQ1Byb3ZpZGVyOjpE
Q0hvbGRlcjo6RENIb2xkZXIpOgorICAgICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6RENIb2xk
ZXI6On5EQ0hvbGRlcik6CisgICAgICAgIChXZWJDb3JlOjpEQ1Byb3ZpZGVyOjpEQ0hvbGRlcjo6
c2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkRDUHJvdmlkZXI6OkRDSG9sZGVyOjpnZXQpOgorICAg
ICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6RENIb2xkZXI6OmNsZWFySW50ZXJuYWwpOgorICAg
ICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6RENIb2xkZXI6OnNldEludGVybmFsKToKKwogMjAx
MC0xMS0wMSAgU2ltb24gRnJhc2VyICA8c2ltb24uZnJhc2VyQGFwcGxlLmNvbT4KIAogICAgICAg
ICBSZXZpZXdlZCBieSBEYW4gQmVybnN0ZWluLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCShyZXZpc2lvbiAwKQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDYyMiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3Jj
aCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqICBDb3B5cmlnaHQgKEMpIDIw
MTAgUGF0cmljayBHYW5zdGVyZXIgPHBhcm9nYUBwYXJvZ2EuY29tPgorICoKKyAqICBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisg
KiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg
KiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2hhcmVkQml0bWFwLmgiCisKKyNpbmNsdWRlICJH
RElFeHRyYXMuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJHcmFw
aGljc1R5cGVzLmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRl
ICJXaW5jZUdyYXBoaWNzRXh0cmFzLmgiCisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNs
dWRlIDx3dGYvUmVmQ291bnRlZExlYWtDb3VudGVyLmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5o
PgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyNpZm5k
ZWYgTkRFQlVHCitzdGF0aWMgV1RGOjpSZWZDb3VudGVkTGVha0NvdW50ZXIgc2hhcmVkQml0bWFw
TGVha0NvdW50ZXIoIlNoYXJlZEJpdG1hcCIpOworI2VuZGlmCisKKworUGFzc1JlZlB0cjxTaGFy
ZWRCaXRtYXA+IFNoYXJlZEJpdG1hcDo6Y3JlYXRlKGNvbnN0IEludFNpemUmIHNpemUsIEJpdG1h
cEluZm86OkJpdENvdW50IGJpdENvdW50LCBib29sIGluaXRQaXhlbHMpCit7CisgICAgUmVmUHRy
PFNoYXJlZEJpdG1hcD4gcmVzdWx0YW50Qml0bWFwID0gYWRvcHRSZWYobmV3IFNoYXJlZEJpdG1h
cChzaXplLCBiaXRDb3VudCwgaW5pdFBpeGVscykpOworICAgIGlmIChyZXN1bHRhbnRCaXRtYXAg
JiYgIXJlc3VsdGFudEJpdG1hcC0+Ynl0ZXMoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0
dXJuIHJlc3VsdGFudEJpdG1hcDsKK30KKworUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJl
ZEJpdG1hcDo6Y3JlYXRlKGNvbnN0IFZlY3Rvcjx1bnNpZ25lZD4mIGRhdGEsIGNvbnN0IEludFNp
emUmIHNpemUsIGJvb2wgaGFzQWxwaGEpCit7CisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gcmVz
dWx0ID0gY3JlYXRlKHNpemUsIEJpdG1hcEluZm86OkJpdENvdW50MzIsIGZhbHNlKTsKKyAgICBp
ZiAocmVzdWx0KSB7CisgICAgICAgIG1lbWNweShyZXN1bHQtPmJ5dGVzKCksIGRhdGEuZGF0YSgp
LCBkYXRhLnNpemUoKSAqIHNpemVvZih1bnNpZ25lZCkpOworICAgICAgICByZXN1bHQtPnNldEhh
c0FscGhhKGhhc0FscGhhKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworU2hhcmVk
Qml0bWFwOjpTaGFyZWRCaXRtYXAoY29uc3QgSW50U2l6ZSYgc2l6ZSwgQml0bWFwSW5mbzo6Qml0
Q291bnQgYml0Q291bnQsIGJvb2wgaW5pdFBpeGVscykKKyAgICA6IG1fYm1wSW5mbyhCaXRtYXBJ
bmZvOjpjcmVhdGVCb3R0b21VcChzaXplLCBiaXRDb3VudCkpCisgICAgLCBtX2xvY2tlZChmYWxz
ZSkKKyAgICAsIG1fdXNlc1RyYW5zcGFyZW50Q29sb3IoZmFsc2UpCisgICAgLCBtX3RyYW5zcGFy
ZW50Q29sb3IoUkdCKDAsIDAsIDApKQorICAgICwgbV9waXhlbHMoMCkKKyAgICAsIG1faGFzQWxw
aGEoZmFsc2UpCisgICAgLCBtX3ZhbGlkSGVpZ2h0KGFicyhzaXplLmhlaWdodCgpKSkKKyAgICAs
IG1faGJpdG1hcCgwKQoreworI2lmbmRlZiBOREVCVUcKKyAgICBzaGFyZWRCaXRtYXBMZWFrQ291
bnRlci5pbmNyZW1lbnQoKTsKKyNlbmRpZgorCisgICAgdW5zaWduZWQgYnVmZmVyU2l6ZSA9IG1f
Ym1wSW5mby5udW1QaXhlbHMoKTsKKyAgICBpZiAoYml0Q291bnQgPT0gQml0bWFwSW5mbzo6Qml0
Q291bnQxNikKKyAgICAgICAgYnVmZmVyU2l6ZSAvPSAyOworCisgICAgbV9waXhlbERhdGEuc2V0
KG5ldyB1bnNpZ25lZFtidWZmZXJTaXplXSk7CisgICAgbV9waXhlbHMgPSBtX3BpeGVsRGF0YS5n
ZXQoKTsKKworICAgIGlmIChpbml0UGl4ZWxzKQorICAgICAgICByZXNldFBpeGVscygpOworfQor
CitTaGFyZWRCaXRtYXA6On5TaGFyZWRCaXRtYXAoKQoreworI2lmbmRlZiBOREVCVUcKKyAgICBz
aGFyZWRCaXRtYXBMZWFrQ291bnRlci5kZWNyZW1lbnQoKTsKKyNlbmRpZgorCisgICAgaWYgKG1f
aGJpdG1hcCkKKyAgICAgICAgRGVsZXRlT2JqZWN0KG1faGJpdG1hcCk7Cit9CisKK3ZvaWQgU2hh
cmVkQml0bWFwOjpyZXNldFBpeGVscyhib29sIGJsYWNrKQoreworICAgIGlmICghbV9waXhlbHMp
CisgICAgICAgIHJldHVybjsKKworICAgIHVuc2lnbmVkIGJ1ZmZlclNpemUgPSBtX2JtcEluZm8u
bnVtUGl4ZWxzKCk7CisgICAgaWYgKGJsYWNrKSB7CisgICAgICAgIHVuc2lnbmVkIGJ1ZmZlclNp
emVJbkJ5dGVzID0gYnVmZmVyU2l6ZSAqIChpczE2Yml0KCkgPyAyIDogNCk7CisgICAgICAgIG1l
bXNldChtX3BpeGVscywgMCwgYnVmZmVyU2l6ZUluQnl0ZXMpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgaWYgKGlzMTZiaXQoKSkgeworICAgICAgICAvLyBGaWxsIGl0IHdpdGggd2hp
dGUgY29sb3IKKyAgICAgICAgd21lbXNldChyZWludGVycHJldF9jYXN0PHdjaGFyX3QqPihtX3Bp
eGVscyksIDB4RkZGRiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAvLyBNYWtlIGl0IHdoaXRlIGJ1dCB0cmFuc3BhcmVudAorICAgIHVuc2lnbmVkKiBwaXhlbCA9
IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQqPihtX3BpeGVscyk7CisgICAgY29uc3QgdW5zaWdu
ZWQqIGNvbnN0IGJ1ZmZlckVuZCA9IHBpeGVsICsgYnVmZmVyU2l6ZTsKKyAgICB3aGlsZSAocGl4
ZWwgPCBidWZmZXJFbmQpCisgICAgICAgICpwaXhlbCsrID0gMHgwMEZGRkZGRjsKK30KKworc3Rh
dGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBjb252ZXJ0MzJUbzE2KHVuc2lnbmVkIHBpeGVsKQor
eworICAgIHVuc2lnbmVkIHNob3J0IHIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oKHBp
eGVsICYgMHgwMEY4MDAwMCkgPj4gOCk7CisgICAgdW5zaWduZWQgc2hvcnQgZyA9IHN0YXRpY19j
YXN0PHVuc2lnbmVkIHNob3J0PigocGl4ZWwgJiAweDAwMDBGQzAwKSA+PiA1KTsKKyAgICB1bnNp
Z25lZCBzaG9ydCBiID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KChwaXhlbCAmIDB4MDAw
MDAwRjgpID4+IDMpOworICAgIHJldHVybiByIHwgZyB8IGI7Cit9CisKK2Jvb2wgU2hhcmVkQml0
bWFwOjp0bzE2Yml0KCkKK3sKKyAgICBpZiAobV9sb2NrZWQpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBpZiAoaXMxNmJpdCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIEJpdG1h
cEluZm8gbmV3Qm1wSW5mbyA9IEJpdG1hcEluZm86OmNyZWF0ZShtX2JtcEluZm8uc2l6ZSgpLCBC
aXRtYXBJbmZvOjpCaXRDb3VudDE2KTsKKworICAgIGludCB3aWR0aCA9IG5ld0JtcEluZm8ud2lk
dGgoKTsKKyAgICBpbnQgcGFkZGVkV2lkdGggPSBuZXdCbXBJbmZvLnBhZGRlZFdpZHRoKCk7Cisg
ICAgaW50IGJ1ZmZlclNpemUgPSBwYWRkZWRXaWR0aCAqIG5ld0JtcEluZm8uaGVpZ2h0KCk7Cisg
ICAgT3duQXJyYXlQdHI8dW5zaWduZWQ+IG5ld1BpeGVsRGF0YShuZXcgdW5zaWduZWRbYnVmZmVy
U2l6ZSAvIDJdKTsKKyAgICB2b2lkKiBuZXdQaXhlbHMgPSBuZXdQaXhlbERhdGEuZ2V0KCk7CisK
KyAgICBpZiAoIW5ld1BpeGVscykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWdu
ZWQgc2hvcnQqIHAxNiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0Kj4obmV3UGl4ZWxzKTsK
KyAgICBjb25zdCB1bnNpZ25lZCogcDMyID0gc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQqPiht
X3BpeGVscyk7CisKKyAgICBib29sIHNraXBzID0gcGFkZGVkV2lkdGggIT0gd2lkdGg7CisKKyAg
ICBjb25zdCB1bnNpZ25lZCBzaG9ydCogcDE2ZW5kID0gcDE2ICsgYnVmZmVyU2l6ZTsKKyAgICB3
aGlsZSAocDE2IDwgcDE2ZW5kKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgc2hvcnQqIHAxNmxp
bmVFbmQgPSBwMTYgKyB3aWR0aDsgcDE2IDwgcDE2bGluZUVuZDsgKQorICAgICAgICAgICAgKnAx
NisrID0gY29udmVydDMyVG8xNigqcDMyKyspOworCisgICAgICAgIGlmIChza2lwcykKKyAgICAg
ICAgICAgICpwMTYrKyA9IDA7CisgICAgfQorCisgICAgaWYgKG1faGJpdG1hcCkgeworICAgICAg
ICBEZWxldGVPYmplY3QobV9oYml0bWFwKTsKKyAgICAgICAgbV9oYml0bWFwID0gMDsKKyAgICB9
IGVsc2UKKyAgICAgICAgbV9waXhlbERhdGEuc3dhcChuZXdQaXhlbERhdGEpOworCisgICAgbV9w
aXhlbHMgPSBuZXdQaXhlbHM7CisgICAgbV9ibXBJbmZvID0gbmV3Qm1wSW5mbzsKKworICAgIHNl
dEhhc0FscGhhKGZhbHNlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTaGFyZWRCaXRt
YXA6OmZyZWVNZW1vcnkoKQoreworICAgIGlmIChtX2xvY2tlZCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgaWYgKG1faGJpdG1hcCkgeworICAgICAgICBEZWxldGVPYmplY3QobV9oYml0
bWFwKTsKKyAgICAgICAgbV9oYml0bWFwID0gMDsKKyAgICAgICAgbV9waXhlbHMgPSAwOworICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobV9waXhlbHMpIHsKKyAgICAgICAg
bV9waXhlbERhdGEuY2xlYXIoKTsKKyAgICAgICAgbV9waXhlbHMgPSAwOworICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0hCSVRNQVAgU2hhcmVk
Qml0bWFwOjpjcmVhdGVIYW5kbGUodm9pZCoqIHBpeGVscywgQml0bWFwSW5mbyogYm1wSW5mbywg
aW50IGhlaWdodCwgYm9vbCB1c2UxNmJpdCkgY29uc3QKK3sKKyAgICBpZiAoIW1fcGl4ZWxzKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChoZWlnaHQgPT0gLTEpCisgICAgICAgIGhlaWdo
dCA9IHRoaXMtPmhlaWdodCgpOworICAgICpibXBJbmZvID0gQml0bWFwSW5mbzo6Y3JlYXRlQm90
dG9tVXAoSW50U2l6ZSh3aWR0aCgpLCBoZWlnaHQpLCAodXNlMTZiaXQgfHwgaXMxNmJpdCgpKSA/
IEJpdG1hcEluZm86OkJpdENvdW50MTYgOiBCaXRtYXBJbmZvOjpCaXRDb3VudDMyKTsKKworICAg
IEhCSVRNQVAgaGJtcCA9IENyZWF0ZURJQlNlY3Rpb24oMCwgYm1wSW5mbywgRElCX1JHQl9DT0xP
UlMsIHBpeGVscywgMCwgMCk7CisKKyAgICBpZiAoIWhibXApCisgICAgICAgIHJldHVybiAwOwor
CisgICAgT3duUHRyPEhEQz4gYm1wREMoQ3JlYXRlQ29tcGF0aWJsZURDKDApKTsKKyAgICBIR0RJ
T0JKIGhPbGRCbXAgPSBTZWxlY3RPYmplY3QoYm1wREMuZ2V0KCksIGhibXApOworCisgICAgU3Ry
ZXRjaERJQml0cyhibXBEQy5nZXQoKSwgMCwgMCwgd2lkdGgoKSwgaGVpZ2h0LCAwLCAwLCB3aWR0
aCgpLCBoZWlnaHQsIG1fcGl4ZWxzLCAmbV9ibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgU1JDQ09Q
WSk7CisKKyAgICBTZWxlY3RPYmplY3QoYm1wREMuZ2V0KCksIGhPbGRCbXApOworCisgICAgcmV0
dXJuIGhibXA7Cit9CisKK2Jvb2wgU2hhcmVkQml0bWFwOjplbnN1cmVIYW5kbGUoKQoreworICAg
IGlmIChtX2hiaXRtYXApCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFtX3BpeGVs
cykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1fbG9ja2VkKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBCaXRtYXBJbmZvIGJtcEluZm87CisgICAgdm9pZCogcGl4ZWxz
OworICAgIG1faGJpdG1hcCA9IGNyZWF0ZUhhbmRsZSgmcGl4ZWxzLCAmYm1wSW5mbywgLTEsICFo
YXNBbHBoYSgpKTsKKworICAgIGlmICghbV9oYml0bWFwKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBtX3BpeGVsRGF0YS5jbGVhcigpOworICAgIG1fcGl4ZWxzID0gcGl4ZWxzOworICAg
IG1fYm1wSW5mbyA9IGJtcEluZm87CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTaGFy
ZWRCaXRtYXA6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBJbnRSZWN0JiBkc3RS
ZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwg
Q29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAg
ICAgICAgcmV0dXJuOworICAgIGN0eHQtPmRyYXdCaXRtYXAodGhpcywgZHN0UmVjdCwgc3JjUmVj
dCwgc3R5bGVDb2xvclNwYWNlLCBjb21wb3NpdGVPcCk7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFw
OjpkcmF3KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJlY3QmIHNy
Y1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGlmICghbV9waXhl
bHMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSB8fCBzcmNS
ZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSEJJVE1BUCBoYml0bWFwID0g
MDsKKyAgICBib29sIHVzaW5nSGFuZGxlID0gY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlU291cmNl
T3ZlciAmJiAoaGFzQWxwaGEoKSAmJiBoYXNBbHBoYUJsZW5kU3VwcG9ydCgpIHx8IHVzZXNUcmFu
c3BhcmVudENvbG9yKCkpOworCisgICAgaWYgKHVzaW5nSGFuZGxlKSB7CisgICAgICAgIGlmIChl
bnN1cmVIYW5kbGUoKSkKKyAgICAgICAgICAgIGhiaXRtYXAgPSBtX2hiaXRtYXA7CisgICAgICAg
IGVsc2UgeworICAgICAgICAgICAgdm9pZCogcGl4ZWxzOworICAgICAgICAgICAgQml0bWFwSW5m
byBibXBJbmZvOworICAgICAgICAgICAgaGJpdG1hcCA9IGNyZWF0ZUhhbmRsZSgmcGl4ZWxzLCAm
Ym1wSW5mbywgLTEsIHVzZXNUcmFuc3BhcmVudENvbG9yKCkpOworICAgICAgICB9CisgICAgfQor
ICAgIGlmICghaGJpdG1hcCkgeworICAgICAgICAvLyBGSVhNRTogaGFuZGxlIG90aGVyIGNvbXBv
c2l0ZSBvcGVyYXRpb24gdHlwZXM/CisgICAgICAgIERXT1JEIHJvcCA9IGNvbXBvc2l0ZU9wID09
IENvbXBvc2l0ZUNvcHkgPyBTUkNDT1BZCisgICAgICAgICAgICA6IGNvbXBvc2l0ZU9wID09IENv
bXBvc2l0ZVhPUiA/IFBBVElOVkVSVAorICAgICAgICAgICAgOiBjb21wb3NpdGVPcCA9PSBDb21w
b3NpdGVDbGVhciA/IFdISVRFTkVTUworICAgICAgICAgICAgOiBTUkNDT1BZOworCisgICAgICAg
IFN0cmV0Y2hESUJpdHMoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lk
dGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwKKyAgICAgICAgICAgIHNyY1JlY3QueCgpLCBzcmNSZWN0
LnkoKSwgc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgpLCBtX3BpeGVscywgJm1fYm1w
SW5mbywgRElCX1JHQl9DT0xPUlMsIHJvcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBPd25QdHI8SERDPiBobWVtZGMoQ3JlYXRlQ29tcGF0aWJsZURDKGhkYykpOworICAgIEhHRElP
QkogaE9sZEJtcCA9IFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCksIGhiaXRtYXApOworCisgICAg
aWYgKCF1c2VzVHJhbnNwYXJlbnRDb2xvcigpICYmIGhhc0FscGhhQmxlbmRTdXBwb3J0KCkpIHsK
KyAgICAgICAgc3RhdGljIGNvbnN0IEJMRU5ERlVOQ1RJT04gYmxlbmQgPSB7IEFDX1NSQ19PVkVS
LCAwLCAyNTUsIEFDX1NSQ19BTFBIQSB9OworICAgICAgICBib29sIHN1Y2Nlc3MgPSBhbHBoYUJs
ZW5kSWZTdXBwb3J0ZWQoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lk
dGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgaG1lbWRjLmdldCgpLAorICAgICAgICAgICAgc3JjUmVj
dC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksIGJs
ZW5kKTsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChzdWNjZXNzLCBzdWNjZXNzKTsKKyAgICB9IGVs
c2UKKyAgICAgICAgVHJhbnNwYXJlbnRCbHQoaGRjLCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCks
IGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwgaG1lbWRjLmdldCgpLAorICAgICAg
ICAgICAgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3Qu
aGVpZ2h0KCksIHRyYW5zcGFyZW50Q29sb3IoKSk7CisKKyAgICBTZWxlY3RPYmplY3QoaG1lbWRj
LmdldCgpLCBoT2xkQm1wKTsKKyAgICBpZiAoaGJpdG1hcCAhPSBtX2hiaXRtYXApCisgICAgICAg
IERlbGV0ZU9iamVjdChoYml0bWFwKTsKK30KKworSEJJVE1BUCBTaGFyZWRCaXRtYXA6OmNsaXBC
aXRtYXAoY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCB1c2VBbHBoYSwgQml0bWFwSW5mbyYgYm1w
SW5mbywgdm9pZComIHBpeGVscykKK3sKKyAgICBpZiAoIWJ5dGVzKCkpCisgICAgICAgIHJldHVy
biAwOworCisgICAgaW50IG9sZFdpZHRoID0gd2lkdGgoKTsKKyAgICBpbnQgb2xkSGVpZ2h0ID0g
aGVpZ2h0KCk7CisgICAgaW50IGNvcHlXaWR0aCA9IHN0ZDo6bWluPGludD4ocmVjdC53aWR0aCgp
LCBvbGRXaWR0aCAtIHJlY3QueCgpKTsKKyAgICBpbnQgY29weUhlaWdodCA9IHN0ZDo6bWluPGlu
dD4ocmVjdC5oZWlnaHQoKSwgb2xkSGVpZ2h0IC0gcmVjdC55KCkpOworICAgIGlmICghY29weVdp
ZHRoIHx8ICFjb3B5SGVpZ2h0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGJtcEluZm8gPSBC
aXRtYXBJbmZvOjpjcmVhdGVCb3R0b21VcChJbnRTaXplKGNvcHlXaWR0aCwgY29weUhlaWdodCks
ICh1c2VBbHBoYSAmJiBpczMyYml0KCkpID8gQml0bWFwSW5mbzo6Qml0Q291bnQzMiA6IEJpdG1h
cEluZm86OkJpdENvdW50MTYpOworICAgIEhCSVRNQVAgbmV3Qm1wID0gQ3JlYXRlRElCU2VjdGlv
bigwLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAsIDApOworCisgICAgaWYg
KCFuZXdCbXApCisgICAgICAgIHJldHVybiAwOworCisgICAgT3duUHRyPEhEQz4gZGNOZXcoQ3Jl
YXRlQ29tcGF0aWJsZURDKDApKTsKKyAgICBIR0RJT0JKIHRtcE5ldyA9IFNlbGVjdE9iamVjdChk
Y05ldy5nZXQoKSwgbmV3Qm1wKTsKKworICAgIFN0cmV0Y2hESUJpdHMoZGNOZXcuZ2V0KCksIDAs
IDAsIGNvcHlXaWR0aCwgY29weUhlaWdodCwgcmVjdC54KCksIHJlY3QueSgpLCBjb3B5V2lkdGgs
IGNvcHlIZWlnaHQsCisgICAgICAgIGJ5dGVzKCksICZiaXRtYXBJbmZvKCksIERJQl9SR0JfQ09M
T1JTLCBTUkNDT1BZKTsKKworICAgIFNlbGVjdE9iamVjdChkY05ldy5nZXQoKSwgdG1wTmV3KTsK
KyAgICByZXR1cm4gbmV3Qm1wOworfQorCitQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4gU2hhcmVk
Qml0bWFwOjpjbGlwQml0bWFwKGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgdXNlQWxwaGEpCit7
CisgICAgaW50IG9sZFdpZHRoID0gd2lkdGgoKTsKKyAgICBpbnQgb2xkSGVpZ2h0ID0gaGVpZ2h0
KCk7CisgICAgaW50IGNvcHlXaWR0aCA9IHN0ZDo6bWluPGludD4ocmVjdC53aWR0aCgpLCBvbGRX
aWR0aCAtIHJlY3QueCgpKTsKKyAgICBpbnQgY29weUhlaWdodCA9IHN0ZDo6bWluPGludD4ocmVj
dC5oZWlnaHQoKSwgb2xkSGVpZ2h0IC0gcmVjdC55KCkpOworICAgIGlmICghY29weVdpZHRoIHx8
ICFjb3B5SGVpZ2h0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJlZlB0cjxTaGFyZWRCaXRt
YXA+IG5ld0JtcCA9IGNyZWF0ZShJbnRTaXplKGNvcHlXaWR0aCwgY29weUhlaWdodCksIHVzZUFs
cGhhICYmIGlzMzJiaXQoKSA/IEJpdG1hcEluZm86OkJpdENvdW50MzIgOiBCaXRtYXBJbmZvOjpC
aXRDb3VudDE2LCBmYWxzZSk7CisKKyAgICBpZiAoIW5ld0JtcCB8fCAhbmV3Qm1wLT5ieXRlcygp
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIERDSG9sZGVyIGRjTmV3KG5ld0JtcC5nZXQoKSk7
CisKKyAgICBTdHJldGNoRElCaXRzKGRjTmV3LmdldCgpLCAwLCAwLCBjb3B5V2lkdGgsIGNvcHlI
ZWlnaHQsIHJlY3QueCgpLCByZWN0LnkoKSwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LAorICAgICAg
ICBieXRlcygpLCAmYml0bWFwSW5mbygpLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAg
ICByZXR1cm4gbmV3Qm1wOworfQorCitzdGF0aWMgdm9pZCBkcmF3UGF0dGVyblNpbXBsZShIREMg
aGRjLCBjb25zdCBSRUNUJiBkZXN0UmVjdCwgSEJJVE1BUCBoYm1wLCBjb25zdCBQT0lOVCYgcGhh
c2UpCit7CisgICAgSEJSVVNIIGhCcnVzaCA9IENyZWF0ZVBhdHRlcm5CcnVzaChoYm1wKTsKKyAg
ICBpZiAoIWhCcnVzaCkKKyAgICAgICAgcmV0dXJuOworCisgICAgUE9JTlQgb2xkT3JnOworICAg
IFNldEJydXNoT3JnRXgoaGRjLCBkZXN0UmVjdC5sZWZ0IC0gcGhhc2UueCwgZGVzdFJlY3QudG9w
IC0gcGhhc2UueSwgJm9sZE9yZyk7CisgICAgRmlsbFJlY3QoaGRjLCAmZGVzdFJlY3QsIGhCcnVz
aCk7CisgICAgRGVsZXRlT2JqZWN0KGhCcnVzaCk7CisgICAgU2V0QnJ1c2hPcmdFeChoZGMsIG9s
ZE9yZy54LCBvbGRPcmcueSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdQYXR0ZXJuU2ltcGxl
KEhEQyBoZGMsIGNvbnN0IFJFQ1QmIGRlc3RSZWN0LCBjb25zdCBTaGFyZWRCaXRtYXAqIGJtcCwg
Y29uc3QgU0laRSYgYm1wU2l6ZSwgY29uc3QgUE9JTlQmIHBoYXNlKQoreworICAgIGludCBkc3RZ
ID0gZGVzdFJlY3QudG9wOworICAgIGZvciAoaW50IHNvdXJjZVkgPSBwaGFzZS55OyBkc3RZIDwg
ZGVzdFJlY3QuYm90dG9tOyApIHsKKyAgICAgICAgaW50IHNvdXJjZUggPSBzdGQ6Om1pbjxpbnQ+
KGJtcFNpemUuY3kgLSBzb3VyY2VZLCBkZXN0UmVjdC5ib3R0b20gLSBkc3RZKTsKKyAgICAgICAg
aW50IGRzdFggPSBkZXN0UmVjdC5sZWZ0OworICAgICAgICBmb3IgKGludCBzb3VyY2VYID0gcGhh
c2UueDsgZHN0WCA8IGRlc3RSZWN0LnJpZ2h0OyApIHsKKyAgICAgICAgICAgIGludCBzb3VyY2VX
ID0gc3RkOjptaW48aW50PihibXBTaXplLmN4IC0gc291cmNlWCwgZGVzdFJlY3QucmlnaHQgLSBk
c3RYKTsKKworICAgICAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFgsIGRzdFksIHNvdXJj
ZVcsIHNvdXJjZUgsIHNvdXJjZVgsIHNvdXJjZVksIHNvdXJjZVcsIHNvdXJjZUgsCisgICAgICAg
ICAgICAgICAgYm1wLT5ieXRlcygpLCAmYm1wLT5iaXRtYXBJbmZvKCksIERJQl9SR0JfQ09MT1JT
LCBTUkNDT1BZKTsKKworICAgICAgICAgICAgZHN0WCArPSBzb3VyY2VXOworICAgICAgICAgICAg
c291cmNlWCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBkc3RZICs9IHNvdXJjZUg7CisgICAg
ICAgIHNvdXJjZVkgPSAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbm9ybWFsaXplUGhhc2Uo
TE9ORyYgcGhhc2UsIGludCBsaW1pdCkKK3sKKyAgICBpZiAoIXBoYXNlKQorICAgICAgICByZXR1
cm47CisgICAgaWYgKGxpbWl0IDwgMikgeworICAgICAgICBwaGFzZSA9IDA7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgaWYgKGxpbWl0ID09IDIpIHsKKyAgICAgICAgcGhhc2UgPSBwaGFz
ZSAmIDE7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBoYXNlIDwgMCkgeworICAg
ICAgICBwaGFzZSA9IC1waGFzZTsKKyAgICAgICAgaWYgKHBoYXNlID4gbGltaXQpCisgICAgICAg
ICAgICBwaGFzZSA9IHN0YXRpY19jYXN0PExPTkc+KHN0YXRpY19jYXN0PHVuc2lnbmVkPihwaGFz
ZSkgJSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obGltaXQpKTsKKyAgICAgICAgaWYgKHBoYXNlKQor
ICAgICAgICAgICAgcGhhc2UgPSBsaW1pdCAtIHBoYXNlOworICAgIH0gZWxzZSB7CisgICAgICAg
IGlmIChwaGFzZSA8IGxpbWl0KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBwaGFzZSA9
IHN0YXRpY19jYXN0PExPTkc+KHN0YXRpY19jYXN0PHVuc2lnbmVkPihwaGFzZSkgJSBzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4obGltaXQpKTsKKyAgICB9Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpk
cmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgdGlsZVJl
Y3RJbiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbG9yU3BhY2Ugc3R5bGVD
b2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVj
dCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpCit7CisgICAgaWYgKCFtX3BpeGVscykK
KyAgICAgICAgcmV0dXJuOworICAgIGN0eHQtPmRyYXdCaXRtYXBQYXR0ZXJuKHRoaXMsIHRpbGVS
ZWN0SW4sIHBhdHRlcm5UcmFuc2Zvcm0sIHBoYXNlLCBzdHlsZUNvbG9yU3BhY2UsIG9wLCBkZXN0
UmVjdCwgb3JpZ1NvdXJjZVNpemUpOworfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6ZHJhd1BhdHRl
cm4oSERDIGhkYywgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0sIGNvbnN0IEZsb2F0
UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3Jt
LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbG9y
U3BhY2Ugc3R5bGVDb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRS
ZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpCit7CisgICAgaWYg
KCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHRpbGVSZWN0SW4ud2lkdGgo
KSA8PSAwIHx8IHRpbGVSZWN0SW4uaGVpZ2h0KCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgYm9vbCB1c2VBbHBoYSA9IG9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgJiYgaGFzQWxwaGEo
KSAmJiBpczMyYml0KCk7CisKKyAgICBpbnQgYm1wV2lkdGggPSB3aWR0aCgpOworICAgIGludCBi
bXBIZWlnaHQgPSBoZWlnaHQoKTsKKworICAgIEZsb2F0UmVjdCB0aWxlUmVjdCh0aWxlUmVjdElu
KTsKKyAgICBpZiAoYm1wV2lkdGggIT0gb3JpZ1NvdXJjZVNpemUud2lkdGgoKSkgeworICAgICAg
ICBkb3VibGUgcmF0ZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4oYm1wV2lkdGgpIC8gb3JpZ1NvdXJj
ZVNpemUud2lkdGgoKTsKKyAgICAgICAgZG91YmxlIHRlbXAgPSB0aWxlUmVjdC53aWR0aCgpICog
cmF0ZTsKKyAgICAgICAgdGlsZVJlY3Quc2V0WCh0aWxlUmVjdC54KCkgKiByYXRlKTsKKyAgICAg
ICAgdGlsZVJlY3Quc2V0V2lkdGgodGVtcCk7CisgICAgICAgIHRlbXAgPSB0aWxlUmVjdC5oZWln
aHQoKSAqIHJhdGU7CisgICAgICAgIHRpbGVSZWN0LnNldFkodGlsZVJlY3QueSgpICogcmF0ZSk7
CisgICAgICAgIHRpbGVSZWN0LnNldEhlaWdodCh0ZW1wKTsKKyAgICB9CisKKyAgICBPd25QdHI8
SEJJVE1BUD4gY2xpcHBlZEJtcDsKKworICAgIGlmICh0aWxlUmVjdC54KCkgfHwgdGlsZVJlY3Qu
eSgpIHx8IHRpbGVSZWN0LndpZHRoKCkgIT0gYm1wV2lkdGggfHwgdGlsZVJlY3QuaGVpZ2h0KCkg
IT0gYm1wSGVpZ2h0KSB7CisgICAgICAgIEJpdG1hcEluZm8gcGF0dGVybkJtcEluZm87CisgICAg
ICAgIHZvaWQqIHBhdHRlcm5QaXhlbHM7CisgICAgICAgIGNsaXBwZWRCbXAuc2V0KGNsaXBCaXRt
YXAoSW50UmVjdCh0aWxlUmVjdCksIHVzZUFscGhhLCBwYXR0ZXJuQm1wSW5mbywgcGF0dGVyblBp
eGVscykpOworICAgICAgICBpZiAoIWNsaXBwZWRCbXApCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgYm1wV2lkdGggPSB0aWxlUmVjdC53aWR0aCgpOworICAgICAgICBibXBIZWlnaHQg
PSB0aWxlUmVjdC5oZWlnaHQoKTsKKyAgICB9CisKKyAgICBBZmZpbmVUcmFuc2Zvcm0gdGYgPSB0
cmFuc2Zvcm07CisgICAgdGYgKj0gcGF0dGVyblRyYW5zZm9ybTsKKworICAgIEZsb2F0UmVjdCB0
clJlY3QgPSB0Zi5tYXBSZWN0KGRlc3RSZWN0KTsKKworICAgIFJFQ1QgY2xpcEJveDsKKyAgICBp
bnQgY2xpcFR5cGUgPSBHZXRDbGlwQm94KGhkYywgJmNsaXBCb3gpOworICAgIGlmIChjbGlwVHlw
ZSA9PSBTSU1QTEVSRUdJT04pCisgICAgICAgIHRyUmVjdC5pbnRlcnNlY3QoRmxvYXRSZWN0KGNs
aXBCb3gubGVmdCwgY2xpcEJveC50b3AsIGNsaXBCb3gucmlnaHQgLSBjbGlwQm94LmxlZnQsIGNs
aXBCb3guYm90dG9tIC0gY2xpcEJveC50b3ApKTsKKyAgICBlbHNlIGlmIChjbGlwVHlwZSA9PSBD
T01QTEVYUkVHSU9OKSB7CisgICAgICAgIE93blB0cjxIUkdOPiBjbGlwUmduKENyZWF0ZVJlY3RS
Z24oMCwgMCwgMCwgMCkpOworICAgICAgICBpZiAoR2V0Q2xpcFJnbihoZGMsIGNsaXBSZ24uZ2V0
KCkpID4gMCkgeworICAgICAgICAgICAgRFdPUkQgcmVnaW9uRGF0YVNpemUgPSBHZXRSZWdpb25E
YXRhKGNsaXBSZ24uZ2V0KCksIHNpemVvZihSR05EQVRBKSwgMCk7CisgICAgICAgICAgICBpZiAo
cmVnaW9uRGF0YVNpemUpIHsKKyAgICAgICAgICAgICAgICBWZWN0b3I8UkdOREFUQT4gcmVnaW9u
RGF0YShyZWdpb25EYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgR2V0UmVnaW9uRGF0YShjbGlw
UmduLmdldCgpLCByZWdpb25EYXRhU2l6ZSwgcmVnaW9uRGF0YS5kYXRhKCkpOworICAgICAgICAg
ICAgICAgIFJFQ1QqIHJlY3QgPSByZWludGVycHJldF9jYXN0PFJFQ1QqPihyZWdpb25EYXRhWzBd
LkJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZm9yIChEV09SRCBpID0gMDsgaSA8IHJlZ2lvbkRh
dGFbMF0ucmRoLm5Db3VudDsgKytpLCArK3JlY3QpCisgICAgICAgICAgICAgICAgICAgIHRyUmVj
dC5pbnRlcnNlY3QoRmxvYXRSZWN0KHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQg
LSByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSByZWN0LT50b3ApKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0clJlY3Qud2lkdGgoKSA8PSAwIHx8IHRyUmVj
dC5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICB0clJlY3QuaW5mbGF0ZSgx
KTsKKyAgICBJbnRSZWN0IHZpc2libGVEc3RSZWN0ID0gZW5jbG9zaW5nSW50UmVjdCh0Zi5pbnZl
cnNlKCkubWFwUmVjdCh0clJlY3QpKTsKKyAgICB2aXNpYmxlRHN0UmVjdC5pbnRlcnNlY3QoSW50
UmVjdChkZXN0UmVjdCkpOworCisgICAgaWYgKHZpc2libGVEc3RSZWN0LndpZHRoKCkgPD0gMCB8
fCB2aXNpYmxlRHN0UmVjdC5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICB0
clJlY3QgPSB0Zi5tYXBSZWN0KHZpc2libGVEc3RSZWN0KTsKKyAgICBSRUNUIGRzdFJlY3RXaW4g
PQorICAgIHsKKyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0LngoKSksCisgICAgICAgIHN0YWJs
ZVJvdW5kKHRyUmVjdC55KCkpLAorICAgICAgICBzdGFibGVSb3VuZCh0clJlY3QucmlnaHQoKSks
CisgICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC5ib3R0b20oKSksCisgICAgfTsKKyAgICBpZiAo
ZHN0UmVjdFdpbi5yaWdodCA8PSBkc3RSZWN0V2luLmxlZnQgfHwgZHN0UmVjdFdpbi5ib3R0b20g
PD0gZHN0UmVjdFdpbi50b3ApCisgICAgICAgIHJldHVybjsKKworICAgIFNJWkUgYm1wU2l6ZSA9
IHsgYm1wV2lkdGgsIGJtcEhlaWdodCB9OworCisgICAgLy8gUmVsYXRpdmUgdG8gZGVzdGluYXRp
b24sIGluIGJpdG1hcCBwaXhlbHMKKyAgICBQT0lOVCBwaGFzZVdpbiA9IHsgc3RhYmxlUm91bmQo
dmlzaWJsZURzdFJlY3QueCgpIC0gcGhhc2UueCgpKSwgc3RhYmxlUm91bmQodmlzaWJsZURzdFJl
Y3QueSgpIC0gcGhhc2UueSgpKSB9OworICAgIG5vcm1hbGl6ZVBoYXNlKHBoYXNlV2luLngsIGJt
cFNpemUuY3gpOworICAgIG5vcm1hbGl6ZVBoYXNlKHBoYXNlV2luLnksIGJtcFNpemUuY3kpOwor
CisgICAgUkVDVCBzcmNSZWN0V2luID0geworICAgICAgICAwLAorICAgICAgICAwLAorICAgICAg
ICBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC5yaWdodCgpKSAtIHN0YWJsZVJvdW5kKHZpc2li
bGVEc3RSZWN0LngoKSksCisgICAgICAgIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LmJvdHRv
bSgpKSAtIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LnkoKSkKKyAgICB9OworICAgIGlmIChz
cmNSZWN0V2luLnJpZ2h0IDw9IDAgfHwgc3JjUmVjdFdpbi5ib3R0b20gPD0gMCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgQml0bWFwSW5mbyBibXBJbmZvID0gQml0bWFwSW5mbzo6Y3JlYXRlQm90
dG9tVXAoSW50U2l6ZShzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSksIHVzZUFs
cGhhID8gQml0bWFwSW5mbzo6Qml0Q291bnQzMiA6IEJpdG1hcEluZm86OkJpdENvdW50MTYpOwor
ICAgIHZvaWQqIHBpeGVsczsKKyAgICBPd25QdHI8SEJJVE1BUD4gaGJtcFRlbXAoQ3JlYXRlRElC
U2VjdGlvbigwLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAsIDApKTsKKwor
ICAgIGlmICghaGJtcFRlbXApCisgICAgICAgIHJldHVybjsKKworICAgIE93blB0cjxIREM+IGht
ZW1kYyhDcmVhdGVDb21wYXRpYmxlREMoaGRjKSk7CisgICAgSEdESU9CSiBvbGRCbXAgPSBTZWxl
Y3RPYmplY3QoaG1lbWRjLmdldCgpLCBoYm1wVGVtcC5nZXQoKSk7CisgICAgaWYgKGNsaXBwZWRC
bXApCisgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwgc3JjUmVjdFdpbiwg
Y2xpcHBlZEJtcC5nZXQoKSwgcGhhc2VXaW4pOworICAgIGVsc2UgaWYgKChvcCAhPSBDb21wb3Np
dGVTb3VyY2VPdmVyIHx8IGNhblVzZURJQml0cygpKSAmJiBzcmNSZWN0V2luLnJpZ2h0IDw9IGJt
cFNpemUuY3ggKiAyICYmIHNyY1JlY3RXaW4uYm90dG9tIDw9IGJtcFNpemUuY3kgKiAyKQorICAg
ICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1JlY3RXaW4sIHRoaXMsIGJt
cFNpemUsIHBoYXNlV2luKTsKKyAgICBlbHNlIGlmIChlbnN1cmVIYW5kbGUoKSkKKyAgICAgICAg
ZHJhd1BhdHRlcm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNSZWN0V2luLCBnZXRIYW5kbGUoKSwg
cGhhc2VXaW4pOworICAgIGVsc2UgeworICAgICAgICB2b2lkKiBwaXhlbHM7CisgICAgICAgIEJp
dG1hcEluZm8gYm1wSW5mbzsKKyAgICAgICAgaWYgKEhCSVRNQVAgaGJtcCA9IGNyZWF0ZUhhbmRs
ZSgmcGl4ZWxzLCAmYm1wSW5mbywgLTEsIGZhbHNlKSkgeworICAgICAgICAgICAgZHJhd1BhdHRl
cm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNSZWN0V2luLCBoYm1wLCBwaGFzZVdpbik7CisgICAg
ICAgICAgICBEZWxldGVPYmplY3QoaGJtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICBTZWxlY3RPYmplY3QoaG1lbWRjLmdldCgpLCBvbGRCbXApOworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHVzZUFscGhhICYmIGhhc0FscGhhQmxlbmRT
dXBwb3J0KCkpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IEJMRU5ERlVOQ1RJT04gYmxlbmQgPSB7
IEFDX1NSQ19PVkVSLCAwLCAyNTUsIEFDX1NSQ19BTFBIQSB9OworICAgICAgICBib29sIHN1Y2Nl
c3MgPSBhbHBoYUJsZW5kSWZTdXBwb3J0ZWQoaGRjLCBkc3RSZWN0V2luLmxlZnQsIGRzdFJlY3RX
aW4udG9wLCBkc3RSZWN0V2luLnJpZ2h0IC0gZHN0UmVjdFdpbi5sZWZ0LCBkc3RSZWN0V2luLmJv
dHRvbSAtIGRzdFJlY3RXaW4udG9wLAorICAgICAgICAgICAgaG1lbWRjLmdldCgpLCAwLCAwLCBz
cmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSwgYmxlbmQpOworICAgICAgICBBU1NF
UlRfVU5VU0VEKHN1Y2Nlc3MsIHN1Y2Nlc3MpOworICAgIH0gZWxzZSBpZiAodXNlQWxwaGEgJiYg
IWhhc0FscGhhQmxlbmRTdXBwb3J0KCkgfHwgb3AgPT0gQ29tcG9zaXRlU291cmNlT3ZlciAmJiB1
c2VzVHJhbnNwYXJlbnRDb2xvcigpKQorICAgICAgICBUcmFuc3BhcmVudEJsdChoZGMsIGRzdFJl
Y3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RSZWN0V2lu
LmxlZnQsCisgICAgICAgICAgICBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9wLCBo
bWVtZGMuZ2V0KCksIDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tLCB0
cmFuc3BhcmVudENvbG9yKCkpOworICAgIGVsc2UgeworICAgICAgICBEV09SRCBibXBPcCA9IG9w
ID09IENvbXBvc2l0ZUNvcHkgPyBTUkNDT1BZCisgICAgICAgICAgICAgICAgICAgIDogb3AgPT0g
Q29tcG9zaXRlU291cmNlT3ZlciA/IFNSQ0NPUFkKKyAgICAgICAgICAgICAgICAgICAgOiBvcCA9
PSBDb21wb3NpdGVYT1IgPyBQQVRJTlZFUlQKKyAgICAgICAgICAgICAgICAgICAgOiBvcCA9PSBD
b21wb3NpdGVDbGVhciA/IFdISVRFTkVTUworICAgICAgICAgICAgICAgICAgICA6IFNSQ0NPUFk7
IC8vIEZJWEVNRTogb3RoZXIgdHlwZXM/CisKKyAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRz
dFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RSZWN0
V2luLmxlZnQsCisgICAgICAgICAgICBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4udG9w
LCAwLCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSwKKyAgICAgICAgICAg
IHBpeGVscywgJmJtcEluZm8sIERJQl9SR0JfQ09MT1JTLCBibXBPcCk7CisgICAgfQorICAgIFNl
bGVjdE9iamVjdChobWVtZGMuZ2V0KCksIG9sZEJtcCk7Cit9CisKK1NoYXJlZEJpdG1hcDo6RENQ
cm92aWRlciogU2hhcmVkQml0bWFwOjpzX2RjUHJvdmlkZXIgPSBuZXcgU2hhcmVkQml0bWFwOjpE
Q1Byb3ZpZGVyOworCitIREMgU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyOjpnZXREQyhTaGFyZWRC
aXRtYXAqIGJtcCwgdW5zaWduZWQqIGtleTEpCit7CisgICAgaWYgKCFibXAgfHwgIWJtcC0+ZW5z
dXJlSGFuZGxlKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgSERDIGhkYyA9IENyZWF0ZUNv
bXBhdGlibGVEQygwKTsKKyAgICBpZiAoIWhkYykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAq
a2V5MSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQ+KFNlbGVjdE9iamVjdChoZGMsIGJtcC0+
Z2V0SGFuZGxlKCkpKTsKKyAgICBSRUNUIHJlY3QgPSB7IDAsIDAsIGJtcC0+d2lkdGgoKSwgYm1w
LT5oZWlnaHQoKSB9OworICAgIE93blB0cjxIUkdOPiBjbGlwUmduKENyZWF0ZVJlY3RSZ25JbmRp
cmVjdCgmcmVjdCkpOworICAgIFNlbGVjdENsaXBSZ24oaGRjLCBjbGlwUmduLmdldCgpKTsKKwor
ICAgIHJldHVybiBoZGM7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyOjpyZWxl
YXNlREMoU2hhcmVkQml0bWFwKiwgSERDIGhkYywgdW5zaWduZWQga2V5MSkKK3sKKyAgICBpZiAo
IWhkYykKKyAgICAgICAgcmV0dXJuOworCisgICAgU2VsZWN0T2JqZWN0KGhkYywgcmVpbnRlcnBy
ZXRfY2FzdDxIR0RJT0JKPihrZXkxKSk7CisgICAgRGVsZXRlREMoaGRjKTsKK30KKwordm9pZCBT
aGFyZWRCaXRtYXA6OmNsZWFyUGl4ZWxzKGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYg
KCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBibXBSZWN0KDAsIDAs
IHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBibXBSZWN0LmludGVyc2VjdChyZWN0KTsKKyAgICBp
ZiAoaXMxNmJpdCgpKSB7CisgICAgICAgIHVuc2lnbmVkIHcgPSBtX2JtcEluZm8ucGFkZGVkV2lk
dGgoKTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQqIGRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5z
aWduZWQgc2hvcnQqPihtX3BpeGVscyk7CisgICAgICAgIGRzdCArPSBibXBSZWN0LnkoKSAqIHcg
KyBibXBSZWN0LngoKTsKKyAgICAgICAgaW50IHdvcmRzVG9TZXQgPSBibXBSZWN0LndpZHRoKCk7
CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBkc3RFbmQgPSBkc3QgKyBibXBSZWN0Lmhl
aWdodCgpICogdzsKKyAgICAgICAgd2hpbGUgKGRzdCA8IGRzdEVuZCkgeworICAgICAgICAgICAg
d21lbXNldChyZWludGVycHJldF9jYXN0PHdjaGFyX3QqPihkc3QpLCAwLCB3b3Jkc1RvU2V0KTsK
KyAgICAgICAgICAgIGRzdCArPSB3OworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICB1bnNpZ25lZCB3ID0gd2lkdGgoKTsKKyAgICB1bnNpZ25lZCogZHN0ID0gcmVpbnRl
cnByZXRfY2FzdDx1bnNpZ25lZCo+KG1fcGl4ZWxzKTsKKyAgICBkc3QgKz0gYm1wUmVjdC55KCkg
KiB3ICsgYm1wUmVjdC54KCk7CisgICAgaW50IHdvcmRzVG9TZXQgPSBibXBSZWN0LndpZHRoKCkg
KiAyOworICAgIGNvbnN0IHVuc2lnbmVkKiBkc3RFbmQgPSBkc3QgKyBibXBSZWN0LmhlaWdodCgp
ICogdzsKKyAgICB3aGlsZSAoZHN0IDwgZHN0RW5kKSB7CisgICAgICAgIHdtZW1zZXQocmVpbnRl
cnByZXRfY2FzdDx3Y2hhcl90Kj4oZHN0KSwgMCwgd29yZHNUb1NldCk7CisgICAgICAgIGRzdCAr
PSB3OworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQoNClByb3BlcnR5IGNoYW5n
ZXMgb246IFdlYkNvcmVccGxhdGZvcm1cZ3JhcGhpY3Ncd2luY2VcU2hhcmVkQml0bWFwLmNwcA0K
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fXw0KQWRkZWQ6IHN2bjplb2wtc3R5bGUNCiAgICsgbmF0aXZlDQoNCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oDQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
DQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFw
LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogIENvcHlyaWdodCAoQykg
MjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogIENv
cHlyaWdodCAoQykgMjAxMCBQYXRyaWNrIEdhbnN0ZXJlciA8cGFyb2dhQHBhcm9nYS5jb20+Cisg
KgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICovCisKKyNpZm5kZWYgU2hhcmVkQml0bWFwX2gKKyNkZWZpbmUgU2hhcmVkQml0bWFwX2gK
KworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkJpdG1hcEluZm8uaCIK
KyNpbmNsdWRlICJDb2xvclNwYWNlLmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNp
bmNsdWRlIDx3dGYvT3duQXJyYXlQdHIuaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgor
I2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3aW5nZGkuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitlbnVtIENvbXBvc2l0ZU9wZXJhdG9yOworY2xhc3MgRmxvYXRQb2ludDsK
K2NsYXNzIEZsb2F0UmVjdDsKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIEludFJlY3Q7
CitjbGFzcyBJbnRTaXplOworY2xhc3MgVHJhbnNmb3JtYXRpb25NYXRyaXg7CisKK2NsYXNzIFNo
YXJlZEJpdG1hcDogcHVibGljIFJlZkNvdW50ZWQ8U2hhcmVkQml0bWFwPiB7CitwdWJsaWM6Cisg
ICAgflNoYXJlZEJpdG1hcCgpOworICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4g
Y3JlYXRlKGNvbnN0IEludFNpemUmLCBCaXRtYXBJbmZvOjpCaXRDb3VudCA9IEJpdG1hcEluZm86
OkJpdENvdW50MzIsIGJvb2wgaW5pdFBpeGVscyA9IHRydWUpOworICAgIHN0YXRpYyBQYXNzUmVm
UHRyPFNoYXJlZEJpdG1hcD4gY3JlYXRlKGNvbnN0IFZlY3Rvcjx1bnNpZ25lZD4mLCBjb25zdCBJ
bnRTaXplJiwgYm9vbCBoYXNBbHBoYSA9IHRydWUpOworCisgICAgY29uc3QgQml0bWFwSW5mbyYg
Yml0bWFwSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mbzsgfQorICAgIHZvaWQqIGJ5dGVz
KCkgeyByZXR1cm4gbV9waXhlbHM7IH0KKyAgICBjb25zdCB2b2lkKiBieXRlcygpIGNvbnN0IHsg
cmV0dXJuIG1fcGl4ZWxzOyB9CisgICAgdW5zaWduZWQgd2lkdGgoKSBjb25zdCB7IHJldHVybiBt
X2JtcEluZm8ud2lkdGgoKTsgfQorICAgIHVuc2lnbmVkIGhlaWdodCgpIGNvbnN0IHsgcmV0dXJu
IG1fYm1wSW5mby5oZWlnaHQoKTsgfQorICAgIHVuc2lnbmVkIHZhbGlkSGVpZ2h0KCkgY29uc3Qg
eyByZXR1cm4gbV92YWxpZEhlaWdodDsgfQorICAgIHZvaWQgc2V0VmFsaWRIZWlnaHQodW5zaWdu
ZWQgdmFsaWRIZWlnaHQpIHsgbV92YWxpZEhlaWdodCA9IHZhbGlkSGVpZ2h0OyB9CisgICAgdm9p
ZCByZXNldFBpeGVscyhib29sIGJsYWNrID0gZmFsc2UpOworICAgIHZvaWQgY2xlYXJQaXhlbHMo
Y29uc3QgSW50UmVjdCYgcik7CisgICAgYm9vbCBsb2NrZWQoKSBjb25zdCB7IHJldHVybiBtX2xv
Y2tlZDsgfQorICAgIHZvaWQgbG9jaygpIHsgbV9sb2NrZWQgPSB0cnVlOyB9CisgICAgdm9pZCB1
bmxvY2soKSB7IG1fbG9ja2VkID0gZmFsc2U7IH0KKyAgICBib29sIGZyZWVNZW1vcnkoKTsKKyAg
ICBib29sIGlzMTZiaXQoKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8uaXMxNmJpdCgpOyB9Cisg
ICAgYm9vbCBpczMyYml0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmlzMzJiaXQoKTsgfQor
ICAgIGJvb2wgdG8xNmJpdCgpOworICAgIGJvb2wgaGFzQWxwaGEoKSBjb25zdCB7IHJldHVybiBt
X2hhc0FscGhhOyB9CisgICAgdm9pZCBzZXRIYXNBbHBoYShib29sIGFscGhhKSB7IG1faGFzQWxw
aGEgPSBhbHBoYTsgfQorICAgIGJvb2wgZW5zdXJlSGFuZGxlKCk7CisgICAgSEJJVE1BUCBnZXRI
YW5kbGUoKSB7IHJldHVybiBtX2hiaXRtYXA7IH0KKyAgICBIQklUTUFQIGNyZWF0ZUhhbmRsZSh2
b2lkKiogcGl4ZWxzLCBCaXRtYXBJbmZvKiBibXBJbmZvLCBpbnQgaCA9IC0xLCBib29sIHVzZTE2
Yml0ID0gdHJ1ZSkgY29uc3Q7CisgICAgYm9vbCB1c2VzVHJhbnNwYXJlbnRDb2xvcigpIGNvbnN0
IHsgcmV0dXJuIG1fdXNlc1RyYW5zcGFyZW50Q29sb3I7IH0KKyAgICBDT0xPUlJFRiB0cmFuc3Bh
cmVudENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV90cmFuc3BhcmVudENvbG9yOyB9CisgICAgdm9p
ZCBzZXRUcmFuc3BhcmVudENvbG9yKENPTE9SUkVGIGMpCisgICAgeworICAgICAgICBtX3VzZXNU
cmFuc3BhcmVudENvbG9yID0gdHJ1ZTsKKyAgICAgICAgbV90cmFuc3BhcmVudENvbG9yID0gYzsK
KyAgICB9CisgICAgYm9vbCBjYW5Vc2VESUJpdHMoKSBjb25zdCB7IHJldHVybiAhaGFzQWxwaGEo
KSAmJiAhdXNlc1RyYW5zcGFyZW50Q29sb3IoKTsgfQorCisgICAgSEJJVE1BUCBjbGlwQml0bWFw
KGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgdXNlQWxwaGEsIEJpdG1hcEluZm8mIGJtcEluZm8s
IHZvaWQqJiBwaXhlbHMpOworCisgICAgUGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IGNsaXBCaXRt
YXAoY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCB1c2VBbHBoYSk7CisKKyAgICB2b2lkIGRyYXco
R3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRS
ZWN0JiBzcmNSZWN0LCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0
b3IgY29tcG9zaXRlT3ApOworICAgIHZvaWQgZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiBj
dHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYg
cGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYg
cGhhc2UsIENvbG9yU3BhY2Ugc3R5bGVDb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwg
Y29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUp
OworICAgIHZvaWQgZHJhdyhIREMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJl
Y3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKTsKKyAgICB2b2lkIGRy
YXdQYXR0ZXJuKEhEQywgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgY29uc3QgRmxvYXRSZWN0JiB0
aWxlUmVjdEluLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb2xvclNwYWNlIHN0eWxl
Q29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJl
Y3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKTsKKworICAgIGNsYXNzIERDUHJvdmlk
ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCBIREMgZ2V0REMoU2hhcmVkQml0bWFw
KiwgdW5zaWduZWQqKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VEQyhTaGFyZWRCaXRt
YXAqLCBIREMsIHVuc2lnbmVkKTsKKyAgICB9OworCisgICAgc3RhdGljIERDUHJvdmlkZXIqIHNf
ZGNQcm92aWRlcjsKKworICAgIEhEQyBnZXREQyh1bnNpZ25lZCoga2V5MSkgeyByZXR1cm4gc19k
Y1Byb3ZpZGVyLT5nZXREQyh0aGlzLCBrZXkxKTsgfQorICAgIHZvaWQgcmVsZWFzZURDKEhEQyBo
ZGMsIHVuc2lnbmVkIGtleTEpIHsgc19kY1Byb3ZpZGVyLT5yZWxlYXNlREModGhpcywgaGRjLCBr
ZXkxKTsgfQorCisgICAgY2xhc3MgRENIb2xkZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgRENI
b2xkZXIoU2hhcmVkQml0bWFwKiBibXAgPSAwKSB7IHNldEludGVybmFsKGJtcCk7IH0KKyAgICAg
ICAgfkRDSG9sZGVyKCkgeyBjbGVhckludGVybmFsKCk7IH0KKyAgICAgICAgdm9pZCBzZXQoU2hh
cmVkQml0bWFwKiBibXAgPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBjbGVhckludGVybmFs
KCk7CisgICAgICAgICAgICBzZXRJbnRlcm5hbChibXApOworICAgICAgICB9CisgICAgICAgIEhE
QyBnZXQoKSBjb25zdCB7IHJldHVybiBtX2hkYzsgfQorICAgIHByaXZhdGU6CisgICAgICAgIERD
SG9sZGVyJiBvcGVyYXRvcj0oY29uc3QgRENIb2xkZXImKTsKKyAgICAgICAgRENIb2xkZXIoY29u
c3QgRENIb2xkZXImKTsKKyAgICAgICAgdm9pZCBjbGVhckludGVybmFsKCkKKyAgICAgICAgewor
ICAgICAgICAgICAgaWYgKG1faGRjKQorICAgICAgICAgICAgICAgIG1fYml0bWFwLT5yZWxlYXNl
REMobV9oZGMsIG1fa2V5MSk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRJbnRlcm5hbChT
aGFyZWRCaXRtYXAqIGJtcCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9iaXRtYXAgPSBibXA7
CisgICAgICAgICAgICBtX2hkYyA9IGJtcCA/IGJtcC0+Z2V0REMoJm1fa2V5MSkgOiAwOworICAg
ICAgICB9CisgICAgICAgIFNoYXJlZEJpdG1hcCogbV9iaXRtYXA7CisgICAgICAgIEhEQyBtX2hk
YzsKKyAgICAgICAgdW5zaWduZWQgbV9rZXkxOworICAgIH07CisKK3ByaXZhdGU6CisgICAgU2hh
cmVkQml0bWFwKGNvbnN0IEludFNpemUmLCBCaXRtYXBJbmZvOjpCaXRDb3VudCwgYm9vbCBpbml0
UGl4ZWxzKTsKKyAgICBCaXRtYXBJbmZvIG1fYm1wSW5mbzsKKyAgICBIQklUTUFQIG1faGJpdG1h
cDsKKyAgICB2b2lkKiBtX3BpeGVsczsKKyAgICBPd25BcnJheVB0cjx1bnNpZ25lZD4gbV9waXhl
bERhdGE7CisgICAgQ09MT1JSRUYgbV90cmFuc3BhcmVudENvbG9yOworICAgIGludCBtX3ZhbGlk
SGVpZ2h0OworICAgIGJvb2wgbV9sb2NrZWQ7CisgICAgYm9vbCBtX3VzZXNUcmFuc3BhcmVudENv
bG9yOworICAgIGJvb2wgbV9oYXNBbHBoYTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
KworI2VuZGlmIC8vIFNoYXJlZEJpdG1hcF9oCg0KUHJvcGVydHkgY2hhbmdlcyBvbjogV2ViQ29y
ZVxwbGF0Zm9ybVxncmFwaGljc1x3aW5jZVxTaGFyZWRCaXRtYXAuaA0KX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KQWRk
ZWQ6IHN2bjplb2wtc3R5bGUNCiAgICsgbmF0aXZlDQoNCg==
</data>
<flag name="review"
          id="62884"
          type_id="1"
          status="-"
          setter="aroben"
    />
    <flag name="commit-queue"
          id="62885"
          type_id="3"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72813</attachid>
            <date>2010-11-03 05:26:35 -0700</date>
            <delta_ts>2010-11-03 07:07:10 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-28272c.patch</filename>
            <type>text/plain</type>
            <size>29149</size>
            <attacher name="Patrick R. Gansterer">paroga</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZDMwY2E3Yy4uNTY1ZGJmOSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MyBAQAorMjAxMC0xMS0wMSAgUGF0cmljayBHYW5z
dGVyZXIgIDxwYXJvZ2FAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBbV0lOQ0VdIEFkZCBTaGFyZWRCaXRtYXAKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI4MjcyCisKKyAgICAgICAgU2hh
cmVkQml0bWFwIGlzIGEgaGVscGVyIGNsYXNzIHVzZWQgYXMgTmF0aXZlSW1hZ2VQdHIgZm9yIFdp
bkNFLgorICAgICAgICBJdCdzIHdpZGUgdXNlZCBieSBXaW5DRSBncmFwaGljcyBmaWxlcyBhcyBh
IHJlcGxhY2VtZW50IG9mIEhCSVRNQVAuCisKKyAgICAgICAgT3JpZ2luYWxseSB3cml0dGVuIGJ5
IFlvbmcgTGkgPHlvbmcubGlAdG9yY2htb2JpbGUuY29tPi4KKworICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6U2hhcmVkQml0bWFwOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFw
OjpTaGFyZWRCaXRtYXApOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjp+U2hhcmVk
Qml0bWFwKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6cmVzZXRQaXhlbHMpOgor
ICAgICAgICAoV2ViQ29yZTo6Y29udmVydDMyVG8xNik6CisgICAgICAgIChXZWJDb3JlOjpTaGFy
ZWRCaXRtYXA6OnRvMTZiaXQpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpmcmVl
TWVtb3J5KToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6Y3JlYXRlSGFuZGxlKToK
KyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6ZW5zdXJlSGFuZGxlKToKKyAgICAgICAg
KFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6ZHJhdyk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRC
aXRtYXA6OmNsaXBCaXRtYXApOgorICAgICAgICAoV2ViQ29yZTo6ZHJhd1BhdHRlcm5TaW1wbGUp
OgorICAgICAgICAoV2ViQ29yZTo6bm9ybWFsaXplUGhhc2UpOgorICAgICAgICAoV2ViQ29yZTo6
U2hhcmVkQml0bWFwOjpkcmF3UGF0dGVybik6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRt
YXA6OkRDUHJvdmlkZXI6OmdldERDKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6
RENQcm92aWRlcjo6cmVsZWFzZURDKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6
Y2xlYXJQaXhlbHMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJp
dG1hcC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkRDUHJvdmlkZXI6OmdldERDKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRDUHJvdmlkZXI6OnJlbGVhc2VEQyk6CisgICAgICAgIChXZWJDb3Jl
OjpEQ1Byb3ZpZGVyOjpEQ0hvbGRlcjo6RENIb2xkZXIpOgorICAgICAgICAoV2ViQ29yZTo6RENQ
cm92aWRlcjo6RENIb2xkZXI6On5EQ0hvbGRlcik6CisgICAgICAgIChXZWJDb3JlOjpEQ1Byb3Zp
ZGVyOjpEQ0hvbGRlcjo6c2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkRDUHJvdmlkZXI6OkRDSG9s
ZGVyOjpnZXQpOgorICAgICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6RENIb2xkZXI6OmNsZWFy
SW50ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6RENIb2xkZXI6OnNldElu
dGVybmFsKToKKwogMjAxMC0xMS0wMyAgWm9sdGFuIEhlcmN6ZWcgIDx6aGVyY3plZ0B3ZWJraXQu
b3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERpcmsgU2NodWx6ZS4KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi42MTQxOTAyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCkBAIC0wLDAgKzEsNjE1IEBA
CisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogIENvcHlyaWdodCAoQykgMjAxMCBQYXRyaWNrIEdhbnN0ZXJl
ciA8cGFyb2dhQHBhcm9nYS5jb20+CisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJTaGFyZWRCaXRtYXAuaCIKKworI2luY2x1ZGUgIkdESUV4dHJhcy5oIgorI2luY2x1
ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzVHlwZXMuaCIKKyNpbmNs
dWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgIldpbmNlR3JhcGhpY3NFeHRy
YXMuaCIKKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVk
TGVha0NvdW50ZXIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093bkFycmF5UHRyLmg+CisjaW5jbHVk
ZSA8d3RmL093blB0ci5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKKyNpZm5kZWYgTkRFQlVHCitzdGF0aWMgV1RGOjpSZWZDb3VudGVkTGVha0NvdW50
ZXIgc2hhcmVkQml0bWFwTGVha0NvdW50ZXIoIlNoYXJlZEJpdG1hcCIpOworI2VuZGlmCisKKwor
UGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJlZEJpdG1hcDo6Y3JlYXRlKGNvbnN0IEludFNp
emUmIHNpemUsIEJpdG1hcEluZm86OkJpdENvdW50IGJpdENvdW50LCBib29sIGluaXRQaXhlbHMp
Cit7CisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gcmVzdWx0YW50Qml0bWFwID0gYWRvcHRSZWYo
bmV3IFNoYXJlZEJpdG1hcChzaXplLCBiaXRDb3VudCwgaW5pdFBpeGVscykpOworICAgIGlmIChy
ZXN1bHRhbnRCaXRtYXAgJiYgIXJlc3VsdGFudEJpdG1hcC0+Ynl0ZXMoKSkKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgcmV0dXJuIHJlc3VsdGFudEJpdG1hcC5yZWxlYXNlKCk7Cit9CisKK1Bhc3NS
ZWZQdHI8U2hhcmVkQml0bWFwPiBTaGFyZWRCaXRtYXA6OmNyZWF0ZShjb25zdCBWZWN0b3I8dW5z
aWduZWQ+JiBkYXRhLCBjb25zdCBJbnRTaXplJiBzaXplLCBib29sIGhhc0FscGhhKQoreworICAg
IFJlZlB0cjxTaGFyZWRCaXRtYXA+IHJlc3VsdCA9IGNyZWF0ZShzaXplLCBCaXRtYXBJbmZvOjpC
aXRDb3VudDMyLCBmYWxzZSk7CisgICAgaWYgKHJlc3VsdCkgeworICAgICAgICBtZW1jcHkocmVz
dWx0LT5ieXRlcygpLCBkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkgKiBzaXplb2YodW5zaWduZWQp
KTsKKyAgICAgICAgcmVzdWx0LT5zZXRIYXNBbHBoYShoYXNBbHBoYSk7CisgICAgfQorICAgIHJl
dHVybiByZXN1bHQucmVsZWFzZSgpOworfQorCitTaGFyZWRCaXRtYXA6OlNoYXJlZEJpdG1hcChj
b25zdCBJbnRTaXplJiBzaXplLCBCaXRtYXBJbmZvOjpCaXRDb3VudCBiaXRDb3VudCwgYm9vbCBp
bml0UGl4ZWxzKQorICAgIDogbV9ibXBJbmZvKEJpdG1hcEluZm86OmNyZWF0ZUJvdHRvbVVwKHNp
emUsIGJpdENvdW50KSkKKyAgICAsIG1fbG9ja2VkKGZhbHNlKQorICAgICwgbV91c2VzVHJhbnNw
YXJlbnRDb2xvcihmYWxzZSkKKyAgICAsIG1fdHJhbnNwYXJlbnRDb2xvcihSR0IoMCwgMCwgMCkp
CisgICAgLCBtX3BpeGVscygwKQorICAgICwgbV9oYXNBbHBoYShmYWxzZSkKKyAgICAsIG1fdmFs
aWRIZWlnaHQoYWJzKHNpemUuaGVpZ2h0KCkpKQorICAgICwgbV9oYml0bWFwKDApCit7CisjaWZu
ZGVmIE5ERUJVRworICAgIHNoYXJlZEJpdG1hcExlYWtDb3VudGVyLmluY3JlbWVudCgpOworI2Vu
ZGlmCisKKyAgICB1bnNpZ25lZCBidWZmZXJTaXplID0gbV9ibXBJbmZvLm51bVBpeGVscygpOwor
ICAgIGlmIChiaXRDb3VudCA9PSBCaXRtYXBJbmZvOjpCaXRDb3VudDE2KQorICAgICAgICBidWZm
ZXJTaXplIC89IDI7CisKKyAgICBtX3BpeGVsRGF0YS5zZXQobmV3IHVuc2lnbmVkW2J1ZmZlclNp
emVdKTsKKyAgICBtX3BpeGVscyA9IG1fcGl4ZWxEYXRhLmdldCgpOworCisgICAgaWYgKGluaXRQ
aXhlbHMpCisgICAgICAgIHJlc2V0UGl4ZWxzKCk7Cit9CisKK1NoYXJlZEJpdG1hcDo6flNoYXJl
ZEJpdG1hcCgpCit7CisjaWZuZGVmIE5ERUJVRworICAgIHNoYXJlZEJpdG1hcExlYWtDb3VudGVy
LmRlY3JlbWVudCgpOworI2VuZGlmCit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpyZXNldFBpeGVs
cyhib29sIGJsYWNrKQoreworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKwor
ICAgIHVuc2lnbmVkIGJ1ZmZlclNpemUgPSBtX2JtcEluZm8ubnVtUGl4ZWxzKCk7CisgICAgaWYg
KGJsYWNrKSB7CisgICAgICAgIHVuc2lnbmVkIGJ1ZmZlclNpemVJbkJ5dGVzID0gYnVmZmVyU2l6
ZSAqIChpczE2Yml0KCkgPyAyIDogNCk7CisgICAgICAgIG1lbXNldChtX3BpeGVscywgMCwgYnVm
ZmVyU2l6ZUluQnl0ZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlzMTZi
aXQoKSkgeworICAgICAgICAvLyBGaWxsIGl0IHdpdGggd2hpdGUgY29sb3IKKyAgICAgICAgd21l
bXNldChzdGF0aWNfY2FzdDx3Y2hhcl90Kj4obV9waXhlbHMpLCAweEZGRkYsIGJ1ZmZlclNpemUp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTWFrZSBpdCB3aGl0ZSBidXQgdHJh
bnNwYXJlbnQKKyAgICB1bnNpZ25lZCogcGl4ZWwgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCo+KG1f
cGl4ZWxzKTsKKyAgICBjb25zdCB1bnNpZ25lZCogYnVmZmVyRW5kID0gcGl4ZWwgKyBidWZmZXJT
aXplOworICAgIHdoaWxlIChwaXhlbCA8IGJ1ZmZlckVuZCkKKyAgICAgICAgKnBpeGVsKysgPSAw
eDAwRkZGRkZGOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGNvbnZlcnQzMlRv
MTYodW5zaWduZWQgcGl4ZWwpCit7CisgICAgdW5zaWduZWQgc2hvcnQgciA9IHN0YXRpY19jYXN0
PHVuc2lnbmVkIHNob3J0PigocGl4ZWwgJiAweDAwRjgwMDAwKSA+PiA4KTsKKyAgICB1bnNpZ25l
ZCBzaG9ydCBnID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KChwaXhlbCAmIDB4MDAwMEZD
MDApID4+IDUpOworICAgIHVuc2lnbmVkIHNob3J0IGIgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBz
aG9ydD4oKHBpeGVsICYgMHgwMDAwMDBGOCkgPj4gMyk7CisgICAgcmV0dXJuIHIgfCBnIHwgYjsK
K30KKworYm9vbCBTaGFyZWRCaXRtYXA6OnRvMTZiaXQoKQoreworICAgIGlmIChtX2xvY2tlZCkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChpczE2Yml0KCkpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgQml0bWFwSW5mbyBuZXdCbXBJbmZvID0gQml0bWFwSW5mbzo6Y3JlYXRl
KG1fYm1wSW5mby5zaXplKCksIEJpdG1hcEluZm86OkJpdENvdW50MTYpOworCisgICAgaW50IHdp
ZHRoID0gbmV3Qm1wSW5mby53aWR0aCgpOworICAgIGludCBwYWRkZWRXaWR0aCA9IG5ld0JtcElu
Zm8ucGFkZGVkV2lkdGgoKTsKKyAgICBpbnQgYnVmZmVyU2l6ZSA9IHBhZGRlZFdpZHRoICogbmV3
Qm1wSW5mby5oZWlnaHQoKTsKKyAgICBPd25BcnJheVB0cjx1bnNpZ25lZD4gbmV3UGl4ZWxEYXRh
KG5ldyB1bnNpZ25lZFtidWZmZXJTaXplIC8gMl0pOworICAgIHZvaWQqIG5ld1BpeGVscyA9IG5l
d1BpeGVsRGF0YS5nZXQoKTsKKworICAgIGlmICghbmV3UGl4ZWxzKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICB1bnNpZ25lZCBzaG9ydCogcDE2ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQg
c2hvcnQqPihuZXdQaXhlbHMpOworICAgIGNvbnN0IHVuc2lnbmVkKiBwMzIgPSBzdGF0aWNfY2Fz
dDxjb25zdCB1bnNpZ25lZCo+KG1fcGl4ZWxzKTsKKworICAgIGJvb2wgc2tpcHMgPSBwYWRkZWRX
aWR0aCAhPSB3aWR0aDsKKworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBwMTZlbmQgPSBwMTYg
KyBidWZmZXJTaXplOworICAgIHdoaWxlIChwMTYgPCBwMTZlbmQpIHsKKyAgICAgICAgZm9yICh1
bnNpZ25lZCBzaG9ydCogcDE2bGluZUVuZCA9IHAxNiArIHdpZHRoOyBwMTYgPCBwMTZsaW5lRW5k
OyApCisgICAgICAgICAgICAqcDE2KysgPSBjb252ZXJ0MzJUbzE2KCpwMzIrKyk7CisKKyAgICAg
ICAgaWYgKHNraXBzKQorICAgICAgICAgICAgKnAxNisrID0gMDsKKyAgICB9CisKKyAgICBpZiAo
bV9oYml0bWFwKQorICAgICAgICBtX2hiaXRtYXAuY2xlYXIoKTsKKyAgICBlbHNlCisgICAgICAg
IG1fcGl4ZWxEYXRhID0gbmV3UGl4ZWxEYXRhLnJlbGVhc2UoKTsKKworICAgIG1fcGl4ZWxzID0g
bmV3UGl4ZWxzOworICAgIG1fYm1wSW5mbyA9IG5ld0JtcEluZm87CisKKyAgICBzZXRIYXNBbHBo
YShmYWxzZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2hhcmVkQml0bWFwOjpmcmVl
TWVtb3J5KCkKK3sKKyAgICBpZiAobV9sb2NrZWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGlmIChtX2hiaXRtYXApIHsKKyAgICAgICAgbV9oYml0bWFwLmNsZWFyKCk7CisgICAgICAg
IG1fcGl4ZWxzID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKG1f
cGl4ZWxzKSB7CisgICAgICAgIG1fcGl4ZWxEYXRhLmNsZWFyKCk7CisgICAgICAgIG1fcGl4ZWxz
ID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOwor
fQorCitQYXNzT3duUHRyPEhCSVRNQVA+IFNoYXJlZEJpdG1hcDo6Y3JlYXRlSGFuZGxlKHZvaWQq
KiBwaXhlbHMsIEJpdG1hcEluZm8qIGJtcEluZm8sIGludCBoZWlnaHQsIGJvb2wgdXNlMTZiaXQp
IGNvbnN0Cit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBp
ZiAoaGVpZ2h0ID09IC0xKQorICAgICAgICBoZWlnaHQgPSB0aGlzLT5oZWlnaHQoKTsKKyAgICAq
Ym1wSW5mbyA9IEJpdG1hcEluZm86OmNyZWF0ZUJvdHRvbVVwKEludFNpemUod2lkdGgoKSwgaGVp
Z2h0KSwgKHVzZTE2Yml0IHx8IGlzMTZiaXQoKSkgPyBCaXRtYXBJbmZvOjpCaXRDb3VudDE2IDog
Qml0bWFwSW5mbzo6Qml0Q291bnQzMik7CisKKyAgICBPd25QdHI8SEJJVE1BUD4gaGJtcChDcmVh
dGVESUJTZWN0aW9uKDAsIGJtcEluZm8sIERJQl9SR0JfQ09MT1JTLCBwaXhlbHMsIDAsIDApKTsK
KworICAgIGlmICghaGJtcCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBPd25QdHI8SERDPiBi
bXBEQyhDcmVhdGVDb21wYXRpYmxlREMoMCkpOworICAgIEhHRElPQkogaE9sZEJtcCA9IFNlbGVj
dE9iamVjdChibXBEQy5nZXQoKSwgaGJtcC5nZXQoKSk7CisKKyAgICBTdHJldGNoRElCaXRzKGJt
cERDLmdldCgpLCAwLCAwLCB3aWR0aCgpLCBoZWlnaHQsIDAsIDAsIHdpZHRoKCksIGhlaWdodCwg
bV9waXhlbHMsICZtX2JtcEluZm8sIERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKKworICAgIFNl
bGVjdE9iamVjdChibXBEQy5nZXQoKSwgaE9sZEJtcCk7CisKKyAgICByZXR1cm4gaGJtcC5yZWxl
YXNlKCk7Cit9CisKK2Jvb2wgU2hhcmVkQml0bWFwOjplbnN1cmVIYW5kbGUoKQoreworICAgIGlm
IChtX2hiaXRtYXApCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFtX3BpeGVscykK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1fbG9ja2VkKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBCaXRtYXBJbmZvIGJtcEluZm87CisgICAgdm9pZCogcGl4ZWxzOwor
ICAgIG1faGJpdG1hcCA9IGNyZWF0ZUhhbmRsZSgmcGl4ZWxzLCAmYm1wSW5mbywgLTEsICFoYXNB
bHBoYSgpKTsKKworICAgIGlmICghbV9oYml0bWFwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBtX3BpeGVsRGF0YS5jbGVhcigpOworICAgIG1fcGl4ZWxzID0gcGl4ZWxzOworICAgIG1f
Ym1wSW5mbyA9IGJtcEluZm87CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTaGFyZWRC
aXRtYXA6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0
LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29t
cG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAg
ICAgcmV0dXJuOworICAgIGN0eHQtPmRyYXdCaXRtYXAodGhpcywgZHN0UmVjdCwgc3JjUmVjdCwg
c3R5bGVDb2xvclNwYWNlLCBjb21wb3NpdGVPcCk7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpk
cmF3KEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJlY3QmIHNyY1Jl
Y3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGlmICghbV9waXhlbHMp
CisgICAgICAgIHJldHVybjsKKworICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSB8fCBzcmNSZWN0
LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSEJJVE1BUCBoYml0bWFwID0gMDsK
KyAgICBPd25QdHI8SEJJVE1BUD4gaFRlbXBCaXRtYXA7CisgICAgYm9vbCB1c2luZ0hhbmRsZSA9
IGNvbXBvc2l0ZU9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgJiYgKGhhc0FscGhhKCkgJiYgaGFz
QWxwaGFCbGVuZFN1cHBvcnQoKSB8fCB1c2VzVHJhbnNwYXJlbnRDb2xvcigpKTsKKworICAgIGlm
ICh1c2luZ0hhbmRsZSkgeworICAgICAgICBpZiAoZW5zdXJlSGFuZGxlKCkpCisgICAgICAgICAg
ICBoYml0bWFwID0gbV9oYml0bWFwLmdldCgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
IHZvaWQqIHBpeGVsczsKKyAgICAgICAgICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICAgICAg
ICAgIGhUZW1wQml0bWFwID0gY3JlYXRlSGFuZGxlKCZwaXhlbHMsICZibXBJbmZvLCAtMSwgdXNl
c1RyYW5zcGFyZW50Q29sb3IoKSk7CisgICAgICAgICAgICBoYml0bWFwID0gaFRlbXBCaXRtYXAu
Z2V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFoYml0bWFwKSB7CisgICAgICAgIC8v
IEZJWE1FOiBoYW5kbGUgb3RoZXIgY29tcG9zaXRlIG9wZXJhdGlvbiB0eXBlcz8KKyAgICAgICAg
RFdPUkQgcm9wID0gY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlQ29weSA/IFNSQ0NPUFkKKyAgICAg
ICAgICAgIDogY29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlWE9SID8gUEFUSU5WRVJUCisgICAgICAg
ICAgICA6IGNvbXBvc2l0ZU9wID09IENvbXBvc2l0ZUNsZWFyID8gV0hJVEVORVNTCisgICAgICAg
ICAgICA6IFNSQ0NPUFk7CisKKyAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFJlY3QueCgp
LCBkc3RSZWN0LnkoKSwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgpLAorICAgICAg
ICAgICAgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3Qu
aGVpZ2h0KCksIG1fcGl4ZWxzLCAmbV9ibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgcm9wKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE93blB0cjxIREM+IGhtZW1kYyhDcmVhdGVDb21w
YXRpYmxlREMoaGRjKSk7CisgICAgSEdESU9CSiBoT2xkQm1wID0gU2VsZWN0T2JqZWN0KGhtZW1k
Yy5nZXQoKSwgaGJpdG1hcCk7CisKKyAgICBpZiAoIXVzZXNUcmFuc3BhcmVudENvbG9yKCkgJiYg
aGFzQWxwaGFCbGVuZFN1cHBvcnQoKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgQkxFTkRGVU5D
VElPTiBibGVuZCA9IHsgQUNfU1JDX09WRVIsIDAsIDI1NSwgQUNfU1JDX0FMUEhBIH07CisgICAg
ICAgIGJvb2wgc3VjY2VzcyA9IGFscGhhQmxlbmRJZlN1cHBvcnRlZChoZGMsIGRzdFJlY3QueCgp
LCBkc3RSZWN0LnkoKSwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgpLCBobWVtZGMu
Z2V0KCksCisgICAgICAgICAgICBzcmNSZWN0LngoKSwgc3JjUmVjdC55KCksIHNyY1JlY3Qud2lk
dGgoKSwgc3JjUmVjdC5oZWlnaHQoKSwgYmxlbmQpOworICAgICAgICBBU1NFUlRfVU5VU0VEKHN1
Y2Nlc3MsIHN1Y2Nlc3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRyYW5zcGFyZW50Qmx0KGhk
YywgZHN0UmVjdC54KCksIGRzdFJlY3QueSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVp
Z2h0KCksIGhtZW1kYy5nZXQoKSwKKyAgICAgICAgICAgIHNyY1JlY3QueCgpLCBzcmNSZWN0Lnko
KSwgc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgpLCB0cmFuc3BhcmVudENvbG9yKCkp
OworICAgIH0KKworICAgIFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCksIGhPbGRCbXApOworfQor
CitIQklUTUFQIFNoYXJlZEJpdG1hcDo6Y2xpcEJpdG1hcChjb25zdCBJbnRSZWN0JiByZWN0LCBi
b29sIHVzZUFscGhhLCBCaXRtYXBJbmZvJiBibXBJbmZvLCB2b2lkKiYgcGl4ZWxzKQoreworICAg
IGlmICghYnl0ZXMoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpbnQgb2xkV2lkdGggPSB3
aWR0aCgpOworICAgIGludCBvbGRIZWlnaHQgPSBoZWlnaHQoKTsKKyAgICBpbnQgY29weVdpZHRo
ID0gc3RkOjptaW48aW50PihyZWN0LndpZHRoKCksIG9sZFdpZHRoIC0gcmVjdC54KCkpOworICAg
IGludCBjb3B5SGVpZ2h0ID0gc3RkOjptaW48aW50PihyZWN0LmhlaWdodCgpLCBvbGRIZWlnaHQg
LSByZWN0LnkoKSk7CisgICAgaWYgKCFjb3B5V2lkdGggfHwgIWNvcHlIZWlnaHQpCisgICAgICAg
IHJldHVybiAwOworCisgICAgYm1wSW5mbyA9IEJpdG1hcEluZm86OmNyZWF0ZUJvdHRvbVVwKElu
dFNpemUoY29weVdpZHRoLCBjb3B5SGVpZ2h0KSwgKHVzZUFscGhhICYmIGlzMzJiaXQoKSkgPyBC
aXRtYXBJbmZvOjpCaXRDb3VudDMyIDogQml0bWFwSW5mbzo6Qml0Q291bnQxNik7CisgICAgSEJJ
VE1BUCBuZXdCbXAgPSBDcmVhdGVESUJTZWN0aW9uKDAsICZibXBJbmZvLCBESUJfUkdCX0NPTE9S
UywgJnBpeGVscywgMCwgMCk7CisKKyAgICBpZiAoIW5ld0JtcCkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBPd25QdHI8SERDPiBkY05ldyhDcmVhdGVDb21wYXRpYmxlREMoMCkpOworICAgIEhH
RElPQkogdG1wTmV3ID0gU2VsZWN0T2JqZWN0KGRjTmV3LmdldCgpLCBuZXdCbXApOworCisgICAg
U3RyZXRjaERJQml0cyhkY05ldy5nZXQoKSwgMCwgMCwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LCBy
ZWN0LngoKSwgcmVjdC55KCksIGNvcHlXaWR0aCwgY29weUhlaWdodCwKKyAgICAgICAgYnl0ZXMo
KSwgJmJpdG1hcEluZm8oKSwgRElCX1JHQl9DT0xPUlMsIFNSQ0NPUFkpOworCisgICAgU2VsZWN0
T2JqZWN0KGRjTmV3LmdldCgpLCB0bXBOZXcpOworICAgIHJldHVybiBuZXdCbXA7Cit9CisKK1Bh
c3NSZWZQdHI8U2hhcmVkQml0bWFwPiBTaGFyZWRCaXRtYXA6OmNsaXBCaXRtYXAoY29uc3QgSW50
UmVjdCYgcmVjdCwgYm9vbCB1c2VBbHBoYSkKK3sKKyAgICBpbnQgb2xkV2lkdGggPSB3aWR0aCgp
OworICAgIGludCBvbGRIZWlnaHQgPSBoZWlnaHQoKTsKKyAgICBpbnQgY29weVdpZHRoID0gc3Rk
OjptaW48aW50PihyZWN0LndpZHRoKCksIG9sZFdpZHRoIC0gcmVjdC54KCkpOworICAgIGludCBj
b3B5SGVpZ2h0ID0gc3RkOjptaW48aW50PihyZWN0LmhlaWdodCgpLCBvbGRIZWlnaHQgLSByZWN0
LnkoKSk7CisgICAgaWYgKCFjb3B5V2lkdGggfHwgIWNvcHlIZWlnaHQpCisgICAgICAgIHJldHVy
biAwOworCisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gbmV3Qm1wID0gY3JlYXRlKEludFNpemUo
Y29weVdpZHRoLCBjb3B5SGVpZ2h0KSwgdXNlQWxwaGEgJiYgaXMzMmJpdCgpID8gQml0bWFwSW5m
bzo6Qml0Q291bnQzMiA6IEJpdG1hcEluZm86OkJpdENvdW50MTYsIGZhbHNlKTsKKworICAgIGlm
ICghbmV3Qm1wIHx8ICFuZXdCbXAtPmJ5dGVzKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAg
RENIb2xkZXIgZGNOZXcobmV3Qm1wLmdldCgpKTsKKworICAgIFN0cmV0Y2hESUJpdHMoZGNOZXcu
Z2V0KCksIDAsIDAsIGNvcHlXaWR0aCwgY29weUhlaWdodCwgcmVjdC54KCksIHJlY3QueSgpLCBj
b3B5V2lkdGgsIGNvcHlIZWlnaHQsCisgICAgICAgIGJ5dGVzKCksICZiaXRtYXBJbmZvKCksIERJ
Ql9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKKworICAgIHJldHVybiBuZXdCbXA7Cit9CisKK3N0YXRp
YyB2b2lkIGRyYXdQYXR0ZXJuU2ltcGxlKEhEQyBoZGMsIGNvbnN0IFJFQ1QmIGRlc3RSZWN0LCBI
QklUTUFQIGhibXAsIGNvbnN0IFBPSU5UJiBwaGFzZSkKK3sKKyAgICBPd25QdHI8SEJSVVNIPiBo
QnJ1c2goQ3JlYXRlUGF0dGVybkJydXNoKGhibXApKTsKKyAgICBpZiAoIWhCcnVzaCkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgUE9JTlQgb2xkT3JnOworICAgIFNldEJydXNoT3JnRXgoaGRjLCBk
ZXN0UmVjdC5sZWZ0IC0gcGhhc2UueCwgZGVzdFJlY3QudG9wIC0gcGhhc2UueSwgJm9sZE9yZyk7
CisgICAgRmlsbFJlY3QoaGRjLCAmZGVzdFJlY3QsIGhCcnVzaC5nZXQoKSk7CisgICAgU2V0QnJ1
c2hPcmdFeChoZGMsIG9sZE9yZy54LCBvbGRPcmcueSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRy
YXdQYXR0ZXJuU2ltcGxlKEhEQyBoZGMsIGNvbnN0IFJFQ1QmIGRlc3RSZWN0LCBjb25zdCBTaGFy
ZWRCaXRtYXAqIGJtcCwgY29uc3QgU0laRSYgYm1wU2l6ZSwgY29uc3QgUE9JTlQmIHBoYXNlKQor
eworICAgIGludCBkc3RZID0gZGVzdFJlY3QudG9wOworICAgIGZvciAoaW50IHNvdXJjZVkgPSBw
aGFzZS55OyBkc3RZIDwgZGVzdFJlY3QuYm90dG9tOyApIHsKKyAgICAgICAgaW50IHNvdXJjZUgg
PSBzdGQ6Om1pbjxpbnQ+KGJtcFNpemUuY3kgLSBzb3VyY2VZLCBkZXN0UmVjdC5ib3R0b20gLSBk
c3RZKTsKKyAgICAgICAgaW50IGRzdFggPSBkZXN0UmVjdC5sZWZ0OworICAgICAgICBmb3IgKGlu
dCBzb3VyY2VYID0gcGhhc2UueDsgZHN0WCA8IGRlc3RSZWN0LnJpZ2h0OyApIHsKKyAgICAgICAg
ICAgIGludCBzb3VyY2VXID0gc3RkOjptaW48aW50PihibXBTaXplLmN4IC0gc291cmNlWCwgZGVz
dFJlY3QucmlnaHQgLSBkc3RYKTsKKworICAgICAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRz
dFgsIGRzdFksIHNvdXJjZVcsIHNvdXJjZUgsIHNvdXJjZVgsIHNvdXJjZVksIHNvdXJjZVcsIHNv
dXJjZUgsCisgICAgICAgICAgICAgICAgYm1wLT5ieXRlcygpLCAmYm1wLT5iaXRtYXBJbmZvKCks
IERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKKworICAgICAgICAgICAgZHN0WCArPSBzb3VyY2VX
OworICAgICAgICAgICAgc291cmNlWCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBkc3RZICs9
IHNvdXJjZUg7CisgICAgICAgIHNvdXJjZVkgPSAwOworICAgIH0KK30KKworc3RhdGljIExPTkcg
bm9ybWFsaXplUGhhc2UoTE9ORyBwaGFzZSwgaW50IGxpbWl0KQoreworICAgIGlmICghcGhhc2Ug
fHwgbGltaXQgPCAyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChsaW1pdCA9PSAyKQor
ICAgICAgICByZXR1cm4gcGhhc2UgJiAxOworCisgICAgaWYgKHBoYXNlIDwgMCkgeworICAgICAg
ICBwaGFzZSA9IC1waGFzZTsKKyAgICAgICAgaWYgKHBoYXNlID4gbGltaXQpCisgICAgICAgICAg
ICBwaGFzZSA9IHN0YXRpY19jYXN0PExPTkc+KHN0YXRpY19jYXN0PHVuc2lnbmVkPihwaGFzZSkg
JSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obGltaXQpKTsKKyAgICAgICAgaWYgKHBoYXNlKQorICAg
ICAgICAgICAgcGhhc2UgPSBsaW1pdCAtIHBoYXNlOworICAgICAgICByZXR1cm4gcGhhc2U7Cisg
ICAgfQorCisgICAgaWYgKHBoYXNlIDwgbGltaXQpCisgICAgICAgIHJldHVybiBwaGFzZTsKKwor
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxMT05HPihzdGF0aWNfY2FzdDx1bnNpZ25lZD4ocGhhc2Up
ICUgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGxpbWl0KSk7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFw
OjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgdGls
ZVJlY3RJbiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3JtLAorICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbG9yU3BhY2Ugc3R5
bGVDb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0
UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpCit7CisgICAgaWYgKCFtX3BpeGVs
cykKKyAgICAgICAgcmV0dXJuOworICAgIGN0eHQtPmRyYXdCaXRtYXBQYXR0ZXJuKHRoaXMsIHRp
bGVSZWN0SW4sIHBhdHRlcm5UcmFuc2Zvcm0sIHBoYXNlLCBzdHlsZUNvbG9yU3BhY2UsIG9wLCBk
ZXN0UmVjdCwgb3JpZ1NvdXJjZVNpemUpOworfQorCit2b2lkIFNoYXJlZEJpdG1hcDo6ZHJhd1Bh
dHRlcm4oSERDIGhkYywgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0sIGNvbnN0IEZs
b2F0UmVjdCYgdGlsZVJlY3RJbiwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNm
b3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENv
bG9yU3BhY2Ugc3R5bGVDb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxv
YXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpCit7CisgICAg
aWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHRpbGVSZWN0SW4ud2lk
dGgoKSA8PSAwIHx8IHRpbGVSZWN0SW4uaGVpZ2h0KCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgYm9vbCB1c2VBbHBoYSA9IG9wID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgJiYgaGFzQWxw
aGEoKSAmJiBpczMyYml0KCk7CisKKyAgICBpbnQgYm1wV2lkdGggPSB3aWR0aCgpOworICAgIGlu
dCBibXBIZWlnaHQgPSBoZWlnaHQoKTsKKworICAgIEZsb2F0UmVjdCB0aWxlUmVjdCh0aWxlUmVj
dEluKTsKKyAgICBpZiAoYm1wV2lkdGggIT0gb3JpZ1NvdXJjZVNpemUud2lkdGgoKSkgeworICAg
ICAgICBkb3VibGUgcmF0ZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4oYm1wV2lkdGgpIC8gb3JpZ1Nv
dXJjZVNpemUud2lkdGgoKTsKKyAgICAgICAgZG91YmxlIHRlbXAgPSB0aWxlUmVjdC53aWR0aCgp
ICogcmF0ZTsKKyAgICAgICAgdGlsZVJlY3Quc2V0WCh0aWxlUmVjdC54KCkgKiByYXRlKTsKKyAg
ICAgICAgdGlsZVJlY3Quc2V0V2lkdGgodGVtcCk7CisgICAgICAgIHRlbXAgPSB0aWxlUmVjdC5o
ZWlnaHQoKSAqIHJhdGU7CisgICAgICAgIHRpbGVSZWN0LnNldFkodGlsZVJlY3QueSgpICogcmF0
ZSk7CisgICAgICAgIHRpbGVSZWN0LnNldEhlaWdodCh0ZW1wKTsKKyAgICB9CisKKyAgICBPd25Q
dHI8SEJJVE1BUD4gY2xpcHBlZEJtcDsKKworICAgIGlmICh0aWxlUmVjdC54KCkgfHwgdGlsZVJl
Y3QueSgpIHx8IHRpbGVSZWN0LndpZHRoKCkgIT0gYm1wV2lkdGggfHwgdGlsZVJlY3QuaGVpZ2h0
KCkgIT0gYm1wSGVpZ2h0KSB7CisgICAgICAgIEJpdG1hcEluZm8gcGF0dGVybkJtcEluZm87Cisg
ICAgICAgIHZvaWQqIHBhdHRlcm5QaXhlbHM7CisgICAgICAgIGNsaXBwZWRCbXAuc2V0KGNsaXBC
aXRtYXAoSW50UmVjdCh0aWxlUmVjdCksIHVzZUFscGhhLCBwYXR0ZXJuQm1wSW5mbywgcGF0dGVy
blBpeGVscykpOworICAgICAgICBpZiAoIWNsaXBwZWRCbXApCisgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgYm1wV2lkdGggPSB0aWxlUmVjdC53aWR0aCgpOworICAgICAgICBibXBIZWln
aHQgPSB0aWxlUmVjdC5oZWlnaHQoKTsKKyAgICB9CisKKyAgICBBZmZpbmVUcmFuc2Zvcm0gdGYg
PSB0cmFuc2Zvcm07CisgICAgdGYgKj0gcGF0dGVyblRyYW5zZm9ybTsKKworICAgIEZsb2F0UmVj
dCB0clJlY3QgPSB0Zi5tYXBSZWN0KGRlc3RSZWN0KTsKKworICAgIFJFQ1QgY2xpcEJveDsKKyAg
ICBpbnQgY2xpcFR5cGUgPSBHZXRDbGlwQm94KGhkYywgJmNsaXBCb3gpOworICAgIGlmIChjbGlw
VHlwZSA9PSBTSU1QTEVSRUdJT04pCisgICAgICAgIHRyUmVjdC5pbnRlcnNlY3QoRmxvYXRSZWN0
KGNsaXBCb3gubGVmdCwgY2xpcEJveC50b3AsIGNsaXBCb3gucmlnaHQgLSBjbGlwQm94LmxlZnQs
IGNsaXBCb3guYm90dG9tIC0gY2xpcEJveC50b3ApKTsKKyAgICBlbHNlIGlmIChjbGlwVHlwZSA9
PSBDT01QTEVYUkVHSU9OKSB7CisgICAgICAgIE93blB0cjxIUkdOPiBjbGlwUmduKENyZWF0ZVJl
Y3RSZ24oMCwgMCwgMCwgMCkpOworICAgICAgICBpZiAoR2V0Q2xpcFJnbihoZGMsIGNsaXBSZ24u
Z2V0KCkpID4gMCkgeworICAgICAgICAgICAgRFdPUkQgcmVnaW9uRGF0YVNpemUgPSBHZXRSZWdp
b25EYXRhKGNsaXBSZ24uZ2V0KCksIHNpemVvZihSR05EQVRBKSwgMCk7CisgICAgICAgICAgICBp
ZiAocmVnaW9uRGF0YVNpemUpIHsKKyAgICAgICAgICAgICAgICBWZWN0b3I8UkdOREFUQT4gcmVn
aW9uRGF0YShyZWdpb25EYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgR2V0UmVnaW9uRGF0YShj
bGlwUmduLmdldCgpLCByZWdpb25EYXRhU2l6ZSwgcmVnaW9uRGF0YS5kYXRhKCkpOworICAgICAg
ICAgICAgICAgIFJFQ1QqIHJlY3QgPSByZWludGVycHJldF9jYXN0PFJFQ1QqPihyZWdpb25EYXRh
WzBdLkJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZm9yIChEV09SRCBpID0gMDsgaSA8IHJlZ2lv
bkRhdGFbMF0ucmRoLm5Db3VudDsgKytpLCArK3JlY3QpCisgICAgICAgICAgICAgICAgICAgIHRy
UmVjdC5pbnRlcnNlY3QoRmxvYXRSZWN0KHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmln
aHQgLSByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSByZWN0LT50b3ApKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0clJlY3Qud2lkdGgoKSA8PSAwIHx8IHRy
UmVjdC5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICB0clJlY3QuaW5mbGF0
ZSgxKTsKKyAgICBJbnRSZWN0IHZpc2libGVEc3RSZWN0ID0gZW5jbG9zaW5nSW50UmVjdCh0Zi5p
bnZlcnNlKCkubWFwUmVjdCh0clJlY3QpKTsKKyAgICB2aXNpYmxlRHN0UmVjdC5pbnRlcnNlY3Qo
SW50UmVjdChkZXN0UmVjdCkpOworCisgICAgaWYgKHZpc2libGVEc3RSZWN0LndpZHRoKCkgPD0g
MCB8fCB2aXNpYmxlRHN0UmVjdC5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAg
ICB0clJlY3QgPSB0Zi5tYXBSZWN0KHZpc2libGVEc3RSZWN0KTsKKyAgICBSRUNUIGRzdFJlY3RX
aW4gPSB7CisgICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC54KCkpLAorICAgICAgICBzdGFibGVS
b3VuZCh0clJlY3QueSgpKSwKKyAgICAgICAgc3RhYmxlUm91bmQodHJSZWN0LnJpZ2h0KCkpLAor
ICAgICAgICBzdGFibGVSb3VuZCh0clJlY3QuYm90dG9tKCkpLAorICAgIH07CisgICAgaWYgKGRz
dFJlY3RXaW4ucmlnaHQgPD0gZHN0UmVjdFdpbi5sZWZ0IHx8IGRzdFJlY3RXaW4uYm90dG9tIDw9
IGRzdFJlY3RXaW4udG9wKQorICAgICAgICByZXR1cm47CisKKyAgICBTSVpFIGJtcFNpemUgPSB7
IGJtcFdpZHRoLCBibXBIZWlnaHQgfTsKKworICAgIC8vIFJlbGF0aXZlIHRvIGRlc3RpbmF0aW9u
LCBpbiBiaXRtYXAgcGl4ZWxzCisgICAgUE9JTlQgcGhhc2VXaW4gPSB7IHN0YWJsZVJvdW5kKHZp
c2libGVEc3RSZWN0LngoKSAtIHBoYXNlLngoKSksIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0
LnkoKSAtIHBoYXNlLnkoKSkgfTsKKyAgICBwaGFzZVdpbi54ID0gbm9ybWFsaXplUGhhc2UocGhh
c2VXaW4ueCwgYm1wU2l6ZS5jeCk7CisgICAgcGhhc2VXaW4ueSA9IG5vcm1hbGl6ZVBoYXNlKHBo
YXNlV2luLnksIGJtcFNpemUuY3kpOworCisgICAgUkVDVCBzcmNSZWN0V2luID0geworICAgICAg
ICAwLAorICAgICAgICAwLAorICAgICAgICBzdGFibGVSb3VuZCh2aXNpYmxlRHN0UmVjdC5yaWdo
dCgpKSAtIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LngoKSksCisgICAgICAgIHN0YWJsZVJv
dW5kKHZpc2libGVEc3RSZWN0LmJvdHRvbSgpKSAtIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0
LnkoKSkKKyAgICB9OworICAgIGlmIChzcmNSZWN0V2luLnJpZ2h0IDw9IDAgfHwgc3JjUmVjdFdp
bi5ib3R0b20gPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgQml0bWFwSW5mbyBibXBJbmZv
ID0gQml0bWFwSW5mbzo6Y3JlYXRlQm90dG9tVXAoSW50U2l6ZShzcmNSZWN0V2luLnJpZ2h0LCBz
cmNSZWN0V2luLmJvdHRvbSksIHVzZUFscGhhID8gQml0bWFwSW5mbzo6Qml0Q291bnQzMiA6IEJp
dG1hcEluZm86OkJpdENvdW50MTYpOworICAgIHZvaWQqIHBpeGVsczsKKyAgICBPd25QdHI8SEJJ
VE1BUD4gaGJtcFRlbXAoQ3JlYXRlRElCU2VjdGlvbigwLCAmYm1wSW5mbywgRElCX1JHQl9DT0xP
UlMsICZwaXhlbHMsIDAsIDApKTsKKworICAgIGlmICghaGJtcFRlbXApCisgICAgICAgIHJldHVy
bjsKKworICAgIE93blB0cjxIREM+IGhtZW1kYyhDcmVhdGVDb21wYXRpYmxlREMoaGRjKSk7Cisg
ICAgSEdESU9CSiBvbGRCbXAgPSBTZWxlY3RPYmplY3QoaG1lbWRjLmdldCgpLCBoYm1wVGVtcC5n
ZXQoKSk7CisgICAgaWYgKGNsaXBwZWRCbXApCisgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGht
ZW1kYy5nZXQoKSwgc3JjUmVjdFdpbiwgY2xpcHBlZEJtcC5nZXQoKSwgcGhhc2VXaW4pOworICAg
IGVsc2UgaWYgKChvcCAhPSBDb21wb3NpdGVTb3VyY2VPdmVyIHx8IGNhblVzZURJQml0cygpKSAm
JiBzcmNSZWN0V2luLnJpZ2h0IDw9IGJtcFNpemUuY3ggKiAyICYmIHNyY1JlY3RXaW4uYm90dG9t
IDw9IGJtcFNpemUuY3kgKiAyKQorICAgICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0
KCksIHNyY1JlY3RXaW4sIHRoaXMsIGJtcFNpemUsIHBoYXNlV2luKTsKKyAgICBlbHNlIGlmIChl
bnN1cmVIYW5kbGUoKSkKKyAgICAgICAgZHJhd1BhdHRlcm5TaW1wbGUoaG1lbWRjLmdldCgpLCBz
cmNSZWN0V2luLCBnZXRIYW5kbGUoKSwgcGhhc2VXaW4pOworICAgIGVsc2UgeworICAgICAgICB2
b2lkKiBwaXhlbHM7CisgICAgICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICAgICAgT3duUHRy
PEhCSVRNQVA+IGhibXAgPSBjcmVhdGVIYW5kbGUoJnBpeGVscywgJmJtcEluZm8sIC0xLCBmYWxz
ZSk7CisgICAgICAgIGlmIChoYm1wKQorICAgICAgICAgICAgZHJhd1BhdHRlcm5TaW1wbGUoaG1l
bWRjLmdldCgpLCBzcmNSZWN0V2luLCBoYm1wLmdldCgpLCBwaGFzZVdpbik7CisgICAgICAgIGVs
c2UgeworICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgb2xkQm1wKTsKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh1c2VBbHBoYSAm
JiBoYXNBbHBoYUJsZW5kU3VwcG9ydCgpKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBCTEVOREZV
TkNUSU9OIGJsZW5kID0geyBBQ19TUkNfT1ZFUiwgMCwgMjU1LCBBQ19TUkNfQUxQSEEgfTsKKyAg
ICAgICAgYm9vbCBzdWNjZXNzID0gYWxwaGFCbGVuZElmU3VwcG9ydGVkKGhkYywgZHN0UmVjdFdp
bi5sZWZ0LCBkc3RSZWN0V2luLnRvcCwgZHN0UmVjdFdpbi5yaWdodCAtIGRzdFJlY3RXaW4ubGVm
dCwgZHN0UmVjdFdpbi5ib3R0b20gLSBkc3RSZWN0V2luLnRvcCwKKyAgICAgICAgICAgIGhtZW1k
Yy5nZXQoKSwgMCwgMCwgc3JjUmVjdFdpbi5yaWdodCwgc3JjUmVjdFdpbi5ib3R0b20sIGJsZW5k
KTsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChzdWNjZXNzLCBzdWNjZXNzKTsKKyAgICB9IGVsc2Ug
aWYgKHVzZUFscGhhICYmICFoYXNBbHBoYUJsZW5kU3VwcG9ydCgpIHx8IG9wID09IENvbXBvc2l0
ZVNvdXJjZU92ZXIgJiYgdXNlc1RyYW5zcGFyZW50Q29sb3IoKSkgeworICAgICAgICBUcmFuc3Bh
cmVudEJsdChoZGMsIGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4u
cmlnaHQgLSBkc3RSZWN0V2luLmxlZnQsCisgICAgICAgICAgICBkc3RSZWN0V2luLmJvdHRvbSAt
IGRzdFJlY3RXaW4udG9wLCBobWVtZGMuZ2V0KCksIDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNy
Y1JlY3RXaW4uYm90dG9tLCB0cmFuc3BhcmVudENvbG9yKCkpOworICAgIH0gZWxzZSB7CisgICAg
ICAgIERXT1JEIGJtcE9wID0gb3AgPT0gQ29tcG9zaXRlQ29weSA/IFNSQ0NPUFkKKyAgICAgICAg
ICAgICAgICAgICAgOiBvcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVyID8gU1JDQ09QWQorICAgICAg
ICAgICAgICAgICAgICA6IG9wID09IENvbXBvc2l0ZVhPUiA/IFBBVElOVkVSVAorICAgICAgICAg
ICAgICAgICAgICA6IG9wID09IENvbXBvc2l0ZUNsZWFyID8gV0hJVEVORVNTCisgICAgICAgICAg
ICAgICAgICAgIDogU1JDQ09QWTsgLy8gRklYRU1FOiBvdGhlciB0eXBlcz8KKworICAgICAgICBT
dHJldGNoRElCaXRzKGhkYywgZHN0UmVjdFdpbi5sZWZ0LCBkc3RSZWN0V2luLnRvcCwgZHN0UmVj
dFdpbi5yaWdodCAtIGRzdFJlY3RXaW4ubGVmdCwKKyAgICAgICAgICAgIGRzdFJlY3RXaW4uYm90
dG9tIC0gZHN0UmVjdFdpbi50b3AsIDAsIDAsIHNyY1JlY3RXaW4ucmlnaHQsIHNyY1JlY3RXaW4u
Ym90dG9tLAorICAgICAgICAgICAgcGl4ZWxzLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsIGJt
cE9wKTsKKyAgICB9CisgICAgU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgb2xkQm1wKTsKK30K
KworU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyKiBTaGFyZWRCaXRtYXA6OnNfZGNQcm92aWRlciA9
IG5ldyBTaGFyZWRCaXRtYXA6OkRDUHJvdmlkZXI7CisKK0hEQyBTaGFyZWRCaXRtYXA6OkRDUHJv
dmlkZXI6OmdldERDKFNoYXJlZEJpdG1hcCogYm1wLCB1bnNpZ25lZCoga2V5KQoreworICAgIGlm
ICghYm1wIHx8ICFibXAtPmVuc3VyZUhhbmRsZSgpKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IEhEQyBoZGMgPSBDcmVhdGVDb21wYXRpYmxlREMoMCk7CisgICAgaWYgKCFoZGMpCisgICAgICAg
IHJldHVybiAwOworCisgICAgKmtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQ+KFNlbGVj
dE9iamVjdChoZGMsIGJtcC0+Z2V0SGFuZGxlKCkpKTsKKyAgICBSRUNUIHJlY3QgPSB7IDAsIDAs
IGJtcC0+d2lkdGgoKSwgYm1wLT5oZWlnaHQoKSB9OworICAgIE93blB0cjxIUkdOPiBjbGlwUmdu
KENyZWF0ZVJlY3RSZ25JbmRpcmVjdCgmcmVjdCkpOworICAgIFNlbGVjdENsaXBSZ24oaGRjLCBj
bGlwUmduLmdldCgpKTsKKworICAgIHJldHVybiBoZGM7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFw
OjpEQ1Byb3ZpZGVyOjpyZWxlYXNlREMoU2hhcmVkQml0bWFwKiwgSERDIGhkYywgdW5zaWduZWQg
a2V5MSkKK3sKKyAgICBpZiAoIWhkYykKKyAgICAgICAgcmV0dXJuOworCisgICAgU2VsZWN0T2Jq
ZWN0KGhkYywgcmVpbnRlcnByZXRfY2FzdDxIR0RJT0JKPihrZXkxKSk7CisgICAgRGVsZXRlREMo
aGRjKTsKK30KKwordm9pZCBTaGFyZWRCaXRtYXA6OmNsZWFyUGl4ZWxzKGNvbnN0IEludFJlY3Qm
IHJlY3QpCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50
UmVjdCBibXBSZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBibXBSZWN0LmludGVy
c2VjdChyZWN0KTsKKyAgICBpZiAoaXMxNmJpdCgpKSB7CisgICAgICAgIHVuc2lnbmVkIHcgPSBt
X2JtcEluZm8ucGFkZGVkV2lkdGgoKTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQqIGRzdCA9IHN0
YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0Kj4obV9waXhlbHMpOworICAgICAgICBkc3QgKz0gYm1w
UmVjdC55KCkgKiB3ICsgYm1wUmVjdC54KCk7CisgICAgICAgIGludCB3b3Jkc1RvU2V0ID0gYm1w
UmVjdC53aWR0aCgpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogZHN0RW5kID0gZHN0
ICsgYm1wUmVjdC5oZWlnaHQoKSAqIHc7CisgICAgICAgIHdoaWxlIChkc3QgPCBkc3RFbmQpIHsK
KyAgICAgICAgICAgIHdtZW1zZXQocmVpbnRlcnByZXRfY2FzdDx3Y2hhcl90Kj4oZHN0KSwgMCwg
d29yZHNUb1NldCk7CisgICAgICAgICAgICBkc3QgKz0gdzsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgdW5zaWduZWQgdyA9IHdpZHRoKCk7CisgICAgdW5zaWduZWQq
IGRzdCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkKj4obV9waXhlbHMpOworICAgIGRzdCArPSBibXBS
ZWN0LnkoKSAqIHcgKyBibXBSZWN0LngoKTsKKyAgICBpbnQgd29yZHNUb1NldCA9IGJtcFJlY3Qu
d2lkdGgoKSAqIDI7CisgICAgY29uc3QgdW5zaWduZWQqIGRzdEVuZCA9IGRzdCArIGJtcFJlY3Qu
aGVpZ2h0KCkgKiB3OworICAgIHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAgICAgICAgd21lbXNl
dChyZWludGVycHJldF9jYXN0PHdjaGFyX3QqPihkc3QpLCAwLCB3b3Jkc1RvU2V0KTsKKyAgICAg
ICAgZHN0ICs9IHc7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDA1ODRhCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaApAQCAtMCwwICsxLDE0NSBA
QAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgUGF0cmljayBHYW5zdGVy
ZXIgPHBhcm9nYUBwYXJvZ2EuY29tPgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAq
ICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAg
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBC
b3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFNoYXJlZEJpdG1hcF9o
CisjZGVmaW5lIFNoYXJlZEJpdG1hcF9oCisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIK
KyNpbmNsdWRlICJCaXRtYXBJbmZvLmgiCisjaW5jbHVkZSAiQ29sb3JTcGFjZS5oIgorI2luY2x1
ZGUgIkdyYXBoaWNzVHlwZXMuaCIKKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1
ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL093bkFycmF5UHRyLmg+CisjaW5j
bHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVk
ZSA8d2luZ2RpLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgRmxvYXRQb2ludDsK
K2NsYXNzIEZsb2F0UmVjdDsKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIEludFJlY3Q7
CitjbGFzcyBJbnRTaXplOworY2xhc3MgVHJhbnNmb3JtYXRpb25NYXRyaXg7CisKK2NsYXNzIFNo
YXJlZEJpdG1hcDogcHVibGljIFJlZkNvdW50ZWQ8U2hhcmVkQml0bWFwPiB7CitwdWJsaWM6Cisg
ICAgflNoYXJlZEJpdG1hcCgpOworICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4g
Y3JlYXRlKGNvbnN0IEludFNpemUmLCBCaXRtYXBJbmZvOjpCaXRDb3VudCA9IEJpdG1hcEluZm86
OkJpdENvdW50MzIsIGJvb2wgaW5pdFBpeGVscyA9IHRydWUpOworICAgIHN0YXRpYyBQYXNzUmVm
UHRyPFNoYXJlZEJpdG1hcD4gY3JlYXRlKGNvbnN0IFZlY3Rvcjx1bnNpZ25lZD4mLCBjb25zdCBJ
bnRTaXplJiwgYm9vbCBoYXNBbHBoYSA9IHRydWUpOworCisgICAgY29uc3QgQml0bWFwSW5mbyYg
Yml0bWFwSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mbzsgfQorICAgIHZvaWQqIGJ5dGVz
KCkgeyByZXR1cm4gbV9waXhlbHM7IH0KKyAgICBjb25zdCB2b2lkKiBieXRlcygpIGNvbnN0IHsg
cmV0dXJuIG1fcGl4ZWxzOyB9CisgICAgdW5zaWduZWQgd2lkdGgoKSBjb25zdCB7IHJldHVybiBt
X2JtcEluZm8ud2lkdGgoKTsgfQorICAgIHVuc2lnbmVkIGhlaWdodCgpIGNvbnN0IHsgcmV0dXJu
IG1fYm1wSW5mby5oZWlnaHQoKTsgfQorICAgIHVuc2lnbmVkIHZhbGlkSGVpZ2h0KCkgY29uc3Qg
eyByZXR1cm4gbV92YWxpZEhlaWdodDsgfQorICAgIHZvaWQgc2V0VmFsaWRIZWlnaHQodW5zaWdu
ZWQgdmFsaWRIZWlnaHQpIHsgbV92YWxpZEhlaWdodCA9IHZhbGlkSGVpZ2h0OyB9CisgICAgdm9p
ZCByZXNldFBpeGVscyhib29sIGJsYWNrID0gZmFsc2UpOworICAgIHZvaWQgY2xlYXJQaXhlbHMo
Y29uc3QgSW50UmVjdCYgcik7CisgICAgYm9vbCBsb2NrZWQoKSBjb25zdCB7IHJldHVybiBtX2xv
Y2tlZDsgfQorICAgIHZvaWQgbG9jaygpIHsgbV9sb2NrZWQgPSB0cnVlOyB9CisgICAgdm9pZCB1
bmxvY2soKSB7IG1fbG9ja2VkID0gZmFsc2U7IH0KKyAgICBib29sIGZyZWVNZW1vcnkoKTsKKyAg
ICBib29sIGlzMTZiaXQoKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8uaXMxNmJpdCgpOyB9Cisg
ICAgYm9vbCBpczMyYml0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmlzMzJiaXQoKTsgfQor
ICAgIGJvb2wgdG8xNmJpdCgpOworICAgIGJvb2wgaGFzQWxwaGEoKSBjb25zdCB7IHJldHVybiBt
X2hhc0FscGhhOyB9CisgICAgdm9pZCBzZXRIYXNBbHBoYShib29sIGFscGhhKSB7IG1faGFzQWxw
aGEgPSBhbHBoYTsgfQorICAgIGJvb2wgZW5zdXJlSGFuZGxlKCk7CisgICAgSEJJVE1BUCBnZXRI
YW5kbGUoKSB7IHJldHVybiBtX2hiaXRtYXAuZ2V0KCk7IH0KKyAgICBQYXNzT3duUHRyPEhCSVRN
QVA+IGNyZWF0ZUhhbmRsZSh2b2lkKiogcGl4ZWxzLCBCaXRtYXBJbmZvKiBibXBJbmZvLCBpbnQg
aCA9IC0xLCBib29sIHVzZTE2Yml0ID0gdHJ1ZSkgY29uc3Q7CisgICAgYm9vbCB1c2VzVHJhbnNw
YXJlbnRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdXNlc1RyYW5zcGFyZW50Q29sb3I7IH0KKyAg
ICBDT0xPUlJFRiB0cmFuc3BhcmVudENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV90cmFuc3BhcmVu
dENvbG9yOyB9CisgICAgdm9pZCBzZXRUcmFuc3BhcmVudENvbG9yKENPTE9SUkVGIGMpCisgICAg
eworICAgICAgICBtX3VzZXNUcmFuc3BhcmVudENvbG9yID0gdHJ1ZTsKKyAgICAgICAgbV90cmFu
c3BhcmVudENvbG9yID0gYzsKKyAgICB9CisgICAgYm9vbCBjYW5Vc2VESUJpdHMoKSBjb25zdCB7
IHJldHVybiAhaGFzQWxwaGEoKSAmJiAhdXNlc1RyYW5zcGFyZW50Q29sb3IoKTsgfQorCisgICAg
SEJJVE1BUCBjbGlwQml0bWFwKGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgdXNlQWxwaGEsIEJp
dG1hcEluZm8mIGJtcEluZm8sIHZvaWQqJiBwaXhlbHMpOworCisgICAgUGFzc1JlZlB0cjxTaGFy
ZWRCaXRtYXA+IGNsaXBCaXRtYXAoY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCB1c2VBbHBoYSk7
CisKKyAgICB2b2lkIGRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBJbnRSZWN0JiBk
c3RSZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFj
ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApOworICAgIHZvaWQgZHJhd1BhdHRlcm4o
R3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0
IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAg
Y29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbG9yU3BhY2Ugc3R5bGVDb2xvclNwYWNlLCBDb21w
b3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3QgSW50U2l6
ZSYgb3JpZ1NvdXJjZVNpemUpOworICAgIHZvaWQgZHJhdyhIREMsIGNvbnN0IEludFJlY3QmIGRz
dFJlY3QsIGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0
ZU9wKTsKKyAgICB2b2lkIGRyYXdQYXR0ZXJuKEhEQywgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiwg
Y29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRl
cm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNl
LCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0
IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKTsKKwor
ICAgIGNsYXNzIERDUHJvdmlkZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCBIREMg
Z2V0REMoU2hhcmVkQml0bWFwKiwgdW5zaWduZWQqKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJl
bGVhc2VEQyhTaGFyZWRCaXRtYXAqLCBIREMsIHVuc2lnbmVkKTsKKyAgICB9OworCisgICAgc3Rh
dGljIERDUHJvdmlkZXIqIHNfZGNQcm92aWRlcjsKKworICAgIEhEQyBnZXREQyh1bnNpZ25lZCog
a2V5MSkgeyByZXR1cm4gc19kY1Byb3ZpZGVyLT5nZXREQyh0aGlzLCBrZXkxKTsgfQorICAgIHZv
aWQgcmVsZWFzZURDKEhEQyBoZGMsIHVuc2lnbmVkIGtleTEpIHsgc19kY1Byb3ZpZGVyLT5yZWxl
YXNlREModGhpcywgaGRjLCBrZXkxKTsgfQorCisgICAgY2xhc3MgRENIb2xkZXIgeworICAgIHB1
YmxpYzoKKyAgICAgICAgRENIb2xkZXIoU2hhcmVkQml0bWFwKiBibXAgPSAwKSB7IHNldEludGVy
bmFsKGJtcCk7IH0KKyAgICAgICAgfkRDSG9sZGVyKCkgeyBjbGVhckludGVybmFsKCk7IH0KKyAg
ICAgICAgdm9pZCBzZXQoU2hhcmVkQml0bWFwKiBibXAgPSAwKQorICAgICAgICB7CisgICAgICAg
ICAgICBjbGVhckludGVybmFsKCk7CisgICAgICAgICAgICBzZXRJbnRlcm5hbChibXApOworICAg
ICAgICB9CisgICAgICAgIEhEQyBnZXQoKSBjb25zdCB7IHJldHVybiBtX2hkYzsgfQorICAgIHBy
aXZhdGU6CisgICAgICAgIERDSG9sZGVyJiBvcGVyYXRvcj0oY29uc3QgRENIb2xkZXImKTsKKyAg
ICAgICAgRENIb2xkZXIoY29uc3QgRENIb2xkZXImKTsKKyAgICAgICAgdm9pZCBjbGVhckludGVy
bmFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1faGRjKQorICAgICAgICAgICAgICAg
IG1fYml0bWFwLT5yZWxlYXNlREMobV9oZGMsIG1fa2V5KTsKKyAgICAgICAgfQorICAgICAgICB2
b2lkIHNldEludGVybmFsKFNoYXJlZEJpdG1hcCogYm1wKQorICAgICAgICB7CisgICAgICAgICAg
ICBtX2JpdG1hcCA9IGJtcDsKKyAgICAgICAgICAgIG1faGRjID0gYm1wID8gYm1wLT5nZXREQygm
bV9rZXkpIDogMDsKKyAgICAgICAgfQorICAgICAgICBTaGFyZWRCaXRtYXAqIG1fYml0bWFwOwor
ICAgICAgICBIREMgbV9oZGM7CisgICAgICAgIHVuc2lnbmVkIG1fa2V5OworICAgIH07CisKK3By
aXZhdGU6CisgICAgU2hhcmVkQml0bWFwKGNvbnN0IEludFNpemUmLCBCaXRtYXBJbmZvOjpCaXRD
b3VudCwgYm9vbCBpbml0UGl4ZWxzKTsKKyAgICBCaXRtYXBJbmZvIG1fYm1wSW5mbzsKKyAgICBP
d25QdHI8SEJJVE1BUD4gbV9oYml0bWFwOworICAgIHZvaWQqIG1fcGl4ZWxzOworICAgIE93bkFy
cmF5UHRyPHVuc2lnbmVkPiBtX3BpeGVsRGF0YTsKKyAgICBDT0xPUlJFRiBtX3RyYW5zcGFyZW50
Q29sb3I7CisgICAgaW50IG1fdmFsaWRIZWlnaHQ7CisgICAgYm9vbCBtX2xvY2tlZDsKKyAgICBi
b29sIG1fdXNlc1RyYW5zcGFyZW50Q29sb3I7CisgICAgYm9vbCBtX2hhc0FscGhhOworfTsKKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gU2hhcmVkQml0bWFwX2gKXCBObyBu
ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==
</data>
<flag name="review"
          id="63136"
          type_id="1"
          status="+"
          setter="aroben"
    />
    <flag name="commit-queue"
          id="63137"
          type_id="3"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72819</attachid>
            <date>2010-11-03 07:07:10 -0700</date>
            <delta_ts>2010-11-03 07:40:26 -0700</delta_ts>
            <desc>1) SharedBitmap</desc>
            <filename>bug-28272d.patch</filename>
            <type>text/plain</type>
            <size>33345</size>
            <attacher name="Patrick R. Gansterer">paroga</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZDMwY2E3Yy4uMzNkOTZmZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0OSBAQAorMjAxMC0xMS0wMyAgUGF0cmljayBHYW5z
dGVyZXIgIDxwYXJvZ2FAd2Via2l0Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBbV0lOQ0VdIEFkZCBTaGFyZWRCaXRtYXAKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI4MjcyCisKKyAgICAgICAgU2hh
cmVkQml0bWFwIGlzIGEgaGVscGVyIGNsYXNzIHVzZWQgYXMgTmF0aXZlSW1hZ2VQdHIgZm9yIFdp
bkNFLgorICAgICAgICBJdCdzIHdpZGUgdXNlZCBieSBXaW5DRSBncmFwaGljcyBmaWxlcyBhcyBh
IHJlcGxhY2VtZW50IG9mIEhCSVRNQVAuCisKKyAgICAgICAgT3JpZ2luYWxseSB3cml0dGVuIGJ5
IFlvbmcgTGkgPHlvbmcubGlAdG9yY2htb2JpbGUuY29tPi4KKworICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL0dyYXBoaWNzQ29udGV4dFdpbkNFLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OlRyYW5zcGFyZW50TGF5ZXJEQzo6VHJhbnNwYXJlbnRMYXllckRDKToKKyAgICAgICAgKFdl
YkNvcmU6OlRyYW5zcGFyZW50TGF5ZXJEQzo6flRyYW5zcGFyZW50TGF5ZXJEQyk6CisgICAgICAg
IChXZWJDb3JlOjpTY29wZURDUHJvdmlkZXI6OlNjb3BlRENQcm92aWRlcik6CisgICAgICAgIChX
ZWJDb3JlOjpTY29wZURDUHJvdmlkZXI6On5TY29wZURDUHJvdmlkZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3VGV4dCk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpT
aGFyZWRCaXRtYXA6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OlNo
YXJlZEJpdG1hcCk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6On5TaGFyZWRCaXRt
YXApOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpyZXNldFBpeGVscyk6CisgICAg
ICAgIChXZWJDb3JlOjpjb252ZXJ0MzJUbzE2KToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJp
dG1hcDo6dG8xNmJpdCk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRCaXRtYXA6OmZyZWVNZW1v
cnkpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpjcmVhdGVIYW5kbGUpOgorICAg
ICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjplbnN1cmVIYW5kbGUpOgorICAgICAgICAoV2Vi
Q29yZTo6U2hhcmVkQml0bWFwOjpkcmF3KToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1h
cDo6Y2xpcEJpdG1hcCk6CisgICAgICAgIChXZWJDb3JlOjpkcmF3UGF0dGVyblNpbXBsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpub3JtYWxpemVQaGFzZSk6CisgICAgICAgIChXZWJDb3JlOjpTaGFy
ZWRCaXRtYXA6OmRyYXdQYXR0ZXJuKToKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJpdG1hcDo6
RENQcm92aWRlcjo6Z2V0REMpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpEQ1By
b3ZpZGVyOjpyZWxlYXNlREMpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkQml0bWFwOjpjbGVh
clBpeGVscyk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFw
Lmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6Z2V0REMpOgorICAgICAg
ICAoV2ViQ29yZTo6RENQcm92aWRlcjo6cmVsZWFzZURDKToKKyAgICAgICAgKFdlYkNvcmU6OkRD
UHJvdmlkZXI6OkRDSG9sZGVyOjpEQ0hvbGRlcik6CisgICAgICAgIChXZWJDb3JlOjpEQ1Byb3Zp
ZGVyOjpEQ0hvbGRlcjo6fkRDSG9sZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkRDUHJvdmlkZXI6
OkRDSG9sZGVyOjpzZXQpOgorICAgICAgICAoV2ViQ29yZTo6RENQcm92aWRlcjo6RENIb2xkZXI6
OmdldCk6CisgICAgICAgIChXZWJDb3JlOjpEQ1Byb3ZpZGVyOjpEQ0hvbGRlcjo6Y2xlYXJJbnRl
cm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpEQ1Byb3ZpZGVyOjpEQ0hvbGRlcjo6c2V0SW50ZXJu
YWwpOgorCiAyMDEwLTExLTAzICBab2x0YW4gSGVyY3plZyAgPHpoZXJjemVnQHdlYmtpdC5vcmc+
CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGlyayBTY2h1bHplLgpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9HcmFwaGljc0NvbnRleHRXaW5DRS5jcHAgYi9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL0dyYXBoaWNzQ29udGV4dFdpbkNFLmNwcAppbmRl
eCA4NTE5MmU1Li4yZTBmMmE2IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL0dyYXBoaWNzQ29udGV4dFdpbkNFLmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbmNlL0dyYXBoaWNzQ29udGV4dFdpbkNFLmNwcApAQCAtNDU4LDE0ICs0NTgsMTMg
QEAgcHJpdmF0ZToKICAgICBSZWZQdHI8U2hhcmVkQml0bWFwPiBtX2JpdG1hcDsKICAgICBSZWZQ
dHI8U2hhcmVkQml0bWFwPiBtX3JvdGF0ZWRCaXRtYXA7CiAgICAgUkVDVCBtX2JtcFJlY3Q7Ci0g
ICAgdW5zaWduZWQgbV9rZXkxOwotICAgIHVuc2lnbmVkIG1fa2V5MjsKKyAgICB1bnNpZ25lZCBt
X2tleTsKICAgICBSb3RhdGlvblRyYW5zZm9ybSBtX3JvdGF0aW9uOwogICAgIGZsb2F0IG1fb2xk
T3BhY2l0eTsKICAgICBBbHBoYVBhaW50VHlwZSBtX2FscGhhUGFpbnRUeXBlOwogfTsKIAotVHJh
bnNwYXJlbnRMYXllckRDOjpUcmFuc3BhcmVudExheWVyREMoR3JhcGhpY3NDb250ZXh0UGxhdGZv
cm1Qcml2YXRlKiBkYXRhLCBJbnRSZWN0JiBvcmlnUmVjdCwgY29uc3QgSW50UmVjdCogcmVjdEJl
Zm9yZVRyYW5zZm9ybSwgaW50IGFscGhhLCBib29sIHBhaW50SW1hZ2UpCitUcmFuc3BhcmVudExh
eWVyREM6OlRyYW5zcGFyZW50TGF5ZXJEQyhHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUq
IGRhdGEsIEludFJlY3QmIG9yaWdSZWN0LCBjb25zdCBJbnRSZWN0KiByZWN0QmVmb3JlVHJhbnNm
b3JtLCBpbnQgYWxwaGEsIGJvb2wgcGFpbnRJbWFnZSwgYm9vbCBwYWludEdyYWRpZW50KQogOiBt
X2RhdGEoZGF0YSkKICwgbV9vcmlnUmVjdChvcmlnUmVjdCkKICwgbV9vbGRPcGFjaXR5KGRhdGEt
Pm1fb3BhY2l0eSkKQEAgLTUyNyw3ICs1MjYsNyBAQCBUcmFuc3BhcmVudExheWVyREM6OlRyYW5z
cGFyZW50TGF5ZXJEQyhHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUqIGRhdGEsIEludAog
ICAgIH0gZWxzZQogICAgICAgICBtX2JpdG1hcCA9IG1fZGF0YS0+Z2V0VHJhbnNwYXJlbnRMYXll
ckJpdG1hcChtX29yaWdSZWN0LCBtX2FscGhhUGFpbnRUeXBlLCBtX2JtcFJlY3QsIHRydWUsIG11
c3RDcmVhdGVMYXllcik7CiAgICAgaWYgKG1fYml0bWFwKQotICAgICAgICBtX21lbURjID0gbV9i
aXRtYXAtPmdldERDKCZtX2tleTEsICZtX2tleTIpOworICAgICAgICBtX21lbURjID0gbV9iaXRt
YXAtPmdldERDKCZtX2tleSk7CiAgICAgZWxzZQogICAgICAgICBtX21lbURjID0gbV9kYXRhLT5t
X2RjOwogfQpAQCAtNTM1LDE1ICs1MzQsMTUgQEAgVHJhbnNwYXJlbnRMYXllckRDOjpUcmFuc3Bh
cmVudExheWVyREMoR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKiBkYXRhLCBJbnQKIFRy
YW5zcGFyZW50TGF5ZXJEQzo6flRyYW5zcGFyZW50TGF5ZXJEQygpCiB7CiAgICAgaWYgKG1fcm90
YXRlZEJpdG1hcCkgewotICAgICAgICBtX2JpdG1hcC0+cmVsZWFzZURDKG1fbWVtRGMsIG1fa2V5
MSwgbV9rZXkyKTsKLSAgICAgICAgbV9rZXkxID0gbV9rZXkyID0gMDsKKyAgICAgICAgbV9iaXRt
YXAtPnJlbGVhc2VEQyhtX21lbURjLCBtX2tleSk7CisgICAgICAgIG1fa2V5ID0gMDsKICAgICAg
ICAgcm90YXRlQml0bWFwKG1fcm90YXRlZEJpdG1hcC5nZXQoKSwgbV9iaXRtYXAuZ2V0KCksIG1f
cm90YXRpb24pOwotICAgICAgICBtX21lbURjID0gbV9yb3RhdGVkQml0bWFwLT5nZXREQygmbV9r
ZXkxLCAmbV9rZXkyKTsKKyAgICAgICAgbV9tZW1EYyA9IG1fcm90YXRlZEJpdG1hcC0+Z2V0REMo
Jm1fa2V5KTsKICAgICAgICAgbV9kYXRhLT5wYWludEJhY2tUcmFuc3BhcmVudExheWVyQml0bWFw
KG1fbWVtRGMsIG1fcm90YXRlZEJpdG1hcC5nZXQoKSwgbV9yb3RhdGVkT3JpZ1JlY3QsIG1fYWxw
aGFQYWludFR5cGUsIG1fYm1wUmVjdCk7Ci0gICAgICAgIG1fcm90YXRlZEJpdG1hcC0+cmVsZWFz
ZURDKG1fbWVtRGMsIG1fa2V5MSwgbV9rZXkyKTsKKyAgICAgICAgbV9yb3RhdGVkQml0bWFwLT5y
ZWxlYXNlREMobV9tZW1EYywgbV9rZXkpOwogICAgIH0gZWxzZSBpZiAobV9iaXRtYXApIHsKICAg
ICAgICAgbV9kYXRhLT5wYWludEJhY2tUcmFuc3BhcmVudExheWVyQml0bWFwKG1fbWVtRGMsIG1f
Yml0bWFwLmdldCgpLCBtX29yaWdSZWN0LCBtX2FscGhhUGFpbnRUeXBlLCBtX2JtcFJlY3QpOwot
ICAgICAgICBtX2JpdG1hcC0+cmVsZWFzZURDKG1fbWVtRGMsIG1fa2V5MSwgbV9rZXkyKTsKKyAg
ICAgICAgbV9iaXRtYXAtPnJlbGVhc2VEQyhtX21lbURjLCBtX2tleSk7CiAgICAgfQogICAgIG1f
ZGF0YS0+bV9vcGFjaXR5ID0gbV9vbGRPcGFjaXR5OwogfQpAQCAtNTY3LDE5ICs1NjYsMTggQEAg
cHVibGljOgogICAgICAgICA6IG1fZGF0YShkYXRhKQogICAgIHsKICAgICAgICAgaWYgKG1fZGF0
YS0+bV9iaXRtYXApCi0gICAgICAgICAgICBtX2RhdGEtPm1fZGMgPSBtX2RhdGEtPm1fYml0bWFw
LT5nZXREQygmbV9rZXkxLCAmbV9rZXkyKTsKKyAgICAgICAgICAgIG1fZGF0YS0+bV9kYyA9IG1f
ZGF0YS0+bV9iaXRtYXAtPmdldERDKCZtX2tleSk7CiAgICAgfQogICAgIH5TY29wZURDUHJvdmlk
ZXIoKQogICAgIHsKICAgICAgICAgaWYgKG1fZGF0YS0+bV9iaXRtYXApIHsKLSAgICAgICAgICAg
IG1fZGF0YS0+bV9iaXRtYXAtPnJlbGVhc2VEQyhtX2RhdGEtPm1fZGMsIG1fa2V5MSwgbV9rZXky
KTsKKyAgICAgICAgICAgIG1fZGF0YS0+bV9iaXRtYXAtPnJlbGVhc2VEQyhtX2RhdGEtPm1fZGMs
IG1fa2V5KTsKICAgICAgICAgICAgIG1fZGF0YS0+bV9kYyA9IDA7CiAgICAgICAgIH0KICAgICB9
CiBwcml2YXRlOgogICAgIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSogbV9kYXRhOwot
ICAgIHVuc2lnbmVkIG1fa2V5MTsKLSAgICB1bnNpZ25lZCBtX2tleTI7CisgICAgdW5zaWduZWQg
bV9rZXk7CiB9OwogCiAKQEAgLTE1NjEsMTEgKzE1NTksMTEgQEAgdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmRyYXdUZXh0KGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3Qg
SW50UG8KICAgICAgICAgICAgIGdjLnNjYWxlKEZsb2F0U2l6ZShtX2RhdGEtPm1fdHJhbnNmb3Jt
LmEoKSwgbV9kYXRhLT5tX3RyYW5zZm9ybS5kKCkpKTsKICAgICAgICAgICAgIGZvbnQuZHJhd1Rl
eHQoJmdjLCBydW4sIEludFBvaW50KDAsIGZvbnQuYXNjZW50KCkpLCBmcm9tLCB0byk7CiAgICAg
ICAgIH0KLSAgICAgICAgdW5zaWduZWQga2V5MSwga2V5MjsKLSAgICAgICAgSERDIG1lbURDID0g
Ym1wLT5nZXREQygma2V5MSwgJmtleTIpOworICAgICAgICB1bnNpZ25lZCBrZXkxOworICAgICAg
ICBIREMgbWVtREMgPSBibXAtPmdldERDKCZrZXkxKTsKICAgICAgICAgaWYgKG1lbURDKSB7CiAg
ICAgICAgICAgICBtX2RhdGEtPnBhaW50QmFja1RyYW5zcGFyZW50TGF5ZXJCaXRtYXAobWVtREMs
IGJtcC5nZXQoKSwgdHJSZWN0LCBhbHBoYVBhaW50VHlwZSwgYm1wUmVjdCk7Ci0gICAgICAgICAg
ICBibXAtPnJlbGVhc2VEQyhtZW1EQywga2V5MSwga2V5Mik7CisgICAgICAgICAgICBibXAtPnJl
bGVhc2VEQyhtZW1EQywga2V5MSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvU2hhcmVkQml0bWFwLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi4xNTMzZDlmCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuY3BwCkBAIC0wLDAgKzEsNjE1IEBA
CisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogIENvcHlyaWdodCAoQykgMjAxMCBQYXRyaWNrIEdhbnN0ZXJl
ciA8cGFyb2dhQHBhcm9nYS5jb20+CisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJTaGFyZWRCaXRtYXAuaCIKKworI2luY2x1ZGUgIkdESUV4dHJhcy5oIgorI2luY2x1
ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzVHlwZXMuaCIKKyNpbmNs
dWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgIldpbkNFR3JhcGhpY3NFeHRy
YXMuaCIKKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVk
TGVha0NvdW50ZXIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093bkFycmF5UHRyLmg+CisjaW5jbHVk
ZSA8d3RmL093blB0ci5oPgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKKyNpZm5kZWYgTkRFQlVHCitzdGF0aWMgV1RGOjpSZWZDb3VudGVkTGVha0NvdW50
ZXIgc2hhcmVkQml0bWFwTGVha0NvdW50ZXIoIlNoYXJlZEJpdG1hcCIpOworI2VuZGlmCisKKwor
UGFzc1JlZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJlZEJpdG1hcDo6Y3JlYXRlKGNvbnN0IEludFNp
emUmIHNpemUsIEJpdG1hcEluZm86OkJpdENvdW50IGJpdENvdW50LCBib29sIGluaXRQaXhlbHMp
Cit7CisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gcmVzdWx0YW50Qml0bWFwID0gYWRvcHRSZWYo
bmV3IFNoYXJlZEJpdG1hcChzaXplLCBiaXRDb3VudCwgaW5pdFBpeGVscykpOworICAgIGlmIChy
ZXN1bHRhbnRCaXRtYXAgJiYgIXJlc3VsdGFudEJpdG1hcC0+Ynl0ZXMoKSkKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgcmV0dXJuIHJlc3VsdGFudEJpdG1hcC5yZWxlYXNlKCk7Cit9CisKK1Bhc3NS
ZWZQdHI8U2hhcmVkQml0bWFwPiBTaGFyZWRCaXRtYXA6OmNyZWF0ZShjb25zdCBWZWN0b3I8dW5z
aWduZWQ+JiBkYXRhLCBjb25zdCBJbnRTaXplJiBzaXplLCBib29sIGhhc0FscGhhKQoreworICAg
IFJlZlB0cjxTaGFyZWRCaXRtYXA+IHJlc3VsdCA9IGNyZWF0ZShzaXplLCBCaXRtYXBJbmZvOjpC
aXRDb3VudDMyLCBmYWxzZSk7CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJldHVybiAwOwor
ICAgIG1lbWNweShyZXN1bHQtPmJ5dGVzKCksIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSAqIHNp
emVvZih1bnNpZ25lZCkpOworICAgIHJlc3VsdC0+c2V0SGFzQWxwaGEoaGFzQWxwaGEpOworICAg
IHJldHVybiByZXN1bHQucmVsZWFzZSgpOworfQorCitTaGFyZWRCaXRtYXA6OlNoYXJlZEJpdG1h
cChjb25zdCBJbnRTaXplJiBzaXplLCBCaXRtYXBJbmZvOjpCaXRDb3VudCBiaXRDb3VudCwgYm9v
bCBpbml0UGl4ZWxzKQorICAgIDogbV9ibXBJbmZvKEJpdG1hcEluZm86OmNyZWF0ZUJvdHRvbVVw
KHNpemUsIGJpdENvdW50KSkKKyAgICAsIG1fbG9ja2VkKGZhbHNlKQorICAgICwgbV91c2VzVHJh
bnNwYXJlbnRDb2xvcihmYWxzZSkKKyAgICAsIG1fdHJhbnNwYXJlbnRDb2xvcihSR0IoMCwgMCwg
MCkpCisgICAgLCBtX3BpeGVscygwKQorICAgICwgbV9oYXNBbHBoYShmYWxzZSkKKyAgICAsIG1f
dmFsaWRIZWlnaHQoYWJzKHNpemUuaGVpZ2h0KCkpKQorICAgICwgbV9oYml0bWFwKDApCit7Cisj
aWZuZGVmIE5ERUJVRworICAgIHNoYXJlZEJpdG1hcExlYWtDb3VudGVyLmluY3JlbWVudCgpOwor
I2VuZGlmCisKKyAgICB1bnNpZ25lZCBidWZmZXJTaXplID0gbV9ibXBJbmZvLm51bVBpeGVscygp
OworICAgIGlmIChiaXRDb3VudCA9PSBCaXRtYXBJbmZvOjpCaXRDb3VudDE2KQorICAgICAgICBi
dWZmZXJTaXplIC89IDI7CisKKyAgICBtX3BpeGVsRGF0YSA9IGFkb3B0QXJyYXlQdHIobmV3IHVu
c2lnbmVkW2J1ZmZlclNpemVdKTsKKyAgICBtX3BpeGVscyA9IG1fcGl4ZWxEYXRhLmdldCgpOwor
CisgICAgaWYgKGluaXRQaXhlbHMpCisgICAgICAgIHJlc2V0UGl4ZWxzKCk7Cit9CisKK1NoYXJl
ZEJpdG1hcDo6flNoYXJlZEJpdG1hcCgpCit7CisjaWZuZGVmIE5ERUJVRworICAgIHNoYXJlZEJp
dG1hcExlYWtDb3VudGVyLmRlY3JlbWVudCgpOworI2VuZGlmCit9CisKK3ZvaWQgU2hhcmVkQml0
bWFwOjpyZXNldFBpeGVscyhib29sIGJsYWNrKQoreworICAgIGlmICghbV9waXhlbHMpCisgICAg
ICAgIHJldHVybjsKKworICAgIHVuc2lnbmVkIGJ1ZmZlclNpemUgPSBtX2JtcEluZm8ubnVtUGl4
ZWxzKCk7CisgICAgaWYgKGJsYWNrKSB7CisgICAgICAgIHVuc2lnbmVkIGJ1ZmZlclNpemVJbkJ5
dGVzID0gYnVmZmVyU2l6ZSAqIChpczE2Yml0KCkgPyAyIDogNCk7CisgICAgICAgIG1lbXNldCht
X3BpeGVscywgMCwgYnVmZmVyU2l6ZUluQnl0ZXMpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgaWYgKGlzMTZiaXQoKSkgeworICAgICAgICAvLyBGaWxsIGl0IHdpdGggd2hpdGUgY29s
b3IKKyAgICAgICAgd21lbXNldChzdGF0aWNfY2FzdDx3Y2hhcl90Kj4obV9waXhlbHMpLCAweEZG
RkYsIGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTWFrZSBp
dCB3aGl0ZSBidXQgdHJhbnNwYXJlbnQKKyAgICB1bnNpZ25lZCogcGl4ZWwgPSBzdGF0aWNfY2Fz
dDx1bnNpZ25lZCo+KG1fcGl4ZWxzKTsKKyAgICBjb25zdCB1bnNpZ25lZCogYnVmZmVyRW5kID0g
cGl4ZWwgKyBidWZmZXJTaXplOworICAgIHdoaWxlIChwaXhlbCA8IGJ1ZmZlckVuZCkKKyAgICAg
ICAgKnBpeGVsKysgPSAweDAwRkZGRkZGOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNo
b3J0IGNvbnZlcnQzMlRvMTYodW5zaWduZWQgcGl4ZWwpCit7CisgICAgdW5zaWduZWQgc2hvcnQg
ciA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PigocGl4ZWwgJiAweDAwRjgwMDAwKSA+PiA4
KTsKKyAgICB1bnNpZ25lZCBzaG9ydCBnID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KChw
aXhlbCAmIDB4MDAwMEZDMDApID4+IDUpOworICAgIHVuc2lnbmVkIHNob3J0IGIgPSBzdGF0aWNf
Y2FzdDx1bnNpZ25lZCBzaG9ydD4oKHBpeGVsICYgMHgwMDAwMDBGOCkgPj4gMyk7CisgICAgcmV0
dXJuIHIgfCBnIHwgYjsKK30KKworYm9vbCBTaGFyZWRCaXRtYXA6OnRvMTZiaXQoKQoreworICAg
IGlmIChtX2xvY2tlZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChpczE2Yml0KCkp
CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgQml0bWFwSW5mbyBuZXdCbXBJbmZvID0gQml0
bWFwSW5mbzo6Y3JlYXRlKG1fYm1wSW5mby5zaXplKCksIEJpdG1hcEluZm86OkJpdENvdW50MTYp
OworCisgICAgaW50IHdpZHRoID0gbmV3Qm1wSW5mby53aWR0aCgpOworICAgIGludCBwYWRkZWRX
aWR0aCA9IG5ld0JtcEluZm8ucGFkZGVkV2lkdGgoKTsKKyAgICBpbnQgYnVmZmVyU2l6ZSA9IHBh
ZGRlZFdpZHRoICogbmV3Qm1wSW5mby5oZWlnaHQoKTsKKyAgICBPd25BcnJheVB0cjx1bnNpZ25l
ZD4gbmV3UGl4ZWxEYXRhKG5ldyB1bnNpZ25lZFtidWZmZXJTaXplIC8gMl0pOworICAgIHZvaWQq
IG5ld1BpeGVscyA9IG5ld1BpeGVsRGF0YS5nZXQoKTsKKworICAgIGlmICghbmV3UGl4ZWxzKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBzaG9ydCogcDE2ID0gc3RhdGlj
X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihuZXdQaXhlbHMpOworICAgIGNvbnN0IHVuc2lnbmVkKiBw
MzIgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCo+KG1fcGl4ZWxzKTsKKworICAgIGJvb2wg
c2tpcHMgPSBwYWRkZWRXaWR0aCAhPSB3aWR0aDsKKworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0
KiBwMTZlbmQgPSBwMTYgKyBidWZmZXJTaXplOworICAgIHdoaWxlIChwMTYgPCBwMTZlbmQpIHsK
KyAgICAgICAgZm9yICh1bnNpZ25lZCBzaG9ydCogcDE2bGluZUVuZCA9IHAxNiArIHdpZHRoOyBw
MTYgPCBwMTZsaW5lRW5kOyApCisgICAgICAgICAgICAqcDE2KysgPSBjb252ZXJ0MzJUbzE2KCpw
MzIrKyk7CisKKyAgICAgICAgaWYgKHNraXBzKQorICAgICAgICAgICAgKnAxNisrID0gMDsKKyAg
ICB9CisKKyAgICBpZiAobV9oYml0bWFwKQorICAgICAgICBtX2hiaXRtYXAgPSBudWxscHRyOwor
ICAgIGVsc2UKKyAgICAgICAgbV9waXhlbERhdGEgPSBuZXdQaXhlbERhdGEucmVsZWFzZSgpOwor
CisgICAgbV9waXhlbHMgPSBuZXdQaXhlbHM7CisgICAgbV9ibXBJbmZvID0gbmV3Qm1wSW5mbzsK
KworICAgIHNldEhhc0FscGhhKGZhbHNlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBT
aGFyZWRCaXRtYXA6OmZyZWVNZW1vcnkoKQoreworICAgIGlmIChtX2xvY2tlZCkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1faGJpdG1hcCkgeworICAgICAgICBtX2hiaXRtYXAg
PSBudWxscHRyOworICAgICAgICBtX3BpeGVscyA9IDA7CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKworICAgIGlmIChtX3BpeGVscykgeworICAgICAgICBtX3BpeGVsRGF0YSA9IG51bGxw
dHI7CisgICAgICAgIG1fcGl4ZWxzID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitQYXNzT3duUHRyPEhCSVRNQVA+IFNoYXJlZEJpdG1h
cDo6Y3JlYXRlSGFuZGxlKHZvaWQqKiBwaXhlbHMsIEJpdG1hcEluZm8qIGJtcEluZm8sIGludCBo
ZWlnaHQsIGJvb2wgdXNlMTZiaXQpIGNvbnN0Cit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBpZiAoaGVpZ2h0ID09IC0xKQorICAgICAgICBoZWlnaHQgPSB0
aGlzLT5oZWlnaHQoKTsKKyAgICAqYm1wSW5mbyA9IEJpdG1hcEluZm86OmNyZWF0ZUJvdHRvbVVw
KEludFNpemUod2lkdGgoKSwgaGVpZ2h0KSwgKHVzZTE2Yml0IHx8IGlzMTZiaXQoKSkgPyBCaXRt
YXBJbmZvOjpCaXRDb3VudDE2IDogQml0bWFwSW5mbzo6Qml0Q291bnQzMik7CisKKyAgICBPd25Q
dHI8SEJJVE1BUD4gaGJtcCA9IGFkb3B0UHRyKENyZWF0ZURJQlNlY3Rpb24oMCwgYm1wSW5mbywg
RElCX1JHQl9DT0xPUlMsIHBpeGVscywgMCwgMCkpOworCisgICAgaWYgKCFoYm1wKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIE93blB0cjxIREM+IGJtcERDID0gYWRvcHRQdHIoQ3JlYXRlQ29t
cGF0aWJsZURDKDApKTsKKyAgICBIR0RJT0JKIGhPbGRCbXAgPSBTZWxlY3RPYmplY3QoYm1wREMu
Z2V0KCksIGhibXAuZ2V0KCkpOworCisgICAgU3RyZXRjaERJQml0cyhibXBEQy5nZXQoKSwgMCwg
MCwgd2lkdGgoKSwgaGVpZ2h0LCAwLCAwLCB3aWR0aCgpLCBoZWlnaHQsIG1fcGl4ZWxzLCAmbV9i
bXBJbmZvLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAgICBTZWxlY3RPYmplY3QoYm1w
REMuZ2V0KCksIGhPbGRCbXApOworCisgICAgcmV0dXJuIGhibXAucmVsZWFzZSgpOworfQorCiti
b29sIFNoYXJlZEJpdG1hcDo6ZW5zdXJlSGFuZGxlKCkKK3sKKyAgICBpZiAobV9oYml0bWFwKQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGlmIChtX2xvY2tlZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgQml0bWFwSW5mbyBibXBJbmZvOworICAgIHZvaWQqIHBpeGVsczsKKyAgICBtX2hiaXRtYXAg
PSBjcmVhdGVIYW5kbGUoJnBpeGVscywgJmJtcEluZm8sIC0xLCAhaGFzQWxwaGEoKSk7CisKKyAg
ICBpZiAoIW1faGJpdG1hcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbV9waXhlbERh
dGEgPSBudWxscHRyOworICAgIG1fcGl4ZWxzID0gcGl4ZWxzOworICAgIG1fYm1wSW5mbyA9IGJt
cEluZm87CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTaGFyZWRCaXRtYXA6OmRyYXco
R3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRS
ZWN0JiBzcmNSZWN0LCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0
b3IgY29tcG9zaXRlT3ApCit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOwor
ICAgIGN0eHQtPmRyYXdCaXRtYXAodGhpcywgZHN0UmVjdCwgc3JjUmVjdCwgc3R5bGVDb2xvclNw
YWNlLCBjb21wb3NpdGVPcCk7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpkcmF3KEhEQyBoZGMs
IGNvbnN0IEludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0
ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJl
dHVybjsKKworICAgIGlmIChkc3RSZWN0LmlzRW1wdHkoKSB8fCBzcmNSZWN0LmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgSEJJVE1BUCBoYml0bWFwID0gMDsKKyAgICBPd25QdHI8
SEJJVE1BUD4gaFRlbXBCaXRtYXA7CisgICAgYm9vbCB1c2luZ0hhbmRsZSA9IGNvbXBvc2l0ZU9w
ID09IENvbXBvc2l0ZVNvdXJjZU92ZXIgJiYgKGhhc0FscGhhKCkgJiYgaGFzQWxwaGFCbGVuZFN1
cHBvcnQoKSB8fCB1c2VzVHJhbnNwYXJlbnRDb2xvcigpKTsKKworICAgIGlmICh1c2luZ0hhbmRs
ZSkgeworICAgICAgICBpZiAoZW5zdXJlSGFuZGxlKCkpCisgICAgICAgICAgICBoYml0bWFwID0g
bV9oYml0bWFwLmdldCgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHZvaWQqIHBpeGVs
czsKKyAgICAgICAgICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICAgICAgICAgIGhUZW1wQml0
bWFwID0gY3JlYXRlSGFuZGxlKCZwaXhlbHMsICZibXBJbmZvLCAtMSwgdXNlc1RyYW5zcGFyZW50
Q29sb3IoKSk7CisgICAgICAgICAgICBoYml0bWFwID0gaFRlbXBCaXRtYXAuZ2V0KCk7CisgICAg
ICAgIH0KKyAgICB9CisgICAgaWYgKCFoYml0bWFwKSB7CisgICAgICAgIC8vIEZJWE1FOiBoYW5k
bGUgb3RoZXIgY29tcG9zaXRlIG9wZXJhdGlvbiB0eXBlcz8KKyAgICAgICAgRFdPUkQgcm9wID0g
Y29tcG9zaXRlT3AgPT0gQ29tcG9zaXRlQ29weSA/IFNSQ0NPUFkKKyAgICAgICAgICAgIDogY29t
cG9zaXRlT3AgPT0gQ29tcG9zaXRlWE9SID8gUEFUSU5WRVJUCisgICAgICAgICAgICA6IGNvbXBv
c2l0ZU9wID09IENvbXBvc2l0ZUNsZWFyID8gV0hJVEVORVNTCisgICAgICAgICAgICA6IFNSQ0NP
UFk7CisKKyAgICAgICAgU3RyZXRjaERJQml0cyhoZGMsIGRzdFJlY3QueCgpLCBkc3RSZWN0Lnko
KSwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgpLAorICAgICAgICAgICAgc3JjUmVj
dC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksIG1f
cGl4ZWxzLCAmbV9ibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgcm9wKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIE93blB0cjxIREM+IGhtZW1kYyA9IGFkb3B0UHRyKENyZWF0ZUNvbXBh
dGlibGVEQyhoZGMpKTsKKyAgICBIR0RJT0JKIGhPbGRCbXAgPSBTZWxlY3RPYmplY3QoaG1lbWRj
LmdldCgpLCBoYml0bWFwKTsKKworICAgIGlmICghdXNlc1RyYW5zcGFyZW50Q29sb3IoKSAmJiBo
YXNBbHBoYUJsZW5kU3VwcG9ydCgpKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBCTEVOREZVTkNU
SU9OIGJsZW5kID0geyBBQ19TUkNfT1ZFUiwgMCwgMjU1LCBBQ19TUkNfQUxQSEEgfTsKKyAgICAg
ICAgYm9vbCBzdWNjZXNzID0gYWxwaGFCbGVuZElmU3VwcG9ydGVkKGhkYywgZHN0UmVjdC54KCks
IGRzdFJlY3QueSgpLCBkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCksIGhtZW1kYy5n
ZXQoKSwKKyAgICAgICAgICAgIHNyY1JlY3QueCgpLCBzcmNSZWN0LnkoKSwgc3JjUmVjdC53aWR0
aCgpLCBzcmNSZWN0LmhlaWdodCgpLCBibGVuZCk7CisgICAgICAgIEFTU0VSVF9VTlVTRUQoc3Vj
Y2Vzcywgc3VjY2Vzcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVHJhbnNwYXJlbnRCbHQoaGRj
LCBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWln
aHQoKSwgaG1lbWRjLmdldCgpLAorICAgICAgICAgICAgc3JjUmVjdC54KCksIHNyY1JlY3QueSgp
LCBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCksIHRyYW5zcGFyZW50Q29sb3IoKSk7
CisgICAgfQorCisgICAgU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgaE9sZEJtcCk7Cit9CisK
K1Bhc3NPd25QdHI8SEJJVE1BUD4gU2hhcmVkQml0bWFwOjpjbGlwQml0bWFwKGNvbnN0IEludFJl
Y3QmIHJlY3QsIGJvb2wgdXNlQWxwaGEsIEJpdG1hcEluZm8mIGJtcEluZm8sIHZvaWQqJiBwaXhl
bHMpCit7CisgICAgaWYgKCFieXRlcygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGludCBv
bGRXaWR0aCA9IHdpZHRoKCk7CisgICAgaW50IG9sZEhlaWdodCA9IGhlaWdodCgpOworICAgIGlu
dCBjb3B5V2lkdGggPSBzdGQ6Om1pbjxpbnQ+KHJlY3Qud2lkdGgoKSwgb2xkV2lkdGggLSByZWN0
LngoKSk7CisgICAgaW50IGNvcHlIZWlnaHQgPSBzdGQ6Om1pbjxpbnQ+KHJlY3QuaGVpZ2h0KCks
IG9sZEhlaWdodCAtIHJlY3QueSgpKTsKKyAgICBpZiAoIWNvcHlXaWR0aCB8fCAhY29weUhlaWdo
dCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBibXBJbmZvID0gQml0bWFwSW5mbzo6Y3JlYXRl
Qm90dG9tVXAoSW50U2l6ZShjb3B5V2lkdGgsIGNvcHlIZWlnaHQpLCAodXNlQWxwaGEgJiYgaXMz
MmJpdCgpKSA/IEJpdG1hcEluZm86OkJpdENvdW50MzIgOiBCaXRtYXBJbmZvOjpCaXRDb3VudDE2
KTsKKyAgICBPd25QdHI8SEJJVE1BUD4gbmV3Qm1wID0gYWRvcHRQdHIoQ3JlYXRlRElCU2VjdGlv
bigwLCAmYm1wSW5mbywgRElCX1JHQl9DT0xPUlMsICZwaXhlbHMsIDAsIDApKTsKKworICAgIGlm
ICghbmV3Qm1wKQorICAgICAgICByZXR1cm4gMDsKKworICAgIE93blB0cjxIREM+IGRjTmV3ID0g
YWRvcHRQdHIoQ3JlYXRlQ29tcGF0aWJsZURDKDApKTsKKyAgICBIR0RJT0JKIHRtcE5ldyA9IFNl
bGVjdE9iamVjdChkY05ldy5nZXQoKSwgbmV3Qm1wLmdldCgpKTsKKworICAgIFN0cmV0Y2hESUJp
dHMoZGNOZXcuZ2V0KCksIDAsIDAsIGNvcHlXaWR0aCwgY29weUhlaWdodCwgcmVjdC54KCksIHJl
Y3QueSgpLCBjb3B5V2lkdGgsIGNvcHlIZWlnaHQsCisgICAgICAgIGJ5dGVzKCksICZiaXRtYXBJ
bmZvKCksIERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKKworICAgIFNlbGVjdE9iamVjdChkY05l
dy5nZXQoKSwgdG1wTmV3KTsKKyAgICByZXR1cm4gbmV3Qm1wLnJlbGVhc2UoKTsKK30KKworUGFz
c1JlZlB0cjxTaGFyZWRCaXRtYXA+IFNoYXJlZEJpdG1hcDo6Y2xpcEJpdG1hcChjb25zdCBJbnRS
ZWN0JiByZWN0LCBib29sIHVzZUFscGhhKQoreworICAgIGludCBvbGRXaWR0aCA9IHdpZHRoKCk7
CisgICAgaW50IG9sZEhlaWdodCA9IGhlaWdodCgpOworICAgIGludCBjb3B5V2lkdGggPSBzdGQ6
Om1pbjxpbnQ+KHJlY3Qud2lkdGgoKSwgb2xkV2lkdGggLSByZWN0LngoKSk7CisgICAgaW50IGNv
cHlIZWlnaHQgPSBzdGQ6Om1pbjxpbnQ+KHJlY3QuaGVpZ2h0KCksIG9sZEhlaWdodCAtIHJlY3Qu
eSgpKTsKKyAgICBpZiAoIWNvcHlXaWR0aCB8fCAhY29weUhlaWdodCkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICBSZWZQdHI8U2hhcmVkQml0bWFwPiBuZXdCbXAgPSBjcmVhdGUoSW50U2l6ZShj
b3B5V2lkdGgsIGNvcHlIZWlnaHQpLCB1c2VBbHBoYSAmJiBpczMyYml0KCkgPyBCaXRtYXBJbmZv
OjpCaXRDb3VudDMyIDogQml0bWFwSW5mbzo6Qml0Q291bnQxNiwgZmFsc2UpOworCisgICAgaWYg
KCFuZXdCbXAgfHwgIW5ld0JtcC0+Ynl0ZXMoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBE
Q0hvbGRlciBkY05ldyhuZXdCbXAuZ2V0KCkpOworCisgICAgU3RyZXRjaERJQml0cyhkY05ldy5n
ZXQoKSwgMCwgMCwgY29weVdpZHRoLCBjb3B5SGVpZ2h0LCByZWN0LngoKSwgcmVjdC55KCksIGNv
cHlXaWR0aCwgY29weUhlaWdodCwKKyAgICAgICAgYnl0ZXMoKSwgJmJpdG1hcEluZm8oKSwgRElC
X1JHQl9DT0xPUlMsIFNSQ0NPUFkpOworCisgICAgcmV0dXJuIG5ld0JtcDsKK30KKworc3RhdGlj
IHZvaWQgZHJhd1BhdHRlcm5TaW1wbGUoSERDIGhkYywgY29uc3QgUkVDVCYgZGVzdFJlY3QsIEhC
SVRNQVAgaGJtcCwgY29uc3QgUE9JTlQmIHBoYXNlKQoreworICAgIE93blB0cjxIQlJVU0g+IGhC
cnVzaCA9IGFkb3B0UHRyKENyZWF0ZVBhdHRlcm5CcnVzaChoYm1wKSk7CisgICAgaWYgKCFoQnJ1
c2gpCisgICAgICAgIHJldHVybjsKKworICAgIFBPSU5UIG9sZE9yZzsKKyAgICBTZXRCcnVzaE9y
Z0V4KGhkYywgZGVzdFJlY3QubGVmdCAtIHBoYXNlLngsIGRlc3RSZWN0LnRvcCAtIHBoYXNlLnks
ICZvbGRPcmcpOworICAgIEZpbGxSZWN0KGhkYywgJmRlc3RSZWN0LCBoQnJ1c2guZ2V0KCkpOwor
ICAgIFNldEJydXNoT3JnRXgoaGRjLCBvbGRPcmcueCwgb2xkT3JnLnksIDApOworfQorCitzdGF0
aWMgdm9pZCBkcmF3UGF0dGVyblNpbXBsZShIREMgaGRjLCBjb25zdCBSRUNUJiBkZXN0UmVjdCwg
Y29uc3QgU2hhcmVkQml0bWFwKiBibXAsIGNvbnN0IFNJWkUmIGJtcFNpemUsIGNvbnN0IFBPSU5U
JiBwaGFzZSkKK3sKKyAgICBpbnQgZHN0WSA9IGRlc3RSZWN0LnRvcDsKKyAgICBmb3IgKGludCBz
b3VyY2VZID0gcGhhc2UueTsgZHN0WSA8IGRlc3RSZWN0LmJvdHRvbTsgKSB7CisgICAgICAgIGlu
dCBzb3VyY2VIID0gc3RkOjptaW48aW50PihibXBTaXplLmN5IC0gc291cmNlWSwgZGVzdFJlY3Qu
Ym90dG9tIC0gZHN0WSk7CisgICAgICAgIGludCBkc3RYID0gZGVzdFJlY3QubGVmdDsKKyAgICAg
ICAgZm9yIChpbnQgc291cmNlWCA9IHBoYXNlLng7IGRzdFggPCBkZXN0UmVjdC5yaWdodDsgKSB7
CisgICAgICAgICAgICBpbnQgc291cmNlVyA9IHN0ZDo6bWluPGludD4oYm1wU2l6ZS5jeCAtIHNv
dXJjZVgsIGRlc3RSZWN0LnJpZ2h0IC0gZHN0WCk7CisKKyAgICAgICAgICAgIFN0cmV0Y2hESUJp
dHMoaGRjLCBkc3RYLCBkc3RZLCBzb3VyY2VXLCBzb3VyY2VILCBzb3VyY2VYLCBzb3VyY2VZLCBz
b3VyY2VXLCBzb3VyY2VILAorICAgICAgICAgICAgICAgIGJtcC0+Ynl0ZXMoKSwgJmJtcC0+Yml0
bWFwSW5mbygpLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7CisKKyAgICAgICAgICAgIGRzdFgg
Kz0gc291cmNlVzsKKyAgICAgICAgICAgIHNvdXJjZVggPSAwOworICAgICAgICB9CisKKyAgICAg
ICAgZHN0WSArPSBzb3VyY2VIOworICAgICAgICBzb3VyY2VZID0gMDsKKyAgICB9Cit9CisKK3N0
YXRpYyBMT05HIG5vcm1hbGl6ZVBoYXNlKExPTkcgcGhhc2UsIGludCBsaW1pdCkKK3sKKyAgICBp
ZiAoIXBoYXNlIHx8IGxpbWl0IDwgMikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAobGlt
aXQgPT0gMikKKyAgICAgICAgcmV0dXJuIHBoYXNlICYgMTsKKworICAgIGlmIChwaGFzZSA8IDAp
IHsKKyAgICAgICAgcGhhc2UgPSAtcGhhc2U7CisgICAgICAgIGlmIChwaGFzZSA+IGxpbWl0KQor
ICAgICAgICAgICAgcGhhc2UgPSBzdGF0aWNfY2FzdDxMT05HPihzdGF0aWNfY2FzdDx1bnNpZ25l
ZD4ocGhhc2UpICUgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGxpbWl0KSk7CisgICAgICAgIGlmIChw
aGFzZSkKKyAgICAgICAgICAgIHBoYXNlID0gbGltaXQgLSBwaGFzZTsKKyAgICAgICAgcmV0dXJu
IHBoYXNlOworICAgIH0KKworICAgIGlmIChwaGFzZSA8IGxpbWl0KQorICAgICAgICByZXR1cm4g
cGhhc2U7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TE9ORz4oc3RhdGljX2Nhc3Q8dW5zaWdu
ZWQ+KHBoYXNlKSAlIHN0YXRpY19jYXN0PHVuc2lnbmVkPihsaW1pdCkpOworfQorCit2b2lkIFNo
YXJlZEJpdG1hcDo6ZHJhd1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9h
dFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5zZm9y
bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHBoYXNlLCBDb2xv
clNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0
UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXplKQoreworICAgIGlm
ICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKyAgICBjdHh0LT5kcmF3Qml0bWFwUGF0dGVy
bih0aGlzLCB0aWxlUmVjdEluLCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgc3R5bGVDb2xvclNw
YWNlLCBvcCwgZGVzdFJlY3QsIG9yaWdTb3VyY2VTaXplKTsKK30KKwordm9pZCBTaGFyZWRCaXRt
YXA6OmRyYXdQYXR0ZXJuKEhEQyBoZGMsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3Jt
LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4sIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0
dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQm
IHBoYXNlLCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3As
IGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXpl
KQoreworICAgIGlmICghbV9waXhlbHMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICh0aWxl
UmVjdEluLndpZHRoKCkgPD0gMCB8fCB0aWxlUmVjdEluLmhlaWdodCgpIDw9IDApCisgICAgICAg
IHJldHVybjsKKworICAgIGJvb2wgdXNlQWxwaGEgPSBvcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVy
ICYmIGhhc0FscGhhKCkgJiYgaXMzMmJpdCgpOworCisgICAgaW50IGJtcFdpZHRoID0gd2lkdGgo
KTsKKyAgICBpbnQgYm1wSGVpZ2h0ID0gaGVpZ2h0KCk7CisKKyAgICBGbG9hdFJlY3QgdGlsZVJl
Y3QodGlsZVJlY3RJbik7CisgICAgaWYgKGJtcFdpZHRoICE9IG9yaWdTb3VyY2VTaXplLndpZHRo
KCkpIHsKKyAgICAgICAgZG91YmxlIHJhdGUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGJtcFdpZHRo
KSAvIG9yaWdTb3VyY2VTaXplLndpZHRoKCk7CisgICAgICAgIGRvdWJsZSB0ZW1wID0gdGlsZVJl
Y3Qud2lkdGgoKSAqIHJhdGU7CisgICAgICAgIHRpbGVSZWN0LnNldFgodGlsZVJlY3QueCgpICog
cmF0ZSk7CisgICAgICAgIHRpbGVSZWN0LnNldFdpZHRoKHRlbXApOworICAgICAgICB0ZW1wID0g
dGlsZVJlY3QuaGVpZ2h0KCkgKiByYXRlOworICAgICAgICB0aWxlUmVjdC5zZXRZKHRpbGVSZWN0
LnkoKSAqIHJhdGUpOworICAgICAgICB0aWxlUmVjdC5zZXRIZWlnaHQodGVtcCk7CisgICAgfQor
CisgICAgT3duUHRyPEhCSVRNQVA+IGNsaXBwZWRCbXA7CisKKyAgICBpZiAodGlsZVJlY3QueCgp
IHx8IHRpbGVSZWN0LnkoKSB8fCB0aWxlUmVjdC53aWR0aCgpICE9IGJtcFdpZHRoIHx8IHRpbGVS
ZWN0LmhlaWdodCgpICE9IGJtcEhlaWdodCkgeworICAgICAgICBCaXRtYXBJbmZvIHBhdHRlcm5C
bXBJbmZvOworICAgICAgICB2b2lkKiBwYXR0ZXJuUGl4ZWxzOworICAgICAgICBjbGlwcGVkQm1w
ID0gY2xpcEJpdG1hcChJbnRSZWN0KHRpbGVSZWN0KSwgdXNlQWxwaGEsIHBhdHRlcm5CbXBJbmZv
LCBwYXR0ZXJuUGl4ZWxzKTsKKyAgICAgICAgaWYgKCFjbGlwcGVkQm1wKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIGJtcFdpZHRoID0gdGlsZVJlY3Qud2lkdGgoKTsKKyAgICAgICAg
Ym1wSGVpZ2h0ID0gdGlsZVJlY3QuaGVpZ2h0KCk7CisgICAgfQorCisgICAgQWZmaW5lVHJhbnNm
b3JtIHRmID0gdHJhbnNmb3JtOworICAgIHRmICo9IHBhdHRlcm5UcmFuc2Zvcm07CisKKyAgICBG
bG9hdFJlY3QgdHJSZWN0ID0gdGYubWFwUmVjdChkZXN0UmVjdCk7CisKKyAgICBSRUNUIGNsaXBC
b3g7CisgICAgaW50IGNsaXBUeXBlID0gR2V0Q2xpcEJveChoZGMsICZjbGlwQm94KTsKKyAgICBp
ZiAoY2xpcFR5cGUgPT0gU0lNUExFUkVHSU9OKQorICAgICAgICB0clJlY3QuaW50ZXJzZWN0KEZs
b2F0UmVjdChjbGlwQm94LmxlZnQsIGNsaXBCb3gudG9wLCBjbGlwQm94LnJpZ2h0IC0gY2xpcEJv
eC5sZWZ0LCBjbGlwQm94LmJvdHRvbSAtIGNsaXBCb3gudG9wKSk7CisgICAgZWxzZSBpZiAoY2xp
cFR5cGUgPT0gQ09NUExFWFJFR0lPTikgeworICAgICAgICBPd25QdHI8SFJHTj4gY2xpcFJnbiA9
IGFkb3B0UHRyKENyZWF0ZVJlY3RSZ24oMCwgMCwgMCwgMCkpOworICAgICAgICBpZiAoR2V0Q2xp
cFJnbihoZGMsIGNsaXBSZ24uZ2V0KCkpID4gMCkgeworICAgICAgICAgICAgRFdPUkQgcmVnaW9u
RGF0YVNpemUgPSBHZXRSZWdpb25EYXRhKGNsaXBSZ24uZ2V0KCksIHNpemVvZihSR05EQVRBKSwg
MCk7CisgICAgICAgICAgICBpZiAocmVnaW9uRGF0YVNpemUpIHsKKyAgICAgICAgICAgICAgICBW
ZWN0b3I8UkdOREFUQT4gcmVnaW9uRGF0YShyZWdpb25EYXRhU2l6ZSk7CisgICAgICAgICAgICAg
ICAgR2V0UmVnaW9uRGF0YShjbGlwUmduLmdldCgpLCByZWdpb25EYXRhU2l6ZSwgcmVnaW9uRGF0
YS5kYXRhKCkpOworICAgICAgICAgICAgICAgIFJFQ1QqIHJlY3QgPSByZWludGVycHJldF9jYXN0
PFJFQ1QqPihyZWdpb25EYXRhWzBdLkJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZm9yIChEV09S
RCBpID0gMDsgaSA8IHJlZ2lvbkRhdGFbMF0ucmRoLm5Db3VudDsgKytpLCArK3JlY3QpCisgICAg
ICAgICAgICAgICAgICAgIHRyUmVjdC5pbnRlcnNlY3QoRmxvYXRSZWN0KHJlY3QtPmxlZnQsIHJl
Y3QtPnRvcCwgcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0LCByZWN0LT5ib3R0b20gLSByZWN0LT50
b3ApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0clJlY3Qu
d2lkdGgoKSA8PSAwIHx8IHRyUmVjdC5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisK
KyAgICB0clJlY3QuaW5mbGF0ZSgxKTsKKyAgICBJbnRSZWN0IHZpc2libGVEc3RSZWN0ID0gZW5j
bG9zaW5nSW50UmVjdCh0Zi5pbnZlcnNlKCkubWFwUmVjdCh0clJlY3QpKTsKKyAgICB2aXNpYmxl
RHN0UmVjdC5pbnRlcnNlY3QoSW50UmVjdChkZXN0UmVjdCkpOworCisgICAgaWYgKHZpc2libGVE
c3RSZWN0LndpZHRoKCkgPD0gMCB8fCB2aXNpYmxlRHN0UmVjdC5oZWlnaHQoKSA8PSAwKQorICAg
ICAgICByZXR1cm47CisKKyAgICB0clJlY3QgPSB0Zi5tYXBSZWN0KHZpc2libGVEc3RSZWN0KTsK
KyAgICBSRUNUIGRzdFJlY3RXaW4gPSB7CisgICAgICAgIHN0YWJsZVJvdW5kKHRyUmVjdC54KCkp
LAorICAgICAgICBzdGFibGVSb3VuZCh0clJlY3QueSgpKSwKKyAgICAgICAgc3RhYmxlUm91bmQo
dHJSZWN0LnJpZ2h0KCkpLAorICAgICAgICBzdGFibGVSb3VuZCh0clJlY3QuYm90dG9tKCkpLAor
ICAgIH07CisgICAgaWYgKGRzdFJlY3RXaW4ucmlnaHQgPD0gZHN0UmVjdFdpbi5sZWZ0IHx8IGRz
dFJlY3RXaW4uYm90dG9tIDw9IGRzdFJlY3RXaW4udG9wKQorICAgICAgICByZXR1cm47CisKKyAg
ICBTSVpFIGJtcFNpemUgPSB7IGJtcFdpZHRoLCBibXBIZWlnaHQgfTsKKworICAgIC8vIFJlbGF0
aXZlIHRvIGRlc3RpbmF0aW9uLCBpbiBiaXRtYXAgcGl4ZWxzCisgICAgUE9JTlQgcGhhc2VXaW4g
PSB7IHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LngoKSAtIHBoYXNlLngoKSksIHN0YWJsZVJv
dW5kKHZpc2libGVEc3RSZWN0LnkoKSAtIHBoYXNlLnkoKSkgfTsKKyAgICBwaGFzZVdpbi54ID0g
bm9ybWFsaXplUGhhc2UocGhhc2VXaW4ueCwgYm1wU2l6ZS5jeCk7CisgICAgcGhhc2VXaW4ueSA9
IG5vcm1hbGl6ZVBoYXNlKHBoYXNlV2luLnksIGJtcFNpemUuY3kpOworCisgICAgUkVDVCBzcmNS
ZWN0V2luID0geworICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICBzdGFibGVSb3VuZCh2
aXNpYmxlRHN0UmVjdC5yaWdodCgpKSAtIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LngoKSks
CisgICAgICAgIHN0YWJsZVJvdW5kKHZpc2libGVEc3RSZWN0LmJvdHRvbSgpKSAtIHN0YWJsZVJv
dW5kKHZpc2libGVEc3RSZWN0LnkoKSkKKyAgICB9OworICAgIGlmIChzcmNSZWN0V2luLnJpZ2h0
IDw9IDAgfHwgc3JjUmVjdFdpbi5ib3R0b20gPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Qml0bWFwSW5mbyBibXBJbmZvID0gQml0bWFwSW5mbzo6Y3JlYXRlQm90dG9tVXAoSW50U2l6ZShz
cmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSksIHVzZUFscGhhID8gQml0bWFwSW5m
bzo6Qml0Q291bnQzMiA6IEJpdG1hcEluZm86OkJpdENvdW50MTYpOworICAgIHZvaWQqIHBpeGVs
czsKKyAgICBPd25QdHI8SEJJVE1BUD4gaGJtcFRlbXAgPSBhZG9wdFB0cihDcmVhdGVESUJTZWN0
aW9uKDAsICZibXBJbmZvLCBESUJfUkdCX0NPTE9SUywgJnBpeGVscywgMCwgMCkpOworCisgICAg
aWYgKCFoYm1wVGVtcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgT3duUHRyPEhEQz4gaG1lbWRj
ID0gYWRvcHRQdHIoQ3JlYXRlQ29tcGF0aWJsZURDKGhkYykpOworICAgIEhHRElPQkogb2xkQm1w
ID0gU2VsZWN0T2JqZWN0KGhtZW1kYy5nZXQoKSwgaGJtcFRlbXAuZ2V0KCkpOworICAgIGlmIChj
bGlwcGVkQm1wKQorICAgICAgICBkcmF3UGF0dGVyblNpbXBsZShobWVtZGMuZ2V0KCksIHNyY1Jl
Y3RXaW4sIGNsaXBwZWRCbXAuZ2V0KCksIHBoYXNlV2luKTsKKyAgICBlbHNlIGlmICgob3AgIT0g
Q29tcG9zaXRlU291cmNlT3ZlciB8fCBjYW5Vc2VESUJpdHMoKSkgJiYgc3JjUmVjdFdpbi5yaWdo
dCA8PSBibXBTaXplLmN4ICogMiAmJiBzcmNSZWN0V2luLmJvdHRvbSA8PSBibXBTaXplLmN5ICog
MikKKyAgICAgICAgZHJhd1BhdHRlcm5TaW1wbGUoaG1lbWRjLmdldCgpLCBzcmNSZWN0V2luLCB0
aGlzLCBibXBTaXplLCBwaGFzZVdpbik7CisgICAgZWxzZSBpZiAoZW5zdXJlSGFuZGxlKCkpCisg
ICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwgc3JjUmVjdFdpbiwgZ2V0SGFu
ZGxlKCksIHBoYXNlV2luKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdm9pZCogcGl4ZWxzOworICAg
ICAgICBCaXRtYXBJbmZvIGJtcEluZm87CisgICAgICAgIE93blB0cjxIQklUTUFQPiBoYm1wID0g
Y3JlYXRlSGFuZGxlKCZwaXhlbHMsICZibXBJbmZvLCAtMSwgZmFsc2UpOworICAgICAgICBpZiAo
aGJtcCkKKyAgICAgICAgICAgIGRyYXdQYXR0ZXJuU2ltcGxlKGhtZW1kYy5nZXQoKSwgc3JjUmVj
dFdpbiwgaGJtcC5nZXQoKSwgcGhhc2VXaW4pOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
IFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCksIG9sZEJtcCk7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodXNlQWxwaGEgJiYgaGFzQWxwaGFCbGVuZFN1
cHBvcnQoKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgQkxFTkRGVU5DVElPTiBibGVuZCA9IHsg
QUNfU1JDX09WRVIsIDAsIDI1NSwgQUNfU1JDX0FMUEhBIH07CisgICAgICAgIGJvb2wgc3VjY2Vz
cyA9IGFscGhhQmxlbmRJZlN1cHBvcnRlZChoZGMsIGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdp
bi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RSZWN0V2luLmxlZnQsIGRzdFJlY3RXaW4uYm90
dG9tIC0gZHN0UmVjdFdpbi50b3AsCisgICAgICAgICAgICBobWVtZGMuZ2V0KCksIDAsIDAsIHNy
Y1JlY3RXaW4ucmlnaHQsIHNyY1JlY3RXaW4uYm90dG9tLCBibGVuZCk7CisgICAgICAgIEFTU0VS
VF9VTlVTRUQoc3VjY2Vzcywgc3VjY2Vzcyk7CisgICAgfSBlbHNlIGlmICh1c2VBbHBoYSAmJiAh
aGFzQWxwaGFCbGVuZFN1cHBvcnQoKSB8fCBvcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVyICYmIHVz
ZXNUcmFuc3BhcmVudENvbG9yKCkpIHsKKyAgICAgICAgVHJhbnNwYXJlbnRCbHQoaGRjLCBkc3RS
ZWN0V2luLmxlZnQsIGRzdFJlY3RXaW4udG9wLCBkc3RSZWN0V2luLnJpZ2h0IC0gZHN0UmVjdFdp
bi5sZWZ0LAorICAgICAgICAgICAgZHN0UmVjdFdpbi5ib3R0b20gLSBkc3RSZWN0V2luLnRvcCwg
aG1lbWRjLmdldCgpLCAwLCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSwg
dHJhbnNwYXJlbnRDb2xvcigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBEV09SRCBibXBPcCA9
IG9wID09IENvbXBvc2l0ZUNvcHkgPyBTUkNDT1BZCisgICAgICAgICAgICAgICAgICAgIDogb3Ag
PT0gQ29tcG9zaXRlU291cmNlT3ZlciA/IFNSQ0NPUFkKKyAgICAgICAgICAgICAgICAgICAgOiBv
cCA9PSBDb21wb3NpdGVYT1IgPyBQQVRJTlZFUlQKKyAgICAgICAgICAgICAgICAgICAgOiBvcCA9
PSBDb21wb3NpdGVDbGVhciA/IFdISVRFTkVTUworICAgICAgICAgICAgICAgICAgICA6IFNSQ0NP
UFk7IC8vIEZJWEVNRTogb3RoZXIgdHlwZXM/CisKKyAgICAgICAgU3RyZXRjaERJQml0cyhoZGMs
IGRzdFJlY3RXaW4ubGVmdCwgZHN0UmVjdFdpbi50b3AsIGRzdFJlY3RXaW4ucmlnaHQgLSBkc3RS
ZWN0V2luLmxlZnQsCisgICAgICAgICAgICBkc3RSZWN0V2luLmJvdHRvbSAtIGRzdFJlY3RXaW4u
dG9wLCAwLCAwLCBzcmNSZWN0V2luLnJpZ2h0LCBzcmNSZWN0V2luLmJvdHRvbSwKKyAgICAgICAg
ICAgIHBpeGVscywgJmJtcEluZm8sIERJQl9SR0JfQ09MT1JTLCBibXBPcCk7CisgICAgfQorICAg
IFNlbGVjdE9iamVjdChobWVtZGMuZ2V0KCksIG9sZEJtcCk7Cit9CisKK1NoYXJlZEJpdG1hcDo6
RENQcm92aWRlciogU2hhcmVkQml0bWFwOjpzX2RjUHJvdmlkZXIgPSBuZXcgU2hhcmVkQml0bWFw
OjpEQ1Byb3ZpZGVyOworCitIREMgU2hhcmVkQml0bWFwOjpEQ1Byb3ZpZGVyOjpnZXREQyhTaGFy
ZWRCaXRtYXAqIGJtcCwgdW5zaWduZWQqIGtleSkKK3sKKyAgICBpZiAoIWJtcCB8fCAhYm1wLT5l
bnN1cmVIYW5kbGUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBIREMgaGRjID0gQ3JlYXRl
Q29tcGF0aWJsZURDKDApOworICAgIGlmICghaGRjKQorICAgICAgICByZXR1cm4gMDsKKworICAg
ICprZXkgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkPihTZWxlY3RPYmplY3QoaGRjLCBibXAt
PmdldEhhbmRsZSgpKSk7CisgICAgUkVDVCByZWN0ID0geyAwLCAwLCBibXAtPndpZHRoKCksIGJt
cC0+aGVpZ2h0KCkgfTsKKyAgICBPd25QdHI8SFJHTj4gY2xpcFJnbiA9IGFkb3B0UHRyKENyZWF0
ZVJlY3RSZ25JbmRpcmVjdCgmcmVjdCkpOworICAgIFNlbGVjdENsaXBSZ24oaGRjLCBjbGlwUmdu
LmdldCgpKTsKKworICAgIHJldHVybiBoZGM7Cit9CisKK3ZvaWQgU2hhcmVkQml0bWFwOjpEQ1By
b3ZpZGVyOjpyZWxlYXNlREMoU2hhcmVkQml0bWFwKiwgSERDIGhkYywgdW5zaWduZWQga2V5MSkK
K3sKKyAgICBpZiAoIWhkYykKKyAgICAgICAgcmV0dXJuOworCisgICAgU2VsZWN0T2JqZWN0KGhk
YywgcmVpbnRlcnByZXRfY2FzdDxIR0RJT0JKPihrZXkxKSk7CisgICAgRGVsZXRlREMoaGRjKTsK
K30KKwordm9pZCBTaGFyZWRCaXRtYXA6OmNsZWFyUGl4ZWxzKGNvbnN0IEludFJlY3QmIHJlY3Qp
Cit7CisgICAgaWYgKCFtX3BpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBi
bXBSZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKKyAgICBibXBSZWN0LmludGVyc2VjdChy
ZWN0KTsKKyAgICBpZiAoaXMxNmJpdCgpKSB7CisgICAgICAgIHVuc2lnbmVkIHcgPSBtX2JtcElu
Zm8ucGFkZGVkV2lkdGgoKTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQqIGRzdCA9IHN0YXRpY19j
YXN0PHVuc2lnbmVkIHNob3J0Kj4obV9waXhlbHMpOworICAgICAgICBkc3QgKz0gYm1wUmVjdC55
KCkgKiB3ICsgYm1wUmVjdC54KCk7CisgICAgICAgIGludCB3b3Jkc1RvU2V0ID0gYm1wUmVjdC53
aWR0aCgpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogZHN0RW5kID0gZHN0ICsgYm1w
UmVjdC5oZWlnaHQoKSAqIHc7CisgICAgICAgIHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAgICAg
ICAgICAgIHdtZW1zZXQocmVpbnRlcnByZXRfY2FzdDx3Y2hhcl90Kj4oZHN0KSwgMCwgd29yZHNU
b1NldCk7CisgICAgICAgICAgICBkc3QgKz0gdzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgdW5zaWduZWQgdyA9IHdpZHRoKCk7CisgICAgdW5zaWduZWQqIGRzdCA9
IHN0YXRpY19jYXN0PHVuc2lnbmVkKj4obV9waXhlbHMpOworICAgIGRzdCArPSBibXBSZWN0Lnko
KSAqIHcgKyBibXBSZWN0LngoKTsKKyAgICBpbnQgd29yZHNUb1NldCA9IGJtcFJlY3Qud2lkdGgo
KSAqIDI7CisgICAgY29uc3QgdW5zaWduZWQqIGRzdEVuZCA9IGRzdCArIGJtcFJlY3QuaGVpZ2h0
KCkgKiB3OworICAgIHdoaWxlIChkc3QgPCBkc3RFbmQpIHsKKyAgICAgICAgd21lbXNldChyZWlu
dGVycHJldF9jYXN0PHdjaGFyX3QqPihkc3QpLCAwLCB3b3Jkc1RvU2V0KTsKKyAgICAgICAgZHN0
ICs9IHc7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1NoYXJlZEJpdG1hcC5oIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi44MmY1ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9TaGFyZWRCaXRtYXAuaApAQCAtMCwwICsxLDE0NSBAQAorLyoK
KyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgUGF0cmljayBHYW5zdGVyZXIgPHBh
cm9nYUBwYXJvZ2EuY29tPgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24s
IE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFNoYXJlZEJpdG1hcF9oCisjZGVm
aW5lIFNoYXJlZEJpdG1hcF9oCisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNs
dWRlICJCaXRtYXBJbmZvLmgiCisjaW5jbHVkZSAiQ29sb3JTcGFjZS5oIgorI2luY2x1ZGUgIkdy
YXBoaWNzVHlwZXMuaCIKKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorI2luY2x1ZGUgPHd0
Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL093bkFycmF5UHRyLmg+CisjaW5jbHVkZSA8
d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisjaW5jbHVkZSA8d2lu
Z2RpLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgRmxvYXRQb2ludDsKK2NsYXNz
IEZsb2F0UmVjdDsKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIEludFJlY3Q7CitjbGFz
cyBJbnRTaXplOworY2xhc3MgVHJhbnNmb3JtYXRpb25NYXRyaXg7CisKK2NsYXNzIFNoYXJlZEJp
dG1hcDogcHVibGljIFJlZkNvdW50ZWQ8U2hhcmVkQml0bWFwPiB7CitwdWJsaWM6CisgICAgflNo
YXJlZEJpdG1hcCgpOworICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNoYXJlZEJpdG1hcD4gY3JlYXRl
KGNvbnN0IEludFNpemUmLCBCaXRtYXBJbmZvOjpCaXRDb3VudCA9IEJpdG1hcEluZm86OkJpdENv
dW50MzIsIGJvb2wgaW5pdFBpeGVscyA9IHRydWUpOworICAgIHN0YXRpYyBQYXNzUmVmUHRyPFNo
YXJlZEJpdG1hcD4gY3JlYXRlKGNvbnN0IFZlY3Rvcjx1bnNpZ25lZD4mLCBjb25zdCBJbnRTaXpl
JiwgYm9vbCBoYXNBbHBoYSA9IHRydWUpOworCisgICAgY29uc3QgQml0bWFwSW5mbyYgYml0bWFw
SW5mbygpIGNvbnN0IHsgcmV0dXJuIG1fYm1wSW5mbzsgfQorICAgIHZvaWQqIGJ5dGVzKCkgeyBy
ZXR1cm4gbV9waXhlbHM7IH0KKyAgICBjb25zdCB2b2lkKiBieXRlcygpIGNvbnN0IHsgcmV0dXJu
IG1fcGl4ZWxzOyB9CisgICAgdW5zaWduZWQgd2lkdGgoKSBjb25zdCB7IHJldHVybiBtX2JtcElu
Zm8ud2lkdGgoKTsgfQorICAgIHVuc2lnbmVkIGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fYm1w
SW5mby5oZWlnaHQoKTsgfQorICAgIHVuc2lnbmVkIHZhbGlkSGVpZ2h0KCkgY29uc3QgeyByZXR1
cm4gbV92YWxpZEhlaWdodDsgfQorICAgIHZvaWQgc2V0VmFsaWRIZWlnaHQodW5zaWduZWQgdmFs
aWRIZWlnaHQpIHsgbV92YWxpZEhlaWdodCA9IHZhbGlkSGVpZ2h0OyB9CisgICAgdm9pZCByZXNl
dFBpeGVscyhib29sIGJsYWNrID0gZmFsc2UpOworICAgIHZvaWQgY2xlYXJQaXhlbHMoY29uc3Qg
SW50UmVjdCYgcik7CisgICAgYm9vbCBsb2NrZWQoKSBjb25zdCB7IHJldHVybiBtX2xvY2tlZDsg
fQorICAgIHZvaWQgbG9jaygpIHsgbV9sb2NrZWQgPSB0cnVlOyB9CisgICAgdm9pZCB1bmxvY2so
KSB7IG1fbG9ja2VkID0gZmFsc2U7IH0KKyAgICBib29sIGZyZWVNZW1vcnkoKTsKKyAgICBib29s
IGlzMTZiaXQoKSBjb25zdCB7IHJldHVybiBtX2JtcEluZm8uaXMxNmJpdCgpOyB9CisgICAgYm9v
bCBpczMyYml0KCkgY29uc3QgeyByZXR1cm4gbV9ibXBJbmZvLmlzMzJiaXQoKTsgfQorICAgIGJv
b2wgdG8xNmJpdCgpOworICAgIGJvb2wgaGFzQWxwaGEoKSBjb25zdCB7IHJldHVybiBtX2hhc0Fs
cGhhOyB9CisgICAgdm9pZCBzZXRIYXNBbHBoYShib29sIGFscGhhKSB7IG1faGFzQWxwaGEgPSBh
bHBoYTsgfQorICAgIGJvb2wgZW5zdXJlSGFuZGxlKCk7CisgICAgSEJJVE1BUCBnZXRIYW5kbGUo
KSB7IHJldHVybiBtX2hiaXRtYXAuZ2V0KCk7IH0KKyAgICBQYXNzT3duUHRyPEhCSVRNQVA+IGNy
ZWF0ZUhhbmRsZSh2b2lkKiogcGl4ZWxzLCBCaXRtYXBJbmZvKiBibXBJbmZvLCBpbnQgaCA9IC0x
LCBib29sIHVzZTE2Yml0ID0gdHJ1ZSkgY29uc3Q7CisgICAgYm9vbCB1c2VzVHJhbnNwYXJlbnRD
b2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdXNlc1RyYW5zcGFyZW50Q29sb3I7IH0KKyAgICBDT0xP
UlJFRiB0cmFuc3BhcmVudENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV90cmFuc3BhcmVudENvbG9y
OyB9CisgICAgdm9pZCBzZXRUcmFuc3BhcmVudENvbG9yKENPTE9SUkVGIGMpCisgICAgeworICAg
ICAgICBtX3VzZXNUcmFuc3BhcmVudENvbG9yID0gdHJ1ZTsKKyAgICAgICAgbV90cmFuc3BhcmVu
dENvbG9yID0gYzsKKyAgICB9CisgICAgYm9vbCBjYW5Vc2VESUJpdHMoKSBjb25zdCB7IHJldHVy
biAhaGFzQWxwaGEoKSAmJiAhdXNlc1RyYW5zcGFyZW50Q29sb3IoKTsgfQorCisgICAgUGFzc093
blB0cjxIQklUTUFQPiBjbGlwQml0bWFwKGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgdXNlQWxw
aGEsIEJpdG1hcEluZm8mIGJtcEluZm8sIHZvaWQqJiBwaXhlbHMpOworCisgICAgUGFzc1JlZlB0
cjxTaGFyZWRCaXRtYXA+IGNsaXBCaXRtYXAoY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCB1c2VB
bHBoYSk7CisKKyAgICB2b2lkIGRyYXcoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBJbnRS
ZWN0JiBkc3RSZWN0LCBjb25zdCBJbnRSZWN0JiBzcmNSZWN0LCBDb2xvclNwYWNlIHN0eWxlQ29s
b3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApOworICAgIHZvaWQgZHJhd1Bh
dHRlcm4oR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVSZWN0SW4s
IGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5zZm9ybSwKKyAgICAgICAgICAgICAg
ICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIENvbG9yU3BhY2Ugc3R5bGVDb2xvclNwYWNl
LCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29uc3QgRmxvYXRSZWN0JiBkZXN0UmVjdCwgY29uc3Qg
SW50U2l6ZSYgb3JpZ1NvdXJjZVNpemUpOworICAgIHZvaWQgZHJhdyhIREMsIGNvbnN0IEludFJl
Y3QmIGRzdFJlY3QsIGNvbnN0IEludFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNv
bXBvc2l0ZU9wKTsKKyAgICB2b2lkIGRyYXdQYXR0ZXJuKEhEQywgY29uc3QgQWZmaW5lVHJhbnNm
b3JtJiwgY29uc3QgRmxvYXRSZWN0JiB0aWxlUmVjdEluLCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0m
IHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQm
IHBoYXNlLCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3As
IGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGNvbnN0IEludFNpemUmIG9yaWdTb3VyY2VTaXpl
KTsKKworICAgIGNsYXNzIERDUHJvdmlkZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVh
bCBIREMgZ2V0REMoU2hhcmVkQml0bWFwKiwgdW5zaWduZWQqKTsKKyAgICAgICAgdmlydHVhbCB2
b2lkIHJlbGVhc2VEQyhTaGFyZWRCaXRtYXAqLCBIREMsIHVuc2lnbmVkKTsKKyAgICB9OworCisg
ICAgc3RhdGljIERDUHJvdmlkZXIqIHNfZGNQcm92aWRlcjsKKworICAgIEhEQyBnZXREQyh1bnNp
Z25lZCoga2V5MSkgeyByZXR1cm4gc19kY1Byb3ZpZGVyLT5nZXREQyh0aGlzLCBrZXkxKTsgfQor
ICAgIHZvaWQgcmVsZWFzZURDKEhEQyBoZGMsIHVuc2lnbmVkIGtleTEpIHsgc19kY1Byb3ZpZGVy
LT5yZWxlYXNlREModGhpcywgaGRjLCBrZXkxKTsgfQorCisgICAgY2xhc3MgRENIb2xkZXIgewor
ICAgIHB1YmxpYzoKKyAgICAgICAgRENIb2xkZXIoU2hhcmVkQml0bWFwKiBibXAgPSAwKSB7IHNl
dEludGVybmFsKGJtcCk7IH0KKyAgICAgICAgfkRDSG9sZGVyKCkgeyBjbGVhckludGVybmFsKCk7
IH0KKyAgICAgICAgdm9pZCBzZXQoU2hhcmVkQml0bWFwKiBibXAgPSAwKQorICAgICAgICB7Cisg
ICAgICAgICAgICBjbGVhckludGVybmFsKCk7CisgICAgICAgICAgICBzZXRJbnRlcm5hbChibXAp
OworICAgICAgICB9CisgICAgICAgIEhEQyBnZXQoKSBjb25zdCB7IHJldHVybiBtX2hkYzsgfQor
ICAgIHByaXZhdGU6CisgICAgICAgIERDSG9sZGVyJiBvcGVyYXRvcj0oY29uc3QgRENIb2xkZXIm
KTsKKyAgICAgICAgRENIb2xkZXIoY29uc3QgRENIb2xkZXImKTsKKyAgICAgICAgdm9pZCBjbGVh
ckludGVybmFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1faGRjKQorICAgICAgICAg
ICAgICAgIG1fYml0bWFwLT5yZWxlYXNlREMobV9oZGMsIG1fa2V5KTsKKyAgICAgICAgfQorICAg
ICAgICB2b2lkIHNldEludGVybmFsKFNoYXJlZEJpdG1hcCogYm1wKQorICAgICAgICB7CisgICAg
ICAgICAgICBtX2JpdG1hcCA9IGJtcDsKKyAgICAgICAgICAgIG1faGRjID0gYm1wID8gYm1wLT5n
ZXREQygmbV9rZXkpIDogMDsKKyAgICAgICAgfQorICAgICAgICBTaGFyZWRCaXRtYXAqIG1fYml0
bWFwOworICAgICAgICBIREMgbV9oZGM7CisgICAgICAgIHVuc2lnbmVkIG1fa2V5OworICAgIH07
CisKK3ByaXZhdGU6CisgICAgU2hhcmVkQml0bWFwKGNvbnN0IEludFNpemUmLCBCaXRtYXBJbmZv
OjpCaXRDb3VudCwgYm9vbCBpbml0UGl4ZWxzKTsKKyAgICBCaXRtYXBJbmZvIG1fYm1wSW5mbzsK
KyAgICBPd25QdHI8SEJJVE1BUD4gbV9oYml0bWFwOworICAgIHZvaWQqIG1fcGl4ZWxzOworICAg
IE93bkFycmF5UHRyPHVuc2lnbmVkPiBtX3BpeGVsRGF0YTsKKyAgICBDT0xPUlJFRiBtX3RyYW5z
cGFyZW50Q29sb3I7CisgICAgaW50IG1fdmFsaWRIZWlnaHQ7CisgICAgYm9vbCBtX2xvY2tlZDsK
KyAgICBib29sIG1fdXNlc1RyYW5zcGFyZW50Q29sb3I7CisgICAgYm9vbCBtX2hhc0FscGhhOwor
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gU2hhcmVkQml0bWFwX2gK
</data>

          </attachment>
      

    </bug>

</bugzilla>