<?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>23191</bug_id>
          
          <creation_ts>2009-01-08 10:52:04 -0800</creation_ts>
          <short_desc>Add the first pieces of platform/graphics/skia</short_desc>
          <delta_ts>2009-01-08 16:40:18 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</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="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>104903</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-08 10:52:04 -0800</bug_when>
    <thetext>Add the first pieces of platform/graphics/skia

In order to expedite the process of up-streaming, Dimitri and I are pair-programming today.  We&apos;re scrubbing all the platform/graphics/skia files locally, committing them to the Chrome tree, and then posting them here and landing them in the WebKit tree.  I&apos;m not requesting a second review, since I&apos;ve already reviewed them as Dimitri has been typing, but I&apos;m posting the patches here for completeness.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104904</commentid>
    <comment_count>1</comment_count>
      <attachid>26528</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-08 10:56:54 -0800</bug_when>
    <thetext>Created attachment 26528
        Add the first few files from platform/graphics/skia

 WebCore/ChangeLog                                  |   48 ++++
 .../graphics/skia/BitmapImageSingleFrameSkia.h     |   62 +++++
 WebCore/platform/graphics/skia/FloatPointSkia.cpp  |   47 ++++
 WebCore/platform/graphics/skia/FloatRectSkia.cpp   |   46 ++++
 WebCore/platform/graphics/skia/IntPointSkia.cpp    |   50 ++++
 WebCore/platform/graphics/skia/IntRectSkia.cpp     |   54 +++++
 WebCore/platform/graphics/skia/SkiaUtils.cpp       |  240 ++++++++++++++++++++
 WebCore/platform/graphics/skia/SkiaUtils.h         |   64 ++++++
 8 files changed, 611 insertions(+), 0 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104905</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-08 10:59:02 -0800</bug_when>
    <thetext>Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebCore/ChangeLog
	A	WebCore/platform/graphics/skia/BitmapImageSingleFrameSkia.h
	A	WebCore/platform/graphics/skia/FloatPointSkia.cpp
	A	WebCore/platform/graphics/skia/FloatRectSkia.cpp
	A	WebCore/platform/graphics/skia/IntPointSkia.cpp
	A	WebCore/platform/graphics/skia/IntRectSkia.cpp
	A	WebCore/platform/graphics/skia/SkiaUtils.cpp
	A	WebCore/platform/graphics/skia/SkiaUtils.h
Committed r39712
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104909</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-08 11:46:19 -0800</bug_when>
    <thetext>Commit the right set of files the second time!

Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebCore/ChangeLog
	M	WebCore/platform/graphics/skia/BitmapImageSingleFrameSkia.h
	M	WebCore/platform/graphics/skia/FloatPointSkia.cpp
	M	WebCore/platform/graphics/skia/FloatRectSkia.cpp
	M	WebCore/platform/graphics/skia/IntPointSkia.cpp
	M	WebCore/platform/graphics/skia/IntRectSkia.cpp
	M	WebCore/platform/graphics/skia/SkiaUtils.cpp
	M	WebCore/platform/graphics/skia/SkiaUtils.h
Committed r39713</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104928</commentid>
    <comment_count>4</comment_count>
      <attachid>26532</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-08 13:46:05 -0800</bug_when>
    <thetext>Created attachment 26532
Add two more files for platform/graphics/skia.

 WebCore/ChangeLog                                  |   20 +++
 WebCore/platform/graphics/skia/GradientSkia.cpp    |  164 ++++++++++++++++++++
 .../graphics/skia/GraphicsContextPlatformPrivate.h |   55 +++++++
 3 files changed, 239 insertions(+), 0 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104930</commentid>
    <comment_count>5</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-08 13:51:51 -0800</bug_when>
    <thetext>Second round:
Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebCore/ChangeLog
	A	WebCore/platform/graphics/skia/GradientSkia.cpp
	A	WebCore/platform/graphics/skia/GraphicsContextPlatformPrivate.h
Committed r39718

(This time I even committed the right files!)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104933</commentid>
    <comment_count>6</comment_count>
      <attachid>26533</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-08 14:05:43 -0800</bug_when>
    <thetext>Created attachment 26533
Add a cleaned-up GraphicsContextSkia implementation to WebKit

 WebCore/ChangeLog                                  |   61 ++
 .../platform/graphics/skia/GraphicsContextSkia.cpp | 1122 ++++++++++++++++++++
 2 files changed, 1183 insertions(+), 0 deletions(-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104934</commentid>
    <comment_count>7</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-08 14:06:56 -0800</bug_when>
    <thetext>Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebCore/ChangeLog
	A	WebCore/platform/graphics/skia/GraphicsContextSkia.cpp
Committed r39719

I think it&apos;s time to retire this bug.  I&apos;ll open a new one for the next set of upstream changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104964</commentid>
    <comment_count>8</comment_count>
      <attachid>26545</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-08 16:40:18 -0800</bug_when>
    <thetext>Created attachment 26545
Add ImageBufferSkia and ImageSkia files.

2009-01-08  Dimitri Glazkov  &lt;dglazkov@chromium.org&gt;

        Reviewed by Eric Seidel.

        Add ImageBufferSkia and ImageSkia files.
        https://bugs.webkit.org/show_bug.cgi?id=23200
        For now we&apos;ve left BitmapImage and BitmapImageSingleFrameSkia
        implementations in the ImageSkia file (like ImageCG has), but
        we intend to break them out into their own files.

        * platform/graphics/skia/ImageBufferSkia.cpp: Added.
        (WebCore::ImageBufferData::ImageBufferData):
        (WebCore::ImageBuffer::ImageBuffer):
        (WebCore::ImageBuffer::~ImageBuffer):
        (WebCore::ImageBuffer::context):
        (WebCore::ImageBuffer::image):
        (WebCore::ImageBuffer::getImageData):
        (WebCore::ImageBuffer::putImageData):
        (WebCore::ImageBuffer::toDataURL):
        * platform/graphics/skia/ImageSkia.cpp: Added.
        (WebCore::):
        (WebCore::FrameData::clear):
        (WebCore::Image::loadPlatformResource):
        (WebCore::Image::drawPattern):
        (WebCore::BitmapImage::initPlatformData):
        (WebCore::BitmapImage::invalidatePlatformData):
        (WebCore::BitmapImage::checkForSolidColor):
        (WebCore::BitmapImage::draw):
        (WebCore::BitmapImageSingleFrameSkia::draw):
        (WebCore::BitmapImageSingleFrameSkia::create):
---
 WebCore/ChangeLog                                  |   31 ++
 WebCore/platform/graphics/skia/ImageBufferSkia.cpp |  210 +++++++++
 WebCore/platform/graphics/skia/ImageSkia.cpp       |  458 ++++++++++++++++++++
 3 files changed, 699 insertions(+), 0 deletions(-)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26528</attachid>
            <date>2009-01-08 10:56:54 -0800</date>
            <delta_ts>2009-01-08 10:56:54 -0800</delta_ts>
            <desc>        Add the first few files from platform/graphics/skia</desc>
            <filename>-Add-the-first-few-files-from-platform-graphics-skia.patch</filename>
            <type>text/plain</type>
            <size>24869</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">YTM5ZTRjM2Q2NmFkZDlkMThhNWQ5YThjY2NiNGQwYzhjMGFmMDljZgpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBlNTVlYjdkLi45MDZiNzBk
IDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpA
QCAtMSwzICsxLDUxIEBACisyMDA5LTAxLTA4ICBEaW1pdHJpIEdsYXprb3YgIDxkZ2xhemtvdkBj
aHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwuCisKKyAgICAg
ICAgQWRkIHRoZSBmaXJzdCBmZXcgZmlsZXMgZnJvbSBwbGF0Zm9ybS9ncmFwaGljcy9za2lhCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzE5MQorICAg
ICAgICAKKyAgICAgICAgVGhlc2UgYXJlIGFsbCBwcmV0dHkgc2ltcGxlLgorICAgICAgICBFdmVu
dHVhbGx5IEJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhIG1pZ2h0IGdyb3cgYSAuY3BwIGZpbGUs
IGZvciBub3cgaXQncyBqdXN0IGEgaGVhZGVyLgorICAgICAgICBTa2lhVXRpbHMgbmVlZHMgdG8g
ZGllLCBidXQgdGhhdCBjYW4gY29tZSBsYXRlciwgbm8gbmVlZCB0byBibG9jayB1cC1zdHJlYW1p
bmcgbm93LgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9CaXRtYXBJbWFnZVNp
bmdsZUZyYW1lU2tpYS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlU2lu
Z2xlRnJhbWVTa2lhOjppc0JpdG1hcEltYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcElt
YWdlU2luZ2xlRnJhbWVTa2lhOjpzaXplKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdl
U2luZ2xlRnJhbWVTa2lhOjpkZXN0cm95RGVjb2RlZERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6
Qml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWE6OmRlY29kZWRTaXplKToKKyAgICAgICAgKFdlYkNv
cmU6OkJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhOjpuYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFt
ZSk6CisgICAgICAgIChXZWJDb3JlOjpCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYTo6Qml0bWFw
SW1hZ2VTaW5nbGVGcmFtZVNraWEpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEv
RmxvYXRQb2ludFNraWEuY3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L21hYy9GbG9hdFBvaW50TWFjLm1tLgorICAgICAgICAoV2ViQ29yZTo6RmxvYXRQb2ludDo6Rmxv
YXRQb2ludCk6CisgICAgICAgIChXZWJDb3JlOjpGbG9hdFBvaW50OjpvcGVyYXRvciBTa1BvaW50
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0Zsb2F0UmVjdFNraWEuY3BwOiBD
b3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0ludFJlY3RRdC5jcHAuCisg
ICAgICAgIChXZWJDb3JlOjpGbG9hdFJlY3Q6OkZsb2F0UmVjdCk6CisgICAgICAgIChXZWJDb3Jl
OjpGbG9hdFJlY3Q6Om9wZXJhdG9yIFNrUmVjdCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3Mvc2tpYS9JbnRQb2ludFNraWEuY3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3dpbi9JbnRQb2ludFdpbi5jcHAuCisgICAgICAgIChXZWJDb3JlOjpJbnRQb2ludDo6
SW50UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6SW50UG9pbnQ6Om9wZXJhdG9yIFNrSVBvaW50
KToKKyAgICAgICAgKFdlYkNvcmU6OkludFBvaW50OjpvcGVyYXRvciBTa1BvaW50KToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ludFJlY3RTa2lhLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9JbnRSZWN0UXQuY3BwLgorICAgICAgICAoV2Vi
Q29yZTo6SW50UmVjdDo6b3BlcmF0b3IgU2tJUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpJbnRS
ZWN0OjpvcGVyYXRvciBTa1JlY3QpOgorICAgICAgICAoV2ViQ29yZTo6SW50UmVjdDo6SW50UmVj
dCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9Ta2lhVXRpbHMuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVQb2ludFRvU2tpYVBvaW50KToKKyAgICAgICAg
KFdlYkNvcmU6OldlYkNvcmVSZWN0VG9Ta2lhUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjopOgor
ICAgICAgICAoV2ViQ29yZTo6V2ViQ29yZUNvbXBvc2l0ZVRvU2tpYUNvbXBvc2l0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpJbnZTY2FsZUJ5dGUpOgorICAgICAgICAoV2ViQ29yZTo6U2tQTUNvbG9y
VG9Db2xvcik6CisgICAgICAgIChXZWJDb3JlOjpTa1BNQ29sb3JUb1dlYkNvcmVDb2xvcik6Cisg
ICAgICAgIChXZWJDb3JlOjpJbnRlcnNlY3RSZWN0QW5kUmVnaW9uKToKKyAgICAgICAgKFdlYkNv
cmU6OkNsaXBSZWN0VG9DYW52YXMpOgorICAgICAgICAoV2ViQ29yZTo6U2tQYXRoQ29udGFpbnNQ
b2ludCk6CisgICAgICAgIChXZWJDb3JlOjpzY3JhdGNoQ29udGV4dCk6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9Ta2lhVXRpbHMuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
OjpXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKToKKyAgICAgICAgKFdlYkNvcmU6OldlYkNvcmVEb3Vi
bGVUb1NrU2NhbGFyKToKKwogMjAwOS0wMS0wOCAgUGllcnJlLU9saXZpZXIgTGF0b3VyICA8cG9s
QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYW4gQmVybnN0ZWluLgpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0JpdG1hcEltYWdlU2luZ2xlRnJh
bWVTa2lhLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvQml0bWFwSW1hZ2VTaW5n
bGVGcmFtZVNraWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGFjMjMw
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0JpdG1h
cEltYWdlU2luZ2xlRnJhbWVTa2lhLmgKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IChj
KSAyMDA2LTIwMDggVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisv
LyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNl
bnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVm
IEJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhX2gKKyNkZWZpbmUgQml0bWFwSW1hZ2VTaW5nbGVG
cmFtZVNraWFfaAorCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJOYXRpdmVJbWFnZVNr
aWEuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBUaGlzIGltYWdlIGNsYXNzIGNhbiBi
ZSB1c2VkIGluIHBsYWNlcyB3aGljaCBuZWVkIGFuIEltYWdlLCBidXQgaGF2ZQorLy8gcmF3IHBp
eGVsIGRhdGEgcmF0aGVyIHRoYW4gdW5kZWNvZGVkIGltYWdlIGRhdGEuCisvLyBUaGUgSW1hZ2Ug
aXMgc2ltcGxlciB0aGFuIGEgQml0bWFwSW1hZ2UsIGFzIGl0IGRvZXMgbm90IGhhdmUgaW1hZ2UK
Ky8vIG9ic2VydmVycywgYW5pbWF0aW9uLCBtdWx0aXBsZSBmcmFtZXMsIG9yIG5vbi1kZWNvZGVk
IGRhdGEuCisvLyBUaGVyZWZvcmUgdHJpbW1pbmcgdGhlIGRlY29kZWQgZGF0YSAoZGVzdHJveURl
Y29kZWREYXRhKCkpIGhhcyBubyBlZmZlY3QuCisvLworLy8gVGhlIGRpZmZpY3VsdHkgd2l0aCBw
dXR0aW5nIHRoaXMgaW4gQml0bWFwSW1hZ2U6OmNyZWF0ZShOYXRpdmVJbWFnZVB0cikKKy8vIGlz
IHRoYXQgTmF0aXZlSW1hZ2VQdHIgPSBOYXRpdmVJbWFnZVNraWEsIHlldCBjYWxsZXJzIGhhdmUg
U2tCaXRtYXAuCitjbGFzcyBCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYSA6IHB1YmxpYyBJbWFn
ZSB7CitwdWJsaWM6CisgICAgLy8gQ3JlYXRlcyBhIG5ldyBJbWFnZSwgYnkgY29weWluZyB0aGUg
cGl4ZWwgdmFsdWVzIG91dCBvZiB8Yml0bWFwfC4KKyAgICAvLyBJZiBjcmVhdGlvbiBmYWlsZWQs
IHJldHVybnMgbnVsbC4KKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxCaXRtYXBJbWFnZVNpbmdsZUZy
YW1lU2tpYT4gY3JlYXRlKAorICAgICAgICBjb25zdCBTa0JpdG1hcCYgYml0bWFwKTsKKworICAg
IHZpcnR1YWwgYm9vbCBpc0JpdG1hcEltYWdlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisg
ICAgdmlydHVhbCBJbnRTaXplIHNpemUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIElu
dFNpemUobV9uYXRpdmVJbWFnZS53aWR0aCgpLCBtX25hdGl2ZUltYWdlLmhlaWdodCgpKTsKKyAg
ICB9CisKKyAgICAvLyBEbyBub3RoaW5nLCBhcyB3ZSBvbmx5IGhhdmUgdGhlIG9uZSByZXByZXNl
bnRhdGlvbiBvZiBkYXRhIChkZWNvZGVkKS4KKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveURlY29k
ZWREYXRhKGJvb2wgZGVzdHJveUFsbCA9IHRydWUpIHsgfQorCisgICAgdmlydHVhbCB1bnNpZ25l
ZCBkZWNvZGVkU2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9uYXRpdmVJbWFn
ZS5kZWNvZGVkU2l6ZSgpOworICAgIH0KKworICAgIC8vIFdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBm
cmFtZS4KKyAgICB2aXJ0dWFsIE5hdGl2ZUltYWdlUHRyIG5hdGl2ZUltYWdlRm9yQ3VycmVudEZy
YW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiAmbV9uYXRpdmVJbWFnZTsKKyAgICB9CisKK3By
b3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgZHJhdyhHcmFwaGljc0NvbnRleHQqIGN0eHQsIGNv
bnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9h
dFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKTsKKworcHJpdmF0
ZToKKyAgICBOYXRpdmVJbWFnZVNraWEgbV9uYXRpdmVJbWFnZTsKKworICAgIC8vIFVzZSBjcmVh
dGUoKS4KKyAgICBCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYSgpIHsgfQorfTsKKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgIC8vIEJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lh
X2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9GbG9hdFBvaW50
U2tpYS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvRmxvYXRQb2ludFNraWEu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDdmZDAKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvRmxvYXRQb2ludFNraWEu
Y3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlLCBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiRmxvYXRQb2ludC5oIgorCisjaW5jbHVkZSAiU2tQb2ludC5oIgorI2luY2x1ZGUg
IlNraWFVdGlscy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0Zsb2F0UG9pbnQ6OkZsb2F0
UG9pbnQoY29uc3QgU2tQb2ludCYgcCkKKyAgICA6IG1feChwLmZYKQorICAgICwgbV95KHAuZlkp
Cit7Cit9CisKK0Zsb2F0UG9pbnQ6Om9wZXJhdG9yIFNrUG9pbnQoKSBjb25zdAoreworICAgIFNr
UG9pbnQgcCA9IHsgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihtX3gpLCBXZWJDb3JlRmxvYXRUb1Nr
U2NhbGFyKG1feSkgfTsKKyAgICByZXR1cm4gcDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQorCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvRmxvYXRSZWN0
U2tpYS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvRmxvYXRSZWN0U2tpYS5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0ZGNkMQotLS0gL2Rldi9u
dWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9GbG9hdFJlY3RTa2lhLmNw
cApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSwgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiRmxvYXRSZWN0LmgiCisKKyNpbmNsdWRlICJTa1JlY3QuaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitGbG9hdFJlY3Q6OkZsb2F0UmVjdChjb25zdCBTa1JlY3QmIHIpCisgICAgOiBt
X2xvY2F0aW9uKHIuZkxlZnQsIHIuZlRvcCkKKyAgICAsIG1fc2l6ZShyLndpZHRoKCksIHIuaGVp
Z2h0KCkpCit7Cit9CisKK0Zsb2F0UmVjdDo6b3BlcmF0b3IgU2tSZWN0KCkgY29uc3QKK3sKKyAg
ICBTa1JlY3QgcmVjdCA9IHsgeCgpLCB5KCksIHJpZ2h0KCksIGJvdHRvbSgpIH07CisgICAgcmV0
dXJuIHJlY3Q7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ludFBvaW50U2tpYS5jcHAgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3NraWEvSW50UG9pbnRTa2lhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi4yMWUxMTBlCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9za2lhL0ludFBvaW50U2tpYS5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBV
VEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbnRQb2ludC5oIgorI2lu
Y2x1ZGUgIlNrUG9pbnQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitJbnRQb2ludDo6SW50
UG9pbnQoY29uc3QgU2tJUG9pbnQmIHApCisgICAgOiBtX3gocC5mWCkKKyAgICAsIG1feShwLmZZ
KQoreworfQorCitJbnRQb2ludDo6b3BlcmF0b3IgU2tJUG9pbnQoKSBjb25zdAoreworICAgIFNr
SVBvaW50IHAgPSB7IG1feCwgbV95IH07CisgICAgcmV0dXJuIHA7Cit9CisKK0ludFBvaW50Ojpv
cGVyYXRvciBTa1BvaW50KCkgY29uc3QKK3sKKyAgICBTa1BvaW50IHAgPSB7IFNrSW50VG9TY2Fs
YXIobV94KSwgU2tJbnRUb1NjYWxhcihtX3kpIH07CisgICAgcmV0dXJuIHA7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
c2tpYS9JbnRSZWN0U2tpYS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW50
UmVjdFNraWEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NGJmODYK
LS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW50UmVj
dFNraWEuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggR29v
Z2xlLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorCisjaW5jbHVkZSAiU2tSZWN0LmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworSW50UmVjdDo6b3BlcmF0b3IgU2tJUmVjdCgpIGNvbnN0Cit7Cisg
ICAgU2tJUmVjdCByZWN0ID0geyB4KCksIHkoKSwgcmlnaHQoKSwgYm90dG9tKCkgfTsKKyAgICBy
ZXR1cm4gcmVjdDsKK30KKworSW50UmVjdDo6b3BlcmF0b3IgU2tSZWN0KCkgY29uc3QKK3sKKyAg
ICBTa1JlY3QgcmVjdDsKKyAgICByZWN0LnNldChTa0ludFRvU2NhbGFyKHgoKSksIFNrSW50VG9T
Y2FsYXIoeSgpKSwKKyAgICAgICAgICAgICBTa0ludFRvU2NhbGFyKHJpZ2h0KCkpLCBTa0ludFRv
U2NhbGFyKGJvdHRvbSgpKSk7CisgICAgcmV0dXJuIHJlY3Q7Cit9CisKK0ludFJlY3Q6OkludFJl
Y3QoY29uc3QgU2tJUmVjdCYgcikKKyAgICA6IG1fbG9jYXRpb24oci5mTGVmdCwgci5mVG9wKQor
ICAgICwgbV9zaXplKHIud2lkdGgoKSwgci5oZWlnaHQoKSkKK3sKK30KKworfQorCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvU2tpYVV0aWxzLmNwcCBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9Ta2lhVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLmU3MTczYzMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3NraWEvU2tpYVV0aWxzLmNwcApAQCAtMCwwICsxLDI0MCBAQAorLy8g
Q29weXJpZ2h0IChjKSAyMDA4LCBHb29nbGUgSW5jLgorLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
Ky8vIAorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLyAKKy8vICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisv
LyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vIAorLy8gVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
Ky8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiU2tpYVV0aWxzLmgiCisKKyNpbmNsdWRlICJJbWFn
ZUJ1ZmZlci5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorI2luY2x1ZGUgIlNrQ2FudmFz
LmgiCisjaW5jbHVkZSAiU2tDb2xvclByaXYuaCIKKyNpbmNsdWRlICJTa01hdHJpeC5oIgorI2lu
Y2x1ZGUgIlNrUmVnaW9uLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBXZWJDb3Jl
UG9pbnRUb1NraWFQb2ludChjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50JiBzcmMsIFNrUG9pbnQq
IGRzdCkKK3sKKyAgICBkc3QtPnNldChXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNyYy54KCkpLCBX
ZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNyYy55KCkpKTsKK30KKwordm9pZCBXZWJDb3JlUmVjdFRv
U2tpYVJlY3QoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgc3JjLCBTa1JlY3QqIGRzdCkKK3sKKyAg
ICBkc3QtPnNldChTa0ludFRvU2NhbGFyKHNyYy54KCkpLAorICAgICAgICAgICAgIFNrSW50VG9T
Y2FsYXIoc3JjLnkoKSksCisgICAgICAgICAgICAgU2tJbnRUb1NjYWxhcihzcmMueCgpICsgc3Jj
LndpZHRoKCkpLAorICAgICAgICAgICAgIFNrSW50VG9TY2FsYXIoc3JjLnkoKSArIHNyYy5oZWln
aHQoKSkpOworfQorCit2b2lkIFdlYkNvcmVSZWN0VG9Ta2lhUmVjdChjb25zdCBXZWJDb3JlOjpJ
bnRSZWN0JiBzcmMsIFNrSVJlY3QqIGRzdCkKK3sKKyAgICBkc3QtPnNldChzcmMueCgpLAorICAg
ICAgICAgICAgIHNyYy55KCksCisgICAgICAgICAgICAgc3JjLngoKSArIHNyYy53aWR0aCgpLAor
ICAgICAgICAgICAgIHNyYy55KCkgKyBzcmMuaGVpZ2h0KCkpOworfQorCit2b2lkIFdlYkNvcmVS
ZWN0VG9Ta2lhUmVjdChjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmIHNyYywgU2tSZWN0KiBkc3Qp
Cit7CisgICAgZHN0LT5zZXQoV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihzcmMueCgpKSwKKyAgICAg
ICAgICAgICBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNyYy55KCkpLAorICAgICAgICAgICAgIFdl
YkNvcmVGbG9hdFRvU2tTY2FsYXIoc3JjLngoKSArIHNyYy53aWR0aCgpKSwKKyAgICAgICAgICAg
ICBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNyYy55KCkgKyBzcmMuaGVpZ2h0KCkpKTsKK30KKwor
dm9pZCBXZWJDb3JlUmVjdFRvU2tpYVJlY3QoY29uc3QgV2ViQ29yZTo6RmxvYXRSZWN0JiBzcmMs
IFNrSVJlY3QqIGRzdCkKK3sKKyAgICBkc3QtPnNldChTa1NjYWxhclJvdW5kKFdlYkNvcmVGbG9h
dFRvU2tTY2FsYXIoc3JjLngoKSkpLAorICAgICAgICAgICAgIFNrU2NhbGFyUm91bmQoV2ViQ29y
ZUZsb2F0VG9Ta1NjYWxhcihzcmMueSgpKSksCisgICAgICAgICAgICAgU2tTY2FsYXJSb3VuZChX
ZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHNyYy54KCkgKyBzcmMud2lkdGgoKSkpLAorICAgICAgICAg
ICAgIFNrU2NhbGFyUm91bmQoV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihzcmMueSgpICsgc3JjLmhl
aWdodCgpKSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IENvbXBvc2l0T3BUb1BvcnRlckR1
ZmZNb2RlIHsKKyAgICB1aW50OF90IG1Db21wb3NpdE9wOworICAgIHVpbnQ4X3QgbVBvcnRlckR1
ZmZNb2RlOworfSBnTWFwQ29tcG9zaXRPcHNUb1BvcnRlckR1ZmZNb2Rlc1tdID0geworICAgIHsg
V2ViQ29yZTo6Q29tcG9zaXRlQ2xlYXIsICAgICAgICAgICBTa1BvcnRlckR1ZmY6OmtDbGVhcl9N
b2RlIH0sCisgICAgeyBXZWJDb3JlOjpDb21wb3NpdGVDb3B5LCAgICAgICAgICAgIFNrUG9ydGVy
RHVmZjo6a1NyY092ZXJfTW9kZSB9LCAgLy8gVE9ETworICAgIHsgV2ViQ29yZTo6Q29tcG9zaXRl
U291cmNlT3ZlciwgICAgICBTa1BvcnRlckR1ZmY6OmtTcmNPdmVyX01vZGUgfSwKKyAgICB7IFdl
YkNvcmU6OkNvbXBvc2l0ZVNvdXJjZUluLCAgICAgICAgU2tQb3J0ZXJEdWZmOjprU3JjSW5fTW9k
ZSB9LAorICAgIHsgV2ViQ29yZTo6Q29tcG9zaXRlU291cmNlT3V0LCAgICAgICBTa1BvcnRlckR1
ZmY6OmtTcmNPdXRfTW9kZSB9LAorICAgIHsgV2ViQ29yZTo6Q29tcG9zaXRlU291cmNlQXRvcCwg
ICAgICBTa1BvcnRlckR1ZmY6OmtTcmNBVG9wX01vZGUgfSwKKyAgICB7IFdlYkNvcmU6OkNvbXBv
c2l0ZURlc3RpbmF0aW9uT3ZlciwgU2tQb3J0ZXJEdWZmOjprRHN0T3Zlcl9Nb2RlIH0sCisgICAg
eyBXZWJDb3JlOjpDb21wb3NpdGVEZXN0aW5hdGlvbkluLCAgIFNrUG9ydGVyRHVmZjo6a0RzdElu
X01vZGUgfSwKKyAgICB7IFdlYkNvcmU6OkNvbXBvc2l0ZURlc3RpbmF0aW9uT3V0LCAgU2tQb3J0
ZXJEdWZmOjprRHN0T3V0X01vZGUgfSwKKyAgICB7IFdlYkNvcmU6OkNvbXBvc2l0ZURlc3RpbmF0
aW9uQXRvcCwgU2tQb3J0ZXJEdWZmOjprRHN0QVRvcF9Nb2RlIH0sCisgICAgeyBXZWJDb3JlOjpD
b21wb3NpdGVYT1IsICAgICAgICAgICAgIFNrUG9ydGVyRHVmZjo6a1hvcl9Nb2RlIH0sCisgICAg
eyBXZWJDb3JlOjpDb21wb3NpdGVQbHVzRGFya2VyLCAgICAgIFNrUG9ydGVyRHVmZjo6a0Rhcmtl
bl9Nb2RlIH0sCisgICAgeyBXZWJDb3JlOjpDb21wb3NpdGVIaWdobGlnaHQsICAgICAgIFNrUG9y
dGVyRHVmZjo6a1NyY092ZXJfTW9kZSB9LCAgLy8gVE9ETworICAgIHsgV2ViQ29yZTo6Q29tcG9z
aXRlUGx1c0xpZ2h0ZXIsICAgICBTa1BvcnRlckR1ZmY6OmtMaWdodGVuX01vZGUgfQorfTsKKwor
U2tQb3J0ZXJEdWZmOjpNb2RlIFdlYkNvcmVDb21wb3NpdGVUb1NraWFDb21wb3NpdGUoV2ViQ29y
ZTo6Q29tcG9zaXRlT3BlcmF0b3Igb3ApCit7CisgICAgY29uc3QgQ29tcG9zaXRPcFRvUG9ydGVy
RHVmZk1vZGUqIHRhYmxlID0gZ01hcENvbXBvc2l0T3BzVG9Qb3J0ZXJEdWZmTW9kZXM7CisgICAg
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFNLX0FSUkFZX0NPVU5UKGdNYXBDb21wb3Np
dE9wc1RvUG9ydGVyRHVmZk1vZGVzKTsgaSsrKSB7CisgICAgICAgIGlmICh0YWJsZVtpXS5tQ29t
cG9zaXRPcCA9PSBvcCkgeworICAgICAgICAgICAgcmV0dXJuIChTa1BvcnRlckR1ZmY6Ok1vZGUp
dGFibGVbaV0ubVBvcnRlckR1ZmZNb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgU2tERUJV
R0YoKCJHcmFwaGljc0NvbnRleHQ6OnNldENvbXBvc2l0ZU9wZXJhdGlvbiB1a25vd24gQ29tcG9z
aXRPcGVyYXRvciAlZFxuIiwgb3ApKTsKKyAgICByZXR1cm4gU2tQb3J0ZXJEdWZmOjprU3JjT3Zl
cl9Nb2RlOyAvLyBmYWxsLWJhY2sKK30KKworc3RhdGljIFU4Q1BVIEludlNjYWxlQnl0ZShVOENQ
VSBjb21wb25lbnQsIHVpbnQzMl90IHNjYWxlKQoreworICAgIFNrQVNTRVJUKGNvbXBvbmVudCA9
PSAodWludDhfdCljb21wb25lbnQpOworICAgIHJldHVybiAoY29tcG9uZW50ICogc2NhbGUgKyAw
eDgwMDApID4+IDE2OworfQorCitTa0NvbG9yIFNrUE1Db2xvclRvQ29sb3IoU2tQTUNvbG9yIHBt
KQoreworICAgIGlmICgwID09IHBtKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICB1bnNp
Z25lZCBhID0gU2tHZXRQYWNrZWRBMzIocG0pOworICAgIHVpbnQzMl90IHNjYWxlID0gKDI1NSA8
PCAxNikgLyBhOworICAgIAorICAgIHJldHVybiBTa0NvbG9yU2V0QVJHQihhLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICBJbnZTY2FsZUJ5dGUoU2tHZXRQYWNrZWRSMzIocG0pLCBzY2FsZSks
CisgICAgICAgICAgICAgICAgICAgICAgICAgIEludlNjYWxlQnl0ZShTa0dldFBhY2tlZEczMihw
bSksIHNjYWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW52U2NhbGVCeXRlKFNrR2V0
UGFja2VkQjMyKHBtKSwgc2NhbGUpKTsKK30KKworV2ViQ29yZTo6Q29sb3IgU2tQTUNvbG9yVG9X
ZWJDb3JlQ29sb3IoU2tQTUNvbG9yIHBtKQoreworICAgIHJldHVybiBTa1BNQ29sb3JUb0NvbG9y
KHBtKTsKK30KKwordm9pZCBJbnRlcnNlY3RSZWN0QW5kUmVnaW9uKGNvbnN0IFNrUmVnaW9uJiBy
ZWdpb24sIGNvbnN0IFNrUmVjdCYgc3JjX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgU2tSZWN0KiBkZXN0X3JlY3QpIHsKKyAgICAvLyBUaGUgY2xpcGVyYXRvciByZXF1aXJlcyBh
biBpbnQgcmVjdCwgc28gd2Ugcm91bmQgb3V0LgorICAgIFNrSVJlY3Qgc3JjX3JlY3Rfcm91bmRl
ZDsKKyAgICBzcmNfcmVjdC5yb3VuZE91dCgmc3JjX3JlY3Rfcm91bmRlZCk7CisKKyAgICAvLyBU
aGUgQ2xpcGVyYXRvciB3aWxsIGl0ZXJhdGUgb3ZlciBhIGJ1bmNoIG9mIHJlY3RzIHdoZXJlIG91
ciB0cmFuc2Zvcm1lZAorICAgIC8vIHJlY3QgYW5kIHRoZSBjbGlwcGluZyByZWdpb24gKHdoaWNo
IG1heSBiZSBub24tc3F1YXJlKSBvdmVybGFwLgorICAgIFNrUmVnaW9uOjpDbGlwZXJhdG9yIGNs
aXBlcmF0b3IocmVnaW9uLCBzcmNfcmVjdF9yb3VuZGVkKTsKKyAgICBpZiAoY2xpcGVyYXRvci5k
b25lKCkpIHsKKyAgICAgICAgZGVzdF9yZWN0LT5zZXRFbXB0eSgpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgLy8gR2V0IHRoZSB1bmlvbiBvZiBhbGwgdmlzaWJsZSByZWN0cyBpbiB0
aGUgY2xpcCB0aGF0IG92ZXJsYXAgb3VyIGJpdG1hcC4KKyAgICBTa0lSZWN0IGN1cl92aXNpYmxl
X3JlY3QgPSBjbGlwZXJhdG9yLnJlY3QoKTsKKyAgICBjbGlwZXJhdG9yLm5leHQoKTsKKyAgICB3
aGlsZSAoIWNsaXBlcmF0b3IuZG9uZSgpKSB7CisgICAgICAgIGN1cl92aXNpYmxlX3JlY3Quam9p
bihjbGlwZXJhdG9yLnJlY3QoKSk7CisgICAgICAgIGNsaXBlcmF0b3IubmV4dCgpOworICAgIH0K
KworICAgIGRlc3RfcmVjdC0+c2V0KGN1cl92aXNpYmxlX3JlY3QpOworfQorCit2b2lkIENsaXBS
ZWN0VG9DYW52YXMoY29uc3QgU2tDYW52YXMmIGNhbnZhcywgY29uc3QgU2tSZWN0JiBzcmNfcmVj
dCwKKyAgICAgICAgICAgICAgICAgICAgICBTa1JlY3QqIGRlc3RfcmVjdCkgeworICAgIC8vIFRy
YW5zbGF0ZSBpbnRvIHRoZSBjYW52YXMnIGNvb3JkaW5hdGUgc3BhY2UuIFRoaXMgaXMgd2hlcmUg
dGhlIGNsaXBwaW5nCisgICAgLy8gcmVnaW9uIGFwcGxpZXMuCisgICAgU2tSZWN0IHRyYW5zZm9y
bWVkX3NyYzsKKyAgICBjYW52YXMuZ2V0VG90YWxNYXRyaXgoKS5tYXBSZWN0KCZ0cmFuc2Zvcm1l
ZF9zcmMsIHNyY19yZWN0KTsKKworICAgIC8vIERvIHRoZSBpbnRlcnNlY3Rpb24uCisgICAgU2tS
ZWN0IHRyYW5zZm9ybWVkX2Rlc3Q7CisgICAgSW50ZXJzZWN0UmVjdEFuZFJlZ2lvbihjYW52YXMu
Z2V0VG90YWxDbGlwKCksIHRyYW5zZm9ybWVkX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICZ0cmFuc2Zvcm1lZF9kZXN0KTsKKworICAgIC8vIE5vdyB0cmFuc2Zvcm0gaXQgYmFjayBp
bnRvIHdvcmxkIHNwYWNlLgorICAgIFNrTWF0cml4IGludmVyc2VfdHJhbnNmb3JtOworICAgIGNh
bnZhcy5nZXRUb3RhbE1hdHJpeCgpLmludmVydCgmaW52ZXJzZV90cmFuc2Zvcm0pOworICAgIGlu
dmVyc2VfdHJhbnNmb3JtLm1hcFJlY3QoZGVzdF9yZWN0LCB0cmFuc2Zvcm1lZF9kZXN0KTsKK30K
KworYm9vbCBTa1BhdGhDb250YWluc1BvaW50KFNrUGF0aCogb3JpZ19wYXRoLCBXZWJDb3JlOjpG
bG9hdFBvaW50IHBvaW50LCBTa1BhdGg6OkZpbGxUeXBlIGZ0KQoreworICAgIFNrUmVnaW9uICAg
IHJnbiwgY2xpcDsKKworICAgIFNrUGF0aDo6RmlsbFR5cGUgb3JpZ19mdCA9IG9yaWdfcGF0aC0+
Z2V0RmlsbFR5cGUoKTsgICAgLy8gc2F2ZQorCisgICAgY29uc3QgU2tQYXRoKiBwYXRoID0gb3Jp
Z19wYXRoOworICAgIFNrUGF0aCBzY2FsZWRfcGF0aDsKKyAgICBpbnQgc2NhbGUgPSAxOworCisg
ICAgU2tSZWN0IGJvdW5kczsKKyAgICBvcmlnX3BhdGgtPmNvbXB1dGVCb3VuZHMoJmJvdW5kcywg
U2tQYXRoOjprRmFzdF9Cb3VuZHNUeXBlKTsKKworICAgIC8vIFdlIGNhbiBpbW1lZGlhdGVseSBy
ZXR1cm4gZmFsc2UgaWYgdGhlIHBvaW50IGlzIG91dHNpZGUgdGhlIGJvdW5kaW5nIHJlY3QKKyAg
ICBpZiAoIWJvdW5kcy5jb250YWlucyhTa0Zsb2F0VG9TY2FsYXIocG9pbnQueCgpKSwgU2tGbG9h
dFRvU2NhbGFyKHBvaW50LnkoKSkpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgb3JpZ19w
YXRoLT5zZXRGaWxsVHlwZShmdCk7CisKKyAgICAvLyBTa2lhIGhhcyB0cm91YmxlIHdpdGggY29v
cmRpbmF0ZXMgY2xvc2UgdG8gdGhlIG1heCBzaWduZWQgMTYtYml0IHZhbHVlcworICAgIC8vIElm
IHdlIGhhdmUgdGhvc2UsIHdlIG5lZWQgdG8gc2NhbGUuIAorICAgIC8vCisgICAgLy8gVE9ETzog
cmVtb3ZlIHRoaXMgY29kZSBvbmNlIFNraWEgaXMgcGF0Y2hlZCB0byB3b3JrIHByb3Blcmx5IHdp
dGggbGFyZ2UKKyAgICAvLyB2YWx1ZXMKKyAgICBjb25zdCBTa1NjYWxhciBrTWF4Q29vcmRpbmF0
ZSA9IFNrSW50VG9TY2FsYXIoMTw8MTUpOworICAgIFNrU2NhbGFyIGJpZ2dlc3RfY29vcmQgPSBz
dGQ6Om1heChzdGQ6Om1heChzdGQ6Om1heCgKKyAgICAgIGJvdW5kcy5mUmlnaHQsIGJvdW5kcy5m
Qm90dG9tKSwgLWJvdW5kcy5mTGVmdCksIC1ib3VuZHMuZlRvcCk7CisKKyAgICBpZiAoYmlnZ2Vz
dF9jb29yZCA+IGtNYXhDb29yZGluYXRlKSB7CisgICAgICBzY2FsZSA9IFNrU2NhbGFyQ2VpbChT
a1NjYWxhckRpdihiaWdnZXN0X2Nvb3JkLCBrTWF4Q29vcmRpbmF0ZSkpOworCisgICAgICBTa01h
dHJpeCBtOworICAgICAgbS5zZXRTY2FsZShTa1NjYWxhckludmVydChTa0ludFRvU2NhbGFyKHNj
YWxlKSksIAorICAgICAgICAgICAgICAgICBTa1NjYWxhckludmVydChTa0ludFRvU2NhbGFyKHNj
YWxlKSkpOworICAgICAgb3JpZ19wYXRoLT50cmFuc2Zvcm0obSwgJnNjYWxlZF9wYXRoKTsKKyAg
ICAgIHBhdGggPSAmc2NhbGVkX3BhdGg7CisgICAgfQorCisgICAgaW50IHggPSAoaW50KWZsb29y
Zihwb2ludC54KCkgLyBzY2FsZSk7CisgICAgaW50IHkgPSAoaW50KWZsb29yZihwb2ludC55KCkg
LyBzY2FsZSk7CisgICAgY2xpcC5zZXRSZWN0KHgsIHksIHggKyAxLCB5ICsgMSk7CisKKyAgICBi
b29sIGNvbnRhaW5zID0gcmduLnNldFBhdGgoKnBhdGgsIGNsaXApOworCisgICAgb3JpZ19wYXRo
LT5zZXRGaWxsVHlwZShvcmlnX2Z0KTsgICAgLy8gcmVzdG9yZQorICAgIHJldHVybiBjb250YWlu
czsKK30KKworR3JhcGhpY3NDb250ZXh0KiBzY3JhdGNoQ29udGV4dCgpCit7CisgICAgc3RhdGlj
IEltYWdlQnVmZmVyKiBzY3JhdGNoID0gTlVMTDsKKyAgICBpZiAoIXNjcmF0Y2gpCisgICAgICAg
IHNjcmF0Y2ggPSBJbWFnZUJ1ZmZlcjo6Y3JlYXRlKEludFNpemUoMSwgMSksIGZhbHNlKS5yZWxl
YXNlKCk7CisgICAgLy8gV2UgZG9uJ3QgYm90aGVyIGNoZWNraW5nIGZvciBmYWlsdXJlIGNyZWF0
aW5nIHRoZSBJbWFnZUJ1ZmZlciwgc2luY2Ugb3VyCisgICAgLy8gSW1hZ2VCdWZmZXIgaW5pdGlh
bGl6ZXIgd29uJ3QgZmFpbC4KKyAgICByZXR1cm4gc2NyYXRjaC0+Y29udGV4dCgpOworfQorCit9
ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9za2lhL1NraWFVdGlscy5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1Nr
aWFVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMDQxOTMKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvU2tpYVV0aWxz
LmgKQEAgLTAsMCArMSw2NCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggVGhlIENocm9t
aXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2Ug
Y29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBm
b3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgaGVscGVy
IHJvdXRpbmVzIGZvciB1c2luZyBTa2lhIGluIFdlYktpdC4KKworI2lmbmRlZiBTa2lhVXRpbHNf
aAorI2RlZmluZSBTa2lhVXRpbHNfaAorCisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJTa1BhdGguaCIKKyNpbmNsdWRl
ICJTa1BvcnRlckR1ZmYuaCIKKworY2xhc3MgU2tDYW52YXM7CitjbGFzcyBTa1JlZ2lvbjsKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBDb252ZXJ0cyBhIFdlYkNvcmUgY29tcG9zaXQgb3Bl
cmF0aW9uIChXZWJDb3JlOjpDb21wb3NpdGUqKSB0byB0aGUKKy8vIGNvcnJlc3BvbmRpbmcgU2tp
YSB0eXBlLgorU2tQb3J0ZXJEdWZmOjpNb2RlIFdlYkNvcmVDb21wb3NpdGVUb1NraWFDb21wb3Np
dGUoV2ViQ29yZTo6Q29tcG9zaXRlT3BlcmF0b3IpOworCisvLyBtb3ZlIHRoaXMgZ3V5IGludG8g
U2tDb2xvci5oCitTa0NvbG9yIFNrUE1Db2xvclRvQ29sb3IoU2tQTUNvbG9yIHBtKTsKKworLy8g
Q29udmVydHMgQW5kcm9pZCBjb2xvcnMgdG8gV2ViS2l0IG9uZXMuCitXZWJDb3JlOjpDb2xvciBT
a1BNQ29sb3JUb1dlYkNvcmVDb2xvcihTa1BNQ29sb3IgcG0pOworCisvLyBTa2lhIGhhcyBwcm9i
bGVtcyB3aGVuIHBhc3NlZCBpbmZpbml0ZSwgZXRjIGZsb2F0cywgZmlsdGVyIHRoZW0gdG8gMC4K
K2lubGluZSBTa1NjYWxhciBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKGNvbnN0IGZsb2F0JiBmKSB7
CisgIHJldHVybiBTa0Zsb2F0VG9TY2FsYXIoaXNmaW5pdGUoZikgPyBmIDogMCk7Cit9CisKK2lu
bGluZSBTa1NjYWxhciBXZWJDb3JlRG91YmxlVG9Ta1NjYWxhcihjb25zdCBkb3VibGUmIGQpIHsK
KyAgcmV0dXJuIFNrRG91YmxlVG9TY2FsYXIoaXNmaW5pdGUoZCkgPyBkIDogMCk7Cit9CisKKy8v
IEludGVyc2VjdHMgdGhlIGdpdmVuIHNvdXJjZSByZWN0IHdpdGggdGhlIHJlZ2lvbiwgcmV0dXJu
aW5nIHRoZSBzbWFsbGVzdAorLy8gcmVjdGFuZ3VsYXIgcmVnaW9uIHRoYXQgZW5jb21wYXNlcyB0
aGUgcmVzdWx0LgorLy8KKy8vIHNyY19yZWN0IGFuZCBkZXN0X3JlY3QgY2FuIGJlIHRoZSBzYW1l
Lgordm9pZCBJbnRlcnNlY3RSZWN0QW5kUmVnaW9uKGNvbnN0IFNrUmVnaW9uJiByZWdpb24sIGNv
bnN0IFNrUmVjdCYgc3JjX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tSZWN0
KiBkZXN0X3JlY3QpOworCisvLyBDb21wdXRlcyB0aGUgc21hbGxlc3QgcmVjdGFuZ2xlIHRoYXQs
IHdoaWNoIHdoZW4gZHJhd24gdG8gdGhlIGdpdmVuIGNhbnZhcywKKy8vIHdpbGwgY292ZXIgdGhl
IHNhbWUgYXJlYSBhcyB0aGUgc291cmNlIHJlY3RhbmdsZS4gSXQgd2lsbCBjbGlwIHRvIHRoZSBj
YW52YXMnCisvLyBjbGlwLCBkb2luZyB0aGUgbmVjZXNzYXJ5IGNvb3JkaW5hdGUgdHJhbnNmb3Jt
cy4KKy8vCisvLyBzcmNfcmVjdCBhbmQgZGVzdF9yZWN0IGNhbiBiZSB0aGUgc2FtZS4KK3ZvaWQg
Q2xpcFJlY3RUb0NhbnZhcyhjb25zdCBTa0NhbnZhcyYgY2FudmFzLCBjb25zdCBTa1JlY3QmIHNy
Y19yZWN0LAorICAgICAgICAgICAgICAgICAgICAgIFNrUmVjdCogZGVzdF9yZWN0KTsKKworLy8g
RGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gV2ViS2l0IHBvaW50IGlzIGNvbnRhaW5lZCBpbiBhIHBhdGgK
K2Jvb2wgU2tQYXRoQ29udGFpbnNQb2ludChTa1BhdGgqIG9yaWdfcGF0aCwgV2ViQ29yZTo6Rmxv
YXRQb2ludCBwb2ludCwgU2tQYXRoOjpGaWxsVHlwZSBmdCk7CisKKy8vIFJldHVybnMgYSBzdGF0
aWNhbGx5IGFsbG9jYXRlZCAxeDEgR3JhcGhpY3NDb250ZXh0IGludGVuZGVkIGZvciB0ZW1wb3Jh
cnkKKy8vIG9wZXJhdGlvbnMuIFBsZWFzZSBzYXZlKCkgdGhlIHN0YXRlIGFuZCByZXN0b3JlKCkg
aXQgd2hlbiB5b3UncmUgZG9uZSB3aXRoCisvLyB0aGUgY29udGV4dC4KK0dyYXBoaWNzQ29udGV4
dCogc2NyYXRjaENvbnRleHQoKTsKKworfSAgLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlm
ICAvLyBTa2lhVXRpbHNfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26532</attachid>
            <date>2009-01-08 13:46:05 -0800</date>
            <delta_ts>2009-01-08 13:46:05 -0800</delta_ts>
            <desc>Add two more files for platform/graphics/skia.</desc>
            <filename>Add-two-more-files-for-platform-graphics-skia..patch</filename>
            <type>text/plain</type>
            <size>10170</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">MjZmY2M1Mzk1NGIzZjk4NGYzMmY1NzI5YTgyMTdhMWFjNDIxNjE1YQpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBkOWQ2OTljLi4zYTg5ZDI3
IDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpA
QCAtMiw2ICsyLDI2IEBACiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwuCiAKKyAg
ICAgICAgQWRkIHR3byBtb3JlIGZpbGVzIGZvciBwbGF0Zm9ybS9ncmFwaGljcy9za2lhLgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjMxOTEKKworICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhZGllbnRTa2lhLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpHcmFkaWVudDo6cGxhdGZvcm1EZXN0cm95KToKKyAgICAgICAgKFdl
YkNvcmU6OkYyQik6CisgICAgICAgIChXZWJDb3JlOjptYWtlU2tDb2xvcik6CisgICAgICAgIChX
ZWJDb3JlOjp0b3RhbFN0b3BzTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbGxTdG9wcyk6
CisgICAgICAgIChXZWJDb3JlOjpjb21wYXJlU3RvcHMpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
ZGllbnQ6OnBsYXRmb3JtR3JhZGllbnQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhZGllbnQ6OmZp
bGwpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0UGxh
dGZvcm1Qcml2YXRlLmg6IENvcGllZCBmcm9tIFdlYkNvcmUvYmluZGluZ3MvanMvU2NyaXB0VmFs
dWUuaC4KKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6
R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZTo6Y29udGV4dCk6CisKKzIwMDktMDEtMDggIERpbWl0
cmkgR2xhemtvdiAgPGRnbGF6a292QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBi
eSBFcmljIFNlaWRlbC4KKwogICAgICAgICBDb21taXQgdGhlIHJpZ2h0IGZpbGVzIHRoaXMgdGlt
ZSEgIChJbnN0ZWFkIG9mIHRoZSB1Z2x5IHVuZml4ZWQgb25lcy4pCiAgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzE5MQogCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhZGllbnRTa2lhLmNwcCBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFkaWVudFNraWEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLmVmZjdjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3NraWEvR3JhZGllbnRTa2lhLmNwcApAQCAtMCwwICsxLDE2NCBAQAorLyoK
KyAqIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhZGllbnQuaCIKKworI2luY2x1ZGUgIkNT
U1BhcnNlci5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorCisjaW5jbHVkZSAiU2tH
cmFkaWVudFNoYWRlci5oIgorI2luY2x1ZGUgIlNraWFVdGlscy5oIgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK3ZvaWQgR3JhZGllbnQ6OnBsYXRmb3JtRGVzdHJveSgpCit7CisgICAgaWYgKG1f
Z3JhZGllbnQpCisgICAgICAgIG1fZ3JhZGllbnQtPnNhZmVVbnJlZigpOworICAgIG1fZ3JhZGll
bnQgPSAwOworfQorCitzdGF0aWMgaW5saW5lIFU4Q1BVIEYyQihmbG9hdCB4KQoreworICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxpbnQ+KHggKiAyNTUpOworfQorCitzdGF0aWMgU2tDb2xvciBtYWtl
U2tDb2xvcihmbG9hdCBhLCBmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKQoreworICAgIHJldHVy
biBTa0NvbG9yU2V0QVJHQihGMkIoYSksIEYyQihyKSwgRjJCKGcpLCBGMkIoYikpOworfQorCisv
LyBEZXRlcm1pbmUgdGhlIHRvdGFsIG51bWJlciBvZiBzdG9wcyBuZWVkZWQsIGluY2x1ZGluZyBw
c2V1ZG8tc3RvcHMgYXQgdGhlCisvLyBlbmRzIGFzIG5lY2Vzc2FyeS4KK3N0YXRpYyBzaXplX3Qg
dG90YWxTdG9wc05lZWRlZChjb25zdCBHcmFkaWVudDo6Q29sb3JTdG9wKiBzdG9wRGF0YSwgc2l6
ZV90IGNvdW50KQoreworICAgIGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AqIHN0b3AgPSBzdG9w
RGF0YTsKKyAgICBzaXplX3QgY291bnRVc2VkID0gY291bnQ7CisgICAgaWYgKGNvdW50IDwgMSB8
fCBzdG9wLT5zdG9wID4gMC4wKQorICAgICAgICBjb3VudFVzZWQrKzsKKyAgICBzdG9wICs9IGNv
dW50IC0gMTsKKyAgICBpZiAoY291bnQgPCAyIHx8IHN0b3AtPnN0b3AgPCAxLjApCisgICAgICAg
IGNvdW50VXNlZCsrOworICAgIHJldHVybiBjb3VudFVzZWQ7Cit9CisKKy8vIENvbGxlY3Qgc29y
dGVkIHN0b3AgcG9zaXRpb24gYW5kIGNvbG9yIGluZm9ybWF0aW9uIGludG8gdGhlIHBvcyBhbmQg
Y29sb3JzIAorLy8gYnVmZmVycywgZW5zdXJpbmcgc3RvcHMgYXQgYm90aCAwLjAgYW5kIDEuMC4g
IFRoZSBidWZmZXJzIG11c3QgYmUgbGFyZ2UKKy8vIGVub3VnaCB0byBob2xkIGluZm9ybWF0aW9u
IGZvciBhbGwgc3RvcHMsIGluY2x1ZGluZyB0aGUgbmV3IGVuZHBvaW50cyBpZgorLy8gc3RvcHMg
YXQgMC4wIGFuZCAxLjAgYXJlbid0IGFscmVhZHkgaW5jbHVkZWQuCitzdGF0aWMgdm9pZCBmaWxs
U3RvcHMoY29uc3QgR3JhZGllbnQ6OkNvbG9yU3RvcCogc3RvcERhdGEsCisgICAgICAgICAgICAg
ICAgICAgICAgIHNpemVfdCBjb3VudCwgU2tTY2FsYXIqIHBvcywgU2tDb2xvciogY29sb3JzKQor
eyAKKyAgICBjb25zdCBHcmFkaWVudDo6Q29sb3JTdG9wKiBzdG9wID0gc3RvcERhdGE7CisgICAg
c2l6ZV90IHN0YXJ0ID0gMDsKKyAgICBpZiAoY291bnQgPCAxKSB7CisgICAgICAgIC8vIEEgZ3Jh
ZGllbnQgd2l0aCBubyBzdG9wcyBtdXN0IGJlIHRyYW5zcGFyZW50IGJsYWNrLgorICAgICAgICBw
b3NbMF0gPSBXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKDAuMCk7CisgICAgICAgIGNvbG9yc1swXSA9
IG1ha2VTa0NvbG9yKDAuMCwgMC4wLCAwLjAsIDAuMCk7CisgICAgICAgIHN0YXJ0ID0gMTsKKyAg
ICB9IGVsc2UgaWYgKHN0b3AtPnN0b3AgPiAwLjApIHsKKyAgICAgICAgLy8gQ29weSB0aGUgZmly
c3Qgc3RvcCB0byAwLjAuIFRoZSBmaXJzdCBzdG9wIHBvc2l0aW9uIG1heSBoYXZlIGEgc2xpZ2h0
CisgICAgICAgIC8vIHJvdW5kaW5nIGVycm9yLCBidXQgd2UgZG9uJ3QgY2FyZSBpbiB0aGlzIGZs
b2F0IGNvbXBhcmlzb24sIHNpbmNlCisgICAgICAgIC8vIDAuMCBjb21lcyB0aHJvdWdoIGNsZWFu
bHkgYW5kIHBlb3BsZSBhcmVuJ3QgbGlrZWx5IHRvIHdhbnQgYSBncmFkaWVudAorICAgICAgICAv
LyB3aXRoIGEgc3RvcCBhdCAoMCArIGVwc2lsb24pLgorICAgICAgICBwb3NbMF0gPSBXZWJDb3Jl
RmxvYXRUb1NrU2NhbGFyKDAuMCk7CisgICAgICAgIGNvbG9yc1swXSA9IG1ha2VTa0NvbG9yKHN0
b3AtPmFscGhhLCBzdG9wLT5yZWQsIHN0b3AtPmdyZWVuLCBzdG9wLT5ibHVlKTsKKyAgICAgICAg
c3RhcnQgPSAxOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSBzdGFydDsgaSA8IHN0YXJ0
ICsgY291bnQ7IGkrKykgeworICAgICAgICBwb3NbaV0gPSBXZWJDb3JlRmxvYXRUb1NrU2NhbGFy
KHN0b3AtPnN0b3ApOworICAgICAgICBjb2xvcnNbaV0gPSBtYWtlU2tDb2xvcihzdG9wLT5hbHBo
YSwgc3RvcC0+cmVkLCBzdG9wLT5ncmVlbiwgc3RvcC0+Ymx1ZSk7CisgICAgICAgICsrc3RvcDsK
KyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBsYXN0IHN0b3AgdG8gMS4wIGlmIG5lZWRlZC4gIFNl
ZSBjb21tZW50IGFib3ZlIGFib3V0IHRoaXMgZmxvYXQKKyAgICAvLyBjb21wYXJpc29uLgorICAg
IGlmIChjb3VudCA8IDEgfHwgKC0tc3RvcCktPnN0b3AgPCAxLjApIHsKKyAgICAgICAgcG9zW3N0
YXJ0ICsgY291bnRdID0gV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcigxLjApOworICAgICAgICBjb2xv
cnNbc3RhcnQgKyBjb3VudF0gPSBjb2xvcnNbc3RhcnQgKyBjb3VudCAtIDFdOworICAgIH0KK30K
Kworc3RhdGljIGlubGluZSBib29sIGNvbXBhcmVTdG9wcyhjb25zdCBHcmFkaWVudDo6Q29sb3JT
dG9wJiBhLCBjb25zdCBHcmFkaWVudDo6Q29sb3JTdG9wJiBiKQoreworICAgIHJldHVybiBhLnN0
b3AgPCBiLnN0b3A7Cit9CisKK1NrU2hhZGVyKiBHcmFkaWVudDo6cGxhdGZvcm1HcmFkaWVudCgp
Cit7CisgICAgaWYgKG1fZ3JhZGllbnQpCisgICAgICAgIHJldHVybiBtX2dyYWRpZW50OworCisg
ICAgLy8gRklYTUU6IFRoaXMgYW5kIGNvbXBhcmVTdG9wcygpIGFyZSBhbHNvIGluIEdyYWRpZW50
LmNwcCBhbmQKKyAgICAvLyBDU1NHcmFkaWVudFZhbHVlLmNwcDsgcHJvYmFibHkgc2hvdWxkIHJl
ZmFjdG9yIGluIFdlYktpdC4KKyAgICBpZiAoIW1fc3RvcHNTb3J0ZWQpIHsKKyAgICAgICAgaWYg
KG1fc3RvcHMuc2l6ZSgpKQorICAgICAgICAgICAgc3RkOjpzdGFibGVfc29ydChtX3N0b3BzLmJl
Z2luKCksIG1fc3RvcHMuZW5kKCksIGNvbXBhcmVTdG9wcyk7CisgICAgICAgIG1fc3RvcHNTb3J0
ZWQgPSB0cnVlOworICAgIH0KKyAgICBzaXplX3QgY291bnRVc2VkID0gdG90YWxTdG9wc05lZWRl
ZChtX3N0b3BzLmRhdGEoKSwgbV9zdG9wcy5zaXplKCkpOworICAgIEFTU0VSVChjb3VudFVzZWQg
Pj0gMik7CisgICAgQVNTRVJUKGNvdW50VXNlZCA+PSBtX3N0b3BzLnNpemUoKSk7CisKKyAgICAv
LyBGSVhNRTogV2h5IGlzIGFsbCB0aGlzIG1hbnVhbCBwb2ludGVyIG1hdGggbmVlZGVkPyEKKyAg
ICBTa0F1dG9NYWxsb2Mgc3RvcmFnZShjb3VudFVzZWQgKiAoc2l6ZW9mKFNrQ29sb3IpICsgc2l6
ZW9mKFNrU2NhbGFyKSkpOworICAgIFNrQ29sb3IqIGNvbG9ycyA9IChTa0NvbG9yKilzdG9yYWdl
LmdldCgpOworICAgIFNrU2NhbGFyKiBwb3MgPSAoU2tTY2FsYXIqKShjb2xvcnMgKyBjb3VudFVz
ZWQpOworCisgICAgZmlsbFN0b3BzKG1fc3RvcHMuZGF0YSgpLCBtX3N0b3BzLnNpemUoKSwgcG9z
LCBjb2xvcnMpOworCisgICAgaWYgKG1fcmFkaWFsKSB7CisgICAgICAgIC8vIEZJWE1FOiBDU1Mg
cmFkaWFsIEdyYWRpZW50cyBhbGxvdyBhbiBvZmZzZXQgZm9jYWwgcG9pbnQgKHRoZQorICAgICAg
ICAvLyAic3RhcnQgY2lyY2xlIiksIGJ1dCBza2lhIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHRo
YXQsIHNvIHRoaXMganVzdAorICAgICAgICAvLyBpZ25vcmVzIG1fcDAvbV9yMCBhbmQgZHJhd3Mg
dGhlIGdyYWRpZW50IGNlbnRlcmVkIGluIHRoZSAiZW5kCisgICAgICAgIC8vIGNpcmNsZSIgKG1f
cDEvbV9yMSkuCisgICAgICAgIC8vIFNlZSBodHRwOi8vd2Via2l0Lm9yZy9ibG9nLzE3NS9pbnRy
b2R1Y2luZy1jc3MtZ3JhZGllbnRzLyBmb3IgYQorICAgICAgICAvLyBkZXNjcmlwdGlvbiBvZiB0
aGUgZXhwZWN0ZWQgYmVoYXZpb3IuCisgICAgICAgIG1fZ3JhZGllbnQgPSBTa0dyYWRpZW50U2hh
ZGVyOjpDcmVhdGVSYWRpYWwobV9wMSwKKyAgICAgICAgICAgIFdlYkNvcmVGbG9hdFRvU2tTY2Fs
YXIobV9yMSksIGNvbG9ycywgcG9zLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihjb3Vu
dFVzZWQpLCBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAg
ICBTa1BvaW50IHB0c1syXSA9IHsgbV9wMCwgbV9wMSB9OworICAgICAgICBtX2dyYWRpZW50ID0g
U2tHcmFkaWVudFNoYWRlcjo6Q3JlYXRlTGluZWFyKHB0cywgY29sb3JzLCBwb3MsCisgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxpbnQ+KGNvdW50VXNlZCksIFNrU2hhZGVyOjprQ2xhbXBfVGlsZU1v
ZGUpOworICAgIH0KKworICAgIHJldHVybiBtX2dyYWRpZW50OworfQorCit2b2lkIEdyYWRpZW50
OjpmaWxsKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgRmxvYXRSZWN0JiByZWN0KQor
eworICAgIGNvbnRleHQtPnNldEZpbGxHcmFkaWVudCh0aGlzKTsKKyAgICBjb250ZXh0LT5maWxs
UmVjdChyZWN0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzQ29udGV4dFBsYXRm
b3JtUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NzM4ZjQK
LS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHly
aWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmli
dXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICog
IkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEdy
YXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZV9oCisjZGVmaW5lIEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZV9oCisKKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKworY2xhc3Mg
UGxhdGZvcm1Db250ZXh0U2tpYTsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBUaGlzIGNs
YXNzIGp1c3QgaG9sZHMgb250byBhIFBsYXRmb3JtQ29udGV4dFNraWEgZm9yIEdyYXBoaWNzQ29u
dGV4dC4KK2NsYXNzIEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZSA6IE5vbmNvcHlhYmxl
IHsKK3B1YmxpYzoKKyAgICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoUGxhdGZvcm1D
b250ZXh0U2tpYSogcGxhdGZvcm1Db250ZXh0KQorICAgICAgICA6IG1fY29udGV4dChwbGF0Zm9y
bUNvbnRleHQpIHsgfQorCisgICAgUGxhdGZvcm1Db250ZXh0U2tpYSogY29udGV4dCgpIHsgcmV0
dXJuIG1fY29udGV4dDsgfQorCitwcml2YXRlOgorICAgIC8vIE5vbi1vd25pbmcgcG9pbnRlciB0
byB0aGUgUGxhdGZvcm1Db250ZXh0LgorICAgIFBsYXRmb3JtQ29udGV4dFNraWEqIG1fY29udGV4
dDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAgLy8gR3JhcGhpY3ND
b250ZXh0UGxhdGZvcm1Qcml2YXRlX2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26533</attachid>
            <date>2009-01-08 14:05:43 -0800</date>
            <delta_ts>2009-01-08 14:05:43 -0800</delta_ts>
            <desc>Add a cleaned-up GraphicsContextSkia implementation to WebKit</desc>
            <filename>Add-a-cleaned-up-GraphicsContextSkia-implementation-to-WebKit.patch</filename>
            <type>text/plain</type>
            <size>38954</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">ODVhYzQ2ZmZiNWExYWI2Zjc3YzA4ZWVhYTY4ODc0ZTVhYzJlYzEzOQpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAxNjIyNjdjLi5jNmJjOTRm
IDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpA
QCAtMSwzICsxLDY0IEBACisyMDA5LTAxLTA4ICBEaW1pdHJpIEdsYXprb3YgIDxkZ2xhemtvdkBj
aHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwuCisKKyAgICAg
ICAgQWRkIGEgY2xlYW5lZC11cCBHcmFwaGljc0NvbnRleHRTa2lhIGltcGxlbWVudGF0aW9uIHRv
IFdlYktpdC4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTIzMTkxCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzQ29udGV4
dFNraWEuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6Oik6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQ6On5HcmFwaGljc0NvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0OjpwbGF0Zm9ybUNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0OjpzYXZlUGxhdGZvcm1TdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQ6OnJlc3RvcmVQbGF0Zm9ybVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDo6YmVnaW5UcmFuc3BhcmVuY3lMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQ6OmVuZFRyYW5zcGFyZW5jeUxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDo6YWRkSW5uZXJSb3VuZGVkUmVjdENsaXApOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0OjphZGRQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDo6YmVnaW5QYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDo6Y2xlYXJQbGF0Zm9ybVNoYWRvdyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQ6OmNsZWFyUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmNsaXAp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dEVsbGlwc2VJblJlY3QpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpjbGlwUGF0aCk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQ6OmNsaXBUb0ltYWdlQnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDo6Y29uY2F0Q1RNKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDo6ZHJhd0NvbnZleFBvbHlnb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0OjpkcmF3RWxsaXBzZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6
OmRyYXdGb2N1c1JpbmcpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3
TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yTWlz
c3BlbGxpbmdPckJhZEdyYW1tYXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
OjpkcmF3TGluZUZvclRleHQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojpk
cmF3UmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmZpbGxQYXRoKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpmaWxsUm91bmRlZFJlY3QpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0OjpnZXRDVE0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0Ojpyb3VuZFRvRGV2aWNlUGl4ZWxzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDo6c2NhbGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojpz
ZXRBbHBoYSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldENvbXBvc2l0
ZU9wZXJhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldEltYWdl
SW50ZXJwb2xhdGlvblF1YWxpdHkpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
OjpzZXRMaW5lQ2FwKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0TGlu
ZURhc2gpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lSm9pbik6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldE1pdGVyTGltaXQpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybUZpbGxDb2xvcik6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU2hhZG93KToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VDb2xvcik6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlU3R5
bGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9r
ZVRoaWNrbmVzcyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRm
b3JtVGV4dERyYXdpbmdNb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6
c2V0VVJMRm9yUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldFVz
ZUFudGlhbGlhc2luZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnN0cm9r
ZUFyYyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVBhdGgpOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzdHJva2VSZWN0KToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6cm90YXRlKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDo6dHJhbnNsYXRlKToKKwogMjAwOS0wMS0wOCAgRGF2aWQgSHlhdHQgIDxo
eWF0dEBhcHBsZS5jb20+CiAKICAgICAgICAgRml4IGZvciA8cmRhcjovL3Byb2JsZW0vNjQ2NTY4
Mj4gUkVHUkVTU0lPTjogSW4gTWFpbCwgY2FuJ3QgZm9yY2UgYSBtZXNzYWdlIHRvIGF1dG8gc2Ny
b2xsLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNz
Q29udGV4dFNraWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNz
Q29udGV4dFNraWEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MjEz
OGYKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3Jh
cGhpY3NDb250ZXh0U2tpYS5jcHAKQEAgLTAsMCArMSwxMTIyIEBACisvKgorICogQ29weXJpZ2h0
IChjKSAyMDA2LCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlv
bi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1l
cyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMg
SVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisg
KiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKworI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dFByaXZh
dGUuaCIKKyNpbmNsdWRlICJDb2xvci5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1
ZGUgIkdyYWRpZW50LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIk5hdGl2ZUlt
YWdlU2tpYS5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZv
cm1Db250ZXh0U2tpYS5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisKKyNp
bmNsdWRlICJTa0JpdG1hcC5oIgorI2luY2x1ZGUgIlNrQmx1ckRyYXdMb29wZXIuaCIKKyNpbmNs
dWRlICJTa0Nvcm5lclBhdGhFZmZlY3QuaCIKKyNpbmNsdWRlICJza2lhL2V4dC9wbGF0Zm9ybV9j
YW52YXMuaCIKKyNpbmNsdWRlICJTa2lhVXRpbHMuaCIKKyNpbmNsdWRlICJTa1NoYWRlci5oIgor
CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVk
ZSA8d3RmL01hdGhFeHRyYXMuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCituYW1lc3BhY2UgeworCisvLyAiU2VhdGJlbHQiIGZ1bmN0aW9ucyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisv
LyBUaGVzZSBmdW5jdGlvbnMgY2hlY2sgY2VydGFpbiBncmFwaGljcyBwcmltaXRpdmVzIGZvciBi
ZWluZyAic2FmZSIuCisvLyBTa2lhIGhhcyBoaXN0b3JpY2FsbHkgY3Jhc2hlZCB3aGVuIHNlbnQg
Y3JhenkgZGF0YS4gVGhlc2UgZnVuY3Rpb25zIGRvCisvLyBhZGRpdGlvbmFsIGNoZWNraW5nIHRv
IHByZXZlbnQgY3Jhc2hlcy4KKy8vCisvLyBJZGVhbGx5LCBhbGwgb2YgdGhlc2Ugd291bGQgYmUg
Zml4ZWQgaW4gdGhlIGdyYXBoaWNzIGxheWVyIGFuZCB3ZSB3b3VsZCBub3QKKy8vIGhhdmUgdG8g
ZG8gYW55IGNoZWNraW5nLiBZb3UgY2FuIHVuY29tbWVudCB0aGUgRU5TVVJFX1ZBTFVFX1NBRkVU
WV9GT1JfU0tJQQorLy8gZmxhZyB0byBjaGVjayB0aGUgZ3JhcGhpY3MgbGF5ZXIuCisjZGVmaW5l
IEVOU1VSRV9WQUxVRV9TQUZFVFlfRk9SX1NLSUEKKworc3RhdGljIGJvb2wgaXNDb29yZGluYXRl
U2tpYVNhZmUoZmxvYXQgY29vcmQpCit7CisjaWZkZWYgRU5TVVJFX1ZBTFVFX1NBRkVUWV9GT1Jf
U0tJQQorICAgIC8vIEZpcnN0IGNoZWNrIGZvciB2YWxpZCBmbG9hdHMuCisjaWYgZGVmaW5lZChf
TVNDX1ZFUikKKyAgICBpZiAoIV9maW5pdGUoY29vcmQpKQorI2Vsc2UKKyAgICBpZiAoIWZpbml0
ZShjb29yZCkpCisjZW5kaWYKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gU2tpYSB1
c2VzIDE2LjE2IGZpeGVkIHBvaW50IGFuZCAyNi42IGZpeGVkIHBvaW50IGluIHZhcmlvdXMgcGxh
Y2VzLiBJZgorICAgIC8vIHRoZSB0cmFuc2Zvcm1lZCBwb2ludCBleGNlZWRzIDE1IGJpdHMsIHdl
IGp1c3QgZGVjbGFyZSB0aGF0IGl0J3MKKyAgICAvLyB1bnJlYXNvbmFibGUgdG8gY2F0Y2ggYm90
aCBvZiB0aGVzZSBjYXNlcy4KKyAgICBzdGF0aWMgY29uc3QgaW50IG1heFBvaW50TWFnbml0dWRl
ID0gMzI3Njc7CisgICAgaWYgKGNvb3JkID4gbWF4UG9pbnRNYWduaXR1ZGUgfHwgY29vcmQgPCAt
bWF4UG9pbnRNYWduaXR1ZGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0
cnVlOworI2Vsc2UKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorfQorCitzdGF0aWMgYm9vbCBp
c1BvaW50U2tpYVNhZmUoY29uc3QgU2tNYXRyaXgmIHRyYW5zZm9ybSwgY29uc3QgU2tQb2ludCYg
cHQpCit7CisjaWZkZWYgRU5TVVJFX1ZBTFVFX1NBRkVUWV9GT1JfU0tJQQorICAgIC8vIE5vdyBj
aGVjayBmb3IgcG9pbnRzIHRoYXQgd2lsbCBvdmVyZmxvdy4gV2UgY2hlY2sgdGhlICp0cmFuc2Zv
cm1lZCoKKyAgICAvLyBwb2ludHMgc2luY2UgdGhpcyBpcyB3aGF0IHdpbGwgYmUgcmFzdGVyaXpl
ZC4KKyAgICBTa1BvaW50IHhQdDsKKyAgICB0cmFuc2Zvcm0ubWFwUG9pbnRzKCZ4UHQsICZwdCwg
MSk7CisgICAgcmV0dXJuIGlzQ29vcmRpbmF0ZVNraWFTYWZlKHhQdC5mWCkgJiYgaXNDb29yZGlu
YXRlU2tpYVNhZmUoeFB0LmZZKTsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30K
Kworc3RhdGljIGJvb2wgaXNSZWN0U2tpYVNhZmUoY29uc3QgU2tNYXRyaXgmIHRyYW5zZm9ybSwg
Y29uc3QgU2tSZWN0JiByYykKK3sKKyNpZmRlZiBFTlNVUkVfVkFMVUVfU0FGRVRZX0ZPUl9TS0lB
CisgICAgU2tQb2ludCB0b3BsZWZ0ID0ge3JjLmZMZWZ0LCByYy5mVG9wfTsKKyAgICBTa1BvaW50
IGJvdHRvbXJpZ2h0ID0ge3JjLmZSaWdodCwgcmMuZkJvdHRvbX07CisgICAgcmV0dXJuIGlzUG9p
bnRTa2lhU2FmZSh0cmFuc2Zvcm0sIHRvcGxlZnQpICYmIGlzUG9pbnRTa2lhU2FmZSh0cmFuc2Zv
cm0sIGJvdHRvbXJpZ2h0KTsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKwor
Ym9vbCBpc1BhdGhTa2lhU2FmZShjb25zdCBTa01hdHJpeCYgdHJhbnNmb3JtLCBjb25zdCBTa1Bh
dGgmIHBhdGgpCit7CisjaWZkZWYgRU5TVVJFX1ZBTFVFX1NBRkVUWV9GT1JfU0tJQQorICAgIFNr
UG9pbnQgY3VycmVudF9wb2ludHNbNF07CisgICAgU2tQYXRoOjpJdGVyIGl0ZXIocGF0aCwgZmFs
c2UpOworICAgIGZvciAoU2tQYXRoOjpWZXJiIHZlcmIgPSBpdGVyLm5leHQoY3VycmVudF9wb2lu
dHMpOworICAgICAgICAgdmVyYiAhPSBTa1BhdGg6OmtEb25lX1ZlcmI7CisgICAgICAgICB2ZXJi
ID0gaXRlci5uZXh0KGN1cnJlbnRfcG9pbnRzKSkgeworICAgICAgICBzd2l0Y2ggKHZlcmIpIHsK
KyAgICAgICAgY2FzZSBTa1BhdGg6OmtNb3ZlX1ZlcmI6CisgICAgICAgICAgICAvLyBUaGlzIG1v
dmUgd2lsbCBiZSBkdXBsaWNhdGVkIGluIHRoZSBuZXh0IHZlcmIsIHNvIHdlIGNhbiBpZ25vcmUu
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtMaW5lX1ZlcmI6Cisg
ICAgICAgICAgICAvLyBpdGVyLm5leHQgcmV0dXJucyAyIHBvaW50cy4KKyAgICAgICAgICAgIGlm
ICghaXNQb2ludFNraWFTYWZlKHRyYW5zZm9ybSwgY3VycmVudF9wb2ludHNbMF0pCisgICAgICAg
ICAgICAgICAgfHwgIWlzUG9pbnRTa2lhU2FmZSh0cmFuc2Zvcm0sIGN1cnJlbnRfcG9pbnRzWzFd
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBTa1BhdGg6OmtRdWFkX1ZlcmI6CisgICAgICAgICAgICAvLyBpdGVyLm5leHQg
cmV0dXJucyAzIHBvaW50cy4KKyAgICAgICAgICAgIGlmICghaXNQb2ludFNraWFTYWZlKHRyYW5z
Zm9ybSwgY3VycmVudF9wb2ludHNbMF0pCisgICAgICAgICAgICAgICAgfHwgIWlzUG9pbnRTa2lh
U2FmZSh0cmFuc2Zvcm0sIGN1cnJlbnRfcG9pbnRzWzFdKQorICAgICAgICAgICAgICAgIHx8ICFp
c1BvaW50U2tpYVNhZmUodHJhbnNmb3JtLCBjdXJyZW50X3BvaW50c1syXSkpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQ
YXRoOjprQ3ViaWNfVmVyYjoKKyAgICAgICAgICAgIC8vIGl0ZXIubmV4dCByZXR1cm5zIDQgcG9p
bnRzLgorICAgICAgICAgICAgaWYgKCFpc1BvaW50U2tpYVNhZmUodHJhbnNmb3JtLCBjdXJyZW50
X3BvaW50c1swXSkKKyAgICAgICAgICAgICAgICB8fCAhaXNQb2ludFNraWFTYWZlKHRyYW5zZm9y
bSwgY3VycmVudF9wb2ludHNbMV0pCisgICAgICAgICAgICAgICAgfHwgIWlzUG9pbnRTa2lhU2Fm
ZSh0cmFuc2Zvcm0sIGN1cnJlbnRfcG9pbnRzWzJdKQorICAgICAgICAgICAgICAgIHx8ICFpc1Bv
aW50U2tpYVNhZmUodHJhbnNmb3JtLCBjdXJyZW50X3BvaW50c1szXSkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQYXRo
OjprQ2xvc2VfVmVyYjoKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtEb25lX1ZlcmI6CisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1
cm4gdHJ1ZTsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworLy8gTG9jYWwg
aGVscGVyIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KKwordm9pZCBhZGRDb3JuZXJBcmMoU2tQYXRoKiBwYXRoLCBjb25zdCBT
a1JlY3QmIHJlY3QsIGNvbnN0IEludFNpemUmIHNpemUsIGludCBzdGFydEFuZ2xlKQoreworICAg
IFNrSVJlY3QgaXI7CisgICAgaW50IHJ4ID0gU2tNaW4zMihTa1NjYWxhclJvdW5kKHJlY3Qud2lk
dGgoKSksIHNpemUud2lkdGgoKSk7CisgICAgaW50IHJ5ID0gU2tNaW4zMihTa1NjYWxhclJvdW5k
KHJlY3QuaGVpZ2h0KCkpLCBzaXplLmhlaWdodCgpKTsKKworICAgIGlyLnNldCgtcngsIC1yeSwg
cngsIHJ5KTsKKyAgICBzd2l0Y2ggKHN0YXJ0QW5nbGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAg
IGlyLm9mZnNldChyZWN0LmZSaWdodCAtIGlyLmZSaWdodCwgcmVjdC5mQm90dG9tIC0gaXIuZkJv
dHRvbSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgOTA6CisgICAgICAgIGlyLm9mZnNldChy
ZWN0LmZMZWZ0IC0gaXIuZkxlZnQsIHJlY3QuZkJvdHRvbSAtIGlyLmZCb3R0b20pOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIDE4MDoKKyAgICAgICAgaXIub2Zmc2V0KHJlY3QuZkxlZnQgLSBp
ci5mTGVmdCwgcmVjdC5mVG9wIC0gaXIuZlRvcCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
MjcwOgorICAgICAgICBpci5vZmZzZXQocmVjdC5mUmlnaHQgLSBpci5mUmlnaHQsIHJlY3QuZlRv
cCAtIGlyLmZUb3ApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NF
UlQoMCk7CisgICAgfQorCisgICAgU2tSZWN0IHI7CisgICAgci5zZXQoaXIpOworICAgIHBhdGgt
PmFyY1RvKHIsIFNrSW50VG9TY2FsYXIoc3RhcnRBbmdsZSksIFNrSW50VG9TY2FsYXIoOTApLCBm
YWxzZSk7Cit9CisKK2lubGluZSBpbnQgZmFzdE1vZChpbnQgdmFsdWUsIGludCBtYXgpCit7Cisg
ICAgaW50IHNpZ24gPSBTa0V4dHJhY3RTaWduKHZhbHVlKTsKKworICAgIHZhbHVlID0gU2tBcHBs
eVNpZ24odmFsdWUsIHNpZ24pOworICAgIGlmICh2YWx1ZSA+PSBtYXgpCisgICAgICAgIHZhbHVl
ICU9IG1heDsKKyAgICByZXR1cm4gU2tBcHBseVNpZ24odmFsdWUsIHNpZ24pOworfQorCitpbmxp
bmUgZmxvYXQgc3F1YXJlKGZsb2F0IG4pCit7CisgICAgcmV0dXJuIG4gKiBuOworfQorCit9ICAv
LyBuYW1lc3BhY2UKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBtYXkgYmUg
Y2FsbGVkIHdpdGggYSBOVUxMIHBvaW50ZXIgdG8gY3JlYXRlIGEgZ3JhcGhpY3MgY29udGV4dCB0
aGF0IGhhcworLy8gbm8gcGFpbnRpbmcuCitHcmFwaGljc0NvbnRleHQ6OkdyYXBoaWNzQ29udGV4
dChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogZ2MpCisgICAgOiBtX2NvbW1vbihjcmVhdGVHcmFw
aGljc0NvbnRleHRQcml2YXRlKCkpCisgICAgLCBtX2RhdGEobmV3IEdyYXBoaWNzQ29udGV4dFBs
YXRmb3JtUHJpdmF0ZShnYykpCit7CisgICAgc2V0UGFpbnRpbmdEaXNhYmxlZCghZ2MgfHwgIXBs
YXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKSk7Cit9CisKK0dyYXBoaWNzQ29udGV4dDo6fkdyYXBo
aWNzQ29udGV4dCgpCit7CisgICAgZGVsZXRlIG1fZGF0YTsKKyAgICB0aGlzLT5kZXN0cm95R3Jh
cGhpY3NDb250ZXh0UHJpdmF0ZShtX2NvbW1vbik7Cit9CisKK1BsYXRmb3JtR3JhcGhpY3NDb250
ZXh0KiBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3JtQ29udGV4dCgpIGNvbnN0Cit7CisgICAgQVNT
RVJUKCFwYWludGluZ0Rpc2FibGVkKCkpOworICAgIHJldHVybiBtX2RhdGEtPmNvbnRleHQoKTsK
K30KKworLy8gU3RhdGUgc2F2aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNh
dmVQbGF0Zm9ybVN0YXRlKCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICAvLyBTYXZlIG91ciBwcml2YXRlIFN0YXRlLgorICAgIHBsYXRmb3Jt
Q29udGV4dCgpLT5zYXZlKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZXN0b3JlUGxh
dGZvcm1TdGF0ZSgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gUmVzdG9yZSBvdXIgcHJpdmF0ZSBTdGF0ZS4KKyAgICBwbGF0Zm9ybUNv
bnRleHQoKS0+cmVzdG9yZSgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5UcmFu
c3BhcmVuY3lMYXllcihmbG9hdCBvcGFjaXR5KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIG5lZWQgdGhlICJhbHBoYSIgbGF5ZXIg
ZmxhZyBoZXJlIGJlY2F1c2UgdGhlIGJhc2UgbGF5ZXIgaXMgb3BhcXVlCisgICAgLy8gKHRoZSBz
dXJmYWNlIG9mIHRoZSBwYWdlKSBidXQgbGF5ZXJzIG9uIHRvcCBtYXkgaGF2ZSB0cmFuc3BhcmVu
dCBwYXJ0cy4KKyAgICAvLyBXaXRob3V0IGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgYWxwaGEgZmxh
ZywgdGhlIGxheWVyIHdpbGwgaW5oZXJpdCB0aGUKKyAgICAvLyBvcGFxdWUgc2V0dGluZyBvZiB0
aGUgYmFzZSBhbmQgc29tZSB0aGluZ3Mgd29uJ3Qgd29yayBwcm9wZXJseS4KKyAgICBwbGF0Zm9y
bUNvbnRleHQoKS0+Y2FudmFzKCktPnNhdmVMYXllckFscGhhKAorICAgICAgICAwLAorICAgICAg
ICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihvcGFjaXR5ICogMjU1KSwKKyAgICAgICAgc3Rh
dGljX2Nhc3Q8U2tDYW52YXM6OlNhdmVGbGFncz4oU2tDYW52YXM6OmtIYXNBbHBoYUxheWVyX1Nh
dmVGbGFnIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tDYW52
YXM6OmtGdWxsQ29sb3JMYXllcl9TYXZlRmxhZykpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6ZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKworI2lmIFBMQVRGT1JNKFdJTl9PUykKKyAgICBwbGF0Zm9ybUNv
bnRleHQoKS0+Y2FudmFzKCktPmdldFRvcFBsYXRmb3JtRGV2aWNlKCkuCisgICAgICAgIGZpeHVw
QWxwaGFCZWZvcmVDb21wb3NpdGluZygpOworI2VuZGlmCisgICAgcGxhdGZvcm1Db250ZXh0KCkt
PmNhbnZhcygpLT5yZXN0b3JlKCk7Cit9CisKKy8vIEdyYXBoaWNzIHByaW1pdGl2ZXMgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0Q2xpcChjb25zdCBJbnRSZWN0
JiByZWN0LCBpbnQgdGhpY2tuZXNzKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIFNrUmVjdCByKHJlY3QpOworICAgIGlmICghaXNSZWN0U2tp
YVNhZmUoZ2V0Q1RNKCksIHIpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1BhdGggcGF0aDsK
KyAgICBwYXRoLmFkZE92YWwociwgU2tQYXRoOjprQ1dfRGlyZWN0aW9uKTsKKyAgICAvLyBvbmx5
IHBlcmZvcm0gdGhlIGluc2V0IGlmIHdlIHdvbid0IGludmVydCByCisgICAgaWYgKDIgKiB0aGlj
a25lc3MgPCByZWN0LndpZHRoKCkgJiYgMiAqIHRoaWNrbmVzcyA8IHJlY3QuaGVpZ2h0KCkpIHsK
KyAgICAgICAgci5pbnNldChTa0ludFRvU2NhbGFyKHRoaWNrbmVzcykgLFNrSW50VG9TY2FsYXIo
dGhpY2tuZXNzKSk7CisgICAgICAgIHBhdGguYWRkT3ZhbChyLCBTa1BhdGg6OmtDQ1dfRGlyZWN0
aW9uKTsKKyAgICB9CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5jbGlwUGF0aChw
YXRoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmFkZFBhdGgoY29uc3QgUGF0aCYgcGF0
aCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAg
cGxhdGZvcm1Db250ZXh0KCktPmFkZFBhdGgoKnBhdGgucGxhdGZvcm1QYXRoKCkpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6YmVnaW5QYXRoKCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmJlZ2luUGF0
aCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJQbGF0Zm9ybVNoYWRvdygpCit7
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHBsYXRm
b3JtQ29udGV4dCgpLT5zZXREcmF3TG9vcGVyKDApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6Y2xlYXJSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdE
aXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1JlY3QgciA9IHJlY3Q7CisgICAg
aWYgKCFpc1JlY3RTa2lhU2FmZShnZXRDVE0oKSwgcikpCisgICAgICAgIENsaXBSZWN0VG9DYW52
YXMoKnBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKSwgciwgJnIpOworCisgICAgU2tQYWludCBw
YWludDsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0dXBQYWludEZvckZpbGxpbmcoJnBhaW50
KTsKKyAgICBwYWludC5zZXRQb3J0ZXJEdWZmWGZlcm1vZGUoU2tQb3J0ZXJEdWZmOjprQ2xlYXJf
TW9kZSk7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3UmVjdChyLCBwYWlu
dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IEZsb2F0UmVjdCYgcmVj
dCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBTa1JlY3QgcihyZWN0KTsKKyAgICBpZiAoIWlzUmVjdFNraWFTYWZlKGdldENUTSgpLCByKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5jbGlw
UmVjdChyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3QgUGF0aCYgcGF0
aCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBjb25zdCBTa1BhdGgmIHAgPSAqcGF0aC5wbGF0Zm9ybVBhdGgoKTsKKyAgICBpZiAoIWlzUGF0
aFNraWFTYWZlKGdldENUTSgpLCBwKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGxhdGZvcm1D
b250ZXh0KCktPmNhbnZhcygpLT5jbGlwUGF0aChwKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmNsaXBPdXQoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1JlY3QgcihyZWN0KTsKKyAgICBpZiAo
IWlzUmVjdFNraWFTYWZlKGdldENUTSgpLCByKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGxh
dGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5jbGlwUmVjdChyLCBTa1JlZ2lvbjo6a0RpZmZlcmVu
Y2VfT3ApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcE91dChjb25zdCBQYXRoJiBw
KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IGNvbnN0IFNrUGF0aCYgcGF0aCA9ICpwLnBsYXRmb3JtUGF0aCgpOworICAgIGlmICghaXNQYXRo
U2tpYVNhZmUoZ2V0Q1RNKCksIHBhdGgpKQorICAgICAgICByZXR1cm47CisKKyAgICBwbGF0Zm9y
bUNvbnRleHQoKS0+Y2FudmFzKCktPmNsaXBQYXRoKHBhdGgsIFNrUmVnaW9uOjprRGlmZmVyZW5j
ZV9PcCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0RWxsaXBzZUluUmVjdChj
b25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIFNrUmVjdCBvdmFsKHJlY3QpOworICAgIGlmICghaXNSZWN0U2tp
YVNhZmUoZ2V0Q1RNKCksIG92YWwpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1BhdGggcGF0
aDsKKyAgICBwYXRoLmFkZE92YWwob3ZhbCwgU2tQYXRoOjprQ0NXX0RpcmVjdGlvbik7CisgICAg
cGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5jbGlwUGF0aChwYXRoLCBTa1JlZ2lvbjo6a0Rp
ZmZlcmVuY2VfT3ApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFBhdGgoV2luZFJ1
bGUgY2xpcFJ1bGUpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgY29uc3QgU2tQYXRoKiBvbGRQYXRoID0gcGxhdGZvcm1Db250ZXh0KCktPmN1
cnJlbnRQYXRoKCk7CisgICAgU2tQYXRoIHBhdGgoKm9sZFBhdGgpOworICAgIHBhdGguc2V0Rmls
bFR5cGUoY2xpcFJ1bGUgPT0gUlVMRV9FVkVOT0REID8gU2tQYXRoOjprRXZlbk9kZF9GaWxsVHlw
ZSA6IFNrUGF0aDo6a1dpbmRpbmdfRmlsbFR5cGUpOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5j
YW52YXMoKS0+Y2xpcFBhdGgocGF0aCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlw
VG9JbWFnZUJ1ZmZlcihjb25zdCBGbG9hdFJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1hZ2VCdWZmZXIqIGltYWdlQnVmZmVyKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZJ
WE1FOiBUaGlzIGlzIG5lZWRlZCBmb3IgaW1hZ2UgbWFza2luZyBhbmQgY29tcGxleCB0ZXh0IGZp
bGxzLgorICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpj
b25jYXRDVE0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHhmb3JtKQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBwbGF0Zm9ybUNvbnRleHQo
KS0+Y2FudmFzKCktPmNvbmNhdCh4Zm9ybSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpk
cmF3Q29udmV4UG9seWdvbihzaXplX3QgbnVtUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQqIHBvaW50cywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNob3VsZEFudGlhbGlhcykKK3sKKyAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobnVt
UG9pbnRzIDw9IDEpCisgICAgICAgIHJldHVybjsKKworICAgIFNrUGF0aCBwYXRoOworCisgICAg
cGF0aC5pbmNSZXNlcnZlKG51bVBvaW50cyk7CisgICAgcGF0aC5tb3ZlVG8oV2ViQ29yZUZsb2F0
VG9Ta1NjYWxhcihwb2ludHNbMF0ueCgpKSwKKyAgICAgICAgICAgICAgICBXZWJDb3JlRmxvYXRU
b1NrU2NhbGFyKHBvaW50c1swXS55KCkpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51
bVBvaW50czsgaSsrKSB7CisgICAgICAgIHBhdGgubGluZVRvKFdlYkNvcmVGbG9hdFRvU2tTY2Fs
YXIocG9pbnRzW2ldLngoKSksCisgICAgICAgICAgICAgICAgICAgIFdlYkNvcmVGbG9hdFRvU2tT
Y2FsYXIocG9pbnRzW2ldLnkoKSkpOworICAgIH0KKworICAgIGlmICghaXNQYXRoU2tpYVNhZmUo
Z2V0Q1RNKCksIHBhdGgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1BhaW50IHBhaW50Owor
ICAgIGlmIChmaWxsQ29sb3IoKS5hbHBoYSgpID4gMCkgeworICAgICAgICBwbGF0Zm9ybUNvbnRl
eHQoKS0+c2V0dXBQYWludEZvckZpbGxpbmcoJnBhaW50KTsKKyAgICAgICAgcGxhdGZvcm1Db250
ZXh0KCktPmNhbnZhcygpLT5kcmF3UGF0aChwYXRoLCBwYWludCk7CisgICAgfQorCisgICAgaWYg
KHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJva2UpIHsKKyAgICAgICAgcGFpbnQucmVzZXQoKTsKKyAg
ICAgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldHVwUGFpbnRGb3JTdHJva2luZygmcGFpbnQsIDAs
IDApOworICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPmRyYXdQYXRoKHBhdGgs
IHBhaW50KTsKKyAgICB9Cit9CisKKy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCB0byBkcmF3
IHRoZSBsaXR0bGUgY2lyY2xlcyB1c2VkIGluIGxpc3RzLgordm9pZCBHcmFwaGljc0NvbnRleHQ6
OmRyYXdFbGxpcHNlKGNvbnN0IEludFJlY3QmIGVsaXBzZVJlY3QpCit7CisgICAgaWYgKHBhaW50
aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2tSZWN0IHJlY3QgPSBlbGlw
c2VSZWN0OworICAgIGlmICghaXNSZWN0U2tpYVNhZmUoZ2V0Q1RNKCksIHJlY3QpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBTa1BhaW50IHBhaW50OworICAgIGlmIChmaWxsQ29sb3IoKS5hbHBo
YSgpID4gMCkgeworICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0dXBQYWludEZvckZpbGxp
bmcoJnBhaW50KTsKKyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3T3Zh
bChyZWN0LCBwYWludCk7CisgICAgfQorCisgICAgaWYgKHN0cm9rZVN0eWxlKCkgIT0gTm9TdHJv
a2UpIHsKKyAgICAgICAgcGFpbnQucmVzZXQoKTsKKyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCkt
PnNldHVwUGFpbnRGb3JTdHJva2luZygmcGFpbnQsICZyZWN0LCAwKTsKKyAgICAgICAgcGxhdGZv
cm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3T3ZhbChyZWN0LCBwYWludCk7CisgICAgfQorfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyhjb25zdCBDb2xvciYgY29sb3Ip
Cit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Y29uc3QgVmVjdG9yPEludFJlY3Q+JiByZWN0cyA9IGZvY3VzUmluZ1JlY3RzKCk7CisgICAgdW5z
aWduZWQgcmVjdENvdW50ID0gcmVjdHMuc2l6ZSgpOworICAgIGlmICgwID09IHJlY3RDb3VudCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgU2tSZWdpb24gZm9jdXNSaW5nUmVnaW9uOworICAgIGNv
bnN0IFNrU2NhbGFyIGZvY3VzUmluZ091dHNldCA9IFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoMC41
KTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVjdENvdW50OyBpKyspIHsKKyAgICAg
ICAgU2tJUmVjdCByID0gcmVjdHNbaV07CisgICAgICAgIHIuaW5zZXQoLWZvY3VzUmluZ091dHNl
dCwgLWZvY3VzUmluZ091dHNldCk7CisgICAgICAgIGZvY3VzUmluZ1JlZ2lvbi5vcChyLCBTa1Jl
Z2lvbjo6a1VuaW9uX09wKTsKKyAgICB9CisKKyAgICBTa1BhdGggcGF0aDsKKyAgICBTa1BhaW50
IHBhaW50OworICAgIHBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKKyAgICBwYWludC5zZXRTdHls
ZShTa1BhaW50OjprU3Ryb2tlX1N0eWxlKTsKKworICAgIHBhaW50LnNldENvbG9yKGZvY3VzUmlu
Z0NvbG9yKCkucmdiKCkpOworICAgIHBhaW50LnNldFN0cm9rZVdpZHRoKGZvY3VzUmluZ091dHNl
dCAqIDIpOworICAgIHBhaW50LnNldFBhdGhFZmZlY3QobmV3IFNrQ29ybmVyUGF0aEVmZmVjdChm
b2N1c1JpbmdPdXRzZXQgKiAyKSktPnVucmVmKCk7CisgICAgZm9jdXNSaW5nUmVnaW9uLmdldEJv
dW5kYXJ5UGF0aCgmcGF0aCk7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3
UGF0aChwYXRoLCBwYWludCk7Cit9CisKKy8vIFRoaXMgaXMgb25seSB1c2VkIHRvIGRyYXcgYm9y
ZGVycy4KK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZShjb25zdCBJbnRQb2ludCYgcG9p
bnQxLCBjb25zdCBJbnRQb2ludCYgcG9pbnQyKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIFN0cm9rZVN0eWxlIHBlblN0eWxlID0gc3Ryb2tl
U3R5bGUoKTsKKyAgICBpZiAocGVuU3R5bGUgPT0gTm9TdHJva2UpCisgICAgICAgIHJldHVybjsK
KworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgU2tQb2ludCBwdHNbMl0gPSB7IChTa1BvaW50KXBv
aW50MSwgKFNrUG9pbnQpcG9pbnQyIH07CisgICAgaWYgKCFpc1BvaW50U2tpYVNhZmUoZ2V0Q1RN
KCksIHB0c1swXSkgfHwgIWlzUG9pbnRTa2lhU2FmZShnZXRDVE0oKSwgcHRzWzFdKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgLy8gV2Uga25vdyB0aGVzZSBhcmUgdmVydGljYWwgb3IgaG9yaXpv
bnRhbCBsaW5lcywgc28gdGhlIGxlbmd0aCB3aWxsIGp1c3QKKyAgICAvLyBiZSB0aGUgc3VtIG9m
IHRoZSBkaXNwbGFjZW1lbnQgY29tcG9uZW50IHZlY3RvcnMgZ2l2ZSBvciB0YWtlIDEgLQorICAg
IC8vIHByb2JhYmx5IHdvcnRoIHRoZSBzcGVlZCB1cCBvZiBubyBzcXVhcmUgcm9vdCwgd2hpY2gg
YWxzbyB3b24ndCBiZSBleGFjdC4KKyAgICBTa1BvaW50IGRpc3AgPSBwdHNbMV0gLSBwdHNbMF07
CisgICAgaW50IGxlbmd0aCA9IFNrU2NhbGFyUm91bmQoZGlzcC5mWCArIGRpc3AuZlkpOworICAg
IGludCB3aWR0aCA9IHJvdW5kZigKKyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldHVwUGFp
bnRGb3JTdHJva2luZygmcGFpbnQsIDAsIGxlbmd0aCkpOworCisgICAgLy8gIkJvcnJvd2VkIiB0
aGlzIGNvbW1lbnQgYW5kIGlkZWEgZnJvbSBHcmFwaGljc0NvbnRleHRDRy5jcHAKKyAgICAvLyBG
b3Igb2RkIHdpZHRocywgd2UgYWRkIGluIDAuNSB0byB0aGUgYXBwcm9wcmlhdGUgeC95IHNvIHRo
YXQgdGhlIGZsb2F0CisgICAgLy8gYXJpdGhtZXRpYyB3b3JrcyBvdXQuICBGb3IgZXhhbXBsZSwg
d2l0aCBhIGJvcmRlciB3aWR0aCBvZiAzLCBLSFRNTCB3aWxsCisgICAgLy8gcGFzcyB1cyAoeTEr
eTIpLzIsIGUuZy4sICg1MCs1MykvMiA9IDEwMy8yID0gNTEgd2hlbiB3ZSB3YW50IDUxLjUuICBJ
dCBpcworICAgIC8vIGFsd2F5cyB0cnVlIHRoYXQgYW4gZXZlbiB3aWR0aCBnYXZlIHVzIGEgcGVy
ZmVjdCBwb3NpdGlvbiwgYnV0IGFuIG9kZAorICAgIC8vIHdpZHRoIGdhdmUgdXMgYSBwb3NpdGlv
biB0aGF0IGlzIG9mZiBieSBleGFjdGx5IDAuNS4KKyAgICBib29sIGlzVmVydGljYWxMaW5lID0g
cHRzWzBdLmZYID09IHB0c1sxXS5mWDsKKworICAgIGlmICh3aWR0aCAmIDEpIHsgIC8vIE9kZC4K
KyAgICAgICAgaWYgKGlzVmVydGljYWxMaW5lKSB7CisgICAgICAgICAgICBwdHNbMF0uZlggPSBw
dHNbMF0uZlggKyBTS19TY2FsYXJIYWxmOworICAgICAgICAgICAgcHRzWzFdLmZYID0gcHRzWzBd
LmZYOworICAgICAgICB9IGVsc2UgeyAgLy8gSG9yaXpvbnRhbCBsaW5lCisgICAgICAgICAgICBw
dHNbMF0uZlkgPSBwdHNbMF0uZlkgKyBTS19TY2FsYXJIYWxmOworICAgICAgICAgICAgcHRzWzFd
LmZZID0gcHRzWzBdLmZZOworICAgICAgICB9CisgICAgfQorICAgIHBsYXRmb3JtQ29udGV4dCgp
LT5jYW52YXMoKS0+ZHJhd1BvaW50cyhTa0NhbnZhczo6a0xpbmVzX1BvaW50TW9kZSwgMiwgcHRz
LCBwYWludCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvck1pc3NwZWxs
aW5nT3JCYWRHcmFtbWFyKGNvbnN0IEludFBvaW50JiBwdCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ3Jh
bW1hcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBDcmVhdGUgdGhlIHBhdHRlcm4gd2UnbGwgdXNlIHRvIGRyYXcgdGhlIHVuZGVybGlu
ZS4KKyAgICBzdGF0aWMgU2tCaXRtYXAqIG1pc3NwZWxsQml0bWFwID0gMDsKKyAgICBpZiAoIW1p
c3NwZWxsQml0bWFwKSB7CisgICAgICAgIC8vIFdlIHVzZSBhIDItcGl4ZWwtaGlnaCBtaXNzcGVs
bGluZyBpbmRpY2F0b3IgYmVjYXVzZSB0aGF0IHNlZW1zIHRvIGJlCisgICAgICAgIC8vIHdoYXQg
V2ViS2l0IGlzIGRlc2lnbmVkIGZvciwgYW5kIGhvdyBtdWNoIHJvb20gdGhlcmUgaXMgaW4gYSB0
eXBpY2FsCisgICAgICAgIC8vIHBhZ2UgZm9yIGl0LgorICAgICAgICBjb25zdCBpbnQgcm93UGl4
ZWxzID0gMzI7ICAvLyBNdXN0IGJlIG11bHRpcGxlIG9mIDQgZm9yIHBhdHRlcm4gYmVsb3cuCisg
ICAgICAgIGNvbnN0IGludCBjb2xQaXhlbHMgPSAyOworICAgICAgICBtaXNzcGVsbEJpdG1hcCA9
IG5ldyBTa0JpdG1hcDsKKyAgICAgICAgbWlzc3BlbGxCaXRtYXAtPnNldENvbmZpZyhTa0JpdG1h
cDo6a0FSR0JfODg4OF9Db25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJvd1BpeGVscywgY29sUGl4ZWxzKTsKKyAgICAgICAgbWlzc3BlbGxCaXRtYXAtPmFsbG9jUGl4
ZWxzKCk7CisKKyAgICAgICAgbWlzc3BlbGxCaXRtYXAtPmVyYXNlQVJHQigwLCAwLCAwLCAwKTsK
KyAgICAgICAgY29uc3QgdWludDMyX3QgbGluZUNvbG9yID0gMHhGRkZGMDAwMDsgIC8vIE9wYXF1
ZSByZWQuCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGFudGlDb2xvciA9IDB4NjA2MDAwMDA7ICAv
LyBTZW1pdHJhbnNwYXJlbnQgcmVkLgorCisgICAgICAgIC8vIFBhdHRlcm46ICBYIG8gICBvIFgg
byAgIG8gWAorICAgICAgICAvLyAgICAgICAgICAgICBvIFggbyAgIG8gWCBvCisgICAgICAgIHVp
bnQzMl90KiByb3cxID0gbWlzc3BlbGxCaXRtYXAtPmdldEFkZHIzMigwLCAwKTsKKyAgICAgICAg
dWludDMyX3QqIHJvdzIgPSBtaXNzcGVsbEJpdG1hcC0+Z2V0QWRkcjMyKDAsIDEpOworICAgICAg
ICBmb3IgKGludCB4ID0gMDsgeCA8IHJvd1BpeGVsczsgeCsrKSB7CisgICAgICAgICAgICBzd2l0
Y2ggKHggJSA0KSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcm93MVt4
XSA9IGxpbmVDb2xvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ug
MToKKyAgICAgICAgICAgICAgICByb3cxW3hdID0gYW50aUNvbG9yOworICAgICAgICAgICAgICAg
IHJvdzJbeF0gPSBhbnRpQ29sb3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcm93Mlt4XSA9IGxpbmVDb2xvcjsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICByb3cx
W3hdID0gYW50aUNvbG9yOworICAgICAgICAgICAgICAgIHJvdzJbeF0gPSBhbnRpQ29sb3I7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisK
KyAgICAvLyBPZmZzZXQgaXQgdmVydGljYWxseSBieSAxIHNvIHRoYXQgdGhlcmUncyBzb21lIHNw
YWNlIHVuZGVyIHRoZSB0ZXh0LgorICAgIFNrU2NhbGFyIG9yaWdpblggPSBTa0ludFRvU2NhbGFy
KHB0LngoKSk7CisgICAgU2tTY2FsYXIgb3JpZ2luWSA9IFNrSW50VG9TY2FsYXIocHQueSgpKSAr
IDE7CisKKyAgICAvLyBNYWtlIGEgc2hhZGVyIGZvciB0aGUgYml0bWFwIHdpdGggYW4gb3JpZ2lu
IG9mIHRoZSBib3ggd2UnbGwgZHJhdy4gVGhpcworICAgIC8vIHNoYWRlciBpcyByZWZjb3VudGVk
IGFuZCB3aWxsIGhhdmUgYW4gaW5pdGlhbCByZWZjb3VudCBvZiAxLgorICAgIFNrU2hhZGVyKiBz
aGFkZXIgPSBTa1NoYWRlcjo6Q3JlYXRlQml0bWFwU2hhZGVyKAorICAgICAgICAqbWlzc3BlbGxC
aXRtYXAsIFNrU2hhZGVyOjprUmVwZWF0X1RpbGVNb2RlLAorICAgICAgICBTa1NoYWRlcjo6a1Jl
cGVhdF9UaWxlTW9kZSk7CisgICAgU2tNYXRyaXggbWF0cml4OworICAgIG1hdHJpeC5yZXNldCgp
OworICAgIG1hdHJpeC5wb3N0VHJhbnNsYXRlKG9yaWdpblgsIG9yaWdpblkpOworICAgIHNoYWRl
ci0+c2V0TG9jYWxNYXRyaXgobWF0cml4KTsKKworICAgIC8vIEFzc2lnbiB0aGUgc2hhZGVyIHRv
IHRoZSBwYWludCAmIHJlbGVhc2Ugb3VyIHJlZmVyZW5jZS4gVGhlIHBhaW50IHdpbGwKKyAgICAv
LyBub3cgb3duIHRoZSBzaGFkZXIgYW5kIHRoZSBzaGFkZXIgd2lsbCBiZSBkZXN0cm95ZWQgd2hl
biB0aGUgcGFpbnQgZ29lcworICAgIC8vIG91dCBvZiBzY29wZS4KKyAgICBTa1BhaW50IHBhaW50
OworICAgIHBhaW50LnNldFNoYWRlcihzaGFkZXIpOworICAgIHNoYWRlci0+dW5yZWYoKTsKKwor
ICAgIFNrUmVjdCByZWN0OworICAgIHJlY3Quc2V0KG9yaWdpblgsCisgICAgICAgICAgICAgb3Jp
Z2luWSwKKyAgICAgICAgICAgICBvcmlnaW5YICsgU2tJbnRUb1NjYWxhcih3aWR0aCksCisgICAg
ICAgICAgICAgb3JpZ2luWSArIFNrSW50VG9TY2FsYXIobWlzc3BlbGxCaXRtYXAtPmhlaWdodCgp
KSk7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3UmVjdChyZWN0LCBwYWlu
dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3TGluZUZvclRleHQoY29uc3QgSW50
UG9pbnQmIHB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lk
dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJpbnRpbmcp
Cit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
aW50IHRoaWNrbmVzcyA9IFNrTWF4MzIoc3RhdGljX2Nhc3Q8aW50PihzdHJva2VUaGlja25lc3Mo
KSksIDEpOworICAgIFNrUmVjdCByOworICAgIHIuZkxlZnQgPSBTa0ludFRvU2NhbGFyKHB0Lngo
KSk7CisgICAgci5mVG9wID0gU2tJbnRUb1NjYWxhcihwdC55KCkpOworICAgIHIuZlJpZ2h0ID0g
ci5mTGVmdCArIFNrSW50VG9TY2FsYXIod2lkdGgpOworICAgIHIuZkJvdHRvbSA9IHIuZlRvcCAr
IFNrSW50VG9TY2FsYXIodGhpY2tuZXNzKTsKKworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgcGFp
bnQuc2V0Q29sb3Ioc3Ryb2tlQ29sb3IoKS5yZ2IoKSk7CisgICAgcGxhdGZvcm1Db250ZXh0KCkt
PmNhbnZhcygpLT5kcmF3UmVjdChyLCBwYWludCk7Cit9CisKKy8vIERyYXdzIGEgZmlsbGVkIHJl
Y3RhbmdsZSB3aXRoIGEgc3Ryb2tlZCBib3JkZXIuCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJh
d1JlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBTa1JlY3QgciA9IHJlY3Q7CisgICAgaWYgKCFpc1Jl
Y3RTa2lhU2FmZShnZXRDVE0oKSwgcikpCisgICAgICAgIC8vIFNlZSB0aGUgZmlsbFJlY3QgYmVs
b3cuCisgICAgICAgIENsaXBSZWN0VG9DYW52YXMoKnBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMo
KSwgciwgJnIpOworCisgICAgcGxhdGZvcm1Db250ZXh0KCktPmRyYXdSZWN0KHIpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgoKQoreworICAgIGlmIChwYWludGluZ0Rpc2Fi
bGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IFNrUGF0aCYgcGF0aCA9ICpwbGF0
Zm9ybUNvbnRleHQoKS0+Y3VycmVudFBhdGgoKTsKKyAgICBpZiAoIWlzUGF0aFNraWFTYWZlKGdl
dENUTSgpLCBwYXRoKSkKKyAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEdyYXBoaWNzQ29udGV4
dFN0YXRlJiBzdGF0ZSA9IG1fY29tbW9uLT5zdGF0ZTsKKyAgICBDb2xvclNwYWNlIGNvbG9yU3Bh
Y2UgPSBzdGF0ZS5maWxsQ29sb3JTcGFjZTsKKworICAgIGlmIChjb2xvclNwYWNlID09IFNvbGlk
Q29sb3JTcGFjZSAmJiAhZmlsbENvbG9yKCkuYWxwaGEoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgcGxhdGZvcm1Db250ZXh0KCktPnNldEZpbGxSdWxlKHN0YXRlLmZpbGxSdWxlID09IFJVTEVf
RVZFTk9ERCA/CisgICAgICAgIFNrUGF0aDo6a0V2ZW5PZGRfRmlsbFR5cGUgOiBTa1BhdGg6OmtX
aW5kaW5nX0ZpbGxUeXBlKTsKKworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgcGxhdGZvcm1Db250
ZXh0KCktPnNldHVwUGFpbnRGb3JGaWxsaW5nKCZwYWludCk7CisKKyAgICBpZiAoY29sb3JTcGFj
ZSA9PSBQYXR0ZXJuQ29sb3JTcGFjZSkgeworICAgICAgICBTa1NoYWRlciogcGF0ID0gc3RhdGUu
ZmlsbFBhdHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihnZXRDVE0oKSk7CisgICAgICAgIHBh
aW50LnNldFNoYWRlcihwYXQpOworICAgICAgICBwYXQtPnVucmVmKCk7CisgICAgfSBlbHNlIGlm
IChjb2xvclNwYWNlID09IEdyYWRpZW50Q29sb3JTcGFjZSkKKyAgICAgICAgcGFpbnQuc2V0U2hh
ZGVyKHN0YXRlLmZpbGxHcmFkaWVudC0+cGxhdGZvcm1HcmFkaWVudCgpKTsKKworICAgIHBsYXRm
b3JtQ29udGV4dCgpLT5jYW52YXMoKS0+ZHJhd1BhdGgocGF0aCwgcGFpbnQpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFNrUmVjdCBy
ID0gcmVjdDsKKyAgICBpZiAoIWlzUmVjdFNraWFTYWZlKGdldENUTSgpLCByKSkKKyAgICAgICAg
Ly8gU2VlIHRoZSBvdGhlciB2ZXJzaW9uIG9mIGZpbGxSZWN0IGJlbG93LgorICAgICAgICBDbGlw
UmVjdFRvQ2FudmFzKCpwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCksIHIsICZyKTsKKworICAg
IGNvbnN0IEdyYXBoaWNzQ29udGV4dFN0YXRlJiBzdGF0ZSA9IG1fY29tbW9uLT5zdGF0ZTsKKyAg
ICBDb2xvclNwYWNlIGNvbG9yU3BhY2UgPSBzdGF0ZS5maWxsQ29sb3JTcGFjZTsKKworICAgIGlm
IChjb2xvclNwYWNlID09IFNvbGlkQ29sb3JTcGFjZSAmJiAhZmlsbENvbG9yKCkuYWxwaGEoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgU2tQYWludCBwYWludDsKKyAgICBwbGF0Zm9ybUNvbnRl
eHQoKS0+c2V0dXBQYWludEZvckZpbGxpbmcoJnBhaW50KTsKKworICAgIGlmIChjb2xvclNwYWNl
ID09IFBhdHRlcm5Db2xvclNwYWNlKSB7CisgICAgICAgIFNrU2hhZGVyKiBwYXQgPSBzdGF0ZS5m
aWxsUGF0dGVybi0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGdldENUTSgpKTsKKyAgICAgICAgcGFp
bnQuc2V0U2hhZGVyKHBhdCk7CisgICAgICAgIHBhdC0+dW5yZWYoKTsKKyAgICB9IGVsc2UgaWYg
KGNvbG9yU3BhY2UgPT0gR3JhZGllbnRDb2xvclNwYWNlKQorICAgICAgICBwYWludC5zZXRTaGFk
ZXIoc3RhdGUuZmlsbEdyYWRpZW50LT5wbGF0Zm9ybUdyYWRpZW50KCkpOworCisgICAgcGxhdGZv
cm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3UmVjdChyLCBwYWludCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9y
JiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBpZiAoIWNvbG9yLmFscGhhKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFNrUmVj
dCByID0gcmVjdDsKKyAgICBpZiAoIWlzUmVjdFNraWFTYWZlKGdldENUTSgpLCByKSkgeworICAg
ICAgICAvLyBTcGVjaWFsIGNhc2Ugd2hlbiB0aGUgcmVjdGFuZ2xlIG92ZXJmbG93cyBmaXhlZCBw
b2ludC4gVGhpcyBpcyBhCisgICAgICAgIC8vIHdvcmthcm91bmQgdG8gZml4IGJ1ZyAxMjEyODQ0
LiBXaGVuIHRoZSBpbnB1dCByZWN0YW5nbGUgaXMgdmVyeQorICAgICAgICAvLyBsYXJnZSwgaXQg
Y2FuIG92ZXJmbG93IFNraWEncyBpbnRlcm5hbCBmaXhlZCBwb2ludCByZWN0LiBUaGlzCisgICAg
ICAgIC8vIHNob3VsZCBiZSBmaXhhYmxlIGluIFNraWEgKHNpbmNlIHRoZSBvdXRwdXQgYml0bWFw
IGlzbid0IHRoYXQKKyAgICAgICAgLy8gbGFyZ2UpLCBidXQgdW50aWwgdGhhdCBpcyBmaXhlZCwg
d2UgdHJ5IHRvIGhhbmRsZSBpdCBvdXJzZWx2ZXMuCisgICAgICAgIC8vCisgICAgICAgIC8vIFdl
IG1hbnVhbGx5IGNsaXAgdGhlIHJlY3RhbmdsZSB0byB0aGUgY3VycmVudCBjbGlwIHJlY3QuIFRo
aXMKKyAgICAgICAgLy8gd2lsbCBwcmV2ZW50IG92ZXJmbG93LiBUaGUgcmVjdGFuZ2xlIHdpbGwg
YmUgdHJhbnNmb3JtZWQgdG8gdGhlCisgICAgICAgIC8vIGNhbnZhcycgY29vcmRpbmF0ZSBzcGFj
ZSBiZWZvcmUgaXQgaXMgY29udmVydGVkIHRvIGZpeGVkIHBvaW50CisgICAgICAgIC8vIHNvIHdl
IGFyZSBndWFyYW50ZWVkIG5vdCB0byBvdmVyZmxvdyBhZnRlciBkb2luZyB0aGlzLgorICAgICAg
ICBDbGlwUmVjdFRvQ2FudmFzKCpwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCksIHIsICZyKTsK
KyAgICB9CisKKyAgICBTa1BhaW50IHBhaW50OworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXR1
cFBhaW50Q29tbW9uKCZwYWludCk7CisgICAgcGFpbnQuc2V0Q29sb3IoY29sb3IucmdiKCkpOwor
ICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+ZHJhd1JlY3QociwgcGFpbnQpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJvdW5kZWRSZWN0KGNvbnN0IEludFJlY3QmIHJl
Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludFNpemUm
IHRvcExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElu
dFNpemUmIHRvcFJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBJbnRTaXplJiBib3R0b21MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBJbnRTaXplJiBib3R0b21SaWdodCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFNrUmVjdCByID0gcmVjdDsKKyAg
ICBpZiAoIWlzUmVjdFNraWFTYWZlKGdldENUTSgpLCByKSkKKyAgICAgICAgLy8gU2VlIGZpbGxS
ZWN0KCkuCisgICAgICAgIENsaXBSZWN0VG9DYW52YXMoKnBsYXRmb3JtQ29udGV4dCgpLT5jYW52
YXMoKSwgciwgJnIpOworCisgICAgU2tQYXRoIHBhdGg7CisgICAgYWRkQ29ybmVyQXJjKCZwYXRo
LCByLCB0b3BSaWdodCwgMjcwKTsKKyAgICBhZGRDb3JuZXJBcmMoJnBhdGgsIHIsIGJvdHRvbVJp
Z2h0LCAwKTsKKyAgICBhZGRDb3JuZXJBcmMoJnBhdGgsIHIsIGJvdHRvbUxlZnQsIDkwKTsKKyAg
ICBhZGRDb3JuZXJBcmMoJnBhdGgsIHIsIHRvcExlZnQsIDE4MCk7CisKKyAgICBTa1BhaW50IHBh
aW50OworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXR1cFBhaW50Rm9yRmlsbGluZygmcGFpbnQp
OworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+ZHJhd1BhdGgocGF0aCwgcGFpbnQp
OworICAgIHJldHVybiBmaWxsUmVjdChyZWN0LCBjb2xvcik7Cit9CisKK1RyYW5zZm9ybWF0aW9u
TWF0cml4IEdyYXBoaWNzQ29udGV4dDo6Z2V0Q1RNKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGxh
dGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5nZXRUb3RhbE1hdHJpeCgpOworfQorCitGbG9hdFJl
Y3QgR3JhcGhpY3NDb250ZXh0Ojpyb3VuZFRvRGV2aWNlUGl4ZWxzKGNvbnN0IEZsb2F0UmVjdCYg
cmVjdCkKK3sKKyAgICAvLyBUaGlzIGxvZ2ljIGlzIGNvcGllZCBmcm9tIEdyYXBoaWNzQ29udGV4
dENHLCBlc2VpZGVsIDUvMDUvMDgKKworICAgIC8vIEl0IGlzIG5vdCBlbm91Z2gganVzdCB0byBy
b3VuZCB0byBwaXhlbHMgaW4gZGV2aWNlIHNwYWNlLiBUaGUgcm90YXRpb24KKyAgICAvLyBwYXJ0
IG9mIHRoZSBhZmZpbmUgdHJhbnNmb3JtIG1hdHJpeCB0byBkZXZpY2Ugc3BhY2UgY2FuIG1lc3Mg
d2l0aCB0aGlzCisgICAgLy8gY29udmVyc2lvbiBpZiB3ZSBoYXZlIGEgcm90YXRpbmcgaW1hZ2Ug
bGlrZSB0aGUgaGFuZHMgb2YgdGhlIHdvcmxkIGNsb2NrCisgICAgLy8gd2lkZ2V0LiBXZSBqdXN0
IG5lZWQgdGhlIHNjYWxlLCBzbyB3ZSBnZXQgdGhlIGFmZmluZSB0cmFuc2Zvcm0gbWF0cml4IGFu
ZAorICAgIC8vIGV4dHJhY3QgdGhlIHNjYWxlLgorCisgICAgY29uc3QgU2tNYXRyaXgmIGRldmlj
ZU1hdHJpeCA9IHBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKS0+Z2V0VG90YWxNYXRyaXgoKTsK
KyAgICBpZiAoZGV2aWNlTWF0cml4LmlzSWRlbnRpdHkoKSkKKyAgICAgICAgcmV0dXJuIHJlY3Q7
CisKKyAgICBmbG9hdCBkZXZpY2VTY2FsZVggPSBzcXJ0ZihzcXVhcmUoZGV2aWNlTWF0cml4Lmdl
dFNjYWxlWCgpKQorICAgICAgICArIHNxdWFyZShkZXZpY2VNYXRyaXguZ2V0U2tld1koKSkpOwor
ICAgIGZsb2F0IGRldmljZVNjYWxlWSA9IHNxcnRmKHNxdWFyZShkZXZpY2VNYXRyaXguZ2V0U2tl
d1goKSkKKyAgICAgICAgKyBzcXVhcmUoZGV2aWNlTWF0cml4LmdldFNjYWxlWSgpKSk7CisKKyAg
ICBGbG9hdFBvaW50IGRldmljZU9yaWdpbihyZWN0LngoKSAqIGRldmljZVNjYWxlWCwgcmVjdC55
KCkgKiBkZXZpY2VTY2FsZVkpOworICAgIEZsb2F0UG9pbnQgZGV2aWNlTG93ZXJSaWdodCgocmVj
dC54KCkgKyByZWN0LndpZHRoKCkpICogZGV2aWNlU2NhbGVYLAorICAgICAgICAocmVjdC55KCkg
KyByZWN0LmhlaWdodCgpKSAqIGRldmljZVNjYWxlWSk7CisKKyAgICBkZXZpY2VPcmlnaW4uc2V0
WChyb3VuZGYoZGV2aWNlT3JpZ2luLngoKSkpOworICAgIGRldmljZU9yaWdpbi5zZXRZKHJvdW5k
ZihkZXZpY2VPcmlnaW4ueSgpKSk7CisgICAgZGV2aWNlTG93ZXJSaWdodC5zZXRYKHJvdW5kZihk
ZXZpY2VMb3dlclJpZ2h0LngoKSkpOworICAgIGRldmljZUxvd2VyUmlnaHQuc2V0WShyb3VuZGYo
ZGV2aWNlTG93ZXJSaWdodC55KCkpKTsKKworICAgIC8vIERvbid0IGxldCB0aGUgaGVpZ2h0IG9y
IHdpZHRoIHJvdW5kIHRvIDAgdW5sZXNzIGVpdGhlciB3YXMgb3JpZ2luYWxseSAwCisgICAgaWYg
KGRldmljZU9yaWdpbi55KCkgPT0gZGV2aWNlTG93ZXJSaWdodC55KCkgJiYgcmVjdC5oZWlnaHQo
KSAhPSAwKQorICAgICAgICBkZXZpY2VMb3dlclJpZ2h0Lm1vdmUoMCwgMSk7CisgICAgaWYgKGRl
dmljZU9yaWdpbi54KCkgPT0gZGV2aWNlTG93ZXJSaWdodC54KCkgJiYgcmVjdC53aWR0aCgpICE9
IDApCisgICAgICAgIGRldmljZUxvd2VyUmlnaHQubW92ZSgxLCAwKTsKKworICAgIEZsb2F0UG9p
bnQgcm91bmRlZE9yaWdpbihkZXZpY2VPcmlnaW4ueCgpIC8gZGV2aWNlU2NhbGVYLAorICAgICAg
ICBkZXZpY2VPcmlnaW4ueSgpIC8gZGV2aWNlU2NhbGVZKTsKKyAgICBGbG9hdFBvaW50IHJvdW5k
ZWRMb3dlclJpZ2h0KGRldmljZUxvd2VyUmlnaHQueCgpIC8gZGV2aWNlU2NhbGVYLAorICAgICAg
ICBkZXZpY2VMb3dlclJpZ2h0LnkoKSAvIGRldmljZVNjYWxlWSk7CisgICAgcmV0dXJuIEZsb2F0
UmVjdChyb3VuZGVkT3JpZ2luLCByb3VuZGVkTG93ZXJSaWdodCAtIHJvdW5kZWRPcmlnaW4pOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQor
eworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBwbGF0
Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPnNjYWxlKFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoc2l6
ZS53aWR0aCgpKSwKKyAgICAgICAgV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihzaXplLmhlaWdodCgp
KSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRBbHBoYShmbG9hdCBhbHBoYSkKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgcGxhdGZv
cm1Db250ZXh0KCktPnNldEFscGhhKGFscGhhKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OnNldENvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvciBvcCkKK3sKKyAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisgICAgcGxhdGZvcm1Db250ZXh0
KCktPnNldFBvcnRlckR1ZmZNb2RlKFdlYkNvcmVDb21wb3NpdGVUb1NraWFDb21wb3NpdGUob3Ap
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldEltYWdlSW50ZXJwb2xhdGlvblF1YWxp
dHkoSW50ZXJwb2xhdGlvblF1YWxpdHkpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldExpbmVDYXAoTGluZUNhcCBjYXApCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHN3aXRjaCAoY2FwKSB7
CisgICAgY2FzZSBCdXR0Q2FwOgorICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0TGluZUNh
cChTa1BhaW50OjprQnV0dF9DYXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJvdW5kQ2Fw
OgorICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0TGluZUNhcChTa1BhaW50OjprUm91bmRf
Q2FwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTcXVhcmVDYXA6CisgICAgICAgIHBsYXRm
b3JtQ29udGV4dCgpLT5zZXRMaW5lQ2FwKFNrUGFpbnQ6OmtTcXVhcmVfQ2FwKTsKKyAgICAgICAg
YnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUKDApOworICAgICAgICBicmVhazsK
KyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lRGFzaChjb25zdCBEYXNo
QXJyYXkmIGRhc2hlcywgZmxvYXQgZGFzaE9mZnNldCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBsaWZ0ZWQg
ZGlyZWN0bHkgb2ZmIFNraWFTdXBwb3J0LCBsaW5lcyA0OS03NAorICAgIC8vIHNvIGl0IGlzIG5v
dCBndWFyYW50ZWVkIHRvIHdvcmsgY29ycmVjdGx5LgorICAgIHNpemVfdCBkYXNoTGVuZ3RoID0g
ZGFzaGVzLnNpemUoKTsKKyAgICBpZiAoIWRhc2hMZW5ndGgpCisgICAgICAgIHJldHVybjsKKwor
ICAgIHNpemVfdCBjb3VudCA9IChkYXNoTGVuZ3RoICUgMikgPT0gMCA/IGRhc2hMZW5ndGggOiBk
YXNoTGVuZ3RoICogMjsKKyAgICBTa1NjYWxhciogaW50ZXJ2YWxzID0gbmV3IFNrU2NhbGFyW2Nv
dW50XTsKKworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAg
ICAgICAgaW50ZXJ2YWxzW2ldID0gZGFzaGVzW2kgJSBkYXNoTGVuZ3RoXTsKKworICAgIHBsYXRm
b3JtQ29udGV4dCgpLT5zZXREYXNoUGF0aEVmZmVjdChuZXcgU2tEYXNoUGF0aEVmZmVjdChpbnRl
cnZhbHMsIGNvdW50LCBkYXNoT2Zmc2V0KSk7CisKKyAgICBkZWxldGVbXSBpbnRlcnZhbHM7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lSm9pbihMaW5lSm9pbiBqb2luKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBzd2l0Y2gg
KGpvaW4pIHsKKyAgICBjYXNlIE1pdGVySm9pbjoKKyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCkt
PnNldExpbmVKb2luKFNrUGFpbnQ6OmtNaXRlcl9Kb2luKTsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBSb3VuZEpvaW46CisgICAgICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRMaW5lSm9pbihT
a1BhaW50OjprUm91bmRfSm9pbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQmV2ZWxKb2lu
OgorICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0TGluZUpvaW4oU2tQYWludDo6a0JldmVs
X0pvaW4pOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlQoMCk7
CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldE1p
dGVyTGltaXQoZmxvYXQgbGltaXQpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAg
ICAgICAgcmV0dXJuOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRNaXRlckxpbWl0KGxpbWl0
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtRmlsbENvbG9yKGNvbnN0
IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldEZpbGxDb2xvcihjb2xvci5yZ2IoKSk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNoYWRvdyhjb25zdCBJbnRT
aXplJiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBi
bHVySW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENv
bG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBkb3VibGUgd2lkdGggPSBzaXplLndpZHRoKCk7CisgICAgZG91YmxlIGhlaWdo
dCA9IHNpemUuaGVpZ2h0KCk7CisgICAgZG91YmxlIGJsdXIgPSBibHVySW50OworCisgICAgLy8g
VE9ETyh0Yyk6IFRoaXMgc3RpbGwgZG9lcyBub3QgYWRkcmVzcyB0aGUgaXNzdWUgdGhhdCBzaGFk
b3dzCisgICAgLy8gd2l0aGluIGNhbnZhcyBlbGVtZW50cyBzaG91bGQgaWdub3JlIHRyYW5zZm9y
bXMuCisgICAgaWYgKG1fY29tbW9uLT5zdGF0ZS5zaGFkb3dzSWdub3JlVHJhbnNmb3JtcykgIHsK
KyAgICAgICAgLy8gQ3VycmVudGx5IG9ubHkgdGhlIEdyYXBoaWNzQ29udGV4dCBhc3NvY2lhdGVk
IHdpdGggdGhlCisgICAgICAgIC8vIENhbnZhc1JlbmRlcmluZ0NvbnRleHQgZm9yIEhUTUxDYW52
YXNFbGVtZW50IGhhdmUgc2hhZG93cyBpZ25vcmUKKyAgICAgICAgLy8gVHJhbnNmb3Jtcy4gU28g
d2l0aCB0aGlzIGZsYWcgc2V0LCB3ZSBrbm93IHRoaXMgc3RhdGUgaXMgYXNzb2NpYXRlZAorICAg
ICAgICAvLyB3aXRoIGEgQ2FudmFzUmVuZGVyaW5nQ29udGV4dC4KKyAgICAgICAgLy8gQ0cgdXNl
cyBuYXR1cmFsIG9yaWVudGF0aW9uIGZvciBZIGF4aXMsIGJ1dCB0aGUgSFRNTDUgY2FudmFzIHNw
ZWMKKyAgICAgICAgLy8gZG9lcyBub3QuCisgICAgICAgIC8vIFNvIHdlIG5vdyBmbGlwIHRoZSBo
ZWlnaHQgc2luY2UgaXQgd2FzIGZsaXBwZWQgaW4KKyAgICAgICAgLy8gQ2FudmFzUmVuZGVyaW5n
Q29udGV4dCBpbiBvcmRlciB0byB3b3JrIHdpdGggQ0cuCisgICAgICAgIGhlaWdodCA9IC1oZWln
aHQ7CisgICAgfQorCisgICAgU2tDb2xvciBjOworICAgIGlmIChjb2xvci5pc1ZhbGlkKCkpCisg
ICAgICAgIGMgPSBjb2xvci5yZ2IoKTsKKyAgICBlbHNlCisgICAgICAgIGMgPSBTa0NvbG9yU2V0
QVJHQigweEZGLzMsIDAsIDAsIDApOyAgICAvLyAic3RkIiBhcHBsZSBzaGFkb3cgY29sb3IuCisK
KyAgICAvLyBUT0RPKHRjKTogU2hvdWxkIHdlIGhhdmUgYSBtYXggdmFsdWUgZm9yIHRoZSBibHVy
PyAgQ0cgY2xhbXBzIGF0IDEwMDAuMAorICAgIC8vIGZvciBwZXJmIHJlYXNvbnMuCisgICAgU2tE
cmF3TG9vcGVyKiBkbCA9IG5ldyBTa0JsdXJEcmF3TG9vcGVyKGJsdXIgLyAyLCB3aWR0aCwgaGVp
Z2h0LCBjKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0RHJhd0xvb3BlcihkbCk7CisgICAg
ZGwtPnVucmVmKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9r
ZUNvbG9yKGNvbnN0IENvbG9yJiBzdHJva2Vjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0U3Ry
b2tlQ29sb3Ioc3Ryb2tlY29sb3IucmdiKCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0UGxhdGZvcm1TdHJva2VTdHlsZShjb25zdCBTdHJva2VTdHlsZSYgc3Ryb2tlKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3Jt
Q29udGV4dCgpLT5zZXRTdHJva2VTdHlsZShzdHJva2UpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2V0UGxhdGZvcm1TdHJva2VUaGlja25lc3MoZmxvYXQgdGhpY2tuZXNzKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3Jt
Q29udGV4dCgpLT5zZXRTdHJva2VUaGlja25lc3ModGhpY2tuZXNzKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQ6OnNldFBsYXRmb3JtVGV4dERyYXdpbmdNb2RlKGludCBtb2RlKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3Jt
Q29udGV4dCgpLT5zZXRUZXh0RHJhd2luZ01vZGUobW9kZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpzZXRVUkxGb3JSZWN0KGNvbnN0IEtVUkwmIGxpbmssIGNvbnN0IEludFJlY3QmIGRl
c3RSZWN0KQoreworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0VXNlQW50aWFsaWFzaW5n
KGJvb2wgZW5hYmxlKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRVc2VBbnRpYWxpYXNpbmcoZW5hYmxl
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZUFyYyhjb25zdCBJbnRSZWN0JiBy
LCBpbnQgc3RhcnRBbmdsZSwgaW50IGFuZ2xlU3BhbikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1BhaW50IHBhaW50OworICAgIFNrUmVj
dCBvdmFsID0gcjsKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSA9PSBOb1N0cm9rZSkgeworICAgICAg
ICAvLyBTdHJva2UgdXNpbmcgdGhlIGZpbGwgY29sb3IuCisgICAgICAgIC8vIFRPRE8oYnJldHR3
KSBpcyB0aGlzIHJlYWxseSBjb3JyZWN0PyBJdCBzZWVtcyB1bnJlYXNvbmFibGUuCisgICAgICAg
IHBsYXRmb3JtQ29udGV4dCgpLT5zZXR1cFBhaW50Rm9yRmlsbGluZygmcGFpbnQpOworICAgICAg
ICBwYWludC5zZXRTdHlsZShTa1BhaW50OjprU3Ryb2tlX1N0eWxlKTsKKyAgICAgICAgcGFpbnQu
c2V0U3Ryb2tlV2lkdGgoV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcihzdHJva2VUaGlja25lc3MoKSkp
OworICAgIH0gZWxzZQorICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0dXBQYWludEZvclN0
cm9raW5nKCZwYWludCwgMCwgMCk7CisKKyAgICAvLyBXZSBkbyB0aGlzIGJlZm9yZSBjb252ZXJ0
aW5nIHRvIHNjYWxhciwgc28gd2UgZG9uJ3Qgb3ZlcmZsb3cgU2tGaXhlZC4KKyAgICBzdGFydEFu
Z2xlID0gZmFzdE1vZChzdGFydEFuZ2xlLCAzNjApOworICAgIGFuZ2xlU3BhbiA9IGZhc3RNb2Qo
YW5nbGVTcGFuLCAzNjApOworCisgICAgU2tQYXRoIHBhdGg7CisgICAgcGF0aC5hZGRBcmMob3Zh
bCwgU2tJbnRUb1NjYWxhcigtc3RhcnRBbmdsZSksIFNrSW50VG9TY2FsYXIoLWFuZ2xlU3Bhbikp
OworICAgIGlmICghaXNQYXRoU2tpYVNhZmUoZ2V0Q1RNKCksIHBhdGgpKQorICAgICAgICByZXR1
cm47CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3UGF0aChwYXRoLCBwYWlu
dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKCkKK3sKKyAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBTa1BhdGgm
IHBhdGggPSAqcGxhdGZvcm1Db250ZXh0KCktPmN1cnJlbnRQYXRoKCk7CisgICAgaWYgKCFpc1Bh
dGhTa2lhU2FmZShnZXRDVE0oKSwgcGF0aCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0
IEdyYXBoaWNzQ29udGV4dFN0YXRlJiBzdGF0ZSA9IG1fY29tbW9uLT5zdGF0ZTsKKyAgICBDb2xv
clNwYWNlIGNvbG9yU3BhY2UgPSBzdGF0ZS5zdHJva2VDb2xvclNwYWNlOworCisgICAgaWYgKGNv
bG9yU3BhY2UgPT0gU29saWRDb2xvclNwYWNlICYmICFzdHJva2VDb2xvcigpLmFscGhhKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgcGxhdGZvcm1Db250ZXh0
KCktPnNldHVwUGFpbnRGb3JTdHJva2luZygmcGFpbnQsIDAsIDApOworCisgICAgaWYgKGNvbG9y
U3BhY2UgPT0gUGF0dGVybkNvbG9yU3BhY2UpIHsKKyAgICAgICAgU2tTaGFkZXIqIHBhdCA9IHN0
YXRlLnN0cm9rZVBhdHRlcm4tPmNyZWF0ZVBsYXRmb3JtUGF0dGVybihnZXRDVE0oKSk7CisgICAg
ICAgIHBhaW50LnNldFNoYWRlcihwYXQpOworICAgICAgICBwYXQtPnVucmVmKCk7CisgICAgfSBl
bHNlIGlmIChjb2xvclNwYWNlID09IEdyYWRpZW50Q29sb3JTcGFjZSkKKyAgICAgICAgcGFpbnQu
c2V0U2hhZGVyKHN0YXRlLnN0cm9rZUdyYWRpZW50LT5wbGF0Zm9ybUdyYWRpZW50KCkpOworCisg
ICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpLT5kcmF3UGF0aChwYXRoLCBwYWludCk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVj
dCwgZmxvYXQgbGluZVdpZHRoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmICghaXNSZWN0U2tpYVNhZmUoZ2V0Q1RNKCksIHJlY3QpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYgc3RhdGUg
PSBtX2NvbW1vbi0+c3RhdGU7CisgICAgQ29sb3JTcGFjZSBjb2xvclNwYWNlID0gc3RhdGUuc3Ry
b2tlQ29sb3JTcGFjZTsKKworICAgIGlmIChjb2xvclNwYWNlID09IFNvbGlkQ29sb3JTcGFjZSAm
JiAhc3Ryb2tlQ29sb3IoKS5hbHBoYSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTa1BhaW50
IHBhaW50OworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXR1cFBhaW50Rm9yU3Ryb2tpbmcoJnBh
aW50LCAwLCAwKTsKKyAgICBwYWludC5zZXRTdHJva2VXaWR0aChXZWJDb3JlRmxvYXRUb1NrU2Nh
bGFyKGxpbmVXaWR0aCkpOworCisgICAgaWYgKGNvbG9yU3BhY2UgPT0gUGF0dGVybkNvbG9yU3Bh
Y2UpIHsKKyAgICAgICAgU2tTaGFkZXIqIHBhdCA9IHN0YXRlLnN0cm9rZVBhdHRlcm4tPmNyZWF0
ZVBsYXRmb3JtUGF0dGVybihnZXRDVE0oKSk7CisgICAgICAgIHBhaW50LnNldFNoYWRlcihwYXQp
OworICAgICAgICBwYXQtPnVucmVmKCk7CisgICAgfSBlbHNlIGlmIChjb2xvclNwYWNlID09IEdy
YWRpZW50Q29sb3JTcGFjZSkKKyAgICAgICAgcGFpbnQuc2V0U2hhZGVyKHN0YXRlLnN0cm9rZUdy
YWRpZW50LT5wbGF0Zm9ybUdyYWRpZW50KCkpOworCisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNh
bnZhcygpLT5kcmF3UmVjdChyZWN0LCBwYWludCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
Ojpyb3RhdGUoZmxvYXQgYW5nbGVJblJhZGlhbnMpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygp
LT5yb3RhdGUoV2ViQ29yZUZsb2F0VG9Ta1NjYWxhcigKKyAgICAgICAgYW5nbGVJblJhZGlhbnMg
KiAoMTgwLjBmIC8gMy4xNDE1OTI2NWYpKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojp0
cmFuc2xhdGUoZmxvYXQgdywgZmxvYXQgaCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCktPnRy
YW5zbGF0ZShXZWJDb3JlRmxvYXRUb1NrU2NhbGFyKHcpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFdlYkNvcmVGbG9hdFRvU2tTY2FsYXIoaCkpOworfQorCit9
ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26545</attachid>
            <date>2009-01-08 16:40:18 -0800</date>
            <delta_ts>2009-01-08 16:40:18 -0800</delta_ts>
            <desc>Add ImageBufferSkia and ImageSkia files.</desc>
            <filename>Add-ImageBufferSkia-and-ImageSkia-files..patch</filename>
            <type>text/plain</type>
            <size>29247</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">Y2Y0ZTA4MzNhYWUxNjk2Yjc4YWJhYjFhZWYzMTZjMWE1OGUyYWUyNwpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCA1NjM1MDU2Li40MTUyZGNl
IDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpA
QCAtMSwzICsxLDM0IEBACisyMDA5LTAxLTA4ICBEaW1pdHJpIEdsYXprb3YgIDxkZ2xhemtvdkBj
aHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwuCisKKyAgICAg
ICAgQWRkIEltYWdlQnVmZmVyU2tpYSBhbmQgSW1hZ2VTa2lhIGZpbGVzLgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjMyMDAKKyAgICAgICAgRm9yIG5v
dyB3ZSd2ZSBsZWZ0IEJpdG1hcEltYWdlIGFuZCBCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYQor
ICAgICAgICBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIEltYWdlU2tpYSBmaWxlIChsaWtlIEltYWdl
Q0cgaGFzKSwgYnV0CisgICAgICAgIHdlIGludGVuZCB0byBicmVhayB0aGVtIG91dCBpbnRvIHRo
ZWlyIG93biBmaWxlcy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VC
dWZmZXJTa2lhLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlckRhdGE6
OkltYWdlQnVmZmVyRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6SW1hZ2VC
dWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6On5JbWFnZUJ1ZmZlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6Y29udGV4dCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbWFnZUJ1ZmZlcjo6aW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6Omdl
dEltYWdlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6cHV0SW1hZ2VEYXRh
KToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjp0b0RhdGFVUkwpOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VTa2lhLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6RnJhbWVEYXRhOjpjbGVhcik6CisgICAgICAg
IChXZWJDb3JlOjpJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UpOgorICAgICAgICAoV2ViQ29y
ZTo6SW1hZ2U6OmRyYXdQYXR0ZXJuKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpp
bml0UGxhdGZvcm1EYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjppbnZhbGlk
YXRlUGxhdGZvcm1EYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkJpdG1hcEltYWdlOjpjaGVja0Zv
clNvbGlkQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2U6OmRyYXcpOgorICAg
ICAgICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWE6OmRyYXcpOgorICAgICAg
ICAoV2ViQ29yZTo6Qml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWE6OmNyZWF0ZSk6CisKIDIwMDkt
MDEtMDggIEphbWVzIFJvYmluc29uICA8amFtZXNyQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgTWFyayBSb3dlLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9za2lhL0ltYWdlQnVmZmVyU2tpYS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Nr
aWEvSW1hZ2VCdWZmZXJTa2lhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li5mZGZjYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9z
a2lhL0ltYWdlQnVmZmVyU2tpYS5jcHAKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmln
aHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0
aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5h
bWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkltYWdlQnVmZmVyLmgiCisKKyNpbmNsdWRlICJCaXRtYXBJbWFn
ZS5oIgorI2luY2x1ZGUgIkJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhLmgiCisjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW1hZ2VEYXRhLmgiCisjaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHRTa2lhLmgiCisjaW5jbHVk
ZSAiU2tpYVV0aWxzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworLy8gV2UgcGFzcyBhIHRlY2huaWNhbGx5LXVuaW5pdGlhbGl6ZWQgY2FudmFzIHRv
IHRoZSBwbGF0Zm9ybSBjb250ZXh0IGhlcmUgc2luY2UKKy8vIHRoZSBjYW52YXMgaW5pdGlhbGl6
YXRpb24gY29tcGxldGVzIGluIEltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlci4gQnV0CisvLyBQbGF0
Zm9ybUNvbnRleHQgZG9lc24ndCBhY3R1YWxseSBuZWVkIHRvIHVzZSB0aGUgb2JqZWN0LCBhbmQg
dGhpcyBtYWtlcyBhbGwKKy8vIHRoZSBvd25lcnNoaXAgZWFzaWVyIHRvIG1hbmFnZS4KK0ltYWdl
QnVmZmVyRGF0YTo6SW1hZ2VCdWZmZXJEYXRhKGNvbnN0IEludFNpemUmIHNpemUpCisgICAgOiBt
X3BsYXRmb3JtQ29udGV4dCgwKSAgLy8gQ2FudmFzIGlzIHNldCBpbiBJbWFnZUJ1ZmZlciBjb25z
dHJ1Y3Rvci4KK3sKK30KKworSW1hZ2VCdWZmZXI6OkltYWdlQnVmZmVyKGNvbnN0IEludFNpemUm
IHNpemUsIGJvb2wgZ3JheVNjYWxlLCBib29sJiBzdWNjZXNzKQorICAgIDogbV9kYXRhKHNpemUp
CisgICAgLCBtX3NpemUoc2l6ZSkKK3sKKyAgICBpZiAoIW1fZGF0YS5tX2NhbnZhcy5pbml0aWFs
aXplKHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgZmFsc2UpKSB7CisgICAgICAgIHN1Y2Nl
c3MgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fZGF0YS5tX3BsYXRm
b3JtQ29udGV4dC5zZXRDYW52YXMoJm1fZGF0YS5tX2NhbnZhcyk7CisgICAgbV9jb250ZXh0LnNl
dChuZXcgR3JhcGhpY3NDb250ZXh0KCZtX2RhdGEubV9wbGF0Zm9ybUNvbnRleHQpKTsKKworICAg
IC8vIE1ha2UgdGhlIGJhY2tncm91bmQgdHJhbnNwYXJlbnQuIEl0IHdvdWxkIGJlIG5pY2UgaWYg
dGhpcyB3YXNuJ3QKKyAgICAvLyByZXF1aXJlZCwgYnV0IHRoZSBjYW52YXMgaXMgY3VycmVudGx5
IGZpbGxlZCB3aXRoIHRoZSBtYWdpYyB0cmFuc3BhcmVuY3kKKyAgICAvLyBjb2xvci4gQ2FuIHdl
IGhhdmUgYW5vdGhlciB3YXkgdG8gbWFuYWdlIHRoaXM/CisgICAgbV9kYXRhLm1fY2FudmFzLmRy
YXdBUkdCKDAsIDAsIDAsIDAsIFNrUG9ydGVyRHVmZjo6a0NsZWFyX01vZGUpOworICAgIHN1Y2Nl
c3MgPSB0cnVlOworfQorCitJbWFnZUJ1ZmZlcjo6fkltYWdlQnVmZmVyKCkKK3sKK30KKworR3Jh
cGhpY3NDb250ZXh0KiBJbWFnZUJ1ZmZlcjo6Y29udGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fY29udGV4dC5nZXQoKTsKK30KKworSW1hZ2UqIEltYWdlQnVmZmVyOjppbWFnZSgpIGNvbnN0
Cit7CisgICAgaWYgKCFtX2ltYWdlKSB7CisgICAgICAgIC8vIFRoaXMgY3JlYXRlcyBhIENPUFkg
b2YgdGhlIGltYWdlIGFuZCB3aWxsIGNhY2hlIHRoYXQgY29weS4gVGhpcyBtZWFucworICAgICAg
ICAvLyB0aGF0IGlmIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyB0YWtlIHBsYWNlIG9uIHRoZSBjb250
ZXh0LCBuZWl0aGVyIHRoZQorICAgICAgICAvLyBjdXJyZW50bHktcmV0dXJuZWQgaW1hZ2UsIG5v
ciB0aGUgcmVzdWx0cyBvZiBmdXR1cmUgaW1hZ2UoKSBjYWxscywKKyAgICAgICAgLy8gd2lsbCBj
b250YWluIHRoYXQgb3BlcmF0aW9uLgorICAgICAgICAvLworICAgICAgICAvLyBUaGlzIHNlZW1z
IHNpbGx5LCBidXQgaXMgdGhlIHdheSB0aGUgQ0cgcG9ydCB3b3JrczogaW1hZ2UoKSBpcworICAg
ICAgICAvLyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgd2hlbiByZW5kZXJpbmcgaXMgImNvbXBs
ZXRlLiIKKyAgICAgICAgbV9pbWFnZSA9IEJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhOjpjcmVh
dGUoCisgICAgICAgICAgICAqbV9kYXRhLm1fcGxhdGZvcm1Db250ZXh0LmJpdG1hcCgpKTsKKyAg
ICB9CisgICAgcmV0dXJuIG1faW1hZ2UuZ2V0KCk7Cit9CisKK1Bhc3NSZWZQdHI8SW1hZ2VEYXRh
PiBJbWFnZUJ1ZmZlcjo6Z2V0SW1hZ2VEYXRhKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7
CisgICAgQVNTRVJUKGNvbnRleHQoKSk7CisKKyAgICBSZWZQdHI8SW1hZ2VEYXRhPiByZXN1bHQg
PSBJbWFnZURhdGE6OmNyZWF0ZShyZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworICAgIHVu
c2lnbmVkIGNoYXIqIGRhdGEgPSByZXN1bHQtPmRhdGEoKS0+ZGF0YSgpOworCisgICAgaWYgKHJl
Y3QueCgpIDwgMCB8fCByZWN0LnkoKSA8IDAgfHwKKyAgICAgICAgKHJlY3QueCgpICsgcmVjdC53
aWR0aCgpKSA+IG1fc2l6ZS53aWR0aCgpIHx8CisgICAgICAgIChyZWN0LnkoKSArIHJlY3QuaGVp
Z2h0KCkpID4gbV9zaXplLmhlaWdodCgpKQorICAgICAgICBtZW1zZXQoZGF0YSwgMCwgcmVzdWx0
LT5kYXRhKCktPmxlbmd0aCgpKTsKKworICAgIGludCBvcmlnaW5YID0gcmVjdC54KCk7CisgICAg
aW50IGRlc3RYID0gMDsKKyAgICBpZiAob3JpZ2luWCA8IDApIHsKKyAgICAgICAgZGVzdFggPSAt
b3JpZ2luWDsKKyAgICAgICAgb3JpZ2luWCA9IDA7CisgICAgfQorICAgIGludCBlbmRYID0gcmVj
dC54KCkgKyByZWN0LndpZHRoKCk7CisgICAgaWYgKGVuZFggPiBtX3NpemUud2lkdGgoKSkKKyAg
ICAgICAgZW5kWCA9IG1fc2l6ZS53aWR0aCgpOworICAgIGludCBudW1Db2x1bW5zID0gZW5kWCAt
IG9yaWdpblg7CisKKyAgICBpbnQgb3JpZ2luWSA9IHJlY3QueSgpOworICAgIGludCBkZXN0WSA9
IDA7CisgICAgaWYgKG9yaWdpblkgPCAwKSB7CisgICAgICAgIGRlc3RZID0gLW9yaWdpblk7Cisg
ICAgICAgIG9yaWdpblkgPSAwOworICAgIH0KKyAgICBpbnQgZW5kWSA9IHJlY3QueSgpICsgcmVj
dC5oZWlnaHQoKTsKKyAgICBpZiAoZW5kWSA+IG1fc2l6ZS5oZWlnaHQoKSkKKyAgICAgICAgZW5k
WSA9IG1fc2l6ZS5oZWlnaHQoKTsKKyAgICBpbnQgbnVtUm93cyA9IGVuZFkgLSBvcmlnaW5ZOwor
CisgICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCA9ICpjb250ZXh0KCktPnBsYXRmb3JtQ29udGV4
dCgpLT5iaXRtYXAoKTsKKyAgICBBU1NFUlQoYml0bWFwLmNvbmZpZygpID09IFNrQml0bWFwOjpr
QVJHQl84ODg4X0NvbmZpZyk7CisgICAgU2tBdXRvTG9ja1BpeGVscyBiaXRtYXBMb2NrKGJpdG1h
cCk7CisKKyAgICB1bnNpZ25lZCBkZXN0Qnl0ZXNQZXJSb3cgPSA0ICogcmVjdC53aWR0aCgpOwor
ICAgIHVuc2lnbmVkIGNoYXIqIGRlc3RSb3cgPSBkYXRhICsgZGVzdFkgKiBkZXN0Qnl0ZXNQZXJS
b3cgKyBkZXN0WCAqIDQ7CisKKyAgICBmb3IgKGludCB5ID0gMDsgeSA8IG51bVJvd3M7ICsreSkg
eworICAgICAgICB1aW50MzJfdCogc3JjUm93ID0gYml0bWFwLmdldEFkZHIzMihvcmlnaW5YLCBv
cmlnaW5ZICsgeSk7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbnVtQ29sdW1uczsgKyt4
KSB7CisgICAgICAgICAgICBTa0NvbG9yIGNvbG9yID0gU2tQTUNvbG9yVG9Db2xvcihzcmNSb3db
eF0pOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZGVzdFBpeGVsID0gJmRlc3RSb3dbeCAq
IDRdOworICAgICAgICAgICAgZGVzdFBpeGVsWzBdID0gU2tDb2xvckdldFIoY29sb3IpOworICAg
ICAgICAgICAgZGVzdFBpeGVsWzFdID0gU2tDb2xvckdldEcoY29sb3IpOworICAgICAgICAgICAg
ZGVzdFBpeGVsWzJdID0gU2tDb2xvckdldEIoY29sb3IpOworICAgICAgICAgICAgZGVzdFBpeGVs
WzNdID0gU2tDb2xvckdldEEoY29sb3IpOworICAgICAgICB9CisgICAgICAgIGRlc3RSb3cgKz0g
ZGVzdEJ5dGVzUGVyUm93OworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQg
SW1hZ2VCdWZmZXI6OnB1dEltYWdlRGF0YShJbWFnZURhdGEqIHNvdXJjZSwgY29uc3QgSW50UmVj
dCYgc291cmNlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRQ
b2ludCYgZGVzdFBvaW50KQoreworICAgIEFTU0VSVChzb3VyY2VSZWN0LndpZHRoKCkgPiAwKTsK
KyAgICBBU1NFUlQoc291cmNlUmVjdC5oZWlnaHQoKSA+IDApOworCisgICAgaW50IG9yaWdpblgg
PSBzb3VyY2VSZWN0LngoKTsKKyAgICBpbnQgZGVzdFggPSBkZXN0UG9pbnQueCgpICsgc291cmNl
UmVjdC54KCk7CisgICAgQVNTRVJUKGRlc3RYID49IDApOworICAgIEFTU0VSVChkZXN0WCA8IG1f
c2l6ZS53aWR0aCgpKTsKKyAgICBBU1NFUlQob3JpZ2luWCA+PSAwKTsKKyAgICBBU1NFUlQob3Jp
Z2luWCA8IHNvdXJjZVJlY3QucmlnaHQoKSk7CisKKyAgICBpbnQgZW5kWCA9IGRlc3RQb2ludC54
KCkgKyBzb3VyY2VSZWN0LnJpZ2h0KCk7CisgICAgQVNTRVJUKGVuZFggPD0gbV9zaXplLndpZHRo
KCkpOworCisgICAgaW50IG51bUNvbHVtbnMgPSBlbmRYIC0gZGVzdFg7CisKKyAgICBpbnQgb3Jp
Z2luWSA9IHNvdXJjZVJlY3QueSgpOworICAgIGludCBkZXN0WSA9IGRlc3RQb2ludC55KCkgKyBz
b3VyY2VSZWN0LnkoKTsKKyAgICBBU1NFUlQoZGVzdFkgPj0gMCk7CisgICAgQVNTRVJUKGRlc3RZ
IDwgbV9zaXplLmhlaWdodCgpKTsKKyAgICBBU1NFUlQob3JpZ2luWSA+PSAwKTsKKyAgICBBU1NF
UlQob3JpZ2luWSA8IHNvdXJjZVJlY3QuYm90dG9tKCkpOworCisgICAgaW50IGVuZFkgPSBkZXN0
UG9pbnQueSgpICsgc291cmNlUmVjdC5ib3R0b20oKTsKKyAgICBBU1NFUlQoZW5kWSA8PSBtX3Np
emUuaGVpZ2h0KCkpOworICAgIGludCBudW1Sb3dzID0gZW5kWSAtIGRlc3RZOworCisgICAgY29u
c3QgU2tCaXRtYXAmIGJpdG1hcCA9ICpjb250ZXh0KCktPnBsYXRmb3JtQ29udGV4dCgpLT5iaXRt
YXAoKTsKKyAgICBBU1NFUlQoYml0bWFwLmNvbmZpZygpID09IFNrQml0bWFwOjprQVJHQl84ODg4
X0NvbmZpZyk7CisgICAgU2tBdXRvTG9ja1BpeGVscyBiaXRtYXBMb2NrKGJpdG1hcCk7CisKKyAg
ICB1bnNpZ25lZCBzcmNCeXRlc1BlclJvdyA9IDQgKiBzb3VyY2UtPndpZHRoKCk7CisKKyAgICBj
b25zdCB1bnNpZ25lZCBjaGFyKiBzcmNSb3cgPSBzb3VyY2UtPmRhdGEoKS0+ZGF0YSgpICsgb3Jp
Z2luWSAqIHNyY0J5dGVzUGVyUm93ICsgb3JpZ2luWCAqIDQ7CisKKyAgICBmb3IgKGludCB5ID0g
MDsgeSA8IG51bVJvd3M7ICsreSkgeworICAgICAgICB1aW50MzJfdCogZGVzdFJvdyA9IGJpdG1h
cC5nZXRBZGRyMzIoZGVzdFgsIGRlc3RZICsgeSk7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4
IDwgbnVtQ29sdW1uczsgKyt4KSB7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBz
cmNQaXhlbCA9ICZzcmNSb3dbeCAqIDRdOworICAgICAgICAgICAgZGVzdFJvd1t4XSA9IFNrUHJl
TXVsdGlwbHlBUkdCKHNyY1BpeGVsWzNdLCBzcmNQaXhlbFswXSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQaXhlbFsxXSwgc3JjUGl4ZWxbMl0pOworICAg
ICAgICB9CisgICAgICAgIHNyY1JvdyArPSBzcmNCeXRlc1BlclJvdzsKKyAgICB9Cit9CisKK1N0
cmluZyBJbWFnZUJ1ZmZlcjo6dG9EYXRhVVJMKGNvbnN0IFN0cmluZyYpIGNvbnN0Cit7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9J
bWFnZVNraWEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlU2tpYS5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExMmFmMwotLS0gL2Rldi9u
dWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNraWEuY3BwCkBA
IC0wLDAgKzEsNDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUK
KyAqIG1ldDoKKyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisg
KiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkJpdG1h
cEltYWdlLmgiCisjaW5jbHVkZSAiQml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWEuaCIKKyNpbmNs
dWRlICJDaHJvbWl1bUJyaWRnZS5oIgorI2luY2x1ZGUgIkZsb2F0Q29udmVyc2lvbi5oIgorI2lu
Y2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1
ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJOYXRpdmVJbWFnZVNraWEuaCIKKyNpbmNsdWRlICJO
b3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKKyNpbmNs
dWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNraWFVdGlscy5oIgorI2luY2x1ZGUg
IlNrU2hhZGVyLmgiCisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKworI2luY2x1
ZGUgInNraWEvZXh0L2ltYWdlX29wZXJhdGlvbnMuaCIKKyNpbmNsdWRlICJza2lhL2V4dC9wbGF0
Zm9ybV9jYW52YXMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBVc2VkIGJ5IGNvbXB1
dGVSZXNhbXBsaW5nTW9kZSB0byB0ZWxsIGhvdyBiaXRtYXBzIHNob3VsZCBiZSByZXNhbXBsZWQu
CitlbnVtIFJlc2FtcGxpbmdNb2RlIHsKKyAgICAvLyBOZWFyZXN0IG5laWdoYm9yIHJlc2FtcGxp
bmcuIFVzZWQgd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgcGFnZSBpcworICAgIC8vIHRyeWluZyB0
byBtYWtlIGEgcGF0dGVybiBieSBzdHJldGNoaW5nIGEgc21hbGwgYml0bWFwIHZlcnkgbGFyZ2Uu
CisgICAgUkVTQU1QTEVfTk9ORSwKKworICAgIC8vIERlZmF1bHQgc2tpYSByZXNhbXBsaW5nLiBV
c2VkIGZvciBsYXJnZSBncm93aW5nIG9mIGltYWdlcyB3aGVyZSBoaWdoCisgICAgLy8gcXVhbGl0
eSByZXNhbXBsaW5nIGRvZXNuJ3QgZ2V0IHVzIHZlcnkgbXVjaCBleGNlcHQgYSBzbG93ZG93bi4K
KyAgICBSRVNBTVBMRV9MSU5FQVIsCisKKyAgICAvLyBIaWdoIHF1YWxpdHkgcmVzYW1wbGluZy4K
KyAgICBSRVNBTVBMRV9BV0VTT01FLAorfTsKKworc3RhdGljIFJlc2FtcGxpbmdNb2RlIGNvbXB1
dGVSZXNhbXBsaW5nTW9kZShjb25zdCBOYXRpdmVJbWFnZVNraWEmIGJpdG1hcCwgaW50IHNyY1dp
ZHRoLCBpbnQgc3JjSGVpZ2h0LCBmbG9hdCBkZXN0V2lkdGgsIGZsb2F0IGRlc3RIZWlnaHQpCit7
CisgICAgaW50IGRlc3RJV2lkdGggPSBzdGF0aWNfY2FzdDxpbnQ+KGRlc3RXaWR0aCk7CisgICAg
aW50IGRlc3RJSGVpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50PihkZXN0SGVpZ2h0KTsKKworICAgIC8v
IFRoZSBwZXJjZW50IGNoYW5nZSBiZWxvdyB3aGljaCB3ZSB3aWxsIG5vdCByZXNhbXBsZS4gVGhp
cyB1c3VhbGx5IG1lYW5zCisgICAgLy8gYW4gb2ZmLWJ5LW9uZSBlcnJvciBvbiB0aGUgd2ViIHBh
Z2UsIGFuZCBqdXN0IGRvaW5nIG5lYXJlc3QgbmVpZ2hib3IKKyAgICAvLyBzYW1wbGluZyBpcyB1
c3VhbGx5IGdvb2QgZW5vdWdoLgorICAgIGNvbnN0IGZsb2F0IGtGcmFjdGlvbmFsQ2hhbmdlVGhy
ZXNob2xkID0gMC4wMjVmOworCisgICAgLy8gSW1hZ2VzIHNtYWxsZXIgdGhhbiB0aGlzIGluIGVp
dGhlciBkaXJlY3Rpb24gYXJlIGNvbnNpZGVyZWQgInNtYWxsIiBhbmQKKyAgICAvLyBhcmUgbm90
IHJlc2FtcGxlZCBldmVyIChzZWUgYmVsb3cpLgorICAgIGNvbnN0IGludCBrU21hbGxJbWFnZVNp
emVUaHJlc2hvbGQgPSA4OworCisgICAgLy8gVGhlIGFtb3VudCBhbiBpbWFnZSBjYW4gYmUgc3Ry
ZXRjaGVkIGluIGEgc2luZ2xlIGRpcmVjdGlvbiBiZWZvcmUgd2UKKyAgICAvLyBzYXkgdGhhdCBp
dCBpcyBiZWluZyBzdHJldGNoZWQgc28gbXVjaCB0aGF0IGl0IG11c3QgYmUgYSBsaW5lIG9yCisg
ICAgLy8gYmFja2dyb3VuZCB0aGF0IGRvZXNuJ3QgbmVlZCByZXNhbXBsaW5nLgorICAgIGNvbnN0
IGZsb2F0IGtMYXJnZVN0cmV0Y2ggPSAzLjBmOworCisgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBz
aG91bGQgcmVzYW1wbGUgdGhpcyBpbWFnZS4gV2UgdHJ5IHRvIHBydW5lIG91dCBzb21lCisgICAg
Ly8gY29tbW9uIGNhc2VzIHdoZXJlIHJlc2FtcGxpbmcgd29uJ3QgZ2l2ZSB1cyBhbnl0aGluZywg
c2luY2UgaXQgaXMgbXVjaAorICAgIC8vIHNsb3dlciB0aGFuIGRyYXdpbmcgc3RyZXRjaGVkLgor
ICAgIGlmIChzcmNXaWR0aCA9PSBkZXN0SVdpZHRoICYmIHNyY0hlaWdodCA9PSBkZXN0SUhlaWdo
dCkgeworICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlc2FtcGxlIGlmIHRoZSBzb3VyY2Ug
YW5kIGRlc3RpbmF0aW9uIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgcmV0dXJuIFJFU0FNUExFX05P
TkU7CisgICAgfQorCisgICAgaWYgKHNyY1dpZHRoIDw9IGtTbWFsbEltYWdlU2l6ZVRocmVzaG9s
ZAorICAgICAgICB8fCBzcmNIZWlnaHQgPD0ga1NtYWxsSW1hZ2VTaXplVGhyZXNob2xkCisgICAg
ICAgIHx8IGRlc3RXaWR0aCA8PSBrU21hbGxJbWFnZVNpemVUaHJlc2hvbGQKKyAgICAgICAgfHwg
ZGVzdEhlaWdodCA8PSBrU21hbGxJbWFnZVNpemVUaHJlc2hvbGQpIHsKKyAgICAgICAgLy8gTmV2
ZXIgcmVzYW1wbGUgc21hbGwgaW1hZ2VzLiBUaGVzZSBhcmUgb2Z0ZW4gdXNlZCBmb3IgYm9yZGVy
cyBhbmQKKyAgICAgICAgLy8gcnVsZXMgKHRoaW5rIDF4MSBpbWFnZXMgdXNlZCB0byBtYWtlIGxp
bmVzKS4KKyAgICAgICAgcmV0dXJuIFJFU0FNUExFX05PTkU7CisgICAgfQorCisgICAgaWYgKHNy
Y0hlaWdodCAqIGtMYXJnZVN0cmV0Y2ggPD0gZGVzdEhlaWdodCB8fCBzcmNXaWR0aCAqIGtMYXJn
ZVN0cmV0Y2ggPD0gZGVzdFdpZHRoKSB7CisgICAgICAgIC8vIExhcmdlIGltYWdlIGRldGVjdGVk
LgorCisgICAgICAgIC8vIERvbid0IHJlc2FtcGxlIGlmIGl0IGlzIGJlaW5nIHN0cmV0Y2hlZCBh
IGxvdCBpbiBvbmx5IG9uZSBkaXJlY3Rpb24uCisgICAgICAgIC8vIFRoaXMgaXMgdHJ5aW5nIHRv
IGNhdGNoIGNhc2VzIHdoZXJlIHNvbWVib2R5IGhhcyBjcmVhdGVkIGEgYm9yZGVyCisgICAgICAg
IC8vICh3aGljaCBtaWdodCBiZSBsYXJnZSkgYW5kIHRoZW4gaXMgc3RyZXRjaGluZyBpdCB0byBm
aWxsIHNvbWUgcGFydAorICAgICAgICAvLyBvZiB0aGUgcGFnZS4KKyAgICAgICAgaWYgKHNyY1dp
ZHRoID09IGRlc3RXaWR0aCB8fCBzcmNIZWlnaHQgPT0gZGVzdEhlaWdodCkKKyAgICAgICAgICAg
IHJldHVybiBSRVNBTVBMRV9OT05FOworCisgICAgICAgIC8vIFRoZSBpbWFnZSBpcyBncm93aW5n
IGEgbG90IGFuZCBpbiBtb3JlIHRoYW4gb25lIGRpcmVjdGlvbi4gUmVzYW1wbGluZworICAgICAg
ICAvLyBpcyBzbG93IGFuZCBkb2Vzbid0IGdpdmUgdXMgdmVyeSBtdWNoIHdoZW4gZ3Jvd2luZyBh
IGxvdC4KKyAgICAgICAgcmV0dXJuIFJFU0FNUExFX0xJTkVBUjsKKyAgICB9CisKKyAgICBpZiAo
KGZhYnMoZGVzdFdpZHRoIC0gc3JjV2lkdGgpIC8gc3JjV2lkdGggPCBrRnJhY3Rpb25hbENoYW5n
ZVRocmVzaG9sZCkKKyAgICAgICAgJiYgKGZhYnMoZGVzdEhlaWdodCAtIHNyY0hlaWdodCkgLyBz
cmNIZWlnaHQgPCBrRnJhY3Rpb25hbENoYW5nZVRocmVzaG9sZCkpIHsKKyAgICAgICAgLy8gSXQg
aXMgZGlzYXBwb2ludGluZ2x5IGNvbW1vbiBvbiB0aGUgd2ViIGZvciBpbWFnZSBzaXplcyB0byBi
ZSBvZmYgYnkKKyAgICAgICAgLy8gb25lIG9yIHR3byBwaXhlbHMuIFdlIGRvbid0IGJvdGhlciBy
ZXNhbXBsaW5nIGlmIHRoZSBzaXplIGRpZmZlcmVuY2UKKyAgICAgICAgLy8gaXMgYSBzbWFsbCBm
cmFjdGlvbiBvZiB0aGUgb3JpZ2luYWwgc2l6ZS4KKyAgICAgICAgcmV0dXJuIFJFU0FNUExFX05P
TkU7CisgICAgfQorCisgICAgLy8gV2hlbiB0aGUgaW1hZ2UgaXMgbm90IHlldCBkb25lIGxvYWRp
bmcsIHVzZSBsaW5lYXIuIFdlIGRvbid0IGNhY2hlIHRoZQorICAgIC8vIHBhcnRpYWxseSByZXNh
bXBsZWQgaW1hZ2VzLCBhbmQgYXMgdGhleSBjb21lIGluIGluY3JlbWVudGFsbHksIGl0IGNhdXNl
cworICAgIC8vIHVzIHRvIGhhdmUgdG8gcmVzYW1wbGUgdGhlIHdob2xlIHRoaW5nIGV2ZXJ5IHRp
bWUuCisgICAgaWYgKCFiaXRtYXAuaXNEYXRhQ29tcGxldGUoKSkKKyAgICAgICAgcmV0dXJuIFJF
U0FNUExFX0xJTkVBUjsKKworICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBnZXRzIHJlc2FtcGxlZC4K
KyAgICByZXR1cm4gUkVTQU1QTEVfQVdFU09NRTsKK30KKworLy8gRHJhd3MgdGhlIGdpdmVuIGJp
dG1hcCB0byB0aGUgZ2l2ZW4gY2FudmFzLiBUaGUgc3Vic2V0IG9mIHRoZSBzb3VyY2UgYml0bWFw
CisvLyBpZGVudGlmaWVkIGJ5IHNyY19yZWN0IGlzIGRyYXduIHRvIHRoZSBnaXZlbiBkZXN0aW5h
dGlvbiByZWN0LiBUaGUgYml0bWFwCisvLyB3aWxsIGJlIHJlc2FtcGxlZCB0byByZXNhbXBsZV93
aWR0aCAqIHJlc2FtcGxlX2hlaWdodCAodGhpcyBpcyB0aGUgc2l6ZSBvZgorLy8gdGhlIHdob2xl
IGltYWdlLCBub3QgdGhlIHN1YnNldCkuIFNlZSBzaG91bGRSZXNhbXBsZUJpdG1hcCBmb3IgbW9y
ZS4KKy8vCisvLyBUaGlzIGRvZXMgYSBsb3Qgb2YgY29tcHV0YXRpb24gdG8gcmVzYW1wbGUgb25s
eSB0aGUgcG9ydGlvbiBvZiB0aGUgYml0bWFwCisvLyB0aGF0IHdpbGwgb25seSBiZSBkcmF3bi4g
VGhpcyBpcyBjcml0aWNhbCBmb3IgcGVyZm9ybWFuY2Ugc2luY2Ugd2hlbiB3ZSBhcmUKKy8vIHNj
cm9sbGluZywgZm9yIGV4YW1wbGUsIHdlIGFyZSBvbmx5IGRyYXdpbmcgYSBzbWFsbCBzdHJpcCBv
ZiB0aGUgaW1hZ2UuCisvLyBSZXNhbXBsaW5nIHRoZSB3aG9sZSBpbWFnZSBldmVyeSB0aW1lIGlz
IHZlcnkgc2xvdywgc28gdGhpcyBzcGVlZHMgdXAgdGhpbmdzCisvLyBkcmFtYXRpY2FsbHkuCitz
dGF0aWMgdm9pZCBkcmF3UmVzYW1wbGVkQml0bWFwKFNrQ2FudmFzJiBjYW52YXMsIFNrUGFpbnQm
IHBhaW50LCBjb25zdCBOYXRpdmVJbWFnZVNraWEmIGJpdG1hcCwgY29uc3QgU2tJUmVjdCYgc3Jj
SVJlY3QsIGNvbnN0IFNrUmVjdCYgZGVzdFJlY3QpCit7CisgICAgLy8gRmlyc3QgZ2V0IHRoZSBz
dWJzZXQgd2UgbmVlZC4gVGhpcyBpcyBlZmZpY2llbnQgYW5kIGRvZXMgbm90IGNvcHkgcGl4ZWxz
LgorICAgIFNrQml0bWFwIHN1YnNldDsKKyAgICBiaXRtYXAuZXh0cmFjdFN1YnNldCgmc3Vic2V0
LCBzcmNJUmVjdCk7CisgICAgU2tSZWN0IHNyY1JlY3Q7CisgICAgc3JjUmVjdC5zZXQoc3JjSVJl
Y3QpOworCisgICAgLy8gV2hldGhlciB3ZSdyZSBkb2luZyBhIHN1YnNldCBvciB1c2luZyB0aGUg
ZnVsbCBzb3VyY2UgaW1hZ2UuCisgICAgYm9vbCBzcmNJc0Z1bGwgPSBzcmNJUmVjdC5mTGVmdCA9
PSAwICYmIHNyY0lSZWN0LmZUb3AgPT0gMAorICAgICAgICAmJiBzcmNJUmVjdC53aWR0aCgpID09
IGJpdG1hcC53aWR0aCgpCisgICAgICAgICYmIHNyY0lSZWN0LmhlaWdodCgpID09IGJpdG1hcC5o
ZWlnaHQoKTsKKworICAgIC8vIFdlIHdpbGwgYWx3YXlzIGRyYXcgaW4gaW50ZWdlciBzaXplcywg
c28gcm91bmQgdGhlIGRlc3RpbmF0aW9uIHJlY3QuCisgICAgU2tJUmVjdCBkZXN0UmVjdFJvdW5k
ZWQ7CisgICAgZGVzdFJlY3Qucm91bmQoJmRlc3RSZWN0Um91bmRlZCk7CisgICAgU2tJUmVjdCBy
ZXNpemVkSW1hZ2VSZWN0OyAgLy8gUmVwcmVzZW50cyB0aGUgc2l6ZSBvZiB0aGUgcmVzaXplZCBp
bWFnZS4KKyAgICByZXNpemVkSW1hZ2VSZWN0LnNldCgwLCAwLCBkZXN0UmVjdFJvdW5kZWQud2lk
dGgoKSwgZGVzdFJlY3RSb3VuZGVkLmhlaWdodCgpKTsKKworICAgIGlmIChzcmNJc0Z1bGwgJiYg
Yml0bWFwLmhhc1Jlc2l6ZWRCaXRtYXAoZGVzdFJlY3RSb3VuZGVkLndpZHRoKCksIGRlc3RSZWN0
Um91bmRlZC5oZWlnaHQoKSkpIHsKKyAgICAgICAgLy8gWWF5LCB0aGlzIGJpdG1hcCBmcmFtZSBh
bHJlYWR5IGhhcyBhIHJlc2l6ZWQgdmVyc2lvbi4KKyAgICAgICAgU2tCaXRtYXAgcmVzYW1wbGVk
ID0gYml0bWFwLnJlc2l6ZWRCaXRtYXAoZGVzdFJlY3RSb3VuZGVkLndpZHRoKCksIGRlc3RSZWN0
Um91bmRlZC5oZWlnaHQoKSk7CisgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwUmVjdChyZXNhbXBs
ZWQsIDAsIGRlc3RSZWN0LCAmcGFpbnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
Ly8gQ29tcHV0ZSB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIG91ciByZWN0LgorICAgIFNrUmVjdCBk
ZXN0Qml0bWFwU3Vic2V0U2s7CisgICAgQ2xpcFJlY3RUb0NhbnZhcyhjYW52YXMsIGRlc3RSZWN0
LCAmZGVzdEJpdG1hcFN1YnNldFNrKTsKKyAgICBkZXN0Qml0bWFwU3Vic2V0U2sub2Zmc2V0KC1k
ZXN0UmVjdC5mTGVmdCwgLWRlc3RSZWN0LmZUb3ApOworCisgICAgLy8gVGhlIG1hdHJpeCBpbnZl
cnRpbmcsIGV0Yy4gY291bGQgaGF2ZSBpbnRyb2R1Y2VkIHJvdW5kaW5nIGVycm9yIHdoaWNoCisg
ICAgLy8gY2F1c2VzIHRoZSBib3VuZHMgdG8gYmUgb3V0c2lkZSBvZiB0aGUgcmVzaXplZCBiaXRt
YXAuIFdlIHJvdW5kIG91dHdhcmQKKyAgICAvLyBzbyB3ZSBhbHdheXMgbGVhbiB0b3dhcmQgaXQg
YmVpbmcgbGFyZ2VyIHJhdGhlciB0aGFuIHNtYWxsZXIgdGhhbiB3ZQorICAgIC8vIG5lZWQsIGFu
ZCB0aGVuIGNsYW1wIHRvIHRoZSBiaXRtYXAgYm91bmRzIHNvIHdlIGRvbid0IGdldCBhbnkgaW52
YWxpZAorICAgIC8vIGRhdGEuCisgICAgU2tJUmVjdCBkZXN0Qml0bWFwU3Vic2V0U2tJOworICAg
IGRlc3RCaXRtYXBTdWJzZXRTay5yb3VuZE91dCgmZGVzdEJpdG1hcFN1YnNldFNrSSk7CisgICAg
aWYgKCFkZXN0Qml0bWFwU3Vic2V0U2tJLmludGVyc2VjdChyZXNpemVkSW1hZ2VSZWN0KSkKKyAg
ICAgICAgcmV0dXJuOyAgLy8gUmVzaXplZCBpbWFnZSBkb2VzIG5vdCBpbnRlcnNlY3QuCisKKyAg
ICBpZiAoc3JjSXNGdWxsICYmIGJpdG1hcC5zaG91bGRDYWNoZVJlc2FtcGxpbmcoCisgICAgICAg
ICAgICByZXNpemVkSW1hZ2VSZWN0LndpZHRoKCksCisgICAgICAgICAgICByZXNpemVkSW1hZ2VS
ZWN0LmhlaWdodCgpLAorICAgICAgICAgICAgZGVzdEJpdG1hcFN1YnNldFNrSS53aWR0aCgpLAor
ICAgICAgICAgICAgZGVzdEJpdG1hcFN1YnNldFNrSS5oZWlnaHQoKSkpIHsKKyAgICAgICAgLy8g
V2UncmUgc3VwcG9zZWQgdG8gcmVzaXplIHRoZSBlbnRpcmUgaW1hZ2UgYW5kIGNhY2hlIGl0LCBl
dmVuIHRob3VnaAorICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIGFsbCBvZiBpdC4KKyAgICAgICAg
U2tCaXRtYXAgcmVzYW1wbGVkID0gYml0bWFwLnJlc2l6ZWRCaXRtYXAoZGVzdFJlY3RSb3VuZGVk
LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGRlc3RSZWN0Um91bmRlZC5oZWlnaHQoKSk7CisgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFw
UmVjdChyZXNhbXBsZWQsIDAsIGRlc3RSZWN0LCAmcGFpbnQpOworICAgIH0gZWxzZSB7CisgICAg
ICAgIC8vIFdlIHNob3VsZCBvbmx5IHJlc2l6ZSB0aGUgZXhwb3NlZCBwYXJ0IG9mIHRoZSBiaXRt
YXAgdG8gZG8gdGhlCisgICAgICAgIC8vIG1pbmltYWwgcG9zc2libGUgd29yay4KKyAgICAgICAg
Z2Z4OjpSZWN0IGRlc3RCaXRtYXBTdWJzZXQoZGVzdEJpdG1hcFN1YnNldFNrSS5mTGVmdCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdEJpdG1hcFN1YnNldFNrSS5mVG9w
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Qml0bWFwU3Vic2V0U2tJ
LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RCaXRtYXBT
dWJzZXRTa0kuaGVpZ2h0KCkpOworCisgICAgICAgIC8vIFJlc2FtcGxlIHRoZSBuZWVkZWQgcGFy
dCBvZiB0aGUgaW1hZ2UuCisgICAgICAgIFNrQml0bWFwIHJlc2FtcGxlZCA9IHNraWE6OkltYWdl
T3BlcmF0aW9uczo6UmVzaXplKHN1YnNldCwKKyAgICAgICAgICAgIHNraWE6OkltYWdlT3BlcmF0
aW9uczo6UkVTSVpFX0xBTkNaT1MzLAorICAgICAgICAgICAgZGVzdFJlY3RSb3VuZGVkLndpZHRo
KCksIGRlc3RSZWN0Um91bmRlZC5oZWlnaHQoKSwKKyAgICAgICAgICAgIGRlc3RCaXRtYXBTdWJz
ZXQpOworCisgICAgICAgIC8vIENvbXB1dGUgd2hlcmUgdGhlIG5ldyBiaXRtYXAgc2hvdWxkIGJl
IGRyYXduLiBTaW5jZSBvdXIgbmV3IGJpdG1hcAorICAgICAgICAvLyBtYXkgYmUgc21hbGxlciB0
aGFuIHRoZSBvcmlnaW5hbCwgd2UgaGF2ZSB0byBzaGlmdCBpdCBvdmVyIGJ5IHRoZQorICAgICAg
ICAvLyBzYW1lIGFtb3VudCB0aGF0IHdlIGN1dCBvZmYgdGhlIHRvcCBhbmQgbGVmdC4KKyAgICAg
ICAgU2tSZWN0IG9mZnNldERlc3RSZWN0ID0geworICAgICAgICAgICAgZGVzdEJpdG1hcFN1YnNl
dC54KCkgKyBkZXN0UmVjdC5mTGVmdCwKKyAgICAgICAgICAgIGRlc3RCaXRtYXBTdWJzZXQueSgp
ICsgZGVzdFJlY3QuZlRvcCwKKyAgICAgICAgICAgIGRlc3RCaXRtYXBTdWJzZXQucmlnaHQoKSAr
IGRlc3RSZWN0LmZMZWZ0LAorICAgICAgICAgICAgZGVzdEJpdG1hcFN1YnNldC5ib3R0b20oKSAr
IGRlc3RSZWN0LmZUb3AgfTsKKworICAgICAgICBjYW52YXMuZHJhd0JpdG1hcFJlY3QocmVzYW1w
bGVkLCAwLCBvZmZzZXREZXN0UmVjdCwgJnBhaW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lk
IHBhaW50U2tCaXRtYXAoUGxhdGZvcm1Db250ZXh0U2tpYSogcGxhdGZvcm1Db250ZXh0LCBjb25z
dCBOYXRpdmVJbWFnZVNraWEmIGJpdG1hcCwgY29uc3QgU2tJUmVjdCYgc3JjUmVjdCwgY29uc3Qg
U2tSZWN0JiBkZXN0UmVjdCwgY29uc3QgU2tQb3J0ZXJEdWZmOjpNb2RlJiBjb21wT3ApCit7Cisg
ICAgU2tQYWludCBwYWludDsKKyAgICBwYWludC5zZXRQb3J0ZXJEdWZmWGZlcm1vZGUoY29tcE9w
KTsKKworICAgIHNraWE6OlBsYXRmb3JtQ2FudmFzKiBjYW52YXMgPSBwbGF0Zm9ybUNvbnRleHQt
PmNhbnZhcygpOworCisgICAgUmVzYW1wbGluZ01vZGUgcmVzYW1wbGluZyA9IHBsYXRmb3JtQ29u
dGV4dC0+SXNQcmludGluZygpID8gUkVTQU1QTEVfTk9ORSA6CisgICAgICAgIGNvbXB1dGVSZXNh
bXBsaW5nTW9kZShiaXRtYXAsIHNyY1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWlnaHQoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrU2NhbGFyVG9GbG9hdChkZXN0UmVjdC53aWR0
aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrU2NhbGFyVG9GbG9hdChkZXN0
UmVjdC5oZWlnaHQoKSkpOworICAgIGlmIChyZXNhbXBsaW5nID09IFJFU0FNUExFX0FXRVNPTUUp
IHsKKyAgICAgICAgcGFpbnQuc2V0RmlsdGVyQml0bWFwKGZhbHNlKTsKKyAgICAgICAgZHJhd1Jl
c2FtcGxlZEJpdG1hcCgqY2FudmFzLCBwYWludCwgYml0bWFwLCBzcmNSZWN0LCBkZXN0UmVjdCk7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTm8gcmVzYW1wbGluZyBuZWNlc3NhcnksIHdlIGNh
biBqdXN0IGRyYXcgdGhlIGJpdG1hcC4gV2Ugd2FudCB0bworICAgICAgICAvLyBmaWx0ZXIgaXQg
aWYgd2UgZGVjaWRlZCB0byBkbyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBhYm92ZSwgb3IgaWYgdGhl
cmUKKyAgICAgICAgLy8gaXMgc29tZXRoaW5nIGludGVyZXN0aW5nIGdvaW5nIG9uIHdpdGggdGhl
IG1hdHJpeCAobGlrZSBhIHJvdGF0aW9uKS4KKyAgICAgICAgLy8gTm90ZTogZm9yIHNlcmlhbGl6
YXRpb24sIHdlIHdpbGwgd2FudCB0byBzdWJzZXQgdGhlIGJpdG1hcCBmaXJzdCBzbworICAgICAg
ICAvLyB3ZSBkb24ndCBzZW5kIGV4dHJhIHBpeGVscy4KKyAgICAgICAgcGFpbnQuc2V0RmlsdGVy
Qml0bWFwKHJlc2FtcGxpbmcgPT0gUkVTQU1QTEVfTElORUFSKTsKKyAgICAgICAgY2FudmFzLT5k
cmF3Qml0bWFwUmVjdChiaXRtYXAsICZzcmNSZWN0LCBkZXN0UmVjdCwgJnBhaW50KTsKKyAgICB9
Cit9CisKKy8vIFRyYW5zZm9ybXMgdGhlIGdpdmVuIGRpbWVuc2lvbnMgd2l0aCB0aGUgZ2l2ZW4g
bWF0cml4LiBVc2VkIHRvIHNlZSBob3cgYmlnCisvLyBpbWFnZXMgd2lsbCBiZSBvbmNlIHRyYW5z
Zm9ybWVkLgorc3RhdGljIHZvaWQgVHJhbnNmb3JtRGltZW5zaW9ucyhjb25zdCBTa01hdHJpeCYg
bWF0cml4LCBmbG9hdCBzcmNXaWR0aCwgZmxvYXQgc3JjSGVpZ2h0LCBmbG9hdCogZGVzdFdpZHRo
LCBmbG9hdCogZGVzdEhlaWdodCkgeworICAgIC8vIFRyYW5zZm9ybSAzIHBvaW50cyB0byBzZWUg
aG93IGxvbmcgZWFjaCBzaWRlIG9mIHRoZSBiaXRtYXAgd2lsbCBiZS4KKyAgICBTa1BvaW50IHNy
Y19wb2ludHNbM107ICAvLyAoMCwgMCksICh3aWR0aCwgMCksICgwLCBoZWlnaHQpLgorICAgIHNy
Y19wb2ludHNbMF0uc2V0KDAsIDApOworICAgIHNyY19wb2ludHNbMV0uc2V0KFNrRmxvYXRUb1Nj
YWxhcihzcmNXaWR0aCksIDApOworICAgIHNyY19wb2ludHNbMl0uc2V0KDAsIFNrRmxvYXRUb1Nj
YWxhcihzcmNIZWlnaHQpKTsKKworICAgIC8vIE5vdyBtZWFzdXJlIHRoZSBsZW5ndGggb2YgdGhl
IHR3byB0cmFuc2Zvcm1lZCB2ZWN0b3JzIHJlbGF0aXZlIHRvIHRoZQorICAgIC8vIHRyYW5zZm9y
bWVkIG9yaWdpbiB0byBzZWUgaG93IGJpZyB0aGUgYml0bWFwIHdpbGwgYmUuIE5vdGU6IGZvciBz
a2V3cywKKyAgICAvLyB0aGlzIGlzbid0IHRoZSBiZXN0IHRoaW5nLCBidXQgd2UgZG9uJ3QgaGF2
ZSBza2V3cy4KKyAgICBTa1BvaW50IGRlc3RfcG9pbnRzWzNdOworICAgIG1hdHJpeC5tYXBQb2lu
dHMoZGVzdF9wb2ludHMsIHNyY19wb2ludHMsIDMpOworICAgICpkZXN0V2lkdGggPSBTa1NjYWxh
clRvRmxvYXQoKGRlc3RfcG9pbnRzWzFdIC0gZGVzdF9wb2ludHNbMF0pLmxlbmd0aCgpKTsKKyAg
ICAqZGVzdEhlaWdodCA9IFNrU2NhbGFyVG9GbG9hdCgoZGVzdF9wb2ludHNbMl0gLSBkZXN0X3Bv
aW50c1swXSkubGVuZ3RoKCkpOworfQorCisvLyBBIGhlbHBlciBtZXRob2QgZm9yIHRyYW5zbGF0
aW5nIG5lZ2F0aXZlIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzLgorc3RhdGljIEZsb2F0UmVjdCBu
b3JtYWxpemVSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBGbG9hdFJlY3Qgbm9y
bSA9IHJlY3Q7CisgICAgaWYgKG5vcm0ud2lkdGgoKSA8IDApIHsKKyAgICAgICAgbm9ybS5zZXRY
KG5vcm0ueCgpICsgbm9ybS53aWR0aCgpKTsKKyAgICAgICAgbm9ybS5zZXRXaWR0aCgtbm9ybS53
aWR0aCgpKTsKKyAgICB9CisgICAgaWYgKG5vcm0uaGVpZ2h0KCkgPCAwKSB7CisgICAgICAgIG5v
cm0uc2V0WShub3JtLnkoKSArIG5vcm0uaGVpZ2h0KCkpOworICAgICAgICBub3JtLnNldEhlaWdo
dCgtbm9ybS5oZWlnaHQoKSk7CisgICAgfQorICAgIHJldHVybiBub3JtOworfQorCit2b2lkIEZy
YW1lRGF0YTo6Y2xlYXIoKQoreworICAgIC8vIEltYWdlU291cmNlOjpjcmVhdGVGcmFtZUF0SW5k
ZXgoKSBhbGxvY2F0ZWQgfG1fZnJhbWV8IGFuZCBwYXNzZWQKKyAgICAvLyBvd25lcnNoaXAgdG8g
Qml0bWFwSW1hZ2U7IHdlIG11c3QgZGVsZXRlIGl0IGhlcmUuCisgICAgZGVsZXRlIG1fZnJhbWU7
CisgICAgbV9mcmFtZSA9IDA7CisgICAgLy8gTk9URTogV2UgcHVycG9zZWZ1bGx5IGRvbid0IHJl
c2V0IG1ldGFkYXRhIGhlcmUsIHNvIHRoYXQgZXZlbiBpZiB3ZQorICAgIC8vIHRocm93IGF3YXkg
cHJldmlvdXNseS1kZWNvZGVkIGRhdGEsIGFuaW1hdGlvbiBsb29wcyBjYW4gc3RpbGwgYWNjZXNz
CisgICAgLy8gcHJvcGVydGllcyBsaWtlIGZyYW1lIGR1cmF0aW9ucyB3aXRob3V0IHJlLWRlY29k
aW5nLgorfQorCitQYXNzUmVmUHRyPEltYWdlPiBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2Uo
Y29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICByZXR1cm4gQ2hyb21pdW1CcmlkZ2U6OmxvYWRQbGF0
Zm9ybUltYWdlUmVzb3VyY2UobmFtZSk7Cit9CisKK3ZvaWQgSW1hZ2U6OmRyYXdQYXR0ZXJuKEdy
YXBoaWNzQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZs
b2F0UmVjdCYgZmxvYXRTcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgmIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENv
bXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wLAorICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgRmxvYXRSZWN0JiBkZXN0UmVjdCkKK3sKKyAgICBpZiAoZGVzdFJlY3QuaXNFbXB0eSgpIHx8
IGZsb2F0U3JjUmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsgIC8vIG5vdGhpbmcgdG8g
ZHJhdworCisgICAgTmF0aXZlSW1hZ2VTa2lhKiBiaXRtYXAgPSBuYXRpdmVJbWFnZUZvckN1cnJl
bnRGcmFtZSgpOworICAgIGlmICghYml0bWFwKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBU
aGlzIGlzIGEgdmVyeSBpbmV4cGVuc2l2ZSBvcGVyYXRpb24uIEl0IHdpbGwgZ2VuZXJhdGUgYSBu
ZXcgYml0bWFwIGJ1dAorICAgIC8vIGl0IHdpbGwgaW50ZXJuYWxseSByZWZlcmVuY2UgdGhlIG9s
ZCBiaXRtYXAncyBwaXhlbHMsIGFkanVzdGluZyB0aGUgcm93CisgICAgLy8gc3RyaWRlIHNvIHRo
ZSBleHRyYSBwaXhlbHMgYXBwZWFyIGFzIHBhZGRpbmcgdG8gdGhlIHN1YnNldHRlZCBiaXRtYXAu
CisgICAgU2tCaXRtYXAgc3JjU3Vic2V0OworICAgIFNrSVJlY3Qgc3JjUmVjdCA9IGVuY2xvc2lu
Z0ludFJlY3QoZmxvYXRTcmNSZWN0KTsKKyAgICBiaXRtYXAtPmV4dHJhY3RTdWJzZXQoJnNyY1N1
YnNldCwgc3JjUmVjdCk7CisKKyAgICBTa0JpdG1hcCByZXNhbXBsZWQ7CisgICAgU2tTaGFkZXIq
IHNoYWRlcjsKKworICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCBzaXplIHRoZSBiaXRtYXAgd2lsbCBi
ZSBpbiB0aGUgZGVzdGluYXRpb24uIFRoZQorICAgIC8vIGRlc3RpbmF0aW9uIHJlY3QgaXMgdGhl
IGJvdW5kcyBvZiB0aGUgcGF0dGVybiwgd2UgbmVlZCB0byB1c2UgdGhlCisgICAgLy8gbWF0cml4
IHRvIHNlZSBob3cgYml0IGl0IHdpbGwgYmUuCisgICAgZmxvYXQgZGVzdEJpdG1hcFdpZHRoLCBk
ZXN0Qml0bWFwSGVpZ2h0OworICAgIFRyYW5zZm9ybURpbWVuc2lvbnMocGF0dGVyblRyYW5zZm9y
bSwgc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgJmRlc3RCaXRtYXBXaWR0aCwgJmRlc3RCaXRtYXBIZWlnaHQpOworCisgICAgLy8gQ29t
cHV0ZSB0aGUgcmVzYW1wbGluZyBtb2RlLgorICAgIFJlc2FtcGxpbmdNb2RlIHJlc2FtcGxpbmc7
CisgICAgaWYgKGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5Jc1ByaW50aW5nKCkpCisgICAg
ICByZXNhbXBsaW5nID0gUkVTQU1QTEVfTElORUFSOworICAgIGVsc2UgeworICAgICAgcmVzYW1w
bGluZyA9IGNvbXB1dGVSZXNhbXBsaW5nTW9kZSgqYml0bWFwLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RCaXRtYXBXaWR0
aCwgZGVzdEJpdG1hcEhlaWdodCk7CisgICAgfQorCisgICAgLy8gTG9hZCB0aGUgdHJhbnNmb3Jt
IFdlYktpdCByZXF1ZXN0ZWQuCisgICAgU2tNYXRyaXggbWF0cml4KHBhdHRlcm5UcmFuc2Zvcm0p
OworCisgICAgaWYgKHJlc2FtcGxpbmcgPT0gUkVTQU1QTEVfQVdFU09NRSkgeworICAgICAgICAv
LyBEbyBuaWNlIHJlc2FtcGxpbmcuCisgICAgICAgIFNrQml0bWFwIHJlc2FtcGxlZCA9IHNraWE6
OkltYWdlT3BlcmF0aW9uczo6UmVzaXplKHNyY1N1YnNldCwKKyAgICAgICAgICAgIHNraWE6Oklt
YWdlT3BlcmF0aW9uczo6UkVTSVpFX0xBTkNaT1MzLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8
aW50PihkZXN0Qml0bWFwV2lkdGgpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihkZXN0
Qml0bWFwSGVpZ2h0KSk7CisgICAgICAgIHNoYWRlciA9IFNrU2hhZGVyOjpDcmVhdGVCaXRtYXBT
aGFkZXIocmVzYW1wbGVkLCBTa1NoYWRlcjo6a1JlcGVhdF9UaWxlTW9kZSwgU2tTaGFkZXI6OmtS
ZXBlYXRfVGlsZU1vZGUpOworCisgICAgICAgIC8vIFNpbmNlIHdlIGp1c3QgcmVzaXplZCB0aGUg
Yml0bWFwLCB3ZSBuZWVkIHRvIHVuZG8gdGhlIHNjYWxlIHNldCBpbgorICAgICAgICAvLyB0aGUg
aW1hZ2UgdHJhbnNmb3JtLgorICAgICAgICBtYXRyaXguc2V0U2NhbGVYKFNrSW50VG9TY2FsYXIo
MSkpOworICAgICAgICBtYXRyaXguc2V0U2NhbGVZKFNrSW50VG9TY2FsYXIoMSkpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIC8vIE5vIG5lZWQgdG8gZG8gbmljZSByZXNhbXBsaW5nLgorICAgICAg
ICBzaGFkZXIgPSBTa1NoYWRlcjo6Q3JlYXRlQml0bWFwU2hhZGVyKHNyY1N1YnNldCwgU2tTaGFk
ZXI6OmtSZXBlYXRfVGlsZU1vZGUsIFNrU2hhZGVyOjprUmVwZWF0X1RpbGVNb2RlKTsKKyAgICB9
CisKKyAgICAvLyBXZSBhbHNvIG5lZWQgdG8gdHJhbnNsYXRlIGl0IHN1Y2ggdGhhdCB0aGUgb3Jp
Z2luIG9mIHRoZSBwYXR0ZXJuIGlzIHRoZQorICAgIC8vIG9yaWdpbiBvZiB0aGUgZGVzdGluYXRp
b24gcmVjdCwgd2hpY2ggaXMgd2hhdCBXZWJLaXQgZXhwZWN0cy4gU2tpYSB1c2VzCisgICAgLy8g
dGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9yaWdpbiBhcyB0aGUgYmFzZSBmb3IgdGhlIHBhdHRlci4g
SWYgV2ViS2l0IHdhbnRzCisgICAgLy8gYSBzaGlmdGVkIGltYWdlLCBpdCB3aWxsIHNoaWZ0IGl0
IGZyb20gdGhlcmUgdXNpbmcgdGhlIHBhdHRlcm5UcmFuc2Zvcm0uCisgICAgZmxvYXQgYWRqdXN0
ZWRYID0gcGhhc2UueCgpICsgZmxvYXRTcmNSZWN0LngoKSAqCisgICAgICAgICAgICAgICAgICAg
ICAgbmFycm93UHJlY2lzaW9uVG9GbG9hdChwYXR0ZXJuVHJhbnNmb3JtLmEoKSk7CisgICAgZmxv
YXQgYWRqdXN0ZWRZID0gcGhhc2UueSgpICsgZmxvYXRTcmNSZWN0LnkoKSAqCisgICAgICAgICAg
ICAgICAgICAgICAgbmFycm93UHJlY2lzaW9uVG9GbG9hdChwYXR0ZXJuVHJhbnNmb3JtLmQoKSk7
CisgICAgbWF0cml4LnBvc3RUcmFuc2xhdGUoU2tGbG9hdFRvU2NhbGFyKGFkanVzdGVkWCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgU2tGbG9hdFRvU2NhbGFyKGFkanVzdGVkWSkpOworICAg
IHNoYWRlci0+c2V0TG9jYWxNYXRyaXgobWF0cml4KTsKKworICAgIFNrUGFpbnQgcGFpbnQ7Cisg
ICAgcGFpbnQuc2V0U2hhZGVyKHNoYWRlciktPnVucmVmKCk7CisgICAgcGFpbnQuc2V0UG9ydGVy
RHVmZlhmZXJtb2RlKFdlYkNvcmVDb21wb3NpdGVUb1NraWFDb21wb3NpdGUoY29tcG9zaXRlT3Ap
KTsKKyAgICBwYWludC5zZXRGaWx0ZXJCaXRtYXAocmVzYW1wbGluZyA9PSBSRVNBTVBMRV9MSU5F
QVIpOworCisgICAgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPnBhaW50U2tQYWludChkZXN0
UmVjdCwgcGFpbnQpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KKy8vIEJpdG1hcEltYWdlIENsYXNzCisvLyA9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gRklYTUU6IFRoZXNlIHNob3Vs
ZCBnbyB0byBCaXRtYXBJbWFnZVNraWEuY3BwCisKK3ZvaWQgQml0bWFwSW1hZ2U6OmluaXRQbGF0
Zm9ybURhdGEoKQoreworICAgIC8vIFRoaXMgaXMgbm90IHVzZWQuIE9uIE1hYywgdGhlICJwbGF0
Zm9ybSIgZGF0YSBpcyBhIGNhY2hlIG9mIHNvbWUgT1MKKyAgICAvLyBzcGVjaWZpYyB2ZXJzaW9u
cyBvZiB0aGUgaW1hZ2UgdGhhdCBhcmUgY3JlYXRlZCBpcyBzb21lIGNhc2VzLiBUaGVzZQorICAg
IC8vIGFyZW4ndCBub3JtYWxseSB1c2VkLCBpdCBpcyBlcXVpdmFsZW50IHRvIGdldEhCSVRNQVAg
b24gV2luZG93cywgYW5kCisgICAgLy8gdGhlIHBsYXRmb3JtIGRhdGEgaXMgdGhlIGNhY2hlLgor
fQorCit2b2lkIEJpdG1hcEltYWdlOjppbnZhbGlkYXRlUGxhdGZvcm1EYXRhKCkKK3sKKyAgICAv
LyBTZWUgaW5pdFBsYXRmb3JtRGF0YSBhYm92ZS4KK30KKwordm9pZCBCaXRtYXBJbWFnZTo6Y2hl
Y2tGb3JTb2xpZENvbG9yKCkKK3sKK30KKwordm9pZCBCaXRtYXBJbWFnZTo6ZHJhdyhHcmFwaGlj
c0NvbnRleHQqIGN0eHQsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRvciBjb21w
b3NpdGVPcCkKK3sKKyAgICBpZiAoIW1fc291cmNlLmluaXRpYWxpemVkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIC8vIFNwaW4gdGhlIGFuaW1hdGlvbiB0byB0aGUgY29ycmVjdCBmcmFtZSBi
ZWZvcmUgd2UgdHJ5IHRvIGRyYXcgaXQsIHNvIHdlCisgICAgLy8gZG9uJ3QgZHJhdyBhbiBvbGQg
ZnJhbWUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgbmVlZCB0byBkcmF3IGEgbmV3ZXIgb25lLAorICAg
IC8vIGNhdXNpbmcgZmxpY2tlciBhbmQgd2FzdGluZyBDUFUuCisgICAgc3RhcnRBbmltYXRpb24o
KTsKKworICAgIGNvbnN0IE5hdGl2ZUltYWdlU2tpYSogYm0gPSBuYXRpdmVJbWFnZUZvckN1cnJl
bnRGcmFtZSgpOworICAgIGlmICghYm0pCisgICAgICAgIHJldHVybjsgIC8vIEl0J3MgdG9vIGVh
cmx5IGFuZCB3ZSBkb24ndCBoYXZlIGFuIGltYWdlIHlldC4KKworICAgIEZsb2F0UmVjdCBub3Jt
RHN0UmVjdCA9IG5vcm1hbGl6ZVJlY3QoZHN0UmVjdCk7CisgICAgRmxvYXRSZWN0IG5vcm1TcmNS
ZWN0ID0gbm9ybWFsaXplUmVjdChzcmNSZWN0KTsKKworICAgIGlmIChub3JtU3JjUmVjdC5pc0Vt
cHR5KCkgfHwgbm9ybURzdFJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47ICAvLyBOb3Ro
aW5nIHRvIGRyYXcuCisKKyAgICBwYWludFNrQml0bWFwKGN0eHQtPnBsYXRmb3JtQ29udGV4dCgp
LAorICAgICAgICAgICAgICAgICAgKmJtLAorICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nSW50
UmVjdChub3JtU3JjUmVjdCksCisgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdJbnRSZWN0KG5v
cm1Ec3RSZWN0KSwKKyAgICAgICAgICAgICAgICAgIFdlYkNvcmVDb21wb3NpdGVUb1NraWFDb21w
b3NpdGUoY29tcG9zaXRlT3ApKTsKK30KKworLy8gRklYTUU6IFRoZXNlIHNob3VsZCBnbyBpbnRv
IEJpdG1hcEltYWdlU2luZ2xlRnJhbWVTa2lhLmNwcAorCit2b2lkIEJpdG1hcEltYWdlU2luZ2xl
RnJhbWVTa2lhOjpkcmF3KEdyYXBoaWNzQ29udGV4dCogY3R4dCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZU9wZXJhdG9yIGNv
bXBvc2l0ZU9wKQoreworICAgIEZsb2F0UmVjdCBub3JtRHN0UmVjdCA9IG5vcm1hbGl6ZVJlY3Qo
ZHN0UmVjdCk7CisgICAgRmxvYXRSZWN0IG5vcm1TcmNSZWN0ID0gbm9ybWFsaXplUmVjdChzcmNS
ZWN0KTsKKworICAgIGlmIChub3JtU3JjUmVjdC5pc0VtcHR5KCkgfHwgbm9ybURzdFJlY3QuaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm47ICAvLyBOb3RoaW5nIHRvIGRyYXcuCisKKyAgICBwYWlu
dFNrQml0bWFwKGN0eHQtPnBsYXRmb3JtQ29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgbV9u
YXRpdmVJbWFnZSwKKyAgICAgICAgICAgICAgICAgIGVuY2xvc2luZ0ludFJlY3Qobm9ybVNyY1Jl
Y3QpLAorICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nSW50UmVjdChub3JtRHN0UmVjdCksCisg
ICAgICAgICAgICAgICAgICBXZWJDb3JlQ29tcG9zaXRlVG9Ta2lhQ29tcG9zaXRlKGNvbXBvc2l0
ZU9wKSk7Cit9CisKK1Bhc3NSZWZQdHI8Qml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWE+IEJpdG1h
cEltYWdlU2luZ2xlRnJhbWVTa2lhOjpjcmVhdGUoY29uc3QgU2tCaXRtYXAmIGJpdG1hcCkKK3sK
KyAgICBSZWZQdHI8Qml0bWFwSW1hZ2VTaW5nbGVGcmFtZVNraWE+IGltYWdlKGFkb3B0UmVmKG5l
dyBCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYSgpKSk7CisgICAgaWYgKCFiaXRtYXAuY29weVRv
KCZpbWFnZS0+bV9uYXRpdmVJbWFnZSwgYml0bWFwLmNvbmZpZygpKSkKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgcmV0dXJuIGltYWdlLnJlbGVhc2UoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIFdl
YkNvcmUK
</data>

          </attachment>
      

    </bug>

</bugzilla>