<?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>45252</bug_id>
          
          <creation_ts>2010-09-05 22:26:59 -0700</creation_ts>
          <short_desc>Add local triangulation of cubic curve control points</short_desc>
          <delta_ts>2010-09-27 16:43:47 -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>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>44729</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kenneth Russell">kbr</reporter>
          <assigned_to name="Kenneth Russell">kbr</assigned_to>
          <cc>abarth</cc>
    
    <cc>cmarrin</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>fishd</cc>
    
    <cc>jamesr</cc>
    
    <cc>senorblanco</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>274483</commentid>
    <comment_count>0</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-05 22:26:59 -0700</bug_when>
    <thetext>As part of the GPU accelerated path rendering algorithm in https://bugs.webkit.org/show_bug.cgi?id=44729 , a local triangulation algorithm is needed for the four points defining a cubic curve. This triangulator needs to support walking the interior edges of the shape in order to feed those edges to a more general triangulation algorithm which handles filling of the interior of the shape.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274487</commentid>
    <comment_count>1</comment_count>
      <attachid>66611</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-05 22:41:24 -0700</bug_when>
    <thetext>Created attachment 66611
Patch

From the ChangeLog:

Adding a localized triangulation algorithm which takes as input the four control points of a cubic curve segment and provides both triangles as well as the ability to walk the interior edges. The latter will be used later to fill the interior of shapes bounded by these cubic curves, quadratic curves and line segments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276158</commentid>
    <comment_count>2</comment_count>
      <attachid>66611</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-08 16:23:32 -0700</bug_when>
    <thetext>Comment on attachment 66611
Patch

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

&gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:35
&gt; +using namespace LoopBlinnMathUtils;
explicitly &apos;using&apos; the functions used in this cpp

&gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:39
&gt; +    for (int i = 0; i &lt; 3; i++)
nit: could use indexForVertex()

&gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:45
&gt; +LoopBlinnLocalTriangulator::Vertex* LoopBlinnLocalTriangulator::Triangle::nextVertex(LoopBlinnLocalTriangulator::Vertex* cur, bool ccw)
rename params as in header

&gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:101
&gt; +    bool done = false;
instead of having a done flag, could the work in the first half of this function be a helper that early-returns?

&gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:107
&gt; +    for (int i = 0; i &lt; 4 &amp;&amp; !done; i++)
&gt; +        for (int j = i + 1; j &lt; 4 &amp;&amp; !done; j++)
these need braces

&gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:231
&gt; +                    if (!next-&gt;marked()
&gt; +                        &amp;&amp; !isSharedEdge(v, next)
&gt; +                        &amp;&amp; (!next-&gt;interior() || next-&gt;end())) {
intentation looks funny. I think the predicate can go one line

&gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:242
&gt; +            // Something went wrong with the above algorithm; add the last
add a FIXME?

&gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.h:46
&gt; +        Vertex()
initialize the flags in here

&gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.h:141
&gt; +        Vertex* nextVertex(Vertex* cur, bool ccw);
cur -&gt; current

ccw -&gt; counterClockWise, or an enum { ClockWise, CounterClockWise }

&gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.h:165
&gt; +        Vertex* m_vertices[3];
Add a comment indicating why these are raw pointers (that they point to data from the arena or something of that sort).

&gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.h:196
&gt; +    void triangulate(bool computeInsideEdges,
&gt; +                     bool fillRightSide);
these bool params should be enums so callsites look more like triangulage(ComputeInsideEdges, FillLeftSide);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276691</commentid>
    <comment_count>3</comment_count>
      <attachid>67083</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-09 13:02:45 -0700</bug_when>
    <thetext>Created attachment 67083
Revised patch

Revised patch addressing above code review comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276693</commentid>
    <comment_count>4</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-09 13:04:05 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 66611 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=66611&amp;action=prettypatch
&gt; 
&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:35
&gt; &gt; +using namespace LoopBlinnMathUtils;
&gt; explicitly &apos;using&apos; the functions used in this cpp

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:39
&gt; &gt; +    for (int i = 0; i &lt; 3; i++)
&gt; nit: could use indexForVertex()

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:45
&gt; &gt; +LoopBlinnLocalTriangulator::Vertex* LoopBlinnLocalTriangulator::Triangle::nextVertex(LoopBlinnLocalTriangulator::Vertex* cur, bool ccw)
&gt; rename params as in header

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:101
&gt; &gt; +    bool done = false;
&gt; instead of having a done flag, could the work in the first half of this function be a helper that early-returns?

Yes. Done; refactored first half into triangulateHelper.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:107
&gt; &gt; +    for (int i = 0; i &lt; 4 &amp;&amp; !done; i++)
&gt; &gt; +        for (int j = i + 1; j &lt; 4 &amp;&amp; !done; j++)
&gt; these need braces

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:231
&gt; &gt; +                    if (!next-&gt;marked()
&gt; &gt; +                        &amp;&amp; !isSharedEdge(v, next)
&gt; &gt; +                        &amp;&amp; (!next-&gt;interior() || next-&gt;end())) {
&gt; intentation looks funny. I think the predicate can go one line

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.cpp:242
&gt; &gt; +            // Something went wrong with the above algorithm; add the last
&gt; add a FIXME?

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.h:46
&gt; &gt; +        Vertex()
&gt; initialize the flags in here

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.h:141
&gt; &gt; +        Vertex* nextVertex(Vertex* cur, bool ccw);
&gt; cur -&gt; current
&gt; 
&gt; ccw -&gt; counterClockWise, or an enum { ClockWise, CounterClockWise }

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.h:165
&gt; &gt; +        Vertex* m_vertices[3];
&gt; Add a comment indicating why these are raw pointers (that they point to data from the arena or something of that sort).

Done.

&gt; &gt; WebCore/platform/graphics/gpu/LoopBlinnLocalTriangulator.h:196
&gt; &gt; +    void triangulate(bool computeInsideEdges,
&gt; &gt; +                     bool fillRightSide);
&gt; these bool params should be enums so callsites look more like triangulage(ComputeInsideEdges, FillLeftSide);

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277003</commentid>
    <comment_count>5</comment_count>
      <attachid>67149</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-09 21:48:00 -0700</bug_when>
    <thetext>Created attachment 67149
Revised patch

Renamed numTriangles to numberOfTriangles and numInteriorVertices to numberOfInteriorVertices to avoid abbreviations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>279683</commentid>
    <comment_count>6</comment_count>
      <attachid>67149</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-15 13:46:31 -0700</bug_when>
    <thetext>Comment on attachment 67149
Revised patch

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

Looks good!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282949</commentid>
    <comment_count>7</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-22 08:31:49 -0700</bug_when>
    <thetext>Committed r68045: &lt;http://trac.webkit.org/changeset/68045&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285847</commentid>
    <comment_count>8</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-27 16:08:06 -0700</bug_when>
    <thetext>Committed r68439: &lt;http://trac.webkit.org/changeset/68439&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285880</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-27 16:43:47 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/68439 might have broken Qt Linux Release
The following changes are on the blame list:
http://trac.webkit.org/changeset/68440
http://trac.webkit.org/changeset/68439</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66611</attachid>
            <date>2010-09-05 22:41:24 -0700</date>
            <delta_ts>2010-09-09 13:02:45 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>local-triangulator.patch</filename>
            <type>text/plain</type>
            <size>23344</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjgwOSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDggQEAKKzIwMTAtMDktMDUgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFk
ZCBsb2NhbCB0cmlhbmd1bGF0aW9uIG9mIGN1YmljIGN1cnZlIGNvbnRyb2wgcG9pbnRzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NTI1MgorCisgICAg
ICAgIEFkZGluZyBhIGxvY2FsaXplZCB0cmlhbmd1bGF0aW9uIGFsZ29yaXRobSB3aGljaCB0YWtl
cyBhcyBpbnB1dAorICAgICAgICB0aGUgZm91ciBjb250cm9sIHBvaW50cyBvZiBhIGN1YmljIGN1
cnZlIHNlZ21lbnQgYW5kIHByb3ZpZGVzIGJvdGgKKyAgICAgICAgdHJpYW5nbGVzIGFzIHdlbGwg
YXMgdGhlIGFiaWxpdHkgdG8gd2FsayB0aGUgaW50ZXJpb3IgZWRnZXMuIFRoZQorICAgICAgICBs
YXR0ZXIgd2lsbCBiZSB1c2VkIGxhdGVyIHRvIGZpbGwgdGhlIGludGVyaW9yIG9mIHNoYXBlcyBi
b3VuZGVkCisgICAgICAgIGJ5IHRoZXNlIGN1YmljIGN1cnZlcywgcXVhZHJhdGljIGN1cnZlcyBh
bmQgbGluZSBzZWdtZW50cy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29w
Qmxpbm5Mb2NhbFRyaWFuZ3VsYXRvci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TG9v
cEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xlOjpjb250YWlucyk6CisgICAgICAgIChX
ZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VHJpYW5nbGU6Om5leHRWZXJ0ZXgp
OgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xl
OjppbmRleEZvclZlcnRleCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFu
Z3VsYXRvcjo6VHJpYW5nbGU6Om1ha2VDQ1cpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5u
TG9jYWxUcmlhbmd1bGF0b3I6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yKToKKyAgICAgICAg
KFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpyZXNldCk6CisgICAgICAgIChX
ZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6dHJpYW5ndWxhdGUpOgorICAgICAg
ICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OmFkZFRyaWFuZ2xlKToKKyAg
ICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjphZGRJbnRlcmlvclZl
cnRleCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6aXNT
aGFyZWRFZGdlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uTG9j
YWxUcmlhbmd1bGF0b3IuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2Nh
bFRyaWFuZ3VsYXRvcjo6VmVydGV4OjpWZXJ0ZXgpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJs
aW5uTG9jYWxUcmlhbmd1bGF0b3I6OlZlcnRleDo6eHlDb29yZGluYXRlcyk6CisgICAgICAgIChX
ZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VmVydGV4OjprbG1Db29yZGluYXRl
cyk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VmVydGV4
OjpzZXQpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlZl
cnRleDo6ZW5kKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9y
OjpWZXJ0ZXg6OnNldEVuZCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFu
Z3VsYXRvcjo6VmVydGV4OjptYXJrZWQpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9j
YWxUcmlhbmd1bGF0b3I6OlZlcnRleDo6c2V0TWFya2VkKToKKyAgICAgICAgKFdlYkNvcmU6Okxv
b3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpWZXJ0ZXg6OmludGVyaW9yKToKKyAgICAgICAgKFdl
YkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpWZXJ0ZXg6OnNldEludGVyaW9yKToK
KyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpWZXJ0ZXg6OnJl
c2V0RmxhZ3MpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6
OlRyaWFuZ2xlOjpUcmlhbmdsZSk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRy
aWFuZ3VsYXRvcjo6VHJpYW5nbGU6OmdldFZlcnRleCk6CisgICAgICAgIChXZWJDb3JlOjpMb29w
Qmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VHJpYW5nbGU6OnNldFZlcnRpY2VzKToKKyAgICAgICAg
KFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpnZXRWZXJ0ZXgpOgorICAgICAg
ICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6Om51bVRyaWFuZ2xlcyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6Z2V0VHJpYW5nbGUp
OgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6Om51bUludGVy
aW9yVmVydGljZXMpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0
b3I6OmdldEludGVyaW9yVmVydGV4KToKKwogMjAxMC0wOS0wNSAgS2VubmV0aCBSdXNzZWxsICA8
a2JyQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gRmlzaGVyLgpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0
b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0xvb3BC
bGlubkxvY2FsVHJpYW5ndWxhdG9yLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvZ3B1L0xvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yLmNwcAkocmV2aXNpb24g
MCkKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNs
dWRlICJMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvci5oIgorCisjaW5jbHVkZSAiTG9vcEJsaW5u
TWF0aFV0aWxzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK3VzaW5nIG5hbWVzcGFjZSBMb29wQmxpbm5NYXRoVXRpbHM7CisKK2Jvb2wgTG9vcEJsaW5u
TG9jYWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xlOjpjb250YWlucyhMb29wQmxpbm5Mb2NhbFRyaWFu
Z3VsYXRvcjo6VmVydGV4KiB2KQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQor
ICAgICAgICBpZiAobV92ZXJ0aWNlc1tpXSA9PSB2KQorICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VmVy
dGV4KiBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VHJpYW5nbGU6Om5leHRWZXJ0ZXgoTG9v
cEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlZlcnRleCogY3VyLCBib29sIGNjdykKK3sKKyAgICBp
bnQgaWR4ID0gaW5kZXhGb3JWZXJ0ZXgoY3VyKTsKKyAgICBBU1NFUlQoaWR4ID49IDApOworICAg
IGlmIChjY3cpCisgICAgICAgICsraWR4OworICAgIGVsc2UKKyAgICAgICAgLS1pZHg7CisgICAg
aWYgKGlkeCA8IDApCisgICAgICAgIGlkeCArPSAzOworICAgIGVsc2UKKyAgICAgICAgaWR4ID0g
aWR4ICUgMzsKKyAgICByZXR1cm4gbV92ZXJ0aWNlc1tpZHhdOworfQorCitpbnQgTG9vcEJsaW5u
TG9jYWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xlOjppbmRleEZvclZlcnRleChMb29wQmxpbm5Mb2Nh
bFRyaWFuZ3VsYXRvcjo6VmVydGV4KiB2ZXJ0ZXgpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCAzOyBpKyspCisgICAgICAgIGlmIChtX3ZlcnRpY2VzW2ldID09IHZlcnRleCkKKyAgICAgICAg
ICAgIHJldHVybiBpOworICAgIHJldHVybiAtMTsKK30KKwordm9pZCBMb29wQmxpbm5Mb2NhbFRy
aWFuZ3VsYXRvcjo6VHJpYW5nbGU6Om1ha2VDQ1coKQoreworICAgIC8vIFBvc3NpYmx5IHN3YXBz
IHR3byB2ZXJ0aWNlcyBzbyB0aGF0IHRoZSB0cmlhbmdsZSdzIHZlcnRpY2VzIGFyZQorICAgIC8v
IGFsd2F5cyBzcGVjaWZpZWQgaW4gY291bnRlcmNsb2Nrd2lzZSBvcmRlci4gVGhpcyBvcmRlcnMg
dGhlCisgICAgLy8gdmVydGljZXMgY2Fub25pY2FsbHkgd2hlbiB3YWxraW5nIHRoZSBpbnRlcmlv
ciBlZGdlcyBmcm9tIHRoZQorICAgIC8vIHN0YXJ0IHRvIHRoZSBlbmQgdmVydGV4LgorICAgIEZs
b2F0UG9pbnQzRCBwb2ludDAobV92ZXJ0aWNlc1swXS0+eHlDb29yZGluYXRlcygpKTsKKyAgICBG
bG9hdFBvaW50M0QgcG9pbnQxKG1fdmVydGljZXNbMF0tPnh5Q29vcmRpbmF0ZXMoKSk7CisgICAg
RmxvYXRQb2ludDNEIHBvaW50MihtX3ZlcnRpY2VzWzBdLT54eUNvb3JkaW5hdGVzKCkpOworICAg
IEZsb2F0UG9pbnQzRCBjcm9zc1Byb2R1Y3QgPSAocG9pbnQxIC0gcG9pbnQwKS5jcm9zcyhwb2lu
dDIgLSBwb2ludDApOworICAgIGlmIChjcm9zc1Byb2R1Y3QueigpIDwgMCkKKyAgICAgICAgc3Rk
Ojpzd2FwKG1fdmVydGljZXNbMV0sIG1fdmVydGljZXNbMl0pOworfQorCitMb29wQmxpbm5Mb2Nh
bFRyaWFuZ3VsYXRvcjo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3IoKQoreworICAgIHJlc2V0
KCk7Cit9CisKK3ZvaWQgTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OnJlc2V0KCkKK3sKKyAg
ICBtX251bVRyaWFuZ2xlcyA9IDA7CisgICAgbV9udW1JbnRlcmlvclZlcnRpY2VzID0gMDsKKyAg
ICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBtX2ludGVyaW9yVmVydGlj
ZXNbaV0gPSAwOworICAgICAgICBtX3ZlcnRpY2VzW2ldLnJlc2V0RmxhZ3MoKTsKKyAgICB9Cit9
CisKK3ZvaWQgTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OnRyaWFuZ3VsYXRlKGJvb2wgY29t
cHV0ZUluc2lkZUVkZ2VzLCBib29sIGZpbGxSaWdodFNpZGUpCit7CisgICAgcmVzZXQoKTsKKwor
ICAgIGJvb2wgZG9uZSA9IGZhbHNlOworCisgICAgbV92ZXJ0aWNlc1szXS5zZXRFbmQodHJ1ZSk7
CisKKyAgICAvLyBGaXJzdCB0ZXN0IGZvciBkZWdlbmVyYXRlIGNhc2VzLgorICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgNCAmJiAhZG9uZTsgaSsrKQorICAgICAgICBmb3IgKGludCBqID0gaSArIDE7
IGogPCA0ICYmICFkb25lOyBqKyspCisgICAgICAgICAgICBpZiAoYXBwcm94RXF1YWwobV92ZXJ0
aWNlc1tpXS54eUNvb3JkaW5hdGVzKCksIG1fdmVydGljZXNbal0ueHlDb29yZGluYXRlcygpKSkg
eworICAgICAgICAgICAgICAgIC8vIFR3byBvZiB0aGUgdmVydGljZXMgYXJlIGNvaW5jaWRlbnQs
IHNvIHdlIGNhbiBlbGltaW5hdGUgYXQKKyAgICAgICAgICAgICAgICAvLyBsZWFzdCBvbmUgdHJp
YW5nbGUuIFdlIG1pZ2h0IGJlIGFibGUgdG8gZWxpbWluYXRlIHRoZSBvdGhlcgorICAgICAgICAg
ICAgICAgIC8vIGFzIHdlbGwsIGJ1dCB0aGlzIHNlZW1zIHN1ZmZpY2llbnQgdG8gYXZvaWQgZGVn
ZW5lcmF0ZQorICAgICAgICAgICAgICAgIC8vIHRyaWFuZ3VsYXRpb25zLgorICAgICAgICAgICAg
ICAgIGludCBpbmRpY2VzWzNdID0geyAwIH07CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0g
MDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKGsgIT0gaikKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNb
aW5kZXgrK10gPSBrOworICAgICAgICAgICAgICAgIGFkZFRyaWFuZ2xlKCZtX3ZlcnRpY2VzW2lu
ZGljZXNbMF1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3ZlcnRpY2VzW2luZGlj
ZXNbMV1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3ZlcnRpY2VzW2luZGljZXNb
Ml1dKTsKKyAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAg
IGlmICghZG9uZSkgeworICAgICAgICAvLyBTZWUgd2hldGhlciBhbnkgb2YgdGhlIHBvaW50cyBh
cmUgZnVsbHkgY29udGFpbmVkIGluIHRoZQorICAgICAgICAvLyB0cmlhbmdsZSBkZWZpbmVkIGJ5
IHRoZSBvdGhlciB0aHJlZS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0ICYmICFkb25l
OyBpKyspIHsKKyAgICAgICAgICAgIGludCBpbmRpY2VzWzNdID0geyAwIH07CisgICAgICAgICAg
ICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKysp
CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gaikKKyAgICAgICAgICAgICAgICAgICAgaW5kaWNl
c1tpbmRleCsrXSA9IGo7CisgICAgICAgICAgICBpZiAocG9pbnRJblRyaWFuZ2xlKG1fdmVydGlj
ZXNbaV0ueHlDb29yZGluYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt
X3ZlcnRpY2VzW2luZGljZXNbMF1dLnh5Q29vcmRpbmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbV92ZXJ0aWNlc1tpbmRpY2VzWzFdXS54eUNvb3JkaW5hdGVzKCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmVydGljZXNbaW5kaWNlc1syXV0ueHlD
b29yZGluYXRlcygpKSkgeworICAgICAgICAgICAgICAgIC8vIFByb2R1Y2UgdGhyZWUgdHJpYW5n
bGVzIHN1cnJvdW5kaW5nIHRoaXMgaW50ZXJpb3IgdmVydGV4LgorICAgICAgICAgICAgICAgIGZv
ciAoaW50IGogPSAwOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgICAgICAgICBhZGRUcmlhbmds
ZSgmbV92ZXJ0aWNlc1tpbmRpY2VzW2ogJSAzXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICZtX3ZlcnRpY2VzW2luZGljZXNbKGogKyAxKSAlIDNdXSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgJm1fdmVydGljZXNbaV0pOworICAgICAgICAgICAgICAgIC8vIE1h
cmsgdGhlIGludGVyaW9yIHZlcnRleCBzbyB3ZSBpZ25vcmUgaXQgaWYgdHJ5aW5nIHRvIHRyYWNl
CisgICAgICAgICAgICAgICAgLy8gdGhlIGludGVyaW9yIGVkZ2UuCisgICAgICAgICAgICAgICAg
bV92ZXJ0aWNlc1tpXS5zZXRJbnRlcmlvcih0cnVlKTsKKyAgICAgICAgICAgICAgICBkb25lID0g
dHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZG9uZSkg
eworICAgICAgICAvLyBUaGVyZSBhcmUgb25seSBhIGZldyBwZXJtdXRhdGlvbnMgb2YgdGhlIHZl
cnRpY2VzLCBpZ25vcmluZworICAgICAgICAvLyByb3RhdGlvbnMsIHdoaWNoIGFyZSBpcnJlbGV2
YW50OgorICAgICAgICAvLworICAgICAgICAvLyAgMC0tMyAgMC0tMiAgMC0tMyAgMC0tMSAgMC0t
MiAgMC0tMQorICAgICAgICAvLyAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfAor
ICAgICAgICAvLyAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfAorICAgICAgICAv
LyAgMS0tMiAgMS0tMyAgMi0tMSAgMi0tMyAgMy0tMSAgMy0tMgorICAgICAgICAvLworICAgICAg
ICAvLyBOb3RlIHRoYXQgdGhyZWUgb2YgdGhlc2UgYXJlIHJlZmxlY3Rpb25zIG9mIGVhY2ggb3Ro
ZXIuCisgICAgICAgIC8vIFRoZXJlZm9yZSB0aGVyZSBhcmUgb25seSB0aHJlZSBwb3NzaWJsZSB0
cmlhbmd1bGF0aW9uczoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gIDAtLTMgIDAtLTIgIDAtLTMK
KyAgICAgICAgLy8gIHxcIHwgIHxcIHwgIHxcIHwKKyAgICAgICAgLy8gIHwgXHwgIHwgXHwgIHwg
XHwKKyAgICAgICAgLy8gIDEtLTIgIDEtLTMgIDItLTEKKyAgICAgICAgLy8KKyAgICAgICAgLy8g
RnJvbSB3aGljaCB3ZSBjYW4gY2hvb3NlIGJ5IHNlZWluZyB3aGljaCBvZiB0aGUgcG90ZW50aWFs
CisgICAgICAgIC8vIGRpYWdvbmFscyBpbnRlcnNlY3QuIE5vdGUgdGhhdCB3ZSBjaG9vc2UgdGhl
IHNob3J0ZXN0IGRpYWdvbmFsCisgICAgICAgIC8vIHRvIHNwbGl0IHRoZSBxdWFkLgorICAgICAg
ICBpZiAobGluZXNJbnRlcnNlY3QobV92ZXJ0aWNlc1swXS54eUNvb3JkaW5hdGVzKCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtX3ZlcnRpY2VzWzJdLnh5Q29vcmRpbmF0ZXMoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmVydGljZXNbMV0ueHlDb29yZGluYXRlcygpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92ZXJ0aWNlc1szXS54eUNvb3JkaW5hdGVzKCkp
KSB7CisgICAgICAgICAgICBpZiAoKG1fdmVydGljZXNbMl0ueHlDb29yZGluYXRlcygpIC0gbV92
ZXJ0aWNlc1swXS54eUNvb3JkaW5hdGVzKCkpLmRpYWdvbmFsTGVuZ3RoU3F1YXJlZCgpIDwKKyAg
ICAgICAgICAgICAgICAobV92ZXJ0aWNlc1szXS54eUNvb3JkaW5hdGVzKCkgLSBtX3ZlcnRpY2Vz
WzFdLnh5Q29vcmRpbmF0ZXMoKSkuZGlhZ29uYWxMZW5ndGhTcXVhcmVkKCkpIHsKKyAgICAgICAg
ICAgICAgICBhZGRUcmlhbmdsZSgmbV92ZXJ0aWNlc1swXSwgJm1fdmVydGljZXNbMV0sICZtX3Zl
cnRpY2VzWzJdKTsKKyAgICAgICAgICAgICAgICBhZGRUcmlhbmdsZSgmbV92ZXJ0aWNlc1swXSwg
Jm1fdmVydGljZXNbMl0sICZtX3ZlcnRpY2VzWzNdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgYWRkVHJpYW5nbGUoJm1fdmVydGljZXNbMF0sICZtX3ZlcnRpY2VzWzFd
LCAmbV92ZXJ0aWNlc1szXSk7CisgICAgICAgICAgICAgICAgYWRkVHJpYW5nbGUoJm1fdmVydGlj
ZXNbMV0sICZtX3ZlcnRpY2VzWzJdLCAmbV92ZXJ0aWNlc1szXSk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0gZWxzZSBpZiAobGluZXNJbnRlcnNlY3QobV92ZXJ0aWNlc1swXS54eUNvb3JkaW5h
dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92ZXJ0aWNlc1szXS54
eUNvb3JkaW5hdGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92ZXJ0
aWNlc1sxXS54eUNvb3JkaW5hdGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbV92ZXJ0aWNlc1syXS54eUNvb3JkaW5hdGVzKCkpKSB7CisgICAgICAgICAgICBpZiAoKG1f
dmVydGljZXNbM10ueHlDb29yZGluYXRlcygpIC0gbV92ZXJ0aWNlc1swXS54eUNvb3JkaW5hdGVz
KCkpLmRpYWdvbmFsTGVuZ3RoU3F1YXJlZCgpIDwKKyAgICAgICAgICAgICAgICAobV92ZXJ0aWNl
c1syXS54eUNvb3JkaW5hdGVzKCkgLSBtX3ZlcnRpY2VzWzFdLnh5Q29vcmRpbmF0ZXMoKSkuZGlh
Z29uYWxMZW5ndGhTcXVhcmVkKCkpIHsKKyAgICAgICAgICAgICAgICBhZGRUcmlhbmdsZSgmbV92
ZXJ0aWNlc1swXSwgJm1fdmVydGljZXNbMV0sICZtX3ZlcnRpY2VzWzNdKTsKKyAgICAgICAgICAg
ICAgICBhZGRUcmlhbmdsZSgmbV92ZXJ0aWNlc1swXSwgJm1fdmVydGljZXNbM10sICZtX3ZlcnRp
Y2VzWzJdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkVHJpYW5n
bGUoJm1fdmVydGljZXNbMF0sICZtX3ZlcnRpY2VzWzFdLCAmbV92ZXJ0aWNlc1syXSk7CisgICAg
ICAgICAgICAgICAgYWRkVHJpYW5nbGUoJm1fdmVydGljZXNbMl0sICZtX3ZlcnRpY2VzWzFdLCAm
bV92ZXJ0aWNlc1szXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICAvLyBMaW5lcyAoMC0+MSksICgyLT4zKSBpbnRlcnNlY3QgLS0gb3Igc2hvdWxkLCBtb2R1
bG8gbnVtZXJpY2FsCisgICAgICAgICAgICAvLyBwcmVjaXNpb24gaXNzdWVzCisgICAgICAgICAg
ICBpZiAoKG1fdmVydGljZXNbMV0ueHlDb29yZGluYXRlcygpIC0gbV92ZXJ0aWNlc1swXS54eUNv
b3JkaW5hdGVzKCkpLmRpYWdvbmFsTGVuZ3RoU3F1YXJlZCgpIDwKKyAgICAgICAgICAgICAgICAo
bV92ZXJ0aWNlc1szXS54eUNvb3JkaW5hdGVzKCkgLSBtX3ZlcnRpY2VzWzJdLnh5Q29vcmRpbmF0
ZXMoKSkuZGlhZ29uYWxMZW5ndGhTcXVhcmVkKCkpIHsKKyAgICAgICAgICAgICAgICBhZGRUcmlh
bmdsZSgmbV92ZXJ0aWNlc1swXSwgJm1fdmVydGljZXNbMl0sICZtX3ZlcnRpY2VzWzFdKTsKKyAg
ICAgICAgICAgICAgICBhZGRUcmlhbmdsZSgmbV92ZXJ0aWNlc1swXSwgJm1fdmVydGljZXNbMV0s
ICZtX3ZlcnRpY2VzWzNdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAg
YWRkVHJpYW5nbGUoJm1fdmVydGljZXNbMF0sICZtX3ZlcnRpY2VzWzJdLCAmbV92ZXJ0aWNlc1sz
XSk7CisgICAgICAgICAgICAgICAgYWRkVHJpYW5nbGUoJm1fdmVydGljZXNbM10sICZtX3ZlcnRp
Y2VzWzJdLCAmbV92ZXJ0aWNlc1sxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBpZiAoY29tcHV0ZUluc2lkZUVkZ2VzKSB7CisgICAgICAgIC8vIFdlIG5lZWQgdG8g
Y29tcHV0ZSB3aGljaCB2ZXJ0aWNlcyBkZXNjcmliZSB0aGUgcGF0aCBhbG9uZyB0aGUKKyAgICAg
ICAgLy8gaW50ZXJpb3IgcG9ydGlvbiBvZiB0aGUgc2hhcGUsIHRvIGZlZWQgdGhlc2UgdmVydGlj
ZXMgdG8gdGhlCisgICAgICAgIC8vIG1vcmUgZ2VuZXJhbCB0ZXNzZWxsYXRpb24gYWxnb3JpdGht
LiBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlCisgICAgICAgIC8vIGNvdWxkIGRldGVybWluZSB0aGlz
IGRpcmVjdGx5IHdoaWxlIHByb2R1Y2luZyB0cmlhbmdsZXMgYWJvdmUuCisgICAgICAgIC8vIEhl
cmUgd2UgdHJ5IHRvIGRvIGl0IGdlbmVyYWxseSBqdXN0IGJ5IGV4YW1pbmluZyB0aGUgdHJpYW5n
bGVzCisgICAgICAgIC8vIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvZHVjZWQuIFdlIHdhbGsg
YXJvdW5kIHRoZW0gaW4gYQorICAgICAgICAvLyBzcGVjaWZpYyBkaXJlY3Rpb24gZGV0ZXJtaW5l
ZCBieSB3aGljaCBzaWRlIG9mIHRoZSBjdXJ2ZSBpcworICAgICAgICAvLyBiZWluZyBmaWxsZWQu
IFdlIGlnbm9yZSB0aGUgaW50ZXJpb3IgdmVydGV4IHVubGVzcyBpdCBpcyBhbHNvCisgICAgICAg
IC8vIHRoZSBlbmRpbmcgdmVydGV4LCBhbmQgc2tpcCB0aGUgZWRnZXMgc2hhcmVkIGJldHdlZW4g
dHdvCisgICAgICAgIC8vIHRyaWFuZ2xlcy4KKyAgICAgICAgVmVydGV4KiB2ID0gJm1fdmVydGlj
ZXNbMF07CisgICAgICAgIGFkZEludGVyaW9yVmVydGV4KHYpOworICAgICAgICBpbnQgbnVtU3Rl
cHMgPSAwOworICAgICAgICB3aGlsZSAoIXYtPmVuZCgpICYmIG51bVN0ZXBzIDwgNCkgeworICAg
ICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCB2ZXJ0ZXggYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBy
dWxlcworICAgICAgICAgICAgYm9vbCBnb3ROZXh0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3Ig
KGludCBpID0gMDsgaSA8IG51bVRyaWFuZ2xlcygpICYmICFnb3ROZXh0OyBpKyspIHsKKyAgICAg
ICAgICAgICAgICBUcmlhbmdsZSogdHJpID0gZ2V0VHJpYW5nbGUoaSk7CisgICAgICAgICAgICAg
ICAgaWYgKHRyaS0+Y29udGFpbnModikpIHsKKyAgICAgICAgICAgICAgICAgICAgVmVydGV4KiBu
ZXh0ID0gdHJpLT5uZXh0VmVydGV4KHYsIGZpbGxSaWdodFNpZGUpOworICAgICAgICAgICAgICAg
ICAgICBpZiAoIW5leHQtPm1hcmtlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaXNT
aGFyZWRFZGdlKHYsIG5leHQpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIW5leHQtPmlu
dGVyaW9yKCkgfHwgbmV4dC0+ZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRJ
bnRlcmlvclZlcnRleChuZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBuZXh0Owor
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIGZvciBsb29wCisgICAgICAg
ICAgICAgICAgICAgICAgICBnb3ROZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbnVtU3RlcHM7
CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF2LT5lbmQoKSkgeworICAgICAgICAgICAgLy8gU29t
ZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgYWJvdmUgYWxnb3JpdGhtOyBhZGQgdGhlIGxhc3QK
KyAgICAgICAgICAgIC8vIHZlcnRleCB0byB0aGUgaW50ZXJpb3IgdmVydGljZXMgYW55d2F5Lgor
ICAgICAgICAgICAgYWRkSW50ZXJpb3JWZXJ0ZXgoJm1fdmVydGljZXNbM10pOworICAgICAgICB9
CisgICAgfQorfQorCit2b2lkIExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjphZGRUcmlhbmds
ZShWZXJ0ZXgqIHYwLCBWZXJ0ZXgqIHYxLCBWZXJ0ZXgqIHYyKQoreworICAgIEFTU0VSVChtX251
bVRyaWFuZ2xlcyA8IDMpOworICAgIG1fdHJpYW5nbGVzW21fbnVtVHJpYW5nbGVzKytdLnNldFZl
cnRpY2VzKHYwLCB2MSwgdjIpOworfQorCit2b2lkIExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9y
OjphZGRJbnRlcmlvclZlcnRleChWZXJ0ZXgqIHYpCit7CisgICAgQVNTRVJUKG1fbnVtSW50ZXJp
b3JWZXJ0aWNlcyA8IDQpOworICAgIG1faW50ZXJpb3JWZXJ0aWNlc1ttX251bUludGVyaW9yVmVy
dGljZXMrK10gPSB2OworICAgIHYtPnNldE1hcmtlZCh0cnVlKTsKK30KKworYm9vbCBMb29wQmxp
bm5Mb2NhbFRyaWFuZ3VsYXRvcjo6aXNTaGFyZWRFZGdlKFZlcnRleCogdjAsIFZlcnRleCogdjEp
Cit7CisgICAgYm9vbCBoYXZlRWRnZTAxID0gZmFsc2U7CisgICAgYm9vbCBoYXZlRWRnZTEwID0g
ZmFsc2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UcmlhbmdsZXMoKTsgaSsrKSB7Cisg
ICAgICAgIFRyaWFuZ2xlKiB0cmkgPSBnZXRUcmlhbmdsZShpKTsKKyAgICAgICAgaWYgKHRyaS0+
Y29udGFpbnModjApICYmIHRyaS0+bmV4dFZlcnRleCh2MCwgdHJ1ZSkgPT0gdjEpCisgICAgICAg
ICAgICBoYXZlRWRnZTAxID0gdHJ1ZTsKKyAgICAgICAgaWYgKHRyaS0+Y29udGFpbnModjEpICYm
IHRyaS0+bmV4dFZlcnRleCh2MSwgdHJ1ZSkgPT0gdjApCisgICAgICAgICAgICBoYXZlRWRnZTEw
ID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGhhdmVFZGdlMDEgJiYgaGF2ZUVkZ2UxMDsKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9ncHUvTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvci5oCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uTG9jYWxU
cmlhbmd1bGF0b3IuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJ
VFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICog
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZu
ZGVmIExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yX2gKKyNkZWZpbmUgTG9vcEJsaW5uTG9jYWxU
cmlhbmd1bGF0b3JfaAorCisjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgorI2luY2x1ZGUgIkZsb2F0
UG9pbnQzRC5oIgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL05v
bmNvcHlhYmxlLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gUGVyZm9ybXMgYSBsb2Nh
bGl6ZWQgdHJpYW5ndWxhdGlvbiBvZiB0aGUgdHJpYW5nbGUgbWVzaAorLy8gY29ycmVzcG9uZGlu
ZyB0byB0aGUgZm91ciBjb250cm9sIHBvaW50IHZlcnRpY2VzIG9mIGEgY3ViaWMgY3VydmUKKy8v
IHNlZ21lbnQuCitjbGFzcyBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvciA6IHB1YmxpYyBOb25j
b3B5YWJsZSB7CitwdWJsaWM6CisgICAgLy8gVGhlIHZlcnRpY2VzIHRoYXQgdGhlIHRyaWFuZ3Vs
YXRvciBvcGVyYXRlcyB1cG9uLCBjb250YWluaW5nIGJvdGgKKyAgICAvLyB0aGUgcG9zaXRpb24g
aW5mb3JtYXRpb24gYXMgd2VsbCBhcyB0aGUgY3ViaWMgdGV4dHVyZQorICAgIC8vIGNvb3JkaW5h
dGVzLgorICAgIGNsYXNzIFZlcnRleCA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CisgICAgcHVibGlj
OgorICAgICAgICBWZXJ0ZXgoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBjb25z
dCBGbG9hdFBvaW50JiB4eUNvb3JkaW5hdGVzKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAg
ICAgcmV0dXJuIG1feHlDb29yZGluYXRlczsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IEZs
b2F0UG9pbnQzRCYga2xtQ29vcmRpbmF0ZXMoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAg
ICByZXR1cm4gbV9rbG1Db29yZGluYXRlczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHMg
dGhlIHBvc2l0aW9uIGFuZCB0ZXh0dXJlIGNvb3JkaW5hdGVzIG9mIHRoZSB2ZXJ0ZXguCisgICAg
ICAgIHZvaWQgc2V0KGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICAgICAgIGZsb2F0IGss
IGZsb2F0IGwsIGZsb2F0IG0pCisgICAgICAgIHsKKyAgICAgICAgICAgIG1feHlDb29yZGluYXRl
cy5zZXQoeCwgeSk7CisgICAgICAgICAgICBtX2tsbUNvb3JkaW5hdGVzLnNldChrLCBsLCBtKTsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIEZsYWdzIGZvciB3YWxraW5nIGZyb20gdGhlIHN0YXJ0
IHZlcnRleCB0byB0aGUgZW5kIHZlcnRleC4KKyAgICAgICAgYm9vbCBlbmQoKQorICAgICAgICB7
CisgICAgICAgICAgICByZXR1cm4gbV9lbmQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNl
dEVuZChib29sIGVuZCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9lbmQgPSBlbmQ7CisgICAg
ICAgIH0KKworICAgICAgICBib29sIG1hcmtlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJl
dHVybiBtX21hcmtlZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0TWFya2VkKGJvb2wg
bWFya2VkKQorICAgICAgICB7CisgICAgICAgICAgICBtX21hcmtlZCA9IG1hcmtlZDsKKyAgICAg
ICAgfQorCisgICAgICAgIGJvb2wgaW50ZXJpb3IoKQorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gbV9pbnRlcmlvcjsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0SW50ZXJpb3Io
Ym9vbCBpbnRlcmlvcikKKyAgICAgICAgeworICAgICAgICAgICAgbV9pbnRlcmlvciA9IGludGVy
aW9yOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZXNldEZsYWdzKCkKKyAgICAgICAgewor
ICAgICAgICAgICAgbV9lbmQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1fbWFya2VkID0gZmFsc2U7
CisgICAgICAgICAgICBtX2ludGVyaW9yID0gZmFsc2U7CisgICAgICAgIH0KKworICAgIHByaXZh
dGU6CisgICAgICAgIC8vIDJEIGNvb3JkaW5hdGVzIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIHBsYW5l
LgorICAgICAgICBGbG9hdFBvaW50IG1feHlDb29yZGluYXRlczsKKyAgICAgICAgLy8gQ3ViaWMg
dGV4dHVyZSBjb29yZGluYXRlcyBmb3IgcmVuZGVyaW5nIHRoZSBjdXJ2ZS4KKyAgICAgICAgRmxv
YXRQb2ludDNEIG1fa2xtQ29vcmRpbmF0ZXM7CisKKyAgICAgICAgLy8gRmxhZ3MgZm9yIHdhbGtp
bmcgZnJvbSB0aGUgc3RhcnQgdmVydGV4IHRvIHRoZSBlbmQgdmVydGV4LgorICAgICAgICBib29s
IG1fZW5kOworICAgICAgICBib29sIG1fbWFya2VkOworICAgICAgICBib29sIG1faW50ZXJpb3I7
CisgICAgfTsKKworICAgIC8vIFRoZSB0cmlhbmdsZXMgdGhlIFRyaWFuZ3VsYXRvciBwcm9kdWNl
cy4KKyAgICBjbGFzcyBUcmlhbmdsZSB7CisgICAgcHVibGljOgorICAgICAgICBUcmlhbmdsZSgp
CisgICAgICAgIHsKKyAgICAgICAgICAgIG1fdmVydGljZXNbMF0gPSAwOworICAgICAgICAgICAg
bV92ZXJ0aWNlc1sxXSA9IDA7CisgICAgICAgICAgICBtX3ZlcnRpY2VzWzJdID0gMDsKKyAgICAg
ICAgfQorCisgICAgICAgIC8vIEdldHMgdGhlIHZlcnRleCBhdCB0aGUgZ2l2ZW4gaW5kZXgsIDAg
PD0gaW5kZXggPCAzLgorICAgICAgICBWZXJ0ZXgqIGdldFZlcnRleChpbnQgaW5kZXgpCisgICAg
ICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgMyk7CisgICAg
ICAgICAgICByZXR1cm4gbV92ZXJ0aWNlc1tpbmRleF07CisgICAgICAgIH0KKworICAgICAgICAv
LyBSZXR1cm5zIHRydWUgaWYgdGhpcyB0cmlhbmdsZSBjb250YWlucyB0aGUgZ2l2ZW4gdmVydGV4
IChieQorICAgICAgICAvLyBpZGVudGl0eSwgbm90IGdlb21ldHJpY2FsbHkpLgorICAgICAgICBi
b29sIGNvbnRhaW5zKFZlcnRleCogdik7CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgdmVydGV4
IGZvbGxvd2luZyB0aGUgY3VycmVudCBvbmUgaW4gdGhlIHNwZWNpZmllZAorICAgICAgICAvLyBk
aXJlY3Rpb24sIGNvdW50ZXJjbG9ja3dpc2Ugb3IgY2xvY2t3aXNlLgorICAgICAgICBWZXJ0ZXgq
IG5leHRWZXJ0ZXgoVmVydGV4KiBjdXIsIGJvb2wgY2N3KTsKKworICAgICAgICAvLyBTZXRzIHRo
ZSB2ZXJ0aWNlcyBvZiB0aGlzIHRyaWFuZ2xlLCBwb3RlbnRpYWxseSByZW9yZGVyaW5nIHRoZW0K
KyAgICAgICAgLy8gdG8gcHJvZHVjZSBhIGNhbm9uaWNhbCBvcmllbnRhdGlvbi4KKyAgICAgICAg
dm9pZCBzZXRWZXJ0aWNlcyhWZXJ0ZXgqIHYwLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZl
cnRleCogdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGV4KiB2MikKKyAgICAgICAg
eworICAgICAgICAgICAgbV92ZXJ0aWNlc1swXSA9IHYwOworICAgICAgICAgICAgbV92ZXJ0aWNl
c1sxXSA9IHYxOworICAgICAgICAgICAgbV92ZXJ0aWNlc1syXSA9IHYyOworICAgICAgICAgICAg
bWFrZUNDVygpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBSZXR1cm5z
IHRoZSBpbmRleCBbMC4uMl0gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB2ZXJ0ZXgsIG9yCisg
ICAgICAgIC8vIC0xIGlmIG5vdCBmb3VuZC4KKyAgICAgICAgaW50IGluZGV4Rm9yVmVydGV4KFZl
cnRleCogdmVydGV4KTsKKworICAgICAgICAvLyBSZW9yZGVycyB0aGUgdmVydGljZXMgaW4gdGhp
cyB0cmlhbmdsZSB0byBtYWtlIHRoZW0KKyAgICAgICAgLy8gY291bnRlcmNsb2Nrd2lzZSB3aGVu
IHZpZXdlZCBpbiB0aGUgMkQgcGxhbmUsIGluIG9yZGVyIHRvCisgICAgICAgIC8vIGFjaGlldmUg
YSBjYW5vbmljYWwgb3JkZXJpbmcuCisgICAgICAgIHZvaWQgbWFrZUNDVygpOworCisgICAgICAg
IFZlcnRleCogbV92ZXJ0aWNlc1szXTsKKyAgICB9OworCisgICAgTG9vcEJsaW5uTG9jYWxUcmlh
bmd1bGF0b3IoKTsKKworICAgIC8vIFJlc2V0cyB0aGUgdHJpYW5ndWxhdG9yJ3Mgc3RhdGUuIEFm
dGVyIGVhY2ggdHJpYW5ndWxhdGlvbiBhbmQKKyAgICAvLyBiZWZvcmUgdGhlIG5leHQsIGNhbGwg
dGhpcyB0byByZS1pbml0aWFsaXplIHRoZSBpbnRlcm5hbAorICAgIC8vIHZlcnRpY2VzJyBzdGF0
ZS4KKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBSZXR1cm5zIGEgbXV0YWJsZSB2ZXJ0ZXgg
c3RvcmVkIGluIHRoZSB0cmlhbmd1bGF0b3IuIFVzZSB0aGlzIHRvCisgICAgLy8gc2V0IHVwIHRo
ZSB2ZXJ0aWNlcyBiZWZvcmUgYSB0cmlhbmd1bGF0aW9uLgorICAgIFZlcnRleCogZ2V0VmVydGV4
KGludCBpbmRleCkKKyAgICB7CisgICAgICAgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwg
NCk7CisgICAgICAgIHJldHVybiAmbV92ZXJ0aWNlc1tpbmRleF07CisgICAgfQorCisgICAgLy8g
T25jZSB0aGUgdmVydGljZXMnIGNvbnRlbnRzIGhhdmUgYmVlbiBzZXQgdXAsIGNhbGwgdHJpYW5n
dWxhdGUoKQorICAgIC8vIHRvIHJlY29tcHV0ZSB0aGUgdHJpYW5nbGVzLgorICAgIC8vCisgICAg
Ly8gSWYgY29tcHV0ZUluc2lkZUVkZ2VzIGlzIHRydWUsIHRoZW4gZmlsbFJpZ2h0U2lkZSB3aWxs
IGJlCisgICAgLy8gdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggc2lkZSBvZiB0aGUgY3ViaWMgY3Vy
dmUgZGVmaW5lZCBieSB0aGUKKyAgICAvLyBmb3VyIGNvbnRyb2wgcG9pbnRzIGlzIHRvIGJlIGZp
bGxlZC4KKyAgICAvLworICAgIC8vIFRoZSB0cmlhbmd1bGF0aW9uIG9iZXlzIHRoZSBmb2xsb3dp
bmcgZ3VhcmFudGVlczoKKyAgICAvLyAgIC0gSWYgdGhlIGNvbnZleCBodWxsIGlzIGEgcXVhZHJp
bGF0ZXJhbCwgdGhlbiB0aGUgc2hvcnRlc3QgZWRnZQorICAgIC8vICAgICB3aWxsIGJlIGNob3Nl
biBmb3IgdGhlIGN1dCBpbnRvIHR3byB0cmlhbmdsZXMuCisgICAgLy8gICAtIElmIG9uZSBvZiB0
aGUgdmVydGljZXMgaXMgY29udGFpbmVkIGluIHRoZSB0cmlhbmdsZSBzcGFubmVkCisgICAgLy8g
ICAgIGJ5IHRoZSBvdGhlciB0aHJlZSwgdGhyZWUgdHJpYW5nbGVzIHdpbGwgYmUgcHJvZHVjZWQu
CisgICAgdm9pZCB0cmlhbmd1bGF0ZShib29sIGNvbXB1dGVJbnNpZGVFZGdlcywKKyAgICAgICAg
ICAgICAgICAgICAgIGJvb2wgZmlsbFJpZ2h0U2lkZSk7CisKKyAgICAvLyBOdW1iZXIgb2YgdHJp
YW5nbGVzIGNvbXB1dGVkIGJ5IHRyaWFuZ3VsYXRlKCkuCisgICAgaW50IG51bVRyaWFuZ2xlcygp
IGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9udW1UcmlhbmdsZXM7CisgICAgfQorCisg
ICAgLy8gUmV0dXJucyB0aGUgY29tcHV0ZWQgdHJpYW5nbGUgYXQgaW5kZXgsIDAgPD0gaW5kZXgg
PAorICAgIC8vIG51bV90cmlhbmdsZXMoKS4KKyAgICBUcmlhbmdsZSogZ2V0VHJpYW5nbGUoaW50
IGluZGV4KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGluZGV4ID49IDAgJiYgaW5kZXggPCBtX251
bVRyaWFuZ2xlcyk7CisgICAgICAgIHJldHVybiAmbV90cmlhbmdsZXNbaW5kZXhdOworICAgIH0K
KworICAgIC8vIE51bWJlciBvZiB2ZXJ0aWNlcyBmYWNpbmcgdGhlIGluc2lkZSBvZiB0aGUgc2hh
cGUsIGlmCisgICAgLy8gY29tcHV0ZV9pbnNpZGVfZWRnZXMgd2FzIHRydWUgd2hlbiB0cmlhbmd1
bGF0ZSgpIHdhcyBjYWxsZWQuCisgICAgaW50IG51bUludGVyaW9yVmVydGljZXMoKSBjb25zdAor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbnVtSW50ZXJpb3JWZXJ0aWNlczsKKyAgICB9CisKKyAg
ICAvLyBGZXRjaGVzIHRoZSBnaXZlbiBpbnRlcmlvciB2ZXJ0ZXgsIDAgPD0gaW5kZXggPAorICAg
IC8vIG51bUludGVyaW9yVmVydGljZXMoKS4KKyAgICBWZXJ0ZXgqIGdldEludGVyaW9yVmVydGV4
KGludCBpbmRleCkKKyAgICB7CisgICAgICAgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwg
bV9udW1JbnRlcmlvclZlcnRpY2VzKTsKKyAgICAgICAgcmV0dXJuIG1faW50ZXJpb3JWZXJ0aWNl
c1tpbmRleF07CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIEFkZHMgYSB0cmlhbmdsZSB0byB0
aGUgdHJpYW5ndWxhdGlvbi4KKyAgICB2b2lkIGFkZFRyaWFuZ2xlKFZlcnRleCogdjAsIFZlcnRl
eCogdjEsIFZlcnRleCogdjIpOworCisgICAgLy8gQWRkcyBhIHZlcnRleCB0byB0aGUgbGlzdCBv
ZiBpbnRlcmlvciB2ZXJ0aWNlcy4KKyAgICB2b2lkIGFkZEludGVyaW9yVmVydGV4KFZlcnRleCog
dik7CisKKyAgICAvLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZWRnZSBiZXR3ZWVuIHZlcnRleCB2
MCBhbmQgdjEgaXMgc2hhcmVkCisgICAgLy8gYmV0d2VlbiB0d28gb3IgbW9yZSB0cmlhbmdsZXMu
CisgICAgYm9vbCBpc1NoYXJlZEVkZ2UoVmVydGV4KiB2MCwgVmVydGV4KiB2MSk7CisKKyAgICAv
LyBUaGUgdmVydGljZXMgYmVpbmcgdHJpYW5ndWxhdGVkLgorICAgIFZlcnRleCBtX3ZlcnRpY2Vz
WzRdOworCisgICAgLy8gVGhlIHZlcnRpY2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVkZ2VzIGZh
Y2luZyB0aGUgaW5zaWRlIG9mIHRoZQorICAgIC8vIHNoYXBlLCBpbiBvcmRlciBmcm9tIHRoZSBz
dGFydCB2ZXJ0ZXggdG8gdGhlIGVuZCB2ZXJ0ZXguIFRoZSBtb3JlCisgICAgLy8gZ2VuZXJhbCB0
cmlhbmd1bGF0aW9uIGFsZ29yaXRobSB0ZXNzZWxsYXRlcyB0aGlzIGludGVyaW9yIHJlZ2lvbi4K
KyAgICBWZXJ0ZXgqIG1faW50ZXJpb3JWZXJ0aWNlc1s0XTsKKyAgICAvLyBUaGUgbnVtYmVyIG9m
IGludGVyaW9yIHZlcnRpY2VzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGUgY3VycmVudAorICAgIC8v
IHRyaWFuZ3VsYXRpb24uCisgICAgaW50IG1fbnVtSW50ZXJpb3JWZXJ0aWNlczsKKworICAgIC8v
IFRoZXJlIGNhbiBiZSBhdCBtb3N0IHRocmVlIHRyaWFuZ2xlcyBjb21wdXRlZCBieSB0aGlzIGxv
Y2FsCisgICAgLy8gYWxnb3JpdGhtLCB3aGljaCBvY2N1cnMgd2hlbiBvbmUgb2YgdGhlIHZlcnRp
Y2VzIGlzIGNvbnRhaW5lZCBpbgorICAgIC8vIHRoZSB0cmlhbmdsZSBzcGFubmVkIGJ5IHRoZSBv
dGhlciB0aHJlZS4gTW9zdCBvZiB0aGUgdGltZSB0aGUKKyAgICAvLyBhbGdvcml0aG0gY29tcHV0
ZXMgdHdvIHRyaWFuZ2xlcy4KKyAgICBUcmlhbmdsZSBtX3RyaWFuZ2xlc1szXTsKKyAgICBpbnQg
bV9udW1UcmlhbmdsZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAv
LyBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcl9oCg==
</data>
<flag name="review"
          id="55665"
          type_id="1"
          status="-"
          setter="jamesr"
    />
    <flag name="commit-queue"
          id="55666"
          type_id="3"
          status="-"
          setter="kbr"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67083</attachid>
            <date>2010-09-09 13:02:45 -0700</date>
            <delta_ts>2010-09-09 21:48:00 -0700</delta_ts>
            <desc>Revised patch</desc>
            <filename>local-triangulator.patch</filename>
            <type>text/plain</type>
            <size>23852</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzEwNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDkgQEAKKzIwMTAtMDktMDkgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFk
ZCBsb2NhbCB0cmlhbmd1bGF0aW9uIG9mIGN1YmljIGN1cnZlIGNvbnRyb2wgcG9pbnRzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NTI1MgorCisgICAg
ICAgIEFkZGluZyBhIGxvY2FsaXplZCB0cmlhbmd1bGF0aW9uIGFsZ29yaXRobSB3aGljaCB0YWtl
cyBhcyBpbnB1dAorICAgICAgICB0aGUgZm91ciBjb250cm9sIHBvaW50cyBvZiBhIGN1YmljIGN1
cnZlIHNlZ21lbnQgYW5kIHByb3ZpZGVzIGJvdGgKKyAgICAgICAgdHJpYW5nbGVzIGFzIHdlbGwg
YXMgdGhlIGFiaWxpdHkgdG8gd2FsayB0aGUgaW50ZXJpb3IgZWRnZXMuIFRoZQorICAgICAgICBs
YXR0ZXIgd2lsbCBiZSB1c2VkIGxhdGVyIHRvIGZpbGwgdGhlIGludGVyaW9yIG9mIHNoYXBlcyBi
b3VuZGVkCisgICAgICAgIGJ5IHRoZXNlIGN1YmljIGN1cnZlcywgcXVhZHJhdGljIGN1cnZlcyBh
bmQgbGluZSBzZWdtZW50cy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29w
Qmxpbm5Mb2NhbFRyaWFuZ3VsYXRvci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TG9v
cEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xlOjpjb250YWlucyk6CisgICAgICAgIChX
ZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VHJpYW5nbGU6Om5leHRWZXJ0ZXgp
OgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xl
OjppbmRleEZvclZlcnRleCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFu
Z3VsYXRvcjo6VHJpYW5nbGU6Om1ha2VDb3VudGVyQ2xvY2t3aXNlKToKKyAgICAgICAgKFdlYkNv
cmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRv
cik6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6cmVzZXQp
OgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OnRyaWFuZ3Vs
YXRlKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjp0cmlh
bmd1bGF0ZUhlbHBlcik6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3Vs
YXRvcjo6YWRkVHJpYW5nbGUpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlh
bmd1bGF0b3I6OmFkZEludGVyaW9yVmVydGV4KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlu
bkxvY2FsVHJpYW5ndWxhdG9yOjppc1NoYXJlZEVkZ2UpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2dwdS9Mb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvci5oOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpWZXJ0ZXg6OlZlcnRleCk6Cisg
ICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VmVydGV4Ojp4eUNv
b3JkaW5hdGVzKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9y
OjpWZXJ0ZXg6OmtsbUNvb3JkaW5hdGVzKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubkxv
Y2FsVHJpYW5ndWxhdG9yOjpWZXJ0ZXg6OnNldCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxp
bm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VmVydGV4OjplbmQpOgorICAgICAgICAoV2ViQ29yZTo6TG9v
cEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlZlcnRleDo6c2V0RW5kKToKKyAgICAgICAgKFdlYkNv
cmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpWZXJ0ZXg6Om1hcmtlZCk6CisgICAgICAg
IChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VmVydGV4OjpzZXRNYXJrZWQp
OgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlZlcnRleDo6
aW50ZXJpb3IpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6
OlZlcnRleDo6c2V0SW50ZXJpb3IpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxU
cmlhbmd1bGF0b3I6OlZlcnRleDo6cmVzZXRGbGFncyk6CisgICAgICAgIChXZWJDb3JlOjpMb29w
Qmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VHJpYW5nbGU6OlRyaWFuZ2xlKToKKyAgICAgICAgKFdl
YkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZTo6Z2V0VmVydGV4KToK
KyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZTo6
c2V0VmVydGljZXMpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0
b3I6OmdldFZlcnRleCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3Vs
YXRvcjo6bnVtVHJpYW5nbGVzKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJp
YW5ndWxhdG9yOjpnZXRUcmlhbmdsZSk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2Nh
bFRyaWFuZ3VsYXRvcjo6bnVtSW50ZXJpb3JWZXJ0aWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpM
b29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6Z2V0SW50ZXJpb3JWZXJ0ZXgpOgorCiAyMDEwLTA5
LTA5ICBDaHJpcyBSb2dlcnMgIDxjcm9nZXJzQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgQ2hyaXMgRmxlaXphY2guCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dw
dS9Mb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3IuY3BwCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uTG9jYWxU
cmlhbmd1bGF0b3IuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9y
LmgiCisKKyNpbmNsdWRlICJMb29wQmxpbm5NYXRoVXRpbHMuaCIKKyNpbmNsdWRlIDxhbGdvcml0
aG0+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgTG9vcEJsaW5uTWF0aFV0aWxzOjph
cHByb3hFcXVhbDsKK3VzaW5nIExvb3BCbGlubk1hdGhVdGlsczo6bGluZXNJbnRlcnNlY3Q7Cit1
c2luZyBMb29wQmxpbm5NYXRoVXRpbHM6OnBvaW50SW5UcmlhbmdsZTsKKworYm9vbCBMb29wQmxp
bm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VHJpYW5nbGU6OmNvbnRhaW5zKExvb3BCbGlubkxvY2FsVHJp
YW5ndWxhdG9yOjpWZXJ0ZXgqIHYpCit7CisgICAgcmV0dXJuIGluZGV4Rm9yVmVydGV4KHYpID49
IDA7Cit9CisKK0xvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpWZXJ0ZXgqIExvb3BCbGlubkxv
Y2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZTo6bmV4dFZlcnRleChMb29wQmxpbm5Mb2NhbFRyaWFu
Z3VsYXRvcjo6VmVydGV4KiBjdXJyZW50LCBib29sIHRyYXZlcnNlQ291bnRlckNsb2Nrd2lzZSkK
K3sKKyAgICBpbnQgaW5kZXggPSBpbmRleEZvclZlcnRleChjdXJyZW50KTsKKyAgICBBU1NFUlQo
aW5kZXggPj0gMCk7CisgICAgaWYgKHRyYXZlcnNlQ291bnRlckNsb2Nrd2lzZSkKKyAgICAgICAg
KytpbmRleDsKKyAgICBlbHNlCisgICAgICAgIC0taW5kZXg7CisgICAgaWYgKGluZGV4IDwgMCkK
KyAgICAgICAgaW5kZXggKz0gMzsKKyAgICBlbHNlCisgICAgICAgIGluZGV4ID0gaW5kZXggJSAz
OworICAgIHJldHVybiBtX3ZlcnRpY2VzW2luZGV4XTsKK30KKworaW50IExvb3BCbGlubkxvY2Fs
VHJpYW5ndWxhdG9yOjpUcmlhbmdsZTo6aW5kZXhGb3JWZXJ0ZXgoTG9vcEJsaW5uTG9jYWxUcmlh
bmd1bGF0b3I6OlZlcnRleCogdmVydGV4KQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsg
KytpKQorICAgICAgICBpZiAobV92ZXJ0aWNlc1tpXSA9PSB2ZXJ0ZXgpCisgICAgICAgICAgICBy
ZXR1cm4gaTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgTG9vcEJsaW5uTG9jYWxUcmlhbmd1
bGF0b3I6OlRyaWFuZ2xlOjptYWtlQ291bnRlckNsb2Nrd2lzZSgpCit7CisgICAgLy8gUG9zc2li
bHkgc3dhcHMgdHdvIHZlcnRpY2VzIHNvIHRoYXQgdGhlIHRyaWFuZ2xlJ3MgdmVydGljZXMgYXJl
CisgICAgLy8gYWx3YXlzIHNwZWNpZmllZCBpbiBjb3VudGVyY2xvY2t3aXNlIG9yZGVyLiBUaGlz
IG9yZGVycyB0aGUKKyAgICAvLyB2ZXJ0aWNlcyBjYW5vbmljYWxseSB3aGVuIHdhbGtpbmcgdGhl
IGludGVyaW9yIGVkZ2VzIGZyb20gdGhlCisgICAgLy8gc3RhcnQgdG8gdGhlIGVuZCB2ZXJ0ZXgu
CisgICAgRmxvYXRQb2ludDNEIHBvaW50MChtX3ZlcnRpY2VzWzBdLT54eUNvb3JkaW5hdGVzKCkp
OworICAgIEZsb2F0UG9pbnQzRCBwb2ludDEobV92ZXJ0aWNlc1sxXS0+eHlDb29yZGluYXRlcygp
KTsKKyAgICBGbG9hdFBvaW50M0QgcG9pbnQyKG1fdmVydGljZXNbMl0tPnh5Q29vcmRpbmF0ZXMo
KSk7CisgICAgRmxvYXRQb2ludDNEIGNyb3NzUHJvZHVjdCA9IChwb2ludDEgLSBwb2ludDApLmNy
b3NzKHBvaW50MiAtIHBvaW50MCk7CisgICAgaWYgKGNyb3NzUHJvZHVjdC56KCkgPCAwKQorICAg
ICAgICBzdGQ6OnN3YXAobV92ZXJ0aWNlc1sxXSwgbV92ZXJ0aWNlc1syXSk7Cit9CisKK0xvb3BC
bGlubkxvY2FsVHJpYW5ndWxhdG9yOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcigpCit7Cisg
ICAgcmVzZXQoKTsKK30KKwordm9pZCBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6cmVzZXQo
KQoreworICAgIG1fbnVtVHJpYW5nbGVzID0gMDsKKyAgICBtX251bUludGVyaW9yVmVydGljZXMg
PSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIG1faW50ZXJp
b3JWZXJ0aWNlc1tpXSA9IDA7CisgICAgICAgIG1fdmVydGljZXNbaV0ucmVzZXRGbGFncygpOwor
ICAgIH0KK30KKwordm9pZCBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6dHJpYW5ndWxhdGUo
SW5zaWRlRWRnZUNvbXB1dGF0aW9uIGNvbXB1dGVJbnNpZGVFZGdlcywgTG9vcEJsaW5uQ29uc3Rh
bnRzOjpGaWxsU2lkZSBzaWRlVG9GaWxsKQoreworICAgIHRyaWFuZ3VsYXRlSGVscGVyKHNpZGVU
b0ZpbGwpOworCisgICAgaWYgKGNvbXB1dGVJbnNpZGVFZGdlcyA9PSBDb21wdXRlSW5zaWRlRWRn
ZXMpIHsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBjb21wdXRlIHdoaWNoIHZlcnRpY2VzIGRlc2Ny
aWJlIHRoZSBwYXRoIGFsb25nIHRoZQorICAgICAgICAvLyBpbnRlcmlvciBwb3J0aW9uIG9mIHRo
ZSBzaGFwZSwgdG8gZmVlZCB0aGVzZSB2ZXJ0aWNlcyB0byB0aGUKKyAgICAgICAgLy8gbW9yZSBn
ZW5lcmFsIHRlc3NlbGxhdGlvbiBhbGdvcml0aG0uIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UKKyAg
ICAgICAgLy8gY291bGQgZGV0ZXJtaW5lIHRoaXMgZGlyZWN0bHkgd2hpbGUgcHJvZHVjaW5nIHRy
aWFuZ2xlcyBhYm92ZS4KKyAgICAgICAgLy8gSGVyZSB3ZSB0cnkgdG8gZG8gaXQgZ2VuZXJhbGx5
IGp1c3QgYnkgZXhhbWluaW5nIHRoZSB0cmlhbmdsZXMKKyAgICAgICAgLy8gdGhhdCBoYXZlIGFs
cmVhZHkgYmVlbiBwcm9kdWNlZC4gV2Ugd2FsayBhcm91bmQgdGhlbSBpbiBhCisgICAgICAgIC8v
IHNwZWNpZmljIGRpcmVjdGlvbiBkZXRlcm1pbmVkIGJ5IHdoaWNoIHNpZGUgb2YgdGhlIGN1cnZl
IGlzCisgICAgICAgIC8vIGJlaW5nIGZpbGxlZC4gV2UgaWdub3JlIHRoZSBpbnRlcmlvciB2ZXJ0
ZXggdW5sZXNzIGl0IGlzIGFsc28KKyAgICAgICAgLy8gdGhlIGVuZGluZyB2ZXJ0ZXgsIGFuZCBz
a2lwIHRoZSBlZGdlcyBzaGFyZWQgYmV0d2VlbiB0d28KKyAgICAgICAgLy8gdHJpYW5nbGVzLgor
ICAgICAgICBWZXJ0ZXgqIHYgPSAmbV92ZXJ0aWNlc1swXTsKKyAgICAgICAgYWRkSW50ZXJpb3JW
ZXJ0ZXgodik7CisgICAgICAgIGludCBudW1TdGVwcyA9IDA7CisgICAgICAgIHdoaWxlICghdi0+
ZW5kKCkgJiYgbnVtU3RlcHMgPCA0KSB7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IHZl
cnRleCBhY2NvcmRpbmcgdG8gdGhlIGFib3ZlIHJ1bGVzCisgICAgICAgICAgICBib29sIGdvdE5l
eHQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVHJpYW5nbGVz
KCkgJiYgIWdvdE5leHQ7ICsraSkgeworICAgICAgICAgICAgICAgIFRyaWFuZ2xlKiB0cmkgPSBn
ZXRUcmlhbmdsZShpKTsKKyAgICAgICAgICAgICAgICBpZiAodHJpLT5jb250YWlucyh2KSkgewor
ICAgICAgICAgICAgICAgICAgICBWZXJ0ZXgqIG5leHQgPSB0cmktPm5leHRWZXJ0ZXgodiwgc2lk
ZVRvRmlsbCA9PSBMb29wQmxpbm5Db25zdGFudHM6OlJpZ2h0U2lkZSk7CisgICAgICAgICAgICAg
ICAgICAgIGlmICghbmV4dC0+bWFya2VkKCkgJiYgIWlzU2hhcmVkRWRnZSh2LCBuZXh0KSAmJiAo
IW5leHQtPmludGVyaW9yKCkgfHwgbmV4dC0+ZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBhZGRJbnRlcmlvclZlcnRleChuZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYg
PSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIGZvciBsb29w
CisgICAgICAgICAgICAgICAgICAgICAgICBnb3ROZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsr
bnVtU3RlcHM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF2LT5lbmQoKSkgeworICAgICAgICAg
ICAgLy8gU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgYWJvdmUgYWxnb3JpdGhtOyBhZGQg
dGhlIGxhc3QKKyAgICAgICAgICAgIC8vIHZlcnRleCB0byB0aGUgaW50ZXJpb3IgdmVydGljZXMg
YW55d2F5LiAoRklYTUU6IHNob3VsZCB3ZQorICAgICAgICAgICAgLy8gYWRkIGFuIGFzc2VydCBo
ZXJlIGFuZCBkbyBtb3JlIGV4dGVuc2l2ZSB0ZXN0aW5nPykKKyAgICAgICAgICAgIGFkZEludGVy
aW9yVmVydGV4KCZtX3ZlcnRpY2VzWzNdKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBM
b29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6dHJpYW5ndWxhdGVIZWxwZXIoTG9vcEJsaW5uQ29u
c3RhbnRzOjpGaWxsU2lkZSBzaWRlVG9GaWxsKQoreworICAgIHJlc2V0KCk7CisKKyAgICBtX3Zl
cnRpY2VzWzNdLnNldEVuZCh0cnVlKTsKKworICAgIC8vIEZpcnN0IHRlc3QgZm9yIGRlZ2VuZXJh
dGUgY2FzZXMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgZm9y
IChpbnQgaiA9IGkgKyAxOyBqIDwgNDsgKytqKSB7CisgICAgICAgICAgICBpZiAoYXBwcm94RXF1
YWwobV92ZXJ0aWNlc1tpXS54eUNvb3JkaW5hdGVzKCksIG1fdmVydGljZXNbal0ueHlDb29yZGlu
YXRlcygpKSkgeworICAgICAgICAgICAgICAgIC8vIFR3byBvZiB0aGUgdmVydGljZXMgYXJlIGNv
aW5jaWRlbnQsIHNvIHdlIGNhbiBlbGltaW5hdGUgYXQKKyAgICAgICAgICAgICAgICAvLyBsZWFz
dCBvbmUgdHJpYW5nbGUuIFdlIG1pZ2h0IGJlIGFibGUgdG8gZWxpbWluYXRlIHRoZSBvdGhlcgor
ICAgICAgICAgICAgICAgIC8vIGFzIHdlbGwsIGJ1dCB0aGlzIHNlZW1zIHN1ZmZpY2llbnQgdG8g
YXZvaWQgZGVnZW5lcmF0ZQorICAgICAgICAgICAgICAgIC8vIHRyaWFuZ3VsYXRpb25zLgorICAg
ICAgICAgICAgICAgIGludCBpbmRpY2VzWzNdID0geyAwIH07CisgICAgICAgICAgICAgICAgaW50
IGluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7ICsraykK
KyAgICAgICAgICAgICAgICAgICAgaWYgKGsgIT0gaikKKyAgICAgICAgICAgICAgICAgICAgICAg
IGluZGljZXNbaW5kZXgrK10gPSBrOworICAgICAgICAgICAgICAgIGFkZFRyaWFuZ2xlKCZtX3Zl
cnRpY2VzW2luZGljZXNbMF1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3ZlcnRp
Y2VzW2luZGljZXNbMV1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3ZlcnRpY2Vz
W2luZGljZXNbMl1dKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZWUgd2hldGhlciBhbnkgb2YgdGhlIHBvaW50cyBh
cmUgZnVsbHkgY29udGFpbmVkIGluIHRoZQorICAgIC8vIHRyaWFuZ2xlIGRlZmluZWQgYnkgdGhl
IG90aGVyIHRocmVlLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAg
IGludCBpbmRpY2VzWzNdID0geyAwIH07CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAg
IGZvciAoaW50IGogPSAwOyBqIDwgNDsgKytqKQorICAgICAgICAgICAgaWYgKGkgIT0gaikKKyAg
ICAgICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0gajsKKyAgICAgICAgaWYgKHBvaW50SW5U
cmlhbmdsZShtX3ZlcnRpY2VzW2ldLnh5Q29vcmRpbmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtX3ZlcnRpY2VzW2luZGljZXNbMF1dLnh5Q29vcmRpbmF0ZXMoKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtX3ZlcnRpY2VzW2luZGljZXNbMV1dLnh5Q29vcmRpbmF0
ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZlcnRpY2VzW2luZGljZXNbMl1d
Lnh5Q29vcmRpbmF0ZXMoKSkpIHsKKyAgICAgICAgICAgIC8vIFByb2R1Y2UgdGhyZWUgdHJpYW5n
bGVzIHN1cnJvdW5kaW5nIHRoaXMgaW50ZXJpb3IgdmVydGV4LgorICAgICAgICAgICAgZm9yIChp
bnQgaiA9IDA7IGogPCAzOyArK2opCisgICAgICAgICAgICAgICAgYWRkVHJpYW5nbGUoJm1fdmVy
dGljZXNbaW5kaWNlc1tqICUgM11dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3Zl
cnRpY2VzW2luZGljZXNbKGogKyAxKSAlIDNdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAmbV92ZXJ0aWNlc1tpXSk7CisgICAgICAgICAgICAvLyBNYXJrIHRoZSBpbnRlcmlvciB2ZXJ0
ZXggc28gd2UgaWdub3JlIGl0IGlmIHRyeWluZyB0byB0cmFjZQorICAgICAgICAgICAgLy8gdGhl
IGludGVyaW9yIGVkZ2UuCisgICAgICAgICAgICBtX3ZlcnRpY2VzW2ldLnNldEludGVyaW9yKHRy
dWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhl
cmUgYXJlIG9ubHkgYSBmZXcgcGVybXV0YXRpb25zIG9mIHRoZSB2ZXJ0aWNlcywgaWdub3JpbmcK
KyAgICAvLyByb3RhdGlvbnMsIHdoaWNoIGFyZSBpcnJlbGV2YW50OgorICAgIC8vCisgICAgLy8g
IDAtLTMgIDAtLTIgIDAtLTMgIDAtLTEgIDAtLTIgIDAtLTEKKyAgICAvLyAgfCAgfCAgfCAgfCAg
fCAgfCAgfCAgfCAgfCAgfCAgfCAgfAorICAgIC8vICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8
ICB8ICB8ICB8CisgICAgLy8gIDEtLTIgIDEtLTMgIDItLTEgIDItLTMgIDMtLTEgIDMtLTIKKyAg
ICAvLworICAgIC8vIE5vdGUgdGhhdCB0aHJlZSBvZiB0aGVzZSBhcmUgcmVmbGVjdGlvbnMgb2Yg
ZWFjaCBvdGhlci4KKyAgICAvLyBUaGVyZWZvcmUgdGhlcmUgYXJlIG9ubHkgdGhyZWUgcG9zc2li
bGUgdHJpYW5ndWxhdGlvbnM6CisgICAgLy8KKyAgICAvLyAgMC0tMyAgMC0tMiAgMC0tMworICAg
IC8vICB8XCB8ICB8XCB8ICB8XCB8CisgICAgLy8gIHwgXHwgIHwgXHwgIHwgXHwKKyAgICAvLyAg
MS0tMiAgMS0tMyAgMi0tMQorICAgIC8vCisgICAgLy8gRnJvbSB3aGljaCB3ZSBjYW4gY2hvb3Nl
IGJ5IHNlZWluZyB3aGljaCBvZiB0aGUgcG90ZW50aWFsCisgICAgLy8gZGlhZ29uYWxzIGludGVy
c2VjdC4gTm90ZSB0aGF0IHdlIGNob29zZSB0aGUgc2hvcnRlc3QgZGlhZ29uYWwKKyAgICAvLyB0
byBzcGxpdCB0aGUgcXVhZC4KKyAgICBpZiAobGluZXNJbnRlcnNlY3QobV92ZXJ0aWNlc1swXS54
eUNvb3JkaW5hdGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgIG1fdmVydGljZXNbMl0ueHlD
b29yZGluYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICBtX3ZlcnRpY2VzWzFdLnh5Q29v
cmRpbmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbV92ZXJ0aWNlc1szXS54eUNvb3Jk
aW5hdGVzKCkpKSB7CisgICAgICAgIGlmICgobV92ZXJ0aWNlc1syXS54eUNvb3JkaW5hdGVzKCkg
LSBtX3ZlcnRpY2VzWzBdLnh5Q29vcmRpbmF0ZXMoKSkuZGlhZ29uYWxMZW5ndGhTcXVhcmVkKCkg
PAorICAgICAgICAgICAgKG1fdmVydGljZXNbM10ueHlDb29yZGluYXRlcygpIC0gbV92ZXJ0aWNl
c1sxXS54eUNvb3JkaW5hdGVzKCkpLmRpYWdvbmFsTGVuZ3RoU3F1YXJlZCgpKSB7CisgICAgICAg
ICAgICBhZGRUcmlhbmdsZSgmbV92ZXJ0aWNlc1swXSwgJm1fdmVydGljZXNbMV0sICZtX3ZlcnRp
Y2VzWzJdKTsKKyAgICAgICAgICAgIGFkZFRyaWFuZ2xlKCZtX3ZlcnRpY2VzWzBdLCAmbV92ZXJ0
aWNlc1syXSwgJm1fdmVydGljZXNbM10pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
YWRkVHJpYW5nbGUoJm1fdmVydGljZXNbMF0sICZtX3ZlcnRpY2VzWzFdLCAmbV92ZXJ0aWNlc1sz
XSk7CisgICAgICAgICAgICBhZGRUcmlhbmdsZSgmbV92ZXJ0aWNlc1sxXSwgJm1fdmVydGljZXNb
Ml0sICZtX3ZlcnRpY2VzWzNdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobGluZXNJbnRl
cnNlY3QobV92ZXJ0aWNlc1swXS54eUNvb3JkaW5hdGVzKCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtX3ZlcnRpY2VzWzNdLnh5Q29vcmRpbmF0ZXMoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1fdmVydGljZXNbMV0ueHlDb29yZGluYXRlcygpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbV92ZXJ0aWNlc1syXS54eUNvb3JkaW5hdGVzKCkpKSB7Cisg
ICAgICAgIGlmICgobV92ZXJ0aWNlc1szXS54eUNvb3JkaW5hdGVzKCkgLSBtX3ZlcnRpY2VzWzBd
Lnh5Q29vcmRpbmF0ZXMoKSkuZGlhZ29uYWxMZW5ndGhTcXVhcmVkKCkgPAorICAgICAgICAgICAg
KG1fdmVydGljZXNbMl0ueHlDb29yZGluYXRlcygpIC0gbV92ZXJ0aWNlc1sxXS54eUNvb3JkaW5h
dGVzKCkpLmRpYWdvbmFsTGVuZ3RoU3F1YXJlZCgpKSB7CisgICAgICAgICAgICBhZGRUcmlhbmds
ZSgmbV92ZXJ0aWNlc1swXSwgJm1fdmVydGljZXNbMV0sICZtX3ZlcnRpY2VzWzNdKTsKKyAgICAg
ICAgICAgIGFkZFRyaWFuZ2xlKCZtX3ZlcnRpY2VzWzBdLCAmbV92ZXJ0aWNlc1szXSwgJm1fdmVy
dGljZXNbMl0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkVHJpYW5nbGUoJm1f
dmVydGljZXNbMF0sICZtX3ZlcnRpY2VzWzFdLCAmbV92ZXJ0aWNlc1syXSk7CisgICAgICAgICAg
ICBhZGRUcmlhbmdsZSgmbV92ZXJ0aWNlc1syXSwgJm1fdmVydGljZXNbMV0sICZtX3ZlcnRpY2Vz
WzNdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIExpbmVzICgwLT4xKSwg
KDItPjMpIGludGVyc2VjdCAtLSBvciBzaG91bGQsIG1vZHVsbyBudW1lcmljYWwKKyAgICAgICAg
Ly8gcHJlY2lzaW9uIGlzc3VlcworICAgICAgICBpZiAoKG1fdmVydGljZXNbMV0ueHlDb29yZGlu
YXRlcygpIC0gbV92ZXJ0aWNlc1swXS54eUNvb3JkaW5hdGVzKCkpLmRpYWdvbmFsTGVuZ3RoU3F1
YXJlZCgpIDwKKyAgICAgICAgICAgIChtX3ZlcnRpY2VzWzNdLnh5Q29vcmRpbmF0ZXMoKSAtIG1f
dmVydGljZXNbMl0ueHlDb29yZGluYXRlcygpKS5kaWFnb25hbExlbmd0aFNxdWFyZWQoKSkgewor
ICAgICAgICAgICAgYWRkVHJpYW5nbGUoJm1fdmVydGljZXNbMF0sICZtX3ZlcnRpY2VzWzJdLCAm
bV92ZXJ0aWNlc1sxXSk7CisgICAgICAgICAgICBhZGRUcmlhbmdsZSgmbV92ZXJ0aWNlc1swXSwg
Jm1fdmVydGljZXNbMV0sICZtX3ZlcnRpY2VzWzNdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIGFkZFRyaWFuZ2xlKCZtX3ZlcnRpY2VzWzBdLCAmbV92ZXJ0aWNlc1syXSwgJm1fdmVy
dGljZXNbM10pOworICAgICAgICAgICAgYWRkVHJpYW5nbGUoJm1fdmVydGljZXNbM10sICZtX3Zl
cnRpY2VzWzJdLCAmbV92ZXJ0aWNlc1sxXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQg
TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OmFkZFRyaWFuZ2xlKFZlcnRleCogdjAsIFZlcnRl
eCogdjEsIFZlcnRleCogdjIpCit7CisgICAgQVNTRVJUKG1fbnVtVHJpYW5nbGVzIDwgMyk7Cisg
ICAgbV90cmlhbmdsZXNbbV9udW1UcmlhbmdsZXMrK10uc2V0VmVydGljZXModjAsIHYxLCB2Mik7
Cit9CisKK3ZvaWQgTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OmFkZEludGVyaW9yVmVydGV4
KFZlcnRleCogdikKK3sKKyAgICBBU1NFUlQobV9udW1JbnRlcmlvclZlcnRpY2VzIDwgNCk7Cisg
ICAgbV9pbnRlcmlvclZlcnRpY2VzW21fbnVtSW50ZXJpb3JWZXJ0aWNlcysrXSA9IHY7CisgICAg
di0+c2V0TWFya2VkKHRydWUpOworfQorCitib29sIExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9y
Ojppc1NoYXJlZEVkZ2UoVmVydGV4KiB2MCwgVmVydGV4KiB2MSkKK3sKKyAgICBib29sIGhhdmVF
ZGdlMDEgPSBmYWxzZTsKKyAgICBib29sIGhhdmVFZGdlMTAgPSBmYWxzZTsKKyAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IG51bVRyaWFuZ2xlcygpOyArK2kpIHsKKyAgICAgICAgVHJpYW5nbGUqIHRy
aSA9IGdldFRyaWFuZ2xlKGkpOworICAgICAgICBpZiAodHJpLT5jb250YWlucyh2MCkgJiYgdHJp
LT5uZXh0VmVydGV4KHYwLCB0cnVlKSA9PSB2MSkKKyAgICAgICAgICAgIGhhdmVFZGdlMDEgPSB0
cnVlOworICAgICAgICBpZiAodHJpLT5jb250YWlucyh2MSkgJiYgdHJpLT5uZXh0VmVydGV4KHYx
LCB0cnVlKSA9PSB2MCkKKyAgICAgICAgICAgIGhhdmVFZGdlMTAgPSB0cnVlOworICAgIH0KKyAg
ICByZXR1cm4gaGF2ZUVkZ2UwMSAmJiBoYXZlRWRnZTEwOworfQorCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5Mb2Nh
bFRyaWFuZ3VsYXRvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Z3B1L0xvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvci5oCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgTG9vcEJsaW5uTG9jYWxU
cmlhbmd1bGF0b3JfaAorI2RlZmluZSBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcl9oCisKKyNp
bmNsdWRlICJGbG9hdFBvaW50LmgiCisjaW5jbHVkZSAiRmxvYXRQb2ludDNELmgiCisjaW5jbHVk
ZSAiTG9vcEJsaW5uQ29uc3RhbnRzLmgiCisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKyNp
bmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBQ
ZXJmb3JtcyBhIGxvY2FsaXplZCB0cmlhbmd1bGF0aW9uIG9mIHRoZSB0cmlhbmdsZSBtZXNoCisv
LyBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3VyIGNvbnRyb2wgcG9pbnQgdmVydGljZXMgb2YgYSBj
dWJpYyBjdXJ2ZQorLy8gc2VnbWVudC4KK2NsYXNzIExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9y
IDogcHVibGljIE5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICAvLyBUaGUgdmVydGljZXMgdGhh
dCB0aGUgdHJpYW5ndWxhdG9yIG9wZXJhdGVzIHVwb24sIGNvbnRhaW5pbmcgYm90aAorICAgIC8v
IHRoZSBwb3NpdGlvbiBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzIHRoZSBjdWJpYyB0ZXh0dXJlCisg
ICAgLy8gY29vcmRpbmF0ZXMuCisgICAgY2xhc3MgVmVydGV4IDogcHVibGljIE5vbmNvcHlhYmxl
IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFZlcnRleCgpCisgICAgICAgIHsKKyAgICAgICAgICAg
IHJlc2V0RmxhZ3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQmIHh5
Q29vcmRpbmF0ZXMoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV94eUNv
b3JkaW5hdGVzOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgRmxvYXRQb2ludDNEJiBrbG1D
b29yZGluYXRlcygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2tsbUNv
b3JkaW5hdGVzOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0cyB0aGUgcG9zaXRpb24gYW5k
IHRleHR1cmUgY29vcmRpbmF0ZXMgb2YgdGhlIHZlcnRleC4KKyAgICAgICAgdm9pZCBzZXQoZmxv
YXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgICAgICAgZmxvYXQgaywgZmxvYXQgbCwgZmxvYXQg
bSkKKyAgICAgICAgeworICAgICAgICAgICAgbV94eUNvb3JkaW5hdGVzLnNldCh4LCB5KTsKKyAg
ICAgICAgICAgIG1fa2xtQ29vcmRpbmF0ZXMuc2V0KGssIGwsIG0pOworICAgICAgICB9CisKKyAg
ICAgICAgLy8gRmxhZ3MgZm9yIHdhbGtpbmcgZnJvbSB0aGUgc3RhcnQgdmVydGV4IHRvIHRoZSBl
bmQgdmVydGV4LgorICAgICAgICBib29sIGVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJl
dHVybiBtX2VuZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0RW5kKGJvb2wgZW5kKQor
ICAgICAgICB7CisgICAgICAgICAgICBtX2VuZCA9IGVuZDsKKyAgICAgICAgfQorCisgICAgICAg
IGJvb2wgbWFya2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1fbWFya2VkOwor
ICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRNYXJrZWQoYm9vbCBtYXJrZWQpCisgICAgICAg
IHsKKyAgICAgICAgICAgIG1fbWFya2VkID0gbWFya2VkOworICAgICAgICB9CisKKyAgICAgICAg
Ym9vbCBpbnRlcmlvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX2ludGVyaW9y
OworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRJbnRlcmlvcihib29sIGludGVyaW9yKQor
ICAgICAgICB7CisgICAgICAgICAgICBtX2ludGVyaW9yID0gaW50ZXJpb3I7CisgICAgICAgIH0K
KworICAgICAgICB2b2lkIHJlc2V0RmxhZ3MoKQorICAgICAgICB7CisgICAgICAgICAgICBtX2Vu
ZCA9IGZhbHNlOworICAgICAgICAgICAgbV9tYXJrZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1f
aW50ZXJpb3IgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8g
MkQgY29vcmRpbmF0ZXMgb2YgdGhlIHZlcnRleCBpbiB0aGUgcGxhbmUuCisgICAgICAgIEZsb2F0
UG9pbnQgbV94eUNvb3JkaW5hdGVzOworICAgICAgICAvLyBDdWJpYyB0ZXh0dXJlIGNvb3JkaW5h
dGVzIGZvciByZW5kZXJpbmcgdGhlIGN1cnZlLgorICAgICAgICBGbG9hdFBvaW50M0QgbV9rbG1D
b29yZGluYXRlczsKKworICAgICAgICAvLyBGbGFncyBmb3Igd2Fsa2luZyBmcm9tIHRoZSBzdGFy
dCB2ZXJ0ZXggdG8gdGhlIGVuZCB2ZXJ0ZXguCisgICAgICAgIGJvb2wgbV9lbmQ7CisgICAgICAg
IGJvb2wgbV9tYXJrZWQ7CisgICAgICAgIGJvb2wgbV9pbnRlcmlvcjsKKyAgICB9OworCisgICAg
Ly8gVGhlIHRyaWFuZ2xlcyB0aGUgVHJpYW5ndWxhdG9yIHByb2R1Y2VzLgorICAgIGNsYXNzIFRy
aWFuZ2xlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRyaWFuZ2xlKCkKKyAgICAgICAgeworICAg
ICAgICAgICAgbV92ZXJ0aWNlc1swXSA9IDA7CisgICAgICAgICAgICBtX3ZlcnRpY2VzWzFdID0g
MDsKKyAgICAgICAgICAgIG1fdmVydGljZXNbMl0gPSAwOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gR2V0cyB0aGUgdmVydGV4IGF0IHRoZSBnaXZlbiBpbmRleCwgMCA8PSBpbmRleCA8IDMuCisg
ICAgICAgIFZlcnRleCogZ2V0VmVydGV4KGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAg
ICAgQVNTRVJUKGluZGV4ID49IDAgJiYgaW5kZXggPCAzKTsKKyAgICAgICAgICAgIHJldHVybiBt
X3ZlcnRpY2VzW2luZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybnMgdHJ1ZSBp
ZiB0aGlzIHRyaWFuZ2xlIGNvbnRhaW5zIHRoZSBnaXZlbiB2ZXJ0ZXggKGJ5CisgICAgICAgIC8v
IGlkZW50aXR5LCBub3QgZ2VvbWV0cmljYWxseSkuCisgICAgICAgIGJvb2wgY29udGFpbnMoVmVy
dGV4KiB2KTsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSB2ZXJ0ZXggZm9sbG93aW5nIHRoZSBj
dXJyZW50IG9uZSBpbiB0aGUgc3BlY2lmaWVkCisgICAgICAgIC8vIGRpcmVjdGlvbiwgY291bnRl
cmNsb2Nrd2lzZSBvciBjbG9ja3dpc2UuCisgICAgICAgIFZlcnRleCogbmV4dFZlcnRleChWZXJ0
ZXgqIGN1cnJlbnQsIGJvb2wgdHJhdmVyc2VDb3VudGVyQ2xvY2t3aXNlKTsKKworICAgICAgICAv
LyBTZXRzIHRoZSB2ZXJ0aWNlcyBvZiB0aGlzIHRyaWFuZ2xlLCBwb3RlbnRpYWxseSByZW9yZGVy
aW5nIHRoZW0KKyAgICAgICAgLy8gdG8gcHJvZHVjZSBhIGNhbm9uaWNhbCBvcmllbnRhdGlvbi4K
KyAgICAgICAgdm9pZCBzZXRWZXJ0aWNlcyhWZXJ0ZXgqIHYwLAorICAgICAgICAgICAgICAgICAg
ICAgICAgIFZlcnRleCogdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGV4KiB2MikK
KyAgICAgICAgeworICAgICAgICAgICAgbV92ZXJ0aWNlc1swXSA9IHYwOworICAgICAgICAgICAg
bV92ZXJ0aWNlc1sxXSA9IHYxOworICAgICAgICAgICAgbV92ZXJ0aWNlc1syXSA9IHYyOworICAg
ICAgICAgICAgbWFrZUNvdW50ZXJDbG9ja3dpc2UoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0
ZToKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgaW5kZXggWzAuLjJdIGFzc29jaWF0ZWQgd2l0aCB0
aGUgZ2l2ZW4gdmVydGV4LCBvcgorICAgICAgICAvLyAtMSBpZiBub3QgZm91bmQuCisgICAgICAg
IGludCBpbmRleEZvclZlcnRleChWZXJ0ZXgqIHZlcnRleCk7CisKKyAgICAgICAgLy8gUmVvcmRl
cnMgdGhlIHZlcnRpY2VzIGluIHRoaXMgdHJpYW5nbGUgdG8gbWFrZSB0aGVtCisgICAgICAgIC8v
IGNvdW50ZXJjbG9ja3dpc2Ugd2hlbiB2aWV3ZWQgaW4gdGhlIDJEIHBsYW5lLCBpbiBvcmRlciB0
bworICAgICAgICAvLyBhY2hpZXZlIGEgY2Fub25pY2FsIG9yZGVyaW5nLgorICAgICAgICB2b2lk
IG1ha2VDb3VudGVyQ2xvY2t3aXNlKCk7CisKKyAgICAgICAgLy8gTm90ZTogdGhlc2UgYXJlIHJh
dyBwb2ludGVycyBiZWNhdXNlIHRoZXkgcG9pbnQgdG8gdGhlCisgICAgICAgIC8vIG1fdmVydGlj
ZXMgY29udGFpbmVkIGluIHRoZSBzdXJyb3VuZGluZyB0cmlhbmd1bGF0b3IuCisgICAgICAgIFZl
cnRleCogbV92ZXJ0aWNlc1szXTsKKyAgICB9OworCisgICAgTG9vcEJsaW5uTG9jYWxUcmlhbmd1
bGF0b3IoKTsKKworICAgIC8vIFJlc2V0cyB0aGUgdHJpYW5ndWxhdG9yJ3Mgc3RhdGUuIEFmdGVy
IGVhY2ggdHJpYW5ndWxhdGlvbiBhbmQKKyAgICAvLyBiZWZvcmUgdGhlIG5leHQsIGNhbGwgdGhp
cyB0byByZS1pbml0aWFsaXplIHRoZSBpbnRlcm5hbAorICAgIC8vIHZlcnRpY2VzJyBzdGF0ZS4K
KyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBSZXR1cm5zIGEgbXV0YWJsZSB2ZXJ0ZXggc3Rv
cmVkIGluIHRoZSB0cmlhbmd1bGF0b3IuIFVzZSB0aGlzIHRvCisgICAgLy8gc2V0IHVwIHRoZSB2
ZXJ0aWNlcyBiZWZvcmUgYSB0cmlhbmd1bGF0aW9uLgorICAgIFZlcnRleCogZ2V0VmVydGV4KGlu
dCBpbmRleCkKKyAgICB7CisgICAgICAgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgNCk7
CisgICAgICAgIHJldHVybiAmbV92ZXJ0aWNlc1tpbmRleF07CisgICAgfQorCisgICAgZW51bSBJ
bnNpZGVFZGdlQ29tcHV0YXRpb24geworICAgICAgICBDb21wdXRlSW5zaWRlRWRnZXMsCisgICAg
ICAgIERvbnRDb21wdXRlSW5zaWRlRWRnZXMKKyAgICB9OworCisgICAgLy8gT25jZSB0aGUgdmVy
dGljZXMnIGNvbnRlbnRzIGhhdmUgYmVlbiBzZXQgdXAsIGNhbGwgdHJpYW5ndWxhdGUoKQorICAg
IC8vIHRvIHJlY29tcHV0ZSB0aGUgdHJpYW5nbGVzLgorICAgIC8vCisgICAgLy8gSWYgY29tcHV0
ZUluc2lkZUVkZ2VzIGlzIENvbXB1dGVJbnNpZGVFZGdlcywgdGhlbiBzaWRlVG9GaWxsCisgICAg
Ly8gd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGljaCBzaWRlIG9mIHRoZSBjdWJpYyBjdXJ2
ZSBkZWZpbmVkCisgICAgLy8gYnkgdGhlIGZvdXIgY29udHJvbCBwb2ludHMgaXMgdG8gYmUgZmls
bGVkLgorICAgIC8vCisgICAgLy8gVGhlIHRyaWFuZ3VsYXRpb24gb2JleXMgdGhlIGZvbGxvd2lu
ZyBndWFyYW50ZWVzOgorICAgIC8vICAgLSBJZiB0aGUgY29udmV4IGh1bGwgaXMgYSBxdWFkcmls
YXRlcmFsLCB0aGVuIHRoZSBzaG9ydGVzdCBlZGdlCisgICAgLy8gICAgIHdpbGwgYmUgY2hvc2Vu
IGZvciB0aGUgY3V0IGludG8gdHdvIHRyaWFuZ2xlcy4KKyAgICAvLyAgIC0gSWYgb25lIG9mIHRo
ZSB2ZXJ0aWNlcyBpcyBjb250YWluZWQgaW4gdGhlIHRyaWFuZ2xlIHNwYW5uZWQKKyAgICAvLyAg
ICAgYnkgdGhlIG90aGVyIHRocmVlLCB0aHJlZSB0cmlhbmdsZXMgd2lsbCBiZSBwcm9kdWNlZC4K
KyAgICB2b2lkIHRyaWFuZ3VsYXRlKEluc2lkZUVkZ2VDb21wdXRhdGlvbiBjb21wdXRlSW5zaWRl
RWRnZXMsCisgICAgICAgICAgICAgICAgICAgICBMb29wQmxpbm5Db25zdGFudHM6OkZpbGxTaWRl
IHNpZGVUb0ZpbGwpOworCisgICAgLy8gTnVtYmVyIG9mIHRyaWFuZ2xlcyBjb21wdXRlZCBieSB0
cmlhbmd1bGF0ZSgpLgorICAgIGludCBudW1UcmlhbmdsZXMoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG1fbnVtVHJpYW5nbGVzOworICAgIH0KKworICAgIC8vIFJldHVybnMgdGhlIGNv
bXB1dGVkIHRyaWFuZ2xlIGF0IGluZGV4LCAwIDw9IGluZGV4IDwKKyAgICAvLyBudW1fdHJpYW5n
bGVzKCkuCisgICAgVHJpYW5nbGUqIGdldFRyaWFuZ2xlKGludCBpbmRleCkKKyAgICB7CisgICAg
ICAgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgbV9udW1UcmlhbmdsZXMpOworICAgICAg
ICByZXR1cm4gJm1fdHJpYW5nbGVzW2luZGV4XTsKKyAgICB9CisKKyAgICAvLyBOdW1iZXIgb2Yg
dmVydGljZXMgZmFjaW5nIHRoZSBpbnNpZGUgb2YgdGhlIHNoYXBlLCBpZgorICAgIC8vIGNvbXB1
dGVfaW5zaWRlX2VkZ2VzIHdhcyB0cnVlIHdoZW4gdHJpYW5ndWxhdGUoKSB3YXMgY2FsbGVkLgor
ICAgIGludCBudW1JbnRlcmlvclZlcnRpY2VzKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVy
biBtX251bUludGVyaW9yVmVydGljZXM7CisgICAgfQorCisgICAgLy8gRmV0Y2hlcyB0aGUgZ2l2
ZW4gaW50ZXJpb3IgdmVydGV4LCAwIDw9IGluZGV4IDwKKyAgICAvLyBudW1JbnRlcmlvclZlcnRp
Y2VzKCkuCisgICAgVmVydGV4KiBnZXRJbnRlcmlvclZlcnRleChpbnQgaW5kZXgpCisgICAgewor
ICAgICAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG1fbnVtSW50ZXJpb3JWZXJ0aWNl
cyk7CisgICAgICAgIHJldHVybiBtX2ludGVyaW9yVmVydGljZXNbaW5kZXhdOworICAgIH0KKwor
cHJpdmF0ZToKKyAgICB2b2lkIHRyaWFuZ3VsYXRlSGVscGVyKExvb3BCbGlubkNvbnN0YW50czo6
RmlsbFNpZGUgc2lkZVRvRmlsbCk7CisKKyAgICAvLyBBZGRzIGEgdHJpYW5nbGUgdG8gdGhlIHRy
aWFuZ3VsYXRpb24uCisgICAgdm9pZCBhZGRUcmlhbmdsZShWZXJ0ZXgqIHYwLCBWZXJ0ZXgqIHYx
LCBWZXJ0ZXgqIHYyKTsKKworICAgIC8vIEFkZHMgYSB2ZXJ0ZXggdG8gdGhlIGxpc3Qgb2YgaW50
ZXJpb3IgdmVydGljZXMuCisgICAgdm9pZCBhZGRJbnRlcmlvclZlcnRleChWZXJ0ZXgqIHYpOwor
CisgICAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVkZ2UgYmV0d2VlbiB2ZXJ0ZXggdjAgYW5k
IHYxIGlzIHNoYXJlZAorICAgIC8vIGJldHdlZW4gdHdvIG9yIG1vcmUgdHJpYW5nbGVzLgorICAg
IGJvb2wgaXNTaGFyZWRFZGdlKFZlcnRleCogdjAsIFZlcnRleCogdjEpOworCisgICAgLy8gVGhl
IHZlcnRpY2VzIGJlaW5nIHRyaWFuZ3VsYXRlZC4KKyAgICBWZXJ0ZXggbV92ZXJ0aWNlc1s0XTsK
KworICAgIC8vIFRoZSB2ZXJ0aWNlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBlZGdlcyBmYWNpbmcg
dGhlIGluc2lkZSBvZiB0aGUKKyAgICAvLyBzaGFwZSwgaW4gb3JkZXIgZnJvbSB0aGUgc3RhcnQg
dmVydGV4IHRvIHRoZSBlbmQgdmVydGV4LiBUaGUgbW9yZQorICAgIC8vIGdlbmVyYWwgdHJpYW5n
dWxhdGlvbiBhbGdvcml0aG0gdGVzc2VsbGF0ZXMgdGhpcyBpbnRlcmlvciByZWdpb24uCisgICAg
VmVydGV4KiBtX2ludGVyaW9yVmVydGljZXNbNF07CisgICAgLy8gVGhlIG51bWJlciBvZiBpbnRl
cmlvciB2ZXJ0aWNlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhlIGN1cnJlbnQKKyAgICAvLyB0cmlh
bmd1bGF0aW9uLgorICAgIGludCBtX251bUludGVyaW9yVmVydGljZXM7CisKKyAgICAvLyBUaGVy
ZSBjYW4gYmUgYXQgbW9zdCB0aHJlZSB0cmlhbmdsZXMgY29tcHV0ZWQgYnkgdGhpcyBsb2NhbAor
ICAgIC8vIGFsZ29yaXRobSwgd2hpY2ggb2NjdXJzIHdoZW4gb25lIG9mIHRoZSB2ZXJ0aWNlcyBp
cyBjb250YWluZWQgaW4KKyAgICAvLyB0aGUgdHJpYW5nbGUgc3Bhbm5lZCBieSB0aGUgb3RoZXIg
dGhyZWUuIE1vc3Qgb2YgdGhlIHRpbWUgdGhlCisgICAgLy8gYWxnb3JpdGhtIGNvbXB1dGVzIHR3
byB0cmlhbmdsZXMuCisgICAgVHJpYW5nbGUgbV90cmlhbmdsZXNbM107CisgICAgaW50IG1fbnVt
VHJpYW5nbGVzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gTG9v
cEJsaW5uTG9jYWxUcmlhbmd1bGF0b3JfaAo=
</data>
<flag name="commit-queue"
          id="56291"
          type_id="3"
          status="-"
          setter="kbr"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>67149</attachid>
            <date>2010-09-09 21:48:00 -0700</date>
            <delta_ts>2010-09-15 13:46:31 -0700</delta_ts>
            <desc>Revised patch</desc>
            <filename>local-triangulator.patch</filename>
            <type>text/plain</type>
            <size>23934</size>
            <attacher name="Kenneth Russell">kbr</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NzE2MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDkgQEAKKzIwMTAtMDktMDkgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFk
ZCBsb2NhbCB0cmlhbmd1bGF0aW9uIG9mIGN1YmljIGN1cnZlIGNvbnRyb2wgcG9pbnRzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NTI1MgorCisgICAg
ICAgIEFkZGluZyBhIGxvY2FsaXplZCB0cmlhbmd1bGF0aW9uIGFsZ29yaXRobSB3aGljaCB0YWtl
cyBhcyBpbnB1dAorICAgICAgICB0aGUgZm91ciBjb250cm9sIHBvaW50cyBvZiBhIGN1YmljIGN1
cnZlIHNlZ21lbnQgYW5kIHByb3ZpZGVzIGJvdGgKKyAgICAgICAgdHJpYW5nbGVzIGFzIHdlbGwg
YXMgdGhlIGFiaWxpdHkgdG8gd2FsayB0aGUgaW50ZXJpb3IgZWRnZXMuIFRoZQorICAgICAgICBs
YXR0ZXIgd2lsbCBiZSB1c2VkIGxhdGVyIHRvIGZpbGwgdGhlIGludGVyaW9yIG9mIHNoYXBlcyBi
b3VuZGVkCisgICAgICAgIGJ5IHRoZXNlIGN1YmljIGN1cnZlcywgcXVhZHJhdGljIGN1cnZlcyBh
bmQgbGluZSBzZWdtZW50cy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29w
Qmxpbm5Mb2NhbFRyaWFuZ3VsYXRvci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6TG9v
cEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xlOjpjb250YWlucyk6CisgICAgICAgIChX
ZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VHJpYW5nbGU6Om5leHRWZXJ0ZXgp
OgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xl
OjppbmRleEZvclZlcnRleCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFu
Z3VsYXRvcjo6VHJpYW5nbGU6Om1ha2VDb3VudGVyQ2xvY2t3aXNlKToKKyAgICAgICAgKFdlYkNv
cmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRv
cik6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6cmVzZXQp
OgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OnRyaWFuZ3Vs
YXRlKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjp0cmlh
bmd1bGF0ZUhlbHBlcik6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3Vs
YXRvcjo6YWRkVHJpYW5nbGUpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlh
bmd1bGF0b3I6OmFkZEludGVyaW9yVmVydGV4KToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlu
bkxvY2FsVHJpYW5ndWxhdG9yOjppc1NoYXJlZEVkZ2UpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2dwdS9Mb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvci5oOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpWZXJ0ZXg6OlZlcnRleCk6Cisg
ICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VmVydGV4Ojp4eUNv
b3JkaW5hdGVzKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9y
OjpWZXJ0ZXg6OmtsbUNvb3JkaW5hdGVzKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubkxv
Y2FsVHJpYW5ndWxhdG9yOjpWZXJ0ZXg6OnNldCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxp
bm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VmVydGV4OjplbmQpOgorICAgICAgICAoV2ViQ29yZTo6TG9v
cEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlZlcnRleDo6c2V0RW5kKToKKyAgICAgICAgKFdlYkNv
cmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpWZXJ0ZXg6Om1hcmtlZCk6CisgICAgICAg
IChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VmVydGV4OjpzZXRNYXJrZWQp
OgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OlZlcnRleDo6
aW50ZXJpb3IpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6
OlZlcnRleDo6c2V0SW50ZXJpb3IpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxU
cmlhbmd1bGF0b3I6OlZlcnRleDo6cmVzZXRGbGFncyk6CisgICAgICAgIChXZWJDb3JlOjpMb29w
Qmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VHJpYW5nbGU6OlRyaWFuZ2xlKToKKyAgICAgICAgKFdl
YkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZTo6Z2V0VmVydGV4KToK
KyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZTo6
c2V0VmVydGljZXMpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0
b3I6OmdldFZlcnRleCk6CisgICAgICAgIChXZWJDb3JlOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3Vs
YXRvcjo6bnVtYmVyT2ZUcmlhbmdsZXMpOgorICAgICAgICAoV2ViQ29yZTo6TG9vcEJsaW5uTG9j
YWxUcmlhbmd1bGF0b3I6OmdldFRyaWFuZ2xlKToKKyAgICAgICAgKFdlYkNvcmU6Okxvb3BCbGlu
bkxvY2FsVHJpYW5ndWxhdG9yOjpudW1iZXJPZkludGVyaW9yVmVydGljZXMpOgorICAgICAgICAo
V2ViQ29yZTo6TG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OmdldEludGVyaW9yVmVydGV4KToK
KwogMjAxMC0wOS0wOSAgVG9ueSBHZW50aWxjb3JlICA8dG9ueWdAY2hyb21pdW0ub3JnPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IEFkYW0gQmFydGguCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2dwdS9Mb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvci5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3Iu
Y3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJs
aW5uTG9jYWxUcmlhbmd1bGF0b3IuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDI3NSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
CisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkxvb3BCbGlubkxvY2FsVHJp
YW5ndWxhdG9yLmgiCisKKyNpbmNsdWRlICJMb29wQmxpbm5NYXRoVXRpbHMuaCIKKyNpbmNsdWRl
IDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgTG9vcEJsaW5uTWF0
aFV0aWxzOjphcHByb3hFcXVhbDsKK3VzaW5nIExvb3BCbGlubk1hdGhVdGlsczo6bGluZXNJbnRl
cnNlY3Q7Cit1c2luZyBMb29wQmxpbm5NYXRoVXRpbHM6OnBvaW50SW5UcmlhbmdsZTsKKworYm9v
bCBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6VHJpYW5nbGU6OmNvbnRhaW5zKExvb3BCbGlu
bkxvY2FsVHJpYW5ndWxhdG9yOjpWZXJ0ZXgqIHYpCit7CisgICAgcmV0dXJuIGluZGV4Rm9yVmVy
dGV4KHYpID49IDA7Cit9CisKK0xvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpWZXJ0ZXgqIExv
b3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZTo6bmV4dFZlcnRleChMb29wQmxpbm5M
b2NhbFRyaWFuZ3VsYXRvcjo6VmVydGV4KiBjdXJyZW50LCBib29sIHRyYXZlcnNlQ291bnRlckNs
b2Nrd2lzZSkKK3sKKyAgICBpbnQgaW5kZXggPSBpbmRleEZvclZlcnRleChjdXJyZW50KTsKKyAg
ICBBU1NFUlQoaW5kZXggPj0gMCk7CisgICAgaWYgKHRyYXZlcnNlQ291bnRlckNsb2Nrd2lzZSkK
KyAgICAgICAgKytpbmRleDsKKyAgICBlbHNlCisgICAgICAgIC0taW5kZXg7CisgICAgaWYgKGlu
ZGV4IDwgMCkKKyAgICAgICAgaW5kZXggKz0gMzsKKyAgICBlbHNlCisgICAgICAgIGluZGV4ID0g
aW5kZXggJSAzOworICAgIHJldHVybiBtX3ZlcnRpY2VzW2luZGV4XTsKK30KKworaW50IExvb3BC
bGlubkxvY2FsVHJpYW5ndWxhdG9yOjpUcmlhbmdsZTo6aW5kZXhGb3JWZXJ0ZXgoTG9vcEJsaW5u
TG9jYWxUcmlhbmd1bGF0b3I6OlZlcnRleCogdmVydGV4KQoreworICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgMzsgKytpKQorICAgICAgICBpZiAobV92ZXJ0aWNlc1tpXSA9PSB2ZXJ0ZXgpCisgICAg
ICAgICAgICByZXR1cm4gaTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgTG9vcEJsaW5uTG9j
YWxUcmlhbmd1bGF0b3I6OlRyaWFuZ2xlOjptYWtlQ291bnRlckNsb2Nrd2lzZSgpCit7CisgICAg
Ly8gUG9zc2libHkgc3dhcHMgdHdvIHZlcnRpY2VzIHNvIHRoYXQgdGhlIHRyaWFuZ2xlJ3MgdmVy
dGljZXMgYXJlCisgICAgLy8gYWx3YXlzIHNwZWNpZmllZCBpbiBjb3VudGVyY2xvY2t3aXNlIG9y
ZGVyLiBUaGlzIG9yZGVycyB0aGUKKyAgICAvLyB2ZXJ0aWNlcyBjYW5vbmljYWxseSB3aGVuIHdh
bGtpbmcgdGhlIGludGVyaW9yIGVkZ2VzIGZyb20gdGhlCisgICAgLy8gc3RhcnQgdG8gdGhlIGVu
ZCB2ZXJ0ZXguCisgICAgRmxvYXRQb2ludDNEIHBvaW50MChtX3ZlcnRpY2VzWzBdLT54eUNvb3Jk
aW5hdGVzKCkpOworICAgIEZsb2F0UG9pbnQzRCBwb2ludDEobV92ZXJ0aWNlc1sxXS0+eHlDb29y
ZGluYXRlcygpKTsKKyAgICBGbG9hdFBvaW50M0QgcG9pbnQyKG1fdmVydGljZXNbMl0tPnh5Q29v
cmRpbmF0ZXMoKSk7CisgICAgRmxvYXRQb2ludDNEIGNyb3NzUHJvZHVjdCA9IChwb2ludDEgLSBw
b2ludDApLmNyb3NzKHBvaW50MiAtIHBvaW50MCk7CisgICAgaWYgKGNyb3NzUHJvZHVjdC56KCkg
PCAwKQorICAgICAgICBzdGQ6OnN3YXAobV92ZXJ0aWNlc1sxXSwgbV92ZXJ0aWNlc1syXSk7Cit9
CisKK0xvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yOjpMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRv
cigpCit7CisgICAgcmVzZXQoKTsKK30KKwordm9pZCBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRv
cjo6cmVzZXQoKQoreworICAgIG1fbnVtYmVyT2ZUcmlhbmdsZXMgPSAwOworICAgIG1fbnVtYmVy
T2ZJbnRlcmlvclZlcnRpY2VzID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkg
eworICAgICAgICBtX2ludGVyaW9yVmVydGljZXNbaV0gPSAwOworICAgICAgICBtX3ZlcnRpY2Vz
W2ldLnJlc2V0RmxhZ3MoKTsKKyAgICB9Cit9CisKK3ZvaWQgTG9vcEJsaW5uTG9jYWxUcmlhbmd1
bGF0b3I6OnRyaWFuZ3VsYXRlKEluc2lkZUVkZ2VDb21wdXRhdGlvbiBjb21wdXRlSW5zaWRlRWRn
ZXMsIExvb3BCbGlubkNvbnN0YW50czo6RmlsbFNpZGUgc2lkZVRvRmlsbCkKK3sKKyAgICB0cmlh
bmd1bGF0ZUhlbHBlcihzaWRlVG9GaWxsKTsKKworICAgIGlmIChjb21wdXRlSW5zaWRlRWRnZXMg
PT0gQ29tcHV0ZUluc2lkZUVkZ2VzKSB7CisgICAgICAgIC8vIFdlIG5lZWQgdG8gY29tcHV0ZSB3
aGljaCB2ZXJ0aWNlcyBkZXNjcmliZSB0aGUgcGF0aCBhbG9uZyB0aGUKKyAgICAgICAgLy8gaW50
ZXJpb3IgcG9ydGlvbiBvZiB0aGUgc2hhcGUsIHRvIGZlZWQgdGhlc2UgdmVydGljZXMgdG8gdGhl
CisgICAgICAgIC8vIG1vcmUgZ2VuZXJhbCB0ZXNzZWxsYXRpb24gYWxnb3JpdGhtLiBJdCBpcyBw
b3NzaWJsZSB0aGF0IHdlCisgICAgICAgIC8vIGNvdWxkIGRldGVybWluZSB0aGlzIGRpcmVjdGx5
IHdoaWxlIHByb2R1Y2luZyB0cmlhbmdsZXMgYWJvdmUuCisgICAgICAgIC8vIEhlcmUgd2UgdHJ5
IHRvIGRvIGl0IGdlbmVyYWxseSBqdXN0IGJ5IGV4YW1pbmluZyB0aGUgdHJpYW5nbGVzCisgICAg
ICAgIC8vIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvZHVjZWQuIFdlIHdhbGsgYXJvdW5kIHRo
ZW0gaW4gYQorICAgICAgICAvLyBzcGVjaWZpYyBkaXJlY3Rpb24gZGV0ZXJtaW5lZCBieSB3aGlj
aCBzaWRlIG9mIHRoZSBjdXJ2ZSBpcworICAgICAgICAvLyBiZWluZyBmaWxsZWQuIFdlIGlnbm9y
ZSB0aGUgaW50ZXJpb3IgdmVydGV4IHVubGVzcyBpdCBpcyBhbHNvCisgICAgICAgIC8vIHRoZSBl
bmRpbmcgdmVydGV4LCBhbmQgc2tpcCB0aGUgZWRnZXMgc2hhcmVkIGJldHdlZW4gdHdvCisgICAg
ICAgIC8vIHRyaWFuZ2xlcy4KKyAgICAgICAgVmVydGV4KiB2ID0gJm1fdmVydGljZXNbMF07Cisg
ICAgICAgIGFkZEludGVyaW9yVmVydGV4KHYpOworICAgICAgICBpbnQgbnVtU3RlcHMgPSAwOwor
ICAgICAgICB3aGlsZSAoIXYtPmVuZCgpICYmIG51bVN0ZXBzIDwgNCkgeworICAgICAgICAgICAg
Ly8gRmluZCB0aGUgbmV4dCB2ZXJ0ZXggYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBydWxlcworICAg
ICAgICAgICAgYm9vbCBnb3ROZXh0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0g
MDsgaSA8IG51bWJlck9mVHJpYW5nbGVzKCkgJiYgIWdvdE5leHQ7ICsraSkgeworICAgICAgICAg
ICAgICAgIFRyaWFuZ2xlKiB0cmkgPSBnZXRUcmlhbmdsZShpKTsKKyAgICAgICAgICAgICAgICBp
ZiAodHJpLT5jb250YWlucyh2KSkgeworICAgICAgICAgICAgICAgICAgICBWZXJ0ZXgqIG5leHQg
PSB0cmktPm5leHRWZXJ0ZXgodiwgc2lkZVRvRmlsbCA9PSBMb29wQmxpbm5Db25zdGFudHM6OlJp
Z2h0U2lkZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbmV4dC0+bWFya2VkKCkgJiYgIWlz
U2hhcmVkRWRnZSh2LCBuZXh0KSAmJiAoIW5leHQtPmludGVyaW9yKCkgfHwgbmV4dC0+ZW5kKCkp
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRJbnRlcmlvclZlcnRleChuZXh0KTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHYgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gQnJlYWsgb3V0IG9mIGZvciBsb29wCisgICAgICAgICAgICAgICAgICAgICAgICBnb3ROZXh0
ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICsrbnVtU3RlcHM7CisgICAgICAgIH0KKyAgICAgICAgaWYg
KCF2LT5lbmQoKSkgeworICAgICAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0
aGUgYWJvdmUgYWxnb3JpdGhtOyBhZGQgdGhlIGxhc3QKKyAgICAgICAgICAgIC8vIHZlcnRleCB0
byB0aGUgaW50ZXJpb3IgdmVydGljZXMgYW55d2F5LiAoRklYTUU6IHNob3VsZCB3ZQorICAgICAg
ICAgICAgLy8gYWRkIGFuIGFzc2VydCBoZXJlIGFuZCBkbyBtb3JlIGV4dGVuc2l2ZSB0ZXN0aW5n
PykKKyAgICAgICAgICAgIGFkZEludGVyaW9yVmVydGV4KCZtX3ZlcnRpY2VzWzNdKTsKKyAgICAg
ICAgfQorICAgIH0KK30KKwordm9pZCBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvcjo6dHJpYW5n
dWxhdGVIZWxwZXIoTG9vcEJsaW5uQ29uc3RhbnRzOjpGaWxsU2lkZSBzaWRlVG9GaWxsKQorewor
ICAgIHJlc2V0KCk7CisKKyAgICBtX3ZlcnRpY2VzWzNdLnNldEVuZCh0cnVlKTsKKworICAgIC8v
IEZpcnN0IHRlc3QgZm9yIGRlZ2VuZXJhdGUgY2FzZXMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCA0OyArK2kpIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgNDsgKytqKSB7Cisg
ICAgICAgICAgICBpZiAoYXBwcm94RXF1YWwobV92ZXJ0aWNlc1tpXS54eUNvb3JkaW5hdGVzKCks
IG1fdmVydGljZXNbal0ueHlDb29yZGluYXRlcygpKSkgeworICAgICAgICAgICAgICAgIC8vIFR3
byBvZiB0aGUgdmVydGljZXMgYXJlIGNvaW5jaWRlbnQsIHNvIHdlIGNhbiBlbGltaW5hdGUgYXQK
KyAgICAgICAgICAgICAgICAvLyBsZWFzdCBvbmUgdHJpYW5nbGUuIFdlIG1pZ2h0IGJlIGFibGUg
dG8gZWxpbWluYXRlIHRoZSBvdGhlcgorICAgICAgICAgICAgICAgIC8vIGFzIHdlbGwsIGJ1dCB0
aGlzIHNlZW1zIHN1ZmZpY2llbnQgdG8gYXZvaWQgZGVnZW5lcmF0ZQorICAgICAgICAgICAgICAg
IC8vIHRyaWFuZ3VsYXRpb25zLgorICAgICAgICAgICAgICAgIGludCBpbmRpY2VzWzNdID0geyAw
IH07CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBmb3Ig
KGludCBrID0gMDsgayA8IDQ7ICsraykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgIT0gaikK
KyAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaW5kZXgrK10gPSBrOworICAgICAgICAg
ICAgICAgIGFkZFRyaWFuZ2xlKCZtX3ZlcnRpY2VzW2luZGljZXNbMF1dLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICZtX3ZlcnRpY2VzW2luZGljZXNbMV1dLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICZtX3ZlcnRpY2VzW2luZGljZXNbMl1dKTsKKyAgICAgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZWUgd2hl
dGhlciBhbnkgb2YgdGhlIHBvaW50cyBhcmUgZnVsbHkgY29udGFpbmVkIGluIHRoZQorICAgIC8v
IHRyaWFuZ2xlIGRlZmluZWQgYnkgdGhlIG90aGVyIHRocmVlLgorICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgNDsgKytpKSB7CisgICAgICAgIGludCBpbmRpY2VzWzNdID0geyAwIH07CisgICAgICAg
IGludCBpbmRleCA9IDA7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgKytqKQorICAg
ICAgICAgICAgaWYgKGkgIT0gaikKKyAgICAgICAgICAgICAgICBpbmRpY2VzW2luZGV4KytdID0g
ajsKKyAgICAgICAgaWYgKHBvaW50SW5UcmlhbmdsZShtX3ZlcnRpY2VzW2ldLnh5Q29vcmRpbmF0
ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZlcnRpY2VzW2luZGljZXNbMF1d
Lnh5Q29vcmRpbmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZlcnRpY2Vz
W2luZGljZXNbMV1dLnh5Q29vcmRpbmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBtX3ZlcnRpY2VzW2luZGljZXNbMl1dLnh5Q29vcmRpbmF0ZXMoKSkpIHsKKyAgICAgICAgICAg
IC8vIFByb2R1Y2UgdGhyZWUgdHJpYW5nbGVzIHN1cnJvdW5kaW5nIHRoaXMgaW50ZXJpb3IgdmVy
dGV4LgorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opCisgICAgICAgICAg
ICAgICAgYWRkVHJpYW5nbGUoJm1fdmVydGljZXNbaW5kaWNlc1tqICUgM11dLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICZtX3ZlcnRpY2VzW2luZGljZXNbKGogKyAxKSAlIDNdXSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAmbV92ZXJ0aWNlc1tpXSk7CisgICAgICAgICAgICAv
LyBNYXJrIHRoZSBpbnRlcmlvciB2ZXJ0ZXggc28gd2UgaWdub3JlIGl0IGlmIHRyeWluZyB0byB0
cmFjZQorICAgICAgICAgICAgLy8gdGhlIGludGVyaW9yIGVkZ2UuCisgICAgICAgICAgICBtX3Zl
cnRpY2VzW2ldLnNldEludGVyaW9yKHRydWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICB9CisgICAgfQorCisgICAgLy8gVGhlcmUgYXJlIG9ubHkgYSBmZXcgcGVybXV0YXRpb25zIG9m
IHRoZSB2ZXJ0aWNlcywgaWdub3JpbmcKKyAgICAvLyByb3RhdGlvbnMsIHdoaWNoIGFyZSBpcnJl
bGV2YW50OgorICAgIC8vCisgICAgLy8gIDAtLTMgIDAtLTIgIDAtLTMgIDAtLTEgIDAtLTIgIDAt
LTEKKyAgICAvLyAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfCAgfAorICAgIC8vICB8
ICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8ICB8CisgICAgLy8gIDEtLTIgIDEtLTMgIDIt
LTEgIDItLTMgIDMtLTEgIDMtLTIKKyAgICAvLworICAgIC8vIE5vdGUgdGhhdCB0aHJlZSBvZiB0
aGVzZSBhcmUgcmVmbGVjdGlvbnMgb2YgZWFjaCBvdGhlci4KKyAgICAvLyBUaGVyZWZvcmUgdGhl
cmUgYXJlIG9ubHkgdGhyZWUgcG9zc2libGUgdHJpYW5ndWxhdGlvbnM6CisgICAgLy8KKyAgICAv
LyAgMC0tMyAgMC0tMiAgMC0tMworICAgIC8vICB8XCB8ICB8XCB8ICB8XCB8CisgICAgLy8gIHwg
XHwgIHwgXHwgIHwgXHwKKyAgICAvLyAgMS0tMiAgMS0tMyAgMi0tMQorICAgIC8vCisgICAgLy8g
RnJvbSB3aGljaCB3ZSBjYW4gY2hvb3NlIGJ5IHNlZWluZyB3aGljaCBvZiB0aGUgcG90ZW50aWFs
CisgICAgLy8gZGlhZ29uYWxzIGludGVyc2VjdC4gTm90ZSB0aGF0IHdlIGNob29zZSB0aGUgc2hv
cnRlc3QgZGlhZ29uYWwKKyAgICAvLyB0byBzcGxpdCB0aGUgcXVhZC4KKyAgICBpZiAobGluZXNJ
bnRlcnNlY3QobV92ZXJ0aWNlc1swXS54eUNvb3JkaW5hdGVzKCksCisgICAgICAgICAgICAgICAg
ICAgICAgIG1fdmVydGljZXNbMl0ueHlDb29yZGluYXRlcygpLAorICAgICAgICAgICAgICAgICAg
ICAgICBtX3ZlcnRpY2VzWzFdLnh5Q29vcmRpbmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgbV92ZXJ0aWNlc1szXS54eUNvb3JkaW5hdGVzKCkpKSB7CisgICAgICAgIGlmICgobV92ZXJ0
aWNlc1syXS54eUNvb3JkaW5hdGVzKCkgLSBtX3ZlcnRpY2VzWzBdLnh5Q29vcmRpbmF0ZXMoKSku
ZGlhZ29uYWxMZW5ndGhTcXVhcmVkKCkgPAorICAgICAgICAgICAgKG1fdmVydGljZXNbM10ueHlD
b29yZGluYXRlcygpIC0gbV92ZXJ0aWNlc1sxXS54eUNvb3JkaW5hdGVzKCkpLmRpYWdvbmFsTGVu
Z3RoU3F1YXJlZCgpKSB7CisgICAgICAgICAgICBhZGRUcmlhbmdsZSgmbV92ZXJ0aWNlc1swXSwg
Jm1fdmVydGljZXNbMV0sICZtX3ZlcnRpY2VzWzJdKTsKKyAgICAgICAgICAgIGFkZFRyaWFuZ2xl
KCZtX3ZlcnRpY2VzWzBdLCAmbV92ZXJ0aWNlc1syXSwgJm1fdmVydGljZXNbM10pOworICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgYWRkVHJpYW5nbGUoJm1fdmVydGljZXNbMF0sICZtX3Zl
cnRpY2VzWzFdLCAmbV92ZXJ0aWNlc1szXSk7CisgICAgICAgICAgICBhZGRUcmlhbmdsZSgmbV92
ZXJ0aWNlc1sxXSwgJm1fdmVydGljZXNbMl0sICZtX3ZlcnRpY2VzWzNdKTsKKyAgICAgICAgfQor
ICAgIH0gZWxzZSBpZiAobGluZXNJbnRlcnNlY3QobV92ZXJ0aWNlc1swXS54eUNvb3JkaW5hdGVz
KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZlcnRpY2VzWzNdLnh5Q29vcmRp
bmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmVydGljZXNbMV0ueHlD
b29yZGluYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92ZXJ0aWNlc1sy
XS54eUNvb3JkaW5hdGVzKCkpKSB7CisgICAgICAgIGlmICgobV92ZXJ0aWNlc1szXS54eUNvb3Jk
aW5hdGVzKCkgLSBtX3ZlcnRpY2VzWzBdLnh5Q29vcmRpbmF0ZXMoKSkuZGlhZ29uYWxMZW5ndGhT
cXVhcmVkKCkgPAorICAgICAgICAgICAgKG1fdmVydGljZXNbMl0ueHlDb29yZGluYXRlcygpIC0g
bV92ZXJ0aWNlc1sxXS54eUNvb3JkaW5hdGVzKCkpLmRpYWdvbmFsTGVuZ3RoU3F1YXJlZCgpKSB7
CisgICAgICAgICAgICBhZGRUcmlhbmdsZSgmbV92ZXJ0aWNlc1swXSwgJm1fdmVydGljZXNbMV0s
ICZtX3ZlcnRpY2VzWzNdKTsKKyAgICAgICAgICAgIGFkZFRyaWFuZ2xlKCZtX3ZlcnRpY2VzWzBd
LCAmbV92ZXJ0aWNlc1szXSwgJm1fdmVydGljZXNbMl0pOworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgYWRkVHJpYW5nbGUoJm1fdmVydGljZXNbMF0sICZtX3ZlcnRpY2VzWzFdLCAmbV92
ZXJ0aWNlc1syXSk7CisgICAgICAgICAgICBhZGRUcmlhbmdsZSgmbV92ZXJ0aWNlc1syXSwgJm1f
dmVydGljZXNbMV0sICZtX3ZlcnRpY2VzWzNdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7Cisg
ICAgICAgIC8vIExpbmVzICgwLT4xKSwgKDItPjMpIGludGVyc2VjdCAtLSBvciBzaG91bGQsIG1v
ZHVsbyBudW1lcmljYWwKKyAgICAgICAgLy8gcHJlY2lzaW9uIGlzc3VlcworICAgICAgICBpZiAo
KG1fdmVydGljZXNbMV0ueHlDb29yZGluYXRlcygpIC0gbV92ZXJ0aWNlc1swXS54eUNvb3JkaW5h
dGVzKCkpLmRpYWdvbmFsTGVuZ3RoU3F1YXJlZCgpIDwKKyAgICAgICAgICAgIChtX3ZlcnRpY2Vz
WzNdLnh5Q29vcmRpbmF0ZXMoKSAtIG1fdmVydGljZXNbMl0ueHlDb29yZGluYXRlcygpKS5kaWFn
b25hbExlbmd0aFNxdWFyZWQoKSkgeworICAgICAgICAgICAgYWRkVHJpYW5nbGUoJm1fdmVydGlj
ZXNbMF0sICZtX3ZlcnRpY2VzWzJdLCAmbV92ZXJ0aWNlc1sxXSk7CisgICAgICAgICAgICBhZGRU
cmlhbmdsZSgmbV92ZXJ0aWNlc1swXSwgJm1fdmVydGljZXNbMV0sICZtX3ZlcnRpY2VzWzNdKTsK
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZFRyaWFuZ2xlKCZtX3ZlcnRpY2VzWzBd
LCAmbV92ZXJ0aWNlc1syXSwgJm1fdmVydGljZXNbM10pOworICAgICAgICAgICAgYWRkVHJpYW5n
bGUoJm1fdmVydGljZXNbM10sICZtX3ZlcnRpY2VzWzJdLCAmbV92ZXJ0aWNlc1sxXSk7CisgICAg
ICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OmFkZFRy
aWFuZ2xlKFZlcnRleCogdjAsIFZlcnRleCogdjEsIFZlcnRleCogdjIpCit7CisgICAgQVNTRVJU
KG1fbnVtYmVyT2ZUcmlhbmdsZXMgPCAzKTsKKyAgICBtX3RyaWFuZ2xlc1ttX251bWJlck9mVHJp
YW5nbGVzKytdLnNldFZlcnRpY2VzKHYwLCB2MSwgdjIpOworfQorCit2b2lkIExvb3BCbGlubkxv
Y2FsVHJpYW5ndWxhdG9yOjphZGRJbnRlcmlvclZlcnRleChWZXJ0ZXgqIHYpCit7CisgICAgQVNT
RVJUKG1fbnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzIDwgNCk7CisgICAgbV9pbnRlcmlvclZlcnRp
Y2VzW21fbnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzKytdID0gdjsKKyAgICB2LT5zZXRNYXJrZWQo
dHJ1ZSk7Cit9CisKK2Jvb2wgTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3I6OmlzU2hhcmVkRWRn
ZShWZXJ0ZXgqIHYwLCBWZXJ0ZXgqIHYxKQoreworICAgIGJvb2wgaGF2ZUVkZ2UwMSA9IGZhbHNl
OworICAgIGJvb2wgaGF2ZUVkZ2UxMCA9IGZhbHNlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
bnVtYmVyT2ZUcmlhbmdsZXMoKTsgKytpKSB7CisgICAgICAgIFRyaWFuZ2xlKiB0cmkgPSBnZXRU
cmlhbmdsZShpKTsKKyAgICAgICAgaWYgKHRyaS0+Y29udGFpbnModjApICYmIHRyaS0+bmV4dFZl
cnRleCh2MCwgdHJ1ZSkgPT0gdjEpCisgICAgICAgICAgICBoYXZlRWRnZTAxID0gdHJ1ZTsKKyAg
ICAgICAgaWYgKHRyaS0+Y29udGFpbnModjEpICYmIHRyaS0+bmV4dFZlcnRleCh2MSwgdHJ1ZSkg
PT0gdjApCisgICAgICAgICAgICBoYXZlRWRnZTEwID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJu
IGhhdmVFZGdlMDEgJiYgaGF2ZUVkZ2UxMDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uTG9jYWxUcmlhbmd1
bGF0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9Mb29w
Qmxpbm5Mb2NhbFRyaWFuZ3VsYXRvci5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ncHUvTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3IuaAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAq
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIExvb3BCbGlubkxvY2FsVHJpYW5ndWxh
dG9yX2gKKyNkZWZpbmUgTG9vcEJsaW5uTG9jYWxUcmlhbmd1bGF0b3JfaAorCisjaW5jbHVkZSAi
RmxvYXRQb2ludC5oIgorI2luY2x1ZGUgIkZsb2F0UG9pbnQzRC5oIgorI2luY2x1ZGUgIkxvb3BC
bGlubkNvbnN0YW50cy5oIgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8
d3RmL05vbmNvcHlhYmxlLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gUGVyZm9ybXMg
YSBsb2NhbGl6ZWQgdHJpYW5ndWxhdGlvbiBvZiB0aGUgdHJpYW5nbGUgbWVzaAorLy8gY29ycmVz
cG9uZGluZyB0byB0aGUgZm91ciBjb250cm9sIHBvaW50IHZlcnRpY2VzIG9mIGEgY3ViaWMgY3Vy
dmUKKy8vIHNlZ21lbnQuCitjbGFzcyBMb29wQmxpbm5Mb2NhbFRyaWFuZ3VsYXRvciA6IHB1Ymxp
YyBOb25jb3B5YWJsZSB7CitwdWJsaWM6CisgICAgLy8gVGhlIHZlcnRpY2VzIHRoYXQgdGhlIHRy
aWFuZ3VsYXRvciBvcGVyYXRlcyB1cG9uLCBjb250YWluaW5nIGJvdGgKKyAgICAvLyB0aGUgcG9z
aXRpb24gaW5mb3JtYXRpb24gYXMgd2VsbCBhcyB0aGUgY3ViaWMgdGV4dHVyZQorICAgIC8vIGNv
b3JkaW5hdGVzLgorICAgIGNsYXNzIFZlcnRleCA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CisgICAg
cHVibGljOgorICAgICAgICBWZXJ0ZXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXNldEZs
YWdzKCk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBGbG9hdFBvaW50JiB4eUNvb3JkaW5h
dGVzKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1feHlDb29yZGluYXRl
czsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IEZsb2F0UG9pbnQzRCYga2xtQ29vcmRpbmF0
ZXMoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9rbG1Db29yZGluYXRl
czsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHMgdGhlIHBvc2l0aW9uIGFuZCB0ZXh0dXJl
IGNvb3JkaW5hdGVzIG9mIHRoZSB2ZXJ0ZXguCisgICAgICAgIHZvaWQgc2V0KGZsb2F0IHgsIGZs
b2F0IHksCisgICAgICAgICAgICAgICAgIGZsb2F0IGssIGZsb2F0IGwsIGZsb2F0IG0pCisgICAg
ICAgIHsKKyAgICAgICAgICAgIG1feHlDb29yZGluYXRlcy5zZXQoeCwgeSk7CisgICAgICAgICAg
ICBtX2tsbUNvb3JkaW5hdGVzLnNldChrLCBsLCBtKTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IEZsYWdzIGZvciB3YWxraW5nIGZyb20gdGhlIHN0YXJ0IHZlcnRleCB0byB0aGUgZW5kIHZlcnRl
eC4KKyAgICAgICAgYm9vbCBlbmQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9l
bmQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldEVuZChib29sIGVuZCkKKyAgICAgICAg
eworICAgICAgICAgICAgbV9lbmQgPSBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBib29sIG1h
cmtlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtX21hcmtlZDsKKyAgICAgICAg
fQorCisgICAgICAgIHZvaWQgc2V0TWFya2VkKGJvb2wgbWFya2VkKQorICAgICAgICB7CisgICAg
ICAgICAgICBtX21hcmtlZCA9IG1hcmtlZDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgaW50
ZXJpb3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbV9pbnRlcmlvcjsKKyAgICAg
ICAgfQorCisgICAgICAgIHZvaWQgc2V0SW50ZXJpb3IoYm9vbCBpbnRlcmlvcikKKyAgICAgICAg
eworICAgICAgICAgICAgbV9pbnRlcmlvciA9IGludGVyaW9yOworICAgICAgICB9CisKKyAgICAg
ICAgdm9pZCByZXNldEZsYWdzKCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9lbmQgPSBmYWxz
ZTsKKyAgICAgICAgICAgIG1fbWFya2VkID0gZmFsc2U7CisgICAgICAgICAgICBtX2ludGVyaW9y
ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIDJEIGNvb3Jk
aW5hdGVzIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIHBsYW5lLgorICAgICAgICBGbG9hdFBvaW50IG1f
eHlDb29yZGluYXRlczsKKyAgICAgICAgLy8gQ3ViaWMgdGV4dHVyZSBjb29yZGluYXRlcyBmb3Ig
cmVuZGVyaW5nIHRoZSBjdXJ2ZS4KKyAgICAgICAgRmxvYXRQb2ludDNEIG1fa2xtQ29vcmRpbmF0
ZXM7CisKKyAgICAgICAgLy8gRmxhZ3MgZm9yIHdhbGtpbmcgZnJvbSB0aGUgc3RhcnQgdmVydGV4
IHRvIHRoZSBlbmQgdmVydGV4LgorICAgICAgICBib29sIG1fZW5kOworICAgICAgICBib29sIG1f
bWFya2VkOworICAgICAgICBib29sIG1faW50ZXJpb3I7CisgICAgfTsKKworICAgIC8vIFRoZSB0
cmlhbmdsZXMgdGhlIFRyaWFuZ3VsYXRvciBwcm9kdWNlcy4KKyAgICBjbGFzcyBUcmlhbmdsZSB7
CisgICAgcHVibGljOgorICAgICAgICBUcmlhbmdsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAg
IG1fdmVydGljZXNbMF0gPSAwOworICAgICAgICAgICAgbV92ZXJ0aWNlc1sxXSA9IDA7CisgICAg
ICAgICAgICBtX3ZlcnRpY2VzWzJdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldHMg
dGhlIHZlcnRleCBhdCB0aGUgZ2l2ZW4gaW5kZXgsIDAgPD0gaW5kZXggPCAzLgorICAgICAgICBW
ZXJ0ZXgqIGdldFZlcnRleChpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VS
VChpbmRleCA+PSAwICYmIGluZGV4IDwgMyk7CisgICAgICAgICAgICByZXR1cm4gbV92ZXJ0aWNl
c1tpbmRleF07CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB0
cmlhbmdsZSBjb250YWlucyB0aGUgZ2l2ZW4gdmVydGV4IChieQorICAgICAgICAvLyBpZGVudGl0
eSwgbm90IGdlb21ldHJpY2FsbHkpLgorICAgICAgICBib29sIGNvbnRhaW5zKFZlcnRleCogdik7
CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgdmVydGV4IGZvbGxvd2luZyB0aGUgY3VycmVudCBv
bmUgaW4gdGhlIHNwZWNpZmllZAorICAgICAgICAvLyBkaXJlY3Rpb24sIGNvdW50ZXJjbG9ja3dp
c2Ugb3IgY2xvY2t3aXNlLgorICAgICAgICBWZXJ0ZXgqIG5leHRWZXJ0ZXgoVmVydGV4KiBjdXJy
ZW50LCBib29sIHRyYXZlcnNlQ291bnRlckNsb2Nrd2lzZSk7CisKKyAgICAgICAgLy8gU2V0cyB0
aGUgdmVydGljZXMgb2YgdGhpcyB0cmlhbmdsZSwgcG90ZW50aWFsbHkgcmVvcmRlcmluZyB0aGVt
CisgICAgICAgIC8vIHRvIHByb2R1Y2UgYSBjYW5vbmljYWwgb3JpZW50YXRpb24uCisgICAgICAg
IHZvaWQgc2V0VmVydGljZXMoVmVydGV4KiB2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBW
ZXJ0ZXgqIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnRleCogdjIpCisgICAgICAg
IHsKKyAgICAgICAgICAgIG1fdmVydGljZXNbMF0gPSB2MDsKKyAgICAgICAgICAgIG1fdmVydGlj
ZXNbMV0gPSB2MTsKKyAgICAgICAgICAgIG1fdmVydGljZXNbMl0gPSB2MjsKKyAgICAgICAgICAg
IG1ha2VDb3VudGVyQ2xvY2t3aXNlKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAg
ICAgIC8vIFJldHVybnMgdGhlIGluZGV4IFswLi4yXSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVu
IHZlcnRleCwgb3IKKyAgICAgICAgLy8gLTEgaWYgbm90IGZvdW5kLgorICAgICAgICBpbnQgaW5k
ZXhGb3JWZXJ0ZXgoVmVydGV4KiB2ZXJ0ZXgpOworCisgICAgICAgIC8vIFJlb3JkZXJzIHRoZSB2
ZXJ0aWNlcyBpbiB0aGlzIHRyaWFuZ2xlIHRvIG1ha2UgdGhlbQorICAgICAgICAvLyBjb3VudGVy
Y2xvY2t3aXNlIHdoZW4gdmlld2VkIGluIHRoZSAyRCBwbGFuZSwgaW4gb3JkZXIgdG8KKyAgICAg
ICAgLy8gYWNoaWV2ZSBhIGNhbm9uaWNhbCBvcmRlcmluZy4KKyAgICAgICAgdm9pZCBtYWtlQ291
bnRlckNsb2Nrd2lzZSgpOworCisgICAgICAgIC8vIE5vdGU6IHRoZXNlIGFyZSByYXcgcG9pbnRl
cnMgYmVjYXVzZSB0aGV5IHBvaW50IHRvIHRoZQorICAgICAgICAvLyBtX3ZlcnRpY2VzIGNvbnRh
aW5lZCBpbiB0aGUgc3Vycm91bmRpbmcgdHJpYW5ndWxhdG9yLgorICAgICAgICBWZXJ0ZXgqIG1f
dmVydGljZXNbM107CisgICAgfTsKKworICAgIExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yKCk7
CisKKyAgICAvLyBSZXNldHMgdGhlIHRyaWFuZ3VsYXRvcidzIHN0YXRlLiBBZnRlciBlYWNoIHRy
aWFuZ3VsYXRpb24gYW5kCisgICAgLy8gYmVmb3JlIHRoZSBuZXh0LCBjYWxsIHRoaXMgdG8gcmUt
aW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwKKyAgICAvLyB2ZXJ0aWNlcycgc3RhdGUuCisgICAgdm9p
ZCByZXNldCgpOworCisgICAgLy8gUmV0dXJucyBhIG11dGFibGUgdmVydGV4IHN0b3JlZCBpbiB0
aGUgdHJpYW5ndWxhdG9yLiBVc2UgdGhpcyB0bworICAgIC8vIHNldCB1cCB0aGUgdmVydGljZXMg
YmVmb3JlIGEgdHJpYW5ndWxhdGlvbi4KKyAgICBWZXJ0ZXgqIGdldFZlcnRleChpbnQgaW5kZXgp
CisgICAgeworICAgICAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IDQpOworICAgICAg
ICByZXR1cm4gJm1fdmVydGljZXNbaW5kZXhdOworICAgIH0KKworICAgIGVudW0gSW5zaWRlRWRn
ZUNvbXB1dGF0aW9uIHsKKyAgICAgICAgQ29tcHV0ZUluc2lkZUVkZ2VzLAorICAgICAgICBEb250
Q29tcHV0ZUluc2lkZUVkZ2VzCisgICAgfTsKKworICAgIC8vIE9uY2UgdGhlIHZlcnRpY2VzJyBj
b250ZW50cyBoYXZlIGJlZW4gc2V0IHVwLCBjYWxsIHRyaWFuZ3VsYXRlKCkKKyAgICAvLyB0byBy
ZWNvbXB1dGUgdGhlIHRyaWFuZ2xlcy4KKyAgICAvLworICAgIC8vIElmIGNvbXB1dGVJbnNpZGVF
ZGdlcyBpcyBDb21wdXRlSW5zaWRlRWRnZXMsIHRoZW4gc2lkZVRvRmlsbAorICAgIC8vIHdpbGwg
YmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggc2lkZSBvZiB0aGUgY3ViaWMgY3VydmUgZGVmaW5l
ZAorICAgIC8vIGJ5IHRoZSBmb3VyIGNvbnRyb2wgcG9pbnRzIGlzIHRvIGJlIGZpbGxlZC4KKyAg
ICAvLworICAgIC8vIFRoZSB0cmlhbmd1bGF0aW9uIG9iZXlzIHRoZSBmb2xsb3dpbmcgZ3VhcmFu
dGVlczoKKyAgICAvLyAgIC0gSWYgdGhlIGNvbnZleCBodWxsIGlzIGEgcXVhZHJpbGF0ZXJhbCwg
dGhlbiB0aGUgc2hvcnRlc3QgZWRnZQorICAgIC8vICAgICB3aWxsIGJlIGNob3NlbiBmb3IgdGhl
IGN1dCBpbnRvIHR3byB0cmlhbmdsZXMuCisgICAgLy8gICAtIElmIG9uZSBvZiB0aGUgdmVydGlj
ZXMgaXMgY29udGFpbmVkIGluIHRoZSB0cmlhbmdsZSBzcGFubmVkCisgICAgLy8gICAgIGJ5IHRo
ZSBvdGhlciB0aHJlZSwgdGhyZWUgdHJpYW5nbGVzIHdpbGwgYmUgcHJvZHVjZWQuCisgICAgdm9p
ZCB0cmlhbmd1bGF0ZShJbnNpZGVFZGdlQ29tcHV0YXRpb24gY29tcHV0ZUluc2lkZUVkZ2VzLAor
ICAgICAgICAgICAgICAgICAgICAgTG9vcEJsaW5uQ29uc3RhbnRzOjpGaWxsU2lkZSBzaWRlVG9G
aWxsKTsKKworICAgIC8vIE51bWJlciBvZiB0cmlhbmdsZXMgY29tcHV0ZWQgYnkgdHJpYW5ndWxh
dGUoKS4KKyAgICBpbnQgbnVtYmVyT2ZUcmlhbmdsZXMoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIG1fbnVtYmVyT2ZUcmlhbmdsZXM7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUg
Y29tcHV0ZWQgdHJpYW5nbGUgYXQgaW5kZXgsIDAgPD0gaW5kZXggPCBudW1iZXJPZlRyaWFuZ2xl
cygpLgorICAgIFRyaWFuZ2xlKiBnZXRUcmlhbmdsZShpbnQgaW5kZXgpCisgICAgeworICAgICAg
ICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG1fbnVtYmVyT2ZUcmlhbmdsZXMpOworICAg
ICAgICByZXR1cm4gJm1fdHJpYW5nbGVzW2luZGV4XTsKKyAgICB9CisKKyAgICAvLyBOdW1iZXIg
b2YgdmVydGljZXMgZmFjaW5nIHRoZSBpbnNpZGUgb2YgdGhlIHNoYXBlLCBpZgorICAgIC8vIENv
bXB1dGVJbnNpZGVFZGdlcyB3YXMgcGFzc2VkIHdoZW4gdHJpYW5ndWxhdGUoKSB3YXMgY2FsbGVk
LgorICAgIGludCBudW1iZXJPZkludGVyaW9yVmVydGljZXMoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG1fbnVtYmVyT2ZJbnRlcmlvclZlcnRpY2VzOworICAgIH0KKworICAgIC8vIEZl
dGNoZXMgdGhlIGdpdmVuIGludGVyaW9yIHZlcnRleCwgMCA8PSBpbmRleCA8IG51bWJlck9mSW50
ZXJpb3JWZXJ0aWNlcygpLgorICAgIFZlcnRleCogZ2V0SW50ZXJpb3JWZXJ0ZXgoaW50IGluZGV4
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKGluZGV4ID49IDAgJiYgaW5kZXggPCBtX251bWJlck9m
SW50ZXJpb3JWZXJ0aWNlcyk7CisgICAgICAgIHJldHVybiBtX2ludGVyaW9yVmVydGljZXNbaW5k
ZXhdOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHRyaWFuZ3VsYXRlSGVscGVyKExvb3BC
bGlubkNvbnN0YW50czo6RmlsbFNpZGUgc2lkZVRvRmlsbCk7CisKKyAgICAvLyBBZGRzIGEgdHJp
YW5nbGUgdG8gdGhlIHRyaWFuZ3VsYXRpb24uCisgICAgdm9pZCBhZGRUcmlhbmdsZShWZXJ0ZXgq
IHYwLCBWZXJ0ZXgqIHYxLCBWZXJ0ZXgqIHYyKTsKKworICAgIC8vIEFkZHMgYSB2ZXJ0ZXggdG8g
dGhlIGxpc3Qgb2YgaW50ZXJpb3IgdmVydGljZXMuCisgICAgdm9pZCBhZGRJbnRlcmlvclZlcnRl
eChWZXJ0ZXgqIHYpOworCisgICAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVkZ2UgYmV0d2Vl
biB2ZXJ0ZXggdjAgYW5kIHYxIGlzIHNoYXJlZAorICAgIC8vIGJldHdlZW4gdHdvIG9yIG1vcmUg
dHJpYW5nbGVzLgorICAgIGJvb2wgaXNTaGFyZWRFZGdlKFZlcnRleCogdjAsIFZlcnRleCogdjEp
OworCisgICAgLy8gVGhlIHZlcnRpY2VzIGJlaW5nIHRyaWFuZ3VsYXRlZC4KKyAgICBWZXJ0ZXgg
bV92ZXJ0aWNlc1s0XTsKKworICAgIC8vIFRoZSB2ZXJ0aWNlcyBjb3JyZXNwb25kaW5nIHRvIHRo
ZSBlZGdlcyBmYWNpbmcgdGhlIGluc2lkZSBvZiB0aGUKKyAgICAvLyBzaGFwZSwgaW4gb3JkZXIg
ZnJvbSB0aGUgc3RhcnQgdmVydGV4IHRvIHRoZSBlbmQgdmVydGV4LiBUaGUgbW9yZQorICAgIC8v
IGdlbmVyYWwgdHJpYW5ndWxhdGlvbiBhbGdvcml0aG0gdGVzc2VsbGF0ZXMgdGhpcyBpbnRlcmlv
ciByZWdpb24uCisgICAgVmVydGV4KiBtX2ludGVyaW9yVmVydGljZXNbNF07CisgICAgLy8gVGhl
IG51bWJlciBvZiBpbnRlcmlvciB2ZXJ0aWNlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhlIGN1cnJl
bnQKKyAgICAvLyB0cmlhbmd1bGF0aW9uLgorICAgIGludCBtX251bWJlck9mSW50ZXJpb3JWZXJ0
aWNlczsKKworICAgIC8vIFRoZXJlIGNhbiBiZSBhdCBtb3N0IHRocmVlIHRyaWFuZ2xlcyBjb21w
dXRlZCBieSB0aGlzIGxvY2FsCisgICAgLy8gYWxnb3JpdGhtLCB3aGljaCBvY2N1cnMgd2hlbiBv
bmUgb2YgdGhlIHZlcnRpY2VzIGlzIGNvbnRhaW5lZCBpbgorICAgIC8vIHRoZSB0cmlhbmdsZSBz
cGFubmVkIGJ5IHRoZSBvdGhlciB0aHJlZS4gTW9zdCBvZiB0aGUgdGltZSB0aGUKKyAgICAvLyBh
bGdvcml0aG0gY29tcHV0ZXMgdHdvIHRyaWFuZ2xlcy4KKyAgICBUcmlhbmdsZSBtX3RyaWFuZ2xl
c1szXTsKKyAgICBpbnQgbV9udW1iZXJPZlRyaWFuZ2xlczsKK307CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmIC8vIExvb3BCbGlubkxvY2FsVHJpYW5ndWxhdG9yX2gK
</data>
<flag name="review"
          id="56376"
          type_id="1"
          status="+"
          setter="jamesr"
    />
    <flag name="commit-queue"
          id="56377"
          type_id="3"
          status="-"
          setter="kbr"
    />
          </attachment>
      

    </bug>

</bugzilla>