<?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>50245</bug_id>
          
          <creation_ts>2010-11-30 10:24:25 -0800</creation_ts>
          <short_desc>Add word-prefix search options to the text search without ICU</short_desc>
          <delta_ts>2011-06-22 07:54:29 -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>Text</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Qt, QtTriaged</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>50038</dependson>
    
    <dependson>60786</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Benjamin Poulain">benjamin</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cshu</cc>
    
    <cc>max.hong.shen</cc>
    
    <cc>tonikitoo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>315137</commentid>
    <comment_count>0</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2010-11-30 10:24:25 -0800</bug_when>
    <thetext>The patch r72887 (https://bugs.webkit.org/show_bug.cgi?id=50038 ) adds options to Editor::findString() but does not implement the changes to the non-ICU version of SearchBuffer.

The test editing/text-iterator/findString.html fails on any case using the new options.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>410584</commentid>
    <comment_count>1</comment_count>
      <attachid>95002</attachid>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2011-05-26 10:39:05 -0700</bug_when>
    <thetext>Created attachment 95002
word-prefix search for no-ICU code path (v1.0)

For Qt, this patch makes the LayoutTests/editing/text-iterator/findString.html pass all the tests except the one for the Thai words.

 var thaiWords = [
        &quot;\u0e01\u0e23&quot;,
        &quot;\u0e1b\u0e39\u0e40\u0e25&quot;,
        &quot;\u0e01\u0e0a&quot;,
        &quot;\u0e01\u0e0a\u0e01\u0e23&quot;, // thaiWords[2] + thaiWords[0]
        &quot;\u0e01\u0e23\u0e01\u0e0a&quot;, // thaiWords[0] + thaiWords[2]
        &quot;\u0e1a\u0e07\u0e01\u0e0a&quot;, // ends with thaiWords[2]
    ];

    testFindString(thaiWords.join(&quot;&quot;), thaiWords[0], [&quot;AtWordStarts&quot;], [[0, 2], [12, 14], []]); // Failed here

After traced down the problem in SearchBuffer::isWordStartMatch() function, I found the issue is that findNextWordFromIndex() doesn&apos;t return a correct word position for Thai words, which is implemented in TextBoundariesQt.cpp by using QTextBoundaryFinder. In other word, this is a Qt issue and I will fire a Qt bug for it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>410612</commentid>
    <comment_count>2</comment_count>
      <attachid>95002</attachid>
    <who name="Chang Shu">cshu</who>
    <bug_when>2011-05-26 11:12:21 -0700</bug_when>
    <thetext>Comment on attachment 95002
word-prefix search for no-ICU code path (v1.0)

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

I understand you didn&apos;t unskip findString.html because of the Thai char issue. But it will be good to show some tests improvement after your fix. Maybe we can split findString.html and put Thai tests in a separate test?
Overall, it&apos;s a good patch. Thanks.

&gt; Source/WebCore/editing/TextIterator.cpp:106
&gt; +    bool isWordStartMatch(size_t, size_t length) const;

What do you think we move all the common apis to the common place?

&gt; Source/WebCore/editing/TextIterator.cpp:2189
&gt; +

same thing here. We can move identical code to the common place.

&gt; Source/WebCore/editing/TextIterator.cpp:2236
&gt; +            memcpy(m_context.data(), m_context.data() + 1, (m_context.size() - 1) * sizeof(UChar));

memcpy to overlapped place may cause unexpected results?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>410622</commentid>
    <comment_count>3</comment_count>
    <who name="Chang Shu">cshu</who>
    <bug_when>2011-05-26 11:24:23 -0700</bug_when>
    <thetext>&gt; &gt; Source/WebCore/editing/TextIterator.cpp:2236
&gt; &gt; +            memcpy(m_context.data(), m_context.data() + 1, (m_context.size() - 1) * sizeof(UChar));
&gt; 
&gt; memcpy to overlapped place may cause unexpected results?

I think memmove is a better way to do it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422738</commentid>
    <comment_count>4</comment_count>
      <attachid>95002</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-06-17 11:01:27 -0700</bug_when>
    <thetext>Comment on attachment 95002
word-prefix search for no-ICU code path (v1.0)

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

Need to at least fix the memcpy problem. But I think that also using a circular buffer instead of a memmove each time is the way to go. It may be tricky to get a circular buffer to work with functions such as U16_GET, though, so not sure it will be easy.

&gt;&gt; Source/WebCore/editing/TextIterator.cpp:2189
&gt;&gt; +
&gt; 
&gt; same thing here. We can move identical code to the common place.

We don’t want to copy and paste this code, yes, so we need a version of the patch that does not involve a second copy.

&gt;&gt; Source/WebCore/editing/TextIterator.cpp:2236
&gt;&gt; +            memcpy(m_context.data(), m_context.data() + 1, (m_context.size() - 1) * sizeof(UChar));
&gt; 
&gt; memcpy to overlapped place may cause unexpected results?

That’s right. You can’t use memcpy for this; it has to be memmove instead.

And doing a memmove every time we add a character is really inefficient. I suggest considering a circular buffer instead.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422858</commentid>
    <comment_count>5</comment_count>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2011-06-17 13:38:08 -0700</bug_when>
    <thetext>I agree that memmove is a better way, but I think memcpy is fine in this case since the source is after the destination,right?

e.g,
str = &quot;0123456789&quot;
memcpy(str+2, str+1, 3);
returns: 0111356789

memcpy(str+1, str+2, 3);
returns: 0234456789

Anyway, I will change it.

(In reply to comment #3)
&gt; &gt; &gt; Source/WebCore/editing/TextIterator.cpp:2236
&gt; &gt; &gt; +            memcpy(m_context.data(), m_context.data() + 1, (m_context.size() - 1) * sizeof(UChar));
&gt; &gt; 
&gt; &gt; memcpy to overlapped place may cause unexpected results?
&gt; 
&gt; I think memmove is a better way to do it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422859</commentid>
    <comment_count>6</comment_count>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2011-06-17 13:38:49 -0700</bug_when>
    <thetext>Thanks both for the reviewing :) I will update the patch based on your comments.

(In reply to comment #4)
&gt; (From update of attachment 95002 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=95002&amp;action=review
&gt; 
&gt; Need to at least fix the memcpy problem. But I think that also using a circular buffer instead of a memmove each time is the way to go. It may be tricky to get a circular buffer to work with functions such as U16_GET, though, so not sure it will be easy.
&gt; 
&gt; &gt;&gt; Source/WebCore/editing/TextIterator.cpp:2189
&gt; &gt;&gt; +
&gt; &gt; 
&gt; &gt; same thing here. We can move identical code to the common place.
&gt; 
&gt; We don’t want to copy and paste this code, yes, so we need a version of the patch that does not involve a second copy.
&gt; 
&gt; &gt;&gt; Source/WebCore/editing/TextIterator.cpp:2236
&gt; &gt;&gt; +            memcpy(m_context.data(), m_context.data() + 1, (m_context.size() - 1) * sizeof(UChar));
&gt; &gt; 
&gt; &gt; memcpy to overlapped place may cause unexpected results?
&gt; 
&gt; That’s right. You can’t use memcpy for this; it has to be memmove instead.
&gt; 
&gt; And doing a memmove every time we add a character is really inefficient. I suggest considering a circular buffer instead.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>422913</commentid>
    <comment_count>7</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2011-06-17 15:31:54 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; I agree that memmove is a better way, but I think memcpy is fine in this case since the source is after the destination,right?
&gt; 
&gt; e.g,
&gt; str = &quot;0123456789&quot;
&gt; memcpy(str+2, str+1, 3);
&gt; returns: 0111356789
&gt; 
&gt; memcpy(str+1, str+2, 3);
&gt; returns: 0234456789

This is invalid, and will fail on some platform, some libc or even depending on the alignment.
The source and destination of memcpy cannot overlap (see http://linuxcertif.com/man/3/memcpy/en/ ).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>425231</commentid>
    <comment_count>8</comment_count>
    <who name="Yi Shen">max.hong.shen</who>
    <bug_when>2011-06-22 07:54:29 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #5)
&gt; &gt; I agree that memmove is a better way, but I think memcpy is fine in this case since the source is after the destination,right?
&gt; &gt; 
&gt; &gt; e.g,
&gt; &gt; str = &quot;0123456789&quot;
&gt; &gt; memcpy(str+2, str+1, 3);
&gt; &gt; returns: 0111356789
&gt; &gt; 
&gt; &gt; memcpy(str+1, str+2, 3);
&gt; &gt; returns: 0234456789
&gt; 
&gt; This is invalid, and will fail on some platform, some libc or even depending on the alignment.
&gt; The source and destination of memcpy cannot overlap (see http://linuxcertif.com/man/3/memcpy/en/ ).

Agree, will fix it :)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>95002</attachid>
            <date>2011-05-26 10:39:05 -0700</date>
            <delta_ts>2011-06-17 11:01:27 -0700</delta_ts>
            <desc>word-prefix search for no-ICU code path (v1.0)</desc>
            <filename>50245.patch</filename>
            <type>text/plain</type>
            <size>8492</size>
            <attacher name="Yi Shen">max.hong.shen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg3Mzk5KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTEtMDUtMjYgIFlpIFNoZW4g
IDx5aS40LnNoZW5Abm9raWEuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIEFkZCB3b3JkLXByZWZpeCBzZWFyY2ggb3B0aW9ucyB0byB0aGUgdGV4
dCBzZWFyY2ggd2l0aG91dCBJQ1UKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTUwMjQ1CisKKyAgICAgICAgVGVzdDogZWRpdGluZy90ZXh0LWl0ZXJhdG9y
L2ZpbmRTdHJpbmcuaHRtbAorCisgICAgICAgICogZWRpdGluZy9UZXh0SXRlcmF0b3IuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6aXNTZXBhcmF0b3IpOiBBZGRlZCBmb3IgTm8tSUNVIGNvZGUgcGF0
aC4KKyAgICAgICAgKFdlYkNvcmU6OlNlYXJjaEJ1ZmZlcjo6U2VhcmNoQnVmZmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNlYXJjaEJ1ZmZlcjo6YXBwZW5kKTogQXBwZW5kIGNoYXJhY3RlciB0byBj
b250ZXh0IGJ1ZmZlciBmb3Igd29yZC1wcmVmaXggc2VhcmNoLgorICAgICAgICAoV2ViQ29yZTo6
U2VhcmNoQnVmZmVyOjpuZWVkc01vcmVDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlNlYXJj
aEJ1ZmZlcjo6cHJlcGVuZENvbnRleHQpOiBQcmVwZW5kIGNoYXJhY3RlciB0byBjb250ZXh0IGJ1
ZmZlciBmb3Igd29yZC1wcmVmaXggc2VhcmNoLgorICAgICAgICAoV2ViQ29yZTo6U2VhcmNoQnVm
ZmVyOjppc1dvcmRTdGFydE1hdGNoKTogQWRkZWQgZm9yIE5vLUlDVSBwYXRoLgorICAgICAgICAo
V2ViQ29yZTo6U2VhcmNoQnVmZmVyOjpzZWFyY2gpOiBDYWxsIGlzV29yZFN0YXJ0TWF0Y2ggZm9y
IHdvcmQtcHJlZml4IHNlYXJjaC4KKwogMjAxMS0wNS0yNiAgTWljaGFlbCBTY2huZWlkZXIgIDxt
aWNoc2NobkBnb29nbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFBhdmVsIEZlbGRtYW4u
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1RleHRJdGVyYXRvci5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9UZXh0SXRlcmF0b3IuY3BwCShyZXZpc2lvbiA4
NzM4NikKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVGV4dEl0ZXJhdG9yLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTAzLDYgKzEwMyw3IEBAIHByaXZhdGU6CiBwcml2YXRlOgogICAgIHZvaWQg
YXBwZW5kKFVDaGFyLCBib29sIGlzQ2hhcmFjdGVyU3RhcnQpOwogICAgIHNpemVfdCBsZW5ndGgo
KSBjb25zdDsKKyAgICBib29sIGlzV29yZFN0YXJ0TWF0Y2goc2l6ZV90LCBzaXplX3QgbGVuZ3Ro
KSBjb25zdDsKIAogICAgIFN0cmluZyBtX3RhcmdldDsKICAgICBGaW5kT3B0aW9ucyBtX29wdGlv
bnM7CkBAIC0xMTEsNyArMTEyLDggQEAgcHJpdmF0ZToKICAgICBWZWN0b3I8Ym9vbD4gbV9pc0No
YXJhY3RlclN0YXJ0QnVmZmVyOwogICAgIGJvb2wgbV9pc0J1ZmZlckZ1bGw7CiAgICAgc2l6ZV90
IG1fY3Vyc29yOwotCisgICAgYm9vbCBtX25lZWRzTW9yZUNvbnRleHQ7CisgICAgVmVjdG9yPFVD
aGFyPiBtX2NvbnRleHQ7CiAjZW5kaWYKIH07CiAKQEAgLTIxNTcsNiArMjE1OSwzNCBAQCBuZXh0
TWF0Y2g6CiAKICNlbHNlIC8vICFJQ1VfVU5JQ09ERQogCitzdGF0aWMgaW5saW5lIGJvb2wgaXNT
ZXBhcmF0b3IoVUNoYXIzMiBjaGFyYWN0ZXIpCit7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgbGF0
aW4xU2VwYXJhdG9yVGFibGVbMjU2XSA9IHsKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwg
MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gc3BhY2UgISAiICMgJCAlICYgJyAoICkgKiAr
ICwgLSAuIC8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwg
MSwgMSwgMSwgLy8gICAgICAgICAgICAgICAgICAgICAgICAgOiA7IDwgPSA+ID8KKyAgICAgICAg
MSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gICBACisg
ICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIC8v
ICAgICAgICAgICAgICAgICAgICAgICAgIFsgXCBdIF4gXworICAgICAgICAxLCAwLCAwLCAwLCAw
LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAgIGAKKyAgICAgICAgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMCwgLy8gICAgICAgICAgICAg
ICAgICAgICAgICAgICB7IHwgfSB+CisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEs
IDEsIDAsIDEsIDEsIDEsIDEsIDEsCisgICAgICAgIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDEs
IDEsIDAsIDEsIDEsIDEsIDEsIDEsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAKKyAgICB9OworCisgICAgaWYgKGNoYXJhY3RlciA8IDI1NikK
KyAgICAgICAgcmV0dXJuIGxhdGluMVNlcGFyYXRvclRhYmxlW2NoYXJhY3Rlcl07CisKKyAgICAv
LyBGSVhNRTogTmVlZCB0byBpbXBsZW1lbnQgaXNOb25MYXRpbjFTZXBhcmF0b3IoKSBmb3IgTm8t
SUNVIGNvZGUgcGF0aAorICAgIHJldHVybiBmYWxzZTsgCit9CisKIGlubGluZSBTZWFyY2hCdWZm
ZXI6OlNlYXJjaEJ1ZmZlcihjb25zdCBTdHJpbmcmIHRhcmdldCwgRmluZE9wdGlvbnMgb3B0aW9u
cykKICAgICA6IG1fdGFyZ2V0KG9wdGlvbnMgJiBDYXNlSW5zZW5zaXRpdmUgPyB0YXJnZXQuZm9s
ZENhc2UoKSA6IHRhcmdldCkKICAgICAsIG1fb3B0aW9ucyhvcHRpb25zKQpAQCAtMjE2NCwxMCAr
MjE5NCwxMyBAQCBpbmxpbmUgU2VhcmNoQnVmZmVyOjpTZWFyY2hCdWZmZXIoY29uc3QgCiAgICAg
LCBtX2lzQ2hhcmFjdGVyU3RhcnRCdWZmZXIobV90YXJnZXQubGVuZ3RoKCkpCiAgICAgLCBtX2lz
QnVmZmVyRnVsbChmYWxzZSkKICAgICAsIG1fY3Vyc29yKDApCisgICAgLCBtX25lZWRzTW9yZUNv
bnRleHQobV9vcHRpb25zICYgQXRXb3JkU3RhcnRzKQogewogICAgIEFTU0VSVCghbV90YXJnZXQu
aXNFbXB0eSgpKTsKICAgICBtX3RhcmdldC5yZXBsYWNlKG5vQnJlYWtTcGFjZSwgJyAnKTsKICAg
ICBmb2xkUXVvdGVNYXJrc0FuZFNvZnRIeXBoZW5zKG1fdGFyZ2V0KTsKKyAgICBpZiAobV9vcHRp
b25zICYgQXRXb3JkU3RhcnRzKQorICAgICAgICBtX2NvbnRleHQucmVzZXJ2ZUluaXRpYWxDYXBh
Y2l0eSg0ICsgdGFyZ2V0Lmxlbmd0aCgpKTsKIH0KIAogaW5saW5lIFNlYXJjaEJ1ZmZlcjo6flNl
YXJjaEJ1ZmZlcigpCkBAIC0yMTk4LDYgKzIyMzEsMTQgQEAgaW5saW5lIHZvaWQgU2VhcmNoQnVm
ZmVyOjphcHBlbmQoVUNoYXIgYwogaW5saW5lIHNpemVfdCBTZWFyY2hCdWZmZXI6OmFwcGVuZChj
b25zdCBVQ2hhciogY2hhcmFjdGVycywgc2l6ZV90IGxlbmd0aCkKIHsKICAgICBBU1NFUlQobGVu
Z3RoKTsKKyAgICBpZiAobV9vcHRpb25zICYgQXRXb3JkU3RhcnRzKSB7CisgICAgICAgIGlmICht
X2NvbnRleHQuc2l6ZSgpID09IG1fY29udGV4dC5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICBt
ZW1jcHkobV9jb250ZXh0LmRhdGEoKSwgbV9jb250ZXh0LmRhdGEoKSArIDEsIChtX2NvbnRleHQu
c2l6ZSgpIC0gMSkgKiBzaXplb2YoVUNoYXIpKTsKKyAgICAgICAgICAgIG1fY29udGV4dFttX2Nv
bnRleHQuc2l6ZSgpIC0gMV0gPSBjaGFyYWN0ZXJzWzBdOworICAgICAgICB9IGVsc2UKKyAgICAg
ICAgICAgIG1fY29udGV4dC5hcHBlbmQoY2hhcmFjdGVyc1swXSk7CisgICAgfQorCiAgICAgaWYg
KCEobV9vcHRpb25zICYgQ2FzZUluc2Vuc2l0aXZlKSkgewogICAgICAgICBhcHBlbmQoY2hhcmFj
dGVyc1swXSwgdHJ1ZSk7CiAgICAgICAgIHJldHVybiAxOwpAQCAtMjIyMCwxMiArMjI2MSw4MSBA
QCBpbmxpbmUgc2l6ZV90IFNlYXJjaEJ1ZmZlcjo6YXBwZW5kKGNvbnN0CiAKIGlubGluZSBib29s
IFNlYXJjaEJ1ZmZlcjo6bmVlZHNNb3JlQ29udGV4dCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGZh
bHNlOworICAgIHJldHVybiBtX25lZWRzTW9yZUNvbnRleHQ7CiB9CiAKLXZvaWQgU2VhcmNoQnVm
ZmVyOjpwcmVwZW5kQ29udGV4dChjb25zdCBVQ2hhciosIHNpemVfdCkKK2lubGluZSB2b2lkIFNl
YXJjaEJ1ZmZlcjo6cHJlcGVuZENvbnRleHQoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHNpemVf
dCBsZW5ndGgpCiB7Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgQVNTRVJUKG1fbmVl
ZHNNb3JlQ29udGV4dCk7CisKKyAgICBpZiAoIWxlbmd0aCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgc2l6ZV90IHByZXZpb3VzQ2hhcmFjdGVyU3RhcnQgPSBsZW5ndGg7CisgICAgVTE2X0JBQ0tf
MShjaGFyYWN0ZXJzLCAwLCBwcmV2aW91c0NoYXJhY3RlclN0YXJ0KTsKKworICAgIHNpemVfdCB1
c2FibGVMZW5ndGggPSBsZW5ndGggLSBwcmV2aW91c0NoYXJhY3RlclN0YXJ0OworICAgIEFTU0VS
VCghbV9jb250ZXh0LnNpemUoKSk7CisgICAgbV9jb250ZXh0LnByZXBlbmQoY2hhcmFjdGVycyAr
IGxlbmd0aCAtIHVzYWJsZUxlbmd0aCwgdXNhYmxlTGVuZ3RoKTsKKyAgICBtX25lZWRzTW9yZUNv
bnRleHQgPSBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgU2VhcmNoQnVmZmVyOjppc1dvcmRTdGFy
dE1hdGNoKHNpemVfdCwgc2l6ZV90IGxlbmd0aCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV9vcHRp
b25zICYgQXRXb3JkU3RhcnRzKTsKKworICAgIGludCBzaXplID0gbV9jb250ZXh0LnNpemUoKTsK
KyAgICBpbnQgb2Zmc2V0ID0gbV9jb250ZXh0LnNpemUoKSAtIGxlbmd0aDsKKyAgICBjb25zdCBV
Q2hhciogY2hhcmFjdGVycyA9IG1fY29udGV4dC5kYXRhKCk7CisKKyAgICBVQ2hhcjMyIGZpcnN0
Q2hhcmFjdGVyOworICAgIFUxNl9HRVQoY2hhcmFjdGVycywgMCwgb2Zmc2V0LCBzaXplLCBmaXJz
dENoYXJhY3Rlcik7CisgICAgVUNoYXIzMiBwcmV2aW91c0NoYXJhY3RlcjsKKyAgICBVMTZfUFJF
VihjaGFyYWN0ZXJzLCAwLCBvZmZzZXQsIHByZXZpb3VzQ2hhcmFjdGVyKTsKKworICAgIGlmICht
X29wdGlvbnMgJiBUcmVhdE1lZGlhbENhcGl0YWxBc1dvcmRTdGFydCkgeworCisgICAgICAgIGlm
IChpc1NlcGFyYXRvcihmaXJzdENoYXJhY3RlcikpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzdGFy
dCBvZiBhIHNlcGFyYXRvciBydW4gaXMgYSB3b3JkIHN0YXJ0ICgiLm9yZyIgaW4gIndlYmtpdC5v
cmciKS4KKyAgICAgICAgICAgIGlmICghaXNTZXBhcmF0b3IocHJldmlvdXNDaGFyYWN0ZXIpKQor
ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGlzQVNDSUlV
cHBlcihmaXJzdENoYXJhY3RlcikpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzdGFydCBvZiBhbiB1
cHBlcmNhc2UgcnVuIGlzIGEgd29yZCBzdGFydCAoIktpdCIgaW4gIldlYktpdCIpLgorICAgICAg
ICAgICAgaWYgKCFpc0FTQ0lJVXBwZXIocHJldmlvdXNDaGFyYWN0ZXIpKQorICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgLy8gVGhlIGxhc3QgY2hhcmFjdGVyIG9mIGFu
IHVwcGVyY2FzZSBydW4gZm9sbG93ZWQgYnkgYSBub24tc2VwYXJhdG9yLCBub24tZGlnaXQKKyAg
ICAgICAgICAgIC8vIGlzIGEgd29yZCBzdGFydCAoIlJlcXVlc3QiIGluICJYTUxIVFRQUmVxdWVz
dCIpLgorICAgICAgICAgICAgb2Zmc2V0ID0gbV9jb250ZXh0LnNpemUoKSAtIGxlbmd0aDsKKyAg
ICAgICAgICAgIFUxNl9GV0RfMShjaGFyYWN0ZXJzLCBvZmZzZXQsIHNpemUpOworICAgICAgICAg
ICAgVUNoYXIzMiBuZXh0Q2hhcmFjdGVyID0gMDsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCBz
aXplKQorICAgICAgICAgICAgICAgIFUxNl9HRVQoY2hhcmFjdGVycywgMCwgb2Zmc2V0LCBzaXpl
LCBuZXh0Q2hhcmFjdGVyKTsKKyAgICAgICAgICAgIGlmICghaXNBU0NJSVVwcGVyKG5leHRDaGFy
YWN0ZXIpICYmICFpc0FTQ0lJRGlnaXQobmV4dENoYXJhY3RlcikgJiYgIWlzU2VwYXJhdG9yKG5l
eHRDaGFyYWN0ZXIpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVs
c2UgaWYgKGlzQVNDSUlEaWdpdChmaXJzdENoYXJhY3RlcikpIHsKKyAgICAgICAgICAgIC8vIFRo
ZSBzdGFydCBvZiBhIGRpZ2l0IHJ1biBpcyBhIHdvcmQgc3RhcnQgKCIyIiBpbiAiV2ViS2l0MiIp
LgorICAgICAgICAgICAgaWYgKCFpc0FTQ0lJRGlnaXQocHJldmlvdXNDaGFyYWN0ZXIpKQorICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGlzU2VwYXJhdG9y
KHByZXZpb3VzQ2hhcmFjdGVyKSB8fCBpc0FTQ0lJRGlnaXQocHJldmlvdXNDaGFyYWN0ZXIpKSB7
CisgICAgICAgICAgICAvLyBUaGUgc3RhcnQgb2YgYSBub24tc2VwYXJhdG9yLCBub24tdXBwZXJj
YXNlLCBub24tZGlnaXQgcnVuIGlzIGEgd29yZCBzdGFydCwKKyAgICAgICAgICAgIC8vIGV4Y2Vw
dCBhZnRlciBhbiB1cHBlcmNhc2UuICgib3JnIiBpbiAid2Via2l0Lm9yZyIsIGJ1dCBub3QgIm9y
ZSIgaW4gIldlYkNvcmUiKS4KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9Cisg
ICAgfQorCisgICAgLy8gQ2hpbmVzZSBhbmQgSmFwYW5lc2UgbGFjayB3b3JkIGJvdW5kYXJ5IG1h
cmtzLCBhbmQgdGhlcmUgaXMgbm8gY2xlYXIgYWdyZWVtZW50IG9uIHdoYXQgY29uc3RpdHV0ZXMK
KyAgICAvLyBhIHdvcmQsIHNvIHRyZWF0IHRoZSBwb3NpdGlvbiBiZWZvcmUgYW55IENKSyBjaGFy
YWN0ZXIgYXMgYSB3b3JkIHN0YXJ0LgorICAgIGlmIChGb250Ojppc0NKS0lkZW9ncmFwaE9yU3lt
Ym9sKGZpcnN0Q2hhcmFjdGVyKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoaXND
b2xsYXBzaWJsZVdoaXRlc3BhY2UocHJldmlvdXNDaGFyYWN0ZXIpIHx8IGlzU2VwYXJhdG9yKGZp
cnN0Q2hhcmFjdGVyKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBzaXplX3Qgc3RhcnQg
PSBtX2NvbnRleHQuc2l6ZSgpIC0gbGVuZ3RoOworICAgIHNpemVfdCB3b3JkQnJlYWtTZWFyY2hT
dGFydCA9IG1fY29udGV4dC5zaXplKCk7CisgICAgd2hpbGUgKHdvcmRCcmVha1NlYXJjaFN0YXJ0
ID4gc3RhcnQpCisgICAgICAgIHdvcmRCcmVha1NlYXJjaFN0YXJ0ID0gZmluZE5leHRXb3JkRnJv
bUluZGV4KG1fY29udGV4dC5kYXRhKCksIG1fY29udGV4dC5zaXplKCksIHdvcmRCcmVha1NlYXJj
aFN0YXJ0LCBmYWxzZSAvKiBiYWNrd2FyZHMgKi8pOworICAgIHJldHVybiB3b3JkQnJlYWtTZWFy
Y2hTdGFydCA9PSBzdGFydDsKIH0KIAogaW5saW5lIHNpemVfdCBTZWFyY2hCdWZmZXI6OnNlYXJj
aChzaXplX3QmIHN0YXJ0KQpAQCAtMjI0MSw3ICsyMzUxLDExIEBAIGlubGluZSBzaXplX3QgU2Vh
cmNoQnVmZmVyOjpzZWFyY2goc2l6ZV8KICAgICBpZiAobWVtY21wKCZtX2J1ZmZlclswXSwgbV90
YXJnZXQuY2hhcmFjdGVycygpICsgdGFpbFNwYWNlLCBtX2N1cnNvciAqIHNpemVvZihVQ2hhcikp
ICE9IDApCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgc3RhcnQgPSBsZW5ndGgoKTsKKyAgICBz
aXplX3QgbWF0Y2hlZExlbmd0aCA9IGxlbmd0aCgpOworICAgIGlmICgobV9vcHRpb25zICYgQXRX
b3JkU3RhcnRzKSAmJiAhaXNXb3JkU3RhcnRNYXRjaCgwLCBtYXRjaGVkTGVuZ3RoKSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBzdGFydCA9IG1hdGNoZWRMZW5ndGg7CiAKICAgICAvLyBOb3cg
dGhhdCB3ZSd2ZSBmb3VuZCBhIG1hdGNoIG9uY2UsIHdlIGRvbid0IHdhbnQgdG8gZmluZCBpdCBh
Z2FpbiwgYmVjYXVzZSB0aG9zZQogICAgIC8vIGFyZSB0aGUgU2VhcmNoQnVmZmVyIHNlbWFudGlj
cywgYWxsb3dpbmcgZm9yIGEgYnVmZmVyIHdoZXJlIHlvdSBhcHBlbmQgbW9yZSB0aGFuIG9uZQo=
</data>
<flag name="review"
          id="88412"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>