<?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>123582</bug_id>
          
          <creation_ts>2013-10-31 12:06:29 -0700</creation_ts>
          <short_desc>[WebCrypto] Add SHA-1</short_desc>
          <delta_ts>2013-10-31 14:02:02 -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>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>122679</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Alexey Proskuryakov">ap</reporter>
          <assigned_to name="Alexey Proskuryakov">ap</assigned_to>
          <cc>cdumez</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>945622</commentid>
    <comment_count>0</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-10-31 12:06:29 -0700</bug_when>
    <thetext>Implement SHA-1 glue code, and use Mac system libraries for actual implementation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>945624</commentid>
    <comment_count>1</comment_count>
      <attachid>215662</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-10-31 12:12:19 -0700</bug_when>
    <thetext>Created attachment 215662
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>945626</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-10-31 12:13:25 -0700</bug_when>
    <thetext>Attachment 215662 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;LayoutTests/ChangeLog&apos;, u&apos;LayoutTests/TestExpectations&apos;, u&apos;LayoutTests/security/crypto-subtle-arguments-expected.txt&apos;, u&apos;LayoutTests/security/crypto-subtle-arguments.html&apos;, u&apos;LayoutTests/security/crypto-subtle-sha1-expected.txt&apos;, u&apos;LayoutTests/security/crypto-subtle-sha1.html&apos;, u&apos;LayoutTests/security/resources/common.js&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/WebCore.xcodeproj/project.pbxproj&apos;, u&apos;Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp&apos;, u&apos;Source/WebCore/crypto/SubtleCrypto.idl&apos;, u&apos;Source/WebCore/crypto/algorithms/CryptoAlgorithmSHA1.cpp&apos;, u&apos;Source/WebCore/crypto/algorithms/CryptoAlgorithmSHA1.h&apos;, u&apos;Source/WebCore/crypto/mac/CryptoAlgorithmRegistryMac.cpp&apos;, u&apos;Source/WebCore/crypto/mac/CryptoAlgorithmSHA1Mac.cpp&apos;]&quot; exit_code: 1
LayoutTests/TestExpectations:79:  Path does not exist.  [test/expectations] [5]
Total errors found: 1 in 15 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>945634</commentid>
    <comment_count>3</comment_count>
      <attachid>215664</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-10-31 12:20:48 -0700</bug_when>
    <thetext>Created attachment 215664
with a better skip list</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>945635</commentid>
    <comment_count>4</comment_count>
      <attachid>215664</attachid>
    <who name="Anders Carlsson">andersca</who>
    <bug_when>2013-10-31 12:24:14 -0700</bug_when>
    <thetext>Comment on attachment 215664
with a better skip list

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

&gt; Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp:49
&gt; +        return 0;

nullptr.

&gt; Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp:55
&gt; +    return std::move(result);

No need for std::move here.

&gt; Source/WebCore/crypto/algorithms/CryptoAlgorithmSHA1.h:38
&gt; +    static const char* const m_name;
&gt; +    static const CryptoAlgorithmIdentifier m_identifier = CryptoAlgorithmIdentifier::SHA_1;

We usually don’t use m_ for public member variables, at least I don’t think we do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>945637</commentid>
    <comment_count>5</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-10-31 12:30:14 -0700</bug_when>
    <thetext>Committed &lt;http://trac.webkit.org/r158387&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>945669</commentid>
    <comment_count>6</comment_count>
      <attachid>215664</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-10-31 13:45:51 -0700</bug_when>
    <thetext>Comment on attachment 215664
with a better skip list

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

&gt; Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp:52
&gt; +    std::unique_ptr&lt;CryptoAlgorithm&gt; result(CryptoAlgorithmRegistry::shared().create(algorithmIdentifier));

I would write:

    auto result = CryptoAlgorithmRegistry::shared().create(algorithmIdentifier);

&gt; Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp:86
&gt; +    std::unique_ptr&lt;CryptoAlgorithm&gt; algorithm = createAlgorithmFromJSValue(exec, exec-&gt;uncheckedArgument(0));

I like auto better than std::unique_ptr here.

&gt; Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp:92
&gt; +    std::unique_ptr&lt;CryptoAlgorithmParameters&gt; parameters = JSCryptoAlgorithmDictionary::createParametersForDigest(exec, algorithm-&gt;identifier(), exec-&gt;uncheckedArgument(0));

I like auto better than std::unique_ptr here.

&gt;&gt; Source/WebCore/crypto/algorithms/CryptoAlgorithmSHA1.h:38
&gt;&gt; +    static const CryptoAlgorithmIdentifier m_identifier = CryptoAlgorithmIdentifier::SHA_1;
&gt; 
&gt; We usually don’t use m_ for public member variables, at least I don’t think we do.

We definitely don’t use m_ for static data members. We normally avoid public member variables entirely, except when we use a struct instead of a class and we don’t use prefixes at all. I think it would be best to use a public static function instead of a public static data member. Inline if it needs to be.

&gt; Source/WebCore/crypto/mac/CryptoAlgorithmSHA1Mac.cpp:36
&gt; +void CryptoAlgorithmSHA1::digest(const CryptoAlgorithmParameters&amp;, const Vector&lt;CryptoOperationData&gt;&amp; data, std::unique_ptr&lt;PromiseWrapper&gt; promise, ExceptionCode&amp;)

Seems like this should take PromiseWrapper&amp; instead of unique_ptr&lt;PromiseWrapper&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>945678</commentid>
    <comment_count>7</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-10-31 14:02:02 -0700</bug_when>
    <thetext>&gt; I like auto better than std::unique_ptr here.

Can try how this works. I&apos;m worried that with smart pointers replaced with auto, it will be harder to confirm that there are no memory leaks.

&gt; Seems like this should take PromiseWrapper&amp; instead of unique_ptr&lt;PromiseWrapper&gt;.

The interface is designed to allow for async execution, so I don&apos;t think that this would work.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>215662</attachid>
            <date>2013-10-31 12:12:19 -0700</date>
            <delta_ts>2013-10-31 12:20:48 -0700</delta_ts>
            <desc>proposed patch</desc>
            <filename>AddSHA1.txt</filename>
            <type>text/plain</type>
            <size>31674</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE1ODM3OSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM0IEBACisyMDEzLTEwLTMxICBBbGV4ZXkg
UHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFtXZWJDcnlwdG9dIEFkZCBT
SEEtMQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIz
NTgyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGVz
dHM6IHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUtYXJndW1lbnRzLmh0bWwKKyAgICAgICAgICAgICAg
IHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUtc2hhMS5odG1sCisKKyAgICAgICAgKiBXZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2o6IEFkZGVkIG5ldyBmaWxlcy4KKworICAgICAgICAqIGJp
bmRpbmdzL2pzL0pTU3VidGxlQ3J5cHRvQ3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNy
ZWF0ZUFsZ29yaXRobUZyb21KU1ZhbHVlKToKKyAgICAgICAgKFdlYkNvcmU6OnNlcXVlbmNlT2ZD
cnlwdG9PcGVyYXRpb25EYXRhRnJvbUpTVmFsdWUpOgorICAgICAgICAoV2ViQ29yZTo6SlNTdWJ0
bGVDcnlwdG86OmRpZ2VzdCk6CisgICAgICAgICogY3J5cHRvL1N1YnRsZUNyeXB0by5pZGw6Cisg
ICAgICAgIEFkZGVkIGJpbmRpbmdzIGZvciBjcnlwdG8uZGlnZXN0LgorCisgICAgICAgICogY3J5
cHRvL2FsZ29yaXRobXM6IEFkZGVkLgorICAgICAgICAqIGNyeXB0by9hbGdvcml0aG1zL0NyeXB0
b0FsZ29yaXRobVNIQTEuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBjcnlwdG8vYWxnb3JpdGhtcy9D
cnlwdG9BbGdvcml0aG1TSEExLmg6IEFkZGVkLgorICAgICAgICAqIGNyeXB0by9tYWMvQ3J5cHRv
QWxnb3JpdGhtUmVnaXN0cnlNYWMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q3J5cHRvQWxnb3Jp
dGhtUmVnaXN0cnk6OnBsYXRmb3JtUmVnaXN0ZXJBbGdvcml0aG1zKTogUmVnaXN0ZXIgU0hBLTEu
CisKKyAgICAgICAgKiBjcnlwdG8vbWFjL0NyeXB0b0FsZ29yaXRobVNIQTFNYWMuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OkNyeXB0b0FsZ29yaXRobVNIQTE6OmRpZ2VzdCk6IFBlcmZv
cm1zIHRoZSB3b3JrIHN5bmNocm9ub3VzbHksIGJlY2F1c2UKKyAgICAgICAgb3RoZXJ3aXNlIHdl
J2QgaGF2ZSB0byBjb3B5IHRoZSBkYXRhIGZpcnN0LCB3aGljaCBpcyBjcmF6eSBmb3Igc29tZXRo
aW5nIGFzIHNpbXBsZQorICAgICAgICBhcyBoYXNoaW5nLiBXZSBjYW4gY2hhbmdlIHRvIGEgZGlz
cGF0Y2ggcXVldWUgbGF0ZXIgaWYgd2UgZmluZCB0aGF0IGl0J3MgYWN0dWFsbHkKKyAgICAgICAg
YmV0dGVyIHRvIGNvcHkgYW5kIGRvIHRoZSB3b3JrIGFzeW5jaHJvbm91c2x5LgorCiAyMDEzLTEw
LTMxICBNeWxlcyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CiAKICAgICAgICAg
RGVjb3JhdGVkIHRleHQgc29tZXRpbWVzIGRvZXMgbm90IGRyYXcgaXRzIGRlY29yYXRpb25zCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCShyZXZpc2lvbiAxNTgzNzUpCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTU1MDIsNiArNTUwMiw5IEBACiAJ
CUUxMUM5RDlCMEVCMzY4MTIwMEU0MDlEQiAvKiBTY3JpcHRFeGVjdXRpb25Db250ZXh0LmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTFDOUQ5QTBFQjM2
ODEyMDBFNDA5REIgLyogU2NyaXB0RXhlY3V0aW9uQ29udGV4dC5oICovOyBzZXR0aW5ncyA9IHtB
VFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUUxMUM5REIwMEVCMzY5OTUwMEU0MDlE
QiAvKiBTY3JpcHRFeGVjdXRpb25Db250ZXh0LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxMUM5REFGMEVCMzY5OTUwMEU0MDlEQiAvKiBTY3JpcHRF
eGVjdXRpb25Db250ZXh0LmNwcCAqLzsgfTsKIAkJRTEyNDc0ODQxMEFBMTYxRDAwQjc5NDkzIC8q
IEF1dGhlbnRpY2F0aW9uQ2xpZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBFMTI0NzQ4MzEwQUExNjFEMDBCNzk0OTMgLyogQXV0aGVudGljYXRpb25D
bGllbnQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9Owor
CQlFMTI1RjgyQjE4MjJDRkVDMDBEODRDRDkgLyogQ3J5cHRvQWxnb3JpdGhtU0hBMS5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTI1RjgyOTE4MjJD
RkVDMDBEODRDRDkgLyogQ3J5cHRvQWxnb3JpdGhtU0hBMS5jcHAgKi87IH07CisJCUUxMjVGODJD
MTgyMkNGRUMwMEQ4NENEOSAvKiBDcnlwdG9BbGdvcml0aG1TSEExLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTI1RjgyQTE4MjJDRkVDMDBEODRDRDkg
LyogQ3J5cHRvQWxnb3JpdGhtU0hBMS5oICovOyB9OworCQlFMTI1RjgyRTE4MjJDRkZGMDBEODRD
RDkgLyogQ3J5cHRvQWxnb3JpdGhtU0hBMU1hYy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTI1RjgyRDE4MjJDRkZGMDBEODRDRDkgLyogQ3J5cHRv
QWxnb3JpdGhtU0hBMU1hYy5jcHAgKi87IH07CiAJCUUxMjcxOUM3MEVFRUMxNjgwMEY2MTIxMyAv
KiBOYXZpZ2F0b3JCYXNlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBFMTI3MTlDNjBFRUVDMTY4MDBGNjEyMTMgLyogTmF2aWdhdG9yQmFzZS5oICovOyB9
OwogCQlFMTI3MTlDQTBFRUVDMjEzMDBGNjEyMTMgLyogTmF2aWdhdG9yQmFzZS5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTI3MTlDOTBFRUVDMjEz
MDBGNjEyMTMgLyogTmF2aWdhdG9yQmFzZS5jcHAgKi87IH07CiAJCUUxMjcxQTBCMEVFRUM3N0Ew
MEY2MTIxMyAvKiBXb3JrZXJOYXZpZ2F0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEUxMjcxQTBBMEVFRUM3N0EwMEY2MTIxMyAvKiBXb3JrZXJOYXZp
Z2F0b3IuaCAqLzsgfTsKQEAgLTEyNTA2LDYgKzEyNTA5LDkgQEAKIAkJRTExQzlEOUEwRUIzNjgx
MjAwRTQwOURCIC8qIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gU2NyaXB0RXhlY3V0aW9uQ29udGV4dC5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlFMTFDOURBRjBFQjM2OTk1MDBFNDA5REIgLyogU2NyaXB0RXhlY3V0aW9u
Q29udGV4dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBTY3JpcHRF
eGVjdXRpb25Db250ZXh0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTEyNDc0
ODMxMEFBMTYxRDAwQjc5NDkzIC8qIEF1dGhlbnRpY2F0aW9uQ2xpZW50LmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEF1dGhlbnRpY2F0aW9uQ2xpZW50Lmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CisJCUUxMjVGODI5MTgyMkNGRUMwMEQ4NENEOSAvKiBDcnlwdG9BbGdv
cml0aG1TSEExLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENyeXB0
b0FsZ29yaXRobVNIQTEuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFMTI1Rjgy
QTE4MjJDRkVDMDBEODRDRDkgLyogQ3J5cHRvQWxnb3JpdGhtU0hBMS5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBDcnlwdG9BbGdvcml0aG1TSEExLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCUUxMjVGODJEMTgyMkNGRkYwMEQ4NENEOSAvKiBDcnlwdG9BbGdvcml0
aG1TSEExTWFjLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IENyeXB0
b0FsZ29yaXRobVNIQTFNYWMuY3BwOyBwYXRoID0gbWFjL0NyeXB0b0FsZ29yaXRobVNIQTFNYWMu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFMTI3MTlDNjBFRUVDMTY4MDBGNjEy
MTMgLyogTmF2aWdhdG9yQmFzZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBO
YXZpZ2F0b3JCYXNlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUUxMjcxOUM5MEVF
RUMyMTMwMEY2MTIxMyAvKiBOYXZpZ2F0b3JCYXNlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgcGF0aCA9IE5hdmlnYXRvckJhc2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQlFMTI3MUEwQTBFRUVDNzdBMDBGNjEyMTMgLyogV29ya2VyTmF2aWdhdG9yLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdvcmtlck5hdmlnYXRvci5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwpAQCAtMjAxMzIsNiArMjAxMzgsNyBAQAogCQkJaXNhID0gUEJY
R3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKIAkJCQlFMUJCODRBQzE4MjJDQTc0MDA1MjUwNDMgLyog
Q3J5cHRvQWxnb3JpdGhtUmVnaXN0cnlNYWMuY3BwICovLAorCQkJCUUxMjVGODJEMTgyMkNGRkYw
MEQ4NENEOSAvKiBDcnlwdG9BbGdvcml0aG1TSEExTWFjLmNwcCAqLywKIAkJCSk7CiAJCQluYW1l
ID0gbWFjOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKQEAgLTIwMTM5LDYgKzIwMTQ2LDgg
QEAKIAkJRTE3MkFGN0MxODBGM0IwRDAwRkJBREI5IC8qIGFsZ29yaXRobXMgKi8gPSB7CiAJCQlp
c2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKAorCQkJCUUxMjVGODI5MTgyMkNGRUMwMEQ4
NENEOSAvKiBDcnlwdG9BbGdvcml0aG1TSEExLmNwcCAqLywKKwkJCQlFMTI1RjgyQTE4MjJDRkVD
MDBEODRDRDkgLyogQ3J5cHRvQWxnb3JpdGhtU0hBMS5oICovLAogCQkJKTsKIAkJCXBhdGggPSBh
bGdvcml0aG1zOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKQEAgLTIzNjA0LDYgKzIzNjEz
LDcgQEAKIAkJCQlFNDQ2MTNBRDBDRDYzMzEwMDBGQURBNzUgLyogTWVkaWFFcnJvci5oIGluIEhl
YWRlcnMgKi8sCiAJCQkJNEUxOTU5MjIwQTM5REFCQTAwMjIwRkU1IC8qIE1lZGlhRmVhdHVyZU5h
bWVzLmggaW4gSGVhZGVycyAqLywKIAkJCQkwN0E2RDFFQzE0OTExMzc3MDAwNTFEMEMgLyogTWVk
aWFGcmFnbWVudFVSSVBhcnNlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJRTEyNUY4MkMxODIyQ0ZF
QzAwRDg0Q0Q5IC8qIENyeXB0b0FsZ29yaXRobVNIQTEuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4
RUE4MDBFMEExOTUxNkUwMEE4RUY1RiAvKiBNZWRpYUxpc3QuaCBpbiBIZWFkZXJzICovLAogCQkJ
CUU0NDYxM0U0MENENjgxQTIwMEZBREE3NSAvKiBNZWRpYVBsYXllci5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJMDc2RjBEMEUxMkI4MTkyNzAwQzI2QUE0IC8qIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91
bmRhdGlvbi5oIGluIEhlYWRlcnMgKi8sCkBAIC0yNTY2Niw2ICsyNTY3Niw3IEBACiAJCQkJODVE
RjJGOUMwQUEzQ0FFNTAwQUQ2NEM1IC8qIERPTUhUTUxPcHRpb25zQ29sbGVjdGlvbi5tbSBpbiBT
b3VyY2VzICovLAogCQkJCTg1MTgzQjQ3MEFBNjkyNjEwMEYxOUZBMyAvKiBET01IVE1MUGFyYWdy
YXBoRWxlbWVudC5tbSBpbiBTb3VyY2VzICovLAogCQkJCTg1RUNCRUY4MEFBNzYyNjkwMDU0NEYw
QiAvKiBET01IVE1MUGFyYW1FbGVtZW50Lm1tIGluIFNvdXJjZXMgKi8sCisJCQkJRTEyNUY4MkIx
ODIyQ0ZFQzAwRDg0Q0Q5IC8qIENyeXB0b0FsZ29yaXRobVNIQTEuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJODUxODNCNDkwQUE2OTI2MTAwRjE5RkEzIC8qIERPTUhUTUxQcmVFbGVtZW50Lm1tIGlu
IFNvdXJjZXMgKi8sCiAJCQkJQTQyMjZFOTYxMTYzRDczQTAwOEI4Mzk3IC8qIERPTUhUTUxQcm9n
cmVzc0VsZW1lbnQubW0gaW4gU291cmNlcyAqLywKIAkJCQk4NTE4M0I0QjBBQTY5MjYxMDBGMTlG
QTMgLyogRE9NSFRNTFF1b3RlRWxlbWVudC5tbSBpbiBTb3VyY2VzICovLApAQCAtMjYwNTcsNiAr
MjYwNjgsNyBAQAogCQkJCUQ2NjgxN0ZBMTY2RkU2RDcwMEZBMDdCNCAvKiBIVE1MVGVtcGxhdGVF
bGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4MTM2OUQ3MDk3Mzc0RjYwMEQ3NDQ2MyAv
KiBIVE1MVGV4dEFyZWFFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTlCQzZDMjFDMTND
Q0M5N0IwMDhFMDMzNyAvKiBIVE1MVGV4dEZvcm1Db250cm9sRWxlbWVudC5jcHAgaW4gU291cmNl
cyAqLywKKwkJCQlFMTI1RjgyRTE4MjJDRkZGMDBEODRDRDkgLyogQ3J5cHRvQWxnb3JpdGhtU0hB
MU1hYy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODcxREMyOTBBMTUyMDU3MDBCMTJBNjggLyog
SFRNTFRpdGxlRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5NzdCMzg3NzEyMjg4M0U5
MDBCODFGRjggLyogSFRNTFRva2VuaXplci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwNzA3NTY4
QjE0MjI2MkQ2MDA0MTQxNjEgLyogSFRNTFRyYWNrRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL2pzL0pTU3VidGxlQ3J5cHRvQ3VzdG9tLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9qcy9KU1N1YnRsZUNyeXB0
b0N1c3RvbS5jcHAJKHJldmlzaW9uIDE1ODM3NSkKKysrIFNvdXJjZS9XZWJDb3JlL2JpbmRpbmdz
L2pzL0pTU3VidGxlQ3J5cHRvQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsMTAgKzI4
LDkyIEBACiAKICNpZiBFTkFCTEUoU1VCVExFX0NSWVBUTykKIAorI2luY2x1ZGUgIkNyeXB0b0Fs
Z29yaXRobS5oIgorI2luY2x1ZGUgIkNyeXB0b0FsZ29yaXRobVBhcmFtZXRlcnMuaCIKKyNpbmNs
dWRlICJDcnlwdG9BbGdvcml0aG1SZWdpc3RyeS5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisj
aW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgorI2luY2x1ZGUgIkpTQ3J5cHRvQWxnb3JpdGhtRGlj
dGlvbmFyeS5oIgorI2luY2x1ZGUgIkpTRE9NUHJvbWlzZS5oIgorI2luY2x1ZGUgPHJ1bnRpbWUv
RXJyb3IuaD4KKwordXNpbmcgbmFtZXNwYWNlIEpTQzsKKwogbmFtZXNwYWNlIFdlYkNvcmUgewog
CitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPENyeXB0b0FsZ29yaXRobT4gY3JlYXRlQWxnb3JpdGht
RnJvbUpTVmFsdWUoRXhlY1N0YXRlKiBleGVjLCBKU1ZhbHVlIHZhbHVlKQoreworICAgIENyeXB0
b0FsZ29yaXRobUlkZW50aWZpZXIgYWxnb3JpdGhtSWRlbnRpZmllcjsKKyAgICBpZiAoIUpTQ3J5
cHRvQWxnb3JpdGhtRGljdGlvbmFyeTo6Z2V0QWxnb3JpdGhtSWRlbnRpZmllcihleGVjLCB2YWx1
ZSwgYWxnb3JpdGhtSWRlbnRpZmllcikpIHsKKyAgICAgICAgQVNTRVJUKGV4ZWMtPmhhZEV4Y2Vw
dGlvbigpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRy
PENyeXB0b0FsZ29yaXRobT4gcmVzdWx0KENyeXB0b0FsZ29yaXRobVJlZ2lzdHJ5OjpzaGFyZWQo
KS5jcmVhdGUoYWxnb3JpdGhtSWRlbnRpZmllcikpOworICAgIGlmICghcmVzdWx0KQorICAgICAg
ICBzZXRET01FeGNlcHRpb24oZXhlYywgTk9UX1NVUFBPUlRFRF9FUlIpOworICAgIHJldHVybiBz
dGQ6Om1vdmUocmVzdWx0KTsKK30KKworc3RhdGljIGJvb2wgc2VxdWVuY2VPZkNyeXB0b09wZXJh
dGlvbkRhdGFGcm9tSlNWYWx1ZShFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgdmFsdWUsIFZlY3Rv
cjxDcnlwdG9PcGVyYXRpb25EYXRhPiYgcmVzdWx0KQoreworICAgIHVuc2lnbmVkIHNlcXVlbmNl
TGVuZ3RoOworICAgIEpTT2JqZWN0KiBzZXF1ZW5jZSA9IHRvSlNTZXF1ZW5jZShleGVjLCB2YWx1
ZSwgc2VxdWVuY2VMZW5ndGgpOworICAgIGlmICghc2VxdWVuY2UpIHsKKyAgICAgICAgQVNTRVJU
KGV4ZWMtPmhhZEV4Y2VwdGlvbigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzZXF1ZW5jZUxlbmd0aDsgKytpKSB7CisgICAg
ICAgIEpTVmFsdWUgaXRlbSA9IHNlcXVlbmNlLT5nZXQoZXhlYywgaSk7CisgICAgICAgIGlmIChB
cnJheUJ1ZmZlciogYnVmZmVyID0gdG9BcnJheUJ1ZmZlcihpdGVtKSkKKyAgICAgICAgICAgIHJl
c3VsdC5hcHBlbmQoc3RkOjptYWtlX3BhaXIoc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1ZmZlci0+ZGF0
YSgpKSwgYnVmZmVyLT5ieXRlTGVuZ3RoKCkpKTsKKyAgICAgICAgZWxzZSBpZiAoUmVmUHRyPEFy
cmF5QnVmZmVyVmlldz4gYnVmZmVyVmlldyA9IHRvQXJyYXlCdWZmZXJWaWV3KGl0ZW0pKQorICAg
ICAgICAgICAgcmVzdWx0LmFwcGVuZChzdGQ6Om1ha2VfcGFpcihzdGF0aWNfY2FzdDxjaGFyKj4o
YnVmZmVyVmlldy0+YmFzZUFkZHJlc3MoKSksIGJ1ZmZlclZpZXctPmJ5dGVMZW5ndGgoKSkpOwor
ICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRocm93VHlwZUVycm9yKGV4ZWMsICJPbmx5IEFy
cmF5QnVmZmVyIGFuZCBBcnJheUJ1ZmZlclZpZXcgb2JqZWN0cyBjYW4gYmUgcGFydCBvZiBDcnlw
dG9PcGVyYXRpb25EYXRhIHNlcXVlbmNlIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CiAKK0pTVmFsdWUgSlNTdWJ0bGVD
cnlwdG86OmRpZ2VzdChFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgaWYgKGV4ZWMtPmFyZ3VtZW50
Q291bnQoKSA8IDIpCisgICAgICAgIHJldHVybiBleGVjLT52bSgpLnRocm93RXhjZXB0aW9uKGV4
ZWMsIGNyZWF0ZU5vdEVub3VnaEFyZ3VtZW50c0Vycm9yKGV4ZWMpKTsKKworICAgIHN0ZDo6dW5p
cXVlX3B0cjxDcnlwdG9BbGdvcml0aG0+IGFsZ29yaXRobSA9IGNyZWF0ZUFsZ29yaXRobUZyb21K
U1ZhbHVlKGV4ZWMsIGV4ZWMtPnVuY2hlY2tlZEFyZ3VtZW50KDApKTsKKyAgICBpZiAoIWFsZ29y
aXRobSkgeworICAgICAgICBBU1NFUlQoZXhlYy0+aGFkRXhjZXB0aW9uKCkpOworICAgICAgICBy
ZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q3J5cHRv
QWxnb3JpdGhtUGFyYW1ldGVycz4gcGFyYW1ldGVycyA9IEpTQ3J5cHRvQWxnb3JpdGhtRGljdGlv
bmFyeTo6Y3JlYXRlUGFyYW1ldGVyc0ZvckRpZ2VzdChleGVjLCBhbGdvcml0aG0tPmlkZW50aWZp
ZXIoKSwgZXhlYy0+dW5jaGVja2VkQXJndW1lbnQoMCkpOworICAgIGlmICghcGFyYW1ldGVycykg
eworICAgICAgICBBU1NFUlQoZXhlYy0+aGFkRXhjZXB0aW9uKCkpOworICAgICAgICByZXR1cm4g
anNVbmRlZmluZWQoKTsKKyAgICB9CisKKyAgICBWZWN0b3I8Q3J5cHRvT3BlcmF0aW9uRGF0YT4g
ZGF0YTsKKyAgICBpZiAoIXNlcXVlbmNlT2ZDcnlwdG9PcGVyYXRpb25EYXRhRnJvbUpTVmFsdWUo
ZXhlYywgZXhlYy0+dW5jaGVja2VkQXJndW1lbnQoMSksIGRhdGEpKSB7CisgICAgICAgIEFTU0VS
VChleGVjLT5oYWRFeGNlcHRpb24oKSk7CisgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwor
ICAgIH0KKworICAgIEpTUHJvbWlzZSogcHJvbWlzZSA9IEpTUHJvbWlzZTo6Y3JlYXRlV2l0aFJl
c29sdmVyKGV4ZWMtPnZtKCksIGdsb2JhbE9iamVjdCgpKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8
UHJvbWlzZVdyYXBwZXI+IHByb21pc2VXcmFwcGVyID0gUHJvbWlzZVdyYXBwZXI6OmNyZWF0ZShn
bG9iYWxPYmplY3QoKSwgcHJvbWlzZSk7CisKKyAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAg
ICBhbGdvcml0aG0tPmRpZ2VzdCgqcGFyYW1ldGVycywgZGF0YSwgc3RkOjptb3ZlKHByb21pc2VX
cmFwcGVyKSwgZWMpOworICAgIGlmIChlYykgeworICAgICAgICBzZXRET01FeGNlcHRpb24oZXhl
YywgZWMpOworICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICB9CiAKKyAgICByZXR1
cm4gcHJvbWlzZTsKIH0KIAorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCiAjZW5kaWYKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2NyeXB0by9TdWJ0bGVDcnlwdG8uaWRsCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2NyeXB0by9TdWJ0bGVDcnlwdG8uaWRsCShyZXZpc2lvbiAxNTgzNzUpCisr
KyBTb3VyY2UvV2ViQ29yZS9jcnlwdG8vU3VidGxlQ3J5cHRvLmlkbAkod29ya2luZyBjb3B5KQpA
QCAtMzAsNCArMzAsNSBAQAogICAgIE5vSW50ZXJmYWNlT2JqZWN0LAogICAgIE9wZXJhdGlvbnNO
b3REZWxldGFibGUKIF0gaW50ZXJmYWNlIFN1YnRsZUNyeXB0byB7CisgICAgW0N1c3RvbV0gUHJv
bWlzZSBkaWdlc3QoQWxnb3JpdGhtSWRlbnRpZmllciBhbGdvcml0aG0sIHNlcXVlbmNlPENyeXB0
b09wZXJhdGlvbkRhdGE+IGRhdGEpOwogfTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2NyeXB0by9h
bGdvcml0aG1zL0NyeXB0b0FsZ29yaXRobVNIQTEuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2NyeXB0by9hbGdvcml0aG1zL0NyeXB0b0FsZ29yaXRobVNIQTEuY3BwCShyZXZpc2lv
biAwKQorKysgU291cmNlL1dlYkNvcmUvY3J5cHRvL2FsZ29yaXRobXMvQ3J5cHRvQWxnb3JpdGht
U0hBMS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDcnlwdG9BbGdvcml0aG1TSEExLmgiCisKKyNp
ZiBFTkFCTEUoU1VCVExFX0NSWVBUTykKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjb25zdCBj
aGFyKiBjb25zdCBDcnlwdG9BbGdvcml0aG1TSEExOjptX25hbWUgPSAic2hhLTEiOworCitDcnlw
dG9BbGdvcml0aG1TSEExOjpDcnlwdG9BbGdvcml0aG1TSEExKCkKK3sKK30KKworQ3J5cHRvQWxn
b3JpdGhtU0hBMTo6fkNyeXB0b0FsZ29yaXRobVNIQTEoKQoreworfQorCitzdGQ6OnVuaXF1ZV9w
dHI8Q3J5cHRvQWxnb3JpdGhtPiBDcnlwdG9BbGdvcml0aG1TSEExOjpjcmVhdGUoKQoreworICAg
IHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPENyeXB0b0FsZ29yaXRobVNIQTE+KCk7Cit9CisKK0Ny
eXB0b0FsZ29yaXRobUlkZW50aWZpZXIgQ3J5cHRvQWxnb3JpdGhtU0hBMTo6aWRlbnRpZmllcigp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1faWRlbnRpZmllcjsKK30KKworfQorCisjZW5kaWYgLy8g
RU5BQkxFKFNVQlRMRV9DUllQVE8pCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jcnlwdG8vYWxnb3Jp
dGhtcy9DcnlwdG9BbGdvcml0aG1TSEExLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
Y3J5cHRvL2FsZ29yaXRobXMvQ3J5cHRvQWxnb3JpdGhtU0hBMS5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL1dlYkNvcmUvY3J5cHRvL2FsZ29yaXRobXMvQ3J5cHRvQWxnb3JpdGhtU0hBMS5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
CisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
KyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIENyeXB0
b0FsZ29yaXRobVNIQTFfaAorI2RlZmluZSBDcnlwdG9BbGdvcml0aG1TSEExX2gKKworI2luY2x1
ZGUgIkNyeXB0b0FsZ29yaXRobS5oIgorCisjaWYgRU5BQkxFKFNVQlRMRV9DUllQVE8pCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ3J5cHRvQWxnb3JpdGhtU0hBMSBGSU5BTCA6IHB1
YmxpYyBDcnlwdG9BbGdvcml0aG0geworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBj
b25zdCBtX25hbWU7CisgICAgc3RhdGljIGNvbnN0IENyeXB0b0FsZ29yaXRobUlkZW50aWZpZXIg
bV9pZGVudGlmaWVyID0gQ3J5cHRvQWxnb3JpdGhtSWRlbnRpZmllcjo6U0hBXzE7CisKKyAgICBz
dGF0aWMgc3RkOjp1bmlxdWVfcHRyPENyeXB0b0FsZ29yaXRobT4gY3JlYXRlKCk7CisKKyAgICB2
aXJ0dWFsIENyeXB0b0FsZ29yaXRobUlkZW50aWZpZXIgaWRlbnRpZmllcigpIGNvbnN0IE9WRVJS
SURFOworCisgICAgdmlydHVhbCB2b2lkIGRpZ2VzdChjb25zdCBDcnlwdG9BbGdvcml0aG1QYXJh
bWV0ZXJzJiwgY29uc3QgVmVjdG9yPENyeXB0b09wZXJhdGlvbkRhdGE+Jiwgc3RkOjp1bmlxdWVf
cHRyPFByb21pc2VXcmFwcGVyPiwgRXhjZXB0aW9uQ29kZSYpIE9WRVJSSURFOworCitwcml2YXRl
OgorICAgIENyeXB0b0FsZ29yaXRobVNIQTEoKTsKKyAgICB2aXJ0dWFsIH5DcnlwdG9BbGdvcml0
aG1TSEExKCk7Cit9OworCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoU1VCVExFX0NSWVBUTykKKyNl
bmRpZiAvLyBDcnlwdG9BbGdvcml0aG1TSEExX2gKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2NyeXB0
by9tYWMvQ3J5cHRvQWxnb3JpdGhtUmVnaXN0cnlNYWMuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL2NyeXB0by9tYWMvQ3J5cHRvQWxnb3JpdGhtUmVnaXN0cnlNYWMuY3BwCShyZXZp
c2lvbiAxNTgzNzUpCisrKyBTb3VyY2UvV2ViQ29yZS9jcnlwdG8vbWFjL0NyeXB0b0FsZ29yaXRo
bVJlZ2lzdHJ5TWFjLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksMTQgKzI5LDE0IEBACiAjaWYg
RU5BQkxFKFNVQlRMRV9DUllQVE8pCiAKIC8vI2luY2x1ZGUgIkNyeXB0b0FsZ29yaXRobUhNQUMu
aCIKLS8vI2luY2x1ZGUgIkNyeXB0b0FsZ29yaXRobVNIQTEuaCIKKyNpbmNsdWRlICJDcnlwdG9B
bGdvcml0aG1TSEExLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdm9pZCBDcnlwdG9BbGdv
cml0aG1SZWdpc3RyeTo6cGxhdGZvcm1SZWdpc3RlckFsZ29yaXRobXMoKQogewogLy8gICAgcmVn
aXN0ZXJBbGdvcml0aG0oQ3J5cHRvQWxnb3JpdGhtSE1BQzo6bV9uYW1lLCBDcnlwdG9BbGdvcml0
aG1ITUFDOjptX2lkZW50aWZpZXIsIENyeXB0b0FsZ29yaXRobUhNQUM6OmNyZWF0ZSk7Ci0vLyAg
ICByZWdpc3RlckFsZ29yaXRobShDcnlwdG9BbGdvcml0aG1TSEExOjptX25hbWUsIENyeXB0b0Fs
Z29yaXRobVNIQTE6Om1faWRlbnRpZmllciwgQ3J5cHRvQWxnb3JpdGhtU0hBMTo6Y3JlYXRlKTsK
KyAgICByZWdpc3RlckFsZ29yaXRobShDcnlwdG9BbGdvcml0aG1TSEExOjptX25hbWUsIENyeXB0
b0FsZ29yaXRobVNIQTE6Om1faWRlbnRpZmllciwgQ3J5cHRvQWxnb3JpdGhtU0hBMTo6Y3JlYXRl
KTsKIH0KIAogfQpJbmRleDogU291cmNlL1dlYkNvcmUvY3J5cHRvL21hYy9DcnlwdG9BbGdvcml0
aG1TSEExTWFjLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jcnlwdG8vbWFjL0Ny
eXB0b0FsZ29yaXRobVNIQTFNYWMuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUv
Y3J5cHRvL21hYy9DcnlwdG9BbGdvcml0aG1TSEExTWFjLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkNyeXB0b0FsZ29yaXRobVNIQTEuaCIKKworI2lmIEVOQUJMRShTVUJUTEVfQ1JZUFRPKQorCisj
aW5jbHVkZSAiSlNET01Qcm9taXNlLmgiCisjaW5jbHVkZSA8Q29tbW9uQ3J5cHRvL0NvbW1vbkNy
eXB0by5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgQ3J5cHRvQWxnb3JpdGhtU0hB
MTo6ZGlnZXN0KGNvbnN0IENyeXB0b0FsZ29yaXRobVBhcmFtZXRlcnMmLCBjb25zdCBWZWN0b3I8
Q3J5cHRvT3BlcmF0aW9uRGF0YT4mIGRhdGEsIHN0ZDo6dW5pcXVlX3B0cjxQcm9taXNlV3JhcHBl
cj4gcHJvbWlzZSwgRXhjZXB0aW9uQ29kZSYpCit7CisgICAgVmVjdG9yPHVuc2lnbmVkIGNoYXI+
IHJlc3VsdChDQ19TSEExX0RJR0VTVF9MRU5HVEgpOworCisgICAgQ0NfU0hBMV9DVFggY29udGV4
dDsKKyAgICBDQ19TSEExX0luaXQoJmNvbnRleHQpOworCisgICAgZm9yIChzaXplX3QgaSA9IDAs
IHNpemUgPSBkYXRhLnNpemUoKTsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgQ0NfU0hBMV9VcGRh
dGUoJmNvbnRleHQsIGRhdGFbaV0uZmlyc3QsIGRhdGFbaV0uc2Vjb25kKTsKKworICAgIENDX1NI
QTFfRmluYWwocmVzdWx0LmRhdGEoKSwgJmNvbnRleHQpOworCisgICAgcHJvbWlzZS0+ZnVsZmls
bChyZXN1bHQpOworfQorCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoU1VCVExFX0NSWVBUTykKSW5k
ZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFu
Z2VMb2cJKHJldmlzaW9uIDE1ODM4MSkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDI3IEBACisyMDEzLTEwLTMxICBBbGV4ZXkgUHJvc2t1cnlha292
ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFtXZWJDcnlwdG9dIEFkZCBTSEEtMQorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIzNTgyCisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBzZWN1cml0eS9yZXNv
dXJjZXMvY29tbW9uLmpzOiBBZGRlZCBmcm9tIEJsaW5rLgorICAgICAgICAoaW1wb3J0VGVzdEtl
eXMpOgorICAgICAgICAoYXNjaWlUb0FycmF5QnVmZmVyKToKKyAgICAgICAgKHByaW50UmVqZWN0
ZWRSZXN1bHQpOgorICAgICAgICAocHJpbnRBY2NlcHRlZFJlc3VsdCk6CisgICAgICAgIChmYWls
QW5kRmluaXNoSlNUZXN0KToKKworICAgICAgICAqIHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUtYXJn
dW1lbnRzLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogc2VjdXJpdHkvY3J5cHRvLXN1
YnRsZS1hcmd1bWVudHMuaHRtbDogQWRkZWQuCisgICAgICAgIEFkZGVkIHRlc3RzIGZvciBob3cg
YmluZGluZ3MgdHJlYXQgY3JhenkgYXJndW1lbnRzLiBIZWF2aWx5IGJhc2VkIG9uIGEgdGVzdCBm
cm9tIEJsaW5rLgorCisgICAgICAgICogc2VjdXJpdHkvY3J5cHRvLXN1YnRsZS1zaGExLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICogc2VjdXJpdHkvY3J5cHRvLXN1YnRsZS1zaGExLmh0
bWw6IEFkZGVkLgorICAgICAgICBUZXN0IHRoYXQgU0hBLTEgd29ya3MuCisKKyAgICAgICAgKiBU
ZXN0RXhwZWN0YXRpb25zOiBTa2lwIHRoZXNlIHRlc3RzIGV2ZXJ5d2hlcmUgZm9yIG5vdy4KKwog
MjAxMy0xMC0zMCAgR2F2aW4gQmFycmFjbG91Z2ggIDxiYXJyYWNsb3VnaEBhcHBsZS5jb20+CiAK
ICAgICAgICAgV2ViUGFnZUNyZWF0aW9uUGFyYW1ldGVycyBzaG91bGQgYmUgY29uc2lzdGVudCBp
biBXaW5kb3cub3BlbgpJbmRleDogTGF5b3V0VGVzdHMvVGVzdEV4cGVjdGF0aW9ucwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9UZXN0RXhwZWN0YXRpb25zCShyZXZpc2lvbiAxNTgzNzUpCisr
KyBMYXlvdXRUZXN0cy9UZXN0RXhwZWN0YXRpb25zCSh3b3JraW5nIGNvcHkpCkBAIC03NSw2ICs3
NSw4IEBAIGZhc3QvbWVkaWFzdHJlYW0vTWVkaWFTdHJlYW0tb25lbmRlZC5odG0KIHdlYmtpdC5v
cmcvYi8xMjI2Nzkgc2VjdXJpdHkvY3J5cHRvLXN1YnRsZS1nYy5odG1sIFsgU2tpcCBdCiB3ZWJr
aXQub3JnL2IvMTIyNjc5IHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUtZ2MtMi5odG1sIFsgU2tpcCBd
CiB3ZWJraXQub3JnL2IvMTIyNjc5IHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUtZ2MtMy5odG1sIFsg
U2tpcCBdCit3ZWJraXQub3JnL2IvMTIyNjc5IHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUtc2hhMS5o
dG1sIFsgU2tpcCBdCit3ZWJraXQub3JnL2IvMTIyNjc5IGNyeXB0by1zdWJ0bGUtYXJndW1lbnRz
Lmh0bWwgWyBTa2lwIF0KIAogd2Via2l0Lm9yZy9iLzEyMzU1NSBbIERlYnVnIF0gbWVkaWEvbWVk
aWEtZnJhZ21lbnRzL1RDMDA1NC5odG1sIFsgQ3Jhc2ggXQogd2Via2l0Lm9yZy9iLzEyMzU1NSBb
IERlYnVnIF0gbWVkaWEvbWVkaWEtZnJhZ21lbnRzL1RDMDA2MS5odG1sIFsgQ3Jhc2ggXQpJbmRl
eDogTGF5b3V0VGVzdHMvc2VjdXJpdHkvY3J5cHRvLXN1YnRsZS1hcmd1bWVudHMtZXhwZWN0ZWQu
dHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3NlY3VyaXR5L2NyeXB0by1zdWJ0bGUtYXJn
dW1lbnRzLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL3NlY3VyaXR5
L2NyeXB0by1zdWJ0bGUtYXJndW1lbnRzLWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDQwIEBACitUZXN0IGNyeXB0by5zdWJ0bGUgYXJndW1lbnQgY29udmVyc2lvbgorCitP
biBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xs
b3dlZCBieSAiVEVTVCBDT01QTEVURSIuCisKKworU0hBMSBvZiBuZXcgVWludDhBcnJheShbXSkp
CisgICAgPSBbZGEgMzkgYTMgZWUgNWUgNmIgNGIgMGQgMzIgNTUgYmYgZWYgOTUgNjAgMTggOTAg
YWYgZDggMDcgMDldCisKK1Bhc3NpbmcgYWxnb3JpdGhtIG5hbWUgYXMgYSBzdHJpbmcgb2JqZWN0
Li4uCitQQVNTIC4uLnN1Y2NlZWRlZAorCitQYXNzaW5nIGFsZ29yaXRobSBuYW1lIGFzIGEgc3Ry
aW5nIG9iamVjdCBpbiBhIGRpY3Rpb25hcnkuLi4KK1BBU1MgLi4uc3VjY2VlZGVkCisKK1Bhc3Np
bmcgYWxnb3JpdGhtIG5hbWUgYXMgYW4gb2JqZWN0IHdpdGggdG9TdHJpbmcKK1BBU1MgLi4uc3Vj
Y2VlZGVkCisKK1Bhc3NpbmcgaW52YWxpZCBkYXRhIHRvIGRpZ2VzdCgpCitQQVNTIGNyeXB0by5z
dWJ0bGUuZGlnZXN0KHtuYW1lOiAnc2hhLTEnfSkgdGhyZXcgZXhjZXB0aW9uIFR5cGVFcnJvcjog
Tm90IGVub3VnaCBhcmd1bWVudHMuCitQQVNTIGNyeXB0by5zdWJ0bGUuZGlnZXN0KHtuYW1lOiAn
c2hhLTEnfSwgbnVsbCkgdGhyZXcgZXhjZXB0aW9uIFR5cGVFcnJvcjogVHlwZSBlcnJvci4KK1BB
U1MgY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6ICdzaGEtMSd9LCAxMCkgdGhyZXcgZXhjZXB0
aW9uIFR5cGVFcnJvcjogVHlwZSBlcnJvci4KK1BBU1MgY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25h
bWU6ICdzaGEtMSd9LCBbMTBdKSB0aHJldyBleGNlcHRpb24gVHlwZUVycm9yOiBPbmx5IEFycmF5
QnVmZmVyIGFuZCBBcnJheUJ1ZmZlclZpZXcgb2JqZWN0cyBjYW4gYmUgcGFydCBvZiBDcnlwdG9P
cGVyYXRpb25EYXRhIHNlcXVlbmNlLgorUEFTUyBjcnlwdG8uc3VidGxlLmRpZ2VzdCh7bmFtZTog
J3NoYS0xJ30sIG5ldyBVaW50OEFycmF5KFswXSkpIHRocmV3IGV4Y2VwdGlvbiBUeXBlRXJyb3I6
IE9ubHkgQXJyYXlCdWZmZXIgYW5kIEFycmF5QnVmZmVyVmlldyBvYmplY3RzIGNhbiBiZSBwYXJ0
IG9mIENyeXB0b09wZXJhdGlvbkRhdGEgc2VxdWVuY2UuCisKK1Bhc3NpbmcgaW52YWxpZCBhbGdv
cml0aG1JZGVudGlmaWVycyB0byBkaWdlc3QoKQorUEFTUyBjcnlwdG8uc3VidGxlLmRpZ2VzdCh7
IHRvU3RyaW5nOmZ1bmN0aW9uKCkgeyByZXR1cm4gJ3NoYS0xJyB9IH0sIFtkYXRhXSkgdGhyZXcg
ZXhjZXB0aW9uIEVycm9yOiBOb3RTdXBwb3J0ZWRFcnJvcjogRE9NIEV4Y2VwdGlvbiA5LgorUEFT
UyBjcnlwdG8uc3VidGxlLmRpZ2VzdCh7bmFtZTogJyd9LCBbZGF0YV0pIHRocmV3IGV4Y2VwdGlv
biBFcnJvcjogTm90U3VwcG9ydGVkRXJyb3I6IERPTSBFeGNlcHRpb24gOS4KK1BBU1MgY3J5cHRv
LnN1YnRsZS5kaWdlc3Qoe25hbWU6IG51bGx9LCBbZGF0YV0pIHRocmV3IGV4Y2VwdGlvbiBFcnJv
cjogTm90U3VwcG9ydGVkRXJyb3I6IERPTSBFeGNlcHRpb24gOS4KK1BBU1MgY3J5cHRvLnN1YnRs
ZS5kaWdlc3Qoe25hbWU6IHVuZGVmaW5lZH0sIFtkYXRhXSkgdGhyZXcgZXhjZXB0aW9uIEVycm9y
OiBOb3RTdXBwb3J0ZWRFcnJvcjogRE9NIEV4Y2VwdGlvbiA5LgorUEFTUyBjcnlwdG8uc3VidGxl
LmRpZ2VzdCh7bmFtZTogJ3NoYSd9LCBbZGF0YV0pIHRocmV3IGV4Y2VwdGlvbiBFcnJvcjogTm90
U3VwcG9ydGVkRXJyb3I6IERPTSBFeGNlcHRpb24gOS4KK1BBU1MgY3J5cHRvLnN1YnRsZS5kaWdl
c3Qoe25hbWU6IDF9LCBbZGF0YV0pIHRocmV3IGV4Y2VwdGlvbiBFcnJvcjogTm90U3VwcG9ydGVk
RXJyb3I6IERPTSBFeGNlcHRpb24gOS4KK1BBU1MgY3J5cHRvLnN1YnRsZS5kaWdlc3QoJycsIFtk
YXRhXSkgdGhyZXcgZXhjZXB0aW9uIEVycm9yOiBOb3RTdXBwb3J0ZWRFcnJvcjogRE9NIEV4Y2Vw
dGlvbiA5LgorUEFTUyBjcnlwdG8uc3VidGxlLmRpZ2VzdChudWxsLCBbZGF0YV0pIHRocmV3IGV4
Y2VwdGlvbiBFcnJvcjogTm90U3VwcG9ydGVkRXJyb3I6IERPTSBFeGNlcHRpb24gOS4KK1BBU1Mg
Y3J5cHRvLnN1YnRsZS5kaWdlc3QodW5kZWZpbmVkLCBbZGF0YV0pIHRocmV3IGV4Y2VwdGlvbiBF
cnJvcjogTm90U3VwcG9ydGVkRXJyb3I6IERPTSBFeGNlcHRpb24gOS4KK1BBU1MgY3J5cHRvLnN1
YnRsZS5kaWdlc3QoMSwgW2RhdGFdKSB0aHJldyBleGNlcHRpb24gRXJyb3I6IE5vdFN1cHBvcnRl
ZEVycm9yOiBET00gRXhjZXB0aW9uIDkuCitQQVNTIGNyeXB0by5zdWJ0bGUuZGlnZXN0KHt9LCBb
ZGF0YV0pIHRocmV3IGV4Y2VwdGlvbiBFcnJvcjogTm90U3VwcG9ydGVkRXJyb3I6IERPTSBFeGNl
cHRpb24gOS4KK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVU
RQorCkluZGV4OiBMYXlvdXRUZXN0cy9zZWN1cml0eS9jcnlwdG8tc3VidGxlLWFyZ3VtZW50cy5o
dG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3NlY3VyaXR5L2NyeXB0by1zdWJ0bGUtYXJn
dW1lbnRzLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9zZWN1cml0eS9jcnlwdG8t
c3VidGxlLWFyZ3VtZW50cy5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjUgQEAKKzwh
RE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi9yZXNvdXJjZXMv
anMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InJlc291cmNlcy9jb21tb24u
anMiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8cCBpZD0iZGVzY3JpcHRpb24iPjwvcD4K
KzxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorCis8c2NyaXB0PgorZGVzY3JpcHRpb24oIlRlc3Qg
Y3J5cHRvLnN1YnRsZSBhcmd1bWVudCBjb252ZXJzaW9uIik7CisKK2pzVGVzdElzQXN5bmMgPSB0
cnVlOworCitpZiAoIXdpbmRvdy5zdWJ0bGUpCisgICAgd2luZG93LmNyeXB0by5zdWJ0bGUgPSB3
aW5kb3cuY3J5cHRvLndlYmtpdFN1YnRsZTsKKworUHJvbWlzZS5mdWxmaWxsKG51bGwpLnRoZW4o
ZnVuY3Rpb24oKSB7CisgICAgLy8gVGhpcyBsb29rcyBsaWtlIGludmFsaWQgaW5wdXQsIGJ1dCBp
dCBhY3R1YWxseSBpc24ndCAtIFVpbnQ4QXJyYXkgaXMgYSBzZXF1ZW5jZSB0b28sCisgICAgLy8g
c28gaXQncyBqdXN0IGFuIGVtcHR5IHNlcXVlbmNlLCBzYW1lIGFzIHBhc3NpbmcgW10uCisgICAg
ZGVidWcoIlNIQTEgb2YgbmV3IFVpbnQ4QXJyYXkoW10pKSIpOworICAgIHJldHVybiBjcnlwdG8u
c3VidGxlLmRpZ2VzdCgnc2hhLTEnLCBuZXcgVWludDhBcnJheShbXSkpOworfSkudGhlbihmdW5j
dGlvbihyZXN1bHQpIHsKKyAgICBwcmludEFjY2VwdGVkUmVzdWx0KHJlc3VsdCk7CisgICAgZGVi
dWcoIlxuUGFzc2luZyBhbGdvcml0aG0gbmFtZSBhcyBhIHN0cmluZyBvYmplY3QuLi4iKTsKKyAg
ICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3QobmV3IFN0cmluZygnc2hhLTEnKSwgW10pOwor
fSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICB0ZXN0UGFzc2VkKCIuLi5zdWNjZWVkZWQi
KTsKKyAgICBkZWJ1ZygiXG5QYXNzaW5nIGFsZ29yaXRobSBuYW1lIGFzIGEgc3RyaW5nIG9iamVj
dCBpbiBhIGRpY3Rpb25hcnkuLi4iKTsKKyAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3Qo
e25hbWU6IG5ldyBTdHJpbmcoJ3NoYS0xJyl9LCBbXSk7Cit9KS50aGVuKGZ1bmN0aW9uKHJlc3Vs
dCkgeworICAgIHRlc3RQYXNzZWQoIi4uLnN1Y2NlZWRlZCIpOworICAgIGRlYnVnKCJcblBhc3Np
bmcgYWxnb3JpdGhtIG5hbWUgYXMgYW4gb2JqZWN0IHdpdGggdG9TdHJpbmciKTsKKyAgICByZXR1
cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6IHsgdG9TdHJpbmc6ZnVuY3Rpb24oKSB7IHJl
dHVybiAnc2hhLTEnIH0gfSB9LCBbXSk7Cit9KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAg
IHRlc3RQYXNzZWQoIi4uLnN1Y2NlZWRlZCIpOworCisgICAgZGVidWcoIlxuUGFzc2luZyBpbnZh
bGlkIGRhdGEgdG8gZGlnZXN0KCkiKTsKKyAgICBzaG91bGRUaHJvdygiY3J5cHRvLnN1YnRsZS5k
aWdlc3Qoe25hbWU6ICdzaGEtMSd9KSIpOworICAgIHNob3VsZFRocm93KCJjcnlwdG8uc3VidGxl
LmRpZ2VzdCh7bmFtZTogJ3NoYS0xJ30sIG51bGwpIik7CisgICAgc2hvdWxkVGhyb3coImNyeXB0
by5zdWJ0bGUuZGlnZXN0KHtuYW1lOiAnc2hhLTEnfSwgMTApIik7CisgICAgc2hvdWxkVGhyb3co
ImNyeXB0by5zdWJ0bGUuZGlnZXN0KHtuYW1lOiAnc2hhLTEnfSwgWzEwXSkiKTsKKyAgICBzaG91
bGRUaHJvdygiY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6ICdzaGEtMSd9LCBuZXcgVWludDhB
cnJheShbMF0pKSIpOworCisgICAgZGVidWcoIlxuUGFzc2luZyBpbnZhbGlkIGFsZ29yaXRobUlk
ZW50aWZpZXJzIHRvIGRpZ2VzdCgpIik7CisgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KFswXSk7
CisgICAgc2hvdWxkVGhyb3coImNyeXB0by5zdWJ0bGUuZGlnZXN0KHsgdG9TdHJpbmc6ZnVuY3Rp
b24oKSB7IHJldHVybiAnc2hhLTEnIH0gfSwgW2RhdGFdKSIpOyAvLyBBbGdvcml0aG0gbm9ybWFs
aXphdGlvbiBkb2Vzbid0IGF0dGVtcHQgdG8gY2FsbCB0b1N0cmluZy4KKyAgICBzaG91bGRUaHJv
dygiY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6ICcnfSwgW2RhdGFdKSIpOworICAgIHNob3Vs
ZFRocm93KCJjcnlwdG8uc3VidGxlLmRpZ2VzdCh7bmFtZTogbnVsbH0sIFtkYXRhXSkiKTsKKyAg
ICBzaG91bGRUaHJvdygiY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6IHVuZGVmaW5lZH0sIFtk
YXRhXSkiKTsKKyAgICBzaG91bGRUaHJvdygiY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6ICdz
aGEnfSwgW2RhdGFdKSIpOworICAgIHNob3VsZFRocm93KCJjcnlwdG8uc3VidGxlLmRpZ2VzdCh7
bmFtZTogMX0sIFtkYXRhXSkiKTsKKyAgICBzaG91bGRUaHJvdygiY3J5cHRvLnN1YnRsZS5kaWdl
c3QoJycsIFtkYXRhXSkiKTsKKyAgICBzaG91bGRUaHJvdygiY3J5cHRvLnN1YnRsZS5kaWdlc3Qo
bnVsbCwgW2RhdGFdKSIpOworICAgIHNob3VsZFRocm93KCJjcnlwdG8uc3VidGxlLmRpZ2VzdCh1
bmRlZmluZWQsIFtkYXRhXSkiKTsKKyAgICBzaG91bGRUaHJvdygiY3J5cHRvLnN1YnRsZS5kaWdl
c3QoMSwgW2RhdGFdKSIpOworICAgIHNob3VsZFRocm93KCJjcnlwdG8uc3VidGxlLmRpZ2VzdCh7
fSwgW2RhdGFdKSIpOworfSkudGhlbihmaW5pc2hKU1Rlc3QpOworCis8L3NjcmlwdD4KKworPHNj
cmlwdCBzcmM9Ii4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5
PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvc2VjdXJpdHkvY3J5cHRvLXN1YnRsZS1zaGEx
LWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9zZWN1cml0eS9jcnlwdG8t
c3VidGxlLXNoYTEtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvc2Vj
dXJpdHkvY3J5cHRvLXN1YnRsZS1zaGExLWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDE4IEBACitUZXN0IGNyeXB0by5zdWJ0bGUuZGlnZXN0LgorCitPbiBzdWNjZXNzLCB5
b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVT
VCBDT01QTEVURSIuCisKKworU0hBMSBvZiBbXQorICAgID0gW2RhIDM5IGEzIGVlIDVlIDZiIDRi
IDBkIDMyIDU1IGJmIGVmIDk1IDYwIDE4IDkwIGFmIGQ4IDA3IDA5XQorU0hBMSBvZiBbMHgwXQor
ICAgID0gWzViIGE5IDNjIDlkIGIwIGNmIGY5IDNmIDUyIGI1IDIxIGQ3IDQyIDBlIDQzIGY2IGVk
IGEyIDc4IDRmXQorU0hBMSBvZiBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdCisg
ICAgPSBbMmMgN2UgN2MgMzggNGYgNzggMjkgNjkgNDIgODIgYjEgZTMgYTYgMjEgNmQgZWYgODAg
ODIgZDAgNTVdCitTSEExIG9mIFtuZXcgVWludDhBcnJheShbMCwgMSwgMiwgMywgNF0pLCBuZXcg
VWludDhBcnJheSg1LCA2LCA3LCA4LCA5LCAxMF0pXQorICAgID0gWzJjIDdlIDdjIDM4IDRmIDc4
IDI5IDY5IDQyIDgyIGIxIGUzIGE2IDIxIDZkIGVmIDgwIDgyIGQwIDU1XQorUEFTUyBjcnlwdG8u
c3VidGxlLmdlbmVyYXRlS2V5KCdzaGEtMScpIHRocmV3IGV4Y2VwdGlvbiBUeXBlRXJyb3I6IHVu
ZGVmaW5lZCBpcyBub3QgYSBmdW5jdGlvbiAoZXZhbHVhdGluZyAnY3J5cHRvLnN1YnRsZS5nZW5l
cmF0ZUtleSgnc2hhLTEnKScpLgorUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitU
RVNUIENPTVBMRVRFCisKSW5kZXg6IExheW91dFRlc3RzL3NlY3VyaXR5L2NyeXB0by1zdWJ0bGUt
c2hhMS5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3NlY3VyaXR5L2NyeXB0by1zdWJ0
bGUtc2hhMS5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvc2VjdXJpdHkvY3J5cHRv
LXN1YnRsZS1zaGExLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NyBAQAorPCFET0NU
WVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4uL3Jlc291cmNlcy9qcy10
ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2VzL2NvbW1vbi5qcyI+
PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwIGlkPSJkZXNjcmlwdGlvbiI+PC9wPgorPGRp
diBpZD0iY29uc29sZSI+PC9kaXY+CisKKzxzY3JpcHQ+CitkZXNjcmlwdGlvbigiVGVzdCBjcnlw
dG8uc3VidGxlLmRpZ2VzdC4iKTsKKworanNUZXN0SXNBc3luYyA9IHRydWU7CisKK2lmICghd2lu
ZG93LnN1YnRsZSkKKyAgICB3aW5kb3cuY3J5cHRvLnN1YnRsZSA9IHdpbmRvdy5jcnlwdG8ud2Vi
a2l0U3VidGxlOworCitQcm9taXNlLmZ1bGZpbGwobnVsbCkudGhlbihmdW5jdGlvbigpIHsKKyAg
ICBkZWJ1ZygiU0hBMSBvZiBbXSIpOworICAgIHJldHVybiBjcnlwdG8uc3VidGxlLmRpZ2VzdCgn
c2hhLTEnLCBbbmV3IFVpbnQ4QXJyYXkoW10pXSk7Cit9KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkg
eworICAgIHByaW50QWNjZXB0ZWRSZXN1bHQocmVzdWx0KTsKKworICAgIGRlYnVnKCJTSEExIG9m
IFsweDBdIikKKyAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6ICdzaGEtMSd9
LCBbbmV3IFVpbnQ4QXJyYXkoWzBdKV0pOworfSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAg
ICBwcmludEFjY2VwdGVkUmVzdWx0KHJlc3VsdCk7CisKKyAgICBkZWJ1ZygiU0hBMSBvZiBbMCwg
MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdIik7CisgICAgdmFyIGRhdGEgPSBuZXcgVWlu
dDhBcnJheShbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdKTsKKyAgICByZXR1cm4g
Y3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6ICdzaGEtMSd9LCBbZGF0YV0pOworfSkudGhlbihm
dW5jdGlvbihyZXN1bHQpIHsKKyAgICBwcmludEFjY2VwdGVkUmVzdWx0KHJlc3VsdCk7CisKKyAg
ICBkZWJ1ZygiU0hBMSBvZiBbbmV3IFVpbnQ4QXJyYXkoWzAsIDEsIDIsIDMsIDRdKSwgbmV3IFVp
bnQ4QXJyYXkoNSwgNiwgNywgOCwgOSwgMTBdKV0iKTsKKyAgICByZXR1cm4gY3J5cHRvLnN1YnRs
ZS5kaWdlc3Qoe25hbWU6ICdzaGEtMSd9LCBbbmV3IFVpbnQ4QXJyYXkoWzAsIDEsIDIsIDMsIDRd
KSwgbmV3IFVpbnQ4QXJyYXkoWzUsIDYsIDcsIDgsIDksIDEwXSldKTsKK30pLnRoZW4oZnVuY3Rp
b24ocmVzdWx0KSB7CisgICAgcHJpbnRBY2NlcHRlZFJlc3VsdChyZXN1bHQpOworICAgIHNob3Vs
ZFRocm93KCJjcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KCdzaGEtMScpIik7CisgICAgZmluaXNo
SlNUZXN0KCk7Cit9KTsKKzwvc2NyaXB0PgorCis8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL2pz
LXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRU
ZXN0cy9zZWN1cml0eS9yZXNvdXJjZXMvY29tbW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRl
c3RzL3NlY3VyaXR5L3Jlc291cmNlcy9jb21tb24uanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRU
ZXN0cy9zZWN1cml0eS9yZXNvdXJjZXMvY29tbW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNjMgQEAKK2Z1bmN0aW9uIGltcG9ydFRlc3RLZXlzKCkKK3sKKyAgICB2YXIga2V5Rm9ybWF0
ID0gInNwa2kiOworICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoW10pOworICAgIHZhciBl
eHRyYWN0YWJsZSA9IGZhbHNlOworICAgIHZhciBrZXlVc2FnZXMgPSBbJ2VuY3J5cHQnLCAnZGVj
cnlwdCcsICdzaWduJywgJ3ZlcmlmeSddOworCisgICAgdmFyIGhtYWNQcm9taXNlID0gY3J5cHRv
LnN1YnRsZS5pbXBvcnRLZXkoa2V5Rm9ybWF0LCBkYXRhLCB7bmFtZTogJ2htYWMnLCBoYXNoOiB7
bmFtZTogJ3NoYS0xJ319LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTsKKyAgICB2YXIgcnNhU3Nh
UHJvbWlzZSA9IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KGtleUZvcm1hdCwgZGF0YSwge25hbWU6
ICdSU0FTU0EtUEtDUzEtdjFfNScsIGhhc2g6IHtuYW1lOiAnc2hhLTEnfX0sIGV4dHJhY3RhYmxl
LCBrZXlVc2FnZXMpOworICAgIHZhciBhZXNDYmNQcm9taXNlID0gY3J5cHRvLnN1YnRsZS5pbXBv
cnRLZXkoa2V5Rm9ybWF0LCBkYXRhLCB7bmFtZTogJ0FFUy1DQkMnfSwgZXh0cmFjdGFibGUsIGtl
eVVzYWdlcyk7CisgICAgdmFyIGFlc0NiY0p1c3REZWNyeXB0ID0gY3J5cHRvLnN1YnRsZS5pbXBv
cnRLZXkoa2V5Rm9ybWF0LCBkYXRhLCB7bmFtZTogJ0FFUy1DQkMnfSwgZXh0cmFjdGFibGUsIFsn
ZGVjcnlwdCddKTsKKworICAgIHJldHVybiBQcm9taXNlLmV2ZXJ5KGhtYWNQcm9taXNlLCByc2FT
c2FQcm9taXNlLCBhZXNDYmNQcm9taXNlLCBhZXNDYmNKdXN0RGVjcnlwdCkudGhlbihmdW5jdGlv
bihyZXN1bHRzKSB7CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBobWFjU2hhMTogcmVz
dWx0c1swXSwKKyAgICAgICAgICAgIHJzYVNzYVNoYTE6IHJlc3VsdHNbMV0sCisgICAgICAgICAg
ICBhZXNDYmM6IHJlc3VsdHNbMl0sCisgICAgICAgICAgICBhZXNDYmNKdXN0RGVjcnlwdDogcmVz
dWx0c1szXSwKKyAgICAgICAgfTsKKyAgICB9KTsKK30KKworLy8gQnVpbGRzIGEgaGV4IHN0cmlu
ZyByZXByZXNlbnRhdGlvbiBvZiBhbnkgYXJyYXktbGlrZSBpbnB1dCAoYXJyYXkgb3IKKy8vIEFy
cmF5QnVmZmVyVmlldykuIFRoZSBvdXRwdXQgbG9va3MgbGlrZSB0aGlzOgorLy8gICAgW2FiIDAz
IDRjIDk5XQorZnVuY3Rpb24gYnl0ZUFycmF5VG9IZXhTdHJpbmcoYnl0ZXMpCit7CisgICAgdmFy
IGhleEJ5dGVzID0gW107CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsg
KytpKSB7CisgICAgICAgIHZhciBieXRlU3RyaW5nID0gYnl0ZXNbaV0udG9TdHJpbmcoMTYpOwor
ICAgICAgICBpZiAoYnl0ZVN0cmluZy5sZW5ndGggPCAyKQorICAgICAgICAgICAgYnl0ZVN0cmlu
ZyA9ICIwIiArIGJ5dGVTdHJpbmc7CisgICAgICAgIGhleEJ5dGVzLnB1c2goYnl0ZVN0cmluZyk7
CisgICAgfQorCisgICAgcmV0dXJuICJbIiArIGhleEJ5dGVzLmpvaW4oIiAiKSArICJdIjsKK30K
KworZnVuY3Rpb24gYXNjaWlUb0FycmF5QnVmZmVyKHN0cikKK3sKKyAgICB2YXIgY2hhcnMgPSBb
XTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkKKyAgICAgICAgY2hh
cnMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7CisgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGNo
YXJzKTsKK30KKworZnVuY3Rpb24gcHJpbnRSZWplY3RlZFJlc3VsdCh2YWx1ZSkKK3sKKyAgICBk
ZWJ1ZygiICAgIHJlamVjdGVkIHdpdGggdmFsdWUgb2YgIiArIHZhbHVlKTsKK30KKworZnVuY3Rp
b24gcHJpbnRBY2NlcHRlZFJlc3VsdChyZXN1bHQpCit7CisgICAgZGVidWcoIiAgICA9ICIgKyBi
eXRlQXJyYXlUb0hleFN0cmluZyhuZXcgVWludDhBcnJheShyZXN1bHQpKSk7Cit9CisKK2Z1bmN0
aW9uIGZhaWxBbmRGaW5pc2hKU1Rlc3QoZXJyb3IpCit7CisgICAgaWYgKGVycm9yKQorICAgICAg
IGRlYnVnKGVycm9yKTsKKyAgICBmaW5pc2hKU1Rlc3QoKTsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>215664</attachid>
            <date>2013-10-31 12:20:48 -0700</date>
            <delta_ts>2013-10-31 13:45:51 -0700</delta_ts>
            <desc>with a better skip list</desc>
            <filename>AddSHA1.txt</filename>
            <type>text/plain</type>
            <size>31719</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE1ODM3OSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM0IEBACisyMDEzLTEwLTMxICBBbGV4ZXkg
UHJvc2t1cnlha292ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFtXZWJDcnlwdG9dIEFkZCBT
SEEtMQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIz
NTgyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGVz
dHM6IHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUtYXJndW1lbnRzLmh0bWwKKyAgICAgICAgICAgICAg
IHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUtc2hhMS5odG1sCisKKyAgICAgICAgKiBXZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2o6IEFkZGVkIG5ldyBmaWxlcy4KKworICAgICAgICAqIGJp
bmRpbmdzL2pzL0pTU3VidGxlQ3J5cHRvQ3VzdG9tLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNy
ZWF0ZUFsZ29yaXRobUZyb21KU1ZhbHVlKToKKyAgICAgICAgKFdlYkNvcmU6OnNlcXVlbmNlT2ZD
cnlwdG9PcGVyYXRpb25EYXRhRnJvbUpTVmFsdWUpOgorICAgICAgICAoV2ViQ29yZTo6SlNTdWJ0
bGVDcnlwdG86OmRpZ2VzdCk6CisgICAgICAgICogY3J5cHRvL1N1YnRsZUNyeXB0by5pZGw6Cisg
ICAgICAgIEFkZGVkIGJpbmRpbmdzIGZvciBjcnlwdG8uZGlnZXN0LgorCisgICAgICAgICogY3J5
cHRvL2FsZ29yaXRobXM6IEFkZGVkLgorICAgICAgICAqIGNyeXB0by9hbGdvcml0aG1zL0NyeXB0
b0FsZ29yaXRobVNIQTEuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBjcnlwdG8vYWxnb3JpdGhtcy9D
cnlwdG9BbGdvcml0aG1TSEExLmg6IEFkZGVkLgorICAgICAgICAqIGNyeXB0by9tYWMvQ3J5cHRv
QWxnb3JpdGhtUmVnaXN0cnlNYWMuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q3J5cHRvQWxnb3Jp
dGhtUmVnaXN0cnk6OnBsYXRmb3JtUmVnaXN0ZXJBbGdvcml0aG1zKTogUmVnaXN0ZXIgU0hBLTEu
CisKKyAgICAgICAgKiBjcnlwdG8vbWFjL0NyeXB0b0FsZ29yaXRobVNIQTFNYWMuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OkNyeXB0b0FsZ29yaXRobVNIQTE6OmRpZ2VzdCk6IFBlcmZv
cm1zIHRoZSB3b3JrIHN5bmNocm9ub3VzbHksIGJlY2F1c2UKKyAgICAgICAgb3RoZXJ3aXNlIHdl
J2QgaGF2ZSB0byBjb3B5IHRoZSBkYXRhIGZpcnN0LCB3aGljaCBpcyBjcmF6eSBmb3Igc29tZXRo
aW5nIGFzIHNpbXBsZQorICAgICAgICBhcyBoYXNoaW5nLiBXZSBjYW4gY2hhbmdlIHRvIGEgZGlz
cGF0Y2ggcXVldWUgbGF0ZXIgaWYgd2UgZmluZCB0aGF0IGl0J3MgYWN0dWFsbHkKKyAgICAgICAg
YmV0dGVyIHRvIGNvcHkgYW5kIGRvIHRoZSB3b3JrIGFzeW5jaHJvbm91c2x5LgorCiAyMDEzLTEw
LTMxICBNeWxlcyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CiAKICAgICAgICAg
RGVjb3JhdGVkIHRleHQgc29tZXRpbWVzIGRvZXMgbm90IGRyYXcgaXRzIGRlY29yYXRpb25zCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCShyZXZpc2lvbiAxNTgzNzUpCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTU1MDIsNiArNTUwMiw5IEBACiAJ
CUUxMUM5RDlCMEVCMzY4MTIwMEU0MDlEQiAvKiBTY3JpcHRFeGVjdXRpb25Db250ZXh0LmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTFDOUQ5QTBFQjM2
ODEyMDBFNDA5REIgLyogU2NyaXB0RXhlY3V0aW9uQ29udGV4dC5oICovOyBzZXR0aW5ncyA9IHtB
VFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUUxMUM5REIwMEVCMzY5OTUwMEU0MDlE
QiAvKiBTY3JpcHRFeGVjdXRpb25Db250ZXh0LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxMUM5REFGMEVCMzY5OTUwMEU0MDlEQiAvKiBTY3JpcHRF
eGVjdXRpb25Db250ZXh0LmNwcCAqLzsgfTsKIAkJRTEyNDc0ODQxMEFBMTYxRDAwQjc5NDkzIC8q
IEF1dGhlbnRpY2F0aW9uQ2xpZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBFMTI0NzQ4MzEwQUExNjFEMDBCNzk0OTMgLyogQXV0aGVudGljYXRpb25D
bGllbnQuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9Owor
CQlFMTI1RjgyQjE4MjJDRkVDMDBEODRDRDkgLyogQ3J5cHRvQWxnb3JpdGhtU0hBMS5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTI1RjgyOTE4MjJD
RkVDMDBEODRDRDkgLyogQ3J5cHRvQWxnb3JpdGhtU0hBMS5jcHAgKi87IH07CisJCUUxMjVGODJD
MTgyMkNGRUMwMEQ4NENEOSAvKiBDcnlwdG9BbGdvcml0aG1TSEExLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTI1RjgyQTE4MjJDRkVDMDBEODRDRDkg
LyogQ3J5cHRvQWxnb3JpdGhtU0hBMS5oICovOyB9OworCQlFMTI1RjgyRTE4MjJDRkZGMDBEODRD
RDkgLyogQ3J5cHRvQWxnb3JpdGhtU0hBMU1hYy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTI1RjgyRDE4MjJDRkZGMDBEODRDRDkgLyogQ3J5cHRv
QWxnb3JpdGhtU0hBMU1hYy5jcHAgKi87IH07CiAJCUUxMjcxOUM3MEVFRUMxNjgwMEY2MTIxMyAv
KiBOYXZpZ2F0b3JCYXNlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBFMTI3MTlDNjBFRUVDMTY4MDBGNjEyMTMgLyogTmF2aWdhdG9yQmFzZS5oICovOyB9
OwogCQlFMTI3MTlDQTBFRUVDMjEzMDBGNjEyMTMgLyogTmF2aWdhdG9yQmFzZS5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTI3MTlDOTBFRUVDMjEz
MDBGNjEyMTMgLyogTmF2aWdhdG9yQmFzZS5jcHAgKi87IH07CiAJCUUxMjcxQTBCMEVFRUM3N0Ew
MEY2MTIxMyAvKiBXb3JrZXJOYXZpZ2F0b3IuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEUxMjcxQTBBMEVFRUM3N0EwMEY2MTIxMyAvKiBXb3JrZXJOYXZp
Z2F0b3IuaCAqLzsgfTsKQEAgLTEyNTA2LDYgKzEyNTA5LDkgQEAKIAkJRTExQzlEOUEwRUIzNjgx
MjAwRTQwOURCIC8qIFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gU2NyaXB0RXhlY3V0aW9uQ29udGV4dC5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlFMTFDOURBRjBFQjM2OTk1MDBFNDA5REIgLyogU2NyaXB0RXhlY3V0aW9u
Q29udGV4dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBTY3JpcHRF
eGVjdXRpb25Db250ZXh0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTEyNDc0
ODMxMEFBMTYxRDAwQjc5NDkzIC8qIEF1dGhlbnRpY2F0aW9uQ2xpZW50LmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEF1dGhlbnRpY2F0aW9uQ2xpZW50Lmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CisJCUUxMjVGODI5MTgyMkNGRUMwMEQ4NENEOSAvKiBDcnlwdG9BbGdv
cml0aG1TSEExLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENyeXB0
b0FsZ29yaXRobVNIQTEuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFMTI1Rjgy
QTE4MjJDRkVDMDBEODRDRDkgLyogQ3J5cHRvQWxnb3JpdGhtU0hBMS5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBDcnlwdG9BbGdvcml0aG1TSEExLmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCUUxMjVGODJEMTgyMkNGRkYwMEQ4NENEOSAvKiBDcnlwdG9BbGdvcml0
aG1TSEExTWFjLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IENyeXB0
b0FsZ29yaXRobVNIQTFNYWMuY3BwOyBwYXRoID0gbWFjL0NyeXB0b0FsZ29yaXRobVNIQTFNYWMu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFMTI3MTlDNjBFRUVDMTY4MDBGNjEy
MTMgLyogTmF2aWdhdG9yQmFzZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBO
YXZpZ2F0b3JCYXNlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUUxMjcxOUM5MEVF
RUMyMTMwMEY2MTIxMyAvKiBOYXZpZ2F0b3JCYXNlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgcGF0aCA9IE5hdmlnYXRvckJhc2UuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQlFMTI3MUEwQTBFRUVDNzdBMDBGNjEyMTMgLyogV29ya2VyTmF2aWdhdG9yLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdvcmtlck5hdmlnYXRvci5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwpAQCAtMjAxMzIsNiArMjAxMzgsNyBAQAogCQkJaXNhID0gUEJY
R3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKIAkJCQlFMUJCODRBQzE4MjJDQTc0MDA1MjUwNDMgLyog
Q3J5cHRvQWxnb3JpdGhtUmVnaXN0cnlNYWMuY3BwICovLAorCQkJCUUxMjVGODJEMTgyMkNGRkYw
MEQ4NENEOSAvKiBDcnlwdG9BbGdvcml0aG1TSEExTWFjLmNwcCAqLywKIAkJCSk7CiAJCQluYW1l
ID0gbWFjOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKQEAgLTIwMTM5LDYgKzIwMTQ2LDgg
QEAKIAkJRTE3MkFGN0MxODBGM0IwRDAwRkJBREI5IC8qIGFsZ29yaXRobXMgKi8gPSB7CiAJCQlp
c2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKAorCQkJCUUxMjVGODI5MTgyMkNGRUMwMEQ4
NENEOSAvKiBDcnlwdG9BbGdvcml0aG1TSEExLmNwcCAqLywKKwkJCQlFMTI1RjgyQTE4MjJDRkVD
MDBEODRDRDkgLyogQ3J5cHRvQWxnb3JpdGhtU0hBMS5oICovLAogCQkJKTsKIAkJCXBhdGggPSBh
bGdvcml0aG1zOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKQEAgLTIzNjA0LDYgKzIzNjEz
LDcgQEAKIAkJCQlFNDQ2MTNBRDBDRDYzMzEwMDBGQURBNzUgLyogTWVkaWFFcnJvci5oIGluIEhl
YWRlcnMgKi8sCiAJCQkJNEUxOTU5MjIwQTM5REFCQTAwMjIwRkU1IC8qIE1lZGlhRmVhdHVyZU5h
bWVzLmggaW4gSGVhZGVycyAqLywKIAkJCQkwN0E2RDFFQzE0OTExMzc3MDAwNTFEMEMgLyogTWVk
aWFGcmFnbWVudFVSSVBhcnNlci5oIGluIEhlYWRlcnMgKi8sCisJCQkJRTEyNUY4MkMxODIyQ0ZF
QzAwRDg0Q0Q5IC8qIENyeXB0b0FsZ29yaXRobVNIQTEuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4
RUE4MDBFMEExOTUxNkUwMEE4RUY1RiAvKiBNZWRpYUxpc3QuaCBpbiBIZWFkZXJzICovLAogCQkJ
CUU0NDYxM0U0MENENjgxQTIwMEZBREE3NSAvKiBNZWRpYVBsYXllci5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJMDc2RjBEMEUxMkI4MTkyNzAwQzI2QUE0IC8qIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91
bmRhdGlvbi5oIGluIEhlYWRlcnMgKi8sCkBAIC0yNTY2Niw2ICsyNTY3Niw3IEBACiAJCQkJODVE
RjJGOUMwQUEzQ0FFNTAwQUQ2NEM1IC8qIERPTUhUTUxPcHRpb25zQ29sbGVjdGlvbi5tbSBpbiBT
b3VyY2VzICovLAogCQkJCTg1MTgzQjQ3MEFBNjkyNjEwMEYxOUZBMyAvKiBET01IVE1MUGFyYWdy
YXBoRWxlbWVudC5tbSBpbiBTb3VyY2VzICovLAogCQkJCTg1RUNCRUY4MEFBNzYyNjkwMDU0NEYw
QiAvKiBET01IVE1MUGFyYW1FbGVtZW50Lm1tIGluIFNvdXJjZXMgKi8sCisJCQkJRTEyNUY4MkIx
ODIyQ0ZFQzAwRDg0Q0Q5IC8qIENyeXB0b0FsZ29yaXRobVNIQTEuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJODUxODNCNDkwQUE2OTI2MTAwRjE5RkEzIC8qIERPTUhUTUxQcmVFbGVtZW50Lm1tIGlu
IFNvdXJjZXMgKi8sCiAJCQkJQTQyMjZFOTYxMTYzRDczQTAwOEI4Mzk3IC8qIERPTUhUTUxQcm9n
cmVzc0VsZW1lbnQubW0gaW4gU291cmNlcyAqLywKIAkJCQk4NTE4M0I0QjBBQTY5MjYxMDBGMTlG
QTMgLyogRE9NSFRNTFF1b3RlRWxlbWVudC5tbSBpbiBTb3VyY2VzICovLApAQCAtMjYwNTcsNiAr
MjYwNjgsNyBAQAogCQkJCUQ2NjgxN0ZBMTY2RkU2RDcwMEZBMDdCNCAvKiBIVE1MVGVtcGxhdGVF
bGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4MTM2OUQ3MDk3Mzc0RjYwMEQ3NDQ2MyAv
KiBIVE1MVGV4dEFyZWFFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTlCQzZDMjFDMTND
Q0M5N0IwMDhFMDMzNyAvKiBIVE1MVGV4dEZvcm1Db250cm9sRWxlbWVudC5jcHAgaW4gU291cmNl
cyAqLywKKwkJCQlFMTI1RjgyRTE4MjJDRkZGMDBEODRDRDkgLyogQ3J5cHRvQWxnb3JpdGhtU0hB
MU1hYy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODcxREMyOTBBMTUyMDU3MDBCMTJBNjggLyog
SFRNTFRpdGxlRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5NzdCMzg3NzEyMjg4M0U5
MDBCODFGRjggLyogSFRNTFRva2VuaXplci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwNzA3NTY4
QjE0MjI2MkQ2MDA0MTQxNjEgLyogSFRNTFRyYWNrRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLywK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL2pzL0pTU3VidGxlQ3J5cHRvQ3VzdG9tLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9qcy9KU1N1YnRsZUNyeXB0
b0N1c3RvbS5jcHAJKHJldmlzaW9uIDE1ODM3NSkKKysrIFNvdXJjZS9XZWJDb3JlL2JpbmRpbmdz
L2pzL0pTU3VidGxlQ3J5cHRvQ3VzdG9tLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsMTAgKzI4
LDkyIEBACiAKICNpZiBFTkFCTEUoU1VCVExFX0NSWVBUTykKIAorI2luY2x1ZGUgIkNyeXB0b0Fs
Z29yaXRobS5oIgorI2luY2x1ZGUgIkNyeXB0b0FsZ29yaXRobVBhcmFtZXRlcnMuaCIKKyNpbmNs
dWRlICJDcnlwdG9BbGdvcml0aG1SZWdpc3RyeS5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisj
aW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgorI2luY2x1ZGUgIkpTQ3J5cHRvQWxnb3JpdGhtRGlj
dGlvbmFyeS5oIgorI2luY2x1ZGUgIkpTRE9NUHJvbWlzZS5oIgorI2luY2x1ZGUgPHJ1bnRpbWUv
RXJyb3IuaD4KKwordXNpbmcgbmFtZXNwYWNlIEpTQzsKKwogbmFtZXNwYWNlIFdlYkNvcmUgewog
CitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPENyeXB0b0FsZ29yaXRobT4gY3JlYXRlQWxnb3JpdGht
RnJvbUpTVmFsdWUoRXhlY1N0YXRlKiBleGVjLCBKU1ZhbHVlIHZhbHVlKQoreworICAgIENyeXB0
b0FsZ29yaXRobUlkZW50aWZpZXIgYWxnb3JpdGhtSWRlbnRpZmllcjsKKyAgICBpZiAoIUpTQ3J5
cHRvQWxnb3JpdGhtRGljdGlvbmFyeTo6Z2V0QWxnb3JpdGhtSWRlbnRpZmllcihleGVjLCB2YWx1
ZSwgYWxnb3JpdGhtSWRlbnRpZmllcikpIHsKKyAgICAgICAgQVNTRVJUKGV4ZWMtPmhhZEV4Y2Vw
dGlvbigpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRy
PENyeXB0b0FsZ29yaXRobT4gcmVzdWx0KENyeXB0b0FsZ29yaXRobVJlZ2lzdHJ5OjpzaGFyZWQo
KS5jcmVhdGUoYWxnb3JpdGhtSWRlbnRpZmllcikpOworICAgIGlmICghcmVzdWx0KQorICAgICAg
ICBzZXRET01FeGNlcHRpb24oZXhlYywgTk9UX1NVUFBPUlRFRF9FUlIpOworICAgIHJldHVybiBz
dGQ6Om1vdmUocmVzdWx0KTsKK30KKworc3RhdGljIGJvb2wgc2VxdWVuY2VPZkNyeXB0b09wZXJh
dGlvbkRhdGFGcm9tSlNWYWx1ZShFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgdmFsdWUsIFZlY3Rv
cjxDcnlwdG9PcGVyYXRpb25EYXRhPiYgcmVzdWx0KQoreworICAgIHVuc2lnbmVkIHNlcXVlbmNl
TGVuZ3RoOworICAgIEpTT2JqZWN0KiBzZXF1ZW5jZSA9IHRvSlNTZXF1ZW5jZShleGVjLCB2YWx1
ZSwgc2VxdWVuY2VMZW5ndGgpOworICAgIGlmICghc2VxdWVuY2UpIHsKKyAgICAgICAgQVNTRVJU
KGV4ZWMtPmhhZEV4Y2VwdGlvbigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzZXF1ZW5jZUxlbmd0aDsgKytpKSB7CisgICAg
ICAgIEpTVmFsdWUgaXRlbSA9IHNlcXVlbmNlLT5nZXQoZXhlYywgaSk7CisgICAgICAgIGlmIChB
cnJheUJ1ZmZlciogYnVmZmVyID0gdG9BcnJheUJ1ZmZlcihpdGVtKSkKKyAgICAgICAgICAgIHJl
c3VsdC5hcHBlbmQoc3RkOjptYWtlX3BhaXIoc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1ZmZlci0+ZGF0
YSgpKSwgYnVmZmVyLT5ieXRlTGVuZ3RoKCkpKTsKKyAgICAgICAgZWxzZSBpZiAoUmVmUHRyPEFy
cmF5QnVmZmVyVmlldz4gYnVmZmVyVmlldyA9IHRvQXJyYXlCdWZmZXJWaWV3KGl0ZW0pKQorICAg
ICAgICAgICAgcmVzdWx0LmFwcGVuZChzdGQ6Om1ha2VfcGFpcihzdGF0aWNfY2FzdDxjaGFyKj4o
YnVmZmVyVmlldy0+YmFzZUFkZHJlc3MoKSksIGJ1ZmZlclZpZXctPmJ5dGVMZW5ndGgoKSkpOwor
ICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRocm93VHlwZUVycm9yKGV4ZWMsICJPbmx5IEFy
cmF5QnVmZmVyIGFuZCBBcnJheUJ1ZmZlclZpZXcgb2JqZWN0cyBjYW4gYmUgcGFydCBvZiBDcnlw
dG9PcGVyYXRpb25EYXRhIHNlcXVlbmNlIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CiAKK0pTVmFsdWUgSlNTdWJ0bGVD
cnlwdG86OmRpZ2VzdChFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgaWYgKGV4ZWMtPmFyZ3VtZW50
Q291bnQoKSA8IDIpCisgICAgICAgIHJldHVybiBleGVjLT52bSgpLnRocm93RXhjZXB0aW9uKGV4
ZWMsIGNyZWF0ZU5vdEVub3VnaEFyZ3VtZW50c0Vycm9yKGV4ZWMpKTsKKworICAgIHN0ZDo6dW5p
cXVlX3B0cjxDcnlwdG9BbGdvcml0aG0+IGFsZ29yaXRobSA9IGNyZWF0ZUFsZ29yaXRobUZyb21K
U1ZhbHVlKGV4ZWMsIGV4ZWMtPnVuY2hlY2tlZEFyZ3VtZW50KDApKTsKKyAgICBpZiAoIWFsZ29y
aXRobSkgeworICAgICAgICBBU1NFUlQoZXhlYy0+aGFkRXhjZXB0aW9uKCkpOworICAgICAgICBy
ZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q3J5cHRv
QWxnb3JpdGhtUGFyYW1ldGVycz4gcGFyYW1ldGVycyA9IEpTQ3J5cHRvQWxnb3JpdGhtRGljdGlv
bmFyeTo6Y3JlYXRlUGFyYW1ldGVyc0ZvckRpZ2VzdChleGVjLCBhbGdvcml0aG0tPmlkZW50aWZp
ZXIoKSwgZXhlYy0+dW5jaGVja2VkQXJndW1lbnQoMCkpOworICAgIGlmICghcGFyYW1ldGVycykg
eworICAgICAgICBBU1NFUlQoZXhlYy0+aGFkRXhjZXB0aW9uKCkpOworICAgICAgICByZXR1cm4g
anNVbmRlZmluZWQoKTsKKyAgICB9CisKKyAgICBWZWN0b3I8Q3J5cHRvT3BlcmF0aW9uRGF0YT4g
ZGF0YTsKKyAgICBpZiAoIXNlcXVlbmNlT2ZDcnlwdG9PcGVyYXRpb25EYXRhRnJvbUpTVmFsdWUo
ZXhlYywgZXhlYy0+dW5jaGVja2VkQXJndW1lbnQoMSksIGRhdGEpKSB7CisgICAgICAgIEFTU0VS
VChleGVjLT5oYWRFeGNlcHRpb24oKSk7CisgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwor
ICAgIH0KKworICAgIEpTUHJvbWlzZSogcHJvbWlzZSA9IEpTUHJvbWlzZTo6Y3JlYXRlV2l0aFJl
c29sdmVyKGV4ZWMtPnZtKCksIGdsb2JhbE9iamVjdCgpKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8
UHJvbWlzZVdyYXBwZXI+IHByb21pc2VXcmFwcGVyID0gUHJvbWlzZVdyYXBwZXI6OmNyZWF0ZShn
bG9iYWxPYmplY3QoKSwgcHJvbWlzZSk7CisKKyAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAg
ICBhbGdvcml0aG0tPmRpZ2VzdCgqcGFyYW1ldGVycywgZGF0YSwgc3RkOjptb3ZlKHByb21pc2VX
cmFwcGVyKSwgZWMpOworICAgIGlmIChlYykgeworICAgICAgICBzZXRET01FeGNlcHRpb24oZXhl
YywgZWMpOworICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICB9CiAKKyAgICByZXR1
cm4gcHJvbWlzZTsKIH0KIAorfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCiAjZW5kaWYKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2NyeXB0by9TdWJ0bGVDcnlwdG8uaWRsCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2NyeXB0by9TdWJ0bGVDcnlwdG8uaWRsCShyZXZpc2lvbiAxNTgzNzUpCisr
KyBTb3VyY2UvV2ViQ29yZS9jcnlwdG8vU3VidGxlQ3J5cHRvLmlkbAkod29ya2luZyBjb3B5KQpA
QCAtMzAsNCArMzAsNSBAQAogICAgIE5vSW50ZXJmYWNlT2JqZWN0LAogICAgIE9wZXJhdGlvbnNO
b3REZWxldGFibGUKIF0gaW50ZXJmYWNlIFN1YnRsZUNyeXB0byB7CisgICAgW0N1c3RvbV0gUHJv
bWlzZSBkaWdlc3QoQWxnb3JpdGhtSWRlbnRpZmllciBhbGdvcml0aG0sIHNlcXVlbmNlPENyeXB0
b09wZXJhdGlvbkRhdGE+IGRhdGEpOwogfTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2NyeXB0by9h
bGdvcml0aG1zL0NyeXB0b0FsZ29yaXRobVNIQTEuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2NyeXB0by9hbGdvcml0aG1zL0NyeXB0b0FsZ29yaXRobVNIQTEuY3BwCShyZXZpc2lv
biAwKQorKysgU291cmNlL1dlYkNvcmUvY3J5cHRvL2FsZ29yaXRobXMvQ3J5cHRvQWxnb3JpdGht
U0hBMS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDcnlwdG9BbGdvcml0aG1TSEExLmgiCisKKyNp
ZiBFTkFCTEUoU1VCVExFX0NSWVBUTykKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjb25zdCBj
aGFyKiBjb25zdCBDcnlwdG9BbGdvcml0aG1TSEExOjptX25hbWUgPSAic2hhLTEiOworCitDcnlw
dG9BbGdvcml0aG1TSEExOjpDcnlwdG9BbGdvcml0aG1TSEExKCkKK3sKK30KKworQ3J5cHRvQWxn
b3JpdGhtU0hBMTo6fkNyeXB0b0FsZ29yaXRobVNIQTEoKQoreworfQorCitzdGQ6OnVuaXF1ZV9w
dHI8Q3J5cHRvQWxnb3JpdGhtPiBDcnlwdG9BbGdvcml0aG1TSEExOjpjcmVhdGUoKQoreworICAg
IHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPENyeXB0b0FsZ29yaXRobVNIQTE+KCk7Cit9CisKK0Ny
eXB0b0FsZ29yaXRobUlkZW50aWZpZXIgQ3J5cHRvQWxnb3JpdGhtU0hBMTo6aWRlbnRpZmllcigp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1faWRlbnRpZmllcjsKK30KKworfQorCisjZW5kaWYgLy8g
RU5BQkxFKFNVQlRMRV9DUllQVE8pCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jcnlwdG8vYWxnb3Jp
dGhtcy9DcnlwdG9BbGdvcml0aG1TSEExLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
Y3J5cHRvL2FsZ29yaXRobXMvQ3J5cHRvQWxnb3JpdGhtU0hBMS5oCShyZXZpc2lvbiAwKQorKysg
U291cmNlL1dlYkNvcmUvY3J5cHRvL2FsZ29yaXRobXMvQ3J5cHRvQWxnb3JpdGhtU0hBMS5oCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
CisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
KyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIENyeXB0
b0FsZ29yaXRobVNIQTFfaAorI2RlZmluZSBDcnlwdG9BbGdvcml0aG1TSEExX2gKKworI2luY2x1
ZGUgIkNyeXB0b0FsZ29yaXRobS5oIgorCisjaWYgRU5BQkxFKFNVQlRMRV9DUllQVE8pCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ3J5cHRvQWxnb3JpdGhtU0hBMSBGSU5BTCA6IHB1
YmxpYyBDcnlwdG9BbGdvcml0aG0geworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBj
b25zdCBtX25hbWU7CisgICAgc3RhdGljIGNvbnN0IENyeXB0b0FsZ29yaXRobUlkZW50aWZpZXIg
bV9pZGVudGlmaWVyID0gQ3J5cHRvQWxnb3JpdGhtSWRlbnRpZmllcjo6U0hBXzE7CisKKyAgICBz
dGF0aWMgc3RkOjp1bmlxdWVfcHRyPENyeXB0b0FsZ29yaXRobT4gY3JlYXRlKCk7CisKKyAgICB2
aXJ0dWFsIENyeXB0b0FsZ29yaXRobUlkZW50aWZpZXIgaWRlbnRpZmllcigpIGNvbnN0IE9WRVJS
SURFOworCisgICAgdmlydHVhbCB2b2lkIGRpZ2VzdChjb25zdCBDcnlwdG9BbGdvcml0aG1QYXJh
bWV0ZXJzJiwgY29uc3QgVmVjdG9yPENyeXB0b09wZXJhdGlvbkRhdGE+Jiwgc3RkOjp1bmlxdWVf
cHRyPFByb21pc2VXcmFwcGVyPiwgRXhjZXB0aW9uQ29kZSYpIE9WRVJSSURFOworCitwcml2YXRl
OgorICAgIENyeXB0b0FsZ29yaXRobVNIQTEoKTsKKyAgICB2aXJ0dWFsIH5DcnlwdG9BbGdvcml0
aG1TSEExKCk7Cit9OworCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoU1VCVExFX0NSWVBUTykKKyNl
bmRpZiAvLyBDcnlwdG9BbGdvcml0aG1TSEExX2gKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2NyeXB0
by9tYWMvQ3J5cHRvQWxnb3JpdGhtUmVnaXN0cnlNYWMuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL2NyeXB0by9tYWMvQ3J5cHRvQWxnb3JpdGhtUmVnaXN0cnlNYWMuY3BwCShyZXZp
c2lvbiAxNTgzNzUpCisrKyBTb3VyY2UvV2ViQ29yZS9jcnlwdG8vbWFjL0NyeXB0b0FsZ29yaXRo
bVJlZ2lzdHJ5TWFjLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksMTQgKzI5LDE0IEBACiAjaWYg
RU5BQkxFKFNVQlRMRV9DUllQVE8pCiAKIC8vI2luY2x1ZGUgIkNyeXB0b0FsZ29yaXRobUhNQUMu
aCIKLS8vI2luY2x1ZGUgIkNyeXB0b0FsZ29yaXRobVNIQTEuaCIKKyNpbmNsdWRlICJDcnlwdG9B
bGdvcml0aG1TSEExLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdm9pZCBDcnlwdG9BbGdv
cml0aG1SZWdpc3RyeTo6cGxhdGZvcm1SZWdpc3RlckFsZ29yaXRobXMoKQogewogLy8gICAgcmVn
aXN0ZXJBbGdvcml0aG0oQ3J5cHRvQWxnb3JpdGhtSE1BQzo6bV9uYW1lLCBDcnlwdG9BbGdvcml0
aG1ITUFDOjptX2lkZW50aWZpZXIsIENyeXB0b0FsZ29yaXRobUhNQUM6OmNyZWF0ZSk7Ci0vLyAg
ICByZWdpc3RlckFsZ29yaXRobShDcnlwdG9BbGdvcml0aG1TSEExOjptX25hbWUsIENyeXB0b0Fs
Z29yaXRobVNIQTE6Om1faWRlbnRpZmllciwgQ3J5cHRvQWxnb3JpdGhtU0hBMTo6Y3JlYXRlKTsK
KyAgICByZWdpc3RlckFsZ29yaXRobShDcnlwdG9BbGdvcml0aG1TSEExOjptX25hbWUsIENyeXB0
b0FsZ29yaXRobVNIQTE6Om1faWRlbnRpZmllciwgQ3J5cHRvQWxnb3JpdGhtU0hBMTo6Y3JlYXRl
KTsKIH0KIAogfQpJbmRleDogU291cmNlL1dlYkNvcmUvY3J5cHRvL21hYy9DcnlwdG9BbGdvcml0
aG1TSEExTWFjLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jcnlwdG8vbWFjL0Ny
eXB0b0FsZ29yaXRobVNIQTFNYWMuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUv
Y3J5cHRvL21hYy9DcnlwdG9BbGdvcml0aG1TSEExTWFjLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkNyeXB0b0FsZ29yaXRobVNIQTEuaCIKKworI2lmIEVOQUJMRShTVUJUTEVfQ1JZUFRPKQorCisj
aW5jbHVkZSAiSlNET01Qcm9taXNlLmgiCisjaW5jbHVkZSA8Q29tbW9uQ3J5cHRvL0NvbW1vbkNy
eXB0by5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgQ3J5cHRvQWxnb3JpdGhtU0hB
MTo6ZGlnZXN0KGNvbnN0IENyeXB0b0FsZ29yaXRobVBhcmFtZXRlcnMmLCBjb25zdCBWZWN0b3I8
Q3J5cHRvT3BlcmF0aW9uRGF0YT4mIGRhdGEsIHN0ZDo6dW5pcXVlX3B0cjxQcm9taXNlV3JhcHBl
cj4gcHJvbWlzZSwgRXhjZXB0aW9uQ29kZSYpCit7CisgICAgVmVjdG9yPHVuc2lnbmVkIGNoYXI+
IHJlc3VsdChDQ19TSEExX0RJR0VTVF9MRU5HVEgpOworCisgICAgQ0NfU0hBMV9DVFggY29udGV4
dDsKKyAgICBDQ19TSEExX0luaXQoJmNvbnRleHQpOworCisgICAgZm9yIChzaXplX3QgaSA9IDAs
IHNpemUgPSBkYXRhLnNpemUoKTsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgQ0NfU0hBMV9VcGRh
dGUoJmNvbnRleHQsIGRhdGFbaV0uZmlyc3QsIGRhdGFbaV0uc2Vjb25kKTsKKworICAgIENDX1NI
QTFfRmluYWwocmVzdWx0LmRhdGEoKSwgJmNvbnRleHQpOworCisgICAgcHJvbWlzZS0+ZnVsZmls
bChyZXN1bHQpOworfQorCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoU1VCVExFX0NSWVBUTykKSW5k
ZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFu
Z2VMb2cJKHJldmlzaW9uIDE1ODM4MSkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDI3IEBACisyMDEzLTEwLTMxICBBbGV4ZXkgUHJvc2t1cnlha292
ICA8YXBAYXBwbGUuY29tPgorCisgICAgICAgIFtXZWJDcnlwdG9dIEFkZCBTSEEtMQorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIzNTgyCisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBzZWN1cml0eS9yZXNv
dXJjZXMvY29tbW9uLmpzOiBBZGRlZCBmcm9tIEJsaW5rLgorICAgICAgICAoaW1wb3J0VGVzdEtl
eXMpOgorICAgICAgICAoYXNjaWlUb0FycmF5QnVmZmVyKToKKyAgICAgICAgKHByaW50UmVqZWN0
ZWRSZXN1bHQpOgorICAgICAgICAocHJpbnRBY2NlcHRlZFJlc3VsdCk6CisgICAgICAgIChmYWls
QW5kRmluaXNoSlNUZXN0KToKKworICAgICAgICAqIHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUtYXJn
dW1lbnRzLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogc2VjdXJpdHkvY3J5cHRvLXN1
YnRsZS1hcmd1bWVudHMuaHRtbDogQWRkZWQuCisgICAgICAgIEFkZGVkIHRlc3RzIGZvciBob3cg
YmluZGluZ3MgdHJlYXQgY3JhenkgYXJndW1lbnRzLiBIZWF2aWx5IGJhc2VkIG9uIGEgdGVzdCBm
cm9tIEJsaW5rLgorCisgICAgICAgICogc2VjdXJpdHkvY3J5cHRvLXN1YnRsZS1zaGExLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICogc2VjdXJpdHkvY3J5cHRvLXN1YnRsZS1zaGExLmh0
bWw6IEFkZGVkLgorICAgICAgICBUZXN0IHRoYXQgU0hBLTEgd29ya3MuCisKKyAgICAgICAgKiBU
ZXN0RXhwZWN0YXRpb25zOiBTa2lwIHRoZXNlIHRlc3RzIGV2ZXJ5d2hlcmUgZm9yIG5vdy4KKwog
MjAxMy0xMC0zMCAgR2F2aW4gQmFycmFjbG91Z2ggIDxiYXJyYWNsb3VnaEBhcHBsZS5jb20+CiAK
ICAgICAgICAgV2ViUGFnZUNyZWF0aW9uUGFyYW1ldGVycyBzaG91bGQgYmUgY29uc2lzdGVudCBp
biBXaW5kb3cub3BlbgpJbmRleDogTGF5b3V0VGVzdHMvVGVzdEV4cGVjdGF0aW9ucwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9UZXN0RXhwZWN0YXRpb25zCShyZXZpc2lvbiAxNTgzNzUpCisr
KyBMYXlvdXRUZXN0cy9UZXN0RXhwZWN0YXRpb25zCSh3b3JraW5nIGNvcHkpCkBAIC03NSw2ICs3
NSw4IEBAIGZhc3QvbWVkaWFzdHJlYW0vTWVkaWFTdHJlYW0tb25lbmRlZC5odG0KIHdlYmtpdC5v
cmcvYi8xMjI2Nzkgc2VjdXJpdHkvY3J5cHRvLXN1YnRsZS1nYy5odG1sIFsgU2tpcCBdCiB3ZWJr
aXQub3JnL2IvMTIyNjc5IHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUtZ2MtMi5odG1sIFsgU2tpcCBd
CiB3ZWJraXQub3JnL2IvMTIyNjc5IHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUtZ2MtMy5odG1sIFsg
U2tpcCBdCit3ZWJraXQub3JnL2IvMTIyNjc5IHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUtc2hhMS5o
dG1sIFsgU2tpcCBdCit3ZWJraXQub3JnL2IvMTIyNjc5IHNlY3VyaXR5L2NyeXB0by1zdWJ0bGUt
YXJndW1lbnRzLmh0bWwgWyBTa2lwIF0KIAogd2Via2l0Lm9yZy9iLzEyMzU1NSBbIERlYnVnIF0g
bWVkaWEvbWVkaWEtZnJhZ21lbnRzL1RDMDA1NC5odG1sIFsgQ3Jhc2ggXQogd2Via2l0Lm9yZy9i
LzEyMzU1NSBbIERlYnVnIF0gbWVkaWEvbWVkaWEtZnJhZ21lbnRzL1RDMDA2MS5odG1sIFsgQ3Jh
c2ggXQpJbmRleDogTGF5b3V0VGVzdHMvc2VjdXJpdHkvY3J5cHRvLXN1YnRsZS1hcmd1bWVudHMt
ZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3NlY3VyaXR5L2NyeXB0by1z
dWJ0bGUtYXJndW1lbnRzLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3Rz
L3NlY3VyaXR5L2NyeXB0by1zdWJ0bGUtYXJndW1lbnRzLWV4cGVjdGVkLnR4dAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQwIEBACitUZXN0IGNyeXB0by5zdWJ0bGUgYXJndW1lbnQgY29udmVy
c2lvbgorCitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3Nh
Z2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCisKKworU0hBMSBvZiBuZXcgVWludDhB
cnJheShbXSkpCisgICAgPSBbZGEgMzkgYTMgZWUgNWUgNmIgNGIgMGQgMzIgNTUgYmYgZWYgOTUg
NjAgMTggOTAgYWYgZDggMDcgMDldCisKK1Bhc3NpbmcgYWxnb3JpdGhtIG5hbWUgYXMgYSBzdHJp
bmcgb2JqZWN0Li4uCitQQVNTIC4uLnN1Y2NlZWRlZAorCitQYXNzaW5nIGFsZ29yaXRobSBuYW1l
IGFzIGEgc3RyaW5nIG9iamVjdCBpbiBhIGRpY3Rpb25hcnkuLi4KK1BBU1MgLi4uc3VjY2VlZGVk
CisKK1Bhc3NpbmcgYWxnb3JpdGhtIG5hbWUgYXMgYW4gb2JqZWN0IHdpdGggdG9TdHJpbmcKK1BB
U1MgLi4uc3VjY2VlZGVkCisKK1Bhc3NpbmcgaW52YWxpZCBkYXRhIHRvIGRpZ2VzdCgpCitQQVNT
IGNyeXB0by5zdWJ0bGUuZGlnZXN0KHtuYW1lOiAnc2hhLTEnfSkgdGhyZXcgZXhjZXB0aW9uIFR5
cGVFcnJvcjogTm90IGVub3VnaCBhcmd1bWVudHMuCitQQVNTIGNyeXB0by5zdWJ0bGUuZGlnZXN0
KHtuYW1lOiAnc2hhLTEnfSwgbnVsbCkgdGhyZXcgZXhjZXB0aW9uIFR5cGVFcnJvcjogVHlwZSBl
cnJvci4KK1BBU1MgY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6ICdzaGEtMSd9LCAxMCkgdGhy
ZXcgZXhjZXB0aW9uIFR5cGVFcnJvcjogVHlwZSBlcnJvci4KK1BBU1MgY3J5cHRvLnN1YnRsZS5k
aWdlc3Qoe25hbWU6ICdzaGEtMSd9LCBbMTBdKSB0aHJldyBleGNlcHRpb24gVHlwZUVycm9yOiBP
bmx5IEFycmF5QnVmZmVyIGFuZCBBcnJheUJ1ZmZlclZpZXcgb2JqZWN0cyBjYW4gYmUgcGFydCBv
ZiBDcnlwdG9PcGVyYXRpb25EYXRhIHNlcXVlbmNlLgorUEFTUyBjcnlwdG8uc3VidGxlLmRpZ2Vz
dCh7bmFtZTogJ3NoYS0xJ30sIG5ldyBVaW50OEFycmF5KFswXSkpIHRocmV3IGV4Y2VwdGlvbiBU
eXBlRXJyb3I6IE9ubHkgQXJyYXlCdWZmZXIgYW5kIEFycmF5QnVmZmVyVmlldyBvYmplY3RzIGNh
biBiZSBwYXJ0IG9mIENyeXB0b09wZXJhdGlvbkRhdGEgc2VxdWVuY2UuCisKK1Bhc3NpbmcgaW52
YWxpZCBhbGdvcml0aG1JZGVudGlmaWVycyB0byBkaWdlc3QoKQorUEFTUyBjcnlwdG8uc3VidGxl
LmRpZ2VzdCh7IHRvU3RyaW5nOmZ1bmN0aW9uKCkgeyByZXR1cm4gJ3NoYS0xJyB9IH0sIFtkYXRh
XSkgdGhyZXcgZXhjZXB0aW9uIEVycm9yOiBOb3RTdXBwb3J0ZWRFcnJvcjogRE9NIEV4Y2VwdGlv
biA5LgorUEFTUyBjcnlwdG8uc3VidGxlLmRpZ2VzdCh7bmFtZTogJyd9LCBbZGF0YV0pIHRocmV3
IGV4Y2VwdGlvbiBFcnJvcjogTm90U3VwcG9ydGVkRXJyb3I6IERPTSBFeGNlcHRpb24gOS4KK1BB
U1MgY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6IG51bGx9LCBbZGF0YV0pIHRocmV3IGV4Y2Vw
dGlvbiBFcnJvcjogTm90U3VwcG9ydGVkRXJyb3I6IERPTSBFeGNlcHRpb24gOS4KK1BBU1MgY3J5
cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6IHVuZGVmaW5lZH0sIFtkYXRhXSkgdGhyZXcgZXhjZXB0
aW9uIEVycm9yOiBOb3RTdXBwb3J0ZWRFcnJvcjogRE9NIEV4Y2VwdGlvbiA5LgorUEFTUyBjcnlw
dG8uc3VidGxlLmRpZ2VzdCh7bmFtZTogJ3NoYSd9LCBbZGF0YV0pIHRocmV3IGV4Y2VwdGlvbiBF
cnJvcjogTm90U3VwcG9ydGVkRXJyb3I6IERPTSBFeGNlcHRpb24gOS4KK1BBU1MgY3J5cHRvLnN1
YnRsZS5kaWdlc3Qoe25hbWU6IDF9LCBbZGF0YV0pIHRocmV3IGV4Y2VwdGlvbiBFcnJvcjogTm90
U3VwcG9ydGVkRXJyb3I6IERPTSBFeGNlcHRpb24gOS4KK1BBU1MgY3J5cHRvLnN1YnRsZS5kaWdl
c3QoJycsIFtkYXRhXSkgdGhyZXcgZXhjZXB0aW9uIEVycm9yOiBOb3RTdXBwb3J0ZWRFcnJvcjog
RE9NIEV4Y2VwdGlvbiA5LgorUEFTUyBjcnlwdG8uc3VidGxlLmRpZ2VzdChudWxsLCBbZGF0YV0p
IHRocmV3IGV4Y2VwdGlvbiBFcnJvcjogTm90U3VwcG9ydGVkRXJyb3I6IERPTSBFeGNlcHRpb24g
OS4KK1BBU1MgY3J5cHRvLnN1YnRsZS5kaWdlc3QodW5kZWZpbmVkLCBbZGF0YV0pIHRocmV3IGV4
Y2VwdGlvbiBFcnJvcjogTm90U3VwcG9ydGVkRXJyb3I6IERPTSBFeGNlcHRpb24gOS4KK1BBU1Mg
Y3J5cHRvLnN1YnRsZS5kaWdlc3QoMSwgW2RhdGFdKSB0aHJldyBleGNlcHRpb24gRXJyb3I6IE5v
dFN1cHBvcnRlZEVycm9yOiBET00gRXhjZXB0aW9uIDkuCitQQVNTIGNyeXB0by5zdWJ0bGUuZGln
ZXN0KHt9LCBbZGF0YV0pIHRocmV3IGV4Y2VwdGlvbiBFcnJvcjogTm90U3VwcG9ydGVkRXJyb3I6
IERPTSBFeGNlcHRpb24gOS4KK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVT
VCBDT01QTEVURQorCkluZGV4OiBMYXlvdXRUZXN0cy9zZWN1cml0eS9jcnlwdG8tc3VidGxlLWFy
Z3VtZW50cy5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3NlY3VyaXR5L2NyeXB0by1z
dWJ0bGUtYXJndW1lbnRzLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9zZWN1cml0
eS9jcnlwdG8tc3VidGxlLWFyZ3VtZW50cy5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NjUgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi9y
ZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InJlc291cmNl
cy9jb21tb24uanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8cCBpZD0iZGVzY3JpcHRp
b24iPjwvcD4KKzxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorCis8c2NyaXB0PgorZGVzY3JpcHRp
b24oIlRlc3QgY3J5cHRvLnN1YnRsZSBhcmd1bWVudCBjb252ZXJzaW9uIik7CisKK2pzVGVzdElz
QXN5bmMgPSB0cnVlOworCitpZiAoIXdpbmRvdy5zdWJ0bGUpCisgICAgd2luZG93LmNyeXB0by5z
dWJ0bGUgPSB3aW5kb3cuY3J5cHRvLndlYmtpdFN1YnRsZTsKKworUHJvbWlzZS5mdWxmaWxsKG51
bGwpLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgLy8gVGhpcyBsb29rcyBsaWtlIGludmFsaWQgaW5w
dXQsIGJ1dCBpdCBhY3R1YWxseSBpc24ndCAtIFVpbnQ4QXJyYXkgaXMgYSBzZXF1ZW5jZSB0b28s
CisgICAgLy8gc28gaXQncyBqdXN0IGFuIGVtcHR5IHNlcXVlbmNlLCBzYW1lIGFzIHBhc3Npbmcg
W10uCisgICAgZGVidWcoIlNIQTEgb2YgbmV3IFVpbnQ4QXJyYXkoW10pKSIpOworICAgIHJldHVy
biBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnc2hhLTEnLCBuZXcgVWludDhBcnJheShbXSkpOworfSku
dGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICBwcmludEFjY2VwdGVkUmVzdWx0KHJlc3VsdCk7
CisgICAgZGVidWcoIlxuUGFzc2luZyBhbGdvcml0aG0gbmFtZSBhcyBhIHN0cmluZyBvYmplY3Qu
Li4iKTsKKyAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3QobmV3IFN0cmluZygnc2hhLTEn
KSwgW10pOworfSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICB0ZXN0UGFzc2VkKCIuLi5z
dWNjZWVkZWQiKTsKKyAgICBkZWJ1ZygiXG5QYXNzaW5nIGFsZ29yaXRobSBuYW1lIGFzIGEgc3Ry
aW5nIG9iamVjdCBpbiBhIGRpY3Rpb25hcnkuLi4iKTsKKyAgICByZXR1cm4gY3J5cHRvLnN1YnRs
ZS5kaWdlc3Qoe25hbWU6IG5ldyBTdHJpbmcoJ3NoYS0xJyl9LCBbXSk7Cit9KS50aGVuKGZ1bmN0
aW9uKHJlc3VsdCkgeworICAgIHRlc3RQYXNzZWQoIi4uLnN1Y2NlZWRlZCIpOworICAgIGRlYnVn
KCJcblBhc3NpbmcgYWxnb3JpdGhtIG5hbWUgYXMgYW4gb2JqZWN0IHdpdGggdG9TdHJpbmciKTsK
KyAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6IHsgdG9TdHJpbmc6ZnVuY3Rp
b24oKSB7IHJldHVybiAnc2hhLTEnIH0gfSB9LCBbXSk7Cit9KS50aGVuKGZ1bmN0aW9uKHJlc3Vs
dCkgeworICAgIHRlc3RQYXNzZWQoIi4uLnN1Y2NlZWRlZCIpOworCisgICAgZGVidWcoIlxuUGFz
c2luZyBpbnZhbGlkIGRhdGEgdG8gZGlnZXN0KCkiKTsKKyAgICBzaG91bGRUaHJvdygiY3J5cHRv
LnN1YnRsZS5kaWdlc3Qoe25hbWU6ICdzaGEtMSd9KSIpOworICAgIHNob3VsZFRocm93KCJjcnlw
dG8uc3VidGxlLmRpZ2VzdCh7bmFtZTogJ3NoYS0xJ30sIG51bGwpIik7CisgICAgc2hvdWxkVGhy
b3coImNyeXB0by5zdWJ0bGUuZGlnZXN0KHtuYW1lOiAnc2hhLTEnfSwgMTApIik7CisgICAgc2hv
dWxkVGhyb3coImNyeXB0by5zdWJ0bGUuZGlnZXN0KHtuYW1lOiAnc2hhLTEnfSwgWzEwXSkiKTsK
KyAgICBzaG91bGRUaHJvdygiY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6ICdzaGEtMSd9LCBu
ZXcgVWludDhBcnJheShbMF0pKSIpOworCisgICAgZGVidWcoIlxuUGFzc2luZyBpbnZhbGlkIGFs
Z29yaXRobUlkZW50aWZpZXJzIHRvIGRpZ2VzdCgpIik7CisgICAgZGF0YSA9IG5ldyBVaW50OEFy
cmF5KFswXSk7CisgICAgc2hvdWxkVGhyb3coImNyeXB0by5zdWJ0bGUuZGlnZXN0KHsgdG9TdHJp
bmc6ZnVuY3Rpb24oKSB7IHJldHVybiAnc2hhLTEnIH0gfSwgW2RhdGFdKSIpOyAvLyBBbGdvcml0
aG0gbm9ybWFsaXphdGlvbiBkb2Vzbid0IGF0dGVtcHQgdG8gY2FsbCB0b1N0cmluZy4KKyAgICBz
aG91bGRUaHJvdygiY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6ICcnfSwgW2RhdGFdKSIpOwor
ICAgIHNob3VsZFRocm93KCJjcnlwdG8uc3VidGxlLmRpZ2VzdCh7bmFtZTogbnVsbH0sIFtkYXRh
XSkiKTsKKyAgICBzaG91bGRUaHJvdygiY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6IHVuZGVm
aW5lZH0sIFtkYXRhXSkiKTsKKyAgICBzaG91bGRUaHJvdygiY3J5cHRvLnN1YnRsZS5kaWdlc3Qo
e25hbWU6ICdzaGEnfSwgW2RhdGFdKSIpOworICAgIHNob3VsZFRocm93KCJjcnlwdG8uc3VidGxl
LmRpZ2VzdCh7bmFtZTogMX0sIFtkYXRhXSkiKTsKKyAgICBzaG91bGRUaHJvdygiY3J5cHRvLnN1
YnRsZS5kaWdlc3QoJycsIFtkYXRhXSkiKTsKKyAgICBzaG91bGRUaHJvdygiY3J5cHRvLnN1YnRs
ZS5kaWdlc3QobnVsbCwgW2RhdGFdKSIpOworICAgIHNob3VsZFRocm93KCJjcnlwdG8uc3VidGxl
LmRpZ2VzdCh1bmRlZmluZWQsIFtkYXRhXSkiKTsKKyAgICBzaG91bGRUaHJvdygiY3J5cHRvLnN1
YnRsZS5kaWdlc3QoMSwgW2RhdGFdKSIpOworICAgIHNob3VsZFRocm93KCJjcnlwdG8uc3VidGxl
LmRpZ2VzdCh7fSwgW2RhdGFdKSIpOworfSkudGhlbihmaW5pc2hKU1Rlc3QpOworCis8L3Njcmlw
dD4KKworPHNjcmlwdCBzcmM9Ii4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0
PgorPC9ib2R5PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvc2VjdXJpdHkvY3J5cHRvLXN1
YnRsZS1zaGExLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9zZWN1cml0
eS9jcnlwdG8tc3VidGxlLXNoYTEtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0
VGVzdHMvc2VjdXJpdHkvY3J5cHRvLXN1YnRsZS1zaGExLWV4cGVjdGVkLnR4dAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDE4IEBACitUZXN0IGNyeXB0by5zdWJ0bGUuZGlnZXN0LgorCitPbiBz
dWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dl
ZCBieSAiVEVTVCBDT01QTEVURSIuCisKKworU0hBMSBvZiBbXQorICAgID0gW2RhIDM5IGEzIGVl
IDVlIDZiIDRiIDBkIDMyIDU1IGJmIGVmIDk1IDYwIDE4IDkwIGFmIGQ4IDA3IDA5XQorU0hBMSBv
ZiBbMHgwXQorICAgID0gWzViIGE5IDNjIDlkIGIwIGNmIGY5IDNmIDUyIGI1IDIxIGQ3IDQyIDBl
IDQzIGY2IGVkIGEyIDc4IDRmXQorU0hBMSBvZiBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwg
OSwgMTBdCisgICAgPSBbMmMgN2UgN2MgMzggNGYgNzggMjkgNjkgNDIgODIgYjEgZTMgYTYgMjEg
NmQgZWYgODAgODIgZDAgNTVdCitTSEExIG9mIFtuZXcgVWludDhBcnJheShbMCwgMSwgMiwgMywg
NF0pLCBuZXcgVWludDhBcnJheSg1LCA2LCA3LCA4LCA5LCAxMF0pXQorICAgID0gWzJjIDdlIDdj
IDM4IDRmIDc4IDI5IDY5IDQyIDgyIGIxIGUzIGE2IDIxIDZkIGVmIDgwIDgyIGQwIDU1XQorUEFT
UyBjcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KCdzaGEtMScpIHRocmV3IGV4Y2VwdGlvbiBUeXBl
RXJyb3I6IHVuZGVmaW5lZCBpcyBub3QgYSBmdW5jdGlvbiAoZXZhbHVhdGluZyAnY3J5cHRvLnN1
YnRsZS5nZW5lcmF0ZUtleSgnc2hhLTEnKScpLgorUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMg
dHJ1ZQorCitURVNUIENPTVBMRVRFCisKSW5kZXg6IExheW91dFRlc3RzL3NlY3VyaXR5L2NyeXB0
by1zdWJ0bGUtc2hhMS5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3NlY3VyaXR5L2Ny
eXB0by1zdWJ0bGUtc2hhMS5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvc2VjdXJp
dHkvY3J5cHRvLXN1YnRsZS1zaGExLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OCBA
QAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4uL3Jlc291
cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2VzL2Nv
bW1vbi5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwIGlkPSJkZXNjcmlwdGlvbiI+
PC9wPgorPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+CisKKzxzY3JpcHQ+CitkZXNjcmlwdGlvbigi
VGVzdCBjcnlwdG8uc3VidGxlLmRpZ2VzdC4iKTsKKworanNUZXN0SXNBc3luYyA9IHRydWU7CisK
K2lmICghd2luZG93LnN1YnRsZSkKKyAgICB3aW5kb3cuY3J5cHRvLnN1YnRsZSA9IHdpbmRvdy5j
cnlwdG8ud2Via2l0U3VidGxlOworCitQcm9taXNlLmZ1bGZpbGwobnVsbCkudGhlbihmdW5jdGlv
bigpIHsKKyAgICBkZWJ1ZygiU0hBMSBvZiBbXSIpOworICAgIHJldHVybiBjcnlwdG8uc3VidGxl
LmRpZ2VzdCgnc2hhLTEnLCBbbmV3IFVpbnQ4QXJyYXkoW10pXSk7Cit9KS50aGVuKGZ1bmN0aW9u
KHJlc3VsdCkgeworICAgIHByaW50QWNjZXB0ZWRSZXN1bHQocmVzdWx0KTsKKworICAgIGRlYnVn
KCJTSEExIG9mIFsweDBdIikKKyAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6
ICdzaGEtMSd9LCBbbmV3IFVpbnQ4QXJyYXkoWzBdKV0pOworfSkudGhlbihmdW5jdGlvbihyZXN1
bHQpIHsKKyAgICBwcmludEFjY2VwdGVkUmVzdWx0KHJlc3VsdCk7CisKKyAgICBkZWJ1ZygiU0hB
MSBvZiBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdIik7CisgICAgdmFyIGRhdGEg
PSBuZXcgVWludDhBcnJheShbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdKTsKKyAg
ICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6ICdzaGEtMSd9LCBbZGF0YV0pOwor
fSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICBwcmludEFjY2VwdGVkUmVzdWx0KHJlc3Vs
dCk7CisKKyAgICBkZWJ1ZygiU0hBMSBvZiBbbmV3IFVpbnQ4QXJyYXkoWzAsIDEsIDIsIDMsIDRd
KSwgbmV3IFVpbnQ4QXJyYXkoNSwgNiwgNywgOCwgOSwgMTBdKV0iKTsKKyAgICByZXR1cm4gY3J5
cHRvLnN1YnRsZS5kaWdlc3Qoe25hbWU6ICdzaGEtMSd9LCBbbmV3IFVpbnQ4QXJyYXkoWzAsIDEs
IDIsIDMsIDRdKSwgbmV3IFVpbnQ4QXJyYXkoWzUsIDYsIDcsIDgsIDksIDEwXSldKTsKK30pLnRo
ZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgcHJpbnRBY2NlcHRlZFJlc3VsdChyZXN1bHQpOwor
ICAgIC8vIEFsbCBTSEEtMSBjYW4gZG8gaXMgZGlnZXN0LgorICAgIHNob3VsZFRocm93KCJjcnlw
dG8uc3VidGxlLmdlbmVyYXRlS2V5KCdzaGEtMScpIik7CisgICAgZmluaXNoSlNUZXN0KCk7Cit9
KTsKKzwvc2NyaXB0PgorCis8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5q
cyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9zZWN1cml0
eS9yZXNvdXJjZXMvY29tbW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL3NlY3VyaXR5
L3Jlc291cmNlcy9jb21tb24uanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9zZWN1cml0
eS9yZXNvdXJjZXMvY29tbW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjMgQEAKK2Z1
bmN0aW9uIGltcG9ydFRlc3RLZXlzKCkKK3sKKyAgICB2YXIga2V5Rm9ybWF0ID0gInNwa2kiOwor
ICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoW10pOworICAgIHZhciBleHRyYWN0YWJsZSA9
IGZhbHNlOworICAgIHZhciBrZXlVc2FnZXMgPSBbJ2VuY3J5cHQnLCAnZGVjcnlwdCcsICdzaWdu
JywgJ3ZlcmlmeSddOworCisgICAgdmFyIGhtYWNQcm9taXNlID0gY3J5cHRvLnN1YnRsZS5pbXBv
cnRLZXkoa2V5Rm9ybWF0LCBkYXRhLCB7bmFtZTogJ2htYWMnLCBoYXNoOiB7bmFtZTogJ3NoYS0x
J319LCBleHRyYWN0YWJsZSwga2V5VXNhZ2VzKTsKKyAgICB2YXIgcnNhU3NhUHJvbWlzZSA9IGNy
eXB0by5zdWJ0bGUuaW1wb3J0S2V5KGtleUZvcm1hdCwgZGF0YSwge25hbWU6ICdSU0FTU0EtUEtD
UzEtdjFfNScsIGhhc2g6IHtuYW1lOiAnc2hhLTEnfX0sIGV4dHJhY3RhYmxlLCBrZXlVc2FnZXMp
OworICAgIHZhciBhZXNDYmNQcm9taXNlID0gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoa2V5Rm9y
bWF0LCBkYXRhLCB7bmFtZTogJ0FFUy1DQkMnfSwgZXh0cmFjdGFibGUsIGtleVVzYWdlcyk7Cisg
ICAgdmFyIGFlc0NiY0p1c3REZWNyeXB0ID0gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoa2V5Rm9y
bWF0LCBkYXRhLCB7bmFtZTogJ0FFUy1DQkMnfSwgZXh0cmFjdGFibGUsIFsnZGVjcnlwdCddKTsK
KworICAgIHJldHVybiBQcm9taXNlLmV2ZXJ5KGhtYWNQcm9taXNlLCByc2FTc2FQcm9taXNlLCBh
ZXNDYmNQcm9taXNlLCBhZXNDYmNKdXN0RGVjcnlwdCkudGhlbihmdW5jdGlvbihyZXN1bHRzKSB7
CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICBobWFjU2hhMTogcmVzdWx0c1swXSwKKyAg
ICAgICAgICAgIHJzYVNzYVNoYTE6IHJlc3VsdHNbMV0sCisgICAgICAgICAgICBhZXNDYmM6IHJl
c3VsdHNbMl0sCisgICAgICAgICAgICBhZXNDYmNKdXN0RGVjcnlwdDogcmVzdWx0c1szXSwKKyAg
ICAgICAgfTsKKyAgICB9KTsKK30KKworLy8gQnVpbGRzIGEgaGV4IHN0cmluZyByZXByZXNlbnRh
dGlvbiBvZiBhbnkgYXJyYXktbGlrZSBpbnB1dCAoYXJyYXkgb3IKKy8vIEFycmF5QnVmZmVyVmll
dykuIFRoZSBvdXRwdXQgbG9va3MgbGlrZSB0aGlzOgorLy8gICAgW2FiIDAzIDRjIDk5XQorZnVu
Y3Rpb24gYnl0ZUFycmF5VG9IZXhTdHJpbmcoYnl0ZXMpCit7CisgICAgdmFyIGhleEJ5dGVzID0g
W107CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgKytpKSB7CisgICAg
ICAgIHZhciBieXRlU3RyaW5nID0gYnl0ZXNbaV0udG9TdHJpbmcoMTYpOworICAgICAgICBpZiAo
Ynl0ZVN0cmluZy5sZW5ndGggPCAyKQorICAgICAgICAgICAgYnl0ZVN0cmluZyA9ICIwIiArIGJ5
dGVTdHJpbmc7CisgICAgICAgIGhleEJ5dGVzLnB1c2goYnl0ZVN0cmluZyk7CisgICAgfQorCisg
ICAgcmV0dXJuICJbIiArIGhleEJ5dGVzLmpvaW4oIiAiKSArICJdIjsKK30KKworZnVuY3Rpb24g
YXNjaWlUb0FycmF5QnVmZmVyKHN0cikKK3sKKyAgICB2YXIgY2hhcnMgPSBbXTsKKyAgICBmb3Ig
KHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkKKyAgICAgICAgY2hhcnMucHVzaChzdHIu
Y2hhckNvZGVBdChpKSk7CisgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGNoYXJzKTsKK30KKwor
ZnVuY3Rpb24gcHJpbnRSZWplY3RlZFJlc3VsdCh2YWx1ZSkKK3sKKyAgICBkZWJ1ZygiICAgIHJl
amVjdGVkIHdpdGggdmFsdWUgb2YgIiArIHZhbHVlKTsKK30KKworZnVuY3Rpb24gcHJpbnRBY2Nl
cHRlZFJlc3VsdChyZXN1bHQpCit7CisgICAgZGVidWcoIiAgICA9ICIgKyBieXRlQXJyYXlUb0hl
eFN0cmluZyhuZXcgVWludDhBcnJheShyZXN1bHQpKSk7Cit9CisKK2Z1bmN0aW9uIGZhaWxBbmRG
aW5pc2hKU1Rlc3QoZXJyb3IpCit7CisgICAgaWYgKGVycm9yKQorICAgICAgIGRlYnVnKGVycm9y
KTsKKyAgICBmaW5pc2hKU1Rlc3QoKTsKK30K
</data>
<flag name="review"
          id="238446"
          type_id="1"
          status="+"
          setter="andersca"
    />
          </attachment>
      

    </bug>

</bugzilla>