<?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>261651</bug_id>
          
          <creation_ts>2023-09-17 04:33:55 -0700</creation_ts>
          <short_desc>SVGTextQuery Performance Optimizations</short_desc>
          <delta_ts>2023-10-02 17:56:04 -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>SVG</component>
          <version>Safari Technology Preview</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>CONFIGURATION CHANGED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=262347</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=262373</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=262382</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=262457</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=262458</see_also>
    
    <see_also>https://bugs.webkit.org/show_bug.cgi?id=262488</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ahmad Saleem">ahmad.saleem792</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>heycam</cc>
    
    <cc>sabouhallawa</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>zimmermann</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1977897</commentid>
    <comment_count>0</comment_count>
    <who name="Ahmad Saleem">ahmad.saleem792</who>
    <bug_when>2023-09-17 04:33:55 -0700</bug_when>
    <thetext>Hi Team,

While going through Blink&apos;s SVG fixes, came across SVGTextQuery optimization and it significantly improves the following test case in local build:

Test Case (NOTE - we might have already bug for this): https://web.archive.org/web/20150712020900/http://output.jsbin.com/imajow/1/quiet

Blink Merges (which at least work - on my level): https://src.chromium.org/viewvc/blink?view=revision&amp;revision=177089 &amp; https://src.chromium.org/viewvc/blink?view=revision&amp;revision=177148 [Partial bits and need to do std::max&lt;int&gt;] &amp; https://src.chromium.org/viewvc/blink?view=revision&amp;revision=177230 &amp; https://src.chromium.org/viewvc/blink?view=revision&amp;revision=177149

I don&apos;t know how to merge this: https://src.chromium.org/viewvc/blink?view=revision&amp;revision=177231

Even without the above one, we significantly improve the test case. I think we can land all other and then have the other separately tracked IMO. These are also useful because it is not something tied to LBSE and also we are in sleeping cycle where Safari 17.x will not get updated WebKit soon, so we can experiment with it.

I run it against our outdated WPT SVG and it didn&apos;t regress any test case as well.

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1977921</commentid>
    <comment_count>1</comment_count>
    <who name="Ahmad Saleem">ahmad.saleem792</who>
    <bug_when>2023-09-17 11:26:00 -0700</bug_when>
    <thetext>Manage to sort out other as well:

void SVGTextQuery::modifyStartEndPositionsRespectingLigatures(Data* queryData, const SVGTextFragment&amp; fragment, unsigned&amp; startPosition, unsigned&amp; endPosition) const
{
    SVGTextLayoutAttributes* layoutAttributes = queryData-&gt;textRenderer-&gt;layoutAttributes();
    Vector&lt;SVGTextMetrics&gt;&amp; textMetricsValues = layoutAttributes-&gt;textMetricsValues();

    unsigned textMetricsOffset = fragment.metricsListOffset;

    // Compute the offset of the fragment within the box, since that&apos;s the
    // space &lt;startPosition, endPosition&gt; is in (and that&apos;s what we need).
    int fragmentOffsetInBox = fragment.characterOffset - queryData-&gt;textBox-&gt;start();
    int fragmentEndInBox = fragmentOffsetInBox + fragment.length;
    // Find the text metrics cell that start at or contain the character startPosition.
    while (fragmentOffsetInBox &lt; fragmentEndInBox) {
        SVGTextMetrics&amp; metrics = textMetricsValues[textMetricsOffset];
        int glyphEnd = fragmentOffsetInBox + metrics.length();
        if (static_cast&lt;int&gt;(startPosition) &lt; glyphEnd)
            break;
        fragmentOffsetInBox = glyphEnd;
        textMetricsOffset++;
    }
    startPosition = fragmentOffsetInBox;

    // Find the text metrics cell that contain or ends at the character endPosition.
    while (fragmentOffsetInBox &lt; fragmentEndInBox) {
        SVGTextMetrics&amp; metrics = textMetricsValues[textMetricsOffset];
        fragmentOffsetInBox += metrics.length();
        if (fragmentOffsetInBox &gt;= static_cast&lt;int&gt;(endPosition))
            break;
        textMetricsOffset++;
    }

    endPosition = fragmentOffsetInBox;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1977923</commentid>
    <comment_count>2</comment_count>
    <who name="Ahmad Saleem">ahmad.saleem792</who>
    <bug_when>2023-09-17 11:37:57 -0700</bug_when>
    <thetext>This is another simplification on top of one from here: https://src.chromium.org/viewvc/blink?view=revision&amp;revision=193017</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1977925</commentid>
    <comment_count>3</comment_count>
      <attachid>467724</attachid>
    <who name="Ahmad Saleem">ahmad.saleem792</who>
    <bug_when>2023-09-17 11:41:28 -0700</bug_when>
    <thetext>Created attachment 467724
SVGTextQuery.cpp local file with changes from Blink Commits

Change in `SVGInlineTextBox.cpp`:

bool SVGInlineTextBox::mapStartEndPositionsIntoFragmentCoordinates(const SVGTextFragment&amp; fragment, unsigned&amp; startPosition, unsigned&amp; endPosition) const
{
    int fragmentOffsetInBox = static_cast&lt;int&gt;(fragment.characterOffset) - start();

    // Compute positions relative to the fragment.
    startPosition -= fragmentOffsetInBox;
    endPosition -= fragmentOffsetInBox;

    // Intersect with the fragment range.
    startPosition = std::max&lt;unsigned&gt;(startPosition, 0);
    endPosition = std::min&lt;unsigned&gt;(endPosition, static_cast&lt;int&gt;(fragment.length));

    return startPosition &lt; endPosition;
}

and attaching &apos;SVGTextQuery.cpp&apos; file with all my changes from this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1979625</commentid>
    <comment_count>4</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2023-09-24 04:34:15 -0700</bug_when>
    <thetext>&lt;rdar://problem/115953998&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1981924</commentid>
    <comment_count>5</comment_count>
    <who name="Ahmad Saleem">ahmad.saleem792</who>
    <bug_when>2023-10-02 17:56:04 -0700</bug_when>
    <thetext>Pretty much everything is done here - only pending work is in &apos;See Also&apos; and also has its own conclusion (issue) in 1-1 merge.

Marking this as &apos;RESOLVED CONFIGURATION CHANGED&apos;. Thanks!</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>467724</attachid>
            <date>2023-09-17 11:41:28 -0700</date>
            <delta_ts>2023-09-17 11:41:28 -0700</delta_ts>
            <desc>SVGTextQuery.cpp local file with changes from Blink Commits</desc>
            <filename>SVGTextQuery.cpp</filename>
            <type>text/plain</type>
            <size>18473</size>
            <attacher name="Ahmad Saleem">ahmad.saleem792</attacher>
            
              <data encoding="base64">LyoKICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDEwLTIwMTIu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIENvcHlyaWdodCAoQykgMjAxNCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAq
CiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bwogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAogKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KICov
CgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJTVkdUZXh0UXVlcnkuaCIKCiNpbmNsdWRl
ICJGbG9hdENvbnZlcnNpb24uaCIKI2luY2x1ZGUgIkxlZ2FjeUlubGluZUZsb3dCb3guaCIKI2lu
Y2x1ZGUgIlJlbmRlckJsb2NrRmxvdy5oIgojaW5jbHVkZSAiUmVuZGVySW5saW5lLmgiCiNpbmNs
dWRlICJSZW5kZXJTVkdJbmxpbmVUZXh0LmgiCiNpbmNsdWRlICJSZW5kZXJTVkdUZXh0LmgiCiNp
bmNsdWRlICJTVkdFbGVtZW50VHlwZUhlbHBlcnMuaCIKI2luY2x1ZGUgIlNWR0lubGluZVRleHRC
b3hJbmxpbmVzLmgiCiNpbmNsdWRlICJWaXNpYmxlUG9zaXRpb24uaCIKCiNpbmNsdWRlIDx3dGYv
TWF0aEV4dHJhcy5oPgoKbmFtZXNwYWNlIFdlYkNvcmUgewoKLy8gQmFzZSBzdHJ1Y3R1cmUgZm9y
IGNhbGxiYWNrIHVzZXIgZGF0YQpzdHJ1Y3QgU1ZHVGV4dFF1ZXJ5OjpEYXRhIHsKICAgIERhdGEo
KQogICAgICAgIDogaXNWZXJ0aWNhbFRleHQoZmFsc2UpCiAgICAgICAgLCBwcm9jZXNzZWRDaGFy
YWN0ZXJzKDApCiAgICAgICAgLCB0ZXh0UmVuZGVyZXIoMCkKICAgICAgICAsIHRleHRCb3goMCkK
ICAgIHsKICAgIH0KCiAgICBib29sIGlzVmVydGljYWxUZXh0OwogICAgdW5zaWduZWQgcHJvY2Vz
c2VkQ2hhcmFjdGVyczsKICAgIFJlbmRlclNWR0lubGluZVRleHQqIHRleHRSZW5kZXJlcjsKICAg
IGNvbnN0IFNWR0lubGluZVRleHRCb3gqIHRleHRCb3g7Cn07CgpzdGF0aWMgaW5saW5lIExlZ2Fj
eUlubGluZUZsb3dCb3gqIGZsb3dCb3hGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QqIHJlbmRlcmVy
KQp7CiAgICBpZiAoIXJlbmRlcmVyKQogICAgICAgIHJldHVybiBudWxscHRyOwoKICAgIGlmIChp
czxSZW5kZXJCbG9ja0Zsb3c+KCpyZW5kZXJlcikpIHsKICAgICAgICAvLyBJZiB3ZSdyZSBnaXZl
biBhIGJsb2NrIGVsZW1lbnQsIGl0IGhhcyB0byBiZSBhIFJlbmRlclNWR1RleHQuCiAgICAgICAg
QVNTRVJUKGlzPFJlbmRlclNWR1RleHQ+KCpyZW5kZXJlcikpOwogICAgICAgIFJlbmRlckJsb2Nr
RmxvdyYgcmVuZGVyQmxvY2sgPSBkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCpyZW5kZXJlcik7
CgogICAgICAgIC8vIFJlbmRlclNWR1RleHQgb25seSBldmVyIGNvbnRhaW5zIGEgc2luZ2xlIGxp
bmUgYm94LgogICAgICAgIGF1dG8gZmxvd0JveCA9IHJlbmRlckJsb2NrLmZpcnN0Um9vdEJveCgp
OwogICAgICAgIEFTU0VSVChmbG93Qm94ID09IHJlbmRlckJsb2NrLmxhc3RSb290Qm94KCkpOwog
ICAgICAgIHJldHVybiBmbG93Qm94OwogICAgfQoKICAgIGlmIChpczxSZW5kZXJJbmxpbmU+KCpy
ZW5kZXJlcikpIHsKICAgICAgICAvLyBXZSdyZSBnaXZlbiBhIFJlbmRlclNWR0lubGluZSBvciBv
YmplY3RzIHRoYXQgZGVyaXZlIGZyb20gaXQgKFJlbmRlclNWR1RTcGFuIC8gUmVuZGVyU1ZHVGV4
dFBhdGgpCiAgICAgICAgUmVuZGVySW5saW5lJiByZW5kZXJJbmxpbmUgPSBkb3duY2FzdDxSZW5k
ZXJJbmxpbmU+KCpyZW5kZXJlcik7CgogICAgICAgIC8vIFJlbmRlclNWR0lubGluZSBvbmx5IGV2
ZXIgY29udGFpbnMgYSBzaW5nbGUgbGluZSBib3guCiAgICAgICAgTGVnYWN5SW5saW5lRmxvd0Jv
eCogZmxvd0JveCA9IHJlbmRlcklubGluZS5maXJzdExpbmVCb3goKTsKICAgICAgICBBU1NFUlQo
Zmxvd0JveCA9PSByZW5kZXJJbmxpbmUubGFzdExpbmVCb3goKSk7CiAgICAgICAgcmV0dXJuIGZs
b3dCb3g7CiAgICB9CgogICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICByZXR1cm4gbnVsbHB0
cjsKfQoKU1ZHVGV4dFF1ZXJ5OjpTVkdUZXh0UXVlcnkoUmVuZGVyT2JqZWN0KiByZW5kZXJlcikK
ewogICAgY29sbGVjdFRleHRCb3hlc0luRmxvd0JveChmbG93Qm94Rm9yUmVuZGVyZXIocmVuZGVy
ZXIpKTsKfQoKdm9pZCBTVkdUZXh0UXVlcnk6OmNvbGxlY3RUZXh0Qm94ZXNJbkZsb3dCb3goTGVn
YWN5SW5saW5lRmxvd0JveCogZmxvd0JveCkKewogICAgaWYgKCFmbG93Qm94KQogICAgICAgIHJl
dHVybjsKCiAgICBmb3IgKGF1dG8qIGNoaWxkID0gZmxvd0JveC0+Zmlyc3RDaGlsZCgpOyBjaGls
ZDsgY2hpbGQgPSBjaGlsZC0+bmV4dE9uTGluZSgpKSB7CiAgICAgICAgaWYgKGlzPExlZ2FjeUlu
bGluZUZsb3dCb3g+KCpjaGlsZCkpIHsKICAgICAgICAgICAgLy8gU2tpcCBnZW5lcmF0ZWQgY29u
dGVudC4KICAgICAgICAgICAgaWYgKCFjaGlsZC0+cmVuZGVyZXIoKS5ub2RlKCkpCiAgICAgICAg
ICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGNvbGxlY3RUZXh0Qm94ZXNJbkZsb3dCb3go
ZG93bmNhc3Q8TGVnYWN5SW5saW5lRmxvd0JveD4oY2hpbGQpKTsKICAgICAgICAgICAgY29udGlu
dWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXM8U1ZHSW5saW5lVGV4dEJveD4oKmNoaWxkKSkK
ICAgICAgICAgICAgbV90ZXh0Qm94ZXMuYXBwZW5kKGRvd25jYXN0PFNWR0lubGluZVRleHRCb3g+
KGNoaWxkKSk7CiAgICB9Cn0KCmJvb2wgU1ZHVGV4dFF1ZXJ5OjpleGVjdXRlUXVlcnkoRGF0YSog
cXVlcnlEYXRhLCBQcm9jZXNzVGV4dEZyYWdtZW50Q2FsbGJhY2sgZnJhZ21lbnRDYWxsYmFjaykg
Y29uc3QKewogICAgQVNTRVJUKCFtX3RleHRCb3hlcy5pc0VtcHR5KCkpOwoKICAgIHVuc2lnbmVk
IHByb2Nlc3NlZENoYXJhY3RlcnMgPSAwOwogICAgdW5zaWduZWQgdGV4dEJveENvdW50ID0gbV90
ZXh0Qm94ZXMuc2l6ZSgpOwoKICAgIC8vIExvb3Agb3ZlciBhbGwgdGV4dCBib3hlcwogICAgZm9y
ICh1bnNpZ25lZCB0ZXh0Qm94UG9zaXRpb24gPSAwOyB0ZXh0Qm94UG9zaXRpb24gPCB0ZXh0Qm94
Q291bnQ7ICsrdGV4dEJveFBvc2l0aW9uKSB7CiAgICAgICAgcXVlcnlEYXRhLT50ZXh0Qm94ID0g
bV90ZXh0Qm94ZXMuYXQodGV4dEJveFBvc2l0aW9uKTsKICAgICAgICBxdWVyeURhdGEtPnRleHRS
ZW5kZXJlciA9ICZxdWVyeURhdGEtPnRleHRCb3gtPnJlbmRlcmVyKCk7CgogICAgICAgIHF1ZXJ5
RGF0YS0+aXNWZXJ0aWNhbFRleHQgPSBxdWVyeURhdGEtPnRleHRSZW5kZXJlci0+c3R5bGUoKS5p
c1ZlcnRpY2FsV3JpdGluZ01vZGUoKTsKICAgICAgICBjb25zdCBWZWN0b3I8U1ZHVGV4dEZyYWdt
ZW50PiYgZnJhZ21lbnRzID0gcXVlcnlEYXRhLT50ZXh0Qm94LT50ZXh0RnJhZ21lbnRzKCk7CiAg
ICAKICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRleHQgZnJhZ21lbnRzIGluIHRoaXMgdGV4dCBi
b3gsIGZpcmluZyBhIGNhbGxiYWNrIGZvciBlYWNoLgogICAgICAgIHVuc2lnbmVkIGZyYWdtZW50
Q291bnQgPSBmcmFnbWVudHMuc2l6ZSgpOwogICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBmcmFnbWVudENvdW50OyArK2kpIHsKICAgICAgICAgICAgY29uc3QgU1ZHVGV4dEZyYWdtZW50
JiBmcmFnbWVudCA9IGZyYWdtZW50cy5hdChpKTsKICAgICAgICAgICAgaWYgKCh0aGlzLT4qZnJh
Z21lbnRDYWxsYmFjaykocXVlcnlEYXRhLCBmcmFnbWVudCkpCiAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKCiAgICAgICAgICAgIHByb2Nlc3NlZENoYXJhY3RlcnMgKz0gZnJhZ21lbnQubGVu
Z3RoOwogICAgICAgIH0KCiAgICAgICAgcXVlcnlEYXRhLT5wcm9jZXNzZWRDaGFyYWN0ZXJzID0g
cHJvY2Vzc2VkQ2hhcmFjdGVyczsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7Cn0KCmJvb2wgU1ZH
VGV4dFF1ZXJ5OjptYXBTdGFydEVuZFBvc2l0aW9uc0ludG9GcmFnbWVudENvb3JkaW5hdGVzKERh
dGEqIHF1ZXJ5RGF0YSwgY29uc3QgU1ZHVGV4dEZyYWdtZW50JiBmcmFnbWVudCwgdW5zaWduZWQm
IHN0YXJ0UG9zaXRpb24sIHVuc2lnbmVkJiBlbmRQb3NpdGlvbikgY29uc3QKewogICAgLy8gTWFr
ZSA8c3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24+IG9mZnNldHMgcmVsYXRpdmUgdG8gdGhlIGN1
cnJlbnQgdGV4dCBib3guCiAgICBBU1NFUlQoc3RhcnRQb3NpdGlvbiA+PSBxdWVyeURhdGEtPnBy
b2Nlc3NlZENoYXJhY3RlcnMpOwogICAgQVNTRVJUKGVuZFBvc2l0aW9uID49IHF1ZXJ5RGF0YS0+
cHJvY2Vzc2VkQ2hhcmFjdGVycyk7CiAgICBzdGFydFBvc2l0aW9uIC09IHF1ZXJ5RGF0YS0+cHJv
Y2Vzc2VkQ2hhcmFjdGVyczsKICAgIGVuZFBvc2l0aW9uIC09IHF1ZXJ5RGF0YS0+cHJvY2Vzc2Vk
Q2hhcmFjdGVyczsKCiAgICAvLyBSZXVzZSB0aGUgc2FtZSBsb2dpYyB1c2VkIGZvciB0ZXh0IHNl
bGVjdGlvbiAmIHBhaW50aW5nLCB0byBtYXAgb3VyIHF1ZXJ5IHN0YXJ0L2xlbmd0aCBpbnRvIHN0
YXJ0L2VuZFBvc2l0aW9ucyBvZiB0aGUgY3VycmVudCB0ZXh0IGZyYWdtZW50LgogICAgaWYgKCFx
dWVyeURhdGEtPnRleHRCb3gtPm1hcFN0YXJ0RW5kUG9zaXRpb25zSW50b0ZyYWdtZW50Q29vcmRp
bmF0ZXMoZnJhZ21lbnQsIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKSkKICAgICAgICByZXR1
cm4gZmFsc2U7CgogICAgbW9kaWZ5U3RhcnRFbmRQb3NpdGlvbnNSZXNwZWN0aW5nTGlnYXR1cmVz
KHF1ZXJ5RGF0YSwgZnJhZ21lbnQsIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTsKICAgIEFT
U0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKHN0YXJ0UG9zaXRpb24gPCBlbmRQb3NpdGlv
bik7CiAgICByZXR1cm4gdHJ1ZTsKfQoKdm9pZCBTVkdUZXh0UXVlcnk6Om1vZGlmeVN0YXJ0RW5k
UG9zaXRpb25zUmVzcGVjdGluZ0xpZ2F0dXJlcyhEYXRhKiBxdWVyeURhdGEsIGNvbnN0IFNWR1Rl
eHRGcmFnbWVudCYgZnJhZ21lbnQsIHVuc2lnbmVkJiBzdGFydFBvc2l0aW9uLCB1bnNpZ25lZCYg
ZW5kUG9zaXRpb24pIGNvbnN0CnsKICAgIGNvbnN0IFZlY3RvcjxTVkdUZXh0TWV0cmljcz4mIHRl
eHRNZXRyaWNzVmFsdWVzID0gcXVlcnlEYXRhLT50ZXh0UmVuZGVyZXItPmxheW91dEF0dHJpYnV0
ZXMoKS0+dGV4dE1ldHJpY3NWYWx1ZXMoKTsKCiAgICB1bnNpZ25lZCB0ZXh0TWV0cmljc09mZnNl
dCA9IGZyYWdtZW50Lm1ldHJpY3NMaXN0T2Zmc2V0OwogICAgaW50IGZyYWdtZW50T2Zmc2V0ID0g
MDsKICAgIGludCBmcmFnbWVudEVuZCA9IHN0YXRpY19jYXN0PGludD4oZnJhZ21lbnQubGVuZ3Ro
KTsKCiAgICAvLyBGaW5kIHRoZSB0ZXh0IG1ldHJpY3MgY2VsbCB0aGF0IHN0YXJ0IGF0IG9yIGNv
bnRhaW4gdGhlIGNoYXJhY3RlciBzdGFydFBvc2l0aW9uLgogICAgd2hpbGUgKGZyYWdtZW50T2Zm
c2V0IDwgZnJhZ21lbnRFbmQpIHsKICAgICAgICBjb25zdCBTVkdUZXh0TWV0cmljcyYgbWV0cmlj
cyA9IHRleHRNZXRyaWNzVmFsdWVzW3RleHRNZXRyaWNzT2Zmc2V0XTsKICAgICAgICBpbnQgZ2x5
cGhFbmQgPSBmcmFnbWVudE9mZnNldCArIG1ldHJpY3MubGVuZ3RoKCk7CiAgICAgICAgaWYgKHN0
YXRpY19jYXN0PGludD4oc3RhcnRQb3NpdGlvbikgPCBnbHlwaEVuZCkKICAgICAgICAgICAgYnJl
YWs7CiAgICAgICAgZnJhZ21lbnRPZmZzZXQgPSBnbHlwaEVuZDsKICAgICAgICB0ZXh0TWV0cmlj
c09mZnNldCsrOwogICAgfQogICAgc3RhcnRQb3NpdGlvbiA9IGZyYWdtZW50T2Zmc2V0OwoKICAg
IC8vIEZpbmQgdGhlIHRleHQgbWV0cmljcyBjZWxsIHRoYXQgY29udGFpbiBvciBlbmRzIGF0IHRo
ZSBjaGFyYWN0ZXIgZW5kUG9zaXRpb24uCiAgICB3aGlsZSAoZnJhZ21lbnRPZmZzZXQgPCBmcmFn
bWVudEVuZCkgewogICAgICAgIGNvbnN0IFNWR1RleHRNZXRyaWNzJiBtZXRyaWNzID0gdGV4dE1l
dHJpY3NWYWx1ZXNbdGV4dE1ldHJpY3NPZmZzZXRdOwogICAgICAgIGZyYWdtZW50T2Zmc2V0ICs9
IG1ldHJpY3MubGVuZ3RoKCk7CiAgICAgICAgaWYgKGZyYWdtZW50T2Zmc2V0ID49IHN0YXRpY19j
YXN0PGludD4oZW5kUG9zaXRpb24pKQogICAgICAgICAgICBicmVhazsKICAgICAgICB0ZXh0TWV0
cmljc09mZnNldCsrOwogICAgfQoKICAgIGVuZFBvc2l0aW9uID0gZnJhZ21lbnRPZmZzZXQ7Cn0K
Ci8vIG51bWJlck9mQ2hhcmFjdGVycygpIGltcGxlbWVudGF0aW9uCmJvb2wgU1ZHVGV4dFF1ZXJ5
OjpudW1iZXJPZkNoYXJhY3RlcnNDYWxsYmFjayhEYXRhKiwgY29uc3QgU1ZHVGV4dEZyYWdtZW50
JikgY29uc3QKewogICAgLy8gbm8tb3AKICAgIHJldHVybiBmYWxzZTsKfQoKdW5zaWduZWQgU1ZH
VGV4dFF1ZXJ5OjpudW1iZXJPZkNoYXJhY3RlcnMoKSBjb25zdAp7CiAgICBpZiAobV90ZXh0Qm94
ZXMuaXNFbXB0eSgpKQogICAgICAgIHJldHVybiAwOwoKICAgIERhdGEgZGF0YTsKICAgIGV4ZWN1
dGVRdWVyeSgmZGF0YSwgJlNWR1RleHRRdWVyeTo6bnVtYmVyT2ZDaGFyYWN0ZXJzQ2FsbGJhY2sp
OwogICAgcmV0dXJuIGRhdGEucHJvY2Vzc2VkQ2hhcmFjdGVyczsKfQoKLy8gdGV4dExlbmd0aCgp
IGltcGxlbWVudGF0aW9uCnN0cnVjdCBUZXh0TGVuZ3RoRGF0YSA6IFNWR1RleHRRdWVyeTo6RGF0
YSB7CiAgICBUZXh0TGVuZ3RoRGF0YSgpCiAgICAgICAgOiB0ZXh0TGVuZ3RoKDApCiAgICB7CiAg
ICB9CgogICAgZmxvYXQgdGV4dExlbmd0aDsKfTsKCmJvb2wgU1ZHVGV4dFF1ZXJ5Ojp0ZXh0TGVu
Z3RoQ2FsbGJhY2soRGF0YSogcXVlcnlEYXRhLCBjb25zdCBTVkdUZXh0RnJhZ21lbnQmIGZyYWdt
ZW50KSBjb25zdAp7CiAgICBUZXh0TGVuZ3RoRGF0YSogZGF0YSA9IHN0YXRpY19jYXN0PFRleHRM
ZW5ndGhEYXRhKj4ocXVlcnlEYXRhKTsKICAgIGRhdGEtPnRleHRMZW5ndGggKz0gcXVlcnlEYXRh
LT5pc1ZlcnRpY2FsVGV4dCA/IGZyYWdtZW50LmhlaWdodCA6IGZyYWdtZW50LndpZHRoOwogICAg
cmV0dXJuIGZhbHNlOwp9CgpmbG9hdCBTVkdUZXh0UXVlcnk6OnRleHRMZW5ndGgoKSBjb25zdAp7
CiAgICBpZiAobV90ZXh0Qm94ZXMuaXNFbXB0eSgpKQogICAgICAgIHJldHVybiAwOwoKICAgIFRl
eHRMZW5ndGhEYXRhIGRhdGE7CiAgICBleGVjdXRlUXVlcnkoJmRhdGEsICZTVkdUZXh0UXVlcnk6
OnRleHRMZW5ndGhDYWxsYmFjayk7CiAgICByZXR1cm4gZGF0YS50ZXh0TGVuZ3RoOwp9CgovLyBz
dWJTdHJpbmdMZW5ndGgoKSBpbXBsZW1lbnRhdGlvbgpzdHJ1Y3QgU3ViU3RyaW5nTGVuZ3RoRGF0
YSA6IFNWR1RleHRRdWVyeTo6RGF0YSB7CiAgICBTdWJTdHJpbmdMZW5ndGhEYXRhKHVuc2lnbmVk
IHF1ZXJ5U3RhcnRQb3NpdGlvbiwgdW5zaWduZWQgcXVlcnlMZW5ndGgpCiAgICAgICAgOiBzdGFy
dFBvc2l0aW9uKHF1ZXJ5U3RhcnRQb3NpdGlvbikKICAgICAgICAsIGxlbmd0aChxdWVyeUxlbmd0
aCkKICAgICAgICAsIHN1YlN0cmluZ0xlbmd0aCgwKQogICAgewogICAgfQoKICAgIHVuc2lnbmVk
IHN0YXJ0UG9zaXRpb247CiAgICB1bnNpZ25lZCBsZW5ndGg7CgogICAgZmxvYXQgc3ViU3RyaW5n
TGVuZ3RoOwp9OwoKYm9vbCBTVkdUZXh0UXVlcnk6OnN1YlN0cmluZ0xlbmd0aENhbGxiYWNrKERh
dGEqIHF1ZXJ5RGF0YSwgY29uc3QgU1ZHVGV4dEZyYWdtZW50JiBmcmFnbWVudCkgY29uc3QKewog
ICAgU3ViU3RyaW5nTGVuZ3RoRGF0YSogZGF0YSA9IHN0YXRpY19jYXN0PFN1YlN0cmluZ0xlbmd0
aERhdGEqPihxdWVyeURhdGEpOwoKICAgIHVuc2lnbmVkIHN0YXJ0UG9zaXRpb24gPSBkYXRhLT5z
dGFydFBvc2l0aW9uOwogICAgdW5zaWduZWQgZW5kUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uICsg
ZGF0YS0+bGVuZ3RoOwogICAgaWYgKCFtYXBTdGFydEVuZFBvc2l0aW9uc0ludG9GcmFnbWVudENv
b3JkaW5hdGVzKHF1ZXJ5RGF0YSwgZnJhZ21lbnQsIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9u
KSkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgU1ZHVGV4dE1ldHJpY3MgbWV0cmljcyA9IFNW
R1RleHRNZXRyaWNzOjptZWFzdXJlQ2hhcmFjdGVyUmFuZ2UoKnF1ZXJ5RGF0YS0+dGV4dFJlbmRl
cmVyLCBmcmFnbWVudC5jaGFyYWN0ZXJPZmZzZXQgKyBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlv
biAtIHN0YXJ0UG9zaXRpb24pOwogICAgZGF0YS0+c3ViU3RyaW5nTGVuZ3RoICs9IHF1ZXJ5RGF0
YS0+aXNWZXJ0aWNhbFRleHQgPyBtZXRyaWNzLmhlaWdodCgpIDogbWV0cmljcy53aWR0aCgpOwog
ICAgcmV0dXJuIGZhbHNlOwp9CgpmbG9hdCBTVkdUZXh0UXVlcnk6OnN1YlN0cmluZ0xlbmd0aCh1
bnNpZ25lZCBzdGFydFBvc2l0aW9uLCB1bnNpZ25lZCBsZW5ndGgpIGNvbnN0CnsKICAgIGlmICht
X3RleHRCb3hlcy5pc0VtcHR5KCkpCiAgICAgICAgcmV0dXJuIDA7CgogICAgU3ViU3RyaW5nTGVu
Z3RoRGF0YSBkYXRhKHN0YXJ0UG9zaXRpb24sIGxlbmd0aCk7CiAgICBleGVjdXRlUXVlcnkoJmRh
dGEsICZTVkdUZXh0UXVlcnk6OnN1YlN0cmluZ0xlbmd0aENhbGxiYWNrKTsKICAgIHJldHVybiBk
YXRhLnN1YlN0cmluZ0xlbmd0aDsKfQoKLy8gc3RhcnRQb3NpdGlvbk9mQ2hhcmFjdGVyKCkgaW1w
bGVtZW50YXRpb24Kc3RydWN0IFN0YXJ0UG9zaXRpb25PZkNoYXJhY3RlckRhdGEgOiBTVkdUZXh0
UXVlcnk6OkRhdGEgewogICAgU3RhcnRQb3NpdGlvbk9mQ2hhcmFjdGVyRGF0YSh1bnNpZ25lZCBx
dWVyeVBvc2l0aW9uKQogICAgICAgIDogcG9zaXRpb24ocXVlcnlQb3NpdGlvbikKICAgIHsKICAg
IH0KCiAgICB1bnNpZ25lZCBwb3NpdGlvbjsKICAgIEZsb2F0UG9pbnQgc3RhcnRQb3NpdGlvbjsK
fTsKCmJvb2wgU1ZHVGV4dFF1ZXJ5OjpzdGFydFBvc2l0aW9uT2ZDaGFyYWN0ZXJDYWxsYmFjayhE
YXRhKiBxdWVyeURhdGEsIGNvbnN0IFNWR1RleHRGcmFnbWVudCYgZnJhZ21lbnQpIGNvbnN0CnsK
ICAgIFN0YXJ0UG9zaXRpb25PZkNoYXJhY3RlckRhdGEqIGRhdGEgPSBzdGF0aWNfY2FzdDxTdGFy
dFBvc2l0aW9uT2ZDaGFyYWN0ZXJEYXRhKj4ocXVlcnlEYXRhKTsKCiAgICB1bnNpZ25lZCBzdGFy
dFBvc2l0aW9uID0gZGF0YS0+cG9zaXRpb247CiAgICB1bnNpZ25lZCBlbmRQb3NpdGlvbiA9IHN0
YXJ0UG9zaXRpb24gKyAxOwogICAgaWYgKCFtYXBTdGFydEVuZFBvc2l0aW9uc0ludG9GcmFnbWVu
dENvb3JkaW5hdGVzKHF1ZXJ5RGF0YSwgZnJhZ21lbnQsIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0
aW9uKSkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgZGF0YS0+c3RhcnRQb3NpdGlvbiA9IEZs
b2F0UG9pbnQoZnJhZ21lbnQueCwgZnJhZ21lbnQueSk7CgogICAgaWYgKHN0YXJ0UG9zaXRpb24p
IHsKICAgICAgICBTVkdUZXh0TWV0cmljcyBtZXRyaWNzID0gU1ZHVGV4dE1ldHJpY3M6Om1lYXN1
cmVDaGFyYWN0ZXJSYW5nZSgqcXVlcnlEYXRhLT50ZXh0UmVuZGVyZXIsIGZyYWdtZW50LmNoYXJh
Y3Rlck9mZnNldCwgc3RhcnRQb3NpdGlvbik7CiAgICAgICAgaWYgKHF1ZXJ5RGF0YS0+aXNWZXJ0
aWNhbFRleHQpCiAgICAgICAgICAgIGRhdGEtPnN0YXJ0UG9zaXRpb24ubW92ZSgwLCBtZXRyaWNz
LmhlaWdodCgpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGRhdGEtPnN0YXJ0UG9zaXRpb24u
bW92ZShtZXRyaWNzLndpZHRoKCksIDApOwogICAgfQoKICAgIEFmZmluZVRyYW5zZm9ybSBmcmFn
bWVudFRyYW5zZm9ybTsKICAgIGZyYWdtZW50LmJ1aWxkRnJhZ21lbnRUcmFuc2Zvcm0oZnJhZ21l
bnRUcmFuc2Zvcm0sIFNWR1RleHRGcmFnbWVudDo6VHJhbnNmb3JtSWdub3JpbmdUZXh0TGVuZ3Ro
KTsKICAgIGlmIChmcmFnbWVudFRyYW5zZm9ybS5pc0lkZW50aXR5KCkpCiAgICAgICAgcmV0dXJu
IHRydWU7CgogICAgZGF0YS0+c3RhcnRQb3NpdGlvbiA9IGZyYWdtZW50VHJhbnNmb3JtLm1hcFBv
aW50KGRhdGEtPnN0YXJ0UG9zaXRpb24pOwogICAgcmV0dXJuIHRydWU7Cn0KCkZsb2F0UG9pbnQg
U1ZHVGV4dFF1ZXJ5OjpzdGFydFBvc2l0aW9uT2ZDaGFyYWN0ZXIodW5zaWduZWQgcG9zaXRpb24p
IGNvbnN0CnsKICAgIGlmIChtX3RleHRCb3hlcy5pc0VtcHR5KCkpCiAgICAgICAgcmV0dXJuIHsg
fTsKCiAgICBTdGFydFBvc2l0aW9uT2ZDaGFyYWN0ZXJEYXRhIGRhdGEocG9zaXRpb24pOwogICAg
ZXhlY3V0ZVF1ZXJ5KCZkYXRhLCAmU1ZHVGV4dFF1ZXJ5OjpzdGFydFBvc2l0aW9uT2ZDaGFyYWN0
ZXJDYWxsYmFjayk7CiAgICByZXR1cm4gZGF0YS5zdGFydFBvc2l0aW9uOwp9CgovLyBlbmRQb3Np
dGlvbk9mQ2hhcmFjdGVyKCkgaW1wbGVtZW50YXRpb24Kc3RydWN0IEVuZFBvc2l0aW9uT2ZDaGFy
YWN0ZXJEYXRhIDogU1ZHVGV4dFF1ZXJ5OjpEYXRhIHsKICAgIEVuZFBvc2l0aW9uT2ZDaGFyYWN0
ZXJEYXRhKHVuc2lnbmVkIHF1ZXJ5UG9zaXRpb24pCiAgICAgICAgOiBwb3NpdGlvbihxdWVyeVBv
c2l0aW9uKQogICAgewogICAgfQoKICAgIHVuc2lnbmVkIHBvc2l0aW9uOwogICAgRmxvYXRQb2lu
dCBlbmRQb3NpdGlvbjsKfTsKCmJvb2wgU1ZHVGV4dFF1ZXJ5OjplbmRQb3NpdGlvbk9mQ2hhcmFj
dGVyQ2FsbGJhY2soRGF0YSogcXVlcnlEYXRhLCBjb25zdCBTVkdUZXh0RnJhZ21lbnQmIGZyYWdt
ZW50KSBjb25zdAp7CiAgICBFbmRQb3NpdGlvbk9mQ2hhcmFjdGVyRGF0YSogZGF0YSA9IHN0YXRp
Y19jYXN0PEVuZFBvc2l0aW9uT2ZDaGFyYWN0ZXJEYXRhKj4ocXVlcnlEYXRhKTsKCiAgICB1bnNp
Z25lZCBzdGFydFBvc2l0aW9uID0gZGF0YS0+cG9zaXRpb247CiAgICB1bnNpZ25lZCBlbmRQb3Np
dGlvbiA9IHN0YXJ0UG9zaXRpb24gKyAxOwogICAgaWYgKCFtYXBTdGFydEVuZFBvc2l0aW9uc0lu
dG9GcmFnbWVudENvb3JkaW5hdGVzKHF1ZXJ5RGF0YSwgZnJhZ21lbnQsIHN0YXJ0UG9zaXRpb24s
IGVuZFBvc2l0aW9uKSkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgZGF0YS0+ZW5kUG9zaXRp
b24gPSBGbG9hdFBvaW50KGZyYWdtZW50LngsIGZyYWdtZW50LnkpOwoKICAgIFNWR1RleHRNZXRy
aWNzIG1ldHJpY3MgPSBTVkdUZXh0TWV0cmljczo6bWVhc3VyZUNoYXJhY3RlclJhbmdlKCpxdWVy
eURhdGEtPnRleHRSZW5kZXJlciwgZnJhZ21lbnQuY2hhcmFjdGVyT2Zmc2V0LCBzdGFydFBvc2l0
aW9uICsgMSk7CiAgICBpZiAocXVlcnlEYXRhLT5pc1ZlcnRpY2FsVGV4dCkKICAgICAgICBkYXRh
LT5lbmRQb3NpdGlvbi5tb3ZlKDAsIG1ldHJpY3MuaGVpZ2h0KCkpOwogICAgZWxzZQogICAgICAg
IGRhdGEtPmVuZFBvc2l0aW9uLm1vdmUobWV0cmljcy53aWR0aCgpLCAwKTsKCiAgICBBZmZpbmVU
cmFuc2Zvcm0gZnJhZ21lbnRUcmFuc2Zvcm07CiAgICBmcmFnbWVudC5idWlsZEZyYWdtZW50VHJh
bnNmb3JtKGZyYWdtZW50VHJhbnNmb3JtLCBTVkdUZXh0RnJhZ21lbnQ6OlRyYW5zZm9ybUlnbm9y
aW5nVGV4dExlbmd0aCk7CiAgICBpZiAoZnJhZ21lbnRUcmFuc2Zvcm0uaXNJZGVudGl0eSgpKQog
ICAgICAgIHJldHVybiB0cnVlOwoKICAgIGRhdGEtPmVuZFBvc2l0aW9uID0gZnJhZ21lbnRUcmFu
c2Zvcm0ubWFwUG9pbnQoZGF0YS0+ZW5kUG9zaXRpb24pOwogICAgcmV0dXJuIHRydWU7Cn0KCkZs
b2F0UG9pbnQgU1ZHVGV4dFF1ZXJ5OjplbmRQb3NpdGlvbk9mQ2hhcmFjdGVyKHVuc2lnbmVkIHBv
c2l0aW9uKSBjb25zdAp7CiAgICBpZiAobV90ZXh0Qm94ZXMuaXNFbXB0eSgpKQogICAgICAgIHJl
dHVybiB7IH07CgogICAgRW5kUG9zaXRpb25PZkNoYXJhY3RlckRhdGEgZGF0YShwb3NpdGlvbik7
CiAgICBleGVjdXRlUXVlcnkoJmRhdGEsICZTVkdUZXh0UXVlcnk6OmVuZFBvc2l0aW9uT2ZDaGFy
YWN0ZXJDYWxsYmFjayk7CiAgICByZXR1cm4gZGF0YS5lbmRQb3NpdGlvbjsKfQoKLy8gcm90YXRp
b25PZkNoYXJhY3RlcigpIGltcGxlbWVudGF0aW9uCnN0cnVjdCBSb3RhdGlvbk9mQ2hhcmFjdGVy
RGF0YSA6IFNWR1RleHRRdWVyeTo6RGF0YSB7CiAgICBSb3RhdGlvbk9mQ2hhcmFjdGVyRGF0YSh1
bnNpZ25lZCBxdWVyeVBvc2l0aW9uKQogICAgICAgIDogcG9zaXRpb24ocXVlcnlQb3NpdGlvbikK
ICAgICAgICAsIHJvdGF0aW9uKDApCiAgICB7CiAgICB9CgogICAgdW5zaWduZWQgcG9zaXRpb247
CiAgICBmbG9hdCByb3RhdGlvbjsKfTsKCmJvb2wgU1ZHVGV4dFF1ZXJ5Ojpyb3RhdGlvbk9mQ2hh
cmFjdGVyQ2FsbGJhY2soRGF0YSogcXVlcnlEYXRhLCBjb25zdCBTVkdUZXh0RnJhZ21lbnQmIGZy
YWdtZW50KSBjb25zdAp7CiAgICBSb3RhdGlvbk9mQ2hhcmFjdGVyRGF0YSogZGF0YSA9IHN0YXRp
Y19jYXN0PFJvdGF0aW9uT2ZDaGFyYWN0ZXJEYXRhKj4ocXVlcnlEYXRhKTsKCiAgICB1bnNpZ25l
ZCBzdGFydFBvc2l0aW9uID0gZGF0YS0+cG9zaXRpb247CiAgICB1bnNpZ25lZCBlbmRQb3NpdGlv
biA9IHN0YXJ0UG9zaXRpb24gKyAxOwogICAgaWYgKCFtYXBTdGFydEVuZFBvc2l0aW9uc0ludG9G
cmFnbWVudENvb3JkaW5hdGVzKHF1ZXJ5RGF0YSwgZnJhZ21lbnQsIHN0YXJ0UG9zaXRpb24sIGVu
ZFBvc2l0aW9uKSkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgQWZmaW5lVHJhbnNmb3JtIGZy
YWdtZW50VHJhbnNmb3JtOwogICAgZnJhZ21lbnQuYnVpbGRGcmFnbWVudFRyYW5zZm9ybShmcmFn
bWVudFRyYW5zZm9ybSwgU1ZHVGV4dEZyYWdtZW50OjpUcmFuc2Zvcm1JZ25vcmluZ1RleHRMZW5n
dGgpOwogICAgaWYgKGZyYWdtZW50VHJhbnNmb3JtLmlzSWRlbnRpdHkoKSkKICAgICAgICBkYXRh
LT5yb3RhdGlvbiA9IDA7CiAgICBlbHNlIHsKICAgICAgICBmcmFnbWVudFRyYW5zZm9ybS5zY2Fs
ZSgxIC8gZnJhZ21lbnRUcmFuc2Zvcm0ueFNjYWxlKCksIDEgLyBmcmFnbWVudFRyYW5zZm9ybS55
U2NhbGUoKSk7CiAgICAgICAgZGF0YS0+cm90YXRpb24gPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0
KHJhZDJkZWcoYXRhbjIoZnJhZ21lbnRUcmFuc2Zvcm0uYigpLCBmcmFnbWVudFRyYW5zZm9ybS5h
KCkpKSk7CiAgICB9CgogICAgcmV0dXJuIHRydWU7Cn0KCmZsb2F0IFNWR1RleHRRdWVyeTo6cm90
YXRpb25PZkNoYXJhY3Rlcih1bnNpZ25lZCBwb3NpdGlvbikgY29uc3QKewogICAgaWYgKG1fdGV4
dEJveGVzLmlzRW1wdHkoKSkKICAgICAgICByZXR1cm4gMDsKCiAgICBSb3RhdGlvbk9mQ2hhcmFj
dGVyRGF0YSBkYXRhKHBvc2l0aW9uKTsKICAgIGV4ZWN1dGVRdWVyeSgmZGF0YSwgJlNWR1RleHRR
dWVyeTo6cm90YXRpb25PZkNoYXJhY3RlckNhbGxiYWNrKTsKICAgIHJldHVybiBkYXRhLnJvdGF0
aW9uOwp9CgovLyBleHRlbnRPZkNoYXJhY3RlcigpIGltcGxlbWVudGF0aW9uCnN0cnVjdCBFeHRl
bnRPZkNoYXJhY3RlckRhdGEgOiBTVkdUZXh0UXVlcnk6OkRhdGEgewogICAgRXh0ZW50T2ZDaGFy
YWN0ZXJEYXRhKHVuc2lnbmVkIHF1ZXJ5UG9zaXRpb24pCiAgICAgICAgOiBwb3NpdGlvbihxdWVy
eVBvc2l0aW9uKQogICAgewogICAgfQoKICAgIHVuc2lnbmVkIHBvc2l0aW9uOwogICAgRmxvYXRS
ZWN0IGV4dGVudDsKfTsKCnN0YXRpYyBpbmxpbmUgdm9pZCBjYWxjdWxhdGVHbHlwaEJvdW5kYXJp
ZXMoU1ZHVGV4dFF1ZXJ5OjpEYXRhKiBxdWVyeURhdGEsIGNvbnN0IFNWR1RleHRGcmFnbWVudCYg
ZnJhZ21lbnQsIHVuc2lnbmVkIHN0YXJ0UG9zaXRpb24sIEZsb2F0UmVjdCYgZXh0ZW50KQp7CiAg
ICBmbG9hdCBzY2FsaW5nRmFjdG9yID0gcXVlcnlEYXRhLT50ZXh0UmVuZGVyZXItPnNjYWxpbmdG
YWN0b3IoKTsKICAgIEFTU0VSVChzY2FsaW5nRmFjdG9yKTsKCiAgICBleHRlbnQuc2V0TG9jYXRp
b24oRmxvYXRQb2ludChmcmFnbWVudC54LCBmcmFnbWVudC55IC0gcXVlcnlEYXRhLT50ZXh0UmVu
ZGVyZXItPnNjYWxlZEZvbnQoKS5tZXRyaWNzT2ZQcmltYXJ5Rm9udCgpLmZsb2F0QXNjZW50KCkg
LyBzY2FsaW5nRmFjdG9yKSk7CgogICAgaWYgKHN0YXJ0UG9zaXRpb24pIHsKICAgICAgICBTVkdU
ZXh0TWV0cmljcyBtZXRyaWNzID0gU1ZHVGV4dE1ldHJpY3M6Om1lYXN1cmVDaGFyYWN0ZXJSYW5n
ZSgqcXVlcnlEYXRhLT50ZXh0UmVuZGVyZXIsIGZyYWdtZW50LmNoYXJhY3Rlck9mZnNldCwgc3Rh
cnRQb3NpdGlvbik7CiAgICAgICAgaWYgKHF1ZXJ5RGF0YS0+aXNWZXJ0aWNhbFRleHQpCiAgICAg
ICAgICAgIGV4dGVudC5tb3ZlKDAsIG1ldHJpY3MuaGVpZ2h0KCkpOwogICAgICAgIGVsc2UKICAg
ICAgICAgICAgZXh0ZW50Lm1vdmUobWV0cmljcy53aWR0aCgpLCAwKTsKICAgIH0KCiAgICBTVkdU
ZXh0TWV0cmljcyBtZXRyaWNzID0gU1ZHVGV4dE1ldHJpY3M6Om1lYXN1cmVDaGFyYWN0ZXJSYW5n
ZSgqcXVlcnlEYXRhLT50ZXh0UmVuZGVyZXIsIGZyYWdtZW50LmNoYXJhY3Rlck9mZnNldCArIHN0
YXJ0UG9zaXRpb24sIDEpOwogICAgZXh0ZW50LnNldFNpemUoRmxvYXRTaXplKG1ldHJpY3Mud2lk
dGgoKSwgbWV0cmljcy5oZWlnaHQoKSkpOwoKICAgIEFmZmluZVRyYW5zZm9ybSBmcmFnbWVudFRy
YW5zZm9ybTsKICAgIGZyYWdtZW50LmJ1aWxkRnJhZ21lbnRUcmFuc2Zvcm0oZnJhZ21lbnRUcmFu
c2Zvcm0sIFNWR1RleHRGcmFnbWVudDo6VHJhbnNmb3JtSWdub3JpbmdUZXh0TGVuZ3RoKTsKICAg
IGlmIChmcmFnbWVudFRyYW5zZm9ybS5pc0lkZW50aXR5KCkpCiAgICAgICAgcmV0dXJuOwoKICAg
IGV4dGVudCA9IGZyYWdtZW50VHJhbnNmb3JtLm1hcFJlY3QoZXh0ZW50KTsKfQoKc3RhdGljIGlu
bGluZSBGbG9hdFJlY3QgY2FsY3VsYXRlRnJhZ21lbnRCb3VuZGFyaWVzKGNvbnN0IFJlbmRlclNW
R0lubGluZVRleHQmIHRleHRSZW5kZXJlciwgY29uc3QgU1ZHVGV4dEZyYWdtZW50JiBmcmFnbWVu
dCkKewogICAgZmxvYXQgc2NhbGluZ0ZhY3RvciA9IHRleHRSZW5kZXJlci5zY2FsaW5nRmFjdG9y
KCk7CiAgICBBU1NFUlQoc2NhbGluZ0ZhY3Rvcik7CgogICAgZmxvYXQgYmFzZWxpbmUgPSB0ZXh0
UmVuZGVyZXIuc2NhbGVkRm9udCgpLm1ldHJpY3NPZlByaW1hcnlGb250KCkuZmxvYXRBc2NlbnQo
KSAvIHNjYWxpbmdGYWN0b3I7CgogICAgQWZmaW5lVHJhbnNmb3JtIGZyYWdtZW50VHJhbnNmb3Jt
OwogICAgRmxvYXRSZWN0IGZyYWdtZW50UmVjdChmcmFnbWVudC54LCBmcmFnbWVudC55IC0gYmFz
ZWxpbmUsIGZyYWdtZW50LndpZHRoLCBmcmFnbWVudC5oZWlnaHQpOwogICAgZnJhZ21lbnQuYnVp
bGRGcmFnbWVudFRyYW5zZm9ybShmcmFnbWVudFRyYW5zZm9ybSk7CiAgICByZXR1cm4gZnJhZ21l
bnRUcmFuc2Zvcm0ubWFwUmVjdChmcmFnbWVudFJlY3QpOwp9Cgpib29sIFNWR1RleHRRdWVyeTo6
ZXh0ZW50T2ZDaGFyYWN0ZXJDYWxsYmFjayhEYXRhKiBxdWVyeURhdGEsIGNvbnN0IFNWR1RleHRG
cmFnbWVudCYgZnJhZ21lbnQpIGNvbnN0CnsKICAgIEV4dGVudE9mQ2hhcmFjdGVyRGF0YSogZGF0
YSA9IHN0YXRpY19jYXN0PEV4dGVudE9mQ2hhcmFjdGVyRGF0YSo+KHF1ZXJ5RGF0YSk7CgogICAg
dW5zaWduZWQgc3RhcnRQb3NpdGlvbiA9IGRhdGEtPnBvc2l0aW9uOwogICAgdW5zaWduZWQgZW5k
UG9zaXRpb24gPSBzdGFydFBvc2l0aW9uICsgMTsKICAgIGlmICghbWFwU3RhcnRFbmRQb3NpdGlv
bnNJbnRvRnJhZ21lbnRDb29yZGluYXRlcyhxdWVyeURhdGEsIGZyYWdtZW50LCBzdGFydFBvc2l0
aW9uLCBlbmRQb3NpdGlvbikpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGNhbGN1bGF0ZUds
eXBoQm91bmRhcmllcyhxdWVyeURhdGEsIGZyYWdtZW50LCBzdGFydFBvc2l0aW9uLCBkYXRhLT5l
eHRlbnQpOwogICAgcmV0dXJuIHRydWU7Cn0KCkZsb2F0UmVjdCBTVkdUZXh0UXVlcnk6OmV4dGVu
dE9mQ2hhcmFjdGVyKHVuc2lnbmVkIHBvc2l0aW9uKSBjb25zdAp7CiAgICBpZiAobV90ZXh0Qm94
ZXMuaXNFbXB0eSgpKQogICAgICAgIHJldHVybiBGbG9hdFJlY3QoKTsKCiAgICBFeHRlbnRPZkNo
YXJhY3RlckRhdGEgZGF0YShwb3NpdGlvbik7CiAgICBleGVjdXRlUXVlcnkoJmRhdGEsICZTVkdU
ZXh0UXVlcnk6OmV4dGVudE9mQ2hhcmFjdGVyQ2FsbGJhY2spOwogICAgcmV0dXJuIGRhdGEuZXh0
ZW50Owp9CgovLyBjaGFyYWN0ZXJOdW1iZXJBdFBvc2l0aW9uKCkgaW1wbGVtZW50YXRpb24Kc3Ry
dWN0IENoYXJhY3Rlck51bWJlckF0UG9zaXRpb25EYXRhIDogU1ZHVGV4dFF1ZXJ5OjpEYXRhIHsK
ICAgIENoYXJhY3Rlck51bWJlckF0UG9zaXRpb25EYXRhKGNvbnN0IEZsb2F0UG9pbnQmIHF1ZXJ5
UG9zaXRpb24pCiAgICAgICAgOiBwb3NpdGlvbihxdWVyeVBvc2l0aW9uKQogICAgewogICAgfQoK
ICAgIEZsb2F0UG9pbnQgcG9zaXRpb247Cn07Cgpib29sIFNWR1RleHRRdWVyeTo6Y2hhcmFjdGVy
TnVtYmVyQXRQb3NpdGlvbkNhbGxiYWNrKERhdGEqIHF1ZXJ5RGF0YSwgY29uc3QgU1ZHVGV4dEZy
YWdtZW50JiBmcmFnbWVudCkgY29uc3QKewogICAgQ2hhcmFjdGVyTnVtYmVyQXRQb3NpdGlvbkRh
dGEqIGRhdGEgPSBzdGF0aWNfY2FzdDxDaGFyYWN0ZXJOdW1iZXJBdFBvc2l0aW9uRGF0YSo+KHF1
ZXJ5RGF0YSk7CgogICAgLy8gVGVzdCB0aGUgcXVlcnkgcG9pbnQgYWdhaW5zdCB0aGUgYm91bmRz
IG9mIHRoZSBlbnRpcmUgZnJhZ21lbnQgZmlyc3QuCiAgICBGbG9hdFJlY3QgZnJhZ21lbnRFeHRl
bnRzID0gY2FsY3VsYXRlRnJhZ21lbnRCb3VuZGFyaWVzKCpxdWVyeURhdGEtPnRleHRSZW5kZXJl
ciwgZnJhZ21lbnQpOwogICAgaWYgKCFmcmFnbWVudEV4dGVudHMuY29udGFpbnMoZGF0YS0+cG9z
aXRpb24pKQogICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhl
IGdseXBocyBpbiB0aGlzIGZyYWdtZW50LCBhbmQgY2hlY2sgaWYgdGhlaXIgZXh0ZW50cyBjb250
YWluIHRoZSBxdWVyeSBwb2ludC4KCiAgICBGbG9hdFJlY3QgZXh0ZW50OwogICAgY29uc3QgVmVj
dG9yPFNWR1RleHRNZXRyaWNzPiYgdGV4dE1ldHJpY3MgPSBxdWVyeURhdGEtPnRleHRSZW5kZXJl
ci0+bGF5b3V0QXR0cmlidXRlcygpLT50ZXh0TWV0cmljc1ZhbHVlcygpOwogICAgdW5zaWduZWQg
dGV4dE1ldHJpY3NPZmZzZXQgPSBmcmFnbWVudC5tZXRyaWNzTGlzdE9mZnNldDsKICAgIHVuc2ln
bmVkIGZyYWdtZW50T2Zmc2V0ID0gMDsKICAgIHdoaWxlIChmcmFnbWVudE9mZnNldCA8IGZyYWdt
ZW50Lmxlbmd0aCkgewogICAgICAgIGNhbGN1bGF0ZUdseXBoQm91bmRhcmllcyhxdWVyeURhdGEs
IGZyYWdtZW50LCBmcmFnbWVudE9mZnNldCwgZXh0ZW50KTsKCiAgICBpZiAoZXh0ZW50LmNvbnRh
aW5zKGRhdGEtPnBvc2l0aW9uKSkgewogICAgICAgIC8vIENvbXB1dGUgdGhlIGNoYXJhY3RlciBv
ZmZzZXQgb2YgdGhlIGdseXBoIHdpdGhpbiB0aGUgdGV4dCBib3ggYW5kIGFkZCB0byBwcm9jZXNz
ZWRDaGFyYWN0ZXJzLgogICAgICAgIHVuc2lnbmVkIGNoYXJhY3Rlck9mZnNldCA9IGZyYWdtZW50
LmNoYXJhY3Rlck9mZnNldCArIGZyYWdtZW50T2Zmc2V0OwoJIAlkYXRhLT5wcm9jZXNzZWRDaGFy
YWN0ZXJzICs9IGNoYXJhY3Rlck9mZnNldCAtIGRhdGEtPnRleHRCb3gtPnN0YXJ0KCk7CiAgICAg
ICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmcmFnbWVudE9mZnNldCArPSB0ZXh0TWV0cmljc1t0
ZXh0TWV0cmljc09mZnNldF0ubGVuZ3RoKCk7CiAgICB0ZXh0TWV0cmljc09mZnNldCsrOwogICAg
fQoKICAgIHJldHVybiBmYWxzZTsKfQoKaW50IFNWR1RleHRRdWVyeTo6Y2hhcmFjdGVyTnVtYmVy
QXRQb3NpdGlvbihjb25zdCBGbG9hdFBvaW50JiBwb3NpdGlvbikgY29uc3QKewogICAgaWYgKG1f
dGV4dEJveGVzLmlzRW1wdHkoKSkKICAgICAgICByZXR1cm4gLTE7CgogICAgQ2hhcmFjdGVyTnVt
YmVyQXRQb3NpdGlvbkRhdGEgZGF0YShwb3NpdGlvbik7CiAgICBpZiAoIWV4ZWN1dGVRdWVyeSgm
ZGF0YSwgJlNWR1RleHRRdWVyeTo6Y2hhcmFjdGVyTnVtYmVyQXRQb3NpdGlvbkNhbGxiYWNrKSkK
ICAgICAgICByZXR1cm4gLTE7CgogICAgcmV0dXJuIGRhdGEucHJvY2Vzc2VkQ2hhcmFjdGVyczsK
fQoKfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>