<?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>57371</bug_id>
          
          <creation_ts>2011-03-29 11:57:08 -0700</creation_ts>
          <short_desc>Accelerated path drawing could be faster</short_desc>
          <delta_ts>2011-03-31 13:55:01 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Canvas</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Stephen White">senorblanco</reporter>
          <assigned_to name="Stephen White">senorblanco</assigned_to>
          <cc>jamesr</cc>
    
    <cc>kbr</cc>
    
    <cc>mdelaney7</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>375619</commentid>
    <comment_count>0</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-03-29 11:57:08 -0700</bug_when>
    <thetext>The path drawing in accelerated Canvas2D is not as performant as it could be.  In particular, it runs all polygons through the tesselator, even for simple convex polygons which don&apos;t need it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>377280</commentid>
    <comment_count>1</comment_count>
      <attachid>87755</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-03-31 10:11:29 -0700</bug_when>
    <thetext>Created attachment 87755
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>377395</commentid>
    <comment_count>2</comment_count>
      <attachid>87755</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-03-31 13:20:50 -0700</bug_when>
    <thetext>Comment on attachment 87755
Patch

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

Looks good. A couple of minor style issues, can fix upon landing.

&gt; Source/WebCore/platform/graphics/chromium/GLES2Canvas.cpp:559
&gt;      for (int i = 0; i &lt; pathTesselation; ++i, t += tIncrement) {

Style nit: now that the body is one line, no braces.

&gt; Source/WebCore/platform/graphics/chromium/GLES2Canvas.cpp:568
&gt;      for (int i = 0; i &lt; pathTesselation; ++i, t += tIncrement) {

No braces.

&gt; Source/WebCore/platform/graphics/gpu/LoopBlinnMathUtils.cpp:640
&gt; +        second = third;     /* Remember ptr to current point. */ \
&gt; +        dprev = dcur;       /* Remember current delta. */        \

What are these &apos;\&apos;s doing at the end of these lines?

&gt; Source/WebCore/platform/graphics/gpu/LoopBlinnMathUtils.cpp:650
&gt; +        second = third;     /* Remember ptr to current point. */ \
&gt; +        dprev = dcur;       /* Remember current delta. */        \

Same here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>377406</commentid>
    <comment_count>3</comment_count>
      <attachid>87755</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-03-31 13:40:45 -0700</bug_when>
    <thetext>Comment on attachment 87755
Patch

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

Thanks for the review.

&gt;&gt; Source/WebCore/platform/graphics/chromium/GLES2Canvas.cpp:559
&gt;&gt;      for (int i = 0; i &lt; pathTesselation; ++i, t += tIncrement) {
&gt; 
&gt; Style nit: now that the body is one line, no braces.

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/chromium/GLES2Canvas.cpp:568
&gt;&gt;      for (int i = 0; i &lt; pathTesselation; ++i, t += tIncrement) {
&gt; 
&gt; No braces.

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/gpu/LoopBlinnMathUtils.cpp:640
&gt;&gt; +        dprev = dcur;       /* Remember current delta. */        \
&gt; 
&gt; What are these &apos;\&apos;s doing at the end of these lines?

Whoops!  (This used to be inside a macro.)  Fixed.

&gt;&gt; Source/WebCore/platform/graphics/gpu/LoopBlinnMathUtils.cpp:650
&gt;&gt; +        dprev = dcur;       /* Remember current delta. */        \
&gt; 
&gt; Same here.

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>377421</commentid>
    <comment_count>4</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-03-31 13:55:01 -0700</bug_when>
    <thetext>Committed r82614: &lt;http://trac.webkit.org/changeset/82614&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>87755</attachid>
            <date>2011-03-31 10:11:29 -0700</date>
            <delta_ts>2011-03-31 13:40:45 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-57371-20110331131128.patch</filename>
            <type>text/plain</type>
            <size>27452</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDgyNTkwKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjYgQEAKKzIwMTEtMDMtMzEgIFN0ZXBoZW4g
V2hpdGUgIDxzZW5vcmJsYW5jb0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgU3BlZWQgdXAgYWNjZWxlcmF0ZWQgcGF0aCBkcmF3
aW5nLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTcz
NzEKKyAgICAgICAgVGhpcyBDTCBkb2VzIHRocmVlIHRoaW5nczogIHJlLXVzZXMgdGhlIHNhbWUg
dmVydGV4IGFuZCBpbmRleCBidWZmZXIKKyAgICAgICAgZm9yIGFsbCBwYXRoIGRyYXdzLCBjb252
ZXJ0cyBhbGwgdmVydGV4IGxheW91dHMgZnJvbSB2ZWMzIHRvIHZlYzIsIGFuZAorICAgICAgICBk
b2VzIGEgY29udmV4aXR5IGNoZWNrIGZvciBwb2x5Z29ucyBiZWZvcmUgcGFzc2luZyB0aGVtIHRv
IHRoZQorICAgICAgICB0ZXNzZWxhdG9yLgorCisgICAgICAgIENvdmVyZWQgYnkgY2FudmFzL3Bo
aWxpcC90ZXN0cy8yZC5wYXRoLmJlemllckN1cnZlVG8uKiwgYW5kIG90aGVycy4KKworICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyQ2FudmFzLmNwcDoKKyAgICAgICAg
UmVwbGFjZSB0aGUgVmVjdG9yPGRvdWJsZT4gZm9yIGludGVycG9sYXRlZCBjdXJ2ZXMgd2l0aCBh
CisgICAgICAgIFZlY3RvcjxGbG9hdFBvaW50Pi4KKyAgICAgICAgKFdlYkNvcmU6OkN1YmljOjpl
dmFsdWF0ZSk6CisgICAgICAgIElubGluZSB0aGUgZXZhbHVhdGlvbiBmdW5jdGlvbiAoYXMgUXVh
ZHJhdGljIGRvZXMpLgorICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OkdMRVMyQ2FudmFz
KToKKyAgICAgICAgSW5pdGlhbGl6ZSB0aGUgbV9wYXRoSW5kZXhCdWZmZXIuCisgICAgICAgIChX
ZWJDb3JlOjpHTEVTMkNhbnZhczo6fkdMRVMyQ2FudmFzKToKKyAgICAgICAgRGVsZXRlIHRoZSBw
YXRoIHZlcnRleCBhbmQgaW5kZXggYnVmZmVycyBvbiBkZXN0cnVjdGlvbi4KKyAgICAgICAgKFdl
YkNvcmU6OmludGVycG9sYXRlUXVhZHJhdGljKToKKyAgICAgICAgKFdlYkNvcmU6OmludGVycG9s
YXRlQ3ViaWMpOgorICAgICAgICBJbnRlcnBvbGF0ZSBkaXJlY3RseSB0byBhIFZlY3RvcjxGbG9h
dFBvaW50PiwgcmF0aGVyIHRoYW4KKyAgICAgICAgVmVjdG9yPGRvdWJsZT4uCisgICAgICAgIChX
ZWJDb3JlOjpQb2x5Z29uRGF0YTo6UG9seWdvbkRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Y29t
YmluZURhdGEpOgorICAgICAgICBSZXBsYWNlIHRoZSBEb3VibGVWZWN0b3Igd2l0aCBhIEZsb2F0
UG9pbnRWZWN0b3IuCisgICAgICAgIChXZWJDb3JlOjpHTEVTMkNhbnZhczo6dGVzc2VsYXRlQW5k
RmlsbFBhdGgpOgorICAgICAgICBNb3ZlIGN1cnZlIGRyYXdpbmcgaW50byB0aGlzIGZ1bmN0aW9u
LCBhbmQgcmVuYW1lIGl0IHRvIHJlZmxlY3QgdGhlCisgICAgICAgIG5ldyBiZWhhdmlvdXIuICBS
ZS11c2UgdGhlIGNvbW1vbiB2ZXJ0ZXggYW5kIGluZGV4IGJ1ZmZlcnMuICBJZiB0aGUKKyAgICAg
ICAgY3VydmUgY29uc2lzdHMgb2YgYSBzaW5nbGUgY29udmV4IHBvbHlnb24sIGRyYXcgdGhlIGN1
cnZlIGFzIGEgc2luZ2xlCisgICAgICAgIHRyaWFuZ2xlIGZhbi4gIE90aGVyd2lzZSwgY29udmVy
dCBpdCB0byBkb3VibGVzIGFuZCBwYXNzIGl0IHRvIHRoZQorICAgICAgICB0ZXNzZWxhdG9yLgor
ICAgICAgICAoV2ViQ29yZTo6R0xFUzJDYW52YXM6OmZpbGxQYXRoSW50ZXJuYWwpOgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyQ2FudmFzLmg6CisgICAgICAgIFJl
bmFtZSBjcmVhdGVWZXJ0ZXhCdWZmZXJGcm9tUGF0aCgpIC0+IHRlc3NlbGF0ZUFuZEZpbGxQYXRo
KCkuCisgICAgICAgIEFkZCBhIHBlcnNpc3RlbnQgaW5kZXggYnVmZmVyIGZvciBhbGwgcGF0aCBk
cmF3cy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ncHUvQmljdWJpY1NoYWRlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpCaWN1YmljU2hhZGVyOjpjcmVhdGUpOgorICAgICAgICAoV2Vi
Q29yZTo6QmljdWJpY1NoYWRlcjo6dXNlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9n
cHUvQ29udm9sdXRpb25TaGFkZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29udm9sdXRpb25T
aGFkZXI6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpDb252b2x1dGlvblNoYWRlcjo6dXNl
KToKKyAgICAgICAgVXNlIHZlYzJzIGluc3RlYWQgb2YgdmVjM3MgZm9yIGFsbCB2ZXJ0ZXggZGF0
YS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uTWF0aFV0aWxzLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubk1hdGhVdGlsczo6Y29udmV4Q29tcGFyZSk6
CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5NYXRoVXRpbHM6OmNvbnZleENyb3NzKToKKyAg
ICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubk1hdGhVdGlsczo6Y29udmV4Q2hlY2tUcmlwbGUpOgor
ICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTWF0aFV0aWxzOjppc0NvbnZleCk6CisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlubk1hdGhVdGlscy5oOgorICAgICAgICBJ
bXBsZW1lbnQgYSBjb252ZXhpdHkgY2hlY2ssIGJhc2VkIG9uIHRoZSBjb2RlIGluIEdyYXBoaWNz
IEdlbXMgSVYuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L1NoYWRlci5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpTaGFkZXI6OmdlbmVyYXRlVmVydGV4KToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9ncHUvU2hhcmVkR3JhcGhpY3NDb250ZXh0M0QuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6U2hhcmVkR3JhcGhpY3NDb250ZXh0M0Q6OnVzZVF1YWRWZXJ0aWNlcyk6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L1NvbGlkRmlsbFNoYWRlci5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpTb2xpZEZpbGxTaGFkZXI6OnVzZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvZ3B1L1RleFNoYWRlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpUZXhTaGFkZXI6OnVz
ZSk6CisgICAgICAgIFVzZSB2ZWMycyBpbnN0ZWFkIG9mIHZlYzNzIGZvciBhbGwgdmVydGV4IGRh
dGEuCisKIDIwMTEtMDMtMzAgIFBhdmVsIFBvZGl2aWxvdiAgPHBvZGl2aWxvdkBjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgUGF2ZWwgRmVsZG1hbi4KSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyQ2FudmFzLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMkNh
bnZhcy5jcHAJKHJldmlzaW9uIDgyNTAyKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vR0xFUzJDYW52YXMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOCw2ICsz
OCw3IEBACiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIKICNpbmNsdWRlICJpbnRlcm5h
bF9nbHUuaCIKICNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTG9vcEJsaW5uTWF0aFV0
aWxzLmgiCiAjaW5jbHVkZSAiTG9vcEJsaW5uUGF0aFByb2Nlc3Nvci5oIgogI2luY2x1ZGUgIkxv
b3BCbGlublNvbGlkRmlsbFNoYWRlci5oIgogI2luY2x1ZGUgIlBhdGguaCIKQEAgLTYwLDcgKzYx
LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogY29uc3QgaW50IHBhdGhUZXNzZWxhdGlvbiA9IDMw
OwogdHlwZWRlZiB2b2lkIChHTEFQSUVOVFJZICpURVNTQ0IpKCk7CiB0eXBlZGVmIFdURjo6VmVj
dG9yPGZsb2F0PiBGbG9hdFZlY3RvcjsKLXR5cGVkZWYgV1RGOjpWZWN0b3I8ZG91YmxlPiBEb3Vi
bGVWZWN0b3I7Cit0eXBlZGVmIFdURjo6VmVjdG9yPEZsb2F0UG9pbnQ+IEZsb2F0UG9pbnRWZWN0
b3I7CiAKIHN0cnVjdCBQYXRoQW5kVHJhbnNmb3JtIHsKICAgICBQYXRoQW5kVHJhbnNmb3JtKGNv
bnN0IFBhdGgmIHAsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdCkKQEAgLTE4Niw3ICsxODcsNyBA
QCBjbGFzcyBDdWJpYyB7CiAgICAgICAgIEZsb2F0UG9pbnQgZCA9IC0xLjBmICogcDAgKyAzLjBm
ICogcDFzIC0gMy4wZiAqIHAycyArIHAzczsKICAgICAgICAgcmV0dXJuIEN1YmljKHAwLCBiLCBj
LCBkKTsKICAgICB9Ci0gICAgRmxvYXRQb2ludCBldmFsdWF0ZShmbG9hdCB0KQorICAgIGlubGlu
ZSBGbG9hdFBvaW50IGV2YWx1YXRlKGZsb2F0IHQpCiAgICAgewogICAgICAgICByZXR1cm4gbV9h
ICsgdCAqIChtX2IgKyB0ICogKG1fYyArIHQgKiBtX2QpKTsKICAgICB9CkBAIC0xOTgsNiArMTk5
LDcgQEAgR0xFUzJDYW52YXM6OkdMRVMyQ2FudmFzKFNoYXJlZEdyYXBoaWNzQwogICAgICwgbV9j
b250ZXh0KGNvbnRleHQpCiAgICAgLCBtX2RyYXdpbmdCdWZmZXIoZHJhd2luZ0J1ZmZlcikKICAg
ICAsIG1fc3RhdGUoMCkKKyAgICAsIG1fcGF0aEluZGV4QnVmZmVyKDApCiAgICAgLCBtX3BhdGhW
ZXJ0ZXhCdWZmZXIoMCkKIHsKICAgICBtX2ZsaXBNYXRyaXgudHJhbnNsYXRlKC0xLjBmLCAxLjBm
KTsKQEAgLTIwOSw2ICsyMTEsMTAgQEAgR0xFUzJDYW52YXM6OkdMRVMyQ2FudmFzKFNoYXJlZEdy
YXBoaWNzQwogCiBHTEVTMkNhbnZhczo6fkdMRVMyQ2FudmFzKCkKIHsKKyAgICBpZiAobV9wYXRo
SW5kZXhCdWZmZXIpCisgICAgICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+ZGVs
ZXRlQnVmZmVyKG1fcGF0aEluZGV4QnVmZmVyKTsKKyAgICBpZiAobV9wYXRoVmVydGV4QnVmZmVy
KQorICAgICAgICBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmRlbGV0ZUJ1ZmZlciht
X3BhdGhWZXJ0ZXhCdWZmZXIpOwogfQogCiB2b2lkIEdMRVMyQ2FudmFzOjpiaW5kRnJhbWVidWZm
ZXIoKQpAQCAtNTQ2LDM4ICs1NTIsMzIgQEAgVGV4dHVyZSogR0xFUzJDYW52YXM6OmdldFRleHR1
cmUoTmF0aXZlSQogI2lmIFVTRShTS0lBKQogLy8gVGhpcyBpcyBhY3R1YWxseSBjcm9zcy1wbGF0
Zm9ybSBjb2RlLCBidXQgc2luY2UgaXRzIG9ubHkgY2FsbGVyIGlzIGluc2lkZSBhCiAvLyBVU0Uo
U0tJQSksIGl0IHdpbGwgY2F1c2UgYSB3YXJuaW5nLWFzLWVycm9yIG9uIENocm9tZS9NYWMuCi1z
dGF0aWMgdm9pZCBpbnRlcnBvbGF0ZVF1YWRyYXRpYyhEb3VibGVWZWN0b3IqIHZlcnRpY2VzLCBj
b25zdCBGbG9hdFBvaW50JiBwMCwgY29uc3QgRmxvYXRQb2ludCYgcDEsIGNvbnN0IEZsb2F0UG9p
bnQmIHAyKQorc3RhdGljIHZvaWQgaW50ZXJwb2xhdGVRdWFkcmF0aWMoRmxvYXRQb2ludFZlY3Rv
ciogdmVydGljZXMsIGNvbnN0IEZsb2F0UG9pbnQmIHAwLCBjb25zdCBGbG9hdFBvaW50JiBwMSwg
Y29uc3QgRmxvYXRQb2ludCYgcDIpCiB7CiAgICAgZmxvYXQgdEluY3JlbWVudCA9IDEuMGYgLyBw
YXRoVGVzc2VsYXRpb24sIHQgPSB0SW5jcmVtZW50OwogICAgIFF1YWRyYXRpYyBjID0gUXVhZHJh
dGljOjpmcm9tQmV6aWVyKHAwLCBwMSwgcDIpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0
aFRlc3NlbGF0aW9uOyArK2ksIHQgKz0gdEluY3JlbWVudCkgewotICAgICAgICBGbG9hdFBvaW50
IHAgPSBjLmV2YWx1YXRlKHQpOwotICAgICAgICB2ZXJ0aWNlcy0+YXBwZW5kKHAueCgpKTsKLSAg
ICAgICAgdmVydGljZXMtPmFwcGVuZChwLnkoKSk7Ci0gICAgICAgIHZlcnRpY2VzLT5hcHBlbmQo
MS4wKTsKKyAgICAgICAgdmVydGljZXMtPmFwcGVuZChjLmV2YWx1YXRlKHQpKTsKICAgICB9CiB9
CiAKLXN0YXRpYyB2b2lkIGludGVycG9sYXRlQ3ViaWMoRG91YmxlVmVjdG9yKiB2ZXJ0aWNlcywg
Y29uc3QgRmxvYXRQb2ludCYgcDAsIGNvbnN0IEZsb2F0UG9pbnQmIHAxLCBjb25zdCBGbG9hdFBv
aW50JiBwMiwgY29uc3QgRmxvYXRQb2ludCYgcDMpCitzdGF0aWMgdm9pZCBpbnRlcnBvbGF0ZUN1
YmljKEZsb2F0UG9pbnRWZWN0b3IqIHZlcnRpY2VzLCBjb25zdCBGbG9hdFBvaW50JiBwMCwgY29u
c3QgRmxvYXRQb2ludCYgcDEsIGNvbnN0IEZsb2F0UG9pbnQmIHAyLCBjb25zdCBGbG9hdFBvaW50
JiBwMykKIHsKICAgICBmbG9hdCB0SW5jcmVtZW50ID0gMS4wZiAvIHBhdGhUZXNzZWxhdGlvbiwg
dCA9IHRJbmNyZW1lbnQ7CiAgICAgQ3ViaWMgYyA9IEN1YmljOjpmcm9tQmV6aWVyKHAwLCBwMSwg
cDIsIHAzKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhUZXNzZWxhdGlvbjsgKytpLCB0
ICs9IHRJbmNyZW1lbnQpIHsKLSAgICAgICAgRmxvYXRQb2ludCBwID0gYy5ldmFsdWF0ZSh0KTsK
LSAgICAgICAgdmVydGljZXMtPmFwcGVuZChwLngoKSk7Ci0gICAgICAgIHZlcnRpY2VzLT5hcHBl
bmQocC55KCkpOwotICAgICAgICB2ZXJ0aWNlcy0+YXBwZW5kKDEuMCk7CisgICAgICAgIHZlcnRp
Y2VzLT5hcHBlbmQoYy5ldmFsdWF0ZSh0KSk7CiAgICAgfQogfQogI2VuZGlmCiAKIHN0cnVjdCBQ
b2x5Z29uRGF0YSB7Ci0gICAgUG9seWdvbkRhdGEoRmxvYXRWZWN0b3IqIHZlcnRpY2VzLCBXVEY6
OlZlY3RvcjxzaG9ydD4qIGluZGljZXMpCisgICAgUG9seWdvbkRhdGEoRmxvYXRQb2ludFZlY3Rv
ciogdmVydGljZXMsIFdURjo6VmVjdG9yPHNob3J0PiogaW5kaWNlcykKICAgICAgIDogbV92ZXJ0
aWNlcyh2ZXJ0aWNlcykKICAgICAgICwgbV9pbmRpY2VzKGluZGljZXMpCiAgICAgewogICAgIH0K
LSAgICBGbG9hdFZlY3RvciogbV92ZXJ0aWNlczsKKyAgICBGbG9hdFBvaW50VmVjdG9yKiBtX3Zl
cnRpY2VzOwogICAgIFdURjo6VmVjdG9yPHNob3J0PiogbV9pbmRpY2VzOwogfTsKIApAQCAtNjAz
LDIyICs2MDMsMjQgQEAgc3RhdGljIHZvaWQgY29tYmluZURhdGEoR0xkb3VibGUgY29vcmRzWwog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCB3ZWlnaHRbNF0sIHZvaWQg
KipvdXREYXRhLCB2b2lkKiBkYXRhKQogewogICAgIFBvbHlnb25EYXRhKiBwb2x5Z29uRGF0YSA9
IHN0YXRpY19jYXN0PFBvbHlnb25EYXRhKj4oZGF0YSk7Ci0gICAgaW50IGluZGV4ID0gcG9seWdv
bkRhdGEtPm1fdmVydGljZXMtPnNpemUoKSAvIDM7Ci0gICAgcG9seWdvbkRhdGEtPm1fdmVydGlj
ZXMtPmFwcGVuZChzdGF0aWNfY2FzdDxmbG9hdD4oY29vcmRzWzBdKSk7Ci0gICAgcG9seWdvbkRh
dGEtPm1fdmVydGljZXMtPmFwcGVuZChzdGF0aWNfY2FzdDxmbG9hdD4oY29vcmRzWzFdKSk7Ci0g
ICAgcG9seWdvbkRhdGEtPm1fdmVydGljZXMtPmFwcGVuZCgxLjBmKTsKKyAgICBpbnQgaW5kZXgg
PSBwb2x5Z29uRGF0YS0+bV92ZXJ0aWNlcy0+c2l6ZSgpOworICAgIHBvbHlnb25EYXRhLT5tX3Zl
cnRpY2VzLT5hcHBlbmQoRmxvYXRQb2ludChzdGF0aWNfY2FzdDxmbG9hdD4oY29vcmRzWzBdKSwg
c3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvb3Jkc1sxXSkpKTsKICAgICAqb3V0RGF0YSA9IHJlaW50ZXJw
cmV0X2Nhc3Q8dm9pZCo+KGluZGV4KTsKIH0KIAogdHlwZWRlZiB2b2lkICgqVEVTU0NCKSgpOwog
Ci12b2lkIEdMRVMyQ2FudmFzOjpjcmVhdGVWZXJ0ZXhCdWZmZXJGcm9tUGF0aChjb25zdCBQYXRo
JiBwYXRoLCBpbnQqIGNvdW50LCB1bnNpZ25lZCogdmVydGV4QnVmZmVyLCB1bnNpZ25lZCogaW5k
ZXhCdWZmZXIpCit2b2lkIEdMRVMyQ2FudmFzOjp0ZXNzZWxhdGVBbmRGaWxsUGF0aChjb25zdCBQ
YXRoJiBwYXRoLCBjb25zdCBDb2xvciYgY29sb3IpCiB7Ci0gICAgKnZlcnRleEJ1ZmZlciA9IG1f
Y29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+Y3JlYXRlQnVmZmVyKCk7Ci0gICAgY2hlY2tH
TEVycm9yKCJjcmVhdGVWZXJ0ZXhCdWZmZXJGcm9tUGF0aCwgY3JlYXRlQnVmZmVyIik7Ci0gICAg
KmluZGV4QnVmZmVyID0gbV9jb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5jcmVhdGVCdWZm
ZXIoKTsKLSAgICBjaGVja0dMRXJyb3IoImNyZWF0ZVZlcnRleEJ1ZmZlckZyb21QYXRoLCBjcmVh
dGVCdWZmZXIiKTsKLSAgICBEb3VibGVWZWN0b3IgaW5WZXJ0aWNlczsKKyAgICBpZiAoIW1fcGF0
aFZlcnRleEJ1ZmZlcikKKyAgICAgICAgbV9wYXRoVmVydGV4QnVmZmVyID0gbV9jb250ZXh0LT5n
cmFwaGljc0NvbnRleHQzRCgpLT5jcmVhdGVCdWZmZXIoKTsKKyAgICBpZiAoIW1fcGF0aEluZGV4
QnVmZmVyKQorICAgICAgICBtX3BhdGhJbmRleEJ1ZmZlciA9IG1fY29udGV4dC0+Z3JhcGhpY3ND
b250ZXh0M0QoKS0+Y3JlYXRlQnVmZmVyKCk7CisKKyAgICBBZmZpbmVUcmFuc2Zvcm0gbWF0cml4
KG1fZmxpcE1hdHJpeCk7CisgICAgbWF0cml4ICo9IG1fc3RhdGUtPm1fY3RtOworCisgICAgRmxv
YXRQb2ludFZlY3RvciBpblZlcnRpY2VzOwogICAgIFdURjo6VmVjdG9yPHNpemVfdD4gY29udG91
cnM7CiAjaWYgVVNFKFNLSUEpCiAgICAgY29uc3QgU2tQYXRoKiBza1BhdGggPSBwYXRoLnBsYXRm
b3JtUGF0aCgpOwpAQCAtNjI4LDE0ICs2MzAsMTAgQEAgdm9pZCBHTEVTMkNhbnZhczo6Y3JlYXRl
VmVydGV4QnVmZmVyRnJvbQogICAgIHdoaWxlICgodmVyYiA9IGl0ZXIubmV4dChwdHMpKSAhPSBT
a1BhdGg6OmtEb25lX1ZlcmIpIHsKICAgICAgICAgc3dpdGNoICh2ZXJiKSB7CiAgICAgICAgIGNh
c2UgU2tQYXRoOjprTW92ZV9WZXJiOgotICAgICAgICAgICAgaW5WZXJ0aWNlcy5hcHBlbmQocHRz
WzBdLmZYKTsKLSAgICAgICAgICAgIGluVmVydGljZXMuYXBwZW5kKHB0c1swXS5mWSk7Ci0gICAg
ICAgICAgICBpblZlcnRpY2VzLmFwcGVuZCgxLjApOworICAgICAgICAgICAgaW5WZXJ0aWNlcy5h
cHBlbmQocHRzWzBdKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNrUGF0aDo6
a0xpbmVfVmVyYjoKLSAgICAgICAgICAgIGluVmVydGljZXMuYXBwZW5kKHB0c1sxXS5mWCk7Ci0g
ICAgICAgICAgICBpblZlcnRpY2VzLmFwcGVuZChwdHNbMV0uZlkpOwotICAgICAgICAgICAgaW5W
ZXJ0aWNlcy5hcHBlbmQoMS4wKTsKKyAgICAgICAgICAgIGluVmVydGljZXMuYXBwZW5kKHB0c1sx
XSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTa1BhdGg6OmtRdWFkX1ZlcmI6
CiAgICAgICAgICAgICBpbnRlcnBvbGF0ZVF1YWRyYXRpYygmaW5WZXJ0aWNlcywgcHRzWzBdLCBw
dHNbMV0sIHB0c1syXSk7CkBAIC02NDQsNyArNjQyLDcgQEAgdm9pZCBHTEVTMkNhbnZhczo6Y3Jl
YXRlVmVydGV4QnVmZmVyRnJvbQogICAgICAgICAgICAgaW50ZXJwb2xhdGVDdWJpYygmaW5WZXJ0
aWNlcywgcHRzWzBdLCBwdHNbMV0sIHB0c1syXSwgcHRzWzNdKTsKICAgICAgICAgICAgIGJyZWFr
OwogICAgICAgICBjYXNlIFNrUGF0aDo6a0Nsb3NlX1ZlcmI6Ci0gICAgICAgICAgICBjb250b3Vy
cy5hcHBlbmQoaW5WZXJ0aWNlcy5zaXplKCkgLyAzKTsKKyAgICAgICAgICAgIGNvbnRvdXJzLmFw
cGVuZChpblZlcnRpY2VzLnNpemUoKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2Fz
ZSBTa1BhdGg6OmtEb25lX1ZlcmI6CiAgICAgICAgICAgICBicmVhazsKQEAgLTY1NCw2ICs2NTIs
MjEgQEAgdm9pZCBHTEVTMkNhbnZhczo6Y3JlYXRlVmVydGV4QnVmZmVyRnJvbQogICAgIEFTU0VS
VCghIlBhdGggZXh0cmFjdGlvbiBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybS4iKTsK
ICNlbmRpZgogCisgICAgaWYgKGNvbnRvdXJzLnNpemUoKSA9PSAxICYmIExvb3BCbGlubk1hdGhV
dGlsczo6aXNDb252ZXgoaW5WZXJ0aWNlcy5iZWdpbigpLCBpblZlcnRpY2VzLnNpemUoKSkpIHsK
KyAgICAgICAgbV9jb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5iaW5kQnVmZmVyKEdyYXBo
aWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIsIG1fcGF0aFZlcnRleEJ1ZmZlcik7CisgICAgICAg
IG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+YnVmZmVyRGF0YShHcmFwaGljc0NvbnRl
eHQzRDo6QVJSQVlfQlVGRkVSLCBpblZlcnRpY2VzLnNpemUoKSAqIDIgKiBzaXplb2YoZmxvYXQp
LCBpblZlcnRpY2VzLmRhdGEoKSwgR3JhcGhpY3NDb250ZXh0M0Q6OlNUUkVBTV9EUkFXKTsKKyAg
ICAgICAgbV9jb250ZXh0LT51c2VGaWxsU29saWRQcm9ncmFtKG1hdHJpeCwgY29sb3IpOworICAg
ICAgICBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmRyYXdBcnJheXMoR3JhcGhpY3ND
b250ZXh0M0Q6OlRSSUFOR0xFX0ZBTiwgMCwgaW5WZXJ0aWNlcy5zaXplKCkpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgT3duQXJyYXlQdHI8ZG91YmxlPiBpblZlcnRpY2VzRG91Ymxl
ID0gYWRvcHRBcnJheVB0cihuZXcgZG91YmxlW2luVmVydGljZXMuc2l6ZSgpICogM10pOworICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5WZXJ0aWNlcy5zaXplKCk7ICsraSkgeworICAgICAg
ICBpblZlcnRpY2VzRG91YmxlW2kgKiAzICAgIF0gPSBpblZlcnRpY2VzW2ldLngoKTsKKyAgICAg
ICAgaW5WZXJ0aWNlc0RvdWJsZVtpICogMyArIDFdID0gaW5WZXJ0aWNlc1tpXS55KCk7CisgICAg
ICAgIGluVmVydGljZXNEb3VibGVbaSAqIDMgKyAyXSA9IDEuMDsKKyAgICB9CisKICAgICBHTFV0
ZXNzZWxhdG9yKiB0ZXNzID0gaW50ZXJuYWxfZ2x1TmV3VGVzcygpOwogICAgIGludGVybmFsX2ds
dVRlc3NQcm9wZXJ0eSh0ZXNzLCBHTFVfVEVTU19XSU5ESU5HX1JVTEUsIEdMVV9URVNTX1dJTkRJ
TkdfTk9OWkVSTyk7CiAgICAgaW50ZXJuYWxfZ2x1VGVzc0NhbGxiYWNrKHRlc3MsIEdMVV9URVNT
X0JFR0lOX0RBVEEsIChURVNTQ0IpICZiZWdpbkRhdGEpOwpAQCAtNjYyLDcgKzY3NSw3IEBAIHZv
aWQgR0xFUzJDYW52YXM6OmNyZWF0ZVZlcnRleEJ1ZmZlckZyb20KICAgICBpbnRlcm5hbF9nbHVU
ZXNzQ2FsbGJhY2sodGVzcywgR0xVX1RFU1NfRURHRV9GTEFHX0RBVEEsIChURVNTQ0IpICZlZGdl
RmxhZ0RhdGEpOwogICAgIGludGVybmFsX2dsdVRlc3NDYWxsYmFjayh0ZXNzLCBHTFVfVEVTU19D
T01CSU5FX0RBVEEsIChURVNTQ0IpICZjb21iaW5lRGF0YSk7CiAgICAgV1RGOjpWZWN0b3I8c2hv
cnQ+IGluZGljZXM7Ci0gICAgRmxvYXRWZWN0b3IgdmVydGljZXM7CisgICAgRmxvYXRQb2ludFZl
Y3RvciB2ZXJ0aWNlczsKICAgICB2ZXJ0aWNlcy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGluVmVy
dGljZXMuc2l6ZSgpKTsKICAgICBQb2x5Z29uRGF0YSBkYXRhKCZ2ZXJ0aWNlcywgJmluZGljZXMp
OwogICAgIGludGVybmFsX2dsdVRlc3NCZWdpblBvbHlnb24odGVzcywgJmRhdGEpOwpAQCAtNjcx
LDI2ICs2ODQsMjcgQEAgdm9pZCBHTEVTMkNhbnZhczo6Y3JlYXRlVmVydGV4QnVmZmVyRnJvbQog
ICAgIGZvciAoY29udG91ciA9IGNvbnRvdXJzLmJlZ2luKCk7IGNvbnRvdXIgIT0gY29udG91cnMu
ZW5kKCk7ICsrY29udG91cikgewogICAgICAgICBpbnRlcm5hbF9nbHVUZXNzQmVnaW5Db250b3Vy
KHRlc3MpOwogICAgICAgICBmb3IgKDsgaSA8ICpjb250b3VyOyArK2kpIHsKLSAgICAgICAgICAg
IHZlcnRpY2VzLmFwcGVuZChpblZlcnRpY2VzW2kgKiAzXSk7Ci0gICAgICAgICAgICB2ZXJ0aWNl
cy5hcHBlbmQoaW5WZXJ0aWNlc1tpICogMyArIDFdKTsKLSAgICAgICAgICAgIHZlcnRpY2VzLmFw
cGVuZCgxLjBmKTsKLSAgICAgICAgICAgIGludGVybmFsX2dsdVRlc3NWZXJ0ZXgodGVzcywgJmlu
VmVydGljZXNbaSAqIDNdLCByZWludGVycHJldF9jYXN0PHZvaWQqPihpKSk7CisgICAgICAgICAg
ICBkb3VibGUqIGluVmVydGV4ID0gJmluVmVydGljZXNEb3VibGVbaSAqIDNdOworICAgICAgICAg
ICAgdmVydGljZXMuYXBwZW5kKEZsb2F0UG9pbnQoaW5WZXJ0ZXhbMF0sIGluVmVydGV4WzFdKSk7
CisgICAgICAgICAgICBpbnRlcm5hbF9nbHVUZXNzVmVydGV4KHRlc3MsIGluVmVydGV4LCByZWlu
dGVycHJldF9jYXN0PHZvaWQqPihpKSk7CiAgICAgICAgIH0KICAgICAgICAgaW50ZXJuYWxfZ2x1
VGVzc0VuZENvbnRvdXIodGVzcyk7CiAgICAgfQogICAgIGludGVybmFsX2dsdVRlc3NFbmRQb2x5
Z29uKHRlc3MpOwogICAgIGludGVybmFsX2dsdURlbGV0ZVRlc3ModGVzcyk7CiAKLSAgICBtX2Nv
bnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmJpbmRCdWZmZXIoR3JhcGhpY3NDb250ZXh0M0Q6
OkFSUkFZX0JVRkZFUiwgKnZlcnRleEJ1ZmZlcik7CisgICAgbV9jb250ZXh0LT5ncmFwaGljc0Nv
bnRleHQzRCgpLT5iaW5kQnVmZmVyKEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIsIG1f
cGF0aFZlcnRleEJ1ZmZlcik7CiAgICAgY2hlY2tHTEVycm9yKCJjcmVhdGVWZXJ0ZXhCdWZmZXJG
cm9tUGF0aCwgYmluZEJ1ZmZlciBBUlJBWV9CVUZGRVIiKTsKLSAgICBtX2NvbnRleHQtPmdyYXBo
aWNzQ29udGV4dDNEKCktPmJ1ZmZlckRhdGEoR3JhcGhpY3NDb250ZXh0M0Q6OkFSUkFZX0JVRkZF
UiwgdmVydGljZXMuc2l6ZSgpICogc2l6ZW9mKGZsb2F0KSwgdmVydGljZXMuZGF0YSgpLCBHcmFw
aGljc0NvbnRleHQzRDo6U1RSRUFNX0RSQVcpOworICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250
ZXh0M0QoKS0+YnVmZmVyRGF0YShHcmFwaGljc0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSLCB2ZXJ0
aWNlcy5zaXplKCkgKiAyICogc2l6ZW9mKGZsb2F0KSwgdmVydGljZXMuZGF0YSgpLCBHcmFwaGlj
c0NvbnRleHQzRDo6U1RSRUFNX0RSQVcpOwogICAgIGNoZWNrR0xFcnJvcigiY3JlYXRlVmVydGV4
QnVmZmVyRnJvbVBhdGgsIGJ1ZmZlckRhdGEgQVJSQVlfQlVGRkVSIik7CiAKLSAgICBtX2NvbnRl
eHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmJpbmRCdWZmZXIoR3JhcGhpY3NDb250ZXh0M0Q6OkVM
RU1FTlRfQVJSQVlfQlVGRkVSLCAqaW5kZXhCdWZmZXIpOworICAgIG1fY29udGV4dC0+Z3JhcGhp
Y3NDb250ZXh0M0QoKS0+YmluZEJ1ZmZlcihHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJB
WV9CVUZGRVIsIG1fcGF0aEluZGV4QnVmZmVyKTsKICAgICBjaGVja0dMRXJyb3IoImNyZWF0ZVZl
cnRleEJ1ZmZlckZyb21QYXRoLCBiaW5kQnVmZmVyIEVMRU1FTlRfQVJSQVlfQlVGRkVSIik7CiAg
ICAgbV9jb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5idWZmZXJEYXRhKEdyYXBoaWNzQ29u
dGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUiwgaW5kaWNlcy5zaXplKCkgKiBzaXplb2Yoc2hv
cnQpLCBpbmRpY2VzLmRhdGEoKSwgR3JhcGhpY3NDb250ZXh0M0Q6OlNUUkVBTV9EUkFXKTsKICAg
ICBjaGVja0dMRXJyb3IoImNyZWF0ZVZlcnRleEJ1ZmZlckZyb21QYXRoLCBidWZmZXJEYXRhIEVM
RU1FTlRfQVJSQVlfQlVGRkVSIik7Ci0gICAgKmNvdW50ID0gaW5kaWNlcy5zaXplKCk7CisKKyAg
ICBtX2NvbnRleHQtPnVzZUZpbGxTb2xpZFByb2dyYW0obWF0cml4LCBjb2xvcik7CisgICAgbV9j
b250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5kcmF3RWxlbWVudHMoR3JhcGhpY3NDb250ZXh0
M0Q6OlRSSUFOR0xFUywgaW5kaWNlcy5zaXplKCksIEdyYXBoaWNzQ29udGV4dDNEOjpVTlNJR05F
RF9TSE9SVCwgMCk7CiB9CiAKIHZvaWQgR0xFUzJDYW52YXM6OmZpbGxQYXRoSW50ZXJuYWwoY29u
c3QgUGF0aCYgcGF0aCwgY29uc3QgQ29sb3ImIGNvbG9yKQpAQCAtNzIzLDI5ICs3MzcsNyBAQCB2
b2lkIEdMRVMyQ2FudmFzOjpmaWxsUGF0aEludGVybmFsKGNvbnN0CiAgICAgICAgIG1fY29udGV4
dC0+dXNlTG9vcEJsaW5uSW50ZXJpb3JQcm9ncmFtKGJ5dGVTaXplT2ZWZXJ0aWNlcyArIGJ5dGVT
aXplT2ZUZXhDb29yZHMsIG1hdHJpeCwgY29sb3IpOwogICAgICAgICBtX2NvbnRleHQtPmRyYXdB
cnJheXMoR3JhcGhpY3NDb250ZXh0M0Q6OlRSSUFOR0xFUywgMCwgbV9wYXRoQ2FjaGUubnVtYmVy
T2ZJbnRlcmlvclZlcnRpY2VzKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBjb3VudDsK
LSAgICAgICAgdW5zaWduZWQgdmVydGV4QnVmZmVyLCBpbmRleEJ1ZmZlcjsKLSAgICAgICAgY3Jl
YXRlVmVydGV4QnVmZmVyRnJvbVBhdGgocGF0aCwgJmNvdW50LCAmdmVydGV4QnVmZmVyLCAmaW5k
ZXhCdWZmZXIpOwotCi0gICAgICAgIEFmZmluZVRyYW5zZm9ybSBtYXRyaXgobV9mbGlwTWF0cml4
KTsKLSAgICAgICAgbWF0cml4ICo9IG1fc3RhdGUtPm1fY3RtOwotCi0gICAgICAgIG1fY29udGV4
dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+YmluZEJ1ZmZlcihHcmFwaGljc0NvbnRleHQzRDo6QVJS
QVlfQlVGRkVSLCB2ZXJ0ZXhCdWZmZXIpOwotICAgICAgICBjaGVja0dMRXJyb3IoImJpbmRCdWZm
ZXIiKTsKLSAgICAgICAgbV9jb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5iaW5kQnVmZmVy
KEdyYXBoaWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUiwgaW5kZXhCdWZmZXIpOwot
ICAgICAgICBjaGVja0dMRXJyb3IoImJpbmRCdWZmZXIiKTsKLQotICAgICAgICBtX2NvbnRleHQt
PnVzZUZpbGxTb2xpZFByb2dyYW0obWF0cml4LCBjb2xvcik7Ci0gICAgICAgIGNoZWNrR0xFcnJv
cigidXNlRmlsbFNvbGlkUHJvZ3JhbSIpOwotCi0gICAgICAgIG1fY29udGV4dC0+Z3JhcGhpY3ND
b250ZXh0M0QoKS0+ZHJhd0VsZW1lbnRzKEdyYXBoaWNzQ29udGV4dDNEOjpUUklBTkdMRVMsIGNv
dW50LCBHcmFwaGljc0NvbnRleHQzRDo6VU5TSUdORURfU0hPUlQsIDApOwotICAgICAgICBjaGVj
a0dMRXJyb3IoImRyYXdBcnJheXMiKTsKLQotICAgICAgICBtX2NvbnRleHQtPmdyYXBoaWNzQ29u
dGV4dDNEKCktPmRlbGV0ZUJ1ZmZlcih2ZXJ0ZXhCdWZmZXIpOwotICAgICAgICBjaGVja0dMRXJy
b3IoImRlbGV0ZUJ1ZmZlciIpOwotCi0gICAgICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0
M0QoKS0+ZGVsZXRlQnVmZmVyKGluZGV4QnVmZmVyKTsKLSAgICAgICAgY2hlY2tHTEVycm9yKCJk
ZWxldGVCdWZmZXIiKTsKKyAgICAgICAgdGVzc2VsYXRlQW5kRmlsbFBhdGgocGF0aCwgY29sb3Ip
OwogICAgIH0KIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vR0xFUzJDYW52YXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMkNhbnZhcy5oCShyZXZpc2lvbiA4MjUwMikKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyQ2FudmFzLmgJKHdv
cmtpbmcgY29weSkKQEAgLTEwNyw3ICsxMDcsNyBAQCBwcml2YXRlOgogICAgIHZvaWQgY29udm9s
dmVSZWN0KHVuc2lnbmVkIHRleHR1cmUsIGNvbnN0IEludFNpemUmIHRleHR1cmVTaXplLCBjb25z
dCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgZmxvYXQgaW1h
Z2VJbmNyZW1lbnRbMl0sIGNvbnN0IGZsb2F0KiBrZXJuZWwsIGludCBrZXJuZWxXaWR0aCk7CiAK
ICAgICB2b2lkIGFwcGx5Q29tcG9zaXRlT3BlcmF0b3IoQ29tcG9zaXRlT3BlcmF0b3IpOwotICAg
IHZvaWQgY3JlYXRlVmVydGV4QnVmZmVyRnJvbVBhdGgoY29uc3QgUGF0aCYsIGludCogY291bnQs
IHVuc2lnbmVkKiB2ZXJ0ZXhCdWZmZXIsIHVuc2lnbmVkKiBpbmRleEJ1ZmZlcik7CisgICAgdm9p
ZCB0ZXNzZWxhdGVBbmRGaWxsUGF0aChjb25zdCBQYXRoJiwgY29uc3QgQ29sb3ImKTsKICAgICB2
b2lkIGZpbGxQYXRoSW50ZXJuYWwoY29uc3QgUGF0aCYsIGNvbnN0IENvbG9yJik7CiAgICAgdm9p
ZCBmaWxsUmVjdEludGVybmFsKGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IENvbG9yJik7CiAgICAg
RmxvYXRSZWN0IGZsaXBSZWN0KGNvbnN0IEZsb2F0UmVjdCYpOwpAQCAtMTMxLDYgKzEzMSw3IEBA
IHByaXZhdGU6CiAKICAgICAvLyBNZW1iZXJzIGZvciBHUFUtYWNjZWxlcmF0ZWQgcGF0aCByZW5k
ZXJpbmcuCiAgICAgTG9vcEJsaW5uUGF0aENhY2hlIG1fcGF0aENhY2hlOworICAgIHVuc2lnbmVk
IG1fcGF0aEluZGV4QnVmZmVyOwogICAgIHVuc2lnbmVkIG1fcGF0aFZlcnRleEJ1ZmZlcjsKIH07
CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9CaWN1YmljU2hh
ZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9n
cHUvQmljdWJpY1NoYWRlci5jcHAJKHJldmlzaW9uIDgyNTAxKQorKysgU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0JpY3ViaWNTaGFkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC01NSwxMSArNTUsMTIgQEAgUGFzc093blB0cjxCaWN1YmljU2hhZGVyPiBCaWN1YmljU2hhZGVy
OgogICAgIHN0YXRpYyBjb25zdCBjaGFyKiB2ZXJ0ZXhTaGFkZXJTb3VyY2UgPQogICAgICAgICAi
dW5pZm9ybSBtYXQzIG1hdHJpeDtcbiIKICAgICAgICAgInVuaWZvcm0gbWF0MyB0ZXhNYXRyaXg7
XG4iCi0gICAgICAgICJhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcbiIKKyAgICAgICAgImF0dHJp
YnV0ZSB2ZWMyIHBvc2l0aW9uO1xuIgogICAgICAgICAidmFyeWluZyB2ZWMyIHRleENvb3JkO1xu
IgogICAgICAgICAidm9pZCBtYWluKCkge1xuIgotICAgICAgICAiICAgIHRleENvb3JkID0gKHRl
eE1hdHJpeCAqIHBvc2l0aW9uKS54eTtcbiIKLSAgICAgICAgIiAgICBnbF9Qb3NpdGlvbiA9IHZl
YzQobWF0cml4ICogcG9zaXRpb24sIDEuMCk7XG4iCisgICAgICAgICIgICAgdmVjMyBwb3MgPSB2
ZWMzKHBvc2l0aW9uLCAxLjApO1xuIgorICAgICAgICAiICAgIHRleENvb3JkID0gKHRleE1hdHJp
eCAqIHBvcykueHk7XG4iCisgICAgICAgICIgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdHJpeCAq
IHBvcywgMS4wKTtcbiIKICAgICAgICAgIn1cbiI7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGZy
YWdtZW50U2hhZGVyU291cmNlID0KICAgICAgICAgIiNpZmRlZiBHTF9FU1xuIgpAQCAtMTI3LDcg
KzEyOCw3IEBAIHZvaWQgQmljdWJpY1NoYWRlcjo6dXNlKGNvbnN0IEFmZmluZVRyYW4KICAgICBt
X2NvbnRleHQtPnVuaWZvcm0xaShtX2ltYWdlTG9jYXRpb24sIDApOwogICAgIG1fY29udGV4dC0+
dW5pZm9ybTFmKG1fYWxwaGFMb2NhdGlvbiwgYWxwaGEpOwogCi0gICAgbV9jb250ZXh0LT52ZXJ0
ZXhBdHRyaWJQb2ludGVyKG1fcG9zaXRpb25Mb2NhdGlvbiwgMywgR3JhcGhpY3NDb250ZXh0M0Q6
OkZMT0FULCBmYWxzZSwgMCwgMCk7CisgICAgbV9jb250ZXh0LT52ZXJ0ZXhBdHRyaWJQb2ludGVy
KG1fcG9zaXRpb25Mb2NhdGlvbiwgMiwgR3JhcGhpY3NDb250ZXh0M0Q6OkZMT0FULCBmYWxzZSwg
MCwgMCk7CiAKICAgICBtX2NvbnRleHQtPmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1fcG9zaXRp
b25Mb2NhdGlvbik7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9n
cHUvQ29udm9sdXRpb25TaGFkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2dwdS9Db252b2x1dGlvblNoYWRlci5jcHAJKHJldmlzaW9uIDgyNTAx
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0NvbnZvbHV0aW9uU2hh
ZGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTgsMTMgKzU4LDE0IEBAIFBhc3NPd25QdHI8Q29u
dm9sdXRpb25TaGFkZXI+IENvbnZvbHV0aW8KICAgICAgICAgInVuaWZvcm0gbWF0MyBtYXRyaXg7
XG4iCiAgICAgICAgICJ1bmlmb3JtIG1hdDMgdGV4TWF0cml4O1xuIgogICAgICAgICAidW5pZm9y
bSB2ZWMyIGltYWdlSW5jcmVtZW50O1xuIgotICAgICAgICAiYXR0cmlidXRlIHZlYzMgcG9zaXRp
b247XG4iCisgICAgICAgICJhdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjtcbiIKICAgICAgICAgInZh
cnlpbmcgdmVjMiBpbWFnZUNvb3JkO1xuIgogICAgICAgICAidm9pZCBtYWluKCkge1xuIgorICAg
ICAgICAiICAgIHZlYzMgcG9zID0gdmVjMyhwb3NpdGlvbiwgMS4wKTtcbiIKICAgICAgICAgIiAg
ICAvLyBPZmZzZXQgaW1hZ2UgY29vcmRzIGJ5IGhhbGYgb2Yga2VybmVsIHdpZHRoLCBpbiBpbWFn
ZSB0ZXhlbHNcbiIKLSAgICAgICAgIiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQobWF0cml4ICogcG9z
aXRpb24sIDEuMCk7XG4iCisgICAgICAgICIgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KG1hdHJpeCAq
IHBvcywgMS4wKTtcbiIKICAgICAgICAgIiAgICBmbG9hdCBzY2FsZSA9IChmbG9hdChLRVJORUxf
V0lEVEgpIC0gMS4wKSAvIDIuMDtcbiIKLSAgICAgICAgIiAgICBpbWFnZUNvb3JkID0gKHRleE1h
dHJpeCAqIHBvc2l0aW9uKS54eSAtIHZlYzIoc2NhbGUsIHNjYWxlKSAqIGltYWdlSW5jcmVtZW50
O1xuIgorICAgICAgICAiICAgIGltYWdlQ29vcmQgPSAodGV4TWF0cml4ICogcG9zKS54eSAtIHZl
YzIoc2NhbGUsIHNjYWxlKSAqIGltYWdlSW5jcmVtZW50O1xuIgogICAgICAgICAifVxuIjsKICAg
ICBjaGFyIHZlcnRleFNoYWRlclNvdXJjZVsxMDI0XTsKICAgICBzbnByaW50Zih2ZXJ0ZXhTaGFk
ZXJTb3VyY2UsIHNpemVvZih2ZXJ0ZXhTaGFkZXJTb3VyY2UpLCB2ZXJ0ZXhTaGFkZXJSYXcsIGtl
cm5lbFdpZHRoKTsKQEAgLTExNSw3ICsxMTYsNyBAQCB2b2lkIENvbnZvbHV0aW9uU2hhZGVyOjp1
c2UoY29uc3QgQWZmaW5lCiAgICAgICAgIGtlcm5lbFdpZHRoID0gbV9rZXJuZWxXaWR0aDsKICAg
ICBtX2NvbnRleHQtPnVuaWZvcm0xZnYobV9rZXJuZWxMb2NhdGlvbiwgY29uc3RfY2FzdDxmbG9h
dCo+KGtlcm5lbCksIGtlcm5lbFdpZHRoKTsKIAotICAgIG1fY29udGV4dC0+dmVydGV4QXR0cmli
UG9pbnRlcihtX3Bvc2l0aW9uTG9jYXRpb24sIDMsIEdyYXBoaWNzQ29udGV4dDNEOjpGTE9BVCwg
ZmFsc2UsIDAsIDApOworICAgIG1fY29udGV4dC0+dmVydGV4QXR0cmliUG9pbnRlcihtX3Bvc2l0
aW9uTG9jYXRpb24sIDIsIEdyYXBoaWNzQ29udGV4dDNEOjpGTE9BVCwgZmFsc2UsIDAsIDApOwog
CiAgICAgbV9jb250ZXh0LT5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtX3Bvc2l0aW9uTG9jYXRp
b24pOwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BC
bGlubk1hdGhVdGlscy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvZ3B1L0xvb3BCbGlubk1hdGhVdGlscy5jcHAJKHJldmlzaW9uIDgyNTAxKQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlubk1hdGhVdGlscy5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTU2Miw2ICs1NjIsMTA4IEBAIGludCBudW1YUmF5Q3Jvc3Np
bmdzRm9yQ3ViaWMoY29uc3QgWFJheSYKICAgICByZXR1cm4gbnVtQ3Jvc3NpbmdzOwogfQogCisv
KgorICogQmFzZWQgb24gQyBjb2RlIGZyb20gdGhlIGFydGljbGUKKyAqICJUZXN0aW5nIHRoZSBD
b252ZXhpdHkgb2YgYSBQb2x5Z29uIgorICogYnkgUGV0ZXIgU2Nob3JuIGFuZCBGcmVkZXJpY2sg
RmlzaGVyLAorICogKHNjaG9ybkBpbmYuZXRoei5jaCwgZnJlZEBrcGMuY29tKQorICogaW4gIkdy
YXBoaWNzIEdlbXMgSVYiLCBBY2FkZW1pYyBQcmVzcywgMTk5NAorICovCisKK3N0YXRpYyBpbmxp
bmUgaW50IGNvbnZleENvbXBhcmUoY29uc3QgRmxvYXRTaXplJiBkZWx0YSkKK3sKKyAgICByZXR1
cm4gKGRlbHRhLndpZHRoKCkgPiAwKSA/IC0xIDogLyogeCBjb29yZCBkaWZmLCBzZWNvbmQgcHQg
PiBmaXJzdCBwdCAqLworICAgICAgICAgICAoZGVsdGEud2lkdGgoKSA8IDApID8gIDEgOiAvKiB4
IGNvb3JkIGRpZmYsIHNlY29uZCBwdCA8IGZpcnN0IHB0ICovCisgICAgICAgICAgIChkZWx0YS5o
ZWlnaHQoKSA+IDApID8gLTEgOiAvKiB4IGNvb3JkIHNhbWUsIHNlY29uZCBwdCA+IGZpcnN0IHB0
ICovCisgICAgICAgICAgIChkZWx0YS5oZWlnaHQoKSA8IDApID8gIDEgOiAvKiB4IGNvb3JkIHNh
bWUsIHNlY29uZCBwdCA+IGZpcnN0IHB0ICovCisgICAgICAgICAgIDA7IC8qIHNlY29uZCBwdCBl
cXVhbHMgZmlyc3QgcG9pbnQgKi8KK30KKworc3RhdGljIGlubGluZSBmbG9hdCBjb252ZXhDcm9z
cyhjb25zdCBGbG9hdFNpemUmIHAsIGNvbnN0IEZsb2F0U2l6ZSYgcSkKK3sKKyAgICByZXR1cm4g
cC53aWR0aCgpICogcS5oZWlnaHQoKSAtIHAuaGVpZ2h0KCkgKiBxLndpZHRoKCk7Cit9CisKK3N0
YXRpYyBpbmxpbmUgYm9vbCBjb252ZXhDaGVja1RyaXBsZShjb25zdCBGbG9hdFNpemUmIGRjdXIs
IGNvbnN0IEZsb2F0U2l6ZSYgZHByZXYsIGludCogY3VyRGlyLCBpbnQqIGRpckNoYW5nZXMsIGlu
dCogYW5nbGVTaWduKQoreworICAgIGludCB0aGlzRGlyID0gY29udmV4Q29tcGFyZShkY3VyKTsK
KyAgICBpZiAodGhpc0RpciA9PSAtKmN1ckRpcikKKyAgICAgICAgKysqZGlyQ2hhbmdlczsKKyAg
ICAqY3VyRGlyID0gdGhpc0RpcjsKKyAgICBmbG9hdCBjcm9zcyA9IGNvbnZleENyb3NzKGRwcmV2
LCBkY3VyKTsKKyAgICBpZiAoY3Jvc3MgPiAwKSB7CisgICAgICAgIGlmICgqYW5nbGVTaWduID09
IC0xKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAqYW5nbGVTaWduID0gMTsK
KyAgICB9IGVsc2UgaWYgKGNyb3NzIDwgMCkgeworICAgICAgICBpZiAoKmFuZ2xlU2lnbiA9PSAx
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAqYW5nbGVTaWduID0gLTE7Cisg
ICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGlzQ29udmV4KGNvbnN0IEZsb2F0UG9p
bnQqIHZlcnRpY2VzLCBpbnQgblZlcnRpY2VzKQoreworICAgIGludCBkaXJDaGFuZ2VzID0gMCwg
YW5nbGVTaWduID0gMDsKKyAgICBGbG9hdFBvaW50IHNlY29uZCwgdGhpcmQ7CisgICAgRmxvYXRT
aXplIGRwcmV2LCBkY3VyOworCisgICAgLyogR2V0IGRpZmZlcmVudCBwb2ludCwgcmV0dXJuIGlm
IGxlc3MgdGhhbiAzIGRpZmYgcG9pbnRzLiAqLworICAgIGlmIChuVmVydGljZXMgPCAzKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgaW50IGkgPSAxOworICAgIHdoaWxlICh0cnVlKSB7Cisg
ICAgICAgIHNlY29uZCA9IHZlcnRpY2VzW2krK107CisgICAgICAgIGRwcmV2ID0gc2Vjb25kIC0g
dmVydGljZXNbMF07CisgICAgICAgIGlmIChkcHJldi53aWR0aCgpIHx8IGRwcmV2LmhlaWdodCgp
KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIENoZWNrIGlmIG91dCBvZiBwb2ludHMu
IENoZWNrIGhlcmUgdG8gYXZvaWQgc2xvd2luZyBkb3duIGNhc2VzCisgICAgICAgICAqIHdpdGhv
dXQgcmVwZWF0ZWQgcG9pbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGkgPj0gblZlcnRp
Y2VzKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBGbG9hdFBvaW50IHNh
dmVTZWNvbmQgPSBzZWNvbmQ7CisgICAgaW50IGN1ckRpciA9IGNvbnZleENvbXBhcmUoZHByZXYp
OyAgICAgICAgLyogRmluZCBpbml0aWFsIGRpcmVjdGlvbiAqLworICAgIHdoaWxlIChpIDwgblZl
cnRpY2VzKSB7CisgICAgICAgIC8qIEdldCBkaWZmZXJlbnQgcG9pbnQsIGJyZWFrIGlmIG5vIG1v
cmUgcG9pbnRzICovCisgICAgICAgIHRoaXJkID0gdmVydGljZXNbaSsrXTsKKyAgICAgICAgZGN1
ciA9IHRoaXJkIC0gc2Vjb25kOworICAgICAgICBpZiAoIWRjdXIud2lkdGgoKSAmJiAhZGN1ci5o
ZWlnaHQoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIENoZWNrIGN1cnJl
bnQgdGhyZWUgcG9pbnRzICovCisgICAgICAgIGlmICghY29udmV4Q2hlY2tUcmlwbGUoZGN1ciwg
ZHByZXYsICZjdXJEaXIsICZkaXJDaGFuZ2VzLCAmYW5nbGVTaWduKSkgCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIHNlY29uZCA9IHRoaXJkOyAgICAgLyogUmVtZW1iZXIgcHRy
IHRvIGN1cnJlbnQgcG9pbnQuICovIFwKKyAgICAgICAgZHByZXYgPSBkY3VyOyAgICAgICAvKiBS
ZW1lbWJlciBjdXJyZW50IGRlbHRhLiAqLyAgICAgICAgXAorICAgIH0KKworICAgIC8qIE11c3Qg
Y2hlY2sgZm9yIGRpcmVjdGlvbiBjaGFuZ2VzIGZyb20gbGFzdCB2ZXJ0ZXggYmFjayB0byBmaXJz
dCAqLworICAgIHRoaXJkID0gdmVydGljZXNbMF07ICAgICAgICAgICAgICAgICAgLyogUHJlcGFy
ZSBmb3IgJ0NvbnZleENoZWNrVHJpcGxlJyAqLworICAgIGRjdXIgPSB0aGlyZCAtIHNlY29uZDsK
KyAgICBpZiAoY29udmV4Q29tcGFyZShkY3VyKSkgeworICAgICAgICBpZiAoIWNvbnZleENoZWNr
VHJpcGxlKGRjdXIsIGRwcmV2LCAmY3VyRGlyLCAmZGlyQ2hhbmdlcywgJmFuZ2xlU2lnbikpIAor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBzZWNvbmQgPSB0aGlyZDsgICAgIC8q
IFJlbWVtYmVyIHB0ciB0byBjdXJyZW50IHBvaW50LiAqLyBcCisgICAgICAgIGRwcmV2ID0gZGN1
cjsgICAgICAgLyogUmVtZW1iZXIgY3VycmVudCBkZWx0YS4gKi8gICAgICAgIFwKKyAgICB9CisK
KyAgICAvKiBhbmQgY2hlY2sgZm9yIGRpcmVjdGlvbiBjaGFuZ2VzIGJhY2sgdG8gc2Vjb25kIHZl
cnRleCAqLworICAgIGRjdXIgPSBzYXZlU2Vjb25kIC0gc2Vjb25kOworICAgIGlmICghY29udmV4
Q2hlY2tUcmlwbGUoZGN1ciwgZHByZXYsICZjdXJEaXIsICZkaXJDaGFuZ2VzLCAmYW5nbGVTaWdu
KSkgCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8qIERlY2lkZSBvbiBwb2x5Z29uIHR5
cGUgZ2l2ZW4gYWNjdW11bGF0ZWQgc3RhdHVzICovCisgICAgaWYgKGRpckNoYW5nZXMgPiAyKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoYW5nbGVTaWduID4gMCB8fCBhbmdsZVNp
Z24gPCAwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIH0g
Ly8gbmFtZXNwYWNlIExvb3BCbGlubk1hdGhVdGlscwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQog
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uTWF0
aFV0aWxzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Z3B1L0xvb3BCbGlubk1hdGhVdGlscy5oCShyZXZpc2lvbiA4MjUwMSkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5NYXRoVXRpbHMuaAkod29ya2luZyBj
b3B5KQpAQCAtMTAxLDYgKzEwMSw5IEBAIGJvb2wgeFJheUNyb3NzZXNMaW5lKGNvbnN0IFhSYXkm
IHhSYXksCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50IGxpbmVFbmRwb2lu
dHNbMl0sCiAgICAgICAgICAgICAgICAgICAgICBib29sJiBhbWJpZ3VvdXMpOwogCisKK2Jvb2wg
aXNDb252ZXgoY29uc3QgRmxvYXRQb2ludCogdmVydGljZXMsIGludCBuVmVydGljZXMpOworCiB9
IC8vIG5hbWVzcGFjZSBMb29wQmxpbm5NYXRoVXRpbHMKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L1NoYWRlci5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L1NoYWRl
ci5jcHAJKHJldmlzaW9uIDgyNTAxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3B1L1NoYWRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0MCw3ICsxNDAsNyBAQCBTdHJp
bmcgU2hhZGVyOjpnZW5lcmF0ZVZlcnRleChTaGFkZXI6OlZlCiAgICAgY2FzZSBUd29EaW1lbnNp
b25hbDoKICAgICAgICAgYnVpbGRlci5hcHBlbmQoCiAgICAgICAgICAgICAidW5pZm9ybSBtYXQz
IG1hdHJpeDtcbiIKLSAgICAgICAgICAgICJhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcbiIpOwor
ICAgICAgICAgICAgImF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uO1xuIik7CiAgICAgICAgIGJyZWFr
OwogICAgIGNhc2UgTG9vcEJsaW5uSW50ZXJpb3I6CiAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKApA
QCAtMTY3LDcgKzE2Nyw3IEBAIFN0cmluZyBTaGFkZXI6OmdlbmVyYXRlVmVydGV4KFNoYWRlcjo6
VmUKIAogICAgIGlmICh2ZXJ0ZXhUeXBlID09IFR3b0RpbWVuc2lvbmFsKSB7CiAgICAgICAgIGJ1
aWxkZXIuYXBwZW5kKAotICAgICAgICAgICAgImdsX1Bvc2l0aW9uID0gdmVjNChtYXRyaXggKiBw
b3NpdGlvbiwgMS4wKTtcbiIpOworICAgICAgICAgICAgImdsX1Bvc2l0aW9uID0gdmVjNChtYXRy
aXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApLCAxLjApO1xuIik7CiAgICAgfSBlbHNlIHsKICAgICAg
ICAgYnVpbGRlci5hcHBlbmQoCiAgICAgICAgICAgICAiZ2xfUG9zaXRpb24gPSB3b3JsZFZpZXdQ
cm9qZWN0aW9uICogdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApO1xuIik7CkBAIC0xNzksNyArMTc5
LDcgQEAgU3RyaW5nIFNoYWRlcjo6Z2VuZXJhdGVWZXJ0ZXgoU2hhZGVyOjpWZQogCiAgICAgaWYg
KGZpbGxUeXBlID09IFRleHR1cmVGaWxsKSB7CiAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKAotICAg
ICAgICAgICAgInRleENvb3JkID0gdGV4TWF0cml4ICogcG9zaXRpb247XG4iKTsKKyAgICAgICAg
ICAgICJ0ZXhDb29yZCA9IHRleE1hdHJpeCAqIHZlYzMocG9zaXRpb24sIDEuMCk7XG4iKTsKICAg
ICB9CiAKICAgICBidWlsZGVyLmFwcGVuZCgKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2dwdS9TaGFyZWRHcmFwaGljc0NvbnRleHQzRC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L1NoYXJlZEdyYXBoaWNzQ29udGV4
dDNELmNwcAkocmV2aXNpb24gODI1MDEpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9ncHUvU2hhcmVkR3JhcGhpY3NDb250ZXh0M0QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0z
NDYsMTAgKzM0NiwxMCBAQCB2b2lkIFNoYXJlZEdyYXBoaWNzQ29udGV4dDNEOjplbmFibGVTdGVu
CiB2b2lkIFNoYXJlZEdyYXBoaWNzQ29udGV4dDNEOjp1c2VRdWFkVmVydGljZXMoKQogewogICAg
IGlmICghbV9xdWFkVmVydGljZXMpIHsKLSAgICAgICAgZmxvYXQgdmVydGljZXNbXSA9IHsgMC4w
ZiwgMC4wZiwgMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwg
MS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwgMS4wZiwgMS4wZiwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZiwgMS4wZiwgMS4wZiB9OworICAgICAgICBm
bG9hdCB2ZXJ0aWNlc1tdID0geyAwLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAxLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAxLjBm
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmLCAxLjBmIH07CiAgICAgICAgIG1f
cXVhZFZlcnRpY2VzID0gbV9jb250ZXh0LT5jcmVhdGVCdWZmZXIoKTsKICAgICAgICAgbV9jb250
ZXh0LT5iaW5kQnVmZmVyKEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIsIG1fcXVhZFZl
cnRpY2VzKTsKICAgICAgICAgbV9jb250ZXh0LT5idWZmZXJEYXRhKEdyYXBoaWNzQ29udGV4dDNE
OjpBUlJBWV9CVUZGRVIsIHNpemVvZih2ZXJ0aWNlcyksIHZlcnRpY2VzLCBHcmFwaGljc0NvbnRl
eHQzRDo6U1RBVElDX0RSQVcpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZ3B1L1NvbGlkRmlsbFNoYWRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L1NvbGlkRmlsbFNoYWRlci5jcHAJKHJldmlzaW9uIDgyNTAx
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L1NvbGlkRmlsbFNoYWRl
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY5LDcgKzY5LDcgQEAgdm9pZCBTb2xpZEZpbGxTaGFk
ZXI6OnVzZShjb25zdCBBZmZpbmVUcgogICAgIGFmZmluZVRvM3gzKHRyYW5zZm9ybSwgbWF0cml4
KTsKICAgICBtX2NvbnRleHQtPnVuaWZvcm1NYXRyaXgzZnYobV9tYXRyaXhMb2NhdGlvbiwgZmFs
c2UgLyp0cmFuc3Bvc2UqLywgbWF0cml4LCAxIC8qY291bnQqLyk7CiAKLSAgICBtX2NvbnRleHQt
PnZlcnRleEF0dHJpYlBvaW50ZXIobV9wb3NpdGlvbkxvY2F0aW9uLCAzLCBHcmFwaGljc0NvbnRl
eHQzRDo6RkxPQVQsIGZhbHNlLCAwLCAwKTsKKyAgICBtX2NvbnRleHQtPnZlcnRleEF0dHJpYlBv
aW50ZXIobV9wb3NpdGlvbkxvY2F0aW9uLCAyLCBHcmFwaGljc0NvbnRleHQzRDo6RkxPQVQsIGZh
bHNlLCAwLCAwKTsKIAogICAgIG1fY29udGV4dC0+ZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobV9w
b3NpdGlvbkxvY2F0aW9uKTsKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2dwdS9UZXhTaGFkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2dwdS9UZXhTaGFkZXIuY3BwCShyZXZpc2lvbiA4MjUwMSkKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9UZXhTaGFkZXIuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC03Miw3ICs3Miw3IEBAIHZvaWQgVGV4U2hhZGVyOjp1c2UoY29uc3QgQWZmaW5lVHJh
bnNmb3IKICAgICBtX2NvbnRleHQtPnVuaWZvcm0xaShtX3NhbXBsZXJMb2NhdGlvbiwgc2FtcGxl
cik7CiAgICAgbV9jb250ZXh0LT51bmlmb3JtMWYobV9hbHBoYUxvY2F0aW9uLCBhbHBoYSk7CiAK
LSAgICBtX2NvbnRleHQtPnZlcnRleEF0dHJpYlBvaW50ZXIobV9wb3NpdGlvbkxvY2F0aW9uLCAz
LCBHcmFwaGljc0NvbnRleHQzRDo6RkxPQVQsIGZhbHNlLCAwLCAwKTsKKyAgICBtX2NvbnRleHQt
PnZlcnRleEF0dHJpYlBvaW50ZXIobV9wb3NpdGlvbkxvY2F0aW9uLCAyLCBHcmFwaGljc0NvbnRl
eHQzRDo6RkxPQVQsIGZhbHNlLCAwLCAwKTsKIAogICAgIG1fY29udGV4dC0+ZW5hYmxlVmVydGV4
QXR0cmliQXJyYXkobV9wb3NpdGlvbkxvY2F0aW9uKTsKIAo=
</data>
<flag name="review"
          id="80205"
          type_id="1"
          status="+"
          setter="kbr"
    />
          </attachment>
      

    </bug>

</bugzilla>