<?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>41427</bug_id>
          
          <creation_ts>2010-06-30 14:03:29 -0700</creation_ts>
          <short_desc>Add expat based XMLDocumentParser</short_desc>
          <delta_ts>2010-07-27 15:13:18 -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>XML</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>WONTFIX</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>43085</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Patrick R. Gansterer">paroga</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>ap</cc>
    
    <cc>darin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>244922</commentid>
    <comment_count>0</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-06-30 14:03:29 -0700</bug_when>
    <thetext>see patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244923</commentid>
    <comment_count>1</comment_count>
      <attachid>60147</attachid>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-06-30 14:04:13 -0700</bug_when>
    <thetext>Created attachment 60147
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>244926</commentid>
    <comment_count>2</comment_count>
      <attachid>60147</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-06-30 14:06:50 -0700</bug_when>
    <thetext>Comment on attachment 60147
Patch

Why?

We really don’t want a third one of these!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>245143</commentid>
    <comment_count>3</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-07-01 00:00:15 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 60147 [details])
&gt; Why?
The main reason was that I had problems to get libxml working.

When you look at the libxml parser you have many toString() calls, which do UTF-8 decoding. This isn&apos;t necessary with expat, because it can return UTF-16 strings directly.

I din&apos;t had the time to do performance tests, but expat is usually a little faster than libxml.

&gt; We really don’t want a third one of these!
Then you won&apos;t accecpt a MSXML implementation too? (will save memory when using the windows system library)
What do you think about a &quot;native WebKit XMLParser&quot; with no 3rdparty dependency?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>245473</commentid>
    <comment_count>4</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-07-01 12:18:21 -0700</bug_when>
    <thetext>A native XML engine would be good in that it would allow for a much more efficient and compliant XSLT implementation, as well as sharing code with XPath. But it would take a lot of resources to write and maintain.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>254836</commentid>
    <comment_count>5</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-07-22 08:59:40 -0700</bug_when>
    <thetext>Some performance data*:

            libxml2        expat     percent
 5MB SVG:  0.7183sec     0.5356sec    -25%
10MB SVG:  1.6084sec     1.2298sec    -24%
20MB SVG:  5.4084sec     4.6952sec    -13%

* time from begin of first XMLDocumentParser::doWrite until end of XMLDocumentParser::doEnd, average of 3 measurements</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>254865</commentid>
    <comment_count>6</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-07-22 10:14:32 -0700</bug_when>
    <thetext>A port that does not use libxml2 has no practical way to implement XSLT, is that correct?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>254867</commentid>
    <comment_count>7</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-07-22 10:19:26 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; A port that does not use libxml2 has no practical way to implement XSLT, is that correct?
Yes that is correct, libxlst needs libxml2. I don&apos;t think that expat is a real option for &quot;fat clients&quot; but as an alternative without XLST support (on small devices).
The table in comment #5 shows that there is much room for improvements in the XML parser.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256574</commentid>
    <comment_count>8</comment_count>
      <attachid>60147</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-07-27 07:34:04 -0700</bug_when>
    <thetext>Comment on attachment 60147
Patch

I really don&apos;t like the idea of adding a third (!) XML parser.  It&apos;s bad enough that we have three.  If we can improve perf by switching our XML parser, that&apos;s great, but we should kill the old one.  IMHO, adding the second XML parser was a mistake too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256879</commentid>
    <comment_count>9</comment_count>
    <who name="Patrick R. Gansterer">paroga</who>
    <bug_when>2010-07-27 15:12:25 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 60147 [details])
&gt; I really don&apos;t like the idea of adding a third (!) XML parser.  It&apos;s bad enough that we have three.  If we can improve perf by switching our XML parser, that&apos;s great, but we should kill the old one.  IMHO, adding the second XML parser was a mistake too.
I agree with you 100%. My expat version was mainly a quick hack to show the possible speed increase of the XMLParser. It can&apos;t be a full replacement beacause of the missing xlst support :-(.
I&apos;ve created a new bug for this issue at bug 43085.
I think there is no way around to implement a full native WebKit XMLParser?</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>60147</attachid>
            <date>2010-06-30 14:04:13 -0700</date>
            <delta_ts>2010-07-27 07:34:04 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-41427.patch</filename>
            <type>text/plain</type>
            <size>33328</size>
            <attacher name="Patrick R. Gansterer">paroga</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29yZS9DaGFuZ2VM
b2cJKHJldmlzaW9uIDYyMTk4KQ0KKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkp
DQpAQCAtMSwzICsxLDY3IEBADQorMjAxMC0wNi0zMCAgUGF0cmljayBHYW5zdGVyZXIgIDxwYXJv
Z2FAcGFyb2dhLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBBZGQgZXhwYXQgYmFzZWQgWE1MRG9jdW1lbnRQYXJzZXIuCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MTQyNworCisgICAgICAgICogZG9t
L1hNTERvY3VtZW50UGFyc2VyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlhNTERvY3VtZW50UGFy
c2VyOjplbnRlclRleHQpOgorICAgICAgICAoV2ViQ29yZTo6WE1MRG9jdW1lbnRQYXJzZXI6OmV4
aXRUZXh0KToKKyAgICAgICAgKiBkb20vWE1MRG9jdW1lbnRQYXJzZXIuaDoKKyAgICAgICAgKFdl
YkNvcmU6OlhNTERvY3VtZW50UGFyc2VyOjpoYXNFcnJvcik6CisgICAgICAgICogZG9tL1hNTERv
Y3VtZW50UGFyc2VyRXhwYXQuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlBlbmRpbmdD
YWxsYmFja3M6OmFwcGVuZFN0YXJ0RWxlbWVudENhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6
OlBlbmRpbmdDYWxsYmFja3M6OmFwcGVuZEVuZEVsZW1lbnRDYWxsYmFjayk6CisgICAgICAgIChX
ZWJDb3JlOjpQZW5kaW5nQ2FsbGJhY2tzOjphcHBlbmRDaGFyYWN0ZXJEYXRhQ2FsbGJhY2spOgor
ICAgICAgICAoV2ViQ29yZTo6UGVuZGluZ0NhbGxiYWNrczo6YXBwZW5kUHJvY2Vzc2luZ0luc3Ry
dWN0aW9uQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6UGVuZGluZ0NhbGxiYWNrczo6YXBw
ZW5kQ29tbWVudENhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlBlbmRpbmdDYWxsYmFja3M6
OmFwcGVuZFN0YXJ0Q2RhdGFTZWN0aW9uQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6UGVu
ZGluZ0NhbGxiYWNrczo6YXBwZW5kRW5kQ2RhdGFTZWN0aW9uQ2FsbGJhY2spOgorICAgICAgICAo
V2ViQ29yZTo6UGVuZGluZ0NhbGxiYWNrczo6YXBwZW5kU3RhcnROYW1lc3BhY2VEZWNsQ2FsbGJh
Y2spOgorICAgICAgICAoV2ViQ29yZTo6UGVuZGluZ0NhbGxiYWNrczo6YXBwZW5kRW5kTmFtZXNw
YWNlRGVjbENhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlBlbmRpbmdDYWxsYmFja3M6OlBl
bmRpbmdTdGFydEVsZW1lbnRDYWxsYmFjazo6flBlbmRpbmdTdGFydEVsZW1lbnRDYWxsYmFjayk6
CisgICAgICAgIChXZWJDb3JlOjpQZW5kaW5nQ2FsbGJhY2tzOjpQZW5kaW5nU3RhcnRFbGVtZW50
Q2FsbGJhY2s6OmNhbGwpOgorICAgICAgICAoV2ViQ29yZTo6UGVuZGluZ0NhbGxiYWNrczo6UGVu
ZGluZ0VuZEVsZW1lbnRDYWxsYmFjazo6Y2FsbCk6CisgICAgICAgIChXZWJDb3JlOjpQZW5kaW5n
Q2FsbGJhY2tzOjpQZW5kaW5nQ2hhcmFjdGVyRGF0YUNhbGxiYWNrOjpjYWxsKToKKyAgICAgICAg
KFdlYkNvcmU6OlBlbmRpbmdDYWxsYmFja3M6OlBlbmRpbmdDb21tZW50Q2FsbGJhY2s6OmNhbGwp
OgorICAgICAgICAoV2ViQ29yZTo6UGVuZGluZ0NhbGxiYWNrczo6UGVuZGluZ1N0YXJ0Q2RhdGFT
ZWN0aW9uQ2FsbGJhY2s6OmNhbGwpOgorICAgICAgICAoV2ViQ29yZTo6UGVuZGluZ0NhbGxiYWNr
czo6UGVuZGluZ0VuZENkYXRhU2VjdGlvbkNhbGxiYWNrOjpjYWxsKToKKyAgICAgICAgKFdlYkNv
cmU6OlBlbmRpbmdDYWxsYmFja3M6OlBlbmRpbmdTdGFydE5hbWVzcGFjZURlY2xDYWxsYmFjazo6
Y2FsbCk6CisgICAgICAgIChXZWJDb3JlOjpQZW5kaW5nQ2FsbGJhY2tzOjpQZW5kaW5nRW5kTmFt
ZXNwYWNlRGVjbENhbGxiYWNrOjpjYWxsKToKKyAgICAgICAgKFdlYkNvcmU6OmdldFBhcnNlcik6
CisgICAgICAgIChXZWJDb3JlOjpzdGFydEVsZW1lbnRIYW5kbGVyKToKKyAgICAgICAgKFdlYkNv
cmU6OmVuZEVsZW1lbnRIYW5kbGVyKToKKyAgICAgICAgKFdlYkNvcmU6OmNoYXJhY3RlckRhdGFI
YW5kbGVyKToKKyAgICAgICAgKFdlYkNvcmU6OnByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIp
OgorICAgICAgICAoV2ViQ29yZTo6Y29tbWVudEhhbmRsZXIpOgorICAgICAgICAoV2ViQ29yZTo6
c3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyKToKKyAgICAgICAgKFdlYkNvcmU6OmVuZENkYXRhU2Vj
dGlvbkhhbmRsZXIpOgorICAgICAgICAoV2ViQ29yZTo6c3RhcnROYW1lc3BhY2VEZWNsSGFuZGxl
cik6CisgICAgICAgIChXZWJDb3JlOjplbmROYW1lc3BhY2VEZWNsSGFuZGxlcik6CisgICAgICAg
IChXZWJDb3JlOjpub3RTdGFuZGFsb25lSGFuZGxlcik6CisgICAgICAgIChXZWJDb3JlOjpYTUxE
b2N1bWVudFBhcnNlcjo6WE1MRG9jdW1lbnRQYXJzZXIpOgorICAgICAgICAoV2ViQ29yZTo6WE1M
RG9jdW1lbnRQYXJzZXI6On5YTUxEb2N1bWVudFBhcnNlcik6CisgICAgICAgIChXZWJDb3JlOjpY
TUxEb2N1bWVudFBhcnNlcjo6aW5pdFBhcnNlcik6CisgICAgICAgIChXZWJDb3JlOjpYTUxEb2N1
bWVudFBhcnNlcjo6ZG9Xcml0ZSk6CisgICAgICAgIChXZWJDb3JlOjpYTUxEb2N1bWVudFBhcnNl
cjo6ZG9FbmQpOgorICAgICAgICAoV2ViQ29yZTo6WE1MRG9jdW1lbnRQYXJzZXI6OnN0YXJ0RWxl
bWVudCk6CisgICAgICAgIChXZWJDb3JlOjpYTUxEb2N1bWVudFBhcnNlcjo6ZW5kRWxlbWVudCk6
CisgICAgICAgIChXZWJDb3JlOjpYTUxEb2N1bWVudFBhcnNlcjo6Y2hhcmFjdGVyRGF0YSk6Cisg
ICAgICAgIChXZWJDb3JlOjpYTUxEb2N1bWVudFBhcnNlcjo6cHJvY2Vzc2luZ0luc3RydWN0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OlhNTERvY3VtZW50UGFyc2VyOjpjb21tZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OlhNTERvY3VtZW50UGFyc2VyOjpzdGFydENkYXRhU2VjdGlvbik6CisgICAg
ICAgIChXZWJDb3JlOjpYTUxEb2N1bWVudFBhcnNlcjo6ZW5kQ2RhdGFTZWN0aW9uKToKKyAgICAg
ICAgKFdlYkNvcmU6OlhNTERvY3VtZW50UGFyc2VyOjpzdGFydE5hbWVzcGFjZURlY2wpOgorICAg
ICAgICAoV2ViQ29yZTo6WE1MRG9jdW1lbnRQYXJzZXI6OmVuZE5hbWVzcGFjZURlY2wpOgorICAg
ICAgICAoV2ViQ29yZTo6WE1MRG9jdW1lbnRQYXJzZXI6Om5vdFN0YW5kYWxvbmUpOgorICAgICAg
ICAoV2ViQ29yZTo6WE1MRG9jdW1lbnRQYXJzZXI6OmxpbmVOdW1iZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6WE1MRG9jdW1lbnRQYXJzZXI6OmNvbHVtbk51bWJlcik6CisgICAgICAgIChXZWJDb3Jl
OjpYTUxEb2N1bWVudFBhcnNlcjo6c3RvcFBhcnNpbmcpOgorICAgICAgICAoV2ViQ29yZTo6WE1M
RG9jdW1lbnRQYXJzZXI6OnBhcnNlRG9jdW1lbnRGcmFnbWVudCk6CisgICAgICAgIChXZWJDb3Jl
OjphdHRyaWJ1dGVzU3RhcnRFbGVtZW50SGFuZGxlcik6CisgICAgICAgIChXZWJDb3JlOjpwYXJz
ZUF0dHJpYnV0ZXMpOgorCiAyMDEwLTA2LTMwICBYYW4gTG9wZXogIDx4bG9wZXpAaWdhbGlhLmNv
bT4KIAogICAgICAgICBSZXZpZXdlZCBieSBHdXN0YXZvIE5vcm9uaGEuCkluZGV4OiBXZWJDb3Jl
L2RvbS9YTUxEb2N1bWVudFBhcnNlci5jcHANCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJDb3JlL2RvbS9Y
TUxEb2N1bWVudFBhcnNlci5jcHAJKHJldmlzaW9uIDYyMTg0KQ0KKysrIFdlYkNvcmUvZG9tL1hN
TERvY3VtZW50UGFyc2VyLmNwcAkod29ya2luZyBjb3B5KQ0KQEAgLTYsNiArNiw3IEBADQogICog
Q29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFy
eSgtaWVzKQogICogQ29weXJpZ2h0IChDKSAyMDA4IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVy
CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggVG9yY2ggTW9iaWxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4gKGh0dHA6Ly93d3cudG9yY2htb2JpbGUuY29tLykKKyAqIENvcHlyaWdodCAoQykgMjAx
MCBQYXRyaWNrIEdhbnN0ZXJlciAocGFyb2dhQHBhcm9nYS5jb20pCiAgKgogICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKQEAgLTE3NSwxNCArMTc2LDIyIEBADQogI2lmICFVU0UoUVhNTFNUUkVBTSkKICAgICBBU1NF
UlQobV9idWZmZXJlZFRleHQuc2l6ZSgpID09IDApOwogI2VuZGlmCi0gICAgUmVmUHRyPE5vZGU+
IG5ld05vZGUgPSBUZXh0OjpjcmVhdGUoZG9jdW1lbnQoKSwgIiIpOworCisgICAgUmVmUHRyPE5v
ZGU+IG5ld05vZGU7CisKKyNpZiBVU0UoRVhQQVQpCisgICAgaWYgKG1faXNQYXJzaW5nQ2RhdGFT
ZWN0aW9uKQorICAgICAgICBuZXdOb2RlID0gQ0RBVEFTZWN0aW9uOjpjcmVhdGUoZG9jdW1lbnQo
KSwgIiIpOworI2VuZGlmCisgICAgICAgIG5ld05vZGUgPSBUZXh0OjpjcmVhdGUoZG9jdW1lbnQo
KSwgIiIpOworCiAgICAgaWYgKCFtX2N1cnJlbnROb2RlLT5sZWdhY3lQYXJzZXJBZGRDaGlsZChu
ZXdOb2RlLmdldCgpKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIHB1c2hDdXJyZW50Tm9k
ZShuZXdOb2RlLmdldCgpKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotI2lmICFVU0UoUVhNTFNU
UkVBTSkKKyNpZiAhVVNFKFFYTUxTVFJFQU0pICYmICFVU0UoRVhQQVQpCiBzdGF0aWMgaW5saW5l
IFN0cmluZyB0b1N0cmluZyhjb25zdCB4bWxDaGFyKiBzdHIsIHVuc2lnbmVkIGxlbikKIHsKICAg
ICByZXR1cm4gVVRGOEVuY29kaW5nKCkuZGVjb2RlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hh
cio+KHN0ciksIGxlbik7CkBAIC0yMDAsOCArMjA5LDEzIEBADQogCiAjaWYgIVVTRShRWE1MU1RS
RUFNKQogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworI2lmIFVTRShFWFBBVCkKKyAgICBzdGF0
aWNfY2FzdDxUZXh0Kj4obV9jdXJyZW50Tm9kZSktPmFwcGVuZERhdGEobV9idWZmZXJlZFRleHQs
IGVjKTsKKyAgICBTdHJpbmcgZW1wdHk7CisjZWxzZQogICAgIHN0YXRpY19jYXN0PFRleHQqPiht
X2N1cnJlbnROb2RlKS0+YXBwZW5kRGF0YSh0b1N0cmluZyhtX2J1ZmZlcmVkVGV4dC5kYXRhKCks
IG1fYnVmZmVyZWRUZXh0LnNpemUoKSksIGVjKTsKICAgICBWZWN0b3I8eG1sQ2hhcj4gZW1wdHk7
CisjZW5kaWYKICAgICBtX2J1ZmZlcmVkVGV4dC5zd2FwKGVtcHR5KTsKICNlbmRpZgogCkluZGV4
OiBXZWJDb3JlL2RvbS9YTUxEb2N1bWVudFBhcnNlci5oDQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gV2ViQ29y
ZS9kb20vWE1MRG9jdW1lbnRQYXJzZXIuaAkocmV2aXNpb24gNjIxODQpDQorKysgV2ViQ29yZS9k
b20vWE1MRG9jdW1lbnRQYXJzZXIuaAkod29ya2luZyBjb3B5KQ0KQEAgLTQsNiArNCw3IEBADQog
ICogQ29weXJpZ2h0IChDKSAyMDA3IFNhbXVlbCBXZWluaWcgKHNhbUB3ZWJraXQub3JnKQogICog
Q29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFy
eSgtaWVzKQogICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgUGF0cmljayBHYW5zdGVyZXIgKHBhcm9nYUBwYXJvZ2EuY29tKQogICoK
ICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCkBAIC0zNiw2ICszNyw4IEBADQogCiAjaWYgVVNFKFFYTUxTVFJFQU0p
CiAjaW5jbHVkZSA8cXhtbHN0cmVhbS5oPgorI2VsaWYgVVNFKEVYUEFUKQorI2luY2x1ZGUgImV4
cGF0LmgiCiAjZWxzZQogI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CiAjaW5jbHVkZSA8bGlieG1s
L3htbHN0cmluZy5oPgpAQCAtNTMsNyArNTYsNyBAQA0KICAgICBjbGFzcyBQZW5kaW5nQ2FsbGJh
Y2tzOwogICAgIGNsYXNzIFNjcmlwdEVsZW1lbnQ7CiAKLSNpZiAhVVNFKFFYTUxTVFJFQU0pCisj
aWYgIVVTRShRWE1MU1RSRUFNKSAmJiAhVVNFKEVYUEFUKQogICAgIGNsYXNzIFhNTFBhcnNlckNv
bnRleHQgOiBwdWJsaWMgUmVmQ291bnRlZDxYTUxQYXJzZXJDb250ZXh0PiB7CiAgICAgcHVibGlj
OgogICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxYTUxQYXJzZXJDb250ZXh0PiBjcmVhdGVNZW1v
cnlQYXJzZXIoeG1sU0FYSGFuZGxlclB0ciwgdm9pZCosIGNvbnN0IGNoYXIqKTsKQEAgLTEyNSw2
ICsxMjgsMjAgQEANCiAgICAgICAgIHZvaWQgZW5kRG9jdW1lbnQoKTsKICAgICAgICAgdm9pZCBw
YXJzZUR0ZCgpOwogICAgICAgICBib29sIGhhc0Vycm9yKCkgY29uc3Q7CisjZWxpZiBVU0UoRVhQ
QVQpCisgICAgICAgIHZvaWQgaW5pdFBhcnNlcigpOworcHVibGljOgorICAgICAgICB2b2lkIHN0
YXJ0RWxlbWVudChjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFhNTF9DaGFyKmNvbnN0KiBhdHRy
aWJ1dGVzKTsKKyAgICAgICAgdm9pZCBlbmRFbGVtZW50KCk7CisgICAgICAgIHZvaWQgY2hhcmFj
dGVyRGF0YShjb25zdCBTdHJpbmcmIGRhdGEpOworICAgICAgICB2b2lkIHByb2Nlc3NpbmdJbnN0
cnVjdGlvbihjb25zdCBTdHJpbmcmIHRhcmdldCwgY29uc3QgU3RyaW5nJiBkYXRhKTsKKyAgICAg
ICAgdm9pZCBjb21tZW50KGNvbnN0IFN0cmluZyYgZGF0YSk7CisgICAgICAgIHZvaWQgc3RhcnRD
ZGF0YVNlY3Rpb24oKTsKKyAgICAgICAgdm9pZCBlbmRDZGF0YVNlY3Rpb24oKTsKKyAgICAgICAg
dm9pZCBzdGFydE5hbWVzcGFjZURlY2woY29uc3QgU3RyaW5nJiBwcmVmaXgsIGNvbnN0IFN0cmlu
ZyYgdXJpKTsKKyAgICAgICAgdm9pZCBlbmROYW1lc3BhY2VEZWNsKGNvbnN0IFN0cmluZyYgcHJl
Zml4KTsKKyAgICAgICAgaW50IG5vdFN0YW5kYWxvbmUoKTsKKyAgICAgICAgYm9vbCBoYXNFcnJv
cigpIGNvbnN0IHsgcmV0dXJuIG1fZXJyb3JDb3VudCA+IDA7IH0KICNlbHNlCiBwdWJsaWM6CiAg
ICAgICAgIC8vIGNhbGxiYWNrcyBmcm9tIHBhcnNlciBTQVgKQEAgLTE2Miw2ICsxNzksMTMgQEAN
CiAjaWYgVVNFKFFYTUxTVFJFQU0pCiAgICAgICAgIFFYbWxTdHJlYW1SZWFkZXIgbV9zdHJlYW07
CiAgICAgICAgIGJvb2wgbV93cm90ZVRleHQ7CisjZWxpZiBVU0UoRVhQQVQpCisgICAgICAgIFhN
TF9QYXJzZXIgbV9wYXJzZXI7CisgICAgICAgIE93blB0cjxQZW5kaW5nQ2FsbGJhY2tzPiBtX3Bl
bmRpbmdDYWxsYmFja3M7CisgICAgICAgIFN0cmluZyBtX2J1ZmZlcmVkVGV4dDsKKyAgICAgICAg
dHlwZWRlZiBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBOYW1lc3BhY2VUb1ByZWZpeE1hcDsKKyAg
ICAgICAgTmFtZXNwYWNlVG9QcmVmaXhNYXAgbV9uYW1lc3BhY2VUb1ByZWZpeE1hcDsKKyAgICAg
ICAgYm9vbCBtX2lzUGFyc2luZ0NkYXRhU2VjdGlvbjsKICNlbHNlCiAgICAgICAgIHhtbFBhcnNl
ckN0eHRQdHIgY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGV4dCA/IG1fY29udGV4dC0+
Y29udGV4dCgpIDogMDsgfTsKICAgICAgICAgUmVmUHRyPFhNTFBhcnNlckNvbnRleHQ+IG1fY29u
dGV4dDsKSW5kZXg6IFdlYkNvcmUvZG9tL1hNTERvY3VtZW50UGFyc2VyRXhwYXQuY3BwDQo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09DQotLS0gV2ViQ29yZS9kb20vWE1MRG9jdW1lbnRQYXJzZXJFeHBhdC5jcHAJKHJldmlz
aW9uIDApDQorKysgV2ViQ29yZS9kb20vWE1MRG9jdW1lbnRQYXJzZXJFeHBhdC5jcHAJKHJldmlz
aW9uIDApDQpAQCAtMCwwICsxLDg0NSBAQA0KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgUGV0
ZXIgS2VsbHkgKHBta0Bwb3N0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiwgMjAw
OCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYg
QWxleGV5IFByb3NrdXJ5YWtvdiAoYXBAd2Via2l0Lm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAw
NyBTYW11ZWwgV2VpbmlnIChzYW1Ad2Via2l0Lm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwOCBO
b2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqIENvcHlyaWdo
dCAoQykgMjAwOCBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICogQ29weXJpZ2h0IChDKSAy
MDA4LCAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8v
d3d3LnRvcmNobW9iaWxlLmNvbS8pCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUGF0cmljayBHYW5z
dGVyZXIgKHBhcm9nYUBwYXJvZ2EuY29tKQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAq
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZ
SU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1B
IDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
WE1MRG9jdW1lbnRQYXJzZXIuaCIKKworI2luY2x1ZGUgIkNhY2hlZFNjcmlwdC5oIgorI2luY2x1
ZGUgIkNvbW1lbnQuaCIKKyNpbmNsdWRlICJEb2NMb2FkZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVu
dC5oIgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgor
I2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVk
ZSAiUHJvY2Vzc2luZ0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAiU2NyaXB0RWxlbWVudC5oIgor
I2luY2x1ZGUgIlNjcmlwdFNvdXJjZUNvZGUuaCIKKyNpbmNsdWRlICJUZXh0UmVzb3VyY2VEZWNv
ZGVyLmgiCisjaW5jbHVkZSAiWE1MTlNOYW1lcy5oIgorI2luY2x1ZGUgPHd0Zi9VbnVzZWRQYXJh
bS5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworI2lmIEVOQUJMRShYSFRNTE1QKQorI2lu
Y2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhUTUxTY3JpcHRFbGVtZW50LmgiCisjZW5k
aWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3QgVUNoYXIgbmFtZXNwYWNl
U2VwYXJhdG9yID0gJ1wwMDEnOworCitDT01QSUxFX0FTU0VSVChzaXplb2YoWE1MX0NoYXIpID09
IHNpemVvZihVQ2hhciksIHhtbF9jaGFyX2FuZF91Y2hhcl9tdXN0X2JlX3NhbWVfc2l6ZSk7CisK
K2NsYXNzIFBlbmRpbmdDYWxsYmFja3MgOiBwdWJsaWMgTm9uY29weWFibGUgeworcHVibGljOgor
ICAgIH5QZW5kaW5nQ2FsbGJhY2tzKCkKKyAgICB7CisgICAgICAgIGRlbGV0ZUFsbFZhbHVlcyht
X2NhbGxiYWNrcyk7CisgICAgfQorCisgICAgdm9pZCBhcHBlbmRTdGFydEVsZW1lbnRDYWxsYmFj
ayhjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFhNTF9DaGFyKmNvbnN0KiBhdHRyaWJ1dGVzKQor
ICAgIHsKKyAgICAgICAgUGVuZGluZ1N0YXJ0RWxlbWVudENhbGxiYWNrKiBjYWxsYmFjayA9IG5l
dyBQZW5kaW5nU3RhcnRFbGVtZW50Q2FsbGJhY2s7CisKKyAgICAgICAgY2FsbGJhY2stPm5hbWUg
PSBuYW1lOworCisgICAgICAgIGZvciAoOyAqYXR0cmlidXRlczsgKythdHRyaWJ1dGVzKSB7Cisg
ICAgICAgICAgICBzaXplX3QgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIHdoaWxlICgoKmF0dHJp
YnV0ZXMpW2xlbmd0aF0pCisgICAgICAgICAgICAgICAgKytsZW5ndGg7CisKKyAgICAgICAgICAg
IFhNTF9DaGFyKiBuZXdBdHRyaWJ1dGUgPSBuZXcgWE1MX0NoYXJbbGVuZ3RoICsgMV07CisgICAg
ICAgICAgICBtZW1jcHkobmV3QXR0cmlidXRlLCAqYXR0cmlidXRlcywgbGVuZ3RoICsgMSk7Cisg
ICAgICAgICAgICBjYWxsYmFjay0+YXR0cmlidXRlcy5hcHBlbmQobmV3QXR0cmlidXRlKTsKKyAg
ICAgICAgfQorCisgICAgICAgIGNhbGxiYWNrLT5hdHRyaWJ1dGVzLmFwcGVuZChzdGF0aWNfY2Fz
dDxYTUxfQ2hhcio+KDApKTsKKworICAgICAgICBtX2NhbGxiYWNrcy5hcHBlbmQoY2FsbGJhY2sp
OworICAgIH0KKworICAgIHZvaWQgYXBwZW5kRW5kRWxlbWVudENhbGxiYWNrKCkKKyAgICB7Cisg
ICAgICAgIFBlbmRpbmdFbmRFbGVtZW50Q2FsbGJhY2sqIGNhbGxiYWNrID0gbmV3IFBlbmRpbmdF
bmRFbGVtZW50Q2FsbGJhY2s7CisKKyAgICAgICAgbV9jYWxsYmFja3MuYXBwZW5kKGNhbGxiYWNr
KTsKKyAgICB9CisKKyAgICB2b2lkIGFwcGVuZENoYXJhY3RlckRhdGFDYWxsYmFjayhjb25zdCBT
dHJpbmcmIGRhdGEpCisgICAgeworICAgICAgICBQZW5kaW5nQ2hhcmFjdGVyRGF0YUNhbGxiYWNr
KiBjYWxsYmFjayA9IG5ldyBQZW5kaW5nQ2hhcmFjdGVyRGF0YUNhbGxiYWNrOworCisgICAgICAg
IGNhbGxiYWNrLT5kYXRhID0gZGF0YTsKKworICAgICAgICBtX2NhbGxiYWNrcy5hcHBlbmQoY2Fs
bGJhY2spOworICAgIH0KKworICAgIHZvaWQgYXBwZW5kUHJvY2Vzc2luZ0luc3RydWN0aW9uQ2Fs
bGJhY2soY29uc3QgU3RyaW5nJiB0YXJnZXQsIGNvbnN0IFN0cmluZyYgZGF0YSkKKyAgICB7Cisg
ICAgICAgIFBlbmRpbmdQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25DYWxsYmFjayogY2FsbGJhY2sgPSBu
ZXcgUGVuZGluZ1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkNhbGxiYWNrOworCisgICAgICAgIGNhbGxi
YWNrLT50YXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIGNhbGxiYWNrLT5kYXRhID0gZGF0YTsKKwor
ICAgICAgICBtX2NhbGxiYWNrcy5hcHBlbmQoY2FsbGJhY2spOworICAgIH0KKworICAgIHZvaWQg
YXBwZW5kQ29tbWVudENhbGxiYWNrKGNvbnN0IFN0cmluZyYgZGF0YSkKKyAgICB7CisgICAgICAg
IFBlbmRpbmdDb21tZW50Q2FsbGJhY2sqIGNhbGxiYWNrID0gbmV3IFBlbmRpbmdDb21tZW50Q2Fs
bGJhY2s7CisKKyAgICAgICAgY2FsbGJhY2stPmRhdGEgPSBkYXRhOworCisgICAgICAgIG1fY2Fs
bGJhY2tzLmFwcGVuZChjYWxsYmFjayk7CisgICAgfQorCisgICAgdm9pZCBhcHBlbmRTdGFydENk
YXRhU2VjdGlvbkNhbGxiYWNrKCkKKyAgICB7CisgICAgICAgIFBlbmRpbmdTdGFydENkYXRhU2Vj
dGlvbkNhbGxiYWNrKiBjYWxsYmFjayA9IG5ldyBQZW5kaW5nU3RhcnRDZGF0YVNlY3Rpb25DYWxs
YmFjazsKKworICAgICAgICBtX2NhbGxiYWNrcy5hcHBlbmQoY2FsbGJhY2spOworICAgIH0KKwor
ICAgIHZvaWQgYXBwZW5kRW5kQ2RhdGFTZWN0aW9uQ2FsbGJhY2soKQorICAgIHsKKyAgICAgICAg
UGVuZGluZ0VuZENkYXRhU2VjdGlvbkNhbGxiYWNrKiBjYWxsYmFjayA9IG5ldyBQZW5kaW5nRW5k
Q2RhdGFTZWN0aW9uQ2FsbGJhY2s7CisKKyAgICAgICAgbV9jYWxsYmFja3MuYXBwZW5kKGNhbGxi
YWNrKTsKKyAgICB9CisKKyAgICB2b2lkIGFwcGVuZFN0YXJ0TmFtZXNwYWNlRGVjbENhbGxiYWNr
KGNvbnN0IFN0cmluZyYgcHJlZml4LCBjb25zdCBTdHJpbmcmIHVyaSkKKyAgICB7CisgICAgICAg
IFBlbmRpbmdTdGFydE5hbWVzcGFjZURlY2xDYWxsYmFjayogY2FsbGJhY2sgPSBuZXcgUGVuZGlu
Z1N0YXJ0TmFtZXNwYWNlRGVjbENhbGxiYWNrOworCisgICAgICAgIGNhbGxiYWNrLT5wcmVmaXgg
PSBwcmVmaXg7CisgICAgICAgIGNhbGxiYWNrLT51cmkgPSB1cmk7CisKKyAgICAgICAgbV9jYWxs
YmFja3MuYXBwZW5kKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICB2b2lkIGFwcGVuZEVuZE5hbWVz
cGFjZURlY2xDYWxsYmFjayhjb25zdCBTdHJpbmcmIHByZWZpeCkKKyAgICB7CisgICAgICAgIFBl
bmRpbmdFbmROYW1lc3BhY2VEZWNsQ2FsbGJhY2sqIGNhbGxiYWNrID0gbmV3IFBlbmRpbmdFbmRO
YW1lc3BhY2VEZWNsQ2FsbGJhY2s7CisKKyAgICAgICAgY2FsbGJhY2stPnByZWZpeCA9IHByZWZp
eDsKKworICAgICAgICBtX2NhbGxiYWNrcy5hcHBlbmQoY2FsbGJhY2spOworICAgIH0KKworICAg
IHZvaWQgY2FsbEFuZFJlbW92ZUZpcnN0Q2FsbGJhY2soWE1MRG9jdW1lbnRQYXJzZXIqIHBhcnNl
cikKKyAgICB7CisgICAgICAgIE93blB0cjxQZW5kaW5nQ2FsbGJhY2s+IGNhbGxiYWNrKG1fY2Fs
bGJhY2tzLnRha2VGaXJzdCgpKTsKKyAgICAgICAgY2FsbGJhY2stPmNhbGwocGFyc2VyKTsKKyAg
ICB9CisKKyAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2NhbGxiYWNrcy5pc0Vt
cHR5KCk7IH0KKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUGVuZGluZ0NhbGxiYWNrIHsKKyAgICAg
ICAgdmlydHVhbCB+UGVuZGluZ0NhbGxiYWNrKCkgeyB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBj
YWxsKFhNTERvY3VtZW50UGFyc2VyKiBwYXJzZXIpID0gMDsKKyAgICB9OworCisgICAgc3RydWN0
IFBlbmRpbmdTdGFydEVsZW1lbnRDYWxsYmFjayA6IHB1YmxpYyBQZW5kaW5nQ2FsbGJhY2sgewor
ICAgICAgICB2aXJ0dWFsIH5QZW5kaW5nU3RhcnRFbGVtZW50Q2FsbGJhY2soKQorICAgICAgICB7
CisgICAgICAgICAgICBkZWxldGVBbGxWYWx1ZXMoYXR0cmlidXRlcyk7CisgICAgICAgIH0KKwor
ICAgICAgICB2aXJ0dWFsIHZvaWQgY2FsbChYTUxEb2N1bWVudFBhcnNlciogcGFyc2VyKQorICAg
ICAgICB7CisgICAgICAgICAgICBwYXJzZXItPnN0YXJ0RWxlbWVudChuYW1lLCBhdHRyaWJ1dGVz
LmRhdGEoKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgVmVj
dG9yPFhNTF9DaGFyKj4gYXR0cmlidXRlczsKKyAgICB9OworCisgICAgc3RydWN0IFBlbmRpbmdF
bmRFbGVtZW50Q2FsbGJhY2sgOiBwdWJsaWMgUGVuZGluZ0NhbGxiYWNrIHsKKyAgICAgICAgdmly
dHVhbCB2b2lkIGNhbGwoWE1MRG9jdW1lbnRQYXJzZXIqIHBhcnNlcikKKyAgICAgICAgeworICAg
ICAgICAgICAgcGFyc2VyLT5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAg
c3RydWN0IFBlbmRpbmdDaGFyYWN0ZXJEYXRhQ2FsbGJhY2sgOiBwdWJsaWMgUGVuZGluZ0NhbGxi
YWNrIHsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNhbGwoWE1MRG9jdW1lbnRQYXJzZXIqIHBhcnNl
cikKKyAgICAgICAgeworICAgICAgICAgICAgcGFyc2VyLT5jaGFyYWN0ZXJEYXRhKGRhdGEpOwor
ICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGRhdGE7CisgICAgfTsKKworICAgIHN0cnVjdCBQ
ZW5kaW5nUHJvY2Vzc2luZ0luc3RydWN0aW9uQ2FsbGJhY2sgOiBwdWJsaWMgUGVuZGluZ0NhbGxi
YWNrIHsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNhbGwoWE1MRG9jdW1lbnRQYXJzZXIqIHBhcnNl
cikKKyAgICAgICAgeworICAgICAgICAgICAgcGFyc2VyLT5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24o
dGFyZ2V0LCBkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyB0YXJnZXQ7CisgICAg
ICAgIFN0cmluZyBkYXRhOworICAgIH07CisKKyAgICBzdHJ1Y3QgUGVuZGluZ0NvbW1lbnRDYWxs
YmFjayA6IHB1YmxpYyBQZW5kaW5nQ2FsbGJhY2sgeworICAgICAgICB2aXJ0dWFsIHZvaWQgY2Fs
bChYTUxEb2N1bWVudFBhcnNlciogcGFyc2VyKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJz
ZXItPmNvbW1lbnQoZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZGF0YTsKKyAg
ICB9OworCisgICAgc3RydWN0IFBlbmRpbmdTdGFydENkYXRhU2VjdGlvbkNhbGxiYWNrIDogcHVi
bGljIFBlbmRpbmdDYWxsYmFjayB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjYWxsKFhNTERvY3Vt
ZW50UGFyc2VyKiBwYXJzZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcnNlci0+c3RhcnRD
ZGF0YVNlY3Rpb24oKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgUGVuZGluZ0Vu
ZENkYXRhU2VjdGlvbkNhbGxiYWNrIDogcHVibGljIFBlbmRpbmdDYWxsYmFjayB7CisgICAgICAg
IHZpcnR1YWwgdm9pZCBjYWxsKFhNTERvY3VtZW50UGFyc2VyKiBwYXJzZXIpCisgICAgICAgIHsK
KyAgICAgICAgICAgIHBhcnNlci0+ZW5kQ2RhdGFTZWN0aW9uKCk7CisgICAgICAgIH0KKyAgICB9
OworCisgICAgc3RydWN0IFBlbmRpbmdTdGFydE5hbWVzcGFjZURlY2xDYWxsYmFjayA6IHB1Ymxp
YyBQZW5kaW5nQ2FsbGJhY2sgeworICAgICAgICB2aXJ0dWFsIHZvaWQgY2FsbChYTUxEb2N1bWVu
dFBhcnNlciogcGFyc2VyKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJzZXItPnN0YXJ0TmFt
ZXNwYWNlRGVjbChwcmVmaXgsIHVyaSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcHJl
Zml4OworICAgICAgICBTdHJpbmcgdXJpOworICAgIH07CisKKyAgICBzdHJ1Y3QgUGVuZGluZ0Vu
ZE5hbWVzcGFjZURlY2xDYWxsYmFjayA6IHB1YmxpYyBQZW5kaW5nQ2FsbGJhY2sgeworICAgICAg
ICB2aXJ0dWFsIHZvaWQgY2FsbChYTUxEb2N1bWVudFBhcnNlciogcGFyc2VyKQorICAgICAgICB7
CisgICAgICAgICAgICBwYXJzZXItPmVuZE5hbWVzcGFjZURlY2wocHJlZml4KTsKKyAgICAgICAg
fQorCisgICAgICAgIFN0cmluZyBwcmVmaXg7CisgICAgfTsKKworICAgIERlcXVlPFBlbmRpbmdD
YWxsYmFjayo+IG1fY2FsbGJhY2tzOworfTsKKworCitzdGF0aWMgaW5saW5lIFhNTERvY3VtZW50
UGFyc2VyKiBnZXRQYXJzZXIodm9pZCogdXNlckRhdGEpCit7CisgICAgcmV0dXJuIHN0YXRpY19j
YXN0PFhNTERvY3VtZW50UGFyc2VyKj4odXNlckRhdGEpOworfQorCitzdGF0aWMgdm9pZCBYTUxD
QUxMIHN0YXJ0RWxlbWVudEhhbmRsZXIodm9pZCogdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyKiBu
YW1lLCBjb25zdCBYTUxfQ2hhcioqIGF0dHJpYnV0ZXMpCit7CisgICAgZ2V0UGFyc2VyKHVzZXJE
YXRhKS0+c3RhcnRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOworfQorCitzdGF0aWMgdm9pZCBY
TUxDQUxMIGVuZEVsZW1lbnRIYW5kbGVyKHZvaWQqIHVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciog
bmFtZSkKK3sKKyAgICBVTlVTRURfUEFSQU0obmFtZSk7CisgICAgZ2V0UGFyc2VyKHVzZXJEYXRh
KS0+ZW5kRWxlbWVudCgpOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxMIGNoYXJhY3RlckRhdGFI
YW5kbGVyKHZvaWQqIHVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciogZGF0YSwgaW50IGxlbmd0aCkK
K3sKKyAgICBnZXRQYXJzZXIodXNlckRhdGEpLT5jaGFyYWN0ZXJEYXRhKFN0cmluZyhkYXRhLCBs
ZW5ndGgpKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25I
YW5kbGVyKHZvaWQqIHVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciogdGFyZ2V0LCBjb25zdCBYTUxf
Q2hhciogZGF0YSkKK3sKKyAgICBnZXRQYXJzZXIodXNlckRhdGEpLT5wcm9jZXNzaW5nSW5zdHJ1
Y3Rpb24odGFyZ2V0LCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTCBjb21tZW50SGFu
ZGxlcih2b2lkKiB1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIqIGRhdGEpCit7CisgICAgZ2V0UGFy
c2VyKHVzZXJEYXRhKS0+Y29tbWVudChkYXRhKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FMTCBz
dGFydENkYXRhU2VjdGlvbkhhbmRsZXIodm9pZCogdXNlckRhdGEpCit7CisgICAgZ2V0UGFyc2Vy
KHVzZXJEYXRhKS0+c3RhcnRDZGF0YVNlY3Rpb24oKTsKK30KKworc3RhdGljIHZvaWQgWE1MQ0FM
TCBlbmRDZGF0YVNlY3Rpb25IYW5kbGVyKHZvaWQqIHVzZXJEYXRhKQoreworICAgIGdldFBhcnNl
cih1c2VyRGF0YSktPmVuZENkYXRhU2VjdGlvbigpOworfQorCitzdGF0aWMgdm9pZCBYTUxDQUxM
IHN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIodm9pZCogdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFy
KiBwcmVmaXgsIGNvbnN0IFhNTF9DaGFyKiB1cmkpCit7CisgICAgZ2V0UGFyc2VyKHVzZXJEYXRh
KS0+c3RhcnROYW1lc3BhY2VEZWNsKHByZWZpeCwgdXJpKTsKK30KKworc3RhdGljIHZvaWQgWE1M
Q0FMTCBlbmROYW1lc3BhY2VEZWNsSGFuZGxlcih2b2lkKiB1c2VyRGF0YSwgY29uc3QgWE1MX0No
YXIqIHByZWZpeCkKK3sKKyAgICBnZXRQYXJzZXIodXNlckRhdGEpLT5lbmROYW1lc3BhY2VEZWNs
KHByZWZpeCk7Cit9CisKK3N0YXRpYyBpbnQgWE1MQ0FMTCBub3RTdGFuZGFsb25lSGFuZGxlcih2
b2lkKiB1c2VyRGF0YSkKK3sKKyAgICByZXR1cm4gZ2V0UGFyc2VyKHVzZXJEYXRhKS0+bm90U3Rh
bmRhbG9uZSgpOworfQorCisKK1hNTERvY3VtZW50UGFyc2VyOjpYTUxEb2N1bWVudFBhcnNlcihE
b2N1bWVudCogZG9jdW1lbnQsIEZyYW1lVmlldyogZnJhbWVWaWV3KQorICAgIDogU2NyaXB0YWJs
ZURvY3VtZW50UGFyc2VyKGRvY3VtZW50KQorICAgICwgbV92aWV3KGZyYW1lVmlldykKKyAgICAs
IG1faXNQYXJzaW5nQ2RhdGFTZWN0aW9uKGZhbHNlKQorICAgICwgbV9wZW5kaW5nQ2FsbGJhY2tz
KG5ldyBQZW5kaW5nQ2FsbGJhY2tzKQorICAgICwgbV9jdXJyZW50Tm9kZShkb2N1bWVudCkKKyAg
ICAsIG1fc2F3RXJyb3IoZmFsc2UpCisgICAgLCBtX3Nhd1hTTFRyYW5zZm9ybShmYWxzZSkKKyAg
ICAsIG1fc2F3Rmlyc3RFbGVtZW50KGZhbHNlKQorICAgICwgbV9pc1hIVE1MRG9jdW1lbnQoZmFs
c2UpCisjaWYgRU5BQkxFKFhIVE1MTVApCisgICAgLCBtX2lzWEhUTUxNUERvY3VtZW50KGZhbHNl
KQorICAgICwgbV9oYXNEb2NUeXBlRGVjbGFyYXRpb24oZmFsc2UpCisjZW5kaWYKKyAgICAsIG1f
cGFyc2VyUGF1c2VkKGZhbHNlKQorICAgICwgbV9yZXF1ZXN0aW5nU2NyaXB0KGZhbHNlKQorICAg
ICwgbV9maW5pc2hDYWxsZWQoZmFsc2UpCisgICAgLCBtX2Vycm9yQ291bnQoMCkKKyAgICAsIG1f
bGFzdEVycm9yTGluZSgwKQorICAgICwgbV9sYXN0RXJyb3JDb2x1bW4oMCkKKyAgICAsIG1fcGVu
ZGluZ1NjcmlwdCgwKQorICAgICwgbV9zY3JpcHRTdGFydExpbmUoMCkKKyAgICAsIG1fcGFyc2lu
Z0ZyYWdtZW50KGZhbHNlKQorICAgICwgbV9zY3JpcHRpbmdQZXJtaXNzaW9uKEZyYWdtZW50U2Ny
aXB0aW5nQWxsb3dlZCkKK3sKKyAgICBpbml0UGFyc2VyKCk7Cit9CisKK1hNTERvY3VtZW50UGFy
c2VyOjpYTUxEb2N1bWVudFBhcnNlcihEb2N1bWVudEZyYWdtZW50KiBmcmFnbWVudCwgRWxlbWVu
dCogcGFyZW50RWxlbWVudCwgRnJhZ21lbnRTY3JpcHRpbmdQZXJtaXNzaW9uIHNjcmlwdGluZ1Bl
cm1pc3Npb24pCisgICAgOiBTY3JpcHRhYmxlRG9jdW1lbnRQYXJzZXIoZnJhZ21lbnQtPmRvY3Vt
ZW50KCkpCisgICAgLCBtX3ZpZXcoMCkKKyAgICAsIG1faXNQYXJzaW5nQ2RhdGFTZWN0aW9uKGZh
bHNlKQorICAgICwgbV9wZW5kaW5nQ2FsbGJhY2tzKG5ldyBQZW5kaW5nQ2FsbGJhY2tzKQorICAg
ICwgbV9jdXJyZW50Tm9kZShmcmFnbWVudCkKKyAgICAsIG1fc2F3RXJyb3IoZmFsc2UpCisgICAg
LCBtX3Nhd1hTTFRyYW5zZm9ybShmYWxzZSkKKyAgICAsIG1fc2F3Rmlyc3RFbGVtZW50KGZhbHNl
KQorICAgICwgbV9pc1hIVE1MRG9jdW1lbnQoZmFsc2UpCisjaWYgRU5BQkxFKFhIVE1MTVApCisg
ICAgLCBtX2lzWEhUTUxNUERvY3VtZW50KGZhbHNlKQorICAgICwgbV9oYXNEb2NUeXBlRGVjbGFy
YXRpb24oZmFsc2UpCisjZW5kaWYKKyAgICAsIG1fcGFyc2VyUGF1c2VkKGZhbHNlKQorICAgICwg
bV9yZXF1ZXN0aW5nU2NyaXB0KGZhbHNlKQorICAgICwgbV9maW5pc2hDYWxsZWQoZmFsc2UpCisg
ICAgLCBtX2Vycm9yQ291bnQoMCkKKyAgICAsIG1fbGFzdEVycm9yTGluZSgwKQorICAgICwgbV9s
YXN0RXJyb3JDb2x1bW4oMCkKKyAgICAsIG1fcGVuZGluZ1NjcmlwdCgwKQorICAgICwgbV9zY3Jp
cHRTdGFydExpbmUoMCkKKyAgICAsIG1fcGFyc2luZ0ZyYWdtZW50KHRydWUpCisgICAgLCBtX3Nj
cmlwdGluZ1Blcm1pc3Npb24oc2NyaXB0aW5nUGVybWlzc2lvbikKK3sKKyAgICBpbml0UGFyc2Vy
KCk7CisKKyAgICBmcmFnbWVudC0+cmVmKCk7CisKKyAgICAvLyBBZGQgbmFtZXNwYWNlcyBiYXNl
ZCBvbiB0aGUgcGFyZW50IG5vZGUKKyAgICBWZWN0b3I8RWxlbWVudCo+IGVsZW1TdGFjazsKKyAg
ICB3aGlsZSAocGFyZW50RWxlbWVudCkgeworICAgICAgICBlbGVtU3RhY2suYXBwZW5kKHBhcmVu
dEVsZW1lbnQpOworCisgICAgICAgIE5vZGUqIG4gPSBwYXJlbnRFbGVtZW50LT5wYXJlbnROb2Rl
KCk7CisgICAgICAgIGlmICghbiB8fCAhbi0+aXNFbGVtZW50Tm9kZSgpKQorICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIHBhcmVudEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obik7
CisgICAgfQorCisgICAgaWYgKGVsZW1TdGFjay5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGZvciAoRWxlbWVudCogZWxlbWVudCA9IGVsZW1TdGFjay5sYXN0KCk7ICFlbGVtU3Rh
Y2suaXNFbXB0eSgpOyBlbGVtU3RhY2sucmVtb3ZlTGFzdCgpKSB7CisgICAgICAgIGlmIChOYW1l
ZE5vZGVNYXAqIGF0dHJzID0gZWxlbWVudC0+YXR0cmlidXRlcygpKSB7CisgICAgICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYXR0cnMtPmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAg
ICAgICAgICBBdHRyaWJ1dGUqIGF0dHIgPSBhdHRycy0+YXR0cmlidXRlSXRlbShpKTsKKyAgICAg
ICAgICAgICAgICBpZiAoYXR0ci0+bG9jYWxOYW1lKCkgPT0geG1sbnNBdG9tKQorICAgICAgICAg
ICAgICAgICAgICBtX2RlZmF1bHROYW1lc3BhY2VVUkkgPSBhdHRyLT52YWx1ZSgpOworICAgICAg
ICAgICAgICAgIGVsc2UgaWYgKGF0dHItPnByZWZpeCgpID09IHhtbG5zQXRvbSkKKyAgICAgICAg
ICAgICAgICAgICAgbV9wcmVmaXhUb05hbWVzcGFjZU1hcC5zZXQoYXR0ci0+bG9jYWxOYW1lKCks
IGF0dHItPnZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAg
Ly8gSWYgdGhlIHBhcmVudCBlbGVtZW50IGlzIG5vdCBpbiBkb2N1bWVudCB0cmVlLCB0aGVyZSBt
YXkgYmUgbm8geG1sbnMgYXR0cmlidXRlOyBqdXN0IGRlZmF1bHQgdG8gdGhlIHBhcmVudCdzIG5h
bWVzcGFjZS4KKyAgICBpZiAobV9kZWZhdWx0TmFtZXNwYWNlVVJJLmlzTnVsbCgpICYmICFwYXJl
bnRFbGVtZW50LT5pbkRvY3VtZW50KCkpCisgICAgICAgIG1fZGVmYXVsdE5hbWVzcGFjZVVSSSA9
IHBhcmVudEVsZW1lbnQtPm5hbWVzcGFjZVVSSSgpOworfQorCitYTUxEb2N1bWVudFBhcnNlcjo6
flhNTERvY3VtZW50UGFyc2VyKCkKK3sKKyAgICBjbGVhckN1cnJlbnROb2RlU3RhY2soKTsKKyAg
ICBpZiAobV9wZW5kaW5nU2NyaXB0KQorICAgICAgICBtX3BlbmRpbmdTY3JpcHQtPnJlbW92ZUNs
aWVudCh0aGlzKTsKKworICAgIFhNTF9QYXJzZXJGcmVlKG1fcGFyc2VyKTsKK30KKwordm9pZCBY
TUxEb2N1bWVudFBhcnNlcjo6aW5pdFBhcnNlcigpCit7CisgICAgbV9wYXJzZXIgPSBYTUxfUGFy
c2VyQ3JlYXRlTlMoTCJVVEYtMTYiLCBuYW1lc3BhY2VTZXBhcmF0b3IpOworICAgIFhNTF9TZXRV
c2VyRGF0YShtX3BhcnNlciwgdGhpcyk7CisgICAgWE1MX1NldEVsZW1lbnRIYW5kbGVyKG1fcGFy
c2VyLCBzdGFydEVsZW1lbnRIYW5kbGVyLCBlbmRFbGVtZW50SGFuZGxlcik7CisgICAgWE1MX1Nl
dENoYXJhY3RlckRhdGFIYW5kbGVyKG1fcGFyc2VyLCBjaGFyYWN0ZXJEYXRhSGFuZGxlcik7Cisg
ICAgWE1MX1NldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIobV9wYXJzZXIsIHByb2Nlc3Np
bmdJbnN0cnVjdGlvbkhhbmRsZXIpOworICAgIFhNTF9TZXRDb21tZW50SGFuZGxlcihtX3BhcnNl
ciwgY29tbWVudEhhbmRsZXIpOworICAgIFhNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyKG1fcGFy
c2VyLCBzdGFydENkYXRhU2VjdGlvbkhhbmRsZXIsIGVuZENkYXRhU2VjdGlvbkhhbmRsZXIpOwor
ICAgIFhNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlcihtX3BhcnNlciwgc3RhcnROYW1lc3BhY2VE
ZWNsSGFuZGxlciwgZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIpOworICAgIFhNTF9TZXROb3RTdGFu
ZGFsb25lSGFuZGxlcihtX3BhcnNlciwgbm90U3RhbmRhbG9uZUhhbmRsZXIpOworCisgICAgRXhj
ZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgZG9jdW1lbnQoKS0+c2V0WE1MU3RhbmRhbG9uZSh0cnVl
LCBlYyk7Cit9CisKK3ZvaWQgWE1MRG9jdW1lbnRQYXJzZXI6OmRvV3JpdGUoY29uc3QgU3RyaW5n
JiBwYXJzZVN0cmluZykKK3sKKyAgICBpZiAoIVhNTF9QYXJzZShtX3BhcnNlciwgcmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBjaGFyKj4ocGFyc2VTdHJpbmcuY2hhcmFjdGVycygpKSwgc2l6ZW9mKFVD
aGFyKSAqIHBhcnNlU3RyaW5nLmxlbmd0aCgpLCAwKSkKKyAgICAgICAgaGFuZGxlRXJyb3IoZmF0
YWwsICJQYXJzZXIgZXJyb3IiLCBsaW5lTnVtYmVyKCksIGNvbHVtbk51bWJlcigpKTsKKworICAg
IGlmIChkb2N1bWVudCgpLT5kZWNvZGVyKCkgJiYgZG9jdW1lbnQoKS0+ZGVjb2RlcigpLT5zYXdF
cnJvcigpKSB7CisgICAgICAgIC8vIElmIHRoZSBkZWNvZGVyIHNhdyBhbiBlcnJvciwgcmVwb3J0
IGl0IGFzIGZhdGFsIChzdG9wcyBwYXJzaW5nKQorICAgICAgICBoYW5kbGVFcnJvcihmYXRhbCwg
IkVuY29kaW5nIGVycm9yIiwgbGluZU51bWJlcigpLCBjb2x1bW5OdW1iZXIoKSk7CisgICAgfQor
fQorCit2b2lkIFhNTERvY3VtZW50UGFyc2VyOjpkb0VuZCgpCit7CisgICAgaWYgKG1fcGFyc2Vy
U3RvcHBlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFYTUxfUGFyc2UobV9wYXJzZXIs
IDAsIDAsIDEpKQorICAgICAgICBoYW5kbGVFcnJvcihmYXRhbCwgIlBhcnNlciBlcnJvciIsIGxp
bmVOdW1iZXIoKSwgY29sdW1uTnVtYmVyKCkpOworfQorCit2b2lkIFhNTERvY3VtZW50UGFyc2Vy
OjpzdGFydEVsZW1lbnQoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBYTUxfQ2hhcipjb25zdCog
YXR0cmlidXRlcykKK3sKKyAgICBpZiAobV9wYXJzZXJTdG9wcGVkKQorICAgICAgICByZXR1cm47
CisKKyAgICBpZiAobV9wYXJzZXJQYXVzZWQpIHsKKyAgICAgICAgbV9wZW5kaW5nQ2FsbGJhY2tz
LT5hcHBlbmRTdGFydEVsZW1lbnRDYWxsYmFjayhuYW1lLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworI2lmIEVOQUJMRShYSFRNTE1QKQorICAgIC8vIGNoZWNrIGlmIHRo
ZSBET0NUWVBFIERlY2xhcmF0aW9uIG9mIFhIVE1MTVAgZG9jdW1lbnQgZXhpc3RzCisgICAgaWYg
KCFtX2hhc0RvY1R5cGVEZWNsYXJhdGlvbiAmJiBkb2N1bWVudCgpLT5pc1hIVE1MTVBEb2N1bWVu
dCgpKSB7CisgICAgICAgIGhhbmRsZUVycm9yKGZhdGFsLCAiRE9DVFlQRSBkZWNsYXJhdGlvbiBs
b3N0LiIsIGxpbmVOdW1iZXIoKSwgY29sdW1uTnVtYmVyKCkpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorI2VuZGlmCisKKyAgICBleGl0VGV4dCgpOworCisgICAgaW50IHNlcGFyYXRvclBvc2l0
aW9uID0gbmFtZS5maW5kKG5hbWVzcGFjZVNlcGFyYXRvcik7CisgICAgQXRvbWljU3RyaW5nIGxv
Y2FsTmFtZSA9IHNlcGFyYXRvclBvc2l0aW9uID09IC0xID8gbmFtZSA6IG5hbWUuc3Vic3RyaW5n
KHNlcGFyYXRvclBvc2l0aW9uICsgMSk7CisgICAgQXRvbWljU3RyaW5nIHVyaSA9IHNlcGFyYXRv
clBvc2l0aW9uID09IC0xID8gQXRvbWljU3RyaW5nKCkgOiBuYW1lLmxlZnQoc2VwYXJhdG9yUG9z
aXRpb24pOworICAgIEF0b21pY1N0cmluZyBwcmVmaXggPSB1cmkuaXNFbXB0eSgpID8gQXRvbWlj
U3RyaW5nKCkgOiBtX25hbWVzcGFjZVRvUHJlZml4TWFwLmdldCh1cmkpOworCisgICAgaWYgKG1f
cGFyc2luZ0ZyYWdtZW50ICYmIHVyaS5pc051bGwoKSkgeworICAgICAgICBpZiAoIXByZWZpeC5p
c051bGwoKSkKKyAgICAgICAgICAgIHVyaSA9IG1fcHJlZml4VG9OYW1lc3BhY2VNYXAuZ2V0KHBy
ZWZpeCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVyaSA9IG1fZGVmYXVsdE5hbWVzcGFj
ZVVSSTsKKyAgICB9CisKKyNpZiBFTkFCTEUoWEhUTUxNUCkKKyAgICBpZiAoIW1fc2F3Rmlyc3RF
bGVtZW50ICYmIGlzWEhUTUxNUERvY3VtZW50KCkpIHsKKyAgICAgICAgLy8gQXMgcGVyIHRoZSBz
ZWN0aW9uIDcuMSBvZiBPTUEtV0FQLVhIVE1MTVAtVjFfMS0yMDA2MTAyMC1BLnBkZiwKKyAgICAg
ICAgLy8gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZSByb290IGVsZW1lbnQgTVVTVCBiZSAn
aHRtbCcgYW5kCisgICAgICAgIC8vIGVuc3VyZSB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBuYW1l
c3BhY2Ugb24gdGhlIHJvb3QgZWxtZW50ICdodG1sJworICAgICAgICAvLyBNVVNUIGJlICdodHRw
Oi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJworICAgICAgICBpZiAobG9jYWxOYW1lICE9IEhUTUxO
YW1lczo6aHRtbFRhZy5sb2NhbE5hbWUoKSkgeworICAgICAgICAgICAgaGFuZGxlRXJyb3IoZmF0
YWwsICJYSFRNTE1QIGRvY3VtZW50IGV4cGVjdHMgJ2h0bWwnIGFzIHJvb3QgZWxlbWVudC4iLCBs
aW5lTnVtYmVyKCksIGNvbHVtbk51bWJlcigpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorCisgICAgICAgIGlmICh1cmkuaXNOdWxsKCkpIHsKKyAgICAgICAgICAgIG1fZGVmYXVs
dE5hbWVzcGFjZVVSSSA9IEhUTUxOYW1lczo6eGh0bWxOYW1lc3BhY2VVUkk7CisgICAgICAgICAg
ICB1cmkgPSBtX2RlZmF1bHROYW1lc3BhY2VVUkk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYK
KworICAgIGJvb2wgaXNGaXJzdEVsZW1lbnQgPSAhbV9zYXdGaXJzdEVsZW1lbnQ7CisgICAgbV9z
YXdGaXJzdEVsZW1lbnQgPSB0cnVlOworCisgICAgUXVhbGlmaWVkTmFtZSBxTmFtZShwcmVmaXgs
IGxvY2FsTmFtZSwgdXJpKTsKKyAgICBSZWZQdHI8RWxlbWVudD4gbmV3RWxlbWVudCA9IGRvY3Vt
ZW50KCktPmNyZWF0ZUVsZW1lbnQocU5hbWUsIHRydWUpOworICAgIGlmICghbmV3RWxlbWVudCkg
eworICAgICAgICBzdG9wUGFyc2luZygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
d2hpbGUgKCphdHRyaWJ1dGVzKSB7CisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gKmF0
dHJpYnV0ZXMrKzsKKyAgICAgICAgQXRvbWljU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gKmF0dHJp
YnV0ZXMrKzsKKworICAgICAgICBpbnQgYXR0cmlidXRlU2VwYXJhdG9yUG9zaXRpb24gPSBhdHRy
aWJ1dGVOYW1lLmZpbmQobmFtZXNwYWNlU2VwYXJhdG9yKTsKKyAgICAgICAgQXRvbWljU3RyaW5n
IGF0dHJpYnV0ZUxvY2FsTmFtZSA9IGF0dHJpYnV0ZVNlcGFyYXRvclBvc2l0aW9uID09IC0xID8g
YXR0cmlidXRlTmFtZSA6IGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKGF0dHJpYnV0ZVNlcGFyYXRv
clBvc2l0aW9uICsgMSk7CisgICAgICAgIEF0b21pY1N0cmluZyBhdHRyaWJ1dGVVcmkgPSBhdHRy
aWJ1dGVTZXBhcmF0b3JQb3NpdGlvbiA9PSAtMSA/IEF0b21pY1N0cmluZygpIDogYXR0cmlidXRl
TmFtZS5sZWZ0KGF0dHJpYnV0ZVNlcGFyYXRvclBvc2l0aW9uKTsKKyAgICAgICAgQXRvbWljU3Ry
aW5nIGF0dHJpYnV0ZVByZWZpeCA9IHVyaS5pc0VtcHR5KCkgPyBBdG9taWNTdHJpbmcoKSA6IG1f
bmFtZXNwYWNlVG9QcmVmaXhNYXAuZ2V0KHVyaSk7CisgICAgICAgIEF0b21pY1N0cmluZyBhdHRy
aWJ1dGVRTmFtZSA9IGF0dHJpYnV0ZVByZWZpeC5pc0VtcHR5KCkgPyBhdHRyaWJ1dGVMb2NhbE5h
bWUgOiBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBhdHRyaWJ1dGVMb2NhbE5hbWU7CisKKyAgICAg
ICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgICAgIG5ld0VsZW1lbnQtPnNldEF0dHJpYnV0
ZU5TKGF0dHJpYnV0ZVVyaSwgYXR0cmlidXRlUU5hbWUsIGF0dHJpYnV0ZVZhbHVlLCBlYywgbV9z
Y3JpcHRpbmdQZXJtaXNzaW9uKTsKKworICAgICAgICBpZiAoZWMpIHsKKyAgICAgICAgICAgIHN0
b3BQYXJzaW5nKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBuZXdFbGVtZW50LT5iZWdpblBhcnNpbmdDaGlsZHJlbigpOworCisgICAgU2NyaXB0RWxlbWVu
dCogc2NyaXB0RWxlbWVudCA9IHRvU2NyaXB0RWxlbWVudChuZXdFbGVtZW50LmdldCgpKTsKKyAg
ICBpZiAoc2NyaXB0RWxlbWVudCkKKyAgICAgICAgbV9zY3JpcHRTdGFydExpbmUgPSBsaW5lTnVt
YmVyKCk7CisKKyAgICBpZiAoIW1fY3VycmVudE5vZGUtPmxlZ2FjeVBhcnNlckFkZENoaWxkKG5l
d0VsZW1lbnQuZ2V0KCkpKSB7CisgICAgICAgIHN0b3BQYXJzaW5nKCk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBwdXNoQ3VycmVudE5vZGUobmV3RWxlbWVudC5nZXQoKSk7CisgICAg
aWYgKG1fdmlldyAmJiAhbmV3RWxlbWVudC0+YXR0YWNoZWQoKSkKKyAgICAgICAgbmV3RWxlbWVu
dC0+YXR0YWNoKCk7CisKKyAgICBpZiAoIW1fcGFyc2luZ0ZyYWdtZW50ICYmIGlzRmlyc3RFbGVt
ZW50ICYmIGRvY3VtZW50KCktPmZyYW1lKCkpCisgICAgICAgIGRvY3VtZW50KCktPmZyYW1lKCkt
PmxvYWRlcigpLT5kaXNwYXRjaERvY3VtZW50RWxlbWVudEF2YWlsYWJsZSgpOworfQorCit2b2lk
IFhNTERvY3VtZW50UGFyc2VyOjplbmRFbGVtZW50KCkKK3sKKyAgICBpZiAobV9wYXJzZXJTdG9w
cGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9wYXJzZXJQYXVzZWQpIHsKKyAgICAg
ICAgbV9wZW5kaW5nQ2FsbGJhY2tzLT5hcHBlbmRFbmRFbGVtZW50Q2FsbGJhY2soKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGV4aXRUZXh0KCk7CisKKyAgICBOb2RlKiBuID0gbV9j
dXJyZW50Tm9kZTsKKyAgICBuLT5maW5pc2hQYXJzaW5nQ2hpbGRyZW4oKTsKKworICAgIGlmICht
X3NjcmlwdGluZ1Blcm1pc3Npb24gPT0gRnJhZ21lbnRTY3JpcHRpbmdOb3RBbGxvd2VkICYmIG4t
PmlzRWxlbWVudE5vZGUoKSAmJiB0b1NjcmlwdEVsZW1lbnQoc3RhdGljX2Nhc3Q8RWxlbWVudCo+
KG4pKSkgeworICAgICAgICBwb3BDdXJyZW50Tm9kZSgpOworICAgICAgICBFeGNlcHRpb25Db2Rl
IGVjOworICAgICAgICBuLT5yZW1vdmUoZWMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgaWYgKCFuLT5pc0VsZW1lbnROb2RlKCkgfHwgIW1fdmlldykgeworICAgICAgICBwb3BDdXJy
ZW50Tm9kZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRWxlbWVudCogZWxlbWVu
dCA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihuKTsKKworICAgIC8vIFRoZSBlbGVtZW50J3MgcGFy
ZW50IG1heSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gZG9jdW1lbnQuCisgICAgLy8g
UGFyc2luZyBjb250aW51ZXMgaW4gdGhpcyBjYXNlLCBidXQgc2NyaXB0cyBhcmVuJ3QgZXhlY3V0
ZWQuCisgICAgaWYgKCFlbGVtZW50LT5pbkRvY3VtZW50KCkpIHsKKyAgICAgICAgcG9wQ3VycmVu
dE5vZGUoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNjcmlwdEVsZW1lbnQqIHNj
cmlwdEVsZW1lbnQgPSB0b1NjcmlwdEVsZW1lbnQoZWxlbWVudCk7CisgICAgaWYgKCFzY3JpcHRF
bGVtZW50KSB7CisgICAgICAgIHBvcEN1cnJlbnROb2RlKCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICAvLyBEb24ndCBsb2FkIGV4dGVybmFsIHNjcmlwdHMgZm9yIHN0YW5kYWxvbmUg
ZG9jdW1lbnRzIChmb3Igbm93KS4KKyAgICBBU1NFUlQoIW1fcGVuZGluZ1NjcmlwdCk7CisgICAg
bV9yZXF1ZXN0aW5nU2NyaXB0ID0gdHJ1ZTsKKworI2lmIEVOQUJMRShYSFRNTE1QKQorICAgIGlm
ICghc2NyaXB0RWxlbWVudC0+c2hvdWxkRXhlY3V0ZUFzSmF2YVNjcmlwdCgpKQorICAgICAgICBk
b2N1bWVudCgpLT5zZXRTaG91bGRQcm9jZXNzTm9zY3JpcHRFbGVtZW50KHRydWUpOworICAgIGVs
c2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgU3RyaW5nIHNjcmlwdEhyZWYgPSBzY3JpcHRFbGVt
ZW50LT5zb3VyY2VBdHRyaWJ1dGVWYWx1ZSgpOworICAgICAgICBpZiAoIXNjcmlwdEhyZWYuaXNF
bXB0eSgpKSB7CisgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgc3JjIGF0dHJpYnV0ZQorICAgICAg
ICAgICAgU3RyaW5nIHNjcmlwdENoYXJzZXQgPSBzY3JpcHRFbGVtZW50LT5zY3JpcHRDaGFyc2V0
KCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudC0+ZGlzcGF0Y2hCZWZvcmVMb2FkRXZlbnQoc2Ny
aXB0SHJlZikKKyAgICAgICAgICAgICAgICAmJiAobV9wZW5kaW5nU2NyaXB0ID0gZG9jdW1lbnQo
KS0+ZG9jTG9hZGVyKCktPnJlcXVlc3RTY3JpcHQoc2NyaXB0SHJlZiwgc2NyaXB0Q2hhcnNldCkp
KSB7CisgICAgICAgICAgICAgICAgbV9zY3JpcHRFbGVtZW50ID0gZWxlbWVudDsKKyAgICAgICAg
ICAgICAgICBtX3BlbmRpbmdTY3JpcHQtPmFkZENsaWVudCh0aGlzKTsKKworICAgICAgICAgICAg
ICAgIC8vIG1fcGVuZGluZ1NjcmlwdCB3aWxsIGJlIDAgaWYgc2NyaXB0IHdhcyBhbHJlYWR5IGxv
YWRlZCBhbmQgcmVmKCkgZXhlY3V0ZWQgaXQKKyAgICAgICAgICAgICAgICBpZiAobV9wZW5kaW5n
U2NyaXB0KQorICAgICAgICAgICAgICAgICAgICBwYXVzZVBhcnNpbmcoKTsKKyAgICAgICAgICAg
IH0gZWxzZQorICAgICAgICAgICAgICAgIG1fc2NyaXB0RWxlbWVudCA9IDA7CisgICAgICAgIH0g
ZWxzZQorICAgICAgICAgICAgbV92aWV3LT5mcmFtZSgpLT5zY3JpcHQoKS0+ZXhlY3V0ZVNjcmlw
dChTY3JpcHRTb3VyY2VDb2RlKHNjcmlwdEVsZW1lbnQtPnNjcmlwdENvbnRlbnQoKSwgZG9jdW1l
bnQoKS0+dXJsKCksIG1fc2NyaXB0U3RhcnRMaW5lKSk7CisgICAgfQorICAgIG1fcmVxdWVzdGlu
Z1NjcmlwdCA9IGZhbHNlOworICAgIHBvcEN1cnJlbnROb2RlKCk7Cit9CisKK3ZvaWQgWE1MRG9j
dW1lbnRQYXJzZXI6OmNoYXJhY3RlckRhdGEoY29uc3QgU3RyaW5nJiBkYXRhKQoreworICAgIGlm
IChtX3BhcnNlclN0b3BwZWQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX3BhcnNlclBh
dXNlZCkgeworICAgICAgICBtX3BlbmRpbmdDYWxsYmFja3MtPmFwcGVuZENoYXJhY3RlckRhdGFD
YWxsYmFjayhkYXRhKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtX2N1cnJl
bnROb2RlLT5pc1RleHROb2RlKCkgfHwgZW50ZXJUZXh0KCkpCisgICAgICAgIG1fYnVmZmVyZWRU
ZXh0LmFwcGVuZChkYXRhKTsKK30KKwordm9pZCBYTUxEb2N1bWVudFBhcnNlcjo6cHJvY2Vzc2lu
Z0luc3RydWN0aW9uKGNvbnN0IFN0cmluZyYgdGFyZ2V0LCBjb25zdCBTdHJpbmcmIGRhdGEpCit7
CisgICAgaWYgKG1fcGFyc2VyU3RvcHBlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1f
cGFyc2VyUGF1c2VkKSB7CisgICAgICAgIG1fcGVuZGluZ0NhbGxiYWNrcy0+YXBwZW5kUHJvY2Vz
c2luZ0luc3RydWN0aW9uQ2FsbGJhY2sodGFyZ2V0LCBkYXRhKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIGV4aXRUZXh0KCk7CisKKyAgICAvLyAjIyMgaGFuZGxlIGV4Y2VwdGlvbnMK
KyAgICBpbnQgZXhjZXB0aW9uID0gMDsKKyAgICBSZWZQdHI8UHJvY2Vzc2luZ0luc3RydWN0aW9u
PiBwaSA9IGRvY3VtZW50KCktPmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRh
dGEsIGV4Y2VwdGlvbik7CisgICAgaWYgKGV4Y2VwdGlvbikKKyAgICAgICAgcmV0dXJuOworCisg
ICAgcGktPnNldENyZWF0ZWRCeVBhcnNlcih0cnVlKTsKKworICAgIGlmICghbV9jdXJyZW50Tm9k
ZS0+bGVnYWN5UGFyc2VyQWRkQ2hpbGQocGkuZ2V0KCkpKQorICAgICAgICByZXR1cm47CisgICAg
aWYgKG1fdmlldyAmJiAhcGktPmF0dGFjaGVkKCkpCisgICAgICAgIHBpLT5hdHRhY2goKTsKKwor
ICAgIHBpLT5maW5pc2hQYXJzaW5nQ2hpbGRyZW4oKTsKKworI2lmIEVOQUJMRShYU0xUKQorICAg
IG1fc2F3WFNMVHJhbnNmb3JtID0gIW1fc2F3Rmlyc3RFbGVtZW50ICYmIHBpLT5pc1hTTCgpOwor
ICAgIGlmIChtX3Nhd1hTTFRyYW5zZm9ybSAmJiAhZG9jdW1lbnQoKS0+dHJhbnNmb3JtU291cmNl
RG9jdW1lbnQoKSkKKyAgICAgICAgc3RvcFBhcnNpbmcoKTsKKyNlbmRpZgorfQorCit2b2lkIFhN
TERvY3VtZW50UGFyc2VyOjpjb21tZW50KGNvbnN0IFN0cmluZyYgZGF0YSkKK3sKKyAgICBpZiAo
bV9wYXJzZXJTdG9wcGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9wYXJzZXJQYXVz
ZWQpIHsKKyAgICAgICAgbV9wZW5kaW5nQ2FsbGJhY2tzLT5hcHBlbmRDb21tZW50Q2FsbGJhY2so
ZGF0YSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBleGl0VGV4dCgpOworCisgICAg
UmVmUHRyPE5vZGU+IG5ld05vZGUgPSBDb21tZW50OjpjcmVhdGUoZG9jdW1lbnQoKSwgZGF0YSk7
CisgICAgbV9jdXJyZW50Tm9kZS0+bGVnYWN5UGFyc2VyQWRkQ2hpbGQobmV3Tm9kZS5nZXQoKSk7
CisgICAgaWYgKG1fdmlldyAmJiAhbmV3Tm9kZS0+YXR0YWNoZWQoKSkKKyAgICAgICAgbmV3Tm9k
ZS0+YXR0YWNoKCk7Cit9CisKK3ZvaWQgWE1MRG9jdW1lbnRQYXJzZXI6OnN0YXJ0Q2RhdGFTZWN0
aW9uKCkKK3sKKyAgICBpZiAobV9wYXJzZXJTdG9wcGVkKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpZiAobV9wYXJzZXJQYXVzZWQpIHsKKyAgICAgICAgbV9wZW5kaW5nQ2FsbGJhY2tzLT5hcHBl
bmRTdGFydENkYXRhU2VjdGlvbkNhbGxiYWNrKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBleGl0VGV4dCgpOworCisgICAgbV9pc1BhcnNpbmdDZGF0YVNlY3Rpb24gPSB0cnVlOwor
fQorCit2b2lkIFhNTERvY3VtZW50UGFyc2VyOjplbmRDZGF0YVNlY3Rpb24oKQoreworICAgIGlm
IChtX3BhcnNlclN0b3BwZWQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX3BhcnNlclBh
dXNlZCkgeworICAgICAgICBtX3BlbmRpbmdDYWxsYmFja3MtPmFwcGVuZEVuZENkYXRhU2VjdGlv
bkNhbGxiYWNrKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBleGl0VGV4dCgpOwor
CisgICAgbV9pc1BhcnNpbmdDZGF0YVNlY3Rpb24gPSBmYWxzZTsKK30KKwordm9pZCBYTUxEb2N1
bWVudFBhcnNlcjo6c3RhcnROYW1lc3BhY2VEZWNsKGNvbnN0IFN0cmluZyYgcHJlZml4LCBjb25z
dCBTdHJpbmcmIHVyaSkKK3sKKyAgICBpZiAobV9wYXJzZXJTdG9wcGVkKQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAobV9wYXJzZXJQYXVzZWQpIHsKKyAgICAgICAgbV9wZW5kaW5nQ2FsbGJh
Y2tzLT5hcHBlbmRTdGFydE5hbWVzcGFjZURlY2xDYWxsYmFjayhwcmVmaXgsIHVyaSk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocHJlZml4LmlzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV9uYW1lc3BhY2VUb1ByZWZpeE1hcC5hZGQodXJpLCBwcmVmaXgpOwor
ICAgIG1fcHJlZml4VG9OYW1lc3BhY2VNYXAuYWRkKHByZWZpeCwgdXJpKTsKK30KKwordm9pZCBY
TUxEb2N1bWVudFBhcnNlcjo6ZW5kTmFtZXNwYWNlRGVjbChjb25zdCBTdHJpbmcmIHByZWZpeCkK
K3sKKyAgICBpZiAobV9wYXJzZXJTdG9wcGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAo
bV9wYXJzZXJQYXVzZWQpIHsKKyAgICAgICAgbV9wZW5kaW5nQ2FsbGJhY2tzLT5hcHBlbmRFbmRO
YW1lc3BhY2VEZWNsQ2FsbGJhY2socHJlZml4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIGlmIChwcmVmaXguaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX25hbWVz
cGFjZVRvUHJlZml4TWFwLnJlbW92ZShtX3ByZWZpeFRvTmFtZXNwYWNlTWFwLnRha2UocHJlZml4
KSk7Cit9CisKK2ludCBYTUxEb2N1bWVudFBhcnNlcjo6bm90U3RhbmRhbG9uZSgpCit7CisgICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgZG9jdW1lbnQoKS0+c2V0WE1MU3RhbmRhbG9uZShm
YWxzZSwgZWMpOworICAgIHJldHVybiAxOworfQorCitpbnQgWE1MRG9jdW1lbnRQYXJzZXI6Omxp
bmVOdW1iZXIoKSBjb25zdAoreworICAgIHJldHVybiBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIo
bV9wYXJzZXIpOworfQorCitpbnQgWE1MRG9jdW1lbnRQYXJzZXI6OmNvbHVtbk51bWJlcigpIGNv
bnN0Cit7CisgICAgcmV0dXJuIFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKG1fcGFyc2VyKTsK
K30KKwordm9pZCBYTUxEb2N1bWVudFBhcnNlcjo6c3RvcFBhcnNpbmcoKQoreworICAgIERvY3Vt
ZW50UGFyc2VyOjpzdG9wUGFyc2luZygpOworfQorCit2b2lkIFhNTERvY3VtZW50UGFyc2VyOjpy
ZXN1bWVQYXJzaW5nKCkKK3sKKyAgICBBU1NFUlQobV9wYXJzZXJQYXVzZWQpOworCisgICAgbV9w
YXJzZXJQYXVzZWQgPSBmYWxzZTsKKworICAgIC8vIEZpcnN0LCBleGVjdXRlIGFueSBwZW5kaW5n
IGNhbGxiYWNrcworICAgIHdoaWxlICghbV9wZW5kaW5nQ2FsbGJhY2tzLT5pc0VtcHR5KCkpIHsK
KyAgICAgICAgbV9wZW5kaW5nQ2FsbGJhY2tzLT5jYWxsQW5kUmVtb3ZlRmlyc3RDYWxsYmFjayh0
aGlzKTsKKworICAgICAgICAvLyBBIGNhbGxiYWNrIHBhdXNlZCB0aGUgcGFyc2VyCisgICAgICAg
IGlmIChtX3BhcnNlclBhdXNlZCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAv
LyBUaGVuLCB3cml0ZSBhbnkgcGVuZGluZyBkYXRhCisgICAgU2VnbWVudGVkU3RyaW5nIHJlc3Qg
PSBtX3BlbmRpbmdTcmM7CisgICAgbV9wZW5kaW5nU3JjLmNsZWFyKCk7CisgICAgYXBwZW5kKHJl
c3QpOworCisgICAgLy8gRmluYWxseSwgaWYgZmluaXNoKCkgaGFzIGJlZW4gY2FsbGVkIGFuZCB3
cml0ZSgpIGRpZG4ndCByZXN1bHQKKyAgICAvLyBpbiBhbnkgZnVydGhlciBjYWxsYmFja3MgYmVp
bmcgcXVldWVkLCBjYWxsIGVuZCgpCisgICAgaWYgKG1fZmluaXNoQ2FsbGVkICYmIG1fcGVuZGlu
Z0NhbGxiYWNrcy0+aXNFbXB0eSgpKQorICAgICAgICBlbmQoKTsKK30KKworYm9vbCBYTUxEb2N1
bWVudFBhcnNlcjo6cGFyc2VEb2N1bWVudEZyYWdtZW50KGNvbnN0IFN0cmluZyYgY2h1bmssIERv
Y3VtZW50RnJhZ21lbnQqIGZyYWdtZW50LCBFbGVtZW50KiBwYXJlbnQsIEZyYWdtZW50U2NyaXB0
aW5nUGVybWlzc2lvbiBzY3JpcHRpbmdQZXJtaXNzaW9uKQoreworICAgIGlmICghY2h1bmsubGVu
Z3RoKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgWE1MRG9jdW1lbnRQYXJzZXIgcGFy
c2VyKGZyYWdtZW50LCBwYXJlbnQsIHNjcmlwdGluZ1Blcm1pc3Npb24pOworCisgICAgcGFyc2Vy
LmFwcGVuZChTdHJpbmcoIjxkdW1teWVsZW1lbnQ+IikpOworICAgIHBhcnNlci5hcHBlbmQoY2h1
bmspOworICAgIHBhcnNlci5hcHBlbmQoU3RyaW5nKCI8L2R1bW15ZWxlbWVudD4iKSk7CisgICAg
cGFyc2VyLmZpbmlzaCgpOworICAgIHJldHVybiAhcGFyc2VyLmhhc0Vycm9yKCk7Cit9CisKKwor
c3RydWN0IEF0dHJpYnV0ZVBhcnNlU3RhdGUgeworICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+
IGF0dHJpYnV0ZXM7CisgICAgYm9vbCBnb3RBdHRyaWJ1dGVzOworfTsKKworc3RhdGljIHZvaWQg
WE1MQ0FMTCBhdHRyaWJ1dGVzU3RhcnRFbGVtZW50SGFuZGxlcih2b2lkKiB1c2VyRGF0YSwgY29u
c3QgWE1MX0NoYXIqIG5hbWUsIGNvbnN0IFhNTF9DaGFyKiogYXR0cykKK3sKKyAgICBpZiAoU3Ry
aW5nKG5hbWUpICE9ICJhdHRycyIpCisgICAgICAgIHJldHVybjsKKworICAgIEF0dHJpYnV0ZVBh
cnNlU3RhdGUqIHN0YXRlID0gc3RhdGljX2Nhc3Q8QXR0cmlidXRlUGFyc2VTdGF0ZSo+KHVzZXJE
YXRhKTsKKyAgICBzdGF0ZS0+Z290QXR0cmlidXRlcyA9IHRydWU7CisKKyAgICB3aGlsZSAoKmF0
dHMpIHsKKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVFOYW1lID0gKmF0dHMrKzsKKyAgICAgICAg
U3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gKmF0dHMrKzsKKworICAgICAgICBzdGF0ZS0+YXR0cmli
dXRlcy5zZXQoYXR0cmlidXRlUU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKKyAgICB9Cit9CisKK0hh
c2hNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcnNlQXR0cmlidXRlcyhjb25zdCBTdHJpbmcmIHN0cmlu
ZywgYm9vbCYgYXR0cnNPSykKK3sKKyAgICBBdHRyaWJ1dGVQYXJzZVN0YXRlIHN0YXRlOworICAg
IHN0YXRlLmdvdEF0dHJpYnV0ZXMgPSBmYWxzZTsKKworICAgIFN0cmluZyBwYXJzZVN0cmluZyA9
ICI8YXR0cnMgIiArIHN0cmluZyArICIgLz4iOworCisgICAgWE1MX1BhcnNlciBwYXJzZXIgPSBY
TUxfUGFyc2VyQ3JlYXRlKEwiVVRGLTE2Iik7CisgICAgWE1MX1NldFVzZXJEYXRhKHBhcnNlciwg
JnN0YXRlKTsKKyAgICBYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLCBhdHRyaWJ1dGVzU3Rh
cnRFbGVtZW50SGFuZGxlciwgMCk7CisgICAgWE1MX1BhcnNlKHBhcnNlciwgcmVpbnRlcnByZXRf
Y2FzdDxjb25zdCBjaGFyKj4ocGFyc2VTdHJpbmcuY2hhcmFjdGVycygpKSwgcGFyc2VTdHJpbmcu
bGVuZ3RoKCkgKiBzaXplb2YoVUNoYXIpLCAxKTsKKyAgICBYTUxfUGFyc2VyRnJlZShwYXJzZXIp
OworCisgICAgYXR0cnNPSyA9IHN0YXRlLmdvdEF0dHJpYnV0ZXM7CisgICAgcmV0dXJuIHN0YXRl
LmF0dHJpYnV0ZXM7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKDQpQcm9wZXJ0eSBjaGFu
Z2VzIG9uOiBXZWJDb3JlXGRvbVxYTUxEb2N1bWVudFBhcnNlckV4cGF0LmNwcA0KX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
Xw0KQWRkZWQ6IHN2bjplb2wtc3R5bGUNCiAgICsgbmF0aXZlDQoNCg==
</data>
<flag name="review"
          id="47457"
          type_id="1"
          status="-"
          setter="abarth"
    />
          </attachment>
      

    </bug>

</bugzilla>