<?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>42905</bug_id>
          
          <creation_ts>2010-07-23 13:08:00 -0700</creation_ts>
          <short_desc>Implement OpenGLES2 helper classes.</short_desc>
          <delta_ts>2010-07-26 10:02:20 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Stephen White">senorblanco</reporter>
          <assigned_to name="Stephen White">senorblanco</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>fishd</cc>
    
    <cc>jamesr</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>255522</commentid>
    <comment_count>0</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2010-07-23 13:08:00 -0700</bug_when>
    <thetext>Implement OpenGLES2 helper classes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255531</commentid>
    <comment_count>1</comment_count>
      <attachid>62458</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2010-07-23 13:26:57 -0700</bug_when>
    <thetext>Created attachment 62458
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255538</commentid>
    <comment_count>2</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-07-23 13:43:51 -0700</bug_when>
    <thetext>The ChangeLog format is off.

I think Canvas2DLayerChromium should be a separate patch.

You can use OwnArrayPtr&lt;&gt; instead of doing new[]/delete[] yourself.

GLES2Canvas.cpp loadShader should use some sort of LOG macro instead of printf() to display the shader log.  This function also has a new[]/delete mismatch - another good time to use OwnArrayPtr&lt;&gt; :).

Otherwise looks great to me!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255547</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-07-23 14:03:50 -0700</bug_when>
    <thetext>Attachment 62458 did not build on chromium:
Build output: http://queues.webkit.org/results/3566409</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255548</commentid>
    <comment_count>4</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-07-23 14:07:30 -0700</bug_when>
    <thetext>The .h has its contents behind #if guards but the cpp isn&apos;t guarded.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255581</commentid>
    <comment_count>5</comment_count>
      <attachid>62467</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2010-07-23 15:21:38 -0700</bug_when>
    <thetext>Created attachment 62467
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255586</commentid>
    <comment_count>6</comment_count>
      <attachid>62468</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2010-07-23 15:37:37 -0700</bug_when>
    <thetext>Created attachment 62468
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255587</commentid>
    <comment_count>7</comment_count>
      <attachid>62468</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-07-23 15:47:53 -0700</bug_when>
    <thetext>Comment on attachment 62468
Patch

Some nits below, but I think this looks great otherwise.

&gt; Index: WebCore/platform/graphics/chromium/GLES2Canvas.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/chromium/GLES2Canvas.cpp	(revision 0)
&gt; +++ WebCore/platform/graphics/chromium/GLES2Canvas.cpp	(revision 0)
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +
&gt; +#if USE(GLES2_RENDERING)
&gt; +
&gt; +#include &quot;GLES2Canvas.h&quot;
&gt; +
&gt; +#include &quot;FloatRect.h&quot;
&gt; +#include &quot;GLES2Context.h&quot;
&gt; +#include &quot;GLES2Texture.h&quot;
&gt; +#include &quot;OwnArrayPtr.h&quot;

#include &lt;wtf/OwnArrayPtr.h&gt;, otherwise I&apos;m not sure this will compile on all systems.

&gt; +void GLES2Canvas::rotate(float angleInRadians)
&gt; +{
&gt; +    m_state-&gt;m_ctm.rotate(angleInRadians * (180.0f / 3.14159265f));
&gt; +}

Sucks to hard-code the value of pi.

&gt; Index: WebCore/platform/graphics/chromium/GLES2Canvas.h
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/chromium/GLES2Canvas.h	(revision 0)
&gt; +++ WebCore/platform/graphics/chromium/GLES2Canvas.h	(revision 0)
&gt; +class GLES2Canvas : public Noncopyable {
&gt; +public:
&gt; +    GLES2Canvas(GLES2Context* context, int width, int height);
&gt; +    ~GLES2Canvas();
&gt; +
&gt; +    void fillRect(const FloatRect&amp; rect, const Color&amp; color,
&gt; +                  ColorSpace colorSpace);
&gt; +    void fillRect(const FloatRect&amp; rect);
&gt; +    void clearRect(const FloatRect&amp; rect);
&gt; +    void setFillColor(const Color&amp; color, ColorSpace colorSpace);
&gt; +    void setAlpha(float alpha);
&gt; +    void setCompositeOperation(CompositeOperator op);
&gt; +    void translate(float x, float y);
&gt; +    void rotate(float angleInRadians);
&gt; +    void scale(const FloatSize&amp; size);
&gt; +    void concatCTM(const AffineTransform&amp; affine);

Leave out the parameter names in these declarations unless they are useful (i.e. &apos;GLES2Context* context&apos; &apos;FloatRect rect&apos; are useless, &apos;int width&apos; is useful).

&gt; Index: WebCore/platform/graphics/chromium/GLES2Texture.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/chromium/GLES2Texture.cpp	(revision 0)
&gt; +++ WebCore/platform/graphics/chromium/GLES2Texture.cpp	(revision 0)
&gt; +
&gt; +#include &quot;OwnArrayPtr.h&quot;

#include &lt;wtf/OwnArrayPtr.h&gt;

&gt; +void GLES2Texture::load(void* pixels)
&gt; +{
&gt; +        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_width, m_height, glFormat, glType, buf.get());
&gt; +    } else
&gt; +      glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_width, m_height, glFormat, glType, pixels);
&gt; +}

Indentation off here</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255722</commentid>
    <comment_count>8</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2010-07-24 09:39:11 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 62468 [details])
&gt; Some nits below, but I think this looks great otherwise.
&gt; 
&gt; &gt; Index: WebCore/platform/graphics/chromium/GLES2Canvas.cpp
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/platform/graphics/chromium/GLES2Canvas.cpp	(revision 0)
&gt; &gt; +++ WebCore/platform/graphics/chromium/GLES2Canvas.cpp	(revision 0)
&gt; &gt; +
&gt; &gt; +#include &quot;config.h&quot;
&gt; &gt; +
&gt; &gt; +#if USE(GLES2_RENDERING)
&gt; &gt; +
&gt; &gt; +#include &quot;GLES2Canvas.h&quot;
&gt; &gt; +
&gt; &gt; +#include &quot;FloatRect.h&quot;
&gt; &gt; +#include &quot;GLES2Context.h&quot;
&gt; &gt; +#include &quot;GLES2Texture.h&quot;
&gt; &gt; +#include &quot;OwnArrayPtr.h&quot;
&gt; 
&gt; #include &lt;wtf/OwnArrayPtr.h&gt;, otherwise I&apos;m not sure this will compile on all systems.

Done.

&gt; &gt; +void GLES2Canvas::rotate(float angleInRadians)
&gt; &gt; +{
&gt; &gt; +    m_state-&gt;m_ctm.rotate(angleInRadians * (180.0f / 3.14159265f));
&gt; &gt; +}
&gt; 
&gt; Sucks to hard-code the value of pi.

(I blame PlatformContextSkia.cpp:1262).  Fixed.

&gt; &gt; Index: WebCore/platform/graphics/chromium/GLES2Canvas.h
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/platform/graphics/chromium/GLES2Canvas.h	(revision 0)
&gt; &gt; +++ WebCore/platform/graphics/chromium/GLES2Canvas.h	(revision 0)
&gt; &gt; +class GLES2Canvas : public Noncopyable {
&gt; &gt; +public:
&gt; &gt; +    GLES2Canvas(GLES2Context* context, int width, int height);
&gt; &gt; +    ~GLES2Canvas();
&gt; &gt; +
&gt; &gt; +    void fillRect(const FloatRect&amp; rect, const Color&amp; color,
&gt; &gt; +                  ColorSpace colorSpace);
&gt; &gt; +    void fillRect(const FloatRect&amp; rect);
&gt; &gt; +    void clearRect(const FloatRect&amp; rect);
&gt; &gt; +    void setFillColor(const Color&amp; color, ColorSpace colorSpace);
&gt; &gt; +    void setAlpha(float alpha);
&gt; &gt; +    void setCompositeOperation(CompositeOperator op);
&gt; &gt; +    void translate(float x, float y);
&gt; &gt; +    void rotate(float angleInRadians);
&gt; &gt; +    void scale(const FloatSize&amp; size);
&gt; &gt; +    void concatCTM(const AffineTransform&amp; affine);
&gt; 
&gt; Leave out the parameter names in these declarations unless they are useful (i.e. &apos;GLES2Context* context&apos; &apos;FloatRect rect&apos; are useless, &apos;int width&apos; is useful).

Done.

&gt; &gt; Index: WebCore/platform/graphics/chromium/GLES2Texture.cpp
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/platform/graphics/chromium/GLES2Texture.cpp	(revision 0)
&gt; &gt; +++ WebCore/platform/graphics/chromium/GLES2Texture.cpp	(revision 0)
&gt; &gt; +
&gt; &gt; +#include &quot;OwnArrayPtr.h&quot;
&gt; 
&gt; #include &lt;wtf/OwnArrayPtr.h&gt;

Done.

&gt; &gt; +void GLES2Texture::load(void* pixels)
&gt; &gt; +{
&gt; &gt; +        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_width, m_height, glFormat, glType, buf.get());
&gt; &gt; +    } else
&gt; &gt; +      glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_width, m_height, glFormat, glType, pixels);
&gt; &gt; +}
&gt; 
&gt; Indentation off here

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255723</commentid>
    <comment_count>9</comment_count>
      <attachid>62505</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2010-07-24 09:40:00 -0700</bug_when>
    <thetext>Created attachment 62505
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>255883</commentid>
    <comment_count>10</comment_count>
      <attachid>62505</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-07-25 20:46:27 -0700</bug_when>
    <thetext>Comment on attachment 62505
Patch

WebCore/platform/graphics/chromium/GLES2Canvas.cpp:211
 +      m_stateStack.removeLast();
debug assert that there is a last to remove?

WebCore/platform/graphics/chromium/GLES2Texture.cpp:126
 +  };
nit: no semi-colon on the closing bracket of a namespace

WebCore/platform/graphics/chromium/GLES2Texture.h:43
 +      ~GLES2Texture();
nit: consider making the destructor private and make RefCounted&lt;GLES2Texture&gt; be a friend.
that way someone cannot accidentally delete a GLES2Texture pointer.

WebCore/platform/graphics/chromium/GLES2Texture.h:59
 +  };
nit: no semi-colon on the closing bracket of a namespace


R=me w/ these nits fixed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256050</commentid>
    <comment_count>11</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2010-07-26 08:26:57 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 62505 [details])
&gt; WebCore/platform/graphics/chromium/GLES2Canvas.cpp:211
&gt;  +      m_stateStack.removeLast();
&gt; debug assert that there is a last to remove?

Done.

&gt; WebCore/platform/graphics/chromium/GLES2Texture.cpp:126
&gt;  +  };
&gt; nit: no semi-colon on the closing bracket of a namespace

Done.

&gt; WebCore/platform/graphics/chromium/GLES2Texture.h:43
&gt;  +      ~GLES2Texture();
&gt; nit: consider making the destructor private and make RefCounted&lt;GLES2Texture&gt; be a friend.
&gt; that way someone cannot accidentally delete a GLES2Texture pointer.

Good idea, but it doesn&apos;t seem to work (although I could be doing something wrong; see below).  It seems that the compiler ignores the friend declaration during template instantiation.  From looking around, it seems that other classes derived from RefCounted&lt;&gt; have public destructors as well.

3&gt;d:\src\chromium1\src\third_party\WebKit\JavaScriptCore\wtf\RefCounted.h(139) : error C2248: &apos;WebCore::GLES2Texture::~GLES2Texture&apos; : cannot access private member declared in class &apos;WebCore::GLES2Texture&apos;
3&gt;        d:\src\chromium1\src\third_party\webkit\webcore\platform\graphics\chromium\GLES2Texture.h(58) : compiler has generated &apos;WebCore::GLES2Texture::~GLES2Texture&apos; here
3&gt;        d:\src\chromium1\src\third_party\webkit\webcore\platform\graphics\chromium\GLES2Texture.h(41) : see declaration of &apos;WebCore::GLES2Texture&apos;
3&gt;        d:\src\chromium1\src\third_party\WebKit\JavaScriptCore\wtf\RefCounted.h(137) : while compiling class template member function &apos;void WTF::RefCounted&lt;T&gt;::deref(void)&apos;
3&gt;        with
3&gt;        [
3&gt;            T=WebCore::GLES2Texture
3&gt;        ]
3&gt;        d:\src\chromium1\src\third_party\webkit\webcore\platform\graphics\chromium\GLES2Texture.h(41) : see reference to class template instantiation &apos;WTF::RefCounted&lt;T&gt;&apos; being compiled
3&gt;        with
3&gt;        [
3&gt;            T=WebCore::GLES2Texture
3&gt;        ]

&gt; 
&gt; WebCore/platform/graphics/chromium/GLES2Texture.h:59
&gt;  +  };
&gt; nit: no semi-colon on the closing bracket of a namespace

Fixed.

&gt; R=me w/ these nits fixed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256055</commentid>
    <comment_count>12</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2010-07-26 08:44:21 -0700</bug_when>
    <thetext>Committed r64046: &lt;http://trac.webkit.org/changeset/64046&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256081</commentid>
    <comment_count>13</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-07-26 10:02:20 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; Good idea, but it doesn&apos;t seem to work (although I could be doing something wrong; see below).  It seems that the compiler ignores the friend declaration during template instantiation.  From looking around, it seems that other classes derived from RefCounted&lt;&gt; have public destructors as well.

Did you remember WTF:: in the friend declaration?

  friend class WTF::RefCounted&lt;GLES2Texture&gt;;

We used this trick successfully elsewhere.  See WebViewImpl.h.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62458</attachid>
            <date>2010-07-23 13:26:57 -0700</date>
            <delta_ts>2010-07-23 15:21:33 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-42905-20100723162655.patch</filename>
            <type>text/plain</type>
            <size>40820</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Mzk5MSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzAgQEAKKzIwMTAtMDctMjMgIFN0ZXBoZW4gV2hpdGUgIDxzZW5vcmJsYW5jb0Bj
aHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgSW1wbGVtZW50IE9wZW5HTEVTMiBoZWxwZXIgY2xhc3Nlcy4KKworICAgICAgICBHTEVT
MkNhbnZhcyBhbmQgR0xFUzJUZXh0dXJlIGFyZSBzb21lIHNpbXBsZSBPcGVuR0xFUzIgaGVscGVy
IGNsYXNzZXMKKyAgICAgICAgZm9yIG1hbmFnaW5nIHN0YXRlLCBzYW1wbGVycyBhbmQgdGV4dHVy
ZXMuICBDYW52YXMyRExheWVyQ2hyb21pdW0gCisgICAgICAgIGltcGxlbWVudHMgdGhlIGNvbXBv
c2l0b3IgaW50ZXJmYWNlIGZvciBHTEVTMiAyRCBjYW52YXMuCisKKyAgICAgICAgV2hlbiB0aGlz
IGlzIGhvb2tlZCB1cCwgaXQgd2lsbCBiZSBjb3ZlcmVkIGJ5IG1hbnkgbGF5b3V0IHRlc3RzLgor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDI5MDUKKwor
ICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgQWRkIG5ldyBmaWxlcyB0byBjaHJvbWl1
bSBidWlsZCAoY29udGVudHMgYXJlIHByb3RlY3RlZCBieSAjaWYncyBmb3Igbm93KS4KKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5ZXJDaHJvbWl1bTo6Y3JlYXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5ZXJDaHJvbWl1bTo6Q2FudmFzMkRMYXll
ckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5ZXJDaHJvbWl1bTo6dGV4
dHVyZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5ZXJDaHJvbWl1bTo6c2V0R3Jh
cGhpY3NDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5ZXJDaHJvbWl1bTo6
dXBkYXRlVGV4dHVyZUNvbnRlbnRzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpD
YW52YXMyRExheWVyQ2hyb21pdW06OmRyYXdzQ29udGVudCk6CisgICAgICAgIChXZWJDb3JlOjpD
YW52YXMyRExheWVyQ2hyb21pdW06Om93bnNUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkNh
bnZhczJETGF5ZXJDaHJvbWl1bTo6c2hhZGVyUHJvZ3JhbUlkKToKKyAgICAgICAgKFdlYkNvcmU6
OkNhbnZhczJETGF5ZXJDaHJvbWl1bTo6c2V0U2hhZGVyUHJvZ3JhbUlkKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMkNhbnZhcy5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6YWZmaW5lVG8zeDMpOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6
OlN0YXRlOjpTdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6R0xFUzJDYW52
YXMpOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6On5HTEVTMkNhbnZhcyk6CisgICAg
ICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6Y2xlYXJSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6
OkdMRVMyQ2FudmFzOjpmaWxsUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6
c2V0RmlsbENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpzZXRBbHBoYSk6
CisgICAgICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OkdMRVMyQ2FudmFzOjpyb3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52
YXM6OnNjYWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpjb25jYXRDVE0pOgor
ICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OnNhdmUpOgorICAgICAgICAoV2ViQ29yZTo6
R0xFUzJDYW52YXM6OnJlc3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OmRy
YXdUZXh0dXJlZFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OnNldENvbXBv
c2l0ZU9wZXJhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6YXBwbHlDb21w
b3NpdGVPcGVyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6Z2V0UXVhZFZl
cnRpY2VzKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpnZXRRdWFkSW5kaWNlcyk6
CisgICAgICAgIChXZWJDb3JlOjpsb2FkU2hhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMy
Q2FudmFzOjpnZXRTaW1wbGVQcm9ncmFtKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFz
OjpnZXRUZXhQcm9ncmFtKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpjcmVhdGVU
ZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpnZXRUZXh0dXJlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpjaGVja0dMRXJyb3IpOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyQ2FudmFzLmg6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6R0xFUzJDYW52YXM6OmdsZXMyQ29udGV4dCk6CisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vR0xFUzJUZXh0dXJlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpHTEVTMlRleHR1cmU6OkdMRVMyVGV4dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpHTEVT
MlRleHR1cmU6On5HTEVTMlRleHR1cmUpOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJUZXh0dXJl
OjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6Y29udmVydEZvcm1hdCk6CisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMlRleHR1cmU6OmxvYWQpOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJUZXh0
dXJlOjpiaW5kKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMlRl
eHR1cmUuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6Oik6CisgICAg
ICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6OmZvcm1hdCk6CisgICAgICAgIChXZWJDb3JlOjpH
TEVTMlRleHR1cmU6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyVGV4dHVyZTo6aGVp
Z2h0KToKKwogMjAxMC0wNy0yMyAgQWRhbSBCYXJ0aCAgPGFiYXJ0aEB3ZWJraXQub3JnPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IEVyaWMgU2VpZGVsLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLmd5
cGkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9uIDYzOTczKQor
KysgV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdvcmtpbmcgY29weSkKQEAgLTIxNjgsNiArMjE2OCw4
IEBACiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2cvUGF0aENHLmNwcCcsCiAgICAg
ICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2cvUGF0dGVybkNHLmNwcCcsCiAgICAgICAgICAg
ICAncGxhdGZvcm0vZ3JhcGhpY3MvY2cvVHJhbnNmb3JtYXRpb25NYXRyaXhDRy5jcHAnLAorICAg
ICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhczJETGF5ZXJDaHJvbWl1
bS5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhczJE
TGF5ZXJDaHJvbWl1bS5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9Gb250Q2FjaGVDaHJvbWl1bVdpbi5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL0ZvbnRDYWNoZUxpbnV4LmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vRm9udENocm9taXVtV2luLmNwcCcsCkBAIC0yMTgyLDYgKzIxODQs
MTAgQEAKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250UGxhdGZv
cm1EYXRhTGludXguaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Rm9udFV0aWxzQ2hyb21pdW1XaW4uY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9Gb250VXRpbHNDaHJvbWl1bVdpbi5oJywKKyAgICAgICAgICAgICdwbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMkNhbnZhcy5jcHAnLAorICAgICAgICAgICAgJ3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyQ2FudmFzLmgnLAorICAgICAgICAgICAgJ3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyVGV4dHVyZS5jcHAnLAorICAgICAgICAgICAgJ3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyVGV4dHVyZS5oJywKICAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HbHlwaFBhZ2VUcmVlTm9kZUNocm9taXVtV2luLmNw
cCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR2x5cGhQYWdlVHJl
ZU5vZGVMaW51eC5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAnLApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9taXVtLmNw
cAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2Fu
dmFzMkRMYXllckNocm9taXVtLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw5NSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBk
aXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICog
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykgJiYgRU5B
QkxFKEFDQ0VMRVJBVEVEXzJEX0NBTlZBUykKKworI2luY2x1ZGUgIkNhbnZhczJETGF5ZXJDaHJv
bWl1bS5oIgorCisjaW5jbHVkZSAiR0xFUzJDb250ZXh0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0M0QuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHRTa2lhLmgiCisjaW5jbHVkZSA8
R0xFUzIvZ2wyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordW5zaWduZWQgQ2FudmFzMkRM
YXllckNocm9taXVtOjptX3NoYWRlclByb2dyYW1JZCA9IDA7CisKK1Bhc3NSZWZQdHI8Q2FudmFz
MkRMYXllckNocm9taXVtPiBDYW52YXMyRExheWVyQ2hyb21pdW06OmNyZWF0ZShHTEVTMkNvbnRl
eHQqIGNvbnRleHQpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBDYW52YXMyRExheWVyQ2hy
b21pdW0oY29udGV4dCkpOworfQorCitDYW52YXMyRExheWVyQ2hyb21pdW06OkNhbnZhczJETGF5
ZXJDaHJvbWl1bShHTEVTMkNvbnRleHQqIGNvbnRleHQpCisgICAgOiBMYXllckNocm9taXVtKDAp
CisgICAgLCBtX2dyYXBoaWNzQ29udGV4dCgwKQorICAgICwgbV9nbGVzMkNvbnRleHQoY29udGV4
dCkKKyAgICAsIG1fdGV4dHVyZUlkKGNvbnRleHQtPmdldE9mZnNjcmVlbkNvbnRlbnRQYXJlbnRU
ZXh0dXJlSWQoKSkKKyAgICAsIG1fdGV4dHVyZUNoYW5nZWQodHJ1ZSkKK3sKK30KKwordW5zaWdu
ZWQgQ2FudmFzMkRMYXllckNocm9taXVtOjp0ZXh0dXJlSWQoKQoreworICAgIHJldHVybiBtX3Rl
eHR1cmVJZDsKK30KKwordm9pZCBDYW52YXMyRExheWVyQ2hyb21pdW06OnNldEdyYXBoaWNzQ29u
dGV4dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQpCit7CisgICAgbV9ncmFwaGljc0NvbnRleHQg
PSBjb250ZXh0OworfQorCit2b2lkIENhbnZhczJETGF5ZXJDaHJvbWl1bTo6dXBkYXRlVGV4dHVy
ZUNvbnRlbnRzKHVuc2lnbmVkIHRleHR1cmVJZCkKK3sKKyAgICBBU1NFUlQodGV4dHVyZUlkID09
IG1fdGV4dHVyZUlkKTsKKyAgICBBU1NFUlQobV9nbGVzMkNvbnRleHQpOworICAgIGlmIChtX3Rl
eHR1cmVDaGFuZ2VkKSB7CisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90
ZXh0dXJlSWQpOworICAgICAgICAvLyBTZXQgdGhlIG1pbi1tYWcgZmlsdGVycyB0byBsaW5lYXIg
YW5kIHdyYXAgbW9kZXMgdG8gR0xfQ0xBTVBfVE9fRURHRQorICAgICAgICAvLyB0byBnZXQgYXJv
dW5kIE5QT1QgdGV4dHVyZSBsaW1pdGF0aW9ucyBvZiBHTEVTLgorICAgICAgICBnbFRleFBhcmFt
ZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwor
ICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklM
VEVSLCBHTF9MSU5FQVIpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwg
R0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICAgICBnbFRleFBhcmFt
ZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0Up
OworICAgICAgICBtX3RleHR1cmVDaGFuZ2VkID0gZmFsc2U7CisgICAgfQorICAgIC8vIFVwZGF0
ZSB0aGUgY29udGVudHMgb2YgdGhlIHRleHR1cmUgdXNlZCBieSB0aGUgY29tcG9zaXRvci4KKyAg
ICBpZiAobV9jb250ZW50c0RpcnR5KSB7CisgICAgICAgIC8vIEZsdXNoIGFueSBzb2Z0d2FyZSB1
cGRhdGVzIHRvIHRoZSBiYWNraW5nIHRleHR1cmUuCisgICAgICAgIGlmIChtX2dyYXBoaWNzQ29u
dGV4dCkKKyAgICAgICAgICAgIG1fZ3JhcGhpY3NDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+
cHJlSGFyZHdhcmVEcmF3KCk7CisgICAgICAgIG1fZ2xlczJDb250ZXh0LT5zd2FwQnVmZmVycygp
OworICAgICAgICBtX2NvbnRlbnRzRGlydHkgPSBmYWxzZTsKKyAgICB9Cit9CisKK30KKyNlbmRp
ZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpICYmIEVOQUJMRShBQ0NFTEVSQVRFRF8y
RF9DQU5WQVMpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZh
czJETGF5ZXJDaHJvbWl1bS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9taXVtLmgJKHJldmlzaW9uIDApCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhczJETGF5ZXJDaHJvbWl1bS5oCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5l
aXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisjaWZuZGVmIENhbnZhczJETGF5ZXJDaHJvbWl1
bV9oCisjZGVmaW5lIENhbnZhczJETGF5ZXJDaHJvbWl1bV9oCisKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpICYmIEVOQUJMRShBQ0NFTEVSQVRFRF8yRF9DQU5WQVMpICYmIFVTRShH
TEVTMl9SRU5ERVJJTkcpCisKKyNpbmNsdWRlICJMYXllckNocm9taXVtLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworY2xhc3MgR0xFUzJDb250ZXh0OworCisvLyBBIExheWVyIHRoYXQgY29u
dGFpbnMgYSBDYW52YXMyRCBlbGVtZW50LgorY2xhc3MgQ2FudmFzMkRMYXllckNocm9taXVtIDog
cHVibGljIExheWVyQ2hyb21pdW0geworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPENh
bnZhczJETGF5ZXJDaHJvbWl1bT4gY3JlYXRlKEdMRVMyQ29udGV4dCopOworICAgIHZpcnR1YWwg
Ym9vbCBkcmF3c0NvbnRlbnQoKSB7IHJldHVybiBtX2dsZXMyQ29udGV4dDsgfQorICAgIHZpcnR1
YWwgYm9vbCBvd25zVGV4dHVyZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIHZvaWQg
dXBkYXRlVGV4dHVyZUNvbnRlbnRzKHVuc2lnbmVkKTsKKyAgICB2aXJ0dWFsIHVuc2lnbmVkIHRl
eHR1cmVJZCgpOworICAgIHZpcnR1YWwgdW5zaWduZWQgc2hhZGVyUHJvZ3JhbUlkKCkgeyByZXR1
cm4gbV9zaGFkZXJQcm9ncmFtSWQ7IH0KKyAgICB2b2lkIHNldEdyYXBoaWNzQ29udGV4dChHcmFw
aGljc0NvbnRleHQqKTsKKworICAgIHN0YXRpYyB2b2lkIHNldFNoYWRlclByb2dyYW1JZCh1bnNp
Z25lZCBzaGFkZXJQcm9ncmFtSWQpIHsgbV9zaGFkZXJQcm9ncmFtSWQgPSBzaGFkZXJQcm9ncmFt
SWQ7IH0KKworcHJpdmF0ZToKKyAgICBDYW52YXMyRExheWVyQ2hyb21pdW0oR0xFUzJDb250ZXh0
Kik7CisgICAgR3JhcGhpY3NDb250ZXh0KiBtX2dyYXBoaWNzQ29udGV4dDsKKyAgICBHTEVTMkNv
bnRleHQqIG1fZ2xlczJDb250ZXh0OworICAgIHVuc2lnbmVkIG1fdGV4dHVyZUlkOworICAgIGJv
b2wgbV90ZXh0dXJlQ2hhbmdlZDsKKworICAgIHN0YXRpYyB1bnNpZ25lZCBtX3NoYWRlclByb2dy
YW1JZDsKK307CisKK30KKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisK
KyNlbmRpZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMkNh
bnZhcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9HTEVTMkNhbnZhcy5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL0dMRVMyQ2FudmFzLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1MjAg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGlu
IHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xl
IEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisg
KiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEdMRVMyX1JFTkRFUklORykKKworI2lu
Y2x1ZGUgIkdMRVMyQ2FudmFzLmgiCisKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRl
ICJHTEVTMkNvbnRleHQuaCIKKyNpbmNsdWRlICJHTEVTMlRleHR1cmUuaCIKKworI2luY2x1ZGUg
PEdMRVMyL2dsMi5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBpbmxpbmUgdm9p
ZCBhZmZpbmVUbzN4Myhjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSwgR0xmbG9hdCBt
YXRbOV0pCit7CisgICAgbWF0WzBdID0gdHJhbnNmb3JtLmEoKTsKKyAgICBtYXRbMV0gPSB0cmFu
c2Zvcm0uYigpOworICAgIG1hdFsyXSA9IDAuMGY7CisgICAgbWF0WzNdID0gdHJhbnNmb3JtLmMo
KTsKKyAgICBtYXRbNF0gPSB0cmFuc2Zvcm0uZCgpOworICAgIG1hdFs1XSA9IDAuMGY7CisgICAg
bWF0WzZdID0gdHJhbnNmb3JtLmUoKTsKKyAgICBtYXRbN10gPSB0cmFuc2Zvcm0uZigpOworICAg
IG1hdFs4XSA9IDEuMGY7Cit9CisKK3N0cnVjdCBHTEVTMkNhbnZhczo6U3RhdGUgeworICAgIFN0
YXRlKCkKKyAgICAgICAgOiBtX2ZpbGxDb2xvcigwLCAwLCAwLCAyNTUpCisgICAgICAgICwgbV9h
bHBoYSgxLjBmKQorICAgICAgICAsIG1fY29tcG9zaXRlT3AoQ29tcG9zaXRlU291cmNlT3ZlcikK
KyAgICB7CisgICAgfQorICAgIENvbG9yIG1fZmlsbENvbG9yOworICAgIGZsb2F0IG1fYWxwaGE7
CisgICAgQ29tcG9zaXRlT3BlcmF0b3IgbV9jb21wb3NpdGVPcDsKKyAgICBBZmZpbmVUcmFuc2Zv
cm0gbV9jdG07Cit9OworCitHTEVTMkNhbnZhczo6R0xFUzJDYW52YXMoR0xFUzJDb250ZXh0KiBj
b250ZXh0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgOiBtX2dsZXMyQ29udGV4dChjb250
ZXh0KQorICAgICwgbV9xdWFkVmVydGljZXMoMCkKKyAgICAsIG1fcXVhZEluZGljZXMoMCkKKyAg
ICAsIG1fc2ltcGxlUHJvZ3JhbSgwKQorICAgICwgbV90ZXhQcm9ncmFtKDApCisgICAgLCBtX3Np
bXBsZU1hdHJpeExvY2F0aW9uKC0xKQorICAgICwgbV9zaW1wbGVDb2xvckxvY2F0aW9uKC0xKQor
ICAgICwgbV9zaW1wbGVQb3NpdGlvbkxvY2F0aW9uKC0xKQorICAgICwgbV90ZXhNYXRyaXhMb2Nh
dGlvbigtMSkKKyAgICAsIG1fdGV4VGV4TWF0cml4TG9jYXRpb24oLTEpCisgICAgLCBtX3RleFNh
bXBsZXJMb2NhdGlvbigtMSkKKyAgICAsIG1fdGV4QWxwaGFMb2NhdGlvbigtMSkKKyAgICAsIG1f
dGV4UG9zaXRpb25Mb2NhdGlvbigtMSkKKyAgICAsIG1fd2lkdGgod2lkdGgpCisgICAgLCBtX2hl
aWdodChoZWlnaHQpCisgICAgLCBtX3N0YXRlKDApCit7CisgICAgbV9mbGlwTWF0cml4LnRyYW5z
bGF0ZSgtMS4wZiwgMS4wZik7CisgICAgbV9mbGlwTWF0cml4LnNjYWxlKDIuMGYgLyB3aWR0aCwg
LTIuMGYgLyBoZWlnaHQpOworCisgICAgbV9nbGVzMkNvbnRleHQtPm1ha2VDdXJyZW50KCk7Cisg
ICAgbV9nbGVzMkNvbnRleHQtPnJlc2l6ZU9mZnNjcmVlbkNvbnRlbnQoSW50U2l6ZSh3aWR0aCwg
aGVpZ2h0KSk7CisgICAgbV9nbGVzMkNvbnRleHQtPnN3YXBCdWZmZXJzKCk7CisgICAgZ2xWaWV3
cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIG1fc3RhdGVTdGFjay5hcHBlbmQoU3Rh
dGUoKSk7CisgICAgbV9zdGF0ZSA9ICZtX3N0YXRlU3RhY2subGFzdCgpOworfQorCitHTEVTMkNh
bnZhczo6fkdMRVMyQ2FudmFzKCkKK3sKKyAgICBtX2dsZXMyQ29udGV4dC0+bWFrZUN1cnJlbnQo
KTsKKyAgICBpZiAobV9zaW1wbGVQcm9ncmFtKQorICAgICAgICBnbERlbGV0ZVByb2dyYW0obV9z
aW1wbGVQcm9ncmFtKTsKKyAgICBpZiAobV90ZXhQcm9ncmFtKQorICAgICAgICBnbERlbGV0ZVBy
b2dyYW0obV90ZXhQcm9ncmFtKTsKKyAgICBpZiAobV9xdWFkVmVydGljZXMpCisgICAgICAgIGds
RGVsZXRlQnVmZmVycygxLCAmbV9xdWFkVmVydGljZXMpOworICAgIGlmIChtX3F1YWRJbmRpY2Vz
KQorICAgICAgICBnbERlbGV0ZUJ1ZmZlcnMoMSwgJm1fcXVhZFZlcnRpY2VzKTsKK30KKwordm9p
ZCBHTEVTMkNhbnZhczo6Y2xlYXJSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBt
X2dsZXMyQ29udGV4dC0+bWFrZUN1cnJlbnQoKTsKKworICAgIGdsU2Npc3NvcihyZWN0LngoKSwg
cmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisgICAgZ2xFbmFibGUoR0xf
U0NJU1NPUl9URVNUKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgIGds
RGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpmaWxsUmVj
dChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvciwgQ29sb3JTcGFjZSBj
b2xvclNwYWNlKQoreworICAgIG1fZ2xlczJDb250ZXh0LT5tYWtlQ3VycmVudCgpOworCisgICAg
Z2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgZ2V0UXVhZFZlcnRpY2VzKCkpOworICAgIGds
QmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZ2V0UXVhZEluZGljZXMoKSk7CisK
KyAgICBmbG9hdCByZ2JhWzRdOworICAgIGNvbG9yLmdldFJHQkEocmdiYVswXSwgcmdiYVsxXSwg
cmdiYVsyXSwgcmdiYVszXSk7CisgICAgZ2xVbmlmb3JtNGYobV9zaW1wbGVDb2xvckxvY2F0aW9u
LCByZ2JhWzBdICogcmdiYVszXSwgcmdiYVsxXSAqIHJnYmFbM10sIHJnYmFbMl0gKiByZ2JhWzNd
LCByZ2JhWzNdKTsKKworICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgNiwgR0xfVU5T
SUdORURfU0hPUlQsIDApOworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpmaWxsUmVjdChjb25zdCBG
bG9hdFJlY3QmIHJlY3QpCit7CisgICAgbV9nbGVzMkNvbnRleHQtPm1ha2VDdXJyZW50KCk7CisK
KyAgICBhcHBseUNvbXBvc2l0ZU9wZXJhdG9yKG1fc3RhdGUtPm1fY29tcG9zaXRlT3ApOworCisg
ICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgZ2V0UXVhZFZlcnRpY2VzKCkpOworICAg
IGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZ2V0UXVhZEluZGljZXMoKSk7
CisKKyAgICBnbFVzZVByb2dyYW0oZ2V0U2ltcGxlUHJvZ3JhbSgpKTsKKworICAgIGZsb2F0IHJn
YmFbNF07CisgICAgbV9zdGF0ZS0+bV9maWxsQ29sb3IuZ2V0UkdCQShyZ2JhWzBdLCByZ2JhWzFd
LCByZ2JhWzJdLCByZ2JhWzNdKTsKKyAgICBnbFVuaWZvcm00ZihtX3NpbXBsZUNvbG9yTG9jYXRp
b24sIHJnYmFbMF0gKiByZ2JhWzNdLCByZ2JhWzFdICogcmdiYVszXSwgcmdiYVsyXSAqIHJnYmFb
M10sIHJnYmFbM10pOworCisgICAgQWZmaW5lVHJhbnNmb3JtIG1hdHJpeChtX2ZsaXBNYXRyaXgp
OworICAgIG1hdHJpeC5tdWx0TGVmdChtX3N0YXRlLT5tX2N0bSk7CisgICAgbWF0cml4LnRyYW5z
bGF0ZShyZWN0LngoKSwgcmVjdC55KCkpOworICAgIG1hdHJpeC5zY2FsZShyZWN0LndpZHRoKCks
IHJlY3QuaGVpZ2h0KCkpOworICAgIEdMZmxvYXQgbWF0WzldOworICAgIGFmZmluZVRvM3gzKG1h
dHJpeCwgbWF0KTsKKyAgICBnbFVuaWZvcm1NYXRyaXgzZnYobV9zaW1wbGVNYXRyaXhMb2NhdGlv
biwgMSwgR0xfRkFMU0UsIG1hdCk7CisKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIobV9zaW1w
bGVQb3NpdGlvbkxvY2F0aW9uLCAzLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsIChHTHZvaWQqKSgw
KSk7CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1fc2ltcGxlUG9zaXRpb25Mb2Nh
dGlvbik7CisKKyAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIDYsIEdMX1VOU0lHTkVE
X1NIT1JULCAwKTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6c2V0RmlsbENvbG9yKGNvbnN0IENv
bG9yJiBjb2xvciwgQ29sb3JTcGFjZSBjb2xvclNwYWNlKQoreworICAgIG1fc3RhdGUtPm1fZmls
bENvbG9yID0gY29sb3I7Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6OnNldEFscGhhKGZsb2F0IGFs
cGhhKQoreworICAgIG1fc3RhdGUtPm1fYWxwaGEgPSBhbHBoYTsKK30KKwordm9pZCBHTEVTMkNh
bnZhczo6dHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgbV9zdGF0ZS0+bV9jdG0u
dHJhbnNsYXRlKHgsIHkpOworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpyb3RhdGUoZmxvYXQgYW5n
bGVJblJhZGlhbnMpCit7CisgICAgbV9zdGF0ZS0+bV9jdG0ucm90YXRlKGFuZ2xlSW5SYWRpYW5z
ICogKDE4MC4wZiAvIDMuMTQxNTkyNjVmKSk7Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6OnNjYWxl
KGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBtX3N0YXRlLT5tX2N0bS5zY2FsZShzaXpl
LndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpjb25jYXRD
VE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBhZmZpbmUpCit7CisgICAgbV9zdGF0ZS0+bV9jdG0u
bXVsdExlZnQoYWZmaW5lKTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6c2F2ZSgpCit7CisgICAg
bV9zdGF0ZVN0YWNrLmFwcGVuZChTdGF0ZShtX3N0YXRlU3RhY2subGFzdCgpKSk7CisgICAgbV9z
dGF0ZSA9ICZtX3N0YXRlU3RhY2subGFzdCgpOworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpyZXN0
b3JlKCkKK3sKKyAgICBtX3N0YXRlU3RhY2sucmVtb3ZlTGFzdCgpOworICAgIG1fc3RhdGUgPSAm
bV9zdGF0ZVN0YWNrLmxhc3QoKTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6ZHJhd1RleHR1cmVk
UmVjdChHTEVTMlRleHR1cmUqIHRleHR1cmUsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29u
c3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBDb2xvclNwYWNlIGNvbG9yU3BhY2UsIENvbXBvc2l0ZU9w
ZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGRyYXdUZXh0dXJlZFJlY3QodGV4dHVyZSwgc3Jj
UmVjdCwgZHN0UmVjdCwgbV9zdGF0ZS0+bV9jdG0sIG1fc3RhdGUtPm1fYWxwaGEsIGNvbG9yU3Bh
Y2UsIGNvbXBvc2l0ZU9wKTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6ZHJhd1RleHR1cmVkUmVj
dChHTEVTMlRleHR1cmUqIHRleHR1cmUsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3Qg
RmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSwgZmxv
YXQgYWxwaGEsIENvbG9yU3BhY2UgY29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9z
aXRlT3ApCit7CisgICAgbV9nbGVzMkNvbnRleHQtPm1ha2VDdXJyZW50KCk7CisKKyAgICBhcHBs
eUNvbXBvc2l0ZU9wZXJhdG9yKGNvbXBvc2l0ZU9wKTsKKworICAgIGdsQmluZEJ1ZmZlcihHTF9B
UlJBWV9CVUZGRVIsIGdldFF1YWRWZXJ0aWNlcygpKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxF
TUVOVF9BUlJBWV9CVUZGRVIsIGdldFF1YWRJbmRpY2VzKCkpOworICAgIGNoZWNrR0xFcnJvcigi
Z2xCaW5kQnVmZmVyIik7CisKKyAgICBnbFVzZVByb2dyYW0oZ2V0VGV4UHJvZ3JhbSgpKTsKKyAg
ICBjaGVja0dMRXJyb3IoImdsVXNlUHJvZ3JhbSIpOworCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdM
X1RFWFRVUkUwKTsKKyAgICB0ZXh0dXJlLT5iaW5kKCk7CisKKyAgICBnbFVuaWZvcm0xaShtX3Rl
eFNhbXBsZXJMb2NhdGlvbiwgMCk7CisgICAgY2hlY2tHTEVycm9yKCJnbFVuaWZvcm0xaSIpOwor
CisgICAgZ2xVbmlmb3JtMWYobV90ZXhBbHBoYUxvY2F0aW9uLCBhbHBoYSk7CisgICAgY2hlY2tH
TEVycm9yKCJnbFVuaWZvcm0xZiBmb3IgYWxwaGEiKTsKKworICAgIEFmZmluZVRyYW5zZm9ybSBt
YXRyaXgobV9mbGlwTWF0cml4KTsKKyAgICBtYXRyaXgubXVsdExlZnQodHJhbnNmb3JtKTsKKyAg
ICBtYXRyaXgudHJhbnNsYXRlKGRzdFJlY3QueCgpLCBkc3RSZWN0LnkoKSk7CisgICAgbWF0cml4
LnNjYWxlKGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSk7CisgICAgR0xmbG9hdCBt
YXRbOV07CisgICAgYWZmaW5lVG8zeDMobWF0cml4LCBtYXQpOworICAgIGdsVW5pZm9ybU1hdHJp
eDNmdihtX3RleE1hdHJpeExvY2F0aW9uLCAxLCBHTF9GQUxTRSwgbWF0KTsKKyAgICBjaGVja0dM
RXJyb3IoImdsVW5pZm9ybU1hdHJpeDNmdiIpOworCisgICAgQWZmaW5lVHJhbnNmb3JtIHRleE1h
dHJpeDsKKyAgICB0ZXhNYXRyaXguc2NhbGUoMS4wZiAvIHRleHR1cmUtPndpZHRoKCksIDEuMGYg
LyB0ZXh0dXJlLT5oZWlnaHQoKSk7CisgICAgdGV4TWF0cml4LnRyYW5zbGF0ZShzcmNSZWN0Lngo
KSwgc3JjUmVjdC55KCkpOworICAgIHRleE1hdHJpeC5zY2FsZShzcmNSZWN0LndpZHRoKCksIHNy
Y1JlY3QuaGVpZ2h0KCkpOworICAgIEdMZmxvYXQgdGV4TWF0WzldOworICAgIGFmZmluZVRvM3gz
KHRleE1hdHJpeCwgdGV4TWF0KTsKKyAgICBnbFVuaWZvcm1NYXRyaXgzZnYobV90ZXhUZXhNYXRy
aXhMb2NhdGlvbiwgMSwgR0xfRkFMU0UsIHRleE1hdCk7CisgICAgY2hlY2tHTEVycm9yKCJnbFVu
aWZvcm1NYXRyaXgzZnYiKTsKKworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtX3RleFBvc2l0
aW9uTG9jYXRpb24sIDMsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgKEdMdm9pZCopKDApKTsKKwor
ICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobV90ZXhQb3NpdGlvbkxvY2F0aW9uKTsKKwor
ICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgNiwgR0xfVU5TSUdORURfU0hPUlQsIDAp
OworICAgIGNoZWNrR0xFcnJvcigiZ2xEcmF3RWxlbWVudHMiKTsKK30KKwordm9pZCBHTEVTMkNh
bnZhczo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJhdG9yIG9wKQoreworICAg
IG1fc3RhdGUtPm1fY29tcG9zaXRlT3AgPSBvcDsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6YXBw
bHlDb21wb3NpdGVPcGVyYXRvcihDb21wb3NpdGVPcGVyYXRvciBvcCkKK3sKKyAgICBpZiAob3Ag
PT0gbV9sYXN0Q29tcG9zaXRlT3ApCisgICAgICAgIHJldHVybjsKKworICAgIHN3aXRjaCAob3Ap
IHsKKyAgICBjYXNlIENvbXBvc2l0ZUNsZWFyOgorICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7
CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8sIEdMX1pFUk8pOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIENvbXBvc2l0ZUNvcHk6CisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29tcG9zaXRlU291cmNlT3ZlcjoKKyAgICAgICAgZ2xF
bmFibGUoR0xfQkxFTkQpOworICAgICAgICBnbEJsZW5kRnVuYyhHTF9PTkUsIEdMX09ORV9NSU5V
U19TUkNfQUxQSEEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZUlu
OgorICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX0RT
VF9BTFBIQSwgR0xfWkVSTyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29tcG9zaXRlU291
cmNlT3V0OgorICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5j
KEdMX09ORV9NSU5VU19EU1RfQUxQSEEsIEdMX1pFUk8pOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIENvbXBvc2l0ZVNvdXJjZUF0b3A6CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAg
ICAgICAgZ2xCbGVuZEZ1bmMoR0xfRFNUX0FMUEhBLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk92ZXI6CisgICAg
ICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMoR0xfT05FX01JTlVT
X0RTVF9BTFBIQSwgR0xfT05FKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb21wb3NpdGVE
ZXN0aW5hdGlvbkluOgorICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxl
bmRGdW5jKEdMX1pFUk8sIEdMX1NSQ19BTFBIQSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
Q29tcG9zaXRlRGVzdGluYXRpb25PdXQ6CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAg
ICAgICAgZ2xCbGVuZEZ1bmMoR0xfWkVSTywgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25BdG9wOgorICAgICAgICBn
bEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX09ORV9NSU5VU19EU1Rf
QUxQSEEsIEdMX1NSQ19BTFBIQSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29tcG9zaXRl
WE9SOgorICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdM
X09ORV9NSU5VU19EU1RfQUxQSEEsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIENvbXBvc2l0ZVBsdXNEYXJrZXI6CisgICAgY2FzZSBDb21wb3NpdGVI
aWdobGlnaHQ6CisgICAgICAgIC8vIHVuc3VwcG9ydGVkCisgICAgICAgIGdsRGlzYWJsZShHTF9C
TEVORCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29tcG9zaXRlUGx1c0xpZ2h0ZXI6Cisg
ICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBH
TF9PTkUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgbV9sYXN0Q29tcG9zaXRlT3AgPSBv
cDsKK30KKwordW5zaWduZWQgR0xFUzJDYW52YXM6OmdldFF1YWRWZXJ0aWNlcygpCit7CisgICAg
aWYgKCFtX3F1YWRWZXJ0aWNlcykgeworICAgICAgICBHTGZsb2F0IHZlcnRpY2VzW10gPSB7IDAu
MGYsIDAuMGYsIDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZiwgMC4w
ZiwgMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmLCAxLjBmLCAxLjBm
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsIDEuMGYsIDEuMGYgfTsKKyAg
ICAgICAgZ2xHZW5CdWZmZXJzKDEsICZtX3F1YWRWZXJ0aWNlcyk7CisgICAgICAgIGdsQmluZEJ1
ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1fcXVhZFZlcnRpY2VzKTsKKyAgICAgICAgZ2xCdWZmZXJE
YXRhKEdMX0FSUkFZX0JVRkZFUiwgc2l6ZW9mKHZlcnRpY2VzKSwgdmVydGljZXMsIEdMX1NUQVRJ
Q19EUkFXKTsKKyAgICB9CisgICAgcmV0dXJuIG1fcXVhZFZlcnRpY2VzOworfQorCisKK3Vuc2ln
bmVkIEdMRVMyQ2FudmFzOjpnZXRRdWFkSW5kaWNlcygpCit7CisgICAgaWYgKCFtX3F1YWRJbmRp
Y2VzKSB7CisgICAgICAgIEdMdXNob3J0IGluZGljZXNbXSA9IHsgMCwgMSwgMiwgMCwgMiwgM307
CisKKyAgICAgICAgZ2xHZW5CdWZmZXJzKDEsICZtX3F1YWRJbmRpY2VzKTsKKyAgICAgICAgZ2xC
aW5kQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtX3F1YWRJbmRpY2VzKTsKKyAgICAg
ICAgZ2xCdWZmZXJEYXRhKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBzaXplb2YoaW5kaWNlcyks
IGluZGljZXMsIEdMX1NUQVRJQ19EUkFXKTsKKyAgICB9CisgICAgcmV0dXJuIG1fcXVhZEluZGlj
ZXM7Cit9CisKK3N0YXRpYyBHTHVpbnQgbG9hZFNoYWRlcihHTGVudW0gdHlwZSwgY29uc3QgY2hh
ciogc2hhZGVyU291cmNlKQoreworICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcih0
eXBlKTsKKyAgICBpZiAoIXNoYWRlcikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBnbFNoYWRl
clNvdXJjZShzaGFkZXIsIDEsICZzaGFkZXJTb3VyY2UsIDApOworICAgIGdsQ29tcGlsZVNoYWRl
cihzaGFkZXIpOworICAgIEdMaW50IGNvbXBpbGVTdGF0dXM7CisgICAgZ2xHZXRTaGFkZXJpdihz
aGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29tcGlsZVN0YXR1cyk7CisgICAgaWYgKCFjb21w
aWxlU3RhdHVzKSB7CisgICAgICAgIGludCBsZW5ndGg7CisgICAgICAgIGdsR2V0U2hhZGVyaXYo
c2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZsZW5ndGgpOworICAgICAgICBjaGFyKiBsb2cg
PSBuZXcgY2hhcltsZW5ndGhdOworICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBs
ZW5ndGgsIDAsIGxvZyk7CisgICAgICAgIHByaW50ZigiJXNcbiIsIGxvZyk7CisgICAgICAgIGRl
bGV0ZSBsb2c7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgICAgIHJldHVy
biAwOworICAgIH0KKyAgICByZXR1cm4gc2hhZGVyOworfQorCit1bnNpZ25lZCBHTEVTMkNhbnZh
czo6Z2V0U2ltcGxlUHJvZ3JhbSgpCit7CisgICAgaWYgKCFtX3NpbXBsZVByb2dyYW0pIHsKKyAg
ICAgICAgR0x1aW50IHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwK
KyAgICAgICAgICAgICJ1bmlmb3JtIG1hdDMgbWF0cml4O1xuIgorICAgICAgICAgICAgInVuaWZv
cm0gdmVjNCBjb2xvcjtcbiIKKyAgICAgICAgICAgICJhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtc
biIKKyAgICAgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICAgICAiICAgIGdsX1Bv
c2l0aW9uID0gdmVjNChtYXRyaXggKiBwb3NpdGlvbiwgMS4wKTtcbiIKKyAgICAgICAgICAgICJ9
XG4iKTsKKyAgICAgICAgaWYgKCF2ZXJ0ZXhTaGFkZXIpCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgR0x1aW50IGZyYWdtZW50U2hhZGVyID0gbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9T
SEFERVIsCisgICAgICAgICAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgICAg
ICAgICAidW5pZm9ybSBtYXQzIG1hdHJpeDtcbiIKKyAgICAgICAgICAgICJ1bmlmb3JtIHZlYzQg
Y29sb3I7XG4iCisgICAgICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgICAgICAgIiAg
ICBnbF9GcmFnQ29sb3IgPSBjb2xvcjtcbiIKKyAgICAgICAgICAgICJ9XG4iKTsKKyAgICAgICAg
aWYgKCFmcmFnbWVudFNoYWRlcikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBtX3Np
bXBsZVByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKKyAgICAgICAgaWYgKCFtX3NpbXBsZVBy
b2dyYW0pCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZ2xBdHRhY2hTaGFkZXIobV9z
aW1wbGVQcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOworICAgICAgICBnbEF0dGFjaFNoYWRlcihtX3Np
bXBsZVByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTsKKyAgICAgICAgZ2xMaW5rUHJvZ3JhbShtX3Np
bXBsZVByb2dyYW0pOworICAgICAgICBHTGludCBsaW5rU3RhdHVzOworICAgICAgICBnbEdldFBy
b2dyYW1pdihtX3NpbXBsZVByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7Cisg
ICAgICAgIGlmICghbGlua1N0YXR1cykgeworICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKG1f
c2ltcGxlUHJvZ3JhbSk7CisgICAgICAgICAgICBtX3NpbXBsZVByb2dyYW0gPSAwOworICAgICAg
ICB9CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAgICAgIGdsRGVs
ZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKKyAgICAgICAgbV9zaW1wbGVQb3NpdGlvbkxvY2F0
aW9uID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihtX3NpbXBsZVByb2dyYW0sICJwb3NpdGlvbiIpOwor
ICAgICAgICBtX3NpbXBsZU1hdHJpeExvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV9z
aW1wbGVQcm9ncmFtLCAibWF0cml4Iik7CisgICAgICAgIG1fc2ltcGxlQ29sb3JMb2NhdGlvbiA9
IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fc2ltcGxlUHJvZ3JhbSwgImNvbG9yIik7CisgICAgfQor
ICAgIHJldHVybiBtX3NpbXBsZVByb2dyYW07Cit9CisKK3Vuc2lnbmVkIEdMRVMyQ2FudmFzOjpn
ZXRUZXhQcm9ncmFtKCkKK3sKKyAgICBpZiAoIW1fdGV4UHJvZ3JhbSkgeworICAgICAgICBHTHVp
bnQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLAorICAgICAgICAg
ICAgInVuaWZvcm0gbWF0MyBtYXRyaXg7XG4iCisgICAgICAgICAgICAidW5pZm9ybSBtYXQzIHRl
eE1hdHJpeDtcbiIKKyAgICAgICAgICAgICJhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcbiIKKyAg
ICAgICAgICAgICJ2YXJ5aW5nIHZlYzMgdGV4Q29vcmQ7XG4iCisgICAgICAgICAgICAidm9pZCBt
YWluKCkge1xuIgorICAgICAgICAgICAgIiAgICB0ZXhDb29yZCA9IHRleE1hdHJpeCAqIHBvc2l0
aW9uO1xuIgorICAgICAgICAgICAgIiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0cml4ICogcG9z
aXRpb24sIDEuMCk7XG4iCisgICAgICAgICAgICAifVxuIik7CisgICAgICAgIGlmICghdmVydGV4
U2hhZGVyKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEdMdWludCBmcmFnbWVudFNo
YWRlciA9IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLAorICAgICAgICAgICAgInByZWNp
c2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICAgICAgICAgInVuaWZvcm0gc2FtcGxlcjJEIHNh
bXBsZXI7XG4iCisgICAgICAgICAgICAidW5pZm9ybSBmbG9hdCBhbHBoYTtcbiIKKyAgICAgICAg
ICAgICJ2YXJ5aW5nIHZlYzMgdGV4Q29vcmQ7XG4iCisgICAgICAgICAgICAidm9pZCBtYWluKCkg
e1xuIgorICAgICAgICAgICAgIiAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoc2FtcGxlciwg
dGV4Q29vcmQueHkpKiB2ZWM0KGFscGhhKTtcbiIKKyAgICAgICAgICAgICJ9XG4iKTsKKyAgICAg
ICAgaWYgKCFmcmFnbWVudFNoYWRlcikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBt
X3RleFByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKKyAgICAgICAgaWYgKCFtX3RleFByb2dy
YW0pCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZ2xBdHRhY2hTaGFkZXIobV90ZXhQ
cm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOworICAgICAgICBnbEF0dGFjaFNoYWRlcihtX3RleFByb2dy
YW0sIGZyYWdtZW50U2hhZGVyKTsKKyAgICAgICAgZ2xMaW5rUHJvZ3JhbShtX3RleFByb2dyYW0p
OworICAgICAgICBHTGludCBsaW5rU3RhdHVzOworICAgICAgICBnbEdldFByb2dyYW1pdihtX3Rl
eFByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7CisgICAgICAgIGlmICghbGlu
a1N0YXR1cykgeworICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKG1fdGV4UHJvZ3JhbSk7Cisg
ICAgICAgICAgICBtX3RleFByb2dyYW0gPSAwOworICAgICAgICB9CisgICAgICAgIGdsRGVsZXRl
U2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKGZyYWdtZW50U2hh
ZGVyKTsKKyAgICAgICAgbV90ZXhNYXRyaXhMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9u
KG1fdGV4UHJvZ3JhbSwgIm1hdHJpeCIpOworICAgICAgICBtX3RleFNhbXBsZXJMb2NhdGlvbiA9
IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fdGV4UHJvZ3JhbSwgInNhbXBsZXIiKTsKKyAgICAgICAg
bV90ZXhUZXhNYXRyaXhMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fdGV4UHJvZ3Jh
bSwgInRleE1hdHJpeCIpOworICAgICAgICBtX3RleFBvc2l0aW9uTG9jYXRpb24gPSBnbEdldEF0
dHJpYkxvY2F0aW9uKG1fdGV4UHJvZ3JhbSwgInBvc2l0aW9uIik7CisgICAgICAgIG1fdGV4QWxw
aGFMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fdGV4UHJvZ3JhbSwgImFscGhhIik7
CisgICAgfQorICAgIHJldHVybiBtX3RleFByb2dyYW07Cit9CisKK0dMRVMyVGV4dHVyZSogR0xF
UzJDYW52YXM6OmNyZWF0ZVRleHR1cmUoTmF0aXZlSW1hZ2VQdHIgcHRyLCBHTEVTMlRleHR1cmU6
OkZvcm1hdCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBQYXNzUmVmUHRy
PEdMRVMyVGV4dHVyZT4gdGV4dHVyZSA9IG1fdGV4dHVyZXMuZ2V0KHB0cik7CisgICAgaWYgKHRl
eHR1cmUpCisgICAgICAgIHJldHVybiB0ZXh0dXJlLmdldCgpOworCisgICAgdGV4dHVyZSA9IEdM
RVMyVGV4dHVyZTo6Y3JlYXRlKGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisgICAgR0xFUzJUZXh0
dXJlKiB0ID0gdGV4dHVyZS5nZXQoKTsKKyAgICBtX3RleHR1cmVzLnNldChwdHIsIHRleHR1cmUp
OworICAgIHJldHVybiB0OworfQorCitHTEVTMlRleHR1cmUqIEdMRVMyQ2FudmFzOjpnZXRUZXh0
dXJlKE5hdGl2ZUltYWdlUHRyIHB0cikKK3sKKyAgICBQYXNzUmVmUHRyPEdMRVMyVGV4dHVyZT4g
dGV4dHVyZSA9IG1fdGV4dHVyZXMuZ2V0KHB0cik7CisgICAgcmV0dXJuIHRleHR1cmUgPyB0ZXh0
dXJlLmdldCgpIDogMDsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6Y2hlY2tHTEVycm9yKGNvbnN0
IGNoYXIqIGhlYWRlcikKK3sKKyNpZm5kZWYgTkRFQlVHCisgICAgR0xlbnVtIGVycjsKKyAgICB3
aGlsZSAoKGVyciA9IGdsR2V0RXJyb3IoKSkgIT0gR0xfTk9fRVJST1IpIHsKKyAgICAgICAgY29u
c3QgY2hhciogZXJyb3JTdHIgPSAiKioqIFVOS05PV04gRVJST1IgKioqIjsKKyAgICAgICAgc3dp
dGNoIChlcnIpIHsKKyAgICAgICAgY2FzZSBHTF9JTlZBTElEX0VOVU06CisgICAgICAgICAgICBl
cnJvclN0ciA9ICJHTF9JTlZBTElEX0VOVU0iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgR0xfSU5WQUxJRF9WQUxVRToKKyAgICAgICAgICAgIGVycm9yU3RyID0gIkdMX0lOVkFM
SURfVkFMVUUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfSU5WQUxJRF9P
UEVSQVRJT046CisgICAgICAgICAgICBlcnJvclN0ciA9ICJHTF9JTlZBTElEX09QRVJBVElPTiI7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9JTlZBTElEX0ZSQU1FQlVGRkVS
X09QRVJBVElPTjoKKyAgICAgICAgICAgIGVycm9yU3RyID0gIkdMX0lOVkFMSURfRlJBTUVCVUZG
RVJfT1BFUkFUSU9OIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX09VVF9P
Rl9NRU1PUlk6CisgICAgICAgICAgICBlcnJvclN0ciA9ICJHTF9PVVRfT0ZfTUVNT1JZIjsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChoZWFkZXIpCisgICAgICAg
ICAgICBMT0dfRVJST1IoIiVzOiAgJXMiLCBoZWFkZXIsIGVycm9yU3RyKTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgTE9HX0VSUk9SKCIlcyIsIGVycm9yU3RyKTsKKyAgICB9CisjZW5kaWYK
K30KKworfTsKKworI2VuZGlmCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0dMRVMyQ2FudmFzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9HTEVTMkNhbnZhcy5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMkNhbnZhcy5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoK
KyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaWZuZGVmIEdMRVMyQ2FudmFzX2gKKyNkZWZpbmUgR0xFUzJDYW52YXNfaAorCisj
aWYgVVNFKEdMRVMyX1JFTkRFUklORykKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgor
I2luY2x1ZGUgIkNvbG9yLmgiCisjaW5jbHVkZSAiQ29sb3JTcGFjZS5oIgorI2luY2x1ZGUgIkdM
RVMyVGV4dHVyZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzVHlwZXMuaCIKKyNpbmNsdWRlICJJbWFn
ZVNvdXJjZS5oIgorCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvTm9u
Y29weWFibGUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBGbG9hdFJlY3Q7Citj
bGFzcyBDb2xvcjsKK2NsYXNzIEdMRVMyQ29udGV4dDsKKwordHlwZWRlZiBIYXNoTWFwPE5hdGl2
ZUltYWdlUHRyLCBSZWZQdHI8R0xFUzJUZXh0dXJlPiA+IFRleHR1cmVIYXNoTWFwOworCitjbGFz
cyBHTEVTMkNhbnZhcyA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CitwdWJsaWM6CisgICAgR0xFUzJD
YW52YXMoR0xFUzJDb250ZXh0KiBjb250ZXh0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAg
IH5HTEVTMkNhbnZhcygpOworCisgICAgdm9pZCBmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJl
Y3QsIGNvbnN0IENvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UgY29s
b3JTcGFjZSk7CisgICAgdm9pZCBmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpOworICAg
IHZvaWQgY2xlYXJSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCk7CisgICAgdm9pZCBzZXRGaWxs
Q29sb3IoY29uc3QgQ29sb3ImIGNvbG9yLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UpOworICAgIHZv
aWQgc2V0QWxwaGEoZmxvYXQgYWxwaGEpOworICAgIHZvaWQgc2V0Q29tcG9zaXRlT3BlcmF0aW9u
KENvbXBvc2l0ZU9wZXJhdG9yIG9wKTsKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCB4LCBmbG9h
dCB5KTsKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCBhbmdsZUluUmFkaWFucyk7CisgICAgdm9pZCBz
Y2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpOworICAgIHZvaWQgY29uY2F0Q1RNKGNvbnN0IEFm
ZmluZVRyYW5zZm9ybSYgYWZmaW5lKTsKKworICAgIHZvaWQgc2F2ZSgpOworICAgIHZvaWQgcmVz
dG9yZSgpOworCisgICAgLy8gbm9uLXN0YW5kYXJkIGZ1bmN0aW9ucworICAgIC8vIFRoZXNlIGFy
ZSBub3Qgc3RhbmRhcmQgR3JhcGhpY3NDb250ZXh0IGZ1bmN0aW9ucywgYW5kIHNob3VsZCBiZSBw
dXNoZWQKKyAgICAvLyBkb3duIGludG8gYSBQbGF0Zm9ybUNvbnRleHRHTEVTMiBhdCBzb21lIHBv
aW50LgorICAgIHZvaWQgZHJhd1RleHR1cmVkUmVjdChHTEVTMlRleHR1cmUqIHRleHR1cmUsIGNv
bnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBB
ZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSwgZmxvYXQgYWxwaGEsIENvbG9yU3BhY2UgY29sb3JT
cGFjZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApOworICAgIHZvaWQgZHJhd1RleHR1
cmVkUmVjdChHTEVTMlRleHR1cmUqIHRleHR1cmUsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwg
Y29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBDb2xvclNwYWNlIGNvbG9yU3BhY2UsIENvbXBvc2l0
ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKTsKKyAgICBHTEVTMkNvbnRleHQqIGdsZXMyQ29udGV4dCgp
IHsgcmV0dXJuIG1fZ2xlczJDb250ZXh0OyB9CisgICAgR0xFUzJUZXh0dXJlKiBjcmVhdGVUZXh0
dXJlKE5hdGl2ZUltYWdlUHRyIHB0ciwgR0xFUzJUZXh0dXJlOjpGb3JtYXQgZm9ybWF0LCBpbnQg
d2lkdGgsIGludCBoZWlnaHQpOworICAgIEdMRVMyVGV4dHVyZSogZ2V0VGV4dHVyZShOYXRpdmVJ
bWFnZVB0ciBwdHIpOworCitwcml2YXRlOgorICAgIHZvaWQgYXBwbHlDb21wb3NpdGVPcGVyYXRv
cihDb21wb3NpdGVPcGVyYXRvciBvcCk7CisgICAgdm9pZCBjaGVja0dMRXJyb3IoY29uc3QgY2hh
ciogaGVhZGVyKTsKKyAgICB1bnNpZ25lZCBnZXRRdWFkVmVydGljZXMoKTsKKyAgICB1bnNpZ25l
ZCBnZXRRdWFkSW5kaWNlcygpOworICAgIHVuc2lnbmVkIGdldFNpbXBsZVByb2dyYW0oKTsKKyAg
ICB1bnNpZ25lZCBnZXRUZXhQcm9ncmFtKCk7CisKKyAgICBHTEVTMkNvbnRleHQqIG1fZ2xlczJD
b250ZXh0OworICAgIHN0cnVjdCBTdGF0ZTsKKyAgICBXVEY6OlZlY3RvcjxTdGF0ZT4gbV9zdGF0
ZVN0YWNrOworICAgIFN0YXRlKiBtX3N0YXRlOworICAgIHVuc2lnbmVkIG1fcXVhZFZlcnRpY2Vz
OworICAgIHVuc2lnbmVkIG1fcXVhZEluZGljZXM7CisgICAgdW5zaWduZWQgbV9zaW1wbGVQcm9n
cmFtOworICAgIHVuc2lnbmVkIG1fdGV4UHJvZ3JhbTsKKyAgICBpbnQgbV9zaW1wbGVNYXRyaXhM
b2NhdGlvbjsKKyAgICBpbnQgbV9zaW1wbGVDb2xvckxvY2F0aW9uOworICAgIGludCBtX3NpbXBs
ZVBvc2l0aW9uTG9jYXRpb247CisgICAgaW50IG1fdGV4TWF0cml4TG9jYXRpb247CisgICAgaW50
IG1fdGV4VGV4TWF0cml4TG9jYXRpb247CisgICAgaW50IG1fdGV4U2FtcGxlckxvY2F0aW9uOwor
ICAgIGludCBtX3RleEFscGhhTG9jYXRpb247CisgICAgaW50IG1fdGV4UG9zaXRpb25Mb2NhdGlv
bjsKKyAgICBpbnQgbV93aWR0aDsKKyAgICBpbnQgbV9oZWlnaHQ7CisgICAgQWZmaW5lVHJhbnNm
b3JtIG1fZmxpcE1hdHJpeDsKKyAgICBUZXh0dXJlSGFzaE1hcCBtX3RleHR1cmVzOworICAgIENv
bXBvc2l0ZU9wZXJhdG9yIG1fbGFzdENvbXBvc2l0ZU9wOyAvLyBUaGlzIGlzIHRoZSBvbmUgbGFz
dCBzZXQsIG5vdCBuZWNlc3NhcmlseSB0aGUgb25lIGluIHRoZSBzdGF0ZSBzdGFjay4KK307CisK
K307CisKKyNlbmRpZgorCisjZW5kaWYgLy8gR0xFUzJDYW52YXNfaApJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMlRleHR1cmUuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJUZXh0dXJlLmNwcAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJUZXh0
dXJlLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4K
KyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIg
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkdMRVMyVGV4dHVyZS5oIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworR0xFUzJUZXh0dXJlOjpHTEVTMlRleHR1cmUodW5zaWdu
ZWQgaW50IHRleHR1cmVJZCwgRm9ybWF0IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQor
ICAgIDogbV90ZXh0dXJlSWQodGV4dHVyZUlkKQorICAgICwgbV9mb3JtYXQoZm9ybWF0KQorICAg
ICwgbV93aWR0aCh3aWR0aCkKKyAgICAsIG1faGVpZ2h0KGhlaWdodCkKK3sKK30KKworR0xFUzJU
ZXh0dXJlOjp+R0xFUzJUZXh0dXJlKCkKK3sKKyAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtX3Rl
eHR1cmVJZCk7Cit9CisKK1Bhc3NSZWZQdHI8R0xFUzJUZXh0dXJlPiBHTEVTMlRleHR1cmU6OmNy
ZWF0ZShGb3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgR0x1aW50
IHRleHR1cmVJZDsKKyAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlSWQpOworICAgIGlmICgh
dGV4dHVyZUlkKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGdsQmluZFRleHR1cmUoR0xfVEVY
VFVSRV8yRCwgdGV4dHVyZUlkKTsKKyAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwg
R0xfUkdCQSwgd2lkdGgsIGhlaWdodCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgMCk7
CisKKyAgICBpbnQgbWF4OworICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1RFWFRVUkVfU0laRSwg
Jm1heCk7CisgICAgaWYgKHdpZHRoID4gbWF4IHx8IGhlaWdodCA+IG1heCkKKyAgICAgICAgQVNT
RVJUKCEidGV4dHVyZSB0b28gYmlnIik7CisKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IEdMRVMy
VGV4dHVyZSh0ZXh0dXJlSWQsIGZvcm1hdCwgd2lkdGgsIGhlaWdodCkpOworfQorCitzdGF0aWMg
dm9pZCBjb252ZXJ0Rm9ybWF0KEdMRVMyVGV4dHVyZTo6Rm9ybWF0IGZvcm1hdCwgdW5zaWduZWQg
aW50KiBnbEZvcm1hdCwgdW5zaWduZWQgaW50KiBnbFR5cGUsIGJvb2wqIHN3aXp6bGUpCit7Cisg
ICAgKnN3aXp6bGUgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgR0xF
UzJUZXh0dXJlOjpSR0JBODoKKyAgICAgICAgKmdsRm9ybWF0ID0gR0xfUkdCQTsKKyAgICAgICAg
KmdsVHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xF
UzJUZXh0dXJlOjpCR1JBODoKKy8vIEZJWE1FOiAgT25jZSB3ZSBoYXZlIHN1cHBvcnQgZm9yIGV4
dGVuc2lvbnMsIHdlIHNob3VsZCBjaGVjayBmb3IgRVhUX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4
LAorLy8gYW5kIHVzZSB0aGF0IGlmIHByZXNlbnQuCisgICAgICAgICpnbEZvcm1hdCA9IEdMX1JH
QkE7CisgICAgICAgICpnbFR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgICAqc3dpenps
ZSA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVCgh
ImJhZCBmb3JtYXQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIEdMRVMyVGV4
dHVyZTo6bG9hZCh2b2lkKiBwaXhlbHMpCit7CisgICAgdW5zaWduZWQgaW50IGdsRm9ybWF0LCBn
bFR5cGU7CisgICAgYm9vbCBzd2l6emxlOworICAgIGNvbnZlcnRGb3JtYXQobV9mb3JtYXQsICZn
bEZvcm1hdCwgJmdsVHlwZSwgJnN3aXp6bGUpOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVS
RV8yRCwgbV90ZXh0dXJlSWQpOworICAgIGlmIChzd2l6emxlKSB7CisgICAgICAgIEFTU0VSVChn
bEZvcm1hdCA9PSBHTF9SR0JBICYmIGdsVHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKTsKKyAgICAg
ICAgLy8gRklYTUU6ICBUaGlzIGNvdWxkIHVzZSBQQk8ncyB0byBzYXZlIGRvaW5nIGFuIGV4dHJh
IGNvcHkgaGVyZS4KKyAgICAgICAgaW50IHNpemUgPSBtX3dpZHRoICogbV9oZWlnaHQ7CisgICAg
ICAgIHVpbnQzMl90KiBwaXhlbHMzMiA9IHN0YXRpY19jYXN0PHVpbnQzMl90Kj4ocGl4ZWxzKTsK
KyAgICAgICAgdWludDMyX3QqIGJ1ZiA9IG5ldyB1aW50MzJfdFtzaXplXTsKKyAgICAgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBpeGVs
ID0gcGl4ZWxzMzJbaV07CisgICAgICAgICAgICBidWZbaV0gPSBwaXhlbCAmIDB4RkYwMEZGMDAg
fCAoKHBpeGVsICYgMHgwMEZGMDAwMCkgPj4gMTYpIHwgKChwaXhlbCAmIDB4MDAwMDAwRkYpIDw8
IDE2KTsKKyAgICAgICAgfQorICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwg
MCwgMCwgMCwgbV93aWR0aCwgbV9oZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIGJ1Zik7CisgICAg
ICAgIGRlbGV0ZVtdIGJ1ZjsKKyAgICB9IGVsc2UKKyAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9U
RVhUVVJFXzJELCAwLCAwLCAwLCBtX3dpZHRoLCBtX2hlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwg
cGl4ZWxzKTsKK30KKwordm9pZCBHTEVTMlRleHR1cmU6OmJpbmQoKQoreworICAgIGdsQmluZFRl
eHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlSWQpOworICAgIGdsVGV4UGFyYW1ldGVyaShH
TF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgZ2xU
ZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElO
RUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQ
X1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJE
LCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7Cit9CisKK307CkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyVGV4dHVyZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJUZXh0dXJlLmgJ
KHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMy
VGV4dHVyZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0
IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24u
CisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMg
b2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMi
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgR0xFUzJUZXh0
dXJlX2gKKyNkZWZpbmUgR0xFUzJUZXh0dXJlX2gKKworI2lmIFVTRShHTEVTMl9SRU5ERVJJTkcp
CisKKyNpbmNsdWRlICJSZWZDb3VudGVkLmgiCisjaW5jbHVkZSAiUmVmUHRyLmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR0xFUzJUZXh0dXJlIDogcHVibGljIFJlZkNvdW50ZWQ8
R0xFUzJUZXh0dXJlPiB7CitwdWJsaWM6CisgICAgfkdMRVMyVGV4dHVyZSgpOworICAgIGVudW0g
Rm9ybWF0IHsgUkdCQTgsIEJHUkE4IH07CisgICAgc3RhdGljIFBhc3NSZWZQdHI8R0xFUzJUZXh0
dXJlPiBjcmVhdGUoRm9ybWF0IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICB2
b2lkIGJpbmQoKTsKKyAgICB2b2lkIGxvYWQodm9pZCogcGl4ZWxzKTsKKyAgICBGb3JtYXQgZm9y
bWF0KCkgY29uc3QgeyByZXR1cm4gbV9mb3JtYXQ7IH0KKyAgICBpbnQgd2lkdGgoKSBjb25zdCB7
IHJldHVybiBtX3dpZHRoOyB9CisgICAgaW50IGhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1faGVp
Z2h0OyB9Citwcml2YXRlOgorICAgIEdMRVMyVGV4dHVyZSh1bnNpZ25lZCBpbnQgdGV4dHVyZUlk
LCBGb3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgIHVuc2lnbmVkIGlu
dCBtX3RleHR1cmVJZDsKKyAgICBGb3JtYXQgbV9mb3JtYXQ7CisgICAgaW50IG1fd2lkdGg7Cisg
ICAgaW50IG1faGVpZ2h0OworfTsKKworfTsKKworI2VuZGlmCisKKyNlbmRpZiAvLyBHTEVTMlRl
eHR1cmVfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62467</attachid>
            <date>2010-07-23 15:21:38 -0700</date>
            <delta_ts>2010-07-23 15:37:31 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-42905-20100723182136.patch</filename>
            <type>text/plain</type>
            <size>33197</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Mzk5NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTkgQEAKKzIwMTAtMDctMjMgIFN0ZXBoZW4gV2hpdGUgIDxzZW5vcmJsYW5jb0Bj
aHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgSW1wbGVtZW50IE9wZW5HTEVTMiBoZWxwZXIgY2xhc3Nlcy4KKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQyOTA1CisKKyAgICAgICAgR0xFUzJD
YW52YXMgYW5kIEdMRVMyVGV4dHVyZSBhcmUgc29tZSBzaW1wbGUgT3BlbkdMRVMyIGhlbHBlciBj
bGFzc2VzCisgICAgICAgIGZvciBtYW5hZ2luZyBzdGF0ZSwgc2FtcGxlcnMgYW5kIHRleHR1cmVz
LgorCisgICAgICAgIFdoZW4gdGhpcyBpcyBob29rZWQgdXAsIGl0IHdpbGwgYmUgY292ZXJlZCBi
eSBtYW55IGxheW91dCB0ZXN0cy4KKworICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAg
QWRkIG5ldyBmaWxlcyB0byBjaHJvbWl1bSBidWlsZCAoY29udGVudHMgYXJlIHByb3RlY3RlZCBi
eSAjaWYncyBmb3Igbm93KS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9H
TEVTMkNhbnZhcy5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6YWZmaW5lVG8zeDMpOgor
ICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OlN0YXRlOjpTdGF0ZSk6CisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMkNhbnZhczo6R0xFUzJDYW52YXMpOgorICAgICAgICAoV2ViQ29yZTo6R0xF
UzJDYW52YXM6On5HTEVTMkNhbnZhcyk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6
Y2xlYXJSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpmaWxsUmVjdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6c2V0RmlsbENvbG9yKToKKyAgICAgICAgKFdl
YkNvcmU6OkdMRVMyQ2FudmFzOjpzZXRBbHBoYSk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMkNh
bnZhczo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpyb3RhdGUp
OgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OnNjYWxlKToKKyAgICAgICAgKFdlYkNv
cmU6OkdMRVMyQ2FudmFzOjpjb25jYXRDVE0pOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52
YXM6OnNhdmUpOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OnJlc3RvcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OmRyYXdUZXh0dXJlZFJlY3QpOgorICAgICAgICAo
V2ViQ29yZTo6R0xFUzJDYW52YXM6OnNldENvbXBvc2l0ZU9wZXJhdGlvbik6CisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMkNhbnZhczo6YXBwbHlDb21wb3NpdGVPcGVyYXRvcik6CisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMkNhbnZhczo6Z2V0UXVhZFZlcnRpY2VzKToKKyAgICAgICAgKFdlYkNvcmU6
OkdMRVMyQ2FudmFzOjpnZXRRdWFkSW5kaWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpsb2FkU2hh
ZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpnZXRTaW1wbGVQcm9ncmFtKToK
KyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpnZXRUZXhQcm9ncmFtKToKKyAgICAgICAg
KFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpjcmVhdGVUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6
OkdMRVMyQ2FudmFzOjpnZXRUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFz
OjpjaGVja0dMRXJyb3IpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dM
RVMyQ2FudmFzLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OmdsZXMy
Q29udGV4dCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJUZXh0
dXJlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6OkdMRVMyVGV4
dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6On5HTEVTMlRleHR1cmUpOgor
ICAgICAgICAoV2ViQ29yZTo6R0xFUzJUZXh0dXJlOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29y
ZTo6Y29udmVydEZvcm1hdCk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6OmxvYWQp
OgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJUZXh0dXJlOjpiaW5kKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMlRleHR1cmUuaDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMlRleHR1cmU6Oik6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6
OmZvcm1hdCk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6OndpZHRoKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdMRVMyVGV4dHVyZTo6aGVpZ2h0KToKKworCiAyMDEwLTA3LTIzICBQYXRy
aWNrIEdhbnN0ZXJlciAgPHBhcm9nYUBwYXJvZ2EuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IEFkYW0gUm9iZW4uCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gNjM5OTYpCisrKyBXZWJDb3JlL1dlYkNvcmUu
Z3lwaQkod29ya2luZyBjb3B5KQpAQCAtMjE2OCw2ICsyMTY4LDggQEAKICAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9jZy9QYXRoQ0cuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9n
cmFwaGljcy9jZy9QYXR0ZXJuQ0cuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGlj
cy9jZy9UcmFuc2Zvcm1hdGlvbk1hdHJpeENHLmNwcCcsCisgICAgICAgICAgICAncGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9taXVtLmNwcCcsCisgICAgICAgICAg
ICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9taXVtLmgnLAog
ICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUNocm9taXVt
V2luLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENh
Y2hlTGludXguY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9G
b250Q2hyb21pdW1XaW4uY3BwJywKQEAgLTIxODIsNiArMjE4NCwxMCBAQAogICAgICAgICAgICAg
J3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eC5oJywKICAg
ICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Gb250VXRpbHNDaHJvbWl1bVdp
bi5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRVdGls
c0Nocm9taXVtV2luLmgnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0dMRVMyQ2FudmFzLmNwcCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vR0xFUzJDYW52YXMuaCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vR0xFUzJUZXh0dXJlLmNwcCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vR0xFUzJUZXh0dXJlLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL0dseXBoUGFnZVRyZWVOb2RlQ2hyb21pdW1XaW4uY3BwJywKICAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HbHlwaFBhZ2VUcmVlTm9kZUxpbnV4LmNwcCcsCiAg
ICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9t
aXVtLmNwcCcsCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMy
Q2FudmFzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0dMRVMyQ2FudmFzLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vR0xFUzJDYW52YXMuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUy
MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAq
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICog
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29n
bGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoR0xFUzJfUkVOREVSSU5HKQorCisj
aW5jbHVkZSAiR0xFUzJDYW52YXMuaCIKKworI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1
ZGUgIkdMRVMyQ29udGV4dC5oIgorI2luY2x1ZGUgIkdMRVMyVGV4dHVyZS5oIgorI2luY2x1ZGUg
Ik93bkFycmF5UHRyLmgiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitzdGF0aWMgaW5saW5lIHZvaWQgYWZmaW5lVG8zeDMoY29uc3QgQWZmaW5lVHJh
bnNmb3JtJiB0cmFuc2Zvcm0sIEdMZmxvYXQgbWF0WzldKQoreworICAgIG1hdFswXSA9IHRyYW5z
Zm9ybS5hKCk7CisgICAgbWF0WzFdID0gdHJhbnNmb3JtLmIoKTsKKyAgICBtYXRbMl0gPSAwLjBm
OworICAgIG1hdFszXSA9IHRyYW5zZm9ybS5jKCk7CisgICAgbWF0WzRdID0gdHJhbnNmb3JtLmQo
KTsKKyAgICBtYXRbNV0gPSAwLjBmOworICAgIG1hdFs2XSA9IHRyYW5zZm9ybS5lKCk7CisgICAg
bWF0WzddID0gdHJhbnNmb3JtLmYoKTsKKyAgICBtYXRbOF0gPSAxLjBmOworfQorCitzdHJ1Y3Qg
R0xFUzJDYW52YXM6OlN0YXRlIHsKKyAgICBTdGF0ZSgpCisgICAgICAgIDogbV9maWxsQ29sb3Io
MCwgMCwgMCwgMjU1KQorICAgICAgICAsIG1fYWxwaGEoMS4wZikKKyAgICAgICAgLCBtX2NvbXBv
c2l0ZU9wKENvbXBvc2l0ZVNvdXJjZU92ZXIpCisgICAgeworICAgIH0KKyAgICBDb2xvciBtX2Zp
bGxDb2xvcjsKKyAgICBmbG9hdCBtX2FscGhhOworICAgIENvbXBvc2l0ZU9wZXJhdG9yIG1fY29t
cG9zaXRlT3A7CisgICAgQWZmaW5lVHJhbnNmb3JtIG1fY3RtOworfTsKKworR0xFUzJDYW52YXM6
OkdMRVMyQ2FudmFzKEdMRVMyQ29udGV4dCogY29udGV4dCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0
KQorICAgIDogbV9nbGVzMkNvbnRleHQoY29udGV4dCkKKyAgICAsIG1fcXVhZFZlcnRpY2VzKDAp
CisgICAgLCBtX3F1YWRJbmRpY2VzKDApCisgICAgLCBtX3NpbXBsZVByb2dyYW0oMCkKKyAgICAs
IG1fdGV4UHJvZ3JhbSgwKQorICAgICwgbV9zaW1wbGVNYXRyaXhMb2NhdGlvbigtMSkKKyAgICAs
IG1fc2ltcGxlQ29sb3JMb2NhdGlvbigtMSkKKyAgICAsIG1fc2ltcGxlUG9zaXRpb25Mb2NhdGlv
bigtMSkKKyAgICAsIG1fdGV4TWF0cml4TG9jYXRpb24oLTEpCisgICAgLCBtX3RleFRleE1hdHJp
eExvY2F0aW9uKC0xKQorICAgICwgbV90ZXhTYW1wbGVyTG9jYXRpb24oLTEpCisgICAgLCBtX3Rl
eEFscGhhTG9jYXRpb24oLTEpCisgICAgLCBtX3RleFBvc2l0aW9uTG9jYXRpb24oLTEpCisgICAg
LCBtX3dpZHRoKHdpZHRoKQorICAgICwgbV9oZWlnaHQoaGVpZ2h0KQorICAgICwgbV9zdGF0ZSgw
KQoreworICAgIG1fZmxpcE1hdHJpeC50cmFuc2xhdGUoLTEuMGYsIDEuMGYpOworICAgIG1fZmxp
cE1hdHJpeC5zY2FsZSgyLjBmIC8gd2lkdGgsIC0yLjBmIC8gaGVpZ2h0KTsKKworICAgIG1fZ2xl
czJDb250ZXh0LT5tYWtlQ3VycmVudCgpOworICAgIG1fZ2xlczJDb250ZXh0LT5yZXNpemVPZmZz
Y3JlZW5Db250ZW50KEludFNpemUod2lkdGgsIGhlaWdodCkpOworICAgIG1fZ2xlczJDb250ZXh0
LT5zd2FwQnVmZmVycygpOworICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisK
KyAgICBtX3N0YXRlU3RhY2suYXBwZW5kKFN0YXRlKCkpOworICAgIG1fc3RhdGUgPSAmbV9zdGF0
ZVN0YWNrLmxhc3QoKTsKK30KKworR0xFUzJDYW52YXM6On5HTEVTMkNhbnZhcygpCit7CisgICAg
bV9nbGVzMkNvbnRleHQtPm1ha2VDdXJyZW50KCk7CisgICAgaWYgKG1fc2ltcGxlUHJvZ3JhbSkK
KyAgICAgICAgZ2xEZWxldGVQcm9ncmFtKG1fc2ltcGxlUHJvZ3JhbSk7CisgICAgaWYgKG1fdGV4
UHJvZ3JhbSkKKyAgICAgICAgZ2xEZWxldGVQcm9ncmFtKG1fdGV4UHJvZ3JhbSk7CisgICAgaWYg
KG1fcXVhZFZlcnRpY2VzKQorICAgICAgICBnbERlbGV0ZUJ1ZmZlcnMoMSwgJm1fcXVhZFZlcnRp
Y2VzKTsKKyAgICBpZiAobV9xdWFkSW5kaWNlcykKKyAgICAgICAgZ2xEZWxldGVCdWZmZXJzKDEs
ICZtX3F1YWRWZXJ0aWNlcyk7Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6OmNsZWFyUmVjdChjb25z
dCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgbV9nbGVzMkNvbnRleHQtPm1ha2VDdXJyZW50KCk7
CisKKyAgICBnbFNjaXNzb3IocmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3Qu
aGVpZ2h0KCkpOworICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZ2xDbGVhcihH
TF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKK30K
Kwordm9pZCBHTEVTMkNhbnZhczo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25z
dCBDb2xvciYgY29sb3IsIENvbG9yU3BhY2UgY29sb3JTcGFjZSkKK3sKKyAgICBtX2dsZXMyQ29u
dGV4dC0+bWFrZUN1cnJlbnQoKTsKKworICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIs
IGdldFF1YWRWZXJ0aWNlcygpKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9C
VUZGRVIsIGdldFF1YWRJbmRpY2VzKCkpOworCisgICAgZmxvYXQgcmdiYVs0XTsKKyAgICBjb2xv
ci5nZXRSR0JBKHJnYmFbMF0sIHJnYmFbMV0sIHJnYmFbMl0sIHJnYmFbM10pOworICAgIGdsVW5p
Zm9ybTRmKG1fc2ltcGxlQ29sb3JMb2NhdGlvbiwgcmdiYVswXSAqIHJnYmFbM10sIHJnYmFbMV0g
KiByZ2JhWzNdLCByZ2JhWzJdICogcmdiYVszXSwgcmdiYVszXSk7CisKKyAgICBnbERyYXdFbGVt
ZW50cyhHTF9UUklBTkdMRVMsIDYsIEdMX1VOU0lHTkVEX1NIT1JULCAwKTsKK30KKwordm9pZCBH
TEVTMkNhbnZhczo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIG1fZ2xl
czJDb250ZXh0LT5tYWtlQ3VycmVudCgpOworCisgICAgYXBwbHlDb21wb3NpdGVPcGVyYXRvciht
X3N0YXRlLT5tX2NvbXBvc2l0ZU9wKTsKKworICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZG
RVIsIGdldFF1YWRWZXJ0aWNlcygpKTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJB
WV9CVUZGRVIsIGdldFF1YWRJbmRpY2VzKCkpOworCisgICAgZ2xVc2VQcm9ncmFtKGdldFNpbXBs
ZVByb2dyYW0oKSk7CisKKyAgICBmbG9hdCByZ2JhWzRdOworICAgIG1fc3RhdGUtPm1fZmlsbENv
bG9yLmdldFJHQkEocmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXSwgcmdiYVszXSk7CisgICAgZ2xV
bmlmb3JtNGYobV9zaW1wbGVDb2xvckxvY2F0aW9uLCByZ2JhWzBdICogcmdiYVszXSwgcmdiYVsx
XSAqIHJnYmFbM10sIHJnYmFbMl0gKiByZ2JhWzNdLCByZ2JhWzNdKTsKKworICAgIEFmZmluZVRy
YW5zZm9ybSBtYXRyaXgobV9mbGlwTWF0cml4KTsKKyAgICBtYXRyaXgubXVsdExlZnQobV9zdGF0
ZS0+bV9jdG0pOworICAgIG1hdHJpeC50cmFuc2xhdGUocmVjdC54KCksIHJlY3QueSgpKTsKKyAg
ICBtYXRyaXguc2NhbGUocmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKyAgICBHTGZsb2F0
IG1hdFs5XTsKKyAgICBhZmZpbmVUbzN4MyhtYXRyaXgsIG1hdCk7CisgICAgZ2xVbmlmb3JtTWF0
cml4M2Z2KG1fc2ltcGxlTWF0cml4TG9jYXRpb24sIDEsIEdMX0ZBTFNFLCBtYXQpOworCisgICAg
Z2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1fc2ltcGxlUG9zaXRpb25Mb2NhdGlvbiwgMywgR0xfRkxP
QVQsIEdMX0ZBTFNFLCAwLCAoR0x2b2lkKikoMCkpOworCisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRy
aWJBcnJheShtX3NpbXBsZVBvc2l0aW9uTG9jYXRpb24pOworCisgICAgZ2xEcmF3RWxlbWVudHMo
R0xfVFJJQU5HTEVTLCA2LCBHTF9VTlNJR05FRF9TSE9SVCwgMCk7Cit9CisKK3ZvaWQgR0xFUzJD
YW52YXM6OnNldEZpbGxDb2xvcihjb25zdCBDb2xvciYgY29sb3IsIENvbG9yU3BhY2UgY29sb3JT
cGFjZSkKK3sKKyAgICBtX3N0YXRlLT5tX2ZpbGxDb2xvciA9IGNvbG9yOworfQorCit2b2lkIEdM
RVMyQ2FudmFzOjpzZXRBbHBoYShmbG9hdCBhbHBoYSkKK3sKKyAgICBtX3N0YXRlLT5tX2FscGhh
ID0gYWxwaGE7Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9h
dCB5KQoreworICAgIG1fc3RhdGUtPm1fY3RtLnRyYW5zbGF0ZSh4LCB5KTsKK30KKwordm9pZCBH
TEVTMkNhbnZhczo6cm90YXRlKGZsb2F0IGFuZ2xlSW5SYWRpYW5zKQoreworICAgIG1fc3RhdGUt
Pm1fY3RtLnJvdGF0ZShhbmdsZUluUmFkaWFucyAqICgxODAuMGYgLyAzLjE0MTU5MjY1ZikpOwor
fQorCit2b2lkIEdMRVMyQ2FudmFzOjpzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7Cisg
ICAgbV9zdGF0ZS0+bV9jdG0uc2NhbGUoc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpKTsKK30K
Kwordm9pZCBHTEVTMkNhbnZhczo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgYWZm
aW5lKQoreworICAgIG1fc3RhdGUtPm1fY3RtLm11bHRMZWZ0KGFmZmluZSk7Cit9CisKK3ZvaWQg
R0xFUzJDYW52YXM6OnNhdmUoKQoreworICAgIG1fc3RhdGVTdGFjay5hcHBlbmQoU3RhdGUobV9z
dGF0ZVN0YWNrLmxhc3QoKSkpOworICAgIG1fc3RhdGUgPSAmbV9zdGF0ZVN0YWNrLmxhc3QoKTsK
K30KKwordm9pZCBHTEVTMkNhbnZhczo6cmVzdG9yZSgpCit7CisgICAgbV9zdGF0ZVN0YWNrLnJl
bW92ZUxhc3QoKTsKKyAgICBtX3N0YXRlID0gJm1fc3RhdGVTdGFjay5sYXN0KCk7Cit9CisKK3Zv
aWQgR0xFUzJDYW52YXM6OmRyYXdUZXh0dXJlZFJlY3QoR0xFUzJUZXh0dXJlKiB0ZXh0dXJlLCBj
b25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgQ29sb3JT
cGFjZSBjb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBk
cmF3VGV4dHVyZWRSZWN0KHRleHR1cmUsIHNyY1JlY3QsIGRzdFJlY3QsIG1fc3RhdGUtPm1fY3Rt
LCBtX3N0YXRlLT5tX2FscGhhLCBjb2xvclNwYWNlLCBjb21wb3NpdGVPcCk7Cit9CisKK3ZvaWQg
R0xFUzJDYW52YXM6OmRyYXdUZXh0dXJlZFJlY3QoR0xFUzJUZXh0dXJlKiB0ZXh0dXJlLCBjb25z
dCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgQWZm
aW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0sIGZsb2F0IGFscGhhLCBDb2xvclNwYWNlIGNvbG9yU3Bh
Y2UsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIG1fZ2xlczJDb250ZXh0
LT5tYWtlQ3VycmVudCgpOworCisgICAgYXBwbHlDb21wb3NpdGVPcGVyYXRvcihjb21wb3NpdGVP
cCk7CisKKyAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBnZXRRdWFkVmVydGljZXMo
KSk7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBnZXRRdWFkSW5k
aWNlcygpKTsKKyAgICBjaGVja0dMRXJyb3IoImdsQmluZEJ1ZmZlciIpOworCisgICAgZ2xVc2VQ
cm9ncmFtKGdldFRleFByb2dyYW0oKSk7CisgICAgY2hlY2tHTEVycm9yKCJnbFVzZVByb2dyYW0i
KTsKKworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisgICAgdGV4dHVyZS0+Ymlu
ZCgpOworCisgICAgZ2xVbmlmb3JtMWkobV90ZXhTYW1wbGVyTG9jYXRpb24sIDApOworICAgIGNo
ZWNrR0xFcnJvcigiZ2xVbmlmb3JtMWkiKTsKKworICAgIGdsVW5pZm9ybTFmKG1fdGV4QWxwaGFM
b2NhdGlvbiwgYWxwaGEpOworICAgIGNoZWNrR0xFcnJvcigiZ2xVbmlmb3JtMWYgZm9yIGFscGhh
Iik7CisKKyAgICBBZmZpbmVUcmFuc2Zvcm0gbWF0cml4KG1fZmxpcE1hdHJpeCk7CisgICAgbWF0
cml4Lm11bHRMZWZ0KHRyYW5zZm9ybSk7CisgICAgbWF0cml4LnRyYW5zbGF0ZShkc3RSZWN0Lngo
KSwgZHN0UmVjdC55KCkpOworICAgIG1hdHJpeC5zY2FsZShkc3RSZWN0LndpZHRoKCksIGRzdFJl
Y3QuaGVpZ2h0KCkpOworICAgIEdMZmxvYXQgbWF0WzldOworICAgIGFmZmluZVRvM3gzKG1hdHJp
eCwgbWF0KTsKKyAgICBnbFVuaWZvcm1NYXRyaXgzZnYobV90ZXhNYXRyaXhMb2NhdGlvbiwgMSwg
R0xfRkFMU0UsIG1hdCk7CisgICAgY2hlY2tHTEVycm9yKCJnbFVuaWZvcm1NYXRyaXgzZnYiKTsK
KworICAgIEFmZmluZVRyYW5zZm9ybSB0ZXhNYXRyaXg7CisgICAgdGV4TWF0cml4LnNjYWxlKDEu
MGYgLyB0ZXh0dXJlLT53aWR0aCgpLCAxLjBmIC8gdGV4dHVyZS0+aGVpZ2h0KCkpOworICAgIHRl
eE1hdHJpeC50cmFuc2xhdGUoc3JjUmVjdC54KCksIHNyY1JlY3QueSgpKTsKKyAgICB0ZXhNYXRy
aXguc2NhbGUoc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgpKTsKKyAgICBHTGZsb2F0
IHRleE1hdFs5XTsKKyAgICBhZmZpbmVUbzN4Myh0ZXhNYXRyaXgsIHRleE1hdCk7CisgICAgZ2xV
bmlmb3JtTWF0cml4M2Z2KG1fdGV4VGV4TWF0cml4TG9jYXRpb24sIDEsIEdMX0ZBTFNFLCB0ZXhN
YXQpOworICAgIGNoZWNrR0xFcnJvcigiZ2xVbmlmb3JtTWF0cml4M2Z2Iik7CisKKyAgICBnbFZl
cnRleEF0dHJpYlBvaW50ZXIobV90ZXhQb3NpdGlvbkxvY2F0aW9uLCAzLCBHTF9GTE9BVCwgR0xf
RkFMU0UsIDAsIChHTHZvaWQqKSgwKSk7CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5
KG1fdGV4UG9zaXRpb25Mb2NhdGlvbik7CisKKyAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdM
RVMsIDYsIEdMX1VOU0lHTkVEX1NIT1JULCAwKTsKKyAgICBjaGVja0dMRXJyb3IoImdsRHJhd0Vs
ZW1lbnRzIik7Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihD
b21wb3NpdGVPcGVyYXRvciBvcCkKK3sKKyAgICBtX3N0YXRlLT5tX2NvbXBvc2l0ZU9wID0gb3A7
Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6OmFwcGx5Q29tcG9zaXRlT3BlcmF0b3IoQ29tcG9zaXRl
T3BlcmF0b3Igb3ApCit7CisgICAgaWYgKG9wID09IG1fbGFzdENvbXBvc2l0ZU9wKQorICAgICAg
ICByZXR1cm47CisKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBDb21wb3NpdGVDbGVhcjoK
KyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICBnbEJsZW5kRnVuYyhHTF9aRVJP
LCBHTF9aRVJPKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb21wb3NpdGVDb3B5OgorICAg
ICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBv
c2l0ZVNvdXJjZU92ZXI6CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xC
bGVuZEZ1bmMoR0xfT05FLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VJbjoKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQp
OworICAgICAgICBnbEJsZW5kRnVuYyhHTF9EU1RfQUxQSEEsIEdMX1pFUk8pOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZU91dDoKKyAgICAgICAgZ2xFbmFibGUoR0xf
QkxFTkQpOworICAgICAgICBnbEJsZW5kRnVuYyhHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCBHTF9a
RVJPKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VBdG9wOgorICAg
ICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX0RTVF9BTFBI
QSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29t
cG9zaXRlRGVzdGluYXRpb25PdmVyOgorICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAg
ICAgIGdsQmxlbmRGdW5jKEdMX09ORV9NSU5VU19EU1RfQUxQSEEsIEdMX09ORSk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25JbjoKKyAgICAgICAgZ2xFbmFi
bGUoR0xfQkxFTkQpOworICAgICAgICBnbEJsZW5kRnVuYyhHTF9aRVJPLCBHTF9TUkNfQUxQSEEp
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uT3V0OgorICAg
ICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8sIEdM
X09ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBvc2l0
ZURlc3RpbmF0aW9uQXRvcDoKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICBn
bEJsZW5kRnVuYyhHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCBHTF9TUkNfQUxQSEEpOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIENvbXBvc2l0ZVhPUjoKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxF
TkQpOworICAgICAgICBnbEJsZW5kRnVuYyhHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCBHTF9PTkVf
TUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb21wb3NpdGVQbHVz
RGFya2VyOgorICAgIGNhc2UgQ29tcG9zaXRlSGlnaGxpZ2h0OgorICAgICAgICAvLyB1bnN1cHBv
cnRlZAorICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIENvbXBvc2l0ZVBsdXNMaWdodGVyOgorICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7Cisg
ICAgICAgIGdsQmxlbmRGdW5jKEdMX09ORSwgR0xfT05FKTsKKyAgICAgICAgYnJlYWs7CisgICAg
fQorICAgIG1fbGFzdENvbXBvc2l0ZU9wID0gb3A7Cit9CisKK3Vuc2lnbmVkIEdMRVMyQ2FudmFz
OjpnZXRRdWFkVmVydGljZXMoKQoreworICAgIGlmICghbV9xdWFkVmVydGljZXMpIHsKKyAgICAg
ICAgR0xmbG9hdCB2ZXJ0aWNlc1tdID0geyAwLjBmLCAwLjBmLCAxLjBmLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIDEuMGYsIDAuMGYsIDEuMGYsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgMS4wZiwgMS4wZiwgMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAwLjBmLCAxLjBmLCAxLjBmIH07CisgICAgICAgIGdsR2VuQnVmZmVycygxLCAmbV9xdWFk
VmVydGljZXMpOworICAgICAgICBnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtX3F1YWRW
ZXJ0aWNlcyk7CisgICAgICAgIGdsQnVmZmVyRGF0YShHTF9BUlJBWV9CVUZGRVIsIHNpemVvZih2
ZXJ0aWNlcyksIHZlcnRpY2VzLCBHTF9TVEFUSUNfRFJBVyk7CisgICAgfQorICAgIHJldHVybiBt
X3F1YWRWZXJ0aWNlczsKK30KKworCit1bnNpZ25lZCBHTEVTMkNhbnZhczo6Z2V0UXVhZEluZGlj
ZXMoKQoreworICAgIGlmICghbV9xdWFkSW5kaWNlcykgeworICAgICAgICBHTHVzaG9ydCBpbmRp
Y2VzW10gPSB7IDAsIDEsIDIsIDAsIDIsIDN9OworCisgICAgICAgIGdsR2VuQnVmZmVycygxLCAm
bV9xdWFkSW5kaWNlcyk7CisgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JV
RkZFUiwgbV9xdWFkSW5kaWNlcyk7CisgICAgICAgIGdsQnVmZmVyRGF0YShHTF9FTEVNRU5UX0FS
UkFZX0JVRkZFUiwgc2l6ZW9mKGluZGljZXMpLCBpbmRpY2VzLCBHTF9TVEFUSUNfRFJBVyk7Cisg
ICAgfQorICAgIHJldHVybiBtX3F1YWRJbmRpY2VzOworfQorCitzdGF0aWMgR0x1aW50IGxvYWRT
aGFkZXIoR0xlbnVtIHR5cGUsIGNvbnN0IGNoYXIqIHNoYWRlclNvdXJjZSkKK3sKKyAgICBHTHVp
bnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIodHlwZSk7CisgICAgaWYgKCFzaGFkZXIpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmc2hhZGVyU291
cmNlLCAwKTsKKyAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKyAgICBHTGludCBjb21waWxl
U3RhdHVzOworICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNv
bXBpbGVTdGF0dXMpOworICAgIGlmICghY29tcGlsZVN0YXR1cykgeworICAgICAgICBpbnQgbGVu
Z3RoOworICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAm
bGVuZ3RoKTsKKyAgICAgICAgT3duQXJyYXlQdHI8Y2hhcj4gbG9nKG5ldyBjaGFyW2xlbmd0aF0p
OworICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBsZW5ndGgsIDAsIGxvZy5nZXQo
KSk7CisgICAgICAgIExPR19FUlJPUihsb2cuZ2V0KCkpOworICAgICAgICBnbERlbGV0ZVNoYWRl
cihzaGFkZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHNoYWRlcjsK
K30KKwordW5zaWduZWQgR0xFUzJDYW52YXM6OmdldFNpbXBsZVByb2dyYW0oKQoreworICAgIGlm
ICghbV9zaW1wbGVQcm9ncmFtKSB7CisgICAgICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIgPSBsb2Fk
U2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsCisgICAgICAgICAgICAidW5pZm9ybSBtYXQzIG1hdHJp
eDtcbiIKKyAgICAgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3I7XG4iCisgICAgICAgICAgICAi
YXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG4iCisgICAgICAgICAgICAidm9pZCBtYWluKCkge1xu
IgorICAgICAgICAgICAgIiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0cml4ICogcG9zaXRpb24s
IDEuMCk7XG4iCisgICAgICAgICAgICAifVxuIik7CisgICAgICAgIGlmICghdmVydGV4U2hhZGVy
KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEdMdWludCBmcmFnbWVudFNoYWRlciA9
IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLAorICAgICAgICAgICAgInByZWNpc2lvbiBt
ZWRpdW1wIGZsb2F0O1xuIgorICAgICAgICAgICAgInVuaWZvcm0gbWF0MyBtYXRyaXg7XG4iCisg
ICAgICAgICAgICAidW5pZm9ybSB2ZWM0IGNvbG9yO1xuIgorICAgICAgICAgICAgInZvaWQgbWFp
bigpIHtcbiIKKyAgICAgICAgICAgICIgICAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7XG4iCisgICAg
ICAgICAgICAifVxuIik7CisgICAgICAgIGlmICghZnJhZ21lbnRTaGFkZXIpCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgbV9zaW1wbGVQcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtKCk7
CisgICAgICAgIGlmICghbV9zaW1wbGVQcm9ncmFtKQorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgIGdsQXR0YWNoU2hhZGVyKG1fc2ltcGxlUHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKKyAg
ICAgICAgZ2xBdHRhY2hTaGFkZXIobV9zaW1wbGVQcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7Cisg
ICAgICAgIGdsTGlua1Byb2dyYW0obV9zaW1wbGVQcm9ncmFtKTsKKyAgICAgICAgR0xpbnQgbGlu
a1N0YXR1czsKKyAgICAgICAgZ2xHZXRQcm9ncmFtaXYobV9zaW1wbGVQcm9ncmFtLCBHTF9MSU5L
X1NUQVRVUywgJmxpbmtTdGF0dXMpOworICAgICAgICBpZiAoIWxpbmtTdGF0dXMpIHsKKyAgICAg
ICAgICAgIGdsRGVsZXRlUHJvZ3JhbShtX3NpbXBsZVByb2dyYW0pOworICAgICAgICAgICAgbV9z
aW1wbGVQcm9ncmFtID0gMDsKKyAgICAgICAgfQorICAgICAgICBnbERlbGV0ZVNoYWRlcih2ZXJ0
ZXhTaGFkZXIpOworICAgICAgICBnbERlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CisgICAg
ICAgIG1fc2ltcGxlUG9zaXRpb25Mb2NhdGlvbiA9IGdsR2V0QXR0cmliTG9jYXRpb24obV9zaW1w
bGVQcm9ncmFtLCAicG9zaXRpb24iKTsKKyAgICAgICAgbV9zaW1wbGVNYXRyaXhMb2NhdGlvbiA9
IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fc2ltcGxlUHJvZ3JhbSwgIm1hdHJpeCIpOworICAgICAg
ICBtX3NpbXBsZUNvbG9yTG9jYXRpb24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtX3NpbXBsZVBy
b2dyYW0sICJjb2xvciIpOworICAgIH0KKyAgICByZXR1cm4gbV9zaW1wbGVQcm9ncmFtOworfQor
Cit1bnNpZ25lZCBHTEVTMkNhbnZhczo6Z2V0VGV4UHJvZ3JhbSgpCit7CisgICAgaWYgKCFtX3Rl
eFByb2dyYW0pIHsKKyAgICAgICAgR0x1aW50IHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xf
VkVSVEVYX1NIQURFUiwKKyAgICAgICAgICAgICJ1bmlmb3JtIG1hdDMgbWF0cml4O1xuIgorICAg
ICAgICAgICAgInVuaWZvcm0gbWF0MyB0ZXhNYXRyaXg7XG4iCisgICAgICAgICAgICAiYXR0cmli
dXRlIHZlYzMgcG9zaXRpb247XG4iCisgICAgICAgICAgICAidmFyeWluZyB2ZWMzIHRleENvb3Jk
O1xuIgorICAgICAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgICAgICIgICAgdGV4
Q29vcmQgPSB0ZXhNYXRyaXggKiBwb3NpdGlvbjtcbiIKKyAgICAgICAgICAgICIgICAgZ2xfUG9z
aXRpb24gPSB2ZWM0KG1hdHJpeCAqIHBvc2l0aW9uLCAxLjApO1xuIgorICAgICAgICAgICAgIn1c
biIpOworICAgICAgICBpZiAoIXZlcnRleFNoYWRlcikKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICBHTHVpbnQgZnJhZ21lbnRTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX0ZSQUdNRU5UX1NI
QURFUiwKKyAgICAgICAgICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAgICAg
ICAgICJ1bmlmb3JtIHNhbXBsZXIyRCBzYW1wbGVyO1xuIgorICAgICAgICAgICAgInVuaWZvcm0g
ZmxvYXQgYWxwaGE7XG4iCisgICAgICAgICAgICAidmFyeWluZyB2ZWMzIHRleENvb3JkO1xuIgor
ICAgICAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAgICAgICIgICAgZ2xfRnJhZ0Nv
bG9yID0gdGV4dHVyZTJEKHNhbXBsZXIsIHRleENvb3JkLnh5KSogdmVjNChhbHBoYSk7XG4iCisg
ICAgICAgICAgICAifVxuIik7CisgICAgICAgIGlmICghZnJhZ21lbnRTaGFkZXIpCisgICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgbV90ZXhQcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtKCk7
CisgICAgICAgIGlmICghbV90ZXhQcm9ncmFtKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAg
ICAgIGdsQXR0YWNoU2hhZGVyKG1fdGV4UHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKKyAgICAgICAg
Z2xBdHRhY2hTaGFkZXIobV90ZXhQcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7CisgICAgICAgIGds
TGlua1Byb2dyYW0obV90ZXhQcm9ncmFtKTsKKyAgICAgICAgR0xpbnQgbGlua1N0YXR1czsKKyAg
ICAgICAgZ2xHZXRQcm9ncmFtaXYobV90ZXhQcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJmxpbmtT
dGF0dXMpOworICAgICAgICBpZiAoIWxpbmtTdGF0dXMpIHsKKyAgICAgICAgICAgIGdsRGVsZXRl
UHJvZ3JhbShtX3RleFByb2dyYW0pOworICAgICAgICAgICAgbV90ZXhQcm9ncmFtID0gMDsKKyAg
ICAgICAgfQorICAgICAgICBnbERlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpOworICAgICAgICBn
bERlbGV0ZVNoYWRlcihmcmFnbWVudFNoYWRlcik7CisgICAgICAgIG1fdGV4TWF0cml4TG9jYXRp
b24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtX3RleFByb2dyYW0sICJtYXRyaXgiKTsKKyAgICAg
ICAgbV90ZXhTYW1wbGVyTG9jYXRpb24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtX3RleFByb2dy
YW0sICJzYW1wbGVyIik7CisgICAgICAgIG1fdGV4VGV4TWF0cml4TG9jYXRpb24gPSBnbEdldFVu
aWZvcm1Mb2NhdGlvbihtX3RleFByb2dyYW0sICJ0ZXhNYXRyaXgiKTsKKyAgICAgICAgbV90ZXhQ
b3NpdGlvbkxvY2F0aW9uID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihtX3RleFByb2dyYW0sICJwb3Np
dGlvbiIpOworICAgICAgICBtX3RleEFscGhhTG9jYXRpb24gPSBnbEdldFVuaWZvcm1Mb2NhdGlv
bihtX3RleFByb2dyYW0sICJhbHBoYSIpOworICAgIH0KKyAgICByZXR1cm4gbV90ZXhQcm9ncmFt
OworfQorCitHTEVTMlRleHR1cmUqIEdMRVMyQ2FudmFzOjpjcmVhdGVUZXh0dXJlKE5hdGl2ZUlt
YWdlUHRyIHB0ciwgR0xFUzJUZXh0dXJlOjpGb3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBo
ZWlnaHQpCit7CisgICAgUGFzc1JlZlB0cjxHTEVTMlRleHR1cmU+IHRleHR1cmUgPSBtX3RleHR1
cmVzLmdldChwdHIpOworICAgIGlmICh0ZXh0dXJlKQorICAgICAgICByZXR1cm4gdGV4dHVyZS5n
ZXQoKTsKKworICAgIHRleHR1cmUgPSBHTEVTMlRleHR1cmU6OmNyZWF0ZShmb3JtYXQsIHdpZHRo
LCBoZWlnaHQpOworICAgIEdMRVMyVGV4dHVyZSogdCA9IHRleHR1cmUuZ2V0KCk7CisgICAgbV90
ZXh0dXJlcy5zZXQocHRyLCB0ZXh0dXJlKTsKKyAgICByZXR1cm4gdDsKK30KKworR0xFUzJUZXh0
dXJlKiBHTEVTMkNhbnZhczo6Z2V0VGV4dHVyZShOYXRpdmVJbWFnZVB0ciBwdHIpCit7CisgICAg
UGFzc1JlZlB0cjxHTEVTMlRleHR1cmU+IHRleHR1cmUgPSBtX3RleHR1cmVzLmdldChwdHIpOwor
ICAgIHJldHVybiB0ZXh0dXJlID8gdGV4dHVyZS5nZXQoKSA6IDA7Cit9CisKK3ZvaWQgR0xFUzJD
YW52YXM6OmNoZWNrR0xFcnJvcihjb25zdCBjaGFyKiBoZWFkZXIpCit7CisjaWZuZGVmIE5ERUJV
RworICAgIEdMZW51bSBlcnI7CisgICAgd2hpbGUgKChlcnIgPSBnbEdldEVycm9yKCkpICE9IEdM
X05PX0VSUk9SKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGVycm9yU3RyID0gIioqKiBVTktOT1dO
IEVSUk9SICoqKiI7CisgICAgICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICAgIGNhc2UgR0xfSU5W
QUxJRF9FTlVNOgorICAgICAgICAgICAgZXJyb3JTdHIgPSAiR0xfSU5WQUxJRF9FTlVNIjsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX0lOVkFMSURfVkFMVUU6CisgICAgICAg
ICAgICBlcnJvclN0ciA9ICJHTF9JTlZBTElEX1ZBTFVFIjsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIEdMX0lOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgZXJyb3JTdHIg
PSAiR0xfSU5WQUxJRF9PUEVSQVRJT04iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNh
c2UgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT046CisgICAgICAgICAgICBlcnJvclN0
ciA9ICJHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTiI7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBHTF9PVVRfT0ZfTUVNT1JZOgorICAgICAgICAgICAgZXJyb3JTdHIg
PSAiR0xfT1VUX09GX01FTU9SWSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICBpZiAoaGVhZGVyKQorICAgICAgICAgICAgTE9HX0VSUk9SKCIlczogICVzIiwgaGVhZGVy
LCBlcnJvclN0cik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIExPR19FUlJPUigiJXMiLCBl
cnJvclN0cik7CisgICAgfQorI2VuZGlmCit9CisKK307CisKKyNlbmRpZgpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMkNhbnZhcy5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJDYW52YXMuaAkocmV2aXNp
b24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJDYW52YXMu
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIw
MTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBHTEVTMkNhbnZhc19oCisj
ZGVmaW5lIEdMRVMyQ2FudmFzX2gKKworI2lmIFVTRShHTEVTMl9SRU5ERVJJTkcpCisKKyNpbmNs
dWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJDb2xvci5oIgorI2luY2x1ZGUgIkNv
bG9yU3BhY2UuaCIKKyNpbmNsdWRlICJHTEVTMlRleHR1cmUuaCIKKyNpbmNsdWRlICJHcmFwaGlj
c1R5cGVzLmgiCisjaW5jbHVkZSAiSW1hZ2VTb3VyY2UuaCIKKworI2luY2x1ZGUgPHd0Zi9IYXNo
TWFwLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgRmxvYXRSZWN0OworY2xhc3MgQ29sb3I7CitjbGFzcyBHTEVTMkNvbnRleHQ7
CisKK3R5cGVkZWYgSGFzaE1hcDxOYXRpdmVJbWFnZVB0ciwgUmVmUHRyPEdMRVMyVGV4dHVyZT4g
PiBUZXh0dXJlSGFzaE1hcDsKKworY2xhc3MgR0xFUzJDYW52YXMgOiBwdWJsaWMgTm9uY29weWFi
bGUgeworcHVibGljOgorICAgIEdMRVMyQ2FudmFzKEdMRVMyQ29udGV4dCogY29udGV4dCwgaW50
IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICB+R0xFUzJDYW52YXMoKTsKKworICAgIHZvaWQgZmls
bFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IsCisgICAgICAg
ICAgICAgICAgICBDb2xvclNwYWNlIGNvbG9yU3BhY2UpOworICAgIHZvaWQgZmlsbFJlY3QoY29u
c3QgRmxvYXRSZWN0JiByZWN0KTsKKyAgICB2b2lkIGNsZWFyUmVjdChjb25zdCBGbG9hdFJlY3Qm
IHJlY3QpOworICAgIHZvaWQgc2V0RmlsbENvbG9yKGNvbnN0IENvbG9yJiBjb2xvciwgQ29sb3JT
cGFjZSBjb2xvclNwYWNlKTsKKyAgICB2b2lkIHNldEFscGhhKGZsb2F0IGFscGhhKTsKKyAgICB2
b2lkIHNldENvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvciBvcCk7CisgICAgdm9p
ZCB0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSk7CisgICAgdm9pZCByb3RhdGUoZmxvYXQgYW5n
bGVJblJhZGlhbnMpOworICAgIHZvaWQgc2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKTsKKyAg
ICB2b2lkIGNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIGFmZmluZSk7CisKKyAgICB2
b2lkIHNhdmUoKTsKKyAgICB2b2lkIHJlc3RvcmUoKTsKKworICAgIC8vIG5vbi1zdGFuZGFyZCBm
dW5jdGlvbnMKKyAgICAvLyBUaGVzZSBhcmUgbm90IHN0YW5kYXJkIEdyYXBoaWNzQ29udGV4dCBm
dW5jdGlvbnMsIGFuZCBzaG91bGQgYmUgcHVzaGVkCisgICAgLy8gZG93biBpbnRvIGEgUGxhdGZv
cm1Db250ZXh0R0xFUzIgYXQgc29tZSBwb2ludC4KKyAgICB2b2lkIGRyYXdUZXh0dXJlZFJlY3Qo
R0xFUzJUZXh0dXJlKiB0ZXh0dXJlLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZs
b2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0sIGZsb2F0
IGFscGhhLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0
ZU9wKTsKKyAgICB2b2lkIGRyYXdUZXh0dXJlZFJlY3QoR0xFUzJUZXh0dXJlKiB0ZXh0dXJlLCBj
b25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgQ29sb3JT
cGFjZSBjb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCk7CisgICAgR0xF
UzJDb250ZXh0KiBnbGVzMkNvbnRleHQoKSB7IHJldHVybiBtX2dsZXMyQ29udGV4dDsgfQorICAg
IEdMRVMyVGV4dHVyZSogY3JlYXRlVGV4dHVyZShOYXRpdmVJbWFnZVB0ciBwdHIsIEdMRVMyVGV4
dHVyZTo6Rm9ybWF0IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICBHTEVTMlRl
eHR1cmUqIGdldFRleHR1cmUoTmF0aXZlSW1hZ2VQdHIgcHRyKTsKKworcHJpdmF0ZToKKyAgICB2
b2lkIGFwcGx5Q29tcG9zaXRlT3BlcmF0b3IoQ29tcG9zaXRlT3BlcmF0b3Igb3ApOworICAgIHZv
aWQgY2hlY2tHTEVycm9yKGNvbnN0IGNoYXIqIGhlYWRlcik7CisgICAgdW5zaWduZWQgZ2V0UXVh
ZFZlcnRpY2VzKCk7CisgICAgdW5zaWduZWQgZ2V0UXVhZEluZGljZXMoKTsKKyAgICB1bnNpZ25l
ZCBnZXRTaW1wbGVQcm9ncmFtKCk7CisgICAgdW5zaWduZWQgZ2V0VGV4UHJvZ3JhbSgpOworCisg
ICAgR0xFUzJDb250ZXh0KiBtX2dsZXMyQ29udGV4dDsKKyAgICBzdHJ1Y3QgU3RhdGU7CisgICAg
V1RGOjpWZWN0b3I8U3RhdGU+IG1fc3RhdGVTdGFjazsKKyAgICBTdGF0ZSogbV9zdGF0ZTsKKyAg
ICB1bnNpZ25lZCBtX3F1YWRWZXJ0aWNlczsKKyAgICB1bnNpZ25lZCBtX3F1YWRJbmRpY2VzOwor
ICAgIHVuc2lnbmVkIG1fc2ltcGxlUHJvZ3JhbTsKKyAgICB1bnNpZ25lZCBtX3RleFByb2dyYW07
CisgICAgaW50IG1fc2ltcGxlTWF0cml4TG9jYXRpb247CisgICAgaW50IG1fc2ltcGxlQ29sb3JM
b2NhdGlvbjsKKyAgICBpbnQgbV9zaW1wbGVQb3NpdGlvbkxvY2F0aW9uOworICAgIGludCBtX3Rl
eE1hdHJpeExvY2F0aW9uOworICAgIGludCBtX3RleFRleE1hdHJpeExvY2F0aW9uOworICAgIGlu
dCBtX3RleFNhbXBsZXJMb2NhdGlvbjsKKyAgICBpbnQgbV90ZXhBbHBoYUxvY2F0aW9uOworICAg
IGludCBtX3RleFBvc2l0aW9uTG9jYXRpb247CisgICAgaW50IG1fd2lkdGg7CisgICAgaW50IG1f
aGVpZ2h0OworICAgIEFmZmluZVRyYW5zZm9ybSBtX2ZsaXBNYXRyaXg7CisgICAgVGV4dHVyZUhh
c2hNYXAgbV90ZXh0dXJlczsKKyAgICBDb21wb3NpdGVPcGVyYXRvciBtX2xhc3RDb21wb3NpdGVP
cDsgLy8gVGhpcyBpcyB0aGUgb25lIGxhc3Qgc2V0LCBub3QgbmVjZXNzYXJpbHkgdGhlIG9uZSBp
biB0aGUgc3RhdGUgc3RhY2suCit9OworCit9OworCisjZW5kaWYKKworI2VuZGlmIC8vIEdMRVMy
Q2FudmFzX2gKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJU
ZXh0dXJlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0dMRVMyVGV4dHVyZS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0dMRVMyVGV4dHVyZS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0Ogor
ICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisg
KiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdv
b2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVz
ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBz
b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQg
Q09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdI
VAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShHTEVTMl9SRU5ERVJJTkcpCisK
KyNpbmNsdWRlICJHTEVTMlRleHR1cmUuaCIKKworI2luY2x1ZGUgIk93bkFycmF5UHRyLmgiCisK
KyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitHTEVTMlRl
eHR1cmU6OkdMRVMyVGV4dHVyZSh1bnNpZ25lZCBpbnQgdGV4dHVyZUlkLCBGb3JtYXQgZm9ybWF0
LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgOiBtX3RleHR1cmVJZCh0ZXh0dXJlSWQpCisg
ICAgLCBtX2Zvcm1hdChmb3JtYXQpCisgICAgLCBtX3dpZHRoKHdpZHRoKQorICAgICwgbV9oZWln
aHQoaGVpZ2h0KQoreworfQorCitHTEVTMlRleHR1cmU6On5HTEVTMlRleHR1cmUoKQoreworICAg
IGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1fdGV4dHVyZUlkKTsKK30KKworUGFzc1JlZlB0cjxHTEVT
MlRleHR1cmU+IEdMRVMyVGV4dHVyZTo6Y3JlYXRlKEZvcm1hdCBmb3JtYXQsIGludCB3aWR0aCwg
aW50IGhlaWdodCkKK3sKKyAgICBHTHVpbnQgdGV4dHVyZUlkOworICAgIGdsR2VuVGV4dHVyZXMo
MSwgJnRleHR1cmVJZCk7CisgICAgaWYgKCF0ZXh0dXJlSWQpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlSWQpOworICAgIGdsVGV4
SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCB3aWR0aCwgaGVpZ2h0LCAwLCBHTF9S
R0JBLCBHTF9VTlNJR05FRF9CWVRFLCAwKTsKKworICAgIGludCBtYXg7CisgICAgZ2xHZXRJbnRl
Z2VydihHTF9NQVhfVEVYVFVSRV9TSVpFLCAmbWF4KTsKKyAgICBpZiAod2lkdGggPiBtYXggfHwg
aGVpZ2h0ID4gbWF4KQorICAgICAgICBBU1NFUlQoISJ0ZXh0dXJlIHRvbyBiaWciKTsKKworICAg
IHJldHVybiBhZG9wdFJlZihuZXcgR0xFUzJUZXh0dXJlKHRleHR1cmVJZCwgZm9ybWF0LCB3aWR0
aCwgaGVpZ2h0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRGb3JtYXQoR0xFUzJUZXh0dXJl
OjpGb3JtYXQgZm9ybWF0LCB1bnNpZ25lZCBpbnQqIGdsRm9ybWF0LCB1bnNpZ25lZCBpbnQqIGds
VHlwZSwgYm9vbCogc3dpenpsZSkKK3sKKyAgICAqc3dpenpsZSA9IGZhbHNlOworICAgIHN3aXRj
aCAoZm9ybWF0KSB7CisgICAgY2FzZSBHTEVTMlRleHR1cmU6OlJHQkE4OgorICAgICAgICAqZ2xG
b3JtYXQgPSBHTF9SR0JBOworICAgICAgICAqZ2xUeXBlID0gR0xfVU5TSUdORURfQllURTsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBHTEVTMlRleHR1cmU6OkJHUkE4OgorLy8gRklYTUU6ICBP
bmNlIHdlIGhhdmUgc3VwcG9ydCBmb3IgZXh0ZW5zaW9ucywgd2Ugc2hvdWxkIGNoZWNrIGZvciBF
WFRfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODgsCisvLyBhbmQgdXNlIHRoYXQgaWYgcHJlc2VudC4K
KyAgICAgICAgKmdsRm9ybWF0ID0gR0xfUkdCQTsKKyAgICAgICAgKmdsVHlwZSA9IEdMX1VOU0lH
TkVEX0JZVEU7CisgICAgICAgICpzd2l6emxlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAg
ZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUKCEiYmFkIGZvcm1hdCIpOworICAgICAgICBicmVhazsK
KyAgICB9Cit9CisKK3ZvaWQgR0xFUzJUZXh0dXJlOjpsb2FkKHZvaWQqIHBpeGVscykKK3sKKyAg
ICB1bnNpZ25lZCBpbnQgZ2xGb3JtYXQsIGdsVHlwZTsKKyAgICBib29sIHN3aXp6bGU7CisgICAg
Y29udmVydEZvcm1hdChtX2Zvcm1hdCwgJmdsRm9ybWF0LCAmZ2xUeXBlLCAmc3dpenpsZSk7Cisg
ICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3RleHR1cmVJZCk7CisgICAgaWYgKHN3
aXp6bGUpIHsKKyAgICAgICAgQVNTRVJUKGdsRm9ybWF0ID09IEdMX1JHQkEgJiYgZ2xUeXBlID09
IEdMX1VOU0lHTkVEX0JZVEUpOworICAgICAgICAvLyBGSVhNRTogIFRoaXMgY291bGQgdXNlIFBC
TydzIHRvIHNhdmUgZG9pbmcgYW4gZXh0cmEgY29weSBoZXJlLgorICAgICAgICBpbnQgc2l6ZSA9
IG1fd2lkdGggKiBtX2hlaWdodDsKKyAgICAgICAgdW5zaWduZWQqIHBpeGVsczMyID0gc3RhdGlj
X2Nhc3Q8dW5zaWduZWQqPihwaXhlbHMpOworICAgICAgICBPd25BcnJheVB0cjx1bnNpZ25lZD4g
YnVmKG5ldyB1bnNpZ25lZFtzaXplXSk7CisgICAgICAgIHVuc2lnbmVkKiBidWZwdHIgPSBidWYu
Z2V0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAg
ICAgICB1bnNpZ25lZCBwaXhlbCA9IHBpeGVsczMyW2ldOworICAgICAgICAgICAgYnVmcHRyW2ld
ID0gcGl4ZWwgJiAweEZGMDBGRjAwIHwgKChwaXhlbCAmIDB4MDBGRjAwMDApID4+IDE2KSB8ICgo
cGl4ZWwgJiAweDAwMDAwMEZGKSA8PCAxNik7CisgICAgICAgIH0KKyAgICAgICAgZ2xUZXhTdWJJ
bWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIDAsIDAsIG1fd2lkdGgsIG1faGVpZ2h0LCBnbEZvcm1h
dCwgZ2xUeXBlLCBidWYuZ2V0KCkpOworICAgIH0gZWxzZQorICAgICAgZ2xUZXhTdWJJbWFnZTJE
KEdMX1RFWFRVUkVfMkQsIDAsIDAsIDAsIG1fd2lkdGgsIG1faGVpZ2h0LCBnbEZvcm1hdCwgZ2xU
eXBlLCBwaXhlbHMpOworfQorCit2b2lkIEdMRVMyVGV4dHVyZTo6YmluZCgpCit7CisgICAgZ2xC
aW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3RleHR1cmVJZCk7CisgICAgZ2xUZXhQYXJhbWV0
ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAg
ICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBH
TF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJF
X1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRV
UkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKK30KKworfTsKKwor
I2VuZGlmCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyVGV4
dHVyZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
R0xFUzJUZXh0dXJlLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL0dMRVMyVGV4dHVyZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYzIEBACisv
KgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
Zm5kZWYgR0xFUzJUZXh0dXJlX2gKKyNkZWZpbmUgR0xFUzJUZXh0dXJlX2gKKworI2lmIFVTRShH
TEVTMl9SRU5ERVJJTkcpCisKKyNpbmNsdWRlICJSZWZDb3VudGVkLmgiCisjaW5jbHVkZSAiUmVm
UHRyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR0xFUzJUZXh0dXJlIDogcHVi
bGljIFJlZkNvdW50ZWQ8R0xFUzJUZXh0dXJlPiB7CitwdWJsaWM6CisgICAgfkdMRVMyVGV4dHVy
ZSgpOworICAgIGVudW0gRm9ybWF0IHsgUkdCQTgsIEJHUkE4IH07CisgICAgc3RhdGljIFBhc3NS
ZWZQdHI8R0xFUzJUZXh0dXJlPiBjcmVhdGUoRm9ybWF0IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQg
aGVpZ2h0KTsKKyAgICB2b2lkIGJpbmQoKTsKKyAgICB2b2lkIGxvYWQodm9pZCogcGl4ZWxzKTsK
KyAgICBGb3JtYXQgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbV9mb3JtYXQ7IH0KKyAgICBpbnQg
d2lkdGgoKSBjb25zdCB7IHJldHVybiBtX3dpZHRoOyB9CisgICAgaW50IGhlaWdodCgpIGNvbnN0
IHsgcmV0dXJuIG1faGVpZ2h0OyB9Citwcml2YXRlOgorICAgIEdMRVMyVGV4dHVyZSh1bnNpZ25l
ZCBpbnQgdGV4dHVyZUlkLCBGb3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwor
ICAgIHVuc2lnbmVkIGludCBtX3RleHR1cmVJZDsKKyAgICBGb3JtYXQgbV9mb3JtYXQ7CisgICAg
aW50IG1fd2lkdGg7CisgICAgaW50IG1faGVpZ2h0OworfTsKKworfTsKKworI2VuZGlmCisKKyNl
bmRpZiAvLyBHTEVTMlRleHR1cmVfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62468</attachid>
            <date>2010-07-23 15:37:37 -0700</date>
            <delta_ts>2010-07-24 09:39:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-42905-20100723183734.patch</filename>
            <type>text/plain</type>
            <size>32683</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Mzk5NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTkgQEAKKzIwMTAtMDctMjMgIFN0ZXBoZW4gV2hpdGUgIDxzZW5vcmJsYW5jb0Bj
aHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgSW1wbGVtZW50IE9wZW5HTEVTMiBoZWxwZXIgY2xhc3Nlcy4KKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQyOTA1CisKKyAgICAgICAgR0xFUzJD
YW52YXMgYW5kIEdMRVMyVGV4dHVyZSBhcmUgc29tZSBzaW1wbGUgT3BlbkdMRVMyIGhlbHBlciBj
bGFzc2VzCisgICAgICAgIGZvciBtYW5hZ2luZyBzdGF0ZSwgc2FtcGxlcnMgYW5kIHRleHR1cmVz
LgorCisgICAgICAgIFdoZW4gdGhpcyBpcyBob29rZWQgdXAsIGl0IHdpbGwgYmUgY292ZXJlZCBi
eSBtYW55IGxheW91dCB0ZXN0cy4KKworICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAg
QWRkIG5ldyBmaWxlcyB0byBjaHJvbWl1bSBidWlsZCAoY29udGVudHMgYXJlIHByb3RlY3RlZCBi
eSAjaWYncyBmb3Igbm93KS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9H
TEVTMkNhbnZhcy5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6YWZmaW5lVG8zeDMpOgor
ICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OlN0YXRlOjpTdGF0ZSk6CisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMkNhbnZhczo6R0xFUzJDYW52YXMpOgorICAgICAgICAoV2ViQ29yZTo6R0xF
UzJDYW52YXM6On5HTEVTMkNhbnZhcyk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6
Y2xlYXJSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpmaWxsUmVjdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6c2V0RmlsbENvbG9yKToKKyAgICAgICAgKFdl
YkNvcmU6OkdMRVMyQ2FudmFzOjpzZXRBbHBoYSk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMkNh
bnZhczo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpyb3RhdGUp
OgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OnNjYWxlKToKKyAgICAgICAgKFdlYkNv
cmU6OkdMRVMyQ2FudmFzOjpjb25jYXRDVE0pOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52
YXM6OnNhdmUpOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OnJlc3RvcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OmRyYXdUZXh0dXJlZFJlY3QpOgorICAgICAgICAo
V2ViQ29yZTo6R0xFUzJDYW52YXM6OnNldENvbXBvc2l0ZU9wZXJhdGlvbik6CisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMkNhbnZhczo6YXBwbHlDb21wb3NpdGVPcGVyYXRvcik6CisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMkNhbnZhczo6Z2V0UXVhZFZlcnRpY2VzKToKKyAgICAgICAgKFdlYkNvcmU6
OkdMRVMyQ2FudmFzOjpnZXRRdWFkSW5kaWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpsb2FkU2hh
ZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpnZXRTaW1wbGVQcm9ncmFtKToK
KyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpnZXRUZXhQcm9ncmFtKToKKyAgICAgICAg
KFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpjcmVhdGVUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6
OkdMRVMyQ2FudmFzOjpnZXRUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFz
OjpjaGVja0dMRXJyb3IpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dM
RVMyQ2FudmFzLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OmdsZXMy
Q29udGV4dCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJUZXh0
dXJlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6OkdMRVMyVGV4
dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6On5HTEVTMlRleHR1cmUpOgor
ICAgICAgICAoV2ViQ29yZTo6R0xFUzJUZXh0dXJlOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29y
ZTo6Y29udmVydEZvcm1hdCk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6OmxvYWQp
OgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJUZXh0dXJlOjpiaW5kKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMlRleHR1cmUuaDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMlRleHR1cmU6Oik6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6
OmZvcm1hdCk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6OndpZHRoKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdMRVMyVGV4dHVyZTo6aGVpZ2h0KToKKworCiAyMDEwLTA3LTIzICBQYXRy
aWNrIEdhbnN0ZXJlciAgPHBhcm9nYUBwYXJvZ2EuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IEFkYW0gUm9iZW4uCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gNjM5OTYpCisrKyBXZWJDb3JlL1dlYkNvcmUu
Z3lwaQkod29ya2luZyBjb3B5KQpAQCAtMjE4Miw2ICsyMTgyLDEwIEBACiAgICAgICAgICAgICAn
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFBsYXRmb3JtRGF0YUxpbnV4LmgnLAogICAg
ICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRVdGlsc0Nocm9taXVtV2lu
LmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFV0aWxz
Q2hyb21pdW1XaW4uaCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
R0xFUzJDYW52YXMuY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9HTEVTMkNhbnZhcy5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9HTEVTMlRleHR1cmUuY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9HTEVTMlRleHR1cmUuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vR2x5cGhQYWdlVHJlZU5vZGVDaHJvbWl1bVdpbi5jcHAnLAogICAgICAgICAgICAgJ3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dseXBoUGFnZVRyZWVOb2RlTGludXguY3BwJywKICAg
ICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21p
dW0uY3BwJywKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJD
YW52YXMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vR0xFUzJDYW52YXMuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9HTEVTMkNhbnZhcy5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTIw
IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoK
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAor
ICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShHTEVTMl9SRU5ERVJJTkcpCisKKyNp
bmNsdWRlICJHTEVTMkNhbnZhcy5oIgorCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVk
ZSAiR0xFUzJDb250ZXh0LmgiCisjaW5jbHVkZSAiR0xFUzJUZXh0dXJlLmgiCisjaW5jbHVkZSAi
T3duQXJyYXlQdHIuaCIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZmZpbmVUbzN4Myhjb25zdCBBZmZpbmVUcmFu
c2Zvcm0mIHRyYW5zZm9ybSwgR0xmbG9hdCBtYXRbOV0pCit7CisgICAgbWF0WzBdID0gdHJhbnNm
b3JtLmEoKTsKKyAgICBtYXRbMV0gPSB0cmFuc2Zvcm0uYigpOworICAgIG1hdFsyXSA9IDAuMGY7
CisgICAgbWF0WzNdID0gdHJhbnNmb3JtLmMoKTsKKyAgICBtYXRbNF0gPSB0cmFuc2Zvcm0uZCgp
OworICAgIG1hdFs1XSA9IDAuMGY7CisgICAgbWF0WzZdID0gdHJhbnNmb3JtLmUoKTsKKyAgICBt
YXRbN10gPSB0cmFuc2Zvcm0uZigpOworICAgIG1hdFs4XSA9IDEuMGY7Cit9CisKK3N0cnVjdCBH
TEVTMkNhbnZhczo6U3RhdGUgeworICAgIFN0YXRlKCkKKyAgICAgICAgOiBtX2ZpbGxDb2xvcigw
LCAwLCAwLCAyNTUpCisgICAgICAgICwgbV9hbHBoYSgxLjBmKQorICAgICAgICAsIG1fY29tcG9z
aXRlT3AoQ29tcG9zaXRlU291cmNlT3ZlcikKKyAgICB7CisgICAgfQorICAgIENvbG9yIG1fZmls
bENvbG9yOworICAgIGZsb2F0IG1fYWxwaGE7CisgICAgQ29tcG9zaXRlT3BlcmF0b3IgbV9jb21w
b3NpdGVPcDsKKyAgICBBZmZpbmVUcmFuc2Zvcm0gbV9jdG07Cit9OworCitHTEVTMkNhbnZhczo6
R0xFUzJDYW52YXMoR0xFUzJDb250ZXh0KiBjb250ZXh0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQp
CisgICAgOiBtX2dsZXMyQ29udGV4dChjb250ZXh0KQorICAgICwgbV9xdWFkVmVydGljZXMoMCkK
KyAgICAsIG1fcXVhZEluZGljZXMoMCkKKyAgICAsIG1fc2ltcGxlUHJvZ3JhbSgwKQorICAgICwg
bV90ZXhQcm9ncmFtKDApCisgICAgLCBtX3NpbXBsZU1hdHJpeExvY2F0aW9uKC0xKQorICAgICwg
bV9zaW1wbGVDb2xvckxvY2F0aW9uKC0xKQorICAgICwgbV9zaW1wbGVQb3NpdGlvbkxvY2F0aW9u
KC0xKQorICAgICwgbV90ZXhNYXRyaXhMb2NhdGlvbigtMSkKKyAgICAsIG1fdGV4VGV4TWF0cml4
TG9jYXRpb24oLTEpCisgICAgLCBtX3RleFNhbXBsZXJMb2NhdGlvbigtMSkKKyAgICAsIG1fdGV4
QWxwaGFMb2NhdGlvbigtMSkKKyAgICAsIG1fdGV4UG9zaXRpb25Mb2NhdGlvbigtMSkKKyAgICAs
IG1fd2lkdGgod2lkdGgpCisgICAgLCBtX2hlaWdodChoZWlnaHQpCisgICAgLCBtX3N0YXRlKDAp
Cit7CisgICAgbV9mbGlwTWF0cml4LnRyYW5zbGF0ZSgtMS4wZiwgMS4wZik7CisgICAgbV9mbGlw
TWF0cml4LnNjYWxlKDIuMGYgLyB3aWR0aCwgLTIuMGYgLyBoZWlnaHQpOworCisgICAgbV9nbGVz
MkNvbnRleHQtPm1ha2VDdXJyZW50KCk7CisgICAgbV9nbGVzMkNvbnRleHQtPnJlc2l6ZU9mZnNj
cmVlbkNvbnRlbnQoSW50U2l6ZSh3aWR0aCwgaGVpZ2h0KSk7CisgICAgbV9nbGVzMkNvbnRleHQt
PnN3YXBCdWZmZXJzKCk7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKwor
ICAgIG1fc3RhdGVTdGFjay5hcHBlbmQoU3RhdGUoKSk7CisgICAgbV9zdGF0ZSA9ICZtX3N0YXRl
U3RhY2subGFzdCgpOworfQorCitHTEVTMkNhbnZhczo6fkdMRVMyQ2FudmFzKCkKK3sKKyAgICBt
X2dsZXMyQ29udGV4dC0+bWFrZUN1cnJlbnQoKTsKKyAgICBpZiAobV9zaW1wbGVQcm9ncmFtKQor
ICAgICAgICBnbERlbGV0ZVByb2dyYW0obV9zaW1wbGVQcm9ncmFtKTsKKyAgICBpZiAobV90ZXhQ
cm9ncmFtKQorICAgICAgICBnbERlbGV0ZVByb2dyYW0obV90ZXhQcm9ncmFtKTsKKyAgICBpZiAo
bV9xdWFkVmVydGljZXMpCisgICAgICAgIGdsRGVsZXRlQnVmZmVycygxLCAmbV9xdWFkVmVydGlj
ZXMpOworICAgIGlmIChtX3F1YWRJbmRpY2VzKQorICAgICAgICBnbERlbGV0ZUJ1ZmZlcnMoMSwg
Jm1fcXVhZFZlcnRpY2VzKTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6Y2xlYXJSZWN0KGNvbnN0
IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBtX2dsZXMyQ29udGV4dC0+bWFrZUN1cnJlbnQoKTsK
KworICAgIGdsU2Npc3NvcihyZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5o
ZWlnaHQoKSk7CisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICBnbENsZWFyKEdM
X0NPTE9SX0JVRkZFUl9CSVQpOworICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworfQor
Cit2b2lkIEdMRVMyQ2FudmFzOjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0
IENvbG9yJiBjb2xvciwgQ29sb3JTcGFjZSBjb2xvclNwYWNlKQoreworICAgIG1fZ2xlczJDb250
ZXh0LT5tYWtlQ3VycmVudCgpOworCisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwg
Z2V0UXVhZFZlcnRpY2VzKCkpOworICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JV
RkZFUiwgZ2V0UXVhZEluZGljZXMoKSk7CisKKyAgICBmbG9hdCByZ2JhWzRdOworICAgIGNvbG9y
LmdldFJHQkEocmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXSwgcmdiYVszXSk7CisgICAgZ2xVbmlm
b3JtNGYobV9zaW1wbGVDb2xvckxvY2F0aW9uLCByZ2JhWzBdICogcmdiYVszXSwgcmdiYVsxXSAq
IHJnYmFbM10sIHJnYmFbMl0gKiByZ2JhWzNdLCByZ2JhWzNdKTsKKworICAgIGdsRHJhd0VsZW1l
bnRzKEdMX1RSSUFOR0xFUywgNiwgR0xfVU5TSUdORURfU0hPUlQsIDApOworfQorCit2b2lkIEdM
RVMyQ2FudmFzOjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgbV9nbGVz
MkNvbnRleHQtPm1ha2VDdXJyZW50KCk7CisKKyAgICBhcHBseUNvbXBvc2l0ZU9wZXJhdG9yKG1f
c3RhdGUtPm1fY29tcG9zaXRlT3ApOworCisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZF
UiwgZ2V0UXVhZFZlcnRpY2VzKCkpOworICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZ
X0JVRkZFUiwgZ2V0UXVhZEluZGljZXMoKSk7CisKKyAgICBnbFVzZVByb2dyYW0oZ2V0U2ltcGxl
UHJvZ3JhbSgpKTsKKworICAgIGZsb2F0IHJnYmFbNF07CisgICAgbV9zdGF0ZS0+bV9maWxsQ29s
b3IuZ2V0UkdCQShyZ2JhWzBdLCByZ2JhWzFdLCByZ2JhWzJdLCByZ2JhWzNdKTsKKyAgICBnbFVu
aWZvcm00ZihtX3NpbXBsZUNvbG9yTG9jYXRpb24sIHJnYmFbMF0gKiByZ2JhWzNdLCByZ2JhWzFd
ICogcmdiYVszXSwgcmdiYVsyXSAqIHJnYmFbM10sIHJnYmFbM10pOworCisgICAgQWZmaW5lVHJh
bnNmb3JtIG1hdHJpeChtX2ZsaXBNYXRyaXgpOworICAgIG1hdHJpeC5tdWx0TGVmdChtX3N0YXRl
LT5tX2N0bSk7CisgICAgbWF0cml4LnRyYW5zbGF0ZShyZWN0LngoKSwgcmVjdC55KCkpOworICAg
IG1hdHJpeC5zY2FsZShyZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgIEdMZmxvYXQg
bWF0WzldOworICAgIGFmZmluZVRvM3gzKG1hdHJpeCwgbWF0KTsKKyAgICBnbFVuaWZvcm1NYXRy
aXgzZnYobV9zaW1wbGVNYXRyaXhMb2NhdGlvbiwgMSwgR0xfRkFMU0UsIG1hdCk7CisKKyAgICBn
bFZlcnRleEF0dHJpYlBvaW50ZXIobV9zaW1wbGVQb3NpdGlvbkxvY2F0aW9uLCAzLCBHTF9GTE9B
VCwgR0xfRkFMU0UsIDAsIChHTHZvaWQqKSgwKSk7CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJp
YkFycmF5KG1fc2ltcGxlUG9zaXRpb25Mb2NhdGlvbik7CisKKyAgICBnbERyYXdFbGVtZW50cyhH
TF9UUklBTkdMRVMsIDYsIEdMX1VOU0lHTkVEX1NIT1JULCAwKTsKK30KKwordm9pZCBHTEVTMkNh
bnZhczo6c2V0RmlsbENvbG9yKGNvbnN0IENvbG9yJiBjb2xvciwgQ29sb3JTcGFjZSBjb2xvclNw
YWNlKQoreworICAgIG1fc3RhdGUtPm1fZmlsbENvbG9yID0gY29sb3I7Cit9CisKK3ZvaWQgR0xF
UzJDYW52YXM6OnNldEFscGhhKGZsb2F0IGFscGhhKQoreworICAgIG1fc3RhdGUtPm1fYWxwaGEg
PSBhbHBoYTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6dHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0
IHkpCit7CisgICAgbV9zdGF0ZS0+bV9jdG0udHJhbnNsYXRlKHgsIHkpOworfQorCit2b2lkIEdM
RVMyQ2FudmFzOjpyb3RhdGUoZmxvYXQgYW5nbGVJblJhZGlhbnMpCit7CisgICAgbV9zdGF0ZS0+
bV9jdG0ucm90YXRlKGFuZ2xlSW5SYWRpYW5zICogKDE4MC4wZiAvIDMuMTQxNTkyNjVmKSk7Cit9
CisKK3ZvaWQgR0xFUzJDYW52YXM6OnNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAg
ICBtX3N0YXRlLT5tX2N0bS5zY2FsZShzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOworfQor
Cit2b2lkIEdMRVMyQ2FudmFzOjpjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBhZmZp
bmUpCit7CisgICAgbV9zdGF0ZS0+bV9jdG0ubXVsdExlZnQoYWZmaW5lKTsKK30KKwordm9pZCBH
TEVTMkNhbnZhczo6c2F2ZSgpCit7CisgICAgbV9zdGF0ZVN0YWNrLmFwcGVuZChTdGF0ZShtX3N0
YXRlU3RhY2subGFzdCgpKSk7CisgICAgbV9zdGF0ZSA9ICZtX3N0YXRlU3RhY2subGFzdCgpOwor
fQorCit2b2lkIEdMRVMyQ2FudmFzOjpyZXN0b3JlKCkKK3sKKyAgICBtX3N0YXRlU3RhY2sucmVt
b3ZlTGFzdCgpOworICAgIG1fc3RhdGUgPSAmbV9zdGF0ZVN0YWNrLmxhc3QoKTsKK30KKwordm9p
ZCBHTEVTMkNhbnZhczo6ZHJhd1RleHR1cmVkUmVjdChHTEVTMlRleHR1cmUqIHRleHR1cmUsIGNv
bnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBDb2xvclNw
YWNlIGNvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQoreworICAgIGRy
YXdUZXh0dXJlZFJlY3QodGV4dHVyZSwgc3JjUmVjdCwgZHN0UmVjdCwgbV9zdGF0ZS0+bV9jdG0s
IG1fc3RhdGUtPm1fYWxwaGEsIGNvbG9yU3BhY2UsIGNvbXBvc2l0ZU9wKTsKK30KKwordm9pZCBH
TEVTMkNhbnZhczo6ZHJhd1RleHR1cmVkUmVjdChHTEVTMlRleHR1cmUqIHRleHR1cmUsIGNvbnN0
IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBBZmZp
bmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSwgZmxvYXQgYWxwaGEsIENvbG9yU3BhY2UgY29sb3JTcGFj
ZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAgbV9nbGVzMkNvbnRleHQt
Pm1ha2VDdXJyZW50KCk7CisKKyAgICBhcHBseUNvbXBvc2l0ZU9wZXJhdG9yKGNvbXBvc2l0ZU9w
KTsKKworICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIGdldFF1YWRWZXJ0aWNlcygp
KTsKKyAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGdldFF1YWRJbmRp
Y2VzKCkpOworICAgIGNoZWNrR0xFcnJvcigiZ2xCaW5kQnVmZmVyIik7CisKKyAgICBnbFVzZVBy
b2dyYW0oZ2V0VGV4UHJvZ3JhbSgpKTsKKyAgICBjaGVja0dMRXJyb3IoImdsVXNlUHJvZ3JhbSIp
OworCisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICB0ZXh0dXJlLT5iaW5k
KCk7CisKKyAgICBnbFVuaWZvcm0xaShtX3RleFNhbXBsZXJMb2NhdGlvbiwgMCk7CisgICAgY2hl
Y2tHTEVycm9yKCJnbFVuaWZvcm0xaSIpOworCisgICAgZ2xVbmlmb3JtMWYobV90ZXhBbHBoYUxv
Y2F0aW9uLCBhbHBoYSk7CisgICAgY2hlY2tHTEVycm9yKCJnbFVuaWZvcm0xZiBmb3IgYWxwaGEi
KTsKKworICAgIEFmZmluZVRyYW5zZm9ybSBtYXRyaXgobV9mbGlwTWF0cml4KTsKKyAgICBtYXRy
aXgubXVsdExlZnQodHJhbnNmb3JtKTsKKyAgICBtYXRyaXgudHJhbnNsYXRlKGRzdFJlY3QueCgp
LCBkc3RSZWN0LnkoKSk7CisgICAgbWF0cml4LnNjYWxlKGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVj
dC5oZWlnaHQoKSk7CisgICAgR0xmbG9hdCBtYXRbOV07CisgICAgYWZmaW5lVG8zeDMobWF0cml4
LCBtYXQpOworICAgIGdsVW5pZm9ybU1hdHJpeDNmdihtX3RleE1hdHJpeExvY2F0aW9uLCAxLCBH
TF9GQUxTRSwgbWF0KTsKKyAgICBjaGVja0dMRXJyb3IoImdsVW5pZm9ybU1hdHJpeDNmdiIpOwor
CisgICAgQWZmaW5lVHJhbnNmb3JtIHRleE1hdHJpeDsKKyAgICB0ZXhNYXRyaXguc2NhbGUoMS4w
ZiAvIHRleHR1cmUtPndpZHRoKCksIDEuMGYgLyB0ZXh0dXJlLT5oZWlnaHQoKSk7CisgICAgdGV4
TWF0cml4LnRyYW5zbGF0ZShzcmNSZWN0LngoKSwgc3JjUmVjdC55KCkpOworICAgIHRleE1hdHJp
eC5zY2FsZShzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCkpOworICAgIEdMZmxvYXQg
dGV4TWF0WzldOworICAgIGFmZmluZVRvM3gzKHRleE1hdHJpeCwgdGV4TWF0KTsKKyAgICBnbFVu
aWZvcm1NYXRyaXgzZnYobV90ZXhUZXhNYXRyaXhMb2NhdGlvbiwgMSwgR0xfRkFMU0UsIHRleE1h
dCk7CisgICAgY2hlY2tHTEVycm9yKCJnbFVuaWZvcm1NYXRyaXgzZnYiKTsKKworICAgIGdsVmVy
dGV4QXR0cmliUG9pbnRlcihtX3RleFBvc2l0aW9uTG9jYXRpb24sIDMsIEdMX0ZMT0FULCBHTF9G
QUxTRSwgMCwgKEdMdm9pZCopKDApKTsKKworICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXko
bV90ZXhQb3NpdGlvbkxvY2F0aW9uKTsKKworICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xF
UywgNiwgR0xfVU5TSUdORURfU0hPUlQsIDApOworICAgIGNoZWNrR0xFcnJvcigiZ2xEcmF3RWxl
bWVudHMiKTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKENv
bXBvc2l0ZU9wZXJhdG9yIG9wKQoreworICAgIG1fc3RhdGUtPm1fY29tcG9zaXRlT3AgPSBvcDsK
K30KKwordm9pZCBHTEVTMkNhbnZhczo6YXBwbHlDb21wb3NpdGVPcGVyYXRvcihDb21wb3NpdGVP
cGVyYXRvciBvcCkKK3sKKyAgICBpZiAob3AgPT0gbV9sYXN0Q29tcG9zaXRlT3ApCisgICAgICAg
IHJldHVybjsKKworICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIENvbXBvc2l0ZUNsZWFyOgor
ICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8s
IEdMX1pFUk8pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBvc2l0ZUNvcHk6CisgICAg
ICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29tcG9z
aXRlU291cmNlT3ZlcjoKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICBnbEJs
ZW5kRnVuYyhHTF9PTkUsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZUluOgorICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7
CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX0RTVF9BTFBIQSwgR0xfWkVSTyk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgQ29tcG9zaXRlU291cmNlT3V0OgorICAgICAgICBnbEVuYWJsZShHTF9C
TEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX09ORV9NSU5VU19EU1RfQUxQSEEsIEdMX1pF
Uk8pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZUF0b3A6CisgICAg
ICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMoR0xfRFNUX0FMUEhB
LCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb21w
b3NpdGVEZXN0aW5hdGlvbk92ZXI6CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAg
ICAgZ2xCbGVuZEZ1bmMoR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgR0xfT05FKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbkluOgorICAgICAgICBnbEVuYWJs
ZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8sIEdMX1NSQ19BTFBIQSk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29tcG9zaXRlRGVzdGluYXRpb25PdXQ6CisgICAg
ICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMoR0xfWkVSTywgR0xf
T05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29tcG9zaXRl
RGVzdGluYXRpb25BdG9wOgorICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGds
QmxlbmRGdW5jKEdMX09ORV9NSU5VU19EU1RfQUxQSEEsIEdMX1NSQ19BTFBIQSk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgQ29tcG9zaXRlWE9SOgorICAgICAgICBnbEVuYWJsZShHTF9CTEVO
RCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdMX09ORV9NSU5VU19EU1RfQUxQSEEsIEdMX09ORV9N
SU5VU19TUkNfQUxQSEEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBvc2l0ZVBsdXNE
YXJrZXI6CisgICAgY2FzZSBDb21wb3NpdGVIaWdobGlnaHQ6CisgICAgICAgIC8vIHVuc3VwcG9y
dGVkCisgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgQ29tcG9zaXRlUGx1c0xpZ2h0ZXI6CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAg
ICAgICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBHTF9PTkUpOworICAgICAgICBicmVhazsKKyAgICB9
CisgICAgbV9sYXN0Q29tcG9zaXRlT3AgPSBvcDsKK30KKwordW5zaWduZWQgR0xFUzJDYW52YXM6
OmdldFF1YWRWZXJ0aWNlcygpCit7CisgICAgaWYgKCFtX3F1YWRWZXJ0aWNlcykgeworICAgICAg
ICBHTGZsb2F0IHZlcnRpY2VzW10gPSB7IDAuMGYsIDAuMGYsIDEuMGYsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMS4wZiwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAxLjBmLCAxLjBmLCAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDAuMGYsIDEuMGYsIDEuMGYgfTsKKyAgICAgICAgZ2xHZW5CdWZmZXJzKDEsICZtX3F1YWRW
ZXJ0aWNlcyk7CisgICAgICAgIGdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1fcXVhZFZl
cnRpY2VzKTsKKyAgICAgICAgZ2xCdWZmZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgc2l6ZW9mKHZl
cnRpY2VzKSwgdmVydGljZXMsIEdMX1NUQVRJQ19EUkFXKTsKKyAgICB9CisgICAgcmV0dXJuIG1f
cXVhZFZlcnRpY2VzOworfQorCisKK3Vuc2lnbmVkIEdMRVMyQ2FudmFzOjpnZXRRdWFkSW5kaWNl
cygpCit7CisgICAgaWYgKCFtX3F1YWRJbmRpY2VzKSB7CisgICAgICAgIEdMdXNob3J0IGluZGlj
ZXNbXSA9IHsgMCwgMSwgMiwgMCwgMiwgM307CisKKyAgICAgICAgZ2xHZW5CdWZmZXJzKDEsICZt
X3F1YWRJbmRpY2VzKTsKKyAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVG
RkVSLCBtX3F1YWRJbmRpY2VzKTsKKyAgICAgICAgZ2xCdWZmZXJEYXRhKEdMX0VMRU1FTlRfQVJS
QVlfQlVGRkVSLCBzaXplb2YoaW5kaWNlcyksIGluZGljZXMsIEdMX1NUQVRJQ19EUkFXKTsKKyAg
ICB9CisgICAgcmV0dXJuIG1fcXVhZEluZGljZXM7Cit9CisKK3N0YXRpYyBHTHVpbnQgbG9hZFNo
YWRlcihHTGVudW0gdHlwZSwgY29uc3QgY2hhciogc2hhZGVyU291cmNlKQoreworICAgIEdMdWlu
dCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcih0eXBlKTsKKyAgICBpZiAoIXNoYWRlcikKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZzaGFkZXJTb3Vy
Y2UsIDApOworICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOworICAgIEdMaW50IGNvbXBpbGVT
dGF0dXM7CisgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29t
cGlsZVN0YXR1cyk7CisgICAgaWYgKCFjb21waWxlU3RhdHVzKSB7CisgICAgICAgIGludCBsZW5n
dGg7CisgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZs
ZW5ndGgpOworICAgICAgICBPd25BcnJheVB0cjxjaGFyPiBsb2cobmV3IGNoYXJbbGVuZ3RoXSk7
CisgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIGxlbmd0aCwgMCwgbG9nLmdldCgp
KTsKKyAgICAgICAgTE9HX0VSUk9SKGxvZy5nZXQoKSk7CisgICAgICAgIGdsRGVsZXRlU2hhZGVy
KHNoYWRlcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gc2hhZGVyOwor
fQorCit1bnNpZ25lZCBHTEVTMkNhbnZhczo6Z2V0U2ltcGxlUHJvZ3JhbSgpCit7CisgICAgaWYg
KCFtX3NpbXBsZVByb2dyYW0pIHsKKyAgICAgICAgR0x1aW50IHZlcnRleFNoYWRlciA9IGxvYWRT
aGFkZXIoR0xfVkVSVEVYX1NIQURFUiwKKyAgICAgICAgICAgICJ1bmlmb3JtIG1hdDMgbWF0cml4
O1xuIgorICAgICAgICAgICAgInVuaWZvcm0gdmVjNCBjb2xvcjtcbiIKKyAgICAgICAgICAgICJh
dHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcbiIKKyAgICAgICAgICAgICJ2b2lkIG1haW4oKSB7XG4i
CisgICAgICAgICAgICAiICAgIGdsX1Bvc2l0aW9uID0gdmVjNChtYXRyaXggKiBwb3NpdGlvbiwg
MS4wKTtcbiIKKyAgICAgICAgICAgICJ9XG4iKTsKKyAgICAgICAgaWYgKCF2ZXJ0ZXhTaGFkZXIp
CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgR0x1aW50IGZyYWdtZW50U2hhZGVyID0g
bG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsCisgICAgICAgICAgICAicHJlY2lzaW9uIG1l
ZGl1bXAgZmxvYXQ7XG4iCisgICAgICAgICAgICAidW5pZm9ybSBtYXQzIG1hdHJpeDtcbiIKKyAg
ICAgICAgICAgICJ1bmlmb3JtIHZlYzQgY29sb3I7XG4iCisgICAgICAgICAgICAidm9pZCBtYWlu
KCkge1xuIgorICAgICAgICAgICAgIiAgICBnbF9GcmFnQ29sb3IgPSBjb2xvcjtcbiIKKyAgICAg
ICAgICAgICJ9XG4iKTsKKyAgICAgICAgaWYgKCFmcmFnbWVudFNoYWRlcikKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICBtX3NpbXBsZVByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsK
KyAgICAgICAgaWYgKCFtX3NpbXBsZVByb2dyYW0pCisgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgZ2xBdHRhY2hTaGFkZXIobV9zaW1wbGVQcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOworICAg
ICAgICBnbEF0dGFjaFNoYWRlcihtX3NpbXBsZVByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTsKKyAg
ICAgICAgZ2xMaW5rUHJvZ3JhbShtX3NpbXBsZVByb2dyYW0pOworICAgICAgICBHTGludCBsaW5r
U3RhdHVzOworICAgICAgICBnbEdldFByb2dyYW1pdihtX3NpbXBsZVByb2dyYW0sIEdMX0xJTktf
U1RBVFVTLCAmbGlua1N0YXR1cyk7CisgICAgICAgIGlmICghbGlua1N0YXR1cykgeworICAgICAg
ICAgICAgZ2xEZWxldGVQcm9ncmFtKG1fc2ltcGxlUHJvZ3JhbSk7CisgICAgICAgICAgICBtX3Np
bXBsZVByb2dyYW0gPSAwOworICAgICAgICB9CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRl
eFNoYWRlcik7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKKyAgICAg
ICAgbV9zaW1wbGVQb3NpdGlvbkxvY2F0aW9uID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihtX3NpbXBs
ZVByb2dyYW0sICJwb3NpdGlvbiIpOworICAgICAgICBtX3NpbXBsZU1hdHJpeExvY2F0aW9uID0g
Z2xHZXRVbmlmb3JtTG9jYXRpb24obV9zaW1wbGVQcm9ncmFtLCAibWF0cml4Iik7CisgICAgICAg
IG1fc2ltcGxlQ29sb3JMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fc2ltcGxlUHJv
Z3JhbSwgImNvbG9yIik7CisgICAgfQorICAgIHJldHVybiBtX3NpbXBsZVByb2dyYW07Cit9CisK
K3Vuc2lnbmVkIEdMRVMyQ2FudmFzOjpnZXRUZXhQcm9ncmFtKCkKK3sKKyAgICBpZiAoIW1fdGV4
UHJvZ3JhbSkgeworICAgICAgICBHTHVpbnQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTF9W
RVJURVhfU0hBREVSLAorICAgICAgICAgICAgInVuaWZvcm0gbWF0MyBtYXRyaXg7XG4iCisgICAg
ICAgICAgICAidW5pZm9ybSBtYXQzIHRleE1hdHJpeDtcbiIKKyAgICAgICAgICAgICJhdHRyaWJ1
dGUgdmVjMyBwb3NpdGlvbjtcbiIKKyAgICAgICAgICAgICJ2YXJ5aW5nIHZlYzMgdGV4Q29vcmQ7
XG4iCisgICAgICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgICAgICAgIiAgICB0ZXhD
b29yZCA9IHRleE1hdHJpeCAqIHBvc2l0aW9uO1xuIgorICAgICAgICAgICAgIiAgICBnbF9Qb3Np
dGlvbiA9IHZlYzQobWF0cml4ICogcG9zaXRpb24sIDEuMCk7XG4iCisgICAgICAgICAgICAifVxu
Iik7CisgICAgICAgIGlmICghdmVydGV4U2hhZGVyKQorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgIEdMdWludCBmcmFnbWVudFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hB
REVSLAorICAgICAgICAgICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgorICAgICAgICAg
ICAgInVuaWZvcm0gc2FtcGxlcjJEIHNhbXBsZXI7XG4iCisgICAgICAgICAgICAidW5pZm9ybSBm
bG9hdCBhbHBoYTtcbiIKKyAgICAgICAgICAgICJ2YXJ5aW5nIHZlYzMgdGV4Q29vcmQ7XG4iCisg
ICAgICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAgICAgICAgICAgIiAgICBnbF9GcmFnQ29s
b3IgPSB0ZXh0dXJlMkQoc2FtcGxlciwgdGV4Q29vcmQueHkpKiB2ZWM0KGFscGhhKTtcbiIKKyAg
ICAgICAgICAgICJ9XG4iKTsKKyAgICAgICAgaWYgKCFmcmFnbWVudFNoYWRlcikKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICBtX3RleFByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsK
KyAgICAgICAgaWYgKCFtX3RleFByb2dyYW0pCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgZ2xBdHRhY2hTaGFkZXIobV90ZXhQcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOworICAgICAgICBn
bEF0dGFjaFNoYWRlcihtX3RleFByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTsKKyAgICAgICAgZ2xM
aW5rUHJvZ3JhbShtX3RleFByb2dyYW0pOworICAgICAgICBHTGludCBsaW5rU3RhdHVzOworICAg
ICAgICBnbEdldFByb2dyYW1pdihtX3RleFByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0
YXR1cyk7CisgICAgICAgIGlmICghbGlua1N0YXR1cykgeworICAgICAgICAgICAgZ2xEZWxldGVQ
cm9ncmFtKG1fdGV4UHJvZ3JhbSk7CisgICAgICAgICAgICBtX3RleFByb2dyYW0gPSAwOworICAg
ICAgICB9CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7CisgICAgICAgIGds
RGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKKyAgICAgICAgbV90ZXhNYXRyaXhMb2NhdGlv
biA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fdGV4UHJvZ3JhbSwgIm1hdHJpeCIpOworICAgICAg
ICBtX3RleFNhbXBsZXJMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1fdGV4UHJvZ3Jh
bSwgInNhbXBsZXIiKTsKKyAgICAgICAgbV90ZXhUZXhNYXRyaXhMb2NhdGlvbiA9IGdsR2V0VW5p
Zm9ybUxvY2F0aW9uKG1fdGV4UHJvZ3JhbSwgInRleE1hdHJpeCIpOworICAgICAgICBtX3RleFBv
c2l0aW9uTG9jYXRpb24gPSBnbEdldEF0dHJpYkxvY2F0aW9uKG1fdGV4UHJvZ3JhbSwgInBvc2l0
aW9uIik7CisgICAgICAgIG1fdGV4QWxwaGFMb2NhdGlvbiA9IGdsR2V0VW5pZm9ybUxvY2F0aW9u
KG1fdGV4UHJvZ3JhbSwgImFscGhhIik7CisgICAgfQorICAgIHJldHVybiBtX3RleFByb2dyYW07
Cit9CisKK0dMRVMyVGV4dHVyZSogR0xFUzJDYW52YXM6OmNyZWF0ZVRleHR1cmUoTmF0aXZlSW1h
Z2VQdHIgcHRyLCBHTEVTMlRleHR1cmU6OkZvcm1hdCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhl
aWdodCkKK3sKKyAgICBQYXNzUmVmUHRyPEdMRVMyVGV4dHVyZT4gdGV4dHVyZSA9IG1fdGV4dHVy
ZXMuZ2V0KHB0cik7CisgICAgaWYgKHRleHR1cmUpCisgICAgICAgIHJldHVybiB0ZXh0dXJlLmdl
dCgpOworCisgICAgdGV4dHVyZSA9IEdMRVMyVGV4dHVyZTo6Y3JlYXRlKGZvcm1hdCwgd2lkdGgs
IGhlaWdodCk7CisgICAgR0xFUzJUZXh0dXJlKiB0ID0gdGV4dHVyZS5nZXQoKTsKKyAgICBtX3Rl
eHR1cmVzLnNldChwdHIsIHRleHR1cmUpOworICAgIHJldHVybiB0OworfQorCitHTEVTMlRleHR1
cmUqIEdMRVMyQ2FudmFzOjpnZXRUZXh0dXJlKE5hdGl2ZUltYWdlUHRyIHB0cikKK3sKKyAgICBQ
YXNzUmVmUHRyPEdMRVMyVGV4dHVyZT4gdGV4dHVyZSA9IG1fdGV4dHVyZXMuZ2V0KHB0cik7Cisg
ICAgcmV0dXJuIHRleHR1cmUgPyB0ZXh0dXJlLmdldCgpIDogMDsKK30KKwordm9pZCBHTEVTMkNh
bnZhczo6Y2hlY2tHTEVycm9yKGNvbnN0IGNoYXIqIGhlYWRlcikKK3sKKyNpZm5kZWYgTkRFQlVH
CisgICAgR0xlbnVtIGVycjsKKyAgICB3aGlsZSAoKGVyciA9IGdsR2V0RXJyb3IoKSkgIT0gR0xf
Tk9fRVJST1IpIHsKKyAgICAgICAgY29uc3QgY2hhciogZXJyb3JTdHIgPSAiKioqIFVOS05PV04g
RVJST1IgKioqIjsKKyAgICAgICAgc3dpdGNoIChlcnIpIHsKKyAgICAgICAgY2FzZSBHTF9JTlZB
TElEX0VOVU06CisgICAgICAgICAgICBlcnJvclN0ciA9ICJHTF9JTlZBTElEX0VOVU0iOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfSU5WQUxJRF9WQUxVRToKKyAgICAgICAg
ICAgIGVycm9yU3RyID0gIkdMX0lOVkFMSURfVkFMVUUiOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgR0xfSU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICAgICBlcnJvclN0ciA9
ICJHTF9JTlZBTElEX09QRVJBVElPTiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTjoKKyAgICAgICAgICAgIGVycm9yU3Ry
ID0gIkdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OIjsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIEdMX09VVF9PRl9NRU1PUlk6CisgICAgICAgICAgICBlcnJvclN0ciA9
ICJHTF9PVVRfT0ZfTUVNT1JZIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
ICAgIGlmIChoZWFkZXIpCisgICAgICAgICAgICBMT0dfRVJST1IoIiVzOiAgJXMiLCBoZWFkZXIs
IGVycm9yU3RyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTE9HX0VSUk9SKCIlcyIsIGVy
cm9yU3RyKTsKKyAgICB9CisjZW5kaWYKK30KKworfTsKKworI2VuZGlmCkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyQ2FudmFzLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMkNhbnZhcy5oCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMkNhbnZhcy5o
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAx
MCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
ICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEdMRVMyQ2FudmFzX2gKKyNk
ZWZpbmUgR0xFUzJDYW52YXNfaAorCisjaWYgVVNFKEdMRVMyX1JFTkRFUklORykKKworI2luY2x1
ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkNvbG9yLmgiCisjaW5jbHVkZSAiQ29s
b3JTcGFjZS5oIgorI2luY2x1ZGUgIkdMRVMyVGV4dHVyZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNz
VHlwZXMuaCIKKyNpbmNsdWRlICJJbWFnZVNvdXJjZS5oIgorCisjaW5jbHVkZSA8d3RmL0hhc2hN
YXAuaD4KKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitjbGFzcyBGbG9hdFJlY3Q7CitjbGFzcyBDb2xvcjsKK2NsYXNzIEdMRVMyQ29udGV4dDsK
KwordHlwZWRlZiBIYXNoTWFwPE5hdGl2ZUltYWdlUHRyLCBSZWZQdHI8R0xFUzJUZXh0dXJlPiA+
IFRleHR1cmVIYXNoTWFwOworCitjbGFzcyBHTEVTMkNhbnZhcyA6IHB1YmxpYyBOb25jb3B5YWJs
ZSB7CitwdWJsaWM6CisgICAgR0xFUzJDYW52YXMoR0xFUzJDb250ZXh0KiBjb250ZXh0LCBpbnQg
d2lkdGgsIGludCBoZWlnaHQpOworICAgIH5HTEVTMkNhbnZhcygpOworCisgICAgdm9pZCBmaWxs
UmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvciwKKyAgICAgICAg
ICAgICAgICAgIENvbG9yU3BhY2UgY29sb3JTcGFjZSk7CisgICAgdm9pZCBmaWxsUmVjdChjb25z
dCBGbG9hdFJlY3QmIHJlY3QpOworICAgIHZvaWQgY2xlYXJSZWN0KGNvbnN0IEZsb2F0UmVjdCYg
cmVjdCk7CisgICAgdm9pZCBzZXRGaWxsQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yLCBDb2xvclNw
YWNlIGNvbG9yU3BhY2UpOworICAgIHZvaWQgc2V0QWxwaGEoZmxvYXQgYWxwaGEpOworICAgIHZv
aWQgc2V0Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJhdG9yIG9wKTsKKyAgICB2b2lk
IHRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KTsKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCBhbmds
ZUluUmFkaWFucyk7CisgICAgdm9pZCBzY2FsZShjb25zdCBGbG9hdFNpemUmIHNpemUpOworICAg
IHZvaWQgY29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgYWZmaW5lKTsKKworICAgIHZv
aWQgc2F2ZSgpOworICAgIHZvaWQgcmVzdG9yZSgpOworCisgICAgLy8gbm9uLXN0YW5kYXJkIGZ1
bmN0aW9ucworICAgIC8vIFRoZXNlIGFyZSBub3Qgc3RhbmRhcmQgR3JhcGhpY3NDb250ZXh0IGZ1
bmN0aW9ucywgYW5kIHNob3VsZCBiZSBwdXNoZWQKKyAgICAvLyBkb3duIGludG8gYSBQbGF0Zm9y
bUNvbnRleHRHTEVTMiBhdCBzb21lIHBvaW50LgorICAgIHZvaWQgZHJhd1RleHR1cmVkUmVjdChH
TEVTMlRleHR1cmUqIHRleHR1cmUsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgRmxv
YXRSZWN0JiBkc3RSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSwgZmxvYXQg
YWxwaGEsIENvbG9yU3BhY2UgY29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRl
T3ApOworICAgIHZvaWQgZHJhd1RleHR1cmVkUmVjdChHTEVTMlRleHR1cmUqIHRleHR1cmUsIGNv
bnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBDb2xvclNw
YWNlIGNvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKTsKKyAgICBHTEVT
MkNvbnRleHQqIGdsZXMyQ29udGV4dCgpIHsgcmV0dXJuIG1fZ2xlczJDb250ZXh0OyB9CisgICAg
R0xFUzJUZXh0dXJlKiBjcmVhdGVUZXh0dXJlKE5hdGl2ZUltYWdlUHRyIHB0ciwgR0xFUzJUZXh0
dXJlOjpGb3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgIEdMRVMyVGV4
dHVyZSogZ2V0VGV4dHVyZShOYXRpdmVJbWFnZVB0ciBwdHIpOworCitwcml2YXRlOgorICAgIHZv
aWQgYXBwbHlDb21wb3NpdGVPcGVyYXRvcihDb21wb3NpdGVPcGVyYXRvciBvcCk7CisgICAgdm9p
ZCBjaGVja0dMRXJyb3IoY29uc3QgY2hhciogaGVhZGVyKTsKKyAgICB1bnNpZ25lZCBnZXRRdWFk
VmVydGljZXMoKTsKKyAgICB1bnNpZ25lZCBnZXRRdWFkSW5kaWNlcygpOworICAgIHVuc2lnbmVk
IGdldFNpbXBsZVByb2dyYW0oKTsKKyAgICB1bnNpZ25lZCBnZXRUZXhQcm9ncmFtKCk7CisKKyAg
ICBHTEVTMkNvbnRleHQqIG1fZ2xlczJDb250ZXh0OworICAgIHN0cnVjdCBTdGF0ZTsKKyAgICBX
VEY6OlZlY3RvcjxTdGF0ZT4gbV9zdGF0ZVN0YWNrOworICAgIFN0YXRlKiBtX3N0YXRlOworICAg
IHVuc2lnbmVkIG1fcXVhZFZlcnRpY2VzOworICAgIHVuc2lnbmVkIG1fcXVhZEluZGljZXM7Cisg
ICAgdW5zaWduZWQgbV9zaW1wbGVQcm9ncmFtOworICAgIHVuc2lnbmVkIG1fdGV4UHJvZ3JhbTsK
KyAgICBpbnQgbV9zaW1wbGVNYXRyaXhMb2NhdGlvbjsKKyAgICBpbnQgbV9zaW1wbGVDb2xvckxv
Y2F0aW9uOworICAgIGludCBtX3NpbXBsZVBvc2l0aW9uTG9jYXRpb247CisgICAgaW50IG1fdGV4
TWF0cml4TG9jYXRpb247CisgICAgaW50IG1fdGV4VGV4TWF0cml4TG9jYXRpb247CisgICAgaW50
IG1fdGV4U2FtcGxlckxvY2F0aW9uOworICAgIGludCBtX3RleEFscGhhTG9jYXRpb247CisgICAg
aW50IG1fdGV4UG9zaXRpb25Mb2NhdGlvbjsKKyAgICBpbnQgbV93aWR0aDsKKyAgICBpbnQgbV9o
ZWlnaHQ7CisgICAgQWZmaW5lVHJhbnNmb3JtIG1fZmxpcE1hdHJpeDsKKyAgICBUZXh0dXJlSGFz
aE1hcCBtX3RleHR1cmVzOworICAgIENvbXBvc2l0ZU9wZXJhdG9yIG1fbGFzdENvbXBvc2l0ZU9w
OyAvLyBUaGlzIGlzIHRoZSBvbmUgbGFzdCBzZXQsIG5vdCBuZWNlc3NhcmlseSB0aGUgb25lIGlu
IHRoZSBzdGF0ZSBzdGFjay4KK307CisKK307CisKKyNlbmRpZgorCisjZW5kaWYgLy8gR0xFUzJD
YW52YXNfaApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMlRl
eHR1cmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vR0xFUzJUZXh0dXJlLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vR0xFUzJUZXh0dXJlLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwx
MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6Cisg
KgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEdMRVMyX1JFTkRFUklORykKKwor
I2luY2x1ZGUgIkdMRVMyVGV4dHVyZS5oIgorCisjaW5jbHVkZSAiT3duQXJyYXlQdHIuaCIKKwor
I2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0dMRVMyVGV4
dHVyZTo6R0xFUzJUZXh0dXJlKHVuc2lnbmVkIGludCB0ZXh0dXJlSWQsIEZvcm1hdCBmb3JtYXQs
IGludCB3aWR0aCwgaW50IGhlaWdodCkKKyAgICA6IG1fdGV4dHVyZUlkKHRleHR1cmVJZCkKKyAg
ICAsIG1fZm9ybWF0KGZvcm1hdCkKKyAgICAsIG1fd2lkdGgod2lkdGgpCisgICAgLCBtX2hlaWdo
dChoZWlnaHQpCit7Cit9CisKK0dMRVMyVGV4dHVyZTo6fkdMRVMyVGV4dHVyZSgpCit7CisgICAg
Z2xEZWxldGVUZXh0dXJlcygxLCAmbV90ZXh0dXJlSWQpOworfQorCitQYXNzUmVmUHRyPEdMRVMy
VGV4dHVyZT4gR0xFUzJUZXh0dXJlOjpjcmVhdGUoRm9ybWF0IGZvcm1hdCwgaW50IHdpZHRoLCBp
bnQgaGVpZ2h0KQoreworICAgIEdMdWludCB0ZXh0dXJlSWQ7CisgICAgZ2xHZW5UZXh0dXJlcygx
LCAmdGV4dHVyZUlkKTsKKyAgICBpZiAoIXRleHR1cmVJZCkKKyAgICAgICAgcmV0dXJuIDA7CisK
KyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmVJZCk7CisgICAgZ2xUZXhJ
bWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIHdpZHRoLCBoZWlnaHQsIDAsIEdMX1JH
QkEsIEdMX1VOU0lHTkVEX0JZVEUsIDApOworCisgICAgaW50IG1heDsKKyAgICBnbEdldEludGVn
ZXJ2KEdMX01BWF9URVhUVVJFX1NJWkUsICZtYXgpOworICAgIGlmICh3aWR0aCA+IG1heCB8fCBo
ZWlnaHQgPiBtYXgpCisgICAgICAgIEFTU0VSVCghInRleHR1cmUgdG9vIGJpZyIpOworCisgICAg
cmV0dXJuIGFkb3B0UmVmKG5ldyBHTEVTMlRleHR1cmUodGV4dHVyZUlkLCBmb3JtYXQsIHdpZHRo
LCBoZWlnaHQpKTsKK30KKworc3RhdGljIHZvaWQgY29udmVydEZvcm1hdChHTEVTMlRleHR1cmU6
OkZvcm1hdCBmb3JtYXQsIHVuc2lnbmVkIGludCogZ2xGb3JtYXQsIHVuc2lnbmVkIGludCogZ2xU
eXBlLCBib29sKiBzd2l6emxlKQoreworICAgICpzd2l6emxlID0gZmFsc2U7CisgICAgc3dpdGNo
IChmb3JtYXQpIHsKKyAgICBjYXNlIEdMRVMyVGV4dHVyZTo6UkdCQTg6CisgICAgICAgICpnbEZv
cm1hdCA9IEdMX1JHQkE7CisgICAgICAgICpnbFR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIEdMRVMyVGV4dHVyZTo6QkdSQTg6CisvLyBGSVhNRTogIE9u
Y2Ugd2UgaGF2ZSBzdXBwb3J0IGZvciBleHRlbnNpb25zLCB3ZSBzaG91bGQgY2hlY2sgZm9yIEVY
VF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCwKKy8vIGFuZCB1c2UgdGhhdCBpZiBwcmVzZW50Lgor
ICAgICAgICAqZ2xGb3JtYXQgPSBHTF9SR0JBOworICAgICAgICAqZ2xUeXBlID0gR0xfVU5TSUdO
RURfQllURTsKKyAgICAgICAgKnN3aXp6bGUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICBk
ZWZhdWx0OgorICAgICAgICBBU1NFUlQoISJiYWQgZm9ybWF0Iik7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KK30KKwordm9pZCBHTEVTMlRleHR1cmU6OmxvYWQodm9pZCogcGl4ZWxzKQoreworICAg
IHVuc2lnbmVkIGludCBnbEZvcm1hdCwgZ2xUeXBlOworICAgIGJvb2wgc3dpenpsZTsKKyAgICBj
b252ZXJ0Rm9ybWF0KG1fZm9ybWF0LCAmZ2xGb3JtYXQsICZnbFR5cGUsICZzd2l6emxlKTsKKyAg
ICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1fdGV4dHVyZUlkKTsKKyAgICBpZiAoc3dp
enpsZSkgeworICAgICAgICBBU1NFUlQoZ2xGb3JtYXQgPT0gR0xfUkdCQSAmJiBnbFR5cGUgPT0g
R0xfVU5TSUdORURfQllURSk7CisgICAgICAgIC8vIEZJWE1FOiAgVGhpcyBjb3VsZCB1c2UgUEJP
J3MgdG8gc2F2ZSBkb2luZyBhbiBleHRyYSBjb3B5IGhlcmUuCisgICAgICAgIGludCBzaXplID0g
bV93aWR0aCAqIG1faGVpZ2h0OworICAgICAgICB1bnNpZ25lZCogcGl4ZWxzMzIgPSBzdGF0aWNf
Y2FzdDx1bnNpZ25lZCo+KHBpeGVscyk7CisgICAgICAgIE93bkFycmF5UHRyPHVuc2lnbmVkPiBi
dWYobmV3IHVuc2lnbmVkW3NpemVdKTsKKyAgICAgICAgdW5zaWduZWQqIGJ1ZnB0ciA9IGJ1Zi5n
ZXQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAg
ICAgIHVuc2lnbmVkIHBpeGVsID0gcGl4ZWxzMzJbaV07CisgICAgICAgICAgICBidWZwdHJbaV0g
PSBwaXhlbCAmIDB4RkYwMEZGMDAgfCAoKHBpeGVsICYgMHgwMEZGMDAwMCkgPj4gMTYpIHwgKChw
aXhlbCAmIDB4MDAwMDAwRkYpIDw8IDE2KTsKKyAgICAgICAgfQorICAgICAgICBnbFRleFN1Yklt
YWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgbV93aWR0aCwgbV9oZWlnaHQsIGdsRm9ybWF0
LCBnbFR5cGUsIGJ1Zi5nZXQoKSk7CisgICAgfSBlbHNlCisgICAgICBnbFRleFN1YkltYWdlMkQo
R0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgbV93aWR0aCwgbV9oZWlnaHQsIGdsRm9ybWF0LCBnbFR5
cGUsIHBpeGVscyk7Cit9CisKK3ZvaWQgR0xFUzJUZXh0dXJlOjpiaW5kKCkKK3sKKyAgICBnbEJp
bmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1fdGV4dHVyZUlkKTsKKyAgICBnbFRleFBhcmFtZXRl
cmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAg
IGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdM
X0xJTkVBUik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVf
V1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVS
RV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworfQorCit9OworCisj
ZW5kaWYKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJUZXh0
dXJlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9H
TEVTMlRleHR1cmUuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vR0xFUzJUZXh0dXJlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAg
ICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAq
IGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4g
bm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRv
cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP
UlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05F
UiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisg
KiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lm
bmRlZiBHTEVTMlRleHR1cmVfaAorI2RlZmluZSBHTEVTMlRleHR1cmVfaAorCisjaWYgVVNFKEdM
RVMyX1JFTkRFUklORykKKworI2luY2x1ZGUgIlJlZkNvdW50ZWQuaCIKKyNpbmNsdWRlICJSZWZQ
dHIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBHTEVTMlRleHR1cmUgOiBwdWJs
aWMgUmVmQ291bnRlZDxHTEVTMlRleHR1cmU+IHsKK3B1YmxpYzoKKyAgICB+R0xFUzJUZXh0dXJl
KCk7CisgICAgZW51bSBGb3JtYXQgeyBSR0JBOCwgQkdSQTggfTsKKyAgICBzdGF0aWMgUGFzc1Jl
ZlB0cjxHTEVTMlRleHR1cmU+IGNyZWF0ZShGb3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBo
ZWlnaHQpOworICAgIHZvaWQgYmluZCgpOworICAgIHZvaWQgbG9hZCh2b2lkKiBwaXhlbHMpOwor
ICAgIEZvcm1hdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtX2Zvcm1hdDsgfQorICAgIGludCB3
aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fd2lkdGg7IH0KKyAgICBpbnQgaGVpZ2h0KCkgY29uc3Qg
eyByZXR1cm4gbV9oZWlnaHQ7IH0KK3ByaXZhdGU6CisgICAgR0xFUzJUZXh0dXJlKHVuc2lnbmVk
IGludCB0ZXh0dXJlSWQsIEZvcm1hdCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Cisg
ICAgdW5zaWduZWQgaW50IG1fdGV4dHVyZUlkOworICAgIEZvcm1hdCBtX2Zvcm1hdDsKKyAgICBp
bnQgbV93aWR0aDsKKyAgICBpbnQgbV9oZWlnaHQ7Cit9OworCit9OworCisjZW5kaWYKKworI2Vu
ZGlmIC8vIEdMRVMyVGV4dHVyZV9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>62505</attachid>
            <date>2010-07-24 09:40:00 -0700</date>
            <delta_ts>2010-07-25 20:46:27 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-42905-20100724123958.patch</filename>
            <type>text/plain</type>
            <size>32556</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Mzk5NikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTkgQEAKKzIwMTAtMDctMjMgIFN0ZXBoZW4gV2hpdGUgIDxzZW5vcmJsYW5jb0Bj
aHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgSW1wbGVtZW50IE9wZW5HTEVTMiBoZWxwZXIgY2xhc3Nlcy4KKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQyOTA1CisKKyAgICAgICAgR0xFUzJD
YW52YXMgYW5kIEdMRVMyVGV4dHVyZSBhcmUgc29tZSBzaW1wbGUgT3BlbkdMRVMyIGhlbHBlciBj
bGFzc2VzCisgICAgICAgIGZvciBtYW5hZ2luZyBzdGF0ZSwgc2FtcGxlcnMgYW5kIHRleHR1cmVz
LgorCisgICAgICAgIFdoZW4gdGhpcyBpcyBob29rZWQgdXAsIGl0IHdpbGwgYmUgY292ZXJlZCBi
eSBtYW55IGxheW91dCB0ZXN0cy4KKworICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAg
QWRkIG5ldyBmaWxlcyB0byBjaHJvbWl1bSBidWlsZCAoY29udGVudHMgYXJlIHByb3RlY3RlZCBi
eSAjaWYncyBmb3Igbm93KS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9H
TEVTMkNhbnZhcy5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6YWZmaW5lVG8zeDMpOgor
ICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OlN0YXRlOjpTdGF0ZSk6CisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMkNhbnZhczo6R0xFUzJDYW52YXMpOgorICAgICAgICAoV2ViQ29yZTo6R0xF
UzJDYW52YXM6On5HTEVTMkNhbnZhcyk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6
Y2xlYXJSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpmaWxsUmVjdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6c2V0RmlsbENvbG9yKToKKyAgICAgICAgKFdl
YkNvcmU6OkdMRVMyQ2FudmFzOjpzZXRBbHBoYSk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMkNh
bnZhczo6dHJhbnNsYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpyb3RhdGUp
OgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OnNjYWxlKToKKyAgICAgICAgKFdlYkNv
cmU6OkdMRVMyQ2FudmFzOjpjb25jYXRDVE0pOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52
YXM6OnNhdmUpOgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OnJlc3RvcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OmRyYXdUZXh0dXJlZFJlY3QpOgorICAgICAgICAo
V2ViQ29yZTo6R0xFUzJDYW52YXM6OnNldENvbXBvc2l0ZU9wZXJhdGlvbik6CisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMkNhbnZhczo6YXBwbHlDb21wb3NpdGVPcGVyYXRvcik6CisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMkNhbnZhczo6Z2V0UXVhZFZlcnRpY2VzKToKKyAgICAgICAgKFdlYkNvcmU6
OkdMRVMyQ2FudmFzOjpnZXRRdWFkSW5kaWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpsb2FkU2hh
ZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpnZXRTaW1wbGVQcm9ncmFtKToK
KyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpnZXRUZXhQcm9ncmFtKToKKyAgICAgICAg
KFdlYkNvcmU6OkdMRVMyQ2FudmFzOjpjcmVhdGVUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6
OkdMRVMyQ2FudmFzOjpnZXRUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkdMRVMyQ2FudmFz
OjpjaGVja0dMRXJyb3IpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dM
RVMyQ2FudmFzLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OmdsZXMy
Q29udGV4dCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJUZXh0
dXJlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6OkdMRVMyVGV4
dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6On5HTEVTMlRleHR1cmUpOgor
ICAgICAgICAoV2ViQ29yZTo6R0xFUzJUZXh0dXJlOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29y
ZTo6Y29udmVydEZvcm1hdCk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6OmxvYWQp
OgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJUZXh0dXJlOjpiaW5kKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMlRleHR1cmUuaDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMlRleHR1cmU6Oik6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6
OmZvcm1hdCk6CisgICAgICAgIChXZWJDb3JlOjpHTEVTMlRleHR1cmU6OndpZHRoKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdMRVMyVGV4dHVyZTo6aGVpZ2h0KToKKworCiAyMDEwLTA3LTIzICBQYXRy
aWNrIEdhbnN0ZXJlciAgPHBhcm9nYUBwYXJvZ2EuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IEFkYW0gUm9iZW4uCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gNjM5OTYpCisrKyBXZWJDb3JlL1dlYkNvcmUu
Z3lwaQkod29ya2luZyBjb3B5KQpAQCAtMjE4Miw2ICsyMTgyLDEwIEBACiAgICAgICAgICAgICAn
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFBsYXRmb3JtRGF0YUxpbnV4LmgnLAogICAg
ICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRVdGlsc0Nocm9taXVtV2lu
LmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFV0aWxz
Q2hyb21pdW1XaW4uaCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
R0xFUzJDYW52YXMuY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9HTEVTMkNhbnZhcy5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9HTEVTMlRleHR1cmUuY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9HTEVTMlRleHR1cmUuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vR2x5cGhQYWdlVHJlZU5vZGVDaHJvbWl1bVdpbi5jcHAnLAogICAgICAgICAgICAgJ3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dseXBoUGFnZVRyZWVOb2RlTGludXguY3BwJywKICAg
ICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21p
dW0uY3BwJywKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJD
YW52YXMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vR0xFUzJDYW52YXMuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9HTEVTMkNhbnZhcy5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTI0
IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoK
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAor
ICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShHTEVTMl9SRU5ERVJJTkcpCisKKyNp
bmNsdWRlICJHTEVTMkNhbnZhcy5oIgorCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVk
ZSAiR0xFUzJDb250ZXh0LmgiCisjaW5jbHVkZSAiR0xFUzJUZXh0dXJlLmgiCisKKyNpbmNsdWRl
IDxHTEVTMi9nbDIuaD4KKworI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUworI2luY2x1ZGUgPG1h
dGguaD4KKworI2luY2x1ZGUgPHd0Zi9Pd25BcnJheVB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZmZpbmVUbzN4Myhjb25zdCBBZmZpbmVUcmFuc2Zv
cm0mIHRyYW5zZm9ybSwgR0xmbG9hdCBtYXRbOV0pCit7CisgICAgbWF0WzBdID0gdHJhbnNmb3Jt
LmEoKTsKKyAgICBtYXRbMV0gPSB0cmFuc2Zvcm0uYigpOworICAgIG1hdFsyXSA9IDAuMGY7Cisg
ICAgbWF0WzNdID0gdHJhbnNmb3JtLmMoKTsKKyAgICBtYXRbNF0gPSB0cmFuc2Zvcm0uZCgpOwor
ICAgIG1hdFs1XSA9IDAuMGY7CisgICAgbWF0WzZdID0gdHJhbnNmb3JtLmUoKTsKKyAgICBtYXRb
N10gPSB0cmFuc2Zvcm0uZigpOworICAgIG1hdFs4XSA9IDEuMGY7Cit9CisKK3N0cnVjdCBHTEVT
MkNhbnZhczo6U3RhdGUgeworICAgIFN0YXRlKCkKKyAgICAgICAgOiBtX2ZpbGxDb2xvcigwLCAw
LCAwLCAyNTUpCisgICAgICAgICwgbV9hbHBoYSgxLjBmKQorICAgICAgICAsIG1fY29tcG9zaXRl
T3AoQ29tcG9zaXRlU291cmNlT3ZlcikKKyAgICB7CisgICAgfQorICAgIENvbG9yIG1fZmlsbENv
bG9yOworICAgIGZsb2F0IG1fYWxwaGE7CisgICAgQ29tcG9zaXRlT3BlcmF0b3IgbV9jb21wb3Np
dGVPcDsKKyAgICBBZmZpbmVUcmFuc2Zvcm0gbV9jdG07Cit9OworCitHTEVTMkNhbnZhczo6R0xF
UzJDYW52YXMoR0xFUzJDb250ZXh0KiBjb250ZXh0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCisg
ICAgOiBtX2dsZXMyQ29udGV4dChjb250ZXh0KQorICAgICwgbV9xdWFkVmVydGljZXMoMCkKKyAg
ICAsIG1fcXVhZEluZGljZXMoMCkKKyAgICAsIG1fc2ltcGxlUHJvZ3JhbSgwKQorICAgICwgbV90
ZXhQcm9ncmFtKDApCisgICAgLCBtX3NpbXBsZU1hdHJpeExvY2F0aW9uKC0xKQorICAgICwgbV9z
aW1wbGVDb2xvckxvY2F0aW9uKC0xKQorICAgICwgbV9zaW1wbGVQb3NpdGlvbkxvY2F0aW9uKC0x
KQorICAgICwgbV90ZXhNYXRyaXhMb2NhdGlvbigtMSkKKyAgICAsIG1fdGV4VGV4TWF0cml4TG9j
YXRpb24oLTEpCisgICAgLCBtX3RleFNhbXBsZXJMb2NhdGlvbigtMSkKKyAgICAsIG1fdGV4QWxw
aGFMb2NhdGlvbigtMSkKKyAgICAsIG1fdGV4UG9zaXRpb25Mb2NhdGlvbigtMSkKKyAgICAsIG1f
d2lkdGgod2lkdGgpCisgICAgLCBtX2hlaWdodChoZWlnaHQpCisgICAgLCBtX3N0YXRlKDApCit7
CisgICAgbV9mbGlwTWF0cml4LnRyYW5zbGF0ZSgtMS4wZiwgMS4wZik7CisgICAgbV9mbGlwTWF0
cml4LnNjYWxlKDIuMGYgLyB3aWR0aCwgLTIuMGYgLyBoZWlnaHQpOworCisgICAgbV9nbGVzMkNv
bnRleHQtPm1ha2VDdXJyZW50KCk7CisgICAgbV9nbGVzMkNvbnRleHQtPnJlc2l6ZU9mZnNjcmVl
bkNvbnRlbnQoSW50U2l6ZSh3aWR0aCwgaGVpZ2h0KSk7CisgICAgbV9nbGVzMkNvbnRleHQtPnN3
YXBCdWZmZXJzKCk7CisgICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKworICAg
IG1fc3RhdGVTdGFjay5hcHBlbmQoU3RhdGUoKSk7CisgICAgbV9zdGF0ZSA9ICZtX3N0YXRlU3Rh
Y2subGFzdCgpOworfQorCitHTEVTMkNhbnZhczo6fkdMRVMyQ2FudmFzKCkKK3sKKyAgICBtX2ds
ZXMyQ29udGV4dC0+bWFrZUN1cnJlbnQoKTsKKyAgICBpZiAobV9zaW1wbGVQcm9ncmFtKQorICAg
ICAgICBnbERlbGV0ZVByb2dyYW0obV9zaW1wbGVQcm9ncmFtKTsKKyAgICBpZiAobV90ZXhQcm9n
cmFtKQorICAgICAgICBnbERlbGV0ZVByb2dyYW0obV90ZXhQcm9ncmFtKTsKKyAgICBpZiAobV9x
dWFkVmVydGljZXMpCisgICAgICAgIGdsRGVsZXRlQnVmZmVycygxLCAmbV9xdWFkVmVydGljZXMp
OworICAgIGlmIChtX3F1YWRJbmRpY2VzKQorICAgICAgICBnbERlbGV0ZUJ1ZmZlcnMoMSwgJm1f
cXVhZFZlcnRpY2VzKTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6Y2xlYXJSZWN0KGNvbnN0IEZs
b2F0UmVjdCYgcmVjdCkKK3sKKyAgICBtX2dsZXMyQ29udGV4dC0+bWFrZUN1cnJlbnQoKTsKKwor
ICAgIGdsU2Npc3NvcihyZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWln
aHQoKSk7CisgICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKKyAgICBnbENsZWFyKEdMX0NP
TE9SX0JVRkZFUl9CSVQpOworICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworfQorCit2
b2lkIEdMRVMyQ2FudmFzOjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENv
bG9yJiBjb2xvciwgQ29sb3JTcGFjZSBjb2xvclNwYWNlKQoreworICAgIG1fZ2xlczJDb250ZXh0
LT5tYWtlQ3VycmVudCgpOworCisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgZ2V0
UXVhZFZlcnRpY2VzKCkpOworICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZF
UiwgZ2V0UXVhZEluZGljZXMoKSk7CisKKyAgICBmbG9hdCByZ2JhWzRdOworICAgIGNvbG9yLmdl
dFJHQkEocmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXSwgcmdiYVszXSk7CisgICAgZ2xVbmlmb3Jt
NGYobV9zaW1wbGVDb2xvckxvY2F0aW9uLCByZ2JhWzBdICogcmdiYVszXSwgcmdiYVsxXSAqIHJn
YmFbM10sIHJnYmFbMl0gKiByZ2JhWzNdLCByZ2JhWzNdKTsKKworICAgIGdsRHJhd0VsZW1lbnRz
KEdMX1RSSUFOR0xFUywgNiwgR0xfVU5TSUdORURfU0hPUlQsIDApOworfQorCit2b2lkIEdMRVMy
Q2FudmFzOjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgbV9nbGVzMkNv
bnRleHQtPm1ha2VDdXJyZW50KCk7CisKKyAgICBhcHBseUNvbXBvc2l0ZU9wZXJhdG9yKG1fc3Rh
dGUtPm1fY29tcG9zaXRlT3ApOworCisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwg
Z2V0UXVhZFZlcnRpY2VzKCkpOworICAgIGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JV
RkZFUiwgZ2V0UXVhZEluZGljZXMoKSk7CisKKyAgICBnbFVzZVByb2dyYW0oZ2V0U2ltcGxlUHJv
Z3JhbSgpKTsKKworICAgIGZsb2F0IHJnYmFbNF07CisgICAgbV9zdGF0ZS0+bV9maWxsQ29sb3Iu
Z2V0UkdCQShyZ2JhWzBdLCByZ2JhWzFdLCByZ2JhWzJdLCByZ2JhWzNdKTsKKyAgICBnbFVuaWZv
cm00ZihtX3NpbXBsZUNvbG9yTG9jYXRpb24sIHJnYmFbMF0gKiByZ2JhWzNdLCByZ2JhWzFdICog
cmdiYVszXSwgcmdiYVsyXSAqIHJnYmFbM10sIHJnYmFbM10pOworCisgICAgQWZmaW5lVHJhbnNm
b3JtIG1hdHJpeChtX2ZsaXBNYXRyaXgpOworICAgIG1hdHJpeC5tdWx0TGVmdChtX3N0YXRlLT5t
X2N0bSk7CisgICAgbWF0cml4LnRyYW5zbGF0ZShyZWN0LngoKSwgcmVjdC55KCkpOworICAgIG1h
dHJpeC5zY2FsZShyZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgIEdMZmxvYXQgbWF0
WzldOworICAgIGFmZmluZVRvM3gzKG1hdHJpeCwgbWF0KTsKKyAgICBnbFVuaWZvcm1NYXRyaXgz
ZnYobV9zaW1wbGVNYXRyaXhMb2NhdGlvbiwgMSwgR0xfRkFMU0UsIG1hdCk7CisKKyAgICBnbFZl
cnRleEF0dHJpYlBvaW50ZXIobV9zaW1wbGVQb3NpdGlvbkxvY2F0aW9uLCAzLCBHTF9GTE9BVCwg
R0xfRkFMU0UsIDAsIChHTHZvaWQqKSgwKSk7CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFy
cmF5KG1fc2ltcGxlUG9zaXRpb25Mb2NhdGlvbik7CisKKyAgICBnbERyYXdFbGVtZW50cyhHTF9U
UklBTkdMRVMsIDYsIEdMX1VOU0lHTkVEX1NIT1JULCAwKTsKK30KKwordm9pZCBHTEVTMkNhbnZh
czo6c2V0RmlsbENvbG9yKGNvbnN0IENvbG9yJiBjb2xvciwgQ29sb3JTcGFjZSBjb2xvclNwYWNl
KQoreworICAgIG1fc3RhdGUtPm1fZmlsbENvbG9yID0gY29sb3I7Cit9CisKK3ZvaWQgR0xFUzJD
YW52YXM6OnNldEFscGhhKGZsb2F0IGFscGhhKQoreworICAgIG1fc3RhdGUtPm1fYWxwaGEgPSBh
bHBoYTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6dHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHkp
Cit7CisgICAgbV9zdGF0ZS0+bV9jdG0udHJhbnNsYXRlKHgsIHkpOworfQorCit2b2lkIEdMRVMy
Q2FudmFzOjpyb3RhdGUoZmxvYXQgYW5nbGVJblJhZGlhbnMpCit7CisgICAgbV9zdGF0ZS0+bV9j
dG0ucm90YXRlKGFuZ2xlSW5SYWRpYW5zICogKDE4MC4wZiAvIE1fUEkpKTsKK30KKwordm9pZCBH
TEVTMkNhbnZhczo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIG1fc3RhdGUt
Pm1fY3RtLnNjYWxlKHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7Cit9CisKK3ZvaWQgR0xF
UzJDYW52YXM6OmNvbmNhdENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIGFmZmluZSkKK3sKKyAg
ICBtX3N0YXRlLT5tX2N0bS5tdWx0TGVmdChhZmZpbmUpOworfQorCit2b2lkIEdMRVMyQ2FudmFz
OjpzYXZlKCkKK3sKKyAgICBtX3N0YXRlU3RhY2suYXBwZW5kKFN0YXRlKG1fc3RhdGVTdGFjay5s
YXN0KCkpKTsKKyAgICBtX3N0YXRlID0gJm1fc3RhdGVTdGFjay5sYXN0KCk7Cit9CisKK3ZvaWQg
R0xFUzJDYW52YXM6OnJlc3RvcmUoKQoreworICAgIG1fc3RhdGVTdGFjay5yZW1vdmVMYXN0KCk7
CisgICAgbV9zdGF0ZSA9ICZtX3N0YXRlU3RhY2subGFzdCgpOworfQorCit2b2lkIEdMRVMyQ2Fu
dmFzOjpkcmF3VGV4dHVyZWRSZWN0KEdMRVMyVGV4dHVyZSogdGV4dHVyZSwgY29uc3QgRmxvYXRS
ZWN0JiBzcmNSZWN0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIENvbG9yU3BhY2UgY29sb3JT
cGFjZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3ApCit7CisgICAgZHJhd1RleHR1cmVk
UmVjdCh0ZXh0dXJlLCBzcmNSZWN0LCBkc3RSZWN0LCBtX3N0YXRlLT5tX2N0bSwgbV9zdGF0ZS0+
bV9hbHBoYSwgY29sb3JTcGFjZSwgY29tcG9zaXRlT3ApOworfQorCit2b2lkIEdMRVMyQ2FudmFz
OjpkcmF3VGV4dHVyZWRSZWN0KEdMRVMyVGV4dHVyZSogdGV4dHVyZSwgY29uc3QgRmxvYXRSZWN0
JiBzcmNSZWN0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9y
bSYgdHJhbnNmb3JtLCBmbG9hdCBhbHBoYSwgQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBDb21wb3Np
dGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3sKKyAgICBtX2dsZXMyQ29udGV4dC0+bWFrZUN1cnJl
bnQoKTsKKworICAgIGFwcGx5Q29tcG9zaXRlT3BlcmF0b3IoY29tcG9zaXRlT3ApOworCisgICAg
Z2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgZ2V0UXVhZFZlcnRpY2VzKCkpOworICAgIGds
QmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZ2V0UXVhZEluZGljZXMoKSk7Cisg
ICAgY2hlY2tHTEVycm9yKCJnbEJpbmRCdWZmZXIiKTsKKworICAgIGdsVXNlUHJvZ3JhbShnZXRU
ZXhQcm9ncmFtKCkpOworICAgIGNoZWNrR0xFcnJvcigiZ2xVc2VQcm9ncmFtIik7CisKKyAgICBn
bEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIHRleHR1cmUtPmJpbmQoKTsKKworICAg
IGdsVW5pZm9ybTFpKG1fdGV4U2FtcGxlckxvY2F0aW9uLCAwKTsKKyAgICBjaGVja0dMRXJyb3Io
ImdsVW5pZm9ybTFpIik7CisKKyAgICBnbFVuaWZvcm0xZihtX3RleEFscGhhTG9jYXRpb24sIGFs
cGhhKTsKKyAgICBjaGVja0dMRXJyb3IoImdsVW5pZm9ybTFmIGZvciBhbHBoYSIpOworCisgICAg
QWZmaW5lVHJhbnNmb3JtIG1hdHJpeChtX2ZsaXBNYXRyaXgpOworICAgIG1hdHJpeC5tdWx0TGVm
dCh0cmFuc2Zvcm0pOworICAgIG1hdHJpeC50cmFuc2xhdGUoZHN0UmVjdC54KCksIGRzdFJlY3Qu
eSgpKTsKKyAgICBtYXRyaXguc2NhbGUoZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgp
KTsKKyAgICBHTGZsb2F0IG1hdFs5XTsKKyAgICBhZmZpbmVUbzN4MyhtYXRyaXgsIG1hdCk7Cisg
ICAgZ2xVbmlmb3JtTWF0cml4M2Z2KG1fdGV4TWF0cml4TG9jYXRpb24sIDEsIEdMX0ZBTFNFLCBt
YXQpOworICAgIGNoZWNrR0xFcnJvcigiZ2xVbmlmb3JtTWF0cml4M2Z2Iik7CisKKyAgICBBZmZp
bmVUcmFuc2Zvcm0gdGV4TWF0cml4OworICAgIHRleE1hdHJpeC5zY2FsZSgxLjBmIC8gdGV4dHVy
ZS0+d2lkdGgoKSwgMS4wZiAvIHRleHR1cmUtPmhlaWdodCgpKTsKKyAgICB0ZXhNYXRyaXgudHJh
bnNsYXRlKHNyY1JlY3QueCgpLCBzcmNSZWN0LnkoKSk7CisgICAgdGV4TWF0cml4LnNjYWxlKHNy
Y1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWlnaHQoKSk7CisgICAgR0xmbG9hdCB0ZXhNYXRbOV07
CisgICAgYWZmaW5lVG8zeDModGV4TWF0cml4LCB0ZXhNYXQpOworICAgIGdsVW5pZm9ybU1hdHJp
eDNmdihtX3RleFRleE1hdHJpeExvY2F0aW9uLCAxLCBHTF9GQUxTRSwgdGV4TWF0KTsKKyAgICBj
aGVja0dMRXJyb3IoImdsVW5pZm9ybU1hdHJpeDNmdiIpOworCisgICAgZ2xWZXJ0ZXhBdHRyaWJQ
b2ludGVyKG1fdGV4UG9zaXRpb25Mb2NhdGlvbiwgMywgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCAo
R0x2b2lkKikoMCkpOworCisgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtX3RleFBvc2l0
aW9uTG9jYXRpb24pOworCisgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCA2LCBHTF9V
TlNJR05FRF9TSE9SVCwgMCk7CisgICAgY2hlY2tHTEVycm9yKCJnbERyYXdFbGVtZW50cyIpOwor
fQorCit2b2lkIEdMRVMyQ2FudmFzOjpzZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRlT3Bl
cmF0b3Igb3ApCit7CisgICAgbV9zdGF0ZS0+bV9jb21wb3NpdGVPcCA9IG9wOworfQorCit2b2lk
IEdMRVMyQ2FudmFzOjphcHBseUNvbXBvc2l0ZU9wZXJhdG9yKENvbXBvc2l0ZU9wZXJhdG9yIG9w
KQoreworICAgIGlmIChvcCA9PSBtX2xhc3RDb21wb3NpdGVPcCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgQ29tcG9zaXRlQ2xlYXI6CisgICAgICAgIGds
RW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMoR0xfWkVSTywgR0xfWkVSTyk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29tcG9zaXRlQ29weToKKyAgICAgICAgZ2xEaXNh
YmxlKEdMX0JMRU5EKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VP
dmVyOgorICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKEdM
X09ORSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
Q29tcG9zaXRlU291cmNlSW46CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAg
Z2xCbGVuZEZ1bmMoR0xfRFNUX0FMUEhBLCBHTF9aRVJPKTsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBDb21wb3NpdGVTb3VyY2VPdXQ6CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAg
ICAgICAgZ2xCbGVuZEZ1bmMoR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgR0xfWkVSTyk7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgQ29tcG9zaXRlU291cmNlQXRvcDoKKyAgICAgICAgZ2xFbmFi
bGUoR0xfQkxFTkQpOworICAgICAgICBnbEJsZW5kRnVuYyhHTF9EU1RfQUxQSEEsIEdMX09ORV9N
SU5VU19TUkNfQUxQSEEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBvc2l0ZURlc3Rp
bmF0aW9uT3ZlcjoKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICBnbEJsZW5k
RnVuYyhHTF9PTkVfTUlOVVNfRFNUX0FMUEhBLCBHTF9PTkUpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIENvbXBvc2l0ZURlc3RpbmF0aW9uSW46CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5E
KTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMoR0xfWkVSTywgR0xfU1JDX0FMUEhBKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk91dDoKKyAgICAgICAgZ2xFbmFi
bGUoR0xfQkxFTkQpOworICAgICAgICBnbEJsZW5kRnVuYyhHTF9aRVJPLCBHTF9PTkVfTUlOVVNf
U1JDX0FMUEhBKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlv
bkF0b3A6CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMo
R0xfT05FX01JTlVTX0RTVF9BTFBIQSwgR0xfU1JDX0FMUEhBKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBDb21wb3NpdGVYT1I6CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAg
ICAgZ2xCbGVuZEZ1bmMoR0xfT05FX01JTlVTX0RTVF9BTFBIQSwgR0xfT05FX01JTlVTX1NSQ19B
TFBIQSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29tcG9zaXRlUGx1c0RhcmtlcjoKKyAg
ICBjYXNlIENvbXBvc2l0ZUhpZ2hsaWdodDoKKyAgICAgICAgLy8gdW5zdXBwb3J0ZWQKKyAgICAg
ICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb21wb3Np
dGVQbHVzTGlnaHRlcjoKKyAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOworICAgICAgICBnbEJs
ZW5kRnVuYyhHTF9PTkUsIEdMX09ORSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX2xh
c3RDb21wb3NpdGVPcCA9IG9wOworfQorCit1bnNpZ25lZCBHTEVTMkNhbnZhczo6Z2V0UXVhZFZl
cnRpY2VzKCkKK3sKKyAgICBpZiAoIW1fcXVhZFZlcnRpY2VzKSB7CisgICAgICAgIEdMZmxvYXQg
dmVydGljZXNbXSA9IHsgMC4wZiwgMC4wZiwgMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAxLjBmLCAwLjBmLCAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IDEuMGYsIDEuMGYsIDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwg
MS4wZiwgMS4wZiB9OworICAgICAgICBnbEdlbkJ1ZmZlcnMoMSwgJm1fcXVhZFZlcnRpY2VzKTsK
KyAgICAgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbV9xdWFkVmVydGljZXMpOwor
ICAgICAgICBnbEJ1ZmZlckRhdGEoR0xfQVJSQVlfQlVGRkVSLCBzaXplb2YodmVydGljZXMpLCB2
ZXJ0aWNlcywgR0xfU1RBVElDX0RSQVcpOworICAgIH0KKyAgICByZXR1cm4gbV9xdWFkVmVydGlj
ZXM7Cit9CisKKwordW5zaWduZWQgR0xFUzJDYW52YXM6OmdldFF1YWRJbmRpY2VzKCkKK3sKKyAg
ICBpZiAoIW1fcXVhZEluZGljZXMpIHsKKyAgICAgICAgR0x1c2hvcnQgaW5kaWNlc1tdID0geyAw
LCAxLCAyLCAwLCAyLCAzfTsKKworICAgICAgICBnbEdlbkJ1ZmZlcnMoMSwgJm1fcXVhZEluZGlj
ZXMpOworICAgICAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1fcXVh
ZEluZGljZXMpOworICAgICAgICBnbEJ1ZmZlckRhdGEoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIs
IHNpemVvZihpbmRpY2VzKSwgaW5kaWNlcywgR0xfU1RBVElDX0RSQVcpOworICAgIH0KKyAgICBy
ZXR1cm4gbV9xdWFkSW5kaWNlczsKK30KKworc3RhdGljIEdMdWludCBsb2FkU2hhZGVyKEdMZW51
bSB0eXBlLCBjb25zdCBjaGFyKiBzaGFkZXJTb3VyY2UpCit7CisgICAgR0x1aW50IHNoYWRlciA9
IGdsQ3JlYXRlU2hhZGVyKHR5cGUpOworICAgIGlmICghc2hhZGVyKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwgJnNoYWRlclNvdXJjZSwgMCk7Cisg
ICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7CisgICAgR0xpbnQgY29tcGlsZVN0YXR1czsKKyAg
ICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZjb21waWxlU3RhdHVz
KTsKKyAgICBpZiAoIWNvbXBpbGVTdGF0dXMpIHsKKyAgICAgICAgaW50IGxlbmd0aDsKKyAgICAg
ICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7Cisg
ICAgICAgIE93bkFycmF5UHRyPGNoYXI+IGxvZyhuZXcgY2hhcltsZW5ndGhdKTsKKyAgICAgICAg
Z2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgbGVuZ3RoLCAwLCBsb2cuZ2V0KCkpOworICAgICAg
ICBMT0dfRVJST1IobG9nLmdldCgpKTsKKyAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBzaGFkZXI7Cit9CisKK3Vuc2ln
bmVkIEdMRVMyQ2FudmFzOjpnZXRTaW1wbGVQcm9ncmFtKCkKK3sKKyAgICBpZiAoIW1fc2ltcGxl
UHJvZ3JhbSkgeworICAgICAgICBHTHVpbnQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTF9W
RVJURVhfU0hBREVSLAorICAgICAgICAgICAgInVuaWZvcm0gbWF0MyBtYXRyaXg7XG4iCisgICAg
ICAgICAgICAidW5pZm9ybSB2ZWM0IGNvbG9yO1xuIgorICAgICAgICAgICAgImF0dHJpYnV0ZSB2
ZWMzIHBvc2l0aW9uO1xuIgorICAgICAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAgICAg
ICAgICIgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdHJpeCAqIHBvc2l0aW9uLCAxLjApO1xuIgor
ICAgICAgICAgICAgIn1cbiIpOworICAgICAgICBpZiAoIXZlcnRleFNoYWRlcikKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICBHTHVpbnQgZnJhZ21lbnRTaGFkZXIgPSBsb2FkU2hhZGVy
KEdMX0ZSQUdNRU5UX1NIQURFUiwKKyAgICAgICAgICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9h
dDtcbiIKKyAgICAgICAgICAgICJ1bmlmb3JtIG1hdDMgbWF0cml4O1xuIgorICAgICAgICAgICAg
InVuaWZvcm0gdmVjNCBjb2xvcjtcbiIKKyAgICAgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisg
ICAgICAgICAgICAiICAgIGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xuIgorICAgICAgICAgICAgIn1c
biIpOworICAgICAgICBpZiAoIWZyYWdtZW50U2hhZGVyKQorICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIG1fc2ltcGxlUHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICAgICAgICBp
ZiAoIW1fc2ltcGxlUHJvZ3JhbSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBnbEF0
dGFjaFNoYWRlcihtX3NpbXBsZVByb2dyYW0sIHZlcnRleFNoYWRlcik7CisgICAgICAgIGdsQXR0
YWNoU2hhZGVyKG1fc2ltcGxlUHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOworICAgICAgICBnbExp
bmtQcm9ncmFtKG1fc2ltcGxlUHJvZ3JhbSk7CisgICAgICAgIEdMaW50IGxpbmtTdGF0dXM7Cisg
ICAgICAgIGdsR2V0UHJvZ3JhbWl2KG1fc2ltcGxlUHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZs
aW5rU3RhdHVzKTsKKyAgICAgICAgaWYgKCFsaW5rU3RhdHVzKSB7CisgICAgICAgICAgICBnbERl
bGV0ZVByb2dyYW0obV9zaW1wbGVQcm9ncmFtKTsKKyAgICAgICAgICAgIG1fc2ltcGxlUHJvZ3Jh
bSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZ2xEZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsK
KyAgICAgICAgZ2xEZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpOworICAgICAgICBtX3NpbXBs
ZVBvc2l0aW9uTG9jYXRpb24gPSBnbEdldEF0dHJpYkxvY2F0aW9uKG1fc2ltcGxlUHJvZ3JhbSwg
InBvc2l0aW9uIik7CisgICAgICAgIG1fc2ltcGxlTWF0cml4TG9jYXRpb24gPSBnbEdldFVuaWZv
cm1Mb2NhdGlvbihtX3NpbXBsZVByb2dyYW0sICJtYXRyaXgiKTsKKyAgICAgICAgbV9zaW1wbGVD
b2xvckxvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV9zaW1wbGVQcm9ncmFtLCAiY29s
b3IiKTsKKyAgICB9CisgICAgcmV0dXJuIG1fc2ltcGxlUHJvZ3JhbTsKK30KKwordW5zaWduZWQg
R0xFUzJDYW52YXM6OmdldFRleFByb2dyYW0oKQoreworICAgIGlmICghbV90ZXhQcm9ncmFtKSB7
CisgICAgICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFE
RVIsCisgICAgICAgICAgICAidW5pZm9ybSBtYXQzIG1hdHJpeDtcbiIKKyAgICAgICAgICAgICJ1
bmlmb3JtIG1hdDMgdGV4TWF0cml4O1xuIgorICAgICAgICAgICAgImF0dHJpYnV0ZSB2ZWMzIHBv
c2l0aW9uO1xuIgorICAgICAgICAgICAgInZhcnlpbmcgdmVjMyB0ZXhDb29yZDtcbiIKKyAgICAg
ICAgICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICAgICAiICAgIHRleENvb3JkID0gdGV4
TWF0cml4ICogcG9zaXRpb247XG4iCisgICAgICAgICAgICAiICAgIGdsX1Bvc2l0aW9uID0gdmVj
NChtYXRyaXggKiBwb3NpdGlvbiwgMS4wKTtcbiIKKyAgICAgICAgICAgICJ9XG4iKTsKKyAgICAg
ICAgaWYgKCF2ZXJ0ZXhTaGFkZXIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgR0x1
aW50IGZyYWdtZW50U2hhZGVyID0gbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsCisgICAg
ICAgICAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCisgICAgICAgICAgICAidW5pZm9y
bSBzYW1wbGVyMkQgc2FtcGxlcjtcbiIKKyAgICAgICAgICAgICJ1bmlmb3JtIGZsb2F0IGFscGhh
O1xuIgorICAgICAgICAgICAgInZhcnlpbmcgdmVjMyB0ZXhDb29yZDtcbiIKKyAgICAgICAgICAg
ICJ2b2lkIG1haW4oKSB7XG4iCisgICAgICAgICAgICAiICAgIGdsX0ZyYWdDb2xvciA9IHRleHR1
cmUyRChzYW1wbGVyLCB0ZXhDb29yZC54eSkqIHZlYzQoYWxwaGEpO1xuIgorICAgICAgICAgICAg
In1cbiIpOworICAgICAgICBpZiAoIWZyYWdtZW50U2hhZGVyKQorICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIG1fdGV4UHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICAgICAgICBp
ZiAoIW1fdGV4UHJvZ3JhbSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBnbEF0dGFj
aFNoYWRlcihtX3RleFByb2dyYW0sIHZlcnRleFNoYWRlcik7CisgICAgICAgIGdsQXR0YWNoU2hh
ZGVyKG1fdGV4UHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpOworICAgICAgICBnbExpbmtQcm9ncmFt
KG1fdGV4UHJvZ3JhbSk7CisgICAgICAgIEdMaW50IGxpbmtTdGF0dXM7CisgICAgICAgIGdsR2V0
UHJvZ3JhbWl2KG1fdGV4UHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZsaW5rU3RhdHVzKTsKKyAg
ICAgICAgaWYgKCFsaW5rU3RhdHVzKSB7CisgICAgICAgICAgICBnbERlbGV0ZVByb2dyYW0obV90
ZXhQcm9ncmFtKTsKKyAgICAgICAgICAgIG1fdGV4UHJvZ3JhbSA9IDA7CisgICAgICAgIH0KKyAg
ICAgICAgZ2xEZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTsKKyAgICAgICAgZ2xEZWxldGVTaGFk
ZXIoZnJhZ21lbnRTaGFkZXIpOworICAgICAgICBtX3RleE1hdHJpeExvY2F0aW9uID0gZ2xHZXRV
bmlmb3JtTG9jYXRpb24obV90ZXhQcm9ncmFtLCAibWF0cml4Iik7CisgICAgICAgIG1fdGV4U2Ft
cGxlckxvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV90ZXhQcm9ncmFtLCAic2FtcGxl
ciIpOworICAgICAgICBtX3RleFRleE1hdHJpeExvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRp
b24obV90ZXhQcm9ncmFtLCAidGV4TWF0cml4Iik7CisgICAgICAgIG1fdGV4UG9zaXRpb25Mb2Nh
dGlvbiA9IGdsR2V0QXR0cmliTG9jYXRpb24obV90ZXhQcm9ncmFtLCAicG9zaXRpb24iKTsKKyAg
ICAgICAgbV90ZXhBbHBoYUxvY2F0aW9uID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24obV90ZXhQcm9n
cmFtLCAiYWxwaGEiKTsKKyAgICB9CisgICAgcmV0dXJuIG1fdGV4UHJvZ3JhbTsKK30KKworR0xF
UzJUZXh0dXJlKiBHTEVTMkNhbnZhczo6Y3JlYXRlVGV4dHVyZShOYXRpdmVJbWFnZVB0ciBwdHIs
IEdMRVMyVGV4dHVyZTo6Rm9ybWF0IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorewor
ICAgIFBhc3NSZWZQdHI8R0xFUzJUZXh0dXJlPiB0ZXh0dXJlID0gbV90ZXh0dXJlcy5nZXQocHRy
KTsKKyAgICBpZiAodGV4dHVyZSkKKyAgICAgICAgcmV0dXJuIHRleHR1cmUuZ2V0KCk7CisKKyAg
ICB0ZXh0dXJlID0gR0xFUzJUZXh0dXJlOjpjcmVhdGUoZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsK
KyAgICBHTEVTMlRleHR1cmUqIHQgPSB0ZXh0dXJlLmdldCgpOworICAgIG1fdGV4dHVyZXMuc2V0
KHB0ciwgdGV4dHVyZSk7CisgICAgcmV0dXJuIHQ7Cit9CisKK0dMRVMyVGV4dHVyZSogR0xFUzJD
YW52YXM6OmdldFRleHR1cmUoTmF0aXZlSW1hZ2VQdHIgcHRyKQoreworICAgIFBhc3NSZWZQdHI8
R0xFUzJUZXh0dXJlPiB0ZXh0dXJlID0gbV90ZXh0dXJlcy5nZXQocHRyKTsKKyAgICByZXR1cm4g
dGV4dHVyZSA/IHRleHR1cmUuZ2V0KCkgOiAwOworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpjaGVj
a0dMRXJyb3IoY29uc3QgY2hhciogaGVhZGVyKQoreworI2lmbmRlZiBOREVCVUcKKyAgICBHTGVu
dW0gZXJyOworICAgIHdoaWxlICgoZXJyID0gZ2xHZXRFcnJvcigpKSAhPSBHTF9OT19FUlJPUikg
eworICAgICAgICBjb25zdCBjaGFyKiBlcnJvclN0ciA9ICIqKiogVU5LTk9XTiBFUlJPUiAqKioi
OworICAgICAgICBzd2l0Y2ggKGVycikgeworICAgICAgICBjYXNlIEdMX0lOVkFMSURfRU5VTToK
KyAgICAgICAgICAgIGVycm9yU3RyID0gIkdMX0lOVkFMSURfRU5VTSI7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBHTF9JTlZBTElEX1ZBTFVFOgorICAgICAgICAgICAgZXJyb3JT
dHIgPSAiR0xfSU5WQUxJRF9WQUxVRSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBHTF9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgIGVycm9yU3RyID0gIkdMX0lOVkFM
SURfT1BFUkFUSU9OIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX0lOVkFM
SURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OOgorICAgICAgICAgICAgZXJyb3JTdHIgPSAiR0xfSU5W
QUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgR0xfT1VUX09GX01FTU9SWToKKyAgICAgICAgICAgIGVycm9yU3RyID0gIkdMX09VVF9P
Rl9NRU1PUlkiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhl
YWRlcikKKyAgICAgICAgICAgIExPR19FUlJPUigiJXM6ICAlcyIsIGhlYWRlciwgZXJyb3JTdHIp
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBMT0dfRVJST1IoIiVzIiwgZXJyb3JTdHIpOwor
ICAgIH0KKyNlbmRpZgorfQorCit9OworCisjZW5kaWYKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vR0xFUzJDYW52YXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyQ2FudmFzLmgJKHJldmlzaW9uIDApCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyQ2FudmFzLmgJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgR0xFUzJDYW52YXNfaAorI2RlZmluZSBHTEVT
MkNhbnZhc19oCisKKyNpZiBVU0UoR0xFUzJfUkVOREVSSU5HKQorCisjaW5jbHVkZSAiQWZmaW5l
VHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiQ29sb3IuaCIKKyNpbmNsdWRlICJDb2xvclNwYWNlLmgi
CisjaW5jbHVkZSAiR0xFUzJUZXh0dXJlLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NUeXBlcy5oIgor
I2luY2x1ZGUgIkltYWdlU291cmNlLmgiCisKKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2lu
Y2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNz
IEZsb2F0UmVjdDsKK2NsYXNzIENvbG9yOworY2xhc3MgR0xFUzJDb250ZXh0OworCit0eXBlZGVm
IEhhc2hNYXA8TmF0aXZlSW1hZ2VQdHIsIFJlZlB0cjxHTEVTMlRleHR1cmU+ID4gVGV4dHVyZUhh
c2hNYXA7CisKK2NsYXNzIEdMRVMyQ2FudmFzIDogcHVibGljIE5vbmNvcHlhYmxlIHsKK3B1Ymxp
YzoKKyAgICBHTEVTMkNhbnZhcyhHTEVTMkNvbnRleHQqIGNvbnRleHQsIGludCB3aWR0aCwgaW50
IGhlaWdodCk7CisgICAgfkdMRVMyQ2FudmFzKCk7CisKKyAgICB2b2lkIGZpbGxSZWN0KGNvbnN0
IEZsb2F0UmVjdCYsIGNvbnN0IENvbG9yJiwgQ29sb3JTcGFjZSk7CisgICAgdm9pZCBmaWxsUmVj
dChjb25zdCBGbG9hdFJlY3QmKTsKKyAgICB2b2lkIGNsZWFyUmVjdChjb25zdCBGbG9hdFJlY3Qm
KTsKKyAgICB2b2lkIHNldEZpbGxDb2xvcihjb25zdCBDb2xvciYsIENvbG9yU3BhY2UpOworICAg
IHZvaWQgc2V0QWxwaGEoZmxvYXQgYWxwaGEpOworICAgIHZvaWQgc2V0Q29tcG9zaXRlT3BlcmF0
aW9uKENvbXBvc2l0ZU9wZXJhdG9yKTsKKyAgICB2b2lkIHRyYW5zbGF0ZShmbG9hdCB4LCBmbG9h
dCB5KTsKKyAgICB2b2lkIHJvdGF0ZShmbG9hdCBhbmdsZUluUmFkaWFucyk7CisgICAgdm9pZCBz
Y2FsZShjb25zdCBGbG9hdFNpemUmKTsKKyAgICB2b2lkIGNvbmNhdENUTShjb25zdCBBZmZpbmVU
cmFuc2Zvcm0mKTsKKworICAgIHZvaWQgc2F2ZSgpOworICAgIHZvaWQgcmVzdG9yZSgpOworCisg
ICAgLy8gbm9uLXN0YW5kYXJkIGZ1bmN0aW9ucworICAgIC8vIFRoZXNlIGFyZSBub3Qgc3RhbmRh
cmQgR3JhcGhpY3NDb250ZXh0IGZ1bmN0aW9ucywgYW5kIHNob3VsZCBiZSBwdXNoZWQKKyAgICAv
LyBkb3duIGludG8gYSBQbGF0Zm9ybUNvbnRleHRHTEVTMiBhdCBzb21lIHBvaW50LgorICAgIHZv
aWQgZHJhd1RleHR1cmVkUmVjdChHTEVTMlRleHR1cmUqLCBjb25zdCBGbG9hdFJlY3QmIHNyY1Jl
Y3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgZmxv
YXQgYWxwaGEsIENvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yKTsKKyAgICB2b2lkIGRyYXdU
ZXh0dXJlZFJlY3QoR0xFUzJUZXh0dXJlKiwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25z
dCBGbG9hdFJlY3QmIGRzdFJlY3QsIENvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yKTsKKyAg
ICBHTEVTMkNvbnRleHQqIGdsZXMyQ29udGV4dCgpIHsgcmV0dXJuIG1fZ2xlczJDb250ZXh0OyB9
CisgICAgR0xFUzJUZXh0dXJlKiBjcmVhdGVUZXh0dXJlKE5hdGl2ZUltYWdlUHRyLCBHTEVTMlRl
eHR1cmU6OkZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICBHTEVTMlRleHR1cmUq
IGdldFRleHR1cmUoTmF0aXZlSW1hZ2VQdHIpOworCitwcml2YXRlOgorICAgIHZvaWQgYXBwbHlD
b21wb3NpdGVPcGVyYXRvcihDb21wb3NpdGVPcGVyYXRvcik7CisgICAgdm9pZCBjaGVja0dMRXJy
b3IoY29uc3QgY2hhciogaGVhZGVyKTsKKyAgICB1bnNpZ25lZCBnZXRRdWFkVmVydGljZXMoKTsK
KyAgICB1bnNpZ25lZCBnZXRRdWFkSW5kaWNlcygpOworICAgIHVuc2lnbmVkIGdldFNpbXBsZVBy
b2dyYW0oKTsKKyAgICB1bnNpZ25lZCBnZXRUZXhQcm9ncmFtKCk7CisKKyAgICBHTEVTMkNvbnRl
eHQqIG1fZ2xlczJDb250ZXh0OworICAgIHN0cnVjdCBTdGF0ZTsKKyAgICBXVEY6OlZlY3RvcjxT
dGF0ZT4gbV9zdGF0ZVN0YWNrOworICAgIFN0YXRlKiBtX3N0YXRlOworICAgIHVuc2lnbmVkIG1f
cXVhZFZlcnRpY2VzOworICAgIHVuc2lnbmVkIG1fcXVhZEluZGljZXM7CisgICAgdW5zaWduZWQg
bV9zaW1wbGVQcm9ncmFtOworICAgIHVuc2lnbmVkIG1fdGV4UHJvZ3JhbTsKKyAgICBpbnQgbV9z
aW1wbGVNYXRyaXhMb2NhdGlvbjsKKyAgICBpbnQgbV9zaW1wbGVDb2xvckxvY2F0aW9uOworICAg
IGludCBtX3NpbXBsZVBvc2l0aW9uTG9jYXRpb247CisgICAgaW50IG1fdGV4TWF0cml4TG9jYXRp
b247CisgICAgaW50IG1fdGV4VGV4TWF0cml4TG9jYXRpb247CisgICAgaW50IG1fdGV4U2FtcGxl
ckxvY2F0aW9uOworICAgIGludCBtX3RleEFscGhhTG9jYXRpb247CisgICAgaW50IG1fdGV4UG9z
aXRpb25Mb2NhdGlvbjsKKyAgICBpbnQgbV93aWR0aDsKKyAgICBpbnQgbV9oZWlnaHQ7CisgICAg
QWZmaW5lVHJhbnNmb3JtIG1fZmxpcE1hdHJpeDsKKyAgICBUZXh0dXJlSGFzaE1hcCBtX3RleHR1
cmVzOworICAgIENvbXBvc2l0ZU9wZXJhdG9yIG1fbGFzdENvbXBvc2l0ZU9wOyAvLyBUaGlzIGlz
IHRoZSBvbmUgbGFzdCBzZXQsIG5vdCBuZWNlc3NhcmlseSB0aGUgb25lIGluIHRoZSBzdGF0ZSBz
dGFjay4KK307CisKK307CisKKyNlbmRpZgorCisjZW5kaWYgLy8gR0xFUzJDYW52YXNfaApJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMlRleHR1cmUuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJUZXh0
dXJlLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vR0xFUzJUZXh0dXJlLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMjggQEAKKy8qCisg
KiBDb3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICog
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRp
c3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9y
IHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMK
KyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEdMRVMyX1JFTkRFUklORykKKworI2luY2x1ZGUgIkdM
RVMyVGV4dHVyZS5oIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlIDx3dGYv
T3duQXJyYXlQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitHTEVTMlRleHR1cmU6OkdM
RVMyVGV4dHVyZSh1bnNpZ25lZCBpbnQgdGV4dHVyZUlkLCBGb3JtYXQgZm9ybWF0LCBpbnQgd2lk
dGgsIGludCBoZWlnaHQpCisgICAgOiBtX3RleHR1cmVJZCh0ZXh0dXJlSWQpCisgICAgLCBtX2Zv
cm1hdChmb3JtYXQpCisgICAgLCBtX3dpZHRoKHdpZHRoKQorICAgICwgbV9oZWlnaHQoaGVpZ2h0
KQoreworfQorCitHTEVTMlRleHR1cmU6On5HTEVTMlRleHR1cmUoKQoreworICAgIGdsRGVsZXRl
VGV4dHVyZXMoMSwgJm1fdGV4dHVyZUlkKTsKK30KKworUGFzc1JlZlB0cjxHTEVTMlRleHR1cmU+
IEdMRVMyVGV4dHVyZTo6Y3JlYXRlKEZvcm1hdCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdo
dCkKK3sKKyAgICBHTHVpbnQgdGV4dHVyZUlkOworICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1
cmVJZCk7CisgICAgaWYgKCF0ZXh0dXJlSWQpCisgICAgICAgIHJldHVybiAwOworCisgICAgZ2xC
aW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlSWQpOworICAgIGdsVGV4SW1hZ2UyRChH
TF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCB3aWR0aCwgaGVpZ2h0LCAwLCBHTF9SR0JBLCBHTF9V
TlNJR05FRF9CWVRFLCAwKTsKKworICAgIGludCBtYXg7CisgICAgZ2xHZXRJbnRlZ2VydihHTF9N
QVhfVEVYVFVSRV9TSVpFLCAmbWF4KTsKKyAgICBpZiAod2lkdGggPiBtYXggfHwgaGVpZ2h0ID4g
bWF4KQorICAgICAgICBBU1NFUlQoISJ0ZXh0dXJlIHRvbyBiaWciKTsKKworICAgIHJldHVybiBh
ZG9wdFJlZihuZXcgR0xFUzJUZXh0dXJlKHRleHR1cmVJZCwgZm9ybWF0LCB3aWR0aCwgaGVpZ2h0
KSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRGb3JtYXQoR0xFUzJUZXh0dXJlOjpGb3JtYXQg
Zm9ybWF0LCB1bnNpZ25lZCBpbnQqIGdsRm9ybWF0LCB1bnNpZ25lZCBpbnQqIGdsVHlwZSwgYm9v
bCogc3dpenpsZSkKK3sKKyAgICAqc3dpenpsZSA9IGZhbHNlOworICAgIHN3aXRjaCAoZm9ybWF0
KSB7CisgICAgY2FzZSBHTEVTMlRleHR1cmU6OlJHQkE4OgorICAgICAgICAqZ2xGb3JtYXQgPSBH
TF9SR0JBOworICAgICAgICAqZ2xUeXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBHTEVTMlRleHR1cmU6OkJHUkE4OgorLy8gRklYTUU6ICBPbmNlIHdlIGhh
dmUgc3VwcG9ydCBmb3IgZXh0ZW5zaW9ucywgd2Ugc2hvdWxkIGNoZWNrIGZvciBFWFRfdGV4dHVy
ZV9mb3JtYXRfQkdSQTg4ODgsCisvLyBhbmQgdXNlIHRoYXQgaWYgcHJlc2VudC4KKyAgICAgICAg
KmdsRm9ybWF0ID0gR0xfUkdCQTsKKyAgICAgICAgKmdsVHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7
CisgICAgICAgICpzd2l6emxlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgQVNTRVJUKCEiYmFkIGZvcm1hdCIpOworICAgICAgICBicmVhazsKKyAgICB9Cit9
CisKK3ZvaWQgR0xFUzJUZXh0dXJlOjpsb2FkKHZvaWQqIHBpeGVscykKK3sKKyAgICB1bnNpZ25l
ZCBpbnQgZ2xGb3JtYXQsIGdsVHlwZTsKKyAgICBib29sIHN3aXp6bGU7CisgICAgY29udmVydEZv
cm1hdChtX2Zvcm1hdCwgJmdsRm9ybWF0LCAmZ2xUeXBlLCAmc3dpenpsZSk7CisgICAgZ2xCaW5k
VGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3RleHR1cmVJZCk7CisgICAgaWYgKHN3aXp6bGUpIHsK
KyAgICAgICAgQVNTRVJUKGdsRm9ybWF0ID09IEdMX1JHQkEgJiYgZ2xUeXBlID09IEdMX1VOU0lH
TkVEX0JZVEUpOworICAgICAgICAvLyBGSVhNRTogIFRoaXMgY291bGQgdXNlIFBCTydzIHRvIHNh
dmUgZG9pbmcgYW4gZXh0cmEgY29weSBoZXJlLgorICAgICAgICBpbnQgc2l6ZSA9IG1fd2lkdGgg
KiBtX2hlaWdodDsKKyAgICAgICAgdW5zaWduZWQqIHBpeGVsczMyID0gc3RhdGljX2Nhc3Q8dW5z
aWduZWQqPihwaXhlbHMpOworICAgICAgICBPd25BcnJheVB0cjx1bnNpZ25lZD4gYnVmKG5ldyB1
bnNpZ25lZFtzaXplXSk7CisgICAgICAgIHVuc2lnbmVkKiBidWZwdHIgPSBidWYuZ2V0KCk7Cisg
ICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICB1bnNp
Z25lZCBwaXhlbCA9IHBpeGVsczMyW2ldOworICAgICAgICAgICAgYnVmcHRyW2ldID0gcGl4ZWwg
JiAweEZGMDBGRjAwIHwgKChwaXhlbCAmIDB4MDBGRjAwMDApID4+IDE2KSB8ICgocGl4ZWwgJiAw
eDAwMDAwMEZGKSA8PCAxNik7CisgICAgICAgIH0KKyAgICAgICAgZ2xUZXhTdWJJbWFnZTJEKEdM
X1RFWFRVUkVfMkQsIDAsIDAsIDAsIG1fd2lkdGgsIG1faGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBl
LCBidWYuZ2V0KCkpOworICAgIH0gZWxzZQorICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVY
VFVSRV8yRCwgMCwgMCwgMCwgbV93aWR0aCwgbV9oZWlnaHQsIGdsRm9ybWF0LCBnbFR5cGUsIHBp
eGVscyk7Cit9CisKK3ZvaWQgR0xFUzJUZXh0dXJlOjpiaW5kKCkKK3sKKyAgICBnbEJpbmRUZXh0
dXJlKEdMX1RFWFRVUkVfMkQsIG1fdGV4dHVyZUlkKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xf
VEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4
UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVB
Uik7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9T
LCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwg
R0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworfQorCit9OworCisjZW5kaWYK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJUZXh0dXJlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMlRl
eHR1cmUuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vR0xFUzJUZXh0dXJlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3Ry
aWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRo
ZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAq
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBH
TEVTMlRleHR1cmVfaAorI2RlZmluZSBHTEVTMlRleHR1cmVfaAorCisjaWYgVVNFKEdMRVMyX1JF
TkRFUklORykKKworI2luY2x1ZGUgIlJlZkNvdW50ZWQuaCIKKyNpbmNsdWRlICJSZWZQdHIuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBHTEVTMlRleHR1cmUgOiBwdWJsaWMgUmVm
Q291bnRlZDxHTEVTMlRleHR1cmU+IHsKK3B1YmxpYzoKKyAgICB+R0xFUzJUZXh0dXJlKCk7Cisg
ICAgZW51bSBGb3JtYXQgeyBSR0JBOCwgQkdSQTggfTsKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxH
TEVTMlRleHR1cmU+IGNyZWF0ZShGb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAg
dm9pZCBiaW5kKCk7CisgICAgdm9pZCBsb2FkKHZvaWQqIHBpeGVscyk7CisgICAgRm9ybWF0IGZv
cm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1fZm9ybWF0OyB9CisgICAgaW50IHdpZHRoKCkgY29uc3Qg
eyByZXR1cm4gbV93aWR0aDsgfQorICAgIGludCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2hl
aWdodDsgfQorcHJpdmF0ZToKKyAgICBHTEVTMlRleHR1cmUodW5zaWduZWQgaW50IHRleHR1cmVJ
ZCwgRm9ybWF0IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICB1bnNpZ25lZCBp
bnQgbV90ZXh0dXJlSWQ7CisgICAgRm9ybWF0IG1fZm9ybWF0OworICAgIGludCBtX3dpZHRoOwor
ICAgIGludCBtX2hlaWdodDsKK307CisKK307CisKKyNlbmRpZgorCisjZW5kaWYgLy8gR0xFUzJU
ZXh0dXJlX2gK
</data>
<flag name="review"
          id="50735"
          type_id="1"
          status="+"
          setter="fishd"
    />
    <flag name="commit-queue"
          id="50766"
          type_id="3"
          status="-"
          setter="fishd"
    />
          </attachment>
      

    </bug>

</bugzilla>