<?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>48227</bug_id>
          
          <creation_ts>2010-10-25 03:58:39 -0700</creation_ts>
          <short_desc>[GTK] Handle surrogate pairs in TextBreakIteratorGtk</short_desc>
          <delta_ts>2010-10-29 09:58:52 -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>WebKitGTK</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</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>34247</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Carlos Garcia Campos">cgarcia</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>commit-queue</cc>
    
    <cc>eric</cc>
    
    <cc>mrobinson</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>298782</commentid>
    <comment_count>0</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2010-10-25 03:58:39 -0700</bug_when>
    <thetext>Strings with surrogate pairs are not correctly handled when using the glib unicode backend.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>298783</commentid>
    <comment_count>1</comment_count>
      <attachid>71728</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2010-10-25 04:03:51 -0700</bug_when>
    <thetext>Created attachment 71728
Patch to handle surrogate pairs in TextBreakIteratorGtk

TextBreakIteratorGtk uses utf8 because it&apos;s what pango expects, but we need to return indices for the given input string that it&apos;s in utf16. The number of characters is the same for both utf16 and ut8 except when the input string contains surrogate pairs. We need to keep both, the index for the utf8 string to be used internally, and the index for the utf16 string to be used as return value of the iterator interface. It fixes test fast/forms/textarea-maxlength.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>298995</commentid>
    <comment_count>2</comment_count>
      <attachid>71728</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-10-25 11:36:49 -0700</bug_when>
    <thetext>Comment on attachment 71728
Patch to handle surrogate pairs in TextBreakIteratorGtk

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

Looking good, but here are some suggestions.

&gt; WebCore/ChangeLog:9
&gt; +        need to return indices for the given input string that it&apos;s in utf16.

I think this should be &quot;that it&apos;s in&quot; --&gt; &quot;that are in&quot; Should be &apos;UTF-8&apos; and &apos;UTF-16&apos; throughout.

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:42
&gt; +    GOwnPtr&lt;char&gt; m_utf8;

This should probably be a CString.

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:115
&gt; +static int characterSize(const gchar* str, glong offset)

&apos;str&apos; should be &apos;string&apos;

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:119
&gt; +    gchar* p = g_utf8_offset_to_pointer(str, offset);
&gt; +    gunichar c = g_utf8_get_char(p);
&gt; +    return (c &gt;= 0x10000 &amp;&amp; c &lt;= 0x10FFFF) ? 2 : 1;

Avoid using one letter variable names. These should be full words. Can we use any of the stuff from JavaScriptCore/wtf/unicode/UnicodeMacrosFromICU.hto remove these magic numbers?

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:122
&gt; +static int nextUtf16Step(TextBreakIterator* bi, int i)

Again avoid abbreviations here.

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:130
&gt; +static int previousUtf16Step(TextBreakIterator* bi, int i)

Ditto.

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:140
&gt; +static int getUTF8Index(TextBreakIterator* bi, int i)

Ditto.

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:159
&gt;  int textBreakFirst(TextBreakIterator* bi)

Ditto.

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:166
&gt;  int textBreakLast(TextBreakIterator* bi)

Ditto.

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:188
&gt; +            if ((whiteSpaceAtTheEnd = bi-&gt;m_logAttrs[pos].is_white)) {

Why the extra parenthesis here?

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:201
&gt;  int textBreakNext(TextBreakIterator* bi)

Ditto.

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:223
&gt;  int textBreakPrevious(TextBreakIterator* bi)

Ditto, etc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300150</commentid>
    <comment_count>3</comment_count>
      <attachid>72019</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2010-10-27 05:40:30 -0700</bug_when>
    <thetext>Created attachment 72019
New patch to handle surrogate pairs

This patch is not just an update of the previous one. In order to simplify the code I&apos;ve added a new class CharacterIterator that takes care of the utf8 and untf16 indices. The break iterator uses this class to iterate over the input string. I&apos;ve fixed all coding styles issues in the file too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300153</commentid>
    <comment_count>4</comment_count>
      <attachid>72020</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2010-10-27 05:45:08 -0700</bug_when>
    <thetext>Created attachment 72020
Previous patch with ChangeLog fixed

Sorry, I made a mistake  generating changelog in the previous patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300912</commentid>
    <comment_count>5</comment_count>
      <attachid>72020</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-10-28 00:07:34 -0700</bug_when>
    <thetext>Comment on attachment 72020
Previous patch with ChangeLog fixed

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

Very nice! I just have a couple very small comments.

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:31
&gt; +using namespace std;

I think I&apos;d prefer the functions you&apos;re using to be explicit here.

using std::max; for example.

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:33
&gt; +#define IS_SURROGATE(character) (character &gt;= 0x10000 &amp;&amp; character &lt;= 0x10FFFF)

I think this should probably be called UTF8_IS_SURROGATE just to be clear that it deals with UTF-8 characters.

&gt; WebCore/platform/text/gtk/TextBreakIteratorGtk.cpp:77
&gt; +    long utf8len = 0;

According to the style guidelines, this should be utf8Length.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300918</commentid>
    <comment_count>6</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-10-28 00:18:35 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; I think I&apos;d prefer the functions you&apos;re using to be explicit here.
&gt; using std::max; for example.

Carlos pointed out that I&apos;m wrong about this. The style guidelines are explicit that &quot;using namespace std;&quot; is preferred.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>300999</commentid>
    <comment_count>7</comment_count>
      <attachid>72171</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2010-10-28 05:10:41 -0700</bug_when>
    <thetext>Created attachment 72171
Updated patch according to review</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>301103</commentid>
    <comment_count>8</comment_count>
      <attachid>72171</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-10-28 09:24:00 -0700</bug_when>
    <thetext>Comment on attachment 72171
Updated patch according to review

Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>301781</commentid>
    <comment_count>9</comment_count>
      <attachid>72171</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-10-29 08:39:14 -0700</bug_when>
    <thetext>Comment on attachment 72171
Updated patch according to review

Clearing flags on attachment: 72171

Committed r70881: &lt;http://trac.webkit.org/changeset/70881&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>301783</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-10-29 08:39:21 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>301836</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-10-29 09:58:52 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/70881 might have broken Leopard Intel Release (Tests)
The following tests are not passing:
fast/workers/storage/interrupt-database-sync.html</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>71728</attachid>
            <date>2010-10-25 04:03:51 -0700</date>
            <delta_ts>2010-10-27 05:40:30 -0700</delta_ts>
            <desc>Patch to handle surrogate pairs in TextBreakIteratorGtk</desc>
            <filename>surrogate-pairs.diff</filename>
            <type>text/plain</type>
            <size>8167</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MTU1OTc3Yy4uMmZiZDNjMSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMiBAQAorMjAxMC0xMC0yNSAgQ2FybG9zIEdhcmNp
YSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgW0dUS10gSGFuZGxlIHN1cnJvZ2F0ZSBwYWlycyBpbiBU
ZXh0QnJlYWtJdGVyYXRvckd0aworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDgyMjcKKworICAgICAgICBUZXh0QnJlYWtJdGVyYXRvckd0ayB1c2VzIHV0
ZjggYmVjYXVzZSBpdCdzIHdoYXQgcGFuZ28gZXhwZWN0cywgYnV0IHdlCisgICAgICAgIG5lZWQg
dG8gcmV0dXJuIGluZGljZXMgZm9yIHRoZSBnaXZlbiBpbnB1dCBzdHJpbmcgdGhhdCBpdCdzIGlu
IHV0ZjE2LgorICAgICAgICBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaXMgdGhlIHNhbWUgZm9y
IGJvdGggdXRmMTYgYW5kIHV0OCBleGNlcHQgd2hlbgorICAgICAgICB0aGUgaW5wdXQgc3RyaW5n
IGNvbnRhaW5zIHN1cnJvZ2F0ZSBwYWlycy4gV2UgbmVlZCB0byBrZWVwIGJvdGgsIHRoZQorICAg
ICAgICBpbmRleCBmb3IgdGhlIHV0Zjggc3RyaW5nIHRvIGJlIHVzZWQgaW50ZXJuYWxseSwgYW5k
IHRoZSBpbmRleCBmb3IgdGhlCisgICAgICAgIHV0ZjE2IHN0cmluZyB0byBiZSB1c2VkIGFzIHJl
dHVybiB2YWx1ZSBvZiB0aGUgaXRlcmF0b3IgaW50ZXJmYWNlLiBJdAorICAgICAgICBmaXhlcyB0
ZXN0IGZhc3QvZm9ybXMvdGV4dGFyZWEtbWF4bGVuZ3RoLmh0bWwKKworICAgICAgICAqIHBsYXRm
b3JtL3RleHQvZ3RrL1RleHRCcmVha0l0ZXJhdG9yR3RrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OnNldFVwSXRlcmF0b3IpOgorICAgICAgICAoV2ViQ29yZTo6Y2hhcmFjdGVyU2l6ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpuZXh0VXRmMTZTdGVwKToKKyAgICAgICAgKFdlYkNvcmU6OnByZXZpb3Vz
VXRmMTZTdGVwKToKKyAgICAgICAgKFdlYkNvcmU6OmdldFVURjhJbmRleCk6CisgICAgICAgIChX
ZWJDb3JlOjp0ZXh0QnJlYWtGaXJzdCk6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0QnJlYWtMYXN0
KToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRCcmVha05leHQpOgorICAgICAgICAoV2ViQ29yZTo6
dGV4dEJyZWFrUHJldmlvdXMpOgorICAgICAgICAoV2ViQ29yZTo6dGV4dEJyZWFrUHJlY2VkaW5n
KToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRCcmVha0ZvbGxvd2luZyk6CisgICAgICAgIChXZWJD
b3JlOjp0ZXh0QnJlYWtDdXJyZW50KToKKwogMjAxMC0xMC0yMSAgS3dhbmcgWXVsIFNlbyAgPHNr
eXVsQGNvbXBhbnkxMDAubmV0PgogCiAgICAgICAgIFJldmlld2VkIGJ5IEtlbnQgVGFtdXJhLgpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0QnJlYWtJdGVyYXRvckd0
ay5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRCcmVha0l0ZXJhdG9yR3RrLmNw
cAppbmRleCBkOGFiZjBkLi45ODY0YzhhIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL3Rl
eHQvZ3RrL1RleHRCcmVha0l0ZXJhdG9yR3RrLmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3Rl
eHQvZ3RrL1RleHRCcmVha0l0ZXJhdG9yR3RrLmNwcApAQCAtMzksOSArMzksMTIgQEAgZW51bSBV
QnJlYWtJdGVyYXRvclR5cGUgewogY2xhc3MgVGV4dEJyZWFrSXRlcmF0b3IgewogcHVibGljOgog
ICAgIFVCcmVha0l0ZXJhdG9yVHlwZSBtX3R5cGU7CisgICAgR093blB0cjxjaGFyPiBtX3V0Zjg7
CiAgICAgaW50IG1fbGVuZ3RoOwotICAgIFBhbmdvTG9nQXR0ciogbV9sb2dBdHRyczsKICAgICBp
bnQgbV9pbmRleDsKKyAgICBQYW5nb0xvZ0F0dHIqIG1fbG9nQXR0cnM7CisgICAgaW50IG1fdXRm
MTZJbmRleDsKKyAgICBpbnQgbV91dGYxNkxlbmd0aDsKIH07CiAKIHN0YXRpYyBUZXh0QnJlYWtJ
dGVyYXRvciogc2V0VXBJdGVyYXRvcihib29sJiBjcmVhdGVkSXRlcmF0b3IsIFRleHRCcmVha0l0
ZXJhdG9yKiYgaXRlcmF0b3IsCkBAIC01NywxOSArNjAsMjAgQEAgc3RhdGljIFRleHRCcmVha0l0
ZXJhdG9yKiBzZXRVcEl0ZXJhdG9yKGJvb2wmIGNyZWF0ZWRJdGVyYXRvciwgVGV4dEJyZWFrSXRl
cmF0b3IKICAgICBpZiAoIWl0ZXJhdG9yKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGxvbmcg
dXRmOGxlbjsKLSAgICBHT3duUHRyPGNoYXI+IHV0Zjg7Ci0gICAgdXRmOC5zZXQoZ191dGYxNl90
b191dGY4KHN0cmluZywgbGVuZ3RoLCAwLCAmdXRmOGxlbiwgMCkpOwotCi0gICAgLy8gRklYTUU6
IGFzc3VtZXMgbm8gc3Vycm9nYXRlIHBhaXJzCisgICAgbG9uZyB1dGY4bGVuID0gMDsKKyAgICBp
dGVyYXRvci0+bV91dGY4LnNldChnX3V0ZjE2X3RvX3V0Zjgoc3RyaW5nLCBsZW5ndGgsIDAsICZ1
dGY4bGVuLCAwKSk7CisgICAgaWYgKCF1dGY4bGVuKQorICAgICAgICByZXR1cm4gMDsKIAogICAg
IGl0ZXJhdG9yLT5tX3R5cGUgPSB0eXBlOwotICAgIGl0ZXJhdG9yLT5tX2xlbmd0aCA9IGxlbmd0
aDsKKyAgICBpdGVyYXRvci0+bV91dGYxNkxlbmd0aCA9IGxlbmd0aDsKKyAgICBpdGVyYXRvci0+
bV9sZW5ndGggPSBnX3V0Zjhfc3RybGVuKGl0ZXJhdG9yLT5tX3V0ZjguZ2V0KCksIHV0ZjhsZW4p
OwogICAgIGlmIChjcmVhdGVkSXRlcmF0b3IpCiAgICAgICAgIGdfZnJlZShpdGVyYXRvci0+bV9s
b2dBdHRycyk7Ci0gICAgaXRlcmF0b3ItPm1fbG9nQXR0cnMgPSBnX25ldzAoUGFuZ29Mb2dBdHRy
LCBsZW5ndGggKyAxKTsKKyAgICBpdGVyYXRvci0+bV9sb2dBdHRycyA9IGdfbmV3MChQYW5nb0xv
Z0F0dHIsIGl0ZXJhdG9yLT5tX2xlbmd0aCArIDEpOwogICAgIGl0ZXJhdG9yLT5tX2luZGV4ID0g
MDsKLSAgICBwYW5nb19nZXRfbG9nX2F0dHJzKHV0ZjguZ2V0KCksIHV0ZjhsZW4sIC0xLCAwLCBp
dGVyYXRvci0+bV9sb2dBdHRycywgbGVuZ3RoICsgMSk7CisgICAgaXRlcmF0b3ItPm1fdXRmMTZJ
bmRleCA9IDA7CisgICAgcGFuZ29fZ2V0X2xvZ19hdHRycyhpdGVyYXRvci0+bV91dGY4LmdldCgp
LCB1dGY4bGVuLCAtMSwgMCwgaXRlcmF0b3ItPm1fbG9nQXR0cnMsIGl0ZXJhdG9yLT5tX2xlbmd0
aCArIDEpOwogCiAgICAgcmV0dXJuIGl0ZXJhdG9yOwogfQpAQCAtMTA4LDE4ICsxMTIsNTUgQEAg
VGV4dEJyZWFrSXRlcmF0b3IqIHNlbnRlbmNlQnJlYWtJdGVyYXRvcihjb25zdCBVQ2hhciogc3Ry
aW5nLCBpbnQgbGVuZ3RoKQogICAgIHJldHVybiBzZXRVcEl0ZXJhdG9yKGNyZWF0ZWRTZW50ZW5j
ZUJyZWFrSXRlcmF0b3IsIHN0YXRpY1NlbnRlbmNlQnJlYWtJdGVyYXRvciwgVUJSS19TRU5URU5D
RSwgc3RyaW5nLCBsZW5ndGgpOwogfQogCitzdGF0aWMgaW50IGNoYXJhY3RlclNpemUoY29uc3Qg
Z2NoYXIqIHN0ciwgZ2xvbmcgb2Zmc2V0KQoreworICAgIGdjaGFyKiBwID0gZ191dGY4X29mZnNl
dF90b19wb2ludGVyKHN0ciwgb2Zmc2V0KTsKKyAgICBndW5pY2hhciBjID0gZ191dGY4X2dldF9j
aGFyKHApOworICAgIHJldHVybiAoYyA+PSAweDEwMDAwICYmIGMgPD0gMHgxMEZGRkYpID8gMiA6
IDE7Cit9CisKK3N0YXRpYyBpbnQgbmV4dFV0ZjE2U3RlcChUZXh0QnJlYWtJdGVyYXRvciogYmks
IGludCBpKQoreworICAgIGlmIChiaS0+bV9sZW5ndGggPT0gYmktPm1fdXRmMTZMZW5ndGgpCisg
ICAgICAgIHJldHVybiAxOworCisgICAgcmV0dXJuIGNoYXJhY3RlclNpemUoYmktPm1fdXRmOC5n
ZXQoKSwgaSk7Cit9CisKK3N0YXRpYyBpbnQgcHJldmlvdXNVdGYxNlN0ZXAoVGV4dEJyZWFrSXRl
cmF0b3IqIGJpLCBpbnQgaSkKK3sKKyAgICBpZiAoYmktPm1fbGVuZ3RoID09IGJpLT5tX3V0ZjE2
TGVuZ3RoKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoIWkpCisgICAgICAgIHJldHVybiAx
OworCisgICAgcmV0dXJuIGNoYXJhY3RlclNpemUoYmktPm1fdXRmOC5nZXQoKSwgaSAtIDEpOwor
fQorCitzdGF0aWMgaW50IGdldFVURjhJbmRleChUZXh0QnJlYWtJdGVyYXRvciogYmksIGludCBp
KQoreworICAgIGlmIChiaS0+bV9sZW5ndGggPT0gYmktPm1fdXRmMTZMZW5ndGgpCisgICAgICAg
IHJldHVybiBpOworICAgIGlmICghaSkKKyAgICAgICAgcmV0dXJuIGk7CisgICAgaWYgKGkgPT0g
YmktPm1fdXRmMTZMZW5ndGgpCisgICAgICAgIHJldHVybiBiaS0+bV9sZW5ndGg7CisKKyAgICBp
bnQgdXRmMTZJbmRleCA9IDA7CisgICAgaW50IHV0ZjhJbmRleCA9IDA7CisgICAgd2hpbGUgKHV0
ZjE2SW5kZXggPCBpKSB7CisgICAgICAgIHV0ZjE2SW5kZXggKz0gY2hhcmFjdGVyU2l6ZShiaS0+
bV91dGY4LmdldCgpLCB1dGY4SW5kZXgpOworICAgICAgICB1dGY4SW5kZXgrKzsKKyAgICB9CisK
KyAgICByZXR1cm4gdXRmOEluZGV4OworfQorCiBpbnQgdGV4dEJyZWFrRmlyc3QoVGV4dEJyZWFr
SXRlcmF0b3IqIGJpKQogewogICAgIC8vIHNlZSB0ZXh0QnJlYWtMYXN0Ci0gICAgCi0gICAgaW50
IGZpcnN0Q3Vyc29yUG9zaXRpb24gPSAtMTsKLSAgICBpbnQgcG9zID0gMDsKLSAgICB3aGlsZSAo
cG9zIDw9IGJpLT5tX2xlbmd0aCAmJiAoZmlyc3RDdXJzb3JQb3NpdGlvbiA8IDApKSB7Ci0gICAg
ICAgIGlmIChiaS0+bV9sb2dBdHRyc1twb3NdLmlzX2N1cnNvcl9wb3NpdGlvbikKLSAgICAgICAg
ICAgIGZpcnN0Q3Vyc29yUG9zaXRpb24gPSBwb3M7Ci0gICAgfQotICAgIGJpLT5tX2luZGV4ID0g
Zmlyc3RDdXJzb3JQb3NpdGlvbjsKLSAgICByZXR1cm4gZmlyc3RDdXJzb3JQb3NpdGlvbjsKKyAg
ICBiaS0+bV9pbmRleCA9IGJpLT5tX3V0ZjE2SW5kZXggPSAwOworICAgIHJldHVybiBiaS0+bV91
dGYxNkluZGV4OwogfQogCiBpbnQgdGV4dEJyZWFrTGFzdChUZXh0QnJlYWtJdGVyYXRvciogYmkp
CkBAIC0xMzgsMjIgKzE3OSwzMCBAQCBpbnQgdGV4dEJyZWFrTGFzdChUZXh0QnJlYWtJdGVyYXRv
ciogYmkpCiAgICAgCiAgICAgYm9vbCB3aGl0ZVNwYWNlQXRUaGVFbmQgPSB0cnVlOwogICAgIGlu
dCBuZXh0V2hpdGVTcGFjZVBvcyA9IGJpLT5tX2xlbmd0aDsKKyAgICBpbnQgbmV4dFdoaXRlU3Bh
Y2VQb3MxNiA9IGJpLT5tX3V0ZjE2TGVuZ3RoOwogICAgIAogICAgIGludCBwb3MgPSBiaS0+bV9s
ZW5ndGg7CisgICAgaW50IHBvczE2ID0gYmktPm1fdXRmMTZMZW5ndGg7CiAgICAgd2hpbGUgKHBv
cyA+PSAwICYmIHdoaXRlU3BhY2VBdFRoZUVuZCkgewogICAgICAgICBpZiAoYmktPm1fbG9nQXR0
cnNbcG9zXS5pc19jdXJzb3JfcG9zaXRpb24pIHsKLSAgICAgICAgICAgIGlmICh3aGl0ZVNwYWNl
QXRUaGVFbmQgPSBiaS0+bV9sb2dBdHRyc1twb3NdLmlzX3doaXRlKQorICAgICAgICAgICAgaWYg
KCh3aGl0ZVNwYWNlQXRUaGVFbmQgPSBiaS0+bV9sb2dBdHRyc1twb3NdLmlzX3doaXRlKSkgewog
ICAgICAgICAgICAgICAgIG5leHRXaGl0ZVNwYWNlUG9zID0gcG9zOworICAgICAgICAgICAgICAg
IG5leHRXaGl0ZVNwYWNlUG9zMTYgPSBwb3MxNjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQor
ICAgICAgICBwb3MxNiAtPSBwcmV2aW91c1V0ZjE2U3RlcChiaSwgcG9zKTsKICAgICAgICAgcG9z
LS07CiAgICAgfQogICAgIGJpLT5tX2luZGV4ID0gbmV4dFdoaXRlU3BhY2VQb3M7Ci0gICAgcmV0
dXJuIG5leHRXaGl0ZVNwYWNlUG9zOworICAgIGJpLT5tX3V0ZjE2SW5kZXggPSBuZXh0V2hpdGVT
cGFjZVBvczE2OworICAgIHJldHVybiBuZXh0V2hpdGVTcGFjZVBvczE2OwogfQogCiBpbnQgdGV4
dEJyZWFrTmV4dChUZXh0QnJlYWtJdGVyYXRvciogYmkpCiB7CisgICAgaW50IHV0ZjE2SW5kZXgg
PSBiaS0+bV91dGYxNkluZGV4OwogICAgIGZvciAoaW50IGkgPSBiaS0+bV9pbmRleCArIDE7IGkg
PD0gYmktPm1fbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdXRmMTZJbmRleCArPSBuZXh0VXRmMTZT
dGVwKGJpLCBpIC0gMSk7CiAKICAgICAgICAgLy8gRklYTUU6IFVCUktfV09SRCBjYXNlOiBTaW5n
bGUgbXVsdGlieXRlIGNoYXJhY3RlcnMgKGkuZS4gd2hpdGUgc3BhY2UgYXJvdW5kIHRoZW0pLCBz
dWNoIGFzIHRoZSBldXJvIHN5bWJvbCDigqwsIAogICAgICAgICAvLyBhcmUgbm90IG1hcmtlZCBh
cyB3b3JkX3N0YXJ0ICYgd29yZF9lbmQgYXMgb3Bwb3NlZCB0byB0aGUgd2F5IElDVSBkb2VzIGl0
LgpAQCAtMTY0LDcgKzIxMyw4IEBAIGludCB0ZXh0QnJlYWtOZXh0KFRleHRCcmVha0l0ZXJhdG9y
KiBiaSkKICAgICAgICAgICAgIHx8IChiaS0+bV90eXBlID09IFVCUktfQ0hBUkFDVEVSICYmIGJp
LT5tX2xvZ0F0dHJzW2ldLmlzX2N1cnNvcl9wb3NpdGlvbikKICAgICAgICAgICAgIHx8IChiaS0+
bV90eXBlID09IFVCUktfU0VOVEVOQ0UgJiYgKGJpLT5tX2xvZ0F0dHJzW2ldLmlzX3NlbnRlbmNl
X3N0YXJ0IHx8IGJpLT5tX2xvZ0F0dHJzW2ldLmlzX3NlbnRlbmNlX2VuZCkpICkgewogICAgICAg
ICAgICAgYmktPm1faW5kZXggPSBpOwotICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAg
ICBiaS0+bV91dGYxNkluZGV4ID0gdXRmMTZJbmRleDsKKyAgICAgICAgICAgIHJldHVybiB1dGYx
NkluZGV4OwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBUZXh0QnJlYWtEb25lOwpAQCAt
MTcyLDEzICsyMjIsMTcgQEAgaW50IHRleHRCcmVha05leHQoVGV4dEJyZWFrSXRlcmF0b3IqIGJp
KQogCiBpbnQgdGV4dEJyZWFrUHJldmlvdXMoVGV4dEJyZWFrSXRlcmF0b3IqIGJpKQogeworICAg
IGludCB1dGYxNkluZGV4ID0gYmktPm1fdXRmMTZJbmRleDsKICAgICBmb3IgKGludCBpID0gYmkt
Pm1faW5kZXggLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICB1dGYxNkluZGV4IC09IHByZXZp
b3VzVXRmMTZTdGVwKGJpLCBpKTsKKwogICAgICAgICBpZiAoKGJpLT5tX3R5cGUgPT0gVUJSS19M
SU5FICYmIGJpLT5tX2xvZ0F0dHJzW2ldLmlzX2xpbmVfYnJlYWspCiAgICAgICAgICAgICB8fCAo
YmktPm1fdHlwZSA9PSBVQlJLX1dPUkQgJiYgKGJpLT5tX2xvZ0F0dHJzW2ldLmlzX3dvcmRfc3Rh
cnQgfHwgYmktPm1fbG9nQXR0cnNbaV0uaXNfd29yZF9lbmQpKQogICAgICAgICAgICAgfHwgKGJp
LT5tX3R5cGUgPT0gVUJSS19DSEFSQUNURVIgJiYgYmktPm1fbG9nQXR0cnNbaV0uaXNfY3Vyc29y
X3Bvc2l0aW9uKQogICAgICAgICAgICAgfHwgKGJpLT5tX3R5cGUgPT0gVUJSS19TRU5URU5DRSAm
JiAoYmktPm1fbG9nQXR0cnNbaV0uaXNfc2VudGVuY2Vfc3RhcnQgfHwgYmktPm1fbG9nQXR0cnNb
aV0uaXNfc2VudGVuY2VfZW5kKSkgKSB7CiAgICAgICAgICAgICBiaS0+bV9pbmRleCA9IGk7Ci0g
ICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIGJpLT5tX3V0ZjE2SW5kZXggPSB1dGYx
NkluZGV4OworICAgICAgICAgICAgcmV0dXJuIHV0ZjE2SW5kZXg7CiAgICAgICAgIH0KICAgICB9
CiAgICAgcmV0dXJuIHRleHRCcmVha0ZpcnN0KGJpKTsKQEAgLTE4Niw3ICsyNDAsOCBAQCBpbnQg
dGV4dEJyZWFrUHJldmlvdXMoVGV4dEJyZWFrSXRlcmF0b3IqIGJpKQogCiBpbnQgdGV4dEJyZWFr
UHJlY2VkaW5nKFRleHRCcmVha0l0ZXJhdG9yKiBiaSwgaW50IHBvcykKIHsKLSAgICBiaS0+bV9p
bmRleCA9IHBvczsKKyAgICBiaS0+bV9pbmRleCA9IGdldFVURjhJbmRleChiaSwgcG9zKTsKKyAg
ICBiaS0+bV91dGYxNkluZGV4ID0gcG9zOwogICAgIHJldHVybiB0ZXh0QnJlYWtQcmV2aW91cyhi
aSk7CiB9CiAKQEAgLTE5NCwxMyArMjQ5LDE0IEBAIGludCB0ZXh0QnJlYWtGb2xsb3dpbmcoVGV4
dEJyZWFrSXRlcmF0b3IqIGJpLCBpbnQgcG9zKQogewogICAgIGlmIChwb3MgPCAwKQogICAgICAg
ICBwb3MgPSAtMTsKLSAgICBiaS0+bV9pbmRleCA9IHBvczsKKyAgICBiaS0+bV9pbmRleCA9IGdl
dFVURjhJbmRleChiaSwgcG9zKTsKKyAgICBiaS0+bV91dGYxNkluZGV4ID0gcG9zOwogICAgIHJl
dHVybiB0ZXh0QnJlYWtOZXh0KGJpKTsKIH0KIAogaW50IHRleHRCcmVha0N1cnJlbnQoVGV4dEJy
ZWFrSXRlcmF0b3IqIGJpKQogewotICAgIHJldHVybiBiaS0+bV9pbmRleDsKKyAgICByZXR1cm4g
YmktPm1fdXRmMTZJbmRleDsKIH0KIAogYm9vbCBpc1RleHRCcmVhayhUZXh0QnJlYWtJdGVyYXRv
ciogYmksIGludCBwb3MpCg==
</data>
<flag name="review"
          id="61835"
          type_id="1"
          status="-"
          setter="mrobinson"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72019</attachid>
            <date>2010-10-27 05:40:30 -0700</date>
            <delta_ts>2010-10-27 05:45:08 -0700</delta_ts>
            <desc>New patch to handle surrogate pairs</desc>
            <filename>surrogate.diff</filename>
            <type>text/plain</type>
            <size>14067</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MTU1OTc3Yy4uMDk2OTU3NyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMCBAQAorMjAxMC0xMC0yNyAgQ2FybG9zIEdhcmNp
YSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5jb20+CisKKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0
L2d0ay9UZXh0QnJlYWtJdGVyYXRvckd0ay5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0
ZXJJdGVyYXRvcjo6Z2V0VGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJJdGVyYXRv
cjo6Z2V0TGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpnZXRT
aXplKToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpnZXRJbmRleCk6Cisg
ICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJJdGVyYXRvcjo6Z2V0TmF0aXZlSW5kZXgpOgorICAg
ICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVySXRlcmF0b3I6OmdldE5hdGl2ZUxlbmd0aCk6CisgICAg
ICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJJdGVyYXRvcjo6Y2hhcmFjdGVyU2l6ZSk6CisgICAgICAg
IChXZWJDb3JlOjpDaGFyYWN0ZXJJdGVyYXRvcjo6c2V0VGV4dCk6CisgICAgICAgIChXZWJDb3Jl
OjpDaGFyYWN0ZXJJdGVyYXRvcjo6c2V0SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFj
dGVySXRlcmF0b3I6OnNldE5hdGl2ZUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rl
ckl0ZXJhdG9yOjpmaXJzdCk6CisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJJdGVyYXRvcjo6
bGFzdCk6CisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJJdGVyYXRvcjo6bmV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJJdGVyYXRvcjo6cHJldmlvdXMpOgorICAgICAgICAoV2Vi
Q29yZTo6c2V0VXBJdGVyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0QnJlYWtGaXJzdCk6
CisgICAgICAgIChXZWJDb3JlOjp0ZXh0QnJlYWtMYXN0KToKKyAgICAgICAgKFdlYkNvcmU6OnRl
eHRCcmVha05leHQpOgorICAgICAgICAoV2ViQ29yZTo6dGV4dEJyZWFrUHJldmlvdXMpOgorICAg
ICAgICAoV2ViQ29yZTo6dGV4dEJyZWFrUHJlY2VkaW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnRl
eHRCcmVha0ZvbGxvd2luZyk6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0QnJlYWtDdXJyZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OmlzVGV4dEJyZWFrKToKKwogMjAxMC0xMC0yMSAgS3dhbmcgWXVs
IFNlbyAgPHNreXVsQGNvbXBhbnkxMDAubmV0PgogCiAgICAgICAgIFJldmlld2VkIGJ5IEtlbnQg
VGFtdXJhLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L2d0ay9UZXh0QnJlYWtJ
dGVyYXRvckd0ay5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3RrL1RleHRCcmVha0l0ZXJh
dG9yR3RrLmNwcAppbmRleCBkOGFiZjBkLi5lYjQ4ZTYxIDEwMDY0NAotLS0gYS9XZWJDb3JlL3Bs
YXRmb3JtL3RleHQvZ3RrL1RleHRCcmVha0l0ZXJhdG9yR3RrLmNwcAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL3RleHQvZ3RrL1RleHRCcmVha0l0ZXJhdG9yR3RrLmNwcApAQCAtMyw2ICszLDcgQEAK
ICAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAg
KiBDb3B5cmlnaHQgKEMpIDIwMDggSsO8cmcgQmlsbGV0ZXIgPGpAYml0cm9uLmNoPgogICogQ29w
eXJpZ2h0IChDKSAyMDA4IERvbWluaWsgUsO2dHRzY2hlcyA8ZG9taW5pay5yb2V0dHNjaGVzQGFj
Y2Vzcy1jb21wYW55LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBJZ2FsaWEgUy5MLgogICoK
ICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCkBAIC0yMiwxMyArMjMsMTYwIEBACiAgKi8KIAogI2luY2x1ZGUgImNv
bmZpZy5oIgotI2luY2x1ZGUgIkdPd25QdHIuaCIKKwogI2luY2x1ZGUgIlRleHRCcmVha0l0ZXJh
dG9yLmgiCiAKKyNpbmNsdWRlICJHT3duUHRyLmgiCiAjaW5jbHVkZSA8cGFuZ28vcGFuZ28uaD4K
K3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKyNkZWZpbmUgSVNfU1VSUk9HQVRFKGNoYXJhY3Rlcikg
KGNoYXJhY3RlciA+PSAweDEwMDAwICYmIGNoYXJhY3RlciA8PSAweDEwRkZGRikKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCitjbGFzcyBDaGFyYWN0ZXJJdGVyYXRvciB7CitwdWJsaWM6CisgICAg
Ym9vbCBzZXRUZXh0KGNvbnN0IFVDaGFyKiBzdHJpbmcsIGludCBsZW5ndGgpOworICAgIGNvbnN0
IGdjaGFyKiBnZXRUZXh0KCkgeyByZXR1cm4gbV91dGY4LmdldCgpOyB9CisgICAgaW50IGdldExl
bmd0aCgpIHsgcmV0dXJuIG1fbGVuZ3RoOyB9CisgICAgZ2xvbmcgZ2V0U2l6ZSgpIHsgcmV0dXJu
IG1fc2l6ZTsgfQorICAgIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KTsKKyAgICBpbnQgZ2V0SW5k
ZXgoKSB7IHJldHVybiBtX2luZGV4OyB9CisgICAgdm9pZCBzZXROYXRpdmVJbmRleChpbnQgaW5k
ZXgpOworICAgIGludCBnZXROYXRpdmVJbmRleCgpIHsgcmV0dXJuIG1fdXRmMTZJbmRleDsgfQor
ICAgIGludCBnZXROYXRpdmVMZW5ndGgoKSB7IHJldHVybiBtX3V0ZjE2TGVuZ3RoOyB9CisgICAg
aW50IGZpcnN0KCk7CisgICAgaW50IGxhc3QoKTsKKyAgICBpbnQgbmV4dCgpOworICAgIGludCBw
cmV2aW91cygpOworcHJpdmF0ZToKKyAgICBpbnQgY2hhcmFjdGVyU2l6ZShpbnQgaW5kZXgpOwor
CisgICAgR093blB0cjxjaGFyPiBtX3V0Zjg7CisgICAgaW50IG1fbGVuZ3RoOworICAgIGxvbmcg
bV9zaXplOworICAgIGludCBtX2luZGV4OworICAgIGludCBtX3V0ZjE2SW5kZXg7CisgICAgaW50
IG1fdXRmMTZMZW5ndGg7Cit9OworCitpbnQgQ2hhcmFjdGVySXRlcmF0b3I6OmNoYXJhY3RlclNp
emUoaW50IGluZGV4KQoreworICAgIGlmIChpbmRleCA9PSBtX2xlbmd0aCB8fCBpbmRleCA8IDAp
CisgICAgICAgIHJldHVybiAwOworICAgIGlmIChtX2xlbmd0aCA9PSBtX3V0ZjE2TGVuZ3RoKQor
ICAgICAgICByZXR1cm4gMTsKKworICAgIGdjaGFyKiBpbmRleFB0ciA9IGdfdXRmOF9vZmZzZXRf
dG9fcG9pbnRlcihtX3V0ZjguZ2V0KCksIGluZGV4KTsKKyAgICBndW5pY2hhciBjaGFyYWN0ZXIg
PSBnX3V0ZjhfZ2V0X2NoYXIoaW5kZXhQdHIpOworICAgIHJldHVybiBJU19TVVJST0dBVEUoY2hh
cmFjdGVyKSA/IDIgOiAxOworfQorCitib29sIENoYXJhY3Rlckl0ZXJhdG9yOjpzZXRUZXh0KGNv
bnN0IFVDaGFyKiBzdHJpbmcsIGludCBsZW5ndGgpCit7CisgICAgbG9uZyB1dGY4bGVuID0gMDsK
KyAgICBtX3V0Zjguc2V0KGdfdXRmMTZfdG9fdXRmOChzdHJpbmcsIGxlbmd0aCwgMCwgJnV0Zjhs
ZW4sIDApKTsKKyAgICBpZiAoIXV0ZjhsZW4pCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IG1fdXRmMTZMZW5ndGggPSBsZW5ndGg7CisgICAgbV9sZW5ndGggPSBnX3V0Zjhfc3RybGVuKG1f
dXRmOC5nZXQoKSwgdXRmOGxlbik7CisgICAgbV9zaXplID0gdXRmOGxlbjsKKyAgICBtX2luZGV4
ID0gMDsKKyAgICBtX3V0ZjE2SW5kZXggPSAwOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3Zv
aWQgQ2hhcmFjdGVySXRlcmF0b3I6OnNldEluZGV4KGludCBpbmRleCkKK3sKKyAgICBpZiAoaW5k
ZXggPT0gbV9pbmRleCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChpbmRleCA8PSAwKQorICAg
ICAgICBtX2luZGV4ID0gbV91dGYxNkluZGV4ID0gMDsKKyAgICBlbHNlIGlmIChpbmRleCA+PSBt
X2xlbmd0aCkgeworICAgICAgICBtX2luZGV4ID0gbV9sZW5ndGg7CisgICAgICAgIG1fdXRmMTZJ
bmRleCA9IG1fdXRmMTZMZW5ndGg7CisgICAgfSBlbHNlIGlmIChtX2xlbmd0aCA9PSBtX3V0ZjE2
TGVuZ3RoKQorICAgICAgICBtX2luZGV4ID0gbV91dGYxNkluZGV4ID0gaW5kZXg7CisgICAgZWxz
ZSB7CisgICAgICAgIG1faW5kZXggPSBpbmRleDsKKyAgICAgICAgaW50IHV0ZjE2SW5kZXggPSAw
OworICAgICAgICBpbnQgdXRmOEluZGV4ID0gMDsKKyAgICAgICAgd2hpbGUgKHV0ZjhJbmRleCA8
IGluZGV4KSB7CisgICAgICAgICAgICB1dGYxNkluZGV4ICs9IGNoYXJhY3RlclNpemUodXRmOElu
ZGV4KTsKKyAgICAgICAgICAgIHV0ZjhJbmRleCsrOworICAgICAgICB9CisgICAgICAgIG1fdXRm
MTZJbmRleCA9IHV0ZjE2SW5kZXg7CisgICAgfQorfQorCit2b2lkIENoYXJhY3Rlckl0ZXJhdG9y
OjpzZXROYXRpdmVJbmRleChpbnQgaW5kZXgpCit7CisgICAgaWYgKGluZGV4ID09IG1fdXRmMTZJ
bmRleCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChpbmRleCA8PSAwKQorICAgICAgICBtX3V0
ZjE2SW5kZXggPSBtX2luZGV4ID0gMDsKKyAgICBlbHNlIGlmIChpbmRleCA+PSBtX3V0ZjE2TGVu
Z3RoKSB7CisgICAgICAgIG1fdXRmMTZJbmRleCA9IG1fdXRmMTZMZW5ndGg7CisgICAgICAgIG1f
aW5kZXggPSBtX2xlbmd0aDsKKyAgICB9IGVsc2UgaWYgKG1fbGVuZ3RoID09IG1fdXRmMTZMZW5n
dGgpCisgICAgICAgIG1fdXRmMTZJbmRleCA9IG1faW5kZXggPSBpbmRleDsKKyAgICBlbHNlIHsK
KyAgICAgICAgbV91dGYxNkluZGV4ID0gaW5kZXg7CisgICAgICAgIGludCB1dGYxNkluZGV4ID0g
MDsKKyAgICAgICAgaW50IHV0ZjhJbmRleCA9IDA7CisgICAgICAgIHdoaWxlICh1dGYxNkluZGV4
IDwgaW5kZXgpIHsKKyAgICAgICAgICAgIHV0ZjE2SW5kZXggKz0gY2hhcmFjdGVyU2l6ZSh1dGY4
SW5kZXgpOworICAgICAgICAgICAgdXRmOEluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgbV9p
bmRleCA9IHV0ZjhJbmRleDsKKyAgICB9Cit9CisKK2ludCBDaGFyYWN0ZXJJdGVyYXRvcjo6Zmly
c3QoKQoreworICAgIG1faW5kZXggPSBtX3V0ZjE2SW5kZXggPSAwOworICAgIHJldHVybiBtX2lu
ZGV4OworfQorCitpbnQgQ2hhcmFjdGVySXRlcmF0b3I6Omxhc3QoKQoreworICAgIG1faW5kZXgg
PSBtX2xlbmd0aDsKKyAgICBtX3V0ZjE2SW5kZXggPSBtX3V0ZjE2TGVuZ3RoOworICAgIHJldHVy
biBtX2luZGV4OworfQorCitpbnQgQ2hhcmFjdGVySXRlcmF0b3I6Om5leHQoKQoreworICAgIGlu
dCBuZXh0ID0gbV9pbmRleCArIDE7CisKKyAgICBpZiAobmV4dCA8PSBtX2xlbmd0aCkgeworICAg
ICAgICBtX3V0ZjE2SW5kZXggPSBtaW4obV91dGYxNkluZGV4ICsgY2hhcmFjdGVyU2l6ZShtX2lu
ZGV4KSwgbV91dGYxNkxlbmd0aCk7CisgICAgICAgIG1faW5kZXggPSBuZXh0OworICAgIH0gZWxz
ZSB7CisgICAgICAgIG1faW5kZXggPSBUZXh0QnJlYWtEb25lOworICAgICAgICBtX3V0ZjE2SW5k
ZXggPSBUZXh0QnJlYWtEb25lOworICAgIH0KKworICAgIHJldHVybiBtX2luZGV4OworfQorCitp
bnQgQ2hhcmFjdGVySXRlcmF0b3I6OnByZXZpb3VzKCkKK3sKKyAgICBpbnQgcHJldmlvdXMgPSBt
X2luZGV4IC0gMTsKKworICAgIGlmIChwcmV2aW91cyA+PSAwKSB7CisgICAgICAgIG1fdXRmMTZJ
bmRleCA9IG1heChtX3V0ZjE2SW5kZXggLSBjaGFyYWN0ZXJTaXplKHByZXZpb3VzKSwgMCk7Cisg
ICAgICAgIG1faW5kZXggPSBwcmV2aW91czsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2luZGV4
ID0gVGV4dEJyZWFrRG9uZTsKKyAgICAgICAgbV91dGYxNkluZGV4ID0gVGV4dEJyZWFrRG9uZTsK
KyAgICB9CisKKyAgICByZXR1cm4gbV9pbmRleDsKK30KKwogZW51bSBVQnJlYWtJdGVyYXRvclR5
cGUgewogICAgIFVCUktfQ0hBUkFDVEVSLAogICAgIFVCUktfV09SRCwKQEAgLTM5LDkgKzE4Nyw4
IEBAIGVudW0gVUJyZWFrSXRlcmF0b3JUeXBlIHsKIGNsYXNzIFRleHRCcmVha0l0ZXJhdG9yIHsK
IHB1YmxpYzoKICAgICBVQnJlYWtJdGVyYXRvclR5cGUgbV90eXBlOwotICAgIGludCBtX2xlbmd0
aDsKICAgICBQYW5nb0xvZ0F0dHIqIG1fbG9nQXR0cnM7Ci0gICAgaW50IG1faW5kZXg7CisgICAg
Q2hhcmFjdGVySXRlcmF0b3IgbV9jaGFySXRlcmF0b3I7CiB9OwogCiBzdGF0aWMgVGV4dEJyZWFr
SXRlcmF0b3IqIHNldFVwSXRlcmF0b3IoYm9vbCYgY3JlYXRlZEl0ZXJhdG9yLCBUZXh0QnJlYWtJ
dGVyYXRvciomIGl0ZXJhdG9yLApAQCAtNTcsMTkgKzIwNCwxNyBAQCBzdGF0aWMgVGV4dEJyZWFr
SXRlcmF0b3IqIHNldFVwSXRlcmF0b3IoYm9vbCYgY3JlYXRlZEl0ZXJhdG9yLCBUZXh0QnJlYWtJ
dGVyYXRvcgogICAgIGlmICghaXRlcmF0b3IpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgbG9u
ZyB1dGY4bGVuOwotICAgIEdPd25QdHI8Y2hhcj4gdXRmODsKLSAgICB1dGY4LnNldChnX3V0ZjE2
X3RvX3V0Zjgoc3RyaW5nLCBsZW5ndGgsIDAsICZ1dGY4bGVuLCAwKSk7CisgICAgaWYgKCFpdGVy
YXRvci0+bV9jaGFySXRlcmF0b3Iuc2V0VGV4dChzdHJpbmcsIGxlbmd0aCkpCisgICAgICAgIHJl
dHVybiAwOwogCi0gICAgLy8gRklYTUU6IGFzc3VtZXMgbm8gc3Vycm9nYXRlIHBhaXJzCisgICAg
aW50IGNoYXJMZW5ndGggPSBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0TGVuZ3RoKCk7CiAK
ICAgICBpdGVyYXRvci0+bV90eXBlID0gdHlwZTsKLSAgICBpdGVyYXRvci0+bV9sZW5ndGggPSBs
ZW5ndGg7CiAgICAgaWYgKGNyZWF0ZWRJdGVyYXRvcikKICAgICAgICAgZ19mcmVlKGl0ZXJhdG9y
LT5tX2xvZ0F0dHJzKTsKLSAgICBpdGVyYXRvci0+bV9sb2dBdHRycyA9IGdfbmV3MChQYW5nb0xv
Z0F0dHIsIGxlbmd0aCArIDEpOwotICAgIGl0ZXJhdG9yLT5tX2luZGV4ID0gMDsKLSAgICBwYW5n
b19nZXRfbG9nX2F0dHJzKHV0ZjguZ2V0KCksIHV0ZjhsZW4sIC0xLCAwLCBpdGVyYXRvci0+bV9s
b2dBdHRycywgbGVuZ3RoICsgMSk7CisgICAgaXRlcmF0b3ItPm1fbG9nQXR0cnMgPSBnX25ldzAo
UGFuZ29Mb2dBdHRyLCBjaGFyTGVuZ3RoICsgMSk7CisgICAgcGFuZ29fZ2V0X2xvZ19hdHRycyhp
dGVyYXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0VGV4dCgpLCBpdGVyYXRvci0+bV9jaGFySXRlcmF0
b3IuZ2V0U2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDAsIGl0ZXJhdG9yLT5t
X2xvZ0F0dHJzLCBjaGFyTGVuZ3RoICsgMSk7CiAKICAgICByZXR1cm4gaXRlcmF0b3I7CiB9CkBA
IC0xMDgsMjEgKzI1MywxMyBAQCBUZXh0QnJlYWtJdGVyYXRvciogc2VudGVuY2VCcmVha0l0ZXJh
dG9yKGNvbnN0IFVDaGFyKiBzdHJpbmcsIGludCBsZW5ndGgpCiAgICAgcmV0dXJuIHNldFVwSXRl
cmF0b3IoY3JlYXRlZFNlbnRlbmNlQnJlYWtJdGVyYXRvciwgc3RhdGljU2VudGVuY2VCcmVha0l0
ZXJhdG9yLCBVQlJLX1NFTlRFTkNFLCBzdHJpbmcsIGxlbmd0aCk7CiB9CiAKLWludCB0ZXh0QnJl
YWtGaXJzdChUZXh0QnJlYWtJdGVyYXRvciogYmkpCitpbnQgdGV4dEJyZWFrRmlyc3QoVGV4dEJy
ZWFrSXRlcmF0b3IqIGl0ZXJhdG9yKQogewotICAgIC8vIHNlZSB0ZXh0QnJlYWtMYXN0Ci0gICAg
Ci0gICAgaW50IGZpcnN0Q3Vyc29yUG9zaXRpb24gPSAtMTsKLSAgICBpbnQgcG9zID0gMDsKLSAg
ICB3aGlsZSAocG9zIDw9IGJpLT5tX2xlbmd0aCAmJiAoZmlyc3RDdXJzb3JQb3NpdGlvbiA8IDAp
KSB7Ci0gICAgICAgIGlmIChiaS0+bV9sb2dBdHRyc1twb3NdLmlzX2N1cnNvcl9wb3NpdGlvbikK
LSAgICAgICAgICAgIGZpcnN0Q3Vyc29yUG9zaXRpb24gPSBwb3M7Ci0gICAgfQotICAgIGJpLT5t
X2luZGV4ID0gZmlyc3RDdXJzb3JQb3NpdGlvbjsKLSAgICByZXR1cm4gZmlyc3RDdXJzb3JQb3Np
dGlvbjsKKyAgICBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IuZmlyc3QoKTsKKyAgICByZXR1cm4g
aXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLmdldE5hdGl2ZUluZGV4KCk7CiB9CiAKLWludCB0ZXh0
QnJlYWtMYXN0KFRleHRCcmVha0l0ZXJhdG9yKiBiaSkKK2ludCB0ZXh0QnJlYWtMYXN0KFRleHRC
cmVha0l0ZXJhdG9yKiBpdGVyYXRvcikKIHsKICAgICAvLyBUZXh0QnJlYWtMYXN0IGlzIG5vdCBt
ZWFudCB0byBmaW5kIGp1c3QgYW55IGJyZWFrIGFjY29yZGluZyB0byBiaS0+bV90eXBlIAogICAg
IC8vIGJ1dCByZWFsbHkgdGhlIG9uZSBuZWFyIHRoZSBsYXN0IGNoYXJhY3Rlci4KQEAgLTEzNyw4
MSArMjc0LDkyIEBAIGludCB0ZXh0QnJlYWtMYXN0KFRleHRCcmVha0l0ZXJhdG9yKiBiaSkKICAg
ICAvLyBPdGhlcndpc2UgcmV0dXJuIG1fbGVuZ3RoLCBhcyAidGhlIGZpcnN0IGNoYXJhY3RlciBi
ZXlvbmQgdGhlIGxhc3QiIGlzIG91dHNpZGUgb3VyIHN0cmluZy4KICAgICAKICAgICBib29sIHdo
aXRlU3BhY2VBdFRoZUVuZCA9IHRydWU7Ci0gICAgaW50IG5leHRXaGl0ZVNwYWNlUG9zID0gYmkt
Pm1fbGVuZ3RoOwotICAgIAotICAgIGludCBwb3MgPSBiaS0+bV9sZW5ndGg7CisgICAgaW50IG5l
eHRXaGl0ZVNwYWNlUG9zID0gaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLmdldExlbmd0aCgpOwor
CisgICAgaW50IHBvcyA9IGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5sYXN0KCk7CiAgICAgd2hp
bGUgKHBvcyA+PSAwICYmIHdoaXRlU3BhY2VBdFRoZUVuZCkgewotICAgICAgICBpZiAoYmktPm1f
bG9nQXR0cnNbcG9zXS5pc19jdXJzb3JfcG9zaXRpb24pIHsKLSAgICAgICAgICAgIGlmICh3aGl0
ZVNwYWNlQXRUaGVFbmQgPSBiaS0+bV9sb2dBdHRyc1twb3NdLmlzX3doaXRlKQorICAgICAgICBp
ZiAoaXRlcmF0b3ItPm1fbG9nQXR0cnNbcG9zXS5pc19jdXJzb3JfcG9zaXRpb24pIHsKKyAgICAg
ICAgICAgIGlmICh3aGl0ZVNwYWNlQXRUaGVFbmQgPSBpdGVyYXRvci0+bV9sb2dBdHRyc1twb3Nd
LmlzX3doaXRlKQogICAgICAgICAgICAgICAgIG5leHRXaGl0ZVNwYWNlUG9zID0gcG9zOwogICAg
ICAgICB9Ci0gICAgICAgIHBvcy0tOworICAgICAgICBwb3MgPSBpdGVyYXRvci0+bV9jaGFySXRl
cmF0b3IucHJldmlvdXMoKTsKICAgICB9Ci0gICAgYmktPm1faW5kZXggPSBuZXh0V2hpdGVTcGFj
ZVBvczsKLSAgICByZXR1cm4gbmV4dFdoaXRlU3BhY2VQb3M7CisgICAgaXRlcmF0b3ItPm1fY2hh
ckl0ZXJhdG9yLnNldEluZGV4KG5leHRXaGl0ZVNwYWNlUG9zKTsKKyAgICByZXR1cm4gaXRlcmF0
b3ItPm1fY2hhckl0ZXJhdG9yLmdldE5hdGl2ZUluZGV4KCk7CiB9CiAKLWludCB0ZXh0QnJlYWtO
ZXh0KFRleHRCcmVha0l0ZXJhdG9yKiBiaSkKK2ludCB0ZXh0QnJlYWtOZXh0KFRleHRCcmVha0l0
ZXJhdG9yKiBpdGVyYXRvcikKIHsKLSAgICBmb3IgKGludCBpID0gYmktPm1faW5kZXggKyAxOyBp
IDw9IGJpLT5tX2xlbmd0aDsgaSsrKSB7CisgICAgd2hpbGUgKGl0ZXJhdG9yLT5tX2NoYXJJdGVy
YXRvci5uZXh0KCkgIT0gVGV4dEJyZWFrRG9uZSkgeworICAgICAgICBpbnQgaW5kZXggPSBpdGVy
YXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0SW5kZXgoKTsKIAogICAgICAgICAvLyBGSVhNRTogVUJS
S19XT1JEIGNhc2U6IFNpbmdsZSBtdWx0aWJ5dGUgY2hhcmFjdGVycyAoaS5lLiB3aGl0ZSBzcGFj
ZSBhcm91bmQgdGhlbSksIHN1Y2ggYXMgdGhlIGV1cm8gc3ltYm9sIOKCrCwgCiAgICAgICAgIC8v
IGFyZSBub3QgbWFya2VkIGFzIHdvcmRfc3RhcnQgJiB3b3JkX2VuZCBhcyBvcHBvc2VkIHRvIHRo
ZSB3YXkgSUNVIGRvZXMgaXQuCiAgICAgICAgIC8vIFRoaXMgbGVhZHMgdG8gLSBmb3IgZXhhbXBs
ZSAtIGRpZmZlcmVudCB3b3JkIHNlbGVjdGlvbiBiZWhhdmlvdXIgd2hlbiByaWdodCBjbGlja2lu
Zy4KIAotICAgICAgICBpZiAoKGJpLT5tX3R5cGUgPT0gVUJSS19MSU5FICYmIGJpLT5tX2xvZ0F0
dHJzW2ldLmlzX2xpbmVfYnJlYWspCi0gICAgICAgICAgICB8fCAoYmktPm1fdHlwZSA9PSBVQlJL
X1dPUkQgJiYgKGJpLT5tX2xvZ0F0dHJzW2ldLmlzX3dvcmRfc3RhcnQgfHwgYmktPm1fbG9nQXR0
cnNbaV0uaXNfd29yZF9lbmQpKQotICAgICAgICAgICAgfHwgKGJpLT5tX3R5cGUgPT0gVUJSS19D
SEFSQUNURVIgJiYgYmktPm1fbG9nQXR0cnNbaV0uaXNfY3Vyc29yX3Bvc2l0aW9uKQotICAgICAg
ICAgICAgfHwgKGJpLT5tX3R5cGUgPT0gVUJSS19TRU5URU5DRSAmJiAoYmktPm1fbG9nQXR0cnNb
aV0uaXNfc2VudGVuY2Vfc3RhcnQgfHwgYmktPm1fbG9nQXR0cnNbaV0uaXNfc2VudGVuY2VfZW5k
KSkgKSB7Ci0gICAgICAgICAgICBiaS0+bV9pbmRleCA9IGk7Ci0gICAgICAgICAgICByZXR1cm4g
aTsKKyAgICAgICAgaWYgKChpdGVyYXRvci0+bV90eXBlID09IFVCUktfTElORSAmJiBpdGVyYXRv
ci0+bV9sb2dBdHRyc1tpbmRleF0uaXNfbGluZV9icmVhaykKKyAgICAgICAgICAgIHx8IChpdGVy
YXRvci0+bV90eXBlID09IFVCUktfV09SRCAmJiAoaXRlcmF0b3ItPm1fbG9nQXR0cnNbaW5kZXhd
LmlzX3dvcmRfc3RhcnQgfHwgaXRlcmF0b3ItPm1fbG9nQXR0cnNbaW5kZXhdLmlzX3dvcmRfZW5k
KSkKKyAgICAgICAgICAgIHx8IChpdGVyYXRvci0+bV90eXBlID09IFVCUktfQ0hBUkFDVEVSICYm
IGl0ZXJhdG9yLT5tX2xvZ0F0dHJzW2luZGV4XS5pc19jdXJzb3JfcG9zaXRpb24pCisgICAgICAg
ICAgICB8fCAoaXRlcmF0b3ItPm1fdHlwZSA9PSBVQlJLX1NFTlRFTkNFICYmIChpdGVyYXRvci0+
bV9sb2dBdHRyc1tpbmRleF0uaXNfc2VudGVuY2Vfc3RhcnQgfHwgaXRlcmF0b3ItPm1fbG9nQXR0
cnNbaW5kZXhdLmlzX3NlbnRlbmNlX2VuZCkpICkgeworICAgICAgICAgICAgYnJlYWs7CiAgICAg
ICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFRleHRCcmVha0RvbmU7CisgICAgcmV0dXJuIGl0ZXJh
dG9yLT5tX2NoYXJJdGVyYXRvci5nZXROYXRpdmVJbmRleCgpOwogfQogCi1pbnQgdGV4dEJyZWFr
UHJldmlvdXMoVGV4dEJyZWFrSXRlcmF0b3IqIGJpKQoraW50IHRleHRCcmVha1ByZXZpb3VzKFRl
eHRCcmVha0l0ZXJhdG9yKiBpdGVyYXRvcikKIHsKLSAgICBmb3IgKGludCBpID0gYmktPm1faW5k
ZXggLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICBpZiAoKGJpLT5tX3R5cGUgPT0gVUJSS19M
SU5FICYmIGJpLT5tX2xvZ0F0dHJzW2ldLmlzX2xpbmVfYnJlYWspCi0gICAgICAgICAgICB8fCAo
YmktPm1fdHlwZSA9PSBVQlJLX1dPUkQgJiYgKGJpLT5tX2xvZ0F0dHJzW2ldLmlzX3dvcmRfc3Rh
cnQgfHwgYmktPm1fbG9nQXR0cnNbaV0uaXNfd29yZF9lbmQpKQotICAgICAgICAgICAgfHwgKGJp
LT5tX3R5cGUgPT0gVUJSS19DSEFSQUNURVIgJiYgYmktPm1fbG9nQXR0cnNbaV0uaXNfY3Vyc29y
X3Bvc2l0aW9uKQotICAgICAgICAgICAgfHwgKGJpLT5tX3R5cGUgPT0gVUJSS19TRU5URU5DRSAm
JiAoYmktPm1fbG9nQXR0cnNbaV0uaXNfc2VudGVuY2Vfc3RhcnQgfHwgYmktPm1fbG9nQXR0cnNb
aV0uaXNfc2VudGVuY2VfZW5kKSkgKSB7Ci0gICAgICAgICAgICBiaS0+bV9pbmRleCA9IGk7Ci0g
ICAgICAgICAgICByZXR1cm4gaTsKKyAgICB3aGlsZSAoaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9y
LnByZXZpb3VzKCkgIT0gVGV4dEJyZWFrRG9uZSkgeworICAgICAgICBpbnQgaW5kZXggPSBpdGVy
YXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0SW5kZXgoKTsKKworICAgICAgICBpZiAoKGl0ZXJhdG9y
LT5tX3R5cGUgPT0gVUJSS19MSU5FICYmIGl0ZXJhdG9yLT5tX2xvZ0F0dHJzW2luZGV4XS5pc19s
aW5lX2JyZWFrKQorICAgICAgICAgICAgfHwgKGl0ZXJhdG9yLT5tX3R5cGUgPT0gVUJSS19XT1JE
ICYmIChpdGVyYXRvci0+bV9sb2dBdHRyc1tpbmRleF0uaXNfd29yZF9zdGFydCB8fCBpdGVyYXRv
ci0+bV9sb2dBdHRyc1tpbmRleF0uaXNfd29yZF9lbmQpKQorICAgICAgICAgICAgfHwgKGl0ZXJh
dG9yLT5tX3R5cGUgPT0gVUJSS19DSEFSQUNURVIgJiYgaXRlcmF0b3ItPm1fbG9nQXR0cnNbaW5k
ZXhdLmlzX2N1cnNvcl9wb3NpdGlvbikKKyAgICAgICAgICAgIHx8IChpdGVyYXRvci0+bV90eXBl
ID09IFVCUktfU0VOVEVOQ0UgJiYgKGl0ZXJhdG9yLT5tX2xvZ0F0dHJzW2luZGV4XS5pc19zZW50
ZW5jZV9zdGFydCB8fCBpdGVyYXRvci0+bV9sb2dBdHRyc1tpbmRleF0uaXNfc2VudGVuY2VfZW5k
KSkgKSB7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4g
dGV4dEJyZWFrRmlyc3QoYmkpOworICAgIHJldHVybiBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3Iu
Z2V0TmF0aXZlSW5kZXgoKTsKIH0KIAotaW50IHRleHRCcmVha1ByZWNlZGluZyhUZXh0QnJlYWtJ
dGVyYXRvciogYmksIGludCBwb3MpCitpbnQgdGV4dEJyZWFrUHJlY2VkaW5nKFRleHRCcmVha0l0
ZXJhdG9yKiBpdGVyYXRvciwgaW50IG9mZnNldCkKIHsKLSAgICBiaS0+bV9pbmRleCA9IHBvczsK
LSAgICByZXR1cm4gdGV4dEJyZWFrUHJldmlvdXMoYmkpOworICAgIGlmIChvZmZzZXQgPiBpdGVy
YXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0TmF0aXZlTGVuZ3RoKCkpCisgICAgICAgIHJldHVybiBU
ZXh0QnJlYWtEb25lOworICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAg
ICBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3Iuc2V0TmF0aXZlSW5kZXgob2Zmc2V0KTsKKyAgICBy
ZXR1cm4gdGV4dEJyZWFrUHJldmlvdXMoaXRlcmF0b3IpOwogfQogCi1pbnQgdGV4dEJyZWFrRm9s
bG93aW5nKFRleHRCcmVha0l0ZXJhdG9yKiBiaSwgaW50IHBvcykKK2ludCB0ZXh0QnJlYWtGb2xs
b3dpbmcoVGV4dEJyZWFrSXRlcmF0b3IqIGl0ZXJhdG9yLCBpbnQgb2Zmc2V0KQogewotICAgIGlm
IChwb3MgPCAwKQotICAgICAgICBwb3MgPSAtMTsKLSAgICBiaS0+bV9pbmRleCA9IHBvczsKLSAg
ICByZXR1cm4gdGV4dEJyZWFrTmV4dChiaSk7CisgICAgaWYgKG9mZnNldCA+IGl0ZXJhdG9yLT5t
X2NoYXJJdGVyYXRvci5nZXROYXRpdmVMZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIFRleHRCcmVh
a0RvbmU7CisgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIGl0ZXJh
dG9yLT5tX2NoYXJJdGVyYXRvci5zZXROYXRpdmVJbmRleChvZmZzZXQpOworICAgIHJldHVybiB0
ZXh0QnJlYWtOZXh0KGl0ZXJhdG9yKTsKIH0KIAotaW50IHRleHRCcmVha0N1cnJlbnQoVGV4dEJy
ZWFrSXRlcmF0b3IqIGJpKQoraW50IHRleHRCcmVha0N1cnJlbnQoVGV4dEJyZWFrSXRlcmF0b3Iq
IGl0ZXJhdG9yKQogewotICAgIHJldHVybiBiaS0+bV9pbmRleDsKKyAgICByZXR1cm4gaXRlcmF0
b3ItPm1fY2hhckl0ZXJhdG9yLmdldE5hdGl2ZUluZGV4KCk7CiB9CiAKLWJvb2wgaXNUZXh0QnJl
YWsoVGV4dEJyZWFrSXRlcmF0b3IqIGJpLCBpbnQgcG9zKQorYm9vbCBpc1RleHRCcmVhayhUZXh0
QnJlYWtJdGVyYXRvciogaXRlcmF0b3IsIGludCBvZmZzZXQpCiB7Ci0gICAgaWYgKGJpLT5tX2lu
ZGV4IDwgMCkKKyAgICBpZiAoIW9mZnNldCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYg
KG9mZnNldCA+IGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5nZXROYXRpdmVMZW5ndGgoKSkKICAg
ICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgcmV0dXJuICgoYmktPm1fdHlwZSA9PSBVQlJLX0xJ
TkUgJiYgYmktPm1fbG9nQXR0cnNbYmktPm1faW5kZXhdLmlzX2xpbmVfYnJlYWspCi0gICAgICAg
IHx8IChiaS0+bV90eXBlID09IFVCUktfV09SRCAmJiBiaS0+bV9sb2dBdHRyc1tiaS0+bV9pbmRl
eF0uaXNfd29yZF9lbmQpCi0gICAgICAgIHx8IChiaS0+bV90eXBlID09IFVCUktfQ0hBUkFDVEVS
ICYmIGJpLT5tX2xvZ0F0dHJzW2JpLT5tX2luZGV4XS5pc19jaGFyX2JyZWFrKQotICAgICAgICB8
fCAoYmktPm1fdHlwZSA9PSBVQlJLX1NFTlRFTkNFICYmIGJpLT5tX2xvZ0F0dHJzW2JpLT5tX2lu
ZGV4XS5pc19zZW50ZW5jZV9lbmQpICk7CisgICAgaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLnNl
dE5hdGl2ZUluZGV4KG9mZnNldCk7CisKKyAgICBpbnQgaW5kZXggPSBpdGVyYXRvci0+bV9jaGFy
SXRlcmF0b3IuZ2V0SW5kZXgoKTsKKyAgICBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IucHJldmlv
dXMoKTsKKyAgICB0ZXh0QnJlYWtOZXh0KGl0ZXJhdG9yKTsKKyAgICByZXR1cm4gaXRlcmF0b3It
Pm1fY2hhckl0ZXJhdG9yLmdldEluZGV4KCkgPT0gaW5kZXg7CiB9CiAKIH0K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72020</attachid>
            <date>2010-10-27 05:45:08 -0700</date>
            <delta_ts>2010-10-28 05:10:41 -0700</delta_ts>
            <desc>Previous patch with ChangeLog fixed</desc>
            <filename>surrogate.diff</filename>
            <type>text/plain</type>
            <size>14765</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MTU1OTc3Yy4uMjM1ZGJmMSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MyBAQAorMjAxMC0xMC0yNyAgQ2FybG9zIEdhcmNp
YSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgW0dUS10gSGFuZGxlIHN1cnJvZ2F0ZSBwYWlycyBpbiBU
ZXh0QnJlYWtJdGVyYXRvckd0aworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDgyMjcKKworICAgICAgICBUZXh0QnJlYWtJdGVyYXRvckd0ayB1c2VzIFVU
Ri04IGJlY2F1c2UgaXQncyB3aGF0IHBhbmdvIGV4cGVjdHMsIGJ1dCB3ZQorICAgICAgICBuZWVk
IHRvIHJldHVybiBpbmRpY2VzIGZvciB0aGUgZ2l2ZW4gaW5wdXQgc3RyaW5nIHRoYXQgYXJlIGlu
IFVURi0xNi4KKyAgICAgICAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGlzIHRoZSBzYW1lIGZv
ciBib3RoIFVURi0xNiBhbmQgVVRGLTggZXhjZXB0IHdoZW4KKyAgICAgICAgdGhlIGlucHV0IHN0
cmluZyBjb250YWlucyBzdXJyb2dhdGUgcGFpcnMuIFdlIG5lZWQgdG8ga2VlcCBib3RoLCB0aGUK
KyAgICAgICAgaW5kZXggZm9yIHRoZSBVVEYtOCBzdHJpbmcgdG8gYmUgdXNlZCBpbnRlcm5hbGx5
LCBhbmQgdGhlIGluZGV4IGZvciB0aGUKKyAgICAgICAgVVRGLTE2IHN0cmluZyB0byBiZSB1c2Vk
IGFzIHJldHVybiB2YWx1ZSBvZiB0aGUgaXRlcmF0b3IgaW50ZXJmYWNlLiBJdAorICAgICAgICBm
aXhlcyB0ZXN0IGZhc3QvZm9ybXMvdGV4dGFyZWEtbWF4bGVuZ3RoLmh0bWwKKworICAgICAgICAq
IHBsYXRmb3JtL3RleHQvZ3RrL1RleHRCcmVha0l0ZXJhdG9yR3RrLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpnZXRUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkNo
YXJhY3Rlckl0ZXJhdG9yOjpnZXRMZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVy
SXRlcmF0b3I6OmdldFNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVySXRlcmF0b3I6
OmdldEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpnZXROYXRp
dmVJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJJdGVyYXRvcjo6Z2V0TmF0aXZl
TGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpjaGFyYWN0ZXJT
aXplKToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpzZXRUZXh0KToKKyAg
ICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpzZXRJbmRleCk6CisgICAgICAgIChX
ZWJDb3JlOjpDaGFyYWN0ZXJJdGVyYXRvcjo6c2V0TmF0aXZlSW5kZXgpOgorICAgICAgICAoV2Vi
Q29yZTo6Q2hhcmFjdGVySXRlcmF0b3I6OmZpcnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJh
Y3Rlckl0ZXJhdG9yOjpsYXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9y
OjpuZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpwcmV2aW91cyk6
CisgICAgICAgIChXZWJDb3JlOjpzZXRVcEl0ZXJhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OnRl
eHRCcmVha0ZpcnN0KToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRCcmVha0xhc3QpOgorICAgICAg
ICAoV2ViQ29yZTo6dGV4dEJyZWFrTmV4dCk6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0QnJlYWtQ
cmV2aW91cyk6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0QnJlYWtQcmVjZWRpbmcpOgorICAgICAg
ICAoV2ViQ29yZTo6dGV4dEJyZWFrRm9sbG93aW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRC
cmVha0N1cnJlbnQpOgorICAgICAgICAoV2ViQ29yZTo6aXNUZXh0QnJlYWspOgorCiAyMDEwLTEw
LTIxICBLd2FuZyBZdWwgU2VvICA8c2t5dWxAY29tcGFueTEwMC5uZXQ+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgS2VudCBUYW11cmEuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3RleHQv
Z3RrL1RleHRCcmVha0l0ZXJhdG9yR3RrLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsv
VGV4dEJyZWFrSXRlcmF0b3JHdGsuY3BwCmluZGV4IGQ4YWJmMGQuLmViNDhlNjEgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dEJyZWFrSXRlcmF0b3JHdGsuY3BwCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dEJyZWFrSXRlcmF0b3JHdGsuY3BwCkBA
IC0zLDYgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOCBKw7xyZyBCaWxsZXRlciA8akBiaXRy
b24uY2g+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggRG9taW5payBSw7Z0dHNjaGVzIDxkb21pbmlr
LnJvZXR0c2NoZXNAYWNjZXNzLWNvbXBhbnkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwIEln
YWxpYSBTLkwuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTIyLDEzICsyMywxNjAgQEAKICAqLwog
CiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiR093blB0ci5oIgorCiAjaW5jbHVkZSAi
VGV4dEJyZWFrSXRlcmF0b3IuaCIKIAorI2luY2x1ZGUgIkdPd25QdHIuaCIKICNpbmNsdWRlIDxw
YW5nby9wYW5nby5oPgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworI2RlZmluZSBJU19TVVJST0dB
VEUoY2hhcmFjdGVyKSAoY2hhcmFjdGVyID49IDB4MTAwMDAgJiYgY2hhcmFjdGVyIDw9IDB4MTBG
RkZGKQogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2NsYXNzIENoYXJhY3Rlckl0ZXJhdG9yIHsK
K3B1YmxpYzoKKyAgICBib29sIHNldFRleHQoY29uc3QgVUNoYXIqIHN0cmluZywgaW50IGxlbmd0
aCk7CisgICAgY29uc3QgZ2NoYXIqIGdldFRleHQoKSB7IHJldHVybiBtX3V0ZjguZ2V0KCk7IH0K
KyAgICBpbnQgZ2V0TGVuZ3RoKCkgeyByZXR1cm4gbV9sZW5ndGg7IH0KKyAgICBnbG9uZyBnZXRT
aXplKCkgeyByZXR1cm4gbV9zaXplOyB9CisgICAgdm9pZCBzZXRJbmRleChpbnQgaW5kZXgpOwor
ICAgIGludCBnZXRJbmRleCgpIHsgcmV0dXJuIG1faW5kZXg7IH0KKyAgICB2b2lkIHNldE5hdGl2
ZUluZGV4KGludCBpbmRleCk7CisgICAgaW50IGdldE5hdGl2ZUluZGV4KCkgeyByZXR1cm4gbV91
dGYxNkluZGV4OyB9CisgICAgaW50IGdldE5hdGl2ZUxlbmd0aCgpIHsgcmV0dXJuIG1fdXRmMTZM
ZW5ndGg7IH0KKyAgICBpbnQgZmlyc3QoKTsKKyAgICBpbnQgbGFzdCgpOworICAgIGludCBuZXh0
KCk7CisgICAgaW50IHByZXZpb3VzKCk7Citwcml2YXRlOgorICAgIGludCBjaGFyYWN0ZXJTaXpl
KGludCBpbmRleCk7CisKKyAgICBHT3duUHRyPGNoYXI+IG1fdXRmODsKKyAgICBpbnQgbV9sZW5n
dGg7CisgICAgbG9uZyBtX3NpemU7CisgICAgaW50IG1faW5kZXg7CisgICAgaW50IG1fdXRmMTZJ
bmRleDsKKyAgICBpbnQgbV91dGYxNkxlbmd0aDsKK307CisKK2ludCBDaGFyYWN0ZXJJdGVyYXRv
cjo6Y2hhcmFjdGVyU2l6ZShpbnQgaW5kZXgpCit7CisgICAgaWYgKGluZGV4ID09IG1fbGVuZ3Ro
IHx8IGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKG1fbGVuZ3RoID09IG1f
dXRmMTZMZW5ndGgpCisgICAgICAgIHJldHVybiAxOworCisgICAgZ2NoYXIqIGluZGV4UHRyID0g
Z191dGY4X29mZnNldF90b19wb2ludGVyKG1fdXRmOC5nZXQoKSwgaW5kZXgpOworICAgIGd1bmlj
aGFyIGNoYXJhY3RlciA9IGdfdXRmOF9nZXRfY2hhcihpbmRleFB0cik7CisgICAgcmV0dXJuIElT
X1NVUlJPR0FURShjaGFyYWN0ZXIpID8gMiA6IDE7Cit9CisKK2Jvb2wgQ2hhcmFjdGVySXRlcmF0
b3I6OnNldFRleHQoY29uc3QgVUNoYXIqIHN0cmluZywgaW50IGxlbmd0aCkKK3sKKyAgICBsb25n
IHV0ZjhsZW4gPSAwOworICAgIG1fdXRmOC5zZXQoZ191dGYxNl90b191dGY4KHN0cmluZywgbGVu
Z3RoLCAwLCAmdXRmOGxlbiwgMCkpOworICAgIGlmICghdXRmOGxlbikKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgbV91dGYxNkxlbmd0aCA9IGxlbmd0aDsKKyAgICBtX2xlbmd0aCA9IGdf
dXRmOF9zdHJsZW4obV91dGY4LmdldCgpLCB1dGY4bGVuKTsKKyAgICBtX3NpemUgPSB1dGY4bGVu
OworICAgIG1faW5kZXggPSAwOworICAgIG1fdXRmMTZJbmRleCA9IDA7CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKwordm9pZCBDaGFyYWN0ZXJJdGVyYXRvcjo6c2V0SW5kZXgoaW50IGluZGV4KQor
eworICAgIGlmIChpbmRleCA9PSBtX2luZGV4KQorICAgICAgICByZXR1cm47CisgICAgaWYgKGlu
ZGV4IDw9IDApCisgICAgICAgIG1faW5kZXggPSBtX3V0ZjE2SW5kZXggPSAwOworICAgIGVsc2Ug
aWYgKGluZGV4ID49IG1fbGVuZ3RoKSB7CisgICAgICAgIG1faW5kZXggPSBtX2xlbmd0aDsKKyAg
ICAgICAgbV91dGYxNkluZGV4ID0gbV91dGYxNkxlbmd0aDsKKyAgICB9IGVsc2UgaWYgKG1fbGVu
Z3RoID09IG1fdXRmMTZMZW5ndGgpCisgICAgICAgIG1faW5kZXggPSBtX3V0ZjE2SW5kZXggPSBp
bmRleDsKKyAgICBlbHNlIHsKKyAgICAgICAgbV9pbmRleCA9IGluZGV4OworICAgICAgICBpbnQg
dXRmMTZJbmRleCA9IDA7CisgICAgICAgIGludCB1dGY4SW5kZXggPSAwOworICAgICAgICB3aGls
ZSAodXRmOEluZGV4IDwgaW5kZXgpIHsKKyAgICAgICAgICAgIHV0ZjE2SW5kZXggKz0gY2hhcmFj
dGVyU2l6ZSh1dGY4SW5kZXgpOworICAgICAgICAgICAgdXRmOEluZGV4Kys7CisgICAgICAgIH0K
KyAgICAgICAgbV91dGYxNkluZGV4ID0gdXRmMTZJbmRleDsKKyAgICB9Cit9CisKK3ZvaWQgQ2hh
cmFjdGVySXRlcmF0b3I6OnNldE5hdGl2ZUluZGV4KGludCBpbmRleCkKK3sKKyAgICBpZiAoaW5k
ZXggPT0gbV91dGYxNkluZGV4KQorICAgICAgICByZXR1cm47CisgICAgaWYgKGluZGV4IDw9IDAp
CisgICAgICAgIG1fdXRmMTZJbmRleCA9IG1faW5kZXggPSAwOworICAgIGVsc2UgaWYgKGluZGV4
ID49IG1fdXRmMTZMZW5ndGgpIHsKKyAgICAgICAgbV91dGYxNkluZGV4ID0gbV91dGYxNkxlbmd0
aDsKKyAgICAgICAgbV9pbmRleCA9IG1fbGVuZ3RoOworICAgIH0gZWxzZSBpZiAobV9sZW5ndGgg
PT0gbV91dGYxNkxlbmd0aCkKKyAgICAgICAgbV91dGYxNkluZGV4ID0gbV9pbmRleCA9IGluZGV4
OworICAgIGVsc2UgeworICAgICAgICBtX3V0ZjE2SW5kZXggPSBpbmRleDsKKyAgICAgICAgaW50
IHV0ZjE2SW5kZXggPSAwOworICAgICAgICBpbnQgdXRmOEluZGV4ID0gMDsKKyAgICAgICAgd2hp
bGUgKHV0ZjE2SW5kZXggPCBpbmRleCkgeworICAgICAgICAgICAgdXRmMTZJbmRleCArPSBjaGFy
YWN0ZXJTaXplKHV0ZjhJbmRleCk7CisgICAgICAgICAgICB1dGY4SW5kZXgrKzsKKyAgICAgICAg
fQorICAgICAgICBtX2luZGV4ID0gdXRmOEluZGV4OworICAgIH0KK30KKworaW50IENoYXJhY3Rl
ckl0ZXJhdG9yOjpmaXJzdCgpCit7CisgICAgbV9pbmRleCA9IG1fdXRmMTZJbmRleCA9IDA7Cisg
ICAgcmV0dXJuIG1faW5kZXg7Cit9CisKK2ludCBDaGFyYWN0ZXJJdGVyYXRvcjo6bGFzdCgpCit7
CisgICAgbV9pbmRleCA9IG1fbGVuZ3RoOworICAgIG1fdXRmMTZJbmRleCA9IG1fdXRmMTZMZW5n
dGg7CisgICAgcmV0dXJuIG1faW5kZXg7Cit9CisKK2ludCBDaGFyYWN0ZXJJdGVyYXRvcjo6bmV4
dCgpCit7CisgICAgaW50IG5leHQgPSBtX2luZGV4ICsgMTsKKworICAgIGlmIChuZXh0IDw9IG1f
bGVuZ3RoKSB7CisgICAgICAgIG1fdXRmMTZJbmRleCA9IG1pbihtX3V0ZjE2SW5kZXggKyBjaGFy
YWN0ZXJTaXplKG1faW5kZXgpLCBtX3V0ZjE2TGVuZ3RoKTsKKyAgICAgICAgbV9pbmRleCA9IG5l
eHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9pbmRleCA9IFRleHRCcmVha0RvbmU7CisgICAg
ICAgIG1fdXRmMTZJbmRleCA9IFRleHRCcmVha0RvbmU7CisgICAgfQorCisgICAgcmV0dXJuIG1f
aW5kZXg7Cit9CisKK2ludCBDaGFyYWN0ZXJJdGVyYXRvcjo6cHJldmlvdXMoKQoreworICAgIGlu
dCBwcmV2aW91cyA9IG1faW5kZXggLSAxOworCisgICAgaWYgKHByZXZpb3VzID49IDApIHsKKyAg
ICAgICAgbV91dGYxNkluZGV4ID0gbWF4KG1fdXRmMTZJbmRleCAtIGNoYXJhY3RlclNpemUocHJl
dmlvdXMpLCAwKTsKKyAgICAgICAgbV9pbmRleCA9IHByZXZpb3VzOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIG1faW5kZXggPSBUZXh0QnJlYWtEb25lOworICAgICAgICBtX3V0ZjE2SW5kZXggPSBU
ZXh0QnJlYWtEb25lOworICAgIH0KKworICAgIHJldHVybiBtX2luZGV4OworfQorCiBlbnVtIFVC
cmVha0l0ZXJhdG9yVHlwZSB7CiAgICAgVUJSS19DSEFSQUNURVIsCiAgICAgVUJSS19XT1JELApA
QCAtMzksOSArMTg3LDggQEAgZW51bSBVQnJlYWtJdGVyYXRvclR5cGUgewogY2xhc3MgVGV4dEJy
ZWFrSXRlcmF0b3IgewogcHVibGljOgogICAgIFVCcmVha0l0ZXJhdG9yVHlwZSBtX3R5cGU7Ci0g
ICAgaW50IG1fbGVuZ3RoOwogICAgIFBhbmdvTG9nQXR0ciogbV9sb2dBdHRyczsKLSAgICBpbnQg
bV9pbmRleDsKKyAgICBDaGFyYWN0ZXJJdGVyYXRvciBtX2NoYXJJdGVyYXRvcjsKIH07CiAKIHN0
YXRpYyBUZXh0QnJlYWtJdGVyYXRvciogc2V0VXBJdGVyYXRvcihib29sJiBjcmVhdGVkSXRlcmF0
b3IsIFRleHRCcmVha0l0ZXJhdG9yKiYgaXRlcmF0b3IsCkBAIC01NywxOSArMjA0LDE3IEBAIHN0
YXRpYyBUZXh0QnJlYWtJdGVyYXRvciogc2V0VXBJdGVyYXRvcihib29sJiBjcmVhdGVkSXRlcmF0
b3IsIFRleHRCcmVha0l0ZXJhdG9yCiAgICAgaWYgKCFpdGVyYXRvcikKICAgICAgICAgcmV0dXJu
IDA7CiAKLSAgICBsb25nIHV0ZjhsZW47Ci0gICAgR093blB0cjxjaGFyPiB1dGY4OwotICAgIHV0
Zjguc2V0KGdfdXRmMTZfdG9fdXRmOChzdHJpbmcsIGxlbmd0aCwgMCwgJnV0ZjhsZW4sIDApKTsK
KyAgICBpZiAoIWl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5zZXRUZXh0KHN0cmluZywgbGVuZ3Ro
KSkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAvLyBGSVhNRTogYXNzdW1lcyBubyBzdXJyb2dh
dGUgcGFpcnMKKyAgICBpbnQgY2hhckxlbmd0aCA9IGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5n
ZXRMZW5ndGgoKTsKIAogICAgIGl0ZXJhdG9yLT5tX3R5cGUgPSB0eXBlOwotICAgIGl0ZXJhdG9y
LT5tX2xlbmd0aCA9IGxlbmd0aDsKICAgICBpZiAoY3JlYXRlZEl0ZXJhdG9yKQogICAgICAgICBn
X2ZyZWUoaXRlcmF0b3ItPm1fbG9nQXR0cnMpOwotICAgIGl0ZXJhdG9yLT5tX2xvZ0F0dHJzID0g
Z19uZXcwKFBhbmdvTG9nQXR0ciwgbGVuZ3RoICsgMSk7Ci0gICAgaXRlcmF0b3ItPm1faW5kZXgg
PSAwOwotICAgIHBhbmdvX2dldF9sb2dfYXR0cnModXRmOC5nZXQoKSwgdXRmOGxlbiwgLTEsIDAs
IGl0ZXJhdG9yLT5tX2xvZ0F0dHJzLCBsZW5ndGggKyAxKTsKKyAgICBpdGVyYXRvci0+bV9sb2dB
dHRycyA9IGdfbmV3MChQYW5nb0xvZ0F0dHIsIGNoYXJMZW5ndGggKyAxKTsKKyAgICBwYW5nb19n
ZXRfbG9nX2F0dHJzKGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5nZXRUZXh0KCksIGl0ZXJhdG9y
LT5tX2NoYXJJdGVyYXRvci5nZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAtMSwg
MCwgaXRlcmF0b3ItPm1fbG9nQXR0cnMsIGNoYXJMZW5ndGggKyAxKTsKIAogICAgIHJldHVybiBp
dGVyYXRvcjsKIH0KQEAgLTEwOCwyMSArMjUzLDEzIEBAIFRleHRCcmVha0l0ZXJhdG9yKiBzZW50
ZW5jZUJyZWFrSXRlcmF0b3IoY29uc3QgVUNoYXIqIHN0cmluZywgaW50IGxlbmd0aCkKICAgICBy
ZXR1cm4gc2V0VXBJdGVyYXRvcihjcmVhdGVkU2VudGVuY2VCcmVha0l0ZXJhdG9yLCBzdGF0aWNT
ZW50ZW5jZUJyZWFrSXRlcmF0b3IsIFVCUktfU0VOVEVOQ0UsIHN0cmluZywgbGVuZ3RoKTsKIH0K
IAotaW50IHRleHRCcmVha0ZpcnN0KFRleHRCcmVha0l0ZXJhdG9yKiBiaSkKK2ludCB0ZXh0QnJl
YWtGaXJzdChUZXh0QnJlYWtJdGVyYXRvciogaXRlcmF0b3IpCiB7Ci0gICAgLy8gc2VlIHRleHRC
cmVha0xhc3QKLSAgICAKLSAgICBpbnQgZmlyc3RDdXJzb3JQb3NpdGlvbiA9IC0xOwotICAgIGlu
dCBwb3MgPSAwOwotICAgIHdoaWxlIChwb3MgPD0gYmktPm1fbGVuZ3RoICYmIChmaXJzdEN1cnNv
clBvc2l0aW9uIDwgMCkpIHsKLSAgICAgICAgaWYgKGJpLT5tX2xvZ0F0dHJzW3Bvc10uaXNfY3Vy
c29yX3Bvc2l0aW9uKQotICAgICAgICAgICAgZmlyc3RDdXJzb3JQb3NpdGlvbiA9IHBvczsKLSAg
ICB9Ci0gICAgYmktPm1faW5kZXggPSBmaXJzdEN1cnNvclBvc2l0aW9uOwotICAgIHJldHVybiBm
aXJzdEN1cnNvclBvc2l0aW9uOworICAgIGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5maXJzdCgp
OworICAgIHJldHVybiBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0TmF0aXZlSW5kZXgoKTsK
IH0KIAotaW50IHRleHRCcmVha0xhc3QoVGV4dEJyZWFrSXRlcmF0b3IqIGJpKQoraW50IHRleHRC
cmVha0xhc3QoVGV4dEJyZWFrSXRlcmF0b3IqIGl0ZXJhdG9yKQogewogICAgIC8vIFRleHRCcmVh
a0xhc3QgaXMgbm90IG1lYW50IHRvIGZpbmQganVzdCBhbnkgYnJlYWsgYWNjb3JkaW5nIHRvIGJp
LT5tX3R5cGUgCiAgICAgLy8gYnV0IHJlYWxseSB0aGUgb25lIG5lYXIgdGhlIGxhc3QgY2hhcmFj
dGVyLgpAQCAtMTM3LDgxICsyNzQsOTIgQEAgaW50IHRleHRCcmVha0xhc3QoVGV4dEJyZWFrSXRl
cmF0b3IqIGJpKQogICAgIC8vIE90aGVyd2lzZSByZXR1cm4gbV9sZW5ndGgsIGFzICJ0aGUgZmly
c3QgY2hhcmFjdGVyIGJleW9uZCB0aGUgbGFzdCIgaXMgb3V0c2lkZSBvdXIgc3RyaW5nLgogICAg
IAogICAgIGJvb2wgd2hpdGVTcGFjZUF0VGhlRW5kID0gdHJ1ZTsKLSAgICBpbnQgbmV4dFdoaXRl
U3BhY2VQb3MgPSBiaS0+bV9sZW5ndGg7Ci0gICAgCi0gICAgaW50IHBvcyA9IGJpLT5tX2xlbmd0
aDsKKyAgICBpbnQgbmV4dFdoaXRlU3BhY2VQb3MgPSBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3Iu
Z2V0TGVuZ3RoKCk7CisKKyAgICBpbnQgcG9zID0gaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLmxh
c3QoKTsKICAgICB3aGlsZSAocG9zID49IDAgJiYgd2hpdGVTcGFjZUF0VGhlRW5kKSB7Ci0gICAg
ICAgIGlmIChiaS0+bV9sb2dBdHRyc1twb3NdLmlzX2N1cnNvcl9wb3NpdGlvbikgewotICAgICAg
ICAgICAgaWYgKHdoaXRlU3BhY2VBdFRoZUVuZCA9IGJpLT5tX2xvZ0F0dHJzW3Bvc10uaXNfd2hp
dGUpCisgICAgICAgIGlmIChpdGVyYXRvci0+bV9sb2dBdHRyc1twb3NdLmlzX2N1cnNvcl9wb3Np
dGlvbikgeworICAgICAgICAgICAgaWYgKHdoaXRlU3BhY2VBdFRoZUVuZCA9IGl0ZXJhdG9yLT5t
X2xvZ0F0dHJzW3Bvc10uaXNfd2hpdGUpCiAgICAgICAgICAgICAgICAgbmV4dFdoaXRlU3BhY2VQ
b3MgPSBwb3M7CiAgICAgICAgIH0KLSAgICAgICAgcG9zLS07CisgICAgICAgIHBvcyA9IGl0ZXJh
dG9yLT5tX2NoYXJJdGVyYXRvci5wcmV2aW91cygpOwogICAgIH0KLSAgICBiaS0+bV9pbmRleCA9
IG5leHRXaGl0ZVNwYWNlUG9zOwotICAgIHJldHVybiBuZXh0V2hpdGVTcGFjZVBvczsKKyAgICBp
dGVyYXRvci0+bV9jaGFySXRlcmF0b3Iuc2V0SW5kZXgobmV4dFdoaXRlU3BhY2VQb3MpOworICAg
IHJldHVybiBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0TmF0aXZlSW5kZXgoKTsKIH0KIAot
aW50IHRleHRCcmVha05leHQoVGV4dEJyZWFrSXRlcmF0b3IqIGJpKQoraW50IHRleHRCcmVha05l
eHQoVGV4dEJyZWFrSXRlcmF0b3IqIGl0ZXJhdG9yKQogewotICAgIGZvciAoaW50IGkgPSBiaS0+
bV9pbmRleCArIDE7IGkgPD0gYmktPm1fbGVuZ3RoOyBpKyspIHsKKyAgICB3aGlsZSAoaXRlcmF0
b3ItPm1fY2hhckl0ZXJhdG9yLm5leHQoKSAhPSBUZXh0QnJlYWtEb25lKSB7CisgICAgICAgIGlu
dCBpbmRleCA9IGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5nZXRJbmRleCgpOwogCiAgICAgICAg
IC8vIEZJWE1FOiBVQlJLX1dPUkQgY2FzZTogU2luZ2xlIG11bHRpYnl0ZSBjaGFyYWN0ZXJzIChp
LmUuIHdoaXRlIHNwYWNlIGFyb3VuZCB0aGVtKSwgc3VjaCBhcyB0aGUgZXVybyBzeW1ib2wg4oKs
LCAKICAgICAgICAgLy8gYXJlIG5vdCBtYXJrZWQgYXMgd29yZF9zdGFydCAmIHdvcmRfZW5kIGFz
IG9wcG9zZWQgdG8gdGhlIHdheSBJQ1UgZG9lcyBpdC4KICAgICAgICAgLy8gVGhpcyBsZWFkcyB0
byAtIGZvciBleGFtcGxlIC0gZGlmZmVyZW50IHdvcmQgc2VsZWN0aW9uIGJlaGF2aW91ciB3aGVu
IHJpZ2h0IGNsaWNraW5nLgogCi0gICAgICAgIGlmICgoYmktPm1fdHlwZSA9PSBVQlJLX0xJTkUg
JiYgYmktPm1fbG9nQXR0cnNbaV0uaXNfbGluZV9icmVhaykKLSAgICAgICAgICAgIHx8IChiaS0+
bV90eXBlID09IFVCUktfV09SRCAmJiAoYmktPm1fbG9nQXR0cnNbaV0uaXNfd29yZF9zdGFydCB8
fCBiaS0+bV9sb2dBdHRyc1tpXS5pc193b3JkX2VuZCkpCi0gICAgICAgICAgICB8fCAoYmktPm1f
dHlwZSA9PSBVQlJLX0NIQVJBQ1RFUiAmJiBiaS0+bV9sb2dBdHRyc1tpXS5pc19jdXJzb3JfcG9z
aXRpb24pCi0gICAgICAgICAgICB8fCAoYmktPm1fdHlwZSA9PSBVQlJLX1NFTlRFTkNFICYmIChi
aS0+bV9sb2dBdHRyc1tpXS5pc19zZW50ZW5jZV9zdGFydCB8fCBiaS0+bV9sb2dBdHRyc1tpXS5p
c19zZW50ZW5jZV9lbmQpKSApIHsKLSAgICAgICAgICAgIGJpLT5tX2luZGV4ID0gaTsKLSAgICAg
ICAgICAgIHJldHVybiBpOworICAgICAgICBpZiAoKGl0ZXJhdG9yLT5tX3R5cGUgPT0gVUJSS19M
SU5FICYmIGl0ZXJhdG9yLT5tX2xvZ0F0dHJzW2luZGV4XS5pc19saW5lX2JyZWFrKQorICAgICAg
ICAgICAgfHwgKGl0ZXJhdG9yLT5tX3R5cGUgPT0gVUJSS19XT1JEICYmIChpdGVyYXRvci0+bV9s
b2dBdHRyc1tpbmRleF0uaXNfd29yZF9zdGFydCB8fCBpdGVyYXRvci0+bV9sb2dBdHRyc1tpbmRl
eF0uaXNfd29yZF9lbmQpKQorICAgICAgICAgICAgfHwgKGl0ZXJhdG9yLT5tX3R5cGUgPT0gVUJS
S19DSEFSQUNURVIgJiYgaXRlcmF0b3ItPm1fbG9nQXR0cnNbaW5kZXhdLmlzX2N1cnNvcl9wb3Np
dGlvbikKKyAgICAgICAgICAgIHx8IChpdGVyYXRvci0+bV90eXBlID09IFVCUktfU0VOVEVOQ0Ug
JiYgKGl0ZXJhdG9yLT5tX2xvZ0F0dHJzW2luZGV4XS5pc19zZW50ZW5jZV9zdGFydCB8fCBpdGVy
YXRvci0+bV9sb2dBdHRyc1tpbmRleF0uaXNfc2VudGVuY2VfZW5kKSkgKSB7CisgICAgICAgICAg
ICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVGV4dEJyZWFrRG9uZTsKKyAg
ICByZXR1cm4gaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLmdldE5hdGl2ZUluZGV4KCk7CiB9CiAK
LWludCB0ZXh0QnJlYWtQcmV2aW91cyhUZXh0QnJlYWtJdGVyYXRvciogYmkpCitpbnQgdGV4dEJy
ZWFrUHJldmlvdXMoVGV4dEJyZWFrSXRlcmF0b3IqIGl0ZXJhdG9yKQogewotICAgIGZvciAoaW50
IGkgPSBiaS0+bV9pbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIGlmICgoYmktPm1f
dHlwZSA9PSBVQlJLX0xJTkUgJiYgYmktPm1fbG9nQXR0cnNbaV0uaXNfbGluZV9icmVhaykKLSAg
ICAgICAgICAgIHx8IChiaS0+bV90eXBlID09IFVCUktfV09SRCAmJiAoYmktPm1fbG9nQXR0cnNb
aV0uaXNfd29yZF9zdGFydCB8fCBiaS0+bV9sb2dBdHRyc1tpXS5pc193b3JkX2VuZCkpCi0gICAg
ICAgICAgICB8fCAoYmktPm1fdHlwZSA9PSBVQlJLX0NIQVJBQ1RFUiAmJiBiaS0+bV9sb2dBdHRy
c1tpXS5pc19jdXJzb3JfcG9zaXRpb24pCi0gICAgICAgICAgICB8fCAoYmktPm1fdHlwZSA9PSBV
QlJLX1NFTlRFTkNFICYmIChiaS0+bV9sb2dBdHRyc1tpXS5pc19zZW50ZW5jZV9zdGFydCB8fCBi
aS0+bV9sb2dBdHRyc1tpXS5pc19zZW50ZW5jZV9lbmQpKSApIHsKLSAgICAgICAgICAgIGJpLT5t
X2luZGV4ID0gaTsKLSAgICAgICAgICAgIHJldHVybiBpOworICAgIHdoaWxlIChpdGVyYXRvci0+
bV9jaGFySXRlcmF0b3IucHJldmlvdXMoKSAhPSBUZXh0QnJlYWtEb25lKSB7CisgICAgICAgIGlu
dCBpbmRleCA9IGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5nZXRJbmRleCgpOworCisgICAgICAg
IGlmICgoaXRlcmF0b3ItPm1fdHlwZSA9PSBVQlJLX0xJTkUgJiYgaXRlcmF0b3ItPm1fbG9nQXR0
cnNbaW5kZXhdLmlzX2xpbmVfYnJlYWspCisgICAgICAgICAgICB8fCAoaXRlcmF0b3ItPm1fdHlw
ZSA9PSBVQlJLX1dPUkQgJiYgKGl0ZXJhdG9yLT5tX2xvZ0F0dHJzW2luZGV4XS5pc193b3JkX3N0
YXJ0IHx8IGl0ZXJhdG9yLT5tX2xvZ0F0dHJzW2luZGV4XS5pc193b3JkX2VuZCkpCisgICAgICAg
ICAgICB8fCAoaXRlcmF0b3ItPm1fdHlwZSA9PSBVQlJLX0NIQVJBQ1RFUiAmJiBpdGVyYXRvci0+
bV9sb2dBdHRyc1tpbmRleF0uaXNfY3Vyc29yX3Bvc2l0aW9uKQorICAgICAgICAgICAgfHwgKGl0
ZXJhdG9yLT5tX3R5cGUgPT0gVUJSS19TRU5URU5DRSAmJiAoaXRlcmF0b3ItPm1fbG9nQXR0cnNb
aW5kZXhdLmlzX3NlbnRlbmNlX3N0YXJ0IHx8IGl0ZXJhdG9yLT5tX2xvZ0F0dHJzW2luZGV4XS5p
c19zZW50ZW5jZV9lbmQpKSApIHsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAg
fQotICAgIHJldHVybiB0ZXh0QnJlYWtGaXJzdChiaSk7CisgICAgcmV0dXJuIGl0ZXJhdG9yLT5t
X2NoYXJJdGVyYXRvci5nZXROYXRpdmVJbmRleCgpOwogfQogCi1pbnQgdGV4dEJyZWFrUHJlY2Vk
aW5nKFRleHRCcmVha0l0ZXJhdG9yKiBiaSwgaW50IHBvcykKK2ludCB0ZXh0QnJlYWtQcmVjZWRp
bmcoVGV4dEJyZWFrSXRlcmF0b3IqIGl0ZXJhdG9yLCBpbnQgb2Zmc2V0KQogewotICAgIGJpLT5t
X2luZGV4ID0gcG9zOwotICAgIHJldHVybiB0ZXh0QnJlYWtQcmV2aW91cyhiaSk7CisgICAgaWYg
KG9mZnNldCA+IGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5nZXROYXRpdmVMZW5ndGgoKSkKKyAg
ICAgICAgcmV0dXJuIFRleHRCcmVha0RvbmU7CisgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAg
IHJldHVybiAwOworICAgIGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5zZXROYXRpdmVJbmRleChv
ZmZzZXQpOworICAgIHJldHVybiB0ZXh0QnJlYWtQcmV2aW91cyhpdGVyYXRvcik7CiB9CiAKLWlu
dCB0ZXh0QnJlYWtGb2xsb3dpbmcoVGV4dEJyZWFrSXRlcmF0b3IqIGJpLCBpbnQgcG9zKQoraW50
IHRleHRCcmVha0ZvbGxvd2luZyhUZXh0QnJlYWtJdGVyYXRvciogaXRlcmF0b3IsIGludCBvZmZz
ZXQpCiB7Ci0gICAgaWYgKHBvcyA8IDApCi0gICAgICAgIHBvcyA9IC0xOwotICAgIGJpLT5tX2lu
ZGV4ID0gcG9zOwotICAgIHJldHVybiB0ZXh0QnJlYWtOZXh0KGJpKTsKKyAgICBpZiAob2Zmc2V0
ID4gaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLmdldE5hdGl2ZUxlbmd0aCgpKQorICAgICAgICBy
ZXR1cm4gVGV4dEJyZWFrRG9uZTsKKyAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLnNldE5hdGl2ZUluZGV4KG9mZnNldCk7
CisgICAgcmV0dXJuIHRleHRCcmVha05leHQoaXRlcmF0b3IpOwogfQogCi1pbnQgdGV4dEJyZWFr
Q3VycmVudChUZXh0QnJlYWtJdGVyYXRvciogYmkpCitpbnQgdGV4dEJyZWFrQ3VycmVudChUZXh0
QnJlYWtJdGVyYXRvciogaXRlcmF0b3IpCiB7Ci0gICAgcmV0dXJuIGJpLT5tX2luZGV4OworICAg
IHJldHVybiBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0TmF0aXZlSW5kZXgoKTsKIH0KIAot
Ym9vbCBpc1RleHRCcmVhayhUZXh0QnJlYWtJdGVyYXRvciogYmksIGludCBwb3MpCitib29sIGlz
VGV4dEJyZWFrKFRleHRCcmVha0l0ZXJhdG9yKiBpdGVyYXRvciwgaW50IG9mZnNldCkKIHsKLSAg
ICBpZiAoYmktPm1faW5kZXggPCAwKQorICAgIGlmICghb2Zmc2V0KQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICBpZiAob2Zmc2V0ID4gaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLmdldE5hdGl2
ZUxlbmd0aCgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gKChiaS0+bV90
eXBlID09IFVCUktfTElORSAmJiBiaS0+bV9sb2dBdHRyc1tiaS0+bV9pbmRleF0uaXNfbGluZV9i
cmVhaykKLSAgICAgICAgfHwgKGJpLT5tX3R5cGUgPT0gVUJSS19XT1JEICYmIGJpLT5tX2xvZ0F0
dHJzW2JpLT5tX2luZGV4XS5pc193b3JkX2VuZCkKLSAgICAgICAgfHwgKGJpLT5tX3R5cGUgPT0g
VUJSS19DSEFSQUNURVIgJiYgYmktPm1fbG9nQXR0cnNbYmktPm1faW5kZXhdLmlzX2NoYXJfYnJl
YWspCi0gICAgICAgIHx8IChiaS0+bV90eXBlID09IFVCUktfU0VOVEVOQ0UgJiYgYmktPm1fbG9n
QXR0cnNbYmktPm1faW5kZXhdLmlzX3NlbnRlbmNlX2VuZCkgKTsKKyAgICBpdGVyYXRvci0+bV9j
aGFySXRlcmF0b3Iuc2V0TmF0aXZlSW5kZXgob2Zmc2V0KTsKKworICAgIGludCBpbmRleCA9IGl0
ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5nZXRJbmRleCgpOworICAgIGl0ZXJhdG9yLT5tX2NoYXJJ
dGVyYXRvci5wcmV2aW91cygpOworICAgIHRleHRCcmVha05leHQoaXRlcmF0b3IpOworICAgIHJl
dHVybiBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0SW5kZXgoKSA9PSBpbmRleDsKIH0KIAog
fQo=
</data>
<flag name="review"
          id="62181"
          type_id="1"
          status="-"
          setter="mrobinson"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72171</attachid>
            <date>2010-10-28 05:10:41 -0700</date>
            <delta_ts>2010-10-29 08:39:14 -0700</delta_ts>
            <desc>Updated patch according to review</desc>
            <filename>surrogates.diff</filename>
            <type>text/plain</type>
            <size>14762</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MTU1OTc3Yy4uMzdkYjk4NCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MyBAQAorMjAxMC0xMC0yOCAgQ2FybG9zIEdhcmNp
YSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgW0dUS10gSGFuZGxlIHN1cnJvZ2F0ZSBwYWlycyBpbiBU
ZXh0QnJlYWtJdGVyYXRvckd0aworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NDgyMjcKKworICAgICAgICBUZXh0QnJlYWtJdGVyYXRvckd0ayB1c2VzIFVU
Ri04IGJlY2F1c2UgaXQncyB3aGF0IHBhbmdvIGV4cGVjdHMsIGJ1dCB3ZQorICAgICAgICBuZWVk
IHRvIHJldHVybiBpbmRpY2VzIGZvciB0aGUgZ2l2ZW4gaW5wdXQgc3RyaW5nIHRoYXQgYXJlIGlu
IFVURi0xNi4KKyAgICAgICAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGlzIHRoZSBzYW1lIGZv
ciBib3RoIFVURi0xNiBhbmQgVVRGLTggZXhjZXB0IHdoZW4KKyAgICAgICAgdGhlIGlucHV0IHN0
cmluZyBjb250YWlucyBzdXJyb2dhdGUgcGFpcnMuIFdlIG5lZWQgdG8ga2VlcCBib3RoLCB0aGUK
KyAgICAgICAgaW5kZXggZm9yIHRoZSBVVEYtOCBzdHJpbmcgdG8gYmUgdXNlZCBpbnRlcm5hbGx5
LCBhbmQgdGhlIGluZGV4IGZvciB0aGUKKyAgICAgICAgVVRGLTE2IHN0cmluZyB0byBiZSB1c2Vk
IGFzIHJldHVybiB2YWx1ZSBvZiB0aGUgaXRlcmF0b3IgaW50ZXJmYWNlLiBJdAorICAgICAgICBm
aXhlcyB0ZXN0IGZhc3QvZm9ybXMvdGV4dGFyZWEtbWF4bGVuZ3RoLmh0bWwKKworICAgICAgICAq
IHBsYXRmb3JtL3RleHQvZ3RrL1RleHRCcmVha0l0ZXJhdG9yR3RrLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpnZXRUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkNo
YXJhY3Rlckl0ZXJhdG9yOjpnZXRMZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVy
SXRlcmF0b3I6OmdldFNpemUpOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVySXRlcmF0b3I6
OmdldEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpnZXRVVEYx
NkluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpnZXRVVEYxNkxl
bmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJJdGVyYXRvcjo6Y2hhcmFjdGVyU2l6
ZSk6CisgICAgICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJJdGVyYXRvcjo6c2V0VGV4dCk6CisgICAg
ICAgIChXZWJDb3JlOjpDaGFyYWN0ZXJJdGVyYXRvcjo6c2V0SW5kZXgpOgorICAgICAgICAoV2Vi
Q29yZTo6Q2hhcmFjdGVySXRlcmF0b3I6OnNldFVURjE2SW5kZXgpOgorICAgICAgICAoV2ViQ29y
ZTo6Q2hhcmFjdGVySXRlcmF0b3I6OmZpcnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rl
ckl0ZXJhdG9yOjpsYXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpu
ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3Rlckl0ZXJhdG9yOjpwcmV2aW91cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpzZXRVcEl0ZXJhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRC
cmVha0ZpcnN0KToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRCcmVha0xhc3QpOgorICAgICAgICAo
V2ViQ29yZTo6dGV4dEJyZWFrTmV4dCk6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0QnJlYWtQcmV2
aW91cyk6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0QnJlYWtQcmVjZWRpbmcpOgorICAgICAgICAo
V2ViQ29yZTo6dGV4dEJyZWFrRm9sbG93aW5nKToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRCcmVh
a0N1cnJlbnQpOgorICAgICAgICAoV2ViQ29yZTo6aXNUZXh0QnJlYWspOgorCiAyMDEwLTEwLTIx
ICBLd2FuZyBZdWwgU2VvICA8c2t5dWxAY29tcGFueTEwMC5uZXQ+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgS2VudCBUYW11cmEuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvZ3Rr
L1RleHRCcmVha0l0ZXJhdG9yR3RrLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4
dEJyZWFrSXRlcmF0b3JHdGsuY3BwCmluZGV4IGQ4YWJmMGQuLmJlM2YzMDIgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dEJyZWFrSXRlcmF0b3JHdGsuY3BwCisrKyBi
L1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9ndGsvVGV4dEJyZWFrSXRlcmF0b3JHdGsuY3BwCkBAIC0z
LDYgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOCBKw7xyZyBCaWxsZXRlciA8akBiaXRyb24u
Y2g+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggRG9taW5payBSw7Z0dHNjaGVzIDxkb21pbmlrLnJv
ZXR0c2NoZXNAYWNjZXNzLWNvbXBhbnkuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxp
YSBTLkwuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTIyLDEzICsyMywxNjAgQEAKICAqLwogCiAj
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiR093blB0ci5oIgorCiAjaW5jbHVkZSAiVGV4
dEJyZWFrSXRlcmF0b3IuaCIKIAorI2luY2x1ZGUgIkdPd25QdHIuaCIKICNpbmNsdWRlIDxwYW5n
by9wYW5nby5oPgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworI2RlZmluZSBVVEY4X0lTX1NVUlJP
R0FURShjaGFyYWN0ZXIpIChjaGFyYWN0ZXIgPj0gMHgxMDAwMCAmJiBjaGFyYWN0ZXIgPD0gMHgx
MEZGRkYpCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3MgQ2hhcmFjdGVySXRlcmF0b3Ig
eworcHVibGljOgorICAgIGJvb2wgc2V0VGV4dChjb25zdCBVQ2hhciogc3RyaW5nLCBpbnQgbGVu
Z3RoKTsKKyAgICBjb25zdCBnY2hhciogZ2V0VGV4dCgpIHsgcmV0dXJuIG1fdXRmOC5nZXQoKTsg
fQorICAgIGludCBnZXRMZW5ndGgoKSB7IHJldHVybiBtX2xlbmd0aDsgfQorICAgIGdsb25nIGdl
dFNpemUoKSB7IHJldHVybiBtX3NpemU7IH0KKyAgICB2b2lkIHNldEluZGV4KGludCBpbmRleCk7
CisgICAgaW50IGdldEluZGV4KCkgeyByZXR1cm4gbV9pbmRleDsgfQorICAgIHZvaWQgc2V0VVRG
MTZJbmRleChpbnQgaW5kZXgpOworICAgIGludCBnZXRVVEYxNkluZGV4KCkgeyByZXR1cm4gbV91
dGYxNkluZGV4OyB9CisgICAgaW50IGdldFVURjE2TGVuZ3RoKCkgeyByZXR1cm4gbV91dGYxNkxl
bmd0aDsgfQorICAgIGludCBmaXJzdCgpOworICAgIGludCBsYXN0KCk7CisgICAgaW50IG5leHQo
KTsKKyAgICBpbnQgcHJldmlvdXMoKTsKK3ByaXZhdGU6CisgICAgaW50IGNoYXJhY3RlclNpemUo
aW50IGluZGV4KTsKKworICAgIEdPd25QdHI8Y2hhcj4gbV91dGY4OworICAgIGludCBtX2xlbmd0
aDsKKyAgICBsb25nIG1fc2l6ZTsKKyAgICBpbnQgbV9pbmRleDsKKyAgICBpbnQgbV91dGYxNklu
ZGV4OworICAgIGludCBtX3V0ZjE2TGVuZ3RoOworfTsKKworaW50IENoYXJhY3Rlckl0ZXJhdG9y
OjpjaGFyYWN0ZXJTaXplKGludCBpbmRleCkKK3sKKyAgICBpZiAoaW5kZXggPT0gbV9sZW5ndGgg
fHwgaW5kZXggPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAobV9sZW5ndGggPT0gbV91
dGYxNkxlbmd0aCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBnY2hhciogaW5kZXhQdHIgPSBn
X3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXIobV91dGY4LmdldCgpLCBpbmRleCk7CisgICAgZ3VuaWNo
YXIgY2hhcmFjdGVyID0gZ191dGY4X2dldF9jaGFyKGluZGV4UHRyKTsKKyAgICByZXR1cm4gVVRG
OF9JU19TVVJST0dBVEUoY2hhcmFjdGVyKSA/IDIgOiAxOworfQorCitib29sIENoYXJhY3Rlckl0
ZXJhdG9yOjpzZXRUZXh0KGNvbnN0IFVDaGFyKiBzdHJpbmcsIGludCBsZW5ndGgpCit7CisgICAg
bG9uZyB1dGY4U2l6ZSA9IDA7CisgICAgbV91dGY4LnNldChnX3V0ZjE2X3RvX3V0Zjgoc3RyaW5n
LCBsZW5ndGgsIDAsICZ1dGY4U2l6ZSwgMCkpOworICAgIGlmICghdXRmOFNpemUpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIG1fdXRmMTZMZW5ndGggPSBsZW5ndGg7CisgICAgbV9sZW5n
dGggPSBnX3V0Zjhfc3RybGVuKG1fdXRmOC5nZXQoKSwgdXRmOFNpemUpOworICAgIG1fc2l6ZSA9
IHV0ZjhTaXplOworICAgIG1faW5kZXggPSAwOworICAgIG1fdXRmMTZJbmRleCA9IDA7CisKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDaGFyYWN0ZXJJdGVyYXRvcjo6c2V0SW5kZXgoaW50
IGluZGV4KQoreworICAgIGlmIChpbmRleCA9PSBtX2luZGV4KQorICAgICAgICByZXR1cm47Cisg
ICAgaWYgKGluZGV4IDw9IDApCisgICAgICAgIG1faW5kZXggPSBtX3V0ZjE2SW5kZXggPSAwOwor
ICAgIGVsc2UgaWYgKGluZGV4ID49IG1fbGVuZ3RoKSB7CisgICAgICAgIG1faW5kZXggPSBtX2xl
bmd0aDsKKyAgICAgICAgbV91dGYxNkluZGV4ID0gbV91dGYxNkxlbmd0aDsKKyAgICB9IGVsc2Ug
aWYgKG1fbGVuZ3RoID09IG1fdXRmMTZMZW5ndGgpCisgICAgICAgIG1faW5kZXggPSBtX3V0ZjE2
SW5kZXggPSBpbmRleDsKKyAgICBlbHNlIHsKKyAgICAgICAgbV9pbmRleCA9IGluZGV4OworICAg
ICAgICBpbnQgdXRmMTZJbmRleCA9IDA7CisgICAgICAgIGludCB1dGY4SW5kZXggPSAwOworICAg
ICAgICB3aGlsZSAodXRmOEluZGV4IDwgaW5kZXgpIHsKKyAgICAgICAgICAgIHV0ZjE2SW5kZXgg
Kz0gY2hhcmFjdGVyU2l6ZSh1dGY4SW5kZXgpOworICAgICAgICAgICAgdXRmOEluZGV4Kys7Cisg
ICAgICAgIH0KKyAgICAgICAgbV91dGYxNkluZGV4ID0gdXRmMTZJbmRleDsKKyAgICB9Cit9CisK
K3ZvaWQgQ2hhcmFjdGVySXRlcmF0b3I6OnNldFVURjE2SW5kZXgoaW50IGluZGV4KQoreworICAg
IGlmIChpbmRleCA9PSBtX3V0ZjE2SW5kZXgpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoaW5k
ZXggPD0gMCkKKyAgICAgICAgbV91dGYxNkluZGV4ID0gbV9pbmRleCA9IDA7CisgICAgZWxzZSBp
ZiAoaW5kZXggPj0gbV91dGYxNkxlbmd0aCkgeworICAgICAgICBtX3V0ZjE2SW5kZXggPSBtX3V0
ZjE2TGVuZ3RoOworICAgICAgICBtX2luZGV4ID0gbV9sZW5ndGg7CisgICAgfSBlbHNlIGlmICht
X2xlbmd0aCA9PSBtX3V0ZjE2TGVuZ3RoKQorICAgICAgICBtX3V0ZjE2SW5kZXggPSBtX2luZGV4
ID0gaW5kZXg7CisgICAgZWxzZSB7CisgICAgICAgIG1fdXRmMTZJbmRleCA9IGluZGV4OworICAg
ICAgICBpbnQgdXRmMTZJbmRleCA9IDA7CisgICAgICAgIGludCB1dGY4SW5kZXggPSAwOworICAg
ICAgICB3aGlsZSAodXRmMTZJbmRleCA8IGluZGV4KSB7CisgICAgICAgICAgICB1dGYxNkluZGV4
ICs9IGNoYXJhY3RlclNpemUodXRmOEluZGV4KTsKKyAgICAgICAgICAgIHV0ZjhJbmRleCsrOwor
ICAgICAgICB9CisgICAgICAgIG1faW5kZXggPSB1dGY4SW5kZXg7CisgICAgfQorfQorCitpbnQg
Q2hhcmFjdGVySXRlcmF0b3I6OmZpcnN0KCkKK3sKKyAgICBtX2luZGV4ID0gbV91dGYxNkluZGV4
ID0gMDsKKyAgICByZXR1cm4gbV9pbmRleDsKK30KKworaW50IENoYXJhY3Rlckl0ZXJhdG9yOjps
YXN0KCkKK3sKKyAgICBtX2luZGV4ID0gbV9sZW5ndGg7CisgICAgbV91dGYxNkluZGV4ID0gbV91
dGYxNkxlbmd0aDsKKyAgICByZXR1cm4gbV9pbmRleDsKK30KKworaW50IENoYXJhY3Rlckl0ZXJh
dG9yOjpuZXh0KCkKK3sKKyAgICBpbnQgbmV4dCA9IG1faW5kZXggKyAxOworCisgICAgaWYgKG5l
eHQgPD0gbV9sZW5ndGgpIHsKKyAgICAgICAgbV91dGYxNkluZGV4ID0gbWluKG1fdXRmMTZJbmRl
eCArIGNoYXJhY3RlclNpemUobV9pbmRleCksIG1fdXRmMTZMZW5ndGgpOworICAgICAgICBtX2lu
ZGV4ID0gbmV4dDsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2luZGV4ID0gVGV4dEJyZWFrRG9u
ZTsKKyAgICAgICAgbV91dGYxNkluZGV4ID0gVGV4dEJyZWFrRG9uZTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gbV9pbmRleDsKK30KKworaW50IENoYXJhY3Rlckl0ZXJhdG9yOjpwcmV2aW91cygpCit7
CisgICAgaW50IHByZXZpb3VzID0gbV9pbmRleCAtIDE7CisKKyAgICBpZiAocHJldmlvdXMgPj0g
MCkgeworICAgICAgICBtX3V0ZjE2SW5kZXggPSBtYXgobV91dGYxNkluZGV4IC0gY2hhcmFjdGVy
U2l6ZShwcmV2aW91cyksIDApOworICAgICAgICBtX2luZGV4ID0gcHJldmlvdXM7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgbV9pbmRleCA9IFRleHRCcmVha0RvbmU7CisgICAgICAgIG1fdXRmMTZJ
bmRleCA9IFRleHRCcmVha0RvbmU7CisgICAgfQorCisgICAgcmV0dXJuIG1faW5kZXg7Cit9CisK
IGVudW0gVUJyZWFrSXRlcmF0b3JUeXBlIHsKICAgICBVQlJLX0NIQVJBQ1RFUiwKICAgICBVQlJL
X1dPUkQsCkBAIC0zOSw5ICsxODcsOCBAQCBlbnVtIFVCcmVha0l0ZXJhdG9yVHlwZSB7CiBjbGFz
cyBUZXh0QnJlYWtJdGVyYXRvciB7CiBwdWJsaWM6CiAgICAgVUJyZWFrSXRlcmF0b3JUeXBlIG1f
dHlwZTsKLSAgICBpbnQgbV9sZW5ndGg7CiAgICAgUGFuZ29Mb2dBdHRyKiBtX2xvZ0F0dHJzOwot
ICAgIGludCBtX2luZGV4OworICAgIENoYXJhY3Rlckl0ZXJhdG9yIG1fY2hhckl0ZXJhdG9yOwog
fTsKIAogc3RhdGljIFRleHRCcmVha0l0ZXJhdG9yKiBzZXRVcEl0ZXJhdG9yKGJvb2wmIGNyZWF0
ZWRJdGVyYXRvciwgVGV4dEJyZWFrSXRlcmF0b3IqJiBpdGVyYXRvciwKQEAgLTU3LDE5ICsyMDQs
MTcgQEAgc3RhdGljIFRleHRCcmVha0l0ZXJhdG9yKiBzZXRVcEl0ZXJhdG9yKGJvb2wmIGNyZWF0
ZWRJdGVyYXRvciwgVGV4dEJyZWFrSXRlcmF0b3IKICAgICBpZiAoIWl0ZXJhdG9yKQogICAgICAg
ICByZXR1cm4gMDsKIAotICAgIGxvbmcgdXRmOGxlbjsKLSAgICBHT3duUHRyPGNoYXI+IHV0Zjg7
Ci0gICAgdXRmOC5zZXQoZ191dGYxNl90b191dGY4KHN0cmluZywgbGVuZ3RoLCAwLCAmdXRmOGxl
biwgMCkpOworICAgIGlmICghaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLnNldFRleHQoc3RyaW5n
LCBsZW5ndGgpKQorICAgICAgICByZXR1cm4gMDsKIAotICAgIC8vIEZJWE1FOiBhc3N1bWVzIG5v
IHN1cnJvZ2F0ZSBwYWlycworICAgIGludCBjaGFyTGVuZ3RoID0gaXRlcmF0b3ItPm1fY2hhckl0
ZXJhdG9yLmdldExlbmd0aCgpOwogCiAgICAgaXRlcmF0b3ItPm1fdHlwZSA9IHR5cGU7Ci0gICAg
aXRlcmF0b3ItPm1fbGVuZ3RoID0gbGVuZ3RoOwogICAgIGlmIChjcmVhdGVkSXRlcmF0b3IpCiAg
ICAgICAgIGdfZnJlZShpdGVyYXRvci0+bV9sb2dBdHRycyk7Ci0gICAgaXRlcmF0b3ItPm1fbG9n
QXR0cnMgPSBnX25ldzAoUGFuZ29Mb2dBdHRyLCBsZW5ndGggKyAxKTsKLSAgICBpdGVyYXRvci0+
bV9pbmRleCA9IDA7Ci0gICAgcGFuZ29fZ2V0X2xvZ19hdHRycyh1dGY4LmdldCgpLCB1dGY4bGVu
LCAtMSwgMCwgaXRlcmF0b3ItPm1fbG9nQXR0cnMsIGxlbmd0aCArIDEpOworICAgIGl0ZXJhdG9y
LT5tX2xvZ0F0dHJzID0gZ19uZXcwKFBhbmdvTG9nQXR0ciwgY2hhckxlbmd0aCArIDEpOworICAg
IHBhbmdvX2dldF9sb2dfYXR0cnMoaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLmdldFRleHQoKSwg
aXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLmdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgIC0xLCAwLCBpdGVyYXRvci0+bV9sb2dBdHRycywgY2hhckxlbmd0aCArIDEpOwogCiAgICAg
cmV0dXJuIGl0ZXJhdG9yOwogfQpAQCAtMTA4LDIxICsyNTMsMTMgQEAgVGV4dEJyZWFrSXRlcmF0
b3IqIHNlbnRlbmNlQnJlYWtJdGVyYXRvcihjb25zdCBVQ2hhciogc3RyaW5nLCBpbnQgbGVuZ3Ro
KQogICAgIHJldHVybiBzZXRVcEl0ZXJhdG9yKGNyZWF0ZWRTZW50ZW5jZUJyZWFrSXRlcmF0b3Is
IHN0YXRpY1NlbnRlbmNlQnJlYWtJdGVyYXRvciwgVUJSS19TRU5URU5DRSwgc3RyaW5nLCBsZW5n
dGgpOwogfQogCi1pbnQgdGV4dEJyZWFrRmlyc3QoVGV4dEJyZWFrSXRlcmF0b3IqIGJpKQoraW50
IHRleHRCcmVha0ZpcnN0KFRleHRCcmVha0l0ZXJhdG9yKiBpdGVyYXRvcikKIHsKLSAgICAvLyBz
ZWUgdGV4dEJyZWFrTGFzdAotICAgIAotICAgIGludCBmaXJzdEN1cnNvclBvc2l0aW9uID0gLTE7
Ci0gICAgaW50IHBvcyA9IDA7Ci0gICAgd2hpbGUgKHBvcyA8PSBiaS0+bV9sZW5ndGggJiYgKGZp
cnN0Q3Vyc29yUG9zaXRpb24gPCAwKSkgewotICAgICAgICBpZiAoYmktPm1fbG9nQXR0cnNbcG9z
XS5pc19jdXJzb3JfcG9zaXRpb24pCi0gICAgICAgICAgICBmaXJzdEN1cnNvclBvc2l0aW9uID0g
cG9zOwotICAgIH0KLSAgICBiaS0+bV9pbmRleCA9IGZpcnN0Q3Vyc29yUG9zaXRpb247Ci0gICAg
cmV0dXJuIGZpcnN0Q3Vyc29yUG9zaXRpb247CisgICAgaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9y
LmZpcnN0KCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5nZXRVVEYxNklu
ZGV4KCk7CiB9CiAKLWludCB0ZXh0QnJlYWtMYXN0KFRleHRCcmVha0l0ZXJhdG9yKiBiaSkKK2lu
dCB0ZXh0QnJlYWtMYXN0KFRleHRCcmVha0l0ZXJhdG9yKiBpdGVyYXRvcikKIHsKICAgICAvLyBU
ZXh0QnJlYWtMYXN0IGlzIG5vdCBtZWFudCB0byBmaW5kIGp1c3QgYW55IGJyZWFrIGFjY29yZGlu
ZyB0byBiaS0+bV90eXBlIAogICAgIC8vIGJ1dCByZWFsbHkgdGhlIG9uZSBuZWFyIHRoZSBsYXN0
IGNoYXJhY3Rlci4KQEAgLTEzNyw4MSArMjc0LDkyIEBAIGludCB0ZXh0QnJlYWtMYXN0KFRleHRC
cmVha0l0ZXJhdG9yKiBiaSkKICAgICAvLyBPdGhlcndpc2UgcmV0dXJuIG1fbGVuZ3RoLCBhcyAi
dGhlIGZpcnN0IGNoYXJhY3RlciBiZXlvbmQgdGhlIGxhc3QiIGlzIG91dHNpZGUgb3VyIHN0cmlu
Zy4KICAgICAKICAgICBib29sIHdoaXRlU3BhY2VBdFRoZUVuZCA9IHRydWU7Ci0gICAgaW50IG5l
eHRXaGl0ZVNwYWNlUG9zID0gYmktPm1fbGVuZ3RoOwotICAgIAotICAgIGludCBwb3MgPSBiaS0+
bV9sZW5ndGg7CisgICAgaW50IG5leHRXaGl0ZVNwYWNlUG9zID0gaXRlcmF0b3ItPm1fY2hhckl0
ZXJhdG9yLmdldExlbmd0aCgpOworCisgICAgaW50IHBvcyA9IGl0ZXJhdG9yLT5tX2NoYXJJdGVy
YXRvci5sYXN0KCk7CiAgICAgd2hpbGUgKHBvcyA+PSAwICYmIHdoaXRlU3BhY2VBdFRoZUVuZCkg
ewotICAgICAgICBpZiAoYmktPm1fbG9nQXR0cnNbcG9zXS5pc19jdXJzb3JfcG9zaXRpb24pIHsK
LSAgICAgICAgICAgIGlmICh3aGl0ZVNwYWNlQXRUaGVFbmQgPSBiaS0+bV9sb2dBdHRyc1twb3Nd
LmlzX3doaXRlKQorICAgICAgICBpZiAoaXRlcmF0b3ItPm1fbG9nQXR0cnNbcG9zXS5pc19jdXJz
b3JfcG9zaXRpb24pIHsKKyAgICAgICAgICAgIGlmICh3aGl0ZVNwYWNlQXRUaGVFbmQgPSBpdGVy
YXRvci0+bV9sb2dBdHRyc1twb3NdLmlzX3doaXRlKQogICAgICAgICAgICAgICAgIG5leHRXaGl0
ZVNwYWNlUG9zID0gcG9zOwogICAgICAgICB9Ci0gICAgICAgIHBvcy0tOworICAgICAgICBwb3Mg
PSBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IucHJldmlvdXMoKTsKICAgICB9Ci0gICAgYmktPm1f
aW5kZXggPSBuZXh0V2hpdGVTcGFjZVBvczsKLSAgICByZXR1cm4gbmV4dFdoaXRlU3BhY2VQb3M7
CisgICAgaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLnNldEluZGV4KG5leHRXaGl0ZVNwYWNlUG9z
KTsKKyAgICByZXR1cm4gaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLmdldFVURjE2SW5kZXgoKTsK
IH0KIAotaW50IHRleHRCcmVha05leHQoVGV4dEJyZWFrSXRlcmF0b3IqIGJpKQoraW50IHRleHRC
cmVha05leHQoVGV4dEJyZWFrSXRlcmF0b3IqIGl0ZXJhdG9yKQogewotICAgIGZvciAoaW50IGkg
PSBiaS0+bV9pbmRleCArIDE7IGkgPD0gYmktPm1fbGVuZ3RoOyBpKyspIHsKKyAgICB3aGlsZSAo
aXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLm5leHQoKSAhPSBUZXh0QnJlYWtEb25lKSB7CisgICAg
ICAgIGludCBpbmRleCA9IGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5nZXRJbmRleCgpOwogCiAg
ICAgICAgIC8vIEZJWE1FOiBVQlJLX1dPUkQgY2FzZTogU2luZ2xlIG11bHRpYnl0ZSBjaGFyYWN0
ZXJzIChpLmUuIHdoaXRlIHNwYWNlIGFyb3VuZCB0aGVtKSwgc3VjaCBhcyB0aGUgZXVybyBzeW1i
b2wg4oKsLCAKICAgICAgICAgLy8gYXJlIG5vdCBtYXJrZWQgYXMgd29yZF9zdGFydCAmIHdvcmRf
ZW5kIGFzIG9wcG9zZWQgdG8gdGhlIHdheSBJQ1UgZG9lcyBpdC4KICAgICAgICAgLy8gVGhpcyBs
ZWFkcyB0byAtIGZvciBleGFtcGxlIC0gZGlmZmVyZW50IHdvcmQgc2VsZWN0aW9uIGJlaGF2aW91
ciB3aGVuIHJpZ2h0IGNsaWNraW5nLgogCi0gICAgICAgIGlmICgoYmktPm1fdHlwZSA9PSBVQlJL
X0xJTkUgJiYgYmktPm1fbG9nQXR0cnNbaV0uaXNfbGluZV9icmVhaykKLSAgICAgICAgICAgIHx8
IChiaS0+bV90eXBlID09IFVCUktfV09SRCAmJiAoYmktPm1fbG9nQXR0cnNbaV0uaXNfd29yZF9z
dGFydCB8fCBiaS0+bV9sb2dBdHRyc1tpXS5pc193b3JkX2VuZCkpCi0gICAgICAgICAgICB8fCAo
YmktPm1fdHlwZSA9PSBVQlJLX0NIQVJBQ1RFUiAmJiBiaS0+bV9sb2dBdHRyc1tpXS5pc19jdXJz
b3JfcG9zaXRpb24pCi0gICAgICAgICAgICB8fCAoYmktPm1fdHlwZSA9PSBVQlJLX1NFTlRFTkNF
ICYmIChiaS0+bV9sb2dBdHRyc1tpXS5pc19zZW50ZW5jZV9zdGFydCB8fCBiaS0+bV9sb2dBdHRy
c1tpXS5pc19zZW50ZW5jZV9lbmQpKSApIHsKLSAgICAgICAgICAgIGJpLT5tX2luZGV4ID0gaTsK
LSAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICBpZiAoKGl0ZXJhdG9yLT5tX3R5cGUgPT0g
VUJSS19MSU5FICYmIGl0ZXJhdG9yLT5tX2xvZ0F0dHJzW2luZGV4XS5pc19saW5lX2JyZWFrKQor
ICAgICAgICAgICAgfHwgKGl0ZXJhdG9yLT5tX3R5cGUgPT0gVUJSS19XT1JEICYmIChpdGVyYXRv
ci0+bV9sb2dBdHRyc1tpbmRleF0uaXNfd29yZF9zdGFydCB8fCBpdGVyYXRvci0+bV9sb2dBdHRy
c1tpbmRleF0uaXNfd29yZF9lbmQpKQorICAgICAgICAgICAgfHwgKGl0ZXJhdG9yLT5tX3R5cGUg
PT0gVUJSS19DSEFSQUNURVIgJiYgaXRlcmF0b3ItPm1fbG9nQXR0cnNbaW5kZXhdLmlzX2N1cnNv
cl9wb3NpdGlvbikKKyAgICAgICAgICAgIHx8IChpdGVyYXRvci0+bV90eXBlID09IFVCUktfU0VO
VEVOQ0UgJiYgKGl0ZXJhdG9yLT5tX2xvZ0F0dHJzW2luZGV4XS5pc19zZW50ZW5jZV9zdGFydCB8
fCBpdGVyYXRvci0+bV9sb2dBdHRyc1tpbmRleF0uaXNfc2VudGVuY2VfZW5kKSkgKSB7CisgICAg
ICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gVGV4dEJyZWFrRG9u
ZTsKKyAgICByZXR1cm4gaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLmdldFVURjE2SW5kZXgoKTsK
IH0KIAotaW50IHRleHRCcmVha1ByZXZpb3VzKFRleHRCcmVha0l0ZXJhdG9yKiBiaSkKK2ludCB0
ZXh0QnJlYWtQcmV2aW91cyhUZXh0QnJlYWtJdGVyYXRvciogaXRlcmF0b3IpCiB7Ci0gICAgZm9y
IChpbnQgaSA9IGJpLT5tX2luZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgaWYgKChi
aS0+bV90eXBlID09IFVCUktfTElORSAmJiBiaS0+bV9sb2dBdHRyc1tpXS5pc19saW5lX2JyZWFr
KQotICAgICAgICAgICAgfHwgKGJpLT5tX3R5cGUgPT0gVUJSS19XT1JEICYmIChiaS0+bV9sb2dB
dHRyc1tpXS5pc193b3JkX3N0YXJ0IHx8IGJpLT5tX2xvZ0F0dHJzW2ldLmlzX3dvcmRfZW5kKSkK
LSAgICAgICAgICAgIHx8IChiaS0+bV90eXBlID09IFVCUktfQ0hBUkFDVEVSICYmIGJpLT5tX2xv
Z0F0dHJzW2ldLmlzX2N1cnNvcl9wb3NpdGlvbikKLSAgICAgICAgICAgIHx8IChiaS0+bV90eXBl
ID09IFVCUktfU0VOVEVOQ0UgJiYgKGJpLT5tX2xvZ0F0dHJzW2ldLmlzX3NlbnRlbmNlX3N0YXJ0
IHx8IGJpLT5tX2xvZ0F0dHJzW2ldLmlzX3NlbnRlbmNlX2VuZCkpICkgewotICAgICAgICAgICAg
YmktPm1faW5kZXggPSBpOwotICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgd2hpbGUgKGl0ZXJh
dG9yLT5tX2NoYXJJdGVyYXRvci5wcmV2aW91cygpICE9IFRleHRCcmVha0RvbmUpIHsKKyAgICAg
ICAgaW50IGluZGV4ID0gaXRlcmF0b3ItPm1fY2hhckl0ZXJhdG9yLmdldEluZGV4KCk7CisKKyAg
ICAgICAgaWYgKChpdGVyYXRvci0+bV90eXBlID09IFVCUktfTElORSAmJiBpdGVyYXRvci0+bV9s
b2dBdHRyc1tpbmRleF0uaXNfbGluZV9icmVhaykKKyAgICAgICAgICAgIHx8IChpdGVyYXRvci0+
bV90eXBlID09IFVCUktfV09SRCAmJiAoaXRlcmF0b3ItPm1fbG9nQXR0cnNbaW5kZXhdLmlzX3dv
cmRfc3RhcnQgfHwgaXRlcmF0b3ItPm1fbG9nQXR0cnNbaW5kZXhdLmlzX3dvcmRfZW5kKSkKKyAg
ICAgICAgICAgIHx8IChpdGVyYXRvci0+bV90eXBlID09IFVCUktfQ0hBUkFDVEVSICYmIGl0ZXJh
dG9yLT5tX2xvZ0F0dHJzW2luZGV4XS5pc19jdXJzb3JfcG9zaXRpb24pCisgICAgICAgICAgICB8
fCAoaXRlcmF0b3ItPm1fdHlwZSA9PSBVQlJLX1NFTlRFTkNFICYmIChpdGVyYXRvci0+bV9sb2dB
dHRyc1tpbmRleF0uaXNfc2VudGVuY2Vfc3RhcnQgfHwgaXRlcmF0b3ItPm1fbG9nQXR0cnNbaW5k
ZXhdLmlzX3NlbnRlbmNlX2VuZCkpICkgeworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0K
ICAgICB9Ci0gICAgcmV0dXJuIHRleHRCcmVha0ZpcnN0KGJpKTsKKyAgICByZXR1cm4gaXRlcmF0
b3ItPm1fY2hhckl0ZXJhdG9yLmdldFVURjE2SW5kZXgoKTsKIH0KIAotaW50IHRleHRCcmVha1By
ZWNlZGluZyhUZXh0QnJlYWtJdGVyYXRvciogYmksIGludCBwb3MpCitpbnQgdGV4dEJyZWFrUHJl
Y2VkaW5nKFRleHRCcmVha0l0ZXJhdG9yKiBpdGVyYXRvciwgaW50IG9mZnNldCkKIHsKLSAgICBi
aS0+bV9pbmRleCA9IHBvczsKLSAgICByZXR1cm4gdGV4dEJyZWFrUHJldmlvdXMoYmkpOworICAg
IGlmIChvZmZzZXQgPiBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0VVRGMTZMZW5ndGgoKSkK
KyAgICAgICAgcmV0dXJuIFRleHRCcmVha0RvbmU7CisgICAgaWYgKG9mZnNldCA8IDApCisgICAg
ICAgIHJldHVybiAwOworICAgIGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5zZXRVVEYxNkluZGV4
KG9mZnNldCk7CisgICAgcmV0dXJuIHRleHRCcmVha1ByZXZpb3VzKGl0ZXJhdG9yKTsKIH0KIAot
aW50IHRleHRCcmVha0ZvbGxvd2luZyhUZXh0QnJlYWtJdGVyYXRvciogYmksIGludCBwb3MpCitp
bnQgdGV4dEJyZWFrRm9sbG93aW5nKFRleHRCcmVha0l0ZXJhdG9yKiBpdGVyYXRvciwgaW50IG9m
ZnNldCkKIHsKLSAgICBpZiAocG9zIDwgMCkKLSAgICAgICAgcG9zID0gLTE7Ci0gICAgYmktPm1f
aW5kZXggPSBwb3M7Ci0gICAgcmV0dXJuIHRleHRCcmVha05leHQoYmkpOworICAgIGlmIChvZmZz
ZXQgPiBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0VVRGMTZMZW5ndGgoKSkKKyAgICAgICAg
cmV0dXJuIFRleHRCcmVha0RvbmU7CisgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgIHJldHVy
biAwOworICAgIGl0ZXJhdG9yLT5tX2NoYXJJdGVyYXRvci5zZXRVVEYxNkluZGV4KG9mZnNldCk7
CisgICAgcmV0dXJuIHRleHRCcmVha05leHQoaXRlcmF0b3IpOwogfQogCi1pbnQgdGV4dEJyZWFr
Q3VycmVudChUZXh0QnJlYWtJdGVyYXRvciogYmkpCitpbnQgdGV4dEJyZWFrQ3VycmVudChUZXh0
QnJlYWtJdGVyYXRvciogaXRlcmF0b3IpCiB7Ci0gICAgcmV0dXJuIGJpLT5tX2luZGV4OworICAg
IHJldHVybiBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0VVRGMTZJbmRleCgpOwogfQogCi1i
b29sIGlzVGV4dEJyZWFrKFRleHRCcmVha0l0ZXJhdG9yKiBiaSwgaW50IHBvcykKK2Jvb2wgaXNU
ZXh0QnJlYWsoVGV4dEJyZWFrSXRlcmF0b3IqIGl0ZXJhdG9yLCBpbnQgb2Zmc2V0KQogewotICAg
IGlmIChiaS0+bV9pbmRleCA8IDApCisgICAgaWYgKCFvZmZzZXQpCisgICAgICAgIHJldHVybiB0
cnVlOworICAgIGlmIChvZmZzZXQgPiBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0VVRGMTZM
ZW5ndGgoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgcmV0dXJuICgoYmktPm1fdHlw
ZSA9PSBVQlJLX0xJTkUgJiYgYmktPm1fbG9nQXR0cnNbYmktPm1faW5kZXhdLmlzX2xpbmVfYnJl
YWspCi0gICAgICAgIHx8IChiaS0+bV90eXBlID09IFVCUktfV09SRCAmJiBiaS0+bV9sb2dBdHRy
c1tiaS0+bV9pbmRleF0uaXNfd29yZF9lbmQpCi0gICAgICAgIHx8IChiaS0+bV90eXBlID09IFVC
UktfQ0hBUkFDVEVSICYmIGJpLT5tX2xvZ0F0dHJzW2JpLT5tX2luZGV4XS5pc19jaGFyX2JyZWFr
KQotICAgICAgICB8fCAoYmktPm1fdHlwZSA9PSBVQlJLX1NFTlRFTkNFICYmIGJpLT5tX2xvZ0F0
dHJzW2JpLT5tX2luZGV4XS5pc19zZW50ZW5jZV9lbmQpICk7CisgICAgaXRlcmF0b3ItPm1fY2hh
ckl0ZXJhdG9yLnNldFVURjE2SW5kZXgob2Zmc2V0KTsKKworICAgIGludCBpbmRleCA9IGl0ZXJh
dG9yLT5tX2NoYXJJdGVyYXRvci5nZXRJbmRleCgpOworICAgIGl0ZXJhdG9yLT5tX2NoYXJJdGVy
YXRvci5wcmV2aW91cygpOworICAgIHRleHRCcmVha05leHQoaXRlcmF0b3IpOworICAgIHJldHVy
biBpdGVyYXRvci0+bV9jaGFySXRlcmF0b3IuZ2V0SW5kZXgoKSA9PSBpbmRleDsKIH0KIAogfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>