<?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>66009</bug_id>
          
          <creation_ts>2011-08-10 13:36:48 -0700</creation_ts>
          <short_desc>Refactoring of PopupMenuChromium For Readability and Maintainability</short_desc>
          <delta_ts>2011-08-13 11:32:04 -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>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>66159</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Fady Samuel">fsamuel</reporter>
          <assigned_to name="Fady Samuel">fsamuel</assigned_to>
          <cc>abarth</cc>
    
    <cc>fishd</cc>
    
    <cc>fsamuel</cc>
    
    <cc>jamesr</cc>
    
    <cc>rjkroege</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>449364</commentid>
    <comment_count>0</comment_count>
    <who name="Fady Samuel">fsamuel</who>
    <bug_when>2011-08-10 13:36:48 -0700</bug_when>
    <thetext>Refactoring of PopupMenuChromium</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>449372</commentid>
    <comment_count>1</comment_count>
      <attachid>103529</attachid>
    <who name="Fady Samuel">fsamuel</who>
    <bug_when>2011-08-10 13:41:06 -0700</bug_when>
    <thetext>Created attachment 103529
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>449935</commentid>
    <comment_count>2</comment_count>
      <attachid>103657</attachid>
    <who name="Fady Samuel">fsamuel</who>
    <bug_when>2011-08-11 12:34:07 -0700</bug_when>
    <thetext>Created attachment 103657
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>449936</commentid>
    <comment_count>3</comment_count>
    <who name="Fady Samuel">fsamuel</who>
    <bug_when>2011-08-11 12:35:34 -0700</bug_when>
    <thetext>Updated the changelog as suggested by fishd.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450525</commentid>
    <comment_count>4</comment_count>
      <attachid>103657</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-08-12 11:36:52 -0700</bug_when>
    <thetext>Comment on attachment 103657
Patch

Clearing flags on attachment: 103657

Committed r92976: &lt;http://trac.webkit.org/changeset/92976&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450526</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-08-12 11:36:57 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450646</commentid>
    <comment_count>6</comment_count>
    <who name="Fady Samuel">fsamuel</who>
    <bug_when>2011-08-12 13:58:48 -0700</bug_when>
    <thetext>Broke a Windows test, reopening this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450656</commentid>
    <comment_count>7</comment_count>
      <attachid>103813</attachid>
    <who name="Fady Samuel">fsamuel</who>
    <bug_when>2011-08-12 14:06:05 -0700</bug_when>
    <thetext>Created attachment 103813
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450665</commentid>
    <comment_count>8</comment_count>
      <attachid>103813</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2011-08-12 14:24:15 -0700</bug_when>
    <thetext>Comment on attachment 103813
Patch

OK</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450689</commentid>
    <comment_count>9</comment_count>
      <attachid>103813</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-08-12 14:58:12 -0700</bug_when>
    <thetext>Comment on attachment 103813
Patch

Rejecting attachment 103813 from commit-queue.

Failed to run &quot;[&apos;./Tools/Scripts/webkit-patch&apos;, &apos;--status-host=queues.webkit.org&apos;, &apos;--bot-id=ec2-cq-02&apos;, &apos;--port...&quot; exit_code: 2

Last 500 characters of output:
3ca3f2e02eb286200861b2592d8582aab4cd124c
r93002 = f4c76bcccb5f0317eba17e1f2b50a53674d23397
Done rebuilding .git/svn/refs/remotes/origin/master/.rev_map.268f45cc-cd09-0410-ab3c-d52691b4dbfc
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.
Updating chromium port dependencies using gclient...

________ running &apos;/usr/bin/python gyp_webkit&apos; in &apos;/mnt/git/webkit-commit-queue/Source/WebKit/chromium&apos;
Updating webkit projects from gyp files...

Full output: http://queues.webkit.org/results/9384004</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450711</commentid>
    <comment_count>10</comment_count>
      <attachid>103813</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-08-12 15:39:50 -0700</bug_when>
    <thetext>Comment on attachment 103813
Patch

Rejecting attachment 103813 from commit-queue.

Failed to run &quot;[&apos;./Tools/Scripts/webkit-patch&apos;, &apos;--status-host=queues.webkit.org&apos;, &apos;--bot-id=ec2-cq-02&apos;, &apos;--port...&quot; exit_code: 2

Last 500 characters of output:
bca0a5487e1ea7a520259fdbee2481f0cef8e958
r93005 = 61b5afdc0237a717f1d933ad24f1e95232a0713c
Done rebuilding .git/svn/refs/remotes/origin/master/.rev_map.268f45cc-cd09-0410-ab3c-d52691b4dbfc
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.
Updating chromium port dependencies using gclient...

________ running &apos;/usr/bin/python gyp_webkit&apos; in &apos;/mnt/git/webkit-commit-queue/Source/WebKit/chromium&apos;
Updating webkit projects from gyp files...

Full output: http://queues.webkit.org/results/9383020</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450715</commentid>
    <comment_count>11</comment_count>
      <attachid>103829</attachid>
    <who name="Fady Samuel">fsamuel</who>
    <bug_when>2011-08-12 15:44:46 -0700</bug_when>
    <thetext>Created attachment 103829
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450745</commentid>
    <comment_count>12</comment_count>
      <attachid>103829</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-08-12 16:19:03 -0700</bug_when>
    <thetext>Comment on attachment 103829
Patch

Clearing flags on attachment: 103829

Committed r93009: &lt;http://trac.webkit.org/changeset/93009&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450746</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-08-12 16:19:09 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450868</commentid>
    <comment_count>14</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-08-13 11:28:24 -0700</bug_when>
    <thetext>This patch does not compile on Clang:

http://build.chromium.org/p/tryserver.chromium/builders/linux_clang/builds/6387/steps/compile/logs/stdio</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>450869</commentid>
    <comment_count>15</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2011-08-13 11:32:04 -0700</bug_when>
    <thetext>Attempted fix in http://trac.webkit.org/changeset/93020</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>103529</attachid>
            <date>2011-08-10 13:41:06 -0700</date>
            <delta_ts>2011-08-11 12:34:01 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-66009-20110810164104.patch</filename>
            <type>text/plain</type>
            <size>137173</size>
            <attacher name="Fady Samuel">fsamuel</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTI3NjcKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBlZThmY2JiZDRmZWE4MjMw
Y2VjZjA5Njg4N2ExMGYxZmU5YmQzMmEyLi5lZGE2ZmE3ZWZmNjAwYTZjN2UzMWU2MWRiMmI3MTQz
MmFjYzBiNTVkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTAyIEBACisyMDExLTA4LTEwICBGYWR5
IFNhbXVlbCAgPGZzYW11ZWxAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJlZmFjdG9yaW5nIG9m
IFBvcHVwTWVudUNocm9taXVtCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD02NjAwOQorCisgICAgICAgIFJlZmFjdG9yZWQgUG9wdXBNZW51Q2hyb21pdW0g
aW50byBzZXBhcmF0ZSBjcHAgZmlsZXM6IFBvcHVwTWVudUNocm9taXVtLCBQb3B1cE1lbnVMaXN0
Qm94LCBQb3B1cE1lbnVDb250YWluZXIuCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIGJlY2F1c2Ugbm8gZnVuY3Rpb25hbGl0eSBo
YXMgY2hhbmdlZC4KKworICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBwbGF0Zm9y
bS9jaHJvbWl1bS9Qb3B1cENvbnRhaW5lci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
Y29uc3RydWN0UmVsYXRpdmVNb3VzZUV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OmNvbnN0cnVj
dFJlbGF0aXZlV2hlZWxFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6
Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpQb3B1cENvbnRhaW5l
cik6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6flBvcHVwQ29udGFpbmVyKToK
KyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpsYXlvdXRBbmRDYWxjdWxhdGVXaWRn
ZXRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpzaG93UG9wdXApOgor
ICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OmhpZGVQb3B1cCk6CisgICAgICAgIChX
ZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6bm90aWZ5UG9wdXBIaWRkZW4pOgorICAgICAgICAoV2Vi
Q29yZTo6UG9wdXBDb250YWluZXI6OmxheW91dEFuZEdldFJUTE9mZnNldCk6CisgICAgICAgIChX
ZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6aGFuZGxlTW91c2VEb3duRXZlbnQpOgorICAgICAgICAo
V2ViQ29yZTo6UG9wdXBDb250YWluZXI6OmhhbmRsZU1vdXNlTW92ZUV2ZW50KToKKyAgICAgICAg
KFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpoYW5kbGVNb3VzZVJlbGVhc2VFdmVudCk6CisgICAg
ICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6aGFuZGxlV2hlZWxFdmVudCk6CisgICAgICAg
IChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6aGFuZGxlVG91Y2hFdmVudCk6CisgICAgICAgIChX
ZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6aGFuZGxlR2VzdHVyZUV2ZW50KToKKyAgICAgICAgKFdl
YkNvcmU6OlBvcHVwQ29udGFpbmVyOjpoYW5kbGVLZXlFdmVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpQb3B1cENvbnRhaW5lcjo6aGlkZSk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5l
cjo6cGFpbnQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OnBhaW50Qm9yZGVy
KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjppc0ludGVyZXN0ZWRJbkV2ZW50
Rm9yS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpjaHJvbWVDbGllbnRD
aHJvbWl1bSk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6c2hvd0luUmVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6cmVmcmVzaCk6CisgICAgICAgIChX
ZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6aXNSVEwpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBD
b250YWluZXI6OnNlbGVjdGVkSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWlu
ZXI6Om1lbnVJdGVtSGVpZ2h0KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpt
ZW51SXRlbUZvbnRTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjptZW51
U3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6cG9wdXBEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6
OlBvcHVwQ29udGFpbmVyOjpnZXRTZWxlY3RlZEl0ZW1Ub29sVGlwKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9jaHJvbWl1bS9Qb3B1cENvbnRhaW5lci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OlBvcHVwQ29udGFpbmVyOjpsaXN0Qm94KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFp
bmVyOjpwb3B1cFR5cGUpOgorICAgICAgICAqIHBsYXRmb3JtL2Nocm9taXVtL1BvcHVwTGlzdEJv
eC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpQb3B1cExpc3RC
b3gpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpoYW5kbGVNb3VzZURvd25FdmVu
dCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmhhbmRsZU1vdXNlTW92ZUV2ZW50
KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6aGFuZGxlTW91c2VSZWxlYXNlRXZl
bnQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpoYW5kbGVXaGVlbEV2ZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6aXNJbnRlcmVzdGVkSW5FdmVudEZvcktl
eSk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmhhbmRsZVRvdWNoRXZlbnQpOgor
ICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpoYW5kbGVHZXN0dXJlRXZlbnQpOgorICAg
ICAgICAoV2ViQ29yZTo6aXNDaGFyYWN0ZXJUeXBlRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6
UG9wdXBMaXN0Qm94OjpoYW5kbGVLZXlFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExp
c3RCb3g6Omhvc3RXaW5kb3cpOgorICAgICAgICAoV2ViQ29yZTo6c3RyaXBMZWFkaW5nV2hpdGVT
cGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OnR5cGVBaGVhZEZpbmQpOgor
ICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpwYWludCk6CisgICAgICAgIChXZWJDb3Jl
OjpQb3B1cExpc3RCb3g6OnBhaW50Um93KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJv
eDo6Z2V0Um93Rm9udCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmFiYW5kb24p
OgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94Ojpwb2ludFRvUm93SW5kZXgpOgorICAg
ICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjphY2NlcHRJbmRleCk6CisgICAgICAgIChXZWJD
b3JlOjpQb3B1cExpc3RCb3g6OnNlbGVjdEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVw
TGlzdEJveDo6c2V0T3JpZ2luYWxJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RC
b3g6OmdldFJvd0hlaWdodCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmdldFJv
d0JvdW5kcyk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmludmFsaWRhdGVSb3cp
OgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpzY3JvbGxUb1JldmVhbFJvdyk6Cisg
ICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmlzU2VsZWN0YWJsZUl0ZW0pOgorICAgICAg
ICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpjbGVhclNlbGVjdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpQb3B1cExpc3RCb3g6OnNlbGVjdE5leHRSb3cpOgorICAgICAgICAoV2ViQ29yZTo6UG9w
dXBMaXN0Qm94OjpzZWxlY3RQcmV2aW91c1Jvdyk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExp
c3RCb3g6OmFkanVzdFNlbGVjdGVkSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0
Qm94OjpoaWRlUG9wdXApOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94Ojp1cGRhdGVG
cm9tRWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OnNldE1heFdpZHRo
QW5kTGF5b3V0KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6bGF5b3V0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29yZTo6
UG9wdXBMaXN0Qm94Ojppc1BvaW50SW5Cb3VuZHMpOgorICAgICAgICAqIHBsYXRmb3JtL2Nocm9t
aXVtL1BvcHVwTGlzdEJveC5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwSXRlbTo6
UG9wdXBJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6Y3JlYXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6c2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChX
ZWJDb3JlOjpQb3B1cExpc3RCb3g6Om51bUl0ZW1zKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVw
TGlzdEJveDo6c2V0QmFzZVdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6
c2V0TWF4SGVpZ2h0KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6c2V0TWF4V2lk
dGgpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpkaXNjb25uZWN0Q2xpZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6aXRlbXMpOgorICAgICAgICAoV2ViQ29y
ZTo6UG9wdXBMaXN0Qm94Ojp+UG9wdXBMaXN0Qm94KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVw
TGlzdEJveDo6c2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24pOgorICAgICAgICAqIHBsYXRmb3JtL2No
cm9taXVtL1BvcHVwTWVudUNocm9taXVtLmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS9jaHJvbWl1
bS9Qb3B1cE1lbnVDaHJvbWl1bS5oOgorCiAyMDExLTA4LTEwICBQYXZlbCBGZWxkbWFuICA8cGZl
bGRtYW5AZ29vZ2xlLmNvbT4KIAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBDU1MgZWRpdGluZyBm
aWxlIGNvbnRhaW5pbmcgdGFicyBsZWFkcyB0byB0aGUgd2hvbGUgZmlsZSBjaGFuZ2UgaW4gcmV2
aXNpb24gaGlzdG9yeS4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBi
L1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCAyYzYzMmFkNGUzNTNiYjQyOTJhNjY4
ZjA3NmMwMTM0ZjA0ZTM1MDkxLi5iNzEwMGIxYjNhN2NhZjE1NzNiMzY5ZTFhYWI4NmVhN2Y5ZTdh
ZDQ2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvU291cmNl
L1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC0zMjUxLDggKzMyNTEsMTIgQEAKICAgICAgICAgICAg
ICdwbGF0Zm9ybS9jaHJvbWl1bS9QbGF0Zm9ybVRoZW1lQ2hyb21pdW1HdGsuY3BwJywKICAgICAg
ICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9QbGF0Zm9ybVRoZW1lQ2hyb21pdW1HdGsuaCcsCiAg
ICAgICAgICAgICAncGxhdGZvcm0vY2hyb21pdW0vUGxhdGZvcm1XaWRnZXQuaCcsCisgICAgICAg
ICAgICAncGxhdGZvcm0vY2hyb21pdW0vUG9wdXBDb250YWluZXIuY3BwJywKKyAgICAgICAgICAg
ICdwbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cENvbnRhaW5lci5oJywKICAgICAgICAgICAgICdwbGF0
Zm9ybS9jaHJvbWl1bS9Qb3B1cE1lbnVDaHJvbWl1bS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRm
b3JtL2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVtLmgnLAorICAgICAgICAgICAgJ3BsYXRmb3Jt
L2Nocm9taXVtL1BvcHVwTGlzdEJveC5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2Nocm9t
aXVtL1BvcHVwTGlzdEJveC5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1
cE1lbnVQcml2YXRlLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2Nocm9taXVtL1NTTEtleUdl
bmVyYXRvckNocm9taXVtLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vY2hyb21pdW0vU2Ny
b2xsQW5pbWF0b3JDaHJvbWl1bU1hYy5oJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2Nocm9taXVtL1BvcHVwQ29udGFpbmVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2Nocm9taXVtL1BvcHVwQ29udGFpbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yMWM0NmU2NzFlZDk0
MzhjYzZiYjRlYjI1OGQ5NzVjNmZkOWIyZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBDb250YWluZXIuY3BwCkBAIC0wLDAgKzEsNDY0
IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoK
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAor
ICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQb3B1cENvbnRhaW5lci5oIgorCisj
aW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50Q2hyb21pdW0uaCIKKyNp
bmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVW
aWV3LmgiCisjaW5jbHVkZSAiRnJhbWVsZXNzU2Nyb2xsVmlldy5oIgorI2luY2x1ZGUgIkZyYW1l
bGVzc1Njcm9sbFZpZXdDbGllbnQuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNp
bmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBsYXRmb3Jt
S2V5Ym9hcmRFdmVudC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgorI2luY2x1
ZGUgIlBsYXRmb3JtU2NyZWVuLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50LmgiCisj
aW5jbHVkZSAiUG9wdXBMaXN0Qm94LmgiCisjaW5jbHVkZSAiUG9wdXBNZW51Q2xpZW50LmgiCisj
aW5jbHVkZSAiVXNlckdlc3R1cmVJbmRpY2F0b3IuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNp
ZiBFTkFCTEUoR0VTVFVSRV9FVkVOVFMpCisjaW5jbHVkZSAiUGxhdGZvcm1HZXN0dXJlRXZlbnQu
aCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyNpbmNsdWRlICJQbGF0Zm9y
bVRvdWNoRXZlbnQuaCIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBpbnQga0JvcmRlclNpemUgPSAxOworCitzdGF0
aWMgUGxhdGZvcm1Nb3VzZUV2ZW50IGNvbnN0cnVjdFJlbGF0aXZlTW91c2VFdmVudChjb25zdCBQ
bGF0Zm9ybU1vdXNlRXZlbnQmIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBGcmFtZWxlc3NTY3JvbGxWaWV3KiBwYXJlbnQsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZWxlc3NT
Y3JvbGxWaWV3KiBjaGlsZCkKK3sKKyAgICBJbnRQb2ludCBwb3MgPSBwYXJlbnQtPmNvbnZlcnRT
ZWxmVG9DaGlsZChjaGlsZCwgZS5wb3MoKSk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhv
cnJpYmxlIGhhY2sgc2luY2UgUGxhdGZvcm1Nb3VzZUV2ZW50IGhhcyBubyBzZXR0ZXJzIGZvciB4
L3kuCisgICAgUGxhdGZvcm1Nb3VzZUV2ZW50IHJlbGF0aXZlRXZlbnQgPSBlOworICAgIEludFBv
aW50JiByZWxhdGl2ZVBvcyA9IGNvbnN0X2Nhc3Q8SW50UG9pbnQmPihyZWxhdGl2ZUV2ZW50LnBv
cygpKTsKKyAgICByZWxhdGl2ZVBvcy5zZXRYKHBvcy54KCkpOworICAgIHJlbGF0aXZlUG9zLnNl
dFkocG9zLnkoKSk7CisgICAgcmV0dXJuIHJlbGF0aXZlRXZlbnQ7Cit9CisKK3N0YXRpYyBQbGF0
Zm9ybVdoZWVsRXZlbnQgY29uc3RydWN0UmVsYXRpdmVXaGVlbEV2ZW50KGNvbnN0IFBsYXRmb3Jt
V2hlZWxFdmVudCYgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEZyYW1lbGVzc1Njcm9sbFZpZXcqIHBhcmVudCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lbGVzc1Njcm9sbFZp
ZXcqIGNoaWxkKQoreworICAgIEludFBvaW50IHBvcyA9IHBhcmVudC0+Y29udmVydFNlbGZUb0No
aWxkKGNoaWxkLCBlLnBvcygpKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIGlzIGEgaG9ycmlibGUg
aGFjayBzaW5jZSBQbGF0Zm9ybVdoZWVsRXZlbnQgaGFzIG5vIHNldHRlcnMgZm9yIHgveS4KKyAg
ICBQbGF0Zm9ybVdoZWVsRXZlbnQgcmVsYXRpdmVFdmVudCA9IGU7CisgICAgSW50UG9pbnQmIHJl
bGF0aXZlUG9zID0gY29uc3RfY2FzdDxJbnRQb2ludCY+KHJlbGF0aXZlRXZlbnQucG9zKCkpOwor
ICAgIHJlbGF0aXZlUG9zLnNldFgocG9zLngoKSk7CisgICAgcmVsYXRpdmVQb3Muc2V0WShwb3Mu
eSgpKTsKKyAgICByZXR1cm4gcmVsYXRpdmVFdmVudDsKK30KKworLy8gc3RhdGljCitQYXNzUmVm
UHRyPFBvcHVwQ29udGFpbmVyPiBQb3B1cENvbnRhaW5lcjo6Y3JlYXRlKFBvcHVwTWVudUNsaWVu
dCogY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBQb3B1cFR5cGUgcG9wdXBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJiBzZXR0aW5n
cykKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFBvcHVwQ29udGFpbmVyKGNsaWVudCwgcG9w
dXBUeXBlLCBzZXR0aW5ncykpOworfQorCitQb3B1cENvbnRhaW5lcjo6UG9wdXBDb250YWluZXIo
UG9wdXBNZW51Q2xpZW50KiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
UG9wdXBUeXBlIHBvcHVwVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBQb3B1cENvbnRhaW5lclNldHRpbmdzJiBzZXR0aW5ncykKKyAgICA6IG1fbGlzdEJveChQb3B1
cExpc3RCb3g6OmNyZWF0ZShjbGllbnQsIHNldHRpbmdzKSkKKyAgICAsIG1fc2V0dGluZ3Moc2V0
dGluZ3MpCisgICAgLCBtX3BvcHVwVHlwZShwb3B1cFR5cGUpCisgICAgLCBtX3BvcHVwT3Blbihm
YWxzZSkKK3sKKyAgICBzZXRTY3JvbGxiYXJNb2RlcyhTY3JvbGxiYXJBbHdheXNPZmYsIFNjcm9s
bGJhckFsd2F5c09mZik7Cit9CisKK1BvcHVwQ29udGFpbmVyOjp+UG9wdXBDb250YWluZXIoKQor
eworICAgIGlmIChtX2xpc3RCb3ggJiYgbV9saXN0Qm94LT5wYXJlbnQoKSkKKyAgICAgICAgcmVt
b3ZlQ2hpbGQobV9saXN0Qm94LmdldCgpKTsKK30KKworSW50UmVjdCBQb3B1cENvbnRhaW5lcjo6
bGF5b3V0QW5kQ2FsY3VsYXRlV2lkZ2V0UmVjdChpbnQgdGFyZ2V0Q29udHJvbEhlaWdodCwgY29u
c3QgSW50UG9pbnQmIHBvcHVwSW5pdGlhbENvb3JkaW5hdGUpCit7CisgICAgLy8gUmVzZXQgdGhl
IG1heCB3aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLCB0aGV5IHdpbGwg
YmUgcmVjb21wdXRlZCBiZWxvdworICAgIC8vIGlmIG5lY2Vzc2FyeS4KKyAgICBtX2xpc3RCb3gt
PnNldE1heEhlaWdodChrTWF4SGVpZ2h0KTsKKyAgICBtX2xpc3RCb3gtPnNldE1heFdpZHRoKHN0
ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpOworCisgICAgLy8gTGF5IGV2ZXJ5dGhpbmcg
b3V0IHRvIGZpZ3VyZSBvdXQgb3VyIHByZWZlcnJlZCBzaXplLCB0aGVuIHRlbGwgdGhlIHZpZXcn
cworICAgIC8vIFdpZGdldENsaWVudCBhYm91dCBpdC4gSXQgc2hvdWxkIGFzc2lnbiB1cyBhIGNs
aWVudC4KKyAgICBpbnQgcnRsT2Zmc2V0ID0gbGF5b3V0QW5kR2V0UlRMT2Zmc2V0KCk7CisgICAg
Ym9vbCBpc1JUTCA9IHRoaXMtPmlzUlRMKCk7CisgICAgaW50IHJpZ2h0T2Zmc2V0ID0gaXNSVEwg
PyBydGxPZmZzZXQgOiAwOworCisgICAgLy8gQXNzdW1lIG1fbGlzdEJveCBzaXplIGlzIGFscmVh
ZHkgY2FsY3VsYXRlZC4KKyAgICBJbnRTaXplIHRhcmdldFNpemUobV9saXN0Qm94LT53aWR0aCgp
ICsga0JvcmRlclNpemUgKiAyLAorICAgICAgICAgICAgICAgICAgICAgICBtX2xpc3RCb3gtPmhl
aWdodCgpICsga0JvcmRlclNpemUgKiAyKTsKKworICAgIEludFJlY3Qgd2lkZ2V0UmVjdDsKKyAg
ICBDaHJvbWVDbGllbnRDaHJvbWl1bSogY2hyb21lQ2xpZW50ID0gY2hyb21lQ2xpZW50Q2hyb21p
dW0oKTsKKyAgICBpZiAoY2hyb21lQ2xpZW50KSB7CisgICAgICAgIC8vIElmIHRoZSBwb3B1cCB3
b3VsZCBleHRlbmQgcGFzdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4sIG9wZW4gdXB3YXJkcwor
ICAgICAgICAvLyBpbnN0ZWFkLgorICAgICAgICBGbG9hdFJlY3Qgc2NyZWVuID0gc2NyZWVuQXZh
aWxhYmxlUmVjdChtX2ZyYW1lVmlldy5nZXQoKSk7CisgICAgICAgIC8vIFVzZSBwb3B1cEluaXRp
YWxDb29yZGluYXRlLngoKSArIHJpZ2h0T2Zmc2V0IGJlY2F1c2UgUlRMIHBvc2l0aW9uCisgICAg
ICAgIC8vIG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQuCisgICAgICAgIHdpZGdldFJlY3QgPSBjaHJv
bWVDbGllbnQtPndpbmRvd1RvU2NyZWVuKEludFJlY3QocG9wdXBJbml0aWFsQ29vcmRpbmF0ZS54
KCkgKyByaWdodE9mZnNldCwgcG9wdXBJbml0aWFsQ29vcmRpbmF0ZS55KCksIHRhcmdldFNpemUu
d2lkdGgoKSwgdGFyZ2V0U2l6ZS5oZWlnaHQoKSkpOworCisgICAgICAgIC8vIElmIHdlIGhhdmUg
bXVsdGlwbGUgc2NyZWVucyBhbmQgdGhlIGJyb3dzZXIgcmVjdCBpcyBpbiBvbmUgc2NyZWVuLCB3
ZSBoYXZlCisgICAgICAgIC8vIHRvIGNsaXAgdGhlIHdpbmRvdyB3aWR0aCB0byB0aGUgc2NyZWVu
IHdpZHRoLgorICAgICAgICAvLyBXaGVuIGNsaXBwaW5nLCB3ZSBhbHNvIG5lZWQgdG8gc2V0IGEg
bWF4aW11bSB3aWR0aCBmb3IgdGhlIGxpc3QgYm94LgorICAgICAgICBGbG9hdFJlY3Qgd2luZG93
UmVjdCA9IGNocm9tZUNsaWVudC0+d2luZG93UmVjdCgpOworICAgICAgICBpZiAod2luZG93UmVj
dC54KCkgPj0gc2NyZWVuLngoKSAmJiB3aW5kb3dSZWN0Lm1heFgoKSA8PSBzY3JlZW4ubWF4WCgp
ICYmICh3aWRnZXRSZWN0LngoKSA8IHNjcmVlbi54KCkgfHwgd2lkZ2V0UmVjdC5tYXhYKCkgPiBz
Y3JlZW4ubWF4WCgpKSkgeworICAgICAgICAgICAgLy8gRmlyc3QsIGludmVyc2UgdGhlIHBvcHVw
IGFsaWdubWVudCBpZiBpdCBkb2VzIG5vdCBmaXQgdGhlIHNjcmVlbiAtIHRoaXMgbWlnaHQgZml4
IHRoaW5ncyAob3IgbWFrZSB0aGVtIGJldHRlcikuCisgICAgICAgICAgICBJbnRSZWN0IGludmVy
c2VXaWRnZXRSZWN0ID0gY2hyb21lQ2xpZW50LT53aW5kb3dUb1NjcmVlbihJbnRSZWN0KHBvcHVw
SW5pdGlhbENvb3JkaW5hdGUueCgpICsgKGlzUlRMID8gMCA6IHJ0bE9mZnNldCksIHBvcHVwSW5p
dGlhbENvb3JkaW5hdGUueSgpLCB0YXJnZXRTaXplLndpZHRoKCksIHRhcmdldFNpemUuaGVpZ2h0
KCkpKTsKKyAgICAgICAgICAgIEludFJlY3QgZW5jbG9zaW5nU2NyZWVuID0gZW5jbG9zaW5nSW50
UmVjdChzY3JlZW4pOworICAgICAgICAgICAgdW5zaWduZWQgb3JpZ2luYWxDdXRvZmYgPSBtYXgo
ZW5jbG9zaW5nU2NyZWVuLngoKSAtIHdpZGdldFJlY3QueCgpLCAwKSArIG1heCh3aWRnZXRSZWN0
Lm1heFgoKSAtIGVuY2xvc2luZ1NjcmVlbi5tYXhYKCksIDApOworICAgICAgICAgICAgdW5zaWdu
ZWQgaW52ZXJzZUN1dG9mZiA9IG1heChlbmNsb3NpbmdTY3JlZW4ueCgpIC0gaW52ZXJzZVdpZGdl
dFJlY3QueCgpLCAwKSArIG1heChpbnZlcnNlV2lkZ2V0UmVjdC5tYXhYKCkgLSBlbmNsb3NpbmdT
Y3JlZW4ubWF4WCgpLCAwKTsKKworICAgICAgICAgICAgLy8gQWNjZXB0IHRoZSBpbnZlcnNlIHBv
cHVwIGFsaWdubWVudCBpZiB0aGUgdHJpbW1lZCBjb250ZW50IGdldHMgc2hvcnRlciB0aGFuIHRo
YXQgaW4gdGhlIG9yaWdpbmFsIGFsaWdubWVudCBjYXNlLgorICAgICAgICAgICAgaWYgKGludmVy
c2VDdXRvZmYgPCBvcmlnaW5hbEN1dG9mZikKKyAgICAgICAgICAgICAgICB3aWRnZXRSZWN0ID0g
aW52ZXJzZVdpZGdldFJlY3Q7CisKKyAgICAgICAgICAgIGlmICh3aWRnZXRSZWN0LngoKSA8IHNj
cmVlbi54KCkpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB3aWRnZXRSaWdodCA9IHdpZGdl
dFJlY3QubWF4WCgpOworICAgICAgICAgICAgICAgIHdpZGdldFJlY3Quc2V0V2lkdGgod2lkZ2V0
UmVjdC5tYXhYKCkgLSBzY3JlZW4ueCgpKTsKKyAgICAgICAgICAgICAgICB3aWRnZXRSZWN0LnNl
dFgod2lkZ2V0UmlnaHQgLSB3aWRnZXRSZWN0LndpZHRoKCkpOworICAgICAgICAgICAgICAgIGxp
c3RCb3goKS0+c2V0TWF4V2lkdGhBbmRMYXlvdXQobWF4KHdpZGdldFJlY3Qud2lkdGgoKSAtIGtC
b3JkZXJTaXplICogMiwgMCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aWRnZXRSZWN0Lm1h
eFgoKSA+IHNjcmVlbi5tYXhYKCkpIHsKKyAgICAgICAgICAgICAgICB3aWRnZXRSZWN0LnNldFdp
ZHRoKHNjcmVlbi5tYXhYKCkgLSB3aWRnZXRSZWN0LngoKSk7CisgICAgICAgICAgICAgICAgbGlz
dEJveCgpLT5zZXRNYXhXaWR0aEFuZExheW91dChtYXgod2lkZ2V0UmVjdC53aWR0aCgpIC0ga0Jv
cmRlclNpemUgKiAyLCAwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAv
LyBDYWxjdWxhdGUgWSBheGlzIHNpemUuCisgICAgICAgIGlmICh3aWRnZXRSZWN0Lm1heFkoKSA+
IHN0YXRpY19jYXN0PGludD4oc2NyZWVuLm1heFkoKSkpIHsKKyAgICAgICAgICAgIGlmICh3aWRn
ZXRSZWN0LnkoKSAtIHdpZGdldFJlY3QuaGVpZ2h0KCkgLSB0YXJnZXRDb250cm9sSGVpZ2h0ID4g
MCkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGVub3VnaCByb29tIHRvIG9wZW4gdXB3
YXJkcy4KKyAgICAgICAgICAgICAgICB3aWRnZXRSZWN0Lm1vdmUoMCwgLSh3aWRnZXRSZWN0Lmhl
aWdodCgpICsgdGFyZ2V0Q29udHJvbEhlaWdodCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgICAgICAvLyBGaWd1cmUgd2hldGhlciB1cHdhcmRzIG9yIGRvd253YXJkcyBoYXMg
bW9yZSByb29tIGFuZCBzZXQgdGhlCisgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBudW1iZXIg
b2YgaXRlbXMuCisgICAgICAgICAgICAgICAgaW50IHNwYWNlQWJvdmUgPSB3aWRnZXRSZWN0Lnko
KSAtIHRhcmdldENvbnRyb2xIZWlnaHQ7CisgICAgICAgICAgICAgICAgaW50IHNwYWNlQmVsb3cg
PSBzY3JlZW4ubWF4WSgpIC0gd2lkZ2V0UmVjdC55KCk7CisgICAgICAgICAgICAgICAgaWYgKHNw
YWNlQWJvdmUgPiBzcGFjZUJlbG93KQorICAgICAgICAgICAgICAgICAgICBtX2xpc3RCb3gtPnNl
dE1heEhlaWdodChzcGFjZUFib3ZlKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgICAgIG1fbGlzdEJveC0+c2V0TWF4SGVpZ2h0KHNwYWNlQmVsb3cpOworICAgICAgICAg
ICAgICAgIGxheW91dEFuZEdldFJUTE9mZnNldCgpOworICAgICAgICAgICAgICAgIC8vIE91ciBo
ZWlnaHQgaGFzIGNoYW5nZWQsIHNvIHJlY29tcHV0ZSBvbmx5IFkgYXhpcyBvZiB3aWRnZXRSZWN0
LgorICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gcmVjb21wdXRlIFggYXhpcywg
c28gd2Ugb25seSByZXBsYWNlIFkgYXhpcworICAgICAgICAgICAgICAgIC8vIGluIHdpZGdldFJl
Y3QuCisgICAgICAgICAgICAgICAgSW50UmVjdCBmcmFtZUluU2NyZWVuID0gY2hyb21lQ2xpZW50
LT53aW5kb3dUb1NjcmVlbihmcmFtZVJlY3QoKSk7CisgICAgICAgICAgICAgICAgd2lkZ2V0UmVj
dC5zZXRZKGZyYW1lSW5TY3JlZW4ueSgpKTsKKyAgICAgICAgICAgICAgICB3aWRnZXRSZWN0LnNl
dEhlaWdodChmcmFtZUluU2NyZWVuLmhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAvLyBBbmQg
bW92ZSB1cHdhcmRzIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICBpZiAoc3BhY2VBYm92
ZSA+IHNwYWNlQmVsb3cpCisgICAgICAgICAgICAgICAgICAgIHdpZGdldFJlY3QubW92ZSgwLCAt
KHdpZGdldFJlY3QuaGVpZ2h0KCkgKyB0YXJnZXRDb250cm9sSGVpZ2h0KSk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHdpZGdldFJlY3Q7Cit9CisKK3ZvaWQg
UG9wdXBDb250YWluZXI6OnNob3dQb3B1cChGcmFtZVZpZXcqIHZpZXcpCit7CisgICAgbV9mcmFt
ZVZpZXcgPSB2aWV3OworICAgIGxpc3RCb3goKS0+bV9mb2N1c2VkTm9kZSA9IG1fZnJhbWVWaWV3
LT5mcmFtZSgpLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpOworCisgICAgQ2hyb21lQ2xpZW50
Q2hyb21pdW0qIGNocm9tZUNsaWVudCA9IGNocm9tZUNsaWVudENocm9taXVtKCk7CisgICAgaWYg
KGNocm9tZUNsaWVudCkgeworICAgICAgICBJbnRSZWN0IHBvcHVwUmVjdCA9IGZyYW1lUmVjdCgp
OworICAgICAgICBjaHJvbWVDbGllbnQtPnBvcHVwT3BlbmVkKHRoaXMsIGxheW91dEFuZENhbGN1
bGF0ZVdpZGdldFJlY3QocG9wdXBSZWN0LmhlaWdodCgpLCBwb3B1cFJlY3QubG9jYXRpb24oKSks
IGZhbHNlKTsKKyAgICAgICAgbV9wb3B1cE9wZW4gPSB0cnVlOworICAgIH0KKworICAgIGlmICgh
bV9saXN0Qm94LT5wYXJlbnQoKSkKKyAgICAgICAgYWRkQ2hpbGQobV9saXN0Qm94LmdldCgpKTsK
KworICAgIC8vIEVuYWJsZSBzY3JvbGxiYXJzIGFmdGVyIHRoZSBsaXN0Ym94IGlzIGluc2VydGVk
IGludG8gdGhlIGhpZXJhcmNoeSwKKyAgICAvLyBzbyBpdCBoYXMgYSBwcm9wZXIgV2lkZ2V0Q2xp
ZW50LgorICAgIG1fbGlzdEJveC0+c2V0VmVydGljYWxTY3JvbGxiYXJNb2RlKFNjcm9sbGJhckF1
dG8pOworCisgICAgbV9saXN0Qm94LT5zY3JvbGxUb1JldmVhbFNlbGVjdGlvbigpOworCisgICAg
aW52YWxpZGF0ZSgpOworfQorCit2b2lkIFBvcHVwQ29udGFpbmVyOjpoaWRlUG9wdXAoKQorewor
ICAgIGxpc3RCb3goKS0+aGlkZVBvcHVwKCk7Cit9CisKK3ZvaWQgUG9wdXBDb250YWluZXI6Om5v
dGlmeVBvcHVwSGlkZGVuKCkKK3sKKyAgICBpZiAoIW1fcG9wdXBPcGVuKQorICAgICAgICByZXR1
cm47CisgICAgbV9wb3B1cE9wZW4gPSBmYWxzZTsKKyAgICBjaHJvbWVDbGllbnRDaHJvbWl1bSgp
LT5wb3B1cENsb3NlZCh0aGlzKTsKK30KKworaW50IFBvcHVwQ29udGFpbmVyOjpsYXlvdXRBbmRH
ZXRSVExPZmZzZXQoKQoreworICAgIG1fbGlzdEJveC0+bGF5b3V0KCk7CisKKyAgICAvLyBQbGFj
ZSB0aGUgbGlzdGJveCB3aXRoaW4gb3VyIGJvcmRlci4KKyAgICBtX2xpc3RCb3gtPm1vdmUoa0Jv
cmRlclNpemUsIGtCb3JkZXJTaXplKTsKKworICAgIC8vIFNpemUgb3Vyc2VsdmVzIHRvIGNvbnRh
aW4gbGlzdGJveCArIGJvcmRlci4KKyAgICBpbnQgbGlzdEJveFdpZHRoID0gbV9saXN0Qm94LT53
aWR0aCgpICsga0JvcmRlclNpemUgKiAyOworICAgIHJlc2l6ZShsaXN0Qm94V2lkdGgsIG1fbGlz
dEJveC0+aGVpZ2h0KCkgKyBrQm9yZGVyU2l6ZSAqIDIpOworICAgIGludmFsaWRhdGUoKTsKKwor
ICAgIC8vIENvbXB1dGUgdGhlIHN0YXJ0aW5nIHgtYXhpcyBmb3IgYSBub3JtYWwgUlRMIG9yIHJp
Z2h0LWFsaWduZWQgTFRSIGRyb3Bkb3duLiBGb3IgdGhvc2UsCisgICAgLy8gdGhlIHJpZ2h0IGVk
Z2Ugb2YgZHJvcGRvd24gYm94IHNob3VsZCBiZSBhbGlnbmVkIHdpdGggdGhlIHJpZ2h0IGVkZ2Ug
b2YgPHNlbGVjdD4vPGlucHV0PiBlbGVtZW50IGJveCwKKyAgICAvLyBhbmQgdGhlIGRyb3Bkb3du
IGJveCBzaG91bGQgYmUgZXhwYW5kZWQgdG8gdGhlIGxlZnQgaWYgbW9yZSBzcGFjZSBpcyBuZWVk
ZWQuCisgICAgLy8gbV9vcmlnaW5hbEZyYW1lUmVjdC53aWR0aCgpIGlzIHRoZSB3aWR0aCBvZiB0
aGUgdGFyZ2V0IDxzZWxlY3Q+LzxpbnB1dD4gZWxlbWVudC4KKyAgICByZXR1cm4gbV9vcmlnaW5h
bEZyYW1lUmVjdC53aWR0aCgpIC0gbGlzdEJveFdpZHRoOworfQorCitib29sIFBvcHVwQ29udGFp
bmVyOjpoYW5kbGVNb3VzZURvd25FdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2ZW50
KQoreworICAgIFVzZXJHZXN0dXJlSW5kaWNhdG9yIGdlc3R1cmVJbmRpY2F0b3IoRGVmaW5pdGVs
eVByb2Nlc3NpbmdVc2VyR2VzdHVyZSk7CisgICAgcmV0dXJuIG1fbGlzdEJveC0+aGFuZGxlTW91
c2VEb3duRXZlbnQoCisgICAgICAgIGNvbnN0cnVjdFJlbGF0aXZlTW91c2VFdmVudChldmVudCwg
dGhpcywgbV9saXN0Qm94LmdldCgpKSk7Cit9CisKK2Jvb2wgUG9wdXBDb250YWluZXI6OmhhbmRs
ZU1vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZlbnQpCit7CisgICAg
VXNlckdlc3R1cmVJbmRpY2F0b3IgZ2VzdHVyZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2lu
Z1VzZXJHZXN0dXJlKTsKKyAgICByZXR1cm4gbV9saXN0Qm94LT5oYW5kbGVNb3VzZU1vdmVFdmVu
dCgKKyAgICAgICAgY29uc3RydWN0UmVsYXRpdmVNb3VzZUV2ZW50KGV2ZW50LCB0aGlzLCBtX2xp
c3RCb3guZ2V0KCkpKTsKK30KKworYm9vbCBQb3B1cENvbnRhaW5lcjo6aGFuZGxlTW91c2VSZWxl
YXNlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKK3sKKyAgICBSZWZQdHI8
UG9wdXBDb250YWluZXI+IHByb3RlY3QodGhpcyk7CisgICAgVXNlckdlc3R1cmVJbmRpY2F0b3Ig
Z2VzdHVyZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJHZXN0dXJlKTsKKyAgICBy
ZXR1cm4gbV9saXN0Qm94LT5oYW5kbGVNb3VzZVJlbGVhc2VFdmVudCgKKyAgICAgICAgY29uc3Ry
dWN0UmVsYXRpdmVNb3VzZUV2ZW50KGV2ZW50LCB0aGlzLCBtX2xpc3RCb3guZ2V0KCkpKTsKK30K
KworYm9vbCBQb3B1cENvbnRhaW5lcjo6aGFuZGxlV2hlZWxFdmVudChjb25zdCBQbGF0Zm9ybVdo
ZWVsRXZlbnQmIGV2ZW50KQoreworICAgIFVzZXJHZXN0dXJlSW5kaWNhdG9yIGdlc3R1cmVJbmRp
Y2F0b3IoRGVmaW5pdGVseVByb2Nlc3NpbmdVc2VyR2VzdHVyZSk7CisgICAgcmV0dXJuIG1fbGlz
dEJveC0+aGFuZGxlV2hlZWxFdmVudCgKKyAgICAgICAgY29uc3RydWN0UmVsYXRpdmVXaGVlbEV2
ZW50KGV2ZW50LCB0aGlzLCBtX2xpc3RCb3guZ2V0KCkpKTsKK30KKworI2lmIEVOQUJMRShUT1VD
SF9FVkVOVFMpCitib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBs
YXRmb3JtVG91Y2hFdmVudCYpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKKyNp
ZiBFTkFCTEUoR0VTVFVSRV9SRUNPR05JWkVSKQorLy8gRklYTUU6IFJlZmFjdG9yIHRoaXMgY29k
ZSB0byBzaGFyZSBmdW5jdGlvbmFsaXR5IHdpdGggRXZlbnRIYW5kbGVyOjpoYW5kbGVHZXN0dXJl
RXZlbnQuCitib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVHZXN0dXJlRXZlbnQoY29uc3QgUGxh
dGZvcm1HZXN0dXJlRXZlbnQmIGdlc3R1cmVFdmVudCkKK3sKKyAgICBzd2l0Y2ggKGdlc3R1cmVF
dmVudC50eXBlKCkpIHsKKyAgICBjYXNlIFBsYXRmb3JtR2VzdHVyZUV2ZW50OjpUYXBUeXBlOiB7
CisgICAgICAgIFBsYXRmb3JtTW91c2VFdmVudCBmYWtlTW91c2VNb3ZlKGdlc3R1cmVFdmVudC5w
b3NpdGlvbigpLCBnZXN0dXJlRXZlbnQuZ2xvYmFsUG9zaXRpb24oKSwgTm9CdXR0b24sIE1vdXNl
RXZlbnRNb3ZlZCwgLyogY2xpY2tDb3VudCAqLyAxLCBnZXN0dXJlRXZlbnQuc2hpZnRLZXkoKSwg
Z2VzdHVyZUV2ZW50LmN0cmxLZXkoKSwgZ2VzdHVyZUV2ZW50LmFsdEtleSgpLCBnZXN0dXJlRXZl
bnQubWV0YUtleSgpLCBnZXN0dXJlRXZlbnQudGltZXN0YW1wKCkpOworICAgICAgICBQbGF0Zm9y
bU1vdXNlRXZlbnQgZmFrZU1vdXNlRG93bihnZXN0dXJlRXZlbnQucG9zaXRpb24oKSwgZ2VzdHVy
ZUV2ZW50Lmdsb2JhbFBvc2l0aW9uKCksIExlZnRCdXR0b24sIE1vdXNlRXZlbnRQcmVzc2VkLCAv
KiBjbGlja0NvdW50ICovIDEsIGdlc3R1cmVFdmVudC5zaGlmdEtleSgpLCBnZXN0dXJlRXZlbnQu
Y3RybEtleSgpLCBnZXN0dXJlRXZlbnQuYWx0S2V5KCksIGdlc3R1cmVFdmVudC5tZXRhS2V5KCks
IGdlc3R1cmVFdmVudC50aW1lc3RhbXAoKSk7CisgICAgICAgIFBsYXRmb3JtTW91c2VFdmVudCBm
YWtlTW91c2VVcChnZXN0dXJlRXZlbnQucG9zaXRpb24oKSwgZ2VzdHVyZUV2ZW50Lmdsb2JhbFBv
c2l0aW9uKCksIExlZnRCdXR0b24sIE1vdXNlRXZlbnRSZWxlYXNlZCwgLyogY2xpY2tDb3VudCAq
LyAxLCBnZXN0dXJlRXZlbnQuc2hpZnRLZXkoKSwgZ2VzdHVyZUV2ZW50LmN0cmxLZXkoKSwgZ2Vz
dHVyZUV2ZW50LmFsdEtleSgpLCBnZXN0dXJlRXZlbnQubWV0YUtleSgpLCBnZXN0dXJlRXZlbnQu
dGltZXN0YW1wKCkpOworICAgICAgICAvLyBoYW5kbGVNb3VzZU1vdmVFdmVudChmYWtlTW91c2VN
b3ZlKTsKKyAgICAgICAgaGFuZGxlTW91c2VEb3duRXZlbnQoZmFrZU1vdXNlRG93bik7CisgICAg
ICAgIGhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGZha2VNb3VzZVVwKTsKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorICAgIGNhc2UgUGxhdGZvcm1HZXN0dXJlRXZlbnQ6OlNjcm9sbFVwZGF0
ZVR5cGU6IHsKKyAgICAgICAgUGxhdGZvcm1XaGVlbEV2ZW50IHN5bnRoZXRpY1doZWVsRXZlbnQo
Z2VzdHVyZUV2ZW50LnBvc2l0aW9uKCksIGdlc3R1cmVFdmVudC5nbG9iYWxQb3NpdGlvbigpLCBn
ZXN0dXJlRXZlbnQuZGVsdGFYKCksIGdlc3R1cmVFdmVudC5kZWx0YVkoKSwgZ2VzdHVyZUV2ZW50
LmRlbHRhWCgpIC8gMTIwLjBmLCBnZXN0dXJlRXZlbnQuZGVsdGFZKCkgLyAxMjAuMGYsIFNjcm9s
bEJ5UGl4ZWxXaGVlbEV2ZW50LCAvKiBpc0FjY2VwdGVkICovIGZhbHNlLCBnZXN0dXJlRXZlbnQu
c2hpZnRLZXkoKSwgZ2VzdHVyZUV2ZW50LmN0cmxLZXkoKSwgZ2VzdHVyZUV2ZW50LmFsdEtleSgp
LCBnZXN0dXJlRXZlbnQubWV0YUtleSgpKTsKKyAgICAgICAgaGFuZGxlV2hlZWxFdmVudChzeW50
aGV0aWNXaGVlbEV2ZW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2Ug
UGxhdGZvcm1HZXN0dXJlRXZlbnQ6OlNjcm9sbEJlZ2luVHlwZToKKyAgICBjYXNlIFBsYXRmb3Jt
R2VzdHVyZUV2ZW50OjpTY3JvbGxFbmRUeXBlOgorICAgICAgICBicmVhazsKKyAgICB9CisgICAg
cmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKK2Jvb2wgUG9wdXBDb250YWluZXI6OmhhbmRsZUtl
eUV2ZW50KGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYgZXZlbnQpCit7CisgICAgVXNlckdl
c3R1cmVJbmRpY2F0b3IgZ2VzdHVyZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJH
ZXN0dXJlKTsKKyAgICByZXR1cm4gbV9saXN0Qm94LT5oYW5kbGVLZXlFdmVudChldmVudCk7Cit9
CisKK3ZvaWQgUG9wdXBDb250YWluZXI6OmhpZGUoKQoreworICAgIG1fbGlzdEJveC0+YWJhbmRv
bigpOworfQorCit2b2lkIFBvcHVwQ29udGFpbmVyOjpwYWludChHcmFwaGljc0NvbnRleHQqIGdj
LCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIGFkanVzdCBjb29yZHMgZm9yIHNjcm9s
bGVkIGZyYW1lCisgICAgSW50UmVjdCByID0gaW50ZXJzZWN0aW9uKHJlY3QsIGZyYW1lUmVjdCgp
KTsKKyAgICBpbnQgdHggPSB4KCk7CisgICAgaW50IHR5ID0geSgpOworCisgICAgci5tb3ZlKC10
eCwgLXR5KTsKKworICAgIGdjLT50cmFuc2xhdGUoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR4KSwgc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KHR5KSk7CisgICAgbV9saXN0Qm94LT5wYWludChnYywgcik7CisgICAg
Z2MtPnRyYW5zbGF0ZSgtc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR4KSwgLXN0YXRpY19jYXN0PGZsb2F0
Pih0eSkpOworCisgICAgcGFpbnRCb3JkZXIoZ2MsIHJlY3QpOworfQorCit2b2lkIFBvcHVwQ29u
dGFpbmVyOjpwYWludEJvcmRlcihHcmFwaGljc0NvbnRleHQqIGdjLCBjb25zdCBJbnRSZWN0JiBy
ZWN0KQoreworICAgIC8vIEZJWE1FOiBXaGVyZSBkbyB3ZSBnZXQgdGhlIGJvcmRlciBjb2xvciBm
cm9tPworICAgIENvbG9yIGJvcmRlckNvbG9yKDEyNywgMTU3LCAxODUpOworCisgICAgZ2MtPnNl
dFN0cm9rZVN0eWxlKE5vU3Ryb2tlKTsKKyAgICBnYy0+c2V0RmlsbENvbG9yKGJvcmRlckNvbG9y
LCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKworICAgIGludCB0eCA9IHgoKTsKKyAgICBpbnQgdHkg
PSB5KCk7CisKKyAgICAvLyB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQKKyAgICBnYy0+ZHJhd1Jl
Y3QoSW50UmVjdCh0eCwgdHksIHdpZHRoKCksIGtCb3JkZXJTaXplKSk7CisgICAgZ2MtPmRyYXdS
ZWN0KEludFJlY3QodHgsIHR5LCBrQm9yZGVyU2l6ZSwgaGVpZ2h0KCkpKTsKKyAgICBnYy0+ZHJh
d1JlY3QoSW50UmVjdCh0eCwgdHkgKyBoZWlnaHQoKSAtIGtCb3JkZXJTaXplLCB3aWR0aCgpLCBr
Qm9yZGVyU2l6ZSkpOworICAgIGdjLT5kcmF3UmVjdChJbnRSZWN0KHR4ICsgd2lkdGgoKSAtIGtC
b3JkZXJTaXplLCB0eSwga0JvcmRlclNpemUsIGhlaWdodCgpKSk7Cit9CisKK2Jvb2wgUG9wdXBD
b250YWluZXI6OmlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkoaW50IGtleUNvZGUpCit7CisgICAg
cmV0dXJuIG1fbGlzdEJveC0+aXNJbnRlcmVzdGVkSW5FdmVudEZvcktleShrZXlDb2RlKTsKK30K
KworQ2hyb21lQ2xpZW50Q2hyb21pdW0qIFBvcHVwQ29udGFpbmVyOjpjaHJvbWVDbGllbnRDaHJv
bWl1bSgpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PENocm9tZUNsaWVudENocm9taXVtKj4o
bV9mcmFtZVZpZXctPmZyYW1lKCktPnBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpKTsKK30KKwor
dm9pZCBQb3B1cENvbnRhaW5lcjo6c2hvd0luUmVjdChjb25zdCBJbnRSZWN0JiByLCBGcmFtZVZp
ZXcqIHYsIGludCBpbmRleCkKK3sKKyAgICAvLyBUaGUgcmVjdCBpcyB0aGUgc2l6ZSBvZiB0aGUg
c2VsZWN0IGJveC4gSXQncyB1c3VhbGx5IGxhcmdlciB0aGFuIHdlIG5lZWQuCisgICAgLy8gc3Vi
dHJhY3QgYm9yZGVyIHNpemUgc28gdGhhdCB1c3VhbGx5IHRoZSBjb250YWluZXIgd2lsbCBiZSBk
aXNwbGF5ZWQKKyAgICAvLyBleGFjdGx5IHRoZSBzYW1lIHdpZHRoIGFzIHRoZSBzZWxlY3QgYm94
LgorICAgIGxpc3RCb3goKS0+c2V0QmFzZVdpZHRoKG1heChyLndpZHRoKCkgLSBrQm9yZGVyU2l6
ZSAqIDIsIDApKTsKKworICAgIGxpc3RCb3goKS0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKKworICAg
IC8vIFdlIHNldCB0aGUgc2VsZWN0ZWQgaXRlbSBpbiB1cGRhdGVGcm9tRWxlbWVudCgpLCBhbmQg
ZGlzcmVnYXJkIHRoZQorICAgIC8vIGluZGV4IHBhc3NlZCBpbnRvIHRoaXMgZnVuY3Rpb24gKHNh
bWUgYXMgV2Via2l0J3MgUG9wdXBNZW51V2luLmNwcCkKKyAgICAvLyBGSVhNRTogbWFrZSBzdXJl
IHRoaXMgaXMgY29ycmVjdCwgYW5kIGFkZCBhbiBhc3NlcnRpb24uCisgICAgLy8gQVNTRVJUKHBv
cHVwV2luZG93KHBvcHVwKS0+bGlzdEJveCgpLT5zZWxlY3RlZEluZGV4KCkgPT0gaW5kZXgpOwor
CisgICAgLy8gQ29udmVydCBwb2ludCB0byBtYWluIHdpbmRvdyBjb29yZHMuCisgICAgSW50UG9p
bnQgbG9jYXRpb24gPSB2LT5jb250ZW50c1RvV2luZG93KHIubG9jYXRpb24oKSk7CisKKyAgICAv
LyBNb3ZlIGl0IGJlbG93IHRoZSBzZWxlY3Qgd2lkZ2V0LgorICAgIGxvY2F0aW9uLm1vdmUoMCwg
ci5oZWlnaHQoKSk7CisKKyAgICBtX29yaWdpbmFsRnJhbWVSZWN0ID0gSW50UmVjdChsb2NhdGlv
biwgci5zaXplKCkpOworICAgIHNldEZyYW1lUmVjdChtX29yaWdpbmFsRnJhbWVSZWN0KTsKKyAg
ICBzaG93UG9wdXAodik7Cit9CisKK3ZvaWQgUG9wdXBDb250YWluZXI6OnJlZnJlc2goY29uc3Qg
SW50UmVjdCYgdGFyZ2V0Q29udHJvbFJlY3QpCit7CisgICAgSW50UG9pbnQgbG9jYXRpb24gPSBt
X2ZyYW1lVmlldy0+Y29udGVudHNUb1dpbmRvdyh0YXJnZXRDb250cm9sUmVjdC5sb2NhdGlvbigp
KTsKKyAgICAvLyBNb3ZlIGl0IGJlbG93IHRoZSBzZWxlY3Qgd2lkZ2V0LgorICAgIGxvY2F0aW9u
Lm1vdmUoMCwgdGFyZ2V0Q29udHJvbFJlY3QuaGVpZ2h0KCkpOworCisgICAgbGlzdEJveCgpLT5z
ZXRCYXNlV2lkdGgobWF4KG1fb3JpZ2luYWxGcmFtZVJlY3Qud2lkdGgoKSAtIGtCb3JkZXJTaXpl
ICogMiwgMCkpOworICAgIHNldEJvdW5kc1NpemUobV9vcmlnaW5hbEZyYW1lUmVjdC5zaXplKCkp
OworCisgICAgbGlzdEJveCgpLT51cGRhdGVGcm9tRWxlbWVudCgpOworICAgIC8vIFN0b3JlIHRo
ZSBvcmlnaW5hbCBzaXplIHRvIGNoZWNrIGlmIHdlIG5lZWQgdG8gcmVxdWVzdCB0aGUgbG9jYXRp
b24uCisgICAgSW50U2l6ZSBvcmlnaW5hbFNpemUgPSBzaXplKCk7CisgICAgSW50UmVjdCB3aWRn
ZXRSZWN0ID0gbGF5b3V0QW5kQ2FsY3VsYXRlV2lkZ2V0UmVjdCh0YXJnZXRDb250cm9sUmVjdC5o
ZWlnaHQoKSwgbG9jYXRpb24pOworICAgIGlmIChvcmlnaW5hbFNpemUgIT0gd2lkZ2V0UmVjdC5z
aXplKCkpIHsKKyAgICAgICAgQ2hyb21lQ2xpZW50Q2hyb21pdW0qIGNocm9tZUNsaWVudCA9IGNo
cm9tZUNsaWVudENocm9taXVtKCk7CisgICAgICAgIGlmIChjaHJvbWVDbGllbnQpIHsKKyAgICAg
ICAgICAgIEludFBvaW50IHdpZGdldExvY2F0aW9uID0gY2hyb21lQ2xpZW50LT5zY3JlZW5Ub1dp
bmRvdyh3aWRnZXRSZWN0LmxvY2F0aW9uKCkpOworICAgICAgICAgICAgd2lkZ2V0UmVjdC5zZXRM
b2NhdGlvbih3aWRnZXRMb2NhdGlvbik7CisgICAgICAgICAgICBzZXRGcmFtZVJlY3Qod2lkZ2V0
UmVjdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK2lubGlu
ZSBib29sIFBvcHVwQ29udGFpbmVyOjppc1JUTCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbGlz
dEJveC0+bV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkudGV4dERpcmVjdGlvbigpID09IFJUTDsK
K30KKworaW50IFBvcHVwQ29udGFpbmVyOjpzZWxlY3RlZEluZGV4KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9saXN0Qm94LT5zZWxlY3RlZEluZGV4KCk7Cit9CisKK2ludCBQb3B1cENvbnRhaW5l
cjo6bWVudUl0ZW1IZWlnaHQoKSBjb25zdAoreworICAgIHJldHVybiBtX2xpc3RCb3gtPmdldFJv
d0hlaWdodCgwKTsKK30KKworaW50IFBvcHVwQ29udGFpbmVyOjptZW51SXRlbUZvbnRTaXplKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9saXN0Qm94LT5nZXRSb3dGb250KDApLnNpemUoKTsKK30K
KworUG9wdXBNZW51U3R5bGUgUG9wdXBDb250YWluZXI6Om1lbnVTdHlsZSgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fbGlzdEJveC0+bV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCk7Cit9CisKK2Nv
bnN0IFdURjo6VmVjdG9yPFBvcHVwSXRlbSo+JiBQb3B1cENvbnRhaW5lcjo6IHBvcHVwRGF0YSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbGlzdEJveC0+aXRlbXMoKTsKK30KKworU3RyaW5nIFBv
cHVwQ29udGFpbmVyOjpnZXRTZWxlY3RlZEl0ZW1Ub29sVGlwKCkKK3sKKyAgICAvLyBXZSBjYW5u
b3QgdXNlIG1fcG9wdXBDbGllbnQtPnNlbGVjdGVkSW5kZXgoKSB0byBjaG9vc2UgdG9vbHRpcCBt
ZXNzYWdlLAorICAgIC8vIGJlY2F1c2UgdGhlIHNlbGVjdGVkSW5kZXgoKSBtaWdodCByZXR1cm4g
ZmluYWwgc2VsZWN0ZWQgaW5kZXgsIG5vdCBob3ZlcmluZyBzZWxlY3Rpb24uCisgICAgcmV0dXJu
IGxpc3RCb3goKS0+bV9wb3B1cENsaWVudC0+aXRlbVRvb2xUaXAobGlzdEJveCgpLT5tX3NlbGVj
dGVkSW5kZXgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cENvbnRhaW5lci5oIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBDb250YWluZXIuaApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40NTJl
MWI0MjU0MjZjOWQzMTlhZDMzNWYyNGQ3YmYwOWRlM2IzYjBmCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBDb250YWluZXIuaApAQCAtMCww
ICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1l
dDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaWZuZGVmIFBvcHVwQ29udGFpbmVyX2gKKyNkZWZpbmUgUG9wdXBDb250YWlu
ZXJfaAorCisjaW5jbHVkZSAiRnJhbWVsZXNzU2Nyb2xsVmlldy5oIgorI2luY2x1ZGUgIlBvcHVw
TGlzdEJveC5oIgorI2luY2x1ZGUgIlBvcHVwTWVudVN0eWxlLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgQ2hyb21lQ2xpZW50Q2hyb21pdW07CitjbGFzcyBGcmFtZVZpZXc7Citj
bGFzcyBQb3B1cE1lbnVDbGllbnQ7CisKK2NsYXNzIFBvcHVwQ29udGFpbmVyIDogcHVibGljIEZy
YW1lbGVzc1Njcm9sbFZpZXcgeworcHVibGljOgorICAgIGVudW0gUG9wdXBUeXBlIHsKKyAgICAg
ICAgU2VsZWN0LCAvLyBIVE1MIHNlbGVjdCBwb3B1cC4KKyAgICAgICAgU3VnZ2VzdGlvbiwgLy8g
QXV0b2NvbXBsZXRlL2F1dG9maWxsIHBvcHVwLgorICAgIH07CisKKyAgICBzdGF0aWMgUGFzc1Jl
ZlB0cjxQb3B1cENvbnRhaW5lcj4gY3JlYXRlKFBvcHVwTWVudUNsaWVudCosIFBvcHVwVHlwZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvcHVw
Q29udGFpbmVyU2V0dGluZ3MmKTsKKworICAgIC8vIFdoZXRoZXIgYSBrZXkgZXZlbnQgc2hvdWxk
IGJlIHNlbnQgdG8gdGhpcyBwb3B1cC4KKyAgICB2aXJ0dWFsIGJvb2wgaXNJbnRlcmVzdGVkSW5F
dmVudEZvcktleShpbnQga2V5Q29kZSk7CisKKyAgICAvLyBGcmFtZWxlc3NTY3JvbGxWaWV3Cisg
ICAgdmlydHVhbCB2b2lkIHBhaW50KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmKTsK
KyAgICB2aXJ0dWFsIHZvaWQgaGlkZSgpOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZURv
d25FdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFu
ZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7CisgICAgdmlydHVh
bCBib29sIGhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYp
OworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVXaGVlbEV2ZW50KGNvbnN0IFBsYXRmb3JtV2hlZWxF
dmVudCYpOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVLZXlFdmVudChjb25zdCBQbGF0Zm9ybUtl
eWJvYXJkRXZlbnQmKTsKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorICAgIHZpcnR1YWwgYm9v
bCBoYW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBsYXRmb3JtVG91Y2hFdmVudCYpOworI2VuZGlmCisj
aWYgRU5BQkxFKEdFU1RVUkVfUkVDT0dOSVpFUikKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlR2Vz
dHVyZUV2ZW50KGNvbnN0IFBsYXRmb3JtR2VzdHVyZUV2ZW50Jik7CisjZW5kaWYKKworICAgIC8v
IFBvcHVwQ29udGFpbmVyIG1ldGhvZHMKKworICAgIC8vIFNob3cgdGhlIHBvcHVwCisgICAgdm9p
ZCBzaG93UG9wdXAoRnJhbWVWaWV3Kik7CisKKyAgICAvLyBTaG93IHRoZSBwb3B1cCBpbiB0aGUg
c3BlY2lmaWVkIHJlY3QgZm9yIHRoZSBzcGVjaWZpZWQgZnJhbWUuCisgICAgLy8gTm90ZTogdGhp
cyBjb2RlIHdhcyBzb21laG93IGFyYml0cmFyaWx5IGZhY3RvcmVkLW91dCBvZiB0aGUgUG9wdXAg
Y2xhc3MKKyAgICAvLyBzbyBXZWJWaWV3SW1wbCBjYW4gY3JlYXRlIGEgUG9wdXBDb250YWluZXIu
IFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yCisgICAgLy8gZGlzcGxheWluZyBhdXRvIGNvbXBsZXRl
IHBvcHVwIG1lbnVzIG9uIE1hYyBDaHJvbWl1bSwgYW5kIGZvciBhbGwKKyAgICAvLyBwb3B1cHMg
b24gb3RoZXIgcGxhdGZvcm1zLgorICAgIHZvaWQgc2hvd0luUmVjdChjb25zdCBJbnRSZWN0Jiwg
RnJhbWVWaWV3KiwgaW50IGluZGV4KTsKKworICAgIC8vIEhpZGVzIHRoZSBwb3B1cC4KKyAgICB2
b2lkIGhpZGVQb3B1cCgpOworCisgICAgLy8gVGhlIHBvcHVwIHdhcyBoaWRkZW4uCisgICAgdm9p
ZCBub3RpZnlQb3B1cEhpZGRlbigpOworCisgICAgLy8gQ29tcHV0ZSBzaXplIG9mIHdpZGdldCBh
bmQgY2hpbGRyZW4uIFJldHVybiByaWdodCBvZmZzZXQgZm9yIHRoZSBwb3B1cCByaWdodCBhbGln
bm1lbnQuCisgICAgaW50IGxheW91dEFuZEdldFJUTE9mZnNldCgpOworCisgICAgUG9wdXBMaXN0
Qm94KiBsaXN0Qm94KCkgY29uc3QgeyByZXR1cm4gbV9saXN0Qm94LmdldCgpOyB9CisKKyAgICBi
b29sIGlzUlRMKCkgY29uc3Q7CisKKyAgICAvLyBHZXRzIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0
aGF0IHRoZSB1c2VyIGlzIGN1cnJlbnRseSBtb3VzZWQtb3ZlciBvcgorICAgIC8vIGhhcyBzZWxl
Y3RlZCB3aXRoIHRoZSBrZXlib2FyZCB1cC9kb3duIGFycm93cy4KKyAgICBpbnQgc2VsZWN0ZWRJ
bmRleCgpIGNvbnN0OworCisgICAgLy8gUmVmcmVzaCB0aGUgcG9wdXAgdmFsdWVzIGZyb20gdGhl
IFBvcHVwTWVudUNsaWVudC4KKyAgICB2b2lkIHJlZnJlc2goY29uc3QgSW50UmVjdCYgdGFyZ2V0
Q29udHJvbFJlY3QpOworCisgICAgLy8gVGhlIG1lbnUgcGVyLWl0ZW0gZGF0YS4KKyAgICBjb25z
dCBXVEY6OlZlY3RvcjxQb3B1cEl0ZW0qPiYgcG9wdXBEYXRhKCkgY29uc3Q7CisKKyAgICAvLyBU
aGUgaGVpZ2h0IG9mIGEgcm93IGluIHRoZSBtZW51LgorICAgIGludCBtZW51SXRlbUhlaWdodCgp
IGNvbnN0OworCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIGZvbnQgYmVpbmcgdXNlZC4KKyAgICBp
bnQgbWVudUl0ZW1Gb250U2l6ZSgpIGNvbnN0OworCisgICAgLy8gVGhlIHN0eWxlIG9mIHRoZSBt
ZW51IGJlaW5nIHVzZWQuCisgICAgUG9wdXBNZW51U3R5bGUgbWVudVN0eWxlKCkgY29uc3Q7CisK
KyAgICBQb3B1cFR5cGUgcG9wdXBUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9wb3B1cFR5cGU7IH0K
KworICAgIC8vIFdoaWxlIGhvdmVyaW5nIHBvcHVwIG1lbnUgd2luZG93LCB3ZSB3YW50IHRvIHNo
b3cgdG9vbCB0aXAgbWVzc2FnZS4KKyAgICBTdHJpbmcgZ2V0U2VsZWN0ZWRJdGVtVG9vbFRpcCgp
OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBXVEY6OlJlZkNvdW50ZWQ8UG9wdXBDb250
YWluZXI+OworCisgICAgUG9wdXBDb250YWluZXIoUG9wdXBNZW51Q2xpZW50KiwgUG9wdXBUeXBl
LCBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJik7CisgICAgflBvcHVwQ29udGFpbmVyKCk7
CisKKyAgICAvLyBQYWludCB0aGUgYm9yZGVyLgorICAgIHZvaWQgcGFpbnRCb3JkZXIoR3JhcGhp
Y3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYpOworCisgICAgLy8gTGF5b3V0IGFuZCBjYWxjdWxh
dGUgcG9wdXAgd2lkZ2V0IHNpemUgYW5kIGxvY2F0aW9uIGFuZCByZXR1cm5zIGl0IGFzIEludFJl
Y3QuCisgICAgSW50UmVjdCBsYXlvdXRBbmRDYWxjdWxhdGVXaWRnZXRSZWN0KGludCB0YXJnZXRD
b250cm9sSGVpZ2h0LCBjb25zdCBJbnRQb2ludCYgcG9wdXBJbml0aWFsQ29vcmRpbmF0ZSk7CisK
KyAgICAvLyBSZXR1cm5zIHRoZSBDaHJvbWVDbGllbnQgb2YgdGhlIHBhZ2UgdGhpcyBwb3B1cCBp
cyBhc3NvY2lhdGVkIHdpdGguCisgICAgQ2hyb21lQ2xpZW50Q2hyb21pdW0qIGNocm9tZUNsaWVu
dENocm9taXVtKCk7CisKKyAgICBSZWZQdHI8UG9wdXBMaXN0Qm94PiBtX2xpc3RCb3g7CisgICAg
UmVmUHRyPEZyYW1lVmlldz4gbV9mcmFtZVZpZXc7CisKKyAgICBQb3B1cENvbnRhaW5lclNldHRp
bmdzIG1fc2V0dGluZ3M7CisgICAgUG9wdXBUeXBlIG1fcG9wdXBUeXBlOworICAgIEludFJlY3Qg
bV9vcmlnaW5hbEZyYW1lUmVjdDsKKyAgICAvLyBXaGV0aGVyIHRoZSBwb3B1cCBpcyBjdXJyZW50
bHkgb3Blbi4KKyAgICBib29sIG1fcG9wdXBPcGVuOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9t
aXVtL1BvcHVwTGlzdEJveC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Q
b3B1cExpc3RCb3guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjIwMTUwNjRjZGMxOGUyNTkyMDUyNWYzMGE0Nzkz
OTMwNTdlMTIwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9j
aHJvbWl1bS9Qb3B1cExpc3RCb3guY3BwCkBAIC0wLDAgKzEsOTExIEBACisvKgorICogQ29weXJp
Z2h0IChjKSAyMDExLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRp
b24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFt
ZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMg
SVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisg
KiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiUG9wdXBMaXN0Qm94LmgiCisKKyNpbmNsdWRlICJGb250LmgiCisjaW5j
bHVkZSAiRm9udFNlbGVjdG9yLmgiCisjaW5jbHVkZSAiRnJhbWVsZXNzU2Nyb2xsVmlld0NsaWVu
dC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIK
KyNpbmNsdWRlICJLZXlib2FyZENvZGVzLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1LZXlib2FyZEV2
ZW50LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiUGxhdGZv
cm1TY3JlZW4uaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVdoZWVsRXZlbnQuaCIKKyNpbmNsdWRlICJQ
b3B1cENvbnRhaW5lci5oIgorI2luY2x1ZGUgIlBvcHVwTWVudUNocm9taXVtLmgiCisjaW5jbHVk
ZSAiUG9wdXBNZW51Q2xpZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKyNpbmNsdWRl
ICJTY3JvbGxiYXJUaGVtZS5oIgorI2luY2x1ZGUgIlN0cmluZ1RydW5jYXRvci5oIgorI2luY2x1
ZGUgIlRleHRSdW4uaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8d3RmL0N1cnJlbnRU
aW1lLmg+CisKKyNpZiBFTkFCTEUoR0VTVFVSRV9FVkVOVFMpCisjaW5jbHVkZSAiUGxhdGZvcm1H
ZXN0dXJlRXZlbnQuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyNpbmNs
dWRlICJQbGF0Zm9ybVRvdWNoRXZlbnQuaCIKKyNlbmRpZgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgV1RGOwordXNpbmcgbmFt
ZXNwYWNlIFVuaWNvZGU7CisKK1BvcHVwTGlzdEJveDo6UG9wdXBMaXN0Qm94KFBvcHVwTWVudUNs
aWVudCogY2xpZW50LCBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJiBzZXR0aW5ncykKKyAg
ICA6IG1fc2V0dGluZ3Moc2V0dGluZ3MpCisgICAgLCBtX29yaWdpbmFsSW5kZXgoMCkKKyAgICAs
IG1fc2VsZWN0ZWRJbmRleCgwKQorICAgICwgbV9hY2NlcHRlZEluZGV4T25BYmFuZG9uKC0xKQor
ICAgICwgbV92aXNpYmxlUm93cygwKQorICAgICwgbV9iYXNlV2lkdGgoMCkKKyAgICAsIG1fbWF4
SGVpZ2h0KGtNYXhIZWlnaHQpCisgICAgLCBtX3BvcHVwQ2xpZW50KGNsaWVudCkKKyAgICAsIG1f
cmVwZWF0aW5nQ2hhcigwKQorICAgICwgbV9sYXN0Q2hhclRpbWUoMCkKKyAgICAsIG1fbWF4V2lu
ZG93V2lkdGgoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSkKK3sKKyAgICBzZXRTY3Jv
bGxiYXJNb2RlcyhTY3JvbGxiYXJBbHdheXNPZmYsIFNjcm9sbGJhckFsd2F5c09mZik7Cit9CisK
K2Jvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVNb3VzZURvd25FdmVudChjb25zdCBQbGF0Zm9ybU1v
dXNlRXZlbnQmIGV2ZW50KQoreworICAgIFNjcm9sbGJhciogc2Nyb2xsYmFyID0gc2Nyb2xsYmFy
QXRQb2ludChldmVudC5wb3MoKSk7CisgICAgaWYgKHNjcm9sbGJhcikgeworICAgICAgICBtX2Nh
cHR1cmluZ1Njcm9sbGJhciA9IHNjcm9sbGJhcjsKKyAgICAgICAgbV9jYXB0dXJpbmdTY3JvbGxi
YXItPm1vdXNlRG93bihldmVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IGlmICghaXNQb2ludEluQm91bmRzKGV2ZW50LnBvcygpKSkKKyAgICAgICAgYWJhbmRvbigpOwor
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVNb3VzZU1v
dmVFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2ZW50KQoreworICAgIGlmIChtX2Nh
cHR1cmluZ1Njcm9sbGJhcikgeworICAgICAgICBtX2NhcHR1cmluZ1Njcm9sbGJhci0+bW91c2VN
b3ZlZChldmVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIFNjcm9sbGJh
ciogc2Nyb2xsYmFyID0gc2Nyb2xsYmFyQXRQb2ludChldmVudC5wb3MoKSk7CisgICAgaWYgKG1f
bGFzdFNjcm9sbGJhclVuZGVyTW91c2UgIT0gc2Nyb2xsYmFyKSB7CisgICAgICAgIC8vIFNlbmQg
bW91c2UgZXhpdGVkIHRvIHRoZSBvbGQgc2Nyb2xsYmFyLgorICAgICAgICBpZiAobV9sYXN0U2Ny
b2xsYmFyVW5kZXJNb3VzZSkKKyAgICAgICAgICAgIG1fbGFzdFNjcm9sbGJhclVuZGVyTW91c2Ut
Pm1vdXNlRXhpdGVkKCk7CisgICAgICAgIG1fbGFzdFNjcm9sbGJhclVuZGVyTW91c2UgPSBzY3Jv
bGxiYXI7CisgICAgfQorCisgICAgaWYgKHNjcm9sbGJhcikgeworICAgICAgICBzY3JvbGxiYXIt
Pm1vdXNlTW92ZWQoZXZlbnQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBp
ZiAoIWlzUG9pbnRJbkJvdW5kcyhldmVudC5wb3MoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIHNlbGVjdEluZGV4KHBvaW50VG9Sb3dJbmRleChldmVudC5wb3MoKSkpOworICAgIHJl
dHVybiB0cnVlOworfQorCitib29sIFBvcHVwTGlzdEJveDo6aGFuZGxlTW91c2VSZWxlYXNlRXZl
bnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKK3sKKyAgICBpZiAobV9jYXB0dXJp
bmdTY3JvbGxiYXIpIHsKKyAgICAgICAgbV9jYXB0dXJpbmdTY3JvbGxiYXItPm1vdXNlVXAoKTsK
KyAgICAgICAgbV9jYXB0dXJpbmdTY3JvbGxiYXIgPSAwOworICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisKKyAgICBpZiAoIWlzUG9pbnRJbkJvdW5kcyhldmVudC5wb3MoKSkpCisgICAgICAg
IHJldHVybiB0cnVlOworCisgICAgLy8gTmVlZCB0byBjaGVjayBiZWZvcmUgY2FsbGluZyBhY2Nl
cHRJbmRleCgpLCBiZWNhdXNlIG1fcG9wdXBDbGllbnQgbWlnaHQgYmUgcmVtb3ZlZCBpbiBhY2Nl
cHRJbmRleCgpIGNhbGxpbmcgYmVjYXVzZSBvZiBldmVudCBoYW5kbGVyLgorICAgIGJvb2wgaXNT
ZWxlY3RQb3B1cCA9IG1fcG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpLm1lbnVUeXBlKCkgPT0gUG9w
dXBNZW51U3R5bGU6OlNlbGVjdFBvcHVwOworICAgIGlmIChhY2NlcHRJbmRleChwb2ludFRvUm93
SW5kZXgoZXZlbnQucG9zKCkpKSAmJiBtX2ZvY3VzZWROb2RlICYmIGlzU2VsZWN0UG9wdXApIHsK
KyAgICAgICAgbV9mb2N1c2VkTm9kZS0+ZGlzcGF0Y2hNb3VzZUV2ZW50KGV2ZW50LCBldmVudE5h
bWVzKCkubW91c2V1cEV2ZW50KTsKKyAgICAgICAgbV9mb2N1c2VkTm9kZS0+ZGlzcGF0Y2hNb3Vz
ZUV2ZW50KGV2ZW50LCBldmVudE5hbWVzKCkuY2xpY2tFdmVudCk7CisKKyAgICAgICAgLy8gQ2xl
YXIgbV9mb2N1c2VkTm9kZSBoZXJlLCBiZWNhdXNlIHdlIGNhbm5vdCBjbGVhciBpbiBoaWRlUG9w
dXAoKSB3aGljaCBpcyBjYWxsZWQgYmVmb3JlIGRpc3BhdGNoTW91c2VFdmVudCgpIGlzIGNhbGxl
ZC4KKyAgICAgICAgbV9mb2N1c2VkTm9kZSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK2Jvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVXaGVlbEV2ZW50KGNvbnN0IFBsYXRmb3Jt
V2hlZWxFdmVudCYgZXZlbnQpCit7CisgICAgaWYgKCFpc1BvaW50SW5Cb3VuZHMoZXZlbnQucG9z
KCkpKSB7CisgICAgICAgIGFiYW5kb24oKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
CisgICAgLy8gUGFzcyBpdCBvZmYgdG8gdGhlIHNjcm9sbCB2aWV3LgorICAgIC8vIFNhZGx5LCBX
ZWJDb3JlIGRldnMgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgd2hvbGUgImNvbnN0IiB0aGluZy4KKyAg
ICB3aGVlbEV2ZW50KGNvbnN0X2Nhc3Q8UGxhdGZvcm1XaGVlbEV2ZW50Jj4oZXZlbnQpKTsKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworLy8gU2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIGhhbmRs
ZUtleUV2ZW50KCkuCitib29sIFBvcHVwTGlzdEJveDo6aXNJbnRlcmVzdGVkSW5FdmVudEZvcktl
eShpbnQga2V5Q29kZSkKK3sKKyAgICBzd2l0Y2ggKGtleUNvZGUpIHsKKyAgICBjYXNlIFZLRVlf
RVNDQVBFOgorICAgIGNhc2UgVktFWV9SRVRVUk46CisgICAgY2FzZSBWS0VZX1VQOgorICAgIGNh
c2UgVktFWV9ET1dOOgorICAgIGNhc2UgVktFWV9QUklPUjoKKyAgICBjYXNlIFZLRVlfTkVYVDoK
KyAgICBjYXNlIFZLRVlfSE9NRToKKyAgICBjYXNlIFZLRVlfRU5EOgorICAgIGNhc2UgVktFWV9U
QUI6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9Cit9CisKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorYm9vbCBQb3B1cExp
c3RCb3g6OmhhbmRsZVRvdWNoRXZlbnQoY29uc3QgUGxhdGZvcm1Ub3VjaEV2ZW50JikKK3sKKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRShHRVNUVVJFX1JFQ09HTkla
RVIpCitib29sIFBvcHVwTGlzdEJveDo6aGFuZGxlR2VzdHVyZUV2ZW50KGNvbnN0IFBsYXRmb3Jt
R2VzdHVyZUV2ZW50JikKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKworc3RhdGlj
IGJvb2wgaXNDaGFyYWN0ZXJUeXBlRXZlbnQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50JiBl
dmVudCkKK3sKKyAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGNoYXJhY3Rlci10
eXBlZCBldmVudCBvciBub3QuCisgICAgLy8gV2UgdXNlIFJhd0tleURvd24vQ2hhci9LZXlVcCBl
dmVudCBzY2hlbWUgb24gYWxsIHBsYXRmb3JtcywKKyAgICAvLyBzbyBQbGF0Zm9ybUtleWJvYXJk
RXZlbnQ6OkNoYXIgKG5vdCBSYXdLZXlEb3duKSB0eXBlIGV2ZW50CisgICAgLy8gaXMgY29uc2lk
ZXJlZCBhcyBjaGFyYWN0ZXIgdHlwZSBldmVudC4KKyAgICByZXR1cm4gZXZlbnQudHlwZSgpID09
IFBsYXRmb3JtS2V5Ym9hcmRFdmVudDo6Q2hhcjsKK30KKworYm9vbCBQb3B1cExpc3RCb3g6Omhh
bmRsZUtleUV2ZW50KGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYgZXZlbnQpCit7CisgICAg
aWYgKGV2ZW50LnR5cGUoKSA9PSBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6OktleVVwKQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghbnVtSXRlbXMoKSAmJiBldmVudC53aW5kb3dzVmly
dHVhbEtleUNvZGUoKSAhPSBWS0VZX0VTQ0FQRSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAg
ICBzd2l0Y2ggKGV2ZW50LndpbmRvd3NWaXJ0dWFsS2V5Q29kZSgpKSB7CisgICAgY2FzZSBWS0VZ
X0VTQ0FQRToKKyAgICAgICAgYWJhbmRvbigpOyAvLyBtYXkgZGVsZXRlIHRoaXMKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgY2FzZSBWS0VZX1JFVFVSTjoKKyAgICAgICAgaWYgKG1fc2VsZWN0
ZWRJbmRleCA9PSAtMSkgIHsKKyAgICAgICAgICAgIGhpZGVQb3B1cCgpOworICAgICAgICAgICAg
Ly8gRG9uJ3QgZWF0IHRoZSBlbnRlciBpZiBub3RoaW5nIGlzIHNlbGVjdGVkLgorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGFjY2VwdEluZGV4KG1fc2VsZWN0
ZWRJbmRleCk7IC8vIG1heSBkZWxldGUgdGhpcworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBj
YXNlIFZLRVlfVVA6CisgICAgY2FzZSBWS0VZX0RPV046CisgICAgICAgIC8vIFdlIGhhdmUgdG8g
Zm9yd2FyZCBvbmx5IHNoaWZ0ICsgdXAgY29tYmluYXRpb24gdG8gZm9jdXNlZCBub2RlIHdoZW4g
YXV0b2ZpbGwgcG9wdXAuCisgICAgICAgIC8vIEJlY2F1c2UgYWxsIGNoYXJhY3RlcnMgZnJvbSB0
aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBhcmVhIHNob3VsZCBzZWxlY3RlZCB3
aGVuIHlvdSBwcmVzcyBzaGlmdCArIHVwIGFycm93LgorICAgICAgICAvLyBzaGlmdCArIGRvd24g
c2hvdWxkIGJlIHRoZSBzaW1pbGFyIHdheSB0byBzaGlmdCArIHVwLgorICAgICAgICBpZiAoZXZl
bnQubW9kaWZpZXJzKCkgJiYgbV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkubWVudVR5cGUoKSA9
PSBQb3B1cE1lbnVTdHlsZTo6QXV0b2ZpbGxQb3B1cCkKKyAgICAgICAgICAgIG1fZm9jdXNlZE5v
ZGUtPmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOworICAgICAgICBlbHNlIGlmIChldmVudC53aW5k
b3dzVmlydHVhbEtleUNvZGUoKSA9PSBWS0VZX1VQKQorICAgICAgICAgICAgc2VsZWN0UHJldmlv
dXNSb3coKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VsZWN0TmV4dFJvdygpOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIFZLRVlfUFJJT1I6CisgICAgICAgIGFkanVzdFNlbGVjdGVk
SW5kZXgoLW1fdmlzaWJsZVJvd3MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLRVlfTkVY
VDoKKyAgICAgICAgYWRqdXN0U2VsZWN0ZWRJbmRleChtX3Zpc2libGVSb3dzKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBWS0VZX0hPTUU6CisgICAgICAgIGFkanVzdFNlbGVjdGVkSW5kZXgo
LW1fc2VsZWN0ZWRJbmRleCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktFWV9FTkQ6Cisg
ICAgICAgIGFkanVzdFNlbGVjdGVkSW5kZXgobV9pdGVtcy5zaXplKCkpOworICAgICAgICBicmVh
azsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoIWV2ZW50LmN0cmxLZXkoKSAmJiAhZXZlbnQu
YWx0S2V5KCkgJiYgIWV2ZW50Lm1ldGFLZXkoKQorICAgICAgICAgICAgJiYgaXNQcmludGFibGVD
aGFyKGV2ZW50LndpbmRvd3NWaXJ0dWFsS2V5Q29kZSgpKQorICAgICAgICAgICAgJiYgaXNDaGFy
YWN0ZXJUeXBlRXZlbnQoZXZlbnQpKQorICAgICAgICAgICAgdHlwZUFoZWFkRmluZChldmVudCk7
CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChtX29yaWdpbmFsSW5kZXggIT0gbV9z
ZWxlY3RlZEluZGV4KSB7CisgICAgICAgIC8vIEtleWJvYXJkIGV2ZW50cyBzaG91bGQgdXBkYXRl
IHRoZSBzZWxlY3Rpb24gaW1tZWRpYXRlbHkgKGJ1dCB3ZSBkb24ndAorICAgICAgICAvLyB3YW50
IHRvIGZpcmUgdGhlIG9uY2hhbmdlIGV2ZW50IHVudGlsIHRoZSBwb3B1cCBpcyBjbG9zZWQsIHRv
IG1hdGNoCisgICAgICAgIC8vIElFKS4gV2UgY2hhbmdlIHRoZSBvcmlnaW5hbCBpbmRleCBzbyB3
ZSByZXZlcnQgdG8gdGhhdCB3aGVuIHRoZQorICAgICAgICAvLyBwb3B1cCBpcyBjbG9zZWQuCisg
ICAgICAgIGlmIChtX3NldHRpbmdzLmFjY2VwdE9uQWJhbmRvbikKKyAgICAgICAgICAgIG1fYWNj
ZXB0ZWRJbmRleE9uQWJhbmRvbiA9IG1fc2VsZWN0ZWRJbmRleDsKKworICAgICAgICBzZXRPcmln
aW5hbEluZGV4KG1fc2VsZWN0ZWRJbmRleCk7CisgICAgICAgIGlmIChtX3NldHRpbmdzLnNldFRl
eHRPbkluZGV4Q2hhbmdlKQorICAgICAgICAgICAgbV9wb3B1cENsaWVudC0+c2V0VGV4dEZyb21J
dGVtKG1fc2VsZWN0ZWRJbmRleCk7CisgICAgfQorICAgIGlmIChldmVudC53aW5kb3dzVmlydHVh
bEtleUNvZGUoKSA9PSBWS0VZX1RBQikgeworICAgICAgICAvLyBUQUIgaXMgYSBzcGVjaWFsIGNh
c2UgYXMgaXQgc2hvdWxkIHNlbGVjdCB0aGUgY3VycmVudCBpdGVtIGlmIGFueSBhbmQKKyAgICAg
ICAgLy8gYWR2YW5jZSBmb2N1cy4KKyAgICAgICAgaWYgKG1fc2VsZWN0ZWRJbmRleCA+PSAwKSB7
CisgICAgICAgICAgICBhY2NlcHRJbmRleChtX3NlbGVjdGVkSW5kZXgpOyAvLyBNYXkgZGVsZXRl
IHVzLgorICAgICAgICAgICAgLy8gUmV0dXJuIGZhbHNlIHNvIHRoZSBUQUIga2V5IGV2ZW50IGlz
IHByb3BhZ2F0ZWQgdG8gdGhlIHBhZ2UuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKyAgICAgICAgLy8gQ2FsbCBhYmFuZG9uKCkgc28gd2UgaG9ub3IgbV9hY2NlcHRlZElu
ZGV4T25BYmFuZG9uIGlmIHNldC4KKyAgICAgICAgYWJhbmRvbigpOworICAgICAgICAvLyBSZXR1
cm4gZmFsc2Ugc28gdGhlIFRBQiBrZXkgZXZlbnQgaXMgcHJvcGFnYXRlZCB0byB0aGUgcGFnZS4K
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitI
b3N0V2luZG93KiBQb3B1cExpc3RCb3g6Omhvc3RXaW5kb3coKSBjb25zdAoreworICAgIC8vIE91
ciBwYXJlbnQgaXMgdGhlIHJvb3QgU2Nyb2xsVmlldywgc28gaXQgaXMgdGhlIG9uZSB0aGF0IGhh
cyBhCisgICAgLy8gSG9zdFdpbmRvdy4gRnJhbWVWaWV3Ojpob3N0V2luZG93KCkgd29ya3Mgc2lt
aWxhcmx5LgorICAgIHJldHVybiBwYXJlbnQoKSA/IHBhcmVudCgpLT5ob3N0V2luZG93KCkgOiAw
OworfQorCisvLyBGcm9tIEhUTUxTZWxlY3RFbGVtZW50LmNwcAorc3RhdGljIFN0cmluZyBzdHJp
cExlYWRpbmdXaGl0ZVNwYWNlKGNvbnN0IFN0cmluZyYgc3RyaW5nKQoreworICAgIGludCBsZW5n
dGggPSBzdHJpbmcubGVuZ3RoKCk7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxl
bmd0aDsgKytpKQorICAgICAgICBpZiAoc3RyaW5nW2ldICE9IG5vQnJlYWtTcGFjZQorICAgICAg
ICAgICAgJiYgKHN0cmluZ1tpXSA8PSAweDdGID8gIWlzc3BhY2Uoc3RyaW5nW2ldKSA6IChkaXJl
Y3Rpb24oc3RyaW5nW2ldKSAhPSBXaGl0ZVNwYWNlTmV1dHJhbCkpKQorICAgICAgICAgICAgYnJl
YWs7CisKKyAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhpLCBsZW5ndGggLSBpKTsKK30KKwor
Ly8gRnJvbSBIVE1MU2VsZWN0RWxlbWVudC5jcHAsIHdpdGggbW9kaWZpY2F0aW9ucwordm9pZCBQ
b3B1cExpc3RCb3g6OnR5cGVBaGVhZEZpbmQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50JiBl
dmVudCkKK3sKKyAgICBUaW1lU3RhbXAgbm93ID0gc3RhdGljX2Nhc3Q8VGltZVN0YW1wPihjdXJy
ZW50VGltZSgpICogMTAwMC4wZik7CisgICAgVGltZVN0YW1wIGRlbHRhID0gbm93IC0gbV9sYXN0
Q2hhclRpbWU7CisKKyAgICAvLyBSZXNldCB0aGUgdGltZSB3aGVuIHVzZXIgdHlwZXMgaW4gYSBj
aGFyYWN0ZXIuIFRoZSB0aW1lIGdhcCBiZXR3ZWVuCisgICAgLy8gbGFzdCBjaGFyYWN0ZXIgYW5k
IHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIKKyAgICAv
LyB1c2VyIHR5cGVkIGluIGEgc3RyaW5nIG9yIGp1c3QgYSBjaGFyYWN0ZXIgYXMgdGhlIHNlYXJj
aCBwcmVmaXguCisgICAgbV9sYXN0Q2hhclRpbWUgPSBub3c7CisKKyAgICBVQ2hhciBjID0gZXZl
bnQud2luZG93c1ZpcnR1YWxLZXlDb2RlKCk7CisKKyAgICBTdHJpbmcgcHJlZml4OworICAgIGlu
dCBzZWFyY2hTdGFydE9mZnNldCA9IDE7CisgICAgaWYgKGRlbHRhID4ga1R5cGVBaGVhZFRpbWVv
dXRNcykgeworICAgICAgICBtX3R5cGVkU3RyaW5nID0gcHJlZml4ID0gU3RyaW5nKCZjLCAxKTsK
KyAgICAgICAgbV9yZXBlYXRpbmdDaGFyID0gYzsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3R5
cGVkU3RyaW5nLmFwcGVuZChjKTsKKworICAgICAgICBpZiAoYyA9PSBtX3JlcGVhdGluZ0NoYXIp
CisgICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBsaWtlbHkgdHJ5aW5nIHRvIGN5Y2xlIHRocm91
Z2ggYWxsIHRoZSBpdGVtcyBzdGFydGluZyB3aXRoIHRoaXMgY2hhcmFjdGVyLCBzbyBqdXN0IHNl
YXJjaCBvbiB0aGUgY2hhcmFjdGVyCisgICAgICAgICAgICBwcmVmaXggPSBTdHJpbmcoJmMsIDEp
OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fcmVwZWF0aW5nQ2hhciA9IDA7CisgICAg
ICAgICAgICBwcmVmaXggPSBtX3R5cGVkU3RyaW5nOworICAgICAgICAgICAgc2VhcmNoU3RhcnRP
ZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29tcHV0ZSBhIGNhc2UtZm9s
ZGVkIGNvcHkgb2YgdGhlIHByZWZpeCBzdHJpbmcgYmVmb3JlIGJlZ2lubmluZyB0aGUgc2VhcmNo
IGZvcgorICAgIC8vIGEgbWF0Y2hpbmcgZWxlbWVudC4gVGhpcyBjb2RlIHVzZXMgZm9sZENhc2Ug
dG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdAorICAgIC8vIFN0cmluZzo6c3RhcnRXaXRoIGRv
ZXMgbm90IGZvbGQgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuIFRoaXMgY29kZSBjYW4gYmUgY2hhbmdl
ZAorICAgIC8vIHRvIHVzZSBzdGFydFdpdGggb25jZSB0aGF0IGlzIGZpeGVkLgorICAgIFN0cmlu
ZyBwcmVmaXhXaXRoQ2FzZUZvbGRlZChwcmVmaXguZm9sZENhc2UoKSk7CisgICAgaW50IGl0ZW1D
b3VudCA9IG51bUl0ZW1zKCk7CisgICAgaW50IGluZGV4ID0gKG1heCgwLCBtX3NlbGVjdGVkSW5k
ZXgpICsgc2VhcmNoU3RhcnRPZmZzZXQpICUgaXRlbUNvdW50OworICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgaXRlbUNvdW50OyBpKyssIGluZGV4ID0gKGluZGV4ICsgMSkgJSBpdGVtQ291bnQpIHsK
KyAgICAgICAgaWYgKCFpc1NlbGVjdGFibGVJdGVtKGluZGV4KSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworCisgICAgICAgIGlmIChzdHJpcExlYWRpbmdXaGl0ZVNwYWNlKG1faXRlbXNbaW5kZXhd
LT5sYWJlbCkuZm9sZENhc2UoKS5zdGFydHNXaXRoKHByZWZpeFdpdGhDYXNlRm9sZGVkKSkgewor
ICAgICAgICAgICAgc2VsZWN0SW5kZXgoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CisgICAgfQorfQorCit2b2lkIFBvcHVwTGlzdEJveDo6cGFpbnQoR3JhcGhpY3NDb250
ZXh0KiBnYywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICAvLyBhZGp1c3QgY29vcmRzIGZv
ciBzY3JvbGxlZCBmcmFtZQorICAgIEludFJlY3QgciA9IGludGVyc2VjdGlvbihyZWN0LCBmcmFt
ZVJlY3QoKSk7CisgICAgaW50IHR4ID0geCgpIC0gc2Nyb2xsWCgpOworICAgIGludCB0eSA9IHko
KSAtIHNjcm9sbFkoKTsKKworICAgIHIubW92ZSgtdHgsIC10eSk7CisKKyAgICAvLyBzZXQgY2xp
cCByZWN0IHRvIG1hdGNoIHJldmlzZWQgZGFtYWdlIHJlY3QKKyAgICBnYy0+c2F2ZSgpOworICAg
IGdjLT50cmFuc2xhdGUoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR4KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+
KHR5KSk7CisgICAgZ2MtPmNsaXAocik7CisKKyAgICAvLyBGSVhNRTogQ2FuIHdlIG9wdGltaXpl
IHNjcm9sbGluZyB0byBub3QgcmVxdWlyZSByZXBhaW50aW5nIHRoZSBlbnRpcmUKKyAgICAvLyB3
aW5kb3c/IFNob3VsZCB3ZT8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUl0ZW1zKCk7ICsr
aSkKKyAgICAgICAgcGFpbnRSb3coZ2MsIHIsIGkpOworCisgICAgLy8gU3BlY2lhbCBjYXNlIGZv
ciBhbiBlbXB0eSBwb3B1cC4KKyAgICBpZiAoIW51bUl0ZW1zKCkpCisgICAgICAgIGdjLT5maWxs
UmVjdChyLCBDb2xvcjo6d2hpdGUsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworCisgICAgZ2MtPnJl
c3RvcmUoKTsKKworICAgIFNjcm9sbFZpZXc6OnBhaW50KGdjLCByZWN0KTsKK30KKworc3RhdGlj
IGNvbnN0IGludCBzZXBhcmF0b3JQYWRkaW5nID0gNDsKK3N0YXRpYyBjb25zdCBpbnQgc2VwYXJh
dG9ySGVpZ2h0ID0gMTsKKwordm9pZCBQb3B1cExpc3RCb3g6OnBhaW50Um93KEdyYXBoaWNzQ29u
dGV4dCogZ2MsIGNvbnN0IEludFJlY3QmIHJlY3QsIGludCByb3dJbmRleCkKK3sKKyAgICAvLyBU
aGlzIGNvZGUgaXMgYmFzZWQgbGFyZ2VseSBvbiBSZW5kZXJMaXN0Qm94OjpwYWludCogbWV0aG9k
cy4KKworICAgIEludFJlY3Qgcm93UmVjdCA9IGdldFJvd0JvdW5kcyhyb3dJbmRleCk7CisgICAg
aWYgKCFyb3dSZWN0LmludGVyc2VjdHMocmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIFBv
cHVwTWVudVN0eWxlIHN0eWxlID0gbV9wb3B1cENsaWVudC0+aXRlbVN0eWxlKHJvd0luZGV4KTsK
KworICAgIC8vIFBhaW50IGJhY2tncm91bmQKKyAgICBDb2xvciBiYWNrQ29sb3IsIHRleHRDb2xv
ciwgbGFiZWxDb2xvcjsKKyAgICBpZiAocm93SW5kZXggPT0gbV9zZWxlY3RlZEluZGV4KSB7Cisg
ICAgICAgIGJhY2tDb2xvciA9IFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+YWN0aXZlTGlz
dEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpOworICAgICAgICB0ZXh0Q29sb3IgPSBSZW5k
ZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5k
Q29sb3IoKTsKKyAgICAgICAgbGFiZWxDb2xvciA9IHRleHRDb2xvcjsKKyAgICB9IGVsc2Ugewor
ICAgICAgICBiYWNrQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IoKTsKKyAgICAgICAgdGV4
dENvbG9yID0gc3R5bGUuZm9yZWdyb3VuZENvbG9yKCk7CisgICAgICAgIC8vIEZJWE1FOiBmb3Ig
bm93IHRoZSBsYWJlbCBjb2xvciBpcyBoYXJkLWNvZGVkLiBJdCBzaG91bGQgYmUgYWRkZWQgdG8K
KyAgICAgICAgLy8gdGhlIFBvcHVwTWVudVN0eWxlLgorICAgICAgICBsYWJlbENvbG9yID0gQ29s
b3IoMTE1LCAxMTUsIDExNSk7CisgICAgfQorCisgICAgLy8gSWYgd2UgaGF2ZSBhIHRyYW5zcGFy
ZW50IGJhY2tncm91bmQsIG1ha2Ugc3VyZSBpdCBoYXMgYSBjb2xvciB0byBibGVuZAorICAgIC8v
IGFnYWluc3QuCisgICAgaWYgKGJhY2tDb2xvci5oYXNBbHBoYSgpKQorICAgICAgICBnYy0+Zmls
bFJlY3Qocm93UmVjdCwgQ29sb3I6OndoaXRlLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKworICAg
IGdjLT5maWxsUmVjdChyb3dSZWN0LCBiYWNrQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwor
CisgICAgLy8gSXQgZG9lc24ndCBsb29rIGdvb2QgYnV0IEF1dG9maWxsIHJlcXVpcmVzIHNwZWNp
YWwgc3R5bGUgZm9yIHNlcGFyYXRvci4KKyAgICAvLyBBdXRvZmlsbCBkb2Vzbid0IGhhdmUgcGFk
ZGluZyBhbmQgI2RjZGNkYyBjb2xvci4KKyAgICBpZiAobV9wb3B1cENsaWVudC0+aXRlbUlzU2Vw
YXJhdG9yKHJvd0luZGV4KSkgeworICAgICAgICBpbnQgcGFkZGluZyA9IHN0eWxlLm1lbnVUeXBl
KCkgPT0gUG9wdXBNZW51U3R5bGU6OkF1dG9maWxsUG9wdXAgPyAwIDogc2VwYXJhdG9yUGFkZGlu
ZzsKKyAgICAgICAgSW50UmVjdCBzZXBhcmF0b3JSZWN0KAorICAgICAgICAgICAgcm93UmVjdC54
KCkgKyBwYWRkaW5nLAorICAgICAgICAgICAgcm93UmVjdC55KCkgKyAocm93UmVjdC5oZWlnaHQo
KSAtIHNlcGFyYXRvckhlaWdodCkgLyAyLAorICAgICAgICAgICAgcm93UmVjdC53aWR0aCgpIC0g
MiAqIHBhZGRpbmcsIHNlcGFyYXRvckhlaWdodCk7CisgICAgICAgIGdjLT5maWxsUmVjdChzZXBh
cmF0b3JSZWN0LCBzdHlsZS5tZW51VHlwZSgpID09IFBvcHVwTWVudVN0eWxlOjpBdXRvZmlsbFBv
cHVwID8gQ29sb3IoMHhkYywgMHhkYywgMHhkYykgOiB0ZXh0Q29sb3IsIENvbG9yU3BhY2VEZXZp
Y2VSR0IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFzdHlsZS5pc1Zpc2li
bGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZ2MtPnNldEZpbGxDb2xvcih0ZXh0Q29sb3Is
IENvbG9yU3BhY2VEZXZpY2VSR0IpOworCisgICAgRm9udCBpdGVtRm9udCA9IGdldFJvd0ZvbnQo
cm93SW5kZXgpOworICAgIC8vIEZJWE1FOiBodHRwOi8vY3JidWcuY29tLzE5ODcyIFdlIHNob3Vs
ZCBnZXQgdGhlIHBhZGRpbmcgb2YgaW5kaXZpZHVhbCBvcHRpb24KKyAgICAvLyBlbGVtZW50cy4g
VGhpcyBwcm9iYWJseSBpbXBsaWVzIGNoYW5nZXMgdG8gUG9wdXBNZW51Q2xpZW50LgorICAgIGJv
b2wgcmlnaHRBbGlnbmVkID0gbV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkudGV4dERpcmVjdGlv
bigpID09IFJUTDsKKyAgICBpbnQgdGV4dFggPSAwOworICAgIGludCBtYXhXaWR0aCA9IDA7Cisg
ICAgaWYgKHJpZ2h0QWxpZ25lZCkKKyAgICAgICAgbWF4V2lkdGggPSByb3dSZWN0LndpZHRoKCkg
LSBtYXgoMCwgbV9wb3B1cENsaWVudC0+Y2xpZW50UGFkZGluZ1JpZ2h0KCkgLSBtX3BvcHVwQ2xp
ZW50LT5jbGllbnRJbnNldFJpZ2h0KCkpOworICAgIGVsc2UgeworICAgICAgICB0ZXh0WCA9IG1h
eCgwLCBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nTGVmdCgpIC0gbV9wb3B1cENsaWVudC0+
Y2xpZW50SW5zZXRMZWZ0KCkpOworICAgICAgICBtYXhXaWR0aCA9IHJvd1JlY3Qud2lkdGgoKSAt
IHRleHRYOworICAgIH0KKyAgICAvLyBQcmVwYXJlIHRleHQgdG8gYmUgZHJhd24uCisgICAgU3Ry
aW5nIGl0ZW1UZXh0ID0gbV9wb3B1cENsaWVudC0+aXRlbVRleHQocm93SW5kZXgpOworICAgIFN0
cmluZyBpdGVtTGFiZWwgPSBtX3BvcHVwQ2xpZW50LT5pdGVtTGFiZWwocm93SW5kZXgpOworICAg
IFN0cmluZyBpdGVtSWNvbiA9IG1fcG9wdXBDbGllbnQtPml0ZW1JY29uKHJvd0luZGV4KTsKKyAg
ICBpZiAobV9zZXR0aW5ncy5yZXN0cmljdFdpZHRoT2ZMaXN0Qm94KSB7IC8vIFRydW5jYXRlIHN0
cmluZ3MgdG8gZml0IGluLgorICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGxlZnRUcnVuY2F0
ZSBmb3IgdGhlIHJ0bCBjYXNlLgorICAgICAgICAvLyBTdHJpbmdUcnVuY2F0b3I6OmxlZnRUcnVu
Y2F0ZSB3b3VsZCBoYXZlIHRvIGJlIGltcGxlbWVudGVkLgorICAgICAgICBTdHJpbmcgc3RyID0g
U3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKGl0ZW1UZXh0LCBtYXhXaWR0aCwgaXRlbUZv
bnQpOworICAgICAgICBpZiAoc3RyICE9IGl0ZW1UZXh0KSB7CisgICAgICAgICAgICBpdGVtVGV4
dCA9IHN0cjsKKyAgICAgICAgICAgIC8vIERvbid0IGRpc3BsYXkgdGhlIGxhYmVsIG9yIGljb24s
IHdlIGFscmVhZHkgZG9uJ3QgaGF2ZSBlbm91Z2ggcm9vbSBmb3IgdGhlIGl0ZW0gdGV4dC4KKyAg
ICAgICAgICAgIGl0ZW1MYWJlbCA9ICIiOworICAgICAgICAgICAgaXRlbUljb24gPSAiIjsKKyAg
ICAgICAgfSBlbHNlIGlmICghaXRlbUxhYmVsLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaW50
IGF2YWlsYWJsZVdpZHRoID0gbWF4V2lkdGggLSBrVGV4dFRvTGFiZWxQYWRkaW5nIC0KKyAgICAg
ICAgICAgICAgICBTdHJpbmdUcnVuY2F0b3I6OndpZHRoKGl0ZW1UZXh0LCBpdGVtRm9udCk7Cisg
ICAgICAgICAgICBpdGVtTGFiZWwgPSBTdHJpbmdUcnVuY2F0b3I6OnJpZ2h0VHJ1bmNhdGUoaXRl
bUxhYmVsLCBhdmFpbGFibGVXaWR0aCwgaXRlbUZvbnQpOworICAgICAgICB9CisgICAgfQorCisg
ICAgLy8gUHJlcGFyZSB0aGUgZGlyZWN0aW9uYWxpdHkgdG8gZHJhdyB0ZXh0LgorICAgIFRleHRS
dW4gdGV4dFJ1bihpdGVtVGV4dC5jaGFyYWN0ZXJzKCksIGl0ZW1UZXh0Lmxlbmd0aCgpLCBmYWxz
ZSwgMCwgMCwgVGV4dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgc3R5bGUudGV4dERpcmVj
dGlvbigpLCBzdHlsZS5oYXNUZXh0RGlyZWN0aW9uT3ZlcnJpZGUoKSk7CisgICAgLy8gSWYgdGhl
IHRleHQgaXMgcmlnaHQtdG8tbGVmdCwgbWFrZSBpdCByaWdodC1hbGlnbmVkIGJ5IGFkanVzdGlu
ZyBpdHMKKyAgICAvLyBiZWdpbm5pbmcgcG9zaXRpb24uCisgICAgaWYgKHJpZ2h0QWxpZ25lZCkK
KyAgICAgICAgdGV4dFggKz0gbWF4V2lkdGggLSBpdGVtRm9udC53aWR0aCh0ZXh0UnVuKTsKKwor
ICAgIC8vIERyYXcgdGhlIGl0ZW0gdGV4dC4KKyAgICBpbnQgdGV4dFkgPSByb3dSZWN0LnkoKSAr
IGl0ZW1Gb250LmZvbnRNZXRyaWNzKCkuYXNjZW50KCkgKyAocm93UmVjdC5oZWlnaHQoKSAtIGl0
ZW1Gb250LmZvbnRNZXRyaWNzKCkuaGVpZ2h0KCkpIC8gMjsKKyAgICBnYy0+ZHJhd0JpZGlUZXh0
KGl0ZW1Gb250LCB0ZXh0UnVuLCBJbnRQb2ludCh0ZXh0WCwgdGV4dFkpKTsKKworICAgIC8vIFdl
IGFyZSB1c2luZyB0aGUgbGVmdCBwYWRkaW5nIGFzIHRoZSByaWdodCBwYWRkaW5nIGluY2x1ZGVz
IHJvb20gZm9yIHRoZSBzY3JvbGwtYmFyIHdoaWNoCisgICAgLy8gZG9lcyBub3Qgc2hvdyBpbiB0
aGlzIGNhc2UuCisgICAgaW50IHJpZ2h0UGFkZGluZyA9IG1heCgwLCBtX3BvcHVwQ2xpZW50LT5j
bGllbnRQYWRkaW5nTGVmdCgpIC0gbV9wb3B1cENsaWVudC0+Y2xpZW50SW5zZXRMZWZ0KCkpOwor
ICAgIGludCByZW1haW5pbmdXaWR0aCA9IHJvd1JlY3Qud2lkdGgoKSAtIHJpZ2h0UGFkZGluZzsK
KworICAgIC8vIERyYXcgdGhlIGljb24gaWYgYXBwbGljYWJsZS4KKyAgICBSZWZQdHI8SW1hZ2U+
IGltYWdlKEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShpdGVtSWNvbi51dGY4KCkuZGF0YSgp
KSk7CisgICAgaWYgKGltYWdlICYmICFpbWFnZS0+aXNOdWxsKCkpIHsKKyAgICAgICAgSW50UmVj
dCBpbWFnZVJlY3QgPSBpbWFnZS0+cmVjdCgpOworICAgICAgICByZW1haW5pbmdXaWR0aCAtPSAo
aW1hZ2VSZWN0LndpZHRoKCkgKyBrTGFiZWxUb0ljb25QYWRkaW5nKTsKKyAgICAgICAgaW1hZ2VS
ZWN0LnNldFgocm93UmVjdC53aWR0aCgpIC0gcmlnaHRQYWRkaW5nIC0gaW1hZ2VSZWN0LndpZHRo
KCkpOworICAgICAgICBpbWFnZVJlY3Quc2V0WShyb3dSZWN0LnkoKSArIChyb3dSZWN0LmhlaWdo
dCgpIC0gaW1hZ2VSZWN0LmhlaWdodCgpKSAvIDIpOworICAgICAgICBnYy0+ZHJhd0ltYWdlKGlt
YWdlLmdldCgpLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBpbWFnZVJlY3QpOworICAgIH0KKworICAg
IC8vIERyYXcgdGhlIHRoZSBsYWJlbCBpZiBhcHBsaWNhYmxlLgorICAgIGlmIChpdGVtTGFiZWwu
aXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBBdXRvZmlsbCBsYWJlbCBpcyAw
Ljkgc21hbGxlciB0aGFuIHJlZ3VsYXIgZm9udCBzaXplLgorICAgIGlmIChzdHlsZS5tZW51VHlw
ZSgpID09IFBvcHVwTWVudVN0eWxlOjpBdXRvZmlsbFBvcHVwKSB7CisgICAgICAgIGl0ZW1Gb250
ID0gbV9wb3B1cENsaWVudC0+aXRlbVN0eWxlKHJvd0luZGV4KS5mb250KCk7CisgICAgICAgIEZv
bnREZXNjcmlwdGlvbiBkID0gaXRlbUZvbnQuZm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgIGQu
c2V0Q29tcHV0ZWRTaXplKGQuY29tcHV0ZWRTaXplKCkgKiAwLjkpOworICAgICAgICBpdGVtRm9u
dCA9IEZvbnQoZCwgaXRlbUZvbnQubGV0dGVyU3BhY2luZygpLCBpdGVtRm9udC53b3JkU3BhY2lu
ZygpKTsKKyAgICAgICAgaXRlbUZvbnQudXBkYXRlKDApOworICAgIH0KKworICAgIFRleHRSdW4g
bGFiZWxUZXh0UnVuKGl0ZW1MYWJlbC5jaGFyYWN0ZXJzKCksIGl0ZW1MYWJlbC5sZW5ndGgoKSwg
ZmFsc2UsIDAsIDAsIFRleHRSdW46OkFsbG93VHJhaWxpbmdFeHBhbnNpb24sIHN0eWxlLnRleHRE
aXJlY3Rpb24oKSwgc3R5bGUuaGFzVGV4dERpcmVjdGlvbk92ZXJyaWRlKCkpOworICAgIGlmIChy
aWdodEFsaWduZWQpCisgICAgICAgIHRleHRYID0gbWF4KDAsIG1fcG9wdXBDbGllbnQtPmNsaWVu
dFBhZGRpbmdMZWZ0KCkgLSBtX3BvcHVwQ2xpZW50LT5jbGllbnRJbnNldExlZnQoKSk7CisgICAg
ZWxzZQorICAgICAgICB0ZXh0WCA9IHJlbWFpbmluZ1dpZHRoIC0gaXRlbUZvbnQud2lkdGgobGFi
ZWxUZXh0UnVuKTsKKworICAgIGdjLT5zZXRGaWxsQ29sb3IobGFiZWxDb2xvciwgQ29sb3JTcGFj
ZURldmljZVJHQik7CisgICAgZ2MtPmRyYXdCaWRpVGV4dChpdGVtRm9udCwgbGFiZWxUZXh0UnVu
LCBJbnRQb2ludCh0ZXh0WCwgdGV4dFkpKTsKK30KKworRm9udCBQb3B1cExpc3RCb3g6OmdldFJv
d0ZvbnQoaW50IHJvd0luZGV4KQoreworICAgIEZvbnQgaXRlbUZvbnQgPSBtX3BvcHVwQ2xpZW50
LT5pdGVtU3R5bGUocm93SW5kZXgpLmZvbnQoKTsKKyAgICBpZiAobV9wb3B1cENsaWVudC0+aXRl
bUlzTGFiZWwocm93SW5kZXgpKSB7CisgICAgICAgIC8vIEJvbGQtaWZ5IGxhYmVscyAoaWUsIGFu
IDxvcHRncm91cD4gaGVhZGluZykuCisgICAgICAgIEZvbnREZXNjcmlwdGlvbiBkID0gaXRlbUZv
bnQuZm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgIGQuc2V0V2VpZ2h0KEZvbnRXZWlnaHRCb2xk
KTsKKyAgICAgICAgRm9udCBmb250KGQsIGl0ZW1Gb250LmxldHRlclNwYWNpbmcoKSwgaXRlbUZv
bnQud29yZFNwYWNpbmcoKSk7CisgICAgICAgIGZvbnQudXBkYXRlKDApOworICAgICAgICByZXR1
cm4gZm9udDsKKyAgICB9CisKKyAgICByZXR1cm4gaXRlbUZvbnQ7Cit9CisKK3ZvaWQgUG9wdXBM
aXN0Qm94OjphYmFuZG9uKCkKK3sKKyAgICBSZWZQdHI8UG9wdXBMaXN0Qm94PiBrZWVwQWxpdmUo
dGhpcyk7CisKKyAgICBtX3NlbGVjdGVkSW5kZXggPSBtX29yaWdpbmFsSW5kZXg7CisKKyAgICBo
aWRlUG9wdXAoKTsKKworICAgIGlmIChtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gPj0gMCkgewor
ICAgICAgICBpZiAobV9wb3B1cENsaWVudCkKKyAgICAgICAgICAgIG1fcG9wdXBDbGllbnQtPnZh
bHVlQ2hhbmdlZChtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24pOworICAgICAgICBtX2FjY2VwdGVk
SW5kZXhPbkFiYW5kb24gPSAtMTsKKyAgICB9Cit9CisKK2ludCBQb3B1cExpc3RCb3g6OnBvaW50
VG9Sb3dJbmRleChjb25zdCBJbnRQb2ludCYgcG9pbnQpCit7CisgICAgaW50IHkgPSBzY3JvbGxZ
KCkgKyBwb2ludC55KCk7CisKKyAgICAvLyBGSVhNRTogYmluYXJ5IHNlYXJjaCBpZiBwZXJmIG1h
dHRlcnMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVtcygpOyArK2kpIHsKKyAgICAg
ICAgaWYgKHkgPCBtX2l0ZW1zW2ldLT55T2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIGktMTsK
KyAgICB9CisKKyAgICAvLyBMYXN0IGl0ZW0/CisgICAgaWYgKHkgPCBjb250ZW50c0hlaWdodCgp
KQorICAgICAgICByZXR1cm4gbV9pdGVtcy5zaXplKCktMTsKKworICAgIHJldHVybiAtMTsKK30K
KworYm9vbCBQb3B1cExpc3RCb3g6OmFjY2VwdEluZGV4KGludCBpbmRleCkKK3sKKyAgICAvLyBD
bGVhciBtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gb25jZSB1c2VyIGFjY2VwdHMgdGhlIHNlbGVj
dGVkIGluZGV4LgorICAgIGlmIChtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gPj0gMCkKKyAgICAg
ICAgbV9hY2NlcHRlZEluZGV4T25BYmFuZG9uID0gLTE7CisKKyAgICBpZiAoaW5kZXggPj0gbnVt
SXRlbXMoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGluZGV4IDwgMCkgewor
ICAgICAgICBpZiAobV9wb3B1cENsaWVudCkgeworICAgICAgICAgICAgLy8gRW50ZXIgcHJlc3Nl
ZCB3aXRoIG5vIHNlbGVjdGlvbiwganVzdCBjbG9zZSB0aGUgcG9wdXAuCisgICAgICAgICAgICBo
aWRlUG9wdXAoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgaWYgKGlzU2VsZWN0YWJsZUl0ZW0oaW5kZXgpKSB7CisgICAgICAgIFJlZlB0cjxQb3B1cExp
c3RCb3g+IGtlZXBBbGl2ZSh0aGlzKTsKKworICAgICAgICAvLyBIaWRlIG91cnNlbHZlcyBmaXJz
dCBzaW5jZSB2YWx1ZUNoYW5nZWQgbWF5IGhhdmUgbnVtZXJvdXMgc2lkZS1lZmZlY3RzLgorICAg
ICAgICBoaWRlUG9wdXAoKTsKKworICAgICAgICAvLyBUZWxsIHRoZSA8c2VsZWN0PiBQb3B1cE1l
bnVDbGllbnQgd2hhdCBpbmRleCB3YXMgc2VsZWN0ZWQuCisgICAgICAgIG1fcG9wdXBDbGllbnQt
PnZhbHVlQ2hhbmdlZChpbmRleCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisg
ICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFBvcHVwTGlzdEJveDo6c2VsZWN0SW5kZXgoaW50
IGluZGV4KQoreworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtSXRlbXMoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgYm9vbCBpc1NlbGVjdGFibGUgPSBpc1NlbGVjdGFibGVJdGVt
KGluZGV4KTsKKyAgICBpZiAoaW5kZXggIT0gbV9zZWxlY3RlZEluZGV4ICYmIGlzU2VsZWN0YWJs
ZSkgeworICAgICAgICBpbnZhbGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7CisgICAgICAgIG1f
c2VsZWN0ZWRJbmRleCA9IGluZGV4OworICAgICAgICBpbnZhbGlkYXRlUm93KG1fc2VsZWN0ZWRJ
bmRleCk7CisKKyAgICAgICAgc2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24oKTsKKyAgICAgICAgbV9w
b3B1cENsaWVudC0+c2VsZWN0aW9uQ2hhbmdlZChtX3NlbGVjdGVkSW5kZXgpOworICAgIH0gZWxz
ZSBpZiAoIWlzU2VsZWN0YWJsZSkKKyAgICAgICAgY2xlYXJTZWxlY3Rpb24oKTsKK30KKwordm9p
ZCBQb3B1cExpc3RCb3g6OnNldE9yaWdpbmFsSW5kZXgoaW50IGluZGV4KQoreworICAgIG1fb3Jp
Z2luYWxJbmRleCA9IG1fc2VsZWN0ZWRJbmRleCA9IGluZGV4OworfQorCitpbnQgUG9wdXBMaXN0
Qm94OjpnZXRSb3dIZWlnaHQoaW50IGluZGV4KQoreworICAgIGlmIChpbmRleCA8IDApCisgICAg
ICAgIHJldHVybiBQb3B1cE1lbnVDaHJvbWl1bTo6bWluaW11bVJvd0hlaWdodCgpOworCisgICAg
aWYgKG1fcG9wdXBDbGllbnQtPml0ZW1TdHlsZShpbmRleCkuaXNEaXNwbGF5Tm9uZSgpKQorICAg
ICAgICByZXR1cm4gUG9wdXBNZW51Q2hyb21pdW06Om1pbmltdW1Sb3dIZWlnaHQoKTsKKworICAg
IC8vIFNlcGFyYXRvciByb3cgaGVpZ2h0IGlzIHRoZSBzYW1lIHNpemUgYXMgaXRzZWxmLgorICAg
IGlmIChtX3BvcHVwQ2xpZW50LT5pdGVtSXNTZXBhcmF0b3IoaW5kZXgpKQorICAgICAgICByZXR1
cm4gbWF4KHNlcGFyYXRvckhlaWdodCwgUG9wdXBNZW51Q2hyb21pdW06Om1pbmltdW1Sb3dIZWln
aHQoKSk7CisKKyAgICBTdHJpbmcgaWNvbiA9IG1fcG9wdXBDbGllbnQtPml0ZW1JY29uKGluZGV4
KTsKKyAgICBSZWZQdHI8SW1hZ2U+IGltYWdlKEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShp
Y29uLnV0ZjgoKS5kYXRhKCkpKTsKKworICAgIGludCBmb250SGVpZ2h0ID0gZ2V0Um93Rm9udChp
bmRleCkuZm9udE1ldHJpY3MoKS5oZWlnaHQoKTsKKyAgICBpbnQgaWNvbkhlaWdodCA9IChpbWFn
ZSAmJiAhaW1hZ2UtPmlzTnVsbCgpKSA/IGltYWdlLT5yZWN0KCkuaGVpZ2h0KCkgOiAwOworCisg
ICAgaW50IGxpbmVQYWRkaW5nSGVpZ2h0ID0gbV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkubWVu
dVR5cGUoKSA9PSBQb3B1cE1lbnVTdHlsZTo6QXV0b2ZpbGxQb3B1cCA/IGtMaW5lUGFkZGluZ0hl
aWdodCA6IDA7CisgICAgaW50IGNhbGN1bGF0ZWRSb3dIZWlnaHQgPSBtYXgoZm9udEhlaWdodCwg
aWNvbkhlaWdodCkgKyBsaW5lUGFkZGluZ0hlaWdodCAqIDI7CisgICAgcmV0dXJuIG1heChjYWxj
dWxhdGVkUm93SGVpZ2h0LCBQb3B1cE1lbnVDaHJvbWl1bTo6bWluaW11bVJvd0hlaWdodCgpKTsK
K30KKworSW50UmVjdCBQb3B1cExpc3RCb3g6OmdldFJvd0JvdW5kcyhpbnQgaW5kZXgpCit7Cisg
ICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIEludFJlY3QoMCwgMCwgdmlzaWJsZVdp
ZHRoKCksIGdldFJvd0hlaWdodChpbmRleCkpOworCisgICAgcmV0dXJuIEludFJlY3QoMCwgbV9p
dGVtc1tpbmRleF0tPnlPZmZzZXQsIHZpc2libGVXaWR0aCgpLCBnZXRSb3dIZWlnaHQoaW5kZXgp
KTsKK30KKwordm9pZCBQb3B1cExpc3RCb3g6OmludmFsaWRhdGVSb3coaW50IGluZGV4KQorewor
ICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEludmFsaWRhdGUg
aW4gdGhlIHdpbmRvdyBjb250ZW50cywgYXMgRnJhbWVsZXNzU2Nyb2xsVmlldzo6aW52YWxpZGF0
ZVJlY3QKKyAgICAvLyBwYWludHMgaW4gdGhlIHdpbmRvdyBjb29yZGluYXRlcy4KKyAgICBpbnZh
bGlkYXRlUmVjdChjb250ZW50c1RvV2luZG93KGdldFJvd0JvdW5kcyhpbmRleCkpKTsKK30KKwor
dm9pZCBQb3B1cExpc3RCb3g6OnNjcm9sbFRvUmV2ZWFsUm93KGludCBpbmRleCkKK3sKKyAgICBp
ZiAoaW5kZXggPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHJvd1JlY3QgPSBn
ZXRSb3dCb3VuZHMoaW5kZXgpOworCisgICAgaWYgKHJvd1JlY3QueSgpIDwgc2Nyb2xsWSgpKSB7
CisgICAgICAgIC8vIFJvdyBpcyBhYm92ZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiwgc2Nyb2xs
IHVwLgorICAgICAgICBTY3JvbGxWaWV3OjpzZXRTY3JvbGxQb3NpdGlvbihJbnRQb2ludCgwLCBy
b3dSZWN0LnkoKSkpOworICAgIH0gZWxzZSBpZiAocm93UmVjdC5tYXhZKCkgPiBzY3JvbGxZKCkg
KyB2aXNpYmxlSGVpZ2h0KCkpIHsKKyAgICAgICAgLy8gUm93IGlzIGJlbG93IGN1cnJlbnQgc2Ny
b2xsIHBvc2l0aW9uLCBzY3JvbGwgZG93bi4KKyAgICAgICAgU2Nyb2xsVmlldzo6c2V0U2Nyb2xs
UG9zaXRpb24oSW50UG9pbnQoMCwgcm93UmVjdC5tYXhZKCkgLSB2aXNpYmxlSGVpZ2h0KCkpKTsK
KyAgICB9Cit9CisKK2Jvb2wgUG9wdXBMaXN0Qm94Ojppc1NlbGVjdGFibGVJdGVtKGludCBpbmRl
eCkKK3sKKyAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bUl0ZW1zKCkpOworICAg
IHJldHVybiBtX2l0ZW1zW2luZGV4XS0+dHlwZSA9PSBQb3B1cEl0ZW06OlR5cGVPcHRpb24gJiYg
bV9wb3B1cENsaWVudC0+aXRlbUlzRW5hYmxlZChpbmRleCk7Cit9CisKK3ZvaWQgUG9wdXBMaXN0
Qm94OjpjbGVhclNlbGVjdGlvbigpCit7CisgICAgaWYgKG1fc2VsZWN0ZWRJbmRleCAhPSAtMSkg
eworICAgICAgICBpbnZhbGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7CisgICAgICAgIG1fc2Vs
ZWN0ZWRJbmRleCA9IC0xOworICAgICAgICBtX3BvcHVwQ2xpZW50LT5zZWxlY3Rpb25DbGVhcmVk
KCk7CisgICAgfQorfQorCit2b2lkIFBvcHVwTGlzdEJveDo6c2VsZWN0TmV4dFJvdygpCit7Cisg
ICAgaWYgKCFtX3NldHRpbmdzLmxvb3BTZWxlY3Rpb25OYXZpZ2F0aW9uIHx8IG1fc2VsZWN0ZWRJ
bmRleCAhPSBudW1JdGVtcygpIC0gMSkgeworICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KDEp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgYXJlIG1vdmluZyBwYXN0IHRo
ZSBsYXN0IGl0ZW0sIG5vIHJvdyBzaG91bGQgYmUgc2VsZWN0ZWQuCisgICAgY2xlYXJTZWxlY3Rp
b24oKTsKK30KKwordm9pZCBQb3B1cExpc3RCb3g6OnNlbGVjdFByZXZpb3VzUm93KCkKK3sKKyAg
ICBpZiAoIW1fc2V0dGluZ3MubG9vcFNlbGVjdGlvbk5hdmlnYXRpb24gfHwgbV9zZWxlY3RlZElu
ZGV4ID4gMCkgeworICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KC0xKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIGlmICghbV9zZWxlY3RlZEluZGV4KSB7CisgICAgICAgIC8vIFdl
IGFyZSBtb3ZpbmcgcGFzdCB0aGUgZmlyc3QgaXRlbSwgY2xlYXIgdGhlIHNlbGVjdGlvbi4KKyAg
ICAgICAgY2xlYXJTZWxlY3Rpb24oKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8v
IE5vIHJvdyBpcyBzZWxlY3RlZCwganVtcCB0byB0aGUgbGFzdCBpdGVtLgorICAgIHNlbGVjdElu
ZGV4KG51bUl0ZW1zKCkgLSAxKTsKKyAgICBzY3JvbGxUb1JldmVhbFNlbGVjdGlvbigpOworfQor
Cit2b2lkIFBvcHVwTGlzdEJveDo6YWRqdXN0U2VsZWN0ZWRJbmRleChpbnQgZGVsdGEpCit7Cisg
ICAgaW50IHRhcmdldEluZGV4ID0gbV9zZWxlY3RlZEluZGV4ICsgZGVsdGE7CisgICAgdGFyZ2V0
SW5kZXggPSBtaW4obWF4KHRhcmdldEluZGV4LCAwKSwgbnVtSXRlbXMoKSAtIDEpOworICAgIGlm
ICghaXNTZWxlY3RhYmxlSXRlbSh0YXJnZXRJbmRleCkpIHsKKyAgICAgICAgLy8gV2UgZGlkbid0
IGxhbmQgb24gYW4gb3B0aW9uLiBUcnkgdG8gZmluZCBvbmUuCisgICAgICAgIC8vIFdlIHRyeSB0
byBzZWxlY3QgdGhlIGNsb3Nlc3QgaW5kZXggdG8gdGFyZ2V0LCBwcmlvcml0aXppbmcgYW55IGlu
CisgICAgICAgIC8vIHRoZSByYW5nZSBbY3VycmVudCwgdGFyZ2V0XS4KKworICAgICAgICBpbnQg
ZGlyID0gZGVsdGEgPiAwID8gMSA6IC0xOworICAgICAgICBpbnQgdGVzdEluZGV4ID0gbV9zZWxl
Y3RlZEluZGV4OworICAgICAgICBpbnQgYmVzdEluZGV4ID0gbV9zZWxlY3RlZEluZGV4OworICAg
ICAgICBib29sIHBhc3NlZFRhcmdldCA9IGZhbHNlOworICAgICAgICB3aGlsZSAodGVzdEluZGV4
ID49IDAgJiYgdGVzdEluZGV4IDwgbnVtSXRlbXMoKSkgeworICAgICAgICAgICAgaWYgKGlzU2Vs
ZWN0YWJsZUl0ZW0odGVzdEluZGV4KSkKKyAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSB0ZXN0
SW5kZXg7CisgICAgICAgICAgICBpZiAodGVzdEluZGV4ID09IHRhcmdldEluZGV4KQorICAgICAg
ICAgICAgICAgIHBhc3NlZFRhcmdldCA9IHRydWU7CisgICAgICAgICAgICBpZiAocGFzc2VkVGFy
Z2V0ICYmIGJlc3RJbmRleCAhPSBtX3NlbGVjdGVkSW5kZXgpCisgICAgICAgICAgICAgICAgYnJl
YWs7CisKKyAgICAgICAgICAgIHRlc3RJbmRleCArPSBkaXI7CisgICAgICAgIH0KKworICAgICAg
ICAvLyBQaWNrIHRoZSBiZXN0IGluZGV4LCB3aGljaCBtYXkgbWVhbiB3ZSBkb24ndCBjaGFuZ2Uu
CisgICAgICAgIHRhcmdldEluZGV4ID0gYmVzdEluZGV4OworICAgIH0KKworICAgIC8vIFNlbGVj
dCB0aGUgbmV3IGluZGV4LCBhbmQgZW5zdXJlIGl0cyB2aXNpYmxlLiBXZSBkbyB0aGlzIHJlZ2Fy
ZGxlc3Mgb2YKKyAgICAvLyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlZCB0byBlbnN1cmUg
a2V5Ym9hcmQgZXZlbnRzIGFsd2F5cyBicmluZyB0aGUKKyAgICAvLyBzZWxlY3Rpb24gaW50byB2
aWV3LgorICAgIHNlbGVjdEluZGV4KHRhcmdldEluZGV4KTsKKyAgICBzY3JvbGxUb1JldmVhbFNl
bGVjdGlvbigpOworfQorCit2b2lkIFBvcHVwTGlzdEJveDo6aGlkZVBvcHVwKCkKK3sKKyAgICBp
ZiAocGFyZW50KCkpIHsKKyAgICAgICAgUG9wdXBDb250YWluZXIqIGNvbnRhaW5lciA9IHN0YXRp
Y19jYXN0PFBvcHVwQ29udGFpbmVyKj4ocGFyZW50KCkpOworICAgICAgICBpZiAoY29udGFpbmVy
LT5jbGllbnQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lci0+Y2xpZW50KCktPnBvcHVwQ2xvc2Vk
KGNvbnRhaW5lcik7CisgICAgICAgIGNvbnRhaW5lci0+bm90aWZ5UG9wdXBIaWRkZW4oKTsKKyAg
ICB9CisKKyAgICBpZiAobV9wb3B1cENsaWVudCkKKyAgICAgICAgbV9wb3B1cENsaWVudC0+cG9w
dXBEaWRIaWRlKCk7Cit9CisKK3ZvaWQgUG9wdXBMaXN0Qm94Ojp1cGRhdGVGcm9tRWxlbWVudCgp
Cit7CisgICAgY2xlYXIoKTsKKworICAgIGludCBzaXplID0gbV9wb3B1cENsaWVudC0+bGlzdFNp
emUoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBQb3B1
cEl0ZW06OlR5cGUgdHlwZTsKKyAgICAgICAgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1Jc1NlcGFy
YXRvcihpKSkKKyAgICAgICAgICAgIHR5cGUgPSBQb3B1cEl0ZW06OlR5cGVTZXBhcmF0b3I7Cisg
ICAgICAgIGVsc2UgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1Jc0xhYmVsKGkpKQorICAgICAgICAg
ICAgdHlwZSA9IFBvcHVwSXRlbTo6VHlwZUdyb3VwOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICB0eXBlID0gUG9wdXBJdGVtOjpUeXBlT3B0aW9uOworICAgICAgICBtX2l0ZW1zLmFwcGVuZChu
ZXcgUG9wdXBJdGVtKG1fcG9wdXBDbGllbnQtPml0ZW1UZXh0KGkpLCB0eXBlKSk7CisgICAgICAg
IG1faXRlbXNbaV0tPmVuYWJsZWQgPSBpc1NlbGVjdGFibGVJdGVtKGkpOworICAgICAgICBQb3B1
cE1lbnVTdHlsZSBzdHlsZSA9IG1fcG9wdXBDbGllbnQtPml0ZW1TdHlsZShpKTsKKyAgICAgICAg
bV9pdGVtc1tpXS0+dGV4dERpcmVjdGlvbiA9IHN0eWxlLnRleHREaXJlY3Rpb24oKTsKKyAgICAg
ICAgbV9pdGVtc1tpXS0+aGFzVGV4dERpcmVjdGlvbk92ZXJyaWRlID0gc3R5bGUuaGFzVGV4dERp
cmVjdGlvbk92ZXJyaWRlKCk7CisgICAgfQorCisgICAgbV9zZWxlY3RlZEluZGV4ID0gbV9wb3B1
cENsaWVudC0+c2VsZWN0ZWRJbmRleCgpOworICAgIHNldE9yaWdpbmFsSW5kZXgobV9zZWxlY3Rl
ZEluZGV4KTsKKworICAgIGxheW91dCgpOworfQorCit2b2lkIFBvcHVwTGlzdEJveDo6c2V0TWF4
V2lkdGhBbmRMYXlvdXQoaW50IG1heFdpZHRoKQoreworICAgIG1fbWF4V2luZG93V2lkdGggPSBt
YXhXaWR0aDsKKyAgICBsYXlvdXQoKTsKK30KKwordm9pZCBQb3B1cExpc3RCb3g6OmxheW91dCgp
Cit7CisgICAgYm9vbCBpc1JpZ2h0QWxpZ25lZCA9IG1fcG9wdXBDbGllbnQtPm1lbnVTdHlsZSgp
LnRleHREaXJlY3Rpb24oKSA9PSBSVEw7CisKKyAgICAvLyBTaXplIG91ciBjaGlsZCBpdGVtcy4K
KyAgICBpbnQgYmFzZVdpZHRoID0gMDsKKyAgICBpbnQgcGFkZGluZ1dpZHRoID0gMDsKKyAgICBp
bnQgbGluZUVuZFBhZGRpbmdXaWR0aCA9IDA7CisgICAgaW50IHkgPSAwOworICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgbnVtSXRlbXMoKTsgKytpKSB7CisgICAgICAgIC8vIFBsYWNlIHRoZSBpdGVt
IHZlcnRpY2FsbHkuCisgICAgICAgIG1faXRlbXNbaV0tPnlPZmZzZXQgPSB5OworICAgICAgICBp
ZiAobV9wb3B1cENsaWVudC0+aXRlbVN0eWxlKGkpLmlzRGlzcGxheU5vbmUoKSkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICB5ICs9IGdldFJvd0hlaWdodChpKTsKKworICAgICAgICAv
LyBFbnN1cmUgdGhlIHBvcHVwIGlzIHdpZGUgZW5vdWdoIHRvIGZpdCB0aGlzIGl0ZW0uCisgICAg
ICAgIEZvbnQgaXRlbUZvbnQgPSBnZXRSb3dGb250KGkpOworICAgICAgICBTdHJpbmcgdGV4dCA9
IG1fcG9wdXBDbGllbnQtPml0ZW1UZXh0KGkpOworICAgICAgICBTdHJpbmcgbGFiZWwgPSBtX3Bv
cHVwQ2xpZW50LT5pdGVtTGFiZWwoaSk7CisgICAgICAgIFN0cmluZyBpY29uID0gbV9wb3B1cENs
aWVudC0+aXRlbUljb24oaSk7CisgICAgICAgIFJlZlB0cjxJbWFnZT4gaWNvbkltYWdlKEltYWdl
Ojpsb2FkUGxhdGZvcm1SZXNvdXJjZShpY29uLnV0ZjgoKS5kYXRhKCkpKTsKKyAgICAgICAgaW50
IHdpZHRoID0gMDsKKyAgICAgICAgaWYgKCF0ZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHdp
ZHRoID0gaXRlbUZvbnQud2lkdGgoVGV4dFJ1bih0ZXh0KSk7CisgICAgICAgIGlmICghbGFiZWwu
aXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAod2lkdGggPiAwKQorICAgICAgICAgICAgICAg
IHdpZHRoICs9IGtUZXh0VG9MYWJlbFBhZGRpbmc7CisgICAgICAgICAgICB3aWR0aCArPSBpdGVt
Rm9udC53aWR0aChUZXh0UnVuKGxhYmVsKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGljb25J
bWFnZSAmJiAhaWNvbkltYWdlLT5pc051bGwoKSkgeworICAgICAgICAgICAgaWYgKHdpZHRoID4g
MCkKKyAgICAgICAgICAgICAgICB3aWR0aCArPSBrTGFiZWxUb0ljb25QYWRkaW5nOworICAgICAg
ICAgICAgd2lkdGggKz0gaWNvbkltYWdlLT5yZWN0KCkud2lkdGgoKTsKKyAgICAgICAgfQorCisg
ICAgICAgIGJhc2VXaWR0aCA9IG1heChiYXNlV2lkdGgsIHdpZHRoKTsKKyAgICAgICAgLy8gRklY
TUU6IGh0dHA6Ly9iLzEyMTA0ODEgV2Ugc2hvdWxkIGdldCB0aGUgcGFkZGluZyBvZiBpbmRpdmlk
dWFsIG9wdGlvbiBlbGVtZW50cy4KKyAgICAgICAgcGFkZGluZ1dpZHRoID0gbWF4KHBhZGRpbmdX
aWR0aCwKKyAgICAgICAgICAgIG1fcG9wdXBDbGllbnQtPmNsaWVudFBhZGRpbmdMZWZ0KCkgKyBt
X3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nUmlnaHQoKSk7CisgICAgICAgIGxpbmVFbmRQYWRk
aW5nV2lkdGggPSBtYXgobGluZUVuZFBhZGRpbmdXaWR0aCwKKyAgICAgICAgICAgIGlzUmlnaHRB
bGlnbmVkID8gbV9wb3B1cENsaWVudC0+Y2xpZW50UGFkZGluZ0xlZnQoKSA6IG1fcG9wdXBDbGll
bnQtPmNsaWVudFBhZGRpbmdSaWdodCgpKTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgc2Ny
b2xsIGJhciB3aWR0aC4KKyAgICBpbnQgd2luZG93SGVpZ2h0ID0gMDsKKyAgICBtX3Zpc2libGVS
b3dzID0gbWluKG51bUl0ZW1zKCksIGtNYXhWaXNpYmxlUm93cyk7CisKKyAgICBmb3IgKGludCBp
ID0gMDsgaSA8IG1fdmlzaWJsZVJvd3M7ICsraSkgeworICAgICAgICBpbnQgcm93SGVpZ2h0ID0g
Z2V0Um93SGVpZ2h0KGkpOworCisgICAgICAgIC8vIE9ubHkgY2xpcCB0aGUgd2luZG93IGhlaWdo
dCBmb3Igbm9uLU1hYyBwbGF0Zm9ybXMuCisgICAgICAgIGlmICh3aW5kb3dIZWlnaHQgKyByb3dI
ZWlnaHQgPiBtX21heEhlaWdodCkgeworICAgICAgICAgICAgbV92aXNpYmxlUm93cyA9IGk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHdpbmRvd0hlaWdodCArPSBy
b3dIZWlnaHQ7CisgICAgfQorCisgICAgLy8gU2V0IG91ciB3aWRnZXQgYW5kIHNjcm9sbGFibGUg
Y29udGVudHMgc2l6ZXMuCisgICAgaW50IHNjcm9sbGJhcldpZHRoID0gMDsKKyAgICBpZiAobV92
aXNpYmxlUm93cyA8IG51bUl0ZW1zKCkpIHsKKyAgICAgICAgc2Nyb2xsYmFyV2lkdGggPSBTY3Jv
bGxiYXJUaGVtZTo6bmF0aXZlVGhlbWUoKS0+c2Nyb2xsYmFyVGhpY2tuZXNzKCk7CisKKyAgICAg
ICAgLy8gVXNlIGtNaW5FbmRPZkxpbmVQYWRkaW5nIHdoZW4gdGhlcmUgaXMgYSBzY3JvbGxiYXIg
c28gdGhhdCB3ZSB1c2UKKyAgICAgICAgLy8gYXMgbXVjaCBhcyAobGluZUVuZFBhZGRpbmdXaWR0
aCAtIGtNaW5FbmRPZkxpbmVQYWRkaW5nKSBwYWRkaW5nCisgICAgICAgIC8vIHNwYWNlIGZvciBz
Y3JvbGxiYXIgYW5kIGFsbG93IHVzZXIgdG8gdXNlIENTUyBwYWRkaW5nIHRvIG1ha2UgdGhlCisg
ICAgICAgIC8vIHBvcHVwIGxpc3Rib3ggYWxpZ24gd2l0aCB0aGUgc2VsZWN0IGVsZW1lbnQuCisg
ICAgICAgIHBhZGRpbmdXaWR0aCA9IHBhZGRpbmdXaWR0aCAtIGxpbmVFbmRQYWRkaW5nV2lkdGgg
KyBrTWluRW5kT2ZMaW5lUGFkZGluZzsKKyAgICB9CisKKyAgICBpbnQgd2luZG93V2lkdGg7Cisg
ICAgaW50IGNvbnRlbnRXaWR0aDsKKyAgICBpZiAobV9zZXR0aW5ncy5yZXN0cmljdFdpZHRoT2ZM
aXN0Qm94KSB7CisgICAgICAgIHdpbmRvd1dpZHRoID0gbV9iYXNlV2lkdGg7CisgICAgICAgIGNv
bnRlbnRXaWR0aCA9IG1fYmFzZVdpZHRoIC0gc2Nyb2xsYmFyV2lkdGg7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgd2luZG93V2lkdGggPSBiYXNlV2lkdGggKyBzY3JvbGxiYXJXaWR0aCArIHBhZGRp
bmdXaWR0aDsKKyAgICAgICAgaWYgKHdpbmRvd1dpZHRoID4gbV9tYXhXaW5kb3dXaWR0aCkgewor
ICAgICAgICAgICAgLy8gd2luZG93V2lkdGggZXhjZWVkcyBtX21heFdpbmRvd1dpZHRoLCBzbyB3
ZSBoYXZlIHRvIGNsaXAuCisgICAgICAgICAgICB3aW5kb3dXaWR0aCA9IG1fbWF4V2luZG93V2lk
dGg7CisgICAgICAgICAgICBiYXNlV2lkdGggPSB3aW5kb3dXaWR0aCAtIHNjcm9sbGJhcldpZHRo
IC0gcGFkZGluZ1dpZHRoOworICAgICAgICAgICAgbV9iYXNlV2lkdGggPSBiYXNlV2lkdGg7Cisg
ICAgICAgIH0KKyAgICAgICAgY29udGVudFdpZHRoID0gd2luZG93V2lkdGggLSBzY3JvbGxiYXJX
aWR0aDsKKworICAgICAgICBpZiAod2luZG93V2lkdGggPCBtX2Jhc2VXaWR0aCkgeworICAgICAg
ICAgICAgd2luZG93V2lkdGggPSBtX2Jhc2VXaWR0aDsKKyAgICAgICAgICAgIGNvbnRlbnRXaWR0
aCA9IG1fYmFzZVdpZHRoIC0gc2Nyb2xsYmFyV2lkdGg7CisgICAgICAgIH0gZWxzZQorICAgICAg
ICAgICAgbV9iYXNlV2lkdGggPSBiYXNlV2lkdGg7CisgICAgfQorCisgICAgcmVzaXplKHdpbmRv
d1dpZHRoLCB3aW5kb3dIZWlnaHQpOworICAgIHNldENvbnRlbnRzU2l6ZShJbnRTaXplKGNvbnRl
bnRXaWR0aCwgZ2V0Um93Qm91bmRzKG51bUl0ZW1zKCkgLSAxKS5tYXhZKCkpKTsKKworICAgIGlm
IChob3N0V2luZG93KCkpCisgICAgICAgIHNjcm9sbFRvUmV2ZWFsU2VsZWN0aW9uKCk7CisKKyAg
ICBpbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgUG9wdXBMaXN0Qm94OjpjbGVhcigpCit7CisgICAg
Zm9yIChWZWN0b3I8UG9wdXBJdGVtKj46Oml0ZXJhdG9yIGl0ID0gbV9pdGVtcy5iZWdpbigpOyBp
dCAhPSBtX2l0ZW1zLmVuZCgpOyArK2l0KQorICAgICAgICBkZWxldGUgKml0OworICAgIG1faXRl
bXMuY2xlYXIoKTsKK30KKworYm9vbCBQb3B1cExpc3RCb3g6OmlzUG9pbnRJbkJvdW5kcyhjb25z
dCBJbnRQb2ludCYgcG9pbnQpCit7CisgICAgcmV0dXJuIG51bUl0ZW1zKCkgJiYgSW50UmVjdCgw
LCAwLCB3aWR0aCgpLCBoZWlnaHQoKSkuY29udGFpbnMocG9pbnQpOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1
bS9Qb3B1cExpc3RCb3guaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVw
TGlzdEJveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRjZWMzYTQxYWU3MDUxYTYwMTkwOWYxYTAxNTlmNjk2MmEx
YjFlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1
bS9Qb3B1cExpc3RCb3guaApAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykg
MjAxMSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICog
ICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0
cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBQb3B1cExpc3RCb3hfaAor
I2RlZmluZSBQb3B1cExpc3RCb3hfaAorCisjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIkZv
bnRTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkZyYW1lbGVzc1Njcm9sbFZpZXcuaCIKKyNpbmNsdWRl
ICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTm9kZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFRpbWVTdGFtcDsKKworc3RhdGljIGNvbnN0IGlu
dCBrTGFiZWxUb0ljb25QYWRkaW5nID0gNTsKK3N0YXRpYyBjb25zdCBpbnQga0xpbmVQYWRkaW5n
SGVpZ2h0ID0gMzsgLy8gUGFkZGluZyBoZWlnaHQgcHV0IGF0IHRoZSB0b3AgYW5kIGJvdHRvbSBv
ZiBlYWNoIGxpbmUuCitzdGF0aWMgY29uc3QgaW50IGtNYXhIZWlnaHQgPSA1MDA7CitzdGF0aWMg
Y29uc3QgaW50IGtNYXhWaXNpYmxlUm93cyA9IDIwOworc3RhdGljIGNvbnN0IGludCBrTWluRW5k
T2ZMaW5lUGFkZGluZyA9IDI7CitzdGF0aWMgY29uc3QgaW50IGtUZXh0VG9MYWJlbFBhZGRpbmcg
PSAxMDsKK3N0YXRpYyBjb25zdCBUaW1lU3RhbXAga1R5cGVBaGVhZFRpbWVvdXRNcyA9IDEwMDA7
CisKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIFBsYXRmb3JtS2V5Ym9hcmRFdmVudDsK
K2NsYXNzIFBsYXRmb3JtTW91c2VFdmVudDsKKyNpZiBFTkFCTEUoR0VTVFVSRV9FVkVOVFMpCitj
bGFzcyBQbGF0Zm9ybUdlc3R1cmVFdmVudDsKKyNlbmRpZgorI2lmIEVOQUJMRShUT1VDSF9FVkVO
VFMpCitjbGFzcyBQbGF0Zm9ybVRvdWNoRXZlbnQ7CisjZW5kaWYKK2NsYXNzIFBsYXRmb3JtV2hl
ZWxFdmVudDsKK2NsYXNzIFBvcHVwTWVudUNsaWVudDsKKworc3RydWN0IFBvcHVwQ29udGFpbmVy
U2V0dGluZ3MgeworICAgIC8vIFdoZXRoZXIgdGhlIFBvcHVwTWVudUNsaWVudCBzaG91bGQgYmUg
dG9sZCB0byBjaGFuZ2UgaXRzIHRleHQgd2hlbiBhCisgICAgLy8gbmV3IGl0ZW0gaXMgc2VsZWN0
ZWQgYnkgdXNpbmcgdGhlIGFycm93IGtleXMuCisgICAgYm9vbCBzZXRUZXh0T25JbmRleENoYW5n
ZTsKKworICAgIC8vIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgd2hl
biB0aGUgcG9wdXAgbWVudSBpcworICAgIC8vIGNsb3NlZCAodGhyb3VnaCBFU0MgYmVpbmcgcHJl
c3NlZCBvciB0aGUgZm9jdXMgZ29pbmcgYXdheSkuCisgICAgLy8gTm90ZSB0aGF0IHdoZW4gVEFC
IGlzIHByZXNzZWQsIHRoZSBzZWxlY3Rpb24gaXMgYWx3YXlzIGFjY2VwdGVkCisgICAgLy8gcmVn
YXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisgICAgYm9vbCBhY2NlcHRPbkFiYW5kb247CisKKyAg
ICAvLyBXaGV0aGVyIHdlIHNob3VsZCBtb3ZlIHRoZSBzZWxlY3Rpb24gdG8gdGhlIGZpcnN0L2xh
c3QgaXRlbSB3aGVuCisgICAgLy8gdGhlIHVzZXIgcHJlc3NlcyBkb3duL3VwIGFycm93IGtleXMg
YW5kIHRoZSBsYXN0L2ZpcnN0IGl0ZW0gaXMKKyAgICAvLyBzZWxlY3RlZC4KKyAgICBib29sIGxv
b3BTZWxlY3Rpb25OYXZpZ2F0aW9uOworCisgICAgLy8gV2hldGhlciB3ZSBzaG91bGQgcmVzdHJp
Y3QgdGhlIHdpZHRoIG9mIHRoZSBQb3B1cExpc3RCb3ggb3Igbm90LgorICAgIC8vIEF1dG9jb21w
bGV0ZSBwb3B1cHMgYXJlIHJlc3RyaWN0ZWQsIGNvbWJvLWJveGVzIChzZWxlY3QgdGFncykgYXJl
bid0LgorICAgIGJvb2wgcmVzdHJpY3RXaWR0aE9mTGlzdEJveDsKK307CisKKy8vIEEgY29udGFp
bmVyIGZvciB0aGUgZGF0YSBmb3IgZWFjaCBtZW51IGl0ZW0gKGUuZy4gcmVwcmVzZW50ZWQgYnkg
PG9wdGlvbj4KKy8vIG9yIDxvcHRncm91cD4gaW4gYSA8c2VsZWN0PiB3aWRnZXQpIGFuZCBpcyB1
c2VkIGJ5IFBvcHVwTGlzdEJveC4KK3N0cnVjdCBQb3B1cEl0ZW0geworICAgIGVudW0gVHlwZSB7
CisgICAgICAgIFR5cGVPcHRpb24sCisgICAgICAgIFR5cGVHcm91cCwKKyAgICAgICAgVHlwZVNl
cGFyYXRvcgorICAgIH07CisKKyAgICBQb3B1cEl0ZW0oY29uc3QgU3RyaW5nJiBsYWJlbCwgVHlw
ZSB0eXBlKQorICAgICAgICA6IGxhYmVsKGxhYmVsKQorICAgICAgICAsIHR5cGUodHlwZSkKKyAg
ICAgICAgLCB5T2Zmc2V0KDApCisgICAgeworICAgIH0KKyAgICBTdHJpbmcgbGFiZWw7CisgICAg
VHlwZSB0eXBlOworICAgIGludCB5T2Zmc2V0OyAvLyB5IG9mZnNldCBvZiB0aGlzIGl0ZW0sIHJl
bGF0aXZlIHRvIHRoZSB0b3Agb2YgdGhlIHBvcHVwLgorICAgIFRleHREaXJlY3Rpb24gdGV4dERp
cmVjdGlvbjsKKyAgICBib29sIGhhc1RleHREaXJlY3Rpb25PdmVycmlkZTsKKyAgICBib29sIGVu
YWJsZWQ7Cit9OworCisvLyBUaGlzIGNsYXNzIHVzZXMgV2ViQ29yZSBjb2RlIHRvIHBhaW50IGFu
ZCBoYW5kbGUgZXZlbnRzIGZvciBhIGRyb3AtZG93biBsaXN0CisvLyBib3ggKCJjb21ib2JveCIg
b24gV2luZG93cykuCitjbGFzcyBQb3B1cExpc3RCb3ggOiBwdWJsaWMgRnJhbWVsZXNzU2Nyb2xs
VmlldyB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8UG9wdXBMaXN0Qm94PiBjcmVh
dGUoUG9wdXBNZW51Q2xpZW50KiBjbGllbnQsIGNvbnN0IFBvcHVwQ29udGFpbmVyU2V0dGluZ3Mm
IHNldHRpbmdzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBQb3B1cExpc3RC
b3goY2xpZW50LCBzZXR0aW5ncykpOworICAgIH0KKworICAgIC8vIEZyYW1lbGVzc1Njcm9sbFZp
ZXcKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVj
dCYpOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZURvd25FdmVudChjb25zdCBQbGF0Zm9y
bU1vdXNlRXZlbnQmKTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VNb3ZlRXZlbnQoY29u
c3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7CisgICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlUmVs
ZWFzZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOworICAgIHZpcnR1YWwgYm9vbCBo
YW5kbGVXaGVlbEV2ZW50KGNvbnN0IFBsYXRmb3JtV2hlZWxFdmVudCYpOworICAgIHZpcnR1YWwg
Ym9vbCBoYW5kbGVLZXlFdmVudChjb25zdCBQbGF0Zm9ybUtleWJvYXJkRXZlbnQmKTsKKyNpZiBF
TkFCTEUoVE9VQ0hfRVZFTlRTKQorICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVUb3VjaEV2ZW50KGNv
bnN0IFBsYXRmb3JtVG91Y2hFdmVudCYpOworI2VuZGlmCisjaWYgRU5BQkxFKEdFU1RVUkVfUkVD
T0dOSVpFUikKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlR2VzdHVyZUV2ZW50KGNvbnN0IFBsYXRm
b3JtR2VzdHVyZUV2ZW50Jik7CisjZW5kaWYKKworICAgIC8vIFNjcm9sbFZpZXcKKyAgICB2aXJ0
dWFsIEhvc3RXaW5kb3cqIGhvc3RXaW5kb3coKSBjb25zdDsKKworICAgIC8vIFBvcHVwTGlzdEJv
eCBtZXRob2RzCisKKyAgICAvLyBIaWRlcyB0aGUgcG9wdXAuCisgICAgdm9pZCBoaWRlUG9wdXAo
KTsKKworICAgIC8vIFVwZGF0ZXMgb3VyIGludGVybmFsIGxpc3QgdG8gbWF0Y2ggdGhlIGNsaWVu
dC4KKyAgICB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7CisKKyAgICAvLyBGcmVlcyBhbnkgYWxs
b2NhdGVkIHJlc291cmNlcyB1c2VkIGluIGEgcGFydGljdWxhciBwb3B1cCBzZXNzaW9uLgorICAg
IHZvaWQgY2xlYXIoKTsKKworICAgIC8vIFNldHMgdGhlIGluZGV4IG9mIHRoZSBvcHRpb24gdGhh
dCBpcyBkaXNwbGF5ZWQgaW4gdGhlIDxzZWxlY3Q+IHdpZGdldCBpbiB0aGUgcGFnZQorICAgIHZv
aWQgc2V0T3JpZ2luYWxJbmRleChpbnQpOworCisgICAgLy8gR2V0cyB0aGUgaW5kZXggb2YgdGhl
IGl0ZW0gdGhhdCB0aGUgdXNlciBpcyBjdXJyZW50bHkgbW91c2VkIG92ZXIgb3IgaGFzIHNlbGVj
dGVkIHdpdGgKKyAgICAvLyB0aGUga2V5Ym9hcmQuIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRo
ZSBvcmlnaW5hbCBpbmRleCwgc2luY2UgdGhlIHVzZXIgaGFzIG5vdCB5ZXQKKyAgICAvLyBhY2Nl
cHRlZCB0aGlzIGlucHV0LgorICAgIGludCBzZWxlY3RlZEluZGV4KCkgY29uc3QgeyByZXR1cm4g
bV9zZWxlY3RlZEluZGV4OyB9CisKKyAgICAvLyBNb3ZlcyBzZWxlY3Rpb24gZG93bi91cCB0aGUg
Z2l2ZW4gbnVtYmVyIG9mIGl0ZW1zLCBzY3JvbGxpbmcgaWYgbmVjZXNzYXJ5LgorICAgIC8vIFBv
c2l0aXZlIGlzIGRvd24uIFRoZSByZXN1bHRpbmcgaW5kZXggd2lsbCBiZSBjbGFtcGVkIHRvIHRo
ZSByYW5nZQorICAgIC8vIFswLCBudW1JdGVtcyksIGFuZCBub24tb3B0aW9uIGl0ZW1zIHdpbGwg
YmUgc2tpcHBlZC4KKyAgICB2b2lkIGFkanVzdFNlbGVjdGVkSW5kZXgoaW50IGRlbHRhKTsKKwor
ICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdC4KKyAgICBpbnQg
bnVtSXRlbXMoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG1faXRlbXMuc2l6ZSgp
KTsgfQorCisgICAgdm9pZCBzZXRCYXNlV2lkdGgoaW50IHdpZHRoKSB7IG1fYmFzZVdpZHRoID0g
c3RkOjptaW4obV9tYXhXaW5kb3dXaWR0aCwgd2lkdGgpOyB9CisKKyAgICAvLyBDb21wdXRlcyB0
aGUgc2l6ZSBvZiB3aWRnZXQgYW5kIGNoaWxkcmVuLgorICAgIHZvaWQgbGF5b3V0KCk7CisKKyAg
ICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHBvcHVwIHdhbnRzIHRvIHByb2Nlc3MgZXZlbnRzIGZv
ciB0aGUgcGFzc2VkIGtleS4KKyAgICBib29sIGlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkoaW50
IGtleUNvZGUpOworCisgICAgLy8gR2V0cyB0aGUgaGVpZ2h0IG9mIGEgcm93LgorICAgIGludCBn
ZXRSb3dIZWlnaHQoaW50IGluZGV4KTsKKworICAgIHZvaWQgc2V0TWF4SGVpZ2h0KGludCBtYXhI
ZWlnaHQpIHsgbV9tYXhIZWlnaHQgPSBtYXhIZWlnaHQ7IH0KKworICAgIHZvaWQgc2V0TWF4V2lk
dGgoaW50IG1heFdpZHRoKSB7IG1fbWF4V2luZG93V2lkdGggPSBtYXhXaWR0aDsgfQorCisgICAg
dm9pZCBzZXRNYXhXaWR0aEFuZExheW91dChpbnQpOworCisgICAgdm9pZCBkaXNjb25uZWN0Q2xp
ZW50KCkgeyBtX3BvcHVwQ2xpZW50ID0gMDsgfQorCisgICAgY29uc3QgVmVjdG9yPFBvcHVwSXRl
bSo+JiBpdGVtcygpIGNvbnN0IHsgcmV0dXJuIG1faXRlbXM7IH0KKworcHJpdmF0ZToKKyAgICBm
cmllbmQgY2xhc3MgUG9wdXBDb250YWluZXI7CisgICAgZnJpZW5kIGNsYXNzIFJlZkNvdW50ZWQ8
UG9wdXBMaXN0Qm94PjsKKworICAgIFBvcHVwTGlzdEJveChQb3B1cE1lbnVDbGllbnQqLCBjb25z
dCBQb3B1cENvbnRhaW5lclNldHRpbmdzJik7CisKKyAgICB+UG9wdXBMaXN0Qm94KCkKKyAgICB7
CisgICAgICAgIGNsZWFyKCk7CisgICAgfQorCisgICAgLy8gQ2xvc2VzIHRoZSBwb3B1cAorICAg
IHZvaWQgYWJhbmRvbigpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3Rpb24g
Y2FuIGJlIGNoYW5nZWQgdG8gaW5kZXguCisgICAgLy8gRGlzYWJsZWQgaXRlbXMsIG9yIGxhYmVs
cyBjYW5ub3QgYmUgc2VsZWN0ZWQuCisgICAgYm9vbCBpc1NlbGVjdGFibGVJdGVtKGludCBpbmRl
eCk7CisKKyAgICAvLyBTZWxlY3QgYW4gaW5kZXggaW4gdGhlIGxpc3QsIHNjcm9sbGluZyBpZiBu
ZWNlc3NhcnkuCisgICAgdm9pZCBzZWxlY3RJbmRleChpbnQgaW5kZXgpOworCisgICAgLy8gQWNj
ZXB0cyB0aGUgc2VsZWN0ZWQgaW5kZXggYXMgdGhlIHZhbHVlIHRvIGJlIGRpc3BsYXllZCBpbiB0
aGUgPHNlbGVjdD4gd2lkZ2V0IG9uCisgICAgLy8gdGhlIHdlYiBwYWdlLCBhbmQgY2xvc2VzIHRo
ZSBwb3B1cC4gUmV0dXJucyB0cnVlIGlmIGluZGV4IGlzIGFjY2VwdGVkLgorICAgIGJvb2wgYWNj
ZXB0SW5kZXgoaW50IGluZGV4KTsKKworICAgIC8vIENsZWFycyB0aGUgc2VsZWN0aW9uIChzbyBu
byByb3cgYXBwZWFycyBzZWxlY3RlZCkuCisgICAgdm9pZCBjbGVhclNlbGVjdGlvbigpOworCisg
ICAgLy8gU2Nyb2xscyB0byByZXZlYWwgdGhlIGdpdmVuIGluZGV4LgorICAgIHZvaWQgc2Nyb2xs
VG9SZXZlYWxSb3coaW50IGluZGV4KTsKKyAgICB2b2lkIHNjcm9sbFRvUmV2ZWFsU2VsZWN0aW9u
KCkgeyBzY3JvbGxUb1JldmVhbFJvdyhtX3NlbGVjdGVkSW5kZXgpOyB9CisKKyAgICAvLyBJbnZh
bGlkYXRlcyB0aGUgcm93IGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICB2b2lkIGludmFsaWRhdGVS
b3coaW50IGluZGV4KTsKKworICAgIC8vIEdldCB0aGUgYm91bmRzIG9mIGEgcm93LgorICAgIElu
dFJlY3QgZ2V0Um93Qm91bmRzKGludCBpbmRleCk7CisKKyAgICAvLyBDb252ZXJ0cyBhIHBvaW50
IHRvIGFuIGluZGV4IG9mIHRoZSByb3cgdGhlIHBvaW50IGlzIG92ZXIKKyAgICBpbnQgcG9pbnRU
b1Jvd0luZGV4KGNvbnN0IEludFBvaW50Jik7CisKKyAgICAvLyBQYWludCBhbiBpbmRpdmlkdWFs
IHJvdworICAgIHZvaWQgcGFpbnRSb3coR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYs
IGludCByb3dJbmRleCk7CisKKyAgICAvLyBUZXN0IGlmIHRoZSBnaXZlbiBwb2ludCBpcyB3aXRo
aW4gdGhlIGJvdW5kcyBvZiB0aGUgcG9wdXAgd2luZG93LgorICAgIGJvb2wgaXNQb2ludEluQm91
bmRzKGNvbnN0IEludFBvaW50Jik7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgdXNlciBwcmVz
c2VzIGEgdGV4dCBrZXkuIERvZXMgYSBwcmVmaXgtc2VhcmNoIG9mIHRoZSBpdGVtcy4KKyAgICB2
b2lkIHR5cGVBaGVhZEZpbmQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50Jik7CisKKyAgICAv
LyBSZXR1cm5zIHRoZSBmb250IHRvIHVzZSBmb3IgdGhlIGdpdmVuIHJvdworICAgIEZvbnQgZ2V0
Um93Rm9udChpbnQgaW5kZXgpOworCisgICAgLy8gTW92ZXMgdGhlIHNlbGVjdGlvbiBkb3duL3Vw
IG9uZSBpdGVtLCB0YWtpbmcgY2FyZSBvZiBsb29waW5nIGJhY2sgdG8gdGhlCisgICAgLy8gZmly
c3QvbGFzdCBlbGVtZW50IGlmIG1fbG9vcFNlbGVjdGlvbk5hdmlnYXRpb24gaXMgdHJ1ZS4KKyAg
ICB2b2lkIHNlbGVjdFByZXZpb3VzUm93KCk7CisgICAgdm9pZCBzZWxlY3ROZXh0Um93KCk7CisK
KyAgICAvLyBUaGUgc2V0dGluZ3MgdGhhdCBzcGVjaWZ5IHRoZSBiZWhhdmlvciBmb3IgdGhpcyBQ
b3B1cCB3aW5kb3cuCisgICAgUG9wdXBDb250YWluZXJTZXR0aW5ncyBtX3NldHRpbmdzOworCisg
ICAgLy8gVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gbWFya2VkIGFzICJzZWxlY3RlZCIg
LSBpLmUuIGRpc3BsYXllZCBpbiB0aGUgd2lkZ2V0IG9uIHRoZQorICAgIC8vIHBhZ2UuCisgICAg
aW50IG1fb3JpZ2luYWxJbmRleDsKKworICAgIC8vIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBp
dGVtIHRoYXQgdGhlIHVzZXIgaXMgaG92ZXJlZCBvdmVyIG9yIGhhcyBzZWxlY3RlZCB1c2luZyB0
aGUKKyAgICAvLyBrZXlib2FyZCBpbiB0aGUgbGlzdC4gVGhleSBoYXZlIG5vdCBjb25maXJtZWQg
dGhpcyBzZWxlY3Rpb24gYnkgY2xpY2tpbmcgb3IgcHJlc3NpbmcKKyAgICAvLyBlbnRlciB5ZXQg
aG93ZXZlci4KKyAgICBpbnQgbV9zZWxlY3RlZEluZGV4OworCisgICAgLy8gSWYgPj0gMCwgdGhp
cyBpcyB0aGUgaW5kZXggd2Ugc2hvdWxkIGFjY2VwdCBpZiB0aGUgcG9wdXAgaXMgImFiYW5kb25l
ZCIuCisgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uLCB3aGVyZSB3
ZSB3YW50IHRoZQorICAgIC8vIHNlbGVjdGlvbiB0byBjaGFuZ2UgaW1tZWRpYXRlbHksIGFuZCBp
cyBvbmx5IHVzZWQgaWYgdGhlIHNldHRpbmdzCisgICAgLy8gYWNjZXB0T25BYmFuZG9uIGZpZWxk
IGlzIHRydWUuCisgICAgaW50IG1fYWNjZXB0ZWRJbmRleE9uQWJhbmRvbjsKKworICAgIC8vIFRo
aXMgaXMgdGhlIG51bWJlciBvZiByb3dzIHZpc2libGUgaW4gdGhlIHBvcHVwLiBUaGUgbWF4aW11
bSBudW1iZXIgdmlzaWJsZSBhdCBhIHRpbWUgaXMKKyAgICAvLyBkZWZpbmVkIGFzIGJlaW5nIGtN
YXhWaXNpYmxlUm93cy4gRm9yIGEgc2Nyb2xsZWQgcG9wdXAsIHRoaXMgY2FuIGJlIHRob3VnaHQg
b2YgYXMgdGhlCisgICAgLy8gcGFnZSBzaXplIGluIGRhdGEgdW5pdHMuCisgICAgaW50IG1fdmlz
aWJsZVJvd3M7CisKKyAgICAvLyBPdXIgc3VnZ2VzdGVkIHdpZHRoLCBub3QgaW5jbHVkaW5nIHNj
cm9sbGJhci4KKyAgICBpbnQgbV9iYXNlV2lkdGg7CisKKyAgICAvLyBUaGUgbWF4aW11bSBoZWln
aHQgd2UgY2FuIGJlIHdpdGhvdXQgYmVpbmcgb2ZmLXNjcmVlbi4KKyAgICBpbnQgbV9tYXhIZWln
aHQ7CisKKyAgICAvLyBBIGxpc3Qgb2YgdGhlIG9wdGlvbnMgY29udGFpbmVkIHdpdGhpbiB0aGUg
PHNlbGVjdD4KKyAgICBWZWN0b3I8UG9wdXBJdGVtKj4gbV9pdGVtczsKKworICAgIC8vIFRoZSA8
c2VsZWN0PiBQb3B1cE1lbnVDbGllbnQgdGhhdCBvcGVuZWQgdXMuCisgICAgUG9wdXBNZW51Q2xp
ZW50KiBtX3BvcHVwQ2xpZW50OworCisgICAgLy8gVGhlIHNjcm9sbGJhciB3aGljaCBoYXMgbW91
c2UgY2FwdHVyZS4gTW91c2UgZXZlbnRzIGdvIHN0cmFpZ2h0IHRvIHRoaXMKKyAgICAvLyBpZiBu
b3QgbnVsbC4KKyAgICBSZWZQdHI8U2Nyb2xsYmFyPiBtX2NhcHR1cmluZ1Njcm9sbGJhcjsKKwor
ICAgIC8vIFRoZSBsYXN0IHNjcm9sbGJhciB0aGF0IHRoZSBtb3VzZSB3YXMgb3Zlci4gVXNlZCBm
b3IgbW91c2VvdmVyIGhpZ2hsaWdodHMuCisgICAgUmVmUHRyPFNjcm9sbGJhcj4gbV9sYXN0U2Ny
b2xsYmFyVW5kZXJNb3VzZTsKKworICAgIC8vIFRoZSBzdHJpbmcgdGhlIHVzZXIgaGFzIHR5cGVk
IHNvIGZhciBpbnRvIHRoZSBwb3B1cC4gVXNlZCBmb3IgdHlwZUFoZWFkRmluZC4KKyAgICBTdHJp
bmcgbV90eXBlZFN0cmluZzsKKworICAgIC8vIFRoZSBjaGFyIHRoZSB1c2VyIGhhcyBoaXQgcmVw
ZWF0ZWRseS4gVXNlZCBmb3IgdHlwZUFoZWFkRmluZC4KKyAgICBVQ2hhciBtX3JlcGVhdGluZ0No
YXI7CisKKyAgICAvLyBUaGUgbGFzdCB0aW1lIHRoZSB1c2VyIGhpdCBhIGtleS4gVXNlZCBmb3Ig
dHlwZUFoZWFkRmluZC4KKyAgICBUaW1lU3RhbXAgbV9sYXN0Q2hhclRpbWU7CisKKyAgICAvLyBJ
ZiB3aWR0aCBleGVlZHMgc2NyZWVuIHdpZHRoLCB3ZSBoYXZlIHRvIGNsaXAgaXQuCisgICAgaW50
IG1fbWF4V2luZG93V2lkdGg7CisKKyAgICAvLyBUbyBmb3J3YXJkIGxhc3QgbW91c2UgcmVsZWFz
ZSBldmVudC4KKyAgICBSZWZQdHI8Tm9kZT4gbV9mb2N1c2VkTm9kZTsKKworfTsKKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVtLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVtLmNwcAppbmRleCA0MzhhMjlhNTg2NTk2
ZTNkOWIyM2Q4ZmQ2MjM3NmZhYjNkYjE0MDQyLi4zYjJmMmFlOWZlMzQzMjhhYmNlZGIzZDk1YTE5
ZjE4ZTUxMjk0YzIwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1
bS9Qb3B1cE1lbnVDaHJvbWl1bS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hy
b21pdW0vUG9wdXBNZW51Q2hyb21pdW0uY3BwCkBAIC0zMSw2MyArMzEsMTIgQEAKIAogI2luY2x1
ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlBvcHVwTWVudUNocm9taXVtLmgiCi0KLSNpbmNsdWRl
ICJDaHJvbWUuaCIKLSNpbmNsdWRlICJDaHJvbWVDbGllbnRDaHJvbWl1bS5oIgotI2luY2x1ZGUg
IkZvbnQuaCIKLSNpbmNsdWRlICJGb250U2VsZWN0b3IuaCIKLSNpbmNsdWRlICJGcmFtZVZpZXcu
aCIKLSNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1lbGVzc1Njcm9sbFZpZXcuaCIK
LSNpbmNsdWRlICJGcmFtZWxlc3NTY3JvbGxWaWV3Q2xpZW50LmgiCi0jaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCi0jaW5jbHVkZSAiSW50UmVjdC5oIgotI2luY2x1ZGUgIktleWJvYXJkQ29k
ZXMuaCIKLSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1LZXlib2FyZEV2ZW50
LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1T
Y3JlZW4uaCIKLSNpbmNsdWRlICJQbGF0Zm9ybVdoZWVsRXZlbnQuaCIKLSNpbmNsdWRlICJQb3B1
cE1lbnVDbGllbnQuaCIKLSNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgotI2luY2x1ZGUgIlNjcm9s
bGJhclRoZW1lLmgiCi0jaW5jbHVkZSAiU3RyaW5nVHJ1bmNhdG9yLmgiCi0jaW5jbHVkZSAiU3lz
dGVtVGltZS5oIgotI2luY2x1ZGUgIlRleHRSdW4uaCIKLSNpbmNsdWRlICJVc2VyR2VzdHVyZUlu
ZGljYXRvci5oIgotI2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5oPgotI2luY2x1ZGUgPHd0Zi91
bmljb2RlL0NoYXJhY3Rlck5hbWVzLmg+Ci0KLSNpZiBFTkFCTEUoR0VTVFVSRV9FVkVOVFMpCi0j
aW5jbHVkZSAiUGxhdGZvcm1HZXN0dXJlRXZlbnQuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFRP
VUNIX0VWRU5UUykKLSNpbmNsdWRlICJQbGF0Zm9ybVRvdWNoRXZlbnQuaCIKLSNlbmRpZgotCi11
c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIFdURjsKLXVzaW5nIG5hbWVzcGFj
ZSBVbmljb2RlOwotCi11c2luZyBzdGQ6Om1pbjsKLXVzaW5nIHN0ZDo6bWF4OworI2luY2x1ZGUg
IlBvcHVwQ29udGFpbmVyLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogaW50IFBvcHVwTWVu
dUNocm9taXVtOjpzX21pbmltdW1Sb3dIZWlnaHQgPSAwOwogCi10eXBlZGVmIHVuc2lnbmVkIGxv
bmcgbG9uZyBUaW1lU3RhbXA7Ci0KLXN0YXRpYyBjb25zdCBpbnQga01heFZpc2libGVSb3dzID0g
MjA7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhIZWlnaHQgPSA1MDA7Ci1zdGF0aWMgY29uc3QgaW50
IGtCb3JkZXJTaXplID0gMTsKLXN0YXRpYyBjb25zdCBpbnQga1RleHRUb0xhYmVsUGFkZGluZyA9
IDEwOwotc3RhdGljIGNvbnN0IGludCBrTGFiZWxUb0ljb25QYWRkaW5nID0gNTsKLXN0YXRpYyBj
b25zdCBpbnQga01pbkVuZE9mTGluZVBhZGRpbmcgPSAyOwotc3RhdGljIGNvbnN0IFRpbWVTdGFt
cCBrVHlwZUFoZWFkVGltZW91dE1zID0gMTAwMDsKLXN0YXRpYyBjb25zdCBpbnQga0xpbmVQYWRk
aW5nSGVpZ2h0ID0gMzsgLy8gUGFkZGluZyBoZWlnaHQgcHV0IGF0IHRoZSB0b3AgYW5kIGJvdHRv
bSBvZiBlYWNoIGxpbmUuCi0KIC8vIFRoZSBzZXR0aW5ncyB1c2VkIGZvciB0aGUgZHJvcCBkb3du
IG1lbnUuCiAvLyBUaGlzIGlzIHRoZSBkZWxlZ2F0ZSB1c2VkIGlmIG5vbmUgaXMgcHJvdmlkZWQu
CiBzdGF0aWMgY29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyBkcm9wRG93blNldHRpbmdzID0g
ewpAQCAtOTcsMTQ0OSArNDYsNiBAQCBzdGF0aWMgY29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5n
cyBkcm9wRG93blNldHRpbmdzID0gewogICAgIGZhbHNlIC8vIHJlc3RyaWN0V2lkdGhPZkxpc3RC
b3gKIH07CiAKLS8vIFRoaXMgY2xhc3MgdXNlcyBXZWJDb3JlIGNvZGUgdG8gcGFpbnQgYW5kIGhh
bmRsZSBldmVudHMgZm9yIGEgZHJvcC1kb3duIGxpc3QKLS8vIGJveCAoImNvbWJvYm94IiBvbiBX
aW5kb3dzKS4KLWNsYXNzIFBvcHVwTGlzdEJveCA6IHB1YmxpYyBGcmFtZWxlc3NTY3JvbGxWaWV3
IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxQb3B1cExpc3RCb3g+IGNyZWF0ZShQ
b3B1cE1lbnVDbGllbnQqIGNsaWVudCwgY29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyYgc2V0
dGluZ3MpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFBvcHVwTGlzdEJveChj
bGllbnQsIHNldHRpbmdzKSk7Ci0gICAgfQotCi0gICAgLy8gRnJhbWVsZXNzU2Nyb2xsVmlldwot
ICAgIHZpcnR1YWwgdm9pZCBwYWludChHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0Jik7
Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlRG93bkV2ZW50KGNvbnN0IFBsYXRmb3JtTW91
c2VFdmVudCYpOwotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZU1vdmVFdmVudChjb25zdCBQ
bGF0Zm9ybU1vdXNlRXZlbnQmKTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VSZWxlYXNl
RXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7Ci0gICAgdmlydHVhbCBib29sIGhhbmRs
ZVdoZWVsRXZlbnQoY29uc3QgUGxhdGZvcm1XaGVlbEV2ZW50Jik7Ci0gICAgdmlydHVhbCBib29s
IGhhbmRsZUtleUV2ZW50KGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYpOwotI2lmIEVOQUJM
RShUT1VDSF9FVkVOVFMpCi0gICAgdmlydHVhbCBib29sIGhhbmRsZVRvdWNoRXZlbnQoY29uc3Qg
UGxhdGZvcm1Ub3VjaEV2ZW50Jik7Ci0jZW5kaWYKLSNpZiBFTkFCTEUoR0VTVFVSRV9SRUNPR05J
WkVSKQotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVHZXN0dXJlRXZlbnQoY29uc3QgUGxhdGZvcm1H
ZXN0dXJlRXZlbnQmKTsKLSNlbmRpZgotCi0gICAgLy8gU2Nyb2xsVmlldwotICAgIHZpcnR1YWwg
SG9zdFdpbmRvdyogaG9zdFdpbmRvdygpIGNvbnN0OwotCi0gICAgLy8gUG9wdXBMaXN0Qm94IG1l
dGhvZHMKLQotICAgIC8vIEhpZGVzIHRoZSBwb3B1cC4KLSAgICB2b2lkIGhpZGVQb3B1cCgpOwot
Ci0gICAgLy8gVXBkYXRlcyBvdXIgaW50ZXJuYWwgbGlzdCB0byBtYXRjaCB0aGUgY2xpZW50Lgot
ICAgIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLQotICAgIC8vIEZyZWVzIGFueSBhbGxvY2F0
ZWQgcmVzb3VyY2VzIHVzZWQgaW4gYSBwYXJ0aWN1bGFyIHBvcHVwIHNlc3Npb24uCi0gICAgdm9p
ZCBjbGVhcigpOwotCi0gICAgLy8gU2V0cyB0aGUgaW5kZXggb2YgdGhlIG9wdGlvbiB0aGF0IGlz
IGRpc3BsYXllZCBpbiB0aGUgPHNlbGVjdD4gd2lkZ2V0IGluIHRoZSBwYWdlCi0gICAgdm9pZCBz
ZXRPcmlnaW5hbEluZGV4KGludCBpbmRleCk7Ci0KLSAgICAvLyBHZXRzIHRoZSBpbmRleCBvZiB0
aGUgaXRlbSB0aGF0IHRoZSB1c2VyIGlzIGN1cnJlbnRseSBtb3VzZWQgb3ZlciBvciBoYXMgc2Vs
ZWN0ZWQgd2l0aAotICAgIC8vIHRoZSBrZXlib2FyZC4gVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMg
dGhlIG9yaWdpbmFsIGluZGV4LCBzaW5jZSB0aGUgdXNlciBoYXMgbm90IHlldAotICAgIC8vIGFj
Y2VwdGVkIHRoaXMgaW5wdXQuCi0gICAgaW50IHNlbGVjdGVkSW5kZXgoKSBjb25zdCB7IHJldHVy
biBtX3NlbGVjdGVkSW5kZXg7IH0KLQotICAgIC8vIE1vdmVzIHNlbGVjdGlvbiBkb3duL3VwIHRo
ZSBnaXZlbiBudW1iZXIgb2YgaXRlbXMsIHNjcm9sbGluZyBpZiBuZWNlc3NhcnkuCi0gICAgLy8g
UG9zaXRpdmUgaXMgZG93bi4gIFRoZSByZXN1bHRpbmcgaW5kZXggd2lsbCBiZSBjbGFtcGVkIHRv
IHRoZSByYW5nZQotICAgIC8vIFswLCBudW1JdGVtcyksIGFuZCBub24tb3B0aW9uIGl0ZW1zIHdp
bGwgYmUgc2tpcHBlZC4KLSAgICB2b2lkIGFkanVzdFNlbGVjdGVkSW5kZXgoaW50IGRlbHRhKTsK
LQotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdC4KLSAgICBp
bnQgbnVtSXRlbXMoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG1faXRlbXMuc2l6
ZSgpKTsgfQotCi0gICAgdm9pZCBzZXRCYXNlV2lkdGgoaW50IHdpZHRoKSB7IG1fYmFzZVdpZHRo
ID0gbWluKG1fbWF4V2luZG93V2lkdGgsIHdpZHRoKTsgfQotCi0gICAgLy8gQ29tcHV0ZXMgdGhl
IHNpemUgb2Ygd2lkZ2V0IGFuZCBjaGlsZHJlbi4KLSAgICB2b2lkIGxheW91dCgpOwotCi0gICAg
Ly8gUmV0dXJucyB3aGV0aGVyIHRoZSBwb3B1cCB3YW50cyB0byBwcm9jZXNzIGV2ZW50cyBmb3Ig
dGhlIHBhc3NlZCBrZXkuCi0gICAgYm9vbCBpc0ludGVyZXN0ZWRJbkV2ZW50Rm9yS2V5KGludCBr
ZXlDb2RlKTsKLQotICAgIC8vIEdldHMgdGhlIGhlaWdodCBvZiBhIHJvdy4KLSAgICBpbnQgZ2V0
Um93SGVpZ2h0KGludCBpbmRleCk7Ci0KLSAgICB2b2lkIHNldE1heEhlaWdodChpbnQgbWF4SGVp
Z2h0KSB7IG1fbWF4SGVpZ2h0ID0gbWF4SGVpZ2h0OyB9Ci0KLSAgICB2b2lkIHNldE1heFdpZHRo
KGludCBtYXhXaWR0aCkgeyBtX21heFdpbmRvd1dpZHRoID0gbWF4V2lkdGg7IH0KLQotICAgIHZv
aWQgc2V0TWF4V2lkdGhBbmRMYXlvdXQoaW50KTsKLQotICAgIHZvaWQgZGlzY29ubmVjdENsaWVu
dCgpIHsgbV9wb3B1cENsaWVudCA9IDA7IH0KLQotICAgIGNvbnN0IFZlY3RvcjxQb3B1cEl0ZW0q
PiYgaXRlbXMoKSBjb25zdCB7IHJldHVybiBtX2l0ZW1zOyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJp
ZW5kIGNsYXNzIFBvcHVwQ29udGFpbmVyOwotICAgIGZyaWVuZCBjbGFzcyBSZWZDb3VudGVkPFBv
cHVwTGlzdEJveD47Ci0KLSAgICBQb3B1cExpc3RCb3goUG9wdXBNZW51Q2xpZW50KiBjbGllbnQs
IGNvbnN0IFBvcHVwQ29udGFpbmVyU2V0dGluZ3MmIHNldHRpbmdzKQotICAgICAgICA6IG1fc2V0
dGluZ3Moc2V0dGluZ3MpCi0gICAgICAgICwgbV9vcmlnaW5hbEluZGV4KDApCi0gICAgICAgICwg
bV9zZWxlY3RlZEluZGV4KDApCi0gICAgICAgICwgbV9hY2NlcHRlZEluZGV4T25BYmFuZG9uKC0x
KQotICAgICAgICAsIG1fdmlzaWJsZVJvd3MoMCkKLSAgICAgICAgLCBtX2Jhc2VXaWR0aCgwKQot
ICAgICAgICAsIG1fbWF4SGVpZ2h0KGtNYXhIZWlnaHQpCi0gICAgICAgICwgbV9wb3B1cENsaWVu
dChjbGllbnQpCi0gICAgICAgICwgbV9yZXBlYXRpbmdDaGFyKDApCi0gICAgICAgICwgbV9sYXN0
Q2hhclRpbWUoMCkKLSAgICAgICAgLCBtX21heFdpbmRvd1dpZHRoKG51bWVyaWNfbGltaXRzPGlu
dD46Om1heCgpKQotICAgIHsKLSAgICAgICAgc2V0U2Nyb2xsYmFyTW9kZXMoU2Nyb2xsYmFyQWx3
YXlzT2ZmLCBTY3JvbGxiYXJBbHdheXNPZmYpOwotICAgIH0KLQotICAgIH5Qb3B1cExpc3RCb3go
KQotICAgIHsKLSAgICAgICAgY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvLyBDbG9zZXMgdGhlIHBv
cHVwCi0gICAgdm9pZCBhYmFuZG9uKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNl
bGVjdGlvbiBjYW4gYmUgY2hhbmdlZCB0byBpbmRleC4KLSAgICAvLyBEaXNhYmxlZCBpdGVtcywg
b3IgbGFiZWxzIGNhbm5vdCBiZSBzZWxlY3RlZC4KLSAgICBib29sIGlzU2VsZWN0YWJsZUl0ZW0o
aW50IGluZGV4KTsKLQotICAgIC8vIFNlbGVjdCBhbiBpbmRleCBpbiB0aGUgbGlzdCwgc2Nyb2xs
aW5nIGlmIG5lY2Vzc2FyeS4KLSAgICB2b2lkIHNlbGVjdEluZGV4KGludCBpbmRleCk7Ci0KLSAg
ICAvLyBBY2NlcHRzIHRoZSBzZWxlY3RlZCBpbmRleCBhcyB0aGUgdmFsdWUgdG8gYmUgZGlzcGxh
eWVkIGluIHRoZSA8c2VsZWN0PiB3aWRnZXQgb24KLSAgICAvLyB0aGUgd2ViIHBhZ2UsIGFuZCBj
bG9zZXMgdGhlIHBvcHVwLiBSZXR1cm5zIHRydWUgaWYgaW5kZXggaXMgYWNjZXB0ZWQuCi0gICAg
Ym9vbCBhY2NlcHRJbmRleChpbnQgaW5kZXgpOwotCi0gICAgLy8gQ2xlYXJzIHRoZSBzZWxlY3Rp
b24gKHNvIG5vIHJvdyBhcHBlYXJzIHNlbGVjdGVkKS4KLSAgICB2b2lkIGNsZWFyU2VsZWN0aW9u
KCk7Ci0KLSAgICAvLyBTY3JvbGxzIHRvIHJldmVhbCB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgdm9p
ZCBzY3JvbGxUb1JldmVhbFJvdyhpbnQgaW5kZXgpOwotICAgIHZvaWQgc2Nyb2xsVG9SZXZlYWxT
ZWxlY3Rpb24oKSB7IHNjcm9sbFRvUmV2ZWFsUm93KG1fc2VsZWN0ZWRJbmRleCk7IH0KLQotICAg
IC8vIEludmFsaWRhdGVzIHRoZSByb3cgYXQgdGhlIGdpdmVuIGluZGV4LgotICAgIHZvaWQgaW52
YWxpZGF0ZVJvdyhpbnQgaW5kZXgpOwotCi0gICAgLy8gR2V0IHRoZSBib3VuZHMgb2YgYSByb3cu
Ci0gICAgSW50UmVjdCBnZXRSb3dCb3VuZHMoaW50IGluZGV4KTsKLQotICAgIC8vIENvbnZlcnRz
IGEgcG9pbnQgdG8gYW4gaW5kZXggb2YgdGhlIHJvdyB0aGUgcG9pbnQgaXMgb3ZlcgotICAgIGlu
dCBwb2ludFRvUm93SW5kZXgoY29uc3QgSW50UG9pbnQmKTsKLQotICAgIC8vIFBhaW50IGFuIGlu
ZGl2aWR1YWwgcm93Ci0gICAgdm9pZCBwYWludFJvdyhHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJ
bnRSZWN0JiwgaW50IHJvd0luZGV4KTsKLQotICAgIC8vIFRlc3QgaWYgdGhlIGdpdmVuIHBvaW50
IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBwb3B1cCB3aW5kb3cuCi0gICAgYm9vbCBpc1Bv
aW50SW5Cb3VuZHMoY29uc3QgSW50UG9pbnQmKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSB1
c2VyIHByZXNzZXMgYSB0ZXh0IGtleS4gIERvZXMgYSBwcmVmaXgtc2VhcmNoIG9mIHRoZSBpdGVt
cy4KLSAgICB2b2lkIHR5cGVBaGVhZEZpbmQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50Jik7
Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBmb250IHRvIHVzZSBmb3IgdGhlIGdpdmVuIHJvdwotICAg
IEZvbnQgZ2V0Um93Rm9udChpbnQgaW5kZXgpOwotCi0gICAgLy8gTW92ZXMgdGhlIHNlbGVjdGlv
biBkb3duL3VwIG9uZSBpdGVtLCB0YWtpbmcgY2FyZSBvZiBsb29waW5nIGJhY2sgdG8gdGhlCi0g
ICAgLy8gZmlyc3QvbGFzdCBlbGVtZW50IGlmIG1fbG9vcFNlbGVjdGlvbk5hdmlnYXRpb24gaXMg
dHJ1ZS4KLSAgICB2b2lkIHNlbGVjdFByZXZpb3VzUm93KCk7Ci0gICAgdm9pZCBzZWxlY3ROZXh0
Um93KCk7Ci0KLSAgICAvLyBUaGUgc2V0dGluZ3MgdGhhdCBzcGVjaWZ5IHRoZSBiZWhhdmlvciBm
b3IgdGhpcyBQb3B1cCB3aW5kb3cuCi0gICAgUG9wdXBDb250YWluZXJTZXR0aW5ncyBtX3NldHRp
bmdzOwotCi0gICAgLy8gVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gbWFya2VkIGFzICJz
ZWxlY3RlZCIgLSBpLmUuIGRpc3BsYXllZCBpbiB0aGUgd2lkZ2V0IG9uIHRoZQotICAgIC8vIHBh
Z2UuCi0gICAgaW50IG1fb3JpZ2luYWxJbmRleDsKLQotICAgIC8vIFRoaXMgaXMgdGhlIGluZGV4
IG9mIHRoZSBpdGVtIHRoYXQgdGhlIHVzZXIgaXMgaG92ZXJlZCBvdmVyIG9yIGhhcyBzZWxlY3Rl
ZCB1c2luZyB0aGUKLSAgICAvLyBrZXlib2FyZCBpbiB0aGUgbGlzdC4gVGhleSBoYXZlIG5vdCBj
b25maXJtZWQgdGhpcyBzZWxlY3Rpb24gYnkgY2xpY2tpbmcgb3IgcHJlc3NpbmcKLSAgICAvLyBl
bnRlciB5ZXQgaG93ZXZlci4KLSAgICBpbnQgbV9zZWxlY3RlZEluZGV4OwotCi0gICAgLy8gSWYg
Pj0gMCwgdGhpcyBpcyB0aGUgaW5kZXggd2Ugc2hvdWxkIGFjY2VwdCBpZiB0aGUgcG9wdXAgaXMg
ImFiYW5kb25lZCIuCi0gICAgLy8gVGhpcyBpcyB1c2VkIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9u
LCB3aGVyZSB3ZSB3YW50IHRoZQotICAgIC8vIHNlbGVjdGlvbiB0byBjaGFuZ2UgaW1tZWRpYXRl
bHksIGFuZCBpcyBvbmx5IHVzZWQgaWYgdGhlIHNldHRpbmdzCi0gICAgLy8gYWNjZXB0T25BYmFu
ZG9uIGZpZWxkIGlzIHRydWUuCi0gICAgaW50IG1fYWNjZXB0ZWRJbmRleE9uQWJhbmRvbjsKLQot
ICAgIC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiByb3dzIHZpc2libGUgaW4gdGhlIHBvcHVwLiBU
aGUgbWF4aW11bSBudW1iZXIgdmlzaWJsZSBhdCBhIHRpbWUgaXMKLSAgICAvLyBkZWZpbmVkIGFz
IGJlaW5nIGtNYXhWaXNpYmxlUm93cy4gRm9yIGEgc2Nyb2xsZWQgcG9wdXAsIHRoaXMgY2FuIGJl
IHRob3VnaHQgb2YgYXMgdGhlCi0gICAgLy8gcGFnZSBzaXplIGluIGRhdGEgdW5pdHMuCi0gICAg
aW50IG1fdmlzaWJsZVJvd3M7Ci0KLSAgICAvLyBPdXIgc3VnZ2VzdGVkIHdpZHRoLCBub3QgaW5j
bHVkaW5nIHNjcm9sbGJhci4KLSAgICBpbnQgbV9iYXNlV2lkdGg7Ci0KLSAgICAvLyBUaGUgbWF4
aW11bSBoZWlnaHQgd2UgY2FuIGJlIHdpdGhvdXQgYmVpbmcgb2ZmLXNjcmVlbi4KLSAgICBpbnQg
bV9tYXhIZWlnaHQ7Ci0KLSAgICAvLyBBIGxpc3Qgb2YgdGhlIG9wdGlvbnMgY29udGFpbmVkIHdp
dGhpbiB0aGUgPHNlbGVjdD4KLSAgICBWZWN0b3I8UG9wdXBJdGVtKj4gbV9pdGVtczsKLQotICAg
IC8vIFRoZSA8c2VsZWN0PiBQb3B1cE1lbnVDbGllbnQgdGhhdCBvcGVuZWQgdXMuCi0gICAgUG9w
dXBNZW51Q2xpZW50KiBtX3BvcHVwQ2xpZW50OwotCi0gICAgLy8gVGhlIHNjcm9sbGJhciB3aGlj
aCBoYXMgbW91c2UgY2FwdHVyZS4gIE1vdXNlIGV2ZW50cyBnbyBzdHJhaWdodCB0byB0aGlzCi0g
ICAgLy8gaWYgbm9uLU5VTEwuCi0gICAgUmVmUHRyPFNjcm9sbGJhcj4gbV9jYXB0dXJpbmdTY3Jv
bGxiYXI7Ci0KLSAgICAvLyBUaGUgbGFzdCBzY3JvbGxiYXIgdGhhdCB0aGUgbW91c2Ugd2FzIG92
ZXIuICBVc2VkIGZvciBtb3VzZW92ZXIgaGlnaGxpZ2h0cy4KLSAgICBSZWZQdHI8U2Nyb2xsYmFy
PiBtX2xhc3RTY3JvbGxiYXJVbmRlck1vdXNlOwotCi0gICAgLy8gVGhlIHN0cmluZyB0aGUgdXNl
ciBoYXMgdHlwZWQgc28gZmFyIGludG8gdGhlIHBvcHVwLiBVc2VkIGZvciB0eXBlQWhlYWRGaW5k
LgotICAgIFN0cmluZyBtX3R5cGVkU3RyaW5nOwotCi0gICAgLy8gVGhlIGNoYXIgdGhlIHVzZXIg
aGFzIGhpdCByZXBlYXRlZGx5LiAgVXNlZCBmb3IgdHlwZUFoZWFkRmluZC4KLSAgICBVQ2hhciBt
X3JlcGVhdGluZ0NoYXI7Ci0KLSAgICAvLyBUaGUgbGFzdCB0aW1lIHRoZSB1c2VyIGhpdCBhIGtl
eS4gIFVzZWQgZm9yIHR5cGVBaGVhZEZpbmQuCi0gICAgVGltZVN0YW1wIG1fbGFzdENoYXJUaW1l
OwotCi0gICAgLy8gSWYgd2lkdGggZXhlZWRzIHNjcmVlbiB3aWR0aCwgd2UgaGF2ZSB0byBjbGlw
IGl0LgotICAgIGludCBtX21heFdpbmRvd1dpZHRoOwotCi0gICAgLy8gVG8gZm9yd2FyZCBsYXN0
IG1vdXNlIHJlbGVhc2UgZXZlbnQuCi0gICAgUmVmUHRyPE5vZGU+IG1fZm9jdXNlZE5vZGU7Ci19
OwotCi1zdGF0aWMgUGxhdGZvcm1Nb3VzZUV2ZW50IGNvbnN0cnVjdFJlbGF0aXZlTW91c2VFdmVu
dChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZWxlc3NTY3JvbGxWaWV3KiBwYXJlbnQs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBG
cmFtZWxlc3NTY3JvbGxWaWV3KiBjaGlsZCkKLXsKLSAgICBJbnRQb2ludCBwb3MgPSBwYXJlbnQt
PmNvbnZlcnRTZWxmVG9DaGlsZChjaGlsZCwgZS5wb3MoKSk7Ci0KLSAgICAvLyBGSVhNRTogVGhp
cyBpcyBhIGhvcnJpYmxlIGhhY2sgc2luY2UgUGxhdGZvcm1Nb3VzZUV2ZW50IGhhcyBubyBzZXR0
ZXJzIGZvciB4L3kuCi0gICAgUGxhdGZvcm1Nb3VzZUV2ZW50IHJlbGF0aXZlRXZlbnQgPSBlOwot
ICAgIEludFBvaW50JiByZWxhdGl2ZVBvcyA9IGNvbnN0X2Nhc3Q8SW50UG9pbnQmPihyZWxhdGl2
ZUV2ZW50LnBvcygpKTsKLSAgICByZWxhdGl2ZVBvcy5zZXRYKHBvcy54KCkpOwotICAgIHJlbGF0
aXZlUG9zLnNldFkocG9zLnkoKSk7Ci0gICAgcmV0dXJuIHJlbGF0aXZlRXZlbnQ7Ci19Ci0KLXN0
YXRpYyBQbGF0Zm9ybVdoZWVsRXZlbnQgY29uc3RydWN0UmVsYXRpdmVXaGVlbEV2ZW50KGNvbnN0
IFBsYXRmb3JtV2hlZWxFdmVudCYgZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIEZyYW1lbGVzc1Njcm9sbFZpZXcqIHBhcmVudCwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lbGVz
c1Njcm9sbFZpZXcqIGNoaWxkKQotewotICAgIEludFBvaW50IHBvcyA9IHBhcmVudC0+Y29udmVy
dFNlbGZUb0NoaWxkKGNoaWxkLCBlLnBvcygpKTsKLQotICAgIC8vIEZJWE1FOiBUaGlzIGlzIGEg
aG9ycmlibGUgaGFjayBzaW5jZSBQbGF0Zm9ybVdoZWVsRXZlbnQgaGFzIG5vIHNldHRlcnMgZm9y
IHgveS4KLSAgICBQbGF0Zm9ybVdoZWVsRXZlbnQgcmVsYXRpdmVFdmVudCA9IGU7Ci0gICAgSW50
UG9pbnQmIHJlbGF0aXZlUG9zID0gY29uc3RfY2FzdDxJbnRQb2ludCY+KHJlbGF0aXZlRXZlbnQu
cG9zKCkpOwotICAgIHJlbGF0aXZlUG9zLnNldFgocG9zLngoKSk7Ci0gICAgcmVsYXRpdmVQb3Mu
c2V0WShwb3MueSgpKTsKLSAgICByZXR1cm4gcmVsYXRpdmVFdmVudDsKLX0KLQotLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLwotLy8gUG9wdXBDb250YWluZXIgaW1wbGVtZW50YXRpb24KLQotLy8gc3Rh
dGljCi1QYXNzUmVmUHRyPFBvcHVwQ29udGFpbmVyPiBQb3B1cENvbnRhaW5lcjo6Y3JlYXRlKFBv
cHVwTWVudUNsaWVudCogY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBQb3B1cFR5cGUgcG9wdXBUeXBlLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb3B1cENvbnRhaW5lclNldHRp
bmdzJiBzZXR0aW5ncykKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IFBvcHVwQ29udGFpbmVy
KGNsaWVudCwgcG9wdXBUeXBlLCBzZXR0aW5ncykpOwotfQotCi1Qb3B1cENvbnRhaW5lcjo6UG9w
dXBDb250YWluZXIoUG9wdXBNZW51Q2xpZW50KiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgUG9wdXBUeXBlIHBvcHVwVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJiBzZXR0aW5ncykKLSAgICA6IG1f
bGlzdEJveChQb3B1cExpc3RCb3g6OmNyZWF0ZShjbGllbnQsIHNldHRpbmdzKSkKLSAgICAsIG1f
c2V0dGluZ3Moc2V0dGluZ3MpCi0gICAgLCBtX3BvcHVwVHlwZShwb3B1cFR5cGUpCi0gICAgLCBt
X3BvcHVwT3BlbihmYWxzZSkKLXsKLSAgICBzZXRTY3JvbGxiYXJNb2RlcyhTY3JvbGxiYXJBbHdh
eXNPZmYsIFNjcm9sbGJhckFsd2F5c09mZik7Ci19Ci0KLVBvcHVwQ29udGFpbmVyOjp+UG9wdXBD
b250YWluZXIoKQotewotICAgIGlmIChtX2xpc3RCb3ggJiYgbV9saXN0Qm94LT5wYXJlbnQoKSkK
LSAgICAgICAgcmVtb3ZlQ2hpbGQobV9saXN0Qm94LmdldCgpKTsKLX0KLQotSW50UmVjdCBQb3B1
cENvbnRhaW5lcjo6bGF5b3V0QW5kQ2FsY3VsYXRlV2lkZ2V0UmVjdChpbnQgdGFyZ2V0Q29udHJv
bEhlaWdodCwgY29uc3QgSW50UG9pbnQmIHBvcHVwSW5pdGlhbENvb3JkaW5hdGUpCi17Ci0gICAg
Ly8gUmVzZXQgdGhlIG1heCB3aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVz
LCB0aGV5IHdpbGwgYmUgcmVjb21wdXRlZCBiZWxvdwotICAgIC8vIGlmIG5lY2Vzc2FyeS4KLSAg
ICBtX2xpc3RCb3gtPnNldE1heEhlaWdodChrTWF4SGVpZ2h0KTsKLSAgICBtX2xpc3RCb3gtPnNl
dE1heFdpZHRoKG51bWVyaWNfbGltaXRzPGludD46Om1heCgpKTsKLQotICAgIC8vIExheSBldmVy
eXRoaW5nIG91dCB0byBmaWd1cmUgb3V0IG91ciBwcmVmZXJyZWQgc2l6ZSwgdGhlbiB0ZWxsIHRo
ZSB2aWV3J3MKLSAgICAvLyBXaWRnZXRDbGllbnQgYWJvdXQgaXQuICBJdCBzaG91bGQgYXNzaWdu
IHVzIGEgY2xpZW50LgotICAgIGludCBydGxPZmZzZXQgPSBsYXlvdXRBbmRHZXRSVExPZmZzZXQo
KTsKLSAgICBib29sIGlzUlRMID0gdGhpcy0+aXNSVEwoKTsKLSAgICBpbnQgcmlnaHRPZmZzZXQg
PSBpc1JUTCA/IHJ0bE9mZnNldCA6IDA7Ci0KLSAgICAvLyBBc3N1bWUgbV9saXN0Qm94IHNpemUg
aXMgYWxyZWFkeSBjYWxjdWxhdGVkLgotICAgIEludFNpemUgdGFyZ2V0U2l6ZShtX2xpc3RCb3gt
PndpZHRoKCkgKyBrQm9yZGVyU2l6ZSAqIDIsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fbGlz
dEJveC0+aGVpZ2h0KCkgKyBrQm9yZGVyU2l6ZSAqIDIpOwotCi0gICAgSW50UmVjdCB3aWRnZXRS
ZWN0OwotICAgIENocm9tZUNsaWVudENocm9taXVtKiBjaHJvbWVDbGllbnQgPSBjaHJvbWVDbGll
bnRDaHJvbWl1bSgpOwotICAgIGlmIChjaHJvbWVDbGllbnQpIHsKLSAgICAgICAgLy8gSWYgdGhl
IHBvcHVwIHdvdWxkIGV4dGVuZCBwYXN0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiwgb3BlbiB1
cHdhcmRzCi0gICAgICAgIC8vIGluc3RlYWQuCi0gICAgICAgIEZsb2F0UmVjdCBzY3JlZW4gPSBz
Y3JlZW5BdmFpbGFibGVSZWN0KG1fZnJhbWVWaWV3LmdldCgpKTsKLSAgICAgICAgLy8gVXNlIHBv
cHVwSW5pdGlhbENvb3JkaW5hdGUueCgpICsgcmlnaHRPZmZzZXQgYmVjYXVzZSBSVEwgcG9zaXRp
b24KLSAgICAgICAgLy8gbmVlZHMgdG8gYmUgY29uc2lkZXJlZC4KLSAgICAgICAgd2lkZ2V0UmVj
dCA9IGNocm9tZUNsaWVudC0+d2luZG93VG9TY3JlZW4oSW50UmVjdChwb3B1cEluaXRpYWxDb29y
ZGluYXRlLngoKSArIHJpZ2h0T2Zmc2V0LCBwb3B1cEluaXRpYWxDb29yZGluYXRlLnkoKSwgdGFy
Z2V0U2l6ZS53aWR0aCgpLCB0YXJnZXRTaXplLmhlaWdodCgpKSk7Ci0KLSAgICAgICAgLy8gSWYg
d2UgaGF2ZSBtdWx0aXBsZSBzY3JlZW5zIGFuZCB0aGUgYnJvd3NlciByZWN0IGlzIGluIG9uZSBz
Y3JlZW4sIHdlIGhhdmUKLSAgICAgICAgLy8gdG8gY2xpcCB0aGUgd2luZG93IHdpZHRoIHRvIHRo
ZSBzY3JlZW4gd2lkdGguCi0gICAgICAgIC8vIFdoZW4gY2xpcHBpbmcsIHdlIGFsc28gbmVlZCB0
byBzZXQgYSBtYXhpbXVtIHdpZHRoIGZvciB0aGUgbGlzdCBib3guCi0gICAgICAgIEZsb2F0UmVj
dCB3aW5kb3dSZWN0ID0gY2hyb21lQ2xpZW50LT53aW5kb3dSZWN0KCk7Ci0gICAgICAgIGlmICh3
aW5kb3dSZWN0LngoKSA+PSBzY3JlZW4ueCgpICYmIHdpbmRvd1JlY3QubWF4WCgpIDw9IHNjcmVl
bi5tYXhYKCkgJiYgKHdpZGdldFJlY3QueCgpIDwgc2NyZWVuLngoKSB8fCB3aWRnZXRSZWN0Lm1h
eFgoKSA+IHNjcmVlbi5tYXhYKCkpKSB7Ci0gICAgICAgICAgICAvLyBGaXJzdCwgaW52ZXJzZSB0
aGUgcG9wdXAgYWxpZ25tZW50IGlmIGl0IGRvZXMgbm90IGZpdCB0aGUgc2NyZWVuIC0gdGhpcyBt
aWdodCBmaXggdGhpbmdzIChvciBtYWtlIHRoZW0gYmV0dGVyKS4KLSAgICAgICAgICAgIEludFJl
Y3QgaW52ZXJzZVdpZGdldFJlY3QgPSBjaHJvbWVDbGllbnQtPndpbmRvd1RvU2NyZWVuKEludFJl
Y3QocG9wdXBJbml0aWFsQ29vcmRpbmF0ZS54KCkgKyAoaXNSVEwgPyAwIDogcnRsT2Zmc2V0KSwg
cG9wdXBJbml0aWFsQ29vcmRpbmF0ZS55KCksIHRhcmdldFNpemUud2lkdGgoKSwgdGFyZ2V0U2l6
ZS5oZWlnaHQoKSkpOwotICAgICAgICAgICAgSW50UmVjdCBlbmNsb3NpbmdTY3JlZW4gPSBlbmNs
b3NpbmdJbnRSZWN0KHNjcmVlbik7Ci0gICAgICAgICAgICB1bnNpZ25lZCBvcmlnaW5hbEN1dG9m
ZiA9IG1heChlbmNsb3NpbmdTY3JlZW4ueCgpIC0gd2lkZ2V0UmVjdC54KCksIDApICsgbWF4KHdp
ZGdldFJlY3QubWF4WCgpIC0gZW5jbG9zaW5nU2NyZWVuLm1heFgoKSwgMCk7Ci0gICAgICAgICAg
ICB1bnNpZ25lZCBpbnZlcnNlQ3V0b2ZmID0gbWF4KGVuY2xvc2luZ1NjcmVlbi54KCkgLSBpbnZl
cnNlV2lkZ2V0UmVjdC54KCksIDApICsgbWF4KGludmVyc2VXaWRnZXRSZWN0Lm1heFgoKSAtIGVu
Y2xvc2luZ1NjcmVlbi5tYXhYKCksIDApOwotCi0gICAgICAgICAgICAvLyBBY2NlcHQgdGhlIGlu
dmVyc2UgcG9wdXAgYWxpZ25tZW50IGlmIHRoZSB0cmltbWVkIGNvbnRlbnQgZ2V0cyBzaG9ydGVy
IHRoYW4gdGhhdCBpbiB0aGUgb3JpZ2luYWwgYWxpZ25tZW50IGNhc2UuCi0gICAgICAgICAgICBp
ZiAoaW52ZXJzZUN1dG9mZiA8IG9yaWdpbmFsQ3V0b2ZmKQotICAgICAgICAgICAgICAgIHdpZGdl
dFJlY3QgPSBpbnZlcnNlV2lkZ2V0UmVjdDsKLQotICAgICAgICAgICAgaWYgKHdpZGdldFJlY3Qu
eCgpIDwgc2NyZWVuLngoKSkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHdpZGdldFJpZ2h0
ID0gd2lkZ2V0UmVjdC5tYXhYKCk7Ci0gICAgICAgICAgICAgICAgd2lkZ2V0UmVjdC5zZXRXaWR0
aCh3aWRnZXRSZWN0Lm1heFgoKSAtIHNjcmVlbi54KCkpOwotICAgICAgICAgICAgICAgIHdpZGdl
dFJlY3Quc2V0WCh3aWRnZXRSaWdodCAtIHdpZGdldFJlY3Qud2lkdGgoKSk7Ci0gICAgICAgICAg
ICAgICAgbGlzdEJveCgpLT5zZXRNYXhXaWR0aEFuZExheW91dChtYXgod2lkZ2V0UmVjdC53aWR0
aCgpIC0ga0JvcmRlclNpemUgKiAyLCAwKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZGdl
dFJlY3QubWF4WCgpID4gc2NyZWVuLm1heFgoKSkgewotICAgICAgICAgICAgICAgIHdpZGdldFJl
Y3Quc2V0V2lkdGgoc2NyZWVuLm1heFgoKSAtIHdpZGdldFJlY3QueCgpKTsKLSAgICAgICAgICAg
ICAgICBsaXN0Qm94KCktPnNldE1heFdpZHRoQW5kTGF5b3V0KG1heCh3aWRnZXRSZWN0LndpZHRo
KCkgLSBrQm9yZGVyU2l6ZSAqIDIsIDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIENhbGN1bGF0ZSBZIGF4aXMgc2l6ZS4KLSAgICAgICAgaWYgKHdpZGdldFJlY3Qu
bWF4WSgpID4gc3RhdGljX2Nhc3Q8aW50PihzY3JlZW4ubWF4WSgpKSkgewotICAgICAgICAgICAg
aWYgKHdpZGdldFJlY3QueSgpIC0gd2lkZ2V0UmVjdC5oZWlnaHQoKSAtIHRhcmdldENvbnRyb2xI
ZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgZW5vdWdoIHJvb20gdG8g
b3BlbiB1cHdhcmRzLgotICAgICAgICAgICAgICAgIHdpZGdldFJlY3QubW92ZSgwLCAtKHdpZGdl
dFJlY3QuaGVpZ2h0KCkgKyB0YXJnZXRDb250cm9sSGVpZ2h0KSk7Ci0gICAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSB3aGV0aGVyIHVwd2FyZHMgb3IgZG93bndh
cmRzIGhhcyBtb3JlIHJvb20gYW5kIHNldCB0aGUKLSAgICAgICAgICAgICAgICAvLyBtYXhpbXVt
IG51bWJlciBvZiBpdGVtcy4KLSAgICAgICAgICAgICAgICBpbnQgc3BhY2VBYm92ZSA9IHdpZGdl
dFJlY3QueSgpIC0gdGFyZ2V0Q29udHJvbEhlaWdodDsKLSAgICAgICAgICAgICAgICBpbnQgc3Bh
Y2VCZWxvdyA9IHNjcmVlbi5tYXhZKCkgLSB3aWRnZXRSZWN0LnkoKTsKLSAgICAgICAgICAgICAg
ICBpZiAoc3BhY2VBYm92ZSA+IHNwYWNlQmVsb3cpCi0gICAgICAgICAgICAgICAgICAgIG1fbGlz
dEJveC0+c2V0TWF4SGVpZ2h0KHNwYWNlQWJvdmUpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAg
ICAgICAgICAgICAgICAgICAgbV9saXN0Qm94LT5zZXRNYXhIZWlnaHQoc3BhY2VCZWxvdyk7Ci0g
ICAgICAgICAgICAgICAgbGF5b3V0QW5kR2V0UlRMT2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAg
Ly8gT3VyIGhlaWdodCBoYXMgY2hhbmdlZCwgc28gcmVjb21wdXRlIG9ubHkgWSBheGlzIG9mIHdp
ZGdldFJlY3QuCi0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSB0byByZWNvbXB1dGUg
WCBheGlzLCBzbyB3ZSBvbmx5IHJlcGxhY2UgWSBheGlzCi0gICAgICAgICAgICAgICAgLy8gaW4g
d2lkZ2V0UmVjdC4KLSAgICAgICAgICAgICAgICBJbnRSZWN0IGZyYW1lSW5TY3JlZW4gPSBjaHJv
bWVDbGllbnQtPndpbmRvd1RvU2NyZWVuKGZyYW1lUmVjdCgpKTsKLSAgICAgICAgICAgICAgICB3
aWRnZXRSZWN0LnNldFkoZnJhbWVJblNjcmVlbi55KCkpOwotICAgICAgICAgICAgICAgIHdpZGdl
dFJlY3Quc2V0SGVpZ2h0KGZyYW1lSW5TY3JlZW4uaGVpZ2h0KCkpOwotICAgICAgICAgICAgICAg
IC8vIEFuZCBtb3ZlIHVwd2FyZHMgaWYgbmVjZXNzYXJ5LgotICAgICAgICAgICAgICAgIGlmIChz
cGFjZUFib3ZlID4gc3BhY2VCZWxvdykKLSAgICAgICAgICAgICAgICAgICAgd2lkZ2V0UmVjdC5t
b3ZlKDAsIC0od2lkZ2V0UmVjdC5oZWlnaHQoKSArIHRhcmdldENvbnRyb2xIZWlnaHQpKTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gd2lkZ2V0UmVjdDsKLX0K
LQotdm9pZCBQb3B1cENvbnRhaW5lcjo6c2hvd1BvcHVwKEZyYW1lVmlldyogdmlldykKLXsKLSAg
ICBtX2ZyYW1lVmlldyA9IHZpZXc7Ci0gICAgbGlzdEJveCgpLT5tX2ZvY3VzZWROb2RlID0gbV9m
cmFtZVZpZXctPmZyYW1lKCktPmRvY3VtZW50KCktPmZvY3VzZWROb2RlKCk7Ci0KLSAgICBDaHJv
bWVDbGllbnRDaHJvbWl1bSogY2hyb21lQ2xpZW50ID0gY2hyb21lQ2xpZW50Q2hyb21pdW0oKTsK
LSAgICBpZiAoY2hyb21lQ2xpZW50KSB7Ci0gICAgICAgIEludFJlY3QgcG9wdXBSZWN0ID0gZnJh
bWVSZWN0KCk7Ci0gICAgICAgIGNocm9tZUNsaWVudC0+cG9wdXBPcGVuZWQodGhpcywgbGF5b3V0
QW5kQ2FsY3VsYXRlV2lkZ2V0UmVjdChwb3B1cFJlY3QuaGVpZ2h0KCksIHBvcHVwUmVjdC5sb2Nh
dGlvbigpKSwgZmFsc2UpOwotICAgICAgICBtX3BvcHVwT3BlbiA9IHRydWU7Ci0gICAgfQotCi0g
ICAgaWYgKCFtX2xpc3RCb3gtPnBhcmVudCgpKQotICAgICAgICBhZGRDaGlsZChtX2xpc3RCb3gu
Z2V0KCkpOwotCi0gICAgLy8gRW5hYmxlIHNjcm9sbGJhcnMgYWZ0ZXIgdGhlIGxpc3Rib3ggaXMg
aW5zZXJ0ZWQgaW50byB0aGUgaGllcmFyY2h5LAotICAgIC8vIHNvIGl0IGhhcyBhIHByb3BlciBX
aWRnZXRDbGllbnQuCi0gICAgbV9saXN0Qm94LT5zZXRWZXJ0aWNhbFNjcm9sbGJhck1vZGUoU2Ny
b2xsYmFyQXV0byk7Ci0KLSAgICBtX2xpc3RCb3gtPnNjcm9sbFRvUmV2ZWFsU2VsZWN0aW9uKCk7
Ci0KLSAgICBpbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgUG9wdXBDb250YWluZXI6OmhpZGVQb3B1
cCgpCi17Ci0gICAgbGlzdEJveCgpLT5oaWRlUG9wdXAoKTsKLX0KLQotdm9pZCBQb3B1cENvbnRh
aW5lcjo6bm90aWZ5UG9wdXBIaWRkZW4oKQotewotICAgIGlmICghbV9wb3B1cE9wZW4pCi0gICAg
ICAgIHJldHVybjsKLSAgICBtX3BvcHVwT3BlbiA9IGZhbHNlOwotICAgIGNocm9tZUNsaWVudENo
cm9taXVtKCktPnBvcHVwQ2xvc2VkKHRoaXMpOwotfQotCi1pbnQgUG9wdXBDb250YWluZXI6Omxh
eW91dEFuZEdldFJUTE9mZnNldCgpCi17Ci0gICAgbV9saXN0Qm94LT5sYXlvdXQoKTsKLQotICAg
IC8vIFBsYWNlIHRoZSBsaXN0Ym94IHdpdGhpbiBvdXIgYm9yZGVyLgotICAgIG1fbGlzdEJveC0+
bW92ZShrQm9yZGVyU2l6ZSwga0JvcmRlclNpemUpOwotCi0gICAgLy8gU2l6ZSBvdXJzZWx2ZXMg
dG8gY29udGFpbiBsaXN0Ym94ICsgYm9yZGVyLgotICAgIGludCBsaXN0Qm94V2lkdGggPSBtX2xp
c3RCb3gtPndpZHRoKCkgKyBrQm9yZGVyU2l6ZSAqIDI7Ci0gICAgcmVzaXplKGxpc3RCb3hXaWR0
aCwgbV9saXN0Qm94LT5oZWlnaHQoKSArIGtCb3JkZXJTaXplICogMik7Ci0gICAgaW52YWxpZGF0
ZSgpOwotCi0gICAgLy8gQ29tcHV0ZSB0aGUgc3RhcnRpbmcgeC1heGlzIGZvciBhIG5vcm1hbCBS
VEwgb3IgcmlnaHQtYWxpZ25lZCBMVFIgZHJvcGRvd24uIEZvciB0aG9zZSwKLSAgICAvLyB0aGUg
cmlnaHQgZWRnZSBvZiBkcm9wZG93biBib3ggc2hvdWxkIGJlIGFsaWduZWQgd2l0aCB0aGUgcmln
aHQgZWRnZSBvZiA8c2VsZWN0Pi88aW5wdXQ+IGVsZW1lbnQgYm94LAotICAgIC8vIGFuZCB0aGUg
ZHJvcGRvd24gYm94IHNob3VsZCBiZSBleHBhbmRlZCB0byB0aGUgbGVmdCBpZiBtb3JlIHNwYWNl
IGlzIG5lZWRlZC4KLSAgICAvLyBtX29yaWdpbmFsRnJhbWVSZWN0LndpZHRoKCkgaXMgdGhlIHdp
ZHRoIG9mIHRoZSB0YXJnZXQgPHNlbGVjdD4vPGlucHV0PiBlbGVtZW50LgotICAgIHJldHVybiBt
X29yaWdpbmFsRnJhbWVSZWN0LndpZHRoKCkgLSBsaXN0Qm94V2lkdGg7Ci19Ci0KLWJvb2wgUG9w
dXBDb250YWluZXI6OmhhbmRsZU1vdXNlRG93bkV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVu
dCYgZXZlbnQpCi17Ci0gICAgVXNlckdlc3R1cmVJbmRpY2F0b3IgZ2VzdHVyZUluZGljYXRvcihE
ZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJHZXN0dXJlKTsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5o
YW5kbGVNb3VzZURvd25FdmVudCgKLSAgICAgICAgY29uc3RydWN0UmVsYXRpdmVNb3VzZUV2ZW50
KGV2ZW50LCB0aGlzLCBtX2xpc3RCb3guZ2V0KCkpKTsKLX0KLQotYm9vbCBQb3B1cENvbnRhaW5l
cjo6aGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkK
LXsKLSAgICBVc2VyR2VzdHVyZUluZGljYXRvciBnZXN0dXJlSW5kaWNhdG9yKERlZmluaXRlbHlQ
cm9jZXNzaW5nVXNlckdlc3R1cmUpOwotICAgIHJldHVybiBtX2xpc3RCb3gtPmhhbmRsZU1vdXNl
TW92ZUV2ZW50KAotICAgICAgICBjb25zdHJ1Y3RSZWxhdGl2ZU1vdXNlRXZlbnQoZXZlbnQsIHRo
aXMsIG1fbGlzdEJveC5nZXQoKSkpOwotfQotCi1ib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVN
b3VzZVJlbGVhc2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2ZW50KQotewotICAg
IFJlZlB0cjxQb3B1cENvbnRhaW5lcj4gcHJvdGVjdCh0aGlzKTsKLSAgICBVc2VyR2VzdHVyZUlu
ZGljYXRvciBnZXN0dXJlSW5kaWNhdG9yKERlZmluaXRlbHlQcm9jZXNzaW5nVXNlckdlc3R1cmUp
OwotICAgIHJldHVybiBtX2xpc3RCb3gtPmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KAotICAgICAg
ICBjb25zdHJ1Y3RSZWxhdGl2ZU1vdXNlRXZlbnQoZXZlbnQsIHRoaXMsIG1fbGlzdEJveC5nZXQo
KSkpOwotfQotCi1ib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVXaGVlbEV2ZW50KGNvbnN0IFBs
YXRmb3JtV2hlZWxFdmVudCYgZXZlbnQpCi17Ci0gICAgVXNlckdlc3R1cmVJbmRpY2F0b3IgZ2Vz
dHVyZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJHZXN0dXJlKTsKLSAgICByZXR1
cm4gbV9saXN0Qm94LT5oYW5kbGVXaGVlbEV2ZW50KAotICAgICAgICBjb25zdHJ1Y3RSZWxhdGl2
ZVdoZWVsRXZlbnQoZXZlbnQsIHRoaXMsIG1fbGlzdEJveC5nZXQoKSkpOwotfQotCi0jaWYgRU5B
QkxFKFRPVUNIX0VWRU5UUykKLWJvb2wgUG9wdXBDb250YWluZXI6OmhhbmRsZVRvdWNoRXZlbnQo
Y29uc3QgUGxhdGZvcm1Ub3VjaEV2ZW50JikKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0jZW5k
aWYKLQotI2lmIEVOQUJMRShHRVNUVVJFX1JFQ09HTklaRVIpCi0vLyBGSVhNRTogUmVmYWN0b3Ig
dGhpcyBjb2RlIHRvIHNoYXJlIGZ1bmN0aW9uYWxpdHkgd2l0aCBFdmVudEhhbmRsZXI6OmhhbmRs
ZUdlc3R1cmVFdmVudC4KLWJvb2wgUG9wdXBDb250YWluZXI6OmhhbmRsZUdlc3R1cmVFdmVudChj
b25zdCBQbGF0Zm9ybUdlc3R1cmVFdmVudCYgZ2VzdHVyZUV2ZW50KQotewotICAgIHN3aXRjaCAo
Z2VzdHVyZUV2ZW50LnR5cGUoKSkgewotICAgIGNhc2UgUGxhdGZvcm1HZXN0dXJlRXZlbnQ6OlRh
cFR5cGU6IHsKLSAgICAgICAgUGxhdGZvcm1Nb3VzZUV2ZW50IGZha2VNb3VzZU1vdmUoZ2VzdHVy
ZUV2ZW50LnBvc2l0aW9uKCksIGdlc3R1cmVFdmVudC5nbG9iYWxQb3NpdGlvbigpLCBOb0J1dHRv
biwgTW91c2VFdmVudE1vdmVkLCAvKiBjbGlja0NvdW50ICovIDEsIGdlc3R1cmVFdmVudC5zaGlm
dEtleSgpLCBnZXN0dXJlRXZlbnQuY3RybEtleSgpLCBnZXN0dXJlRXZlbnQuYWx0S2V5KCksIGdl
c3R1cmVFdmVudC5tZXRhS2V5KCksIGdlc3R1cmVFdmVudC50aW1lc3RhbXAoKSk7Ci0gICAgICAg
IFBsYXRmb3JtTW91c2VFdmVudCBmYWtlTW91c2VEb3duKGdlc3R1cmVFdmVudC5wb3NpdGlvbigp
LCBnZXN0dXJlRXZlbnQuZ2xvYmFsUG9zaXRpb24oKSwgTGVmdEJ1dHRvbiwgTW91c2VFdmVudFBy
ZXNzZWQsIC8qIGNsaWNrQ291bnQgKi8gMSwgZ2VzdHVyZUV2ZW50LnNoaWZ0S2V5KCksIGdlc3R1
cmVFdmVudC5jdHJsS2V5KCksIGdlc3R1cmVFdmVudC5hbHRLZXkoKSwgZ2VzdHVyZUV2ZW50Lm1l
dGFLZXkoKSwgZ2VzdHVyZUV2ZW50LnRpbWVzdGFtcCgpKTsKLSAgICAgICAgUGxhdGZvcm1Nb3Vz
ZUV2ZW50IGZha2VNb3VzZVVwKGdlc3R1cmVFdmVudC5wb3NpdGlvbigpLCBnZXN0dXJlRXZlbnQu
Z2xvYmFsUG9zaXRpb24oKSwgTGVmdEJ1dHRvbiwgTW91c2VFdmVudFJlbGVhc2VkLCAvKiBjbGlj
a0NvdW50ICovIDEsIGdlc3R1cmVFdmVudC5zaGlmdEtleSgpLCBnZXN0dXJlRXZlbnQuY3RybEtl
eSgpLCBnZXN0dXJlRXZlbnQuYWx0S2V5KCksIGdlc3R1cmVFdmVudC5tZXRhS2V5KCksIGdlc3R1
cmVFdmVudC50aW1lc3RhbXAoKSk7Ci0gICAgICAgIC8vIGhhbmRsZU1vdXNlTW92ZUV2ZW50KGZh
a2VNb3VzZU1vdmUpOwotICAgICAgICBoYW5kbGVNb3VzZURvd25FdmVudChmYWtlTW91c2VEb3du
KTsKLSAgICAgICAgaGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoZmFrZU1vdXNlVXApOwotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBQbGF0Zm9ybUdlc3R1cmVFdmVudDo6U2Ny
b2xsVXBkYXRlVHlwZTogewotICAgICAgICBQbGF0Zm9ybVdoZWVsRXZlbnQgc3ludGhldGljV2hl
ZWxFdmVudChnZXN0dXJlRXZlbnQucG9zaXRpb24oKSwgZ2VzdHVyZUV2ZW50Lmdsb2JhbFBvc2l0
aW9uKCksIGdlc3R1cmVFdmVudC5kZWx0YVgoKSwgZ2VzdHVyZUV2ZW50LmRlbHRhWSgpLCBnZXN0
dXJlRXZlbnQuZGVsdGFYKCkgLyAxMjAuMGYsIGdlc3R1cmVFdmVudC5kZWx0YVkoKSAvIDEyMC4w
ZiwgU2Nyb2xsQnlQaXhlbFdoZWVsRXZlbnQsIC8qIGlzQWNjZXB0ZWQgKi8gZmFsc2UsIGdlc3R1
cmVFdmVudC5zaGlmdEtleSgpLCBnZXN0dXJlRXZlbnQuY3RybEtleSgpLCBnZXN0dXJlRXZlbnQu
YWx0S2V5KCksIGdlc3R1cmVFdmVudC5tZXRhS2V5KCkpOwotICAgICAgICBoYW5kbGVXaGVlbEV2
ZW50KHN5bnRoZXRpY1doZWVsRXZlbnQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0g
ICAgY2FzZSBQbGF0Zm9ybUdlc3R1cmVFdmVudDo6U2Nyb2xsQmVnaW5UeXBlOgotICAgIGNhc2Ug
UGxhdGZvcm1HZXN0dXJlRXZlbnQ6OlNjcm9sbEVuZFR5cGU6Ci0gICAgICAgIGJyZWFrOwotICAg
IH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0jZW5kaWYKLQotYm9vbCBQb3B1cENvbnRhaW5lcjo6
aGFuZGxlS2V5RXZlbnQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50JiBldmVudCkKLXsKLSAg
ICBVc2VyR2VzdHVyZUluZGljYXRvciBnZXN0dXJlSW5kaWNhdG9yKERlZmluaXRlbHlQcm9jZXNz
aW5nVXNlckdlc3R1cmUpOwotICAgIHJldHVybiBtX2xpc3RCb3gtPmhhbmRsZUtleUV2ZW50KGV2
ZW50KTsKLX0KLQotdm9pZCBQb3B1cENvbnRhaW5lcjo6aGlkZSgpCi17Ci0gICAgbV9saXN0Qm94
LT5hYmFuZG9uKCk7Ci19Ci0KLXZvaWQgUG9wdXBDb250YWluZXI6OnBhaW50KEdyYXBoaWNzQ29u
dGV4dCogZ2MsIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgLy8gYWRqdXN0IGNvb3JkcyBm
b3Igc2Nyb2xsZWQgZnJhbWUKLSAgICBJbnRSZWN0IHIgPSBpbnRlcnNlY3Rpb24ocmVjdCwgZnJh
bWVSZWN0KCkpOwotICAgIGludCB0eCA9IHgoKTsKLSAgICBpbnQgdHkgPSB5KCk7Ci0KLSAgICBy
Lm1vdmUoLXR4LCAtdHkpOwotCi0gICAgZ2MtPnRyYW5zbGF0ZShzdGF0aWNfY2FzdDxmbG9hdD4o
dHgpLCBzdGF0aWNfY2FzdDxmbG9hdD4odHkpKTsKLSAgICBtX2xpc3RCb3gtPnBhaW50KGdjLCBy
KTsKLSAgICBnYy0+dHJhbnNsYXRlKC1zdGF0aWNfY2FzdDxmbG9hdD4odHgpLCAtc3RhdGljX2Nh
c3Q8ZmxvYXQ+KHR5KSk7Ci0KLSAgICBwYWludEJvcmRlcihnYywgcmVjdCk7Ci19Ci0KLXZvaWQg
UG9wdXBDb250YWluZXI6OnBhaW50Qm9yZGVyKEdyYXBoaWNzQ29udGV4dCogZ2MsIGNvbnN0IElu
dFJlY3QmIHJlY3QpCi17Ci0gICAgLy8gRklYTUU6IFdoZXJlIGRvIHdlIGdldCB0aGUgYm9yZGVy
IGNvbG9yIGZyb20/Ci0gICAgQ29sb3IgYm9yZGVyQ29sb3IoMTI3LCAxNTcsIDE4NSk7Ci0KLSAg
ICBnYy0+c2V0U3Ryb2tlU3R5bGUoTm9TdHJva2UpOwotICAgIGdjLT5zZXRGaWxsQ29sb3IoYm9y
ZGVyQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwotCi0gICAgaW50IHR4ID0geCgpOwotICAg
IGludCB0eSA9IHkoKTsKLQotICAgIC8vIHRvcCwgbGVmdCwgYm90dG9tLCByaWdodAotICAgIGdj
LT5kcmF3UmVjdChJbnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwga0JvcmRlclNpemUpKTsKLSAgICBn
Yy0+ZHJhd1JlY3QoSW50UmVjdCh0eCwgdHksIGtCb3JkZXJTaXplLCBoZWlnaHQoKSkpOwotICAg
IGdjLT5kcmF3UmVjdChJbnRSZWN0KHR4LCB0eSArIGhlaWdodCgpIC0ga0JvcmRlclNpemUsIHdp
ZHRoKCksIGtCb3JkZXJTaXplKSk7Ci0gICAgZ2MtPmRyYXdSZWN0KEludFJlY3QodHggKyB3aWR0
aCgpIC0ga0JvcmRlclNpemUsIHR5LCBrQm9yZGVyU2l6ZSwgaGVpZ2h0KCkpKTsKLX0KLQotYm9v
bCBQb3B1cENvbnRhaW5lcjo6aXNJbnRlcmVzdGVkSW5FdmVudEZvcktleShpbnQga2V5Q29kZSkK
LXsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5pc0ludGVyZXN0ZWRJbkV2ZW50Rm9yS2V5KGtleUNv
ZGUpOwotfQotCi1DaHJvbWVDbGllbnRDaHJvbWl1bSogUG9wdXBDb250YWluZXI6OmNocm9tZUNs
aWVudENocm9taXVtKCkKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2hyb21lQ2xpZW50Q2hy
b21pdW0qPihtX2ZyYW1lVmlldy0+ZnJhbWUoKS0+cGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCkp
OwotfQotCi12b2lkIFBvcHVwQ29udGFpbmVyOjpzaG93SW5SZWN0KGNvbnN0IEludFJlY3QmIHIs
IEZyYW1lVmlldyogdiwgaW50IGluZGV4KQotewotICAgIC8vIFRoZSByZWN0IGlzIHRoZSBzaXpl
IG9mIHRoZSBzZWxlY3QgYm94LiBJdCdzIHVzdWFsbHkgbGFyZ2VyIHRoYW4gd2UgbmVlZC4KLSAg
ICAvLyBzdWJ0cmFjdCBib3JkZXIgc2l6ZSBzbyB0aGF0IHVzdWFsbHkgdGhlIGNvbnRhaW5lciB3
aWxsIGJlIGRpc3BsYXllZAotICAgIC8vIGV4YWN0bHkgdGhlIHNhbWUgd2lkdGggYXMgdGhlIHNl
bGVjdCBib3guCi0gICAgbGlzdEJveCgpLT5zZXRCYXNlV2lkdGgobWF4KHIud2lkdGgoKSAtIGtC
b3JkZXJTaXplICogMiwgMCkpOwotCi0gICAgbGlzdEJveCgpLT51cGRhdGVGcm9tRWxlbWVudCgp
OwotCi0gICAgLy8gV2Ugc2V0IHRoZSBzZWxlY3RlZCBpdGVtIGluIHVwZGF0ZUZyb21FbGVtZW50
KCksIGFuZCBkaXNyZWdhcmQgdGhlCi0gICAgLy8gaW5kZXggcGFzc2VkIGludG8gdGhpcyBmdW5j
dGlvbiAoc2FtZSBhcyBXZWJraXQncyBQb3B1cE1lbnVXaW4uY3BwKQotICAgIC8vIEZJWE1FOiBt
YWtlIHN1cmUgdGhpcyBpcyBjb3JyZWN0LCBhbmQgYWRkIGFuIGFzc2VydGlvbi4KLSAgICAvLyBB
U1NFUlQocG9wdXBXaW5kb3cocG9wdXApLT5saXN0Qm94KCktPnNlbGVjdGVkSW5kZXgoKSA9PSBp
bmRleCk7Ci0KLSAgICAvLyBDb252ZXJ0IHBvaW50IHRvIG1haW4gd2luZG93IGNvb3Jkcy4KLSAg
ICBJbnRQb2ludCBsb2NhdGlvbiA9IHYtPmNvbnRlbnRzVG9XaW5kb3coci5sb2NhdGlvbigpKTsK
LQotICAgIC8vIE1vdmUgaXQgYmVsb3cgdGhlIHNlbGVjdCB3aWRnZXQuCi0gICAgbG9jYXRpb24u
bW92ZSgwLCByLmhlaWdodCgpKTsKLQotICAgIG1fb3JpZ2luYWxGcmFtZVJlY3QgPSBJbnRSZWN0
KGxvY2F0aW9uLCByLnNpemUoKSk7Ci0gICAgc2V0RnJhbWVSZWN0KG1fb3JpZ2luYWxGcmFtZVJl
Y3QpOwotICAgIHNob3dQb3B1cCh2KTsKLX0KLQotdm9pZCBQb3B1cENvbnRhaW5lcjo6cmVmcmVz
aChjb25zdCBJbnRSZWN0JiB0YXJnZXRDb250cm9sUmVjdCkKLXsKLSAgICBJbnRQb2ludCBsb2Nh
dGlvbiA9IG1fZnJhbWVWaWV3LT5jb250ZW50c1RvV2luZG93KHRhcmdldENvbnRyb2xSZWN0Lmxv
Y2F0aW9uKCkpOwotICAgIC8vIE1vdmUgaXQgYmVsb3cgdGhlIHNlbGVjdCB3aWRnZXQuCi0gICAg
bG9jYXRpb24ubW92ZSgwLCB0YXJnZXRDb250cm9sUmVjdC5oZWlnaHQoKSk7Ci0KLSAgICBsaXN0
Qm94KCktPnNldEJhc2VXaWR0aChtYXgobV9vcmlnaW5hbEZyYW1lUmVjdC53aWR0aCgpIC0ga0Jv
cmRlclNpemUgKiAyLCAwKSk7Ci0gICAgc2V0Qm91bmRzU2l6ZShtX29yaWdpbmFsRnJhbWVSZWN0
LnNpemUoKSk7Ci0KLSAgICBsaXN0Qm94KCktPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgLy8g
U3RvcmUgdGhlIG9yaWdpbmFsIHNpemUgdG8gY2hlY2sgaWYgd2UgbmVlZCB0byByZXF1ZXN0IHRo
ZSBsb2NhdGlvbi4KLSAgICBJbnRTaXplIG9yaWdpbmFsU2l6ZSA9IHNpemUoKTsKLSAgICBJbnRS
ZWN0IHdpZGdldFJlY3QgPSBsYXlvdXRBbmRDYWxjdWxhdGVXaWRnZXRSZWN0KHRhcmdldENvbnRy
b2xSZWN0LmhlaWdodCgpLCBsb2NhdGlvbik7Ci0gICAgaWYgKG9yaWdpbmFsU2l6ZSAhPSB3aWRn
ZXRSZWN0LnNpemUoKSkgewotICAgICAgICBDaHJvbWVDbGllbnRDaHJvbWl1bSogY2hyb21lQ2xp
ZW50ID0gY2hyb21lQ2xpZW50Q2hyb21pdW0oKTsKLSAgICAgICAgaWYgKGNocm9tZUNsaWVudCkg
ewotICAgICAgICAgICAgSW50UG9pbnQgd2lkZ2V0TG9jYXRpb24gPSBjaHJvbWVDbGllbnQtPnNj
cmVlblRvV2luZG93KHdpZGdldFJlY3QubG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB3aWRnZXRS
ZWN0LnNldExvY2F0aW9uKHdpZGdldExvY2F0aW9uKTsKLSAgICAgICAgICAgIHNldEZyYW1lUmVj
dCh3aWRnZXRSZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludmFsaWRhdGUoKTsKLX0K
LQotaW5saW5lIGJvb2wgUG9wdXBDb250YWluZXI6OmlzUlRMKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gbV9saXN0Qm94LT5tX3BvcHVwQ2xpZW50LT5tZW51U3R5bGUoKS50ZXh0RGlyZWN0aW9uKCkg
PT0gUlRMOwotfQotCi1pbnQgUG9wdXBDb250YWluZXI6OnNlbGVjdGVkSW5kZXgoKSBjb25zdAot
ewotICAgIHJldHVybiBtX2xpc3RCb3gtPnNlbGVjdGVkSW5kZXgoKTsKLX0KLQotaW50IFBvcHVw
Q29udGFpbmVyOjptZW51SXRlbUhlaWdodCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fbGlzdEJv
eC0+Z2V0Um93SGVpZ2h0KDApOwotfQotCi1pbnQgUG9wdXBDb250YWluZXI6Om1lbnVJdGVtRm9u
dFNpemUoKSBjb25zdAotewotICAgIHJldHVybiBtX2xpc3RCb3gtPmdldFJvd0ZvbnQoMCkuc2l6
ZSgpOwotfQotCi1Qb3B1cE1lbnVTdHlsZSBQb3B1cENvbnRhaW5lcjo6bWVudVN0eWxlKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5tX3BvcHVwQ2xpZW50LT5tZW51U3R5bGUoKTsK
LX0KLQotY29uc3QgV1RGOjpWZWN0b3I8UG9wdXBJdGVtKj4mIFBvcHVwQ29udGFpbmVyOjogcG9w
dXBEYXRhKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5pdGVtcygpOwotfQotCi1T
dHJpbmcgUG9wdXBDb250YWluZXI6OmdldFNlbGVjdGVkSXRlbVRvb2xUaXAoKQotewotICAgIC8v
IFdlIGNhbm5vdCB1c2UgbV9wb3B1cENsaWVudC0+c2VsZWN0ZWRJbmRleCgpIHRvIGNob29zZSB0
b29sdGlwIG1lc3NhZ2UsCi0gICAgLy8gYmVjYXVzZSB0aGUgc2VsZWN0ZWRJbmRleCgpIG1pZ2h0
IHJldHVybiBmaW5hbCBzZWxlY3RlZCBpbmRleCwgbm90IGhvdmVyaW5nIHNlbGVjdGlvbi4KLSAg
ICByZXR1cm4gbGlzdEJveCgpLT5tX3BvcHVwQ2xpZW50LT5pdGVtVG9vbFRpcChsaXN0Qm94KCkt
Pm1fc2VsZWN0ZWRJbmRleCk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFBvcHVw
TGlzdEJveCBpbXBsZW1lbnRhdGlvbgotCi1ib29sIFBvcHVwTGlzdEJveDo6aGFuZGxlTW91c2VE
b3duRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKLXsKLSAgICBTY3JvbGxi
YXIqIHNjcm9sbGJhciA9IHNjcm9sbGJhckF0UG9pbnQoZXZlbnQucG9zKCkpOwotICAgIGlmIChz
Y3JvbGxiYXIpIHsKLSAgICAgICAgbV9jYXB0dXJpbmdTY3JvbGxiYXIgPSBzY3JvbGxiYXI7Ci0g
ICAgICAgIG1fY2FwdHVyaW5nU2Nyb2xsYmFyLT5tb3VzZURvd24oZXZlbnQpOwotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzUG9pbnRJbkJvdW5kcyhldmVudC5wb3Mo
KSkpCi0gICAgICAgIGFiYW5kb24oKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBv
cHVwTGlzdEJveDo6aGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50
JiBldmVudCkKLXsKLSAgICBpZiAobV9jYXB0dXJpbmdTY3JvbGxiYXIpIHsKLSAgICAgICAgbV9j
YXB0dXJpbmdTY3JvbGxiYXItPm1vdXNlTW92ZWQoZXZlbnQpOwotICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICB9Ci0KLSAgICBTY3JvbGxiYXIqIHNjcm9sbGJhciA9IHNjcm9sbGJhckF0UG9pbnQo
ZXZlbnQucG9zKCkpOwotICAgIGlmIChtX2xhc3RTY3JvbGxiYXJVbmRlck1vdXNlICE9IHNjcm9s
bGJhcikgewotICAgICAgICAvLyBTZW5kIG1vdXNlIGV4aXRlZCB0byB0aGUgb2xkIHNjcm9sbGJh
ci4KLSAgICAgICAgaWYgKG1fbGFzdFNjcm9sbGJhclVuZGVyTW91c2UpCi0gICAgICAgICAgICBt
X2xhc3RTY3JvbGxiYXJVbmRlck1vdXNlLT5tb3VzZUV4aXRlZCgpOwotICAgICAgICBtX2xhc3RT
Y3JvbGxiYXJVbmRlck1vdXNlID0gc2Nyb2xsYmFyOwotICAgIH0KLQotICAgIGlmIChzY3JvbGxi
YXIpIHsKLSAgICAgICAgc2Nyb2xsYmFyLT5tb3VzZU1vdmVkKGV2ZW50KTsKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFpc1BvaW50SW5Cb3VuZHMoZXZlbnQucG9zKCkp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBzZWxlY3RJbmRleChwb2ludFRvUm93SW5k
ZXgoZXZlbnQucG9zKCkpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQb3B1cExpc3RC
b3g6OmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZl
bnQpCi17Ci0gICAgaWYgKG1fY2FwdHVyaW5nU2Nyb2xsYmFyKSB7Ci0gICAgICAgIG1fY2FwdHVy
aW5nU2Nyb2xsYmFyLT5tb3VzZVVwKCk7Ci0gICAgICAgIG1fY2FwdHVyaW5nU2Nyb2xsYmFyID0g
MDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFpc1BvaW50SW5Cb3Vu
ZHMoZXZlbnQucG9zKCkpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIE5lZWQgdG8g
Y2hlY2sgYmVmb3JlIGNhbGxpbmcgYWNjZXB0SW5kZXgoKSwgYmVjYXVzZSBtX3BvcHVwQ2xpZW50
IG1pZ2h0IGJlIHJlbW92ZWQgaW4gYWNjZXB0SW5kZXgoKSBjYWxsaW5nIGJlY2F1c2Ugb2YgZXZl
bnQgaGFuZGxlci4KLSAgICBib29sIGlzU2VsZWN0UG9wdXAgPSBtX3BvcHVwQ2xpZW50LT5tZW51
U3R5bGUoKS5tZW51VHlwZSgpID09IFBvcHVwTWVudVN0eWxlOjpTZWxlY3RQb3B1cDsKLSAgICBp
ZiAoYWNjZXB0SW5kZXgocG9pbnRUb1Jvd0luZGV4KGV2ZW50LnBvcygpKSkgJiYgbV9mb2N1c2Vk
Tm9kZSAmJiBpc1NlbGVjdFBvcHVwKSB7Ci0gICAgICAgIG1fZm9jdXNlZE5vZGUtPmRpc3BhdGNo
TW91c2VFdmVudChldmVudCwgZXZlbnROYW1lcygpLm1vdXNldXBFdmVudCk7Ci0gICAgICAgIG1f
Zm9jdXNlZE5vZGUtPmRpc3BhdGNoTW91c2VFdmVudChldmVudCwgZXZlbnROYW1lcygpLmNsaWNr
RXZlbnQpOwotCi0gICAgICAgIC8vIENsZWFyIG1fZm9jdXNlZE5vZGUgaGVyZSwgYmVjYXVzZSB3
ZSBjYW5ub3QgY2xlYXIgaW4gaGlkZVBvcHVwKCkgd2hpY2ggaXMgY2FsbGVkIGJlZm9yZSBkaXNw
YXRjaE1vdXNlRXZlbnQoKSBpcyBjYWxsZWQuCi0gICAgICAgIG1fZm9jdXNlZE5vZGUgPSAwOwot
ICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBvcHVwTGlzdEJveDo6aGFuZGxl
V2hlZWxFdmVudChjb25zdCBQbGF0Zm9ybVdoZWVsRXZlbnQmIGV2ZW50KQotewotICAgIGlmICgh
aXNQb2ludEluQm91bmRzKGV2ZW50LnBvcygpKSkgewotICAgICAgICBhYmFuZG9uKCk7Ci0gICAg
ICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIFBhc3MgaXQgb2ZmIHRvIHRoZSBzY3Jv
bGwgdmlldy4KLSAgICAvLyBTYWRseSwgV2ViQ29yZSBkZXZzIGRvbid0IHVuZGVyc3RhbmQgdGhl
IHdob2xlICJjb25zdCIgdGhpbmcuCi0gICAgd2hlZWxFdmVudChjb25zdF9jYXN0PFBsYXRmb3Jt
V2hlZWxFdmVudCY+KGV2ZW50KSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFNob3VsZCBi
ZSBrZXB0IGluIHN5bmMgd2l0aCBoYW5kbGVLZXlFdmVudCgpLgotYm9vbCBQb3B1cExpc3RCb3g6
OmlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkoaW50IGtleUNvZGUpCi17Ci0gICAgc3dpdGNoIChr
ZXlDb2RlKSB7Ci0gICAgY2FzZSBWS0VZX0VTQ0FQRToKLSAgICBjYXNlIFZLRVlfUkVUVVJOOgot
ICAgIGNhc2UgVktFWV9VUDoKLSAgICBjYXNlIFZLRVlfRE9XTjoKLSAgICBjYXNlIFZLRVlfUFJJ
T1I6Ci0gICAgY2FzZSBWS0VZX05FWFQ6Ci0gICAgY2FzZSBWS0VZX0hPTUU6Ci0gICAgY2FzZSBW
S0VZX0VORDoKLSAgICBjYXNlIFZLRVlfVEFCOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBk
ZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0jaWYgRU5BQkxFKFRP
VUNIX0VWRU5UUykKLWJvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBs
YXRmb3JtVG91Y2hFdmVudCYpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0KLSNp
ZiBFTkFCTEUoR0VTVFVSRV9SRUNPR05JWkVSKQotYm9vbCBQb3B1cExpc3RCb3g6OmhhbmRsZUdl
c3R1cmVFdmVudChjb25zdCBQbGF0Zm9ybUdlc3R1cmVFdmVudCYpCi17Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotI2VuZGlmCi0KLXN0YXRpYyBib29sIGlzQ2hhcmFjdGVyVHlwZUV2ZW50KGNvbnN0
IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYgZXZlbnQpCi17Ci0gICAgLy8gQ2hlY2sgd2hldGhlciB0
aGUgZXZlbnQgaXMgYSBjaGFyYWN0ZXItdHlwZWQgZXZlbnQgb3Igbm90LgotICAgIC8vIFdlIHVz
ZSBSYXdLZXlEb3duL0NoYXIvS2V5VXAgZXZlbnQgc2NoZW1lIG9uIGFsbCBwbGF0Zm9ybXMsCi0g
ICAgLy8gc28gUGxhdGZvcm1LZXlib2FyZEV2ZW50OjpDaGFyIChub3QgUmF3S2V5RG93bikgdHlw
ZSBldmVudAotICAgIC8vIGlzIGNvbnNpZGVyZWQgYXMgY2hhcmFjdGVyIHR5cGUgZXZlbnQuCi0g
ICAgcmV0dXJuIGV2ZW50LnR5cGUoKSA9PSBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6OkNoYXI7Ci19
Ci0KLWJvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVLZXlFdmVudChjb25zdCBQbGF0Zm9ybUtleWJv
YXJkRXZlbnQmIGV2ZW50KQotewotICAgIGlmIChldmVudC50eXBlKCkgPT0gUGxhdGZvcm1LZXli
b2FyZEV2ZW50OjpLZXlVcCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAobnVtSXRl
bXMoKSA9PSAwICYmIGV2ZW50LndpbmRvd3NWaXJ0dWFsS2V5Q29kZSgpICE9IFZLRVlfRVNDQVBF
KQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHN3aXRjaCAoZXZlbnQud2luZG93c1ZpcnR1
YWxLZXlDb2RlKCkpIHsKLSAgICBjYXNlIFZLRVlfRVNDQVBFOgotICAgICAgICBhYmFuZG9uKCk7
ICAvLyBtYXkgZGVsZXRlIHRoaXMKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBWS0VZ
X1JFVFVSTjoKLSAgICAgICAgaWYgKG1fc2VsZWN0ZWRJbmRleCA9PSAtMSkgIHsKLSAgICAgICAg
ICAgIGhpZGVQb3B1cCgpOwotICAgICAgICAgICAgLy8gRG9uJ3QgZWF0IHRoZSBlbnRlciBpZiBu
b3RoaW5nIGlzIHNlbGVjdGVkLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9
Ci0gICAgICAgIGFjY2VwdEluZGV4KG1fc2VsZWN0ZWRJbmRleCk7ICAvLyBtYXkgZGVsZXRlIHRo
aXMKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBWS0VZX1VQOgotICAgIGNhc2UgVktF
WV9ET1dOOgotICAgICAgICAvLyBXZSBoYXZlIHRvIGZvcndhcmQgb25seSBzaGlmdCArIHVwIGNv
bWJpbmF0aW9uIHRvIGZvY3VzZWQgbm9kZSB3aGVuIGF1dG9maWxsIHBvcHVwLgotICAgICAgICAv
LyBCZWNhdXNlIGFsbCBjaGFyYWN0ZXJzIGZyb20gdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2Yg
dGhlIHRleHQgYXJlYSBzaG91bGQgc2VsZWN0ZWQgd2hlbiB5b3UgcHJlc3Mgc2hpZnQgKyB1cCBh
cnJvdy4KLSAgICAgICAgLy8gc2hpZnQgKyBkb3duIHNob3VsZCBiZSB0aGUgc2ltaWxhciB3YXkg
dG8gc2hpZnQgKyB1cC4KLSAgICAgICAgaWYgKGV2ZW50Lm1vZGlmaWVycygpICYmIG1fcG9wdXBD
bGllbnQtPm1lbnVTdHlsZSgpLm1lbnVUeXBlKCkgPT0gUG9wdXBNZW51U3R5bGU6OkF1dG9maWxs
UG9wdXApCi0gICAgICAgICAgICBtX2ZvY3VzZWROb2RlLT5kaXNwYXRjaEtleUV2ZW50KGV2ZW50
KTsKLSAgICAgICAgZWxzZSBpZiAoZXZlbnQud2luZG93c1ZpcnR1YWxLZXlDb2RlKCkgPT0gVktF
WV9VUCkKLSAgICAgICAgICAgIHNlbGVjdFByZXZpb3VzUm93KCk7Ci0gICAgICAgIGVsc2UKLSAg
ICAgICAgICAgIHNlbGVjdE5leHRSb3coKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWS0VZ
X1BSSU9SOgotICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KC1tX3Zpc2libGVSb3dzKTsKLSAg
ICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWS0VZX05FWFQ6Ci0gICAgICAgIGFkanVzdFNlbGVjdGVk
SW5kZXgobV92aXNpYmxlUm93cyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVktFWV9IT01F
OgotICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KC1tX3NlbGVjdGVkSW5kZXgpOwotICAgICAg
ICBicmVhazsKLSAgICBjYXNlIFZLRVlfRU5EOgotICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4
KG1faXRlbXMuc2l6ZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAg
aWYgKCFldmVudC5jdHJsS2V5KCkgJiYgIWV2ZW50LmFsdEtleSgpICYmICFldmVudC5tZXRhS2V5
KCkKLSAgICAgICAgICAgICYmIGlzUHJpbnRhYmxlQ2hhcihldmVudC53aW5kb3dzVmlydHVhbEtl
eUNvZGUoKSkKLSAgICAgICAgICAgICYmIGlzQ2hhcmFjdGVyVHlwZUV2ZW50KGV2ZW50KSkKLSAg
ICAgICAgICAgIHR5cGVBaGVhZEZpbmQoZXZlbnQpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0K
LSAgICBpZiAobV9vcmlnaW5hbEluZGV4ICE9IG1fc2VsZWN0ZWRJbmRleCkgewotICAgICAgICAv
LyBLZXlib2FyZCBldmVudHMgc2hvdWxkIHVwZGF0ZSB0aGUgc2VsZWN0aW9uIGltbWVkaWF0ZWx5
IChidXQgd2UgZG9uJ3QKLSAgICAgICAgLy8gd2FudCB0byBmaXJlIHRoZSBvbmNoYW5nZSBldmVu
dCB1bnRpbCB0aGUgcG9wdXAgaXMgY2xvc2VkLCB0byBtYXRjaAotICAgICAgICAvLyBJRSkuICBX
ZSBjaGFuZ2UgdGhlIG9yaWdpbmFsIGluZGV4IHNvIHdlIHJldmVydCB0byB0aGF0IHdoZW4gdGhl
Ci0gICAgICAgIC8vIHBvcHVwIGlzIGNsb3NlZC4KLSAgICAgICAgaWYgKG1fc2V0dGluZ3MuYWNj
ZXB0T25BYmFuZG9uKQotICAgICAgICAgICAgbV9hY2NlcHRlZEluZGV4T25BYmFuZG9uID0gbV9z
ZWxlY3RlZEluZGV4OwotCi0gICAgICAgIHNldE9yaWdpbmFsSW5kZXgobV9zZWxlY3RlZEluZGV4
KTsKLSAgICAgICAgaWYgKG1fc2V0dGluZ3Muc2V0VGV4dE9uSW5kZXhDaGFuZ2UpCi0gICAgICAg
ICAgICBtX3BvcHVwQ2xpZW50LT5zZXRUZXh0RnJvbUl0ZW0obV9zZWxlY3RlZEluZGV4KTsKLSAg
ICB9Ci0gICAgaWYgKGV2ZW50LndpbmRvd3NWaXJ0dWFsS2V5Q29kZSgpID09IFZLRVlfVEFCKSB7
Ci0gICAgICAgIC8vIFRBQiBpcyBhIHNwZWNpYWwgY2FzZSBhcyBpdCBzaG91bGQgc2VsZWN0IHRo
ZSBjdXJyZW50IGl0ZW0gaWYgYW55IGFuZAotICAgICAgICAvLyBhZHZhbmNlIGZvY3VzLgotICAg
ICAgICBpZiAobV9zZWxlY3RlZEluZGV4ID49IDApIHsKLSAgICAgICAgICAgIGFjY2VwdEluZGV4
KG1fc2VsZWN0ZWRJbmRleCk7IC8vIE1heSBkZWxldGUgdXMuCi0gICAgICAgICAgICAvLyBSZXR1
cm4gZmFsc2Ugc28gdGhlIFRBQiBrZXkgZXZlbnQgaXMgcHJvcGFnYXRlZCB0byB0aGUgcGFnZS4K
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBDYWxsIGFi
YW5kb24oKSBzbyB3ZSBob25vciBtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gaWYgc2V0LgotICAg
ICAgICBhYmFuZG9uKCk7Ci0gICAgICAgIC8vIFJldHVybiBmYWxzZSBzbyB0aGUgVEFCIGtleSBl
dmVudCBpcyBwcm9wYWdhdGVkIHRvIHRoZSBwYWdlLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUhvc3RXaW5kb3cqIFBvcHVwTGlzdEJveDo6
aG9zdFdpbmRvdygpIGNvbnN0Ci17Ci0gICAgLy8gT3VyIHBhcmVudCBpcyB0aGUgcm9vdCBTY3Jv
bGxWaWV3LCBzbyBpdCBpcyB0aGUgb25lIHRoYXQgaGFzIGEKLSAgICAvLyBIb3N0V2luZG93LiAg
RnJhbWVWaWV3Ojpob3N0V2luZG93KCkgd29ya3Mgc2ltaWxhcmx5LgotICAgIHJldHVybiBwYXJl
bnQoKSA/IHBhcmVudCgpLT5ob3N0V2luZG93KCkgOiAwOwotfQotCi0vLyBGcm9tIEhUTUxTZWxl
Y3RFbGVtZW50LmNwcAotc3RhdGljIFN0cmluZyBzdHJpcExlYWRpbmdXaGl0ZVNwYWNlKGNvbnN0
IFN0cmluZyYgc3RyaW5nKQotewotICAgIGludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0g
ICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKQotICAgICAgICBpZiAo
c3RyaW5nW2ldICE9IG5vQnJlYWtTcGFjZQotICAgICAgICAgICAgJiYgKHN0cmluZ1tpXSA8PSAw
eDdGID8gIWlzc3BhY2Uoc3RyaW5nW2ldKSA6IChkaXJlY3Rpb24oc3RyaW5nW2ldKSAhPSBXaGl0
ZVNwYWNlTmV1dHJhbCkpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICByZXR1cm4gc3RyaW5n
LnN1YnN0cmluZyhpLCBsZW5ndGggLSBpKTsKLX0KLQotLy8gRnJvbSBIVE1MU2VsZWN0RWxlbWVu
dC5jcHAsIHdpdGggbW9kaWZpY2F0aW9ucwotdm9pZCBQb3B1cExpc3RCb3g6OnR5cGVBaGVhZEZp
bmQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50JiBldmVudCkKLXsKLSAgICBUaW1lU3RhbXAg
bm93ID0gc3RhdGljX2Nhc3Q8VGltZVN0YW1wPihjdXJyZW50VGltZSgpICogMTAwMC4wZik7Ci0g
ICAgVGltZVN0YW1wIGRlbHRhID0gbm93IC0gbV9sYXN0Q2hhclRpbWU7Ci0KLSAgICAvLyBSZXNl
dCB0aGUgdGltZSB3aGVuIHVzZXIgdHlwZXMgaW4gYSBjaGFyYWN0ZXIuIFRoZSB0aW1lIGdhcCBi
ZXR3ZWVuCi0gICAgLy8gbGFzdCBjaGFyYWN0ZXIgYW5kIHRoZSBjdXJyZW50IGNoYXJhY3RlciBp
cyB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIKLSAgICAvLyB1c2VyIHR5cGVkIGluIGEgc3RyaW5n
IG9yIGp1c3QgYSBjaGFyYWN0ZXIgYXMgdGhlIHNlYXJjaCBwcmVmaXguCi0gICAgbV9sYXN0Q2hh
clRpbWUgPSBub3c7Ci0KLSAgICBVQ2hhciBjID0gZXZlbnQud2luZG93c1ZpcnR1YWxLZXlDb2Rl
KCk7Ci0KLSAgICBTdHJpbmcgcHJlZml4OwotICAgIGludCBzZWFyY2hTdGFydE9mZnNldCA9IDE7
Ci0gICAgaWYgKGRlbHRhID4ga1R5cGVBaGVhZFRpbWVvdXRNcykgewotICAgICAgICBtX3R5cGVk
U3RyaW5nID0gcHJlZml4ID0gU3RyaW5nKCZjLCAxKTsKLSAgICAgICAgbV9yZXBlYXRpbmdDaGFy
ID0gYzsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3R5cGVkU3RyaW5nLmFwcGVuZChjKTsKLQot
ICAgICAgICBpZiAoYyA9PSBtX3JlcGVhdGluZ0NoYXIpCi0gICAgICAgICAgICAvLyBUaGUgdXNl
ciBpcyBsaWtlbHkgdHJ5aW5nIHRvIGN5Y2xlIHRocm91Z2ggYWxsIHRoZSBpdGVtcyBzdGFydGlu
ZyB3aXRoIHRoaXMgY2hhcmFjdGVyLCBzbyBqdXN0IHNlYXJjaCBvbiB0aGUgY2hhcmFjdGVyCi0g
ICAgICAgICAgICBwcmVmaXggPSBTdHJpbmcoJmMsIDEpOwotICAgICAgICBlbHNlIHsKLSAgICAg
ICAgICAgIG1fcmVwZWF0aW5nQ2hhciA9IDA7Ci0gICAgICAgICAgICBwcmVmaXggPSBtX3R5cGVk
U3RyaW5nOwotICAgICAgICAgICAgc2VhcmNoU3RhcnRPZmZzZXQgPSAwOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgLy8gQ29tcHV0ZSBhIGNhc2UtZm9sZGVkIGNvcHkgb2YgdGhlIHByZWZpeCBz
dHJpbmcgYmVmb3JlIGJlZ2lubmluZyB0aGUgc2VhcmNoIGZvcgotICAgIC8vIGEgbWF0Y2hpbmcg
ZWxlbWVudC4gVGhpcyBjb2RlIHVzZXMgZm9sZENhc2UgdG8gd29yayBhcm91bmQgdGhlIGZhY3Qg
dGhhdAotICAgIC8vIFN0cmluZzo6c3RhcnRXaXRoIGRvZXMgbm90IGZvbGQgbm9uLUFTQ0lJIGNo
YXJhY3RlcnMuIFRoaXMgY29kZSBjYW4gYmUgY2hhbmdlZAotICAgIC8vIHRvIHVzZSBzdGFydFdp
dGggb25jZSB0aGF0IGlzIGZpeGVkLgotICAgIFN0cmluZyBwcmVmaXhXaXRoQ2FzZUZvbGRlZChw
cmVmaXguZm9sZENhc2UoKSk7Ci0gICAgaW50IGl0ZW1Db3VudCA9IG51bUl0ZW1zKCk7Ci0gICAg
aW50IGluZGV4ID0gKG1heCgwLCBtX3NlbGVjdGVkSW5kZXgpICsgc2VhcmNoU3RhcnRPZmZzZXQp
ICUgaXRlbUNvdW50OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyssIGlu
ZGV4ID0gKGluZGV4ICsgMSkgJSBpdGVtQ291bnQpIHsKLSAgICAgICAgaWYgKCFpc1NlbGVjdGFi
bGVJdGVtKGluZGV4KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGlmIChzdHJp
cExlYWRpbmdXaGl0ZVNwYWNlKG1faXRlbXNbaW5kZXhdLT5sYWJlbCkuZm9sZENhc2UoKS5zdGFy
dHNXaXRoKHByZWZpeFdpdGhDYXNlRm9sZGVkKSkgewotICAgICAgICAgICAgc2VsZWN0SW5kZXgo
aW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lk
IFBvcHVwTGlzdEJveDo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiBnYywgY29uc3QgSW50UmVjdCYg
cmVjdCkKLXsKLSAgICAvLyBhZGp1c3QgY29vcmRzIGZvciBzY3JvbGxlZCBmcmFtZQotICAgIElu
dFJlY3QgciA9IGludGVyc2VjdGlvbihyZWN0LCBmcmFtZVJlY3QoKSk7Ci0gICAgaW50IHR4ID0g
eCgpIC0gc2Nyb2xsWCgpOwotICAgIGludCB0eSA9IHkoKSAtIHNjcm9sbFkoKTsKLQotICAgIHIu
bW92ZSgtdHgsIC10eSk7Ci0KLSAgICAvLyBzZXQgY2xpcCByZWN0IHRvIG1hdGNoIHJldmlzZWQg
ZGFtYWdlIHJlY3QKLSAgICBnYy0+c2F2ZSgpOwotICAgIGdjLT50cmFuc2xhdGUoc3RhdGljX2Nh
c3Q8ZmxvYXQ+KHR4KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR5KSk7Ci0gICAgZ2MtPmNsaXAocik7
Ci0KLSAgICAvLyBGSVhNRTogQ2FuIHdlIG9wdGltaXplIHNjcm9sbGluZyB0byBub3QgcmVxdWly
ZSByZXBhaW50aW5nIHRoZSBlbnRpcmUKLSAgICAvLyB3aW5kb3c/ICBTaG91bGQgd2U/Ci0gICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVtcygpOyArK2kpCi0gICAgICAgIHBhaW50Um93KGdj
LCByLCBpKTsKLQotICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYW4gZW1wdHkgcG9wdXAuCi0gICAg
aWYgKG51bUl0ZW1zKCkgPT0gMCkKLSAgICAgICAgZ2MtPmZpbGxSZWN0KHIsIENvbG9yOjp3aGl0
ZSwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0KLSAgICBnYy0+cmVzdG9yZSgpOwotCi0gICAgU2Ny
b2xsVmlldzo6cGFpbnQoZ2MsIHJlY3QpOwotfQotCi1zdGF0aWMgY29uc3QgaW50IHNlcGFyYXRv
clBhZGRpbmcgPSA0Owotc3RhdGljIGNvbnN0IGludCBzZXBhcmF0b3JIZWlnaHQgPSAxOwotCi12
b2lkIFBvcHVwTGlzdEJveDo6cGFpbnRSb3coR3JhcGhpY3NDb250ZXh0KiBnYywgY29uc3QgSW50
UmVjdCYgcmVjdCwgaW50IHJvd0luZGV4KQotewotICAgIC8vIFRoaXMgY29kZSBpcyBiYXNlZCBs
YXJnZWx5IG9uIFJlbmRlckxpc3RCb3g6OnBhaW50KiBtZXRob2RzLgotCi0gICAgSW50UmVjdCBy
b3dSZWN0ID0gZ2V0Um93Qm91bmRzKHJvd0luZGV4KTsKLSAgICBpZiAoIXJvd1JlY3QuaW50ZXJz
ZWN0cyhyZWN0KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUG9wdXBNZW51U3R5bGUgc3R5bGUg
PSBtX3BvcHVwQ2xpZW50LT5pdGVtU3R5bGUocm93SW5kZXgpOwotCi0gICAgLy8gUGFpbnQgYmFj
a2dyb3VuZAotICAgIENvbG9yIGJhY2tDb2xvciwgdGV4dENvbG9yLCBsYWJlbENvbG9yOwotICAg
IGlmIChyb3dJbmRleCA9PSBtX3NlbGVjdGVkSW5kZXgpIHsKLSAgICAgICAgYmFja0NvbG9yID0g
UmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dy
b3VuZENvbG9yKCk7Ci0gICAgICAgIHRleHRDb2xvciA9IFJlbmRlclRoZW1lOjpkZWZhdWx0VGhl
bWUoKS0+YWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpOwotICAgICAgICBs
YWJlbENvbG9yID0gdGV4dENvbG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJhY2tDb2xvciA9
IHN0eWxlLmJhY2tncm91bmRDb2xvcigpOwotICAgICAgICB0ZXh0Q29sb3IgPSBzdHlsZS5mb3Jl
Z3JvdW5kQ29sb3IoKTsKLSAgICAgICAgLy8gRklYTUU6IGZvciBub3cgdGhlIGxhYmVsIGNvbG9y
IGlzIGhhcmQtY29kZWQuIEl0IHNob3VsZCBiZSBhZGRlZCB0bwotICAgICAgICAvLyB0aGUgUG9w
dXBNZW51U3R5bGUuCi0gICAgICAgIGxhYmVsQ29sb3IgPSBDb2xvcigxMTUsIDExNSwgMTE1KTsK
LSAgICB9Ci0KLSAgICAvLyBJZiB3ZSBoYXZlIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCwgbWFr
ZSBzdXJlIGl0IGhhcyBhIGNvbG9yIHRvIGJsZW5kCi0gICAgLy8gYWdhaW5zdC4KLSAgICBpZiAo
YmFja0NvbG9yLmhhc0FscGhhKCkpCi0gICAgICAgIGdjLT5maWxsUmVjdChyb3dSZWN0LCBDb2xv
cjo6d2hpdGUsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwotCi0gICAgZ2MtPmZpbGxSZWN0KHJvd1Jl
Y3QsIGJhY2tDb2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0KLSAgICAvLyBJdCBkb2Vzbid0
IGxvb2sgZ29vZCBidXQgQXV0b2ZpbGwgcmVxdWlyZXMgc3BlY2lhbCBzdHlsZSBmb3Igc2VwYXJh
dG9yLgotICAgIC8vIEF1dG9maWxsIGRvZXNuJ3QgaGF2ZSBwYWRkaW5nIGFuZCAjZGNkY2RjIGNv
bG9yLgotICAgIGlmIChtX3BvcHVwQ2xpZW50LT5pdGVtSXNTZXBhcmF0b3Iocm93SW5kZXgpKSB7
Ci0gICAgICAgIGludCBwYWRkaW5nID0gc3R5bGUubWVudVR5cGUoKSA9PSBQb3B1cE1lbnVTdHls
ZTo6QXV0b2ZpbGxQb3B1cCA/IDAgOiBzZXBhcmF0b3JQYWRkaW5nOwotICAgICAgICBJbnRSZWN0
IHNlcGFyYXRvclJlY3QoCi0gICAgICAgICAgICByb3dSZWN0LngoKSArIHBhZGRpbmcsCi0gICAg
ICAgICAgICByb3dSZWN0LnkoKSArIChyb3dSZWN0LmhlaWdodCgpIC0gc2VwYXJhdG9ySGVpZ2h0
KSAvIDIsCi0gICAgICAgICAgICByb3dSZWN0LndpZHRoKCkgLSAyICogcGFkZGluZywgc2VwYXJh
dG9ySGVpZ2h0KTsKLSAgICAgICAgZ2MtPmZpbGxSZWN0KHNlcGFyYXRvclJlY3QsIHN0eWxlLm1l
bnVUeXBlKCkgPT0gUG9wdXBNZW51U3R5bGU6OkF1dG9maWxsUG9wdXAgPyBDb2xvcigweGRjLCAw
eGRjLCAweGRjKSA6IHRleHRDb2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIXN0eWxlLmlzVmlzaWJsZSgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBnYy0+c2V0RmlsbENvbG9yKHRleHRDb2xvciwgQ29sb3JTcGFjZURldmljZVJH
Qik7Ci0KLSAgICBGb250IGl0ZW1Gb250ID0gZ2V0Um93Rm9udChyb3dJbmRleCk7Ci0gICAgLy8g
RklYTUU6IGh0dHA6Ly9jcmJ1Zy5jb20vMTk4NzIgV2Ugc2hvdWxkIGdldCB0aGUgcGFkZGluZyBv
ZiBpbmRpdmlkdWFsIG9wdGlvbgotICAgIC8vIGVsZW1lbnRzLiAgVGhpcyBwcm9iYWJseSBpbXBs
aWVzIGNoYW5nZXMgdG8gUG9wdXBNZW51Q2xpZW50LgotICAgIGJvb2wgcmlnaHRBbGlnbmVkID0g
bV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkudGV4dERpcmVjdGlvbigpID09IFJUTDsKLSAgICBp
bnQgdGV4dFggPSAwOwotICAgIGludCBtYXhXaWR0aCA9IDA7Ci0gICAgaWYgKHJpZ2h0QWxpZ25l
ZCkKLSAgICAgICAgbWF4V2lkdGggPSByb3dSZWN0LndpZHRoKCkgLSBtYXgoMCwgbV9wb3B1cENs
aWVudC0+Y2xpZW50UGFkZGluZ1JpZ2h0KCkgLSBtX3BvcHVwQ2xpZW50LT5jbGllbnRJbnNldFJp
Z2h0KCkpOwotICAgIGVsc2UgewotICAgICAgICB0ZXh0WCA9IG1heCgwLCBtX3BvcHVwQ2xpZW50
LT5jbGllbnRQYWRkaW5nTGVmdCgpIC0gbV9wb3B1cENsaWVudC0+Y2xpZW50SW5zZXRMZWZ0KCkp
OwotICAgICAgICBtYXhXaWR0aCA9IHJvd1JlY3Qud2lkdGgoKSAtIHRleHRYOwotICAgIH0KLSAg
ICAvLyBQcmVwYXJlIHRleHQgdG8gYmUgZHJhd24uCi0gICAgU3RyaW5nIGl0ZW1UZXh0ID0gbV9w
b3B1cENsaWVudC0+aXRlbVRleHQocm93SW5kZXgpOwotICAgIFN0cmluZyBpdGVtTGFiZWwgPSBt
X3BvcHVwQ2xpZW50LT5pdGVtTGFiZWwocm93SW5kZXgpOwotICAgIFN0cmluZyBpdGVtSWNvbiA9
IG1fcG9wdXBDbGllbnQtPml0ZW1JY29uKHJvd0luZGV4KTsKLSAgICBpZiAobV9zZXR0aW5ncy5y
ZXN0cmljdFdpZHRoT2ZMaXN0Qm94KSB7IC8vIFRydW5jYXRlIHN0cmluZ3MgdG8gZml0IGluLgot
ICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGxlZnRUcnVuY2F0ZSBmb3IgdGhlIHJ0bCBjYXNl
LgotICAgICAgICAvLyBTdHJpbmdUcnVuY2F0b3I6OmxlZnRUcnVuY2F0ZSB3b3VsZCBoYXZlIHRv
IGJlIGltcGxlbWVudGVkLgotICAgICAgICBTdHJpbmcgc3RyID0gU3RyaW5nVHJ1bmNhdG9yOjpy
aWdodFRydW5jYXRlKGl0ZW1UZXh0LCBtYXhXaWR0aCwgaXRlbUZvbnQpOwotICAgICAgICBpZiAo
c3RyICE9IGl0ZW1UZXh0KSB7Ci0gICAgICAgICAgICBpdGVtVGV4dCA9IHN0cjsKLSAgICAgICAg
ICAgIC8vIERvbid0IGRpc3BsYXkgdGhlIGxhYmVsIG9yIGljb24sIHdlIGFscmVhZHkgZG9uJ3Qg
aGF2ZSBlbm91Z2ggcm9vbSBmb3IgdGhlIGl0ZW0gdGV4dC4KLSAgICAgICAgICAgIGl0ZW1MYWJl
bCA9ICIiOwotICAgICAgICAgICAgaXRlbUljb24gPSAiIjsKLSAgICAgICAgfSBlbHNlIGlmICgh
aXRlbUxhYmVsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaW50IGF2YWlsYWJsZVdpZHRoID0g
bWF4V2lkdGggLSBrVGV4dFRvTGFiZWxQYWRkaW5nIC0KLSAgICAgICAgICAgICAgICBTdHJpbmdU
cnVuY2F0b3I6OndpZHRoKGl0ZW1UZXh0LCBpdGVtRm9udCk7Ci0gICAgICAgICAgICBpdGVtTGFi
ZWwgPSBTdHJpbmdUcnVuY2F0b3I6OnJpZ2h0VHJ1bmNhdGUoaXRlbUxhYmVsLCBhdmFpbGFibGVX
aWR0aCwgaXRlbUZvbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJlcGFyZSB0aGUg
ZGlyZWN0aW9uYWxpdHkgdG8gZHJhdyB0ZXh0LgotICAgIFRleHRSdW4gdGV4dFJ1bihpdGVtVGV4
dC5jaGFyYWN0ZXJzKCksIGl0ZW1UZXh0Lmxlbmd0aCgpLCBmYWxzZSwgMCwgMCwgVGV4dFJ1bjo6
QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgc3R5bGUudGV4dERpcmVjdGlvbigpLCBzdHlsZS5oYXNU
ZXh0RGlyZWN0aW9uT3ZlcnJpZGUoKSk7Ci0gICAgLy8gSWYgdGhlIHRleHQgaXMgcmlnaHQtdG8t
bGVmdCwgbWFrZSBpdCByaWdodC1hbGlnbmVkIGJ5IGFkanVzdGluZyBpdHMKLSAgICAvLyBiZWdp
bm5pbmcgcG9zaXRpb24uCi0gICAgaWYgKHJpZ2h0QWxpZ25lZCkKLSAgICAgICAgdGV4dFggKz0g
bWF4V2lkdGggLSBpdGVtRm9udC53aWR0aCh0ZXh0UnVuKTsKLQotICAgIC8vIERyYXcgdGhlIGl0
ZW0gdGV4dC4KLSAgICBpbnQgdGV4dFkgPSByb3dSZWN0LnkoKSArIGl0ZW1Gb250LmZvbnRNZXRy
aWNzKCkuYXNjZW50KCkgKyAocm93UmVjdC5oZWlnaHQoKSAtIGl0ZW1Gb250LmZvbnRNZXRyaWNz
KCkuaGVpZ2h0KCkpIC8gMjsKLSAgICBnYy0+ZHJhd0JpZGlUZXh0KGl0ZW1Gb250LCB0ZXh0UnVu
LCBJbnRQb2ludCh0ZXh0WCwgdGV4dFkpKTsKLQotICAgIC8vIFdlIGFyZSB1c2luZyB0aGUgbGVm
dCBwYWRkaW5nIGFzIHRoZSByaWdodCBwYWRkaW5nIGluY2x1ZGVzIHJvb20gZm9yIHRoZSBzY3Jv
bGwtYmFyIHdoaWNoCi0gICAgLy8gZG9lcyBub3Qgc2hvdyBpbiB0aGlzIGNhc2UuCi0gICAgaW50
IHJpZ2h0UGFkZGluZyA9IG1heCgwLCBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nTGVmdCgp
IC0gbV9wb3B1cENsaWVudC0+Y2xpZW50SW5zZXRMZWZ0KCkpOwotICAgIGludCByZW1haW5pbmdX
aWR0aCA9IHJvd1JlY3Qud2lkdGgoKSAtIHJpZ2h0UGFkZGluZzsKLQotICAgIC8vIERyYXcgdGhl
IGljb24gaWYgYXBwbGljYWJsZS4KLSAgICBSZWZQdHI8SW1hZ2U+IGltYWdlKEltYWdlOjpsb2Fk
UGxhdGZvcm1SZXNvdXJjZShpdGVtSWNvbi51dGY4KCkuZGF0YSgpKSk7Ci0gICAgaWYgKGltYWdl
ICYmICFpbWFnZS0+aXNOdWxsKCkpIHsKLSAgICAgICAgSW50UmVjdCBpbWFnZVJlY3QgPSBpbWFn
ZS0+cmVjdCgpOwotICAgICAgICByZW1haW5pbmdXaWR0aCAtPSAoaW1hZ2VSZWN0LndpZHRoKCkg
KyBrTGFiZWxUb0ljb25QYWRkaW5nKTsKLSAgICAgICAgaW1hZ2VSZWN0LnNldFgocm93UmVjdC53
aWR0aCgpIC0gcmlnaHRQYWRkaW5nIC0gaW1hZ2VSZWN0LndpZHRoKCkpOwotICAgICAgICBpbWFn
ZVJlY3Quc2V0WShyb3dSZWN0LnkoKSArIChyb3dSZWN0LmhlaWdodCgpIC0gaW1hZ2VSZWN0Lmhl
aWdodCgpKSAvIDIpOwotICAgICAgICBnYy0+ZHJhd0ltYWdlKGltYWdlLmdldCgpLCBDb2xvclNw
YWNlRGV2aWNlUkdCLCBpbWFnZVJlY3QpOwotICAgIH0KLQotICAgIC8vIERyYXcgdGhlIHRoZSBs
YWJlbCBpZiBhcHBsaWNhYmxlLgotICAgIGlmIChpdGVtTGFiZWwuaXNFbXB0eSgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICAvLyBBdXRvZmlsbCBsYWJlbCBpcyAwLjkgc21hbGxlciB0aGFuIHJl
Z3VsYXIgZm9udCBzaXplLgotICAgIGlmIChzdHlsZS5tZW51VHlwZSgpID09IFBvcHVwTWVudVN0
eWxlOjpBdXRvZmlsbFBvcHVwKSB7Ci0gICAgICAgIGl0ZW1Gb250ID0gbV9wb3B1cENsaWVudC0+
aXRlbVN0eWxlKHJvd0luZGV4KS5mb250KCk7Ci0gICAgICAgIEZvbnREZXNjcmlwdGlvbiBkID0g
aXRlbUZvbnQuZm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGQuc2V0Q29tcHV0ZWRTaXplKGQu
Y29tcHV0ZWRTaXplKCkgKiAwLjkpOwotICAgICAgICBpdGVtRm9udCA9IEZvbnQoZCwgaXRlbUZv
bnQubGV0dGVyU3BhY2luZygpLCBpdGVtRm9udC53b3JkU3BhY2luZygpKTsKLSAgICAgICAgaXRl
bUZvbnQudXBkYXRlKDApOwotICAgIH0KLQotICAgIFRleHRSdW4gbGFiZWxUZXh0UnVuKGl0ZW1M
YWJlbC5jaGFyYWN0ZXJzKCksIGl0ZW1MYWJlbC5sZW5ndGgoKSwgZmFsc2UsIDAsIDAsIFRleHRS
dW46OkFsbG93VHJhaWxpbmdFeHBhbnNpb24sIHN0eWxlLnRleHREaXJlY3Rpb24oKSwgc3R5bGUu
aGFzVGV4dERpcmVjdGlvbk92ZXJyaWRlKCkpOwotICAgIGlmIChyaWdodEFsaWduZWQpCi0gICAg
ICAgIHRleHRYID0gbWF4KDAsIG1fcG9wdXBDbGllbnQtPmNsaWVudFBhZGRpbmdMZWZ0KCkgLSBt
X3BvcHVwQ2xpZW50LT5jbGllbnRJbnNldExlZnQoKSk7Ci0gICAgZWxzZQotICAgICAgICB0ZXh0
WCA9IHJlbWFpbmluZ1dpZHRoIC0gaXRlbUZvbnQud2lkdGgobGFiZWxUZXh0UnVuKTsKLQotICAg
IGdjLT5zZXRGaWxsQ29sb3IobGFiZWxDb2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0gICAg
Z2MtPmRyYXdCaWRpVGV4dChpdGVtRm9udCwgbGFiZWxUZXh0UnVuLCBJbnRQb2ludCh0ZXh0WCwg
dGV4dFkpKTsKLX0KLQotRm9udCBQb3B1cExpc3RCb3g6OmdldFJvd0ZvbnQoaW50IHJvd0luZGV4
KQotewotICAgIEZvbnQgaXRlbUZvbnQgPSBtX3BvcHVwQ2xpZW50LT5pdGVtU3R5bGUocm93SW5k
ZXgpLmZvbnQoKTsKLSAgICBpZiAobV9wb3B1cENsaWVudC0+aXRlbUlzTGFiZWwocm93SW5kZXgp
KSB7Ci0gICAgICAgIC8vIEJvbGQtaWZ5IGxhYmVscyAoaWUsIGFuIDxvcHRncm91cD4gaGVhZGlu
ZykuCi0gICAgICAgIEZvbnREZXNjcmlwdGlvbiBkID0gaXRlbUZvbnQuZm9udERlc2NyaXB0aW9u
KCk7Ci0gICAgICAgIGQuc2V0V2VpZ2h0KEZvbnRXZWlnaHRCb2xkKTsKLSAgICAgICAgRm9udCBm
b250KGQsIGl0ZW1Gb250LmxldHRlclNwYWNpbmcoKSwgaXRlbUZvbnQud29yZFNwYWNpbmcoKSk7
Ci0gICAgICAgIGZvbnQudXBkYXRlKDApOwotICAgICAgICByZXR1cm4gZm9udDsKLSAgICB9Ci0K
LSAgICByZXR1cm4gaXRlbUZvbnQ7Ci19Ci0KLXZvaWQgUG9wdXBMaXN0Qm94OjphYmFuZG9uKCkK
LXsKLSAgICBSZWZQdHI8UG9wdXBMaXN0Qm94PiBrZWVwQWxpdmUodGhpcyk7Ci0KLSAgICBtX3Nl
bGVjdGVkSW5kZXggPSBtX29yaWdpbmFsSW5kZXg7Ci0KLSAgICBoaWRlUG9wdXAoKTsKLQotICAg
IGlmIChtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gPj0gMCkgewotICAgICAgICBpZiAobV9wb3B1
cENsaWVudCkKLSAgICAgICAgICAgIG1fcG9wdXBDbGllbnQtPnZhbHVlQ2hhbmdlZChtX2FjY2Vw
dGVkSW5kZXhPbkFiYW5kb24pOwotICAgICAgICBtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gPSAt
MTsKLSAgICB9Ci19Ci0KLWludCBQb3B1cExpc3RCb3g6OnBvaW50VG9Sb3dJbmRleChjb25zdCBJ
bnRQb2ludCYgcG9pbnQpCi17Ci0gICAgaW50IHkgPSBzY3JvbGxZKCkgKyBwb2ludC55KCk7Ci0K
LSAgICAvLyBGSVhNRTogYmluYXJ5IHNlYXJjaCBpZiBwZXJmIG1hdHRlcnMuCi0gICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBudW1JdGVtcygpOyArK2kpIHsKLSAgICAgICAgaWYgKHkgPCBtX2l0ZW1z
W2ldLT55T2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGktMTsKLSAgICB9Ci0KLSAgICAvLyBM
YXN0IGl0ZW0/Ci0gICAgaWYgKHkgPCBjb250ZW50c0hlaWdodCgpKQotICAgICAgICByZXR1cm4g
bV9pdGVtcy5zaXplKCktMTsKLQotICAgIHJldHVybiAtMTsKLX0KLQotYm9vbCBQb3B1cExpc3RC
b3g6OmFjY2VwdEluZGV4KGludCBpbmRleCkKLXsKLSAgICAvLyBDbGVhciBtX2FjY2VwdGVkSW5k
ZXhPbkFiYW5kb24gb25jZSB1c2VyIGFjY2VwdHMgdGhlIHNlbGVjdGVkIGluZGV4LgotICAgIGlm
IChtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gPj0gMCkKLSAgICAgICAgbV9hY2NlcHRlZEluZGV4
T25BYmFuZG9uID0gLTE7Ci0KLSAgICBpZiAoaW5kZXggPj0gbnVtSXRlbXMoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBpZiAobV9wb3B1
cENsaWVudCkgewotICAgICAgICAgICAgLy8gRW50ZXIgcHJlc3NlZCB3aXRoIG5vIHNlbGVjdGlv
biwganVzdCBjbG9zZSB0aGUgcG9wdXAuCi0gICAgICAgICAgICBoaWRlUG9wdXAoKTsKLSAgICAg
ICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGlzU2VsZWN0YWJs
ZUl0ZW0oaW5kZXgpKSB7Ci0gICAgICAgIFJlZlB0cjxQb3B1cExpc3RCb3g+IGtlZXBBbGl2ZSh0
aGlzKTsKLQotICAgICAgICAvLyBIaWRlIG91cnNlbHZlcyBmaXJzdCBzaW5jZSB2YWx1ZUNoYW5n
ZWQgbWF5IGhhdmUgbnVtZXJvdXMgc2lkZS1lZmZlY3RzLgotICAgICAgICBoaWRlUG9wdXAoKTsK
LQotICAgICAgICAvLyBUZWxsIHRoZSA8c2VsZWN0PiBQb3B1cE1lbnVDbGllbnQgd2hhdCBpbmRl
eCB3YXMgc2VsZWN0ZWQuCi0gICAgICAgIG1fcG9wdXBDbGllbnQtPnZhbHVlQ2hhbmdlZChpbmRl
eCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi12b2lkIFBvcHVwTGlzdEJveDo6c2VsZWN0SW5kZXgoaW50IGluZGV4KQotewotICAgIGlm
IChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtSXRlbXMoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgYm9vbCBpc1NlbGVjdGFibGUgPSBpc1NlbGVjdGFibGVJdGVtKGluZGV4KTsKLSAgICBpZiAo
aW5kZXggIT0gbV9zZWxlY3RlZEluZGV4ICYmIGlzU2VsZWN0YWJsZSkgewotICAgICAgICBpbnZh
bGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7Ci0gICAgICAgIG1fc2VsZWN0ZWRJbmRleCA9IGlu
ZGV4OwotICAgICAgICBpbnZhbGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7Ci0KLSAgICAgICAg
c2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24oKTsKLSAgICAgICAgbV9wb3B1cENsaWVudC0+c2VsZWN0
aW9uQ2hhbmdlZChtX3NlbGVjdGVkSW5kZXgpOwotICAgIH0gZWxzZSBpZiAoIWlzU2VsZWN0YWJs
ZSkgewotICAgICAgICBjbGVhclNlbGVjdGlvbigpOwotICAgIH0KLX0KLQotdm9pZCBQb3B1cExp
c3RCb3g6OnNldE9yaWdpbmFsSW5kZXgoaW50IGluZGV4KQotewotICAgIG1fb3JpZ2luYWxJbmRl
eCA9IG1fc2VsZWN0ZWRJbmRleCA9IGluZGV4OwotfQotCi1pbnQgUG9wdXBMaXN0Qm94OjpnZXRS
b3dIZWlnaHQoaW50IGluZGV4KQotewotICAgIGlmIChpbmRleCA8IDApCi0gICAgICAgIHJldHVy
biBQb3B1cE1lbnVDaHJvbWl1bTo6bWluaW11bVJvd0hlaWdodCgpOwotCi0gICAgaWYgKG1fcG9w
dXBDbGllbnQtPml0ZW1TdHlsZShpbmRleCkuaXNEaXNwbGF5Tm9uZSgpKQotICAgICAgICByZXR1
cm4gUG9wdXBNZW51Q2hyb21pdW06Om1pbmltdW1Sb3dIZWlnaHQoKTsKLQotICAgIC8vIFNlcGFy
YXRvciByb3cgaGVpZ2h0IGlzIHRoZSBzYW1lIHNpemUgYXMgaXRzZWxmLgotICAgIGlmIChtX3Bv
cHVwQ2xpZW50LT5pdGVtSXNTZXBhcmF0b3IoaW5kZXgpKQotICAgICAgICByZXR1cm4gbWF4KHNl
cGFyYXRvckhlaWdodCwgUG9wdXBNZW51Q2hyb21pdW06Om1pbmltdW1Sb3dIZWlnaHQoKSk7Ci0K
LSAgICBTdHJpbmcgaWNvbiA9IG1fcG9wdXBDbGllbnQtPml0ZW1JY29uKGluZGV4KTsKLSAgICBS
ZWZQdHI8SW1hZ2U+IGltYWdlKEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShpY29uLnV0Zjgo
KS5kYXRhKCkpKTsKLQotICAgIGludCBmb250SGVpZ2h0ID0gZ2V0Um93Rm9udChpbmRleCkuZm9u
dE1ldHJpY3MoKS5oZWlnaHQoKTsKLSAgICBpbnQgaWNvbkhlaWdodCA9IChpbWFnZSAmJiAhaW1h
Z2UtPmlzTnVsbCgpKSA/IGltYWdlLT5yZWN0KCkuaGVpZ2h0KCkgOiAwOwotCi0gICAgaW50IGxp
bmVQYWRkaW5nSGVpZ2h0ID0gbV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkubWVudVR5cGUoKSA9
PSBQb3B1cE1lbnVTdHlsZTo6QXV0b2ZpbGxQb3B1cCA/IGtMaW5lUGFkZGluZ0hlaWdodCA6IDA7
Ci0gICAgaW50IGNhbGN1bGF0ZWRSb3dIZWlnaHQgPSBtYXgoZm9udEhlaWdodCwgaWNvbkhlaWdo
dCkgKyBsaW5lUGFkZGluZ0hlaWdodCAqIDI7Ci0gICAgcmV0dXJuIG1heChjYWxjdWxhdGVkUm93
SGVpZ2h0LCBQb3B1cE1lbnVDaHJvbWl1bTo6bWluaW11bVJvd0hlaWdodCgpKTsKLX0KLQotSW50
UmVjdCBQb3B1cExpc3RCb3g6OmdldFJvd0JvdW5kcyhpbnQgaW5kZXgpCi17Ci0gICAgaWYgKGlu
ZGV4IDwgMCkKLSAgICAgICAgcmV0dXJuIEludFJlY3QoMCwgMCwgdmlzaWJsZVdpZHRoKCksIGdl
dFJvd0hlaWdodChpbmRleCkpOwotCi0gICAgcmV0dXJuIEludFJlY3QoMCwgbV9pdGVtc1tpbmRl
eF0tPnlPZmZzZXQsIHZpc2libGVXaWR0aCgpLCBnZXRSb3dIZWlnaHQoaW5kZXgpKTsKLX0KLQot
dm9pZCBQb3B1cExpc3RCb3g6OmludmFsaWRhdGVSb3coaW50IGluZGV4KQotewotICAgIGlmIChp
bmRleCA8IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEludmFsaWRhdGUgaW4gdGhlIHdp
bmRvdyBjb250ZW50cywgYXMgRnJhbWVsZXNzU2Nyb2xsVmlldzo6aW52YWxpZGF0ZVJlY3QKLSAg
ICAvLyBwYWludHMgaW4gdGhlIHdpbmRvdyBjb29yZGluYXRlcy4KLSAgICBpbnZhbGlkYXRlUmVj
dChjb250ZW50c1RvV2luZG93KGdldFJvd0JvdW5kcyhpbmRleCkpKTsKLX0KLQotdm9pZCBQb3B1
cExpc3RCb3g6OnNjcm9sbFRvUmV2ZWFsUm93KGludCBpbmRleCkKLXsKLSAgICBpZiAoaW5kZXgg
PCAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBJbnRSZWN0IHJvd1JlY3QgPSBnZXRSb3dCb3Vu
ZHMoaW5kZXgpOwotCi0gICAgaWYgKHJvd1JlY3QueSgpIDwgc2Nyb2xsWSgpKSB7Ci0gICAgICAg
IC8vIFJvdyBpcyBhYm92ZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiwgc2Nyb2xsIHVwLgotICAg
ICAgICBTY3JvbGxWaWV3OjpzZXRTY3JvbGxQb3NpdGlvbihJbnRQb2ludCgwLCByb3dSZWN0Lnko
KSkpOwotICAgIH0gZWxzZSBpZiAocm93UmVjdC5tYXhZKCkgPiBzY3JvbGxZKCkgKyB2aXNpYmxl
SGVpZ2h0KCkpIHsKLSAgICAgICAgLy8gUm93IGlzIGJlbG93IGN1cnJlbnQgc2Nyb2xsIHBvc2l0
aW9uLCBzY3JvbGwgZG93bi4KLSAgICAgICAgU2Nyb2xsVmlldzo6c2V0U2Nyb2xsUG9zaXRpb24o
SW50UG9pbnQoMCwgcm93UmVjdC5tYXhZKCkgLSB2aXNpYmxlSGVpZ2h0KCkpKTsKLSAgICB9Ci19
Ci0KLWJvb2wgUG9wdXBMaXN0Qm94Ojppc1NlbGVjdGFibGVJdGVtKGludCBpbmRleCkKLXsKLSAg
ICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bUl0ZW1zKCkpOwotICAgIHJldHVybiBt
X2l0ZW1zW2luZGV4XS0+dHlwZSA9PSBQb3B1cEl0ZW06OlR5cGVPcHRpb24gJiYgbV9wb3B1cENs
aWVudC0+aXRlbUlzRW5hYmxlZChpbmRleCk7Ci19Ci0KLXZvaWQgUG9wdXBMaXN0Qm94OjpjbGVh
clNlbGVjdGlvbigpCi17Ci0gICAgaWYgKG1fc2VsZWN0ZWRJbmRleCAhPSAtMSkgewotICAgICAg
ICBpbnZhbGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7Ci0gICAgICAgIG1fc2VsZWN0ZWRJbmRl
eCA9IC0xOwotICAgICAgICBtX3BvcHVwQ2xpZW50LT5zZWxlY3Rpb25DbGVhcmVkKCk7Ci0gICAg
fQotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6c2VsZWN0TmV4dFJvdygpCi17Ci0gICAgaWYgKCFt
X3NldHRpbmdzLmxvb3BTZWxlY3Rpb25OYXZpZ2F0aW9uIHx8IG1fc2VsZWN0ZWRJbmRleCAhPSBu
dW1JdGVtcygpIC0gMSkgewotICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KDEpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gV2UgYXJlIG1vdmluZyBwYXN0IHRoZSBsYXN0IGl0
ZW0sIG5vIHJvdyBzaG91bGQgYmUgc2VsZWN0ZWQuCi0gICAgY2xlYXJTZWxlY3Rpb24oKTsKLX0K
LQotdm9pZCBQb3B1cExpc3RCb3g6OnNlbGVjdFByZXZpb3VzUm93KCkKLXsKLSAgICBpZiAoIW1f
c2V0dGluZ3MubG9vcFNlbGVjdGlvbk5hdmlnYXRpb24gfHwgbV9zZWxlY3RlZEluZGV4ID4gMCkg
ewotICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KC0xKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIGlmIChtX3NlbGVjdGVkSW5kZXggPT0gMCkgewotICAgICAgICAvLyBXZSBhcmUg
bW92aW5nIHBhc3QgdGhlIGZpcnN0IGl0ZW0sIGNsZWFyIHRoZSBzZWxlY3Rpb24uCi0gICAgICAg
IGNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBObyBy
b3cgaXMgc2VsZWN0ZWQsIGp1bXAgdG8gdGhlIGxhc3QgaXRlbS4KLSAgICBzZWxlY3RJbmRleChu
dW1JdGVtcygpIC0gMSk7Ci0gICAgc2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24oKTsKLX0KLQotdm9p
ZCBQb3B1cExpc3RCb3g6OmFkanVzdFNlbGVjdGVkSW5kZXgoaW50IGRlbHRhKQotewotICAgIGlu
dCB0YXJnZXRJbmRleCA9IG1fc2VsZWN0ZWRJbmRleCArIGRlbHRhOwotICAgIHRhcmdldEluZGV4
ID0gbWluKG1heCh0YXJnZXRJbmRleCwgMCksIG51bUl0ZW1zKCkgLSAxKTsKLSAgICBpZiAoIWlz
U2VsZWN0YWJsZUl0ZW0odGFyZ2V0SW5kZXgpKSB7Ci0gICAgICAgIC8vIFdlIGRpZG4ndCBsYW5k
IG9uIGFuIG9wdGlvbi4gIFRyeSB0byBmaW5kIG9uZS4KLSAgICAgICAgLy8gV2UgdHJ5IHRvIHNl
bGVjdCB0aGUgY2xvc2VzdCBpbmRleCB0byB0YXJnZXQsIHByaW9yaXRpemluZyBhbnkgaW4KLSAg
ICAgICAgLy8gdGhlIHJhbmdlIFtjdXJyZW50LCB0YXJnZXRdLgotCi0gICAgICAgIGludCBkaXIg
PSBkZWx0YSA+IDAgPyAxIDogLTE7Ci0gICAgICAgIGludCB0ZXN0SW5kZXggPSBtX3NlbGVjdGVk
SW5kZXg7Ci0gICAgICAgIGludCBiZXN0SW5kZXggPSBtX3NlbGVjdGVkSW5kZXg7Ci0gICAgICAg
IGJvb2wgcGFzc2VkVGFyZ2V0ID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlICh0ZXN0SW5kZXggPj0g
MCAmJiB0ZXN0SW5kZXggPCBudW1JdGVtcygpKSB7Ci0gICAgICAgICAgICBpZiAoaXNTZWxlY3Rh
YmxlSXRlbSh0ZXN0SW5kZXgpKQotICAgICAgICAgICAgICAgIGJlc3RJbmRleCA9IHRlc3RJbmRl
eDsKLSAgICAgICAgICAgIGlmICh0ZXN0SW5kZXggPT0gdGFyZ2V0SW5kZXgpCi0gICAgICAgICAg
ICAgICAgcGFzc2VkVGFyZ2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChwYXNzZWRUYXJnZXQg
JiYgYmVzdEluZGV4ICE9IG1fc2VsZWN0ZWRJbmRleCkKLSAgICAgICAgICAgICAgICBicmVhazsK
LQotICAgICAgICAgICAgdGVzdEluZGV4ICs9IGRpcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8v
IFBpY2sgdGhlIGJlc3QgaW5kZXgsIHdoaWNoIG1heSBtZWFuIHdlIGRvbid0IGNoYW5nZS4KLSAg
ICAgICAgdGFyZ2V0SW5kZXggPSBiZXN0SW5kZXg7Ci0gICAgfQotCi0gICAgLy8gU2VsZWN0IHRo
ZSBuZXcgaW5kZXgsIGFuZCBlbnN1cmUgaXRzIHZpc2libGUuICBXZSBkbyB0aGlzIHJlZ2FyZGxl
c3Mgb2YKLSAgICAvLyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlZCB0byBlbnN1cmUga2V5
Ym9hcmQgZXZlbnRzIGFsd2F5cyBicmluZyB0aGUKLSAgICAvLyBzZWxlY3Rpb24gaW50byB2aWV3
LgotICAgIHNlbGVjdEluZGV4KHRhcmdldEluZGV4KTsKLSAgICBzY3JvbGxUb1JldmVhbFNlbGVj
dGlvbigpOwotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6aGlkZVBvcHVwKCkKLXsKLSAgICBpZiAo
cGFyZW50KCkpIHsKLSAgICAgICAgUG9wdXBDb250YWluZXIqIGNvbnRhaW5lciA9IHN0YXRpY19j
YXN0PFBvcHVwQ29udGFpbmVyKj4ocGFyZW50KCkpOwotICAgICAgICBpZiAoY29udGFpbmVyLT5j
bGllbnQoKSkKLSAgICAgICAgICAgIGNvbnRhaW5lci0+Y2xpZW50KCktPnBvcHVwQ2xvc2VkKGNv
bnRhaW5lcik7Ci0gICAgICAgIGNvbnRhaW5lci0+bm90aWZ5UG9wdXBIaWRkZW4oKTsKLSAgICB9
Ci0KLSAgICBpZiAobV9wb3B1cENsaWVudCkKLSAgICAgICAgbV9wb3B1cENsaWVudC0+cG9wdXBE
aWRIaWRlKCk7Ci19Ci0KLXZvaWQgUG9wdXBMaXN0Qm94Ojp1cGRhdGVGcm9tRWxlbWVudCgpCi17
Ci0gICAgY2xlYXIoKTsKLQotICAgIGludCBzaXplID0gbV9wb3B1cENsaWVudC0+bGlzdFNpemUo
KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBQb3B1cEl0
ZW06OlR5cGUgdHlwZTsKLSAgICAgICAgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1Jc1NlcGFyYXRv
cihpKSkKLSAgICAgICAgICAgIHR5cGUgPSBQb3B1cEl0ZW06OlR5cGVTZXBhcmF0b3I7Ci0gICAg
ICAgIGVsc2UgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1Jc0xhYmVsKGkpKQotICAgICAgICAgICAg
dHlwZSA9IFBvcHVwSXRlbTo6VHlwZUdyb3VwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0
eXBlID0gUG9wdXBJdGVtOjpUeXBlT3B0aW9uOwotICAgICAgICBtX2l0ZW1zLmFwcGVuZChuZXcg
UG9wdXBJdGVtKG1fcG9wdXBDbGllbnQtPml0ZW1UZXh0KGkpLCB0eXBlKSk7Ci0gICAgICAgIG1f
aXRlbXNbaV0tPmVuYWJsZWQgPSBpc1NlbGVjdGFibGVJdGVtKGkpOwotICAgICAgICBQb3B1cE1l
bnVTdHlsZSBzdHlsZSA9IG1fcG9wdXBDbGllbnQtPml0ZW1TdHlsZShpKTsKLSAgICAgICAgbV9p
dGVtc1tpXS0+dGV4dERpcmVjdGlvbiA9IHN0eWxlLnRleHREaXJlY3Rpb24oKTsKLSAgICAgICAg
bV9pdGVtc1tpXS0+aGFzVGV4dERpcmVjdGlvbk92ZXJyaWRlID0gc3R5bGUuaGFzVGV4dERpcmVj
dGlvbk92ZXJyaWRlKCk7Ci0gICAgfQotCi0gICAgbV9zZWxlY3RlZEluZGV4ID0gbV9wb3B1cENs
aWVudC0+c2VsZWN0ZWRJbmRleCgpOwotICAgIHNldE9yaWdpbmFsSW5kZXgobV9zZWxlY3RlZElu
ZGV4KTsKLQotICAgIGxheW91dCgpOwotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6c2V0TWF4V2lk
dGhBbmRMYXlvdXQoaW50IG1heFdpZHRoKQotewotICAgIG1fbWF4V2luZG93V2lkdGggPSBtYXhX
aWR0aDsKLSAgICBsYXlvdXQoKTsKLX0KLQotdm9pZCBQb3B1cExpc3RCb3g6OmxheW91dCgpCi17
Ci0gICAgYm9vbCBpc1JpZ2h0QWxpZ25lZCA9IG1fcG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpLnRl
eHREaXJlY3Rpb24oKSA9PSBSVEw7Ci0gICAgCi0gICAgLy8gU2l6ZSBvdXIgY2hpbGQgaXRlbXMu
Ci0gICAgaW50IGJhc2VXaWR0aCA9IDA7Ci0gICAgaW50IHBhZGRpbmdXaWR0aCA9IDA7Ci0gICAg
aW50IGxpbmVFbmRQYWRkaW5nV2lkdGggPSAwOwotICAgIGludCB5ID0gMDsKLSAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IG51bUl0ZW1zKCk7ICsraSkgewotICAgICAgICAvLyBQbGFjZSB0aGUgaXRl
bSB2ZXJ0aWNhbGx5LgotICAgICAgICBtX2l0ZW1zW2ldLT55T2Zmc2V0ID0geTsKLSAgICAgICAg
aWYgKG1fcG9wdXBDbGllbnQtPml0ZW1TdHlsZShpKS5pc0Rpc3BsYXlOb25lKCkpCi0gICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgeSArPSBnZXRSb3dIZWlnaHQoaSk7Ci0KLSAgICAgICAg
Ly8gRW5zdXJlIHRoZSBwb3B1cCBpcyB3aWRlIGVub3VnaCB0byBmaXQgdGhpcyBpdGVtLgotICAg
ICAgICBGb250IGl0ZW1Gb250ID0gZ2V0Um93Rm9udChpKTsKLSAgICAgICAgU3RyaW5nIHRleHQg
PSBtX3BvcHVwQ2xpZW50LT5pdGVtVGV4dChpKTsKLSAgICAgICAgU3RyaW5nIGxhYmVsID0gbV9w
b3B1cENsaWVudC0+aXRlbUxhYmVsKGkpOwotICAgICAgICBTdHJpbmcgaWNvbiA9IG1fcG9wdXBD
bGllbnQtPml0ZW1JY29uKGkpOwotICAgICAgICBSZWZQdHI8SW1hZ2U+IGljb25JbWFnZShJbWFn
ZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoaWNvbi51dGY4KCkuZGF0YSgpKSk7Ci0gICAgICAgIGlu
dCB3aWR0aCA9IDA7Ci0gICAgICAgIGlmICghdGV4dC5pc0VtcHR5KCkpCi0gICAgICAgICAgICB3
aWR0aCA9IGl0ZW1Gb250LndpZHRoKFRleHRSdW4odGV4dCkpOwotICAgICAgICBpZiAoIWxhYmVs
LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKHdpZHRoID4gMCkKLSAgICAgICAgICAgICAg
ICB3aWR0aCArPSBrVGV4dFRvTGFiZWxQYWRkaW5nOwotICAgICAgICAgICAgd2lkdGggKz0gaXRl
bUZvbnQud2lkdGgoVGV4dFJ1bihsYWJlbCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpY29u
SW1hZ2UgJiYgIWljb25JbWFnZS0+aXNOdWxsKCkpIHsKLSAgICAgICAgICAgIGlmICh3aWR0aCA+
IDApCi0gICAgICAgICAgICAgICAgd2lkdGggKz0ga0xhYmVsVG9JY29uUGFkZGluZzsKLSAgICAg
ICAgICAgIHdpZHRoICs9IGljb25JbWFnZS0+cmVjdCgpLndpZHRoKCk7Ci0gICAgICAgIH0KLQot
ICAgICAgICBiYXNlV2lkdGggPSBtYXgoYmFzZVdpZHRoLCB3aWR0aCk7Ci0gICAgICAgIC8vIEZJ
WE1FOiBodHRwOi8vYi8xMjEwNDgxIFdlIHNob3VsZCBnZXQgdGhlIHBhZGRpbmcgb2YgaW5kaXZp
ZHVhbCBvcHRpb24gZWxlbWVudHMuCi0gICAgICAgIHBhZGRpbmdXaWR0aCA9IG1heChwYWRkaW5n
V2lkdGgsCi0gICAgICAgICAgICBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nTGVmdCgpICsg
bV9wb3B1cENsaWVudC0+Y2xpZW50UGFkZGluZ1JpZ2h0KCkpOwotICAgICAgICBsaW5lRW5kUGFk
ZGluZ1dpZHRoID0gbWF4KGxpbmVFbmRQYWRkaW5nV2lkdGgsCi0gICAgICAgICAgICBpc1JpZ2h0
QWxpZ25lZCA/IG1fcG9wdXBDbGllbnQtPmNsaWVudFBhZGRpbmdMZWZ0KCkgOiBtX3BvcHVwQ2xp
ZW50LT5jbGllbnRQYWRkaW5nUmlnaHQoKSk7Ci0gICAgfQotCi0gICAgLy8gQ2FsY3VsYXRlIHNj
cm9sbCBiYXIgd2lkdGguCi0gICAgaW50IHdpbmRvd0hlaWdodCA9IDA7Ci0gICAgbV92aXNpYmxl
Um93cyA9IG1pbihudW1JdGVtcygpLCBrTWF4VmlzaWJsZVJvd3MpOwotCi0gICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBtX3Zpc2libGVSb3dzOyArK2kpIHsKLSAgICAgICAgaW50IHJvd0hlaWdodCA9
IGdldFJvd0hlaWdodChpKTsKLQotICAgICAgICAvLyBPbmx5IGNsaXAgdGhlIHdpbmRvdyBoZWln
aHQgZm9yIG5vbi1NYWMgcGxhdGZvcm1zLgotICAgICAgICBpZiAod2luZG93SGVpZ2h0ICsgcm93
SGVpZ2h0ID4gbV9tYXhIZWlnaHQpIHsKLSAgICAgICAgICAgIG1fdmlzaWJsZVJvd3MgPSBpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICB3aW5kb3dIZWlnaHQgKz0g
cm93SGVpZ2h0OwotICAgIH0KLQotICAgIC8vIFNldCBvdXIgd2lkZ2V0IGFuZCBzY3JvbGxhYmxl
IGNvbnRlbnRzIHNpemVzLgotICAgIGludCBzY3JvbGxiYXJXaWR0aCA9IDA7Ci0gICAgaWYgKG1f
dmlzaWJsZVJvd3MgPCBudW1JdGVtcygpKSB7Ci0gICAgICAgIHNjcm9sbGJhcldpZHRoID0gU2Ny
b2xsYmFyVGhlbWU6Om5hdGl2ZVRoZW1lKCktPnNjcm9sbGJhclRoaWNrbmVzcygpOwotCi0gICAg
ICAgIC8vIFVzZSBrTWluRW5kT2ZMaW5lUGFkZGluZyB3aGVuIHRoZXJlIGlzIGEgc2Nyb2xsYmFy
IHNvIHRoYXQgd2UgdXNlCi0gICAgICAgIC8vIGFzIG11Y2ggYXMgKGxpbmVFbmRQYWRkaW5nV2lk
dGggLSBrTWluRW5kT2ZMaW5lUGFkZGluZykgcGFkZGluZwotICAgICAgICAvLyBzcGFjZSBmb3Ig
c2Nyb2xsYmFyIGFuZCBhbGxvdyB1c2VyIHRvIHVzZSBDU1MgcGFkZGluZyB0byBtYWtlIHRoZQot
ICAgICAgICAvLyBwb3B1cCBsaXN0Ym94IGFsaWduIHdpdGggdGhlIHNlbGVjdCBlbGVtZW50Lgot
ICAgICAgICBwYWRkaW5nV2lkdGggPSBwYWRkaW5nV2lkdGggLSBsaW5lRW5kUGFkZGluZ1dpZHRo
ICsga01pbkVuZE9mTGluZVBhZGRpbmc7Ci0gICAgfQotCi0gICAgaW50IHdpbmRvd1dpZHRoOwot
ICAgIGludCBjb250ZW50V2lkdGg7Ci0gICAgaWYgKG1fc2V0dGluZ3MucmVzdHJpY3RXaWR0aE9m
TGlzdEJveCkgewotICAgICAgICB3aW5kb3dXaWR0aCA9IG1fYmFzZVdpZHRoOwotICAgICAgICBj
b250ZW50V2lkdGggPSBtX2Jhc2VXaWR0aCAtIHNjcm9sbGJhcldpZHRoOwotICAgIH0gZWxzZSB7
Ci0gICAgICAgIHdpbmRvd1dpZHRoID0gYmFzZVdpZHRoICsgc2Nyb2xsYmFyV2lkdGggKyBwYWRk
aW5nV2lkdGg7Ci0gICAgICAgIGlmICh3aW5kb3dXaWR0aCA+IG1fbWF4V2luZG93V2lkdGgpIHsK
LSAgICAgICAgICAgIC8vIHdpbmRvd1dpZHRoIGV4Y2VlZHMgbV9tYXhXaW5kb3dXaWR0aCwgc28g
d2UgaGF2ZSB0byBjbGlwLgotICAgICAgICAgICAgd2luZG93V2lkdGggPSBtX21heFdpbmRvd1dp
ZHRoOwotICAgICAgICAgICAgYmFzZVdpZHRoID0gd2luZG93V2lkdGggLSBzY3JvbGxiYXJXaWR0
aCAtIHBhZGRpbmdXaWR0aDsKLSAgICAgICAgICAgIG1fYmFzZVdpZHRoID0gYmFzZVdpZHRoOwot
ICAgICAgICB9Ci0gICAgICAgIGNvbnRlbnRXaWR0aCA9IHdpbmRvd1dpZHRoIC0gc2Nyb2xsYmFy
V2lkdGg7Ci0KLSAgICAgICAgaWYgKHdpbmRvd1dpZHRoIDwgbV9iYXNlV2lkdGgpIHsKLSAgICAg
ICAgICAgIHdpbmRvd1dpZHRoID0gbV9iYXNlV2lkdGg7Ci0gICAgICAgICAgICBjb250ZW50V2lk
dGggPSBtX2Jhc2VXaWR0aCAtIHNjcm9sbGJhcldpZHRoOwotICAgICAgICB9IGVsc2UKLSAgICAg
ICAgICAgIG1fYmFzZVdpZHRoID0gYmFzZVdpZHRoOwotICAgIH0KLQotICAgIHJlc2l6ZSh3aW5k
b3dXaWR0aCwgd2luZG93SGVpZ2h0KTsKLSAgICBzZXRDb250ZW50c1NpemUoSW50U2l6ZShjb250
ZW50V2lkdGgsIGdldFJvd0JvdW5kcyhudW1JdGVtcygpIC0gMSkubWF4WSgpKSk7Ci0KLSAgICBp
ZiAoaG9zdFdpbmRvdygpKQotICAgICAgICBzY3JvbGxUb1JldmVhbFNlbGVjdGlvbigpOwotCi0g
ICAgaW52YWxpZGF0ZSgpOwotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6Y2xlYXIoKQotewotICAg
IGZvciAoVmVjdG9yPFBvcHVwSXRlbSo+OjppdGVyYXRvciBpdCA9IG1faXRlbXMuYmVnaW4oKTsg
aXQgIT0gbV9pdGVtcy5lbmQoKTsgKytpdCkKLSAgICAgICAgZGVsZXRlICppdDsKLSAgICBtX2l0
ZW1zLmNsZWFyKCk7Ci19Ci0KLWJvb2wgUG9wdXBMaXN0Qm94Ojppc1BvaW50SW5Cb3VuZHMoY29u
c3QgSW50UG9pbnQmIHBvaW50KQotewotICAgIHJldHVybiBudW1JdGVtcygpICE9IDAgJiYgSW50
UmVjdCgwLCAwLCB3aWR0aCgpLCBoZWlnaHQoKSkuY29udGFpbnMocG9pbnQpOwotfQotCi0vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQb3B1cE1lbnVDaHJvbWl1bSBpbXBsZW1lbnRhdGlvbgot
Ly8KLS8vIE5vdGU6IHlvdSBjYW5ub3QgYWRkIG1ldGhvZHMgdG8gdGhpcyBjbGFzcywgc2luY2Ug
aXQgaXMgZGVmaW5lZCBhYm92ZSB0aGUKLS8vICAgICAgIHBvcnRhYmlsaXR5IGxheWVyLiBUbyBh
Y2Nlc3MgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBvbiB0aGUKLS8vICAgICAgIHBvcHVwIHdpZGdl
dHMsIHVzZSB8cG9wdXBXaW5kb3d8IGFib3ZlLgotCiBQb3B1cE1lbnVDaHJvbWl1bTo6UG9wdXBN
ZW51Q2hyb21pdW0oUG9wdXBNZW51Q2xpZW50KiBjbGllbnQpCiAgICAgOiBtX3BvcHVwQ2xpZW50
KGNsaWVudCkKIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVt
L1BvcHVwTWVudUNocm9taXVtLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Q
b3B1cE1lbnVDaHJvbWl1bS5oCmluZGV4IDgyZDg3OWJkZjA1ZTM5NjNkODM4ODJjN2M3YmFjMDll
OTY5OTU0NjcuLmVkZDM1NTI2ZjE3YzNkYzY0ZTUxZmMxZjA3OTZmNDA0ZWM4MTVlNWUgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVt
LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBNZW51Q2hyb21p
dW0uaApAQCAtMzMsMTc2ICszMywxNyBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLSNpbmNs
dWRlICJGcmFtZWxlc3NTY3JvbGxWaWV3LmgiCi0jaW5jbHVkZSAiSW50UmVjdC5oIgotI2luY2x1
ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCiAjaW5jbHVkZSAiUG9wdXBNZW51LmgiCiAjaW5jbHVkZSAi
UG9wdXBNZW51UHJpdmF0ZS5oIgotI2luY2x1ZGUgIlBvcHVwTWVudVN0eWxlLmgiCiAKIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgQ2hyb21lQ2xpZW50Q2hyb21pdW07CiBjbGFzcyBGcmFt
ZVZpZXc7Ci1jbGFzcyBQb3B1cExpc3RCb3g7CitjbGFzcyBJbnRSZWN0OworY2xhc3MgUG9wdXBJ
dGVtOwogY2xhc3MgUG9wdXBNZW51Q2xpZW50OwogCi0vLyBBIGNvbnRhaW5lciBmb3IgdGhlIGRh
dGEgZm9yIGVhY2ggbWVudSBpdGVtIChlLmcuIHJlcHJlc2VudGVkIGJ5IDxvcHRpb24+Ci0vLyBv
ciA8b3B0Z3JvdXA+IGluIGEgPHNlbGVjdD4gd2lkZ2V0KSBhbmQgaXMgdXNlZCBieSBQb3B1cExp
c3RCb3guCi1zdHJ1Y3QgUG9wdXBJdGVtIHsKLSAgICBlbnVtIFR5cGUgewotICAgICAgICBUeXBl
T3B0aW9uLAotICAgICAgICBUeXBlR3JvdXAsCi0gICAgICAgIFR5cGVTZXBhcmF0b3IKLSAgICB9
OwotCi0gICAgUG9wdXBJdGVtKGNvbnN0IFN0cmluZyYgbGFiZWwsIFR5cGUgdHlwZSkKLSAgICAg
ICAgOiBsYWJlbChsYWJlbCkKLSAgICAgICAgLCB0eXBlKHR5cGUpCi0gICAgICAgICwgeU9mZnNl
dCgwKQotICAgIHsKLSAgICB9Ci0gICAgU3RyaW5nIGxhYmVsOwotICAgIFR5cGUgdHlwZTsKLSAg
ICBpbnQgeU9mZnNldDsgLy8geSBvZmZzZXQgb2YgdGhpcyBpdGVtLCByZWxhdGl2ZSB0byB0aGUg
dG9wIG9mIHRoZSBwb3B1cC4KLSAgICBUZXh0RGlyZWN0aW9uIHRleHREaXJlY3Rpb247Ci0gICAg
Ym9vbCBoYXNUZXh0RGlyZWN0aW9uT3ZlcnJpZGU7Ci0gICAgYm9vbCBlbmFibGVkOwotfTsKLQot
Ly8gRklYTUU6IE91ciBGcmFtZWxlc3NTY3JvbGxWaWV3IGNsYXNzZXMgc2hvdWxkIHByb2JhYmx5
IGltcGxlbWVudCBIb3N0V2luZG93IQotCi0vLyBUaGUgUG9wdXBDb250YWluZXIgY2xhc3MgaG9s
ZHMgYSBQb3B1cExpc3RCb3ggKHNlZSBjcHAgZmlsZSkuICBJdHMgc29sZSBwdXJwb3NlIGlzIHRv
IGJlCi0vLyBhYmxlIHRvIGRyYXcgYSBib3JkZXIgYXJvdW5kIGl0cyBjaGlsZC4gIEFsbCBpdHMg
cGFpbnQvZXZlbnQgaGFuZGxpbmcgaXMKLS8vIGp1c3QgZm9yd2FyZGVkIHRvIHRoZSBjaGlsZCBs
aXN0Qm94ICh3aXRoIHRoZSBhcHByb3ByaWF0ZSB0cmFuc2Zvcm1zKS4KLS8vIE5PVEU6IHRoaXMg
Y2xhc3MgaXMgZXhwb3NlZCBzbyBpdCBjYW4gYmUgaW5zdGFudGlhdGVkIGRpcmVjbHkgZm9yIHRo
ZQotLy8gYXV0b2ZpbGwgcG9wdXAuICBXZSBjYW5ub3QgdXNlIHRoZSBQb3B1cCBjbGFzcyBkaXJl
Y3RseSBpbiB0aGF0IGNhc2UgYXMgdGhlCi0vLyBhdXRvZmlsbCBwb3B1cCBzaG91bGQgbm90IGJl
IGZvY3VzZWQgd2hlbiBzaG93biBhbmQgd2Ugd2FudCB0byBmb3J3YXJkIHRoZQotLy8ga2V5IGV2
ZW50cyB0byBpdCAodGhyb3VnaCBoYW5kbGVLZXlFdmVudCkuCi0KLXN0cnVjdCBQb3B1cENvbnRh
aW5lclNldHRpbmdzIHsKLSAgICAvLyBXaGV0aGVyIHRoZSBQb3B1cE1lbnVDbGllbnQgc2hvdWxk
IGJlIHRvbGQgdG8gY2hhbmdlIGl0cyB0ZXh0IHdoZW4gYQotICAgIC8vIG5ldyBpdGVtIGlzIHNl
bGVjdGVkIGJ5IHVzaW5nIHRoZSBhcnJvdyBrZXlzLgotICAgIGJvb2wgc2V0VGV4dE9uSW5kZXhD
aGFuZ2U7Ci0KLSAgICAvLyBXaGV0aGVyIHRoZSBzZWxlY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVk
IHdoZW4gdGhlIHBvcHVwIG1lbnUgaXMKLSAgICAvLyBjbG9zZWQgKHRocm91Z2ggRVNDIGJlaW5n
IHByZXNzZWQgb3IgdGhlIGZvY3VzIGdvaW5nIGF3YXkpLgotICAgIC8vIE5vdGUgdGhhdCB3aGVu
IFRBQiBpcyBwcmVzc2VkLCB0aGUgc2VsZWN0aW9uIGlzIGFsd2F5cyBhY2NlcHRlZAotICAgIC8v
IHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgotICAgIGJvb2wgYWNjZXB0T25BYmFuZG9uOwot
Ci0gICAgLy8gV2hldGhlciB3ZSBzaG91bGQgbW92ZSB0aGUgc2VsZWN0aW9uIHRvIHRoZSBmaXJz
dC9sYXN0IGl0ZW0gd2hlbgotICAgIC8vIHRoZSB1c2VyIHByZXNzZXMgZG93bi91cCBhcnJvdyBr
ZXlzIGFuZCB0aGUgbGFzdC9maXJzdCBpdGVtIGlzCi0gICAgLy8gc2VsZWN0ZWQuCi0gICAgYm9v
bCBsb29wU2VsZWN0aW9uTmF2aWdhdGlvbjsKLQotICAgIC8vIFdoZXRoZXIgd2Ugc2hvdWxkIHJl
c3RyaWN0IHRoZSB3aWR0aCBvZiB0aGUgUG9wdXBMaXN0Qm94IG9yIG5vdC4KLSAgICAvLyBBdXRv
Y29tcGxldGUgcG9wdXBzIGFyZSByZXN0cmljdGVkLCBjb21iby1ib3hlcyAoc2VsZWN0IHRhZ3Mp
IGFyZW4ndC4KLSAgICBib29sIHJlc3RyaWN0V2lkdGhPZkxpc3RCb3g7Ci19OwotCi1jbGFzcyBQ
b3B1cENvbnRhaW5lciA6IHB1YmxpYyBGcmFtZWxlc3NTY3JvbGxWaWV3IHsKLXB1YmxpYzoKLSAg
ICBlbnVtIFBvcHVwVHlwZSB7Ci0gICAgICAgIFNlbGVjdCwgLy8gSFRNTCBzZWxlY3QgcG9wdXAu
Ci0gICAgICAgIFN1Z2dlc3Rpb24sIC8vIEF1dG9jb21wbGV0ZS9hdXRvZmlsbCBwb3B1cC4KLSAg
ICB9OwotCi0gICAgc3RhdGljIFBhc3NSZWZQdHI8UG9wdXBDb250YWluZXI+IGNyZWF0ZShQb3B1
cE1lbnVDbGllbnQqLCBQb3B1cFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJik7Ci0KLSAgICAvLyBX
aGV0aGVyIGEga2V5IGV2ZW50IHNob3VsZCBiZSBzZW50IHRvIHRoaXMgcG9wdXAuCi0gICAgdmly
dHVhbCBib29sIGlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkoaW50IGtleUNvZGUpOwotCi0gICAg
Ly8gRnJhbWVsZXNzU2Nyb2xsVmlldwotICAgIHZpcnR1YWwgdm9pZCBwYWludChHcmFwaGljc0Nv
bnRleHQqLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIGhpZGUoKTsKLSAgICB2
aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VEb3duRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50
Jik7Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3Jt
TW91c2VFdmVudCYpOwotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZVJlbGVhc2VFdmVudChj
b25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlV2hlZWxF
dmVudChjb25zdCBQbGF0Zm9ybVdoZWVsRXZlbnQmKTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxl
S2V5RXZlbnQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50Jik7Ci0jaWYgRU5BQkxFKFRPVUNI
X0VWRU5UUykKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlVG91Y2hFdmVudChjb25zdCBQbGF0Zm9y
bVRvdWNoRXZlbnQmKTsKLSNlbmRpZgotI2lmIEVOQUJMRShHRVNUVVJFX1JFQ09HTklaRVIpCi0g
ICAgdmlydHVhbCBib29sIGhhbmRsZUdlc3R1cmVFdmVudChjb25zdCBQbGF0Zm9ybUdlc3R1cmVF
dmVudCYpOwotI2VuZGlmCi0KLSAgICAvLyBQb3B1cENvbnRhaW5lciBtZXRob2RzCi0KLSAgICAv
LyBTaG93IHRoZSBwb3B1cAotICAgIHZvaWQgc2hvd1BvcHVwKEZyYW1lVmlldyopOwotCi0gICAg
Ly8gU2hvdyB0aGUgcG9wdXAgaW4gdGhlIHNwZWNpZmllZCByZWN0IGZvciB0aGUgc3BlY2lmaWVk
IGZyYW1lLgotICAgIC8vIE5vdGU6IHRoaXMgY29kZSB3YXMgc29tZWhvdyBhcmJpdHJhcmlseSBm
YWN0b3JlZC1vdXQgb2YgdGhlIFBvcHVwIGNsYXNzCi0gICAgLy8gc28gV2ViVmlld0ltcGwgY2Fu
IGNyZWF0ZSBhIFBvcHVwQ29udGFpbmVyLiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvcgotICAgIC8v
IGRpc3BsYXlpbmcgYXV0byBjb21wbGV0ZSBwb3B1cCBtZW51cyBvbiBNYWMgQ2hyb21pdW0sIGFu
ZCBmb3IgYWxsCi0gICAgLy8gcG9wdXBzIG9uIG90aGVyIHBsYXRmb3Jtcy4KLSAgICB2b2lkIHNo
b3dJblJlY3QoY29uc3QgSW50UmVjdCYsIEZyYW1lVmlldyosIGludCBpbmRleCk7Ci0KLSAgICAv
LyBIaWRlcyB0aGUgcG9wdXAuCi0gICAgdm9pZCBoaWRlUG9wdXAoKTsKLQotICAgIC8vIFRoZSBw
b3B1cCB3YXMgaGlkZGVuLgotICAgIHZvaWQgbm90aWZ5UG9wdXBIaWRkZW4oKTsKLQotICAgIC8v
IENvbXB1dGUgc2l6ZSBvZiB3aWRnZXQgYW5kIGNoaWxkcmVuLiBSZXR1cm4gcmlnaHQgb2Zmc2V0
IGZvciB0aGUgcG9wdXAgcmlnaHQgYWxpZ25tZW50LgotICAgIGludCBsYXlvdXRBbmRHZXRSVExP
ZmZzZXQoKTsKLQotICAgIFBvcHVwTGlzdEJveCogbGlzdEJveCgpIGNvbnN0IHsgcmV0dXJuIG1f
bGlzdEJveC5nZXQoKTsgfQotCi0gICAgYm9vbCBpc1JUTCgpIGNvbnN0OwotCi0gICAgLy8gR2V0
cyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdGhhdCB0aGUgdXNlciBpcyBjdXJyZW50bHkgbW91c2Vk
LW92ZXIgb3IKLSAgICAvLyBoYXMgc2VsZWN0ZWQgd2l0aCB0aGUga2V5Ym9hcmQgdXAvZG93biBh
cnJvd3MuCi0gICAgaW50IHNlbGVjdGVkSW5kZXgoKSBjb25zdDsKLQotICAgIC8vIFJlZnJlc2gg
dGhlIHBvcHVwIHZhbHVlcyBmcm9tIHRoZSBQb3B1cE1lbnVDbGllbnQuCi0gICAgdm9pZCByZWZy
ZXNoKGNvbnN0IEludFJlY3QmIHRhcmdldENvbnRyb2xSZWN0KTsKLQotICAgIC8vIFRoZSBtZW51
IHBlci1pdGVtIGRhdGEuCi0gICAgY29uc3QgV1RGOjpWZWN0b3I8UG9wdXBJdGVtKj4mIHBvcHVw
RGF0YSgpIGNvbnN0OwotCi0gICAgLy8gVGhlIGhlaWdodCBvZiBhIHJvdyBpbiB0aGUgbWVudS4K
LSAgICBpbnQgbWVudUl0ZW1IZWlnaHQoKSBjb25zdDsKLQotICAgIC8vIFRoZSBzaXplIG9mIHRo
ZSBmb250IGJlaW5nIHVzZWQuCi0gICAgaW50IG1lbnVJdGVtRm9udFNpemUoKSBjb25zdDsKLQot
ICAgIC8vIFRoZSBzdHlsZSBvZiB0aGUgbWVudSBiZWluZyB1c2VkLgotICAgIFBvcHVwTWVudVN0
eWxlIG1lbnVTdHlsZSgpIGNvbnN0OwotCi0gICAgUG9wdXBUeXBlIHBvcHVwVHlwZSgpIGNvbnN0
IHsgcmV0dXJuIG1fcG9wdXBUeXBlOyB9Ci0KLSAgICAvLyBXaGlsZSBob3ZlcmluZyBwb3B1cCBt
ZW51IHdpbmRvdywgd2Ugd2FudCB0byBzaG93IHRvb2wgdGlwIG1lc3NhZ2UuCi0gICAgU3RyaW5n
IGdldFNlbGVjdGVkSXRlbVRvb2xUaXAoKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3Mg
V1RGOjpSZWZDb3VudGVkPFBvcHVwQ29udGFpbmVyPjsKLQotICAgIFBvcHVwQ29udGFpbmVyKFBv
cHVwTWVudUNsaWVudCosIFBvcHVwVHlwZSwgY29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyYp
OwotICAgIH5Qb3B1cENvbnRhaW5lcigpOwotCi0gICAgLy8gUGFpbnQgdGhlIGJvcmRlci4KLSAg
ICB2b2lkIHBhaW50Qm9yZGVyKEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmKTsKLQot
ICAgIC8vIExheW91dCBhbmQgY2FsY3VsYXRlIHBvcHVwIHdpZGdldCBzaXplIGFuZCBsb2NhdGlv
biBhbmQgcmV0dXJucyBpdCBhcyBJbnRSZWN0LgotICAgIEludFJlY3QgbGF5b3V0QW5kQ2FsY3Vs
YXRlV2lkZ2V0UmVjdChpbnQgdGFyZ2V0Q29udHJvbEhlaWdodCwgY29uc3QgSW50UG9pbnQmIHBv
cHVwSW5pdGlhbENvb3JkaW5hdGUpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgQ2hyb21lQ2xpZW50
IG9mIHRoZSBwYWdlIHRoaXMgcG9wdXAgaXMgYXNzb2NpYXRlZCB3aXRoLgotICAgIENocm9tZUNs
aWVudENocm9taXVtKiBjaHJvbWVDbGllbnRDaHJvbWl1bSgpOwotCi0gICAgUmVmUHRyPFBvcHVw
TGlzdEJveD4gbV9saXN0Qm94OwotICAgIFJlZlB0cjxGcmFtZVZpZXc+IG1fZnJhbWVWaWV3Owot
Ci0gICAgUG9wdXBDb250YWluZXJTZXR0aW5ncyBtX3NldHRpbmdzOwotICAgIFBvcHVwVHlwZSBt
X3BvcHVwVHlwZTsKLSAgICBJbnRSZWN0IG1fb3JpZ2luYWxGcmFtZVJlY3Q7Ci0gICAgLy8gV2hl
dGhlciB0aGUgcG9wdXAgaXMgY3VycmVudGx5IG9wZW4uCi0gICAgYm9vbCBtX3BvcHVwT3BlbjsK
LX07Ci0KIGNsYXNzIFBvcHVwTWVudUNocm9taXVtIDogcHVibGljIFBvcHVwTWVudSB7CiBwdWJs
aWM6CiAgICAgUG9wdXBNZW51Q2hyb21pdW0oUG9wdXBNZW51Q2xpZW50Kik7CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21p
dW0vQ2hhbmdlTG9nCmluZGV4IDkyNzI4MzlhYzBlN2FlNjMwYmM0YmNjOGE0NGMzM2JmOTcxYjFk
ZDEuLjUzOWRhMGVkNTNhYWMwZWQ4NjY4NTIyMjEzMDEyMzAyZWU0YjI2MTUgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTEtMDgtMTAgIEZhZHkgU2FtdWVs
ICA8ZnNhbXVlbEBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmVmYWN0b3Jpbmcgb2YgUG9wdXBN
ZW51Q2hyb21pdW0KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTY2MDA5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgKiBzcmMvQ2hyb21lQ2xpZW50SW1wbC5jcHA6CisgICAgICAgICogc3JjL1dlYlBvcHVwTWVu
dUltcGwuY3BwOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6CisKIDIwMTEtMDgtMTAg
IEFuZHJleSBLb3N5YWtvdiAgPGNhc2VxQGNocm9taXVtLm9yZz4KIAogICAgICAgICBVbnJldmll
d2VkLiBSb2xsZWQgREVQUyA5NTgxMzo5NjAwOSB0byBwaWNrIGRhdGEgdXJsIHRpbWluZyBmaXgu
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBs
LmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0Nocm9tZUNsaWVudEltcGwuY3BwCmlu
ZGV4IGEzZTliMGZkOTNiYjhjMGU2MzZhOWI2YjMxYTNiMTVhNjc4NWNmOGYuLjk2ZDFkMzc0ZjMw
YmQwNTg3YWZmZWNkMTY2YjYxYzA4NjU2MDk3MTQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQv
Y2hyb21pdW0vc3JjL0Nocm9tZUNsaWVudEltcGwuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vc3JjL0Nocm9tZUNsaWVudEltcGwuY3BwCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVk
ZSAiTm90aWZpY2F0aW9uUHJlc2VudGVySW1wbC5oIgogI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNs
dWRlICJQbGF0Zm9ybUJyaWRnZS5oIgorI2luY2x1ZGUgIlBvcHVwQ29udGFpbmVyLmgiCiAjaW5j
bHVkZSAiUG9wdXBNZW51Q2hyb21pdW0uaCIKICNpbmNsdWRlICJSZW5kZXJXaWRnZXQuaCIKICNp
bmNsdWRlICJTY3JpcHRDb250cm9sbGVyLmgiCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL3NyYy9XZWJQb3B1cE1lbnVJbXBsLmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0v
c3JjL1dlYlBvcHVwTWVudUltcGwuY3BwCmluZGV4IGUyNjY4YjFiODRkOWY0MmFkY2FiZjMxOTA0
YmM4YjY4ZDA1MDNmMmEuLjRlMWIxZTY2MGYyNjdjNDkyNDA5NDIwNzUzNDY5OTVjOTQzMzkxNzEg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYlBvcHVwTWVudUltcGwu
Y3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYlBvcHVwTWVudUltcGwuY3Bw
CkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSAiUGxhdGZvcm1LZXlib2FyZEV2ZW50LmgiCiAj
aW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2
ZW50LmgiCisjaW5jbHVkZSAiUG9wdXBDb250YWluZXIuaCIKICNpbmNsdWRlICJQb3B1cE1lbnVD
aHJvbWl1bS5oIgogI2luY2x1ZGUgIlNraWFVdGlscy5oIgogCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAgYi9Tb3VyY2UvV2ViS2l0L2Nocm9t
aXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAKaW5kZXggYmE1OTYxNDU2N2MyMTA1OTc4YzUwZjU0OWVk
YTdkODViOGYwZGJmNy4uOWMxZDJlMDFlMWUyMzRhNzQ2MDY2ZmJlNjc3MmExOWJiNjU3NmE4ZSAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3BwCisr
KyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcApAQCAtODUsNyAr
ODUsNyBAQAogI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgogI2luY2x1ZGUgIlBsYXRm
b3JtVGhlbWVDaHJvbWl1bUd0ay5oIgogI2luY2x1ZGUgIlBsYXRmb3JtV2hlZWxFdmVudC5oIgot
I2luY2x1ZGUgIlBvcHVwTWVudUNocm9taXVtLmgiCisjaW5jbHVkZSAiUG9wdXBDb250YWluZXIu
aCIKICNpbmNsdWRlICJQb3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJQcm9ncmVzc1RyYWNr
ZXIuaCIKICNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>103657</attachid>
            <date>2011-08-11 12:34:07 -0700</date>
            <delta_ts>2011-08-12 14:05:59 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-66009-20110811153405.patch</filename>
            <type>text/plain</type>
            <size>137237</size>
            <attacher name="Fady Samuel">fsamuel</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTI4NTAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAyZDNhZGRmODdlY2VmZTJh
ZGRhNjVkYjY4NzkzMzdhMGMyNjYwNmMxLi5kNWJjNjQwZTlhZTZiOTg5NDRjYzg1YjgyMjQ2YmQx
NzZhYTYzZTBmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTAzIEBACisyMDExLTA4LTExICBGYWR5
IFNhbXVlbCAgPGZzYW11ZWxAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJlZmFjdG9yaW5nIG9m
IFBvcHVwTWVudUNocm9taXVtCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD02NjAwOQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFNwbGl0IFBvcHVwTWVudUNocm9taXVtIGludG8gdGhyZWUgc2V0cyBvZiBmaWxl
czogUG9wdXBNZW51Q2hyb21pdW0ue2h8Y3BwfSwgUG9wdXBDb250YWluZXIue2h8Y3BwfSwgYW5k
IFBvcHVwTGlzQm94LntofGNwcH0KKyAgICAgICAgZm9yIHJlYWRhYmlsaXR5IGFuZCBtYWludGFp
bmFiaWxpdHkuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIGFzIG5vIGZ1bmN0aW9uYWxpdHkgaGFz
IGNoYW5nZWQuCisKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6CisgICAgICAgICogcGxhdGZvcm0v
Y2hyb21pdW0vUG9wdXBDb250YWluZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmNv
bnN0cnVjdFJlbGF0aXZlTW91c2VFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpjb25zdHJ1Y3RS
ZWxhdGl2ZVdoZWVsRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OmNy
ZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6UG9wdXBDb250YWluZXIp
OgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6On5Qb3B1cENvbnRhaW5lcik6Cisg
ICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6bGF5b3V0QW5kQ2FsY3VsYXRlV2lkZ2V0
UmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6c2hvd1BvcHVwKToKKyAg
ICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpoaWRlUG9wdXApOgorICAgICAgICAoV2Vi
Q29yZTo6UG9wdXBDb250YWluZXI6Om5vdGlmeVBvcHVwSGlkZGVuKToKKyAgICAgICAgKFdlYkNv
cmU6OlBvcHVwQ29udGFpbmVyOjpsYXlvdXRBbmRHZXRSVExPZmZzZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6UG9wdXBDb250YWluZXI6OmhhbmRsZU1vdXNlRG93bkV2ZW50KToKKyAgICAgICAgKFdl
YkNvcmU6OlBvcHVwQ29udGFpbmVyOjpoYW5kbGVNb3VzZU1vdmVFdmVudCk6CisgICAgICAgIChX
ZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQpOgorICAgICAg
ICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OmhhbmRsZVdoZWVsRXZlbnQpOgorICAgICAgICAo
V2ViQ29yZTo6UG9wdXBDb250YWluZXI6OmhhbmRsZVRvdWNoRXZlbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6UG9wdXBDb250YWluZXI6OmhhbmRsZUdlc3R1cmVFdmVudCk6CisgICAgICAgIChXZWJD
b3JlOjpQb3B1cENvbnRhaW5lcjo6aGFuZGxlS2V5RXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6
UG9wdXBDb250YWluZXI6OmhpZGUpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6
OnBhaW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpwYWludEJvcmRlcik6
CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6aXNJbnRlcmVzdGVkSW5FdmVudEZv
cktleSk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6Y2hyb21lQ2xpZW50Q2hy
b21pdW0pOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OnNob3dJblJlY3QpOgor
ICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OnJlZnJlc2gpOgorICAgICAgICAoV2Vi
Q29yZTo6UG9wdXBDb250YWluZXI6OmlzUlRMKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29u
dGFpbmVyOjpzZWxlY3RlZEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVy
OjptZW51SXRlbUhlaWdodCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6bWVu
dUl0ZW1Gb250U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6bWVudVN0
eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OnBvcHVwRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpQ
b3B1cENvbnRhaW5lcjo6Z2V0U2VsZWN0ZWRJdGVtVG9vbFRpcCk6CisgICAgICAgICogcGxhdGZv
cm0vY2hyb21pdW0vUG9wdXBDb250YWluZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpQ
b3B1cENvbnRhaW5lcjo6bGlzdEJveCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5l
cjo6cG9wdXBUeXBlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cExpc3RCb3gu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6UG9wdXBMaXN0Qm94
KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6aGFuZGxlTW91c2VEb3duRXZlbnQp
OgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpoYW5kbGVNb3VzZU1vdmVFdmVudCk6
CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50
KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6aGFuZGxlV2hlZWxFdmVudCk6Cisg
ICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkp
OgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpoYW5kbGVUb3VjaEV2ZW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6aGFuZGxlR2VzdHVyZUV2ZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OmlzQ2hhcmFjdGVyVHlwZUV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBv
cHVwTGlzdEJveDo6aGFuZGxlS2V5RXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0
Qm94Ojpob3N0V2luZG93KToKKyAgICAgICAgKFdlYkNvcmU6OnN0cmlwTGVhZGluZ1doaXRlU3Bh
Y2UpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94Ojp0eXBlQWhlYWRGaW5kKToKKyAg
ICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6cGFpbnQpOgorICAgICAgICAoV2ViQ29yZTo6
UG9wdXBMaXN0Qm94OjpwYWludFJvdyk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6
OmdldFJvd0ZvbnQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjphYmFuZG9uKToK
KyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6cG9pbnRUb1Jvd0luZGV4KToKKyAgICAg
ICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6YWNjZXB0SW5kZXgpOgorICAgICAgICAoV2ViQ29y
ZTo6UG9wdXBMaXN0Qm94OjpzZWxlY3RJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExp
c3RCb3g6OnNldE9yaWdpbmFsSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94
OjpnZXRSb3dIZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpnZXRSb3dC
b3VuZHMpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjppbnZhbGlkYXRlUm93KToK
KyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6c2Nyb2xsVG9SZXZlYWxSb3cpOgorICAg
ICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94Ojppc1NlbGVjdGFibGVJdGVtKToKKyAgICAgICAg
KFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6Y2xlYXJTZWxlY3Rpb24pOgorICAgICAgICAoV2ViQ29y
ZTo6UG9wdXBMaXN0Qm94OjpzZWxlY3ROZXh0Um93KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVw
TGlzdEJveDo6c2VsZWN0UHJldmlvdXNSb3cpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0
Qm94OjphZGp1c3RTZWxlY3RlZEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJv
eDo6aGlkZVBvcHVwKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6dXBkYXRlRnJv
bUVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpzZXRNYXhXaWR0aEFu
ZExheW91dCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmxheW91dCk6CisgICAg
ICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmNsZWFyKToKKyAgICAgICAgKFdlYkNvcmU6OlBv
cHVwTGlzdEJveDo6aXNQb2ludEluQm91bmRzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9jaHJvbWl1
bS9Qb3B1cExpc3RCb3guaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpQb3B1cEl0ZW06OlBv
cHVwSXRlbSk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmNyZWF0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OnNlbGVjdGVkSW5kZXgpOgorICAgICAgICAoV2Vi
Q29yZTo6UG9wdXBMaXN0Qm94OjpudW1JdGVtcyk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExp
c3RCb3g6OnNldEJhc2VXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OnNl
dE1heEhlaWdodCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OnNldE1heFdpZHRo
KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6ZGlzY29ubmVjdENsaWVudCk6Cisg
ICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6Oml0ZW1zKToKKyAgICAgICAgKFdlYkNvcmU6
OlBvcHVwTGlzdEJveDo6flBvcHVwTGlzdEJveCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExp
c3RCb3g6OnNjcm9sbFRvUmV2ZWFsU2VsZWN0aW9uKToKKyAgICAgICAgKiBwbGF0Zm9ybS9jaHJv
bWl1bS9Qb3B1cE1lbnVDaHJvbWl1bS5jcHA6CisgICAgICAgICogcGxhdGZvcm0vY2hyb21pdW0v
UG9wdXBNZW51Q2hyb21pdW0uaDoKKwogMjAxMS0wOC0xMSAgQW5kcmV5IEtvc3lha292ICA8Y2Fz
ZXFAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IHNvdXJjZSBmcmFtZSBw
b3BvdmVyIHNpbWV0aW1lcyBwb3BzIHVwIGFmdGVyIHVzZXIgc3dpdGNoZXMgZnJvbSBTY3JpcHRz
IHBhbmVsCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkgYi9Tb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLmd5cGkKaW5kZXggMTY4NDRiNzEwMTc4YTcxMjIxOGZmZDYwNmEyY2Jj
MjMzZDBjZDA3Mi4uYzA5ZDI4NDAwZmNhZGMwNGRhYzA3NjhiYWFkNmQ0NDQwNWExYTQyNyAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUuZ3lwaQpAQCAtMzI1NCw4ICszMjU0LDEyIEBACiAgICAgICAgICAgICAncGxhdGZv
cm0vY2hyb21pdW0vUGxhdGZvcm1UaGVtZUNocm9taXVtR3RrLmNwcCcsCiAgICAgICAgICAgICAn
cGxhdGZvcm0vY2hyb21pdW0vUGxhdGZvcm1UaGVtZUNocm9taXVtR3RrLmgnLAogICAgICAgICAg
ICAgJ3BsYXRmb3JtL2Nocm9taXVtL1BsYXRmb3JtV2lkZ2V0LmgnLAorICAgICAgICAgICAgJ3Bs
YXRmb3JtL2Nocm9taXVtL1BvcHVwQ29udGFpbmVyLmNwcCcsCisgICAgICAgICAgICAncGxhdGZv
cm0vY2hyb21pdW0vUG9wdXBDb250YWluZXIuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vY2hy
b21pdW0vUG9wdXBNZW51Q2hyb21pdW0uY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJv
bWl1bS9Qb3B1cE1lbnVDaHJvbWl1bS5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1
bS9Qb3B1cExpc3RCb3guY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1
cExpc3RCb3guaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vY2hyb21pdW0vUG9wdXBNZW51UHJp
dmF0ZS5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9TU0xLZXlHZW5lcmF0b3JD
aHJvbWl1bS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2Nocm9taXVtL1Njcm9sbEFuaW1h
dG9yQ2hyb21pdW1NYWMuaCcsCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9j
aHJvbWl1bS9Qb3B1cENvbnRhaW5lci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJv
bWl1bS9Qb3B1cENvbnRhaW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMjFjNDZlNjcxZWQ5NDM4Y2M2YmI0
ZWIyNThkOTc1YzZmZDliMmQwNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2Nocm9taXVtL1BvcHVwQ29udGFpbmVyLmNwcApAQCAtMCwwICsxLDQ2NCBAQAorLyoK
KyAqIENvcHlyaWdodCAoYykgMjAxMSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICog
ZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBu
b3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9S
UworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVS
IE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAq
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUG9wdXBDb250YWluZXIuaCIKKworI2luY2x1ZGUg
IkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudENocm9taXVtLmgiCisjaW5jbHVkZSAi
RG9jdW1lbnQuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgor
I2luY2x1ZGUgIkZyYW1lbGVzc1Njcm9sbFZpZXcuaCIKKyNpbmNsdWRlICJGcmFtZWxlc3NTY3Jv
bGxWaWV3Q2xpZW50LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAi
SW50UmVjdC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUtleWJvYXJk
RXZlbnQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKKyNpbmNsdWRlICJQbGF0
Zm9ybVNjcmVlbi5oIgorI2luY2x1ZGUgIlBsYXRmb3JtV2hlZWxFdmVudC5oIgorI2luY2x1ZGUg
IlBvcHVwTGlzdEJveC5oIgorI2luY2x1ZGUgIlBvcHVwTWVudUNsaWVudC5oIgorI2luY2x1ZGUg
IlVzZXJHZXN0dXJlSW5kaWNhdG9yLmgiCisjaW5jbHVkZSA8bGltaXRzPgorCisjaWYgRU5BQkxF
KEdFU1RVUkVfRVZFTlRTKQorI2luY2x1ZGUgIlBsYXRmb3JtR2VzdHVyZUV2ZW50LmgiCisjZW5k
aWYKKworI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCisjaW5jbHVkZSAiUGxhdGZvcm1Ub3VjaEV2
ZW50LmgiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitzdGF0aWMgY29uc3QgaW50IGtCb3JkZXJTaXplID0gMTsKKworc3RhdGljIFBsYXRm
b3JtTW91c2VFdmVudCBjb25zdHJ1Y3RSZWxhdGl2ZU1vdXNlRXZlbnQoY29uc3QgUGxhdGZvcm1N
b3VzZUV2ZW50JiBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgRnJhbWVsZXNzU2Nyb2xsVmlldyogcGFyZW50LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVsZXNzU2Nyb2xsVmll
dyogY2hpbGQpCit7CisgICAgSW50UG9pbnQgcG9zID0gcGFyZW50LT5jb252ZXJ0U2VsZlRvQ2hp
bGQoY2hpbGQsIGUucG9zKCkpOworCisgICAgLy8gRklYTUU6IFRoaXMgaXMgYSBob3JyaWJsZSBo
YWNrIHNpbmNlIFBsYXRmb3JtTW91c2VFdmVudCBoYXMgbm8gc2V0dGVycyBmb3IgeC95LgorICAg
IFBsYXRmb3JtTW91c2VFdmVudCByZWxhdGl2ZUV2ZW50ID0gZTsKKyAgICBJbnRQb2ludCYgcmVs
YXRpdmVQb3MgPSBjb25zdF9jYXN0PEludFBvaW50Jj4ocmVsYXRpdmVFdmVudC5wb3MoKSk7Cisg
ICAgcmVsYXRpdmVQb3Muc2V0WChwb3MueCgpKTsKKyAgICByZWxhdGl2ZVBvcy5zZXRZKHBvcy55
KCkpOworICAgIHJldHVybiByZWxhdGl2ZUV2ZW50OworfQorCitzdGF0aWMgUGxhdGZvcm1XaGVl
bEV2ZW50IGNvbnN0cnVjdFJlbGF0aXZlV2hlZWxFdmVudChjb25zdCBQbGF0Zm9ybVdoZWVsRXZl
bnQmIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBGcmFtZWxlc3NTY3JvbGxWaWV3KiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZWxlc3NTY3JvbGxWaWV3KiBjaGls
ZCkKK3sKKyAgICBJbnRQb2ludCBwb3MgPSBwYXJlbnQtPmNvbnZlcnRTZWxmVG9DaGlsZChjaGls
ZCwgZS5wb3MoKSk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhvcnJpYmxlIGhhY2sgc2lu
Y2UgUGxhdGZvcm1XaGVlbEV2ZW50IGhhcyBubyBzZXR0ZXJzIGZvciB4L3kuCisgICAgUGxhdGZv
cm1XaGVlbEV2ZW50IHJlbGF0aXZlRXZlbnQgPSBlOworICAgIEludFBvaW50JiByZWxhdGl2ZVBv
cyA9IGNvbnN0X2Nhc3Q8SW50UG9pbnQmPihyZWxhdGl2ZUV2ZW50LnBvcygpKTsKKyAgICByZWxh
dGl2ZVBvcy5zZXRYKHBvcy54KCkpOworICAgIHJlbGF0aXZlUG9zLnNldFkocG9zLnkoKSk7Cisg
ICAgcmV0dXJuIHJlbGF0aXZlRXZlbnQ7Cit9CisKKy8vIHN0YXRpYworUGFzc1JlZlB0cjxQb3B1
cENvbnRhaW5lcj4gUG9wdXBDb250YWluZXI6OmNyZWF0ZShQb3B1cE1lbnVDbGllbnQqIGNsaWVu
dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9w
dXBUeXBlIHBvcHVwVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyYgc2V0dGluZ3MpCit7Cisg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBQb3B1cENvbnRhaW5lcihjbGllbnQsIHBvcHVwVHlwZSwg
c2V0dGluZ3MpKTsKK30KKworUG9wdXBDb250YWluZXI6OlBvcHVwQ29udGFpbmVyKFBvcHVwTWVu
dUNsaWVudCogY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcHVwVHlw
ZSBwb3B1cFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9wdXBD
b250YWluZXJTZXR0aW5ncyYgc2V0dGluZ3MpCisgICAgOiBtX2xpc3RCb3goUG9wdXBMaXN0Qm94
OjpjcmVhdGUoY2xpZW50LCBzZXR0aW5ncykpCisgICAgLCBtX3NldHRpbmdzKHNldHRpbmdzKQor
ICAgICwgbV9wb3B1cFR5cGUocG9wdXBUeXBlKQorICAgICwgbV9wb3B1cE9wZW4oZmFsc2UpCit7
CisgICAgc2V0U2Nyb2xsYmFyTW9kZXMoU2Nyb2xsYmFyQWx3YXlzT2ZmLCBTY3JvbGxiYXJBbHdh
eXNPZmYpOworfQorCitQb3B1cENvbnRhaW5lcjo6flBvcHVwQ29udGFpbmVyKCkKK3sKKyAgICBp
ZiAobV9saXN0Qm94ICYmIG1fbGlzdEJveC0+cGFyZW50KCkpCisgICAgICAgIHJlbW92ZUNoaWxk
KG1fbGlzdEJveC5nZXQoKSk7Cit9CisKK0ludFJlY3QgUG9wdXBDb250YWluZXI6OmxheW91dEFu
ZENhbGN1bGF0ZVdpZGdldFJlY3QoaW50IHRhcmdldENvbnRyb2xIZWlnaHQsIGNvbnN0IEludFBv
aW50JiBwb3B1cEluaXRpYWxDb29yZGluYXRlKQoreworICAgIC8vIFJlc2V0IHRoZSBtYXggd2lk
dGggYW5kIGhlaWdodCB0byB0aGVpciBkZWZhdWx0IHZhbHVlcywgdGhleSB3aWxsIGJlIHJlY29t
cHV0ZWQgYmVsb3cKKyAgICAvLyBpZiBuZWNlc3NhcnkuCisgICAgbV9saXN0Qm94LT5zZXRNYXhI
ZWlnaHQoa01heEhlaWdodCk7CisgICAgbV9saXN0Qm94LT5zZXRNYXhXaWR0aChzdGQ6Om51bWVy
aWNfbGltaXRzPGludD46Om1heCgpKTsKKworICAgIC8vIExheSBldmVyeXRoaW5nIG91dCB0byBm
aWd1cmUgb3V0IG91ciBwcmVmZXJyZWQgc2l6ZSwgdGhlbiB0ZWxsIHRoZSB2aWV3J3MKKyAgICAv
LyBXaWRnZXRDbGllbnQgYWJvdXQgaXQuIEl0IHNob3VsZCBhc3NpZ24gdXMgYSBjbGllbnQuCisg
ICAgaW50IHJ0bE9mZnNldCA9IGxheW91dEFuZEdldFJUTE9mZnNldCgpOworICAgIGJvb2wgaXNS
VEwgPSB0aGlzLT5pc1JUTCgpOworICAgIGludCByaWdodE9mZnNldCA9IGlzUlRMID8gcnRsT2Zm
c2V0IDogMDsKKworICAgIC8vIEFzc3VtZSBtX2xpc3RCb3ggc2l6ZSBpcyBhbHJlYWR5IGNhbGN1
bGF0ZWQuCisgICAgSW50U2l6ZSB0YXJnZXRTaXplKG1fbGlzdEJveC0+d2lkdGgoKSArIGtCb3Jk
ZXJTaXplICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgbV9saXN0Qm94LT5oZWlnaHQoKSAr
IGtCb3JkZXJTaXplICogMik7CisKKyAgICBJbnRSZWN0IHdpZGdldFJlY3Q7CisgICAgQ2hyb21l
Q2xpZW50Q2hyb21pdW0qIGNocm9tZUNsaWVudCA9IGNocm9tZUNsaWVudENocm9taXVtKCk7Cisg
ICAgaWYgKGNocm9tZUNsaWVudCkgeworICAgICAgICAvLyBJZiB0aGUgcG9wdXAgd291bGQgZXh0
ZW5kIHBhc3QgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLCBvcGVuIHVwd2FyZHMKKyAgICAgICAg
Ly8gaW5zdGVhZC4KKyAgICAgICAgRmxvYXRSZWN0IHNjcmVlbiA9IHNjcmVlbkF2YWlsYWJsZVJl
Y3QobV9mcmFtZVZpZXcuZ2V0KCkpOworICAgICAgICAvLyBVc2UgcG9wdXBJbml0aWFsQ29vcmRp
bmF0ZS54KCkgKyByaWdodE9mZnNldCBiZWNhdXNlIFJUTCBwb3NpdGlvbgorICAgICAgICAvLyBu
ZWVkcyB0byBiZSBjb25zaWRlcmVkLgorICAgICAgICB3aWRnZXRSZWN0ID0gY2hyb21lQ2xpZW50
LT53aW5kb3dUb1NjcmVlbihJbnRSZWN0KHBvcHVwSW5pdGlhbENvb3JkaW5hdGUueCgpICsgcmln
aHRPZmZzZXQsIHBvcHVwSW5pdGlhbENvb3JkaW5hdGUueSgpLCB0YXJnZXRTaXplLndpZHRoKCks
IHRhcmdldFNpemUuaGVpZ2h0KCkpKTsKKworICAgICAgICAvLyBJZiB3ZSBoYXZlIG11bHRpcGxl
IHNjcmVlbnMgYW5kIHRoZSBicm93c2VyIHJlY3QgaXMgaW4gb25lIHNjcmVlbiwgd2UgaGF2ZQor
ICAgICAgICAvLyB0byBjbGlwIHRoZSB3aW5kb3cgd2lkdGggdG8gdGhlIHNjcmVlbiB3aWR0aC4K
KyAgICAgICAgLy8gV2hlbiBjbGlwcGluZywgd2UgYWxzbyBuZWVkIHRvIHNldCBhIG1heGltdW0g
d2lkdGggZm9yIHRoZSBsaXN0IGJveC4KKyAgICAgICAgRmxvYXRSZWN0IHdpbmRvd1JlY3QgPSBj
aHJvbWVDbGllbnQtPndpbmRvd1JlY3QoKTsKKyAgICAgICAgaWYgKHdpbmRvd1JlY3QueCgpID49
IHNjcmVlbi54KCkgJiYgd2luZG93UmVjdC5tYXhYKCkgPD0gc2NyZWVuLm1heFgoKSAmJiAod2lk
Z2V0UmVjdC54KCkgPCBzY3JlZW4ueCgpIHx8IHdpZGdldFJlY3QubWF4WCgpID4gc2NyZWVuLm1h
eFgoKSkpIHsKKyAgICAgICAgICAgIC8vIEZpcnN0LCBpbnZlcnNlIHRoZSBwb3B1cCBhbGlnbm1l
bnQgaWYgaXQgZG9lcyBub3QgZml0IHRoZSBzY3JlZW4gLSB0aGlzIG1pZ2h0IGZpeCB0aGluZ3Mg
KG9yIG1ha2UgdGhlbSBiZXR0ZXIpLgorICAgICAgICAgICAgSW50UmVjdCBpbnZlcnNlV2lkZ2V0
UmVjdCA9IGNocm9tZUNsaWVudC0+d2luZG93VG9TY3JlZW4oSW50UmVjdChwb3B1cEluaXRpYWxD
b29yZGluYXRlLngoKSArIChpc1JUTCA/IDAgOiBydGxPZmZzZXQpLCBwb3B1cEluaXRpYWxDb29y
ZGluYXRlLnkoKSwgdGFyZ2V0U2l6ZS53aWR0aCgpLCB0YXJnZXRTaXplLmhlaWdodCgpKSk7Cisg
ICAgICAgICAgICBJbnRSZWN0IGVuY2xvc2luZ1NjcmVlbiA9IGVuY2xvc2luZ0ludFJlY3Qoc2Ny
ZWVuKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG9yaWdpbmFsQ3V0b2ZmID0gbWF4KGVuY2xvc2lu
Z1NjcmVlbi54KCkgLSB3aWRnZXRSZWN0LngoKSwgMCkgKyBtYXgod2lkZ2V0UmVjdC5tYXhYKCkg
LSBlbmNsb3NpbmdTY3JlZW4ubWF4WCgpLCAwKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludmVy
c2VDdXRvZmYgPSBtYXgoZW5jbG9zaW5nU2NyZWVuLngoKSAtIGludmVyc2VXaWRnZXRSZWN0Lngo
KSwgMCkgKyBtYXgoaW52ZXJzZVdpZGdldFJlY3QubWF4WCgpIC0gZW5jbG9zaW5nU2NyZWVuLm1h
eFgoKSwgMCk7CisKKyAgICAgICAgICAgIC8vIEFjY2VwdCB0aGUgaW52ZXJzZSBwb3B1cCBhbGln
bm1lbnQgaWYgdGhlIHRyaW1tZWQgY29udGVudCBnZXRzIHNob3J0ZXIgdGhhbiB0aGF0IGluIHRo
ZSBvcmlnaW5hbCBhbGlnbm1lbnQgY2FzZS4KKyAgICAgICAgICAgIGlmIChpbnZlcnNlQ3V0b2Zm
IDwgb3JpZ2luYWxDdXRvZmYpCisgICAgICAgICAgICAgICAgd2lkZ2V0UmVjdCA9IGludmVyc2VX
aWRnZXRSZWN0OworCisgICAgICAgICAgICBpZiAod2lkZ2V0UmVjdC54KCkgPCBzY3JlZW4ueCgp
KSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgd2lkZ2V0UmlnaHQgPSB3aWRnZXRSZWN0Lm1h
eFgoKTsKKyAgICAgICAgICAgICAgICB3aWRnZXRSZWN0LnNldFdpZHRoKHdpZGdldFJlY3QubWF4
WCgpIC0gc2NyZWVuLngoKSk7CisgICAgICAgICAgICAgICAgd2lkZ2V0UmVjdC5zZXRYKHdpZGdl
dFJpZ2h0IC0gd2lkZ2V0UmVjdC53aWR0aCgpKTsKKyAgICAgICAgICAgICAgICBsaXN0Qm94KCkt
PnNldE1heFdpZHRoQW5kTGF5b3V0KG1heCh3aWRnZXRSZWN0LndpZHRoKCkgLSBrQm9yZGVyU2l6
ZSAqIDIsIDApKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkZ2V0UmVjdC5tYXhYKCkgPiBz
Y3JlZW4ubWF4WCgpKSB7CisgICAgICAgICAgICAgICAgd2lkZ2V0UmVjdC5zZXRXaWR0aChzY3Jl
ZW4ubWF4WCgpIC0gd2lkZ2V0UmVjdC54KCkpOworICAgICAgICAgICAgICAgIGxpc3RCb3goKS0+
c2V0TWF4V2lkdGhBbmRMYXlvdXQobWF4KHdpZGdldFJlY3Qud2lkdGgoKSAtIGtCb3JkZXJTaXpl
ICogMiwgMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsY3Vs
YXRlIFkgYXhpcyBzaXplLgorICAgICAgICBpZiAod2lkZ2V0UmVjdC5tYXhZKCkgPiBzdGF0aWNf
Y2FzdDxpbnQ+KHNjcmVlbi5tYXhZKCkpKSB7CisgICAgICAgICAgICBpZiAod2lkZ2V0UmVjdC55
KCkgLSB3aWRnZXRSZWN0LmhlaWdodCgpIC0gdGFyZ2V0Q29udHJvbEhlaWdodCA+IDApIHsKKyAg
ICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBlbm91Z2ggcm9vbSB0byBvcGVuIHVwd2FyZHMuCisg
ICAgICAgICAgICAgICAgd2lkZ2V0UmVjdC5tb3ZlKDAsIC0od2lkZ2V0UmVjdC5oZWlnaHQoKSAr
IHRhcmdldENvbnRyb2xIZWlnaHQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgLy8gRmlndXJlIHdoZXRoZXIgdXB3YXJkcyBvciBkb3dud2FyZHMgaGFzIG1vcmUgcm9v
bSBhbmQgc2V0IHRoZQorICAgICAgICAgICAgICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1z
LgorICAgICAgICAgICAgICAgIGludCBzcGFjZUFib3ZlID0gd2lkZ2V0UmVjdC55KCkgLSB0YXJn
ZXRDb250cm9sSGVpZ2h0OworICAgICAgICAgICAgICAgIGludCBzcGFjZUJlbG93ID0gc2NyZWVu
Lm1heFkoKSAtIHdpZGdldFJlY3QueSgpOworICAgICAgICAgICAgICAgIGlmIChzcGFjZUFib3Zl
ID4gc3BhY2VCZWxvdykKKyAgICAgICAgICAgICAgICAgICAgbV9saXN0Qm94LT5zZXRNYXhIZWln
aHQoc3BhY2VBYm92ZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAg
ICBtX2xpc3RCb3gtPnNldE1heEhlaWdodChzcGFjZUJlbG93KTsKKyAgICAgICAgICAgICAgICBs
YXlvdXRBbmRHZXRSVExPZmZzZXQoKTsKKyAgICAgICAgICAgICAgICAvLyBPdXIgaGVpZ2h0IGhh
cyBjaGFuZ2VkLCBzbyByZWNvbXB1dGUgb25seSBZIGF4aXMgb2Ygd2lkZ2V0UmVjdC4KKyAgICAg
ICAgICAgICAgICAvLyBXZSBkb24ndCBoYXZlIHRvIHJlY29tcHV0ZSBYIGF4aXMsIHNvIHdlIG9u
bHkgcmVwbGFjZSBZIGF4aXMKKyAgICAgICAgICAgICAgICAvLyBpbiB3aWRnZXRSZWN0LgorICAg
ICAgICAgICAgICAgIEludFJlY3QgZnJhbWVJblNjcmVlbiA9IGNocm9tZUNsaWVudC0+d2luZG93
VG9TY3JlZW4oZnJhbWVSZWN0KCkpOworICAgICAgICAgICAgICAgIHdpZGdldFJlY3Quc2V0WShm
cmFtZUluU2NyZWVuLnkoKSk7CisgICAgICAgICAgICAgICAgd2lkZ2V0UmVjdC5zZXRIZWlnaHQo
ZnJhbWVJblNjcmVlbi5oZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgLy8gQW5kIG1vdmUgdXB3
YXJkcyBpZiBuZWNlc3NhcnkuCisgICAgICAgICAgICAgICAgaWYgKHNwYWNlQWJvdmUgPiBzcGFj
ZUJlbG93KQorICAgICAgICAgICAgICAgICAgICB3aWRnZXRSZWN0Lm1vdmUoMCwgLSh3aWRnZXRS
ZWN0LmhlaWdodCgpICsgdGFyZ2V0Q29udHJvbEhlaWdodCkpOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgfQorICAgIHJldHVybiB3aWRnZXRSZWN0OworfQorCit2b2lkIFBvcHVwQ29u
dGFpbmVyOjpzaG93UG9wdXAoRnJhbWVWaWV3KiB2aWV3KQoreworICAgIG1fZnJhbWVWaWV3ID0g
dmlldzsKKyAgICBsaXN0Qm94KCktPm1fZm9jdXNlZE5vZGUgPSBtX2ZyYW1lVmlldy0+ZnJhbWUo
KS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKTsKKworICAgIENocm9tZUNsaWVudENocm9taXVt
KiBjaHJvbWVDbGllbnQgPSBjaHJvbWVDbGllbnRDaHJvbWl1bSgpOworICAgIGlmIChjaHJvbWVD
bGllbnQpIHsKKyAgICAgICAgSW50UmVjdCBwb3B1cFJlY3QgPSBmcmFtZVJlY3QoKTsKKyAgICAg
ICAgY2hyb21lQ2xpZW50LT5wb3B1cE9wZW5lZCh0aGlzLCBsYXlvdXRBbmRDYWxjdWxhdGVXaWRn
ZXRSZWN0KHBvcHVwUmVjdC5oZWlnaHQoKSwgcG9wdXBSZWN0LmxvY2F0aW9uKCkpLCBmYWxzZSk7
CisgICAgICAgIG1fcG9wdXBPcGVuID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIW1fbGlzdEJv
eC0+cGFyZW50KCkpCisgICAgICAgIGFkZENoaWxkKG1fbGlzdEJveC5nZXQoKSk7CisKKyAgICAv
LyBFbmFibGUgc2Nyb2xsYmFycyBhZnRlciB0aGUgbGlzdGJveCBpcyBpbnNlcnRlZCBpbnRvIHRo
ZSBoaWVyYXJjaHksCisgICAgLy8gc28gaXQgaGFzIGEgcHJvcGVyIFdpZGdldENsaWVudC4KKyAg
ICBtX2xpc3RCb3gtPnNldFZlcnRpY2FsU2Nyb2xsYmFyTW9kZShTY3JvbGxiYXJBdXRvKTsKKwor
ICAgIG1fbGlzdEJveC0+c2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24oKTsKKworICAgIGludmFsaWRh
dGUoKTsKK30KKwordm9pZCBQb3B1cENvbnRhaW5lcjo6aGlkZVBvcHVwKCkKK3sKKyAgICBsaXN0
Qm94KCktPmhpZGVQb3B1cCgpOworfQorCit2b2lkIFBvcHVwQ29udGFpbmVyOjpub3RpZnlQb3B1
cEhpZGRlbigpCit7CisgICAgaWYgKCFtX3BvcHVwT3BlbikKKyAgICAgICAgcmV0dXJuOworICAg
IG1fcG9wdXBPcGVuID0gZmFsc2U7CisgICAgY2hyb21lQ2xpZW50Q2hyb21pdW0oKS0+cG9wdXBD
bG9zZWQodGhpcyk7Cit9CisKK2ludCBQb3B1cENvbnRhaW5lcjo6bGF5b3V0QW5kR2V0UlRMT2Zm
c2V0KCkKK3sKKyAgICBtX2xpc3RCb3gtPmxheW91dCgpOworCisgICAgLy8gUGxhY2UgdGhlIGxp
c3Rib3ggd2l0aGluIG91ciBib3JkZXIuCisgICAgbV9saXN0Qm94LT5tb3ZlKGtCb3JkZXJTaXpl
LCBrQm9yZGVyU2l6ZSk7CisKKyAgICAvLyBTaXplIG91cnNlbHZlcyB0byBjb250YWluIGxpc3Ri
b3ggKyBib3JkZXIuCisgICAgaW50IGxpc3RCb3hXaWR0aCA9IG1fbGlzdEJveC0+d2lkdGgoKSAr
IGtCb3JkZXJTaXplICogMjsKKyAgICByZXNpemUobGlzdEJveFdpZHRoLCBtX2xpc3RCb3gtPmhl
aWdodCgpICsga0JvcmRlclNpemUgKiAyKTsKKyAgICBpbnZhbGlkYXRlKCk7CisKKyAgICAvLyBD
b21wdXRlIHRoZSBzdGFydGluZyB4LWF4aXMgZm9yIGEgbm9ybWFsIFJUTCBvciByaWdodC1hbGln
bmVkIExUUiBkcm9wZG93bi4gRm9yIHRob3NlLAorICAgIC8vIHRoZSByaWdodCBlZGdlIG9mIGRy
b3Bkb3duIGJveCBzaG91bGQgYmUgYWxpZ25lZCB3aXRoIHRoZSByaWdodCBlZGdlIG9mIDxzZWxl
Y3Q+LzxpbnB1dD4gZWxlbWVudCBib3gsCisgICAgLy8gYW5kIHRoZSBkcm9wZG93biBib3ggc2hv
dWxkIGJlIGV4cGFuZGVkIHRvIHRoZSBsZWZ0IGlmIG1vcmUgc3BhY2UgaXMgbmVlZGVkLgorICAg
IC8vIG1fb3JpZ2luYWxGcmFtZVJlY3Qud2lkdGgoKSBpcyB0aGUgd2lkdGggb2YgdGhlIHRhcmdl
dCA8c2VsZWN0Pi88aW5wdXQ+IGVsZW1lbnQuCisgICAgcmV0dXJuIG1fb3JpZ2luYWxGcmFtZVJl
Y3Qud2lkdGgoKSAtIGxpc3RCb3hXaWR0aDsKK30KKworYm9vbCBQb3B1cENvbnRhaW5lcjo6aGFu
ZGxlTW91c2VEb3duRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKK3sKKyAg
ICBVc2VyR2VzdHVyZUluZGljYXRvciBnZXN0dXJlSW5kaWNhdG9yKERlZmluaXRlbHlQcm9jZXNz
aW5nVXNlckdlc3R1cmUpOworICAgIHJldHVybiBtX2xpc3RCb3gtPmhhbmRsZU1vdXNlRG93bkV2
ZW50KAorICAgICAgICBjb25zdHJ1Y3RSZWxhdGl2ZU1vdXNlRXZlbnQoZXZlbnQsIHRoaXMsIG1f
bGlzdEJveC5nZXQoKSkpOworfQorCitib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVNb3VzZU1v
dmVFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2ZW50KQoreworICAgIFVzZXJHZXN0
dXJlSW5kaWNhdG9yIGdlc3R1cmVJbmRpY2F0b3IoRGVmaW5pdGVseVByb2Nlc3NpbmdVc2VyR2Vz
dHVyZSk7CisgICAgcmV0dXJuIG1fbGlzdEJveC0+aGFuZGxlTW91c2VNb3ZlRXZlbnQoCisgICAg
ICAgIGNvbnN0cnVjdFJlbGF0aXZlTW91c2VFdmVudChldmVudCwgdGhpcywgbV9saXN0Qm94Lmdl
dCgpKSk7Cit9CisKK2Jvb2wgUG9wdXBDb250YWluZXI6OmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50
KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZlbnQpCit7CisgICAgUmVmUHRyPFBvcHVwQ29u
dGFpbmVyPiBwcm90ZWN0KHRoaXMpOworICAgIFVzZXJHZXN0dXJlSW5kaWNhdG9yIGdlc3R1cmVJ
bmRpY2F0b3IoRGVmaW5pdGVseVByb2Nlc3NpbmdVc2VyR2VzdHVyZSk7CisgICAgcmV0dXJuIG1f
bGlzdEJveC0+aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoCisgICAgICAgIGNvbnN0cnVjdFJlbGF0
aXZlTW91c2VFdmVudChldmVudCwgdGhpcywgbV9saXN0Qm94LmdldCgpKSk7Cit9CisKK2Jvb2wg
UG9wdXBDb250YWluZXI6OmhhbmRsZVdoZWVsRXZlbnQoY29uc3QgUGxhdGZvcm1XaGVlbEV2ZW50
JiBldmVudCkKK3sKKyAgICBVc2VyR2VzdHVyZUluZGljYXRvciBnZXN0dXJlSW5kaWNhdG9yKERl
ZmluaXRlbHlQcm9jZXNzaW5nVXNlckdlc3R1cmUpOworICAgIHJldHVybiBtX2xpc3RCb3gtPmhh
bmRsZVdoZWVsRXZlbnQoCisgICAgICAgIGNvbnN0cnVjdFJlbGF0aXZlV2hlZWxFdmVudChldmVu
dCwgdGhpcywgbV9saXN0Qm94LmdldCgpKSk7Cit9CisKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRT
KQorYm9vbCBQb3B1cENvbnRhaW5lcjo6aGFuZGxlVG91Y2hFdmVudChjb25zdCBQbGF0Zm9ybVRv
dWNoRXZlbnQmKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxF
KEdFU1RVUkVfUkVDT0dOSVpFUikKKy8vIEZJWE1FOiBSZWZhY3RvciB0aGlzIGNvZGUgdG8gc2hh
cmUgZnVuY3Rpb25hbGl0eSB3aXRoIEV2ZW50SGFuZGxlcjo6aGFuZGxlR2VzdHVyZUV2ZW50Lgor
Ym9vbCBQb3B1cENvbnRhaW5lcjo6aGFuZGxlR2VzdHVyZUV2ZW50KGNvbnN0IFBsYXRmb3JtR2Vz
dHVyZUV2ZW50JiBnZXN0dXJlRXZlbnQpCit7CisgICAgc3dpdGNoIChnZXN0dXJlRXZlbnQudHlw
ZSgpKSB7CisgICAgY2FzZSBQbGF0Zm9ybUdlc3R1cmVFdmVudDo6VGFwVHlwZTogeworICAgICAg
ICBQbGF0Zm9ybU1vdXNlRXZlbnQgZmFrZU1vdXNlTW92ZShnZXN0dXJlRXZlbnQucG9zaXRpb24o
KSwgZ2VzdHVyZUV2ZW50Lmdsb2JhbFBvc2l0aW9uKCksIE5vQnV0dG9uLCBNb3VzZUV2ZW50TW92
ZWQsIC8qIGNsaWNrQ291bnQgKi8gMSwgZ2VzdHVyZUV2ZW50LnNoaWZ0S2V5KCksIGdlc3R1cmVF
dmVudC5jdHJsS2V5KCksIGdlc3R1cmVFdmVudC5hbHRLZXkoKSwgZ2VzdHVyZUV2ZW50Lm1ldGFL
ZXkoKSwgZ2VzdHVyZUV2ZW50LnRpbWVzdGFtcCgpKTsKKyAgICAgICAgUGxhdGZvcm1Nb3VzZUV2
ZW50IGZha2VNb3VzZURvd24oZ2VzdHVyZUV2ZW50LnBvc2l0aW9uKCksIGdlc3R1cmVFdmVudC5n
bG9iYWxQb3NpdGlvbigpLCBMZWZ0QnV0dG9uLCBNb3VzZUV2ZW50UHJlc3NlZCwgLyogY2xpY2tD
b3VudCAqLyAxLCBnZXN0dXJlRXZlbnQuc2hpZnRLZXkoKSwgZ2VzdHVyZUV2ZW50LmN0cmxLZXko
KSwgZ2VzdHVyZUV2ZW50LmFsdEtleSgpLCBnZXN0dXJlRXZlbnQubWV0YUtleSgpLCBnZXN0dXJl
RXZlbnQudGltZXN0YW1wKCkpOworICAgICAgICBQbGF0Zm9ybU1vdXNlRXZlbnQgZmFrZU1vdXNl
VXAoZ2VzdHVyZUV2ZW50LnBvc2l0aW9uKCksIGdlc3R1cmVFdmVudC5nbG9iYWxQb3NpdGlvbigp
LCBMZWZ0QnV0dG9uLCBNb3VzZUV2ZW50UmVsZWFzZWQsIC8qIGNsaWNrQ291bnQgKi8gMSwgZ2Vz
dHVyZUV2ZW50LnNoaWZ0S2V5KCksIGdlc3R1cmVFdmVudC5jdHJsS2V5KCksIGdlc3R1cmVFdmVu
dC5hbHRLZXkoKSwgZ2VzdHVyZUV2ZW50Lm1ldGFLZXkoKSwgZ2VzdHVyZUV2ZW50LnRpbWVzdGFt
cCgpKTsKKyAgICAgICAgLy8gaGFuZGxlTW91c2VNb3ZlRXZlbnQoZmFrZU1vdXNlTW92ZSk7Cisg
ICAgICAgIGhhbmRsZU1vdXNlRG93bkV2ZW50KGZha2VNb3VzZURvd24pOworICAgICAgICBoYW5k
bGVNb3VzZVJlbGVhc2VFdmVudChmYWtlTW91c2VVcCk7CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKyAgICBjYXNlIFBsYXRmb3JtR2VzdHVyZUV2ZW50OjpTY3JvbGxVcGRhdGVUeXBlOiB7
CisgICAgICAgIFBsYXRmb3JtV2hlZWxFdmVudCBzeW50aGV0aWNXaGVlbEV2ZW50KGdlc3R1cmVF
dmVudC5wb3NpdGlvbigpLCBnZXN0dXJlRXZlbnQuZ2xvYmFsUG9zaXRpb24oKSwgZ2VzdHVyZUV2
ZW50LmRlbHRhWCgpLCBnZXN0dXJlRXZlbnQuZGVsdGFZKCksIGdlc3R1cmVFdmVudC5kZWx0YVgo
KSAvIDEyMC4wZiwgZ2VzdHVyZUV2ZW50LmRlbHRhWSgpIC8gMTIwLjBmLCBTY3JvbGxCeVBpeGVs
V2hlZWxFdmVudCwgLyogaXNBY2NlcHRlZCAqLyBmYWxzZSwgZ2VzdHVyZUV2ZW50LnNoaWZ0S2V5
KCksIGdlc3R1cmVFdmVudC5jdHJsS2V5KCksIGdlc3R1cmVFdmVudC5hbHRLZXkoKSwgZ2VzdHVy
ZUV2ZW50Lm1ldGFLZXkoKSk7CisgICAgICAgIGhhbmRsZVdoZWVsRXZlbnQoc3ludGhldGljV2hl
ZWxFdmVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIFBsYXRmb3Jt
R2VzdHVyZUV2ZW50OjpTY3JvbGxCZWdpblR5cGU6CisgICAgY2FzZSBQbGF0Zm9ybUdlc3R1cmVF
dmVudDo6U2Nyb2xsRW5kVHlwZToKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBm
YWxzZTsKK30KKyNlbmRpZgorCitib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVLZXlFdmVudChj
b25zdCBQbGF0Zm9ybUtleWJvYXJkRXZlbnQmIGV2ZW50KQoreworICAgIFVzZXJHZXN0dXJlSW5k
aWNhdG9yIGdlc3R1cmVJbmRpY2F0b3IoRGVmaW5pdGVseVByb2Nlc3NpbmdVc2VyR2VzdHVyZSk7
CisgICAgcmV0dXJuIG1fbGlzdEJveC0+aGFuZGxlS2V5RXZlbnQoZXZlbnQpOworfQorCit2b2lk
IFBvcHVwQ29udGFpbmVyOjpoaWRlKCkKK3sKKyAgICBtX2xpc3RCb3gtPmFiYW5kb24oKTsKK30K
Kwordm9pZCBQb3B1cENvbnRhaW5lcjo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiBnYywgY29uc3Qg
SW50UmVjdCYgcmVjdCkKK3sKKyAgICAvLyBhZGp1c3QgY29vcmRzIGZvciBzY3JvbGxlZCBmcmFt
ZQorICAgIEludFJlY3QgciA9IGludGVyc2VjdGlvbihyZWN0LCBmcmFtZVJlY3QoKSk7CisgICAg
aW50IHR4ID0geCgpOworICAgIGludCB0eSA9IHkoKTsKKworICAgIHIubW92ZSgtdHgsIC10eSk7
CisKKyAgICBnYy0+dHJhbnNsYXRlKHN0YXRpY19jYXN0PGZsb2F0Pih0eCksIHN0YXRpY19jYXN0
PGZsb2F0Pih0eSkpOworICAgIG1fbGlzdEJveC0+cGFpbnQoZ2MsIHIpOworICAgIGdjLT50cmFu
c2xhdGUoLXN0YXRpY19jYXN0PGZsb2F0Pih0eCksIC1zdGF0aWNfY2FzdDxmbG9hdD4odHkpKTsK
KworICAgIHBhaW50Qm9yZGVyKGdjLCByZWN0KTsKK30KKwordm9pZCBQb3B1cENvbnRhaW5lcjo6
cGFpbnRCb3JkZXIoR3JhcGhpY3NDb250ZXh0KiBnYywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sK
KyAgICAvLyBGSVhNRTogV2hlcmUgZG8gd2UgZ2V0IHRoZSBib3JkZXIgY29sb3IgZnJvbT8KKyAg
ICBDb2xvciBib3JkZXJDb2xvcigxMjcsIDE1NywgMTg1KTsKKworICAgIGdjLT5zZXRTdHJva2VT
dHlsZShOb1N0cm9rZSk7CisgICAgZ2MtPnNldEZpbGxDb2xvcihib3JkZXJDb2xvciwgQ29sb3JT
cGFjZURldmljZVJHQik7CisKKyAgICBpbnQgdHggPSB4KCk7CisgICAgaW50IHR5ID0geSgpOwor
CisgICAgLy8gdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0CisgICAgZ2MtPmRyYXdSZWN0KEludFJl
Y3QodHgsIHR5LCB3aWR0aCgpLCBrQm9yZGVyU2l6ZSkpOworICAgIGdjLT5kcmF3UmVjdChJbnRS
ZWN0KHR4LCB0eSwga0JvcmRlclNpemUsIGhlaWdodCgpKSk7CisgICAgZ2MtPmRyYXdSZWN0KElu
dFJlY3QodHgsIHR5ICsgaGVpZ2h0KCkgLSBrQm9yZGVyU2l6ZSwgd2lkdGgoKSwga0JvcmRlclNp
emUpKTsKKyAgICBnYy0+ZHJhd1JlY3QoSW50UmVjdCh0eCArIHdpZHRoKCkgLSBrQm9yZGVyU2l6
ZSwgdHksIGtCb3JkZXJTaXplLCBoZWlnaHQoKSkpOworfQorCitib29sIFBvcHVwQ29udGFpbmVy
Ojppc0ludGVyZXN0ZWRJbkV2ZW50Rm9yS2V5KGludCBrZXlDb2RlKQoreworICAgIHJldHVybiBt
X2xpc3RCb3gtPmlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkoa2V5Q29kZSk7Cit9CisKK0Nocm9t
ZUNsaWVudENocm9taXVtKiBQb3B1cENvbnRhaW5lcjo6Y2hyb21lQ2xpZW50Q2hyb21pdW0oKQor
eworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDaHJvbWVDbGllbnRDaHJvbWl1bSo+KG1fZnJhbWVW
aWV3LT5mcmFtZSgpLT5wYWdlKCktPmNocm9tZSgpLT5jbGllbnQoKSk7Cit9CisKK3ZvaWQgUG9w
dXBDb250YWluZXI6OnNob3dJblJlY3QoY29uc3QgSW50UmVjdCYgciwgRnJhbWVWaWV3KiB2LCBp
bnQgaW5kZXgpCit7CisgICAgLy8gVGhlIHJlY3QgaXMgdGhlIHNpemUgb2YgdGhlIHNlbGVjdCBi
b3guIEl0J3MgdXN1YWxseSBsYXJnZXIgdGhhbiB3ZSBuZWVkLgorICAgIC8vIHN1YnRyYWN0IGJv
cmRlciBzaXplIHNvIHRoYXQgdXN1YWxseSB0aGUgY29udGFpbmVyIHdpbGwgYmUgZGlzcGxheWVk
CisgICAgLy8gZXhhY3RseSB0aGUgc2FtZSB3aWR0aCBhcyB0aGUgc2VsZWN0IGJveC4KKyAgICBs
aXN0Qm94KCktPnNldEJhc2VXaWR0aChtYXgoci53aWR0aCgpIC0ga0JvcmRlclNpemUgKiAyLCAw
KSk7CisKKyAgICBsaXN0Qm94KCktPnVwZGF0ZUZyb21FbGVtZW50KCk7CisKKyAgICAvLyBXZSBz
ZXQgdGhlIHNlbGVjdGVkIGl0ZW0gaW4gdXBkYXRlRnJvbUVsZW1lbnQoKSwgYW5kIGRpc3JlZ2Fy
ZCB0aGUKKyAgICAvLyBpbmRleCBwYXNzZWQgaW50byB0aGlzIGZ1bmN0aW9uIChzYW1lIGFzIFdl
YmtpdCdzIFBvcHVwTWVudVdpbi5jcHApCisgICAgLy8gRklYTUU6IG1ha2Ugc3VyZSB0aGlzIGlz
IGNvcnJlY3QsIGFuZCBhZGQgYW4gYXNzZXJ0aW9uLgorICAgIC8vIEFTU0VSVChwb3B1cFdpbmRv
dyhwb3B1cCktPmxpc3RCb3goKS0+c2VsZWN0ZWRJbmRleCgpID09IGluZGV4KTsKKworICAgIC8v
IENvbnZlcnQgcG9pbnQgdG8gbWFpbiB3aW5kb3cgY29vcmRzLgorICAgIEludFBvaW50IGxvY2F0
aW9uID0gdi0+Y29udGVudHNUb1dpbmRvdyhyLmxvY2F0aW9uKCkpOworCisgICAgLy8gTW92ZSBp
dCBiZWxvdyB0aGUgc2VsZWN0IHdpZGdldC4KKyAgICBsb2NhdGlvbi5tb3ZlKDAsIHIuaGVpZ2h0
KCkpOworCisgICAgbV9vcmlnaW5hbEZyYW1lUmVjdCA9IEludFJlY3QobG9jYXRpb24sIHIuc2l6
ZSgpKTsKKyAgICBzZXRGcmFtZVJlY3QobV9vcmlnaW5hbEZyYW1lUmVjdCk7CisgICAgc2hvd1Bv
cHVwKHYpOworfQorCit2b2lkIFBvcHVwQ29udGFpbmVyOjpyZWZyZXNoKGNvbnN0IEludFJlY3Qm
IHRhcmdldENvbnRyb2xSZWN0KQoreworICAgIEludFBvaW50IGxvY2F0aW9uID0gbV9mcmFtZVZp
ZXctPmNvbnRlbnRzVG9XaW5kb3codGFyZ2V0Q29udHJvbFJlY3QubG9jYXRpb24oKSk7CisgICAg
Ly8gTW92ZSBpdCBiZWxvdyB0aGUgc2VsZWN0IHdpZGdldC4KKyAgICBsb2NhdGlvbi5tb3ZlKDAs
IHRhcmdldENvbnRyb2xSZWN0LmhlaWdodCgpKTsKKworICAgIGxpc3RCb3goKS0+c2V0QmFzZVdp
ZHRoKG1heChtX29yaWdpbmFsRnJhbWVSZWN0LndpZHRoKCkgLSBrQm9yZGVyU2l6ZSAqIDIsIDAp
KTsKKyAgICBzZXRCb3VuZHNTaXplKG1fb3JpZ2luYWxGcmFtZVJlY3Quc2l6ZSgpKTsKKworICAg
IGxpc3RCb3goKS0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKKyAgICAvLyBTdG9yZSB0aGUgb3JpZ2lu
YWwgc2l6ZSB0byBjaGVjayBpZiB3ZSBuZWVkIHRvIHJlcXVlc3QgdGhlIGxvY2F0aW9uLgorICAg
IEludFNpemUgb3JpZ2luYWxTaXplID0gc2l6ZSgpOworICAgIEludFJlY3Qgd2lkZ2V0UmVjdCA9
IGxheW91dEFuZENhbGN1bGF0ZVdpZGdldFJlY3QodGFyZ2V0Q29udHJvbFJlY3QuaGVpZ2h0KCks
IGxvY2F0aW9uKTsKKyAgICBpZiAob3JpZ2luYWxTaXplICE9IHdpZGdldFJlY3Quc2l6ZSgpKSB7
CisgICAgICAgIENocm9tZUNsaWVudENocm9taXVtKiBjaHJvbWVDbGllbnQgPSBjaHJvbWVDbGll
bnRDaHJvbWl1bSgpOworICAgICAgICBpZiAoY2hyb21lQ2xpZW50KSB7CisgICAgICAgICAgICBJ
bnRQb2ludCB3aWRnZXRMb2NhdGlvbiA9IGNocm9tZUNsaWVudC0+c2NyZWVuVG9XaW5kb3cod2lk
Z2V0UmVjdC5sb2NhdGlvbigpKTsKKyAgICAgICAgICAgIHdpZGdldFJlY3Quc2V0TG9jYXRpb24o
d2lkZ2V0TG9jYXRpb24pOworICAgICAgICAgICAgc2V0RnJhbWVSZWN0KHdpZGdldFJlY3QpOwor
ICAgICAgICB9CisgICAgfQorCisgICAgaW52YWxpZGF0ZSgpOworfQorCitpbmxpbmUgYm9vbCBQ
b3B1cENvbnRhaW5lcjo6aXNSVEwoKSBjb25zdAoreworICAgIHJldHVybiBtX2xpc3RCb3gtPm1f
cG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpLnRleHREaXJlY3Rpb24oKSA9PSBSVEw7Cit9CisKK2lu
dCBQb3B1cENvbnRhaW5lcjo6c2VsZWN0ZWRJbmRleCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
bGlzdEJveC0+c2VsZWN0ZWRJbmRleCgpOworfQorCitpbnQgUG9wdXBDb250YWluZXI6Om1lbnVJ
dGVtSGVpZ2h0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9saXN0Qm94LT5nZXRSb3dIZWlnaHQo
MCk7Cit9CisKK2ludCBQb3B1cENvbnRhaW5lcjo6bWVudUl0ZW1Gb250U2l6ZSgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1fbGlzdEJveC0+Z2V0Um93Rm9udCgwKS5zaXplKCk7Cit9CisKK1BvcHVw
TWVudVN0eWxlIFBvcHVwQ29udGFpbmVyOjptZW51U3R5bGUoKSBjb25zdAoreworICAgIHJldHVy
biBtX2xpc3RCb3gtPm1fcG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpOworfQorCitjb25zdCBXVEY6
OlZlY3RvcjxQb3B1cEl0ZW0qPiYgUG9wdXBDb250YWluZXI6OiBwb3B1cERhdGEoKSBjb25zdAor
eworICAgIHJldHVybiBtX2xpc3RCb3gtPml0ZW1zKCk7Cit9CisKK1N0cmluZyBQb3B1cENvbnRh
aW5lcjo6Z2V0U2VsZWN0ZWRJdGVtVG9vbFRpcCgpCit7CisgICAgLy8gV2UgY2Fubm90IHVzZSBt
X3BvcHVwQ2xpZW50LT5zZWxlY3RlZEluZGV4KCkgdG8gY2hvb3NlIHRvb2x0aXAgbWVzc2FnZSwK
KyAgICAvLyBiZWNhdXNlIHRoZSBzZWxlY3RlZEluZGV4KCkgbWlnaHQgcmV0dXJuIGZpbmFsIHNl
bGVjdGVkIGluZGV4LCBub3QgaG92ZXJpbmcgc2VsZWN0aW9uLgorICAgIHJldHVybiBsaXN0Qm94
KCktPm1fcG9wdXBDbGllbnQtPml0ZW1Ub29sVGlwKGxpc3RCb3goKS0+bV9zZWxlY3RlZEluZGV4
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBDb250YWluZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2Nocm9taXVtL1BvcHVwQ29udGFpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNDUyZTFiNDI1NDI2
YzlkMzE5YWQzMzVmMjRkN2JmMDlkZTNiM2IwZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwQ29udGFpbmVyLmgKQEAgLTAsMCArMSwxNDgg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGlu
IHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xl
IEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisg
KiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2lmbmRlZiBQb3B1cENvbnRhaW5lcl9oCisjZGVmaW5lIFBvcHVwQ29udGFpbmVyX2gKKwor
I2luY2x1ZGUgIkZyYW1lbGVzc1Njcm9sbFZpZXcuaCIKKyNpbmNsdWRlICJQb3B1cExpc3RCb3gu
aCIKKyNpbmNsdWRlICJQb3B1cE1lbnVTdHlsZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K2NsYXNzIENocm9tZUNsaWVudENocm9taXVtOworY2xhc3MgRnJhbWVWaWV3OworY2xhc3MgUG9w
dXBNZW51Q2xpZW50OworCitjbGFzcyBQb3B1cENvbnRhaW5lciA6IHB1YmxpYyBGcmFtZWxlc3NT
Y3JvbGxWaWV3IHsKK3B1YmxpYzoKKyAgICBlbnVtIFBvcHVwVHlwZSB7CisgICAgICAgIFNlbGVj
dCwgLy8gSFRNTCBzZWxlY3QgcG9wdXAuCisgICAgICAgIFN1Z2dlc3Rpb24sIC8vIEF1dG9jb21w
bGV0ZS9hdXRvZmlsbCBwb3B1cC4KKyAgICB9OworCisgICAgc3RhdGljIFBhc3NSZWZQdHI8UG9w
dXBDb250YWluZXI+IGNyZWF0ZShQb3B1cE1lbnVDbGllbnQqLCBQb3B1cFR5cGUsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb3B1cENvbnRhaW5l
clNldHRpbmdzJik7CisKKyAgICAvLyBXaGV0aGVyIGEga2V5IGV2ZW50IHNob3VsZCBiZSBzZW50
IHRvIHRoaXMgcG9wdXAuCisgICAgdmlydHVhbCBib29sIGlzSW50ZXJlc3RlZEluRXZlbnRGb3JL
ZXkoaW50IGtleUNvZGUpOworCisgICAgLy8gRnJhbWVsZXNzU2Nyb2xsVmlldworICAgIHZpcnR1
YWwgdm9pZCBwYWludChHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmly
dHVhbCB2b2lkIGhpZGUoKTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VEb3duRXZlbnQo
Y29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7CisgICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNl
TW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOworICAgIHZpcnR1YWwgYm9vbCBo
YW5kbGVNb3VzZVJlbGVhc2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKKyAgICB2
aXJ0dWFsIGJvb2wgaGFuZGxlV2hlZWxFdmVudChjb25zdCBQbGF0Zm9ybVdoZWVsRXZlbnQmKTsK
KyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlS2V5RXZlbnQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2
ZW50Jik7CisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxl
VG91Y2hFdmVudChjb25zdCBQbGF0Zm9ybVRvdWNoRXZlbnQmKTsKKyNlbmRpZgorI2lmIEVOQUJM
RShHRVNUVVJFX1JFQ09HTklaRVIpCisgICAgdmlydHVhbCBib29sIGhhbmRsZUdlc3R1cmVFdmVu
dChjb25zdCBQbGF0Zm9ybUdlc3R1cmVFdmVudCYpOworI2VuZGlmCisKKyAgICAvLyBQb3B1cENv
bnRhaW5lciBtZXRob2RzCisKKyAgICAvLyBTaG93IHRoZSBwb3B1cAorICAgIHZvaWQgc2hvd1Bv
cHVwKEZyYW1lVmlldyopOworCisgICAgLy8gU2hvdyB0aGUgcG9wdXAgaW4gdGhlIHNwZWNpZmll
ZCByZWN0IGZvciB0aGUgc3BlY2lmaWVkIGZyYW1lLgorICAgIC8vIE5vdGU6IHRoaXMgY29kZSB3
YXMgc29tZWhvdyBhcmJpdHJhcmlseSBmYWN0b3JlZC1vdXQgb2YgdGhlIFBvcHVwIGNsYXNzCisg
ICAgLy8gc28gV2ViVmlld0ltcGwgY2FuIGNyZWF0ZSBhIFBvcHVwQ29udGFpbmVyLiBUaGlzIG1l
dGhvZCBpcyB1c2VkIGZvcgorICAgIC8vIGRpc3BsYXlpbmcgYXV0byBjb21wbGV0ZSBwb3B1cCBt
ZW51cyBvbiBNYWMgQ2hyb21pdW0sIGFuZCBmb3IgYWxsCisgICAgLy8gcG9wdXBzIG9uIG90aGVy
IHBsYXRmb3Jtcy4KKyAgICB2b2lkIHNob3dJblJlY3QoY29uc3QgSW50UmVjdCYsIEZyYW1lVmll
dyosIGludCBpbmRleCk7CisKKyAgICAvLyBIaWRlcyB0aGUgcG9wdXAuCisgICAgdm9pZCBoaWRl
UG9wdXAoKTsKKworICAgIC8vIFRoZSBwb3B1cCB3YXMgaGlkZGVuLgorICAgIHZvaWQgbm90aWZ5
UG9wdXBIaWRkZW4oKTsKKworICAgIC8vIENvbXB1dGUgc2l6ZSBvZiB3aWRnZXQgYW5kIGNoaWxk
cmVuLiBSZXR1cm4gcmlnaHQgb2Zmc2V0IGZvciB0aGUgcG9wdXAgcmlnaHQgYWxpZ25tZW50Lgor
ICAgIGludCBsYXlvdXRBbmRHZXRSVExPZmZzZXQoKTsKKworICAgIFBvcHVwTGlzdEJveCogbGlz
dEJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGlzdEJveC5nZXQoKTsgfQorCisgICAgYm9vbCBpc1JU
TCgpIGNvbnN0OworCisgICAgLy8gR2V0cyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdGhhdCB0aGUg
dXNlciBpcyBjdXJyZW50bHkgbW91c2VkLW92ZXIgb3IKKyAgICAvLyBoYXMgc2VsZWN0ZWQgd2l0
aCB0aGUga2V5Ym9hcmQgdXAvZG93biBhcnJvd3MuCisgICAgaW50IHNlbGVjdGVkSW5kZXgoKSBj
b25zdDsKKworICAgIC8vIFJlZnJlc2ggdGhlIHBvcHVwIHZhbHVlcyBmcm9tIHRoZSBQb3B1cE1l
bnVDbGllbnQuCisgICAgdm9pZCByZWZyZXNoKGNvbnN0IEludFJlY3QmIHRhcmdldENvbnRyb2xS
ZWN0KTsKKworICAgIC8vIFRoZSBtZW51IHBlci1pdGVtIGRhdGEuCisgICAgY29uc3QgV1RGOjpW
ZWN0b3I8UG9wdXBJdGVtKj4mIHBvcHVwRGF0YSgpIGNvbnN0OworCisgICAgLy8gVGhlIGhlaWdo
dCBvZiBhIHJvdyBpbiB0aGUgbWVudS4KKyAgICBpbnQgbWVudUl0ZW1IZWlnaHQoKSBjb25zdDsK
KworICAgIC8vIFRoZSBzaXplIG9mIHRoZSBmb250IGJlaW5nIHVzZWQuCisgICAgaW50IG1lbnVJ
dGVtRm9udFNpemUoKSBjb25zdDsKKworICAgIC8vIFRoZSBzdHlsZSBvZiB0aGUgbWVudSBiZWlu
ZyB1c2VkLgorICAgIFBvcHVwTWVudVN0eWxlIG1lbnVTdHlsZSgpIGNvbnN0OworCisgICAgUG9w
dXBUeXBlIHBvcHVwVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fcG9wdXBUeXBlOyB9CisKKyAgICAv
LyBXaGlsZSBob3ZlcmluZyBwb3B1cCBtZW51IHdpbmRvdywgd2Ugd2FudCB0byBzaG93IHRvb2wg
dGlwIG1lc3NhZ2UuCisgICAgU3RyaW5nIGdldFNlbGVjdGVkSXRlbVRvb2xUaXAoKTsKKworcHJp
dmF0ZToKKyAgICBmcmllbmQgY2xhc3MgV1RGOjpSZWZDb3VudGVkPFBvcHVwQ29udGFpbmVyPjsK
KworICAgIFBvcHVwQ29udGFpbmVyKFBvcHVwTWVudUNsaWVudCosIFBvcHVwVHlwZSwgY29uc3Qg
UG9wdXBDb250YWluZXJTZXR0aW5ncyYpOworICAgIH5Qb3B1cENvbnRhaW5lcigpOworCisgICAg
Ly8gUGFpbnQgdGhlIGJvcmRlci4KKyAgICB2b2lkIHBhaW50Qm9yZGVyKEdyYXBoaWNzQ29udGV4
dCosIGNvbnN0IEludFJlY3QmKTsKKworICAgIC8vIExheW91dCBhbmQgY2FsY3VsYXRlIHBvcHVw
IHdpZGdldCBzaXplIGFuZCBsb2NhdGlvbiBhbmQgcmV0dXJucyBpdCBhcyBJbnRSZWN0LgorICAg
IEludFJlY3QgbGF5b3V0QW5kQ2FsY3VsYXRlV2lkZ2V0UmVjdChpbnQgdGFyZ2V0Q29udHJvbEhl
aWdodCwgY29uc3QgSW50UG9pbnQmIHBvcHVwSW5pdGlhbENvb3JkaW5hdGUpOworCisgICAgLy8g
UmV0dXJucyB0aGUgQ2hyb21lQ2xpZW50IG9mIHRoZSBwYWdlIHRoaXMgcG9wdXAgaXMgYXNzb2Np
YXRlZCB3aXRoLgorICAgIENocm9tZUNsaWVudENocm9taXVtKiBjaHJvbWVDbGllbnRDaHJvbWl1
bSgpOworCisgICAgUmVmUHRyPFBvcHVwTGlzdEJveD4gbV9saXN0Qm94OworICAgIFJlZlB0cjxG
cmFtZVZpZXc+IG1fZnJhbWVWaWV3OworCisgICAgUG9wdXBDb250YWluZXJTZXR0aW5ncyBtX3Nl
dHRpbmdzOworICAgIFBvcHVwVHlwZSBtX3BvcHVwVHlwZTsKKyAgICBJbnRSZWN0IG1fb3JpZ2lu
YWxGcmFtZVJlY3Q7CisgICAgLy8gV2hldGhlciB0aGUgcG9wdXAgaXMgY3VycmVudGx5IG9wZW4u
CisgICAgYm9vbCBtX3BvcHVwT3BlbjsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwor
I2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1
cExpc3RCb3guY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBMaXN0
Qm94LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi4yMDE1MDY0Y2RjMThlMjU5MjA1MjVmMzBhNDc5MzkzMDU3ZTEy
MDY4Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0v
UG9wdXBMaXN0Qm94LmNwcApAQCAtMCwwICsxLDkxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykg
MjAxMSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICog
ICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0
cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIlBvcHVwTGlzdEJveC5oIgorCisjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIkZv
bnRTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkZyYW1lbGVzc1Njcm9sbFZpZXdDbGllbnQuaCIKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVk
ZSAiS2V5Ym9hcmRDb2Rlcy5oIgorI2luY2x1ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVudC5oIgor
I2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU2NyZWVu
LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50LmgiCisjaW5jbHVkZSAiUG9wdXBDb250
YWluZXIuaCIKKyNpbmNsdWRlICJQb3B1cE1lbnVDaHJvbWl1bS5oIgorI2luY2x1ZGUgIlBvcHVw
TWVudUNsaWVudC5oIgorI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCisjaW5jbHVkZSAiU2Nyb2xs
YmFyVGhlbWUuaCIKKyNpbmNsdWRlICJTdHJpbmdUcnVuY2F0b3IuaCIKKyNpbmNsdWRlICJUZXh0
UnVuLmgiCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5oPgor
CisjaWYgRU5BQkxFKEdFU1RVUkVfRVZFTlRTKQorI2luY2x1ZGUgIlBsYXRmb3JtR2VzdHVyZUV2
ZW50LmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCisjaW5jbHVkZSAiUGxh
dGZvcm1Ub3VjaEV2ZW50LmgiCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2lu
ZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIFdURjsKK3VzaW5nIG5hbWVzcGFjZSBV
bmljb2RlOworCitQb3B1cExpc3RCb3g6OlBvcHVwTGlzdEJveChQb3B1cE1lbnVDbGllbnQqIGNs
aWVudCwgY29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyYgc2V0dGluZ3MpCisgICAgOiBtX3Nl
dHRpbmdzKHNldHRpbmdzKQorICAgICwgbV9vcmlnaW5hbEluZGV4KDApCisgICAgLCBtX3NlbGVj
dGVkSW5kZXgoMCkKKyAgICAsIG1fYWNjZXB0ZWRJbmRleE9uQWJhbmRvbigtMSkKKyAgICAsIG1f
dmlzaWJsZVJvd3MoMCkKKyAgICAsIG1fYmFzZVdpZHRoKDApCisgICAgLCBtX21heEhlaWdodChr
TWF4SGVpZ2h0KQorICAgICwgbV9wb3B1cENsaWVudChjbGllbnQpCisgICAgLCBtX3JlcGVhdGlu
Z0NoYXIoMCkKKyAgICAsIG1fbGFzdENoYXJUaW1lKDApCisgICAgLCBtX21heFdpbmRvd1dpZHRo
KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpCit7CisgICAgc2V0U2Nyb2xsYmFyTW9k
ZXMoU2Nyb2xsYmFyQWx3YXlzT2ZmLCBTY3JvbGxiYXJBbHdheXNPZmYpOworfQorCitib29sIFBv
cHVwTGlzdEJveDo6aGFuZGxlTW91c2VEb3duRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50
JiBldmVudCkKK3sKKyAgICBTY3JvbGxiYXIqIHNjcm9sbGJhciA9IHNjcm9sbGJhckF0UG9pbnQo
ZXZlbnQucG9zKCkpOworICAgIGlmIChzY3JvbGxiYXIpIHsKKyAgICAgICAgbV9jYXB0dXJpbmdT
Y3JvbGxiYXIgPSBzY3JvbGxiYXI7CisgICAgICAgIG1fY2FwdHVyaW5nU2Nyb2xsYmFyLT5tb3Vz
ZURvd24oZXZlbnQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWlz
UG9pbnRJbkJvdW5kcyhldmVudC5wb3MoKSkpCisgICAgICAgIGFiYW5kb24oKTsKKworICAgIHJl
dHVybiB0cnVlOworfQorCitib29sIFBvcHVwTGlzdEJveDo6aGFuZGxlTW91c2VNb3ZlRXZlbnQo
Y29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKK3sKKyAgICBpZiAobV9jYXB0dXJpbmdT
Y3JvbGxiYXIpIHsKKyAgICAgICAgbV9jYXB0dXJpbmdTY3JvbGxiYXItPm1vdXNlTW92ZWQoZXZl
bnQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBTY3JvbGxiYXIqIHNjcm9s
bGJhciA9IHNjcm9sbGJhckF0UG9pbnQoZXZlbnQucG9zKCkpOworICAgIGlmIChtX2xhc3RTY3Jv
bGxiYXJVbmRlck1vdXNlICE9IHNjcm9sbGJhcikgeworICAgICAgICAvLyBTZW5kIG1vdXNlIGV4
aXRlZCB0byB0aGUgb2xkIHNjcm9sbGJhci4KKyAgICAgICAgaWYgKG1fbGFzdFNjcm9sbGJhclVu
ZGVyTW91c2UpCisgICAgICAgICAgICBtX2xhc3RTY3JvbGxiYXJVbmRlck1vdXNlLT5tb3VzZUV4
aXRlZCgpOworICAgICAgICBtX2xhc3RTY3JvbGxiYXJVbmRlck1vdXNlID0gc2Nyb2xsYmFyOwor
ICAgIH0KKworICAgIGlmIChzY3JvbGxiYXIpIHsKKyAgICAgICAgc2Nyb2xsYmFyLT5tb3VzZU1v
dmVkKGV2ZW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCFpc1Bv
aW50SW5Cb3VuZHMoZXZlbnQucG9zKCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBz
ZWxlY3RJbmRleChwb2ludFRvUm93SW5kZXgoZXZlbnQucG9zKCkpKTsKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworYm9vbCBQb3B1cExpc3RCb3g6OmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGNvbnN0
IFBsYXRmb3JtTW91c2VFdmVudCYgZXZlbnQpCit7CisgICAgaWYgKG1fY2FwdHVyaW5nU2Nyb2xs
YmFyKSB7CisgICAgICAgIG1fY2FwdHVyaW5nU2Nyb2xsYmFyLT5tb3VzZVVwKCk7CisgICAgICAg
IG1fY2FwdHVyaW5nU2Nyb2xsYmFyID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
CisgICAgaWYgKCFpc1BvaW50SW5Cb3VuZHMoZXZlbnQucG9zKCkpKQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKworICAgIC8vIE5lZWQgdG8gY2hlY2sgYmVmb3JlIGNhbGxpbmcgYWNjZXB0SW5kZXgo
KSwgYmVjYXVzZSBtX3BvcHVwQ2xpZW50IG1pZ2h0IGJlIHJlbW92ZWQgaW4gYWNjZXB0SW5kZXgo
KSBjYWxsaW5nIGJlY2F1c2Ugb2YgZXZlbnQgaGFuZGxlci4KKyAgICBib29sIGlzU2VsZWN0UG9w
dXAgPSBtX3BvcHVwQ2xpZW50LT5tZW51U3R5bGUoKS5tZW51VHlwZSgpID09IFBvcHVwTWVudVN0
eWxlOjpTZWxlY3RQb3B1cDsKKyAgICBpZiAoYWNjZXB0SW5kZXgocG9pbnRUb1Jvd0luZGV4KGV2
ZW50LnBvcygpKSkgJiYgbV9mb2N1c2VkTm9kZSAmJiBpc1NlbGVjdFBvcHVwKSB7CisgICAgICAg
IG1fZm9jdXNlZE5vZGUtPmRpc3BhdGNoTW91c2VFdmVudChldmVudCwgZXZlbnROYW1lcygpLm1v
dXNldXBFdmVudCk7CisgICAgICAgIG1fZm9jdXNlZE5vZGUtPmRpc3BhdGNoTW91c2VFdmVudChl
dmVudCwgZXZlbnROYW1lcygpLmNsaWNrRXZlbnQpOworCisgICAgICAgIC8vIENsZWFyIG1fZm9j
dXNlZE5vZGUgaGVyZSwgYmVjYXVzZSB3ZSBjYW5ub3QgY2xlYXIgaW4gaGlkZVBvcHVwKCkgd2hp
Y2ggaXMgY2FsbGVkIGJlZm9yZSBkaXNwYXRjaE1vdXNlRXZlbnQoKSBpcyBjYWxsZWQuCisgICAg
ICAgIG1fZm9jdXNlZE5vZGUgPSAwOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCiti
b29sIFBvcHVwTGlzdEJveDo6aGFuZGxlV2hlZWxFdmVudChjb25zdCBQbGF0Zm9ybVdoZWVsRXZl
bnQmIGV2ZW50KQoreworICAgIGlmICghaXNQb2ludEluQm91bmRzKGV2ZW50LnBvcygpKSkgewor
ICAgICAgICBhYmFuZG9uKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8v
IFBhc3MgaXQgb2ZmIHRvIHRoZSBzY3JvbGwgdmlldy4KKyAgICAvLyBTYWRseSwgV2ViQ29yZSBk
ZXZzIGRvbid0IHVuZGVyc3RhbmQgdGhlIHdob2xlICJjb25zdCIgdGhpbmcuCisgICAgd2hlZWxF
dmVudChjb25zdF9jYXN0PFBsYXRmb3JtV2hlZWxFdmVudCY+KGV2ZW50KSk7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKKy8vIFNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBoYW5kbGVLZXlFdmVu
dCgpLgorYm9vbCBQb3B1cExpc3RCb3g6OmlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkoaW50IGtl
eUNvZGUpCit7CisgICAgc3dpdGNoIChrZXlDb2RlKSB7CisgICAgY2FzZSBWS0VZX0VTQ0FQRToK
KyAgICBjYXNlIFZLRVlfUkVUVVJOOgorICAgIGNhc2UgVktFWV9VUDoKKyAgICBjYXNlIFZLRVlf
RE9XTjoKKyAgICBjYXNlIFZLRVlfUFJJT1I6CisgICAgY2FzZSBWS0VZX05FWFQ6CisgICAgY2Fz
ZSBWS0VZX0hPTUU6CisgICAgY2FzZSBWS0VZX0VORDoKKyAgICBjYXNlIFZLRVlfVEFCOgorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorfQorCisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKK2Jvb2wgUG9wdXBMaXN0Qm94Ojpo
YW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBsYXRmb3JtVG91Y2hFdmVudCYpCit7CisgICAgcmV0dXJu
IGZhbHNlOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEUoR0VTVFVSRV9SRUNPR05JWkVSKQorYm9v
bCBQb3B1cExpc3RCb3g6OmhhbmRsZUdlc3R1cmVFdmVudChjb25zdCBQbGF0Zm9ybUdlc3R1cmVF
dmVudCYpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKK3N0YXRpYyBib29sIGlz
Q2hhcmFjdGVyVHlwZUV2ZW50KGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYgZXZlbnQpCit7
CisgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZXZlbnQgaXMgYSBjaGFyYWN0ZXItdHlwZWQgZXZl
bnQgb3Igbm90LgorICAgIC8vIFdlIHVzZSBSYXdLZXlEb3duL0NoYXIvS2V5VXAgZXZlbnQgc2No
ZW1lIG9uIGFsbCBwbGF0Zm9ybXMsCisgICAgLy8gc28gUGxhdGZvcm1LZXlib2FyZEV2ZW50OjpD
aGFyIChub3QgUmF3S2V5RG93bikgdHlwZSBldmVudAorICAgIC8vIGlzIGNvbnNpZGVyZWQgYXMg
Y2hhcmFjdGVyIHR5cGUgZXZlbnQuCisgICAgcmV0dXJuIGV2ZW50LnR5cGUoKSA9PSBQbGF0Zm9y
bUtleWJvYXJkRXZlbnQ6OkNoYXI7Cit9CisKK2Jvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVLZXlF
dmVudChjb25zdCBQbGF0Zm9ybUtleWJvYXJkRXZlbnQmIGV2ZW50KQoreworICAgIGlmIChldmVu
dC50eXBlKCkgPT0gUGxhdGZvcm1LZXlib2FyZEV2ZW50OjpLZXlVcCkKKyAgICAgICAgcmV0dXJu
IHRydWU7CisKKyAgICBpZiAoIW51bUl0ZW1zKCkgJiYgZXZlbnQud2luZG93c1ZpcnR1YWxLZXlD
b2RlKCkgIT0gVktFWV9FU0NBUEUpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgc3dpdGNo
IChldmVudC53aW5kb3dzVmlydHVhbEtleUNvZGUoKSkgeworICAgIGNhc2UgVktFWV9FU0NBUEU6
CisgICAgICAgIGFiYW5kb24oKTsgLy8gbWF5IGRlbGV0ZSB0aGlzCisgICAgICAgIHJldHVybiB0
cnVlOworICAgIGNhc2UgVktFWV9SRVRVUk46CisgICAgICAgIGlmIChtX3NlbGVjdGVkSW5kZXgg
PT0gLTEpICB7CisgICAgICAgICAgICBoaWRlUG9wdXAoKTsKKyAgICAgICAgICAgIC8vIERvbid0
IGVhdCB0aGUgZW50ZXIgaWYgbm90aGluZyBpcyBzZWxlY3RlZC4KKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBhY2NlcHRJbmRleChtX3NlbGVjdGVkSW5kZXgp
OyAvLyBtYXkgZGVsZXRlIHRoaXMKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBWS0VZ
X1VQOgorICAgIGNhc2UgVktFWV9ET1dOOgorICAgICAgICAvLyBXZSBoYXZlIHRvIGZvcndhcmQg
b25seSBzaGlmdCArIHVwIGNvbWJpbmF0aW9uIHRvIGZvY3VzZWQgbm9kZSB3aGVuIGF1dG9maWxs
IHBvcHVwLgorICAgICAgICAvLyBCZWNhdXNlIGFsbCBjaGFyYWN0ZXJzIGZyb20gdGhlIGN1cnNv
ciB0byB0aGUgc3RhcnQgb2YgdGhlIHRleHQgYXJlYSBzaG91bGQgc2VsZWN0ZWQgd2hlbiB5b3Ug
cHJlc3Mgc2hpZnQgKyB1cCBhcnJvdy4KKyAgICAgICAgLy8gc2hpZnQgKyBkb3duIHNob3VsZCBi
ZSB0aGUgc2ltaWxhciB3YXkgdG8gc2hpZnQgKyB1cC4KKyAgICAgICAgaWYgKGV2ZW50Lm1vZGlm
aWVycygpICYmIG1fcG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpLm1lbnVUeXBlKCkgPT0gUG9wdXBN
ZW51U3R5bGU6OkF1dG9maWxsUG9wdXApCisgICAgICAgICAgICBtX2ZvY3VzZWROb2RlLT5kaXNw
YXRjaEtleUV2ZW50KGV2ZW50KTsKKyAgICAgICAgZWxzZSBpZiAoZXZlbnQud2luZG93c1ZpcnR1
YWxLZXlDb2RlKCkgPT0gVktFWV9VUCkKKyAgICAgICAgICAgIHNlbGVjdFByZXZpb3VzUm93KCk7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlbGVjdE5leHRSb3coKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBWS0VZX1BSSU9SOgorICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KC1t
X3Zpc2libGVSb3dzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS0VZX05FWFQ6CisgICAg
ICAgIGFkanVzdFNlbGVjdGVkSW5kZXgobV92aXNpYmxlUm93cyk7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgVktFWV9IT01FOgorICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KC1tX3NlbGVj
dGVkSW5kZXgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLRVlfRU5EOgorICAgICAgICBh
ZGp1c3RTZWxlY3RlZEluZGV4KG1faXRlbXMuc2l6ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ZGVmYXVsdDoKKyAgICAgICAgaWYgKCFldmVudC5jdHJsS2V5KCkgJiYgIWV2ZW50LmFsdEtleSgp
ICYmICFldmVudC5tZXRhS2V5KCkKKyAgICAgICAgICAgICYmIGlzUHJpbnRhYmxlQ2hhcihldmVu
dC53aW5kb3dzVmlydHVhbEtleUNvZGUoKSkKKyAgICAgICAgICAgICYmIGlzQ2hhcmFjdGVyVHlw
ZUV2ZW50KGV2ZW50KSkKKyAgICAgICAgICAgIHR5cGVBaGVhZEZpbmQoZXZlbnQpOworICAgICAg
ICBicmVhazsKKyAgICB9CisKKyAgICBpZiAobV9vcmlnaW5hbEluZGV4ICE9IG1fc2VsZWN0ZWRJ
bmRleCkgeworICAgICAgICAvLyBLZXlib2FyZCBldmVudHMgc2hvdWxkIHVwZGF0ZSB0aGUgc2Vs
ZWN0aW9uIGltbWVkaWF0ZWx5IChidXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gd2FudCB0byBmaXJl
IHRoZSBvbmNoYW5nZSBldmVudCB1bnRpbCB0aGUgcG9wdXAgaXMgY2xvc2VkLCB0byBtYXRjaAor
ICAgICAgICAvLyBJRSkuIFdlIGNoYW5nZSB0aGUgb3JpZ2luYWwgaW5kZXggc28gd2UgcmV2ZXJ0
IHRvIHRoYXQgd2hlbiB0aGUKKyAgICAgICAgLy8gcG9wdXAgaXMgY2xvc2VkLgorICAgICAgICBp
ZiAobV9zZXR0aW5ncy5hY2NlcHRPbkFiYW5kb24pCisgICAgICAgICAgICBtX2FjY2VwdGVkSW5k
ZXhPbkFiYW5kb24gPSBtX3NlbGVjdGVkSW5kZXg7CisKKyAgICAgICAgc2V0T3JpZ2luYWxJbmRl
eChtX3NlbGVjdGVkSW5kZXgpOworICAgICAgICBpZiAobV9zZXR0aW5ncy5zZXRUZXh0T25JbmRl
eENoYW5nZSkKKyAgICAgICAgICAgIG1fcG9wdXBDbGllbnQtPnNldFRleHRGcm9tSXRlbShtX3Nl
bGVjdGVkSW5kZXgpOworICAgIH0KKyAgICBpZiAoZXZlbnQud2luZG93c1ZpcnR1YWxLZXlDb2Rl
KCkgPT0gVktFWV9UQUIpIHsKKyAgICAgICAgLy8gVEFCIGlzIGEgc3BlY2lhbCBjYXNlIGFzIGl0
IHNob3VsZCBzZWxlY3QgdGhlIGN1cnJlbnQgaXRlbSBpZiBhbnkgYW5kCisgICAgICAgIC8vIGFk
dmFuY2UgZm9jdXMuCisgICAgICAgIGlmIChtX3NlbGVjdGVkSW5kZXggPj0gMCkgeworICAgICAg
ICAgICAgYWNjZXB0SW5kZXgobV9zZWxlY3RlZEluZGV4KTsgLy8gTWF5IGRlbGV0ZSB1cy4KKyAg
ICAgICAgICAgIC8vIFJldHVybiBmYWxzZSBzbyB0aGUgVEFCIGtleSBldmVudCBpcyBwcm9wYWdh
dGVkIHRvIHRoZSBwYWdlLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9Cisg
ICAgICAgIC8vIENhbGwgYWJhbmRvbigpIHNvIHdlIGhvbm9yIG1fYWNjZXB0ZWRJbmRleE9uQWJh
bmRvbiBpZiBzZXQuCisgICAgICAgIGFiYW5kb24oKTsKKyAgICAgICAgLy8gUmV0dXJuIGZhbHNl
IHNvIHRoZSBUQUIga2V5IGV2ZW50IGlzIHByb3BhZ2F0ZWQgdG8gdGhlIHBhZ2UuCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworSG9zdFdpbmRv
dyogUG9wdXBMaXN0Qm94Ojpob3N0V2luZG93KCkgY29uc3QKK3sKKyAgICAvLyBPdXIgcGFyZW50
IGlzIHRoZSByb290IFNjcm9sbFZpZXcsIHNvIGl0IGlzIHRoZSBvbmUgdGhhdCBoYXMgYQorICAg
IC8vIEhvc3RXaW5kb3cuIEZyYW1lVmlldzo6aG9zdFdpbmRvdygpIHdvcmtzIHNpbWlsYXJseS4K
KyAgICByZXR1cm4gcGFyZW50KCkgPyBwYXJlbnQoKS0+aG9zdFdpbmRvdygpIDogMDsKK30KKwor
Ly8gRnJvbSBIVE1MU2VsZWN0RWxlbWVudC5jcHAKK3N0YXRpYyBTdHJpbmcgc3RyaXBMZWFkaW5n
V2hpdGVTcGFjZShjb25zdCBTdHJpbmcmIHN0cmluZykKK3sKKyAgICBpbnQgbGVuZ3RoID0gc3Ry
aW5nLmxlbmd0aCgpOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsr
aSkKKyAgICAgICAgaWYgKHN0cmluZ1tpXSAhPSBub0JyZWFrU3BhY2UKKyAgICAgICAgICAgICYm
IChzdHJpbmdbaV0gPD0gMHg3RiA/ICFpc3NwYWNlKHN0cmluZ1tpXSkgOiAoZGlyZWN0aW9uKHN0
cmluZ1tpXSkgIT0gV2hpdGVTcGFjZU5ldXRyYWwpKSkKKyAgICAgICAgICAgIGJyZWFrOworCisg
ICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoaSwgbGVuZ3RoIC0gaSk7Cit9CisKKy8vIEZyb20g
SFRNTFNlbGVjdEVsZW1lbnQuY3BwLCB3aXRoIG1vZGlmaWNhdGlvbnMKK3ZvaWQgUG9wdXBMaXN0
Qm94Ojp0eXBlQWhlYWRGaW5kKGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYgZXZlbnQpCit7
CisgICAgVGltZVN0YW1wIG5vdyA9IHN0YXRpY19jYXN0PFRpbWVTdGFtcD4oY3VycmVudFRpbWUo
KSAqIDEwMDAuMGYpOworICAgIFRpbWVTdGFtcCBkZWx0YSA9IG5vdyAtIG1fbGFzdENoYXJUaW1l
OworCisgICAgLy8gUmVzZXQgdGhlIHRpbWUgd2hlbiB1c2VyIHR5cGVzIGluIGEgY2hhcmFjdGVy
LiBUaGUgdGltZSBnYXAgYmV0d2VlbgorICAgIC8vIGxhc3QgY2hhcmFjdGVyIGFuZCB0aGUgY3Vy
cmVudCBjaGFyYWN0ZXIgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyCisgICAgLy8gdXNlciB0
eXBlZCBpbiBhIHN0cmluZyBvciBqdXN0IGEgY2hhcmFjdGVyIGFzIHRoZSBzZWFyY2ggcHJlZml4
LgorICAgIG1fbGFzdENoYXJUaW1lID0gbm93OworCisgICAgVUNoYXIgYyA9IGV2ZW50LndpbmRv
d3NWaXJ0dWFsS2V5Q29kZSgpOworCisgICAgU3RyaW5nIHByZWZpeDsKKyAgICBpbnQgc2VhcmNo
U3RhcnRPZmZzZXQgPSAxOworICAgIGlmIChkZWx0YSA+IGtUeXBlQWhlYWRUaW1lb3V0TXMpIHsK
KyAgICAgICAgbV90eXBlZFN0cmluZyA9IHByZWZpeCA9IFN0cmluZygmYywgMSk7CisgICAgICAg
IG1fcmVwZWF0aW5nQ2hhciA9IGM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV90eXBlZFN0cmlu
Zy5hcHBlbmQoYyk7CisKKyAgICAgICAgaWYgKGMgPT0gbV9yZXBlYXRpbmdDaGFyKQorICAgICAg
ICAgICAgLy8gVGhlIHVzZXIgaXMgbGlrZWx5IHRyeWluZyB0byBjeWNsZSB0aHJvdWdoIGFsbCB0
aGUgaXRlbXMgc3RhcnRpbmcgd2l0aCB0aGlzIGNoYXJhY3Rlciwgc28ganVzdCBzZWFyY2ggb24g
dGhlIGNoYXJhY3RlcgorICAgICAgICAgICAgcHJlZml4ID0gU3RyaW5nKCZjLCAxKTsKKyAgICAg
ICAgZWxzZSB7CisgICAgICAgICAgICBtX3JlcGVhdGluZ0NoYXIgPSAwOworICAgICAgICAgICAg
cHJlZml4ID0gbV90eXBlZFN0cmluZzsKKyAgICAgICAgICAgIHNlYXJjaFN0YXJ0T2Zmc2V0ID0g
MDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvbXB1dGUgYSBjYXNlLWZvbGRlZCBjb3B5
IG9mIHRoZSBwcmVmaXggc3RyaW5nIGJlZm9yZSBiZWdpbm5pbmcgdGhlIHNlYXJjaCBmb3IKKyAg
ICAvLyBhIG1hdGNoaW5nIGVsZW1lbnQuIFRoaXMgY29kZSB1c2VzIGZvbGRDYXNlIHRvIHdvcmsg
YXJvdW5kIHRoZSBmYWN0IHRoYXQKKyAgICAvLyBTdHJpbmc6OnN0YXJ0V2l0aCBkb2VzIG5vdCBm
b2xkIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLiBUaGlzIGNvZGUgY2FuIGJlIGNoYW5nZWQKKyAgICAv
LyB0byB1c2Ugc3RhcnRXaXRoIG9uY2UgdGhhdCBpcyBmaXhlZC4KKyAgICBTdHJpbmcgcHJlZml4
V2l0aENhc2VGb2xkZWQocHJlZml4LmZvbGRDYXNlKCkpOworICAgIGludCBpdGVtQ291bnQgPSBu
dW1JdGVtcygpOworICAgIGludCBpbmRleCA9IChtYXgoMCwgbV9zZWxlY3RlZEluZGV4KSArIHNl
YXJjaFN0YXJ0T2Zmc2V0KSAlIGl0ZW1Db3VudDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0
ZW1Db3VudDsgaSsrLCBpbmRleCA9IChpbmRleCArIDEpICUgaXRlbUNvdW50KSB7CisgICAgICAg
IGlmICghaXNTZWxlY3RhYmxlSXRlbShpbmRleCkpCisgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICBpZiAoc3RyaXBMZWFkaW5nV2hpdGVTcGFjZShtX2l0ZW1zW2luZGV4XS0+bGFiZWwp
LmZvbGRDYXNlKCkuc3RhcnRzV2l0aChwcmVmaXhXaXRoQ2FzZUZvbGRlZCkpIHsKKyAgICAgICAg
ICAgIHNlbGVjdEluZGV4KGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQor
ICAgIH0KK30KKwordm9pZCBQb3B1cExpc3RCb3g6OnBhaW50KEdyYXBoaWNzQ29udGV4dCogZ2Ms
IGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgLy8gYWRqdXN0IGNvb3JkcyBmb3Igc2Nyb2xs
ZWQgZnJhbWUKKyAgICBJbnRSZWN0IHIgPSBpbnRlcnNlY3Rpb24ocmVjdCwgZnJhbWVSZWN0KCkp
OworICAgIGludCB0eCA9IHgoKSAtIHNjcm9sbFgoKTsKKyAgICBpbnQgdHkgPSB5KCkgLSBzY3Jv
bGxZKCk7CisKKyAgICByLm1vdmUoLXR4LCAtdHkpOworCisgICAgLy8gc2V0IGNsaXAgcmVjdCB0
byBtYXRjaCByZXZpc2VkIGRhbWFnZSByZWN0CisgICAgZ2MtPnNhdmUoKTsKKyAgICBnYy0+dHJh
bnNsYXRlKHN0YXRpY19jYXN0PGZsb2F0Pih0eCksIHN0YXRpY19jYXN0PGZsb2F0Pih0eSkpOwor
ICAgIGdjLT5jbGlwKHIpOworCisgICAgLy8gRklYTUU6IENhbiB3ZSBvcHRpbWl6ZSBzY3JvbGxp
bmcgdG8gbm90IHJlcXVpcmUgcmVwYWludGluZyB0aGUgZW50aXJlCisgICAgLy8gd2luZG93PyBT
aG91bGQgd2U/CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVtcygpOyArK2kpCisgICAg
ICAgIHBhaW50Um93KGdjLCByLCBpKTsKKworICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYW4gZW1w
dHkgcG9wdXAuCisgICAgaWYgKCFudW1JdGVtcygpKQorICAgICAgICBnYy0+ZmlsbFJlY3Qociwg
Q29sb3I6OndoaXRlLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKworICAgIGdjLT5yZXN0b3JlKCk7
CisKKyAgICBTY3JvbGxWaWV3OjpwYWludChnYywgcmVjdCk7Cit9CisKK3N0YXRpYyBjb25zdCBp
bnQgc2VwYXJhdG9yUGFkZGluZyA9IDQ7CitzdGF0aWMgY29uc3QgaW50IHNlcGFyYXRvckhlaWdo
dCA9IDE7CisKK3ZvaWQgUG9wdXBMaXN0Qm94OjpwYWludFJvdyhHcmFwaGljc0NvbnRleHQqIGdj
LCBjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgcm93SW5kZXgpCit7CisgICAgLy8gVGhpcyBjb2Rl
IGlzIGJhc2VkIGxhcmdlbHkgb24gUmVuZGVyTGlzdEJveDo6cGFpbnQqIG1ldGhvZHMuCisKKyAg
ICBJbnRSZWN0IHJvd1JlY3QgPSBnZXRSb3dCb3VuZHMocm93SW5kZXgpOworICAgIGlmICghcm93
UmVjdC5pbnRlcnNlY3RzKHJlY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICBQb3B1cE1lbnVT
dHlsZSBzdHlsZSA9IG1fcG9wdXBDbGllbnQtPml0ZW1TdHlsZShyb3dJbmRleCk7CisKKyAgICAv
LyBQYWludCBiYWNrZ3JvdW5kCisgICAgQ29sb3IgYmFja0NvbG9yLCB0ZXh0Q29sb3IsIGxhYmVs
Q29sb3I7CisgICAgaWYgKHJvd0luZGV4ID09IG1fc2VsZWN0ZWRJbmRleCkgeworICAgICAgICBi
YWNrQ29sb3IgPSBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPmFjdGl2ZUxpc3RCb3hTZWxl
Y3Rpb25CYWNrZ3JvdW5kQ29sb3IoKTsKKyAgICAgICAgdGV4dENvbG9yID0gUmVuZGVyVGhlbWU6
OmRlZmF1bHRUaGVtZSgpLT5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCk7
CisgICAgICAgIGxhYmVsQ29sb3IgPSB0ZXh0Q29sb3I7CisgICAgfSBlbHNlIHsKKyAgICAgICAg
YmFja0NvbG9yID0gc3R5bGUuYmFja2dyb3VuZENvbG9yKCk7CisgICAgICAgIHRleHRDb2xvciA9
IHN0eWxlLmZvcmVncm91bmRDb2xvcigpOworICAgICAgICAvLyBGSVhNRTogZm9yIG5vdyB0aGUg
bGFiZWwgY29sb3IgaXMgaGFyZC1jb2RlZC4gSXQgc2hvdWxkIGJlIGFkZGVkIHRvCisgICAgICAg
IC8vIHRoZSBQb3B1cE1lbnVTdHlsZS4KKyAgICAgICAgbGFiZWxDb2xvciA9IENvbG9yKDExNSwg
MTE1LCAxMTUpOworICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgYSB0cmFuc3BhcmVudCBiYWNr
Z3JvdW5kLCBtYWtlIHN1cmUgaXQgaGFzIGEgY29sb3IgdG8gYmxlbmQKKyAgICAvLyBhZ2FpbnN0
LgorICAgIGlmIChiYWNrQ29sb3IuaGFzQWxwaGEoKSkKKyAgICAgICAgZ2MtPmZpbGxSZWN0KHJv
d1JlY3QsIENvbG9yOjp3aGl0ZSwgQ29sb3JTcGFjZURldmljZVJHQik7CisKKyAgICBnYy0+Zmls
bFJlY3Qocm93UmVjdCwgYmFja0NvbG9yLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKworICAgIC8v
IEl0IGRvZXNuJ3QgbG9vayBnb29kIGJ1dCBBdXRvZmlsbCByZXF1aXJlcyBzcGVjaWFsIHN0eWxl
IGZvciBzZXBhcmF0b3IuCisgICAgLy8gQXV0b2ZpbGwgZG9lc24ndCBoYXZlIHBhZGRpbmcgYW5k
ICNkY2RjZGMgY29sb3IuCisgICAgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1Jc1NlcGFyYXRvcihy
b3dJbmRleCkpIHsKKyAgICAgICAgaW50IHBhZGRpbmcgPSBzdHlsZS5tZW51VHlwZSgpID09IFBv
cHVwTWVudVN0eWxlOjpBdXRvZmlsbFBvcHVwID8gMCA6IHNlcGFyYXRvclBhZGRpbmc7CisgICAg
ICAgIEludFJlY3Qgc2VwYXJhdG9yUmVjdCgKKyAgICAgICAgICAgIHJvd1JlY3QueCgpICsgcGFk
ZGluZywKKyAgICAgICAgICAgIHJvd1JlY3QueSgpICsgKHJvd1JlY3QuaGVpZ2h0KCkgLSBzZXBh
cmF0b3JIZWlnaHQpIC8gMiwKKyAgICAgICAgICAgIHJvd1JlY3Qud2lkdGgoKSAtIDIgKiBwYWRk
aW5nLCBzZXBhcmF0b3JIZWlnaHQpOworICAgICAgICBnYy0+ZmlsbFJlY3Qoc2VwYXJhdG9yUmVj
dCwgc3R5bGUubWVudVR5cGUoKSA9PSBQb3B1cE1lbnVTdHlsZTo6QXV0b2ZpbGxQb3B1cCA/IENv
bG9yKDB4ZGMsIDB4ZGMsIDB4ZGMpIDogdGV4dENvbG9yLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc3R5bGUuaXNWaXNpYmxlKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIGdjLT5zZXRGaWxsQ29sb3IodGV4dENvbG9yLCBDb2xvclNw
YWNlRGV2aWNlUkdCKTsKKworICAgIEZvbnQgaXRlbUZvbnQgPSBnZXRSb3dGb250KHJvd0luZGV4
KTsKKyAgICAvLyBGSVhNRTogaHR0cDovL2NyYnVnLmNvbS8xOTg3MiBXZSBzaG91bGQgZ2V0IHRo
ZSBwYWRkaW5nIG9mIGluZGl2aWR1YWwgb3B0aW9uCisgICAgLy8gZWxlbWVudHMuIFRoaXMgcHJv
YmFibHkgaW1wbGllcyBjaGFuZ2VzIHRvIFBvcHVwTWVudUNsaWVudC4KKyAgICBib29sIHJpZ2h0
QWxpZ25lZCA9IG1fcG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpLnRleHREaXJlY3Rpb24oKSA9PSBS
VEw7CisgICAgaW50IHRleHRYID0gMDsKKyAgICBpbnQgbWF4V2lkdGggPSAwOworICAgIGlmIChy
aWdodEFsaWduZWQpCisgICAgICAgIG1heFdpZHRoID0gcm93UmVjdC53aWR0aCgpIC0gbWF4KDAs
IG1fcG9wdXBDbGllbnQtPmNsaWVudFBhZGRpbmdSaWdodCgpIC0gbV9wb3B1cENsaWVudC0+Y2xp
ZW50SW5zZXRSaWdodCgpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdGV4dFggPSBtYXgoMCwgbV9w
b3B1cENsaWVudC0+Y2xpZW50UGFkZGluZ0xlZnQoKSAtIG1fcG9wdXBDbGllbnQtPmNsaWVudElu
c2V0TGVmdCgpKTsKKyAgICAgICAgbWF4V2lkdGggPSByb3dSZWN0LndpZHRoKCkgLSB0ZXh0WDsK
KyAgICB9CisgICAgLy8gUHJlcGFyZSB0ZXh0IHRvIGJlIGRyYXduLgorICAgIFN0cmluZyBpdGVt
VGV4dCA9IG1fcG9wdXBDbGllbnQtPml0ZW1UZXh0KHJvd0luZGV4KTsKKyAgICBTdHJpbmcgaXRl
bUxhYmVsID0gbV9wb3B1cENsaWVudC0+aXRlbUxhYmVsKHJvd0luZGV4KTsKKyAgICBTdHJpbmcg
aXRlbUljb24gPSBtX3BvcHVwQ2xpZW50LT5pdGVtSWNvbihyb3dJbmRleCk7CisgICAgaWYgKG1f
c2V0dGluZ3MucmVzdHJpY3RXaWR0aE9mTGlzdEJveCkgeyAvLyBUcnVuY2F0ZSBzdHJpbmdzIHRv
IGZpdCBpbi4KKyAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBsZWZ0VHJ1bmNhdGUgZm9yIHRo
ZSBydGwgY2FzZS4KKyAgICAgICAgLy8gU3RyaW5nVHJ1bmNhdG9yOjpsZWZ0VHJ1bmNhdGUgd291
bGQgaGF2ZSB0byBiZSBpbXBsZW1lbnRlZC4KKyAgICAgICAgU3RyaW5nIHN0ciA9IFN0cmluZ1Ry
dW5jYXRvcjo6cmlnaHRUcnVuY2F0ZShpdGVtVGV4dCwgbWF4V2lkdGgsIGl0ZW1Gb250KTsKKyAg
ICAgICAgaWYgKHN0ciAhPSBpdGVtVGV4dCkgeworICAgICAgICAgICAgaXRlbVRleHQgPSBzdHI7
CisgICAgICAgICAgICAvLyBEb24ndCBkaXNwbGF5IHRoZSBsYWJlbCBvciBpY29uLCB3ZSBhbHJl
YWR5IGRvbid0IGhhdmUgZW5vdWdoIHJvb20gZm9yIHRoZSBpdGVtIHRleHQuCisgICAgICAgICAg
ICBpdGVtTGFiZWwgPSAiIjsKKyAgICAgICAgICAgIGl0ZW1JY29uID0gIiI7CisgICAgICAgIH0g
ZWxzZSBpZiAoIWl0ZW1MYWJlbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGludCBhdmFpbGFi
bGVXaWR0aCA9IG1heFdpZHRoIC0ga1RleHRUb0xhYmVsUGFkZGluZyAtCisgICAgICAgICAgICAg
ICAgU3RyaW5nVHJ1bmNhdG9yOjp3aWR0aChpdGVtVGV4dCwgaXRlbUZvbnQpOworICAgICAgICAg
ICAgaXRlbUxhYmVsID0gU3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKGl0ZW1MYWJlbCwg
YXZhaWxhYmxlV2lkdGgsIGl0ZW1Gb250KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFBy
ZXBhcmUgdGhlIGRpcmVjdGlvbmFsaXR5IHRvIGRyYXcgdGV4dC4KKyAgICBUZXh0UnVuIHRleHRS
dW4oaXRlbVRleHQuY2hhcmFjdGVycygpLCBpdGVtVGV4dC5sZW5ndGgoKSwgZmFsc2UsIDAsIDAs
IFRleHRSdW46OkFsbG93VHJhaWxpbmdFeHBhbnNpb24sIHN0eWxlLnRleHREaXJlY3Rpb24oKSwg
c3R5bGUuaGFzVGV4dERpcmVjdGlvbk92ZXJyaWRlKCkpOworICAgIC8vIElmIHRoZSB0ZXh0IGlz
IHJpZ2h0LXRvLWxlZnQsIG1ha2UgaXQgcmlnaHQtYWxpZ25lZCBieSBhZGp1c3RpbmcgaXRzCisg
ICAgLy8gYmVnaW5uaW5nIHBvc2l0aW9uLgorICAgIGlmIChyaWdodEFsaWduZWQpCisgICAgICAg
IHRleHRYICs9IG1heFdpZHRoIC0gaXRlbUZvbnQud2lkdGgodGV4dFJ1bik7CisKKyAgICAvLyBE
cmF3IHRoZSBpdGVtIHRleHQuCisgICAgaW50IHRleHRZID0gcm93UmVjdC55KCkgKyBpdGVtRm9u
dC5mb250TWV0cmljcygpLmFzY2VudCgpICsgKHJvd1JlY3QuaGVpZ2h0KCkgLSBpdGVtRm9udC5m
b250TWV0cmljcygpLmhlaWdodCgpKSAvIDI7CisgICAgZ2MtPmRyYXdCaWRpVGV4dChpdGVtRm9u
dCwgdGV4dFJ1biwgSW50UG9pbnQodGV4dFgsIHRleHRZKSk7CisKKyAgICAvLyBXZSBhcmUgdXNp
bmcgdGhlIGxlZnQgcGFkZGluZyBhcyB0aGUgcmlnaHQgcGFkZGluZyBpbmNsdWRlcyByb29tIGZv
ciB0aGUgc2Nyb2xsLWJhciB3aGljaAorICAgIC8vIGRvZXMgbm90IHNob3cgaW4gdGhpcyBjYXNl
LgorICAgIGludCByaWdodFBhZGRpbmcgPSBtYXgoMCwgbV9wb3B1cENsaWVudC0+Y2xpZW50UGFk
ZGluZ0xlZnQoKSAtIG1fcG9wdXBDbGllbnQtPmNsaWVudEluc2V0TGVmdCgpKTsKKyAgICBpbnQg
cmVtYWluaW5nV2lkdGggPSByb3dSZWN0LndpZHRoKCkgLSByaWdodFBhZGRpbmc7CisKKyAgICAv
LyBEcmF3IHRoZSBpY29uIGlmIGFwcGxpY2FibGUuCisgICAgUmVmUHRyPEltYWdlPiBpbWFnZShJ
bWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoaXRlbUljb24udXRmOCgpLmRhdGEoKSkpOworICAg
IGlmIChpbWFnZSAmJiAhaW1hZ2UtPmlzTnVsbCgpKSB7CisgICAgICAgIEludFJlY3QgaW1hZ2VS
ZWN0ID0gaW1hZ2UtPnJlY3QoKTsKKyAgICAgICAgcmVtYWluaW5nV2lkdGggLT0gKGltYWdlUmVj
dC53aWR0aCgpICsga0xhYmVsVG9JY29uUGFkZGluZyk7CisgICAgICAgIGltYWdlUmVjdC5zZXRY
KHJvd1JlY3Qud2lkdGgoKSAtIHJpZ2h0UGFkZGluZyAtIGltYWdlUmVjdC53aWR0aCgpKTsKKyAg
ICAgICAgaW1hZ2VSZWN0LnNldFkocm93UmVjdC55KCkgKyAocm93UmVjdC5oZWlnaHQoKSAtIGlt
YWdlUmVjdC5oZWlnaHQoKSkgLyAyKTsKKyAgICAgICAgZ2MtPmRyYXdJbWFnZShpbWFnZS5nZXQo
KSwgQ29sb3JTcGFjZURldmljZVJHQiwgaW1hZ2VSZWN0KTsKKyAgICB9CisKKyAgICAvLyBEcmF3
IHRoZSB0aGUgbGFiZWwgaWYgYXBwbGljYWJsZS4KKyAgICBpZiAoaXRlbUxhYmVsLmlzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gQXV0b2ZpbGwgbGFiZWwgaXMgMC45IHNtYWxs
ZXIgdGhhbiByZWd1bGFyIGZvbnQgc2l6ZS4KKyAgICBpZiAoc3R5bGUubWVudVR5cGUoKSA9PSBQ
b3B1cE1lbnVTdHlsZTo6QXV0b2ZpbGxQb3B1cCkgeworICAgICAgICBpdGVtRm9udCA9IG1fcG9w
dXBDbGllbnQtPml0ZW1TdHlsZShyb3dJbmRleCkuZm9udCgpOworICAgICAgICBGb250RGVzY3Jp
cHRpb24gZCA9IGl0ZW1Gb250LmZvbnREZXNjcmlwdGlvbigpOworICAgICAgICBkLnNldENvbXB1
dGVkU2l6ZShkLmNvbXB1dGVkU2l6ZSgpICogMC45KTsKKyAgICAgICAgaXRlbUZvbnQgPSBGb250
KGQsIGl0ZW1Gb250LmxldHRlclNwYWNpbmcoKSwgaXRlbUZvbnQud29yZFNwYWNpbmcoKSk7Cisg
ICAgICAgIGl0ZW1Gb250LnVwZGF0ZSgwKTsKKyAgICB9CisKKyAgICBUZXh0UnVuIGxhYmVsVGV4
dFJ1bihpdGVtTGFiZWwuY2hhcmFjdGVycygpLCBpdGVtTGFiZWwubGVuZ3RoKCksIGZhbHNlLCAw
LCAwLCBUZXh0UnVuOjpBbGxvd1RyYWlsaW5nRXhwYW5zaW9uLCBzdHlsZS50ZXh0RGlyZWN0aW9u
KCksIHN0eWxlLmhhc1RleHREaXJlY3Rpb25PdmVycmlkZSgpKTsKKyAgICBpZiAocmlnaHRBbGln
bmVkKQorICAgICAgICB0ZXh0WCA9IG1heCgwLCBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5n
TGVmdCgpIC0gbV9wb3B1cENsaWVudC0+Y2xpZW50SW5zZXRMZWZ0KCkpOworICAgIGVsc2UKKyAg
ICAgICAgdGV4dFggPSByZW1haW5pbmdXaWR0aCAtIGl0ZW1Gb250LndpZHRoKGxhYmVsVGV4dFJ1
bik7CisKKyAgICBnYy0+c2V0RmlsbENvbG9yKGxhYmVsQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VS
R0IpOworICAgIGdjLT5kcmF3QmlkaVRleHQoaXRlbUZvbnQsIGxhYmVsVGV4dFJ1biwgSW50UG9p
bnQodGV4dFgsIHRleHRZKSk7Cit9CisKK0ZvbnQgUG9wdXBMaXN0Qm94OjpnZXRSb3dGb250KGlu
dCByb3dJbmRleCkKK3sKKyAgICBGb250IGl0ZW1Gb250ID0gbV9wb3B1cENsaWVudC0+aXRlbVN0
eWxlKHJvd0luZGV4KS5mb250KCk7CisgICAgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1Jc0xhYmVs
KHJvd0luZGV4KSkgeworICAgICAgICAvLyBCb2xkLWlmeSBsYWJlbHMgKGllLCBhbiA8b3B0Z3Jv
dXA+IGhlYWRpbmcpLgorICAgICAgICBGb250RGVzY3JpcHRpb24gZCA9IGl0ZW1Gb250LmZvbnRE
ZXNjcmlwdGlvbigpOworICAgICAgICBkLnNldFdlaWdodChGb250V2VpZ2h0Qm9sZCk7CisgICAg
ICAgIEZvbnQgZm9udChkLCBpdGVtRm9udC5sZXR0ZXJTcGFjaW5nKCksIGl0ZW1Gb250LndvcmRT
cGFjaW5nKCkpOworICAgICAgICBmb250LnVwZGF0ZSgwKTsKKyAgICAgICAgcmV0dXJuIGZvbnQ7
CisgICAgfQorCisgICAgcmV0dXJuIGl0ZW1Gb250OworfQorCit2b2lkIFBvcHVwTGlzdEJveDo6
YWJhbmRvbigpCit7CisgICAgUmVmUHRyPFBvcHVwTGlzdEJveD4ga2VlcEFsaXZlKHRoaXMpOwor
CisgICAgbV9zZWxlY3RlZEluZGV4ID0gbV9vcmlnaW5hbEluZGV4OworCisgICAgaGlkZVBvcHVw
KCk7CisKKyAgICBpZiAobV9hY2NlcHRlZEluZGV4T25BYmFuZG9uID49IDApIHsKKyAgICAgICAg
aWYgKG1fcG9wdXBDbGllbnQpCisgICAgICAgICAgICBtX3BvcHVwQ2xpZW50LT52YWx1ZUNoYW5n
ZWQobV9hY2NlcHRlZEluZGV4T25BYmFuZG9uKTsKKyAgICAgICAgbV9hY2NlcHRlZEluZGV4T25B
YmFuZG9uID0gLTE7CisgICAgfQorfQorCitpbnQgUG9wdXBMaXN0Qm94Ojpwb2ludFRvUm93SW5k
ZXgoY29uc3QgSW50UG9pbnQmIHBvaW50KQoreworICAgIGludCB5ID0gc2Nyb2xsWSgpICsgcG9p
bnQueSgpOworCisgICAgLy8gRklYTUU6IGJpbmFyeSBzZWFyY2ggaWYgcGVyZiBtYXR0ZXJzLgor
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtSXRlbXMoKTsgKytpKSB7CisgICAgICAgIGlmICh5
IDwgbV9pdGVtc1tpXS0+eU9mZnNldCkKKyAgICAgICAgICAgIHJldHVybiBpLTE7CisgICAgfQor
CisgICAgLy8gTGFzdCBpdGVtPworICAgIGlmICh5IDwgY29udGVudHNIZWlnaHQoKSkKKyAgICAg
ICAgcmV0dXJuIG1faXRlbXMuc2l6ZSgpLTE7CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2Jvb2wg
UG9wdXBMaXN0Qm94OjphY2NlcHRJbmRleChpbnQgaW5kZXgpCit7CisgICAgLy8gQ2xlYXIgbV9h
Y2NlcHRlZEluZGV4T25BYmFuZG9uIG9uY2UgdXNlciBhY2NlcHRzIHRoZSBzZWxlY3RlZCBpbmRl
eC4KKyAgICBpZiAobV9hY2NlcHRlZEluZGV4T25BYmFuZG9uID49IDApCisgICAgICAgIG1fYWNj
ZXB0ZWRJbmRleE9uQWJhbmRvbiA9IC0xOworCisgICAgaWYgKGluZGV4ID49IG51bUl0ZW1zKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAg
aWYgKG1fcG9wdXBDbGllbnQpIHsKKyAgICAgICAgICAgIC8vIEVudGVyIHByZXNzZWQgd2l0aCBu
byBzZWxlY3Rpb24sIGp1c3QgY2xvc2UgdGhlIHBvcHVwLgorICAgICAgICAgICAgaGlkZVBvcHVw
KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChp
c1NlbGVjdGFibGVJdGVtKGluZGV4KSkgeworICAgICAgICBSZWZQdHI8UG9wdXBMaXN0Qm94PiBr
ZWVwQWxpdmUodGhpcyk7CisKKyAgICAgICAgLy8gSGlkZSBvdXJzZWx2ZXMgZmlyc3Qgc2luY2Ug
dmFsdWVDaGFuZ2VkIG1heSBoYXZlIG51bWVyb3VzIHNpZGUtZWZmZWN0cy4KKyAgICAgICAgaGlk
ZVBvcHVwKCk7CisKKyAgICAgICAgLy8gVGVsbCB0aGUgPHNlbGVjdD4gUG9wdXBNZW51Q2xpZW50
IHdoYXQgaW5kZXggd2FzIHNlbGVjdGVkLgorICAgICAgICBtX3BvcHVwQ2xpZW50LT52YWx1ZUNo
YW5nZWQoaW5kZXgpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVy
biBmYWxzZTsKK30KKwordm9pZCBQb3B1cExpc3RCb3g6OnNlbGVjdEluZGV4KGludCBpbmRleCkK
K3sKKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG51bUl0ZW1zKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGJvb2wgaXNTZWxlY3RhYmxlID0gaXNTZWxlY3RhYmxlSXRlbShpbmRleCk7
CisgICAgaWYgKGluZGV4ICE9IG1fc2VsZWN0ZWRJbmRleCAmJiBpc1NlbGVjdGFibGUpIHsKKyAg
ICAgICAgaW52YWxpZGF0ZVJvdyhtX3NlbGVjdGVkSW5kZXgpOworICAgICAgICBtX3NlbGVjdGVk
SW5kZXggPSBpbmRleDsKKyAgICAgICAgaW52YWxpZGF0ZVJvdyhtX3NlbGVjdGVkSW5kZXgpOwor
CisgICAgICAgIHNjcm9sbFRvUmV2ZWFsU2VsZWN0aW9uKCk7CisgICAgICAgIG1fcG9wdXBDbGll
bnQtPnNlbGVjdGlvbkNoYW5nZWQobV9zZWxlY3RlZEluZGV4KTsKKyAgICB9IGVsc2UgaWYgKCFp
c1NlbGVjdGFibGUpCisgICAgICAgIGNsZWFyU2VsZWN0aW9uKCk7Cit9CisKK3ZvaWQgUG9wdXBM
aXN0Qm94OjpzZXRPcmlnaW5hbEluZGV4KGludCBpbmRleCkKK3sKKyAgICBtX29yaWdpbmFsSW5k
ZXggPSBtX3NlbGVjdGVkSW5kZXggPSBpbmRleDsKK30KKworaW50IFBvcHVwTGlzdEJveDo6Z2V0
Um93SGVpZ2h0KGludCBpbmRleCkKK3sKKyAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICByZXR1
cm4gUG9wdXBNZW51Q2hyb21pdW06Om1pbmltdW1Sb3dIZWlnaHQoKTsKKworICAgIGlmIChtX3Bv
cHVwQ2xpZW50LT5pdGVtU3R5bGUoaW5kZXgpLmlzRGlzcGxheU5vbmUoKSkKKyAgICAgICAgcmV0
dXJuIFBvcHVwTWVudUNocm9taXVtOjptaW5pbXVtUm93SGVpZ2h0KCk7CisKKyAgICAvLyBTZXBh
cmF0b3Igcm93IGhlaWdodCBpcyB0aGUgc2FtZSBzaXplIGFzIGl0c2VsZi4KKyAgICBpZiAobV9w
b3B1cENsaWVudC0+aXRlbUlzU2VwYXJhdG9yKGluZGV4KSkKKyAgICAgICAgcmV0dXJuIG1heChz
ZXBhcmF0b3JIZWlnaHQsIFBvcHVwTWVudUNocm9taXVtOjptaW5pbXVtUm93SGVpZ2h0KCkpOwor
CisgICAgU3RyaW5nIGljb24gPSBtX3BvcHVwQ2xpZW50LT5pdGVtSWNvbihpbmRleCk7CisgICAg
UmVmUHRyPEltYWdlPiBpbWFnZShJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoaWNvbi51dGY4
KCkuZGF0YSgpKSk7CisKKyAgICBpbnQgZm9udEhlaWdodCA9IGdldFJvd0ZvbnQoaW5kZXgpLmZv
bnRNZXRyaWNzKCkuaGVpZ2h0KCk7CisgICAgaW50IGljb25IZWlnaHQgPSAoaW1hZ2UgJiYgIWlt
YWdlLT5pc051bGwoKSkgPyBpbWFnZS0+cmVjdCgpLmhlaWdodCgpIDogMDsKKworICAgIGludCBs
aW5lUGFkZGluZ0hlaWdodCA9IG1fcG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpLm1lbnVUeXBlKCkg
PT0gUG9wdXBNZW51U3R5bGU6OkF1dG9maWxsUG9wdXAgPyBrTGluZVBhZGRpbmdIZWlnaHQgOiAw
OworICAgIGludCBjYWxjdWxhdGVkUm93SGVpZ2h0ID0gbWF4KGZvbnRIZWlnaHQsIGljb25IZWln
aHQpICsgbGluZVBhZGRpbmdIZWlnaHQgKiAyOworICAgIHJldHVybiBtYXgoY2FsY3VsYXRlZFJv
d0hlaWdodCwgUG9wdXBNZW51Q2hyb21pdW06Om1pbmltdW1Sb3dIZWlnaHQoKSk7Cit9CisKK0lu
dFJlY3QgUG9wdXBMaXN0Qm94OjpnZXRSb3dCb3VuZHMoaW50IGluZGV4KQoreworICAgIGlmIChp
bmRleCA8IDApCisgICAgICAgIHJldHVybiBJbnRSZWN0KDAsIDAsIHZpc2libGVXaWR0aCgpLCBn
ZXRSb3dIZWlnaHQoaW5kZXgpKTsKKworICAgIHJldHVybiBJbnRSZWN0KDAsIG1faXRlbXNbaW5k
ZXhdLT55T2Zmc2V0LCB2aXNpYmxlV2lkdGgoKSwgZ2V0Um93SGVpZ2h0KGluZGV4KSk7Cit9CisK
K3ZvaWQgUG9wdXBMaXN0Qm94OjppbnZhbGlkYXRlUm93KGludCBpbmRleCkKK3sKKyAgICBpZiAo
aW5kZXggPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBJbnZhbGlkYXRlIGluIHRoZSB3
aW5kb3cgY29udGVudHMsIGFzIEZyYW1lbGVzc1Njcm9sbFZpZXc6OmludmFsaWRhdGVSZWN0Cisg
ICAgLy8gcGFpbnRzIGluIHRoZSB3aW5kb3cgY29vcmRpbmF0ZXMuCisgICAgaW52YWxpZGF0ZVJl
Y3QoY29udGVudHNUb1dpbmRvdyhnZXRSb3dCb3VuZHMoaW5kZXgpKSk7Cit9CisKK3ZvaWQgUG9w
dXBMaXN0Qm94OjpzY3JvbGxUb1JldmVhbFJvdyhpbnQgaW5kZXgpCit7CisgICAgaWYgKGluZGV4
IDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCByb3dSZWN0ID0gZ2V0Um93Qm91
bmRzKGluZGV4KTsKKworICAgIGlmIChyb3dSZWN0LnkoKSA8IHNjcm9sbFkoKSkgeworICAgICAg
ICAvLyBSb3cgaXMgYWJvdmUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24sIHNjcm9sbCB1cC4KKyAg
ICAgICAgU2Nyb2xsVmlldzo6c2V0U2Nyb2xsUG9zaXRpb24oSW50UG9pbnQoMCwgcm93UmVjdC55
KCkpKTsKKyAgICB9IGVsc2UgaWYgKHJvd1JlY3QubWF4WSgpID4gc2Nyb2xsWSgpICsgdmlzaWJs
ZUhlaWdodCgpKSB7CisgICAgICAgIC8vIFJvdyBpcyBiZWxvdyBjdXJyZW50IHNjcm9sbCBwb3Np
dGlvbiwgc2Nyb2xsIGRvd24uCisgICAgICAgIFNjcm9sbFZpZXc6OnNldFNjcm9sbFBvc2l0aW9u
KEludFBvaW50KDAsIHJvd1JlY3QubWF4WSgpIC0gdmlzaWJsZUhlaWdodCgpKSk7CisgICAgfQor
fQorCitib29sIFBvcHVwTGlzdEJveDo6aXNTZWxlY3RhYmxlSXRlbShpbnQgaW5kZXgpCit7Cisg
ICAgQVNTRVJUKGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1JdGVtcygpKTsKKyAgICByZXR1cm4g
bV9pdGVtc1tpbmRleF0tPnR5cGUgPT0gUG9wdXBJdGVtOjpUeXBlT3B0aW9uICYmIG1fcG9wdXBD
bGllbnQtPml0ZW1Jc0VuYWJsZWQoaW5kZXgpOworfQorCit2b2lkIFBvcHVwTGlzdEJveDo6Y2xl
YXJTZWxlY3Rpb24oKQoreworICAgIGlmIChtX3NlbGVjdGVkSW5kZXggIT0gLTEpIHsKKyAgICAg
ICAgaW52YWxpZGF0ZVJvdyhtX3NlbGVjdGVkSW5kZXgpOworICAgICAgICBtX3NlbGVjdGVkSW5k
ZXggPSAtMTsKKyAgICAgICAgbV9wb3B1cENsaWVudC0+c2VsZWN0aW9uQ2xlYXJlZCgpOworICAg
IH0KK30KKwordm9pZCBQb3B1cExpc3RCb3g6OnNlbGVjdE5leHRSb3coKQoreworICAgIGlmICgh
bV9zZXR0aW5ncy5sb29wU2VsZWN0aW9uTmF2aWdhdGlvbiB8fCBtX3NlbGVjdGVkSW5kZXggIT0g
bnVtSXRlbXMoKSAtIDEpIHsKKyAgICAgICAgYWRqdXN0U2VsZWN0ZWRJbmRleCgxKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdlIGFyZSBtb3ZpbmcgcGFzdCB0aGUgbGFzdCBp
dGVtLCBubyByb3cgc2hvdWxkIGJlIHNlbGVjdGVkLgorICAgIGNsZWFyU2VsZWN0aW9uKCk7Cit9
CisKK3ZvaWQgUG9wdXBMaXN0Qm94OjpzZWxlY3RQcmV2aW91c1JvdygpCit7CisgICAgaWYgKCFt
X3NldHRpbmdzLmxvb3BTZWxlY3Rpb25OYXZpZ2F0aW9uIHx8IG1fc2VsZWN0ZWRJbmRleCA+IDAp
IHsKKyAgICAgICAgYWRqdXN0U2VsZWN0ZWRJbmRleCgtMSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBpZiAoIW1fc2VsZWN0ZWRJbmRleCkgeworICAgICAgICAvLyBXZSBhcmUgbW92
aW5nIHBhc3QgdGhlIGZpcnN0IGl0ZW0sIGNsZWFyIHRoZSBzZWxlY3Rpb24uCisgICAgICAgIGNs
ZWFyU2VsZWN0aW9uKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBObyByb3cg
aXMgc2VsZWN0ZWQsIGp1bXAgdG8gdGhlIGxhc3QgaXRlbS4KKyAgICBzZWxlY3RJbmRleChudW1J
dGVtcygpIC0gMSk7CisgICAgc2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24oKTsKK30KKwordm9pZCBQ
b3B1cExpc3RCb3g6OmFkanVzdFNlbGVjdGVkSW5kZXgoaW50IGRlbHRhKQoreworICAgIGludCB0
YXJnZXRJbmRleCA9IG1fc2VsZWN0ZWRJbmRleCArIGRlbHRhOworICAgIHRhcmdldEluZGV4ID0g
bWluKG1heCh0YXJnZXRJbmRleCwgMCksIG51bUl0ZW1zKCkgLSAxKTsKKyAgICBpZiAoIWlzU2Vs
ZWN0YWJsZUl0ZW0odGFyZ2V0SW5kZXgpKSB7CisgICAgICAgIC8vIFdlIGRpZG4ndCBsYW5kIG9u
IGFuIG9wdGlvbi4gVHJ5IHRvIGZpbmQgb25lLgorICAgICAgICAvLyBXZSB0cnkgdG8gc2VsZWN0
IHRoZSBjbG9zZXN0IGluZGV4IHRvIHRhcmdldCwgcHJpb3JpdGl6aW5nIGFueSBpbgorICAgICAg
ICAvLyB0aGUgcmFuZ2UgW2N1cnJlbnQsIHRhcmdldF0uCisKKyAgICAgICAgaW50IGRpciA9IGRl
bHRhID4gMCA/IDEgOiAtMTsKKyAgICAgICAgaW50IHRlc3RJbmRleCA9IG1fc2VsZWN0ZWRJbmRl
eDsKKyAgICAgICAgaW50IGJlc3RJbmRleCA9IG1fc2VsZWN0ZWRJbmRleDsKKyAgICAgICAgYm9v
bCBwYXNzZWRUYXJnZXQgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKHRlc3RJbmRleCA+PSAwICYm
IHRlc3RJbmRleCA8IG51bUl0ZW1zKCkpIHsKKyAgICAgICAgICAgIGlmIChpc1NlbGVjdGFibGVJ
dGVtKHRlc3RJbmRleCkpCisgICAgICAgICAgICAgICAgYmVzdEluZGV4ID0gdGVzdEluZGV4Owor
ICAgICAgICAgICAgaWYgKHRlc3RJbmRleCA9PSB0YXJnZXRJbmRleCkKKyAgICAgICAgICAgICAg
ICBwYXNzZWRUYXJnZXQgPSB0cnVlOworICAgICAgICAgICAgaWYgKHBhc3NlZFRhcmdldCAmJiBi
ZXN0SW5kZXggIT0gbV9zZWxlY3RlZEluZGV4KQorICAgICAgICAgICAgICAgIGJyZWFrOworCisg
ICAgICAgICAgICB0ZXN0SW5kZXggKz0gZGlyOworICAgICAgICB9CisKKyAgICAgICAgLy8gUGlj
ayB0aGUgYmVzdCBpbmRleCwgd2hpY2ggbWF5IG1lYW4gd2UgZG9uJ3QgY2hhbmdlLgorICAgICAg
ICB0YXJnZXRJbmRleCA9IGJlc3RJbmRleDsKKyAgICB9CisKKyAgICAvLyBTZWxlY3QgdGhlIG5l
dyBpbmRleCwgYW5kIGVuc3VyZSBpdHMgdmlzaWJsZS4gV2UgZG8gdGhpcyByZWdhcmRsZXNzIG9m
CisgICAgLy8gd2hldGhlciB0aGUgc2VsZWN0aW9uIGNoYW5nZWQgdG8gZW5zdXJlIGtleWJvYXJk
IGV2ZW50cyBhbHdheXMgYnJpbmcgdGhlCisgICAgLy8gc2VsZWN0aW9uIGludG8gdmlldy4KKyAg
ICBzZWxlY3RJbmRleCh0YXJnZXRJbmRleCk7CisgICAgc2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24o
KTsKK30KKwordm9pZCBQb3B1cExpc3RCb3g6OmhpZGVQb3B1cCgpCit7CisgICAgaWYgKHBhcmVu
dCgpKSB7CisgICAgICAgIFBvcHVwQ29udGFpbmVyKiBjb250YWluZXIgPSBzdGF0aWNfY2FzdDxQ
b3B1cENvbnRhaW5lcio+KHBhcmVudCgpKTsKKyAgICAgICAgaWYgKGNvbnRhaW5lci0+Y2xpZW50
KCkpCisgICAgICAgICAgICBjb250YWluZXItPmNsaWVudCgpLT5wb3B1cENsb3NlZChjb250YWlu
ZXIpOworICAgICAgICBjb250YWluZXItPm5vdGlmeVBvcHVwSGlkZGVuKCk7CisgICAgfQorCisg
ICAgaWYgKG1fcG9wdXBDbGllbnQpCisgICAgICAgIG1fcG9wdXBDbGllbnQtPnBvcHVwRGlkSGlk
ZSgpOworfQorCit2b2lkIFBvcHVwTGlzdEJveDo6dXBkYXRlRnJvbUVsZW1lbnQoKQoreworICAg
IGNsZWFyKCk7CisKKyAgICBpbnQgc2l6ZSA9IG1fcG9wdXBDbGllbnQtPmxpc3RTaXplKCk7Cisg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgUG9wdXBJdGVtOjpU
eXBlIHR5cGU7CisgICAgICAgIGlmIChtX3BvcHVwQ2xpZW50LT5pdGVtSXNTZXBhcmF0b3IoaSkp
CisgICAgICAgICAgICB0eXBlID0gUG9wdXBJdGVtOjpUeXBlU2VwYXJhdG9yOworICAgICAgICBl
bHNlIGlmIChtX3BvcHVwQ2xpZW50LT5pdGVtSXNMYWJlbChpKSkKKyAgICAgICAgICAgIHR5cGUg
PSBQb3B1cEl0ZW06OlR5cGVHcm91cDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZSA9
IFBvcHVwSXRlbTo6VHlwZU9wdGlvbjsKKyAgICAgICAgbV9pdGVtcy5hcHBlbmQobmV3IFBvcHVw
SXRlbShtX3BvcHVwQ2xpZW50LT5pdGVtVGV4dChpKSwgdHlwZSkpOworICAgICAgICBtX2l0ZW1z
W2ldLT5lbmFibGVkID0gaXNTZWxlY3RhYmxlSXRlbShpKTsKKyAgICAgICAgUG9wdXBNZW51U3R5
bGUgc3R5bGUgPSBtX3BvcHVwQ2xpZW50LT5pdGVtU3R5bGUoaSk7CisgICAgICAgIG1faXRlbXNb
aV0tPnRleHREaXJlY3Rpb24gPSBzdHlsZS50ZXh0RGlyZWN0aW9uKCk7CisgICAgICAgIG1faXRl
bXNbaV0tPmhhc1RleHREaXJlY3Rpb25PdmVycmlkZSA9IHN0eWxlLmhhc1RleHREaXJlY3Rpb25P
dmVycmlkZSgpOworICAgIH0KKworICAgIG1fc2VsZWN0ZWRJbmRleCA9IG1fcG9wdXBDbGllbnQt
PnNlbGVjdGVkSW5kZXgoKTsKKyAgICBzZXRPcmlnaW5hbEluZGV4KG1fc2VsZWN0ZWRJbmRleCk7
CisKKyAgICBsYXlvdXQoKTsKK30KKwordm9pZCBQb3B1cExpc3RCb3g6OnNldE1heFdpZHRoQW5k
TGF5b3V0KGludCBtYXhXaWR0aCkKK3sKKyAgICBtX21heFdpbmRvd1dpZHRoID0gbWF4V2lkdGg7
CisgICAgbGF5b3V0KCk7Cit9CisKK3ZvaWQgUG9wdXBMaXN0Qm94OjpsYXlvdXQoKQoreworICAg
IGJvb2wgaXNSaWdodEFsaWduZWQgPSBtX3BvcHVwQ2xpZW50LT5tZW51U3R5bGUoKS50ZXh0RGly
ZWN0aW9uKCkgPT0gUlRMOworCisgICAgLy8gU2l6ZSBvdXIgY2hpbGQgaXRlbXMuCisgICAgaW50
IGJhc2VXaWR0aCA9IDA7CisgICAgaW50IHBhZGRpbmdXaWR0aCA9IDA7CisgICAgaW50IGxpbmVF
bmRQYWRkaW5nV2lkdGggPSAwOworICAgIGludCB5ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsg
aSA8IG51bUl0ZW1zKCk7ICsraSkgeworICAgICAgICAvLyBQbGFjZSB0aGUgaXRlbSB2ZXJ0aWNh
bGx5LgorICAgICAgICBtX2l0ZW1zW2ldLT55T2Zmc2V0ID0geTsKKyAgICAgICAgaWYgKG1fcG9w
dXBDbGllbnQtPml0ZW1TdHlsZShpKS5pc0Rpc3BsYXlOb25lKCkpCisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgeSArPSBnZXRSb3dIZWlnaHQoaSk7CisKKyAgICAgICAgLy8gRW5zdXJl
IHRoZSBwb3B1cCBpcyB3aWRlIGVub3VnaCB0byBmaXQgdGhpcyBpdGVtLgorICAgICAgICBGb250
IGl0ZW1Gb250ID0gZ2V0Um93Rm9udChpKTsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBtX3BvcHVw
Q2xpZW50LT5pdGVtVGV4dChpKTsKKyAgICAgICAgU3RyaW5nIGxhYmVsID0gbV9wb3B1cENsaWVu
dC0+aXRlbUxhYmVsKGkpOworICAgICAgICBTdHJpbmcgaWNvbiA9IG1fcG9wdXBDbGllbnQtPml0
ZW1JY29uKGkpOworICAgICAgICBSZWZQdHI8SW1hZ2U+IGljb25JbWFnZShJbWFnZTo6bG9hZFBs
YXRmb3JtUmVzb3VyY2UoaWNvbi51dGY4KCkuZGF0YSgpKSk7CisgICAgICAgIGludCB3aWR0aCA9
IDA7CisgICAgICAgIGlmICghdGV4dC5pc0VtcHR5KCkpCisgICAgICAgICAgICB3aWR0aCA9IGl0
ZW1Gb250LndpZHRoKFRleHRSdW4odGV4dCkpOworICAgICAgICBpZiAoIWxhYmVsLmlzRW1wdHko
KSkgeworICAgICAgICAgICAgaWYgKHdpZHRoID4gMCkKKyAgICAgICAgICAgICAgICB3aWR0aCAr
PSBrVGV4dFRvTGFiZWxQYWRkaW5nOworICAgICAgICAgICAgd2lkdGggKz0gaXRlbUZvbnQud2lk
dGgoVGV4dFJ1bihsYWJlbCkpOworICAgICAgICB9CisgICAgICAgIGlmIChpY29uSW1hZ2UgJiYg
IWljb25JbWFnZS0+aXNOdWxsKCkpIHsKKyAgICAgICAgICAgIGlmICh3aWR0aCA+IDApCisgICAg
ICAgICAgICAgICAgd2lkdGggKz0ga0xhYmVsVG9JY29uUGFkZGluZzsKKyAgICAgICAgICAgIHdp
ZHRoICs9IGljb25JbWFnZS0+cmVjdCgpLndpZHRoKCk7CisgICAgICAgIH0KKworICAgICAgICBi
YXNlV2lkdGggPSBtYXgoYmFzZVdpZHRoLCB3aWR0aCk7CisgICAgICAgIC8vIEZJWE1FOiBodHRw
Oi8vYi8xMjEwNDgxIFdlIHNob3VsZCBnZXQgdGhlIHBhZGRpbmcgb2YgaW5kaXZpZHVhbCBvcHRp
b24gZWxlbWVudHMuCisgICAgICAgIHBhZGRpbmdXaWR0aCA9IG1heChwYWRkaW5nV2lkdGgsCisg
ICAgICAgICAgICBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nTGVmdCgpICsgbV9wb3B1cENs
aWVudC0+Y2xpZW50UGFkZGluZ1JpZ2h0KCkpOworICAgICAgICBsaW5lRW5kUGFkZGluZ1dpZHRo
ID0gbWF4KGxpbmVFbmRQYWRkaW5nV2lkdGgsCisgICAgICAgICAgICBpc1JpZ2h0QWxpZ25lZCA/
IG1fcG9wdXBDbGllbnQtPmNsaWVudFBhZGRpbmdMZWZ0KCkgOiBtX3BvcHVwQ2xpZW50LT5jbGll
bnRQYWRkaW5nUmlnaHQoKSk7CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIHNjcm9sbCBiYXIg
d2lkdGguCisgICAgaW50IHdpbmRvd0hlaWdodCA9IDA7CisgICAgbV92aXNpYmxlUm93cyA9IG1p
bihudW1JdGVtcygpLCBrTWF4VmlzaWJsZVJvd3MpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCBtX3Zpc2libGVSb3dzOyArK2kpIHsKKyAgICAgICAgaW50IHJvd0hlaWdodCA9IGdldFJvd0hl
aWdodChpKTsKKworICAgICAgICAvLyBPbmx5IGNsaXAgdGhlIHdpbmRvdyBoZWlnaHQgZm9yIG5v
bi1NYWMgcGxhdGZvcm1zLgorICAgICAgICBpZiAod2luZG93SGVpZ2h0ICsgcm93SGVpZ2h0ID4g
bV9tYXhIZWlnaHQpIHsKKyAgICAgICAgICAgIG1fdmlzaWJsZVJvd3MgPSBpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB3aW5kb3dIZWlnaHQgKz0gcm93SGVpZ2h0
OworICAgIH0KKworICAgIC8vIFNldCBvdXIgd2lkZ2V0IGFuZCBzY3JvbGxhYmxlIGNvbnRlbnRz
IHNpemVzLgorICAgIGludCBzY3JvbGxiYXJXaWR0aCA9IDA7CisgICAgaWYgKG1fdmlzaWJsZVJv
d3MgPCBudW1JdGVtcygpKSB7CisgICAgICAgIHNjcm9sbGJhcldpZHRoID0gU2Nyb2xsYmFyVGhl
bWU6Om5hdGl2ZVRoZW1lKCktPnNjcm9sbGJhclRoaWNrbmVzcygpOworCisgICAgICAgIC8vIFVz
ZSBrTWluRW5kT2ZMaW5lUGFkZGluZyB3aGVuIHRoZXJlIGlzIGEgc2Nyb2xsYmFyIHNvIHRoYXQg
d2UgdXNlCisgICAgICAgIC8vIGFzIG11Y2ggYXMgKGxpbmVFbmRQYWRkaW5nV2lkdGggLSBrTWlu
RW5kT2ZMaW5lUGFkZGluZykgcGFkZGluZworICAgICAgICAvLyBzcGFjZSBmb3Igc2Nyb2xsYmFy
IGFuZCBhbGxvdyB1c2VyIHRvIHVzZSBDU1MgcGFkZGluZyB0byBtYWtlIHRoZQorICAgICAgICAv
LyBwb3B1cCBsaXN0Ym94IGFsaWduIHdpdGggdGhlIHNlbGVjdCBlbGVtZW50LgorICAgICAgICBw
YWRkaW5nV2lkdGggPSBwYWRkaW5nV2lkdGggLSBsaW5lRW5kUGFkZGluZ1dpZHRoICsga01pbkVu
ZE9mTGluZVBhZGRpbmc7CisgICAgfQorCisgICAgaW50IHdpbmRvd1dpZHRoOworICAgIGludCBj
b250ZW50V2lkdGg7CisgICAgaWYgKG1fc2V0dGluZ3MucmVzdHJpY3RXaWR0aE9mTGlzdEJveCkg
eworICAgICAgICB3aW5kb3dXaWR0aCA9IG1fYmFzZVdpZHRoOworICAgICAgICBjb250ZW50V2lk
dGggPSBtX2Jhc2VXaWR0aCAtIHNjcm9sbGJhcldpZHRoOworICAgIH0gZWxzZSB7CisgICAgICAg
IHdpbmRvd1dpZHRoID0gYmFzZVdpZHRoICsgc2Nyb2xsYmFyV2lkdGggKyBwYWRkaW5nV2lkdGg7
CisgICAgICAgIGlmICh3aW5kb3dXaWR0aCA+IG1fbWF4V2luZG93V2lkdGgpIHsKKyAgICAgICAg
ICAgIC8vIHdpbmRvd1dpZHRoIGV4Y2VlZHMgbV9tYXhXaW5kb3dXaWR0aCwgc28gd2UgaGF2ZSB0
byBjbGlwLgorICAgICAgICAgICAgd2luZG93V2lkdGggPSBtX21heFdpbmRvd1dpZHRoOworICAg
ICAgICAgICAgYmFzZVdpZHRoID0gd2luZG93V2lkdGggLSBzY3JvbGxiYXJXaWR0aCAtIHBhZGRp
bmdXaWR0aDsKKyAgICAgICAgICAgIG1fYmFzZVdpZHRoID0gYmFzZVdpZHRoOworICAgICAgICB9
CisgICAgICAgIGNvbnRlbnRXaWR0aCA9IHdpbmRvd1dpZHRoIC0gc2Nyb2xsYmFyV2lkdGg7CisK
KyAgICAgICAgaWYgKHdpbmRvd1dpZHRoIDwgbV9iYXNlV2lkdGgpIHsKKyAgICAgICAgICAgIHdp
bmRvd1dpZHRoID0gbV9iYXNlV2lkdGg7CisgICAgICAgICAgICBjb250ZW50V2lkdGggPSBtX2Jh
c2VXaWR0aCAtIHNjcm9sbGJhcldpZHRoOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1f
YmFzZVdpZHRoID0gYmFzZVdpZHRoOworICAgIH0KKworICAgIHJlc2l6ZSh3aW5kb3dXaWR0aCwg
d2luZG93SGVpZ2h0KTsKKyAgICBzZXRDb250ZW50c1NpemUoSW50U2l6ZShjb250ZW50V2lkdGgs
IGdldFJvd0JvdW5kcyhudW1JdGVtcygpIC0gMSkubWF4WSgpKSk7CisKKyAgICBpZiAoaG9zdFdp
bmRvdygpKQorICAgICAgICBzY3JvbGxUb1JldmVhbFNlbGVjdGlvbigpOworCisgICAgaW52YWxp
ZGF0ZSgpOworfQorCit2b2lkIFBvcHVwTGlzdEJveDo6Y2xlYXIoKQoreworICAgIGZvciAoVmVj
dG9yPFBvcHVwSXRlbSo+OjppdGVyYXRvciBpdCA9IG1faXRlbXMuYmVnaW4oKTsgaXQgIT0gbV9p
dGVtcy5lbmQoKTsgKytpdCkKKyAgICAgICAgZGVsZXRlICppdDsKKyAgICBtX2l0ZW1zLmNsZWFy
KCk7Cit9CisKK2Jvb2wgUG9wdXBMaXN0Qm94Ojppc1BvaW50SW5Cb3VuZHMoY29uc3QgSW50UG9p
bnQmIHBvaW50KQoreworICAgIHJldHVybiBudW1JdGVtcygpICYmIEludFJlY3QoMCwgMCwgd2lk
dGgoKSwgaGVpZ2h0KCkpLmNvbnRhaW5zKHBvaW50KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBM
aXN0Qm94LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cExpc3RCb3gu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi40Y2VjM2E0MWFlNzA1MWE2MDE5MDlmMWEwMTU5ZjY5NjJhMWIxZTQ2Ci0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBM
aXN0Qm94LmgKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5l
aXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgUG9wdXBMaXN0Qm94X2gKKyNkZWZpbmUg
UG9wdXBMaXN0Qm94X2gKKworI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJGb250U2VsZWN0
b3IuaCIKKyNpbmNsdWRlICJGcmFtZWxlc3NTY3JvbGxWaWV3LmgiCisjaW5jbHVkZSAiSW50UmVj
dC5oIgorI2luY2x1ZGUgIk5vZGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit0eXBlZGVm
IHVuc2lnbmVkIGxvbmcgbG9uZyBUaW1lU3RhbXA7CisKK3N0YXRpYyBjb25zdCBpbnQga0xhYmVs
VG9JY29uUGFkZGluZyA9IDU7CitzdGF0aWMgY29uc3QgaW50IGtMaW5lUGFkZGluZ0hlaWdodCA9
IDM7IC8vIFBhZGRpbmcgaGVpZ2h0IHB1dCBhdCB0aGUgdG9wIGFuZCBib3R0b20gb2YgZWFjaCBs
aW5lLgorc3RhdGljIGNvbnN0IGludCBrTWF4SGVpZ2h0ID0gNTAwOworc3RhdGljIGNvbnN0IGlu
dCBrTWF4VmlzaWJsZVJvd3MgPSAyMDsKK3N0YXRpYyBjb25zdCBpbnQga01pbkVuZE9mTGluZVBh
ZGRpbmcgPSAyOworc3RhdGljIGNvbnN0IGludCBrVGV4dFRvTGFiZWxQYWRkaW5nID0gMTA7Citz
dGF0aWMgY29uc3QgVGltZVN0YW1wIGtUeXBlQWhlYWRUaW1lb3V0TXMgPSAxMDAwOworCitjbGFz
cyBHcmFwaGljc0NvbnRleHQ7CitjbGFzcyBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ7CitjbGFzcyBQ
bGF0Zm9ybU1vdXNlRXZlbnQ7CisjaWYgRU5BQkxFKEdFU1RVUkVfRVZFTlRTKQorY2xhc3MgUGxh
dGZvcm1HZXN0dXJlRXZlbnQ7CisjZW5kaWYKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorY2xh
c3MgUGxhdGZvcm1Ub3VjaEV2ZW50OworI2VuZGlmCitjbGFzcyBQbGF0Zm9ybVdoZWVsRXZlbnQ7
CitjbGFzcyBQb3B1cE1lbnVDbGllbnQ7CisKK3N0cnVjdCBQb3B1cENvbnRhaW5lclNldHRpbmdz
IHsKKyAgICAvLyBXaGV0aGVyIHRoZSBQb3B1cE1lbnVDbGllbnQgc2hvdWxkIGJlIHRvbGQgdG8g
Y2hhbmdlIGl0cyB0ZXh0IHdoZW4gYQorICAgIC8vIG5ldyBpdGVtIGlzIHNlbGVjdGVkIGJ5IHVz
aW5nIHRoZSBhcnJvdyBrZXlzLgorICAgIGJvb2wgc2V0VGV4dE9uSW5kZXhDaGFuZ2U7CisKKyAg
ICAvLyBXaGV0aGVyIHRoZSBzZWxlY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIHdoZW4gdGhlIHBv
cHVwIG1lbnUgaXMKKyAgICAvLyBjbG9zZWQgKHRocm91Z2ggRVNDIGJlaW5nIHByZXNzZWQgb3Ig
dGhlIGZvY3VzIGdvaW5nIGF3YXkpLgorICAgIC8vIE5vdGUgdGhhdCB3aGVuIFRBQiBpcyBwcmVz
c2VkLCB0aGUgc2VsZWN0aW9uIGlzIGFsd2F5cyBhY2NlcHRlZAorICAgIC8vIHJlZ2FyZGxlc3Mg
b2YgdGhpcyBzZXR0aW5nLgorICAgIGJvb2wgYWNjZXB0T25BYmFuZG9uOworCisgICAgLy8gV2hl
dGhlciB3ZSBzaG91bGQgbW92ZSB0aGUgc2VsZWN0aW9uIHRvIHRoZSBmaXJzdC9sYXN0IGl0ZW0g
d2hlbgorICAgIC8vIHRoZSB1c2VyIHByZXNzZXMgZG93bi91cCBhcnJvdyBrZXlzIGFuZCB0aGUg
bGFzdC9maXJzdCBpdGVtIGlzCisgICAgLy8gc2VsZWN0ZWQuCisgICAgYm9vbCBsb29wU2VsZWN0
aW9uTmF2aWdhdGlvbjsKKworICAgIC8vIFdoZXRoZXIgd2Ugc2hvdWxkIHJlc3RyaWN0IHRoZSB3
aWR0aCBvZiB0aGUgUG9wdXBMaXN0Qm94IG9yIG5vdC4KKyAgICAvLyBBdXRvY29tcGxldGUgcG9w
dXBzIGFyZSByZXN0cmljdGVkLCBjb21iby1ib3hlcyAoc2VsZWN0IHRhZ3MpIGFyZW4ndC4KKyAg
ICBib29sIHJlc3RyaWN0V2lkdGhPZkxpc3RCb3g7Cit9OworCisvLyBBIGNvbnRhaW5lciBmb3Ig
dGhlIGRhdGEgZm9yIGVhY2ggbWVudSBpdGVtIChlLmcuIHJlcHJlc2VudGVkIGJ5IDxvcHRpb24+
CisvLyBvciA8b3B0Z3JvdXA+IGluIGEgPHNlbGVjdD4gd2lkZ2V0KSBhbmQgaXMgdXNlZCBieSBQ
b3B1cExpc3RCb3guCitzdHJ1Y3QgUG9wdXBJdGVtIHsKKyAgICBlbnVtIFR5cGUgeworICAgICAg
ICBUeXBlT3B0aW9uLAorICAgICAgICBUeXBlR3JvdXAsCisgICAgICAgIFR5cGVTZXBhcmF0b3IK
KyAgICB9OworCisgICAgUG9wdXBJdGVtKGNvbnN0IFN0cmluZyYgbGFiZWwsIFR5cGUgdHlwZSkK
KyAgICAgICAgOiBsYWJlbChsYWJlbCkKKyAgICAgICAgLCB0eXBlKHR5cGUpCisgICAgICAgICwg
eU9mZnNldCgwKQorICAgIHsKKyAgICB9CisgICAgU3RyaW5nIGxhYmVsOworICAgIFR5cGUgdHlw
ZTsKKyAgICBpbnQgeU9mZnNldDsgLy8geSBvZmZzZXQgb2YgdGhpcyBpdGVtLCByZWxhdGl2ZSB0
byB0aGUgdG9wIG9mIHRoZSBwb3B1cC4KKyAgICBUZXh0RGlyZWN0aW9uIHRleHREaXJlY3Rpb247
CisgICAgYm9vbCBoYXNUZXh0RGlyZWN0aW9uT3ZlcnJpZGU7CisgICAgYm9vbCBlbmFibGVkOwor
fTsKKworLy8gVGhpcyBjbGFzcyB1c2VzIFdlYkNvcmUgY29kZSB0byBwYWludCBhbmQgaGFuZGxl
IGV2ZW50cyBmb3IgYSBkcm9wLWRvd24gbGlzdAorLy8gYm94ICgiY29tYm9ib3giIG9uIFdpbmRv
d3MpLgorY2xhc3MgUG9wdXBMaXN0Qm94IDogcHVibGljIEZyYW1lbGVzc1Njcm9sbFZpZXcgewor
cHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFBvcHVwTGlzdEJveD4gY3JlYXRlKFBvcHVw
TWVudUNsaWVudCogY2xpZW50LCBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJiBzZXR0aW5n
cykKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgUG9wdXBMaXN0Qm94KGNsaWVu
dCwgc2V0dGluZ3MpKTsKKyAgICB9CisKKyAgICAvLyBGcmFtZWxlc3NTY3JvbGxWaWV3CisgICAg
dmlydHVhbCB2b2lkIHBhaW50KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmKTsKKyAg
ICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VEb3duRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2
ZW50Jik7CisgICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRm
b3JtTW91c2VFdmVudCYpOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZVJlbGVhc2VFdmVu
dChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlV2hl
ZWxFdmVudChjb25zdCBQbGF0Zm9ybVdoZWVsRXZlbnQmKTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFu
ZGxlS2V5RXZlbnQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50Jik7CisjaWYgRU5BQkxFKFRP
VUNIX0VWRU5UUykKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlVG91Y2hFdmVudChjb25zdCBQbGF0
Zm9ybVRvdWNoRXZlbnQmKTsKKyNlbmRpZgorI2lmIEVOQUJMRShHRVNUVVJFX1JFQ09HTklaRVIp
CisgICAgdmlydHVhbCBib29sIGhhbmRsZUdlc3R1cmVFdmVudChjb25zdCBQbGF0Zm9ybUdlc3R1
cmVFdmVudCYpOworI2VuZGlmCisKKyAgICAvLyBTY3JvbGxWaWV3CisgICAgdmlydHVhbCBIb3N0
V2luZG93KiBob3N0V2luZG93KCkgY29uc3Q7CisKKyAgICAvLyBQb3B1cExpc3RCb3ggbWV0aG9k
cworCisgICAgLy8gSGlkZXMgdGhlIHBvcHVwLgorICAgIHZvaWQgaGlkZVBvcHVwKCk7CisKKyAg
ICAvLyBVcGRhdGVzIG91ciBpbnRlcm5hbCBsaXN0IHRvIG1hdGNoIHRoZSBjbGllbnQuCisgICAg
dm9pZCB1cGRhdGVGcm9tRWxlbWVudCgpOworCisgICAgLy8gRnJlZXMgYW55IGFsbG9jYXRlZCBy
ZXNvdXJjZXMgdXNlZCBpbiBhIHBhcnRpY3VsYXIgcG9wdXAgc2Vzc2lvbi4KKyAgICB2b2lkIGNs
ZWFyKCk7CisKKyAgICAvLyBTZXRzIHRoZSBpbmRleCBvZiB0aGUgb3B0aW9uIHRoYXQgaXMgZGlz
cGxheWVkIGluIHRoZSA8c2VsZWN0PiB3aWRnZXQgaW4gdGhlIHBhZ2UKKyAgICB2b2lkIHNldE9y
aWdpbmFsSW5kZXgoaW50KTsKKworICAgIC8vIEdldHMgdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRo
YXQgdGhlIHVzZXIgaXMgY3VycmVudGx5IG1vdXNlZCBvdmVyIG9yIGhhcyBzZWxlY3RlZCB3aXRo
CisgICAgLy8gdGhlIGtleWJvYXJkLiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgb3JpZ2lu
YWwgaW5kZXgsIHNpbmNlIHRoZSB1c2VyIGhhcyBub3QgeWV0CisgICAgLy8gYWNjZXB0ZWQgdGhp
cyBpbnB1dC4KKyAgICBpbnQgc2VsZWN0ZWRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fc2VsZWN0
ZWRJbmRleDsgfQorCisgICAgLy8gTW92ZXMgc2VsZWN0aW9uIGRvd24vdXAgdGhlIGdpdmVuIG51
bWJlciBvZiBpdGVtcywgc2Nyb2xsaW5nIGlmIG5lY2Vzc2FyeS4KKyAgICAvLyBQb3NpdGl2ZSBp
cyBkb3duLiBUaGUgcmVzdWx0aW5nIGluZGV4IHdpbGwgYmUgY2xhbXBlZCB0byB0aGUgcmFuZ2UK
KyAgICAvLyBbMCwgbnVtSXRlbXMpLCBhbmQgbm9uLW9wdGlvbiBpdGVtcyB3aWxsIGJlIHNraXBw
ZWQuCisgICAgdm9pZCBhZGp1c3RTZWxlY3RlZEluZGV4KGludCBkZWx0YSk7CisKKyAgICAvLyBS
ZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGxpc3QuCisgICAgaW50IG51bUl0ZW1z
KCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihtX2l0ZW1zLnNpemUoKSk7IH0KKwor
ICAgIHZvaWQgc2V0QmFzZVdpZHRoKGludCB3aWR0aCkgeyBtX2Jhc2VXaWR0aCA9IHN0ZDo6bWlu
KG1fbWF4V2luZG93V2lkdGgsIHdpZHRoKTsgfQorCisgICAgLy8gQ29tcHV0ZXMgdGhlIHNpemUg
b2Ygd2lkZ2V0IGFuZCBjaGlsZHJlbi4KKyAgICB2b2lkIGxheW91dCgpOworCisgICAgLy8gUmV0
dXJucyB3aGV0aGVyIHRoZSBwb3B1cCB3YW50cyB0byBwcm9jZXNzIGV2ZW50cyBmb3IgdGhlIHBh
c3NlZCBrZXkuCisgICAgYm9vbCBpc0ludGVyZXN0ZWRJbkV2ZW50Rm9yS2V5KGludCBrZXlDb2Rl
KTsKKworICAgIC8vIEdldHMgdGhlIGhlaWdodCBvZiBhIHJvdy4KKyAgICBpbnQgZ2V0Um93SGVp
Z2h0KGludCBpbmRleCk7CisKKyAgICB2b2lkIHNldE1heEhlaWdodChpbnQgbWF4SGVpZ2h0KSB7
IG1fbWF4SGVpZ2h0ID0gbWF4SGVpZ2h0OyB9CisKKyAgICB2b2lkIHNldE1heFdpZHRoKGludCBt
YXhXaWR0aCkgeyBtX21heFdpbmRvd1dpZHRoID0gbWF4V2lkdGg7IH0KKworICAgIHZvaWQgc2V0
TWF4V2lkdGhBbmRMYXlvdXQoaW50KTsKKworICAgIHZvaWQgZGlzY29ubmVjdENsaWVudCgpIHsg
bV9wb3B1cENsaWVudCA9IDA7IH0KKworICAgIGNvbnN0IFZlY3RvcjxQb3B1cEl0ZW0qPiYgaXRl
bXMoKSBjb25zdCB7IHJldHVybiBtX2l0ZW1zOyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNs
YXNzIFBvcHVwQ29udGFpbmVyOworICAgIGZyaWVuZCBjbGFzcyBSZWZDb3VudGVkPFBvcHVwTGlz
dEJveD47CisKKyAgICBQb3B1cExpc3RCb3goUG9wdXBNZW51Q2xpZW50KiwgY29uc3QgUG9wdXBD
b250YWluZXJTZXR0aW5ncyYpOworCisgICAgflBvcHVwTGlzdEJveCgpCisgICAgeworICAgICAg
ICBjbGVhcigpOworICAgIH0KKworICAgIC8vIENsb3NlcyB0aGUgcG9wdXAKKyAgICB2b2lkIGFi
YW5kb24oKTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0aW9uIGNhbiBiZSBj
aGFuZ2VkIHRvIGluZGV4LgorICAgIC8vIERpc2FibGVkIGl0ZW1zLCBvciBsYWJlbHMgY2Fubm90
IGJlIHNlbGVjdGVkLgorICAgIGJvb2wgaXNTZWxlY3RhYmxlSXRlbShpbnQgaW5kZXgpOworCisg
ICAgLy8gU2VsZWN0IGFuIGluZGV4IGluIHRoZSBsaXN0LCBzY3JvbGxpbmcgaWYgbmVjZXNzYXJ5
LgorICAgIHZvaWQgc2VsZWN0SW5kZXgoaW50IGluZGV4KTsKKworICAgIC8vIEFjY2VwdHMgdGhl
IHNlbGVjdGVkIGluZGV4IGFzIHRoZSB2YWx1ZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIDxzZWxl
Y3Q+IHdpZGdldCBvbgorICAgIC8vIHRoZSB3ZWIgcGFnZSwgYW5kIGNsb3NlcyB0aGUgcG9wdXAu
IFJldHVybnMgdHJ1ZSBpZiBpbmRleCBpcyBhY2NlcHRlZC4KKyAgICBib29sIGFjY2VwdEluZGV4
KGludCBpbmRleCk7CisKKyAgICAvLyBDbGVhcnMgdGhlIHNlbGVjdGlvbiAoc28gbm8gcm93IGFw
cGVhcnMgc2VsZWN0ZWQpLgorICAgIHZvaWQgY2xlYXJTZWxlY3Rpb24oKTsKKworICAgIC8vIFNj
cm9sbHMgdG8gcmV2ZWFsIHRoZSBnaXZlbiBpbmRleC4KKyAgICB2b2lkIHNjcm9sbFRvUmV2ZWFs
Um93KGludCBpbmRleCk7CisgICAgdm9pZCBzY3JvbGxUb1JldmVhbFNlbGVjdGlvbigpIHsgc2Ny
b2xsVG9SZXZlYWxSb3cobV9zZWxlY3RlZEluZGV4KTsgfQorCisgICAgLy8gSW52YWxpZGF0ZXMg
dGhlIHJvdyBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgdm9pZCBpbnZhbGlkYXRlUm93KGludCBp
bmRleCk7CisKKyAgICAvLyBHZXQgdGhlIGJvdW5kcyBvZiBhIHJvdy4KKyAgICBJbnRSZWN0IGdl
dFJvd0JvdW5kcyhpbnQgaW5kZXgpOworCisgICAgLy8gQ29udmVydHMgYSBwb2ludCB0byBhbiBp
bmRleCBvZiB0aGUgcm93IHRoZSBwb2ludCBpcyBvdmVyCisgICAgaW50IHBvaW50VG9Sb3dJbmRl
eChjb25zdCBJbnRQb2ludCYpOworCisgICAgLy8gUGFpbnQgYW4gaW5kaXZpZHVhbCByb3cKKyAg
ICB2b2lkIHBhaW50Um93KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmLCBpbnQgcm93
SW5kZXgpOworCisgICAgLy8gVGVzdCBpZiB0aGUgZ2l2ZW4gcG9pbnQgaXMgd2l0aGluIHRoZSBi
b3VuZHMgb2YgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICBib29sIGlzUG9pbnRJbkJvdW5kcyhjb25z
dCBJbnRQb2ludCYpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBhIHRl
eHQga2V5LiBEb2VzIGEgcHJlZml4LXNlYXJjaCBvZiB0aGUgaXRlbXMuCisgICAgdm9pZCB0eXBl
QWhlYWRGaW5kKGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYpOworCisgICAgLy8gUmV0dXJu
cyB0aGUgZm9udCB0byB1c2UgZm9yIHRoZSBnaXZlbiByb3cKKyAgICBGb250IGdldFJvd0ZvbnQo
aW50IGluZGV4KTsKKworICAgIC8vIE1vdmVzIHRoZSBzZWxlY3Rpb24gZG93bi91cCBvbmUgaXRl
bSwgdGFraW5nIGNhcmUgb2YgbG9vcGluZyBiYWNrIHRvIHRoZQorICAgIC8vIGZpcnN0L2xhc3Qg
ZWxlbWVudCBpZiBtX2xvb3BTZWxlY3Rpb25OYXZpZ2F0aW9uIGlzIHRydWUuCisgICAgdm9pZCBz
ZWxlY3RQcmV2aW91c1JvdygpOworICAgIHZvaWQgc2VsZWN0TmV4dFJvdygpOworCisgICAgLy8g
VGhlIHNldHRpbmdzIHRoYXQgc3BlY2lmeSB0aGUgYmVoYXZpb3IgZm9yIHRoaXMgUG9wdXAgd2lu
ZG93LgorICAgIFBvcHVwQ29udGFpbmVyU2V0dGluZ3MgbV9zZXR0aW5nczsKKworICAgIC8vIFRo
aXMgaXMgdGhlIGluZGV4IG9mIHRoZSBpdGVtIG1hcmtlZCBhcyAic2VsZWN0ZWQiIC0gaS5lLiBk
aXNwbGF5ZWQgaW4gdGhlIHdpZGdldCBvbiB0aGUKKyAgICAvLyBwYWdlLgorICAgIGludCBtX29y
aWdpbmFsSW5kZXg7CisKKyAgICAvLyBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0aGF0
IHRoZSB1c2VyIGlzIGhvdmVyZWQgb3ZlciBvciBoYXMgc2VsZWN0ZWQgdXNpbmcgdGhlCisgICAg
Ly8ga2V5Ym9hcmQgaW4gdGhlIGxpc3QuIFRoZXkgaGF2ZSBub3QgY29uZmlybWVkIHRoaXMgc2Vs
ZWN0aW9uIGJ5IGNsaWNraW5nIG9yIHByZXNzaW5nCisgICAgLy8gZW50ZXIgeWV0IGhvd2V2ZXIu
CisgICAgaW50IG1fc2VsZWN0ZWRJbmRleDsKKworICAgIC8vIElmID49IDAsIHRoaXMgaXMgdGhl
IGluZGV4IHdlIHNob3VsZCBhY2NlcHQgaWYgdGhlIHBvcHVwIGlzICJhYmFuZG9uZWQiLgorICAg
IC8vIFRoaXMgaXMgdXNlZCBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbiwgd2hlcmUgd2Ugd2FudCB0
aGUKKyAgICAvLyBzZWxlY3Rpb24gdG8gY2hhbmdlIGltbWVkaWF0ZWx5LCBhbmQgaXMgb25seSB1
c2VkIGlmIHRoZSBzZXR0aW5ncworICAgIC8vIGFjY2VwdE9uQWJhbmRvbiBmaWVsZCBpcyB0cnVl
LgorICAgIGludCBtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb247CisKKyAgICAvLyBUaGlzIGlzIHRo
ZSBudW1iZXIgb2Ygcm93cyB2aXNpYmxlIGluIHRoZSBwb3B1cC4gVGhlIG1heGltdW0gbnVtYmVy
IHZpc2libGUgYXQgYSB0aW1lIGlzCisgICAgLy8gZGVmaW5lZCBhcyBiZWluZyBrTWF4VmlzaWJs
ZVJvd3MuIEZvciBhIHNjcm9sbGVkIHBvcHVwLCB0aGlzIGNhbiBiZSB0aG91Z2h0IG9mIGFzIHRo
ZQorICAgIC8vIHBhZ2Ugc2l6ZSBpbiBkYXRhIHVuaXRzLgorICAgIGludCBtX3Zpc2libGVSb3dz
OworCisgICAgLy8gT3VyIHN1Z2dlc3RlZCB3aWR0aCwgbm90IGluY2x1ZGluZyBzY3JvbGxiYXIu
CisgICAgaW50IG1fYmFzZVdpZHRoOworCisgICAgLy8gVGhlIG1heGltdW0gaGVpZ2h0IHdlIGNh
biBiZSB3aXRob3V0IGJlaW5nIG9mZi1zY3JlZW4uCisgICAgaW50IG1fbWF4SGVpZ2h0OworCisg
ICAgLy8gQSBsaXN0IG9mIHRoZSBvcHRpb25zIGNvbnRhaW5lZCB3aXRoaW4gdGhlIDxzZWxlY3Q+
CisgICAgVmVjdG9yPFBvcHVwSXRlbSo+IG1faXRlbXM7CisKKyAgICAvLyBUaGUgPHNlbGVjdD4g
UG9wdXBNZW51Q2xpZW50IHRoYXQgb3BlbmVkIHVzLgorICAgIFBvcHVwTWVudUNsaWVudCogbV9w
b3B1cENsaWVudDsKKworICAgIC8vIFRoZSBzY3JvbGxiYXIgd2hpY2ggaGFzIG1vdXNlIGNhcHR1
cmUuIE1vdXNlIGV2ZW50cyBnbyBzdHJhaWdodCB0byB0aGlzCisgICAgLy8gaWYgbm90IG51bGwu
CisgICAgUmVmUHRyPFNjcm9sbGJhcj4gbV9jYXB0dXJpbmdTY3JvbGxiYXI7CisKKyAgICAvLyBU
aGUgbGFzdCBzY3JvbGxiYXIgdGhhdCB0aGUgbW91c2Ugd2FzIG92ZXIuIFVzZWQgZm9yIG1vdXNl
b3ZlciBoaWdobGlnaHRzLgorICAgIFJlZlB0cjxTY3JvbGxiYXI+IG1fbGFzdFNjcm9sbGJhclVu
ZGVyTW91c2U7CisKKyAgICAvLyBUaGUgc3RyaW5nIHRoZSB1c2VyIGhhcyB0eXBlZCBzbyBmYXIg
aW50byB0aGUgcG9wdXAuIFVzZWQgZm9yIHR5cGVBaGVhZEZpbmQuCisgICAgU3RyaW5nIG1fdHlw
ZWRTdHJpbmc7CisKKyAgICAvLyBUaGUgY2hhciB0aGUgdXNlciBoYXMgaGl0IHJlcGVhdGVkbHku
IFVzZWQgZm9yIHR5cGVBaGVhZEZpbmQuCisgICAgVUNoYXIgbV9yZXBlYXRpbmdDaGFyOworCisg
ICAgLy8gVGhlIGxhc3QgdGltZSB0aGUgdXNlciBoaXQgYSBrZXkuIFVzZWQgZm9yIHR5cGVBaGVh
ZEZpbmQuCisgICAgVGltZVN0YW1wIG1fbGFzdENoYXJUaW1lOworCisgICAgLy8gSWYgd2lkdGgg
ZXhlZWRzIHNjcmVlbiB3aWR0aCwgd2UgaGF2ZSB0byBjbGlwIGl0LgorICAgIGludCBtX21heFdp
bmRvd1dpZHRoOworCisgICAgLy8gVG8gZm9yd2FyZCBsYXN0IG1vdXNlIHJlbGVhc2UgZXZlbnQu
CisgICAgUmVmUHRyPE5vZGU+IG1fZm9jdXNlZE5vZGU7CisKK307CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9j
aHJvbWl1bS9Qb3B1cE1lbnVDaHJvbWl1bS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9j
aHJvbWl1bS9Qb3B1cE1lbnVDaHJvbWl1bS5jcHAKaW5kZXggNDM4YTI5YTU4NjU5NmUzZDliMjNk
OGZkNjIzNzZmYWIzZGIxNDA0Mi4uM2IyZjJhZTlmZTM0MzI4YWJjZWRiM2Q5NWExOWYxOGU1MTI5
NGMyMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBN
ZW51Q2hyb21pdW0uY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1Bv
cHVwTWVudUNocm9taXVtLmNwcApAQCAtMzEsNjMgKzMxLDEyIEBACiAKICNpbmNsdWRlICJjb25m
aWcuaCIKICNpbmNsdWRlICJQb3B1cE1lbnVDaHJvbWl1bS5oIgotCi0jaW5jbHVkZSAiQ2hyb21l
LmgiCi0jaW5jbHVkZSAiQ2hyb21lQ2xpZW50Q2hyb21pdW0uaCIKLSNpbmNsdWRlICJGb250Lmgi
Ci0jaW5jbHVkZSAiRm9udFNlbGVjdG9yLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5j
bHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZWxlc3NTY3JvbGxWaWV3LmgiCi0jaW5jbHVk
ZSAiRnJhbWVsZXNzU2Nyb2xsVmlld0NsaWVudC5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgotI2luY2x1ZGUgIkludFJlY3QuaCIKLSNpbmNsdWRlICJLZXlib2FyZENvZGVzLmgiCi0j
aW5jbHVkZSAiUGFnZS5oIgotI2luY2x1ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVudC5oIgotI2lu
Y2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgotI2luY2x1ZGUgIlBsYXRmb3JtU2NyZWVuLmgi
Ci0jaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50LmgiCi0jaW5jbHVkZSAiUG9wdXBNZW51Q2xp
ZW50LmgiCi0jaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKLSNpbmNsdWRlICJTY3JvbGxiYXJUaGVt
ZS5oIgotI2luY2x1ZGUgIlN0cmluZ1RydW5jYXRvci5oIgotI2luY2x1ZGUgIlN5c3RlbVRpbWUu
aCIKLSNpbmNsdWRlICJUZXh0UnVuLmgiCi0jaW5jbHVkZSAiVXNlckdlc3R1cmVJbmRpY2F0b3Iu
aCIKLSNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KLSNpbmNsdWRlIDx3dGYvdW5pY29kZS9D
aGFyYWN0ZXJOYW1lcy5oPgotCi0jaWYgRU5BQkxFKEdFU1RVUkVfRVZFTlRTKQotI2luY2x1ZGUg
IlBsYXRmb3JtR2VzdHVyZUV2ZW50LmgiCi0jZW5kaWYKLQotI2lmIEVOQUJMRShUT1VDSF9FVkVO
VFMpCi0jaW5jbHVkZSAiUGxhdGZvcm1Ub3VjaEV2ZW50LmgiCi0jZW5kaWYKLQotdXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBXVEY7Ci11c2luZyBuYW1lc3BhY2UgVW5pY29k
ZTsKLQotdXNpbmcgc3RkOjptaW47Ci11c2luZyBzdGQ6Om1heDsKKyNpbmNsdWRlICJQb3B1cENv
bnRhaW5lci5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGludCBQb3B1cE1lbnVDaHJvbWl1
bTo6c19taW5pbXVtUm93SGVpZ2h0ID0gMDsKIAotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcg
VGltZVN0YW1wOwotCi1zdGF0aWMgY29uc3QgaW50IGtNYXhWaXNpYmxlUm93cyA9IDIwOwotc3Rh
dGljIGNvbnN0IGludCBrTWF4SGVpZ2h0ID0gNTAwOwotc3RhdGljIGNvbnN0IGludCBrQm9yZGVy
U2l6ZSA9IDE7Ci1zdGF0aWMgY29uc3QgaW50IGtUZXh0VG9MYWJlbFBhZGRpbmcgPSAxMDsKLXN0
YXRpYyBjb25zdCBpbnQga0xhYmVsVG9JY29uUGFkZGluZyA9IDU7Ci1zdGF0aWMgY29uc3QgaW50
IGtNaW5FbmRPZkxpbmVQYWRkaW5nID0gMjsKLXN0YXRpYyBjb25zdCBUaW1lU3RhbXAga1R5cGVB
aGVhZFRpbWVvdXRNcyA9IDEwMDA7Ci1zdGF0aWMgY29uc3QgaW50IGtMaW5lUGFkZGluZ0hlaWdo
dCA9IDM7IC8vIFBhZGRpbmcgaGVpZ2h0IHB1dCBhdCB0aGUgdG9wIGFuZCBib3R0b20gb2YgZWFj
aCBsaW5lLgotCiAvLyBUaGUgc2V0dGluZ3MgdXNlZCBmb3IgdGhlIGRyb3AgZG93biBtZW51Lgog
Ly8gVGhpcyBpcyB0aGUgZGVsZWdhdGUgdXNlZCBpZiBub25lIGlzIHByb3ZpZGVkLgogc3RhdGlj
IGNvbnN0IFBvcHVwQ29udGFpbmVyU2V0dGluZ3MgZHJvcERvd25TZXR0aW5ncyA9IHsKQEAgLTk3
LDE0NDkgKzQ2LDYgQEAgc3RhdGljIGNvbnN0IFBvcHVwQ29udGFpbmVyU2V0dGluZ3MgZHJvcERv
d25TZXR0aW5ncyA9IHsKICAgICBmYWxzZSAvLyByZXN0cmljdFdpZHRoT2ZMaXN0Qm94CiB9Owog
Ci0vLyBUaGlzIGNsYXNzIHVzZXMgV2ViQ29yZSBjb2RlIHRvIHBhaW50IGFuZCBoYW5kbGUgZXZl
bnRzIGZvciBhIGRyb3AtZG93biBsaXN0Ci0vLyBib3ggKCJjb21ib2JveCIgb24gV2luZG93cyku
Ci1jbGFzcyBQb3B1cExpc3RCb3ggOiBwdWJsaWMgRnJhbWVsZXNzU2Nyb2xsVmlldyB7Ci1wdWJs
aWM6Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8UG9wdXBMaXN0Qm94PiBjcmVhdGUoUG9wdXBNZW51
Q2xpZW50KiBjbGllbnQsIGNvbnN0IFBvcHVwQ29udGFpbmVyU2V0dGluZ3MmIHNldHRpbmdzKQot
ICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBQb3B1cExpc3RCb3goY2xpZW50LCBz
ZXR0aW5ncykpOwotICAgIH0KLQotICAgIC8vIEZyYW1lbGVzc1Njcm9sbFZpZXcKLSAgICB2aXJ0
dWFsIHZvaWQgcGFpbnQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYpOwotICAgIHZp
cnR1YWwgYm9vbCBoYW5kbGVNb3VzZURvd25FdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQm
KTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1N
b3VzZUV2ZW50Jik7Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGNv
bnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOwotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVXaGVlbEV2
ZW50KGNvbnN0IFBsYXRmb3JtV2hlZWxFdmVudCYpOwotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVL
ZXlFdmVudChjb25zdCBQbGF0Zm9ybUtleWJvYXJkRXZlbnQmKTsKLSNpZiBFTkFCTEUoVE9VQ0hf
RVZFTlRTKQotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBsYXRmb3Jt
VG91Y2hFdmVudCYpOwotI2VuZGlmCi0jaWYgRU5BQkxFKEdFU1RVUkVfUkVDT0dOSVpFUikKLSAg
ICB2aXJ0dWFsIGJvb2wgaGFuZGxlR2VzdHVyZUV2ZW50KGNvbnN0IFBsYXRmb3JtR2VzdHVyZUV2
ZW50Jik7Ci0jZW5kaWYKLQotICAgIC8vIFNjcm9sbFZpZXcKLSAgICB2aXJ0dWFsIEhvc3RXaW5k
b3cqIGhvc3RXaW5kb3coKSBjb25zdDsKLQotICAgIC8vIFBvcHVwTGlzdEJveCBtZXRob2RzCi0K
LSAgICAvLyBIaWRlcyB0aGUgcG9wdXAuCi0gICAgdm9pZCBoaWRlUG9wdXAoKTsKLQotICAgIC8v
IFVwZGF0ZXMgb3VyIGludGVybmFsIGxpc3QgdG8gbWF0Y2ggdGhlIGNsaWVudC4KLSAgICB2b2lk
IHVwZGF0ZUZyb21FbGVtZW50KCk7Ci0KLSAgICAvLyBGcmVlcyBhbnkgYWxsb2NhdGVkIHJlc291
cmNlcyB1c2VkIGluIGEgcGFydGljdWxhciBwb3B1cCBzZXNzaW9uLgotICAgIHZvaWQgY2xlYXIo
KTsKLQotICAgIC8vIFNldHMgdGhlIGluZGV4IG9mIHRoZSBvcHRpb24gdGhhdCBpcyBkaXNwbGF5
ZWQgaW4gdGhlIDxzZWxlY3Q+IHdpZGdldCBpbiB0aGUgcGFnZQotICAgIHZvaWQgc2V0T3JpZ2lu
YWxJbmRleChpbnQgaW5kZXgpOwotCi0gICAgLy8gR2V0cyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0g
dGhhdCB0aGUgdXNlciBpcyBjdXJyZW50bHkgbW91c2VkIG92ZXIgb3IgaGFzIHNlbGVjdGVkIHdp
dGgKLSAgICAvLyB0aGUga2V5Ym9hcmQuIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBvcmln
aW5hbCBpbmRleCwgc2luY2UgdGhlIHVzZXIgaGFzIG5vdCB5ZXQKLSAgICAvLyBhY2NlcHRlZCB0
aGlzIGlucHV0LgotICAgIGludCBzZWxlY3RlZEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9zZWxl
Y3RlZEluZGV4OyB9Ci0KLSAgICAvLyBNb3ZlcyBzZWxlY3Rpb24gZG93bi91cCB0aGUgZ2l2ZW4g
bnVtYmVyIG9mIGl0ZW1zLCBzY3JvbGxpbmcgaWYgbmVjZXNzYXJ5LgotICAgIC8vIFBvc2l0aXZl
IGlzIGRvd24uICBUaGUgcmVzdWx0aW5nIGluZGV4IHdpbGwgYmUgY2xhbXBlZCB0byB0aGUgcmFu
Z2UKLSAgICAvLyBbMCwgbnVtSXRlbXMpLCBhbmQgbm9uLW9wdGlvbiBpdGVtcyB3aWxsIGJlIHNr
aXBwZWQuCi0gICAgdm9pZCBhZGp1c3RTZWxlY3RlZEluZGV4KGludCBkZWx0YSk7Ci0KLSAgICAv
LyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGxpc3QuCi0gICAgaW50IG51bUl0
ZW1zKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihtX2l0ZW1zLnNpemUoKSk7IH0K
LQotICAgIHZvaWQgc2V0QmFzZVdpZHRoKGludCB3aWR0aCkgeyBtX2Jhc2VXaWR0aCA9IG1pbiht
X21heFdpbmRvd1dpZHRoLCB3aWR0aCk7IH0KLQotICAgIC8vIENvbXB1dGVzIHRoZSBzaXplIG9m
IHdpZGdldCBhbmQgY2hpbGRyZW4uCi0gICAgdm9pZCBsYXlvdXQoKTsKLQotICAgIC8vIFJldHVy
bnMgd2hldGhlciB0aGUgcG9wdXAgd2FudHMgdG8gcHJvY2VzcyBldmVudHMgZm9yIHRoZSBwYXNz
ZWQga2V5LgotICAgIGJvb2wgaXNJbnRlcmVzdGVkSW5FdmVudEZvcktleShpbnQga2V5Q29kZSk7
Ci0KLSAgICAvLyBHZXRzIHRoZSBoZWlnaHQgb2YgYSByb3cuCi0gICAgaW50IGdldFJvd0hlaWdo
dChpbnQgaW5kZXgpOwotCi0gICAgdm9pZCBzZXRNYXhIZWlnaHQoaW50IG1heEhlaWdodCkgeyBt
X21heEhlaWdodCA9IG1heEhlaWdodDsgfQotCi0gICAgdm9pZCBzZXRNYXhXaWR0aChpbnQgbWF4
V2lkdGgpIHsgbV9tYXhXaW5kb3dXaWR0aCA9IG1heFdpZHRoOyB9Ci0KLSAgICB2b2lkIHNldE1h
eFdpZHRoQW5kTGF5b3V0KGludCk7Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3RDbGllbnQoKSB7IG1f
cG9wdXBDbGllbnQgPSAwOyB9Ci0KLSAgICBjb25zdCBWZWN0b3I8UG9wdXBJdGVtKj4mIGl0ZW1z
KCkgY29uc3QgeyByZXR1cm4gbV9pdGVtczsgfQotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFz
cyBQb3B1cENvbnRhaW5lcjsKLSAgICBmcmllbmQgY2xhc3MgUmVmQ291bnRlZDxQb3B1cExpc3RC
b3g+OwotCi0gICAgUG9wdXBMaXN0Qm94KFBvcHVwTWVudUNsaWVudCogY2xpZW50LCBjb25zdCBQ
b3B1cENvbnRhaW5lclNldHRpbmdzJiBzZXR0aW5ncykKLSAgICAgICAgOiBtX3NldHRpbmdzKHNl
dHRpbmdzKQotICAgICAgICAsIG1fb3JpZ2luYWxJbmRleCgwKQotICAgICAgICAsIG1fc2VsZWN0
ZWRJbmRleCgwKQotICAgICAgICAsIG1fYWNjZXB0ZWRJbmRleE9uQWJhbmRvbigtMSkKLSAgICAg
ICAgLCBtX3Zpc2libGVSb3dzKDApCi0gICAgICAgICwgbV9iYXNlV2lkdGgoMCkKLSAgICAgICAg
LCBtX21heEhlaWdodChrTWF4SGVpZ2h0KQotICAgICAgICAsIG1fcG9wdXBDbGllbnQoY2xpZW50
KQotICAgICAgICAsIG1fcmVwZWF0aW5nQ2hhcigwKQotICAgICAgICAsIG1fbGFzdENoYXJUaW1l
KDApCi0gICAgICAgICwgbV9tYXhXaW5kb3dXaWR0aChudW1lcmljX2xpbWl0czxpbnQ+OjptYXgo
KSkKLSAgICB7Ci0gICAgICAgIHNldFNjcm9sbGJhck1vZGVzKFNjcm9sbGJhckFsd2F5c09mZiwg
U2Nyb2xsYmFyQWx3YXlzT2ZmKTsKLSAgICB9Ci0KLSAgICB+UG9wdXBMaXN0Qm94KCkKLSAgICB7
Ci0gICAgICAgIGNsZWFyKCk7Ci0gICAgfQotCi0gICAgLy8gQ2xvc2VzIHRoZSBwb3B1cAotICAg
IHZvaWQgYWJhbmRvbigpOwotCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3Rpb24g
Y2FuIGJlIGNoYW5nZWQgdG8gaW5kZXguCi0gICAgLy8gRGlzYWJsZWQgaXRlbXMsIG9yIGxhYmVs
cyBjYW5ub3QgYmUgc2VsZWN0ZWQuCi0gICAgYm9vbCBpc1NlbGVjdGFibGVJdGVtKGludCBpbmRl
eCk7Ci0KLSAgICAvLyBTZWxlY3QgYW4gaW5kZXggaW4gdGhlIGxpc3QsIHNjcm9sbGluZyBpZiBu
ZWNlc3NhcnkuCi0gICAgdm9pZCBzZWxlY3RJbmRleChpbnQgaW5kZXgpOwotCi0gICAgLy8gQWNj
ZXB0cyB0aGUgc2VsZWN0ZWQgaW5kZXggYXMgdGhlIHZhbHVlIHRvIGJlIGRpc3BsYXllZCBpbiB0
aGUgPHNlbGVjdD4gd2lkZ2V0IG9uCi0gICAgLy8gdGhlIHdlYiBwYWdlLCBhbmQgY2xvc2VzIHRo
ZSBwb3B1cC4gUmV0dXJucyB0cnVlIGlmIGluZGV4IGlzIGFjY2VwdGVkLgotICAgIGJvb2wgYWNj
ZXB0SW5kZXgoaW50IGluZGV4KTsKLQotICAgIC8vIENsZWFycyB0aGUgc2VsZWN0aW9uIChzbyBu
byByb3cgYXBwZWFycyBzZWxlY3RlZCkuCi0gICAgdm9pZCBjbGVhclNlbGVjdGlvbigpOwotCi0g
ICAgLy8gU2Nyb2xscyB0byByZXZlYWwgdGhlIGdpdmVuIGluZGV4LgotICAgIHZvaWQgc2Nyb2xs
VG9SZXZlYWxSb3coaW50IGluZGV4KTsKLSAgICB2b2lkIHNjcm9sbFRvUmV2ZWFsU2VsZWN0aW9u
KCkgeyBzY3JvbGxUb1JldmVhbFJvdyhtX3NlbGVjdGVkSW5kZXgpOyB9Ci0KLSAgICAvLyBJbnZh
bGlkYXRlcyB0aGUgcm93IGF0IHRoZSBnaXZlbiBpbmRleC4KLSAgICB2b2lkIGludmFsaWRhdGVS
b3coaW50IGluZGV4KTsKLQotICAgIC8vIEdldCB0aGUgYm91bmRzIG9mIGEgcm93LgotICAgIElu
dFJlY3QgZ2V0Um93Qm91bmRzKGludCBpbmRleCk7Ci0KLSAgICAvLyBDb252ZXJ0cyBhIHBvaW50
IHRvIGFuIGluZGV4IG9mIHRoZSByb3cgdGhlIHBvaW50IGlzIG92ZXIKLSAgICBpbnQgcG9pbnRU
b1Jvd0luZGV4KGNvbnN0IEludFBvaW50Jik7Ci0KLSAgICAvLyBQYWludCBhbiBpbmRpdmlkdWFs
IHJvdwotICAgIHZvaWQgcGFpbnRSb3coR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYs
IGludCByb3dJbmRleCk7Ci0KLSAgICAvLyBUZXN0IGlmIHRoZSBnaXZlbiBwb2ludCBpcyB3aXRo
aW4gdGhlIGJvdW5kcyBvZiB0aGUgcG9wdXAgd2luZG93LgotICAgIGJvb2wgaXNQb2ludEluQm91
bmRzKGNvbnN0IEludFBvaW50Jik7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgdXNlciBwcmVz
c2VzIGEgdGV4dCBrZXkuICBEb2VzIGEgcHJlZml4LXNlYXJjaCBvZiB0aGUgaXRlbXMuCi0gICAg
dm9pZCB0eXBlQWhlYWRGaW5kKGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYpOwotCi0gICAg
Ly8gUmV0dXJucyB0aGUgZm9udCB0byB1c2UgZm9yIHRoZSBnaXZlbiByb3cKLSAgICBGb250IGdl
dFJvd0ZvbnQoaW50IGluZGV4KTsKLQotICAgIC8vIE1vdmVzIHRoZSBzZWxlY3Rpb24gZG93bi91
cCBvbmUgaXRlbSwgdGFraW5nIGNhcmUgb2YgbG9vcGluZyBiYWNrIHRvIHRoZQotICAgIC8vIGZp
cnN0L2xhc3QgZWxlbWVudCBpZiBtX2xvb3BTZWxlY3Rpb25OYXZpZ2F0aW9uIGlzIHRydWUuCi0g
ICAgdm9pZCBzZWxlY3RQcmV2aW91c1JvdygpOwotICAgIHZvaWQgc2VsZWN0TmV4dFJvdygpOwot
Ci0gICAgLy8gVGhlIHNldHRpbmdzIHRoYXQgc3BlY2lmeSB0aGUgYmVoYXZpb3IgZm9yIHRoaXMg
UG9wdXAgd2luZG93LgotICAgIFBvcHVwQ29udGFpbmVyU2V0dGluZ3MgbV9zZXR0aW5nczsKLQot
ICAgIC8vIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBpdGVtIG1hcmtlZCBhcyAic2VsZWN0ZWQi
IC0gaS5lLiBkaXNwbGF5ZWQgaW4gdGhlIHdpZGdldCBvbiB0aGUKLSAgICAvLyBwYWdlLgotICAg
IGludCBtX29yaWdpbmFsSW5kZXg7Ci0KLSAgICAvLyBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGUg
aXRlbSB0aGF0IHRoZSB1c2VyIGlzIGhvdmVyZWQgb3ZlciBvciBoYXMgc2VsZWN0ZWQgdXNpbmcg
dGhlCi0gICAgLy8ga2V5Ym9hcmQgaW4gdGhlIGxpc3QuIFRoZXkgaGF2ZSBub3QgY29uZmlybWVk
IHRoaXMgc2VsZWN0aW9uIGJ5IGNsaWNraW5nIG9yIHByZXNzaW5nCi0gICAgLy8gZW50ZXIgeWV0
IGhvd2V2ZXIuCi0gICAgaW50IG1fc2VsZWN0ZWRJbmRleDsKLQotICAgIC8vIElmID49IDAsIHRo
aXMgaXMgdGhlIGluZGV4IHdlIHNob3VsZCBhY2NlcHQgaWYgdGhlIHBvcHVwIGlzICJhYmFuZG9u
ZWQiLgotICAgIC8vIFRoaXMgaXMgdXNlZCBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbiwgd2hlcmUg
d2Ugd2FudCB0aGUKLSAgICAvLyBzZWxlY3Rpb24gdG8gY2hhbmdlIGltbWVkaWF0ZWx5LCBhbmQg
aXMgb25seSB1c2VkIGlmIHRoZSBzZXR0aW5ncwotICAgIC8vIGFjY2VwdE9uQWJhbmRvbiBmaWVs
ZCBpcyB0cnVlLgotICAgIGludCBtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb247Ci0KLSAgICAvLyBU
aGlzIGlzIHRoZSBudW1iZXIgb2Ygcm93cyB2aXNpYmxlIGluIHRoZSBwb3B1cC4gVGhlIG1heGlt
dW0gbnVtYmVyIHZpc2libGUgYXQgYSB0aW1lIGlzCi0gICAgLy8gZGVmaW5lZCBhcyBiZWluZyBr
TWF4VmlzaWJsZVJvd3MuIEZvciBhIHNjcm9sbGVkIHBvcHVwLCB0aGlzIGNhbiBiZSB0aG91Z2h0
IG9mIGFzIHRoZQotICAgIC8vIHBhZ2Ugc2l6ZSBpbiBkYXRhIHVuaXRzLgotICAgIGludCBtX3Zp
c2libGVSb3dzOwotCi0gICAgLy8gT3VyIHN1Z2dlc3RlZCB3aWR0aCwgbm90IGluY2x1ZGluZyBz
Y3JvbGxiYXIuCi0gICAgaW50IG1fYmFzZVdpZHRoOwotCi0gICAgLy8gVGhlIG1heGltdW0gaGVp
Z2h0IHdlIGNhbiBiZSB3aXRob3V0IGJlaW5nIG9mZi1zY3JlZW4uCi0gICAgaW50IG1fbWF4SGVp
Z2h0OwotCi0gICAgLy8gQSBsaXN0IG9mIHRoZSBvcHRpb25zIGNvbnRhaW5lZCB3aXRoaW4gdGhl
IDxzZWxlY3Q+Ci0gICAgVmVjdG9yPFBvcHVwSXRlbSo+IG1faXRlbXM7Ci0KLSAgICAvLyBUaGUg
PHNlbGVjdD4gUG9wdXBNZW51Q2xpZW50IHRoYXQgb3BlbmVkIHVzLgotICAgIFBvcHVwTWVudUNs
aWVudCogbV9wb3B1cENsaWVudDsKLQotICAgIC8vIFRoZSBzY3JvbGxiYXIgd2hpY2ggaGFzIG1v
dXNlIGNhcHR1cmUuICBNb3VzZSBldmVudHMgZ28gc3RyYWlnaHQgdG8gdGhpcwotICAgIC8vIGlm
IG5vbi1OVUxMLgotICAgIFJlZlB0cjxTY3JvbGxiYXI+IG1fY2FwdHVyaW5nU2Nyb2xsYmFyOwot
Ci0gICAgLy8gVGhlIGxhc3Qgc2Nyb2xsYmFyIHRoYXQgdGhlIG1vdXNlIHdhcyBvdmVyLiAgVXNl
ZCBmb3IgbW91c2VvdmVyIGhpZ2hsaWdodHMuCi0gICAgUmVmUHRyPFNjcm9sbGJhcj4gbV9sYXN0
U2Nyb2xsYmFyVW5kZXJNb3VzZTsKLQotICAgIC8vIFRoZSBzdHJpbmcgdGhlIHVzZXIgaGFzIHR5
cGVkIHNvIGZhciBpbnRvIHRoZSBwb3B1cC4gVXNlZCBmb3IgdHlwZUFoZWFkRmluZC4KLSAgICBT
dHJpbmcgbV90eXBlZFN0cmluZzsKLQotICAgIC8vIFRoZSBjaGFyIHRoZSB1c2VyIGhhcyBoaXQg
cmVwZWF0ZWRseS4gIFVzZWQgZm9yIHR5cGVBaGVhZEZpbmQuCi0gICAgVUNoYXIgbV9yZXBlYXRp
bmdDaGFyOwotCi0gICAgLy8gVGhlIGxhc3QgdGltZSB0aGUgdXNlciBoaXQgYSBrZXkuICBVc2Vk
IGZvciB0eXBlQWhlYWRGaW5kLgotICAgIFRpbWVTdGFtcCBtX2xhc3RDaGFyVGltZTsKLQotICAg
IC8vIElmIHdpZHRoIGV4ZWVkcyBzY3JlZW4gd2lkdGgsIHdlIGhhdmUgdG8gY2xpcCBpdC4KLSAg
ICBpbnQgbV9tYXhXaW5kb3dXaWR0aDsKLQotICAgIC8vIFRvIGZvcndhcmQgbGFzdCBtb3VzZSBy
ZWxlYXNlIGV2ZW50LgotICAgIFJlZlB0cjxOb2RlPiBtX2ZvY3VzZWROb2RlOwotfTsKLQotc3Rh
dGljIFBsYXRmb3JtTW91c2VFdmVudCBjb25zdHJ1Y3RSZWxhdGl2ZU1vdXNlRXZlbnQoY29uc3Qg
UGxhdGZvcm1Nb3VzZUV2ZW50JiBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgRnJhbWVsZXNzU2Nyb2xsVmlldyogcGFyZW50LAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWVsZXNz
U2Nyb2xsVmlldyogY2hpbGQpCi17Ci0gICAgSW50UG9pbnQgcG9zID0gcGFyZW50LT5jb252ZXJ0
U2VsZlRvQ2hpbGQoY2hpbGQsIGUucG9zKCkpOwotCi0gICAgLy8gRklYTUU6IFRoaXMgaXMgYSBo
b3JyaWJsZSBoYWNrIHNpbmNlIFBsYXRmb3JtTW91c2VFdmVudCBoYXMgbm8gc2V0dGVycyBmb3Ig
eC95LgotICAgIFBsYXRmb3JtTW91c2VFdmVudCByZWxhdGl2ZUV2ZW50ID0gZTsKLSAgICBJbnRQ
b2ludCYgcmVsYXRpdmVQb3MgPSBjb25zdF9jYXN0PEludFBvaW50Jj4ocmVsYXRpdmVFdmVudC5w
b3MoKSk7Ci0gICAgcmVsYXRpdmVQb3Muc2V0WChwb3MueCgpKTsKLSAgICByZWxhdGl2ZVBvcy5z
ZXRZKHBvcy55KCkpOwotICAgIHJldHVybiByZWxhdGl2ZUV2ZW50OwotfQotCi1zdGF0aWMgUGxh
dGZvcm1XaGVlbEV2ZW50IGNvbnN0cnVjdFJlbGF0aXZlV2hlZWxFdmVudChjb25zdCBQbGF0Zm9y
bVdoZWVsRXZlbnQmIGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBGcmFtZWxlc3NTY3JvbGxWaWV3KiBwYXJlbnQsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZWxlc3NTY3JvbGxW
aWV3KiBjaGlsZCkKLXsKLSAgICBJbnRQb2ludCBwb3MgPSBwYXJlbnQtPmNvbnZlcnRTZWxmVG9D
aGlsZChjaGlsZCwgZS5wb3MoKSk7Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhvcnJpYmxl
IGhhY2sgc2luY2UgUGxhdGZvcm1XaGVlbEV2ZW50IGhhcyBubyBzZXR0ZXJzIGZvciB4L3kuCi0g
ICAgUGxhdGZvcm1XaGVlbEV2ZW50IHJlbGF0aXZlRXZlbnQgPSBlOwotICAgIEludFBvaW50JiBy
ZWxhdGl2ZVBvcyA9IGNvbnN0X2Nhc3Q8SW50UG9pbnQmPihyZWxhdGl2ZUV2ZW50LnBvcygpKTsK
LSAgICByZWxhdGl2ZVBvcy5zZXRYKHBvcy54KCkpOwotICAgIHJlbGF0aXZlUG9zLnNldFkocG9z
LnkoKSk7Ci0gICAgcmV0dXJuIHJlbGF0aXZlRXZlbnQ7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8KLS8vIFBvcHVwQ29udGFpbmVyIGltcGxlbWVudGF0aW9uCi0KLS8vIHN0YXRpYwotUGFz
c1JlZlB0cjxQb3B1cENvbnRhaW5lcj4gUG9wdXBDb250YWluZXI6OmNyZWF0ZShQb3B1cE1lbnVD
bGllbnQqIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgUG9wdXBUeXBlIHBvcHVwVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyYgc2V0
dGluZ3MpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBQb3B1cENvbnRhaW5lcihjbGllbnQs
IHBvcHVwVHlwZSwgc2V0dGluZ3MpKTsKLX0KLQotUG9wdXBDb250YWluZXI6OlBvcHVwQ29udGFp
bmVyKFBvcHVwTWVudUNsaWVudCogY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFBvcHVwVHlwZSBwb3B1cFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyYgc2V0dGluZ3MpCi0gICAgOiBtX2xpc3RCb3go
UG9wdXBMaXN0Qm94OjpjcmVhdGUoY2xpZW50LCBzZXR0aW5ncykpCi0gICAgLCBtX3NldHRpbmdz
KHNldHRpbmdzKQotICAgICwgbV9wb3B1cFR5cGUocG9wdXBUeXBlKQotICAgICwgbV9wb3B1cE9w
ZW4oZmFsc2UpCi17Ci0gICAgc2V0U2Nyb2xsYmFyTW9kZXMoU2Nyb2xsYmFyQWx3YXlzT2ZmLCBT
Y3JvbGxiYXJBbHdheXNPZmYpOwotfQotCi1Qb3B1cENvbnRhaW5lcjo6flBvcHVwQ29udGFpbmVy
KCkKLXsKLSAgICBpZiAobV9saXN0Qm94ICYmIG1fbGlzdEJveC0+cGFyZW50KCkpCi0gICAgICAg
IHJlbW92ZUNoaWxkKG1fbGlzdEJveC5nZXQoKSk7Ci19Ci0KLUludFJlY3QgUG9wdXBDb250YWlu
ZXI6OmxheW91dEFuZENhbGN1bGF0ZVdpZGdldFJlY3QoaW50IHRhcmdldENvbnRyb2xIZWlnaHQs
IGNvbnN0IEludFBvaW50JiBwb3B1cEluaXRpYWxDb29yZGluYXRlKQotewotICAgIC8vIFJlc2V0
IHRoZSBtYXggd2lkdGggYW5kIGhlaWdodCB0byB0aGVpciBkZWZhdWx0IHZhbHVlcywgdGhleSB3
aWxsIGJlIHJlY29tcHV0ZWQgYmVsb3cKLSAgICAvLyBpZiBuZWNlc3NhcnkuCi0gICAgbV9saXN0
Qm94LT5zZXRNYXhIZWlnaHQoa01heEhlaWdodCk7Ci0gICAgbV9saXN0Qm94LT5zZXRNYXhXaWR0
aChudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSk7Ci0KLSAgICAvLyBMYXkgZXZlcnl0aGluZyBv
dXQgdG8gZmlndXJlIG91dCBvdXIgcHJlZmVycmVkIHNpemUsIHRoZW4gdGVsbCB0aGUgdmlldydz
Ci0gICAgLy8gV2lkZ2V0Q2xpZW50IGFib3V0IGl0LiAgSXQgc2hvdWxkIGFzc2lnbiB1cyBhIGNs
aWVudC4KLSAgICBpbnQgcnRsT2Zmc2V0ID0gbGF5b3V0QW5kR2V0UlRMT2Zmc2V0KCk7Ci0gICAg
Ym9vbCBpc1JUTCA9IHRoaXMtPmlzUlRMKCk7Ci0gICAgaW50IHJpZ2h0T2Zmc2V0ID0gaXNSVEwg
PyBydGxPZmZzZXQgOiAwOwotCi0gICAgLy8gQXNzdW1lIG1fbGlzdEJveCBzaXplIGlzIGFscmVh
ZHkgY2FsY3VsYXRlZC4KLSAgICBJbnRTaXplIHRhcmdldFNpemUobV9saXN0Qm94LT53aWR0aCgp
ICsga0JvcmRlclNpemUgKiAyLAotICAgICAgICAgICAgICAgICAgICAgICBtX2xpc3RCb3gtPmhl
aWdodCgpICsga0JvcmRlclNpemUgKiAyKTsKLQotICAgIEludFJlY3Qgd2lkZ2V0UmVjdDsKLSAg
ICBDaHJvbWVDbGllbnRDaHJvbWl1bSogY2hyb21lQ2xpZW50ID0gY2hyb21lQ2xpZW50Q2hyb21p
dW0oKTsKLSAgICBpZiAoY2hyb21lQ2xpZW50KSB7Ci0gICAgICAgIC8vIElmIHRoZSBwb3B1cCB3
b3VsZCBleHRlbmQgcGFzdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4sIG9wZW4gdXB3YXJkcwot
ICAgICAgICAvLyBpbnN0ZWFkLgotICAgICAgICBGbG9hdFJlY3Qgc2NyZWVuID0gc2NyZWVuQXZh
aWxhYmxlUmVjdChtX2ZyYW1lVmlldy5nZXQoKSk7Ci0gICAgICAgIC8vIFVzZSBwb3B1cEluaXRp
YWxDb29yZGluYXRlLngoKSArIHJpZ2h0T2Zmc2V0IGJlY2F1c2UgUlRMIHBvc2l0aW9uCi0gICAg
ICAgIC8vIG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQuCi0gICAgICAgIHdpZGdldFJlY3QgPSBjaHJv
bWVDbGllbnQtPndpbmRvd1RvU2NyZWVuKEludFJlY3QocG9wdXBJbml0aWFsQ29vcmRpbmF0ZS54
KCkgKyByaWdodE9mZnNldCwgcG9wdXBJbml0aWFsQ29vcmRpbmF0ZS55KCksIHRhcmdldFNpemUu
d2lkdGgoKSwgdGFyZ2V0U2l6ZS5oZWlnaHQoKSkpOwotCi0gICAgICAgIC8vIElmIHdlIGhhdmUg
bXVsdGlwbGUgc2NyZWVucyBhbmQgdGhlIGJyb3dzZXIgcmVjdCBpcyBpbiBvbmUgc2NyZWVuLCB3
ZSBoYXZlCi0gICAgICAgIC8vIHRvIGNsaXAgdGhlIHdpbmRvdyB3aWR0aCB0byB0aGUgc2NyZWVu
IHdpZHRoLgotICAgICAgICAvLyBXaGVuIGNsaXBwaW5nLCB3ZSBhbHNvIG5lZWQgdG8gc2V0IGEg
bWF4aW11bSB3aWR0aCBmb3IgdGhlIGxpc3QgYm94LgotICAgICAgICBGbG9hdFJlY3Qgd2luZG93
UmVjdCA9IGNocm9tZUNsaWVudC0+d2luZG93UmVjdCgpOwotICAgICAgICBpZiAod2luZG93UmVj
dC54KCkgPj0gc2NyZWVuLngoKSAmJiB3aW5kb3dSZWN0Lm1heFgoKSA8PSBzY3JlZW4ubWF4WCgp
ICYmICh3aWRnZXRSZWN0LngoKSA8IHNjcmVlbi54KCkgfHwgd2lkZ2V0UmVjdC5tYXhYKCkgPiBz
Y3JlZW4ubWF4WCgpKSkgewotICAgICAgICAgICAgLy8gRmlyc3QsIGludmVyc2UgdGhlIHBvcHVw
IGFsaWdubWVudCBpZiBpdCBkb2VzIG5vdCBmaXQgdGhlIHNjcmVlbiAtIHRoaXMgbWlnaHQgZml4
IHRoaW5ncyAob3IgbWFrZSB0aGVtIGJldHRlcikuCi0gICAgICAgICAgICBJbnRSZWN0IGludmVy
c2VXaWRnZXRSZWN0ID0gY2hyb21lQ2xpZW50LT53aW5kb3dUb1NjcmVlbihJbnRSZWN0KHBvcHVw
SW5pdGlhbENvb3JkaW5hdGUueCgpICsgKGlzUlRMID8gMCA6IHJ0bE9mZnNldCksIHBvcHVwSW5p
dGlhbENvb3JkaW5hdGUueSgpLCB0YXJnZXRTaXplLndpZHRoKCksIHRhcmdldFNpemUuaGVpZ2h0
KCkpKTsKLSAgICAgICAgICAgIEludFJlY3QgZW5jbG9zaW5nU2NyZWVuID0gZW5jbG9zaW5nSW50
UmVjdChzY3JlZW4pOwotICAgICAgICAgICAgdW5zaWduZWQgb3JpZ2luYWxDdXRvZmYgPSBtYXgo
ZW5jbG9zaW5nU2NyZWVuLngoKSAtIHdpZGdldFJlY3QueCgpLCAwKSArIG1heCh3aWRnZXRSZWN0
Lm1heFgoKSAtIGVuY2xvc2luZ1NjcmVlbi5tYXhYKCksIDApOwotICAgICAgICAgICAgdW5zaWdu
ZWQgaW52ZXJzZUN1dG9mZiA9IG1heChlbmNsb3NpbmdTY3JlZW4ueCgpIC0gaW52ZXJzZVdpZGdl
dFJlY3QueCgpLCAwKSArIG1heChpbnZlcnNlV2lkZ2V0UmVjdC5tYXhYKCkgLSBlbmNsb3NpbmdT
Y3JlZW4ubWF4WCgpLCAwKTsKLQotICAgICAgICAgICAgLy8gQWNjZXB0IHRoZSBpbnZlcnNlIHBv
cHVwIGFsaWdubWVudCBpZiB0aGUgdHJpbW1lZCBjb250ZW50IGdldHMgc2hvcnRlciB0aGFuIHRo
YXQgaW4gdGhlIG9yaWdpbmFsIGFsaWdubWVudCBjYXNlLgotICAgICAgICAgICAgaWYgKGludmVy
c2VDdXRvZmYgPCBvcmlnaW5hbEN1dG9mZikKLSAgICAgICAgICAgICAgICB3aWRnZXRSZWN0ID0g
aW52ZXJzZVdpZGdldFJlY3Q7Ci0KLSAgICAgICAgICAgIGlmICh3aWRnZXRSZWN0LngoKSA8IHNj
cmVlbi54KCkpIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCB3aWRnZXRSaWdodCA9IHdpZGdl
dFJlY3QubWF4WCgpOwotICAgICAgICAgICAgICAgIHdpZGdldFJlY3Quc2V0V2lkdGgod2lkZ2V0
UmVjdC5tYXhYKCkgLSBzY3JlZW4ueCgpKTsKLSAgICAgICAgICAgICAgICB3aWRnZXRSZWN0LnNl
dFgod2lkZ2V0UmlnaHQgLSB3aWRnZXRSZWN0LndpZHRoKCkpOwotICAgICAgICAgICAgICAgIGxp
c3RCb3goKS0+c2V0TWF4V2lkdGhBbmRMYXlvdXQobWF4KHdpZGdldFJlY3Qud2lkdGgoKSAtIGtC
b3JkZXJTaXplICogMiwgMCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aWRnZXRSZWN0Lm1h
eFgoKSA+IHNjcmVlbi5tYXhYKCkpIHsKLSAgICAgICAgICAgICAgICB3aWRnZXRSZWN0LnNldFdp
ZHRoKHNjcmVlbi5tYXhYKCkgLSB3aWRnZXRSZWN0LngoKSk7Ci0gICAgICAgICAgICAgICAgbGlz
dEJveCgpLT5zZXRNYXhXaWR0aEFuZExheW91dChtYXgod2lkZ2V0UmVjdC53aWR0aCgpIC0ga0Jv
cmRlclNpemUgKiAyLCAwKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAv
LyBDYWxjdWxhdGUgWSBheGlzIHNpemUuCi0gICAgICAgIGlmICh3aWRnZXRSZWN0Lm1heFkoKSA+
IHN0YXRpY19jYXN0PGludD4oc2NyZWVuLm1heFkoKSkpIHsKLSAgICAgICAgICAgIGlmICh3aWRn
ZXRSZWN0LnkoKSAtIHdpZGdldFJlY3QuaGVpZ2h0KCkgLSB0YXJnZXRDb250cm9sSGVpZ2h0ID4g
MCkgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGVub3VnaCByb29tIHRvIG9wZW4gdXB3
YXJkcy4KLSAgICAgICAgICAgICAgICB3aWRnZXRSZWN0Lm1vdmUoMCwgLSh3aWRnZXRSZWN0Lmhl
aWdodCgpICsgdGFyZ2V0Q29udHJvbEhlaWdodCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICAvLyBGaWd1cmUgd2hldGhlciB1cHdhcmRzIG9yIGRvd253YXJkcyBoYXMg
bW9yZSByb29tIGFuZCBzZXQgdGhlCi0gICAgICAgICAgICAgICAgLy8gbWF4aW11bSBudW1iZXIg
b2YgaXRlbXMuCi0gICAgICAgICAgICAgICAgaW50IHNwYWNlQWJvdmUgPSB3aWRnZXRSZWN0Lnko
KSAtIHRhcmdldENvbnRyb2xIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaW50IHNwYWNlQmVsb3cg
PSBzY3JlZW4ubWF4WSgpIC0gd2lkZ2V0UmVjdC55KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNw
YWNlQWJvdmUgPiBzcGFjZUJlbG93KQotICAgICAgICAgICAgICAgICAgICBtX2xpc3RCb3gtPnNl
dE1heEhlaWdodChzcGFjZUFib3ZlKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgICAgIG1fbGlzdEJveC0+c2V0TWF4SGVpZ2h0KHNwYWNlQmVsb3cpOwotICAgICAgICAg
ICAgICAgIGxheW91dEFuZEdldFJUTE9mZnNldCgpOwotICAgICAgICAgICAgICAgIC8vIE91ciBo
ZWlnaHQgaGFzIGNoYW5nZWQsIHNvIHJlY29tcHV0ZSBvbmx5IFkgYXhpcyBvZiB3aWRnZXRSZWN0
LgotICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gcmVjb21wdXRlIFggYXhpcywg
c28gd2Ugb25seSByZXBsYWNlIFkgYXhpcwotICAgICAgICAgICAgICAgIC8vIGluIHdpZGdldFJl
Y3QuCi0gICAgICAgICAgICAgICAgSW50UmVjdCBmcmFtZUluU2NyZWVuID0gY2hyb21lQ2xpZW50
LT53aW5kb3dUb1NjcmVlbihmcmFtZVJlY3QoKSk7Ci0gICAgICAgICAgICAgICAgd2lkZ2V0UmVj
dC5zZXRZKGZyYW1lSW5TY3JlZW4ueSgpKTsKLSAgICAgICAgICAgICAgICB3aWRnZXRSZWN0LnNl
dEhlaWdodChmcmFtZUluU2NyZWVuLmhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAvLyBBbmQg
bW92ZSB1cHdhcmRzIGlmIG5lY2Vzc2FyeS4KLSAgICAgICAgICAgICAgICBpZiAoc3BhY2VBYm92
ZSA+IHNwYWNlQmVsb3cpCi0gICAgICAgICAgICAgICAgICAgIHdpZGdldFJlY3QubW92ZSgwLCAt
KHdpZGdldFJlY3QuaGVpZ2h0KCkgKyB0YXJnZXRDb250cm9sSGVpZ2h0KSk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHdpZGdldFJlY3Q7Ci19Ci0KLXZvaWQg
UG9wdXBDb250YWluZXI6OnNob3dQb3B1cChGcmFtZVZpZXcqIHZpZXcpCi17Ci0gICAgbV9mcmFt
ZVZpZXcgPSB2aWV3OwotICAgIGxpc3RCb3goKS0+bV9mb2N1c2VkTm9kZSA9IG1fZnJhbWVWaWV3
LT5mcmFtZSgpLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpOwotCi0gICAgQ2hyb21lQ2xpZW50
Q2hyb21pdW0qIGNocm9tZUNsaWVudCA9IGNocm9tZUNsaWVudENocm9taXVtKCk7Ci0gICAgaWYg
KGNocm9tZUNsaWVudCkgewotICAgICAgICBJbnRSZWN0IHBvcHVwUmVjdCA9IGZyYW1lUmVjdCgp
OwotICAgICAgICBjaHJvbWVDbGllbnQtPnBvcHVwT3BlbmVkKHRoaXMsIGxheW91dEFuZENhbGN1
bGF0ZVdpZGdldFJlY3QocG9wdXBSZWN0LmhlaWdodCgpLCBwb3B1cFJlY3QubG9jYXRpb24oKSks
IGZhbHNlKTsKLSAgICAgICAgbV9wb3B1cE9wZW4gPSB0cnVlOwotICAgIH0KLQotICAgIGlmICgh
bV9saXN0Qm94LT5wYXJlbnQoKSkKLSAgICAgICAgYWRkQ2hpbGQobV9saXN0Qm94LmdldCgpKTsK
LQotICAgIC8vIEVuYWJsZSBzY3JvbGxiYXJzIGFmdGVyIHRoZSBsaXN0Ym94IGlzIGluc2VydGVk
IGludG8gdGhlIGhpZXJhcmNoeSwKLSAgICAvLyBzbyBpdCBoYXMgYSBwcm9wZXIgV2lkZ2V0Q2xp
ZW50LgotICAgIG1fbGlzdEJveC0+c2V0VmVydGljYWxTY3JvbGxiYXJNb2RlKFNjcm9sbGJhckF1
dG8pOwotCi0gICAgbV9saXN0Qm94LT5zY3JvbGxUb1JldmVhbFNlbGVjdGlvbigpOwotCi0gICAg
aW52YWxpZGF0ZSgpOwotfQotCi12b2lkIFBvcHVwQ29udGFpbmVyOjpoaWRlUG9wdXAoKQotewot
ICAgIGxpc3RCb3goKS0+aGlkZVBvcHVwKCk7Ci19Ci0KLXZvaWQgUG9wdXBDb250YWluZXI6Om5v
dGlmeVBvcHVwSGlkZGVuKCkKLXsKLSAgICBpZiAoIW1fcG9wdXBPcGVuKQotICAgICAgICByZXR1
cm47Ci0gICAgbV9wb3B1cE9wZW4gPSBmYWxzZTsKLSAgICBjaHJvbWVDbGllbnRDaHJvbWl1bSgp
LT5wb3B1cENsb3NlZCh0aGlzKTsKLX0KLQotaW50IFBvcHVwQ29udGFpbmVyOjpsYXlvdXRBbmRH
ZXRSVExPZmZzZXQoKQotewotICAgIG1fbGlzdEJveC0+bGF5b3V0KCk7Ci0KLSAgICAvLyBQbGFj
ZSB0aGUgbGlzdGJveCB3aXRoaW4gb3VyIGJvcmRlci4KLSAgICBtX2xpc3RCb3gtPm1vdmUoa0Jv
cmRlclNpemUsIGtCb3JkZXJTaXplKTsKLQotICAgIC8vIFNpemUgb3Vyc2VsdmVzIHRvIGNvbnRh
aW4gbGlzdGJveCArIGJvcmRlci4KLSAgICBpbnQgbGlzdEJveFdpZHRoID0gbV9saXN0Qm94LT53
aWR0aCgpICsga0JvcmRlclNpemUgKiAyOwotICAgIHJlc2l6ZShsaXN0Qm94V2lkdGgsIG1fbGlz
dEJveC0+aGVpZ2h0KCkgKyBrQm9yZGVyU2l6ZSAqIDIpOwotICAgIGludmFsaWRhdGUoKTsKLQot
ICAgIC8vIENvbXB1dGUgdGhlIHN0YXJ0aW5nIHgtYXhpcyBmb3IgYSBub3JtYWwgUlRMIG9yIHJp
Z2h0LWFsaWduZWQgTFRSIGRyb3Bkb3duLiBGb3IgdGhvc2UsCi0gICAgLy8gdGhlIHJpZ2h0IGVk
Z2Ugb2YgZHJvcGRvd24gYm94IHNob3VsZCBiZSBhbGlnbmVkIHdpdGggdGhlIHJpZ2h0IGVkZ2Ug
b2YgPHNlbGVjdD4vPGlucHV0PiBlbGVtZW50IGJveCwKLSAgICAvLyBhbmQgdGhlIGRyb3Bkb3du
IGJveCBzaG91bGQgYmUgZXhwYW5kZWQgdG8gdGhlIGxlZnQgaWYgbW9yZSBzcGFjZSBpcyBuZWVk
ZWQuCi0gICAgLy8gbV9vcmlnaW5hbEZyYW1lUmVjdC53aWR0aCgpIGlzIHRoZSB3aWR0aCBvZiB0
aGUgdGFyZ2V0IDxzZWxlY3Q+LzxpbnB1dD4gZWxlbWVudC4KLSAgICByZXR1cm4gbV9vcmlnaW5h
bEZyYW1lUmVjdC53aWR0aCgpIC0gbGlzdEJveFdpZHRoOwotfQotCi1ib29sIFBvcHVwQ29udGFp
bmVyOjpoYW5kbGVNb3VzZURvd25FdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2ZW50
KQotewotICAgIFVzZXJHZXN0dXJlSW5kaWNhdG9yIGdlc3R1cmVJbmRpY2F0b3IoRGVmaW5pdGVs
eVByb2Nlc3NpbmdVc2VyR2VzdHVyZSk7Ci0gICAgcmV0dXJuIG1fbGlzdEJveC0+aGFuZGxlTW91
c2VEb3duRXZlbnQoCi0gICAgICAgIGNvbnN0cnVjdFJlbGF0aXZlTW91c2VFdmVudChldmVudCwg
dGhpcywgbV9saXN0Qm94LmdldCgpKSk7Ci19Ci0KLWJvb2wgUG9wdXBDb250YWluZXI6OmhhbmRs
ZU1vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZlbnQpCi17Ci0gICAg
VXNlckdlc3R1cmVJbmRpY2F0b3IgZ2VzdHVyZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2lu
Z1VzZXJHZXN0dXJlKTsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5oYW5kbGVNb3VzZU1vdmVFdmVu
dCgKLSAgICAgICAgY29uc3RydWN0UmVsYXRpdmVNb3VzZUV2ZW50KGV2ZW50LCB0aGlzLCBtX2xp
c3RCb3guZ2V0KCkpKTsKLX0KLQotYm9vbCBQb3B1cENvbnRhaW5lcjo6aGFuZGxlTW91c2VSZWxl
YXNlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKLXsKLSAgICBSZWZQdHI8
UG9wdXBDb250YWluZXI+IHByb3RlY3QodGhpcyk7Ci0gICAgVXNlckdlc3R1cmVJbmRpY2F0b3Ig
Z2VzdHVyZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJHZXN0dXJlKTsKLSAgICBy
ZXR1cm4gbV9saXN0Qm94LT5oYW5kbGVNb3VzZVJlbGVhc2VFdmVudCgKLSAgICAgICAgY29uc3Ry
dWN0UmVsYXRpdmVNb3VzZUV2ZW50KGV2ZW50LCB0aGlzLCBtX2xpc3RCb3guZ2V0KCkpKTsKLX0K
LQotYm9vbCBQb3B1cENvbnRhaW5lcjo6aGFuZGxlV2hlZWxFdmVudChjb25zdCBQbGF0Zm9ybVdo
ZWVsRXZlbnQmIGV2ZW50KQotewotICAgIFVzZXJHZXN0dXJlSW5kaWNhdG9yIGdlc3R1cmVJbmRp
Y2F0b3IoRGVmaW5pdGVseVByb2Nlc3NpbmdVc2VyR2VzdHVyZSk7Ci0gICAgcmV0dXJuIG1fbGlz
dEJveC0+aGFuZGxlV2hlZWxFdmVudCgKLSAgICAgICAgY29uc3RydWN0UmVsYXRpdmVXaGVlbEV2
ZW50KGV2ZW50LCB0aGlzLCBtX2xpc3RCb3guZ2V0KCkpKTsKLX0KLQotI2lmIEVOQUJMRShUT1VD
SF9FVkVOVFMpCi1ib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBs
YXRmb3JtVG91Y2hFdmVudCYpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0KLSNp
ZiBFTkFCTEUoR0VTVFVSRV9SRUNPR05JWkVSKQotLy8gRklYTUU6IFJlZmFjdG9yIHRoaXMgY29k
ZSB0byBzaGFyZSBmdW5jdGlvbmFsaXR5IHdpdGggRXZlbnRIYW5kbGVyOjpoYW5kbGVHZXN0dXJl
RXZlbnQuCi1ib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVHZXN0dXJlRXZlbnQoY29uc3QgUGxh
dGZvcm1HZXN0dXJlRXZlbnQmIGdlc3R1cmVFdmVudCkKLXsKLSAgICBzd2l0Y2ggKGdlc3R1cmVF
dmVudC50eXBlKCkpIHsKLSAgICBjYXNlIFBsYXRmb3JtR2VzdHVyZUV2ZW50OjpUYXBUeXBlOiB7
Ci0gICAgICAgIFBsYXRmb3JtTW91c2VFdmVudCBmYWtlTW91c2VNb3ZlKGdlc3R1cmVFdmVudC5w
b3NpdGlvbigpLCBnZXN0dXJlRXZlbnQuZ2xvYmFsUG9zaXRpb24oKSwgTm9CdXR0b24sIE1vdXNl
RXZlbnRNb3ZlZCwgLyogY2xpY2tDb3VudCAqLyAxLCBnZXN0dXJlRXZlbnQuc2hpZnRLZXkoKSwg
Z2VzdHVyZUV2ZW50LmN0cmxLZXkoKSwgZ2VzdHVyZUV2ZW50LmFsdEtleSgpLCBnZXN0dXJlRXZl
bnQubWV0YUtleSgpLCBnZXN0dXJlRXZlbnQudGltZXN0YW1wKCkpOwotICAgICAgICBQbGF0Zm9y
bU1vdXNlRXZlbnQgZmFrZU1vdXNlRG93bihnZXN0dXJlRXZlbnQucG9zaXRpb24oKSwgZ2VzdHVy
ZUV2ZW50Lmdsb2JhbFBvc2l0aW9uKCksIExlZnRCdXR0b24sIE1vdXNlRXZlbnRQcmVzc2VkLCAv
KiBjbGlja0NvdW50ICovIDEsIGdlc3R1cmVFdmVudC5zaGlmdEtleSgpLCBnZXN0dXJlRXZlbnQu
Y3RybEtleSgpLCBnZXN0dXJlRXZlbnQuYWx0S2V5KCksIGdlc3R1cmVFdmVudC5tZXRhS2V5KCks
IGdlc3R1cmVFdmVudC50aW1lc3RhbXAoKSk7Ci0gICAgICAgIFBsYXRmb3JtTW91c2VFdmVudCBm
YWtlTW91c2VVcChnZXN0dXJlRXZlbnQucG9zaXRpb24oKSwgZ2VzdHVyZUV2ZW50Lmdsb2JhbFBv
c2l0aW9uKCksIExlZnRCdXR0b24sIE1vdXNlRXZlbnRSZWxlYXNlZCwgLyogY2xpY2tDb3VudCAq
LyAxLCBnZXN0dXJlRXZlbnQuc2hpZnRLZXkoKSwgZ2VzdHVyZUV2ZW50LmN0cmxLZXkoKSwgZ2Vz
dHVyZUV2ZW50LmFsdEtleSgpLCBnZXN0dXJlRXZlbnQubWV0YUtleSgpLCBnZXN0dXJlRXZlbnQu
dGltZXN0YW1wKCkpOwotICAgICAgICAvLyBoYW5kbGVNb3VzZU1vdmVFdmVudChmYWtlTW91c2VN
b3ZlKTsKLSAgICAgICAgaGFuZGxlTW91c2VEb3duRXZlbnQoZmFrZU1vdXNlRG93bik7Ci0gICAg
ICAgIGhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGZha2VNb3VzZVVwKTsKLSAgICAgICAgcmV0dXJu
IHRydWU7Ci0gICAgfQotICAgIGNhc2UgUGxhdGZvcm1HZXN0dXJlRXZlbnQ6OlNjcm9sbFVwZGF0
ZVR5cGU6IHsKLSAgICAgICAgUGxhdGZvcm1XaGVlbEV2ZW50IHN5bnRoZXRpY1doZWVsRXZlbnQo
Z2VzdHVyZUV2ZW50LnBvc2l0aW9uKCksIGdlc3R1cmVFdmVudC5nbG9iYWxQb3NpdGlvbigpLCBn
ZXN0dXJlRXZlbnQuZGVsdGFYKCksIGdlc3R1cmVFdmVudC5kZWx0YVkoKSwgZ2VzdHVyZUV2ZW50
LmRlbHRhWCgpIC8gMTIwLjBmLCBnZXN0dXJlRXZlbnQuZGVsdGFZKCkgLyAxMjAuMGYsIFNjcm9s
bEJ5UGl4ZWxXaGVlbEV2ZW50LCAvKiBpc0FjY2VwdGVkICovIGZhbHNlLCBnZXN0dXJlRXZlbnQu
c2hpZnRLZXkoKSwgZ2VzdHVyZUV2ZW50LmN0cmxLZXkoKSwgZ2VzdHVyZUV2ZW50LmFsdEtleSgp
LCBnZXN0dXJlRXZlbnQubWV0YUtleSgpKTsKLSAgICAgICAgaGFuZGxlV2hlZWxFdmVudChzeW50
aGV0aWNXaGVlbEV2ZW50KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhc2Ug
UGxhdGZvcm1HZXN0dXJlRXZlbnQ6OlNjcm9sbEJlZ2luVHlwZToKLSAgICBjYXNlIFBsYXRmb3Jt
R2VzdHVyZUV2ZW50OjpTY3JvbGxFbmRUeXBlOgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAg
cmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0KLWJvb2wgUG9wdXBDb250YWluZXI6OmhhbmRsZUtl
eUV2ZW50KGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYgZXZlbnQpCi17Ci0gICAgVXNlckdl
c3R1cmVJbmRpY2F0b3IgZ2VzdHVyZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJH
ZXN0dXJlKTsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5oYW5kbGVLZXlFdmVudChldmVudCk7Ci19
Ci0KLXZvaWQgUG9wdXBDb250YWluZXI6OmhpZGUoKQotewotICAgIG1fbGlzdEJveC0+YWJhbmRv
bigpOwotfQotCi12b2lkIFBvcHVwQ29udGFpbmVyOjpwYWludChHcmFwaGljc0NvbnRleHQqIGdj
LCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIC8vIGFkanVzdCBjb29yZHMgZm9yIHNjcm9s
bGVkIGZyYW1lCi0gICAgSW50UmVjdCByID0gaW50ZXJzZWN0aW9uKHJlY3QsIGZyYW1lUmVjdCgp
KTsKLSAgICBpbnQgdHggPSB4KCk7Ci0gICAgaW50IHR5ID0geSgpOwotCi0gICAgci5tb3ZlKC10
eCwgLXR5KTsKLQotICAgIGdjLT50cmFuc2xhdGUoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR4KSwgc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KHR5KSk7Ci0gICAgbV9saXN0Qm94LT5wYWludChnYywgcik7Ci0gICAg
Z2MtPnRyYW5zbGF0ZSgtc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR4KSwgLXN0YXRpY19jYXN0PGZsb2F0
Pih0eSkpOwotCi0gICAgcGFpbnRCb3JkZXIoZ2MsIHJlY3QpOwotfQotCi12b2lkIFBvcHVwQ29u
dGFpbmVyOjpwYWludEJvcmRlcihHcmFwaGljc0NvbnRleHQqIGdjLCBjb25zdCBJbnRSZWN0JiBy
ZWN0KQotewotICAgIC8vIEZJWE1FOiBXaGVyZSBkbyB3ZSBnZXQgdGhlIGJvcmRlciBjb2xvciBm
cm9tPwotICAgIENvbG9yIGJvcmRlckNvbG9yKDEyNywgMTU3LCAxODUpOwotCi0gICAgZ2MtPnNl
dFN0cm9rZVN0eWxlKE5vU3Ryb2tlKTsKLSAgICBnYy0+c2V0RmlsbENvbG9yKGJvcmRlckNvbG9y
LCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKLQotICAgIGludCB0eCA9IHgoKTsKLSAgICBpbnQgdHkg
PSB5KCk7Ci0KLSAgICAvLyB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQKLSAgICBnYy0+ZHJhd1Jl
Y3QoSW50UmVjdCh0eCwgdHksIHdpZHRoKCksIGtCb3JkZXJTaXplKSk7Ci0gICAgZ2MtPmRyYXdS
ZWN0KEludFJlY3QodHgsIHR5LCBrQm9yZGVyU2l6ZSwgaGVpZ2h0KCkpKTsKLSAgICBnYy0+ZHJh
d1JlY3QoSW50UmVjdCh0eCwgdHkgKyBoZWlnaHQoKSAtIGtCb3JkZXJTaXplLCB3aWR0aCgpLCBr
Qm9yZGVyU2l6ZSkpOwotICAgIGdjLT5kcmF3UmVjdChJbnRSZWN0KHR4ICsgd2lkdGgoKSAtIGtC
b3JkZXJTaXplLCB0eSwga0JvcmRlclNpemUsIGhlaWdodCgpKSk7Ci19Ci0KLWJvb2wgUG9wdXBD
b250YWluZXI6OmlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkoaW50IGtleUNvZGUpCi17Ci0gICAg
cmV0dXJuIG1fbGlzdEJveC0+aXNJbnRlcmVzdGVkSW5FdmVudEZvcktleShrZXlDb2RlKTsKLX0K
LQotQ2hyb21lQ2xpZW50Q2hyb21pdW0qIFBvcHVwQ29udGFpbmVyOjpjaHJvbWVDbGllbnRDaHJv
bWl1bSgpCi17Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENocm9tZUNsaWVudENocm9taXVtKj4o
bV9mcmFtZVZpZXctPmZyYW1lKCktPnBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpKTsKLX0KLQot
dm9pZCBQb3B1cENvbnRhaW5lcjo6c2hvd0luUmVjdChjb25zdCBJbnRSZWN0JiByLCBGcmFtZVZp
ZXcqIHYsIGludCBpbmRleCkKLXsKLSAgICAvLyBUaGUgcmVjdCBpcyB0aGUgc2l6ZSBvZiB0aGUg
c2VsZWN0IGJveC4gSXQncyB1c3VhbGx5IGxhcmdlciB0aGFuIHdlIG5lZWQuCi0gICAgLy8gc3Vi
dHJhY3QgYm9yZGVyIHNpemUgc28gdGhhdCB1c3VhbGx5IHRoZSBjb250YWluZXIgd2lsbCBiZSBk
aXNwbGF5ZWQKLSAgICAvLyBleGFjdGx5IHRoZSBzYW1lIHdpZHRoIGFzIHRoZSBzZWxlY3QgYm94
LgotICAgIGxpc3RCb3goKS0+c2V0QmFzZVdpZHRoKG1heChyLndpZHRoKCkgLSBrQm9yZGVyU2l6
ZSAqIDIsIDApKTsKLQotICAgIGxpc3RCb3goKS0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKLQotICAg
IC8vIFdlIHNldCB0aGUgc2VsZWN0ZWQgaXRlbSBpbiB1cGRhdGVGcm9tRWxlbWVudCgpLCBhbmQg
ZGlzcmVnYXJkIHRoZQotICAgIC8vIGluZGV4IHBhc3NlZCBpbnRvIHRoaXMgZnVuY3Rpb24gKHNh
bWUgYXMgV2Via2l0J3MgUG9wdXBNZW51V2luLmNwcCkKLSAgICAvLyBGSVhNRTogbWFrZSBzdXJl
IHRoaXMgaXMgY29ycmVjdCwgYW5kIGFkZCBhbiBhc3NlcnRpb24uCi0gICAgLy8gQVNTRVJUKHBv
cHVwV2luZG93KHBvcHVwKS0+bGlzdEJveCgpLT5zZWxlY3RlZEluZGV4KCkgPT0gaW5kZXgpOwot
Ci0gICAgLy8gQ29udmVydCBwb2ludCB0byBtYWluIHdpbmRvdyBjb29yZHMuCi0gICAgSW50UG9p
bnQgbG9jYXRpb24gPSB2LT5jb250ZW50c1RvV2luZG93KHIubG9jYXRpb24oKSk7Ci0KLSAgICAv
LyBNb3ZlIGl0IGJlbG93IHRoZSBzZWxlY3Qgd2lkZ2V0LgotICAgIGxvY2F0aW9uLm1vdmUoMCwg
ci5oZWlnaHQoKSk7Ci0KLSAgICBtX29yaWdpbmFsRnJhbWVSZWN0ID0gSW50UmVjdChsb2NhdGlv
biwgci5zaXplKCkpOwotICAgIHNldEZyYW1lUmVjdChtX29yaWdpbmFsRnJhbWVSZWN0KTsKLSAg
ICBzaG93UG9wdXAodik7Ci19Ci0KLXZvaWQgUG9wdXBDb250YWluZXI6OnJlZnJlc2goY29uc3Qg
SW50UmVjdCYgdGFyZ2V0Q29udHJvbFJlY3QpCi17Ci0gICAgSW50UG9pbnQgbG9jYXRpb24gPSBt
X2ZyYW1lVmlldy0+Y29udGVudHNUb1dpbmRvdyh0YXJnZXRDb250cm9sUmVjdC5sb2NhdGlvbigp
KTsKLSAgICAvLyBNb3ZlIGl0IGJlbG93IHRoZSBzZWxlY3Qgd2lkZ2V0LgotICAgIGxvY2F0aW9u
Lm1vdmUoMCwgdGFyZ2V0Q29udHJvbFJlY3QuaGVpZ2h0KCkpOwotCi0gICAgbGlzdEJveCgpLT5z
ZXRCYXNlV2lkdGgobWF4KG1fb3JpZ2luYWxGcmFtZVJlY3Qud2lkdGgoKSAtIGtCb3JkZXJTaXpl
ICogMiwgMCkpOwotICAgIHNldEJvdW5kc1NpemUobV9vcmlnaW5hbEZyYW1lUmVjdC5zaXplKCkp
OwotCi0gICAgbGlzdEJveCgpLT51cGRhdGVGcm9tRWxlbWVudCgpOwotICAgIC8vIFN0b3JlIHRo
ZSBvcmlnaW5hbCBzaXplIHRvIGNoZWNrIGlmIHdlIG5lZWQgdG8gcmVxdWVzdCB0aGUgbG9jYXRp
b24uCi0gICAgSW50U2l6ZSBvcmlnaW5hbFNpemUgPSBzaXplKCk7Ci0gICAgSW50UmVjdCB3aWRn
ZXRSZWN0ID0gbGF5b3V0QW5kQ2FsY3VsYXRlV2lkZ2V0UmVjdCh0YXJnZXRDb250cm9sUmVjdC5o
ZWlnaHQoKSwgbG9jYXRpb24pOwotICAgIGlmIChvcmlnaW5hbFNpemUgIT0gd2lkZ2V0UmVjdC5z
aXplKCkpIHsKLSAgICAgICAgQ2hyb21lQ2xpZW50Q2hyb21pdW0qIGNocm9tZUNsaWVudCA9IGNo
cm9tZUNsaWVudENocm9taXVtKCk7Ci0gICAgICAgIGlmIChjaHJvbWVDbGllbnQpIHsKLSAgICAg
ICAgICAgIEludFBvaW50IHdpZGdldExvY2F0aW9uID0gY2hyb21lQ2xpZW50LT5zY3JlZW5Ub1dp
bmRvdyh3aWRnZXRSZWN0LmxvY2F0aW9uKCkpOwotICAgICAgICAgICAgd2lkZ2V0UmVjdC5zZXRM
b2NhdGlvbih3aWRnZXRMb2NhdGlvbik7Ci0gICAgICAgICAgICBzZXRGcmFtZVJlY3Qod2lkZ2V0
UmVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnZhbGlkYXRlKCk7Ci19Ci0KLWlubGlu
ZSBib29sIFBvcHVwQ29udGFpbmVyOjppc1JUTCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fbGlz
dEJveC0+bV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkudGV4dERpcmVjdGlvbigpID09IFJUTDsK
LX0KLQotaW50IFBvcHVwQ29udGFpbmVyOjpzZWxlY3RlZEluZGV4KCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gbV9saXN0Qm94LT5zZWxlY3RlZEluZGV4KCk7Ci19Ci0KLWludCBQb3B1cENvbnRhaW5l
cjo6bWVudUl0ZW1IZWlnaHQoKSBjb25zdAotewotICAgIHJldHVybiBtX2xpc3RCb3gtPmdldFJv
d0hlaWdodCgwKTsKLX0KLQotaW50IFBvcHVwQ29udGFpbmVyOjptZW51SXRlbUZvbnRTaXplKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5nZXRSb3dGb250KDApLnNpemUoKTsKLX0K
LQotUG9wdXBNZW51U3R5bGUgUG9wdXBDb250YWluZXI6Om1lbnVTdHlsZSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIG1fbGlzdEJveC0+bV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCk7Ci19Ci0KLWNv
bnN0IFdURjo6VmVjdG9yPFBvcHVwSXRlbSo+JiBQb3B1cENvbnRhaW5lcjo6IHBvcHVwRGF0YSgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fbGlzdEJveC0+aXRlbXMoKTsKLX0KLQotU3RyaW5nIFBv
cHVwQ29udGFpbmVyOjpnZXRTZWxlY3RlZEl0ZW1Ub29sVGlwKCkKLXsKLSAgICAvLyBXZSBjYW5u
b3QgdXNlIG1fcG9wdXBDbGllbnQtPnNlbGVjdGVkSW5kZXgoKSB0byBjaG9vc2UgdG9vbHRpcCBt
ZXNzYWdlLAotICAgIC8vIGJlY2F1c2UgdGhlIHNlbGVjdGVkSW5kZXgoKSBtaWdodCByZXR1cm4g
ZmluYWwgc2VsZWN0ZWQgaW5kZXgsIG5vdCBob3ZlcmluZyBzZWxlY3Rpb24uCi0gICAgcmV0dXJu
IGxpc3RCb3goKS0+bV9wb3B1cENsaWVudC0+aXRlbVRvb2xUaXAobGlzdEJveCgpLT5tX3NlbGVj
dGVkSW5kZXgpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQb3B1cExpc3RCb3gg
aW1wbGVtZW50YXRpb24KLQotYm9vbCBQb3B1cExpc3RCb3g6OmhhbmRsZU1vdXNlRG93bkV2ZW50
KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZlbnQpCi17Ci0gICAgU2Nyb2xsYmFyKiBzY3Jv
bGxiYXIgPSBzY3JvbGxiYXJBdFBvaW50KGV2ZW50LnBvcygpKTsKLSAgICBpZiAoc2Nyb2xsYmFy
KSB7Ci0gICAgICAgIG1fY2FwdHVyaW5nU2Nyb2xsYmFyID0gc2Nyb2xsYmFyOwotICAgICAgICBt
X2NhcHR1cmluZ1Njcm9sbGJhci0+bW91c2VEb3duKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgfQotCi0gICAgaWYgKCFpc1BvaW50SW5Cb3VuZHMoZXZlbnQucG9zKCkpKQotICAg
ICAgICBhYmFuZG9uKCk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQb3B1cExpc3RC
b3g6OmhhbmRsZU1vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZlbnQp
Ci17Ci0gICAgaWYgKG1fY2FwdHVyaW5nU2Nyb2xsYmFyKSB7Ci0gICAgICAgIG1fY2FwdHVyaW5n
U2Nyb2xsYmFyLT5tb3VzZU1vdmVkKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
fQotCi0gICAgU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSBzY3JvbGxiYXJBdFBvaW50KGV2ZW50LnBv
cygpKTsKLSAgICBpZiAobV9sYXN0U2Nyb2xsYmFyVW5kZXJNb3VzZSAhPSBzY3JvbGxiYXIpIHsK
LSAgICAgICAgLy8gU2VuZCBtb3VzZSBleGl0ZWQgdG8gdGhlIG9sZCBzY3JvbGxiYXIuCi0gICAg
ICAgIGlmIChtX2xhc3RTY3JvbGxiYXJVbmRlck1vdXNlKQotICAgICAgICAgICAgbV9sYXN0U2Ny
b2xsYmFyVW5kZXJNb3VzZS0+bW91c2VFeGl0ZWQoKTsKLSAgICAgICAgbV9sYXN0U2Nyb2xsYmFy
VW5kZXJNb3VzZSA9IHNjcm9sbGJhcjsKLSAgICB9Ci0KLSAgICBpZiAoc2Nyb2xsYmFyKSB7Ci0g
ICAgICAgIHNjcm9sbGJhci0+bW91c2VNb3ZlZChldmVudCk7Ci0gICAgICAgIHJldHVybiB0cnVl
OwotICAgIH0KLQotICAgIGlmICghaXNQb2ludEluQm91bmRzKGV2ZW50LnBvcygpKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc2VsZWN0SW5kZXgocG9pbnRUb1Jvd0luZGV4KGV2ZW50
LnBvcygpKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUG9wdXBMaXN0Qm94OjpoYW5k
bGVNb3VzZVJlbGVhc2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2ZW50KQotewot
ICAgIGlmIChtX2NhcHR1cmluZ1Njcm9sbGJhcikgewotICAgICAgICBtX2NhcHR1cmluZ1Njcm9s
bGJhci0+bW91c2VVcCgpOwotICAgICAgICBtX2NhcHR1cmluZ1Njcm9sbGJhciA9IDA7Ci0gICAg
ICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmICghaXNQb2ludEluQm91bmRzKGV2ZW50
LnBvcygpKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBOZWVkIHRvIGNoZWNrIGJl
Zm9yZSBjYWxsaW5nIGFjY2VwdEluZGV4KCksIGJlY2F1c2UgbV9wb3B1cENsaWVudCBtaWdodCBi
ZSByZW1vdmVkIGluIGFjY2VwdEluZGV4KCkgY2FsbGluZyBiZWNhdXNlIG9mIGV2ZW50IGhhbmRs
ZXIuCi0gICAgYm9vbCBpc1NlbGVjdFBvcHVwID0gbV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCku
bWVudVR5cGUoKSA9PSBQb3B1cE1lbnVTdHlsZTo6U2VsZWN0UG9wdXA7Ci0gICAgaWYgKGFjY2Vw
dEluZGV4KHBvaW50VG9Sb3dJbmRleChldmVudC5wb3MoKSkpICYmIG1fZm9jdXNlZE5vZGUgJiYg
aXNTZWxlY3RQb3B1cCkgewotICAgICAgICBtX2ZvY3VzZWROb2RlLT5kaXNwYXRjaE1vdXNlRXZl
bnQoZXZlbnQsIGV2ZW50TmFtZXMoKS5tb3VzZXVwRXZlbnQpOwotICAgICAgICBtX2ZvY3VzZWRO
b2RlLT5kaXNwYXRjaE1vdXNlRXZlbnQoZXZlbnQsIGV2ZW50TmFtZXMoKS5jbGlja0V2ZW50KTsK
LQotICAgICAgICAvLyBDbGVhciBtX2ZvY3VzZWROb2RlIGhlcmUsIGJlY2F1c2Ugd2UgY2Fubm90
IGNsZWFyIGluIGhpZGVQb3B1cCgpIHdoaWNoIGlzIGNhbGxlZCBiZWZvcmUgZGlzcGF0Y2hNb3Vz
ZUV2ZW50KCkgaXMgY2FsbGVkLgotICAgICAgICBtX2ZvY3VzZWROb2RlID0gMDsKLSAgICB9Ci0K
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQb3B1cExpc3RCb3g6OmhhbmRsZVdoZWVsRXZl
bnQoY29uc3QgUGxhdGZvcm1XaGVlbEV2ZW50JiBldmVudCkKLXsKLSAgICBpZiAoIWlzUG9pbnRJ
bkJvdW5kcyhldmVudC5wb3MoKSkpIHsKLSAgICAgICAgYWJhbmRvbigpOwotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBQYXNzIGl0IG9mZiB0byB0aGUgc2Nyb2xsIHZpZXcu
Ci0gICAgLy8gU2FkbHksIFdlYkNvcmUgZGV2cyBkb24ndCB1bmRlcnN0YW5kIHRoZSB3aG9sZSAi
Y29uc3QiIHRoaW5nLgotICAgIHdoZWVsRXZlbnQoY29uc3RfY2FzdDxQbGF0Zm9ybVdoZWVsRXZl
bnQmPihldmVudCkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBTaG91bGQgYmUga2VwdCBp
biBzeW5jIHdpdGggaGFuZGxlS2V5RXZlbnQoKS4KLWJvb2wgUG9wdXBMaXN0Qm94Ojppc0ludGVy
ZXN0ZWRJbkV2ZW50Rm9yS2V5KGludCBrZXlDb2RlKQotewotICAgIHN3aXRjaCAoa2V5Q29kZSkg
ewotICAgIGNhc2UgVktFWV9FU0NBUEU6Ci0gICAgY2FzZSBWS0VZX1JFVFVSTjoKLSAgICBjYXNl
IFZLRVlfVVA6Ci0gICAgY2FzZSBWS0VZX0RPV046Ci0gICAgY2FzZSBWS0VZX1BSSU9SOgotICAg
IGNhc2UgVktFWV9ORVhUOgotICAgIGNhc2UgVktFWV9IT01FOgotICAgIGNhc2UgVktFWV9FTkQ6
Ci0gICAgY2FzZSBWS0VZX1RBQjoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotI2lmIEVOQUJMRShUT1VDSF9FVkVO
VFMpCi1ib29sIFBvcHVwTGlzdEJveDo6aGFuZGxlVG91Y2hFdmVudChjb25zdCBQbGF0Zm9ybVRv
dWNoRXZlbnQmKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLSNlbmRpZgotCi0jaWYgRU5BQkxF
KEdFU1RVUkVfUkVDT0dOSVpFUikKLWJvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVHZXN0dXJlRXZl
bnQoY29uc3QgUGxhdGZvcm1HZXN0dXJlRXZlbnQmKQotewotICAgIHJldHVybiBmYWxzZTsKLX0K
LSNlbmRpZgotCi1zdGF0aWMgYm9vbCBpc0NoYXJhY3RlclR5cGVFdmVudChjb25zdCBQbGF0Zm9y
bUtleWJvYXJkRXZlbnQmIGV2ZW50KQotewotICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGV2ZW50
IGlzIGEgY2hhcmFjdGVyLXR5cGVkIGV2ZW50IG9yIG5vdC4KLSAgICAvLyBXZSB1c2UgUmF3S2V5
RG93bi9DaGFyL0tleVVwIGV2ZW50IHNjaGVtZSBvbiBhbGwgcGxhdGZvcm1zLAotICAgIC8vIHNv
IFBsYXRmb3JtS2V5Ym9hcmRFdmVudDo6Q2hhciAobm90IFJhd0tleURvd24pIHR5cGUgZXZlbnQK
LSAgICAvLyBpcyBjb25zaWRlcmVkIGFzIGNoYXJhY3RlciB0eXBlIGV2ZW50LgotICAgIHJldHVy
biBldmVudC50eXBlKCkgPT0gUGxhdGZvcm1LZXlib2FyZEV2ZW50OjpDaGFyOwotfQotCi1ib29s
IFBvcHVwTGlzdEJveDo6aGFuZGxlS2V5RXZlbnQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50
JiBldmVudCkKLXsKLSAgICBpZiAoZXZlbnQudHlwZSgpID09IFBsYXRmb3JtS2V5Ym9hcmRFdmVu
dDo6S2V5VXApCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKG51bUl0ZW1zKCkgPT0g
MCAmJiBldmVudC53aW5kb3dzVmlydHVhbEtleUNvZGUoKSAhPSBWS0VZX0VTQ0FQRSkKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0KLSAgICBzd2l0Y2ggKGV2ZW50LndpbmRvd3NWaXJ0dWFsS2V5Q29k
ZSgpKSB7Ci0gICAgY2FzZSBWS0VZX0VTQ0FQRToKLSAgICAgICAgYWJhbmRvbigpOyAgLy8gbWF5
IGRlbGV0ZSB0aGlzCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgVktFWV9SRVRVUk46
Ci0gICAgICAgIGlmIChtX3NlbGVjdGVkSW5kZXggPT0gLTEpICB7Ci0gICAgICAgICAgICBoaWRl
UG9wdXAoKTsKLSAgICAgICAgICAgIC8vIERvbid0IGVhdCB0aGUgZW50ZXIgaWYgbm90aGluZyBp
cyBzZWxlY3RlZC4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAg
ICBhY2NlcHRJbmRleChtX3NlbGVjdGVkSW5kZXgpOyAgLy8gbWF5IGRlbGV0ZSB0aGlzCi0gICAg
ICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgVktFWV9VUDoKLSAgICBjYXNlIFZLRVlfRE9XTjoK
LSAgICAgICAgLy8gV2UgaGF2ZSB0byBmb3J3YXJkIG9ubHkgc2hpZnQgKyB1cCBjb21iaW5hdGlv
biB0byBmb2N1c2VkIG5vZGUgd2hlbiBhdXRvZmlsbCBwb3B1cC4KLSAgICAgICAgLy8gQmVjYXVz
ZSBhbGwgY2hhcmFjdGVycyBmcm9tIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0
IGFyZWEgc2hvdWxkIHNlbGVjdGVkIHdoZW4geW91IHByZXNzIHNoaWZ0ICsgdXAgYXJyb3cuCi0g
ICAgICAgIC8vIHNoaWZ0ICsgZG93biBzaG91bGQgYmUgdGhlIHNpbWlsYXIgd2F5IHRvIHNoaWZ0
ICsgdXAuCi0gICAgICAgIGlmIChldmVudC5tb2RpZmllcnMoKSAmJiBtX3BvcHVwQ2xpZW50LT5t
ZW51U3R5bGUoKS5tZW51VHlwZSgpID09IFBvcHVwTWVudVN0eWxlOjpBdXRvZmlsbFBvcHVwKQot
ICAgICAgICAgICAgbV9mb2N1c2VkTm9kZS0+ZGlzcGF0Y2hLZXlFdmVudChldmVudCk7Ci0gICAg
ICAgIGVsc2UgaWYgKGV2ZW50LndpbmRvd3NWaXJ0dWFsS2V5Q29kZSgpID09IFZLRVlfVVApCi0g
ICAgICAgICAgICBzZWxlY3RQcmV2aW91c1JvdygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBzZWxlY3ROZXh0Um93KCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVktFWV9QUklPUjoK
LSAgICAgICAgYWRqdXN0U2VsZWN0ZWRJbmRleCgtbV92aXNpYmxlUm93cyk7Ci0gICAgICAgIGJy
ZWFrOwotICAgIGNhc2UgVktFWV9ORVhUOgotICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KG1f
dmlzaWJsZVJvd3MpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFZLRVlfSE9NRToKLSAgICAg
ICAgYWRqdXN0U2VsZWN0ZWRJbmRleCgtbV9zZWxlY3RlZEluZGV4KTsKLSAgICAgICAgYnJlYWs7
Ci0gICAgY2FzZSBWS0VZX0VORDoKLSAgICAgICAgYWRqdXN0U2VsZWN0ZWRJbmRleChtX2l0ZW1z
LnNpemUoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmICghZXZl
bnQuY3RybEtleSgpICYmICFldmVudC5hbHRLZXkoKSAmJiAhZXZlbnQubWV0YUtleSgpCi0gICAg
ICAgICAgICAmJiBpc1ByaW50YWJsZUNoYXIoZXZlbnQud2luZG93c1ZpcnR1YWxLZXlDb2RlKCkp
Ci0gICAgICAgICAgICAmJiBpc0NoYXJhY3RlclR5cGVFdmVudChldmVudCkpCi0gICAgICAgICAg
ICB0eXBlQWhlYWRGaW5kKGV2ZW50KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYg
KG1fb3JpZ2luYWxJbmRleCAhPSBtX3NlbGVjdGVkSW5kZXgpIHsKLSAgICAgICAgLy8gS2V5Ym9h
cmQgZXZlbnRzIHNob3VsZCB1cGRhdGUgdGhlIHNlbGVjdGlvbiBpbW1lZGlhdGVseSAoYnV0IHdl
IGRvbid0Ci0gICAgICAgIC8vIHdhbnQgdG8gZmlyZSB0aGUgb25jaGFuZ2UgZXZlbnQgdW50aWwg
dGhlIHBvcHVwIGlzIGNsb3NlZCwgdG8gbWF0Y2gKLSAgICAgICAgLy8gSUUpLiAgV2UgY2hhbmdl
IHRoZSBvcmlnaW5hbCBpbmRleCBzbyB3ZSByZXZlcnQgdG8gdGhhdCB3aGVuIHRoZQotICAgICAg
ICAvLyBwb3B1cCBpcyBjbG9zZWQuCi0gICAgICAgIGlmIChtX3NldHRpbmdzLmFjY2VwdE9uQWJh
bmRvbikKLSAgICAgICAgICAgIG1fYWNjZXB0ZWRJbmRleE9uQWJhbmRvbiA9IG1fc2VsZWN0ZWRJ
bmRleDsKLQotICAgICAgICBzZXRPcmlnaW5hbEluZGV4KG1fc2VsZWN0ZWRJbmRleCk7Ci0gICAg
ICAgIGlmIChtX3NldHRpbmdzLnNldFRleHRPbkluZGV4Q2hhbmdlKQotICAgICAgICAgICAgbV9w
b3B1cENsaWVudC0+c2V0VGV4dEZyb21JdGVtKG1fc2VsZWN0ZWRJbmRleCk7Ci0gICAgfQotICAg
IGlmIChldmVudC53aW5kb3dzVmlydHVhbEtleUNvZGUoKSA9PSBWS0VZX1RBQikgewotICAgICAg
ICAvLyBUQUIgaXMgYSBzcGVjaWFsIGNhc2UgYXMgaXQgc2hvdWxkIHNlbGVjdCB0aGUgY3VycmVu
dCBpdGVtIGlmIGFueSBhbmQKLSAgICAgICAgLy8gYWR2YW5jZSBmb2N1cy4KLSAgICAgICAgaWYg
KG1fc2VsZWN0ZWRJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBhY2NlcHRJbmRleChtX3NlbGVj
dGVkSW5kZXgpOyAvLyBNYXkgZGVsZXRlIHVzLgotICAgICAgICAgICAgLy8gUmV0dXJuIGZhbHNl
IHNvIHRoZSBUQUIga2V5IGV2ZW50IGlzIHByb3BhZ2F0ZWQgdG8gdGhlIHBhZ2UuCi0gICAgICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2FsbCBhYmFuZG9uKCkg
c28gd2UgaG9ub3IgbV9hY2NlcHRlZEluZGV4T25BYmFuZG9uIGlmIHNldC4KLSAgICAgICAgYWJh
bmRvbigpOwotICAgICAgICAvLyBSZXR1cm4gZmFsc2Ugc28gdGhlIFRBQiBrZXkgZXZlbnQgaXMg
cHJvcGFnYXRlZCB0byB0aGUgcGFnZS4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQot
ICAgIHJldHVybiB0cnVlOwotfQotCi1Ib3N0V2luZG93KiBQb3B1cExpc3RCb3g6Omhvc3RXaW5k
b3coKSBjb25zdAotewotICAgIC8vIE91ciBwYXJlbnQgaXMgdGhlIHJvb3QgU2Nyb2xsVmlldywg
c28gaXQgaXMgdGhlIG9uZSB0aGF0IGhhcyBhCi0gICAgLy8gSG9zdFdpbmRvdy4gIEZyYW1lVmll
dzo6aG9zdFdpbmRvdygpIHdvcmtzIHNpbWlsYXJseS4KLSAgICByZXR1cm4gcGFyZW50KCkgPyBw
YXJlbnQoKS0+aG9zdFdpbmRvdygpIDogMDsKLX0KLQotLy8gRnJvbSBIVE1MU2VsZWN0RWxlbWVu
dC5jcHAKLXN0YXRpYyBTdHJpbmcgc3RyaXBMZWFkaW5nV2hpdGVTcGFjZShjb25zdCBTdHJpbmcm
IHN0cmluZykKLXsKLSAgICBpbnQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotICAgIGludCBp
OwotICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKLSAgICAgICAgaWYgKHN0cmluZ1tp
XSAhPSBub0JyZWFrU3BhY2UKLSAgICAgICAgICAgICYmIChzdHJpbmdbaV0gPD0gMHg3RiA/ICFp
c3NwYWNlKHN0cmluZ1tpXSkgOiAoZGlyZWN0aW9uKHN0cmluZ1tpXSkgIT0gV2hpdGVTcGFjZU5l
dXRyYWwpKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgcmV0dXJuIHN0cmluZy5zdWJzdHJp
bmcoaSwgbGVuZ3RoIC0gaSk7Ci19Ci0KLS8vIEZyb20gSFRNTFNlbGVjdEVsZW1lbnQuY3BwLCB3
aXRoIG1vZGlmaWNhdGlvbnMKLXZvaWQgUG9wdXBMaXN0Qm94Ojp0eXBlQWhlYWRGaW5kKGNvbnN0
IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYgZXZlbnQpCi17Ci0gICAgVGltZVN0YW1wIG5vdyA9IHN0
YXRpY19jYXN0PFRpbWVTdGFtcD4oY3VycmVudFRpbWUoKSAqIDEwMDAuMGYpOwotICAgIFRpbWVT
dGFtcCBkZWx0YSA9IG5vdyAtIG1fbGFzdENoYXJUaW1lOwotCi0gICAgLy8gUmVzZXQgdGhlIHRp
bWUgd2hlbiB1c2VyIHR5cGVzIGluIGEgY2hhcmFjdGVyLiBUaGUgdGltZSBnYXAgYmV0d2Vlbgot
ICAgIC8vIGxhc3QgY2hhcmFjdGVyIGFuZCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgdXNlZCB0
byBpbmRpY2F0ZSB3aGV0aGVyCi0gICAgLy8gdXNlciB0eXBlZCBpbiBhIHN0cmluZyBvciBqdXN0
IGEgY2hhcmFjdGVyIGFzIHRoZSBzZWFyY2ggcHJlZml4LgotICAgIG1fbGFzdENoYXJUaW1lID0g
bm93OwotCi0gICAgVUNoYXIgYyA9IGV2ZW50LndpbmRvd3NWaXJ0dWFsS2V5Q29kZSgpOwotCi0g
ICAgU3RyaW5nIHByZWZpeDsKLSAgICBpbnQgc2VhcmNoU3RhcnRPZmZzZXQgPSAxOwotICAgIGlm
IChkZWx0YSA+IGtUeXBlQWhlYWRUaW1lb3V0TXMpIHsKLSAgICAgICAgbV90eXBlZFN0cmluZyA9
IHByZWZpeCA9IFN0cmluZygmYywgMSk7Ci0gICAgICAgIG1fcmVwZWF0aW5nQ2hhciA9IGM7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgbV90eXBlZFN0cmluZy5hcHBlbmQoYyk7Ci0KLSAgICAgICAg
aWYgKGMgPT0gbV9yZXBlYXRpbmdDaGFyKQotICAgICAgICAgICAgLy8gVGhlIHVzZXIgaXMgbGlr
ZWx5IHRyeWluZyB0byBjeWNsZSB0aHJvdWdoIGFsbCB0aGUgaXRlbXMgc3RhcnRpbmcgd2l0aCB0
aGlzIGNoYXJhY3Rlciwgc28ganVzdCBzZWFyY2ggb24gdGhlIGNoYXJhY3RlcgotICAgICAgICAg
ICAgcHJlZml4ID0gU3RyaW5nKCZjLCAxKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBt
X3JlcGVhdGluZ0NoYXIgPSAwOwotICAgICAgICAgICAgcHJlZml4ID0gbV90eXBlZFN0cmluZzsK
LSAgICAgICAgICAgIHNlYXJjaFN0YXJ0T2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgIH0KLQot
ICAgIC8vIENvbXB1dGUgYSBjYXNlLWZvbGRlZCBjb3B5IG9mIHRoZSBwcmVmaXggc3RyaW5nIGJl
Zm9yZSBiZWdpbm5pbmcgdGhlIHNlYXJjaCBmb3IKLSAgICAvLyBhIG1hdGNoaW5nIGVsZW1lbnQu
IFRoaXMgY29kZSB1c2VzIGZvbGRDYXNlIHRvIHdvcmsgYXJvdW5kIHRoZSBmYWN0IHRoYXQKLSAg
ICAvLyBTdHJpbmc6OnN0YXJ0V2l0aCBkb2VzIG5vdCBmb2xkIG5vbi1BU0NJSSBjaGFyYWN0ZXJz
LiBUaGlzIGNvZGUgY2FuIGJlIGNoYW5nZWQKLSAgICAvLyB0byB1c2Ugc3RhcnRXaXRoIG9uY2Ug
dGhhdCBpcyBmaXhlZC4KLSAgICBTdHJpbmcgcHJlZml4V2l0aENhc2VGb2xkZWQocHJlZml4LmZv
bGRDYXNlKCkpOwotICAgIGludCBpdGVtQ291bnQgPSBudW1JdGVtcygpOwotICAgIGludCBpbmRl
eCA9IChtYXgoMCwgbV9zZWxlY3RlZEluZGV4KSArIHNlYXJjaFN0YXJ0T2Zmc2V0KSAlIGl0ZW1D
b3VudDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrLCBpbmRleCA9IChp
bmRleCArIDEpICUgaXRlbUNvdW50KSB7Ci0gICAgICAgIGlmICghaXNTZWxlY3RhYmxlSXRlbShp
bmRleCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoc3RyaXBMZWFkaW5n
V2hpdGVTcGFjZShtX2l0ZW1zW2luZGV4XS0+bGFiZWwpLmZvbGRDYXNlKCkuc3RhcnRzV2l0aChw
cmVmaXhXaXRoQ2FzZUZvbGRlZCkpIHsKLSAgICAgICAgICAgIHNlbGVjdEluZGV4KGluZGV4KTsK
LSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBQb3B1cExp
c3RCb3g6OnBhaW50KEdyYXBoaWNzQ29udGV4dCogZ2MsIGNvbnN0IEludFJlY3QmIHJlY3QpCi17
Ci0gICAgLy8gYWRqdXN0IGNvb3JkcyBmb3Igc2Nyb2xsZWQgZnJhbWUKLSAgICBJbnRSZWN0IHIg
PSBpbnRlcnNlY3Rpb24ocmVjdCwgZnJhbWVSZWN0KCkpOwotICAgIGludCB0eCA9IHgoKSAtIHNj
cm9sbFgoKTsKLSAgICBpbnQgdHkgPSB5KCkgLSBzY3JvbGxZKCk7Ci0KLSAgICByLm1vdmUoLXR4
LCAtdHkpOwotCi0gICAgLy8gc2V0IGNsaXAgcmVjdCB0byBtYXRjaCByZXZpc2VkIGRhbWFnZSBy
ZWN0Ci0gICAgZ2MtPnNhdmUoKTsKLSAgICBnYy0+dHJhbnNsYXRlKHN0YXRpY19jYXN0PGZsb2F0
Pih0eCksIHN0YXRpY19jYXN0PGZsb2F0Pih0eSkpOwotICAgIGdjLT5jbGlwKHIpOwotCi0gICAg
Ly8gRklYTUU6IENhbiB3ZSBvcHRpbWl6ZSBzY3JvbGxpbmcgdG8gbm90IHJlcXVpcmUgcmVwYWlu
dGluZyB0aGUgZW50aXJlCi0gICAgLy8gd2luZG93PyAgU2hvdWxkIHdlPwotICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgbnVtSXRlbXMoKTsgKytpKQotICAgICAgICBwYWludFJvdyhnYywgciwgaSk7
Ci0KLSAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGFuIGVtcHR5IHBvcHVwLgotICAgIGlmIChudW1J
dGVtcygpID09IDApCi0gICAgICAgIGdjLT5maWxsUmVjdChyLCBDb2xvcjo6d2hpdGUsIENvbG9y
U3BhY2VEZXZpY2VSR0IpOwotCi0gICAgZ2MtPnJlc3RvcmUoKTsKLQotICAgIFNjcm9sbFZpZXc6
OnBhaW50KGdjLCByZWN0KTsKLX0KLQotc3RhdGljIGNvbnN0IGludCBzZXBhcmF0b3JQYWRkaW5n
ID0gNDsKLXN0YXRpYyBjb25zdCBpbnQgc2VwYXJhdG9ySGVpZ2h0ID0gMTsKLQotdm9pZCBQb3B1
cExpc3RCb3g6OnBhaW50Um93KEdyYXBoaWNzQ29udGV4dCogZ2MsIGNvbnN0IEludFJlY3QmIHJl
Y3QsIGludCByb3dJbmRleCkKLXsKLSAgICAvLyBUaGlzIGNvZGUgaXMgYmFzZWQgbGFyZ2VseSBv
biBSZW5kZXJMaXN0Qm94OjpwYWludCogbWV0aG9kcy4KLQotICAgIEludFJlY3Qgcm93UmVjdCA9
IGdldFJvd0JvdW5kcyhyb3dJbmRleCk7Ci0gICAgaWYgKCFyb3dSZWN0LmludGVyc2VjdHMocmVj
dCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFBvcHVwTWVudVN0eWxlIHN0eWxlID0gbV9wb3B1
cENsaWVudC0+aXRlbVN0eWxlKHJvd0luZGV4KTsKLQotICAgIC8vIFBhaW50IGJhY2tncm91bmQK
LSAgICBDb2xvciBiYWNrQ29sb3IsIHRleHRDb2xvciwgbGFiZWxDb2xvcjsKLSAgICBpZiAocm93
SW5kZXggPT0gbV9zZWxlY3RlZEluZGV4KSB7Ci0gICAgICAgIGJhY2tDb2xvciA9IFJlbmRlclRo
ZW1lOjpkZWZhdWx0VGhlbWUoKS0+YWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xv
cigpOwotICAgICAgICB0ZXh0Q29sb3IgPSBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPmFj
dGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKTsKLSAgICAgICAgbGFiZWxDb2xv
ciA9IHRleHRDb2xvcjsKLSAgICB9IGVsc2UgewotICAgICAgICBiYWNrQ29sb3IgPSBzdHlsZS5i
YWNrZ3JvdW5kQ29sb3IoKTsKLSAgICAgICAgdGV4dENvbG9yID0gc3R5bGUuZm9yZWdyb3VuZENv
bG9yKCk7Ci0gICAgICAgIC8vIEZJWE1FOiBmb3Igbm93IHRoZSBsYWJlbCBjb2xvciBpcyBoYXJk
LWNvZGVkLiBJdCBzaG91bGQgYmUgYWRkZWQgdG8KLSAgICAgICAgLy8gdGhlIFBvcHVwTWVudVN0
eWxlLgotICAgICAgICBsYWJlbENvbG9yID0gQ29sb3IoMTE1LCAxMTUsIDExNSk7Ci0gICAgfQot
Ci0gICAgLy8gSWYgd2UgaGF2ZSBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQsIG1ha2Ugc3VyZSBp
dCBoYXMgYSBjb2xvciB0byBibGVuZAotICAgIC8vIGFnYWluc3QuCi0gICAgaWYgKGJhY2tDb2xv
ci5oYXNBbHBoYSgpKQotICAgICAgICBnYy0+ZmlsbFJlY3Qocm93UmVjdCwgQ29sb3I6OndoaXRl
LCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKLQotICAgIGdjLT5maWxsUmVjdChyb3dSZWN0LCBiYWNr
Q29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwotCi0gICAgLy8gSXQgZG9lc24ndCBsb29rIGdv
b2QgYnV0IEF1dG9maWxsIHJlcXVpcmVzIHNwZWNpYWwgc3R5bGUgZm9yIHNlcGFyYXRvci4KLSAg
ICAvLyBBdXRvZmlsbCBkb2Vzbid0IGhhdmUgcGFkZGluZyBhbmQgI2RjZGNkYyBjb2xvci4KLSAg
ICBpZiAobV9wb3B1cENsaWVudC0+aXRlbUlzU2VwYXJhdG9yKHJvd0luZGV4KSkgewotICAgICAg
ICBpbnQgcGFkZGluZyA9IHN0eWxlLm1lbnVUeXBlKCkgPT0gUG9wdXBNZW51U3R5bGU6OkF1dG9m
aWxsUG9wdXAgPyAwIDogc2VwYXJhdG9yUGFkZGluZzsKLSAgICAgICAgSW50UmVjdCBzZXBhcmF0
b3JSZWN0KAotICAgICAgICAgICAgcm93UmVjdC54KCkgKyBwYWRkaW5nLAotICAgICAgICAgICAg
cm93UmVjdC55KCkgKyAocm93UmVjdC5oZWlnaHQoKSAtIHNlcGFyYXRvckhlaWdodCkgLyAyLAot
ICAgICAgICAgICAgcm93UmVjdC53aWR0aCgpIC0gMiAqIHBhZGRpbmcsIHNlcGFyYXRvckhlaWdo
dCk7Ci0gICAgICAgIGdjLT5maWxsUmVjdChzZXBhcmF0b3JSZWN0LCBzdHlsZS5tZW51VHlwZSgp
ID09IFBvcHVwTWVudVN0eWxlOjpBdXRvZmlsbFBvcHVwID8gQ29sb3IoMHhkYywgMHhkYywgMHhk
YykgOiB0ZXh0Q29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotCi0gICAgaWYgKCFzdHlsZS5pc1Zpc2libGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgZ2MtPnNldEZpbGxDb2xvcih0ZXh0Q29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwotCi0g
ICAgRm9udCBpdGVtRm9udCA9IGdldFJvd0ZvbnQocm93SW5kZXgpOwotICAgIC8vIEZJWE1FOiBo
dHRwOi8vY3JidWcuY29tLzE5ODcyIFdlIHNob3VsZCBnZXQgdGhlIHBhZGRpbmcgb2YgaW5kaXZp
ZHVhbCBvcHRpb24KLSAgICAvLyBlbGVtZW50cy4gIFRoaXMgcHJvYmFibHkgaW1wbGllcyBjaGFu
Z2VzIHRvIFBvcHVwTWVudUNsaWVudC4KLSAgICBib29sIHJpZ2h0QWxpZ25lZCA9IG1fcG9wdXBD
bGllbnQtPm1lbnVTdHlsZSgpLnRleHREaXJlY3Rpb24oKSA9PSBSVEw7Ci0gICAgaW50IHRleHRY
ID0gMDsKLSAgICBpbnQgbWF4V2lkdGggPSAwOwotICAgIGlmIChyaWdodEFsaWduZWQpCi0gICAg
ICAgIG1heFdpZHRoID0gcm93UmVjdC53aWR0aCgpIC0gbWF4KDAsIG1fcG9wdXBDbGllbnQtPmNs
aWVudFBhZGRpbmdSaWdodCgpIC0gbV9wb3B1cENsaWVudC0+Y2xpZW50SW5zZXRSaWdodCgpKTsK
LSAgICBlbHNlIHsKLSAgICAgICAgdGV4dFggPSBtYXgoMCwgbV9wb3B1cENsaWVudC0+Y2xpZW50
UGFkZGluZ0xlZnQoKSAtIG1fcG9wdXBDbGllbnQtPmNsaWVudEluc2V0TGVmdCgpKTsKLSAgICAg
ICAgbWF4V2lkdGggPSByb3dSZWN0LndpZHRoKCkgLSB0ZXh0WDsKLSAgICB9Ci0gICAgLy8gUHJl
cGFyZSB0ZXh0IHRvIGJlIGRyYXduLgotICAgIFN0cmluZyBpdGVtVGV4dCA9IG1fcG9wdXBDbGll
bnQtPml0ZW1UZXh0KHJvd0luZGV4KTsKLSAgICBTdHJpbmcgaXRlbUxhYmVsID0gbV9wb3B1cENs
aWVudC0+aXRlbUxhYmVsKHJvd0luZGV4KTsKLSAgICBTdHJpbmcgaXRlbUljb24gPSBtX3BvcHVw
Q2xpZW50LT5pdGVtSWNvbihyb3dJbmRleCk7Ci0gICAgaWYgKG1fc2V0dGluZ3MucmVzdHJpY3RX
aWR0aE9mTGlzdEJveCkgeyAvLyBUcnVuY2F0ZSBzdHJpbmdzIHRvIGZpdCBpbi4KLSAgICAgICAg
Ly8gRklYTUU6IFdlIHNob3VsZCBsZWZ0VHJ1bmNhdGUgZm9yIHRoZSBydGwgY2FzZS4KLSAgICAg
ICAgLy8gU3RyaW5nVHJ1bmNhdG9yOjpsZWZ0VHJ1bmNhdGUgd291bGQgaGF2ZSB0byBiZSBpbXBs
ZW1lbnRlZC4KLSAgICAgICAgU3RyaW5nIHN0ciA9IFN0cmluZ1RydW5jYXRvcjo6cmlnaHRUcnVu
Y2F0ZShpdGVtVGV4dCwgbWF4V2lkdGgsIGl0ZW1Gb250KTsKLSAgICAgICAgaWYgKHN0ciAhPSBp
dGVtVGV4dCkgewotICAgICAgICAgICAgaXRlbVRleHQgPSBzdHI7Ci0gICAgICAgICAgICAvLyBE
b24ndCBkaXNwbGF5IHRoZSBsYWJlbCBvciBpY29uLCB3ZSBhbHJlYWR5IGRvbid0IGhhdmUgZW5v
dWdoIHJvb20gZm9yIHRoZSBpdGVtIHRleHQuCi0gICAgICAgICAgICBpdGVtTGFiZWwgPSAiIjsK
LSAgICAgICAgICAgIGl0ZW1JY29uID0gIiI7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWl0ZW1MYWJl
bC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGludCBhdmFpbGFibGVXaWR0aCA9IG1heFdpZHRo
IC0ga1RleHRUb0xhYmVsUGFkZGluZyAtCi0gICAgICAgICAgICAgICAgU3RyaW5nVHJ1bmNhdG9y
Ojp3aWR0aChpdGVtVGV4dCwgaXRlbUZvbnQpOwotICAgICAgICAgICAgaXRlbUxhYmVsID0gU3Ry
aW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKGl0ZW1MYWJlbCwgYXZhaWxhYmxlV2lkdGgsIGl0
ZW1Gb250KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFByZXBhcmUgdGhlIGRpcmVjdGlv
bmFsaXR5IHRvIGRyYXcgdGV4dC4KLSAgICBUZXh0UnVuIHRleHRSdW4oaXRlbVRleHQuY2hhcmFj
dGVycygpLCBpdGVtVGV4dC5sZW5ndGgoKSwgZmFsc2UsIDAsIDAsIFRleHRSdW46OkFsbG93VHJh
aWxpbmdFeHBhbnNpb24sIHN0eWxlLnRleHREaXJlY3Rpb24oKSwgc3R5bGUuaGFzVGV4dERpcmVj
dGlvbk92ZXJyaWRlKCkpOwotICAgIC8vIElmIHRoZSB0ZXh0IGlzIHJpZ2h0LXRvLWxlZnQsIG1h
a2UgaXQgcmlnaHQtYWxpZ25lZCBieSBhZGp1c3RpbmcgaXRzCi0gICAgLy8gYmVnaW5uaW5nIHBv
c2l0aW9uLgotICAgIGlmIChyaWdodEFsaWduZWQpCi0gICAgICAgIHRleHRYICs9IG1heFdpZHRo
IC0gaXRlbUZvbnQud2lkdGgodGV4dFJ1bik7Ci0KLSAgICAvLyBEcmF3IHRoZSBpdGVtIHRleHQu
Ci0gICAgaW50IHRleHRZID0gcm93UmVjdC55KCkgKyBpdGVtRm9udC5mb250TWV0cmljcygpLmFz
Y2VudCgpICsgKHJvd1JlY3QuaGVpZ2h0KCkgLSBpdGVtRm9udC5mb250TWV0cmljcygpLmhlaWdo
dCgpKSAvIDI7Ci0gICAgZ2MtPmRyYXdCaWRpVGV4dChpdGVtRm9udCwgdGV4dFJ1biwgSW50UG9p
bnQodGV4dFgsIHRleHRZKSk7Ci0KLSAgICAvLyBXZSBhcmUgdXNpbmcgdGhlIGxlZnQgcGFkZGlu
ZyBhcyB0aGUgcmlnaHQgcGFkZGluZyBpbmNsdWRlcyByb29tIGZvciB0aGUgc2Nyb2xsLWJhciB3
aGljaAotICAgIC8vIGRvZXMgbm90IHNob3cgaW4gdGhpcyBjYXNlLgotICAgIGludCByaWdodFBh
ZGRpbmcgPSBtYXgoMCwgbV9wb3B1cENsaWVudC0+Y2xpZW50UGFkZGluZ0xlZnQoKSAtIG1fcG9w
dXBDbGllbnQtPmNsaWVudEluc2V0TGVmdCgpKTsKLSAgICBpbnQgcmVtYWluaW5nV2lkdGggPSBy
b3dSZWN0LndpZHRoKCkgLSByaWdodFBhZGRpbmc7Ci0KLSAgICAvLyBEcmF3IHRoZSBpY29uIGlm
IGFwcGxpY2FibGUuCi0gICAgUmVmUHRyPEltYWdlPiBpbWFnZShJbWFnZTo6bG9hZFBsYXRmb3Jt
UmVzb3VyY2UoaXRlbUljb24udXRmOCgpLmRhdGEoKSkpOwotICAgIGlmIChpbWFnZSAmJiAhaW1h
Z2UtPmlzTnVsbCgpKSB7Ci0gICAgICAgIEludFJlY3QgaW1hZ2VSZWN0ID0gaW1hZ2UtPnJlY3Qo
KTsKLSAgICAgICAgcmVtYWluaW5nV2lkdGggLT0gKGltYWdlUmVjdC53aWR0aCgpICsga0xhYmVs
VG9JY29uUGFkZGluZyk7Ci0gICAgICAgIGltYWdlUmVjdC5zZXRYKHJvd1JlY3Qud2lkdGgoKSAt
IHJpZ2h0UGFkZGluZyAtIGltYWdlUmVjdC53aWR0aCgpKTsKLSAgICAgICAgaW1hZ2VSZWN0LnNl
dFkocm93UmVjdC55KCkgKyAocm93UmVjdC5oZWlnaHQoKSAtIGltYWdlUmVjdC5oZWlnaHQoKSkg
LyAyKTsKLSAgICAgICAgZ2MtPmRyYXdJbWFnZShpbWFnZS5nZXQoKSwgQ29sb3JTcGFjZURldmlj
ZVJHQiwgaW1hZ2VSZWN0KTsKLSAgICB9Ci0KLSAgICAvLyBEcmF3IHRoZSB0aGUgbGFiZWwgaWYg
YXBwbGljYWJsZS4KLSAgICBpZiAoaXRlbUxhYmVsLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgLy8gQXV0b2ZpbGwgbGFiZWwgaXMgMC45IHNtYWxsZXIgdGhhbiByZWd1bGFyIGZv
bnQgc2l6ZS4KLSAgICBpZiAoc3R5bGUubWVudVR5cGUoKSA9PSBQb3B1cE1lbnVTdHlsZTo6QXV0
b2ZpbGxQb3B1cCkgewotICAgICAgICBpdGVtRm9udCA9IG1fcG9wdXBDbGllbnQtPml0ZW1TdHls
ZShyb3dJbmRleCkuZm9udCgpOwotICAgICAgICBGb250RGVzY3JpcHRpb24gZCA9IGl0ZW1Gb250
LmZvbnREZXNjcmlwdGlvbigpOwotICAgICAgICBkLnNldENvbXB1dGVkU2l6ZShkLmNvbXB1dGVk
U2l6ZSgpICogMC45KTsKLSAgICAgICAgaXRlbUZvbnQgPSBGb250KGQsIGl0ZW1Gb250LmxldHRl
clNwYWNpbmcoKSwgaXRlbUZvbnQud29yZFNwYWNpbmcoKSk7Ci0gICAgICAgIGl0ZW1Gb250LnVw
ZGF0ZSgwKTsKLSAgICB9Ci0KLSAgICBUZXh0UnVuIGxhYmVsVGV4dFJ1bihpdGVtTGFiZWwuY2hh
cmFjdGVycygpLCBpdGVtTGFiZWwubGVuZ3RoKCksIGZhbHNlLCAwLCAwLCBUZXh0UnVuOjpBbGxv
d1RyYWlsaW5nRXhwYW5zaW9uLCBzdHlsZS50ZXh0RGlyZWN0aW9uKCksIHN0eWxlLmhhc1RleHRE
aXJlY3Rpb25PdmVycmlkZSgpKTsKLSAgICBpZiAocmlnaHRBbGlnbmVkKQotICAgICAgICB0ZXh0
WCA9IG1heCgwLCBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nTGVmdCgpIC0gbV9wb3B1cENs
aWVudC0+Y2xpZW50SW5zZXRMZWZ0KCkpOwotICAgIGVsc2UKLSAgICAgICAgdGV4dFggPSByZW1h
aW5pbmdXaWR0aCAtIGl0ZW1Gb250LndpZHRoKGxhYmVsVGV4dFJ1bik7Ci0KLSAgICBnYy0+c2V0
RmlsbENvbG9yKGxhYmVsQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwotICAgIGdjLT5kcmF3
QmlkaVRleHQoaXRlbUZvbnQsIGxhYmVsVGV4dFJ1biwgSW50UG9pbnQodGV4dFgsIHRleHRZKSk7
Ci19Ci0KLUZvbnQgUG9wdXBMaXN0Qm94OjpnZXRSb3dGb250KGludCByb3dJbmRleCkKLXsKLSAg
ICBGb250IGl0ZW1Gb250ID0gbV9wb3B1cENsaWVudC0+aXRlbVN0eWxlKHJvd0luZGV4KS5mb250
KCk7Ci0gICAgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1Jc0xhYmVsKHJvd0luZGV4KSkgewotICAg
ICAgICAvLyBCb2xkLWlmeSBsYWJlbHMgKGllLCBhbiA8b3B0Z3JvdXA+IGhlYWRpbmcpLgotICAg
ICAgICBGb250RGVzY3JpcHRpb24gZCA9IGl0ZW1Gb250LmZvbnREZXNjcmlwdGlvbigpOwotICAg
ICAgICBkLnNldFdlaWdodChGb250V2VpZ2h0Qm9sZCk7Ci0gICAgICAgIEZvbnQgZm9udChkLCBp
dGVtRm9udC5sZXR0ZXJTcGFjaW5nKCksIGl0ZW1Gb250LndvcmRTcGFjaW5nKCkpOwotICAgICAg
ICBmb250LnVwZGF0ZSgwKTsKLSAgICAgICAgcmV0dXJuIGZvbnQ7Ci0gICAgfQotCi0gICAgcmV0
dXJuIGl0ZW1Gb250OwotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6YWJhbmRvbigpCi17Ci0gICAg
UmVmUHRyPFBvcHVwTGlzdEJveD4ga2VlcEFsaXZlKHRoaXMpOwotCi0gICAgbV9zZWxlY3RlZElu
ZGV4ID0gbV9vcmlnaW5hbEluZGV4OwotCi0gICAgaGlkZVBvcHVwKCk7Ci0KLSAgICBpZiAobV9h
Y2NlcHRlZEluZGV4T25BYmFuZG9uID49IDApIHsKLSAgICAgICAgaWYgKG1fcG9wdXBDbGllbnQp
Ci0gICAgICAgICAgICBtX3BvcHVwQ2xpZW50LT52YWx1ZUNoYW5nZWQobV9hY2NlcHRlZEluZGV4
T25BYmFuZG9uKTsKLSAgICAgICAgbV9hY2NlcHRlZEluZGV4T25BYmFuZG9uID0gLTE7Ci0gICAg
fQotfQotCi1pbnQgUG9wdXBMaXN0Qm94Ojpwb2ludFRvUm93SW5kZXgoY29uc3QgSW50UG9pbnQm
IHBvaW50KQotewotICAgIGludCB5ID0gc2Nyb2xsWSgpICsgcG9pbnQueSgpOwotCi0gICAgLy8g
RklYTUU6IGJpbmFyeSBzZWFyY2ggaWYgcGVyZiBtYXR0ZXJzLgotICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbnVtSXRlbXMoKTsgKytpKSB7Ci0gICAgICAgIGlmICh5IDwgbV9pdGVtc1tpXS0+eU9m
ZnNldCkKLSAgICAgICAgICAgIHJldHVybiBpLTE7Ci0gICAgfQotCi0gICAgLy8gTGFzdCBpdGVt
PwotICAgIGlmICh5IDwgY29udGVudHNIZWlnaHQoKSkKLSAgICAgICAgcmV0dXJuIG1faXRlbXMu
c2l6ZSgpLTE7Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLWJvb2wgUG9wdXBMaXN0Qm94OjphY2Nl
cHRJbmRleChpbnQgaW5kZXgpCi17Ci0gICAgLy8gQ2xlYXIgbV9hY2NlcHRlZEluZGV4T25BYmFu
ZG9uIG9uY2UgdXNlciBhY2NlcHRzIHRoZSBzZWxlY3RlZCBpbmRleC4KLSAgICBpZiAobV9hY2Nl
cHRlZEluZGV4T25BYmFuZG9uID49IDApCi0gICAgICAgIG1fYWNjZXB0ZWRJbmRleE9uQWJhbmRv
biA9IC0xOwotCi0gICAgaWYgKGluZGV4ID49IG51bUl0ZW1zKCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgaWYgKG1fcG9wdXBDbGllbnQp
IHsKLSAgICAgICAgICAgIC8vIEVudGVyIHByZXNzZWQgd2l0aCBubyBzZWxlY3Rpb24sIGp1c3Qg
Y2xvc2UgdGhlIHBvcHVwLgotICAgICAgICAgICAgaGlkZVBvcHVwKCk7Ci0gICAgICAgIH0KLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChpc1NlbGVjdGFibGVJdGVtKGlu
ZGV4KSkgewotICAgICAgICBSZWZQdHI8UG9wdXBMaXN0Qm94PiBrZWVwQWxpdmUodGhpcyk7Ci0K
LSAgICAgICAgLy8gSGlkZSBvdXJzZWx2ZXMgZmlyc3Qgc2luY2UgdmFsdWVDaGFuZ2VkIG1heSBo
YXZlIG51bWVyb3VzIHNpZGUtZWZmZWN0cy4KLSAgICAgICAgaGlkZVBvcHVwKCk7Ci0KLSAgICAg
ICAgLy8gVGVsbCB0aGUgPHNlbGVjdD4gUG9wdXBNZW51Q2xpZW50IHdoYXQgaW5kZXggd2FzIHNl
bGVjdGVkLgotICAgICAgICBtX3BvcHVwQ2xpZW50LT52YWx1ZUNoYW5nZWQoaW5kZXgpOwotCi0g
ICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9p
ZCBQb3B1cExpc3RCb3g6OnNlbGVjdEluZGV4KGludCBpbmRleCkKLXsKLSAgICBpZiAoaW5kZXgg
PCAwIHx8IGluZGV4ID49IG51bUl0ZW1zKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGJvb2wg
aXNTZWxlY3RhYmxlID0gaXNTZWxlY3RhYmxlSXRlbShpbmRleCk7Ci0gICAgaWYgKGluZGV4ICE9
IG1fc2VsZWN0ZWRJbmRleCAmJiBpc1NlbGVjdGFibGUpIHsKLSAgICAgICAgaW52YWxpZGF0ZVJv
dyhtX3NlbGVjdGVkSW5kZXgpOwotICAgICAgICBtX3NlbGVjdGVkSW5kZXggPSBpbmRleDsKLSAg
ICAgICAgaW52YWxpZGF0ZVJvdyhtX3NlbGVjdGVkSW5kZXgpOwotCi0gICAgICAgIHNjcm9sbFRv
UmV2ZWFsU2VsZWN0aW9uKCk7Ci0gICAgICAgIG1fcG9wdXBDbGllbnQtPnNlbGVjdGlvbkNoYW5n
ZWQobV9zZWxlY3RlZEluZGV4KTsKLSAgICB9IGVsc2UgaWYgKCFpc1NlbGVjdGFibGUpIHsKLSAg
ICAgICAgY2xlYXJTZWxlY3Rpb24oKTsKLSAgICB9Ci19Ci0KLXZvaWQgUG9wdXBMaXN0Qm94Ojpz
ZXRPcmlnaW5hbEluZGV4KGludCBpbmRleCkKLXsKLSAgICBtX29yaWdpbmFsSW5kZXggPSBtX3Nl
bGVjdGVkSW5kZXggPSBpbmRleDsKLX0KLQotaW50IFBvcHVwTGlzdEJveDo6Z2V0Um93SGVpZ2h0
KGludCBpbmRleCkKLXsKLSAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICByZXR1cm4gUG9wdXBN
ZW51Q2hyb21pdW06Om1pbmltdW1Sb3dIZWlnaHQoKTsKLQotICAgIGlmIChtX3BvcHVwQ2xpZW50
LT5pdGVtU3R5bGUoaW5kZXgpLmlzRGlzcGxheU5vbmUoKSkKLSAgICAgICAgcmV0dXJuIFBvcHVw
TWVudUNocm9taXVtOjptaW5pbXVtUm93SGVpZ2h0KCk7Ci0KLSAgICAvLyBTZXBhcmF0b3Igcm93
IGhlaWdodCBpcyB0aGUgc2FtZSBzaXplIGFzIGl0c2VsZi4KLSAgICBpZiAobV9wb3B1cENsaWVu
dC0+aXRlbUlzU2VwYXJhdG9yKGluZGV4KSkKLSAgICAgICAgcmV0dXJuIG1heChzZXBhcmF0b3JI
ZWlnaHQsIFBvcHVwTWVudUNocm9taXVtOjptaW5pbXVtUm93SGVpZ2h0KCkpOwotCi0gICAgU3Ry
aW5nIGljb24gPSBtX3BvcHVwQ2xpZW50LT5pdGVtSWNvbihpbmRleCk7Ci0gICAgUmVmUHRyPElt
YWdlPiBpbWFnZShJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoaWNvbi51dGY4KCkuZGF0YSgp
KSk7Ci0KLSAgICBpbnQgZm9udEhlaWdodCA9IGdldFJvd0ZvbnQoaW5kZXgpLmZvbnRNZXRyaWNz
KCkuaGVpZ2h0KCk7Ci0gICAgaW50IGljb25IZWlnaHQgPSAoaW1hZ2UgJiYgIWltYWdlLT5pc051
bGwoKSkgPyBpbWFnZS0+cmVjdCgpLmhlaWdodCgpIDogMDsKLQotICAgIGludCBsaW5lUGFkZGlu
Z0hlaWdodCA9IG1fcG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpLm1lbnVUeXBlKCkgPT0gUG9wdXBN
ZW51U3R5bGU6OkF1dG9maWxsUG9wdXAgPyBrTGluZVBhZGRpbmdIZWlnaHQgOiAwOwotICAgIGlu
dCBjYWxjdWxhdGVkUm93SGVpZ2h0ID0gbWF4KGZvbnRIZWlnaHQsIGljb25IZWlnaHQpICsgbGlu
ZVBhZGRpbmdIZWlnaHQgKiAyOwotICAgIHJldHVybiBtYXgoY2FsY3VsYXRlZFJvd0hlaWdodCwg
UG9wdXBNZW51Q2hyb21pdW06Om1pbmltdW1Sb3dIZWlnaHQoKSk7Ci19Ci0KLUludFJlY3QgUG9w
dXBMaXN0Qm94OjpnZXRSb3dCb3VuZHMoaW50IGluZGV4KQotewotICAgIGlmIChpbmRleCA8IDAp
Ci0gICAgICAgIHJldHVybiBJbnRSZWN0KDAsIDAsIHZpc2libGVXaWR0aCgpLCBnZXRSb3dIZWln
aHQoaW5kZXgpKTsKLQotICAgIHJldHVybiBJbnRSZWN0KDAsIG1faXRlbXNbaW5kZXhdLT55T2Zm
c2V0LCB2aXNpYmxlV2lkdGgoKSwgZ2V0Um93SGVpZ2h0KGluZGV4KSk7Ci19Ci0KLXZvaWQgUG9w
dXBMaXN0Qm94OjppbnZhbGlkYXRlUm93KGludCBpbmRleCkKLXsKLSAgICBpZiAoaW5kZXggPCAw
KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBJbnZhbGlkYXRlIGluIHRoZSB3aW5kb3cgY29u
dGVudHMsIGFzIEZyYW1lbGVzc1Njcm9sbFZpZXc6OmludmFsaWRhdGVSZWN0Ci0gICAgLy8gcGFp
bnRzIGluIHRoZSB3aW5kb3cgY29vcmRpbmF0ZXMuCi0gICAgaW52YWxpZGF0ZVJlY3QoY29udGVu
dHNUb1dpbmRvdyhnZXRSb3dCb3VuZHMoaW5kZXgpKSk7Ci19Ci0KLXZvaWQgUG9wdXBMaXN0Qm94
OjpzY3JvbGxUb1JldmVhbFJvdyhpbnQgaW5kZXgpCi17Ci0gICAgaWYgKGluZGV4IDwgMCkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgSW50UmVjdCByb3dSZWN0ID0gZ2V0Um93Qm91bmRzKGluZGV4
KTsKLQotICAgIGlmIChyb3dSZWN0LnkoKSA8IHNjcm9sbFkoKSkgewotICAgICAgICAvLyBSb3cg
aXMgYWJvdmUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24sIHNjcm9sbCB1cC4KLSAgICAgICAgU2Ny
b2xsVmlldzo6c2V0U2Nyb2xsUG9zaXRpb24oSW50UG9pbnQoMCwgcm93UmVjdC55KCkpKTsKLSAg
ICB9IGVsc2UgaWYgKHJvd1JlY3QubWF4WSgpID4gc2Nyb2xsWSgpICsgdmlzaWJsZUhlaWdodCgp
KSB7Ci0gICAgICAgIC8vIFJvdyBpcyBiZWxvdyBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiwgc2Ny
b2xsIGRvd24uCi0gICAgICAgIFNjcm9sbFZpZXc6OnNldFNjcm9sbFBvc2l0aW9uKEludFBvaW50
KDAsIHJvd1JlY3QubWF4WSgpIC0gdmlzaWJsZUhlaWdodCgpKSk7Ci0gICAgfQotfQotCi1ib29s
IFBvcHVwTGlzdEJveDo6aXNTZWxlY3RhYmxlSXRlbShpbnQgaW5kZXgpCi17Ci0gICAgQVNTRVJU
KGluZGV4ID49IDAgJiYgaW5kZXggPCBudW1JdGVtcygpKTsKLSAgICByZXR1cm4gbV9pdGVtc1tp
bmRleF0tPnR5cGUgPT0gUG9wdXBJdGVtOjpUeXBlT3B0aW9uICYmIG1fcG9wdXBDbGllbnQtPml0
ZW1Jc0VuYWJsZWQoaW5kZXgpOwotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6Y2xlYXJTZWxlY3Rp
b24oKQotewotICAgIGlmIChtX3NlbGVjdGVkSW5kZXggIT0gLTEpIHsKLSAgICAgICAgaW52YWxp
ZGF0ZVJvdyhtX3NlbGVjdGVkSW5kZXgpOwotICAgICAgICBtX3NlbGVjdGVkSW5kZXggPSAtMTsK
LSAgICAgICAgbV9wb3B1cENsaWVudC0+c2VsZWN0aW9uQ2xlYXJlZCgpOwotICAgIH0KLX0KLQot
dm9pZCBQb3B1cExpc3RCb3g6OnNlbGVjdE5leHRSb3coKQotewotICAgIGlmICghbV9zZXR0aW5n
cy5sb29wU2VsZWN0aW9uTmF2aWdhdGlvbiB8fCBtX3NlbGVjdGVkSW5kZXggIT0gbnVtSXRlbXMo
KSAtIDEpIHsKLSAgICAgICAgYWRqdXN0U2VsZWN0ZWRJbmRleCgxKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIC8vIFdlIGFyZSBtb3ZpbmcgcGFzdCB0aGUgbGFzdCBpdGVtLCBubyBy
b3cgc2hvdWxkIGJlIHNlbGVjdGVkLgotICAgIGNsZWFyU2VsZWN0aW9uKCk7Ci19Ci0KLXZvaWQg
UG9wdXBMaXN0Qm94OjpzZWxlY3RQcmV2aW91c1JvdygpCi17Ci0gICAgaWYgKCFtX3NldHRpbmdz
Lmxvb3BTZWxlY3Rpb25OYXZpZ2F0aW9uIHx8IG1fc2VsZWN0ZWRJbmRleCA+IDApIHsKLSAgICAg
ICAgYWRqdXN0U2VsZWN0ZWRJbmRleCgtMSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAg
ICBpZiAobV9zZWxlY3RlZEluZGV4ID09IDApIHsKLSAgICAgICAgLy8gV2UgYXJlIG1vdmluZyBw
YXN0IHRoZSBmaXJzdCBpdGVtLCBjbGVhciB0aGUgc2VsZWN0aW9uLgotICAgICAgICBjbGVhclNl
bGVjdGlvbigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTm8gcm93IGlzIHNl
bGVjdGVkLCBqdW1wIHRvIHRoZSBsYXN0IGl0ZW0uCi0gICAgc2VsZWN0SW5kZXgobnVtSXRlbXMo
KSAtIDEpOwotICAgIHNjcm9sbFRvUmV2ZWFsU2VsZWN0aW9uKCk7Ci19Ci0KLXZvaWQgUG9wdXBM
aXN0Qm94OjphZGp1c3RTZWxlY3RlZEluZGV4KGludCBkZWx0YSkKLXsKLSAgICBpbnQgdGFyZ2V0
SW5kZXggPSBtX3NlbGVjdGVkSW5kZXggKyBkZWx0YTsKLSAgICB0YXJnZXRJbmRleCA9IG1pbiht
YXgodGFyZ2V0SW5kZXgsIDApLCBudW1JdGVtcygpIC0gMSk7Ci0gICAgaWYgKCFpc1NlbGVjdGFi
bGVJdGVtKHRhcmdldEluZGV4KSkgewotICAgICAgICAvLyBXZSBkaWRuJ3QgbGFuZCBvbiBhbiBv
cHRpb24uICBUcnkgdG8gZmluZCBvbmUuCi0gICAgICAgIC8vIFdlIHRyeSB0byBzZWxlY3QgdGhl
IGNsb3Nlc3QgaW5kZXggdG8gdGFyZ2V0LCBwcmlvcml0aXppbmcgYW55IGluCi0gICAgICAgIC8v
IHRoZSByYW5nZSBbY3VycmVudCwgdGFyZ2V0XS4KLQotICAgICAgICBpbnQgZGlyID0gZGVsdGEg
PiAwID8gMSA6IC0xOwotICAgICAgICBpbnQgdGVzdEluZGV4ID0gbV9zZWxlY3RlZEluZGV4Owot
ICAgICAgICBpbnQgYmVzdEluZGV4ID0gbV9zZWxlY3RlZEluZGV4OwotICAgICAgICBib29sIHBh
c3NlZFRhcmdldCA9IGZhbHNlOwotICAgICAgICB3aGlsZSAodGVzdEluZGV4ID49IDAgJiYgdGVz
dEluZGV4IDwgbnVtSXRlbXMoKSkgewotICAgICAgICAgICAgaWYgKGlzU2VsZWN0YWJsZUl0ZW0o
dGVzdEluZGV4KSkKLSAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSB0ZXN0SW5kZXg7Ci0gICAg
ICAgICAgICBpZiAodGVzdEluZGV4ID09IHRhcmdldEluZGV4KQotICAgICAgICAgICAgICAgIHBh
c3NlZFRhcmdldCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAocGFzc2VkVGFyZ2V0ICYmIGJlc3RJ
bmRleCAhPSBtX3NlbGVjdGVkSW5kZXgpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAg
ICAgICAgIHRlc3RJbmRleCArPSBkaXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQaWNrIHRo
ZSBiZXN0IGluZGV4LCB3aGljaCBtYXkgbWVhbiB3ZSBkb24ndCBjaGFuZ2UuCi0gICAgICAgIHRh
cmdldEluZGV4ID0gYmVzdEluZGV4OwotICAgIH0KLQotICAgIC8vIFNlbGVjdCB0aGUgbmV3IGlu
ZGV4LCBhbmQgZW5zdXJlIGl0cyB2aXNpYmxlLiAgV2UgZG8gdGhpcyByZWdhcmRsZXNzIG9mCi0g
ICAgLy8gd2hldGhlciB0aGUgc2VsZWN0aW9uIGNoYW5nZWQgdG8gZW5zdXJlIGtleWJvYXJkIGV2
ZW50cyBhbHdheXMgYnJpbmcgdGhlCi0gICAgLy8gc2VsZWN0aW9uIGludG8gdmlldy4KLSAgICBz
ZWxlY3RJbmRleCh0YXJnZXRJbmRleCk7Ci0gICAgc2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24oKTsK
LX0KLQotdm9pZCBQb3B1cExpc3RCb3g6OmhpZGVQb3B1cCgpCi17Ci0gICAgaWYgKHBhcmVudCgp
KSB7Ci0gICAgICAgIFBvcHVwQ29udGFpbmVyKiBjb250YWluZXIgPSBzdGF0aWNfY2FzdDxQb3B1
cENvbnRhaW5lcio+KHBhcmVudCgpKTsKLSAgICAgICAgaWYgKGNvbnRhaW5lci0+Y2xpZW50KCkp
Ci0gICAgICAgICAgICBjb250YWluZXItPmNsaWVudCgpLT5wb3B1cENsb3NlZChjb250YWluZXIp
OwotICAgICAgICBjb250YWluZXItPm5vdGlmeVBvcHVwSGlkZGVuKCk7Ci0gICAgfQotCi0gICAg
aWYgKG1fcG9wdXBDbGllbnQpCi0gICAgICAgIG1fcG9wdXBDbGllbnQtPnBvcHVwRGlkSGlkZSgp
OwotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6dXBkYXRlRnJvbUVsZW1lbnQoKQotewotICAgIGNs
ZWFyKCk7Ci0KLSAgICBpbnQgc2l6ZSA9IG1fcG9wdXBDbGllbnQtPmxpc3RTaXplKCk7Ci0gICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgUG9wdXBJdGVtOjpUeXBl
IHR5cGU7Ci0gICAgICAgIGlmIChtX3BvcHVwQ2xpZW50LT5pdGVtSXNTZXBhcmF0b3IoaSkpCi0g
ICAgICAgICAgICB0eXBlID0gUG9wdXBJdGVtOjpUeXBlU2VwYXJhdG9yOwotICAgICAgICBlbHNl
IGlmIChtX3BvcHVwQ2xpZW50LT5pdGVtSXNMYWJlbChpKSkKLSAgICAgICAgICAgIHR5cGUgPSBQ
b3B1cEl0ZW06OlR5cGVHcm91cDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdHlwZSA9IFBv
cHVwSXRlbTo6VHlwZU9wdGlvbjsKLSAgICAgICAgbV9pdGVtcy5hcHBlbmQobmV3IFBvcHVwSXRl
bShtX3BvcHVwQ2xpZW50LT5pdGVtVGV4dChpKSwgdHlwZSkpOwotICAgICAgICBtX2l0ZW1zW2ld
LT5lbmFibGVkID0gaXNTZWxlY3RhYmxlSXRlbShpKTsKLSAgICAgICAgUG9wdXBNZW51U3R5bGUg
c3R5bGUgPSBtX3BvcHVwQ2xpZW50LT5pdGVtU3R5bGUoaSk7Ci0gICAgICAgIG1faXRlbXNbaV0t
PnRleHREaXJlY3Rpb24gPSBzdHlsZS50ZXh0RGlyZWN0aW9uKCk7Ci0gICAgICAgIG1faXRlbXNb
aV0tPmhhc1RleHREaXJlY3Rpb25PdmVycmlkZSA9IHN0eWxlLmhhc1RleHREaXJlY3Rpb25PdmVy
cmlkZSgpOwotICAgIH0KLQotICAgIG1fc2VsZWN0ZWRJbmRleCA9IG1fcG9wdXBDbGllbnQtPnNl
bGVjdGVkSW5kZXgoKTsKLSAgICBzZXRPcmlnaW5hbEluZGV4KG1fc2VsZWN0ZWRJbmRleCk7Ci0K
LSAgICBsYXlvdXQoKTsKLX0KLQotdm9pZCBQb3B1cExpc3RCb3g6OnNldE1heFdpZHRoQW5kTGF5
b3V0KGludCBtYXhXaWR0aCkKLXsKLSAgICBtX21heFdpbmRvd1dpZHRoID0gbWF4V2lkdGg7Ci0g
ICAgbGF5b3V0KCk7Ci19Ci0KLXZvaWQgUG9wdXBMaXN0Qm94OjpsYXlvdXQoKQotewotICAgIGJv
b2wgaXNSaWdodEFsaWduZWQgPSBtX3BvcHVwQ2xpZW50LT5tZW51U3R5bGUoKS50ZXh0RGlyZWN0
aW9uKCkgPT0gUlRMOwotICAgIAotICAgIC8vIFNpemUgb3VyIGNoaWxkIGl0ZW1zLgotICAgIGlu
dCBiYXNlV2lkdGggPSAwOwotICAgIGludCBwYWRkaW5nV2lkdGggPSAwOwotICAgIGludCBsaW5l
RW5kUGFkZGluZ1dpZHRoID0gMDsKLSAgICBpbnQgeSA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBudW1JdGVtcygpOyArK2kpIHsKLSAgICAgICAgLy8gUGxhY2UgdGhlIGl0ZW0gdmVydGlj
YWxseS4KLSAgICAgICAgbV9pdGVtc1tpXS0+eU9mZnNldCA9IHk7Ci0gICAgICAgIGlmIChtX3Bv
cHVwQ2xpZW50LT5pdGVtU3R5bGUoaSkuaXNEaXNwbGF5Tm9uZSgpKQotICAgICAgICAgICAgY29u
dGludWU7Ci0gICAgICAgIHkgKz0gZ2V0Um93SGVpZ2h0KGkpOwotCi0gICAgICAgIC8vIEVuc3Vy
ZSB0aGUgcG9wdXAgaXMgd2lkZSBlbm91Z2ggdG8gZml0IHRoaXMgaXRlbS4KLSAgICAgICAgRm9u
dCBpdGVtRm9udCA9IGdldFJvd0ZvbnQoaSk7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gbV9wb3B1
cENsaWVudC0+aXRlbVRleHQoaSk7Ci0gICAgICAgIFN0cmluZyBsYWJlbCA9IG1fcG9wdXBDbGll
bnQtPml0ZW1MYWJlbChpKTsKLSAgICAgICAgU3RyaW5nIGljb24gPSBtX3BvcHVwQ2xpZW50LT5p
dGVtSWNvbihpKTsKLSAgICAgICAgUmVmUHRyPEltYWdlPiBpY29uSW1hZ2UoSW1hZ2U6OmxvYWRQ
bGF0Zm9ybVJlc291cmNlKGljb24udXRmOCgpLmRhdGEoKSkpOwotICAgICAgICBpbnQgd2lkdGgg
PSAwOwotICAgICAgICBpZiAoIXRleHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgd2lkdGggPSBp
dGVtRm9udC53aWR0aChUZXh0UnVuKHRleHQpKTsKLSAgICAgICAgaWYgKCFsYWJlbC5pc0VtcHR5
KCkpIHsKLSAgICAgICAgICAgIGlmICh3aWR0aCA+IDApCi0gICAgICAgICAgICAgICAgd2lkdGgg
Kz0ga1RleHRUb0xhYmVsUGFkZGluZzsKLSAgICAgICAgICAgIHdpZHRoICs9IGl0ZW1Gb250Lndp
ZHRoKFRleHRSdW4obGFiZWwpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaWNvbkltYWdlICYm
ICFpY29uSW1hZ2UtPmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICBpZiAod2lkdGggPiAwKQotICAg
ICAgICAgICAgICAgIHdpZHRoICs9IGtMYWJlbFRvSWNvblBhZGRpbmc7Ci0gICAgICAgICAgICB3
aWR0aCArPSBpY29uSW1hZ2UtPnJlY3QoKS53aWR0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAg
YmFzZVdpZHRoID0gbWF4KGJhc2VXaWR0aCwgd2lkdGgpOwotICAgICAgICAvLyBGSVhNRTogaHR0
cDovL2IvMTIxMDQ4MSBXZSBzaG91bGQgZ2V0IHRoZSBwYWRkaW5nIG9mIGluZGl2aWR1YWwgb3B0
aW9uIGVsZW1lbnRzLgotICAgICAgICBwYWRkaW5nV2lkdGggPSBtYXgocGFkZGluZ1dpZHRoLAot
ICAgICAgICAgICAgbV9wb3B1cENsaWVudC0+Y2xpZW50UGFkZGluZ0xlZnQoKSArIG1fcG9wdXBD
bGllbnQtPmNsaWVudFBhZGRpbmdSaWdodCgpKTsKLSAgICAgICAgbGluZUVuZFBhZGRpbmdXaWR0
aCA9IG1heChsaW5lRW5kUGFkZGluZ1dpZHRoLAotICAgICAgICAgICAgaXNSaWdodEFsaWduZWQg
PyBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nTGVmdCgpIDogbV9wb3B1cENsaWVudC0+Y2xp
ZW50UGFkZGluZ1JpZ2h0KCkpOwotICAgIH0KLQotICAgIC8vIENhbGN1bGF0ZSBzY3JvbGwgYmFy
IHdpZHRoLgotICAgIGludCB3aW5kb3dIZWlnaHQgPSAwOwotICAgIG1fdmlzaWJsZVJvd3MgPSBt
aW4obnVtSXRlbXMoKSwga01heFZpc2libGVSb3dzKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgbV92aXNpYmxlUm93czsgKytpKSB7Ci0gICAgICAgIGludCByb3dIZWlnaHQgPSBnZXRSb3dI
ZWlnaHQoaSk7Ci0KLSAgICAgICAgLy8gT25seSBjbGlwIHRoZSB3aW5kb3cgaGVpZ2h0IGZvciBu
b24tTWFjIHBsYXRmb3Jtcy4KLSAgICAgICAgaWYgKHdpbmRvd0hlaWdodCArIHJvd0hlaWdodCA+
IG1fbWF4SGVpZ2h0KSB7Ci0gICAgICAgICAgICBtX3Zpc2libGVSb3dzID0gaTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgd2luZG93SGVpZ2h0ICs9IHJvd0hlaWdo
dDsKLSAgICB9Ci0KLSAgICAvLyBTZXQgb3VyIHdpZGdldCBhbmQgc2Nyb2xsYWJsZSBjb250ZW50
cyBzaXplcy4KLSAgICBpbnQgc2Nyb2xsYmFyV2lkdGggPSAwOwotICAgIGlmIChtX3Zpc2libGVS
b3dzIDwgbnVtSXRlbXMoKSkgewotICAgICAgICBzY3JvbGxiYXJXaWR0aCA9IFNjcm9sbGJhclRo
ZW1lOjpuYXRpdmVUaGVtZSgpLT5zY3JvbGxiYXJUaGlja25lc3MoKTsKLQotICAgICAgICAvLyBV
c2Uga01pbkVuZE9mTGluZVBhZGRpbmcgd2hlbiB0aGVyZSBpcyBhIHNjcm9sbGJhciBzbyB0aGF0
IHdlIHVzZQotICAgICAgICAvLyBhcyBtdWNoIGFzIChsaW5lRW5kUGFkZGluZ1dpZHRoIC0ga01p
bkVuZE9mTGluZVBhZGRpbmcpIHBhZGRpbmcKLSAgICAgICAgLy8gc3BhY2UgZm9yIHNjcm9sbGJh
ciBhbmQgYWxsb3cgdXNlciB0byB1c2UgQ1NTIHBhZGRpbmcgdG8gbWFrZSB0aGUKLSAgICAgICAg
Ly8gcG9wdXAgbGlzdGJveCBhbGlnbiB3aXRoIHRoZSBzZWxlY3QgZWxlbWVudC4KLSAgICAgICAg
cGFkZGluZ1dpZHRoID0gcGFkZGluZ1dpZHRoIC0gbGluZUVuZFBhZGRpbmdXaWR0aCArIGtNaW5F
bmRPZkxpbmVQYWRkaW5nOwotICAgIH0KLQotICAgIGludCB3aW5kb3dXaWR0aDsKLSAgICBpbnQg
Y29udGVudFdpZHRoOwotICAgIGlmIChtX3NldHRpbmdzLnJlc3RyaWN0V2lkdGhPZkxpc3RCb3gp
IHsKLSAgICAgICAgd2luZG93V2lkdGggPSBtX2Jhc2VXaWR0aDsKLSAgICAgICAgY29udGVudFdp
ZHRoID0gbV9iYXNlV2lkdGggLSBzY3JvbGxiYXJXaWR0aDsKLSAgICB9IGVsc2UgewotICAgICAg
ICB3aW5kb3dXaWR0aCA9IGJhc2VXaWR0aCArIHNjcm9sbGJhcldpZHRoICsgcGFkZGluZ1dpZHRo
OwotICAgICAgICBpZiAod2luZG93V2lkdGggPiBtX21heFdpbmRvd1dpZHRoKSB7Ci0gICAgICAg
ICAgICAvLyB3aW5kb3dXaWR0aCBleGNlZWRzIG1fbWF4V2luZG93V2lkdGgsIHNvIHdlIGhhdmUg
dG8gY2xpcC4KLSAgICAgICAgICAgIHdpbmRvd1dpZHRoID0gbV9tYXhXaW5kb3dXaWR0aDsKLSAg
ICAgICAgICAgIGJhc2VXaWR0aCA9IHdpbmRvd1dpZHRoIC0gc2Nyb2xsYmFyV2lkdGggLSBwYWRk
aW5nV2lkdGg7Ci0gICAgICAgICAgICBtX2Jhc2VXaWR0aCA9IGJhc2VXaWR0aDsKLSAgICAgICAg
fQotICAgICAgICBjb250ZW50V2lkdGggPSB3aW5kb3dXaWR0aCAtIHNjcm9sbGJhcldpZHRoOwot
Ci0gICAgICAgIGlmICh3aW5kb3dXaWR0aCA8IG1fYmFzZVdpZHRoKSB7Ci0gICAgICAgICAgICB3
aW5kb3dXaWR0aCA9IG1fYmFzZVdpZHRoOwotICAgICAgICAgICAgY29udGVudFdpZHRoID0gbV9i
YXNlV2lkdGggLSBzY3JvbGxiYXJXaWR0aDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBt
X2Jhc2VXaWR0aCA9IGJhc2VXaWR0aDsKLSAgICB9Ci0KLSAgICByZXNpemUod2luZG93V2lkdGgs
IHdpbmRvd0hlaWdodCk7Ci0gICAgc2V0Q29udGVudHNTaXplKEludFNpemUoY29udGVudFdpZHRo
LCBnZXRSb3dCb3VuZHMobnVtSXRlbXMoKSAtIDEpLm1heFkoKSkpOwotCi0gICAgaWYgKGhvc3RX
aW5kb3coKSkKLSAgICAgICAgc2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24oKTsKLQotICAgIGludmFs
aWRhdGUoKTsKLX0KLQotdm9pZCBQb3B1cExpc3RCb3g6OmNsZWFyKCkKLXsKLSAgICBmb3IgKFZl
Y3RvcjxQb3B1cEl0ZW0qPjo6aXRlcmF0b3IgaXQgPSBtX2l0ZW1zLmJlZ2luKCk7IGl0ICE9IG1f
aXRlbXMuZW5kKCk7ICsraXQpCi0gICAgICAgIGRlbGV0ZSAqaXQ7Ci0gICAgbV9pdGVtcy5jbGVh
cigpOwotfQotCi1ib29sIFBvcHVwTGlzdEJveDo6aXNQb2ludEluQm91bmRzKGNvbnN0IEludFBv
aW50JiBwb2ludCkKLXsKLSAgICByZXR1cm4gbnVtSXRlbXMoKSAhPSAwICYmIEludFJlY3QoMCwg
MCwgd2lkdGgoKSwgaGVpZ2h0KCkpLmNvbnRhaW5zKHBvaW50KTsKLX0KLQotLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLwotLy8gUG9wdXBNZW51Q2hyb21pdW0gaW1wbGVtZW50YXRpb24KLS8vCi0vLyBO
b3RlOiB5b3UgY2Fubm90IGFkZCBtZXRob2RzIHRvIHRoaXMgY2xhc3MsIHNpbmNlIGl0IGlzIGRl
ZmluZWQgYWJvdmUgdGhlCi0vLyAgICAgICBwb3J0YWJpbGl0eSBsYXllci4gVG8gYWNjZXNzIG1l
dGhvZHMgYW5kIHByb3BlcnRpZXMgb24gdGhlCi0vLyAgICAgICBwb3B1cCB3aWRnZXRzLCB1c2Ug
fHBvcHVwV2luZG93fCBhYm92ZS4KLQogUG9wdXBNZW51Q2hyb21pdW06OlBvcHVwTWVudUNocm9t
aXVtKFBvcHVwTWVudUNsaWVudCogY2xpZW50KQogICAgIDogbV9wb3B1cENsaWVudChjbGllbnQp
CiB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cE1l
bnVDaHJvbWl1bS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBNZW51
Q2hyb21pdW0uaAppbmRleCA4MmQ4NzliZGYwNWUzOTYzZDgzODgyYzdjN2JhYzA5ZTk2OTk1NDY3
Li5lZGQzNTUyNmYxN2MzZGM2NGU1MWZjMWYwNzk2ZjQwNGVjODE1ZTVlIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cE1lbnVDaHJvbWl1bS5oCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVtLmgKQEAg
LTMzLDE3NiArMzMsMTcgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogCi0jaW5jbHVkZSAiRnJh
bWVsZXNzU2Nyb2xsVmlldy5oIgotI2luY2x1ZGUgIkludFJlY3QuaCIKLSNpbmNsdWRlICJQbGF0
Zm9ybVN0cmluZy5oIgogI2luY2x1ZGUgIlBvcHVwTWVudS5oIgogI2luY2x1ZGUgIlBvcHVwTWVu
dVByaXZhdGUuaCIKLSNpbmNsdWRlICJQb3B1cE1lbnVTdHlsZS5oIgogCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKIGNsYXNzIENocm9tZUNsaWVudENocm9taXVtOwogY2xhc3MgRnJhbWVWaWV3Owot
Y2xhc3MgUG9wdXBMaXN0Qm94OworY2xhc3MgSW50UmVjdDsKK2NsYXNzIFBvcHVwSXRlbTsKIGNs
YXNzIFBvcHVwTWVudUNsaWVudDsKIAotLy8gQSBjb250YWluZXIgZm9yIHRoZSBkYXRhIGZvciBl
YWNoIG1lbnUgaXRlbSAoZS5nLiByZXByZXNlbnRlZCBieSA8b3B0aW9uPgotLy8gb3IgPG9wdGdy
b3VwPiBpbiBhIDxzZWxlY3Q+IHdpZGdldCkgYW5kIGlzIHVzZWQgYnkgUG9wdXBMaXN0Qm94Lgot
c3RydWN0IFBvcHVwSXRlbSB7Ci0gICAgZW51bSBUeXBlIHsKLSAgICAgICAgVHlwZU9wdGlvbiwK
LSAgICAgICAgVHlwZUdyb3VwLAotICAgICAgICBUeXBlU2VwYXJhdG9yCi0gICAgfTsKLQotICAg
IFBvcHVwSXRlbShjb25zdCBTdHJpbmcmIGxhYmVsLCBUeXBlIHR5cGUpCi0gICAgICAgIDogbGFi
ZWwobGFiZWwpCi0gICAgICAgICwgdHlwZSh0eXBlKQotICAgICAgICAsIHlPZmZzZXQoMCkKLSAg
ICB7Ci0gICAgfQotICAgIFN0cmluZyBsYWJlbDsKLSAgICBUeXBlIHR5cGU7Ci0gICAgaW50IHlP
ZmZzZXQ7IC8vIHkgb2Zmc2V0IG9mIHRoaXMgaXRlbSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBvZiB0
aGUgcG9wdXAuCi0gICAgVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uOwotICAgIGJvb2wgaGFz
VGV4dERpcmVjdGlvbk92ZXJyaWRlOwotICAgIGJvb2wgZW5hYmxlZDsKLX07Ci0KLS8vIEZJWE1F
OiBPdXIgRnJhbWVsZXNzU2Nyb2xsVmlldyBjbGFzc2VzIHNob3VsZCBwcm9iYWJseSBpbXBsZW1l
bnQgSG9zdFdpbmRvdyEKLQotLy8gVGhlIFBvcHVwQ29udGFpbmVyIGNsYXNzIGhvbGRzIGEgUG9w
dXBMaXN0Qm94IChzZWUgY3BwIGZpbGUpLiAgSXRzIHNvbGUgcHVycG9zZSBpcyB0byBiZQotLy8g
YWJsZSB0byBkcmF3IGEgYm9yZGVyIGFyb3VuZCBpdHMgY2hpbGQuICBBbGwgaXRzIHBhaW50L2V2
ZW50IGhhbmRsaW5nIGlzCi0vLyBqdXN0IGZvcndhcmRlZCB0byB0aGUgY2hpbGQgbGlzdEJveCAo
d2l0aCB0aGUgYXBwcm9wcmlhdGUgdHJhbnNmb3JtcykuCi0vLyBOT1RFOiB0aGlzIGNsYXNzIGlz
IGV4cG9zZWQgc28gaXQgY2FuIGJlIGluc3RhbnRpYXRlZCBkaXJlY2x5IGZvciB0aGUKLS8vIGF1
dG9maWxsIHBvcHVwLiAgV2UgY2Fubm90IHVzZSB0aGUgUG9wdXAgY2xhc3MgZGlyZWN0bHkgaW4g
dGhhdCBjYXNlIGFzIHRoZQotLy8gYXV0b2ZpbGwgcG9wdXAgc2hvdWxkIG5vdCBiZSBmb2N1c2Vk
IHdoZW4gc2hvd24gYW5kIHdlIHdhbnQgdG8gZm9yd2FyZCB0aGUKLS8vIGtleSBldmVudHMgdG8g
aXQgKHRocm91Z2ggaGFuZGxlS2V5RXZlbnQpLgotCi1zdHJ1Y3QgUG9wdXBDb250YWluZXJTZXR0
aW5ncyB7Ci0gICAgLy8gV2hldGhlciB0aGUgUG9wdXBNZW51Q2xpZW50IHNob3VsZCBiZSB0b2xk
IHRvIGNoYW5nZSBpdHMgdGV4dCB3aGVuIGEKLSAgICAvLyBuZXcgaXRlbSBpcyBzZWxlY3RlZCBi
eSB1c2luZyB0aGUgYXJyb3cga2V5cy4KLSAgICBib29sIHNldFRleHRPbkluZGV4Q2hhbmdlOwot
Ci0gICAgLy8gV2hldGhlciB0aGUgc2VsZWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCB3aGVuIHRo
ZSBwb3B1cCBtZW51IGlzCi0gICAgLy8gY2xvc2VkICh0aHJvdWdoIEVTQyBiZWluZyBwcmVzc2Vk
IG9yIHRoZSBmb2N1cyBnb2luZyBhd2F5KS4KLSAgICAvLyBOb3RlIHRoYXQgd2hlbiBUQUIgaXMg
cHJlc3NlZCwgdGhlIHNlbGVjdGlvbiBpcyBhbHdheXMgYWNjZXB0ZWQKLSAgICAvLyByZWdhcmRs
ZXNzIG9mIHRoaXMgc2V0dGluZy4KLSAgICBib29sIGFjY2VwdE9uQWJhbmRvbjsKLQotICAgIC8v
IFdoZXRoZXIgd2Ugc2hvdWxkIG1vdmUgdGhlIHNlbGVjdGlvbiB0byB0aGUgZmlyc3QvbGFzdCBp
dGVtIHdoZW4KLSAgICAvLyB0aGUgdXNlciBwcmVzc2VzIGRvd24vdXAgYXJyb3cga2V5cyBhbmQg
dGhlIGxhc3QvZmlyc3QgaXRlbSBpcwotICAgIC8vIHNlbGVjdGVkLgotICAgIGJvb2wgbG9vcFNl
bGVjdGlvbk5hdmlnYXRpb247Ci0KLSAgICAvLyBXaGV0aGVyIHdlIHNob3VsZCByZXN0cmljdCB0
aGUgd2lkdGggb2YgdGhlIFBvcHVwTGlzdEJveCBvciBub3QuCi0gICAgLy8gQXV0b2NvbXBsZXRl
IHBvcHVwcyBhcmUgcmVzdHJpY3RlZCwgY29tYm8tYm94ZXMgKHNlbGVjdCB0YWdzKSBhcmVuJ3Qu
Ci0gICAgYm9vbCByZXN0cmljdFdpZHRoT2ZMaXN0Qm94OwotfTsKLQotY2xhc3MgUG9wdXBDb250
YWluZXIgOiBwdWJsaWMgRnJhbWVsZXNzU2Nyb2xsVmlldyB7Ci1wdWJsaWM6Ci0gICAgZW51bSBQ
b3B1cFR5cGUgewotICAgICAgICBTZWxlY3QsIC8vIEhUTUwgc2VsZWN0IHBvcHVwLgotICAgICAg
ICBTdWdnZXN0aW9uLCAvLyBBdXRvY29tcGxldGUvYXV0b2ZpbGwgcG9wdXAuCi0gICAgfTsKLQot
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFBvcHVwQ29udGFpbmVyPiBjcmVhdGUoUG9wdXBNZW51Q2xp
ZW50KiwgUG9wdXBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyYpOwotCi0gICAgLy8gV2hldGhlciBh
IGtleSBldmVudCBzaG91bGQgYmUgc2VudCB0byB0aGlzIHBvcHVwLgotICAgIHZpcnR1YWwgYm9v
bCBpc0ludGVyZXN0ZWRJbkV2ZW50Rm9yS2V5KGludCBrZXlDb2RlKTsKLQotICAgIC8vIEZyYW1l
bGVzc1Njcm9sbFZpZXcKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoR3JhcGhpY3NDb250ZXh0Kiwg
Y29uc3QgSW50UmVjdCYpOwotICAgIHZpcnR1YWwgdm9pZCBoaWRlKCk7Ci0gICAgdmlydHVhbCBi
b29sIGhhbmRsZU1vdXNlRG93bkV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOwotICAg
IHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZU1vdmVFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZl
bnQmKTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoY29uc3QgUGxh
dGZvcm1Nb3VzZUV2ZW50Jik7Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZVdoZWVsRXZlbnQoY29u
c3QgUGxhdGZvcm1XaGVlbEV2ZW50Jik7Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZUtleUV2ZW50
KGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYpOwotI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMp
Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZVRvdWNoRXZlbnQoY29uc3QgUGxhdGZvcm1Ub3VjaEV2
ZW50Jik7Ci0jZW5kaWYKLSNpZiBFTkFCTEUoR0VTVFVSRV9SRUNPR05JWkVSKQotICAgIHZpcnR1
YWwgYm9vbCBoYW5kbGVHZXN0dXJlRXZlbnQoY29uc3QgUGxhdGZvcm1HZXN0dXJlRXZlbnQmKTsK
LSNlbmRpZgotCi0gICAgLy8gUG9wdXBDb250YWluZXIgbWV0aG9kcwotCi0gICAgLy8gU2hvdyB0
aGUgcG9wdXAKLSAgICB2b2lkIHNob3dQb3B1cChGcmFtZVZpZXcqKTsKLQotICAgIC8vIFNob3cg
dGhlIHBvcHVwIGluIHRoZSBzcGVjaWZpZWQgcmVjdCBmb3IgdGhlIHNwZWNpZmllZCBmcmFtZS4K
LSAgICAvLyBOb3RlOiB0aGlzIGNvZGUgd2FzIHNvbWVob3cgYXJiaXRyYXJpbHkgZmFjdG9yZWQt
b3V0IG9mIHRoZSBQb3B1cCBjbGFzcwotICAgIC8vIHNvIFdlYlZpZXdJbXBsIGNhbiBjcmVhdGUg
YSBQb3B1cENvbnRhaW5lci4gVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IKLSAgICAvLyBkaXNwbGF5
aW5nIGF1dG8gY29tcGxldGUgcG9wdXAgbWVudXMgb24gTWFjIENocm9taXVtLCBhbmQgZm9yIGFs
bAotICAgIC8vIHBvcHVwcyBvbiBvdGhlciBwbGF0Zm9ybXMuCi0gICAgdm9pZCBzaG93SW5SZWN0
KGNvbnN0IEludFJlY3QmLCBGcmFtZVZpZXcqLCBpbnQgaW5kZXgpOwotCi0gICAgLy8gSGlkZXMg
dGhlIHBvcHVwLgotICAgIHZvaWQgaGlkZVBvcHVwKCk7Ci0KLSAgICAvLyBUaGUgcG9wdXAgd2Fz
IGhpZGRlbi4KLSAgICB2b2lkIG5vdGlmeVBvcHVwSGlkZGVuKCk7Ci0KLSAgICAvLyBDb21wdXRl
IHNpemUgb2Ygd2lkZ2V0IGFuZCBjaGlsZHJlbi4gUmV0dXJuIHJpZ2h0IG9mZnNldCBmb3IgdGhl
IHBvcHVwIHJpZ2h0IGFsaWdubWVudC4KLSAgICBpbnQgbGF5b3V0QW5kR2V0UlRMT2Zmc2V0KCk7
Ci0KLSAgICBQb3B1cExpc3RCb3gqIGxpc3RCb3goKSBjb25zdCB7IHJldHVybiBtX2xpc3RCb3gu
Z2V0KCk7IH0KLQotICAgIGJvb2wgaXNSVEwoKSBjb25zdDsKLQotICAgIC8vIEdldHMgdGhlIGlu
ZGV4IG9mIHRoZSBpdGVtIHRoYXQgdGhlIHVzZXIgaXMgY3VycmVudGx5IG1vdXNlZC1vdmVyIG9y
Ci0gICAgLy8gaGFzIHNlbGVjdGVkIHdpdGggdGhlIGtleWJvYXJkIHVwL2Rvd24gYXJyb3dzLgot
ICAgIGludCBzZWxlY3RlZEluZGV4KCkgY29uc3Q7Ci0KLSAgICAvLyBSZWZyZXNoIHRoZSBwb3B1
cCB2YWx1ZXMgZnJvbSB0aGUgUG9wdXBNZW51Q2xpZW50LgotICAgIHZvaWQgcmVmcmVzaChjb25z
dCBJbnRSZWN0JiB0YXJnZXRDb250cm9sUmVjdCk7Ci0KLSAgICAvLyBUaGUgbWVudSBwZXItaXRl
bSBkYXRhLgotICAgIGNvbnN0IFdURjo6VmVjdG9yPFBvcHVwSXRlbSo+JiBwb3B1cERhdGEoKSBj
b25zdDsKLQotICAgIC8vIFRoZSBoZWlnaHQgb2YgYSByb3cgaW4gdGhlIG1lbnUuCi0gICAgaW50
IG1lbnVJdGVtSGVpZ2h0KCkgY29uc3Q7Ci0KLSAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgZm9udCBi
ZWluZyB1c2VkLgotICAgIGludCBtZW51SXRlbUZvbnRTaXplKCkgY29uc3Q7Ci0KLSAgICAvLyBU
aGUgc3R5bGUgb2YgdGhlIG1lbnUgYmVpbmcgdXNlZC4KLSAgICBQb3B1cE1lbnVTdHlsZSBtZW51
U3R5bGUoKSBjb25zdDsKLQotICAgIFBvcHVwVHlwZSBwb3B1cFR5cGUoKSBjb25zdCB7IHJldHVy
biBtX3BvcHVwVHlwZTsgfQotCi0gICAgLy8gV2hpbGUgaG92ZXJpbmcgcG9wdXAgbWVudSB3aW5k
b3csIHdlIHdhbnQgdG8gc2hvdyB0b29sIHRpcCBtZXNzYWdlLgotICAgIFN0cmluZyBnZXRTZWxl
Y3RlZEl0ZW1Ub29sVGlwKCk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIFdURjo6UmVm
Q291bnRlZDxQb3B1cENvbnRhaW5lcj47Ci0KLSAgICBQb3B1cENvbnRhaW5lcihQb3B1cE1lbnVD
bGllbnQqLCBQb3B1cFR5cGUsIGNvbnN0IFBvcHVwQ29udGFpbmVyU2V0dGluZ3MmKTsKLSAgICB+
UG9wdXBDb250YWluZXIoKTsKLQotICAgIC8vIFBhaW50IHRoZSBib3JkZXIuCi0gICAgdm9pZCBw
YWludEJvcmRlcihHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0Jik7Ci0KLSAgICAvLyBM
YXlvdXQgYW5kIGNhbGN1bGF0ZSBwb3B1cCB3aWRnZXQgc2l6ZSBhbmQgbG9jYXRpb24gYW5kIHJl
dHVybnMgaXQgYXMgSW50UmVjdC4KLSAgICBJbnRSZWN0IGxheW91dEFuZENhbGN1bGF0ZVdpZGdl
dFJlY3QoaW50IHRhcmdldENvbnRyb2xIZWlnaHQsIGNvbnN0IEludFBvaW50JiBwb3B1cEluaXRp
YWxDb29yZGluYXRlKTsKLQotICAgIC8vIFJldHVybnMgdGhlIENocm9tZUNsaWVudCBvZiB0aGUg
cGFnZSB0aGlzIHBvcHVwIGlzIGFzc29jaWF0ZWQgd2l0aC4KLSAgICBDaHJvbWVDbGllbnRDaHJv
bWl1bSogY2hyb21lQ2xpZW50Q2hyb21pdW0oKTsKLQotICAgIFJlZlB0cjxQb3B1cExpc3RCb3g+
IG1fbGlzdEJveDsKLSAgICBSZWZQdHI8RnJhbWVWaWV3PiBtX2ZyYW1lVmlldzsKLQotICAgIFBv
cHVwQ29udGFpbmVyU2V0dGluZ3MgbV9zZXR0aW5nczsKLSAgICBQb3B1cFR5cGUgbV9wb3B1cFR5
cGU7Ci0gICAgSW50UmVjdCBtX29yaWdpbmFsRnJhbWVSZWN0OwotICAgIC8vIFdoZXRoZXIgdGhl
IHBvcHVwIGlzIGN1cnJlbnRseSBvcGVuLgotICAgIGJvb2wgbV9wb3B1cE9wZW47Ci19OwotCiBj
bGFzcyBQb3B1cE1lbnVDaHJvbWl1bSA6IHB1YmxpYyBQb3B1cE1lbnUgewogcHVibGljOgogICAg
IFBvcHVwTWVudUNocm9taXVtKFBvcHVwTWVudUNsaWVudCopOwpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5n
ZUxvZwppbmRleCA0M2Q0MjUwMGZmNzc0OTQwYzZiYWE2ODBmNDMxNmM0MDlhMzk3YzI5Li43OTY2
ZGE2Y2M0MjYyNDczNjk4ZDE1NjQyODg4OGJmY2I5ZmJkZjY1IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0No
YW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDExLTA4LTExICBGYWR5IFNhbXVlbCAgPGZzYW11
ZWxAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJlZmFjdG9yaW5nIG9mIFBvcHVwTWVudUNocm9t
aXVtCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02NjAw
OQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogc3Jj
L0Nocm9tZUNsaWVudEltcGwuY3BwOgorICAgICAgICAqIHNyYy9XZWJQb3B1cE1lbnVJbXBsLmNw
cDoKKyAgICAgICAgKiBzcmMvV2ViVmlld0ltcGwuY3BwOgorCiAyMDExLTA4LTEwICBKb2huIEFi
ZC1FbC1NYWxlayAgPGphbUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgW2Nocm9taXVtXSBVcGRh
dGUgV2ViU2Nyb2xsYmFyIHNvIHRoYXQgaXQgd29ya3Mgd2l0aCBvdmVybGF5IHNjcm9sbGJhcnMg
b24gTGlvbgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xp
ZW50SW1wbC5jcHAgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBs
LmNwcAppbmRleCBhM2U5YjBmZDkzYmI4YzBlNjM2YTliNmIzMWEzYjE1YTY3ODVjZjhmLi45NmQx
ZDM3NGYzMGJkMDU4N2FmZmVjZDE2NmI2MWMwODY1NjA5NzE0IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmNwcAorKysgYi9Tb3VyY2UvV2Vi
S2l0L2Nocm9taXVtL3NyYy9DaHJvbWVDbGllbnRJbXBsLmNwcApAQCAtNTcsNiArNTcsNyBAQAog
I2luY2x1ZGUgIk5vdGlmaWNhdGlvblByZXNlbnRlckltcGwuaCIKICNpbmNsdWRlICJQYWdlLmgi
CiAjaW5jbHVkZSAiUGxhdGZvcm1CcmlkZ2UuaCIKKyNpbmNsdWRlICJQb3B1cENvbnRhaW5lci5o
IgogI2luY2x1ZGUgIlBvcHVwTWVudUNocm9taXVtLmgiCiAjaW5jbHVkZSAiUmVuZGVyV2lkZ2V0
LmgiCiAjaW5jbHVkZSAiU2NyaXB0Q29udHJvbGxlci5oIgpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YktpdC9jaHJvbWl1bS9zcmMvV2ViUG9wdXBNZW51SW1wbC5jcHAgYi9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL3NyYy9XZWJQb3B1cE1lbnVJbXBsLmNwcAppbmRleCBlMjY2OGIxYjg0ZDlmNDJhZGNh
YmYzMTkwNGJjOGI2OGQwNTAzZjJhLi40ZTFiMWU2NjBmMjY3YzQ5MjQwOTQyMDc1MzQ2OTk1Yzk0
MzM5MTcxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJQb3B1cE1l
bnVJbXBsLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJQb3B1cE1lbnVJ
bXBsLmNwcApAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVu
dC5oIgogI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgogI2luY2x1ZGUgIlBsYXRmb3Jt
V2hlZWxFdmVudC5oIgorI2luY2x1ZGUgIlBvcHVwQ29udGFpbmVyLmgiCiAjaW5jbHVkZSAiUG9w
dXBNZW51Q2hyb21pdW0uaCIKICNpbmNsdWRlICJTa2lhVXRpbHMuaCIKIApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3BwIGIvU291cmNlL1dlYktp
dC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3BwCmluZGV4IDdkMmRmNDMxZTRiMzY2NDY0MTk1
OWM2YjRkZmU0MGNiMzQ3MjRjMjYuLmU1ODk2M2M4NzczMTU5ZWM4M2I4YzFhMmIzNzFlNWZjNGFk
NWE4YjggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBs
LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAKQEAg
LTg1LDcgKzg1LDcgQEAKICNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKICNpbmNsdWRl
ICJQbGF0Zm9ybVRoZW1lQ2hyb21pdW1HdGsuaCIKICNpbmNsdWRlICJQbGF0Zm9ybVdoZWVsRXZl
bnQuaCIKLSNpbmNsdWRlICJQb3B1cE1lbnVDaHJvbWl1bS5oIgorI2luY2x1ZGUgIlBvcHVwQ29u
dGFpbmVyLmgiCiAjaW5jbHVkZSAiUG9wdXBNZW51Q2xpZW50LmgiCiAjaW5jbHVkZSAiUHJvZ3Jl
c3NUcmFja2VyLmgiCiAjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>103813</attachid>
            <date>2011-08-12 14:06:05 -0700</date>
            <delta_ts>2011-08-12 15:44:40 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-66009-20110812170603.patch</filename>
            <type>text/plain</type>
            <size>137786</size>
            <attacher name="Fady Samuel">fsamuel</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTI5ODcKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAwZWIxY2VmYjcwZmYzMjZl
ZDM4ZWJmYjlhYjA0YTI3NDI5ZDc2MGEwLi5iNjNmMzM0NTZiOWFiYTJlNzQ0OWQ3NWIwMmIzODAy
NDU2MWJjYmYyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTAzIEBACisyMDExLTA4LTEyICBGYWR5
IFNhbXVlbCAgPGZzYW11ZWxAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJlZmFjdG9yaW5nIG9m
IFBvcHVwTWVudUNocm9taXVtIEZvciBSZWFkYWJpbGl0eSBhbmQgTWFpbnRhaW5hYmlsaXR5Cisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02NjAwOQorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFNwbGl0IFBvcHVw
TWVudUNocm9taXVtIGludG8gdGhyZWUgc2V0cyBvZiBmaWxlczogUG9wdXBNZW51Q2hyb21pdW0u
e2h8Y3BwfSwgUG9wdXBDb250YWluZXIue2h8Y3BwfSwKKyAgICAgICAgYW5kIFBvcHVwTGlzQm94
LntofGNwcH0gIGZvciByZWFkYWJpbGl0eSBhbmQgbWFpbnRhaW5hYmlsaXR5LgorCisgICAgICAg
IE5vIG5ldyB0ZXN0cy4gKE9PUFMhKQorCisgICAgICAgICogV2ViQ29yZS5neXBpOgorICAgICAg
ICAqIHBsYXRmb3JtL2Nocm9taXVtL1BvcHVwQ29udGFpbmVyLmNwcDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpjb25zdHJ1Y3RSZWxhdGl2ZU1vdXNlRXZlbnQpOgorICAgICAgICAoV2ViQ29y
ZTo6Y29uc3RydWN0UmVsYXRpdmVXaGVlbEV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVw
Q29udGFpbmVyOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OlBv
cHVwQ29udGFpbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjp+UG9wdXBD
b250YWluZXIpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OmxheW91dEFuZENh
bGN1bGF0ZVdpZGdldFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OnNo
b3dQb3B1cCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6aGlkZVBvcHVwKToK
KyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpub3RpZnlQb3B1cEhpZGRlbik6Cisg
ICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6bGF5b3V0QW5kR2V0UlRMT2Zmc2V0KToK
KyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpoYW5kbGVNb3VzZURvd25FdmVudCk6
CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6aGFuZGxlTW91c2VNb3ZlRXZlbnQp
OgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OmhhbmRsZU1vdXNlUmVsZWFzZUV2
ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpoYW5kbGVXaGVlbEV2ZW50
KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpoYW5kbGVUb3VjaEV2ZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpoYW5kbGVHZXN0dXJlRXZlbnQpOgor
ICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OmhhbmRsZUtleUV2ZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpoaWRlKToKKyAgICAgICAgKFdlYkNvcmU6OlBv
cHVwQ29udGFpbmVyOjpwYWludCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6
cGFpbnRCb3JkZXIpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OmlzSW50ZXJl
c3RlZEluRXZlbnRGb3JLZXkpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OmNo
cm9tZUNsaWVudENocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpz
aG93SW5SZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpyZWZyZXNoKToK
KyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjppc1JUTCk6CisgICAgICAgIChXZWJD
b3JlOjpQb3B1cENvbnRhaW5lcjo6c2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpQ
b3B1cENvbnRhaW5lcjo6bWVudUl0ZW1IZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBD
b250YWluZXI6Om1lbnVJdGVtRm9udFNpemUpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250
YWluZXI6Om1lbnVTdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpwb3B1cERhdGEpOgorICAgICAg
ICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OmdldFNlbGVjdGVkSXRlbVRvb2xUaXApOgorICAg
ICAgICAqIHBsYXRmb3JtL2Nocm9taXVtL1BvcHVwQ29udGFpbmVyLmg6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6Omxpc3RCb3gpOgorICAgICAgICAoV2ViQ29yZTo6
UG9wdXBDb250YWluZXI6OnBvcHVwVHlwZSk6CisgICAgICAgICogcGxhdGZvcm0vY2hyb21pdW0v
UG9wdXBMaXN0Qm94LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6
OlBvcHVwTGlzdEJveCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmhhbmRsZU1v
dXNlRG93bkV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6aGFuZGxlTW91
c2VNb3ZlRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpoYW5kbGVNb3Vz
ZVJlbGVhc2VFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmhhbmRsZVdo
ZWVsRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94Ojppc0ludGVyZXN0ZWRJ
bkV2ZW50Rm9yS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6aGFuZGxlVG91
Y2hFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmhhbmRsZUdlc3R1cmVF
dmVudCk6CisgICAgICAgIChXZWJDb3JlOjppc0NoYXJhY3RlclR5cGVFdmVudCk6CisgICAgICAg
IChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmhhbmRsZUtleUV2ZW50KToKKyAgICAgICAgKFdlYkNv
cmU6OlBvcHVwTGlzdEJveDo6aG9zdFdpbmRvdyk6CisgICAgICAgIChXZWJDb3JlOjpzdHJpcExl
YWRpbmdXaGl0ZVNwYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6dHlwZUFo
ZWFkRmluZCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OnBhaW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6cGFpbnRSb3cpOgorICAgICAgICAoV2ViQ29yZTo6
UG9wdXBMaXN0Qm94OjpnZXRSb3dGb250KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJv
eDo6YWJhbmRvbik6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OnBvaW50VG9Sb3dJ
bmRleCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmFjY2VwdEluZGV4KToKKyAg
ICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6c2VsZWN0SW5kZXgpOgorICAgICAgICAoV2Vi
Q29yZTo6UG9wdXBMaXN0Qm94OjpzZXRPcmlnaW5hbEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6
OlBvcHVwTGlzdEJveDo6Z2V0Um93SGVpZ2h0KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlz
dEJveDo6Z2V0Um93Qm91bmRzKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6aW52
YWxpZGF0ZVJvdyk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OnNjcm9sbFRvUmV2
ZWFsUm93KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6aXNTZWxlY3RhYmxlSXRl
bSk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmNsZWFyU2VsZWN0aW9uKToKKyAg
ICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6c2VsZWN0TmV4dFJvdyk6CisgICAgICAgIChX
ZWJDb3JlOjpQb3B1cExpc3RCb3g6OnNlbGVjdFByZXZpb3VzUm93KToKKyAgICAgICAgKFdlYkNv
cmU6OlBvcHVwTGlzdEJveDo6YWRqdXN0U2VsZWN0ZWRJbmRleCk6CisgICAgICAgIChXZWJDb3Jl
OjpQb3B1cExpc3RCb3g6OmhpZGVQb3B1cCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RC
b3g6OnVwZGF0ZUZyb21FbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6
c2V0TWF4V2lkdGhBbmRMYXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94Ojps
YXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpjbGVhcik6CisgICAgICAg
IChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmlzUG9pbnRJbkJvdW5kcyk6CisgICAgICAgICogcGxh
dGZvcm0vY2hyb21pdW0vUG9wdXBMaXN0Qm94Lmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
UG9wdXBJdGVtOjpQb3B1cEl0ZW0pOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94Ojpj
cmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpzZWxlY3RlZEluZGV4KToK
KyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6bnVtSXRlbXMpOgorICAgICAgICAoV2Vi
Q29yZTo6UG9wdXBMaXN0Qm94OjpzZXRCYXNlV2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6UG9w
dXBMaXN0Qm94OjpzZXRNYXhIZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94
OjpzZXRNYXhXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmRpc2Nvbm5l
Y3RDbGllbnQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjppdGVtcyk6CisgICAg
ICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6On5Qb3B1cExpc3RCb3gpOgorICAgICAgICAoV2Vi
Q29yZTo6UG9wdXBMaXN0Qm94OjpzY3JvbGxUb1JldmVhbFNlbGVjdGlvbik6CisgICAgICAgICog
cGxhdGZvcm0vY2hyb21pdW0vUG9wdXBNZW51Q2hyb21pdW0uY3BwOgorICAgICAgICAqIHBsYXRm
b3JtL2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVtLmg6CisKIDIwMTEtMDgtMTEgIFByYXRpayBT
b2xhbmtpICA8cHNvbGFua2lAYXBwbGUuY29tPgogCiAgICAgICAgIFJlc291cmNlTG9hZGVyOjpk
aWRSZWNlaXZlRGF0YUFycmF5KCkgZG9lcyBub3QgaGFuZGxlIG1fc2hvdWxkQnVmZmVyRGF0YSBj
b3JyZWN0bHkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCA4YzU0NTUwMWUxMTlkNTQzNjZjNTU5ZDM2MjEx
Y2RlZTllNGU0OWQzLi5lZjA1NGJkODE3ZTYyOWVhM2E1YTgyODA3MzhlNGZjNjU1NDg0Zjk1IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvU291cmNlL1dlYkNv
cmUvV2ViQ29yZS5neXBpCkBAIC0zMjU2LDggKzMyNTYsMTIgQEAKICAgICAgICAgICAgICdwbGF0
Zm9ybS9jaHJvbWl1bS9QbGF0Zm9ybVRoZW1lQ2hyb21pdW1HdGsuY3BwJywKICAgICAgICAgICAg
ICdwbGF0Zm9ybS9jaHJvbWl1bS9QbGF0Zm9ybVRoZW1lQ2hyb21pdW1HdGsuaCcsCiAgICAgICAg
ICAgICAncGxhdGZvcm0vY2hyb21pdW0vUGxhdGZvcm1XaWRnZXQuaCcsCisgICAgICAgICAgICAn
cGxhdGZvcm0vY2hyb21pdW0vUG9wdXBDb250YWluZXIuY3BwJywKKyAgICAgICAgICAgICdwbGF0
Zm9ybS9jaHJvbWl1bS9Qb3B1cENvbnRhaW5lci5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9j
aHJvbWl1bS9Qb3B1cE1lbnVDaHJvbWl1bS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2No
cm9taXVtL1BvcHVwTWVudUNocm9taXVtLmgnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2Nocm9t
aXVtL1BvcHVwTGlzdEJveC5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2Nocm9taXVtL1Bv
cHVwTGlzdEJveC5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cE1lbnVQ
cml2YXRlLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2Nocm9taXVtL1NTTEtleUdlbmVyYXRv
ckNocm9taXVtLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vY2hyb21pdW0vU2Nyb2xsQW5p
bWF0b3JDaHJvbWl1bU1hYy5oJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2Nocm9taXVtL1BvcHVwQ29udGFpbmVyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2No
cm9taXVtL1BvcHVwQ29udGFpbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yMWM0NmU2NzFlZDk0MzhjYzZi
YjRlYjI1OGQ5NzVjNmZkOWIyZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vY2hyb21pdW0vUG9wdXBDb250YWluZXIuY3BwCkBAIC0wLDAgKzEsNDY0IEBACisv
KgorICogQ29weXJpZ2h0IChjKSAyMDExLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQb3B1cENvbnRhaW5lci5oIgorCisjaW5jbHVk
ZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50Q2hyb21pdW0uaCIKKyNpbmNsdWRl
ICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3Lmgi
CisjaW5jbHVkZSAiRnJhbWVsZXNzU2Nyb2xsVmlldy5oIgorI2luY2x1ZGUgIkZyYW1lbGVzc1Nj
cm9sbFZpZXdDbGllbnQuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRl
ICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtS2V5Ym9h
cmRFdmVudC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgorI2luY2x1ZGUgIlBs
YXRmb3JtU2NyZWVuLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50LmgiCisjaW5jbHVk
ZSAiUG9wdXBMaXN0Qm94LmgiCisjaW5jbHVkZSAiUG9wdXBNZW51Q2xpZW50LmgiCisjaW5jbHVk
ZSAiVXNlckdlc3R1cmVJbmRpY2F0b3IuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpZiBFTkFC
TEUoR0VTVFVSRV9FVkVOVFMpCisjaW5jbHVkZSAiUGxhdGZvcm1HZXN0dXJlRXZlbnQuaCIKKyNl
bmRpZgorCisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyNpbmNsdWRlICJQbGF0Zm9ybVRvdWNo
RXZlbnQuaCIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK3N0YXRpYyBjb25zdCBpbnQga0JvcmRlclNpemUgPSAxOworCitzdGF0aWMgUGxh
dGZvcm1Nb3VzZUV2ZW50IGNvbnN0cnVjdFJlbGF0aXZlTW91c2VFdmVudChjb25zdCBQbGF0Zm9y
bU1vdXNlRXZlbnQmIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBGcmFtZWxlc3NTY3JvbGxWaWV3KiBwYXJlbnQsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZWxlc3NTY3JvbGxW
aWV3KiBjaGlsZCkKK3sKKyAgICBJbnRQb2ludCBwb3MgPSBwYXJlbnQtPmNvbnZlcnRTZWxmVG9D
aGlsZChjaGlsZCwgZS5wb3MoKSk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhvcnJpYmxl
IGhhY2sgc2luY2UgUGxhdGZvcm1Nb3VzZUV2ZW50IGhhcyBubyBzZXR0ZXJzIGZvciB4L3kuCisg
ICAgUGxhdGZvcm1Nb3VzZUV2ZW50IHJlbGF0aXZlRXZlbnQgPSBlOworICAgIEludFBvaW50JiBy
ZWxhdGl2ZVBvcyA9IGNvbnN0X2Nhc3Q8SW50UG9pbnQmPihyZWxhdGl2ZUV2ZW50LnBvcygpKTsK
KyAgICByZWxhdGl2ZVBvcy5zZXRYKHBvcy54KCkpOworICAgIHJlbGF0aXZlUG9zLnNldFkocG9z
LnkoKSk7CisgICAgcmV0dXJuIHJlbGF0aXZlRXZlbnQ7Cit9CisKK3N0YXRpYyBQbGF0Zm9ybVdo
ZWVsRXZlbnQgY29uc3RydWN0UmVsYXRpdmVXaGVlbEV2ZW50KGNvbnN0IFBsYXRmb3JtV2hlZWxF
dmVudCYgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIEZyYW1lbGVzc1Njcm9sbFZpZXcqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lbGVzc1Njcm9sbFZpZXcqIGNo
aWxkKQoreworICAgIEludFBvaW50IHBvcyA9IHBhcmVudC0+Y29udmVydFNlbGZUb0NoaWxkKGNo
aWxkLCBlLnBvcygpKTsKKworICAgIC8vIEZJWE1FOiBUaGlzIGlzIGEgaG9ycmlibGUgaGFjayBz
aW5jZSBQbGF0Zm9ybVdoZWVsRXZlbnQgaGFzIG5vIHNldHRlcnMgZm9yIHgveS4KKyAgICBQbGF0
Zm9ybVdoZWVsRXZlbnQgcmVsYXRpdmVFdmVudCA9IGU7CisgICAgSW50UG9pbnQmIHJlbGF0aXZl
UG9zID0gY29uc3RfY2FzdDxJbnRQb2ludCY+KHJlbGF0aXZlRXZlbnQucG9zKCkpOworICAgIHJl
bGF0aXZlUG9zLnNldFgocG9zLngoKSk7CisgICAgcmVsYXRpdmVQb3Muc2V0WShwb3MueSgpKTsK
KyAgICByZXR1cm4gcmVsYXRpdmVFdmVudDsKK30KKworLy8gc3RhdGljCitQYXNzUmVmUHRyPFBv
cHVwQ29udGFpbmVyPiBQb3B1cENvbnRhaW5lcjo6Y3JlYXRlKFBvcHVwTWVudUNsaWVudCogY2xp
ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQ
b3B1cFR5cGUgcG9wdXBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJiBzZXR0aW5ncykKK3sK
KyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFBvcHVwQ29udGFpbmVyKGNsaWVudCwgcG9wdXBUeXBl
LCBzZXR0aW5ncykpOworfQorCitQb3B1cENvbnRhaW5lcjo6UG9wdXBDb250YWluZXIoUG9wdXBN
ZW51Q2xpZW50KiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9wdXBU
eXBlIHBvcHVwVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb3B1
cENvbnRhaW5lclNldHRpbmdzJiBzZXR0aW5ncykKKyAgICA6IG1fbGlzdEJveChQb3B1cExpc3RC
b3g6OmNyZWF0ZShjbGllbnQsIHNldHRpbmdzKSkKKyAgICAsIG1fc2V0dGluZ3Moc2V0dGluZ3Mp
CisgICAgLCBtX3BvcHVwVHlwZShwb3B1cFR5cGUpCisgICAgLCBtX3BvcHVwT3BlbihmYWxzZSkK
K3sKKyAgICBzZXRTY3JvbGxiYXJNb2RlcyhTY3JvbGxiYXJBbHdheXNPZmYsIFNjcm9sbGJhckFs
d2F5c09mZik7Cit9CisKK1BvcHVwQ29udGFpbmVyOjp+UG9wdXBDb250YWluZXIoKQoreworICAg
IGlmIChtX2xpc3RCb3ggJiYgbV9saXN0Qm94LT5wYXJlbnQoKSkKKyAgICAgICAgcmVtb3ZlQ2hp
bGQobV9saXN0Qm94LmdldCgpKTsKK30KKworSW50UmVjdCBQb3B1cENvbnRhaW5lcjo6bGF5b3V0
QW5kQ2FsY3VsYXRlV2lkZ2V0UmVjdChpbnQgdGFyZ2V0Q29udHJvbEhlaWdodCwgY29uc3QgSW50
UG9pbnQmIHBvcHVwSW5pdGlhbENvb3JkaW5hdGUpCit7CisgICAgLy8gUmVzZXQgdGhlIG1heCB3
aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLCB0aGV5IHdpbGwgYmUgcmVj
b21wdXRlZCBiZWxvdworICAgIC8vIGlmIG5lY2Vzc2FyeS4KKyAgICBtX2xpc3RCb3gtPnNldE1h
eEhlaWdodChrTWF4SGVpZ2h0KTsKKyAgICBtX2xpc3RCb3gtPnNldE1heFdpZHRoKHN0ZDo6bnVt
ZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpOworCisgICAgLy8gTGF5IGV2ZXJ5dGhpbmcgb3V0IHRv
IGZpZ3VyZSBvdXQgb3VyIHByZWZlcnJlZCBzaXplLCB0aGVuIHRlbGwgdGhlIHZpZXcncworICAg
IC8vIFdpZGdldENsaWVudCBhYm91dCBpdC4gSXQgc2hvdWxkIGFzc2lnbiB1cyBhIGNsaWVudC4K
KyAgICBpbnQgcnRsT2Zmc2V0ID0gbGF5b3V0QW5kR2V0UlRMT2Zmc2V0KCk7CisgICAgYm9vbCBp
c1JUTCA9IHRoaXMtPmlzUlRMKCk7CisgICAgaW50IHJpZ2h0T2Zmc2V0ID0gaXNSVEwgPyBydGxP
ZmZzZXQgOiAwOworCisgICAgLy8gQXNzdW1lIG1fbGlzdEJveCBzaXplIGlzIGFscmVhZHkgY2Fs
Y3VsYXRlZC4KKyAgICBJbnRTaXplIHRhcmdldFNpemUobV9saXN0Qm94LT53aWR0aCgpICsga0Jv
cmRlclNpemUgKiAyLAorICAgICAgICAgICAgICAgICAgICAgICBtX2xpc3RCb3gtPmhlaWdodCgp
ICsga0JvcmRlclNpemUgKiAyKTsKKworICAgIEludFJlY3Qgd2lkZ2V0UmVjdDsKKyAgICBDaHJv
bWVDbGllbnRDaHJvbWl1bSogY2hyb21lQ2xpZW50ID0gY2hyb21lQ2xpZW50Q2hyb21pdW0oKTsK
KyAgICBpZiAoY2hyb21lQ2xpZW50KSB7CisgICAgICAgIC8vIElmIHRoZSBwb3B1cCB3b3VsZCBl
eHRlbmQgcGFzdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4sIG9wZW4gdXB3YXJkcworICAgICAg
ICAvLyBpbnN0ZWFkLgorICAgICAgICBGbG9hdFJlY3Qgc2NyZWVuID0gc2NyZWVuQXZhaWxhYmxl
UmVjdChtX2ZyYW1lVmlldy5nZXQoKSk7CisgICAgICAgIC8vIFVzZSBwb3B1cEluaXRpYWxDb29y
ZGluYXRlLngoKSArIHJpZ2h0T2Zmc2V0IGJlY2F1c2UgUlRMIHBvc2l0aW9uCisgICAgICAgIC8v
IG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQuCisgICAgICAgIHdpZGdldFJlY3QgPSBjaHJvbWVDbGll
bnQtPndpbmRvd1RvU2NyZWVuKEludFJlY3QocG9wdXBJbml0aWFsQ29vcmRpbmF0ZS54KCkgKyBy
aWdodE9mZnNldCwgcG9wdXBJbml0aWFsQ29vcmRpbmF0ZS55KCksIHRhcmdldFNpemUud2lkdGgo
KSwgdGFyZ2V0U2l6ZS5oZWlnaHQoKSkpOworCisgICAgICAgIC8vIElmIHdlIGhhdmUgbXVsdGlw
bGUgc2NyZWVucyBhbmQgdGhlIGJyb3dzZXIgcmVjdCBpcyBpbiBvbmUgc2NyZWVuLCB3ZSBoYXZl
CisgICAgICAgIC8vIHRvIGNsaXAgdGhlIHdpbmRvdyB3aWR0aCB0byB0aGUgc2NyZWVuIHdpZHRo
LgorICAgICAgICAvLyBXaGVuIGNsaXBwaW5nLCB3ZSBhbHNvIG5lZWQgdG8gc2V0IGEgbWF4aW11
bSB3aWR0aCBmb3IgdGhlIGxpc3QgYm94LgorICAgICAgICBGbG9hdFJlY3Qgd2luZG93UmVjdCA9
IGNocm9tZUNsaWVudC0+d2luZG93UmVjdCgpOworICAgICAgICBpZiAod2luZG93UmVjdC54KCkg
Pj0gc2NyZWVuLngoKSAmJiB3aW5kb3dSZWN0Lm1heFgoKSA8PSBzY3JlZW4ubWF4WCgpICYmICh3
aWRnZXRSZWN0LngoKSA8IHNjcmVlbi54KCkgfHwgd2lkZ2V0UmVjdC5tYXhYKCkgPiBzY3JlZW4u
bWF4WCgpKSkgeworICAgICAgICAgICAgLy8gRmlyc3QsIGludmVyc2UgdGhlIHBvcHVwIGFsaWdu
bWVudCBpZiBpdCBkb2VzIG5vdCBmaXQgdGhlIHNjcmVlbiAtIHRoaXMgbWlnaHQgZml4IHRoaW5n
cyAob3IgbWFrZSB0aGVtIGJldHRlcikuCisgICAgICAgICAgICBJbnRSZWN0IGludmVyc2VXaWRn
ZXRSZWN0ID0gY2hyb21lQ2xpZW50LT53aW5kb3dUb1NjcmVlbihJbnRSZWN0KHBvcHVwSW5pdGlh
bENvb3JkaW5hdGUueCgpICsgKGlzUlRMID8gMCA6IHJ0bE9mZnNldCksIHBvcHVwSW5pdGlhbENv
b3JkaW5hdGUueSgpLCB0YXJnZXRTaXplLndpZHRoKCksIHRhcmdldFNpemUuaGVpZ2h0KCkpKTsK
KyAgICAgICAgICAgIEludFJlY3QgZW5jbG9zaW5nU2NyZWVuID0gZW5jbG9zaW5nSW50UmVjdChz
Y3JlZW4pOworICAgICAgICAgICAgdW5zaWduZWQgb3JpZ2luYWxDdXRvZmYgPSBtYXgoZW5jbG9z
aW5nU2NyZWVuLngoKSAtIHdpZGdldFJlY3QueCgpLCAwKSArIG1heCh3aWRnZXRSZWN0Lm1heFgo
KSAtIGVuY2xvc2luZ1NjcmVlbi5tYXhYKCksIDApOworICAgICAgICAgICAgdW5zaWduZWQgaW52
ZXJzZUN1dG9mZiA9IG1heChlbmNsb3NpbmdTY3JlZW4ueCgpIC0gaW52ZXJzZVdpZGdldFJlY3Qu
eCgpLCAwKSArIG1heChpbnZlcnNlV2lkZ2V0UmVjdC5tYXhYKCkgLSBlbmNsb3NpbmdTY3JlZW4u
bWF4WCgpLCAwKTsKKworICAgICAgICAgICAgLy8gQWNjZXB0IHRoZSBpbnZlcnNlIHBvcHVwIGFs
aWdubWVudCBpZiB0aGUgdHJpbW1lZCBjb250ZW50IGdldHMgc2hvcnRlciB0aGFuIHRoYXQgaW4g
dGhlIG9yaWdpbmFsIGFsaWdubWVudCBjYXNlLgorICAgICAgICAgICAgaWYgKGludmVyc2VDdXRv
ZmYgPCBvcmlnaW5hbEN1dG9mZikKKyAgICAgICAgICAgICAgICB3aWRnZXRSZWN0ID0gaW52ZXJz
ZVdpZGdldFJlY3Q7CisKKyAgICAgICAgICAgIGlmICh3aWRnZXRSZWN0LngoKSA8IHNjcmVlbi54
KCkpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB3aWRnZXRSaWdodCA9IHdpZGdldFJlY3Qu
bWF4WCgpOworICAgICAgICAgICAgICAgIHdpZGdldFJlY3Quc2V0V2lkdGgod2lkZ2V0UmVjdC5t
YXhYKCkgLSBzY3JlZW4ueCgpKTsKKyAgICAgICAgICAgICAgICB3aWRnZXRSZWN0LnNldFgod2lk
Z2V0UmlnaHQgLSB3aWRnZXRSZWN0LndpZHRoKCkpOworICAgICAgICAgICAgICAgIGxpc3RCb3go
KS0+c2V0TWF4V2lkdGhBbmRMYXlvdXQobWF4KHdpZGdldFJlY3Qud2lkdGgoKSAtIGtCb3JkZXJT
aXplICogMiwgMCkpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aWRnZXRSZWN0Lm1heFgoKSA+
IHNjcmVlbi5tYXhYKCkpIHsKKyAgICAgICAgICAgICAgICB3aWRnZXRSZWN0LnNldFdpZHRoKHNj
cmVlbi5tYXhYKCkgLSB3aWRnZXRSZWN0LngoKSk7CisgICAgICAgICAgICAgICAgbGlzdEJveCgp
LT5zZXRNYXhXaWR0aEFuZExheW91dChtYXgod2lkZ2V0UmVjdC53aWR0aCgpIC0ga0JvcmRlclNp
emUgKiAyLCAwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxj
dWxhdGUgWSBheGlzIHNpemUuCisgICAgICAgIGlmICh3aWRnZXRSZWN0Lm1heFkoKSA+IHN0YXRp
Y19jYXN0PGludD4oc2NyZWVuLm1heFkoKSkpIHsKKyAgICAgICAgICAgIGlmICh3aWRnZXRSZWN0
LnkoKSAtIHdpZGdldFJlY3QuaGVpZ2h0KCkgLSB0YXJnZXRDb250cm9sSGVpZ2h0ID4gMCkgewor
ICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGVub3VnaCByb29tIHRvIG9wZW4gdXB3YXJkcy4K
KyAgICAgICAgICAgICAgICB3aWRnZXRSZWN0Lm1vdmUoMCwgLSh3aWRnZXRSZWN0LmhlaWdodCgp
ICsgdGFyZ2V0Q29udHJvbEhlaWdodCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgICAgICAvLyBGaWd1cmUgd2hldGhlciB1cHdhcmRzIG9yIGRvd253YXJkcyBoYXMgbW9yZSBy
b29tIGFuZCBzZXQgdGhlCisgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBudW1iZXIgb2YgaXRl
bXMuCisgICAgICAgICAgICAgICAgaW50IHNwYWNlQWJvdmUgPSB3aWRnZXRSZWN0LnkoKSAtIHRh
cmdldENvbnRyb2xIZWlnaHQ7CisgICAgICAgICAgICAgICAgaW50IHNwYWNlQmVsb3cgPSBzY3Jl
ZW4ubWF4WSgpIC0gd2lkZ2V0UmVjdC55KCk7CisgICAgICAgICAgICAgICAgaWYgKHNwYWNlQWJv
dmUgPiBzcGFjZUJlbG93KQorICAgICAgICAgICAgICAgICAgICBtX2xpc3RCb3gtPnNldE1heEhl
aWdodChzcGFjZUFib3ZlKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
ICAgIG1fbGlzdEJveC0+c2V0TWF4SGVpZ2h0KHNwYWNlQmVsb3cpOworICAgICAgICAgICAgICAg
IGxheW91dEFuZEdldFJUTE9mZnNldCgpOworICAgICAgICAgICAgICAgIC8vIE91ciBoZWlnaHQg
aGFzIGNoYW5nZWQsIHNvIHJlY29tcHV0ZSBvbmx5IFkgYXhpcyBvZiB3aWRnZXRSZWN0LgorICAg
ICAgICAgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gcmVjb21wdXRlIFggYXhpcywgc28gd2Ug
b25seSByZXBsYWNlIFkgYXhpcworICAgICAgICAgICAgICAgIC8vIGluIHdpZGdldFJlY3QuCisg
ICAgICAgICAgICAgICAgSW50UmVjdCBmcmFtZUluU2NyZWVuID0gY2hyb21lQ2xpZW50LT53aW5k
b3dUb1NjcmVlbihmcmFtZVJlY3QoKSk7CisgICAgICAgICAgICAgICAgd2lkZ2V0UmVjdC5zZXRZ
KGZyYW1lSW5TY3JlZW4ueSgpKTsKKyAgICAgICAgICAgICAgICB3aWRnZXRSZWN0LnNldEhlaWdo
dChmcmFtZUluU2NyZWVuLmhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAvLyBBbmQgbW92ZSB1
cHdhcmRzIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICBpZiAoc3BhY2VBYm92ZSA+IHNw
YWNlQmVsb3cpCisgICAgICAgICAgICAgICAgICAgIHdpZGdldFJlY3QubW92ZSgwLCAtKHdpZGdl
dFJlY3QuaGVpZ2h0KCkgKyB0YXJnZXRDb250cm9sSGVpZ2h0KSk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHdpZGdldFJlY3Q7Cit9CisKK3ZvaWQgUG9wdXBD
b250YWluZXI6OnNob3dQb3B1cChGcmFtZVZpZXcqIHZpZXcpCit7CisgICAgbV9mcmFtZVZpZXcg
PSB2aWV3OworICAgIGxpc3RCb3goKS0+bV9mb2N1c2VkTm9kZSA9IG1fZnJhbWVWaWV3LT5mcmFt
ZSgpLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpOworCisgICAgQ2hyb21lQ2xpZW50Q2hyb21p
dW0qIGNocm9tZUNsaWVudCA9IGNocm9tZUNsaWVudENocm9taXVtKCk7CisgICAgaWYgKGNocm9t
ZUNsaWVudCkgeworICAgICAgICBJbnRSZWN0IHBvcHVwUmVjdCA9IGZyYW1lUmVjdCgpOworICAg
ICAgICBjaHJvbWVDbGllbnQtPnBvcHVwT3BlbmVkKHRoaXMsIGxheW91dEFuZENhbGN1bGF0ZVdp
ZGdldFJlY3QocG9wdXBSZWN0LmhlaWdodCgpLCBwb3B1cFJlY3QubG9jYXRpb24oKSksIGZhbHNl
KTsKKyAgICAgICAgbV9wb3B1cE9wZW4gPSB0cnVlOworICAgIH0KKworICAgIGlmICghbV9saXN0
Qm94LT5wYXJlbnQoKSkKKyAgICAgICAgYWRkQ2hpbGQobV9saXN0Qm94LmdldCgpKTsKKworICAg
IC8vIEVuYWJsZSBzY3JvbGxiYXJzIGFmdGVyIHRoZSBsaXN0Ym94IGlzIGluc2VydGVkIGludG8g
dGhlIGhpZXJhcmNoeSwKKyAgICAvLyBzbyBpdCBoYXMgYSBwcm9wZXIgV2lkZ2V0Q2xpZW50Lgor
ICAgIG1fbGlzdEJveC0+c2V0VmVydGljYWxTY3JvbGxiYXJNb2RlKFNjcm9sbGJhckF1dG8pOwor
CisgICAgbV9saXN0Qm94LT5zY3JvbGxUb1JldmVhbFNlbGVjdGlvbigpOworCisgICAgaW52YWxp
ZGF0ZSgpOworfQorCit2b2lkIFBvcHVwQ29udGFpbmVyOjpoaWRlUG9wdXAoKQoreworICAgIGxp
c3RCb3goKS0+aGlkZVBvcHVwKCk7Cit9CisKK3ZvaWQgUG9wdXBDb250YWluZXI6Om5vdGlmeVBv
cHVwSGlkZGVuKCkKK3sKKyAgICBpZiAoIW1fcG9wdXBPcGVuKQorICAgICAgICByZXR1cm47Cisg
ICAgbV9wb3B1cE9wZW4gPSBmYWxzZTsKKyAgICBjaHJvbWVDbGllbnRDaHJvbWl1bSgpLT5wb3B1
cENsb3NlZCh0aGlzKTsKK30KKworaW50IFBvcHVwQ29udGFpbmVyOjpsYXlvdXRBbmRHZXRSVExP
ZmZzZXQoKQoreworICAgIG1fbGlzdEJveC0+bGF5b3V0KCk7CisKKyAgICAvLyBQbGFjZSB0aGUg
bGlzdGJveCB3aXRoaW4gb3VyIGJvcmRlci4KKyAgICBtX2xpc3RCb3gtPm1vdmUoa0JvcmRlclNp
emUsIGtCb3JkZXJTaXplKTsKKworICAgIC8vIFNpemUgb3Vyc2VsdmVzIHRvIGNvbnRhaW4gbGlz
dGJveCArIGJvcmRlci4KKyAgICBpbnQgbGlzdEJveFdpZHRoID0gbV9saXN0Qm94LT53aWR0aCgp
ICsga0JvcmRlclNpemUgKiAyOworICAgIHJlc2l6ZShsaXN0Qm94V2lkdGgsIG1fbGlzdEJveC0+
aGVpZ2h0KCkgKyBrQm9yZGVyU2l6ZSAqIDIpOworICAgIGludmFsaWRhdGUoKTsKKworICAgIC8v
IENvbXB1dGUgdGhlIHN0YXJ0aW5nIHgtYXhpcyBmb3IgYSBub3JtYWwgUlRMIG9yIHJpZ2h0LWFs
aWduZWQgTFRSIGRyb3Bkb3duLiBGb3IgdGhvc2UsCisgICAgLy8gdGhlIHJpZ2h0IGVkZ2Ugb2Yg
ZHJvcGRvd24gYm94IHNob3VsZCBiZSBhbGlnbmVkIHdpdGggdGhlIHJpZ2h0IGVkZ2Ugb2YgPHNl
bGVjdD4vPGlucHV0PiBlbGVtZW50IGJveCwKKyAgICAvLyBhbmQgdGhlIGRyb3Bkb3duIGJveCBz
aG91bGQgYmUgZXhwYW5kZWQgdG8gdGhlIGxlZnQgaWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQuCisg
ICAgLy8gbV9vcmlnaW5hbEZyYW1lUmVjdC53aWR0aCgpIGlzIHRoZSB3aWR0aCBvZiB0aGUgdGFy
Z2V0IDxzZWxlY3Q+LzxpbnB1dD4gZWxlbWVudC4KKyAgICByZXR1cm4gbV9vcmlnaW5hbEZyYW1l
UmVjdC53aWR0aCgpIC0gbGlzdEJveFdpZHRoOworfQorCitib29sIFBvcHVwQ29udGFpbmVyOjpo
YW5kbGVNb3VzZURvd25FdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2ZW50KQorewor
ICAgIFVzZXJHZXN0dXJlSW5kaWNhdG9yIGdlc3R1cmVJbmRpY2F0b3IoRGVmaW5pdGVseVByb2Nl
c3NpbmdVc2VyR2VzdHVyZSk7CisgICAgcmV0dXJuIG1fbGlzdEJveC0+aGFuZGxlTW91c2VEb3du
RXZlbnQoCisgICAgICAgIGNvbnN0cnVjdFJlbGF0aXZlTW91c2VFdmVudChldmVudCwgdGhpcywg
bV9saXN0Qm94LmdldCgpKSk7Cit9CisKK2Jvb2wgUG9wdXBDb250YWluZXI6OmhhbmRsZU1vdXNl
TW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZlbnQpCit7CisgICAgVXNlckdl
c3R1cmVJbmRpY2F0b3IgZ2VzdHVyZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJH
ZXN0dXJlKTsKKyAgICByZXR1cm4gbV9saXN0Qm94LT5oYW5kbGVNb3VzZU1vdmVFdmVudCgKKyAg
ICAgICAgY29uc3RydWN0UmVsYXRpdmVNb3VzZUV2ZW50KGV2ZW50LCB0aGlzLCBtX2xpc3RCb3gu
Z2V0KCkpKTsKK30KKworYm9vbCBQb3B1cENvbnRhaW5lcjo6aGFuZGxlTW91c2VSZWxlYXNlRXZl
bnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKK3sKKyAgICBSZWZQdHI8UG9wdXBD
b250YWluZXI+IHByb3RlY3QodGhpcyk7CisgICAgVXNlckdlc3R1cmVJbmRpY2F0b3IgZ2VzdHVy
ZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJHZXN0dXJlKTsKKyAgICByZXR1cm4g
bV9saXN0Qm94LT5oYW5kbGVNb3VzZVJlbGVhc2VFdmVudCgKKyAgICAgICAgY29uc3RydWN0UmVs
YXRpdmVNb3VzZUV2ZW50KGV2ZW50LCB0aGlzLCBtX2xpc3RCb3guZ2V0KCkpKTsKK30KKworYm9v
bCBQb3B1cENvbnRhaW5lcjo6aGFuZGxlV2hlZWxFdmVudChjb25zdCBQbGF0Zm9ybVdoZWVsRXZl
bnQmIGV2ZW50KQoreworICAgIFVzZXJHZXN0dXJlSW5kaWNhdG9yIGdlc3R1cmVJbmRpY2F0b3Io
RGVmaW5pdGVseVByb2Nlc3NpbmdVc2VyR2VzdHVyZSk7CisgICAgcmV0dXJuIG1fbGlzdEJveC0+
aGFuZGxlV2hlZWxFdmVudCgKKyAgICAgICAgY29uc3RydWN0UmVsYXRpdmVXaGVlbEV2ZW50KGV2
ZW50LCB0aGlzLCBtX2xpc3RCb3guZ2V0KCkpKTsKK30KKworI2lmIEVOQUJMRShUT1VDSF9FVkVO
VFMpCitib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBsYXRmb3Jt
VG91Y2hFdmVudCYpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKKyNpZiBFTkFC
TEUoR0VTVFVSRV9SRUNPR05JWkVSKQorLy8gRklYTUU6IFJlZmFjdG9yIHRoaXMgY29kZSB0byBz
aGFyZSBmdW5jdGlvbmFsaXR5IHdpdGggRXZlbnRIYW5kbGVyOjpoYW5kbGVHZXN0dXJlRXZlbnQu
Citib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVHZXN0dXJlRXZlbnQoY29uc3QgUGxhdGZvcm1H
ZXN0dXJlRXZlbnQmIGdlc3R1cmVFdmVudCkKK3sKKyAgICBzd2l0Y2ggKGdlc3R1cmVFdmVudC50
eXBlKCkpIHsKKyAgICBjYXNlIFBsYXRmb3JtR2VzdHVyZUV2ZW50OjpUYXBUeXBlOiB7CisgICAg
ICAgIFBsYXRmb3JtTW91c2VFdmVudCBmYWtlTW91c2VNb3ZlKGdlc3R1cmVFdmVudC5wb3NpdGlv
bigpLCBnZXN0dXJlRXZlbnQuZ2xvYmFsUG9zaXRpb24oKSwgTm9CdXR0b24sIE1vdXNlRXZlbnRN
b3ZlZCwgLyogY2xpY2tDb3VudCAqLyAxLCBnZXN0dXJlRXZlbnQuc2hpZnRLZXkoKSwgZ2VzdHVy
ZUV2ZW50LmN0cmxLZXkoKSwgZ2VzdHVyZUV2ZW50LmFsdEtleSgpLCBnZXN0dXJlRXZlbnQubWV0
YUtleSgpLCBnZXN0dXJlRXZlbnQudGltZXN0YW1wKCkpOworICAgICAgICBQbGF0Zm9ybU1vdXNl
RXZlbnQgZmFrZU1vdXNlRG93bihnZXN0dXJlRXZlbnQucG9zaXRpb24oKSwgZ2VzdHVyZUV2ZW50
Lmdsb2JhbFBvc2l0aW9uKCksIExlZnRCdXR0b24sIE1vdXNlRXZlbnRQcmVzc2VkLCAvKiBjbGlj
a0NvdW50ICovIDEsIGdlc3R1cmVFdmVudC5zaGlmdEtleSgpLCBnZXN0dXJlRXZlbnQuY3RybEtl
eSgpLCBnZXN0dXJlRXZlbnQuYWx0S2V5KCksIGdlc3R1cmVFdmVudC5tZXRhS2V5KCksIGdlc3R1
cmVFdmVudC50aW1lc3RhbXAoKSk7CisgICAgICAgIFBsYXRmb3JtTW91c2VFdmVudCBmYWtlTW91
c2VVcChnZXN0dXJlRXZlbnQucG9zaXRpb24oKSwgZ2VzdHVyZUV2ZW50Lmdsb2JhbFBvc2l0aW9u
KCksIExlZnRCdXR0b24sIE1vdXNlRXZlbnRSZWxlYXNlZCwgLyogY2xpY2tDb3VudCAqLyAxLCBn
ZXN0dXJlRXZlbnQuc2hpZnRLZXkoKSwgZ2VzdHVyZUV2ZW50LmN0cmxLZXkoKSwgZ2VzdHVyZUV2
ZW50LmFsdEtleSgpLCBnZXN0dXJlRXZlbnQubWV0YUtleSgpLCBnZXN0dXJlRXZlbnQudGltZXN0
YW1wKCkpOworICAgICAgICAvLyBoYW5kbGVNb3VzZU1vdmVFdmVudChmYWtlTW91c2VNb3ZlKTsK
KyAgICAgICAgaGFuZGxlTW91c2VEb3duRXZlbnQoZmFrZU1vdXNlRG93bik7CisgICAgICAgIGhh
bmRsZU1vdXNlUmVsZWFzZUV2ZW50KGZha2VNb3VzZVVwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIGNhc2UgUGxhdGZvcm1HZXN0dXJlRXZlbnQ6OlNjcm9sbFVwZGF0ZVR5cGU6
IHsKKyAgICAgICAgUGxhdGZvcm1XaGVlbEV2ZW50IHN5bnRoZXRpY1doZWVsRXZlbnQoZ2VzdHVy
ZUV2ZW50LnBvc2l0aW9uKCksIGdlc3R1cmVFdmVudC5nbG9iYWxQb3NpdGlvbigpLCBnZXN0dXJl
RXZlbnQuZGVsdGFYKCksIGdlc3R1cmVFdmVudC5kZWx0YVkoKSwgZ2VzdHVyZUV2ZW50LmRlbHRh
WCgpIC8gMTIwLjBmLCBnZXN0dXJlRXZlbnQuZGVsdGFZKCkgLyAxMjAuMGYsIFNjcm9sbEJ5UGl4
ZWxXaGVlbEV2ZW50LCAvKiBpc0FjY2VwdGVkICovIGZhbHNlLCBnZXN0dXJlRXZlbnQuc2hpZnRL
ZXkoKSwgZ2VzdHVyZUV2ZW50LmN0cmxLZXkoKSwgZ2VzdHVyZUV2ZW50LmFsdEtleSgpLCBnZXN0
dXJlRXZlbnQubWV0YUtleSgpKTsKKyAgICAgICAgaGFuZGxlV2hlZWxFdmVudChzeW50aGV0aWNX
aGVlbEV2ZW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgUGxhdGZv
cm1HZXN0dXJlRXZlbnQ6OlNjcm9sbEJlZ2luVHlwZToKKyAgICBjYXNlIFBsYXRmb3JtR2VzdHVy
ZUV2ZW50OjpTY3JvbGxFbmRUeXBlOgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJu
IGZhbHNlOworfQorI2VuZGlmCisKK2Jvb2wgUG9wdXBDb250YWluZXI6OmhhbmRsZUtleUV2ZW50
KGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYgZXZlbnQpCit7CisgICAgVXNlckdlc3R1cmVJ
bmRpY2F0b3IgZ2VzdHVyZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJHZXN0dXJl
KTsKKyAgICByZXR1cm4gbV9saXN0Qm94LT5oYW5kbGVLZXlFdmVudChldmVudCk7Cit9CisKK3Zv
aWQgUG9wdXBDb250YWluZXI6OmhpZGUoKQoreworICAgIG1fbGlzdEJveC0+YWJhbmRvbigpOwor
fQorCit2b2lkIFBvcHVwQ29udGFpbmVyOjpwYWludChHcmFwaGljc0NvbnRleHQqIGdjLCBjb25z
dCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIGFkanVzdCBjb29yZHMgZm9yIHNjcm9sbGVkIGZy
YW1lCisgICAgSW50UmVjdCByID0gaW50ZXJzZWN0aW9uKHJlY3QsIGZyYW1lUmVjdCgpKTsKKyAg
ICBpbnQgdHggPSB4KCk7CisgICAgaW50IHR5ID0geSgpOworCisgICAgci5tb3ZlKC10eCwgLXR5
KTsKKworICAgIGdjLT50cmFuc2xhdGUoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR4KSwgc3RhdGljX2Nh
c3Q8ZmxvYXQ+KHR5KSk7CisgICAgbV9saXN0Qm94LT5wYWludChnYywgcik7CisgICAgZ2MtPnRy
YW5zbGF0ZSgtc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR4KSwgLXN0YXRpY19jYXN0PGZsb2F0Pih0eSkp
OworCisgICAgcGFpbnRCb3JkZXIoZ2MsIHJlY3QpOworfQorCit2b2lkIFBvcHVwQ29udGFpbmVy
OjpwYWludEJvcmRlcihHcmFwaGljc0NvbnRleHQqIGdjLCBjb25zdCBJbnRSZWN0JiByZWN0KQor
eworICAgIC8vIEZJWE1FOiBXaGVyZSBkbyB3ZSBnZXQgdGhlIGJvcmRlciBjb2xvciBmcm9tPwor
ICAgIENvbG9yIGJvcmRlckNvbG9yKDEyNywgMTU3LCAxODUpOworCisgICAgZ2MtPnNldFN0cm9r
ZVN0eWxlKE5vU3Ryb2tlKTsKKyAgICBnYy0+c2V0RmlsbENvbG9yKGJvcmRlckNvbG9yLCBDb2xv
clNwYWNlRGV2aWNlUkdCKTsKKworICAgIGludCB0eCA9IHgoKTsKKyAgICBpbnQgdHkgPSB5KCk7
CisKKyAgICAvLyB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQKKyAgICBnYy0+ZHJhd1JlY3QoSW50
UmVjdCh0eCwgdHksIHdpZHRoKCksIGtCb3JkZXJTaXplKSk7CisgICAgZ2MtPmRyYXdSZWN0KElu
dFJlY3QodHgsIHR5LCBrQm9yZGVyU2l6ZSwgaGVpZ2h0KCkpKTsKKyAgICBnYy0+ZHJhd1JlY3Qo
SW50UmVjdCh0eCwgdHkgKyBoZWlnaHQoKSAtIGtCb3JkZXJTaXplLCB3aWR0aCgpLCBrQm9yZGVy
U2l6ZSkpOworICAgIGdjLT5kcmF3UmVjdChJbnRSZWN0KHR4ICsgd2lkdGgoKSAtIGtCb3JkZXJT
aXplLCB0eSwga0JvcmRlclNpemUsIGhlaWdodCgpKSk7Cit9CisKK2Jvb2wgUG9wdXBDb250YWlu
ZXI6OmlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkoaW50IGtleUNvZGUpCit7CisgICAgcmV0dXJu
IG1fbGlzdEJveC0+aXNJbnRlcmVzdGVkSW5FdmVudEZvcktleShrZXlDb2RlKTsKK30KKworQ2hy
b21lQ2xpZW50Q2hyb21pdW0qIFBvcHVwQ29udGFpbmVyOjpjaHJvbWVDbGllbnRDaHJvbWl1bSgp
Cit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PENocm9tZUNsaWVudENocm9taXVtKj4obV9mcmFt
ZVZpZXctPmZyYW1lKCktPnBhZ2UoKS0+Y2hyb21lKCktPmNsaWVudCgpKTsKK30KKwordm9pZCBQ
b3B1cENvbnRhaW5lcjo6c2hvd0luUmVjdChjb25zdCBJbnRSZWN0JiByLCBGcmFtZVZpZXcqIHYs
IGludCBpbmRleCkKK3sKKyAgICAvLyBUaGUgcmVjdCBpcyB0aGUgc2l6ZSBvZiB0aGUgc2VsZWN0
IGJveC4gSXQncyB1c3VhbGx5IGxhcmdlciB0aGFuIHdlIG5lZWQuCisgICAgLy8gc3VidHJhY3Qg
Ym9yZGVyIHNpemUgc28gdGhhdCB1c3VhbGx5IHRoZSBjb250YWluZXIgd2lsbCBiZSBkaXNwbGF5
ZWQKKyAgICAvLyBleGFjdGx5IHRoZSBzYW1lIHdpZHRoIGFzIHRoZSBzZWxlY3QgYm94LgorICAg
IGxpc3RCb3goKS0+c2V0QmFzZVdpZHRoKG1heChyLndpZHRoKCkgLSBrQm9yZGVyU2l6ZSAqIDIs
IDApKTsKKworICAgIGxpc3RCb3goKS0+dXBkYXRlRnJvbUVsZW1lbnQoKTsKKworICAgIC8vIFdl
IHNldCB0aGUgc2VsZWN0ZWQgaXRlbSBpbiB1cGRhdGVGcm9tRWxlbWVudCgpLCBhbmQgZGlzcmVn
YXJkIHRoZQorICAgIC8vIGluZGV4IHBhc3NlZCBpbnRvIHRoaXMgZnVuY3Rpb24gKHNhbWUgYXMg
V2Via2l0J3MgUG9wdXBNZW51V2luLmNwcCkKKyAgICAvLyBGSVhNRTogbWFrZSBzdXJlIHRoaXMg
aXMgY29ycmVjdCwgYW5kIGFkZCBhbiBhc3NlcnRpb24uCisgICAgLy8gQVNTRVJUKHBvcHVwV2lu
ZG93KHBvcHVwKS0+bGlzdEJveCgpLT5zZWxlY3RlZEluZGV4KCkgPT0gaW5kZXgpOworCisgICAg
Ly8gQ29udmVydCBwb2ludCB0byBtYWluIHdpbmRvdyBjb29yZHMuCisgICAgSW50UG9pbnQgbG9j
YXRpb24gPSB2LT5jb250ZW50c1RvV2luZG93KHIubG9jYXRpb24oKSk7CisKKyAgICAvLyBNb3Zl
IGl0IGJlbG93IHRoZSBzZWxlY3Qgd2lkZ2V0LgorICAgIGxvY2F0aW9uLm1vdmUoMCwgci5oZWln
aHQoKSk7CisKKyAgICBtX29yaWdpbmFsRnJhbWVSZWN0ID0gSW50UmVjdChsb2NhdGlvbiwgci5z
aXplKCkpOworICAgIHNldEZyYW1lUmVjdChtX29yaWdpbmFsRnJhbWVSZWN0KTsKKyAgICBzaG93
UG9wdXAodik7Cit9CisKK3ZvaWQgUG9wdXBDb250YWluZXI6OnJlZnJlc2goY29uc3QgSW50UmVj
dCYgdGFyZ2V0Q29udHJvbFJlY3QpCit7CisgICAgSW50UG9pbnQgbG9jYXRpb24gPSBtX2ZyYW1l
Vmlldy0+Y29udGVudHNUb1dpbmRvdyh0YXJnZXRDb250cm9sUmVjdC5sb2NhdGlvbigpKTsKKyAg
ICAvLyBNb3ZlIGl0IGJlbG93IHRoZSBzZWxlY3Qgd2lkZ2V0LgorICAgIGxvY2F0aW9uLm1vdmUo
MCwgdGFyZ2V0Q29udHJvbFJlY3QuaGVpZ2h0KCkpOworCisgICAgbGlzdEJveCgpLT5zZXRCYXNl
V2lkdGgobWF4KG1fb3JpZ2luYWxGcmFtZVJlY3Qud2lkdGgoKSAtIGtCb3JkZXJTaXplICogMiwg
MCkpOworICAgIHNldEJvdW5kc1NpemUobV9vcmlnaW5hbEZyYW1lUmVjdC5zaXplKCkpOworCisg
ICAgbGlzdEJveCgpLT51cGRhdGVGcm9tRWxlbWVudCgpOworICAgIC8vIFN0b3JlIHRoZSBvcmln
aW5hbCBzaXplIHRvIGNoZWNrIGlmIHdlIG5lZWQgdG8gcmVxdWVzdCB0aGUgbG9jYXRpb24uCisg
ICAgSW50U2l6ZSBvcmlnaW5hbFNpemUgPSBzaXplKCk7CisgICAgSW50UmVjdCB3aWRnZXRSZWN0
ID0gbGF5b3V0QW5kQ2FsY3VsYXRlV2lkZ2V0UmVjdCh0YXJnZXRDb250cm9sUmVjdC5oZWlnaHQo
KSwgbG9jYXRpb24pOworICAgIGlmIChvcmlnaW5hbFNpemUgIT0gd2lkZ2V0UmVjdC5zaXplKCkp
IHsKKyAgICAgICAgQ2hyb21lQ2xpZW50Q2hyb21pdW0qIGNocm9tZUNsaWVudCA9IGNocm9tZUNs
aWVudENocm9taXVtKCk7CisgICAgICAgIGlmIChjaHJvbWVDbGllbnQpIHsKKyAgICAgICAgICAg
IEludFBvaW50IHdpZGdldExvY2F0aW9uID0gY2hyb21lQ2xpZW50LT5zY3JlZW5Ub1dpbmRvdyh3
aWRnZXRSZWN0LmxvY2F0aW9uKCkpOworICAgICAgICAgICAgd2lkZ2V0UmVjdC5zZXRMb2NhdGlv
bih3aWRnZXRMb2NhdGlvbik7CisgICAgICAgICAgICBzZXRGcmFtZVJlY3Qod2lkZ2V0UmVjdCk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK2lubGluZSBib29s
IFBvcHVwQ29udGFpbmVyOjppc1JUTCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbGlzdEJveC0+
bV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkudGV4dERpcmVjdGlvbigpID09IFJUTDsKK30KKwor
aW50IFBvcHVwQ29udGFpbmVyOjpzZWxlY3RlZEluZGV4KCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bV9saXN0Qm94LT5zZWxlY3RlZEluZGV4KCk7Cit9CisKK2ludCBQb3B1cENvbnRhaW5lcjo6bWVu
dUl0ZW1IZWlnaHQoKSBjb25zdAoreworICAgIHJldHVybiBtX2xpc3RCb3gtPmdldFJvd0hlaWdo
dCgwKTsKK30KKworaW50IFBvcHVwQ29udGFpbmVyOjptZW51SXRlbUZvbnRTaXplKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV9saXN0Qm94LT5nZXRSb3dGb250KDApLnNpemUoKTsKK30KKworUG9w
dXBNZW51U3R5bGUgUG9wdXBDb250YWluZXI6Om1lbnVTdHlsZSgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fbGlzdEJveC0+bV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCk7Cit9CisKK2NvbnN0IFdU
Rjo6VmVjdG9yPFBvcHVwSXRlbSo+JiBQb3B1cENvbnRhaW5lcjo6IHBvcHVwRGF0YSgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1fbGlzdEJveC0+aXRlbXMoKTsKK30KKworU3RyaW5nIFBvcHVwQ29u
dGFpbmVyOjpnZXRTZWxlY3RlZEl0ZW1Ub29sVGlwKCkKK3sKKyAgICAvLyBXZSBjYW5ub3QgdXNl
IG1fcG9wdXBDbGllbnQtPnNlbGVjdGVkSW5kZXgoKSB0byBjaG9vc2UgdG9vbHRpcCBtZXNzYWdl
LAorICAgIC8vIGJlY2F1c2UgdGhlIHNlbGVjdGVkSW5kZXgoKSBtaWdodCByZXR1cm4gZmluYWwg
c2VsZWN0ZWQgaW5kZXgsIG5vdCBob3ZlcmluZyBzZWxlY3Rpb24uCisgICAgcmV0dXJuIGxpc3RC
b3goKS0+bV9wb3B1cENsaWVudC0+aXRlbVRvb2xUaXAobGlzdEJveCgpLT5tX3NlbGVjdGVkSW5k
ZXgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cENvbnRhaW5lci5oIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vY2hyb21pdW0vUG9wdXBDb250YWluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40NTJlMWI0MjU0
MjZjOWQzMTlhZDMzNWYyNGQ3YmYwOWRlM2IzYjBmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBDb250YWluZXIuaApAQCAtMCwwICsxLDE0
OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAq
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICog
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29n
bGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaWZuZGVmIFBvcHVwQ29udGFpbmVyX2gKKyNkZWZpbmUgUG9wdXBDb250YWluZXJfaAor
CisjaW5jbHVkZSAiRnJhbWVsZXNzU2Nyb2xsVmlldy5oIgorI2luY2x1ZGUgIlBvcHVwTGlzdEJv
eC5oIgorI2luY2x1ZGUgIlBvcHVwTWVudVN0eWxlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworY2xhc3MgQ2hyb21lQ2xpZW50Q2hyb21pdW07CitjbGFzcyBGcmFtZVZpZXc7CitjbGFzcyBQ
b3B1cE1lbnVDbGllbnQ7CisKK2NsYXNzIFBvcHVwQ29udGFpbmVyIDogcHVibGljIEZyYW1lbGVz
c1Njcm9sbFZpZXcgeworcHVibGljOgorICAgIGVudW0gUG9wdXBUeXBlIHsKKyAgICAgICAgU2Vs
ZWN0LCAvLyBIVE1MIHNlbGVjdCBwb3B1cC4KKyAgICAgICAgU3VnZ2VzdGlvbiwgLy8gQXV0b2Nv
bXBsZXRlL2F1dG9maWxsIHBvcHVwLgorICAgIH07CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxQ
b3B1cENvbnRhaW5lcj4gY3JlYXRlKFBvcHVwTWVudUNsaWVudCosIFBvcHVwVHlwZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvcHVwQ29udGFp
bmVyU2V0dGluZ3MmKTsKKworICAgIC8vIFdoZXRoZXIgYSBrZXkgZXZlbnQgc2hvdWxkIGJlIHNl
bnQgdG8gdGhpcyBwb3B1cC4KKyAgICB2aXJ0dWFsIGJvb2wgaXNJbnRlcmVzdGVkSW5FdmVudEZv
cktleShpbnQga2V5Q29kZSk7CisKKyAgICAvLyBGcmFtZWxlc3NTY3JvbGxWaWV3CisgICAgdmly
dHVhbCB2b2lkIHBhaW50KEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmKTsKKyAgICB2
aXJ0dWFsIHZvaWQgaGlkZSgpOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZURvd25FdmVu
dChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91
c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7CisgICAgdmlydHVhbCBib29s
IGhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOworICAg
IHZpcnR1YWwgYm9vbCBoYW5kbGVXaGVlbEV2ZW50KGNvbnN0IFBsYXRmb3JtV2hlZWxFdmVudCYp
OworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVLZXlFdmVudChjb25zdCBQbGF0Zm9ybUtleWJvYXJk
RXZlbnQmKTsKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorICAgIHZpcnR1YWwgYm9vbCBoYW5k
bGVUb3VjaEV2ZW50KGNvbnN0IFBsYXRmb3JtVG91Y2hFdmVudCYpOworI2VuZGlmCisjaWYgRU5B
QkxFKEdFU1RVUkVfUkVDT0dOSVpFUikKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlR2VzdHVyZUV2
ZW50KGNvbnN0IFBsYXRmb3JtR2VzdHVyZUV2ZW50Jik7CisjZW5kaWYKKworICAgIC8vIFBvcHVw
Q29udGFpbmVyIG1ldGhvZHMKKworICAgIC8vIFNob3cgdGhlIHBvcHVwCisgICAgdm9pZCBzaG93
UG9wdXAoRnJhbWVWaWV3Kik7CisKKyAgICAvLyBTaG93IHRoZSBwb3B1cCBpbiB0aGUgc3BlY2lm
aWVkIHJlY3QgZm9yIHRoZSBzcGVjaWZpZWQgZnJhbWUuCisgICAgLy8gTm90ZTogdGhpcyBjb2Rl
IHdhcyBzb21laG93IGFyYml0cmFyaWx5IGZhY3RvcmVkLW91dCBvZiB0aGUgUG9wdXAgY2xhc3MK
KyAgICAvLyBzbyBXZWJWaWV3SW1wbCBjYW4gY3JlYXRlIGEgUG9wdXBDb250YWluZXIuIFRoaXMg
bWV0aG9kIGlzIHVzZWQgZm9yCisgICAgLy8gZGlzcGxheWluZyBhdXRvIGNvbXBsZXRlIHBvcHVw
IG1lbnVzIG9uIE1hYyBDaHJvbWl1bSwgYW5kIGZvciBhbGwKKyAgICAvLyBwb3B1cHMgb24gb3Ro
ZXIgcGxhdGZvcm1zLgorICAgIHZvaWQgc2hvd0luUmVjdChjb25zdCBJbnRSZWN0JiwgRnJhbWVW
aWV3KiwgaW50IGluZGV4KTsKKworICAgIC8vIEhpZGVzIHRoZSBwb3B1cC4KKyAgICB2b2lkIGhp
ZGVQb3B1cCgpOworCisgICAgLy8gVGhlIHBvcHVwIHdhcyBoaWRkZW4uCisgICAgdm9pZCBub3Rp
ZnlQb3B1cEhpZGRlbigpOworCisgICAgLy8gQ29tcHV0ZSBzaXplIG9mIHdpZGdldCBhbmQgY2hp
bGRyZW4uIFJldHVybiByaWdodCBvZmZzZXQgZm9yIHRoZSBwb3B1cCByaWdodCBhbGlnbm1lbnQu
CisgICAgaW50IGxheW91dEFuZEdldFJUTE9mZnNldCgpOworCisgICAgUG9wdXBMaXN0Qm94KiBs
aXN0Qm94KCkgY29uc3QgeyByZXR1cm4gbV9saXN0Qm94LmdldCgpOyB9CisKKyAgICBib29sIGlz
UlRMKCkgY29uc3Q7CisKKyAgICAvLyBHZXRzIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0aGF0IHRo
ZSB1c2VyIGlzIGN1cnJlbnRseSBtb3VzZWQtb3ZlciBvcgorICAgIC8vIGhhcyBzZWxlY3RlZCB3
aXRoIHRoZSBrZXlib2FyZCB1cC9kb3duIGFycm93cy4KKyAgICBpbnQgc2VsZWN0ZWRJbmRleCgp
IGNvbnN0OworCisgICAgLy8gUmVmcmVzaCB0aGUgcG9wdXAgdmFsdWVzIGZyb20gdGhlIFBvcHVw
TWVudUNsaWVudC4KKyAgICB2b2lkIHJlZnJlc2goY29uc3QgSW50UmVjdCYgdGFyZ2V0Q29udHJv
bFJlY3QpOworCisgICAgLy8gVGhlIG1lbnUgcGVyLWl0ZW0gZGF0YS4KKyAgICBjb25zdCBXVEY6
OlZlY3RvcjxQb3B1cEl0ZW0qPiYgcG9wdXBEYXRhKCkgY29uc3Q7CisKKyAgICAvLyBUaGUgaGVp
Z2h0IG9mIGEgcm93IGluIHRoZSBtZW51LgorICAgIGludCBtZW51SXRlbUhlaWdodCgpIGNvbnN0
OworCisgICAgLy8gVGhlIHNpemUgb2YgdGhlIGZvbnQgYmVpbmcgdXNlZC4KKyAgICBpbnQgbWVu
dUl0ZW1Gb250U2l6ZSgpIGNvbnN0OworCisgICAgLy8gVGhlIHN0eWxlIG9mIHRoZSBtZW51IGJl
aW5nIHVzZWQuCisgICAgUG9wdXBNZW51U3R5bGUgbWVudVN0eWxlKCkgY29uc3Q7CisKKyAgICBQ
b3B1cFR5cGUgcG9wdXBUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9wb3B1cFR5cGU7IH0KKworICAg
IC8vIFdoaWxlIGhvdmVyaW5nIHBvcHVwIG1lbnUgd2luZG93LCB3ZSB3YW50IHRvIHNob3cgdG9v
bCB0aXAgbWVzc2FnZS4KKyAgICBTdHJpbmcgZ2V0U2VsZWN0ZWRJdGVtVG9vbFRpcCgpOworCitw
cml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBXVEY6OlJlZkNvdW50ZWQ8UG9wdXBDb250YWluZXI+
OworCisgICAgUG9wdXBDb250YWluZXIoUG9wdXBNZW51Q2xpZW50KiwgUG9wdXBUeXBlLCBjb25z
dCBQb3B1cENvbnRhaW5lclNldHRpbmdzJik7CisgICAgflBvcHVwQ29udGFpbmVyKCk7CisKKyAg
ICAvLyBQYWludCB0aGUgYm9yZGVyLgorICAgIHZvaWQgcGFpbnRCb3JkZXIoR3JhcGhpY3NDb250
ZXh0KiwgY29uc3QgSW50UmVjdCYpOworCisgICAgLy8gTGF5b3V0IGFuZCBjYWxjdWxhdGUgcG9w
dXAgd2lkZ2V0IHNpemUgYW5kIGxvY2F0aW9uIGFuZCByZXR1cm5zIGl0IGFzIEludFJlY3QuCisg
ICAgSW50UmVjdCBsYXlvdXRBbmRDYWxjdWxhdGVXaWRnZXRSZWN0KGludCB0YXJnZXRDb250cm9s
SGVpZ2h0LCBjb25zdCBJbnRQb2ludCYgcG9wdXBJbml0aWFsQ29vcmRpbmF0ZSk7CisKKyAgICAv
LyBSZXR1cm5zIHRoZSBDaHJvbWVDbGllbnQgb2YgdGhlIHBhZ2UgdGhpcyBwb3B1cCBpcyBhc3Nv
Y2lhdGVkIHdpdGguCisgICAgQ2hyb21lQ2xpZW50Q2hyb21pdW0qIGNocm9tZUNsaWVudENocm9t
aXVtKCk7CisKKyAgICBSZWZQdHI8UG9wdXBMaXN0Qm94PiBtX2xpc3RCb3g7CisgICAgUmVmUHRy
PEZyYW1lVmlldz4gbV9mcmFtZVZpZXc7CisKKyAgICBQb3B1cENvbnRhaW5lclNldHRpbmdzIG1f
c2V0dGluZ3M7CisgICAgUG9wdXBUeXBlIG1fcG9wdXBUeXBlOworICAgIEludFJlY3QgbV9vcmln
aW5hbEZyYW1lUmVjdDsKKyAgICAvLyBXaGV0aGVyIHRoZSBwb3B1cCBpcyBjdXJyZW50bHkgb3Bl
bi4KKyAgICBib29sIG1fcG9wdXBPcGVuOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1Bv
cHVwTGlzdEJveC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cExp
c3RCb3guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjIwMTUwNjRjZGMxOGUyNTkyMDUyNWYzMGE0NzkzOTMwNTdl
MTIwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1
bS9Qb3B1cExpc3RCb3guY3BwCkBAIC0wLDAgKzEsOTExIEBACisvKgorICogQ29weXJpZ2h0IChj
KSAyMDExLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisg
KiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2Yg
aXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiUG9wdXBMaXN0Qm94LmgiCisKKyNpbmNsdWRlICJGb250LmgiCisjaW5jbHVkZSAi
Rm9udFNlbGVjdG9yLmgiCisjaW5jbHVkZSAiRnJhbWVsZXNzU2Nyb2xsVmlld0NsaWVudC5oIgor
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNs
dWRlICJLZXlib2FyZENvZGVzLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1LZXlib2FyZEV2ZW50Lmgi
CisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TY3Jl
ZW4uaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVdoZWVsRXZlbnQuaCIKKyNpbmNsdWRlICJQb3B1cENv
bnRhaW5lci5oIgorI2luY2x1ZGUgIlBvcHVwTWVudUNocm9taXVtLmgiCisjaW5jbHVkZSAiUG9w
dXBNZW51Q2xpZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKyNpbmNsdWRlICJTY3Jv
bGxiYXJUaGVtZS5oIgorI2luY2x1ZGUgIlN0cmluZ1RydW5jYXRvci5oIgorI2luY2x1ZGUgIlRl
eHRSdW4uaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+
CisKKyNpZiBFTkFCTEUoR0VTVFVSRV9FVkVOVFMpCisjaW5jbHVkZSAiUGxhdGZvcm1HZXN0dXJl
RXZlbnQuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyNpbmNsdWRlICJQ
bGF0Zm9ybVRvdWNoRXZlbnQuaCIKKyNlbmRpZgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3Vz
aW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgV1RGOwordXNpbmcgbmFtZXNwYWNl
IFVuaWNvZGU7CisKK1BvcHVwTGlzdEJveDo6UG9wdXBMaXN0Qm94KFBvcHVwTWVudUNsaWVudCog
Y2xpZW50LCBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJiBzZXR0aW5ncykKKyAgICA6IG1f
c2V0dGluZ3Moc2V0dGluZ3MpCisgICAgLCBtX29yaWdpbmFsSW5kZXgoMCkKKyAgICAsIG1fc2Vs
ZWN0ZWRJbmRleCgwKQorICAgICwgbV9hY2NlcHRlZEluZGV4T25BYmFuZG9uKC0xKQorICAgICwg
bV92aXNpYmxlUm93cygwKQorICAgICwgbV9iYXNlV2lkdGgoMCkKKyAgICAsIG1fbWF4SGVpZ2h0
KGtNYXhIZWlnaHQpCisgICAgLCBtX3BvcHVwQ2xpZW50KGNsaWVudCkKKyAgICAsIG1fcmVwZWF0
aW5nQ2hhcigwKQorICAgICwgbV9sYXN0Q2hhclRpbWUoMCkKKyAgICAsIG1fbWF4V2luZG93V2lk
dGgoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSkKK3sKKyAgICBzZXRTY3JvbGxiYXJN
b2RlcyhTY3JvbGxiYXJBbHdheXNPZmYsIFNjcm9sbGJhckFsd2F5c09mZik7Cit9CisKK2Jvb2wg
UG9wdXBMaXN0Qm94OjpoYW5kbGVNb3VzZURvd25FdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZl
bnQmIGV2ZW50KQoreworICAgIFNjcm9sbGJhciogc2Nyb2xsYmFyID0gc2Nyb2xsYmFyQXRQb2lu
dChldmVudC5wb3MoKSk7CisgICAgaWYgKHNjcm9sbGJhcikgeworICAgICAgICBtX2NhcHR1cmlu
Z1Njcm9sbGJhciA9IHNjcm9sbGJhcjsKKyAgICAgICAgbV9jYXB0dXJpbmdTY3JvbGxiYXItPm1v
dXNlRG93bihldmVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICgh
aXNQb2ludEluQm91bmRzKGV2ZW50LnBvcygpKSkKKyAgICAgICAgYWJhbmRvbigpOworCisgICAg
cmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVNb3VzZU1vdmVFdmVu
dChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2ZW50KQoreworICAgIGlmIChtX2NhcHR1cmlu
Z1Njcm9sbGJhcikgeworICAgICAgICBtX2NhcHR1cmluZ1Njcm9sbGJhci0+bW91c2VNb3ZlZChl
dmVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIFNjcm9sbGJhciogc2Ny
b2xsYmFyID0gc2Nyb2xsYmFyQXRQb2ludChldmVudC5wb3MoKSk7CisgICAgaWYgKG1fbGFzdFNj
cm9sbGJhclVuZGVyTW91c2UgIT0gc2Nyb2xsYmFyKSB7CisgICAgICAgIC8vIFNlbmQgbW91c2Ug
ZXhpdGVkIHRvIHRoZSBvbGQgc2Nyb2xsYmFyLgorICAgICAgICBpZiAobV9sYXN0U2Nyb2xsYmFy
VW5kZXJNb3VzZSkKKyAgICAgICAgICAgIG1fbGFzdFNjcm9sbGJhclVuZGVyTW91c2UtPm1vdXNl
RXhpdGVkKCk7CisgICAgICAgIG1fbGFzdFNjcm9sbGJhclVuZGVyTW91c2UgPSBzY3JvbGxiYXI7
CisgICAgfQorCisgICAgaWYgKHNjcm9sbGJhcikgeworICAgICAgICBzY3JvbGxiYXItPm1vdXNl
TW92ZWQoZXZlbnQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWlz
UG9pbnRJbkJvdW5kcyhldmVudC5wb3MoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IHNlbGVjdEluZGV4KHBvaW50VG9Sb3dJbmRleChldmVudC5wb3MoKSkpOworICAgIHJldHVybiB0
cnVlOworfQorCitib29sIFBvcHVwTGlzdEJveDo6aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoY29u
c3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKK3sKKyAgICBpZiAobV9jYXB0dXJpbmdTY3Jv
bGxiYXIpIHsKKyAgICAgICAgbV9jYXB0dXJpbmdTY3JvbGxiYXItPm1vdXNlVXAoKTsKKyAgICAg
ICAgbV9jYXB0dXJpbmdTY3JvbGxiYXIgPSAwOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisKKyAgICBpZiAoIWlzUG9pbnRJbkJvdW5kcyhldmVudC5wb3MoKSkpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgLy8gTmVlZCB0byBjaGVjayBiZWZvcmUgY2FsbGluZyBhY2NlcHRJbmRl
eCgpLCBiZWNhdXNlIG1fcG9wdXBDbGllbnQgbWlnaHQgYmUgcmVtb3ZlZCBpbiBhY2NlcHRJbmRl
eCgpIGNhbGxpbmcgYmVjYXVzZSBvZiBldmVudCBoYW5kbGVyLgorICAgIGJvb2wgaXNTZWxlY3RQ
b3B1cCA9IG1fcG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpLm1lbnVUeXBlKCkgPT0gUG9wdXBNZW51
U3R5bGU6OlNlbGVjdFBvcHVwOworICAgIGlmIChhY2NlcHRJbmRleChwb2ludFRvUm93SW5kZXgo
ZXZlbnQucG9zKCkpKSAmJiBtX2ZvY3VzZWROb2RlICYmIGlzU2VsZWN0UG9wdXApIHsKKyAgICAg
ICAgbV9mb2N1c2VkTm9kZS0+ZGlzcGF0Y2hNb3VzZUV2ZW50KGV2ZW50LCBldmVudE5hbWVzKCku
bW91c2V1cEV2ZW50KTsKKyAgICAgICAgbV9mb2N1c2VkTm9kZS0+ZGlzcGF0Y2hNb3VzZUV2ZW50
KGV2ZW50LCBldmVudE5hbWVzKCkuY2xpY2tFdmVudCk7CisKKyAgICAgICAgLy8gQ2xlYXIgbV9m
b2N1c2VkTm9kZSBoZXJlLCBiZWNhdXNlIHdlIGNhbm5vdCBjbGVhciBpbiBoaWRlUG9wdXAoKSB3
aGljaCBpcyBjYWxsZWQgYmVmb3JlIGRpc3BhdGNoTW91c2VFdmVudCgpIGlzIGNhbGxlZC4KKyAg
ICAgICAgbV9mb2N1c2VkTm9kZSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisK
K2Jvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVXaGVlbEV2ZW50KGNvbnN0IFBsYXRmb3JtV2hlZWxF
dmVudCYgZXZlbnQpCit7CisgICAgaWYgKCFpc1BvaW50SW5Cb3VuZHMoZXZlbnQucG9zKCkpKSB7
CisgICAgICAgIGFiYW5kb24oKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAg
Ly8gUGFzcyBpdCBvZmYgdG8gdGhlIHNjcm9sbCB2aWV3LgorICAgIC8vIFNhZGx5LCBXZWJDb3Jl
IGRldnMgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgd2hvbGUgImNvbnN0IiB0aGluZy4KKyAgICB3aGVl
bEV2ZW50KGNvbnN0X2Nhc3Q8UGxhdGZvcm1XaGVlbEV2ZW50Jj4oZXZlbnQpKTsKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworLy8gU2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIGhhbmRsZUtleUV2
ZW50KCkuCitib29sIFBvcHVwTGlzdEJveDo6aXNJbnRlcmVzdGVkSW5FdmVudEZvcktleShpbnQg
a2V5Q29kZSkKK3sKKyAgICBzd2l0Y2ggKGtleUNvZGUpIHsKKyAgICBjYXNlIFZLRVlfRVNDQVBF
OgorICAgIGNhc2UgVktFWV9SRVRVUk46CisgICAgY2FzZSBWS0VZX1VQOgorICAgIGNhc2UgVktF
WV9ET1dOOgorICAgIGNhc2UgVktFWV9QUklPUjoKKyAgICBjYXNlIFZLRVlfTkVYVDoKKyAgICBj
YXNlIFZLRVlfSE9NRToKKyAgICBjYXNlIFZLRVlfRU5EOgorICAgIGNhc2UgVktFWV9UQUI6Cisg
ICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9Cit9CisKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorYm9vbCBQb3B1cExpc3RCb3g6
OmhhbmRsZVRvdWNoRXZlbnQoY29uc3QgUGxhdGZvcm1Ub3VjaEV2ZW50JikKK3sKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRShHRVNUVVJFX1JFQ09HTklaRVIpCiti
b29sIFBvcHVwTGlzdEJveDo6aGFuZGxlR2VzdHVyZUV2ZW50KGNvbnN0IFBsYXRmb3JtR2VzdHVy
ZUV2ZW50JikKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKworc3RhdGljIGJvb2wg
aXNDaGFyYWN0ZXJUeXBlRXZlbnQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50JiBldmVudCkK
K3sKKyAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGNoYXJhY3Rlci10eXBlZCBl
dmVudCBvciBub3QuCisgICAgLy8gV2UgdXNlIFJhd0tleURvd24vQ2hhci9LZXlVcCBldmVudCBz
Y2hlbWUgb24gYWxsIHBsYXRmb3JtcywKKyAgICAvLyBzbyBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6
OkNoYXIgKG5vdCBSYXdLZXlEb3duKSB0eXBlIGV2ZW50CisgICAgLy8gaXMgY29uc2lkZXJlZCBh
cyBjaGFyYWN0ZXIgdHlwZSBldmVudC4KKyAgICByZXR1cm4gZXZlbnQudHlwZSgpID09IFBsYXRm
b3JtS2V5Ym9hcmRFdmVudDo6Q2hhcjsKK30KKworYm9vbCBQb3B1cExpc3RCb3g6OmhhbmRsZUtl
eUV2ZW50KGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYgZXZlbnQpCit7CisgICAgaWYgKGV2
ZW50LnR5cGUoKSA9PSBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6OktleVVwKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIGlmICghbnVtSXRlbXMoKSAmJiBldmVudC53aW5kb3dzVmlydHVhbEtl
eUNvZGUoKSAhPSBWS0VZX0VTQ0FQRSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBzd2l0
Y2ggKGV2ZW50LndpbmRvd3NWaXJ0dWFsS2V5Q29kZSgpKSB7CisgICAgY2FzZSBWS0VZX0VTQ0FQ
RToKKyAgICAgICAgYWJhbmRvbigpOyAvLyBtYXkgZGVsZXRlIHRoaXMKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgY2FzZSBWS0VZX1JFVFVSTjoKKyAgICAgICAgaWYgKG1fc2VsZWN0ZWRJbmRl
eCA9PSAtMSkgIHsKKyAgICAgICAgICAgIGhpZGVQb3B1cCgpOworICAgICAgICAgICAgLy8gRG9u
J3QgZWF0IHRoZSBlbnRlciBpZiBub3RoaW5nIGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGFjY2VwdEluZGV4KG1fc2VsZWN0ZWRJbmRl
eCk7IC8vIG1heSBkZWxldGUgdGhpcworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIFZL
RVlfVVA6CisgICAgY2FzZSBWS0VZX0RPV046CisgICAgICAgIC8vIFdlIGhhdmUgdG8gZm9yd2Fy
ZCBvbmx5IHNoaWZ0ICsgdXAgY29tYmluYXRpb24gdG8gZm9jdXNlZCBub2RlIHdoZW4gYXV0b2Zp
bGwgcG9wdXAuCisgICAgICAgIC8vIEJlY2F1c2UgYWxsIGNoYXJhY3RlcnMgZnJvbSB0aGUgY3Vy
c29yIHRvIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBhcmVhIHNob3VsZCBzZWxlY3RlZCB3aGVuIHlv
dSBwcmVzcyBzaGlmdCArIHVwIGFycm93LgorICAgICAgICAvLyBzaGlmdCArIGRvd24gc2hvdWxk
IGJlIHRoZSBzaW1pbGFyIHdheSB0byBzaGlmdCArIHVwLgorICAgICAgICBpZiAoZXZlbnQubW9k
aWZpZXJzKCkgJiYgbV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkubWVudVR5cGUoKSA9PSBQb3B1
cE1lbnVTdHlsZTo6QXV0b2ZpbGxQb3B1cCkKKyAgICAgICAgICAgIG1fZm9jdXNlZE5vZGUtPmRp
c3BhdGNoS2V5RXZlbnQoZXZlbnQpOworICAgICAgICBlbHNlIGlmIChldmVudC53aW5kb3dzVmly
dHVhbEtleUNvZGUoKSA9PSBWS0VZX1VQKQorICAgICAgICAgICAgc2VsZWN0UHJldmlvdXNSb3co
KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VsZWN0TmV4dFJvdygpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFZLRVlfUFJJT1I6CisgICAgICAgIGFkanVzdFNlbGVjdGVkSW5kZXgo
LW1fdmlzaWJsZVJvd3MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLRVlfTkVYVDoKKyAg
ICAgICAgYWRqdXN0U2VsZWN0ZWRJbmRleChtX3Zpc2libGVSb3dzKTsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBWS0VZX0hPTUU6CisgICAgICAgIGFkanVzdFNlbGVjdGVkSW5kZXgoLW1fc2Vs
ZWN0ZWRJbmRleCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktFWV9FTkQ6CisgICAgICAg
IGFkanVzdFNlbGVjdGVkSW5kZXgobV9pdGVtcy5zaXplKCkpOworICAgICAgICBicmVhazsKKyAg
ICBkZWZhdWx0OgorICAgICAgICBpZiAoIWV2ZW50LmN0cmxLZXkoKSAmJiAhZXZlbnQuYWx0S2V5
KCkgJiYgIWV2ZW50Lm1ldGFLZXkoKQorICAgICAgICAgICAgJiYgaXNQcmludGFibGVDaGFyKGV2
ZW50LndpbmRvd3NWaXJ0dWFsS2V5Q29kZSgpKQorICAgICAgICAgICAgJiYgaXNDaGFyYWN0ZXJU
eXBlRXZlbnQoZXZlbnQpKQorICAgICAgICAgICAgdHlwZUFoZWFkRmluZChldmVudCk7CisgICAg
ICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChtX29yaWdpbmFsSW5kZXggIT0gbV9zZWxlY3Rl
ZEluZGV4KSB7CisgICAgICAgIC8vIEtleWJvYXJkIGV2ZW50cyBzaG91bGQgdXBkYXRlIHRoZSBz
ZWxlY3Rpb24gaW1tZWRpYXRlbHkgKGJ1dCB3ZSBkb24ndAorICAgICAgICAvLyB3YW50IHRvIGZp
cmUgdGhlIG9uY2hhbmdlIGV2ZW50IHVudGlsIHRoZSBwb3B1cCBpcyBjbG9zZWQsIHRvIG1hdGNo
CisgICAgICAgIC8vIElFKS4gV2UgY2hhbmdlIHRoZSBvcmlnaW5hbCBpbmRleCBzbyB3ZSByZXZl
cnQgdG8gdGhhdCB3aGVuIHRoZQorICAgICAgICAvLyBwb3B1cCBpcyBjbG9zZWQuCisgICAgICAg
IGlmIChtX3NldHRpbmdzLmFjY2VwdE9uQWJhbmRvbikKKyAgICAgICAgICAgIG1fYWNjZXB0ZWRJ
bmRleE9uQWJhbmRvbiA9IG1fc2VsZWN0ZWRJbmRleDsKKworICAgICAgICBzZXRPcmlnaW5hbElu
ZGV4KG1fc2VsZWN0ZWRJbmRleCk7CisgICAgICAgIGlmIChtX3NldHRpbmdzLnNldFRleHRPbklu
ZGV4Q2hhbmdlKQorICAgICAgICAgICAgbV9wb3B1cENsaWVudC0+c2V0VGV4dEZyb21JdGVtKG1f
c2VsZWN0ZWRJbmRleCk7CisgICAgfQorICAgIGlmIChldmVudC53aW5kb3dzVmlydHVhbEtleUNv
ZGUoKSA9PSBWS0VZX1RBQikgeworICAgICAgICAvLyBUQUIgaXMgYSBzcGVjaWFsIGNhc2UgYXMg
aXQgc2hvdWxkIHNlbGVjdCB0aGUgY3VycmVudCBpdGVtIGlmIGFueSBhbmQKKyAgICAgICAgLy8g
YWR2YW5jZSBmb2N1cy4KKyAgICAgICAgaWYgKG1fc2VsZWN0ZWRJbmRleCA+PSAwKSB7CisgICAg
ICAgICAgICBhY2NlcHRJbmRleChtX3NlbGVjdGVkSW5kZXgpOyAvLyBNYXkgZGVsZXRlIHVzLgor
ICAgICAgICAgICAgLy8gUmV0dXJuIGZhbHNlIHNvIHRoZSBUQUIga2V5IGV2ZW50IGlzIHByb3Bh
Z2F0ZWQgdG8gdGhlIHBhZ2UuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KyAgICAgICAgLy8gQ2FsbCBhYmFuZG9uKCkgc28gd2UgaG9ub3IgbV9hY2NlcHRlZEluZGV4T25B
YmFuZG9uIGlmIHNldC4KKyAgICAgICAgYWJhbmRvbigpOworICAgICAgICAvLyBSZXR1cm4gZmFs
c2Ugc28gdGhlIFRBQiBrZXkgZXZlbnQgaXMgcHJvcGFnYXRlZCB0byB0aGUgcGFnZS4KKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitIb3N0V2lu
ZG93KiBQb3B1cExpc3RCb3g6Omhvc3RXaW5kb3coKSBjb25zdAoreworICAgIC8vIE91ciBwYXJl
bnQgaXMgdGhlIHJvb3QgU2Nyb2xsVmlldywgc28gaXQgaXMgdGhlIG9uZSB0aGF0IGhhcyBhCisg
ICAgLy8gSG9zdFdpbmRvdy4gRnJhbWVWaWV3Ojpob3N0V2luZG93KCkgd29ya3Mgc2ltaWxhcmx5
LgorICAgIHJldHVybiBwYXJlbnQoKSA/IHBhcmVudCgpLT5ob3N0V2luZG93KCkgOiAwOworfQor
CisvLyBGcm9tIEhUTUxTZWxlY3RFbGVtZW50LmNwcAorc3RhdGljIFN0cmluZyBzdHJpcExlYWRp
bmdXaGl0ZVNwYWNlKGNvbnN0IFN0cmluZyYgc3RyaW5nKQoreworICAgIGludCBsZW5ndGggPSBz
dHJpbmcubGVuZ3RoKCk7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsg
KytpKQorICAgICAgICBpZiAoc3RyaW5nW2ldICE9IG5vQnJlYWtTcGFjZQorICAgICAgICAgICAg
JiYgKHN0cmluZ1tpXSA8PSAweDdGID8gIWlzc3BhY2Uoc3RyaW5nW2ldKSA6IChkaXJlY3Rpb24o
c3RyaW5nW2ldKSAhPSBXaGl0ZVNwYWNlTmV1dHJhbCkpKQorICAgICAgICAgICAgYnJlYWs7CisK
KyAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhpLCBsZW5ndGggLSBpKTsKK30KKworLy8gRnJv
bSBIVE1MU2VsZWN0RWxlbWVudC5jcHAsIHdpdGggbW9kaWZpY2F0aW9ucwordm9pZCBQb3B1cExp
c3RCb3g6OnR5cGVBaGVhZEZpbmQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50JiBldmVudCkK
K3sKKyAgICBUaW1lU3RhbXAgbm93ID0gc3RhdGljX2Nhc3Q8VGltZVN0YW1wPihjdXJyZW50VGlt
ZSgpICogMTAwMC4wZik7CisgICAgVGltZVN0YW1wIGRlbHRhID0gbm93IC0gbV9sYXN0Q2hhclRp
bWU7CisKKyAgICAvLyBSZXNldCB0aGUgdGltZSB3aGVuIHVzZXIgdHlwZXMgaW4gYSBjaGFyYWN0
ZXIuIFRoZSB0aW1lIGdhcCBiZXR3ZWVuCisgICAgLy8gbGFzdCBjaGFyYWN0ZXIgYW5kIHRoZSBj
dXJyZW50IGNoYXJhY3RlciBpcyB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIKKyAgICAvLyB1c2Vy
IHR5cGVkIGluIGEgc3RyaW5nIG9yIGp1c3QgYSBjaGFyYWN0ZXIgYXMgdGhlIHNlYXJjaCBwcmVm
aXguCisgICAgbV9sYXN0Q2hhclRpbWUgPSBub3c7CisKKyAgICBVQ2hhciBjID0gZXZlbnQud2lu
ZG93c1ZpcnR1YWxLZXlDb2RlKCk7CisKKyAgICBTdHJpbmcgcHJlZml4OworICAgIGludCBzZWFy
Y2hTdGFydE9mZnNldCA9IDE7CisgICAgaWYgKGRlbHRhID4ga1R5cGVBaGVhZFRpbWVvdXRNcykg
eworICAgICAgICBtX3R5cGVkU3RyaW5nID0gcHJlZml4ID0gU3RyaW5nKCZjLCAxKTsKKyAgICAg
ICAgbV9yZXBlYXRpbmdDaGFyID0gYzsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3R5cGVkU3Ry
aW5nLmFwcGVuZChjKTsKKworICAgICAgICBpZiAoYyA9PSBtX3JlcGVhdGluZ0NoYXIpCisgICAg
ICAgICAgICAvLyBUaGUgdXNlciBpcyBsaWtlbHkgdHJ5aW5nIHRvIGN5Y2xlIHRocm91Z2ggYWxs
IHRoZSBpdGVtcyBzdGFydGluZyB3aXRoIHRoaXMgY2hhcmFjdGVyLCBzbyBqdXN0IHNlYXJjaCBv
biB0aGUgY2hhcmFjdGVyCisgICAgICAgICAgICBwcmVmaXggPSBTdHJpbmcoJmMsIDEpOworICAg
ICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fcmVwZWF0aW5nQ2hhciA9IDA7CisgICAgICAgICAg
ICBwcmVmaXggPSBtX3R5cGVkU3RyaW5nOworICAgICAgICAgICAgc2VhcmNoU3RhcnRPZmZzZXQg
PSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29tcHV0ZSBhIGNhc2UtZm9sZGVkIGNv
cHkgb2YgdGhlIHByZWZpeCBzdHJpbmcgYmVmb3JlIGJlZ2lubmluZyB0aGUgc2VhcmNoIGZvcgor
ICAgIC8vIGEgbWF0Y2hpbmcgZWxlbWVudC4gVGhpcyBjb2RlIHVzZXMgZm9sZENhc2UgdG8gd29y
ayBhcm91bmQgdGhlIGZhY3QgdGhhdAorICAgIC8vIFN0cmluZzo6c3RhcnRXaXRoIGRvZXMgbm90
IGZvbGQgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuIFRoaXMgY29kZSBjYW4gYmUgY2hhbmdlZAorICAg
IC8vIHRvIHVzZSBzdGFydFdpdGggb25jZSB0aGF0IGlzIGZpeGVkLgorICAgIFN0cmluZyBwcmVm
aXhXaXRoQ2FzZUZvbGRlZChwcmVmaXguZm9sZENhc2UoKSk7CisgICAgaW50IGl0ZW1Db3VudCA9
IG51bUl0ZW1zKCk7CisgICAgaW50IGluZGV4ID0gKG1heCgwLCBtX3NlbGVjdGVkSW5kZXgpICsg
c2VhcmNoU3RhcnRPZmZzZXQpICUgaXRlbUNvdW50OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
aXRlbUNvdW50OyBpKyssIGluZGV4ID0gKGluZGV4ICsgMSkgJSBpdGVtQ291bnQpIHsKKyAgICAg
ICAgaWYgKCFpc1NlbGVjdGFibGVJdGVtKGluZGV4KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOwor
CisgICAgICAgIGlmIChzdHJpcExlYWRpbmdXaGl0ZVNwYWNlKG1faXRlbXNbaW5kZXhdLT5sYWJl
bCkuZm9sZENhc2UoKS5zdGFydHNXaXRoKHByZWZpeFdpdGhDYXNlRm9sZGVkKSkgeworICAgICAg
ICAgICAgc2VsZWN0SW5kZXgoaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisgICAgfQorfQorCit2b2lkIFBvcHVwTGlzdEJveDo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiBn
YywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICAvLyBhZGp1c3QgY29vcmRzIGZvciBzY3Jv
bGxlZCBmcmFtZQorICAgIEludFJlY3QgciA9IGludGVyc2VjdGlvbihyZWN0LCBmcmFtZVJlY3Qo
KSk7CisgICAgaW50IHR4ID0geCgpIC0gc2Nyb2xsWCgpOworICAgIGludCB0eSA9IHkoKSAtIHNj
cm9sbFkoKTsKKworICAgIHIubW92ZSgtdHgsIC10eSk7CisKKyAgICAvLyBzZXQgY2xpcCByZWN0
IHRvIG1hdGNoIHJldmlzZWQgZGFtYWdlIHJlY3QKKyAgICBnYy0+c2F2ZSgpOworICAgIGdjLT50
cmFuc2xhdGUoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR4KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR5KSk7
CisgICAgZ2MtPmNsaXAocik7CisKKyAgICAvLyBGSVhNRTogQ2FuIHdlIG9wdGltaXplIHNjcm9s
bGluZyB0byBub3QgcmVxdWlyZSByZXBhaW50aW5nIHRoZSBlbnRpcmUKKyAgICAvLyB3aW5kb3c/
IFNob3VsZCB3ZT8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUl0ZW1zKCk7ICsraSkKKyAg
ICAgICAgcGFpbnRSb3coZ2MsIHIsIGkpOworCisgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhbiBl
bXB0eSBwb3B1cC4KKyAgICBpZiAoIW51bUl0ZW1zKCkpCisgICAgICAgIGdjLT5maWxsUmVjdChy
LCBDb2xvcjo6d2hpdGUsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworCisgICAgZ2MtPnJlc3RvcmUo
KTsKKworICAgIFNjcm9sbFZpZXc6OnBhaW50KGdjLCByZWN0KTsKK30KKworc3RhdGljIGNvbnN0
IGludCBzZXBhcmF0b3JQYWRkaW5nID0gNDsKK3N0YXRpYyBjb25zdCBpbnQgc2VwYXJhdG9ySGVp
Z2h0ID0gMTsKKwordm9pZCBQb3B1cExpc3RCb3g6OnBhaW50Um93KEdyYXBoaWNzQ29udGV4dCog
Z2MsIGNvbnN0IEludFJlY3QmIHJlY3QsIGludCByb3dJbmRleCkKK3sKKyAgICAvLyBUaGlzIGNv
ZGUgaXMgYmFzZWQgbGFyZ2VseSBvbiBSZW5kZXJMaXN0Qm94OjpwYWludCogbWV0aG9kcy4KKwor
ICAgIEludFJlY3Qgcm93UmVjdCA9IGdldFJvd0JvdW5kcyhyb3dJbmRleCk7CisgICAgaWYgKCFy
b3dSZWN0LmludGVyc2VjdHMocmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIFBvcHVwTWVu
dVN0eWxlIHN0eWxlID0gbV9wb3B1cENsaWVudC0+aXRlbVN0eWxlKHJvd0luZGV4KTsKKworICAg
IC8vIFBhaW50IGJhY2tncm91bmQKKyAgICBDb2xvciBiYWNrQ29sb3IsIHRleHRDb2xvciwgbGFi
ZWxDb2xvcjsKKyAgICBpZiAocm93SW5kZXggPT0gbV9zZWxlY3RlZEluZGV4KSB7CisgICAgICAg
IGJhY2tDb2xvciA9IFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+YWN0aXZlTGlzdEJveFNl
bGVjdGlvbkJhY2tncm91bmRDb2xvcigpOworICAgICAgICB0ZXh0Q29sb3IgPSBSZW5kZXJUaGVt
ZTo6ZGVmYXVsdFRoZW1lKCktPmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3Io
KTsKKyAgICAgICAgbGFiZWxDb2xvciA9IHRleHRDb2xvcjsKKyAgICB9IGVsc2UgeworICAgICAg
ICBiYWNrQ29sb3IgPSBzdHlsZS5iYWNrZ3JvdW5kQ29sb3IoKTsKKyAgICAgICAgdGV4dENvbG9y
ID0gc3R5bGUuZm9yZWdyb3VuZENvbG9yKCk7CisgICAgICAgIC8vIEZJWE1FOiBmb3Igbm93IHRo
ZSBsYWJlbCBjb2xvciBpcyBoYXJkLWNvZGVkLiBJdCBzaG91bGQgYmUgYWRkZWQgdG8KKyAgICAg
ICAgLy8gdGhlIFBvcHVwTWVudVN0eWxlLgorICAgICAgICBsYWJlbENvbG9yID0gQ29sb3IoMTE1
LCAxMTUsIDExNSk7CisgICAgfQorCisgICAgLy8gSWYgd2UgaGF2ZSBhIHRyYW5zcGFyZW50IGJh
Y2tncm91bmQsIG1ha2Ugc3VyZSBpdCBoYXMgYSBjb2xvciB0byBibGVuZAorICAgIC8vIGFnYWlu
c3QuCisgICAgaWYgKGJhY2tDb2xvci5oYXNBbHBoYSgpKQorICAgICAgICBnYy0+ZmlsbFJlY3Qo
cm93UmVjdCwgQ29sb3I6OndoaXRlLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKworICAgIGdjLT5m
aWxsUmVjdChyb3dSZWN0LCBiYWNrQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworCisgICAg
Ly8gSXQgZG9lc24ndCBsb29rIGdvb2QgYnV0IEF1dG9maWxsIHJlcXVpcmVzIHNwZWNpYWwgc3R5
bGUgZm9yIHNlcGFyYXRvci4KKyAgICAvLyBBdXRvZmlsbCBkb2Vzbid0IGhhdmUgcGFkZGluZyBh
bmQgI2RjZGNkYyBjb2xvci4KKyAgICBpZiAobV9wb3B1cENsaWVudC0+aXRlbUlzU2VwYXJhdG9y
KHJvd0luZGV4KSkgeworICAgICAgICBpbnQgcGFkZGluZyA9IHN0eWxlLm1lbnVUeXBlKCkgPT0g
UG9wdXBNZW51U3R5bGU6OkF1dG9maWxsUG9wdXAgPyAwIDogc2VwYXJhdG9yUGFkZGluZzsKKyAg
ICAgICAgSW50UmVjdCBzZXBhcmF0b3JSZWN0KAorICAgICAgICAgICAgcm93UmVjdC54KCkgKyBw
YWRkaW5nLAorICAgICAgICAgICAgcm93UmVjdC55KCkgKyAocm93UmVjdC5oZWlnaHQoKSAtIHNl
cGFyYXRvckhlaWdodCkgLyAyLAorICAgICAgICAgICAgcm93UmVjdC53aWR0aCgpIC0gMiAqIHBh
ZGRpbmcsIHNlcGFyYXRvckhlaWdodCk7CisgICAgICAgIGdjLT5maWxsUmVjdChzZXBhcmF0b3JS
ZWN0LCBzdHlsZS5tZW51VHlwZSgpID09IFBvcHVwTWVudVN0eWxlOjpBdXRvZmlsbFBvcHVwID8g
Q29sb3IoMHhkYywgMHhkYywgMHhkYykgOiB0ZXh0Q29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0Ip
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFzdHlsZS5pc1Zpc2libGUoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgZ2MtPnNldEZpbGxDb2xvcih0ZXh0Q29sb3IsIENvbG9y
U3BhY2VEZXZpY2VSR0IpOworCisgICAgRm9udCBpdGVtRm9udCA9IGdldFJvd0ZvbnQocm93SW5k
ZXgpOworICAgIC8vIEZJWE1FOiBodHRwOi8vY3JidWcuY29tLzE5ODcyIFdlIHNob3VsZCBnZXQg
dGhlIHBhZGRpbmcgb2YgaW5kaXZpZHVhbCBvcHRpb24KKyAgICAvLyBlbGVtZW50cy4gVGhpcyBw
cm9iYWJseSBpbXBsaWVzIGNoYW5nZXMgdG8gUG9wdXBNZW51Q2xpZW50LgorICAgIGJvb2wgcmln
aHRBbGlnbmVkID0gbV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkudGV4dERpcmVjdGlvbigpID09
IFJUTDsKKyAgICBpbnQgdGV4dFggPSAwOworICAgIGludCBtYXhXaWR0aCA9IDA7CisgICAgaWYg
KHJpZ2h0QWxpZ25lZCkKKyAgICAgICAgbWF4V2lkdGggPSByb3dSZWN0LndpZHRoKCkgLSBtYXgo
MCwgbV9wb3B1cENsaWVudC0+Y2xpZW50UGFkZGluZ1JpZ2h0KCkgLSBtX3BvcHVwQ2xpZW50LT5j
bGllbnRJbnNldFJpZ2h0KCkpOworICAgIGVsc2UgeworICAgICAgICB0ZXh0WCA9IG1heCgwLCBt
X3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nTGVmdCgpIC0gbV9wb3B1cENsaWVudC0+Y2xpZW50
SW5zZXRMZWZ0KCkpOworICAgICAgICBtYXhXaWR0aCA9IHJvd1JlY3Qud2lkdGgoKSAtIHRleHRY
OworICAgIH0KKyAgICAvLyBQcmVwYXJlIHRleHQgdG8gYmUgZHJhd24uCisgICAgU3RyaW5nIGl0
ZW1UZXh0ID0gbV9wb3B1cENsaWVudC0+aXRlbVRleHQocm93SW5kZXgpOworICAgIFN0cmluZyBp
dGVtTGFiZWwgPSBtX3BvcHVwQ2xpZW50LT5pdGVtTGFiZWwocm93SW5kZXgpOworICAgIFN0cmlu
ZyBpdGVtSWNvbiA9IG1fcG9wdXBDbGllbnQtPml0ZW1JY29uKHJvd0luZGV4KTsKKyAgICBpZiAo
bV9zZXR0aW5ncy5yZXN0cmljdFdpZHRoT2ZMaXN0Qm94KSB7IC8vIFRydW5jYXRlIHN0cmluZ3Mg
dG8gZml0IGluLgorICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGxlZnRUcnVuY2F0ZSBmb3Ig
dGhlIHJ0bCBjYXNlLgorICAgICAgICAvLyBTdHJpbmdUcnVuY2F0b3I6OmxlZnRUcnVuY2F0ZSB3
b3VsZCBoYXZlIHRvIGJlIGltcGxlbWVudGVkLgorICAgICAgICBTdHJpbmcgc3RyID0gU3RyaW5n
VHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKGl0ZW1UZXh0LCBtYXhXaWR0aCwgaXRlbUZvbnQpOwor
ICAgICAgICBpZiAoc3RyICE9IGl0ZW1UZXh0KSB7CisgICAgICAgICAgICBpdGVtVGV4dCA9IHN0
cjsKKyAgICAgICAgICAgIC8vIERvbid0IGRpc3BsYXkgdGhlIGxhYmVsIG9yIGljb24sIHdlIGFs
cmVhZHkgZG9uJ3QgaGF2ZSBlbm91Z2ggcm9vbSBmb3IgdGhlIGl0ZW0gdGV4dC4KKyAgICAgICAg
ICAgIGl0ZW1MYWJlbCA9ICIiOworICAgICAgICAgICAgaXRlbUljb24gPSAiIjsKKyAgICAgICAg
fSBlbHNlIGlmICghaXRlbUxhYmVsLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaW50IGF2YWls
YWJsZVdpZHRoID0gbWF4V2lkdGggLSBrVGV4dFRvTGFiZWxQYWRkaW5nIC0KKyAgICAgICAgICAg
ICAgICBTdHJpbmdUcnVuY2F0b3I6OndpZHRoKGl0ZW1UZXh0LCBpdGVtRm9udCk7CisgICAgICAg
ICAgICBpdGVtTGFiZWwgPSBTdHJpbmdUcnVuY2F0b3I6OnJpZ2h0VHJ1bmNhdGUoaXRlbUxhYmVs
LCBhdmFpbGFibGVXaWR0aCwgaXRlbUZvbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8g
UHJlcGFyZSB0aGUgZGlyZWN0aW9uYWxpdHkgdG8gZHJhdyB0ZXh0LgorICAgIFRleHRSdW4gdGV4
dFJ1bihpdGVtVGV4dC5jaGFyYWN0ZXJzKCksIGl0ZW1UZXh0Lmxlbmd0aCgpLCBmYWxzZSwgMCwg
MCwgVGV4dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgc3R5bGUudGV4dERpcmVjdGlvbigp
LCBzdHlsZS5oYXNUZXh0RGlyZWN0aW9uT3ZlcnJpZGUoKSk7CisgICAgLy8gSWYgdGhlIHRleHQg
aXMgcmlnaHQtdG8tbGVmdCwgbWFrZSBpdCByaWdodC1hbGlnbmVkIGJ5IGFkanVzdGluZyBpdHMK
KyAgICAvLyBiZWdpbm5pbmcgcG9zaXRpb24uCisgICAgaWYgKHJpZ2h0QWxpZ25lZCkKKyAgICAg
ICAgdGV4dFggKz0gbWF4V2lkdGggLSBpdGVtRm9udC53aWR0aCh0ZXh0UnVuKTsKKworICAgIC8v
IERyYXcgdGhlIGl0ZW0gdGV4dC4KKyAgICBpbnQgdGV4dFkgPSByb3dSZWN0LnkoKSArIGl0ZW1G
b250LmZvbnRNZXRyaWNzKCkuYXNjZW50KCkgKyAocm93UmVjdC5oZWlnaHQoKSAtIGl0ZW1Gb250
LmZvbnRNZXRyaWNzKCkuaGVpZ2h0KCkpIC8gMjsKKyAgICBnYy0+ZHJhd0JpZGlUZXh0KGl0ZW1G
b250LCB0ZXh0UnVuLCBJbnRQb2ludCh0ZXh0WCwgdGV4dFkpKTsKKworICAgIC8vIFdlIGFyZSB1
c2luZyB0aGUgbGVmdCBwYWRkaW5nIGFzIHRoZSByaWdodCBwYWRkaW5nIGluY2x1ZGVzIHJvb20g
Zm9yIHRoZSBzY3JvbGwtYmFyIHdoaWNoCisgICAgLy8gZG9lcyBub3Qgc2hvdyBpbiB0aGlzIGNh
c2UuCisgICAgaW50IHJpZ2h0UGFkZGluZyA9IG1heCgwLCBtX3BvcHVwQ2xpZW50LT5jbGllbnRQ
YWRkaW5nTGVmdCgpIC0gbV9wb3B1cENsaWVudC0+Y2xpZW50SW5zZXRMZWZ0KCkpOworICAgIGlu
dCByZW1haW5pbmdXaWR0aCA9IHJvd1JlY3Qud2lkdGgoKSAtIHJpZ2h0UGFkZGluZzsKKworICAg
IC8vIERyYXcgdGhlIGljb24gaWYgYXBwbGljYWJsZS4KKyAgICBSZWZQdHI8SW1hZ2U+IGltYWdl
KEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShpdGVtSWNvbi51dGY4KCkuZGF0YSgpKSk7Cisg
ICAgaWYgKGltYWdlICYmICFpbWFnZS0+aXNOdWxsKCkpIHsKKyAgICAgICAgSW50UmVjdCBpbWFn
ZVJlY3QgPSBpbWFnZS0+cmVjdCgpOworICAgICAgICByZW1haW5pbmdXaWR0aCAtPSAoaW1hZ2VS
ZWN0LndpZHRoKCkgKyBrTGFiZWxUb0ljb25QYWRkaW5nKTsKKyAgICAgICAgaW1hZ2VSZWN0LnNl
dFgocm93UmVjdC53aWR0aCgpIC0gcmlnaHRQYWRkaW5nIC0gaW1hZ2VSZWN0LndpZHRoKCkpOwor
ICAgICAgICBpbWFnZVJlY3Quc2V0WShyb3dSZWN0LnkoKSArIChyb3dSZWN0LmhlaWdodCgpIC0g
aW1hZ2VSZWN0LmhlaWdodCgpKSAvIDIpOworICAgICAgICBnYy0+ZHJhd0ltYWdlKGltYWdlLmdl
dCgpLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBpbWFnZVJlY3QpOworICAgIH0KKworICAgIC8vIERy
YXcgdGhlIHRoZSBsYWJlbCBpZiBhcHBsaWNhYmxlLgorICAgIGlmIChpdGVtTGFiZWwuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBBdXRvZmlsbCBsYWJlbCBpcyAwLjkgc21h
bGxlciB0aGFuIHJlZ3VsYXIgZm9udCBzaXplLgorICAgIGlmIChzdHlsZS5tZW51VHlwZSgpID09
IFBvcHVwTWVudVN0eWxlOjpBdXRvZmlsbFBvcHVwKSB7CisgICAgICAgIGl0ZW1Gb250ID0gbV9w
b3B1cENsaWVudC0+aXRlbVN0eWxlKHJvd0luZGV4KS5mb250KCk7CisgICAgICAgIEZvbnREZXNj
cmlwdGlvbiBkID0gaXRlbUZvbnQuZm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgIGQuc2V0Q29t
cHV0ZWRTaXplKGQuY29tcHV0ZWRTaXplKCkgKiAwLjkpOworICAgICAgICBpdGVtRm9udCA9IEZv
bnQoZCwgaXRlbUZvbnQubGV0dGVyU3BhY2luZygpLCBpdGVtRm9udC53b3JkU3BhY2luZygpKTsK
KyAgICAgICAgaXRlbUZvbnQudXBkYXRlKDApOworICAgIH0KKworICAgIFRleHRSdW4gbGFiZWxU
ZXh0UnVuKGl0ZW1MYWJlbC5jaGFyYWN0ZXJzKCksIGl0ZW1MYWJlbC5sZW5ndGgoKSwgZmFsc2Us
IDAsIDAsIFRleHRSdW46OkFsbG93VHJhaWxpbmdFeHBhbnNpb24sIHN0eWxlLnRleHREaXJlY3Rp
b24oKSwgc3R5bGUuaGFzVGV4dERpcmVjdGlvbk92ZXJyaWRlKCkpOworICAgIGlmIChyaWdodEFs
aWduZWQpCisgICAgICAgIHRleHRYID0gbWF4KDAsIG1fcG9wdXBDbGllbnQtPmNsaWVudFBhZGRp
bmdMZWZ0KCkgLSBtX3BvcHVwQ2xpZW50LT5jbGllbnRJbnNldExlZnQoKSk7CisgICAgZWxzZQor
ICAgICAgICB0ZXh0WCA9IHJlbWFpbmluZ1dpZHRoIC0gaXRlbUZvbnQud2lkdGgobGFiZWxUZXh0
UnVuKTsKKworICAgIGdjLT5zZXRGaWxsQ29sb3IobGFiZWxDb2xvciwgQ29sb3JTcGFjZURldmlj
ZVJHQik7CisgICAgZ2MtPmRyYXdCaWRpVGV4dChpdGVtRm9udCwgbGFiZWxUZXh0UnVuLCBJbnRQ
b2ludCh0ZXh0WCwgdGV4dFkpKTsKK30KKworRm9udCBQb3B1cExpc3RCb3g6OmdldFJvd0ZvbnQo
aW50IHJvd0luZGV4KQoreworICAgIEZvbnQgaXRlbUZvbnQgPSBtX3BvcHVwQ2xpZW50LT5pdGVt
U3R5bGUocm93SW5kZXgpLmZvbnQoKTsKKyAgICBpZiAobV9wb3B1cENsaWVudC0+aXRlbUlzTGFi
ZWwocm93SW5kZXgpKSB7CisgICAgICAgIC8vIEJvbGQtaWZ5IGxhYmVscyAoaWUsIGFuIDxvcHRn
cm91cD4gaGVhZGluZykuCisgICAgICAgIEZvbnREZXNjcmlwdGlvbiBkID0gaXRlbUZvbnQuZm9u
dERlc2NyaXB0aW9uKCk7CisgICAgICAgIGQuc2V0V2VpZ2h0KEZvbnRXZWlnaHRCb2xkKTsKKyAg
ICAgICAgRm9udCBmb250KGQsIGl0ZW1Gb250LmxldHRlclNwYWNpbmcoKSwgaXRlbUZvbnQud29y
ZFNwYWNpbmcoKSk7CisgICAgICAgIGZvbnQudXBkYXRlKDApOworICAgICAgICByZXR1cm4gZm9u
dDsKKyAgICB9CisKKyAgICByZXR1cm4gaXRlbUZvbnQ7Cit9CisKK3ZvaWQgUG9wdXBMaXN0Qm94
OjphYmFuZG9uKCkKK3sKKyAgICBSZWZQdHI8UG9wdXBMaXN0Qm94PiBrZWVwQWxpdmUodGhpcyk7
CisKKyAgICBtX3NlbGVjdGVkSW5kZXggPSBtX29yaWdpbmFsSW5kZXg7CisKKyAgICBoaWRlUG9w
dXAoKTsKKworICAgIGlmIChtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gPj0gMCkgeworICAgICAg
ICBpZiAobV9wb3B1cENsaWVudCkKKyAgICAgICAgICAgIG1fcG9wdXBDbGllbnQtPnZhbHVlQ2hh
bmdlZChtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24pOworICAgICAgICBtX2FjY2VwdGVkSW5kZXhP
bkFiYW5kb24gPSAtMTsKKyAgICB9Cit9CisKK2ludCBQb3B1cExpc3RCb3g6OnBvaW50VG9Sb3dJ
bmRleChjb25zdCBJbnRQb2ludCYgcG9pbnQpCit7CisgICAgaW50IHkgPSBzY3JvbGxZKCkgKyBw
b2ludC55KCk7CisKKyAgICAvLyBGSVhNRTogYmluYXJ5IHNlYXJjaCBpZiBwZXJmIG1hdHRlcnMu
CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVtcygpOyArK2kpIHsKKyAgICAgICAgaWYg
KHkgPCBtX2l0ZW1zW2ldLT55T2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIGktMTsKKyAgICB9
CisKKyAgICAvLyBMYXN0IGl0ZW0/CisgICAgaWYgKHkgPCBjb250ZW50c0hlaWdodCgpKQorICAg
ICAgICByZXR1cm4gbV9pdGVtcy5zaXplKCktMTsKKworICAgIHJldHVybiAtMTsKK30KKworYm9v
bCBQb3B1cExpc3RCb3g6OmFjY2VwdEluZGV4KGludCBpbmRleCkKK3sKKyAgICAvLyBDbGVhciBt
X2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gb25jZSB1c2VyIGFjY2VwdHMgdGhlIHNlbGVjdGVkIGlu
ZGV4LgorICAgIGlmIChtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gPj0gMCkKKyAgICAgICAgbV9h
Y2NlcHRlZEluZGV4T25BYmFuZG9uID0gLTE7CisKKyAgICBpZiAoaW5kZXggPj0gbnVtSXRlbXMo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAg
ICBpZiAobV9wb3B1cENsaWVudCkgeworICAgICAgICAgICAgLy8gRW50ZXIgcHJlc3NlZCB3aXRo
IG5vIHNlbGVjdGlvbiwganVzdCBjbG9zZSB0aGUgcG9wdXAuCisgICAgICAgICAgICBoaWRlUG9w
dXAoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYg
KGlzU2VsZWN0YWJsZUl0ZW0oaW5kZXgpKSB7CisgICAgICAgIFJlZlB0cjxQb3B1cExpc3RCb3g+
IGtlZXBBbGl2ZSh0aGlzKTsKKworICAgICAgICAvLyBIaWRlIG91cnNlbHZlcyBmaXJzdCBzaW5j
ZSB2YWx1ZUNoYW5nZWQgbWF5IGhhdmUgbnVtZXJvdXMgc2lkZS1lZmZlY3RzLgorICAgICAgICBo
aWRlUG9wdXAoKTsKKworICAgICAgICAvLyBUZWxsIHRoZSA8c2VsZWN0PiBQb3B1cE1lbnVDbGll
bnQgd2hhdCBpbmRleCB3YXMgc2VsZWN0ZWQuCisgICAgICAgIG1fcG9wdXBDbGllbnQtPnZhbHVl
Q2hhbmdlZChpbmRleCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0
dXJuIGZhbHNlOworfQorCit2b2lkIFBvcHVwTGlzdEJveDo6c2VsZWN0SW5kZXgoaW50IGluZGV4
KQoreworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtSXRlbXMoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgYm9vbCBpc1NlbGVjdGFibGUgPSBpc1NlbGVjdGFibGVJdGVtKGluZGV4
KTsKKyAgICBpZiAoaW5kZXggIT0gbV9zZWxlY3RlZEluZGV4ICYmIGlzU2VsZWN0YWJsZSkgewor
ICAgICAgICBpbnZhbGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7CisgICAgICAgIG1fc2VsZWN0
ZWRJbmRleCA9IGluZGV4OworICAgICAgICBpbnZhbGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7
CisKKyAgICAgICAgc2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24oKTsKKyAgICAgICAgbV9wb3B1cENs
aWVudC0+c2VsZWN0aW9uQ2hhbmdlZChtX3NlbGVjdGVkSW5kZXgpOworICAgIH0gZWxzZSBpZiAo
IWlzU2VsZWN0YWJsZSkKKyAgICAgICAgY2xlYXJTZWxlY3Rpb24oKTsKK30KKwordm9pZCBQb3B1
cExpc3RCb3g6OnNldE9yaWdpbmFsSW5kZXgoaW50IGluZGV4KQoreworICAgIG1fb3JpZ2luYWxJ
bmRleCA9IG1fc2VsZWN0ZWRJbmRleCA9IGluZGV4OworfQorCitpbnQgUG9wdXBMaXN0Qm94Ojpn
ZXRSb3dIZWlnaHQoaW50IGluZGV4KQoreworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJl
dHVybiBQb3B1cE1lbnVDaHJvbWl1bTo6bWluaW11bVJvd0hlaWdodCgpOworCisgICAgaWYgKG1f
cG9wdXBDbGllbnQtPml0ZW1TdHlsZShpbmRleCkuaXNEaXNwbGF5Tm9uZSgpKQorICAgICAgICBy
ZXR1cm4gUG9wdXBNZW51Q2hyb21pdW06Om1pbmltdW1Sb3dIZWlnaHQoKTsKKworICAgIC8vIFNl
cGFyYXRvciByb3cgaGVpZ2h0IGlzIHRoZSBzYW1lIHNpemUgYXMgaXRzZWxmLgorICAgIGlmICht
X3BvcHVwQ2xpZW50LT5pdGVtSXNTZXBhcmF0b3IoaW5kZXgpKQorICAgICAgICByZXR1cm4gbWF4
KHNlcGFyYXRvckhlaWdodCwgUG9wdXBNZW51Q2hyb21pdW06Om1pbmltdW1Sb3dIZWlnaHQoKSk7
CisKKyAgICBTdHJpbmcgaWNvbiA9IG1fcG9wdXBDbGllbnQtPml0ZW1JY29uKGluZGV4KTsKKyAg
ICBSZWZQdHI8SW1hZ2U+IGltYWdlKEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShpY29uLnV0
ZjgoKS5kYXRhKCkpKTsKKworICAgIGludCBmb250SGVpZ2h0ID0gZ2V0Um93Rm9udChpbmRleCku
Zm9udE1ldHJpY3MoKS5oZWlnaHQoKTsKKyAgICBpbnQgaWNvbkhlaWdodCA9IChpbWFnZSAmJiAh
aW1hZ2UtPmlzTnVsbCgpKSA/IGltYWdlLT5yZWN0KCkuaGVpZ2h0KCkgOiAwOworCisgICAgaW50
IGxpbmVQYWRkaW5nSGVpZ2h0ID0gbV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkubWVudVR5cGUo
KSA9PSBQb3B1cE1lbnVTdHlsZTo6QXV0b2ZpbGxQb3B1cCA/IGtMaW5lUGFkZGluZ0hlaWdodCA6
IDA7CisgICAgaW50IGNhbGN1bGF0ZWRSb3dIZWlnaHQgPSBtYXgoZm9udEhlaWdodCwgaWNvbkhl
aWdodCkgKyBsaW5lUGFkZGluZ0hlaWdodCAqIDI7CisgICAgcmV0dXJuIG1heChjYWxjdWxhdGVk
Um93SGVpZ2h0LCBQb3B1cE1lbnVDaHJvbWl1bTo6bWluaW11bVJvd0hlaWdodCgpKTsKK30KKwor
SW50UmVjdCBQb3B1cExpc3RCb3g6OmdldFJvd0JvdW5kcyhpbnQgaW5kZXgpCit7CisgICAgaWYg
KGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIEludFJlY3QoMCwgMCwgdmlzaWJsZVdpZHRoKCks
IGdldFJvd0hlaWdodChpbmRleCkpOworCisgICAgcmV0dXJuIEludFJlY3QoMCwgbV9pdGVtc1tp
bmRleF0tPnlPZmZzZXQsIHZpc2libGVXaWR0aCgpLCBnZXRSb3dIZWlnaHQoaW5kZXgpKTsKK30K
Kwordm9pZCBQb3B1cExpc3RCb3g6OmludmFsaWRhdGVSb3coaW50IGluZGV4KQoreworICAgIGlm
IChpbmRleCA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEludmFsaWRhdGUgaW4gdGhl
IHdpbmRvdyBjb250ZW50cywgYXMgRnJhbWVsZXNzU2Nyb2xsVmlldzo6aW52YWxpZGF0ZVJlY3QK
KyAgICAvLyBwYWludHMgaW4gdGhlIHdpbmRvdyBjb29yZGluYXRlcy4KKyAgICBpbnZhbGlkYXRl
UmVjdChjb250ZW50c1RvV2luZG93KGdldFJvd0JvdW5kcyhpbmRleCkpKTsKK30KKwordm9pZCBQ
b3B1cExpc3RCb3g6OnNjcm9sbFRvUmV2ZWFsUm93KGludCBpbmRleCkKK3sKKyAgICBpZiAoaW5k
ZXggPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHJvd1JlY3QgPSBnZXRSb3dC
b3VuZHMoaW5kZXgpOworCisgICAgaWYgKHJvd1JlY3QueSgpIDwgc2Nyb2xsWSgpKSB7CisgICAg
ICAgIC8vIFJvdyBpcyBhYm92ZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiwgc2Nyb2xsIHVwLgor
ICAgICAgICBTY3JvbGxWaWV3OjpzZXRTY3JvbGxQb3NpdGlvbihJbnRQb2ludCgwLCByb3dSZWN0
LnkoKSkpOworICAgIH0gZWxzZSBpZiAocm93UmVjdC5tYXhZKCkgPiBzY3JvbGxZKCkgKyB2aXNp
YmxlSGVpZ2h0KCkpIHsKKyAgICAgICAgLy8gUm93IGlzIGJlbG93IGN1cnJlbnQgc2Nyb2xsIHBv
c2l0aW9uLCBzY3JvbGwgZG93bi4KKyAgICAgICAgU2Nyb2xsVmlldzo6c2V0U2Nyb2xsUG9zaXRp
b24oSW50UG9pbnQoMCwgcm93UmVjdC5tYXhZKCkgLSB2aXNpYmxlSGVpZ2h0KCkpKTsKKyAgICB9
Cit9CisKK2Jvb2wgUG9wdXBMaXN0Qm94Ojppc1NlbGVjdGFibGVJdGVtKGludCBpbmRleCkKK3sK
KyAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bUl0ZW1zKCkpOworICAgIHJldHVy
biBtX2l0ZW1zW2luZGV4XS0+dHlwZSA9PSBQb3B1cEl0ZW06OlR5cGVPcHRpb24gJiYgbV9wb3B1
cENsaWVudC0+aXRlbUlzRW5hYmxlZChpbmRleCk7Cit9CisKK3ZvaWQgUG9wdXBMaXN0Qm94Ojpj
bGVhclNlbGVjdGlvbigpCit7CisgICAgaWYgKG1fc2VsZWN0ZWRJbmRleCAhPSAtMSkgeworICAg
ICAgICBpbnZhbGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7CisgICAgICAgIG1fc2VsZWN0ZWRJ
bmRleCA9IC0xOworICAgICAgICBtX3BvcHVwQ2xpZW50LT5zZWxlY3Rpb25DbGVhcmVkKCk7Cisg
ICAgfQorfQorCit2b2lkIFBvcHVwTGlzdEJveDo6c2VsZWN0TmV4dFJvdygpCit7CisgICAgaWYg
KCFtX3NldHRpbmdzLmxvb3BTZWxlY3Rpb25OYXZpZ2F0aW9uIHx8IG1fc2VsZWN0ZWRJbmRleCAh
PSBudW1JdGVtcygpIC0gMSkgeworICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KDEpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgYXJlIG1vdmluZyBwYXN0IHRoZSBsYXN0
IGl0ZW0sIG5vIHJvdyBzaG91bGQgYmUgc2VsZWN0ZWQuCisgICAgY2xlYXJTZWxlY3Rpb24oKTsK
K30KKwordm9pZCBQb3B1cExpc3RCb3g6OnNlbGVjdFByZXZpb3VzUm93KCkKK3sKKyAgICBpZiAo
IW1fc2V0dGluZ3MubG9vcFNlbGVjdGlvbk5hdmlnYXRpb24gfHwgbV9zZWxlY3RlZEluZGV4ID4g
MCkgeworICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KC0xKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIGlmICghbV9zZWxlY3RlZEluZGV4KSB7CisgICAgICAgIC8vIFdlIGFyZSBt
b3ZpbmcgcGFzdCB0aGUgZmlyc3QgaXRlbSwgY2xlYXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgICAg
Y2xlYXJTZWxlY3Rpb24oKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vIHJv
dyBpcyBzZWxlY3RlZCwganVtcCB0byB0aGUgbGFzdCBpdGVtLgorICAgIHNlbGVjdEluZGV4KG51
bUl0ZW1zKCkgLSAxKTsKKyAgICBzY3JvbGxUb1JldmVhbFNlbGVjdGlvbigpOworfQorCit2b2lk
IFBvcHVwTGlzdEJveDo6YWRqdXN0U2VsZWN0ZWRJbmRleChpbnQgZGVsdGEpCit7CisgICAgaW50
IHRhcmdldEluZGV4ID0gbV9zZWxlY3RlZEluZGV4ICsgZGVsdGE7CisgICAgdGFyZ2V0SW5kZXgg
PSBtaW4obWF4KHRhcmdldEluZGV4LCAwKSwgbnVtSXRlbXMoKSAtIDEpOworICAgIGlmICghaXNT
ZWxlY3RhYmxlSXRlbSh0YXJnZXRJbmRleCkpIHsKKyAgICAgICAgLy8gV2UgZGlkbid0IGxhbmQg
b24gYW4gb3B0aW9uLiBUcnkgdG8gZmluZCBvbmUuCisgICAgICAgIC8vIFdlIHRyeSB0byBzZWxl
Y3QgdGhlIGNsb3Nlc3QgaW5kZXggdG8gdGFyZ2V0LCBwcmlvcml0aXppbmcgYW55IGluCisgICAg
ICAgIC8vIHRoZSByYW5nZSBbY3VycmVudCwgdGFyZ2V0XS4KKworICAgICAgICBpbnQgZGlyID0g
ZGVsdGEgPiAwID8gMSA6IC0xOworICAgICAgICBpbnQgdGVzdEluZGV4ID0gbV9zZWxlY3RlZElu
ZGV4OworICAgICAgICBpbnQgYmVzdEluZGV4ID0gbV9zZWxlY3RlZEluZGV4OworICAgICAgICBi
b29sIHBhc3NlZFRhcmdldCA9IGZhbHNlOworICAgICAgICB3aGlsZSAodGVzdEluZGV4ID49IDAg
JiYgdGVzdEluZGV4IDwgbnVtSXRlbXMoKSkgeworICAgICAgICAgICAgaWYgKGlzU2VsZWN0YWJs
ZUl0ZW0odGVzdEluZGV4KSkKKyAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSB0ZXN0SW5kZXg7
CisgICAgICAgICAgICBpZiAodGVzdEluZGV4ID09IHRhcmdldEluZGV4KQorICAgICAgICAgICAg
ICAgIHBhc3NlZFRhcmdldCA9IHRydWU7CisgICAgICAgICAgICBpZiAocGFzc2VkVGFyZ2V0ICYm
IGJlc3RJbmRleCAhPSBtX3NlbGVjdGVkSW5kZXgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisK
KyAgICAgICAgICAgIHRlc3RJbmRleCArPSBkaXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBQ
aWNrIHRoZSBiZXN0IGluZGV4LCB3aGljaCBtYXkgbWVhbiB3ZSBkb24ndCBjaGFuZ2UuCisgICAg
ICAgIHRhcmdldEluZGV4ID0gYmVzdEluZGV4OworICAgIH0KKworICAgIC8vIFNlbGVjdCB0aGUg
bmV3IGluZGV4LCBhbmQgZW5zdXJlIGl0cyB2aXNpYmxlLiBXZSBkbyB0aGlzIHJlZ2FyZGxlc3Mg
b2YKKyAgICAvLyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlZCB0byBlbnN1cmUga2V5Ym9h
cmQgZXZlbnRzIGFsd2F5cyBicmluZyB0aGUKKyAgICAvLyBzZWxlY3Rpb24gaW50byB2aWV3Lgor
ICAgIHNlbGVjdEluZGV4KHRhcmdldEluZGV4KTsKKyAgICBzY3JvbGxUb1JldmVhbFNlbGVjdGlv
bigpOworfQorCit2b2lkIFBvcHVwTGlzdEJveDo6aGlkZVBvcHVwKCkKK3sKKyAgICBpZiAocGFy
ZW50KCkpIHsKKyAgICAgICAgUG9wdXBDb250YWluZXIqIGNvbnRhaW5lciA9IHN0YXRpY19jYXN0
PFBvcHVwQ29udGFpbmVyKj4ocGFyZW50KCkpOworICAgICAgICBpZiAoY29udGFpbmVyLT5jbGll
bnQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5lci0+Y2xpZW50KCktPnBvcHVwQ2xvc2VkKGNvbnRh
aW5lcik7CisgICAgICAgIGNvbnRhaW5lci0+bm90aWZ5UG9wdXBIaWRkZW4oKTsKKyAgICB9CisK
KyAgICBpZiAobV9wb3B1cENsaWVudCkKKyAgICAgICAgbV9wb3B1cENsaWVudC0+cG9wdXBEaWRI
aWRlKCk7Cit9CisKK3ZvaWQgUG9wdXBMaXN0Qm94Ojp1cGRhdGVGcm9tRWxlbWVudCgpCit7Cisg
ICAgY2xlYXIoKTsKKworICAgIGludCBzaXplID0gbV9wb3B1cENsaWVudC0+bGlzdFNpemUoKTsK
KyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBQb3B1cEl0ZW06
OlR5cGUgdHlwZTsKKyAgICAgICAgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1Jc1NlcGFyYXRvcihp
KSkKKyAgICAgICAgICAgIHR5cGUgPSBQb3B1cEl0ZW06OlR5cGVTZXBhcmF0b3I7CisgICAgICAg
IGVsc2UgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1Jc0xhYmVsKGkpKQorICAgICAgICAgICAgdHlw
ZSA9IFBvcHVwSXRlbTo6VHlwZUdyb3VwOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0eXBl
ID0gUG9wdXBJdGVtOjpUeXBlT3B0aW9uOworICAgICAgICBtX2l0ZW1zLmFwcGVuZChuZXcgUG9w
dXBJdGVtKG1fcG9wdXBDbGllbnQtPml0ZW1UZXh0KGkpLCB0eXBlKSk7CisgICAgICAgIG1faXRl
bXNbaV0tPmVuYWJsZWQgPSBpc1NlbGVjdGFibGVJdGVtKGkpOworICAgICAgICBQb3B1cE1lbnVT
dHlsZSBzdHlsZSA9IG1fcG9wdXBDbGllbnQtPml0ZW1TdHlsZShpKTsKKyAgICAgICAgbV9pdGVt
c1tpXS0+dGV4dERpcmVjdGlvbiA9IHN0eWxlLnRleHREaXJlY3Rpb24oKTsKKyAgICAgICAgbV9p
dGVtc1tpXS0+aGFzVGV4dERpcmVjdGlvbk92ZXJyaWRlID0gc3R5bGUuaGFzVGV4dERpcmVjdGlv
bk92ZXJyaWRlKCk7CisgICAgfQorCisgICAgbV9zZWxlY3RlZEluZGV4ID0gbV9wb3B1cENsaWVu
dC0+c2VsZWN0ZWRJbmRleCgpOworICAgIHNldE9yaWdpbmFsSW5kZXgobV9zZWxlY3RlZEluZGV4
KTsKKworICAgIGxheW91dCgpOworfQorCit2b2lkIFBvcHVwTGlzdEJveDo6c2V0TWF4V2lkdGhB
bmRMYXlvdXQoaW50IG1heFdpZHRoKQoreworICAgIG1fbWF4V2luZG93V2lkdGggPSBtYXhXaWR0
aDsKKyAgICBsYXlvdXQoKTsKK30KKwordm9pZCBQb3B1cExpc3RCb3g6OmxheW91dCgpCit7Cisg
ICAgYm9vbCBpc1JpZ2h0QWxpZ25lZCA9IG1fcG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpLnRleHRE
aXJlY3Rpb24oKSA9PSBSVEw7CisKKyAgICAvLyBTaXplIG91ciBjaGlsZCBpdGVtcy4KKyAgICBp
bnQgYmFzZVdpZHRoID0gMDsKKyAgICBpbnQgcGFkZGluZ1dpZHRoID0gMDsKKyAgICBpbnQgbGlu
ZUVuZFBhZGRpbmdXaWR0aCA9IDA7CisgICAgaW50IHkgPSAwOworICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbnVtSXRlbXMoKTsgKytpKSB7CisgICAgICAgIC8vIFBsYWNlIHRoZSBpdGVtIHZlcnRp
Y2FsbHkuCisgICAgICAgIG1faXRlbXNbaV0tPnlPZmZzZXQgPSB5OworICAgICAgICBpZiAobV9w
b3B1cENsaWVudC0+aXRlbVN0eWxlKGkpLmlzRGlzcGxheU5vbmUoKSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICB5ICs9IGdldFJvd0hlaWdodChpKTsKKworICAgICAgICAvLyBFbnN1
cmUgdGhlIHBvcHVwIGlzIHdpZGUgZW5vdWdoIHRvIGZpdCB0aGlzIGl0ZW0uCisgICAgICAgIEZv
bnQgaXRlbUZvbnQgPSBnZXRSb3dGb250KGkpOworICAgICAgICBTdHJpbmcgdGV4dCA9IG1fcG9w
dXBDbGllbnQtPml0ZW1UZXh0KGkpOworICAgICAgICBTdHJpbmcgbGFiZWwgPSBtX3BvcHVwQ2xp
ZW50LT5pdGVtTGFiZWwoaSk7CisgICAgICAgIFN0cmluZyBpY29uID0gbV9wb3B1cENsaWVudC0+
aXRlbUljb24oaSk7CisgICAgICAgIFJlZlB0cjxJbWFnZT4gaWNvbkltYWdlKEltYWdlOjpsb2Fk
UGxhdGZvcm1SZXNvdXJjZShpY29uLnV0ZjgoKS5kYXRhKCkpKTsKKyAgICAgICAgaW50IHdpZHRo
ID0gMDsKKyAgICAgICAgaWYgKCF0ZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHdpZHRoID0g
aXRlbUZvbnQud2lkdGgoVGV4dFJ1bih0ZXh0KSk7CisgICAgICAgIGlmICghbGFiZWwuaXNFbXB0
eSgpKSB7CisgICAgICAgICAgICBpZiAod2lkdGggPiAwKQorICAgICAgICAgICAgICAgIHdpZHRo
ICs9IGtUZXh0VG9MYWJlbFBhZGRpbmc7CisgICAgICAgICAgICB3aWR0aCArPSBpdGVtRm9udC53
aWR0aChUZXh0UnVuKGxhYmVsKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGljb25JbWFnZSAm
JiAhaWNvbkltYWdlLT5pc051bGwoKSkgeworICAgICAgICAgICAgaWYgKHdpZHRoID4gMCkKKyAg
ICAgICAgICAgICAgICB3aWR0aCArPSBrTGFiZWxUb0ljb25QYWRkaW5nOworICAgICAgICAgICAg
d2lkdGggKz0gaWNvbkltYWdlLT5yZWN0KCkud2lkdGgoKTsKKyAgICAgICAgfQorCisgICAgICAg
IGJhc2VXaWR0aCA9IG1heChiYXNlV2lkdGgsIHdpZHRoKTsKKyAgICAgICAgLy8gRklYTUU6IGh0
dHA6Ly9iLzEyMTA0ODEgV2Ugc2hvdWxkIGdldCB0aGUgcGFkZGluZyBvZiBpbmRpdmlkdWFsIG9w
dGlvbiBlbGVtZW50cy4KKyAgICAgICAgcGFkZGluZ1dpZHRoID0gbWF4KHBhZGRpbmdXaWR0aCwK
KyAgICAgICAgICAgIG1fcG9wdXBDbGllbnQtPmNsaWVudFBhZGRpbmdMZWZ0KCkgKyBtX3BvcHVw
Q2xpZW50LT5jbGllbnRQYWRkaW5nUmlnaHQoKSk7CisgICAgICAgIGxpbmVFbmRQYWRkaW5nV2lk
dGggPSBtYXgobGluZUVuZFBhZGRpbmdXaWR0aCwKKyAgICAgICAgICAgIGlzUmlnaHRBbGlnbmVk
ID8gbV9wb3B1cENsaWVudC0+Y2xpZW50UGFkZGluZ0xlZnQoKSA6IG1fcG9wdXBDbGllbnQtPmNs
aWVudFBhZGRpbmdSaWdodCgpKTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIGJh
ciB3aWR0aC4KKyAgICBpbnQgd2luZG93SGVpZ2h0ID0gMDsKKyAgICBtX3Zpc2libGVSb3dzID0g
bWluKG51bUl0ZW1zKCksIGtNYXhWaXNpYmxlUm93cyk7CisKKyAgICBmb3IgKGludCBpID0gMDsg
aSA8IG1fdmlzaWJsZVJvd3M7ICsraSkgeworICAgICAgICBpbnQgcm93SGVpZ2h0ID0gZ2V0Um93
SGVpZ2h0KGkpOworCisgICAgICAgIC8vIE9ubHkgY2xpcCB0aGUgd2luZG93IGhlaWdodCBmb3Ig
bm9uLU1hYyBwbGF0Zm9ybXMuCisgICAgICAgIGlmICh3aW5kb3dIZWlnaHQgKyByb3dIZWlnaHQg
PiBtX21heEhlaWdodCkgeworICAgICAgICAgICAgbV92aXNpYmxlUm93cyA9IGk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHdpbmRvd0hlaWdodCArPSByb3dIZWln
aHQ7CisgICAgfQorCisgICAgLy8gU2V0IG91ciB3aWRnZXQgYW5kIHNjcm9sbGFibGUgY29udGVu
dHMgc2l6ZXMuCisgICAgaW50IHNjcm9sbGJhcldpZHRoID0gMDsKKyAgICBpZiAobV92aXNpYmxl
Um93cyA8IG51bUl0ZW1zKCkpIHsKKyAgICAgICAgc2Nyb2xsYmFyV2lkdGggPSBTY3JvbGxiYXJU
aGVtZTo6bmF0aXZlVGhlbWUoKS0+c2Nyb2xsYmFyVGhpY2tuZXNzKCk7CisKKyAgICAgICAgLy8g
VXNlIGtNaW5FbmRPZkxpbmVQYWRkaW5nIHdoZW4gdGhlcmUgaXMgYSBzY3JvbGxiYXIgc28gdGhh
dCB3ZSB1c2UKKyAgICAgICAgLy8gYXMgbXVjaCBhcyAobGluZUVuZFBhZGRpbmdXaWR0aCAtIGtN
aW5FbmRPZkxpbmVQYWRkaW5nKSBwYWRkaW5nCisgICAgICAgIC8vIHNwYWNlIGZvciBzY3JvbGxi
YXIgYW5kIGFsbG93IHVzZXIgdG8gdXNlIENTUyBwYWRkaW5nIHRvIG1ha2UgdGhlCisgICAgICAg
IC8vIHBvcHVwIGxpc3Rib3ggYWxpZ24gd2l0aCB0aGUgc2VsZWN0IGVsZW1lbnQuCisgICAgICAg
IHBhZGRpbmdXaWR0aCA9IHBhZGRpbmdXaWR0aCAtIGxpbmVFbmRQYWRkaW5nV2lkdGggKyBrTWlu
RW5kT2ZMaW5lUGFkZGluZzsKKyAgICB9CisKKyAgICBpbnQgd2luZG93V2lkdGg7CisgICAgaW50
IGNvbnRlbnRXaWR0aDsKKyAgICBpZiAobV9zZXR0aW5ncy5yZXN0cmljdFdpZHRoT2ZMaXN0Qm94
KSB7CisgICAgICAgIHdpbmRvd1dpZHRoID0gbV9iYXNlV2lkdGg7CisgICAgICAgIGNvbnRlbnRX
aWR0aCA9IG1fYmFzZVdpZHRoIC0gc2Nyb2xsYmFyV2lkdGg7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgd2luZG93V2lkdGggPSBiYXNlV2lkdGggKyBzY3JvbGxiYXJXaWR0aCArIHBhZGRpbmdXaWR0
aDsKKyAgICAgICAgaWYgKHdpbmRvd1dpZHRoID4gbV9tYXhXaW5kb3dXaWR0aCkgeworICAgICAg
ICAgICAgLy8gd2luZG93V2lkdGggZXhjZWVkcyBtX21heFdpbmRvd1dpZHRoLCBzbyB3ZSBoYXZl
IHRvIGNsaXAuCisgICAgICAgICAgICB3aW5kb3dXaWR0aCA9IG1fbWF4V2luZG93V2lkdGg7Cisg
ICAgICAgICAgICBiYXNlV2lkdGggPSB3aW5kb3dXaWR0aCAtIHNjcm9sbGJhcldpZHRoIC0gcGFk
ZGluZ1dpZHRoOworICAgICAgICAgICAgbV9iYXNlV2lkdGggPSBiYXNlV2lkdGg7CisgICAgICAg
IH0KKyAgICAgICAgY29udGVudFdpZHRoID0gd2luZG93V2lkdGggLSBzY3JvbGxiYXJXaWR0aDsK
KworICAgICAgICBpZiAod2luZG93V2lkdGggPCBtX2Jhc2VXaWR0aCkgeworICAgICAgICAgICAg
d2luZG93V2lkdGggPSBtX2Jhc2VXaWR0aDsKKyAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IG1f
YmFzZVdpZHRoIC0gc2Nyb2xsYmFyV2lkdGg7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAg
bV9iYXNlV2lkdGggPSBiYXNlV2lkdGg7CisgICAgfQorCisgICAgcmVzaXplKHdpbmRvd1dpZHRo
LCB3aW5kb3dIZWlnaHQpOworICAgIHNldENvbnRlbnRzU2l6ZShJbnRTaXplKGNvbnRlbnRXaWR0
aCwgZ2V0Um93Qm91bmRzKG51bUl0ZW1zKCkgLSAxKS5tYXhZKCkpKTsKKworICAgIGlmIChob3N0
V2luZG93KCkpCisgICAgICAgIHNjcm9sbFRvUmV2ZWFsU2VsZWN0aW9uKCk7CisKKyAgICBpbnZh
bGlkYXRlKCk7Cit9CisKK3ZvaWQgUG9wdXBMaXN0Qm94OjpjbGVhcigpCit7CisgICAgZm9yIChW
ZWN0b3I8UG9wdXBJdGVtKj46Oml0ZXJhdG9yIGl0ID0gbV9pdGVtcy5iZWdpbigpOyBpdCAhPSBt
X2l0ZW1zLmVuZCgpOyArK2l0KQorICAgICAgICBkZWxldGUgKml0OworICAgIG1faXRlbXMuY2xl
YXIoKTsKK30KKworYm9vbCBQb3B1cExpc3RCb3g6OmlzUG9pbnRJbkJvdW5kcyhjb25zdCBJbnRQ
b2ludCYgcG9pbnQpCit7CisgICAgcmV0dXJuIG51bUl0ZW1zKCkgJiYgSW50UmVjdCgwLCAwLCB3
aWR0aCgpLCBoZWlnaHQoKSkuY29udGFpbnMocG9pbnQpOworfQorCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1
cExpc3RCb3guaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwTGlzdEJv
eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjRjZWMzYTQxYWU3MDUxYTYwMTkwOWYxYTAxNTlmNjk2MmExYjFlNDYK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1
cExpc3RCb3guaApAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICog
TmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICog
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0
dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBQb3B1cExpc3RCb3hfaAorI2RlZmlu
ZSBQb3B1cExpc3RCb3hfaAorCisjaW5jbHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIkZvbnRTZWxl
Y3Rvci5oIgorI2luY2x1ZGUgIkZyYW1lbGVzc1Njcm9sbFZpZXcuaCIKKyNpbmNsdWRlICJJbnRS
ZWN0LmgiCisjaW5jbHVkZSAiTm9kZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3R5cGVk
ZWYgdW5zaWduZWQgbG9uZyBsb25nIFRpbWVTdGFtcDsKKworc3RhdGljIGNvbnN0IGludCBrTGFi
ZWxUb0ljb25QYWRkaW5nID0gNTsKK3N0YXRpYyBjb25zdCBpbnQga0xpbmVQYWRkaW5nSGVpZ2h0
ID0gMzsgLy8gUGFkZGluZyBoZWlnaHQgcHV0IGF0IHRoZSB0b3AgYW5kIGJvdHRvbSBvZiBlYWNo
IGxpbmUuCitzdGF0aWMgY29uc3QgaW50IGtNYXhIZWlnaHQgPSA1MDA7CitzdGF0aWMgY29uc3Qg
aW50IGtNYXhWaXNpYmxlUm93cyA9IDIwOworc3RhdGljIGNvbnN0IGludCBrTWluRW5kT2ZMaW5l
UGFkZGluZyA9IDI7CitzdGF0aWMgY29uc3QgaW50IGtUZXh0VG9MYWJlbFBhZGRpbmcgPSAxMDsK
K3N0YXRpYyBjb25zdCBUaW1lU3RhbXAga1R5cGVBaGVhZFRpbWVvdXRNcyA9IDEwMDA7CisKK2Ns
YXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNzIFBsYXRmb3JtS2V5Ym9hcmRFdmVudDsKK2NsYXNz
IFBsYXRmb3JtTW91c2VFdmVudDsKKyNpZiBFTkFCTEUoR0VTVFVSRV9FVkVOVFMpCitjbGFzcyBQ
bGF0Zm9ybUdlc3R1cmVFdmVudDsKKyNlbmRpZgorI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCitj
bGFzcyBQbGF0Zm9ybVRvdWNoRXZlbnQ7CisjZW5kaWYKK2NsYXNzIFBsYXRmb3JtV2hlZWxFdmVu
dDsKK2NsYXNzIFBvcHVwTWVudUNsaWVudDsKKworc3RydWN0IFBvcHVwQ29udGFpbmVyU2V0dGlu
Z3MgeworICAgIC8vIFdoZXRoZXIgdGhlIFBvcHVwTWVudUNsaWVudCBzaG91bGQgYmUgdG9sZCB0
byBjaGFuZ2UgaXRzIHRleHQgd2hlbiBhCisgICAgLy8gbmV3IGl0ZW0gaXMgc2VsZWN0ZWQgYnkg
dXNpbmcgdGhlIGFycm93IGtleXMuCisgICAgYm9vbCBzZXRUZXh0T25JbmRleENoYW5nZTsKKwor
ICAgIC8vIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgd2hlbiB0aGUg
cG9wdXAgbWVudSBpcworICAgIC8vIGNsb3NlZCAodGhyb3VnaCBFU0MgYmVpbmcgcHJlc3NlZCBv
ciB0aGUgZm9jdXMgZ29pbmcgYXdheSkuCisgICAgLy8gTm90ZSB0aGF0IHdoZW4gVEFCIGlzIHBy
ZXNzZWQsIHRoZSBzZWxlY3Rpb24gaXMgYWx3YXlzIGFjY2VwdGVkCisgICAgLy8gcmVnYXJkbGVz
cyBvZiB0aGlzIHNldHRpbmcuCisgICAgYm9vbCBhY2NlcHRPbkFiYW5kb247CisKKyAgICAvLyBX
aGV0aGVyIHdlIHNob3VsZCBtb3ZlIHRoZSBzZWxlY3Rpb24gdG8gdGhlIGZpcnN0L2xhc3QgaXRl
bSB3aGVuCisgICAgLy8gdGhlIHVzZXIgcHJlc3NlcyBkb3duL3VwIGFycm93IGtleXMgYW5kIHRo
ZSBsYXN0L2ZpcnN0IGl0ZW0gaXMKKyAgICAvLyBzZWxlY3RlZC4KKyAgICBib29sIGxvb3BTZWxl
Y3Rpb25OYXZpZ2F0aW9uOworCisgICAgLy8gV2hldGhlciB3ZSBzaG91bGQgcmVzdHJpY3QgdGhl
IHdpZHRoIG9mIHRoZSBQb3B1cExpc3RCb3ggb3Igbm90LgorICAgIC8vIEF1dG9jb21wbGV0ZSBw
b3B1cHMgYXJlIHJlc3RyaWN0ZWQsIGNvbWJvLWJveGVzIChzZWxlY3QgdGFncykgYXJlbid0Lgor
ICAgIGJvb2wgcmVzdHJpY3RXaWR0aE9mTGlzdEJveDsKK307CisKKy8vIEEgY29udGFpbmVyIGZv
ciB0aGUgZGF0YSBmb3IgZWFjaCBtZW51IGl0ZW0gKGUuZy4gcmVwcmVzZW50ZWQgYnkgPG9wdGlv
bj4KKy8vIG9yIDxvcHRncm91cD4gaW4gYSA8c2VsZWN0PiB3aWRnZXQpIGFuZCBpcyB1c2VkIGJ5
IFBvcHVwTGlzdEJveC4KK3N0cnVjdCBQb3B1cEl0ZW0geworICAgIGVudW0gVHlwZSB7CisgICAg
ICAgIFR5cGVPcHRpb24sCisgICAgICAgIFR5cGVHcm91cCwKKyAgICAgICAgVHlwZVNlcGFyYXRv
cgorICAgIH07CisKKyAgICBQb3B1cEl0ZW0oY29uc3QgU3RyaW5nJiBsYWJlbCwgVHlwZSB0eXBl
KQorICAgICAgICA6IGxhYmVsKGxhYmVsKQorICAgICAgICAsIHR5cGUodHlwZSkKKyAgICAgICAg
LCB5T2Zmc2V0KDApCisgICAgeworICAgIH0KKyAgICBTdHJpbmcgbGFiZWw7CisgICAgVHlwZSB0
eXBlOworICAgIGludCB5T2Zmc2V0OyAvLyB5IG9mZnNldCBvZiB0aGlzIGl0ZW0sIHJlbGF0aXZl
IHRvIHRoZSB0b3Agb2YgdGhlIHBvcHVwLgorICAgIFRleHREaXJlY3Rpb24gdGV4dERpcmVjdGlv
bjsKKyAgICBib29sIGhhc1RleHREaXJlY3Rpb25PdmVycmlkZTsKKyAgICBib29sIGVuYWJsZWQ7
Cit9OworCisvLyBUaGlzIGNsYXNzIHVzZXMgV2ViQ29yZSBjb2RlIHRvIHBhaW50IGFuZCBoYW5k
bGUgZXZlbnRzIGZvciBhIGRyb3AtZG93biBsaXN0CisvLyBib3ggKCJjb21ib2JveCIgb24gV2lu
ZG93cykuCitjbGFzcyBQb3B1cExpc3RCb3ggOiBwdWJsaWMgRnJhbWVsZXNzU2Nyb2xsVmlldyB7
CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8UG9wdXBMaXN0Qm94PiBjcmVhdGUoUG9w
dXBNZW51Q2xpZW50KiBjbGllbnQsIGNvbnN0IFBvcHVwQ29udGFpbmVyU2V0dGluZ3MmIHNldHRp
bmdzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBQb3B1cExpc3RCb3goY2xp
ZW50LCBzZXR0aW5ncykpOworICAgIH0KKworICAgIC8vIEZyYW1lbGVzc1Njcm9sbFZpZXcKKyAg
ICB2aXJ0dWFsIHZvaWQgcGFpbnQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYpOwor
ICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZURvd25FdmVudChjb25zdCBQbGF0Zm9ybU1vdXNl
RXZlbnQmKTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxh
dGZvcm1Nb3VzZUV2ZW50Jik7CisgICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlUmVsZWFzZUV2
ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVX
aGVlbEV2ZW50KGNvbnN0IFBsYXRmb3JtV2hlZWxFdmVudCYpOworICAgIHZpcnR1YWwgYm9vbCBo
YW5kbGVLZXlFdmVudChjb25zdCBQbGF0Zm9ybUtleWJvYXJkRXZlbnQmKTsKKyNpZiBFTkFCTEUo
VE9VQ0hfRVZFTlRTKQorICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBs
YXRmb3JtVG91Y2hFdmVudCYpOworI2VuZGlmCisjaWYgRU5BQkxFKEdFU1RVUkVfUkVDT0dOSVpF
UikKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlR2VzdHVyZUV2ZW50KGNvbnN0IFBsYXRmb3JtR2Vz
dHVyZUV2ZW50Jik7CisjZW5kaWYKKworICAgIC8vIFNjcm9sbFZpZXcKKyAgICB2aXJ0dWFsIEhv
c3RXaW5kb3cqIGhvc3RXaW5kb3coKSBjb25zdDsKKworICAgIC8vIFBvcHVwTGlzdEJveCBtZXRo
b2RzCisKKyAgICAvLyBIaWRlcyB0aGUgcG9wdXAuCisgICAgdm9pZCBoaWRlUG9wdXAoKTsKKwor
ICAgIC8vIFVwZGF0ZXMgb3VyIGludGVybmFsIGxpc3QgdG8gbWF0Y2ggdGhlIGNsaWVudC4KKyAg
ICB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7CisKKyAgICAvLyBGcmVlcyBhbnkgYWxsb2NhdGVk
IHJlc291cmNlcyB1c2VkIGluIGEgcGFydGljdWxhciBwb3B1cCBzZXNzaW9uLgorICAgIHZvaWQg
Y2xlYXIoKTsKKworICAgIC8vIFNldHMgdGhlIGluZGV4IG9mIHRoZSBvcHRpb24gdGhhdCBpcyBk
aXNwbGF5ZWQgaW4gdGhlIDxzZWxlY3Q+IHdpZGdldCBpbiB0aGUgcGFnZQorICAgIHZvaWQgc2V0
T3JpZ2luYWxJbmRleChpbnQpOworCisgICAgLy8gR2V0cyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0g
dGhhdCB0aGUgdXNlciBpcyBjdXJyZW50bHkgbW91c2VkIG92ZXIgb3IgaGFzIHNlbGVjdGVkIHdp
dGgKKyAgICAvLyB0aGUga2V5Ym9hcmQuIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBvcmln
aW5hbCBpbmRleCwgc2luY2UgdGhlIHVzZXIgaGFzIG5vdCB5ZXQKKyAgICAvLyBhY2NlcHRlZCB0
aGlzIGlucHV0LgorICAgIGludCBzZWxlY3RlZEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9zZWxl
Y3RlZEluZGV4OyB9CisKKyAgICAvLyBNb3ZlcyBzZWxlY3Rpb24gZG93bi91cCB0aGUgZ2l2ZW4g
bnVtYmVyIG9mIGl0ZW1zLCBzY3JvbGxpbmcgaWYgbmVjZXNzYXJ5LgorICAgIC8vIFBvc2l0aXZl
IGlzIGRvd24uIFRoZSByZXN1bHRpbmcgaW5kZXggd2lsbCBiZSBjbGFtcGVkIHRvIHRoZSByYW5n
ZQorICAgIC8vIFswLCBudW1JdGVtcyksIGFuZCBub24tb3B0aW9uIGl0ZW1zIHdpbGwgYmUgc2tp
cHBlZC4KKyAgICB2b2lkIGFkanVzdFNlbGVjdGVkSW5kZXgoaW50IGRlbHRhKTsKKworICAgIC8v
IFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdC4KKyAgICBpbnQgbnVtSXRl
bXMoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG1faXRlbXMuc2l6ZSgpKTsgfQor
CisgICAgdm9pZCBzZXRCYXNlV2lkdGgoaW50IHdpZHRoKSB7IG1fYmFzZVdpZHRoID0gc3RkOjpt
aW4obV9tYXhXaW5kb3dXaWR0aCwgd2lkdGgpOyB9CisKKyAgICAvLyBDb21wdXRlcyB0aGUgc2l6
ZSBvZiB3aWRnZXQgYW5kIGNoaWxkcmVuLgorICAgIHZvaWQgbGF5b3V0KCk7CisKKyAgICAvLyBS
ZXR1cm5zIHdoZXRoZXIgdGhlIHBvcHVwIHdhbnRzIHRvIHByb2Nlc3MgZXZlbnRzIGZvciB0aGUg
cGFzc2VkIGtleS4KKyAgICBib29sIGlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkoaW50IGtleUNv
ZGUpOworCisgICAgLy8gR2V0cyB0aGUgaGVpZ2h0IG9mIGEgcm93LgorICAgIGludCBnZXRSb3dI
ZWlnaHQoaW50IGluZGV4KTsKKworICAgIHZvaWQgc2V0TWF4SGVpZ2h0KGludCBtYXhIZWlnaHQp
IHsgbV9tYXhIZWlnaHQgPSBtYXhIZWlnaHQ7IH0KKworICAgIHZvaWQgc2V0TWF4V2lkdGgoaW50
IG1heFdpZHRoKSB7IG1fbWF4V2luZG93V2lkdGggPSBtYXhXaWR0aDsgfQorCisgICAgdm9pZCBz
ZXRNYXhXaWR0aEFuZExheW91dChpbnQpOworCisgICAgdm9pZCBkaXNjb25uZWN0Q2xpZW50KCkg
eyBtX3BvcHVwQ2xpZW50ID0gMDsgfQorCisgICAgY29uc3QgVmVjdG9yPFBvcHVwSXRlbSo+JiBp
dGVtcygpIGNvbnN0IHsgcmV0dXJuIG1faXRlbXM7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQg
Y2xhc3MgUG9wdXBDb250YWluZXI7CisgICAgZnJpZW5kIGNsYXNzIFJlZkNvdW50ZWQ8UG9wdXBM
aXN0Qm94PjsKKworICAgIFBvcHVwTGlzdEJveChQb3B1cE1lbnVDbGllbnQqLCBjb25zdCBQb3B1
cENvbnRhaW5lclNldHRpbmdzJik7CisKKyAgICB+UG9wdXBMaXN0Qm94KCkKKyAgICB7CisgICAg
ICAgIGNsZWFyKCk7CisgICAgfQorCisgICAgLy8gQ2xvc2VzIHRoZSBwb3B1cAorICAgIHZvaWQg
YWJhbmRvbigpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3Rpb24gY2FuIGJl
IGNoYW5nZWQgdG8gaW5kZXguCisgICAgLy8gRGlzYWJsZWQgaXRlbXMsIG9yIGxhYmVscyBjYW5u
b3QgYmUgc2VsZWN0ZWQuCisgICAgYm9vbCBpc1NlbGVjdGFibGVJdGVtKGludCBpbmRleCk7CisK
KyAgICAvLyBTZWxlY3QgYW4gaW5kZXggaW4gdGhlIGxpc3QsIHNjcm9sbGluZyBpZiBuZWNlc3Nh
cnkuCisgICAgdm9pZCBzZWxlY3RJbmRleChpbnQgaW5kZXgpOworCisgICAgLy8gQWNjZXB0cyB0
aGUgc2VsZWN0ZWQgaW5kZXggYXMgdGhlIHZhbHVlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgPHNl
bGVjdD4gd2lkZ2V0IG9uCisgICAgLy8gdGhlIHdlYiBwYWdlLCBhbmQgY2xvc2VzIHRoZSBwb3B1
cC4gUmV0dXJucyB0cnVlIGlmIGluZGV4IGlzIGFjY2VwdGVkLgorICAgIGJvb2wgYWNjZXB0SW5k
ZXgoaW50IGluZGV4KTsKKworICAgIC8vIENsZWFycyB0aGUgc2VsZWN0aW9uIChzbyBubyByb3cg
YXBwZWFycyBzZWxlY3RlZCkuCisgICAgdm9pZCBjbGVhclNlbGVjdGlvbigpOworCisgICAgLy8g
U2Nyb2xscyB0byByZXZlYWwgdGhlIGdpdmVuIGluZGV4LgorICAgIHZvaWQgc2Nyb2xsVG9SZXZl
YWxSb3coaW50IGluZGV4KTsKKyAgICB2b2lkIHNjcm9sbFRvUmV2ZWFsU2VsZWN0aW9uKCkgeyBz
Y3JvbGxUb1JldmVhbFJvdyhtX3NlbGVjdGVkSW5kZXgpOyB9CisKKyAgICAvLyBJbnZhbGlkYXRl
cyB0aGUgcm93IGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICB2b2lkIGludmFsaWRhdGVSb3coaW50
IGluZGV4KTsKKworICAgIC8vIEdldCB0aGUgYm91bmRzIG9mIGEgcm93LgorICAgIEludFJlY3Qg
Z2V0Um93Qm91bmRzKGludCBpbmRleCk7CisKKyAgICAvLyBDb252ZXJ0cyBhIHBvaW50IHRvIGFu
IGluZGV4IG9mIHRoZSByb3cgdGhlIHBvaW50IGlzIG92ZXIKKyAgICBpbnQgcG9pbnRUb1Jvd0lu
ZGV4KGNvbnN0IEludFBvaW50Jik7CisKKyAgICAvLyBQYWludCBhbiBpbmRpdmlkdWFsIHJvdwor
ICAgIHZvaWQgcGFpbnRSb3coR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYsIGludCBy
b3dJbmRleCk7CisKKyAgICAvLyBUZXN0IGlmIHRoZSBnaXZlbiBwb2ludCBpcyB3aXRoaW4gdGhl
IGJvdW5kcyBvZiB0aGUgcG9wdXAgd2luZG93LgorICAgIGJvb2wgaXNQb2ludEluQm91bmRzKGNv
bnN0IEludFBvaW50Jik7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgdXNlciBwcmVzc2VzIGEg
dGV4dCBrZXkuIERvZXMgYSBwcmVmaXgtc2VhcmNoIG9mIHRoZSBpdGVtcy4KKyAgICB2b2lkIHR5
cGVBaGVhZEZpbmQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50Jik7CisKKyAgICAvLyBSZXR1
cm5zIHRoZSBmb250IHRvIHVzZSBmb3IgdGhlIGdpdmVuIHJvdworICAgIEZvbnQgZ2V0Um93Rm9u
dChpbnQgaW5kZXgpOworCisgICAgLy8gTW92ZXMgdGhlIHNlbGVjdGlvbiBkb3duL3VwIG9uZSBp
dGVtLCB0YWtpbmcgY2FyZSBvZiBsb29waW5nIGJhY2sgdG8gdGhlCisgICAgLy8gZmlyc3QvbGFz
dCBlbGVtZW50IGlmIG1fbG9vcFNlbGVjdGlvbk5hdmlnYXRpb24gaXMgdHJ1ZS4KKyAgICB2b2lk
IHNlbGVjdFByZXZpb3VzUm93KCk7CisgICAgdm9pZCBzZWxlY3ROZXh0Um93KCk7CisKKyAgICAv
LyBUaGUgc2V0dGluZ3MgdGhhdCBzcGVjaWZ5IHRoZSBiZWhhdmlvciBmb3IgdGhpcyBQb3B1cCB3
aW5kb3cuCisgICAgUG9wdXBDb250YWluZXJTZXR0aW5ncyBtX3NldHRpbmdzOworCisgICAgLy8g
VGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gbWFya2VkIGFzICJzZWxlY3RlZCIgLSBpLmUu
IGRpc3BsYXllZCBpbiB0aGUgd2lkZ2V0IG9uIHRoZQorICAgIC8vIHBhZ2UuCisgICAgaW50IG1f
b3JpZ2luYWxJbmRleDsKKworICAgIC8vIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRo
YXQgdGhlIHVzZXIgaXMgaG92ZXJlZCBvdmVyIG9yIGhhcyBzZWxlY3RlZCB1c2luZyB0aGUKKyAg
ICAvLyBrZXlib2FyZCBpbiB0aGUgbGlzdC4gVGhleSBoYXZlIG5vdCBjb25maXJtZWQgdGhpcyBz
ZWxlY3Rpb24gYnkgY2xpY2tpbmcgb3IgcHJlc3NpbmcKKyAgICAvLyBlbnRlciB5ZXQgaG93ZXZl
ci4KKyAgICBpbnQgbV9zZWxlY3RlZEluZGV4OworCisgICAgLy8gSWYgPj0gMCwgdGhpcyBpcyB0
aGUgaW5kZXggd2Ugc2hvdWxkIGFjY2VwdCBpZiB0aGUgcG9wdXAgaXMgImFiYW5kb25lZCIuCisg
ICAgLy8gVGhpcyBpcyB1c2VkIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uLCB3aGVyZSB3ZSB3YW50
IHRoZQorICAgIC8vIHNlbGVjdGlvbiB0byBjaGFuZ2UgaW1tZWRpYXRlbHksIGFuZCBpcyBvbmx5
IHVzZWQgaWYgdGhlIHNldHRpbmdzCisgICAgLy8gYWNjZXB0T25BYmFuZG9uIGZpZWxkIGlzIHRy
dWUuCisgICAgaW50IG1fYWNjZXB0ZWRJbmRleE9uQWJhbmRvbjsKKworICAgIC8vIFRoaXMgaXMg
dGhlIG51bWJlciBvZiByb3dzIHZpc2libGUgaW4gdGhlIHBvcHVwLiBUaGUgbWF4aW11bSBudW1i
ZXIgdmlzaWJsZSBhdCBhIHRpbWUgaXMKKyAgICAvLyBkZWZpbmVkIGFzIGJlaW5nIGtNYXhWaXNp
YmxlUm93cy4gRm9yIGEgc2Nyb2xsZWQgcG9wdXAsIHRoaXMgY2FuIGJlIHRob3VnaHQgb2YgYXMg
dGhlCisgICAgLy8gcGFnZSBzaXplIGluIGRhdGEgdW5pdHMuCisgICAgaW50IG1fdmlzaWJsZVJv
d3M7CisKKyAgICAvLyBPdXIgc3VnZ2VzdGVkIHdpZHRoLCBub3QgaW5jbHVkaW5nIHNjcm9sbGJh
ci4KKyAgICBpbnQgbV9iYXNlV2lkdGg7CisKKyAgICAvLyBUaGUgbWF4aW11bSBoZWlnaHQgd2Ug
Y2FuIGJlIHdpdGhvdXQgYmVpbmcgb2ZmLXNjcmVlbi4KKyAgICBpbnQgbV9tYXhIZWlnaHQ7CisK
KyAgICAvLyBBIGxpc3Qgb2YgdGhlIG9wdGlvbnMgY29udGFpbmVkIHdpdGhpbiB0aGUgPHNlbGVj
dD4KKyAgICBWZWN0b3I8UG9wdXBJdGVtKj4gbV9pdGVtczsKKworICAgIC8vIFRoZSA8c2VsZWN0
PiBQb3B1cE1lbnVDbGllbnQgdGhhdCBvcGVuZWQgdXMuCisgICAgUG9wdXBNZW51Q2xpZW50KiBt
X3BvcHVwQ2xpZW50OworCisgICAgLy8gVGhlIHNjcm9sbGJhciB3aGljaCBoYXMgbW91c2UgY2Fw
dHVyZS4gTW91c2UgZXZlbnRzIGdvIHN0cmFpZ2h0IHRvIHRoaXMKKyAgICAvLyBpZiBub3QgbnVs
bC4KKyAgICBSZWZQdHI8U2Nyb2xsYmFyPiBtX2NhcHR1cmluZ1Njcm9sbGJhcjsKKworICAgIC8v
IFRoZSBsYXN0IHNjcm9sbGJhciB0aGF0IHRoZSBtb3VzZSB3YXMgb3Zlci4gVXNlZCBmb3IgbW91
c2VvdmVyIGhpZ2hsaWdodHMuCisgICAgUmVmUHRyPFNjcm9sbGJhcj4gbV9sYXN0U2Nyb2xsYmFy
VW5kZXJNb3VzZTsKKworICAgIC8vIFRoZSBzdHJpbmcgdGhlIHVzZXIgaGFzIHR5cGVkIHNvIGZh
ciBpbnRvIHRoZSBwb3B1cC4gVXNlZCBmb3IgdHlwZUFoZWFkRmluZC4KKyAgICBTdHJpbmcgbV90
eXBlZFN0cmluZzsKKworICAgIC8vIFRoZSBjaGFyIHRoZSB1c2VyIGhhcyBoaXQgcmVwZWF0ZWRs
eS4gVXNlZCBmb3IgdHlwZUFoZWFkRmluZC4KKyAgICBVQ2hhciBtX3JlcGVhdGluZ0NoYXI7CisK
KyAgICAvLyBUaGUgbGFzdCB0aW1lIHRoZSB1c2VyIGhpdCBhIGtleS4gVXNlZCBmb3IgdHlwZUFo
ZWFkRmluZC4KKyAgICBUaW1lU3RhbXAgbV9sYXN0Q2hhclRpbWU7CisKKyAgICAvLyBJZiB3aWR0
aCBleGVlZHMgc2NyZWVuIHdpZHRoLCB3ZSBoYXZlIHRvIGNsaXAgaXQuCisgICAgaW50IG1fbWF4
V2luZG93V2lkdGg7CisKKyAgICAvLyBUbyBmb3J3YXJkIGxhc3QgbW91c2UgcmVsZWFzZSBldmVu
dC4KKyAgICBSZWZQdHI8Tm9kZT4gbV9mb2N1c2VkTm9kZTsKKworfTsKKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVtLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVtLmNwcAppbmRleCA0MzhhMjlhNTg2NTk2ZTNkOWIy
M2Q4ZmQ2MjM3NmZhYjNkYjE0MDQyLi4zYjJmMmFlOWZlMzQzMjhhYmNlZGIzZDk1YTE5ZjE4ZTUx
Mjk0YzIwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1
cE1lbnVDaHJvbWl1bS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0v
UG9wdXBNZW51Q2hyb21pdW0uY3BwCkBAIC0zMSw2MyArMzEsMTIgQEAKIAogI2luY2x1ZGUgImNv
bmZpZy5oIgogI2luY2x1ZGUgIlBvcHVwTWVudUNocm9taXVtLmgiCi0KLSNpbmNsdWRlICJDaHJv
bWUuaCIKLSNpbmNsdWRlICJDaHJvbWVDbGllbnRDaHJvbWl1bS5oIgotI2luY2x1ZGUgIkZvbnQu
aCIKLSNpbmNsdWRlICJGb250U2VsZWN0b3IuaCIKLSNpbmNsdWRlICJGcmFtZVZpZXcuaCIKLSNp
bmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1lbGVzc1Njcm9sbFZpZXcuaCIKLSNpbmNs
dWRlICJGcmFtZWxlc3NTY3JvbGxWaWV3Q2xpZW50LmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250
ZXh0LmgiCi0jaW5jbHVkZSAiSW50UmVjdC5oIgotI2luY2x1ZGUgIktleWJvYXJkQ29kZXMuaCIK
LSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1LZXlib2FyZEV2ZW50LmgiCi0j
aW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1TY3JlZW4u
aCIKLSNpbmNsdWRlICJQbGF0Zm9ybVdoZWVsRXZlbnQuaCIKLSNpbmNsdWRlICJQb3B1cE1lbnVD
bGllbnQuaCIKLSNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgotI2luY2x1ZGUgIlNjcm9sbGJhclRo
ZW1lLmgiCi0jaW5jbHVkZSAiU3RyaW5nVHJ1bmNhdG9yLmgiCi0jaW5jbHVkZSAiU3lzdGVtVGlt
ZS5oIgotI2luY2x1ZGUgIlRleHRSdW4uaCIKLSNpbmNsdWRlICJVc2VyR2VzdHVyZUluZGljYXRv
ci5oIgotI2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5oPgotI2luY2x1ZGUgPHd0Zi91bmljb2Rl
L0NoYXJhY3Rlck5hbWVzLmg+Ci0KLSNpZiBFTkFCTEUoR0VTVFVSRV9FVkVOVFMpCi0jaW5jbHVk
ZSAiUGxhdGZvcm1HZXN0dXJlRXZlbnQuaCIKLSNlbmRpZgotCi0jaWYgRU5BQkxFKFRPVUNIX0VW
RU5UUykKLSNpbmNsdWRlICJQbGF0Zm9ybVRvdWNoRXZlbnQuaCIKLSNlbmRpZgotCi11c2luZyBu
YW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIFdURjsKLXVzaW5nIG5hbWVzcGFjZSBVbmlj
b2RlOwotCi11c2luZyBzdGQ6Om1pbjsKLXVzaW5nIHN0ZDo6bWF4OworI2luY2x1ZGUgIlBvcHVw
Q29udGFpbmVyLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogaW50IFBvcHVwTWVudUNocm9t
aXVtOjpzX21pbmltdW1Sb3dIZWlnaHQgPSAwOwogCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9u
ZyBUaW1lU3RhbXA7Ci0KLXN0YXRpYyBjb25zdCBpbnQga01heFZpc2libGVSb3dzID0gMjA7Ci1z
dGF0aWMgY29uc3QgaW50IGtNYXhIZWlnaHQgPSA1MDA7Ci1zdGF0aWMgY29uc3QgaW50IGtCb3Jk
ZXJTaXplID0gMTsKLXN0YXRpYyBjb25zdCBpbnQga1RleHRUb0xhYmVsUGFkZGluZyA9IDEwOwot
c3RhdGljIGNvbnN0IGludCBrTGFiZWxUb0ljb25QYWRkaW5nID0gNTsKLXN0YXRpYyBjb25zdCBp
bnQga01pbkVuZE9mTGluZVBhZGRpbmcgPSAyOwotc3RhdGljIGNvbnN0IFRpbWVTdGFtcCBrVHlw
ZUFoZWFkVGltZW91dE1zID0gMTAwMDsKLXN0YXRpYyBjb25zdCBpbnQga0xpbmVQYWRkaW5nSGVp
Z2h0ID0gMzsgLy8gUGFkZGluZyBoZWlnaHQgcHV0IGF0IHRoZSB0b3AgYW5kIGJvdHRvbSBvZiBl
YWNoIGxpbmUuCi0KIC8vIFRoZSBzZXR0aW5ncyB1c2VkIGZvciB0aGUgZHJvcCBkb3duIG1lbnUu
CiAvLyBUaGlzIGlzIHRoZSBkZWxlZ2F0ZSB1c2VkIGlmIG5vbmUgaXMgcHJvdmlkZWQuCiBzdGF0
aWMgY29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyBkcm9wRG93blNldHRpbmdzID0gewpAQCAt
OTcsMTQ0OSArNDYsNiBAQCBzdGF0aWMgY29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyBkcm9w
RG93blNldHRpbmdzID0gewogICAgIGZhbHNlIC8vIHJlc3RyaWN0V2lkdGhPZkxpc3RCb3gKIH07
CiAKLS8vIFRoaXMgY2xhc3MgdXNlcyBXZWJDb3JlIGNvZGUgdG8gcGFpbnQgYW5kIGhhbmRsZSBl
dmVudHMgZm9yIGEgZHJvcC1kb3duIGxpc3QKLS8vIGJveCAoImNvbWJvYm94IiBvbiBXaW5kb3dz
KS4KLWNsYXNzIFBvcHVwTGlzdEJveCA6IHB1YmxpYyBGcmFtZWxlc3NTY3JvbGxWaWV3IHsKLXB1
YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxQb3B1cExpc3RCb3g+IGNyZWF0ZShQb3B1cE1l
bnVDbGllbnQqIGNsaWVudCwgY29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyYgc2V0dGluZ3Mp
Ci0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFBvcHVwTGlzdEJveChjbGllbnQs
IHNldHRpbmdzKSk7Ci0gICAgfQotCi0gICAgLy8gRnJhbWVsZXNzU2Nyb2xsVmlldwotICAgIHZp
cnR1YWwgdm9pZCBwYWludChHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAg
dmlydHVhbCBib29sIGhhbmRsZU1vdXNlRG93bkV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVu
dCYpOwotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZU1vdmVFdmVudChjb25zdCBQbGF0Zm9y
bU1vdXNlRXZlbnQmKTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VSZWxlYXNlRXZlbnQo
Y29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZVdoZWVs
RXZlbnQoY29uc3QgUGxhdGZvcm1XaGVlbEV2ZW50Jik7Ci0gICAgdmlydHVhbCBib29sIGhhbmRs
ZUtleUV2ZW50KGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYpOwotI2lmIEVOQUJMRShUT1VD
SF9FVkVOVFMpCi0gICAgdmlydHVhbCBib29sIGhhbmRsZVRvdWNoRXZlbnQoY29uc3QgUGxhdGZv
cm1Ub3VjaEV2ZW50Jik7Ci0jZW5kaWYKLSNpZiBFTkFCTEUoR0VTVFVSRV9SRUNPR05JWkVSKQot
ICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVHZXN0dXJlRXZlbnQoY29uc3QgUGxhdGZvcm1HZXN0dXJl
RXZlbnQmKTsKLSNlbmRpZgotCi0gICAgLy8gU2Nyb2xsVmlldwotICAgIHZpcnR1YWwgSG9zdFdp
bmRvdyogaG9zdFdpbmRvdygpIGNvbnN0OwotCi0gICAgLy8gUG9wdXBMaXN0Qm94IG1ldGhvZHMK
LQotICAgIC8vIEhpZGVzIHRoZSBwb3B1cC4KLSAgICB2b2lkIGhpZGVQb3B1cCgpOwotCi0gICAg
Ly8gVXBkYXRlcyBvdXIgaW50ZXJuYWwgbGlzdCB0byBtYXRjaCB0aGUgY2xpZW50LgotICAgIHZv
aWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLQotICAgIC8vIEZyZWVzIGFueSBhbGxvY2F0ZWQgcmVz
b3VyY2VzIHVzZWQgaW4gYSBwYXJ0aWN1bGFyIHBvcHVwIHNlc3Npb24uCi0gICAgdm9pZCBjbGVh
cigpOwotCi0gICAgLy8gU2V0cyB0aGUgaW5kZXggb2YgdGhlIG9wdGlvbiB0aGF0IGlzIGRpc3Bs
YXllZCBpbiB0aGUgPHNlbGVjdD4gd2lkZ2V0IGluIHRoZSBwYWdlCi0gICAgdm9pZCBzZXRPcmln
aW5hbEluZGV4KGludCBpbmRleCk7Ci0KLSAgICAvLyBHZXRzIHRoZSBpbmRleCBvZiB0aGUgaXRl
bSB0aGF0IHRoZSB1c2VyIGlzIGN1cnJlbnRseSBtb3VzZWQgb3ZlciBvciBoYXMgc2VsZWN0ZWQg
d2l0aAotICAgIC8vIHRoZSBrZXlib2FyZC4gVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG9y
aWdpbmFsIGluZGV4LCBzaW5jZSB0aGUgdXNlciBoYXMgbm90IHlldAotICAgIC8vIGFjY2VwdGVk
IHRoaXMgaW5wdXQuCi0gICAgaW50IHNlbGVjdGVkSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3Nl
bGVjdGVkSW5kZXg7IH0KLQotICAgIC8vIE1vdmVzIHNlbGVjdGlvbiBkb3duL3VwIHRoZSBnaXZl
biBudW1iZXIgb2YgaXRlbXMsIHNjcm9sbGluZyBpZiBuZWNlc3NhcnkuCi0gICAgLy8gUG9zaXRp
dmUgaXMgZG93bi4gIFRoZSByZXN1bHRpbmcgaW5kZXggd2lsbCBiZSBjbGFtcGVkIHRvIHRoZSBy
YW5nZQotICAgIC8vIFswLCBudW1JdGVtcyksIGFuZCBub24tb3B0aW9uIGl0ZW1zIHdpbGwgYmUg
c2tpcHBlZC4KLSAgICB2b2lkIGFkanVzdFNlbGVjdGVkSW5kZXgoaW50IGRlbHRhKTsKLQotICAg
IC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdC4KLSAgICBpbnQgbnVt
SXRlbXMoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG1faXRlbXMuc2l6ZSgpKTsg
fQotCi0gICAgdm9pZCBzZXRCYXNlV2lkdGgoaW50IHdpZHRoKSB7IG1fYmFzZVdpZHRoID0gbWlu
KG1fbWF4V2luZG93V2lkdGgsIHdpZHRoKTsgfQotCi0gICAgLy8gQ29tcHV0ZXMgdGhlIHNpemUg
b2Ygd2lkZ2V0IGFuZCBjaGlsZHJlbi4KLSAgICB2b2lkIGxheW91dCgpOwotCi0gICAgLy8gUmV0
dXJucyB3aGV0aGVyIHRoZSBwb3B1cCB3YW50cyB0byBwcm9jZXNzIGV2ZW50cyBmb3IgdGhlIHBh
c3NlZCBrZXkuCi0gICAgYm9vbCBpc0ludGVyZXN0ZWRJbkV2ZW50Rm9yS2V5KGludCBrZXlDb2Rl
KTsKLQotICAgIC8vIEdldHMgdGhlIGhlaWdodCBvZiBhIHJvdy4KLSAgICBpbnQgZ2V0Um93SGVp
Z2h0KGludCBpbmRleCk7Ci0KLSAgICB2b2lkIHNldE1heEhlaWdodChpbnQgbWF4SGVpZ2h0KSB7
IG1fbWF4SGVpZ2h0ID0gbWF4SGVpZ2h0OyB9Ci0KLSAgICB2b2lkIHNldE1heFdpZHRoKGludCBt
YXhXaWR0aCkgeyBtX21heFdpbmRvd1dpZHRoID0gbWF4V2lkdGg7IH0KLQotICAgIHZvaWQgc2V0
TWF4V2lkdGhBbmRMYXlvdXQoaW50KTsKLQotICAgIHZvaWQgZGlzY29ubmVjdENsaWVudCgpIHsg
bV9wb3B1cENsaWVudCA9IDA7IH0KLQotICAgIGNvbnN0IFZlY3RvcjxQb3B1cEl0ZW0qPiYgaXRl
bXMoKSBjb25zdCB7IHJldHVybiBtX2l0ZW1zOyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNs
YXNzIFBvcHVwQ29udGFpbmVyOwotICAgIGZyaWVuZCBjbGFzcyBSZWZDb3VudGVkPFBvcHVwTGlz
dEJveD47Ci0KLSAgICBQb3B1cExpc3RCb3goUG9wdXBNZW51Q2xpZW50KiBjbGllbnQsIGNvbnN0
IFBvcHVwQ29udGFpbmVyU2V0dGluZ3MmIHNldHRpbmdzKQotICAgICAgICA6IG1fc2V0dGluZ3Mo
c2V0dGluZ3MpCi0gICAgICAgICwgbV9vcmlnaW5hbEluZGV4KDApCi0gICAgICAgICwgbV9zZWxl
Y3RlZEluZGV4KDApCi0gICAgICAgICwgbV9hY2NlcHRlZEluZGV4T25BYmFuZG9uKC0xKQotICAg
ICAgICAsIG1fdmlzaWJsZVJvd3MoMCkKLSAgICAgICAgLCBtX2Jhc2VXaWR0aCgwKQotICAgICAg
ICAsIG1fbWF4SGVpZ2h0KGtNYXhIZWlnaHQpCi0gICAgICAgICwgbV9wb3B1cENsaWVudChjbGll
bnQpCi0gICAgICAgICwgbV9yZXBlYXRpbmdDaGFyKDApCi0gICAgICAgICwgbV9sYXN0Q2hhclRp
bWUoMCkKLSAgICAgICAgLCBtX21heFdpbmRvd1dpZHRoKG51bWVyaWNfbGltaXRzPGludD46Om1h
eCgpKQotICAgIHsKLSAgICAgICAgc2V0U2Nyb2xsYmFyTW9kZXMoU2Nyb2xsYmFyQWx3YXlzT2Zm
LCBTY3JvbGxiYXJBbHdheXNPZmYpOwotICAgIH0KLQotICAgIH5Qb3B1cExpc3RCb3goKQotICAg
IHsKLSAgICAgICAgY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvLyBDbG9zZXMgdGhlIHBvcHVwCi0g
ICAgdm9pZCBhYmFuZG9uKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdGlv
biBjYW4gYmUgY2hhbmdlZCB0byBpbmRleC4KLSAgICAvLyBEaXNhYmxlZCBpdGVtcywgb3IgbGFi
ZWxzIGNhbm5vdCBiZSBzZWxlY3RlZC4KLSAgICBib29sIGlzU2VsZWN0YWJsZUl0ZW0oaW50IGlu
ZGV4KTsKLQotICAgIC8vIFNlbGVjdCBhbiBpbmRleCBpbiB0aGUgbGlzdCwgc2Nyb2xsaW5nIGlm
IG5lY2Vzc2FyeS4KLSAgICB2b2lkIHNlbGVjdEluZGV4KGludCBpbmRleCk7Ci0KLSAgICAvLyBB
Y2NlcHRzIHRoZSBzZWxlY3RlZCBpbmRleCBhcyB0aGUgdmFsdWUgdG8gYmUgZGlzcGxheWVkIGlu
IHRoZSA8c2VsZWN0PiB3aWRnZXQgb24KLSAgICAvLyB0aGUgd2ViIHBhZ2UsIGFuZCBjbG9zZXMg
dGhlIHBvcHVwLiBSZXR1cm5zIHRydWUgaWYgaW5kZXggaXMgYWNjZXB0ZWQuCi0gICAgYm9vbCBh
Y2NlcHRJbmRleChpbnQgaW5kZXgpOwotCi0gICAgLy8gQ2xlYXJzIHRoZSBzZWxlY3Rpb24gKHNv
IG5vIHJvdyBhcHBlYXJzIHNlbGVjdGVkKS4KLSAgICB2b2lkIGNsZWFyU2VsZWN0aW9uKCk7Ci0K
LSAgICAvLyBTY3JvbGxzIHRvIHJldmVhbCB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgdm9pZCBzY3Jv
bGxUb1JldmVhbFJvdyhpbnQgaW5kZXgpOwotICAgIHZvaWQgc2Nyb2xsVG9SZXZlYWxTZWxlY3Rp
b24oKSB7IHNjcm9sbFRvUmV2ZWFsUm93KG1fc2VsZWN0ZWRJbmRleCk7IH0KLQotICAgIC8vIElu
dmFsaWRhdGVzIHRoZSByb3cgYXQgdGhlIGdpdmVuIGluZGV4LgotICAgIHZvaWQgaW52YWxpZGF0
ZVJvdyhpbnQgaW5kZXgpOwotCi0gICAgLy8gR2V0IHRoZSBib3VuZHMgb2YgYSByb3cuCi0gICAg
SW50UmVjdCBnZXRSb3dCb3VuZHMoaW50IGluZGV4KTsKLQotICAgIC8vIENvbnZlcnRzIGEgcG9p
bnQgdG8gYW4gaW5kZXggb2YgdGhlIHJvdyB0aGUgcG9pbnQgaXMgb3ZlcgotICAgIGludCBwb2lu
dFRvUm93SW5kZXgoY29uc3QgSW50UG9pbnQmKTsKLQotICAgIC8vIFBhaW50IGFuIGluZGl2aWR1
YWwgcm93Ci0gICAgdm9pZCBwYWludFJvdyhHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0
JiwgaW50IHJvd0luZGV4KTsKLQotICAgIC8vIFRlc3QgaWYgdGhlIGdpdmVuIHBvaW50IGlzIHdp
dGhpbiB0aGUgYm91bmRzIG9mIHRoZSBwb3B1cCB3aW5kb3cuCi0gICAgYm9vbCBpc1BvaW50SW5C
b3VuZHMoY29uc3QgSW50UG9pbnQmKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIHBy
ZXNzZXMgYSB0ZXh0IGtleS4gIERvZXMgYSBwcmVmaXgtc2VhcmNoIG9mIHRoZSBpdGVtcy4KLSAg
ICB2b2lkIHR5cGVBaGVhZEZpbmQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50Jik7Ci0KLSAg
ICAvLyBSZXR1cm5zIHRoZSBmb250IHRvIHVzZSBmb3IgdGhlIGdpdmVuIHJvdwotICAgIEZvbnQg
Z2V0Um93Rm9udChpbnQgaW5kZXgpOwotCi0gICAgLy8gTW92ZXMgdGhlIHNlbGVjdGlvbiBkb3du
L3VwIG9uZSBpdGVtLCB0YWtpbmcgY2FyZSBvZiBsb29waW5nIGJhY2sgdG8gdGhlCi0gICAgLy8g
Zmlyc3QvbGFzdCBlbGVtZW50IGlmIG1fbG9vcFNlbGVjdGlvbk5hdmlnYXRpb24gaXMgdHJ1ZS4K
LSAgICB2b2lkIHNlbGVjdFByZXZpb3VzUm93KCk7Ci0gICAgdm9pZCBzZWxlY3ROZXh0Um93KCk7
Ci0KLSAgICAvLyBUaGUgc2V0dGluZ3MgdGhhdCBzcGVjaWZ5IHRoZSBiZWhhdmlvciBmb3IgdGhp
cyBQb3B1cCB3aW5kb3cuCi0gICAgUG9wdXBDb250YWluZXJTZXR0aW5ncyBtX3NldHRpbmdzOwot
Ci0gICAgLy8gVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gbWFya2VkIGFzICJzZWxlY3Rl
ZCIgLSBpLmUuIGRpc3BsYXllZCBpbiB0aGUgd2lkZ2V0IG9uIHRoZQotICAgIC8vIHBhZ2UuCi0g
ICAgaW50IG1fb3JpZ2luYWxJbmRleDsKLQotICAgIC8vIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRo
ZSBpdGVtIHRoYXQgdGhlIHVzZXIgaXMgaG92ZXJlZCBvdmVyIG9yIGhhcyBzZWxlY3RlZCB1c2lu
ZyB0aGUKLSAgICAvLyBrZXlib2FyZCBpbiB0aGUgbGlzdC4gVGhleSBoYXZlIG5vdCBjb25maXJt
ZWQgdGhpcyBzZWxlY3Rpb24gYnkgY2xpY2tpbmcgb3IgcHJlc3NpbmcKLSAgICAvLyBlbnRlciB5
ZXQgaG93ZXZlci4KLSAgICBpbnQgbV9zZWxlY3RlZEluZGV4OwotCi0gICAgLy8gSWYgPj0gMCwg
dGhpcyBpcyB0aGUgaW5kZXggd2Ugc2hvdWxkIGFjY2VwdCBpZiB0aGUgcG9wdXAgaXMgImFiYW5k
b25lZCIuCi0gICAgLy8gVGhpcyBpcyB1c2VkIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uLCB3aGVy
ZSB3ZSB3YW50IHRoZQotICAgIC8vIHNlbGVjdGlvbiB0byBjaGFuZ2UgaW1tZWRpYXRlbHksIGFu
ZCBpcyBvbmx5IHVzZWQgaWYgdGhlIHNldHRpbmdzCi0gICAgLy8gYWNjZXB0T25BYmFuZG9uIGZp
ZWxkIGlzIHRydWUuCi0gICAgaW50IG1fYWNjZXB0ZWRJbmRleE9uQWJhbmRvbjsKLQotICAgIC8v
IFRoaXMgaXMgdGhlIG51bWJlciBvZiByb3dzIHZpc2libGUgaW4gdGhlIHBvcHVwLiBUaGUgbWF4
aW11bSBudW1iZXIgdmlzaWJsZSBhdCBhIHRpbWUgaXMKLSAgICAvLyBkZWZpbmVkIGFzIGJlaW5n
IGtNYXhWaXNpYmxlUm93cy4gRm9yIGEgc2Nyb2xsZWQgcG9wdXAsIHRoaXMgY2FuIGJlIHRob3Vn
aHQgb2YgYXMgdGhlCi0gICAgLy8gcGFnZSBzaXplIGluIGRhdGEgdW5pdHMuCi0gICAgaW50IG1f
dmlzaWJsZVJvd3M7Ci0KLSAgICAvLyBPdXIgc3VnZ2VzdGVkIHdpZHRoLCBub3QgaW5jbHVkaW5n
IHNjcm9sbGJhci4KLSAgICBpbnQgbV9iYXNlV2lkdGg7Ci0KLSAgICAvLyBUaGUgbWF4aW11bSBo
ZWlnaHQgd2UgY2FuIGJlIHdpdGhvdXQgYmVpbmcgb2ZmLXNjcmVlbi4KLSAgICBpbnQgbV9tYXhI
ZWlnaHQ7Ci0KLSAgICAvLyBBIGxpc3Qgb2YgdGhlIG9wdGlvbnMgY29udGFpbmVkIHdpdGhpbiB0
aGUgPHNlbGVjdD4KLSAgICBWZWN0b3I8UG9wdXBJdGVtKj4gbV9pdGVtczsKLQotICAgIC8vIFRo
ZSA8c2VsZWN0PiBQb3B1cE1lbnVDbGllbnQgdGhhdCBvcGVuZWQgdXMuCi0gICAgUG9wdXBNZW51
Q2xpZW50KiBtX3BvcHVwQ2xpZW50OwotCi0gICAgLy8gVGhlIHNjcm9sbGJhciB3aGljaCBoYXMg
bW91c2UgY2FwdHVyZS4gIE1vdXNlIGV2ZW50cyBnbyBzdHJhaWdodCB0byB0aGlzCi0gICAgLy8g
aWYgbm9uLU5VTEwuCi0gICAgUmVmUHRyPFNjcm9sbGJhcj4gbV9jYXB0dXJpbmdTY3JvbGxiYXI7
Ci0KLSAgICAvLyBUaGUgbGFzdCBzY3JvbGxiYXIgdGhhdCB0aGUgbW91c2Ugd2FzIG92ZXIuICBV
c2VkIGZvciBtb3VzZW92ZXIgaGlnaGxpZ2h0cy4KLSAgICBSZWZQdHI8U2Nyb2xsYmFyPiBtX2xh
c3RTY3JvbGxiYXJVbmRlck1vdXNlOwotCi0gICAgLy8gVGhlIHN0cmluZyB0aGUgdXNlciBoYXMg
dHlwZWQgc28gZmFyIGludG8gdGhlIHBvcHVwLiBVc2VkIGZvciB0eXBlQWhlYWRGaW5kLgotICAg
IFN0cmluZyBtX3R5cGVkU3RyaW5nOwotCi0gICAgLy8gVGhlIGNoYXIgdGhlIHVzZXIgaGFzIGhp
dCByZXBlYXRlZGx5LiAgVXNlZCBmb3IgdHlwZUFoZWFkRmluZC4KLSAgICBVQ2hhciBtX3JlcGVh
dGluZ0NoYXI7Ci0KLSAgICAvLyBUaGUgbGFzdCB0aW1lIHRoZSB1c2VyIGhpdCBhIGtleS4gIFVz
ZWQgZm9yIHR5cGVBaGVhZEZpbmQuCi0gICAgVGltZVN0YW1wIG1fbGFzdENoYXJUaW1lOwotCi0g
ICAgLy8gSWYgd2lkdGggZXhlZWRzIHNjcmVlbiB3aWR0aCwgd2UgaGF2ZSB0byBjbGlwIGl0Lgot
ICAgIGludCBtX21heFdpbmRvd1dpZHRoOwotCi0gICAgLy8gVG8gZm9yd2FyZCBsYXN0IG1vdXNl
IHJlbGVhc2UgZXZlbnQuCi0gICAgUmVmUHRyPE5vZGU+IG1fZm9jdXNlZE5vZGU7Ci19OwotCi1z
dGF0aWMgUGxhdGZvcm1Nb3VzZUV2ZW50IGNvbnN0cnVjdFJlbGF0aXZlTW91c2VFdmVudChjb25z
dCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBGcmFtZWxlc3NTY3JvbGxWaWV3KiBwYXJlbnQsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZWxl
c3NTY3JvbGxWaWV3KiBjaGlsZCkKLXsKLSAgICBJbnRQb2ludCBwb3MgPSBwYXJlbnQtPmNvbnZl
cnRTZWxmVG9DaGlsZChjaGlsZCwgZS5wb3MoKSk7Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBpcyBh
IGhvcnJpYmxlIGhhY2sgc2luY2UgUGxhdGZvcm1Nb3VzZUV2ZW50IGhhcyBubyBzZXR0ZXJzIGZv
ciB4L3kuCi0gICAgUGxhdGZvcm1Nb3VzZUV2ZW50IHJlbGF0aXZlRXZlbnQgPSBlOwotICAgIElu
dFBvaW50JiByZWxhdGl2ZVBvcyA9IGNvbnN0X2Nhc3Q8SW50UG9pbnQmPihyZWxhdGl2ZUV2ZW50
LnBvcygpKTsKLSAgICByZWxhdGl2ZVBvcy5zZXRYKHBvcy54KCkpOwotICAgIHJlbGF0aXZlUG9z
LnNldFkocG9zLnkoKSk7Ci0gICAgcmV0dXJuIHJlbGF0aXZlRXZlbnQ7Ci19Ci0KLXN0YXRpYyBQ
bGF0Zm9ybVdoZWVsRXZlbnQgY29uc3RydWN0UmVsYXRpdmVXaGVlbEV2ZW50KGNvbnN0IFBsYXRm
b3JtV2hlZWxFdmVudCYgZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEZyYW1lbGVzc1Njcm9sbFZpZXcqIHBhcmVudCwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lbGVzc1Njcm9s
bFZpZXcqIGNoaWxkKQotewotICAgIEludFBvaW50IHBvcyA9IHBhcmVudC0+Y29udmVydFNlbGZU
b0NoaWxkKGNoaWxkLCBlLnBvcygpKTsKLQotICAgIC8vIEZJWE1FOiBUaGlzIGlzIGEgaG9ycmli
bGUgaGFjayBzaW5jZSBQbGF0Zm9ybVdoZWVsRXZlbnQgaGFzIG5vIHNldHRlcnMgZm9yIHgveS4K
LSAgICBQbGF0Zm9ybVdoZWVsRXZlbnQgcmVsYXRpdmVFdmVudCA9IGU7Ci0gICAgSW50UG9pbnQm
IHJlbGF0aXZlUG9zID0gY29uc3RfY2FzdDxJbnRQb2ludCY+KHJlbGF0aXZlRXZlbnQucG9zKCkp
OwotICAgIHJlbGF0aXZlUG9zLnNldFgocG9zLngoKSk7Ci0gICAgcmVsYXRpdmVQb3Muc2V0WShw
b3MueSgpKTsKLSAgICByZXR1cm4gcmVsYXRpdmVFdmVudDsKLX0KLQotLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLwotLy8gUG9wdXBDb250YWluZXIgaW1wbGVtZW50YXRpb24KLQotLy8gc3RhdGljCi1Q
YXNzUmVmUHRyPFBvcHVwQ29udGFpbmVyPiBQb3B1cENvbnRhaW5lcjo6Y3JlYXRlKFBvcHVwTWVu
dUNsaWVudCogY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBQb3B1cFR5cGUgcG9wdXBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJiBz
ZXR0aW5ncykKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IFBvcHVwQ29udGFpbmVyKGNsaWVu
dCwgcG9wdXBUeXBlLCBzZXR0aW5ncykpOwotfQotCi1Qb3B1cENvbnRhaW5lcjo6UG9wdXBDb250
YWluZXIoUG9wdXBNZW51Q2xpZW50KiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgUG9wdXBUeXBlIHBvcHVwVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJiBzZXR0aW5ncykKLSAgICA6IG1fbGlzdEJv
eChQb3B1cExpc3RCb3g6OmNyZWF0ZShjbGllbnQsIHNldHRpbmdzKSkKLSAgICAsIG1fc2V0dGlu
Z3Moc2V0dGluZ3MpCi0gICAgLCBtX3BvcHVwVHlwZShwb3B1cFR5cGUpCi0gICAgLCBtX3BvcHVw
T3BlbihmYWxzZSkKLXsKLSAgICBzZXRTY3JvbGxiYXJNb2RlcyhTY3JvbGxiYXJBbHdheXNPZmYs
IFNjcm9sbGJhckFsd2F5c09mZik7Ci19Ci0KLVBvcHVwQ29udGFpbmVyOjp+UG9wdXBDb250YWlu
ZXIoKQotewotICAgIGlmIChtX2xpc3RCb3ggJiYgbV9saXN0Qm94LT5wYXJlbnQoKSkKLSAgICAg
ICAgcmVtb3ZlQ2hpbGQobV9saXN0Qm94LmdldCgpKTsKLX0KLQotSW50UmVjdCBQb3B1cENvbnRh
aW5lcjo6bGF5b3V0QW5kQ2FsY3VsYXRlV2lkZ2V0UmVjdChpbnQgdGFyZ2V0Q29udHJvbEhlaWdo
dCwgY29uc3QgSW50UG9pbnQmIHBvcHVwSW5pdGlhbENvb3JkaW5hdGUpCi17Ci0gICAgLy8gUmVz
ZXQgdGhlIG1heCB3aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLCB0aGV5
IHdpbGwgYmUgcmVjb21wdXRlZCBiZWxvdwotICAgIC8vIGlmIG5lY2Vzc2FyeS4KLSAgICBtX2xp
c3RCb3gtPnNldE1heEhlaWdodChrTWF4SGVpZ2h0KTsKLSAgICBtX2xpc3RCb3gtPnNldE1heFdp
ZHRoKG51bWVyaWNfbGltaXRzPGludD46Om1heCgpKTsKLQotICAgIC8vIExheSBldmVyeXRoaW5n
IG91dCB0byBmaWd1cmUgb3V0IG91ciBwcmVmZXJyZWQgc2l6ZSwgdGhlbiB0ZWxsIHRoZSB2aWV3
J3MKLSAgICAvLyBXaWRnZXRDbGllbnQgYWJvdXQgaXQuICBJdCBzaG91bGQgYXNzaWduIHVzIGEg
Y2xpZW50LgotICAgIGludCBydGxPZmZzZXQgPSBsYXlvdXRBbmRHZXRSVExPZmZzZXQoKTsKLSAg
ICBib29sIGlzUlRMID0gdGhpcy0+aXNSVEwoKTsKLSAgICBpbnQgcmlnaHRPZmZzZXQgPSBpc1JU
TCA/IHJ0bE9mZnNldCA6IDA7Ci0KLSAgICAvLyBBc3N1bWUgbV9saXN0Qm94IHNpemUgaXMgYWxy
ZWFkeSBjYWxjdWxhdGVkLgotICAgIEludFNpemUgdGFyZ2V0U2l6ZShtX2xpc3RCb3gtPndpZHRo
KCkgKyBrQm9yZGVyU2l6ZSAqIDIsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fbGlzdEJveC0+
aGVpZ2h0KCkgKyBrQm9yZGVyU2l6ZSAqIDIpOwotCi0gICAgSW50UmVjdCB3aWRnZXRSZWN0Owot
ICAgIENocm9tZUNsaWVudENocm9taXVtKiBjaHJvbWVDbGllbnQgPSBjaHJvbWVDbGllbnRDaHJv
bWl1bSgpOwotICAgIGlmIChjaHJvbWVDbGllbnQpIHsKLSAgICAgICAgLy8gSWYgdGhlIHBvcHVw
IHdvdWxkIGV4dGVuZCBwYXN0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiwgb3BlbiB1cHdhcmRz
Ci0gICAgICAgIC8vIGluc3RlYWQuCi0gICAgICAgIEZsb2F0UmVjdCBzY3JlZW4gPSBzY3JlZW5B
dmFpbGFibGVSZWN0KG1fZnJhbWVWaWV3LmdldCgpKTsKLSAgICAgICAgLy8gVXNlIHBvcHVwSW5p
dGlhbENvb3JkaW5hdGUueCgpICsgcmlnaHRPZmZzZXQgYmVjYXVzZSBSVEwgcG9zaXRpb24KLSAg
ICAgICAgLy8gbmVlZHMgdG8gYmUgY29uc2lkZXJlZC4KLSAgICAgICAgd2lkZ2V0UmVjdCA9IGNo
cm9tZUNsaWVudC0+d2luZG93VG9TY3JlZW4oSW50UmVjdChwb3B1cEluaXRpYWxDb29yZGluYXRl
LngoKSArIHJpZ2h0T2Zmc2V0LCBwb3B1cEluaXRpYWxDb29yZGluYXRlLnkoKSwgdGFyZ2V0U2l6
ZS53aWR0aCgpLCB0YXJnZXRTaXplLmhlaWdodCgpKSk7Ci0KLSAgICAgICAgLy8gSWYgd2UgaGF2
ZSBtdWx0aXBsZSBzY3JlZW5zIGFuZCB0aGUgYnJvd3NlciByZWN0IGlzIGluIG9uZSBzY3JlZW4s
IHdlIGhhdmUKLSAgICAgICAgLy8gdG8gY2xpcCB0aGUgd2luZG93IHdpZHRoIHRvIHRoZSBzY3Jl
ZW4gd2lkdGguCi0gICAgICAgIC8vIFdoZW4gY2xpcHBpbmcsIHdlIGFsc28gbmVlZCB0byBzZXQg
YSBtYXhpbXVtIHdpZHRoIGZvciB0aGUgbGlzdCBib3guCi0gICAgICAgIEZsb2F0UmVjdCB3aW5k
b3dSZWN0ID0gY2hyb21lQ2xpZW50LT53aW5kb3dSZWN0KCk7Ci0gICAgICAgIGlmICh3aW5kb3dS
ZWN0LngoKSA+PSBzY3JlZW4ueCgpICYmIHdpbmRvd1JlY3QubWF4WCgpIDw9IHNjcmVlbi5tYXhY
KCkgJiYgKHdpZGdldFJlY3QueCgpIDwgc2NyZWVuLngoKSB8fCB3aWRnZXRSZWN0Lm1heFgoKSA+
IHNjcmVlbi5tYXhYKCkpKSB7Ci0gICAgICAgICAgICAvLyBGaXJzdCwgaW52ZXJzZSB0aGUgcG9w
dXAgYWxpZ25tZW50IGlmIGl0IGRvZXMgbm90IGZpdCB0aGUgc2NyZWVuIC0gdGhpcyBtaWdodCBm
aXggdGhpbmdzIChvciBtYWtlIHRoZW0gYmV0dGVyKS4KLSAgICAgICAgICAgIEludFJlY3QgaW52
ZXJzZVdpZGdldFJlY3QgPSBjaHJvbWVDbGllbnQtPndpbmRvd1RvU2NyZWVuKEludFJlY3QocG9w
dXBJbml0aWFsQ29vcmRpbmF0ZS54KCkgKyAoaXNSVEwgPyAwIDogcnRsT2Zmc2V0KSwgcG9wdXBJ
bml0aWFsQ29vcmRpbmF0ZS55KCksIHRhcmdldFNpemUud2lkdGgoKSwgdGFyZ2V0U2l6ZS5oZWln
aHQoKSkpOwotICAgICAgICAgICAgSW50UmVjdCBlbmNsb3NpbmdTY3JlZW4gPSBlbmNsb3NpbmdJ
bnRSZWN0KHNjcmVlbik7Ci0gICAgICAgICAgICB1bnNpZ25lZCBvcmlnaW5hbEN1dG9mZiA9IG1h
eChlbmNsb3NpbmdTY3JlZW4ueCgpIC0gd2lkZ2V0UmVjdC54KCksIDApICsgbWF4KHdpZGdldFJl
Y3QubWF4WCgpIC0gZW5jbG9zaW5nU2NyZWVuLm1heFgoKSwgMCk7Ci0gICAgICAgICAgICB1bnNp
Z25lZCBpbnZlcnNlQ3V0b2ZmID0gbWF4KGVuY2xvc2luZ1NjcmVlbi54KCkgLSBpbnZlcnNlV2lk
Z2V0UmVjdC54KCksIDApICsgbWF4KGludmVyc2VXaWRnZXRSZWN0Lm1heFgoKSAtIGVuY2xvc2lu
Z1NjcmVlbi5tYXhYKCksIDApOwotCi0gICAgICAgICAgICAvLyBBY2NlcHQgdGhlIGludmVyc2Ug
cG9wdXAgYWxpZ25tZW50IGlmIHRoZSB0cmltbWVkIGNvbnRlbnQgZ2V0cyBzaG9ydGVyIHRoYW4g
dGhhdCBpbiB0aGUgb3JpZ2luYWwgYWxpZ25tZW50IGNhc2UuCi0gICAgICAgICAgICBpZiAoaW52
ZXJzZUN1dG9mZiA8IG9yaWdpbmFsQ3V0b2ZmKQotICAgICAgICAgICAgICAgIHdpZGdldFJlY3Qg
PSBpbnZlcnNlV2lkZ2V0UmVjdDsKLQotICAgICAgICAgICAgaWYgKHdpZGdldFJlY3QueCgpIDwg
c2NyZWVuLngoKSkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHdpZGdldFJpZ2h0ID0gd2lk
Z2V0UmVjdC5tYXhYKCk7Ci0gICAgICAgICAgICAgICAgd2lkZ2V0UmVjdC5zZXRXaWR0aCh3aWRn
ZXRSZWN0Lm1heFgoKSAtIHNjcmVlbi54KCkpOwotICAgICAgICAgICAgICAgIHdpZGdldFJlY3Qu
c2V0WCh3aWRnZXRSaWdodCAtIHdpZGdldFJlY3Qud2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAg
bGlzdEJveCgpLT5zZXRNYXhXaWR0aEFuZExheW91dChtYXgod2lkZ2V0UmVjdC53aWR0aCgpIC0g
a0JvcmRlclNpemUgKiAyLCAwKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdpZGdldFJlY3Qu
bWF4WCgpID4gc2NyZWVuLm1heFgoKSkgewotICAgICAgICAgICAgICAgIHdpZGdldFJlY3Quc2V0
V2lkdGgoc2NyZWVuLm1heFgoKSAtIHdpZGdldFJlY3QueCgpKTsKLSAgICAgICAgICAgICAgICBs
aXN0Qm94KCktPnNldE1heFdpZHRoQW5kTGF5b3V0KG1heCh3aWRnZXRSZWN0LndpZHRoKCkgLSBr
Qm9yZGVyU2l6ZSAqIDIsIDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAg
IC8vIENhbGN1bGF0ZSBZIGF4aXMgc2l6ZS4KLSAgICAgICAgaWYgKHdpZGdldFJlY3QubWF4WSgp
ID4gc3RhdGljX2Nhc3Q8aW50PihzY3JlZW4ubWF4WSgpKSkgewotICAgICAgICAgICAgaWYgKHdp
ZGdldFJlY3QueSgpIC0gd2lkZ2V0UmVjdC5oZWlnaHQoKSAtIHRhcmdldENvbnRyb2xIZWlnaHQg
PiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgZW5vdWdoIHJvb20gdG8gb3BlbiB1
cHdhcmRzLgotICAgICAgICAgICAgICAgIHdpZGdldFJlY3QubW92ZSgwLCAtKHdpZGdldFJlY3Qu
aGVpZ2h0KCkgKyB0YXJnZXRDb250cm9sSGVpZ2h0KSk7Ci0gICAgICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSB3aGV0aGVyIHVwd2FyZHMgb3IgZG93bndhcmRzIGhh
cyBtb3JlIHJvb20gYW5kIHNldCB0aGUKLSAgICAgICAgICAgICAgICAvLyBtYXhpbXVtIG51bWJl
ciBvZiBpdGVtcy4KLSAgICAgICAgICAgICAgICBpbnQgc3BhY2VBYm92ZSA9IHdpZGdldFJlY3Qu
eSgpIC0gdGFyZ2V0Q29udHJvbEhlaWdodDsKLSAgICAgICAgICAgICAgICBpbnQgc3BhY2VCZWxv
dyA9IHNjcmVlbi5tYXhZKCkgLSB3aWRnZXRSZWN0LnkoKTsKLSAgICAgICAgICAgICAgICBpZiAo
c3BhY2VBYm92ZSA+IHNwYWNlQmVsb3cpCi0gICAgICAgICAgICAgICAgICAgIG1fbGlzdEJveC0+
c2V0TWF4SGVpZ2h0KHNwYWNlQWJvdmUpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAg
ICAgICAgICAgICAgbV9saXN0Qm94LT5zZXRNYXhIZWlnaHQoc3BhY2VCZWxvdyk7Ci0gICAgICAg
ICAgICAgICAgbGF5b3V0QW5kR2V0UlRMT2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgLy8gT3Vy
IGhlaWdodCBoYXMgY2hhbmdlZCwgc28gcmVjb21wdXRlIG9ubHkgWSBheGlzIG9mIHdpZGdldFJl
Y3QuCi0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSB0byByZWNvbXB1dGUgWCBheGlz
LCBzbyB3ZSBvbmx5IHJlcGxhY2UgWSBheGlzCi0gICAgICAgICAgICAgICAgLy8gaW4gd2lkZ2V0
UmVjdC4KLSAgICAgICAgICAgICAgICBJbnRSZWN0IGZyYW1lSW5TY3JlZW4gPSBjaHJvbWVDbGll
bnQtPndpbmRvd1RvU2NyZWVuKGZyYW1lUmVjdCgpKTsKLSAgICAgICAgICAgICAgICB3aWRnZXRS
ZWN0LnNldFkoZnJhbWVJblNjcmVlbi55KCkpOwotICAgICAgICAgICAgICAgIHdpZGdldFJlY3Qu
c2V0SGVpZ2h0KGZyYW1lSW5TY3JlZW4uaGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIC8vIEFu
ZCBtb3ZlIHVwd2FyZHMgaWYgbmVjZXNzYXJ5LgotICAgICAgICAgICAgICAgIGlmIChzcGFjZUFi
b3ZlID4gc3BhY2VCZWxvdykKLSAgICAgICAgICAgICAgICAgICAgd2lkZ2V0UmVjdC5tb3ZlKDAs
IC0od2lkZ2V0UmVjdC5oZWlnaHQoKSArIHRhcmdldENvbnRyb2xIZWlnaHQpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gd2lkZ2V0UmVjdDsKLX0KLQotdm9p
ZCBQb3B1cENvbnRhaW5lcjo6c2hvd1BvcHVwKEZyYW1lVmlldyogdmlldykKLXsKLSAgICBtX2Zy
YW1lVmlldyA9IHZpZXc7Ci0gICAgbGlzdEJveCgpLT5tX2ZvY3VzZWROb2RlID0gbV9mcmFtZVZp
ZXctPmZyYW1lKCktPmRvY3VtZW50KCktPmZvY3VzZWROb2RlKCk7Ci0KLSAgICBDaHJvbWVDbGll
bnRDaHJvbWl1bSogY2hyb21lQ2xpZW50ID0gY2hyb21lQ2xpZW50Q2hyb21pdW0oKTsKLSAgICBp
ZiAoY2hyb21lQ2xpZW50KSB7Ci0gICAgICAgIEludFJlY3QgcG9wdXBSZWN0ID0gZnJhbWVSZWN0
KCk7Ci0gICAgICAgIGNocm9tZUNsaWVudC0+cG9wdXBPcGVuZWQodGhpcywgbGF5b3V0QW5kQ2Fs
Y3VsYXRlV2lkZ2V0UmVjdChwb3B1cFJlY3QuaGVpZ2h0KCksIHBvcHVwUmVjdC5sb2NhdGlvbigp
KSwgZmFsc2UpOwotICAgICAgICBtX3BvcHVwT3BlbiA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYg
KCFtX2xpc3RCb3gtPnBhcmVudCgpKQotICAgICAgICBhZGRDaGlsZChtX2xpc3RCb3guZ2V0KCkp
OwotCi0gICAgLy8gRW5hYmxlIHNjcm9sbGJhcnMgYWZ0ZXIgdGhlIGxpc3Rib3ggaXMgaW5zZXJ0
ZWQgaW50byB0aGUgaGllcmFyY2h5LAotICAgIC8vIHNvIGl0IGhhcyBhIHByb3BlciBXaWRnZXRD
bGllbnQuCi0gICAgbV9saXN0Qm94LT5zZXRWZXJ0aWNhbFNjcm9sbGJhck1vZGUoU2Nyb2xsYmFy
QXV0byk7Ci0KLSAgICBtX2xpc3RCb3gtPnNjcm9sbFRvUmV2ZWFsU2VsZWN0aW9uKCk7Ci0KLSAg
ICBpbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgUG9wdXBDb250YWluZXI6OmhpZGVQb3B1cCgpCi17
Ci0gICAgbGlzdEJveCgpLT5oaWRlUG9wdXAoKTsKLX0KLQotdm9pZCBQb3B1cENvbnRhaW5lcjo6
bm90aWZ5UG9wdXBIaWRkZW4oKQotewotICAgIGlmICghbV9wb3B1cE9wZW4pCi0gICAgICAgIHJl
dHVybjsKLSAgICBtX3BvcHVwT3BlbiA9IGZhbHNlOwotICAgIGNocm9tZUNsaWVudENocm9taXVt
KCktPnBvcHVwQ2xvc2VkKHRoaXMpOwotfQotCi1pbnQgUG9wdXBDb250YWluZXI6OmxheW91dEFu
ZEdldFJUTE9mZnNldCgpCi17Ci0gICAgbV9saXN0Qm94LT5sYXlvdXQoKTsKLQotICAgIC8vIFBs
YWNlIHRoZSBsaXN0Ym94IHdpdGhpbiBvdXIgYm9yZGVyLgotICAgIG1fbGlzdEJveC0+bW92ZShr
Qm9yZGVyU2l6ZSwga0JvcmRlclNpemUpOwotCi0gICAgLy8gU2l6ZSBvdXJzZWx2ZXMgdG8gY29u
dGFpbiBsaXN0Ym94ICsgYm9yZGVyLgotICAgIGludCBsaXN0Qm94V2lkdGggPSBtX2xpc3RCb3gt
PndpZHRoKCkgKyBrQm9yZGVyU2l6ZSAqIDI7Ci0gICAgcmVzaXplKGxpc3RCb3hXaWR0aCwgbV9s
aXN0Qm94LT5oZWlnaHQoKSArIGtCb3JkZXJTaXplICogMik7Ci0gICAgaW52YWxpZGF0ZSgpOwot
Ci0gICAgLy8gQ29tcHV0ZSB0aGUgc3RhcnRpbmcgeC1heGlzIGZvciBhIG5vcm1hbCBSVEwgb3Ig
cmlnaHQtYWxpZ25lZCBMVFIgZHJvcGRvd24uIEZvciB0aG9zZSwKLSAgICAvLyB0aGUgcmlnaHQg
ZWRnZSBvZiBkcm9wZG93biBib3ggc2hvdWxkIGJlIGFsaWduZWQgd2l0aCB0aGUgcmlnaHQgZWRn
ZSBvZiA8c2VsZWN0Pi88aW5wdXQ+IGVsZW1lbnQgYm94LAotICAgIC8vIGFuZCB0aGUgZHJvcGRv
d24gYm94IHNob3VsZCBiZSBleHBhbmRlZCB0byB0aGUgbGVmdCBpZiBtb3JlIHNwYWNlIGlzIG5l
ZWRlZC4KLSAgICAvLyBtX29yaWdpbmFsRnJhbWVSZWN0LndpZHRoKCkgaXMgdGhlIHdpZHRoIG9m
IHRoZSB0YXJnZXQgPHNlbGVjdD4vPGlucHV0PiBlbGVtZW50LgotICAgIHJldHVybiBtX29yaWdp
bmFsRnJhbWVSZWN0LndpZHRoKCkgLSBsaXN0Qm94V2lkdGg7Ci19Ci0KLWJvb2wgUG9wdXBDb250
YWluZXI6OmhhbmRsZU1vdXNlRG93bkV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZl
bnQpCi17Ci0gICAgVXNlckdlc3R1cmVJbmRpY2F0b3IgZ2VzdHVyZUluZGljYXRvcihEZWZpbml0
ZWx5UHJvY2Vzc2luZ1VzZXJHZXN0dXJlKTsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5oYW5kbGVN
b3VzZURvd25FdmVudCgKLSAgICAgICAgY29uc3RydWN0UmVsYXRpdmVNb3VzZUV2ZW50KGV2ZW50
LCB0aGlzLCBtX2xpc3RCb3guZ2V0KCkpKTsKLX0KLQotYm9vbCBQb3B1cENvbnRhaW5lcjo6aGFu
ZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKLXsKLSAg
ICBVc2VyR2VzdHVyZUluZGljYXRvciBnZXN0dXJlSW5kaWNhdG9yKERlZmluaXRlbHlQcm9jZXNz
aW5nVXNlckdlc3R1cmUpOwotICAgIHJldHVybiBtX2xpc3RCb3gtPmhhbmRsZU1vdXNlTW92ZUV2
ZW50KAotICAgICAgICBjb25zdHJ1Y3RSZWxhdGl2ZU1vdXNlRXZlbnQoZXZlbnQsIHRoaXMsIG1f
bGlzdEJveC5nZXQoKSkpOwotfQotCi1ib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVNb3VzZVJl
bGVhc2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2ZW50KQotewotICAgIFJlZlB0
cjxQb3B1cENvbnRhaW5lcj4gcHJvdGVjdCh0aGlzKTsKLSAgICBVc2VyR2VzdHVyZUluZGljYXRv
ciBnZXN0dXJlSW5kaWNhdG9yKERlZmluaXRlbHlQcm9jZXNzaW5nVXNlckdlc3R1cmUpOwotICAg
IHJldHVybiBtX2xpc3RCb3gtPmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KAotICAgICAgICBjb25z
dHJ1Y3RSZWxhdGl2ZU1vdXNlRXZlbnQoZXZlbnQsIHRoaXMsIG1fbGlzdEJveC5nZXQoKSkpOwot
fQotCi1ib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVXaGVlbEV2ZW50KGNvbnN0IFBsYXRmb3Jt
V2hlZWxFdmVudCYgZXZlbnQpCi17Ci0gICAgVXNlckdlc3R1cmVJbmRpY2F0b3IgZ2VzdHVyZUlu
ZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJHZXN0dXJlKTsKLSAgICByZXR1cm4gbV9s
aXN0Qm94LT5oYW5kbGVXaGVlbEV2ZW50KAotICAgICAgICBjb25zdHJ1Y3RSZWxhdGl2ZVdoZWVs
RXZlbnQoZXZlbnQsIHRoaXMsIG1fbGlzdEJveC5nZXQoKSkpOwotfQotCi0jaWYgRU5BQkxFKFRP
VUNIX0VWRU5UUykKLWJvb2wgUG9wdXBDb250YWluZXI6OmhhbmRsZVRvdWNoRXZlbnQoY29uc3Qg
UGxhdGZvcm1Ub3VjaEV2ZW50JikKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0jZW5kaWYKLQot
I2lmIEVOQUJMRShHRVNUVVJFX1JFQ09HTklaRVIpCi0vLyBGSVhNRTogUmVmYWN0b3IgdGhpcyBj
b2RlIHRvIHNoYXJlIGZ1bmN0aW9uYWxpdHkgd2l0aCBFdmVudEhhbmRsZXI6OmhhbmRsZUdlc3R1
cmVFdmVudC4KLWJvb2wgUG9wdXBDb250YWluZXI6OmhhbmRsZUdlc3R1cmVFdmVudChjb25zdCBQ
bGF0Zm9ybUdlc3R1cmVFdmVudCYgZ2VzdHVyZUV2ZW50KQotewotICAgIHN3aXRjaCAoZ2VzdHVy
ZUV2ZW50LnR5cGUoKSkgewotICAgIGNhc2UgUGxhdGZvcm1HZXN0dXJlRXZlbnQ6OlRhcFR5cGU6
IHsKLSAgICAgICAgUGxhdGZvcm1Nb3VzZUV2ZW50IGZha2VNb3VzZU1vdmUoZ2VzdHVyZUV2ZW50
LnBvc2l0aW9uKCksIGdlc3R1cmVFdmVudC5nbG9iYWxQb3NpdGlvbigpLCBOb0J1dHRvbiwgTW91
c2VFdmVudE1vdmVkLCAvKiBjbGlja0NvdW50ICovIDEsIGdlc3R1cmVFdmVudC5zaGlmdEtleSgp
LCBnZXN0dXJlRXZlbnQuY3RybEtleSgpLCBnZXN0dXJlRXZlbnQuYWx0S2V5KCksIGdlc3R1cmVF
dmVudC5tZXRhS2V5KCksIGdlc3R1cmVFdmVudC50aW1lc3RhbXAoKSk7Ci0gICAgICAgIFBsYXRm
b3JtTW91c2VFdmVudCBmYWtlTW91c2VEb3duKGdlc3R1cmVFdmVudC5wb3NpdGlvbigpLCBnZXN0
dXJlRXZlbnQuZ2xvYmFsUG9zaXRpb24oKSwgTGVmdEJ1dHRvbiwgTW91c2VFdmVudFByZXNzZWQs
IC8qIGNsaWNrQ291bnQgKi8gMSwgZ2VzdHVyZUV2ZW50LnNoaWZ0S2V5KCksIGdlc3R1cmVFdmVu
dC5jdHJsS2V5KCksIGdlc3R1cmVFdmVudC5hbHRLZXkoKSwgZ2VzdHVyZUV2ZW50Lm1ldGFLZXko
KSwgZ2VzdHVyZUV2ZW50LnRpbWVzdGFtcCgpKTsKLSAgICAgICAgUGxhdGZvcm1Nb3VzZUV2ZW50
IGZha2VNb3VzZVVwKGdlc3R1cmVFdmVudC5wb3NpdGlvbigpLCBnZXN0dXJlRXZlbnQuZ2xvYmFs
UG9zaXRpb24oKSwgTGVmdEJ1dHRvbiwgTW91c2VFdmVudFJlbGVhc2VkLCAvKiBjbGlja0NvdW50
ICovIDEsIGdlc3R1cmVFdmVudC5zaGlmdEtleSgpLCBnZXN0dXJlRXZlbnQuY3RybEtleSgpLCBn
ZXN0dXJlRXZlbnQuYWx0S2V5KCksIGdlc3R1cmVFdmVudC5tZXRhS2V5KCksIGdlc3R1cmVFdmVu
dC50aW1lc3RhbXAoKSk7Ci0gICAgICAgIC8vIGhhbmRsZU1vdXNlTW92ZUV2ZW50KGZha2VNb3Vz
ZU1vdmUpOwotICAgICAgICBoYW5kbGVNb3VzZURvd25FdmVudChmYWtlTW91c2VEb3duKTsKLSAg
ICAgICAgaGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoZmFrZU1vdXNlVXApOwotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBQbGF0Zm9ybUdlc3R1cmVFdmVudDo6U2Nyb2xsVXBk
YXRlVHlwZTogewotICAgICAgICBQbGF0Zm9ybVdoZWVsRXZlbnQgc3ludGhldGljV2hlZWxFdmVu
dChnZXN0dXJlRXZlbnQucG9zaXRpb24oKSwgZ2VzdHVyZUV2ZW50Lmdsb2JhbFBvc2l0aW9uKCks
IGdlc3R1cmVFdmVudC5kZWx0YVgoKSwgZ2VzdHVyZUV2ZW50LmRlbHRhWSgpLCBnZXN0dXJlRXZl
bnQuZGVsdGFYKCkgLyAxMjAuMGYsIGdlc3R1cmVFdmVudC5kZWx0YVkoKSAvIDEyMC4wZiwgU2Ny
b2xsQnlQaXhlbFdoZWVsRXZlbnQsIC8qIGlzQWNjZXB0ZWQgKi8gZmFsc2UsIGdlc3R1cmVFdmVu
dC5zaGlmdEtleSgpLCBnZXN0dXJlRXZlbnQuY3RybEtleSgpLCBnZXN0dXJlRXZlbnQuYWx0S2V5
KCksIGdlc3R1cmVFdmVudC5tZXRhS2V5KCkpOwotICAgICAgICBoYW5kbGVXaGVlbEV2ZW50KHN5
bnRoZXRpY1doZWVsRXZlbnQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2Fz
ZSBQbGF0Zm9ybUdlc3R1cmVFdmVudDo6U2Nyb2xsQmVnaW5UeXBlOgotICAgIGNhc2UgUGxhdGZv
cm1HZXN0dXJlRXZlbnQ6OlNjcm9sbEVuZFR5cGU6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAg
ICByZXR1cm4gZmFsc2U7Ci19Ci0jZW5kaWYKLQotYm9vbCBQb3B1cENvbnRhaW5lcjo6aGFuZGxl
S2V5RXZlbnQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50JiBldmVudCkKLXsKLSAgICBVc2Vy
R2VzdHVyZUluZGljYXRvciBnZXN0dXJlSW5kaWNhdG9yKERlZmluaXRlbHlQcm9jZXNzaW5nVXNl
ckdlc3R1cmUpOwotICAgIHJldHVybiBtX2xpc3RCb3gtPmhhbmRsZUtleUV2ZW50KGV2ZW50KTsK
LX0KLQotdm9pZCBQb3B1cENvbnRhaW5lcjo6aGlkZSgpCi17Ci0gICAgbV9saXN0Qm94LT5hYmFu
ZG9uKCk7Ci19Ci0KLXZvaWQgUG9wdXBDb250YWluZXI6OnBhaW50KEdyYXBoaWNzQ29udGV4dCog
Z2MsIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgLy8gYWRqdXN0IGNvb3JkcyBmb3Igc2Ny
b2xsZWQgZnJhbWUKLSAgICBJbnRSZWN0IHIgPSBpbnRlcnNlY3Rpb24ocmVjdCwgZnJhbWVSZWN0
KCkpOwotICAgIGludCB0eCA9IHgoKTsKLSAgICBpbnQgdHkgPSB5KCk7Ci0KLSAgICByLm1vdmUo
LXR4LCAtdHkpOwotCi0gICAgZ2MtPnRyYW5zbGF0ZShzdGF0aWNfY2FzdDxmbG9hdD4odHgpLCBz
dGF0aWNfY2FzdDxmbG9hdD4odHkpKTsKLSAgICBtX2xpc3RCb3gtPnBhaW50KGdjLCByKTsKLSAg
ICBnYy0+dHJhbnNsYXRlKC1zdGF0aWNfY2FzdDxmbG9hdD4odHgpLCAtc3RhdGljX2Nhc3Q8Zmxv
YXQ+KHR5KSk7Ci0KLSAgICBwYWludEJvcmRlcihnYywgcmVjdCk7Ci19Ci0KLXZvaWQgUG9wdXBD
b250YWluZXI6OnBhaW50Qm9yZGVyKEdyYXBoaWNzQ29udGV4dCogZ2MsIGNvbnN0IEludFJlY3Qm
IHJlY3QpCi17Ci0gICAgLy8gRklYTUU6IFdoZXJlIGRvIHdlIGdldCB0aGUgYm9yZGVyIGNvbG9y
IGZyb20/Ci0gICAgQ29sb3IgYm9yZGVyQ29sb3IoMTI3LCAxNTcsIDE4NSk7Ci0KLSAgICBnYy0+
c2V0U3Ryb2tlU3R5bGUoTm9TdHJva2UpOwotICAgIGdjLT5zZXRGaWxsQ29sb3IoYm9yZGVyQ29s
b3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwotCi0gICAgaW50IHR4ID0geCgpOwotICAgIGludCB0
eSA9IHkoKTsKLQotICAgIC8vIHRvcCwgbGVmdCwgYm90dG9tLCByaWdodAotICAgIGdjLT5kcmF3
UmVjdChJbnRSZWN0KHR4LCB0eSwgd2lkdGgoKSwga0JvcmRlclNpemUpKTsKLSAgICBnYy0+ZHJh
d1JlY3QoSW50UmVjdCh0eCwgdHksIGtCb3JkZXJTaXplLCBoZWlnaHQoKSkpOwotICAgIGdjLT5k
cmF3UmVjdChJbnRSZWN0KHR4LCB0eSArIGhlaWdodCgpIC0ga0JvcmRlclNpemUsIHdpZHRoKCks
IGtCb3JkZXJTaXplKSk7Ci0gICAgZ2MtPmRyYXdSZWN0KEludFJlY3QodHggKyB3aWR0aCgpIC0g
a0JvcmRlclNpemUsIHR5LCBrQm9yZGVyU2l6ZSwgaGVpZ2h0KCkpKTsKLX0KLQotYm9vbCBQb3B1
cENvbnRhaW5lcjo6aXNJbnRlcmVzdGVkSW5FdmVudEZvcktleShpbnQga2V5Q29kZSkKLXsKLSAg
ICByZXR1cm4gbV9saXN0Qm94LT5pc0ludGVyZXN0ZWRJbkV2ZW50Rm9yS2V5KGtleUNvZGUpOwot
fQotCi1DaHJvbWVDbGllbnRDaHJvbWl1bSogUG9wdXBDb250YWluZXI6OmNocm9tZUNsaWVudENo
cm9taXVtKCkKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2hyb21lQ2xpZW50Q2hyb21pdW0q
PihtX2ZyYW1lVmlldy0+ZnJhbWUoKS0+cGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCkpOwotfQot
Ci12b2lkIFBvcHVwQ29udGFpbmVyOjpzaG93SW5SZWN0KGNvbnN0IEludFJlY3QmIHIsIEZyYW1l
VmlldyogdiwgaW50IGluZGV4KQotewotICAgIC8vIFRoZSByZWN0IGlzIHRoZSBzaXplIG9mIHRo
ZSBzZWxlY3QgYm94LiBJdCdzIHVzdWFsbHkgbGFyZ2VyIHRoYW4gd2UgbmVlZC4KLSAgICAvLyBz
dWJ0cmFjdCBib3JkZXIgc2l6ZSBzbyB0aGF0IHVzdWFsbHkgdGhlIGNvbnRhaW5lciB3aWxsIGJl
IGRpc3BsYXllZAotICAgIC8vIGV4YWN0bHkgdGhlIHNhbWUgd2lkdGggYXMgdGhlIHNlbGVjdCBi
b3guCi0gICAgbGlzdEJveCgpLT5zZXRCYXNlV2lkdGgobWF4KHIud2lkdGgoKSAtIGtCb3JkZXJT
aXplICogMiwgMCkpOwotCi0gICAgbGlzdEJveCgpLT51cGRhdGVGcm9tRWxlbWVudCgpOwotCi0g
ICAgLy8gV2Ugc2V0IHRoZSBzZWxlY3RlZCBpdGVtIGluIHVwZGF0ZUZyb21FbGVtZW50KCksIGFu
ZCBkaXNyZWdhcmQgdGhlCi0gICAgLy8gaW5kZXggcGFzc2VkIGludG8gdGhpcyBmdW5jdGlvbiAo
c2FtZSBhcyBXZWJraXQncyBQb3B1cE1lbnVXaW4uY3BwKQotICAgIC8vIEZJWE1FOiBtYWtlIHN1
cmUgdGhpcyBpcyBjb3JyZWN0LCBhbmQgYWRkIGFuIGFzc2VydGlvbi4KLSAgICAvLyBBU1NFUlQo
cG9wdXBXaW5kb3cocG9wdXApLT5saXN0Qm94KCktPnNlbGVjdGVkSW5kZXgoKSA9PSBpbmRleCk7
Ci0KLSAgICAvLyBDb252ZXJ0IHBvaW50IHRvIG1haW4gd2luZG93IGNvb3Jkcy4KLSAgICBJbnRQ
b2ludCBsb2NhdGlvbiA9IHYtPmNvbnRlbnRzVG9XaW5kb3coci5sb2NhdGlvbigpKTsKLQotICAg
IC8vIE1vdmUgaXQgYmVsb3cgdGhlIHNlbGVjdCB3aWRnZXQuCi0gICAgbG9jYXRpb24ubW92ZSgw
LCByLmhlaWdodCgpKTsKLQotICAgIG1fb3JpZ2luYWxGcmFtZVJlY3QgPSBJbnRSZWN0KGxvY2F0
aW9uLCByLnNpemUoKSk7Ci0gICAgc2V0RnJhbWVSZWN0KG1fb3JpZ2luYWxGcmFtZVJlY3QpOwot
ICAgIHNob3dQb3B1cCh2KTsKLX0KLQotdm9pZCBQb3B1cENvbnRhaW5lcjo6cmVmcmVzaChjb25z
dCBJbnRSZWN0JiB0YXJnZXRDb250cm9sUmVjdCkKLXsKLSAgICBJbnRQb2ludCBsb2NhdGlvbiA9
IG1fZnJhbWVWaWV3LT5jb250ZW50c1RvV2luZG93KHRhcmdldENvbnRyb2xSZWN0LmxvY2F0aW9u
KCkpOwotICAgIC8vIE1vdmUgaXQgYmVsb3cgdGhlIHNlbGVjdCB3aWRnZXQuCi0gICAgbG9jYXRp
b24ubW92ZSgwLCB0YXJnZXRDb250cm9sUmVjdC5oZWlnaHQoKSk7Ci0KLSAgICBsaXN0Qm94KCkt
PnNldEJhc2VXaWR0aChtYXgobV9vcmlnaW5hbEZyYW1lUmVjdC53aWR0aCgpIC0ga0JvcmRlclNp
emUgKiAyLCAwKSk7Ci0gICAgc2V0Qm91bmRzU2l6ZShtX29yaWdpbmFsRnJhbWVSZWN0LnNpemUo
KSk7Ci0KLSAgICBsaXN0Qm94KCktPnVwZGF0ZUZyb21FbGVtZW50KCk7Ci0gICAgLy8gU3RvcmUg
dGhlIG9yaWdpbmFsIHNpemUgdG8gY2hlY2sgaWYgd2UgbmVlZCB0byByZXF1ZXN0IHRoZSBsb2Nh
dGlvbi4KLSAgICBJbnRTaXplIG9yaWdpbmFsU2l6ZSA9IHNpemUoKTsKLSAgICBJbnRSZWN0IHdp
ZGdldFJlY3QgPSBsYXlvdXRBbmRDYWxjdWxhdGVXaWRnZXRSZWN0KHRhcmdldENvbnRyb2xSZWN0
LmhlaWdodCgpLCBsb2NhdGlvbik7Ci0gICAgaWYgKG9yaWdpbmFsU2l6ZSAhPSB3aWRnZXRSZWN0
LnNpemUoKSkgewotICAgICAgICBDaHJvbWVDbGllbnRDaHJvbWl1bSogY2hyb21lQ2xpZW50ID0g
Y2hyb21lQ2xpZW50Q2hyb21pdW0oKTsKLSAgICAgICAgaWYgKGNocm9tZUNsaWVudCkgewotICAg
ICAgICAgICAgSW50UG9pbnQgd2lkZ2V0TG9jYXRpb24gPSBjaHJvbWVDbGllbnQtPnNjcmVlblRv
V2luZG93KHdpZGdldFJlY3QubG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB3aWRnZXRSZWN0LnNl
dExvY2F0aW9uKHdpZGdldExvY2F0aW9uKTsKLSAgICAgICAgICAgIHNldEZyYW1lUmVjdCh3aWRn
ZXRSZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludmFsaWRhdGUoKTsKLX0KLQotaW5s
aW5lIGJvb2wgUG9wdXBDb250YWluZXI6OmlzUlRMKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9s
aXN0Qm94LT5tX3BvcHVwQ2xpZW50LT5tZW51U3R5bGUoKS50ZXh0RGlyZWN0aW9uKCkgPT0gUlRM
OwotfQotCi1pbnQgUG9wdXBDb250YWluZXI6OnNlbGVjdGVkSW5kZXgoKSBjb25zdAotewotICAg
IHJldHVybiBtX2xpc3RCb3gtPnNlbGVjdGVkSW5kZXgoKTsKLX0KLQotaW50IFBvcHVwQ29udGFp
bmVyOjptZW51SXRlbUhlaWdodCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fbGlzdEJveC0+Z2V0
Um93SGVpZ2h0KDApOwotfQotCi1pbnQgUG9wdXBDb250YWluZXI6Om1lbnVJdGVtRm9udFNpemUo
KSBjb25zdAotewotICAgIHJldHVybiBtX2xpc3RCb3gtPmdldFJvd0ZvbnQoMCkuc2l6ZSgpOwot
fQotCi1Qb3B1cE1lbnVTdHlsZSBQb3B1cENvbnRhaW5lcjo6bWVudVN0eWxlKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gbV9saXN0Qm94LT5tX3BvcHVwQ2xpZW50LT5tZW51U3R5bGUoKTsKLX0KLQot
Y29uc3QgV1RGOjpWZWN0b3I8UG9wdXBJdGVtKj4mIFBvcHVwQ29udGFpbmVyOjogcG9wdXBEYXRh
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5pdGVtcygpOwotfQotCi1TdHJpbmcg
UG9wdXBDb250YWluZXI6OmdldFNlbGVjdGVkSXRlbVRvb2xUaXAoKQotewotICAgIC8vIFdlIGNh
bm5vdCB1c2UgbV9wb3B1cENsaWVudC0+c2VsZWN0ZWRJbmRleCgpIHRvIGNob29zZSB0b29sdGlw
IG1lc3NhZ2UsCi0gICAgLy8gYmVjYXVzZSB0aGUgc2VsZWN0ZWRJbmRleCgpIG1pZ2h0IHJldHVy
biBmaW5hbCBzZWxlY3RlZCBpbmRleCwgbm90IGhvdmVyaW5nIHNlbGVjdGlvbi4KLSAgICByZXR1
cm4gbGlzdEJveCgpLT5tX3BvcHVwQ2xpZW50LT5pdGVtVG9vbFRpcChsaXN0Qm94KCktPm1fc2Vs
ZWN0ZWRJbmRleCk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFBvcHVwTGlzdEJv
eCBpbXBsZW1lbnRhdGlvbgotCi1ib29sIFBvcHVwTGlzdEJveDo6aGFuZGxlTW91c2VEb3duRXZl
bnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKLXsKLSAgICBTY3JvbGxiYXIqIHNj
cm9sbGJhciA9IHNjcm9sbGJhckF0UG9pbnQoZXZlbnQucG9zKCkpOwotICAgIGlmIChzY3JvbGxi
YXIpIHsKLSAgICAgICAgbV9jYXB0dXJpbmdTY3JvbGxiYXIgPSBzY3JvbGxiYXI7Ci0gICAgICAg
IG1fY2FwdHVyaW5nU2Nyb2xsYmFyLT5tb3VzZURvd24oZXZlbnQpOwotICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzUG9pbnRJbkJvdW5kcyhldmVudC5wb3MoKSkpCi0g
ICAgICAgIGFiYW5kb24oKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBvcHVwTGlz
dEJveDo6aGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVu
dCkKLXsKLSAgICBpZiAobV9jYXB0dXJpbmdTY3JvbGxiYXIpIHsKLSAgICAgICAgbV9jYXB0dXJp
bmdTY3JvbGxiYXItPm1vdXNlTW92ZWQoZXZlbnQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICB9Ci0KLSAgICBTY3JvbGxiYXIqIHNjcm9sbGJhciA9IHNjcm9sbGJhckF0UG9pbnQoZXZlbnQu
cG9zKCkpOwotICAgIGlmIChtX2xhc3RTY3JvbGxiYXJVbmRlck1vdXNlICE9IHNjcm9sbGJhcikg
ewotICAgICAgICAvLyBTZW5kIG1vdXNlIGV4aXRlZCB0byB0aGUgb2xkIHNjcm9sbGJhci4KLSAg
ICAgICAgaWYgKG1fbGFzdFNjcm9sbGJhclVuZGVyTW91c2UpCi0gICAgICAgICAgICBtX2xhc3RT
Y3JvbGxiYXJVbmRlck1vdXNlLT5tb3VzZUV4aXRlZCgpOwotICAgICAgICBtX2xhc3RTY3JvbGxi
YXJVbmRlck1vdXNlID0gc2Nyb2xsYmFyOwotICAgIH0KLQotICAgIGlmIChzY3JvbGxiYXIpIHsK
LSAgICAgICAgc2Nyb2xsYmFyLT5tb3VzZU1vdmVkKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgfQotCi0gICAgaWYgKCFpc1BvaW50SW5Cb3VuZHMoZXZlbnQucG9zKCkpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBzZWxlY3RJbmRleChwb2ludFRvUm93SW5kZXgoZXZl
bnQucG9zKCkpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQb3B1cExpc3RCb3g6Omhh
bmRsZU1vdXNlUmVsZWFzZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZlbnQpCi17
Ci0gICAgaWYgKG1fY2FwdHVyaW5nU2Nyb2xsYmFyKSB7Ci0gICAgICAgIG1fY2FwdHVyaW5nU2Ny
b2xsYmFyLT5tb3VzZVVwKCk7Ci0gICAgICAgIG1fY2FwdHVyaW5nU2Nyb2xsYmFyID0gMDsKLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFpc1BvaW50SW5Cb3VuZHMoZXZl
bnQucG9zKCkpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIE5lZWQgdG8gY2hlY2sg
YmVmb3JlIGNhbGxpbmcgYWNjZXB0SW5kZXgoKSwgYmVjYXVzZSBtX3BvcHVwQ2xpZW50IG1pZ2h0
IGJlIHJlbW92ZWQgaW4gYWNjZXB0SW5kZXgoKSBjYWxsaW5nIGJlY2F1c2Ugb2YgZXZlbnQgaGFu
ZGxlci4KLSAgICBib29sIGlzU2VsZWN0UG9wdXAgPSBtX3BvcHVwQ2xpZW50LT5tZW51U3R5bGUo
KS5tZW51VHlwZSgpID09IFBvcHVwTWVudVN0eWxlOjpTZWxlY3RQb3B1cDsKLSAgICBpZiAoYWNj
ZXB0SW5kZXgocG9pbnRUb1Jvd0luZGV4KGV2ZW50LnBvcygpKSkgJiYgbV9mb2N1c2VkTm9kZSAm
JiBpc1NlbGVjdFBvcHVwKSB7Ci0gICAgICAgIG1fZm9jdXNlZE5vZGUtPmRpc3BhdGNoTW91c2VF
dmVudChldmVudCwgZXZlbnROYW1lcygpLm1vdXNldXBFdmVudCk7Ci0gICAgICAgIG1fZm9jdXNl
ZE5vZGUtPmRpc3BhdGNoTW91c2VFdmVudChldmVudCwgZXZlbnROYW1lcygpLmNsaWNrRXZlbnQp
OwotCi0gICAgICAgIC8vIENsZWFyIG1fZm9jdXNlZE5vZGUgaGVyZSwgYmVjYXVzZSB3ZSBjYW5u
b3QgY2xlYXIgaW4gaGlkZVBvcHVwKCkgd2hpY2ggaXMgY2FsbGVkIGJlZm9yZSBkaXNwYXRjaE1v
dXNlRXZlbnQoKSBpcyBjYWxsZWQuCi0gICAgICAgIG1fZm9jdXNlZE5vZGUgPSAwOwotICAgIH0K
LQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBvcHVwTGlzdEJveDo6aGFuZGxlV2hlZWxF
dmVudChjb25zdCBQbGF0Zm9ybVdoZWVsRXZlbnQmIGV2ZW50KQotewotICAgIGlmICghaXNQb2lu
dEluQm91bmRzKGV2ZW50LnBvcygpKSkgewotICAgICAgICBhYmFuZG9uKCk7Ci0gICAgICAgIHJl
dHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIFBhc3MgaXQgb2ZmIHRvIHRoZSBzY3JvbGwgdmll
dy4KLSAgICAvLyBTYWRseSwgV2ViQ29yZSBkZXZzIGRvbid0IHVuZGVyc3RhbmQgdGhlIHdob2xl
ICJjb25zdCIgdGhpbmcuCi0gICAgd2hlZWxFdmVudChjb25zdF9jYXN0PFBsYXRmb3JtV2hlZWxF
dmVudCY+KGV2ZW50KSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFNob3VsZCBiZSBrZXB0
IGluIHN5bmMgd2l0aCBoYW5kbGVLZXlFdmVudCgpLgotYm9vbCBQb3B1cExpc3RCb3g6OmlzSW50
ZXJlc3RlZEluRXZlbnRGb3JLZXkoaW50IGtleUNvZGUpCi17Ci0gICAgc3dpdGNoIChrZXlDb2Rl
KSB7Ci0gICAgY2FzZSBWS0VZX0VTQ0FQRToKLSAgICBjYXNlIFZLRVlfUkVUVVJOOgotICAgIGNh
c2UgVktFWV9VUDoKLSAgICBjYXNlIFZLRVlfRE9XTjoKLSAgICBjYXNlIFZLRVlfUFJJT1I6Ci0g
ICAgY2FzZSBWS0VZX05FWFQ6Ci0gICAgY2FzZSBWS0VZX0hPTUU6Ci0gICAgY2FzZSBWS0VZX0VO
RDoKLSAgICBjYXNlIFZLRVlfVEFCOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0
OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0jaWYgRU5BQkxFKFRPVUNIX0VW
RU5UUykKLWJvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBsYXRmb3Jt
VG91Y2hFdmVudCYpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0KLSNpZiBFTkFC
TEUoR0VTVFVSRV9SRUNPR05JWkVSKQotYm9vbCBQb3B1cExpc3RCb3g6OmhhbmRsZUdlc3R1cmVF
dmVudChjb25zdCBQbGF0Zm9ybUdlc3R1cmVFdmVudCYpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwot
fQotI2VuZGlmCi0KLXN0YXRpYyBib29sIGlzQ2hhcmFjdGVyVHlwZUV2ZW50KGNvbnN0IFBsYXRm
b3JtS2V5Ym9hcmRFdmVudCYgZXZlbnQpCi17Ci0gICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZXZl
bnQgaXMgYSBjaGFyYWN0ZXItdHlwZWQgZXZlbnQgb3Igbm90LgotICAgIC8vIFdlIHVzZSBSYXdL
ZXlEb3duL0NoYXIvS2V5VXAgZXZlbnQgc2NoZW1lIG9uIGFsbCBwbGF0Zm9ybXMsCi0gICAgLy8g
c28gUGxhdGZvcm1LZXlib2FyZEV2ZW50OjpDaGFyIChub3QgUmF3S2V5RG93bikgdHlwZSBldmVu
dAotICAgIC8vIGlzIGNvbnNpZGVyZWQgYXMgY2hhcmFjdGVyIHR5cGUgZXZlbnQuCi0gICAgcmV0
dXJuIGV2ZW50LnR5cGUoKSA9PSBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6OkNoYXI7Ci19Ci0KLWJv
b2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVLZXlFdmVudChjb25zdCBQbGF0Zm9ybUtleWJvYXJkRXZl
bnQmIGV2ZW50KQotewotICAgIGlmIChldmVudC50eXBlKCkgPT0gUGxhdGZvcm1LZXlib2FyZEV2
ZW50OjpLZXlVcCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAobnVtSXRlbXMoKSA9
PSAwICYmIGV2ZW50LndpbmRvd3NWaXJ0dWFsS2V5Q29kZSgpICE9IFZLRVlfRVNDQVBFKQotICAg
ICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHN3aXRjaCAoZXZlbnQud2luZG93c1ZpcnR1YWxLZXlD
b2RlKCkpIHsKLSAgICBjYXNlIFZLRVlfRVNDQVBFOgotICAgICAgICBhYmFuZG9uKCk7ICAvLyBt
YXkgZGVsZXRlIHRoaXMKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBWS0VZX1JFVFVS
TjoKLSAgICAgICAgaWYgKG1fc2VsZWN0ZWRJbmRleCA9PSAtMSkgIHsKLSAgICAgICAgICAgIGhp
ZGVQb3B1cCgpOwotICAgICAgICAgICAgLy8gRG9uJ3QgZWF0IHRoZSBlbnRlciBpZiBub3RoaW5n
IGlzIHNlbGVjdGVkLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAg
ICAgIGFjY2VwdEluZGV4KG1fc2VsZWN0ZWRJbmRleCk7ICAvLyBtYXkgZGVsZXRlIHRoaXMKLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBWS0VZX1VQOgotICAgIGNhc2UgVktFWV9ET1dO
OgotICAgICAgICAvLyBXZSBoYXZlIHRvIGZvcndhcmQgb25seSBzaGlmdCArIHVwIGNvbWJpbmF0
aW9uIHRvIGZvY3VzZWQgbm9kZSB3aGVuIGF1dG9maWxsIHBvcHVwLgotICAgICAgICAvLyBCZWNh
dXNlIGFsbCBjaGFyYWN0ZXJzIGZyb20gdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIHRl
eHQgYXJlYSBzaG91bGQgc2VsZWN0ZWQgd2hlbiB5b3UgcHJlc3Mgc2hpZnQgKyB1cCBhcnJvdy4K
LSAgICAgICAgLy8gc2hpZnQgKyBkb3duIHNob3VsZCBiZSB0aGUgc2ltaWxhciB3YXkgdG8gc2hp
ZnQgKyB1cC4KLSAgICAgICAgaWYgKGV2ZW50Lm1vZGlmaWVycygpICYmIG1fcG9wdXBDbGllbnQt
Pm1lbnVTdHlsZSgpLm1lbnVUeXBlKCkgPT0gUG9wdXBNZW51U3R5bGU6OkF1dG9maWxsUG9wdXAp
Ci0gICAgICAgICAgICBtX2ZvY3VzZWROb2RlLT5kaXNwYXRjaEtleUV2ZW50KGV2ZW50KTsKLSAg
ICAgICAgZWxzZSBpZiAoZXZlbnQud2luZG93c1ZpcnR1YWxLZXlDb2RlKCkgPT0gVktFWV9VUCkK
LSAgICAgICAgICAgIHNlbGVjdFByZXZpb3VzUm93KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAg
ICAgIHNlbGVjdE5leHRSb3coKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWS0VZX1BSSU9S
OgotICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KC1tX3Zpc2libGVSb3dzKTsKLSAgICAgICAg
YnJlYWs7Ci0gICAgY2FzZSBWS0VZX05FWFQ6Ci0gICAgICAgIGFkanVzdFNlbGVjdGVkSW5kZXgo
bV92aXNpYmxlUm93cyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVktFWV9IT01FOgotICAg
ICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KC1tX3NlbGVjdGVkSW5kZXgpOwotICAgICAgICBicmVh
azsKLSAgICBjYXNlIFZLRVlfRU5EOgotICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KG1faXRl
bXMuc2l6ZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKCFl
dmVudC5jdHJsS2V5KCkgJiYgIWV2ZW50LmFsdEtleSgpICYmICFldmVudC5tZXRhS2V5KCkKLSAg
ICAgICAgICAgICYmIGlzUHJpbnRhYmxlQ2hhcihldmVudC53aW5kb3dzVmlydHVhbEtleUNvZGUo
KSkKLSAgICAgICAgICAgICYmIGlzQ2hhcmFjdGVyVHlwZUV2ZW50KGV2ZW50KSkKLSAgICAgICAg
ICAgIHR5cGVBaGVhZEZpbmQoZXZlbnQpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBp
ZiAobV9vcmlnaW5hbEluZGV4ICE9IG1fc2VsZWN0ZWRJbmRleCkgewotICAgICAgICAvLyBLZXli
b2FyZCBldmVudHMgc2hvdWxkIHVwZGF0ZSB0aGUgc2VsZWN0aW9uIGltbWVkaWF0ZWx5IChidXQg
d2UgZG9uJ3QKLSAgICAgICAgLy8gd2FudCB0byBmaXJlIHRoZSBvbmNoYW5nZSBldmVudCB1bnRp
bCB0aGUgcG9wdXAgaXMgY2xvc2VkLCB0byBtYXRjaAotICAgICAgICAvLyBJRSkuICBXZSBjaGFu
Z2UgdGhlIG9yaWdpbmFsIGluZGV4IHNvIHdlIHJldmVydCB0byB0aGF0IHdoZW4gdGhlCi0gICAg
ICAgIC8vIHBvcHVwIGlzIGNsb3NlZC4KLSAgICAgICAgaWYgKG1fc2V0dGluZ3MuYWNjZXB0T25B
YmFuZG9uKQotICAgICAgICAgICAgbV9hY2NlcHRlZEluZGV4T25BYmFuZG9uID0gbV9zZWxlY3Rl
ZEluZGV4OwotCi0gICAgICAgIHNldE9yaWdpbmFsSW5kZXgobV9zZWxlY3RlZEluZGV4KTsKLSAg
ICAgICAgaWYgKG1fc2V0dGluZ3Muc2V0VGV4dE9uSW5kZXhDaGFuZ2UpCi0gICAgICAgICAgICBt
X3BvcHVwQ2xpZW50LT5zZXRUZXh0RnJvbUl0ZW0obV9zZWxlY3RlZEluZGV4KTsKLSAgICB9Ci0g
ICAgaWYgKGV2ZW50LndpbmRvd3NWaXJ0dWFsS2V5Q29kZSgpID09IFZLRVlfVEFCKSB7Ci0gICAg
ICAgIC8vIFRBQiBpcyBhIHNwZWNpYWwgY2FzZSBhcyBpdCBzaG91bGQgc2VsZWN0IHRoZSBjdXJy
ZW50IGl0ZW0gaWYgYW55IGFuZAotICAgICAgICAvLyBhZHZhbmNlIGZvY3VzLgotICAgICAgICBp
ZiAobV9zZWxlY3RlZEluZGV4ID49IDApIHsKLSAgICAgICAgICAgIGFjY2VwdEluZGV4KG1fc2Vs
ZWN0ZWRJbmRleCk7IC8vIE1heSBkZWxldGUgdXMuCi0gICAgICAgICAgICAvLyBSZXR1cm4gZmFs
c2Ugc28gdGhlIFRBQiBrZXkgZXZlbnQgaXMgcHJvcGFnYXRlZCB0byB0aGUgcGFnZS4KLSAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBDYWxsIGFiYW5kb24o
KSBzbyB3ZSBob25vciBtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gaWYgc2V0LgotICAgICAgICBh
YmFuZG9uKCk7Ci0gICAgICAgIC8vIFJldHVybiBmYWxzZSBzbyB0aGUgVEFCIGtleSBldmVudCBp
cyBwcm9wYWdhdGVkIHRvIHRoZSBwYWdlLgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUhvc3RXaW5kb3cqIFBvcHVwTGlzdEJveDo6aG9zdFdp
bmRvdygpIGNvbnN0Ci17Ci0gICAgLy8gT3VyIHBhcmVudCBpcyB0aGUgcm9vdCBTY3JvbGxWaWV3
LCBzbyBpdCBpcyB0aGUgb25lIHRoYXQgaGFzIGEKLSAgICAvLyBIb3N0V2luZG93LiAgRnJhbWVW
aWV3Ojpob3N0V2luZG93KCkgd29ya3Mgc2ltaWxhcmx5LgotICAgIHJldHVybiBwYXJlbnQoKSA/
IHBhcmVudCgpLT5ob3N0V2luZG93KCkgOiAwOwotfQotCi0vLyBGcm9tIEhUTUxTZWxlY3RFbGVt
ZW50LmNwcAotc3RhdGljIFN0cmluZyBzdHJpcExlYWRpbmdXaGl0ZVNwYWNlKGNvbnN0IFN0cmlu
ZyYgc3RyaW5nKQotewotICAgIGludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0gICAgaW50
IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKQotICAgICAgICBpZiAoc3RyaW5n
W2ldICE9IG5vQnJlYWtTcGFjZQotICAgICAgICAgICAgJiYgKHN0cmluZ1tpXSA8PSAweDdGID8g
IWlzc3BhY2Uoc3RyaW5nW2ldKSA6IChkaXJlY3Rpb24oc3RyaW5nW2ldKSAhPSBXaGl0ZVNwYWNl
TmV1dHJhbCkpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICByZXR1cm4gc3RyaW5nLnN1YnN0
cmluZyhpLCBsZW5ndGggLSBpKTsKLX0KLQotLy8gRnJvbSBIVE1MU2VsZWN0RWxlbWVudC5jcHAs
IHdpdGggbW9kaWZpY2F0aW9ucwotdm9pZCBQb3B1cExpc3RCb3g6OnR5cGVBaGVhZEZpbmQoY29u
c3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50JiBldmVudCkKLXsKLSAgICBUaW1lU3RhbXAgbm93ID0g
c3RhdGljX2Nhc3Q8VGltZVN0YW1wPihjdXJyZW50VGltZSgpICogMTAwMC4wZik7Ci0gICAgVGlt
ZVN0YW1wIGRlbHRhID0gbm93IC0gbV9sYXN0Q2hhclRpbWU7Ci0KLSAgICAvLyBSZXNldCB0aGUg
dGltZSB3aGVuIHVzZXIgdHlwZXMgaW4gYSBjaGFyYWN0ZXIuIFRoZSB0aW1lIGdhcCBiZXR3ZWVu
Ci0gICAgLy8gbGFzdCBjaGFyYWN0ZXIgYW5kIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyB1c2Vk
IHRvIGluZGljYXRlIHdoZXRoZXIKLSAgICAvLyB1c2VyIHR5cGVkIGluIGEgc3RyaW5nIG9yIGp1
c3QgYSBjaGFyYWN0ZXIgYXMgdGhlIHNlYXJjaCBwcmVmaXguCi0gICAgbV9sYXN0Q2hhclRpbWUg
PSBub3c7Ci0KLSAgICBVQ2hhciBjID0gZXZlbnQud2luZG93c1ZpcnR1YWxLZXlDb2RlKCk7Ci0K
LSAgICBTdHJpbmcgcHJlZml4OwotICAgIGludCBzZWFyY2hTdGFydE9mZnNldCA9IDE7Ci0gICAg
aWYgKGRlbHRhID4ga1R5cGVBaGVhZFRpbWVvdXRNcykgewotICAgICAgICBtX3R5cGVkU3RyaW5n
ID0gcHJlZml4ID0gU3RyaW5nKCZjLCAxKTsKLSAgICAgICAgbV9yZXBlYXRpbmdDaGFyID0gYzsK
LSAgICB9IGVsc2UgewotICAgICAgICBtX3R5cGVkU3RyaW5nLmFwcGVuZChjKTsKLQotICAgICAg
ICBpZiAoYyA9PSBtX3JlcGVhdGluZ0NoYXIpCi0gICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBs
aWtlbHkgdHJ5aW5nIHRvIGN5Y2xlIHRocm91Z2ggYWxsIHRoZSBpdGVtcyBzdGFydGluZyB3aXRo
IHRoaXMgY2hhcmFjdGVyLCBzbyBqdXN0IHNlYXJjaCBvbiB0aGUgY2hhcmFjdGVyCi0gICAgICAg
ICAgICBwcmVmaXggPSBTdHJpbmcoJmMsIDEpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAg
IG1fcmVwZWF0aW5nQ2hhciA9IDA7Ci0gICAgICAgICAgICBwcmVmaXggPSBtX3R5cGVkU3RyaW5n
OwotICAgICAgICAgICAgc2VhcmNoU3RhcnRPZmZzZXQgPSAwOwotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgLy8gQ29tcHV0ZSBhIGNhc2UtZm9sZGVkIGNvcHkgb2YgdGhlIHByZWZpeCBzdHJpbmcg
YmVmb3JlIGJlZ2lubmluZyB0aGUgc2VhcmNoIGZvcgotICAgIC8vIGEgbWF0Y2hpbmcgZWxlbWVu
dC4gVGhpcyBjb2RlIHVzZXMgZm9sZENhc2UgdG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdAot
ICAgIC8vIFN0cmluZzo6c3RhcnRXaXRoIGRvZXMgbm90IGZvbGQgbm9uLUFTQ0lJIGNoYXJhY3Rl
cnMuIFRoaXMgY29kZSBjYW4gYmUgY2hhbmdlZAotICAgIC8vIHRvIHVzZSBzdGFydFdpdGggb25j
ZSB0aGF0IGlzIGZpeGVkLgotICAgIFN0cmluZyBwcmVmaXhXaXRoQ2FzZUZvbGRlZChwcmVmaXgu
Zm9sZENhc2UoKSk7Ci0gICAgaW50IGl0ZW1Db3VudCA9IG51bUl0ZW1zKCk7Ci0gICAgaW50IGlu
ZGV4ID0gKG1heCgwLCBtX3NlbGVjdGVkSW5kZXgpICsgc2VhcmNoU3RhcnRPZmZzZXQpICUgaXRl
bUNvdW50OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyssIGluZGV4ID0g
KGluZGV4ICsgMSkgJSBpdGVtQ291bnQpIHsKLSAgICAgICAgaWYgKCFpc1NlbGVjdGFibGVJdGVt
KGluZGV4KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGlmIChzdHJpcExlYWRp
bmdXaGl0ZVNwYWNlKG1faXRlbXNbaW5kZXhdLT5sYWJlbCkuZm9sZENhc2UoKS5zdGFydHNXaXRo
KHByZWZpeFdpdGhDYXNlRm9sZGVkKSkgewotICAgICAgICAgICAgc2VsZWN0SW5kZXgoaW5kZXgp
OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFBvcHVw
TGlzdEJveDo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiBnYywgY29uc3QgSW50UmVjdCYgcmVjdCkK
LXsKLSAgICAvLyBhZGp1c3QgY29vcmRzIGZvciBzY3JvbGxlZCBmcmFtZQotICAgIEludFJlY3Qg
ciA9IGludGVyc2VjdGlvbihyZWN0LCBmcmFtZVJlY3QoKSk7Ci0gICAgaW50IHR4ID0geCgpIC0g
c2Nyb2xsWCgpOwotICAgIGludCB0eSA9IHkoKSAtIHNjcm9sbFkoKTsKLQotICAgIHIubW92ZSgt
dHgsIC10eSk7Ci0KLSAgICAvLyBzZXQgY2xpcCByZWN0IHRvIG1hdGNoIHJldmlzZWQgZGFtYWdl
IHJlY3QKLSAgICBnYy0+c2F2ZSgpOwotICAgIGdjLT50cmFuc2xhdGUoc3RhdGljX2Nhc3Q8Zmxv
YXQ+KHR4KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR5KSk7Ci0gICAgZ2MtPmNsaXAocik7Ci0KLSAg
ICAvLyBGSVhNRTogQ2FuIHdlIG9wdGltaXplIHNjcm9sbGluZyB0byBub3QgcmVxdWlyZSByZXBh
aW50aW5nIHRoZSBlbnRpcmUKLSAgICAvLyB3aW5kb3c/ICBTaG91bGQgd2U/Ci0gICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBudW1JdGVtcygpOyArK2kpCi0gICAgICAgIHBhaW50Um93KGdjLCByLCBp
KTsKLQotICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYW4gZW1wdHkgcG9wdXAuCi0gICAgaWYgKG51
bUl0ZW1zKCkgPT0gMCkKLSAgICAgICAgZ2MtPmZpbGxSZWN0KHIsIENvbG9yOjp3aGl0ZSwgQ29s
b3JTcGFjZURldmljZVJHQik7Ci0KLSAgICBnYy0+cmVzdG9yZSgpOwotCi0gICAgU2Nyb2xsVmll
dzo6cGFpbnQoZ2MsIHJlY3QpOwotfQotCi1zdGF0aWMgY29uc3QgaW50IHNlcGFyYXRvclBhZGRp
bmcgPSA0Owotc3RhdGljIGNvbnN0IGludCBzZXBhcmF0b3JIZWlnaHQgPSAxOwotCi12b2lkIFBv
cHVwTGlzdEJveDo6cGFpbnRSb3coR3JhcGhpY3NDb250ZXh0KiBnYywgY29uc3QgSW50UmVjdCYg
cmVjdCwgaW50IHJvd0luZGV4KQotewotICAgIC8vIFRoaXMgY29kZSBpcyBiYXNlZCBsYXJnZWx5
IG9uIFJlbmRlckxpc3RCb3g6OnBhaW50KiBtZXRob2RzLgotCi0gICAgSW50UmVjdCByb3dSZWN0
ID0gZ2V0Um93Qm91bmRzKHJvd0luZGV4KTsKLSAgICBpZiAoIXJvd1JlY3QuaW50ZXJzZWN0cyhy
ZWN0KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUG9wdXBNZW51U3R5bGUgc3R5bGUgPSBtX3Bv
cHVwQ2xpZW50LT5pdGVtU3R5bGUocm93SW5kZXgpOwotCi0gICAgLy8gUGFpbnQgYmFja2dyb3Vu
ZAotICAgIENvbG9yIGJhY2tDb2xvciwgdGV4dENvbG9yLCBsYWJlbENvbG9yOwotICAgIGlmIChy
b3dJbmRleCA9PSBtX3NlbGVjdGVkSW5kZXgpIHsKLSAgICAgICAgYmFja0NvbG9yID0gUmVuZGVy
VGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENv
bG9yKCk7Ci0gICAgICAgIHRleHRDb2xvciA9IFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+
YWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpOwotICAgICAgICBsYWJlbENv
bG9yID0gdGV4dENvbG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJhY2tDb2xvciA9IHN0eWxl
LmJhY2tncm91bmRDb2xvcigpOwotICAgICAgICB0ZXh0Q29sb3IgPSBzdHlsZS5mb3JlZ3JvdW5k
Q29sb3IoKTsKLSAgICAgICAgLy8gRklYTUU6IGZvciBub3cgdGhlIGxhYmVsIGNvbG9yIGlzIGhh
cmQtY29kZWQuIEl0IHNob3VsZCBiZSBhZGRlZCB0bwotICAgICAgICAvLyB0aGUgUG9wdXBNZW51
U3R5bGUuCi0gICAgICAgIGxhYmVsQ29sb3IgPSBDb2xvcigxMTUsIDExNSwgMTE1KTsKLSAgICB9
Ci0KLSAgICAvLyBJZiB3ZSBoYXZlIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCwgbWFrZSBzdXJl
IGl0IGhhcyBhIGNvbG9yIHRvIGJsZW5kCi0gICAgLy8gYWdhaW5zdC4KLSAgICBpZiAoYmFja0Nv
bG9yLmhhc0FscGhhKCkpCi0gICAgICAgIGdjLT5maWxsUmVjdChyb3dSZWN0LCBDb2xvcjo6d2hp
dGUsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwotCi0gICAgZ2MtPmZpbGxSZWN0KHJvd1JlY3QsIGJh
Y2tDb2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0KLSAgICAvLyBJdCBkb2Vzbid0IGxvb2sg
Z29vZCBidXQgQXV0b2ZpbGwgcmVxdWlyZXMgc3BlY2lhbCBzdHlsZSBmb3Igc2VwYXJhdG9yLgot
ICAgIC8vIEF1dG9maWxsIGRvZXNuJ3QgaGF2ZSBwYWRkaW5nIGFuZCAjZGNkY2RjIGNvbG9yLgot
ICAgIGlmIChtX3BvcHVwQ2xpZW50LT5pdGVtSXNTZXBhcmF0b3Iocm93SW5kZXgpKSB7Ci0gICAg
ICAgIGludCBwYWRkaW5nID0gc3R5bGUubWVudVR5cGUoKSA9PSBQb3B1cE1lbnVTdHlsZTo6QXV0
b2ZpbGxQb3B1cCA/IDAgOiBzZXBhcmF0b3JQYWRkaW5nOwotICAgICAgICBJbnRSZWN0IHNlcGFy
YXRvclJlY3QoCi0gICAgICAgICAgICByb3dSZWN0LngoKSArIHBhZGRpbmcsCi0gICAgICAgICAg
ICByb3dSZWN0LnkoKSArIChyb3dSZWN0LmhlaWdodCgpIC0gc2VwYXJhdG9ySGVpZ2h0KSAvIDIs
Ci0gICAgICAgICAgICByb3dSZWN0LndpZHRoKCkgLSAyICogcGFkZGluZywgc2VwYXJhdG9ySGVp
Z2h0KTsKLSAgICAgICAgZ2MtPmZpbGxSZWN0KHNlcGFyYXRvclJlY3QsIHN0eWxlLm1lbnVUeXBl
KCkgPT0gUG9wdXBNZW51U3R5bGU6OkF1dG9maWxsUG9wdXAgPyBDb2xvcigweGRjLCAweGRjLCAw
eGRjKSA6IHRleHRDb2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBpZiAoIXN0eWxlLmlzVmlzaWJsZSgpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBnYy0+c2V0RmlsbENvbG9yKHRleHRDb2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0K
LSAgICBGb250IGl0ZW1Gb250ID0gZ2V0Um93Rm9udChyb3dJbmRleCk7Ci0gICAgLy8gRklYTUU6
IGh0dHA6Ly9jcmJ1Zy5jb20vMTk4NzIgV2Ugc2hvdWxkIGdldCB0aGUgcGFkZGluZyBvZiBpbmRp
dmlkdWFsIG9wdGlvbgotICAgIC8vIGVsZW1lbnRzLiAgVGhpcyBwcm9iYWJseSBpbXBsaWVzIGNo
YW5nZXMgdG8gUG9wdXBNZW51Q2xpZW50LgotICAgIGJvb2wgcmlnaHRBbGlnbmVkID0gbV9wb3B1
cENsaWVudC0+bWVudVN0eWxlKCkudGV4dERpcmVjdGlvbigpID09IFJUTDsKLSAgICBpbnQgdGV4
dFggPSAwOwotICAgIGludCBtYXhXaWR0aCA9IDA7Ci0gICAgaWYgKHJpZ2h0QWxpZ25lZCkKLSAg
ICAgICAgbWF4V2lkdGggPSByb3dSZWN0LndpZHRoKCkgLSBtYXgoMCwgbV9wb3B1cENsaWVudC0+
Y2xpZW50UGFkZGluZ1JpZ2h0KCkgLSBtX3BvcHVwQ2xpZW50LT5jbGllbnRJbnNldFJpZ2h0KCkp
OwotICAgIGVsc2UgewotICAgICAgICB0ZXh0WCA9IG1heCgwLCBtX3BvcHVwQ2xpZW50LT5jbGll
bnRQYWRkaW5nTGVmdCgpIC0gbV9wb3B1cENsaWVudC0+Y2xpZW50SW5zZXRMZWZ0KCkpOwotICAg
ICAgICBtYXhXaWR0aCA9IHJvd1JlY3Qud2lkdGgoKSAtIHRleHRYOwotICAgIH0KLSAgICAvLyBQ
cmVwYXJlIHRleHQgdG8gYmUgZHJhd24uCi0gICAgU3RyaW5nIGl0ZW1UZXh0ID0gbV9wb3B1cENs
aWVudC0+aXRlbVRleHQocm93SW5kZXgpOwotICAgIFN0cmluZyBpdGVtTGFiZWwgPSBtX3BvcHVw
Q2xpZW50LT5pdGVtTGFiZWwocm93SW5kZXgpOwotICAgIFN0cmluZyBpdGVtSWNvbiA9IG1fcG9w
dXBDbGllbnQtPml0ZW1JY29uKHJvd0luZGV4KTsKLSAgICBpZiAobV9zZXR0aW5ncy5yZXN0cmlj
dFdpZHRoT2ZMaXN0Qm94KSB7IC8vIFRydW5jYXRlIHN0cmluZ3MgdG8gZml0IGluLgotICAgICAg
ICAvLyBGSVhNRTogV2Ugc2hvdWxkIGxlZnRUcnVuY2F0ZSBmb3IgdGhlIHJ0bCBjYXNlLgotICAg
ICAgICAvLyBTdHJpbmdUcnVuY2F0b3I6OmxlZnRUcnVuY2F0ZSB3b3VsZCBoYXZlIHRvIGJlIGlt
cGxlbWVudGVkLgotICAgICAgICBTdHJpbmcgc3RyID0gU3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRy
dW5jYXRlKGl0ZW1UZXh0LCBtYXhXaWR0aCwgaXRlbUZvbnQpOwotICAgICAgICBpZiAoc3RyICE9
IGl0ZW1UZXh0KSB7Ci0gICAgICAgICAgICBpdGVtVGV4dCA9IHN0cjsKLSAgICAgICAgICAgIC8v
IERvbid0IGRpc3BsYXkgdGhlIGxhYmVsIG9yIGljb24sIHdlIGFscmVhZHkgZG9uJ3QgaGF2ZSBl
bm91Z2ggcm9vbSBmb3IgdGhlIGl0ZW0gdGV4dC4KLSAgICAgICAgICAgIGl0ZW1MYWJlbCA9ICIi
OwotICAgICAgICAgICAgaXRlbUljb24gPSAiIjsKLSAgICAgICAgfSBlbHNlIGlmICghaXRlbUxh
YmVsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaW50IGF2YWlsYWJsZVdpZHRoID0gbWF4V2lk
dGggLSBrVGV4dFRvTGFiZWxQYWRkaW5nIC0KLSAgICAgICAgICAgICAgICBTdHJpbmdUcnVuY2F0
b3I6OndpZHRoKGl0ZW1UZXh0LCBpdGVtRm9udCk7Ci0gICAgICAgICAgICBpdGVtTGFiZWwgPSBT
dHJpbmdUcnVuY2F0b3I6OnJpZ2h0VHJ1bmNhdGUoaXRlbUxhYmVsLCBhdmFpbGFibGVXaWR0aCwg
aXRlbUZvbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUHJlcGFyZSB0aGUgZGlyZWN0
aW9uYWxpdHkgdG8gZHJhdyB0ZXh0LgotICAgIFRleHRSdW4gdGV4dFJ1bihpdGVtVGV4dC5jaGFy
YWN0ZXJzKCksIGl0ZW1UZXh0Lmxlbmd0aCgpLCBmYWxzZSwgMCwgMCwgVGV4dFJ1bjo6QWxsb3dU
cmFpbGluZ0V4cGFuc2lvbiwgc3R5bGUudGV4dERpcmVjdGlvbigpLCBzdHlsZS5oYXNUZXh0RGly
ZWN0aW9uT3ZlcnJpZGUoKSk7Ci0gICAgLy8gSWYgdGhlIHRleHQgaXMgcmlnaHQtdG8tbGVmdCwg
bWFrZSBpdCByaWdodC1hbGlnbmVkIGJ5IGFkanVzdGluZyBpdHMKLSAgICAvLyBiZWdpbm5pbmcg
cG9zaXRpb24uCi0gICAgaWYgKHJpZ2h0QWxpZ25lZCkKLSAgICAgICAgdGV4dFggKz0gbWF4V2lk
dGggLSBpdGVtRm9udC53aWR0aCh0ZXh0UnVuKTsKLQotICAgIC8vIERyYXcgdGhlIGl0ZW0gdGV4
dC4KLSAgICBpbnQgdGV4dFkgPSByb3dSZWN0LnkoKSArIGl0ZW1Gb250LmZvbnRNZXRyaWNzKCku
YXNjZW50KCkgKyAocm93UmVjdC5oZWlnaHQoKSAtIGl0ZW1Gb250LmZvbnRNZXRyaWNzKCkuaGVp
Z2h0KCkpIC8gMjsKLSAgICBnYy0+ZHJhd0JpZGlUZXh0KGl0ZW1Gb250LCB0ZXh0UnVuLCBJbnRQ
b2ludCh0ZXh0WCwgdGV4dFkpKTsKLQotICAgIC8vIFdlIGFyZSB1c2luZyB0aGUgbGVmdCBwYWRk
aW5nIGFzIHRoZSByaWdodCBwYWRkaW5nIGluY2x1ZGVzIHJvb20gZm9yIHRoZSBzY3JvbGwtYmFy
IHdoaWNoCi0gICAgLy8gZG9lcyBub3Qgc2hvdyBpbiB0aGlzIGNhc2UuCi0gICAgaW50IHJpZ2h0
UGFkZGluZyA9IG1heCgwLCBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nTGVmdCgpIC0gbV9w
b3B1cENsaWVudC0+Y2xpZW50SW5zZXRMZWZ0KCkpOwotICAgIGludCByZW1haW5pbmdXaWR0aCA9
IHJvd1JlY3Qud2lkdGgoKSAtIHJpZ2h0UGFkZGluZzsKLQotICAgIC8vIERyYXcgdGhlIGljb24g
aWYgYXBwbGljYWJsZS4KLSAgICBSZWZQdHI8SW1hZ2U+IGltYWdlKEltYWdlOjpsb2FkUGxhdGZv
cm1SZXNvdXJjZShpdGVtSWNvbi51dGY4KCkuZGF0YSgpKSk7Ci0gICAgaWYgKGltYWdlICYmICFp
bWFnZS0+aXNOdWxsKCkpIHsKLSAgICAgICAgSW50UmVjdCBpbWFnZVJlY3QgPSBpbWFnZS0+cmVj
dCgpOwotICAgICAgICByZW1haW5pbmdXaWR0aCAtPSAoaW1hZ2VSZWN0LndpZHRoKCkgKyBrTGFi
ZWxUb0ljb25QYWRkaW5nKTsKLSAgICAgICAgaW1hZ2VSZWN0LnNldFgocm93UmVjdC53aWR0aCgp
IC0gcmlnaHRQYWRkaW5nIC0gaW1hZ2VSZWN0LndpZHRoKCkpOwotICAgICAgICBpbWFnZVJlY3Qu
c2V0WShyb3dSZWN0LnkoKSArIChyb3dSZWN0LmhlaWdodCgpIC0gaW1hZ2VSZWN0LmhlaWdodCgp
KSAvIDIpOwotICAgICAgICBnYy0+ZHJhd0ltYWdlKGltYWdlLmdldCgpLCBDb2xvclNwYWNlRGV2
aWNlUkdCLCBpbWFnZVJlY3QpOwotICAgIH0KLQotICAgIC8vIERyYXcgdGhlIHRoZSBsYWJlbCBp
ZiBhcHBsaWNhYmxlLgotICAgIGlmIChpdGVtTGFiZWwuaXNFbXB0eSgpKQotICAgICAgICByZXR1
cm47Ci0KLSAgICAvLyBBdXRvZmlsbCBsYWJlbCBpcyAwLjkgc21hbGxlciB0aGFuIHJlZ3VsYXIg
Zm9udCBzaXplLgotICAgIGlmIChzdHlsZS5tZW51VHlwZSgpID09IFBvcHVwTWVudVN0eWxlOjpB
dXRvZmlsbFBvcHVwKSB7Ci0gICAgICAgIGl0ZW1Gb250ID0gbV9wb3B1cENsaWVudC0+aXRlbVN0
eWxlKHJvd0luZGV4KS5mb250KCk7Ci0gICAgICAgIEZvbnREZXNjcmlwdGlvbiBkID0gaXRlbUZv
bnQuZm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGQuc2V0Q29tcHV0ZWRTaXplKGQuY29tcHV0
ZWRTaXplKCkgKiAwLjkpOwotICAgICAgICBpdGVtRm9udCA9IEZvbnQoZCwgaXRlbUZvbnQubGV0
dGVyU3BhY2luZygpLCBpdGVtRm9udC53b3JkU3BhY2luZygpKTsKLSAgICAgICAgaXRlbUZvbnQu
dXBkYXRlKDApOwotICAgIH0KLQotICAgIFRleHRSdW4gbGFiZWxUZXh0UnVuKGl0ZW1MYWJlbC5j
aGFyYWN0ZXJzKCksIGl0ZW1MYWJlbC5sZW5ndGgoKSwgZmFsc2UsIDAsIDAsIFRleHRSdW46OkFs
bG93VHJhaWxpbmdFeHBhbnNpb24sIHN0eWxlLnRleHREaXJlY3Rpb24oKSwgc3R5bGUuaGFzVGV4
dERpcmVjdGlvbk92ZXJyaWRlKCkpOwotICAgIGlmIChyaWdodEFsaWduZWQpCi0gICAgICAgIHRl
eHRYID0gbWF4KDAsIG1fcG9wdXBDbGllbnQtPmNsaWVudFBhZGRpbmdMZWZ0KCkgLSBtX3BvcHVw
Q2xpZW50LT5jbGllbnRJbnNldExlZnQoKSk7Ci0gICAgZWxzZQotICAgICAgICB0ZXh0WCA9IHJl
bWFpbmluZ1dpZHRoIC0gaXRlbUZvbnQud2lkdGgobGFiZWxUZXh0UnVuKTsKLQotICAgIGdjLT5z
ZXRGaWxsQ29sb3IobGFiZWxDb2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0gICAgZ2MtPmRy
YXdCaWRpVGV4dChpdGVtRm9udCwgbGFiZWxUZXh0UnVuLCBJbnRQb2ludCh0ZXh0WCwgdGV4dFkp
KTsKLX0KLQotRm9udCBQb3B1cExpc3RCb3g6OmdldFJvd0ZvbnQoaW50IHJvd0luZGV4KQotewot
ICAgIEZvbnQgaXRlbUZvbnQgPSBtX3BvcHVwQ2xpZW50LT5pdGVtU3R5bGUocm93SW5kZXgpLmZv
bnQoKTsKLSAgICBpZiAobV9wb3B1cENsaWVudC0+aXRlbUlzTGFiZWwocm93SW5kZXgpKSB7Ci0g
ICAgICAgIC8vIEJvbGQtaWZ5IGxhYmVscyAoaWUsIGFuIDxvcHRncm91cD4gaGVhZGluZykuCi0g
ICAgICAgIEZvbnREZXNjcmlwdGlvbiBkID0gaXRlbUZvbnQuZm9udERlc2NyaXB0aW9uKCk7Ci0g
ICAgICAgIGQuc2V0V2VpZ2h0KEZvbnRXZWlnaHRCb2xkKTsKLSAgICAgICAgRm9udCBmb250KGQs
IGl0ZW1Gb250LmxldHRlclNwYWNpbmcoKSwgaXRlbUZvbnQud29yZFNwYWNpbmcoKSk7Ci0gICAg
ICAgIGZvbnQudXBkYXRlKDApOwotICAgICAgICByZXR1cm4gZm9udDsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gaXRlbUZvbnQ7Ci19Ci0KLXZvaWQgUG9wdXBMaXN0Qm94OjphYmFuZG9uKCkKLXsKLSAg
ICBSZWZQdHI8UG9wdXBMaXN0Qm94PiBrZWVwQWxpdmUodGhpcyk7Ci0KLSAgICBtX3NlbGVjdGVk
SW5kZXggPSBtX29yaWdpbmFsSW5kZXg7Ci0KLSAgICBoaWRlUG9wdXAoKTsKLQotICAgIGlmICht
X2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gPj0gMCkgewotICAgICAgICBpZiAobV9wb3B1cENsaWVu
dCkKLSAgICAgICAgICAgIG1fcG9wdXBDbGllbnQtPnZhbHVlQ2hhbmdlZChtX2FjY2VwdGVkSW5k
ZXhPbkFiYW5kb24pOwotICAgICAgICBtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gPSAtMTsKLSAg
ICB9Ci19Ci0KLWludCBQb3B1cExpc3RCb3g6OnBvaW50VG9Sb3dJbmRleChjb25zdCBJbnRQb2lu
dCYgcG9pbnQpCi17Ci0gICAgaW50IHkgPSBzY3JvbGxZKCkgKyBwb2ludC55KCk7Ci0KLSAgICAv
LyBGSVhNRTogYmluYXJ5IHNlYXJjaCBpZiBwZXJmIG1hdHRlcnMuCi0gICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBudW1JdGVtcygpOyArK2kpIHsKLSAgICAgICAgaWYgKHkgPCBtX2l0ZW1zW2ldLT55
T2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGktMTsKLSAgICB9Ci0KLSAgICAvLyBMYXN0IGl0
ZW0/Ci0gICAgaWYgKHkgPCBjb250ZW50c0hlaWdodCgpKQotICAgICAgICByZXR1cm4gbV9pdGVt
cy5zaXplKCktMTsKLQotICAgIHJldHVybiAtMTsKLX0KLQotYm9vbCBQb3B1cExpc3RCb3g6OmFj
Y2VwdEluZGV4KGludCBpbmRleCkKLXsKLSAgICAvLyBDbGVhciBtX2FjY2VwdGVkSW5kZXhPbkFi
YW5kb24gb25jZSB1c2VyIGFjY2VwdHMgdGhlIHNlbGVjdGVkIGluZGV4LgotICAgIGlmIChtX2Fj
Y2VwdGVkSW5kZXhPbkFiYW5kb24gPj0gMCkKLSAgICAgICAgbV9hY2NlcHRlZEluZGV4T25BYmFu
ZG9uID0gLTE7Ci0KLSAgICBpZiAoaW5kZXggPj0gbnVtSXRlbXMoKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBpZiAobV9wb3B1cENsaWVu
dCkgewotICAgICAgICAgICAgLy8gRW50ZXIgcHJlc3NlZCB3aXRoIG5vIHNlbGVjdGlvbiwganVz
dCBjbG9zZSB0aGUgcG9wdXAuCi0gICAgICAgICAgICBoaWRlUG9wdXAoKTsKLSAgICAgICAgfQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGlzU2VsZWN0YWJsZUl0ZW0o
aW5kZXgpKSB7Ci0gICAgICAgIFJlZlB0cjxQb3B1cExpc3RCb3g+IGtlZXBBbGl2ZSh0aGlzKTsK
LQotICAgICAgICAvLyBIaWRlIG91cnNlbHZlcyBmaXJzdCBzaW5jZSB2YWx1ZUNoYW5nZWQgbWF5
IGhhdmUgbnVtZXJvdXMgc2lkZS1lZmZlY3RzLgotICAgICAgICBoaWRlUG9wdXAoKTsKLQotICAg
ICAgICAvLyBUZWxsIHRoZSA8c2VsZWN0PiBQb3B1cE1lbnVDbGllbnQgd2hhdCBpbmRleCB3YXMg
c2VsZWN0ZWQuCi0gICAgICAgIG1fcG9wdXBDbGllbnQtPnZhbHVlQ2hhbmdlZChpbmRleCk7Ci0K
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12
b2lkIFBvcHVwTGlzdEJveDo6c2VsZWN0SW5kZXgoaW50IGluZGV4KQotewotICAgIGlmIChpbmRl
eCA8IDAgfHwgaW5kZXggPj0gbnVtSXRlbXMoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYm9v
bCBpc1NlbGVjdGFibGUgPSBpc1NlbGVjdGFibGVJdGVtKGluZGV4KTsKLSAgICBpZiAoaW5kZXgg
IT0gbV9zZWxlY3RlZEluZGV4ICYmIGlzU2VsZWN0YWJsZSkgewotICAgICAgICBpbnZhbGlkYXRl
Um93KG1fc2VsZWN0ZWRJbmRleCk7Ci0gICAgICAgIG1fc2VsZWN0ZWRJbmRleCA9IGluZGV4Owot
ICAgICAgICBpbnZhbGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7Ci0KLSAgICAgICAgc2Nyb2xs
VG9SZXZlYWxTZWxlY3Rpb24oKTsKLSAgICAgICAgbV9wb3B1cENsaWVudC0+c2VsZWN0aW9uQ2hh
bmdlZChtX3NlbGVjdGVkSW5kZXgpOwotICAgIH0gZWxzZSBpZiAoIWlzU2VsZWN0YWJsZSkgewot
ICAgICAgICBjbGVhclNlbGVjdGlvbigpOwotICAgIH0KLX0KLQotdm9pZCBQb3B1cExpc3RCb3g6
OnNldE9yaWdpbmFsSW5kZXgoaW50IGluZGV4KQotewotICAgIG1fb3JpZ2luYWxJbmRleCA9IG1f
c2VsZWN0ZWRJbmRleCA9IGluZGV4OwotfQotCi1pbnQgUG9wdXBMaXN0Qm94OjpnZXRSb3dIZWln
aHQoaW50IGluZGV4KQotewotICAgIGlmIChpbmRleCA8IDApCi0gICAgICAgIHJldHVybiBQb3B1
cE1lbnVDaHJvbWl1bTo6bWluaW11bVJvd0hlaWdodCgpOwotCi0gICAgaWYgKG1fcG9wdXBDbGll
bnQtPml0ZW1TdHlsZShpbmRleCkuaXNEaXNwbGF5Tm9uZSgpKQotICAgICAgICByZXR1cm4gUG9w
dXBNZW51Q2hyb21pdW06Om1pbmltdW1Sb3dIZWlnaHQoKTsKLQotICAgIC8vIFNlcGFyYXRvciBy
b3cgaGVpZ2h0IGlzIHRoZSBzYW1lIHNpemUgYXMgaXRzZWxmLgotICAgIGlmIChtX3BvcHVwQ2xp
ZW50LT5pdGVtSXNTZXBhcmF0b3IoaW5kZXgpKQotICAgICAgICByZXR1cm4gbWF4KHNlcGFyYXRv
ckhlaWdodCwgUG9wdXBNZW51Q2hyb21pdW06Om1pbmltdW1Sb3dIZWlnaHQoKSk7Ci0KLSAgICBT
dHJpbmcgaWNvbiA9IG1fcG9wdXBDbGllbnQtPml0ZW1JY29uKGluZGV4KTsKLSAgICBSZWZQdHI8
SW1hZ2U+IGltYWdlKEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShpY29uLnV0ZjgoKS5kYXRh
KCkpKTsKLQotICAgIGludCBmb250SGVpZ2h0ID0gZ2V0Um93Rm9udChpbmRleCkuZm9udE1ldHJp
Y3MoKS5oZWlnaHQoKTsKLSAgICBpbnQgaWNvbkhlaWdodCA9IChpbWFnZSAmJiAhaW1hZ2UtPmlz
TnVsbCgpKSA/IGltYWdlLT5yZWN0KCkuaGVpZ2h0KCkgOiAwOwotCi0gICAgaW50IGxpbmVQYWRk
aW5nSGVpZ2h0ID0gbV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkubWVudVR5cGUoKSA9PSBQb3B1
cE1lbnVTdHlsZTo6QXV0b2ZpbGxQb3B1cCA/IGtMaW5lUGFkZGluZ0hlaWdodCA6IDA7Ci0gICAg
aW50IGNhbGN1bGF0ZWRSb3dIZWlnaHQgPSBtYXgoZm9udEhlaWdodCwgaWNvbkhlaWdodCkgKyBs
aW5lUGFkZGluZ0hlaWdodCAqIDI7Ci0gICAgcmV0dXJuIG1heChjYWxjdWxhdGVkUm93SGVpZ2h0
LCBQb3B1cE1lbnVDaHJvbWl1bTo6bWluaW11bVJvd0hlaWdodCgpKTsKLX0KLQotSW50UmVjdCBQ
b3B1cExpc3RCb3g6OmdldFJvd0JvdW5kcyhpbnQgaW5kZXgpCi17Ci0gICAgaWYgKGluZGV4IDwg
MCkKLSAgICAgICAgcmV0dXJuIEludFJlY3QoMCwgMCwgdmlzaWJsZVdpZHRoKCksIGdldFJvd0hl
aWdodChpbmRleCkpOwotCi0gICAgcmV0dXJuIEludFJlY3QoMCwgbV9pdGVtc1tpbmRleF0tPnlP
ZmZzZXQsIHZpc2libGVXaWR0aCgpLCBnZXRSb3dIZWlnaHQoaW5kZXgpKTsKLX0KLQotdm9pZCBQ
b3B1cExpc3RCb3g6OmludmFsaWRhdGVSb3coaW50IGluZGV4KQotewotICAgIGlmIChpbmRleCA8
IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEludmFsaWRhdGUgaW4gdGhlIHdpbmRvdyBj
b250ZW50cywgYXMgRnJhbWVsZXNzU2Nyb2xsVmlldzo6aW52YWxpZGF0ZVJlY3QKLSAgICAvLyBw
YWludHMgaW4gdGhlIHdpbmRvdyBjb29yZGluYXRlcy4KLSAgICBpbnZhbGlkYXRlUmVjdChjb250
ZW50c1RvV2luZG93KGdldFJvd0JvdW5kcyhpbmRleCkpKTsKLX0KLQotdm9pZCBQb3B1cExpc3RC
b3g6OnNjcm9sbFRvUmV2ZWFsUm93KGludCBpbmRleCkKLXsKLSAgICBpZiAoaW5kZXggPCAwKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBJbnRSZWN0IHJvd1JlY3QgPSBnZXRSb3dCb3VuZHMoaW5k
ZXgpOwotCi0gICAgaWYgKHJvd1JlY3QueSgpIDwgc2Nyb2xsWSgpKSB7Ci0gICAgICAgIC8vIFJv
dyBpcyBhYm92ZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiwgc2Nyb2xsIHVwLgotICAgICAgICBT
Y3JvbGxWaWV3OjpzZXRTY3JvbGxQb3NpdGlvbihJbnRQb2ludCgwLCByb3dSZWN0LnkoKSkpOwot
ICAgIH0gZWxzZSBpZiAocm93UmVjdC5tYXhZKCkgPiBzY3JvbGxZKCkgKyB2aXNpYmxlSGVpZ2h0
KCkpIHsKLSAgICAgICAgLy8gUm93IGlzIGJlbG93IGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uLCBz
Y3JvbGwgZG93bi4KLSAgICAgICAgU2Nyb2xsVmlldzo6c2V0U2Nyb2xsUG9zaXRpb24oSW50UG9p
bnQoMCwgcm93UmVjdC5tYXhZKCkgLSB2aXNpYmxlSGVpZ2h0KCkpKTsKLSAgICB9Ci19Ci0KLWJv
b2wgUG9wdXBMaXN0Qm94Ojppc1NlbGVjdGFibGVJdGVtKGludCBpbmRleCkKLXsKLSAgICBBU1NF
UlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51bUl0ZW1zKCkpOwotICAgIHJldHVybiBtX2l0ZW1z
W2luZGV4XS0+dHlwZSA9PSBQb3B1cEl0ZW06OlR5cGVPcHRpb24gJiYgbV9wb3B1cENsaWVudC0+
aXRlbUlzRW5hYmxlZChpbmRleCk7Ci19Ci0KLXZvaWQgUG9wdXBMaXN0Qm94OjpjbGVhclNlbGVj
dGlvbigpCi17Ci0gICAgaWYgKG1fc2VsZWN0ZWRJbmRleCAhPSAtMSkgewotICAgICAgICBpbnZh
bGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7Ci0gICAgICAgIG1fc2VsZWN0ZWRJbmRleCA9IC0x
OwotICAgICAgICBtX3BvcHVwQ2xpZW50LT5zZWxlY3Rpb25DbGVhcmVkKCk7Ci0gICAgfQotfQot
Ci12b2lkIFBvcHVwTGlzdEJveDo6c2VsZWN0TmV4dFJvdygpCi17Ci0gICAgaWYgKCFtX3NldHRp
bmdzLmxvb3BTZWxlY3Rpb25OYXZpZ2F0aW9uIHx8IG1fc2VsZWN0ZWRJbmRleCAhPSBudW1JdGVt
cygpIC0gMSkgewotICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KDEpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgLy8gV2UgYXJlIG1vdmluZyBwYXN0IHRoZSBsYXN0IGl0ZW0sIG5v
IHJvdyBzaG91bGQgYmUgc2VsZWN0ZWQuCi0gICAgY2xlYXJTZWxlY3Rpb24oKTsKLX0KLQotdm9p
ZCBQb3B1cExpc3RCb3g6OnNlbGVjdFByZXZpb3VzUm93KCkKLXsKLSAgICBpZiAoIW1fc2V0dGlu
Z3MubG9vcFNlbGVjdGlvbk5hdmlnYXRpb24gfHwgbV9zZWxlY3RlZEluZGV4ID4gMCkgewotICAg
ICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KC0xKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIGlmIChtX3NlbGVjdGVkSW5kZXggPT0gMCkgewotICAgICAgICAvLyBXZSBhcmUgbW92aW5n
IHBhc3QgdGhlIGZpcnN0IGl0ZW0sIGNsZWFyIHRoZSBzZWxlY3Rpb24uCi0gICAgICAgIGNsZWFy
U2VsZWN0aW9uKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBObyByb3cgaXMg
c2VsZWN0ZWQsIGp1bXAgdG8gdGhlIGxhc3QgaXRlbS4KLSAgICBzZWxlY3RJbmRleChudW1JdGVt
cygpIC0gMSk7Ci0gICAgc2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24oKTsKLX0KLQotdm9pZCBQb3B1
cExpc3RCb3g6OmFkanVzdFNlbGVjdGVkSW5kZXgoaW50IGRlbHRhKQotewotICAgIGludCB0YXJn
ZXRJbmRleCA9IG1fc2VsZWN0ZWRJbmRleCArIGRlbHRhOwotICAgIHRhcmdldEluZGV4ID0gbWlu
KG1heCh0YXJnZXRJbmRleCwgMCksIG51bUl0ZW1zKCkgLSAxKTsKLSAgICBpZiAoIWlzU2VsZWN0
YWJsZUl0ZW0odGFyZ2V0SW5kZXgpKSB7Ci0gICAgICAgIC8vIFdlIGRpZG4ndCBsYW5kIG9uIGFu
IG9wdGlvbi4gIFRyeSB0byBmaW5kIG9uZS4KLSAgICAgICAgLy8gV2UgdHJ5IHRvIHNlbGVjdCB0
aGUgY2xvc2VzdCBpbmRleCB0byB0YXJnZXQsIHByaW9yaXRpemluZyBhbnkgaW4KLSAgICAgICAg
Ly8gdGhlIHJhbmdlIFtjdXJyZW50LCB0YXJnZXRdLgotCi0gICAgICAgIGludCBkaXIgPSBkZWx0
YSA+IDAgPyAxIDogLTE7Ci0gICAgICAgIGludCB0ZXN0SW5kZXggPSBtX3NlbGVjdGVkSW5kZXg7
Ci0gICAgICAgIGludCBiZXN0SW5kZXggPSBtX3NlbGVjdGVkSW5kZXg7Ci0gICAgICAgIGJvb2wg
cGFzc2VkVGFyZ2V0ID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlICh0ZXN0SW5kZXggPj0gMCAmJiB0
ZXN0SW5kZXggPCBudW1JdGVtcygpKSB7Ci0gICAgICAgICAgICBpZiAoaXNTZWxlY3RhYmxlSXRl
bSh0ZXN0SW5kZXgpKQotICAgICAgICAgICAgICAgIGJlc3RJbmRleCA9IHRlc3RJbmRleDsKLSAg
ICAgICAgICAgIGlmICh0ZXN0SW5kZXggPT0gdGFyZ2V0SW5kZXgpCi0gICAgICAgICAgICAgICAg
cGFzc2VkVGFyZ2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChwYXNzZWRUYXJnZXQgJiYgYmVz
dEluZGV4ICE9IG1fc2VsZWN0ZWRJbmRleCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAg
ICAgICAgICAgdGVzdEluZGV4ICs9IGRpcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFBpY2sg
dGhlIGJlc3QgaW5kZXgsIHdoaWNoIG1heSBtZWFuIHdlIGRvbid0IGNoYW5nZS4KLSAgICAgICAg
dGFyZ2V0SW5kZXggPSBiZXN0SW5kZXg7Ci0gICAgfQotCi0gICAgLy8gU2VsZWN0IHRoZSBuZXcg
aW5kZXgsIGFuZCBlbnN1cmUgaXRzIHZpc2libGUuICBXZSBkbyB0aGlzIHJlZ2FyZGxlc3Mgb2YK
LSAgICAvLyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlZCB0byBlbnN1cmUga2V5Ym9hcmQg
ZXZlbnRzIGFsd2F5cyBicmluZyB0aGUKLSAgICAvLyBzZWxlY3Rpb24gaW50byB2aWV3LgotICAg
IHNlbGVjdEluZGV4KHRhcmdldEluZGV4KTsKLSAgICBzY3JvbGxUb1JldmVhbFNlbGVjdGlvbigp
OwotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6aGlkZVBvcHVwKCkKLXsKLSAgICBpZiAocGFyZW50
KCkpIHsKLSAgICAgICAgUG9wdXBDb250YWluZXIqIGNvbnRhaW5lciA9IHN0YXRpY19jYXN0PFBv
cHVwQ29udGFpbmVyKj4ocGFyZW50KCkpOwotICAgICAgICBpZiAoY29udGFpbmVyLT5jbGllbnQo
KSkKLSAgICAgICAgICAgIGNvbnRhaW5lci0+Y2xpZW50KCktPnBvcHVwQ2xvc2VkKGNvbnRhaW5l
cik7Ci0gICAgICAgIGNvbnRhaW5lci0+bm90aWZ5UG9wdXBIaWRkZW4oKTsKLSAgICB9Ci0KLSAg
ICBpZiAobV9wb3B1cENsaWVudCkKLSAgICAgICAgbV9wb3B1cENsaWVudC0+cG9wdXBEaWRIaWRl
KCk7Ci19Ci0KLXZvaWQgUG9wdXBMaXN0Qm94Ojp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0gICAg
Y2xlYXIoKTsKLQotICAgIGludCBzaXplID0gbV9wb3B1cENsaWVudC0+bGlzdFNpemUoKTsKLSAg
ICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBQb3B1cEl0ZW06OlR5
cGUgdHlwZTsKLSAgICAgICAgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1Jc1NlcGFyYXRvcihpKSkK
LSAgICAgICAgICAgIHR5cGUgPSBQb3B1cEl0ZW06OlR5cGVTZXBhcmF0b3I7Ci0gICAgICAgIGVs
c2UgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1Jc0xhYmVsKGkpKQotICAgICAgICAgICAgdHlwZSA9
IFBvcHVwSXRlbTo6VHlwZUdyb3VwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0eXBlID0g
UG9wdXBJdGVtOjpUeXBlT3B0aW9uOwotICAgICAgICBtX2l0ZW1zLmFwcGVuZChuZXcgUG9wdXBJ
dGVtKG1fcG9wdXBDbGllbnQtPml0ZW1UZXh0KGkpLCB0eXBlKSk7Ci0gICAgICAgIG1faXRlbXNb
aV0tPmVuYWJsZWQgPSBpc1NlbGVjdGFibGVJdGVtKGkpOwotICAgICAgICBQb3B1cE1lbnVTdHls
ZSBzdHlsZSA9IG1fcG9wdXBDbGllbnQtPml0ZW1TdHlsZShpKTsKLSAgICAgICAgbV9pdGVtc1tp
XS0+dGV4dERpcmVjdGlvbiA9IHN0eWxlLnRleHREaXJlY3Rpb24oKTsKLSAgICAgICAgbV9pdGVt
c1tpXS0+aGFzVGV4dERpcmVjdGlvbk92ZXJyaWRlID0gc3R5bGUuaGFzVGV4dERpcmVjdGlvbk92
ZXJyaWRlKCk7Ci0gICAgfQotCi0gICAgbV9zZWxlY3RlZEluZGV4ID0gbV9wb3B1cENsaWVudC0+
c2VsZWN0ZWRJbmRleCgpOwotICAgIHNldE9yaWdpbmFsSW5kZXgobV9zZWxlY3RlZEluZGV4KTsK
LQotICAgIGxheW91dCgpOwotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6c2V0TWF4V2lkdGhBbmRM
YXlvdXQoaW50IG1heFdpZHRoKQotewotICAgIG1fbWF4V2luZG93V2lkdGggPSBtYXhXaWR0aDsK
LSAgICBsYXlvdXQoKTsKLX0KLQotdm9pZCBQb3B1cExpc3RCb3g6OmxheW91dCgpCi17Ci0gICAg
Ym9vbCBpc1JpZ2h0QWxpZ25lZCA9IG1fcG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpLnRleHREaXJl
Y3Rpb24oKSA9PSBSVEw7Ci0gICAgCi0gICAgLy8gU2l6ZSBvdXIgY2hpbGQgaXRlbXMuCi0gICAg
aW50IGJhc2VXaWR0aCA9IDA7Ci0gICAgaW50IHBhZGRpbmdXaWR0aCA9IDA7Ci0gICAgaW50IGxp
bmVFbmRQYWRkaW5nV2lkdGggPSAwOwotICAgIGludCB5ID0gMDsKLSAgICBmb3IgKGludCBpID0g
MDsgaSA8IG51bUl0ZW1zKCk7ICsraSkgewotICAgICAgICAvLyBQbGFjZSB0aGUgaXRlbSB2ZXJ0
aWNhbGx5LgotICAgICAgICBtX2l0ZW1zW2ldLT55T2Zmc2V0ID0geTsKLSAgICAgICAgaWYgKG1f
cG9wdXBDbGllbnQtPml0ZW1TdHlsZShpKS5pc0Rpc3BsYXlOb25lKCkpCi0gICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgeSArPSBnZXRSb3dIZWlnaHQoaSk7Ci0KLSAgICAgICAgLy8gRW5z
dXJlIHRoZSBwb3B1cCBpcyB3aWRlIGVub3VnaCB0byBmaXQgdGhpcyBpdGVtLgotICAgICAgICBG
b250IGl0ZW1Gb250ID0gZ2V0Um93Rm9udChpKTsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBtX3Bv
cHVwQ2xpZW50LT5pdGVtVGV4dChpKTsKLSAgICAgICAgU3RyaW5nIGxhYmVsID0gbV9wb3B1cENs
aWVudC0+aXRlbUxhYmVsKGkpOwotICAgICAgICBTdHJpbmcgaWNvbiA9IG1fcG9wdXBDbGllbnQt
Pml0ZW1JY29uKGkpOwotICAgICAgICBSZWZQdHI8SW1hZ2U+IGljb25JbWFnZShJbWFnZTo6bG9h
ZFBsYXRmb3JtUmVzb3VyY2UoaWNvbi51dGY4KCkuZGF0YSgpKSk7Ci0gICAgICAgIGludCB3aWR0
aCA9IDA7Ci0gICAgICAgIGlmICghdGV4dC5pc0VtcHR5KCkpCi0gICAgICAgICAgICB3aWR0aCA9
IGl0ZW1Gb250LndpZHRoKFRleHRSdW4odGV4dCkpOwotICAgICAgICBpZiAoIWxhYmVsLmlzRW1w
dHkoKSkgewotICAgICAgICAgICAgaWYgKHdpZHRoID4gMCkKLSAgICAgICAgICAgICAgICB3aWR0
aCArPSBrVGV4dFRvTGFiZWxQYWRkaW5nOwotICAgICAgICAgICAgd2lkdGggKz0gaXRlbUZvbnQu
d2lkdGgoVGV4dFJ1bihsYWJlbCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpY29uSW1hZ2Ug
JiYgIWljb25JbWFnZS0+aXNOdWxsKCkpIHsKLSAgICAgICAgICAgIGlmICh3aWR0aCA+IDApCi0g
ICAgICAgICAgICAgICAgd2lkdGggKz0ga0xhYmVsVG9JY29uUGFkZGluZzsKLSAgICAgICAgICAg
IHdpZHRoICs9IGljb25JbWFnZS0+cmVjdCgpLndpZHRoKCk7Ci0gICAgICAgIH0KLQotICAgICAg
ICBiYXNlV2lkdGggPSBtYXgoYmFzZVdpZHRoLCB3aWR0aCk7Ci0gICAgICAgIC8vIEZJWE1FOiBo
dHRwOi8vYi8xMjEwNDgxIFdlIHNob3VsZCBnZXQgdGhlIHBhZGRpbmcgb2YgaW5kaXZpZHVhbCBv
cHRpb24gZWxlbWVudHMuCi0gICAgICAgIHBhZGRpbmdXaWR0aCA9IG1heChwYWRkaW5nV2lkdGgs
Ci0gICAgICAgICAgICBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nTGVmdCgpICsgbV9wb3B1
cENsaWVudC0+Y2xpZW50UGFkZGluZ1JpZ2h0KCkpOwotICAgICAgICBsaW5lRW5kUGFkZGluZ1dp
ZHRoID0gbWF4KGxpbmVFbmRQYWRkaW5nV2lkdGgsCi0gICAgICAgICAgICBpc1JpZ2h0QWxpZ25l
ZCA/IG1fcG9wdXBDbGllbnQtPmNsaWVudFBhZGRpbmdMZWZ0KCkgOiBtX3BvcHVwQ2xpZW50LT5j
bGllbnRQYWRkaW5nUmlnaHQoKSk7Ci0gICAgfQotCi0gICAgLy8gQ2FsY3VsYXRlIHNjcm9sbCBi
YXIgd2lkdGguCi0gICAgaW50IHdpbmRvd0hlaWdodCA9IDA7Ci0gICAgbV92aXNpYmxlUm93cyA9
IG1pbihudW1JdGVtcygpLCBrTWF4VmlzaWJsZVJvd3MpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBtX3Zpc2libGVSb3dzOyArK2kpIHsKLSAgICAgICAgaW50IHJvd0hlaWdodCA9IGdldFJv
d0hlaWdodChpKTsKLQotICAgICAgICAvLyBPbmx5IGNsaXAgdGhlIHdpbmRvdyBoZWlnaHQgZm9y
IG5vbi1NYWMgcGxhdGZvcm1zLgotICAgICAgICBpZiAod2luZG93SGVpZ2h0ICsgcm93SGVpZ2h0
ID4gbV9tYXhIZWlnaHQpIHsKLSAgICAgICAgICAgIG1fdmlzaWJsZVJvd3MgPSBpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICB3aW5kb3dIZWlnaHQgKz0gcm93SGVp
Z2h0OwotICAgIH0KLQotICAgIC8vIFNldCBvdXIgd2lkZ2V0IGFuZCBzY3JvbGxhYmxlIGNvbnRl
bnRzIHNpemVzLgotICAgIGludCBzY3JvbGxiYXJXaWR0aCA9IDA7Ci0gICAgaWYgKG1fdmlzaWJs
ZVJvd3MgPCBudW1JdGVtcygpKSB7Ci0gICAgICAgIHNjcm9sbGJhcldpZHRoID0gU2Nyb2xsYmFy
VGhlbWU6Om5hdGl2ZVRoZW1lKCktPnNjcm9sbGJhclRoaWNrbmVzcygpOwotCi0gICAgICAgIC8v
IFVzZSBrTWluRW5kT2ZMaW5lUGFkZGluZyB3aGVuIHRoZXJlIGlzIGEgc2Nyb2xsYmFyIHNvIHRo
YXQgd2UgdXNlCi0gICAgICAgIC8vIGFzIG11Y2ggYXMgKGxpbmVFbmRQYWRkaW5nV2lkdGggLSBr
TWluRW5kT2ZMaW5lUGFkZGluZykgcGFkZGluZwotICAgICAgICAvLyBzcGFjZSBmb3Igc2Nyb2xs
YmFyIGFuZCBhbGxvdyB1c2VyIHRvIHVzZSBDU1MgcGFkZGluZyB0byBtYWtlIHRoZQotICAgICAg
ICAvLyBwb3B1cCBsaXN0Ym94IGFsaWduIHdpdGggdGhlIHNlbGVjdCBlbGVtZW50LgotICAgICAg
ICBwYWRkaW5nV2lkdGggPSBwYWRkaW5nV2lkdGggLSBsaW5lRW5kUGFkZGluZ1dpZHRoICsga01p
bkVuZE9mTGluZVBhZGRpbmc7Ci0gICAgfQotCi0gICAgaW50IHdpbmRvd1dpZHRoOwotICAgIGlu
dCBjb250ZW50V2lkdGg7Ci0gICAgaWYgKG1fc2V0dGluZ3MucmVzdHJpY3RXaWR0aE9mTGlzdEJv
eCkgewotICAgICAgICB3aW5kb3dXaWR0aCA9IG1fYmFzZVdpZHRoOwotICAgICAgICBjb250ZW50
V2lkdGggPSBtX2Jhc2VXaWR0aCAtIHNjcm9sbGJhcldpZHRoOwotICAgIH0gZWxzZSB7Ci0gICAg
ICAgIHdpbmRvd1dpZHRoID0gYmFzZVdpZHRoICsgc2Nyb2xsYmFyV2lkdGggKyBwYWRkaW5nV2lk
dGg7Ci0gICAgICAgIGlmICh3aW5kb3dXaWR0aCA+IG1fbWF4V2luZG93V2lkdGgpIHsKLSAgICAg
ICAgICAgIC8vIHdpbmRvd1dpZHRoIGV4Y2VlZHMgbV9tYXhXaW5kb3dXaWR0aCwgc28gd2UgaGF2
ZSB0byBjbGlwLgotICAgICAgICAgICAgd2luZG93V2lkdGggPSBtX21heFdpbmRvd1dpZHRoOwot
ICAgICAgICAgICAgYmFzZVdpZHRoID0gd2luZG93V2lkdGggLSBzY3JvbGxiYXJXaWR0aCAtIHBh
ZGRpbmdXaWR0aDsKLSAgICAgICAgICAgIG1fYmFzZVdpZHRoID0gYmFzZVdpZHRoOwotICAgICAg
ICB9Ci0gICAgICAgIGNvbnRlbnRXaWR0aCA9IHdpbmRvd1dpZHRoIC0gc2Nyb2xsYmFyV2lkdGg7
Ci0KLSAgICAgICAgaWYgKHdpbmRvd1dpZHRoIDwgbV9iYXNlV2lkdGgpIHsKLSAgICAgICAgICAg
IHdpbmRvd1dpZHRoID0gbV9iYXNlV2lkdGg7Ci0gICAgICAgICAgICBjb250ZW50V2lkdGggPSBt
X2Jhc2VXaWR0aCAtIHNjcm9sbGJhcldpZHRoOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAg
IG1fYmFzZVdpZHRoID0gYmFzZVdpZHRoOwotICAgIH0KLQotICAgIHJlc2l6ZSh3aW5kb3dXaWR0
aCwgd2luZG93SGVpZ2h0KTsKLSAgICBzZXRDb250ZW50c1NpemUoSW50U2l6ZShjb250ZW50V2lk
dGgsIGdldFJvd0JvdW5kcyhudW1JdGVtcygpIC0gMSkubWF4WSgpKSk7Ci0KLSAgICBpZiAoaG9z
dFdpbmRvdygpKQotICAgICAgICBzY3JvbGxUb1JldmVhbFNlbGVjdGlvbigpOwotCi0gICAgaW52
YWxpZGF0ZSgpOwotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6Y2xlYXIoKQotewotICAgIGZvciAo
VmVjdG9yPFBvcHVwSXRlbSo+OjppdGVyYXRvciBpdCA9IG1faXRlbXMuYmVnaW4oKTsgaXQgIT0g
bV9pdGVtcy5lbmQoKTsgKytpdCkKLSAgICAgICAgZGVsZXRlICppdDsKLSAgICBtX2l0ZW1zLmNs
ZWFyKCk7Ci19Ci0KLWJvb2wgUG9wdXBMaXN0Qm94Ojppc1BvaW50SW5Cb3VuZHMoY29uc3QgSW50
UG9pbnQmIHBvaW50KQotewotICAgIHJldHVybiBudW1JdGVtcygpICE9IDAgJiYgSW50UmVjdCgw
LCAwLCB3aWR0aCgpLCBoZWlnaHQoKSkuY29udGFpbnMocG9pbnQpOwotfQotCi0vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vCi0vLyBQb3B1cE1lbnVDaHJvbWl1bSBpbXBsZW1lbnRhdGlvbgotLy8KLS8v
IE5vdGU6IHlvdSBjYW5ub3QgYWRkIG1ldGhvZHMgdG8gdGhpcyBjbGFzcywgc2luY2UgaXQgaXMg
ZGVmaW5lZCBhYm92ZSB0aGUKLS8vICAgICAgIHBvcnRhYmlsaXR5IGxheWVyLiBUbyBhY2Nlc3Mg
bWV0aG9kcyBhbmQgcHJvcGVydGllcyBvbiB0aGUKLS8vICAgICAgIHBvcHVwIHdpZGdldHMsIHVz
ZSB8cG9wdXBXaW5kb3d8IGFib3ZlLgotCiBQb3B1cE1lbnVDaHJvbWl1bTo6UG9wdXBNZW51Q2hy
b21pdW0oUG9wdXBNZW51Q2xpZW50KiBjbGllbnQpCiAgICAgOiBtX3BvcHVwQ2xpZW50KGNsaWVu
dCkKIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVw
TWVudUNocm9taXVtLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cE1l
bnVDaHJvbWl1bS5oCmluZGV4IDgyZDg3OWJkZjA1ZTM5NjNkODM4ODJjN2M3YmFjMDllOTY5OTU0
NjcuLmVkZDM1NTI2ZjE3YzNkYzY0ZTUxZmMxZjA3OTZmNDA0ZWM4MTVlNWUgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVtLmgKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBNZW51Q2hyb21pdW0uaApA
QCAtMzMsMTc2ICszMywxNyBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLSNpbmNsdWRlICJG
cmFtZWxlc3NTY3JvbGxWaWV3LmgiCi0jaW5jbHVkZSAiSW50UmVjdC5oIgotI2luY2x1ZGUgIlBs
YXRmb3JtU3RyaW5nLmgiCiAjaW5jbHVkZSAiUG9wdXBNZW51LmgiCiAjaW5jbHVkZSAiUG9wdXBN
ZW51UHJpdmF0ZS5oIgotI2luY2x1ZGUgIlBvcHVwTWVudVN0eWxlLmgiCiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAogY2xhc3MgQ2hyb21lQ2xpZW50Q2hyb21pdW07CiBjbGFzcyBGcmFtZVZpZXc7
Ci1jbGFzcyBQb3B1cExpc3RCb3g7CitjbGFzcyBJbnRSZWN0OworY2xhc3MgUG9wdXBJdGVtOwog
Y2xhc3MgUG9wdXBNZW51Q2xpZW50OwogCi0vLyBBIGNvbnRhaW5lciBmb3IgdGhlIGRhdGEgZm9y
IGVhY2ggbWVudSBpdGVtIChlLmcuIHJlcHJlc2VudGVkIGJ5IDxvcHRpb24+Ci0vLyBvciA8b3B0
Z3JvdXA+IGluIGEgPHNlbGVjdD4gd2lkZ2V0KSBhbmQgaXMgdXNlZCBieSBQb3B1cExpc3RCb3gu
Ci1zdHJ1Y3QgUG9wdXBJdGVtIHsKLSAgICBlbnVtIFR5cGUgewotICAgICAgICBUeXBlT3B0aW9u
LAotICAgICAgICBUeXBlR3JvdXAsCi0gICAgICAgIFR5cGVTZXBhcmF0b3IKLSAgICB9OwotCi0g
ICAgUG9wdXBJdGVtKGNvbnN0IFN0cmluZyYgbGFiZWwsIFR5cGUgdHlwZSkKLSAgICAgICAgOiBs
YWJlbChsYWJlbCkKLSAgICAgICAgLCB0eXBlKHR5cGUpCi0gICAgICAgICwgeU9mZnNldCgwKQot
ICAgIHsKLSAgICB9Ci0gICAgU3RyaW5nIGxhYmVsOwotICAgIFR5cGUgdHlwZTsKLSAgICBpbnQg
eU9mZnNldDsgLy8geSBvZmZzZXQgb2YgdGhpcyBpdGVtLCByZWxhdGl2ZSB0byB0aGUgdG9wIG9m
IHRoZSBwb3B1cC4KLSAgICBUZXh0RGlyZWN0aW9uIHRleHREaXJlY3Rpb247Ci0gICAgYm9vbCBo
YXNUZXh0RGlyZWN0aW9uT3ZlcnJpZGU7Ci0gICAgYm9vbCBlbmFibGVkOwotfTsKLQotLy8gRklY
TUU6IE91ciBGcmFtZWxlc3NTY3JvbGxWaWV3IGNsYXNzZXMgc2hvdWxkIHByb2JhYmx5IGltcGxl
bWVudCBIb3N0V2luZG93IQotCi0vLyBUaGUgUG9wdXBDb250YWluZXIgY2xhc3MgaG9sZHMgYSBQ
b3B1cExpc3RCb3ggKHNlZSBjcHAgZmlsZSkuICBJdHMgc29sZSBwdXJwb3NlIGlzIHRvIGJlCi0v
LyBhYmxlIHRvIGRyYXcgYSBib3JkZXIgYXJvdW5kIGl0cyBjaGlsZC4gIEFsbCBpdHMgcGFpbnQv
ZXZlbnQgaGFuZGxpbmcgaXMKLS8vIGp1c3QgZm9yd2FyZGVkIHRvIHRoZSBjaGlsZCBsaXN0Qm94
ICh3aXRoIHRoZSBhcHByb3ByaWF0ZSB0cmFuc2Zvcm1zKS4KLS8vIE5PVEU6IHRoaXMgY2xhc3Mg
aXMgZXhwb3NlZCBzbyBpdCBjYW4gYmUgaW5zdGFudGlhdGVkIGRpcmVjbHkgZm9yIHRoZQotLy8g
YXV0b2ZpbGwgcG9wdXAuICBXZSBjYW5ub3QgdXNlIHRoZSBQb3B1cCBjbGFzcyBkaXJlY3RseSBp
biB0aGF0IGNhc2UgYXMgdGhlCi0vLyBhdXRvZmlsbCBwb3B1cCBzaG91bGQgbm90IGJlIGZvY3Vz
ZWQgd2hlbiBzaG93biBhbmQgd2Ugd2FudCB0byBmb3J3YXJkIHRoZQotLy8ga2V5IGV2ZW50cyB0
byBpdCAodGhyb3VnaCBoYW5kbGVLZXlFdmVudCkuCi0KLXN0cnVjdCBQb3B1cENvbnRhaW5lclNl
dHRpbmdzIHsKLSAgICAvLyBXaGV0aGVyIHRoZSBQb3B1cE1lbnVDbGllbnQgc2hvdWxkIGJlIHRv
bGQgdG8gY2hhbmdlIGl0cyB0ZXh0IHdoZW4gYQotICAgIC8vIG5ldyBpdGVtIGlzIHNlbGVjdGVk
IGJ5IHVzaW5nIHRoZSBhcnJvdyBrZXlzLgotICAgIGJvb2wgc2V0VGV4dE9uSW5kZXhDaGFuZ2U7
Ci0KLSAgICAvLyBXaGV0aGVyIHRoZSBzZWxlY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIHdoZW4g
dGhlIHBvcHVwIG1lbnUgaXMKLSAgICAvLyBjbG9zZWQgKHRocm91Z2ggRVNDIGJlaW5nIHByZXNz
ZWQgb3IgdGhlIGZvY3VzIGdvaW5nIGF3YXkpLgotICAgIC8vIE5vdGUgdGhhdCB3aGVuIFRBQiBp
cyBwcmVzc2VkLCB0aGUgc2VsZWN0aW9uIGlzIGFsd2F5cyBhY2NlcHRlZAotICAgIC8vIHJlZ2Fy
ZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgotICAgIGJvb2wgYWNjZXB0T25BYmFuZG9uOwotCi0gICAg
Ly8gV2hldGhlciB3ZSBzaG91bGQgbW92ZSB0aGUgc2VsZWN0aW9uIHRvIHRoZSBmaXJzdC9sYXN0
IGl0ZW0gd2hlbgotICAgIC8vIHRoZSB1c2VyIHByZXNzZXMgZG93bi91cCBhcnJvdyBrZXlzIGFu
ZCB0aGUgbGFzdC9maXJzdCBpdGVtIGlzCi0gICAgLy8gc2VsZWN0ZWQuCi0gICAgYm9vbCBsb29w
U2VsZWN0aW9uTmF2aWdhdGlvbjsKLQotICAgIC8vIFdoZXRoZXIgd2Ugc2hvdWxkIHJlc3RyaWN0
IHRoZSB3aWR0aCBvZiB0aGUgUG9wdXBMaXN0Qm94IG9yIG5vdC4KLSAgICAvLyBBdXRvY29tcGxl
dGUgcG9wdXBzIGFyZSByZXN0cmljdGVkLCBjb21iby1ib3hlcyAoc2VsZWN0IHRhZ3MpIGFyZW4n
dC4KLSAgICBib29sIHJlc3RyaWN0V2lkdGhPZkxpc3RCb3g7Ci19OwotCi1jbGFzcyBQb3B1cENv
bnRhaW5lciA6IHB1YmxpYyBGcmFtZWxlc3NTY3JvbGxWaWV3IHsKLXB1YmxpYzoKLSAgICBlbnVt
IFBvcHVwVHlwZSB7Ci0gICAgICAgIFNlbGVjdCwgLy8gSFRNTCBzZWxlY3QgcG9wdXAuCi0gICAg
ICAgIFN1Z2dlc3Rpb24sIC8vIEF1dG9jb21wbGV0ZS9hdXRvZmlsbCBwb3B1cC4KLSAgICB9Owot
Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8UG9wdXBDb250YWluZXI+IGNyZWF0ZShQb3B1cE1lbnVD
bGllbnQqLCBQb3B1cFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJik7Ci0KLSAgICAvLyBXaGV0aGVy
IGEga2V5IGV2ZW50IHNob3VsZCBiZSBzZW50IHRvIHRoaXMgcG9wdXAuCi0gICAgdmlydHVhbCBi
b29sIGlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkoaW50IGtleUNvZGUpOwotCi0gICAgLy8gRnJh
bWVsZXNzU2Nyb2xsVmlldwotICAgIHZpcnR1YWwgdm9pZCBwYWludChHcmFwaGljc0NvbnRleHQq
LCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIGhpZGUoKTsKLSAgICB2aXJ0dWFs
IGJvb2wgaGFuZGxlTW91c2VEb3duRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7Ci0g
ICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VF
dmVudCYpOwotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZVJlbGVhc2VFdmVudChjb25zdCBQ
bGF0Zm9ybU1vdXNlRXZlbnQmKTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlV2hlZWxFdmVudChj
b25zdCBQbGF0Zm9ybVdoZWVsRXZlbnQmKTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlS2V5RXZl
bnQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50Jik7Ci0jaWYgRU5BQkxFKFRPVUNIX0VWRU5U
UykKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlVG91Y2hFdmVudChjb25zdCBQbGF0Zm9ybVRvdWNo
RXZlbnQmKTsKLSNlbmRpZgotI2lmIEVOQUJMRShHRVNUVVJFX1JFQ09HTklaRVIpCi0gICAgdmly
dHVhbCBib29sIGhhbmRsZUdlc3R1cmVFdmVudChjb25zdCBQbGF0Zm9ybUdlc3R1cmVFdmVudCYp
OwotI2VuZGlmCi0KLSAgICAvLyBQb3B1cENvbnRhaW5lciBtZXRob2RzCi0KLSAgICAvLyBTaG93
IHRoZSBwb3B1cAotICAgIHZvaWQgc2hvd1BvcHVwKEZyYW1lVmlldyopOwotCi0gICAgLy8gU2hv
dyB0aGUgcG9wdXAgaW4gdGhlIHNwZWNpZmllZCByZWN0IGZvciB0aGUgc3BlY2lmaWVkIGZyYW1l
LgotICAgIC8vIE5vdGU6IHRoaXMgY29kZSB3YXMgc29tZWhvdyBhcmJpdHJhcmlseSBmYWN0b3Jl
ZC1vdXQgb2YgdGhlIFBvcHVwIGNsYXNzCi0gICAgLy8gc28gV2ViVmlld0ltcGwgY2FuIGNyZWF0
ZSBhIFBvcHVwQ29udGFpbmVyLiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvcgotICAgIC8vIGRpc3Bs
YXlpbmcgYXV0byBjb21wbGV0ZSBwb3B1cCBtZW51cyBvbiBNYWMgQ2hyb21pdW0sIGFuZCBmb3Ig
YWxsCi0gICAgLy8gcG9wdXBzIG9uIG90aGVyIHBsYXRmb3Jtcy4KLSAgICB2b2lkIHNob3dJblJl
Y3QoY29uc3QgSW50UmVjdCYsIEZyYW1lVmlldyosIGludCBpbmRleCk7Ci0KLSAgICAvLyBIaWRl
cyB0aGUgcG9wdXAuCi0gICAgdm9pZCBoaWRlUG9wdXAoKTsKLQotICAgIC8vIFRoZSBwb3B1cCB3
YXMgaGlkZGVuLgotICAgIHZvaWQgbm90aWZ5UG9wdXBIaWRkZW4oKTsKLQotICAgIC8vIENvbXB1
dGUgc2l6ZSBvZiB3aWRnZXQgYW5kIGNoaWxkcmVuLiBSZXR1cm4gcmlnaHQgb2Zmc2V0IGZvciB0
aGUgcG9wdXAgcmlnaHQgYWxpZ25tZW50LgotICAgIGludCBsYXlvdXRBbmRHZXRSVExPZmZzZXQo
KTsKLQotICAgIFBvcHVwTGlzdEJveCogbGlzdEJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGlzdEJv
eC5nZXQoKTsgfQotCi0gICAgYm9vbCBpc1JUTCgpIGNvbnN0OwotCi0gICAgLy8gR2V0cyB0aGUg
aW5kZXggb2YgdGhlIGl0ZW0gdGhhdCB0aGUgdXNlciBpcyBjdXJyZW50bHkgbW91c2VkLW92ZXIg
b3IKLSAgICAvLyBoYXMgc2VsZWN0ZWQgd2l0aCB0aGUga2V5Ym9hcmQgdXAvZG93biBhcnJvd3Mu
Ci0gICAgaW50IHNlbGVjdGVkSW5kZXgoKSBjb25zdDsKLQotICAgIC8vIFJlZnJlc2ggdGhlIHBv
cHVwIHZhbHVlcyBmcm9tIHRoZSBQb3B1cE1lbnVDbGllbnQuCi0gICAgdm9pZCByZWZyZXNoKGNv
bnN0IEludFJlY3QmIHRhcmdldENvbnRyb2xSZWN0KTsKLQotICAgIC8vIFRoZSBtZW51IHBlci1p
dGVtIGRhdGEuCi0gICAgY29uc3QgV1RGOjpWZWN0b3I8UG9wdXBJdGVtKj4mIHBvcHVwRGF0YSgp
IGNvbnN0OwotCi0gICAgLy8gVGhlIGhlaWdodCBvZiBhIHJvdyBpbiB0aGUgbWVudS4KLSAgICBp
bnQgbWVudUl0ZW1IZWlnaHQoKSBjb25zdDsKLQotICAgIC8vIFRoZSBzaXplIG9mIHRoZSBmb250
IGJlaW5nIHVzZWQuCi0gICAgaW50IG1lbnVJdGVtRm9udFNpemUoKSBjb25zdDsKLQotICAgIC8v
IFRoZSBzdHlsZSBvZiB0aGUgbWVudSBiZWluZyB1c2VkLgotICAgIFBvcHVwTWVudVN0eWxlIG1l
bnVTdHlsZSgpIGNvbnN0OwotCi0gICAgUG9wdXBUeXBlIHBvcHVwVHlwZSgpIGNvbnN0IHsgcmV0
dXJuIG1fcG9wdXBUeXBlOyB9Ci0KLSAgICAvLyBXaGlsZSBob3ZlcmluZyBwb3B1cCBtZW51IHdp
bmRvdywgd2Ugd2FudCB0byBzaG93IHRvb2wgdGlwIG1lc3NhZ2UuCi0gICAgU3RyaW5nIGdldFNl
bGVjdGVkSXRlbVRvb2xUaXAoKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgV1RGOjpS
ZWZDb3VudGVkPFBvcHVwQ29udGFpbmVyPjsKLQotICAgIFBvcHVwQ29udGFpbmVyKFBvcHVwTWVu
dUNsaWVudCosIFBvcHVwVHlwZSwgY29uc3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyYpOwotICAg
IH5Qb3B1cENvbnRhaW5lcigpOwotCi0gICAgLy8gUGFpbnQgdGhlIGJvcmRlci4KLSAgICB2b2lk
IHBhaW50Qm9yZGVyKEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmKTsKLQotICAgIC8v
IExheW91dCBhbmQgY2FsY3VsYXRlIHBvcHVwIHdpZGdldCBzaXplIGFuZCBsb2NhdGlvbiBhbmQg
cmV0dXJucyBpdCBhcyBJbnRSZWN0LgotICAgIEludFJlY3QgbGF5b3V0QW5kQ2FsY3VsYXRlV2lk
Z2V0UmVjdChpbnQgdGFyZ2V0Q29udHJvbEhlaWdodCwgY29uc3QgSW50UG9pbnQmIHBvcHVwSW5p
dGlhbENvb3JkaW5hdGUpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgQ2hyb21lQ2xpZW50IG9mIHRo
ZSBwYWdlIHRoaXMgcG9wdXAgaXMgYXNzb2NpYXRlZCB3aXRoLgotICAgIENocm9tZUNsaWVudENo
cm9taXVtKiBjaHJvbWVDbGllbnRDaHJvbWl1bSgpOwotCi0gICAgUmVmUHRyPFBvcHVwTGlzdEJv
eD4gbV9saXN0Qm94OwotICAgIFJlZlB0cjxGcmFtZVZpZXc+IG1fZnJhbWVWaWV3OwotCi0gICAg
UG9wdXBDb250YWluZXJTZXR0aW5ncyBtX3NldHRpbmdzOwotICAgIFBvcHVwVHlwZSBtX3BvcHVw
VHlwZTsKLSAgICBJbnRSZWN0IG1fb3JpZ2luYWxGcmFtZVJlY3Q7Ci0gICAgLy8gV2hldGhlciB0
aGUgcG9wdXAgaXMgY3VycmVudGx5IG9wZW4uCi0gICAgYm9vbCBtX3BvcHVwT3BlbjsKLX07Ci0K
IGNsYXNzIFBvcHVwTWVudUNocm9taXVtIDogcHVibGljIFBvcHVwTWVudSB7CiBwdWJsaWM6CiAg
ICAgUG9wdXBNZW51Q2hyb21pdW0oUG9wdXBNZW51Q2xpZW50Kik7CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCmluZGV4IGM2MzY4YzNmZWM0MjAxYWJjZGFlYzIyZTQxNjMyYzExY2Y5OTQyYmMuLmRk
ZjA0NTg5N2JkZWRmYmZhMTNiOTJiNjVkZmUyNzU2ZTM4YWVhMGEgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0v
Q2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTEtMDgtMTIgIEZhZHkgU2FtdWVsICA8ZnNh
bXVlbEBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmVmYWN0b3Jpbmcgb2YgUG9wdXBNZW51Q2hy
b21pdW0gRm9yIFJlYWRhYmlsaXR5IGFuZCBNYWludGFpbmFiaWxpdHkKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY2MDA5CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBzcmMvQ2hyb21lQ2xpZW50SW1wbC5j
cHA6CisgICAgICAgICogc3JjL1dlYlBvcHVwTWVudUltcGwuY3BwOgorICAgICAgICAqIHNyYy9X
ZWJWaWV3SW1wbC5jcHA6CisgICAgICAgICogdGVzdHMvUG9wdXBNZW51VGVzdC5jcHA6CisKIDIw
MTEtMDgtMTIgIFNoZXJpZmYgQm90ICA8d2Via2l0LnJldmlldy5ib3RAZ21haWwuY29tPgogCiAg
ICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHI5Mjk3Ni4KZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvY2hyb21pdW0vc3JjL0Nocm9tZUNsaWVudEltcGwuY3BwIGIvU291cmNlL1dlYktp
dC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xpZW50SW1wbC5jcHAKaW5kZXggMjBiYjVhNGNjZThkNmUw
ZTk2NDQ1ZjhlYWNiODEyODM2MmU3M2IzNC4uMGIyMWM5YjlmM2Q5NDVlY2JiNTVkODUzNWJhOTdh
ZmU0YmMzNDA2ZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21l
Q2xpZW50SW1wbC5jcHAKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xp
ZW50SW1wbC5jcHAKQEAgLTU3LDYgKzU3LDcgQEAKICNpbmNsdWRlICJOb3RpZmljYXRpb25QcmVz
ZW50ZXJJbXBsLmgiCiAjaW5jbHVkZSAiUGFnZS5oIgogI2luY2x1ZGUgIlBsYXRmb3JtQnJpZGdl
LmgiCisjaW5jbHVkZSAiUG9wdXBDb250YWluZXIuaCIKICNpbmNsdWRlICJQb3B1cE1lbnVDaHJv
bWl1bS5oIgogI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgogI2luY2x1ZGUgIlNjcmlwdENvbnRy
b2xsZXIuaCIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYlBvcHVw
TWVudUltcGwuY3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViUG9wdXBNZW51SW1w
bC5jcHAKaW5kZXggZTI2NjhiMWI4NGQ5ZjQyYWRjYWJmMzE5MDRiYzhiNjhkMDUwM2YyYS4uNGUx
YjFlNjYwZjI2N2M0OTI0MDk0MjA3NTM0Njk5NWM5NDMzOTE3MSAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViUG9wdXBNZW51SW1wbC5jcHAKKysrIGIvU291cmNlL1dl
YktpdC9jaHJvbWl1bS9zcmMvV2ViUG9wdXBNZW51SW1wbC5jcHAKQEAgLTQwLDYgKzQwLDcgQEAK
ICNpbmNsdWRlICJQbGF0Zm9ybUtleWJvYXJkRXZlbnQuaCIKICNpbmNsdWRlICJQbGF0Zm9ybU1v
dXNlRXZlbnQuaCIKICNpbmNsdWRlICJQbGF0Zm9ybVdoZWVsRXZlbnQuaCIKKyNpbmNsdWRlICJQ
b3B1cENvbnRhaW5lci5oIgogI2luY2x1ZGUgIlBvcHVwTWVudUNocm9taXVtLmgiCiAjaW5jbHVk
ZSAiU2tpYVV0aWxzLmgiCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3Jj
L1dlYlZpZXdJbXBsLmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBs
LmNwcAppbmRleCA4ZjgzODA4YzY5MWU5NmE5MmNlMzU5ZjEyNzgzNTAwZWQwMjYyMGNkLi5hMjFm
MzRkM2NlNjZmYWRkMjc4ZDJmYTA1Y2U4MDA0MTc3MjhjOTExIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAKKysrIGIvU291cmNlL1dlYktpdC9j
aHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3BwCkBAIC04NSw3ICs4NSw3IEBACiAjaW5jbHVkZSAi
UGxhdGZvcm1Nb3VzZUV2ZW50LmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1UaGVtZUNocm9taXVtR3Rr
LmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50LmgiCi0jaW5jbHVkZSAiUG9wdXBNZW51
Q2hyb21pdW0uaCIKKyNpbmNsdWRlICJQb3B1cENvbnRhaW5lci5oIgogI2luY2x1ZGUgIlBvcHVw
TWVudUNsaWVudC5oIgogI2luY2x1ZGUgIlByb2dyZXNzVHJhY2tlci5oIgogI2luY2x1ZGUgIlJl
bmRlclZpZXcuaCIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvUG9w
dXBNZW51VGVzdC5jcHAgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL1BvcHVwTWVudVRl
c3QuY3BwCmluZGV4IGVkOTg2MDU5MzFjMGNjMGIzNDZkZDcyMWZlZGEyNGE0NjQ5ZTg1Y2UuLjMw
OTI3MmFjNzQyMTAyOTBiZTVhZjhjM2U1NTdmOGIwYmQ1Mjg5ZGIgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvUG9wdXBNZW51VGVzdC5jcHAKKysrIGIvU291cmNlL1dl
YktpdC9jaHJvbWl1bS90ZXN0cy9Qb3B1cE1lbnVUZXN0LmNwcApAQCAtMzcsNiArMzcsNyBAQAog
I2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJGcmFtZVZpZXcuaCIKICNpbmNsdWRlICJL
ZXlib2FyZENvZGVzLmgiCisjaW5jbHVkZSAiUG9wdXBDb250YWluZXIuaCIKICNpbmNsdWRlICJQ
b3B1cE1lbnUuaCIKICNpbmNsdWRlICJQb3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJQb3B1
cE1lbnVDaHJvbWl1bS5oIgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>103829</attachid>
            <date>2011-08-12 15:44:46 -0700</date>
            <delta_ts>2011-08-12 16:19:03 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-66009-20110812184444.patch</filename>
            <type>text/plain</type>
            <size>137816</size>
            <attacher name="Fady Samuel">fsamuel</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTI5ODcKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAwZWIxY2VmYjcwZmYzMjZl
ZDM4ZWJmYjlhYjA0YTI3NDI5ZDc2MGEwLi5mYjI1ZTJjNmU5NjVmOTE0NThiNThjMjI4ODY2M2Fh
M2QxNGJlOTVhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTAzIEBACisyMDExLTA4LTEyICBGYWR5
IFNhbXVlbCAgPGZzYW11ZWxAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJlZmFjdG9yaW5nIG9m
IFBvcHVwTWVudUNocm9taXVtIEZvciBSZWFkYWJpbGl0eSBhbmQgTWFpbnRhaW5hYmlsaXR5Cisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02NjAwOQorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFNwbGl0IFBvcHVw
TWVudUNocm9taXVtIGludG8gdGhyZWUgc2V0cyBvZiBmaWxlczogUG9wdXBNZW51Q2hyb21pdW0u
e2h8Y3BwfSwgUG9wdXBDb250YWluZXIue2h8Y3BwfSwKKyAgICAgICAgYW5kIFBvcHVwTGlzQm94
LntofGNwcH0gIGZvciByZWFkYWJpbGl0eSBhbmQgbWFpbnRhaW5hYmlsaXR5LgorCisgICAgICAg
IE5vIG5ldyB0ZXN0cyBhcyB0aGVyZSdzIG5vIGNoYW5nZSBpbiBmdW5jdGlvbmFsaXR5LgorCisg
ICAgICAgICogV2ViQ29yZS5neXBpOgorICAgICAgICAqIHBsYXRmb3JtL2Nocm9taXVtL1BvcHVw
Q29udGFpbmVyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpjb25zdHJ1Y3RSZWxhdGl2
ZU1vdXNlRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6Y29uc3RydWN0UmVsYXRpdmVXaGVlbEV2
ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpjcmVhdGUpOgorICAgICAg
ICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OlBvcHVwQ29udGFpbmVyKToKKyAgICAgICAgKFdl
YkNvcmU6OlBvcHVwQ29udGFpbmVyOjp+UG9wdXBDb250YWluZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6UG9wdXBDb250YWluZXI6OmxheW91dEFuZENhbGN1bGF0ZVdpZGdldFJlY3QpOgorICAgICAg
ICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OnNob3dQb3B1cCk6CisgICAgICAgIChXZWJDb3Jl
OjpQb3B1cENvbnRhaW5lcjo6aGlkZVBvcHVwKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29u
dGFpbmVyOjpub3RpZnlQb3B1cEhpZGRlbik6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRh
aW5lcjo6bGF5b3V0QW5kR2V0UlRMT2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29u
dGFpbmVyOjpoYW5kbGVNb3VzZURvd25FdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENv
bnRhaW5lcjo6aGFuZGxlTW91c2VNb3ZlRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBD
b250YWluZXI6OmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBv
cHVwQ29udGFpbmVyOjpoYW5kbGVXaGVlbEV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVw
Q29udGFpbmVyOjpoYW5kbGVUb3VjaEV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29u
dGFpbmVyOjpoYW5kbGVHZXN0dXJlRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250
YWluZXI6OmhhbmRsZUtleUV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVy
OjpoaWRlKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpwYWludCk6CisgICAg
ICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6cGFpbnRCb3JkZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6UG9wdXBDb250YWluZXI6OmlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkpOgorICAgICAg
ICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OmNocm9tZUNsaWVudENocm9taXVtKToKKyAgICAg
ICAgKFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyOjpzaG93SW5SZWN0KToKKyAgICAgICAgKFdlYkNv
cmU6OlBvcHVwQ29udGFpbmVyOjpyZWZyZXNoKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwQ29u
dGFpbmVyOjppc1JUTCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6c2VsZWN0
ZWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cENvbnRhaW5lcjo6bWVudUl0ZW1IZWln
aHQpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6Om1lbnVJdGVtRm9udFNpemUp
OgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6Om1lbnVTdHlsZSk6CisgICAgICAg
IChXZWJDb3JlOjpwb3B1cERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6
OmdldFNlbGVjdGVkSXRlbVRvb2xUaXApOgorICAgICAgICAqIHBsYXRmb3JtL2Nocm9taXVtL1Bv
cHVwQ29udGFpbmVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6
Omxpc3RCb3gpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBDb250YWluZXI6OnBvcHVwVHlwZSk6
CisgICAgICAgICogcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBMaXN0Qm94LmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OlBvcHVwTGlzdEJveCk6CisgICAgICAgIChX
ZWJDb3JlOjpQb3B1cExpc3RCb3g6OmhhbmRsZU1vdXNlRG93bkV2ZW50KToKKyAgICAgICAgKFdl
YkNvcmU6OlBvcHVwTGlzdEJveDo6aGFuZGxlTW91c2VNb3ZlRXZlbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6UG9wdXBMaXN0Qm94OjpoYW5kbGVNb3VzZVJlbGVhc2VFdmVudCk6CisgICAgICAgIChX
ZWJDb3JlOjpQb3B1cExpc3RCb3g6OmhhbmRsZVdoZWVsRXZlbnQpOgorICAgICAgICAoV2ViQ29y
ZTo6UG9wdXBMaXN0Qm94Ojppc0ludGVyZXN0ZWRJbkV2ZW50Rm9yS2V5KToKKyAgICAgICAgKFdl
YkNvcmU6OlBvcHVwTGlzdEJveDo6aGFuZGxlVG91Y2hFdmVudCk6CisgICAgICAgIChXZWJDb3Jl
OjpQb3B1cExpc3RCb3g6OmhhbmRsZUdlc3R1cmVFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpp
c0NoYXJhY3RlclR5cGVFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6Omhh
bmRsZUtleUV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6aG9zdFdpbmRv
dyk6CisgICAgICAgIChXZWJDb3JlOjpzdHJpcExlYWRpbmdXaGl0ZVNwYWNlKToKKyAgICAgICAg
KFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6dHlwZUFoZWFkRmluZCk6CisgICAgICAgIChXZWJDb3Jl
OjpQb3B1cExpc3RCb3g6OnBhaW50KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6
cGFpbnRSb3cpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpnZXRSb3dGb250KToK
KyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6YWJhbmRvbik6CisgICAgICAgIChXZWJD
b3JlOjpQb3B1cExpc3RCb3g6OnBvaW50VG9Sb3dJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpQ
b3B1cExpc3RCb3g6OmFjY2VwdEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJv
eDo6c2VsZWN0SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpzZXRPcmln
aW5hbEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6Z2V0Um93SGVpZ2h0
KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6Z2V0Um93Qm91bmRzKToKKyAgICAg
ICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6aW52YWxpZGF0ZVJvdyk6CisgICAgICAgIChXZWJD
b3JlOjpQb3B1cExpc3RCb3g6OnNjcm9sbFRvUmV2ZWFsUm93KToKKyAgICAgICAgKFdlYkNvcmU6
OlBvcHVwTGlzdEJveDo6aXNTZWxlY3RhYmxlSXRlbSk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1
cExpc3RCb3g6OmNsZWFyU2VsZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJv
eDo6c2VsZWN0TmV4dFJvdyk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OnNlbGVj
dFByZXZpb3VzUm93KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6YWRqdXN0U2Vs
ZWN0ZWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OmhpZGVQb3B1cCk6
CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6OnVwZGF0ZUZyb21FbGVtZW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OlBvcHVwTGlzdEJveDo6c2V0TWF4V2lkdGhBbmRMYXlvdXQpOgorICAg
ICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpsYXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6
UG9wdXBMaXN0Qm94OjpjbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6Omlz
UG9pbnRJbkJvdW5kcyk6CisgICAgICAgICogcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBMaXN0Qm94
Lmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBJdGVtOjpQb3B1cEl0ZW0pOgorICAg
ICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6
UG9wdXBMaXN0Qm94OjpzZWxlY3RlZEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlBvcHVwTGlz
dEJveDo6bnVtSXRlbXMpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpzZXRCYXNl
V2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpzZXRNYXhIZWlnaHQpOgor
ICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpzZXRNYXhXaWR0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpQb3B1cExpc3RCb3g6OmRpc2Nvbm5lY3RDbGllbnQpOgorICAgICAgICAoV2ViQ29y
ZTo6UG9wdXBMaXN0Qm94OjppdGVtcyk6CisgICAgICAgIChXZWJDb3JlOjpQb3B1cExpc3RCb3g6
On5Qb3B1cExpc3RCb3gpOgorICAgICAgICAoV2ViQ29yZTo6UG9wdXBMaXN0Qm94OjpzY3JvbGxU
b1JldmVhbFNlbGVjdGlvbik6CisgICAgICAgICogcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBNZW51
Q2hyb21pdW0uY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2Nocm9taXVtL1BvcHVwTWVudUNocm9t
aXVtLmg6CisKIDIwMTEtMDgtMTEgIFByYXRpayBTb2xhbmtpICA8cHNvbGFua2lAYXBwbGUuY29t
PgogCiAgICAgICAgIFJlc291cmNlTG9hZGVyOjpkaWRSZWNlaXZlRGF0YUFycmF5KCkgZG9lcyBu
b3QgaGFuZGxlIG1fc2hvdWxkQnVmZmVyRGF0YSBjb3JyZWN0bHkKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRl
eCA4YzU0NTUwMWUxMTlkNTQzNjZjNTU5ZDM2MjExY2RlZTllNGU0OWQzLi5lZjA1NGJkODE3ZTYy
OWVhM2E1YTgyODA3MzhlNGZjNjU1NDg0Zjk1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9X
ZWJDb3JlLmd5cGkKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC0zMjU2LDgg
KzMyNTYsMTIgQEAKICAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9QbGF0Zm9ybVRoZW1l
Q2hyb21pdW1HdGsuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9QbGF0Zm9y
bVRoZW1lQ2hyb21pdW1HdGsuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vY2hyb21pdW0vUGxh
dGZvcm1XaWRnZXQuaCcsCisgICAgICAgICAgICAncGxhdGZvcm0vY2hyb21pdW0vUG9wdXBDb250
YWluZXIuY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cENvbnRhaW5l
ci5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cE1lbnVDaHJvbWl1bS5j
cHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVtLmgn
LAorICAgICAgICAgICAgJ3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwTGlzdEJveC5jcHAnLAorICAg
ICAgICAgICAgJ3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwTGlzdEJveC5oJywKICAgICAgICAgICAg
ICdwbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cE1lbnVQcml2YXRlLmgnLAogICAgICAgICAgICAgJ3Bs
YXRmb3JtL2Nocm9taXVtL1NTTEtleUdlbmVyYXRvckNocm9taXVtLmNwcCcsCiAgICAgICAgICAg
ICAncGxhdGZvcm0vY2hyb21pdW0vU2Nyb2xsQW5pbWF0b3JDaHJvbWl1bU1hYy5oJywKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwQ29udGFpbmVyLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwQ29udGFpbmVyLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi4yMWM0NmU2NzFlZDk0MzhjYzZiYjRlYjI1OGQ5NzVjNmZkOWIyZDA3Ci0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBDb250
YWluZXIuY3BwCkBAIC0wLDAgKzEsNDY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJQb3B1cENvbnRhaW5lci5oIgorCisjaW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ2hy
b21lQ2xpZW50Q2hyb21pdW0uaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkZy
YW1lLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiRnJhbWVsZXNzU2Nyb2xs
Vmlldy5oIgorI2luY2x1ZGUgIkZyYW1lbGVzc1Njcm9sbFZpZXdDbGllbnQuaCIKKyNpbmNsdWRl
ICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiUGFn
ZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtS2V5Ym9hcmRFdmVudC5oIgorI2luY2x1ZGUgIlBsYXRm
b3JtTW91c2VFdmVudC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU2NyZWVuLmgiCisjaW5jbHVkZSAi
UGxhdGZvcm1XaGVlbEV2ZW50LmgiCisjaW5jbHVkZSAiUG9wdXBMaXN0Qm94LmgiCisjaW5jbHVk
ZSAiUG9wdXBNZW51Q2xpZW50LmgiCisjaW5jbHVkZSAiVXNlckdlc3R1cmVJbmRpY2F0b3IuaCIK
KyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpZiBFTkFCTEUoR0VTVFVSRV9FVkVOVFMpCisjaW5jbHVk
ZSAiUGxhdGZvcm1HZXN0dXJlRXZlbnQuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKFRPVUNIX0VW
RU5UUykKKyNpbmNsdWRlICJQbGF0Zm9ybVRvdWNoRXZlbnQuaCIKKyNlbmRpZgorCit1c2luZyBu
YW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBpbnQg
a0JvcmRlclNpemUgPSAxOworCitzdGF0aWMgUGxhdGZvcm1Nb3VzZUV2ZW50IGNvbnN0cnVjdFJl
bGF0aXZlTW91c2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGUsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZWxlc3NTY3Jv
bGxWaWV3KiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBGcmFtZWxlc3NTY3JvbGxWaWV3KiBjaGlsZCkKK3sKKyAgICBJbnRQb2lu
dCBwb3MgPSBwYXJlbnQtPmNvbnZlcnRTZWxmVG9DaGlsZChjaGlsZCwgZS5wb3MoKSk7CisKKyAg
ICAvLyBGSVhNRTogVGhpcyBpcyBhIGhvcnJpYmxlIGhhY2sgc2luY2UgUGxhdGZvcm1Nb3VzZUV2
ZW50IGhhcyBubyBzZXR0ZXJzIGZvciB4L3kuCisgICAgUGxhdGZvcm1Nb3VzZUV2ZW50IHJlbGF0
aXZlRXZlbnQgPSBlOworICAgIEludFBvaW50JiByZWxhdGl2ZVBvcyA9IGNvbnN0X2Nhc3Q8SW50
UG9pbnQmPihyZWxhdGl2ZUV2ZW50LnBvcygpKTsKKyAgICByZWxhdGl2ZVBvcy5zZXRYKHBvcy54
KCkpOworICAgIHJlbGF0aXZlUG9zLnNldFkocG9zLnkoKSk7CisgICAgcmV0dXJuIHJlbGF0aXZl
RXZlbnQ7Cit9CisKK3N0YXRpYyBQbGF0Zm9ybVdoZWVsRXZlbnQgY29uc3RydWN0UmVsYXRpdmVX
aGVlbEV2ZW50KGNvbnN0IFBsYXRmb3JtV2hlZWxFdmVudCYgZSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lbGVzc1Njcm9sbFZpZXcq
IHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIEZyYW1lbGVzc1Njcm9sbFZpZXcqIGNoaWxkKQoreworICAgIEludFBvaW50IHBvcyA9
IHBhcmVudC0+Y29udmVydFNlbGZUb0NoaWxkKGNoaWxkLCBlLnBvcygpKTsKKworICAgIC8vIEZJ
WE1FOiBUaGlzIGlzIGEgaG9ycmlibGUgaGFjayBzaW5jZSBQbGF0Zm9ybVdoZWVsRXZlbnQgaGFz
IG5vIHNldHRlcnMgZm9yIHgveS4KKyAgICBQbGF0Zm9ybVdoZWVsRXZlbnQgcmVsYXRpdmVFdmVu
dCA9IGU7CisgICAgSW50UG9pbnQmIHJlbGF0aXZlUG9zID0gY29uc3RfY2FzdDxJbnRQb2ludCY+
KHJlbGF0aXZlRXZlbnQucG9zKCkpOworICAgIHJlbGF0aXZlUG9zLnNldFgocG9zLngoKSk7Cisg
ICAgcmVsYXRpdmVQb3Muc2V0WShwb3MueSgpKTsKKyAgICByZXR1cm4gcmVsYXRpdmVFdmVudDsK
K30KKworLy8gc3RhdGljCitQYXNzUmVmUHRyPFBvcHVwQ29udGFpbmVyPiBQb3B1cENvbnRhaW5l
cjo6Y3JlYXRlKFBvcHVwTWVudUNsaWVudCogY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3B1cFR5cGUgcG9wdXBUeXBlLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb3B1cENv
bnRhaW5lclNldHRpbmdzJiBzZXR0aW5ncykKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFBv
cHVwQ29udGFpbmVyKGNsaWVudCwgcG9wdXBUeXBlLCBzZXR0aW5ncykpOworfQorCitQb3B1cENv
bnRhaW5lcjo6UG9wdXBDb250YWluZXIoUG9wdXBNZW51Q2xpZW50KiBjbGllbnQsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgUG9wdXBUeXBlIHBvcHVwVHlwZSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJiBzZXR0aW5n
cykKKyAgICA6IG1fbGlzdEJveChQb3B1cExpc3RCb3g6OmNyZWF0ZShjbGllbnQsIHNldHRpbmdz
KSkKKyAgICAsIG1fc2V0dGluZ3Moc2V0dGluZ3MpCisgICAgLCBtX3BvcHVwVHlwZShwb3B1cFR5
cGUpCisgICAgLCBtX3BvcHVwT3BlbihmYWxzZSkKK3sKKyAgICBzZXRTY3JvbGxiYXJNb2RlcyhT
Y3JvbGxiYXJBbHdheXNPZmYsIFNjcm9sbGJhckFsd2F5c09mZik7Cit9CisKK1BvcHVwQ29udGFp
bmVyOjp+UG9wdXBDb250YWluZXIoKQoreworICAgIGlmIChtX2xpc3RCb3ggJiYgbV9saXN0Qm94
LT5wYXJlbnQoKSkKKyAgICAgICAgcmVtb3ZlQ2hpbGQobV9saXN0Qm94LmdldCgpKTsKK30KKwor
SW50UmVjdCBQb3B1cENvbnRhaW5lcjo6bGF5b3V0QW5kQ2FsY3VsYXRlV2lkZ2V0UmVjdChpbnQg
dGFyZ2V0Q29udHJvbEhlaWdodCwgY29uc3QgSW50UG9pbnQmIHBvcHVwSW5pdGlhbENvb3JkaW5h
dGUpCit7CisgICAgLy8gUmVzZXQgdGhlIG1heCB3aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZWlyIGRl
ZmF1bHQgdmFsdWVzLCB0aGV5IHdpbGwgYmUgcmVjb21wdXRlZCBiZWxvdworICAgIC8vIGlmIG5l
Y2Vzc2FyeS4KKyAgICBtX2xpc3RCb3gtPnNldE1heEhlaWdodChrTWF4SGVpZ2h0KTsKKyAgICBt
X2xpc3RCb3gtPnNldE1heFdpZHRoKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpOwor
CisgICAgLy8gTGF5IGV2ZXJ5dGhpbmcgb3V0IHRvIGZpZ3VyZSBvdXQgb3VyIHByZWZlcnJlZCBz
aXplLCB0aGVuIHRlbGwgdGhlIHZpZXcncworICAgIC8vIFdpZGdldENsaWVudCBhYm91dCBpdC4g
SXQgc2hvdWxkIGFzc2lnbiB1cyBhIGNsaWVudC4KKyAgICBpbnQgcnRsT2Zmc2V0ID0gbGF5b3V0
QW5kR2V0UlRMT2Zmc2V0KCk7CisgICAgYm9vbCBpc1JUTCA9IHRoaXMtPmlzUlRMKCk7CisgICAg
aW50IHJpZ2h0T2Zmc2V0ID0gaXNSVEwgPyBydGxPZmZzZXQgOiAwOworCisgICAgLy8gQXNzdW1l
IG1fbGlzdEJveCBzaXplIGlzIGFscmVhZHkgY2FsY3VsYXRlZC4KKyAgICBJbnRTaXplIHRhcmdl
dFNpemUobV9saXN0Qm94LT53aWR0aCgpICsga0JvcmRlclNpemUgKiAyLAorICAgICAgICAgICAg
ICAgICAgICAgICBtX2xpc3RCb3gtPmhlaWdodCgpICsga0JvcmRlclNpemUgKiAyKTsKKworICAg
IEludFJlY3Qgd2lkZ2V0UmVjdDsKKyAgICBDaHJvbWVDbGllbnRDaHJvbWl1bSogY2hyb21lQ2xp
ZW50ID0gY2hyb21lQ2xpZW50Q2hyb21pdW0oKTsKKyAgICBpZiAoY2hyb21lQ2xpZW50KSB7Cisg
ICAgICAgIC8vIElmIHRoZSBwb3B1cCB3b3VsZCBleHRlbmQgcGFzdCB0aGUgYm90dG9tIG9mIHRo
ZSBzY3JlZW4sIG9wZW4gdXB3YXJkcworICAgICAgICAvLyBpbnN0ZWFkLgorICAgICAgICBGbG9h
dFJlY3Qgc2NyZWVuID0gc2NyZWVuQXZhaWxhYmxlUmVjdChtX2ZyYW1lVmlldy5nZXQoKSk7Cisg
ICAgICAgIC8vIFVzZSBwb3B1cEluaXRpYWxDb29yZGluYXRlLngoKSArIHJpZ2h0T2Zmc2V0IGJl
Y2F1c2UgUlRMIHBvc2l0aW9uCisgICAgICAgIC8vIG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQuCisg
ICAgICAgIHdpZGdldFJlY3QgPSBjaHJvbWVDbGllbnQtPndpbmRvd1RvU2NyZWVuKEludFJlY3Qo
cG9wdXBJbml0aWFsQ29vcmRpbmF0ZS54KCkgKyByaWdodE9mZnNldCwgcG9wdXBJbml0aWFsQ29v
cmRpbmF0ZS55KCksIHRhcmdldFNpemUud2lkdGgoKSwgdGFyZ2V0U2l6ZS5oZWlnaHQoKSkpOwor
CisgICAgICAgIC8vIElmIHdlIGhhdmUgbXVsdGlwbGUgc2NyZWVucyBhbmQgdGhlIGJyb3dzZXIg
cmVjdCBpcyBpbiBvbmUgc2NyZWVuLCB3ZSBoYXZlCisgICAgICAgIC8vIHRvIGNsaXAgdGhlIHdp
bmRvdyB3aWR0aCB0byB0aGUgc2NyZWVuIHdpZHRoLgorICAgICAgICAvLyBXaGVuIGNsaXBwaW5n
LCB3ZSBhbHNvIG5lZWQgdG8gc2V0IGEgbWF4aW11bSB3aWR0aCBmb3IgdGhlIGxpc3QgYm94Lgor
ICAgICAgICBGbG9hdFJlY3Qgd2luZG93UmVjdCA9IGNocm9tZUNsaWVudC0+d2luZG93UmVjdCgp
OworICAgICAgICBpZiAod2luZG93UmVjdC54KCkgPj0gc2NyZWVuLngoKSAmJiB3aW5kb3dSZWN0
Lm1heFgoKSA8PSBzY3JlZW4ubWF4WCgpICYmICh3aWRnZXRSZWN0LngoKSA8IHNjcmVlbi54KCkg
fHwgd2lkZ2V0UmVjdC5tYXhYKCkgPiBzY3JlZW4ubWF4WCgpKSkgeworICAgICAgICAgICAgLy8g
Rmlyc3QsIGludmVyc2UgdGhlIHBvcHVwIGFsaWdubWVudCBpZiBpdCBkb2VzIG5vdCBmaXQgdGhl
IHNjcmVlbiAtIHRoaXMgbWlnaHQgZml4IHRoaW5ncyAob3IgbWFrZSB0aGVtIGJldHRlcikuCisg
ICAgICAgICAgICBJbnRSZWN0IGludmVyc2VXaWRnZXRSZWN0ID0gY2hyb21lQ2xpZW50LT53aW5k
b3dUb1NjcmVlbihJbnRSZWN0KHBvcHVwSW5pdGlhbENvb3JkaW5hdGUueCgpICsgKGlzUlRMID8g
MCA6IHJ0bE9mZnNldCksIHBvcHVwSW5pdGlhbENvb3JkaW5hdGUueSgpLCB0YXJnZXRTaXplLndp
ZHRoKCksIHRhcmdldFNpemUuaGVpZ2h0KCkpKTsKKyAgICAgICAgICAgIEludFJlY3QgZW5jbG9z
aW5nU2NyZWVuID0gZW5jbG9zaW5nSW50UmVjdChzY3JlZW4pOworICAgICAgICAgICAgdW5zaWdu
ZWQgb3JpZ2luYWxDdXRvZmYgPSBtYXgoZW5jbG9zaW5nU2NyZWVuLngoKSAtIHdpZGdldFJlY3Qu
eCgpLCAwKSArIG1heCh3aWRnZXRSZWN0Lm1heFgoKSAtIGVuY2xvc2luZ1NjcmVlbi5tYXhYKCks
IDApOworICAgICAgICAgICAgdW5zaWduZWQgaW52ZXJzZUN1dG9mZiA9IG1heChlbmNsb3NpbmdT
Y3JlZW4ueCgpIC0gaW52ZXJzZVdpZGdldFJlY3QueCgpLCAwKSArIG1heChpbnZlcnNlV2lkZ2V0
UmVjdC5tYXhYKCkgLSBlbmNsb3NpbmdTY3JlZW4ubWF4WCgpLCAwKTsKKworICAgICAgICAgICAg
Ly8gQWNjZXB0IHRoZSBpbnZlcnNlIHBvcHVwIGFsaWdubWVudCBpZiB0aGUgdHJpbW1lZCBjb250
ZW50IGdldHMgc2hvcnRlciB0aGFuIHRoYXQgaW4gdGhlIG9yaWdpbmFsIGFsaWdubWVudCBjYXNl
LgorICAgICAgICAgICAgaWYgKGludmVyc2VDdXRvZmYgPCBvcmlnaW5hbEN1dG9mZikKKyAgICAg
ICAgICAgICAgICB3aWRnZXRSZWN0ID0gaW52ZXJzZVdpZGdldFJlY3Q7CisKKyAgICAgICAgICAg
IGlmICh3aWRnZXRSZWN0LngoKSA8IHNjcmVlbi54KCkpIHsKKyAgICAgICAgICAgICAgICB1bnNp
Z25lZCB3aWRnZXRSaWdodCA9IHdpZGdldFJlY3QubWF4WCgpOworICAgICAgICAgICAgICAgIHdp
ZGdldFJlY3Quc2V0V2lkdGgod2lkZ2V0UmVjdC5tYXhYKCkgLSBzY3JlZW4ueCgpKTsKKyAgICAg
ICAgICAgICAgICB3aWRnZXRSZWN0LnNldFgod2lkZ2V0UmlnaHQgLSB3aWRnZXRSZWN0LndpZHRo
KCkpOworICAgICAgICAgICAgICAgIGxpc3RCb3goKS0+c2V0TWF4V2lkdGhBbmRMYXlvdXQobWF4
KHdpZGdldFJlY3Qud2lkdGgoKSAtIGtCb3JkZXJTaXplICogMiwgMCkpOworICAgICAgICAgICAg
fSBlbHNlIGlmICh3aWRnZXRSZWN0Lm1heFgoKSA+IHNjcmVlbi5tYXhYKCkpIHsKKyAgICAgICAg
ICAgICAgICB3aWRnZXRSZWN0LnNldFdpZHRoKHNjcmVlbi5tYXhYKCkgLSB3aWRnZXRSZWN0Lngo
KSk7CisgICAgICAgICAgICAgICAgbGlzdEJveCgpLT5zZXRNYXhXaWR0aEFuZExheW91dChtYXgo
d2lkZ2V0UmVjdC53aWR0aCgpIC0ga0JvcmRlclNpemUgKiAyLCAwKSk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKworICAgICAgICAvLyBDYWxjdWxhdGUgWSBheGlzIHNpemUuCisgICAgICAg
IGlmICh3aWRnZXRSZWN0Lm1heFkoKSA+IHN0YXRpY19jYXN0PGludD4oc2NyZWVuLm1heFkoKSkp
IHsKKyAgICAgICAgICAgIGlmICh3aWRnZXRSZWN0LnkoKSAtIHdpZGdldFJlY3QuaGVpZ2h0KCkg
LSB0YXJnZXRDb250cm9sSGVpZ2h0ID4gMCkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlz
IGVub3VnaCByb29tIHRvIG9wZW4gdXB3YXJkcy4KKyAgICAgICAgICAgICAgICB3aWRnZXRSZWN0
Lm1vdmUoMCwgLSh3aWRnZXRSZWN0LmhlaWdodCgpICsgdGFyZ2V0Q29udHJvbEhlaWdodCkpOwor
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBGaWd1cmUgd2hldGhlciB1
cHdhcmRzIG9yIGRvd253YXJkcyBoYXMgbW9yZSByb29tIGFuZCBzZXQgdGhlCisgICAgICAgICAg
ICAgICAgLy8gbWF4aW11bSBudW1iZXIgb2YgaXRlbXMuCisgICAgICAgICAgICAgICAgaW50IHNw
YWNlQWJvdmUgPSB3aWRnZXRSZWN0LnkoKSAtIHRhcmdldENvbnRyb2xIZWlnaHQ7CisgICAgICAg
ICAgICAgICAgaW50IHNwYWNlQmVsb3cgPSBzY3JlZW4ubWF4WSgpIC0gd2lkZ2V0UmVjdC55KCk7
CisgICAgICAgICAgICAgICAgaWYgKHNwYWNlQWJvdmUgPiBzcGFjZUJlbG93KQorICAgICAgICAg
ICAgICAgICAgICBtX2xpc3RCb3gtPnNldE1heEhlaWdodChzcGFjZUFib3ZlKTsKKyAgICAgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1fbGlzdEJveC0+c2V0TWF4SGVpZ2h0
KHNwYWNlQmVsb3cpOworICAgICAgICAgICAgICAgIGxheW91dEFuZEdldFJUTE9mZnNldCgpOwor
ICAgICAgICAgICAgICAgIC8vIE91ciBoZWlnaHQgaGFzIGNoYW5nZWQsIHNvIHJlY29tcHV0ZSBv
bmx5IFkgYXhpcyBvZiB3aWRnZXRSZWN0LgorICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGhh
dmUgdG8gcmVjb21wdXRlIFggYXhpcywgc28gd2Ugb25seSByZXBsYWNlIFkgYXhpcworICAgICAg
ICAgICAgICAgIC8vIGluIHdpZGdldFJlY3QuCisgICAgICAgICAgICAgICAgSW50UmVjdCBmcmFt
ZUluU2NyZWVuID0gY2hyb21lQ2xpZW50LT53aW5kb3dUb1NjcmVlbihmcmFtZVJlY3QoKSk7Cisg
ICAgICAgICAgICAgICAgd2lkZ2V0UmVjdC5zZXRZKGZyYW1lSW5TY3JlZW4ueSgpKTsKKyAgICAg
ICAgICAgICAgICB3aWRnZXRSZWN0LnNldEhlaWdodChmcmFtZUluU2NyZWVuLmhlaWdodCgpKTsK
KyAgICAgICAgICAgICAgICAvLyBBbmQgbW92ZSB1cHdhcmRzIGlmIG5lY2Vzc2FyeS4KKyAgICAg
ICAgICAgICAgICBpZiAoc3BhY2VBYm92ZSA+IHNwYWNlQmVsb3cpCisgICAgICAgICAgICAgICAg
ICAgIHdpZGdldFJlY3QubW92ZSgwLCAtKHdpZGdldFJlY3QuaGVpZ2h0KCkgKyB0YXJnZXRDb250
cm9sSGVpZ2h0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJu
IHdpZGdldFJlY3Q7Cit9CisKK3ZvaWQgUG9wdXBDb250YWluZXI6OnNob3dQb3B1cChGcmFtZVZp
ZXcqIHZpZXcpCit7CisgICAgbV9mcmFtZVZpZXcgPSB2aWV3OworICAgIGxpc3RCb3goKS0+bV9m
b2N1c2VkTm9kZSA9IG1fZnJhbWVWaWV3LT5mcmFtZSgpLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9k
ZSgpOworCisgICAgQ2hyb21lQ2xpZW50Q2hyb21pdW0qIGNocm9tZUNsaWVudCA9IGNocm9tZUNs
aWVudENocm9taXVtKCk7CisgICAgaWYgKGNocm9tZUNsaWVudCkgeworICAgICAgICBJbnRSZWN0
IHBvcHVwUmVjdCA9IGZyYW1lUmVjdCgpOworICAgICAgICBjaHJvbWVDbGllbnQtPnBvcHVwT3Bl
bmVkKHRoaXMsIGxheW91dEFuZENhbGN1bGF0ZVdpZGdldFJlY3QocG9wdXBSZWN0LmhlaWdodCgp
LCBwb3B1cFJlY3QubG9jYXRpb24oKSksIGZhbHNlKTsKKyAgICAgICAgbV9wb3B1cE9wZW4gPSB0
cnVlOworICAgIH0KKworICAgIGlmICghbV9saXN0Qm94LT5wYXJlbnQoKSkKKyAgICAgICAgYWRk
Q2hpbGQobV9saXN0Qm94LmdldCgpKTsKKworICAgIC8vIEVuYWJsZSBzY3JvbGxiYXJzIGFmdGVy
IHRoZSBsaXN0Ym94IGlzIGluc2VydGVkIGludG8gdGhlIGhpZXJhcmNoeSwKKyAgICAvLyBzbyBp
dCBoYXMgYSBwcm9wZXIgV2lkZ2V0Q2xpZW50LgorICAgIG1fbGlzdEJveC0+c2V0VmVydGljYWxT
Y3JvbGxiYXJNb2RlKFNjcm9sbGJhckF1dG8pOworCisgICAgbV9saXN0Qm94LT5zY3JvbGxUb1Jl
dmVhbFNlbGVjdGlvbigpOworCisgICAgaW52YWxpZGF0ZSgpOworfQorCit2b2lkIFBvcHVwQ29u
dGFpbmVyOjpoaWRlUG9wdXAoKQoreworICAgIGxpc3RCb3goKS0+aGlkZVBvcHVwKCk7Cit9CisK
K3ZvaWQgUG9wdXBDb250YWluZXI6Om5vdGlmeVBvcHVwSGlkZGVuKCkKK3sKKyAgICBpZiAoIW1f
cG9wdXBPcGVuKQorICAgICAgICByZXR1cm47CisgICAgbV9wb3B1cE9wZW4gPSBmYWxzZTsKKyAg
ICBjaHJvbWVDbGllbnRDaHJvbWl1bSgpLT5wb3B1cENsb3NlZCh0aGlzKTsKK30KKworaW50IFBv
cHVwQ29udGFpbmVyOjpsYXlvdXRBbmRHZXRSVExPZmZzZXQoKQoreworICAgIG1fbGlzdEJveC0+
bGF5b3V0KCk7CisKKyAgICAvLyBQbGFjZSB0aGUgbGlzdGJveCB3aXRoaW4gb3VyIGJvcmRlci4K
KyAgICBtX2xpc3RCb3gtPm1vdmUoa0JvcmRlclNpemUsIGtCb3JkZXJTaXplKTsKKworICAgIC8v
IFNpemUgb3Vyc2VsdmVzIHRvIGNvbnRhaW4gbGlzdGJveCArIGJvcmRlci4KKyAgICBpbnQgbGlz
dEJveFdpZHRoID0gbV9saXN0Qm94LT53aWR0aCgpICsga0JvcmRlclNpemUgKiAyOworICAgIHJl
c2l6ZShsaXN0Qm94V2lkdGgsIG1fbGlzdEJveC0+aGVpZ2h0KCkgKyBrQm9yZGVyU2l6ZSAqIDIp
OworICAgIGludmFsaWRhdGUoKTsKKworICAgIC8vIENvbXB1dGUgdGhlIHN0YXJ0aW5nIHgtYXhp
cyBmb3IgYSBub3JtYWwgUlRMIG9yIHJpZ2h0LWFsaWduZWQgTFRSIGRyb3Bkb3duLiBGb3IgdGhv
c2UsCisgICAgLy8gdGhlIHJpZ2h0IGVkZ2Ugb2YgZHJvcGRvd24gYm94IHNob3VsZCBiZSBhbGln
bmVkIHdpdGggdGhlIHJpZ2h0IGVkZ2Ugb2YgPHNlbGVjdD4vPGlucHV0PiBlbGVtZW50IGJveCwK
KyAgICAvLyBhbmQgdGhlIGRyb3Bkb3duIGJveCBzaG91bGQgYmUgZXhwYW5kZWQgdG8gdGhlIGxl
ZnQgaWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQuCisgICAgLy8gbV9vcmlnaW5hbEZyYW1lUmVjdC53
aWR0aCgpIGlzIHRoZSB3aWR0aCBvZiB0aGUgdGFyZ2V0IDxzZWxlY3Q+LzxpbnB1dD4gZWxlbWVu
dC4KKyAgICByZXR1cm4gbV9vcmlnaW5hbEZyYW1lUmVjdC53aWR0aCgpIC0gbGlzdEJveFdpZHRo
OworfQorCitib29sIFBvcHVwQ29udGFpbmVyOjpoYW5kbGVNb3VzZURvd25FdmVudChjb25zdCBQ
bGF0Zm9ybU1vdXNlRXZlbnQmIGV2ZW50KQoreworICAgIFVzZXJHZXN0dXJlSW5kaWNhdG9yIGdl
c3R1cmVJbmRpY2F0b3IoRGVmaW5pdGVseVByb2Nlc3NpbmdVc2VyR2VzdHVyZSk7CisgICAgcmV0
dXJuIG1fbGlzdEJveC0+aGFuZGxlTW91c2VEb3duRXZlbnQoCisgICAgICAgIGNvbnN0cnVjdFJl
bGF0aXZlTW91c2VFdmVudChldmVudCwgdGhpcywgbV9saXN0Qm94LmdldCgpKSk7Cit9CisKK2Jv
b2wgUG9wdXBDb250YWluZXI6OmhhbmRsZU1vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91
c2VFdmVudCYgZXZlbnQpCit7CisgICAgVXNlckdlc3R1cmVJbmRpY2F0b3IgZ2VzdHVyZUluZGlj
YXRvcihEZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJHZXN0dXJlKTsKKyAgICByZXR1cm4gbV9saXN0
Qm94LT5oYW5kbGVNb3VzZU1vdmVFdmVudCgKKyAgICAgICAgY29uc3RydWN0UmVsYXRpdmVNb3Vz
ZUV2ZW50KGV2ZW50LCB0aGlzLCBtX2xpc3RCb3guZ2V0KCkpKTsKK30KKworYm9vbCBQb3B1cENv
bnRhaW5lcjo6aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50
JiBldmVudCkKK3sKKyAgICBSZWZQdHI8UG9wdXBDb250YWluZXI+IHByb3RlY3QodGhpcyk7Cisg
ICAgVXNlckdlc3R1cmVJbmRpY2F0b3IgZ2VzdHVyZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vz
c2luZ1VzZXJHZXN0dXJlKTsKKyAgICByZXR1cm4gbV9saXN0Qm94LT5oYW5kbGVNb3VzZVJlbGVh
c2VFdmVudCgKKyAgICAgICAgY29uc3RydWN0UmVsYXRpdmVNb3VzZUV2ZW50KGV2ZW50LCB0aGlz
LCBtX2xpc3RCb3guZ2V0KCkpKTsKK30KKworYm9vbCBQb3B1cENvbnRhaW5lcjo6aGFuZGxlV2hl
ZWxFdmVudChjb25zdCBQbGF0Zm9ybVdoZWVsRXZlbnQmIGV2ZW50KQoreworICAgIFVzZXJHZXN0
dXJlSW5kaWNhdG9yIGdlc3R1cmVJbmRpY2F0b3IoRGVmaW5pdGVseVByb2Nlc3NpbmdVc2VyR2Vz
dHVyZSk7CisgICAgcmV0dXJuIG1fbGlzdEJveC0+aGFuZGxlV2hlZWxFdmVudCgKKyAgICAgICAg
Y29uc3RydWN0UmVsYXRpdmVXaGVlbEV2ZW50KGV2ZW50LCB0aGlzLCBtX2xpc3RCb3guZ2V0KCkp
KTsKK30KKworI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCitib29sIFBvcHVwQ29udGFpbmVyOjpo
YW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBsYXRmb3JtVG91Y2hFdmVudCYpCit7CisgICAgcmV0dXJu
IGZhbHNlOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEUoR0VTVFVSRV9SRUNPR05JWkVSKQorLy8g
RklYTUU6IFJlZmFjdG9yIHRoaXMgY29kZSB0byBzaGFyZSBmdW5jdGlvbmFsaXR5IHdpdGggRXZl
bnRIYW5kbGVyOjpoYW5kbGVHZXN0dXJlRXZlbnQuCitib29sIFBvcHVwQ29udGFpbmVyOjpoYW5k
bGVHZXN0dXJlRXZlbnQoY29uc3QgUGxhdGZvcm1HZXN0dXJlRXZlbnQmIGdlc3R1cmVFdmVudCkK
K3sKKyAgICBzd2l0Y2ggKGdlc3R1cmVFdmVudC50eXBlKCkpIHsKKyAgICBjYXNlIFBsYXRmb3Jt
R2VzdHVyZUV2ZW50OjpUYXBUeXBlOiB7CisgICAgICAgIFBsYXRmb3JtTW91c2VFdmVudCBmYWtl
TW91c2VNb3ZlKGdlc3R1cmVFdmVudC5wb3NpdGlvbigpLCBnZXN0dXJlRXZlbnQuZ2xvYmFsUG9z
aXRpb24oKSwgTm9CdXR0b24sIE1vdXNlRXZlbnRNb3ZlZCwgLyogY2xpY2tDb3VudCAqLyAxLCBn
ZXN0dXJlRXZlbnQuc2hpZnRLZXkoKSwgZ2VzdHVyZUV2ZW50LmN0cmxLZXkoKSwgZ2VzdHVyZUV2
ZW50LmFsdEtleSgpLCBnZXN0dXJlRXZlbnQubWV0YUtleSgpLCBnZXN0dXJlRXZlbnQudGltZXN0
YW1wKCkpOworICAgICAgICBQbGF0Zm9ybU1vdXNlRXZlbnQgZmFrZU1vdXNlRG93bihnZXN0dXJl
RXZlbnQucG9zaXRpb24oKSwgZ2VzdHVyZUV2ZW50Lmdsb2JhbFBvc2l0aW9uKCksIExlZnRCdXR0
b24sIE1vdXNlRXZlbnRQcmVzc2VkLCAvKiBjbGlja0NvdW50ICovIDEsIGdlc3R1cmVFdmVudC5z
aGlmdEtleSgpLCBnZXN0dXJlRXZlbnQuY3RybEtleSgpLCBnZXN0dXJlRXZlbnQuYWx0S2V5KCks
IGdlc3R1cmVFdmVudC5tZXRhS2V5KCksIGdlc3R1cmVFdmVudC50aW1lc3RhbXAoKSk7CisgICAg
ICAgIFBsYXRmb3JtTW91c2VFdmVudCBmYWtlTW91c2VVcChnZXN0dXJlRXZlbnQucG9zaXRpb24o
KSwgZ2VzdHVyZUV2ZW50Lmdsb2JhbFBvc2l0aW9uKCksIExlZnRCdXR0b24sIE1vdXNlRXZlbnRS
ZWxlYXNlZCwgLyogY2xpY2tDb3VudCAqLyAxLCBnZXN0dXJlRXZlbnQuc2hpZnRLZXkoKSwgZ2Vz
dHVyZUV2ZW50LmN0cmxLZXkoKSwgZ2VzdHVyZUV2ZW50LmFsdEtleSgpLCBnZXN0dXJlRXZlbnQu
bWV0YUtleSgpLCBnZXN0dXJlRXZlbnQudGltZXN0YW1wKCkpOworICAgICAgICAvLyBoYW5kbGVN
b3VzZU1vdmVFdmVudChmYWtlTW91c2VNb3ZlKTsKKyAgICAgICAgaGFuZGxlTW91c2VEb3duRXZl
bnQoZmFrZU1vdXNlRG93bik7CisgICAgICAgIGhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGZha2VN
b3VzZVVwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgUGxhdGZvcm1H
ZXN0dXJlRXZlbnQ6OlNjcm9sbFVwZGF0ZVR5cGU6IHsKKyAgICAgICAgUGxhdGZvcm1XaGVlbEV2
ZW50IHN5bnRoZXRpY1doZWVsRXZlbnQoZ2VzdHVyZUV2ZW50LnBvc2l0aW9uKCksIGdlc3R1cmVF
dmVudC5nbG9iYWxQb3NpdGlvbigpLCBnZXN0dXJlRXZlbnQuZGVsdGFYKCksIGdlc3R1cmVFdmVu
dC5kZWx0YVkoKSwgZ2VzdHVyZUV2ZW50LmRlbHRhWCgpIC8gMTIwLjBmLCBnZXN0dXJlRXZlbnQu
ZGVsdGFZKCkgLyAxMjAuMGYsIFNjcm9sbEJ5UGl4ZWxXaGVlbEV2ZW50LCAvKiBpc0FjY2VwdGVk
ICovIGZhbHNlLCBnZXN0dXJlRXZlbnQuc2hpZnRLZXkoKSwgZ2VzdHVyZUV2ZW50LmN0cmxLZXko
KSwgZ2VzdHVyZUV2ZW50LmFsdEtleSgpLCBnZXN0dXJlRXZlbnQubWV0YUtleSgpKTsKKyAgICAg
ICAgaGFuZGxlV2hlZWxFdmVudChzeW50aGV0aWNXaGVlbEV2ZW50KTsKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorICAgIGNhc2UgUGxhdGZvcm1HZXN0dXJlRXZlbnQ6OlNjcm9sbEJlZ2lu
VHlwZToKKyAgICBjYXNlIFBsYXRmb3JtR2VzdHVyZUV2ZW50OjpTY3JvbGxFbmRUeXBlOgorICAg
ICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKK2Jvb2wg
UG9wdXBDb250YWluZXI6OmhhbmRsZUtleUV2ZW50KGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVu
dCYgZXZlbnQpCit7CisgICAgVXNlckdlc3R1cmVJbmRpY2F0b3IgZ2VzdHVyZUluZGljYXRvcihE
ZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJHZXN0dXJlKTsKKyAgICByZXR1cm4gbV9saXN0Qm94LT5o
YW5kbGVLZXlFdmVudChldmVudCk7Cit9CisKK3ZvaWQgUG9wdXBDb250YWluZXI6OmhpZGUoKQor
eworICAgIG1fbGlzdEJveC0+YWJhbmRvbigpOworfQorCit2b2lkIFBvcHVwQ29udGFpbmVyOjpw
YWludChHcmFwaGljc0NvbnRleHQqIGdjLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8v
IGFkanVzdCBjb29yZHMgZm9yIHNjcm9sbGVkIGZyYW1lCisgICAgSW50UmVjdCByID0gaW50ZXJz
ZWN0aW9uKHJlY3QsIGZyYW1lUmVjdCgpKTsKKyAgICBpbnQgdHggPSB4KCk7CisgICAgaW50IHR5
ID0geSgpOworCisgICAgci5tb3ZlKC10eCwgLXR5KTsKKworICAgIGdjLT50cmFuc2xhdGUoc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KHR4KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR5KSk7CisgICAgbV9saXN0
Qm94LT5wYWludChnYywgcik7CisgICAgZ2MtPnRyYW5zbGF0ZSgtc3RhdGljX2Nhc3Q8ZmxvYXQ+
KHR4KSwgLXN0YXRpY19jYXN0PGZsb2F0Pih0eSkpOworCisgICAgcGFpbnRCb3JkZXIoZ2MsIHJl
Y3QpOworfQorCit2b2lkIFBvcHVwQ29udGFpbmVyOjpwYWludEJvcmRlcihHcmFwaGljc0NvbnRl
eHQqIGdjLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIEZJWE1FOiBXaGVyZSBkbyB3
ZSBnZXQgdGhlIGJvcmRlciBjb2xvciBmcm9tPworICAgIENvbG9yIGJvcmRlckNvbG9yKDEyNywg
MTU3LCAxODUpOworCisgICAgZ2MtPnNldFN0cm9rZVN0eWxlKE5vU3Ryb2tlKTsKKyAgICBnYy0+
c2V0RmlsbENvbG9yKGJvcmRlckNvbG9yLCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKKworICAgIGlu
dCB0eCA9IHgoKTsKKyAgICBpbnQgdHkgPSB5KCk7CisKKyAgICAvLyB0b3AsIGxlZnQsIGJvdHRv
bSwgcmlnaHQKKyAgICBnYy0+ZHJhd1JlY3QoSW50UmVjdCh0eCwgdHksIHdpZHRoKCksIGtCb3Jk
ZXJTaXplKSk7CisgICAgZ2MtPmRyYXdSZWN0KEludFJlY3QodHgsIHR5LCBrQm9yZGVyU2l6ZSwg
aGVpZ2h0KCkpKTsKKyAgICBnYy0+ZHJhd1JlY3QoSW50UmVjdCh0eCwgdHkgKyBoZWlnaHQoKSAt
IGtCb3JkZXJTaXplLCB3aWR0aCgpLCBrQm9yZGVyU2l6ZSkpOworICAgIGdjLT5kcmF3UmVjdChJ
bnRSZWN0KHR4ICsgd2lkdGgoKSAtIGtCb3JkZXJTaXplLCB0eSwga0JvcmRlclNpemUsIGhlaWdo
dCgpKSk7Cit9CisKK2Jvb2wgUG9wdXBDb250YWluZXI6OmlzSW50ZXJlc3RlZEluRXZlbnRGb3JL
ZXkoaW50IGtleUNvZGUpCit7CisgICAgcmV0dXJuIG1fbGlzdEJveC0+aXNJbnRlcmVzdGVkSW5F
dmVudEZvcktleShrZXlDb2RlKTsKK30KKworQ2hyb21lQ2xpZW50Q2hyb21pdW0qIFBvcHVwQ29u
dGFpbmVyOjpjaHJvbWVDbGllbnRDaHJvbWl1bSgpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0
PENocm9tZUNsaWVudENocm9taXVtKj4obV9mcmFtZVZpZXctPmZyYW1lKCktPnBhZ2UoKS0+Y2hy
b21lKCktPmNsaWVudCgpKTsKK30KKwordm9pZCBQb3B1cENvbnRhaW5lcjo6c2hvd0luUmVjdChj
b25zdCBJbnRSZWN0JiByLCBGcmFtZVZpZXcqIHYsIGludCBpbmRleCkKK3sKKyAgICAvLyBUaGUg
cmVjdCBpcyB0aGUgc2l6ZSBvZiB0aGUgc2VsZWN0IGJveC4gSXQncyB1c3VhbGx5IGxhcmdlciB0
aGFuIHdlIG5lZWQuCisgICAgLy8gc3VidHJhY3QgYm9yZGVyIHNpemUgc28gdGhhdCB1c3VhbGx5
IHRoZSBjb250YWluZXIgd2lsbCBiZSBkaXNwbGF5ZWQKKyAgICAvLyBleGFjdGx5IHRoZSBzYW1l
IHdpZHRoIGFzIHRoZSBzZWxlY3QgYm94LgorICAgIGxpc3RCb3goKS0+c2V0QmFzZVdpZHRoKG1h
eChyLndpZHRoKCkgLSBrQm9yZGVyU2l6ZSAqIDIsIDApKTsKKworICAgIGxpc3RCb3goKS0+dXBk
YXRlRnJvbUVsZW1lbnQoKTsKKworICAgIC8vIFdlIHNldCB0aGUgc2VsZWN0ZWQgaXRlbSBpbiB1
cGRhdGVGcm9tRWxlbWVudCgpLCBhbmQgZGlzcmVnYXJkIHRoZQorICAgIC8vIGluZGV4IHBhc3Nl
ZCBpbnRvIHRoaXMgZnVuY3Rpb24gKHNhbWUgYXMgV2Via2l0J3MgUG9wdXBNZW51V2luLmNwcCkK
KyAgICAvLyBGSVhNRTogbWFrZSBzdXJlIHRoaXMgaXMgY29ycmVjdCwgYW5kIGFkZCBhbiBhc3Nl
cnRpb24uCisgICAgLy8gQVNTRVJUKHBvcHVwV2luZG93KHBvcHVwKS0+bGlzdEJveCgpLT5zZWxl
Y3RlZEluZGV4KCkgPT0gaW5kZXgpOworCisgICAgLy8gQ29udmVydCBwb2ludCB0byBtYWluIHdp
bmRvdyBjb29yZHMuCisgICAgSW50UG9pbnQgbG9jYXRpb24gPSB2LT5jb250ZW50c1RvV2luZG93
KHIubG9jYXRpb24oKSk7CisKKyAgICAvLyBNb3ZlIGl0IGJlbG93IHRoZSBzZWxlY3Qgd2lkZ2V0
LgorICAgIGxvY2F0aW9uLm1vdmUoMCwgci5oZWlnaHQoKSk7CisKKyAgICBtX29yaWdpbmFsRnJh
bWVSZWN0ID0gSW50UmVjdChsb2NhdGlvbiwgci5zaXplKCkpOworICAgIHNldEZyYW1lUmVjdCht
X29yaWdpbmFsRnJhbWVSZWN0KTsKKyAgICBzaG93UG9wdXAodik7Cit9CisKK3ZvaWQgUG9wdXBD
b250YWluZXI6OnJlZnJlc2goY29uc3QgSW50UmVjdCYgdGFyZ2V0Q29udHJvbFJlY3QpCit7Cisg
ICAgSW50UG9pbnQgbG9jYXRpb24gPSBtX2ZyYW1lVmlldy0+Y29udGVudHNUb1dpbmRvdyh0YXJn
ZXRDb250cm9sUmVjdC5sb2NhdGlvbigpKTsKKyAgICAvLyBNb3ZlIGl0IGJlbG93IHRoZSBzZWxl
Y3Qgd2lkZ2V0LgorICAgIGxvY2F0aW9uLm1vdmUoMCwgdGFyZ2V0Q29udHJvbFJlY3QuaGVpZ2h0
KCkpOworCisgICAgbGlzdEJveCgpLT5zZXRCYXNlV2lkdGgobWF4KG1fb3JpZ2luYWxGcmFtZVJl
Y3Qud2lkdGgoKSAtIGtCb3JkZXJTaXplICogMiwgMCkpOworICAgIHNldEJvdW5kc1NpemUobV9v
cmlnaW5hbEZyYW1lUmVjdC5zaXplKCkpOworCisgICAgbGlzdEJveCgpLT51cGRhdGVGcm9tRWxl
bWVudCgpOworICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBzaXplIHRvIGNoZWNrIGlmIHdlIG5l
ZWQgdG8gcmVxdWVzdCB0aGUgbG9jYXRpb24uCisgICAgSW50U2l6ZSBvcmlnaW5hbFNpemUgPSBz
aXplKCk7CisgICAgSW50UmVjdCB3aWRnZXRSZWN0ID0gbGF5b3V0QW5kQ2FsY3VsYXRlV2lkZ2V0
UmVjdCh0YXJnZXRDb250cm9sUmVjdC5oZWlnaHQoKSwgbG9jYXRpb24pOworICAgIGlmIChvcmln
aW5hbFNpemUgIT0gd2lkZ2V0UmVjdC5zaXplKCkpIHsKKyAgICAgICAgQ2hyb21lQ2xpZW50Q2hy
b21pdW0qIGNocm9tZUNsaWVudCA9IGNocm9tZUNsaWVudENocm9taXVtKCk7CisgICAgICAgIGlm
IChjaHJvbWVDbGllbnQpIHsKKyAgICAgICAgICAgIEludFBvaW50IHdpZGdldExvY2F0aW9uID0g
Y2hyb21lQ2xpZW50LT5zY3JlZW5Ub1dpbmRvdyh3aWRnZXRSZWN0LmxvY2F0aW9uKCkpOworICAg
ICAgICAgICAgd2lkZ2V0UmVjdC5zZXRMb2NhdGlvbih3aWRnZXRMb2NhdGlvbik7CisgICAgICAg
ICAgICBzZXRGcmFtZVJlY3Qod2lkZ2V0UmVjdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBp
bnZhbGlkYXRlKCk7Cit9CisKK2lubGluZSBib29sIFBvcHVwQ29udGFpbmVyOjppc1JUTCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fbGlzdEJveC0+bV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCku
dGV4dERpcmVjdGlvbigpID09IFJUTDsKK30KKworaW50IFBvcHVwQ29udGFpbmVyOjpzZWxlY3Rl
ZEluZGV4KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9saXN0Qm94LT5zZWxlY3RlZEluZGV4KCk7
Cit9CisKK2ludCBQb3B1cENvbnRhaW5lcjo6bWVudUl0ZW1IZWlnaHQoKSBjb25zdAoreworICAg
IHJldHVybiBtX2xpc3RCb3gtPmdldFJvd0hlaWdodCgwKTsKK30KKworaW50IFBvcHVwQ29udGFp
bmVyOjptZW51SXRlbUZvbnRTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9saXN0Qm94LT5n
ZXRSb3dGb250KDApLnNpemUoKTsKK30KKworUG9wdXBNZW51U3R5bGUgUG9wdXBDb250YWluZXI6
Om1lbnVTdHlsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbGlzdEJveC0+bV9wb3B1cENsaWVu
dC0+bWVudVN0eWxlKCk7Cit9CisKK2NvbnN0IFdURjo6VmVjdG9yPFBvcHVwSXRlbSo+JiBQb3B1
cENvbnRhaW5lcjo6IHBvcHVwRGF0YSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbGlzdEJveC0+
aXRlbXMoKTsKK30KKworU3RyaW5nIFBvcHVwQ29udGFpbmVyOjpnZXRTZWxlY3RlZEl0ZW1Ub29s
VGlwKCkKK3sKKyAgICAvLyBXZSBjYW5ub3QgdXNlIG1fcG9wdXBDbGllbnQtPnNlbGVjdGVkSW5k
ZXgoKSB0byBjaG9vc2UgdG9vbHRpcCBtZXNzYWdlLAorICAgIC8vIGJlY2F1c2UgdGhlIHNlbGVj
dGVkSW5kZXgoKSBtaWdodCByZXR1cm4gZmluYWwgc2VsZWN0ZWQgaW5kZXgsIG5vdCBob3Zlcmlu
ZyBzZWxlY3Rpb24uCisgICAgcmV0dXJuIGxpc3RCb3goKS0+bV9wb3B1cENsaWVudC0+aXRlbVRv
b2xUaXAobGlzdEJveCgpLT5tX3NlbGVjdGVkSW5kZXgpOworfQorCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1
cENvbnRhaW5lci5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBDb250
YWluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi40NTJlMWI0MjU0MjZjOWQzMTlhZDMzNWYyNGQ3YmYwOWRlM2Iz
YjBmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0v
UG9wdXBDb250YWluZXIuaApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykg
MjAxMSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICog
ICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0
cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFBvcHVwQ29udGFpbmVy
X2gKKyNkZWZpbmUgUG9wdXBDb250YWluZXJfaAorCisjaW5jbHVkZSAiRnJhbWVsZXNzU2Nyb2xs
Vmlldy5oIgorI2luY2x1ZGUgIlBvcHVwTGlzdEJveC5oIgorI2luY2x1ZGUgIlBvcHVwTWVudVN0
eWxlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ2hyb21lQ2xpZW50Q2hyb21p
dW07CitjbGFzcyBGcmFtZVZpZXc7CitjbGFzcyBQb3B1cE1lbnVDbGllbnQ7CisKK2NsYXNzIFBv
cHVwQ29udGFpbmVyIDogcHVibGljIEZyYW1lbGVzc1Njcm9sbFZpZXcgeworcHVibGljOgorICAg
IGVudW0gUG9wdXBUeXBlIHsKKyAgICAgICAgU2VsZWN0LCAvLyBIVE1MIHNlbGVjdCBwb3B1cC4K
KyAgICAgICAgU3VnZ2VzdGlvbiwgLy8gQXV0b2NvbXBsZXRlL2F1dG9maWxsIHBvcHVwLgorICAg
IH07CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxQb3B1cENvbnRhaW5lcj4gY3JlYXRlKFBvcHVw
TWVudUNsaWVudCosIFBvcHVwVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IFBvcHVwQ29udGFpbmVyU2V0dGluZ3MmKTsKKworICAgIC8vIFdo
ZXRoZXIgYSBrZXkgZXZlbnQgc2hvdWxkIGJlIHNlbnQgdG8gdGhpcyBwb3B1cC4KKyAgICB2aXJ0
dWFsIGJvb2wgaXNJbnRlcmVzdGVkSW5FdmVudEZvcktleShpbnQga2V5Q29kZSk7CisKKyAgICAv
LyBGcmFtZWxlc3NTY3JvbGxWaWV3CisgICAgdmlydHVhbCB2b2lkIHBhaW50KEdyYXBoaWNzQ29u
dGV4dCosIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgaGlkZSgpOworICAgIHZp
cnR1YWwgYm9vbCBoYW5kbGVNb3VzZURvd25FdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQm
KTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1N
b3VzZUV2ZW50Jik7CisgICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGNv
bnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVXaGVlbEV2
ZW50KGNvbnN0IFBsYXRmb3JtV2hlZWxFdmVudCYpOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVL
ZXlFdmVudChjb25zdCBQbGF0Zm9ybUtleWJvYXJkRXZlbnQmKTsKKyNpZiBFTkFCTEUoVE9VQ0hf
RVZFTlRTKQorICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBsYXRmb3Jt
VG91Y2hFdmVudCYpOworI2VuZGlmCisjaWYgRU5BQkxFKEdFU1RVUkVfUkVDT0dOSVpFUikKKyAg
ICB2aXJ0dWFsIGJvb2wgaGFuZGxlR2VzdHVyZUV2ZW50KGNvbnN0IFBsYXRmb3JtR2VzdHVyZUV2
ZW50Jik7CisjZW5kaWYKKworICAgIC8vIFBvcHVwQ29udGFpbmVyIG1ldGhvZHMKKworICAgIC8v
IFNob3cgdGhlIHBvcHVwCisgICAgdm9pZCBzaG93UG9wdXAoRnJhbWVWaWV3Kik7CisKKyAgICAv
LyBTaG93IHRoZSBwb3B1cCBpbiB0aGUgc3BlY2lmaWVkIHJlY3QgZm9yIHRoZSBzcGVjaWZpZWQg
ZnJhbWUuCisgICAgLy8gTm90ZTogdGhpcyBjb2RlIHdhcyBzb21laG93IGFyYml0cmFyaWx5IGZh
Y3RvcmVkLW91dCBvZiB0aGUgUG9wdXAgY2xhc3MKKyAgICAvLyBzbyBXZWJWaWV3SW1wbCBjYW4g
Y3JlYXRlIGEgUG9wdXBDb250YWluZXIuIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yCisgICAgLy8g
ZGlzcGxheWluZyBhdXRvIGNvbXBsZXRlIHBvcHVwIG1lbnVzIG9uIE1hYyBDaHJvbWl1bSwgYW5k
IGZvciBhbGwKKyAgICAvLyBwb3B1cHMgb24gb3RoZXIgcGxhdGZvcm1zLgorICAgIHZvaWQgc2hv
d0luUmVjdChjb25zdCBJbnRSZWN0JiwgRnJhbWVWaWV3KiwgaW50IGluZGV4KTsKKworICAgIC8v
IEhpZGVzIHRoZSBwb3B1cC4KKyAgICB2b2lkIGhpZGVQb3B1cCgpOworCisgICAgLy8gVGhlIHBv
cHVwIHdhcyBoaWRkZW4uCisgICAgdm9pZCBub3RpZnlQb3B1cEhpZGRlbigpOworCisgICAgLy8g
Q29tcHV0ZSBzaXplIG9mIHdpZGdldCBhbmQgY2hpbGRyZW4uIFJldHVybiByaWdodCBvZmZzZXQg
Zm9yIHRoZSBwb3B1cCByaWdodCBhbGlnbm1lbnQuCisgICAgaW50IGxheW91dEFuZEdldFJUTE9m
ZnNldCgpOworCisgICAgUG9wdXBMaXN0Qm94KiBsaXN0Qm94KCkgY29uc3QgeyByZXR1cm4gbV9s
aXN0Qm94LmdldCgpOyB9CisKKyAgICBib29sIGlzUlRMKCkgY29uc3Q7CisKKyAgICAvLyBHZXRz
IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0aGF0IHRoZSB1c2VyIGlzIGN1cnJlbnRseSBtb3VzZWQt
b3ZlciBvcgorICAgIC8vIGhhcyBzZWxlY3RlZCB3aXRoIHRoZSBrZXlib2FyZCB1cC9kb3duIGFy
cm93cy4KKyAgICBpbnQgc2VsZWN0ZWRJbmRleCgpIGNvbnN0OworCisgICAgLy8gUmVmcmVzaCB0
aGUgcG9wdXAgdmFsdWVzIGZyb20gdGhlIFBvcHVwTWVudUNsaWVudC4KKyAgICB2b2lkIHJlZnJl
c2goY29uc3QgSW50UmVjdCYgdGFyZ2V0Q29udHJvbFJlY3QpOworCisgICAgLy8gVGhlIG1lbnUg
cGVyLWl0ZW0gZGF0YS4KKyAgICBjb25zdCBXVEY6OlZlY3RvcjxQb3B1cEl0ZW0qPiYgcG9wdXBE
YXRhKCkgY29uc3Q7CisKKyAgICAvLyBUaGUgaGVpZ2h0IG9mIGEgcm93IGluIHRoZSBtZW51Lgor
ICAgIGludCBtZW51SXRlbUhlaWdodCgpIGNvbnN0OworCisgICAgLy8gVGhlIHNpemUgb2YgdGhl
IGZvbnQgYmVpbmcgdXNlZC4KKyAgICBpbnQgbWVudUl0ZW1Gb250U2l6ZSgpIGNvbnN0OworCisg
ICAgLy8gVGhlIHN0eWxlIG9mIHRoZSBtZW51IGJlaW5nIHVzZWQuCisgICAgUG9wdXBNZW51U3R5
bGUgbWVudVN0eWxlKCkgY29uc3Q7CisKKyAgICBQb3B1cFR5cGUgcG9wdXBUeXBlKCkgY29uc3Qg
eyByZXR1cm4gbV9wb3B1cFR5cGU7IH0KKworICAgIC8vIFdoaWxlIGhvdmVyaW5nIHBvcHVwIG1l
bnUgd2luZG93LCB3ZSB3YW50IHRvIHNob3cgdG9vbCB0aXAgbWVzc2FnZS4KKyAgICBTdHJpbmcg
Z2V0U2VsZWN0ZWRJdGVtVG9vbFRpcCgpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBX
VEY6OlJlZkNvdW50ZWQ8UG9wdXBDb250YWluZXI+OworCisgICAgUG9wdXBDb250YWluZXIoUG9w
dXBNZW51Q2xpZW50KiwgUG9wdXBUeXBlLCBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJik7
CisgICAgflBvcHVwQ29udGFpbmVyKCk7CisKKyAgICAvLyBQYWludCB0aGUgYm9yZGVyLgorICAg
IHZvaWQgcGFpbnRCb3JkZXIoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYpOworCisg
ICAgLy8gTGF5b3V0IGFuZCBjYWxjdWxhdGUgcG9wdXAgd2lkZ2V0IHNpemUgYW5kIGxvY2F0aW9u
IGFuZCByZXR1cm5zIGl0IGFzIEludFJlY3QuCisgICAgSW50UmVjdCBsYXlvdXRBbmRDYWxjdWxh
dGVXaWRnZXRSZWN0KGludCB0YXJnZXRDb250cm9sSGVpZ2h0LCBjb25zdCBJbnRQb2ludCYgcG9w
dXBJbml0aWFsQ29vcmRpbmF0ZSk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBDaHJvbWVDbGllbnQg
b2YgdGhlIHBhZ2UgdGhpcyBwb3B1cCBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgQ2hyb21lQ2xp
ZW50Q2hyb21pdW0qIGNocm9tZUNsaWVudENocm9taXVtKCk7CisKKyAgICBSZWZQdHI8UG9wdXBM
aXN0Qm94PiBtX2xpc3RCb3g7CisgICAgUmVmUHRyPEZyYW1lVmlldz4gbV9mcmFtZVZpZXc7CisK
KyAgICBQb3B1cENvbnRhaW5lclNldHRpbmdzIG1fc2V0dGluZ3M7CisgICAgUG9wdXBUeXBlIG1f
cG9wdXBUeXBlOworICAgIEludFJlY3QgbV9vcmlnaW5hbEZyYW1lUmVjdDsKKyAgICAvLyBXaGV0
aGVyIHRoZSBwb3B1cCBpcyBjdXJyZW50bHkgb3Blbi4KKyAgICBib29sIG1fcG9wdXBPcGVuOwor
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwTGlzdEJveC5jcHAgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cExpc3RCb3guY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjIwMTUw
NjRjZGMxOGUyNTkyMDUyNWYzMGE0NzkzOTMwNTdlMTIwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cExpc3RCb3guY3BwCkBAIC0wLDAg
KzEsOTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0
OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
CisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9m
IEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBB
TkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS
SUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUG9wdXBMaXN0Qm94LmgiCisK
KyNpbmNsdWRlICJGb250LmgiCisjaW5jbHVkZSAiRm9udFNlbGVjdG9yLmgiCisjaW5jbHVkZSAi
RnJhbWVsZXNzU2Nyb2xsVmlld0NsaWVudC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5o
IgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJLZXlib2FyZENvZGVzLmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1LZXlib2FyZEV2ZW50LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2
ZW50LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TY3JlZW4uaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVdo
ZWVsRXZlbnQuaCIKKyNpbmNsdWRlICJQb3B1cENvbnRhaW5lci5oIgorI2luY2x1ZGUgIlBvcHVw
TWVudUNocm9taXVtLmgiCisjaW5jbHVkZSAiUG9wdXBNZW51Q2xpZW50LmgiCisjaW5jbHVkZSAi
UmVuZGVyVGhlbWUuaCIKKyNpbmNsdWRlICJTY3JvbGxiYXJUaGVtZS5oIgorI2luY2x1ZGUgIlN0
cmluZ1RydW5jYXRvci5oIgorI2luY2x1ZGUgIlRleHRSdW4uaCIKKyNpbmNsdWRlIDxsaW1pdHM+
CisjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+CisKKyNpZiBFTkFCTEUoR0VTVFVSRV9FVkVO
VFMpCisjaW5jbHVkZSAiUGxhdGZvcm1HZXN0dXJlRXZlbnQuaCIKKyNlbmRpZgorCisjaWYgRU5B
QkxFKFRPVUNIX0VWRU5UUykKKyNpbmNsdWRlICJQbGF0Zm9ybVRvdWNoRXZlbnQuaCIKKyNlbmRp
ZgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBu
YW1lc3BhY2UgV1RGOwordXNpbmcgbmFtZXNwYWNlIFVuaWNvZGU7CisKK1BvcHVwTGlzdEJveDo6
UG9wdXBMaXN0Qm94KFBvcHVwTWVudUNsaWVudCogY2xpZW50LCBjb25zdCBQb3B1cENvbnRhaW5l
clNldHRpbmdzJiBzZXR0aW5ncykKKyAgICA6IG1fc2V0dGluZ3Moc2V0dGluZ3MpCisgICAgLCBt
X29yaWdpbmFsSW5kZXgoMCkKKyAgICAsIG1fc2VsZWN0ZWRJbmRleCgwKQorICAgICwgbV9hY2Nl
cHRlZEluZGV4T25BYmFuZG9uKC0xKQorICAgICwgbV92aXNpYmxlUm93cygwKQorICAgICwgbV9i
YXNlV2lkdGgoMCkKKyAgICAsIG1fbWF4SGVpZ2h0KGtNYXhIZWlnaHQpCisgICAgLCBtX3BvcHVw
Q2xpZW50KGNsaWVudCkKKyAgICAsIG1fcmVwZWF0aW5nQ2hhcigwKQorICAgICwgbV9sYXN0Q2hh
clRpbWUoMCkKKyAgICAsIG1fbWF4V2luZG93V2lkdGgoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+
OjptYXgoKSkKK3sKKyAgICBzZXRTY3JvbGxiYXJNb2RlcyhTY3JvbGxiYXJBbHdheXNPZmYsIFNj
cm9sbGJhckFsd2F5c09mZik7Cit9CisKK2Jvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVNb3VzZURv
d25FdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2ZW50KQoreworICAgIFNjcm9sbGJh
ciogc2Nyb2xsYmFyID0gc2Nyb2xsYmFyQXRQb2ludChldmVudC5wb3MoKSk7CisgICAgaWYgKHNj
cm9sbGJhcikgeworICAgICAgICBtX2NhcHR1cmluZ1Njcm9sbGJhciA9IHNjcm9sbGJhcjsKKyAg
ICAgICAgbV9jYXB0dXJpbmdTY3JvbGxiYXItPm1vdXNlRG93bihldmVudCk7CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKworICAgIGlmICghaXNQb2ludEluQm91bmRzKGV2ZW50LnBvcygp
KSkKKyAgICAgICAgYWJhbmRvbigpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUG9w
dXBMaXN0Qm94OjpoYW5kbGVNb3VzZU1vdmVFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQm
IGV2ZW50KQoreworICAgIGlmIChtX2NhcHR1cmluZ1Njcm9sbGJhcikgeworICAgICAgICBtX2Nh
cHR1cmluZ1Njcm9sbGJhci0+bW91c2VNb3ZlZChldmVudCk7CisgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKworICAgIFNjcm9sbGJhciogc2Nyb2xsYmFyID0gc2Nyb2xsYmFyQXRQb2ludChl
dmVudC5wb3MoKSk7CisgICAgaWYgKG1fbGFzdFNjcm9sbGJhclVuZGVyTW91c2UgIT0gc2Nyb2xs
YmFyKSB7CisgICAgICAgIC8vIFNlbmQgbW91c2UgZXhpdGVkIHRvIHRoZSBvbGQgc2Nyb2xsYmFy
LgorICAgICAgICBpZiAobV9sYXN0U2Nyb2xsYmFyVW5kZXJNb3VzZSkKKyAgICAgICAgICAgIG1f
bGFzdFNjcm9sbGJhclVuZGVyTW91c2UtPm1vdXNlRXhpdGVkKCk7CisgICAgICAgIG1fbGFzdFNj
cm9sbGJhclVuZGVyTW91c2UgPSBzY3JvbGxiYXI7CisgICAgfQorCisgICAgaWYgKHNjcm9sbGJh
cikgeworICAgICAgICBzY3JvbGxiYXItPm1vdXNlTW92ZWQoZXZlbnQpOworICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWlzUG9pbnRJbkJvdW5kcyhldmVudC5wb3MoKSkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHNlbGVjdEluZGV4KHBvaW50VG9Sb3dJbmRl
eChldmVudC5wb3MoKSkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFBvcHVwTGlzdEJv
eDo6aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVu
dCkKK3sKKyAgICBpZiAobV9jYXB0dXJpbmdTY3JvbGxiYXIpIHsKKyAgICAgICAgbV9jYXB0dXJp
bmdTY3JvbGxiYXItPm1vdXNlVXAoKTsKKyAgICAgICAgbV9jYXB0dXJpbmdTY3JvbGxiYXIgPSAw
OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIWlzUG9pbnRJbkJvdW5k
cyhldmVudC5wb3MoKSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gTmVlZCB0byBj
aGVjayBiZWZvcmUgY2FsbGluZyBhY2NlcHRJbmRleCgpLCBiZWNhdXNlIG1fcG9wdXBDbGllbnQg
bWlnaHQgYmUgcmVtb3ZlZCBpbiBhY2NlcHRJbmRleCgpIGNhbGxpbmcgYmVjYXVzZSBvZiBldmVu
dCBoYW5kbGVyLgorICAgIGJvb2wgaXNTZWxlY3RQb3B1cCA9IG1fcG9wdXBDbGllbnQtPm1lbnVT
dHlsZSgpLm1lbnVUeXBlKCkgPT0gUG9wdXBNZW51U3R5bGU6OlNlbGVjdFBvcHVwOworICAgIGlm
IChhY2NlcHRJbmRleChwb2ludFRvUm93SW5kZXgoZXZlbnQucG9zKCkpKSAmJiBtX2ZvY3VzZWRO
b2RlICYmIGlzU2VsZWN0UG9wdXApIHsKKyAgICAgICAgbV9mb2N1c2VkTm9kZS0+ZGlzcGF0Y2hN
b3VzZUV2ZW50KGV2ZW50LCBldmVudE5hbWVzKCkubW91c2V1cEV2ZW50KTsKKyAgICAgICAgbV9m
b2N1c2VkTm9kZS0+ZGlzcGF0Y2hNb3VzZUV2ZW50KGV2ZW50LCBldmVudE5hbWVzKCkuY2xpY2tF
dmVudCk7CisKKyAgICAgICAgLy8gQ2xlYXIgbV9mb2N1c2VkTm9kZSBoZXJlLCBiZWNhdXNlIHdl
IGNhbm5vdCBjbGVhciBpbiBoaWRlUG9wdXAoKSB3aGljaCBpcyBjYWxsZWQgYmVmb3JlIGRpc3Bh
dGNoTW91c2VFdmVudCgpIGlzIGNhbGxlZC4KKyAgICAgICAgbV9mb2N1c2VkTm9kZSA9IDA7Cisg
ICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVX
aGVlbEV2ZW50KGNvbnN0IFBsYXRmb3JtV2hlZWxFdmVudCYgZXZlbnQpCit7CisgICAgaWYgKCFp
c1BvaW50SW5Cb3VuZHMoZXZlbnQucG9zKCkpKSB7CisgICAgICAgIGFiYW5kb24oKTsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gUGFzcyBpdCBvZmYgdG8gdGhlIHNjcm9s
bCB2aWV3LgorICAgIC8vIFNhZGx5LCBXZWJDb3JlIGRldnMgZG9uJ3QgdW5kZXJzdGFuZCB0aGUg
d2hvbGUgImNvbnN0IiB0aGluZy4KKyAgICB3aGVlbEV2ZW50KGNvbnN0X2Nhc3Q8UGxhdGZvcm1X
aGVlbEV2ZW50Jj4oZXZlbnQpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gU2hvdWxkIGJl
IGtlcHQgaW4gc3luYyB3aXRoIGhhbmRsZUtleUV2ZW50KCkuCitib29sIFBvcHVwTGlzdEJveDo6
aXNJbnRlcmVzdGVkSW5FdmVudEZvcktleShpbnQga2V5Q29kZSkKK3sKKyAgICBzd2l0Y2ggKGtl
eUNvZGUpIHsKKyAgICBjYXNlIFZLRVlfRVNDQVBFOgorICAgIGNhc2UgVktFWV9SRVRVUk46Cisg
ICAgY2FzZSBWS0VZX1VQOgorICAgIGNhc2UgVktFWV9ET1dOOgorICAgIGNhc2UgVktFWV9QUklP
UjoKKyAgICBjYXNlIFZLRVlfTkVYVDoKKyAgICBjYXNlIFZLRVlfSE9NRToKKyAgICBjYXNlIFZL
RVlfRU5EOgorICAgIGNhc2UgVktFWV9UQUI6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRl
ZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKyNpZiBFTkFCTEUoVE9V
Q0hfRVZFTlRTKQorYm9vbCBQb3B1cExpc3RCb3g6OmhhbmRsZVRvdWNoRXZlbnQoY29uc3QgUGxh
dGZvcm1Ub3VjaEV2ZW50JikKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKworI2lm
IEVOQUJMRShHRVNUVVJFX1JFQ09HTklaRVIpCitib29sIFBvcHVwTGlzdEJveDo6aGFuZGxlR2Vz
dHVyZUV2ZW50KGNvbnN0IFBsYXRmb3JtR2VzdHVyZUV2ZW50JikKK3sKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisjZW5kaWYKKworc3RhdGljIGJvb2wgaXNDaGFyYWN0ZXJUeXBlRXZlbnQoY29uc3Qg
UGxhdGZvcm1LZXlib2FyZEV2ZW50JiBldmVudCkKK3sKKyAgICAvLyBDaGVjayB3aGV0aGVyIHRo
ZSBldmVudCBpcyBhIGNoYXJhY3Rlci10eXBlZCBldmVudCBvciBub3QuCisgICAgLy8gV2UgdXNl
IFJhd0tleURvd24vQ2hhci9LZXlVcCBldmVudCBzY2hlbWUgb24gYWxsIHBsYXRmb3JtcywKKyAg
ICAvLyBzbyBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6OkNoYXIgKG5vdCBSYXdLZXlEb3duKSB0eXBl
IGV2ZW50CisgICAgLy8gaXMgY29uc2lkZXJlZCBhcyBjaGFyYWN0ZXIgdHlwZSBldmVudC4KKyAg
ICByZXR1cm4gZXZlbnQudHlwZSgpID09IFBsYXRmb3JtS2V5Ym9hcmRFdmVudDo6Q2hhcjsKK30K
KworYm9vbCBQb3B1cExpc3RCb3g6OmhhbmRsZUtleUV2ZW50KGNvbnN0IFBsYXRmb3JtS2V5Ym9h
cmRFdmVudCYgZXZlbnQpCit7CisgICAgaWYgKGV2ZW50LnR5cGUoKSA9PSBQbGF0Zm9ybUtleWJv
YXJkRXZlbnQ6OktleVVwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghbnVtSXRl
bXMoKSAmJiBldmVudC53aW5kb3dzVmlydHVhbEtleUNvZGUoKSAhPSBWS0VZX0VTQ0FQRSkKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBzd2l0Y2ggKGV2ZW50LndpbmRvd3NWaXJ0dWFsS2V5
Q29kZSgpKSB7CisgICAgY2FzZSBWS0VZX0VTQ0FQRToKKyAgICAgICAgYWJhbmRvbigpOyAvLyBt
YXkgZGVsZXRlIHRoaXMKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBWS0VZX1JFVFVS
TjoKKyAgICAgICAgaWYgKG1fc2VsZWN0ZWRJbmRleCA9PSAtMSkgIHsKKyAgICAgICAgICAgIGhp
ZGVQb3B1cCgpOworICAgICAgICAgICAgLy8gRG9uJ3QgZWF0IHRoZSBlbnRlciBpZiBub3RoaW5n
IGlzIHNlbGVjdGVkLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAg
ICAgIGFjY2VwdEluZGV4KG1fc2VsZWN0ZWRJbmRleCk7IC8vIG1heSBkZWxldGUgdGhpcworICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIFZLRVlfVVA6CisgICAgY2FzZSBWS0VZX0RPV046
CisgICAgICAgIC8vIFdlIGhhdmUgdG8gZm9yd2FyZCBvbmx5IHNoaWZ0ICsgdXAgY29tYmluYXRp
b24gdG8gZm9jdXNlZCBub2RlIHdoZW4gYXV0b2ZpbGwgcG9wdXAuCisgICAgICAgIC8vIEJlY2F1
c2UgYWxsIGNoYXJhY3RlcnMgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgdGV4
dCBhcmVhIHNob3VsZCBzZWxlY3RlZCB3aGVuIHlvdSBwcmVzcyBzaGlmdCArIHVwIGFycm93Lgor
ICAgICAgICAvLyBzaGlmdCArIGRvd24gc2hvdWxkIGJlIHRoZSBzaW1pbGFyIHdheSB0byBzaGlm
dCArIHVwLgorICAgICAgICBpZiAoZXZlbnQubW9kaWZpZXJzKCkgJiYgbV9wb3B1cENsaWVudC0+
bWVudVN0eWxlKCkubWVudVR5cGUoKSA9PSBQb3B1cE1lbnVTdHlsZTo6QXV0b2ZpbGxQb3B1cCkK
KyAgICAgICAgICAgIG1fZm9jdXNlZE5vZGUtPmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOworICAg
ICAgICBlbHNlIGlmIChldmVudC53aW5kb3dzVmlydHVhbEtleUNvZGUoKSA9PSBWS0VZX1VQKQor
ICAgICAgICAgICAgc2VsZWN0UHJldmlvdXNSb3coKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgc2VsZWN0TmV4dFJvdygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLRVlfUFJJT1I6
CisgICAgICAgIGFkanVzdFNlbGVjdGVkSW5kZXgoLW1fdmlzaWJsZVJvd3MpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFZLRVlfTkVYVDoKKyAgICAgICAgYWRqdXN0U2VsZWN0ZWRJbmRleCht
X3Zpc2libGVSb3dzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWS0VZX0hPTUU6CisgICAg
ICAgIGFkanVzdFNlbGVjdGVkSW5kZXgoLW1fc2VsZWN0ZWRJbmRleCk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgVktFWV9FTkQ6CisgICAgICAgIGFkanVzdFNlbGVjdGVkSW5kZXgobV9pdGVt
cy5zaXplKCkpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoIWV2
ZW50LmN0cmxLZXkoKSAmJiAhZXZlbnQuYWx0S2V5KCkgJiYgIWV2ZW50Lm1ldGFLZXkoKQorICAg
ICAgICAgICAgJiYgaXNQcmludGFibGVDaGFyKGV2ZW50LndpbmRvd3NWaXJ0dWFsS2V5Q29kZSgp
KQorICAgICAgICAgICAgJiYgaXNDaGFyYWN0ZXJUeXBlRXZlbnQoZXZlbnQpKQorICAgICAgICAg
ICAgdHlwZUFoZWFkRmluZChldmVudCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlm
IChtX29yaWdpbmFsSW5kZXggIT0gbV9zZWxlY3RlZEluZGV4KSB7CisgICAgICAgIC8vIEtleWJv
YXJkIGV2ZW50cyBzaG91bGQgdXBkYXRlIHRoZSBzZWxlY3Rpb24gaW1tZWRpYXRlbHkgKGJ1dCB3
ZSBkb24ndAorICAgICAgICAvLyB3YW50IHRvIGZpcmUgdGhlIG9uY2hhbmdlIGV2ZW50IHVudGls
IHRoZSBwb3B1cCBpcyBjbG9zZWQsIHRvIG1hdGNoCisgICAgICAgIC8vIElFKS4gV2UgY2hhbmdl
IHRoZSBvcmlnaW5hbCBpbmRleCBzbyB3ZSByZXZlcnQgdG8gdGhhdCB3aGVuIHRoZQorICAgICAg
ICAvLyBwb3B1cCBpcyBjbG9zZWQuCisgICAgICAgIGlmIChtX3NldHRpbmdzLmFjY2VwdE9uQWJh
bmRvbikKKyAgICAgICAgICAgIG1fYWNjZXB0ZWRJbmRleE9uQWJhbmRvbiA9IG1fc2VsZWN0ZWRJ
bmRleDsKKworICAgICAgICBzZXRPcmlnaW5hbEluZGV4KG1fc2VsZWN0ZWRJbmRleCk7CisgICAg
ICAgIGlmIChtX3NldHRpbmdzLnNldFRleHRPbkluZGV4Q2hhbmdlKQorICAgICAgICAgICAgbV9w
b3B1cENsaWVudC0+c2V0VGV4dEZyb21JdGVtKG1fc2VsZWN0ZWRJbmRleCk7CisgICAgfQorICAg
IGlmIChldmVudC53aW5kb3dzVmlydHVhbEtleUNvZGUoKSA9PSBWS0VZX1RBQikgeworICAgICAg
ICAvLyBUQUIgaXMgYSBzcGVjaWFsIGNhc2UgYXMgaXQgc2hvdWxkIHNlbGVjdCB0aGUgY3VycmVu
dCBpdGVtIGlmIGFueSBhbmQKKyAgICAgICAgLy8gYWR2YW5jZSBmb2N1cy4KKyAgICAgICAgaWYg
KG1fc2VsZWN0ZWRJbmRleCA+PSAwKSB7CisgICAgICAgICAgICBhY2NlcHRJbmRleChtX3NlbGVj
dGVkSW5kZXgpOyAvLyBNYXkgZGVsZXRlIHVzLgorICAgICAgICAgICAgLy8gUmV0dXJuIGZhbHNl
IHNvIHRoZSBUQUIga2V5IGV2ZW50IGlzIHByb3BhZ2F0ZWQgdG8gdGhlIHBhZ2UuCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2FsbCBhYmFuZG9uKCkg
c28gd2UgaG9ub3IgbV9hY2NlcHRlZEluZGV4T25BYmFuZG9uIGlmIHNldC4KKyAgICAgICAgYWJh
bmRvbigpOworICAgICAgICAvLyBSZXR1cm4gZmFsc2Ugc28gdGhlIFRBQiBrZXkgZXZlbnQgaXMg
cHJvcGFnYXRlZCB0byB0aGUgcGFnZS4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwor
ICAgIHJldHVybiB0cnVlOworfQorCitIb3N0V2luZG93KiBQb3B1cExpc3RCb3g6Omhvc3RXaW5k
b3coKSBjb25zdAoreworICAgIC8vIE91ciBwYXJlbnQgaXMgdGhlIHJvb3QgU2Nyb2xsVmlldywg
c28gaXQgaXMgdGhlIG9uZSB0aGF0IGhhcyBhCisgICAgLy8gSG9zdFdpbmRvdy4gRnJhbWVWaWV3
Ojpob3N0V2luZG93KCkgd29ya3Mgc2ltaWxhcmx5LgorICAgIHJldHVybiBwYXJlbnQoKSA/IHBh
cmVudCgpLT5ob3N0V2luZG93KCkgOiAwOworfQorCisvLyBGcm9tIEhUTUxTZWxlY3RFbGVtZW50
LmNwcAorc3RhdGljIFN0cmluZyBzdHJpcExlYWRpbmdXaGl0ZVNwYWNlKGNvbnN0IFN0cmluZyYg
c3RyaW5nKQoreworICAgIGludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7CisgICAgaW50IGk7
CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICBpZiAoc3RyaW5nW2ld
ICE9IG5vQnJlYWtTcGFjZQorICAgICAgICAgICAgJiYgKHN0cmluZ1tpXSA8PSAweDdGID8gIWlz
c3BhY2Uoc3RyaW5nW2ldKSA6IChkaXJlY3Rpb24oc3RyaW5nW2ldKSAhPSBXaGl0ZVNwYWNlTmV1
dHJhbCkpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmlu
ZyhpLCBsZW5ndGggLSBpKTsKK30KKworLy8gRnJvbSBIVE1MU2VsZWN0RWxlbWVudC5jcHAsIHdp
dGggbW9kaWZpY2F0aW9ucwordm9pZCBQb3B1cExpc3RCb3g6OnR5cGVBaGVhZEZpbmQoY29uc3Qg
UGxhdGZvcm1LZXlib2FyZEV2ZW50JiBldmVudCkKK3sKKyAgICBUaW1lU3RhbXAgbm93ID0gc3Rh
dGljX2Nhc3Q8VGltZVN0YW1wPihjdXJyZW50VGltZSgpICogMTAwMC4wZik7CisgICAgVGltZVN0
YW1wIGRlbHRhID0gbm93IC0gbV9sYXN0Q2hhclRpbWU7CisKKyAgICAvLyBSZXNldCB0aGUgdGlt
ZSB3aGVuIHVzZXIgdHlwZXMgaW4gYSBjaGFyYWN0ZXIuIFRoZSB0aW1lIGdhcCBiZXR3ZWVuCisg
ICAgLy8gbGFzdCBjaGFyYWN0ZXIgYW5kIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyB1c2VkIHRv
IGluZGljYXRlIHdoZXRoZXIKKyAgICAvLyB1c2VyIHR5cGVkIGluIGEgc3RyaW5nIG9yIGp1c3Qg
YSBjaGFyYWN0ZXIgYXMgdGhlIHNlYXJjaCBwcmVmaXguCisgICAgbV9sYXN0Q2hhclRpbWUgPSBu
b3c7CisKKyAgICBVQ2hhciBjID0gZXZlbnQud2luZG93c1ZpcnR1YWxLZXlDb2RlKCk7CisKKyAg
ICBTdHJpbmcgcHJlZml4OworICAgIGludCBzZWFyY2hTdGFydE9mZnNldCA9IDE7CisgICAgaWYg
KGRlbHRhID4ga1R5cGVBaGVhZFRpbWVvdXRNcykgeworICAgICAgICBtX3R5cGVkU3RyaW5nID0g
cHJlZml4ID0gU3RyaW5nKCZjLCAxKTsKKyAgICAgICAgbV9yZXBlYXRpbmdDaGFyID0gYzsKKyAg
ICB9IGVsc2UgeworICAgICAgICBtX3R5cGVkU3RyaW5nLmFwcGVuZChjKTsKKworICAgICAgICBp
ZiAoYyA9PSBtX3JlcGVhdGluZ0NoYXIpCisgICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBsaWtl
bHkgdHJ5aW5nIHRvIGN5Y2xlIHRocm91Z2ggYWxsIHRoZSBpdGVtcyBzdGFydGluZyB3aXRoIHRo
aXMgY2hhcmFjdGVyLCBzbyBqdXN0IHNlYXJjaCBvbiB0aGUgY2hhcmFjdGVyCisgICAgICAgICAg
ICBwcmVmaXggPSBTdHJpbmcoJmMsIDEpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1f
cmVwZWF0aW5nQ2hhciA9IDA7CisgICAgICAgICAgICBwcmVmaXggPSBtX3R5cGVkU3RyaW5nOwor
ICAgICAgICAgICAgc2VhcmNoU3RhcnRPZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQorCisg
ICAgLy8gQ29tcHV0ZSBhIGNhc2UtZm9sZGVkIGNvcHkgb2YgdGhlIHByZWZpeCBzdHJpbmcgYmVm
b3JlIGJlZ2lubmluZyB0aGUgc2VhcmNoIGZvcgorICAgIC8vIGEgbWF0Y2hpbmcgZWxlbWVudC4g
VGhpcyBjb2RlIHVzZXMgZm9sZENhc2UgdG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdAorICAg
IC8vIFN0cmluZzo6c3RhcnRXaXRoIGRvZXMgbm90IGZvbGQgbm9uLUFTQ0lJIGNoYXJhY3RlcnMu
IFRoaXMgY29kZSBjYW4gYmUgY2hhbmdlZAorICAgIC8vIHRvIHVzZSBzdGFydFdpdGggb25jZSB0
aGF0IGlzIGZpeGVkLgorICAgIFN0cmluZyBwcmVmaXhXaXRoQ2FzZUZvbGRlZChwcmVmaXguZm9s
ZENhc2UoKSk7CisgICAgaW50IGl0ZW1Db3VudCA9IG51bUl0ZW1zKCk7CisgICAgaW50IGluZGV4
ID0gKG1heCgwLCBtX3NlbGVjdGVkSW5kZXgpICsgc2VhcmNoU3RhcnRPZmZzZXQpICUgaXRlbUNv
dW50OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyssIGluZGV4ID0gKGlu
ZGV4ICsgMSkgJSBpdGVtQ291bnQpIHsKKyAgICAgICAgaWYgKCFpc1NlbGVjdGFibGVJdGVtKGlu
ZGV4KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChzdHJpcExlYWRpbmdX
aGl0ZVNwYWNlKG1faXRlbXNbaW5kZXhdLT5sYWJlbCkuZm9sZENhc2UoKS5zdGFydHNXaXRoKHBy
ZWZpeFdpdGhDYXNlRm9sZGVkKSkgeworICAgICAgICAgICAgc2VsZWN0SW5kZXgoaW5kZXgpOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFBvcHVwTGlz
dEJveDo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiBnYywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sK
KyAgICAvLyBhZGp1c3QgY29vcmRzIGZvciBzY3JvbGxlZCBmcmFtZQorICAgIEludFJlY3QgciA9
IGludGVyc2VjdGlvbihyZWN0LCBmcmFtZVJlY3QoKSk7CisgICAgaW50IHR4ID0geCgpIC0gc2Ny
b2xsWCgpOworICAgIGludCB0eSA9IHkoKSAtIHNjcm9sbFkoKTsKKworICAgIHIubW92ZSgtdHgs
IC10eSk7CisKKyAgICAvLyBzZXQgY2xpcCByZWN0IHRvIG1hdGNoIHJldmlzZWQgZGFtYWdlIHJl
Y3QKKyAgICBnYy0+c2F2ZSgpOworICAgIGdjLT50cmFuc2xhdGUoc3RhdGljX2Nhc3Q8ZmxvYXQ+
KHR4KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR5KSk7CisgICAgZ2MtPmNsaXAocik7CisKKyAgICAv
LyBGSVhNRTogQ2FuIHdlIG9wdGltaXplIHNjcm9sbGluZyB0byBub3QgcmVxdWlyZSByZXBhaW50
aW5nIHRoZSBlbnRpcmUKKyAgICAvLyB3aW5kb3c/IFNob3VsZCB3ZT8KKyAgICBmb3IgKGludCBp
ID0gMDsgaSA8IG51bUl0ZW1zKCk7ICsraSkKKyAgICAgICAgcGFpbnRSb3coZ2MsIHIsIGkpOwor
CisgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBhbiBlbXB0eSBwb3B1cC4KKyAgICBpZiAoIW51bUl0
ZW1zKCkpCisgICAgICAgIGdjLT5maWxsUmVjdChyLCBDb2xvcjo6d2hpdGUsIENvbG9yU3BhY2VE
ZXZpY2VSR0IpOworCisgICAgZ2MtPnJlc3RvcmUoKTsKKworICAgIFNjcm9sbFZpZXc6OnBhaW50
KGdjLCByZWN0KTsKK30KKworc3RhdGljIGNvbnN0IGludCBzZXBhcmF0b3JQYWRkaW5nID0gNDsK
K3N0YXRpYyBjb25zdCBpbnQgc2VwYXJhdG9ySGVpZ2h0ID0gMTsKKwordm9pZCBQb3B1cExpc3RC
b3g6OnBhaW50Um93KEdyYXBoaWNzQ29udGV4dCogZ2MsIGNvbnN0IEludFJlY3QmIHJlY3QsIGlu
dCByb3dJbmRleCkKK3sKKyAgICAvLyBUaGlzIGNvZGUgaXMgYmFzZWQgbGFyZ2VseSBvbiBSZW5k
ZXJMaXN0Qm94OjpwYWludCogbWV0aG9kcy4KKworICAgIEludFJlY3Qgcm93UmVjdCA9IGdldFJv
d0JvdW5kcyhyb3dJbmRleCk7CisgICAgaWYgKCFyb3dSZWN0LmludGVyc2VjdHMocmVjdCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIFBvcHVwTWVudVN0eWxlIHN0eWxlID0gbV9wb3B1cENsaWVu
dC0+aXRlbVN0eWxlKHJvd0luZGV4KTsKKworICAgIC8vIFBhaW50IGJhY2tncm91bmQKKyAgICBD
b2xvciBiYWNrQ29sb3IsIHRleHRDb2xvciwgbGFiZWxDb2xvcjsKKyAgICBpZiAocm93SW5kZXgg
PT0gbV9zZWxlY3RlZEluZGV4KSB7CisgICAgICAgIGJhY2tDb2xvciA9IFJlbmRlclRoZW1lOjpk
ZWZhdWx0VGhlbWUoKS0+YWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpOwor
ICAgICAgICB0ZXh0Q29sb3IgPSBSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCktPmFjdGl2ZUxp
c3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKTsKKyAgICAgICAgbGFiZWxDb2xvciA9IHRl
eHRDb2xvcjsKKyAgICB9IGVsc2UgeworICAgICAgICBiYWNrQ29sb3IgPSBzdHlsZS5iYWNrZ3Jv
dW5kQ29sb3IoKTsKKyAgICAgICAgdGV4dENvbG9yID0gc3R5bGUuZm9yZWdyb3VuZENvbG9yKCk7
CisgICAgICAgIC8vIEZJWE1FOiBmb3Igbm93IHRoZSBsYWJlbCBjb2xvciBpcyBoYXJkLWNvZGVk
LiBJdCBzaG91bGQgYmUgYWRkZWQgdG8KKyAgICAgICAgLy8gdGhlIFBvcHVwTWVudVN0eWxlLgor
ICAgICAgICBsYWJlbENvbG9yID0gQ29sb3IoMTE1LCAxMTUsIDExNSk7CisgICAgfQorCisgICAg
Ly8gSWYgd2UgaGF2ZSBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQsIG1ha2Ugc3VyZSBpdCBoYXMg
YSBjb2xvciB0byBibGVuZAorICAgIC8vIGFnYWluc3QuCisgICAgaWYgKGJhY2tDb2xvci5oYXNB
bHBoYSgpKQorICAgICAgICBnYy0+ZmlsbFJlY3Qocm93UmVjdCwgQ29sb3I6OndoaXRlLCBDb2xv
clNwYWNlRGV2aWNlUkdCKTsKKworICAgIGdjLT5maWxsUmVjdChyb3dSZWN0LCBiYWNrQ29sb3Is
IENvbG9yU3BhY2VEZXZpY2VSR0IpOworCisgICAgLy8gSXQgZG9lc24ndCBsb29rIGdvb2QgYnV0
IEF1dG9maWxsIHJlcXVpcmVzIHNwZWNpYWwgc3R5bGUgZm9yIHNlcGFyYXRvci4KKyAgICAvLyBB
dXRvZmlsbCBkb2Vzbid0IGhhdmUgcGFkZGluZyBhbmQgI2RjZGNkYyBjb2xvci4KKyAgICBpZiAo
bV9wb3B1cENsaWVudC0+aXRlbUlzU2VwYXJhdG9yKHJvd0luZGV4KSkgeworICAgICAgICBpbnQg
cGFkZGluZyA9IHN0eWxlLm1lbnVUeXBlKCkgPT0gUG9wdXBNZW51U3R5bGU6OkF1dG9maWxsUG9w
dXAgPyAwIDogc2VwYXJhdG9yUGFkZGluZzsKKyAgICAgICAgSW50UmVjdCBzZXBhcmF0b3JSZWN0
KAorICAgICAgICAgICAgcm93UmVjdC54KCkgKyBwYWRkaW5nLAorICAgICAgICAgICAgcm93UmVj
dC55KCkgKyAocm93UmVjdC5oZWlnaHQoKSAtIHNlcGFyYXRvckhlaWdodCkgLyAyLAorICAgICAg
ICAgICAgcm93UmVjdC53aWR0aCgpIC0gMiAqIHBhZGRpbmcsIHNlcGFyYXRvckhlaWdodCk7Cisg
ICAgICAgIGdjLT5maWxsUmVjdChzZXBhcmF0b3JSZWN0LCBzdHlsZS5tZW51VHlwZSgpID09IFBv
cHVwTWVudVN0eWxlOjpBdXRvZmlsbFBvcHVwID8gQ29sb3IoMHhkYywgMHhkYywgMHhkYykgOiB0
ZXh0Q29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgaWYgKCFzdHlsZS5pc1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZ2Mt
PnNldEZpbGxDb2xvcih0ZXh0Q29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworCisgICAgRm9u
dCBpdGVtRm9udCA9IGdldFJvd0ZvbnQocm93SW5kZXgpOworICAgIC8vIEZJWE1FOiBodHRwOi8v
Y3JidWcuY29tLzE5ODcyIFdlIHNob3VsZCBnZXQgdGhlIHBhZGRpbmcgb2YgaW5kaXZpZHVhbCBv
cHRpb24KKyAgICAvLyBlbGVtZW50cy4gVGhpcyBwcm9iYWJseSBpbXBsaWVzIGNoYW5nZXMgdG8g
UG9wdXBNZW51Q2xpZW50LgorICAgIGJvb2wgcmlnaHRBbGlnbmVkID0gbV9wb3B1cENsaWVudC0+
bWVudVN0eWxlKCkudGV4dERpcmVjdGlvbigpID09IFJUTDsKKyAgICBpbnQgdGV4dFggPSAwOwor
ICAgIGludCBtYXhXaWR0aCA9IDA7CisgICAgaWYgKHJpZ2h0QWxpZ25lZCkKKyAgICAgICAgbWF4
V2lkdGggPSByb3dSZWN0LndpZHRoKCkgLSBtYXgoMCwgbV9wb3B1cENsaWVudC0+Y2xpZW50UGFk
ZGluZ1JpZ2h0KCkgLSBtX3BvcHVwQ2xpZW50LT5jbGllbnRJbnNldFJpZ2h0KCkpOworICAgIGVs
c2UgeworICAgICAgICB0ZXh0WCA9IG1heCgwLCBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5n
TGVmdCgpIC0gbV9wb3B1cENsaWVudC0+Y2xpZW50SW5zZXRMZWZ0KCkpOworICAgICAgICBtYXhX
aWR0aCA9IHJvd1JlY3Qud2lkdGgoKSAtIHRleHRYOworICAgIH0KKyAgICAvLyBQcmVwYXJlIHRl
eHQgdG8gYmUgZHJhd24uCisgICAgU3RyaW5nIGl0ZW1UZXh0ID0gbV9wb3B1cENsaWVudC0+aXRl
bVRleHQocm93SW5kZXgpOworICAgIFN0cmluZyBpdGVtTGFiZWwgPSBtX3BvcHVwQ2xpZW50LT5p
dGVtTGFiZWwocm93SW5kZXgpOworICAgIFN0cmluZyBpdGVtSWNvbiA9IG1fcG9wdXBDbGllbnQt
Pml0ZW1JY29uKHJvd0luZGV4KTsKKyAgICBpZiAobV9zZXR0aW5ncy5yZXN0cmljdFdpZHRoT2ZM
aXN0Qm94KSB7IC8vIFRydW5jYXRlIHN0cmluZ3MgdG8gZml0IGluLgorICAgICAgICAvLyBGSVhN
RTogV2Ugc2hvdWxkIGxlZnRUcnVuY2F0ZSBmb3IgdGhlIHJ0bCBjYXNlLgorICAgICAgICAvLyBT
dHJpbmdUcnVuY2F0b3I6OmxlZnRUcnVuY2F0ZSB3b3VsZCBoYXZlIHRvIGJlIGltcGxlbWVudGVk
LgorICAgICAgICBTdHJpbmcgc3RyID0gU3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKGl0
ZW1UZXh0LCBtYXhXaWR0aCwgaXRlbUZvbnQpOworICAgICAgICBpZiAoc3RyICE9IGl0ZW1UZXh0
KSB7CisgICAgICAgICAgICBpdGVtVGV4dCA9IHN0cjsKKyAgICAgICAgICAgIC8vIERvbid0IGRp
c3BsYXkgdGhlIGxhYmVsIG9yIGljb24sIHdlIGFscmVhZHkgZG9uJ3QgaGF2ZSBlbm91Z2ggcm9v
bSBmb3IgdGhlIGl0ZW0gdGV4dC4KKyAgICAgICAgICAgIGl0ZW1MYWJlbCA9ICIiOworICAgICAg
ICAgICAgaXRlbUljb24gPSAiIjsKKyAgICAgICAgfSBlbHNlIGlmICghaXRlbUxhYmVsLmlzRW1w
dHkoKSkgeworICAgICAgICAgICAgaW50IGF2YWlsYWJsZVdpZHRoID0gbWF4V2lkdGggLSBrVGV4
dFRvTGFiZWxQYWRkaW5nIC0KKyAgICAgICAgICAgICAgICBTdHJpbmdUcnVuY2F0b3I6OndpZHRo
KGl0ZW1UZXh0LCBpdGVtRm9udCk7CisgICAgICAgICAgICBpdGVtTGFiZWwgPSBTdHJpbmdUcnVu
Y2F0b3I6OnJpZ2h0VHJ1bmNhdGUoaXRlbUxhYmVsLCBhdmFpbGFibGVXaWR0aCwgaXRlbUZvbnQp
OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUHJlcGFyZSB0aGUgZGlyZWN0aW9uYWxpdHkg
dG8gZHJhdyB0ZXh0LgorICAgIFRleHRSdW4gdGV4dFJ1bihpdGVtVGV4dC5jaGFyYWN0ZXJzKCks
IGl0ZW1UZXh0Lmxlbmd0aCgpLCBmYWxzZSwgMCwgMCwgVGV4dFJ1bjo6QWxsb3dUcmFpbGluZ0V4
cGFuc2lvbiwgc3R5bGUudGV4dERpcmVjdGlvbigpLCBzdHlsZS5oYXNUZXh0RGlyZWN0aW9uT3Zl
cnJpZGUoKSk7CisgICAgLy8gSWYgdGhlIHRleHQgaXMgcmlnaHQtdG8tbGVmdCwgbWFrZSBpdCBy
aWdodC1hbGlnbmVkIGJ5IGFkanVzdGluZyBpdHMKKyAgICAvLyBiZWdpbm5pbmcgcG9zaXRpb24u
CisgICAgaWYgKHJpZ2h0QWxpZ25lZCkKKyAgICAgICAgdGV4dFggKz0gbWF4V2lkdGggLSBpdGVt
Rm9udC53aWR0aCh0ZXh0UnVuKTsKKworICAgIC8vIERyYXcgdGhlIGl0ZW0gdGV4dC4KKyAgICBp
bnQgdGV4dFkgPSByb3dSZWN0LnkoKSArIGl0ZW1Gb250LmZvbnRNZXRyaWNzKCkuYXNjZW50KCkg
KyAocm93UmVjdC5oZWlnaHQoKSAtIGl0ZW1Gb250LmZvbnRNZXRyaWNzKCkuaGVpZ2h0KCkpIC8g
MjsKKyAgICBnYy0+ZHJhd0JpZGlUZXh0KGl0ZW1Gb250LCB0ZXh0UnVuLCBJbnRQb2ludCh0ZXh0
WCwgdGV4dFkpKTsKKworICAgIC8vIFdlIGFyZSB1c2luZyB0aGUgbGVmdCBwYWRkaW5nIGFzIHRo
ZSByaWdodCBwYWRkaW5nIGluY2x1ZGVzIHJvb20gZm9yIHRoZSBzY3JvbGwtYmFyIHdoaWNoCisg
ICAgLy8gZG9lcyBub3Qgc2hvdyBpbiB0aGlzIGNhc2UuCisgICAgaW50IHJpZ2h0UGFkZGluZyA9
IG1heCgwLCBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nTGVmdCgpIC0gbV9wb3B1cENsaWVu
dC0+Y2xpZW50SW5zZXRMZWZ0KCkpOworICAgIGludCByZW1haW5pbmdXaWR0aCA9IHJvd1JlY3Qu
d2lkdGgoKSAtIHJpZ2h0UGFkZGluZzsKKworICAgIC8vIERyYXcgdGhlIGljb24gaWYgYXBwbGlj
YWJsZS4KKyAgICBSZWZQdHI8SW1hZ2U+IGltYWdlKEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJj
ZShpdGVtSWNvbi51dGY4KCkuZGF0YSgpKSk7CisgICAgaWYgKGltYWdlICYmICFpbWFnZS0+aXNO
dWxsKCkpIHsKKyAgICAgICAgSW50UmVjdCBpbWFnZVJlY3QgPSBpbWFnZS0+cmVjdCgpOworICAg
ICAgICByZW1haW5pbmdXaWR0aCAtPSAoaW1hZ2VSZWN0LndpZHRoKCkgKyBrTGFiZWxUb0ljb25Q
YWRkaW5nKTsKKyAgICAgICAgaW1hZ2VSZWN0LnNldFgocm93UmVjdC53aWR0aCgpIC0gcmlnaHRQ
YWRkaW5nIC0gaW1hZ2VSZWN0LndpZHRoKCkpOworICAgICAgICBpbWFnZVJlY3Quc2V0WShyb3dS
ZWN0LnkoKSArIChyb3dSZWN0LmhlaWdodCgpIC0gaW1hZ2VSZWN0LmhlaWdodCgpKSAvIDIpOwor
ICAgICAgICBnYy0+ZHJhd0ltYWdlKGltYWdlLmdldCgpLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBp
bWFnZVJlY3QpOworICAgIH0KKworICAgIC8vIERyYXcgdGhlIHRoZSBsYWJlbCBpZiBhcHBsaWNh
YmxlLgorICAgIGlmIChpdGVtTGFiZWwuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBBdXRvZmlsbCBsYWJlbCBpcyAwLjkgc21hbGxlciB0aGFuIHJlZ3VsYXIgZm9udCBzaXpl
LgorICAgIGlmIChzdHlsZS5tZW51VHlwZSgpID09IFBvcHVwTWVudVN0eWxlOjpBdXRvZmlsbFBv
cHVwKSB7CisgICAgICAgIGl0ZW1Gb250ID0gbV9wb3B1cENsaWVudC0+aXRlbVN0eWxlKHJvd0lu
ZGV4KS5mb250KCk7CisgICAgICAgIEZvbnREZXNjcmlwdGlvbiBkID0gaXRlbUZvbnQuZm9udERl
c2NyaXB0aW9uKCk7CisgICAgICAgIGQuc2V0Q29tcHV0ZWRTaXplKGQuY29tcHV0ZWRTaXplKCkg
KiAwLjkpOworICAgICAgICBpdGVtRm9udCA9IEZvbnQoZCwgaXRlbUZvbnQubGV0dGVyU3BhY2lu
ZygpLCBpdGVtRm9udC53b3JkU3BhY2luZygpKTsKKyAgICAgICAgaXRlbUZvbnQudXBkYXRlKDAp
OworICAgIH0KKworICAgIFRleHRSdW4gbGFiZWxUZXh0UnVuKGl0ZW1MYWJlbC5jaGFyYWN0ZXJz
KCksIGl0ZW1MYWJlbC5sZW5ndGgoKSwgZmFsc2UsIDAsIDAsIFRleHRSdW46OkFsbG93VHJhaWxp
bmdFeHBhbnNpb24sIHN0eWxlLnRleHREaXJlY3Rpb24oKSwgc3R5bGUuaGFzVGV4dERpcmVjdGlv
bk92ZXJyaWRlKCkpOworICAgIGlmIChyaWdodEFsaWduZWQpCisgICAgICAgIHRleHRYID0gbWF4
KDAsIG1fcG9wdXBDbGllbnQtPmNsaWVudFBhZGRpbmdMZWZ0KCkgLSBtX3BvcHVwQ2xpZW50LT5j
bGllbnRJbnNldExlZnQoKSk7CisgICAgZWxzZQorICAgICAgICB0ZXh0WCA9IHJlbWFpbmluZ1dp
ZHRoIC0gaXRlbUZvbnQud2lkdGgobGFiZWxUZXh0UnVuKTsKKworICAgIGdjLT5zZXRGaWxsQ29s
b3IobGFiZWxDb2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7CisgICAgZ2MtPmRyYXdCaWRpVGV4
dChpdGVtRm9udCwgbGFiZWxUZXh0UnVuLCBJbnRQb2ludCh0ZXh0WCwgdGV4dFkpKTsKK30KKwor
Rm9udCBQb3B1cExpc3RCb3g6OmdldFJvd0ZvbnQoaW50IHJvd0luZGV4KQoreworICAgIEZvbnQg
aXRlbUZvbnQgPSBtX3BvcHVwQ2xpZW50LT5pdGVtU3R5bGUocm93SW5kZXgpLmZvbnQoKTsKKyAg
ICBpZiAobV9wb3B1cENsaWVudC0+aXRlbUlzTGFiZWwocm93SW5kZXgpKSB7CisgICAgICAgIC8v
IEJvbGQtaWZ5IGxhYmVscyAoaWUsIGFuIDxvcHRncm91cD4gaGVhZGluZykuCisgICAgICAgIEZv
bnREZXNjcmlwdGlvbiBkID0gaXRlbUZvbnQuZm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgIGQu
c2V0V2VpZ2h0KEZvbnRXZWlnaHRCb2xkKTsKKyAgICAgICAgRm9udCBmb250KGQsIGl0ZW1Gb250
LmxldHRlclNwYWNpbmcoKSwgaXRlbUZvbnQud29yZFNwYWNpbmcoKSk7CisgICAgICAgIGZvbnQu
dXBkYXRlKDApOworICAgICAgICByZXR1cm4gZm9udDsKKyAgICB9CisKKyAgICByZXR1cm4gaXRl
bUZvbnQ7Cit9CisKK3ZvaWQgUG9wdXBMaXN0Qm94OjphYmFuZG9uKCkKK3sKKyAgICBSZWZQdHI8
UG9wdXBMaXN0Qm94PiBrZWVwQWxpdmUodGhpcyk7CisKKyAgICBtX3NlbGVjdGVkSW5kZXggPSBt
X29yaWdpbmFsSW5kZXg7CisKKyAgICBoaWRlUG9wdXAoKTsKKworICAgIGlmIChtX2FjY2VwdGVk
SW5kZXhPbkFiYW5kb24gPj0gMCkgeworICAgICAgICBpZiAobV9wb3B1cENsaWVudCkKKyAgICAg
ICAgICAgIG1fcG9wdXBDbGllbnQtPnZhbHVlQ2hhbmdlZChtX2FjY2VwdGVkSW5kZXhPbkFiYW5k
b24pOworICAgICAgICBtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gPSAtMTsKKyAgICB9Cit9CisK
K2ludCBQb3B1cExpc3RCb3g6OnBvaW50VG9Sb3dJbmRleChjb25zdCBJbnRQb2ludCYgcG9pbnQp
Cit7CisgICAgaW50IHkgPSBzY3JvbGxZKCkgKyBwb2ludC55KCk7CisKKyAgICAvLyBGSVhNRTog
YmluYXJ5IHNlYXJjaCBpZiBwZXJmIG1hdHRlcnMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBu
dW1JdGVtcygpOyArK2kpIHsKKyAgICAgICAgaWYgKHkgPCBtX2l0ZW1zW2ldLT55T2Zmc2V0KQor
ICAgICAgICAgICAgcmV0dXJuIGktMTsKKyAgICB9CisKKyAgICAvLyBMYXN0IGl0ZW0/CisgICAg
aWYgKHkgPCBjb250ZW50c0hlaWdodCgpKQorICAgICAgICByZXR1cm4gbV9pdGVtcy5zaXplKCkt
MTsKKworICAgIHJldHVybiAtMTsKK30KKworYm9vbCBQb3B1cExpc3RCb3g6OmFjY2VwdEluZGV4
KGludCBpbmRleCkKK3sKKyAgICAvLyBDbGVhciBtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gb25j
ZSB1c2VyIGFjY2VwdHMgdGhlIHNlbGVjdGVkIGluZGV4LgorICAgIGlmIChtX2FjY2VwdGVkSW5k
ZXhPbkFiYW5kb24gPj0gMCkKKyAgICAgICAgbV9hY2NlcHRlZEluZGV4T25BYmFuZG9uID0gLTE7
CisKKyAgICBpZiAoaW5kZXggPj0gbnVtSXRlbXMoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBpZiAobV9wb3B1cENsaWVudCkgeworICAg
ICAgICAgICAgLy8gRW50ZXIgcHJlc3NlZCB3aXRoIG5vIHNlbGVjdGlvbiwganVzdCBjbG9zZSB0
aGUgcG9wdXAuCisgICAgICAgICAgICBoaWRlUG9wdXAoKTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGlzU2VsZWN0YWJsZUl0ZW0oaW5kZXgpKSB7
CisgICAgICAgIFJlZlB0cjxQb3B1cExpc3RCb3g+IGtlZXBBbGl2ZSh0aGlzKTsKKworICAgICAg
ICAvLyBIaWRlIG91cnNlbHZlcyBmaXJzdCBzaW5jZSB2YWx1ZUNoYW5nZWQgbWF5IGhhdmUgbnVt
ZXJvdXMgc2lkZS1lZmZlY3RzLgorICAgICAgICBoaWRlUG9wdXAoKTsKKworICAgICAgICAvLyBU
ZWxsIHRoZSA8c2VsZWN0PiBQb3B1cE1lbnVDbGllbnQgd2hhdCBpbmRleCB3YXMgc2VsZWN0ZWQu
CisgICAgICAgIG1fcG9wdXBDbGllbnQtPnZhbHVlQ2hhbmdlZChpbmRleCk7CisKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFBvcHVw
TGlzdEJveDo6c2VsZWN0SW5kZXgoaW50IGluZGV4KQoreworICAgIGlmIChpbmRleCA8IDAgfHwg
aW5kZXggPj0gbnVtSXRlbXMoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYm9vbCBpc1NlbGVj
dGFibGUgPSBpc1NlbGVjdGFibGVJdGVtKGluZGV4KTsKKyAgICBpZiAoaW5kZXggIT0gbV9zZWxl
Y3RlZEluZGV4ICYmIGlzU2VsZWN0YWJsZSkgeworICAgICAgICBpbnZhbGlkYXRlUm93KG1fc2Vs
ZWN0ZWRJbmRleCk7CisgICAgICAgIG1fc2VsZWN0ZWRJbmRleCA9IGluZGV4OworICAgICAgICBp
bnZhbGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7CisKKyAgICAgICAgc2Nyb2xsVG9SZXZlYWxT
ZWxlY3Rpb24oKTsKKyAgICAgICAgbV9wb3B1cENsaWVudC0+c2VsZWN0aW9uQ2hhbmdlZChtX3Nl
bGVjdGVkSW5kZXgpOworICAgIH0gZWxzZSBpZiAoIWlzU2VsZWN0YWJsZSkKKyAgICAgICAgY2xl
YXJTZWxlY3Rpb24oKTsKK30KKwordm9pZCBQb3B1cExpc3RCb3g6OnNldE9yaWdpbmFsSW5kZXgo
aW50IGluZGV4KQoreworICAgIG1fb3JpZ2luYWxJbmRleCA9IG1fc2VsZWN0ZWRJbmRleCA9IGlu
ZGV4OworfQorCitpbnQgUG9wdXBMaXN0Qm94OjpnZXRSb3dIZWlnaHQoaW50IGluZGV4KQorewor
ICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybiBQb3B1cE1lbnVDaHJvbWl1bTo6bWlu
aW11bVJvd0hlaWdodCgpOworCisgICAgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1TdHlsZShpbmRl
eCkuaXNEaXNwbGF5Tm9uZSgpKQorICAgICAgICByZXR1cm4gUG9wdXBNZW51Q2hyb21pdW06Om1p
bmltdW1Sb3dIZWlnaHQoKTsKKworICAgIC8vIFNlcGFyYXRvciByb3cgaGVpZ2h0IGlzIHRoZSBz
YW1lIHNpemUgYXMgaXRzZWxmLgorICAgIGlmIChtX3BvcHVwQ2xpZW50LT5pdGVtSXNTZXBhcmF0
b3IoaW5kZXgpKQorICAgICAgICByZXR1cm4gbWF4KHNlcGFyYXRvckhlaWdodCwgUG9wdXBNZW51
Q2hyb21pdW06Om1pbmltdW1Sb3dIZWlnaHQoKSk7CisKKyAgICBTdHJpbmcgaWNvbiA9IG1fcG9w
dXBDbGllbnQtPml0ZW1JY29uKGluZGV4KTsKKyAgICBSZWZQdHI8SW1hZ2U+IGltYWdlKEltYWdl
Ojpsb2FkUGxhdGZvcm1SZXNvdXJjZShpY29uLnV0ZjgoKS5kYXRhKCkpKTsKKworICAgIGludCBm
b250SGVpZ2h0ID0gZ2V0Um93Rm9udChpbmRleCkuZm9udE1ldHJpY3MoKS5oZWlnaHQoKTsKKyAg
ICBpbnQgaWNvbkhlaWdodCA9IChpbWFnZSAmJiAhaW1hZ2UtPmlzTnVsbCgpKSA/IGltYWdlLT5y
ZWN0KCkuaGVpZ2h0KCkgOiAwOworCisgICAgaW50IGxpbmVQYWRkaW5nSGVpZ2h0ID0gbV9wb3B1
cENsaWVudC0+bWVudVN0eWxlKCkubWVudVR5cGUoKSA9PSBQb3B1cE1lbnVTdHlsZTo6QXV0b2Zp
bGxQb3B1cCA/IGtMaW5lUGFkZGluZ0hlaWdodCA6IDA7CisgICAgaW50IGNhbGN1bGF0ZWRSb3dI
ZWlnaHQgPSBtYXgoZm9udEhlaWdodCwgaWNvbkhlaWdodCkgKyBsaW5lUGFkZGluZ0hlaWdodCAq
IDI7CisgICAgcmV0dXJuIG1heChjYWxjdWxhdGVkUm93SGVpZ2h0LCBQb3B1cE1lbnVDaHJvbWl1
bTo6bWluaW11bVJvd0hlaWdodCgpKTsKK30KKworSW50UmVjdCBQb3B1cExpc3RCb3g6OmdldFJv
d0JvdW5kcyhpbnQgaW5kZXgpCit7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJu
IEludFJlY3QoMCwgMCwgdmlzaWJsZVdpZHRoKCksIGdldFJvd0hlaWdodChpbmRleCkpOworCisg
ICAgcmV0dXJuIEludFJlY3QoMCwgbV9pdGVtc1tpbmRleF0tPnlPZmZzZXQsIHZpc2libGVXaWR0
aCgpLCBnZXRSb3dIZWlnaHQoaW5kZXgpKTsKK30KKwordm9pZCBQb3B1cExpc3RCb3g6OmludmFs
aWRhdGVSb3coaW50IGluZGV4KQoreworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVy
bjsKKworICAgIC8vIEludmFsaWRhdGUgaW4gdGhlIHdpbmRvdyBjb250ZW50cywgYXMgRnJhbWVs
ZXNzU2Nyb2xsVmlldzo6aW52YWxpZGF0ZVJlY3QKKyAgICAvLyBwYWludHMgaW4gdGhlIHdpbmRv
dyBjb29yZGluYXRlcy4KKyAgICBpbnZhbGlkYXRlUmVjdChjb250ZW50c1RvV2luZG93KGdldFJv
d0JvdW5kcyhpbmRleCkpKTsKK30KKwordm9pZCBQb3B1cExpc3RCb3g6OnNjcm9sbFRvUmV2ZWFs
Um93KGludCBpbmRleCkKK3sKKyAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICByZXR1cm47CisK
KyAgICBJbnRSZWN0IHJvd1JlY3QgPSBnZXRSb3dCb3VuZHMoaW5kZXgpOworCisgICAgaWYgKHJv
d1JlY3QueSgpIDwgc2Nyb2xsWSgpKSB7CisgICAgICAgIC8vIFJvdyBpcyBhYm92ZSBjdXJyZW50
IHNjcm9sbCBwb3NpdGlvbiwgc2Nyb2xsIHVwLgorICAgICAgICBTY3JvbGxWaWV3OjpzZXRTY3Jv
bGxQb3NpdGlvbihJbnRQb2ludCgwLCByb3dSZWN0LnkoKSkpOworICAgIH0gZWxzZSBpZiAocm93
UmVjdC5tYXhZKCkgPiBzY3JvbGxZKCkgKyB2aXNpYmxlSGVpZ2h0KCkpIHsKKyAgICAgICAgLy8g
Um93IGlzIGJlbG93IGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uLCBzY3JvbGwgZG93bi4KKyAgICAg
ICAgU2Nyb2xsVmlldzo6c2V0U2Nyb2xsUG9zaXRpb24oSW50UG9pbnQoMCwgcm93UmVjdC5tYXhZ
KCkgLSB2aXNpYmxlSGVpZ2h0KCkpKTsKKyAgICB9Cit9CisKK2Jvb2wgUG9wdXBMaXN0Qm94Ojpp
c1NlbGVjdGFibGVJdGVtKGludCBpbmRleCkKK3sKKyAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBp
bmRleCA8IG51bUl0ZW1zKCkpOworICAgIHJldHVybiBtX2l0ZW1zW2luZGV4XS0+dHlwZSA9PSBQ
b3B1cEl0ZW06OlR5cGVPcHRpb24gJiYgbV9wb3B1cENsaWVudC0+aXRlbUlzRW5hYmxlZChpbmRl
eCk7Cit9CisKK3ZvaWQgUG9wdXBMaXN0Qm94OjpjbGVhclNlbGVjdGlvbigpCit7CisgICAgaWYg
KG1fc2VsZWN0ZWRJbmRleCAhPSAtMSkgeworICAgICAgICBpbnZhbGlkYXRlUm93KG1fc2VsZWN0
ZWRJbmRleCk7CisgICAgICAgIG1fc2VsZWN0ZWRJbmRleCA9IC0xOworICAgICAgICBtX3BvcHVw
Q2xpZW50LT5zZWxlY3Rpb25DbGVhcmVkKCk7CisgICAgfQorfQorCit2b2lkIFBvcHVwTGlzdEJv
eDo6c2VsZWN0TmV4dFJvdygpCit7CisgICAgaWYgKCFtX3NldHRpbmdzLmxvb3BTZWxlY3Rpb25O
YXZpZ2F0aW9uIHx8IG1fc2VsZWN0ZWRJbmRleCAhPSBudW1JdGVtcygpIC0gMSkgeworICAgICAg
ICBhZGp1c3RTZWxlY3RlZEluZGV4KDEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
Ly8gV2UgYXJlIG1vdmluZyBwYXN0IHRoZSBsYXN0IGl0ZW0sIG5vIHJvdyBzaG91bGQgYmUgc2Vs
ZWN0ZWQuCisgICAgY2xlYXJTZWxlY3Rpb24oKTsKK30KKwordm9pZCBQb3B1cExpc3RCb3g6OnNl
bGVjdFByZXZpb3VzUm93KCkKK3sKKyAgICBpZiAoIW1fc2V0dGluZ3MubG9vcFNlbGVjdGlvbk5h
dmlnYXRpb24gfHwgbV9zZWxlY3RlZEluZGV4ID4gMCkgeworICAgICAgICBhZGp1c3RTZWxlY3Rl
ZEluZGV4KC0xKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbV9zZWxlY3Rl
ZEluZGV4KSB7CisgICAgICAgIC8vIFdlIGFyZSBtb3ZpbmcgcGFzdCB0aGUgZmlyc3QgaXRlbSwg
Y2xlYXIgdGhlIHNlbGVjdGlvbi4KKyAgICAgICAgY2xlYXJTZWxlY3Rpb24oKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIE5vIHJvdyBpcyBzZWxlY3RlZCwganVtcCB0byB0aGUg
bGFzdCBpdGVtLgorICAgIHNlbGVjdEluZGV4KG51bUl0ZW1zKCkgLSAxKTsKKyAgICBzY3JvbGxU
b1JldmVhbFNlbGVjdGlvbigpOworfQorCit2b2lkIFBvcHVwTGlzdEJveDo6YWRqdXN0U2VsZWN0
ZWRJbmRleChpbnQgZGVsdGEpCit7CisgICAgaW50IHRhcmdldEluZGV4ID0gbV9zZWxlY3RlZElu
ZGV4ICsgZGVsdGE7CisgICAgdGFyZ2V0SW5kZXggPSBtaW4obWF4KHRhcmdldEluZGV4LCAwKSwg
bnVtSXRlbXMoKSAtIDEpOworICAgIGlmICghaXNTZWxlY3RhYmxlSXRlbSh0YXJnZXRJbmRleCkp
IHsKKyAgICAgICAgLy8gV2UgZGlkbid0IGxhbmQgb24gYW4gb3B0aW9uLiBUcnkgdG8gZmluZCBv
bmUuCisgICAgICAgIC8vIFdlIHRyeSB0byBzZWxlY3QgdGhlIGNsb3Nlc3QgaW5kZXggdG8gdGFy
Z2V0LCBwcmlvcml0aXppbmcgYW55IGluCisgICAgICAgIC8vIHRoZSByYW5nZSBbY3VycmVudCwg
dGFyZ2V0XS4KKworICAgICAgICBpbnQgZGlyID0gZGVsdGEgPiAwID8gMSA6IC0xOworICAgICAg
ICBpbnQgdGVzdEluZGV4ID0gbV9zZWxlY3RlZEluZGV4OworICAgICAgICBpbnQgYmVzdEluZGV4
ID0gbV9zZWxlY3RlZEluZGV4OworICAgICAgICBib29sIHBhc3NlZFRhcmdldCA9IGZhbHNlOwor
ICAgICAgICB3aGlsZSAodGVzdEluZGV4ID49IDAgJiYgdGVzdEluZGV4IDwgbnVtSXRlbXMoKSkg
eworICAgICAgICAgICAgaWYgKGlzU2VsZWN0YWJsZUl0ZW0odGVzdEluZGV4KSkKKyAgICAgICAg
ICAgICAgICBiZXN0SW5kZXggPSB0ZXN0SW5kZXg7CisgICAgICAgICAgICBpZiAodGVzdEluZGV4
ID09IHRhcmdldEluZGV4KQorICAgICAgICAgICAgICAgIHBhc3NlZFRhcmdldCA9IHRydWU7Cisg
ICAgICAgICAgICBpZiAocGFzc2VkVGFyZ2V0ICYmIGJlc3RJbmRleCAhPSBtX3NlbGVjdGVkSW5k
ZXgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHRlc3RJbmRleCArPSBk
aXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBQaWNrIHRoZSBiZXN0IGluZGV4LCB3aGljaCBt
YXkgbWVhbiB3ZSBkb24ndCBjaGFuZ2UuCisgICAgICAgIHRhcmdldEluZGV4ID0gYmVzdEluZGV4
OworICAgIH0KKworICAgIC8vIFNlbGVjdCB0aGUgbmV3IGluZGV4LCBhbmQgZW5zdXJlIGl0cyB2
aXNpYmxlLiBXZSBkbyB0aGlzIHJlZ2FyZGxlc3Mgb2YKKyAgICAvLyB3aGV0aGVyIHRoZSBzZWxl
Y3Rpb24gY2hhbmdlZCB0byBlbnN1cmUga2V5Ym9hcmQgZXZlbnRzIGFsd2F5cyBicmluZyB0aGUK
KyAgICAvLyBzZWxlY3Rpb24gaW50byB2aWV3LgorICAgIHNlbGVjdEluZGV4KHRhcmdldEluZGV4
KTsKKyAgICBzY3JvbGxUb1JldmVhbFNlbGVjdGlvbigpOworfQorCit2b2lkIFBvcHVwTGlzdEJv
eDo6aGlkZVBvcHVwKCkKK3sKKyAgICBpZiAocGFyZW50KCkpIHsKKyAgICAgICAgUG9wdXBDb250
YWluZXIqIGNvbnRhaW5lciA9IHN0YXRpY19jYXN0PFBvcHVwQ29udGFpbmVyKj4ocGFyZW50KCkp
OworICAgICAgICBpZiAoY29udGFpbmVyLT5jbGllbnQoKSkKKyAgICAgICAgICAgIGNvbnRhaW5l
ci0+Y2xpZW50KCktPnBvcHVwQ2xvc2VkKGNvbnRhaW5lcik7CisgICAgICAgIGNvbnRhaW5lci0+
bm90aWZ5UG9wdXBIaWRkZW4oKTsKKyAgICB9CisKKyAgICBpZiAobV9wb3B1cENsaWVudCkKKyAg
ICAgICAgbV9wb3B1cENsaWVudC0+cG9wdXBEaWRIaWRlKCk7Cit9CisKK3ZvaWQgUG9wdXBMaXN0
Qm94Ojp1cGRhdGVGcm9tRWxlbWVudCgpCit7CisgICAgY2xlYXIoKTsKKworICAgIGludCBzaXpl
ID0gbV9wb3B1cENsaWVudC0+bGlzdFNpemUoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNp
emU7ICsraSkgeworICAgICAgICBQb3B1cEl0ZW06OlR5cGUgdHlwZTsKKyAgICAgICAgaWYgKG1f
cG9wdXBDbGllbnQtPml0ZW1Jc1NlcGFyYXRvcihpKSkKKyAgICAgICAgICAgIHR5cGUgPSBQb3B1
cEl0ZW06OlR5cGVTZXBhcmF0b3I7CisgICAgICAgIGVsc2UgaWYgKG1fcG9wdXBDbGllbnQtPml0
ZW1Jc0xhYmVsKGkpKQorICAgICAgICAgICAgdHlwZSA9IFBvcHVwSXRlbTo6VHlwZUdyb3VwOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICB0eXBlID0gUG9wdXBJdGVtOjpUeXBlT3B0aW9uOwor
ICAgICAgICBtX2l0ZW1zLmFwcGVuZChuZXcgUG9wdXBJdGVtKG1fcG9wdXBDbGllbnQtPml0ZW1U
ZXh0KGkpLCB0eXBlKSk7CisgICAgICAgIG1faXRlbXNbaV0tPmVuYWJsZWQgPSBpc1NlbGVjdGFi
bGVJdGVtKGkpOworICAgICAgICBQb3B1cE1lbnVTdHlsZSBzdHlsZSA9IG1fcG9wdXBDbGllbnQt
Pml0ZW1TdHlsZShpKTsKKyAgICAgICAgbV9pdGVtc1tpXS0+dGV4dERpcmVjdGlvbiA9IHN0eWxl
LnRleHREaXJlY3Rpb24oKTsKKyAgICAgICAgbV9pdGVtc1tpXS0+aGFzVGV4dERpcmVjdGlvbk92
ZXJyaWRlID0gc3R5bGUuaGFzVGV4dERpcmVjdGlvbk92ZXJyaWRlKCk7CisgICAgfQorCisgICAg
bV9zZWxlY3RlZEluZGV4ID0gbV9wb3B1cENsaWVudC0+c2VsZWN0ZWRJbmRleCgpOworICAgIHNl
dE9yaWdpbmFsSW5kZXgobV9zZWxlY3RlZEluZGV4KTsKKworICAgIGxheW91dCgpOworfQorCit2
b2lkIFBvcHVwTGlzdEJveDo6c2V0TWF4V2lkdGhBbmRMYXlvdXQoaW50IG1heFdpZHRoKQorewor
ICAgIG1fbWF4V2luZG93V2lkdGggPSBtYXhXaWR0aDsKKyAgICBsYXlvdXQoKTsKK30KKwordm9p
ZCBQb3B1cExpc3RCb3g6OmxheW91dCgpCit7CisgICAgYm9vbCBpc1JpZ2h0QWxpZ25lZCA9IG1f
cG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpLnRleHREaXJlY3Rpb24oKSA9PSBSVEw7CisKKyAgICAv
LyBTaXplIG91ciBjaGlsZCBpdGVtcy4KKyAgICBpbnQgYmFzZVdpZHRoID0gMDsKKyAgICBpbnQg
cGFkZGluZ1dpZHRoID0gMDsKKyAgICBpbnQgbGluZUVuZFBhZGRpbmdXaWR0aCA9IDA7CisgICAg
aW50IHkgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtSXRlbXMoKTsgKytpKSB7Cisg
ICAgICAgIC8vIFBsYWNlIHRoZSBpdGVtIHZlcnRpY2FsbHkuCisgICAgICAgIG1faXRlbXNbaV0t
PnlPZmZzZXQgPSB5OworICAgICAgICBpZiAobV9wb3B1cENsaWVudC0+aXRlbVN0eWxlKGkpLmlz
RGlzcGxheU5vbmUoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB5ICs9IGdldFJv
d0hlaWdodChpKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhlIHBvcHVwIGlzIHdpZGUgZW5vdWdo
IHRvIGZpdCB0aGlzIGl0ZW0uCisgICAgICAgIEZvbnQgaXRlbUZvbnQgPSBnZXRSb3dGb250KGkp
OworICAgICAgICBTdHJpbmcgdGV4dCA9IG1fcG9wdXBDbGllbnQtPml0ZW1UZXh0KGkpOworICAg
ICAgICBTdHJpbmcgbGFiZWwgPSBtX3BvcHVwQ2xpZW50LT5pdGVtTGFiZWwoaSk7CisgICAgICAg
IFN0cmluZyBpY29uID0gbV9wb3B1cENsaWVudC0+aXRlbUljb24oaSk7CisgICAgICAgIFJlZlB0
cjxJbWFnZT4gaWNvbkltYWdlKEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShpY29uLnV0Zjgo
KS5kYXRhKCkpKTsKKyAgICAgICAgaW50IHdpZHRoID0gMDsKKyAgICAgICAgaWYgKCF0ZXh0Lmlz
RW1wdHkoKSkKKyAgICAgICAgICAgIHdpZHRoID0gaXRlbUZvbnQud2lkdGgoVGV4dFJ1bih0ZXh0
KSk7CisgICAgICAgIGlmICghbGFiZWwuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAod2lk
dGggPiAwKQorICAgICAgICAgICAgICAgIHdpZHRoICs9IGtUZXh0VG9MYWJlbFBhZGRpbmc7Cisg
ICAgICAgICAgICB3aWR0aCArPSBpdGVtRm9udC53aWR0aChUZXh0UnVuKGxhYmVsKSk7CisgICAg
ICAgIH0KKyAgICAgICAgaWYgKGljb25JbWFnZSAmJiAhaWNvbkltYWdlLT5pc051bGwoKSkgewor
ICAgICAgICAgICAgaWYgKHdpZHRoID4gMCkKKyAgICAgICAgICAgICAgICB3aWR0aCArPSBrTGFi
ZWxUb0ljb25QYWRkaW5nOworICAgICAgICAgICAgd2lkdGggKz0gaWNvbkltYWdlLT5yZWN0KCku
d2lkdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJhc2VXaWR0aCA9IG1heChiYXNlV2lkdGgs
IHdpZHRoKTsKKyAgICAgICAgLy8gRklYTUU6IGh0dHA6Ly9iLzEyMTA0ODEgV2Ugc2hvdWxkIGdl
dCB0aGUgcGFkZGluZyBvZiBpbmRpdmlkdWFsIG9wdGlvbiBlbGVtZW50cy4KKyAgICAgICAgcGFk
ZGluZ1dpZHRoID0gbWF4KHBhZGRpbmdXaWR0aCwKKyAgICAgICAgICAgIG1fcG9wdXBDbGllbnQt
PmNsaWVudFBhZGRpbmdMZWZ0KCkgKyBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nUmlnaHQo
KSk7CisgICAgICAgIGxpbmVFbmRQYWRkaW5nV2lkdGggPSBtYXgobGluZUVuZFBhZGRpbmdXaWR0
aCwKKyAgICAgICAgICAgIGlzUmlnaHRBbGlnbmVkID8gbV9wb3B1cENsaWVudC0+Y2xpZW50UGFk
ZGluZ0xlZnQoKSA6IG1fcG9wdXBDbGllbnQtPmNsaWVudFBhZGRpbmdSaWdodCgpKTsKKyAgICB9
CisKKyAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIGJhciB3aWR0aC4KKyAgICBpbnQgd2luZG93SGVp
Z2h0ID0gMDsKKyAgICBtX3Zpc2libGVSb3dzID0gbWluKG51bUl0ZW1zKCksIGtNYXhWaXNpYmxl
Um93cyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmlzaWJsZVJvd3M7ICsraSkgewor
ICAgICAgICBpbnQgcm93SGVpZ2h0ID0gZ2V0Um93SGVpZ2h0KGkpOworCisgICAgICAgIC8vIE9u
bHkgY2xpcCB0aGUgd2luZG93IGhlaWdodCBmb3Igbm9uLU1hYyBwbGF0Zm9ybXMuCisgICAgICAg
IGlmICh3aW5kb3dIZWlnaHQgKyByb3dIZWlnaHQgPiBtX21heEhlaWdodCkgeworICAgICAgICAg
ICAgbV92aXNpYmxlUm93cyA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisg
ICAgICAgIHdpbmRvd0hlaWdodCArPSByb3dIZWlnaHQ7CisgICAgfQorCisgICAgLy8gU2V0IG91
ciB3aWRnZXQgYW5kIHNjcm9sbGFibGUgY29udGVudHMgc2l6ZXMuCisgICAgaW50IHNjcm9sbGJh
cldpZHRoID0gMDsKKyAgICBpZiAobV92aXNpYmxlUm93cyA8IG51bUl0ZW1zKCkpIHsKKyAgICAg
ICAgc2Nyb2xsYmFyV2lkdGggPSBTY3JvbGxiYXJUaGVtZTo6bmF0aXZlVGhlbWUoKS0+c2Nyb2xs
YmFyVGhpY2tuZXNzKCk7CisKKyAgICAgICAgLy8gVXNlIGtNaW5FbmRPZkxpbmVQYWRkaW5nIHdo
ZW4gdGhlcmUgaXMgYSBzY3JvbGxiYXIgc28gdGhhdCB3ZSB1c2UKKyAgICAgICAgLy8gYXMgbXVj
aCBhcyAobGluZUVuZFBhZGRpbmdXaWR0aCAtIGtNaW5FbmRPZkxpbmVQYWRkaW5nKSBwYWRkaW5n
CisgICAgICAgIC8vIHNwYWNlIGZvciBzY3JvbGxiYXIgYW5kIGFsbG93IHVzZXIgdG8gdXNlIENT
UyBwYWRkaW5nIHRvIG1ha2UgdGhlCisgICAgICAgIC8vIHBvcHVwIGxpc3Rib3ggYWxpZ24gd2l0
aCB0aGUgc2VsZWN0IGVsZW1lbnQuCisgICAgICAgIHBhZGRpbmdXaWR0aCA9IHBhZGRpbmdXaWR0
aCAtIGxpbmVFbmRQYWRkaW5nV2lkdGggKyBrTWluRW5kT2ZMaW5lUGFkZGluZzsKKyAgICB9CisK
KyAgICBpbnQgd2luZG93V2lkdGg7CisgICAgaW50IGNvbnRlbnRXaWR0aDsKKyAgICBpZiAobV9z
ZXR0aW5ncy5yZXN0cmljdFdpZHRoT2ZMaXN0Qm94KSB7CisgICAgICAgIHdpbmRvd1dpZHRoID0g
bV9iYXNlV2lkdGg7CisgICAgICAgIGNvbnRlbnRXaWR0aCA9IG1fYmFzZVdpZHRoIC0gc2Nyb2xs
YmFyV2lkdGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2luZG93V2lkdGggPSBiYXNlV2lkdGgg
KyBzY3JvbGxiYXJXaWR0aCArIHBhZGRpbmdXaWR0aDsKKyAgICAgICAgaWYgKHdpbmRvd1dpZHRo
ID4gbV9tYXhXaW5kb3dXaWR0aCkgeworICAgICAgICAgICAgLy8gd2luZG93V2lkdGggZXhjZWVk
cyBtX21heFdpbmRvd1dpZHRoLCBzbyB3ZSBoYXZlIHRvIGNsaXAuCisgICAgICAgICAgICB3aW5k
b3dXaWR0aCA9IG1fbWF4V2luZG93V2lkdGg7CisgICAgICAgICAgICBiYXNlV2lkdGggPSB3aW5k
b3dXaWR0aCAtIHNjcm9sbGJhcldpZHRoIC0gcGFkZGluZ1dpZHRoOworICAgICAgICAgICAgbV9i
YXNlV2lkdGggPSBiYXNlV2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgY29udGVudFdpZHRoID0g
d2luZG93V2lkdGggLSBzY3JvbGxiYXJXaWR0aDsKKworICAgICAgICBpZiAod2luZG93V2lkdGgg
PCBtX2Jhc2VXaWR0aCkgeworICAgICAgICAgICAgd2luZG93V2lkdGggPSBtX2Jhc2VXaWR0aDsK
KyAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IG1fYmFzZVdpZHRoIC0gc2Nyb2xsYmFyV2lkdGg7
CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbV9iYXNlV2lkdGggPSBiYXNlV2lkdGg7Cisg
ICAgfQorCisgICAgcmVzaXplKHdpbmRvd1dpZHRoLCB3aW5kb3dIZWlnaHQpOworICAgIHNldENv
bnRlbnRzU2l6ZShJbnRTaXplKGNvbnRlbnRXaWR0aCwgZ2V0Um93Qm91bmRzKG51bUl0ZW1zKCkg
LSAxKS5tYXhZKCkpKTsKKworICAgIGlmIChob3N0V2luZG93KCkpCisgICAgICAgIHNjcm9sbFRv
UmV2ZWFsU2VsZWN0aW9uKCk7CisKKyAgICBpbnZhbGlkYXRlKCk7Cit9CisKK3ZvaWQgUG9wdXBM
aXN0Qm94OjpjbGVhcigpCit7CisgICAgZm9yIChWZWN0b3I8UG9wdXBJdGVtKj46Oml0ZXJhdG9y
IGl0ID0gbV9pdGVtcy5iZWdpbigpOyBpdCAhPSBtX2l0ZW1zLmVuZCgpOyArK2l0KQorICAgICAg
ICBkZWxldGUgKml0OworICAgIG1faXRlbXMuY2xlYXIoKTsKK30KKworYm9vbCBQb3B1cExpc3RC
b3g6OmlzUG9pbnRJbkJvdW5kcyhjb25zdCBJbnRQb2ludCYgcG9pbnQpCit7CisgICAgcmV0dXJu
IG51bUl0ZW1zKCkgJiYgSW50UmVjdCgwLCAwLCB3aWR0aCgpLCBoZWlnaHQoKSkuY29udGFpbnMo
cG9pbnQpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cExpc3RCb3guaCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwTGlzdEJveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRjZWMzYTQxYWU3
MDUxYTYwMTkwOWYxYTAxNTlmNjk2MmExYjFlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cExpc3RCb3guaApAQCAtMCwwICsxLDMwMCBA
QAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4g
dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAq
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
I2lmbmRlZiBQb3B1cExpc3RCb3hfaAorI2RlZmluZSBQb3B1cExpc3RCb3hfaAorCisjaW5jbHVk
ZSAiRm9udC5oIgorI2luY2x1ZGUgIkZvbnRTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkZyYW1lbGVz
c1Njcm9sbFZpZXcuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiTm9kZS5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFRpbWVT
dGFtcDsKKworc3RhdGljIGNvbnN0IGludCBrTGFiZWxUb0ljb25QYWRkaW5nID0gNTsKK3N0YXRp
YyBjb25zdCBpbnQga0xpbmVQYWRkaW5nSGVpZ2h0ID0gMzsgLy8gUGFkZGluZyBoZWlnaHQgcHV0
IGF0IHRoZSB0b3AgYW5kIGJvdHRvbSBvZiBlYWNoIGxpbmUuCitzdGF0aWMgY29uc3QgaW50IGtN
YXhIZWlnaHQgPSA1MDA7CitzdGF0aWMgY29uc3QgaW50IGtNYXhWaXNpYmxlUm93cyA9IDIwOwor
c3RhdGljIGNvbnN0IGludCBrTWluRW5kT2ZMaW5lUGFkZGluZyA9IDI7CitzdGF0aWMgY29uc3Qg
aW50IGtUZXh0VG9MYWJlbFBhZGRpbmcgPSAxMDsKK3N0YXRpYyBjb25zdCBUaW1lU3RhbXAga1R5
cGVBaGVhZFRpbWVvdXRNcyA9IDEwMDA7CisKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDsKK2NsYXNz
IFBsYXRmb3JtS2V5Ym9hcmRFdmVudDsKK2NsYXNzIFBsYXRmb3JtTW91c2VFdmVudDsKKyNpZiBF
TkFCTEUoR0VTVFVSRV9FVkVOVFMpCitjbGFzcyBQbGF0Zm9ybUdlc3R1cmVFdmVudDsKKyNlbmRp
ZgorI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCitjbGFzcyBQbGF0Zm9ybVRvdWNoRXZlbnQ7Cisj
ZW5kaWYKK2NsYXNzIFBsYXRmb3JtV2hlZWxFdmVudDsKK2NsYXNzIFBvcHVwTWVudUNsaWVudDsK
Kworc3RydWN0IFBvcHVwQ29udGFpbmVyU2V0dGluZ3MgeworICAgIC8vIFdoZXRoZXIgdGhlIFBv
cHVwTWVudUNsaWVudCBzaG91bGQgYmUgdG9sZCB0byBjaGFuZ2UgaXRzIHRleHQgd2hlbiBhCisg
ICAgLy8gbmV3IGl0ZW0gaXMgc2VsZWN0ZWQgYnkgdXNpbmcgdGhlIGFycm93IGtleXMuCisgICAg
Ym9vbCBzZXRUZXh0T25JbmRleENoYW5nZTsKKworICAgIC8vIFdoZXRoZXIgdGhlIHNlbGVjdGlv
biBzaG91bGQgYmUgYWNjZXB0ZWQgd2hlbiB0aGUgcG9wdXAgbWVudSBpcworICAgIC8vIGNsb3Nl
ZCAodGhyb3VnaCBFU0MgYmVpbmcgcHJlc3NlZCBvciB0aGUgZm9jdXMgZ29pbmcgYXdheSkuCisg
ICAgLy8gTm90ZSB0aGF0IHdoZW4gVEFCIGlzIHByZXNzZWQsIHRoZSBzZWxlY3Rpb24gaXMgYWx3
YXlzIGFjY2VwdGVkCisgICAgLy8gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisgICAgYm9v
bCBhY2NlcHRPbkFiYW5kb247CisKKyAgICAvLyBXaGV0aGVyIHdlIHNob3VsZCBtb3ZlIHRoZSBz
ZWxlY3Rpb24gdG8gdGhlIGZpcnN0L2xhc3QgaXRlbSB3aGVuCisgICAgLy8gdGhlIHVzZXIgcHJl
c3NlcyBkb3duL3VwIGFycm93IGtleXMgYW5kIHRoZSBsYXN0L2ZpcnN0IGl0ZW0gaXMKKyAgICAv
LyBzZWxlY3RlZC4KKyAgICBib29sIGxvb3BTZWxlY3Rpb25OYXZpZ2F0aW9uOworCisgICAgLy8g
V2hldGhlciB3ZSBzaG91bGQgcmVzdHJpY3QgdGhlIHdpZHRoIG9mIHRoZSBQb3B1cExpc3RCb3gg
b3Igbm90LgorICAgIC8vIEF1dG9jb21wbGV0ZSBwb3B1cHMgYXJlIHJlc3RyaWN0ZWQsIGNvbWJv
LWJveGVzIChzZWxlY3QgdGFncykgYXJlbid0LgorICAgIGJvb2wgcmVzdHJpY3RXaWR0aE9mTGlz
dEJveDsKK307CisKKy8vIEEgY29udGFpbmVyIGZvciB0aGUgZGF0YSBmb3IgZWFjaCBtZW51IGl0
ZW0gKGUuZy4gcmVwcmVzZW50ZWQgYnkgPG9wdGlvbj4KKy8vIG9yIDxvcHRncm91cD4gaW4gYSA8
c2VsZWN0PiB3aWRnZXQpIGFuZCBpcyB1c2VkIGJ5IFBvcHVwTGlzdEJveC4KK3N0cnVjdCBQb3B1
cEl0ZW0geworICAgIGVudW0gVHlwZSB7CisgICAgICAgIFR5cGVPcHRpb24sCisgICAgICAgIFR5
cGVHcm91cCwKKyAgICAgICAgVHlwZVNlcGFyYXRvcgorICAgIH07CisKKyAgICBQb3B1cEl0ZW0o
Y29uc3QgU3RyaW5nJiBsYWJlbCwgVHlwZSB0eXBlKQorICAgICAgICA6IGxhYmVsKGxhYmVsKQor
ICAgICAgICAsIHR5cGUodHlwZSkKKyAgICAgICAgLCB5T2Zmc2V0KDApCisgICAgeworICAgIH0K
KyAgICBTdHJpbmcgbGFiZWw7CisgICAgVHlwZSB0eXBlOworICAgIGludCB5T2Zmc2V0OyAvLyB5
IG9mZnNldCBvZiB0aGlzIGl0ZW0sIHJlbGF0aXZlIHRvIHRoZSB0b3Agb2YgdGhlIHBvcHVwLgor
ICAgIFRleHREaXJlY3Rpb24gdGV4dERpcmVjdGlvbjsKKyAgICBib29sIGhhc1RleHREaXJlY3Rp
b25PdmVycmlkZTsKKyAgICBib29sIGVuYWJsZWQ7Cit9OworCisvLyBUaGlzIGNsYXNzIHVzZXMg
V2ViQ29yZSBjb2RlIHRvIHBhaW50IGFuZCBoYW5kbGUgZXZlbnRzIGZvciBhIGRyb3AtZG93biBs
aXN0CisvLyBib3ggKCJjb21ib2JveCIgb24gV2luZG93cykuCitjbGFzcyBQb3B1cExpc3RCb3gg
OiBwdWJsaWMgRnJhbWVsZXNzU2Nyb2xsVmlldyB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NS
ZWZQdHI8UG9wdXBMaXN0Qm94PiBjcmVhdGUoUG9wdXBNZW51Q2xpZW50KiBjbGllbnQsIGNvbnN0
IFBvcHVwQ29udGFpbmVyU2V0dGluZ3MmIHNldHRpbmdzKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBQb3B1cExpc3RCb3goY2xpZW50LCBzZXR0aW5ncykpOworICAgIH0KKwor
ICAgIC8vIEZyYW1lbGVzc1Njcm9sbFZpZXcKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoR3JhcGhp
Y3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3Vz
ZURvd25FdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKKyAgICB2aXJ0dWFsIGJvb2wg
aGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7CisgICAgdmly
dHVhbCBib29sIGhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVu
dCYpOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVXaGVlbEV2ZW50KGNvbnN0IFBsYXRmb3JtV2hl
ZWxFdmVudCYpOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVLZXlFdmVudChjb25zdCBQbGF0Zm9y
bUtleWJvYXJkRXZlbnQmKTsKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorICAgIHZpcnR1YWwg
Ym9vbCBoYW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBsYXRmb3JtVG91Y2hFdmVudCYpOworI2VuZGlm
CisjaWYgRU5BQkxFKEdFU1RVUkVfUkVDT0dOSVpFUikKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxl
R2VzdHVyZUV2ZW50KGNvbnN0IFBsYXRmb3JtR2VzdHVyZUV2ZW50Jik7CisjZW5kaWYKKworICAg
IC8vIFNjcm9sbFZpZXcKKyAgICB2aXJ0dWFsIEhvc3RXaW5kb3cqIGhvc3RXaW5kb3coKSBjb25z
dDsKKworICAgIC8vIFBvcHVwTGlzdEJveCBtZXRob2RzCisKKyAgICAvLyBIaWRlcyB0aGUgcG9w
dXAuCisgICAgdm9pZCBoaWRlUG9wdXAoKTsKKworICAgIC8vIFVwZGF0ZXMgb3VyIGludGVybmFs
IGxpc3QgdG8gbWF0Y2ggdGhlIGNsaWVudC4KKyAgICB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7
CisKKyAgICAvLyBGcmVlcyBhbnkgYWxsb2NhdGVkIHJlc291cmNlcyB1c2VkIGluIGEgcGFydGlj
dWxhciBwb3B1cCBzZXNzaW9uLgorICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8vIFNldHMgdGhl
IGluZGV4IG9mIHRoZSBvcHRpb24gdGhhdCBpcyBkaXNwbGF5ZWQgaW4gdGhlIDxzZWxlY3Q+IHdp
ZGdldCBpbiB0aGUgcGFnZQorICAgIHZvaWQgc2V0T3JpZ2luYWxJbmRleChpbnQpOworCisgICAg
Ly8gR2V0cyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdGhhdCB0aGUgdXNlciBpcyBjdXJyZW50bHkg
bW91c2VkIG92ZXIgb3IgaGFzIHNlbGVjdGVkIHdpdGgKKyAgICAvLyB0aGUga2V5Ym9hcmQuIFRo
aXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCBpbmRleCwgc2luY2UgdGhlIHVzZXIg
aGFzIG5vdCB5ZXQKKyAgICAvLyBhY2NlcHRlZCB0aGlzIGlucHV0LgorICAgIGludCBzZWxlY3Rl
ZEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3RlZEluZGV4OyB9CisKKyAgICAvLyBNb3Zl
cyBzZWxlY3Rpb24gZG93bi91cCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGl0ZW1zLCBzY3JvbGxpbmcg
aWYgbmVjZXNzYXJ5LgorICAgIC8vIFBvc2l0aXZlIGlzIGRvd24uIFRoZSByZXN1bHRpbmcgaW5k
ZXggd2lsbCBiZSBjbGFtcGVkIHRvIHRoZSByYW5nZQorICAgIC8vIFswLCBudW1JdGVtcyksIGFu
ZCBub24tb3B0aW9uIGl0ZW1zIHdpbGwgYmUgc2tpcHBlZC4KKyAgICB2b2lkIGFkanVzdFNlbGVj
dGVkSW5kZXgoaW50IGRlbHRhKTsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVt
cyBpbiB0aGUgbGlzdC4KKyAgICBpbnQgbnVtSXRlbXMoKSBjb25zdCB7IHJldHVybiBzdGF0aWNf
Y2FzdDxpbnQ+KG1faXRlbXMuc2l6ZSgpKTsgfQorCisgICAgdm9pZCBzZXRCYXNlV2lkdGgoaW50
IHdpZHRoKSB7IG1fYmFzZVdpZHRoID0gc3RkOjptaW4obV9tYXhXaW5kb3dXaWR0aCwgd2lkdGgp
OyB9CisKKyAgICAvLyBDb21wdXRlcyB0aGUgc2l6ZSBvZiB3aWRnZXQgYW5kIGNoaWxkcmVuLgor
ICAgIHZvaWQgbGF5b3V0KCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHBvcHVwIHdh
bnRzIHRvIHByb2Nlc3MgZXZlbnRzIGZvciB0aGUgcGFzc2VkIGtleS4KKyAgICBib29sIGlzSW50
ZXJlc3RlZEluRXZlbnRGb3JLZXkoaW50IGtleUNvZGUpOworCisgICAgLy8gR2V0cyB0aGUgaGVp
Z2h0IG9mIGEgcm93LgorICAgIGludCBnZXRSb3dIZWlnaHQoaW50IGluZGV4KTsKKworICAgIHZv
aWQgc2V0TWF4SGVpZ2h0KGludCBtYXhIZWlnaHQpIHsgbV9tYXhIZWlnaHQgPSBtYXhIZWlnaHQ7
IH0KKworICAgIHZvaWQgc2V0TWF4V2lkdGgoaW50IG1heFdpZHRoKSB7IG1fbWF4V2luZG93V2lk
dGggPSBtYXhXaWR0aDsgfQorCisgICAgdm9pZCBzZXRNYXhXaWR0aEFuZExheW91dChpbnQpOwor
CisgICAgdm9pZCBkaXNjb25uZWN0Q2xpZW50KCkgeyBtX3BvcHVwQ2xpZW50ID0gMDsgfQorCisg
ICAgY29uc3QgVmVjdG9yPFBvcHVwSXRlbSo+JiBpdGVtcygpIGNvbnN0IHsgcmV0dXJuIG1faXRl
bXM7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUG9wdXBDb250YWluZXI7CisgICAg
ZnJpZW5kIGNsYXNzIFJlZkNvdW50ZWQ8UG9wdXBMaXN0Qm94PjsKKworICAgIFBvcHVwTGlzdEJv
eChQb3B1cE1lbnVDbGllbnQqLCBjb25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJik7CisKKyAg
ICB+UG9wdXBMaXN0Qm94KCkKKyAgICB7CisgICAgICAgIGNsZWFyKCk7CisgICAgfQorCisgICAg
Ly8gQ2xvc2VzIHRoZSBwb3B1cAorICAgIHZvaWQgYWJhbmRvbigpOworCisgICAgLy8gUmV0dXJu
cyB0cnVlIGlmIHRoZSBzZWxlY3Rpb24gY2FuIGJlIGNoYW5nZWQgdG8gaW5kZXguCisgICAgLy8g
RGlzYWJsZWQgaXRlbXMsIG9yIGxhYmVscyBjYW5ub3QgYmUgc2VsZWN0ZWQuCisgICAgYm9vbCBp
c1NlbGVjdGFibGVJdGVtKGludCBpbmRleCk7CisKKyAgICAvLyBTZWxlY3QgYW4gaW5kZXggaW4g
dGhlIGxpc3QsIHNjcm9sbGluZyBpZiBuZWNlc3NhcnkuCisgICAgdm9pZCBzZWxlY3RJbmRleChp
bnQgaW5kZXgpOworCisgICAgLy8gQWNjZXB0cyB0aGUgc2VsZWN0ZWQgaW5kZXggYXMgdGhlIHZh
bHVlIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgPHNlbGVjdD4gd2lkZ2V0IG9uCisgICAgLy8gdGhl
IHdlYiBwYWdlLCBhbmQgY2xvc2VzIHRoZSBwb3B1cC4gUmV0dXJucyB0cnVlIGlmIGluZGV4IGlz
IGFjY2VwdGVkLgorICAgIGJvb2wgYWNjZXB0SW5kZXgoaW50IGluZGV4KTsKKworICAgIC8vIENs
ZWFycyB0aGUgc2VsZWN0aW9uIChzbyBubyByb3cgYXBwZWFycyBzZWxlY3RlZCkuCisgICAgdm9p
ZCBjbGVhclNlbGVjdGlvbigpOworCisgICAgLy8gU2Nyb2xscyB0byByZXZlYWwgdGhlIGdpdmVu
IGluZGV4LgorICAgIHZvaWQgc2Nyb2xsVG9SZXZlYWxSb3coaW50IGluZGV4KTsKKyAgICB2b2lk
IHNjcm9sbFRvUmV2ZWFsU2VsZWN0aW9uKCkgeyBzY3JvbGxUb1JldmVhbFJvdyhtX3NlbGVjdGVk
SW5kZXgpOyB9CisKKyAgICAvLyBJbnZhbGlkYXRlcyB0aGUgcm93IGF0IHRoZSBnaXZlbiBpbmRl
eC4KKyAgICB2b2lkIGludmFsaWRhdGVSb3coaW50IGluZGV4KTsKKworICAgIC8vIEdldCB0aGUg
Ym91bmRzIG9mIGEgcm93LgorICAgIEludFJlY3QgZ2V0Um93Qm91bmRzKGludCBpbmRleCk7CisK
KyAgICAvLyBDb252ZXJ0cyBhIHBvaW50IHRvIGFuIGluZGV4IG9mIHRoZSByb3cgdGhlIHBvaW50
IGlzIG92ZXIKKyAgICBpbnQgcG9pbnRUb1Jvd0luZGV4KGNvbnN0IEludFBvaW50Jik7CisKKyAg
ICAvLyBQYWludCBhbiBpbmRpdmlkdWFsIHJvdworICAgIHZvaWQgcGFpbnRSb3coR3JhcGhpY3ND
b250ZXh0KiwgY29uc3QgSW50UmVjdCYsIGludCByb3dJbmRleCk7CisKKyAgICAvLyBUZXN0IGlm
IHRoZSBnaXZlbiBwb2ludCBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiB0aGUgcG9wdXAgd2luZG93
LgorICAgIGJvb2wgaXNQb2ludEluQm91bmRzKGNvbnN0IEludFBvaW50Jik7CisKKyAgICAvLyBD
YWxsZWQgd2hlbiB0aGUgdXNlciBwcmVzc2VzIGEgdGV4dCBrZXkuIERvZXMgYSBwcmVmaXgtc2Vh
cmNoIG9mIHRoZSBpdGVtcy4KKyAgICB2b2lkIHR5cGVBaGVhZEZpbmQoY29uc3QgUGxhdGZvcm1L
ZXlib2FyZEV2ZW50Jik7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBmb250IHRvIHVzZSBmb3IgdGhl
IGdpdmVuIHJvdworICAgIEZvbnQgZ2V0Um93Rm9udChpbnQgaW5kZXgpOworCisgICAgLy8gTW92
ZXMgdGhlIHNlbGVjdGlvbiBkb3duL3VwIG9uZSBpdGVtLCB0YWtpbmcgY2FyZSBvZiBsb29waW5n
IGJhY2sgdG8gdGhlCisgICAgLy8gZmlyc3QvbGFzdCBlbGVtZW50IGlmIG1fbG9vcFNlbGVjdGlv
bk5hdmlnYXRpb24gaXMgdHJ1ZS4KKyAgICB2b2lkIHNlbGVjdFByZXZpb3VzUm93KCk7CisgICAg
dm9pZCBzZWxlY3ROZXh0Um93KCk7CisKKyAgICAvLyBUaGUgc2V0dGluZ3MgdGhhdCBzcGVjaWZ5
IHRoZSBiZWhhdmlvciBmb3IgdGhpcyBQb3B1cCB3aW5kb3cuCisgICAgUG9wdXBDb250YWluZXJT
ZXR0aW5ncyBtX3NldHRpbmdzOworCisgICAgLy8gVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGl0
ZW0gbWFya2VkIGFzICJzZWxlY3RlZCIgLSBpLmUuIGRpc3BsYXllZCBpbiB0aGUgd2lkZ2V0IG9u
IHRoZQorICAgIC8vIHBhZ2UuCisgICAgaW50IG1fb3JpZ2luYWxJbmRleDsKKworICAgIC8vIFRo
aXMgaXMgdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRoYXQgdGhlIHVzZXIgaXMgaG92ZXJlZCBvdmVy
IG9yIGhhcyBzZWxlY3RlZCB1c2luZyB0aGUKKyAgICAvLyBrZXlib2FyZCBpbiB0aGUgbGlzdC4g
VGhleSBoYXZlIG5vdCBjb25maXJtZWQgdGhpcyBzZWxlY3Rpb24gYnkgY2xpY2tpbmcgb3IgcHJl
c3NpbmcKKyAgICAvLyBlbnRlciB5ZXQgaG93ZXZlci4KKyAgICBpbnQgbV9zZWxlY3RlZEluZGV4
OworCisgICAgLy8gSWYgPj0gMCwgdGhpcyBpcyB0aGUgaW5kZXggd2Ugc2hvdWxkIGFjY2VwdCBp
ZiB0aGUgcG9wdXAgaXMgImFiYW5kb25lZCIuCisgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBrZXli
b2FyZCBuYXZpZ2F0aW9uLCB3aGVyZSB3ZSB3YW50IHRoZQorICAgIC8vIHNlbGVjdGlvbiB0byBj
aGFuZ2UgaW1tZWRpYXRlbHksIGFuZCBpcyBvbmx5IHVzZWQgaWYgdGhlIHNldHRpbmdzCisgICAg
Ly8gYWNjZXB0T25BYmFuZG9uIGZpZWxkIGlzIHRydWUuCisgICAgaW50IG1fYWNjZXB0ZWRJbmRl
eE9uQWJhbmRvbjsKKworICAgIC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiByb3dzIHZpc2libGUg
aW4gdGhlIHBvcHVwLiBUaGUgbWF4aW11bSBudW1iZXIgdmlzaWJsZSBhdCBhIHRpbWUgaXMKKyAg
ICAvLyBkZWZpbmVkIGFzIGJlaW5nIGtNYXhWaXNpYmxlUm93cy4gRm9yIGEgc2Nyb2xsZWQgcG9w
dXAsIHRoaXMgY2FuIGJlIHRob3VnaHQgb2YgYXMgdGhlCisgICAgLy8gcGFnZSBzaXplIGluIGRh
dGEgdW5pdHMuCisgICAgaW50IG1fdmlzaWJsZVJvd3M7CisKKyAgICAvLyBPdXIgc3VnZ2VzdGVk
IHdpZHRoLCBub3QgaW5jbHVkaW5nIHNjcm9sbGJhci4KKyAgICBpbnQgbV9iYXNlV2lkdGg7CisK
KyAgICAvLyBUaGUgbWF4aW11bSBoZWlnaHQgd2UgY2FuIGJlIHdpdGhvdXQgYmVpbmcgb2ZmLXNj
cmVlbi4KKyAgICBpbnQgbV9tYXhIZWlnaHQ7CisKKyAgICAvLyBBIGxpc3Qgb2YgdGhlIG9wdGlv
bnMgY29udGFpbmVkIHdpdGhpbiB0aGUgPHNlbGVjdD4KKyAgICBWZWN0b3I8UG9wdXBJdGVtKj4g
bV9pdGVtczsKKworICAgIC8vIFRoZSA8c2VsZWN0PiBQb3B1cE1lbnVDbGllbnQgdGhhdCBvcGVu
ZWQgdXMuCisgICAgUG9wdXBNZW51Q2xpZW50KiBtX3BvcHVwQ2xpZW50OworCisgICAgLy8gVGhl
IHNjcm9sbGJhciB3aGljaCBoYXMgbW91c2UgY2FwdHVyZS4gTW91c2UgZXZlbnRzIGdvIHN0cmFp
Z2h0IHRvIHRoaXMKKyAgICAvLyBpZiBub3QgbnVsbC4KKyAgICBSZWZQdHI8U2Nyb2xsYmFyPiBt
X2NhcHR1cmluZ1Njcm9sbGJhcjsKKworICAgIC8vIFRoZSBsYXN0IHNjcm9sbGJhciB0aGF0IHRo
ZSBtb3VzZSB3YXMgb3Zlci4gVXNlZCBmb3IgbW91c2VvdmVyIGhpZ2hsaWdodHMuCisgICAgUmVm
UHRyPFNjcm9sbGJhcj4gbV9sYXN0U2Nyb2xsYmFyVW5kZXJNb3VzZTsKKworICAgIC8vIFRoZSBz
dHJpbmcgdGhlIHVzZXIgaGFzIHR5cGVkIHNvIGZhciBpbnRvIHRoZSBwb3B1cC4gVXNlZCBmb3Ig
dHlwZUFoZWFkRmluZC4KKyAgICBTdHJpbmcgbV90eXBlZFN0cmluZzsKKworICAgIC8vIFRoZSBj
aGFyIHRoZSB1c2VyIGhhcyBoaXQgcmVwZWF0ZWRseS4gVXNlZCBmb3IgdHlwZUFoZWFkRmluZC4K
KyAgICBVQ2hhciBtX3JlcGVhdGluZ0NoYXI7CisKKyAgICAvLyBUaGUgbGFzdCB0aW1lIHRoZSB1
c2VyIGhpdCBhIGtleS4gVXNlZCBmb3IgdHlwZUFoZWFkRmluZC4KKyAgICBUaW1lU3RhbXAgbV9s
YXN0Q2hhclRpbWU7CisKKyAgICAvLyBJZiB3aWR0aCBleGVlZHMgc2NyZWVuIHdpZHRoLCB3ZSBo
YXZlIHRvIGNsaXAgaXQuCisgICAgaW50IG1fbWF4V2luZG93V2lkdGg7CisKKyAgICAvLyBUbyBm
b3J3YXJkIGxhc3QgbW91c2UgcmVsZWFzZSBldmVudC4KKyAgICBSZWZQdHI8Tm9kZT4gbV9mb2N1
c2VkTm9kZTsKKworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVt
LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVt
LmNwcAppbmRleCA0MzhhMjlhNTg2NTk2ZTNkOWIyM2Q4ZmQ2MjM3NmZhYjNkYjE0MDQyLi4zYjJm
MmFlOWZlMzQzMjhhYmNlZGIzZDk1YTE5ZjE4ZTUxMjk0YzIwIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cE1lbnVDaHJvbWl1bS5jcHAKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vY2hyb21pdW0vUG9wdXBNZW51Q2hyb21pdW0uY3BwCkBAIC0z
MSw2MyArMzEsMTIgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlBvcHVwTWVu
dUNocm9taXVtLmgiCi0KLSNpbmNsdWRlICJDaHJvbWUuaCIKLSNpbmNsdWRlICJDaHJvbWVDbGll
bnRDaHJvbWl1bS5oIgotI2luY2x1ZGUgIkZvbnQuaCIKLSNpbmNsdWRlICJGb250U2VsZWN0b3Iu
aCIKLSNpbmNsdWRlICJGcmFtZVZpZXcuaCIKLSNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUg
IkZyYW1lbGVzc1Njcm9sbFZpZXcuaCIKLSNpbmNsdWRlICJGcmFtZWxlc3NTY3JvbGxWaWV3Q2xp
ZW50LmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCi0jaW5jbHVkZSAiSW50UmVjdC5o
IgotI2luY2x1ZGUgIktleWJvYXJkQ29kZXMuaCIKLSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVk
ZSAiUGxhdGZvcm1LZXlib2FyZEV2ZW50LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50
LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1TY3JlZW4uaCIKLSNpbmNsdWRlICJQbGF0Zm9ybVdoZWVs
RXZlbnQuaCIKLSNpbmNsdWRlICJQb3B1cE1lbnVDbGllbnQuaCIKLSNpbmNsdWRlICJSZW5kZXJU
aGVtZS5oIgotI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lLmgiCi0jaW5jbHVkZSAiU3RyaW5nVHJ1
bmNhdG9yLmgiCi0jaW5jbHVkZSAiU3lzdGVtVGltZS5oIgotI2luY2x1ZGUgIlRleHRSdW4uaCIK
LSNpbmNsdWRlICJVc2VyR2VzdHVyZUluZGljYXRvci5oIgotI2luY2x1ZGUgPHd0Zi9DdXJyZW50
VGltZS5oPgotI2luY2x1ZGUgPHd0Zi91bmljb2RlL0NoYXJhY3Rlck5hbWVzLmg+Ci0KLSNpZiBF
TkFCTEUoR0VTVFVSRV9FVkVOVFMpCi0jaW5jbHVkZSAiUGxhdGZvcm1HZXN0dXJlRXZlbnQuaCIK
LSNlbmRpZgotCi0jaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLSNpbmNsdWRlICJQbGF0Zm9ybVRv
dWNoRXZlbnQuaCIKLSNlbmRpZgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNw
YWNlIFdURjsKLXVzaW5nIG5hbWVzcGFjZSBVbmljb2RlOwotCi11c2luZyBzdGQ6Om1pbjsKLXVz
aW5nIHN0ZDo6bWF4OworI2luY2x1ZGUgIlBvcHVwQ29udGFpbmVyLmgiCiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAogaW50IFBvcHVwTWVudUNocm9taXVtOjpzX21pbmltdW1Sb3dIZWlnaHQgPSAw
OwogCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBUaW1lU3RhbXA7Ci0KLXN0YXRpYyBjb25z
dCBpbnQga01heFZpc2libGVSb3dzID0gMjA7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhIZWlnaHQg
PSA1MDA7Ci1zdGF0aWMgY29uc3QgaW50IGtCb3JkZXJTaXplID0gMTsKLXN0YXRpYyBjb25zdCBp
bnQga1RleHRUb0xhYmVsUGFkZGluZyA9IDEwOwotc3RhdGljIGNvbnN0IGludCBrTGFiZWxUb0lj
b25QYWRkaW5nID0gNTsKLXN0YXRpYyBjb25zdCBpbnQga01pbkVuZE9mTGluZVBhZGRpbmcgPSAy
Owotc3RhdGljIGNvbnN0IFRpbWVTdGFtcCBrVHlwZUFoZWFkVGltZW91dE1zID0gMTAwMDsKLXN0
YXRpYyBjb25zdCBpbnQga0xpbmVQYWRkaW5nSGVpZ2h0ID0gMzsgLy8gUGFkZGluZyBoZWlnaHQg
cHV0IGF0IHRoZSB0b3AgYW5kIGJvdHRvbSBvZiBlYWNoIGxpbmUuCi0KIC8vIFRoZSBzZXR0aW5n
cyB1c2VkIGZvciB0aGUgZHJvcCBkb3duIG1lbnUuCiAvLyBUaGlzIGlzIHRoZSBkZWxlZ2F0ZSB1
c2VkIGlmIG5vbmUgaXMgcHJvdmlkZWQuCiBzdGF0aWMgY29uc3QgUG9wdXBDb250YWluZXJTZXR0
aW5ncyBkcm9wRG93blNldHRpbmdzID0gewpAQCAtOTcsMTQ0OSArNDYsNiBAQCBzdGF0aWMgY29u
c3QgUG9wdXBDb250YWluZXJTZXR0aW5ncyBkcm9wRG93blNldHRpbmdzID0gewogICAgIGZhbHNl
IC8vIHJlc3RyaWN0V2lkdGhPZkxpc3RCb3gKIH07CiAKLS8vIFRoaXMgY2xhc3MgdXNlcyBXZWJD
b3JlIGNvZGUgdG8gcGFpbnQgYW5kIGhhbmRsZSBldmVudHMgZm9yIGEgZHJvcC1kb3duIGxpc3QK
LS8vIGJveCAoImNvbWJvYm94IiBvbiBXaW5kb3dzKS4KLWNsYXNzIFBvcHVwTGlzdEJveCA6IHB1
YmxpYyBGcmFtZWxlc3NTY3JvbGxWaWV3IHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0
cjxQb3B1cExpc3RCb3g+IGNyZWF0ZShQb3B1cE1lbnVDbGllbnQqIGNsaWVudCwgY29uc3QgUG9w
dXBDb250YWluZXJTZXR0aW5ncyYgc2V0dGluZ3MpCi0gICAgewotICAgICAgICByZXR1cm4gYWRv
cHRSZWYobmV3IFBvcHVwTGlzdEJveChjbGllbnQsIHNldHRpbmdzKSk7Ci0gICAgfQotCi0gICAg
Ly8gRnJhbWVsZXNzU2Nyb2xsVmlldwotICAgIHZpcnR1YWwgdm9pZCBwYWludChHcmFwaGljc0Nv
bnRleHQqLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlRG93
bkV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOwotICAgIHZpcnR1YWwgYm9vbCBoYW5k
bGVNb3VzZU1vdmVFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKLSAgICB2aXJ0dWFs
IGJvb2wgaGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7
Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZVdoZWVsRXZlbnQoY29uc3QgUGxhdGZvcm1XaGVlbEV2
ZW50Jik7Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZUtleUV2ZW50KGNvbnN0IFBsYXRmb3JtS2V5
Ym9hcmRFdmVudCYpOwotI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCi0gICAgdmlydHVhbCBib29s
IGhhbmRsZVRvdWNoRXZlbnQoY29uc3QgUGxhdGZvcm1Ub3VjaEV2ZW50Jik7Ci0jZW5kaWYKLSNp
ZiBFTkFCTEUoR0VTVFVSRV9SRUNPR05JWkVSKQotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVHZXN0
dXJlRXZlbnQoY29uc3QgUGxhdGZvcm1HZXN0dXJlRXZlbnQmKTsKLSNlbmRpZgotCi0gICAgLy8g
U2Nyb2xsVmlldwotICAgIHZpcnR1YWwgSG9zdFdpbmRvdyogaG9zdFdpbmRvdygpIGNvbnN0Owot
Ci0gICAgLy8gUG9wdXBMaXN0Qm94IG1ldGhvZHMKLQotICAgIC8vIEhpZGVzIHRoZSBwb3B1cC4K
LSAgICB2b2lkIGhpZGVQb3B1cCgpOwotCi0gICAgLy8gVXBkYXRlcyBvdXIgaW50ZXJuYWwgbGlz
dCB0byBtYXRjaCB0aGUgY2xpZW50LgotICAgIHZvaWQgdXBkYXRlRnJvbUVsZW1lbnQoKTsKLQot
ICAgIC8vIEZyZWVzIGFueSBhbGxvY2F0ZWQgcmVzb3VyY2VzIHVzZWQgaW4gYSBwYXJ0aWN1bGFy
IHBvcHVwIHNlc3Npb24uCi0gICAgdm9pZCBjbGVhcigpOwotCi0gICAgLy8gU2V0cyB0aGUgaW5k
ZXggb2YgdGhlIG9wdGlvbiB0aGF0IGlzIGRpc3BsYXllZCBpbiB0aGUgPHNlbGVjdD4gd2lkZ2V0
IGluIHRoZSBwYWdlCi0gICAgdm9pZCBzZXRPcmlnaW5hbEluZGV4KGludCBpbmRleCk7Ci0KLSAg
ICAvLyBHZXRzIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0aGF0IHRoZSB1c2VyIGlzIGN1cnJlbnRs
eSBtb3VzZWQgb3ZlciBvciBoYXMgc2VsZWN0ZWQgd2l0aAotICAgIC8vIHRoZSBrZXlib2FyZC4g
VGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIGluZGV4LCBzaW5jZSB0aGUgdXNl
ciBoYXMgbm90IHlldAotICAgIC8vIGFjY2VwdGVkIHRoaXMgaW5wdXQuCi0gICAgaW50IHNlbGVj
dGVkSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdGVkSW5kZXg7IH0KLQotICAgIC8vIE1v
dmVzIHNlbGVjdGlvbiBkb3duL3VwIHRoZSBnaXZlbiBudW1iZXIgb2YgaXRlbXMsIHNjcm9sbGlu
ZyBpZiBuZWNlc3NhcnkuCi0gICAgLy8gUG9zaXRpdmUgaXMgZG93bi4gIFRoZSByZXN1bHRpbmcg
aW5kZXggd2lsbCBiZSBjbGFtcGVkIHRvIHRoZSByYW5nZQotICAgIC8vIFswLCBudW1JdGVtcyks
IGFuZCBub24tb3B0aW9uIGl0ZW1zIHdpbGwgYmUgc2tpcHBlZC4KLSAgICB2b2lkIGFkanVzdFNl
bGVjdGVkSW5kZXgoaW50IGRlbHRhKTsKLQotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBp
dGVtcyBpbiB0aGUgbGlzdC4KLSAgICBpbnQgbnVtSXRlbXMoKSBjb25zdCB7IHJldHVybiBzdGF0
aWNfY2FzdDxpbnQ+KG1faXRlbXMuc2l6ZSgpKTsgfQotCi0gICAgdm9pZCBzZXRCYXNlV2lkdGgo
aW50IHdpZHRoKSB7IG1fYmFzZVdpZHRoID0gbWluKG1fbWF4V2luZG93V2lkdGgsIHdpZHRoKTsg
fQotCi0gICAgLy8gQ29tcHV0ZXMgdGhlIHNpemUgb2Ygd2lkZ2V0IGFuZCBjaGlsZHJlbi4KLSAg
ICB2b2lkIGxheW91dCgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwb3B1cCB3YW50
cyB0byBwcm9jZXNzIGV2ZW50cyBmb3IgdGhlIHBhc3NlZCBrZXkuCi0gICAgYm9vbCBpc0ludGVy
ZXN0ZWRJbkV2ZW50Rm9yS2V5KGludCBrZXlDb2RlKTsKLQotICAgIC8vIEdldHMgdGhlIGhlaWdo
dCBvZiBhIHJvdy4KLSAgICBpbnQgZ2V0Um93SGVpZ2h0KGludCBpbmRleCk7Ci0KLSAgICB2b2lk
IHNldE1heEhlaWdodChpbnQgbWF4SGVpZ2h0KSB7IG1fbWF4SGVpZ2h0ID0gbWF4SGVpZ2h0OyB9
Ci0KLSAgICB2b2lkIHNldE1heFdpZHRoKGludCBtYXhXaWR0aCkgeyBtX21heFdpbmRvd1dpZHRo
ID0gbWF4V2lkdGg7IH0KLQotICAgIHZvaWQgc2V0TWF4V2lkdGhBbmRMYXlvdXQoaW50KTsKLQot
ICAgIHZvaWQgZGlzY29ubmVjdENsaWVudCgpIHsgbV9wb3B1cENsaWVudCA9IDA7IH0KLQotICAg
IGNvbnN0IFZlY3RvcjxQb3B1cEl0ZW0qPiYgaXRlbXMoKSBjb25zdCB7IHJldHVybiBtX2l0ZW1z
OyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIFBvcHVwQ29udGFpbmVyOwotICAgIGZy
aWVuZCBjbGFzcyBSZWZDb3VudGVkPFBvcHVwTGlzdEJveD47Ci0KLSAgICBQb3B1cExpc3RCb3go
UG9wdXBNZW51Q2xpZW50KiBjbGllbnQsIGNvbnN0IFBvcHVwQ29udGFpbmVyU2V0dGluZ3MmIHNl
dHRpbmdzKQotICAgICAgICA6IG1fc2V0dGluZ3Moc2V0dGluZ3MpCi0gICAgICAgICwgbV9vcmln
aW5hbEluZGV4KDApCi0gICAgICAgICwgbV9zZWxlY3RlZEluZGV4KDApCi0gICAgICAgICwgbV9h
Y2NlcHRlZEluZGV4T25BYmFuZG9uKC0xKQotICAgICAgICAsIG1fdmlzaWJsZVJvd3MoMCkKLSAg
ICAgICAgLCBtX2Jhc2VXaWR0aCgwKQotICAgICAgICAsIG1fbWF4SGVpZ2h0KGtNYXhIZWlnaHQp
Ci0gICAgICAgICwgbV9wb3B1cENsaWVudChjbGllbnQpCi0gICAgICAgICwgbV9yZXBlYXRpbmdD
aGFyKDApCi0gICAgICAgICwgbV9sYXN0Q2hhclRpbWUoMCkKLSAgICAgICAgLCBtX21heFdpbmRv
d1dpZHRoKG51bWVyaWNfbGltaXRzPGludD46Om1heCgpKQotICAgIHsKLSAgICAgICAgc2V0U2Ny
b2xsYmFyTW9kZXMoU2Nyb2xsYmFyQWx3YXlzT2ZmLCBTY3JvbGxiYXJBbHdheXNPZmYpOwotICAg
IH0KLQotICAgIH5Qb3B1cExpc3RCb3goKQotICAgIHsKLSAgICAgICAgY2xlYXIoKTsKLSAgICB9
Ci0KLSAgICAvLyBDbG9zZXMgdGhlIHBvcHVwCi0gICAgdm9pZCBhYmFuZG9uKCk7Ci0KLSAgICAv
LyBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdGlvbiBjYW4gYmUgY2hhbmdlZCB0byBpbmRleC4K
LSAgICAvLyBEaXNhYmxlZCBpdGVtcywgb3IgbGFiZWxzIGNhbm5vdCBiZSBzZWxlY3RlZC4KLSAg
ICBib29sIGlzU2VsZWN0YWJsZUl0ZW0oaW50IGluZGV4KTsKLQotICAgIC8vIFNlbGVjdCBhbiBp
bmRleCBpbiB0aGUgbGlzdCwgc2Nyb2xsaW5nIGlmIG5lY2Vzc2FyeS4KLSAgICB2b2lkIHNlbGVj
dEluZGV4KGludCBpbmRleCk7Ci0KLSAgICAvLyBBY2NlcHRzIHRoZSBzZWxlY3RlZCBpbmRleCBh
cyB0aGUgdmFsdWUgdG8gYmUgZGlzcGxheWVkIGluIHRoZSA8c2VsZWN0PiB3aWRnZXQgb24KLSAg
ICAvLyB0aGUgd2ViIHBhZ2UsIGFuZCBjbG9zZXMgdGhlIHBvcHVwLiBSZXR1cm5zIHRydWUgaWYg
aW5kZXggaXMgYWNjZXB0ZWQuCi0gICAgYm9vbCBhY2NlcHRJbmRleChpbnQgaW5kZXgpOwotCi0g
ICAgLy8gQ2xlYXJzIHRoZSBzZWxlY3Rpb24gKHNvIG5vIHJvdyBhcHBlYXJzIHNlbGVjdGVkKS4K
LSAgICB2b2lkIGNsZWFyU2VsZWN0aW9uKCk7Ci0KLSAgICAvLyBTY3JvbGxzIHRvIHJldmVhbCB0
aGUgZ2l2ZW4gaW5kZXguCi0gICAgdm9pZCBzY3JvbGxUb1JldmVhbFJvdyhpbnQgaW5kZXgpOwot
ICAgIHZvaWQgc2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24oKSB7IHNjcm9sbFRvUmV2ZWFsUm93KG1f
c2VsZWN0ZWRJbmRleCk7IH0KLQotICAgIC8vIEludmFsaWRhdGVzIHRoZSByb3cgYXQgdGhlIGdp
dmVuIGluZGV4LgotICAgIHZvaWQgaW52YWxpZGF0ZVJvdyhpbnQgaW5kZXgpOwotCi0gICAgLy8g
R2V0IHRoZSBib3VuZHMgb2YgYSByb3cuCi0gICAgSW50UmVjdCBnZXRSb3dCb3VuZHMoaW50IGlu
ZGV4KTsKLQotICAgIC8vIENvbnZlcnRzIGEgcG9pbnQgdG8gYW4gaW5kZXggb2YgdGhlIHJvdyB0
aGUgcG9pbnQgaXMgb3ZlcgotICAgIGludCBwb2ludFRvUm93SW5kZXgoY29uc3QgSW50UG9pbnQm
KTsKLQotICAgIC8vIFBhaW50IGFuIGluZGl2aWR1YWwgcm93Ci0gICAgdm9pZCBwYWludFJvdyhH
cmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0JiwgaW50IHJvd0luZGV4KTsKLQotICAgIC8v
IFRlc3QgaWYgdGhlIGdpdmVuIHBvaW50IGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBwb3B1
cCB3aW5kb3cuCi0gICAgYm9vbCBpc1BvaW50SW5Cb3VuZHMoY29uc3QgSW50UG9pbnQmKTsKLQot
ICAgIC8vIENhbGxlZCB3aGVuIHRoZSB1c2VyIHByZXNzZXMgYSB0ZXh0IGtleS4gIERvZXMgYSBw
cmVmaXgtc2VhcmNoIG9mIHRoZSBpdGVtcy4KLSAgICB2b2lkIHR5cGVBaGVhZEZpbmQoY29uc3Qg
UGxhdGZvcm1LZXlib2FyZEV2ZW50Jik7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBmb250IHRvIHVz
ZSBmb3IgdGhlIGdpdmVuIHJvdwotICAgIEZvbnQgZ2V0Um93Rm9udChpbnQgaW5kZXgpOwotCi0g
ICAgLy8gTW92ZXMgdGhlIHNlbGVjdGlvbiBkb3duL3VwIG9uZSBpdGVtLCB0YWtpbmcgY2FyZSBv
ZiBsb29waW5nIGJhY2sgdG8gdGhlCi0gICAgLy8gZmlyc3QvbGFzdCBlbGVtZW50IGlmIG1fbG9v
cFNlbGVjdGlvbk5hdmlnYXRpb24gaXMgdHJ1ZS4KLSAgICB2b2lkIHNlbGVjdFByZXZpb3VzUm93
KCk7Ci0gICAgdm9pZCBzZWxlY3ROZXh0Um93KCk7Ci0KLSAgICAvLyBUaGUgc2V0dGluZ3MgdGhh
dCBzcGVjaWZ5IHRoZSBiZWhhdmlvciBmb3IgdGhpcyBQb3B1cCB3aW5kb3cuCi0gICAgUG9wdXBD
b250YWluZXJTZXR0aW5ncyBtX3NldHRpbmdzOwotCi0gICAgLy8gVGhpcyBpcyB0aGUgaW5kZXgg
b2YgdGhlIGl0ZW0gbWFya2VkIGFzICJzZWxlY3RlZCIgLSBpLmUuIGRpc3BsYXllZCBpbiB0aGUg
d2lkZ2V0IG9uIHRoZQotICAgIC8vIHBhZ2UuCi0gICAgaW50IG1fb3JpZ2luYWxJbmRleDsKLQot
ICAgIC8vIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRoYXQgdGhlIHVzZXIgaXMgaG92
ZXJlZCBvdmVyIG9yIGhhcyBzZWxlY3RlZCB1c2luZyB0aGUKLSAgICAvLyBrZXlib2FyZCBpbiB0
aGUgbGlzdC4gVGhleSBoYXZlIG5vdCBjb25maXJtZWQgdGhpcyBzZWxlY3Rpb24gYnkgY2xpY2tp
bmcgb3IgcHJlc3NpbmcKLSAgICAvLyBlbnRlciB5ZXQgaG93ZXZlci4KLSAgICBpbnQgbV9zZWxl
Y3RlZEluZGV4OwotCi0gICAgLy8gSWYgPj0gMCwgdGhpcyBpcyB0aGUgaW5kZXggd2Ugc2hvdWxk
IGFjY2VwdCBpZiB0aGUgcG9wdXAgaXMgImFiYW5kb25lZCIuCi0gICAgLy8gVGhpcyBpcyB1c2Vk
IGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uLCB3aGVyZSB3ZSB3YW50IHRoZQotICAgIC8vIHNlbGVj
dGlvbiB0byBjaGFuZ2UgaW1tZWRpYXRlbHksIGFuZCBpcyBvbmx5IHVzZWQgaWYgdGhlIHNldHRp
bmdzCi0gICAgLy8gYWNjZXB0T25BYmFuZG9uIGZpZWxkIGlzIHRydWUuCi0gICAgaW50IG1fYWNj
ZXB0ZWRJbmRleE9uQWJhbmRvbjsKLQotICAgIC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiByb3dz
IHZpc2libGUgaW4gdGhlIHBvcHVwLiBUaGUgbWF4aW11bSBudW1iZXIgdmlzaWJsZSBhdCBhIHRp
bWUgaXMKLSAgICAvLyBkZWZpbmVkIGFzIGJlaW5nIGtNYXhWaXNpYmxlUm93cy4gRm9yIGEgc2Ny
b2xsZWQgcG9wdXAsIHRoaXMgY2FuIGJlIHRob3VnaHQgb2YgYXMgdGhlCi0gICAgLy8gcGFnZSBz
aXplIGluIGRhdGEgdW5pdHMuCi0gICAgaW50IG1fdmlzaWJsZVJvd3M7Ci0KLSAgICAvLyBPdXIg
c3VnZ2VzdGVkIHdpZHRoLCBub3QgaW5jbHVkaW5nIHNjcm9sbGJhci4KLSAgICBpbnQgbV9iYXNl
V2lkdGg7Ci0KLSAgICAvLyBUaGUgbWF4aW11bSBoZWlnaHQgd2UgY2FuIGJlIHdpdGhvdXQgYmVp
bmcgb2ZmLXNjcmVlbi4KLSAgICBpbnQgbV9tYXhIZWlnaHQ7Ci0KLSAgICAvLyBBIGxpc3Qgb2Yg
dGhlIG9wdGlvbnMgY29udGFpbmVkIHdpdGhpbiB0aGUgPHNlbGVjdD4KLSAgICBWZWN0b3I8UG9w
dXBJdGVtKj4gbV9pdGVtczsKLQotICAgIC8vIFRoZSA8c2VsZWN0PiBQb3B1cE1lbnVDbGllbnQg
dGhhdCBvcGVuZWQgdXMuCi0gICAgUG9wdXBNZW51Q2xpZW50KiBtX3BvcHVwQ2xpZW50OwotCi0g
ICAgLy8gVGhlIHNjcm9sbGJhciB3aGljaCBoYXMgbW91c2UgY2FwdHVyZS4gIE1vdXNlIGV2ZW50
cyBnbyBzdHJhaWdodCB0byB0aGlzCi0gICAgLy8gaWYgbm9uLU5VTEwuCi0gICAgUmVmUHRyPFNj
cm9sbGJhcj4gbV9jYXB0dXJpbmdTY3JvbGxiYXI7Ci0KLSAgICAvLyBUaGUgbGFzdCBzY3JvbGxi
YXIgdGhhdCB0aGUgbW91c2Ugd2FzIG92ZXIuICBVc2VkIGZvciBtb3VzZW92ZXIgaGlnaGxpZ2h0
cy4KLSAgICBSZWZQdHI8U2Nyb2xsYmFyPiBtX2xhc3RTY3JvbGxiYXJVbmRlck1vdXNlOwotCi0g
ICAgLy8gVGhlIHN0cmluZyB0aGUgdXNlciBoYXMgdHlwZWQgc28gZmFyIGludG8gdGhlIHBvcHVw
LiBVc2VkIGZvciB0eXBlQWhlYWRGaW5kLgotICAgIFN0cmluZyBtX3R5cGVkU3RyaW5nOwotCi0g
ICAgLy8gVGhlIGNoYXIgdGhlIHVzZXIgaGFzIGhpdCByZXBlYXRlZGx5LiAgVXNlZCBmb3IgdHlw
ZUFoZWFkRmluZC4KLSAgICBVQ2hhciBtX3JlcGVhdGluZ0NoYXI7Ci0KLSAgICAvLyBUaGUgbGFz
dCB0aW1lIHRoZSB1c2VyIGhpdCBhIGtleS4gIFVzZWQgZm9yIHR5cGVBaGVhZEZpbmQuCi0gICAg
VGltZVN0YW1wIG1fbGFzdENoYXJUaW1lOwotCi0gICAgLy8gSWYgd2lkdGggZXhlZWRzIHNjcmVl
biB3aWR0aCwgd2UgaGF2ZSB0byBjbGlwIGl0LgotICAgIGludCBtX21heFdpbmRvd1dpZHRoOwot
Ci0gICAgLy8gVG8gZm9yd2FyZCBsYXN0IG1vdXNlIHJlbGVhc2UgZXZlbnQuCi0gICAgUmVmUHRy
PE5vZGU+IG1fZm9jdXNlZE5vZGU7Ci19OwotCi1zdGF0aWMgUGxhdGZvcm1Nb3VzZUV2ZW50IGNv
bnN0cnVjdFJlbGF0aXZlTW91c2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGUsCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFt
ZWxlc3NTY3JvbGxWaWV3KiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBGcmFtZWxlc3NTY3JvbGxWaWV3KiBjaGlsZCkKLXsKLSAg
ICBJbnRQb2ludCBwb3MgPSBwYXJlbnQtPmNvbnZlcnRTZWxmVG9DaGlsZChjaGlsZCwgZS5wb3Mo
KSk7Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhvcnJpYmxlIGhhY2sgc2luY2UgUGxhdGZv
cm1Nb3VzZUV2ZW50IGhhcyBubyBzZXR0ZXJzIGZvciB4L3kuCi0gICAgUGxhdGZvcm1Nb3VzZUV2
ZW50IHJlbGF0aXZlRXZlbnQgPSBlOwotICAgIEludFBvaW50JiByZWxhdGl2ZVBvcyA9IGNvbnN0
X2Nhc3Q8SW50UG9pbnQmPihyZWxhdGl2ZUV2ZW50LnBvcygpKTsKLSAgICByZWxhdGl2ZVBvcy5z
ZXRYKHBvcy54KCkpOwotICAgIHJlbGF0aXZlUG9zLnNldFkocG9zLnkoKSk7Ci0gICAgcmV0dXJu
IHJlbGF0aXZlRXZlbnQ7Ci19Ci0KLXN0YXRpYyBQbGF0Zm9ybVdoZWVsRXZlbnQgY29uc3RydWN0
UmVsYXRpdmVXaGVlbEV2ZW50KGNvbnN0IFBsYXRmb3JtV2hlZWxFdmVudCYgZSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lbGVzc1Nj
cm9sbFZpZXcqIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEZyYW1lbGVzc1Njcm9sbFZpZXcqIGNoaWxkKQotewotICAgIEludFBv
aW50IHBvcyA9IHBhcmVudC0+Y29udmVydFNlbGZUb0NoaWxkKGNoaWxkLCBlLnBvcygpKTsKLQot
ICAgIC8vIEZJWE1FOiBUaGlzIGlzIGEgaG9ycmlibGUgaGFjayBzaW5jZSBQbGF0Zm9ybVdoZWVs
RXZlbnQgaGFzIG5vIHNldHRlcnMgZm9yIHgveS4KLSAgICBQbGF0Zm9ybVdoZWVsRXZlbnQgcmVs
YXRpdmVFdmVudCA9IGU7Ci0gICAgSW50UG9pbnQmIHJlbGF0aXZlUG9zID0gY29uc3RfY2FzdDxJ
bnRQb2ludCY+KHJlbGF0aXZlRXZlbnQucG9zKCkpOwotICAgIHJlbGF0aXZlUG9zLnNldFgocG9z
LngoKSk7Ci0gICAgcmVsYXRpdmVQb3Muc2V0WShwb3MueSgpKTsKLSAgICByZXR1cm4gcmVsYXRp
dmVFdmVudDsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUG9wdXBDb250YWluZXIg
aW1wbGVtZW50YXRpb24KLQotLy8gc3RhdGljCi1QYXNzUmVmUHRyPFBvcHVwQ29udGFpbmVyPiBQ
b3B1cENvbnRhaW5lcjo6Y3JlYXRlKFBvcHVwTWVudUNsaWVudCogY2xpZW50LAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3B1cFR5cGUgcG9wdXBU
eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBQb3B1cENvbnRhaW5lclNldHRpbmdzJiBzZXR0aW5ncykKLXsKLSAgICByZXR1cm4gYWRv
cHRSZWYobmV3IFBvcHVwQ29udGFpbmVyKGNsaWVudCwgcG9wdXBUeXBlLCBzZXR0aW5ncykpOwot
fQotCi1Qb3B1cENvbnRhaW5lcjo6UG9wdXBDb250YWluZXIoUG9wdXBNZW51Q2xpZW50KiBjbGll
bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9wdXBUeXBlIHBvcHVwVHlwZSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb3B1cENvbnRhaW5lclNldHRp
bmdzJiBzZXR0aW5ncykKLSAgICA6IG1fbGlzdEJveChQb3B1cExpc3RCb3g6OmNyZWF0ZShjbGll
bnQsIHNldHRpbmdzKSkKLSAgICAsIG1fc2V0dGluZ3Moc2V0dGluZ3MpCi0gICAgLCBtX3BvcHVw
VHlwZShwb3B1cFR5cGUpCi0gICAgLCBtX3BvcHVwT3BlbihmYWxzZSkKLXsKLSAgICBzZXRTY3Jv
bGxiYXJNb2RlcyhTY3JvbGxiYXJBbHdheXNPZmYsIFNjcm9sbGJhckFsd2F5c09mZik7Ci19Ci0K
LVBvcHVwQ29udGFpbmVyOjp+UG9wdXBDb250YWluZXIoKQotewotICAgIGlmIChtX2xpc3RCb3gg
JiYgbV9saXN0Qm94LT5wYXJlbnQoKSkKLSAgICAgICAgcmVtb3ZlQ2hpbGQobV9saXN0Qm94Lmdl
dCgpKTsKLX0KLQotSW50UmVjdCBQb3B1cENvbnRhaW5lcjo6bGF5b3V0QW5kQ2FsY3VsYXRlV2lk
Z2V0UmVjdChpbnQgdGFyZ2V0Q29udHJvbEhlaWdodCwgY29uc3QgSW50UG9pbnQmIHBvcHVwSW5p
dGlhbENvb3JkaW5hdGUpCi17Ci0gICAgLy8gUmVzZXQgdGhlIG1heCB3aWR0aCBhbmQgaGVpZ2h0
IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLCB0aGV5IHdpbGwgYmUgcmVjb21wdXRlZCBiZWxvdwot
ICAgIC8vIGlmIG5lY2Vzc2FyeS4KLSAgICBtX2xpc3RCb3gtPnNldE1heEhlaWdodChrTWF4SGVp
Z2h0KTsKLSAgICBtX2xpc3RCb3gtPnNldE1heFdpZHRoKG51bWVyaWNfbGltaXRzPGludD46Om1h
eCgpKTsKLQotICAgIC8vIExheSBldmVyeXRoaW5nIG91dCB0byBmaWd1cmUgb3V0IG91ciBwcmVm
ZXJyZWQgc2l6ZSwgdGhlbiB0ZWxsIHRoZSB2aWV3J3MKLSAgICAvLyBXaWRnZXRDbGllbnQgYWJv
dXQgaXQuICBJdCBzaG91bGQgYXNzaWduIHVzIGEgY2xpZW50LgotICAgIGludCBydGxPZmZzZXQg
PSBsYXlvdXRBbmRHZXRSVExPZmZzZXQoKTsKLSAgICBib29sIGlzUlRMID0gdGhpcy0+aXNSVEwo
KTsKLSAgICBpbnQgcmlnaHRPZmZzZXQgPSBpc1JUTCA/IHJ0bE9mZnNldCA6IDA7Ci0KLSAgICAv
LyBBc3N1bWUgbV9saXN0Qm94IHNpemUgaXMgYWxyZWFkeSBjYWxjdWxhdGVkLgotICAgIEludFNp
emUgdGFyZ2V0U2l6ZShtX2xpc3RCb3gtPndpZHRoKCkgKyBrQm9yZGVyU2l6ZSAqIDIsCi0gICAg
ICAgICAgICAgICAgICAgICAgIG1fbGlzdEJveC0+aGVpZ2h0KCkgKyBrQm9yZGVyU2l6ZSAqIDIp
OwotCi0gICAgSW50UmVjdCB3aWRnZXRSZWN0OwotICAgIENocm9tZUNsaWVudENocm9taXVtKiBj
aHJvbWVDbGllbnQgPSBjaHJvbWVDbGllbnRDaHJvbWl1bSgpOwotICAgIGlmIChjaHJvbWVDbGll
bnQpIHsKLSAgICAgICAgLy8gSWYgdGhlIHBvcHVwIHdvdWxkIGV4dGVuZCBwYXN0IHRoZSBib3R0
b20gb2YgdGhlIHNjcmVlbiwgb3BlbiB1cHdhcmRzCi0gICAgICAgIC8vIGluc3RlYWQuCi0gICAg
ICAgIEZsb2F0UmVjdCBzY3JlZW4gPSBzY3JlZW5BdmFpbGFibGVSZWN0KG1fZnJhbWVWaWV3Lmdl
dCgpKTsKLSAgICAgICAgLy8gVXNlIHBvcHVwSW5pdGlhbENvb3JkaW5hdGUueCgpICsgcmlnaHRP
ZmZzZXQgYmVjYXVzZSBSVEwgcG9zaXRpb24KLSAgICAgICAgLy8gbmVlZHMgdG8gYmUgY29uc2lk
ZXJlZC4KLSAgICAgICAgd2lkZ2V0UmVjdCA9IGNocm9tZUNsaWVudC0+d2luZG93VG9TY3JlZW4o
SW50UmVjdChwb3B1cEluaXRpYWxDb29yZGluYXRlLngoKSArIHJpZ2h0T2Zmc2V0LCBwb3B1cElu
aXRpYWxDb29yZGluYXRlLnkoKSwgdGFyZ2V0U2l6ZS53aWR0aCgpLCB0YXJnZXRTaXplLmhlaWdo
dCgpKSk7Ci0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBtdWx0aXBsZSBzY3JlZW5zIGFuZCB0aGUg
YnJvd3NlciByZWN0IGlzIGluIG9uZSBzY3JlZW4sIHdlIGhhdmUKLSAgICAgICAgLy8gdG8gY2xp
cCB0aGUgd2luZG93IHdpZHRoIHRvIHRoZSBzY3JlZW4gd2lkdGguCi0gICAgICAgIC8vIFdoZW4g
Y2xpcHBpbmcsIHdlIGFsc28gbmVlZCB0byBzZXQgYSBtYXhpbXVtIHdpZHRoIGZvciB0aGUgbGlz
dCBib3guCi0gICAgICAgIEZsb2F0UmVjdCB3aW5kb3dSZWN0ID0gY2hyb21lQ2xpZW50LT53aW5k
b3dSZWN0KCk7Ci0gICAgICAgIGlmICh3aW5kb3dSZWN0LngoKSA+PSBzY3JlZW4ueCgpICYmIHdp
bmRvd1JlY3QubWF4WCgpIDw9IHNjcmVlbi5tYXhYKCkgJiYgKHdpZGdldFJlY3QueCgpIDwgc2Ny
ZWVuLngoKSB8fCB3aWRnZXRSZWN0Lm1heFgoKSA+IHNjcmVlbi5tYXhYKCkpKSB7Ci0gICAgICAg
ICAgICAvLyBGaXJzdCwgaW52ZXJzZSB0aGUgcG9wdXAgYWxpZ25tZW50IGlmIGl0IGRvZXMgbm90
IGZpdCB0aGUgc2NyZWVuIC0gdGhpcyBtaWdodCBmaXggdGhpbmdzIChvciBtYWtlIHRoZW0gYmV0
dGVyKS4KLSAgICAgICAgICAgIEludFJlY3QgaW52ZXJzZVdpZGdldFJlY3QgPSBjaHJvbWVDbGll
bnQtPndpbmRvd1RvU2NyZWVuKEludFJlY3QocG9wdXBJbml0aWFsQ29vcmRpbmF0ZS54KCkgKyAo
aXNSVEwgPyAwIDogcnRsT2Zmc2V0KSwgcG9wdXBJbml0aWFsQ29vcmRpbmF0ZS55KCksIHRhcmdl
dFNpemUud2lkdGgoKSwgdGFyZ2V0U2l6ZS5oZWlnaHQoKSkpOwotICAgICAgICAgICAgSW50UmVj
dCBlbmNsb3NpbmdTY3JlZW4gPSBlbmNsb3NpbmdJbnRSZWN0KHNjcmVlbik7Ci0gICAgICAgICAg
ICB1bnNpZ25lZCBvcmlnaW5hbEN1dG9mZiA9IG1heChlbmNsb3NpbmdTY3JlZW4ueCgpIC0gd2lk
Z2V0UmVjdC54KCksIDApICsgbWF4KHdpZGdldFJlY3QubWF4WCgpIC0gZW5jbG9zaW5nU2NyZWVu
Lm1heFgoKSwgMCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnZlcnNlQ3V0b2ZmID0gbWF4KGVu
Y2xvc2luZ1NjcmVlbi54KCkgLSBpbnZlcnNlV2lkZ2V0UmVjdC54KCksIDApICsgbWF4KGludmVy
c2VXaWRnZXRSZWN0Lm1heFgoKSAtIGVuY2xvc2luZ1NjcmVlbi5tYXhYKCksIDApOwotCi0gICAg
ICAgICAgICAvLyBBY2NlcHQgdGhlIGludmVyc2UgcG9wdXAgYWxpZ25tZW50IGlmIHRoZSB0cmlt
bWVkIGNvbnRlbnQgZ2V0cyBzaG9ydGVyIHRoYW4gdGhhdCBpbiB0aGUgb3JpZ2luYWwgYWxpZ25t
ZW50IGNhc2UuCi0gICAgICAgICAgICBpZiAoaW52ZXJzZUN1dG9mZiA8IG9yaWdpbmFsQ3V0b2Zm
KQotICAgICAgICAgICAgICAgIHdpZGdldFJlY3QgPSBpbnZlcnNlV2lkZ2V0UmVjdDsKLQotICAg
ICAgICAgICAgaWYgKHdpZGdldFJlY3QueCgpIDwgc2NyZWVuLngoKSkgewotICAgICAgICAgICAg
ICAgIHVuc2lnbmVkIHdpZGdldFJpZ2h0ID0gd2lkZ2V0UmVjdC5tYXhYKCk7Ci0gICAgICAgICAg
ICAgICAgd2lkZ2V0UmVjdC5zZXRXaWR0aCh3aWRnZXRSZWN0Lm1heFgoKSAtIHNjcmVlbi54KCkp
OwotICAgICAgICAgICAgICAgIHdpZGdldFJlY3Quc2V0WCh3aWRnZXRSaWdodCAtIHdpZGdldFJl
Y3Qud2lkdGgoKSk7Ci0gICAgICAgICAgICAgICAgbGlzdEJveCgpLT5zZXRNYXhXaWR0aEFuZExh
eW91dChtYXgod2lkZ2V0UmVjdC53aWR0aCgpIC0ga0JvcmRlclNpemUgKiAyLCAwKSk7Ci0gICAg
ICAgICAgICB9IGVsc2UgaWYgKHdpZGdldFJlY3QubWF4WCgpID4gc2NyZWVuLm1heFgoKSkgewot
ICAgICAgICAgICAgICAgIHdpZGdldFJlY3Quc2V0V2lkdGgoc2NyZWVuLm1heFgoKSAtIHdpZGdl
dFJlY3QueCgpKTsKLSAgICAgICAgICAgICAgICBsaXN0Qm94KCktPnNldE1heFdpZHRoQW5kTGF5
b3V0KG1heCh3aWRnZXRSZWN0LndpZHRoKCkgLSBrQm9yZGVyU2l6ZSAqIDIsIDApKTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENhbGN1bGF0ZSBZIGF4aXMgc2l6ZS4K
LSAgICAgICAgaWYgKHdpZGdldFJlY3QubWF4WSgpID4gc3RhdGljX2Nhc3Q8aW50PihzY3JlZW4u
bWF4WSgpKSkgewotICAgICAgICAgICAgaWYgKHdpZGdldFJlY3QueSgpIC0gd2lkZ2V0UmVjdC5o
ZWlnaHQoKSAtIHRhcmdldENvbnRyb2xIZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8g
VGhlcmUgaXMgZW5vdWdoIHJvb20gdG8gb3BlbiB1cHdhcmRzLgotICAgICAgICAgICAgICAgIHdp
ZGdldFJlY3QubW92ZSgwLCAtKHdpZGdldFJlY3QuaGVpZ2h0KCkgKyB0YXJnZXRDb250cm9sSGVp
Z2h0KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSB3
aGV0aGVyIHVwd2FyZHMgb3IgZG93bndhcmRzIGhhcyBtb3JlIHJvb20gYW5kIHNldCB0aGUKLSAg
ICAgICAgICAgICAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBpdGVtcy4KLSAgICAgICAgICAgICAg
ICBpbnQgc3BhY2VBYm92ZSA9IHdpZGdldFJlY3QueSgpIC0gdGFyZ2V0Q29udHJvbEhlaWdodDsK
LSAgICAgICAgICAgICAgICBpbnQgc3BhY2VCZWxvdyA9IHNjcmVlbi5tYXhZKCkgLSB3aWRnZXRS
ZWN0LnkoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3BhY2VBYm92ZSA+IHNwYWNlQmVsb3cpCi0g
ICAgICAgICAgICAgICAgICAgIG1fbGlzdEJveC0+c2V0TWF4SGVpZ2h0KHNwYWNlQWJvdmUpOwot
ICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbV9saXN0Qm94LT5zZXRN
YXhIZWlnaHQoc3BhY2VCZWxvdyk7Ci0gICAgICAgICAgICAgICAgbGF5b3V0QW5kR2V0UlRMT2Zm
c2V0KCk7Ci0gICAgICAgICAgICAgICAgLy8gT3VyIGhlaWdodCBoYXMgY2hhbmdlZCwgc28gcmVj
b21wdXRlIG9ubHkgWSBheGlzIG9mIHdpZGdldFJlY3QuCi0gICAgICAgICAgICAgICAgLy8gV2Ug
ZG9uJ3QgaGF2ZSB0byByZWNvbXB1dGUgWCBheGlzLCBzbyB3ZSBvbmx5IHJlcGxhY2UgWSBheGlz
Ci0gICAgICAgICAgICAgICAgLy8gaW4gd2lkZ2V0UmVjdC4KLSAgICAgICAgICAgICAgICBJbnRS
ZWN0IGZyYW1lSW5TY3JlZW4gPSBjaHJvbWVDbGllbnQtPndpbmRvd1RvU2NyZWVuKGZyYW1lUmVj
dCgpKTsKLSAgICAgICAgICAgICAgICB3aWRnZXRSZWN0LnNldFkoZnJhbWVJblNjcmVlbi55KCkp
OwotICAgICAgICAgICAgICAgIHdpZGdldFJlY3Quc2V0SGVpZ2h0KGZyYW1lSW5TY3JlZW4uaGVp
Z2h0KCkpOwotICAgICAgICAgICAgICAgIC8vIEFuZCBtb3ZlIHVwd2FyZHMgaWYgbmVjZXNzYXJ5
LgotICAgICAgICAgICAgICAgIGlmIChzcGFjZUFib3ZlID4gc3BhY2VCZWxvdykKLSAgICAgICAg
ICAgICAgICAgICAgd2lkZ2V0UmVjdC5tb3ZlKDAsIC0od2lkZ2V0UmVjdC5oZWlnaHQoKSArIHRh
cmdldENvbnRyb2xIZWlnaHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAg
ICByZXR1cm4gd2lkZ2V0UmVjdDsKLX0KLQotdm9pZCBQb3B1cENvbnRhaW5lcjo6c2hvd1BvcHVw
KEZyYW1lVmlldyogdmlldykKLXsKLSAgICBtX2ZyYW1lVmlldyA9IHZpZXc7Ci0gICAgbGlzdEJv
eCgpLT5tX2ZvY3VzZWROb2RlID0gbV9mcmFtZVZpZXctPmZyYW1lKCktPmRvY3VtZW50KCktPmZv
Y3VzZWROb2RlKCk7Ci0KLSAgICBDaHJvbWVDbGllbnRDaHJvbWl1bSogY2hyb21lQ2xpZW50ID0g
Y2hyb21lQ2xpZW50Q2hyb21pdW0oKTsKLSAgICBpZiAoY2hyb21lQ2xpZW50KSB7Ci0gICAgICAg
IEludFJlY3QgcG9wdXBSZWN0ID0gZnJhbWVSZWN0KCk7Ci0gICAgICAgIGNocm9tZUNsaWVudC0+
cG9wdXBPcGVuZWQodGhpcywgbGF5b3V0QW5kQ2FsY3VsYXRlV2lkZ2V0UmVjdChwb3B1cFJlY3Qu
aGVpZ2h0KCksIHBvcHVwUmVjdC5sb2NhdGlvbigpKSwgZmFsc2UpOwotICAgICAgICBtX3BvcHVw
T3BlbiA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFtX2xpc3RCb3gtPnBhcmVudCgpKQotICAg
ICAgICBhZGRDaGlsZChtX2xpc3RCb3guZ2V0KCkpOwotCi0gICAgLy8gRW5hYmxlIHNjcm9sbGJh
cnMgYWZ0ZXIgdGhlIGxpc3Rib3ggaXMgaW5zZXJ0ZWQgaW50byB0aGUgaGllcmFyY2h5LAotICAg
IC8vIHNvIGl0IGhhcyBhIHByb3BlciBXaWRnZXRDbGllbnQuCi0gICAgbV9saXN0Qm94LT5zZXRW
ZXJ0aWNhbFNjcm9sbGJhck1vZGUoU2Nyb2xsYmFyQXV0byk7Ci0KLSAgICBtX2xpc3RCb3gtPnNj
cm9sbFRvUmV2ZWFsU2VsZWN0aW9uKCk7Ci0KLSAgICBpbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQg
UG9wdXBDb250YWluZXI6OmhpZGVQb3B1cCgpCi17Ci0gICAgbGlzdEJveCgpLT5oaWRlUG9wdXAo
KTsKLX0KLQotdm9pZCBQb3B1cENvbnRhaW5lcjo6bm90aWZ5UG9wdXBIaWRkZW4oKQotewotICAg
IGlmICghbV9wb3B1cE9wZW4pCi0gICAgICAgIHJldHVybjsKLSAgICBtX3BvcHVwT3BlbiA9IGZh
bHNlOwotICAgIGNocm9tZUNsaWVudENocm9taXVtKCktPnBvcHVwQ2xvc2VkKHRoaXMpOwotfQot
Ci1pbnQgUG9wdXBDb250YWluZXI6OmxheW91dEFuZEdldFJUTE9mZnNldCgpCi17Ci0gICAgbV9s
aXN0Qm94LT5sYXlvdXQoKTsKLQotICAgIC8vIFBsYWNlIHRoZSBsaXN0Ym94IHdpdGhpbiBvdXIg
Ym9yZGVyLgotICAgIG1fbGlzdEJveC0+bW92ZShrQm9yZGVyU2l6ZSwga0JvcmRlclNpemUpOwot
Ci0gICAgLy8gU2l6ZSBvdXJzZWx2ZXMgdG8gY29udGFpbiBsaXN0Ym94ICsgYm9yZGVyLgotICAg
IGludCBsaXN0Qm94V2lkdGggPSBtX2xpc3RCb3gtPndpZHRoKCkgKyBrQm9yZGVyU2l6ZSAqIDI7
Ci0gICAgcmVzaXplKGxpc3RCb3hXaWR0aCwgbV9saXN0Qm94LT5oZWlnaHQoKSArIGtCb3JkZXJT
aXplICogMik7Ci0gICAgaW52YWxpZGF0ZSgpOwotCi0gICAgLy8gQ29tcHV0ZSB0aGUgc3RhcnRp
bmcgeC1heGlzIGZvciBhIG5vcm1hbCBSVEwgb3IgcmlnaHQtYWxpZ25lZCBMVFIgZHJvcGRvd24u
IEZvciB0aG9zZSwKLSAgICAvLyB0aGUgcmlnaHQgZWRnZSBvZiBkcm9wZG93biBib3ggc2hvdWxk
IGJlIGFsaWduZWQgd2l0aCB0aGUgcmlnaHQgZWRnZSBvZiA8c2VsZWN0Pi88aW5wdXQ+IGVsZW1l
bnQgYm94LAotICAgIC8vIGFuZCB0aGUgZHJvcGRvd24gYm94IHNob3VsZCBiZSBleHBhbmRlZCB0
byB0aGUgbGVmdCBpZiBtb3JlIHNwYWNlIGlzIG5lZWRlZC4KLSAgICAvLyBtX29yaWdpbmFsRnJh
bWVSZWN0LndpZHRoKCkgaXMgdGhlIHdpZHRoIG9mIHRoZSB0YXJnZXQgPHNlbGVjdD4vPGlucHV0
PiBlbGVtZW50LgotICAgIHJldHVybiBtX29yaWdpbmFsRnJhbWVSZWN0LndpZHRoKCkgLSBsaXN0
Qm94V2lkdGg7Ci19Ci0KLWJvb2wgUG9wdXBDb250YWluZXI6OmhhbmRsZU1vdXNlRG93bkV2ZW50
KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgZXZlbnQpCi17Ci0gICAgVXNlckdlc3R1cmVJbmRp
Y2F0b3IgZ2VzdHVyZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2luZ1VzZXJHZXN0dXJlKTsK
LSAgICByZXR1cm4gbV9saXN0Qm94LT5oYW5kbGVNb3VzZURvd25FdmVudCgKLSAgICAgICAgY29u
c3RydWN0UmVsYXRpdmVNb3VzZUV2ZW50KGV2ZW50LCB0aGlzLCBtX2xpc3RCb3guZ2V0KCkpKTsK
LX0KLQotYm9vbCBQb3B1cENvbnRhaW5lcjo6aGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxh
dGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKLXsKLSAgICBVc2VyR2VzdHVyZUluZGljYXRvciBnZXN0
dXJlSW5kaWNhdG9yKERlZmluaXRlbHlQcm9jZXNzaW5nVXNlckdlc3R1cmUpOwotICAgIHJldHVy
biBtX2xpc3RCb3gtPmhhbmRsZU1vdXNlTW92ZUV2ZW50KAotICAgICAgICBjb25zdHJ1Y3RSZWxh
dGl2ZU1vdXNlRXZlbnQoZXZlbnQsIHRoaXMsIG1fbGlzdEJveC5nZXQoKSkpOwotfQotCi1ib29s
IFBvcHVwQ29udGFpbmVyOjpoYW5kbGVNb3VzZVJlbGVhc2VFdmVudChjb25zdCBQbGF0Zm9ybU1v
dXNlRXZlbnQmIGV2ZW50KQotewotICAgIFJlZlB0cjxQb3B1cENvbnRhaW5lcj4gcHJvdGVjdCh0
aGlzKTsKLSAgICBVc2VyR2VzdHVyZUluZGljYXRvciBnZXN0dXJlSW5kaWNhdG9yKERlZmluaXRl
bHlQcm9jZXNzaW5nVXNlckdlc3R1cmUpOwotICAgIHJldHVybiBtX2xpc3RCb3gtPmhhbmRsZU1v
dXNlUmVsZWFzZUV2ZW50KAotICAgICAgICBjb25zdHJ1Y3RSZWxhdGl2ZU1vdXNlRXZlbnQoZXZl
bnQsIHRoaXMsIG1fbGlzdEJveC5nZXQoKSkpOwotfQotCi1ib29sIFBvcHVwQ29udGFpbmVyOjpo
YW5kbGVXaGVlbEV2ZW50KGNvbnN0IFBsYXRmb3JtV2hlZWxFdmVudCYgZXZlbnQpCi17Ci0gICAg
VXNlckdlc3R1cmVJbmRpY2F0b3IgZ2VzdHVyZUluZGljYXRvcihEZWZpbml0ZWx5UHJvY2Vzc2lu
Z1VzZXJHZXN0dXJlKTsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5oYW5kbGVXaGVlbEV2ZW50KAot
ICAgICAgICBjb25zdHJ1Y3RSZWxhdGl2ZVdoZWVsRXZlbnQoZXZlbnQsIHRoaXMsIG1fbGlzdEJv
eC5nZXQoKSkpOwotfQotCi0jaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLWJvb2wgUG9wdXBDb250
YWluZXI6OmhhbmRsZVRvdWNoRXZlbnQoY29uc3QgUGxhdGZvcm1Ub3VjaEV2ZW50JikKLXsKLSAg
ICByZXR1cm4gZmFsc2U7Ci19Ci0jZW5kaWYKLQotI2lmIEVOQUJMRShHRVNUVVJFX1JFQ09HTkla
RVIpCi0vLyBGSVhNRTogUmVmYWN0b3IgdGhpcyBjb2RlIHRvIHNoYXJlIGZ1bmN0aW9uYWxpdHkg
d2l0aCBFdmVudEhhbmRsZXI6OmhhbmRsZUdlc3R1cmVFdmVudC4KLWJvb2wgUG9wdXBDb250YWlu
ZXI6OmhhbmRsZUdlc3R1cmVFdmVudChjb25zdCBQbGF0Zm9ybUdlc3R1cmVFdmVudCYgZ2VzdHVy
ZUV2ZW50KQotewotICAgIHN3aXRjaCAoZ2VzdHVyZUV2ZW50LnR5cGUoKSkgewotICAgIGNhc2Ug
UGxhdGZvcm1HZXN0dXJlRXZlbnQ6OlRhcFR5cGU6IHsKLSAgICAgICAgUGxhdGZvcm1Nb3VzZUV2
ZW50IGZha2VNb3VzZU1vdmUoZ2VzdHVyZUV2ZW50LnBvc2l0aW9uKCksIGdlc3R1cmVFdmVudC5n
bG9iYWxQb3NpdGlvbigpLCBOb0J1dHRvbiwgTW91c2VFdmVudE1vdmVkLCAvKiBjbGlja0NvdW50
ICovIDEsIGdlc3R1cmVFdmVudC5zaGlmdEtleSgpLCBnZXN0dXJlRXZlbnQuY3RybEtleSgpLCBn
ZXN0dXJlRXZlbnQuYWx0S2V5KCksIGdlc3R1cmVFdmVudC5tZXRhS2V5KCksIGdlc3R1cmVFdmVu
dC50aW1lc3RhbXAoKSk7Ci0gICAgICAgIFBsYXRmb3JtTW91c2VFdmVudCBmYWtlTW91c2VEb3du
KGdlc3R1cmVFdmVudC5wb3NpdGlvbigpLCBnZXN0dXJlRXZlbnQuZ2xvYmFsUG9zaXRpb24oKSwg
TGVmdEJ1dHRvbiwgTW91c2VFdmVudFByZXNzZWQsIC8qIGNsaWNrQ291bnQgKi8gMSwgZ2VzdHVy
ZUV2ZW50LnNoaWZ0S2V5KCksIGdlc3R1cmVFdmVudC5jdHJsS2V5KCksIGdlc3R1cmVFdmVudC5h
bHRLZXkoKSwgZ2VzdHVyZUV2ZW50Lm1ldGFLZXkoKSwgZ2VzdHVyZUV2ZW50LnRpbWVzdGFtcCgp
KTsKLSAgICAgICAgUGxhdGZvcm1Nb3VzZUV2ZW50IGZha2VNb3VzZVVwKGdlc3R1cmVFdmVudC5w
b3NpdGlvbigpLCBnZXN0dXJlRXZlbnQuZ2xvYmFsUG9zaXRpb24oKSwgTGVmdEJ1dHRvbiwgTW91
c2VFdmVudFJlbGVhc2VkLCAvKiBjbGlja0NvdW50ICovIDEsIGdlc3R1cmVFdmVudC5zaGlmdEtl
eSgpLCBnZXN0dXJlRXZlbnQuY3RybEtleSgpLCBnZXN0dXJlRXZlbnQuYWx0S2V5KCksIGdlc3R1
cmVFdmVudC5tZXRhS2V5KCksIGdlc3R1cmVFdmVudC50aW1lc3RhbXAoKSk7Ci0gICAgICAgIC8v
IGhhbmRsZU1vdXNlTW92ZUV2ZW50KGZha2VNb3VzZU1vdmUpOwotICAgICAgICBoYW5kbGVNb3Vz
ZURvd25FdmVudChmYWtlTW91c2VEb3duKTsKLSAgICAgICAgaGFuZGxlTW91c2VSZWxlYXNlRXZl
bnQoZmFrZU1vdXNlVXApOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBQ
bGF0Zm9ybUdlc3R1cmVFdmVudDo6U2Nyb2xsVXBkYXRlVHlwZTogewotICAgICAgICBQbGF0Zm9y
bVdoZWVsRXZlbnQgc3ludGhldGljV2hlZWxFdmVudChnZXN0dXJlRXZlbnQucG9zaXRpb24oKSwg
Z2VzdHVyZUV2ZW50Lmdsb2JhbFBvc2l0aW9uKCksIGdlc3R1cmVFdmVudC5kZWx0YVgoKSwgZ2Vz
dHVyZUV2ZW50LmRlbHRhWSgpLCBnZXN0dXJlRXZlbnQuZGVsdGFYKCkgLyAxMjAuMGYsIGdlc3R1
cmVFdmVudC5kZWx0YVkoKSAvIDEyMC4wZiwgU2Nyb2xsQnlQaXhlbFdoZWVsRXZlbnQsIC8qIGlz
QWNjZXB0ZWQgKi8gZmFsc2UsIGdlc3R1cmVFdmVudC5zaGlmdEtleSgpLCBnZXN0dXJlRXZlbnQu
Y3RybEtleSgpLCBnZXN0dXJlRXZlbnQuYWx0S2V5KCksIGdlc3R1cmVFdmVudC5tZXRhS2V5KCkp
OwotICAgICAgICBoYW5kbGVXaGVlbEV2ZW50KHN5bnRoZXRpY1doZWVsRXZlbnQpOwotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBQbGF0Zm9ybUdlc3R1cmVFdmVudDo6U2Ny
b2xsQmVnaW5UeXBlOgotICAgIGNhc2UgUGxhdGZvcm1HZXN0dXJlRXZlbnQ6OlNjcm9sbEVuZFR5
cGU6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0jZW5kaWYK
LQotYm9vbCBQb3B1cENvbnRhaW5lcjo6aGFuZGxlS2V5RXZlbnQoY29uc3QgUGxhdGZvcm1LZXli
b2FyZEV2ZW50JiBldmVudCkKLXsKLSAgICBVc2VyR2VzdHVyZUluZGljYXRvciBnZXN0dXJlSW5k
aWNhdG9yKERlZmluaXRlbHlQcm9jZXNzaW5nVXNlckdlc3R1cmUpOwotICAgIHJldHVybiBtX2xp
c3RCb3gtPmhhbmRsZUtleUV2ZW50KGV2ZW50KTsKLX0KLQotdm9pZCBQb3B1cENvbnRhaW5lcjo6
aGlkZSgpCi17Ci0gICAgbV9saXN0Qm94LT5hYmFuZG9uKCk7Ci19Ci0KLXZvaWQgUG9wdXBDb250
YWluZXI6OnBhaW50KEdyYXBoaWNzQ29udGV4dCogZ2MsIGNvbnN0IEludFJlY3QmIHJlY3QpCi17
Ci0gICAgLy8gYWRqdXN0IGNvb3JkcyBmb3Igc2Nyb2xsZWQgZnJhbWUKLSAgICBJbnRSZWN0IHIg
PSBpbnRlcnNlY3Rpb24ocmVjdCwgZnJhbWVSZWN0KCkpOwotICAgIGludCB0eCA9IHgoKTsKLSAg
ICBpbnQgdHkgPSB5KCk7Ci0KLSAgICByLm1vdmUoLXR4LCAtdHkpOwotCi0gICAgZ2MtPnRyYW5z
bGF0ZShzdGF0aWNfY2FzdDxmbG9hdD4odHgpLCBzdGF0aWNfY2FzdDxmbG9hdD4odHkpKTsKLSAg
ICBtX2xpc3RCb3gtPnBhaW50KGdjLCByKTsKLSAgICBnYy0+dHJhbnNsYXRlKC1zdGF0aWNfY2Fz
dDxmbG9hdD4odHgpLCAtc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR5KSk7Ci0KLSAgICBwYWludEJvcmRl
cihnYywgcmVjdCk7Ci19Ci0KLXZvaWQgUG9wdXBDb250YWluZXI6OnBhaW50Qm9yZGVyKEdyYXBo
aWNzQ29udGV4dCogZ2MsIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgLy8gRklYTUU6IFdo
ZXJlIGRvIHdlIGdldCB0aGUgYm9yZGVyIGNvbG9yIGZyb20/Ci0gICAgQ29sb3IgYm9yZGVyQ29s
b3IoMTI3LCAxNTcsIDE4NSk7Ci0KLSAgICBnYy0+c2V0U3Ryb2tlU3R5bGUoTm9TdHJva2UpOwot
ICAgIGdjLT5zZXRGaWxsQ29sb3IoYm9yZGVyQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwot
Ci0gICAgaW50IHR4ID0geCgpOwotICAgIGludCB0eSA9IHkoKTsKLQotICAgIC8vIHRvcCwgbGVm
dCwgYm90dG9tLCByaWdodAotICAgIGdjLT5kcmF3UmVjdChJbnRSZWN0KHR4LCB0eSwgd2lkdGgo
KSwga0JvcmRlclNpemUpKTsKLSAgICBnYy0+ZHJhd1JlY3QoSW50UmVjdCh0eCwgdHksIGtCb3Jk
ZXJTaXplLCBoZWlnaHQoKSkpOwotICAgIGdjLT5kcmF3UmVjdChJbnRSZWN0KHR4LCB0eSArIGhl
aWdodCgpIC0ga0JvcmRlclNpemUsIHdpZHRoKCksIGtCb3JkZXJTaXplKSk7Ci0gICAgZ2MtPmRy
YXdSZWN0KEludFJlY3QodHggKyB3aWR0aCgpIC0ga0JvcmRlclNpemUsIHR5LCBrQm9yZGVyU2l6
ZSwgaGVpZ2h0KCkpKTsKLX0KLQotYm9vbCBQb3B1cENvbnRhaW5lcjo6aXNJbnRlcmVzdGVkSW5F
dmVudEZvcktleShpbnQga2V5Q29kZSkKLXsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5pc0ludGVy
ZXN0ZWRJbkV2ZW50Rm9yS2V5KGtleUNvZGUpOwotfQotCi1DaHJvbWVDbGllbnRDaHJvbWl1bSog
UG9wdXBDb250YWluZXI6OmNocm9tZUNsaWVudENocm9taXVtKCkKLXsKLSAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8Q2hyb21lQ2xpZW50Q2hyb21pdW0qPihtX2ZyYW1lVmlldy0+ZnJhbWUoKS0+cGFn
ZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCkpOwotfQotCi12b2lkIFBvcHVwQ29udGFpbmVyOjpzaG93
SW5SZWN0KGNvbnN0IEludFJlY3QmIHIsIEZyYW1lVmlldyogdiwgaW50IGluZGV4KQotewotICAg
IC8vIFRoZSByZWN0IGlzIHRoZSBzaXplIG9mIHRoZSBzZWxlY3QgYm94LiBJdCdzIHVzdWFsbHkg
bGFyZ2VyIHRoYW4gd2UgbmVlZC4KLSAgICAvLyBzdWJ0cmFjdCBib3JkZXIgc2l6ZSBzbyB0aGF0
IHVzdWFsbHkgdGhlIGNvbnRhaW5lciB3aWxsIGJlIGRpc3BsYXllZAotICAgIC8vIGV4YWN0bHkg
dGhlIHNhbWUgd2lkdGggYXMgdGhlIHNlbGVjdCBib3guCi0gICAgbGlzdEJveCgpLT5zZXRCYXNl
V2lkdGgobWF4KHIud2lkdGgoKSAtIGtCb3JkZXJTaXplICogMiwgMCkpOwotCi0gICAgbGlzdEJv
eCgpLT51cGRhdGVGcm9tRWxlbWVudCgpOwotCi0gICAgLy8gV2Ugc2V0IHRoZSBzZWxlY3RlZCBp
dGVtIGluIHVwZGF0ZUZyb21FbGVtZW50KCksIGFuZCBkaXNyZWdhcmQgdGhlCi0gICAgLy8gaW5k
ZXggcGFzc2VkIGludG8gdGhpcyBmdW5jdGlvbiAoc2FtZSBhcyBXZWJraXQncyBQb3B1cE1lbnVX
aW4uY3BwKQotICAgIC8vIEZJWE1FOiBtYWtlIHN1cmUgdGhpcyBpcyBjb3JyZWN0LCBhbmQgYWRk
IGFuIGFzc2VydGlvbi4KLSAgICAvLyBBU1NFUlQocG9wdXBXaW5kb3cocG9wdXApLT5saXN0Qm94
KCktPnNlbGVjdGVkSW5kZXgoKSA9PSBpbmRleCk7Ci0KLSAgICAvLyBDb252ZXJ0IHBvaW50IHRv
IG1haW4gd2luZG93IGNvb3Jkcy4KLSAgICBJbnRQb2ludCBsb2NhdGlvbiA9IHYtPmNvbnRlbnRz
VG9XaW5kb3coci5sb2NhdGlvbigpKTsKLQotICAgIC8vIE1vdmUgaXQgYmVsb3cgdGhlIHNlbGVj
dCB3aWRnZXQuCi0gICAgbG9jYXRpb24ubW92ZSgwLCByLmhlaWdodCgpKTsKLQotICAgIG1fb3Jp
Z2luYWxGcmFtZVJlY3QgPSBJbnRSZWN0KGxvY2F0aW9uLCByLnNpemUoKSk7Ci0gICAgc2V0RnJh
bWVSZWN0KG1fb3JpZ2luYWxGcmFtZVJlY3QpOwotICAgIHNob3dQb3B1cCh2KTsKLX0KLQotdm9p
ZCBQb3B1cENvbnRhaW5lcjo6cmVmcmVzaChjb25zdCBJbnRSZWN0JiB0YXJnZXRDb250cm9sUmVj
dCkKLXsKLSAgICBJbnRQb2ludCBsb2NhdGlvbiA9IG1fZnJhbWVWaWV3LT5jb250ZW50c1RvV2lu
ZG93KHRhcmdldENvbnRyb2xSZWN0LmxvY2F0aW9uKCkpOwotICAgIC8vIE1vdmUgaXQgYmVsb3cg
dGhlIHNlbGVjdCB3aWRnZXQuCi0gICAgbG9jYXRpb24ubW92ZSgwLCB0YXJnZXRDb250cm9sUmVj
dC5oZWlnaHQoKSk7Ci0KLSAgICBsaXN0Qm94KCktPnNldEJhc2VXaWR0aChtYXgobV9vcmlnaW5h
bEZyYW1lUmVjdC53aWR0aCgpIC0ga0JvcmRlclNpemUgKiAyLCAwKSk7Ci0gICAgc2V0Qm91bmRz
U2l6ZShtX29yaWdpbmFsRnJhbWVSZWN0LnNpemUoKSk7Ci0KLSAgICBsaXN0Qm94KCktPnVwZGF0
ZUZyb21FbGVtZW50KCk7Ci0gICAgLy8gU3RvcmUgdGhlIG9yaWdpbmFsIHNpemUgdG8gY2hlY2sg
aWYgd2UgbmVlZCB0byByZXF1ZXN0IHRoZSBsb2NhdGlvbi4KLSAgICBJbnRTaXplIG9yaWdpbmFs
U2l6ZSA9IHNpemUoKTsKLSAgICBJbnRSZWN0IHdpZGdldFJlY3QgPSBsYXlvdXRBbmRDYWxjdWxh
dGVXaWRnZXRSZWN0KHRhcmdldENvbnRyb2xSZWN0LmhlaWdodCgpLCBsb2NhdGlvbik7Ci0gICAg
aWYgKG9yaWdpbmFsU2l6ZSAhPSB3aWRnZXRSZWN0LnNpemUoKSkgewotICAgICAgICBDaHJvbWVD
bGllbnRDaHJvbWl1bSogY2hyb21lQ2xpZW50ID0gY2hyb21lQ2xpZW50Q2hyb21pdW0oKTsKLSAg
ICAgICAgaWYgKGNocm9tZUNsaWVudCkgewotICAgICAgICAgICAgSW50UG9pbnQgd2lkZ2V0TG9j
YXRpb24gPSBjaHJvbWVDbGllbnQtPnNjcmVlblRvV2luZG93KHdpZGdldFJlY3QubG9jYXRpb24o
KSk7Ci0gICAgICAgICAgICB3aWRnZXRSZWN0LnNldExvY2F0aW9uKHdpZGdldExvY2F0aW9uKTsK
LSAgICAgICAgICAgIHNldEZyYW1lUmVjdCh3aWRnZXRSZWN0KTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIGludmFsaWRhdGUoKTsKLX0KLQotaW5saW5lIGJvb2wgUG9wdXBDb250YWluZXI6Omlz
UlRMKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5tX3BvcHVwQ2xpZW50LT5tZW51
U3R5bGUoKS50ZXh0RGlyZWN0aW9uKCkgPT0gUlRMOwotfQotCi1pbnQgUG9wdXBDb250YWluZXI6
OnNlbGVjdGVkSW5kZXgoKSBjb25zdAotewotICAgIHJldHVybiBtX2xpc3RCb3gtPnNlbGVjdGVk
SW5kZXgoKTsKLX0KLQotaW50IFBvcHVwQ29udGFpbmVyOjptZW51SXRlbUhlaWdodCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fbGlzdEJveC0+Z2V0Um93SGVpZ2h0KDApOwotfQotCi1pbnQgUG9w
dXBDb250YWluZXI6Om1lbnVJdGVtRm9udFNpemUoKSBjb25zdAotewotICAgIHJldHVybiBtX2xp
c3RCb3gtPmdldFJvd0ZvbnQoMCkuc2l6ZSgpOwotfQotCi1Qb3B1cE1lbnVTdHlsZSBQb3B1cENv
bnRhaW5lcjo6bWVudVN0eWxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9saXN0Qm94LT5tX3Bv
cHVwQ2xpZW50LT5tZW51U3R5bGUoKTsKLX0KLQotY29uc3QgV1RGOjpWZWN0b3I8UG9wdXBJdGVt
Kj4mIFBvcHVwQ29udGFpbmVyOjogcG9wdXBEYXRhKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9s
aXN0Qm94LT5pdGVtcygpOwotfQotCi1TdHJpbmcgUG9wdXBDb250YWluZXI6OmdldFNlbGVjdGVk
SXRlbVRvb2xUaXAoKQotewotICAgIC8vIFdlIGNhbm5vdCB1c2UgbV9wb3B1cENsaWVudC0+c2Vs
ZWN0ZWRJbmRleCgpIHRvIGNob29zZSB0b29sdGlwIG1lc3NhZ2UsCi0gICAgLy8gYmVjYXVzZSB0
aGUgc2VsZWN0ZWRJbmRleCgpIG1pZ2h0IHJldHVybiBmaW5hbCBzZWxlY3RlZCBpbmRleCwgbm90
IGhvdmVyaW5nIHNlbGVjdGlvbi4KLSAgICByZXR1cm4gbGlzdEJveCgpLT5tX3BvcHVwQ2xpZW50
LT5pdGVtVG9vbFRpcChsaXN0Qm94KCktPm1fc2VsZWN0ZWRJbmRleCk7Ci19Ci0KLS8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8KLS8vIFBvcHVwTGlzdEJveCBpbXBsZW1lbnRhdGlvbgotCi1ib29sIFBv
cHVwTGlzdEJveDo6aGFuZGxlTW91c2VEb3duRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50
JiBldmVudCkKLXsKLSAgICBTY3JvbGxiYXIqIHNjcm9sbGJhciA9IHNjcm9sbGJhckF0UG9pbnQo
ZXZlbnQucG9zKCkpOwotICAgIGlmIChzY3JvbGxiYXIpIHsKLSAgICAgICAgbV9jYXB0dXJpbmdT
Y3JvbGxiYXIgPSBzY3JvbGxiYXI7Ci0gICAgICAgIG1fY2FwdHVyaW5nU2Nyb2xsYmFyLT5tb3Vz
ZURvd24oZXZlbnQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIWlz
UG9pbnRJbkJvdW5kcyhldmVudC5wb3MoKSkpCi0gICAgICAgIGFiYW5kb24oKTsKLQotICAgIHJl
dHVybiB0cnVlOwotfQotCi1ib29sIFBvcHVwTGlzdEJveDo6aGFuZGxlTW91c2VNb3ZlRXZlbnQo
Y29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldmVudCkKLXsKLSAgICBpZiAobV9jYXB0dXJpbmdT
Y3JvbGxiYXIpIHsKLSAgICAgICAgbV9jYXB0dXJpbmdTY3JvbGxiYXItPm1vdXNlTW92ZWQoZXZl
bnQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBTY3JvbGxiYXIqIHNjcm9s
bGJhciA9IHNjcm9sbGJhckF0UG9pbnQoZXZlbnQucG9zKCkpOwotICAgIGlmIChtX2xhc3RTY3Jv
bGxiYXJVbmRlck1vdXNlICE9IHNjcm9sbGJhcikgewotICAgICAgICAvLyBTZW5kIG1vdXNlIGV4
aXRlZCB0byB0aGUgb2xkIHNjcm9sbGJhci4KLSAgICAgICAgaWYgKG1fbGFzdFNjcm9sbGJhclVu
ZGVyTW91c2UpCi0gICAgICAgICAgICBtX2xhc3RTY3JvbGxiYXJVbmRlck1vdXNlLT5tb3VzZUV4
aXRlZCgpOwotICAgICAgICBtX2xhc3RTY3JvbGxiYXJVbmRlck1vdXNlID0gc2Nyb2xsYmFyOwot
ICAgIH0KLQotICAgIGlmIChzY3JvbGxiYXIpIHsKLSAgICAgICAgc2Nyb2xsYmFyLT5tb3VzZU1v
dmVkKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFpc1Bv
aW50SW5Cb3VuZHMoZXZlbnQucG9zKCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBz
ZWxlY3RJbmRleChwb2ludFRvUm93SW5kZXgoZXZlbnQucG9zKCkpKTsKLSAgICByZXR1cm4gdHJ1
ZTsKLX0KLQotYm9vbCBQb3B1cExpc3RCb3g6OmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGNvbnN0
IFBsYXRmb3JtTW91c2VFdmVudCYgZXZlbnQpCi17Ci0gICAgaWYgKG1fY2FwdHVyaW5nU2Nyb2xs
YmFyKSB7Ci0gICAgICAgIG1fY2FwdHVyaW5nU2Nyb2xsYmFyLT5tb3VzZVVwKCk7Ci0gICAgICAg
IG1fY2FwdHVyaW5nU2Nyb2xsYmFyID0gMDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQot
Ci0gICAgaWYgKCFpc1BvaW50SW5Cb3VuZHMoZXZlbnQucG9zKCkpKQotICAgICAgICByZXR1cm4g
dHJ1ZTsKLQotICAgIC8vIE5lZWQgdG8gY2hlY2sgYmVmb3JlIGNhbGxpbmcgYWNjZXB0SW5kZXgo
KSwgYmVjYXVzZSBtX3BvcHVwQ2xpZW50IG1pZ2h0IGJlIHJlbW92ZWQgaW4gYWNjZXB0SW5kZXgo
KSBjYWxsaW5nIGJlY2F1c2Ugb2YgZXZlbnQgaGFuZGxlci4KLSAgICBib29sIGlzU2VsZWN0UG9w
dXAgPSBtX3BvcHVwQ2xpZW50LT5tZW51U3R5bGUoKS5tZW51VHlwZSgpID09IFBvcHVwTWVudVN0
eWxlOjpTZWxlY3RQb3B1cDsKLSAgICBpZiAoYWNjZXB0SW5kZXgocG9pbnRUb1Jvd0luZGV4KGV2
ZW50LnBvcygpKSkgJiYgbV9mb2N1c2VkTm9kZSAmJiBpc1NlbGVjdFBvcHVwKSB7Ci0gICAgICAg
IG1fZm9jdXNlZE5vZGUtPmRpc3BhdGNoTW91c2VFdmVudChldmVudCwgZXZlbnROYW1lcygpLm1v
dXNldXBFdmVudCk7Ci0gICAgICAgIG1fZm9jdXNlZE5vZGUtPmRpc3BhdGNoTW91c2VFdmVudChl
dmVudCwgZXZlbnROYW1lcygpLmNsaWNrRXZlbnQpOwotCi0gICAgICAgIC8vIENsZWFyIG1fZm9j
dXNlZE5vZGUgaGVyZSwgYmVjYXVzZSB3ZSBjYW5ub3QgY2xlYXIgaW4gaGlkZVBvcHVwKCkgd2hp
Y2ggaXMgY2FsbGVkIGJlZm9yZSBkaXNwYXRjaE1vdXNlRXZlbnQoKSBpcyBjYWxsZWQuCi0gICAg
ICAgIG1fZm9jdXNlZE5vZGUgPSAwOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1i
b29sIFBvcHVwTGlzdEJveDo6aGFuZGxlV2hlZWxFdmVudChjb25zdCBQbGF0Zm9ybVdoZWVsRXZl
bnQmIGV2ZW50KQotewotICAgIGlmICghaXNQb2ludEluQm91bmRzKGV2ZW50LnBvcygpKSkgewot
ICAgICAgICBhYmFuZG9uKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8v
IFBhc3MgaXQgb2ZmIHRvIHRoZSBzY3JvbGwgdmlldy4KLSAgICAvLyBTYWRseSwgV2ViQ29yZSBk
ZXZzIGRvbid0IHVuZGVyc3RhbmQgdGhlIHdob2xlICJjb25zdCIgdGhpbmcuCi0gICAgd2hlZWxF
dmVudChjb25zdF9jYXN0PFBsYXRmb3JtV2hlZWxFdmVudCY+KGV2ZW50KSk7Ci0gICAgcmV0dXJu
IHRydWU7Ci19Ci0KLS8vIFNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBoYW5kbGVLZXlFdmVu
dCgpLgotYm9vbCBQb3B1cExpc3RCb3g6OmlzSW50ZXJlc3RlZEluRXZlbnRGb3JLZXkoaW50IGtl
eUNvZGUpCi17Ci0gICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgY2FzZSBWS0VZX0VTQ0FQRToK
LSAgICBjYXNlIFZLRVlfUkVUVVJOOgotICAgIGNhc2UgVktFWV9VUDoKLSAgICBjYXNlIFZLRVlf
RE9XTjoKLSAgICBjYXNlIFZLRVlfUFJJT1I6Ci0gICAgY2FzZSBWS0VZX05FWFQ6Ci0gICAgY2Fz
ZSBWS0VZX0hPTUU6Ci0gICAgY2FzZSBWS0VZX0VORDoKLSAgICBjYXNlIFZLRVlfVEFCOgotICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotfQotCi0jaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLWJvb2wgUG9wdXBMaXN0Qm94Ojpo
YW5kbGVUb3VjaEV2ZW50KGNvbnN0IFBsYXRmb3JtVG91Y2hFdmVudCYpCi17Ci0gICAgcmV0dXJu
IGZhbHNlOwotfQotI2VuZGlmCi0KLSNpZiBFTkFCTEUoR0VTVFVSRV9SRUNPR05JWkVSKQotYm9v
bCBQb3B1cExpc3RCb3g6OmhhbmRsZUdlc3R1cmVFdmVudChjb25zdCBQbGF0Zm9ybUdlc3R1cmVF
dmVudCYpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi0KLXN0YXRpYyBib29sIGlz
Q2hhcmFjdGVyVHlwZUV2ZW50KGNvbnN0IFBsYXRmb3JtS2V5Ym9hcmRFdmVudCYgZXZlbnQpCi17
Ci0gICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZXZlbnQgaXMgYSBjaGFyYWN0ZXItdHlwZWQgZXZl
bnQgb3Igbm90LgotICAgIC8vIFdlIHVzZSBSYXdLZXlEb3duL0NoYXIvS2V5VXAgZXZlbnQgc2No
ZW1lIG9uIGFsbCBwbGF0Zm9ybXMsCi0gICAgLy8gc28gUGxhdGZvcm1LZXlib2FyZEV2ZW50OjpD
aGFyIChub3QgUmF3S2V5RG93bikgdHlwZSBldmVudAotICAgIC8vIGlzIGNvbnNpZGVyZWQgYXMg
Y2hhcmFjdGVyIHR5cGUgZXZlbnQuCi0gICAgcmV0dXJuIGV2ZW50LnR5cGUoKSA9PSBQbGF0Zm9y
bUtleWJvYXJkRXZlbnQ6OkNoYXI7Ci19Ci0KLWJvb2wgUG9wdXBMaXN0Qm94OjpoYW5kbGVLZXlF
dmVudChjb25zdCBQbGF0Zm9ybUtleWJvYXJkRXZlbnQmIGV2ZW50KQotewotICAgIGlmIChldmVu
dC50eXBlKCkgPT0gUGxhdGZvcm1LZXlib2FyZEV2ZW50OjpLZXlVcCkKLSAgICAgICAgcmV0dXJu
IHRydWU7Ci0KLSAgICBpZiAobnVtSXRlbXMoKSA9PSAwICYmIGV2ZW50LndpbmRvd3NWaXJ0dWFs
S2V5Q29kZSgpICE9IFZLRVlfRVNDQVBFKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHN3
aXRjaCAoZXZlbnQud2luZG93c1ZpcnR1YWxLZXlDb2RlKCkpIHsKLSAgICBjYXNlIFZLRVlfRVND
QVBFOgotICAgICAgICBhYmFuZG9uKCk7ICAvLyBtYXkgZGVsZXRlIHRoaXMKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgY2FzZSBWS0VZX1JFVFVSTjoKLSAgICAgICAgaWYgKG1fc2VsZWN0ZWRJ
bmRleCA9PSAtMSkgIHsKLSAgICAgICAgICAgIGhpZGVQb3B1cCgpOwotICAgICAgICAgICAgLy8g
RG9uJ3QgZWF0IHRoZSBlbnRlciBpZiBub3RoaW5nIGlzIHNlbGVjdGVkLgotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGFjY2VwdEluZGV4KG1fc2VsZWN0ZWRJ
bmRleCk7ICAvLyBtYXkgZGVsZXRlIHRoaXMKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2Fz
ZSBWS0VZX1VQOgotICAgIGNhc2UgVktFWV9ET1dOOgotICAgICAgICAvLyBXZSBoYXZlIHRvIGZv
cndhcmQgb25seSBzaGlmdCArIHVwIGNvbWJpbmF0aW9uIHRvIGZvY3VzZWQgbm9kZSB3aGVuIGF1
dG9maWxsIHBvcHVwLgotICAgICAgICAvLyBCZWNhdXNlIGFsbCBjaGFyYWN0ZXJzIGZyb20gdGhl
IGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIHRleHQgYXJlYSBzaG91bGQgc2VsZWN0ZWQgd2hl
biB5b3UgcHJlc3Mgc2hpZnQgKyB1cCBhcnJvdy4KLSAgICAgICAgLy8gc2hpZnQgKyBkb3duIHNo
b3VsZCBiZSB0aGUgc2ltaWxhciB3YXkgdG8gc2hpZnQgKyB1cC4KLSAgICAgICAgaWYgKGV2ZW50
Lm1vZGlmaWVycygpICYmIG1fcG9wdXBDbGllbnQtPm1lbnVTdHlsZSgpLm1lbnVUeXBlKCkgPT0g
UG9wdXBNZW51U3R5bGU6OkF1dG9maWxsUG9wdXApCi0gICAgICAgICAgICBtX2ZvY3VzZWROb2Rl
LT5kaXNwYXRjaEtleUV2ZW50KGV2ZW50KTsKLSAgICAgICAgZWxzZSBpZiAoZXZlbnQud2luZG93
c1ZpcnR1YWxLZXlDb2RlKCkgPT0gVktFWV9VUCkKLSAgICAgICAgICAgIHNlbGVjdFByZXZpb3Vz
Um93KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNlbGVjdE5leHRSb3coKTsKLSAgICAg
ICAgYnJlYWs7Ci0gICAgY2FzZSBWS0VZX1BSSU9SOgotICAgICAgICBhZGp1c3RTZWxlY3RlZElu
ZGV4KC1tX3Zpc2libGVSb3dzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWS0VZX05FWFQ6
Ci0gICAgICAgIGFkanVzdFNlbGVjdGVkSW5kZXgobV92aXNpYmxlUm93cyk7Ci0gICAgICAgIGJy
ZWFrOwotICAgIGNhc2UgVktFWV9IT01FOgotICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KC1t
X3NlbGVjdGVkSW5kZXgpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFZLRVlfRU5EOgotICAg
ICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KG1faXRlbXMuc2l6ZSgpKTsKLSAgICAgICAgYnJlYWs7
Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKCFldmVudC5jdHJsS2V5KCkgJiYgIWV2ZW50LmFs
dEtleSgpICYmICFldmVudC5tZXRhS2V5KCkKLSAgICAgICAgICAgICYmIGlzUHJpbnRhYmxlQ2hh
cihldmVudC53aW5kb3dzVmlydHVhbEtleUNvZGUoKSkKLSAgICAgICAgICAgICYmIGlzQ2hhcmFj
dGVyVHlwZUV2ZW50KGV2ZW50KSkKLSAgICAgICAgICAgIHR5cGVBaGVhZEZpbmQoZXZlbnQpOwot
ICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobV9vcmlnaW5hbEluZGV4ICE9IG1fc2Vs
ZWN0ZWRJbmRleCkgewotICAgICAgICAvLyBLZXlib2FyZCBldmVudHMgc2hvdWxkIHVwZGF0ZSB0
aGUgc2VsZWN0aW9uIGltbWVkaWF0ZWx5IChidXQgd2UgZG9uJ3QKLSAgICAgICAgLy8gd2FudCB0
byBmaXJlIHRoZSBvbmNoYW5nZSBldmVudCB1bnRpbCB0aGUgcG9wdXAgaXMgY2xvc2VkLCB0byBt
YXRjaAotICAgICAgICAvLyBJRSkuICBXZSBjaGFuZ2UgdGhlIG9yaWdpbmFsIGluZGV4IHNvIHdl
IHJldmVydCB0byB0aGF0IHdoZW4gdGhlCi0gICAgICAgIC8vIHBvcHVwIGlzIGNsb3NlZC4KLSAg
ICAgICAgaWYgKG1fc2V0dGluZ3MuYWNjZXB0T25BYmFuZG9uKQotICAgICAgICAgICAgbV9hY2Nl
cHRlZEluZGV4T25BYmFuZG9uID0gbV9zZWxlY3RlZEluZGV4OwotCi0gICAgICAgIHNldE9yaWdp
bmFsSW5kZXgobV9zZWxlY3RlZEluZGV4KTsKLSAgICAgICAgaWYgKG1fc2V0dGluZ3Muc2V0VGV4
dE9uSW5kZXhDaGFuZ2UpCi0gICAgICAgICAgICBtX3BvcHVwQ2xpZW50LT5zZXRUZXh0RnJvbUl0
ZW0obV9zZWxlY3RlZEluZGV4KTsKLSAgICB9Ci0gICAgaWYgKGV2ZW50LndpbmRvd3NWaXJ0dWFs
S2V5Q29kZSgpID09IFZLRVlfVEFCKSB7Ci0gICAgICAgIC8vIFRBQiBpcyBhIHNwZWNpYWwgY2Fz
ZSBhcyBpdCBzaG91bGQgc2VsZWN0IHRoZSBjdXJyZW50IGl0ZW0gaWYgYW55IGFuZAotICAgICAg
ICAvLyBhZHZhbmNlIGZvY3VzLgotICAgICAgICBpZiAobV9zZWxlY3RlZEluZGV4ID49IDApIHsK
LSAgICAgICAgICAgIGFjY2VwdEluZGV4KG1fc2VsZWN0ZWRJbmRleCk7IC8vIE1heSBkZWxldGUg
dXMuCi0gICAgICAgICAgICAvLyBSZXR1cm4gZmFsc2Ugc28gdGhlIFRBQiBrZXkgZXZlbnQgaXMg
cHJvcGFnYXRlZCB0byB0aGUgcGFnZS4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgfQotICAgICAgICAvLyBDYWxsIGFiYW5kb24oKSBzbyB3ZSBob25vciBtX2FjY2VwdGVkSW5k
ZXhPbkFiYW5kb24gaWYgc2V0LgotICAgICAgICBhYmFuZG9uKCk7Ci0gICAgICAgIC8vIFJldHVy
biBmYWxzZSBzbyB0aGUgVEFCIGtleSBldmVudCBpcyBwcm9wYWdhdGVkIHRvIHRoZSBwYWdlLgot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUhv
c3RXaW5kb3cqIFBvcHVwTGlzdEJveDo6aG9zdFdpbmRvdygpIGNvbnN0Ci17Ci0gICAgLy8gT3Vy
IHBhcmVudCBpcyB0aGUgcm9vdCBTY3JvbGxWaWV3LCBzbyBpdCBpcyB0aGUgb25lIHRoYXQgaGFz
IGEKLSAgICAvLyBIb3N0V2luZG93LiAgRnJhbWVWaWV3Ojpob3N0V2luZG93KCkgd29ya3Mgc2lt
aWxhcmx5LgotICAgIHJldHVybiBwYXJlbnQoKSA/IHBhcmVudCgpLT5ob3N0V2luZG93KCkgOiAw
OwotfQotCi0vLyBGcm9tIEhUTUxTZWxlY3RFbGVtZW50LmNwcAotc3RhdGljIFN0cmluZyBzdHJp
cExlYWRpbmdXaGl0ZVNwYWNlKGNvbnN0IFN0cmluZyYgc3RyaW5nKQotewotICAgIGludCBsZW5n
dGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxl
bmd0aDsgKytpKQotICAgICAgICBpZiAoc3RyaW5nW2ldICE9IG5vQnJlYWtTcGFjZQotICAgICAg
ICAgICAgJiYgKHN0cmluZ1tpXSA8PSAweDdGID8gIWlzc3BhY2Uoc3RyaW5nW2ldKSA6IChkaXJl
Y3Rpb24oc3RyaW5nW2ldKSAhPSBXaGl0ZVNwYWNlTmV1dHJhbCkpKQotICAgICAgICAgICAgYnJl
YWs7Ci0KLSAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhpLCBsZW5ndGggLSBpKTsKLX0KLQot
Ly8gRnJvbSBIVE1MU2VsZWN0RWxlbWVudC5jcHAsIHdpdGggbW9kaWZpY2F0aW9ucwotdm9pZCBQ
b3B1cExpc3RCb3g6OnR5cGVBaGVhZEZpbmQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2ZW50JiBl
dmVudCkKLXsKLSAgICBUaW1lU3RhbXAgbm93ID0gc3RhdGljX2Nhc3Q8VGltZVN0YW1wPihjdXJy
ZW50VGltZSgpICogMTAwMC4wZik7Ci0gICAgVGltZVN0YW1wIGRlbHRhID0gbm93IC0gbV9sYXN0
Q2hhclRpbWU7Ci0KLSAgICAvLyBSZXNldCB0aGUgdGltZSB3aGVuIHVzZXIgdHlwZXMgaW4gYSBj
aGFyYWN0ZXIuIFRoZSB0aW1lIGdhcCBiZXR3ZWVuCi0gICAgLy8gbGFzdCBjaGFyYWN0ZXIgYW5k
IHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIKLSAgICAv
LyB1c2VyIHR5cGVkIGluIGEgc3RyaW5nIG9yIGp1c3QgYSBjaGFyYWN0ZXIgYXMgdGhlIHNlYXJj
aCBwcmVmaXguCi0gICAgbV9sYXN0Q2hhclRpbWUgPSBub3c7Ci0KLSAgICBVQ2hhciBjID0gZXZl
bnQud2luZG93c1ZpcnR1YWxLZXlDb2RlKCk7Ci0KLSAgICBTdHJpbmcgcHJlZml4OwotICAgIGlu
dCBzZWFyY2hTdGFydE9mZnNldCA9IDE7Ci0gICAgaWYgKGRlbHRhID4ga1R5cGVBaGVhZFRpbWVv
dXRNcykgewotICAgICAgICBtX3R5cGVkU3RyaW5nID0gcHJlZml4ID0gU3RyaW5nKCZjLCAxKTsK
LSAgICAgICAgbV9yZXBlYXRpbmdDaGFyID0gYzsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3R5
cGVkU3RyaW5nLmFwcGVuZChjKTsKLQotICAgICAgICBpZiAoYyA9PSBtX3JlcGVhdGluZ0NoYXIp
Ci0gICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBsaWtlbHkgdHJ5aW5nIHRvIGN5Y2xlIHRocm91
Z2ggYWxsIHRoZSBpdGVtcyBzdGFydGluZyB3aXRoIHRoaXMgY2hhcmFjdGVyLCBzbyBqdXN0IHNl
YXJjaCBvbiB0aGUgY2hhcmFjdGVyCi0gICAgICAgICAgICBwcmVmaXggPSBTdHJpbmcoJmMsIDEp
OwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG1fcmVwZWF0aW5nQ2hhciA9IDA7Ci0gICAg
ICAgICAgICBwcmVmaXggPSBtX3R5cGVkU3RyaW5nOwotICAgICAgICAgICAgc2VhcmNoU3RhcnRP
ZmZzZXQgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ29tcHV0ZSBhIGNhc2UtZm9s
ZGVkIGNvcHkgb2YgdGhlIHByZWZpeCBzdHJpbmcgYmVmb3JlIGJlZ2lubmluZyB0aGUgc2VhcmNo
IGZvcgotICAgIC8vIGEgbWF0Y2hpbmcgZWxlbWVudC4gVGhpcyBjb2RlIHVzZXMgZm9sZENhc2Ug
dG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdAotICAgIC8vIFN0cmluZzo6c3RhcnRXaXRoIGRv
ZXMgbm90IGZvbGQgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuIFRoaXMgY29kZSBjYW4gYmUgY2hhbmdl
ZAotICAgIC8vIHRvIHVzZSBzdGFydFdpdGggb25jZSB0aGF0IGlzIGZpeGVkLgotICAgIFN0cmlu
ZyBwcmVmaXhXaXRoQ2FzZUZvbGRlZChwcmVmaXguZm9sZENhc2UoKSk7Ci0gICAgaW50IGl0ZW1D
b3VudCA9IG51bUl0ZW1zKCk7Ci0gICAgaW50IGluZGV4ID0gKG1heCgwLCBtX3NlbGVjdGVkSW5k
ZXgpICsgc2VhcmNoU3RhcnRPZmZzZXQpICUgaXRlbUNvdW50OwotICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgaXRlbUNvdW50OyBpKyssIGluZGV4ID0gKGluZGV4ICsgMSkgJSBpdGVtQ291bnQpIHsK
LSAgICAgICAgaWYgKCFpc1NlbGVjdGFibGVJdGVtKGluZGV4KSkKLSAgICAgICAgICAgIGNvbnRp
bnVlOwotCi0gICAgICAgIGlmIChzdHJpcExlYWRpbmdXaGl0ZVNwYWNlKG1faXRlbXNbaW5kZXhd
LT5sYWJlbCkuZm9sZENhc2UoKS5zdGFydHNXaXRoKHByZWZpeFdpdGhDYXNlRm9sZGVkKSkgewot
ICAgICAgICAgICAgc2VsZWN0SW5kZXgoaW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICB9Ci0gICAgfQotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6cGFpbnQoR3JhcGhpY3NDb250
ZXh0KiBnYywgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICAvLyBhZGp1c3QgY29vcmRzIGZv
ciBzY3JvbGxlZCBmcmFtZQotICAgIEludFJlY3QgciA9IGludGVyc2VjdGlvbihyZWN0LCBmcmFt
ZVJlY3QoKSk7Ci0gICAgaW50IHR4ID0geCgpIC0gc2Nyb2xsWCgpOwotICAgIGludCB0eSA9IHko
KSAtIHNjcm9sbFkoKTsKLQotICAgIHIubW92ZSgtdHgsIC10eSk7Ci0KLSAgICAvLyBzZXQgY2xp
cCByZWN0IHRvIG1hdGNoIHJldmlzZWQgZGFtYWdlIHJlY3QKLSAgICBnYy0+c2F2ZSgpOwotICAg
IGdjLT50cmFuc2xhdGUoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHR4KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+
KHR5KSk7Ci0gICAgZ2MtPmNsaXAocik7Ci0KLSAgICAvLyBGSVhNRTogQ2FuIHdlIG9wdGltaXpl
IHNjcm9sbGluZyB0byBub3QgcmVxdWlyZSByZXBhaW50aW5nIHRoZSBlbnRpcmUKLSAgICAvLyB3
aW5kb3c/ICBTaG91bGQgd2U/Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVtcygpOyAr
K2kpCi0gICAgICAgIHBhaW50Um93KGdjLCByLCBpKTsKLQotICAgIC8vIFNwZWNpYWwgY2FzZSBm
b3IgYW4gZW1wdHkgcG9wdXAuCi0gICAgaWYgKG51bUl0ZW1zKCkgPT0gMCkKLSAgICAgICAgZ2Mt
PmZpbGxSZWN0KHIsIENvbG9yOjp3aGl0ZSwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0KLSAgICBn
Yy0+cmVzdG9yZSgpOwotCi0gICAgU2Nyb2xsVmlldzo6cGFpbnQoZ2MsIHJlY3QpOwotfQotCi1z
dGF0aWMgY29uc3QgaW50IHNlcGFyYXRvclBhZGRpbmcgPSA0Owotc3RhdGljIGNvbnN0IGludCBz
ZXBhcmF0b3JIZWlnaHQgPSAxOwotCi12b2lkIFBvcHVwTGlzdEJveDo6cGFpbnRSb3coR3JhcGhp
Y3NDb250ZXh0KiBnYywgY29uc3QgSW50UmVjdCYgcmVjdCwgaW50IHJvd0luZGV4KQotewotICAg
IC8vIFRoaXMgY29kZSBpcyBiYXNlZCBsYXJnZWx5IG9uIFJlbmRlckxpc3RCb3g6OnBhaW50KiBt
ZXRob2RzLgotCi0gICAgSW50UmVjdCByb3dSZWN0ID0gZ2V0Um93Qm91bmRzKHJvd0luZGV4KTsK
LSAgICBpZiAoIXJvd1JlY3QuaW50ZXJzZWN0cyhyZWN0KSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgUG9wdXBNZW51U3R5bGUgc3R5bGUgPSBtX3BvcHVwQ2xpZW50LT5pdGVtU3R5bGUocm93SW5k
ZXgpOwotCi0gICAgLy8gUGFpbnQgYmFja2dyb3VuZAotICAgIENvbG9yIGJhY2tDb2xvciwgdGV4
dENvbG9yLCBsYWJlbENvbG9yOwotICAgIGlmIChyb3dJbmRleCA9PSBtX3NlbGVjdGVkSW5kZXgp
IHsKLSAgICAgICAgYmFja0NvbG9yID0gUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLT5hY3Rp
dmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCk7Ci0gICAgICAgIHRleHRDb2xvciA9
IFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS0+YWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVn
cm91bmRDb2xvcigpOwotICAgICAgICBsYWJlbENvbG9yID0gdGV4dENvbG9yOwotICAgIH0gZWxz
ZSB7Ci0gICAgICAgIGJhY2tDb2xvciA9IHN0eWxlLmJhY2tncm91bmRDb2xvcigpOwotICAgICAg
ICB0ZXh0Q29sb3IgPSBzdHlsZS5mb3JlZ3JvdW5kQ29sb3IoKTsKLSAgICAgICAgLy8gRklYTUU6
IGZvciBub3cgdGhlIGxhYmVsIGNvbG9yIGlzIGhhcmQtY29kZWQuIEl0IHNob3VsZCBiZSBhZGRl
ZCB0bwotICAgICAgICAvLyB0aGUgUG9wdXBNZW51U3R5bGUuCi0gICAgICAgIGxhYmVsQ29sb3Ig
PSBDb2xvcigxMTUsIDExNSwgMTE1KTsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSBoYXZlIGEgdHJh
bnNwYXJlbnQgYmFja2dyb3VuZCwgbWFrZSBzdXJlIGl0IGhhcyBhIGNvbG9yIHRvIGJsZW5kCi0g
ICAgLy8gYWdhaW5zdC4KLSAgICBpZiAoYmFja0NvbG9yLmhhc0FscGhhKCkpCi0gICAgICAgIGdj
LT5maWxsUmVjdChyb3dSZWN0LCBDb2xvcjo6d2hpdGUsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwot
Ci0gICAgZ2MtPmZpbGxSZWN0KHJvd1JlY3QsIGJhY2tDb2xvciwgQ29sb3JTcGFjZURldmljZVJH
Qik7Ci0KLSAgICAvLyBJdCBkb2Vzbid0IGxvb2sgZ29vZCBidXQgQXV0b2ZpbGwgcmVxdWlyZXMg
c3BlY2lhbCBzdHlsZSBmb3Igc2VwYXJhdG9yLgotICAgIC8vIEF1dG9maWxsIGRvZXNuJ3QgaGF2
ZSBwYWRkaW5nIGFuZCAjZGNkY2RjIGNvbG9yLgotICAgIGlmIChtX3BvcHVwQ2xpZW50LT5pdGVt
SXNTZXBhcmF0b3Iocm93SW5kZXgpKSB7Ci0gICAgICAgIGludCBwYWRkaW5nID0gc3R5bGUubWVu
dVR5cGUoKSA9PSBQb3B1cE1lbnVTdHlsZTo6QXV0b2ZpbGxQb3B1cCA/IDAgOiBzZXBhcmF0b3JQ
YWRkaW5nOwotICAgICAgICBJbnRSZWN0IHNlcGFyYXRvclJlY3QoCi0gICAgICAgICAgICByb3dS
ZWN0LngoKSArIHBhZGRpbmcsCi0gICAgICAgICAgICByb3dSZWN0LnkoKSArIChyb3dSZWN0Lmhl
aWdodCgpIC0gc2VwYXJhdG9ySGVpZ2h0KSAvIDIsCi0gICAgICAgICAgICByb3dSZWN0LndpZHRo
KCkgLSAyICogcGFkZGluZywgc2VwYXJhdG9ySGVpZ2h0KTsKLSAgICAgICAgZ2MtPmZpbGxSZWN0
KHNlcGFyYXRvclJlY3QsIHN0eWxlLm1lbnVUeXBlKCkgPT0gUG9wdXBNZW51U3R5bGU6OkF1dG9m
aWxsUG9wdXAgPyBDb2xvcigweGRjLCAweGRjLCAweGRjKSA6IHRleHRDb2xvciwgQ29sb3JTcGFj
ZURldmljZVJHQik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIXN0eWxlLmlz
VmlzaWJsZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBnYy0+c2V0RmlsbENvbG9yKHRleHRD
b2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0KLSAgICBGb250IGl0ZW1Gb250ID0gZ2V0Um93
Rm9udChyb3dJbmRleCk7Ci0gICAgLy8gRklYTUU6IGh0dHA6Ly9jcmJ1Zy5jb20vMTk4NzIgV2Ug
c2hvdWxkIGdldCB0aGUgcGFkZGluZyBvZiBpbmRpdmlkdWFsIG9wdGlvbgotICAgIC8vIGVsZW1l
bnRzLiAgVGhpcyBwcm9iYWJseSBpbXBsaWVzIGNoYW5nZXMgdG8gUG9wdXBNZW51Q2xpZW50Lgot
ICAgIGJvb2wgcmlnaHRBbGlnbmVkID0gbV9wb3B1cENsaWVudC0+bWVudVN0eWxlKCkudGV4dERp
cmVjdGlvbigpID09IFJUTDsKLSAgICBpbnQgdGV4dFggPSAwOwotICAgIGludCBtYXhXaWR0aCA9
IDA7Ci0gICAgaWYgKHJpZ2h0QWxpZ25lZCkKLSAgICAgICAgbWF4V2lkdGggPSByb3dSZWN0Lndp
ZHRoKCkgLSBtYXgoMCwgbV9wb3B1cENsaWVudC0+Y2xpZW50UGFkZGluZ1JpZ2h0KCkgLSBtX3Bv
cHVwQ2xpZW50LT5jbGllbnRJbnNldFJpZ2h0KCkpOwotICAgIGVsc2UgewotICAgICAgICB0ZXh0
WCA9IG1heCgwLCBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nTGVmdCgpIC0gbV9wb3B1cENs
aWVudC0+Y2xpZW50SW5zZXRMZWZ0KCkpOwotICAgICAgICBtYXhXaWR0aCA9IHJvd1JlY3Qud2lk
dGgoKSAtIHRleHRYOwotICAgIH0KLSAgICAvLyBQcmVwYXJlIHRleHQgdG8gYmUgZHJhd24uCi0g
ICAgU3RyaW5nIGl0ZW1UZXh0ID0gbV9wb3B1cENsaWVudC0+aXRlbVRleHQocm93SW5kZXgpOwot
ICAgIFN0cmluZyBpdGVtTGFiZWwgPSBtX3BvcHVwQ2xpZW50LT5pdGVtTGFiZWwocm93SW5kZXgp
OwotICAgIFN0cmluZyBpdGVtSWNvbiA9IG1fcG9wdXBDbGllbnQtPml0ZW1JY29uKHJvd0luZGV4
KTsKLSAgICBpZiAobV9zZXR0aW5ncy5yZXN0cmljdFdpZHRoT2ZMaXN0Qm94KSB7IC8vIFRydW5j
YXRlIHN0cmluZ3MgdG8gZml0IGluLgotICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGxlZnRU
cnVuY2F0ZSBmb3IgdGhlIHJ0bCBjYXNlLgotICAgICAgICAvLyBTdHJpbmdUcnVuY2F0b3I6Omxl
ZnRUcnVuY2F0ZSB3b3VsZCBoYXZlIHRvIGJlIGltcGxlbWVudGVkLgotICAgICAgICBTdHJpbmcg
c3RyID0gU3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKGl0ZW1UZXh0LCBtYXhXaWR0aCwg
aXRlbUZvbnQpOwotICAgICAgICBpZiAoc3RyICE9IGl0ZW1UZXh0KSB7Ci0gICAgICAgICAgICBp
dGVtVGV4dCA9IHN0cjsKLSAgICAgICAgICAgIC8vIERvbid0IGRpc3BsYXkgdGhlIGxhYmVsIG9y
IGljb24sIHdlIGFscmVhZHkgZG9uJ3QgaGF2ZSBlbm91Z2ggcm9vbSBmb3IgdGhlIGl0ZW0gdGV4
dC4KLSAgICAgICAgICAgIGl0ZW1MYWJlbCA9ICIiOwotICAgICAgICAgICAgaXRlbUljb24gPSAi
IjsKLSAgICAgICAgfSBlbHNlIGlmICghaXRlbUxhYmVsLmlzRW1wdHkoKSkgewotICAgICAgICAg
ICAgaW50IGF2YWlsYWJsZVdpZHRoID0gbWF4V2lkdGggLSBrVGV4dFRvTGFiZWxQYWRkaW5nIC0K
LSAgICAgICAgICAgICAgICBTdHJpbmdUcnVuY2F0b3I6OndpZHRoKGl0ZW1UZXh0LCBpdGVtRm9u
dCk7Ci0gICAgICAgICAgICBpdGVtTGFiZWwgPSBTdHJpbmdUcnVuY2F0b3I6OnJpZ2h0VHJ1bmNh
dGUoaXRlbUxhYmVsLCBhdmFpbGFibGVXaWR0aCwgaXRlbUZvbnQpOwotICAgICAgICB9Ci0gICAg
fQotCi0gICAgLy8gUHJlcGFyZSB0aGUgZGlyZWN0aW9uYWxpdHkgdG8gZHJhdyB0ZXh0LgotICAg
IFRleHRSdW4gdGV4dFJ1bihpdGVtVGV4dC5jaGFyYWN0ZXJzKCksIGl0ZW1UZXh0Lmxlbmd0aCgp
LCBmYWxzZSwgMCwgMCwgVGV4dFJ1bjo6QWxsb3dUcmFpbGluZ0V4cGFuc2lvbiwgc3R5bGUudGV4
dERpcmVjdGlvbigpLCBzdHlsZS5oYXNUZXh0RGlyZWN0aW9uT3ZlcnJpZGUoKSk7Ci0gICAgLy8g
SWYgdGhlIHRleHQgaXMgcmlnaHQtdG8tbGVmdCwgbWFrZSBpdCByaWdodC1hbGlnbmVkIGJ5IGFk
anVzdGluZyBpdHMKLSAgICAvLyBiZWdpbm5pbmcgcG9zaXRpb24uCi0gICAgaWYgKHJpZ2h0QWxp
Z25lZCkKLSAgICAgICAgdGV4dFggKz0gbWF4V2lkdGggLSBpdGVtRm9udC53aWR0aCh0ZXh0UnVu
KTsKLQotICAgIC8vIERyYXcgdGhlIGl0ZW0gdGV4dC4KLSAgICBpbnQgdGV4dFkgPSByb3dSZWN0
LnkoKSArIGl0ZW1Gb250LmZvbnRNZXRyaWNzKCkuYXNjZW50KCkgKyAocm93UmVjdC5oZWlnaHQo
KSAtIGl0ZW1Gb250LmZvbnRNZXRyaWNzKCkuaGVpZ2h0KCkpIC8gMjsKLSAgICBnYy0+ZHJhd0Jp
ZGlUZXh0KGl0ZW1Gb250LCB0ZXh0UnVuLCBJbnRQb2ludCh0ZXh0WCwgdGV4dFkpKTsKLQotICAg
IC8vIFdlIGFyZSB1c2luZyB0aGUgbGVmdCBwYWRkaW5nIGFzIHRoZSByaWdodCBwYWRkaW5nIGlu
Y2x1ZGVzIHJvb20gZm9yIHRoZSBzY3JvbGwtYmFyIHdoaWNoCi0gICAgLy8gZG9lcyBub3Qgc2hv
dyBpbiB0aGlzIGNhc2UuCi0gICAgaW50IHJpZ2h0UGFkZGluZyA9IG1heCgwLCBtX3BvcHVwQ2xp
ZW50LT5jbGllbnRQYWRkaW5nTGVmdCgpIC0gbV9wb3B1cENsaWVudC0+Y2xpZW50SW5zZXRMZWZ0
KCkpOwotICAgIGludCByZW1haW5pbmdXaWR0aCA9IHJvd1JlY3Qud2lkdGgoKSAtIHJpZ2h0UGFk
ZGluZzsKLQotICAgIC8vIERyYXcgdGhlIGljb24gaWYgYXBwbGljYWJsZS4KLSAgICBSZWZQdHI8
SW1hZ2U+IGltYWdlKEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShpdGVtSWNvbi51dGY4KCku
ZGF0YSgpKSk7Ci0gICAgaWYgKGltYWdlICYmICFpbWFnZS0+aXNOdWxsKCkpIHsKLSAgICAgICAg
SW50UmVjdCBpbWFnZVJlY3QgPSBpbWFnZS0+cmVjdCgpOwotICAgICAgICByZW1haW5pbmdXaWR0
aCAtPSAoaW1hZ2VSZWN0LndpZHRoKCkgKyBrTGFiZWxUb0ljb25QYWRkaW5nKTsKLSAgICAgICAg
aW1hZ2VSZWN0LnNldFgocm93UmVjdC53aWR0aCgpIC0gcmlnaHRQYWRkaW5nIC0gaW1hZ2VSZWN0
LndpZHRoKCkpOwotICAgICAgICBpbWFnZVJlY3Quc2V0WShyb3dSZWN0LnkoKSArIChyb3dSZWN0
LmhlaWdodCgpIC0gaW1hZ2VSZWN0LmhlaWdodCgpKSAvIDIpOwotICAgICAgICBnYy0+ZHJhd0lt
YWdlKGltYWdlLmdldCgpLCBDb2xvclNwYWNlRGV2aWNlUkdCLCBpbWFnZVJlY3QpOwotICAgIH0K
LQotICAgIC8vIERyYXcgdGhlIHRoZSBsYWJlbCBpZiBhcHBsaWNhYmxlLgotICAgIGlmIChpdGVt
TGFiZWwuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBBdXRvZmlsbCBsYWJl
bCBpcyAwLjkgc21hbGxlciB0aGFuIHJlZ3VsYXIgZm9udCBzaXplLgotICAgIGlmIChzdHlsZS5t
ZW51VHlwZSgpID09IFBvcHVwTWVudVN0eWxlOjpBdXRvZmlsbFBvcHVwKSB7Ci0gICAgICAgIGl0
ZW1Gb250ID0gbV9wb3B1cENsaWVudC0+aXRlbVN0eWxlKHJvd0luZGV4KS5mb250KCk7Ci0gICAg
ICAgIEZvbnREZXNjcmlwdGlvbiBkID0gaXRlbUZvbnQuZm9udERlc2NyaXB0aW9uKCk7Ci0gICAg
ICAgIGQuc2V0Q29tcHV0ZWRTaXplKGQuY29tcHV0ZWRTaXplKCkgKiAwLjkpOwotICAgICAgICBp
dGVtRm9udCA9IEZvbnQoZCwgaXRlbUZvbnQubGV0dGVyU3BhY2luZygpLCBpdGVtRm9udC53b3Jk
U3BhY2luZygpKTsKLSAgICAgICAgaXRlbUZvbnQudXBkYXRlKDApOwotICAgIH0KLQotICAgIFRl
eHRSdW4gbGFiZWxUZXh0UnVuKGl0ZW1MYWJlbC5jaGFyYWN0ZXJzKCksIGl0ZW1MYWJlbC5sZW5n
dGgoKSwgZmFsc2UsIDAsIDAsIFRleHRSdW46OkFsbG93VHJhaWxpbmdFeHBhbnNpb24sIHN0eWxl
LnRleHREaXJlY3Rpb24oKSwgc3R5bGUuaGFzVGV4dERpcmVjdGlvbk92ZXJyaWRlKCkpOwotICAg
IGlmIChyaWdodEFsaWduZWQpCi0gICAgICAgIHRleHRYID0gbWF4KDAsIG1fcG9wdXBDbGllbnQt
PmNsaWVudFBhZGRpbmdMZWZ0KCkgLSBtX3BvcHVwQ2xpZW50LT5jbGllbnRJbnNldExlZnQoKSk7
Ci0gICAgZWxzZQotICAgICAgICB0ZXh0WCA9IHJlbWFpbmluZ1dpZHRoIC0gaXRlbUZvbnQud2lk
dGgobGFiZWxUZXh0UnVuKTsKLQotICAgIGdjLT5zZXRGaWxsQ29sb3IobGFiZWxDb2xvciwgQ29s
b3JTcGFjZURldmljZVJHQik7Ci0gICAgZ2MtPmRyYXdCaWRpVGV4dChpdGVtRm9udCwgbGFiZWxU
ZXh0UnVuLCBJbnRQb2ludCh0ZXh0WCwgdGV4dFkpKTsKLX0KLQotRm9udCBQb3B1cExpc3RCb3g6
OmdldFJvd0ZvbnQoaW50IHJvd0luZGV4KQotewotICAgIEZvbnQgaXRlbUZvbnQgPSBtX3BvcHVw
Q2xpZW50LT5pdGVtU3R5bGUocm93SW5kZXgpLmZvbnQoKTsKLSAgICBpZiAobV9wb3B1cENsaWVu
dC0+aXRlbUlzTGFiZWwocm93SW5kZXgpKSB7Ci0gICAgICAgIC8vIEJvbGQtaWZ5IGxhYmVscyAo
aWUsIGFuIDxvcHRncm91cD4gaGVhZGluZykuCi0gICAgICAgIEZvbnREZXNjcmlwdGlvbiBkID0g
aXRlbUZvbnQuZm9udERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGQuc2V0V2VpZ2h0KEZvbnRXZWln
aHRCb2xkKTsKLSAgICAgICAgRm9udCBmb250KGQsIGl0ZW1Gb250LmxldHRlclNwYWNpbmcoKSwg
aXRlbUZvbnQud29yZFNwYWNpbmcoKSk7Ci0gICAgICAgIGZvbnQudXBkYXRlKDApOwotICAgICAg
ICByZXR1cm4gZm9udDsKLSAgICB9Ci0KLSAgICByZXR1cm4gaXRlbUZvbnQ7Ci19Ci0KLXZvaWQg
UG9wdXBMaXN0Qm94OjphYmFuZG9uKCkKLXsKLSAgICBSZWZQdHI8UG9wdXBMaXN0Qm94PiBrZWVw
QWxpdmUodGhpcyk7Ci0KLSAgICBtX3NlbGVjdGVkSW5kZXggPSBtX29yaWdpbmFsSW5kZXg7Ci0K
LSAgICBoaWRlUG9wdXAoKTsKLQotICAgIGlmIChtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gPj0g
MCkgewotICAgICAgICBpZiAobV9wb3B1cENsaWVudCkKLSAgICAgICAgICAgIG1fcG9wdXBDbGll
bnQtPnZhbHVlQ2hhbmdlZChtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24pOwotICAgICAgICBtX2Fj
Y2VwdGVkSW5kZXhPbkFiYW5kb24gPSAtMTsKLSAgICB9Ci19Ci0KLWludCBQb3B1cExpc3RCb3g6
OnBvaW50VG9Sb3dJbmRleChjb25zdCBJbnRQb2ludCYgcG9pbnQpCi17Ci0gICAgaW50IHkgPSBz
Y3JvbGxZKCkgKyBwb2ludC55KCk7Ci0KLSAgICAvLyBGSVhNRTogYmluYXJ5IHNlYXJjaCBpZiBw
ZXJmIG1hdHRlcnMuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVtcygpOyArK2kpIHsK
LSAgICAgICAgaWYgKHkgPCBtX2l0ZW1zW2ldLT55T2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJu
IGktMTsKLSAgICB9Ci0KLSAgICAvLyBMYXN0IGl0ZW0/Ci0gICAgaWYgKHkgPCBjb250ZW50c0hl
aWdodCgpKQotICAgICAgICByZXR1cm4gbV9pdGVtcy5zaXplKCktMTsKLQotICAgIHJldHVybiAt
MTsKLX0KLQotYm9vbCBQb3B1cExpc3RCb3g6OmFjY2VwdEluZGV4KGludCBpbmRleCkKLXsKLSAg
ICAvLyBDbGVhciBtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gb25jZSB1c2VyIGFjY2VwdHMgdGhl
IHNlbGVjdGVkIGluZGV4LgotICAgIGlmIChtX2FjY2VwdGVkSW5kZXhPbkFiYW5kb24gPj0gMCkK
LSAgICAgICAgbV9hY2NlcHRlZEluZGV4T25BYmFuZG9uID0gLTE7Ci0KLSAgICBpZiAoaW5kZXgg
Pj0gbnVtSXRlbXMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGluZGV4IDwg
MCkgewotICAgICAgICBpZiAobV9wb3B1cENsaWVudCkgewotICAgICAgICAgICAgLy8gRW50ZXIg
cHJlc3NlZCB3aXRoIG5vIHNlbGVjdGlvbiwganVzdCBjbG9zZSB0aGUgcG9wdXAuCi0gICAgICAg
ICAgICBoaWRlUG9wdXAoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotCi0gICAgaWYgKGlzU2VsZWN0YWJsZUl0ZW0oaW5kZXgpKSB7Ci0gICAgICAgIFJlZlB0cjxQ
b3B1cExpc3RCb3g+IGtlZXBBbGl2ZSh0aGlzKTsKLQotICAgICAgICAvLyBIaWRlIG91cnNlbHZl
cyBmaXJzdCBzaW5jZSB2YWx1ZUNoYW5nZWQgbWF5IGhhdmUgbnVtZXJvdXMgc2lkZS1lZmZlY3Rz
LgotICAgICAgICBoaWRlUG9wdXAoKTsKLQotICAgICAgICAvLyBUZWxsIHRoZSA8c2VsZWN0PiBQ
b3B1cE1lbnVDbGllbnQgd2hhdCBpbmRleCB3YXMgc2VsZWN0ZWQuCi0gICAgICAgIG1fcG9wdXBD
bGllbnQtPnZhbHVlQ2hhbmdlZChpbmRleCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
fQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6c2VsZWN0SW5k
ZXgoaW50IGluZGV4KQotewotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbnVtSXRlbXMo
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYm9vbCBpc1NlbGVjdGFibGUgPSBpc1NlbGVjdGFi
bGVJdGVtKGluZGV4KTsKLSAgICBpZiAoaW5kZXggIT0gbV9zZWxlY3RlZEluZGV4ICYmIGlzU2Vs
ZWN0YWJsZSkgewotICAgICAgICBpbnZhbGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7Ci0gICAg
ICAgIG1fc2VsZWN0ZWRJbmRleCA9IGluZGV4OwotICAgICAgICBpbnZhbGlkYXRlUm93KG1fc2Vs
ZWN0ZWRJbmRleCk7Ci0KLSAgICAgICAgc2Nyb2xsVG9SZXZlYWxTZWxlY3Rpb24oKTsKLSAgICAg
ICAgbV9wb3B1cENsaWVudC0+c2VsZWN0aW9uQ2hhbmdlZChtX3NlbGVjdGVkSW5kZXgpOwotICAg
IH0gZWxzZSBpZiAoIWlzU2VsZWN0YWJsZSkgewotICAgICAgICBjbGVhclNlbGVjdGlvbigpOwot
ICAgIH0KLX0KLQotdm9pZCBQb3B1cExpc3RCb3g6OnNldE9yaWdpbmFsSW5kZXgoaW50IGluZGV4
KQotewotICAgIG1fb3JpZ2luYWxJbmRleCA9IG1fc2VsZWN0ZWRJbmRleCA9IGluZGV4OwotfQot
Ci1pbnQgUG9wdXBMaXN0Qm94OjpnZXRSb3dIZWlnaHQoaW50IGluZGV4KQotewotICAgIGlmIChp
bmRleCA8IDApCi0gICAgICAgIHJldHVybiBQb3B1cE1lbnVDaHJvbWl1bTo6bWluaW11bVJvd0hl
aWdodCgpOwotCi0gICAgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1TdHlsZShpbmRleCkuaXNEaXNw
bGF5Tm9uZSgpKQotICAgICAgICByZXR1cm4gUG9wdXBNZW51Q2hyb21pdW06Om1pbmltdW1Sb3dI
ZWlnaHQoKTsKLQotICAgIC8vIFNlcGFyYXRvciByb3cgaGVpZ2h0IGlzIHRoZSBzYW1lIHNpemUg
YXMgaXRzZWxmLgotICAgIGlmIChtX3BvcHVwQ2xpZW50LT5pdGVtSXNTZXBhcmF0b3IoaW5kZXgp
KQotICAgICAgICByZXR1cm4gbWF4KHNlcGFyYXRvckhlaWdodCwgUG9wdXBNZW51Q2hyb21pdW06
Om1pbmltdW1Sb3dIZWlnaHQoKSk7Ci0KLSAgICBTdHJpbmcgaWNvbiA9IG1fcG9wdXBDbGllbnQt
Pml0ZW1JY29uKGluZGV4KTsKLSAgICBSZWZQdHI8SW1hZ2U+IGltYWdlKEltYWdlOjpsb2FkUGxh
dGZvcm1SZXNvdXJjZShpY29uLnV0ZjgoKS5kYXRhKCkpKTsKLQotICAgIGludCBmb250SGVpZ2h0
ID0gZ2V0Um93Rm9udChpbmRleCkuZm9udE1ldHJpY3MoKS5oZWlnaHQoKTsKLSAgICBpbnQgaWNv
bkhlaWdodCA9IChpbWFnZSAmJiAhaW1hZ2UtPmlzTnVsbCgpKSA/IGltYWdlLT5yZWN0KCkuaGVp
Z2h0KCkgOiAwOwotCi0gICAgaW50IGxpbmVQYWRkaW5nSGVpZ2h0ID0gbV9wb3B1cENsaWVudC0+
bWVudVN0eWxlKCkubWVudVR5cGUoKSA9PSBQb3B1cE1lbnVTdHlsZTo6QXV0b2ZpbGxQb3B1cCA/
IGtMaW5lUGFkZGluZ0hlaWdodCA6IDA7Ci0gICAgaW50IGNhbGN1bGF0ZWRSb3dIZWlnaHQgPSBt
YXgoZm9udEhlaWdodCwgaWNvbkhlaWdodCkgKyBsaW5lUGFkZGluZ0hlaWdodCAqIDI7Ci0gICAg
cmV0dXJuIG1heChjYWxjdWxhdGVkUm93SGVpZ2h0LCBQb3B1cE1lbnVDaHJvbWl1bTo6bWluaW11
bVJvd0hlaWdodCgpKTsKLX0KLQotSW50UmVjdCBQb3B1cExpc3RCb3g6OmdldFJvd0JvdW5kcyhp
bnQgaW5kZXgpCi17Ci0gICAgaWYgKGluZGV4IDwgMCkKLSAgICAgICAgcmV0dXJuIEludFJlY3Qo
MCwgMCwgdmlzaWJsZVdpZHRoKCksIGdldFJvd0hlaWdodChpbmRleCkpOwotCi0gICAgcmV0dXJu
IEludFJlY3QoMCwgbV9pdGVtc1tpbmRleF0tPnlPZmZzZXQsIHZpc2libGVXaWR0aCgpLCBnZXRS
b3dIZWlnaHQoaW5kZXgpKTsKLX0KLQotdm9pZCBQb3B1cExpc3RCb3g6OmludmFsaWRhdGVSb3co
aW50IGluZGV4KQotewotICAgIGlmIChpbmRleCA8IDApCi0gICAgICAgIHJldHVybjsKLQotICAg
IC8vIEludmFsaWRhdGUgaW4gdGhlIHdpbmRvdyBjb250ZW50cywgYXMgRnJhbWVsZXNzU2Nyb2xs
Vmlldzo6aW52YWxpZGF0ZVJlY3QKLSAgICAvLyBwYWludHMgaW4gdGhlIHdpbmRvdyBjb29yZGlu
YXRlcy4KLSAgICBpbnZhbGlkYXRlUmVjdChjb250ZW50c1RvV2luZG93KGdldFJvd0JvdW5kcyhp
bmRleCkpKTsKLX0KLQotdm9pZCBQb3B1cExpc3RCb3g6OnNjcm9sbFRvUmV2ZWFsUm93KGludCBp
bmRleCkKLXsKLSAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBJbnRS
ZWN0IHJvd1JlY3QgPSBnZXRSb3dCb3VuZHMoaW5kZXgpOwotCi0gICAgaWYgKHJvd1JlY3QueSgp
IDwgc2Nyb2xsWSgpKSB7Ci0gICAgICAgIC8vIFJvdyBpcyBhYm92ZSBjdXJyZW50IHNjcm9sbCBw
b3NpdGlvbiwgc2Nyb2xsIHVwLgotICAgICAgICBTY3JvbGxWaWV3OjpzZXRTY3JvbGxQb3NpdGlv
bihJbnRQb2ludCgwLCByb3dSZWN0LnkoKSkpOwotICAgIH0gZWxzZSBpZiAocm93UmVjdC5tYXhZ
KCkgPiBzY3JvbGxZKCkgKyB2aXNpYmxlSGVpZ2h0KCkpIHsKLSAgICAgICAgLy8gUm93IGlzIGJl
bG93IGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uLCBzY3JvbGwgZG93bi4KLSAgICAgICAgU2Nyb2xs
Vmlldzo6c2V0U2Nyb2xsUG9zaXRpb24oSW50UG9pbnQoMCwgcm93UmVjdC5tYXhZKCkgLSB2aXNp
YmxlSGVpZ2h0KCkpKTsKLSAgICB9Ci19Ci0KLWJvb2wgUG9wdXBMaXN0Qm94Ojppc1NlbGVjdGFi
bGVJdGVtKGludCBpbmRleCkKLXsKLSAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IG51
bUl0ZW1zKCkpOwotICAgIHJldHVybiBtX2l0ZW1zW2luZGV4XS0+dHlwZSA9PSBQb3B1cEl0ZW06
OlR5cGVPcHRpb24gJiYgbV9wb3B1cENsaWVudC0+aXRlbUlzRW5hYmxlZChpbmRleCk7Ci19Ci0K
LXZvaWQgUG9wdXBMaXN0Qm94OjpjbGVhclNlbGVjdGlvbigpCi17Ci0gICAgaWYgKG1fc2VsZWN0
ZWRJbmRleCAhPSAtMSkgewotICAgICAgICBpbnZhbGlkYXRlUm93KG1fc2VsZWN0ZWRJbmRleCk7
Ci0gICAgICAgIG1fc2VsZWN0ZWRJbmRleCA9IC0xOwotICAgICAgICBtX3BvcHVwQ2xpZW50LT5z
ZWxlY3Rpb25DbGVhcmVkKCk7Ci0gICAgfQotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6c2VsZWN0
TmV4dFJvdygpCi17Ci0gICAgaWYgKCFtX3NldHRpbmdzLmxvb3BTZWxlY3Rpb25OYXZpZ2F0aW9u
IHx8IG1fc2VsZWN0ZWRJbmRleCAhPSBudW1JdGVtcygpIC0gMSkgewotICAgICAgICBhZGp1c3RT
ZWxlY3RlZEluZGV4KDEpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gV2UgYXJl
IG1vdmluZyBwYXN0IHRoZSBsYXN0IGl0ZW0sIG5vIHJvdyBzaG91bGQgYmUgc2VsZWN0ZWQuCi0g
ICAgY2xlYXJTZWxlY3Rpb24oKTsKLX0KLQotdm9pZCBQb3B1cExpc3RCb3g6OnNlbGVjdFByZXZp
b3VzUm93KCkKLXsKLSAgICBpZiAoIW1fc2V0dGluZ3MubG9vcFNlbGVjdGlvbk5hdmlnYXRpb24g
fHwgbV9zZWxlY3RlZEluZGV4ID4gMCkgewotICAgICAgICBhZGp1c3RTZWxlY3RlZEluZGV4KC0x
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtX3NlbGVjdGVkSW5kZXggPT0g
MCkgewotICAgICAgICAvLyBXZSBhcmUgbW92aW5nIHBhc3QgdGhlIGZpcnN0IGl0ZW0sIGNsZWFy
IHRoZSBzZWxlY3Rpb24uCi0gICAgICAgIGNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICAvLyBObyByb3cgaXMgc2VsZWN0ZWQsIGp1bXAgdG8gdGhlIGxhc3Qg
aXRlbS4KLSAgICBzZWxlY3RJbmRleChudW1JdGVtcygpIC0gMSk7Ci0gICAgc2Nyb2xsVG9SZXZl
YWxTZWxlY3Rpb24oKTsKLX0KLQotdm9pZCBQb3B1cExpc3RCb3g6OmFkanVzdFNlbGVjdGVkSW5k
ZXgoaW50IGRlbHRhKQotewotICAgIGludCB0YXJnZXRJbmRleCA9IG1fc2VsZWN0ZWRJbmRleCAr
IGRlbHRhOwotICAgIHRhcmdldEluZGV4ID0gbWluKG1heCh0YXJnZXRJbmRleCwgMCksIG51bUl0
ZW1zKCkgLSAxKTsKLSAgICBpZiAoIWlzU2VsZWN0YWJsZUl0ZW0odGFyZ2V0SW5kZXgpKSB7Ci0g
ICAgICAgIC8vIFdlIGRpZG4ndCBsYW5kIG9uIGFuIG9wdGlvbi4gIFRyeSB0byBmaW5kIG9uZS4K
LSAgICAgICAgLy8gV2UgdHJ5IHRvIHNlbGVjdCB0aGUgY2xvc2VzdCBpbmRleCB0byB0YXJnZXQs
IHByaW9yaXRpemluZyBhbnkgaW4KLSAgICAgICAgLy8gdGhlIHJhbmdlIFtjdXJyZW50LCB0YXJn
ZXRdLgotCi0gICAgICAgIGludCBkaXIgPSBkZWx0YSA+IDAgPyAxIDogLTE7Ci0gICAgICAgIGlu
dCB0ZXN0SW5kZXggPSBtX3NlbGVjdGVkSW5kZXg7Ci0gICAgICAgIGludCBiZXN0SW5kZXggPSBt
X3NlbGVjdGVkSW5kZXg7Ci0gICAgICAgIGJvb2wgcGFzc2VkVGFyZ2V0ID0gZmFsc2U7Ci0gICAg
ICAgIHdoaWxlICh0ZXN0SW5kZXggPj0gMCAmJiB0ZXN0SW5kZXggPCBudW1JdGVtcygpKSB7Ci0g
ICAgICAgICAgICBpZiAoaXNTZWxlY3RhYmxlSXRlbSh0ZXN0SW5kZXgpKQotICAgICAgICAgICAg
ICAgIGJlc3RJbmRleCA9IHRlc3RJbmRleDsKLSAgICAgICAgICAgIGlmICh0ZXN0SW5kZXggPT0g
dGFyZ2V0SW5kZXgpCi0gICAgICAgICAgICAgICAgcGFzc2VkVGFyZ2V0ID0gdHJ1ZTsKLSAgICAg
ICAgICAgIGlmIChwYXNzZWRUYXJnZXQgJiYgYmVzdEluZGV4ICE9IG1fc2VsZWN0ZWRJbmRleCkK
LSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgdGVzdEluZGV4ICs9IGRpcjsK
LSAgICAgICAgfQotCi0gICAgICAgIC8vIFBpY2sgdGhlIGJlc3QgaW5kZXgsIHdoaWNoIG1heSBt
ZWFuIHdlIGRvbid0IGNoYW5nZS4KLSAgICAgICAgdGFyZ2V0SW5kZXggPSBiZXN0SW5kZXg7Ci0g
ICAgfQotCi0gICAgLy8gU2VsZWN0IHRoZSBuZXcgaW5kZXgsIGFuZCBlbnN1cmUgaXRzIHZpc2li
bGUuICBXZSBkbyB0aGlzIHJlZ2FyZGxlc3Mgb2YKLSAgICAvLyB3aGV0aGVyIHRoZSBzZWxlY3Rp
b24gY2hhbmdlZCB0byBlbnN1cmUga2V5Ym9hcmQgZXZlbnRzIGFsd2F5cyBicmluZyB0aGUKLSAg
ICAvLyBzZWxlY3Rpb24gaW50byB2aWV3LgotICAgIHNlbGVjdEluZGV4KHRhcmdldEluZGV4KTsK
LSAgICBzY3JvbGxUb1JldmVhbFNlbGVjdGlvbigpOwotfQotCi12b2lkIFBvcHVwTGlzdEJveDo6
aGlkZVBvcHVwKCkKLXsKLSAgICBpZiAocGFyZW50KCkpIHsKLSAgICAgICAgUG9wdXBDb250YWlu
ZXIqIGNvbnRhaW5lciA9IHN0YXRpY19jYXN0PFBvcHVwQ29udGFpbmVyKj4ocGFyZW50KCkpOwot
ICAgICAgICBpZiAoY29udGFpbmVyLT5jbGllbnQoKSkKLSAgICAgICAgICAgIGNvbnRhaW5lci0+
Y2xpZW50KCktPnBvcHVwQ2xvc2VkKGNvbnRhaW5lcik7Ci0gICAgICAgIGNvbnRhaW5lci0+bm90
aWZ5UG9wdXBIaWRkZW4oKTsKLSAgICB9Ci0KLSAgICBpZiAobV9wb3B1cENsaWVudCkKLSAgICAg
ICAgbV9wb3B1cENsaWVudC0+cG9wdXBEaWRIaWRlKCk7Ci19Ci0KLXZvaWQgUG9wdXBMaXN0Qm94
Ojp1cGRhdGVGcm9tRWxlbWVudCgpCi17Ci0gICAgY2xlYXIoKTsKLQotICAgIGludCBzaXplID0g
bV9wb3B1cENsaWVudC0+bGlzdFNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7
ICsraSkgewotICAgICAgICBQb3B1cEl0ZW06OlR5cGUgdHlwZTsKLSAgICAgICAgaWYgKG1fcG9w
dXBDbGllbnQtPml0ZW1Jc1NlcGFyYXRvcihpKSkKLSAgICAgICAgICAgIHR5cGUgPSBQb3B1cEl0
ZW06OlR5cGVTZXBhcmF0b3I7Ci0gICAgICAgIGVsc2UgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1J
c0xhYmVsKGkpKQotICAgICAgICAgICAgdHlwZSA9IFBvcHVwSXRlbTo6VHlwZUdyb3VwOwotICAg
ICAgICBlbHNlCi0gICAgICAgICAgICB0eXBlID0gUG9wdXBJdGVtOjpUeXBlT3B0aW9uOwotICAg
ICAgICBtX2l0ZW1zLmFwcGVuZChuZXcgUG9wdXBJdGVtKG1fcG9wdXBDbGllbnQtPml0ZW1UZXh0
KGkpLCB0eXBlKSk7Ci0gICAgICAgIG1faXRlbXNbaV0tPmVuYWJsZWQgPSBpc1NlbGVjdGFibGVJ
dGVtKGkpOwotICAgICAgICBQb3B1cE1lbnVTdHlsZSBzdHlsZSA9IG1fcG9wdXBDbGllbnQtPml0
ZW1TdHlsZShpKTsKLSAgICAgICAgbV9pdGVtc1tpXS0+dGV4dERpcmVjdGlvbiA9IHN0eWxlLnRl
eHREaXJlY3Rpb24oKTsKLSAgICAgICAgbV9pdGVtc1tpXS0+aGFzVGV4dERpcmVjdGlvbk92ZXJy
aWRlID0gc3R5bGUuaGFzVGV4dERpcmVjdGlvbk92ZXJyaWRlKCk7Ci0gICAgfQotCi0gICAgbV9z
ZWxlY3RlZEluZGV4ID0gbV9wb3B1cENsaWVudC0+c2VsZWN0ZWRJbmRleCgpOwotICAgIHNldE9y
aWdpbmFsSW5kZXgobV9zZWxlY3RlZEluZGV4KTsKLQotICAgIGxheW91dCgpOwotfQotCi12b2lk
IFBvcHVwTGlzdEJveDo6c2V0TWF4V2lkdGhBbmRMYXlvdXQoaW50IG1heFdpZHRoKQotewotICAg
IG1fbWF4V2luZG93V2lkdGggPSBtYXhXaWR0aDsKLSAgICBsYXlvdXQoKTsKLX0KLQotdm9pZCBQ
b3B1cExpc3RCb3g6OmxheW91dCgpCi17Ci0gICAgYm9vbCBpc1JpZ2h0QWxpZ25lZCA9IG1fcG9w
dXBDbGllbnQtPm1lbnVTdHlsZSgpLnRleHREaXJlY3Rpb24oKSA9PSBSVEw7Ci0gICAgCi0gICAg
Ly8gU2l6ZSBvdXIgY2hpbGQgaXRlbXMuCi0gICAgaW50IGJhc2VXaWR0aCA9IDA7Ci0gICAgaW50
IHBhZGRpbmdXaWR0aCA9IDA7Ci0gICAgaW50IGxpbmVFbmRQYWRkaW5nV2lkdGggPSAwOwotICAg
IGludCB5ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUl0ZW1zKCk7ICsraSkgewot
ICAgICAgICAvLyBQbGFjZSB0aGUgaXRlbSB2ZXJ0aWNhbGx5LgotICAgICAgICBtX2l0ZW1zW2ld
LT55T2Zmc2V0ID0geTsKLSAgICAgICAgaWYgKG1fcG9wdXBDbGllbnQtPml0ZW1TdHlsZShpKS5p
c0Rpc3BsYXlOb25lKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgeSArPSBnZXRS
b3dIZWlnaHQoaSk7Ci0KLSAgICAgICAgLy8gRW5zdXJlIHRoZSBwb3B1cCBpcyB3aWRlIGVub3Vn
aCB0byBmaXQgdGhpcyBpdGVtLgotICAgICAgICBGb250IGl0ZW1Gb250ID0gZ2V0Um93Rm9udChp
KTsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBtX3BvcHVwQ2xpZW50LT5pdGVtVGV4dChpKTsKLSAg
ICAgICAgU3RyaW5nIGxhYmVsID0gbV9wb3B1cENsaWVudC0+aXRlbUxhYmVsKGkpOwotICAgICAg
ICBTdHJpbmcgaWNvbiA9IG1fcG9wdXBDbGllbnQtPml0ZW1JY29uKGkpOwotICAgICAgICBSZWZQ
dHI8SW1hZ2U+IGljb25JbWFnZShJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UoaWNvbi51dGY4
KCkuZGF0YSgpKSk7Ci0gICAgICAgIGludCB3aWR0aCA9IDA7Ci0gICAgICAgIGlmICghdGV4dC5p
c0VtcHR5KCkpCi0gICAgICAgICAgICB3aWR0aCA9IGl0ZW1Gb250LndpZHRoKFRleHRSdW4odGV4
dCkpOwotICAgICAgICBpZiAoIWxhYmVsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKHdp
ZHRoID4gMCkKLSAgICAgICAgICAgICAgICB3aWR0aCArPSBrVGV4dFRvTGFiZWxQYWRkaW5nOwot
ICAgICAgICAgICAgd2lkdGggKz0gaXRlbUZvbnQud2lkdGgoVGV4dFJ1bihsYWJlbCkpOwotICAg
ICAgICB9Ci0gICAgICAgIGlmIChpY29uSW1hZ2UgJiYgIWljb25JbWFnZS0+aXNOdWxsKCkpIHsK
LSAgICAgICAgICAgIGlmICh3aWR0aCA+IDApCi0gICAgICAgICAgICAgICAgd2lkdGggKz0ga0xh
YmVsVG9JY29uUGFkZGluZzsKLSAgICAgICAgICAgIHdpZHRoICs9IGljb25JbWFnZS0+cmVjdCgp
LndpZHRoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBiYXNlV2lkdGggPSBtYXgoYmFzZVdpZHRo
LCB3aWR0aCk7Ci0gICAgICAgIC8vIEZJWE1FOiBodHRwOi8vYi8xMjEwNDgxIFdlIHNob3VsZCBn
ZXQgdGhlIHBhZGRpbmcgb2YgaW5kaXZpZHVhbCBvcHRpb24gZWxlbWVudHMuCi0gICAgICAgIHBh
ZGRpbmdXaWR0aCA9IG1heChwYWRkaW5nV2lkdGgsCi0gICAgICAgICAgICBtX3BvcHVwQ2xpZW50
LT5jbGllbnRQYWRkaW5nTGVmdCgpICsgbV9wb3B1cENsaWVudC0+Y2xpZW50UGFkZGluZ1JpZ2h0
KCkpOwotICAgICAgICBsaW5lRW5kUGFkZGluZ1dpZHRoID0gbWF4KGxpbmVFbmRQYWRkaW5nV2lk
dGgsCi0gICAgICAgICAgICBpc1JpZ2h0QWxpZ25lZCA/IG1fcG9wdXBDbGllbnQtPmNsaWVudFBh
ZGRpbmdMZWZ0KCkgOiBtX3BvcHVwQ2xpZW50LT5jbGllbnRQYWRkaW5nUmlnaHQoKSk7Ci0gICAg
fQotCi0gICAgLy8gQ2FsY3VsYXRlIHNjcm9sbCBiYXIgd2lkdGguCi0gICAgaW50IHdpbmRvd0hl
aWdodCA9IDA7Ci0gICAgbV92aXNpYmxlUm93cyA9IG1pbihudW1JdGVtcygpLCBrTWF4VmlzaWJs
ZVJvd3MpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3Zpc2libGVSb3dzOyArK2kpIHsK
LSAgICAgICAgaW50IHJvd0hlaWdodCA9IGdldFJvd0hlaWdodChpKTsKLQotICAgICAgICAvLyBP
bmx5IGNsaXAgdGhlIHdpbmRvdyBoZWlnaHQgZm9yIG5vbi1NYWMgcGxhdGZvcm1zLgotICAgICAg
ICBpZiAod2luZG93SGVpZ2h0ICsgcm93SGVpZ2h0ID4gbV9tYXhIZWlnaHQpIHsKLSAgICAgICAg
ICAgIG1fdmlzaWJsZVJvd3MgPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQot
ICAgICAgICB3aW5kb3dIZWlnaHQgKz0gcm93SGVpZ2h0OwotICAgIH0KLQotICAgIC8vIFNldCBv
dXIgd2lkZ2V0IGFuZCBzY3JvbGxhYmxlIGNvbnRlbnRzIHNpemVzLgotICAgIGludCBzY3JvbGxi
YXJXaWR0aCA9IDA7Ci0gICAgaWYgKG1fdmlzaWJsZVJvd3MgPCBudW1JdGVtcygpKSB7Ci0gICAg
ICAgIHNjcm9sbGJhcldpZHRoID0gU2Nyb2xsYmFyVGhlbWU6Om5hdGl2ZVRoZW1lKCktPnNjcm9s
bGJhclRoaWNrbmVzcygpOwotCi0gICAgICAgIC8vIFVzZSBrTWluRW5kT2ZMaW5lUGFkZGluZyB3
aGVuIHRoZXJlIGlzIGEgc2Nyb2xsYmFyIHNvIHRoYXQgd2UgdXNlCi0gICAgICAgIC8vIGFzIG11
Y2ggYXMgKGxpbmVFbmRQYWRkaW5nV2lkdGggLSBrTWluRW5kT2ZMaW5lUGFkZGluZykgcGFkZGlu
ZwotICAgICAgICAvLyBzcGFjZSBmb3Igc2Nyb2xsYmFyIGFuZCBhbGxvdyB1c2VyIHRvIHVzZSBD
U1MgcGFkZGluZyB0byBtYWtlIHRoZQotICAgICAgICAvLyBwb3B1cCBsaXN0Ym94IGFsaWduIHdp
dGggdGhlIHNlbGVjdCBlbGVtZW50LgotICAgICAgICBwYWRkaW5nV2lkdGggPSBwYWRkaW5nV2lk
dGggLSBsaW5lRW5kUGFkZGluZ1dpZHRoICsga01pbkVuZE9mTGluZVBhZGRpbmc7Ci0gICAgfQot
Ci0gICAgaW50IHdpbmRvd1dpZHRoOwotICAgIGludCBjb250ZW50V2lkdGg7Ci0gICAgaWYgKG1f
c2V0dGluZ3MucmVzdHJpY3RXaWR0aE9mTGlzdEJveCkgewotICAgICAgICB3aW5kb3dXaWR0aCA9
IG1fYmFzZVdpZHRoOwotICAgICAgICBjb250ZW50V2lkdGggPSBtX2Jhc2VXaWR0aCAtIHNjcm9s
bGJhcldpZHRoOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdpbmRvd1dpZHRoID0gYmFzZVdpZHRo
ICsgc2Nyb2xsYmFyV2lkdGggKyBwYWRkaW5nV2lkdGg7Ci0gICAgICAgIGlmICh3aW5kb3dXaWR0
aCA+IG1fbWF4V2luZG93V2lkdGgpIHsKLSAgICAgICAgICAgIC8vIHdpbmRvd1dpZHRoIGV4Y2Vl
ZHMgbV9tYXhXaW5kb3dXaWR0aCwgc28gd2UgaGF2ZSB0byBjbGlwLgotICAgICAgICAgICAgd2lu
ZG93V2lkdGggPSBtX21heFdpbmRvd1dpZHRoOwotICAgICAgICAgICAgYmFzZVdpZHRoID0gd2lu
ZG93V2lkdGggLSBzY3JvbGxiYXJXaWR0aCAtIHBhZGRpbmdXaWR0aDsKLSAgICAgICAgICAgIG1f
YmFzZVdpZHRoID0gYmFzZVdpZHRoOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRlbnRXaWR0aCA9
IHdpbmRvd1dpZHRoIC0gc2Nyb2xsYmFyV2lkdGg7Ci0KLSAgICAgICAgaWYgKHdpbmRvd1dpZHRo
IDwgbV9iYXNlV2lkdGgpIHsKLSAgICAgICAgICAgIHdpbmRvd1dpZHRoID0gbV9iYXNlV2lkdGg7
Ci0gICAgICAgICAgICBjb250ZW50V2lkdGggPSBtX2Jhc2VXaWR0aCAtIHNjcm9sbGJhcldpZHRo
OwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1fYmFzZVdpZHRoID0gYmFzZVdpZHRoOwot
ICAgIH0KLQotICAgIHJlc2l6ZSh3aW5kb3dXaWR0aCwgd2luZG93SGVpZ2h0KTsKLSAgICBzZXRD
b250ZW50c1NpemUoSW50U2l6ZShjb250ZW50V2lkdGgsIGdldFJvd0JvdW5kcyhudW1JdGVtcygp
IC0gMSkubWF4WSgpKSk7Ci0KLSAgICBpZiAoaG9zdFdpbmRvdygpKQotICAgICAgICBzY3JvbGxU
b1JldmVhbFNlbGVjdGlvbigpOwotCi0gICAgaW52YWxpZGF0ZSgpOwotfQotCi12b2lkIFBvcHVw
TGlzdEJveDo6Y2xlYXIoKQotewotICAgIGZvciAoVmVjdG9yPFBvcHVwSXRlbSo+OjppdGVyYXRv
ciBpdCA9IG1faXRlbXMuYmVnaW4oKTsgaXQgIT0gbV9pdGVtcy5lbmQoKTsgKytpdCkKLSAgICAg
ICAgZGVsZXRlICppdDsKLSAgICBtX2l0ZW1zLmNsZWFyKCk7Ci19Ci0KLWJvb2wgUG9wdXBMaXN0
Qm94Ojppc1BvaW50SW5Cb3VuZHMoY29uc3QgSW50UG9pbnQmIHBvaW50KQotewotICAgIHJldHVy
biBudW1JdGVtcygpICE9IDAgJiYgSW50UmVjdCgwLCAwLCB3aWR0aCgpLCBoZWlnaHQoKSkuY29u
dGFpbnMocG9pbnQpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQb3B1cE1lbnVD
aHJvbWl1bSBpbXBsZW1lbnRhdGlvbgotLy8KLS8vIE5vdGU6IHlvdSBjYW5ub3QgYWRkIG1ldGhv
ZHMgdG8gdGhpcyBjbGFzcywgc2luY2UgaXQgaXMgZGVmaW5lZCBhYm92ZSB0aGUKLS8vICAgICAg
IHBvcnRhYmlsaXR5IGxheWVyLiBUbyBhY2Nlc3MgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBvbiB0
aGUKLS8vICAgICAgIHBvcHVwIHdpZGdldHMsIHVzZSB8cG9wdXBXaW5kb3d8IGFib3ZlLgotCiBQ
b3B1cE1lbnVDaHJvbWl1bTo6UG9wdXBNZW51Q2hyb21pdW0oUG9wdXBNZW51Q2xpZW50KiBjbGll
bnQpCiAgICAgOiBtX3BvcHVwQ2xpZW50KGNsaWVudCkKIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2Nocm9taXVtL1BvcHVwTWVudUNocm9taXVtLmggYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9jaHJvbWl1bS9Qb3B1cE1lbnVDaHJvbWl1bS5oCmluZGV4IDgyZDg3OWJk
ZjA1ZTM5NjNkODM4ODJjN2M3YmFjMDllOTY5OTU0NjcuLmVkZDM1NTI2ZjE3YzNkYzY0ZTUxZmMx
ZjA3OTZmNDA0ZWM4MTVlNWUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2No
cm9taXVtL1BvcHVwTWVudUNocm9taXVtLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Y2hyb21pdW0vUG9wdXBNZW51Q2hyb21pdW0uaApAQCAtMzMsMTc2ICszMywxNyBAQAogCiAjaW5j
bHVkZSAiY29uZmlnLmgiCiAKLSNpbmNsdWRlICJGcmFtZWxlc3NTY3JvbGxWaWV3LmgiCi0jaW5j
bHVkZSAiSW50UmVjdC5oIgotI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCiAjaW5jbHVkZSAi
UG9wdXBNZW51LmgiCiAjaW5jbHVkZSAiUG9wdXBNZW51UHJpdmF0ZS5oIgotI2luY2x1ZGUgIlBv
cHVwTWVudVN0eWxlLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgQ2hyb21lQ2xp
ZW50Q2hyb21pdW07CiBjbGFzcyBGcmFtZVZpZXc7Ci1jbGFzcyBQb3B1cExpc3RCb3g7CitjbGFz
cyBJbnRSZWN0OworY2xhc3MgUG9wdXBJdGVtOwogY2xhc3MgUG9wdXBNZW51Q2xpZW50OwogCi0v
LyBBIGNvbnRhaW5lciBmb3IgdGhlIGRhdGEgZm9yIGVhY2ggbWVudSBpdGVtIChlLmcuIHJlcHJl
c2VudGVkIGJ5IDxvcHRpb24+Ci0vLyBvciA8b3B0Z3JvdXA+IGluIGEgPHNlbGVjdD4gd2lkZ2V0
KSBhbmQgaXMgdXNlZCBieSBQb3B1cExpc3RCb3guCi1zdHJ1Y3QgUG9wdXBJdGVtIHsKLSAgICBl
bnVtIFR5cGUgewotICAgICAgICBUeXBlT3B0aW9uLAotICAgICAgICBUeXBlR3JvdXAsCi0gICAg
ICAgIFR5cGVTZXBhcmF0b3IKLSAgICB9OwotCi0gICAgUG9wdXBJdGVtKGNvbnN0IFN0cmluZyYg
bGFiZWwsIFR5cGUgdHlwZSkKLSAgICAgICAgOiBsYWJlbChsYWJlbCkKLSAgICAgICAgLCB0eXBl
KHR5cGUpCi0gICAgICAgICwgeU9mZnNldCgwKQotICAgIHsKLSAgICB9Ci0gICAgU3RyaW5nIGxh
YmVsOwotICAgIFR5cGUgdHlwZTsKLSAgICBpbnQgeU9mZnNldDsgLy8geSBvZmZzZXQgb2YgdGhp
cyBpdGVtLCByZWxhdGl2ZSB0byB0aGUgdG9wIG9mIHRoZSBwb3B1cC4KLSAgICBUZXh0RGlyZWN0
aW9uIHRleHREaXJlY3Rpb247Ci0gICAgYm9vbCBoYXNUZXh0RGlyZWN0aW9uT3ZlcnJpZGU7Ci0g
ICAgYm9vbCBlbmFibGVkOwotfTsKLQotLy8gRklYTUU6IE91ciBGcmFtZWxlc3NTY3JvbGxWaWV3
IGNsYXNzZXMgc2hvdWxkIHByb2JhYmx5IGltcGxlbWVudCBIb3N0V2luZG93IQotCi0vLyBUaGUg
UG9wdXBDb250YWluZXIgY2xhc3MgaG9sZHMgYSBQb3B1cExpc3RCb3ggKHNlZSBjcHAgZmlsZSku
ICBJdHMgc29sZSBwdXJwb3NlIGlzIHRvIGJlCi0vLyBhYmxlIHRvIGRyYXcgYSBib3JkZXIgYXJv
dW5kIGl0cyBjaGlsZC4gIEFsbCBpdHMgcGFpbnQvZXZlbnQgaGFuZGxpbmcgaXMKLS8vIGp1c3Qg
Zm9yd2FyZGVkIHRvIHRoZSBjaGlsZCBsaXN0Qm94ICh3aXRoIHRoZSBhcHByb3ByaWF0ZSB0cmFu
c2Zvcm1zKS4KLS8vIE5PVEU6IHRoaXMgY2xhc3MgaXMgZXhwb3NlZCBzbyBpdCBjYW4gYmUgaW5z
dGFudGlhdGVkIGRpcmVjbHkgZm9yIHRoZQotLy8gYXV0b2ZpbGwgcG9wdXAuICBXZSBjYW5ub3Qg
dXNlIHRoZSBQb3B1cCBjbGFzcyBkaXJlY3RseSBpbiB0aGF0IGNhc2UgYXMgdGhlCi0vLyBhdXRv
ZmlsbCBwb3B1cCBzaG91bGQgbm90IGJlIGZvY3VzZWQgd2hlbiBzaG93biBhbmQgd2Ugd2FudCB0
byBmb3J3YXJkIHRoZQotLy8ga2V5IGV2ZW50cyB0byBpdCAodGhyb3VnaCBoYW5kbGVLZXlFdmVu
dCkuCi0KLXN0cnVjdCBQb3B1cENvbnRhaW5lclNldHRpbmdzIHsKLSAgICAvLyBXaGV0aGVyIHRo
ZSBQb3B1cE1lbnVDbGllbnQgc2hvdWxkIGJlIHRvbGQgdG8gY2hhbmdlIGl0cyB0ZXh0IHdoZW4g
YQotICAgIC8vIG5ldyBpdGVtIGlzIHNlbGVjdGVkIGJ5IHVzaW5nIHRoZSBhcnJvdyBrZXlzLgot
ICAgIGJvb2wgc2V0VGV4dE9uSW5kZXhDaGFuZ2U7Ci0KLSAgICAvLyBXaGV0aGVyIHRoZSBzZWxl
Y3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIHdoZW4gdGhlIHBvcHVwIG1lbnUgaXMKLSAgICAvLyBj
bG9zZWQgKHRocm91Z2ggRVNDIGJlaW5nIHByZXNzZWQgb3IgdGhlIGZvY3VzIGdvaW5nIGF3YXkp
LgotICAgIC8vIE5vdGUgdGhhdCB3aGVuIFRBQiBpcyBwcmVzc2VkLCB0aGUgc2VsZWN0aW9uIGlz
IGFsd2F5cyBhY2NlcHRlZAotICAgIC8vIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgotICAg
IGJvb2wgYWNjZXB0T25BYmFuZG9uOwotCi0gICAgLy8gV2hldGhlciB3ZSBzaG91bGQgbW92ZSB0
aGUgc2VsZWN0aW9uIHRvIHRoZSBmaXJzdC9sYXN0IGl0ZW0gd2hlbgotICAgIC8vIHRoZSB1c2Vy
IHByZXNzZXMgZG93bi91cCBhcnJvdyBrZXlzIGFuZCB0aGUgbGFzdC9maXJzdCBpdGVtIGlzCi0g
ICAgLy8gc2VsZWN0ZWQuCi0gICAgYm9vbCBsb29wU2VsZWN0aW9uTmF2aWdhdGlvbjsKLQotICAg
IC8vIFdoZXRoZXIgd2Ugc2hvdWxkIHJlc3RyaWN0IHRoZSB3aWR0aCBvZiB0aGUgUG9wdXBMaXN0
Qm94IG9yIG5vdC4KLSAgICAvLyBBdXRvY29tcGxldGUgcG9wdXBzIGFyZSByZXN0cmljdGVkLCBj
b21iby1ib3hlcyAoc2VsZWN0IHRhZ3MpIGFyZW4ndC4KLSAgICBib29sIHJlc3RyaWN0V2lkdGhP
Zkxpc3RCb3g7Ci19OwotCi1jbGFzcyBQb3B1cENvbnRhaW5lciA6IHB1YmxpYyBGcmFtZWxlc3NT
Y3JvbGxWaWV3IHsKLXB1YmxpYzoKLSAgICBlbnVtIFBvcHVwVHlwZSB7Ci0gICAgICAgIFNlbGVj
dCwgLy8gSFRNTCBzZWxlY3QgcG9wdXAuCi0gICAgICAgIFN1Z2dlc3Rpb24sIC8vIEF1dG9jb21w
bGV0ZS9hdXRvZmlsbCBwb3B1cC4KLSAgICB9OwotCi0gICAgc3RhdGljIFBhc3NSZWZQdHI8UG9w
dXBDb250YWluZXI+IGNyZWF0ZShQb3B1cE1lbnVDbGllbnQqLCBQb3B1cFR5cGUsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb3B1cENvbnRhaW5l
clNldHRpbmdzJik7Ci0KLSAgICAvLyBXaGV0aGVyIGEga2V5IGV2ZW50IHNob3VsZCBiZSBzZW50
IHRvIHRoaXMgcG9wdXAuCi0gICAgdmlydHVhbCBib29sIGlzSW50ZXJlc3RlZEluRXZlbnRGb3JL
ZXkoaW50IGtleUNvZGUpOwotCi0gICAgLy8gRnJhbWVsZXNzU2Nyb2xsVmlldwotICAgIHZpcnR1
YWwgdm9pZCBwYWludChHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0Jik7Ci0gICAgdmly
dHVhbCB2b2lkIGhpZGUoKTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VEb3duRXZlbnQo
Y29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNl
TW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOwotICAgIHZpcnR1YWwgYm9vbCBo
YW5kbGVNb3VzZVJlbGVhc2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKLSAgICB2
aXJ0dWFsIGJvb2wgaGFuZGxlV2hlZWxFdmVudChjb25zdCBQbGF0Zm9ybVdoZWVsRXZlbnQmKTsK
LSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlS2V5RXZlbnQoY29uc3QgUGxhdGZvcm1LZXlib2FyZEV2
ZW50Jik7Ci0jaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxl
VG91Y2hFdmVudChjb25zdCBQbGF0Zm9ybVRvdWNoRXZlbnQmKTsKLSNlbmRpZgotI2lmIEVOQUJM
RShHRVNUVVJFX1JFQ09HTklaRVIpCi0gICAgdmlydHVhbCBib29sIGhhbmRsZUdlc3R1cmVFdmVu
dChjb25zdCBQbGF0Zm9ybUdlc3R1cmVFdmVudCYpOwotI2VuZGlmCi0KLSAgICAvLyBQb3B1cENv
bnRhaW5lciBtZXRob2RzCi0KLSAgICAvLyBTaG93IHRoZSBwb3B1cAotICAgIHZvaWQgc2hvd1Bv
cHVwKEZyYW1lVmlldyopOwotCi0gICAgLy8gU2hvdyB0aGUgcG9wdXAgaW4gdGhlIHNwZWNpZmll
ZCByZWN0IGZvciB0aGUgc3BlY2lmaWVkIGZyYW1lLgotICAgIC8vIE5vdGU6IHRoaXMgY29kZSB3
YXMgc29tZWhvdyBhcmJpdHJhcmlseSBmYWN0b3JlZC1vdXQgb2YgdGhlIFBvcHVwIGNsYXNzCi0g
ICAgLy8gc28gV2ViVmlld0ltcGwgY2FuIGNyZWF0ZSBhIFBvcHVwQ29udGFpbmVyLiBUaGlzIG1l
dGhvZCBpcyB1c2VkIGZvcgotICAgIC8vIGRpc3BsYXlpbmcgYXV0byBjb21wbGV0ZSBwb3B1cCBt
ZW51cyBvbiBNYWMgQ2hyb21pdW0sIGFuZCBmb3IgYWxsCi0gICAgLy8gcG9wdXBzIG9uIG90aGVy
IHBsYXRmb3Jtcy4KLSAgICB2b2lkIHNob3dJblJlY3QoY29uc3QgSW50UmVjdCYsIEZyYW1lVmll
dyosIGludCBpbmRleCk7Ci0KLSAgICAvLyBIaWRlcyB0aGUgcG9wdXAuCi0gICAgdm9pZCBoaWRl
UG9wdXAoKTsKLQotICAgIC8vIFRoZSBwb3B1cCB3YXMgaGlkZGVuLgotICAgIHZvaWQgbm90aWZ5
UG9wdXBIaWRkZW4oKTsKLQotICAgIC8vIENvbXB1dGUgc2l6ZSBvZiB3aWRnZXQgYW5kIGNoaWxk
cmVuLiBSZXR1cm4gcmlnaHQgb2Zmc2V0IGZvciB0aGUgcG9wdXAgcmlnaHQgYWxpZ25tZW50Lgot
ICAgIGludCBsYXlvdXRBbmRHZXRSVExPZmZzZXQoKTsKLQotICAgIFBvcHVwTGlzdEJveCogbGlz
dEJveCgpIGNvbnN0IHsgcmV0dXJuIG1fbGlzdEJveC5nZXQoKTsgfQotCi0gICAgYm9vbCBpc1JU
TCgpIGNvbnN0OwotCi0gICAgLy8gR2V0cyB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdGhhdCB0aGUg
dXNlciBpcyBjdXJyZW50bHkgbW91c2VkLW92ZXIgb3IKLSAgICAvLyBoYXMgc2VsZWN0ZWQgd2l0
aCB0aGUga2V5Ym9hcmQgdXAvZG93biBhcnJvd3MuCi0gICAgaW50IHNlbGVjdGVkSW5kZXgoKSBj
b25zdDsKLQotICAgIC8vIFJlZnJlc2ggdGhlIHBvcHVwIHZhbHVlcyBmcm9tIHRoZSBQb3B1cE1l
bnVDbGllbnQuCi0gICAgdm9pZCByZWZyZXNoKGNvbnN0IEludFJlY3QmIHRhcmdldENvbnRyb2xS
ZWN0KTsKLQotICAgIC8vIFRoZSBtZW51IHBlci1pdGVtIGRhdGEuCi0gICAgY29uc3QgV1RGOjpW
ZWN0b3I8UG9wdXBJdGVtKj4mIHBvcHVwRGF0YSgpIGNvbnN0OwotCi0gICAgLy8gVGhlIGhlaWdo
dCBvZiBhIHJvdyBpbiB0aGUgbWVudS4KLSAgICBpbnQgbWVudUl0ZW1IZWlnaHQoKSBjb25zdDsK
LQotICAgIC8vIFRoZSBzaXplIG9mIHRoZSBmb250IGJlaW5nIHVzZWQuCi0gICAgaW50IG1lbnVJ
dGVtRm9udFNpemUoKSBjb25zdDsKLQotICAgIC8vIFRoZSBzdHlsZSBvZiB0aGUgbWVudSBiZWlu
ZyB1c2VkLgotICAgIFBvcHVwTWVudVN0eWxlIG1lbnVTdHlsZSgpIGNvbnN0OwotCi0gICAgUG9w
dXBUeXBlIHBvcHVwVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fcG9wdXBUeXBlOyB9Ci0KLSAgICAv
LyBXaGlsZSBob3ZlcmluZyBwb3B1cCBtZW51IHdpbmRvdywgd2Ugd2FudCB0byBzaG93IHRvb2wg
dGlwIG1lc3NhZ2UuCi0gICAgU3RyaW5nIGdldFNlbGVjdGVkSXRlbVRvb2xUaXAoKTsKLQotcHJp
dmF0ZToKLSAgICBmcmllbmQgY2xhc3MgV1RGOjpSZWZDb3VudGVkPFBvcHVwQ29udGFpbmVyPjsK
LQotICAgIFBvcHVwQ29udGFpbmVyKFBvcHVwTWVudUNsaWVudCosIFBvcHVwVHlwZSwgY29uc3Qg
UG9wdXBDb250YWluZXJTZXR0aW5ncyYpOwotICAgIH5Qb3B1cENvbnRhaW5lcigpOwotCi0gICAg
Ly8gUGFpbnQgdGhlIGJvcmRlci4KLSAgICB2b2lkIHBhaW50Qm9yZGVyKEdyYXBoaWNzQ29udGV4
dCosIGNvbnN0IEludFJlY3QmKTsKLQotICAgIC8vIExheW91dCBhbmQgY2FsY3VsYXRlIHBvcHVw
IHdpZGdldCBzaXplIGFuZCBsb2NhdGlvbiBhbmQgcmV0dXJucyBpdCBhcyBJbnRSZWN0LgotICAg
IEludFJlY3QgbGF5b3V0QW5kQ2FsY3VsYXRlV2lkZ2V0UmVjdChpbnQgdGFyZ2V0Q29udHJvbEhl
aWdodCwgY29uc3QgSW50UG9pbnQmIHBvcHVwSW5pdGlhbENvb3JkaW5hdGUpOwotCi0gICAgLy8g
UmV0dXJucyB0aGUgQ2hyb21lQ2xpZW50IG9mIHRoZSBwYWdlIHRoaXMgcG9wdXAgaXMgYXNzb2Np
YXRlZCB3aXRoLgotICAgIENocm9tZUNsaWVudENocm9taXVtKiBjaHJvbWVDbGllbnRDaHJvbWl1
bSgpOwotCi0gICAgUmVmUHRyPFBvcHVwTGlzdEJveD4gbV9saXN0Qm94OwotICAgIFJlZlB0cjxG
cmFtZVZpZXc+IG1fZnJhbWVWaWV3OwotCi0gICAgUG9wdXBDb250YWluZXJTZXR0aW5ncyBtX3Nl
dHRpbmdzOwotICAgIFBvcHVwVHlwZSBtX3BvcHVwVHlwZTsKLSAgICBJbnRSZWN0IG1fb3JpZ2lu
YWxGcmFtZVJlY3Q7Ci0gICAgLy8gV2hldGhlciB0aGUgcG9wdXAgaXMgY3VycmVudGx5IG9wZW4u
Ci0gICAgYm9vbCBtX3BvcHVwT3BlbjsKLX07Ci0KIGNsYXNzIFBvcHVwTWVudUNocm9taXVtIDog
cHVibGljIFBvcHVwTWVudSB7CiBwdWJsaWM6CiAgICAgUG9wdXBNZW51Q2hyb21pdW0oUG9wdXBN
ZW51Q2xpZW50Kik7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxv
ZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCmluZGV4IGM2MzY4YzNmZWM0MjAx
YWJjZGFlYzIyZTQxNjMyYzExY2Y5OTQyYmMuLmRkZjA0NTg5N2JkZWRmYmZhMTNiOTJiNjVkZmUy
NzU2ZTM4YWVhMGEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9n
CisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAK
KzIwMTEtMDgtMTIgIEZhZHkgU2FtdWVsICA8ZnNhbXVlbEBjaHJvbWl1bS5vcmc+CisKKyAgICAg
ICAgUmVmYWN0b3Jpbmcgb2YgUG9wdXBNZW51Q2hyb21pdW0gRm9yIFJlYWRhYmlsaXR5IGFuZCBN
YWludGFpbmFiaWxpdHkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTY2MDA5CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgKiBzcmMvQ2hyb21lQ2xpZW50SW1wbC5jcHA6CisgICAgICAgICogc3JjL1dlYlBvcHVw
TWVudUltcGwuY3BwOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6CisgICAgICAgICog
dGVzdHMvUG9wdXBNZW51VGVzdC5jcHA6CisKIDIwMTEtMDgtMTIgIFNoZXJpZmYgQm90ICA8d2Vi
a2l0LnJldmlldy5ib3RAZ21haWwuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcg
b3V0IHI5Mjk3Ni4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0Nocm9t
ZUNsaWVudEltcGwuY3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xpZW50
SW1wbC5jcHAKaW5kZXggMjBiYjVhNGNjZThkNmUwZTk2NDQ1ZjhlYWNiODEyODM2MmU3M2IzNC4u
MGIyMWM5YjlmM2Q5NDVlY2JiNTVkODUzNWJhOTdhZmU0YmMzNDA2ZCAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xpZW50SW1wbC5jcHAKKysrIGIvU291cmNl
L1dlYktpdC9jaHJvbWl1bS9zcmMvQ2hyb21lQ2xpZW50SW1wbC5jcHAKQEAgLTU3LDYgKzU3LDcg
QEAKICNpbmNsdWRlICJOb3RpZmljYXRpb25QcmVzZW50ZXJJbXBsLmgiCiAjaW5jbHVkZSAiUGFn
ZS5oIgogI2luY2x1ZGUgIlBsYXRmb3JtQnJpZGdlLmgiCisjaW5jbHVkZSAiUG9wdXBDb250YWlu
ZXIuaCIKICNpbmNsdWRlICJQb3B1cE1lbnVDaHJvbWl1bS5oIgogI2luY2x1ZGUgIlJlbmRlcldp
ZGdldC5oIgogI2luY2x1ZGUgIlNjcmlwdENvbnRyb2xsZXIuaCIKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYlBvcHVwTWVudUltcGwuY3BwIGIvU291cmNlL1dlYktp
dC9jaHJvbWl1bS9zcmMvV2ViUG9wdXBNZW51SW1wbC5jcHAKaW5kZXggZTI2NjhiMWI4NGQ5ZjQy
YWRjYWJmMzE5MDRiYzhiNjhkMDUwM2YyYS4uNGUxYjFlNjYwZjI2N2M0OTI0MDk0MjA3NTM0Njk5
NWM5NDMzOTE3MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViUG9w
dXBNZW51SW1wbC5jcHAKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViUG9wdXBN
ZW51SW1wbC5jcHAKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlICJQbGF0Zm9ybUtleWJvYXJk
RXZlbnQuaCIKICNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKICNpbmNsdWRlICJQbGF0
Zm9ybVdoZWVsRXZlbnQuaCIKKyNpbmNsdWRlICJQb3B1cENvbnRhaW5lci5oIgogI2luY2x1ZGUg
IlBvcHVwTWVudUNocm9taXVtLmgiCiAjaW5jbHVkZSAiU2tpYVV0aWxzLmgiCiAKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcCBiL1NvdXJjZS9X
ZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAppbmRleCA4ZjgzODA4YzY5MWU5NmE5
MmNlMzU5ZjEyNzgzNTAwZWQwMjYyMGNkLi5hMjFmMzRkM2NlNjZmYWRkMjc4ZDJmYTA1Y2U4MDA0
MTc3MjhjOTExIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3
SW1wbC5jcHAKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3Bw
CkBAIC04NSw3ICs4NSw3IEBACiAjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCiAjaW5j
bHVkZSAiUGxhdGZvcm1UaGVtZUNocm9taXVtR3RrLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1XaGVl
bEV2ZW50LmgiCi0jaW5jbHVkZSAiUG9wdXBNZW51Q2hyb21pdW0uaCIKKyNpbmNsdWRlICJQb3B1
cENvbnRhaW5lci5oIgogI2luY2x1ZGUgIlBvcHVwTWVudUNsaWVudC5oIgogI2luY2x1ZGUgIlBy
b2dyZXNzVHJhY2tlci5oIgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvUG9wdXBNZW51VGVzdC5jcHAgYi9Tb3VyY2UvV2Vi
S2l0L2Nocm9taXVtL3Rlc3RzL1BvcHVwTWVudVRlc3QuY3BwCmluZGV4IGVkOTg2MDU5MzFjMGNj
MGIzNDZkZDcyMWZlZGEyNGE0NjQ5ZTg1Y2UuLjMwOTI3MmFjNzQyMTAyOTBiZTVhZjhjM2U1NTdm
OGIwYmQ1Mjg5ZGIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvUG9w
dXBNZW51VGVzdC5jcHAKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9Qb3B1cE1l
bnVUZXN0LmNwcApAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNs
dWRlICJGcmFtZVZpZXcuaCIKICNpbmNsdWRlICJLZXlib2FyZENvZGVzLmgiCisjaW5jbHVkZSAi
UG9wdXBDb250YWluZXIuaCIKICNpbmNsdWRlICJQb3B1cE1lbnUuaCIKICNpbmNsdWRlICJQb3B1
cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJQb3B1cE1lbnVDaHJvbWl1bS5oIgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>