<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://jogamp.org/bugzilla/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.2"
          urlbase="https://jogamp.org/bugzilla/"
          
          maintainer="sgothel@jausoft.com"
>

    <bug>
          <bug_id>408</bug_id>
          
          <creation_ts>2010-08-30 07:32:00 +0200</creation_ts>
          <short_desc>patch with fft code and demo for jocl-demos</short_desc>
          <delta_ts>2010-09-03 17:29:40 +0200</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>3</classification_id>
          <classification>JogAmp</classification>
          <product>Jocl</product>
          <component>opencl</component>
          <version>1</version>
          <rep_platform>All</rep_platform>
          <op_sys>all</op_sys>
          <bug_status>VERIFIED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>---</priority>
          <bug_severity>enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter>notzed</reporter>
          <assigned_to name="Michael Bien">bienator</assigned_to>
          
          
          <cf_type>---</cf_type>
          <cf_scm_refs></cf_scm_refs>
          <cf_workaround>---</cf_workaround>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>487</commentid>
    <comment_count>0</comment_count>
      <attachid>152</attachid>
    <who name="">notzed</who>
    <bug_when>2010-08-30 07:32:00 +0200</bug_when>
    <thetext>Created attachment 152
the patch

patch for jocl-demos including a port of apple&apos;s opencl fft implementation plus a simple gui app to demonstrate.

the code for the demo is a bit crappy, if you want it cleaned up first give us a few days.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>488</commentid>
    <comment_count>1</comment_count>
    <who name="Michael Bien">bienator</who>
    <bug_when>2010-09-03 17:29:40 +0200</bug_when>
    <thetext>I applied your patch with minor changes:
http://github.com/mbien/jocl-demos/commit/4455385dd411375345688685dd561652708a7024
thanks again.

Please consider forking the repository if you would like to continue working on the sample (or other things).</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>152</attachid>
            <date>2010-08-30 07:32:00 +0200</date>
            <delta_ts>2010-08-30 07:32:00 +0200</delta_ts>
            <desc>the patch</desc>
            <filename>jocl-fft.diff</filename>
            <type>text/plain</type>
            <size>98795</size>
            <attacher>notzed</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL3NyYy9jb20vam9nYW1wL29wZW5jbC9kZW1vcy9mZnQvQmx1clRlc3QuamF2
YSBiL3NyYy9jb20vam9nYW1wL29wZW5jbC9kZW1vcy9mZnQvQmx1clRlc3QuamF2YQpuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODNmMGE2Ci0tLSAvZGV2L251bGwKKysrIGIv
c3JjL2NvbS9qb2dhbXAvb3BlbmNsL2RlbW9zL2ZmdC9CbHVyVGVzdC5qYXZhCkBAIC0wLDAgKzEs
NTAxIEBACitwYWNrYWdlIGNvbS5qb2dhbXAub3BlbmNsLmRlbW9zLmZmdDsKKworaW1wb3J0IGNv
bS5qb2dhbXAub3BlbmNsLkNMQnVmZmVyOworaW1wb3J0IGNvbS5qb2dhbXAub3BlbmNsLkNMQ29t
bWFuZFF1ZXVlOworaW1wb3J0IGNvbS5qb2dhbXAub3BlbmNsLkNMQ29udGV4dDsKK2ltcG9ydCBj
b20uam9nYW1wLm9wZW5jbC5DTEtlcm5lbDsKK2ltcG9ydCBjb20uam9nYW1wLm9wZW5jbC5DTE1l
bW9yeS5NZW07CitpbXBvcnQgY29tLmpvZ2FtcC5vcGVuY2wuQ0xQcm9ncmFtOworaW1wb3J0IGNv
bS5qb2dhbXAub3BlbmNsLmRlbW9zLmZmdC5DTEZGVFBsYW4uSW52YWxpZENvbnRleHRFeGNlcHRp
b247CitpbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OworaW1wb3J0IGphdmEuYXd0LkRpbWVu
c2lvbjsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKK2ltcG9ydCBqYXZhLmF3dC5HcmlkQmFn
Q29uc3RyYWludHM7CitpbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0xheW91dDsKK2ltcG9ydCBqYXZh
LmF3dC5JbnNldHM7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7CitpbXBvcnQg
amF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVm
ZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5EYXRhQnVmZmVyQnl0ZTsKK2ltcG9y
dCBqYXZhLmF3dC5pbWFnZS5EYXRhQnVmZmVySW50OworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2lt
cG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9u
OworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZm
ZXI7CitpbXBvcnQgamF2YS5uaW8uSW50QnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5n
LkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZheC5p
bWFnZWlvLkltYWdlSU87CitpbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0OworaW1wb3J0IGph
dmF4LnN3aW5nLkJ1dHRvbkdyb3VwOworaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247CitpbXBv
cnQgamF2YXguc3dpbmcuSkZpbGVDaG9vc2VyOworaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsK
K2ltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7CitpbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBh
bmU7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpTbGlk
ZXI7CitpbXBvcnQgamF2YXguc3dpbmcuSlRvZ2dsZUJ1dHRvbjsKK2ltcG9ydCBqYXZheC5zd2lu
Zy5Td2luZ1V0aWxpdGllczsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsK
K2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKKworLyoqCisgKiBQZXJm
b3JtIHNvbWUgdXNlci1jb250cm9sbGFibGUgYmx1ciBvbiBhbiBpbWFnZS4KKyAqIEBhdXRob3Ig
bm90emVkCisgKi8KK3B1YmxpYyBjbGFzcyBCbHVyVGVzdCBpbXBsZW1lbnRzIFJ1bm5hYmxlLCBD
aGFuZ2VMaXN0ZW5lciwgQWN0aW9uTGlzdGVuZXIgeworCisJcHVibGljIHN0YXRpYyB2b2lkIG1h
aW4oU3RyaW5nW10gYXJncykgeworCQlTd2luZ1V0aWxpdGllcy5pbnZva2VMYXRlcihuZXcgQmx1
clRlc3QoKSk7CisJfQorCWJvb2xlYW4gZGVtbyA9IGZhbHNlOworCS8vIG11c3QgYmUgcG93ZXIg
b2YgMiBhbmQgd2lkdGggbXVzdCBiZSBtdWx0aXBsZSBvZiA2NAorCWludCB3aWR0aCA9IDUxMjsK
KwlpbnQgaGVpZ2h0ID0gNTEyOworCUJ1ZmZlcmVkSW1hZ2Ugc3JjOworCUJ1ZmZlcmVkSW1hZ2Ug
cHNmOworCUJ1ZmZlcmVkSW1hZ2UgZHN0OworCVBhaW50VmlldyBsZWZ0OworCUltYWdlVmlldyBy
aWdodDsKKwkvLworCUpTbGlkZXIgc2l6ZXg7CisJSlNsaWRlciBzaXpleTsKKwlKU2xpZGVyIGFu
Z2xlOworCS8vCisJSlRvZ2dsZUJ1dHRvbiBibHVyQnV0dG9uOworCUpUb2dnbGVCdXR0b24gZHJh
d0J1dHRvbjsKKworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJdHJ5IHsKKwkJCWluaXRDTCgpOwor
CQl9IGNhdGNoIChFeGNlcHRpb24geCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJmYWlsZWQg
dG8gaW5pdCBjbCAiICsgeC5nZXRNZXNzYWdlKCkpOworCQkJU3lzdGVtLmV4aXQoMSk7CisJCX0K
KworCQlKRmlsZUNob29zZXIgZmMgPSBuZXcgSkZpbGVDaG9vc2VyKCk7CisJCUJ1ZmZlcmVkSW1h
Z2UgaW1nID0gbnVsbDsKKworCQl3aGlsZSAoaW1nID09IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJ
RmlsZSBmaWxlID0gbnVsbDsKKworCQkJCWlmICh0cnVlKSB7CisJCQkJCWZjLnNldERpYWxvZ1Rp
dGxlKCJTZWxlY3QgSW1hZ2UgRmlsZSIpOworCQkJCQlmYy5zZXRQcmVmZXJyZWRTaXplKG5ldyBE
aW1lbnNpb24oNTAwLCA2MDApKTsKKwkJCQkJaWYgKGZjLnNob3dPcGVuRGlhbG9nKG51bGwpID09
IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgeworCQkJCQkJZmlsZSA9IGZjLmdldFNlbGVj
dGVkRmlsZSgpOworCQkJCQl9IGVsc2UgeworCQkJCQkJU3lzdGVtLmV4aXQoMCk7CisJCQkJCX0K
KworCQkJCX0gZWxzZSB7CisJCQkJCWZpbGUgPSBuZXcgRmlsZSgiL2hvbWUvbm90emVkL2NhdDAu
anBnIik7CisJCQkJfQorCQkJCWltZyA9IEltYWdlSU8ucmVhZChmaWxlKTsKKwkJCQlpZiAoaW1n
ID09IG51bGwpIHsKKwkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgIkNv
dWxkbid0IGxvYWQgZmlsZSIpOworCQkJCX0KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsK
KwkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAiQ291bGRuJ3QgbG9hZCBm
aWxlIik7CisJCQl9CisJCX0KKworCQlzcmMgPSBuZXcgQnVmZmVyZWRJbWFnZSh3aWR0aCwgaGVp
Z2h0LCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpOworCQlkc3QgPSBuZXcgQnVmZmVyZWRJ
bWFnZSh3aWR0aCwgaGVpZ2h0LCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX1JHQik7CisJCXBzZiA9
IG5ldyBCdWZmZXJlZEltYWdlKHdpZHRoLCBoZWlnaHQsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9CWVRF
X0dSQVkpOworCisJCS8vIEVuc3VyZSBsb2FkZWQgaW1hZ2UgaXMgaW4ga25vd24gZm9ybWF0IGFu
ZCBzaXplCisJCUdyYXBoaWNzIGcgPSBzcmMuY3JlYXRlR3JhcGhpY3MoKTsKKwkJZy5kcmF3SW1h
Z2UoaW1nLCAod2lkdGggLSBpbWcuZ2V0V2lkdGgoKSkgLyAyLCAoaGVpZ2h0IC0gaW1nLmdldEhl
aWdodCgpKSAvIDIsIG51bGwpOworCQlnLmRpc3Bvc2UoKTsKKworCQlKRnJhbWUgd2luID0gbmV3
IEpGcmFtZSgiQmx1ciBEZW1vIik7CisJCXdpbi5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24od2lu
LkVYSVRfT05fQ0xPU0UpOworCisJCUpQYW5lbCBtYWluID0gbmV3IEpQYW5lbCgpOworCQltYWlu
LnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCisJCUpQYW5lbCBjb250cm9scyA9IG5l
dyBKUGFuZWwoKTsKKwkJY29udHJvbHMuc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkpOwor
CisJCUdyaWRCYWdDb25zdHJhaW50cyBjMCA9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKKwkJ
YzAuZ3JpZHggPSAwOworCQljMC5hbmNob3IgPSBHcmlkQmFnQ29uc3RyYWludHMuQkFTRUxJTkVf
TEVBRElORzsKKwkJYzAuaXBhZHggPSAzOworCQljMC5pbnNldHMgPSBuZXcgSW5zZXRzKDEsIDIs
IDEsIDIpOworCisJCWNvbnRyb2xzLmFkZChuZXcgSkxhYmVsKCJXaWR0aCIpLCBjMCk7CisJCWNv
bnRyb2xzLmFkZChuZXcgSkxhYmVsKCJIZWlnaHQiKSwgYzApOworCisJCUdyaWRCYWdDb25zdHJh
aW50cyBjMiA9IChHcmlkQmFnQ29uc3RyYWludHMpIGMwLmNsb25lKCk7CisJCWMyLmdyaWR4ID0g
MjsKKwkJY29udHJvbHMuYWRkKG5ldyBKTGFiZWwoIkFuZ2xlIiksIGMyKTsKKworCQljMCA9IChH
cmlkQmFnQ29uc3RyYWludHMpIGMwLmNsb25lKCk7CisJCWMwLmdyaWR4ID0gMTsKKwkJYzAud2Vp
Z2h0eCA9IDE7CisJCWMwLmZpbGwgPSBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTDsKKwkJ
c2l6ZXggPSBuZXcgSlNsaWRlcigxMDAsIDUwMDAsIDEwMDApOworCQlzaXpleSA9IG5ldyBKU2xp
ZGVyKDEwMCwgNTAwMCwgMTAwKTsKKwkJY29udHJvbHMuYWRkKHNpemV4LCBjMCk7CisJCWNvbnRy
b2xzLmFkZChzaXpleSwgYzApOworCisJCWMyID0gKEdyaWRCYWdDb25zdHJhaW50cykgYzAuY2xv
bmUoKTsKKwkJYzIuZ3JpZHggPSAzOworCQlhbmdsZSA9IG5ldyBKU2xpZGVyKDAsIChpbnQpIChN
YXRoLlBJICogMTAwMCkpOworCQljb250cm9scy5hZGQoYW5nbGUsIGMyKTsKKworCQlzaXpleC5h
ZGRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKwkJc2l6ZXkuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcyk7
CisJCWFuZ2xlLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMpOworCisJCUpQYW5lbCBidXR0b25zID0g
bmV3IEpQYW5lbCgpOworCQljb250cm9scy5hZGQoYnV0dG9ucywgYzIpOworCQlKQnV0dG9uIGI7
CisJCWIgPSBuZXcgSkJ1dHRvbigiQ2xlYXIiKTsKKwkJYnV0dG9ucy5hZGQoYik7CisJCWIuYWRk
QWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCisJCQlwdWJsaWMgdm9pZCBh
Y3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworCQkJCWRvY2xlYXIoKTsKKwkJCX0KKwkJ
fSk7CisJCUJ1dHRvbkdyb3VwIG9wdCA9IG5ldyBCdXR0b25Hcm91cCgpOworCQlKVG9nZ2xlQnV0
dG9uIHRiOworCQlibHVyQnV0dG9uID0gbmV3IEpUb2dnbGVCdXR0b24oIkJsdXIiKTsKKwkJb3B0
LmFkZChibHVyQnV0dG9uKTsKKwkJYnV0dG9ucy5hZGQoYmx1ckJ1dHRvbik7CisJCWJsdXJCdXR0
b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCWRyYXdCdXR0b24gPSBuZXcgSlRvZ2dsZUJ1
dHRvbigiRHJhdyIpOworCQlvcHQuYWRkKGRyYXdCdXR0b24pOworCQlidXR0b25zLmFkZChkcmF3
QnV0dG9uKTsKKwkJZHJhd0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKworCQlKUGFu
ZWwgaW1ncyA9IG5ldyBKUGFuZWwoKTsKKwkJaW1ncy5zZXRMYXlvdXQobmV3IEJveExheW91dChp
bWdzLCBCb3hMYXlvdXQuWF9BWElTKSk7CisJCWxlZnQgPSBuZXcgUGFpbnRWaWV3KHRoaXMsIHBz
Zik7CisJCXJpZ2h0ID0gbmV3IEltYWdlVmlldyhkc3QpOworCQlpbWdzLmFkZChsZWZ0KTsKKwkJ
aW1ncy5hZGQocmlnaHQpOworCisJCW1haW4uYWRkKGNvbnRyb2xzLCBCb3JkZXJMYXlvdXQuTk9S
VEgpOworCQltYWluLmFkZChpbWdzLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJd2luLmdldENv
bnRlbnRQYW5lKCkuYWRkKG1haW4pOworCisJCXdpbi5wYWNrKCk7CisJCXdpbi5zZXRWaXNpYmxl
KHRydWUpOworCisJCS8vIHByZS1sb2FkIGFuZCB0cmFuc2Zvcm0gc3JjLCBzaW5jZSB0aGF0IHdv
bnQgY2hhbmdlCisJCWxvYWRTb3VyY2Uoc3JjKTsKKworCQlibHVyQnV0dG9uLmRvQ2xpY2soKTsK
Kwl9CisKKwlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgeworCQlpZiAo
ZHJhd0J1dHRvbi5pc1NlbGVjdGVkKCkpIHsKKwkJCXJlY2FsYygpOworCQl9IGVsc2UgeworCQkJ
ZG91YmxlIHcgPSBzaXpleC5nZXRWYWx1ZSgpIC8gMTAwLjA7CisJCQlkb3VibGUgaCA9IHNpemV5
LmdldFZhbHVlKCkgLyAxMDAuMDsKKwkJCWRvdWJsZSBhID0gYW5nbGUuZ2V0VmFsdWUoKSAvIDEw
MDAuMDsKKworCQkJR3JhcGhpY3MgZyA9IHBzZi5jcmVhdGVHcmFwaGljcygpOworCisJCQlnLmNs
ZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKwkJCWcuZGlzcG9zZSgpOworCisJCQlsZWZ0
LmRyYXdEb3QodywgaCwgYSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3Jt
ZWQoQWN0aW9uRXZlbnQgZSkgeworCQlzdGF0ZUNoYW5nZWQobnVsbCk7CisJfQorCisJcHJpdmF0
ZSB2b2lkIGRvY2xlYXIoKSB7CisJCUdyYXBoaWNzIGcgPSBwc2YuY3JlYXRlR3JhcGhpY3MoKTsK
KworCQlnLmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKwkJZy5kaXNwb3NlKCk7CisJ
CWxlZnQucmVwYWludCgpOworCQlyZWNhbGMoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZG9yZWNh
bGMoKSB7CisJCWxvYWRQU0YocHNmKTsKKworCQkvLyBjb252b2x2ZSBlYWNoIHBsYW5lIGluIGZy
ZXEgZG9tYWluCisJCWNvbnZvbHZlKGFDQnVmZmVyLCBwc2ZCdWZmZXIsIGFHQnVmZmVyKTsKKwkJ
Y29udm9sdmUockNCdWZmZXIsIHBzZkJ1ZmZlciwgckdCdWZmZXIpOworCQljb252b2x2ZShnQ0J1
ZmZlciwgcHNmQnVmZmVyLCBnR0J1ZmZlcik7CisJCWNvbnZvbHZlKGJDQnVmZmVyLCBwc2ZCdWZm
ZXIsIGJHQnVmZmVyKTsKKworCQkvLyBjb252ZXJ0IGJhY2sgdG8gc3BhdGlhbCBkb21haW4KKwkJ
ZmZ0LmV4ZWN1dGVJbnRlcmxlYXZlZChxLCAxLCBDTEZGVFBsYW4uQ0xGRlREaXJlY3Rpb24uSW52
ZXJzZSwgYUdCdWZmZXIsIGFCdWZmZXIsIG51bGwsIG51bGwpOworCQlmZnQuZXhlY3V0ZUludGVy
bGVhdmVkKHEsIDEsIENMRkZUUGxhbi5DTEZGVERpcmVjdGlvbi5JbnZlcnNlLCByR0J1ZmZlciwg
ckJ1ZmZlciwgbnVsbCwgbnVsbCk7CisJCWZmdC5leGVjdXRlSW50ZXJsZWF2ZWQocSwgMSwgQ0xG
RlRQbGFuLkNMRkZURGlyZWN0aW9uLkludmVyc2UsIGdHQnVmZmVyLCBnQnVmZmVyLCBudWxsLCBu
dWxsKTsKKwkJZmZ0LmV4ZWN1dGVJbnRlcmxlYXZlZChxLCAxLCBDTEZGVFBsYW4uQ0xGRlREaXJl
Y3Rpb24uSW52ZXJzZSwgYkdCdWZmZXIsIGJCdWZmZXIsIG51bGwsIG51bGwpOworCisJCS8vIHdo
aWxlIGdwdSBpcyBydW5uaW5nLCBjYWxjdWxhdGUgZW5lcmd5IG9mIHBzZgorCQlmbG9hdCBzY2Fs
ZTsKKworCQlsb25nIHRvdGFsID0gMDsKKwkJRGF0YUJ1ZmZlckJ5dGUgcGQgPSAoRGF0YUJ1ZmZl
ckJ5dGUpIHBzZi5nZXRSYXN0ZXIoKS5nZXREYXRhQnVmZmVyKCk7CisJCWJ5dGVbXSBkYXRhID0g
cGQuZ2V0RGF0YSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsK
KwkJCXRvdGFsICs9IGRhdGFbaV0gJiAweGZmOworCQl9CisJCXNjYWxlID0gMjU1LjBmIC8gdG90
YWwgLyB3aWR0aCAvIGhlaWdodDsKKworCQlnZXREZXN0aW5hdGlvbihhcmdiQnVmZmVyLCBhQnVm
ZmVyLCByQnVmZmVyLCBnQnVmZmVyLCBiQnVmZmVyLCBzY2FsZSk7CisKKwkJLy8gZHJvcCBiYWNr
IHRvIGphdmEsIHNsb3ctY3JhcHB5LW1ldGhvZAorCQlxLnB1dFJlYWRCdWZmZXIoYXJnYkJ1ZmZl
ciwgdHJ1ZSk7CisJCURhdGFCdWZmZXJJbnQgZGIgPSAoRGF0YUJ1ZmZlckludCkgZHN0LmdldFJh
c3RlcigpLmdldERhdGFCdWZmZXIoKTsKKwkJYXJnYkJ1ZmZlci5nZXRCdWZmZXIoKS5wb3NpdGlv
bigwKTsKKwkJYXJnYkJ1ZmZlci5nZXRCdWZmZXIoKS5nZXQoZGIuZ2V0RGF0YSgpKTsKKwkJYXJn
YkJ1ZmZlci5nZXRCdWZmZXIoKS5wb3NpdGlvbigwKTsKKwkJcmlnaHQucmVwYWludCgpOworCX0K
KwlSdW5uYWJsZSBsYXRlcjsKKworCXZvaWQgcmVjYWxjKCkgeworCQlpZiAobGF0ZXIgPT0gbnVs
bCkgeworCQkJbGF0ZXIgPSBuZXcgUnVubmFibGUoKSB7CisKKwkJCQlwdWJsaWMgdm9pZCBydW4o
KSB7CisJCQkJCWxhdGVyID0gbnVsbDsKKwkJCQkJZG9yZWNhbGMoKTsKKwkJCQl9CisJCQl9Owor
CQkJU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIobGF0ZXIpOworCQl9CisJfQorCUNMQ29udGV4
dCBjbDsKKwlDTENvbW1hbmRRdWV1ZSBxOworCUNMUHJvZ3JhbSBwcm9nOworCUNMS2VybmVsIGtJ
bWcyUGxhbmVzOworCUNMS2VybmVsIGtQbGFuZXMySW1nOworCUNMS2VybmVsIGtHcmV5MlBsYW5l
OworCUNMS2VybmVsIGtDb252b2x2ZTsKKwlDTEtlcm5lbCBrRGVjb252b2x2ZTsKKwlDTEZGVFBs
YW4gZmZ0OworCUNMQnVmZmVyPEludEJ1ZmZlcj4gYXJnYkJ1ZmZlcjsKKwlDTEJ1ZmZlcjxCeXRl
QnVmZmVyPiBncmV5QnVmZmVyOworCUNMQnVmZmVyPEZsb2F0QnVmZmVyPiBhQnVmZmVyOworCUNM
QnVmZmVyPEZsb2F0QnVmZmVyPiByQnVmZmVyOworCUNMQnVmZmVyPEZsb2F0QnVmZmVyPiBnQnVm
ZmVyOworCUNMQnVmZmVyPEZsb2F0QnVmZmVyPiBiQnVmZmVyOworCUNMQnVmZmVyPEZsb2F0QnVm
ZmVyPiBhQ0J1ZmZlcjsKKwlDTEJ1ZmZlcjxGbG9hdEJ1ZmZlcj4gckNCdWZmZXI7CisJQ0xCdWZm
ZXI8RmxvYXRCdWZmZXI+IGdDQnVmZmVyOworCUNMQnVmZmVyPEZsb2F0QnVmZmVyPiBiQ0J1ZmZl
cjsKKwlDTEJ1ZmZlcjxGbG9hdEJ1ZmZlcj4gYUdCdWZmZXI7CisJQ0xCdWZmZXI8RmxvYXRCdWZm
ZXI+IHJHQnVmZmVyOworCUNMQnVmZmVyPEZsb2F0QnVmZmVyPiBnR0J1ZmZlcjsKKwlDTEJ1ZmZl
cjxGbG9hdEJ1ZmZlcj4gYkdCdWZmZXI7CisJQ0xCdWZmZXI8RmxvYXRCdWZmZXI+IHBzZkJ1ZmZl
cjsKKwlDTEJ1ZmZlcjxGbG9hdEJ1ZmZlcj4gdG1wQnVmZmVyOworCS8vCisJQ0xLZXJuZWwgZmZ0
NTEyOworCisJdm9pZCBpbml0Q0woKSB0aHJvd3MgSW52YWxpZENvbnRleHRFeGNlcHRpb24gewor
CQljbCA9IENMQ29udGV4dC5jcmVhdGUoKTsKKworCQlxID0gY2wuZ2V0RGV2aWNlcygpWzBdLmNy
ZWF0ZUNvbW1hbmRRdWV1ZSgpOworCisJCXByb2cgPSBjbC5jcmVhdGVQcm9ncmFtKGltZzJQbGFu
ZXMgKyBwbGFuZXMySW1nICsgY29udm9sdmUgKyBncmV5MlBsYW5lICsgZGVjb252b2x2ZSk7CisJ
CXByb2cuYnVpbGQoIi1jbC1tYWQtZW5hYmxlIik7CisKKwkJa0ltZzJQbGFuZXMgPSBwcm9nLmNy
ZWF0ZUNMS2VybmVsKCJpbWcycGxhbmVzIik7CisJCWtQbGFuZXMySW1nID0gcHJvZy5jcmVhdGVD
TEtlcm5lbCgicGxhbmVzMmltZyIpOworCQlrR3JleTJQbGFuZSA9IHByb2cuY3JlYXRlQ0xLZXJu
ZWwoImdyZXkycGxhbmUiKTsKKwkJa0NvbnZvbHZlID0gcHJvZy5jcmVhdGVDTEtlcm5lbCgiY29u
dm9sdmUiKTsKKwkJa0RlY29udm9sdmUgPSBwcm9nLmNyZWF0ZUNMS2VybmVsKCJkZWNvbnZvbHZl
Iik7CisKKwkJYXJnYkJ1ZmZlciA9IGNsLmNyZWF0ZUludEJ1ZmZlcih3aWR0aCAqIGhlaWdodCwg
TWVtLlJFQURfV1JJVEUpOworCQlncmV5QnVmZmVyID0gY2wuY3JlYXRlQnl0ZUJ1ZmZlcih3aWR0
aCAqIGhlaWdodCwgTWVtLlJFQURfV1JJVEUpOworCQlhQnVmZmVyID0gY2wuY3JlYXRlRmxvYXRC
dWZmZXIod2lkdGggKiBoZWlnaHQgKiAyLCBNZW0uUkVBRF9XUklURSk7CisJCXJCdWZmZXIgPSBj
bC5jcmVhdGVGbG9hdEJ1ZmZlcih3aWR0aCAqIGhlaWdodCAqIDIsIE1lbS5SRUFEX1dSSVRFKTsK
KwkJZ0J1ZmZlciA9IGNsLmNyZWF0ZUZsb2F0QnVmZmVyKHdpZHRoICogaGVpZ2h0ICogMiwgTWVt
LlJFQURfV1JJVEUpOworCQliQnVmZmVyID0gY2wuY3JlYXRlRmxvYXRCdWZmZXIod2lkdGggKiBo
ZWlnaHQgKiAyLCBNZW0uUkVBRF9XUklURSk7CisJCXBzZkJ1ZmZlciA9IGNsLmNyZWF0ZUZsb2F0
QnVmZmVyKHdpZHRoICogaGVpZ2h0ICogMiwgTWVtLlJFQURfV1JJVEUpOworCQl0bXBCdWZmZXIg
PSBjbC5jcmVhdGVGbG9hdEJ1ZmZlcih3aWR0aCAqIGhlaWdodCAqIDIsIE1lbS5SRUFEX1dSSVRF
KTsKKworCQlhQ0J1ZmZlciA9IGNsLmNyZWF0ZUZsb2F0QnVmZmVyKHdpZHRoICogaGVpZ2h0ICog
MiwgTWVtLlJFQURfV1JJVEUpOworCQlyQ0J1ZmZlciA9IGNsLmNyZWF0ZUZsb2F0QnVmZmVyKHdp
ZHRoICogaGVpZ2h0ICogMiwgTWVtLlJFQURfV1JJVEUpOworCQlnQ0J1ZmZlciA9IGNsLmNyZWF0
ZUZsb2F0QnVmZmVyKHdpZHRoICogaGVpZ2h0ICogMiwgTWVtLlJFQURfV1JJVEUpOworCQliQ0J1
ZmZlciA9IGNsLmNyZWF0ZUZsb2F0QnVmZmVyKHdpZHRoICogaGVpZ2h0ICogMiwgTWVtLlJFQURf
V1JJVEUpOworCisJCWFHQnVmZmVyID0gY2wuY3JlYXRlRmxvYXRCdWZmZXIod2lkdGggKiBoZWln
aHQgKiAyLCBNZW0uUkVBRF9XUklURSk7CisJCXJHQnVmZmVyID0gY2wuY3JlYXRlRmxvYXRCdWZm
ZXIod2lkdGggKiBoZWlnaHQgKiAyLCBNZW0uUkVBRF9XUklURSk7CisJCWdHQnVmZmVyID0gY2wu
Y3JlYXRlRmxvYXRCdWZmZXIod2lkdGggKiBoZWlnaHQgKiAyLCBNZW0uUkVBRF9XUklURSk7CisJ
CWJHQnVmZmVyID0gY2wuY3JlYXRlRmxvYXRCdWZmZXIod2lkdGggKiBoZWlnaHQgKiAyLCBNZW0u
UkVBRF9XUklURSk7CisJCWlmIChmYWxzZSkgeworCQkJdHJ5IHsKKwkJCQlDTFByb2dyYW0gcCA9
IGNsLmNyZWF0ZVByb2dyYW0obmV3IEZpbGVJbnB1dFN0cmVhbSgiL2hvbWUvbm90emVkL2NsL2Zm
dC01MTIuY2wiKSk7CisJCQkJcC5idWlsZCgpOworCQkJCWZmdDUxMiA9IHAuY3JlYXRlQ0xLZXJu
ZWwoImZmdDAiKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisJCQkJTG9nZ2VyLmdl
dExvZ2dlcihCbHVyVGVzdC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGws
IGV4KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZmdCA9IG5ldyBDTEZGVFBsYW4oY2wsIG5ldyBp
bnRbXXt3aWR0aCwgaGVpZ2h0fSwgQ0xGRlRQbGFuLkNMRkZURGF0YUZvcm1hdC5JbnRlcmxlYXZl
ZENvbXBsZXhGb3JtYXQpOworCQl9CisJCS8vZmZ0LmR1bXBQbGFuKG51bGwpOworCX0KKworCXZv
aWQgbG9hZFNvdXJjZShCdWZmZXJlZEltYWdlIHNyYykgeworCQlEYXRhQnVmZmVySW50IHNiID0g
KERhdGFCdWZmZXJJbnQpIHNyYy5nZXRSYXN0ZXIoKS5nZXREYXRhQnVmZmVyKCk7CisKKwkJYXJn
YkJ1ZmZlci5nZXRCdWZmZXIoKS5wb3NpdGlvbigwKTsKKwkJYXJnYkJ1ZmZlci5nZXRCdWZmZXIo
KS5wdXQoc2IuZ2V0RGF0YSgpKTsKKwkJYXJnYkJ1ZmZlci5nZXRCdWZmZXIoKS5wb3NpdGlvbigw
KTsKKwkJcS5wdXRXcml0ZUJ1ZmZlcihhcmdiQnVmZmVyLCBmYWxzZSk7CisKKwkJa0ltZzJQbGFu
ZXMuc2V0QXJnKDAsIGFyZ2JCdWZmZXIpOworCQlrSW1nMlBsYW5lcy5zZXRBcmcoMSwgMCk7CisJ
CWtJbWcyUGxhbmVzLnNldEFyZygyLCB3aWR0aCk7CisJCWtJbWcyUGxhbmVzLnNldEFyZygzLCBh
QnVmZmVyKTsKKwkJa0ltZzJQbGFuZXMuc2V0QXJnKDQsIHJCdWZmZXIpOworCQlrSW1nMlBsYW5l
cy5zZXRBcmcoNSwgZ0J1ZmZlcik7CisJCWtJbWcyUGxhbmVzLnNldEFyZyg2LCBiQnVmZmVyKTsK
KwkJa0ltZzJQbGFuZXMuc2V0QXJnKDcsIDApOworCQlrSW1nMlBsYW5lcy5zZXRBcmcoOCwgd2lk
dGgpOworCQlxLnB1dDJEUmFuZ2VLZXJuZWwoa0ltZzJQbGFuZXMsIDAsIDAsIHdpZHRoLCBoZWln
aHQsIDY0LCAxKTsKKwkJcS5maW5pc2goKTsKKworCQlmZnQuZXhlY3V0ZUludGVybGVhdmVkKHEs
IDEsIENMRkZUUGxhbi5DTEZGVERpcmVjdGlvbi5Gb3J3YXJkLCBhQnVmZmVyLCBhQ0J1ZmZlciwg
bnVsbCwgbnVsbCk7CisJCWZmdC5leGVjdXRlSW50ZXJsZWF2ZWQocSwgMSwgQ0xGRlRQbGFuLkNM
RkZURGlyZWN0aW9uLkZvcndhcmQsIHJCdWZmZXIsIHJDQnVmZmVyLCBudWxsLCBudWxsKTsKKwkJ
ZmZ0LmV4ZWN1dGVJbnRlcmxlYXZlZChxLCAxLCBDTEZGVFBsYW4uQ0xGRlREaXJlY3Rpb24uRm9y
d2FyZCwgZ0J1ZmZlciwgZ0NCdWZmZXIsIG51bGwsIG51bGwpOworCQlmZnQuZXhlY3V0ZUludGVy
bGVhdmVkKHEsIDEsIENMRkZUUGxhbi5DTEZGVERpcmVjdGlvbi5Gb3J3YXJkLCBiQnVmZmVyLCBi
Q0J1ZmZlciwgbnVsbCwgbnVsbCk7CisJfQorCisJdm9pZCBsb2FkUFNGKEJ1ZmZlcmVkSW1hZ2Ug
cHNmKSB7CisJCWFzc2VydCAocHNmLmdldFR5cGUoKSA9PSBCdWZmZXJlZEltYWdlLlRZUEVfQllU
RV9HUkFZKTsKKwkJRGF0YUJ1ZmZlckJ5dGUgcGIgPSAoRGF0YUJ1ZmZlckJ5dGUpIHBzZi5nZXRS
YXN0ZXIoKS5nZXREYXRhQnVmZmVyKCk7CisKKwkJZ3JleUJ1ZmZlci5nZXRCdWZmZXIoKS5wb3Np
dGlvbigwKTsKKwkJZ3JleUJ1ZmZlci5nZXRCdWZmZXIoKS5wdXQocGIuZ2V0RGF0YSgpKTsKKwkJ
Z3JleUJ1ZmZlci5nZXRCdWZmZXIoKS5wb3NpdGlvbigwKTsKKwkJcS5wdXRXcml0ZUJ1ZmZlcihn
cmV5QnVmZmVyLCBmYWxzZSk7CisKKwkJa0dyZXkyUGxhbmUuc2V0QXJnKDAsIGdyZXlCdWZmZXIp
OworCQlrR3JleTJQbGFuZS5zZXRBcmcoMSwgMCk7CisJCWtHcmV5MlBsYW5lLnNldEFyZygyLCB3
aWR0aCk7CisJCWtHcmV5MlBsYW5lLnNldEFyZygzLCB0bXBCdWZmZXIpOworCQlrR3JleTJQbGFu
ZS5zZXRBcmcoNCwgMCk7CisJCWtHcmV5MlBsYW5lLnNldEFyZyg1LCB3aWR0aCk7CisJCXEucHV0
MkRSYW5nZUtlcm5lbChrR3JleTJQbGFuZSwgMCwgMCwgd2lkdGgsIGhlaWdodCwgNjQsIDEpOwor
CisJCWlmICh0cnVlKSB7CisJCQlmZnQuZXhlY3V0ZUludGVybGVhdmVkKHEsIDEsIENMRkZUUGxh
bi5DTEZGVERpcmVjdGlvbi5Gb3J3YXJkLCB0bXBCdWZmZXIsIHBzZkJ1ZmZlciwgbnVsbCwgbnVs
bCk7CisJCX0gZWxzZSBpZiAodHJ1ZSkgeworCQkJZmZ0NTEyLnNldEFyZygwLCB0bXBCdWZmZXIp
OworCQkJZmZ0NTEyLnNldEFyZygxLCBwc2ZCdWZmZXIpOworCQkJZmZ0NTEyLnNldEFyZygyLCAt
MSk7CisJCQlmZnQ1MTIuc2V0QXJnKDMsIGhlaWdodCk7CisJCQkvL3EucHV0MURSYW5nZUtlcm5l
bChmZnQ1MTIsIDAsaGVpZ2h0KjY0LCA2NCk7CisJCQlxLnB1dDJEUmFuZ2VLZXJuZWwoZmZ0NTEy
LCAwLCAwLCBoZWlnaHQgKiA2NCwgMSwgNjQsIDEpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJy
dW5uaW5nIGtlcm5lbCAiICsgNjQgKiBoZWlnaHQgKyAiLCAiICsgNjQpOworCQl9CisJfQorCisJ
Ly8gZyA9IGYgeCBoCisJdm9pZCBjb252b2x2ZShDTEJ1ZmZlcjxGbG9hdEJ1ZmZlcj4gaCwgQ0xC
dWZmZXI8RmxvYXRCdWZmZXI+IGYsIENMQnVmZmVyPEZsb2F0QnVmZmVyPiBnKSB7CisJCWtDb252
b2x2ZS5zZXRBcmcoMCwgaCk7CisJCWtDb252b2x2ZS5zZXRBcmcoMSwgZik7CisJCWtDb252b2x2
ZS5zZXRBcmcoMiwgZyk7CisJCWtDb252b2x2ZS5zZXRBcmcoMywgd2lkdGgpOworCQlxLnB1dDJE
UmFuZ2VLZXJuZWwoa0NvbnZvbHZlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCA2NCwgMSk7CisJfQor
CisJLy8gZyA9IGgqY29uaihmKSAvIChhYnMoZileMiArIGspCisJdm9pZCBkZWNvbnZvbHZlKENM
QnVmZmVyPEZsb2F0QnVmZmVyPiBoLCBDTEJ1ZmZlcjxGbG9hdEJ1ZmZlcj4gZiwgQ0xCdWZmZXI8
RmxvYXRCdWZmZXI+IGcsIGZsb2F0IGspIHsKKwkJa0RlY29udm9sdmUuc2V0QXJnKDAsIGgpOwor
CQlrRGVjb252b2x2ZS5zZXRBcmcoMSwgZik7CisJCWtEZWNvbnZvbHZlLnNldEFyZygyLCBnKTsK
KwkJa0RlY29udm9sdmUuc2V0QXJnKDMsIHdpZHRoKTsKKwkJa0RlY29udm9sdmUuc2V0QXJnKDQs
IGspOworCQlxLnB1dDJEUmFuZ2VLZXJuZWwoa0RlY29udm9sdmUsIDAsIDAsIHdpZHRoLCBoZWln
aHQsIDY0LCAxKTsKKwl9CisKKwl2b2lkIGdldERlc3RpbmF0aW9uKENMQnVmZmVyPEludEJ1ZmZl
cj4gZHN0LCBDTEJ1ZmZlcjxGbG9hdEJ1ZmZlcj4gYSwgQ0xCdWZmZXI8RmxvYXRCdWZmZXI+IHIs
IENMQnVmZmVyPEZsb2F0QnVmZmVyPiBnLCBDTEJ1ZmZlcjxGbG9hdEJ1ZmZlcj4gYiwgZmxvYXQg
c2NhbGUpIHsKKwkJa1BsYW5lczJJbWcuc2V0QXJnKDAsIGRzdCk7CisJCWtQbGFuZXMySW1nLnNl
dEFyZygxLCAwKTsKKwkJa1BsYW5lczJJbWcuc2V0QXJnKDIsIHdpZHRoKTsKKwkJa1BsYW5lczJJ
bWcuc2V0QXJnKDMsIGEpOworCQlrUGxhbmVzMkltZy5zZXRBcmcoNCwgcik7CisJCWtQbGFuZXMy
SW1nLnNldEFyZyg1LCBnKTsKKwkJa1BsYW5lczJJbWcuc2V0QXJnKDYsIGIpOworCQlrUGxhbmVz
MkltZy5zZXRBcmcoNywgMCk7CisJCWtQbGFuZXMySW1nLnNldEFyZyg4LCB3aWR0aCk7CisJCWtQ
bGFuZXMySW1nLnNldEFyZyg5LCBzY2FsZSk7CisJCXEucHV0MkRSYW5nZUtlcm5lbChrUGxhbmVz
MkltZywgMCwgMCwgd2lkdGgsIGhlaWdodCwgNjQsIDEpOworCX0KKwkvLyBDb252ZXJ0IHBhY2tl
ZCBBUkdCIGJ5dGUgaW1hZ2UgdG8gcGxhbmVzIG9mIGNvbXBsZXggZmxvYXRzCisJZmluYWwgU3Ry
aW5nIGltZzJQbGFuZXMgPSAia2VybmVsIHZvaWQgaW1nMnBsYW5lcyhnbG9iYWwgY29uc3QgdWNo
YXI0ICphcmdiLCBpbnQgc29mZiwgaW50IHNzdHJpZGUsIgorCQkJKyAiICBnbG9iYWwgZmxvYXQy
ICphLCBnbG9iYWwgZmxvYXQyICpyLCBnbG9iYWwgZmxvYXQyICpnLCBnbG9iYWwgZmxvYXQyICpi
LCBpbnQgZG9mZiwgaW50IGRzdHJpZGUpIHsiCisJCQkrICIgaW50IGd4ID0gZ2V0X2dsb2JhbF9p
ZCgwKTsiCisJCQkrICIgaW50IGd5ID0gZ2V0X2dsb2JhbF9pZCgxKTsiCisJCQkrICIgdWNoYXI0
IHYgPSBhcmdiW3NvZmYrc3N0cmlkZSpneStneF07IgorCQkJKyAiIGZsb2F0NCBmZiA9IGNvbnZl
cnRfZmxvYXQ0KHYpICogKGZsb2F0NCkoMS4wZi8yNTUpOyIKKwkJCSsgIiBkb2ZmICs9IChkc3Ry
aWRlICogZ3kgKyBneCk7IgorCQkJKyAiIGJbZG9mZl0gPSAoZmxvYXQyKXsgZmYuczAsIDAgfTtc
biIKKwkJCSsgIiBnW2RvZmZdID0gKGZsb2F0Mil7IGZmLnMxLCAwIH07IgorCQkJKyAiIHJbZG9m
Zl0gPSAoZmxvYXQyKXsgZmYuczIsIDAgfTsiCisJCQkrICIgYVtkb2ZmXSA9IChmbG9hdDIpeyBm
Zi5zMywgMCB9O1xuIgorCQkJKyAifVxuXG4iOworCS8vIG5vdCB0aGUgYmVzdCBpbXBsZW1lbnRh
dGlvbgorCS8vIHRoaXMgYWxzbyBwZXJmb3JtcyBhbiAnZmZ0c2hpZnQnCisJZmluYWwgU3RyaW5n
IGdyZXkyUGxhbmUgPSAia2VybmVsIHZvaWQgZ3JleTJwbGFuZShnbG9iYWwgY29uc3QgdWNoYXIg
KnNyYywgaW50IHNvZmYsIGludCBzc3RyaWRlLCIKKwkJCSsgIiAgZ2xvYmFsIGZsb2F0MiAqZHN0
LCBpbnQgZG9mZiwgaW50IGRzdHJpZGUpIHsiCisJCQkrICIgaW50IGd4ID0gZ2V0X2dsb2JhbF9p
ZCgwKTsiCisJCQkrICIgaW50IGd5ID0gZ2V0X2dsb2JhbF9pZCgxKTsiCisJCQkrICIgdWNoYXIg
diA9IHNyY1tzb2ZmK3NzdHJpZGUqZ3krZ3hdOyIKKwkJCSsgIiBmbG9hdCBmZiA9IGNvbnZlcnRf
ZmxvYXQodikgKiAoMS4wZi8yNTUpOyIKKwkJCS8vIGZmdHNoaWZ0CisJCQkrICIgZ3ggXj0gZ2V0
X2dsb2JhbF9zaXplKDApPj4xOyIKKwkJCSsgIiBneSBePSBnZXRfZ2xvYmFsX3NpemUoMSk+PjE7
IgorCQkJKyAiIGRvZmYgKz0gKGRzdHJpZGUgKiBneSArIGd4KTsiCisJCQkrICIgZHN0W2RvZmZd
ID0gKGZsb2F0MikgeyBmZiwgMCB9OyIKKwkJCSsgIn1cblxuIjsKKwkvLyBUaGlzIGFsc28gZG9l
cyB0aGUgJ2ZmdHNjYWxlJyBhZnRlciB0aGUgaW52ZXJzZSBmZnQuCisJZmluYWwgU3RyaW5nIHBs
YW5lczJJbWcgPSAia2VybmVsIHZvaWQgcGxhbmVzMmltZyhnbG9iYWwgdWNoYXI0ICphcmdiLCBp
bnQgc29mZiwgaW50IHNzdHJpZGUsIGNvbnN0IGdsb2JhbCBmbG9hdDIgKmEsIGNvbnN0IGdsb2Jh
bCBmbG9hdDIgKnIsIGNvbnN0IGdsb2JhbCBmbG9hdDIgKmcsIGNvbnN0IGdsb2JhbCBmbG9hdDIg
KmIsIGludCBkb2ZmLCBpbnQgZHN0cmlkZSwgZmxvYXQgc2NhbGUpIHsiCisJCQkrICIgaW50IGd4
ID0gZ2V0X2dsb2JhbF9pZCgwKTsiCisJCQkrICIgaW50IGd5ID0gZ2V0X2dsb2JhbF9pZCgxKTsi
CisJCQkrICIgZmxvYXQ0IGZyLCBmaSwgZmE7IgorCQkJKyAiIGZsb2F0MiB0OyIKKwkJCSsgIiBk
b2ZmICs9IChkc3RyaWRlICogZ3kgKyBneCk7IgorCQkJKyAiIGZsb2F0MiBzID0gKGZsb2F0Milz
Y2FsZTsiCisJCQkrICIgdCA9IGJbZG9mZl0qczsgZnIuczAgPSB0LnMwOyBmaS5zMCA9IHQuczE7
IgorCQkJKyAiIHQgPSBnW2RvZmZdKnM7IGZyLnMxID0gdC5zMDsgZmkuczEgPSB0LnMxOyIKKwkJ
CSsgIiB0ID0gcltkb2ZmXSpzOyBmci5zMiA9IHQuczA7IGZpLnMyID0gdC5zMTsiCisJCQkrICIg
dCA9IGFbZG9mZl0qczsgZnIuczMgPSB0LnMwOyBmaS5zMyA9IHQuczE7IgorCQkJKyAiIGZhID0g
c3FydChmcipmciArIGZpKmZpKSAqIDI1NTsiCisJCQkrICIgZmEgPSBjbGFtcChmYSwgMC4wZiwg
MjU1LjBmKTsiCisJCQkrICIgYXJnYltzb2ZmICtzc3RyaWRlKmd5K2d4XSA9IGNvbnZlcnRfdWNo
YXI0KGZhKTsiCisJCQkrICJ9XG5cbiI7CisJZmluYWwgU3RyaW5nIGNvbnZvbHZlID0gImtlcm5l
bCB2b2lkIGNvbnZvbHZlKGdsb2JhbCBjb25zdCBmbG9hdDIgKmgsIGdsb2JhbCBjb25zdCBmbG9h
dDIgKmZmLCBnbG9iYWwgZmxvYXQyICpnLCBpbnQgc3RyaWRlKSB7IgorCQkJKyAiIGludCBneCA9
IGdldF9nbG9iYWxfaWQoMCk7IgorCQkJKyAiIGludCBneSA9IGdldF9nbG9iYWxfaWQoMSk7Igor
CQkJKyAiIGludCBvZmYgPSBzdHJpZGUgKiBneSArIGd4OyIKKwkJCSsgIiBmbG9hdDIgYSA9IGhb
b2ZmXTsiCisJCQkrICIgZmxvYXQyIGIgPSBmZltvZmZdOyIKKwkJCSsgIiBnW29mZl0gPSAoZmxv
YXQyKSB7IGEuczAgKiBiLnMwIC0gYS5zMSAqIGIuczEsIGEuczAgKiBiLnMxICsgYS5zMSAqIGIu
czAgfTsiCisJCQkrICJ9XG5cbiI7CisJZmluYWwgU3RyaW5nIGRlY29udm9sdmUgPSAia2VybmVs
IHZvaWQgZGVjb252b2x2ZShnbG9iYWwgY29uc3QgZmxvYXQyICpoLCBnbG9iYWwgY29uc3QgZmxv
YXQyICpmZiwgZ2xvYmFsIGZsb2F0MiAqZywgaW50IHN0cmlkZSwgZmxvYXQgaykgeyIKKwkJCSsg
IiBpbnQgZ3ggPSBnZXRfZ2xvYmFsX2lkKDApOyIKKwkJCSsgIiBpbnQgZ3kgPSBnZXRfZ2xvYmFs
X2lkKDEpOyIKKwkJCSsgIiBpbnQgb2ZmID0gc3RyaWRlICogZ3kgKyBneDsiCisJCQkrICIgZmxv
YXQyIGEgPSBoW29mZl07IgorCQkJKyAiIGZsb2F0MiBiID0gZmZbb2ZmXTsiCisJCQkrICIgZmxv
YXQgZCA9IGIuczAgKiBiLnMwICsgYi5zMSAqIGIuczEgKyBrOyIKKwkJCSsgIiBiLnMwIC89IGQ7
IgorCQkJKyAiIGIuczEgLz0gLWQ7IgorCQkJKyAiIGdbb2ZmXSA9IChmbG9hdDIpIHsgYS5zMCAq
IGIuczAgLSBhLnMxICogYi5zMSwgYS5zMCAqIGIuczEgKyBhLnMxICogYi5zMCB9OyIKKwkJCSsg
In1cblxuIjsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb20vam9nYW1wL29wZW5jbC9kZW1vcy9mZnQv
Q0xGRlRQbGFuLmphdmEgYi9zcmMvY29tL2pvZ2FtcC9vcGVuY2wvZGVtb3MvZmZ0L0NMRkZUUGxh
bi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTk3MGIKLS0tIC9k
ZXYvbnVsbAorKysgYi9zcmMvY29tL2pvZ2FtcC9vcGVuY2wvZGVtb3MvZmZ0L0NMRkZUUGxhbi5q
YXZhCkBAIC0wLDAgKzEsMjAwNSBAQAorLy8gRGlzY2xhaW1lcjogSU1QT1JUQU5UOiAgVGhpcyBB
cHBsZSBzb2Z0d2FyZSBpcyBzdXBwbGllZCB0byB5b3UgYnkgQXBwbGUgSW5jLiAoIkFwcGxlIikK
Ky8vICAgICAgICAgICAgIGluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhl
IGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIgdXNlLAorLy8gICAgICAgICAgICAgaW5zdGFsbGF0
aW9uLCBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2Fy
ZQorLy8gICAgICAgICAgICAgY29uc3RpdHV0ZXMgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcy4g
IElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGVzZQorLy8gICAgICAgICAgICAgdGVybXMsIHBs
ZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IgcmVkaXN0cmlidXRlIHRoaXMgQXBw
bGUKKy8vICAgICAgICAgICAgIHNvZnR3YXJlLgorLy8KKy8vICAgICAgICAgICAgIEluIGNvbnNp
ZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJt
cywgYW5kCisvLyAgICAgICAgICAgICBzdWJqZWN0IHRvIHRoZXNlIHRlcm1zLCBBcHBsZSBncmFu
dHMgeW91IGEgcGVyc29uYWwsIG5vbiAtIGV4Y2x1c2l2ZQorLy8gICAgICAgICAgICAgbGljZW5z
ZSwgdW5kZXIgQXBwbGUncyBjb3B5cmlnaHRzIGluIHRoaXMgb3JpZ2luYWwgQXBwbGUgc29mdHdh
cmUgKCB0aGUKKy8vICAgICAgICAgICAgICJBcHBsZSBTb2Z0d2FyZSIgKSwgdG8gdXNlLCByZXBy
b2R1Y2UsIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIHRoZSBBcHBsZQorLy8gICAgICAgICAgICAg
U29mdHdhcmUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kIC8g
b3IgYmluYXJ5IGZvcm1zOworLy8gICAgICAgICAgICAgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVk
aXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSBpbiBpdHMgZW50aXJldHkgYW5kCisvLyAgICAg
ICAgICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIHlvdSBtdXN0IHJldGFpbiB0aGlzIG5vdGlj
ZSBhbmQgdGhlIGZvbGxvd2luZyB0ZXh0CisvLyAgICAgICAgICAgICBhbmQgZGlzY2xhaW1lcnMg
aW4gYWxsIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBBcHBsZSBTb2Z0d2FyZS4gTmVpdGhl
cgorLy8gICAgICAgICAgICAgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3Mgb3Ig
bG9nb3Mgb2YgQXBwbGUgSW5jLiBtYXkgYmUgdXNlZCB0bworLy8gICAgICAgICAgICAgZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGUgQXBwbGUgU29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYworLy8gICAgICAgICAgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZy
b20gQXBwbGUuICBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiB0aGlzCisvLyAgICAgICAg
ICAgICBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBs
aWVkLCBhcmUgZ3JhbnRlZCBieQorLy8gICAgICAgICAgICAgQXBwbGUgaGVyZWluLCBpbmNsdWRp
bmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlCisvLyAg
ICAgICAgICAgICBpbmZyaW5nZWQgYnkgeW91ciBkZXJpdmF0aXZlIHdvcmtzIG9yIGJ5IG90aGVy
IHdvcmtzIGluIHdoaWNoIHRoZSBBcHBsZQorLy8gICAgICAgICAgICAgU29mdHdhcmUgbWF5IGJl
IGluY29ycG9yYXRlZC4KKy8vCisvLyAgICAgICAgICAgICBUaGUgQXBwbGUgU29mdHdhcmUgaXMg
cHJvdmlkZWQgYnkgQXBwbGUgb24gYW4gIkFTIElTIiBiYXNpcy4gIEFQUExFIE1BS0VTIE5PCisv
LyAgICAgICAgICAgICBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBX
SVRIT1VUIExJTUlUQVRJT04gVEhFIElNUExJRUQKKy8vICAgICAgICAgICAgIFdBUlJBTlRJRVMg
T0YgTk9OIC0gSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEK
Ky8vICAgICAgICAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBBUFBMRSBT
T0ZUV0FSRSBPUiBJVFMgVVNFIEFORCBPUEVSQVRJT04KKy8vICAgICAgICAgICAgIEFMT05FIE9S
IElOIENPTUJJTkFUSU9OIFdJVEggWU9VUiBQUk9EVUNUUy4KKy8vCisvLyAgICAgICAgICAgICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVD
VCwgSU5DSURFTlRBTCBPUgorLy8gICAgICAgICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTICgg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisvLyAgICAgICAg
ICAgICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MKKy8vICAgICAgICAgICAgIElOVEVSUlVQVElPTiApIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSwgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04K
Ky8vICAgICAgICAgICAgIEFORCAvIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgQVBQTEUgU09GVFdB
UkUsIEhPV0VWRVIgQ0FVU0VEIEFORCBXSEVUSEVSCisvLyAgICAgICAgICAgICBVTkRFUiBUSEVP
UlkgT0YgQ09OVFJBQ1QsIFRPUlQgKCBJTkNMVURJTkcgTkVHTElHRU5DRSApLCBTVFJJQ1QgTElB
QklMSVRZIE9SCisvLyAgICAgICAgICAgICBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJF
RU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisvLworLy8gQ29w
eXJpZ2h0ICggQyApIDIwMDggQXBwbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8gUG9y
dCB0byBKT0NMIENvcHlyaWdodCAyMDEwIE1pY2hhZWwgWnVjY2hpCisKKy8qCisgKiBUT0RPOiBU
aGUgZXhlY3V0ZSBmdW5jdGlvbnMgbWF5IGFsbG9jYXRlL3VzZSB0ZW1wb3JhcnkgbWVtb3J5IHBl
ciBjYWxsIGhlbmNlIHRoZXkgYXJlCisgKiBuZWl0aGVyIHRocmVhZCBzYWZlIG5vciBtdWx0aXBs
ZS1xdWV1ZSBzYWZlLiAgUGVyaGFwcyBzb21lIHBlci1xdWV1ZSBhbGxvY2F0aW9uCisgKiBzeXN0
ZW0gd291bGQgc3VmZmljZS4KKyAqIFRPRE86IFRoZSBkeW5hbWljIGRldmljZS1kZXBlbmRlbnQg
dmFyaWFibGVzIHNob3VsZCBiZSBkeW5hbWljIGFuZCBkZXZpY2UtZGVwZW5kZW50IGFuZCBub3QK
KyAqIGhhcmRjb2RlZC4gIFdoZXJlIHBvc3NpYmxlLgorICogVE9ETzogQ1BVIHN1cHBvcnQ/Cisg
Ki8KKworcGFja2FnZSBjb20uam9nYW1wLm9wZW5jbC5kZW1vcy5mZnQ7CisKK2ltcG9ydCBjb20u
am9nYW1wLm9wZW5jbC5DTEJ1ZmZlcjsKK2ltcG9ydCBjb20uam9nYW1wLm9wZW5jbC5DTENvbW1h
bmRRdWV1ZTsKK2ltcG9ydCBjb20uam9nYW1wLm9wZW5jbC5DTENvbnRleHQ7CitpbXBvcnQgY29t
LmpvZ2FtcC5vcGVuY2wuQ0xEZXZpY2U7CitpbXBvcnQgY29tLmpvZ2FtcC5vcGVuY2wuQ0xFdmVu
dExpc3Q7CitpbXBvcnQgY29tLmpvZ2FtcC5vcGVuY2wuQ0xLZXJuZWw7CitpbXBvcnQgY29tLmpv
Z2FtcC5vcGVuY2wuQ0xNZW1vcnk7CitpbXBvcnQgY29tLmpvZ2FtcC5vcGVuY2wuQ0xNZW1vcnku
TWVtOworaW1wb3J0IGNvbS5qb2dhbXAub3BlbmNsLkNMUHJvZ3JhbTsKK2ltcG9ydCBqYXZhLmlv
Lk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEu
bmlvLkZsb2F0QnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvKioKKyAq
CisgKiBAYXV0aG9yIG5vdHplZAorICovCitwdWJsaWMgY2xhc3MgQ0xGRlRQbGFuIHsKKworCXBy
aXZhdGUgY2xhc3MgQ0xGRlREaW0zIHsKKworCQlpbnQgeDsKKwkJaW50IHk7CisJCWludCB6Owor
CisJCUNMRkZURGltMyhpbnQgeCwgaW50IHksIGludCB6KSB7CisJCQl0aGlzLnggPSB4OworCQkJ
dGhpcy55ID0geTsKKwkJCXRoaXMueiA9IHo7CisJCX0KKwkJQ0xGRlREaW0zKGludFtdIHNpemUp
IHsKKwkJCXggPSBzaXplWzBdOworCQkJeSA9IHNpemUubGVuZ3RoID4gMSA/IHNpemVbMV0gOiAx
OworCQkJeiA9IHNpemUubGVuZ3RoID4gMiA/IHNpemVbMl0gOiAxOworCQl9CisJfQorCisJcHJp
dmF0ZSBjbGFzcyBXb3JrRGltZW5zaW9ucyB7CisKKwkJaW50IGJhdGNoU2l6ZTsKKwkJbG9uZyBn
V29ya0l0ZW1zOworCQlsb25nIGxXb3JrSXRlbXM7CisKKwkJcHVibGljIFdvcmtEaW1lbnNpb25z
KGludCBiYXRjaFNpemUsIGxvbmcgZ1dvcmtJdGVtcywgbG9uZyBsV29ya0l0ZW1zKSB7CisJCQl0
aGlzLmJhdGNoU2l6ZSA9IGJhdGNoU2l6ZTsKKwkJCXRoaXMuZ1dvcmtJdGVtcyA9IGdXb3JrSXRl
bXM7CisJCQl0aGlzLmxXb3JrSXRlbXMgPSBsV29ya0l0ZW1zOworCQl9CisJfQorCisJcHJpdmF0
ZSBjbGFzcyBmZnRQYWRkaW5nIHsKKworCQlpbnQgbE1lbVNpemU7CisJCWludCBvZmZzZXQ7CisJ
CWludCBtaWRQYWQ7CisKKwkJcHVibGljIGZmdFBhZGRpbmcoaW50IGxNZW1TaXplLCBpbnQgb2Zm
c2V0LCBpbnQgbWlkUGFkKSB7CisJCQl0aGlzLmxNZW1TaXplID0gbE1lbVNpemU7CisJCQl0aGlz
Lm9mZnNldCA9IG9mZnNldDsKKwkJCXRoaXMubWlkUGFkID0gbWlkUGFkOworCQl9CisJfQorCisJ
Y2xhc3MgQ0xGRlRLZXJuZWxJbmZvIHsKKworCQlDTEtlcm5lbCBrZXJuZWw7CisJCVN0cmluZyBr
ZXJuZWxfbmFtZTsKKwkJaW50IGxtZW1fc2l6ZTsKKwkJaW50IG51bV93b3JrZ3JvdXBzOworCQlp
bnQgbnVtX3hmb3Jtc19wZXJfd29ya2dyb3VwOworCQlpbnQgbnVtX3dvcmtpdGVtc19wZXJfd29y
a2dyb3VwOworCQlDTEZGVEtlcm5lbERpciBkaXI7CisJCWJvb2xlYW4gaW5fcGxhY2VfcG9zc2li
bGU7CisJfTsKKworCXB1YmxpYyBlbnVtIENMRkZURGlyZWN0aW9uIHsKKworCQlGb3J3YXJkIHsK
KworCQkJaW50IHZhbHVlKCkgeworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSwKKwkJSW52ZXJz
ZSB7CisKKwkJCWludCB2YWx1ZSgpIHsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfTsKKworCQlh
YnN0cmFjdCBpbnQgdmFsdWUoKTsKKwl9OworCisJZW51bSBDTEZGVEtlcm5lbERpciB7CisKKwkJ
WCwKKwkJWSwKKwkJWgorCX07CisKKwlwdWJsaWMgZW51bSBDTEZGVERhdGFGb3JtYXQgeworCisJ
CVNwbGl0Q29tcGxleEZvcm1hdCwKKwkJSW50ZXJsZWF2ZWRDb21wbGV4Rm9ybWF0LAorCX0KKwkv
LyBjb250ZXh0IGluIHdoaWNoIGZmdCByZXNvdXJjZXMgYXJlIGNyZWF0ZWQgYW5kIGtlcm5lbHMg
YXJlIGV4ZWN1dGVkCisJQ0xDb250ZXh0IGNvbnRleHQ7CisJLy8gc2l6ZSBvZiBzaWduYWwKKwlD
TEZGVERpbTMgc2l6ZTsKKwkvLyBkaW1lbnNpb24gb2YgdHJhbnNmb3JtIC4uLiBtdXN0IGJlIGVp
dGhlciAxLCAyIG9yIDMKKwlpbnQgZGltOworCS8vIGRhdGEgZm9ybWF0IC4uLiBtdXN0IGJlIGVp
dGhlciBpbnRlcmxlYXZlZCBvciBwbGFubmFyCisJQ0xGRlREYXRhRm9ybWF0IGZvcm1hdDsKKwkv
LyBzdHJpbmcgY29udGFpbmluZyBrZXJuZWwgc291cmNlLiBHZW5lcmF0ZWQgYXQgcnVudGltZSBi
YXNlZCBvbgorCS8vIHNpemUsIGRpbSwgZm9ybWF0IGFuZCBvdGhlciBwYXJhbWV0ZXJzCisJU3Ry
aW5nQnVpbGRlciBrZXJuZWxfc3RyaW5nOworCS8vIENMIHByb2dyYW0gY29udGFpbmluZyBzb3Vy
Y2UgYW5kIGtlcm5lbCB0aGlzIHBhcnRpY3VsYXIKKwkvLyBzaXplLCBkaW0sIGRhdGEgZm9ybWF0
CisJQ0xQcm9ncmFtIHByb2dyYW07CisJLy8gbGlua2VkIGxpc3Qgb2Yga2VybmVscyB3aGljaCBu
ZWVkcyB0byBiZSBleGVjdXRlZCBmb3IgdGhpcyBmZnQKKwlMaW5rZWRMaXN0PENMRkZUS2VybmVs
SW5mbz4ga2VybmVsX2xpc3Q7CisJLy8gdHdpc3Qga2VybmVsIGZvciB2aXJ0dWFsaXppbmcgZmZ0
IG9mIHZlcnkgbGFyZ2Ugc2l6ZXMgdGhhdCBkbyBub3QKKwkvLyBmaXQgaW4gR1BVIGdsb2JhbCBt
ZW1vcnkKKwlDTEtlcm5lbCB0d2lzdF9rZXJuZWw7CisJLy8gZmxhZyBpbmRpY2F0aW5nIGlmIHRl
bXBvcmFyeSBpbnRlcm1lZGlhdGUgYnVmZmVyIGlzIG5lZWRlZCBvciBub3QuCisJLy8gdGhpcyBk
ZXBlbmRzIG9uIGZmdCBrZXJuZWxzIGJlaW5nIGV4ZWN1dGVkIGFuZCBpZiB0cmFuc2Zvcm0gaXMK
KwkvLyBpbi1wbGFjZSBvciBvdXQtb2YtcGxhY2UuIGUuZy4gTG9jYWwgbWVtb3J5IGZmdCAoc2F5
IDFEIDEwMjQgLi4uCisJLy8gb25lIHRoYXQgZG9lcyBub3QgcmVxdWlyZSBnbG9iYWwgdHJhbnNw
b3NlIGRvIG5vdCBuZWVkIHRlbXBvcmFyeSBidWZmZXIpCisJLy8gMkQgMTAyNHgxMDI0IG91dC1v
Zi1wbGFjZSBmZnQgaG93ZXZlciBkbyByZXF1aXJlIGludGVybWVkaWF0ZSBidWZmZXIuCisJLy8g
SWYgdGVtcCBidWZmZXIgaXMgbmVlZGVkLCBpdHMgYWxsb2NhdGlvbiBpcyBsYXp5IGkuZS4gaXRz
IG5vdCBhbGxvY2F0ZWQKKwkvLyB1bnRpbCBpdHMgbmVlZGVkCisJYm9vbGVhbiB0ZW1wX2J1ZmZl
cl9uZWVkZWQ7CisJLy8gQmF0Y2ggc2l6ZSBpcyBydW50aW1lIHBhcmFtZXRlciBhbmQgc2l6ZSBv
ZiB0ZW1wb3JhcnkgYnVmZmVyIChpZiBuZWVkZWQpCisJLy8gZGVwZW5kcyBvbiBiYXRjaCBzaXpl
LiBBbGxvY2F0aW9uIG9mIHRlbXBvcmFyeSBidWZmZXIgaXMgbGF6eSBpLmUuIGl0cworCS8vIG9u
bHkgY3JlYXRlZCB3aGVuIG5lZWRlZC4gT25jZSBpdHMgY3JlYXRlZCBhdCBmaXJzdCBjYWxsIG9m
IGNsRkZUX0V4ZWN1dGV4eHgKKwkvLyBpdCBpcyBub3QgYWxsb2NhdGVkIG5leHQgdGltZSBpZiBu
ZXh0IHRpbWUgY2xGRlRfRXhlY3V0ZXh4eCBpcyBjYWxsZWQgd2l0aAorCS8vIGJhdGNoIHNpemUg
ZGlmZmVyZW50IHRoYW4gdGhlIGZpcnN0IGNhbGwuIGxhc3RfYmF0Y2hfc2l6ZSBjYWNoZXMgdGhl
IGxhc3QKKwkvLyBiYXRjaCBzaXplIHdpdGggd2hpY2ggdGhpcyBwbGFuIGlzIHVzZWQgc28gdGhh
dCB3ZSBkb250IGtlZXAgYWxsb2NhdGluZy9kZWFsbG9jYXRpbmcKKwkvLyB0ZW1wIGJ1ZmZlciBp
ZiBzYW1lIGJhdGNoIHNpemUgaXMgdXNlZCBhZ2FpbiBhbmQgYWdhaW4uCisJaW50IGxhc3RfYmF0
Y2hfc2l6ZTsKKwkvLyB0ZW1wb3JhcnkgYnVmZmVyIGZvciBpbnRlcmxlYXZlZCBwbGFuCisJQ0xN
ZW1vcnkgdGVtcG1lbW9iajsKKwkvLyB0ZW1wb3JhcnkgYnVmZmVyIGZvciBwbGFubmVyIHBsYW4u
IE9ubHkgb25lIG9mIHRlbXBtZW1vYmogb3IKKwkvLyAodGVtcG1lbW9ial9yZWFsLCB0ZW1wbWVt
b2JqX2ltYWcpIHBhaXIgaXMgdmFsaWQgKGFsbG9jYXRlZCkgZGVwZW5kaW5nCisJLy8gZGF0YSBm
b3JtYXQgb2YgcGxhbiAocGxhbm5hciBvciBpbnRlcmxlYXZlZCkKKwlDTE1lbW9yeSB0ZW1wbWVt
b2JqX3JlYWwsIHRlbXBtZW1vYmpfaW1hZzsKKwkvLyBNYXhpbXVtIHNpemUgb2Ygc2lnbmFsIGZv
ciB3aGljaCBsb2NhbCBtZW1vcnkgdHJhbnNwb3NlZCBiYXNlZAorCS8vIGZmdCBpcyBzdWZmaWNp
ZW50IGkuZS4gbm8gZ2xvYmFsIG1lbSB0cmFuc3Bvc2UgKGNvbW11bmljYXRpb24pCisJLy8gaXMg
bmVlZGVkCisJaW50IG1heF9sb2NhbG1lbV9mZnRfc2l6ZTsKKwkvLyBNYXhpbXVtIHdvcmsgaXRl
bXMgcGVyIHdvcmsgZ3JvdXAgYWxsb3dlZC4gVGhpcywgYWxvbmcgd2l0aCBtYXhfcmFkaXggYmVs
b3cgY29udHJvbHMKKwkvLyBtYXhpbXVtIGxvY2FsIG1lbW9yeSBiZWluZyB1c2VkIGJ5IGZmdCBr
ZXJuZWxzIG9mIHRoaXMgcGxhbi4gU2V0IHRvIDI1NiBieSBkZWZhdWx0CisJaW50IG1heF93b3Jr
X2l0ZW1fcGVyX3dvcmtncm91cDsKKwkvLyBNYXhpbXVtIGJhc2UgcmFkaXggZm9yIGxvY2FsIG1l
bW9yeSBmZnQgLi4uIHRoaXMgY29udHJvbHMgdGhlIG1heGltdW0gcmVnaXN0ZXIKKwkvLyBzcGFj
ZSB1c2VkIGJ5IHdvcmsgaXRlbXMuIEN1cnJlbnRseSBkZWZhdWx0cyB0byAxNgorCWludCBtYXhf
cmFkaXg7CisJLy8gRGV2aWNlIGRlcGVuZGVkIHBhcmFtZXRlciB0aGF0IHRlbGxzIGhvdyBtYW55
IHdvcmstaXRlbXMgbmVlZCB0byBiZSByZWFkIGNvbnNlY3V0aXZlCisJLy8gdmFsdWVzIHRvIG1h
a2Ugc3VyZSBnbG9iYWwgbWVtb3J5IGFjY2VzcyBieSB3b3JrLWl0ZW1zIG9mIGEgd29yay1ncm91
cCByZXN1bHQgaW4KKwkvLyBjb2FsZXNjZWQgbWVtb3J5IGFjY2VzcyB0byB1dGlsaXplIGZ1bGwg
YmFuZHdpZHRoIGUuZy4gb24gTlZpZGlhIHRlc2xhLCB0aGlzIGlzIDE2CisJaW50IG1pbl9tZW1f
Y29hbGVzY2Vfd2lkdGg7CisJLy8gTnVtYmVyIG9mIGxvY2FsIG1lbW9yeSBiYW5rcy4gVGhpcyBp
cyB1c2VkIHRvIGdlbmVhdGUga2VybmVsIHdpdGggbG9jYWwgbWVtb3J5CisJLy8gdHJhbnNwb3Nl
cyB3aXRoIGFwcHJvcHJpYXRlIHBhZGRpbmcgdG8gYXZvaWQgYmFuayBjb25mbGljdHMgdG8gbG9j
YWwgbWVtb3J5CisJLy8gZS5nLiBvbiBOVmlkaWEgaXQgaXMgMTYuCisJaW50IG51bV9sb2NhbF9t
ZW1fYmFua3M7CisKKwlwdWJsaWMgY2xhc3MgSW52YWxpZENvbnRleHRFeGNlcHRpb24gZXh0ZW5k
cyBFeGNlcHRpb24geworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBGRlQgcGxhbi4KKwkg
KgorCSAqIFVzZSB0aGUgbWF0Y2hpbmcgZXhlY3V0ZUludGVybGVhdmVkKCkgb3IgZXhlY3V0ZVBs
YW5hcigpIGRlcGVuZGluZyBvbiB0aGUgZGF0YUZvcm1hdCBzcGVjaWZpZWQuCisJICogQHBhcmFt
IGNvbnRleHQKKwkgKiBAcGFyYW0gc2l6ZXMgQXJyYXkgb2Ygc2l6ZXMgZm9yIGVhY2ggZGltZW5z
aW9uLiAgVGhlIGxlbmd0aCBvZiBhcnJheSBkZWZpbmVzIGhvdyBtYW55IGRpbWVuc2lvbnMgdGhl
cmUgYXJlLgorCSAqIEBwYXJhbSBkYXRhRm9ybWF0IERhdGEgZm9ybWF0LCBJbnRlcmxlYXZlZENv
bXBsZXggKGFycmF5IG9mIGNvbXBsZXgpIG9yIFNwbGl0Q29tcGxleCAoc2VwYXJhdGUgcGxhbmFy
IGFycmF5cykuCisJICogQHRocm93cyB6ZXBoeXIuY2wuQ0xGRlRQbGFuLkludmFsaWRDb250ZXh0
RXhjZXB0aW9uCisJICovCisJcHVibGljIENMRkZUUGxhbihDTENvbnRleHQgY29udGV4dCwgaW50
W10gc2l6ZXMsIENMRkZURGF0YUZvcm1hdCBkYXRhRm9ybWF0KSB0aHJvd3MgSW52YWxpZENvbnRl
eHRFeGNlcHRpb24geworCQlpbnQgaTsKKwkJaW50IGVycjsKKwkJYm9vbGVhbiBpc1BvdzIgPSB0
cnVlOworCQlTdHJpbmcga1N0cmluZzsKKwkJaW50IG51bV9kZXZpY2VzOworCQlib29sZWFuIGdw
dV9mb3VuZCA9IGZhbHNlOworCQlDTERldmljZVtdIGRldmljZXM7CisJCWludCByZXRfc2l6ZTsK
KworCQlpZiAoc2l6ZXMubGVuZ3RoIDwgMSB8fCBzaXplcy5sZW5ndGggPiAzKQorCQkJdGhyb3cg
bmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRGltZW5zaW9ucyBtdXN0IGJlIGJldHdlZW4g
MSBhbmQgMyIpOworCisJCXRoaXMuc2l6ZSA9IG5ldyBDTEZGVERpbTMoc2l6ZXMpOworCisJCWlz
UG93MiB8PSAodGhpcy5zaXplLnggIT0gMCkgJiYgKCgodGhpcy5zaXplLnggLSAxKSAmIHRoaXMu
c2l6ZS54KSA9PSAwKTsKKwkJaXNQb3cyIHw9ICh0aGlzLnNpemUueSAhPSAwKSAmJiAoKCh0aGlz
LnNpemUueSAtIDEpICYgdGhpcy5zaXplLnkpID09IDApOworCQlpc1BvdzIgfD0gKHRoaXMuc2l6
ZS56ICE9IDApICYmICgoKHRoaXMuc2l6ZS56IC0gMSkgJiB0aGlzLnNpemUueikgPT0gMCk7CisK
KwkJaWYgKCFpc1BvdzIpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24o
IlNpemVzIG11c3QgYmUgcG93ZXIgb2YgdHdvIik7CisJCX0KKworCQkvL2lmKCAoZGltID09IEZG
VF8xRCAmJiAoc2l6ZS55ICE9IDEgfHwgc2l6ZS56ICE9IDEpKSB8fCAoZGltID09IEZGVF8yRCAm
JiBzaXplLnogIT0gMSkgKQorCQkvLwlFUlJfTUFDUk8oQ0xfSU5WQUxJRF9WQUxVRSk7CisKKwkJ
dGhpcy5jb250ZXh0ID0gY29udGV4dDsKKwkJLy9jbFJldGFpbkNvbnRleHQoY29udGV4dCk7CisJ
CS8vdGhpcy5zaXplID0gc2l6ZTsKKwkJdGhpcy5kaW0gPSBzaXplcy5sZW5ndGg7CisJCXRoaXMu
Zm9ybWF0ID0gZGF0YUZvcm1hdDsKKwkJLy90aGlzLmtlcm5lbF9saXN0ID0gMDsKKwkJLy90aGlz
LnR3aXN0X2tlcm5lbCA9IDA7CisJCS8vdGhpcy5wcm9ncmFtID0gMDsKKwkJdGhpcy50ZW1wX2J1
ZmZlcl9uZWVkZWQgPSBmYWxzZTsKKwkJdGhpcy5sYXN0X2JhdGNoX3NpemUgPSAwOworCQkvL3Ro
aXMudGVtcG1lbW9iaiA9IDA7CisJCS8vdGhpcy50ZW1wbWVtb2JqX3JlYWwgPSAwOworCQkvL3Ro
aXMudGVtcG1lbW9ial9pbWFnID0gMDsKKwkJdGhpcy5tYXhfbG9jYWxtZW1fZmZ0X3NpemUgPSAy
MDQ4OworCQl0aGlzLm1heF93b3JrX2l0ZW1fcGVyX3dvcmtncm91cCA9IDI1NjsKKwkJdGhpcy5t
YXhfcmFkaXggPSAxNjsKKwkJdGhpcy5taW5fbWVtX2NvYWxlc2NlX3dpZHRoID0gMTY7CisJCXRo
aXMubnVtX2xvY2FsX21lbV9iYW5rcyA9IDE2OworCisJCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwor
CisJCS8vIHRoaXMgc2VlbXMgcHJldHR5IHNoaXQsIGNhbid0IGl0IHRlbGwgdGhpcyBiZWZvcmUg
YnVpbGRpbmcgaXQ/CisJCXdoaWxlICghZG9uZSkgeworCQkJa2VybmVsX2xpc3QgPSBuZXcgTGlu
a2VkTGlzdDxDTEZGVEtlcm5lbEluZm8+KCk7CisKKwkJCXRoaXMua2VybmVsX3N0cmluZyA9IG5l
dyBTdHJpbmdCdWlsZGVyKCk7CisJCQlnZXRCbG9ja0NvbmZpZ0FuZEtlcm5lbFN0cmluZygpOwor
CisJCQl0aGlzLnByb2dyYW0gPSBjb250ZXh0LmNyZWF0ZVByb2dyYW0oa2VybmVsX3N0cmluZy50
b1N0cmluZygpKTsKKworCQkJZGV2aWNlcyA9IGNvbnRleHQuZ2V0RGV2aWNlcygpOworCQkJZm9y
IChpID0gMDsgaSA8IGRldmljZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlDTERldmljZSBkZXYgPSBk
ZXZpY2VzW2ldOworCisJCQkJaWYgKGRldi5nZXRUeXBlKCkgPT0gQ0xEZXZpY2UuVHlwZS5HUFUp
IHsKKwkJCQkJZ3B1X2ZvdW5kID0gdHJ1ZTsKKwkJCQkJcHJvZ3JhbS5idWlsZCgiLWNsLW1hZC1l
bmFibGUiLCBkZXYpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCFncHVfZm91bmQpIHsKKwkJCQl0
aHJvdyBuZXcgSW52YWxpZENvbnRleHRFeGNlcHRpb24oKTsKKwkJCX0KKworCQkJY3JlYXRlS2Vy
bmVsTGlzdCgpOworCisJCQkvLyB3ZSBjcmVhdGVkIHByb2dyYW0gYW5kIGtlcm5lbHMgYmFzZWQg
b24gInNvbWUgbWF4IHdvcmsgZ3JvdXAgc2l6ZSAoZGVmYXVsdCAyNTYpIiAuLi4gdGhpcyB3b3Jr
IGdyb3VwIHNpemUKKwkJCS8vIG1heSBiZSBsYXJnZXIgdGhhbiB3aGF0IGtlcm5lbCBtYXkgZXhl
Y3V0ZSB3aXRoIC4uLiBpZiB0aGF0cyB0aGUgY2FzZSB3ZSBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhl
IGtlcm5lbCBzb3VyY2UKKwkJCS8vIHNldHRpbmcgdGhpcyBhcyBsaW1pdCBpLmUgbWF4IGdyb3Vw
IHNpemUgYW5kIHJlYnVpbGQuCisJCQlpZiAoZ2V0UGF0Y2hpbmdSZXF1aXJlZChkZXZpY2VzKSkg
eworCQkJCXJlbGVhc2UoKTsKKwkJCQl0aGlzLm1heF93b3JrX2l0ZW1fcGVyX3dvcmtncm91cCA9
IChpbnQpIGdldE1heEtlcm5lbFdvcmtHcm91cFNpemUoZGV2aWNlcyk7CisJCQl9IGVsc2Ugewor
CQkJCWRvbmUgPSB0cnVlOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUmVsZWFzZSBzeXN0
ZW0gcmVzb3VyY2VzLgorCSAqLworCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisJCWZvciAoQ0xG
RlRLZXJuZWxJbmZvIGtJbmZvIDoga2VybmVsX2xpc3QpIHsKKwkJCWtJbmZvLmtlcm5lbC5yZWxl
YXNlKCk7CisJCX0KKwkJcHJvZ3JhbS5yZWxlYXNlKCk7CisJfQorCisJdm9pZCBhbGxvY2F0ZVRl
bXBvcmFyeUJ1ZmZlckludGVybGVhdmVkKGludCBiYXRjaFNpemUpIHsKKwkJaWYgKHRlbXBfYnVm
ZmVyX25lZWRlZCAmJiBsYXN0X2JhdGNoX3NpemUgIT0gYmF0Y2hTaXplKSB7CisJCQlsYXN0X2Jh
dGNoX3NpemUgPSBiYXRjaFNpemU7CisJCQlpbnQgdG1wTGVuZ3RoID0gc2l6ZS54ICogc2l6ZS55
ICogc2l6ZS56ICogYmF0Y2hTaXplICogMiAqIDQ7IC8vIHNpemVvZihmbG9hdCkKKworCQkJaWYg
KHRlbXBtZW1vYmogIT0gbnVsbCkgeworCQkJCXRlbXBtZW1vYmoucmVsZWFzZSgpOworCQkJfQor
CisJCQl0ZW1wbWVtb2JqID0gY29udGV4dC5jcmVhdGVGbG9hdEJ1ZmZlcih0bXBMZW5ndGgsIE1l
bS5SRUFEX1dSSVRFKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGN1bGF0ZSBGRlQgb24gaW50
ZXJsZWF2ZWQgY29tcGxleCBkYXRhLgorCSAqIEBwYXJhbSBxdWV1ZQorCSAqIEBwYXJhbSBiYXRj
aFNpemUgSG93IG1hbnkgaW5zdGFuY2VzIHRvIGNhbGN1bGF0ZS4gIFVzZSAxIGZvciBhIHNpbmds
ZSBGRlQuCisJICogQHBhcmFtIGRpciBEaXJlY3Rpb24gb2YgY2FsY3VsYXRpb24sIEZvcndhcmQg
b3IgSW52ZXJzZS4KKwkgKiBAcGFyYW0gZGF0YV9pbiBJbnB1dCBidWZmZXIuCisJICogQHBhcmFt
IGRhdGFfb3V0IE91dHB1dCBidWZmZXIuICBNYXkgYmUgdGhlIHNhbWUgYXMgZGF0YV9pbiBmb3Ig
aW4tcGxhY2UgdHJhbnNmb3JtLgorCSAqIEBwYXJhbSBjb25kaXRpb24gQ29uZGl0aW9uIHRvIHdh
aXQgZm9yLiAgTk9UIFlFVCBJTVBMRU1FTlRFRC4KKwkgKiBAcGFyYW0gZXZlbnQgRXZlbnQgdG8g
d2FpdCBmb3IgY29tcGxldGlvbi4gIE5PVCBZRVQgSU1QTEVNRU5URUQuCisJICovCisJcHVibGlj
IHZvaWQgZXhlY3V0ZUludGVybGVhdmVkKENMQ29tbWFuZFF1ZXVlIHF1ZXVlLCBpbnQgYmF0Y2hT
aXplLCBDTEZGVERpcmVjdGlvbiBkaXIsCisJCQlDTEJ1ZmZlcjxGbG9hdEJ1ZmZlcj4gZGF0YV9p
biwgQ0xCdWZmZXI8RmxvYXRCdWZmZXI+IGRhdGFfb3V0LAorCQkJQ0xFdmVudExpc3QgY29uZGl0
aW9uLCBDTEV2ZW50TGlzdCBldmVudCkgeworCQlpbnQgczsKKwkJaWYgKGZvcm1hdCAhPSBmb3Jt
YXQuSW50ZXJsZWF2ZWRDb21wbGV4Rm9ybWF0KSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3Vt
ZW50RXhjZXB0aW9uKCk7CisJCX0KKworCQlXb3JrRGltZW5zaW9ucyB3ZDsKKwkJYm9vbGVhbiBp
blBsYWNlRG9uZSA9IGZhbHNlOworCisJCWJvb2xlYW4gaXNJblBsYWNlID0gZGF0YV9pbiA9PSBk
YXRhX291dDsKKworCQlhbGxvY2F0ZVRlbXBvcmFyeUJ1ZmZlckludGVybGVhdmVkKGJhdGNoU2l6
ZSk7CisKKwkJQ0xNZW1vcnlbXSBtZW1PYmogPSBuZXcgQ0xNZW1vcnlbM107CisJCW1lbU9ialsw
XSA9IGRhdGFfaW47CisJCW1lbU9ialsxXSA9IGRhdGFfb3V0OworCQltZW1PYmpbMl0gPSB0ZW1w
bWVtb2JqOworCQlpbnQgbnVtS2VybmVscyA9IGtlcm5lbF9saXN0LnNpemUoKTsKKworCQlib29s
ZWFuIG51bUtlcm5lbHNPZGQgPSAobnVtS2VybmVscyAmIDEpICE9IDA7CisJCWludCBjdXJyUmVh
ZCA9IDA7CisJCWludCBjdXJyV3JpdGUgPSAxOworCisJCS8vIGF0IGxlYXN0IG9uZSBleHRlcm5h
bCBkcmFtIHNodWZmbGUgKHRyYW5zcG9zZSkgcmVxdWlyZWQKKwkJaWYgKHRlbXBfYnVmZmVyX25l
ZWRlZCkgeworCQkJLy8gaW4tcGxhY2UgdHJhbnNmb3JtCisJCQlpZiAoaXNJblBsYWNlKSB7CisJ
CQkJaW5QbGFjZURvbmUgPSBmYWxzZTsKKwkJCQljdXJyUmVhZCA9IDE7CisJCQkJY3VycldyaXRl
ID0gMjsKKwkJCX0gZWxzZSB7CisJCQkJY3VycldyaXRlID0gKG51bUtlcm5lbHMgJiAxKSA9PSAx
ID8gMSA6IDI7CisJCQl9CisKKwkJCWZvciAoQ0xGRlRLZXJuZWxJbmZvIGtlcm5lbEluZm8gOiBr
ZXJuZWxfbGlzdCkgeworCQkJCWlmIChpc0luUGxhY2UgJiYgbnVtS2VybmVsc09kZCAmJiAhaW5Q
bGFjZURvbmUgJiYga2VybmVsSW5mby5pbl9wbGFjZV9wb3NzaWJsZSkgeworCQkJCQljdXJyV3Jp
dGUgPSBjdXJyUmVhZDsKKwkJCQkJaW5QbGFjZURvbmUgPSB0cnVlOworCQkJCX0KKworCQkJCXMg
PSBiYXRjaFNpemU7CisJCQkJd2QgPSBnZXRLZXJuZWxXb3JrRGltZW5zaW9ucyhrZXJuZWxJbmZv
LCBzKTsKKwkJCQlrZXJuZWxJbmZvLmtlcm5lbC5zZXRBcmcoMCwgbWVtT2JqW2N1cnJSZWFkXSk7
CisJCQkJa2VybmVsSW5mby5rZXJuZWwuc2V0QXJnKDEsIG1lbU9ialtjdXJyV3JpdGVdKTsKKwkJ
CQlrZXJuZWxJbmZvLmtlcm5lbC5zZXRBcmcoMiwgZGlyLnZhbHVlKCkpOworCQkJCWtlcm5lbElu
Zm8ua2VybmVsLnNldEFyZygzLCB3ZC5iYXRjaFNpemUpOworCQkJCXF1ZXVlLnB1dDJEUmFuZ2VL
ZXJuZWwoa2VybmVsSW5mby5rZXJuZWwsIDAsIDAsIHdkLmdXb3JrSXRlbXMsIDEsIHdkLmxXb3Jr
SXRlbXMsIDEpOworCQkJCS8vcXVldWUucHV0MURSYW5nZUtlcm5lbChrZXJuZWxJbmZvLmtlcm5l
bCwgMCwgd2QuZ1dvcmtJdGVtcywgd2QubFdvcmtJdGVtcyk7CisKKwkJCQkvL1N5c3RlbS5vdXQu
cHJpbnRmKCJleGVjdXRlICVzIHNpemUgJWQsJWQgYmF0Y2ggJWQsIGRpciAlZCwgY3VycnJlYWQg
JWQgY3VycndyaXRlICVkXHNpemUiLCBrZXJuZWxJbmZvLmtlcm5lbF9uYW1lLCB3ZC5nV29ya0l0
ZW1zLCB3ZC5sV29ya0l0ZW1zLCB3ZC5iYXRjaFNpemUsIGRpci52YWx1ZSgpLCBjdXJyUmVhZCwg
Y3VycldyaXRlKTsKKworCQkJCWN1cnJSZWFkID0gKGN1cnJXcml0ZSA9PSAxKSA/IDEgOiAyOwor
CQkJCWN1cnJXcml0ZSA9IChjdXJyV3JpdGUgPT0gMSkgPyAyIDogMTsKKwkJCX0KKwkJfSBlbHNl
IHsKKwkJCS8vIG5vIGRyYW0gc2h1ZmZsZSAodHJhbnNwb3NlIHJlcXVpcmVkKSB0cmFuc2Zvcm0K
KwkJCS8vIGFsbCBrZXJuZWxzIGNhbiBleGVjdXRlIGluLXBsYWNlLgorCQkJZm9yIChDTEZGVEtl
cm5lbEluZm8ga2VybmVsSW5mbyA6IGtlcm5lbF9saXN0KSB7CisJCQkJeworCQkJCQlzID0gYmF0
Y2hTaXplOworCQkJCQl3ZCA9IGdldEtlcm5lbFdvcmtEaW1lbnNpb25zKGtlcm5lbEluZm8sIHMp
OworCisJCQkJCWtlcm5lbEluZm8ua2VybmVsLnNldEFyZygwLCBtZW1PYmpbY3VyclJlYWRdKTsK
KwkJCQkJa2VybmVsSW5mby5rZXJuZWwuc2V0QXJnKDEsIG1lbU9ialtjdXJyV3JpdGVdKTsKKwkJ
CQkJa2VybmVsSW5mby5rZXJuZWwuc2V0QXJnKDIsIGRpci52YWx1ZSgpKTsKKwkJCQkJa2VybmVs
SW5mby5rZXJuZWwuc2V0QXJnKDMsIHdkLmJhdGNoU2l6ZSk7CisJCQkJCXF1ZXVlLnB1dDJEUmFu
Z2VLZXJuZWwoa2VybmVsSW5mby5rZXJuZWwsIDAsIDAsIHdkLmdXb3JrSXRlbXMsIDEsIHdkLmxX
b3JrSXRlbXMsIDEpOworCisJCQkJCS8vU3lzdGVtLm91dC5wcmludGYoImV4ZWN1dGUgJXMgc2l6
ZSAlZCwlZCBiYXRjaCAlZCwgY3VycnJlYWQgJWQgY3VycndyaXRlICVkXHNpemUiLCBrZXJuZWxJ
bmZvLmtlcm5lbF9uYW1lLCB3ZC5nV29ya0l0ZW1zLCB3ZC5sV29ya0l0ZW1zLCB3ZC5iYXRjaFNp
emUsIGN1cnJSZWFkLCBjdXJyV3JpdGUpOworCisJCQkJCWN1cnJSZWFkID0gMTsKKwkJCQkJY3Vy
cldyaXRlID0gMTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIGFsbG9jYXRlVGVtcG9y
YXJ5QnVmZmVyUGxhbmFyKGludCBiYXRjaFNpemUpIHsKKwkJaWYgKHRlbXBfYnVmZmVyX25lZWRl
ZCAmJiBsYXN0X2JhdGNoX3NpemUgIT0gYmF0Y2hTaXplKSB7CisJCQlsYXN0X2JhdGNoX3NpemUg
PSBiYXRjaFNpemU7CisJCQlpbnQgdG1wTGVuZ3RoID0gc2l6ZS54ICogc2l6ZS55ICogc2l6ZS56
ICogYmF0Y2hTaXplICogNDsgLy9zaXplb2YoY2xfZmxvYXQpOworCisJCQlpZiAodGVtcG1lbW9i
al9yZWFsICE9IG51bGwpIHsKKwkJCQl0ZW1wbWVtb2JqX3JlYWwucmVsZWFzZSgpOworCQkJfQor
CisJCQlpZiAodGVtcG1lbW9ial9pbWFnICE9IG51bGwpIHsKKwkJCQl0ZW1wbWVtb2JqX2ltYWcu
cmVsZWFzZSgpOworCQkJfQorCisJCQl0ZW1wbWVtb2JqX3JlYWwgPSBjb250ZXh0LmNyZWF0ZUZs
b2F0QnVmZmVyKHRtcExlbmd0aCwgTWVtLlJFQURfV1JJVEUpOworCQkJdGVtcG1lbW9ial9pbWFn
ID0gY29udGV4dC5jcmVhdGVGbG9hdEJ1ZmZlcih0bXBMZW5ndGgsIE1lbS5SRUFEX1dSSVRFKTsK
KwkJfQorCX0KKworCS8qKgorCSAqIENhbGN1bGF0ZSBGRlQgb2YgcGxhbmFyIGRhdGEuCisJICog
QHBhcmFtIHF1ZXVlCisJICogQHBhcmFtIGJhdGNoU2l6ZQorCSAqIEBwYXJhbSBkaXIKKwkgKiBA
cGFyYW0gZGF0YV9pbl9yZWFsCisJICogQHBhcmFtIGRhdGFfaW5faW1hZworCSAqIEBwYXJhbSBk
YXRhX291dF9yZWFsCisJICogQHBhcmFtIGRhdGFfb3V0X2ltYWcKKwkgKiBAcGFyYW0gY29udGl0
aW9uCisJICogQHBhcmFtIGV2ZW50CisJICovCisJcHVibGljIHZvaWQgZXhlY3V0ZVBsYW5hcihD
TENvbW1hbmRRdWV1ZSBxdWV1ZSwgaW50IGJhdGNoU2l6ZSwgQ0xGRlREaXJlY3Rpb24gZGlyLAor
CQkJQ0xCdWZmZXI8RmxvYXRCdWZmZXI+IGRhdGFfaW5fcmVhbCwgQ0xCdWZmZXI8RmxvYXRCdWZm
ZXI+IGRhdGFfaW5faW1hZywgQ0xCdWZmZXI8RmxvYXRCdWZmZXI+IGRhdGFfb3V0X3JlYWwsIENM
QnVmZmVyPEZsb2F0QnVmZmVyPiBkYXRhX291dF9pbWFnLAorCQkJQ0xFdmVudExpc3QgY29udGl0
aW9uLCBDTEV2ZW50TGlzdCBldmVudCkgeworCQlpbnQgczsKKworCQlpZiAoZm9ybWF0ICE9IGZv
cm1hdC5TcGxpdENvbXBsZXhGb3JtYXQpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRF
eGNlcHRpb24oKTsKKwkJfQorCisJCWludCBlcnI7CisJCVdvcmtEaW1lbnNpb25zIHdkOworCQli
b29sZWFuIGluUGxhY2VEb25lID0gZmFsc2U7CisKKwkJYm9vbGVhbiBpc0luUGxhY2UgPSAoKGRh
dGFfaW5fcmVhbCA9PSBkYXRhX291dF9yZWFsKSAmJiAoZGF0YV9pbl9pbWFnID09IGRhdGFfb3V0
X2ltYWcpKTsKKworCQlhbGxvY2F0ZVRlbXBvcmFyeUJ1ZmZlclBsYW5hcihiYXRjaFNpemUpOwor
CisJCUNMTWVtb3J5W10gbWVtT2JqX3JlYWwgPSBuZXcgQ0xNZW1vcnlbM107CisJCUNMTWVtb3J5
W10gbWVtT2JqX2ltYWcgPSBuZXcgQ0xNZW1vcnlbM107CisJCW1lbU9ial9yZWFsWzBdID0gZGF0
YV9pbl9yZWFsOworCQltZW1PYmpfcmVhbFsxXSA9IGRhdGFfb3V0X3JlYWw7CisJCW1lbU9ial9y
ZWFsWzJdID0gdGVtcG1lbW9ial9yZWFsOworCQltZW1PYmpfaW1hZ1swXSA9IGRhdGFfaW5faW1h
ZzsKKwkJbWVtT2JqX2ltYWdbMV0gPSBkYXRhX291dF9pbWFnOworCQltZW1PYmpfaW1hZ1syXSA9
IHRlbXBtZW1vYmpfaW1hZzsKKworCQlpbnQgbnVtS2VybmVscyA9IGtlcm5lbF9saXN0LnNpemUo
KTsKKworCQlib29sZWFuIG51bUtlcm5lbHNPZGQgPSAobnVtS2VybmVscyAmIDEpID09IDE7CisJ
CWludCBjdXJyUmVhZCA9IDA7CisJCWludCBjdXJyV3JpdGUgPSAxOworCisJCS8vIGF0IGxlYXN0
IG9uZSBleHRlcm5hbCBkcmFtIHNodWZmbGUgKHRyYW5zcG9zZSkgcmVxdWlyZWQKKwkJaWYgKHRl
bXBfYnVmZmVyX25lZWRlZCkgeworCQkJLy8gaW4tcGxhY2UgdHJhbnNmb3JtCisJCQlpZiAoaXNJ
blBsYWNlKSB7CisJCQkJaW5QbGFjZURvbmUgPSBmYWxzZTsKKwkJCQljdXJyUmVhZCA9IDE7CisJ
CQkJY3VycldyaXRlID0gMjsKKwkJCX0gZWxzZSB7CisJCQkJY3VycldyaXRlID0gKG51bUtlcm5l
bHMgJiAxKSA9PSAxID8gMSA6IDI7CisJCQl9CisKKwkJCWZvciAoQ0xGRlRLZXJuZWxJbmZvIGtl
cm5lbEluZm8gOiBrZXJuZWxfbGlzdCkgeworCQkJCWlmIChpc0luUGxhY2UgJiYgbnVtS2VybmVs
c09kZCAmJiAhaW5QbGFjZURvbmUgJiYga2VybmVsSW5mby5pbl9wbGFjZV9wb3NzaWJsZSkgewor
CQkJCQljdXJyV3JpdGUgPSBjdXJyUmVhZDsKKwkJCQkJaW5QbGFjZURvbmUgPSB0cnVlOworCQkJ
CX0KKworCQkJCXMgPSBiYXRjaFNpemU7CisJCQkJd2QgPSBnZXRLZXJuZWxXb3JrRGltZW5zaW9u
cyhrZXJuZWxJbmZvLCBzKTsKKworCQkJCWtlcm5lbEluZm8ua2VybmVsLnNldEFyZygwLCBtZW1P
YmpfcmVhbFtjdXJyUmVhZF0pOworCQkJCWtlcm5lbEluZm8ua2VybmVsLnNldEFyZygxLCBtZW1P
YmpfaW1hZ1tjdXJyUmVhZF0pOworCQkJCWtlcm5lbEluZm8ua2VybmVsLnNldEFyZygyLCBtZW1P
YmpfcmVhbFtjdXJyV3JpdGVdKTsKKwkJCQlrZXJuZWxJbmZvLmtlcm5lbC5zZXRBcmcoMywgbWVt
T2JqX2ltYWdbY3VycldyaXRlXSk7CisJCQkJa2VybmVsSW5mby5rZXJuZWwuc2V0QXJnKDQsIGRp
ci52YWx1ZSgpKTsKKwkJCQlrZXJuZWxJbmZvLmtlcm5lbC5zZXRBcmcoNSwgd2QuYmF0Y2hTaXpl
KTsKKworCQkJCXF1ZXVlLnB1dDFEUmFuZ2VLZXJuZWwoa2VybmVsSW5mby5rZXJuZWwsIDAsIHdk
LmdXb3JrSXRlbXMsIHdkLmxXb3JrSXRlbXMpOworCisKKwkJCQljdXJyUmVhZCA9IChjdXJyV3Jp
dGUgPT0gMSkgPyAxIDogMjsKKwkJCQljdXJyV3JpdGUgPSAoY3VycldyaXRlID09IDEpID8gMiA6
IDE7CisKKwkJCX0KKwkJfSAvLyBubyBkcmFtIHNodWZmbGUgKHRyYW5zcG9zZSByZXF1aXJlZCkg
dHJhbnNmb3JtCisJCWVsc2UgeworCisJCQlmb3IgKENMRkZUS2VybmVsSW5mbyBrZXJuZWxJbmZv
IDoga2VybmVsX2xpc3QpIHsKKwkJCQlzID0gYmF0Y2hTaXplOworCQkJCXdkID0gZ2V0S2VybmVs
V29ya0RpbWVuc2lvbnMoa2VybmVsSW5mbywgcyk7CisKKwkJCQlrZXJuZWxJbmZvLmtlcm5lbC5z
ZXRBcmcoMCwgbWVtT2JqX3JlYWxbY3VyclJlYWRdKTsKKwkJCQlrZXJuZWxJbmZvLmtlcm5lbC5z
ZXRBcmcoMSwgbWVtT2JqX2ltYWdbY3VyclJlYWRdKTsKKwkJCQlrZXJuZWxJbmZvLmtlcm5lbC5z
ZXRBcmcoMiwgbWVtT2JqX3JlYWxbY3VycldyaXRlXSk7CisJCQkJa2VybmVsSW5mby5rZXJuZWwu
c2V0QXJnKDMsIG1lbU9ial9pbWFnW2N1cnJXcml0ZV0pOworCQkJCWtlcm5lbEluZm8ua2VybmVs
LnNldEFyZyg0LCBkaXIudmFsdWUoKSk7CisJCQkJa2VybmVsSW5mby5rZXJuZWwuc2V0QXJnKDUs
IHdkLmJhdGNoU2l6ZSk7CisKKwkJCQlxdWV1ZS5wdXQxRFJhbmdlS2VybmVsKGtlcm5lbEluZm8u
a2VybmVsLCAwLCB3ZC5nV29ya0l0ZW1zLCB3ZC5sV29ya0l0ZW1zKTsKKwkJCQljdXJyUmVhZCA9
IDE7CisJCQkJY3VycldyaXRlID0gMTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIER1bXAg
dGhlIHBsYW5uZXIgcmVzdWx0IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorCSAqIEBwYXJhbSBvcyBp
ZiBudWxsLCBTeXN0ZW0ub3V0IGlzIHVzZWQuCisJICovCisJcHVibGljIHZvaWQgZHVtcFBsYW4o
T3V0cHV0U3RyZWFtIG9zKSB7CisJCVByaW50U3RyZWFtIG91dCA9IG9zID09IG51bGwgPyBTeXN0
ZW0ub3V0IDogbmV3IFByaW50U3RyZWFtKG9zKTsKKworCQlmb3IgKENMRkZUS2VybmVsSW5mbyBr
SW5mbyA6IGtlcm5lbF9saXN0KSB7CisJCQlpbnQgcyA9IDE7CisJCQlXb3JrRGltZW5zaW9ucyB3
ZCA9IGdldEtlcm5lbFdvcmtEaW1lbnNpb25zKGtJbmZvLCBzKTsKKwkJCW91dC5wcmludGYoIlJ1
biBrZXJuZWwgJXMgd2l0aCBnbG9iYWwgZGltID0geyVkKkJhdGNoU2l6ZX0sIGxvY2FsIGRpbT17
JWR9XG4iLCBrSW5mby5rZXJuZWxfbmFtZSwgd2QuZ1dvcmtJdGVtcywgd2QubFdvcmtJdGVtcyk7
CisJCX0KKwkJb3V0LnByaW50ZigiJXNcbiIsIGtlcm5lbF9zdHJpbmcudG9TdHJpbmcoKSk7CisJ
fQorCisJV29ya0RpbWVuc2lvbnMgZ2V0S2VybmVsV29ya0RpbWVuc2lvbnMoQ0xGRlRLZXJuZWxJ
bmZvIGtlcm5lbEluZm8sIGludCBiYXRjaFNpemUpIHsKKwkJaW50IGxXb3JrSXRlbXMgPSBrZXJu
ZWxJbmZvLm51bV93b3JraXRlbXNfcGVyX3dvcmtncm91cDsKKwkJaW50IG51bVdvcmtHcm91cHMg
PSBrZXJuZWxJbmZvLm51bV93b3JrZ3JvdXBzOworCQlpbnQgbnVtWEZvcm1zUGVyV0cgPSBrZXJu
ZWxJbmZvLm51bV94Zm9ybXNfcGVyX3dvcmtncm91cDsKKworCQlzd2l0Y2ggKGtlcm5lbEluZm8u
ZGlyKSB7CisJCQljYXNlIFg6CisJCQkJYmF0Y2hTaXplICo9IChzaXplLnkgKiBzaXplLnopOwor
CQkJCW51bVdvcmtHcm91cHMgPSAoKGJhdGNoU2l6ZSAlIG51bVhGb3Jtc1BlcldHKSAhPSAwKSA/
IChiYXRjaFNpemUgLyBudW1YRm9ybXNQZXJXRyArIDEpIDogKGJhdGNoU2l6ZSAvIG51bVhGb3Jt
c1BlcldHKTsKKwkJCQludW1Xb3JrR3JvdXBzICo9IGtlcm5lbEluZm8ubnVtX3dvcmtncm91cHM7
CisJCQkJYnJlYWs7CisJCQljYXNlIFk6CisJCQkJYmF0Y2hTaXplICo9IHNpemUuejsKKwkJCQlu
dW1Xb3JrR3JvdXBzICo9IGJhdGNoU2l6ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgWjoKKwkJCQlu
dW1Xb3JrR3JvdXBzICo9IGJhdGNoU2l6ZTsKKwkJCQlicmVhazsKKwkJfQorCisJCXJldHVybiBu
ZXcgV29ya0RpbWVuc2lvbnMoYmF0Y2hTaXplLCBudW1Xb3JrR3JvdXBzICogbFdvcmtJdGVtcywg
bFdvcmtJdGVtcyk7CisJfQorCisJLyoKKwkgKgorCSAqIEtlcm5lbCBidWlsZGluZy9jdXN0b21p
c2F0aW9uIGNvZGUgZm9sbG93cworCSAqCisJICovCisJcHJpdmF0ZSB2b2lkIGdldEJsb2NrQ29u
ZmlnQW5kS2VybmVsU3RyaW5nKCkgeworCQl0aGlzLnRlbXBfYnVmZmVyX25lZWRlZCA9IGZhbHNl
OworCQl0aGlzLmtlcm5lbF9zdHJpbmcuYXBwZW5kKGJhc2VLZXJuZWxzKTsKKworCQlpZiAodGhp
cy5mb3JtYXQgPT0gQ0xGRlREYXRhRm9ybWF0LlNwbGl0Q29tcGxleEZvcm1hdCkgeworCQkJdGhp
cy5rZXJuZWxfc3RyaW5nLmFwcGVuZCh0d2lzdEtlcm5lbFBsYW5uYXIpOworCQl9IGVsc2Ugewor
CQkJdGhpcy5rZXJuZWxfc3RyaW5nLmFwcGVuZCh0d2lzdEtlcm5lbEludGVybGVhdmVkKTsKKwkJ
fQorCisJCXN3aXRjaCAodGhpcy5kaW0pIHsKKwkJCWNhc2UgMToKKwkJCQlGRlQxRChDTEZGVEtl
cm5lbERpci5YKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyOgorCQkJCUZGVDFEKENMRkZUS2Vy
bmVsRGlyLlgpOworCQkJCUZGVDFEKENMRkZUS2VybmVsRGlyLlkpOworCQkJCWJyZWFrOworCisJ
CQljYXNlIDM6CisJCQkJRkZUMUQoQ0xGRlRLZXJuZWxEaXIuWCk7CisJCQkJRkZUMUQoQ0xGRlRL
ZXJuZWxEaXIuWSk7CisJCQkJRkZUMUQoQ0xGRlRLZXJuZWxEaXIuWik7CisJCQkJYnJlYWs7CisK
KwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuOworCQl9CisKKwkJdGhpcy50ZW1wX2J1ZmZlcl9uZWVk
ZWQgPSBmYWxzZTsKKwkJZm9yIChDTEZGVEtlcm5lbEluZm8ga0luZm8gOiB0aGlzLmtlcm5lbF9s
aXN0KSB7CisJCQl0aGlzLnRlbXBfYnVmZmVyX25lZWRlZCB8PSAha0luZm8uaW5fcGxhY2VfcG9z
c2libGU7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlS2VybmVsTGlzdCgpIHsKKwkJ
Q0xGRlRLZXJuZWxJbmZvIGtlcm47CisJCWZvciAoQ0xGRlRLZXJuZWxJbmZvIGtpbmZvIDogdGhp
cy5rZXJuZWxfbGlzdCkgeworCQkJa2luZm8ua2VybmVsID0gcHJvZ3JhbS5jcmVhdGVDTEtlcm5l
bChraW5mby5rZXJuZWxfbmFtZSk7CisJCX0KKworCQlpZiAoZm9ybWF0ID09IGZvcm1hdC5TcGxp
dENvbXBsZXhGb3JtYXQpIHsKKwkJCXR3aXN0X2tlcm5lbCA9IHByb2dyYW0uY3JlYXRlQ0xLZXJu
ZWwoImNsRkZUXzFEVHdpc3RTcGxpdCIpOworCQl9IGVsc2UgeworCQkJdHdpc3Rfa2VybmVsID0g
cHJvZ3JhbS5jcmVhdGVDTEtlcm5lbCgiY2xGRlRfMURUd2lzdEludGVybGVhdmVkIik7CisJCX0K
Kwl9CisKKwlwcml2YXRlIGJvb2xlYW4gZ2V0UGF0Y2hpbmdSZXF1aXJlZChDTERldmljZVtdIGRl
dmljZXMpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBkZXZpY2VzLmxlbmd0aDsgaSsr
KSB7CisJCQlmb3IgKENMRkZUS2VybmVsSW5mbyBrSW5mbyA6IGtlcm5lbF9saXN0KSB7CisJCQkJ
aWYgKGtJbmZvLmtlcm5lbC5nZXRXb3JrR3JvdXBTaXplKGRldmljZXNbaV0pIDwga0luZm8ubnVt
X3dvcmtpdGVtc19wZXJfd29ya2dyb3VwKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJ
CX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJbG9uZyBnZXRNYXhLZXJuZWxXb3JrR3Jv
dXBTaXplKENMRGV2aWNlW10gZGV2aWNlcykgeworCQlsb25nIG1heF93Z19zaXplID0gSW50ZWdl
ci5NQVhfVkFMVUU7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBkZXZpY2VzLmxlbmd0
aDsgaSsrKSB7CisJCQlmb3IgKENMRkZUS2VybmVsSW5mbyBrSW5mbyA6IGtlcm5lbF9saXN0KSB7
CisJCQkJbG9uZyB3Z19zaXplID0ga0luZm8ua2VybmVsLmdldFdvcmtHcm91cFNpemUoZGV2aWNl
c1tpXSk7CisKKwkJCQlpZiAobWF4X3dnX3NpemUgPiB3Z19zaXplKSB7CisJCQkJCW1heF93Z19z
aXplID0gd2dfc2l6ZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gbWF4X3dnX3NpemU7
CisJfQorCisJaW50IGxvZzIoaW50IHgpIHsKKwkJcmV0dXJuIDMyIC0gSW50ZWdlci5udW1iZXJP
ZkxlYWRpbmdaZXJvcyh4IC0gMSk7CisJfQorCisvLyBGb3IgYW55IHNpemUsIHRoaXMgZnVuY3Rp
b24gZGVjb21wb3NlcyBzaXplIGludG8gZmFjdG9ycyBmb3IgbG9hY2FsIG1lbW9yeSB0cmFucG9z
ZQorLy8gYmFzZWQgZmZ0LiBGYWN0b3JzIChyYWRpY2VzKSBhcmUgc29ydGVkIHN1Y2ggdGhhdCB0
aGUgZmlyc3Qgb25lIChyYWRpeEFycmF5WzBdKQorLy8gaXMgdGhlIGxhcmdlc3QuIFRoaXMgYmFz
ZSByYWRpeCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHVzZWQgYnkgZWFjaAor
Ly8gd29yayBpdGVtIGFuZCBwcm9kdWN0IG9mIHJlbWFpbmluZyByYWRpY2VzIGRldGVybWluZSB0
aGUgc2l6ZSBvZiB3b3JrIGdyb3VwIG5lZWRlZC4KKy8vIFRvIG1ha2UgdGhpbmdzIGNvbmNyZXRl
IHdpdGggYW5kIGV4YW1wbGUsIHN1cHBvc2Ugc2l6ZSA9IDEwMjQuIEl0IGlzIGRlY29tcG9zZWQg
aW50bworLy8gMTAyNCA9IDE2IHggMTYgeCA0LiBIZW5jZSBrZXJuZWwgdXNlcyBmbG9hdDIgYVsx
Nl0sIGZvciBsb2NhbCBpbi1yZWdpc3RlciBmZnQgYW5kCisvLyBuZWVkcyAxNiB4IDQgPSA2NCB3
b3JrIGl0ZW1zIHBlciB3b3JrIGdyb3VwLiBTbyBrZXJuZWwgZmlyc3QgcGVyZm9ybWFuY2UgNjQg
bGVuZ3RoCisvLyAxNiBmZnRzICg2NCB3b3JrIGl0ZW1zIHdvcmtpbmcgaW4gcGFyYWxsZWwpIGZv
bGxvd2luZyBieSB0cmFuc3Bvc2UgdXNpbmcgbG9jYWwKKy8vIG1lbW9yeSBmb2xsb3dlZCBieSBh
Z2FpbiA2NCBsZW5ndGggMTYgZmZ0cyBmb2xsb3dlZCBieSB0cmFuc3Bvc2UgdXNpbmcgbG9jYWwg
bWVtb3J5CisvLyBmb2xsb3dlZCBieSAyNTYgbGVuZ3RoIDQgZmZ0cy4gRm9yIHRoZSBsYXN0IHN0
ZXAgc2luY2Ugd2l0aCBzaXplIG9mIHdvcmsgZ3JvdXAgaXMKKy8vIDY0IGFuZCBlYWNoIHdvcmsg
aXRlbSBjYW4gYXJyYXkgZm9yIDE2IHZhbHVlcywgNjQgd29yayBpdGVtcyBjYW4gY29tcHV0ZSAy
NTYgbGVuZ3RoCisvLyA0IGZmdHMgYnkgZWFjaCB3b3JrIGl0ZW0gY29tcHV0aW5nIDQgbGVuZ3Ro
IDQgZmZ0cy4KKy8vIFNpbWlsYXJseSBmb3Igc2l6ZSA9IDIwNDggPSA4IHggOCB4IDggeCA0LCBl
YWNoIHdvcmsgZ3JvdXAgaGFzIDggeCA4IHggNCA9IDI1NiB3b3JrCisvLyBpdGVybXMgd2hpY2gg
ZWFjaCBjb21wdXRlcyAyNTYgKGluLXBhcmFsbGVsKSBsZW5ndGggOCBmZnRzIGluLXJlZ2lzdGVy
LCBmb2xsb3dlZAorLy8gYnkgdHJhbnNwb3NlIHVzaW5nIGxvY2FsIG1lbW9yeSwgZm9sbG93ZWQg
YnkgMjU2IGxlbmd0aCA4IGluLXJlZ2lzdGVyIGZmdHMsIGZvbGxvd2VkCisvLyBieSB0cmFuc3Bv
c2UgdXNpbmcgbG9jYWwgbWVtb3J5LCBmb2xsb3dlZCBieSAyNTYgbGVuZ3RoIDggaW4tcmVnaXN0
ZXIgZmZ0cywgZm9sbG93ZWQKKy8vIGJ5IHRyYW5zcG9zZSB1c2luZyBsb2NhbCBtZW1vcnksIGZv
bGxvd2VkIGJ5IDUxMiBsZW5ndGggNCBpbi1yZWdpc3RlciBmZnRzLiBBZ2FpbiwKKy8vIGZvciB0
aGUgbGFzdCBzdGVwLCBlYWNoIHdvcmsgaXRlbSBjb21wdXRlcyB0d28gbGVuZ3RoIDQgaW4tcmVn
aXN0ZXIgZmZ0cyBhbmQgdGh1cworLy8gMjU2IHdvcmsgaXRlbXMgYXJlIG5lZWRlZCB0byBjb21w
dXRlIGFsbCA1MTIgZmZ0cy4KKy8vIEZvciBzaXplID0gMzIgPSA4IHggNCwgNCB3b3JrIGl0ZW1z
IGZpcnN0IGNvbXB1dGUgNCBpbi1yZWdpc3RlcgorLy8gbGVudGggOCBmZnRzLCBmb2xsb3dlZCBi
eSB0cmFuc3Bvc2UgdXNpbmcgbG9jYWwgbWVtb3J5IGZvbGxvd2VkIGJ5IDggaW4tcmVnaXN0ZXIK
Ky8vIGxlbmd0aCA0IGZmdHMsIHdoZXJlIGVhY2ggd29yayBpdGVtIGNvbXB1dGVzIHR3byBsZW5n
dGggNCBmZnRzIHRodXMgNCB3b3JrIGl0ZW1zCisvLyBjYW4gY29tcHV0ZSA4IGxlbmd0aCA0IGZm
dHMuIEhvd2V2ZXIgaWYgd29yayBncm91cCBzaXplIG9mIHNheSA2NCBpcyBjaG9vc2VuLAorLy8g
ZWFjaCB3b3JrIGdyb3VwIGNhbiBjb21wdXRlIDY0LyA0ID0gMTYgc2l6ZSAzMiBmZnRzIChiYXRj
aGVkIHRyYW5zZm9ybSkuCisvLyBVc2VycyBjYW4gcGxheSB3aXRoIHRoZXNlIHBhcmFtZXRlcnMg
dG8gZmlndXJlIHdoYXQgZ2l2ZXMgYmVzdCBwZXJmb3JtYW5jZSBvbgorLy8gdGhlaXIgcGFydGlj
dWxhciBkZXZpY2UgaS5lLiBzb21lIGRldmljZSBoYXZlIGxlc3MgcmVnaXN0ZXIgc3BhY2UgdGh1
cyB1c2luZworLy8gc21hbGxlciBiYXNlIHJhZGl4IGNhbiBhdm9pZCBzcGlsbGluZyAuLi4gc29t
ZSBoYXMgc21hbGwgbG9jYWwgbWVtb3J5IHRodXMKKy8vIHVzaW5nIHNtYWxsZXIgd29yayBncm91
cCBzaXplIG1heSBiZSByZXF1aXJlZCBldGMKKwlpbnQgZ2V0UmFkaXhBcnJheShpbnQgbiwgaW50
W10gcmFkaXhBcnJheSwgaW50IG1heFJhZGl4KSB7CisJCWlmIChtYXhSYWRpeCA+IDEpIHsKKwkJ
CW1heFJhZGl4ID0gTWF0aC5taW4obiwgbWF4UmFkaXgpOworCQkJaW50IGNudCA9IDA7CisJCQl3
aGlsZSAobiA+IG1heFJhZGl4KSB7CisJCQkJcmFkaXhBcnJheVtjbnQrK10gPSBtYXhSYWRpeDsK
KwkJCQluIC89IG1heFJhZGl4OworCQkJfQorCQkJcmFkaXhBcnJheVtjbnQrK10gPSBuOworCQkJ
cmV0dXJuIGNudDsKKwkJfQorCisJCXN3aXRjaCAobikgeworCQkJY2FzZSAyOgorCQkJCXJhZGl4
QXJyYXlbMF0gPSAyOworCQkJCXJldHVybiAxOworCisJCQljYXNlIDQ6CisJCQkJcmFkaXhBcnJh
eVswXSA9IDQ7CisJCQkJcmV0dXJuIDE7CisKKwkJCWNhc2UgODoKKwkJCQlyYWRpeEFycmF5WzBd
ID0gODsKKwkJCQlyZXR1cm4gMTsKKworCQkJY2FzZSAxNjoKKwkJCQlyYWRpeEFycmF5WzBdID0g
ODsKKwkJCQlyYWRpeEFycmF5WzFdID0gMjsKKwkJCQlyZXR1cm4gMjsKKworCQkJY2FzZSAzMjoK
KwkJCQlyYWRpeEFycmF5WzBdID0gODsKKwkJCQlyYWRpeEFycmF5WzFdID0gNDsKKwkJCQlyZXR1
cm4gMjsKKworCQkJY2FzZSA2NDoKKwkJCQlyYWRpeEFycmF5WzBdID0gODsKKwkJCQlyYWRpeEFy
cmF5WzFdID0gODsKKwkJCQlyZXR1cm4gMjsKKworCQkJY2FzZSAxMjg6CisJCQkJcmFkaXhBcnJh
eVswXSA9IDg7CisJCQkJcmFkaXhBcnJheVsxXSA9IDQ7CisJCQkJcmFkaXhBcnJheVsyXSA9IDQ7
CisJCQkJcmV0dXJuIDM7CisKKwkJCWNhc2UgMjU2OgorCQkJCXJhZGl4QXJyYXlbMF0gPSA0Owor
CQkJCXJhZGl4QXJyYXlbMV0gPSA0OworCQkJCXJhZGl4QXJyYXlbMl0gPSA0OworCQkJCXJhZGl4
QXJyYXlbM10gPSA0OworCQkJCXJldHVybiA0OworCisJCQljYXNlIDUxMjoKKwkJCQlyYWRpeEFy
cmF5WzBdID0gODsKKwkJCQlyYWRpeEFycmF5WzFdID0gODsKKwkJCQlyYWRpeEFycmF5WzJdID0g
ODsKKwkJCQlyZXR1cm4gMzsKKworCQkJY2FzZSAxMDI0OgorCQkJCXJhZGl4QXJyYXlbMF0gPSAx
NjsKKwkJCQlyYWRpeEFycmF5WzFdID0gMTY7CisJCQkJcmFkaXhBcnJheVsyXSA9IDQ7CisJCQkJ
cmV0dXJuIDM7CisJCQljYXNlIDIwNDg6CisJCQkJcmFkaXhBcnJheVswXSA9IDg7CisJCQkJcmFk
aXhBcnJheVsxXSA9IDg7CisJCQkJcmFkaXhBcnJheVsyXSA9IDg7CisJCQkJcmFkaXhBcnJheVsz
XSA9IDQ7CisJCQkJcmV0dXJuIDQ7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAwOworCQl9CisJ
fQorCisJdm9pZCBpbnNlcnRIZWFkZXIoU3RyaW5nQnVpbGRlciBrZXJuZWxTdHJpbmcsIFN0cmlu
ZyBrZXJuZWxOYW1lLCBDTEZGVERhdGFGb3JtYXQgZGF0YUZvcm1hdCkgeworCQlpZiAoZGF0YUZv
cm1hdCA9PSBDTEZGVFBsYW4uQ0xGRlREYXRhRm9ybWF0LlNwbGl0Q29tcGxleEZvcm1hdCkgewor
CQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiX19rZXJuZWwgdm9pZCAiKS5hcHBlbmQoa2VybmVsTmFt
ZSkuYXBwZW5kKCIoX19nbG9iYWwgZmxvYXQgKmluX3JlYWwsIF9fZ2xvYmFsIGZsb2F0ICppbl9p
bWFnLCBfX2dsb2JhbCBmbG9hdCAqb3V0X3JlYWwsIF9fZ2xvYmFsIGZsb2F0ICpvdXRfaW1hZywg
aW50IGRpciwgaW50IFMpXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQo
Il9fa2VybmVsIHZvaWQgIikuYXBwZW5kKGtlcm5lbE5hbWUpLmFwcGVuZCgiKF9fZ2xvYmFsIGZs
b2F0MiAqaW4sIF9fZ2xvYmFsIGZsb2F0MiAqb3V0LCBpbnQgZGlyLCBpbnQgUylcbiIpOworCQl9
CisJfQorCisJdm9pZCBpbnNlcnRWYXJpYWJsZXMoU3RyaW5nQnVpbGRlciBrU3RyZWFtLCBpbnQg
bWF4UmFkaXgpIHsKKwkJa1N0cmVhbS5hcHBlbmQoIiAgICBpbnQgaSwgaiwgciwgaW5kZXhJbiwg
aW5kZXhPdXQsIGluZGV4LCB0aWQsIGJOdW0sIHhOdW0sIGssIGw7XG4iKTsKKwkJa1N0cmVhbS5h
cHBlbmQoIiAgICBpbnQgcywgaWksIGpqLCBvZmZzZXQ7XG4iKTsKKwkJa1N0cmVhbS5hcHBlbmQo
IiAgICBmbG9hdDIgdztcbiIpOworCQlrU3RyZWFtLmFwcGVuZCgiICAgIGZsb2F0IGFuZywgYW5n
ZiwgYW5nMTtcbiIpOworCQlrU3RyZWFtLmFwcGVuZCgiICAgIF9fbG9jYWwgZmxvYXQgKmxNZW1T
dG9yZSwgKmxNZW1Mb2FkO1xuIik7CisJCWtTdHJlYW0uYXBwZW5kKCIgICAgZmxvYXQyIGFbIiku
YXBwZW5kKG1heFJhZGl4KS5hcHBlbmQoIl07XG4iKTsKKwkJa1N0cmVhbS5hcHBlbmQoIiAgICBp
bnQgbElkID0gZ2V0X2xvY2FsX2lkKCAwICk7XG4iKTsKKwkJa1N0cmVhbS5hcHBlbmQoIiAgICBp
bnQgZ3JvdXBJZCA9IGdldF9ncm91cF9pZCggMCApO1xuIik7CisJfQorCisJdm9pZCBmb3JtYXR0
ZWRMb2FkKFN0cmluZ0J1aWxkZXIga2VybmVsU3RyaW5nLCBpbnQgYUluZGV4LCBpbnQgZ0luZGV4
LCBDTEZGVERhdGFGb3JtYXQgZGF0YUZvcm1hdCkgeworCQlpZiAoZGF0YUZvcm1hdCA9PSBkYXRh
Rm9ybWF0LkludGVybGVhdmVkQ29tcGxleEZvcm1hdCkgeworCQkJa2VybmVsU3RyaW5nLmFwcGVu
ZCgiICAgICAgICBhWyIpLmFwcGVuZChhSW5kZXgpLmFwcGVuZCgiXSA9IGluWyIpLmFwcGVuZChn
SW5kZXgpLmFwcGVuZCgiXTtcbiIpOworCQl9IGVsc2UgeworCQkJa2VybmVsU3RyaW5nLmFwcGVu
ZCgiICAgICAgICBhWyIpLmFwcGVuZChhSW5kZXgpLmFwcGVuZCgiXS54ID0gaW5fcmVhbFsiKS5h
cHBlbmQoZ0luZGV4KS5hcHBlbmQoIl07XG4iKTsKKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAg
ICAgICAgYVsiKS5hcHBlbmQoYUluZGV4KS5hcHBlbmQoIl0ueSA9IGluX2ltYWdbIikuYXBwZW5k
KGdJbmRleCkuYXBwZW5kKCJdO1xuIik7CisJCX0KKwl9CisKKwl2b2lkIGZvcm1hdHRlZFN0b3Jl
KFN0cmluZ0J1aWxkZXIga2VybmVsU3RyaW5nLCBpbnQgYUluZGV4LCBpbnQgZ0luZGV4LCBDTEZG
VERhdGFGb3JtYXQgZGF0YUZvcm1hdCkgeworCQlpZiAoZGF0YUZvcm1hdCA9PSBkYXRhRm9ybWF0
LkludGVybGVhdmVkQ29tcGxleEZvcm1hdCkgeworCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAg
ICAgICBvdXRbIikuYXBwZW5kKGdJbmRleCkuYXBwZW5kKCJdID0gYVsiKS5hcHBlbmQoYUluZGV4
KS5hcHBlbmQoIl07XG4iKTsKKwkJfSBlbHNlIHsKKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAg
ICAgICAgb3V0X3JlYWxbIikuYXBwZW5kKGdJbmRleCkuYXBwZW5kKCJdID0gYVsiKS5hcHBlbmQo
YUluZGV4KS5hcHBlbmQoIl0ueDtcbiIpOworCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgICAg
ICBvdXRfaW1hZ1siKS5hcHBlbmQoZ0luZGV4KS5hcHBlbmQoIl0gPSBhWyIpLmFwcGVuZChhSW5k
ZXgpLmFwcGVuZCgiXS55O1xuIik7CisJCX0KKwl9CisKKwlpbnQgaW5zZXJ0R2xvYmFsTG9hZHNB
bmRUcmFuc3Bvc2UoU3RyaW5nQnVpbGRlciBrZXJuZWxTdHJpbmcsIGludCBOLCBpbnQgbnVtV29y
a0l0ZW1zUGVyWEZvcm0sIGludCBudW1YRm9ybXNQZXJXRywgaW50IFIwLCBpbnQgbWVtX2NvYWxl
c2NlX3dpZHRoLCBDTEZGVERhdGFGb3JtYXQgZGF0YUZvcm1hdCkgeworCQlpbnQgbG9nMk51bVdv
cmtJdGVtc1BlclhGb3JtID0gKGludCkgbG9nMihudW1Xb3JrSXRlbXNQZXJYRm9ybSk7CisJCWlu
dCBncm91cFNpemUgPSBudW1Xb3JrSXRlbXNQZXJYRm9ybSAqIG51bVhGb3Jtc1BlcldHOworCQlp
bnQgaSwgajsKKwkJaW50IGxNZW1TaXplID0gMDsKKworCQlpZiAobnVtWEZvcm1zUGVyV0cgPiAx
KSB7CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgICAgIHMgPSBTICYgIikuYXBwZW5kKG51
bVhGb3Jtc1BlcldHIC0gMSkuYXBwZW5kKCI7XG4iKTsKKwkJfQorCisJCWlmIChudW1Xb3JrSXRl
bXNQZXJYRm9ybSA+PSBtZW1fY29hbGVzY2Vfd2lkdGgpIHsKKwkJCWlmIChudW1YRm9ybXNQZXJX
RyA+IDEpIHsKKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgaWkgPSBsSWQgJiAiKS5hcHBl
bmQobnVtV29ya0l0ZW1zUGVyWEZvcm0gLSAxKS5hcHBlbmQoIjtcbiIpOworCQkJCWtlcm5lbFN0
cmluZy5hcHBlbmQoIiAgICBqaiA9IGxJZCA+PiAiKS5hcHBlbmQobG9nMk51bVdvcmtJdGVtc1Bl
clhGb3JtKS5hcHBlbmQoIjtcbiIpOworCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBpZigg
IXMgfHwgKGdyb3VwSWQgPCBnZXRfbnVtX2dyb3VwcygwKS0xKSB8fCAoamogPCBzKSApIHtcbiIp
OworCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICAgICAgb2Zmc2V0ID0gbWFkMjQoIG1hZDI0
KGdyb3VwSWQsICIpLmFwcGVuZChudW1YRm9ybXNQZXJXRykuYXBwZW5kKCIsIGpqKSwgIikuYXBw
ZW5kKE4pLmFwcGVuZCgiLCBpaSApO1xuIik7CisJCQkJaWYgKGRhdGFGb3JtYXQgPT0gZGF0YUZv
cm1hdC5JbnRlcmxlYXZlZENvbXBsZXhGb3JtYXQpIHsKKwkJCQkJa2VybmVsU3RyaW5nLmFwcGVu
ZCgiICAgICAgICBpbiArPSBvZmZzZXQ7XG4iKTsKKwkJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgi
ICAgICAgICBvdXQgKz0gb2Zmc2V0O1xuIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJa2VybmVsU3Ry
aW5nLmFwcGVuZCgiICAgICAgICBpbl9yZWFsICs9IG9mZnNldDtcbiIpOworCQkJCQlrZXJuZWxT
dHJpbmcuYXBwZW5kKCIgICAgICAgIGluX2ltYWcgKz0gb2Zmc2V0O1xuIik7CisJCQkJCWtlcm5l
bFN0cmluZy5hcHBlbmQoIiAgICAgICAgb3V0X3JlYWwgKz0gb2Zmc2V0O1xuIik7CisJCQkJCWtl
cm5lbFN0cmluZy5hcHBlbmQoIiAgICAgICAgb3V0X2ltYWcgKz0gb2Zmc2V0O1xuIik7CisJCQkJ
fQorCQkJCWZvciAoaSA9IDA7IGkgPCBSMDsgaSsrKSB7CisJCQkJCWZvcm1hdHRlZExvYWQoa2Vy
bmVsU3RyaW5nLCBpLCBpICogbnVtV29ya0l0ZW1zUGVyWEZvcm0sIGRhdGFGb3JtYXQpOworCQkJ
CX0KKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgfVxuIik7CisJCQl9IGVsc2UgeworCQkJ
CWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBpaSA9IGxJZDtcbiIpOworCQkJCWtlcm5lbFN0cmlu
Zy5hcHBlbmQoIiAgICBqaiA9IDA7XG4iKTsKKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAg
b2Zmc2V0ID0gIG1hZDI0KGdyb3VwSWQsICIpLmFwcGVuZChOKS5hcHBlbmQoIiwgaWkpO1xuIik7
CisJCQkJaWYgKGRhdGFGb3JtYXQgPT0gZGF0YUZvcm1hdC5JbnRlcmxlYXZlZENvbXBsZXhGb3Jt
YXQpIHsKKwkJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgICAgICBpbiArPSBvZmZzZXQ7XG4i
KTsKKwkJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgICAgICBvdXQgKz0gb2Zmc2V0O1xuIik7
CisJCQkJfSBlbHNlIHsKKwkJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgICAgICBpbl9yZWFs
ICs9IG9mZnNldDtcbiIpOworCQkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgICAgIGluX2lt
YWcgKz0gb2Zmc2V0O1xuIik7CisJCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICAgICAgb3V0
X3JlYWwgKz0gb2Zmc2V0O1xuIik7CisJCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICAgICAg
b3V0X2ltYWcgKz0gb2Zmc2V0O1xuIik7CisJCQkJfQorCQkJCWZvciAoaSA9IDA7IGkgPCBSMDsg
aSsrKSB7CisJCQkJCWZvcm1hdHRlZExvYWQoa2VybmVsU3RyaW5nLCBpLCBpICogbnVtV29ya0l0
ZW1zUGVyWEZvcm0sIGRhdGFGb3JtYXQpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChOID49
IG1lbV9jb2FsZXNjZV93aWR0aCkgeworCQkJaW50IG51bUlubmVySXRlciA9IE4gLyBtZW1fY29h
bGVzY2Vfd2lkdGg7CisJCQlpbnQgbnVtT3V0ZXJJdGVyID0gbnVtWEZvcm1zUGVyV0cgLyAoZ3Jv
dXBTaXplIC8gbWVtX2NvYWxlc2NlX3dpZHRoKTsKKworCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgi
ICAgIGlpID0gbElkICYgIikuYXBwZW5kKG1lbV9jb2FsZXNjZV93aWR0aCAtIDEpLmFwcGVuZCgi
O1xuIik7CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgamogPSBsSWQgPj4gIikuYXBwZW5k
KChpbnQpIGxvZzIobWVtX2NvYWxlc2NlX3dpZHRoKSkuYXBwZW5kKCI7XG4iKTsKKwkJCWtlcm5l
bFN0cmluZy5hcHBlbmQoIiAgICBsTWVtU3RvcmUgPSBzTWVtICsgbWFkMjQoIGpqLCAiKS5hcHBl
bmQoTiArIG51bVdvcmtJdGVtc1BlclhGb3JtKS5hcHBlbmQoIiwgaWkgKTtcbiIpOworCQkJa2Vy
bmVsU3RyaW5nLmFwcGVuZCgiICAgIG9mZnNldCA9IG1hZDI0KCBncm91cElkLCAiKS5hcHBlbmQo
bnVtWEZvcm1zUGVyV0cpLmFwcGVuZCgiLCBqaik7XG4iKTsKKwkJCWtlcm5lbFN0cmluZy5hcHBl
bmQoIiAgICBvZmZzZXQgPSBtYWQyNCggb2Zmc2V0LCAiKS5hcHBlbmQoTikuYXBwZW5kKCIsIGlp
ICk7XG4iKTsKKwkJCWlmIChkYXRhRm9ybWF0ID09IGRhdGFGb3JtYXQuSW50ZXJsZWF2ZWRDb21w
bGV4Rm9ybWF0KSB7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgICAgICBpbiArPSBvZmZz
ZXQ7XG4iKTsKKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgICAgIG91dCArPSBvZmZzZXQ7
XG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgICAgICBpbl9y
ZWFsICs9IG9mZnNldDtcbiIpOworCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICAgICAgaW5f
aW1hZyArPSBvZmZzZXQ7XG4iKTsKKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgICAgIG91
dF9yZWFsICs9IG9mZnNldDtcbiIpOworCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICAgICAg
b3V0X2ltYWcgKz0gb2Zmc2V0O1xuIik7CisJCQl9CisKKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQo
ImlmKChncm91cElkID09IGdldF9udW1fZ3JvdXBzKDApLTEpICYmIHMpIHtcbiIpOworCQkJZm9y
IChpID0gMDsgaSA8IG51bU91dGVySXRlcjsgaSsrKSB7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVu
ZCgiICAgIGlmKCBqaiA8IHMgKSB7XG4iKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgbnVtSW5uZXJJ
dGVyOyBqKyspIHsKKwkJCQkJZm9ybWF0dGVkTG9hZChrZXJuZWxTdHJpbmcsIGkgKiBudW1Jbm5l
ckl0ZXIgKyBqLCBqICogbWVtX2NvYWxlc2NlX3dpZHRoICsgaSAqIChncm91cFNpemUgLyBtZW1f
Y29hbGVzY2Vfd2lkdGgpICogTiwgZGF0YUZvcm1hdCk7CisJCQkJfQorCQkJCWtlcm5lbFN0cmlu
Zy5hcHBlbmQoIiAgICB9XG4iKTsKKwkJCQlpZiAoaSAhPSBudW1PdXRlckl0ZXIgLSAxKSB7CisJ
CQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBqaiArPSAiKS5hcHBlbmQoZ3JvdXBTaXplIC8g
bWVtX2NvYWxlc2NlX3dpZHRoKS5hcHBlbmQoIjtcbiIpOworCQkJCX0KKwkJCX0KKwkJCWtlcm5l
bFN0cmluZy5hcHBlbmQoIn1cbiAiKTsKKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoImVsc2Uge1xu
Iik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtT3V0ZXJJdGVyOyBpKyspIHsKKwkJCQlmb3IgKGog
PSAwOyBqIDwgbnVtSW5uZXJJdGVyOyBqKyspIHsKKwkJCQkJZm9ybWF0dGVkTG9hZChrZXJuZWxT
dHJpbmcsIGkgKiBudW1Jbm5lckl0ZXIgKyBqLCBqICogbWVtX2NvYWxlc2NlX3dpZHRoICsgaSAq
IChncm91cFNpemUgLyBtZW1fY29hbGVzY2Vfd2lkdGgpICogTiwgZGF0YUZvcm1hdCk7CisJCQkJ
fQorCQkJfQorCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgifVxuIik7CisKKwkJCWtlcm5lbFN0cmlu
Zy5hcHBlbmQoIiAgICBpaSA9IGxJZCAmICIpLmFwcGVuZChudW1Xb3JrSXRlbXNQZXJYRm9ybSAt
IDEpLmFwcGVuZCgiO1xuIik7CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgamogPSBsSWQg
Pj4gIikuYXBwZW5kKGxvZzJOdW1Xb3JrSXRlbXNQZXJYRm9ybSkuYXBwZW5kKCI7XG4iKTsKKwkJ
CWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBsTWVtTG9hZCAgPSBzTWVtICsgbWFkMjQoIGpqLCAi
KS5hcHBlbmQoTiArIG51bVdvcmtJdGVtc1BlclhGb3JtKS5hcHBlbmQoIiwgaWkpO1xuIik7CisK
KwkJCWZvciAoaSA9IDA7IGkgPCBudW1PdXRlckl0ZXI7IGkrKykgeworCQkJCWZvciAoaiA9IDA7
IGogPCBudW1Jbm5lckl0ZXI7IGorKykgeworCQkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAg
bE1lbVN0b3JlWyIpLmFwcGVuZChqICogbWVtX2NvYWxlc2NlX3dpZHRoICsgaSAqIChncm91cFNp
emUgLyBtZW1fY29hbGVzY2Vfd2lkdGgpICogKE4gKyBudW1Xb3JrSXRlbXNQZXJYRm9ybSkpLmFw
cGVuZCgiXSA9IGFbIikuYXBwZW5kKGkgKiBudW1Jbm5lckl0ZXIgKyBqKS5hcHBlbmQoIl0ueDtc
biIpOworCQkJCX0KKwkJCX0KKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBiYXJyaWVyKCBD
TEtfTE9DQUxfTUVNX0ZFTkNFICk7XG4iKTsKKworCQkJZm9yIChpID0gMDsgaSA8IFIwOyBpKysp
IHsKKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgYVsiKS5hcHBlbmQoaSkuYXBwZW5kKCJd
LnggPSBsTWVtTG9hZFsiKS5hcHBlbmQoaSAqIG51bVdvcmtJdGVtc1BlclhGb3JtKS5hcHBlbmQo
Il07XG4iKTsKKwkJCX0KKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBiYXJyaWVyKCBDTEtf
TE9DQUxfTUVNX0ZFTkNFICk7XG4iKTsKKworCQkJZm9yIChpID0gMDsgaSA8IG51bU91dGVySXRl
cjsgaSsrKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IG51bUlubmVySXRlcjsgaisrKSB7CisJCQkJ
CWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBsTWVtU3RvcmVbIikuYXBwZW5kKGogKiBtZW1fY29h
bGVzY2Vfd2lkdGggKyBpICogKGdyb3VwU2l6ZSAvIG1lbV9jb2FsZXNjZV93aWR0aCkgKiAoTiAr
IG51bVdvcmtJdGVtc1BlclhGb3JtKSkuYXBwZW5kKCJdID0gYVsiKS5hcHBlbmQoaSAqIG51bUlu
bmVySXRlciArIGopLmFwcGVuZCgiXS55O1xuIik7CisJCQkJfQorCQkJfQorCQkJa2VybmVsU3Ry
aW5nLmFwcGVuZCgiICAgIGJhcnJpZXIoIENMS19MT0NBTF9NRU1fRkVOQ0UgKTtcbiIpOworCisJ
CQlmb3IgKGkgPSAwOyBpIDwgUjA7IGkrKykgeworCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAg
ICBhWyIpLmFwcGVuZChpKS5hcHBlbmQoIl0ueSA9IGxNZW1Mb2FkWyIpLmFwcGVuZChpICogbnVt
V29ya0l0ZW1zUGVyWEZvcm0pLmFwcGVuZCgiXTtcbiIpOworCQkJfQorCQkJa2VybmVsU3RyaW5n
LmFwcGVuZCgiICAgIGJhcnJpZXIoIENMS19MT0NBTF9NRU1fRkVOQ0UgKTtcbiIpOworCisJCQls
TWVtU2l6ZSA9IChOICsgbnVtV29ya0l0ZW1zUGVyWEZvcm0pICogbnVtWEZvcm1zUGVyV0c7CisJ
CX0gZWxzZSB7CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgb2Zmc2V0ID0gbWFkMjQoIGdy
b3VwSWQsICAiKS5hcHBlbmQoTiAqIG51bVhGb3Jtc1BlcldHKS5hcHBlbmQoIiwgbElkICk7XG4i
KTsKKwkJCWlmIChkYXRhRm9ybWF0ID09IGRhdGFGb3JtYXQuSW50ZXJsZWF2ZWRDb21wbGV4Rm9y
bWF0KSB7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgICAgICBpbiArPSBvZmZzZXQ7XG4i
KTsKKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgICAgIG91dCArPSBvZmZzZXQ7XG4iKTsK
KwkJCX0gZWxzZSB7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgICAgICBpbl9yZWFsICs9
IG9mZnNldDtcbiIpOworCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICAgICAgaW5faW1hZyAr
PSBvZmZzZXQ7XG4iKTsKKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgICAgIG91dF9yZWFs
ICs9IG9mZnNldDtcbiIpOworCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICAgICAgb3V0X2lt
YWcgKz0gb2Zmc2V0O1xuIik7CisJCQl9CisKKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBp
aSA9IGxJZCAmICIpLmFwcGVuZChOIC0gMSkuYXBwZW5kKCI7XG4iKTsKKwkJCWtlcm5lbFN0cmlu
Zy5hcHBlbmQoIiAgICBqaiA9IGxJZCA+PiAiKS5hcHBlbmQoKGludCkgbG9nMihOKSkuYXBwZW5k
KCI7XG4iKTsKKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBsTWVtU3RvcmUgPSBzTWVtICsg
bWFkMjQoIGpqLCAiKS5hcHBlbmQoTiArIG51bVdvcmtJdGVtc1BlclhGb3JtKS5hcHBlbmQoIiwg
aWkgKTtcbiIpOworCisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCJpZigoZ3JvdXBJZCA9PSBnZXRf
bnVtX2dyb3VwcygwKS0xKSAmJiBzKSB7XG4iKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBSMDsgaSsr
KSB7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGlmKGpqIDwgcyApXG4iKTsKKwkJCQlm
b3JtYXR0ZWRMb2FkKGtlcm5lbFN0cmluZywgaSwgaSAqIGdyb3VwU2l6ZSwgZGF0YUZvcm1hdCk7
CisJCQkJaWYgKGkgIT0gUjAgLSAxKSB7CisJCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBq
aiArPSAiKS5hcHBlbmQoZ3JvdXBTaXplIC8gTikuYXBwZW5kKCI7XG4iKTsKKwkJCQl9CisJCQl9
CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCJ9XG4iKTsKKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQo
ImVsc2Uge1xuIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgUjA7IGkrKykgeworCQkJCWZvcm1hdHRl
ZExvYWQoa2VybmVsU3RyaW5nLCBpLCBpICogZ3JvdXBTaXplLCBkYXRhRm9ybWF0KTsKKwkJCX0K
KwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIn1cbiIpOworCisJCQlpZiAobnVtV29ya0l0ZW1zUGVy
WEZvcm0gPiAxKSB7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGlpID0gbElkICYgIiku
YXBwZW5kKG51bVdvcmtJdGVtc1BlclhGb3JtIC0gMSkuYXBwZW5kKCI7XG4iKTsKKwkJCQlrZXJu
ZWxTdHJpbmcuYXBwZW5kKCIgICAgamogPSBsSWQgPj4gIikuYXBwZW5kKGxvZzJOdW1Xb3JrSXRl
bXNQZXJYRm9ybSkuYXBwZW5kKCI7XG4iKTsKKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAg
bE1lbUxvYWQgPSBzTWVtICsgbWFkMjQoIGpqLCAiKS5hcHBlbmQoTiArIG51bVdvcmtJdGVtc1Bl
clhGb3JtKS5hcHBlbmQoIiwgaWkgKTtcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlrZXJuZWxTdHJp
bmcuYXBwZW5kKCIgICAgaWkgPSAwO1xuIik7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAg
IGpqID0gbElkO1xuIik7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGxNZW1Mb2FkID0g
c01lbSArIG11bDI0KCBqaiwgIikuYXBwZW5kKE4gKyBudW1Xb3JrSXRlbXNQZXJYRm9ybSkuYXBw
ZW5kKCIpO1xuIik7CisJCQl9CisKKworCQkJZm9yIChpID0gMDsgaSA8IFIwOyBpKyspIHsKKwkJ
CQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgbE1lbVN0b3JlWyIpLmFwcGVuZChpICogKGdyb3Vw
U2l6ZSAvIE4pICogKE4gKyBudW1Xb3JrSXRlbXNQZXJYRm9ybSkpLmFwcGVuZCgiXSA9IGFbIiku
YXBwZW5kKGkpLmFwcGVuZCgiXS54O1xuIik7CisJCQl9CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5k
KCIgICAgYmFycmllciggQ0xLX0xPQ0FMX01FTV9GRU5DRSApO1xuIik7CisKKwkJCWZvciAoaSA9
IDA7IGkgPCBSMDsgaSsrKSB7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGFbIikuYXBw
ZW5kKGkpLmFwcGVuZCgiXS54ID0gbE1lbUxvYWRbIikuYXBwZW5kKGkgKiBudW1Xb3JrSXRlbXNQ
ZXJYRm9ybSkuYXBwZW5kKCJdO1xuIik7CisJCQl9CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIg
ICAgYmFycmllciggQ0xLX0xPQ0FMX01FTV9GRU5DRSApO1xuIik7CisKKwkJCWZvciAoaSA9IDA7
IGkgPCBSMDsgaSsrKSB7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGxNZW1TdG9yZVsi
KS5hcHBlbmQoaSAqIChncm91cFNpemUgLyBOKSAqIChOICsgbnVtV29ya0l0ZW1zUGVyWEZvcm0p
KS5hcHBlbmQoIl0gPSBhWyIpLmFwcGVuZChpKS5hcHBlbmQoIl0ueTtcbiIpOworCQkJfQorCQkJ
a2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGJhcnJpZXIoIENMS19MT0NBTF9NRU1fRkVOQ0UgKTtc
biIpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgUjA7IGkrKykgeworCQkJCWtlcm5lbFN0cmluZy5h
cHBlbmQoIiAgICBhWyIpLmFwcGVuZChpKS5hcHBlbmQoIl0ueSA9IGxNZW1Mb2FkWyIpLmFwcGVu
ZChpICogbnVtV29ya0l0ZW1zUGVyWEZvcm0pLmFwcGVuZCgiXTtcbiIpOworCQkJfQorCQkJa2Vy
bmVsU3RyaW5nLmFwcGVuZCgiICAgIGJhcnJpZXIoIENMS19MT0NBTF9NRU1fRkVOQ0UgKTtcbiIp
OworCisJCQlsTWVtU2l6ZSA9IChOICsgbnVtV29ya0l0ZW1zUGVyWEZvcm0pICogbnVtWEZvcm1z
UGVyV0c7CisJCX0KKworCQlyZXR1cm4gbE1lbVNpemU7CisJfQorCisJaW50IGluc2VydEdsb2Jh
bFN0b3Jlc0FuZFRyYW5zcG9zZShTdHJpbmdCdWlsZGVyIGtlcm5lbFN0cmluZywgaW50IE4sIGlu
dCBtYXhSYWRpeCwgaW50IE5yLCBpbnQgbnVtV29ya0l0ZW1zUGVyWEZvcm0sIGludCBudW1YRm9y
bXNQZXJXRywgaW50IG1lbV9jb2FsZXNjZV93aWR0aCwgQ0xGRlREYXRhRm9ybWF0IGRhdGFGb3Jt
YXQpIHsKKwkJaW50IGdyb3VwU2l6ZSA9IG51bVdvcmtJdGVtc1BlclhGb3JtICogbnVtWEZvcm1z
UGVyV0c7CisJCWludCBpLCBqLCBrLCBpbmQ7CisJCWludCBsTWVtU2l6ZSA9IDA7CisJCWludCBu
dW1JdGVyID0gbWF4UmFkaXggLyBOcjsKKwkJU3RyaW5nIGluZGVudCA9ICIiOworCisJCWlmIChu
dW1Xb3JrSXRlbXNQZXJYRm9ybSA+PSBtZW1fY29hbGVzY2Vfd2lkdGgpIHsKKwkJCWlmIChudW1Y
Rm9ybXNQZXJXRyA+IDEpIHsKKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgaWYoICFzIHx8
IChncm91cElkIDwgZ2V0X251bV9ncm91cHMoMCktMSkgfHwgKGpqIDwgcykgKSB7XG4iKTsKKwkJ
CQlpbmRlbnQgPSAoIiAgICAiKTsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCBtYXhSYWRpeDsg
aSsrKSB7CisJCQkJaiA9IGkgJSBudW1JdGVyOworCQkJCWsgPSBpIC8gbnVtSXRlcjsKKwkJCQlp
bmQgPSBqICogTnIgKyBrOworCQkJCWZvcm1hdHRlZFN0b3JlKGtlcm5lbFN0cmluZywgaW5kLCBp
ICogbnVtV29ya0l0ZW1zUGVyWEZvcm0sIGRhdGFGb3JtYXQpOworCQkJfQorCQkJaWYgKG51bVhG
b3Jtc1BlcldHID4gMSkgeworCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICB9XG4iKTsKKwkJ
CX0KKwkJfSBlbHNlIGlmIChOID49IG1lbV9jb2FsZXNjZV93aWR0aCkgeworCQkJaW50IG51bUlu
bmVySXRlciA9IE4gLyBtZW1fY29hbGVzY2Vfd2lkdGg7CisJCQlpbnQgbnVtT3V0ZXJJdGVyID0g
bnVtWEZvcm1zUGVyV0cgLyAoZ3JvdXBTaXplIC8gbWVtX2NvYWxlc2NlX3dpZHRoKTsKKworCQkJ
a2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGxNZW1Mb2FkICA9IHNNZW0gKyBtYWQyNCggamosICIp
LmFwcGVuZChOICsgbnVtV29ya0l0ZW1zUGVyWEZvcm0pLmFwcGVuZCgiLCBpaSApO1xuIik7CisJ
CQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgaWkgPSBsSWQgJiAiKS5hcHBlbmQobWVtX2NvYWxl
c2NlX3dpZHRoIC0gMSkuYXBwZW5kKCI7XG4iKTsKKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAg
ICBqaiA9IGxJZCA+PiAiKS5hcHBlbmQoKGludCkgbG9nMihtZW1fY29hbGVzY2Vfd2lkdGgpKS5h
cHBlbmQoIjtcbiIpOworCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGxNZW1TdG9yZSA9IHNN
ZW0gKyBtYWQyNCggamosIikuYXBwZW5kKE4gKyBudW1Xb3JrSXRlbXNQZXJYRm9ybSkuYXBwZW5k
KCIsIGlpICk7XG4iKTsKKworCQkJZm9yIChpID0gMDsgaSA8IG1heFJhZGl4OyBpKyspIHsKKwkJ
CQlqID0gaSAlIG51bUl0ZXI7CisJCQkJayA9IGkgLyBudW1JdGVyOworCQkJCWluZCA9IGogKiBO
ciArIGs7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGxNZW1Mb2FkWyIpLmFwcGVuZChp
ICogbnVtV29ya0l0ZW1zUGVyWEZvcm0pLmFwcGVuZCgiXSA9IGFbIikuYXBwZW5kKGluZCkuYXBw
ZW5kKCJdLng7XG4iKTsKKwkJCX0KKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBiYXJyaWVy
KCBDTEtfTE9DQUxfTUVNX0ZFTkNFICk7XG4iKTsKKworCQkJZm9yIChpID0gMDsgaSA8IG51bU91
dGVySXRlcjsgaSsrKSB7CisJCQkJZm9yIChqID0gMDsgaiA8IG51bUlubmVySXRlcjsgaisrKSB7
CisJCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBhWyIpLmFwcGVuZChpICogbnVtSW5uZXJJ
dGVyICsgaikuYXBwZW5kKCJdLnggPSBsTWVtU3RvcmVbIikuYXBwZW5kKGogKiBtZW1fY29hbGVz
Y2Vfd2lkdGggKyBpICogKGdyb3VwU2l6ZSAvIG1lbV9jb2FsZXNjZV93aWR0aCkgKiAoTiArIG51
bVdvcmtJdGVtc1BlclhGb3JtKSkuYXBwZW5kKCJdO1xuIik7CisJCQkJfQorCQkJfQorCQkJa2Vy
bmVsU3RyaW5nLmFwcGVuZCgiICAgIGJhcnJpZXIoIENMS19MT0NBTF9NRU1fRkVOQ0UgKTtcbiIp
OworCisJCQlmb3IgKGkgPSAwOyBpIDwgbWF4UmFkaXg7IGkrKykgeworCQkJCWogPSBpICUgbnVt
SXRlcjsKKwkJCQlrID0gaSAvIG51bUl0ZXI7CisJCQkJaW5kID0gaiAqIE5yICsgazsKKwkJCQlr
ZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgbE1lbUxvYWRbIikuYXBwZW5kKGkgKiBudW1Xb3JrSXRl
bXNQZXJYRm9ybSkuYXBwZW5kKCJdID0gYVsiKS5hcHBlbmQoaW5kKS5hcHBlbmQoIl0ueTtcbiIp
OworCQkJfQorCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGJhcnJpZXIoIENMS19MT0NBTF9N
RU1fRkVOQ0UgKTtcbiIpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtT3V0ZXJJdGVyOyBpKysp
IHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgbnVtSW5uZXJJdGVyOyBqKyspIHsKKwkJCQkJa2VybmVs
U3RyaW5nLmFwcGVuZCgiICAgIGFbIikuYXBwZW5kKGkgKiBudW1Jbm5lckl0ZXIgKyBqKS5hcHBl
bmQoIl0ueSA9IGxNZW1TdG9yZVsiKS5hcHBlbmQoaiAqIG1lbV9jb2FsZXNjZV93aWR0aCArIGkg
KiAoZ3JvdXBTaXplIC8gbWVtX2NvYWxlc2NlX3dpZHRoKSAqIChOICsgbnVtV29ya0l0ZW1zUGVy
WEZvcm0pKS5hcHBlbmQoIl07XG4iKTsKKwkJCQl9CisJCQl9CisJCQlrZXJuZWxTdHJpbmcuYXBw
ZW5kKCIgICAgYmFycmllciggQ0xLX0xPQ0FMX01FTV9GRU5DRSApO1xuIik7CisKKwkJCWtlcm5l
bFN0cmluZy5hcHBlbmQoImlmKChncm91cElkID09IGdldF9udW1fZ3JvdXBzKDApLTEpICYmIHMp
IHtcbiIpOworCQkJZm9yIChpID0gMDsgaSA8IG51bU91dGVySXRlcjsgaSsrKSB7CisJCQkJa2Vy
bmVsU3RyaW5nLmFwcGVuZCgiICAgIGlmKCBqaiA8IHMgKSB7XG4iKTsKKwkJCQlmb3IgKGogPSAw
OyBqIDwgbnVtSW5uZXJJdGVyOyBqKyspIHsKKwkJCQkJZm9ybWF0dGVkU3RvcmUoa2VybmVsU3Ry
aW5nLCBpICogbnVtSW5uZXJJdGVyICsgaiwgaiAqIG1lbV9jb2FsZXNjZV93aWR0aCArIGkgKiAo
Z3JvdXBTaXplIC8gbWVtX2NvYWxlc2NlX3dpZHRoKSAqIE4sIGRhdGFGb3JtYXQpOworCQkJCX0K
KwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgfVxuIik7CisJCQkJaWYgKGkgIT0gbnVtT3V0
ZXJJdGVyIC0gMSkgeworCQkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgamogKz0gIikuYXBw
ZW5kKGdyb3VwU2l6ZSAvIG1lbV9jb2FsZXNjZV93aWR0aCkuYXBwZW5kKCI7XG4iKTsKKwkJCQl9
CisJCQl9CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCJ9XG4iKTsKKwkJCWtlcm5lbFN0cmluZy5h
cHBlbmQoImVsc2Uge1xuIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtT3V0ZXJJdGVyOyBpKysp
IHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgbnVtSW5uZXJJdGVyOyBqKyspIHsKKwkJCQkJZm9ybWF0
dGVkU3RvcmUoa2VybmVsU3RyaW5nLCBpICogbnVtSW5uZXJJdGVyICsgaiwgaiAqIG1lbV9jb2Fs
ZXNjZV93aWR0aCArIGkgKiAoZ3JvdXBTaXplIC8gbWVtX2NvYWxlc2NlX3dpZHRoKSAqIE4sIGRh
dGFGb3JtYXQpOworCQkJCX0KKwkJCX0KKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIn1cbiIpOwor
CisJCQlsTWVtU2l6ZSA9IChOICsgbnVtV29ya0l0ZW1zUGVyWEZvcm0pICogbnVtWEZvcm1zUGVy
V0c7CisJCX0gZWxzZSB7CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgbE1lbUxvYWQgID0g
c01lbSArIG1hZDI0KCBqaiwiKS5hcHBlbmQoTiArIG51bVdvcmtJdGVtc1BlclhGb3JtKS5hcHBl
bmQoIiwgaWkgKTtcbiIpOworCisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgaWkgPSBsSWQg
JiAiKS5hcHBlbmQoTiAtIDEpLmFwcGVuZCgiO1xuIik7CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5k
KCIgICAgamogPSBsSWQgPj4gIikuYXBwZW5kKChpbnQpIGxvZzIoTikpLmFwcGVuZCgiO1xuIik7
CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgbE1lbVN0b3JlID0gc01lbSArIG1hZDI0KCBq
aiwiKS5hcHBlbmQoTiArIG51bVdvcmtJdGVtc1BlclhGb3JtKS5hcHBlbmQoIiwgaWkgKTtcbiIp
OworCisJCQlmb3IgKGkgPSAwOyBpIDwgbWF4UmFkaXg7IGkrKykgeworCQkJCWogPSBpICUgbnVt
SXRlcjsKKwkJCQlrID0gaSAvIG51bUl0ZXI7CisJCQkJaW5kID0gaiAqIE5yICsgazsKKwkJCQlr
ZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgbE1lbUxvYWRbIikuYXBwZW5kKGkgKiBudW1Xb3JrSXRl
bXNQZXJYRm9ybSkuYXBwZW5kKCJdID0gYVsiKS5hcHBlbmQoaW5kKS5hcHBlbmQoIl0ueDtcbiIp
OworCQkJfQorCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGJhcnJpZXIoIENMS19MT0NBTF9N
RU1fRkVOQ0UgKTtcbiIpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbWF4UmFkaXg7IGkrKykgewor
CQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBhWyIpLmFwcGVuZChpKS5hcHBlbmQoIl0ueCA9
IGxNZW1TdG9yZVsiKS5hcHBlbmQoaSAqIChncm91cFNpemUgLyBOKSAqIChOICsgbnVtV29ya0l0
ZW1zUGVyWEZvcm0pKS5hcHBlbmQoIl07XG4iKTsKKwkJCX0KKwkJCWtlcm5lbFN0cmluZy5hcHBl
bmQoIiAgICBiYXJyaWVyKCBDTEtfTE9DQUxfTUVNX0ZFTkNFICk7XG4iKTsKKworCQkJZm9yIChp
ID0gMDsgaSA8IG1heFJhZGl4OyBpKyspIHsKKwkJCQlqID0gaSAlIG51bUl0ZXI7CisJCQkJayA9
IGkgLyBudW1JdGVyOworCQkJCWluZCA9IGogKiBOciArIGs7CisJCQkJa2VybmVsU3RyaW5nLmFw
cGVuZCgiICAgIGxNZW1Mb2FkWyIpLmFwcGVuZChpICogbnVtV29ya0l0ZW1zUGVyWEZvcm0pLmFw
cGVuZCgiXSA9IGFbIikuYXBwZW5kKGluZCkuYXBwZW5kKCJdLnk7XG4iKTsKKwkJCX0KKwkJCWtl
cm5lbFN0cmluZy5hcHBlbmQoIiAgICBiYXJyaWVyKCBDTEtfTE9DQUxfTUVNX0ZFTkNFICk7XG4i
KTsKKworCQkJZm9yIChpID0gMDsgaSA8IG1heFJhZGl4OyBpKyspIHsKKwkJCQlrZXJuZWxTdHJp
bmcuYXBwZW5kKCIgICAgYVsiKS5hcHBlbmQoaSkuYXBwZW5kKCJdLnkgPSBsTWVtU3RvcmVbIiku
YXBwZW5kKGkgKiAoZ3JvdXBTaXplIC8gTikgKiAoTiArIG51bVdvcmtJdGVtc1BlclhGb3JtKSku
YXBwZW5kKCJdO1xuIik7CisJCQl9CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgYmFycmll
ciggQ0xLX0xPQ0FMX01FTV9GRU5DRSApO1xuIik7CisKKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQo
ImlmKChncm91cElkID09IGdldF9udW1fZ3JvdXBzKDApLTEpICYmIHMpIHtcbiIpOworCQkJZm9y
IChpID0gMDsgaSA8IG1heFJhZGl4OyBpKyspIHsKKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIg
ICAgaWYoamogPCBzICkge1xuIik7CisJCQkJZm9ybWF0dGVkU3RvcmUoa2VybmVsU3RyaW5nLCBp
LCBpICogZ3JvdXBTaXplLCBkYXRhRm9ybWF0KTsKKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIg
ICAgfVxuIik7CisJCQkJaWYgKGkgIT0gbWF4UmFkaXggLSAxKSB7CisJCQkJCWtlcm5lbFN0cmlu
Zy5hcHBlbmQoIiAgICBqaiArPSIpLmFwcGVuZChncm91cFNpemUgLyBOKS5hcHBlbmQoIjtcbiIp
OworCQkJCX0KKwkJCX0KKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIn1cbiIpOworCQkJa2VybmVs
U3RyaW5nLmFwcGVuZCgiZWxzZSB7XG4iKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBtYXhSYWRpeDsg
aSsrKSB7CisJCQkJZm9ybWF0dGVkU3RvcmUoa2VybmVsU3RyaW5nLCBpLCBpICogZ3JvdXBTaXpl
LCBkYXRhRm9ybWF0KTsKKwkJCX0KKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIn1cbiIpOworCisJ
CQlsTWVtU2l6ZSA9IChOICsgbnVtV29ya0l0ZW1zUGVyWEZvcm0pICogbnVtWEZvcm1zUGVyV0c7
CisJCX0KKworCQlyZXR1cm4gbE1lbVNpemU7CisJfQorCisJdm9pZCBpbnNlcnRmZnRLZXJuZWwo
U3RyaW5nQnVpbGRlciBrZXJuZWxTdHJpbmcsIGludCBOciwgaW50IG51bUl0ZXIpIHsKKwkJaW50
IGk7CisJCWZvciAoaSA9IDA7IGkgPCBudW1JdGVyOyBpKyspIHsKKwkJCWtlcm5lbFN0cmluZy5h
cHBlbmQoIiAgICBmZnRLZXJuZWwiKS5hcHBlbmQoTnIpLmFwcGVuZCgiKGErIikuYXBwZW5kKGkg
KiBOcikuYXBwZW5kKCIsIGRpcik7XG4iKTsKKwkJfQorCX0KKworCXZvaWQgaW5zZXJ0VHdpZGRs
ZUtlcm5lbChTdHJpbmdCdWlsZGVyIGtlcm5lbFN0cmluZywgaW50IE5yLCBpbnQgbnVtSXRlciwg
aW50IE5wcmV2LCBpbnQgbGVuLCBpbnQgbnVtV29ya0l0ZW1zUGVyWEZvcm0pIHsKKwkJaW50IHos
IGs7CisJCWludCBsb2dOUHJldiA9IGxvZzIoTnByZXYpOworCisJCWZvciAoeiA9IDA7IHogPCBu
dW1JdGVyOyB6KyspIHsKKwkJCWlmICh6ID09IDApIHsKKwkJCQlpZiAoTnByZXYgPiAxKSB7CisJ
CQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBhbmdmID0gKGZsb2F0KSAoaWkgPj4gIikuYXBw
ZW5kKGxvZ05QcmV2KS5hcHBlbmQoIik7XG4iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlrZXJuZWxT
dHJpbmcuYXBwZW5kKCIgICAgYW5nZiA9IChmbG9hdCkgaWk7XG4iKTsKKwkJCQl9CisJCQl9IGVs
c2UgeworCQkJCWlmIChOcHJldiA+IDEpIHsKKwkJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAg
IGFuZ2YgPSAoZmxvYXQpICgoIikuYXBwZW5kKHogKiBudW1Xb3JrSXRlbXNQZXJYRm9ybSkuYXBw
ZW5kKCIgKyBpaSkgPj4iKS5hcHBlbmQobG9nTlByZXYpLmFwcGVuZCgiKTtcbiIpOworCQkJCX0g
ZWxzZSB7CisJCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBhbmdmID0gKGZsb2F0KSAoIiku
YXBwZW5kKHogKiBudW1Xb3JrSXRlbXNQZXJYRm9ybSkuYXBwZW5kKCIgKyBpaSk7XG4iKTsKKwkJ
CQl9CisJCQl9CisKKwkJCWZvciAoayA9IDE7IGsgPCBOcjsgaysrKSB7CisJCQkJaW50IGluZCA9
IHogKiBOciArIGs7CisJCQkJLy9mbG9hdCBmYWMgPSAgKGZsb2F0KSAoMi4wICogTV9QSSAqIChk
b3VibGUpIGsgLyAoZG91YmxlKSBsZW4pOworCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBh
bmcgPSBkaXIgKiAoIDIuMGYgKiBNX1BJICogIikuYXBwZW5kKGspLmFwcGVuZCgiLjBmIC8gIiku
YXBwZW5kKGxlbikuYXBwZW5kKCIuMGYgKSIpLmFwcGVuZCgiICogYW5nZjtcbiIpOworCQkJCWtl
cm5lbFN0cmluZy5hcHBlbmQoIiAgICB3ID0gKGZsb2F0MikobmF0aXZlX2NvcyhhbmcpLCBuYXRp
dmVfc2luKGFuZykpO1xuIik7CisJCQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGFbIikuYXBw
ZW5kKGluZCkuYXBwZW5kKCJdID0gY29tcGxleE11bChhWyIpLmFwcGVuZChpbmQpLmFwcGVuZCgi
XSwgdyk7XG4iKTsKKwkJCX0KKwkJfQorCX0KKworCWZmdFBhZGRpbmcgZ2V0UGFkZGluZyhpbnQg
bnVtV29ya0l0ZW1zUGVyWEZvcm0sIGludCBOcHJldiwgaW50IG51bVdvcmtJdGVtc1JlcSwgaW50
IG51bVhGb3Jtc1BlcldHLCBpbnQgTnIsIGludCBudW1CYW5rcykgeworCQlpbnQgb2Zmc2V0LCBt
aWRQYWQ7CisKKwkJaWYgKChudW1Xb3JrSXRlbXNQZXJYRm9ybSA8PSBOcHJldikgfHwgKE5wcmV2
ID49IG51bUJhbmtzKSkgeworCQkJb2Zmc2V0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWludCBudW1S
b3dzUmVxID0gKChudW1Xb3JrSXRlbXNQZXJYRm9ybSA8IG51bUJhbmtzKSA/IG51bVdvcmtJdGVt
c1BlclhGb3JtIDogbnVtQmFua3MpIC8gTnByZXY7CisJCQlpbnQgbnVtQ29sc1JlcSA9IDE7CisJ
CQlpZiAobnVtUm93c1JlcSA+IE5yKSB7CisJCQkJbnVtQ29sc1JlcSA9IG51bVJvd3NSZXEgLyBO
cjsKKwkJCX0KKwkJCW51bUNvbHNSZXEgPSBOcHJldiAqIG51bUNvbHNSZXE7CisJCQlvZmZzZXQg
PSBudW1Db2xzUmVxOworCQl9CisKKwkJaWYgKG51bVdvcmtJdGVtc1BlclhGb3JtID49IG51bUJh
bmtzIHx8IG51bVhGb3Jtc1BlcldHID09IDEpIHsKKwkJCW1pZFBhZCA9IDA7CisJCX0gZWxzZSB7
CisJCQlpbnQgYmFua051bSA9ICgobnVtV29ya0l0ZW1zUmVxICsgb2Zmc2V0KSAqIE5yKSAmIChu
dW1CYW5rcyAtIDEpOworCQkJaWYgKGJhbmtOdW0gPj0gbnVtV29ya0l0ZW1zUGVyWEZvcm0pIHsK
KwkJCQltaWRQYWQgPSAwOworCQkJfSBlbHNlIHsKKwkJCQltaWRQYWQgPSBudW1Xb3JrSXRlbXNQ
ZXJYRm9ybSAtIGJhbmtOdW07CisJCQl9CisJCX0KKworCQlpbnQgbE1lbVNpemUgPSAobnVtV29y
a0l0ZW1zUmVxICsgb2Zmc2V0KSAqIE5yICogbnVtWEZvcm1zUGVyV0cgKyBtaWRQYWQgKiAobnVt
WEZvcm1zUGVyV0cgLSAxKTsKKwkJcmV0dXJuIG5ldyBmZnRQYWRkaW5nKGxNZW1TaXplLCBvZmZz
ZXQsIG1pZFBhZCk7CisJfQorCisJdm9pZCBpbnNlcnRMb2NhbFN0b3JlcyhTdHJpbmdCdWlsZGVy
IGtlcm5lbFN0cmluZywgaW50IG51bUl0ZXIsIGludCBOciwgaW50IG51bVdvcmtJdGVtc1BlclhG
b3JtLCBpbnQgbnVtV29ya0l0ZW1zUmVxLCBpbnQgb2Zmc2V0LCBTdHJpbmcgY29tcCkgeworCQlp
bnQgeiwgazsKKworCQlmb3IgKHogPSAwOyB6IDwgbnVtSXRlcjsgeisrKSB7CisJCQlmb3IgKGsg
PSAwOyBrIDwgTnI7IGsrKykgeworCQkJCWludCBpbmRleCA9IGsgKiAobnVtV29ya0l0ZW1zUmVx
ICsgb2Zmc2V0KSArIHogKiBudW1Xb3JrSXRlbXNQZXJYRm9ybTsKKwkJCQlrZXJuZWxTdHJpbmcu
YXBwZW5kKCIgICAgbE1lbVN0b3JlWyIpLmFwcGVuZChpbmRleCkuYXBwZW5kKCJdID0gYVsiKS5h
cHBlbmQoeiAqIE5yICsgaykuYXBwZW5kKCJdLiIpLmFwcGVuZChjb21wKS5hcHBlbmQoIjtcbiIp
OworCQkJfQorCQl9CisJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBiYXJyaWVyKENMS19MT0NB
TF9NRU1fRkVOQ0UpO1xuIik7CisJfQorCisJdm9pZCBpbnNlcnRMb2NhbExvYWRzKFN0cmluZ0J1
aWxkZXIga2VybmVsU3RyaW5nLCBpbnQgbiwgaW50IE5yLCBpbnQgTnJuLCBpbnQgTnByZXYsIGlu
dCBOY3VyciwgaW50IG51bVdvcmtJdGVtc1BlclhGb3JtLCBpbnQgbnVtV29ya0l0ZW1zUmVxLCBp
bnQgb2Zmc2V0LCBTdHJpbmcgY29tcCkgeworCQlpbnQgbnVtV29ya0l0ZW1zUmVxTiA9IG4gLyBO
cm47CisJCWludCBpbnRlckJsb2NrSE51bSA9IE1hdGgubWF4KE5wcmV2IC8gbnVtV29ya0l0ZW1z
UGVyWEZvcm0sIDEpOworCQlpbnQgaW50ZXJCbG9ja0hTdHJpZGUgPSBudW1Xb3JrSXRlbXNQZXJY
Rm9ybTsKKwkJaW50IHZlcnRXaWR0aCA9IE1hdGgubWF4KG51bVdvcmtJdGVtc1BlclhGb3JtIC8g
TnByZXYsIDEpOworCQl2ZXJ0V2lkdGggPSBNYXRoLm1pbih2ZXJ0V2lkdGgsIE5yKTsKKwkJaW50
IHZlcnROdW0gPSBOciAvIHZlcnRXaWR0aDsKKwkJaW50IHZlcnRTdHJpZGUgPSAobiAvIE5yICsg
b2Zmc2V0KSAqIHZlcnRXaWR0aDsKKwkJaW50IGl0ZXIgPSBNYXRoLm1heChudW1Xb3JrSXRlbXNS
ZXFOIC8gbnVtV29ya0l0ZW1zUGVyWEZvcm0sIDEpOworCQlpbnQgaW50cmFCbG9ja0hTdHJpZGUg
PSAobnVtV29ya0l0ZW1zUGVyWEZvcm0gLyAoTnByZXYgKiBOcikpID4gMSA/IChudW1Xb3JrSXRl
bXNQZXJYRm9ybSAvIChOcHJldiAqIE5yKSkgOiAxOworCQlpbnRyYUJsb2NrSFN0cmlkZSAqPSBO
cHJldjsKKworCQlpbnQgc3RyaWRlID0gbnVtV29ya0l0ZW1zUmVxIC8gTnJuOworCQlpbnQgaTsK
KwkJZm9yIChpID0gMDsgaSA8IGl0ZXI7IGkrKykgeworCQkJaW50IGlpID0gaSAvIChpbnRlckJs
b2NrSE51bSAqIHZlcnROdW0pOworCQkJaW50IHp6ID0gaSAlIChpbnRlckJsb2NrSE51bSAqIHZl
cnROdW0pOworCQkJaW50IGpqID0genogJSBpbnRlckJsb2NrSE51bTsKKwkJCWludCBrayA9IHp6
IC8gaW50ZXJCbG9ja0hOdW07CisJCQlpbnQgejsKKwkJCWZvciAoeiA9IDA7IHogPCBOcm47IHor
KykgeworCQkJCWludCBzdCA9IGtrICogdmVydFN0cmlkZSArIGpqICogaW50ZXJCbG9ja0hTdHJp
ZGUgKyBpaSAqIGludHJhQmxvY2tIU3RyaWRlICsgeiAqIHN0cmlkZTsKKwkJCQlrZXJuZWxTdHJp
bmcuYXBwZW5kKCIgICAgYVsiKS5hcHBlbmQoaSAqIE5ybiArIHopLmFwcGVuZCgiXS4iKS5hcHBl
bmQoY29tcCkuYXBwZW5kKCIgPSBsTWVtTG9hZFsiKS5hcHBlbmQoc3QpLmFwcGVuZCgiXTtcbiIp
OworCQkJfQorCQl9CisJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBiYXJyaWVyKENMS19MT0NB
TF9NRU1fRkVOQ0UpO1xuIik7CisJfQorCisJdm9pZCBpbnNlcnRMb2NhbExvYWRJbmRleEFyaXRo
bWF0aWMoU3RyaW5nQnVpbGRlciBrZXJuZWxTdHJpbmcsIGludCBOcHJldiwgaW50IE5yLCBpbnQg
bnVtV29ya0l0ZW1zUmVxLCBpbnQgbnVtV29ya0l0ZW1zUGVyWEZvcm0sIGludCBudW1YRm9ybXNQ
ZXJXRywgaW50IG9mZnNldCwgaW50IG1pZFBhZCkgeworCQlpbnQgTmN1cnIgPSBOcHJldiAqIE5y
OworCQlpbnQgbG9nTmN1cnIgPSBsb2cyKE5jdXJyKTsKKwkJaW50IGxvZ05wcmV2ID0gbG9nMihO
cHJldik7CisJCWludCBpbmNyID0gKG51bVdvcmtJdGVtc1JlcSArIG9mZnNldCkgKiBOciArIG1p
ZFBhZDsKKworCQlpZiAoTmN1cnIgPCBudW1Xb3JrSXRlbXNQZXJYRm9ybSkgeworCQkJaWYgKE5w
cmV2ID09IDEpIHsKKwkJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgaiA9IGlpICYgIikuYXBw
ZW5kKE5jdXJyIC0gMSkuYXBwZW5kKCI7XG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJa2VybmVsU3Ry
aW5nLmFwcGVuZCgiICAgIGogPSAoaWkgJiAiKS5hcHBlbmQoTmN1cnIgLSAxKS5hcHBlbmQoIikg
Pj4gIikuYXBwZW5kKGxvZ05wcmV2KS5hcHBlbmQoIjtcbiIpOworCQkJfQorCisJCQlpZiAoTnBy
ZXYgPT0gMSkgeworCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBpID0gaWkgPj4gIikuYXBw
ZW5kKGxvZ05jdXJyKS5hcHBlbmQoIjtcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlrZXJuZWxTdHJp
bmcuYXBwZW5kKCIgICAgaSA9IG1hZDI0KGlpID4+ICIpLmFwcGVuZChsb2dOY3VycikuYXBwZW5k
KCIsICIpLmFwcGVuZChOcHJldikuYXBwZW5kKCIsIGlpICYgIikuYXBwZW5kKE5wcmV2IC0gMSku
YXBwZW5kKCIpO1xuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoTnByZXYgPT0gMSkgewor
CQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBqID0gaWk7XG4iKTsKKwkJCX0gZWxzZSB7CisJ
CQkJa2VybmVsU3RyaW5nLmFwcGVuZCgiICAgIGogPSBpaSA+PiAiKS5hcHBlbmQobG9nTnByZXYp
LmFwcGVuZCgiO1xuIik7CisJCQl9CisJCQlpZiAoTnByZXYgPT0gMSkgeworCQkJCWtlcm5lbFN0
cmluZy5hcHBlbmQoIiAgICBpID0gMDtcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlrZXJuZWxTdHJp
bmcuYXBwZW5kKCIgICAgaSA9IGlpICYgIikuYXBwZW5kKE5wcmV2IC0gMSkuYXBwZW5kKCI7XG4i
KTsKKwkJCX0KKwkJfQorCisJCWlmIChudW1YRm9ybXNQZXJXRyA+IDEpIHsKKwkJCWtlcm5lbFN0
cmluZy5hcHBlbmQoIiAgICBpID0gbWFkMjQoamosICIpLmFwcGVuZChpbmNyKS5hcHBlbmQoIiwg
aSk7XG4iKTsKKwkJfQorCisJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBsTWVtTG9hZCA9IHNN
ZW0gKyBtYWQyNChqLCAiKS5hcHBlbmQobnVtV29ya0l0ZW1zUmVxICsgb2Zmc2V0KS5hcHBlbmQo
IiwgaSk7XG4iKTsKKwl9CisKKwl2b2lkIGluc2VydExvY2FsU3RvcmVJbmRleEFyaXRobWF0aWMo
U3RyaW5nQnVpbGRlciBrZXJuZWxTdHJpbmcsIGludCBudW1Xb3JrSXRlbXNSZXEsIGludCBudW1Y
Rm9ybXNQZXJXRywgaW50IE5yLCBpbnQgb2Zmc2V0LCBpbnQgbWlkUGFkKSB7CisJCWlmIChudW1Y
Rm9ybXNQZXJXRyA9PSAxKSB7CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIgICAgbE1lbVN0b3Jl
ID0gc01lbSArIGlpO1xuIik7CisJCX0gZWxzZSB7CisJCQlrZXJuZWxTdHJpbmcuYXBwZW5kKCIg
ICAgbE1lbVN0b3JlID0gc01lbSArIG1hZDI0KGpqLCAiKS5hcHBlbmQoKG51bVdvcmtJdGVtc1Jl
cSArIG9mZnNldCkgKiBOciArIG1pZFBhZCkuYXBwZW5kKCIsIGlpKTtcbiIpOworCQl9CisJfQor
CisJdm9pZCBjcmVhdGVMb2NhbE1lbWZmdEtlcm5lbFN0cmluZygpIHsKKwkJaW50W10gcmFkaXhB
cnJheSA9IG5ldyBpbnRbMTBdOworCQlpbnQgbnVtUmFkaXg7CisKKwkJaW50IG4gPSB0aGlzLnNp
emUueDsKKworCQlhc3NlcnQgKG4gPD0gdGhpcy5tYXhfd29ya19pdGVtX3Blcl93b3JrZ3JvdXAg
KiB0aGlzLm1heF9yYWRpeCk7CisKKwkJbnVtUmFkaXggPSBnZXRSYWRpeEFycmF5KG4sIHJhZGl4
QXJyYXksIDApOworCQlhc3NlcnQgKG51bVJhZGl4ID4gMCk7CisKKwkJaWYgKG4gLyByYWRpeEFy
cmF5WzBdID4gdGhpcy5tYXhfd29ya19pdGVtX3Blcl93b3JrZ3JvdXApIHsKKwkJCW51bVJhZGl4
ID0gZ2V0UmFkaXhBcnJheShuLCByYWRpeEFycmF5LCB0aGlzLm1heF9yYWRpeCk7CisJCX0KKwor
CQlhc3NlcnQgKHJhZGl4QXJyYXlbMF0gPD0gdGhpcy5tYXhfcmFkaXgpOworCQlhc3NlcnQgKG4g
LyByYWRpeEFycmF5WzBdIDw9IHRoaXMubWF4X3dvcmtfaXRlbV9wZXJfd29ya2dyb3VwKTsKKwor
CQlpbnQgdG1wTGVuID0gMTsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBudW1SYWRpeDsg
aSsrKSB7CisJCQlhc3NlcnQgKChyYWRpeEFycmF5W2ldICE9IDApICYmICEoKChyYWRpeEFycmF5
W2ldIC0gMSkgIT0gMCkgJiAocmFkaXhBcnJheVtpXSAhPSAwKSkpOworCQkJdG1wTGVuICo9IHJh
ZGl4QXJyYXlbaV07CisJCX0KKwkJYXNzZXJ0ICh0bXBMZW4gPT0gbik7CisKKwkJLy9pbnQgb2Zm
c2V0LCBtaWRQYWQ7CisJCVN0cmluZ0J1aWxkZXIgbG9jYWxTdHJpbmcgPSBuZXcgU3RyaW5nQnVp
bGRlcigpOworCQlTdHJpbmcga2VybmVsTmFtZTsKKworCQlDTEZGVERhdGFGb3JtYXQgZGF0YUZv
cm1hdCA9IHRoaXMuZm9ybWF0OworCQlTdHJpbmdCdWlsZGVyIGtlcm5lbFN0cmluZyA9IHRoaXMu
a2VybmVsX3N0cmluZzsKKworCQlpbnQga0NvdW50ID0ga2VybmVsX2xpc3Quc2l6ZSgpOworCisJ
CWtlcm5lbE5hbWUgPSAiZmZ0IiArIChrQ291bnQpOworCisJCUNMRkZUS2VybmVsSW5mbyBrSW5m
byA9IG5ldyBDTEZGVEtlcm5lbEluZm8oKTsKKwkJa2VybmVsX2xpc3QuYWRkKGtJbmZvKTsKKwkJ
Ly9rSW5mby5rZXJuZWwgPSBudWxsOworCQkvL2tJbmZvLmxtZW1fc2l6ZSA9IDA7CisJCS8va0lu
Zm8ubnVtX3dvcmtncm91cHMgPSAwOworCQkvL2tJbmZvLm51bV93b3JraXRlbXNfcGVyX3dvcmtn
cm91cCA9IDA7CisJCWtJbmZvLmRpciA9IENMRkZUS2VybmVsRGlyLlg7CisJCWtJbmZvLmluX3Bs
YWNlX3Bvc3NpYmxlID0gdHJ1ZTsKKwkJLy9rSW5mby5uZXh0ID0gbnVsbDsKKwkJa0luZm8ua2Vy
bmVsX25hbWUgPSBrZXJuZWxOYW1lOworCisJCWludCBudW1Xb3JrSXRlbXNQZXJYRm9ybSA9IG4g
LyByYWRpeEFycmF5WzBdOworCQlpbnQgbnVtV29ya0l0ZW1zUGVyV0cgPSBudW1Xb3JrSXRlbXNQ
ZXJYRm9ybSA8PSA2NCA/IDY0IDogbnVtV29ya0l0ZW1zUGVyWEZvcm07CisJCWFzc2VydCAobnVt
V29ya0l0ZW1zUGVyV0cgPD0gdGhpcy5tYXhfd29ya19pdGVtX3Blcl93b3JrZ3JvdXApOworCQlp
bnQgbnVtWEZvcm1zUGVyV0cgPSBudW1Xb3JrSXRlbXNQZXJXRyAvIG51bVdvcmtJdGVtc1BlclhG
b3JtOworCQlrSW5mby5udW1fd29ya2dyb3VwcyA9IDE7CisJCWtJbmZvLm51bV94Zm9ybXNfcGVy
X3dvcmtncm91cCA9IG51bVhGb3Jtc1BlcldHOworCQlrSW5mby5udW1fd29ya2l0ZW1zX3Blcl93
b3JrZ3JvdXAgPSBudW1Xb3JrSXRlbXNQZXJXRzsKKworCQlpbnRbXSBOID0gcmFkaXhBcnJheTsK
KwkJaW50IG1heFJhZGl4ID0gTlswXTsKKwkJaW50IGxNZW1TaXplID0gMDsKKworCQlpbnNlcnRW
YXJpYWJsZXMobG9jYWxTdHJpbmcsIG1heFJhZGl4KTsKKworCQlsTWVtU2l6ZSA9IGluc2VydEds
b2JhbExvYWRzQW5kVHJhbnNwb3NlKGxvY2FsU3RyaW5nLCBuLCBudW1Xb3JrSXRlbXNQZXJYRm9y
bSwgbnVtWEZvcm1zUGVyV0csIG1heFJhZGl4LCB0aGlzLm1pbl9tZW1fY29hbGVzY2Vfd2lkdGgs
IGRhdGFGb3JtYXQpOworCQlrSW5mby5sbWVtX3NpemUgPSAobE1lbVNpemUgPiBrSW5mby5sbWVt
X3NpemUpID8gbE1lbVNpemUgOiBrSW5mby5sbWVtX3NpemU7CisKKwkJU3RyaW5nIHhjb21wID0g
IngiOworCQlTdHJpbmcgeWNvbXAgPSAieSI7CisKKwkJaW50IE5wcmV2ID0gMTsKKwkJaW50IGxl
biA9IG47CisJCWludCByOworCQlmb3IgKHIgPSAwOyByIDwgbnVtUmFkaXg7IHIrKykgeworCQkJ
aW50IG51bUl0ZXIgPSBOWzBdIC8gTltyXTsKKwkJCWludCBudW1Xb3JrSXRlbXNSZXEgPSBuIC8g
TltyXTsKKwkJCWludCBOY3VyciA9IE5wcmV2ICogTltyXTsKKwkJCWluc2VydGZmdEtlcm5lbChs
b2NhbFN0cmluZywgTltyXSwgbnVtSXRlcik7CisKKwkJCWlmIChyIDwgKG51bVJhZGl4IC0gMSkp
IHsKKwkJCQlmZnRQYWRkaW5nIHBhZDsKKworCQkJCWluc2VydFR3aWRkbGVLZXJuZWwobG9jYWxT
dHJpbmcsIE5bcl0sIG51bUl0ZXIsIE5wcmV2LCBsZW4sIG51bVdvcmtJdGVtc1BlclhGb3JtKTsK
KwkJCQlwYWQgPSBnZXRQYWRkaW5nKG51bVdvcmtJdGVtc1BlclhGb3JtLCBOcHJldiwgbnVtV29y
a0l0ZW1zUmVxLCBudW1YRm9ybXNQZXJXRywgTltyXSwgdGhpcy5udW1fbG9jYWxfbWVtX2Jhbmtz
KTsKKwkJCQlrSW5mby5sbWVtX3NpemUgPSAocGFkLmxNZW1TaXplID4ga0luZm8ubG1lbV9zaXpl
KSA/IHBhZC5sTWVtU2l6ZSA6IGtJbmZvLmxtZW1fc2l6ZTsKKwkJCQlpbnNlcnRMb2NhbFN0b3Jl
SW5kZXhBcml0aG1hdGljKGxvY2FsU3RyaW5nLCBudW1Xb3JrSXRlbXNSZXEsIG51bVhGb3Jtc1Bl
cldHLCBOW3JdLCBwYWQub2Zmc2V0LCBwYWQubWlkUGFkKTsKKwkJCQlpbnNlcnRMb2NhbExvYWRJ
bmRleEFyaXRobWF0aWMobG9jYWxTdHJpbmcsIE5wcmV2LCBOW3JdLCBudW1Xb3JrSXRlbXNSZXEs
IG51bVdvcmtJdGVtc1BlclhGb3JtLCBudW1YRm9ybXNQZXJXRywgcGFkLm9mZnNldCwgcGFkLm1p
ZFBhZCk7CisJCQkJaW5zZXJ0TG9jYWxTdG9yZXMobG9jYWxTdHJpbmcsIG51bUl0ZXIsIE5bcl0s
IG51bVdvcmtJdGVtc1BlclhGb3JtLCBudW1Xb3JrSXRlbXNSZXEsIHBhZC5vZmZzZXQsIHhjb21w
KTsKKwkJCQlpbnNlcnRMb2NhbExvYWRzKGxvY2FsU3RyaW5nLCBuLCBOW3JdLCBOW3IgKyAxXSwg
TnByZXYsIE5jdXJyLCBudW1Xb3JrSXRlbXNQZXJYRm9ybSwgbnVtV29ya0l0ZW1zUmVxLCBwYWQu
b2Zmc2V0LCB4Y29tcCk7CisJCQkJaW5zZXJ0TG9jYWxTdG9yZXMobG9jYWxTdHJpbmcsIG51bUl0
ZXIsIE5bcl0sIG51bVdvcmtJdGVtc1BlclhGb3JtLCBudW1Xb3JrSXRlbXNSZXEsIHBhZC5vZmZz
ZXQsIHljb21wKTsKKwkJCQlpbnNlcnRMb2NhbExvYWRzKGxvY2FsU3RyaW5nLCBuLCBOW3JdLCBO
W3IgKyAxXSwgTnByZXYsIE5jdXJyLCBudW1Xb3JrSXRlbXNQZXJYRm9ybSwgbnVtV29ya0l0ZW1z
UmVxLCBwYWQub2Zmc2V0LCB5Y29tcCk7CisJCQkJTnByZXYgPSBOY3VycjsKKwkJCQlsZW4gPSBs
ZW4gLyBOW3JdOworCQkJfQorCQl9CisKKwkJbE1lbVNpemUgPSBpbnNlcnRHbG9iYWxTdG9yZXNB
bmRUcmFuc3Bvc2UobG9jYWxTdHJpbmcsIG4sIG1heFJhZGl4LCBOW251bVJhZGl4IC0gMV0sIG51
bVdvcmtJdGVtc1BlclhGb3JtLCBudW1YRm9ybXNQZXJXRywgdGhpcy5taW5fbWVtX2NvYWxlc2Nl
X3dpZHRoLCBkYXRhRm9ybWF0KTsKKwkJa0luZm8ubG1lbV9zaXplID0gKGxNZW1TaXplID4ga0lu
Zm8ubG1lbV9zaXplKSA/IGxNZW1TaXplIDoga0luZm8ubG1lbV9zaXplOworCisJCWluc2VydEhl
YWRlcihrZXJuZWxTdHJpbmcsIGtlcm5lbE5hbWUsIGRhdGFGb3JtYXQpOworCQlrZXJuZWxTdHJp
bmcuYXBwZW5kKCJ7XG4iKTsKKwkJaWYgKGtJbmZvLmxtZW1fc2l6ZSA+IDApIHsKKwkJCWtlcm5l
bFN0cmluZy5hcHBlbmQoIiAgICBfX2xvY2FsIGZsb2F0IHNNZW1bIikuYXBwZW5kKGtJbmZvLmxt
ZW1fc2l6ZSkuYXBwZW5kKCJdO1xuIik7CisJCX0KKwkJa2VybmVsU3RyaW5nLmFwcGVuZChsb2Nh
bFN0cmluZyk7CisJCWtlcm5lbFN0cmluZy5hcHBlbmQoIn1cbiIpOworCX0KKworLy8gRm9yIHNp
emUgbGFyZ2VyIHRoYW4gd2hhdCBjYW4gYmUgY29tcHV0ZWQgdXNpbmcgbG9jYWwgbWVtb3J5IGZm
dCwgZ2xvYmFsIHRyYW5zcG9zZXMKKy8vIG11bHRpcGxlIGtlcm5lbCBsYXVuY2VzIGlzIG5lZWRl
ZC4gRm9yIHRoZXNlIHNpemVzLCBzaXplIGNhbiBiZSBkZWNvbXBvc2VkIHVzaW5nCisvLyBtdWNo
IGxhcmdlciBiYXNlIHJhZGljZXMgaS5lLiBzYXkgc2l6ZSA9IDI2MjE0NCA9IDEyOCB4IDY0IHgg
MzIuIFRodXMgdGhyZWUga2VybmVsCisvLyBsYXVuY2hlcyB3aWxsIGJlIG5lZWRlZCwgZmlyc3Qg
Y29tcHV0aW5nIDY0IHggMzIsIGxlbmd0aCAxMjggZmZ0cywgc2Vjb25kIGNvbXB1dGluZworLy8g
MTI4IHggMzIgbGVuZ3RoIDY0IGZmdHMsIGFuZCBmaW5hbGx5IGEga2VybmVsIGNvbXB1dGluZyAx
MjggeCA2NCBsZW5ndGggMzIgZmZ0cy4KKy8vIEVhY2ggb2YgdGhlc2UgYmFzZSByYWRpY2VzIGNh
biBmdXRoZXIgYmUgZGl2aWRlZCBpbnRvIGZhY3RvcnMgc28gdGhhdCBlYWNoIG9mIHRoZXNlCisv
LyBiYXNlIGZmdHMgY2FuIGJlIGNvbXB1dGVkIHdpdGhpbiBvbmUga2VybmVsIGxhdW5jaCB1c2lu
ZyBpbi1yZWdpc3RlciBmZnRzIGFuZCBsb2NhbAorLy8gbWVtb3J5IHRyYW5zcG9zZXMgaS5lIGZv
ciB0aGUgZmlyc3Qga2VybmVsIGFib3ZlIHdoaWNoIGNvbXB1dGVzIDY0IHggMzIgZmZ0cyBvbiBs
ZW5ndGgKKy8vIDEyOCwgMTI4IGNhbiBiZSBkZWNvbXBvc2VkIGludG8gMTI4ID0gMTYgeCA4IGku
ZS4gOCB3b3JrIGl0ZW1zIGNhbiBjb21wdXRlIDggbGVuZ3RoCisvLyAxNiBmZnRzIGZvbGxvd2Vk
IGJ5IHRyYW5zcG9zZSB1c2luZyBsb2NhbCBtZW1vcnkgZm9sbG93ZWQgYnkgZWFjaCBvZiB0aGVz
ZSBlaWdodAorLy8gd29yayBpdGVtcyBjb21wdXRpbmcgMiBsZW5ndGggOCBmZnRzIHRodXMgY29t
cHV0aW5nIDE2IGxlbmd0aCA4IGZmdHMgaW4gdG90YWwuIFRoaXMKKy8vIG1lYW5zIG9ubHkgOCB3
b3JrIGl0ZW1zIGFyZSBuZWVkZWQgZm9yIGNvbXB1dGluZyBvbmUgbGVuZ3RoIDEyOCBmZnQuIElm
IHdlIGNob29zZQorLy8gd29yayBncm91cCBzaXplIG9mIHNheSA2NCwgd2UgY2FuIGNvbXB1dGUg
NjQvOCA9IDggbGVuZ3RoIDEyOCBmZnRzIHdpdGhpbiBvbmUKKy8vIHdvcmsgZ3JvdXAuIFNpbmNl
IHdlIG5lZWQgdG8gY29tcHV0ZSA2NCB4IDMyIGxlbmd0aCAxMjggZmZ0cyBpbiBmaXJzdCBrZXJu
ZWwsIHRoaXMKKy8vIG1lYW5zIHdlIG5lZWQgdG8gbGF1bmNoIDY0IHggMzIgLyA4ID0gMjU2IHdv
cmsgZ3JvdXBzIHdpdGggNjQgd29yayBpdGVtcyBpbiBlYWNoCisvLyB3b3JrIGdyb3VwIHdoZXJl
IGVhY2ggd29yayBncm91cCBpcyBjb21wdXRpbmcgOCBsZW5ndGggMTI4IGZmdHMgd2hlcmUgZWFj
aCBsZW5ndGgKKy8vIDEyOCBmZnQgaXMgY29tcHV0ZWQgYnkgOCB3b3JrIGl0ZW1zLiBTYW1lIGxv
Z2ljIGNhbiBiZSBhcHBsaWVkIHRvIG90aGVyIHR3byBrZXJuZWxzCisvLyBpbiB0aGlzIGV4YW1w
bGUuIFVzZXJzIGNhbiBwbGF5IHdpdGggZGlmZmVyZW5jZSBiYXNlIHJhZGljZXMgYW5kIGRpZmZl
cmVuY2UKKy8vIGRlY29tcG9zaXRpb25zIG9mIGJhc2UgcmFkaWNlcyB0byBnZW5lcmF0ZXMgZGlm
ZmVyZW50IGtlcm5lbHMgYW5kIHNlZSB3aGljaCBnaXZlcworLy8gYmVzdCBwZXJmb3JtYW5jZS4g
Rm9sbG93aW5nIGZ1bmN0aW9uIGlzIGp1c3QgZml4ZWQgdG8gdXNlIDEyOCBhcyBiYXNlIHJhZGl4
CisJaW50IGdldEdsb2JhbFJhZGl4SW5mbyhpbnQgbiwgaW50W10gcmFkaXgsIGludFtdIFIxLCBp
bnRbXSBSMikgeworCQlpbnQgYmFzZVJhZGl4ID0gTWF0aC5taW4obiwgMTI4KTsKKworCQlpbnQg
bnVtUiA9IDA7CisJCWludCBOID0gbjsKKwkJd2hpbGUgKE4gPiBiYXNlUmFkaXgpIHsKKwkJCU4g
Lz0gYmFzZVJhZGl4OworCQkJbnVtUisrOworCQl9CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBu
dW1SOyBpKyspIHsKKwkJCXJhZGl4W2ldID0gYmFzZVJhZGl4OworCQl9CisKKwkJcmFkaXhbbnVt
Ul0gPSBOOworCQludW1SKys7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SOyBpKyspIHsK
KwkJCWludCBCID0gcmFkaXhbaV07CisJCQlpZiAoQiA8PSA4KSB7CisJCQkJUjFbaV0gPSBCOwor
CQkJCVIyW2ldID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaW50IHIxID0gMjsKKwkJ
CWludCByMiA9IEIgLyByMTsKKwkJCXdoaWxlIChyMiA+IHIxKSB7CisJCQkJcjEgKj0gMjsKKwkJ
CQlyMiA9IEIgLyByMTsKKwkJCX0KKwkJCVIxW2ldID0gcjE7CisJCQlSMltpXSA9IHIyOworCQl9
CisJCXJldHVybiBudW1SOworCX0KKworCXZvaWQgY3JlYXRlR2xvYmFsRkZUS2VybmVsU3RyaW5n
KGludCBuLCBpbnQgQlMsIENMRkZUS2VybmVsRGlyIGRpciwgaW50IHZlcnRCUykgeworCQlpbnQg
aSwgaiwgaywgdDsKKwkJaW50W10gcmFkaXhBcnIgPSBuZXcgaW50WzEwXTsKKwkJaW50W10gUjFB
cnIgPSBuZXcgaW50WzEwXTsKKwkJaW50W10gUjJBcnIgPSBuZXcgaW50WzEwXTsKKwkJaW50IHJh
ZGl4LCBSMSwgUjI7CisJCWludCBudW1SYWRpY2VzOworCisJCWludCBtYXhUaHJlYWRzUGVyQmxv
Y2sgPSB0aGlzLm1heF93b3JrX2l0ZW1fcGVyX3dvcmtncm91cDsKKwkJaW50IG1heEFycmF5TGVu
ID0gdGhpcy5tYXhfcmFkaXg7CisJCWludCBiYXRjaFNpemUgPSB0aGlzLm1pbl9tZW1fY29hbGVz
Y2Vfd2lkdGg7CisJCUNMRkZURGF0YUZvcm1hdCBkYXRhRm9ybWF0ID0gdGhpcy5mb3JtYXQ7CisJ
CWJvb2xlYW4gdmVydGljYWwgPSAoZGlyID09IGRpci5YKSA/IGZhbHNlIDogdHJ1ZTsKKworCQlu
dW1SYWRpY2VzID0gZ2V0R2xvYmFsUmFkaXhJbmZvKG4sIHJhZGl4QXJyLCBSMUFyciwgUjJBcnIp
OworCisJCWludCBudW1QYXNzZXMgPSBudW1SYWRpY2VzOworCisJCVN0cmluZ0J1aWxkZXIgbG9j
YWxTdHJpbmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQlTdHJpbmcga2VybmVsTmFtZTsKKwkJ
U3RyaW5nQnVpbGRlciBrZXJuZWxTdHJpbmcgPSB0aGlzLmtlcm5lbF9zdHJpbmc7CisKKwkJaW50
IGtDb3VudCA9IGtlcm5lbF9saXN0LnNpemUoKTsKKwkJLy9jbF9mZnRfa2VybmVsX2luZm8gKipr
SW5mbyA9ICZ0aGlzLmtlcm5lbF9saXN0OworCQkvL2ludCBrQ291bnQgPSAwOworCisJCS8vd2hp
bGUoKmtJbmZvKQorCQkvL3sKKwkJLy8Ja0luZm8gPSAma0luZm8ubmV4dDsKKwkJLy8Ja0NvdW50
Kys7CisJCS8vfQorCisJCWludCBOID0gbjsKKwkJaW50IG0gPSAoaW50KSBsb2cyKG4pOworCQlp
bnQgUmluaXQgPSB2ZXJ0aWNhbCA/IEJTIDogMTsKKwkJYmF0Y2hTaXplID0gdmVydGljYWwgPyBN
YXRoLm1pbihCUywgYmF0Y2hTaXplKSA6IGJhdGNoU2l6ZTsKKwkJaW50IHBhc3NOdW07CisKKwkJ
Zm9yIChwYXNzTnVtID0gMDsgcGFzc051bSA8IG51bVBhc3NlczsgcGFzc051bSsrKSB7CisKKwkJ
CWxvY2FsU3RyaW5nLnNldExlbmd0aCgwKTsKKwkJCS8va2VybmVsTmFtZS5jbGVhcigpOworCisJ
CQlyYWRpeCA9IHJhZGl4QXJyW3Bhc3NOdW1dOworCQkJUjEgPSBSMUFycltwYXNzTnVtXTsKKwkJ
CVIyID0gUjJBcnJbcGFzc051bV07CisKKwkJCWludCBzdHJpZGVJID0gUmluaXQ7CisJCQlmb3Ig
KGkgPSAwOyBpIDwgbnVtUGFzc2VzOyBpKyspIHsKKwkJCQlpZiAoaSAhPSBwYXNzTnVtKSB7CisJ
CQkJCXN0cmlkZUkgKj0gcmFkaXhBcnJbaV07CisJCQkJfQorCQkJfQorCisJCQlpbnQgc3RyaWRl
TyA9IFJpbml0OworCQkJZm9yIChpID0gMDsgaSA8IHBhc3NOdW07IGkrKykgeworCQkJCXN0cmlk
ZU8gKj0gcmFkaXhBcnJbaV07CisJCQl9CisKKwkJCWludCB0aHJlYWRzUGVyWEZvcm0gPSBSMjsK
KwkJCWJhdGNoU2l6ZSA9IFIyID09IDEgPyB0aGlzLm1heF93b3JrX2l0ZW1fcGVyX3dvcmtncm91
cCA6IGJhdGNoU2l6ZTsKKwkJCWJhdGNoU2l6ZSA9IE1hdGgubWluKGJhdGNoU2l6ZSwgc3RyaWRl
SSk7CisJCQlpbnQgdGhyZWFkc1BlckJsb2NrID0gYmF0Y2hTaXplICogdGhyZWFkc1BlclhGb3Jt
OworCQkJdGhyZWFkc1BlckJsb2NrID0gTWF0aC5taW4odGhyZWFkc1BlckJsb2NrLCBtYXhUaHJl
YWRzUGVyQmxvY2spOworCQkJYmF0Y2hTaXplID0gdGhyZWFkc1BlckJsb2NrIC8gdGhyZWFkc1Bl
clhGb3JtOworCQkJYXNzZXJ0IChSMiA8PSBSMSk7CisJCQlhc3NlcnQgKFIxICogUjIgPT0gcmFk
aXgpOworCQkJYXNzZXJ0IChSMSA8PSBtYXhBcnJheUxlbik7CisJCQlhc3NlcnQgKHRocmVhZHNQ
ZXJCbG9jayA8PSBtYXhUaHJlYWRzUGVyQmxvY2spOworCisJCQlpbnQgbnVtSXRlciA9IFIxIC8g
UjI7CisJCQlpbnQgZ0luSW5jID0gdGhyZWFkc1BlckJsb2NrIC8gYmF0Y2hTaXplOworCisKKwkJ
CWludCBsZ1N0cmlkZU8gPSBsb2cyKHN0cmlkZU8pOworCQkJaW50IG51bUJsb2Nrc1BlclhGb3Jt
ID0gc3RyaWRlSSAvIGJhdGNoU2l6ZTsKKwkJCWludCBudW1CbG9ja3MgPSBudW1CbG9ja3NQZXJY
Rm9ybTsKKwkJCWlmICghdmVydGljYWwpIHsKKwkJCQludW1CbG9ja3MgKj0gQlM7CisJCQl9IGVs
c2UgeworCQkJCW51bUJsb2NrcyAqPSB2ZXJ0QlM7CisJCQl9CisKKwkJCWtlcm5lbE5hbWUgPSAi
ZmZ0IiArIChrQ291bnQpOworCQkJQ0xGRlRLZXJuZWxJbmZvIGtJbmZvID0gbmV3IENMRkZUS2Vy
bmVsSW5mbygpOworCQkJaWYgKFIyID09IDEpIHsKKwkJCQlrSW5mby5sbWVtX3NpemUgPSAwOwor
CQkJfSBlbHNlIHsKKwkJCQlpZiAoc3RyaWRlTyA9PSAxKSB7CisJCQkJCWtJbmZvLmxtZW1fc2l6
ZSA9IChyYWRpeCArIDEpICogYmF0Y2hTaXplOworCQkJCX0gZWxzZSB7CisJCQkJCWtJbmZvLmxt
ZW1fc2l6ZSA9IHRocmVhZHNQZXJCbG9jayAqIFIxOworCQkJCX0KKwkJCX0KKwkJCWtJbmZvLm51
bV93b3JrZ3JvdXBzID0gbnVtQmxvY2tzOworCQkJa0luZm8ubnVtX3hmb3Jtc19wZXJfd29ya2dy
b3VwID0gMTsKKwkJCWtJbmZvLm51bV93b3JraXRlbXNfcGVyX3dvcmtncm91cCA9IHRocmVhZHNQ
ZXJCbG9jazsKKwkJCWtJbmZvLmRpciA9IGRpcjsKKwkJCWtJbmZvLmluX3BsYWNlX3Bvc3NpYmxl
ID0gKChwYXNzTnVtID09IChudW1QYXNzZXMgLSAxKSkgJiYgKChudW1QYXNzZXMgJiAxKSAhPSAw
KSk7CisJCQkvL2tJbmZvLm5leHQgPSBOVUxMOworCQkJa0luZm8ua2VybmVsX25hbWUgPSBrZXJu
ZWxOYW1lOworCisJCQlpbnNlcnRWYXJpYWJsZXMobG9jYWxTdHJpbmcsIFIxKTsKKworCQkJaWYg
KHZlcnRpY2FsKSB7CisJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJ4TnVtID0gZ3JvdXBJZCA+PiAi
KS5hcHBlbmQoKGludCkgbG9nMihudW1CbG9ja3NQZXJYRm9ybSkpLmFwcGVuZCgiO1xuIik7CisJ
CQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJncm91cElkID0gZ3JvdXBJZCAmICIpLmFwcGVuZChudW1C
bG9ja3NQZXJYRm9ybSAtIDEpLmFwcGVuZCgiO1xuIik7CisJCQkJbG9jYWxTdHJpbmcuYXBwZW5k
KCJpbmRleEluID0gbWFkMjQoZ3JvdXBJZCwgIikuYXBwZW5kKGJhdGNoU2l6ZSkuYXBwZW5kKCIs
IHhOdW0gPDwgIikuYXBwZW5kKChpbnQpIGxvZzIobiAqIEJTKSkuYXBwZW5kKCIpO1xuIik7CisJ
CQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJ0aWQgPSBtdWwyNChncm91cElkLCAiKS5hcHBlbmQoYmF0
Y2hTaXplKS5hcHBlbmQoIik7XG4iKTsKKwkJCQlsb2NhbFN0cmluZy5hcHBlbmQoImkgPSB0aWQg
Pj4gIikuYXBwZW5kKGxnU3RyaWRlTykuYXBwZW5kKCI7XG4iKTsKKwkJCQlsb2NhbFN0cmluZy5h
cHBlbmQoImogPSB0aWQgJiAiKS5hcHBlbmQoc3RyaWRlTyAtIDEpLmFwcGVuZCgiO1xuIik7CisJ
CQkJaW50IHN0cmlkZSA9IHJhZGl4ICogUmluaXQ7CisJCQkJZm9yIChpID0gMDsgaSA8IHBhc3NO
dW07IGkrKykgeworCQkJCQlzdHJpZGUgKj0gcmFkaXhBcnJbaV07CisJCQkJfQorCQkJCWxvY2Fs
U3RyaW5nLmFwcGVuZCgiaW5kZXhPdXQgPSBtYWQyNChpLCAiKS5hcHBlbmQoc3RyaWRlKS5hcHBl
bmQoIiwgaiArICIpLmFwcGVuZCgiKHhOdW0gPDwgIikuYXBwZW5kKChpbnQpIGxvZzIobiAqIEJT
KSkuYXBwZW5kKCIpKTtcbiIpOworCQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiYk51bSA9IGdyb3Vw
SWQ7XG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IGxnTnVtQmxvY2tzUGVyWEZvcm0gPSBsb2cy
KG51bUJsb2Nrc1BlclhGb3JtKTsKKwkJCQlsb2NhbFN0cmluZy5hcHBlbmQoImJOdW0gPSBncm91
cElkICYgIikuYXBwZW5kKG51bUJsb2Nrc1BlclhGb3JtIC0gMSkuYXBwZW5kKCI7XG4iKTsKKwkJ
CQlsb2NhbFN0cmluZy5hcHBlbmQoInhOdW0gPSBncm91cElkID4+ICIpLmFwcGVuZChsZ051bUJs
b2Nrc1BlclhGb3JtKS5hcHBlbmQoIjtcbiIpOworCQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiaW5k
ZXhJbiA9IG11bDI0KGJOdW0sICIpLmFwcGVuZChiYXRjaFNpemUpLmFwcGVuZCgiKTtcbiIpOwor
CQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgidGlkID0gaW5kZXhJbjtcbiIpOworCQkJCWxvY2FsU3Ry
aW5nLmFwcGVuZCgiaSA9IHRpZCA+PiAiKS5hcHBlbmQobGdTdHJpZGVPKS5hcHBlbmQoIjtcbiIp
OworCQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiaiA9IHRpZCAmICIpLmFwcGVuZChzdHJpZGVPIC0g
MSkuYXBwZW5kKCI7XG4iKTsKKwkJCQlpbnQgc3RyaWRlID0gcmFkaXggKiBSaW5pdDsKKwkJCQlm
b3IgKGkgPSAwOyBpIDwgcGFzc051bTsgaSsrKSB7CisJCQkJCXN0cmlkZSAqPSByYWRpeEFycltp
XTsKKwkJCQl9CisJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJpbmRleE91dCA9IG1hZDI0KGksICIp
LmFwcGVuZChzdHJpZGUpLmFwcGVuZCgiLCBqKTtcbiIpOworCQkJCWxvY2FsU3RyaW5nLmFwcGVu
ZCgiaW5kZXhJbiArPSAoeE51bSA8PCAiKS5hcHBlbmQobSkuYXBwZW5kKCIpO1xuIik7CisJCQkJ
bG9jYWxTdHJpbmcuYXBwZW5kKCJpbmRleE91dCArPSAoeE51bSA8PCAiKS5hcHBlbmQobSkuYXBw
ZW5kKCIpO1xuIik7CisJCQl9CisKKwkJCS8vIExvYWQgRGF0YQorCQkJaW50IGxnQmF0Y2hTaXpl
ID0gbG9nMihiYXRjaFNpemUpOworCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJ0aWQgPSBsSWQ7XG4i
KTsKKwkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiaSA9IHRpZCAmICIpLmFwcGVuZChiYXRjaFNpemUg
LSAxKS5hcHBlbmQoIjtcbiIpOworCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJqID0gdGlkID4+ICIp
LmFwcGVuZChsZ0JhdGNoU2l6ZSkuYXBwZW5kKCI7XG4iKTsKKwkJCWxvY2FsU3RyaW5nLmFwcGVu
ZCgiaW5kZXhJbiArPSBtYWQyNChqLCAiKS5hcHBlbmQoc3RyaWRlSSkuYXBwZW5kKCIsIGkpO1xu
Iik7CisKKwkJCWlmIChkYXRhRm9ybWF0ID09IGRhdGFGb3JtYXQuU3BsaXRDb21wbGV4Rm9ybWF0
KSB7CisJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJpbl9yZWFsICs9IGluZGV4SW47XG4iKTsKKwkJ
CQlsb2NhbFN0cmluZy5hcHBlbmQoImluX2ltYWcgKz0gaW5kZXhJbjtcbiIpOworCQkJCWZvciAo
aiA9IDA7IGogPCBSMTsgaisrKSB7CisJCQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiYVsiKS5hcHBl
bmQoaikuYXBwZW5kKCJdLnggPSBpbl9yZWFsWyIpLmFwcGVuZChqICogZ0luSW5jICogc3RyaWRl
SSkuYXBwZW5kKCJdO1xuIik7CisJCQkJfQorCQkJCWZvciAoaiA9IDA7IGogPCBSMTsgaisrKSB7
CisJCQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiYVsiKS5hcHBlbmQoaikuYXBwZW5kKCJdLnkgPSBp
bl9pbWFnWyIpLmFwcGVuZChqICogZ0luSW5jICogc3RyaWRlSSkuYXBwZW5kKCJdO1xuIik7CisJ
CQkJfQorCQkJfSBlbHNlIHsKKwkJCQlsb2NhbFN0cmluZy5hcHBlbmQoImluICs9IGluZGV4SW47
XG4iKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgUjE7IGorKykgeworCQkJCQlsb2NhbFN0cmluZy5h
cHBlbmQoImFbIikuYXBwZW5kKGopLmFwcGVuZCgiXSA9IGluWyIpLmFwcGVuZChqICogZ0luSW5j
ICogc3RyaWRlSSkuYXBwZW5kKCJdO1xuIik7CisJCQkJfQorCQkJfQorCisJCQlsb2NhbFN0cmlu
Zy5hcHBlbmQoImZmdEtlcm5lbCIpLmFwcGVuZChSMSkuYXBwZW5kKCIoYSwgZGlyKTtcbiIpOwor
CisJCQlpZiAoUjIgPiAxKSB7CisJCQkJLy8gdHdpZGRsZQorCQkJCWZvciAoayA9IDE7IGsgPCBS
MTsgaysrKSB7CisJCQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiYW5nID0gZGlyKigyLjBmKk1fUEkq
IikuYXBwZW5kKGspLmFwcGVuZCgiLyIpLmFwcGVuZChyYWRpeCkuYXBwZW5kKCIpKmo7XG4iKTsK
KwkJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJ3ID0gKGZsb2F0MikobmF0aXZlX2NvcyhhbmcpLCBu
YXRpdmVfc2luKGFuZykpO1xuIik7CisJCQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiYVsiKS5hcHBl
bmQoaykuYXBwZW5kKCJdID0gY29tcGxleE11bChhWyIpLmFwcGVuZChrKS5hcHBlbmQoIl0sIHcp
O1xuIik7CisJCQkJfQorCisJCQkJLy8gc2h1ZmZsZQorCQkJCW51bUl0ZXIgPSBSMSAvIFIyOwor
CQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiaW5kZXhJbiA9IG1hZDI0KGosICIpLmFwcGVuZCh0aHJl
YWRzUGVyQmxvY2sgKiBudW1JdGVyKS5hcHBlbmQoIiwgaSk7XG4iKTsKKwkJCQlsb2NhbFN0cmlu
Zy5hcHBlbmQoImxNZW1TdG9yZSA9IHNNZW0gKyB0aWQ7XG4iKTsKKwkJCQlsb2NhbFN0cmluZy5h
cHBlbmQoImxNZW1Mb2FkID0gc01lbSArIGluZGV4SW47XG4iKTsKKwkJCQlmb3IgKGsgPSAwOyBr
IDwgUjE7IGsrKykgeworCQkJCQlsb2NhbFN0cmluZy5hcHBlbmQoImxNZW1TdG9yZVsiKS5hcHBl
bmQoayAqIHRocmVhZHNQZXJCbG9jaykuYXBwZW5kKCJdID0gYVsiKS5hcHBlbmQoaykuYXBwZW5k
KCJdLng7XG4iKTsKKwkJCQl9CisJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJiYXJyaWVyKENMS19M
T0NBTF9NRU1fRkVOQ0UpO1xuIik7CisJCQkJZm9yIChrID0gMDsgayA8IG51bUl0ZXI7IGsrKykg
eworCQkJCQlmb3IgKHQgPSAwOyB0IDwgUjI7IHQrKykgeworCQkJCQkJbG9jYWxTdHJpbmcuYXBw
ZW5kKCJhWyIpLmFwcGVuZChrICogUjIgKyB0KS5hcHBlbmQoIl0ueCA9IGxNZW1Mb2FkWyIpLmFw
cGVuZCh0ICogYmF0Y2hTaXplICsgayAqIHRocmVhZHNQZXJCbG9jaykuYXBwZW5kKCJdO1xuIik7
CisJCQkJCX0KKwkJCQl9CisJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJiYXJyaWVyKENMS19MT0NB
TF9NRU1fRkVOQ0UpO1xuIik7CisJCQkJZm9yIChrID0gMDsgayA8IFIxOyBrKyspIHsKKwkJCQkJ
bG9jYWxTdHJpbmcuYXBwZW5kKCJsTWVtU3RvcmVbIikuYXBwZW5kKGsgKiB0aHJlYWRzUGVyQmxv
Y2spLmFwcGVuZCgiXSA9IGFbIikuYXBwZW5kKGspLmFwcGVuZCgiXS55O1xuIik7CisJCQkJfQor
CQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiYmFycmllcihDTEtfTE9DQUxfTUVNX0ZFTkNFKTtcbiIp
OworCQkJCWZvciAoayA9IDA7IGsgPCBudW1JdGVyOyBrKyspIHsKKwkJCQkJZm9yICh0ID0gMDsg
dCA8IFIyOyB0KyspIHsKKwkJCQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiYVsiKS5hcHBlbmQoayAq
IFIyICsgdCkuYXBwZW5kKCJdLnkgPSBsTWVtTG9hZFsiKS5hcHBlbmQodCAqIGJhdGNoU2l6ZSAr
IGsgKiB0aHJlYWRzUGVyQmxvY2spLmFwcGVuZCgiXTtcbiIpOworCQkJCQl9CisJCQkJfQorCQkJ
CWxvY2FsU3RyaW5nLmFwcGVuZCgiYmFycmllcihDTEtfTE9DQUxfTUVNX0ZFTkNFKTtcbiIpOwor
CisJCQkJZm9yIChqID0gMDsgaiA8IG51bUl0ZXI7IGorKykgeworCQkJCQlsb2NhbFN0cmluZy5h
cHBlbmQoImZmdEtlcm5lbCIpLmFwcGVuZChSMikuYXBwZW5kKCIoYSArICIpLmFwcGVuZChqICog
UjIpLmFwcGVuZCgiLCBkaXIpO1xuIik7CisJCQkJfQorCQkJfQorCisJCQkvLyB0d2lkZGxlCisJ
CQlpZiAocGFzc051bSA8IChudW1QYXNzZXMgLSAxKSkgeworCQkJCWxvY2FsU3RyaW5nLmFwcGVu
ZCgibCA9ICgoYk51bSA8PCAiKS5hcHBlbmQobGdCYXRjaFNpemUpLmFwcGVuZCgiKSArIGkpID4+
ICIpLmFwcGVuZChsZ1N0cmlkZU8pLmFwcGVuZCgiO1xuIik7CisJCQkJbG9jYWxTdHJpbmcuYXBw
ZW5kKCJrID0gaiA8PCAiKS5hcHBlbmQoKGludCkgbG9nMihSMSAvIFIyKSkuYXBwZW5kKCI7XG4i
KTsKKwkJCQlsb2NhbFN0cmluZy5hcHBlbmQoImFuZzEgPSBkaXIqKDIuMGYqTV9QSS8iKS5hcHBl
bmQoTikuYXBwZW5kKCIpKmw7XG4iKTsKKwkJCQlmb3IgKHQgPSAwOyB0IDwgUjE7IHQrKykgewor
CQkJCQlsb2NhbFN0cmluZy5hcHBlbmQoImFuZyA9IGFuZzEqKGsgKyAiKS5hcHBlbmQoKHQgJSBS
MikgKiBSMSArICh0IC8gUjIpKS5hcHBlbmQoIik7XG4iKTsKKwkJCQkJbG9jYWxTdHJpbmcuYXBw
ZW5kKCJ3ID0gKGZsb2F0MikobmF0aXZlX2NvcyhhbmcpLCBuYXRpdmVfc2luKGFuZykpO1xuIik7
CisJCQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiYVsiKS5hcHBlbmQodCkuYXBwZW5kKCJdID0gY29t
cGxleE11bChhWyIpLmFwcGVuZCh0KS5hcHBlbmQoIl0sIHcpO1xuIik7CisJCQkJfQorCQkJfQor
CisJCQkvLyBTdG9yZSBEYXRhCisJCQlpZiAoc3RyaWRlTyA9PSAxKSB7CisKKwkJCQlsb2NhbFN0
cmluZy5hcHBlbmQoImxNZW1TdG9yZSA9IHNNZW0gKyBtYWQyNChpLCAiKS5hcHBlbmQocmFkaXgg
KyAxKS5hcHBlbmQoIiwgaiA8PCAiKS5hcHBlbmQoKGludCkgbG9nMihSMSAvIFIyKSkuYXBwZW5k
KCIpO1xuIik7CisJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJsTWVtTG9hZCA9IHNNZW0gKyBtYWQy
NCh0aWQgPj4gIikuYXBwZW5kKChpbnQpIGxvZzIocmFkaXgpKS5hcHBlbmQoIiwgIikuYXBwZW5k
KHJhZGl4ICsgMSkuYXBwZW5kKCIsIHRpZCAmICIpLmFwcGVuZChyYWRpeCAtIDEpLmFwcGVuZCgi
KTtcbiIpOworCisJCQkJZm9yIChpID0gMDsgaSA8IFIxIC8gUjI7IGkrKykgeworCQkJCQlmb3Ig
KGogPSAwOyBqIDwgUjI7IGorKykgeworCQkJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJsTWVtU3Rv
cmVbICIpLmFwcGVuZChpICsgaiAqIFIxKS5hcHBlbmQoIl0gPSBhWyIpLmFwcGVuZChpICogUjIg
KyBqKS5hcHBlbmQoIl0ueDtcbiIpOworCQkJCQl9CisJCQkJfQorCQkJCWxvY2FsU3RyaW5nLmFw
cGVuZCgiYmFycmllcihDTEtfTE9DQUxfTUVNX0ZFTkNFKTtcbiIpOworCQkJCWlmICh0aHJlYWRz
UGVyQmxvY2sgPj0gcmFkaXgpIHsKKwkJCQkJZm9yIChpID0gMDsgaSA8IFIxOyBpKyspIHsKKwkJ
CQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgiYVsiKS5hcHBlbmQoaSkuYXBwZW5kKCJdLnggPSBsTWVt
TG9hZFsiKS5hcHBlbmQoaSAqIChyYWRpeCArIDEpICogKHRocmVhZHNQZXJCbG9jayAvIHJhZGl4
KSkuYXBwZW5kKCJdO1xuIik7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgaW5uZXJJ
dGVyID0gcmFkaXggLyB0aHJlYWRzUGVyQmxvY2s7CisJCQkJCWludCBvdXRlckl0ZXIgPSBSMSAv
IGlubmVySXRlcjsKKwkJCQkJZm9yIChpID0gMDsgaSA8IG91dGVySXRlcjsgaSsrKSB7CisJCQkJ
CQlmb3IgKGogPSAwOyBqIDwgaW5uZXJJdGVyOyBqKyspIHsKKwkJCQkJCQlsb2NhbFN0cmluZy5h
cHBlbmQoImFbIikuYXBwZW5kKGkgKiBpbm5lckl0ZXIgKyBqKS5hcHBlbmQoIl0ueCA9IGxNZW1M
b2FkWyIpLmFwcGVuZChqICogdGhyZWFkc1BlckJsb2NrICsgaSAqIChyYWRpeCArIDEpKS5hcHBl
bmQoIl07XG4iKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlsb2NhbFN0cmluZy5hcHBl
bmQoImJhcnJpZXIoQ0xLX0xPQ0FMX01FTV9GRU5DRSk7XG4iKTsKKworCQkJCWZvciAoaSA9IDA7
IGkgPCBSMSAvIFIyOyBpKyspIHsKKwkJCQkJZm9yIChqID0gMDsgaiA8IFIyOyBqKyspIHsKKwkJ
CQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgibE1lbVN0b3JlWyAiKS5hcHBlbmQoaSArIGogKiBSMSku
YXBwZW5kKCJdID0gYVsiKS5hcHBlbmQoaSAqIFIyICsgaikuYXBwZW5kKCJdLnk7XG4iKTsKKwkJ
CQkJfQorCQkJCX0KKwkJCQlsb2NhbFN0cmluZy5hcHBlbmQoImJhcnJpZXIoQ0xLX0xPQ0FMX01F
TV9GRU5DRSk7XG4iKTsKKwkJCQlpZiAodGhyZWFkc1BlckJsb2NrID49IHJhZGl4KSB7CisJCQkJ
CWZvciAoaSA9IDA7IGkgPCBSMTsgaSsrKSB7CisJCQkJCQlsb2NhbFN0cmluZy5hcHBlbmQoImFb
IikuYXBwZW5kKGkpLmFwcGVuZCgiXS55ID0gbE1lbUxvYWRbIikuYXBwZW5kKGkgKiAocmFkaXgg
KyAxKSAqICh0aHJlYWRzUGVyQmxvY2sgLyByYWRpeCkpLmFwcGVuZCgiXTtcbiIpOworCQkJCQl9
CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IGlubmVySXRlciA9IHJhZGl4IC8gdGhyZWFkc1BlckJs
b2NrOworCQkJCQlpbnQgb3V0ZXJJdGVyID0gUjEgLyBpbm5lckl0ZXI7CisJCQkJCWZvciAoaSA9
IDA7IGkgPCBvdXRlckl0ZXI7IGkrKykgeworCQkJCQkJZm9yIChqID0gMDsgaiA8IGlubmVySXRl
cjsgaisrKSB7CisJCQkJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJhWyIpLmFwcGVuZChpICogaW5u
ZXJJdGVyICsgaikuYXBwZW5kKCJdLnkgPSBsTWVtTG9hZFsiKS5hcHBlbmQoaiAqIHRocmVhZHNQ
ZXJCbG9jayArIGkgKiAocmFkaXggKyAxKSkuYXBwZW5kKCJdO1xuIik7CisJCQkJCQl9CisJCQkJ
CX0KKwkJCQl9CisJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJiYXJyaWVyKENMS19MT0NBTF9NRU1f
RkVOQ0UpO1xuIik7CisKKwkJCQlsb2NhbFN0cmluZy5hcHBlbmQoImluZGV4T3V0ICs9IHRpZDtc
biIpOworCQkJCWlmIChkYXRhRm9ybWF0ID09IGRhdGFGb3JtYXQuU3BsaXRDb21wbGV4Rm9ybWF0
KSB7CisJCQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgib3V0X3JlYWwgKz0gaW5kZXhPdXQ7XG4iKTsK
KwkJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJvdXRfaW1hZyArPSBpbmRleE91dDtcbiIpOworCQkJ
CQlmb3IgKGsgPSAwOyBrIDwgUjE7IGsrKykgeworCQkJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJv
dXRfcmVhbFsiKS5hcHBlbmQoayAqIHRocmVhZHNQZXJCbG9jaykuYXBwZW5kKCJdID0gYVsiKS5h
cHBlbmQoaykuYXBwZW5kKCJdLng7XG4iKTsKKwkJCQkJfQorCQkJCQlmb3IgKGsgPSAwOyBrIDwg
UjE7IGsrKykgeworCQkJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJvdXRfaW1hZ1siKS5hcHBlbmQo
ayAqIHRocmVhZHNQZXJCbG9jaykuYXBwZW5kKCJdID0gYVsiKS5hcHBlbmQoaykuYXBwZW5kKCJd
Lnk7XG4iKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgi
b3V0ICs9IGluZGV4T3V0O1xuIik7CisJCQkJCWZvciAoayA9IDA7IGsgPCBSMTsgaysrKSB7CisJ
CQkJCQlsb2NhbFN0cmluZy5hcHBlbmQoIm91dFsiKS5hcHBlbmQoayAqIHRocmVhZHNQZXJCbG9j
aykuYXBwZW5kKCJdID0gYVsiKS5hcHBlbmQoaykuYXBwZW5kKCJdO1xuIik7CisJCQkJCX0KKwkJ
CQl9CisKKwkJCX0gZWxzZSB7CisJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJpbmRleE91dCArPSBt
YWQyNChqLCAiKS5hcHBlbmQobnVtSXRlciAqIHN0cmlkZU8pLmFwcGVuZCgiLCBpKTtcbiIpOwor
CQkJCWlmIChkYXRhRm9ybWF0ID09IGRhdGFGb3JtYXQuU3BsaXRDb21wbGV4Rm9ybWF0KSB7CisJ
CQkJCWxvY2FsU3RyaW5nLmFwcGVuZCgib3V0X3JlYWwgKz0gaW5kZXhPdXQ7XG4iKTsKKwkJCQkJ
bG9jYWxTdHJpbmcuYXBwZW5kKCJvdXRfaW1hZyArPSBpbmRleE91dDtcbiIpOworCQkJCQlmb3Ig
KGsgPSAwOyBrIDwgUjE7IGsrKykgeworCQkJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJvdXRfcmVh
bFsiKS5hcHBlbmQoKChrICUgUjIpICogUjEgKyAoayAvIFIyKSkgKiBzdHJpZGVPKS5hcHBlbmQo
Il0gPSBhWyIpLmFwcGVuZChrKS5hcHBlbmQoIl0ueDtcbiIpOworCQkJCQl9CisJCQkJCWZvciAo
ayA9IDA7IGsgPCBSMTsgaysrKSB7CisJCQkJCQlsb2NhbFN0cmluZy5hcHBlbmQoIm91dF9pbWFn
WyIpLmFwcGVuZCgoKGsgJSBSMikgKiBSMSArIChrIC8gUjIpKSAqIHN0cmlkZU8pLmFwcGVuZCgi
XSA9IGFbIikuYXBwZW5kKGspLmFwcGVuZCgiXS55O1xuIik7CisJCQkJCX0KKwkJCQl9IGVsc2Ug
eworCQkJCQlsb2NhbFN0cmluZy5hcHBlbmQoIm91dCArPSBpbmRleE91dDtcbiIpOworCQkJCQlm
b3IgKGsgPSAwOyBrIDwgUjE7IGsrKykgeworCQkJCQkJbG9jYWxTdHJpbmcuYXBwZW5kKCJvdXRb
IikuYXBwZW5kKCgoayAlIFIyKSAqIFIxICsgKGsgLyBSMikpICogc3RyaWRlTykuYXBwZW5kKCJd
ID0gYVsiKS5hcHBlbmQoaykuYXBwZW5kKCJdO1xuIik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisK
KwkJCWluc2VydEhlYWRlcihrZXJuZWxTdHJpbmcsIGtlcm5lbE5hbWUsIGRhdGFGb3JtYXQpOwor
CQkJa2VybmVsU3RyaW5nLmFwcGVuZCgie1xuIik7CisJCQlpZiAoa0luZm8ubG1lbV9zaXplID4g
MCkgeworCQkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIiAgICBfX2xvY2FsIGZsb2F0IHNNZW1bIiku
YXBwZW5kKGtJbmZvLmxtZW1fc2l6ZSkuYXBwZW5kKCJdO1xuIik7CisJCQl9CisJCQlrZXJuZWxT
dHJpbmcuYXBwZW5kKGxvY2FsU3RyaW5nKTsKKwkJCWtlcm5lbFN0cmluZy5hcHBlbmQoIn1cbiIp
OworCisJCQlOIC89IHJhZGl4OworCQkJa2VybmVsX2xpc3QuYWRkKGtJbmZvKTsKKwkJCWtDb3Vu
dCsrOworCQl9CisJfQorCisJdm9pZCBGRlQxRChDTEZGVEtlcm5lbERpciBkaXIpIHsKKwkJaW50
W10gcmFkaXhBcnJheSA9IG5ldyBpbnRbMTBdOworCisJCXN3aXRjaCAoZGlyKSB7CisJCQljYXNl
IFg6CisJCQkJaWYgKHRoaXMuc2l6ZS54ID4gdGhpcy5tYXhfbG9jYWxtZW1fZmZ0X3NpemUpIHsK
KwkJCQkJY3JlYXRlR2xvYmFsRkZUS2VybmVsU3RyaW5nKHRoaXMuc2l6ZS54LCAxLCBkaXIsIDEp
OworCQkJCX0gZWxzZSBpZiAodGhpcy5zaXplLnggPiAxKSB7CisJCQkJCWdldFJhZGl4QXJyYXko
dGhpcy5zaXplLngsIHJhZGl4QXJyYXksIDApOworCQkJCQlpZiAodGhpcy5zaXplLnggLyByYWRp
eEFycmF5WzBdIDw9IHRoaXMubWF4X3dvcmtfaXRlbV9wZXJfd29ya2dyb3VwKSB7CisJCQkJCQlj
cmVhdGVMb2NhbE1lbWZmdEtlcm5lbFN0cmluZygpOworCQkJCQl9IGVsc2UgeworCQkJCQkJZ2V0
UmFkaXhBcnJheSh0aGlzLnNpemUueCwgcmFkaXhBcnJheSwgdGhpcy5tYXhfcmFkaXgpOworCQkJ
CQkJaWYgKHRoaXMuc2l6ZS54IC8gcmFkaXhBcnJheVswXSA8PSB0aGlzLm1heF93b3JrX2l0ZW1f
cGVyX3dvcmtncm91cCkgeworCQkJCQkJCWNyZWF0ZUxvY2FsTWVtZmZ0S2VybmVsU3RyaW5nKCk7
CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNyZWF0ZUdsb2JhbEZGVEtlcm5lbFN0cmluZyh0aGlz
LnNpemUueCwgMSwgZGlyLCAxKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsK
KworCQkJY2FzZSBZOgorCQkJCWlmICh0aGlzLnNpemUueSA+IDEpIHsKKwkJCQkJY3JlYXRlR2xv
YmFsRkZUS2VybmVsU3RyaW5nKHRoaXMuc2l6ZS55LCB0aGlzLnNpemUueCwgZGlyLCAxKTsKKwkJ
CQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgWjoKKwkJCQlpZiAodGhpcy5zaXplLnogPiAxKSB7
CisJCQkJCWNyZWF0ZUdsb2JhbEZGVEtlcm5lbFN0cmluZyh0aGlzLnNpemUueiwgdGhpcy5zaXpl
LnggKiB0aGlzLnNpemUueSwgZGlyLCAxKTsKKwkJCQl9CisJCQlkZWZhdWx0OgorCQkJCXJldHVy
bjsKKwkJfQorCX0KKworCS8qCisJICoKKwkgKiBQcmUtZGVmaW5lZCBrZXJuZWwgcGFydHMKKwkg
KgorCSAqLworCXN0YXRpYyBTdHJpbmcgYmFzZUtlcm5lbHMgPQorCQkJIiNpZm5kZWYgTV9QSVxu
IgorCQkJKyAiI2RlZmluZSBNX1BJIDB4MS45MjFmYjU0NDQyZDE4cCsxXG4iCisJCQkrICIjZW5k
aWZcbiIKKwkJCSsgIiNkZWZpbmUgY29tcGxleE11bChhLGIpICgoZmxvYXQyKShtYWQoLShhKS55
LCAoYikueSwgKGEpLnggKiAoYikueCksIG1hZCgoYSkueSwgKGIpLngsIChhKS54ICogKGIpLnkp
KSlcbiIKKwkJCSsgIiNkZWZpbmUgY29uaihhKSAoKGZsb2F0MikoKGEpLngsIC0oYSkueSkpXG4i
CisJCQkrICIjZGVmaW5lIGNvbmpUcmFuc3AoYSkgKChmbG9hdDIpKC0oYSkueSwgKGEpLngpKVxu
IgorCQkJKyAiXG4iCisJCQkrICIjZGVmaW5lIGZmdEtlcm5lbDIoYSxkaXIpIFxcXG4iCisJCQkr
ICJ7IFxcXG4iCisJCQkrICIgICAgZmxvYXQyIGMgPSAoYSlbMF07ICAgIFxcXG4iCisJCQkrICIg
ICAgKGEpWzBdID0gYyArIChhKVsxXTsgIFxcXG4iCisJCQkrICIgICAgKGEpWzFdID0gYyAtIChh
KVsxXTsgIFxcXG4iCisJCQkrICJ9XG4iCisJCQkrICJcbiIKKwkJCSsgIiNkZWZpbmUgZmZ0S2Vy
bmVsMlMoZDEsZDIsZGlyKSBcXFxuIgorCQkJKyAieyBcXFxuIgorCQkJKyAiICAgIGZsb2F0MiBj
ID0gKGQxKTsgICBcXFxuIgorCQkJKyAiICAgIChkMSkgPSBjICsgKGQyKTsgICBcXFxuIgorCQkJ
KyAiICAgIChkMikgPSBjIC0gKGQyKTsgICBcXFxuIgorCQkJKyAifVxuIgorCQkJKyAiXG4iCisJ
CQkrICIjZGVmaW5lIGZmdEtlcm5lbDQoYSxkaXIpIFxcXG4iCisJCQkrICJ7IFxcXG4iCisJCQkr
ICIgICAgZmZ0S2VybmVsMlMoKGEpWzBdLCAoYSlbMl0sIGRpcik7IFxcXG4iCisJCQkrICIgICAg
ZmZ0S2VybmVsMlMoKGEpWzFdLCAoYSlbM10sIGRpcik7IFxcXG4iCisJCQkrICIgICAgZmZ0S2Vy
bmVsMlMoKGEpWzBdLCAoYSlbMV0sIGRpcik7IFxcXG4iCisJCQkrICIgICAgKGEpWzNdID0gKGZs
b2F0MikoZGlyKSooY29ualRyYW5zcCgoYSlbM10pKTsgXFxcbiIKKwkJCSsgIiAgICBmZnRLZXJu
ZWwyUygoYSlbMl0sIChhKVszXSwgZGlyKTsgXFxcbiIKKwkJCSsgIiAgICBmbG9hdDIgYyA9IChh
KVsxXTsgXFxcbiIKKwkJCSsgIiAgICAoYSlbMV0gPSAoYSlbMl07IFxcXG4iCisJCQkrICIgICAg
KGEpWzJdID0gYzsgXFxcbiIKKwkJCSsgIn1cbiIKKwkJCSsgIlxuIgorCQkJKyAiI2RlZmluZSBm
ZnRLZXJuZWw0cyhhMCxhMSxhMixhMyxkaXIpIFxcXG4iCisJCQkrICJ7IFxcXG4iCisJCQkrICIg
ICAgZmZ0S2VybmVsMlMoKGEwKSwgKGEyKSwgZGlyKTsgXFxcbiIKKwkJCSsgIiAgICBmZnRLZXJu
ZWwyUygoYTEpLCAoYTMpLCBkaXIpOyBcXFxuIgorCQkJKyAiICAgIGZmdEtlcm5lbDJTKChhMCks
IChhMSksIGRpcik7IFxcXG4iCisJCQkrICIgICAgKGEzKSA9IChmbG9hdDIpKGRpcikqKGNvbmpU
cmFuc3AoKGEzKSkpOyBcXFxuIgorCQkJKyAiICAgIGZmdEtlcm5lbDJTKChhMiksIChhMyksIGRp
cik7IFxcXG4iCisJCQkrICIgICAgZmxvYXQyIGMgPSAoYTEpOyBcXFxuIgorCQkJKyAiICAgIChh
MSkgPSAoYTIpOyBcXFxuIgorCQkJKyAiICAgIChhMikgPSBjOyBcXFxuIgorCQkJKyAifVxuIgor
CQkJKyAiXG4iCisJCQkrICIjZGVmaW5lIGJpdHJldmVyc2U4KGEpIFxcXG4iCisJCQkrICJ7IFxc
XG4iCisJCQkrICIgICAgZmxvYXQyIGM7IFxcXG4iCisJCQkrICIgICAgYyA9IChhKVsxXTsgXFxc
biIKKwkJCSsgIiAgICAoYSlbMV0gPSAoYSlbNF07IFxcXG4iCisJCQkrICIgICAgKGEpWzRdID0g
YzsgXFxcbiIKKwkJCSsgIiAgICBjID0gKGEpWzNdOyBcXFxuIgorCQkJKyAiICAgIChhKVszXSA9
IChhKVs2XTsgXFxcbiIKKwkJCSsgIiAgICAoYSlbNl0gPSBjOyBcXFxuIgorCQkJKyAifVxuIgor
CQkJKyAiXG4iCisJCQkrICIjZGVmaW5lIGZmdEtlcm5lbDgoYSxkaXIpIFxcXG4iCisJCQkrICJ7
IFxcXG4iCisJCQkrICIJY29uc3QgZmxvYXQyIHcxICA9IChmbG9hdDIpKDB4MS42YTA5ZTZwLTFm
LCAgZGlyKjB4MS42YTA5ZTZwLTFmKTsgIFxcXG4iCisJCQkrICIJY29uc3QgZmxvYXQyIHczICA9
IChmbG9hdDIpKC0weDEuNmEwOWU2cC0xZiwgZGlyKjB4MS42YTA5ZTZwLTFmKTsgIFxcXG4iCisJ
CQkrICIJZmxvYXQyIGM7IFxcXG4iCisJCQkrICIJZmZ0S2VybmVsMlMoKGEpWzBdLCAoYSlbNF0s
IGRpcik7IFxcXG4iCisJCQkrICIJZmZ0S2VybmVsMlMoKGEpWzFdLCAoYSlbNV0sIGRpcik7IFxc
XG4iCisJCQkrICIJZmZ0S2VybmVsMlMoKGEpWzJdLCAoYSlbNl0sIGRpcik7IFxcXG4iCisJCQkr
ICIJZmZ0S2VybmVsMlMoKGEpWzNdLCAoYSlbN10sIGRpcik7IFxcXG4iCisJCQkrICIJKGEpWzVd
ID0gY29tcGxleE11bCh3MSwgKGEpWzVdKTsgXFxcbiIKKwkJCSsgIgkoYSlbNl0gPSAoZmxvYXQy
KShkaXIpKihjb25qVHJhbnNwKChhKVs2XSkpOyBcXFxuIgorCQkJKyAiCShhKVs3XSA9IGNvbXBs
ZXhNdWwodzMsIChhKVs3XSk7IFxcXG4iCisJCQkrICIJZmZ0S2VybmVsMlMoKGEpWzBdLCAoYSlb
Ml0sIGRpcik7IFxcXG4iCisJCQkrICIJZmZ0S2VybmVsMlMoKGEpWzFdLCAoYSlbM10sIGRpcik7
IFxcXG4iCisJCQkrICIJZmZ0S2VybmVsMlMoKGEpWzRdLCAoYSlbNl0sIGRpcik7IFxcXG4iCisJ
CQkrICIJZmZ0S2VybmVsMlMoKGEpWzVdLCAoYSlbN10sIGRpcik7IFxcXG4iCisJCQkrICIJKGEp
WzNdID0gKGZsb2F0MikoZGlyKSooY29ualRyYW5zcCgoYSlbM10pKTsgXFxcbiIKKwkJCSsgIgko
YSlbN10gPSAoZmxvYXQyKShkaXIpKihjb25qVHJhbnNwKChhKVs3XSkpOyBcXFxuIgorCQkJKyAi
CWZmdEtlcm5lbDJTKChhKVswXSwgKGEpWzFdLCBkaXIpOyBcXFxuIgorCQkJKyAiCWZmdEtlcm5l
bDJTKChhKVsyXSwgKGEpWzNdLCBkaXIpOyBcXFxuIgorCQkJKyAiCWZmdEtlcm5lbDJTKChhKVs0
XSwgKGEpWzVdLCBkaXIpOyBcXFxuIgorCQkJKyAiCWZmdEtlcm5lbDJTKChhKVs2XSwgKGEpWzdd
LCBkaXIpOyBcXFxuIgorCQkJKyAiCWJpdHJldmVyc2U4KChhKSk7IFxcXG4iCisJCQkrICJ9XG4i
CisJCQkrICJcbiIKKwkJCSsgIiNkZWZpbmUgYml0cmV2ZXJzZTR4NChhKSBcXFxuIgorCQkJKyAi
eyBcXFxuIgorCQkJKyAiCWZsb2F0MiBjOyBcXFxuIgorCQkJKyAiCWMgPSAoYSlbMV07ICAoYSlb
MV0gID0gKGEpWzRdOyAgKGEpWzRdICA9IGM7IFxcXG4iCisJCQkrICIJYyA9IChhKVsyXTsgIChh
KVsyXSAgPSAoYSlbOF07ICAoYSlbOF0gID0gYzsgXFxcbiIKKwkJCSsgIgljID0gKGEpWzNdOyAg
KGEpWzNdICA9IChhKVsxMl07IChhKVsxMl0gPSBjOyBcXFxuIgorCQkJKyAiCWMgPSAoYSlbNl07
ICAoYSlbNl0gID0gKGEpWzldOyAgKGEpWzldICA9IGM7IFxcXG4iCisJCQkrICIJYyA9IChhKVs3
XTsgIChhKVs3XSAgPSAoYSlbMTNdOyAoYSlbMTNdID0gYzsgXFxcbiIKKwkJCSsgIgljID0gKGEp
WzExXTsgKGEpWzExXSA9IChhKVsxNF07IChhKVsxNF0gPSBjOyBcXFxuIgorCQkJKyAifVxuIgor
CQkJKyAiXG4iCisJCQkrICIjZGVmaW5lIGZmdEtlcm5lbDE2KGEsZGlyKSBcXFxuIgorCQkJKyAi
eyBcXFxuIgorCQkJKyAiICAgIGNvbnN0IGZsb2F0IHcwID0gMHgxLmQ5MDZiY3AtMWY7IFxcXG4i
CisJCQkrICIgICAgY29uc3QgZmxvYXQgdzEgPSAweDEuODdkZTJhcC0yZjsgXFxcbiIKKwkJCSsg
IiAgICBjb25zdCBmbG9hdCB3MiA9IDB4MS42YTA5ZTZwLTFmOyBcXFxuIgorCQkJKyAiICAgIGZm
dEtlcm5lbDRzKChhKVswXSwgKGEpWzRdLCAoYSlbOF0sICAoYSlbMTJdLCBkaXIpOyBcXFxuIgor
CQkJKyAiICAgIGZmdEtlcm5lbDRzKChhKVsxXSwgKGEpWzVdLCAoYSlbOV0sICAoYSlbMTNdLCBk
aXIpOyBcXFxuIgorCQkJKyAiICAgIGZmdEtlcm5lbDRzKChhKVsyXSwgKGEpWzZdLCAoYSlbMTBd
LCAoYSlbMTRdLCBkaXIpOyBcXFxuIgorCQkJKyAiICAgIGZmdEtlcm5lbDRzKChhKVszXSwgKGEp
WzddLCAoYSlbMTFdLCAoYSlbMTVdLCBkaXIpOyBcXFxuIgorCQkJKyAiICAgIChhKVs1XSAgPSBj
b21wbGV4TXVsKChhKVs1XSwgKGZsb2F0MikodzAsIGRpcip3MSkpOyBcXFxuIgorCQkJKyAiICAg
IChhKVs2XSAgPSBjb21wbGV4TXVsKChhKVs2XSwgKGZsb2F0MikodzIsIGRpcip3MikpOyBcXFxu
IgorCQkJKyAiICAgIChhKVs3XSAgPSBjb21wbGV4TXVsKChhKVs3XSwgKGZsb2F0MikodzEsIGRp
cip3MCkpOyBcXFxuIgorCQkJKyAiICAgIChhKVs5XSAgPSBjb21wbGV4TXVsKChhKVs5XSwgKGZs
b2F0MikodzIsIGRpcip3MikpOyBcXFxuIgorCQkJKyAiICAgIChhKVsxMF0gPSAoZmxvYXQyKShk
aXIpKihjb25qVHJhbnNwKChhKVsxMF0pKTsgXFxcbiIKKwkJCSsgIiAgICAoYSlbMTFdID0gY29t
cGxleE11bCgoYSlbMTFdLCAoZmxvYXQyKSgtdzIsIGRpcip3MikpOyBcXFxuIgorCQkJKyAiICAg
IChhKVsxM10gPSBjb21wbGV4TXVsKChhKVsxM10sIChmbG9hdDIpKHcxLCBkaXIqdzApKTsgXFxc
biIKKwkJCSsgIiAgICAoYSlbMTRdID0gY29tcGxleE11bCgoYSlbMTRdLCAoZmxvYXQyKSgtdzIs
IGRpcip3MikpOyBcXFxuIgorCQkJKyAiICAgIChhKVsxNV0gPSBjb21wbGV4TXVsKChhKVsxNV0s
IChmbG9hdDIpKC13MCwgZGlyKi13MSkpOyBcXFxuIgorCQkJKyAiICAgIGZmdEtlcm5lbDQoKGEp
LCBkaXIpOyBcXFxuIgorCQkJKyAiICAgIGZmdEtlcm5lbDQoKGEpICsgNCwgZGlyKTsgXFxcbiIK
KwkJCSsgIiAgICBmZnRLZXJuZWw0KChhKSArIDgsIGRpcik7IFxcXG4iCisJCQkrICIgICAgZmZ0
S2VybmVsNCgoYSkgKyAxMiwgZGlyKTsgXFxcbiIKKwkJCSsgIiAgICBiaXRyZXZlcnNlNHg0KChh
KSk7IFxcXG4iCisJCQkrICJ9XG4iCisJCQkrICJcbiIKKwkJCSsgIiNkZWZpbmUgYml0cmV2ZXJz
ZTMyKGEpIFxcXG4iCisJCQkrICJ7IFxcXG4iCisJCQkrICIgICAgZmxvYXQyIGMxLCBjMjsgXFxc
biIKKwkJCSsgIiAgICBjMSA9IChhKVsyXTsgICAoYSlbMl0gPSAoYSlbMV07ICAgYzIgPSAoYSlb
NF07ICAgKGEpWzRdID0gYzE7ICAgYzEgPSAoYSlbOF07ICAgKGEpWzhdID0gYzI7ICAgIGMyID0g
KGEpWzE2XTsgIChhKVsxNl0gPSBjMTsgICAoYSlbMV0gPSBjMjsgXFxcbiIKKwkJCSsgIiAgICBj
MSA9IChhKVs2XTsgICAoYSlbNl0gPSAoYSlbM107ICAgYzIgPSAoYSlbMTJdOyAgKGEpWzEyXSA9
IGMxOyAgYzEgPSAoYSlbMjRdOyAgKGEpWzI0XSA9IGMyOyAgIGMyID0gKGEpWzE3XTsgIChhKVsx
N10gPSBjMTsgICAoYSlbM10gPSBjMjsgXFxcbiIKKwkJCSsgIiAgICBjMSA9IChhKVsxMF07ICAo
YSlbMTBdID0gKGEpWzVdOyAgYzIgPSAoYSlbMjBdOyAgKGEpWzIwXSA9IGMxOyAgYzEgPSAoYSlb
OV07ICAgKGEpWzldID0gYzI7ICAgIGMyID0gKGEpWzE4XTsgIChhKVsxOF0gPSBjMTsgICAoYSlb
NV0gPSBjMjsgXFxcbiIKKwkJCSsgIiAgICBjMSA9IChhKVsxNF07ICAoYSlbMTRdID0gKGEpWzdd
OyAgYzIgPSAoYSlbMjhdOyAgKGEpWzI4XSA9IGMxOyAgYzEgPSAoYSlbMjVdOyAgKGEpWzI1XSA9
IGMyOyAgIGMyID0gKGEpWzE5XTsgIChhKVsxOV0gPSBjMTsgICAoYSlbN10gPSBjMjsgXFxcbiIK
KwkJCSsgIiAgICBjMSA9IChhKVsyMl07ICAoYSlbMjJdID0gKGEpWzExXTsgYzIgPSAoYSlbMTNd
OyAgKGEpWzEzXSA9IGMxOyAgYzEgPSAoYSlbMjZdOyAgKGEpWzI2XSA9IGMyOyAgIGMyID0gKGEp
WzIxXTsgIChhKVsyMV0gPSBjMTsgICAoYSlbMTFdID0gYzI7IFxcXG4iCisJCQkrICIgICAgYzEg
PSAoYSlbMzBdOyAgKGEpWzMwXSA9IChhKVsxNV07IGMyID0gKGEpWzI5XTsgIChhKVsyOV0gPSBj
MTsgIGMxID0gKGEpWzI3XTsgIChhKVsyN10gPSBjMjsgICBjMiA9IChhKVsyM107ICAoYSlbMjNd
ID0gYzE7ICAgKGEpWzE1XSA9IGMyOyBcXFxuIgorCQkJKyAifVxuIgorCQkJKyAiXG4iCisJCQkr
ICIjZGVmaW5lIGZmdEtlcm5lbDMyKGEsZGlyKSBcXFxuIgorCQkJKyAieyBcXFxuIgorCQkJKyAi
ICAgIGZmdEtlcm5lbDJTKChhKVswXSwgIChhKVsxNl0sIGRpcik7IFxcXG4iCisJCQkrICIgICAg
ZmZ0S2VybmVsMlMoKGEpWzFdLCAgKGEpWzE3XSwgZGlyKTsgXFxcbiIKKwkJCSsgIiAgICBmZnRL
ZXJuZWwyUygoYSlbMl0sICAoYSlbMThdLCBkaXIpOyBcXFxuIgorCQkJKyAiICAgIGZmdEtlcm5l
bDJTKChhKVszXSwgIChhKVsxOV0sIGRpcik7IFxcXG4iCisJCQkrICIgICAgZmZ0S2VybmVsMlMo
KGEpWzRdLCAgKGEpWzIwXSwgZGlyKTsgXFxcbiIKKwkJCSsgIiAgICBmZnRLZXJuZWwyUygoYSlb
NV0sICAoYSlbMjFdLCBkaXIpOyBcXFxuIgorCQkJKyAiICAgIGZmdEtlcm5lbDJTKChhKVs2XSwg
IChhKVsyMl0sIGRpcik7IFxcXG4iCisJCQkrICIgICAgZmZ0S2VybmVsMlMoKGEpWzddLCAgKGEp
WzIzXSwgZGlyKTsgXFxcbiIKKwkJCSsgIiAgICBmZnRLZXJuZWwyUygoYSlbOF0sICAoYSlbMjRd
LCBkaXIpOyBcXFxuIgorCQkJKyAiICAgIGZmdEtlcm5lbDJTKChhKVs5XSwgIChhKVsyNV0sIGRp
cik7IFxcXG4iCisJCQkrICIgICAgZmZ0S2VybmVsMlMoKGEpWzEwXSwgKGEpWzI2XSwgZGlyKTsg
XFxcbiIKKwkJCSsgIiAgICBmZnRLZXJuZWwyUygoYSlbMTFdLCAoYSlbMjddLCBkaXIpOyBcXFxu
IgorCQkJKyAiICAgIGZmdEtlcm5lbDJTKChhKVsxMl0sIChhKVsyOF0sIGRpcik7IFxcXG4iCisJ
CQkrICIgICAgZmZ0S2VybmVsMlMoKGEpWzEzXSwgKGEpWzI5XSwgZGlyKTsgXFxcbiIKKwkJCSsg
IiAgICBmZnRLZXJuZWwyUygoYSlbMTRdLCAoYSlbMzBdLCBkaXIpOyBcXFxuIgorCQkJKyAiICAg
IGZmdEtlcm5lbDJTKChhKVsxNV0sIChhKVszMV0sIGRpcik7IFxcXG4iCisJCQkrICIgICAgKGEp
WzE3XSA9IGNvbXBsZXhNdWwoKGEpWzE3XSwgKGZsb2F0MikoMHgxLmY2Mjk3Y3AtMWYsIGRpciow
eDEuOGY4Yjg0cC0zZikpOyBcXFxuIgorCQkJKyAiICAgIChhKVsxOF0gPSBjb21wbGV4TXVsKChh
KVsxOF0sIChmbG9hdDIpKDB4MS5kOTA2YmNwLTFmLCBkaXIqMHgxLjg3ZGUyYXAtMmYpKTsgXFxc
biIKKwkJCSsgIiAgICAoYSlbMTldID0gY29tcGxleE11bCgoYSlbMTldLCAoZmxvYXQyKSgweDEu
YTliNjYycC0xZiwgZGlyKjB4MS4xYzczYjRwLTFmKSk7IFxcXG4iCisJCQkrICIgICAgKGEpWzIw
XSA9IGNvbXBsZXhNdWwoKGEpWzIwXSwgKGZsb2F0MikoMHgxLjZhMDllNnAtMWYsIGRpcioweDEu
NmEwOWU2cC0xZikpOyBcXFxuIgorCQkJKyAiICAgIChhKVsyMV0gPSBjb21wbGV4TXVsKChhKVsy
MV0sIChmbG9hdDIpKDB4MS4xYzczYjRwLTFmLCBkaXIqMHgxLmE5YjY2MnAtMWYpKTsgXFxcbiIK
KwkJCSsgIiAgICAoYSlbMjJdID0gY29tcGxleE11bCgoYSlbMjJdLCAoZmxvYXQyKSgweDEuODdk
ZTJhcC0yZiwgZGlyKjB4MS5kOTA2YmNwLTFmKSk7IFxcXG4iCisJCQkrICIgICAgKGEpWzIzXSA9
IGNvbXBsZXhNdWwoKGEpWzIzXSwgKGZsb2F0MikoMHgxLjhmOGI4NHAtM2YsIGRpcioweDEuZjYy
OTdjcC0xZikpOyBcXFxuIgorCQkJKyAiICAgIChhKVsyNF0gPSBjb21wbGV4TXVsKChhKVsyNF0s
IChmbG9hdDIpKDB4MHArMGYsIGRpcioweDFwKzBmKSk7IFxcXG4iCisJCQkrICIgICAgKGEpWzI1
XSA9IGNvbXBsZXhNdWwoKGEpWzI1XSwgKGZsb2F0MikoLTB4MS44ZjhiODRwLTNmLCBkaXIqMHgx
LmY2Mjk3Y3AtMWYpKTsgXFxcbiIKKwkJCSsgIiAgICAoYSlbMjZdID0gY29tcGxleE11bCgoYSlb
MjZdLCAoZmxvYXQyKSgtMHgxLjg3ZGUyYXAtMmYsIGRpcioweDEuZDkwNmJjcC0xZikpOyBcXFxu
IgorCQkJKyAiICAgIChhKVsyN10gPSBjb21wbGV4TXVsKChhKVsyN10sIChmbG9hdDIpKC0weDEu
MWM3M2I0cC0xZiwgZGlyKjB4MS5hOWI2NjJwLTFmKSk7IFxcXG4iCisJCQkrICIgICAgKGEpWzI4
XSA9IGNvbXBsZXhNdWwoKGEpWzI4XSwgKGZsb2F0MikoLTB4MS42YTA5ZTZwLTFmLCBkaXIqMHgx
LjZhMDllNnAtMWYpKTsgXFxcbiIKKwkJCSsgIiAgICAoYSlbMjldID0gY29tcGxleE11bCgoYSlb
MjldLCAoZmxvYXQyKSgtMHgxLmE5YjY2MnAtMWYsIGRpcioweDEuMWM3M2I0cC0xZikpOyBcXFxu
IgorCQkJKyAiICAgIChhKVszMF0gPSBjb21wbGV4TXVsKChhKVszMF0sIChmbG9hdDIpKC0weDEu
ZDkwNmJjcC0xZiwgZGlyKjB4MS44N2RlMmFwLTJmKSk7IFxcXG4iCisJCQkrICIgICAgKGEpWzMx
XSA9IGNvbXBsZXhNdWwoKGEpWzMxXSwgKGZsb2F0MikoLTB4MS5mNjI5N2NwLTFmLCBkaXIqMHgx
LjhmOGI4NHAtM2YpKTsgXFxcbiIKKwkJCSsgIiAgICBmZnRLZXJuZWwxNigoYSksIGRpcik7IFxc
XG4iCisJCQkrICIgICAgZmZ0S2VybmVsMTYoKGEpICsgMTYsIGRpcik7IFxcXG4iCisJCQkrICIg
ICAgYml0cmV2ZXJzZTMyKChhKSk7IFxcXG4iCisJCQkrICJ9XG5cbiI7CisJc3RhdGljIFN0cmlu
ZyB0d2lzdEtlcm5lbEludGVybGVhdmVkID0KKwkJCSJfX2tlcm5lbCB2b2lkIFxcXG4iCisJCQkr
ICJjbEZGVF8xRFR3aXN0SW50ZXJsZWF2ZWQoX19nbG9iYWwgZmxvYXQyICppbiwgdW5zaWduZWQg
aW50IHN0YXJ0Um93LCB1bnNpZ25lZCBpbnQgbnVtQ29scywgdW5zaWduZWQgaW50IE4sIHVuc2ln
bmVkIGludCBudW1Sb3dzVG9Qcm9jZXNzLCBpbnQgZGlyKSBcXFxuIgorCQkJKyAieyBcXFxuIgor
CQkJKyAiICAgZmxvYXQyIGEsIHc7IFxcXG4iCisJCQkrICIgICBmbG9hdCBhbmc7IFxcXG4iCisJ
CQkrICIgICB1bnNpZ25lZCBpbnQgajsgXFxcbiIKKwkJCSsgIgl1bnNpZ25lZCBpbnQgaSA9IGdl
dF9nbG9iYWxfaWQoMCk7IFxcXG4iCisJCQkrICIJdW5zaWduZWQgaW50IHN0YXJ0SW5kZXggPSBp
OyBcXFxuIgorCQkJKyAiCSBcXFxuIgorCQkJKyAiCWlmKGkgPCBudW1Db2xzKSBcXFxuIgorCQkJ
KyAiCXsgXFxcbiIKKwkJCSsgIgkgICAgZm9yKGogPSAwOyBqIDwgbnVtUm93c1RvUHJvY2Vzczsg
aisrKSBcXFxuIgorCQkJKyAiCSAgICB7IFxcXG4iCisJCQkrICIJICAgICAgICBhID0gaW5bc3Rh
cnRJbmRleF07IFxcXG4iCisJCQkrICIJICAgICAgICBhbmcgPSAyLjBmICogTV9QSSAqIGRpciAq
IGkgKiAoc3RhcnRSb3cgKyBqKSAvIE47IFxcXG4iCisJCQkrICIJICAgICAgICB3ID0gKGZsb2F0
MikobmF0aXZlX2NvcyhhbmcpLCBuYXRpdmVfc2luKGFuZykpOyBcXFxuIgorCQkJKyAiCSAgICAg
ICAgYSA9IGNvbXBsZXhNdWwoYSwgdyk7IFxcXG4iCisJCQkrICIJICAgICAgICBpbltzdGFydElu
ZGV4XSA9IGE7IFxcXG4iCisJCQkrICIJICAgICAgICBzdGFydEluZGV4ICs9IG51bUNvbHM7IFxc
XG4iCisJCQkrICIJICAgIH0gXFxcbiIKKwkJCSsgIgl9CSBcXFxuIgorCQkJKyAifSBcXFxuIjsK
KwlzdGF0aWMgU3RyaW5nIHR3aXN0S2VybmVsUGxhbm5hciA9CisJCQkiX19rZXJuZWwgdm9pZCBc
XFxuIgorCQkJKyAiY2xGRlRfMURUd2lzdFNwbGl0KF9fZ2xvYmFsIGZsb2F0ICppbl9yZWFsLCBf
X2dsb2JhbCBmbG9hdCAqaW5faW1hZyAsIHVuc2lnbmVkIGludCBzdGFydFJvdywgdW5zaWduZWQg
aW50IG51bUNvbHMsIHVuc2lnbmVkIGludCBOLCB1bnNpZ25lZCBpbnQgbnVtUm93c1RvUHJvY2Vz
cywgaW50IGRpcikgXFxcbiIKKwkJCSsgInsgXFxcbiIKKwkJCSsgIiAgICBmbG9hdDIgYSwgdzsg
XFxcbiIKKwkJCSsgIiAgICBmbG9hdCBhbmc7IFxcXG4iCisJCQkrICIgICAgdW5zaWduZWQgaW50
IGo7IFxcXG4iCisJCQkrICIJdW5zaWduZWQgaW50IGkgPSBnZXRfZ2xvYmFsX2lkKDApOyBcXFxu
IgorCQkJKyAiCXVuc2lnbmVkIGludCBzdGFydEluZGV4ID0gaTsgXFxcbiIKKwkJCSsgIgkgXFxc
biIKKwkJCSsgIglpZihpIDwgbnVtQ29scykgXFxcbiIKKwkJCSsgIgl7IFxcXG4iCisJCQkrICIJ
ICAgIGZvcihqID0gMDsgaiA8IG51bVJvd3NUb1Byb2Nlc3M7IGorKykgXFxcbiIKKwkJCSsgIgkg
ICAgeyBcXFxuIgorCQkJKyAiCSAgICAgICAgYSA9IChmbG9hdDIpKGluX3JlYWxbc3RhcnRJbmRl
eF0sIGluX2ltYWdbc3RhcnRJbmRleF0pOyBcXFxuIgorCQkJKyAiCSAgICAgICAgYW5nID0gMi4w
ZiAqIE1fUEkgKiBkaXIgKiBpICogKHN0YXJ0Um93ICsgaikgLyBOOyBcXFxuIgorCQkJKyAiCSAg
ICAgICAgdyA9IChmbG9hdDIpKG5hdGl2ZV9jb3MoYW5nKSwgbmF0aXZlX3NpbihhbmcpKTsgXFxc
biIKKwkJCSsgIgkgICAgICAgIGEgPSBjb21wbGV4TXVsKGEsIHcpOyBcXFxuIgorCQkJKyAiCSAg
ICAgICAgaW5fcmVhbFtzdGFydEluZGV4XSA9IGEueDsgXFxcbiIKKwkJCSsgIgkgICAgICAgIGlu
X2ltYWdbc3RhcnRJbmRleF0gPSBhLnk7IFxcXG4iCisJCQkrICIJICAgICAgICBzdGFydEluZGV4
ICs9IG51bUNvbHM7IFxcXG4iCisJCQkrICIJICAgIH0gXFxcbiIKKwkJCSsgIgl9CSBcXFxuIgor
CQkJKyAifSBcXFxuIjsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL2NvbS9qb2dhbXAvb3BlbmNsL2Rl
bW9zL2ZmdC9JbWFnZVZpZXcuamF2YSBiL3NyYy9jb20vam9nYW1wL29wZW5jbC9kZW1vcy9mZnQv
SW1hZ2VWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4NGYw
NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb20vam9nYW1wL29wZW5jbC9kZW1vcy9mZnQvSW1h
Z2VWaWV3LmphdmEKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBjb20uam9nYW1wLm9wZW5jbC5k
ZW1vcy5mZnQ7CisKK2ltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247CitpbXBvcnQgamF2YS5hd3Qu
R3JhcGhpY3M7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBq
YXZheC5zd2luZy5KQ29tcG9uZW50OworCisvKioKKyAqIEp1c3QgZHJhd3MgYW4gaW1hZ2UuCisg
KiBAYXV0aG9yIG5vdHplZAorICovCitjbGFzcyBJbWFnZVZpZXcgZXh0ZW5kcyBKQ29tcG9uZW50
IHsKKworCUJ1ZmZlcmVkSW1hZ2UgaW1nOworCisJcHVibGljIEltYWdlVmlldyhCdWZmZXJlZElt
YWdlIGltZykgeworCQl0aGlzLmltZyA9IGltZzsKKwkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKG5l
dyBEaW1lbnNpb24oaW1nLmdldFdpZHRoKCksIGltZy5nZXRIZWlnaHQoKSkpOworCX0KKworCUBP
dmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKKwkJ
Zy5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBudWxsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvY29t
L2pvZ2FtcC9vcGVuY2wvZGVtb3MvZmZ0L1BhaW50Vmlldy5qYXZhIGIvc3JjL2NvbS9qb2dhbXAv
b3BlbmNsL2RlbW9zL2ZmdC9QYWludFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi45ZGVhM2M4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvbS9qb2dhbXAvb3Bl
bmNsL2RlbW9zL2ZmdC9QYWludFZpZXcuamF2YQpAQCAtMCwwICsxLDk4IEBACitwYWNrYWdlIGNv
bS5qb2dhbXAub3BlbmNsLmRlbW9zLmZmdDsKKworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1w
b3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuUGFpbnQ7CitpbXBvcnQg
amF2YS5hd3QuUmFkaWFsR3JhZGllbnRQYWludDsKK2ltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7
CitpbXBvcnQgamF2YS5hd3QuU2hhcGU7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVu
dDsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUxpc3RlbmVyOworaW1wb3J0IGphdmEuYXd0
LmV2ZW50Lk1vdXNlTW90aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5Qb2ludDJE
OworaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7CisKKy8qKgorICogRHJhd3Mg
YW4gaW1hZ2UgYW5kIGxldHMgeW91IGRyYXcgd2hpdGUgZG90cyBpbiBpdCB3aXRoIHRoZSBtb3Vz
ZS4gIE9yIGJpZyB3aGl0ZSBkb3RzIHdpdGggY29kZS4KKyAqIEBhdXRob3Igbm90emVkCisgKi8K
K2NsYXNzIFBhaW50VmlldyBleHRlbmRzIEltYWdlVmlldyBpbXBsZW1lbnRzIE1vdXNlTGlzdGVu
ZXIsIE1vdXNlTW90aW9uTGlzdGVuZXIgeworCisJR3JhcGhpY3MyRCBpbWdnOworCVBhaW50IHBh
aW50OworCVNoYXBlIGJydXNoOworCUJsdXJUZXN0IHdpbjsKKworCXB1YmxpYyBQYWludFZpZXco
Qmx1clRlc3Qgd2luLCBCdWZmZXJlZEltYWdlIGltZykgeworCQlzdXBlcihpbWcpOworCisJCXRo
aXMud2luID0gd2luOworCisJCXBhaW50ID0gbmV3IFJhZGlhbEdyYWRpZW50UGFpbnQobmV3IFBv
aW50MkQuRmxvYXQoMCwgMCksIDMsCisJCQkJbmV3IGZsb2F0W117MC4wZiwgMS4wZn0sIG5ldyBD
b2xvcltde25ldyBDb2xvcigyNTUsIDI1NSwgMjU1LCAyNTUpLCBuZXcgQ29sb3IoMjU1LCAyNTUs
IDI1NSwgMCl9KTsKKwkJYnJ1c2ggPSBuZXcgamF2YS5hd3QuZ2VvbS5FbGxpcHNlMkQuRmxvYXQo
LTUsIC01LCAxMSwgMTEpOworCisJCWltZ2cgPSBpbWcuY3JlYXRlR3JhcGhpY3MoKTsKKworCQl0
aGlzLmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7CisJfQorCisJdm9pZCBkcmF3UGFpbnQoZG91Ymxl
IHgsIGRvdWJsZSB5KSB7CisJCUdyYXBoaWNzMkQgZ2cgPSAoR3JhcGhpY3MyRCkgaW1nZy5jcmVh
dGUoKTsKKworCQlnZy50cmFuc2xhdGUoeCwgeSk7CisJCWdnLnNldFBhaW50KHBhaW50KTsKKwkJ
Z2cuZmlsbChicnVzaCk7CisKKwkJZ2cuZGlzcG9zZSgpOworCisJCXJlcGFpbnQobmV3IFJlY3Rh
bmdsZSgoaW50KSAoeCAtIDYpLCAoaW50KSAoeSAtIDYpLCAxMiwgMTIpKTsKKwkJLy8gY2xvc2Ug
eW91ciBleWVzIGlmIHlvdSdyZSB1bmRlci1hZ2UgLi4uCisJCXdpbi5yZWNhbGMoKTsKKwl9CisK
KwlwdWJsaWMgdm9pZCBkcmF3RG90KGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCwgZG91Ymxl
IGFuZ2xlKSB7CisJCUdyYXBoaWNzMkQgZ2cgPSAoR3JhcGhpY3MyRCkgaW1nZy5jcmVhdGUoKTsK
KworCQlnZy5zZXRQYWludChwYWludCk7CisJCWdnLnRyYW5zbGF0ZShpbWcuZ2V0V2lkdGgoKSAv
IDIsIGltZy5nZXRIZWlnaHQoKSAvIDIpOworCQlnZy5yb3RhdGUoYW5nbGUpOworCQlnZy5zY2Fs
ZSh3aWR0aCwgaGVpZ2h0KTsKKwkJZ2cuZmlsbChicnVzaCk7CisKKwkJZ2cuZGlzcG9zZSgpOwor
CisJCXJlcGFpbnQoKTsKKwkJd2luLnJlY2FsYygpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdXNl
Q2xpY2tlZChNb3VzZUV2ZW50IGUpIHsKKwl9CisKKwlwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQo
TW91c2VFdmVudCBlKSB7CisJCWlmIChlLmdldEJ1dHRvbigpID09IGUuQlVUVE9OMSkgeworCQkJ
YWRkTW91c2VNb3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCWRyYXdQYWludChlLmdldFgoKSwgZS5n
ZXRZKCkpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50
IGUpIHsKKwkJaWYgKGUuZ2V0QnV0dG9uKCkgPT0gZS5CVVRUT04xKSB7CisJCQlyZW1vdmVNb3Vz
ZU1vdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJLy9kcmF3UGFpbnQoZS5nZXRYKCksIGUuZ2V0WSgp
KTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGUpIHsK
Kwl9CisKKwlwdWJsaWMgdm9pZCBtb3VzZUV4aXRlZChNb3VzZUV2ZW50IGUpIHsKKwl9CisKKwlw
dWJsaWMgdm9pZCBtb3VzZURyYWdnZWQoTW91c2VFdmVudCBlKSB7CisJCWRyYXdQYWludChlLmdl
dFgoKSwgZS5nZXRZKCkpOworCX0KKworCXB1YmxpYyB2b2lkIG1vdXNlTW92ZWQoTW91c2VFdmVu
dCBlKSB7CisJfQorfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>