<?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>15953</bug_id>
          
          <creation_ts>2007-11-12 04:59:29 -0800</creation_ts>
          <short_desc>Add UTF-8 encoding/decoding to WTF</short_desc>
          <delta_ts>2007-11-14 00:54:02 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Template Framework</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alexey Proskuryakov">ap</reporter>
          <assigned_to name="Alexey Proskuryakov">ap</assigned_to>
          <cc>darin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>60980</commentid>
    <comment_count>0</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2007-11-12 04:59:29 -0800</bug_when>
    <thetext>We have to handle UTF-8 in several places in JavaScriptCore, wtf/unicode looks like a good place to keep this code.

Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>60981</commentid>
    <comment_count>1</comment_count>
      <attachid>17201</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2007-11-12 05:13:13 -0800</bug_when>
    <thetext>Created attachment 17201
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>61044</commentid>
    <comment_count>2</comment_count>
      <attachid>17201</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-11-12 21:25:03 -0800</bug_when>
    <thetext>Comment on attachment 17201
proposed patch

What exactly does JSStringCreateWithUTF8CString do if passed invalid UTF-8? What should it do?

 268      * This method should only be used for *debugging* purposes as it
 269      * is not Unicode safe.

Perhaps that&apos;s overstating the case -- might there be some circumstances where you know it&apos;s an all-ASCII UString?

Should we add a UTF-8 text decoder to WebCore that uses this? Maybe if we did we could get rid of the simple/complex system for ICU, since we could handle the most common encodings without creating much of a text encoding registry at all. And perhaps we could change functions that convert to UTF-8 in WebCore::String to not use the registry.

Looks good, r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>61054</commentid>
    <comment_count>3</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2007-11-12 23:13:51 -0800</bug_when>
    <thetext>Committed revision 27746.

(In reply to comment #2)
&gt; (From update of attachment 17201 [edit])
&gt; What exactly does JSStringCreateWithUTF8CString do if passed invalid UTF-8?

  I have now copied a comment describing strict/lenient modes to UTF8.h. For lenient mode as used by JSStringCreateWithUTF8CString(), it&apos;s:
- both irregular sequences and isolated surrogates are converted;
- illegal sequences will cause an error, and the result will be truncated to the first error position (this includes overlong forms);
- characters over 0x10FFFF are converted to replacement character.

&gt; What should it do?

This may or may not be what it should do, I&apos;m not sure.

&gt;  268      * This method should only be used for *debugging* purposes as it
&gt;  269      * is not Unicode safe.
&gt; 
&gt; Perhaps that&apos;s overstating the case -- might there be some circumstances where
&gt; you know it&apos;s an all-ASCII UString?

I have re-worded the comment.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>61060</commentid>
    <comment_count>4</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2007-11-13 00:03:55 -0800</bug_when>
    <thetext>Yay!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>61084</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2007-11-13 09:10:50 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; - both irregular sequences and isolated surrogates are converted;

What are irregular sequences? You mean things like the sequence for U+FFFE?

Seems OK for isolated surrogates, but also not necessarily useful. Perhaps they should be treated as illegal sequences.

&gt; - illegal sequences will cause an error, and the result will be truncated to the first error position (this includes overlong forms);

I think it&apos;s a problem that this error condition can&apos;t be detected by the caller to JSStringCreateWithUTF8CString; I think it would be better to return 0 when there&apos;s an error. For APIs where there&apos;s both an error indication and a string, I think returning the truncated string arguably might be useful. For some clients, it would be good to be able to report where the error was (say, on the JavaScript console).

&gt; - characters over 0x10FFFF are converted to replacement character.

I would prefer that characters over 0x10FFFF be handled the same way as other illegal sequences.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>61088</commentid>
    <comment_count>6</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2007-11-13 10:11:10 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; &gt; - both irregular sequences and isolated surrogates are converted;
&gt; 
&gt; What are irregular sequences? You mean things like the sequence for U+FFFE?

An irregular UTF-8 code unit sequence is a six-byte sequence where the first three bytes correspond to a high surrogate, and the next three bytes correspond to a low surrogate.

We can change the function to use strict decoding, and to return 0 if an error is detected.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>61192</commentid>
    <comment_count>7</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2007-11-14 00:54:02 -0800</bug_when>
    <thetext>Filed bug 15982.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17201</attachid>
            <date>2007-11-12 05:13:13 -0800</date>
            <delta_ts>2007-11-12 21:25:03 -0800</delta_ts>
            <desc>proposed patch</desc>
            <filename>15953r1_patch.txt</filename>
            <type>text/plain</type>
            <size>35904</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI3NzE2KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDMgQEAKKzIwMDctMTEtMTIgIEFsZXhleSBQ
cm9za3VyeWFrb3YgIDxhcEB3ZWJraXQub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE1OTUzCisgICAgICAgIEFkZCBVVEYtOCBlbmNvZGluZy9kZWNvZGluZyB0byBXVEYKKwor
ICAgICAgICAqIGtqcy91c3RyaW5nLmg6IE1vdmVkIFVURjhTZXF1ZW5jZUxlbmd0aCgpIGFuZCBk
ZWNvZGVVVEY4U2VxdWVuY2UoKSB0byB3dGYvdW5pY29kZS4KKyAgICAgICAgKiBranMvdXN0cmlu
Zy5jcHA6IChLSlM6OlVTdHJpbmc6OlVURjhTdHJpbmcpOiBDaGFuZ2VkIHRoaXMgZnVuY3Rpb24g
dG8gdGFrZSBhIHN0cmljdC9sZW5pZW50CisgICAgICAgIHBhcmFtZXRlci4gQ2FsbGVycyBhcmUg
bm90IGludGVyZXN0ZWQgaW4gZ2V0dGluZyBkZWNvZGluZyByZXN1bHRzIGluIHN0cmljdCBtb2Rl
LCBzbyAKKyAgICAgICAgdGhpcyBhbGxvd3MgZm9yIGJhaWxpbmcgb3V0IGFzIHNvb24gYXMgYW4g
ZXJyb3IgaXMgc2Vlbi4KKworICAgICAgICAqIGtqcy9mdW5jdGlvbi5jcHA6CisgICAgICAgIChL
SlM6OmVuY29kZSk6IFVwZGF0ZWQgZm9yIG5ldyBVU3RyaW5nOjpVVEY4U3RyaW5nKCkgc2lnbmF0
dXJlLgorCisgICAgICAgICogQVBJL0pTU3RyaW5nUmVmLmNwcDoKKyAgICAgICAgKEpTU3RyaW5n
Q3JlYXRlV2l0aENoYXJhY3RlcnMpOiBEaXNhbWJpZ3VhdGUgVUNoYXIuCisgICAgICAgIChKU1N0
cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZyk6IEFjdHVhbGx5IHVzZSBVVEYtOCB3aGVuIGNyZWF0
aW5nIHRoZSBzdHJpbmchCisgICAgICAgICogYmluZGluZ3MvYy9jX3V0aWxpdHkuY3BwOiAoS0pT
OjpCaW5kaW5nczo6Y29udmVydFVURjhUb1VURjE2KTogVXNlIENvbnZlcnRVVEY4VG9VVEYxNigp
LgorCisgICAgICAgICogd3RmL3VuaWNvZGUvVVRGOC5jcHA6IEFkZGVkLgorICAgICAgICAoV1RG
OjpVbmljb2RlOjppbmxpbmVVVEY4U2VxdWVuY2VMZW5ndGhOb25BU0NJSSk6CisgICAgICAgIChX
VEY6OlVuaWNvZGU6OmlubGluZVVURjhTZXF1ZW5jZUxlbmd0aCk6CisgICAgICAgIChXVEY6OlVu
aWNvZGU6OlVURjhTZXF1ZW5jZUxlbmd0aCk6CisgICAgICAgIChXVEY6OlVuaWNvZGU6OmRlY29k
ZVVURjhTZXF1ZW5jZSk6CisgICAgICAgIChXVEY6OlVuaWNvZGU6Oik6CisgICAgICAgIChXVEY6
OlVuaWNvZGU6OkNvbnZlcnRVVEYxNlRvVVRGOCk6CisgICAgICAgIChXVEY6OlVuaWNvZGU6Omlz
TGVnYWxVVEY4KToKKyAgICAgICAgKFdURjo6VW5pY29kZTo6Q29udmVydFVURjhUb1VURjE2KToK
KyAgICAgICAgKiB3dGYvdW5pY29kZS9VVEY4Lmg6IEFkZGVkLgorICAgICAgICAoV1RGOjpVbmlj
b2RlOjopOgorICAgICAgICBTb21lIGNvZGUgbW92ZWQgZnJvbSB1c3RyaW5nLmgsIHNvbWUgYWRh
cHRlZCBmcm9tIHVuaWNvZGUub3JnIHNvdXJjZXMuCisKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29y
ZS5leHA6CisgICAgICAgICogSmF2YVNjcmlwdENvcmUucHJpOgorICAgICAgICAqIEphdmFTY3Jp
cHRDb3JlLnZjcHJvai9XVEYvV1RGLnZjcHJvajoKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29yZS54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIEphdmFTY3JpcHRDb3JlU291cmNl
cy5ia2w6CisgICAgICAgIEFkZGVkIFVURjgue2gsY3BwfQorCiAyMDA3LTExLTEyICBBZGFtIFJv
YmVuICA8YXJvYmVuQGFwcGxlLmNvbT4KIAogICAgICAgICBCdWlsZCBmaXgKSW5kZXg6IEphdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmV4cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29y
ZS9KYXZhU2NyaXB0Q29yZS5leHAJKHJldmlzaW9uIDI3NzE2KQorKysgSmF2YVNjcmlwdENvcmUv
SmF2YVNjcmlwdENvcmUuZXhwCSh3b3JraW5nIGNvcHkpCkBAIC0yNTksNyArMjU5LDcgQEAgX19a
TkszS0pTN0pTVmFsdWUxNXRvSW50MzJTbG93Q2FzZUVQTlNfOQogX19aTkszS0pTN0pTVmFsdWUx
NnRvVUludDMyU2xvd0Nhc2VFUE5TXzlFeGVjU3RhdGVFUmIKIF9fWk5LM0tKUzdKU1ZhbHVlN3Rv
RmxvYXRFUE5TXzlFeGVjU3RhdGVFCiBfX1pOSzNLSlM3SlNWYWx1ZTl0b0ludGVnZXJFUE5TXzlF
eGVjU3RhdGVFCi1fX1pOSzNLSlM3VVN0cmluZzEwVVRGOFN0cmluZ0V2CitfX1pOSzNLSlM3VVN0
cmluZzEwVVRGOFN0cmluZ0ViCiBfX1pOSzNLSlM3VVN0cmluZzE0dG9TdHJpY3RVSW50MzJFUGIK
IF9fWk5LM0tKUzdVU3RyaW5nNWFzY2lpRXYKIF9fWk5LM0tKUzdVU3RyaW5nNmlzOEJpdEV2Cklu
ZGV4OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2
YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJpCShyZXZpc2lvbiAyNzcxNikKKysrIEphdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnByaQkod29ya2luZyBjb3B5KQpAQCAtMzMsNiArMzMs
NyBAQCBTT1VSQ0VTICs9IFwKICAgICB3dGYvQXNzZXJ0aW9ucy5jcHAgXAogICAgIHd0Zi9IYXNo
VGFibGUuY3BwIFwKICAgICB3dGYvRmFzdE1hbGxvYy5jcHAgXAorICAgIHd0Zi91bmljb2RlL1VU
RjguY3BwIFwKICAgICBiaW5kaW5ncy9OUF9qc29iamVjdC5jcHAgXAogICAgIGJpbmRpbmdzL25w
cnVudGltZS5jcHAgXAogICAgIGJpbmRpbmdzL3J1bnRpbWVfYXJyYXkuY3BwIFwKSW5kZXg6IEph
dmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlU291cmNlcy5ia2wKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2
YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmVTb3VyY2VzLmJrbAkocmV2aXNpb24gMjc3MTYpCisr
KyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZVNvdXJjZXMuYmtsCSh3b3JraW5nIGNvcHkp
CkBAIC0xMTMsNiArMTEzLDcgQEAgU291cmNlIGZpbGVzIGZvciBKU0NvcmUuCiAgICAgICAgIHd0
Zi9GYXN0TWFsbG9jLmNwcAogICAgICAgICB3dGYvSGFzaFRhYmxlLmNwcAogICAgICAgICB3dGYv
VENTeXN0ZW1BbGxvYy5jcHAKKyAgICAgICAgd3RmL3VuaWNvZGUvVVRGOC5jcHAKICAgICA8L3Nl
dD4KIAogPC9tYWtlZmlsZT4KSW5kZXg6IEphdmFTY3JpcHRDb3JlL0FQSS9KU1N0cmluZ1JlZi5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvQVBJL0pTU3RyaW5nUmVmLmNwcAkocmV2
aXNpb24gMjc3MTYpCisrKyBKYXZhU2NyaXB0Q29yZS9BUEkvSlNTdHJpbmdSZWYuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zNCwyMCArMzQsMjcgQEAKICNpbmNsdWRlIDxranMvb3BlcmF0aW9ucy5o
PgogI2luY2x1ZGUgPGtqcy91c3RyaW5nLmg+CiAjaW5jbHVkZSA8a2pzL3ZhbHVlLmg+CisjaW5j
bHVkZSA8d3RmL3VuaWNvZGUvVVRGOC5oPgogCiB1c2luZyBuYW1lc3BhY2UgS0pTOwordXNpbmcg
bmFtZXNwYWNlIFdURjo6VW5pY29kZTsKIAogSlNTdHJpbmdSZWYgSlNTdHJpbmdDcmVhdGVXaXRo
Q2hhcmFjdGVycyhjb25zdCBKU0NoYXIqIGNoYXJzLCBzaXplX3QgbnVtQ2hhcnMpCiB7CiAgICAg
SlNMb2NrIGxvY2s7Ci0gICAgcmV0dXJuIHRvUmVmKFVTdHJpbmcocmVpbnRlcnByZXRfY2FzdDxj
b25zdCBVQ2hhcio+KGNoYXJzKSwgc3RhdGljX2Nhc3Q8aW50PihudW1DaGFycykpLnJlcCgpLT5y
ZWYoKSk7CisgICAgcmV0dXJuIHRvUmVmKFVTdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBL
SlM6OlVDaGFyKj4oY2hhcnMpLCBzdGF0aWNfY2FzdDxpbnQ+KG51bUNoYXJzKSkucmVwKCktPnJl
ZigpKTsKIH0KIAogSlNTdHJpbmdSZWYgSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENTdHJpbmcoY29u
c3QgY2hhciogc3RyaW5nKQogewogICAgIEpTTG9jayBsb2NrOwotICAgIC8vIEZJWE1FOiA8cmRh
cjovL3Byb2JsZW0vNDk0OTAxOD4KLSAgICByZXR1cm4gdG9SZWYoVVN0cmluZyhzdHJpbmcpLnJl
cCgpLT5yZWYoKSk7CisKKyAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHN0cmluZyk7CisgICAg
VmVjdG9yPCA6OlVDaGFyLCAxMDI0PiBidWZmZXIobGVuZ3RoKTsKKyAgICA6OlVDaGFyKiBwID0g
YnVmZmVyLmRhdGEoKTsKKyAgICBDb252ZXJ0VVRGOFRvVVRGMTYoJnN0cmluZywgc3RyaW5nICsg
bGVuZ3RoLCAmcCwgcCArIGxlbmd0aCwgZmFsc2UpOworCisgICAgcmV0dXJuIHRvUmVmKFVTdHJp
bmcocmVpbnRlcnByZXRfY2FzdDxLSlM6OlVDaGFyKj4oYnVmZmVyLmRhdGEoKSksIHAgLSBidWZm
ZXIuZGF0YSgpKS5yZXAoKS0+cmVmKCkpOwogfQogCiBKU1N0cmluZ1JlZiBKU1N0cmluZ1JldGFp
bihKU1N0cmluZ1JlZiBzdHJpbmcpCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29y
ZS52Y3Byb2ovV1RGL1dURi52Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvSmF2
YVNjcmlwdENvcmUudmNwcm9qL1dURi9XVEYudmNwcm9qCShyZXZpc2lvbiAyNzcxNikKKysrIEph
dmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJvai9XVEYvV1RGLnZjcHJvagkod29ya2lu
ZyBjb3B5KQpAQCAtMzExLDYgKzMxMSwxNCBAQAogCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlx3dGZc
VmVjdG9yVHJhaXRzLmgiDQogCQkJPg0KIAkJPC9GaWxlPg0KKwkJPEZpbGUNCisJCQlSZWxhdGl2
ZVBhdGg9Ii4uXC4uXHd0Zlx1bmljb2RlXFVURjguaCINCisJCQk+DQorCQk8L0ZpbGU+DQorCQk8
RmlsZQ0KKwkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cd3RmXHVuaWNvZGVcVVRGOC5jcHAiDQorCQkJ
Pg0KKwkJPC9GaWxlPg0KIAk8L0ZpbGVzPg0KIAk8R2xvYmFscz4NCiAJPC9HbG9iYWxzPg0KSW5k
ZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMjc3MTYpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZh
U2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0y
MzIsNiArMjMyLDggQEAKIAkJQThFODk0MzQwQ0QwNjAzRjAwMzY3MTc5IC8qIEpTR2xvYmFsT2Jq
ZWN0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBOEU4
OTQzMzBDRDA2MDNGMDAzNjcxNzkgLyogSlNHbG9iYWxPYmplY3QuaCAqLzsgc2V0dGluZ3MgPSB7
QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQlCQ0Y2NTU1OTBBMjA0OTcxMDAzOEEx
OTQgLyogTWF0aEV4dHJhcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gQkNGNjU1M0IwQTIwNDhERTAwMzhBMTk0IC8qIE1hdGhFeHRyYXMuaCAqLzsgc2V0
dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQlEMjEyMDIyQjBBRDQz
MTBEMDBFRDc5QjYgLyogRGF0ZU1hdGguaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEQyMTIwMjI5MEFENDMxMEMwMEVENzlCNiAvKiBEYXRlTWF0aC5oICov
OyB9OworCQlFMTAyMDNDNzBDRTg0RkIzMDAwQUIzQUEgLyogVVRGOC5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTAyMDNDNjBDRTg0RkIzMDAwQUIz
QUEgLyogVVRGOC5jcHAgKi87IH07CisJCUUxMDIwM0M5MENFODRGQkIwMDBBQjNBQSAvKiBVVEY4
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTAyMDND
ODBDRTg0RkJCMDAwQUIzQUEgLyogVVRGOC5oICovOyB9OwogCQlFMTFENTE3NjBCMkU3OThEMDA1
NkMxODggLyogU3RyaW5nRXh0cmFzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBFMTFENTE3NTBCMkU3OThEMDA1NkMxODggLyogU3RyaW5nRXh0cmFzLmgg
Ki87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJRTE5NTY3
OTYwOUU3Q0YxMjAwQjg5RDEzIC8qIFVuaWNvZGVJY3UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxOTU2NzhGMDlFN0NGMTIwMEI4OUQxMyAvKiBVbmlj
b2RlSWN1LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
IAkJRTE5NTY3OTgwOUU3Q0YxMjAwQjg5RDEzIC8qIFVuaWNvZGUuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxOTU2Nzk0MDlFN0NGMTIwMEI4OUQxMyAv
KiBVbmljb2RlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsg
fTsKQEAgLTU4Niw2ICs1ODgsOCBAQAogCQlCQ0Y2NTUzQjBBMjA0OERFMDAzOEExOTQgLyogTWF0
aEV4dHJhcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMw
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTWF0aEV4dHJhcy5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlEMjEyMDIyODBBRDQzMTBDMDBFRDc5QjYg
LyogRGF0ZU1hdGguY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IERh
dGVNYXRoLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRDIxMjAyMjkwQUQ0MzEw
QzAwRUQ3OUI2IC8qIERhdGVNYXRoLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBEYXRlTWF0aC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFMTAyMDNDNjBDRTg0
RkIzMDAwQUIzQUEgLyogVVRGOC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBVVEY4LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRTEwMjAzQzgwQ0U4
NEZCQjAwMEFCM0FBIC8qIFVURjguaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
VVRGOC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFMTFENTE3NTBCMkU3OThEMDA1
NkMxODggLyogU3RyaW5nRXh0cmFzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IFN0cmluZ0V4dHJhcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFMTk1Njc4RjA5
RTdDRjEyMDBCODlEMTMgLyogVW5pY29kZUljdS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBVbmljb2RlSWN1Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUUxOTU2
Nzk0MDlFN0NGMTIwMEI4OUQxMyAvKiBVbmljb2RlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IFVuaWNvZGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTEwODcs
NiArMTA5MSw4IEBACiAJCQljaGlsZHJlbiA9ICgKIAkJCQlFMTk1Njc4RTA5RTdDRjEyMDBCODlE
MTMgLyogaWN1ICovLAogCQkJCUUxOTU2Nzk0MDlFN0NGMTIwMEI4OUQxMyAvKiBVbmljb2RlLmgg
Ki8sCisJCQkJRTEwMjAzQzgwQ0U4NEZCQjAwMEFCM0FBIC8qIFVURjguaCAqLywKKwkJCQlFMTAy
MDNDNjBDRTg0RkIzMDAwQUIzQUEgLyogVVRGOC5jcHAgKi8sCiAJCQkpOwogCQkJcGF0aCA9IHVu
aWNvZGU7CiAJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwpAQCAtMTI1Myw2ICsxMjU5LDcgQEAK
IAkJCQk5M0UyNkJGRTA4QjE1MUQ0MDBGODUyMjYgLyogdWNwaW50ZXJuYWwuaCBpbiBIZWFkZXJz
ICovLAogCQkJCTkzMkY1QjVDMDgyMkExQzcwMDczNjk3NSAvKiB1c3RyaW5nLmggaW4gSGVhZGVy
cyAqLywKIAkJCQkxNEFCQjM2RjA5OUMwNzY0MDBFMkEyNEYgLyogdmFsdWUuaCBpbiBIZWFkZXJz
ICovLAorCQkJCUUxMDIwM0M5MENFODRGQkIwMDBBQjNBQSAvKiBVVEY4LmggaW4gSGVhZGVycyAq
LywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJ
fTsKQEAgLTEzNjgsNyArMTM3NSw2IEBACiAJCTA4NjdENjkwRkU4NDAyOEZDMDJBQUMwNyAvKiBQ
cm9qZWN0IG9iamVjdCAqLyA9IHsKIAkJCWlzYSA9IFBCWFByb2plY3Q7CiAJCQlidWlsZENvbmZp
Z3VyYXRpb25MaXN0ID0gMTQ5QzI3NzEwODkwMkFGRTAwOEE5RUZDIC8qIEJ1aWxkIGNvbmZpZ3Vy
YXRpb24gbGlzdCBmb3IgUEJYUHJvamVjdCAiSmF2YVNjcmlwdENvcmUiICovOwotCQkJY29tcGF0
aWJpbGl0eVZlcnNpb24gPSAiWGNvZGUgMi40IjsKIAkJCWhhc1NjYW5uZWRGb3JFbmNvZGluZ3Mg
PSAxOwogCQkJbWFpbkdyb3VwID0gMDg2N0Q2OTFGRTg0MDI4RkMwMkFBQzA3IC8qIEphdmFTY3Jp
cHRDb3JlICovOwogCQkJcHJvZHVjdFJlZkdyb3VwID0gMDM0NzY4REZGRjM4QTUwNDExREI5QzhC
IC8qIFByb2R1Y3RzICovOwpAQCAtMTU0MSw2ICsxNTQ3LDcgQEAKIAkJCQk5MzJGNUJCRDA4MjJB
MUM3MDA3MzY5NzUgLyogcnVudGltZV9tZXRob2QuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTMy
RjVCQkEwODIyQTFDNzAwNzM2OTc1IC8qIHJ1bnRpbWVfb2JqZWN0LmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTkzMkY1QkM1MDgyMkExQzcwMDczNjk3NSAvKiBydW50aW1lX3Jvb3QuY3BwIGluIFNv
dXJjZXMgKi8sCisJCQkJRTEwMjAzQzcwQ0U4NEZCMzAwMEFCM0FBIC8qIFVURjguY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9
IDA7CiAJCX07CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9iaW5kaW5ncy9jL2NfdXRpbGl0eS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvYmluZGluZ3MvYy9jX3V0aWxpdHkuY3BwCShy
ZXZpc2lvbiAyNzcxNikKKysrIEphdmFTY3JpcHRDb3JlL2JpbmRpbmdzL2MvY191dGlsaXR5LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMzgsMTAgKzM4LDEwIEBACiAjaW5jbHVkZSAicnVudGltZV9v
YmplY3QuaCIKICNpbmNsdWRlICJydW50aW1lX3Jvb3QuaCIKICNpbmNsdWRlICJQbGF0Zm9ybS5o
IgotI2lmIFVTRShJQ1VfVU5JQ09ERSkKLSNpbmNsdWRlIDx1bmljb2RlL3VjbnYuaD4KLSNlbmRp
ZgogI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL3VuaWNvZGUvVVRG
OC5oPgorCit1c2luZyBuYW1lc3BhY2UgV1RGOjpVbmljb2RlOwogCiBuYW1lc3BhY2UgS0pTIHsg
bmFtZXNwYWNlIEJpbmRpbmdzIHsKIApAQCAtNTIsNDYgKzUyLDQwIEBAIHZvaWQgY29udmVydE5Q
U3RyaW5nVG9VVEYxNihjb25zdCBOUFN0cmkKIH0KIAogLy8gUmVxdWlyZXMgZnJlZSgpIG9mIHJl
dHVybmVkIFVURjE2Q2hhcnMuCi12b2lkIGNvbnZlcnRVVEY4VG9VVEYxNihjb25zdCBOUFVURjgg
KlVURjhDaGFycywgaW50IFVURjhMZW5ndGgsIE5QVVRGMTYgKipVVEYxNkNoYXJzLCB1bnNpZ25l
ZCBpbnQgKlVURjE2TGVuZ3RoKQordm9pZCBjb252ZXJ0VVRGOFRvVVRGMTYoY29uc3QgTlBVVEY4
KiBVVEY4Q2hhcnMsIGludCBVVEY4TGVuZ3RoLCBOUFVURjE2KiogVVRGMTZDaGFycywgdW5zaWdu
ZWQgaW50KiBVVEYxNkxlbmd0aCkKIHsKLSNpZiBVU0UoSUNVX1VOSUNPREUpCiAgICAgQVNTRVJU
KFVURjhDaGFycyB8fCBVVEY4TGVuZ3RoID09IDApOwogICAgIEFTU0VSVChVVEYxNkNoYXJzKTsK
ICAgICAKICAgICBpZiAoVVRGOExlbmd0aCA9PSAtMSkKICAgICAgICAgVVRGOExlbmd0aCA9IHN0
YXRpY19jYXN0PGludD4oc3RybGVuKFVURjhDaGFycykpOwotICAgICAgICAKLSAgICAvLyBVVEYx
Nkxlbmd0aCBtYXhpbXVtIGxlbmd0aCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBVVEY4IHN0cmluZywg
cGx1cyBvbmUgdG8gaW5jbHVkZSB0ZXJtaW5hdG9yCi0gICAgLy8gV2l0aG91dCB0aGUgcGx1cyBv
bmUsIGl0IHdpbGwgY29udmVydCBvaywgYnV0IGEgd2FybmluZyBpcyBnZW5lcmF0ZWQgZnJvbSB0
aGUgY29udmVydGVyIGFzCi0gICAgLy8gdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGZvciBhIHRl
cm1pbmF0aW5nIGNoYXJhY3Rlci4KLSAgICAqVVRGMTZMZW5ndGggPSBVVEY4TGVuZ3RoICsgMTsg
Ci0gICAgICAgIAotICAgICpVVEYxNkNoYXJzID0gMDsKLSAgICBVRXJyb3JDb2RlIHN0YXR1cyA9
IFVfWkVST19FUlJPUjsKLSAgICBVQ29udmVydGVyKiBjb252ID0gdWNudl9vcGVuKCJ1dGY4Iiwg
JnN0YXR1cyk7Ci0gICAgaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7IAotICAgICAgICAqVVRGMTZD
aGFycyA9IChOUFVURjE2ICopbWFsbG9jKHNpemVvZihOUFVURjE2KSAqICgqVVRGMTZMZW5ndGgp
KTsKLSAgICAgICAgdWNudl9zZXRUb1VDYWxsQmFjayhjb252LCBVQ05WX1RPX1VfQ0FMTEJBQ0tf
U1RPUCwgMCwgMCwgMCwgJnN0YXR1cyk7Ci0gICAgICAgICpVVEYxNkxlbmd0aCA9IHVjbnZfdG9V
Q2hhcnMoY29udiwgKDo6VUNoYXIqKSpVVEYxNkNoYXJzLCAqVVRGMTZMZW5ndGgsIFVURjhDaGFy
cywgVVRGOExlbmd0aCwgJnN0YXR1cyk7IAotICAgICAgICB1Y252X2Nsb3NlKGNvbnYpOwotICAg
IH0gCisKKyAgICAqVVRGMTZMZW5ndGggPSBVVEY4TGVuZ3RoOyAKKyAgICAqVVRGMTZDaGFycyA9
IHN0YXRpY19jYXN0PE5QVVRGMTYqPihtYWxsb2Moc2l6ZW9mKE5QVVRGMTYpICogKCpVVEYxNkxl
bmd0aCkpKTsKICAgICAKKyAgICBjb25zdCBjaGFyKiBzb3VyY2VzdGFydCA9IFVURjhDaGFyczsK
KyAgICBjb25zdCBjaGFyKiBzb3VyY2VlbmQgPSBzb3VyY2VzdGFydCArIFVURjhMZW5ndGg7CisK
KyAgICA6OlVDaGFyKiB0YXJnZXRzdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IDo6VUNoYXIqPigq
VVRGMTZDaGFycyk7CisgICAgOjpVQ2hhciogdGFyZ2V0ZW5kID0gdGFyZ2V0c3RhcnQgKyBVVEY4
TGVuZ3RoOworICAgIAorICAgIENvbnZlcnNpb25SZXN1bHQgcmVzdWx0ID0gQ29udmVydFVURjhU
b1VURjE2KCZzb3VyY2VzdGFydCwgc291cmNlZW5kLCAmdGFyZ2V0c3RhcnQsIHRhcmdldGVuZCwg
dHJ1ZSk7CisgICAgCisgICAgKlVURjE2TGVuZ3RoID0gdGFyZ2V0c3RhcnQgLSAqVVRGMTZDaGFy
czsKKwogICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1
bAogICAgIC8vIFNvbWUgcGx1Z2lucyByZXR1cm4gaW52YWxpZCBVVEYtOCBpbiBOUFZhcmlhbnRU
eXBlX1N0cmluZywgc2VlIDxodHRwOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01
MTYzPgogICAgIC8vIFRoZXJlIGlzIG5vICJiYWQgZGF0YSIgZm9yIGxhdGluMS4gSXQgaXMgdW5s
aWtlbHkgdGhhdCB0aGUgcGx1Z2luIHdhcyByZWFsbHkgc2VuZGluZyB0ZXh0IGluIHRoaXMgZW5j
b2RpbmcsCiAgICAgLy8gYnV0IGl0IHNob3VsZCBoYXZlIHVzZWQgVVRGLTgsIGFuZCBub3cgd2Ug
YXJlIHNpbXBseSBhdm9pZGluZyBhIGNyYXNoLgotICAgIGlmICghVV9TVUNDRVNTKHN0YXR1cykp
IHsKKyAgICBpZiAocmVzdWx0ICE9IGNvbnZlcnNpb25PSykgewogICAgICAgICAqVVRGMTZMZW5n
dGggPSBVVEY4TGVuZ3RoOwogICAgICAgICAKICAgICAgICAgaWYgKCEqVVRGMTZDaGFycykgICAv
LyBJZiB0aGUgbWVtb3J5IHdhc24ndCBhbGxvY2F0ZWQsIGFsbG9jYXRlIGl0LgotICAgICAgICAg
ICAgKlVURjE2Q2hhcnMgPSAoTlBVVEYxNiAqKW1hbGxvYyhzaXplb2YoTlBVVEYxNikgKiAoKlVU
RjE2TGVuZ3RoKSk7CisgICAgICAgICAgICAqVVRGMTZDaGFycyA9IChOUFVURjE2KiltYWxsb2Mo
c2l6ZW9mKE5QVVRGMTYpICogKCpVVEYxNkxlbmd0aCkpOwogIAogICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgKlVURjE2TGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAoKlVURjE2Q2hh
cnMpW2ldID0gVVRGOENoYXJzW2ldICYgMHhGRjsKICAgICB9Ci0jZWxzZQotICAgIEFTU0VSVCgh
IkltcGxlbWVudCBtZSEiKTsgICAgCi0jZW5kaWYKIH0KIAogLy8gVmFyaWFudCB2YWx1ZSBtdXN0
IGJlIHJlbGVhc2VkIHdpdGggTlBSZWxlYXNlVmFyaWFudFZhbHVlKCkKSW5kZXg6IEphdmFTY3Jp
cHRDb3JlL2tqcy9mdW5jdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pz
L2Z1bmN0aW9uLmNwcAkocmV2aXNpb24gMjc3MTYpCisrKyBKYXZhU2NyaXB0Q29yZS9ranMvZnVu
Y3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSA8d3Rm
L0FTQ0lJQ1R5cGUuaD4KICNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgogI2luY2x1ZGUgPHd0
Zi9NYXRoRXh0cmFzLmg+Ci0jaW5jbHVkZSA8d3RmL3VuaWNvZGUvVW5pY29kZS5oPgorI2luY2x1
ZGUgPHd0Zi91bmljb2RlL1VURjguaD4KIAogdXNpbmcgbmFtZXNwYWNlIFdURjsKIHVzaW5nIG5h
bWVzcGFjZSBVbmljb2RlOwpAQCAtNTE0LDkgKzUxNCw4IEBAIEdsb2JhbEZ1bmNJbXA6Okdsb2Jh
bEZ1bmNJbXAoRXhlY1N0YXRlKiAKIHN0YXRpYyBKU1ZhbHVlKiBlbmNvZGUoRXhlY1N0YXRlKiBl
eGVjLCBjb25zdCBMaXN0JiBhcmdzLCBjb25zdCBjaGFyKiBkb19ub3RfZXNjYXBlKQogewogICBV
U3RyaW5nIHIgPSAiIiwgcywgc3RyID0gYXJnc1swXS0+dG9TdHJpbmcoZXhlYyk7Ci0gIGJvb2wg
d2FzR29vZFVURjE2OwotICBDU3RyaW5nIGNzdHIgPSBzdHIuVVRGOFN0cmluZygmd2FzR29vZFVU
RjE2KTsKLSAgaWYgKCF3YXNHb29kVVRGMTYpCisgIENTdHJpbmcgY3N0ciA9IHN0ci5VVEY4U3Ry
aW5nKHRydWUpOworICBpZiAoIWNzdHIuY19zdHIoKSkKICAgICByZXR1cm4gdGhyb3dFcnJvcihl
eGVjLCBVUklFcnJvciwgIlN0cmluZyBjb250YWluZWQgYW4gaWxsZWdhbCBVVEYtMTYgc2VxdWVu
Y2UuIik7CiAgIGNvbnN0IGNoYXIqIHAgPSBjc3RyLmNfc3RyKCk7CiAgIGZvciAoc2l6ZV90IGsg
PSAwOyBrIDwgY3N0ci5zaXplKCk7IGsrKywgcCsrKSB7CkluZGV4OiBKYXZhU2NyaXB0Q29yZS9r
anMvdXN0cmluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUva2pzL3VzdHJpbmcu
Y3BwCShyZXZpc2lvbiAyNzcxNikKKysrIEphdmFTY3JpcHRDb3JlL2tqcy91c3RyaW5nLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMTI3MSwxNDUgKzEyNzEsMjAgQEAgaW50IGNvbXBhcmUoY29uc3Qg
VVN0cmluZyYgczEsIGNvbnN0IFVTdAogICByZXR1cm4gKGwxID4gbDIpID8gMSA6IC0xOwogfQog
Ci1pbmxpbmUgaW50IGlubGluZVVURjhTZXF1ZW5jZUxlbmd0aE5vbkFTQ0lJKGNoYXIgYjApCitD
U3RyaW5nIFVTdHJpbmc6OlVURjhTdHJpbmcoYm9vbCBzdHJpY3QpIGNvbnN0CiB7Ci0gIGlmICgo
YjAgJiAweEMwKSAhPSAweEMwKQotICAgIHJldHVybiAwOwotICBpZiAoKGIwICYgMHhFMCkgPT0g
MHhDMCkKLSAgICByZXR1cm4gMjsKLSAgaWYgKChiMCAmIDB4RjApID09IDB4RTApCi0gICAgcmV0
dXJuIDM7Ci0gIGlmICgoYjAgJiAweEY4KSA9PSAweEYwKQotICAgIHJldHVybiA0OwotICByZXR1
cm4gMDsKLX0KLQotaW50IFVURjhTZXF1ZW5jZUxlbmd0aE5vbkFTQ0lJKGNoYXIgYjApCi17Ci0g
IHJldHVybiBpbmxpbmVVVEY4U2VxdWVuY2VMZW5ndGhOb25BU0NJSShiMCk7Ci19Ci0KLWlubGlu
ZSBpbnQgaW5saW5lVVRGOFNlcXVlbmNlTGVuZ3RoKGNoYXIgYjApCi17Ci0gIHJldHVybiAoYjAg
JiAweDgwKSA9PSAwID8gMSA6IFVURjhTZXF1ZW5jZUxlbmd0aE5vbkFTQ0lJKGIwKTsKLX0KLQot
Ly8gR2l2ZW4gYSBmaXJzdCBieXRlLCBnaXZlcyB0aGUgbGVuZ3RoIG9mIHRoZSBVVEYtOCBzZXF1
ZW5jZSBpdCBiZWdpbnMuCi0vLyBSZXR1cm5zIDAgZm9yIGJ5dGVzIHRoYXQgYXJlIG5vdCBsZWdh
bCBzdGFydHMgb2YgVVRGLTggc2VxdWVuY2VzLgotLy8gT25seSBhbGxvd3Mgc2VxdWVuY2VzIG9m
IHVwIHRvIDQgYnl0ZXMsIHNpbmNlIHRoYXQgd29ya3MgZm9yIGFsbCBVbmljb2RlIGNoYXJhY3Rl
cnMgKFUtMDAwMDAwMDAgdG8gVS0wMDEwRkZGRikuCi1pbnQgVVRGOFNlcXVlbmNlTGVuZ3RoKGNo
YXIgYjApCi17Ci0gIHJldHVybiAoYjAgJiAweDgwKSA9PSAwID8gMSA6IGlubGluZVVURjhTZXF1
ZW5jZUxlbmd0aE5vbkFTQ0lJKGIwKTsKLX0KLQotLy8gVGFrZXMgYSBudWxsLXRlcm1pbmF0ZWQg
Qy1zdHlsZSBzdHJpbmcgd2l0aCBhIFVURi04IHNlcXVlbmNlIGluIGl0IGFuZCBjb252ZXJ0cyBp
dCB0byBhIGNoYXJhY3Rlci4KLS8vIE9ubHkgYWxsb3dzIFVuaWNvZGUgY2hhcmFjdGVycyAoVS0w
MDAwMDAwMCB0byBVLTAwMTBGRkZGKS4KLS8vIFJldHVybnMgLTEgaWYgdGhlIHNlcXVlbmNlIGlz
IG5vdCB2YWxpZCAoaW5jbHVkaW5nIHByZXNlbmNlIG9mIGV4dHJhIGJ5dGVzKS4KLWludCBkZWNv
ZGVVVEY4U2VxdWVuY2UoY29uc3QgY2hhciAqc2VxdWVuY2UpCi17Ci0gIC8vIEhhbmRsZSAwLWJ5
dGUgc2VxdWVuY2VzIChuZXZlciB2YWxpZCkuCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgYjAgPSBz
ZXF1ZW5jZVswXTsKLSAgY29uc3QgaW50IGxlbmd0aCA9IGlubGluZVVURjhTZXF1ZW5jZUxlbmd0
aChiMCk7Ci0gIGlmIChsZW5ndGggPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgLy8gSGFuZGxl
IDEtYnl0ZSBzZXF1ZW5jZXMgKHBsYWluIEFTQ0lJKS4KLSAgY29uc3QgdW5zaWduZWQgY2hhciBi
MSA9IHNlcXVlbmNlWzFdOwotICBpZiAobGVuZ3RoID09IDEpIHsKLSAgICBpZiAoYjEpCi0gICAg
ICByZXR1cm4gLTE7Ci0gICAgcmV0dXJuIGIwOwotICB9Ci0KLSAgLy8gSGFuZGxlIDItYnl0ZSBz
ZXF1ZW5jZXMuCi0gIGlmICgoYjEgJiAweEMwKSAhPSAweDgwKQotICAgIHJldHVybiAtMTsKLSAg
Y29uc3QgdW5zaWduZWQgY2hhciBiMiA9IHNlcXVlbmNlWzJdOwotICBpZiAobGVuZ3RoID09IDIp
IHsKLSAgICBpZiAoYjIpCi0gICAgICByZXR1cm4gLTE7Ci0gICAgY29uc3QgaW50IGMgPSAoKGIw
ICYgMHgxRikgPDwgNikgfCAoYjEgJiAweDNGKTsKLSAgICBpZiAoYyA8IDB4ODApCi0gICAgICBy
ZXR1cm4gLTE7Ci0gICAgcmV0dXJuIGM7Ci0gIH0KLQotICAvLyBIYW5kbGUgMy1ieXRlIHNlcXVl
bmNlcy4KLSAgaWYgKChiMiAmIDB4QzApICE9IDB4ODApCi0gICAgcmV0dXJuIC0xOwotICBjb25z
dCB1bnNpZ25lZCBjaGFyIGIzID0gc2VxdWVuY2VbM107Ci0gIGlmIChsZW5ndGggPT0gMykgewot
ICAgIGlmIChiMykKLSAgICAgIHJldHVybiAtMTsKLSAgICBjb25zdCBpbnQgYyA9ICgoYjAgJiAw
eEYpIDw8IDEyKSB8ICgoYjEgJiAweDNGKSA8PCA2KSB8IChiMiAmIDB4M0YpOwotICAgIGlmIChj
IDwgMHg4MDApCi0gICAgICByZXR1cm4gLTE7Ci0gICAgLy8gVVRGLTE2IHN1cnJvZ2F0ZXMgc2hv
dWxkIG5ldmVyIGFwcGVhciBpbiBVVEYtOCBkYXRhLgotICAgIGlmIChjID49IDB4RDgwMCAmJiBj
IDw9IDB4REZGRikKLSAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gYzsKLSAgfQotCi0gIC8v
IEhhbmRsZSA0LWJ5dGUgc2VxdWVuY2VzLgotICBpZiAoKGIzICYgMHhDMCkgIT0gMHg4MCkKLSAg
ICByZXR1cm4gLTE7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgYjQgPSBzZXF1ZW5jZVs0XTsKLSAg
aWYgKGxlbmd0aCA9PSA0KSB7Ci0gICAgaWYgKGI0KQotICAgICAgcmV0dXJuIC0xOwotICAgIGNv
bnN0IGludCBjID0gKChiMCAmIDB4NykgPDwgMTgpIHwgKChiMSAmIDB4M0YpIDw8IDEyKSB8ICgo
YjIgJiAweDNGKSA8PCA2KSB8IChiMyAmIDB4M0YpOwotICAgIGlmIChjIDwgMHgxMDAwMCB8fCBj
ID4gMHgxMEZGRkYpCi0gICAgICByZXR1cm4gLTE7Ci0gICAgcmV0dXJuIGM7Ci0gIH0KLQotICBy
ZXR1cm4gLTE7Ci19Ci0KLUNTdHJpbmcgVVN0cmluZzo6VVRGOFN0cmluZyhib29sKiB1dGYxNldh
c0dvb2QpIGNvbnN0Ci17Ci0gIGlmICh1dGYxNldhc0dvb2QpCi0gICAgKnV0ZjE2V2FzR29vZCA9
IHRydWU7Ci0KICAgLy8gQWxsb2NhdGUgYSBidWZmZXIgYmlnIGVub3VnaCB0byBob2xkIGFsbCB0
aGUgY2hhcmFjdGVycy4KICAgY29uc3QgaW50IGxlbmd0aCA9IHNpemUoKTsKICAgVmVjdG9yPGNo
YXIsIDEwMjQ+IGJ1ZmZlcihsZW5ndGggKiAzKTsKIAogICAvLyBDb252ZXJ0IHRvIHJ1bnMgb2Yg
OC1iaXQgY2hhcmFjdGVycy4KLSAgY2hhciAqcCA9IGJ1ZmZlci5iZWdpbigpOwotICBjb25zdCBV
Q2hhciAqZCA9IGRhdGEoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgIT0gbGVuZ3RoOyArK2kpIHsK
LSAgICB1bnNpZ25lZCBzaG9ydCBjID0gZFtpXS51bmljb2RlKCk7Ci0gICAgaWYgKGMgPCAweDgw
KSB7Ci0gICAgICAqcCsrID0gKGNoYXIpYzsKLSAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkgewot
ICAgICAgKnArKyA9IChjaGFyKSgoYyA+PiA2KSB8IDB4QzApOyAvLyBDMCBpcyB0aGUgMi1ieXRl
IGZsYWcgZm9yIFVURi04Ci0gICAgICAqcCsrID0gKGNoYXIpKChjIHwgMHg4MCkgJiAweEJGKTsg
Ly8gbmV4dCA2IGJpdHMsIHdpdGggaGlnaCBiaXQgc2V0Ci0gICAgfSBlbHNlIGlmIChjID49IDB4
RDgwMCAmJiBjIDw9IDB4REJGRiAmJiBpIDwgbGVuZ3RoICYmIGRbaSsxXS51YyA+PSAweERDMDAg
JiYgZFtpKzFdLnVjIDw9IDB4REZGRikgewotICAgICAgdW5zaWduZWQgc2MgPSAweDEwMDAwICsg
KCgoYyAmIDB4M0ZGKSA8PCAxMCkgfCAoZFtpKzFdLnVjICYgMHgzRkYpKTsKLSAgICAgICpwKysg
PSAoY2hhcikoKHNjID4+IDE4KSB8IDB4RjApOyAvLyBGMCBpcyB0aGUgNC1ieXRlIGZsYWcgZm9y
IFVURi04Ci0gICAgICAqcCsrID0gKGNoYXIpKCgoc2MgPj4gMTIpIHwgMHg4MCkgJiAweEJGKTsg
Ly8gbmV4dCA2IGJpdHMsIHdpdGggaGlnaCBiaXQgc2V0Ci0gICAgICAqcCsrID0gKGNoYXIpKCgo
c2MgPj4gNikgfCAweDgwKSAmIDB4QkYpOyAvLyBuZXh0IDYgYml0cywgd2l0aCBoaWdoIGJpdCBz
ZXQKLSAgICAgICpwKysgPSAoY2hhcikoKHNjIHwgMHg4MCkgJiAweEJGKTsgLy8gbmV4dCA2IGJp
dHMsIHdpdGggaGlnaCBiaXQgc2V0Ci0gICAgICArK2k7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlm
ICh1dGYxNldhc0dvb2QgJiYgYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYpCi0gICAgICAgICp1
dGYxNldhc0dvb2QgPSBmYWxzZTsKLSAgICAgICpwKysgPSAoY2hhcikoKGMgPj4gMTIpIHwgMHhF
MCk7IC8vIEUwIGlzIHRoZSAzLWJ5dGUgZmxhZyBmb3IgVVRGLTgKLSAgICAgICpwKysgPSAoY2hh
cikoKChjID4+IDYpIHwgMHg4MCkgJiAweEJGKTsgLy8gbmV4dCA2IGJpdHMsIHdpdGggaGlnaCBi
aXQgc2V0Ci0gICAgICAqcCsrID0gKGNoYXIpKChjIHwgMHg4MCkgJiAweEJGKTsgLy8gbmV4dCA2
IGJpdHMsIHdpdGggaGlnaCBiaXQgc2V0Ci0gICAgfQotICB9Ci0KLSAgLy8gUmV0dXJuIHRoZSBy
ZXN1bHQgYXMgYSBDIHN0cmluZy4KLSAgQ1N0cmluZyByZXN1bHQoYnVmZmVyLmRhdGEoKSwgcCAt
IGJ1ZmZlci5kYXRhKCkpOworICBjaGFyKiBwID0gYnVmZmVyLmRhdGEoKTsKKyAgY29uc3QgOjpV
Q2hhciogZCA9ICZkYXRhKCktPnVjOworICBDb252ZXJzaW9uUmVzdWx0IHJlc3VsdCA9IENvbnZl
cnRVVEYxNlRvVVRGOCgmZCwgZCArIGxlbmd0aCwgJnAsIHAgKyBidWZmZXIuc2l6ZSgpLCBzdHJp
Y3QpOworICBpZiAocmVzdWx0ICE9IGNvbnZlcnNpb25PSykKKyAgICByZXR1cm4gQ1N0cmluZygp
OwogCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLUNTdHJpbmcgVVN0cmluZzo6VVRGOFN0cmluZygp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIFVURjhTdHJpbmcoMCk7CisgIHJldHVybiBDU3RyaW5nKGJ1
ZmZlci5kYXRhKCksIHAgLSBidWZmZXIuZGF0YSgpKTsKIH0KIAogCkluZGV4OiBKYXZhU2NyaXB0
Q29yZS9ranMvdXN0cmluZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2tqcy91c3Ry
aW5nLmgJKHJldmlzaW9uIDI3NzE2KQorKysgSmF2YVNjcmlwdENvcmUva2pzL3VzdHJpbmcuaAko
d29ya2luZyBjb3B5KQpAQCAtMjY1LDYgKzI2NSw4IEBAIG5hbWVzcGFjZSBLSlMgewogCiAgICAg
LyoqCiAgICAgICogQHJldHVybiBUaGUgc3RyaW5nIGNvbnZlcnRlZCB0byB0aGUgOC1iaXQgc3Ry
aW5nIHR5cGUgQ1N0cmluZygpLgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVz
ZWQgZm9yICpkZWJ1Z2dpbmcqIHB1cnBvc2VzIGFzIGl0CisgICAgICogaXMgbm90IFVuaWNvZGUg
c2FmZS4KICAgICAgKi8KICAgICBDU3RyaW5nIGNzdHJpbmcoKSBjb25zdDsKICAgICAvKioKQEAg
LTI3OCwxMyArMjgwLDEzIEBAIG5hbWVzcGFjZSBLSlMgewogCiAgICAgLyoqCiAgICAgICogQ29u
dmVydCB0aGUgc3RyaW5nIHRvIFVURi04LCBhc3N1bWluZyBpdCBpcyBVVEYtMTYgZW5jb2RlZC4K
LSAgICAgKiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHRvbGVyYW50IG9mIGJhZGx5IGZvcm1lZCBV
VEYtMTYsIGl0IGNhbiBjcmVhdGUgVVRGLTgKLSAgICAgKiBzdHJpbmdzIHRoYXQgYXJlIGludmFs
aWQgYmVjYXVzZSB0aGV5IGhhdmUgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UKLSAgICAgKiBVK0Q4
MDAtVStEREZGLCBVK0ZGRkUsIG9yIFUrRkZGRiwgYnV0IHRoZSBVVEYtOCBzdHJpbmcgaXMgZ3Vh
cmFudGVlZCB0bwotICAgICAqIGJlIG90aGVyd2lzZSB2YWxpZC4KKyAgICAgKiBJbiBub24tc3Ry
aWN0IG1vZGUsIHRoaXMgZnVuY3Rpb24gaXMgdG9sZXJhbnQgb2YgYmFkbHkgZm9ybWVkIFVURi0x
NiwgaXQKKyAgICAgKiBjYW4gY3JlYXRlIFVURi04IHN0cmluZ3MgdGhhdCBhcmUgaW52YWxpZCBi
ZWNhdXNlIHRoZXkgaGF2ZSBjaGFyYWN0ZXJzIGluCisgICAgICogdGhlIHJhbmdlIFUrRDgwMC1V
K0RERkYsIFUrRkZGRSwgb3IgVStGRkZGLCBidXQgdGhlIFVURi04IHN0cmluZyBpcworICAgICAq
IGd1YXJhbnRlZWQgdG8gYmUgb3RoZXJ3aXNlIHZhbGlkLgorICAgICAqIEluIHN0cmljdCBtb2Rl
LCBlcnJvciBpcyByZXR1cm5lZCBhcyBudWxsIENTdHJpbmcuCiAgICAgICovCi0gICAgQ1N0cmlu
ZyBVVEY4U3RyaW5nKCkgY29uc3Q7Ci0gICAgQ1N0cmluZyBVVEY4U3RyaW5nKGJvb2wqIHV0ZjE2
V2FzR29vZCkgY29uc3Q7CisgICAgQ1N0cmluZyBVVEY4U3RyaW5nKGJvb2wgc3RyaWN0ID0gZmFs
c2UpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogQHNlZSBVU3RyaW5nKGNvbnN0IERPTTo6RE9N
U3RyaW5nJikuCkBAIC00MjcsMTYgKzQyOSw2IEBAIG5hbWVzcGFjZSBLSlMgewogICAKICAgaW50
IGNvbXBhcmUoY29uc3QgVVN0cmluZyAmLCBjb25zdCBVU3RyaW5nICYpOwogCi0gIC8vIEdpdmVu
IGEgZmlyc3QgYnl0ZSwgZ2l2ZXMgdGhlIGxlbmd0aCBvZiB0aGUgVVRGLTggc2VxdWVuY2UgaXQg
YmVnaW5zLgotICAvLyBSZXR1cm5zIDAgZm9yIGJ5dGVzIHRoYXQgYXJlIG5vdCBsZWdhbCBzdGFy
dHMgb2YgVVRGLTggc2VxdWVuY2VzLgotICAvLyBPbmx5IGFsbG93cyBzZXF1ZW5jZXMgb2YgdXAg
dG8gNCBieXRlcywgc2luY2UgdGhhdCB3b3JrcyBmb3IgYWxsIFVuaWNvZGUgY2hhcmFjdGVycyAo
VS0wMDAwMDAwMCB0byBVLTAwMTBGRkZGKS4KLSAgaW50IFVURjhTZXF1ZW5jZUxlbmd0aChjaGFy
KTsKLQotICAvLyBUYWtlcyBhIG51bGwtdGVybWluYXRlZCBDLXN0eWxlIHN0cmluZyB3aXRoIGEg
VVRGLTggc2VxdWVuY2UgaW4gaXQgYW5kIGNvbnZlcnRzIGl0IHRvIGEgY2hhcmFjdGVyLgotICAv
LyBPbmx5IGFsbG93cyBVbmljb2RlIGNoYXJhY3RlcnMgKFUtMDAwMDAwMDAgdG8gVS0wMDEwRkZG
RikuCi0gIC8vIFJldHVybnMgLTEgaWYgdGhlIHNlcXVlbmNlIGlzIG5vdCB2YWxpZCAoaW5jbHVk
aW5nIHByZXNlbmNlIG9mIGV4dHJhIGJ5dGVzKS4KLSAgaW50IGRlY29kZVVURjhTZXF1ZW5jZShj
b25zdCBjaGFyICopOwotCiBpbmxpbmUgVVN0cmluZzo6VVN0cmluZygpCiAgIDogbV9yZXAoJlJl
cDo6bnVsbCkKIHsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi91bmljb2RlL1VURjguY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi91bmljb2RlL1VURjguY3BwCShyZXZpc2lv
biAwKQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvVVRGOC5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJVVEY4LmgiCisKK25hbWVz
cGFjZSBXVEYgeworbmFtZXNwYWNlIFVuaWNvZGUgeworCitpbmxpbmUgaW50IGlubGluZVVURjhT
ZXF1ZW5jZUxlbmd0aE5vbkFTQ0lJKGNoYXIgYjApCit7CisgICAgaWYgKChiMCAmIDB4QzApICE9
IDB4QzApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICgoYjAgJiAweEUwKSA9PSAweEMwKQor
ICAgICAgICByZXR1cm4gMjsKKyAgICBpZiAoKGIwICYgMHhGMCkgPT0gMHhFMCkKKyAgICAgICAg
cmV0dXJuIDM7CisgICAgaWYgKChiMCAmIDB4RjgpID09IDB4RjApCisgICAgICAgIHJldHVybiA0
OworICAgIHJldHVybiAwOworfQorCitpbmxpbmUgaW50IGlubGluZVVURjhTZXF1ZW5jZUxlbmd0
aChjaGFyIGIwKQoreworICAgIHJldHVybiAoYjAgJiAweDgwKSA9PSAwID8gMSA6IGlubGluZVVU
RjhTZXF1ZW5jZUxlbmd0aE5vbkFTQ0lJKGIwKTsKK30KKworaW50IFVURjhTZXF1ZW5jZUxlbmd0
aChjaGFyIGIwKQoreworICAgIHJldHVybiAoYjAgJiAweDgwKSA9PSAwID8gMSA6IGlubGluZVVU
RjhTZXF1ZW5jZUxlbmd0aE5vbkFTQ0lJKGIwKTsKK30KKworaW50IGRlY29kZVVURjhTZXF1ZW5j
ZShjb25zdCBjaGFyKiBzZXF1ZW5jZSkKK3sKKyAgICAvLyBIYW5kbGUgMC1ieXRlIHNlcXVlbmNl
cyAobmV2ZXIgdmFsaWQpLgorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgYjAgPSBzZXF1ZW5jZVsw
XTsKKyAgICBjb25zdCBpbnQgbGVuZ3RoID0gaW5saW5lVVRGOFNlcXVlbmNlTGVuZ3RoKGIwKTsK
KyAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vIEhhbmRs
ZSAxLWJ5dGUgc2VxdWVuY2VzIChwbGFpbiBBU0NJSSkuCisgICAgY29uc3QgdW5zaWduZWQgY2hh
ciBiMSA9IHNlcXVlbmNlWzFdOworICAgIGlmIChsZW5ndGggPT0gMSkgeworICAgICAgICBpZiAo
YjEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBiMDsKKyAgICB9CisK
KyAgICAvLyBIYW5kbGUgMi1ieXRlIHNlcXVlbmNlcy4KKyAgICBpZiAoKGIxICYgMHhDMCkgIT0g
MHg4MCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgYjIgPSBz
ZXF1ZW5jZVsyXTsKKyAgICBpZiAobGVuZ3RoID09IDIpIHsKKyAgICAgICAgaWYgKGIyKQorICAg
ICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjb25zdCBpbnQgYyA9ICgoYjAgJiAweDFGKSA8
PCA2KSB8IChiMSAmIDB4M0YpOworICAgICAgICBpZiAoYyA8IDB4ODApCisgICAgICAgICAgICBy
ZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBjOworICAgIH0KKworICAgIC8vIEhhbmRsZSAzLWJ5
dGUgc2VxdWVuY2VzLgorICAgIGlmICgoYjIgJiAweEMwKSAhPSAweDgwKQorICAgICAgICByZXR1
cm4gLTE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBiMyA9IHNlcXVlbmNlWzNdOworICAgIGlm
IChsZW5ndGggPT0gMykgeworICAgICAgICBpZiAoYjMpCisgICAgICAgICAgICByZXR1cm4gLTE7
CisgICAgICAgIGNvbnN0IGludCBjID0gKChiMCAmIDB4RikgPDwgMTIpIHwgKChiMSAmIDB4M0Yp
IDw8IDYpIHwgKGIyICYgMHgzRik7CisgICAgICAgIGlmIChjIDwgMHg4MDApCisgICAgICAgICAg
ICByZXR1cm4gLTE7CisgICAgICAgIC8vIFVURi0xNiBzdXJyb2dhdGVzIHNob3VsZCBuZXZlciBh
cHBlYXIgaW4gVVRGLTggZGF0YS4KKyAgICAgICAgaWYgKGMgPj0gMHhEODAwICYmIGMgPD0gMHhE
RkZGKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gYzsKKyAgICB9CisK
KyAgICAvLyBIYW5kbGUgNC1ieXRlIHNlcXVlbmNlcy4KKyAgICBpZiAoKGIzICYgMHhDMCkgIT0g
MHg4MCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgYjQgPSBz
ZXF1ZW5jZVs0XTsKKyAgICBpZiAobGVuZ3RoID09IDQpIHsKKyAgICAgICAgaWYgKGI0KQorICAg
ICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjb25zdCBpbnQgYyA9ICgoYjAgJiAweDcpIDw8
IDE4KSB8ICgoYjEgJiAweDNGKSA8PCAxMikgfCAoKGIyICYgMHgzRikgPDwgNikgfCAoYjMgJiAw
eDNGKTsKKyAgICAgICAgaWYgKGMgPCAweDEwMDAwIHx8IGMgPiAweDEwRkZGRikKKyAgICAgICAg
ICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorCisgICAgcmV0dXJuIC0x
OworfQorCisvLyBPbmNlIHRoZSBiaXRzIGFyZSBzcGxpdCBvdXQgaW50byBieXRlcyBvZiBVVEYt
OCwgdGhpcyBpcyBhIG1hc2sgT1ItZWQKKy8vIGludG8gdGhlIGZpcnN0IGJ5dGUsIGRlcGVuZGlu
ZyBvbiBob3cgbWFueSBieXRlcyBmb2xsb3cuICBUaGVyZSBhcmUKKy8vIGFzIG1hbnkgZW50cmll
cyBpbiB0aGlzIHRhYmxlIGFzIHRoZXJlIGFyZSBVVEYtOCBzZXF1ZW5jZSB0eXBlcy4KKy8vIChJ
LmUuLCBvbmUgYnl0ZSBzZXF1ZW5jZSwgdHdvIGJ5dGUuLi4gZXRjLikuIFJlbWVtYmVyIHRoYXQg
c2VxdWVuY3MKKy8vIGZvciAqbGVnYWwqIFVURi04IHdpbGwgYmUgNCBvciBmZXdlciBieXRlcyB0
b3RhbC4KK3N0YXRpYyBjb25zdCBjaGFyIGZpcnN0Qnl0ZU1hcmtbN10gPSB7IDB4MDAsIDB4MDAs
IDB4QzAsIDB4RTAsIDB4RjAsIDB4RjgsIDB4RkMgfTsKKworQ29udmVyc2lvblJlc3VsdCBDb252
ZXJ0VVRGMTZUb1VURjgoCisgICAgY29uc3QgVUNoYXIqKiBzb3VyY2VTdGFydCwgY29uc3QgVUNo
YXIqIHNvdXJjZUVuZCwgCisgICAgY2hhcioqIHRhcmdldFN0YXJ0LCBjaGFyKiB0YXJnZXRFbmQs
IGJvb2wgc3RyaWN0KQoreworICAgIENvbnZlcnNpb25SZXN1bHQgcmVzdWx0ID0gY29udmVyc2lv
bk9LOworICAgIGNvbnN0IFVDaGFyKiBzb3VyY2UgPSAqc291cmNlU3RhcnQ7CisgICAgY2hhciog
dGFyZ2V0ID0gKnRhcmdldFN0YXJ0OworICAgIHdoaWxlIChzb3VyY2UgPCBzb3VyY2VFbmQpIHsK
KyAgICAgICAgVUNoYXIzMiBjaDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgYnl0ZXNUb1dyaXRl
ID0gMDsKKyAgICAgICAgY29uc3QgVUNoYXIzMiBieXRlTWFzayA9IDB4QkY7CisgICAgICAgIGNv
bnN0IFVDaGFyMzIgYnl0ZU1hcmsgPSAweDgwOyAKKyAgICAgICAgY29uc3QgVUNoYXIqIG9sZFNv
dXJjZSA9IHNvdXJjZTsgLy8gSW4gY2FzZSB3ZSBoYXZlIHRvIGJhY2sgdXAgYmVjYXVzZSBvZiB0
YXJnZXQgb3ZlcmZsb3cuCisgICAgICAgIGNoID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+
KCpzb3VyY2UrKyk7CisgICAgICAgIC8vIElmIHdlIGhhdmUgYSBzdXJyb2dhdGUgcGFpciwgY29u
dmVydCB0byBVQ2hhcjMyIGZpcnN0LgorICAgICAgICBpZiAoY2ggPj0gMHhEODAwICYmIGNoIDw9
IDB4REJGRikgeworICAgICAgICAgICAgLy8gSWYgdGhlIDE2IGJpdHMgZm9sbG93aW5nIHRoZSBo
aWdoIHN1cnJvZ2F0ZSBhcmUgaW4gdGhlIHNvdXJjZSBidWZmZXIuLi4KKyAgICAgICAgICAgIGlm
IChzb3VyY2UgPCBzb3VyY2VFbmQpIHsKKyAgICAgICAgICAgICAgICBVQ2hhcjMyIGNoMiA9IHN0
YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0Pigqc291cmNlKTsKKyAgICAgICAgICAgICAgICAvLyBJ
ZiBpdCdzIGEgbG93IHN1cnJvZ2F0ZSwgY29udmVydCB0byBVQ2hhcjMyLgorICAgICAgICAgICAg
ICAgIGlmIChjaDIgPj0gMHhEQzAwICYmIGNoMiA8PSAweERGRkYpIHsKKyAgICAgICAgICAgICAg
ICAgICAgY2ggPSAoKGNoIC0gMHhEODAwKSA8PCAxMCkgKyAoY2gyIC0gMHhEQzAwKSArIDB4MDAx
MDAwMDsKKyAgICAgICAgICAgICAgICAgICAgKytzb3VyY2U7CisgICAgICAgICAgICAgICAgfSBl
bHNlIGlmIChzdHJpY3QpIHsgLy8gaXQncyBhbiB1bnBhaXJlZCBoaWdoIHN1cnJvZ2F0ZQorICAg
ICAgICAgICAgICAgICAgICAtLXNvdXJjZTsgLy8gcmV0dXJuIHRvIHRoZSBpbGxlZ2FsIHZhbHVl
IGl0c2VsZgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
IGVsc2UgeyAvLyBXZSBkb24ndCBoYXZlIHRoZSAxNiBiaXRzIGZvbGxvd2luZyB0aGUgaGlnaCBz
dXJyb2dhdGUuCisgICAgICAgICAgICAgICAgLS1zb3VyY2U7IC8vIHJldHVybiB0byB0aGUgaGln
aCBzdXJyb2dhdGUKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VFeGhhdXN0ZWQ7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAo
c3RyaWN0KSB7CisgICAgICAgICAgICAvLyBVVEYtMTYgc3Vycm9nYXRlIHZhbHVlcyBhcmUgaWxs
ZWdhbCBpbiBVVEYtMzIKKyAgICAgICAgICAgIGlmIChjaCA+PSAweERDMDAgJiYgY2ggPD0gMHhE
RkZGKSB7CisgICAgICAgICAgICAgICAgLS1zb3VyY2U7IC8vIHJldHVybiB0byB0aGUgaWxsZWdh
bCB2YWx1ZSBpdHNlbGYKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2VJbGxlZ2FsOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IC8vIEZpZ3VyZSBvdXQgaG93IG1hbnkgYnl0ZXMgdGhlIHJlc3VsdCB3aWxsIHJlcXVpcmUKKyAg
ICAgICAgaWYgKGNoIDwgKFVDaGFyMzIpMHg4MCkgeworICAgICAgICAgICAgYnl0ZXNUb1dyaXRl
ID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA8IChVQ2hhcjMyKTB4ODAwKSB7CisgICAgICAg
ICAgICBieXRlc1RvV3JpdGUgPSAyOworICAgICAgICB9IGVsc2UgaWYgKGNoIDwgKFVDaGFyMzIp
MHgxMDAwMCkgeworICAgICAgICAgICAgYnl0ZXNUb1dyaXRlID0gMzsKKyAgICAgICAgfSBlbHNl
IGlmIChjaCA8IChVQ2hhcjMyKTB4MTEwMDAwKSB7CisgICAgICAgICAgICBieXRlc1RvV3JpdGUg
PSA0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnl0ZXNUb1dyaXRlID0gMzsKKyAg
ICAgICAgICAgIGNoID0gMHhGRkZEOworICAgICAgICB9CisKKyAgICAgICAgdGFyZ2V0ICs9IGJ5
dGVzVG9Xcml0ZTsKKyAgICAgICAgaWYgKHRhcmdldCA+IHRhcmdldEVuZCkgeworICAgICAgICAg
ICAgc291cmNlID0gb2xkU291cmNlOyAvLyBCYWNrIHVwIHNvdXJjZSBwb2ludGVyIQorICAgICAg
ICAgICAgdGFyZ2V0IC09IGJ5dGVzVG9Xcml0ZTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHRhcmdl
dEV4aGF1c3RlZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRj
aCAoYnl0ZXNUb1dyaXRlKSB7IC8vIG5vdGU6IGV2ZXJ5dGhpbmcgZmFsbHMgdGhyb3VnaC4KKyAg
ICAgICAgICAgIGNhc2UgNDogKi0tdGFyZ2V0ID0gKGNoYXIpKChjaCB8IGJ5dGVNYXJrKSAmIGJ5
dGVNYXNrKTsgY2ggPj49IDY7CisgICAgICAgICAgICBjYXNlIDM6ICotLXRhcmdldCA9IChjaGFy
KSgoY2ggfCBieXRlTWFyaykgJiBieXRlTWFzayk7IGNoID4+PSA2OworICAgICAgICAgICAgY2Fz
ZSAyOiAqLS10YXJnZXQgPSAoY2hhcikoKGNoIHwgYnl0ZU1hcmspICYgYnl0ZU1hc2spOyBjaCA+
Pj0gNjsKKyAgICAgICAgICAgIGNhc2UgMTogKi0tdGFyZ2V0ID0gIChjaGFyKShjaCB8IGZpcnN0
Qnl0ZU1hcmtbYnl0ZXNUb1dyaXRlXSk7CisgICAgICAgIH0KKyAgICAgICAgdGFyZ2V0ICs9IGJ5
dGVzVG9Xcml0ZTsKKyAgICB9CisgICAgKnNvdXJjZVN0YXJ0ID0gc291cmNlOworICAgICp0YXJn
ZXRTdGFydCA9IHRhcmdldDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBUaGlzIG11c3Qg
YmUgY2FsbGVkIHdpdGggdGhlIGxlbmd0aCBwcmUtZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYnl0
ZS4KKy8vIElmIHByZXNlbnRlZCB3aXRoIGEgbGVuZ3RoID4gNCwgdGhpcyByZXR1cm5zIGZhbHNl
LiAgVGhlIFVuaWNvZGUKKy8vIGRlZmluaXRpb24gb2YgVVRGLTggZ29lcyB1cCB0byA0LWJ5dGUg
c2VxdWVuY2VzLgorc3RhdGljIGJvb2wgaXNMZWdhbFVURjgoY29uc3QgdW5zaWduZWQgY2hhciog
c291cmNlLCBpbnQgbGVuZ3RoKQoreworICAgIHVuc2lnbmVkIGNoYXIgYTsKKyAgICBjb25zdCB1
bnNpZ25lZCBjaGFyKiBzcmNwdHIgPSBzb3VyY2UgKyBsZW5ndGg7CisgICAgc3dpdGNoIChsZW5n
dGgpIHsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgICAgICAvLyBFdmVyeXRo
aW5nIGVsc2UgZmFsbHMgdGhyb3VnaCB3aGVuICJ0cnVlIi4uLgorICAgICAgICBjYXNlIDQ6IGlm
ICgoYSA9ICgqLS1zcmNwdHIpKSA8IDB4ODAgfHwgYSA+IDB4QkYpIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgY2FzZSAzOiBpZiAoKGEgPSAoKi0tc3JjcHRyKSkgPCAweDgwIHx8IGEgPiAweEJGKSBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgMjogaWYgKChhID0gKCotLXNyY3B0cikpID4gMHhC
RikgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHN3aXRjaCAoKnNvdXJjZSkgeworICAgICAgICAg
ICAgLy8gbm8gZmFsbC10aHJvdWdoIGluIHRoaXMgaW5uZXIgc3dpdGNoCisgICAgICAgICAgICBj
YXNlIDB4RTA6IGlmIChhIDwgMHhBMCkgcmV0dXJuIGZhbHNlOyBicmVhazsKKyAgICAgICAgICAg
IGNhc2UgMHhFRDogaWYgKGEgPiAweDlGKSByZXR1cm4gZmFsc2U7IGJyZWFrOworICAgICAgICAg
ICAgY2FzZSAweEYwOiBpZiAoYSA8IDB4OTApIHJldHVybiBmYWxzZTsgYnJlYWs7CisgICAgICAg
ICAgICBjYXNlIDB4RjQ6IGlmIChhID4gMHg4RikgcmV0dXJuIGZhbHNlOyBicmVhazsKKyAgICAg
ICAgICAgIGRlZmF1bHQ6ICAgaWYgKGEgPCAweDgwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KworICAgICAgICBjYXNlIDE6IGlmICgqc291cmNlID49IDB4ODAgJiYgKnNvdXJjZSA8IDB4QzIp
IHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCpzb3VyY2UgPiAweEY0KQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIE1hZ2ljIHZhbHVlcyBzdWJ0
cmFjdGVkIGZyb20gYSBidWZmZXIgdmFsdWUgZHVyaW5nIFVURjggY29udmVyc2lvbi4KKy8vIFRo
aXMgdGFibGUgY29udGFpbnMgYXMgbWFueSB2YWx1ZXMgYXMgdGhlcmUgbWlnaHQgYmUgdHJhaWxp
bmcgYnl0ZXMKKy8vIGluIGEgVVRGLTggc2VxdWVuY2UuCitzdGF0aWMgY29uc3QgVUNoYXIzMiBv
ZmZzZXRzRnJvbVVURjhbNl0gPSB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMzA4MFVMLCAweDAwMEUy
MDgwVUwsIAorCQkgICAgIDB4MDNDODIwODBVTCwgMHhGQTA4MjA4MFVMLCAweDgyMDgyMDgwVUwg
fTsKKworQ29udmVyc2lvblJlc3VsdCBDb252ZXJ0VVRGOFRvVVRGMTYoCisgICAgY29uc3QgY2hh
cioqIHNvdXJjZVN0YXJ0LCBjb25zdCBjaGFyKiBzb3VyY2VFbmQsIAorICAgIFVDaGFyKiogdGFy
Z2V0U3RhcnQsIFVDaGFyKiB0YXJnZXRFbmQsIGJvb2wgc3RyaWN0KQoreworICAgIENvbnZlcnNp
b25SZXN1bHQgcmVzdWx0ID0gY29udmVyc2lvbk9LOworICAgIGNvbnN0IGNoYXIqIHNvdXJjZSA9
ICpzb3VyY2VTdGFydDsKKyAgICBVQ2hhciogdGFyZ2V0ID0gKnRhcmdldFN0YXJ0OworICAgIHdo
aWxlIChzb3VyY2UgPCBzb3VyY2VFbmQpIHsKKyAgICAgICAgVUNoYXIzMiBjaCA9IDA7CisgICAg
ICAgIHVuc2lnbmVkIHNob3J0IGV4dHJhQnl0ZXNUb1JlYWQgPSBVVEY4U2VxdWVuY2VMZW5ndGgo
KnNvdXJjZSkgLSAxOworICAgICAgICBpZiAoc291cmNlICsgZXh0cmFCeXRlc1RvUmVhZCA+PSBz
b3VyY2VFbmQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZUV4aGF1c3RlZDsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIERvIHRoaXMgY2hlY2sgd2hldGhl
ciBsZW5pZW50IG9yIHN0cmljdAorICAgICAgICBpZiAoIWlzTGVnYWxVVEY4KHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KHNvdXJjZSksIGV4dHJhQnl0ZXNUb1JlYWQgKyAx
KSkgeworICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlSWxsZWdhbDsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBjYXNlcyBhbGwgZmFsbCB0aHJvdWdoLgor
ICAgICAgICBzd2l0Y2ggKGV4dHJhQnl0ZXNUb1JlYWQpIHsKKyAgICAgICAgICAgIGNhc2UgNTog
Y2ggKz0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKnNvdXJjZSsrKTsgY2ggPDw9IDY7IC8v
IHJlbWVtYmVyLCBpbGxlZ2FsIFVURi04CisgICAgICAgICAgICBjYXNlIDQ6IGNoICs9IHN0YXRp
Y19jYXN0PHVuc2lnbmVkIGNoYXI+KCpzb3VyY2UrKyk7IGNoIDw8PSA2OyAvLyByZW1lbWJlciwg
aWxsZWdhbCBVVEYtOAorICAgICAgICAgICAgY2FzZSAzOiBjaCArPSBzdGF0aWNfY2FzdDx1bnNp
Z25lZCBjaGFyPigqc291cmNlKyspOyBjaCA8PD0gNjsKKyAgICAgICAgICAgIGNhc2UgMjogY2gg
Kz0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oKnNvdXJjZSsrKTsgY2ggPDw9IDY7CisgICAg
ICAgICAgICBjYXNlIDE6IGNoICs9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KCpzb3VyY2Ur
Kyk7IGNoIDw8PSA2OworICAgICAgICAgICAgY2FzZSAwOiBjaCArPSBzdGF0aWNfY2FzdDx1bnNp
Z25lZCBjaGFyPigqc291cmNlKyspOworICAgICAgICB9CisgICAgICAgIGNoIC09IG9mZnNldHNG
cm9tVVRGOFtleHRyYUJ5dGVzVG9SZWFkXTsKKworICAgICAgICBpZiAodGFyZ2V0ID49IHRhcmdl
dEVuZCkgeworICAgICAgICAgICAgc291cmNlIC09IChleHRyYUJ5dGVzVG9SZWFkICsgMSk7IC8v
IEJhY2sgdXAgc291cmNlIHBvaW50ZXIhCisgICAgICAgICAgICByZXN1bHQgPSB0YXJnZXRFeGhh
dXN0ZWQ7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChjaCA8PSAweEZGRkYpIHsKKyAg
ICAgICAgICAgIC8vIFVURi0xNiBzdXJyb2dhdGUgdmFsdWVzIGFyZSBpbGxlZ2FsIGluIFVURi0z
MgorICAgICAgICAgICAgaWYgKGNoID49IDB4RDgwMCAmJiBjaCA8PSAweERGRkYpIHsKKyAgICAg
ICAgICAgICAgICBpZiAoc3RyaWN0KSB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSAtPSAo
ZXh0cmFCeXRlc1RvUmVhZCArIDEpOyAvLyByZXR1cm4gdG8gdGhlIGlsbGVnYWwgdmFsdWUgaXRz
ZWxmCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7CisgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAg
ICAgICAgICAqdGFyZ2V0KysgPSAweEZGRkQ7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgICAgICAqdGFyZ2V0KysgPSAoVUNoYXIpY2g7IC8vIG5vcm1hbCBjYXNlCisgICAgICAgIH0g
ZWxzZSBpZiAoY2ggPiAweDEwRkZGRikgeworICAgICAgICAgICAgaWYgKHN0cmljdCkgeworICAg
ICAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZUlsbGVnYWw7CisgICAgICAgICAgICAgICAgc291
cmNlIC09IChleHRyYUJ5dGVzVG9SZWFkICsgMSk7IC8vIHJldHVybiB0byB0aGUgc3RhcnQKKyAg
ICAgICAgICAgICAgICBicmVhazsgLy8gQmFpbCBvdXQ7IHNob3VsZG4ndCBjb250aW51ZQorICAg
ICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgKnRhcmdldCsrID0gMHhGRkZEOworICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGFyZ2V0IGlzIGEgY2hhcmFjdGVyIGluIHJh
bmdlIDB4RkZGRiAtIDB4MTBGRkZGCisgICAgICAgICAgICBpZiAodGFyZ2V0ICsgMSA+PSB0YXJn
ZXRFbmQpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UgLT0gKGV4dHJhQnl0ZXNUb1JlYWQgKyAx
KTsgLy8gQmFjayB1cCBzb3VyY2UgcG9pbnRlciEKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0
YXJnZXRFeGhhdXN0ZWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBjaCAtPSAweDAwMTAwMDBVTDsKKyAgICAgICAgICAgICp0YXJnZXQrKyA9IChV
Q2hhcikoKGNoID4+IDEwKSArIDB4RDgwMCk7CisgICAgICAgICAgICAqdGFyZ2V0KysgPSAoVUNo
YXIpKChjaCAmIDB4MDNGRikgKyAweERDMDApOworICAgICAgICB9CisgICAgfQorICAgICpzb3Vy
Y2VTdGFydCA9IHNvdXJjZTsKKyAgICAqdGFyZ2V0U3RhcnQgPSB0YXJnZXQ7CisgICAgcmV0dXJu
IHJlc3VsdDsKK30KKworfQorfQoKUHJvcGVydHkgY2hhbmdlcyBvbjogSmF2YVNjcmlwdENvcmUv
d3RmL3VuaWNvZGUvVVRGOC5jcHAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpOYW1lOiBzdm46ZW9sLXN0eWxlCiAgICsg
bmF0aXZlCgpJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUvVVRGOC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi91bmljb2RlL1VURjguaAkocmV2aXNpb24gMCkKKysr
IEphdmFTY3JpcHRDb3JlL3d0Zi91bmljb2RlL1VURjguaAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIFdURl9VVEY4X2gKKyNkZWZpbmUgV1RGX1VURjhf
aAorCisjaW5jbHVkZSAiVW5pY29kZS5oIgorCituYW1lc3BhY2UgV1RGIHsKKyAgbmFtZXNwYWNl
IFVuaWNvZGUgeworCisgICAgLy8gR2l2ZW4gYSBmaXJzdCBieXRlLCBnaXZlcyB0aGUgbGVuZ3Ro
IG9mIHRoZSBVVEYtOCBzZXF1ZW5jZSBpdCBiZWdpbnMuCisgICAgLy8gUmV0dXJucyAwIGZvciBi
eXRlcyB0aGF0IGFyZSBub3QgbGVnYWwgc3RhcnRzIG9mIFVURi04IHNlcXVlbmNlcy4KKyAgICAv
LyBPbmx5IGFsbG93cyBzZXF1ZW5jZXMgb2YgdXAgdG8gNCBieXRlcywgc2luY2UgdGhhdCB3b3Jr
cyBmb3IgYWxsIFVuaWNvZGUgY2hhcmFjdGVycyAoVS0wMDAwMDAwMCB0byBVLTAwMTBGRkZGKS4K
KyAgICBpbnQgVVRGOFNlcXVlbmNlTGVuZ3RoKGNoYXIpOworCisgICAgLy8gVGFrZXMgYSBudWxs
LXRlcm1pbmF0ZWQgQy1zdHlsZSBzdHJpbmcgd2l0aCBhIFVURi04IHNlcXVlbmNlIGluIGl0IGFu
ZCBjb252ZXJ0cyBpdCB0byBhIGNoYXJhY3Rlci4KKyAgICAvLyBPbmx5IGFsbG93cyBVbmljb2Rl
IGNoYXJhY3RlcnMgKFUtMDAwMDAwMDAgdG8gVS0wMDEwRkZGRikuCisgICAgLy8gUmV0dXJucyAt
MSBpZiB0aGUgc2VxdWVuY2UgaXMgbm90IHZhbGlkIChpbmNsdWRpbmcgcHJlc2VuY2Ugb2YgZXh0
cmEgYnl0ZXMpLgorICAgIGludCBkZWNvZGVVVEY4U2VxdWVuY2UoY29uc3QgY2hhciopOworCisg
ICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAgICAgIGNvbnZlcnNpb25PSywgICAgICAgLy8gY29u
dmVyc2lvbiBzdWNjZXNzZnVsCisgICAgICAgICAgICBzb3VyY2VFeGhhdXN0ZWQsICAgIC8vIHBh
cnRpYWwgY2hhcmFjdGVyIGluIHNvdXJjZSwgYnV0IGhpdCBlbmQKKyAgICAgICAgICAgIHRhcmdl
dEV4aGF1c3RlZCwgICAgLy8gaW5zdWZmLiByb29tIGluIHRhcmdldCBmb3IgY29udmVyc2lvbgor
ICAgICAgICAgICAgc291cmNlSWxsZWdhbCAgICAgICAvLyBzb3VyY2Ugc2VxdWVuY2UgaXMgaWxs
ZWdhbC9tYWxmb3JtZWQKKyAgICB9IENvbnZlcnNpb25SZXN1bHQ7CisKKyAgICBDb252ZXJzaW9u
UmVzdWx0IENvbnZlcnRVVEY4VG9VVEYxNigKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hh
cioqIHNvdXJjZVN0YXJ0LCBjb25zdCBjaGFyKiBzb3VyY2VFbmQsIAorICAgICAgICAgICAgICAg
ICAgICBVQ2hhcioqIHRhcmdldFN0YXJ0LCBVQ2hhciogdGFyZ2V0RW5kLCBib29sIHN0cmljdCA9
IHRydWUpOworCisgICAgQ29udmVyc2lvblJlc3VsdCBDb252ZXJ0VVRGMTZUb1VURjgoCisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyKiogc291cmNlU3RhcnQsIGNvbnN0IFVDaGFyKiBz
b3VyY2VFbmQsIAorICAgICAgICAgICAgICAgICAgICBjaGFyKiogdGFyZ2V0U3RhcnQsIGNoYXIq
IHRhcmdldEVuZCwgYm9vbCBzdHJpY3QgPSB0cnVlKTsKKyAgfQorfQorCisjZW5kaWYgLy8gV1RG
X1VURjhfaAoKUHJvcGVydHkgY2hhbmdlcyBvbjogSmF2YVNjcmlwdENvcmUvd3RmL3VuaWNvZGUv
VVRGOC5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18KTmFtZTogc3ZuOmVvbC1zdHlsZQogICArIG5hdGl2ZQoK
</data>
<flag name="review"
          id="7332"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>