<?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>213742</bug_id>
          
          <creation_ts>2020-06-29 10:16:07 -0700</creation_ts>
          <short_desc>Move Color blending related functions to their own files</short_desc>
          <delta_ts>2020-06-30 15:50:39 -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>New Bugs</component>
          <version>WebKit 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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Sam Weinig">sam</reporter>
          <assigned_to name="Sam Weinig">sam</assigned_to>
          <cc>cdumez</cc>
    
    <cc>changseok</cc>
    
    <cc>darin</cc>
    
    <cc>dino</cc>
    
    <cc>dstockwell</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>glenn</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>Lawrence.j</cc>
    
    <cc>macpherson</cc>
    
    <cc>menard</cc>
    
    <cc>mifenton</cc>
    
    <cc>pdr</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1667165</commentid>
    <comment_count>0</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-06-29 10:16:07 -0700</bug_when>
    <thetext>Move Color blending related functions to their own files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667168</commentid>
    <comment_count>1</comment_count>
      <attachid>403078</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-06-29 10:20:54 -0700</bug_when>
    <thetext>Created attachment 403078
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667296</commentid>
    <comment_count>2</comment_count>
      <attachid>403078</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2020-06-29 15:15:47 -0700</bug_when>
    <thetext>Comment on attachment 403078
Patch

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

&gt; Source/WebCore/ChangeLog:25
&gt; +        Move declarations / implemenatations from Color.h/cpp to ColorBlending.h/cpp.

Typo</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667402</commentid>
    <comment_count>3</comment_count>
      <attachid>403152</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-06-29 18:25:08 -0700</bug_when>
    <thetext>Created attachment 403152
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667409</commentid>
    <comment_count>4</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2020-06-29 18:33:35 -0700</bug_when>
    <thetext>Tools/Scripts/svn-apply failed to apply attachment 403152 to trunk.
Please resolve the conflicts and upload a new patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667594</commentid>
    <comment_count>5</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-06-30 09:11:20 -0700</bug_when>
    <thetext>Committed r263753: &lt;https://trac.webkit.org/changeset/263753&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667595</commentid>
    <comment_count>6</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-06-30 09:12:17 -0700</bug_when>
    <thetext>&lt;rdar://problem/64941518&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667599</commentid>
    <comment_count>7</comment_count>
    <who name="Jason Lawrence">Lawrence.j</who>
    <bug_when>2020-06-30 09:54:48 -0700</bug_when>
    <thetext>Reverted r263753 for reason:

This commit caused build failures across multiple platforms.

Committed r263757: &lt;https://trac.webkit.org/changeset/263757&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667608</commentid>
    <comment_count>8</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-06-30 10:24:56 -0700</bug_when>
    <thetext>(In reply to Jason Lawrence from comment #7)
&gt; Reverted r263753 for reason:
&gt; 
&gt; This commit caused build failures across multiple platforms.
&gt; 
&gt; Committed r263757: &lt;https://trac.webkit.org/changeset/263757&gt;

Crap, sorry. Apparently, our tools really don&apos;t working with svn cp any more. :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667622</commentid>
    <comment_count>9</comment_count>
      <attachid>403152</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-06-30 10:54:28 -0700</bug_when>
    <thetext>Comment on attachment 403152
Patch

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

&gt; Source/WebCore/platform/graphics/ColorBlending.h:39
&gt; +// This is an implementation of Porter-Duff&apos;s &quot;source-over&quot; equation
&gt; +Color blendSourceOver(const Color&amp;, const Color&amp;);
&gt; +
&gt; +// Bespoke &quot;whitening&quot; algorithm used by RenderTheme::transformSelectionBackgroundColor.
&gt; +Color blendWithWhite(const Color&amp;);
&gt; +
&gt; +Color blend(const Color&amp; from, const Color&amp; to, double progress);
&gt; +Color blendWithoutPremultiply(const Color&amp; from, const Color&amp; to, double progress);

All of these functions also transform extended colors into simple colors. Would be nice if this was clearer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667637</commentid>
    <comment_count>10</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-06-30 11:28:55 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #9)
&gt; Comment on attachment 403152 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=403152&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/ColorBlending.h:39
&gt; &gt; +// This is an implementation of Porter-Duff&apos;s &quot;source-over&quot; equation
&gt; &gt; +Color blendSourceOver(const Color&amp;, const Color&amp;);
&gt; &gt; +
&gt; &gt; +// Bespoke &quot;whitening&quot; algorithm used by RenderTheme::transformSelectionBackgroundColor.
&gt; &gt; +Color blendWithWhite(const Color&amp;);
&gt; &gt; +
&gt; &gt; +Color blend(const Color&amp; from, const Color&amp; to, double progress);
&gt; &gt; +Color blendWithoutPremultiply(const Color&amp; from, const Color&amp; to, double progress);
&gt; 
&gt; All of these functions also transform extended colors into simple colors.
&gt; Would be nice if this was clearer.

Hm, indeed. 

Color blendSourceOverSRGBASimpleColorLossy(const Color&amp;, const Color&amp;);

That seems a bit wordy and very unclear, so let&apos;s not do that :). 

I wonder what if we made them take a typed color, and make the caller do the conversion (I tend to like this approach, as it makes it easy to find all the lossy conversions easily).


SRGBA&lt;uint8_t&gt; blendSourceOver(const SRGBA&lt;uint8_t&gt;&amp;, const const SRGBA&lt;uint8_t&gt;&amp;);
SRGBA&lt;uint8_t&gt; blendWithWhite(const SRGBA&lt;uint8_t&gt;&amp;);
SRGBA&lt;uint8_t&gt; blend(const SRGBA&lt;uint8_t&gt;&amp;, const SRGBA&lt;uint8_t&gt;&amp;, double progress);
SRGBA&lt;uint8_t&gt; blendWithoutPremultiply(const SRGBA&lt;uint8_t&gt;&amp;, const SRGBA&lt;uint8_t&gt;&amp;, double progress);


This has a few initial problems I can think of.

1) blendWithWhite for some reason preserves the Semantic bit. This is easily solvable, since blendWithWhite has only one caller, by just making it the callers responsibility to preserve it. (Honestly, I have not looked into why we still have that bit or why its ok for it to only work for SimpleColors. I know it&apos;s used only by editing and filter code, but not entirely sure why).

2) blend and blendWithoutPremultiply preserve the isValid bit in certain circumstances (when progress == 1).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667638</commentid>
    <comment_count>11</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-06-30 11:32:12 -0700</bug_when>
    <thetext>(In reply to Sam Weinig from comment #10)
&gt; (In reply to Darin Adler from comment #9)
&gt; &gt; Comment on attachment 403152 [details]
&gt; &gt; Patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=403152&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/graphics/ColorBlending.h:39
&gt; &gt; &gt; +// This is an implementation of Porter-Duff&apos;s &quot;source-over&quot; equation
&gt; &gt; &gt; +Color blendSourceOver(const Color&amp;, const Color&amp;);
&gt; &gt; &gt; +
&gt; &gt; &gt; +// Bespoke &quot;whitening&quot; algorithm used by RenderTheme::transformSelectionBackgroundColor.
&gt; &gt; &gt; +Color blendWithWhite(const Color&amp;);
&gt; &gt; &gt; +
&gt; &gt; &gt; +Color blend(const Color&amp; from, const Color&amp; to, double progress);
&gt; &gt; &gt; +Color blendWithoutPremultiply(const Color&amp; from, const Color&amp; to, double progress);
&gt; &gt; 
&gt; &gt; All of these functions also transform extended colors into simple colors.
&gt; &gt; Would be nice if this was clearer.
&gt; 
&gt; Hm, indeed. 
&gt; 
&gt; Color blendSourceOverSRGBASimpleColorLossy(const Color&amp;, const Color&amp;);
&gt; 
&gt; That seems a bit wordy and very unclear, so let&apos;s not do that :). 

A shorter name idea, just use Lossy suffix and add a comment:

// NOTE: These function will do a lossy conversion to 8-bit sRGBA before blending.
Color blendSourceOverLossy(const Color&amp;, const Color&amp;);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667695</commentid>
    <comment_count>12</comment_count>
      <attachid>403230</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-06-30 13:01:46 -0700</bug_when>
    <thetext>Created attachment 403230
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667771</commentid>
    <comment_count>13</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2020-06-30 15:50:38 -0700</bug_when>
    <thetext>Committed r263776: &lt;https://trac.webkit.org/changeset/263776&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 403230.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>403078</attachid>
            <date>2020-06-29 10:20:54 -0700</date>
            <delta_ts>2020-06-29 18:25:06 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-213742-20200629102053.patch</filename>
            <type>text/plain</type>
            <size>40183</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI2MzY2MykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ2IEBACisyMDIwLTA2LTI5ICBTYW0gV2Vp
bmlnICA8d2VpbmlnQGFwcGxlLmNvbT4KKworICAgICAgICBNb3ZlIENvbG9yIGJsZW5kaW5nIHJl
bGF0ZWQgZnVuY3Rpb25zIHRvIHRoZWlyIG93biBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjEzNzQyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgLSBNb3ZlcyBDb2xvcjo6YmxlbmQoY29uc3QgQ29s
b3ImKSwgQ29sb3I6OmJsZW5kV2l0aFdoaXRlKCksIGJsZW5kKGNvbnN0IENvbG9yJiwgY29uc3Qg
Q29sb3ImLCBkb3VibGUpCisgICAgICAgICAgYW5kIGJsZW5kV2l0aG91dFByZW11bHRpcGx5KGNv
bnN0IENvbG9yJiwgY29uc3QgQ29sb3ImLCBkb3VibGUpIHRvIHRoZWlyIG93biBmaWxlczogQ29s
b3JCbGVuZGluZy5oL2NwcAorICAgICAgICAtIFJlbmFtZXMgQ29sb3I6OmJsZW5kKGNvbnN0IENv
bG9yJikgdG8gYmxlbmRTb3VyY2VPdmVyKGNvbnN0IENvbG9yJiwgY29uc3QgQ29sb3ImKSAKKyAg
ICAgICAgLSBSZW5hbWVzIENvbG9yOjpibGVuZFdpdGhXaGl0ZSgpIHRvIGJsZW5kV2l0aFdoaXRl
KGNvbnN0IENvbG9yJikuCisKKyAgICAgICAgKiBTb3VyY2VzLnR4dDoKKyAgICAgICAgKiBXZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgIEFkZCBuZXcgZmlsZXMuCisK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Db2xvci5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpDb2xvcjo6YmxlbmQgY29uc3QpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6Q29sb3I6
OmJsZW5kV2l0aFdoaXRlIGNvbnN0KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmJsZW5k
KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmJsZW5kV2l0aG91dFByZW11bHRpcGx5KTog
RGVsZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Db2xvci5oOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL0NvbG9yQmxlbmRpbmcuY3BwOiBDb3BpZWQgZnJvbSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvci5jcHAuCisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3MvQ29sb3JCbGVuZGluZy5oOiBBZGRlZC4KKyAgICAgICAgTW92ZSBkZWNsYXJhdGlv
bnMgLyBpbXBsZW1lbmF0YXRpb25zIGZyb20gQ29sb3IuaC9jcHAgdG8gQ29sb3JCbGVuZGluZy5o
L2NwcC4KKworICAgICAgICAqIGNzcy9DU1NHcmFkaWVudFZhbHVlLmNwcDoKKyAgICAgICAgKiBl
ZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNhcmV0QmFzZTo6
Y29tcHV0ZUNhcmV0Q29sb3IpOgorICAgICAgICAqIHBhZ2UvRnJhbWVWaWV3LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OkZyYW1lVmlldzo6ZG9jdW1lbnRCYWNrZ3JvdW5kQ29sb3IgY29uc3QpOgor
ICAgICAgICAqIHBhZ2UvVGV4dEluZGljYXRvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjplc3Rp
bWF0ZWRCYWNrZ3JvdW5kQ29sb3JGb3JSYW5nZSk6CisgICAgICAgICogcGFnZS9hbmltYXRpb24v
Q1NTUHJvcGVydHlBbmltYXRpb24uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Zp
bHRlcnMvRmlsdGVyT3BlcmF0aW9uLmNwcDoKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQm94
TW9kZWxPYmplY3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQm94TW9kZWxPYmplY3Q6
OnBhaW50RmlsbExheWVyRXh0ZW5kZWQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJNZW51
TGlzdC5jcHA6CisgICAgICAgIChSZW5kZXJNZW51TGlzdDo6Z2V0SXRlbUJhY2tncm91bmRDb2xv
ciBjb25zdCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lOjp0cmFuc2Zvcm1TZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3Ig
Y29uc3QpOgorICAgICAgICBVcGRhdGUgZm9yIG5ldyBzaWduYXR1cmVzIGFuZCAjaW5jbHVkZSBD
b2xvckJsZW5kaW5nLmggYXMgbmVlZWRlZC4KKwogMjAyMC0wNi0yOSAgQ2hyaXMgRHVtZXogIDxj
ZHVtZXpAYXBwbGUuY29tPgogCiAgICAgICAgIE9uIGxvYWQgZnJvbSBiYWNrL2ZvcndhcmQgY2Fj
aGUsIGNhbGwgY2hlY2tDb21wbGV0ZWQoKSBmb3IgQUxMIGZyYW1lcyBpbnNpZGUgRnJhbWVMb2Fk
ZXI6OmNvbW1pdFByb3Zpc2lvbmFsTG9hZCgpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9Tb3VyY2Vz
LnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9Tb3VyY2VzLnR4dAkocmV2aXNpb24g
MjYzNjE5KQorKysgU291cmNlL1dlYkNvcmUvU291cmNlcy50eHQJKHdvcmtpbmcgY29weSkKQEAg
LTE5MDcsNiArMTkwNyw3IEBAIHBsYXRmb3JtL2VuY3J5cHRlZG1lZGlhL0NETVByb3h5LmNwcAog
cGxhdGZvcm0vZ3JhcGhpY3MvQU5HTEVXZWJLaXRCcmlkZ2UuY3BwCiBwbGF0Zm9ybS9ncmFwaGlj
cy9CaXRtYXBJbWFnZS5jcHAKIHBsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmNwcAorcGxhdGZvcm0v
Z3JhcGhpY3MvQ29sb3JCbGVuZGluZy5jcHAKIHBsYXRmb3JtL2dyYXBoaWNzL0NvbG9yVXRpbGl0
aWVzLmNwcAogcGxhdGZvcm0vZ3JhcGhpY3MvQ29tcGxleFRleHRDb250cm9sbGVyLmNwcAogcGxh
dGZvcm0vZ3JhcGhpY3MvQ3Jvc3NmYWRlR2VuZXJhdGVkSW1hZ2UuY3BwCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lv
biAyNjM2MTkpCisrKyBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTk5NjMsNiArOTk2Myw4IEBACiAJCTdDMTkzQkZDMUY1
RTEwQzUwMDg4RjNFNiAvKiBKU0ltYWdlU21vb3RoaW5nUXVhbGl0eS5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBKU0ltYWdlU21vb3RoaW5nUXVhbGl0eS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQk3QzE5M0JGRDFGNUUxMEQ2MDA4OEYzRTYgLyogSlNQYXRoMkQuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gSlNQYXRoMkQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3QzE5M0JG
RTFGNUUxMEQ3MDA4OEYzRTYgLyogSlNQYXRoMkQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNQYXRoMkQu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJN0MxQjRBNjUyNEE5OTc1OTAwMzM3MjdG
IC8qIENvbG9yQmxlbmRpbmcuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ29sb3JCbGVuZGluZy5j
cHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTdDMUI0QTY3MjRBOTk3NjYwMDMzNzI3
RiAvKiBDb2xvckJsZW5kaW5nLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENvbG9yQmxlbmRpbmcuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJN0MxRThDRkYxRUQwQzJCRTAwQjFEOTgzIC8qIEJl
Zm9yZVVubG9hZEV2ZW50LmlkbCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBCZWZvcmVVbmxvYWRF
dmVudC5pZGw7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTdDMUU4RDAwMUVEMEMyQkUw
MEIxRDk4MyAvKiBDYWxsYmFja1Jlc3VsdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBDYWxsYmFja1Jlc3VsdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3QzFF
OTcyNTFBOUY5ODM0MDA3QkYwRkIgLyogQXV0b0ZpbGxCdXR0b25FbGVtZW50LmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEF1dG9GaWxsQnV0dG9uRWxlbWVudC5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0yNTQ5Myw2ICsyNTQ5NSw4IEBACiAJCQkJ
QTg5OTQzMjYwQjQyMzM4NzAwRDdDODAyIC8qIEJpdG1hcEltYWdlLmggKi8sCiAJCQkJQjI3NTM1
MzgwQjA1MzgxNDAwMkNFNjRGIC8qIENvbG9yLmNwcCAqLywKIAkJCQlCMjc1MzUzOTBCMDUzODE0
MDAyQ0U2NEYgLyogQ29sb3IuaCAqLywKKwkJCQk3QzFCNEE2NTI0QTk5NzU5MDAzMzcyN0YgLyog
Q29sb3JCbGVuZGluZy5jcHAgKi8sCisJCQkJN0MxQjRBNjcyNEE5OTc2NjAwMzM3MjdGIC8qIENv
bG9yQmxlbmRpbmcuaCAqLywKIAkJCQk3Q0FDNkFFQzI0N0YxQzUxMDBFNjFENTkgLyogQ29sb3JD
b21wb25lbnRzLmggKi8sCiAJCQkJMzEwM0I3REUxREIwMTU1NjAwOEJCODkwIC8qIENvbG9ySGFz
aC5oICovLAogCQkJCTdDQUM2QUU4MjQ3RjA4MjAwMEU2MUQ1OSAvKiBDb2xvck1hdHJpeC5oICov
LApJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0NTU0dyYWRpZW50VmFsdWUuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NHcmFkaWVudFZhbHVlLmNwcAkocmV2aXNpb24g
MjYzNjE5KQorKysgU291cmNlL1dlYkNvcmUvY3NzL0NTU0dyYWRpZW50VmFsdWUuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAiQ1NTQ2FsY3VsYXRpb25WYWx1
ZS5oIgogI2luY2x1ZGUgIkNTU1RvTGVuZ3RoQ29udmVyc2lvbkRhdGEuaCIKICNpbmNsdWRlICJD
U1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAiQ29sb3JCbGVuZGluZy5oIgogI2luY2x1ZGUg
IkZsb2F0U2l6ZS5oIgogI2luY2x1ZGUgIkdyYWRpZW50LmgiCiAjaW5jbHVkZSAiR3JhZGllbnRJ
bWFnZS5oIgpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5jcHAJ
KHJldmlzaW9uIDI2MzYxOSkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rp
b24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw2ICsyOCw3IEBACiAKICNpbmNsdWRlICJBWE9i
amVjdENhY2hlLmgiCiAjaW5jbHVkZSAiQ2hhcmFjdGVyRGF0YS5oIgorI2luY2x1ZGUgIkNvbG9y
QmxlbmRpbmcuaCIKICNpbmNsdWRlICJEZWxldGVTZWxlY3Rpb25Db21tYW5kLmgiCiAjaW5jbHVk
ZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJFZGl0aW5nLmgiCkBAIC0xODAwLDcgKzE4MDEsNyBA
QCBDb2xvciBDYXJldEJhc2U6OmNvbXB1dGVDYXJldENvbG9yKGNvbnN0CiAgICAgaWYgKCFlbGVt
ZW50U3R5bGUuY2FyZXRDb2xvcigpLmlzVmFsaWQoKSAmJiByb290RWRpdGFibGVTdHlsZSkgewog
ICAgICAgICBhdXRvIHJvb3RFZGl0YWJsZUJhY2tncm91bmRDb2xvciA9IHJvb3RFZGl0YWJsZVN0
eWxlLT52aXNpdGVkRGVwZW5kZW50Q29sb3JXaXRoQ29sb3JGaWx0ZXIoQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kQ29sb3IpOwogICAgICAgICBhdXRvIGVsZW1lbnRCYWNrZ3JvdW5kQ29sb3IgPSBlbGVt
ZW50U3R5bGUudmlzaXRlZERlcGVuZGVudENvbG9yV2l0aENvbG9yRmlsdGVyKENTU1Byb3BlcnR5
QmFja2dyb3VuZENvbG9yKTsKLSAgICAgICAgYXV0byBkaXNhcHBlYXJzSW50b0JhY2tncm91bmQg
PSByb290RWRpdGFibGVCYWNrZ3JvdW5kQ29sb3IuYmxlbmQoZWxlbWVudEJhY2tncm91bmRDb2xv
cikgPT0gcm9vdEVkaXRhYmxlQmFja2dyb3VuZENvbG9yOworICAgICAgICBhdXRvIGRpc2FwcGVh
cnNJbnRvQmFja2dyb3VuZCA9IGJsZW5kU291cmNlT3Zlcihyb290RWRpdGFibGVCYWNrZ3JvdW5k
Q29sb3IsIGVsZW1lbnRCYWNrZ3JvdW5kQ29sb3IpID09IHJvb3RFZGl0YWJsZUJhY2tncm91bmRD
b2xvcjsKICAgICAgICAgaWYgKGRpc2FwcGVhcnNJbnRvQmFja2dyb3VuZCkKICAgICAgICAgICAg
IHJldHVybiByb290RWRpdGFibGVTdHlsZS0+dmlzaXRlZERlcGVuZGVudENvbG9yV2l0aENvbG9y
RmlsdGVyKENTU1Byb3BlcnR5Q2FyZXRDb2xvcik7CiAgICAgfQpJbmRleDogU291cmNlL1dlYkNv
cmUvcGFnZS9GcmFtZVZpZXcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2Uv
RnJhbWVWaWV3LmNwcAkocmV2aXNpb24gMjYzNjE5KQorKysgU291cmNlL1dlYkNvcmUvcGFnZS9G
cmFtZVZpZXcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAi
Q2FjaGVkUmVzb3VyY2VMb2FkZXIuaCIKICNpbmNsdWRlICJDaHJvbWUuaCIKICNpbmNsdWRlICJD
aHJvbWVDbGllbnQuaCIKKyNpbmNsdWRlICJDb2xvckJsZW5kaW5nLmgiCiAjaW5jbHVkZSAiRE9N
V2luZG93LmgiCiAjaW5jbHVkZSAiRGVidWdQYWdlT3ZlcmxheXMuaCIKICNpbmNsdWRlICJEZXBy
ZWNhdGVkR2xvYmFsU2V0dGluZ3MuaCIKQEAgLTQwMzcsMTEgKzQwMzgsMTEgQEAgQ29sb3IgRnJh
bWVWaWV3Ojpkb2N1bWVudEJhY2tncm91bmRDb2xvcgogICAgIGlmICghYm9keUJhY2tncm91bmRD
b2xvci5pc1ZhbGlkKCkpIHsKICAgICAgICAgaWYgKCFodG1sQmFja2dyb3VuZENvbG9yLmlzVmFs
aWQoKSkKICAgICAgICAgICAgIHJldHVybiBDb2xvcigpOwotICAgICAgICByZXR1cm4gYmFzZUJh
Y2tncm91bmRDb2xvcigpLmJsZW5kKGh0bWxCYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICByZXR1
cm4gYmxlbmRTb3VyY2VPdmVyKGJhc2VCYWNrZ3JvdW5kQ29sb3IoKSwgaHRtbEJhY2tncm91bmRD
b2xvcik7CiAgICAgfQogCiAgICAgaWYgKCFodG1sQmFja2dyb3VuZENvbG9yLmlzVmFsaWQoKSkK
LSAgICAgICAgcmV0dXJuIGJhc2VCYWNrZ3JvdW5kQ29sb3IoKS5ibGVuZChib2R5QmFja2dyb3Vu
ZENvbG9yKTsKKyAgICAgICAgcmV0dXJuIGJsZW5kU291cmNlT3ZlcihiYXNlQmFja2dyb3VuZENv
bG9yKCksIGJvZHlCYWNrZ3JvdW5kQ29sb3IpOwogCiAgICAgLy8gV2UgdGFrZSB0aGUgYWdncmVn
YXRlIG9mIHRoZSBiYXNlIGJhY2tncm91bmQgY29sb3IKICAgICAvLyB0aGUgPGh0bWw+IGJhY2tn
cm91bmQgY29sb3IsIGFuZCB0aGUgPGJvZHk+CkBAIC00MDUwLDcgKzQwNTEsNyBAQCBDb2xvciBG
cmFtZVZpZXc6OmRvY3VtZW50QmFja2dyb3VuZENvbG9yCiAgICAgLy8gdGVjaG5pY2FsbHkgcGFy
dCBvZiB0aGUgZG9jdW1lbnQgYmFja2dyb3VuZCwgYnV0IGl0CiAgICAgLy8gb3RoZXJ3aXNlIHBv
c2VzIHByb2JsZW1zIHdoZW4gdGhlIGFnZ3JlZ2F0ZSBpcyBub3QKICAgICAvLyBmdWxseSBvcGFx
dWUuCi0gICAgcmV0dXJuIGJhc2VCYWNrZ3JvdW5kQ29sb3IoKS5ibGVuZChodG1sQmFja2dyb3Vu
ZENvbG9yKS5ibGVuZChib2R5QmFja2dyb3VuZENvbG9yKTsKKyAgICByZXR1cm4gYmxlbmRTb3Vy
Y2VPdmVyKGJsZW5kU291cmNlT3ZlcihiYXNlQmFja2dyb3VuZENvbG9yKCksIGh0bWxCYWNrZ3Jv
dW5kQ29sb3IpLCBib2R5QmFja2dyb3VuZENvbG9yKTsKIH0KIAogYm9vbCBGcmFtZVZpZXc6Omhh
c0N1c3RvbVNjcm9sbGJhcnMoKSBjb25zdApJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9UZXh0
SW5kaWNhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL1RleHRJbmRp
Y2F0b3IuY3BwCShyZXZpc2lvbiAyNjM2MTkpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL1RleHRJ
bmRpY2F0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAi
Y29uZmlnLmgiCiAjaW5jbHVkZSAiVGV4dEluZGljYXRvci5oIgogCisjaW5jbHVkZSAiQ29sb3JC
bGVuZGluZy5oIgogI2luY2x1ZGUgIkNvbG9ySGFzaC5oIgogI2luY2x1ZGUgIkRvY3VtZW50Lmgi
CiAjaW5jbHVkZSAiRWRpdG9yLmgiCkBAIC0yNDksNyArMjUwLDcgQEAgc3RhdGljIENvbG9yIGVz
dGltYXRlZEJhY2tncm91bmRDb2xvckZvcgogICAgIH0KICAgICBwYXJlbnRSZW5kZXJlckJhY2tn
cm91bmRDb2xvcnMucmV2ZXJzZSgpOwogICAgIGZvciAoY29uc3QgYXV0byYgYmFja2dyb3VuZENv
bG9yIDogcGFyZW50UmVuZGVyZXJCYWNrZ3JvdW5kQ29sb3JzKQotICAgICAgICBlc3RpbWF0ZWRC
YWNrZ3JvdW5kQ29sb3IgPSBlc3RpbWF0ZWRCYWNrZ3JvdW5kQ29sb3IuYmxlbmQoYmFja2dyb3Vu
ZENvbG9yKTsKKyAgICAgICAgZXN0aW1hdGVkQmFja2dyb3VuZENvbG9yID0gYmxlbmRTb3VyY2VP
dmVyKGVzdGltYXRlZEJhY2tncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yKTsKIAogICAgIHJl
dHVybiBlc3RpbWF0ZWRCYWNrZ3JvdW5kQ29sb3I7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
YWdlL2FuaW1hdGlvbi9DU1NQcm9wZXJ0eUFuaW1hdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGFnZS9hbmltYXRpb24vQ1NTUHJvcGVydHlBbmltYXRpb24uY3BwCShyZXZp
c2lvbiAyNjM2MTkpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9DU1NQcm9wZXJ0
eUFuaW1hdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRl
ICJDYWNoZWRJbWFnZS5oIgogI2luY2x1ZGUgIkNhbGN1bGF0aW9uVmFsdWUuaCIKICNpbmNsdWRl
ICJDbGlwUGF0aE9wZXJhdGlvbi5oIgorI2luY2x1ZGUgIkNvbG9yQmxlbmRpbmcuaCIKICNpbmNs
dWRlICJGbG9hdENvbnZlcnNpb24uaCIKICNpbmNsdWRlICJGb250Q2FzY2FkZS5oIgogI2luY2x1
ZGUgIkZvbnRTZWxlY3Rpb25BbGdvcml0aG0uaCIKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0NvbG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9Db2xvci5jcHAJKHJldmlzaW9uIDI2MzYxOSkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTUxLDY1
ICsxNTEsNiBAQCBmbG9hdCBDb2xvcjo6bHVtaW5hbmNlKCkgY29uc3QKICAgICByZXR1cm4gV2Vi
Q29yZTo6bHVtaW5hbmNlKHRvU1JHQkFMb3NzeSgpKTsKIH0KIAotQ29sb3IgQ29sb3I6OmJsZW5k
KGNvbnN0IENvbG9yJiBzb3VyY2UpIGNvbnN0Ci17Ci0gICAgaWYgKCFpc1Zpc2libGUoKSB8fCBz
b3VyY2UuaXNPcGFxdWUoKSkKLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLQotICAgIGlmICghc291
cmNlLmFscGhhKCkpCi0gICAgICAgIHJldHVybiAqdGhpczsKLQotICAgIGF1dG8gW3NlbGZSLCBz
ZWxmRywgc2VsZkIsIHNlbGZBXSA9IHRvU1JHQkFTaW1wbGVDb2xvckxvc3N5KCk7Ci0gICAgYXV0
byBbc291cmNlUiwgc291cmNlRywgc291cmNlQiwgc291cmNlQV0gPSBzb3VyY2UudG9TUkdCQVNp
bXBsZUNvbG9yTG9zc3koKTsKLQotICAgIGludCBkID0gMHhGRiAqIChzZWxmQSArIHNvdXJjZUEp
IC0gc2VsZkEgKiBzb3VyY2VBOwotICAgIGludCBhID0gZCAvIDB4RkY7Ci0gICAgaW50IHIgPSAo
c2VsZlIgKiBzZWxmQSAqICgweEZGIC0gc291cmNlQSkgKyAweEZGICogc291cmNlQSAqIHNvdXJj
ZVIpIC8gZDsKLSAgICBpbnQgZyA9IChzZWxmRyAqIHNlbGZBICogKDB4RkYgLSBzb3VyY2VBKSAr
IDB4RkYgKiBzb3VyY2VBICogc291cmNlRykgLyBkOwotICAgIGludCBiID0gKHNlbGZCICogc2Vs
ZkEgKiAoMHhGRiAtIHNvdXJjZUEpICsgMHhGRiAqIHNvdXJjZUEgKiBzb3VyY2VCKSAvIGQ7Ci0K
LSAgICByZXR1cm4gbWFrZVNpbXBsZUNvbG9yKHIsIGcsIGIsIGEpOwotfQotCi1Db2xvciBDb2xv
cjo6YmxlbmRXaXRoV2hpdGUoKSBjb25zdAotewotICAgIGNvbnN0ZXhwciBpbnQgc3RhcnRBbHBo
YSA9IDE1MzsgLy8gNjAlCi0gICAgY29uc3RleHByIGludCBlbmRBbHBoYSA9IDIwNDsgLy8gODAl
OwotICAgIGNvbnN0ZXhwciBpbnQgYWxwaGFJbmNyZW1lbnQgPSAxNzsKLQotICAgIGF1dG8gYmxl
bmRDb21wb25lbnQgPSBbXShpbnQgYywgaW50IGEpIC0+IGludCB7Ci0gICAgICAgIGZsb2F0IGFs
cGhhID0gYSAvIDI1NS4wZjsKLSAgICAgICAgaW50IHdoaXRlQmxlbmQgPSAyNTUgLSBhOwotICAg
ICAgICBjIC09IHdoaXRlQmxlbmQ7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGMg
LyBhbHBoYSk7Ci0gICAgfTsKLQotICAgIC8vIElmIHRoZSBjb2xvciBjb250YWlucyBhbHBoYSBh
bHJlYWR5LCB3ZSBsZWF2ZSBpdCBhbG9uZS4KLSAgICBpZiAoIWlzT3BhcXVlKCkpCi0gICAgICAg
IHJldHVybiAqdGhpczsKLQotICAgIGF1dG8gW2V4aXN0aW5nUiwgZXhpc3RpbmdHLCBleGlzdGlu
Z0IsIGV4aXN0aW5nQWxwaGFdID0gdG9TUkdCQVNpbXBsZUNvbG9yTG9zc3koKTsKLQotICAgIENv
bG9yIHJlc3VsdDsKLSAgICBmb3IgKGludCBhbHBoYSA9IHN0YXJ0QWxwaGE7IGFscGhhIDw9IGVu
ZEFscGhhOyBhbHBoYSArPSBhbHBoYUluY3JlbWVudCkgewotICAgICAgICAvLyBXZSBoYXZlIGEg
c29saWQgY29sb3IuICBDb252ZXJ0IHRvIGFuIGVxdWl2YWxlbnQgY29sb3IgdGhhdCBsb29rcyB0
aGUgc2FtZSB3aGVuIGJsZW5kZWQgd2l0aCB3aGl0ZQotICAgICAgICAvLyBhdCB0aGUgY3VycmVu
dCBhbHBoYS4gIFRyeSB1c2luZyBsZXNzIHRyYW5zcGFyZW5jeSBpZiB0aGUgbnVtYmVycyBlbmQg
dXAgYmVpbmcgbmVnYXRpdmUuCi0gICAgICAgIGludCByID0gYmxlbmRDb21wb25lbnQoZXhpc3Rp
bmdSLCBhbHBoYSk7Ci0gICAgICAgIGludCBnID0gYmxlbmRDb21wb25lbnQoZXhpc3RpbmdHLCBh
bHBoYSk7Ci0gICAgICAgIGludCBiID0gYmxlbmRDb21wb25lbnQoZXhpc3RpbmdCLCBhbHBoYSk7
Ci0gICAgICAgIAotICAgICAgICByZXN1bHQgPSBtYWtlU2ltcGxlQ29sb3IociwgZywgYiwgYWxw
aGEpOwotCi0gICAgICAgIGlmIChyID49IDAgJiYgZyA+PSAwICYmIGIgPj0gMCkKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBXaHkgaXMgcHJlc2VydmluZyB0aGUg
c2VtYW50aWMgYml0IGRlc2lyZWQgYW5kL29yIGNvcnJlY3QgaGVyZT8KLSAgICBpZiAoaXNTZW1h
bnRpYygpKQotICAgICAgICByZXN1bHQudGFnQXNTZW1hbnRpYygpOwotICAgIHJldHVybiByZXN1
bHQ7Ci19Ci0KIENvbG9yIENvbG9yOjpjb2xvcldpdGhBbHBoYShmbG9hdCBhbHBoYSkgY29uc3QK
IHsKICAgICBpZiAoaXNFeHRlbmRlZCgpKQpAQCAtMjU5LDQ1ICsyMDAsNiBAQCBTUkdCQTxmbG9h
dD4gQ29sb3I6OnRvU1JHQkFMb3NzeSgpIGNvbnN0CiAgICAgcmV0dXJuIGFzU2ltcGxlKCkuYXNT
UkdCQTxmbG9hdD4oKTsKIH0KIAotQ29sb3IgYmxlbmQoY29uc3QgQ29sb3ImIGZyb20sIGNvbnN0
IENvbG9yJiB0bywgZG91YmxlIHByb2dyZXNzKQotewotICAgIC8vIEZJWE1FOiBFeHRlbmRlZENv
bG9yIC0gbmVlZHMgdG8gaGFuZGxlIGNvbG9yIHNwYWNlcy4KLSAgICAvLyBXZSBuZWVkIHRvIHBy
ZXNlcnZlIHRoZSBzdGF0ZSBvZiB0aGUgdmFsaWQgZmxhZyBhdCB0aGUgZW5kIG9mIHRoZSBhbmlt
YXRpb24KLSAgICBpZiAocHJvZ3Jlc3MgPT0gMSAmJiAhdG8uaXNWYWxpZCgpKQotICAgICAgICBy
ZXR1cm4geyB9OwotCi0gICAgLy8gU2luY2UgcHJlbXVsdGlwbHlDZWlsaW5nKCkgYmFpbHMgb24g
emVybyBhbHBoYSwgc3BlY2lhbC1jYXNlIHRoYXQuCi0gICAgYXV0byBwcmVtdWx0aXBsaWVkRnJv
bSA9IGZyb20uYWxwaGEoKSA/IHByZW11bHRpcGx5Q2VpbGluZyhmcm9tLnRvU1JHQkFTaW1wbGVD
b2xvckxvc3N5KCkpIDogQ29sb3I6OnRyYW5zcGFyZW50OwotICAgIGF1dG8gcHJlbXVsdGlwbGll
ZFRvID0gdG8uYWxwaGEoKSA/IHByZW11bHRpcGx5Q2VpbGluZyh0by50b1NSR0JBU2ltcGxlQ29s
b3JMb3NzeSgpKSA6IENvbG9yOjp0cmFuc3BhcmVudDsKLQotICAgIFNpbXBsZUNvbG9yIHByZW11
bHRCbGVuZGVkID0gbWFrZVNpbXBsZUNvbG9yKAotICAgICAgICBXZWJDb3JlOjpibGVuZChwcmVt
dWx0aXBsaWVkRnJvbS5yZWRDb21wb25lbnQoKSwgcHJlbXVsdGlwbGllZFRvLnJlZENvbXBvbmVu
dCgpLCBwcm9ncmVzcyksCi0gICAgICAgIFdlYkNvcmU6OmJsZW5kKHByZW11bHRpcGxpZWRGcm9t
LmdyZWVuQ29tcG9uZW50KCksIHByZW11bHRpcGxpZWRUby5ncmVlbkNvbXBvbmVudCgpLCBwcm9n
cmVzcyksCi0gICAgICAgIFdlYkNvcmU6OmJsZW5kKHByZW11bHRpcGxpZWRGcm9tLmJsdWVDb21w
b25lbnQoKSwgcHJlbXVsdGlwbGllZFRvLmJsdWVDb21wb25lbnQoKSwgcHJvZ3Jlc3MpLAotICAg
ICAgICBXZWJDb3JlOjpibGVuZChwcmVtdWx0aXBsaWVkRnJvbS5hbHBoYUNvbXBvbmVudCgpLCBw
cmVtdWx0aXBsaWVkVG8uYWxwaGFDb21wb25lbnQoKSwgcHJvZ3Jlc3MpCi0gICAgKTsKLQotICAg
IHJldHVybiB1bnByZW11bHRpcGx5KHByZW11bHRCbGVuZGVkKTsKLX0KLQotQ29sb3IgYmxlbmRX
aXRob3V0UHJlbXVsdGlwbHkoY29uc3QgQ29sb3ImIGZyb20sIGNvbnN0IENvbG9yJiB0bywgZG91
YmxlIHByb2dyZXNzKQotewotICAgIC8vIEZJWE1FOiBFeHRlbmRlZENvbG9yIC0gbmVlZHMgdG8g
aGFuZGxlIGNvbG9yIHNwYWNlcy4KLSAgICAvLyBXZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBzdGF0
ZSBvZiB0aGUgdmFsaWQgZmxhZyBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24KLSAgICBpZiAo
cHJvZ3Jlc3MgPT0gMSAmJiAhdG8uaXNWYWxpZCgpKQotICAgICAgICByZXR1cm4geyB9OwotCi0g
ICAgYXV0byBmcm9tU1JHQiA9IGZyb20udG9TUkdCQVNpbXBsZUNvbG9yTG9zc3koKTsKLSAgICBh
dXRvIHRvU1JHQiA9IGZyb20udG9TUkdCQVNpbXBsZUNvbG9yTG9zc3koKTsKLQotICAgIHJldHVy
biBtYWtlU2ltcGxlQ29sb3JGcm9tRmxvYXRzKAotICAgICAgICBXZWJDb3JlOjpibGVuZChmcm9t
U1JHQi5yZWRDb21wb25lbnQoKSwgdG9TUkdCLnJlZENvbXBvbmVudCgpLCBwcm9ncmVzcyksCi0g
ICAgICAgIFdlYkNvcmU6OmJsZW5kKGZyb21TUkdCLmdyZWVuQ29tcG9uZW50KCksIHRvU1JHQi5n
cmVlbkNvbXBvbmVudCgpLCBwcm9ncmVzcyksCi0gICAgICAgIFdlYkNvcmU6OmJsZW5kKGZyb21T
UkdCLmJsdWVDb21wb25lbnQoKSwgdG9TUkdCLmJsdWVDb21wb25lbnQoKSwgcHJvZ3Jlc3MpLAot
ICAgICAgICBXZWJDb3JlOjpibGVuZChmcm9tU1JHQi5hbHBoYUNvbXBvbmVudCgpLCB0b1NSR0Iu
YWxwaGFDb21wb25lbnQoKSwgcHJvZ3Jlc3MpCi0gICAgKTsKLX0KLQogVGV4dFN0cmVhbSYgb3Bl
cmF0b3I8PChUZXh0U3RyZWFtJiB0cywgY29uc3QgQ29sb3ImIGNvbG9yKQogewogICAgIHJldHVy
biB0cyA8PCBjb2xvci5uYW1lRm9yUmVuZGVyVHJlZUFzVGV4dCgpOwpJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvci5oCShyZXZpc2lvbiAyNjM2MTkpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0x
NDQsMTAgKzE0NCw2IEBAIHB1YmxpYzoKICAgICBXRUJDT1JFX0VYUE9SVCBib29sIGlzRGFyaygp
IGNvbnN0OwogICAgIFdFQkNPUkVfRVhQT1JUIGZsb2F0IGxpZ2h0bmVzcygpIGNvbnN0OwogCi0g
ICAgLy8gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBQb3J0ZXItRHVmZidzICJzb3VyY2Ut
b3ZlciIgZXF1YXRpb24KLSAgICBDb2xvciBibGVuZChjb25zdCBDb2xvciYpIGNvbnN0OwotICAg
IENvbG9yIGJsZW5kV2l0aFdoaXRlKCkgY29uc3Q7Ci0KICAgICBDb2xvciBpbnZlcnRlZENvbG9y
V2l0aEFscGhhKE9wdGlvbmFsPGZsb2F0PiBhbHBoYSkgY29uc3Q7CiAgICAgQ29sb3IgaW52ZXJ0
ZWRDb2xvcldpdGhBbHBoYShmbG9hdCBhbHBoYSkgY29uc3Q7CiAKQEAgLTIzOSw5ICsyMzUsNiBA
QCBib29sIG9wZXJhdG9yIT0oY29uc3QgQ29sb3ImLCBjb25zdCBDb2xvCiAvLyBPbmUgb3IgYm90
aCBtdXN0IGJlIGV4dGVuZGVkIGNvbG9ycy4KIGJvb2wgZXh0ZW5kZWRDb2xvcnNFcXVhbChjb25z
dCBDb2xvciYsIGNvbnN0IENvbG9yJik7CiAKLUNvbG9yIGJsZW5kKGNvbnN0IENvbG9yJiBmcm9t
LCBjb25zdCBDb2xvciYgdG8sIGRvdWJsZSBwcm9ncmVzcyk7Ci1Db2xvciBibGVuZFdpdGhvdXRQ
cmVtdWx0aXBseShjb25zdCBDb2xvciYgZnJvbSwgY29uc3QgQ29sb3ImIHRvLCBkb3VibGUgcHJv
Z3Jlc3MpOwotCiAjaWYgVVNFKENHKQogV0VCQ09SRV9FWFBPUlQgQ0dDb2xvclJlZiBjYWNoZWRD
R0NvbG9yKGNvbnN0IENvbG9yJik7CiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0NvbG9yQmxlbmRpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yQmxlbmRpbmcuY3BwCShyZXZpc2lvbiAyNjM2MTkp
CShmcm9tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmNwcDoyNjM2MTkp
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvckJsZW5kaW5nLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
My0yMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJDb2xvci5oIgorCisjaW5jbHVkZSAiQW5pbWF0aW9uVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAi
Q29sb3JVdGlsaXRpZXMuaCIKKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorI2luY2x1ZGUg
PHd0Zi9NYXRoRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgor
I2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitzdGF0aWMgY29uc3RleHByIFNpbXBsZUNvbG9yIGxpZ2h0ZW5lZEJsYWNrIHsgMHhGRjU0NTQ1
NCB9Oworc3RhdGljIGNvbnN0ZXhwciBTaW1wbGVDb2xvciBkYXJrZW5lZFdoaXRlIHsgMHhGRkFC
QUJBQiB9OworCitDb2xvcjo6Q29sb3IoY29uc3QgQ29sb3ImIG90aGVyKQorICAgIDogbV9jb2xv
ckRhdGEob3RoZXIubV9jb2xvckRhdGEpCit7CisgICAgaWYgKGlzRXh0ZW5kZWQoKSkKKyAgICAg
ICAgbV9jb2xvckRhdGEuZXh0ZW5kZWRDb2xvci0+cmVmKCk7Cit9CisKK0NvbG9yOjpDb2xvcihD
b2xvciYmIG90aGVyKQoreworICAgICp0aGlzID0gV1RGTW92ZShvdGhlcik7Cit9CisKK0NvbG9y
JiBDb2xvcjo6b3BlcmF0b3I9KGNvbnN0IENvbG9yJiBvdGhlcikKK3sKKyAgICBpZiAoKnRoaXMg
PT0gb3RoZXIpCisgICAgICAgIHJldHVybiAqdGhpczsKKworICAgIGlmIChpc0V4dGVuZGVkKCkp
CisgICAgICAgIG1fY29sb3JEYXRhLmV4dGVuZGVkQ29sb3ItPmRlcmVmKCk7CisKKyAgICBtX2Nv
bG9yRGF0YSA9IG90aGVyLm1fY29sb3JEYXRhOworCisgICAgaWYgKGlzRXh0ZW5kZWQoKSkKKyAg
ICAgICAgbV9jb2xvckRhdGEuZXh0ZW5kZWRDb2xvci0+cmVmKCk7CisgICAgcmV0dXJuICp0aGlz
OworfQorCitDb2xvciYgQ29sb3I6Om9wZXJhdG9yPShDb2xvciYmIG90aGVyKQoreworICAgIGlm
ICgqdGhpcyA9PSBvdGhlcikKKyAgICAgICAgcmV0dXJuICp0aGlzOworCisgICAgaWYgKGlzRXh0
ZW5kZWQoKSkKKyAgICAgICAgbV9jb2xvckRhdGEuZXh0ZW5kZWRDb2xvci0+ZGVyZWYoKTsKKwor
ICAgIG1fY29sb3JEYXRhID0gb3RoZXIubV9jb2xvckRhdGE7CisgICAgb3RoZXIubV9jb2xvckRh
dGEuc2ltcGxlQ29sb3JBbmRGbGFncyA9IGludmFsaWRTaW1wbGVDb2xvcjsKKworICAgIHJldHVy
biAqdGhpczsKK30KKworU3RyaW5nIENvbG9yOjpzZXJpYWxpemVkKCkgY29uc3QKK3sKKyAgICBp
ZiAoaXNFeHRlbmRlZCgpKQorICAgICAgICByZXR1cm4gYXNFeHRlbmRlZCgpLmNzc1RleHQoKTsK
KyAgICByZXR1cm4gYXNTaW1wbGUoKS5zZXJpYWxpemF0aW9uRm9ySFRNTCgpOworfQorCitTdHJp
bmcgQ29sb3I6OmNzc1RleHQoKSBjb25zdAoreworICAgIGlmIChpc0V4dGVuZGVkKCkpCisgICAg
ICAgIHJldHVybiBhc0V4dGVuZGVkKCkuY3NzVGV4dCgpOworICAgIHJldHVybiBhc1NpbXBsZSgp
LnNlcmlhbGl6YXRpb25Gb3JDU1MoKTsKK30KKworU3RyaW5nIENvbG9yOjpuYW1lRm9yUmVuZGVy
VHJlZUFzVGV4dCgpIGNvbnN0Cit7CisgICAgaWYgKGlzRXh0ZW5kZWQoKSkKKyAgICAgICAgcmV0
dXJuIGFzRXh0ZW5kZWQoKS5jc3NUZXh0KCk7CisgICAgcmV0dXJuIGFzU2ltcGxlKCkuc2VyaWFs
aXphdGlvbkZvclJlbmRlclRyZWVBc1RleHQoKTsKK30KKworQ29sb3IgQ29sb3I6OmxpZ2h0ZW5l
ZCgpIGNvbnN0Cit7CisgICAgLy8gSGFyZGNvZGUgdGhpcyBjb21tb24gY2FzZSBmb3Igc3BlZWQu
CisgICAgaWYgKGlzU2ltcGxlKCkgJiYgYXNTaW1wbGUoKSA9PSBibGFjaykKKyAgICAgICAgcmV0
dXJuIGxpZ2h0ZW5lZEJsYWNrOworCisgICAgYXV0byBbciwgZywgYiwgYV0gPSB0b1NSR0JBTG9z
c3koKTsKKyAgICBmbG9hdCB2ID0gc3RkOjptYXgoeyByLCBnLCBiIH0pOworCisgICAgaWYgKHYg
PT0gMC4wZikKKyAgICAgICAgcmV0dXJuIGxpZ2h0ZW5lZEJsYWNrLmNvbG9yV2l0aEFscGhhKGFs
cGhhKCkpOworCisgICAgZmxvYXQgbXVsdGlwbGllciA9IHN0ZDo6bWluKDEuMGYsIHYgKyAwLjMz
ZikgLyB2OworCisgICAgcmV0dXJuIG1ha2VTaW1wbGVDb2xvckZyb21GbG9hdHMobXVsdGlwbGll
ciAqIHIsIG11bHRpcGxpZXIgKiBnLCBtdWx0aXBsaWVyICogYiwgYSk7Cit9CisKK0NvbG9yIENv
bG9yOjpkYXJrZW5lZCgpIGNvbnN0Cit7CisgICAgLy8gSGFyZGNvZGUgdGhpcyBjb21tb24gY2Fz
ZSBmb3Igc3BlZWQuCisgICAgaWYgKGlzU2ltcGxlKCkgJiYgYXNTaW1wbGUoKSA9PSB3aGl0ZSkK
KyAgICAgICAgcmV0dXJuIGRhcmtlbmVkV2hpdGU7CisgICAgCisgICAgYXV0byBbciwgZywgYiwg
YV0gPSB0b1NSR0JBTG9zc3koKTsKKworICAgIGZsb2F0IHYgPSBzdGQ6Om1heCh7IHIsIGcsIGIg
fSk7CisgICAgZmxvYXQgbXVsdGlwbGllciA9IHN0ZDo6bWF4KDAuMGYsICh2IC0gMC4zM2YpIC8g
dik7CisKKyAgICByZXR1cm4gbWFrZVNpbXBsZUNvbG9yRnJvbUZsb2F0cyhtdWx0aXBsaWVyICog
ciwgbXVsdGlwbGllciAqIGcsIG11bHRpcGxpZXIgKiBiLCBhKTsKK30KKworYm9vbCBDb2xvcjo6
aXNEYXJrKCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUg
dXNpbmcgbHVtaW5hbmNlLgorICAgIGF1dG8gW3IsIGcsIGIsIGFdID0gdG9TUkdCQUxvc3N5KCk7
CisgICAgZmxvYXQgbGFyZ2VzdE5vbkFscGhhQ2hhbm5lbCA9IHN0ZDo6bWF4KHsgciwgZywgYiB9
KTsKKyAgICByZXR1cm4gYSA+IDAuNSAmJiBsYXJnZXN0Tm9uQWxwaGFDaGFubmVsIDwgMC41Owor
fQorCitmbG9hdCBDb2xvcjo6bGlnaHRuZXNzKCkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogVGhp
cyBjYW4gcHJvYmFibHkgYXZvaWQgY29udmVyc2lvbiB0byBzUkdCIGJ5IGhhdmluZyBwZXItY29s
b3JzcGFjZSBhbGdvcml0aG1zIGZvciBIU0wuCisgICAgcmV0dXJuIFdlYkNvcmU6OmxpZ2h0bmVz
cyh0b1NSR0JBTG9zc3koKSk7Cit9CisKK2Zsb2F0IENvbG9yOjpsdW1pbmFuY2UoKSBjb25zdAor
eworICAgIC8vIEZJWE1FOiBUaGlzIGNhbiBwcm9iYWJseSBhdm9pZCBjb252ZXJzaW9uIHRvIHNS
R0IgYnkgaGF2aW5nIHBlci1jb2xvcnNwYWNlIGFsZ29yaXRobXMgZm9yIGx1bWluYW5jZSAoZS5n
LiBjb252ZXJ0VG9YWVooYykueUNvbXBvbmVudCgpKS4KKyAgICByZXR1cm4gV2ViQ29yZTo6bHVt
aW5hbmNlKHRvU1JHQkFMb3NzeSgpKTsKK30KKworQ29sb3IgQ29sb3I6OmJsZW5kKGNvbnN0IENv
bG9yJiBzb3VyY2UpIGNvbnN0Cit7CisgICAgaWYgKCFpc1Zpc2libGUoKSB8fCBzb3VyY2UuaXNP
cGFxdWUoKSkKKyAgICAgICAgcmV0dXJuIHNvdXJjZTsKKworICAgIGlmICghc291cmNlLmFscGhh
KCkpCisgICAgICAgIHJldHVybiAqdGhpczsKKworICAgIGF1dG8gW3NlbGZSLCBzZWxmRywgc2Vs
ZkIsIHNlbGZBXSA9IHRvU1JHQkFTaW1wbGVDb2xvckxvc3N5KCk7CisgICAgYXV0byBbc291cmNl
Uiwgc291cmNlRywgc291cmNlQiwgc291cmNlQV0gPSBzb3VyY2UudG9TUkdCQVNpbXBsZUNvbG9y
TG9zc3koKTsKKworICAgIGludCBkID0gMHhGRiAqIChzZWxmQSArIHNvdXJjZUEpIC0gc2VsZkEg
KiBzb3VyY2VBOworICAgIGludCBhID0gZCAvIDB4RkY7CisgICAgaW50IHIgPSAoc2VsZlIgKiBz
ZWxmQSAqICgweEZGIC0gc291cmNlQSkgKyAweEZGICogc291cmNlQSAqIHNvdXJjZVIpIC8gZDsK
KyAgICBpbnQgZyA9IChzZWxmRyAqIHNlbGZBICogKDB4RkYgLSBzb3VyY2VBKSArIDB4RkYgKiBz
b3VyY2VBICogc291cmNlRykgLyBkOworICAgIGludCBiID0gKHNlbGZCICogc2VsZkEgKiAoMHhG
RiAtIHNvdXJjZUEpICsgMHhGRiAqIHNvdXJjZUEgKiBzb3VyY2VCKSAvIGQ7CisKKyAgICByZXR1
cm4gbWFrZVNpbXBsZUNvbG9yKHIsIGcsIGIsIGEpOworfQorCitDb2xvciBDb2xvcjo6YmxlbmRX
aXRoV2hpdGUoKSBjb25zdAoreworICAgIGNvbnN0ZXhwciBpbnQgc3RhcnRBbHBoYSA9IDE1Mzsg
Ly8gNjAlCisgICAgY29uc3RleHByIGludCBlbmRBbHBoYSA9IDIwNDsgLy8gODAlOworICAgIGNv
bnN0ZXhwciBpbnQgYWxwaGFJbmNyZW1lbnQgPSAxNzsKKworICAgIGF1dG8gYmxlbmRDb21wb25l
bnQgPSBbXShpbnQgYywgaW50IGEpIC0+IGludCB7CisgICAgICAgIGZsb2F0IGFscGhhID0gYSAv
IDI1NS4wZjsKKyAgICAgICAgaW50IHdoaXRlQmxlbmQgPSAyNTUgLSBhOworICAgICAgICBjIC09
IHdoaXRlQmxlbmQ7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGMgLyBhbHBoYSk7
CisgICAgfTsKKworICAgIC8vIElmIHRoZSBjb2xvciBjb250YWlucyBhbHBoYSBhbHJlYWR5LCB3
ZSBsZWF2ZSBpdCBhbG9uZS4KKyAgICBpZiAoIWlzT3BhcXVlKCkpCisgICAgICAgIHJldHVybiAq
dGhpczsKKworICAgIGF1dG8gW2V4aXN0aW5nUiwgZXhpc3RpbmdHLCBleGlzdGluZ0IsIGV4aXN0
aW5nQWxwaGFdID0gdG9TUkdCQVNpbXBsZUNvbG9yTG9zc3koKTsKKworICAgIENvbG9yIHJlc3Vs
dDsKKyAgICBmb3IgKGludCBhbHBoYSA9IHN0YXJ0QWxwaGE7IGFscGhhIDw9IGVuZEFscGhhOyBh
bHBoYSArPSBhbHBoYUluY3JlbWVudCkgeworICAgICAgICAvLyBXZSBoYXZlIGEgc29saWQgY29s
b3IuICBDb252ZXJ0IHRvIGFuIGVxdWl2YWxlbnQgY29sb3IgdGhhdCBsb29rcyB0aGUgc2FtZSB3
aGVuIGJsZW5kZWQgd2l0aCB3aGl0ZQorICAgICAgICAvLyBhdCB0aGUgY3VycmVudCBhbHBoYS4g
IFRyeSB1c2luZyBsZXNzIHRyYW5zcGFyZW5jeSBpZiB0aGUgbnVtYmVycyBlbmQgdXAgYmVpbmcg
bmVnYXRpdmUuCisgICAgICAgIGludCByID0gYmxlbmRDb21wb25lbnQoZXhpc3RpbmdSLCBhbHBo
YSk7CisgICAgICAgIGludCBnID0gYmxlbmRDb21wb25lbnQoZXhpc3RpbmdHLCBhbHBoYSk7Cisg
ICAgICAgIGludCBiID0gYmxlbmRDb21wb25lbnQoZXhpc3RpbmdCLCBhbHBoYSk7CisgICAgICAg
IAorICAgICAgICByZXN1bHQgPSBtYWtlU2ltcGxlQ29sb3IociwgZywgYiwgYWxwaGEpOworCisg
ICAgICAgIGlmIChyID49IDAgJiYgZyA+PSAwICYmIGIgPj0gMCkKKyAgICAgICAgICAgIGJyZWFr
OworICAgIH0KKworICAgIC8vIEZJWE1FOiBXaHkgaXMgcHJlc2VydmluZyB0aGUgc2VtYW50aWMg
Yml0IGRlc2lyZWQgYW5kL29yIGNvcnJlY3QgaGVyZT8KKyAgICBpZiAoaXNTZW1hbnRpYygpKQor
ICAgICAgICByZXN1bHQudGFnQXNTZW1hbnRpYygpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisK
K0NvbG9yIENvbG9yOjpjb2xvcldpdGhBbHBoYShmbG9hdCBhbHBoYSkgY29uc3QKK3sKKyAgICBp
ZiAoaXNFeHRlbmRlZCgpKQorICAgICAgICByZXR1cm4gYXNFeHRlbmRlZCgpLmNvbG9yV2l0aEFs
cGhhKGFscGhhKTsKKworICAgIENvbG9yIHJlc3VsdCA9IGFzU2ltcGxlKCkuY29sb3JXaXRoQWxw
aGEoY29udmVydFRvQ29tcG9uZW50Qnl0ZShhbHBoYSkpOworCisgICAgLy8gRklYTUU6IFdoeSBp
cyBwcmVzZXJ2aW5nIHRoZSBzZW1hbnRpYyBiaXQgZGVzaXJlZCBhbmQvb3IgY29ycmVjdCBoZXJl
PworICAgIGlmIChpc1NlbWFudGljKCkpCisgICAgICAgIHJlc3VsdC50YWdBc1NlbWFudGljKCk7
CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQ29sb3IgQ29sb3I6OmludmVydGVkQ29sb3JXaXRo
QWxwaGEoZmxvYXQgYWxwaGEpIGNvbnN0Cit7CisgICAgaWYgKGlzRXh0ZW5kZWQoKSkKKyAgICAg
ICAgcmV0dXJuIGFzRXh0ZW5kZWQoKS5pbnZlcnRlZENvbG9yV2l0aEFscGhhKGFscGhhKTsKKyAg
ICByZXR1cm4gYXNTaW1wbGUoKS5pbnZlcnRlZENvbG9yV2l0aEFscGhhKGNvbnZlcnRUb0NvbXBv
bmVudEJ5dGUoYWxwaGEpKTsKK30KKworQ29sb3IgQ29sb3I6OnNlbWFudGljQ29sb3IoKSBjb25z
dAoreworICAgIGlmIChpc1NlbWFudGljKCkpCisgICAgICAgIHJldHVybiAqdGhpczsKKworICAg
IHJldHVybiB7IHRvU1JHQkFTaW1wbGVDb2xvckxvc3N5KCksIFNlbWFudGljIH07Cit9CisKK3N0
ZDo6cGFpcjxDb2xvclNwYWNlLCBDb2xvckNvbXBvbmVudHM8ZmxvYXQ+PiBDb2xvcjo6Y29sb3JT
cGFjZUFuZENvbXBvbmVudHMoKSBjb25zdAoreworICAgIGlmIChpc0V4dGVuZGVkKCkpCisgICAg
ICAgIHJldHVybiB7IGFzRXh0ZW5kZWQoKS5jb2xvclNwYWNlKCksIGFzRXh0ZW5kZWQoKS5jb21w
b25lbnRzKCkgfTsKKyAgICByZXR1cm4geyBDb2xvclNwYWNlOjpTUkdCLCBhc0NvbG9yQ29tcG9u
ZW50cyhhc1NpbXBsZSgpLmFzU1JHQkE8ZmxvYXQ+KCkpIH07Cit9CisKK1NpbXBsZUNvbG9yIENv
bG9yOjp0b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpIGNvbnN0Cit7CisgICAgaWYgKGlzRXh0ZW5k
ZWQoKSkKKyAgICAgICAgcmV0dXJuIG1ha2VTaW1wbGVDb2xvcihhc0V4dGVuZGVkKCkudG9TUkdC
QUxvc3N5KCkpOworICAgIHJldHVybiBhc1NpbXBsZSgpOworfQorCitTUkdCQTxmbG9hdD4gQ29s
b3I6OnRvU1JHQkFMb3NzeSgpIGNvbnN0Cit7CisgICAgaWYgKGlzRXh0ZW5kZWQoKSkKKyAgICAg
ICAgcmV0dXJuIGFzRXh0ZW5kZWQoKS50b1NSR0JBTG9zc3koKTsKKyAgICByZXR1cm4gYXNTaW1w
bGUoKS5hc1NSR0JBPGZsb2F0PigpOworfQorCitDb2xvciBibGVuZChjb25zdCBDb2xvciYgZnJv
bSwgY29uc3QgQ29sb3ImIHRvLCBkb3VibGUgcHJvZ3Jlc3MpCit7CisgICAgLy8gRklYTUU6IEV4
dGVuZGVkQ29sb3IgLSBuZWVkcyB0byBoYW5kbGUgY29sb3Igc3BhY2VzLgorICAgIC8vIFdlIG5l
ZWQgdG8gcHJlc2VydmUgdGhlIHN0YXRlIG9mIHRoZSB2YWxpZCBmbGFnIGF0IHRoZSBlbmQgb2Yg
dGhlIGFuaW1hdGlvbgorICAgIGlmIChwcm9ncmVzcyA9PSAxICYmICF0by5pc1ZhbGlkKCkpCisg
ICAgICAgIHJldHVybiB7IH07CisKKyAgICAvLyBTaW5jZSBwcmVtdWx0aXBseUNlaWxpbmcoKSBi
YWlscyBvbiB6ZXJvIGFscGhhLCBzcGVjaWFsLWNhc2UgdGhhdC4KKyAgICBhdXRvIHByZW11bHRp
cGxpZWRGcm9tID0gZnJvbS5hbHBoYSgpID8gcHJlbXVsdGlwbHlDZWlsaW5nKGZyb20udG9TUkdC
QVNpbXBsZUNvbG9yTG9zc3koKSkgOiBDb2xvcjo6dHJhbnNwYXJlbnQ7CisgICAgYXV0byBwcmVt
dWx0aXBsaWVkVG8gPSB0by5hbHBoYSgpID8gcHJlbXVsdGlwbHlDZWlsaW5nKHRvLnRvU1JHQkFT
aW1wbGVDb2xvckxvc3N5KCkpIDogQ29sb3I6OnRyYW5zcGFyZW50OworCisgICAgU2ltcGxlQ29s
b3IgcHJlbXVsdEJsZW5kZWQgPSBtYWtlU2ltcGxlQ29sb3IoCisgICAgICAgIFdlYkNvcmU6OmJs
ZW5kKHByZW11bHRpcGxpZWRGcm9tLnJlZENvbXBvbmVudCgpLCBwcmVtdWx0aXBsaWVkVG8ucmVk
Q29tcG9uZW50KCksIHByb2dyZXNzKSwKKyAgICAgICAgV2ViQ29yZTo6YmxlbmQocHJlbXVsdGlw
bGllZEZyb20uZ3JlZW5Db21wb25lbnQoKSwgcHJlbXVsdGlwbGllZFRvLmdyZWVuQ29tcG9uZW50
KCksIHByb2dyZXNzKSwKKyAgICAgICAgV2ViQ29yZTo6YmxlbmQocHJlbXVsdGlwbGllZEZyb20u
Ymx1ZUNvbXBvbmVudCgpLCBwcmVtdWx0aXBsaWVkVG8uYmx1ZUNvbXBvbmVudCgpLCBwcm9ncmVz
cyksCisgICAgICAgIFdlYkNvcmU6OmJsZW5kKHByZW11bHRpcGxpZWRGcm9tLmFscGhhQ29tcG9u
ZW50KCksIHByZW11bHRpcGxpZWRUby5hbHBoYUNvbXBvbmVudCgpLCBwcm9ncmVzcykKKyAgICAp
OworCisgICAgcmV0dXJuIHVucHJlbXVsdGlwbHkocHJlbXVsdEJsZW5kZWQpOworfQorCitDb2xv
ciBibGVuZFdpdGhvdXRQcmVtdWx0aXBseShjb25zdCBDb2xvciYgZnJvbSwgY29uc3QgQ29sb3Im
IHRvLCBkb3VibGUgcHJvZ3Jlc3MpCit7CisgICAgLy8gRklYTUU6IEV4dGVuZGVkQ29sb3IgLSBu
ZWVkcyB0byBoYW5kbGUgY29sb3Igc3BhY2VzLgorICAgIC8vIFdlIG5lZWQgdG8gcHJlc2VydmUg
dGhlIHN0YXRlIG9mIHRoZSB2YWxpZCBmbGFnIGF0IHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbgor
ICAgIGlmIChwcm9ncmVzcyA9PSAxICYmICF0by5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiB7
IH07CisKKyAgICBhdXRvIGZyb21TUkdCID0gZnJvbS50b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgp
OworICAgIGF1dG8gdG9TUkdCID0gZnJvbS50b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpOworCisg
ICAgcmV0dXJuIG1ha2VTaW1wbGVDb2xvckZyb21GbG9hdHMoCisgICAgICAgIFdlYkNvcmU6OmJs
ZW5kKGZyb21TUkdCLnJlZENvbXBvbmVudCgpLCB0b1NSR0IucmVkQ29tcG9uZW50KCksIHByb2dy
ZXNzKSwKKyAgICAgICAgV2ViQ29yZTo6YmxlbmQoZnJvbVNSR0IuZ3JlZW5Db21wb25lbnQoKSwg
dG9TUkdCLmdyZWVuQ29tcG9uZW50KCksIHByb2dyZXNzKSwKKyAgICAgICAgV2ViQ29yZTo6Ymxl
bmQoZnJvbVNSR0IuYmx1ZUNvbXBvbmVudCgpLCB0b1NSR0IuYmx1ZUNvbXBvbmVudCgpLCBwcm9n
cmVzcyksCisgICAgICAgIFdlYkNvcmU6OmJsZW5kKGZyb21TUkdCLmFscGhhQ29tcG9uZW50KCks
IHRvU1JHQi5hbHBoYUNvbXBvbmVudCgpLCBwcm9ncmVzcykKKyAgICApOworfQorCitUZXh0U3Ry
ZWFtJiBvcGVyYXRvcjw8KFRleHRTdHJlYW0mIHRzLCBjb25zdCBDb2xvciYgY29sb3IpCit7Cisg
ICAgcmV0dXJuIHRzIDw8IGNvbG9yLm5hbWVGb3JSZW5kZXJUcmVlQXNUZXh0KCk7Cit9CisKK1Rl
eHRTdHJlYW0mIG9wZXJhdG9yPDwoVGV4dFN0cmVhbSYgdHMsIENvbG9yU3BhY2UgY29sb3JTcGFj
ZSkKK3sKKyAgICBzd2l0Y2ggKGNvbG9yU3BhY2UpIHsKKyAgICBjYXNlIENvbG9yU3BhY2U6OlNS
R0I6CisgICAgICAgIHRzIDw8ICJzUkdCIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb2xv
clNwYWNlOjpMaW5lYXJSR0I6CisgICAgICAgIHRzIDw8ICJMaW5lYXJSR0IiOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIENvbG9yU3BhY2U6OkRpc3BsYXlQMzoKKyAgICAgICAgdHMgPDwgIkRp
c3BsYXlQMyI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdHM7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKClByb3BlcnR5IGNoYW5nZXMgb246IFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yQmxlbmRpbmcuY3BwCl9fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2
bjplb2wtc3R5bGUKIyMgLTAsMCArMSAjIworbmF0aXZlClwgTm8gbmV3bGluZSBhdCBlbmQgb2Yg
cHJvcGVydHkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yQmxl
bmRpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0NvbG9yQmxlbmRpbmcuY3BwCShyZXZpc2lvbiAyNjM2MTkpCisrKyBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9Db2xvckJsZW5kaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1
ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNCwxNTQg
KzI0LDM0IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkNvbG9yLmgi
CisjaW5jbHVkZSAiQ29sb3JCbGVuZGluZy5oIgogCiAjaW5jbHVkZSAiQW5pbWF0aW9uVXRpbGl0
aWVzLmgiCi0jaW5jbHVkZSAiQ29sb3JVdGlsaXRpZXMuaCIKLSNpbmNsdWRlIDx3dGYvQXNzZXJ0
aW9ucy5oPgotI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQv
U3RyaW5nQnVpbGRlci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KKyNpbmNs
dWRlICJDb2xvci5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXN0YXRpYyBjb25zdGV4cHIg
U2ltcGxlQ29sb3IgbGlnaHRlbmVkQmxhY2sgeyAweEZGNTQ1NDU0IH07Ci1zdGF0aWMgY29uc3Rl
eHByIFNpbXBsZUNvbG9yIGRhcmtlbmVkV2hpdGUgeyAweEZGQUJBQkFCIH07Ci0KLUNvbG9yOjpD
b2xvcihjb25zdCBDb2xvciYgb3RoZXIpCi0gICAgOiBtX2NvbG9yRGF0YShvdGhlci5tX2NvbG9y
RGF0YSkKLXsKLSAgICBpZiAoaXNFeHRlbmRlZCgpKQotICAgICAgICBtX2NvbG9yRGF0YS5leHRl
bmRlZENvbG9yLT5yZWYoKTsKLX0KLQotQ29sb3I6OkNvbG9yKENvbG9yJiYgb3RoZXIpCi17Ci0g
ICAgKnRoaXMgPSBXVEZNb3ZlKG90aGVyKTsKLX0KLQotQ29sb3ImIENvbG9yOjpvcGVyYXRvcj0o
Y29uc3QgQ29sb3ImIG90aGVyKQotewotICAgIGlmICgqdGhpcyA9PSBvdGhlcikKLSAgICAgICAg
cmV0dXJuICp0aGlzOwotCi0gICAgaWYgKGlzRXh0ZW5kZWQoKSkKLSAgICAgICAgbV9jb2xvckRh
dGEuZXh0ZW5kZWRDb2xvci0+ZGVyZWYoKTsKLQotICAgIG1fY29sb3JEYXRhID0gb3RoZXIubV9j
b2xvckRhdGE7Ci0KLSAgICBpZiAoaXNFeHRlbmRlZCgpKQotICAgICAgICBtX2NvbG9yRGF0YS5l
eHRlbmRlZENvbG9yLT5yZWYoKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLUNvbG9yJiBDb2xv
cjo6b3BlcmF0b3I9KENvbG9yJiYgb3RoZXIpCi17Ci0gICAgaWYgKCp0aGlzID09IG90aGVyKQot
ICAgICAgICByZXR1cm4gKnRoaXM7Ci0KLSAgICBpZiAoaXNFeHRlbmRlZCgpKQotICAgICAgICBt
X2NvbG9yRGF0YS5leHRlbmRlZENvbG9yLT5kZXJlZigpOwotCi0gICAgbV9jb2xvckRhdGEgPSBv
dGhlci5tX2NvbG9yRGF0YTsKLSAgICBvdGhlci5tX2NvbG9yRGF0YS5zaW1wbGVDb2xvckFuZEZs
YWdzID0gaW52YWxpZFNpbXBsZUNvbG9yOwotCi0gICAgcmV0dXJuICp0aGlzOwotfQotCi1TdHJp
bmcgQ29sb3I6OnNlcmlhbGl6ZWQoKSBjb25zdAorQ29sb3IgYmxlbmRTb3VyY2VPdmVyKGNvbnN0
IENvbG9yJiBiYWNrZHJvcCwgY29uc3QgQ29sb3ImIHNvdXJjZSkKIHsKLSAgICBpZiAoaXNFeHRl
bmRlZCgpKQotICAgICAgICByZXR1cm4gYXNFeHRlbmRlZCgpLmNzc1RleHQoKTsKLSAgICByZXR1
cm4gYXNTaW1wbGUoKS5zZXJpYWxpemF0aW9uRm9ySFRNTCgpOwotfQotCi1TdHJpbmcgQ29sb3I6
OmNzc1RleHQoKSBjb25zdAotewotICAgIGlmIChpc0V4dGVuZGVkKCkpCi0gICAgICAgIHJldHVy
biBhc0V4dGVuZGVkKCkuY3NzVGV4dCgpOwotICAgIHJldHVybiBhc1NpbXBsZSgpLnNlcmlhbGl6
YXRpb25Gb3JDU1MoKTsKLX0KLQotU3RyaW5nIENvbG9yOjpuYW1lRm9yUmVuZGVyVHJlZUFzVGV4
dCgpIGNvbnN0Ci17Ci0gICAgaWYgKGlzRXh0ZW5kZWQoKSkKLSAgICAgICAgcmV0dXJuIGFzRXh0
ZW5kZWQoKS5jc3NUZXh0KCk7Ci0gICAgcmV0dXJuIGFzU2ltcGxlKCkuc2VyaWFsaXphdGlvbkZv
clJlbmRlclRyZWVBc1RleHQoKTsKLX0KLQotQ29sb3IgQ29sb3I6OmxpZ2h0ZW5lZCgpIGNvbnN0
Ci17Ci0gICAgLy8gSGFyZGNvZGUgdGhpcyBjb21tb24gY2FzZSBmb3Igc3BlZWQuCi0gICAgaWYg
KGlzU2ltcGxlKCkgJiYgYXNTaW1wbGUoKSA9PSBibGFjaykKLSAgICAgICAgcmV0dXJuIGxpZ2h0
ZW5lZEJsYWNrOwotCi0gICAgYXV0byBbciwgZywgYiwgYV0gPSB0b1NSR0JBTG9zc3koKTsKLSAg
ICBmbG9hdCB2ID0gc3RkOjptYXgoeyByLCBnLCBiIH0pOwotCi0gICAgaWYgKHYgPT0gMC4wZikK
LSAgICAgICAgcmV0dXJuIGxpZ2h0ZW5lZEJsYWNrLmNvbG9yV2l0aEFscGhhKGFscGhhKCkpOwot
Ci0gICAgZmxvYXQgbXVsdGlwbGllciA9IHN0ZDo6bWluKDEuMGYsIHYgKyAwLjMzZikgLyB2Owot
Ci0gICAgcmV0dXJuIG1ha2VTaW1wbGVDb2xvckZyb21GbG9hdHMobXVsdGlwbGllciAqIHIsIG11
bHRpcGxpZXIgKiBnLCBtdWx0aXBsaWVyICogYiwgYSk7Ci19Ci0KLUNvbG9yIENvbG9yOjpkYXJr
ZW5lZCgpIGNvbnN0Ci17Ci0gICAgLy8gSGFyZGNvZGUgdGhpcyBjb21tb24gY2FzZSBmb3Igc3Bl
ZWQuCi0gICAgaWYgKGlzU2ltcGxlKCkgJiYgYXNTaW1wbGUoKSA9PSB3aGl0ZSkKLSAgICAgICAg
cmV0dXJuIGRhcmtlbmVkV2hpdGU7Ci0gICAgCi0gICAgYXV0byBbciwgZywgYiwgYV0gPSB0b1NS
R0JBTG9zc3koKTsKLQotICAgIGZsb2F0IHYgPSBzdGQ6Om1heCh7IHIsIGcsIGIgfSk7Ci0gICAg
ZmxvYXQgbXVsdGlwbGllciA9IHN0ZDo6bWF4KDAuMGYsICh2IC0gMC4zM2YpIC8gdik7Ci0KLSAg
ICByZXR1cm4gbWFrZVNpbXBsZUNvbG9yRnJvbUZsb2F0cyhtdWx0aXBsaWVyICogciwgbXVsdGlw
bGllciAqIGcsIG11bHRpcGxpZXIgKiBiLCBhKTsKLX0KLQotYm9vbCBDb2xvcjo6aXNEYXJrKCkg
Y29uc3QKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgdXNpbmcgbHVt
aW5hbmNlLgotICAgIGF1dG8gW3IsIGcsIGIsIGFdID0gdG9TUkdCQUxvc3N5KCk7Ci0gICAgZmxv
YXQgbGFyZ2VzdE5vbkFscGhhQ2hhbm5lbCA9IHN0ZDo6bWF4KHsgciwgZywgYiB9KTsKLSAgICBy
ZXR1cm4gYSA+IDAuNSAmJiBsYXJnZXN0Tm9uQWxwaGFDaGFubmVsIDwgMC41OwotfQotCi1mbG9h
dCBDb2xvcjo6bGlnaHRuZXNzKCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBjYW4gcHJv
YmFibHkgYXZvaWQgY29udmVyc2lvbiB0byBzUkdCIGJ5IGhhdmluZyBwZXItY29sb3JzcGFjZSBh
bGdvcml0aG1zIGZvciBIU0wuCi0gICAgcmV0dXJuIFdlYkNvcmU6OmxpZ2h0bmVzcyh0b1NSR0JB
TG9zc3koKSk7Ci19Ci0KLWZsb2F0IENvbG9yOjpsdW1pbmFuY2UoKSBjb25zdAotewotICAgIC8v
IEZJWE1FOiBUaGlzIGNhbiBwcm9iYWJseSBhdm9pZCBjb252ZXJzaW9uIHRvIHNSR0IgYnkgaGF2
aW5nIHBlci1jb2xvcnNwYWNlIGFsZ29yaXRobXMgZm9yIGx1bWluYW5jZSAoZS5nLiBjb252ZXJ0
VG9YWVooYykueUNvbXBvbmVudCgpKS4KLSAgICByZXR1cm4gV2ViQ29yZTo6bHVtaW5hbmNlKHRv
U1JHQkFMb3NzeSgpKTsKLX0KLQotQ29sb3IgQ29sb3I6OmJsZW5kKGNvbnN0IENvbG9yJiBzb3Vy
Y2UpIGNvbnN0Ci17Ci0gICAgaWYgKCFpc1Zpc2libGUoKSB8fCBzb3VyY2UuaXNPcGFxdWUoKSkK
KyAgICBpZiAoIWJhY2tkcm9wLmlzVmlzaWJsZSgpIHx8IHNvdXJjZS5pc09wYXF1ZSgpKQogICAg
ICAgICByZXR1cm4gc291cmNlOwogCiAgICAgaWYgKCFzb3VyY2UuYWxwaGEoKSkKLSAgICAgICAg
cmV0dXJuICp0aGlzOworICAgICAgICByZXR1cm4gYmFja2Ryb3A7CiAKLSAgICBhdXRvIFtzZWxm
Uiwgc2VsZkcsIHNlbGZCLCBzZWxmQV0gPSB0b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpOworICAg
IGF1dG8gW2JhY2tkcm9wUiwgYmFja2Ryb3BHLCBiYWNrZHJvcEIsIGJhY2tkcm9wQV0gPSBiYWNr
ZHJvcC50b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpOwogICAgIGF1dG8gW3NvdXJjZVIsIHNvdXJj
ZUcsIHNvdXJjZUIsIHNvdXJjZUFdID0gc291cmNlLnRvU1JHQkFTaW1wbGVDb2xvckxvc3N5KCk7
CiAKLSAgICBpbnQgZCA9IDB4RkYgKiAoc2VsZkEgKyBzb3VyY2VBKSAtIHNlbGZBICogc291cmNl
QTsKKyAgICBpbnQgZCA9IDB4RkYgKiAoYmFja2Ryb3BBICsgc291cmNlQSkgLSBiYWNrZHJvcEEg
KiBzb3VyY2VBOwogICAgIGludCBhID0gZCAvIDB4RkY7Ci0gICAgaW50IHIgPSAoc2VsZlIgKiBz
ZWxmQSAqICgweEZGIC0gc291cmNlQSkgKyAweEZGICogc291cmNlQSAqIHNvdXJjZVIpIC8gZDsK
LSAgICBpbnQgZyA9IChzZWxmRyAqIHNlbGZBICogKDB4RkYgLSBzb3VyY2VBKSArIDB4RkYgKiBz
b3VyY2VBICogc291cmNlRykgLyBkOwotICAgIGludCBiID0gKHNlbGZCICogc2VsZkEgKiAoMHhG
RiAtIHNvdXJjZUEpICsgMHhGRiAqIHNvdXJjZUEgKiBzb3VyY2VCKSAvIGQ7CisgICAgaW50IHIg
PSAoYmFja2Ryb3BSICogYmFja2Ryb3BBICogKDB4RkYgLSBzb3VyY2VBKSArIDB4RkYgKiBzb3Vy
Y2VBICogc291cmNlUikgLyBkOworICAgIGludCBnID0gKGJhY2tkcm9wRyAqIGJhY2tkcm9wQSAq
ICgweEZGIC0gc291cmNlQSkgKyAweEZGICogc291cmNlQSAqIHNvdXJjZUcpIC8gZDsKKyAgICBp
bnQgYiA9IChiYWNrZHJvcEIgKiBiYWNrZHJvcEEgKiAoMHhGRiAtIHNvdXJjZUEpICsgMHhGRiAq
IHNvdXJjZUEgKiBzb3VyY2VCKSAvIGQ7CiAKICAgICByZXR1cm4gbWFrZVNpbXBsZUNvbG9yKHIs
IGcsIGIsIGEpOwogfQogCi1Db2xvciBDb2xvcjo6YmxlbmRXaXRoV2hpdGUoKSBjb25zdAorQ29s
b3IgYmxlbmRXaXRoV2hpdGUoY29uc3QgQ29sb3ImIGNvbG9yKQogewogICAgIGNvbnN0ZXhwciBp
bnQgc3RhcnRBbHBoYSA9IDE1MzsgLy8gNjAlCiAgICAgY29uc3RleHByIGludCBlbmRBbHBoYSA9
IDIwNDsgLy8gODAlOwpAQCAtMTg1LDEyICs2NSwxMiBAQCBDb2xvciBDb2xvcjo6YmxlbmRXaXRo
V2hpdGUoKSBjb25zdAogICAgIH07CiAKICAgICAvLyBJZiB0aGUgY29sb3IgY29udGFpbnMgYWxw
aGEgYWxyZWFkeSwgd2UgbGVhdmUgaXQgYWxvbmUuCi0gICAgaWYgKCFpc09wYXF1ZSgpKQotICAg
ICAgICByZXR1cm4gKnRoaXM7CisgICAgaWYgKCFjb2xvci5pc09wYXF1ZSgpKQorICAgICAgICBy
ZXR1cm4gY29sb3I7CiAKLSAgICBhdXRvIFtleGlzdGluZ1IsIGV4aXN0aW5nRywgZXhpc3RpbmdC
LCBleGlzdGluZ0FscGhhXSA9IHRvU1JHQkFTaW1wbGVDb2xvckxvc3N5KCk7CisgICAgYXV0byBb
ZXhpc3RpbmdSLCBleGlzdGluZ0csIGV4aXN0aW5nQiwgZXhpc3RpbmdBbHBoYV0gPSBjb2xvci50
b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpOwogCi0gICAgQ29sb3IgcmVzdWx0OworICAgIFNpbXBs
ZUNvbG9yIHJlc3VsdDsKICAgICBmb3IgKGludCBhbHBoYSA9IHN0YXJ0QWxwaGE7IGFscGhhIDw9
IGVuZEFscGhhOyBhbHBoYSArPSBhbHBoYUluY3JlbWVudCkgewogICAgICAgICAvLyBXZSBoYXZl
IGEgc29saWQgY29sb3IuICBDb252ZXJ0IHRvIGFuIGVxdWl2YWxlbnQgY29sb3IgdGhhdCBsb29r
cyB0aGUgc2FtZSB3aGVuIGJsZW5kZWQgd2l0aCB3aGl0ZQogICAgICAgICAvLyBhdCB0aGUgY3Vy
cmVudCBhbHBoYS4gIFRyeSB1c2luZyBsZXNzIHRyYW5zcGFyZW5jeSBpZiB0aGUgbnVtYmVycyBl
bmQgdXAgYmVpbmcgbmVnYXRpdmUuCkBAIC0yMDUsNjAgKzg1LDExIEBAIENvbG9yIENvbG9yOjpi
bGVuZFdpdGhXaGl0ZSgpIGNvbnN0CiAgICAgfQogCiAgICAgLy8gRklYTUU6IFdoeSBpcyBwcmVz
ZXJ2aW5nIHRoZSBzZW1hbnRpYyBiaXQgZGVzaXJlZCBhbmQvb3IgY29ycmVjdCBoZXJlPwotICAg
IGlmIChpc1NlbWFudGljKCkpCi0gICAgICAgIHJlc3VsdC50YWdBc1NlbWFudGljKCk7CisgICAg
aWYgKGNvbG9yLmlzU2VtYW50aWMoKSkKKyAgICAgICAgcmV0dXJuIENvbG9yKHJlc3VsdCwgQ29s
b3I6OlNlbWFudGljKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1Db2xvciBDb2xvcjo6Y29s
b3JXaXRoQWxwaGEoZmxvYXQgYWxwaGEpIGNvbnN0Ci17Ci0gICAgaWYgKGlzRXh0ZW5kZWQoKSkK
LSAgICAgICAgcmV0dXJuIGFzRXh0ZW5kZWQoKS5jb2xvcldpdGhBbHBoYShhbHBoYSk7Ci0KLSAg
ICBDb2xvciByZXN1bHQgPSBhc1NpbXBsZSgpLmNvbG9yV2l0aEFscGhhKGNvbnZlcnRUb0NvbXBv
bmVudEJ5dGUoYWxwaGEpKTsKLQotICAgIC8vIEZJWE1FOiBXaHkgaXMgcHJlc2VydmluZyB0aGUg
c2VtYW50aWMgYml0IGRlc2lyZWQgYW5kL29yIGNvcnJlY3QgaGVyZT8KLSAgICBpZiAoaXNTZW1h
bnRpYygpKQotICAgICAgICByZXN1bHQudGFnQXNTZW1hbnRpYygpOwotICAgIHJldHVybiByZXN1
bHQ7Ci19Ci0KLUNvbG9yIENvbG9yOjppbnZlcnRlZENvbG9yV2l0aEFscGhhKGZsb2F0IGFscGhh
KSBjb25zdAotewotICAgIGlmIChpc0V4dGVuZGVkKCkpCi0gICAgICAgIHJldHVybiBhc0V4dGVu
ZGVkKCkuaW52ZXJ0ZWRDb2xvcldpdGhBbHBoYShhbHBoYSk7Ci0gICAgcmV0dXJuIGFzU2ltcGxl
KCkuaW52ZXJ0ZWRDb2xvcldpdGhBbHBoYShjb252ZXJ0VG9Db21wb25lbnRCeXRlKGFscGhhKSk7
Ci19Ci0KLUNvbG9yIENvbG9yOjpzZW1hbnRpY0NvbG9yKCkgY29uc3QKLXsKLSAgICBpZiAoaXNT
ZW1hbnRpYygpKQotICAgICAgICByZXR1cm4gKnRoaXM7Ci0KLSAgICByZXR1cm4geyB0b1NSR0JB
U2ltcGxlQ29sb3JMb3NzeSgpLCBTZW1hbnRpYyB9OwotfQotCi1zdGQ6OnBhaXI8Q29sb3JTcGFj
ZSwgQ29sb3JDb21wb25lbnRzPGZsb2F0Pj4gQ29sb3I6OmNvbG9yU3BhY2VBbmRDb21wb25lbnRz
KCkgY29uc3QKLXsKLSAgICBpZiAoaXNFeHRlbmRlZCgpKQotICAgICAgICByZXR1cm4geyBhc0V4
dGVuZGVkKCkuY29sb3JTcGFjZSgpLCBhc0V4dGVuZGVkKCkuY29tcG9uZW50cygpIH07Ci0gICAg
cmV0dXJuIHsgQ29sb3JTcGFjZTo6U1JHQiwgYXNDb2xvckNvbXBvbmVudHMoYXNTaW1wbGUoKS5h
c1NSR0JBPGZsb2F0PigpKSB9OwotfQotCi1TaW1wbGVDb2xvciBDb2xvcjo6dG9TUkdCQVNpbXBs
ZUNvbG9yTG9zc3koKSBjb25zdAotewotICAgIGlmIChpc0V4dGVuZGVkKCkpCi0gICAgICAgIHJl
dHVybiBtYWtlU2ltcGxlQ29sb3IoYXNFeHRlbmRlZCgpLnRvU1JHQkFMb3NzeSgpKTsKLSAgICBy
ZXR1cm4gYXNTaW1wbGUoKTsKLX0KLQotU1JHQkE8ZmxvYXQ+IENvbG9yOjp0b1NSR0JBTG9zc3ko
KSBjb25zdAotewotICAgIGlmIChpc0V4dGVuZGVkKCkpCi0gICAgICAgIHJldHVybiBhc0V4dGVu
ZGVkKCkudG9TUkdCQUxvc3N5KCk7Ci0gICAgcmV0dXJuIGFzU2ltcGxlKCkuYXNTUkdCQTxmbG9h
dD4oKTsKLX0KLQogQ29sb3IgYmxlbmQoY29uc3QgQ29sb3ImIGZyb20sIGNvbnN0IENvbG9yJiB0
bywgZG91YmxlIHByb2dyZXNzKQogewogICAgIC8vIEZJWE1FOiBFeHRlbmRlZENvbG9yIC0gbmVl
ZHMgdG8gaGFuZGxlIGNvbG9yIHNwYWNlcy4KQEAgLTI5OCwyNSArMTI5LDQgQEAgQ29sb3IgYmxl
bmRXaXRob3V0UHJlbXVsdGlwbHkoY29uc3QgQ29sbwogICAgICk7CiB9CiAKLVRleHRTdHJlYW0m
IG9wZXJhdG9yPDwoVGV4dFN0cmVhbSYgdHMsIGNvbnN0IENvbG9yJiBjb2xvcikKLXsKLSAgICBy
ZXR1cm4gdHMgPDwgY29sb3IubmFtZUZvclJlbmRlclRyZWVBc1RleHQoKTsKLX0KLQotVGV4dFN0
cmVhbSYgb3BlcmF0b3I8PChUZXh0U3RyZWFtJiB0cywgQ29sb3JTcGFjZSBjb2xvclNwYWNlKQot
ewotICAgIHN3aXRjaCAoY29sb3JTcGFjZSkgewotICAgIGNhc2UgQ29sb3JTcGFjZTo6U1JHQjoK
LSAgICAgICAgdHMgPDwgInNSR0IiOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIENvbG9yU3Bh
Y2U6OkxpbmVhclJHQjoKLSAgICAgICAgdHMgPDwgIkxpbmVhclJHQiI7Ci0gICAgICAgIGJyZWFr
OwotICAgIGNhc2UgQ29sb3JTcGFjZTo6RGlzcGxheVAzOgotICAgICAgICB0cyA8PCAiRGlzcGxh
eVAzIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiB0czsKLX0KLQogfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Q29sb3JCbGVuZGluZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0NvbG9yQmxlbmRpbmcuaAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9Db2xvckJsZW5kaW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
KyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisg
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIENvbG9yOworCisvLyBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFBvcnRl
ci1EdWZmJ3MgInNvdXJjZS1vdmVyIiBlcXVhdGlvbgorQ29sb3IgYmxlbmRTb3VyY2VPdmVyKGNv
bnN0IENvbG9yJiwgY29uc3QgQ29sb3ImKTsKKworLy8gQmVzcG9rZSAid2hpdGVuaW5nIiBhbGdv
cml0aG0gdXNlZCBieSBSZW5kZXJUaGVtZTo6dHJhbnNmb3JtU2VsZWN0aW9uQmFja2dyb3VuZENv
bG9yLgorQ29sb3IgYmxlbmRXaXRoV2hpdGUoY29uc3QgQ29sb3ImKTsKKworQ29sb3IgYmxlbmQo
Y29uc3QgQ29sb3ImIGZyb20sIGNvbnN0IENvbG9yJiB0bywgZG91YmxlIHByb2dyZXNzKTsKK0Nv
bG9yIGJsZW5kV2l0aG91dFByZW11bHRpcGx5KGNvbnN0IENvbG9yJiBmcm9tLCBjb25zdCBDb2xv
ciYgdG8sIGRvdWJsZSBwcm9ncmVzcyk7CisKK30KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2ZpbHRlcnMvRmlsdGVyT3BlcmF0aW9uLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9maWx0ZXJzL0ZpbHRlck9wZXJhdGlvbi5j
cHAJKHJldmlzaW9uIDI2MzYxOSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2ZpbHRlcnMvRmlsdGVyT3BlcmF0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksNiArMjks
NyBAQAogI2luY2x1ZGUgIkFuaW1hdGlvblV0aWxpdGllcy5oIgogI2luY2x1ZGUgIkNhY2hlZFJl
c291cmNlTG9hZGVyLmgiCiAjaW5jbHVkZSAiQ2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2UuaCIK
KyNpbmNsdWRlICJDb2xvckJsZW5kaW5nLmgiCiAjaW5jbHVkZSAiQ29sb3JNYXRyaXguaCIKICNp
bmNsdWRlICJDb2xvclV0aWxpdGllcy5oIgogI2luY2x1ZGUgIkZpbHRlckVmZmVjdC5oIgpJbmRl
eDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveE1vZGVsT2JqZWN0LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3Qu
Y3BwCShyZXZpc2lvbiAyNjM2MTkpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
Qm94TW9kZWxPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5j
bHVkZSAiQml0bWFwSW1hZ2UuaCIKICNpbmNsdWRlICJCb3JkZXJFZGdlLmgiCiAjaW5jbHVkZSAi
Q2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJDb2xvckJsZW5kaW5nLmgiCiAjaW5jbHVkZSAiRG9j
dW1lbnQuaCIKICNpbmNsdWRlICJEb2N1bWVudFRpbWVsaW5lLmgiCiAjaW5jbHVkZSAiRmxvYXRS
b3VuZGVkUmVjdC5oIgpAQCAtOTM0LDcgKzkzNSw3IEBAIHZvaWQgUmVuZGVyQm94TW9kZWxPYmpl
Y3Q6OnBhaW50RmlsbExheWUKICAgICAgICAgICAgIEZsb2F0UmVjdCBiYWNrZ3JvdW5kUmVjdEZv
clBhaW50aW5nID0gc25hcFJlY3RUb0RldmljZVBpeGVscyhiYWNrZ3JvdW5kUmVjdCwgZGV2aWNl
U2NhbGVGYWN0b3IpOwogICAgICAgICAgICAgaWYgKGJhc2VDb2xvci5pc1Zpc2libGUoKSkgewog
ICAgICAgICAgICAgICAgIGlmICghYmFzZUJnQ29sb3JPbmx5ICYmIGJnQ29sb3IuaXNWaXNpYmxl
KCkpCi0gICAgICAgICAgICAgICAgICAgIGJhc2VDb2xvciA9IGJhc2VDb2xvci5ibGVuZChiZ0Nv
bG9yKTsKKyAgICAgICAgICAgICAgICAgICAgYmFzZUNvbG9yID0gYmxlbmRTb3VyY2VPdmVyKGJh
c2VDb2xvciwgYmdDb2xvcik7CiAgICAgICAgICAgICAgICAgY29udGV4dC5maWxsUmVjdChiYWNr
Z3JvdW5kUmVjdEZvclBhaW50aW5nLCBiYXNlQ29sb3IsIENvbXBvc2l0ZU9wZXJhdG9yOjpDb3B5
KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJhc2VCZ0NvbG9yT25seSAmJiBiZ0NvbG9yLmlz
VmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgYXV0byBvcGVyYXRpb24gPSBjb250ZXh0LmNv
bXBvc2l0ZU9wZXJhdGlvbigpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ck1lbnVMaXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyTWVudUxpc3QuY3BwCShyZXZpc2lvbiAyNjM2MTkpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyTWVudUxpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBA
CiAjaW5jbHVkZSAiQWNjZXNzaWJpbGl0eU1lbnVMaXN0LmgiCiAjaW5jbHVkZSAiQ1NTRm9udFNl
bGVjdG9yLmgiCiAjaW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ29sb3JCbGVuZGluZy5o
IgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAi
SFRNTE5hbWVzLmgiCkBAIC01MzIsMTQgKzUzMywxNCBAQCB2b2lkIFJlbmRlck1lbnVMaXN0Ojpn
ZXRJdGVtQmFja2dyb3VuZENvCiAgICAgfQogCiAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgaXRlbSdz
IGJhY2tncm91bmQgaXMgb3ZlcmxheWVkIG9uIHRvcCBvZiB0aGUgbWVudSBiYWNrZ3JvdW5kLgot
ICAgIGJhY2tncm91bmRDb2xvciA9IHN0eWxlKCkudmlzaXRlZERlcGVuZGVudENvbG9yV2l0aENv
bG9yRmlsdGVyKENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yKS5ibGVuZChiYWNrZ3JvdW5kQ29s
b3IpOworICAgIGJhY2tncm91bmRDb2xvciA9IGJsZW5kU291cmNlT3ZlcihzdHlsZSgpLnZpc2l0
ZWREZXBlbmRlbnRDb2xvcldpdGhDb2xvckZpbHRlcihDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xv
ciksIGJhY2tncm91bmRDb2xvcik7CiAgICAgaWYgKGJhY2tncm91bmRDb2xvci5pc09wYXF1ZSgp
KSB7CiAgICAgICAgIGl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7CiAgICAg
ICAgIHJldHVybjsKICAgICB9CiAKICAgICAvLyBJZiB0aGUgbWVudSBiYWNrZ3JvdW5kIGlzIG5v
dCBvcGFxdWUsIHRoZW4gYWRkIGFuIG9wYXF1ZSB3aGl0ZSBiYWNrZ3JvdW5kIGJlaGluZC4KLSAg
ICBpdGVtQmFja2dyb3VuZENvbG9yID0gQ29sb3IoQ29sb3I6OndoaXRlKS5ibGVuZChiYWNrZ3Jv
dW5kQ29sb3IpOworICAgIGl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBibGVuZFNvdXJjZU92ZXIoQ29s
b3I6OndoaXRlLCBiYWNrZ3JvdW5kQ29sb3IpOwogfQogCiBQb3B1cE1lbnVTdHlsZSBSZW5kZXJN
ZW51TGlzdDo6bWVudVN0eWxlKCkgY29uc3QKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJUaGVtZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclRoZW1lLmNwcAkocmV2aXNpb24gMjYzNjE5KQorKysgU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlclRoZW1lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNiArMjIsNyBAQAog
I2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCiAKICNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgi
CisjaW5jbHVkZSAiQ29sb3JCbGVuZGluZy5oIgogI2luY2x1ZGUgIkNvbnRyb2xTdGF0ZXMuaCIK
ICNpbmNsdWRlICJEb2N1bWVudC5oIgogI2luY2x1ZGUgIkZpbGVMaXN0LmgiCkBAIC02MTYsNyAr
NjE3LDcgQEAgQ29sb3IgUmVuZGVyVGhlbWU6OmluYWN0aXZlU2VsZWN0aW9uQmFjawogCiBDb2xv
ciBSZW5kZXJUaGVtZTo6dHJhbnNmb3JtU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKGNvbnN0IENv
bG9yJiBjb2xvciwgT3B0aW9uU2V0PFN0eWxlQ29sb3I6Ok9wdGlvbnM+KSBjb25zdAogewotICAg
IHJldHVybiBjb2xvci5ibGVuZFdpdGhXaGl0ZSgpOworICAgIHJldHVybiBibGVuZFdpdGhXaGl0
ZShjb2xvcik7CiB9CiAKIENvbG9yIFJlbmRlclRoZW1lOjphY3RpdmVTZWxlY3Rpb25Gb3JlZ3Jv
dW5kQ29sb3IoT3B0aW9uU2V0PFN0eWxlQ29sb3I6Ok9wdGlvbnM+IG9wdGlvbnMpIGNvbnN0Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>403152</attachid>
            <date>2020-06-29 18:25:08 -0700</date>
            <delta_ts>2020-06-30 11:29:42 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-213742-20200629182507.patch</filename>
            <type>text/plain</type>
            <size>37990</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI2MzcxMikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ2IEBACisyMDIwLTA2LTI5ICBTYW0gV2Vp
bmlnICA8d2VpbmlnQGFwcGxlLmNvbT4KKworICAgICAgICBNb3ZlIENvbG9yIGJsZW5kaW5nIHJl
bGF0ZWQgZnVuY3Rpb25zIHRvIHRoZWlyIG93biBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjEzNzQyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
RGVhbiBKYWNrc29uLgorCisgICAgICAgIC0gTW92ZXMgQ29sb3I6OmJsZW5kKGNvbnN0IENvbG9y
JiksIENvbG9yOjpibGVuZFdpdGhXaGl0ZSgpLCBibGVuZChjb25zdCBDb2xvciYsIGNvbnN0IENv
bG9yJiwgZG91YmxlKQorICAgICAgICAgIGFuZCBibGVuZFdpdGhvdXRQcmVtdWx0aXBseShjb25z
dCBDb2xvciYsIGNvbnN0IENvbG9yJiwgZG91YmxlKSB0byB0aGVpciBvd24gZmlsZXM6IENvbG9y
QmxlbmRpbmcuaC9jcHAKKyAgICAgICAgLSBSZW5hbWVzIENvbG9yOjpibGVuZChjb25zdCBDb2xv
ciYpIHRvIGJsZW5kU291cmNlT3Zlcihjb25zdCBDb2xvciYsIGNvbnN0IENvbG9yJikgCisgICAg
ICAgIC0gUmVuYW1lcyBDb2xvcjo6YmxlbmRXaXRoV2hpdGUoKSB0byBibGVuZFdpdGhXaGl0ZShj
b25zdCBDb2xvciYpLgorCisgICAgICAgICogU291cmNlcy50eHQ6CisgICAgICAgICogV2ViQ29y
ZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICBBZGQgbmV3IGZpbGVzLgorCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
Q29sb3I6OmJsZW5kIGNvbnN0KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbG9yOjpi
bGVuZFdpdGhXaGl0ZSBjb25zdCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpibGVuZCk6
IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpibGVuZFdpdGhvdXRQcmVtdWx0aXBseSk6IERl
bGV0ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9Db2xvckJsZW5kaW5nLmNwcDogQ29waWVkIGZyb20gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuY3BwLgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL0NvbG9yQmxlbmRpbmcuaDogQWRkZWQuCisgICAgICAgIE1vdmUgZGVjbGFyYXRpb25z
IC8gaW1wbGVtZW50YXRpb25zIGZyb20gQ29sb3IuaC9jcHAgdG8gQ29sb3JCbGVuZGluZy5oL2Nw
cC4KKworICAgICAgICAqIGNzcy9DU1NHcmFkaWVudFZhbHVlLmNwcDoKKyAgICAgICAgKiBlZGl0
aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNhcmV0QmFzZTo6Y29t
cHV0ZUNhcmV0Q29sb3IpOgorICAgICAgICAqIHBhZ2UvRnJhbWVWaWV3LmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkZyYW1lVmlldzo6ZG9jdW1lbnRCYWNrZ3JvdW5kQ29sb3IgY29uc3QpOgorICAg
ICAgICAqIHBhZ2UvVGV4dEluZGljYXRvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjplc3RpbWF0
ZWRCYWNrZ3JvdW5kQ29sb3JGb3JSYW5nZSk6CisgICAgICAgICogcGFnZS9hbmltYXRpb24vQ1NT
UHJvcGVydHlBbmltYXRpb24uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2ZpbHRl
cnMvRmlsdGVyT3BlcmF0aW9uLmNwcDoKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQm94TW9k
ZWxPYmplY3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQm94TW9kZWxPYmplY3Q6OnBh
aW50RmlsbExheWVyRXh0ZW5kZWQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJNZW51TGlz
dC5jcHA6CisgICAgICAgIChSZW5kZXJNZW51TGlzdDo6Z2V0SXRlbUJhY2tncm91bmRDb2xvciBj
b25zdCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lOjp0cmFuc2Zvcm1TZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IgY29u
c3QpOgorICAgICAgICBVcGRhdGUgZm9yIG5ldyBzaWduYXR1cmVzIGFuZCAjaW5jbHVkZSBDb2xv
ckJsZW5kaW5nLmggYXMgbmVlZWRlZC4KKwogMjAyMC0wNi0yOSAgUGVuZyBMaXUgIDxwZW5nLmxp
dTZAYXBwbGUuY29tPgogCiAgICAgICAgIFZpZGVvIHNwaWxscyBvdmVyIFBpUCBzY3JlZW4gYSBs
aXR0bGUgd2hlbiB1c2luZyBQaWN0dXJlIGluIFBpY3R1cmUKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L1NvdXJjZXMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0CShy
ZXZpc2lvbiAyNjM3MTIpCisrKyBTb3VyY2UvV2ViQ29yZS9Tb3VyY2VzLnR4dAkod29ya2luZyBj
b3B5KQpAQCAtMTkwNyw2ICsxOTA3LDcgQEAgcGxhdGZvcm0vZW5jcnlwdGVkbWVkaWEvQ0RNUHJv
eHkuY3BwCiBwbGF0Zm9ybS9ncmFwaGljcy9BTkdMRVdlYktpdEJyaWRnZS5jcHAKIHBsYXRmb3Jt
L2dyYXBoaWNzL0JpdG1hcEltYWdlLmNwcAogcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuY3BwCitw
bGF0Zm9ybS9ncmFwaGljcy9Db2xvckJsZW5kaW5nLmNwcAogcGxhdGZvcm0vZ3JhcGhpY3MvQ29s
b3JVdGlsaXRpZXMuY3BwCiBwbGF0Zm9ybS9ncmFwaGljcy9Db21wbGV4VGV4dENvbnRyb2xsZXIu
Y3BwCiBwbGF0Zm9ybS9ncmFwaGljcy9Dcm9zc2ZhZGVHZW5lcmF0ZWRJbWFnZS5jcHAKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJ
KHJldmlzaW9uIDI2MzcxMikKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtOTk2Myw2ICs5OTYzLDggQEAKIAkJN0Mx
OTNCRkMxRjVFMTBDNTAwODhGM0U2IC8qIEpTSW1hZ2VTbW9vdGhpbmdRdWFsaXR5LmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IEpTSW1hZ2VTbW9vdGhpbmdRdWFsaXR5Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCTdDMTkzQkZEMUY1RTEwRDYwMDg4RjNFNiAvKiBKU1BhdGgyRC5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBKU1BhdGgyRC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CTdDMTkzQkZFMUY1RTEwRDcwMDg4RjNFNiAvKiBKU1BhdGgyRC5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBK
U1BhdGgyRC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk3QzFCNEE2NTI0QTk5NzU5
MDAzMzcyN0YgLyogQ29sb3JCbGVuZGluZy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDb2xvckJs
ZW5kaW5nLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJN0MxQjRBNjcyNEE5OTc2
NjAwMzM3MjdGIC8qIENvbG9yQmxlbmRpbmcuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ29sb3JCbGVuZGlu
Zy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3QzFFOENGRjFFRDBDMkJFMDBCMUQ5
ODMgLyogQmVmb3JlVW5sb2FkRXZlbnQuaWRsICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IEJlZm9y
ZVVubG9hZEV2ZW50LmlkbDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJN0MxRThEMDAx
RUQwQzJCRTAwQjFEOTgzIC8qIENhbGxiYWNrUmVzdWx0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IENhbGxiYWNrUmVzdWx0Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCTdDMUU5NzI1MUE5Rjk4MzQwMDdCRjBGQiAvKiBBdXRvRmlsbEJ1dHRvbkVsZW1lbnQuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQXV0b0ZpbGxCdXR0b25FbGVt
ZW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTI1NDkzLDYgKzI1NDk1LDgg
QEAKIAkJCQlBODk5NDMyNjBCNDIzMzg3MDBEN0M4MDIgLyogQml0bWFwSW1hZ2UuaCAqLywKIAkJ
CQlCMjc1MzUzODBCMDUzODE0MDAyQ0U2NEYgLyogQ29sb3IuY3BwICovLAogCQkJCUIyNzUzNTM5
MEIwNTM4MTQwMDJDRTY0RiAvKiBDb2xvci5oICovLAorCQkJCTdDMUI0QTY1MjRBOTk3NTkwMDMz
NzI3RiAvKiBDb2xvckJsZW5kaW5nLmNwcCAqLywKKwkJCQk3QzFCNEE2NzI0QTk5NzY2MDAzMzcy
N0YgLyogQ29sb3JCbGVuZGluZy5oICovLAogCQkJCTdDQUM2QUVDMjQ3RjFDNTEwMEU2MUQ1OSAv
KiBDb2xvckNvbXBvbmVudHMuaCAqLywKIAkJCQkzMTAzQjdERTFEQjAxNTU2MDA4QkI4OTAgLyog
Q29sb3JIYXNoLmggKi8sCiAJCQkJN0NBQzZBRTgyNDdGMDgyMDAwRTYxRDU5IC8qIENvbG9yTWF0
cml4LmggKi8sCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTR3JhZGllbnRWYWx1ZS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU0dyYWRpZW50VmFsdWUuY3BwCShy
ZXZpc2lvbiAyNjM3MTIpCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTR3JhZGllbnRWYWx1ZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJDU1NDYWxjdWxh
dGlvblZhbHVlLmgiCiAjaW5jbHVkZSAiQ1NTVG9MZW5ndGhDb252ZXJzaW9uRGF0YS5oIgogI2lu
Y2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRlICJDb2xvckJsZW5kaW5nLmgiCiAj
aW5jbHVkZSAiRmxvYXRTaXplLmgiCiAjaW5jbHVkZSAiR3JhZGllbnQuaCIKICNpbmNsdWRlICJH
cmFkaWVudEltYWdlLmgiCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0
aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0
aW9uLmNwcAkocmV2aXNpb24gMjYzNzEyKQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFt
ZVNlbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1
ZGUgIkFYT2JqZWN0Q2FjaGUuaCIKICNpbmNsdWRlICJDaGFyYWN0ZXJEYXRhLmgiCisjaW5jbHVk
ZSAiQ29sb3JCbGVuZGluZy5oIgogI2luY2x1ZGUgIkRlbGV0ZVNlbGVjdGlvbkNvbW1hbmQuaCIK
ICNpbmNsdWRlICJEb2N1bWVudC5oIgogI2luY2x1ZGUgIkVkaXRpbmcuaCIKQEAgLTE4MDAsNyAr
MTgwMSw3IEBAIENvbG9yIENhcmV0QmFzZTo6Y29tcHV0ZUNhcmV0Q29sb3IoY29uc3QKICAgICBp
ZiAoIWVsZW1lbnRTdHlsZS5jYXJldENvbG9yKCkuaXNWYWxpZCgpICYmIHJvb3RFZGl0YWJsZVN0
eWxlKSB7CiAgICAgICAgIGF1dG8gcm9vdEVkaXRhYmxlQmFja2dyb3VuZENvbG9yID0gcm9vdEVk
aXRhYmxlU3R5bGUtPnZpc2l0ZWREZXBlbmRlbnRDb2xvcldpdGhDb2xvckZpbHRlcihDU1NQcm9w
ZXJ0eUJhY2tncm91bmRDb2xvcik7CiAgICAgICAgIGF1dG8gZWxlbWVudEJhY2tncm91bmRDb2xv
ciA9IGVsZW1lbnRTdHlsZS52aXNpdGVkRGVwZW5kZW50Q29sb3JXaXRoQ29sb3JGaWx0ZXIoQ1NT
UHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICBhdXRvIGRpc2FwcGVhcnNJbnRvQmFj
a2dyb3VuZCA9IHJvb3RFZGl0YWJsZUJhY2tncm91bmRDb2xvci5ibGVuZChlbGVtZW50QmFja2dy
b3VuZENvbG9yKSA9PSByb290RWRpdGFibGVCYWNrZ3JvdW5kQ29sb3I7CisgICAgICAgIGF1dG8g
ZGlzYXBwZWFyc0ludG9CYWNrZ3JvdW5kID0gYmxlbmRTb3VyY2VPdmVyKHJvb3RFZGl0YWJsZUJh
Y2tncm91bmRDb2xvciwgZWxlbWVudEJhY2tncm91bmRDb2xvcikgPT0gcm9vdEVkaXRhYmxlQmFj
a2dyb3VuZENvbG9yOwogICAgICAgICBpZiAoZGlzYXBwZWFyc0ludG9CYWNrZ3JvdW5kKQogICAg
ICAgICAgICAgcmV0dXJuIHJvb3RFZGl0YWJsZVN0eWxlLT52aXNpdGVkRGVwZW5kZW50Q29sb3JX
aXRoQ29sb3JGaWx0ZXIoQ1NTUHJvcGVydHlDYXJldENvbG9yKTsKICAgICB9CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGFnZS9GcmFtZVZpZXcuY3BwCShyZXZpc2lvbiAyNjM3MTIpCisrKyBTb3VyY2UvV2ViQ29y
ZS9wYWdlL0ZyYW1lVmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDYgKzM1LDcgQEAKICNp
bmNsdWRlICJDYWNoZWRSZXNvdXJjZUxvYWRlci5oIgogI2luY2x1ZGUgIkNocm9tZS5oIgogI2lu
Y2x1ZGUgIkNocm9tZUNsaWVudC5oIgorI2luY2x1ZGUgIkNvbG9yQmxlbmRpbmcuaCIKICNpbmNs
dWRlICJET01XaW5kb3cuaCIKICNpbmNsdWRlICJEZWJ1Z1BhZ2VPdmVybGF5cy5oIgogI2luY2x1
ZGUgIkRlcHJlY2F0ZWRHbG9iYWxTZXR0aW5ncy5oIgpAQCAtNDAzNywxMSArNDAzOCwxMSBAQCBD
b2xvciBGcmFtZVZpZXc6OmRvY3VtZW50QmFja2dyb3VuZENvbG9yCiAgICAgaWYgKCFib2R5QmFj
a2dyb3VuZENvbG9yLmlzVmFsaWQoKSkgewogICAgICAgICBpZiAoIWh0bWxCYWNrZ3JvdW5kQ29s
b3IuaXNWYWxpZCgpKQogICAgICAgICAgICAgcmV0dXJuIENvbG9yKCk7Ci0gICAgICAgIHJldHVy
biBiYXNlQmFja2dyb3VuZENvbG9yKCkuYmxlbmQoaHRtbEJhY2tncm91bmRDb2xvcik7CisgICAg
ICAgIHJldHVybiBibGVuZFNvdXJjZU92ZXIoYmFzZUJhY2tncm91bmRDb2xvcigpLCBodG1sQmFj
a2dyb3VuZENvbG9yKTsKICAgICB9CiAKICAgICBpZiAoIWh0bWxCYWNrZ3JvdW5kQ29sb3IuaXNW
YWxpZCgpKQotICAgICAgICByZXR1cm4gYmFzZUJhY2tncm91bmRDb2xvcigpLmJsZW5kKGJvZHlC
YWNrZ3JvdW5kQ29sb3IpOworICAgICAgICByZXR1cm4gYmxlbmRTb3VyY2VPdmVyKGJhc2VCYWNr
Z3JvdW5kQ29sb3IoKSwgYm9keUJhY2tncm91bmRDb2xvcik7CiAKICAgICAvLyBXZSB0YWtlIHRo
ZSBhZ2dyZWdhdGUgb2YgdGhlIGJhc2UgYmFja2dyb3VuZCBjb2xvcgogICAgIC8vIHRoZSA8aHRt
bD4gYmFja2dyb3VuZCBjb2xvciwgYW5kIHRoZSA8Ym9keT4KQEAgLTQwNTAsNyArNDA1MSw3IEBA
IENvbG9yIEZyYW1lVmlldzo6ZG9jdW1lbnRCYWNrZ3JvdW5kQ29sb3IKICAgICAvLyB0ZWNobmlj
YWxseSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBiYWNrZ3JvdW5kLCBidXQgaXQKICAgICAvLyBvdGhl
cndpc2UgcG9zZXMgcHJvYmxlbXMgd2hlbiB0aGUgYWdncmVnYXRlIGlzIG5vdAogICAgIC8vIGZ1
bGx5IG9wYXF1ZS4KLSAgICByZXR1cm4gYmFzZUJhY2tncm91bmRDb2xvcigpLmJsZW5kKGh0bWxC
YWNrZ3JvdW5kQ29sb3IpLmJsZW5kKGJvZHlCYWNrZ3JvdW5kQ29sb3IpOworICAgIHJldHVybiBi
bGVuZFNvdXJjZU92ZXIoYmxlbmRTb3VyY2VPdmVyKGJhc2VCYWNrZ3JvdW5kQ29sb3IoKSwgaHRt
bEJhY2tncm91bmRDb2xvciksIGJvZHlCYWNrZ3JvdW5kQ29sb3IpOwogfQogCiBib29sIEZyYW1l
Vmlldzo6aGFzQ3VzdG9tU2Nyb2xsYmFycygpIGNvbnN0CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
YWdlL1RleHRJbmRpY2F0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2Uv
VGV4dEluZGljYXRvci5jcHAJKHJldmlzaW9uIDI2MzcxMikKKysrIFNvdXJjZS9XZWJDb3JlL3Bh
Z2UvVGV4dEluZGljYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDYgKzI2LDcgQEAKICNp
bmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJUZXh0SW5kaWNhdG9yLmgiCiAKKyNpbmNsdWRl
ICJDb2xvckJsZW5kaW5nLmgiCiAjaW5jbHVkZSAiQ29sb3JIYXNoLmgiCiAjaW5jbHVkZSAiRG9j
dW1lbnQuaCIKICNpbmNsdWRlICJFZGl0b3IuaCIKQEAgLTI0OSw3ICsyNTAsNyBAQCBzdGF0aWMg
Q29sb3IgZXN0aW1hdGVkQmFja2dyb3VuZENvbG9yRm9yCiAgICAgfQogICAgIHBhcmVudFJlbmRl
cmVyQmFja2dyb3VuZENvbG9ycy5yZXZlcnNlKCk7CiAgICAgZm9yIChjb25zdCBhdXRvJiBiYWNr
Z3JvdW5kQ29sb3IgOiBwYXJlbnRSZW5kZXJlckJhY2tncm91bmRDb2xvcnMpCi0gICAgICAgIGVz
dGltYXRlZEJhY2tncm91bmRDb2xvciA9IGVzdGltYXRlZEJhY2tncm91bmRDb2xvci5ibGVuZChi
YWNrZ3JvdW5kQ29sb3IpOworICAgICAgICBlc3RpbWF0ZWRCYWNrZ3JvdW5kQ29sb3IgPSBibGVu
ZFNvdXJjZU92ZXIoZXN0aW1hdGVkQmFja2dyb3VuZENvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpOwog
CiAgICAgcmV0dXJuIGVzdGltYXRlZEJhY2tncm91bmRDb2xvcjsKIH0KSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0NTU1Byb3BlcnR5QW5pbWF0aW9uLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9DU1NQcm9wZXJ0eUFuaW1hdGlvbi5j
cHAJKHJldmlzaW9uIDI2MzcxMikKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0NT
U1Byb3BlcnR5QW5pbWF0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDEsNiArNDEsNyBAQAog
I2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCiAjaW5jbHVkZSAiQ2FsY3VsYXRpb25WYWx1ZS5oIgog
I2luY2x1ZGUgIkNsaXBQYXRoT3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiQ29sb3JCbGVuZGluZy5o
IgogI2luY2x1ZGUgIkZsb2F0Q29udmVyc2lvbi5oIgogI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgi
CiAjaW5jbHVkZSAiRm9udFNlbGVjdGlvbkFsZ29yaXRobS5oIgpJbmRleDogU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmNwcAkocmV2aXNpb24gMjYzNzEyKQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xNTIsNjUgKzE1Miw2IEBAIGZsb2F0IENvbG9yOjpsdW1pbmFuY2UoKSBjb25zdAogICAgIHJl
dHVybiBXZWJDb3JlOjpsdW1pbmFuY2UodG9TUkdCQUxvc3N5KCkpOwogfQogCi1Db2xvciBDb2xv
cjo6YmxlbmQoY29uc3QgQ29sb3ImIHNvdXJjZSkgY29uc3QKLXsKLSAgICBpZiAoIWlzVmlzaWJs
ZSgpIHx8IHNvdXJjZS5pc09wYXF1ZSgpKQotICAgICAgICByZXR1cm4gc291cmNlOwotCi0gICAg
aWYgKCFzb3VyY2UuYWxwaGEoKSkKLSAgICAgICAgcmV0dXJuICp0aGlzOwotCi0gICAgYXV0byBb
c2VsZlIsIHNlbGZHLCBzZWxmQiwgc2VsZkFdID0gdG9TUkdCQVNpbXBsZUNvbG9yTG9zc3koKTsK
LSAgICBhdXRvIFtzb3VyY2VSLCBzb3VyY2VHLCBzb3VyY2VCLCBzb3VyY2VBXSA9IHNvdXJjZS50
b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpOwotCi0gICAgaW50IGQgPSAweEZGICogKHNlbGZBICsg
c291cmNlQSkgLSBzZWxmQSAqIHNvdXJjZUE7Ci0gICAgaW50IGEgPSBkIC8gMHhGRjsKLSAgICBp
bnQgciA9IChzZWxmUiAqIHNlbGZBICogKDB4RkYgLSBzb3VyY2VBKSArIDB4RkYgKiBzb3VyY2VB
ICogc291cmNlUikgLyBkOwotICAgIGludCBnID0gKHNlbGZHICogc2VsZkEgKiAoMHhGRiAtIHNv
dXJjZUEpICsgMHhGRiAqIHNvdXJjZUEgKiBzb3VyY2VHKSAvIGQ7Ci0gICAgaW50IGIgPSAoc2Vs
ZkIgKiBzZWxmQSAqICgweEZGIC0gc291cmNlQSkgKyAweEZGICogc291cmNlQSAqIHNvdXJjZUIp
IC8gZDsKLQotICAgIHJldHVybiBtYWtlU2ltcGxlQ29sb3IociwgZywgYiwgYSk7Ci19Ci0KLUNv
bG9yIENvbG9yOjpibGVuZFdpdGhXaGl0ZSgpIGNvbnN0Ci17Ci0gICAgY29uc3RleHByIGludCBz
dGFydEFscGhhID0gMTUzOyAvLyA2MCUKLSAgICBjb25zdGV4cHIgaW50IGVuZEFscGhhID0gMjA0
OyAvLyA4MCU7Ci0gICAgY29uc3RleHByIGludCBhbHBoYUluY3JlbWVudCA9IDE3OwotCi0gICAg
YXV0byBibGVuZENvbXBvbmVudCA9IFtdKGludCBjLCBpbnQgYSkgLT4gaW50IHsKLSAgICAgICAg
ZmxvYXQgYWxwaGEgPSBhIC8gMjU1LjBmOwotICAgICAgICBpbnQgd2hpdGVCbGVuZCA9IDI1NSAt
IGE7Ci0gICAgICAgIGMgLT0gd2hpdGVCbGVuZDsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0
PGludD4oYyAvIGFscGhhKTsKLSAgICB9OwotCi0gICAgLy8gSWYgdGhlIGNvbG9yIGNvbnRhaW5z
IGFscGhhIGFscmVhZHksIHdlIGxlYXZlIGl0IGFsb25lLgotICAgIGlmICghaXNPcGFxdWUoKSkK
LSAgICAgICAgcmV0dXJuICp0aGlzOwotCi0gICAgYXV0byBbZXhpc3RpbmdSLCBleGlzdGluZ0cs
IGV4aXN0aW5nQiwgZXhpc3RpbmdBbHBoYV0gPSB0b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpOwot
Ci0gICAgQ29sb3IgcmVzdWx0OwotICAgIGZvciAoaW50IGFscGhhID0gc3RhcnRBbHBoYTsgYWxw
aGEgPD0gZW5kQWxwaGE7IGFscGhhICs9IGFscGhhSW5jcmVtZW50KSB7Ci0gICAgICAgIC8vIFdl
IGhhdmUgYSBzb2xpZCBjb2xvci4gIENvbnZlcnQgdG8gYW4gZXF1aXZhbGVudCBjb2xvciB0aGF0
IGxvb2tzIHRoZSBzYW1lIHdoZW4gYmxlbmRlZCB3aXRoIHdoaXRlCi0gICAgICAgIC8vIGF0IHRo
ZSBjdXJyZW50IGFscGhhLiAgVHJ5IHVzaW5nIGxlc3MgdHJhbnNwYXJlbmN5IGlmIHRoZSBudW1i
ZXJzIGVuZCB1cCBiZWluZyBuZWdhdGl2ZS4KLSAgICAgICAgaW50IHIgPSBibGVuZENvbXBvbmVu
dChleGlzdGluZ1IsIGFscGhhKTsKLSAgICAgICAgaW50IGcgPSBibGVuZENvbXBvbmVudChleGlz
dGluZ0csIGFscGhhKTsKLSAgICAgICAgaW50IGIgPSBibGVuZENvbXBvbmVudChleGlzdGluZ0Is
IGFscGhhKTsKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IG1ha2VTaW1wbGVDb2xvcihyLCBn
LCBiLCBhbHBoYSk7Ci0KLSAgICAgICAgaWYgKHIgPj0gMCAmJiBnID49IDAgJiYgYiA+PSAwKQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IFdoeSBpcyBwcmVzZXJ2
aW5nIHRoZSBzZW1hbnRpYyBiaXQgZGVzaXJlZCBhbmQvb3IgY29ycmVjdCBoZXJlPwotICAgIGlm
IChpc1NlbWFudGljKCkpCi0gICAgICAgIHJlc3VsdC50YWdBc1NlbWFudGljKCk7Ci0gICAgcmV0
dXJuIHJlc3VsdDsKLX0KLQogQ29sb3IgQ29sb3I6OmNvbG9yV2l0aEFscGhhKGZsb2F0IGFscGhh
KSBjb25zdAogewogICAgIGlmIChpc0V4dGVuZGVkKCkpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9Db2xvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0NvbG9yLmgJKHJldmlzaW9uIDI2MzcxMikKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTE0NCwxMCAr
MTQ0LDYgQEAgcHVibGljOgogICAgIFdFQkNPUkVfRVhQT1JUIGJvb2wgaXNEYXJrKCkgY29uc3Q7
CiAgICAgV0VCQ09SRV9FWFBPUlQgZmxvYXQgbGlnaHRuZXNzKCkgY29uc3Q7CiAKLSAgICAvLyBU
aGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFBvcnRlci1EdWZmJ3MgInNvdXJjZS1vdmVyIiBl
cXVhdGlvbgotICAgIENvbG9yIGJsZW5kKGNvbnN0IENvbG9yJikgY29uc3Q7Ci0gICAgQ29sb3Ig
YmxlbmRXaXRoV2hpdGUoKSBjb25zdDsKLQogICAgIENvbG9yIGludmVydGVkQ29sb3JXaXRoQWxw
aGEoT3B0aW9uYWw8ZmxvYXQ+IGFscGhhKSBjb25zdDsKICAgICBDb2xvciBpbnZlcnRlZENvbG9y
V2l0aEFscGhhKGZsb2F0IGFscGhhKSBjb25zdDsKIApAQCAtMjM5LDkgKzIzNSw2IEBAIGJvb2wg
b3BlcmF0b3IhPShjb25zdCBDb2xvciYsIGNvbnN0IENvbG8KIC8vIE9uZSBvciBib3RoIG11c3Qg
YmUgZXh0ZW5kZWQgY29sb3JzLgogYm9vbCBleHRlbmRlZENvbG9yc0VxdWFsKGNvbnN0IENvbG9y
JiwgY29uc3QgQ29sb3ImKTsKIAotQ29sb3IgYmxlbmQoY29uc3QgQ29sb3ImIGZyb20sIGNvbnN0
IENvbG9yJiB0bywgZG91YmxlIHByb2dyZXNzKTsKLUNvbG9yIGJsZW5kV2l0aG91dFByZW11bHRp
cGx5KGNvbnN0IENvbG9yJiBmcm9tLCBjb25zdCBDb2xvciYgdG8sIGRvdWJsZSBwcm9ncmVzcyk7
Ci0KICNpZiBVU0UoQ0cpCiBXRUJDT1JFX0VYUE9SVCBDR0NvbG9yUmVmIGNhY2hlZENHQ29sb3Io
Y29uc3QgQ29sb3ImKTsKICNlbmRpZgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvQ29sb3JCbGVuZGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvQ29sb3JCbGVuZGluZy5jcHAJKHJldmlzaW9uIDI2MzcxMikJKGZyb20g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuY3BwOjI2MzcxMikKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yQmxlbmRpbmcuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbG9y
LmgiCisKKyNpbmNsdWRlICJBbmltYXRpb25VdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJDb2xvclV0
aWxpdGllcy5oIgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL01h
dGhFeHRyYXMuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CisjaW5jbHVk
ZSA8d3RmL3RleHQvVGV4dFN0cmVhbS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRp
YyBjb25zdGV4cHIgU2ltcGxlQ29sb3IgbGlnaHRlbmVkQmxhY2sgeyAweEZGNTQ1NDU0IH07Citz
dGF0aWMgY29uc3RleHByIFNpbXBsZUNvbG9yIGRhcmtlbmVkV2hpdGUgeyAweEZGQUJBQkFCIH07
CisKK0NvbG9yOjpDb2xvcihjb25zdCBDb2xvciYgb3RoZXIpCisgICAgOiBtX2NvbG9yRGF0YShv
dGhlci5tX2NvbG9yRGF0YSkKK3sKKyAgICBpZiAoaXNFeHRlbmRlZCgpKQorICAgICAgICBtX2Nv
bG9yRGF0YS5leHRlbmRlZENvbG9yLT5yZWYoKTsKK30KKworQ29sb3I6OkNvbG9yKENvbG9yJiYg
b3RoZXIpCit7CisgICAgKnRoaXMgPSBXVEZNb3ZlKG90aGVyKTsKK30KKworQ29sb3ImIENvbG9y
OjpvcGVyYXRvcj0oY29uc3QgQ29sb3ImIG90aGVyKQoreworICAgIGlmICgqdGhpcyA9PSBvdGhl
cikKKyAgICAgICAgcmV0dXJuICp0aGlzOworCisgICAgaWYgKGlzRXh0ZW5kZWQoKSkKKyAgICAg
ICAgbV9jb2xvckRhdGEuZXh0ZW5kZWRDb2xvci0+ZGVyZWYoKTsKKworICAgIG1fY29sb3JEYXRh
ID0gb3RoZXIubV9jb2xvckRhdGE7CisKKyAgICBpZiAoaXNFeHRlbmRlZCgpKQorICAgICAgICBt
X2NvbG9yRGF0YS5leHRlbmRlZENvbG9yLT5yZWYoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisK
K0NvbG9yJiBDb2xvcjo6b3BlcmF0b3I9KENvbG9yJiYgb3RoZXIpCit7CisgICAgaWYgKCp0aGlz
ID09IG90aGVyKQorICAgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICBpZiAoaXNFeHRlbmRlZCgp
KQorICAgICAgICBtX2NvbG9yRGF0YS5leHRlbmRlZENvbG9yLT5kZXJlZigpOworCisgICAgbV9j
b2xvckRhdGEgPSBvdGhlci5tX2NvbG9yRGF0YTsKKyAgICBvdGhlci5tX2NvbG9yRGF0YS5zaW1w
bGVDb2xvckFuZEZsYWdzID0gaW52YWxpZFNpbXBsZUNvbG9yOworCisgICAgcmV0dXJuICp0aGlz
OworfQorCitTdHJpbmcgQ29sb3I6OnNlcmlhbGl6ZWQoKSBjb25zdAoreworICAgIGlmIChpc0V4
dGVuZGVkKCkpCisgICAgICAgIHJldHVybiBhc0V4dGVuZGVkKCkuY3NzVGV4dCgpOworICAgIHJl
dHVybiBhc1NpbXBsZSgpLnNlcmlhbGl6YXRpb25Gb3JIVE1MKCk7Cit9CisKK1N0cmluZyBDb2xv
cjo6Y3NzVGV4dCgpIGNvbnN0Cit7CisgICAgaWYgKGlzRXh0ZW5kZWQoKSkKKyAgICAgICAgcmV0
dXJuIGFzRXh0ZW5kZWQoKS5jc3NUZXh0KCk7CisgICAgcmV0dXJuIGFzU2ltcGxlKCkuc2VyaWFs
aXphdGlvbkZvckNTUygpOworfQorCitTdHJpbmcgQ29sb3I6Om5hbWVGb3JSZW5kZXJUcmVlQXNU
ZXh0KCkgY29uc3QKK3sKKyAgICBpZiAoaXNFeHRlbmRlZCgpKQorICAgICAgICByZXR1cm4gYXNF
eHRlbmRlZCgpLmNzc1RleHQoKTsKKyAgICByZXR1cm4gYXNTaW1wbGUoKS5zZXJpYWxpemF0aW9u
Rm9yUmVuZGVyVHJlZUFzVGV4dCgpOworfQorCitDb2xvciBDb2xvcjo6bGlnaHRlbmVkKCkgY29u
c3QKK3sKKyAgICAvLyBIYXJkY29kZSB0aGlzIGNvbW1vbiBjYXNlIGZvciBzcGVlZC4KKyAgICBp
ZiAoaXNTaW1wbGUoKSAmJiBhc1NpbXBsZSgpID09IGJsYWNrKQorICAgICAgICByZXR1cm4gbGln
aHRlbmVkQmxhY2s7CisKKyAgICBhdXRvIFtyLCBnLCBiLCBhXSA9IHRvU1JHQkFMb3NzeSgpOwor
ICAgIGZsb2F0IHYgPSBzdGQ6Om1heCh7IHIsIGcsIGIgfSk7CisKKyAgICBpZiAodiA9PSAwLjBm
KQorICAgICAgICByZXR1cm4gbGlnaHRlbmVkQmxhY2suY29sb3JXaXRoQWxwaGEoYWxwaGEoKSk7
CisKKyAgICBmbG9hdCBtdWx0aXBsaWVyID0gc3RkOjptaW4oMS4wZiwgdiArIDAuMzNmKSAvIHY7
CisKKyAgICByZXR1cm4gbWFrZVNpbXBsZUNvbG9yKFNSR0JBIHsgbXVsdGlwbGllciAqIHIsIG11
bHRpcGxpZXIgKiBnLCBtdWx0aXBsaWVyICogYiwgYSB9KTsKK30KKworQ29sb3IgQ29sb3I6OmRh
cmtlbmVkKCkgY29uc3QKK3sKKyAgICAvLyBIYXJkY29kZSB0aGlzIGNvbW1vbiBjYXNlIGZvciBz
cGVlZC4KKyAgICBpZiAoaXNTaW1wbGUoKSAmJiBhc1NpbXBsZSgpID09IHdoaXRlKQorICAgICAg
ICByZXR1cm4gZGFya2VuZWRXaGl0ZTsKKyAgICAKKyAgICBhdXRvIFtyLCBnLCBiLCBhXSA9IHRv
U1JHQkFMb3NzeSgpOworCisgICAgZmxvYXQgdiA9IHN0ZDo6bWF4KHsgciwgZywgYiB9KTsKKyAg
ICBmbG9hdCBtdWx0aXBsaWVyID0gc3RkOjptYXgoMC4wZiwgKHYgLSAwLjMzZikgLyB2KTsKKwor
ICAgIHJldHVybiBtYWtlU2ltcGxlQ29sb3IoU1JHQkEgeyBtdWx0aXBsaWVyICogciwgbXVsdGlw
bGllciAqIGcsIG11bHRpcGxpZXIgKiBiLCBhIH0pOworfQorCitib29sIENvbG9yOjppc0Rhcmso
KSBjb25zdAoreworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSB1c2luZyBs
dW1pbmFuY2UuCisgICAgYXV0byBbciwgZywgYiwgYV0gPSB0b1NSR0JBTG9zc3koKTsKKyAgICBm
bG9hdCBsYXJnZXN0Tm9uQWxwaGFDaGFubmVsID0gc3RkOjptYXgoeyByLCBnLCBiIH0pOworICAg
IHJldHVybiBhID4gMC41ICYmIGxhcmdlc3ROb25BbHBoYUNoYW5uZWwgPCAwLjU7Cit9CisKK2Zs
b2F0IENvbG9yOjpsaWdodG5lc3MoKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBUaGlzIGNhbiBw
cm9iYWJseSBhdm9pZCBjb252ZXJzaW9uIHRvIHNSR0IgYnkgaGF2aW5nIHBlci1jb2xvcnNwYWNl
IGFsZ29yaXRobXMgZm9yIEhTTC4KKyAgICByZXR1cm4gV2ViQ29yZTo6bGlnaHRuZXNzKHRvU1JH
QkFMb3NzeSgpKTsKK30KKworZmxvYXQgQ29sb3I6Omx1bWluYW5jZSgpIGNvbnN0Cit7CisgICAg
Ly8gRklYTUU6IFRoaXMgY2FuIHByb2JhYmx5IGF2b2lkIGNvbnZlcnNpb24gdG8gc1JHQiBieSBo
YXZpbmcgcGVyLWNvbG9yc3BhY2UgYWxnb3JpdGhtcworICAgIC8vIGZvciBsdW1pbmFuY2UgKGUu
Zy4gY29udmVydFRvWFlaKGMpLnlDb21wb25lbnQoKSkuCisgICAgcmV0dXJuIFdlYkNvcmU6Omx1
bWluYW5jZSh0b1NSR0JBTG9zc3koKSk7Cit9CisKK0NvbG9yIENvbG9yOjpibGVuZChjb25zdCBD
b2xvciYgc291cmNlKSBjb25zdAoreworICAgIGlmICghaXNWaXNpYmxlKCkgfHwgc291cmNlLmlz
T3BhcXVlKCkpCisgICAgICAgIHJldHVybiBzb3VyY2U7CisKKyAgICBpZiAoIXNvdXJjZS5hbHBo
YSgpKQorICAgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICBhdXRvIFtzZWxmUiwgc2VsZkcsIHNl
bGZCLCBzZWxmQV0gPSB0b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpOworICAgIGF1dG8gW3NvdXJj
ZVIsIHNvdXJjZUcsIHNvdXJjZUIsIHNvdXJjZUFdID0gc291cmNlLnRvU1JHQkFTaW1wbGVDb2xv
ckxvc3N5KCk7CisKKyAgICBpbnQgZCA9IDB4RkYgKiAoc2VsZkEgKyBzb3VyY2VBKSAtIHNlbGZB
ICogc291cmNlQTsKKyAgICBpbnQgYSA9IGQgLyAweEZGOworICAgIGludCByID0gKHNlbGZSICog
c2VsZkEgKiAoMHhGRiAtIHNvdXJjZUEpICsgMHhGRiAqIHNvdXJjZUEgKiBzb3VyY2VSKSAvIGQ7
CisgICAgaW50IGcgPSAoc2VsZkcgKiBzZWxmQSAqICgweEZGIC0gc291cmNlQSkgKyAweEZGICog
c291cmNlQSAqIHNvdXJjZUcpIC8gZDsKKyAgICBpbnQgYiA9IChzZWxmQiAqIHNlbGZBICogKDB4
RkYgLSBzb3VyY2VBKSArIDB4RkYgKiBzb3VyY2VBICogc291cmNlQikgLyBkOworCisgICAgcmV0
dXJuIG1ha2VTaW1wbGVDb2xvcihyLCBnLCBiLCBhKTsKK30KKworQ29sb3IgQ29sb3I6OmJsZW5k
V2l0aFdoaXRlKCkgY29uc3QKK3sKKyAgICBjb25zdGV4cHIgaW50IHN0YXJ0QWxwaGEgPSAxNTM7
IC8vIDYwJQorICAgIGNvbnN0ZXhwciBpbnQgZW5kQWxwaGEgPSAyMDQ7IC8vIDgwJTsKKyAgICBj
b25zdGV4cHIgaW50IGFscGhhSW5jcmVtZW50ID0gMTc7CisKKyAgICBhdXRvIGJsZW5kQ29tcG9u
ZW50ID0gW10oaW50IGMsIGludCBhKSAtPiBpbnQgeworICAgICAgICBmbG9hdCBhbHBoYSA9IGEg
LyAyNTUuMGY7CisgICAgICAgIGludCB3aGl0ZUJsZW5kID0gMjU1IC0gYTsKKyAgICAgICAgYyAt
PSB3aGl0ZUJsZW5kOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihjIC8gYWxwaGEp
OworICAgIH07CisKKyAgICAvLyBJZiB0aGUgY29sb3IgY29udGFpbnMgYWxwaGEgYWxyZWFkeSwg
d2UgbGVhdmUgaXQgYWxvbmUuCisgICAgaWYgKCFpc09wYXF1ZSgpKQorICAgICAgICByZXR1cm4g
KnRoaXM7CisKKyAgICBhdXRvIFtleGlzdGluZ1IsIGV4aXN0aW5nRywgZXhpc3RpbmdCLCBleGlz
dGluZ0FscGhhXSA9IHRvU1JHQkFTaW1wbGVDb2xvckxvc3N5KCk7CisKKyAgICBDb2xvciByZXN1
bHQ7CisgICAgZm9yIChpbnQgYWxwaGEgPSBzdGFydEFscGhhOyBhbHBoYSA8PSBlbmRBbHBoYTsg
YWxwaGEgKz0gYWxwaGFJbmNyZW1lbnQpIHsKKyAgICAgICAgLy8gV2UgaGF2ZSBhIHNvbGlkIGNv
bG9yLiAgQ29udmVydCB0byBhbiBlcXVpdmFsZW50IGNvbG9yIHRoYXQgbG9va3MgdGhlIHNhbWUg
d2hlbiBibGVuZGVkIHdpdGggd2hpdGUKKyAgICAgICAgLy8gYXQgdGhlIGN1cnJlbnQgYWxwaGEu
ICBUcnkgdXNpbmcgbGVzcyB0cmFuc3BhcmVuY3kgaWYgdGhlIG51bWJlcnMgZW5kIHVwIGJlaW5n
IG5lZ2F0aXZlLgorICAgICAgICBpbnQgciA9IGJsZW5kQ29tcG9uZW50KGV4aXN0aW5nUiwgYWxw
aGEpOworICAgICAgICBpbnQgZyA9IGJsZW5kQ29tcG9uZW50KGV4aXN0aW5nRywgYWxwaGEpOwor
ICAgICAgICBpbnQgYiA9IGJsZW5kQ29tcG9uZW50KGV4aXN0aW5nQiwgYWxwaGEpOworICAgICAg
ICAKKyAgICAgICAgcmVzdWx0ID0gbWFrZVNpbXBsZUNvbG9yKHIsIGcsIGIsIGFscGhhKTsKKwor
ICAgICAgICBpZiAociA+PSAwICYmIGcgPj0gMCAmJiBiID49IDApCisgICAgICAgICAgICBicmVh
azsKKyAgICB9CisKKyAgICAvLyBGSVhNRTogV2h5IGlzIHByZXNlcnZpbmcgdGhlIHNlbWFudGlj
IGJpdCBkZXNpcmVkIGFuZC9vciBjb3JyZWN0IGhlcmU/CisgICAgaWYgKGlzU2VtYW50aWMoKSkK
KyAgICAgICAgcmVzdWx0LnRhZ0FzU2VtYW50aWMoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQor
CitDb2xvciBDb2xvcjo6Y29sb3JXaXRoQWxwaGEoZmxvYXQgYWxwaGEpIGNvbnN0Cit7CisgICAg
aWYgKGlzRXh0ZW5kZWQoKSkKKyAgICAgICAgcmV0dXJuIGFzRXh0ZW5kZWQoKS5jb2xvcldpdGhB
bHBoYShhbHBoYSk7CisKKyAgICBDb2xvciByZXN1bHQgPSBhc1NpbXBsZSgpLmNvbG9yV2l0aEFs
cGhhKGNvbnZlcnRUb0NvbXBvbmVudEJ5dGUoYWxwaGEpKTsKKworICAgIC8vIEZJWE1FOiBXaHkg
aXMgcHJlc2VydmluZyB0aGUgc2VtYW50aWMgYml0IGRlc2lyZWQgYW5kL29yIGNvcnJlY3QgaGVy
ZT8KKyAgICBpZiAoaXNTZW1hbnRpYygpKQorICAgICAgICByZXN1bHQudGFnQXNTZW1hbnRpYygp
OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0NvbG9yIENvbG9yOjppbnZlcnRlZENvbG9yV2l0
aEFscGhhKGZsb2F0IGFscGhhKSBjb25zdAoreworICAgIGlmIChpc0V4dGVuZGVkKCkpCisgICAg
ICAgIHJldHVybiBhc0V4dGVuZGVkKCkuaW52ZXJ0ZWRDb2xvcldpdGhBbHBoYShhbHBoYSk7Cisg
ICAgcmV0dXJuIGFzU2ltcGxlKCkuaW52ZXJ0ZWRDb2xvcldpdGhBbHBoYShjb252ZXJ0VG9Db21w
b25lbnRCeXRlKGFscGhhKSk7Cit9CisKK0NvbG9yIENvbG9yOjpzZW1hbnRpY0NvbG9yKCkgY29u
c3QKK3sKKyAgICBpZiAoaXNTZW1hbnRpYygpKQorICAgICAgICByZXR1cm4gKnRoaXM7CisKKyAg
ICByZXR1cm4geyB0b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpLCBTZW1hbnRpYyB9OworfQorCitz
dGQ6OnBhaXI8Q29sb3JTcGFjZSwgQ29sb3JDb21wb25lbnRzPGZsb2F0Pj4gQ29sb3I6OmNvbG9y
U3BhY2VBbmRDb21wb25lbnRzKCkgY29uc3QKK3sKKyAgICBpZiAoaXNFeHRlbmRlZCgpKQorICAg
ICAgICByZXR1cm4geyBhc0V4dGVuZGVkKCkuY29sb3JTcGFjZSgpLCBhc0V4dGVuZGVkKCkuY29t
cG9uZW50cygpIH07CisgICAgcmV0dXJuIHsgQ29sb3JTcGFjZTo6U1JHQiwgYXNDb2xvckNvbXBv
bmVudHMoYXNTaW1wbGUoKS5hc1NSR0JBPGZsb2F0PigpKSB9OworfQorCitTaW1wbGVDb2xvciBD
b2xvcjo6dG9TUkdCQVNpbXBsZUNvbG9yTG9zc3koKSBjb25zdAoreworICAgIGlmIChpc0V4dGVu
ZGVkKCkpCisgICAgICAgIHJldHVybiBtYWtlU2ltcGxlQ29sb3IoYXNFeHRlbmRlZCgpLnRvU1JH
QkFMb3NzeSgpKTsKKyAgICByZXR1cm4gYXNTaW1wbGUoKTsKK30KKworU1JHQkE8ZmxvYXQ+IENv
bG9yOjp0b1NSR0JBTG9zc3koKSBjb25zdAoreworICAgIGlmIChpc0V4dGVuZGVkKCkpCisgICAg
ICAgIHJldHVybiBhc0V4dGVuZGVkKCkudG9TUkdCQUxvc3N5KCk7CisgICAgcmV0dXJuIGFzU2lt
cGxlKCkuYXNTUkdCQTxmbG9hdD4oKTsKK30KKworQ29sb3IgYmxlbmQoY29uc3QgQ29sb3ImIGZy
b20sIGNvbnN0IENvbG9yJiB0bywgZG91YmxlIHByb2dyZXNzKQoreworICAgIC8vIEZJWE1FOiBF
eHRlbmRlZENvbG9yIC0gbmVlZHMgdG8gaGFuZGxlIGNvbG9yIHNwYWNlcy4KKyAgICAvLyBXZSBu
ZWVkIHRvIHByZXNlcnZlIHRoZSBzdGF0ZSBvZiB0aGUgdmFsaWQgZmxhZyBhdCB0aGUgZW5kIG9m
IHRoZSBhbmltYXRpb24KKyAgICBpZiAocHJvZ3Jlc3MgPT0gMSAmJiAhdG8uaXNWYWxpZCgpKQor
ICAgICAgICByZXR1cm4geyB9OworCisgICAgLy8gU2luY2UgcHJlbXVsdGlwbHlDZWlsaW5nKCkg
YmFpbHMgb24gemVybyBhbHBoYSwgc3BlY2lhbC1jYXNlIHRoYXQuCisgICAgYXV0byBwcmVtdWx0
aXBsaWVkRnJvbSA9IGZyb20uYWxwaGEoKSA/IHByZW11bHRpcGx5Q2VpbGluZyhmcm9tLnRvU1JH
QkFTaW1wbGVDb2xvckxvc3N5KCkpIDogQ29sb3I6OnRyYW5zcGFyZW50OworICAgIGF1dG8gcHJl
bXVsdGlwbGllZFRvID0gdG8uYWxwaGEoKSA/IHByZW11bHRpcGx5Q2VpbGluZyh0by50b1NSR0JB
U2ltcGxlQ29sb3JMb3NzeSgpKSA6IENvbG9yOjp0cmFuc3BhcmVudDsKKworICAgIFNpbXBsZUNv
bG9yIHByZW11bHRCbGVuZGVkID0gbWFrZVNpbXBsZUNvbG9yKAorICAgICAgICBXZWJDb3JlOjpi
bGVuZChwcmVtdWx0aXBsaWVkRnJvbS5yZWRDb21wb25lbnQoKSwgcHJlbXVsdGlwbGllZFRvLnJl
ZENvbXBvbmVudCgpLCBwcm9ncmVzcyksCisgICAgICAgIFdlYkNvcmU6OmJsZW5kKHByZW11bHRp
cGxpZWRGcm9tLmdyZWVuQ29tcG9uZW50KCksIHByZW11bHRpcGxpZWRUby5ncmVlbkNvbXBvbmVu
dCgpLCBwcm9ncmVzcyksCisgICAgICAgIFdlYkNvcmU6OmJsZW5kKHByZW11bHRpcGxpZWRGcm9t
LmJsdWVDb21wb25lbnQoKSwgcHJlbXVsdGlwbGllZFRvLmJsdWVDb21wb25lbnQoKSwgcHJvZ3Jl
c3MpLAorICAgICAgICBXZWJDb3JlOjpibGVuZChwcmVtdWx0aXBsaWVkRnJvbS5hbHBoYUNvbXBv
bmVudCgpLCBwcmVtdWx0aXBsaWVkVG8uYWxwaGFDb21wb25lbnQoKSwgcHJvZ3Jlc3MpCisgICAg
KTsKKworICAgIHJldHVybiB1bnByZW11bHRpcGx5KHByZW11bHRCbGVuZGVkKTsKK30KKworQ29s
b3IgYmxlbmRXaXRob3V0UHJlbXVsdGlwbHkoY29uc3QgQ29sb3ImIGZyb20sIGNvbnN0IENvbG9y
JiB0bywgZG91YmxlIHByb2dyZXNzKQoreworICAgIC8vIEZJWE1FOiBFeHRlbmRlZENvbG9yIC0g
bmVlZHMgdG8gaGFuZGxlIGNvbG9yIHNwYWNlcy4KKyAgICAvLyBXZSBuZWVkIHRvIHByZXNlcnZl
IHRoZSBzdGF0ZSBvZiB0aGUgdmFsaWQgZmxhZyBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24K
KyAgICBpZiAocHJvZ3Jlc3MgPT0gMSAmJiAhdG8uaXNWYWxpZCgpKQorICAgICAgICByZXR1cm4g
eyB9OworCisgICAgYXV0byBmcm9tU1JHQiA9IGZyb20udG9TUkdCQVNpbXBsZUNvbG9yTG9zc3ko
KTsKKyAgICBhdXRvIHRvU1JHQiA9IGZyb20udG9TUkdCQVNpbXBsZUNvbG9yTG9zc3koKTsKKwor
ICAgIHJldHVybiBtYWtlU2ltcGxlQ29sb3IoCisgICAgICAgIFdlYkNvcmU6OmJsZW5kKGZyb21T
UkdCLnJlZENvbXBvbmVudCgpLCB0b1NSR0IucmVkQ29tcG9uZW50KCksIHByb2dyZXNzKSwKKyAg
ICAgICAgV2ViQ29yZTo6YmxlbmQoZnJvbVNSR0IuZ3JlZW5Db21wb25lbnQoKSwgdG9TUkdCLmdy
ZWVuQ29tcG9uZW50KCksIHByb2dyZXNzKSwKKyAgICAgICAgV2ViQ29yZTo6YmxlbmQoZnJvbVNS
R0IuYmx1ZUNvbXBvbmVudCgpLCB0b1NSR0IuYmx1ZUNvbXBvbmVudCgpLCBwcm9ncmVzcyksCisg
ICAgICAgIFdlYkNvcmU6OmJsZW5kKGZyb21TUkdCLmFscGhhQ29tcG9uZW50KCksIHRvU1JHQi5h
bHBoYUNvbXBvbmVudCgpLCBwcm9ncmVzcykKKyAgICApOworfQorCitUZXh0U3RyZWFtJiBvcGVy
YXRvcjw8KFRleHRTdHJlYW0mIHRzLCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgcmV0dXJu
IHRzIDw8IGNvbG9yLm5hbWVGb3JSZW5kZXJUcmVlQXNUZXh0KCk7Cit9CisKK1RleHRTdHJlYW0m
IG9wZXJhdG9yPDwoVGV4dFN0cmVhbSYgdHMsIENvbG9yU3BhY2UgY29sb3JTcGFjZSkKK3sKKyAg
ICBzd2l0Y2ggKGNvbG9yU3BhY2UpIHsKKyAgICBjYXNlIENvbG9yU3BhY2U6OlNSR0I6CisgICAg
ICAgIHRzIDw8ICJzUkdCIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb2xvclNwYWNlOjpM
aW5lYXJSR0I6CisgICAgICAgIHRzIDw8ICJMaW5lYXJSR0IiOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIENvbG9yU3BhY2U6OkRpc3BsYXlQMzoKKyAgICAgICAgdHMgPDwgIkRpc3BsYXlQMyI7
CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdHM7Cit9CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKClByb3BlcnR5IGNoYW5nZXMgb246IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0NvbG9yQmxlbmRpbmcuY3BwCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5
bGUKIyMgLTAsMCArMSAjIworbmF0aXZlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgcHJvcGVydHkK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yQmxlbmRpbmcuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yQmxl
bmRpbmcuY3BwCShyZXZpc2lvbiAyNjM3MTIpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9Db2xvckJsZW5kaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAK
IC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNCwxNTUgKzI0LDM0IEBA
CiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkNvbG9yLmgiCisjaW5jbHVk
ZSAiQ29sb3JCbGVuZGluZy5oIgogCiAjaW5jbHVkZSAiQW5pbWF0aW9uVXRpbGl0aWVzLmgiCi0j
aW5jbHVkZSAiQ29sb3JVdGlsaXRpZXMuaCIKLSNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgot
I2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVp
bGRlci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KKyNpbmNsdWRlICJDb2xv
ci5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXN0YXRpYyBjb25zdGV4cHIgU2ltcGxlQ29s
b3IgbGlnaHRlbmVkQmxhY2sgeyAweEZGNTQ1NDU0IH07Ci1zdGF0aWMgY29uc3RleHByIFNpbXBs
ZUNvbG9yIGRhcmtlbmVkV2hpdGUgeyAweEZGQUJBQkFCIH07Ci0KLUNvbG9yOjpDb2xvcihjb25z
dCBDb2xvciYgb3RoZXIpCi0gICAgOiBtX2NvbG9yRGF0YShvdGhlci5tX2NvbG9yRGF0YSkKLXsK
LSAgICBpZiAoaXNFeHRlbmRlZCgpKQotICAgICAgICBtX2NvbG9yRGF0YS5leHRlbmRlZENvbG9y
LT5yZWYoKTsKLX0KLQotQ29sb3I6OkNvbG9yKENvbG9yJiYgb3RoZXIpCi17Ci0gICAgKnRoaXMg
PSBXVEZNb3ZlKG90aGVyKTsKLX0KLQotQ29sb3ImIENvbG9yOjpvcGVyYXRvcj0oY29uc3QgQ29s
b3ImIG90aGVyKQotewotICAgIGlmICgqdGhpcyA9PSBvdGhlcikKLSAgICAgICAgcmV0dXJuICp0
aGlzOwotCi0gICAgaWYgKGlzRXh0ZW5kZWQoKSkKLSAgICAgICAgbV9jb2xvckRhdGEuZXh0ZW5k
ZWRDb2xvci0+ZGVyZWYoKTsKLQotICAgIG1fY29sb3JEYXRhID0gb3RoZXIubV9jb2xvckRhdGE7
Ci0KLSAgICBpZiAoaXNFeHRlbmRlZCgpKQotICAgICAgICBtX2NvbG9yRGF0YS5leHRlbmRlZENv
bG9yLT5yZWYoKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLUNvbG9yJiBDb2xvcjo6b3BlcmF0
b3I9KENvbG9yJiYgb3RoZXIpCitDb2xvciBibGVuZFNvdXJjZU92ZXIoY29uc3QgQ29sb3ImIGJh
Y2tkcm9wLCBjb25zdCBDb2xvciYgc291cmNlKQogewotICAgIGlmICgqdGhpcyA9PSBvdGhlcikK
LSAgICAgICAgcmV0dXJuICp0aGlzOwotCi0gICAgaWYgKGlzRXh0ZW5kZWQoKSkKLSAgICAgICAg
bV9jb2xvckRhdGEuZXh0ZW5kZWRDb2xvci0+ZGVyZWYoKTsKLQotICAgIG1fY29sb3JEYXRhID0g
b3RoZXIubV9jb2xvckRhdGE7Ci0gICAgb3RoZXIubV9jb2xvckRhdGEuc2ltcGxlQ29sb3JBbmRG
bGFncyA9IGludmFsaWRTaW1wbGVDb2xvcjsKLQotICAgIHJldHVybiAqdGhpczsKLX0KLQotU3Ry
aW5nIENvbG9yOjpzZXJpYWxpemVkKCkgY29uc3QKLXsKLSAgICBpZiAoaXNFeHRlbmRlZCgpKQot
ICAgICAgICByZXR1cm4gYXNFeHRlbmRlZCgpLmNzc1RleHQoKTsKLSAgICByZXR1cm4gYXNTaW1w
bGUoKS5zZXJpYWxpemF0aW9uRm9ySFRNTCgpOwotfQotCi1TdHJpbmcgQ29sb3I6OmNzc1RleHQo
KSBjb25zdAotewotICAgIGlmIChpc0V4dGVuZGVkKCkpCi0gICAgICAgIHJldHVybiBhc0V4dGVu
ZGVkKCkuY3NzVGV4dCgpOwotICAgIHJldHVybiBhc1NpbXBsZSgpLnNlcmlhbGl6YXRpb25Gb3JD
U1MoKTsKLX0KLQotU3RyaW5nIENvbG9yOjpuYW1lRm9yUmVuZGVyVHJlZUFzVGV4dCgpIGNvbnN0
Ci17Ci0gICAgaWYgKGlzRXh0ZW5kZWQoKSkKLSAgICAgICAgcmV0dXJuIGFzRXh0ZW5kZWQoKS5j
c3NUZXh0KCk7Ci0gICAgcmV0dXJuIGFzU2ltcGxlKCkuc2VyaWFsaXphdGlvbkZvclJlbmRlclRy
ZWVBc1RleHQoKTsKLX0KLQotQ29sb3IgQ29sb3I6OmxpZ2h0ZW5lZCgpIGNvbnN0Ci17Ci0gICAg
Ly8gSGFyZGNvZGUgdGhpcyBjb21tb24gY2FzZSBmb3Igc3BlZWQuCi0gICAgaWYgKGlzU2ltcGxl
KCkgJiYgYXNTaW1wbGUoKSA9PSBibGFjaykKLSAgICAgICAgcmV0dXJuIGxpZ2h0ZW5lZEJsYWNr
OwotCi0gICAgYXV0byBbciwgZywgYiwgYV0gPSB0b1NSR0JBTG9zc3koKTsKLSAgICBmbG9hdCB2
ID0gc3RkOjptYXgoeyByLCBnLCBiIH0pOwotCi0gICAgaWYgKHYgPT0gMC4wZikKLSAgICAgICAg
cmV0dXJuIGxpZ2h0ZW5lZEJsYWNrLmNvbG9yV2l0aEFscGhhKGFscGhhKCkpOwotCi0gICAgZmxv
YXQgbXVsdGlwbGllciA9IHN0ZDo6bWluKDEuMGYsIHYgKyAwLjMzZikgLyB2OwotCi0gICAgcmV0
dXJuIG1ha2VTaW1wbGVDb2xvcihTUkdCQSB7IG11bHRpcGxpZXIgKiByLCBtdWx0aXBsaWVyICog
ZywgbXVsdGlwbGllciAqIGIsIGEgfSk7Ci19Ci0KLUNvbG9yIENvbG9yOjpkYXJrZW5lZCgpIGNv
bnN0Ci17Ci0gICAgLy8gSGFyZGNvZGUgdGhpcyBjb21tb24gY2FzZSBmb3Igc3BlZWQuCi0gICAg
aWYgKGlzU2ltcGxlKCkgJiYgYXNTaW1wbGUoKSA9PSB3aGl0ZSkKLSAgICAgICAgcmV0dXJuIGRh
cmtlbmVkV2hpdGU7Ci0gICAgCi0gICAgYXV0byBbciwgZywgYiwgYV0gPSB0b1NSR0JBTG9zc3ko
KTsKLQotICAgIGZsb2F0IHYgPSBzdGQ6Om1heCh7IHIsIGcsIGIgfSk7Ci0gICAgZmxvYXQgbXVs
dGlwbGllciA9IHN0ZDo6bWF4KDAuMGYsICh2IC0gMC4zM2YpIC8gdik7Ci0KLSAgICByZXR1cm4g
bWFrZVNpbXBsZUNvbG9yKFNSR0JBIHsgbXVsdGlwbGllciAqIHIsIG11bHRpcGxpZXIgKiBnLCBt
dWx0aXBsaWVyICogYiwgYSB9KTsKLX0KLQotYm9vbCBDb2xvcjo6aXNEYXJrKCkgY29uc3QKLXsK
LSAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgdXNpbmcgbHVtaW5hbmNlLgot
ICAgIGF1dG8gW3IsIGcsIGIsIGFdID0gdG9TUkdCQUxvc3N5KCk7Ci0gICAgZmxvYXQgbGFyZ2Vz
dE5vbkFscGhhQ2hhbm5lbCA9IHN0ZDo6bWF4KHsgciwgZywgYiB9KTsKLSAgICByZXR1cm4gYSA+
IDAuNSAmJiBsYXJnZXN0Tm9uQWxwaGFDaGFubmVsIDwgMC41OwotfQotCi1mbG9hdCBDb2xvcjo6
bGlnaHRuZXNzKCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBjYW4gcHJvYmFibHkgYXZv
aWQgY29udmVyc2lvbiB0byBzUkdCIGJ5IGhhdmluZyBwZXItY29sb3JzcGFjZSBhbGdvcml0aG1z
IGZvciBIU0wuCi0gICAgcmV0dXJuIFdlYkNvcmU6OmxpZ2h0bmVzcyh0b1NSR0JBTG9zc3koKSk7
Ci19Ci0KLWZsb2F0IENvbG9yOjpsdW1pbmFuY2UoKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBU
aGlzIGNhbiBwcm9iYWJseSBhdm9pZCBjb252ZXJzaW9uIHRvIHNSR0IgYnkgaGF2aW5nIHBlci1j
b2xvcnNwYWNlIGFsZ29yaXRobXMKLSAgICAvLyBmb3IgbHVtaW5hbmNlIChlLmcuIGNvbnZlcnRU
b1hZWihjKS55Q29tcG9uZW50KCkpLgotICAgIHJldHVybiBXZWJDb3JlOjpsdW1pbmFuY2UodG9T
UkdCQUxvc3N5KCkpOwotfQotCi1Db2xvciBDb2xvcjo6YmxlbmQoY29uc3QgQ29sb3ImIHNvdXJj
ZSkgY29uc3QKLXsKLSAgICBpZiAoIWlzVmlzaWJsZSgpIHx8IHNvdXJjZS5pc09wYXF1ZSgpKQor
ICAgIGlmICghYmFja2Ryb3AuaXNWaXNpYmxlKCkgfHwgc291cmNlLmlzT3BhcXVlKCkpCiAgICAg
ICAgIHJldHVybiBzb3VyY2U7CiAKICAgICBpZiAoIXNvdXJjZS5hbHBoYSgpKQogICAgICAgICBy
ZXR1cm4gKnRoaXM7CiAKLSAgICBhdXRvIFtzZWxmUiwgc2VsZkcsIHNlbGZCLCBzZWxmQV0gPSB0
b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpOworICAgIGF1dG8gW2JhY2tkcm9wUiwgYmFja2Ryb3BH
LCBiYWNrZHJvcEIsIGJhY2tkcm9wQV0gPSBiYWNrZHJvcC50b1NSR0JBU2ltcGxlQ29sb3JMb3Nz
eSgpOwogICAgIGF1dG8gW3NvdXJjZVIsIHNvdXJjZUcsIHNvdXJjZUIsIHNvdXJjZUFdID0gc291
cmNlLnRvU1JHQkFTaW1wbGVDb2xvckxvc3N5KCk7CiAKLSAgICBpbnQgZCA9IDB4RkYgKiAoc2Vs
ZkEgKyBzb3VyY2VBKSAtIHNlbGZBICogc291cmNlQTsKKyAgICBpbnQgZCA9IDB4RkYgKiAoYmFj
a2Ryb3BBICsgc291cmNlQSkgLSBiYWNrZHJvcEEgKiBzb3VyY2VBOwogICAgIGludCBhID0gZCAv
IDB4RkY7Ci0gICAgaW50IHIgPSAoc2VsZlIgKiBzZWxmQSAqICgweEZGIC0gc291cmNlQSkgKyAw
eEZGICogc291cmNlQSAqIHNvdXJjZVIpIC8gZDsKLSAgICBpbnQgZyA9IChzZWxmRyAqIHNlbGZB
ICogKDB4RkYgLSBzb3VyY2VBKSArIDB4RkYgKiBzb3VyY2VBICogc291cmNlRykgLyBkOwotICAg
IGludCBiID0gKHNlbGZCICogc2VsZkEgKiAoMHhGRiAtIHNvdXJjZUEpICsgMHhGRiAqIHNvdXJj
ZUEgKiBzb3VyY2VCKSAvIGQ7CisgICAgaW50IHIgPSAoYmFja2Ryb3BSICogYmFja2Ryb3BBICog
KDB4RkYgLSBzb3VyY2VBKSArIDB4RkYgKiBzb3VyY2VBICogc291cmNlUikgLyBkOworICAgIGlu
dCBnID0gKGJhY2tkcm9wRyAqIGJhY2tkcm9wQSAqICgweEZGIC0gc291cmNlQSkgKyAweEZGICog
c291cmNlQSAqIHNvdXJjZUcpIC8gZDsKKyAgICBpbnQgYiA9IChiYWNrZHJvcEIgKiBiYWNrZHJv
cEEgKiAoMHhGRiAtIHNvdXJjZUEpICsgMHhGRiAqIHNvdXJjZUEgKiBzb3VyY2VCKSAvIGQ7CiAK
ICAgICByZXR1cm4gbWFrZVNpbXBsZUNvbG9yKHIsIGcsIGIsIGEpOwogfQogCi1Db2xvciBDb2xv
cjo6YmxlbmRXaXRoV2hpdGUoKSBjb25zdAorQ29sb3IgYmxlbmRXaXRoV2hpdGUoY29uc3QgQ29s
b3ImIGNvbG9yKQogewogICAgIGNvbnN0ZXhwciBpbnQgc3RhcnRBbHBoYSA9IDE1MzsgLy8gNjAl
CiAgICAgY29uc3RleHByIGludCBlbmRBbHBoYSA9IDIwNDsgLy8gODAlOwpAQCAtMTg2LDEyICs2
NSwxMiBAQCBDb2xvciBDb2xvcjo6YmxlbmRXaXRoV2hpdGUoKSBjb25zdAogICAgIH07CiAKICAg
ICAvLyBJZiB0aGUgY29sb3IgY29udGFpbnMgYWxwaGEgYWxyZWFkeSwgd2UgbGVhdmUgaXQgYWxv
bmUuCi0gICAgaWYgKCFpc09wYXF1ZSgpKQotICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgaWYg
KCFjb2xvci5pc09wYXF1ZSgpKQorICAgICAgICByZXR1cm4gY29sb3I7CiAKLSAgICBhdXRvIFtl
eGlzdGluZ1IsIGV4aXN0aW5nRywgZXhpc3RpbmdCLCBleGlzdGluZ0FscGhhXSA9IHRvU1JHQkFT
aW1wbGVDb2xvckxvc3N5KCk7CisgICAgYXV0byBbZXhpc3RpbmdSLCBleGlzdGluZ0csIGV4aXN0
aW5nQiwgZXhpc3RpbmdBbHBoYV0gPSBjb2xvci50b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpOwog
Ci0gICAgQ29sb3IgcmVzdWx0OworICAgIFNpbXBsZUNvbG9yIHJlc3VsdDsKICAgICBmb3IgKGlu
dCBhbHBoYSA9IHN0YXJ0QWxwaGE7IGFscGhhIDw9IGVuZEFscGhhOyBhbHBoYSArPSBhbHBoYUlu
Y3JlbWVudCkgewogICAgICAgICAvLyBXZSBoYXZlIGEgc29saWQgY29sb3IuICBDb252ZXJ0IHRv
IGFuIGVxdWl2YWxlbnQgY29sb3IgdGhhdCBsb29rcyB0aGUgc2FtZSB3aGVuIGJsZW5kZWQgd2l0
aCB3aGl0ZQogICAgICAgICAvLyBhdCB0aGUgY3VycmVudCBhbHBoYS4gIFRyeSB1c2luZyBsZXNz
IHRyYW5zcGFyZW5jeSBpZiB0aGUgbnVtYmVycyBlbmQgdXAgYmVpbmcgbmVnYXRpdmUuCkBAIC0y
MDYsNjAgKzg1LDExIEBAIENvbG9yIENvbG9yOjpibGVuZFdpdGhXaGl0ZSgpIGNvbnN0CiAgICAg
fQogCiAgICAgLy8gRklYTUU6IFdoeSBpcyBwcmVzZXJ2aW5nIHRoZSBzZW1hbnRpYyBiaXQgZGVz
aXJlZCBhbmQvb3IgY29ycmVjdCBoZXJlPwotICAgIGlmIChpc1NlbWFudGljKCkpCi0gICAgICAg
IHJlc3VsdC50YWdBc1NlbWFudGljKCk7CisgICAgaWYgKGNvbG9yLmlzU2VtYW50aWMoKSkKKyAg
ICAgICAgcmV0dXJuIENvbG9yKHJlc3VsdCwgQ29sb3I6OlNlbWFudGljKTsKICAgICByZXR1cm4g
cmVzdWx0OwogfQogCi1Db2xvciBDb2xvcjo6Y29sb3JXaXRoQWxwaGEoZmxvYXQgYWxwaGEpIGNv
bnN0Ci17Ci0gICAgaWYgKGlzRXh0ZW5kZWQoKSkKLSAgICAgICAgcmV0dXJuIGFzRXh0ZW5kZWQo
KS5jb2xvcldpdGhBbHBoYShhbHBoYSk7Ci0KLSAgICBDb2xvciByZXN1bHQgPSBhc1NpbXBsZSgp
LmNvbG9yV2l0aEFscGhhKGNvbnZlcnRUb0NvbXBvbmVudEJ5dGUoYWxwaGEpKTsKLQotICAgIC8v
IEZJWE1FOiBXaHkgaXMgcHJlc2VydmluZyB0aGUgc2VtYW50aWMgYml0IGRlc2lyZWQgYW5kL29y
IGNvcnJlY3QgaGVyZT8KLSAgICBpZiAoaXNTZW1hbnRpYygpKQotICAgICAgICByZXN1bHQudGFn
QXNTZW1hbnRpYygpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUNvbG9yIENvbG9yOjppbnZl
cnRlZENvbG9yV2l0aEFscGhhKGZsb2F0IGFscGhhKSBjb25zdAotewotICAgIGlmIChpc0V4dGVu
ZGVkKCkpCi0gICAgICAgIHJldHVybiBhc0V4dGVuZGVkKCkuaW52ZXJ0ZWRDb2xvcldpdGhBbHBo
YShhbHBoYSk7Ci0gICAgcmV0dXJuIGFzU2ltcGxlKCkuaW52ZXJ0ZWRDb2xvcldpdGhBbHBoYShj
b252ZXJ0VG9Db21wb25lbnRCeXRlKGFscGhhKSk7Ci19Ci0KLUNvbG9yIENvbG9yOjpzZW1hbnRp
Y0NvbG9yKCkgY29uc3QKLXsKLSAgICBpZiAoaXNTZW1hbnRpYygpKQotICAgICAgICByZXR1cm4g
KnRoaXM7Ci0KLSAgICByZXR1cm4geyB0b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpLCBTZW1hbnRp
YyB9OwotfQotCi1zdGQ6OnBhaXI8Q29sb3JTcGFjZSwgQ29sb3JDb21wb25lbnRzPGZsb2F0Pj4g
Q29sb3I6OmNvbG9yU3BhY2VBbmRDb21wb25lbnRzKCkgY29uc3QKLXsKLSAgICBpZiAoaXNFeHRl
bmRlZCgpKQotICAgICAgICByZXR1cm4geyBhc0V4dGVuZGVkKCkuY29sb3JTcGFjZSgpLCBhc0V4
dGVuZGVkKCkuY29tcG9uZW50cygpIH07Ci0gICAgcmV0dXJuIHsgQ29sb3JTcGFjZTo6U1JHQiwg
YXNDb2xvckNvbXBvbmVudHMoYXNTaW1wbGUoKS5hc1NSR0JBPGZsb2F0PigpKSB9OwotfQotCi1T
aW1wbGVDb2xvciBDb2xvcjo6dG9TUkdCQVNpbXBsZUNvbG9yTG9zc3koKSBjb25zdAotewotICAg
IGlmIChpc0V4dGVuZGVkKCkpCi0gICAgICAgIHJldHVybiBtYWtlU2ltcGxlQ29sb3IoYXNFeHRl
bmRlZCgpLnRvU1JHQkFMb3NzeSgpKTsKLSAgICByZXR1cm4gYXNTaW1wbGUoKTsKLX0KLQotU1JH
QkE8ZmxvYXQ+IENvbG9yOjp0b1NSR0JBTG9zc3koKSBjb25zdAotewotICAgIGlmIChpc0V4dGVu
ZGVkKCkpCi0gICAgICAgIHJldHVybiBhc0V4dGVuZGVkKCkudG9TUkdCQUxvc3N5KCk7Ci0gICAg
cmV0dXJuIGFzU2ltcGxlKCkuYXNTUkdCQTxmbG9hdD4oKTsKLX0KLQogQ29sb3IgYmxlbmQoY29u
c3QgQ29sb3ImIGZyb20sIGNvbnN0IENvbG9yJiB0bywgZG91YmxlIHByb2dyZXNzKQogewogICAg
IC8vIEZJWE1FOiBFeHRlbmRlZENvbG9yIC0gbmVlZHMgdG8gaGFuZGxlIGNvbG9yIHNwYWNlcy4K
QEAgLTI5OSwyNSArMTI5LDQgQEAgQ29sb3IgYmxlbmRXaXRob3V0UHJlbXVsdGlwbHkoY29uc3Qg
Q29sbwogICAgICk7CiB9CiAKLVRleHRTdHJlYW0mIG9wZXJhdG9yPDwoVGV4dFN0cmVhbSYgdHMs
IGNvbnN0IENvbG9yJiBjb2xvcikKLXsKLSAgICByZXR1cm4gdHMgPDwgY29sb3IubmFtZUZvclJl
bmRlclRyZWVBc1RleHQoKTsKLX0KLQotVGV4dFN0cmVhbSYgb3BlcmF0b3I8PChUZXh0U3RyZWFt
JiB0cywgQ29sb3JTcGFjZSBjb2xvclNwYWNlKQotewotICAgIHN3aXRjaCAoY29sb3JTcGFjZSkg
ewotICAgIGNhc2UgQ29sb3JTcGFjZTo6U1JHQjoKLSAgICAgICAgdHMgPDwgInNSR0IiOwotICAg
ICAgICBicmVhazsKLSAgICBjYXNlIENvbG9yU3BhY2U6OkxpbmVhclJHQjoKLSAgICAgICAgdHMg
PDwgIkxpbmVhclJHQiI7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ29sb3JTcGFjZTo6RGlz
cGxheVAzOgotICAgICAgICB0cyA8PCAiRGlzcGxheVAzIjsKLSAgICAgICAgYnJlYWs7Ci0gICAg
fQotICAgIHJldHVybiB0czsKLX0KLQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3JCbGVuZGluZy5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yQmxlbmRpbmcuaAkobm9u
ZXhpc3RlbnQpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvckJsZW5k
aW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFn
bWEgb25jZQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENvbG9yOworCisvLyBUaGlz
IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFBvcnRlci1EdWZmJ3MgInNvdXJjZS1vdmVyIiBlcXVh
dGlvbgorQ29sb3IgYmxlbmRTb3VyY2VPdmVyKGNvbnN0IENvbG9yJiwgY29uc3QgQ29sb3ImKTsK
KworLy8gQmVzcG9rZSAid2hpdGVuaW5nIiBhbGdvcml0aG0gdXNlZCBieSBSZW5kZXJUaGVtZTo6
dHJhbnNmb3JtU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yLgorQ29sb3IgYmxlbmRXaXRoV2hpdGUo
Y29uc3QgQ29sb3ImKTsKKworQ29sb3IgYmxlbmQoY29uc3QgQ29sb3ImIGZyb20sIGNvbnN0IENv
bG9yJiB0bywgZG91YmxlIHByb2dyZXNzKTsKK0NvbG9yIGJsZW5kV2l0aG91dFByZW11bHRpcGx5
KGNvbnN0IENvbG9yJiBmcm9tLCBjb25zdCBDb2xvciYgdG8sIGRvdWJsZSBwcm9ncmVzcyk7CisK
K30KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvRmlsdGVy
T3BlcmF0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9maWx0ZXJzL0ZpbHRlck9wZXJhdGlvbi5jcHAJKHJldmlzaW9uIDI2MzcxMikKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2ZpbHRlcnMvRmlsdGVyT3BlcmF0aW9uLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgIkFuaW1hdGlvblV0
aWxpdGllcy5oIgogI2luY2x1ZGUgIkNhY2hlZFJlc291cmNlTG9hZGVyLmgiCiAjaW5jbHVkZSAi
Q2FjaGVkU1ZHRG9jdW1lbnRSZWZlcmVuY2UuaCIKKyNpbmNsdWRlICJDb2xvckJsZW5kaW5nLmgi
CiAjaW5jbHVkZSAiQ29sb3JNYXRyaXguaCIKICNpbmNsdWRlICJDb2xvclV0aWxpdGllcy5oIgog
I2luY2x1ZGUgIkZpbHRlckVmZmVjdC5oIgpJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlckJveE1vZGVsT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwCShyZXZpc2lvbiAyNjM3MTIpCisrKyBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAiQml0bWFwSW1hZ2UuaCIKICNpbmNs
dWRlICJCb3JkZXJFZGdlLmgiCiAjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJD
b2xvckJsZW5kaW5nLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJEb2N1bWVu
dFRpbWVsaW5lLmgiCiAjaW5jbHVkZSAiRmxvYXRSb3VuZGVkUmVjdC5oIgpAQCAtOTM0LDcgKzkz
NSw3IEBAIHZvaWQgUmVuZGVyQm94TW9kZWxPYmplY3Q6OnBhaW50RmlsbExheWUKICAgICAgICAg
ICAgIEZsb2F0UmVjdCBiYWNrZ3JvdW5kUmVjdEZvclBhaW50aW5nID0gc25hcFJlY3RUb0Rldmlj
ZVBpeGVscyhiYWNrZ3JvdW5kUmVjdCwgZGV2aWNlU2NhbGVGYWN0b3IpOwogICAgICAgICAgICAg
aWYgKGJhc2VDb2xvci5pc1Zpc2libGUoKSkgewogICAgICAgICAgICAgICAgIGlmICghYmFzZUJn
Q29sb3JPbmx5ICYmIGJnQ29sb3IuaXNWaXNpYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgIGJh
c2VDb2xvciA9IGJhc2VDb2xvci5ibGVuZChiZ0NvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAg
YmFzZUNvbG9yID0gYmxlbmRTb3VyY2VPdmVyKGJhc2VDb2xvciwgYmdDb2xvcik7CiAgICAgICAg
ICAgICAgICAgY29udGV4dC5maWxsUmVjdChiYWNrZ3JvdW5kUmVjdEZvclBhaW50aW5nLCBiYXNl
Q29sb3IsIENvbXBvc2l0ZU9wZXJhdG9yOjpDb3B5KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAo
IWJhc2VCZ0NvbG9yT25seSAmJiBiZ0NvbG9yLmlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAg
ICAgYXV0byBvcGVyYXRpb24gPSBjb250ZXh0LmNvbXBvc2l0ZU9wZXJhdGlvbigpOwpJbmRleDog
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck1lbnVMaXN0LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTWVudUxpc3QuY3BwCShyZXZpc2lvbiAy
NjM3MTIpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTWVudUxpc3QuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAiQWNjZXNzaWJpbGl0eU1l
bnVMaXN0LmgiCiAjaW5jbHVkZSAiQ1NTRm9udFNlbGVjdG9yLmgiCiAjaW5jbHVkZSAiQ2hyb21l
LmgiCisjaW5jbHVkZSAiQ29sb3JCbGVuZGluZy5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5j
bHVkZSAiRnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCkBAIC01MzIsMTQgKzUz
MywxNCBAQCB2b2lkIFJlbmRlck1lbnVMaXN0OjpnZXRJdGVtQmFja2dyb3VuZENvCiAgICAgfQog
CiAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgaXRlbSdzIGJhY2tncm91bmQgaXMgb3ZlcmxheWVkIG9u
IHRvcCBvZiB0aGUgbWVudSBiYWNrZ3JvdW5kLgotICAgIGJhY2tncm91bmRDb2xvciA9IHN0eWxl
KCkudmlzaXRlZERlcGVuZGVudENvbG9yV2l0aENvbG9yRmlsdGVyKENTU1Byb3BlcnR5QmFja2dy
b3VuZENvbG9yKS5ibGVuZChiYWNrZ3JvdW5kQ29sb3IpOworICAgIGJhY2tncm91bmRDb2xvciA9
IGJsZW5kU291cmNlT3ZlcihzdHlsZSgpLnZpc2l0ZWREZXBlbmRlbnRDb2xvcldpdGhDb2xvckZp
bHRlcihDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvciksIGJhY2tncm91bmRDb2xvcik7CiAgICAg
aWYgKGJhY2tncm91bmRDb2xvci5pc09wYXF1ZSgpKSB7CiAgICAgICAgIGl0ZW1CYWNrZ3JvdW5k
Q29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICAv
LyBJZiB0aGUgbWVudSBiYWNrZ3JvdW5kIGlzIG5vdCBvcGFxdWUsIHRoZW4gYWRkIGFuIG9wYXF1
ZSB3aGl0ZSBiYWNrZ3JvdW5kIGJlaGluZC4KLSAgICBpdGVtQmFja2dyb3VuZENvbG9yID0gQ29s
b3IoQ29sb3I6OndoaXRlKS5ibGVuZChiYWNrZ3JvdW5kQ29sb3IpOworICAgIGl0ZW1CYWNrZ3Jv
dW5kQ29sb3IgPSBibGVuZFNvdXJjZU92ZXIoQ29sb3I6OndoaXRlLCBiYWNrZ3JvdW5kQ29sb3Ip
OwogfQogCiBQb3B1cE1lbnVTdHlsZSBSZW5kZXJNZW51TGlzdDo6bWVudVN0eWxlKCkgY29uc3QK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZS5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lLmNwcAkocmV2aXNpb24g
MjYzNzEyKQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCiAK
ICNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAiQ29sb3JCbGVuZGluZy5o
IgogI2luY2x1ZGUgIkNvbnRyb2xTdGF0ZXMuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgogI2lu
Y2x1ZGUgIkZpbGVMaXN0LmgiCkBAIC02MTYsNyArNjE3LDcgQEAgQ29sb3IgUmVuZGVyVGhlbWU6
OmluYWN0aXZlU2VsZWN0aW9uQmFjawogCiBDb2xvciBSZW5kZXJUaGVtZTo6dHJhbnNmb3JtU2Vs
ZWN0aW9uQmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiBjb2xvciwgT3B0aW9uU2V0PFN0eWxl
Q29sb3I6Ok9wdGlvbnM+KSBjb25zdAogewotICAgIHJldHVybiBjb2xvci5ibGVuZFdpdGhXaGl0
ZSgpOworICAgIHJldHVybiBibGVuZFdpdGhXaGl0ZShjb2xvcik7CiB9CiAKIENvbG9yIFJlbmRl
clRoZW1lOjphY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoT3B0aW9uU2V0PFN0eWxlQ29s
b3I6Ok9wdGlvbnM+IG9wdGlvbnMpIGNvbnN0Cg==
</data>
<flag name="commit-queue"
          id="418527"
          type_id="3"
          status="-"
          setter="ews-feeder"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>403230</attachid>
            <date>2020-06-30 13:01:46 -0700</date>
            <delta_ts>2020-06-30 15:50:38 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-213742-20200630130145.patch</filename>
            <type>text/plain</type>
            <size>26877</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDI2Mzc2MCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ2IEBACisyMDIwLTA2LTMwICBTYW0gV2Vp
bmlnICA8d2VpbmlnQGFwcGxlLmNvbT4KKworICAgICAgICBNb3ZlIENvbG9yIGJsZW5kaW5nIHJl
bGF0ZWQgZnVuY3Rpb25zIHRvIHRoZWlyIG93biBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjEzNzQyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
RGVhbiBKYWNrc29uLgorCisgICAgICAgIC0gTW92ZXMgQ29sb3I6OmJsZW5kKGNvbnN0IENvbG9y
JiksIENvbG9yOjpibGVuZFdpdGhXaGl0ZSgpLCBibGVuZChjb25zdCBDb2xvciYsIGNvbnN0IENv
bG9yJiwgZG91YmxlKQorICAgICAgICAgIGFuZCBibGVuZFdpdGhvdXRQcmVtdWx0aXBseShjb25z
dCBDb2xvciYsIGNvbnN0IENvbG9yJiwgZG91YmxlKSB0byB0aGVpciBvd24gZmlsZXM6IENvbG9y
QmxlbmRpbmcuaC9jcHAKKyAgICAgICAgLSBSZW5hbWVzIENvbG9yOjpibGVuZChjb25zdCBDb2xv
ciYpIHRvIGJsZW5kU291cmNlT3Zlcihjb25zdCBDb2xvciYsIGNvbnN0IENvbG9yJikgCisgICAg
ICAgIC0gUmVuYW1lcyBDb2xvcjo6YmxlbmRXaXRoV2hpdGUoKSB0byBibGVuZFdpdGhXaGl0ZShj
b25zdCBDb2xvciYpLgorCisgICAgICAgICogU291cmNlcy50eHQ6CisgICAgICAgICogV2ViQ29y
ZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICBBZGQgbmV3IGZpbGVzLgorCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
Q29sb3I6OmJsZW5kIGNvbnN0KTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbG9yOjpi
bGVuZFdpdGhXaGl0ZSBjb25zdCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpibGVuZCk6
IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpibGVuZFdpdGhvdXRQcmVtdWx0aXBseSk6IERl
bGV0ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9Db2xvckJsZW5kaW5nLmNwcDogQ29waWVkIGZyb20gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuY3BwLgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL0NvbG9yQmxlbmRpbmcuaDogQWRkZWQuCisgICAgICAgIE1vdmUgZGVjbGFyYXRpb25z
IC8gaW1wbGVtZW50YXRpb25zIGZyb20gQ29sb3IuaC9jcHAgdG8gQ29sb3JCbGVuZGluZy5oL2Nw
cC4KKworICAgICAgICAqIGNzcy9DU1NHcmFkaWVudFZhbHVlLmNwcDoKKyAgICAgICAgKiBlZGl0
aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNhcmV0QmFzZTo6Y29t
cHV0ZUNhcmV0Q29sb3IpOgorICAgICAgICAqIHBhZ2UvRnJhbWVWaWV3LmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkZyYW1lVmlldzo6ZG9jdW1lbnRCYWNrZ3JvdW5kQ29sb3IgY29uc3QpOgorICAg
ICAgICAqIHBhZ2UvVGV4dEluZGljYXRvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjplc3RpbWF0
ZWRCYWNrZ3JvdW5kQ29sb3JGb3JSYW5nZSk6CisgICAgICAgICogcGFnZS9hbmltYXRpb24vQ1NT
UHJvcGVydHlBbmltYXRpb24uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2ZpbHRl
cnMvRmlsdGVyT3BlcmF0aW9uLmNwcDoKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQm94TW9k
ZWxPYmplY3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQm94TW9kZWxPYmplY3Q6OnBh
aW50RmlsbExheWVyRXh0ZW5kZWQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJNZW51TGlz
dC5jcHA6CisgICAgICAgIChSZW5kZXJNZW51TGlzdDo6Z2V0SXRlbUJhY2tncm91bmRDb2xvciBj
b25zdCk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRoZW1lLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lOjp0cmFuc2Zvcm1TZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IgY29u
c3QpOgorICAgICAgICBVcGRhdGUgZm9yIG5ldyBzaWduYXR1cmVzIGFuZCAjaW5jbHVkZSBDb2xv
ckJsZW5kaW5nLmggYXMgbmVlZWRlZC4KKwogMjAyMC0wNi0zMCAgUGVuZyBMaXUgIDxwZW5nLmxp
dTZAYXBwbGUuY29tPgogCiAgICAgICAgIFNjcnVuY2hpbmcgYSB2aWRlbyB0byBQaVAgY2FuIHJl
c3VsdCBpbiBicm9rZW4gYW5pbWF0aW9uIGFuZCBsZWF2ZSBTYWZhcmkgaW4gYSBiYWQgc3RhdGUK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL1NvdXJjZXMudHh0CShyZXZpc2lvbiAyNjM3NTgpCisrKyBTb3VyY2UvV2ViQ29yZS9T
b3VyY2VzLnR4dAkod29ya2luZyBjb3B5KQpAQCAtMTkwNyw2ICsxOTA3LDcgQEAgcGxhdGZvcm0v
ZW5jcnlwdGVkbWVkaWEvQ0RNUHJveHkuY3BwCiBwbGF0Zm9ybS9ncmFwaGljcy9BTkdMRVdlYktp
dEJyaWRnZS5jcHAKIHBsYXRmb3JtL2dyYXBoaWNzL0JpdG1hcEltYWdlLmNwcAogcGxhdGZvcm0v
Z3JhcGhpY3MvQ29sb3IuY3BwCitwbGF0Zm9ybS9ncmFwaGljcy9Db2xvckJsZW5kaW5nLmNwcAog
cGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3JVdGlsaXRpZXMuY3BwCiBwbGF0Zm9ybS9ncmFwaGljcy9D
b21wbGV4VGV4dENvbnRyb2xsZXIuY3BwCiBwbGF0Zm9ybS9ncmFwaGljcy9Dcm9zc2ZhZGVHZW5l
cmF0ZWRJbWFnZS5jcHAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDI2Mzc1OCkKKysrIFNvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtOTk2
Myw2ICs5OTYzLDggQEAKIAkJN0MxOTNCRkMxRjVFMTBDNTAwODhGM0U2IC8qIEpTSW1hZ2VTbW9v
dGhpbmdRdWFsaXR5LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTSW1hZ2VTbW9vdGhpbmdRdWFsaXR5Lmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTdDMTkzQkZEMUY1RTEwRDYwMDg4RjNFNiAv
KiBKU1BhdGgyRC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU1BhdGgyRC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTdDMTkzQkZFMUY1RTEwRDcwMDg4RjNFNiAvKiBKU1BhdGgy
RC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBKU1BhdGgyRC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OworCQk3QzFCNEE2NTI0QTk5NzU5MDAzMzcyN0YgLyogQ29sb3JCbGVuZGluZy5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBDb2xvckJsZW5kaW5nLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJN0MxQjRBNjcyNEE5OTc2NjAwMzM3MjdGIC8qIENvbG9yQmxlbmRpbmcuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gQ29sb3JCbGVuZGluZy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3
QzFFOENGRjFFRDBDMkJFMDBCMUQ5ODMgLyogQmVmb3JlVW5sb2FkRXZlbnQuaWRsICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gdGV4dDsgcGF0aCA9IEJlZm9yZVVubG9hZEV2ZW50LmlkbDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJN0MxRThEMDAxRUQwQzJCRTAwQjFEOTgzIC8qIENhbGxiYWNrUmVzdWx0Lmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENhbGxiYWNrUmVzdWx0Lmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTdDMUU5NzI1MUE5Rjk4MzQwMDdCRjBGQiAvKiBBdXRv
RmlsbEJ1dHRvbkVsZW1lbnQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gQXV0b0ZpbGxCdXR0b25FbGVtZW50LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
QEAgLTI1NDkzLDYgKzI1NDk1LDggQEAKIAkJCQlBODk5NDMyNjBCNDIzMzg3MDBEN0M4MDIgLyog
Qml0bWFwSW1hZ2UuaCAqLywKIAkJCQlCMjc1MzUzODBCMDUzODE0MDAyQ0U2NEYgLyogQ29sb3Iu
Y3BwICovLAogCQkJCUIyNzUzNTM5MEIwNTM4MTQwMDJDRTY0RiAvKiBDb2xvci5oICovLAorCQkJ
CTdDMUI0QTY1MjRBOTk3NTkwMDMzNzI3RiAvKiBDb2xvckJsZW5kaW5nLmNwcCAqLywKKwkJCQk3
QzFCNEE2NzI0QTk5NzY2MDAzMzcyN0YgLyogQ29sb3JCbGVuZGluZy5oICovLAogCQkJCTdDQUM2
QUVDMjQ3RjFDNTEwMEU2MUQ1OSAvKiBDb2xvckNvbXBvbmVudHMuaCAqLywKIAkJCQkzMTAzQjdE
RTFEQjAxNTU2MDA4QkI4OTAgLyogQ29sb3JIYXNoLmggKi8sCiAJCQkJN0NBQzZBRTgyNDdGMDgy
MDAwRTYxRDU5IC8qIENvbG9yTWF0cml4LmggKi8sCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3Mv
Q1NTR3JhZGllbnRWYWx1ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NT
U0dyYWRpZW50VmFsdWUuY3BwCShyZXZpc2lvbiAyNjM3NTgpCisrKyBTb3VyY2UvV2ViQ29yZS9j
c3MvQ1NTR3JhZGllbnRWYWx1ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDYgKzI5LDcgQEAK
ICNpbmNsdWRlICJDU1NDYWxjdWxhdGlvblZhbHVlLmgiCiAjaW5jbHVkZSAiQ1NTVG9MZW5ndGhD
b252ZXJzaW9uRGF0YS5oIgogI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRl
ICJDb2xvckJsZW5kaW5nLmgiCiAjaW5jbHVkZSAiRmxvYXRTaXplLmgiCiAjaW5jbHVkZSAiR3Jh
ZGllbnQuaCIKICNpbmNsdWRlICJHcmFkaWVudEltYWdlLmgiCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAkocmV2aXNpb24gMjYzNzU4KQorKysgU291cmNl
L1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4
LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgIkFYT2JqZWN0Q2FjaGUuaCIKICNpbmNsdWRlICJDaGFy
YWN0ZXJEYXRhLmgiCisjaW5jbHVkZSAiQ29sb3JCbGVuZGluZy5oIgogI2luY2x1ZGUgIkRlbGV0
ZVNlbGVjdGlvbkNvbW1hbmQuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgogI2luY2x1ZGUgIkVk
aXRpbmcuaCIKQEAgLTE4MDAsNyArMTgwMSw3IEBAIENvbG9yIENhcmV0QmFzZTo6Y29tcHV0ZUNh
cmV0Q29sb3IoY29uc3QKICAgICBpZiAoIWVsZW1lbnRTdHlsZS5jYXJldENvbG9yKCkuaXNWYWxp
ZCgpICYmIHJvb3RFZGl0YWJsZVN0eWxlKSB7CiAgICAgICAgIGF1dG8gcm9vdEVkaXRhYmxlQmFj
a2dyb3VuZENvbG9yID0gcm9vdEVkaXRhYmxlU3R5bGUtPnZpc2l0ZWREZXBlbmRlbnRDb2xvcldp
dGhDb2xvckZpbHRlcihDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvcik7CiAgICAgICAgIGF1dG8g
ZWxlbWVudEJhY2tncm91bmRDb2xvciA9IGVsZW1lbnRTdHlsZS52aXNpdGVkRGVwZW5kZW50Q29s
b3JXaXRoQ29sb3JGaWx0ZXIoQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICBh
dXRvIGRpc2FwcGVhcnNJbnRvQmFja2dyb3VuZCA9IHJvb3RFZGl0YWJsZUJhY2tncm91bmRDb2xv
ci5ibGVuZChlbGVtZW50QmFja2dyb3VuZENvbG9yKSA9PSByb290RWRpdGFibGVCYWNrZ3JvdW5k
Q29sb3I7CisgICAgICAgIGF1dG8gZGlzYXBwZWFyc0ludG9CYWNrZ3JvdW5kID0gYmxlbmRTb3Vy
Y2VPdmVyKHJvb3RFZGl0YWJsZUJhY2tncm91bmRDb2xvciwgZWxlbWVudEJhY2tncm91bmRDb2xv
cikgPT0gcm9vdEVkaXRhYmxlQmFja2dyb3VuZENvbG9yOwogICAgICAgICBpZiAoZGlzYXBwZWFy
c0ludG9CYWNrZ3JvdW5kKQogICAgICAgICAgICAgcmV0dXJuIHJvb3RFZGl0YWJsZVN0eWxlLT52
aXNpdGVkRGVwZW5kZW50Q29sb3JXaXRoQ29sb3JGaWx0ZXIoQ1NTUHJvcGVydHlDYXJldENvbG9y
KTsKICAgICB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGFnZS9GcmFtZVZpZXcuY3BwCShyZXZpc2lvbiAyNjM3
NTgpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJDYWNoZWRSZXNvdXJjZUxvYWRlci5oIgogI2lu
Y2x1ZGUgIkNocm9tZS5oIgogI2luY2x1ZGUgIkNocm9tZUNsaWVudC5oIgorI2luY2x1ZGUgIkNv
bG9yQmxlbmRpbmcuaCIKICNpbmNsdWRlICJET01XaW5kb3cuaCIKICNpbmNsdWRlICJEZWJ1Z1Bh
Z2VPdmVybGF5cy5oIgogI2luY2x1ZGUgIkRlcHJlY2F0ZWRHbG9iYWxTZXR0aW5ncy5oIgpAQCAt
NDAzNywxMSArNDAzOCwxMSBAQCBDb2xvciBGcmFtZVZpZXc6OmRvY3VtZW50QmFja2dyb3VuZENv
bG9yCiAgICAgaWYgKCFib2R5QmFja2dyb3VuZENvbG9yLmlzVmFsaWQoKSkgewogICAgICAgICBp
ZiAoIWh0bWxCYWNrZ3JvdW5kQ29sb3IuaXNWYWxpZCgpKQogICAgICAgICAgICAgcmV0dXJuIENv
bG9yKCk7Ci0gICAgICAgIHJldHVybiBiYXNlQmFja2dyb3VuZENvbG9yKCkuYmxlbmQoaHRtbEJh
Y2tncm91bmRDb2xvcik7CisgICAgICAgIHJldHVybiBibGVuZFNvdXJjZU92ZXIoYmFzZUJhY2tn
cm91bmRDb2xvcigpLCBodG1sQmFja2dyb3VuZENvbG9yKTsKICAgICB9CiAKICAgICBpZiAoIWh0
bWxCYWNrZ3JvdW5kQ29sb3IuaXNWYWxpZCgpKQotICAgICAgICByZXR1cm4gYmFzZUJhY2tncm91
bmRDb2xvcigpLmJsZW5kKGJvZHlCYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICByZXR1cm4gYmxl
bmRTb3VyY2VPdmVyKGJhc2VCYWNrZ3JvdW5kQ29sb3IoKSwgYm9keUJhY2tncm91bmRDb2xvcik7
CiAKICAgICAvLyBXZSB0YWtlIHRoZSBhZ2dyZWdhdGUgb2YgdGhlIGJhc2UgYmFja2dyb3VuZCBj
b2xvcgogICAgIC8vIHRoZSA8aHRtbD4gYmFja2dyb3VuZCBjb2xvciwgYW5kIHRoZSA8Ym9keT4K
QEAgLTQwNTAsNyArNDA1MSw3IEBAIENvbG9yIEZyYW1lVmlldzo6ZG9jdW1lbnRCYWNrZ3JvdW5k
Q29sb3IKICAgICAvLyB0ZWNobmljYWxseSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBiYWNrZ3JvdW5k
LCBidXQgaXQKICAgICAvLyBvdGhlcndpc2UgcG9zZXMgcHJvYmxlbXMgd2hlbiB0aGUgYWdncmVn
YXRlIGlzIG5vdAogICAgIC8vIGZ1bGx5IG9wYXF1ZS4KLSAgICByZXR1cm4gYmFzZUJhY2tncm91
bmRDb2xvcigpLmJsZW5kKGh0bWxCYWNrZ3JvdW5kQ29sb3IpLmJsZW5kKGJvZHlCYWNrZ3JvdW5k
Q29sb3IpOworICAgIHJldHVybiBibGVuZFNvdXJjZU92ZXIoYmxlbmRTb3VyY2VPdmVyKGJhc2VC
YWNrZ3JvdW5kQ29sb3IoKSwgaHRtbEJhY2tncm91bmRDb2xvciksIGJvZHlCYWNrZ3JvdW5kQ29s
b3IpOwogfQogCiBib29sIEZyYW1lVmlldzo6aGFzQ3VzdG9tU2Nyb2xsYmFycygpIGNvbnN0Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL1RleHRJbmRpY2F0b3IuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BhZ2UvVGV4dEluZGljYXRvci5jcHAJKHJldmlzaW9uIDI2Mzc1OCkK
KysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvVGV4dEluZGljYXRvci5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJUZXh0SW5k
aWNhdG9yLmgiCiAKKyNpbmNsdWRlICJDb2xvckJsZW5kaW5nLmgiCiAjaW5jbHVkZSAiQ29sb3JI
YXNoLmgiCiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJFZGl0b3IuaCIKQEAgLTI0
OSw3ICsyNTAsNyBAQCBzdGF0aWMgQ29sb3IgZXN0aW1hdGVkQmFja2dyb3VuZENvbG9yRm9yCiAg
ICAgfQogICAgIHBhcmVudFJlbmRlcmVyQmFja2dyb3VuZENvbG9ycy5yZXZlcnNlKCk7CiAgICAg
Zm9yIChjb25zdCBhdXRvJiBiYWNrZ3JvdW5kQ29sb3IgOiBwYXJlbnRSZW5kZXJlckJhY2tncm91
bmRDb2xvcnMpCi0gICAgICAgIGVzdGltYXRlZEJhY2tncm91bmRDb2xvciA9IGVzdGltYXRlZEJh
Y2tncm91bmRDb2xvci5ibGVuZChiYWNrZ3JvdW5kQ29sb3IpOworICAgICAgICBlc3RpbWF0ZWRC
YWNrZ3JvdW5kQ29sb3IgPSBibGVuZFNvdXJjZU92ZXIoZXN0aW1hdGVkQmFja2dyb3VuZENvbG9y
LCBiYWNrZ3JvdW5kQ29sb3IpOwogCiAgICAgcmV0dXJuIGVzdGltYXRlZEJhY2tncm91bmRDb2xv
cjsKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0NTU1Byb3BlcnR5QW5p
bWF0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9D
U1NQcm9wZXJ0eUFuaW1hdGlvbi5jcHAJKHJldmlzaW9uIDI2Mzc1OCkKKysrIFNvdXJjZS9XZWJD
b3JlL3BhZ2UvYW5pbWF0aW9uL0NTU1Byb3BlcnR5QW5pbWF0aW9uLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCiAjaW5jbHVkZSAi
Q2FsY3VsYXRpb25WYWx1ZS5oIgogI2luY2x1ZGUgIkNsaXBQYXRoT3BlcmF0aW9uLmgiCisjaW5j
bHVkZSAiQ29sb3JCbGVuZGluZy5oIgogI2luY2x1ZGUgIkZsb2F0Q29udmVyc2lvbi5oIgogI2lu
Y2x1ZGUgIkZvbnRDYXNjYWRlLmgiCiAjaW5jbHVkZSAiRm9udFNlbGVjdGlvbkFsZ29yaXRobS5o
IgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmNwcAkocmV2
aXNpb24gMjYzNzU4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3Iu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDQsNjUgKzE0NCw2IEBAIGZsb2F0IENvbG9yOjpsdW1p
bmFuY2UoKSBjb25zdAogICAgIHJldHVybiBXZWJDb3JlOjpsdW1pbmFuY2UodG9TUkdCQUxvc3N5
KCkpOwogfQogCi1Db2xvciBDb2xvcjo6YmxlbmQoY29uc3QgQ29sb3ImIHNvdXJjZSkgY29uc3QK
LXsKLSAgICBpZiAoIWlzVmlzaWJsZSgpIHx8IHNvdXJjZS5pc09wYXF1ZSgpKQotICAgICAgICBy
ZXR1cm4gc291cmNlOwotCi0gICAgaWYgKCFzb3VyY2UuYWxwaGEoKSkKLSAgICAgICAgcmV0dXJu
ICp0aGlzOwotCi0gICAgYXV0byBbc2VsZlIsIHNlbGZHLCBzZWxmQiwgc2VsZkFdID0gdG9TUkdC
QVNpbXBsZUNvbG9yTG9zc3koKTsKLSAgICBhdXRvIFtzb3VyY2VSLCBzb3VyY2VHLCBzb3VyY2VC
LCBzb3VyY2VBXSA9IHNvdXJjZS50b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpOwotCi0gICAgaW50
IGQgPSAweEZGICogKHNlbGZBICsgc291cmNlQSkgLSBzZWxmQSAqIHNvdXJjZUE7Ci0gICAgaW50
IGEgPSBkIC8gMHhGRjsKLSAgICBpbnQgciA9IChzZWxmUiAqIHNlbGZBICogKDB4RkYgLSBzb3Vy
Y2VBKSArIDB4RkYgKiBzb3VyY2VBICogc291cmNlUikgLyBkOwotICAgIGludCBnID0gKHNlbGZH
ICogc2VsZkEgKiAoMHhGRiAtIHNvdXJjZUEpICsgMHhGRiAqIHNvdXJjZUEgKiBzb3VyY2VHKSAv
IGQ7Ci0gICAgaW50IGIgPSAoc2VsZkIgKiBzZWxmQSAqICgweEZGIC0gc291cmNlQSkgKyAweEZG
ICogc291cmNlQSAqIHNvdXJjZUIpIC8gZDsKLQotICAgIHJldHVybiBtYWtlU2ltcGxlQ29sb3Io
ciwgZywgYiwgYSk7Ci19Ci0KLUNvbG9yIENvbG9yOjpibGVuZFdpdGhXaGl0ZSgpIGNvbnN0Ci17
Ci0gICAgY29uc3RleHByIGludCBzdGFydEFscGhhID0gMTUzOyAvLyA2MCUKLSAgICBjb25zdGV4
cHIgaW50IGVuZEFscGhhID0gMjA0OyAvLyA4MCU7Ci0gICAgY29uc3RleHByIGludCBhbHBoYUlu
Y3JlbWVudCA9IDE3OwotCi0gICAgYXV0byBibGVuZENvbXBvbmVudCA9IFtdKGludCBjLCBpbnQg
YSkgLT4gaW50IHsKLSAgICAgICAgZmxvYXQgYWxwaGEgPSBhIC8gMjU1LjBmOwotICAgICAgICBp
bnQgd2hpdGVCbGVuZCA9IDI1NSAtIGE7Ci0gICAgICAgIGMgLT0gd2hpdGVCbGVuZDsKLSAgICAg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYyAvIGFscGhhKTsKLSAgICB9OwotCi0gICAgLy8g
SWYgdGhlIGNvbG9yIGNvbnRhaW5zIGFscGhhIGFscmVhZHksIHdlIGxlYXZlIGl0IGFsb25lLgot
ICAgIGlmICghaXNPcGFxdWUoKSkKLSAgICAgICAgcmV0dXJuICp0aGlzOwotCi0gICAgYXV0byBb
ZXhpc3RpbmdSLCBleGlzdGluZ0csIGV4aXN0aW5nQiwgZXhpc3RpbmdBbHBoYV0gPSB0b1NSR0JB
U2ltcGxlQ29sb3JMb3NzeSgpOwotCi0gICAgQ29sb3IgcmVzdWx0OwotICAgIGZvciAoaW50IGFs
cGhhID0gc3RhcnRBbHBoYTsgYWxwaGEgPD0gZW5kQWxwaGE7IGFscGhhICs9IGFscGhhSW5jcmVt
ZW50KSB7Ci0gICAgICAgIC8vIFdlIGhhdmUgYSBzb2xpZCBjb2xvci4gIENvbnZlcnQgdG8gYW4g
ZXF1aXZhbGVudCBjb2xvciB0aGF0IGxvb2tzIHRoZSBzYW1lIHdoZW4gYmxlbmRlZCB3aXRoIHdo
aXRlCi0gICAgICAgIC8vIGF0IHRoZSBjdXJyZW50IGFscGhhLiAgVHJ5IHVzaW5nIGxlc3MgdHJh
bnNwYXJlbmN5IGlmIHRoZSBudW1iZXJzIGVuZCB1cCBiZWluZyBuZWdhdGl2ZS4KLSAgICAgICAg
aW50IHIgPSBibGVuZENvbXBvbmVudChleGlzdGluZ1IsIGFscGhhKTsKLSAgICAgICAgaW50IGcg
PSBibGVuZENvbXBvbmVudChleGlzdGluZ0csIGFscGhhKTsKLSAgICAgICAgaW50IGIgPSBibGVu
ZENvbXBvbmVudChleGlzdGluZ0IsIGFscGhhKTsKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9
IG1ha2VTaW1wbGVDb2xvcihyLCBnLCBiLCBhbHBoYSk7Ci0KLSAgICAgICAgaWYgKHIgPj0gMCAm
JiBnID49IDAgJiYgYiA+PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8g
RklYTUU6IFdoeSBpcyBwcmVzZXJ2aW5nIHRoZSBzZW1hbnRpYyBiaXQgZGVzaXJlZCBhbmQvb3Ig
Y29ycmVjdCBoZXJlPwotICAgIGlmIChpc1NlbWFudGljKCkpCi0gICAgICAgIHJlc3VsdC50YWdB
c1NlbWFudGljKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogQ29sb3IgQ29sb3I6OmNvbG9y
V2l0aEFscGhhKGZsb2F0IGFscGhhKSBjb25zdAogewogICAgIGlmIChpc0V4dGVuZGVkKCkpCkBA
IC0yNTIsNDUgKzE5Myw2IEBAIFNSR0JBPGZsb2F0PiBDb2xvcjo6dG9TUkdCQUxvc3N5KCkgY29u
c3QKICAgICByZXR1cm4gYXNTaW1wbGUoKS5hc1NSR0JBPGZsb2F0PigpOwogfQogCi1Db2xvciBi
bGVuZChjb25zdCBDb2xvciYgZnJvbSwgY29uc3QgQ29sb3ImIHRvLCBkb3VibGUgcHJvZ3Jlc3Mp
Ci17Ci0gICAgLy8gRklYTUU6IEV4dGVuZGVkQ29sb3IgLSBuZWVkcyB0byBoYW5kbGUgY29sb3Ig
c3BhY2VzLgotICAgIC8vIFdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIHN0YXRlIG9mIHRoZSB2YWxp
ZCBmbGFnIGF0IHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbgotICAgIGlmIChwcm9ncmVzcyA9PSAx
ICYmICF0by5pc1ZhbGlkKCkpCi0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICAvLyBTaW5jZSBw
cmVtdWx0aXBseUNlaWxpbmcoKSBiYWlscyBvbiB6ZXJvIGFscGhhLCBzcGVjaWFsLWNhc2UgdGhh
dC4KLSAgICBhdXRvIHByZW11bHRpcGxpZWRGcm9tID0gZnJvbS5hbHBoYSgpID8gcHJlbXVsdGlw
bHlDZWlsaW5nKGZyb20udG9TUkdCQVNpbXBsZUNvbG9yTG9zc3koKSkgOiBDb2xvcjo6dHJhbnNw
YXJlbnQ7Ci0gICAgYXV0byBwcmVtdWx0aXBsaWVkVG8gPSB0by5hbHBoYSgpID8gcHJlbXVsdGlw
bHlDZWlsaW5nKHRvLnRvU1JHQkFTaW1wbGVDb2xvckxvc3N5KCkpIDogQ29sb3I6OnRyYW5zcGFy
ZW50OwotCi0gICAgU2ltcGxlQ29sb3IgcHJlbXVsdEJsZW5kZWQgPSBtYWtlU2ltcGxlQ29sb3Io
Ci0gICAgICAgIFdlYkNvcmU6OmJsZW5kKHByZW11bHRpcGxpZWRGcm9tLnJlZENvbXBvbmVudCgp
LCBwcmVtdWx0aXBsaWVkVG8ucmVkQ29tcG9uZW50KCksIHByb2dyZXNzKSwKLSAgICAgICAgV2Vi
Q29yZTo6YmxlbmQocHJlbXVsdGlwbGllZEZyb20uZ3JlZW5Db21wb25lbnQoKSwgcHJlbXVsdGlw
bGllZFRvLmdyZWVuQ29tcG9uZW50KCksIHByb2dyZXNzKSwKLSAgICAgICAgV2ViQ29yZTo6Ymxl
bmQocHJlbXVsdGlwbGllZEZyb20uYmx1ZUNvbXBvbmVudCgpLCBwcmVtdWx0aXBsaWVkVG8uYmx1
ZUNvbXBvbmVudCgpLCBwcm9ncmVzcyksCi0gICAgICAgIFdlYkNvcmU6OmJsZW5kKHByZW11bHRp
cGxpZWRGcm9tLmFscGhhQ29tcG9uZW50KCksIHByZW11bHRpcGxpZWRUby5hbHBoYUNvbXBvbmVu
dCgpLCBwcm9ncmVzcykKLSAgICApOwotCi0gICAgcmV0dXJuIHVucHJlbXVsdGlwbHkocHJlbXVs
dEJsZW5kZWQpOwotfQotCi1Db2xvciBibGVuZFdpdGhvdXRQcmVtdWx0aXBseShjb25zdCBDb2xv
ciYgZnJvbSwgY29uc3QgQ29sb3ImIHRvLCBkb3VibGUgcHJvZ3Jlc3MpCi17Ci0gICAgLy8gRklY
TUU6IEV4dGVuZGVkQ29sb3IgLSBuZWVkcyB0byBoYW5kbGUgY29sb3Igc3BhY2VzLgotICAgIC8v
IFdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIHN0YXRlIG9mIHRoZSB2YWxpZCBmbGFnIGF0IHRoZSBl
bmQgb2YgdGhlIGFuaW1hdGlvbgotICAgIGlmIChwcm9ncmVzcyA9PSAxICYmICF0by5pc1ZhbGlk
KCkpCi0gICAgICAgIHJldHVybiB7IH07Ci0KLSAgICBhdXRvIGZyb21TUkdCID0gZnJvbS50b1NS
R0JBU2ltcGxlQ29sb3JMb3NzeSgpOwotICAgIGF1dG8gdG9TUkdCID0gZnJvbS50b1NSR0JBU2lt
cGxlQ29sb3JMb3NzeSgpOwotCi0gICAgcmV0dXJuIG1ha2VTaW1wbGVDb2xvcigKLSAgICAgICAg
V2ViQ29yZTo6YmxlbmQoZnJvbVNSR0IucmVkQ29tcG9uZW50KCksIHRvU1JHQi5yZWRDb21wb25l
bnQoKSwgcHJvZ3Jlc3MpLAotICAgICAgICBXZWJDb3JlOjpibGVuZChmcm9tU1JHQi5ncmVlbkNv
bXBvbmVudCgpLCB0b1NSR0IuZ3JlZW5Db21wb25lbnQoKSwgcHJvZ3Jlc3MpLAotICAgICAgICBX
ZWJDb3JlOjpibGVuZChmcm9tU1JHQi5ibHVlQ29tcG9uZW50KCksIHRvU1JHQi5ibHVlQ29tcG9u
ZW50KCksIHByb2dyZXNzKSwKLSAgICAgICAgV2ViQ29yZTo6YmxlbmQoZnJvbVNSR0IuYWxwaGFD
b21wb25lbnQoKSwgdG9TUkdCLmFscGhhQ29tcG9uZW50KCksIHByb2dyZXNzKQotICAgICk7Ci19
Ci0KIFRleHRTdHJlYW0mIG9wZXJhdG9yPDwoVGV4dFN0cmVhbSYgdHMsIGNvbnN0IENvbG9yJiBj
b2xvcikKIHsKICAgICByZXR1cm4gdHMgPDwgY29sb3IubmFtZUZvclJlbmRlclRyZWVBc1RleHQo
KTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0NvbG9yLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuaAkocmV2aXNp
b24gMjYzNzU4KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3IuaAko
d29ya2luZyBjb3B5KQpAQCAtMTQzLDEwICsxNDMsNiBAQCBwdWJsaWM6CiAgICAgLy8gRklYTUU6
IFJlcGxhY2UgcmVtYWluaW5nIHVzZXMgd2l0aCBsdW1pbmFuY2UuCiAgICAgV0VCQ09SRV9FWFBP
UlQgZmxvYXQgbGlnaHRuZXNzKCkgY29uc3Q7CiAKLSAgICAvLyBUaGlzIGlzIGFuIGltcGxlbWVu
dGF0aW9uIG9mIFBvcnRlci1EdWZmJ3MgInNvdXJjZS1vdmVyIiBlcXVhdGlvbgotICAgIENvbG9y
IGJsZW5kKGNvbnN0IENvbG9yJikgY29uc3Q7Ci0gICAgQ29sb3IgYmxlbmRXaXRoV2hpdGUoKSBj
b25zdDsKLQogICAgIENvbG9yIGludmVydGVkQ29sb3JXaXRoQWxwaGEoT3B0aW9uYWw8ZmxvYXQ+
IGFscGhhKSBjb25zdDsKICAgICBDb2xvciBpbnZlcnRlZENvbG9yV2l0aEFscGhhKGZsb2F0IGFs
cGhhKSBjb25zdDsKIApAQCAtMjM4LDkgKzIzNCw2IEBAIGJvb2wgb3BlcmF0b3IhPShjb25zdCBD
b2xvciYsIGNvbnN0IENvbG8KIC8vIE9uZSBvciBib3RoIG11c3QgYmUgZXh0ZW5kZWQgY29sb3Jz
LgogYm9vbCBleHRlbmRlZENvbG9yc0VxdWFsKGNvbnN0IENvbG9yJiwgY29uc3QgQ29sb3ImKTsK
IAotQ29sb3IgYmxlbmQoY29uc3QgQ29sb3ImIGZyb20sIGNvbnN0IENvbG9yJiB0bywgZG91Ymxl
IHByb2dyZXNzKTsKLUNvbG9yIGJsZW5kV2l0aG91dFByZW11bHRpcGx5KGNvbnN0IENvbG9yJiBm
cm9tLCBjb25zdCBDb2xvciYgdG8sIGRvdWJsZSBwcm9ncmVzcyk7Ci0KICNpZiBVU0UoQ0cpCiBX
RUJDT1JFX0VYUE9SVCBDR0NvbG9yUmVmIGNhY2hlZENHQ29sb3IoY29uc3QgQ29sb3ImKTsKICNl
bmRpZgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29sb3JCbGVuZGlu
Zy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQ29s
b3JCbGVuZGluZy5jcHAJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvQ29sb3JCbGVuZGluZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMzIg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29sb3JCbGVuZGluZy5oIgorCisjaW5jbHVk
ZSAiQW5pbWF0aW9uVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiQ29sb3IuaCIKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitDb2xvciBibGVuZFNvdXJjZU92ZXIoY29uc3QgQ29sb3ImIGJhY2tkcm9w
LCBjb25zdCBDb2xvciYgc291cmNlKQoreworICAgIGlmICghYmFja2Ryb3AuaXNWaXNpYmxlKCkg
fHwgc291cmNlLmlzT3BhcXVlKCkpCisgICAgICAgIHJldHVybiBzb3VyY2U7CisKKyAgICBpZiAo
IXNvdXJjZS5hbHBoYSgpKQorICAgICAgICByZXR1cm4gYmFja2Ryb3A7CisKKyAgICBhdXRvIFti
YWNrZHJvcFIsIGJhY2tkcm9wRywgYmFja2Ryb3BCLCBiYWNrZHJvcEFdID0gYmFja2Ryb3AudG9T
UkdCQVNpbXBsZUNvbG9yTG9zc3koKTsKKyAgICBhdXRvIFtzb3VyY2VSLCBzb3VyY2VHLCBzb3Vy
Y2VCLCBzb3VyY2VBXSA9IHNvdXJjZS50b1NSR0JBU2ltcGxlQ29sb3JMb3NzeSgpOworCisgICAg
aW50IGQgPSAweEZGICogKGJhY2tkcm9wQSArIHNvdXJjZUEpIC0gYmFja2Ryb3BBICogc291cmNl
QTsKKyAgICBpbnQgYSA9IGQgLyAweEZGOworICAgIGludCByID0gKGJhY2tkcm9wUiAqIGJhY2tk
cm9wQSAqICgweEZGIC0gc291cmNlQSkgKyAweEZGICogc291cmNlQSAqIHNvdXJjZVIpIC8gZDsK
KyAgICBpbnQgZyA9IChiYWNrZHJvcEcgKiBiYWNrZHJvcEEgKiAoMHhGRiAtIHNvdXJjZUEpICsg
MHhGRiAqIHNvdXJjZUEgKiBzb3VyY2VHKSAvIGQ7CisgICAgaW50IGIgPSAoYmFja2Ryb3BCICog
YmFja2Ryb3BBICogKDB4RkYgLSBzb3VyY2VBKSArIDB4RkYgKiBzb3VyY2VBICogc291cmNlQikg
LyBkOworCisgICAgcmV0dXJuIG1ha2VTaW1wbGVDb2xvcihyLCBnLCBiLCBhKTsKK30KKworQ29s
b3IgYmxlbmRXaXRoV2hpdGUoY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGNvbnN0ZXhwciBp
bnQgc3RhcnRBbHBoYSA9IDE1MzsgLy8gNjAlCisgICAgY29uc3RleHByIGludCBlbmRBbHBoYSA9
IDIwNDsgLy8gODAlOworICAgIGNvbnN0ZXhwciBpbnQgYWxwaGFJbmNyZW1lbnQgPSAxNzsKKwor
ICAgIGF1dG8gYmxlbmRDb21wb25lbnQgPSBbXShpbnQgYywgaW50IGEpIC0+IGludCB7CisgICAg
ICAgIGZsb2F0IGFscGhhID0gYSAvIDI1NS4wZjsKKyAgICAgICAgaW50IHdoaXRlQmxlbmQgPSAy
NTUgLSBhOworICAgICAgICBjIC09IHdoaXRlQmxlbmQ7CisgICAgICAgIHJldHVybiBzdGF0aWNf
Y2FzdDxpbnQ+KGMgLyBhbHBoYSk7CisgICAgfTsKKworICAgIC8vIElmIHRoZSBjb2xvciBjb250
YWlucyBhbHBoYSBhbHJlYWR5LCB3ZSBsZWF2ZSBpdCBhbG9uZS4KKyAgICBpZiAoIWNvbG9yLmlz
T3BhcXVlKCkpCisgICAgICAgIHJldHVybiBjb2xvcjsKKworICAgIGF1dG8gW2V4aXN0aW5nUiwg
ZXhpc3RpbmdHLCBleGlzdGluZ0IsIGV4aXN0aW5nQWxwaGFdID0gY29sb3IudG9TUkdCQVNpbXBs
ZUNvbG9yTG9zc3koKTsKKworICAgIFNpbXBsZUNvbG9yIHJlc3VsdDsKKyAgICBmb3IgKGludCBh
bHBoYSA9IHN0YXJ0QWxwaGE7IGFscGhhIDw9IGVuZEFscGhhOyBhbHBoYSArPSBhbHBoYUluY3Jl
bWVudCkgeworICAgICAgICAvLyBXZSBoYXZlIGEgc29saWQgY29sb3IuICBDb252ZXJ0IHRvIGFu
IGVxdWl2YWxlbnQgY29sb3IgdGhhdCBsb29rcyB0aGUgc2FtZSB3aGVuIGJsZW5kZWQgd2l0aCB3
aGl0ZQorICAgICAgICAvLyBhdCB0aGUgY3VycmVudCBhbHBoYS4gIFRyeSB1c2luZyBsZXNzIHRy
YW5zcGFyZW5jeSBpZiB0aGUgbnVtYmVycyBlbmQgdXAgYmVpbmcgbmVnYXRpdmUuCisgICAgICAg
IGludCByID0gYmxlbmRDb21wb25lbnQoZXhpc3RpbmdSLCBhbHBoYSk7CisgICAgICAgIGludCBn
ID0gYmxlbmRDb21wb25lbnQoZXhpc3RpbmdHLCBhbHBoYSk7CisgICAgICAgIGludCBiID0gYmxl
bmRDb21wb25lbnQoZXhpc3RpbmdCLCBhbHBoYSk7CisKKyAgICAgICAgcmVzdWx0ID0gbWFrZVNp
bXBsZUNvbG9yKHIsIGcsIGIsIGFscGhhKTsKKworICAgICAgICBpZiAociA+PSAwICYmIGcgPj0g
MCAmJiBiID49IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBGSVhNRTog
V2h5IGlzIHByZXNlcnZpbmcgdGhlIHNlbWFudGljIGJpdCBkZXNpcmVkIGFuZC9vciBjb3JyZWN0
IGhlcmU/CisgICAgaWYgKGNvbG9yLmlzU2VtYW50aWMoKSkKKyAgICAgICAgcmV0dXJuIENvbG9y
KHJlc3VsdCwgQ29sb3I6OlNlbWFudGljKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitDb2xv
ciBibGVuZChjb25zdCBDb2xvciYgZnJvbSwgY29uc3QgQ29sb3ImIHRvLCBkb3VibGUgcHJvZ3Jl
c3MpCit7CisgICAgLy8gRklYTUU6IEV4dGVuZGVkQ29sb3IgLSBuZWVkcyB0byBoYW5kbGUgY29s
b3Igc3BhY2VzLgorICAgIC8vIFdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIHN0YXRlIG9mIHRoZSB2
YWxpZCBmbGFnIGF0IHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbgorICAgIGlmIChwcm9ncmVzcyA9
PSAxICYmICF0by5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiB7IH07CisKKyAgICAvLyBTaW5j
ZSBwcmVtdWx0aXBseUNlaWxpbmcoKSBiYWlscyBvbiB6ZXJvIGFscGhhLCBzcGVjaWFsLWNhc2Ug
dGhhdC4KKyAgICBhdXRvIHByZW11bHRpcGxpZWRGcm9tID0gZnJvbS5hbHBoYSgpID8gcHJlbXVs
dGlwbHlDZWlsaW5nKGZyb20udG9TUkdCQVNpbXBsZUNvbG9yTG9zc3koKSkgOiBDb2xvcjo6dHJh
bnNwYXJlbnQ7CisgICAgYXV0byBwcmVtdWx0aXBsaWVkVG8gPSB0by5hbHBoYSgpID8gcHJlbXVs
dGlwbHlDZWlsaW5nKHRvLnRvU1JHQkFTaW1wbGVDb2xvckxvc3N5KCkpIDogQ29sb3I6OnRyYW5z
cGFyZW50OworCisgICAgYXV0byBwcmVtdWx0QmxlbmRlZCA9IG1ha2VTaW1wbGVDb2xvcigKKyAg
ICAgICAgV2ViQ29yZTo6YmxlbmQocHJlbXVsdGlwbGllZEZyb20ucmVkQ29tcG9uZW50KCksIHBy
ZW11bHRpcGxpZWRUby5yZWRDb21wb25lbnQoKSwgcHJvZ3Jlc3MpLAorICAgICAgICBXZWJDb3Jl
OjpibGVuZChwcmVtdWx0aXBsaWVkRnJvbS5ncmVlbkNvbXBvbmVudCgpLCBwcmVtdWx0aXBsaWVk
VG8uZ3JlZW5Db21wb25lbnQoKSwgcHJvZ3Jlc3MpLAorICAgICAgICBXZWJDb3JlOjpibGVuZChw
cmVtdWx0aXBsaWVkRnJvbS5ibHVlQ29tcG9uZW50KCksIHByZW11bHRpcGxpZWRUby5ibHVlQ29t
cG9uZW50KCksIHByb2dyZXNzKSwKKyAgICAgICAgV2ViQ29yZTo6YmxlbmQocHJlbXVsdGlwbGll
ZEZyb20uYWxwaGFDb21wb25lbnQoKSwgcHJlbXVsdGlwbGllZFRvLmFscGhhQ29tcG9uZW50KCks
IHByb2dyZXNzKQorICAgICk7CisKKyAgICByZXR1cm4gdW5wcmVtdWx0aXBseShwcmVtdWx0Qmxl
bmRlZCk7Cit9CisKK0NvbG9yIGJsZW5kV2l0aG91dFByZW11bHRpcGx5KGNvbnN0IENvbG9yJiBm
cm9tLCBjb25zdCBDb2xvciYgdG8sIGRvdWJsZSBwcm9ncmVzcykKK3sKKyAgICAvLyBGSVhNRTog
RXh0ZW5kZWRDb2xvciAtIG5lZWRzIHRvIGhhbmRsZSBjb2xvciBzcGFjZXMuCisgICAgLy8gV2Ug
bmVlZCB0byBwcmVzZXJ2ZSB0aGUgc3RhdGUgb2YgdGhlIHZhbGlkIGZsYWcgYXQgdGhlIGVuZCBv
ZiB0aGUgYW5pbWF0aW9uCisgICAgaWYgKHByb2dyZXNzID09IDEgJiYgIXRvLmlzVmFsaWQoKSkK
KyAgICAgICAgcmV0dXJuIHsgfTsKKworICAgIGF1dG8gZnJvbVNSR0IgPSBmcm9tLnRvU1JHQkFT
aW1wbGVDb2xvckxvc3N5KCk7CisgICAgYXV0byB0b1NSR0IgPSBmcm9tLnRvU1JHQkFTaW1wbGVD
b2xvckxvc3N5KCk7CisKKyAgICByZXR1cm4gbWFrZVNpbXBsZUNvbG9yKAorICAgICAgICBXZWJD
b3JlOjpibGVuZChmcm9tU1JHQi5yZWRDb21wb25lbnQoKSwgdG9TUkdCLnJlZENvbXBvbmVudCgp
LCBwcm9ncmVzcyksCisgICAgICAgIFdlYkNvcmU6OmJsZW5kKGZyb21TUkdCLmdyZWVuQ29tcG9u
ZW50KCksIHRvU1JHQi5ncmVlbkNvbXBvbmVudCgpLCBwcm9ncmVzcyksCisgICAgICAgIFdlYkNv
cmU6OmJsZW5kKGZyb21TUkdCLmJsdWVDb21wb25lbnQoKSwgdG9TUkdCLmJsdWVDb21wb25lbnQo
KSwgcHJvZ3Jlc3MpLAorICAgICAgICBXZWJDb3JlOjpibGVuZChmcm9tU1JHQi5hbHBoYUNvbXBv
bmVudCgpLCB0b1NSR0IuYWxwaGFDb21wb25lbnQoKSwgcHJvZ3Jlc3MpCisgICAgKTsKK30KKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvQ29sb3JCbGVuZGluZy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0NvbG9yQmxlbmRpbmcuaAkobm9uZXhpc3RlbnQpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Db2xvckJsZW5kaW5nLmgJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK2NsYXNzIENvbG9yOworCisvLyBOT1RFOiBUaGVzZSBmdW5jdGlvbnMgZG8gYSBs
b3NzeSBjb252ZXJzaW9uIHRvIDgtYml0IHNSR0JBIGJlZm9yZSBibGVuZGluZy4KKworLy8gVGhp
cyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBQb3J0ZXItRHVmZidzICJzb3VyY2Utb3ZlciIgZXF1
YXRpb24uCitDb2xvciBibGVuZFNvdXJjZU92ZXIoY29uc3QgQ29sb3ImLCBjb25zdCBDb2xvciYp
OworCisvLyBCZXNwb2tlICJ3aGl0ZW5pbmciIGFsZ29yaXRobSB1c2VkIGJ5IFJlbmRlclRoZW1l
Ojp0cmFuc2Zvcm1TZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IuCitDb2xvciBibGVuZFdpdGhXaGl0
ZShjb25zdCBDb2xvciYpOworCitDb2xvciBibGVuZChjb25zdCBDb2xvciYgZnJvbSwgY29uc3Qg
Q29sb3ImIHRvLCBkb3VibGUgcHJvZ3Jlc3MpOworQ29sb3IgYmxlbmRXaXRob3V0UHJlbXVsdGlw
bHkoY29uc3QgQ29sb3ImIGZyb20sIGNvbnN0IENvbG9yJiB0bywgZG91YmxlIHByb2dyZXNzKTsK
KworfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9GaWx0
ZXJPcGVyYXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2ZpbHRlcnMvRmlsdGVyT3BlcmF0aW9uLmNwcAkocmV2aXNpb24gMjYzNzU4KQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZmlsdGVycy9GaWx0ZXJPcGVyYXRpb24u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAiQW5pbWF0aW9u
VXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAiQ2FjaGVkUmVzb3VyY2VMb2FkZXIuaCIKICNpbmNsdWRl
ICJDYWNoZWRTVkdEb2N1bWVudFJlZmVyZW5jZS5oIgorI2luY2x1ZGUgIkNvbG9yQmxlbmRpbmcu
aCIKICNpbmNsdWRlICJDb2xvck1hdHJpeC5oIgogI2luY2x1ZGUgIkNvbG9yVXRpbGl0aWVzLmgi
CiAjaW5jbHVkZSAiRmlsdGVyRWZmZWN0LmgiCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQm94TW9kZWxPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAJKHJldmlzaW9uIDI2Mzc1OCkKKysr
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3hNb2RlbE9iamVjdC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJCaXRtYXBJbWFnZS5oIgogI2lu
Y2x1ZGUgIkJvcmRlckVkZ2UuaCIKICNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1ZGUg
IkNvbG9yQmxlbmRpbmcuaCIKICNpbmNsdWRlICJEb2N1bWVudC5oIgogI2luY2x1ZGUgIkRvY3Vt
ZW50VGltZWxpbmUuaCIKICNpbmNsdWRlICJGbG9hdFJvdW5kZWRSZWN0LmgiCkBAIC05MzQsNyAr
OTM1LDcgQEAgdm9pZCBSZW5kZXJCb3hNb2RlbE9iamVjdDo6cGFpbnRGaWxsTGF5ZQogICAgICAg
ICAgICAgRmxvYXRSZWN0IGJhY2tncm91bmRSZWN0Rm9yUGFpbnRpbmcgPSBzbmFwUmVjdFRvRGV2
aWNlUGl4ZWxzKGJhY2tncm91bmRSZWN0LCBkZXZpY2VTY2FsZUZhY3Rvcik7CiAgICAgICAgICAg
ICBpZiAoYmFzZUNvbG9yLmlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFiYXNl
QmdDb2xvck9ubHkgJiYgYmdDb2xvci5pc1Zpc2libGUoKSkKLSAgICAgICAgICAgICAgICAgICAg
YmFzZUNvbG9yID0gYmFzZUNvbG9yLmJsZW5kKGJnQ29sb3IpOworICAgICAgICAgICAgICAgICAg
ICBiYXNlQ29sb3IgPSBibGVuZFNvdXJjZU92ZXIoYmFzZUNvbG9yLCBiZ0NvbG9yKTsKICAgICAg
ICAgICAgICAgICBjb250ZXh0LmZpbGxSZWN0KGJhY2tncm91bmRSZWN0Rm9yUGFpbnRpbmcsIGJh
c2VDb2xvciwgQ29tcG9zaXRlT3BlcmF0b3I6OkNvcHkpOwogICAgICAgICAgICAgfSBlbHNlIGlm
ICghYmFzZUJnQ29sb3JPbmx5ICYmIGJnQ29sb3IuaXNWaXNpYmxlKCkpIHsKICAgICAgICAgICAg
ICAgICBhdXRvIG9wZXJhdGlvbiA9IGNvbnRleHQuY29tcG9zaXRlT3BlcmF0aW9uKCk7CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyTWVudUxpc3QuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJNZW51TGlzdC5jcHAJKHJldmlzaW9u
IDI2Mzc1OCkKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJNZW51TGlzdC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJBY2Nlc3NpYmlsaXR5
TWVudUxpc3QuaCIKICNpbmNsdWRlICJDU1NGb250U2VsZWN0b3IuaCIKICNpbmNsdWRlICJDaHJv
bWUuaCIKKyNpbmNsdWRlICJDb2xvckJsZW5kaW5nLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNp
bmNsdWRlICJGcmFtZVZpZXcuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKQEAgLTUzMiwxNCAr
NTMzLDE0IEBAIHZvaWQgUmVuZGVyTWVudUxpc3Q6OmdldEl0ZW1CYWNrZ3JvdW5kQ28KICAgICB9
CiAKICAgICAvLyBPdGhlcndpc2UsIHRoZSBpdGVtJ3MgYmFja2dyb3VuZCBpcyBvdmVybGF5ZWQg
b24gdG9wIG9mIHRoZSBtZW51IGJhY2tncm91bmQuCi0gICAgYmFja2dyb3VuZENvbG9yID0gc3R5
bGUoKS52aXNpdGVkRGVwZW5kZW50Q29sb3JXaXRoQ29sb3JGaWx0ZXIoQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kQ29sb3IpLmJsZW5kKGJhY2tncm91bmRDb2xvcik7CisgICAgYmFja2dyb3VuZENvbG9y
ID0gYmxlbmRTb3VyY2VPdmVyKHN0eWxlKCkudmlzaXRlZERlcGVuZGVudENvbG9yV2l0aENvbG9y
RmlsdGVyKENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yKSwgYmFja2dyb3VuZENvbG9yKTsKICAg
ICBpZiAoYmFja2dyb3VuZENvbG9yLmlzT3BhcXVlKCkpIHsKICAgICAgICAgaXRlbUJhY2tncm91
bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAg
IC8vIElmIHRoZSBtZW51IGJhY2tncm91bmQgaXMgbm90IG9wYXF1ZSwgdGhlbiBhZGQgYW4gb3Bh
cXVlIHdoaXRlIGJhY2tncm91bmQgYmVoaW5kLgotICAgIGl0ZW1CYWNrZ3JvdW5kQ29sb3IgPSBD
b2xvcihDb2xvcjo6d2hpdGUpLmJsZW5kKGJhY2tncm91bmRDb2xvcik7CisgICAgaXRlbUJhY2tn
cm91bmRDb2xvciA9IGJsZW5kU291cmNlT3ZlcihDb2xvcjo6d2hpdGUsIGJhY2tncm91bmRDb2xv
cik7CiB9CiAKIFBvcHVwTWVudVN0eWxlIFJlbmRlck1lbnVMaXN0OjptZW51U3R5bGUoKSBjb25z
dApJbmRleDogU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRoZW1lLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWUuY3BwCShyZXZpc2lv
biAyNjM3NTgpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGhlbWUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIK
IAogI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRlICJDb2xvckJsZW5kaW5n
LmgiCiAjaW5jbHVkZSAiQ29udHJvbFN0YXRlcy5oIgogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAj
aW5jbHVkZSAiRmlsZUxpc3QuaCIKQEAgLTYxNiw3ICs2MTcsNyBAQCBDb2xvciBSZW5kZXJUaGVt
ZTo6aW5hY3RpdmVTZWxlY3Rpb25CYWNrCiAKIENvbG9yIFJlbmRlclRoZW1lOjp0cmFuc2Zvcm1T
ZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yLCBPcHRpb25TZXQ8U3R5
bGVDb2xvcjo6T3B0aW9ucz4pIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGNvbG9yLmJsZW5kV2l0aFdo
aXRlKCk7CisgICAgcmV0dXJuIGJsZW5kV2l0aFdoaXRlKGNvbG9yKTsKIH0KIAogQ29sb3IgUmVu
ZGVyVGhlbWU6OmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcihPcHRpb25TZXQ8U3R5bGVD
b2xvcjo6T3B0aW9ucz4gb3B0aW9ucykgY29uc3QK
</data>

          </attachment>
      

    </bug>

</bugzilla>