<?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>211937</bug_id>
          
          <creation_ts>2020-05-14 21:18:40 -0700</creation_ts>
          <short_desc>[LFC][TFC] Move column and row balancing logic to a dedicated class</short_desc>
          <delta_ts>2020-05-15 07:45:16 -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>Layout and Rendering</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="alan">zalan</reporter>
          <assigned_to name="alan">zalan</assigned_to>
          <cc>bfulgham</cc>
    
    <cc>koivisto</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>zalan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1652940</commentid>
    <comment_count>0</comment_count>
    <who name="alan">zalan</who>
    <bug_when>2020-05-14 21:18:40 -0700</bug_when>
    <thetext>class TableLayout</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1652943</commentid>
    <comment_count>1</comment_count>
      <attachid>399454</attachid>
    <who name="alan">zalan</who>
    <bug_when>2020-05-14 21:26:24 -0700</bug_when>
    <thetext>Created attachment 399454
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1653049</commentid>
    <comment_count>2</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2020-05-15 07:44:58 -0700</bug_when>
    <thetext>Committed r261745: &lt;https://trac.webkit.org/changeset/261745&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 399454.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1653050</commentid>
    <comment_count>3</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-05-15 07:45:16 -0700</bug_when>
    <thetext>&lt;rdar://problem/63272486&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>399454</attachid>
            <date>2020-05-14 21:26:24 -0700</date>
            <delta_ts>2020-05-15 07:44:58 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-211937-20200514212623.patch</filename>
            <type>text/plain</type>
            <size>46467</size>
            <attacher name="alan">zalan</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjYwNTc2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjU5YThmYzQ1ZGQ4YTdj
YTllNWNhNGUzNjZlZTZjM2M3NWU2OTFiZi4uNGE0ZDQwZDM2ZTU5M2I1ZTM4YWZlNzM3ODVhNGY5
ZmNiOTM0MGU1YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDUxIEBACisyMDIwLTA1LTE0ICBaYWxh
biBCdWp0YXMgIDx6YWxhbkBhcHBsZS5jb20+CisKKyAgICAgICAgW0xGQ11bVEZDXSBNb3ZlIGNv
bHVtbiBhbmQgcm93IGJhbGFuY2luZyBsb2dpYyB0byBhIGRlZGljYXRlZCBjbGFzcworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjExOTM3CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBTb3VyY2VzLnR4dDoK
KyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICog
bGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OkxheW91dDo6VGFibGVGb3JtYXR0aW5nQ29udGV4dDo6bGF5b3V0SW5GbG93
Q29udGVudCk6CisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OlRhYmxlRm9ybWF0dGluZ0NvbnRl
eHQ6OnNldFVzZWRHZW9tZXRyeUZvclJvd3MpOgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpU
YWJsZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlQW5kRGlzdHJpYnV0ZUV4dHJhU3BhY2UpOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpDb2x1bW5TcGFuOjpoYXNTcGFuKTogRGVsZXRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6Q29sdW1uU3Bhbjo6aXNTcGFubmVkKTogRGVsZXRl
ZC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6Q29sdW1uU3Bhbjo6c3BhbkNvdW50KTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6Q29sdW1uU3Bhbjo6c3RhcnRTcGFuKTog
RGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6Q29sdW1uU3Bhbjo6ZW5kU3Bhbik6
IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkNvbHVtblNwYW46OmluZGV4KTog
RGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6Q29sdW1uU3Bhbjo6c2l6ZSk6IERl
bGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OkNvbHVtblNwYW46OnNwYWNpbmcpOiBE
ZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0OjpSb3dTcGFuOjpoYXNTcGFuKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6Um93U3Bhbjo6aXNTcGFubmVkKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6Um93U3Bhbjo6c3BhbkNvdW50KTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6Um93U3Bhbjo6c3RhcnRTcGFuKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6Um93U3Bhbjo6ZW5kU3Bhbik6IERlbGV0
ZWQuCisgICAgICAgIChXZWJDb3JlOjpMYXlvdXQ6OlJvd1NwYW46OmluZGV4KTogRGVsZXRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6Um93U3Bhbjo6c2l6ZSk6IERlbGV0ZWQuCisgICAg
ICAgIChXZWJDb3JlOjpMYXlvdXQ6OlJvd1NwYW46OnNwYWNpbmcpOiBEZWxldGVkLgorICAgICAg
ICAoV2ViQ29yZTo6TGF5b3V0OjpHcmlkU3BhY2U6OmlzRW1wdHkgY29uc3QpOiBEZWxldGVkLgor
ICAgICAgICAoKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6bWF4KTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6b3BlcmF0b3ItKTogRGVsZXRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OkxheW91dDo6b3BlcmF0b3IrPSk6IERlbGV0ZWQuCisgICAgICAgIChX
ZWJDb3JlOjpMYXlvdXQ6Om9wZXJhdG9yLT0pOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6
TGF5b3V0OjpvcGVyYXRvci8pOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6TGF5b3V0Ojpk
aXN0cmlidXRlQXZhaWxhYmxlU3BhY2UpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6TGF5
b3V0OjpUYWJsZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlQW5kRGlzdHJpYnV0ZUV4dHJhSG9y
aXpvbnRhbFNwYWNlKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6VGFibGVG
b3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUFuZERpc3RyaWJ1dGVFeHRyYVZlcnRpY2FsU3BhY2Up
OiBEZWxldGVkLgorICAgICAgICAqIGxheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0
aW5nQ29udGV4dC5oOgorICAgICAgICAqIGxheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3Jt
YXR0aW5nU3RhdGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6VGFibGVGb3JtYXR0aW5n
U3RhdGU6OnRhYmxlR3JpZCBjb25zdCk6CisgICAgICAgICogbGF5b3V0L3RhYmxlZm9ybWF0dGlu
Zy9UYWJsZUdyaWQuaDoKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6VGFibGVHcmlkOjp3aWR0
aENvbnN0cmFpbnRzIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6VGFibGVHcmlk
OjpSb3dzOjpsaXN0IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6VGFibGVHcmlk
Ojp3aWR0aENvbnN0cmFpbnRzKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkxheW91dDo6
VGFibGVHcmlkOjpSb3dzOjpyb3dMaXN0IGNvbnN0KTogRGVsZXRlZC4KKwogMjAyMC0wNS0xMyAg
WmFsYW4gQnVqdGFzICA8emFsYW5AYXBwbGUuY29tPgogCiAgICAgICAgIFtMRkNdW1RGQ10gQWRk
IHN1cHBvcnQgZm9yIGNhc2VzIHdoZW4gdGhlIGJhbGFuY2luZyBpcyBub3QgYmFzZWQgb24gdGhl
IGluaXRpYWwgd2lkdGgKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1NvdXJjZXMudHh0IGIv
U291cmNlL1dlYkNvcmUvU291cmNlcy50eHQKaW5kZXggNmYxNTRmMTM5YzA0ZDU4YjQ4Njk5OTc5
N2NhZGUzZjA3MzY4OTg3OS4uMjJlYmY4MjMxMmQyMmY4OWZlNTg5NzdhNTRlODIxZWM5OTY2MjA5
NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvU291cmNlcy50eHQKKysrIGIvU291cmNlL1dl
YkNvcmUvU291cmNlcy50eHQKQEAgLTE0OTAsNiArMTQ5MCw3IEBAIGxheW91dC90YWJsZWZvcm1h
dHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAKIGxheW91dC90YWJsZWZvcm1hdHRpbmcv
VGFibGVGb3JtYXR0aW5nQ29udGV4dEdlb21ldHJ5LmNwcAogbGF5b3V0L3RhYmxlZm9ybWF0dGlu
Zy9UYWJsZUZvcm1hdHRpbmdTdGF0ZS5jcHAKIGxheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVH
cmlkLmNwcAorbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUxheW91dC5jcHAKIAogbG9hZGVy
L0FkQ2xpY2tBdHRyaWJ1dGlvbi5jcHAKIGxvYWRlci9DYW52YXNBY3Rpdml0eVJlY29yZC5jcHAK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvaiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpp
bmRleCA1MTEyNTZjODlhM2U1NmE2N2Y1NzMzOGRlM2M0NDg1M2VhMDczYTY4Li5kYzNkMjQwMTUx
MzIwNTgwMzU0ZDI0YzA0NWM3OGI3YzYyN2VlMDRkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKysrIGIvU291cmNlL1dlYkNvcmUv
V2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC05NDYyLDYgKzk0NjIsNyBAQAog
CQk2RkU4RTZGODIzN0JBNkIyMDA3NThEMjYgLyogSW52YWxpZGF0aW9uU3RhdGUuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
cHAuY3BwOyBwYXRoID0gSW52YWxpZGF0aW9uU3RhdGUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQk2RkU5RjA5MjIyMjExMDM1MDA0QzUwODIgLyogQ29udGVudENoYW5nZU9ic2Vy
dmVyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IENvbnRlbnRDaGFu
Z2VPYnNlcnZlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTZGRUZFODFEMjJG
OUQyMkEwMDExNDkyNyAvKiBMYXlvdXRQaGFzZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBMYXlvdXRQaGFz
ZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk2RkY5RjFCRTI0NkQ5NjZDMDA0MzUw
ODMgLyogVGFibGVMYXlvdXQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gVGFibGVMYXlvdXQuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk2RkZBNEJGRTIzRjJGRUNEMDA3RTRFQkMg
LyogTGF5b3V0TGluZUJyZWFrQm94LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IExheW91dExpbmVC
cmVha0JveC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTZGRkE0QzAwMjNGMkZF
RDkwMDdFNEVCQyAvKiBMYXlvdXRMaW5lQnJlYWtCb3guaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gTGF5b3V0TGluZUJyZWFrQm94Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCTZGRkRDNDNFMjEyRUZGMTYwMEE5Q0E5MSAvKiBGbG9hdEF2b2lkZXIuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRmxvYXRBdm9pZGVyLmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTIxMTk3LDYgKzIxMTk4LDcgQEAKIAkJCWNoaWxkcmVu
ID0gKAogCQkJCTZGQzVDQTk0MjJFMzU5OTQwMEIxM0UxMSAvKiBUYWJsZUZvcm1hdHRpbmdDb250
ZXh0LmNwcCAqLywKIAkJCQk2RkM1Q0E5NTIyRTM1OTk0MDBCMTNFMTEgLyogVGFibGVGb3JtYXR0
aW5nQ29udGV4dC5oICovLAorCQkJCTZGRjlGMUJFMjQ2RDk2NkMwMDQzNTA4MyAvKiBUYWJsZUxh
eW91dC5jcHAgKi8sCiAJCQkJMTFEMTlDMkUyMzE1OUJBRTAwOEYyNEQzIC8qIFRhYmxlRm9ybWF0
dGluZ0NvbnRleHRHZW9tZXRyeS5jcHAgKi8sCiAJCQkJNkZDNUNBOTIyMkUzNTk5MzAwQjEzRTEx
IC8qIFRhYmxlRm9ybWF0dGluZ1N0YXRlLmNwcCAqLywKIAkJCQk2RkM1Q0E5NjIyRTM1OTk1MDBC
MTNFMTEgLyogVGFibGVGb3JtYXR0aW5nU3RhdGUuaCAqLywKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4dC5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0Nv
bnRleHQuY3BwCmluZGV4IDQyMjVkYzI4MzM3M2Q2YjY0MWQ2M2U3MjBjMTcyMDFlNjk2MzIxNjIu
LjRiNTc0ZWIzNjIzNWRlNDllN2YzMWQ0ZmEzNjM5N2QwNzRlMDM1ODMgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVGb3JtYXR0aW5nQ29udGV4
dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZv
cm1hdHRpbmdDb250ZXh0LmNwcApAQCAtNTMsOCArNTMsNyBAQCB2b2lkIFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQ6OmxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBD
b25zdAogICAgIGF1dG8gYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlID0gY29uc3RyYWludHMuaG9y
aXpvbnRhbC5sb2dpY2FsV2lkdGg7CiAgICAgYXV0byBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlID0g
Y29uc3RyYWludHMudmVydGljYWwubG9naWNhbEhlaWdodDsKICAgICAvLyAxLiBDb21wdXRlIHdp
ZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSBncmlkLgotICAgIGNvbXB1dGVBbmREaXN0cmlidXRlRXh0
cmFIb3Jpem9udGFsU3BhY2UoYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlKTsKLSAgICBjb21wdXRl
QW5kRGlzdHJpYnV0ZUV4dHJhVmVydGljYWxTcGFjZShhdmFpbGFibGVIb3Jpem9udGFsU3BhY2Us
IGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpOworICAgIGNvbXB1dGVBbmREaXN0cmlidXRlRXh0cmFT
cGFjZShhdmFpbGFibGVIb3Jpem9udGFsU3BhY2UsIGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpOwog
ICAgIC8vIDIuIEZpbmFsaXplIGNlbGxzLgogICAgIHNldFVzZWRHZW9tZXRyeUZvckNlbGxzKGF2
YWlsYWJsZUhvcml6b250YWxTcGFjZSk7CiAgICAgLy8gMy4gRmluYWxpemUgcm93cy4KQEAgLTEx
MSw5ICsxMTAsMTEgQEAgdm9pZCBUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpzZXRVc2VkR2VvbWV0
cnlGb3JDZWxscyhMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b24KIHZvaWQgVGFibGVGb3JtYXR0
aW5nQ29udGV4dDo6c2V0VXNlZEdlb21ldHJ5Rm9yUm93cyhMYXlvdXRVbml0IGF2YWlsYWJsZUhv
cml6b250YWxTcGFjZSkKIHsKICAgICBhdXRvJiBncmlkID0gZm9ybWF0dGluZ1N0YXRlKCkudGFi
bGVHcmlkKCk7CisgICAgYXV0byYgcm93cyA9IGdyaWQucm93cygpLmxpc3QoKTsKKwogICAgIGF1
dG8gcm93V2lkdGggPSBncmlkLmNvbHVtbnMoKS5sb2dpY2FsV2lkdGgoKSArIDIgKiBncmlkLmhv
cml6b250YWxTcGFjaW5nKCk7CiAgICAgYXV0byByb3dMb2dpY2FsVG9wID0gZ3JpZC52ZXJ0aWNh
bFNwYWNpbmcoKTsKLSAgICBmb3IgKGF1dG8mIHJvdyA6IGdyaWQucm93cygpLmxpc3QoKSkgewor
ICAgIGZvciAoYXV0byYgcm93IDogcm93cykgewogICAgICAgICBhdXRvJiByb3dCb3ggPSByb3cu
Ym94KCk7CiAgICAgICAgIGF1dG8mIHJvd0Rpc3BsYXlCb3ggPSBmb3JtYXR0aW5nU3RhdGUoKS5k
aXNwbGF5Qm94KHJvd0JveCk7CiAgICAgICAgIGNvbXB1dGVCb3JkZXJBbmRQYWRkaW5nKHJvd0Jv
eCwgSG9yaXpvbnRhbENvbnN0cmFpbnRzIHsgeyB9LCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2Ug
fSk7CkBAIC0xMzAsNiArMTMxLDIzIEBAIHZvaWQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6c2V0
VXNlZEdlb21ldHJ5Rm9yUm93cyhMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250CiAgICAgICAg
IHJvdy5zZXRMb2dpY2FsVG9wKHJvd0xvZ2ljYWxUb3ApOwogICAgICAgICByb3dMb2dpY2FsVG9w
ICs9IHJvdy5sb2dpY2FsSGVpZ2h0KCkgKyBncmlkLnZlcnRpY2FsU3BhY2luZygpOwogICAgIH0K
KworICAgIGF1dG8mIGNvbHVtbnMgPSBncmlkLmNvbHVtbnMoKTsKKyAgICBWZWN0b3I8SW5saW5l
TGF5b3V0VW5pdD4gcm93QmFzZWxpbmVzKHJvd3Muc2l6ZSgpKTsKKyAgICAvLyBOb3cgdGhhdCBj
ZWxscyBhcmUgbGFpZCBvdXQsIGxldCdzIGNvbXB1dGUgdGhlIHJvdyBiYXNlbGluZXMuCisgICAg
Zm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0lu
ZGV4KSB7CisgICAgICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXgg
PCBjb2x1bW5zLnNpemUoKTsgKytjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgYXV0byYgc2xv
dCA9ICpncmlkLnNsb3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7CisgICAgICAgICAgICBp
ZiAoc2xvdC5pc1Jvd1NwYW5uZWQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIGlmIChzbG90Lmhhc1Jvd1NwYW4oKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIGF1dG8mIGNlbGwgPSBzbG90LmNlbGwoKTsKKyAgICAgICAgICAgIHJvd0Jh
c2VsaW5lc1tyb3dJbmRleF0gPSBzdGQ6Om1heChyb3dCYXNlbGluZXNbcm93SW5kZXhdLCBjZWxs
LmJhc2VsaW5lT2Zmc2V0KCkpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IHJv
d0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkKKyAgICAgICAg
cm93c1tyb3dJbmRleF0uc2V0QmFzZWxpbmVPZmZzZXQocm93QmFzZWxpbmVzW3Jvd0luZGV4XSk7
CiB9CiAKIHZvaWQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6c2V0VXNlZEdlb21ldHJ5Rm9yU2Vj
dGlvbnMoY29uc3QgQ29uc3RyYWludHNGb3JJbkZsb3dDb250ZW50JiBjb25zdHJhaW50cykKQEAg
LTM1MCwyNTcgKzM2OCwyNyBAQCBGb3JtYXR0aW5nQ29udGV4dDo6SW50cmluc2ljV2lkdGhDb25z
dHJhaW50cyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0Ojpjb21wdXRlZFByZQogICAgIHJldHVybiB0
YWJsZVdpZHRoQ29uc3RyYWludHM7CiB9CiAKLXN0cnVjdCBDb2x1bW5TcGFuIHsKLSAgICBzdGF0
aWMgc2l6ZV90IGhhc1NwYW4oY29uc3QgVGFibGVHcmlkOjpTbG90JiBzbG90KSB7IHJldHVybiBz
bG90Lmhhc0NvbHVtblNwYW4oKTsgfQotICAgIHN0YXRpYyBzaXplX3QgaXNTcGFubmVkKGNvbnN0
IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCkgeyByZXR1cm4gc2xvdC5pc0NvbHVtblNwYW5uZWQoKTsg
fQotCi0gICAgc3RhdGljIHNpemVfdCBzcGFuQ291bnQoY29uc3QgVGFibGVHcmlkOjpDZWxsJiBj
ZWxsKSB7IHJldHVybiBjZWxsLmNvbHVtblNwYW4oKTsgfQotICAgIHN0YXRpYyBzaXplX3Qgc3Rh
cnRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5zdGFydENv
bHVtbigpOyB9Ci0gICAgc3RhdGljIHNpemVfdCBlbmRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2Vs
bCYgY2VsbCkgeyByZXR1cm4gY2VsbC5lbmRDb2x1bW4oKTsgfQotCi0gICAgc3RhdGljIHNpemVf
dCBpbmRleChzaXplX3QgY29sdW1uSW5kZXgsIHNpemVfdCAvKnJvd0luZGV4Ki8pIHsgcmV0dXJu
IGNvbHVtbkluZGV4OyB9Ci0gICAgc3RhdGljIHNpemVfdCBzaXplKGNvbnN0IFRhYmxlR3JpZCYg
Z3JpZCkgeyByZXR1cm4gZ3JpZC5jb2x1bW5zKCkuc2l6ZSgpOyB9Ci0KLSAgICBzdGF0aWMgTGF5
b3V0VW5pdCBzcGFjaW5nKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5ob3Jp
em9udGFsU3BhY2luZygpOyB9Ci19OwotCi1zdHJ1Y3QgUm93U3BhbiB7Ci0gICAgc3RhdGljIHNp
emVfdCBoYXNTcGFuKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCkgeyByZXR1cm4gc2xvdC5o
YXNSb3dTcGFuKCk7IH0KLSAgICBzdGF0aWMgc2l6ZV90IGlzU3Bhbm5lZChjb25zdCBUYWJsZUdy
aWQ6OlNsb3QmIHNsb3QpIHsgcmV0dXJuIHNsb3QuaXNSb3dTcGFubmVkKCk7IH0KLQotICAgIHN0
YXRpYyBzaXplX3Qgc3BhbkNvdW50KGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1
cm4gY2VsbC5yb3dTcGFuKCk7IH0KLSAgICBzdGF0aWMgc2l6ZV90IHN0YXJ0U3Bhbihjb25zdCBU
YWJsZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJuIGNlbGwuc3RhcnRSb3coKTsgfQotICAgIHN0
YXRpYyBzaXplX3QgZW5kU3Bhbihjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJu
IGNlbGwuZW5kUm93KCk7IH0KLQotICAgIHN0YXRpYyBzaXplX3QgaW5kZXgoc2l6ZV90IC8qY29s
dW1uSW5kZXgqLywgc2l6ZV90IHJvd0luZGV4KSB7IHJldHVybiByb3dJbmRleDsgfQotICAgIHN0
YXRpYyBzaXplX3Qgc2l6ZShjb25zdCBUYWJsZUdyaWQmIGdyaWQpIHsgcmV0dXJuIGdyaWQucm93
cygpLnNpemUoKTsgfQotCi0gICAgc3RhdGljIExheW91dFVuaXQgc3BhY2luZyhjb25zdCBUYWJs
ZUdyaWQmIGdyaWQpIHsgcmV0dXJuIGdyaWQudmVydGljYWxTcGFjaW5nKCk7IH0KLX07Ci0KLXN0
cnVjdCBHcmlkU3BhY2UgewotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICF2YWx1
ZTsgfQotCi0gICAgLy8gSW5pdGlhbCB3aWR0aC9oZWlnaHQgZm9yIGNvbHVtbi9yb3cgd2Ugc3Rh
cnQgdGhlIGRpc3RyaWJ1dGlvbiB3aWR0aCAodXN1YWxseSBhIG1pbnVtdW0gd2lkdGgpLgotICAg
IGZsb2F0IHZhbHVlIHsgMCB9OwotICAgIC8vIFRoZSBiYXNlIHRvIGNvbXB1dGUgdGhlIGRpc3Ry
aWJ1dGlvbiByYXRpby4gSXQgbm9ybWFsbHkgbWF0Y2hlcyB0aGUgW3ZhbHVlXSBidXQgaW4gc29t
ZSBjYXNlcyB3ZSB1c2UgdGhlIG1heGltdW0gdmFsdWUgdG8gZGlzdHJpYnV0ZSB0aGUgZXh0cmEg
c3BhY2UuIAotICAgIGZsb2F0IGRpc3RyaWJ1dGlvbkJhc2UgeyAwIH07Ci19OwotCi1pbmxpbmUg
c3RhdGljIEdyaWRTcGFjZSBtYXgoY29uc3QgR3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2Um
IGIpCi17Ci0gICAgcmV0dXJuIHsgc3RkOjptYXgoYS52YWx1ZSwgYi52YWx1ZSksIHN0ZDo6bWF4
KGEuZGlzdHJpYnV0aW9uQmFzZSwgYi5kaXN0cmlidXRpb25CYXNlKSB9OwotfQotCi1pbmxpbmUg
c3RhdGljIEdyaWRTcGFjZSYgb3BlcmF0b3ItKEdyaWRTcGFjZSYgYSwgY29uc3QgR3JpZFNwYWNl
JiBiKQotewotICAgIGEudmFsdWUgPSBzdGQ6Om1heCgwLjBmLCBhLnZhbHVlIC0gYi52YWx1ZSk7
Ci0gICAgYS5kaXN0cmlidXRpb25CYXNlID0gc3RkOjptYXgoMC4wZiwgYS5kaXN0cmlidXRpb25C
YXNlIC0gYi5kaXN0cmlidXRpb25CYXNlKTsKLSAgICByZXR1cm4gYTsKLX0KLQotaW5saW5lIHN0
YXRpYyBHcmlkU3BhY2UmIG9wZXJhdG9yKz0oR3JpZFNwYWNlJiBhLCBjb25zdCBHcmlkU3BhY2Um
IGIpCi17Ci0gICAgYS52YWx1ZSArPSBiLnZhbHVlOwotICAgIGEuZGlzdHJpYnV0aW9uQmFzZSAr
PSBiLmRpc3RyaWJ1dGlvbkJhc2U7Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLWlubGluZSBzdGF0aWMg
R3JpZFNwYWNlJiBvcGVyYXRvci09KEdyaWRTcGFjZSYgYSwgY29uc3QgR3JpZFNwYWNlJiBiKQot
ewotICAgIHJldHVybiBhIC0gYjsKLX0KLQotaW5saW5lIHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJh
dG9yLyhHcmlkU3BhY2UmIGEsIHVuc2lnbmVkIHZhbHVlKQotewotICAgIGEudmFsdWUgLz0gdmFs
dWU7Ci0gICAgYS5kaXN0cmlidXRpb25CYXNlIC89IHZhbHVlOwotICAgIHJldHVybiBhOwotfQot
Ci11c2luZyBEaXN0cmlidXRlZFNwYWNlcyA9IFZlY3RvcjxmbG9hdD47Ci10ZW1wbGF0ZSA8dHlw
ZW5hbWUgU3BhblR5cGU+Ci1zdGF0aWMgRGlzdHJpYnV0ZWRTcGFjZXMgZGlzdHJpYnV0ZUF2YWls
YWJsZVNwYWNlKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCwgTGF5b3V0VW5pdCBhdmFpbGFibGVTcGFj
ZSwgY29uc3QgV1RGOjpGdW5jdGlvbjxHcmlkU3BhY2UoY29uc3QgVGFibGVHcmlkOjpTbG90Jiwg
c2l6ZV90KT4mIHNsb3RTcGFjZSkKK3ZvaWQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0
ZUFuZERpc3RyaWJ1dGVFeHRyYVNwYWNlKExheW91dFVuaXQgYXZhaWxhYmxlSG9yaXpvbnRhbFNw
YWNlLCBPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKQogewotICAg
IHN0cnVjdCBSZXNvbHZlZEl0ZW0gewotICAgICAgICBHcmlkU3BhY2Ugc2xvdFNwYWNlOwotICAg
ICAgICBib29sIGlzRml4ZWQgeyBmYWxzZSB9OwotICAgIH07CisgICAgLy8gQ29tcHV0ZSBhbmQg
YmFsYW5jZSB0aGUgY29sdW1uIGFuZCByb3cgc3BhY2VzLgorICAgIGF1dG8mIGdyaWQgPSBmb3Jt
YXR0aW5nU3RhdGUoKS50YWJsZUdyaWQoKTsKKyAgICBhdXRvJiBjb2x1bW5zID0gZ3JpZC5jb2x1
bW5zKCkubGlzdCgpOworICAgIGF1dG8gdGFibGVMYXlvdXQgPSB0aGlzLT50YWJsZUxheW91dCgp
OwogCi0gICAgYXV0byYgY29sdW1ucyA9IGdyaWQuY29sdW1ucygpOwotICAgIGF1dG8mIHJvd3Mg
PSBncmlkLnJvd3MoKTsKLSAgICAvLyAxLiBDb2xsZWN0IHRoZSBub24tc3Bhbm5pbmcgc3BhY2Vz
IGZpcnN0LiBUaGV5IGFyZSB1c2VkIGZvciB0aGUgZmluYWwgZGlzdHJpYnV0aW9uIGFzIHdlbGwg
YXMgZm9yIGRpc3RyaWJ1dGluZyB0aGUgc3Bhbm5pbmcgc3BhY2UuCi0gICAgVmVjdG9yPE9wdGlv
bmFsPFJlc29sdmVkSXRlbT4+IHJlc29sdmVkSXRlbXMoU3BhblR5cGU6OnNpemUoZ3JpZCkpOwor
ICAgIC8vIENvbHVtbnMgZmlyc3QuCisgICAgYXV0byBkaXN0cmlidXRlZEhvcml6b250YWxTcGFj
ZXMgPSB0YWJsZUxheW91dC5kaXN0cmlidXRlZEhvcml6b250YWxTcGFjZShhdmFpbGFibGVIb3Jp
em9udGFsU3BhY2UpOworICAgIEFTU0VSVChkaXN0cmlidXRlZEhvcml6b250YWxTcGFjZXMuc2l6
ZSgpID09IGNvbHVtbnMuc2l6ZSgpKTsKKyAgICBhdXRvIGNvbHVtbkxvZ2ljYWxMZWZ0ID0gZ3Jp
ZC5ob3Jpem9udGFsU3BhY2luZygpOwogICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsg
Y29sdW1uSW5kZXggPCBjb2x1bW5zLnNpemUoKTsgKytjb2x1bW5JbmRleCkgewotICAgICAgICBm
b3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXplKCk7ICsrcm93SW5k
ZXgpIHsKLSAgICAgICAgICAgIGF1dG8mIHNsb3QgPSAqZ3JpZC5zbG90KHsgY29sdW1uSW5kZXgs
IHJvd0luZGV4IH0pOwotICAgICAgICAgICAgaWYgKFNwYW5UeXBlOjpoYXNTcGFuKHNsb3QpIHx8
IFNwYW5UeXBlOjppc1NwYW5uZWQoc2xvdCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgICAgICBhdXRvIGluZGV4ID0gU3BhblR5cGU6OmluZGV4KGNvbHVtbkluZGV4LCByb3dJ
bmRleCk7Ci0gICAgICAgICAgICBpZiAoIXJlc29sdmVkSXRlbXNbaW5kZXhdKQotICAgICAgICAg
ICAgICAgIHJlc29sdmVkSXRlbXNbaW5kZXhdID0gUmVzb2x2ZWRJdGVtIHsgfTsKLSAgICAgICAg
ICAgIHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90U3BhY2UgPSBtYXgocmVzb2x2ZWRJdGVtc1tp
bmRleF0tPnNsb3RTcGFjZSwgc2xvdFNwYWNlKHNsb3QsIGluZGV4KSk7Ci0gICAgICAgIH0KKyAg
ICAgICAgYXV0byYgY29sdW1uID0gY29sdW1uc1tjb2x1bW5JbmRleF07CisgICAgICAgIGNvbHVt
bi5zZXRMb2dpY2FsTGVmdChjb2x1bW5Mb2dpY2FsTGVmdCk7CisgICAgICAgIGNvbHVtbi5zZXRM
b2dpY2FsV2lkdGgoZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2VzW2NvbHVtbkluZGV4XSk7Cisg
ICAgICAgIGNvbHVtbkxvZ2ljYWxMZWZ0ICs9IGRpc3RyaWJ1dGVkSG9yaXpvbnRhbFNwYWNlc1tj
b2x1bW5JbmRleF0gKyBncmlkLmhvcml6b250YWxTcGFjaW5nKCk7CiAgICAgfQogCi0gICAgLy8g
Mi4gQ29sbGVjdCB0aGUgc3Bhbm5pbmcgY2VsbHMuCi0gICAgc3RydWN0IFNwYW5uaW5nQ2VsbCB7
Ci0gICAgICAgIFNsb3RQb3NpdGlvbiBwb3NpdGlvbjsKLSAgICAgICAgR3JpZFNwYWNlIHVucmVz
b2x2ZWRTcGFjZTsKLSAgICB9OwotICAgIFZlY3RvcjxTcGFubmluZ0NlbGw+IHNwYW5uaW5nQ2Vs
bHM7CisgICAgLy8gUm93cyBzZWNvbmQuCisgICAgYXV0byYgcm93cyA9IGdyaWQucm93cygpLmxp
c3QoKTsKICAgICBmb3IgKHNpemVfdCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5zaXpl
KCk7ICsrcm93SW5kZXgpIHsKLSAgICAgICAgZm9yIChzaXplX3QgY29sdW1uSW5kZXggPSAwOyBj
b2x1bW5JbmRleCA8IGNvbHVtbnMuc2l6ZSgpOyArK2NvbHVtbkluZGV4KSB7Ci0gICAgICAgICAg
ICBhdXRvJiBzbG90ID0gKmdyaWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsKLSAg
ICAgICAgICAgIGlmIChTcGFuVHlwZTo6aGFzU3BhbihzbG90KSkKLSAgICAgICAgICAgICAgICBz
cGFubmluZ0NlbGxzLmFwcGVuZCh7IHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0sIHNsb3RTcGFj
ZShzbG90LCBTcGFuVHlwZTo6aW5kZXgoY29sdW1uSW5kZXgsIHJvd0luZGV4KSkgfSk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgLy8gV2UgbmVlZCB0aGVzZSBzcGFubmluZyBjZWxscyBpbiB0aGUg
b3JkZXIgb2YgdGhlIG51bWJlciBvZiBjb2x1bW5zL3Jvd3MgdGhleSBzcGFuIHNvIHRoYXQKLSAg
ICAvLyB3ZSBjYW4gcmVzb2x2ZSBvdmVybGFwcGluZyBzcGFucyBzdGFydGluZyB3aXRoIHRoZSBz
aG9ydGVyIG9uZXMgZS5nLgotICAgIC8vIDx0ZCBjb2xzcGFuPTQ+I2E8L3RkPjx0ZD4jYjwvdGQ+
Ci0gICAgLy8gPHRkIGNvbHNwYW49Mj4jYzwvdGQ+PHRkIGNvbHNwYW49Mz4jZDwvdGQ+Ci0gICAg
c3RkOjpzb3J0KHNwYW5uaW5nQ2VsbHMuYmVnaW4oKSwgc3Bhbm5pbmdDZWxscy5lbmQoKSwgWyZd
IChhdXRvJiBhLCBhdXRvJiBiKSB7Ci0gICAgICAgIHJldHVybiBTcGFuVHlwZTo6c3BhbkNvdW50
KGdyaWQuc2xvdChhLnBvc2l0aW9uKS0+Y2VsbCgpKSA8IFNwYW5UeXBlOjpzcGFuQ291bnQoZ3Jp
ZC5zbG90KGIucG9zaXRpb24pLT5jZWxsKCkpOwotICAgIH0pOwotCi0gICAgLy8gMy4gRGlzdHJp
YnV0ZSB0aGUgc3Bhbm5pbmcgY2VsbHMnIG1pbWltdW0gc3BhY2UgYWNyb3NzIHRoZSBjb2x1bW5z
L3Jvd3MgdXNpbmcgdGhlIG5vbi1zcGFubmluZyBzcGFjZXMuCi0gICAgLy8gZS5nLiBbIDEgXVsg
NSBdWyAxIF0KLSAgICAvLyAgICAgIFsgICAgOSAgIF1bIDEgXQotICAgIC8vIFRoZSBpbml0aWFs
IHdpZHRocyBhcmU6IFsgMiBdWyA3IF1bIDEgXQotICAgIGZvciAoYXV0byBzcGFubmluZ0NlbGwg
OiBzcGFubmluZ0NlbGxzKSB7Ci0gICAgICAgIGF1dG8mIGNlbGwgPSBncmlkLnNsb3Qoc3Bhbm5p
bmdDZWxsLnBvc2l0aW9uKS0+Y2VsbCgpOwotICAgICAgICBhdXRvIHVucmVzb2x2ZWRTcGFubmlu
Z1NwYWNlID0gc3Bhbm5pbmdDZWxsLnVucmVzb2x2ZWRTcGFjZTsKLSAgICAgICAgaWYgKCFyZXNv
bHZlZEl0ZW1zW1NwYW5UeXBlOjpzdGFydFNwYW4oY2VsbCldIHx8ICFyZXNvbHZlZEl0ZW1zW1Nw
YW5UeXBlOjplbmRTcGFuKGNlbGwpIC0gMV0pIHsKLSAgICAgICAgICAgIC8vIDx0ZCBjb2xzcGFu
PTQ+I2E8L3RkPjx0ZD4jYjwvdGQ+Ci0gICAgICAgICAgICAvLyA8dGQgY29sc3Bhbj0yPiNjPC90
ZD48dGQgY29sc3Bhbj0zPiNkPC90ZD4KLSAgICAgICAgICAgIC8vIFVucmVzb2x2ZWQgY29sdW1u
cyBhcmU6IDEgMiAzIDQKLSAgICAgICAgICAgIC8vIDEuIFRha2UgY29sc3Bhbj0yIChzaG9ydGVz
dCBzcGFuKSBhbmQgcmVzb2x2ZSBjb2x1bW4gMSBhbmQgMgotICAgICAgICAgICAgLy8gMi4gVGFr
ZSBjb2xzcGFuPTMgYW5kIHJlc29sdmUgY29sdW1uIDMgYW5kIDQgKDUgaXMgcmVzb2x2ZWQgYmVj
YXVzZSBpdCBhbHJlYWR5IGhhcyBhIG5vbi1zcGFubmluZyBjZWxsKS4KLSAgICAgICAgICAgIC8v
IDMuIGNvbHNwYW49NCBuZWVkcyBubyByZXNvbHZpbmcgYmVjYXVzZSBhbGwgdGhlIHNwYW5uZWQg
Y29sdW1ucyAoMSAyIDMgNCkgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuCi0gICAgICAgICAg
ICBhdXRvIHVucmVzb2x2ZWRDb2x1bW5Db3VudCA9IGNlbGwuY29sdW1uU3BhbigpOwotICAgICAg
ICAgICAgZm9yIChhdXRvIHNwYW5JbmRleCA9IFNwYW5UeXBlOjpzdGFydFNwYW4oY2VsbCk7IHNw
YW5JbmRleCA8IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwpOyArK3NwYW5JbmRleCkgewotICAgICAg
ICAgICAgICAgIGlmICghcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdKQotICAgICAgICAgICAgICAg
ICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBBU1NFUlQodW5yZXNvbHZlZENvbHVtbkNv
dW50KTsKLSAgICAgICAgICAgICAgICAtLXVucmVzb2x2ZWRDb2x1bW5Db3VudDsKLSAgICAgICAg
ICAgICAgICB1bnJlc29sdmVkU3Bhbm5pbmdTcGFjZSAtPSByZXNvbHZlZEl0ZW1zW3NwYW5JbmRl
eF0tPnNsb3RTcGFjZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFTU0VSVCh1bnJlc29s
dmVkQ29sdW1uQ291bnQpOwotICAgICAgICAgICAgYXV0byBlcXVhbFNwYWNlRm9yU3Bhbm5lZENv
bHVtbnMgPSB1bnJlc29sdmVkU3Bhbm5pbmdTcGFjZSAvIHVucmVzb2x2ZWRDb2x1bW5Db3VudDsK
LSAgICAgICAgICAgIGZvciAoYXV0byBzcGFuSW5kZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNl
bGwpOyBzcGFuSW5kZXggPCBTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5kZXgpIHsK
LSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdKQotICAgICAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1zW3NwYW5J
bmRleF0gPSBSZXNvbHZlZEl0ZW0geyBlcXVhbFNwYWNlRm9yU3Bhbm5lZENvbHVtbnMsIGZhbHNl
IH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyAxLiBD
b2xsZWN0IHRoZSBub24tc3BhbmluZyByZXNvbHZlZCBzcGFjZXMuCi0gICAgICAgICAgICAvLyAy
LiBEaXN0cmlidXRlIHRoZSBleHRyYSBzcGFjZSBhbW9uZyB0aGUgc3Bhbm5lZCBjb2x1bW5zL3Jv
d3MgYmFzZWQgb24gdGhlIHJlc29sdmVkIHNwYWNlIHZhbHVlcy4KLSAgICAgICAgICAgIC8vIGUu
Zy4gc3Bhbm5pbmcgd2lkdGg6IFsgICA5ICAgXS4gUmVzb2x2ZWQgd2lkdGhzIGZvciB0aGUgc3Bh
bm5lZCBjb2x1bW5zOiBbIDEgXSBbIDIgXQotICAgICAgICAgICAgLy8gTmV3IHJlc29sdmVkIHdp
ZHRoczogWyAzIF0gWyA2IF0uCi0gICAgICAgICAgICBhdXRvIHJlc29sdmVkU3Bhbm5pbmdTcGFj
ZSA9IEdyaWRTcGFjZSB7IH07Ci0gICAgICAgICAgICBmb3IgKGF1dG8gc3BhbkluZGV4ID0gU3Bh
blR5cGU6OnN0YXJ0U3BhbihjZWxsKTsgc3BhbkluZGV4IDwgU3BhblR5cGU6OmVuZFNwYW4oY2Vs
bCk7ICsrc3BhbkluZGV4KQotICAgICAgICAgICAgICAgIHJlc29sdmVkU3Bhbm5pbmdTcGFjZSAr
PSByZXNvbHZlZEl0ZW1zW3NwYW5JbmRleF0tPnNsb3RTcGFjZTsKLSAgICAgICAgICAgIGlmIChy
ZXNvbHZlZFNwYW5uaW5nU3BhY2UudmFsdWUgPj0gdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UudmFs
dWUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgc3Bhbm5pbmcgY2VsbCBmaXRzIHRoZSBzcGFu
bmVkIGNvbHVtbnMvcm93cyBqdXN0IGZpbmUuIE5vdGhpbmcgdG8gZGlzdHJpYnV0ZS4KLSAgICAg
ICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1dG8gc3Bh
Y2luZyA9IFNwYW5UeXBlOjpzcGFjaW5nKGdyaWQpICogKFNwYW5UeXBlOjpzcGFuQ291bnQoY2Vs
bCkgLSAxKTsKLSAgICAgICAgICAgIGF1dG8gc3BhY2VUb0Rpc3RyaWJ1dGUgPSB1bnJlc29sdmVk
U3Bhbm5pbmdTcGFjZSAtIEdyaWRTcGFjZSB7IHNwYWNpbmcsIHNwYWNpbmcgfSAtIHJlc29sdmVk
U3Bhbm5pbmdTcGFjZTsgCi0gICAgICAgICAgICBpZiAoIXNwYWNlVG9EaXN0cmlidXRlLmlzRW1w
dHkoKSkgewotICAgICAgICAgICAgICAgIGF1dG8gZGlzdHJpYnV0aW9uUmF0aW8gPSBzcGFjZVRv
RGlzdHJpYnV0ZS5kaXN0cmlidXRpb25CYXNlIC8gcmVzb2x2ZWRTcGFubmluZ1NwYWNlLmRpc3Ry
aWJ1dGlvbkJhc2U7Ci0gICAgICAgICAgICAgICAgZm9yIChhdXRvIHNwYW5JbmRleCA9IFNwYW5U
eXBlOjpzdGFydFNwYW4oY2VsbCk7IHNwYW5JbmRleCA8IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwp
OyArK3NwYW5JbmRleCkKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRJdGVtc1tzcGFuSW5k
ZXhdLT5zbG90U3BhY2UgKz0gR3JpZFNwYWNlIHsgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5z
bG90U3BhY2UudmFsdWUgKiBkaXN0cmlidXRpb25SYXRpbywgcmVzb2x2ZWRJdGVtc1tzcGFuSW5k
ZXhdLT5zbG90U3BhY2UuZGlzdHJpYnV0aW9uQmFzZSAqIGRpc3RyaWJ1dGlvblJhdGlvfTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyA0LiBEaXN0cmlidXRlIHRoZSBl
eHRyYSBzcGFjZSB1c2luZyB0aGUgZmluYWwgcmVzb2x2ZWQgd2lkdGhzLgotI2lmIEFTU0VSVF9F
TkFCTEVECi0gICAgLy8gV2UgaGF2ZSB0byBoYXZlIGFsbCB0aGUgc3BhY2VzIHJlc29sdmVkIGF0
IHRoaXMgcG9pbnQuCi0gICAgZm9yIChhdXRvJiByZXNvbHZlZEl0ZW0gOiByZXNvbHZlZEl0ZW1z
KQotICAgICAgICBBU1NFUlQocmVzb2x2ZWRJdGVtKTsKLSNlbmRpZgotICAgIC8vIEZpeGVkIHNp
emUgY2VsbHMgZG9uJ3QgcGFydGljaXBhdGUgaW4gYXZhaWxhYmxlIHNwYWNlIGRpc3RyaWJ1dGlv
bi4KLSAgICBhdXRvIGFkanVzdGFibGVkU3BhY2UgPSBHcmlkU3BhY2UgeyB9OwotICAgIGZvciAo
YXV0byYgcmVzb2x2ZWRJdGVtIDogcmVzb2x2ZWRJdGVtcykgewotICAgICAgICBpZiAocmVzb2x2
ZWRJdGVtLT5pc0ZpeGVkKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGFkanVzdGFi
bGVkU3BhY2UgKz0gcmVzb2x2ZWRJdGVtLT5zbG90U3BhY2U7Ci0gICAgfQotCi0gICAgRGlzdHJp
YnV0ZWRTcGFjZXMgZGlzdHJpYnV0ZWRTcGFjZXMocmVzb2x2ZWRJdGVtcy5zaXplKCkpOwotICAg
IGZsb2F0IHNwYWNlVG9EaXN0cmlidXRlID0gYXZhaWxhYmxlU3BhY2UgLSBhZGp1c3RhYmxlZFNw
YWNlLnZhbHVlIC0gKChyZXNvbHZlZEl0ZW1zLnNpemUoKSArIDEpICogU3BhblR5cGU6OnNwYWNp
bmcoZ3JpZCkpOwotICAgIC8vIEVzc2VudGlhbGx5IHRoZSByZW1haW5pbmcgc3BhY2UgdG8gZGlz
dHJpYnV0ZSBzaG91bGQgbmV2ZXIgYmUgbmVnYXRpdmUuIExheW91dFVuaXQ6OmVwc2lsb24oKSBp
cyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvciBMYXlvdXRVbml0J3MgbG93IHByZWNpc2lvbi4K
LSAgICBBU1NFUlQoc3BhY2VUb0Rpc3RyaWJ1dGUgPj0gLUxheW91dFVuaXQ6OmVwc2lsb24oKSAq
IHJlc29sdmVkSXRlbXMuc2l6ZSgpKTsKLSAgICAvLyBEaXN0cmlidXRlIHRoZSBleHRyYSBzcGFj
ZSBiYXNlZCBvbiB0aGUgcmVzb2x2ZWQgc3BhY2VzLgotICAgIGF1dG8gZGlzdHJpYnV0aW9uUmF0
aW8gPSBzcGFjZVRvRGlzdHJpYnV0ZSAvIGFkanVzdGFibGVkU3BhY2UuZGlzdHJpYnV0aW9uQmFz
ZTsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcmVzb2x2ZWRJdGVtcy5zaXpl
KCk7ICsraW5kZXgpIHsKLSAgICAgICAgYXV0byBzbG90U3BhY2UgPSByZXNvbHZlZEl0ZW1zW2lu
ZGV4XS0+c2xvdFNwYWNlLnZhbHVlOwotICAgICAgICBhdXRvIG5lZWRzU3BhY2VEaXN0cmlidXRp
b24gPSBzcGFjZVRvRGlzdHJpYnV0ZSAmJiAhcmVzb2x2ZWRJdGVtc1tpbmRleF0tPmlzRml4ZWQ7
Ci0gICAgICAgIGRpc3RyaWJ1dGVkU3BhY2VzW2luZGV4XSA9IHNsb3RTcGFjZTsKLSAgICAgICAg
aWYgKCFuZWVkc1NwYWNlRGlzdHJpYnV0aW9uKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgIGRpc3RyaWJ1dGVkU3BhY2VzW2luZGV4XSArPSByZXNvbHZlZEl0ZW1zW2luZGV4XS0+c2xv
dFNwYWNlLmRpc3RyaWJ1dGlvbkJhc2UgKiBkaXN0cmlidXRpb25SYXRpbzsKLSAgICB9Ci0gICAg
cmV0dXJuIGRpc3RyaWJ1dGVkU3BhY2VzOwotfQotCi12b2lkIFRhYmxlRm9ybWF0dGluZ0NvbnRl
eHQ6OmNvbXB1dGVBbmREaXN0cmlidXRlRXh0cmFIb3Jpem9udGFsU3BhY2UoTGF5b3V0VW5pdCBh
dmFpbGFibGVIb3Jpem9udGFsU3BhY2UpCi17Ci0gICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdT
dGF0ZSgpLnRhYmxlR3JpZCgpOwotICAgIGF1dG8mIGNvbHVtbnMgPSBncmlkLmNvbHVtbnMoKTsK
LSAgICBhdXRvIHRhYmxlV2lkdGhDb25zdHJhaW50cyA9ICpncmlkLndpZHRoQ29uc3RyYWludHMo
KTsKLQotICAgIGVudW0gY2xhc3MgQ29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlIHsgTWluaW11bVdp
ZHRoLCBNYXhpbXVtV2lkdGggfTsKLSAgICBhdXRvIGNvbXB1dGVDb2x1bW5XaWR0aHMgPSBbJl0g
KGF1dG8gY29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlLCBhdXRvIGV4dHJhSG9yaXpvbnRhbFNwYWNl
KSB7Ci0gICAgICAgIGF1dG8gZGlzdHJpYnV0ZWRTcGFjZXMgPSBkaXN0cmlidXRlQXZhaWxhYmxl
U3BhY2U8Q29sdW1uU3Bhbj4oZ3JpZCwgZXh0cmFIb3Jpem9udGFsU3BhY2UsIFsmXSAoY29uc3Qg
VGFibGVHcmlkOjpTbG90JiBzbG90LCBzaXplX3QgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAg
IGF1dG8mIGNvbHVtbiA9IGNvbHVtbnMubGlzdCgpW2NvbHVtbkluZGV4XTsKLSAgICAgICAgICAg
IGF1dG8gY29sdW1uQm94Rml4ZWRXaWR0aCA9IGNvbHVtbi5ib3goKSA/IGNvbHVtbi5ib3goKS0+
Y29sdW1uV2lkdGgoKS52YWx1ZU9yKDBfbHUpIDogMF9sdTsKLSAgICAgICAgICAgIGlmIChjb2x1
bW5XaWR0aEJhbGFuY2luZ0Jhc2UgPT0gQ29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlOjpNaW5pbXVt
V2lkdGgpIHsKLSAgICAgICAgICAgICAgICBhdXRvIG1pbmltdW1XaWR0aCA9IHN0ZDo6bWF4PGZs
b2F0PihzbG90LndpZHRoQ29uc3RyYWludHMoKS5taW5pbXVtLCBjb2x1bW5Cb3hGaXhlZFdpZHRo
KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gR3JpZFNwYWNlIHsgbWluaW11bVdpZHRoLCBtaW5p
bXVtV2lkdGggfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFdoZW4gdGhlIGNvbHVt
biBoYXMgYSBmaXhlZCB3aWR0aCBjZWxsLCB0aGUgbWF4aW11bSB3aWR0aCBiYWxhbmNpbmcgaXMg
YmFzZWQgb24gdGhlIG1pbmltdW0gd2lkdGguCi0gICAgICAgICAgICBhdXRvIG1pbmltdW1XaWR0
aCA9IHN0ZDo6bWF4PGZsb2F0PihzbG90LndpZHRoQ29uc3RyYWludHMoKS5taW5pbXVtLCBjb2x1
bW5Cb3hGaXhlZFdpZHRoKTsKLSAgICAgICAgICAgIGF1dG8gbWF4aW11bVdpZHRoID0gc3RkOjpt
YXg8ZmxvYXQ+KHNsb3Qud2lkdGhDb25zdHJhaW50cygpLm1heGltdW0sIGNvbHVtbkJveEZpeGVk
V2lkdGgpOwotICAgICAgICAgICAgaWYgKGNvbHVtbi5pc0ZpeGVkV2lkdGgoKSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4gR3JpZFNwYWNlIHsgbWluaW11bVdpZHRoLCBtYXhpbXVtV2lkdGggfTsK
LSAgICAgICAgICAgIHJldHVybiBHcmlkU3BhY2UgeyBtYXhpbXVtV2lkdGgsIG1heGltdW1XaWR0
aCB9OwotICAgICAgICB9KTsKLSAgICAgICAgLy8gU2V0IGZpbmFsIGhvcml6b250YWwgcG9zaXRp
b24gYW5kIHdpZHRoLgotICAgICAgICBhdXRvIGNvbHVtbkxvZ2ljYWxMZWZ0ID0gZ3JpZC5ob3Jp
em9udGFsU3BhY2luZygpOwotICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNv
bHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAg
IGF1dG8mIGNvbHVtbiA9IGNvbHVtbnMubGlzdCgpW2NvbHVtbkluZGV4XTsKLSAgICAgICAgICAg
IGF1dG8gY29sdW1uV2lkdGggPSBMYXlvdXRVbml0IHsgZGlzdHJpYnV0ZWRTcGFjZXNbY29sdW1u
SW5kZXhdIH07Ci0KLSAgICAgICAgICAgIGNvbHVtbi5zZXRMb2dpY2FsTGVmdChjb2x1bW5Mb2dp
Y2FsTGVmdCk7Ci0gICAgICAgICAgICBjb2x1bW4uc2V0TG9naWNhbFdpZHRoKGNvbHVtbldpZHRo
KTsKLSAgICAgICAgICAgIGNvbHVtbkxvZ2ljYWxMZWZ0ICs9IGNvbHVtbldpZHRoICsgZ3JpZC5o
b3Jpem9udGFsU3BhY2luZygpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBhdXRvIGNvbHVtbldp
ZHRoQmFsYW5jaW5nQmFzZSA9IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSA9PSB0YWJsZVdpZHRo
Q29uc3RyYWludHMubWF4aW11bSA/IENvbHVtbldpZHRoQmFsYW5jaW5nQmFzZTo6TWF4aW11bVdp
ZHRoIDogQ29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlOjpNaW5pbXVtV2lkdGg7Ci0gICAgY29tcHV0
ZUNvbHVtbldpZHRocyhjb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UsIGF2YWlsYWJsZUhvcml6b250
YWxTcGFjZSk7Ci19Ci0KLXZvaWQgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6Y29tcHV0ZUFuZERp
c3RyaWJ1dGVFeHRyYVZlcnRpY2FsU3BhY2UoTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFs
U3BhY2UsIE9wdGlvbmFsPExheW91dFVuaXQ+IGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UpCi17Ci0g
ICAgYXV0byYgZ3JpZCA9IGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxlR3JpZCgpOwotICAgIGF1dG8m
IGNvbHVtbnMgPSBncmlkLmNvbHVtbnMoKS5saXN0KCk7Ci0gICAgYXV0byYgcm93cyA9IGdyaWQu
cm93cygpOwotCi0gICAgc3RydWN0IFJvd0hlaWdodCB7Ci0gICAgICAgIElubGluZUxheW91dFVu
aXQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gYXNjZW50ICsgZGVzY2VudDsgfQotCi0gICAgICAg
IElubGluZUxheW91dFVuaXQgYXNjZW50IHsgMCB9OwotICAgICAgICBJbmxpbmVMYXlvdXRVbml0
IGRlc2NlbnQgeyAwIH07Ci0gICAgfTsKLSAgICBWZWN0b3I8Um93SGVpZ2h0PiByb3dIZWlnaHQo
cm93cy5zaXplKCkpOwotICAgIFZlY3RvcjxTbG90UG9zaXRpb24+IHNwYW5uaW5nUm93UG9zaXRp
b25MaXN0OwotICAgIExheW91dFVuaXQgdGFibGVVc2VkSGVpZ2h0OwotICAgIC8vIDEuIENvbGxl
Y3QgaW5pdGlhbCwgYmFzbGluZSBhbGlnbmVkIHJvdyBoZWlnaHRzLgotICAgIGZvciAoc2l6ZV90
IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCByb3dzLnNpemUoKTsgKytyb3dJbmRleCkgewotICAg
ICAgICBhdXRvIG1heGltdW1Db2x1bW5Bc2NlbnQgPSBJbmxpbmVMYXlvdXRVbml0IHsgfTsKLSAg
ICAgICAgYXV0byBtYXhpbXVtQ29sdW1uRGVzY2VudCA9IElubGluZUxheW91dFVuaXQgeyB9Owog
ICAgICAgICBmb3IgKHNpemVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1u
cy5zaXplKCk7ICsrY29sdW1uSW5kZXgpIHsKICAgICAgICAgICAgIGF1dG8mIHNsb3QgPSAqZ3Jp
ZC5zbG90KHsgY29sdW1uSW5kZXgsIHJvd0luZGV4IH0pOwogICAgICAgICAgICAgaWYgKHNsb3Qu
aXNSb3dTcGFubmVkKCkpCkBAIC02MTEsMzcgKzM5OSwxOCBAQCB2b2lkIFRhYmxlRm9ybWF0dGlu
Z0NvbnRleHQ6OmNvbXB1dGVBbmREaXN0cmlidXRlRXh0cmFWZXJ0aWNhbFNwYWNlKExheW91dFVu
aXQgYQogICAgICAgICAgICAgLy8gVGhlIG1pbmltdW0gaGVpZ2h0IG9mIGEgcm93ICh3aXRob3V0
IHNwYW5uaW5nLXJlbGF0ZWQgaGVpZ2h0IGRpc3RyaWJ1dGlvbikgaXMgZGVmaW5lZCBhcyB0aGUg
aGVpZ2h0IG9mIGFuIGh5cG90aGV0aWNhbAogICAgICAgICAgICAgLy8gbGluZWJveCBjb250YWlu
aW5nIHRoZSBjZWxscyBvcmlnaW5hdGluZyBpbiB0aGUgcm93LgogICAgICAgICAgICAgYXV0byYg
Y2VsbCA9IHNsb3QuY2VsbCgpOwotICAgICAgICAgICAgYXV0byYgY2VsbEJveCA9IGNlbGwuYm94
KCk7Ci0gICAgICAgICAgICBjZWxsLnNldEJhc2VsaW5lT2Zmc2V0KGdlb21ldHJ5KCkudXNlZEJh
c2VsaW5lRm9yQ2VsbChjZWxsQm94KSk7Ci0gICAgICAgICAgICBtYXhpbXVtQ29sdW1uQXNjZW50
ID0gc3RkOjptYXgobWF4aW11bUNvbHVtbkFzY2VudCwgY2VsbC5iYXNlbGluZU9mZnNldCgpKTsK
LSAgICAgICAgICAgIG1heGltdW1Db2x1bW5EZXNjZW50ID0gc3RkOjptYXgobWF4aW11bUNvbHVt
bkRlc2NlbnQsIGdlb21ldHJ5Rm9yQm94KGNlbGxCb3gpLmhlaWdodCgpIC0gY2VsbC5iYXNlbGlu
ZU9mZnNldCgpKTsKKyAgICAgICAgICAgIGNlbGwuc2V0QmFzZWxpbmVPZmZzZXQoZ2VvbWV0cnko
KS51c2VkQmFzZWxpbmVGb3JDZWxsKGNlbGwuYm94KCkpKTsKICAgICAgICAgfQotICAgICAgICAv
LyA8dHIgc3R5bGU9ImhlaWdodDogMTBweCI+IGlzIGNvbnNpZGVyZWQgYXMgbWluIGhlaWdodC4K
LSAgICAgICAgcm93SGVpZ2h0W3Jvd0luZGV4XSA9IHsgbWF4aW11bUNvbHVtbkFzY2VudCwgbWF4
aW11bUNvbHVtbkRlc2NlbnQgfTsKLSAgICAgICAgdGFibGVVc2VkSGVpZ2h0ICs9IG1heGltdW1D
b2x1bW5Bc2NlbnQgKyBtYXhpbXVtQ29sdW1uRGVzY2VudDsKICAgICB9Ci0gICAgLy8gRklYTUU6
IENvbGxlY3Qgc3Bhbm5pbmcgcm93IG1heGltdW0gaGVpZ2h0cy4KLQotICAgIC8vIERpc3RyaWJ1
dGUgZXh0cmEgc3BhY2UgaWYgdGhlIHRhYmxlIGlzIHN1cHBvc2VkIHRvIGJlIHRhbGxlciB0aGFu
IHRoZSBzdW0gb2YgdGhlIHJvdyBoZWlnaHRzLgotICAgIHRhYmxlVXNlZEhlaWdodCArPSAocm93
cy5zaXplKCkgKyAxKSAqIGdyaWQudmVydGljYWxTcGFjaW5nKCk7Ci0gICAgYXV0byBhdmFpbGFi
bGVTcGFjZSA9IHN0ZDo6bWF4KGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UudmFsdWVPcigwX2x1KSwg
dGFibGVVc2VkSGVpZ2h0KTsKLSAgICBhdXRvIGRpc3RyaWJ1dGVkU3BhY2VzID0gZGlzdHJpYnV0
ZUF2YWlsYWJsZVNwYWNlPFJvd1NwYW4+KGdyaWQsIGF2YWlsYWJsZVNwYWNlLCBbJl0gKGNvbnN0
IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCwgc2l6ZV90IHJvd0luZGV4KSB7Ci0gICAgICAgIGlmIChz
bG90Lmhhc1Jvd1NwYW4oKSkKLSAgICAgICAgICAgIHJldHVybiBHcmlkU3BhY2UgeyBnZW9tZXRy
eUZvckJveChzbG90LmNlbGwoKS5ib3goKSkuaGVpZ2h0KCksIGdlb21ldHJ5Rm9yQm94KHNsb3Qu
Y2VsbCgpLmJveCgpKS5oZWlnaHQoKSB9OwotICAgICAgICBhdXRvIGNvbXB1dGVkUm93SGVpZ2h0
ID0gZ2VvbWV0cnkoKS5jb21wdXRlZEhlaWdodChyb3dzLmxpc3QoKVtyb3dJbmRleF0uYm94KCks
IHsgfSk7Ci0gICAgICAgIGF1dG8gaGVpZ2h0ID0gc3RkOjptYXg8ZmxvYXQ+KHJvd0hlaWdodFty
b3dJbmRleF0uaGVpZ2h0KCksIGNvbXB1dGVkUm93SGVpZ2h0LnZhbHVlT3IoMF9sdSkpOwotICAg
ICAgICByZXR1cm4gR3JpZFNwYWNlIHsgaGVpZ2h0LCBoZWlnaHQgfTsKLSAgICB9KTsKIAorICAg
IGF1dG8gZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNlcyA9IHRhYmxlTGF5b3V0LmRpc3RyaWJ1dGVk
VmVydGljYWxTcGFjZShhdmFpbGFibGVWZXJ0aWNhbFNwYWNlKTsKKyAgICBBU1NFUlQoZGlzdHJp
YnV0ZWRWZXJ0aWNhbFNwYWNlcy5zaXplKCkgPT0gcm93cy5zaXplKCkpOwogICAgIGF1dG8gcm93
TG9naWNhbFRvcCA9IGdyaWQudmVydGljYWxTcGFjaW5nKCk7CiAgICAgZm9yIChzaXplX3Qgcm93
SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7Ci0gICAgICAg
IGF1dG8mIHJvdyA9IGdyaWQucm93cygpLmxpc3QoKVtyb3dJbmRleF07Ci0gICAgICAgIGF1dG8g
cm93VXNlZEhlaWdodCA9IExheW91dFVuaXQgeyBkaXN0cmlidXRlZFNwYWNlc1tyb3dJbmRleF0g
fTsKLQotICAgICAgICByb3cuc2V0TG9naWNhbEhlaWdodChyb3dVc2VkSGVpZ2h0KTsKLSAgICAg
ICAgcm93LnNldEJhc2VsaW5lT2Zmc2V0KHJvd0hlaWdodFtyb3dJbmRleF0uYXNjZW50KTsKKyAg
ICAgICAgYXV0byYgcm93ID0gcm93c1tyb3dJbmRleF07CisgICAgICAgIHJvdy5zZXRMb2dpY2Fs
SGVpZ2h0KGRpc3RyaWJ1dGVkVmVydGljYWxTcGFjZXNbcm93SW5kZXhdKTsKICAgICAgICAgcm93
LnNldExvZ2ljYWxUb3Aocm93TG9naWNhbFRvcCk7Ci0gICAgICAgIHJvd0xvZ2ljYWxUb3AgKz0g
cm93VXNlZEhlaWdodCArIGdyaWQudmVydGljYWxTcGFjaW5nKCk7CisgICAgICAgIHJvd0xvZ2lj
YWxUb3AgKz0gZGlzdHJpYnV0ZWRWZXJ0aWNhbFNwYWNlc1tyb3dJbmRleF0gKyBncmlkLnZlcnRp
Y2FsU3BhY2luZygpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvbGF5
b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdDb250ZXh0LmggYi9Tb3VyY2UvV2Vi
Q29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQuaAppbmRl
eCBjNDZiN2E4OWRhMGVjMGQxNjhkMTRlYzExZDkzYWZlNDgyNmQ1Njc1Li45YTBjNTdhNmEzZTFm
MDZkYTZiNTAzNzQyYTBkMzA3N2M3MWRjMzQxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9s
YXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQuaAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGluZ0NvbnRleHQu
aApAQCAtMjgsNiArMjgsNyBAQAogI2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhU
KQogCiAjaW5jbHVkZSAiRm9ybWF0dGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJUYWJsZUZvcm1h
dHRpbmdTdGF0ZS5oIgogI2luY2x1ZGUgIlRhYmxlR3JpZC5oIgogI2luY2x1ZGUgPHd0Zi9Jc29N
YWxsb2MuaD4KIApAQCAtMzUsNyArMzYsNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBuYW1lc3Bh
Y2UgTGF5b3V0IHsKIAogY2xhc3MgSW52YWxpZGF0aW9uU3RhdGU7Ci1jbGFzcyBUYWJsZUZvcm1h
dHRpbmdTdGF0ZTsKIC8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgbGF5b3V0IGxvZ2ljIGZv
ciB0YWJsZSBmb3JtYXR0aW5nIGNvbnRleHRzLgogLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NT
UzIyL3RhYmxlcy5odG1sCiBjbGFzcyBUYWJsZUZvcm1hdHRpbmdDb250ZXh0IGZpbmFsIDogcHVi
bGljIEZvcm1hdHRpbmdDb250ZXh0IHsKQEAgLTQ1LDYgKzQ1LDIxIEBAIHB1YmxpYzoKICAgICB2
b2lkIGxheW91dEluRmxvd0NvbnRlbnQoSW52YWxpZGF0aW9uU3RhdGUmLCBjb25zdCBDb25zdHJh
aW50c0ZvckluRmxvd0NvbnRlbnQmKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKKyAgICBjbGFzcyBU
YWJsZUxheW91dCB7CisgICAgcHVibGljOgorICAgICAgICBUYWJsZUxheW91dChjb25zdCBUYWJs
ZUZvcm1hdHRpbmdDb250ZXh0JiwgY29uc3QgVGFibGVHcmlkJik7CisKKyAgICAgICAgdXNpbmcg
RGlzdHJpYnV0ZWRTcGFjZXMgPSBWZWN0b3I8TGF5b3V0VW5pdD47CisgICAgICAgIERpc3RyaWJ1
dGVkU3BhY2VzIGRpc3RyaWJ1dGVkSG9yaXpvbnRhbFNwYWNlKExheW91dFVuaXQgYXZhaWxhYmxl
SG9yaXpvbnRhbFNwYWNlKTsKKyAgICAgICAgRGlzdHJpYnV0ZWRTcGFjZXMgZGlzdHJpYnV0ZWRW
ZXJ0aWNhbFNwYWNlKE9wdGlvbmFsPExheW91dFVuaXQ+IGF2YWlsYWJsZVZlcnRpY2FsU3BhY2Up
OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYg
Zm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2Zvcm1hdHRpbmdDb250ZXh0OyB9
CisKKyAgICAgICAgY29uc3QgVGFibGVGb3JtYXR0aW5nQ29udGV4dCYgbV9mb3JtYXR0aW5nQ29u
dGV4dDsKKyAgICAgICAgY29uc3QgVGFibGVHcmlkJiBtX2dyaWQ7CisgICAgfTsKKwogICAgIGNs
YXNzIEdlb21ldHJ5IDogcHVibGljIEZvcm1hdHRpbmdDb250ZXh0OjpHZW9tZXRyeSB7CiAgICAg
cHVibGljOgogICAgICAgICBMYXlvdXRVbml0IGNlbGxIZWlnaChjb25zdCBDb250YWluZXJCb3gm
KSBjb25zdDsKQEAgLTU5LDYgKzc0LDcgQEAgcHJpdmF0ZToKICAgICAgICAgY29uc3QgVGFibGVG
b3JtYXR0aW5nQ29udGV4dCYgZm9ybWF0dGluZ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBkb3du
Y2FzdDxUYWJsZUZvcm1hdHRpbmdDb250ZXh0PihGb3JtYXR0aW5nQ29udGV4dDo6R2VvbWV0cnk6
OmZvcm1hdHRpbmdDb250ZXh0KCkpOyB9CiAgICAgfTsKICAgICBUYWJsZUZvcm1hdHRpbmdDb250
ZXh0OjpHZW9tZXRyeSBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0dXJuIEdlb21ldHJ5KCp0aGlzKTsg
fQorICAgIFRhYmxlRm9ybWF0dGluZ0NvbnRleHQ6OlRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0KCkg
Y29uc3QgeyByZXR1cm4gVGFibGVMYXlvdXQoKnRoaXMsIGZvcm1hdHRpbmdTdGF0ZSgpLnRhYmxl
R3JpZCgpKTsgfQogCiAgICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBjb21wdXRlZEludHJp
bnNpY1dpZHRoQ29uc3RyYWludHMoKSBvdmVycmlkZTsKICAgICB2b2lkIGxheW91dENlbGwoY29u
c3QgVGFibGVHcmlkOjpDZWxsJiwgTGF5b3V0VW5pdCBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2Us
IE9wdGlvbmFsPExheW91dFVuaXQ+IHVzZWRDZWxsSGVpZ2h0ID0gV1RGOjpudWxsb3B0KTsKQEAg
LTY4LDggKzg0LDcgQEAgcHJpdmF0ZToKIAogICAgIHZvaWQgZW5zdXJlVGFibGVHcmlkKCk7CiAg
ICAgSW50cmluc2ljV2lkdGhDb25zdHJhaW50cyBjb21wdXRlZFByZWZlcnJlZFdpZHRoRm9yQ29s
dW1ucygpOwotICAgIHZvaWQgY29tcHV0ZUFuZERpc3RyaWJ1dGVFeHRyYUhvcml6b250YWxTcGFj
ZShMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6b250YWxTcGFjZSk7Ci0gICAgdm9pZCBjb21wdXRl
QW5kRGlzdHJpYnV0ZUV4dHJhVmVydGljYWxTcGFjZShMYXlvdXRVbml0IGF2YWlsYWJsZUhvcml6
b250YWxTcGFjZSwgT3B0aW9uYWw8TGF5b3V0VW5pdD4gYXZhaWxhYmxlVmVydGljYWxTcGFjZSk7
CisgICAgdm9pZCBjb21wdXRlQW5kRGlzdHJpYnV0ZUV4dHJhU3BhY2UoTGF5b3V0VW5pdCBhdmFp
bGFibGVIb3Jpem9udGFsU3BhY2UsIE9wdGlvbmFsPExheW91dFVuaXQ+IGF2YWlsYWJsZVZlcnRp
Y2FsU3BhY2UpOwogCiAgICAgY29uc3QgVGFibGVGb3JtYXR0aW5nU3RhdGUmIGZvcm1hdHRpbmdT
dGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGRvd25jYXN0PFRhYmxlRm9ybWF0dGluZ1N0YXRlPihGb3Jt
YXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9CiAgICAgVGFibGVGb3JtYXR0aW5n
U3RhdGUmIGZvcm1hdHRpbmdTdGF0ZSgpIHsgcmV0dXJuIGRvd25jYXN0PFRhYmxlRm9ybWF0dGlu
Z1N0YXRlPihGb3JtYXR0aW5nQ29udGV4dDo6Zm9ybWF0dGluZ1N0YXRlKCkpOyB9CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9ybWF0dGlu
Z1N0YXRlLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlRm9y
bWF0dGluZ1N0YXRlLmgKaW5kZXggMjc1ZWVkMDA3Njc4YzI2MDk2MDI0NWI4NTQ2NGY5MGU0NzZk
ZDQ0Zi4uNWYwMjlmZDU2MDZmNzJhNzI2YTIxMzRiMmEyMTg2ODdlZGRlODY2NCAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUZvcm1hdHRpbmdT
dGF0ZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVG
b3JtYXR0aW5nU3RhdGUuaApAQCAtNDIsNiArNDIsNyBAQCBwdWJsaWM6CiAgICAgflRhYmxlRm9y
bWF0dGluZ1N0YXRlKCk7CiAKICAgICBUYWJsZUdyaWQmIHRhYmxlR3JpZCgpIHsgcmV0dXJuIG1f
dGFibGVHcmlkOyB9CisgICAgY29uc3QgVGFibGVHcmlkJiB0YWJsZUdyaWQoKSBjb25zdCB7IHJl
dHVybiBtX3RhYmxlR3JpZDsgfQogCiBwcml2YXRlOgogICAgIFRhYmxlR3JpZCBtX3RhYmxlR3Jp
ZDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFi
bGVHcmlkLmggYi9Tb3VyY2UvV2ViQ29yZS9sYXlvdXQvdGFibGVmb3JtYXR0aW5nL1RhYmxlR3Jp
ZC5oCmluZGV4IDA5NzMwZDE5YTU0YjdmZjFjODU0OWUyYTUyYjcyYjA5MWRiYjhmN2IuLjE2MjQ5
Yjc4YThmMWJiYjUwZmEwNDNkYjJiMWI0NDQzYTRkMjU2MzQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVHcmlkLmgKKysrIGIvU291cmNlL1dl
YkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUdyaWQuaApAQCAtNTYsNyArNTYsNyBA
QCBwdWJsaWM6CiAgICAgTGF5b3V0VW5pdCB2ZXJ0aWNhbFNwYWNpbmcoKSBjb25zdCB7IHJldHVy
biBtX3ZlcnRpY2FsU3BhY2luZzsgfQogCiAgICAgdm9pZCBzZXRXaWR0aENvbnN0cmFpbnRzKEZv
cm1hdHRpbmdDb250ZXh0OjpJbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzIGludHJpbnNpY1dpZHRo
Q29uc3RyYWludHMpIHsgbV9pbnRyaW5zaWNXaWR0aENvbnN0cmFpbnRzID0gaW50cmluc2ljV2lk
dGhDb25zdHJhaW50czsgfQotICAgIE9wdGlvbmFsPEZvcm1hdHRpbmdDb250ZXh0OjpJbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzPiB3aWR0aENvbnN0cmFpbnRzKCkgeyByZXR1cm4gbV9pbnRyaW5z
aWNXaWR0aENvbnN0cmFpbnRzOyB9CisgICAgT3B0aW9uYWw8Rm9ybWF0dGluZ0NvbnRleHQ6Oklu
dHJpbnNpY1dpZHRoQ29uc3RyYWludHM+IHdpZHRoQ29uc3RyYWludHMoKSBjb25zdCB7IHJldHVy
biBtX2ludHJpbnNpY1dpZHRoQ29uc3RyYWludHM7IH0KIAogICAgIC8vIENvbHVtbiByZXByZXNl
bnRzIGEgdmVydGljYWwgc2V0IG9mIHNsb3RzIGluIHRoZSBncmlkLiBBIGNvbHVtbiBoYXMgaG9y
aXpvbnRhbCBwb3NpdGlvbiBhbmQgd2lkdGguCiAgICAgY2xhc3MgQ29sdW1uIHsKQEAgLTEzMiw3
ICsxMzIsNyBAQCBwdWJsaWM6CiAgICAgcHVibGljOgogICAgICAgICB1c2luZyBSb3dMaXN0ID0g
VmVjdG9yPFJvdz47CiAgICAgICAgIFJvd0xpc3QmIGxpc3QoKSB7IHJldHVybiBtX3Jvd0xpc3Q7
IH0KLSAgICAgICAgY29uc3QgUm93TGlzdCYgcm93TGlzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcm93
TGlzdDsgfQorICAgICAgICBjb25zdCBSb3dMaXN0JiBsaXN0KCkgY29uc3QgeyByZXR1cm4gbV9y
b3dMaXN0OyB9CiAKICAgICAgICAgdm9pZCBhZGRSb3coY29uc3QgQ29udGFpbmVyQm94Jik7CiAK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1hdHRpbmcvVGFibGVM
YXlvdXQuY3BwIGIvU291cmNlL1dlYkNvcmUvbGF5b3V0L3RhYmxlZm9ybWF0dGluZy9UYWJsZUxh
eW91dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uNzAyNjFhMmIwOGJhZmNjZjE4OThlZWI3NmM5ZDg5Y2ZmNjgy
NDc4ZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2xheW91dC90YWJsZWZvcm1h
dHRpbmcvVGFibGVMYXlvdXQuY3BwCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklC
VVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRT
IENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRhYmxlRm9ybWF0dGluZ0NvbnRleHQuaCIKKwor
I2lmIEVOQUJMRShMQVlPVVRfRk9STUFUVElOR19DT05URVhUKQorCisjaW5jbHVkZSAiRGlzcGxh
eUJveC5oIgorI2luY2x1ZGUgIkxheW91dEJveC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7Citu
YW1lc3BhY2UgTGF5b3V0IHsKKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy10YWJsZXMt
My8jdGFibGUtbGF5b3V0LWFsZ29yaXRobQorVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6VGFibGVM
YXlvdXQ6OlRhYmxlTGF5b3V0KGNvbnN0IFRhYmxlRm9ybWF0dGluZ0NvbnRleHQmIGZvcm1hdHRp
bmdDb250ZXh0LCBjb25zdCBUYWJsZUdyaWQmIGdyaWQpCisgICAgOiBtX2Zvcm1hdHRpbmdDb250
ZXh0KGZvcm1hdHRpbmdDb250ZXh0KQorICAgICwgbV9ncmlkKGdyaWQpCit7Cit9CisKK3N0cnVj
dCBDb2x1bW5TcGFuIHsKKyAgICBzdGF0aWMgc2l6ZV90IGhhc1NwYW4oY29uc3QgVGFibGVHcmlk
OjpTbG90JiBzbG90KSB7IHJldHVybiBzbG90Lmhhc0NvbHVtblNwYW4oKTsgfQorICAgIHN0YXRp
YyBzaXplX3QgaXNTcGFubmVkKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYgc2xvdCkgeyByZXR1cm4g
c2xvdC5pc0NvbHVtblNwYW5uZWQoKTsgfQorCisgICAgc3RhdGljIHNpemVfdCBzcGFuQ291bnQo
Y29uc3QgVGFibGVHcmlkOjpDZWxsJiBjZWxsKSB7IHJldHVybiBjZWxsLmNvbHVtblNwYW4oKTsg
fQorICAgIHN0YXRpYyBzaXplX3Qgc3RhcnRTcGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2Vs
bCkgeyByZXR1cm4gY2VsbC5zdGFydENvbHVtbigpOyB9CisgICAgc3RhdGljIHNpemVfdCBlbmRT
cGFuKGNvbnN0IFRhYmxlR3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5lbmRDb2x1bW4o
KTsgfQorCisgICAgc3RhdGljIHNpemVfdCBpbmRleChzaXplX3QgY29sdW1uSW5kZXgsIHNpemVf
dCAvKnJvd0luZGV4Ki8pIHsgcmV0dXJuIGNvbHVtbkluZGV4OyB9CisgICAgc3RhdGljIHNpemVf
dCBzaXplKGNvbnN0IFRhYmxlR3JpZCYgZ3JpZCkgeyByZXR1cm4gZ3JpZC5jb2x1bW5zKCkuc2l6
ZSgpOyB9CisKKyAgICBzdGF0aWMgTGF5b3V0VW5pdCBzcGFjaW5nKGNvbnN0IFRhYmxlR3JpZCYg
Z3JpZCkgeyByZXR1cm4gZ3JpZC5ob3Jpem9udGFsU3BhY2luZygpOyB9Cit9OworCitzdHJ1Y3Qg
Um93U3BhbiB7CisgICAgc3RhdGljIHNpemVfdCBoYXNTcGFuKGNvbnN0IFRhYmxlR3JpZDo6U2xv
dCYgc2xvdCkgeyByZXR1cm4gc2xvdC5oYXNSb3dTcGFuKCk7IH0KKyAgICBzdGF0aWMgc2l6ZV90
IGlzU3Bhbm5lZChjb25zdCBUYWJsZUdyaWQ6OlNsb3QmIHNsb3QpIHsgcmV0dXJuIHNsb3QuaXNS
b3dTcGFubmVkKCk7IH0KKworICAgIHN0YXRpYyBzaXplX3Qgc3BhbkNvdW50KGNvbnN0IFRhYmxl
R3JpZDo6Q2VsbCYgY2VsbCkgeyByZXR1cm4gY2VsbC5yb3dTcGFuKCk7IH0KKyAgICBzdGF0aWMg
c2l6ZV90IHN0YXJ0U3Bhbihjb25zdCBUYWJsZUdyaWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJuIGNl
bGwuc3RhcnRSb3coKTsgfQorICAgIHN0YXRpYyBzaXplX3QgZW5kU3Bhbihjb25zdCBUYWJsZUdy
aWQ6OkNlbGwmIGNlbGwpIHsgcmV0dXJuIGNlbGwuZW5kUm93KCk7IH0KKworICAgIHN0YXRpYyBz
aXplX3QgaW5kZXgoc2l6ZV90IC8qY29sdW1uSW5kZXgqLywgc2l6ZV90IHJvd0luZGV4KSB7IHJl
dHVybiByb3dJbmRleDsgfQorICAgIHN0YXRpYyBzaXplX3Qgc2l6ZShjb25zdCBUYWJsZUdyaWQm
IGdyaWQpIHsgcmV0dXJuIGdyaWQucm93cygpLnNpemUoKTsgfQorCisgICAgc3RhdGljIExheW91
dFVuaXQgc3BhY2luZyhjb25zdCBUYWJsZUdyaWQmIGdyaWQpIHsgcmV0dXJuIGdyaWQudmVydGlj
YWxTcGFjaW5nKCk7IH0KK307CisKK3N0cnVjdCBHcmlkU3BhY2UgeworICAgIGJvb2wgaXNFbXB0
eSgpIGNvbnN0IHsgcmV0dXJuICF2YWx1ZTsgfQorCisgICAgLy8gSW5pdGlhbCB3aWR0aC9oZWln
aHQgZm9yIGNvbHVtbi9yb3cgd2Ugc3RhcnQgdGhlIGRpc3RyaWJ1dGlvbiB3aWR0aCAodXN1YWxs
eSBhIG1pbnVtdW0gd2lkdGgpLgorICAgIGZsb2F0IHZhbHVlIHsgMCB9OworICAgIC8vIFRoZSBi
YXNlIHRvIGNvbXB1dGUgdGhlIGRpc3RyaWJ1dGlvbiByYXRpby4gSXQgbm9ybWFsbHkgbWF0Y2hl
cyB0aGUgW3ZhbHVlXSBidXQgaW4gc29tZSBjYXNlcyB3ZSB1c2UgdGhlIG1heGltdW0gdmFsdWUg
dG8gZGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UuIAorICAgIGZsb2F0IGRpc3RyaWJ1dGlvbkJh
c2UgeyAwIH07Cit9OworCitpbmxpbmUgc3RhdGljIEdyaWRTcGFjZSBtYXgoY29uc3QgR3JpZFNw
YWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCit7CisgICAgcmV0dXJuIHsgc3RkOjptYXgoYS52
YWx1ZSwgYi52YWx1ZSksIHN0ZDo6bWF4KGEuZGlzdHJpYnV0aW9uQmFzZSwgYi5kaXN0cmlidXRp
b25CYXNlKSB9OworfQorCitpbmxpbmUgc3RhdGljIEdyaWRTcGFjZSYgb3BlcmF0b3ItKEdyaWRT
cGFjZSYgYSwgY29uc3QgR3JpZFNwYWNlJiBiKQoreworICAgIGEudmFsdWUgPSBzdGQ6Om1heCgw
LjBmLCBhLnZhbHVlIC0gYi52YWx1ZSk7CisgICAgYS5kaXN0cmlidXRpb25CYXNlID0gc3RkOjpt
YXgoMC4wZiwgYS5kaXN0cmlidXRpb25CYXNlIC0gYi5kaXN0cmlidXRpb25CYXNlKTsKKyAgICBy
ZXR1cm4gYTsKK30KKworaW5saW5lIHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJhdG9yKz0oR3JpZFNw
YWNlJiBhLCBjb25zdCBHcmlkU3BhY2UmIGIpCit7CisgICAgYS52YWx1ZSArPSBiLnZhbHVlOwor
ICAgIGEuZGlzdHJpYnV0aW9uQmFzZSArPSBiLmRpc3RyaWJ1dGlvbkJhc2U7CisgICAgcmV0dXJu
IGE7Cit9CisKK2lubGluZSBzdGF0aWMgR3JpZFNwYWNlJiBvcGVyYXRvci09KEdyaWRTcGFjZSYg
YSwgY29uc3QgR3JpZFNwYWNlJiBiKQoreworICAgIHJldHVybiBhIC0gYjsKK30KKworaW5saW5l
IHN0YXRpYyBHcmlkU3BhY2UmIG9wZXJhdG9yLyhHcmlkU3BhY2UmIGEsIHVuc2lnbmVkIHZhbHVl
KQoreworICAgIGEudmFsdWUgLz0gdmFsdWU7CisgICAgYS5kaXN0cmlidXRpb25CYXNlIC89IHZh
bHVlOworICAgIHJldHVybiBhOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3BhblR5cGU+Citz
dGF0aWMgVmVjdG9yPExheW91dFVuaXQ+IGRpc3RyaWJ1dGVBdmFpbGFibGVTcGFjZShjb25zdCBU
YWJsZUdyaWQmIGdyaWQsIExheW91dFVuaXQgYXZhaWxhYmxlU3BhY2UsIGNvbnN0IFdURjo6RnVu
Y3Rpb248R3JpZFNwYWNlKGNvbnN0IFRhYmxlR3JpZDo6U2xvdCYsIHNpemVfdCk+JiBzbG90U3Bh
Y2UpCit7CisgICAgc3RydWN0IFJlc29sdmVkSXRlbSB7CisgICAgICAgIEdyaWRTcGFjZSBzbG90
U3BhY2U7CisgICAgICAgIGJvb2wgaXNGaXhlZCB7IGZhbHNlIH07CisgICAgfTsKKworICAgIGF1
dG8mIGNvbHVtbnMgPSBncmlkLmNvbHVtbnMoKTsKKyAgICBhdXRvJiByb3dzID0gZ3JpZC5yb3dz
KCk7CisgICAgLy8gMS4gQ29sbGVjdCB0aGUgbm9uLXNwYW5uaW5nIHNwYWNlcyBmaXJzdC4gVGhl
eSBhcmUgdXNlZCBmb3IgdGhlIGZpbmFsIGRpc3RyaWJ1dGlvbiBhcyB3ZWxsIGFzIGZvciBkaXN0
cmlidXRpbmcgdGhlIHNwYW5uaW5nIHNwYWNlLgorICAgIFZlY3RvcjxPcHRpb25hbDxSZXNvbHZl
ZEl0ZW0+PiByZXNvbHZlZEl0ZW1zKFNwYW5UeXBlOjpzaXplKGdyaWQpKTsKKyAgICBmb3IgKHNp
emVfdCBjb2x1bW5JbmRleCA9IDA7IGNvbHVtbkluZGV4IDwgY29sdW1ucy5zaXplKCk7ICsrY29s
dW1uSW5kZXgpIHsKKyAgICAgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8
IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7CisgICAgICAgICAgICBhdXRvJiBzbG90ID0gKmdy
aWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9KTsKKyAgICAgICAgICAgIGlmIChTcGFu
VHlwZTo6aGFzU3BhbihzbG90KSB8fCBTcGFuVHlwZTo6aXNTcGFubmVkKHNsb3QpKQorICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYXV0byBpbmRleCA9IFNwYW5UeXBlOjpp
bmRleChjb2x1bW5JbmRleCwgcm93SW5kZXgpOworICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEl0
ZW1zW2luZGV4XSkKKyAgICAgICAgICAgICAgICByZXNvbHZlZEl0ZW1zW2luZGV4XSA9IFJlc29s
dmVkSXRlbSB7IH07CisgICAgICAgICAgICByZXNvbHZlZEl0ZW1zW2luZGV4XS0+c2xvdFNwYWNl
ID0gbWF4KHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90U3BhY2UsIHNsb3RTcGFjZShzbG90LCBp
bmRleCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gMi4gQ29sbGVjdCB0aGUgc3Bhbm5p
bmcgY2VsbHMuCisgICAgc3RydWN0IFNwYW5uaW5nQ2VsbCB7CisgICAgICAgIFNsb3RQb3NpdGlv
biBwb3NpdGlvbjsKKyAgICAgICAgR3JpZFNwYWNlIHVucmVzb2x2ZWRTcGFjZTsKKyAgICB9Owor
ICAgIFZlY3RvcjxTcGFubmluZ0NlbGw+IHNwYW5uaW5nQ2VsbHM7CisgICAgZm9yIChzaXplX3Qg
cm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6ZSgpOyArK3Jvd0luZGV4KSB7CisgICAg
ICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0gMDsgY29sdW1uSW5kZXggPCBjb2x1bW5zLnNp
emUoKTsgKytjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgYXV0byYgc2xvdCA9ICpncmlkLnNs
b3QoeyBjb2x1bW5JbmRleCwgcm93SW5kZXggfSk7CisgICAgICAgICAgICBpZiAoU3BhblR5cGU6
Omhhc1NwYW4oc2xvdCkpCisgICAgICAgICAgICAgICAgc3Bhbm5pbmdDZWxscy5hcHBlbmQoeyB7
IGNvbHVtbkluZGV4LCByb3dJbmRleCB9LCBzbG90U3BhY2Uoc2xvdCwgU3BhblR5cGU6OmluZGV4
KGNvbHVtbkluZGV4LCByb3dJbmRleCkpIH0pOworICAgICAgICB9CisgICAgfQorICAgIC8vIFdl
IG5lZWQgdGhlc2Ugc3Bhbm5pbmcgY2VsbHMgaW4gdGhlIG9yZGVyIG9mIHRoZSBudW1iZXIgb2Yg
Y29sdW1ucy9yb3dzIHRoZXkgc3BhbiBzbyB0aGF0CisgICAgLy8gd2UgY2FuIHJlc29sdmUgb3Zl
cmxhcHBpbmcgc3BhbnMgc3RhcnRpbmcgd2l0aCB0aGUgc2hvcnRlciBvbmVzIGUuZy4KKyAgICAv
LyA8dGQgY29sc3Bhbj00PiNhPC90ZD48dGQ+I2I8L3RkPgorICAgIC8vIDx0ZCBjb2xzcGFuPTI+
I2M8L3RkPjx0ZCBjb2xzcGFuPTM+I2Q8L3RkPgorICAgIHN0ZDo6c29ydChzcGFubmluZ0NlbGxz
LmJlZ2luKCksIHNwYW5uaW5nQ2VsbHMuZW5kKCksIFsmXSAoYXV0byYgYSwgYXV0byYgYikgewor
ICAgICAgICByZXR1cm4gU3BhblR5cGU6OnNwYW5Db3VudChncmlkLnNsb3QoYS5wb3NpdGlvbikt
PmNlbGwoKSkgPCBTcGFuVHlwZTo6c3BhbkNvdW50KGdyaWQuc2xvdChiLnBvc2l0aW9uKS0+Y2Vs
bCgpKTsKKyAgICB9KTsKKworICAgIC8vIDMuIERpc3RyaWJ1dGUgdGhlIHNwYW5uaW5nIGNlbGxz
JyBtaW1pbXVtIHNwYWNlIGFjcm9zcyB0aGUgY29sdW1ucy9yb3dzIHVzaW5nIHRoZSBub24tc3Bh
bm5pbmcgc3BhY2VzLgorICAgIC8vIGUuZy4gWyAxIF1bIDUgXVsgMSBdCisgICAgLy8gICAgICBb
ICAgIDkgICBdWyAxIF0KKyAgICAvLyBUaGUgaW5pdGlhbCB3aWR0aHMgYXJlOiBbIDIgXVsgNyBd
WyAxIF0KKyAgICBmb3IgKGF1dG8gc3Bhbm5pbmdDZWxsIDogc3Bhbm5pbmdDZWxscykgeworICAg
ICAgICBhdXRvJiBjZWxsID0gZ3JpZC5zbG90KHNwYW5uaW5nQ2VsbC5wb3NpdGlvbiktPmNlbGwo
KTsKKyAgICAgICAgYXV0byB1bnJlc29sdmVkU3Bhbm5pbmdTcGFjZSA9IHNwYW5uaW5nQ2VsbC51
bnJlc29sdmVkU3BhY2U7CisgICAgICAgIGlmICghcmVzb2x2ZWRJdGVtc1tTcGFuVHlwZTo6c3Rh
cnRTcGFuKGNlbGwpXSB8fCAhcmVzb2x2ZWRJdGVtc1tTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKSAt
IDFdKSB7CisgICAgICAgICAgICAvLyA8dGQgY29sc3Bhbj00PiNhPC90ZD48dGQ+I2I8L3RkPgor
ICAgICAgICAgICAgLy8gPHRkIGNvbHNwYW49Mj4jYzwvdGQ+PHRkIGNvbHNwYW49Mz4jZDwvdGQ+
CisgICAgICAgICAgICAvLyBVbnJlc29sdmVkIGNvbHVtbnMgYXJlOiAxIDIgMyA0CisgICAgICAg
ICAgICAvLyAxLiBUYWtlIGNvbHNwYW49MiAoc2hvcnRlc3Qgc3BhbikgYW5kIHJlc29sdmUgY29s
dW1uIDEgYW5kIDIKKyAgICAgICAgICAgIC8vIDIuIFRha2UgY29sc3Bhbj0zIGFuZCByZXNvbHZl
IGNvbHVtbiAzIGFuZCA0ICg1IGlzIHJlc29sdmVkIGJlY2F1c2UgaXQgYWxyZWFkeSBoYXMgYSBu
b24tc3Bhbm5pbmcgY2VsbCkuCisgICAgICAgICAgICAvLyAzLiBjb2xzcGFuPTQgbmVlZHMgbm8g
cmVzb2x2aW5nIGJlY2F1c2UgYWxsIHRoZSBzcGFubmVkIGNvbHVtbnMgKDEgMiAzIDQpIGhhdmUg
YWxyZWFkeSBiZWVuIHJlc29sdmVkLgorICAgICAgICAgICAgYXV0byB1bnJlc29sdmVkQ29sdW1u
Q291bnQgPSBjZWxsLmNvbHVtblNwYW4oKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBzcGFuSW5k
ZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpOyBzcGFuSW5kZXggPCBTcGFuVHlwZTo6ZW5k
U3BhbihjZWxsKTsgKytzcGFuSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc29sdmVk
SXRlbXNbc3BhbkluZGV4XSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICAgICAgQVNTRVJUKHVucmVzb2x2ZWRDb2x1bW5Db3VudCk7CisgICAgICAgICAgICAgICAg
LS11bnJlc29sdmVkQ29sdW1uQ291bnQ7CisgICAgICAgICAgICAgICAgdW5yZXNvbHZlZFNwYW5u
aW5nU3BhY2UgLT0gcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdLT5zbG90U3BhY2U7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBBU1NFUlQodW5yZXNvbHZlZENvbHVtbkNvdW50KTsKKyAgICAg
ICAgICAgIGF1dG8gZXF1YWxTcGFjZUZvclNwYW5uZWRDb2x1bW5zID0gdW5yZXNvbHZlZFNwYW5u
aW5nU3BhY2UgLyB1bnJlc29sdmVkQ29sdW1uQ291bnQ7CisgICAgICAgICAgICBmb3IgKGF1dG8g
c3BhbkluZGV4ID0gU3BhblR5cGU6OnN0YXJ0U3BhbihjZWxsKTsgc3BhbkluZGV4IDwgU3BhblR5
cGU6OmVuZFNwYW4oY2VsbCk7ICsrc3BhbkluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKHJl
c29sdmVkSXRlbXNbc3BhbkluZGV4XSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICAgICAgcmVzb2x2ZWRJdGVtc1tzcGFuSW5kZXhdID0gUmVzb2x2ZWRJdGVtIHsg
ZXF1YWxTcGFjZUZvclNwYW5uZWRDb2x1bW5zLCBmYWxzZSB9OworICAgICAgICAgICAgfQorICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gMS4gQ29sbGVjdCB0aGUgbm9uLXNwYW5pbmcg
cmVzb2x2ZWQgc3BhY2VzLgorICAgICAgICAgICAgLy8gMi4gRGlzdHJpYnV0ZSB0aGUgZXh0cmEg
c3BhY2UgYW1vbmcgdGhlIHNwYW5uZWQgY29sdW1ucy9yb3dzIGJhc2VkIG9uIHRoZSByZXNvbHZl
ZCBzcGFjZSB2YWx1ZXMuCisgICAgICAgICAgICAvLyBlLmcuIHNwYW5uaW5nIHdpZHRoOiBbICAg
OSAgIF0uIFJlc29sdmVkIHdpZHRocyBmb3IgdGhlIHNwYW5uZWQgY29sdW1uczogWyAxIF0gWyAy
IF0KKyAgICAgICAgICAgIC8vIE5ldyByZXNvbHZlZCB3aWR0aHM6IFsgMyBdIFsgNiBdLgorICAg
ICAgICAgICAgYXV0byByZXNvbHZlZFNwYW5uaW5nU3BhY2UgPSBHcmlkU3BhY2UgeyB9OworICAg
ICAgICAgICAgZm9yIChhdXRvIHNwYW5JbmRleCA9IFNwYW5UeXBlOjpzdGFydFNwYW4oY2VsbCk7
IHNwYW5JbmRleCA8IFNwYW5UeXBlOjplbmRTcGFuKGNlbGwpOyArK3NwYW5JbmRleCkKKyAgICAg
ICAgICAgICAgICByZXNvbHZlZFNwYW5uaW5nU3BhY2UgKz0gcmVzb2x2ZWRJdGVtc1tzcGFuSW5k
ZXhdLT5zbG90U3BhY2U7CisgICAgICAgICAgICBpZiAocmVzb2x2ZWRTcGFubmluZ1NwYWNlLnZh
bHVlID49IHVucmVzb2x2ZWRTcGFubmluZ1NwYWNlLnZhbHVlKSB7CisgICAgICAgICAgICAgICAg
Ly8gVGhlIHNwYW5uaW5nIGNlbGwgZml0cyB0aGUgc3Bhbm5lZCBjb2x1bW5zL3Jvd3MganVzdCBm
aW5lLiBOb3RoaW5nIHRvIGRpc3RyaWJ1dGUuCisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIHNwYWNpbmcgPSBTcGFuVHlwZTo6c3BhY2lu
ZyhncmlkKSAqIChTcGFuVHlwZTo6c3BhbkNvdW50KGNlbGwpIC0gMSk7CisgICAgICAgICAgICBh
dXRvIHNwYWNlVG9EaXN0cmlidXRlID0gdW5yZXNvbHZlZFNwYW5uaW5nU3BhY2UgLSBHcmlkU3Bh
Y2UgeyBzcGFjaW5nLCBzcGFjaW5nIH0gLSByZXNvbHZlZFNwYW5uaW5nU3BhY2U7IAorICAgICAg
ICAgICAgaWYgKCFzcGFjZVRvRGlzdHJpYnV0ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAg
ICBhdXRvIGRpc3RyaWJ1dGlvblJhdGlvID0gc3BhY2VUb0Rpc3RyaWJ1dGUuZGlzdHJpYnV0aW9u
QmFzZSAvIHJlc29sdmVkU3Bhbm5pbmdTcGFjZS5kaXN0cmlidXRpb25CYXNlOworICAgICAgICAg
ICAgICAgIGZvciAoYXV0byBzcGFuSW5kZXggPSBTcGFuVHlwZTo6c3RhcnRTcGFuKGNlbGwpOyBz
cGFuSW5kZXggPCBTcGFuVHlwZTo6ZW5kU3BhbihjZWxsKTsgKytzcGFuSW5kZXgpCisgICAgICAg
ICAgICAgICAgICAgIHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xvdFNwYWNlICs9IEdyaWRT
cGFjZSB7IHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xvdFNwYWNlLnZhbHVlICogZGlzdHJp
YnV0aW9uUmF0aW8sIHJlc29sdmVkSXRlbXNbc3BhbkluZGV4XS0+c2xvdFNwYWNlLmRpc3RyaWJ1
dGlvbkJhc2UgKiBkaXN0cmlidXRpb25SYXRpb307CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICB9CisgICAgLy8gNC4gRGlzdHJpYnV0ZSB0aGUgZXh0cmEgc3BhY2UgdXNpbmcgdGhlIGZp
bmFsIHJlc29sdmVkIHdpZHRocy4KKyNpZiBBU1NFUlRfRU5BQkxFRAorICAgIC8vIFdlIGhhdmUg
dG8gaGF2ZSBhbGwgdGhlIHNwYWNlcyByZXNvbHZlZCBhdCB0aGlzIHBvaW50LgorICAgIGZvciAo
YXV0byYgcmVzb2x2ZWRJdGVtIDogcmVzb2x2ZWRJdGVtcykKKyAgICAgICAgQVNTRVJUKHJlc29s
dmVkSXRlbSk7CisjZW5kaWYKKyAgICAvLyBGaXhlZCBzaXplIGNlbGxzIGRvbid0IHBhcnRpY2lw
YXRlIGluIGF2YWlsYWJsZSBzcGFjZSBkaXN0cmlidXRpb24uCisgICAgYXV0byBhZGp1c3RhYmxl
ZFNwYWNlID0gR3JpZFNwYWNlIHsgfTsKKyAgICBmb3IgKGF1dG8mIHJlc29sdmVkSXRlbSA6IHJl
c29sdmVkSXRlbXMpIHsKKyAgICAgICAgaWYgKHJlc29sdmVkSXRlbS0+aXNGaXhlZCkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICBhZGp1c3RhYmxlZFNwYWNlICs9IHJlc29sdmVkSXRl
bS0+c2xvdFNwYWNlOworICAgIH0KKworICAgIFZlY3RvcjxMYXlvdXRVbml0PiBkaXN0cmlidXRl
ZFNwYWNlcyhyZXNvbHZlZEl0ZW1zLnNpemUoKSk7CisgICAgZmxvYXQgc3BhY2VUb0Rpc3RyaWJ1
dGUgPSBhdmFpbGFibGVTcGFjZSAtIGFkanVzdGFibGVkU3BhY2UudmFsdWUgLSAoKHJlc29sdmVk
SXRlbXMuc2l6ZSgpICsgMSkgKiBTcGFuVHlwZTo6c3BhY2luZyhncmlkKSk7CisgICAgLy8gRXNz
ZW50aWFsbHkgdGhlIHJlbWFpbmluZyBzcGFjZSB0byBkaXN0cmlidXRlIHNob3VsZCBuZXZlciBi
ZSBuZWdhdGl2ZS4gTGF5b3V0VW5pdDo6ZXBzaWxvbigpIGlzIHJlcXVpcmVkIHRvIGNvbXBlbnNh
dGUgZm9yIExheW91dFVuaXQncyBsb3cgcHJlY2lzaW9uLgorICAgIEFTU0VSVChzcGFjZVRvRGlz
dHJpYnV0ZSA+PSAtTGF5b3V0VW5pdDo6ZXBzaWxvbigpICogcmVzb2x2ZWRJdGVtcy5zaXplKCkp
OworICAgIC8vIERpc3RyaWJ1dGUgdGhlIGV4dHJhIHNwYWNlIGJhc2VkIG9uIHRoZSByZXNvbHZl
ZCBzcGFjZXMuCisgICAgYXV0byBkaXN0cmlidXRpb25SYXRpbyA9IHNwYWNlVG9EaXN0cmlidXRl
IC8gYWRqdXN0YWJsZWRTcGFjZS5kaXN0cmlidXRpb25CYXNlOworICAgIGZvciAoc2l6ZV90IGlu
ZGV4ID0gMDsgaW5kZXggPCByZXNvbHZlZEl0ZW1zLnNpemUoKTsgKytpbmRleCkgeworICAgICAg
ICBhdXRvIHNsb3RTcGFjZSA9IHJlc29sdmVkSXRlbXNbaW5kZXhdLT5zbG90U3BhY2UudmFsdWU7
CisgICAgICAgIGF1dG8gbmVlZHNTcGFjZURpc3RyaWJ1dGlvbiA9IHNwYWNlVG9EaXN0cmlidXRl
ICYmICFyZXNvbHZlZEl0ZW1zW2luZGV4XS0+aXNGaXhlZDsKKyAgICAgICAgZGlzdHJpYnV0ZWRT
cGFjZXNbaW5kZXhdID0gTGF5b3V0VW5pdCB7IHNsb3RTcGFjZSB9OworICAgICAgICBpZiAoIW5l
ZWRzU3BhY2VEaXN0cmlidXRpb24pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZGlz
dHJpYnV0ZWRTcGFjZXNbaW5kZXhdICs9IExheW91dFVuaXQgeyByZXNvbHZlZEl0ZW1zW2luZGV4
XS0+c2xvdFNwYWNlLmRpc3RyaWJ1dGlvbkJhc2UgKiBkaXN0cmlidXRpb25SYXRpbyB9OworICAg
IH0KKyAgICByZXR1cm4gZGlzdHJpYnV0ZWRTcGFjZXM7Cit9CisKK1RhYmxlRm9ybWF0dGluZ0Nv
bnRleHQ6OlRhYmxlTGF5b3V0OjpEaXN0cmlidXRlZFNwYWNlcyBUYWJsZUZvcm1hdHRpbmdDb250
ZXh0OjpUYWJsZUxheW91dDo6ZGlzdHJpYnV0ZWRIb3Jpem9udGFsU3BhY2UoTGF5b3V0VW5pdCBh
dmFpbGFibGVIb3Jpem9udGFsU3BhY2UpCit7CisgICAgZW51bSBjbGFzcyBDb2x1bW5XaWR0aEJh
bGFuY2luZ0Jhc2UgeyBNaW5pbXVtV2lkdGgsIE1heGltdW1XaWR0aCB9OworICAgIGF1dG8gY29s
dW1uV2lkdGhCYWxhbmNpbmdCYXNlID0gYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlID09IG1fZ3Jp
ZC53aWR0aENvbnN0cmFpbnRzKCktPm1heGltdW0gPyBDb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2U6
Ok1heGltdW1XaWR0aCA6IENvbHVtbldpZHRoQmFsYW5jaW5nQmFzZTo6TWluaW11bVdpZHRoOwor
ICAgIHJldHVybiBkaXN0cmlidXRlQXZhaWxhYmxlU3BhY2U8Q29sdW1uU3Bhbj4obV9ncmlkLCBh
dmFpbGFibGVIb3Jpem9udGFsU3BhY2UsIFsmXSAoY29uc3QgVGFibGVHcmlkOjpTbG90JiBzbG90
LCBzaXplX3QgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgYXV0byYgY29sdW1uID0gbV9ncmlkLmNv
bHVtbnMoKS5saXN0KClbY29sdW1uSW5kZXhdOworICAgICAgICBhdXRvIGNvbHVtbkJveEZpeGVk
V2lkdGggPSBjb2x1bW4uYm94KCkgPyBjb2x1bW4uYm94KCktPmNvbHVtbldpZHRoKCkudmFsdWVP
cigwX2x1KSA6IDBfbHU7CisgICAgICAgIGlmIChjb2x1bW5XaWR0aEJhbGFuY2luZ0Jhc2UgPT0g
Q29sdW1uV2lkdGhCYWxhbmNpbmdCYXNlOjpNaW5pbXVtV2lkdGgpIHsKKyAgICAgICAgICAgIGF1
dG8gbWluaW11bVdpZHRoID0gc3RkOjptYXg8ZmxvYXQ+KHNsb3Qud2lkdGhDb25zdHJhaW50cygp
Lm1pbmltdW0sIGNvbHVtbkJveEZpeGVkV2lkdGgpOworICAgICAgICAgICAgcmV0dXJuIEdyaWRT
cGFjZSB7IG1pbmltdW1XaWR0aCwgbWluaW11bVdpZHRoIH07CisgICAgICAgIH0KKyAgICAgICAg
Ly8gV2hlbiB0aGUgY29sdW1uIGhhcyBhIGZpeGVkIHdpZHRoIGNlbGwsIHRoZSBtYXhpbXVtIHdp
ZHRoIGJhbGFuY2luZyBpcyBiYXNlZCBvbiB0aGUgbWluaW11bSB3aWR0aC4KKyAgICAgICAgYXV0
byBtaW5pbXVtV2lkdGggPSBzdGQ6Om1heDxmbG9hdD4oc2xvdC53aWR0aENvbnN0cmFpbnRzKCku
bWluaW11bSwgY29sdW1uQm94Rml4ZWRXaWR0aCk7CisgICAgICAgIGF1dG8gbWF4aW11bVdpZHRo
ID0gc3RkOjptYXg8ZmxvYXQ+KHNsb3Qud2lkdGhDb25zdHJhaW50cygpLm1heGltdW0sIGNvbHVt
bkJveEZpeGVkV2lkdGgpOworICAgICAgICBpZiAoY29sdW1uLmlzRml4ZWRXaWR0aCgpKQorICAg
ICAgICAgICAgcmV0dXJuIEdyaWRTcGFjZSB7IG1pbmltdW1XaWR0aCwgbWF4aW11bVdpZHRoIH07
CisgICAgICAgIHJldHVybiBHcmlkU3BhY2UgeyBtYXhpbXVtV2lkdGgsIG1heGltdW1XaWR0aCB9
OworICAgIH0pOworfQorCitUYWJsZUZvcm1hdHRpbmdDb250ZXh0OjpUYWJsZUxheW91dDo6RGlz
dHJpYnV0ZWRTcGFjZXMgVGFibGVGb3JtYXR0aW5nQ29udGV4dDo6VGFibGVMYXlvdXQ6OmRpc3Ry
aWJ1dGVkVmVydGljYWxTcGFjZShPcHRpb25hbDxMYXlvdXRVbml0PiBhdmFpbGFibGVWZXJ0aWNh
bFNwYWNlKQoreworICAgIGF1dG8mIHJvd3MgPSBtX2dyaWQucm93cygpOworICAgIGF1dG8mIGNv
bHVtbnMgPSBtX2dyaWQuY29sdW1ucygpOworCisgICAgVmVjdG9yPExheW91dFVuaXQ+IHJvd0hl
aWdodChyb3dzLnNpemUoKSk7CisgICAgYXV0byB0YWJsZVVzZWRIZWlnaHQgPSBMYXlvdXRVbml0
IHsgfTsKKyAgICAvLyAyLiBDb2xsZWN0IGluaXRpYWwsIGJhc2VsaW5lIGFsaWduZWQgcm93IGhl
aWdodHMuCisgICAgZm9yIChzaXplX3Qgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHJvd3Muc2l6
ZSgpOyArK3Jvd0luZGV4KSB7CisgICAgICAgIGF1dG8gbWF4aW11bUNvbHVtbkFzY2VudCA9IElu
bGluZUxheW91dFVuaXQgeyB9OworICAgICAgICBhdXRvIG1heGltdW1Db2x1bW5EZXNjZW50ID0g
SW5saW5lTGF5b3V0VW5pdCB7IH07CisgICAgICAgIGZvciAoc2l6ZV90IGNvbHVtbkluZGV4ID0g
MDsgY29sdW1uSW5kZXggPCBjb2x1bW5zLnNpemUoKTsgKytjb2x1bW5JbmRleCkgeworICAgICAg
ICAgICAgYXV0byYgc2xvdCA9ICptX2dyaWQuc2xvdCh7IGNvbHVtbkluZGV4LCByb3dJbmRleCB9
KTsKKyAgICAgICAgICAgIGlmIChzbG90LmlzUm93U3Bhbm5lZCgpKQorICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHNsb3QuaGFzUm93U3BhbigpKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgLy8gVGhlIG1pbmltdW0gaGVpZ2h0IG9mIGEg
cm93ICh3aXRob3V0IHNwYW5uaW5nLXJlbGF0ZWQgaGVpZ2h0IGRpc3RyaWJ1dGlvbikgaXMgZGVm
aW5lZCBhcyB0aGUgaGVpZ2h0IG9mIGFuIGh5cG90aGV0aWNhbAorICAgICAgICAgICAgLy8gbGlu
ZWJveCBjb250YWluaW5nIHRoZSBjZWxscyBvcmlnaW5hdGluZyBpbiB0aGUgcm93LgorICAgICAg
ICAgICAgYXV0byYgY2VsbCA9IHNsb3QuY2VsbCgpOworICAgICAgICAgICAgbWF4aW11bUNvbHVt
bkFzY2VudCA9IHN0ZDo6bWF4KG1heGltdW1Db2x1bW5Bc2NlbnQsIGNlbGwuYmFzZWxpbmVPZmZz
ZXQoKSk7CisgICAgICAgICAgICBtYXhpbXVtQ29sdW1uRGVzY2VudCA9IHN0ZDo6bWF4KG1heGlt
dW1Db2x1bW5EZXNjZW50LCBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94KGNlbGwu
Ym94KCkpLmhlaWdodCgpIC0gY2VsbC5iYXNlbGluZU9mZnNldCgpKTsKKyAgICAgICAgfQorICAg
ICAgICAvLyA8dHIgc3R5bGU9ImhlaWdodDogMTBweCI+IGlzIGNvbnNpZGVyZWQgYXMgbWluIGhl
aWdodC4KKyAgICAgICAgcm93SGVpZ2h0W3Jvd0luZGV4XSA9IG1heGltdW1Db2x1bW5Bc2NlbnQg
KyBtYXhpbXVtQ29sdW1uRGVzY2VudDsKKyAgICAgICAgdGFibGVVc2VkSGVpZ2h0ICs9IHJvd0hl
aWdodFtyb3dJbmRleF07CisgICAgfQorICAgIC8vIEZJWE1FOiBDb2xsZWN0IHNwYW5uaW5nIHJv
dyBtYXhpbXVtIGhlaWdodHMuCisKKyAgICB0YWJsZVVzZWRIZWlnaHQgKz0gKHJvd3Muc2l6ZSgp
ICsgMSkgKiBtX2dyaWQudmVydGljYWxTcGFjaW5nKCk7CisgICAgYXV0byBhdmFpbGFibGVTcGFj
ZSA9IHN0ZDo6bWF4KGF2YWlsYWJsZVZlcnRpY2FsU3BhY2UudmFsdWVPcigwX2x1KSwgdGFibGVV
c2VkSGVpZ2h0KTsKKyAgICAvLyBEaXN0cmlidXRlIGV4dHJhIHNwYWNlIGlmIHRoZSB0YWJsZSBp
cyBzdXBwb3NlZCB0byBiZSB0YWxsZXIgdGhhbiB0aGUgc3VtIG9mIHRoZSByb3cgaGVpZ2h0cy4K
KyAgICByZXR1cm4gZGlzdHJpYnV0ZUF2YWlsYWJsZVNwYWNlPFJvd1NwYW4+KG1fZ3JpZCwgYXZh
aWxhYmxlU3BhY2UsIFsmXSAoY29uc3QgVGFibGVHcmlkOjpTbG90JiBzbG90LCBzaXplX3Qgcm93
SW5kZXgpIHsKKyAgICAgICAgaWYgKHNsb3QuaGFzUm93U3BhbigpKQorICAgICAgICAgICAgcmV0
dXJuIEdyaWRTcGFjZSB7IGZvcm1hdHRpbmdDb250ZXh0KCkuZ2VvbWV0cnlGb3JCb3goc2xvdC5j
ZWxsKCkuYm94KCkpLmhlaWdodCgpLCBmb3JtYXR0aW5nQ29udGV4dCgpLmdlb21ldHJ5Rm9yQm94
KHNsb3QuY2VsbCgpLmJveCgpKS5oZWlnaHQoKSB9OworICAgICAgICBhdXRvJiByb3dzID0gbV9n
cmlkLnJvd3MoKTsKKyAgICAgICAgYXV0byBjb21wdXRlZFJvd0hlaWdodCA9IGZvcm1hdHRpbmdD
b250ZXh0KCkuZ2VvbWV0cnkoKS5jb21wdXRlZEhlaWdodChyb3dzLmxpc3QoKVtyb3dJbmRleF0u
Ym94KCksIHsgfSk7CisgICAgICAgIGF1dG8gaGVpZ2h0ID0gc3RkOjptYXg8ZmxvYXQ+KHJvd0hl
aWdodFtyb3dJbmRleF0sIGNvbXB1dGVkUm93SGVpZ2h0LnZhbHVlT3IoMF9sdSkpOworICAgICAg
ICByZXR1cm4gR3JpZFNwYWNlIHsgaGVpZ2h0LCBoZWlnaHQgfTsKKyAgICB9KTsKK30KKworfQor
fQorCisjZW5kaWYK
</data>

          </attachment>
      

    </bug>

</bugzilla>