From mboxrd@z Thu Jan 1 00:00:00 1970 From: Adolf Belka To: development@lists.ipfire.org Subject: Re: Testing required for modified dhcp.cgi file related to bug 10743 Date: Mon, 16 Nov 2020 14:14:03 +0100 Message-ID: <012d97d2-056d-829f-c2dc-8a6b374ea657@gmail.com> In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0820200156770295842==" List-Id: --===============0820200156770295842== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Hi All, I have now modified the dhcp.cgi file changes so that the pool declaration is= only made around the range statement. All other options apply to all clients= in a subnet. If no range values are on the dhcp page then the pool declaration is not adde= d into dhcpd.conf I now only have "deny known-clients" to be added. The "deny unknown-clients" = option seemed to be redundant in the context of IPFire. If you have a range s= tatement together with a deny unknown-clients statement then the only clients= that could access the range would be known-clients but in IPFire these are a= lways clients with fixed leases, which are from outside the range. Using deny= unknown-clients makes sense if you have host declarations that do not includ= e a fixed-address which can be created in other dhcpd server setups but not i= n IPFire. I have tested this out with and without ranges specified and it worked for me= . Also all the other options were correctly applied to the fixed leases as we= ll this time. However the proof of the pudding is in the eating by other people as well so = would appreciate your testing and feedback again. The modified dhcp-core151-new.cgi file is attached. Regards, Adolf On 14/11/2020 23:13, Adolf Belka wrote: > Hi Matthias, > > I have added your feedback into bugzilla. > > After I read your input and looked at my changes I had one of those > "Duh, that's so obvious, why on earth did I do that" > moments. I know the error I made and I have a reasonable idea of how I can = fix it. > > Will send out a diff once I have made and tested the changes. > Thanks very much for the help, much appreciated. > > Regards, > Adolf. > > > On 14/11/2020 17:26, Matthias Fischer wrote: >> Hi, >> >> Tested - sorry, didn't work - 'dhcp' wouldn't start. Perhaps my fault. I >> have suspected something like this for my machine. >> >> /var/log/messages tells me: >> >> ... >> Nov 14 16:36:27 ipfire dhcpd: /etc/dhcp/dhcpd.conf line 16: Pool >> declaration with no address range. >> Nov 14 16:36:27 ipfire dhcpd:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } >> Nov 14 16:36:27 ipfire dhcpd:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ^ >> Nov 14 16:36:27 ipfire dhcpd: Pool declarations must always contain at lea= st >> Nov 14 16:36:27 ipfire dhcpd: one range statement. >> Nov 14 16:36:27 ipfire dhcpd: /etc/dhcp/dhcpd.conf line 30: Pool >> declaration with no address range. >> Nov 14 16:36:27 ipfire dhcpd:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } >> Nov 14 16:36:27 ipfire dhcpd:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ^ >> Nov 14 16:36:27 ipfire dhcpd: Pool declarations must always contain at lea= st >> Nov 14 16:36:27 ipfire dhcpd: one range statement. >> Nov 14 16:36:27 ipfire dhcpd: Configuration file errors encountered -- >> exiting >> ... >> >> And...yes... [Hrm!]...I'm running 'dhcpd' on GREEN and BLUE with NO >> address pools. Only fixed leases. >> >> Anything I can do to test this without address ranges? >> >> Best, >> Matthias >> >> On 14.11.2020 13:29, Adolf Belka wrote: >>> Hi all, >>> >>> I created a modified dhcp.cgi file for bug 10743. This gives the opportun= ity to add deny unknown-clients or deny known-clients to the dhcpd.conf file = for the green and blue subnets. >>> >>> Unfortunately one of the bug originators has decided to move away from IP= Fire and will not carry out any testing of this modification to confirm it wo= rks before I create a patch and submit it. >>> >>> The modification provides a radio button set to green and blue that offer= s:- >>> >>> allow all clients >>> deny unknown-clients >>> deny known-clients >>> >>> The allow all clients option gives the same setup as currently and is the= default setting for the radio button set. >>> >>> The modified dhcp.cgi file is attached. I would appreciate it if you coul= d test this out and let me know if there are any unexpected outcomes. >>> >>> Regards, >>> >>> Adolf. >>> >> --===============0820200156770295842== Content-Type: text/plain Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="dhcp-core151-new.cgi" MIME-Version: 1.0 IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIwojIElQRmlyZS5vcmcgLSBBIGxpbnV4IGJhc2VkIGZpcmV3YWxsICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAjCiMgQ29weXJpZ2h0IChDKSAyMDA3ICBNaWNoYWVs IFRyZW1lciAmIENocmlzdGlhbiBTY2htaWR0ICAgICAgICAgICAgICAgICAgICAgICMKIyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICAgICAjCiMgaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAg ICAgICMKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9m IHRoZSBMaWNlbnNlLCBvciAgICAgICAgICAgIwojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiMgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICAgIwojIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAg ICAgICAjCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAgICMKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwojICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAjCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgICAgICMKIyBhbG9uZyB3aXRoIHRo aXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4g ICAgICAgIwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnVz ZSBzdHJpY3Q7CnVzZSBleHBlcmltZW50YWwgJ3NtYXJ0bWF0Y2gnOwoKIyBlbmFibGUgb25seSB0 aGUgZm9sbG93aW5nIG9uIGRlYnVnZ2luZyBwdXJwb3NlCiN1c2Ugd2FybmluZ3M7CiN1c2UgQ0dJ OjpDYXJwICdmYXRhbHNUb0Jyb3dzZXInOwoKcmVxdWlyZSAnL3Zhci9pcGZpcmUvZ2VuZXJhbC1m dW5jdGlvbnMucGwnOwpyZXF1aXJlICIke0dlbmVyYWw6OnN3cm9vdH0vbGFuZy5wbCI7CnJlcXVp cmUgIiR7R2VuZXJhbDo6c3dyb290fS9oZWFkZXIucGwiOwojd29ya2Fyb3VuZCB0byBzdXBwcmVz cyBhIHdhcm5pbmcgd2hlbiBhIHZhcmlhYmxlIGlzIHVzZWQgb25seSBvbmNlCm15IEBkdW1teSA9 ICggJHtIZWFkZXI6OmNvbG91cnllbGxvd30gKTsKdW5kZWYgKEBkdW1teSk7CgpvdXIgJWRoY3Bz ZXR0aW5ncz0oKTsKb3VyICVuZXRzZXR0aW5ncz0oKTsKbXkgJW1haW5zZXR0aW5ncz0oKTsKbXkg JXRpbWVzZXR0aW5ncz0oKTsKbXkgJHNldHRpbmcgPSAiJHtHZW5lcmFsOjpzd3Jvb3R9L2RoY3Av c2V0dGluZ3MiOwpvdXIgJGZpbGVuYW1lMSA9ICIke0dlbmVyYWw6OnN3cm9vdH0vZGhjcC9hZHZv cHRpb25zIjsgCSMgRmllbGQgc2VwYXJhdG9yIGlzIFRBQiBpbiB0aGlzIGZpbGUgKGNvbW1hIGlz IHN0YW5kYXJ0KQoJCQkJCQkJCQkjIGJlY2F1c2Ugd2UgbmVlZCBjb21tYXMgaW4gdGhlIHNvbWUg ZGF0YQpvdXIgJGZpbGVuYW1lMiA9ICIke0dlbmVyYWw6OnN3cm9vdH0vZGhjcC9maXhsZWFzZXMi OwpvdXIgJGZpbGVuYW1lMyA9ICIke0dlbmVyYWw6OnN3cm9vdH0vZGhjcC9hZHZvcHRpb25zLWxp c3QiOwkjIERlc2NyaWJlIHRoZSBhbGxvd2VkIHN5bnRheCBmb3IgZGhjcCBvcHRpb25zCm15ICRl cnJvcm1lc3NhZ2UgPSAnJzsKbXkgJHdhcm5OVFBtZXNzYWdlID0gJyc7Cm15IEBub3NhdmVkPSgp OwpteSAlY29sb3IgPSAoKTsKCiNCYXNpYyBzeW50YXggYWxsb3dlZCBmb3IgbmV3IE9wdGlvbiBk ZWZpbml0aW9uLiBOb3QgaW1wbGVtZW50ZWQ6IFJFQ09SRFMgJiBhcnJheSBvZiBSRUNPUkRTIApv dXIgJE9wdGlvblR5cGVzID0gJ2Jvb2xlYW58KCh1bik/c2lnbmVkICk/aW50ZWdlciAoOHwxNnwz Mil8aXAtYWRkcmVzc3x0ZXh0fHN0cmluZ3xlbmNhcHN1bGF0ZSBcdyt8YXJyYXkgb2YgaXAtYWRk cmVzcyc7CgomSGVhZGVyOjpzaG93aHR0cGhlYWRlcnMoKTsKb3VyIEBJVEZzPSgnR1JFRU4nKTsK aWYgKCZIZWFkZXI6OmJsdWVfdXNlZCgpKXtwdXNoKEBJVEZzLCdCTFVFJyk7fQoKI1NldHRpbmdz MSBmb3IgdGhlIGZpcnN0IHNjcmVlbiBib3gKZm9yZWFjaCBteSAkaXRmIChASVRGcykgewogICAg JGRoY3BzZXR0aW5nc3siRU5BQkxFXyR7aXRmfSJ9ID0gJ29mZic7CiAgICAkZGhjcHNldHRpbmdz eyJFTkFCTEVCT09UUF8ke2l0Zn0ifSA9ICdvZmYnOwogICAgJGRoY3BzZXR0aW5nc3siU1RBUlRf QUREUl8ke2l0Zn0ifSA9ICcnOwogICAgJGRoY3BzZXR0aW5nc3siRU5EX0FERFJfJHtpdGZ9In0g PSAnJzsKICAgICRkaGNwc2V0dGluZ3N7IkRPTUFJTl9OQU1FXyR7aXRmfSJ9ID0gJyc7CiAgICAk ZGhjcHNldHRpbmdzeyJERUZBVUxUX0xFQVNFX1RJTUVfJHtpdGZ9In0gPSAnJzsKICAgICRkaGNw c2V0dGluZ3N7Ik1BWF9MRUFTRV9USU1FXyR7aXRmfSJ9ID0gJyc7CiAgICAkZGhjcHNldHRpbmdz eyJXSU5TMV8ke2l0Zn0ifSA9ICcnOwogICAgJGRoY3BzZXR0aW5nc3siV0lOUzJfJHtpdGZ9In0g PSAnJzsKICAgICRkaGNwc2V0dGluZ3N7IkROUzFfJHtpdGZ9In0gPSAnJzsKICAgICRkaGNwc2V0 dGluZ3N7IkROUzJfJHtpdGZ9In0gPSAnJzsKICAgICRkaGNwc2V0dGluZ3N7Ik5UUDFfJHtpdGZ9 In0gPSAnJzsKICAgICRkaGNwc2V0dGluZ3N7Ik5UUDJfJHtpdGZ9In0gPSAnJzsKICAgICRkaGNw c2V0dGluZ3N7Ik5FWFRfJHtpdGZ9In0gPSAnJzsKICAgICRkaGNwc2V0dGluZ3N7IkZJTEVfJHtp dGZ9In0gPSAnJzsKICAgICRkaGNwc2V0dGluZ3N7IkROU19VUERBVEVfS0VZX05BTUVfJHtpdGZ9 In0gPSAnJzsKICAgICRkaGNwc2V0dGluZ3N7IkROU19VUERBVEVfS0VZX1NFQ1JFVF8ke2l0Zn0i fSA9ICcnOwogICAgJGRoY3BzZXR0aW5nc3siRE5TX1VQREFURV9LRVlfQUxHT18ke2l0Zn0ifSA9 ICcnOwogICAgJGRoY3BzZXR0aW5nc3siREVOWV9LTk9XTl9DTElFTlRTXyR7aXRmfSJ9ID0gJ29m Zic7Cn0KCiRkaGNwc2V0dGluZ3N7J1NPUlRfRkxFQVNFTElTVCd9ID0gJ0ZJUEFERFInOwokZGhj cHNldHRpbmdzeydTT1JUX0xFQVNFTElTVCd9ID0gJ0lQQUREUic7CgojIEROUyBVcGRhdGUgc2V0 dGluZ3MKJGRoY3BzZXR0aW5nc3snRE5TX1VQREFURV9FTkFCTEVEJ30gPSAnb2ZmJzsKCiNTZXR0 aW5nczIgZm9yIGVkaXRpbmcgdGhlIG11bHRpLWxpbmUgbGlzdAojTXVzdCBub3QgYmUgc2F2ZWQg d2l0aCB3cml0ZWhhc2ggIQokZGhjcHNldHRpbmdzeydGSVhfTUFDJ30gPSAnJzsKJGRoY3BzZXR0 aW5nc3snRklYX0FERFInfSA9ICcnOwokZGhjcHNldHRpbmdzeydGSVhfRU5BQkxFRCd9ID0gJ29m Zic7CiRkaGNwc2V0dGluZ3N7J0ZJWF9ORVhUQUREUid9ID0gJyc7CiRkaGNwc2V0dGluZ3N7J0ZJ WF9GSUxFTkFNRSd9ID0gJyc7CiRkaGNwc2V0dGluZ3N7J0ZJWF9ST09UUEFUSCd9ID0gJyc7CiRk aGNwc2V0dGluZ3N7J0ZJWF9SRU1BUksnfSA9ICcnOwokZGhjcHNldHRpbmdzeydBQ1RJT04nfSA9 ICcnOwokZGhjcHNldHRpbmdzeydLRVkxJ30gPSAnJzsKJGRoY3BzZXR0aW5nc3snS0VZMid9ID0g Jyc7CkBub3NhdmVkPSgnRklYX01BQycsJ0ZJWF9BRERSJywnRklYX0VOQUJMRUQnLCdGSVhfTkVY VEFERFInLAoJICAgICdGSVhfRklMRU5BTUUnLCdGSVhfUk9PVFBBVEgnLCdGSVhfUkVNQVJLJyk7 CgokZGhjcHNldHRpbmdzeydBRFZPUFRfRU5BQkxFRCd9ID0gJyc7CiRkaGNwc2V0dGluZ3N7J0FE Vk9QVF9OQU1FJ30gPSAnJzsKJGRoY3BzZXR0aW5nc3snQURWT1BUX0RBVEEnfSA9ICcnOwp1bnNo aWZ0IChAbm9zYXZlZCwnQURWT1BUX0VOQUJMRUQnLCdBRFZPUFRfTkFNRScsJ0FEVk9QVF9EQVRB Jyk7CmZvcmVhY2ggbXkgJGl0ZiAoQElURnMpIHsKICAgICRkaGNwc2V0dGluZ3N7IkFEVk9QVF9T Q09QRV8ke2l0Zn0ifSA9ICdvZmYnOwogICAgdW5zaGlmdCAoQG5vc2F2ZWQsICJBRFZPUFRfU0NP UEVfJHtpdGZ9Iik7Cn0KCiMgUmVhZCBJcGNvcCBzZXR0aW5ncwomR2VuZXJhbDo6cmVhZGhhc2go IiR7R2VuZXJhbDo6c3dyb290fS9ldGhlcm5ldC9zZXR0aW5ncyIsIFwlbmV0c2V0dGluZ3MpOwom R2VuZXJhbDo6cmVhZGhhc2goIiR7R2VuZXJhbDo6c3dyb290fS9tYWluL3NldHRpbmdzIiwgXCVt YWluc2V0dGluZ3MpOwomR2VuZXJhbDo6cmVhZGhhc2goIiR7R2VuZXJhbDo6c3dyb290fS90aW1l L3NldHRpbmdzIiwgXCV0aW1lc2V0dGluZ3MpOwomR2VuZXJhbDo6cmVhZGhhc2goIi9zcnYvd2Vi L2lwZmlyZS9odG1sL3RoZW1lcy8iLiRtYWluc2V0dGluZ3N7J1RIRU1FJ30uIi9pbmNsdWRlL2Nv bG9ycy50eHQiLCBcJWNvbG9yKTsKCiNHZXQgR1VJIHZhbHVlcwomSGVhZGVyOjpnZXRjZ2loYXNo KFwlZGhjcHNldHRpbmdzKTsKCm9wZW4oRklMRSwgIiRmaWxlbmFtZTEiKSBvciBkaWUgJ1VuYWJs ZSB0byBvcGVuIGRoY3AgYWR2YW5jZWQgb3B0aW9ucyBmaWxlLic7Cm91ciBAY3VycmVudDEgPSA8 RklMRT47CmNsb3NlKEZJTEUpOwojIEV4dHJhY3QgT3B0aW9uRGVmaW5pdGlvbgpmb3JlYWNoIG15 ICRsaW5lIChAY3VycmVudDEpIHsKICAgICNjaG9tcCgkbGluZSk7ICAgIyByZW1vdmUgbmV3bGlu ZSAgICAgICAgI2Rvbid0IGtub3cgd2h5LCBidXQgdGhpcyByZW1vdmUgbmV3bGluZSBpbiBAY3Vy cmVudDEgLi4uLiAhCiAgICBteSBAdGVtcCA9IHNwbGl0KC9cdC8sJGxpbmUpOwogICAgQWRkTmV3 T3B0aW9uRGVmaW5pdGlvbiAoJHRlbXBbMV0gLiAnICcgLiAkdGVtcFsyXSk7Cn0KCm9wZW4oRklM RSwgIiRmaWxlbmFtZTIiKSBvciBkaWUgJ1VuYWJsZSB0byBvcGVuIGZpeGVkIGxlYXNlcyBmaWxl Lic7Cm91ciBAY3VycmVudDIgPSA8RklMRT47CmNsb3NlKEZJTEUpOwoKIyBDaGVjayBTZXR0aW5n czEgZmlyc3QgYmVjYXVzZSB0aGV5IGFyZSBuZWVkZWQgYnkgJmJ1aWxkY29uZgppZiAoJGRoY3Bz ZXR0aW5nc3snQUNUSU9OJ30gZXEgJExhbmc6OnRyeydzYXZlJ30pIHsKICAgIGZvcmVhY2ggbXkg JGl0ZiAoQElURnMpIHsKCWlmICgkZGhjcHNldHRpbmdzeyJFTkFCTEVfJHtpdGZ9In0gZXEgJ29u JyApIHsKCSAgICAjICJTdGFydCIgaXMgZGVmaW5lZCwgbmVlZCAiRW5kIiBhbmQgdmljZSB2ZXJz YQoJICAgIGlmICgkZGhjcHNldHRpbmdzeyJTVEFSVF9BRERSXyR7aXRmfSJ9KSB7CgkJaWYgKCEo JkdlbmVyYWw6OnZhbGlkaXAoJGRoY3BzZXR0aW5nc3siU1RBUlRfQUREUl8ke2l0Zn0ifSkpKSB7 CgkJICAgICRlcnJvcm1lc3NhZ2UgPSAiREhDUCBvbiAke2l0Zn06ICIgLiAkTGFuZzo6dHJ7J2lu dmFsaWQgc3RhcnQgYWRkcmVzcyd9OwoJCSAgICBnb3RvIEVSUk9SOwoJCX0KCQlpZiAoISRkaGNw c2V0dGluZ3N7IkVORF9BRERSXyR7aXRmfSJ9KSB7CgkJICAgICRlcnJvcm1lc3NhZ2UgPSAiREhD UCBvbiAke2l0Zn06ICIgLiAkTGFuZzo6dHJ7J2ludmFsaWQgZW5kIGFkZHJlc3MnfTsKCQkgICAg Z290byBFUlJPUjsKCQl9CgkJaWYgKCEgJkdlbmVyYWw6OklwSW5TdWJuZXQgKCAkZGhjcHNldHRp bmdzeyJTVEFSVF9BRERSXyR7aXRmfSJ9LCAKCQkJCSAgICAkbmV0c2V0dGluZ3N7IiR7aXRmfV9O RVRBRERSRVNTIn0sCgkJCQkgICAgJG5ldHNldHRpbmdzeyIke2l0Zn1fTkVUTUFTSyJ9KSkgewoJ CSAgICAkZXJyb3JtZXNzYWdlID0gIkRIQ1Agb24gJHtpdGZ9OiAiIC4gJExhbmc6OnRyeydpbnZh bGlkIHN0YXJ0IGFkZHJlc3MnfTsKCQkgICAgZ290byBFUlJPUjsKCQl9CgkgICAgfQoJICAgIAoJ ICAgIGlmICgkZGhjcHNldHRpbmdzeyJFTkRfQUREUl8ke2l0Zn0ifSkgewoJCWlmICghKCZHZW5l cmFsOjp2YWxpZGlwKCRkaGNwc2V0dGluZ3N7IkVORF9BRERSXyR7aXRmfSJ9KSkpIHsKCQkgICAg JGVycm9ybWVzc2FnZSA9ICJESENQIG9uICR7aXRmfTogIiAuICRMYW5nOjp0cnsnaW52YWxpZCBl bmQgYWRkcmVzcyd9OwoJCSAgICBnb3RvIEVSUk9SOwoJCX0KCQlpZiAoISRkaGNwc2V0dGluZ3N7 IlNUQVJUX0FERFJfJHtpdGZ9In0pIHsKCQkgICAgJGVycm9ybWVzc2FnZSA9ICJESENQIG9uICR7 aXRmfTogIiAuICRMYW5nOjp0cnsnaW52YWxpZCBzdGFydCBhZGRyZXNzJ307CgkJICAgIGdvdG8g RVJST1I7CgkJfQoJCWlmICghICZHZW5lcmFsOjpJcEluU3VibmV0ICggJGRoY3BzZXR0aW5nc3si RU5EX0FERFJfJHtpdGZ9In0sIAoJCQkJICAgICRuZXRzZXR0aW5nc3siJHtpdGZ9X05FVEFERFJF U1MifSwKCQkJCSAgICAkbmV0c2V0dGluZ3N7IiR7aXRmfV9ORVRNQVNLIn0pKSB7IAoJCSAgICAk ZXJyb3JtZXNzYWdlID0gIkRIQ1Agb24gJHtpdGZ9OiAiIC4gJExhbmc6OnRyeydpbnZhbGlkIGVu ZCBhZGRyZXNzJ307CgkJICAgIGdvdG8gRVJST1I7CgkJfQoJCSNzd2FwIGlmIG5lY2Vzc2FyeSEg KHN1cHBvcnQgMjU1LjI1NS4wLjAgcmFuZ2UsIEkgZG91YnQgd2UgbmVlZCBtb3JlKSBHRQoJCW15 IEBzdGFydG9jdCA9IHNwbGl0ICgvXC4vLCAkZGhjcHNldHRpbmdzeyJTVEFSVF9BRERSXyR7aXRm fSJ9KTsKCQlteSBAZW5kb2N0ICAgPSBzcGxpdCAoL1wuLywgJGRoY3BzZXR0aW5nc3siRU5EX0FE RFJfJHtpdGZ9In0pOwoJCWlmICggJGVuZG9jdFsyXSoyNTYrJGVuZG9jdFszXSA8ICRzdGFydG9j dFsyXSoyNTYrJHN0YXJ0b2N0WzNdICkgewoJCSAgICAoJGRoY3BzZXR0aW5nc3siU1RBUlRfQURE Ul8ke2l0Zn0ifSwkZGhjcHNldHRpbmdzeyJFTkRfQUREUl8ke2l0Zn0ifSkgPQoJCQkoJGRoY3Bz ZXR0aW5nc3siRU5EX0FERFJfJHtpdGZ9In0sJGRoY3BzZXR0aW5nc3siU1RBUlRfQUREUl8ke2l0 Zn0ifSk7CgkJfQoJICAgIH0KCgkgICAgaWYgKCEoJGRoY3BzZXR0aW5nc3siREVGQVVMVF9MRUFT RV9USU1FXyR7aXRmfSJ9ID1+IC9eXGQrJC8pKSB7CgkJJGVycm9ybWVzc2FnZSA9ICJESENQIG9u ICR7aXRmfTogIiAuICRMYW5nOjp0cnsnaW52YWxpZCBkZWZhdWx0IGxlYXNlIHRpbWUnfSAuICRk aGNwc2V0dGluZ3N7J0RFRkFVTFRfTEVBU0VfVElNRV8ke2l0Zn0nfTsKCQlnb3RvIEVSUk9SOwoJ ICAgIH0KCgkgICAgaWYgKCEoJGRoY3BzZXR0aW5nc3siTUFYX0xFQVNFX1RJTUVfJHtpdGZ9In0g PX4gL15cZCskLykpIHsKCQkkZXJyb3JtZXNzYWdlID0gIkRIQ1Agb24gJHtpdGZ9OiAiIC4gJExh bmc6OnRyeydpbnZhbGlkIG1heCBsZWFzZSB0aW1lJ30gLiAkZGhjcHNldHRpbmdzeydNQVhfTEVB U0VfVElNRV8ke2l0Zn0nfTsKCQlnb3RvIEVSUk9SOwoJICAgIH0KCgkgICAgaWYgKCRkaGNwc2V0 dGluZ3N7IkROUzFfJHtpdGZ9In0pIHsKCQlpZiAoISgmR2VuZXJhbDo6dmFsaWRpcCgkZGhjcHNl dHRpbmdzeyJETlMxXyR7aXRmfSJ9KSkpIHsKCQkJJGVycm9ybWVzc2FnZSA9ICJESENQIG9uICR7 aXRmfTogIiAuICRMYW5nOjp0cnsnaW52YWxpZCBwcmltYXJ5IGRucyd9OwoJCQlnb3RvIEVSUk9S OwoJCX0KCSAgICB9CgkgICAgaWYgKCRkaGNwc2V0dGluZ3N7IkROUzJfJHtpdGZ9In0pIHsKCQlp ZiAoISgmR2VuZXJhbDo6dmFsaWRpcCgkZGhjcHNldHRpbmdzeyJETlMyXyR7aXRmfSJ9KSkpIHsK CQkJJGVycm9ybWVzc2FnZSA9ICJESENQIG9uICR7aXRmfTogIiAuICRMYW5nOjp0cnsnaW52YWxp ZCBzZWNvbmRhcnkgZG5zJ307CgkJCWdvdG8gRVJST1I7CgkJfQoJCWlmICghICRkaGNwc2V0dGlu Z3N7IkROUzFfJHtpdGZ9In0pIHsKCQkJJGVycm9ybWVzc2FnZSA9ICJESENQIG9uICR7aXRmfTog IiAuICRMYW5nOjp0cnsnY2Fubm90IHNwZWNpZnkgc2Vjb25kYXJ5IGRucyB3aXRob3V0IHNwZWNp ZnlpbmcgcHJpbWFyeSd9OyAKCQkJZ290byBFUlJPUjsKCQl9CgkgICAgfQoKCSAgICBpZiAoJGRo Y3BzZXR0aW5nc3siV0lOUzFfJHtpdGZ9In0pIHsKCQlpZiAoISgmR2VuZXJhbDo6dmFsaWRpcCgk ZGhjcHNldHRpbmdzeyJXSU5TMV8ke2l0Zn0ifSkpKSB7CgkJCSRlcnJvcm1lc3NhZ2UgPSAiREhD UCBvbiAke2l0Zn06ICIgLiAkTGFuZzo6dHJ7J2ludmFsaWQgd2lucyBhZGRyZXNzJ307CgkJCWdv dG8gRVJST1I7CgkJfQoJICAgIH0KCSAgICBpZiAoJGRoY3BzZXR0aW5nc3siV0lOUzJfJHtpdGZ9 In0pIHsKCQlpZiAoISgmR2VuZXJhbDo6dmFsaWRpcCgkZGhjcHNldHRpbmdzeyJXSU5TMl8ke2l0 Zn0ifSkpKQl7CgkJCSRlcnJvcm1lc3NhZ2UgPSAiREhDUCBvbiAke2l0Zn06ICIgLiAkTGFuZzo6 dHJ7J2ludmFsaWQgd2lucyBhZGRyZXNzJ307CgkJCWdvdG8gRVJST1I7CgkJfQoJCWlmICghICRk aGNwc2V0dGluZ3N7IldJTlMxXyR7aXRmfSJ9ICkgewoJCQkkZXJyb3JtZXNzYWdlID0gIkRIQ1Ag b24gJHtpdGZ9OiAiIC4gJExhbmc6OnRyeydjYW5ub3Qgc3BlY2lmeSBzZWNvbmRhcnkgd2lucyB3 aXRob3V0IHNwZWNpZnlpbmcgcHJpbWFyeSd9OwoJCQlnb3RvIEVSUk9SOwoJCX0JCQoJICAgIH0K CSAgICBpZiAoJGRoY3BzZXR0aW5nc3siTkVYVF8ke2l0Zn0ifSkgewoJCWlmICghKCZHZW5lcmFs Ojp2YWxpZGlwKCRkaGNwc2V0dGluZ3N7Ik5FWFRfJHtpdGZ9In0pKSkgewoJCQkkZXJyb3JtZXNz YWdlID0gIm5leHQtc2VydmVyIG9uICR7aXRmfTogIiAuICRMYW5nOjp0cnsnaW52YWxpZCBpcCd9 OwoJCQlnb3RvIEVSUk9SOwoJCX0KCSAgICB9CgkgICAgaWYgKCRkaGNwc2V0dGluZ3N7Ik5UUDFf JHtpdGZ9In0pIHsKCQlpZiAoISgmR2VuZXJhbDo6dmFsaWRpcCgkZGhjcHNldHRpbmdzeyJOVFAx XyR7aXRmfSJ9KSkpIHsKCQkJJGVycm9ybWVzc2FnZSA9ICJESENQIG9uICR7aXRmfTogIiAuICRM YW5nOjp0cnsnaW52YWxpZCBwcmltYXJ5IG50cCd9OwoJCQlnb3RvIEVSUk9SOwoJCX0KCQlpZiAo JGRoY3BzZXR0aW5nc3siTlRQMV8ke2l0Zn0ifSBlcSAkbmV0c2V0dGluZ3N7IiR7aXRmfV9BRERS RVNTIn0gJiYgKCR0aW1lc2V0dGluZ3N7J0VOQUJMRUNMTlRQJ30gbmUgJ29uJykpIHsKCQkJJHdh cm5OVFBtZXNzYWdlID0gIkRIQ1Agb24gJHtpdGZ9OiAiIC4gJExhbmc6OnRyeydsb2NhbCBudHAg c2VydmVyIHNwZWNpZmllZCBidXQgbm90IGVuYWJsZWQnfTsKCQkJI2dvdG8gRVJST1I7CgkJfQoJ ICAgIH0KCSAgICBpZiAoJGRoY3BzZXR0aW5nc3siTlRQMl8ke2l0Zn0ifSkgewoJCWlmICghKCZH ZW5lcmFsOjp2YWxpZGlwKCRkaGNwc2V0dGluZ3N7Ik5UUDJfJHtpdGZ9In0pKSkgewoJCQkkZXJy b3JtZXNzYWdlID0gIkRIQ1Agb24gJHtpdGZ9OiAiIC4gJExhbmc6OnRyeydpbnZhbGlkIHNlY29u ZGFyeSBudHAnfTsKCQkJZ290byBFUlJPUjsKCQl9CgkJaWYgKCRkaGNwc2V0dGluZ3N7Ik5UUDJf JHtpdGZ9In0gZXEgJG5ldHNldHRpbmdzeyIke2l0Zn1fQUREUkVTUyJ9ICYmICgkdGltZXNldHRp bmdzeydFTkFCTEVDTE5UUCd9IG5lICdvbicpKSB7CgkJCSR3YXJuTlRQbWVzc2FnZSA9ICJESENQ IG9uICR7aXRmfTogIiAuICRMYW5nOjp0cnsnbG9jYWwgbnRwIHNlcnZlciBzcGVjaWZpZWQgYnV0 IG5vdCBlbmFibGVkJ307CgkJCSNnb3RvIEVSUk9SOwoJCX0KCQlpZiAoISAkZGhjcHNldHRpbmdz eyJOVFAxXyR7aXRmfSJ9KSB7CgkJCSRlcnJvcm1lc3NhZ2UgPSAiREhDUCBvbiAke2l0Zn06ICIg LiAkTGFuZzo6dHJ7J2Nhbm5vdCBzcGVjaWZ5IHNlY29uZGFyeSBudHAgd2l0aG91dCBzcGVjaWZ5 aW5nIHByaW1hcnknfTsKCQkJZ290byBFUlJPUjsKCQl9CgkgICAgfQoJfSAjIGVuYWJsZWQKICAg IH0jbG9vcCBpbnRlcmZhY2UgdmVyaWZ5CgogICAgbWFwIChkZWxldGUgKCRkaGNwc2V0dGluZ3N7 JF99KSAsQG5vc2F2ZWQsJ0FDVElPTicsJ0tFWTEnLCdLRVkyJywncScpOwkjIE11c3Qgbm90IGJl IHNhdmVkCiAgICAmR2VuZXJhbDo6d3JpdGVoYXNoKCRzZXR0aW5nLCBcJWRoY3BzZXR0aW5ncyk7 CQkjIFNhdmUgZ29vZCBzZXR0aW5ncwogICAgJGRoY3BzZXR0aW5nc3snQUNUSU9OJ30gPSAkTGFu Zzo6dHJ7J3NhdmUnfTsJCSMgY3JlYXRlIGFuICdBQ1RJT04nCiAgICBtYXAgKCRkaGNwc2V0dGlu Z3N7JF99ID0gJycsQG5vc2F2ZWQsJ0tFWTEnLCdLRVkyJyk7CSMgYW5kIHJlaW5pdCB2YXJzIHRv IGVtcHR5CiAgICAmYnVpbGRjb25mOwogICAgRVJST1I6ICAgCQkJCQkJCSMgTGVhdmUgdGhlIGZh dWx0eSBmaWVsZCB1bnRvdWNoZWQKfSBlbHNlIHsKICAgICZHZW5lcmFsOjpyZWFkaGFzaCgkc2V0 dGluZywgXCVkaGNwc2V0dGluZ3MpOyAgIAkJIyBHZXQgc2F2ZWQgc2V0dGluZ3MgYW5kIHJlc2V0 IHRvIGdvb2QgaWYgbmVlZGVkCn0KCiMjIFNvcnRpbmcgb2YgZml4ZWQgbGVhc2VzCmlmICgkRU5W eydRVUVSWV9TVFJJTkcnfSA9fiAvXkZFVEhFUnxeRklQQUREUi8gKSB7CiAgICBteSAkbmV3c29y dD0kRU5WeydRVUVSWV9TVFJJTkcnfTsKICAgIG15ICRhY3Q9JGRoY3BzZXR0aW5nc3snU09SVF9G TEVBU0VMSVNUJ307CiAgICAjUmV2ZXJzZSBhY3R1YWwgc29ydCA/CiAgICBpZiAoJGFjdCA9fiAk bmV3c29ydCkgewoJbXkgJFJldj0nJzsKCWlmICgkYWN0ICF+ICdSZXYnKSB7CgkgICAgJFJldj0n UmV2JzsKCX0KCSRuZXdzb3J0Lj0kUmV2OwogICAgfQogICAgJGRoY3BzZXR0aW5nc3snU09SVF9G TEVBU0VMSVNUJ309JG5ld3NvcnQ7CiAgICBtYXAgKGRlbGV0ZSAoJGRoY3BzZXR0aW5nc3skX30p ICxAbm9zYXZlZCwnQUNUSU9OJywnS0VZMScsJ0tFWTInLCAncScpOwkjIE11c3QgbmV2ZXIgYmUg c2F2ZWQKICAgICZHZW5lcmFsOjp3cml0ZWhhc2goJHNldHRpbmcsIFwlZGhjcHNldHRpbmdzKTsK ICAgICZzb3J0Y3VycmVudDI7CiAgICAkZGhjcHNldHRpbmdzeydBQ1RJT04nfSA9ICdTT1JUJzsJ CQkjIGNyZWF0ZSBhbiAnQUNUSU9OJwogICAgbWFwICgkZGhjcHNldHRpbmdzeyRffSA9ICcnLEBu b3NhdmVkLCdLRVkxJywnS0VZMicpOyMgYW5kIHJlaW5pdCB2YXJzIHRvIGVtcHR5IAp9CgojU29y dGluZyBvZiBhbGxvY2F0ZWQgbGVhc2VzCiZIZWFkZXI6OkNoZWNrU29ydE9yZGVyOwoKCiMjIE5v dyBtYW5pcHVsYXRlIHRoZSB0d28gbXVsdGktbGluZSBsaXN0IHdpdGggU2V0dGluZ3MyLiAKIyAg JzEnIHN1ZmZpeCBpcyBmb3IgQURWQU5DRUQgT1BUSU9OUwojICAnMicgc3VmZml4IGlzIGZvciBG SVhFRCBMRUFTRVMKCiMgVG9nZ2xlIGVuYWJsZS9kaXNhYmxlIGZpZWxkIG9uIHNwZWNpZmllZCBv cHRpb25zLgoKaWYgKCRkaGNwc2V0dGluZ3N7J0FDVElPTid9IGVxICRMYW5nOjp0cnsndG9nZ2xl IGVuYWJsZSBkaXNhYmxlJ30uJzEnKSB7CiAgICAjbW92ZSBvdXQgbmV3IGxpbmUKICAgIGNob21w KEBjdXJyZW50MVskZGhjcHNldHRpbmdzeydLRVkxJ31dKTsKICAgIG15IEB0ZW1wID0gc3BsaXQo L1x0LyxAY3VycmVudDFbJGRoY3BzZXR0aW5nc3snS0VZMSd9XSk7CQkjdXNlIFRBQiBzZXBhcmF0 b3IgIQogICAgJHRlbXBbMF0gPSAkdGVtcFswXSBlcSAnb24nID8gJycgOiAnb24nOyAgICAjIFRv Z2dsZSB0aGUgZmllbGQKICAgIEBjdXJyZW50MVskZGhjcHNldHRpbmdzeydLRVkxJ31dID0gam9p biAoIlx0IixAdGVtcCkuIlxuIjsKICAgICRkaGNwc2V0dGluZ3N7J0tFWTEnfSA9ICcnOyAjIEVu ZCBlZGl0IG1vZGUKICAgICZHZW5lcmFsOjpsb2coJExhbmc6OnRyeydkaGNwIGFkdm9wdCBtb2Rp ZmllZCd9KTsKICAgIG9wZW4oRklMRSwgIj4kZmlsZW5hbWUxIikgb3IgZGllICdVbmFibGUgdG8g b3BlbiBkaGNwIGFkdmFuY2VkIG9wdGlvbnMgZmlsZS4nOwogICAgcHJpbnQgRklMRSBAY3VycmVu dDE7CiAgICBjbG9zZShGSUxFKTsKCQogICAgI1dyaXRlIGNoYW5nZXMgdG8gZGhjcGQuY29uZi4K ICAgICZidWlsZGNvbmY7Cn0KCiAgICAKCmlmICgkZGhjcHNldHRpbmdzeydBQ1RJT04nfSBlcSAk TGFuZzo6dHJ7J2FkZCd9LicxJyAmJgoJJGRoY3BzZXR0aW5nc3snU1VCTUlUJ30gbmUgJExhbmc6 OnRyeydkaGNwIGFkdm9wdCBoZWxwJ30pIHsKICAgICRkaGNwc2V0dGluZ3N7J0FEVk9QVF9OQU1F J30gPX4gcy9bXiBcdy1dLy9nOyAgCSMgcHJldmVudCBleGVjdXRpb24gb2YgY29kZSBieSByZW1v dmluZyBldmVyeXRoaW5nIGV4Y2VwdCBsZXR0ZXJzL3NwYWNlCiAgICAkZGhjcHNldHRpbmdzeydB RFZPUFRfREFUQSd9ID1+IHMvYC8vZzsJCSMgYmFjayB0aWsgYCA/IG5vdCBhbGxvd2VkICEKCiAg ICBpZiAoJGRoY3BzZXR0aW5nc3snQURWT1BUX0RBVEEnfSBlcSAnJykgewoJJGVycm9ybWVzc2Fn ZT0kTGFuZzo6dHJ7J2RoY3AgYWR2b3B0IGJsYW5rIHZhbHVlJ307CiAgICB9CiAgICAKICAgICMg VGVzdCBmb3IgYSBuZXcgb3B0aW9uIGRlZmluaXRpb24gc3RyaW5nIChqb2luIGZpZWxkIG5hbWUg JiBkYXRhKQogICAgaWYgKEV4aXN0TmV3T3B0aW9uRGVmaW5pdGlvbiAoJGRoY3BzZXR0aW5nc3sn QURWT1BUX05BTUUnfSAuICcgJyAuICRkaGNwc2V0dGluZ3N7J0FEVk9QVF9EQVRBJ30pKSB7Cgkj b25seSBlZGl0IHBlcm1pdHRlZCBpZiBvcHRpb24gZGVmaW5pdGlvbiBleGlzdHMKCSRlcnJvcm1l c3NhZ2UgPSAkTGFuZzo6dHJ7J2RoY3AgYWR2b3B0IGRlZmluaXRpb24gZXhpc3RzJ30gaWYgKCRk aGNwc2V0dGluZ3N7J0tFWTEnfSBlcSAnJyk7CgkkZGhjcHNldHRpbmdzeydBRFZPUFRfRU5BQkxF RCd9ID0gJ29uJzsJCQkjIGZvcmNlIGFjdGl2ZQoJbWFwICgkZGhjcHNldHRpbmdzeyJBRFZPUFRf U0NPUEVfJF8ifSA9ICdvZmYnLCBASVRGcyk7CSMgZm9yY2UgZ2xvYmFsCiAgICB9IGVsc2lmIChB ZGROZXdPcHRpb25EZWZpbml0aW9uICgkZGhjcHNldHRpbmdzeydBRFZPUFRfTkFNRSd9IC4gJyAn IC4gJGRoY3BzZXR0aW5nc3snQURWT1BUX0RBVEEnfSkpIHsKCSN3YXMgYSBuZXcgb3B0aW9uIGRl ZmluaXRpb24KCSRkaGNwc2V0dGluZ3N7J0FEVk9QVF9FTkFCTEVEJ30gPSAnb24nOwkJCSMgZm9y Y2UgYWN0aXZlCgltYXAgKCRkaGNwc2V0dGluZ3N7IkFEVk9QVF9TQ09QRV8kXyJ9ID0gJ29mZics IEBJVEZzKTsJIyBmb3JjZSBnbG9iYWwKICAgIH0gZWxzaWYgKFZhbGlkTmV3T3B0aW9uICgkZGhj cHNldHRpbmdzeydBRFZPUFRfTkFNRSd9IC4gJyAnIC4gJGRoY3BzZXR0aW5nc3snQURWT1BUX0RB VEEnfSkpIHsKCSN3YXMgYSBuZXcgb3B0aW9uCiAgICB9IGVsc2lmICghIGBncmVwICJcJG9wdGlv biAkZGhjcHNldHRpbmdzeydBRFZPUFRfTkFNRSd9ICIgJGZpbGVuYW1lM2ApIHsKCSRlcnJvcm1l c3NhZ2U9JExhbmc6OnRyeydkaGNwIGFkdm9wdCB1bmtub3duJ30uJzogJy4kZGhjcHNldHRpbmdz eydBRFZPUFRfTkFNRSd9OwogICAgfQoKICAgIHVubGVzcyAoJGVycm9ybWVzc2FnZSkgewoJCglt eSAkc2NvcGUgPSAnJzsKCWZvcmVhY2ggbXkgJGl0ZiAoQElURnMpIHsgICMgYnVpbHMgIlJFRCxH UkVFTixPUkFOR0UsLi4uIGJhc2VkIG9uIHNlbGVjdGlvbgoJICAgICRzY29wZSAuPSAkZGhjcHNl dHRpbmdzeyJBRFZPUFRfU0NPUEVfJHtpdGZ9In0gZXEgJ29uJyA/ICJcdCRpdGYiIDogIlx0b2Zm IiA7Cgl9CglpZiAoJGRoY3BzZXR0aW5nc3snS0VZMSd9IGVxICcnKSB7ICNhZGQgb3IgZWRpdCA/ ICBUQUIgc2VwYXJhdG9yICEKCSAgICB1bnNoaWZ0IChAY3VycmVudDEsICIkZGhjcHNldHRpbmdz eydBRFZPUFRfRU5BQkxFRCd9XHQkZGhjcHNldHRpbmdzeydBRFZPUFRfTkFNRSd9XHQkZGhjcHNl dHRpbmdzeydBRFZPUFRfREFUQSd9JHNjb3BlXG4iKTsKCSAgICAmR2VuZXJhbDo6bG9nKCRMYW5n Ojp0cnsnZGhjcCBhZHZvcHQgYWRkZWQnfSk7Cgl9IGVsc2UgewoJICAgIEBjdXJyZW50MVskZGhj cHNldHRpbmdzeydLRVkxJ31dID0gIiRkaGNwc2V0dGluZ3N7J0FEVk9QVF9FTkFCTEVEJ31cdCRk aGNwc2V0dGluZ3N7J0FEVk9QVF9OQU1FJ31cdCRkaGNwc2V0dGluZ3N7J0FEVk9QVF9EQVRBJ30k c2NvcGVcbiI7CgkgICAgJGRoY3BzZXR0aW5nc3snS0VZMSd9ID0gJyc7ICAgICAgICMgRW5kIGVk aXQgbW9kZQoJICAgICZHZW5lcmFsOjpsb2coJExhbmc6OnRyeydkaGNwIGFkdm9wdCBtb2RpZmll ZCd9KTsKCX0KCiAgICAgICAgI1dyaXRlIGNoYW5nZXMgdG8gZGhjcGQuY29uZi4KICAgICAgICAm c29ydGN1cnJlbnQxOyAgICAjIHNvcnQgbmV3bHkgYWRkZWQvbW9kaWZpZWQgZW50cnkKICAgICAg ICAmYnVpbGRjb25mOyAgICAgICAjIGJlZm9yZSBjYWxsaW5nIGJ1aWxkY29uZiB3aGljaCB1c2Ug Zml4ZWQgbGVhc2UgZmlsZSAhCiAgICB9Cn0KCmlmICgkZGhjcHNldHRpbmdzeydBQ1RJT04nfSBl cSAkTGFuZzo6dHJ7J2VkaXQnfS4nMScpIHsKICAgICNtb3ZlIG91dCBuZXcgbGluZQogICAgbXkg JGxpbmUgPSBAY3VycmVudDFbJGRoY3BzZXR0aW5nc3snS0VZMSd9XTsKICAgIGNob21wKCRsaW5l KTsKICAgIG15IEB0ZW1wID0gc3BsaXQoL1x0LywgJGxpbmUpOwogICAgJGRoY3BzZXR0aW5nc3sn QURWT1BUX0VOQUJMRUQnfT0kdGVtcFswXTsKICAgICRkaGNwc2V0dGluZ3N7J0FEVk9QVF9OQU1F J309JHRlbXBbMV07CiAgICAkZGhjcHNldHRpbmdzeydBRFZPUFRfREFUQSd9PSR0ZW1wWzJdOwoK ICAgICMgcmVhZCBuZXh0IGZpZWxkcyB3aGljaCBhcmUgdGhlIG5hbWUgKGNvbG9yKSBvZiBhbiBp bnRlcmZhY2UgaWYgdGhpcyBpbnRlcmZhY2UgaXMgc2NvcGVkCiAgICBmb3IgKG15ICRrZXk9MDsg JGtleTxASVRGczsgJGtleSsrKSB7CglteSAkaXRmID0gJHRlbXBbMyska2V5XTsKCWlmICgkaXRm IG5lICdvZmYnKSAjIE9ubHkgaXMgYW4gaW50ZXJmYWNlIG5hbWUgaXMgcmVhZAoJewoJICAgICRk aGNwc2V0dGluZ3N7IkFEVk9QVF9TQ09QRV8ke2l0Zn0ifSA9ICdvbic7Cgl9ICAgIAogICAgfQp9 CgppZiAoJGRoY3BzZXR0aW5nc3snQUNUSU9OJ30gZXEgJExhbmc6OnRyeydyZW1vdmUnfS4nMScp IHsKICAgIHNwbGljZSAoQGN1cnJlbnQxLCRkaGNwc2V0dGluZ3N7J0tFWTEnfSwxKTsKICAgIG9w ZW4oRklMRSwgIj4kZmlsZW5hbWUxIikgb3IgZGllICdVbmFibGUgdG8gb3BlbiBkaGNwIGFkdmFu Y2VkIG9wdGlvbnMgZmlsZS4nOwogICAgcHJpbnQgRklMRSBAY3VycmVudDE7CiAgICBjbG9zZShG SUxFKTsKICAgICRkaGNwc2V0dGluZ3N7J0tFWTEnfSA9ICcnOwkJCQkjIEVuZCByZW1vdmUgbW9k ZQogICAgJkdlbmVyYWw6OmxvZygkTGFuZzo6dHJ7J2RoY3AgYWR2b3B0IHJlbW92ZWQnfSk7CiAg ICAjV3JpdGUgY2hhbmdlcyB0byBkaGNwZC5jb25mLgogICAgJmJ1aWxkY29uZjsKfQojZW5kIEtF WTEKCgojIFRvZ2dsZSBlbmFibGUvZGlzYWJsZSBmaWVsZCBvbiBzcGVjaWZpZWQgbGVhc2UuCmlm ICgkZGhjcHNldHRpbmdzeydBQ1RJT04nfSBlcSAkTGFuZzo6dHJ7J3RvZ2dsZSBlbmFibGUgZGlz YWJsZSd9LicyJykgewogICAgI21vdmUgb3V0IG5ldyBsaW5lCiAgICBjaG9tcChAY3VycmVudDJb JGRoY3BzZXR0aW5nc3snS0VZMid9XSk7CiAgICBteSBAdGVtcCA9IHNwbGl0KC9cLC8sQGN1cnJl bnQyWyRkaGNwc2V0dGluZ3N7J0tFWTInfV0pOwogICAgJHRlbXBbMl0gPSAkdGVtcFsyXSBlcSAn b24nID8gJycgOiAnb24nOyAgICAjIFRvZ2dsZSB0aGUgZmllbGQKICAgIEBjdXJyZW50MlskZGhj cHNldHRpbmdzeydLRVkyJ31dID0gam9pbiAoJywnLEB0ZW1wKS4iXG4iOwogICAgJGRoY3BzZXR0 aW5nc3snS0VZMid9ID0gJyc7ICMgRW5kIGVkaXQgbW9kZQogICAgJkdlbmVyYWw6OmxvZygkTGFu Zzo6dHJ7J2ZpeGVkIGlwIGxlYXNlIG1vZGlmaWVkJ30pOwogICAgb3BlbihGSUxFLCAiPiRmaWxl bmFtZTIiKSBvciBkaWUgJ1VuYWJsZSB0byBvcGVuIGZpeGVkIGxlYXNlcyBmaWxlLic7CiAgICBw cmludCBGSUxFIEBjdXJyZW50MjsKICAgIGNsb3NlKEZJTEUpOwoJCiAgICAjV3JpdGUgY2hhbmdl cyB0byBkaGNwZC5jb25mLgogICAgJmJ1aWxkY29uZjsKfQoKaWYgKCRkaGNwc2V0dGluZ3N7J0FD VElPTid9IGVxICRMYW5nOjp0cnsnYWRkJ30uJzInKSB7CiAgICAkZGhjcHNldHRpbmdzeydGSVhf TUFDJ30gPX4gdHIvLS86LzsKICAgIHVubGVzcygmR2VuZXJhbDo6dmFsaWRpcCgkZGhjcHNldHRp bmdzeydGSVhfQUREUid9KSkgeyAkZXJyb3JtZXNzYWdlID0gJExhbmc6OnRyeydpbnZhbGlkIGZp eGVkIGlwIGFkZHJlc3MnfTsgfQogICAgdW5sZXNzKCZHZW5lcmFsOjp2YWxpZG1hYygkZGhjcHNl dHRpbmdzeydGSVhfTUFDJ30pKSB7ICRlcnJvcm1lc3NhZ2UgPSAkTGFuZzo6dHJ7J2ludmFsaWQg Zml4ZWQgbWFjIGFkZHJlc3MnfTsgfQogICAgaWYgKCRkaGNwc2V0dGluZ3N7J0ZJWF9ORVhUQURE Uid9KSB7CiAgICAgICAgdW5sZXNzKCZHZW5lcmFsOjp2YWxpZGlwKCRkaGNwc2V0dGluZ3N7J0ZJ WF9ORVhUQUREUid9KSkgeyAkZXJyb3JtZXNzYWdlID0gJExhbmc6OnRyeydpbnZhbGlkIGZpeGVk IGlwIGFkZHJlc3MnfTsgfQogICAgfQoJCiAgICBteSAka2V5ID0gMDsKICAgIENIRUNLOmZvcmVh Y2ggbXkgJGxpbmUgKEBjdXJyZW50MikgewogICAgICAgIG15IEB0ZW1wID0gc3BsaXQoL1wsLywk bGluZSk7CiAgICAgICAgaWYoJGRoY3BzZXR0aW5nc3snS0VZMid9IG5lICRrZXkpIHsKIAkgICAg IyBzYW1lIE1BQyBpcyBPSyBvbiBkaWZmZXJlbnQgc3VibmV0cy4gVGhpcyB0ZXN0IGlzIG5vdCBj b21wbGV0ZSBiZWNhdXNlCgkgICAgIyBpZiBpcCBhcmUgbm90IGluc2lkZSBhIGtub3duIHN1Ym5l dCwgSSBkb24ndCB3YXJuLgoJICAgICMgQWxzbyBpdCBtYXkgYmUgbmVlZGVkIHRvIHB1dCBkdXBs aWNhdGUgZml4ZWQgbGVhc2UgaW4gdGhlaXIgcmlnaHQgc3VibmV0IGRlZmluaXRpb24uLgoJICAg IGZvcmVhY2ggbXkgJGl0ZiAoQElURnMpIHsKCQlteSAkc2NvcGVkID0gJkdlbmVyYWw6OklwSW5T dWJuZXQoJGRoY3BzZXR0aW5nc3snRklYX0FERFInfSwKCQkJCQkJICAkbmV0c2V0dGluZ3N7IiR7 aXRmfV9ORVRBRERSRVNTIn0sIAoJCQkJCQkgICRuZXRzZXR0aW5nc3siJHtpdGZ9X05FVE1BU0si fSkgJiYKCQkJCQkJICAkZGhjcHNldHRpbmdzeyJFTkFCTEVfJHtpdGZ9In0gZXEgJ29uJzsKCQlp ZiAoICRzY29wZWQgJiYKCQkgICAgKGxjKCRkaGNwc2V0dGluZ3N7J0ZJWF9NQUMnfSkgZXEgbGMo JHRlbXBbMF0pKSAmJgoJCSAgICAmR2VuZXJhbDo6SXBJblN1Ym5ldCgkdGVtcFsxXSwKCQkJCQkg JG5ldHNldHRpbmdzeyIke2l0Zn1fTkVUQUREUkVTUyJ9LCAKCQkJCQkgJG5ldHNldHRpbmdzeyIk e2l0Zn1fTkVUTUFTSyJ9KSkgewoJCSAgICAkZXJyb3JtZXNzYWdlID0gIiRMYW5nOjp0cnsnbWFj IGFkZHJlc3MgaW4gdXNlJ30gJGRoY3BzZXR0aW5nc3snRklYX01BQyd9IjsKCQkgICAgbGFzdCBD SEVDSzsKCQl9CgkgICAgfQoJfQoJJGtleSsrOwogICAgfQoKICAgIHVubGVzcyAoJGVycm9ybWVz c2FnZSkgewoJJGRoY3BzZXR0aW5nc3snRklYX1JFTUFSSyd9ID0gJkhlYWRlcjo6Y2xlYW5odG1s KCRkaGNwc2V0dGluZ3N7J0ZJWF9SRU1BUksnfSk7CgkkZGhjcHNldHRpbmdzeydGSVhfTkVYVEFE RFInfSA9ICZIZWFkZXI6OmNsZWFuaHRtbCgkZGhjcHNldHRpbmdzeydGSVhfTkVYVEFERFInfSk7 CgkkZGhjcHNldHRpbmdzeydGSVhfRklMRU5BTUUnfSA9ICZIZWFkZXI6OmNsZWFuaHRtbCgkZGhj cHNldHRpbmdzeydGSVhfRklMRU5BTUUnfSk7CgkkZGhjcHNldHRpbmdzeydGSVhfUk9PVFBBVEgn fSA9ICZIZWFkZXI6OmNsZWFuaHRtbCgkZGhjcHNldHRpbmdzeydGSVhfUk9PVFBBVEgnfSk7Cglp ZiAoJGRoY3BzZXR0aW5nc3snS0VZMid9IGVxICcnKSB7ICNhZGQgb3IgZWRpdCA/CgkgICAgdW5z aGlmdCAoQGN1cnJlbnQyLCAiJGRoY3BzZXR0aW5nc3snRklYX01BQyd9LCRkaGNwc2V0dGluZ3N7 J0ZJWF9BRERSJ30sJGRoY3BzZXR0aW5nc3snRklYX0VOQUJMRUQnfSwkZGhjcHNldHRpbmdzeydG SVhfTkVYVEFERFInfSwkZGhjcHNldHRpbmdzeydGSVhfRklMRU5BTUUnfSwkZGhjcHNldHRpbmdz eydGSVhfUk9PVFBBVEgnfSwkZGhjcHNldHRpbmdzeydGSVhfUkVNQVJLJ31cbiIpOwoJICAgIG9w ZW4oRklMRSwgIj4kZmlsZW5hbWUyIikgb3IgZGllICdVbmFibGUgdG8gb3BlbiBmaXhlZCBsZWFz ZSBmaWxlLic7CgkgICAgcHJpbnQgRklMRSBAY3VycmVudDI7CgkgICAgY2xvc2UoRklMRSk7Cgkg ICAgJkdlbmVyYWw6OmxvZygkTGFuZzo6dHJ7J2ZpeGVkIGlwIGxlYXNlIGFkZGVkJ30pOwoKCSAg ICAjIEVudGVyIGVkaXQgbW9kZQoJICAgICRkaGNwc2V0dGluZ3N7J0tFWTInfSA9IDA7Cgl9IGVs c2UgewoJICAgIEBjdXJyZW50MlskZGhjcHNldHRpbmdzeydLRVkyJ31dID0gIiRkaGNwc2V0dGlu Z3N7J0ZJWF9NQUMnfSwkZGhjcHNldHRpbmdzeydGSVhfQUREUid9LCRkaGNwc2V0dGluZ3N7J0ZJ WF9FTkFCTEVEJ30sJGRoY3BzZXR0aW5nc3snRklYX05FWFRBRERSJ30sJGRoY3BzZXR0aW5nc3sn RklYX0ZJTEVOQU1FJ30sJGRoY3BzZXR0aW5nc3snRklYX1JPT1RQQVRIJ30sJGRoY3BzZXR0aW5n c3snRklYX1JFTUFSSyd9XG4iOwoJICAgICRkaGNwc2V0dGluZ3N7J0tFWTInfSA9ICcnOyAgICAg ICAjIEVuZCBlZGl0IG1vZGUKCSAgICAmR2VuZXJhbDo6bG9nKCRMYW5nOjp0cnsnZml4ZWQgaXAg bGVhc2UgbW9kaWZpZWQnfSk7CgoJICAgICMgc29ydCBuZXdseSBhZGRlZC9tb2RpZmllZCBlbnRy eQoJICAgICZzb3J0Y3VycmVudDI7Cgl9CgogICAgICAgICNXcml0ZSBjaGFuZ2VzIHRvIGRoY3Bk LmNvbmYuCiAgICAgICAgJmJ1aWxkY29uZjsgICAgICAgIyBiZWZvcmUgY2FsbGluZyBidWlsZGNv bmYgd2hpY2ggdXNlIGZpeGVkIGxlYXNlIGZpbGUgIQogICAgfQp9CgppZiAoJGRoY3BzZXR0aW5n c3snQUNUSU9OX0FMTCd9IGVxICcrJykgewogICAgbXkgJG5ld3MgPSAwOwogICAgZm9yZWFjaCAo a2V5cyAlZGhjcHNldHRpbmdzKSB7CiAgICAgICAgaWYgKC9eKFxkK1wuXGQrXC5cZCtcLlxkKykt KFswLTlhLWZBLUY6XSspJC8pIHsgICAgICMgY2hlY2tlZCBuYW1lcyBhcmUgaW5kZXggb2YgdGhl IGxpbmUKICAgICAgICAgICAgbXkgJGlwPSQxOwogICAgICAgICAgICBteSAkbWFjPSQyOwogICAg ICAgICAgICBpZiAoIWdyZXAgKC8kMi8sQGN1cnJlbnQyKSkgewogICAgICAgICAgICAgICAgdW5z aGlmdCAoQGN1cnJlbnQyLCAiJG1hYywkaXAsb24sLCwsaW1wb3J0ZWRcbiIpOwogICAgICAgICAg ICAgICAgJG5ld3MrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICgkbmV3 cykgewogICAgICAgICNXcml0ZSBjaGFuZ2VzIHRvIGRoY3BkLmNvbmYuCiAgICAgICAgJHdhcm5O VFBtZXNzYWdlID0gJExhbmc6OnRyeydmaXhlZCBpcCBsZWFzZSBhZGRlZCd9LiIoJG5ld3MpIjsK ICAgICAgICAmR2VuZXJhbDo6bG9nKCR3YXJuTlRQbWVzc2FnZSk7CiAgICAgICAgJnNvcnRjdXJy ZW50MjsgICAgIyBzb3J0IG5ld2x5IGFkZGVkL21vZGlmaWVkIGVudHJ5CiAgICAgICAgJmJ1aWxk Y29uZjsgICAgICAgIyBiZWZvcmUgY2FsbGluZyBidWlsZGNvbmYgd2hpY2ggdXNlIGZpeGVkIGxl YXNlIGZpbGUgIQogICAgfQp9CgppZiAoJGRoY3BzZXR0aW5nc3snQUNUSU9OJ30gZXEgJExhbmc6 OnRyeydlZGl0J30uJzInKSB7CiAgICAjbW92ZSBvdXQgbmV3IGxpbmUKICAgIG15ICRsaW5lID0g QGN1cnJlbnQyWyRkaGNwc2V0dGluZ3N7J0tFWTInfV07CiAgICBjaG9tcCgkbGluZSk7CiAgICBt eSBAdGVtcCA9IHNwbGl0KC9cLC8sICRsaW5lKTsKICAgICRkaGNwc2V0dGluZ3N7J0ZJWF9NQUMn fT0kdGVtcFswXTsKICAgICRkaGNwc2V0dGluZ3N7J0ZJWF9BRERSJ309JHRlbXBbMV07CiAgICAk ZGhjcHNldHRpbmdzeydGSVhfRU5BQkxFRCd9PSR0ZW1wWzJdOwogICAgJGRoY3BzZXR0aW5nc3sn RklYX05FWFRBRERSJ309JHRlbXBbM107CiAgICAkZGhjcHNldHRpbmdzeydGSVhfRklMRU5BTUUn fT0kdGVtcFs0XTsKICAgICRkaGNwc2V0dGluZ3N7J0ZJWF9ST09UUEFUSCd9PSR0ZW1wWzVdOwog ICAgJGRoY3BzZXR0aW5nc3snRklYX1JFTUFSSyd9PSR0ZW1wWzZdOwp9CgppZiAoJGRoY3BzZXR0 aW5nc3snQUNUSU9OJ30gZXEgJExhbmc6OnRyeydyZW1vdmUnfS4nMicpIHsKICAgIHNwbGljZSAo QGN1cnJlbnQyLCRkaGNwc2V0dGluZ3N7J0tFWTInfSwxKTsKICAgIG9wZW4oRklMRSwgIj4kZmls ZW5hbWUyIikgb3IgZGllICdVbmFibGUgdG8gb3BlbiBmaXhlZCBsZWFzZSBmaWxlLic7CiAgICBw cmludCBGSUxFIEBjdXJyZW50MjsKICAgIGNsb3NlKEZJTEUpOwogICAgJGRoY3BzZXR0aW5nc3sn S0VZMid9ID0gJyc7CQkJCSMgRW5kIHJlbW92ZSBtb2RlCiAgICAmR2VuZXJhbDo6bG9nKCRMYW5n Ojp0cnsnZml4ZWQgaXAgbGVhc2UgcmVtb3ZlZCd9KTsKICAgICNXcml0ZSBjaGFuZ2VzIHRvIGRo Y3BkLmNvbmYuCiAgICAmYnVpbGRjb25mOwp9CiNlbmQgS0VZMiBkZWZpbmVkCgoKCgppZiAoJGRo Y3BzZXR0aW5nc3snQUNUSU9OJ30gZXEgJycgKSB7ICMgRmlyc3QgbGF1bmNoIGZyb20gR1VJCgog ICAgIyBTZXQgZGVmYXVsdCBESENQIHZhbHVlcyBvbmx5IGlmIGJsYW5rIGFuZCBkaXNhYmxlZAog ICAgZm9yZWFjaCBteSAkaXRmIChASVRGcykgewoJaWYgKCRkaGNwc2V0dGluZ3N7IkVOQUJMRV8k e2l0Zn0ifSBuZSAnb24nICkgewoJICAgICRkaGNwc2V0dGluZ3N7IkROUzFfJHtpdGZ9In0gPSAk bmV0c2V0dGluZ3N7IiR7aXRmfV9BRERSRVNTIn07CgkgICAgJGRoY3BzZXR0aW5nc3siREVGQVVM VF9MRUFTRV9USU1FXyR7aXRmfSJ9ID0gJzYwJzsKCSAgICAkZGhjcHNldHRpbmdzeyJNQVhfTEVB U0VfVElNRV8ke2l0Zn0ifSA9ICcxMjAnOwoJICAgICRkaGNwc2V0dGluZ3N7IkRPTUFJTl9OQU1F XyR7aXRmfSJ9ID0gJG1haW5zZXR0aW5nc3snRE9NQUlOTkFNRSd9OwoJfQogICAgfQogICAgJGRo Y3BzZXR0aW5nc3snRklYX0VOQUJMRUQnfSA9ICdvbic7Cn0KCiZIZWFkZXI6Om9wZW5wYWdlKCRM YW5nOjp0cnsnZGhjcCBjb25maWd1cmF0aW9uJ30sIDEsICcnKTsKJkhlYWRlcjo6b3BlbmJpZ2Jv eCgnMTAwJScsICdsZWZ0JywgJycsICRlcnJvcm1lc3NhZ2UpOwoKaWYgKCRlcnJvcm1lc3NhZ2Up IHsKICAgICZIZWFkZXI6Om9wZW5ib3goJzEwMCUnLCAnbGVmdCcsICRMYW5nOjp0cnsnZXJyb3Ig bWVzc2FnZXMnfSk7CiAgICBwcmludCAiPGZvbnQgY2xhc3M9J2Jhc2UnPiRlcnJvcm1lc3NhZ2Um bmJzcDs8L2ZvbnQ+XG4iOwogICAgJkhlYWRlcjo6Y2xvc2Vib3goKTsKfQppZiAoJHdhcm5OVFBt ZXNzYWdlKSB7CiAgICAkd2Fybk5UUG1lc3NhZ2UgPSAiPGZvbnQgY29sb3I9JHtIZWFkZXI6OmNv bG91cnJlZH0+PGI+JExhbmc6OnRyeydjYXBzd2FybmluZyd9PC9iPjwvZm9udD46ICR3YXJuTlRQ bWVzc2FnZSI7Cn0KCiZIZWFkZXI6Om9wZW5ib3goJzEwMCUnLCAnbGVmdCcsICdESENQJyk7CnBy aW50ICI8Zm9ybSBtZXRob2Q9J3Bvc3QnIGFjdGlvbj0nJEVOVnsnU0NSSVBUX05BTUUnfSc+IjsK CmZvcmVhY2ggbXkgJGl0ZiAoQElURnMpIHsKICAgIG15ICVjaGVja2VkPSgpOwogICAgJGNoZWNr ZWR7J0VOQUJMRSd9eydvbid9ID0gKCAkZGhjcHNldHRpbmdzeyJFTkFCTEVfJHtpdGZ9In0gbmUg J29uJykgPyAnJyA6ICJjaGVja2VkPSdjaGVja2VkJyI7CiAgICAkY2hlY2tlZHsnRU5BQkxFQk9P VFAnfXsnb24nfSA9ICggJGRoY3BzZXR0aW5nc3siRU5BQkxFQk9PVFBfJHtpdGZ9In0gbmUgJ29u JykgPyAnJyA6ICJjaGVja2VkPSdjaGVja2VkJyI7CiAgICAkY2hlY2tlZHsnREVOWV9LTk9XTl9D TElFTlRTJ317J29uJ30gPSAoICRkaGNwc2V0dGluZ3N7IkRFTllfS05PV05fQ0xJRU5UU18ke2l0 Zn0ifSBuZSAnb24nKSA/ICcnIDogImNoZWNrZWQ9J2NoZWNrZWQnIjsKCiAgICBpZiAoJG5ldHNl dHRpbmdzeyIke2l0Zn1fREVWIn0gbmUgJycgKSB7ICMgU2hvdyBvbmx5IGRlZmluZWQgaW50ZXJm YWNlCglteSAkbGNfaXRmPWxjKCRpdGYpOwoKCWlmICgkZGhjcHNldHRpbmdzeyJTVEFSVF9BRERS XyR7aXRmfSJ9IGVxICcnICkgeyAjIG9ubHkgc2hvdyBkZW55X2tub3duX2NsaWVudHMgY2hlY2ti b3ggaWYgcmFuZ2Ugc3BlY2lmaWVkCnByaW50IDw8RU5ECjx0YWJsZSB3aWR0aD0nMTAwJSc+Cjx0 cj4KICAgIDx0ZCB3aWR0aD0nMjUlJyBjbGFzcz0nYm9sZGJhc2UnPjxiPjxmb250IGNvbG9yPSck e2xjX2l0Zn0nPiRMYW5nOjp0cnsiJGxjX2l0ZiBpbnRlcmZhY2UifTwvZm9udD48L2I+PC90ZD4K ICAgIDx0ZCBjbGFzcz0nYmFzZSc+JExhbmc6OnRyeydlbmFibGVkJ30KICAgIDxpbnB1dCB0eXBl PSdjaGVja2JveCcgbmFtZT0nRU5BQkxFXyR7aXRmfScgJGNoZWNrZWR7J0VOQUJMRSd9eydvbid9 IC8+PC90ZD4KICAgIDx0ZCB3aWR0aD0nMjUlJyBjbGFzcz0nYmFzZSc+JExhbmc6OnRyeydpcCBh ZGRyZXNzJ308YnIgLz4kTGFuZzo6dHJ7J25ldG1hc2snfTo8L3RkPjx0ZD48Yj4kbmV0c2V0dGlu Z3N7IiR7aXRmfV9BRERSRVNTIn08YnIgLz4kbmV0c2V0dGluZ3N7IiR7aXRmfV9ORVRNQVNLIn08 L2I+PC90ZD4KPC90cj48dHI+CiAgICA8dGQgd2lkdGg9JzI1JScgY2xhc3M9J2Jhc2UnPiRMYW5n Ojp0cnsnc3RhcnQgYWRkcmVzcyd9Jm5ic3A7PGltZyBzcmM9Jy9ibG9iLmdpZicgYWx0PScqJyAv PjwvdGQ+CiAgICA8dGQgd2lkdGg9JzI1JSc+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J1NUQVJU X0FERFJfJHtpdGZ9JyB2YWx1ZT0nJGRoY3BzZXR0aW5nc3siU1RBUlRfQUREUl8ke2l0Zn0ifScg Lz48L3RkPgogICAgPHRkIHdpZHRoPScyNSUnIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2VuZCBh ZGRyZXNzJ30mbmJzcDs8aW1nIHNyYz0nL2Jsb2IuZ2lmJyBhbHQ9JyonIC8+PC90ZD4KICAgIDx0 ZCB3aWR0aD0nMjUlJz48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nRU5EX0FERFJfJHtpdGZ9JyB2 YWx1ZT0nJGRoY3BzZXR0aW5nc3siRU5EX0FERFJfJHtpdGZ9In0nIC8+PC90ZD4KPC90cj48dHI+ CiAgICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnZGVmYXVsdCBsZWFzZSB0aW1lJ30mbmJz cDs8aW1nIHNyYz0nL2Jsb2IuZ2lmJyBhbHQ9JyonIC8+PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlw ZT0ndGV4dCcgbmFtZT0nREVGQVVMVF9MRUFTRV9USU1FXyR7aXRmfScgdmFsdWU9JyRkaGNwc2V0 dGluZ3N7IkRFRkFVTFRfTEVBU0VfVElNRV8ke2l0Zn0ifScgLz48L3RkPgogICAgPHRkIGNsYXNz PSdiYXNlJz4kTGFuZzo6dHJ7J21heCBsZWFzZSB0aW1lJ30mbmJzcDs8aW1nIHNyYz0nL2Jsb2Iu Z2lmJyBhbHQ9JyonIC8+PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nTUFY X0xFQVNFX1RJTUVfJHtpdGZ9JyB2YWx1ZT0nJGRoY3BzZXR0aW5nc3siTUFYX0xFQVNFX1RJTUVf JHtpdGZ9In0nIC8+PC90ZD4KPC90cj48dHI+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0 cnsnZG9tYWluIG5hbWUgc3VmZml4J308L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBu YW1lPSdET01BSU5fTkFNRV8ke2l0Zn0nIHZhbHVlPSckZGhjcHNldHRpbmdzeyJET01BSU5fTkFN RV8ke2l0Zn0ifScgLz48L3RkPgogICAgPHRkPiRMYW5nOjp0cnsnZGhjcCBhbGxvdyBib290cCd9 OjwvdGQ+CiAgICA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdFTkFCTEVCT09UUF8k e2l0Zn0nICRjaGVja2VkeydFTkFCTEVCT09UUCd9eydvbid9IC8+PC90ZD4KPC90cj48dHI+CiAg ICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsncHJpbWFyeSBkbnMnfSZuYnNwOzxpbWcgc3Jj PScvYmxvYi5naWYnIGFsdD0nKicgLz48L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBu YW1lPSdETlMxXyR7aXRmfScgdmFsdWU9JyRkaGNwc2V0dGluZ3N7IkROUzFfJHtpdGZ9In0nIC8+ PC90ZD4KICAgIDx0ZCBjbGFzcz0nYmFzZSc+JExhbmc6OnRyeydzZWNvbmRhcnkgZG5zJ308L3Rk PgogICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdETlMyXyR7aXRmfScgdmFsdWU9JyRk aGNwc2V0dGluZ3N7IkROUzJfJHtpdGZ9In0nIC8+PC90ZD4KPC90cj48dHI+CiAgICA8dGQgY2xh c3M9J2Jhc2UnPiRMYW5nOjp0cnsncHJpbWFyeSBudHAgc2VydmVyJ306PC90ZD4KICAgIDx0ZD48 aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nTlRQMV8ke2l0Zn0nIHZhbHVlPSckZGhjcHNldHRpbmdz eyJOVFAxXyR7aXRmfSJ9JyAvPjwvdGQ+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsn c2Vjb25kYXJ5IG50cCBzZXJ2ZXInfTo8L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBu YW1lPSdOVFAyXyR7aXRmfScgdmFsdWU9JyRkaGNwc2V0dGluZ3N7Ik5UUDJfJHtpdGZ9In0nIC8+ PC90ZD4KPC90cj48dHI+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsncHJpbWFyeSB3 aW5zIHNlcnZlciBhZGRyZXNzJ306PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFt ZT0nV0lOUzFfJHtpdGZ9JyB2YWx1ZT0nJGRoY3BzZXR0aW5nc3siV0lOUzFfJHtpdGZ9In0nIC8+ PC90ZD4KICAgIDx0ZCBjbGFzcz0nYmFzZSc+JExhbmc6OnRyeydzZWNvbmRhcnkgd2lucyBzZXJ2 ZXIgYWRkcmVzcyd9OjwvdGQ+CiAgICA8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J1dJTlMy XyR7aXRmfScgdmFsdWU9JyRkaGNwc2V0dGluZ3N7IldJTlMyXyR7aXRmfSJ9JyAvPjwvdGQ+Cjwv dHI+PHRyPgogICAgPHRkIGNsYXNzPSdiYXNlJz5uZXh0LXNlcnZlcjo8L3RkPgogICAgPHRkPjxp bnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdORVhUXyR7aXRmfScgdmFsdWU9JyRkaGNwc2V0dGluZ3N7 Ik5FWFRfJHtpdGZ9In0nIC8+PC90ZD4KICAgIDx0ZCBjbGFzcz0nYmFzZSc+ZmlsZW5hbWU6PC90 ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nRklMRV8ke2l0Zn0nIHZhbHVlPSck ZGhjcHNldHRpbmdzeyJGSUxFXyR7aXRmfSJ9JyAvPjwvdGQ+CjwvdGFibGU+CjxociAvPgpFTkQK OwoJfSBlbHNlewpwcmludCA8PEVORAo8dGFibGUgd2lkdGg9JzEwMCUnPgo8dHI+CiAgICA8dGQg d2lkdGg9JzI1JScgY2xhc3M9J2JvbGRiYXNlJz48Yj48Zm9udCBjb2xvcj0nJHtsY19pdGZ9Jz4k TGFuZzo6dHJ7IiRsY19pdGYgaW50ZXJmYWNlIn08L2ZvbnQ+PC9iPjwvdGQ+CiAgICA8dGQgY2xh c3M9J2Jhc2UnPiRMYW5nOjp0cnsnZW5hYmxlZCd9CiAgICA8aW5wdXQgdHlwZT0nY2hlY2tib3gn IG5hbWU9J0VOQUJMRV8ke2l0Zn0nICRjaGVja2VkeydFTkFCTEUnfXsnb24nfSAvPjwvdGQ+CiAg ICA8dGQgd2lkdGg9JzI1JScgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnaXAgYWRkcmVzcyd9PGJy IC8+JExhbmc6OnRyeyduZXRtYXNrJ306PC90ZD48dGQ+PGI+JG5ldHNldHRpbmdzeyIke2l0Zn1f QUREUkVTUyJ9PGJyIC8+JG5ldHNldHRpbmdzeyIke2l0Zn1fTkVUTUFTSyJ9PC9iPjwvdGQ+Cjwv dHI+PHRyPgogICAgPHRkIHdpZHRoPScyNSUnIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J3N0YXJ0 IGFkZHJlc3MnfSZuYnNwOzxpbWcgc3JjPScvYmxvYi5naWYnIGFsdD0nKicgLz48L3RkPgogICAg PHRkIHdpZHRoPScyNSUnPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdTVEFSVF9BRERSXyR7aXRm fScgdmFsdWU9JyRkaGNwc2V0dGluZ3N7IlNUQVJUX0FERFJfJHtpdGZ9In0nIC8+PC90ZD4KICAg IDx0ZCB3aWR0aD0nMjUlJyBjbGFzcz0nYmFzZSc+JExhbmc6OnRyeydlbmQgYWRkcmVzcyd9Jm5i c3A7PGltZyBzcmM9Jy9ibG9iLmdpZicgYWx0PScqJyAvPjwvdGQ+CiAgICA8dGQgd2lkdGg9JzI1 JSc+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J0VORF9BRERSXyR7aXRmfScgdmFsdWU9JyRkaGNw c2V0dGluZ3N7IkVORF9BRERSXyR7aXRmfSJ9JyAvPjwvdGQ+CjwvdHI+PHRyPgogICAgPHRkIGNs YXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2RlZmF1bHQgbGVhc2UgdGltZSd9Jm5ic3A7PGltZyBzcmM9 Jy9ibG9iLmdpZicgYWx0PScqJyAvPjwvdGQ+CiAgICA8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5h bWU9J0RFRkFVTFRfTEVBU0VfVElNRV8ke2l0Zn0nIHZhbHVlPSckZGhjcHNldHRpbmdzeyJERUZB VUxUX0xFQVNFX1RJTUVfJHtpdGZ9In0nIC8+PC90ZD4KICAgIDx0ZCBjbGFzcz0nYmFzZSc+JExh bmc6OnRyeydtYXggbGVhc2UgdGltZSd9Jm5ic3A7PGltZyBzcmM9Jy9ibG9iLmdpZicgYWx0PScq JyAvPjwvdGQ+CiAgICA8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J01BWF9MRUFTRV9USU1F XyR7aXRmfScgdmFsdWU9JyRkaGNwc2V0dGluZ3N7Ik1BWF9MRUFTRV9USU1FXyR7aXRmfSJ9JyAv PjwvdGQ+CjwvdHI+PHRyPgogICAgPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2RvbWFpbiBu YW1lIHN1ZmZpeCd9PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nRE9NQUlO X05BTUVfJHtpdGZ9JyB2YWx1ZT0nJGRoY3BzZXR0aW5nc3siRE9NQUlOX05BTUVfJHtpdGZ9In0n IC8+PC90ZD4KICAgIDx0ZD4kTGFuZzo6dHJ7J2RoY3AgYWxsb3cgYm9vdHAnfTo8L3RkPgogICAg PHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nRU5BQkxFQk9PVFBfJHtpdGZ9JyAkY2hl Y2tlZHsnRU5BQkxFQk9PVFAnfXsnb24nfSAvPjwvdGQ+CjwvdHI+PHRyPgogICAgPHRkIGNsYXNz PSdiYXNlJz4kTGFuZzo6dHJ7J3ByaW1hcnkgZG5zJ30mbmJzcDs8aW1nIHNyYz0nL2Jsb2IuZ2lm JyBhbHQ9JyonIC8+PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nRE5TMV8k e2l0Zn0nIHZhbHVlPSckZGhjcHNldHRpbmdzeyJETlMxXyR7aXRmfSJ9JyAvPjwvdGQ+CiAgICA8 dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnc2Vjb25kYXJ5IGRucyd9PC90ZD4KICAgIDx0ZD48 aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nRE5TMl8ke2l0Zn0nIHZhbHVlPSckZGhjcHNldHRpbmdz eyJETlMyXyR7aXRmfSJ9JyAvPjwvdGQ+CjwvdHI+PHRyPgogICAgPHRkIGNsYXNzPSdiYXNlJz4k TGFuZzo6dHJ7J3ByaW1hcnkgbnRwIHNlcnZlcid9OjwvdGQ+CiAgICA8dGQ+PGlucHV0IHR5cGU9 J3RleHQnIG5hbWU9J05UUDFfJHtpdGZ9JyB2YWx1ZT0nJGRoY3BzZXR0aW5nc3siTlRQMV8ke2l0 Zn0ifScgLz48L3RkPgogICAgPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J3NlY29uZGFyeSBu dHAgc2VydmVyJ306PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nTlRQMl8k e2l0Zn0nIHZhbHVlPSckZGhjcHNldHRpbmdzeyJOVFAyXyR7aXRmfSJ9JyAvPjwvdGQ+CjwvdHI+ PHRyPgogICAgPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J3ByaW1hcnkgd2lucyBzZXJ2ZXIg YWRkcmVzcyd9OjwvdGQ+CiAgICA8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J1dJTlMxXyR7 aXRmfScgdmFsdWU9JyRkaGNwc2V0dGluZ3N7IldJTlMxXyR7aXRmfSJ9JyAvPjwvdGQ+CiAgICA8 dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnc2Vjb25kYXJ5IHdpbnMgc2VydmVyIGFkZHJlc3Mn fTo8L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdXSU5TMl8ke2l0Zn0nIHZh bHVlPSckZGhjcHNldHRpbmdzeyJXSU5TMl8ke2l0Zn0ifScgLz48L3RkPgo8L3RyPjx0cj4KICAg IDx0ZCBjbGFzcz0nYmFzZSc+bmV4dC1zZXJ2ZXI6PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0n dGV4dCcgbmFtZT0nTkVYVF8ke2l0Zn0nIHZhbHVlPSckZGhjcHNldHRpbmdzeyJORVhUXyR7aXRm fSJ9JyAvPjwvdGQ+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPmZpbGVuYW1lOjwvdGQ+CiAgICA8dGQ+ PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J0ZJTEVfJHtpdGZ9JyB2YWx1ZT0nJGRoY3BzZXR0aW5n c3siRklMRV8ke2l0Zn0ifScgLz48L3RkPgo8L3RyPjx0cj4KICAgIDx0ZCBjbGFzcz0nYmFzZSc+ ZGVueSBrbm93biBjbGllbnRzOjwvdGQ+CiAgICA8dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBu YW1lPSdERU5ZX0tOT1dOX0NMSUVOVFNfJHtpdGZ9JyAkY2hlY2tlZHsnREVOWV9LTk9XTl9DTElF TlRTJ317J29uJ30gLz48L3RkPgo8L3RyPgo8L3RhYmxlPgo8aHIgLz4KRU5ECjsKCX0KICAgIH0j IFNob3cgb25seSBkZWZpbmVkIGludGVyZmFjZQp9I2ZvcmVhY2ggaXRmCnByaW50IDw8RU5ECjx0 YWJsZSB3aWR0aD0nMTAwJSc+Cjx0cj4KICAgIDx0ZCBjbGFzcz0nYmFzZScgd2lkdGg9JzI1JSc+ PGltZyBzcmM9Jy9ibG9iLmdpZicgYWxpZ249J3RvcCcgYWx0PScqJyAvPiZuYnNwOyRMYW5nOjp0 cnsncmVxdWlyZWQgZmllbGQnfTwvdGQ+CiAgICA8dGQgY2xhc3M9J2Jhc2UnIHdpZHRoPSczMCUn PiR3YXJuTlRQbWVzc2FnZTwvdGQ+CiAgICA8dGQgd2lkdGg9JzQwJScgYWxpZ249J3JpZ2h0Jz48 aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdBQ1RJT04nIHZhbHVlPSckTGFuZzo6dHJ7J3NhdmUn fScgLz48L3RkPgo8L3RyPgo8L3RhYmxlPgpFTkQKOwomSGVhZGVyOjpjbG9zZWJveCgpOwoKIyBE SENQIEROUyB1cGRhdGUgc3VwcG9ydCAoUkZDMjEzNikKJkhlYWRlcjo6b3BlbmJveCgnMTAwJScs ICdsZWZ0JywgJExhbmc6OnRyeydkaGNwIGRucyB1cGRhdGUnfSk7CgpteSAlY2hlY2tlZCA9ICgp OwokY2hlY2tlZHsnRE5TX1VQREFURV9FTkFCTEVEJ317J29uJ30gPSAoICRkaGNwc2V0dGluZ3N7 J0ROU19VUERBVEVfRU5BQkxFRCd9IG5lICdvbicpID8gJycgOiAiY2hlY2tlZD0nY2hlY2tlZCci OwoKcHJpbnQgPDxFTkQKPHRhYmxlICB3aWR0aD0nMTAwJSc+Cgk8dHI+CgkJPHRkIHdpZHRoPScz MCUnIGNsYXNzPSdib2xkYmFzZSc+JExhbmc6OnRyeydkaGNwIGRucyBlbmFibGUgdXBkYXRlJ308 L3RkPgoJCTx0ZCBjbGFzcz0nYmFzZSc+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdETlNf VVBEQVRFX0VOQUJMRUQnICRjaGVja2VkeydETlNfVVBEQVRFX0VOQUJMRUQnfXsnb24nfT4KCQk8 L3RkPgoJPHRyPgo8L3RhYmxlPgoKPHRhYmxlIHdpZHRoPScxMDAlJz4KRU5ECjsKCW15IEBkb21h aW5zID0gKCk7CgoJIyBQcmludCBvcHRpb25zIGZvciBlYWNoIGludGVyZmFjZS4KCWZvcmVhY2gg bXkgJGl0ZiAoQElURnMpIHsKCQkjIENoZWNrIGlmIERIQ1AgZm9yIHRoaXMgaW50ZXJmYWNlIGlz IGVuYWJsZWQuCgkJaWYgKCRkaGNwc2V0dGluZ3N7IkVOQUJMRV8ke2l0Zn0ifSBlcSAnb24nKSB7 CgkJCSMgQ2hlY2sgZm9yIHNhbWUgZG9tYWluIG5hbWUuCgkJCW5leHQgaWYgKCRkaGNwc2V0dGlu Z3N7IkRPTUFJTl9OQU1FXyR7aXRmfSJ9IH5+IEBkb21haW5zKTsKCQkJbXkgJGxjX2l0ZiA9IGxj KCRpdGYpOwoKCQkJIyBTZWxlY3QgcHJldmlvdXNseSBjb25maWd1cmVkIHVwZGF0ZSBhbGdvcml0 aG0uCgkJCW15ICVzZWxlY3RlZCA9ICgpOwoJCQkkc2VsZWN0ZWR7J0ROU19VUERBVEVfQUxHT18k e2luZn0nfXskZGhjcHNldHRpbmdzeydETlNfVVBEQVRFX0FMR09fJHtpbmZ9J319ID0gJ3NlbGVj dGVkJzsKCnByaW50IDw8RU5ECgk8dHI+CgkJPHRkIGNvbHNwYW49JzYnPiZuYnNwOzwvdGQ+Cgk8 L3RyPgoJPHRyPgoJCTx0ZCBjb2xzcGFuPSc2JyBjbGFzcz0nYm9sZGJhc2UnPjxiPiRkaGNwc2V0 dGluZ3N7IkRPTUFJTl9OQU1FXyR7aXRmfSJ9PC9iPjwvdGQ+Cgk8L3RyPgoJPHRyPgoJCTx0ZCB3 aWR0aD0nMTAlJyBjbGFzcz0nYm9sZGJhc2UnPiRMYW5nOjp0cnsnZGhjcCBkbnMga2V5IG5hbWUn fTo8L3RkPgoJCTx0ZCB3aWR0aD0nMjAlJz48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nRE5TX1VQ REFURV9LRVlfTkFNRV8ke2l0Zn0nIHZhbHVlPSckZGhjcHNldHRpbmdzeyJETlNfVVBEQVRFX0tF WV9OQU1FXyR7aXRmfSJ9Jz48L3RkPgoJCTx0ZCB3aWR0aD0nMTAlJyBjbGFzcz0nYm9sZGJhc2Un IGFsaWduPSdyaWdodCc+JExhbmc6OnRyeydkaGNwIGRucyB1cGRhdGUgc2VjcmV0J306Jm5ic3A7 Jm5ic3A7PC90ZD4KCQk8dGQgd2lkdGg9JzIwJSc+PGlucHV0IHR5cGU9J3Bhc3N3b3JkJyBuYW1l PSdETlNfVVBEQVRFX0tFWV9TRUNSRVRfJHtpdGZ9JyB2YWx1ZT0nJGRoY3BzZXR0aW5nc3siRE5T X1VQREFURV9LRVlfU0VDUkVUXyR7aXRmfSJ9Jz48L3RkPgoJCTx0ZCB3aWR0aD0nMTAlJyBjbGFz cz0nYm9sZGJhc2UnIGFsaWduPSdyaWdodCc+JExhbmc6OnRyeydkaGNwIGRucyB1cGRhdGUgYWxn byd9OiZuYnNwOyZuYnNwOzwvdGQ+CgkJPHRkIHdpZHRoPScyMCUnPgoJCQk8c2VsZWN0IG5hbWU9 J0ROU19VUERBVEVfS0VZX0FMR09fJHtpdGZ9Jz4KCQkJCTwhLS0gPG9wdGlvbiB2YWx1ZT0naG1h Yy1zaGExJyAkc2VsZWN0ZWR7J0ROU19VUERBVEVfS0VZX0FMR09fJHtpdGZ9J317J2htYWMtc2hh MSd9PkhNQUMtU0hBMTwvb3B0aW9uPiAtLT4KCQkJCTxvcHRpb24gdmFsdWU9J2htYWMtbWQ1JyAk c2VsZWN0ZWR7J0ROU19VUERBVEVfS0VZX0FMR09fJHtpdGZ9J317J2htYWMtbWQ1J30+SE1BQy1N RDU8L29wdGlvbj4KCQkJPC9zZWxlY3Q+CgkJPC90ZD4KCTwvdHI+CkVORAo7Cgl9CgoJIyBTdG9y ZSBjb25maWd1cmVkIGRvbWFpbiBiYXNlZCBvbiB0aGUgaW50ZXJmYWNlCgkjIGluIHRoZSB0ZW1w b3JhcnkgdmFyaWFibGUuCglwdXNoKEBkb21haW5zLCAkZGhjcHNldHRpbmdzeyJET01BSU5fTkFN RV8ke2l0Zn0ifSk7Cn0KcHJpbnQgPDxFTkQKPC90YWJsZT4KPGhyPgo8dGFibGUgd2lkdGg9JzEw MCUnPgoJPHRyPgoJCTx0ZCBhbGlnbj0ncmlnaHQnPjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9 J0FDVElPTicgdmFsdWU9JyRMYW5nOjp0cnsnc2F2ZSd9JyAvPjwvdGQ+Cgk8L3RyPgo8L3RhYmxl Pgo8L2Zvcm0+CkVORAo7CgomSGVhZGVyOjpjbG9zZWJveCgpOwoKJkhlYWRlcjo6b3BlbmJveCgn MTAwJScsICdsZWZ0JywgJExhbmc6OnRyeydkaGNwIGFkdm9wdCBsaXN0J30pOwojIERIQ1AgQWR2 YW5jZWQgb3B0aW9ucyBzZXR0aW5ncwpteSAlY2hlY2tlZD0oKTsKJGNoZWNrZWR7J0FEVk9QVF9F TkFCTEVEJ317J29uJ30gPSAoJGRoY3BzZXR0aW5nc3snQURWT1BUX0VOQUJMRUQnfSBuZSAnb24n KSA/ICcnIDogImNoZWNrZWQ9J2NoZWNrZWQnIjsKCnByaW50ICI8Zm9ybSBtZXRob2Q9J3Bvc3Qn IGFjdGlvbj0nJEVOVnsnU0NSSVBUX05BTUUnfSc+PHRhYmxlIHdpZHRoPScxMDAlJz4iOwpteSAk YnV0dG9udGV4dCA9ICRMYW5nOjp0cnsnYWRkJ307CmlmICgkZGhjcHNldHRpbmdzeydLRVkxJ30g bmUgJycpIHsKICAgICRidXR0b250ZXh0ID0gJExhbmc6OnRyeyd1cGRhdGUnfTsKICAgIHByaW50 ICI8dHI+PHRkIGNsYXNzPSdib2xkYmFzZSc+PGI+JExhbmc6OnRyeydkaGNwIGFkdm9wdCBlZGl0 J308L2I+PC90ZD48L3RyPiI7Cn0gZWxzZSB7CiAgICBwcmludCAiPHRyPjx0ZCBjbGFzcz0nYm9s ZGJhc2UnPjxiPiRMYW5nOjp0cnsnZGhjcCBhZHZvcHQgYWRkJ308L2I+PC90ZD48L3RyPiIKfQoK I3NlYXJjaCBpZiB0aGUgJ29wdGlvbicgaXMgaW4gdGhlIGxpc3QgYW5kIHByaW50IHRoZSBzeW50 YXggbW9kZWwKbXkgJG9wdCA9IGBncmVwICJcJG9wdGlvbiAkZGhjcHNldHRpbmdzeydBRFZPUFRf TkFNRSd9ICIgJGZpbGVuYW1lM2A7CmlmICgkb3B0IG5lICcnKSB7CiAgICRvcHQgPX4gcy9vcHRp b24gJGRoY3BzZXR0aW5nc3snQURWT1BUX05BTUUnfS9TeW50YXg6LzsgICMgIm9wdGlvbiB4eXog YWJjIiA9PiAic3ludGF4OiBhYmMiCiAgICRvcHQgPX4gcy87Ly87CiAgICRvcHQgPSAiPHRyPjx0 ZD48L3RkPjx0ZD48L3RkPjx0ZCBjb2xzcGFuPScyJz4kb3B0PC90ZD48L3RyPiI7Cn0KcHJpbnQg PDxFTkQKPHRyPgogICAgPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2RoY3AgYWR2b3B0IG5h bWUnfTombmJzcDs8aW1nIHNyYz0nL2Jsb2IuZ2lmJyBhbHQ9JyonIC8+PC90ZD4KICAgIDx0ZD48 aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nQURWT1BUX05BTUUnIHZhbHVlPSckZGhjcHNldHRpbmdz eydBRFZPUFRfTkFNRSd9JyBzaXplPScxOCcgLz48L3RkPgogICAgPHRkIGNsYXNzPSdiYXNlJz4k TGFuZzo6dHJ7J2RoY3AgYWR2b3B0IHZhbHVlJ306Jm5ic3A7PGltZyBzcmM9Jy9ibG9iLmdpZicg YWx0PScqJyAvPjwvdGQ+CiAgICA8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J0FEVk9QVF9E QVRBJyB2YWx1ZT0nJGRoY3BzZXR0aW5nc3snQURWT1BUX0RBVEEnfScgc2l6ZT0nNDAnIC8+PC90 ZD4KPC90cj4kb3B0PHRyPgogICAgPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2VuYWJsZWQn fTwvdGQ+PHRkPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nQURWT1BUX0VOQUJMRUQnICRj aGVja2VkeydBRFZPUFRfRU5BQkxFRCd9eydvbid9IC8+PC90ZD4KICAgIDx0ZCBjbGFzcz0nYmFz ZSc+JExhbmc6OnRyeydkaGNwIGFkdm9wdCBzY29wZSd9OjwvdGQ+CiAgICA8dGQ+CkVORAo7Cgoj IFB1dCBhIGNoZWNrYm94IGZvciBlYWNoIGludGVyZmFjZS4gQ2hlY2tib3ggdmlzaWJsZSBkaXNh YmxlZCBpZiBpbnRlcmZhY2UgaXMgZGlzYWJsZWQgIApmb3JlYWNoIG15ICRpdGYgKEBJVEZzKSB7 CiAgICBteSAkbGNfaXRmPWxjKCRpdGYpOwogICAgJGNoZWNrZWR7J0FEVk9QVF9TQ09QRV8ke2l0 Zn0nfXsnb24nfSA9ICRkaGNwc2V0dGluZ3N7IkFEVk9QVF9TQ09QRV8ke2l0Zn0ifSBuZSAnb24n ID8gJycgOiAiY2hlY2tlZD0nY2hlY2tlZCciOyAgICAKICAgIHByaW50ICIkTGFuZzo6dHJ7XCIk e2xjX2l0Zn1cIn0gPGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdBRFZPUFRfU0NPUEVfJHtp dGZ9JyAkY2hlY2tlZHsnQURWT1BUX1NDT1BFXyR7aXRmfSd9eydvbid9ICI7CiAgICBwcmludCAk ZGhjcHNldHRpbmdzeyJFTkFCTEVfJHtpdGZ9In0gZXEgJ29uJyA/ICIvPiIgOiAiZGlzYWJsZWQ9 J2Rpc2FibGVkJyAvPiI7CiAgICBwcmludCAiJm5ic3A7ICZuYnNwOyI7Cn0KCnByaW50IDw8RU5E CiAgICA8L3RkPgo8L3RyPgo8L3RhYmxlPgo8aHIgLz4KPHRhYmxlIHdpZHRoPScxMDAlJz4KPHRy PgogICAgPHRkIGNsYXNzPSdiYXNlJyB3aWR0aD0nNTAlJz4kTGFuZzo6dHJ7J2RoY3AgYWR2b3B0 IHNjb3BlIGhlbHAnfTwvdGQ+CiAgICA8dGQgd2lkdGg9JzUwJScgYWxpZ249J3JpZ2h0Jz4KICAg IDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J0FDVElPTicgdmFsdWU9JyRMYW5nOjp0cnsnYWRk J30xJyAvPgogICAgPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nU1VCTUlUJyB2YWx1ZT0nJGJ1 dHRvbnRleHQnIC8+CiAgICA8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdTVUJNSVQnIHZhbHVl PSckTGFuZzo6dHJ7J2RoY3AgYWR2b3B0IGhlbHAnfScgLz4KICAgIDxpbnB1dCB0eXBlPSdoaWRk ZW4nIG5hbWU9J0tFWTEnIHZhbHVlPSckZGhjcHNldHRpbmdzeydLRVkxJ30nIC8+CiAgICA8L3Rk Pgo8L3RyPgo8L3RhYmxlPgo8L2Zvcm0+CkVORAo7CiNFZGl0ZWQgbGluZSBudW1iZXIgKEtFWTEp IHBhc3NlZCB1bnRpbCBjbGVhcmVkIGJ5ICdzYXZlJyBvciAncmVtb3ZlJyBvciAnbmV3IHNvcnQg b3JkZXInCgojIHByaW50IGhlbHAgdGFrZW4gZnJvbSB0aGUgZmlsZSBkZXNjcmliaW5nIG9wdGlv bnMKaWYgKCRkaGNwc2V0dGluZ3N7J1NVQk1JVCd9IGVxICRMYW5nOjp0cnsnZGhjcCBhZHZvcHQg aGVscCd9KSB7CiAgICBwcmludCAiPGhyIC8+IjsKICAgIHByaW50ICI8dGFibGUgd2lkdGg9JzEw MCUnPiI7CiAgICBwcmludCAiPHRyPjx0ZCB3aWR0aD0nMzAlJz48Yj4kTGFuZzo6dHJ7J2RoY3Ag YWR2b3B0IG5hbWUnfTwvYj48L3RkPjx0ZCB3aWR0aD0nNzAlJz48Yj4kTGFuZzo6dHJ7J2RoY3Ag YWR2b3B0IHZhbHVlJ308L2I+PC90ZD4iOwogICAgb3BlbihGSUxFLCAiJGZpbGVuYW1lMyIpOwog ICAgbXkgQGN1cnJlbnQzID0gPEZJTEU+OwogICAgY2xvc2UoRklMRSk7CiAgICBmb3JlYWNoIG15 ICRsaW5lIChAY3VycmVudDMpIHsKCSRsaW5lID1+IC9vcHRpb24gKFthLXowLTktXSspICguKik7 LzsKCXByaW50ICI8dHI+PHRkPiQxPC90ZD48dGQ+JDI8L3RkPjwvdHI+XG4iOwogICAgfQogICAg cHJpbnQgIjx0cj48dGQgY29sc3Bhbj0nMic+PGhyIC8+PC90ZD48L3RyPlxuIjsKICAgIHByaW50 ICc8dHI+PHRkPnN0cmluZyB0eXBlPC90ZD48dGQ+InF1b3RlZCBzdHJpbmciIG9yIDAwOjAxOkZG Li4uPC90ZD48L3RyPic7CiAgICBwcmludCAnPHRyPjx0ZD5pcC1hZGRyZXNzIHR5cGUgPC90ZD48 dGQ+MTAuMC4wLjEgfCB3d3cuZG90LmNvbTwvdGQ+PC90cj4nOwogICAgcHJpbnQgJzx0cj48dGQ+ aW50LHVpbnQgdHlwZXM8L3RkPjx0ZD5udW1iZXJzPC90ZD48L3RyPic7CiAgICBwcmludCAnPHRy Pjx0ZD5mbGFnIHR5cGU8L3RkPjx0ZD5vbiB8IG9mZjwvdGQ+PC90cj4nOwogICAgcHJpbnQgJzwv dGFibGU+JzsKICAgIHByaW50ICI8aHIgLz4iOwogICAgcHJpbnQgIjx0YWJsZSB3aWR0aD0nMTAw JSc+IjsKICAgIHByaW50ICI8dHI+PHRkIHdpZHRoPSczMCUnPjxiPiRMYW5nOjp0cnsnZGhjcCBh ZHZvcHQgY3VzdG9tIGRlZmluaXRpb24nfTwvYj48L3RkPjx0ZCB3aWR0aD0nNzAlJz48Yj4kTGFu Zzo6dHJ7J2RoY3AgYWR2b3B0IHZhbHVlJ308L2I+PC90ZD4iOwogICAgcHJpbnQgIjx0cj48dGQ+ YW55LW5hbWUgPC90ZD48dGQ+IGNvZGUgTk5OPSRPcHRpb25UeXBlczwvdGQ+PC90cj4iOwogICAg cHJpbnQgJzx0cj48dGQ+YS1zdHJpbmc8L3RkPjx0ZD5jb2RlIDEwMD1zdHJpbmc8L3RkPjwvdHI+ JzsKICAgIHByaW50ICc8dHI+PHRkPmEtbnVtYmVyPC90ZD48dGQ+Y29kZSAxMDE9c2lnbmVkIGlu dGVnZXIgODwvdGQ+PC90cj4nOwogICAgcHJpbnQgJzx0cj48dGQ+d3BhZDwvdGQ+PHRkPmNvZGUg MjUyPXRleHQ8L3RkPjwvdHI+JzsKICAgIHByaW50ICc8dHI+PHRkPndwYWQ8L3RkPjx0ZD4iaHR0 cDovL3d3dy5zZXJ2ZXIuZnIvcGF0aC10by9wcm94eS5wYWMiPC90ZD48L3RyPic7CiAgICBwcmlu dCAnPC90YWJsZT4nOwogCn0KCnByaW50IDw8RU5ECjxociAvPgo8dGFibGUgd2lkdGg9JzEwMCUn Pgo8dHI+CiAgICA8dGQgd2lkdGg9JzMwJScgY2xhc3M9J2JvbGRiYXNlJyBhbGlnbj0nY2VudGVy Jz48Yj4kTGFuZzo6dHJ7J2RoY3AgYWR2b3B0IG5hbWUnfTwvYj48L3RkPgogICAgPHRkIHdpZHRo PSc1MCUnIGNsYXNzPSdib2xkYmFzZScgYWxpZ249J2NlbnRlcic+PGI+JExhbmc6OnRyeydkaGNw IGFkdm9wdCB2YWx1ZSd9PC9iPjwvdGQ+CiAgICA8dGQgd2lkdGg9JzIwJScgY2xhc3M9J2JvbGRi YXNlJyBhbGlnbj0nY2VudGVyJz48Yj4kTGFuZzo6dHJ7J2RoY3AgYWR2b3B0IHNjb3BlJ308L2I+ PC90ZD4KICAgIDx0ZCBjb2xzcGFuPSczJyBjbGFzcz0nYm9sZGJhc2UnIGFsaWduPSdjZW50ZXIn PjxiPiRMYW5nOjp0cnsnYWN0aW9uJ308L2I+PC90ZD4KPC90cj4KRU5ECjsKbXkgJGtleSA9IDA7 CmZvcmVhY2ggbXkgJGxpbmUgKEBjdXJyZW50MSkgewogICAgbXkgJGdpZiA9ICcnOwogICAgbXkg JGdkZXNjID0gJyc7CiAgICBjaG9tcCgkbGluZSk7ICAgIyByZW1vdmUgbmV3bGluZQogICAgbXkg QHRlbXAgPSBzcGxpdCgvXHQvLCRsaW5lKTsKCiAgICBpZiAoJHRlbXBbMF0gZXEgIm9uIikgewoJ JGdpZiA9ICdvbi5naWYnOwoJJGdkZXNjID0gJExhbmc6OnRyeydjbGljayB0byBkaXNhYmxlJ307 CiAgICB9IGVsc2UgewoJJGdpZiA9ICdvZmYuZ2lmJzsKCSRnZGVzYyA9ICRMYW5nOjp0cnsnY2xp Y2sgdG8gZW5hYmxlJ307IAogICAgfQoKICAgIGlmICgkZGhjcHNldHRpbmdzeydLRVkxJ30gZXEg JGtleSkgewoJcHJpbnQgIjx0ciBiZ2NvbG9yPScke0hlYWRlcjo6Y29sb3VyeWVsbG93fSc+IjsK ICAgIH0gZWxzaWYgKCRrZXkgJSAyKSB7CglwcmludCAiPHRyIGJnY29sb3I9JyRjb2xvcnsnY29s b3IyMid9Jz4iOwogICAgfSBlbHNlIHsKCXByaW50ICI8dHIgYmdjb2xvcj0nJGNvbG9yeydjb2xv cjIwJ30nPiI7IAogICAgfQoKICAgIHByaW50IDw8RU5ECjx0ZCBhbGlnbj0nY2VudGVyJz4kdGVt cFsxXTwvdGQ+Cjx0ZCBhbGlnbj0nY2VudGVyJz4kdGVtcFsyXTwvdGQ+Cjx0ZCBhbGlnbj0nY2Vu dGVyJz4KRU5ECjsKICAgICMgUHJlcGFyZSBhIGdsb2JhbCBmbGFnIHRvIG1ha2UgZWFzeSByZWFk aW5nCiAgICBteSAkZ2xvYmFsID0gJyc7CiAgICBteSAkZGlzYWJsZWRUb2dsZSA9ICcnOwogICAg bXkgJGRpc2FibGVkRWRpdFJlbW92ZSA9ICcnOwogICAgaWYgKCBFeGlzdE5ld09wdGlvbkRlZmlu aXRpb24gKCR0ZW1wWzFdIC4gJyAnIC4gJHRlbXBbMl0pICkgewoJJGdsb2JhbCA9ICRMYW5nOjp0 cnsnZGhjcCBhZHZvcHQgZGVmaW5pdGlvbid9OwoJJGRpc2FibGVkVG9nbGUgPSAiZGlzYWJsZWQ9 J2Rpc2FibGVkJyI7CgkjIFNlYXJjaCBpZiBpdCBpcyBhIHVzZWQgTmV3T3B0aW9uRGVmaW5pdGlv biB0byBhbHNvIGRpc2FibGUgZWRpdCAmIGRlbGV0ZQoJJGRpc2FibGVkRWRpdFJlbW92ZSA9ICJk aXNhYmxlZD0nZGlzYWJsZWQnIiBpZiAoSXNVc2VkTmV3T3B0aW9uRGVmaW5pdGlvbiAoJHRlbXBb MV0sICR0ZW1wWzJdKSk7CiAgICB9IGVsc2UgewoJJGdsb2JhbCA9ICRMYW5nOjp0cnsnZGhjcCBh ZHZvcHQgc2NvcGUgZ2xvYmFsJ307CiAgICB9CiAgICAKICAgIAogICAgIyBQcmludCBlYWNoIGNo ZWNrZWQgaW50ZXJmYWNlCiAgICBmb3IgKG15ICRrZXk9MDsgJGtleTxASVRGczsgJGtleSsrKSB7 CglteSAkaXRmID0gJHRlbXBbMyska2V5XTsKCWlmICgkaXRmIG5lICdvZmYnKSB7CSMgT25seSBp ZiBhbiBpbnRlcmZhY2UgbmFtZSBpcyByZWFkCgkgICAgcHJpbnQgIiRpdGYiOwoJICAgICRnbG9i YWw9Jyc7CQkjIGZhbGwgdG8gbG9jYWwgc2NvcGUgIQoJfQogICAgfQogICAgcHJpbnQgPDxFTkQK JGdsb2JhbDwvdGQ+Cjx0ZCBhbGlnbj0nY2VudGVyJz4KPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rp b249JyRFTlZ7J1NDUklQVF9OQU1FJ30nPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdBQ1RJ T04nIHZhbHVlPSckTGFuZzo6dHJ7J3RvZ2dsZSBlbmFibGUgZGlzYWJsZSd9MScgLz4KPGlucHV0 ICRkaXNhYmxlZFRvZ2xlIHR5cGU9J2ltYWdlJyBuYW1lPSckTGFuZzo6dHJ7J3RvZ2dsZSBlbmFi bGUgZGlzYWJsZSd9JyBzcmM9Jy9pbWFnZXMvJGdpZicgYWx0PSckZ2Rlc2MnIHRpdGxlPSckZ2Rl c2MnIC8+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J0tFWTEnIHZhbHVlPScka2V5JyAvPgo8 L2Zvcm0+CjwvdGQ+Cgo8dGQgYWxpZ249J2NlbnRlcic+Cjxmb3JtIG1ldGhvZD0ncG9zdCcgYWN0 aW9uPSckRU5WeydTQ1JJUFRfTkFNRSd9Jz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nQUNU SU9OJyB2YWx1ZT0nJExhbmc6OnRyeydlZGl0J30xJyAvPgo8aW5wdXQgJGRpc2FibGVkRWRpdFJl bW92ZSB0eXBlPSdpbWFnZScgbmFtZT0nJExhbmc6OnRyeydlZGl0J30nIHNyYz0nL2ltYWdlcy9l ZGl0LmdpZicgYWx0PSckTGFuZzo6dHJ7J2VkaXQnfScgdGl0bGU9JyRMYW5nOjp0cnsnZWRpdCd9 JyAvPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdLRVkxJyB2YWx1ZT0nJGtleScgLz4KPC9m b3JtPgo8L3RkPgoKPHRkIGFsaWduPSdjZW50ZXInPgo8Zm9ybSBtZXRob2Q9J3Bvc3QnIGFjdGlv bj0nJEVOVnsnU0NSSVBUX05BTUUnfSc+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J0FDVElP TicgdmFsdWU9JyRMYW5nOjp0cnsncmVtb3ZlJ30xJyAvPgo8aW5wdXQgJGRpc2FibGVkRWRpdFJl bW92ZSB0eXBlPSdpbWFnZScgbmFtZT0nJExhbmc6OnRyeydyZW1vdmUnfScgc3JjPScvaW1hZ2Vz L2RlbGV0ZS5naWYnIGFsdD0nJExhbmc6OnRyeydyZW1vdmUnfScgdGl0bGU9JyRMYW5nOjp0cnsn cmVtb3ZlJ30nIC8+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J0tFWTEnIHZhbHVlPScka2V5 JyAvPgo8L2Zvcm0+CjwvdGQ+CjwvdHI+CkVORAo7CiAgICAka2V5Kys7Cn0KCnByaW50ICI8L3Rh YmxlPiI7CgojIElmIHRoZXJlIGFyZSBkaGNwIG9wdGlvbnMsIHByaW50IEtleSB0byBhY3Rpb24g aWNvbnMKaWYgKCRrZXkpIHsKcHJpbnQgPDxFTkQKPHRhYmxlPgo8dHI+Cgk8dGQgY2xhc3M9J2Jv bGRiYXNlJz4mbmJzcDs8Yj4kTGFuZzo6dHJ7J2xlZ2VuZCd9OiZuYnNwOzwvYj48L3RkPgoJPHRk PjxpbWcgc3JjPScvaW1hZ2VzL29uLmdpZicgYWx0PSckTGFuZzo6dHJ7J2NsaWNrIHRvIGRpc2Fi bGUnfScgLz48L3RkPgoJPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2NsaWNrIHRvIGRpc2Fi bGUnfTwvdGQ+Cgk8dGQ+Jm5ic3A7Jm5ic3A7PC90ZD4KCTx0ZD48aW1nIHNyYz0nL2ltYWdlcy9v ZmYuZ2lmJyBhbHQ9JyRMYW5nOjp0cnsnY2xpY2sgdG8gZW5hYmxlJ30nIC8+PC90ZD4KCTx0ZCBj bGFzcz0nYmFzZSc+JExhbmc6OnRyeydjbGljayB0byBlbmFibGUnfTwvdGQ+Cgk8dGQ+Jm5ic3A7 Jm5ic3A7PC90ZD4KCTx0ZD48aW1nIHNyYz0nL2ltYWdlcy9lZGl0LmdpZicgYWx0PSckTGFuZzo6 dHJ7J2VkaXQnfScgLz48L3RkPgoJPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2VkaXQnfTwv dGQ+Cgk8dGQ+Jm5ic3A7Jm5ic3A7PC90ZD4KCTx0ZD48aW1nIHNyYz0nL2ltYWdlcy9kZWxldGUu Z2lmJyBhbHQ9JyRMYW5nOjp0cnsncmVtb3ZlJ30nIC8+PC90ZD4KCTx0ZCBjbGFzcz0nYmFzZSc+ JExhbmc6OnRyeydyZW1vdmUnfTwvdGQ+CjwvdHI+CjwvdGFibGU+CkVORAo7Cn0KJkhlYWRlcjo6 Y2xvc2Vib3goKTsKCiZIZWFkZXI6Om9wZW5ib3goJzEwMCUnLCAnbGVmdCcsICRMYW5nOjp0cnsn Y3VycmVudCBmaXhlZCBsZWFzZXMnfSk7CiMgRml4ZWQgbGVhc2VzIHNjcmVlbnMKJGNoZWNrZWR7 J0ZJWF9FTkFCTEVEJ317J29uJ30gPSAoJGRoY3BzZXR0aW5nc3snRklYX0VOQUJMRUQnfSBuZSAn b24nKSA/ICcnIDogImNoZWNrZWQ9J2NoZWNrZWQnIjsKCiRidXR0b250ZXh0ID0gJExhbmc6OnRy eydhZGQnfTsKcHJpbnQgIjxmb3JtIG1ldGhvZD0ncG9zdCcgYWN0aW9uPSckRU5WeydTQ1JJUFRf TkFNRSd9Jz48dGFibGUgd2lkdGg9JzEwMCUnPiI7CgppZiAoJGRoY3BzZXR0aW5nc3snS0VZMid9 IG5lICcnKSB7CiAgICAkYnV0dG9udGV4dCA9ICRMYW5nOjp0cnsndXBkYXRlJ307CiAgICBwcmlu dCAiPHRyPjx0ZCBjbGFzcz0nYm9sZGJhc2UnIGNvbHNwYW49JzMnPjxiPiRMYW5nOjp0cnsnZWRp dCBhbiBleGlzdGluZyBsZWFzZSd9PC9iPjwvdGQ+PC90cj4iOwp9IGVsc2UgewogICAgcHJpbnQg Ijx0cj48dGQgY2xhc3M9J2JvbGRiYXNlJyBjb2xzcGFuPSczJz48Yj4kTGFuZzo6dHJ7J2FkZCBu ZXcgbGVhc2UnfTwvYj48L3RkPjwvdHI+Igp9CnByaW50IDw8RU5ECjx0cj4KICAgIDx0ZCBjbGFz cz0nYmFzZSc+JExhbmc6OnRyeydtYWMgYWRkcmVzcyd9OiZuYnNwOzxpbWcgc3JjPScvYmxvYi5n aWYnIGFsdD0nKicgLz48L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdGSVhf TUFDJyB2YWx1ZT0nJGRoY3BzZXR0aW5nc3snRklYX01BQyd9JyBzaXplPScxOCcgLz48L3RkPgog ICAgPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2lwIGFkZHJlc3MnfTombmJzcDs8aW1nIHNy Yz0nL2Jsb2IuZ2lmJyBhbHQ9JyonIC8+PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcg bmFtZT0nRklYX0FERFInIHZhbHVlPSckZGhjcHNldHRpbmdzeydGSVhfQUREUid9JyBzaXplPScx OCcgLz48L3RkPgogICAgPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J3JlbWFyayd9OjwvdGQ+ CiAgICA8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J0ZJWF9SRU1BUksnIHZhbHVlPSckZGhj cHNldHRpbmdzeydGSVhfUkVNQVJLJ30nIHNpemU9JzE4JyAvPjwvdGQ+CjwvdHI+PHRyPgogICAg PHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2VuYWJsZWQnfTwvdGQ+PHRkPjxpbnB1dCB0eXBl PSdjaGVja2JveCcgbmFtZT0nRklYX0VOQUJMRUQnICRjaGVja2VkeydGSVhfRU5BQkxFRCd9eydv bid9IC8+PC90ZD4KPC90cj48dHI+CiAgICA8dGQgY29sc3BhbiA9ICczJz48Yj4kTGFuZzo6dHJ7 J2RoY3AgYm9vdHAgcHhlIGRhdGEnfTwvYj48L3RkPgo8L3RyPjx0cj4KICAgIDx0ZCBjbGFzcz0n YmFzZSc+bmV4dC1zZXJ2ZXI6PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0n RklYX05FWFRBRERSJyB2YWx1ZT0nJGRoY3BzZXR0aW5nc3snRklYX05FWFRBRERSJ30nIHNpemU9 JzE4JyAvPjwvdGQ+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPmZpbGVuYW1lOjwvdGQ+CiAgICA8dGQ+ PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J0ZJWF9GSUxFTkFNRScgdmFsdWU9JyRkaGNwc2V0dGlu Z3N7J0ZJWF9GSUxFTkFNRSd9JyBzaXplPScxOCcgLz48L3RkPgogICAgPHRkIGNsYXNzPSdiYXNl Jz5yb290IHBhdGg6PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nRklYX1JP T1RQQVRIJyB2YWx1ZT0nJGRoY3BzZXR0aW5nc3snRklYX1JPT1RQQVRIJ30nIHNpemU9JzE4JyAv PjwvdGQ+CjwvdHI+CjwvdGFibGU+CjxociAvPgo8dGFibGUgd2lkdGg9JzEwMCUnPgo8dHI+CiAg ICA8dGQgY2xhc3M9J2Jhc2UnIHdpZHRoPSc1MCUnPjxpbWcgc3JjPScvYmxvYi5naWYnIGFsaWdu PSd0b3AnIGFsdD0nKicgLz4mbmJzcDskTGFuZzo6dHJ7J3JlcXVpcmVkIGZpZWxkJ308L3RkPgog ICAgPHRkIHdpZHRoPSc1MCUnIGFsaWduPSdyaWdodCc+Cgk8aW5wdXQgdHlwZT0naGlkZGVuJyBu YW1lPSdBQ1RJT04nIHZhbHVlPSckTGFuZzo6dHJ7J2FkZCd9MicgLz4KCTxpbnB1dCB0eXBlPSdz dWJtaXQnIG5hbWU9J1NVQk1JVCcgdmFsdWU9JyRidXR0b250ZXh0JyAvPgoJPGlucHV0IHR5cGU9 J2hpZGRlbicgbmFtZT0nS0VZMicgdmFsdWU9JyRkaGNwc2V0dGluZ3N7J0tFWTInfScgLz48L3Rk Pgo8L3RyPgo8L3RhYmxlPgo8L2Zvcm0+CkVORAo7CiNFZGl0ZWQgbGluZSBudW1iZXIgKEtFWTIp IHBhc3NlZCB1bnRpbCBjbGVhcmVkIGJ5ICdzYXZlJyBvciAncmVtb3ZlJyBvciAnbmV3IHNvcnQg b3JkZXInCgojIFNlYXJjaCBmb3Igc3RhdGljIGxlYXNlcwpteSAkc2VhcmNoX3F1ZXJ5ID0gJGRo Y3BzZXR0aW5nc3sncSd9OwoKaWYgKHNjYWxhciBAY3VycmVudDIgPj0gMTApIHsKCXByaW50IDw8 RU5EOwoJCTxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIjc2VhcmNoIj4KCQkJPGEgbmFtZT0i c2VhcmNoIj48L2E+CgkJCTx0YWJsZSB3aWR0aD0nMTAwJSc+CgkJCQk8dHI+CgkJCQkJPHRkPgoJ CQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgdmFsdWU9IiRzZWFyY2hfcXVlcnkiPgoJ CQkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJExhbmc6OnRyeydzZWFyY2gnfSI+CgkJ CQkJPC90ZD4KCQkJCTwvdHI+CgkJCTwvdGFibGU+CgkJPC9mb3JtPgpFTkQKfQoKcHJpbnQgPDxF TkQKPHRhYmxlIHdpZHRoPScxMDAlJyBjbGFzcz0ndGJsJz4KPHRyPgogICAgPHRoIHdpZHRoPScy MCUnIGFsaWduPSdjZW50ZXInPjxhIGhyZWY9JyRFTlZ7J1NDUklQVF9OQU1FJ30/RkVUSEVSJz48 Yj4kTGFuZzo6dHJ7J21hYyBhZGRyZXNzJ308L2I+PC9hPjwvdGg+CiAgICA8dGggd2lkdGg9JzIw JScgYWxpZ249J2NlbnRlcic+PGEgaHJlZj0nJEVOVnsnU0NSSVBUX05BTUUnfT9GSVBBRERSJz48 Yj4kTGFuZzo6dHJ7J2lwIGFkZHJlc3MnfTwvYj48L2E+PC90aD4KICAgIDx0aCB3aWR0aD0nMTUl JyBhbGlnbj0nY2VudGVyJz48Yj4kTGFuZzo6dHJ7J3JlbWFyayd9PC9iPjwvdGg+CiAgICA8dGgg d2lkdGg9JzE1JScgY2xhc3M9J2JvbGRiYXNlJyBhbGlnbj0nY2VudGVyJz48Yj5uZXh0LXNlcnZl cjwvYj48L3RoPgogICAgPHRoIHdpZHRoPScxNSUnIGNsYXNzPSdib2xkYmFzZScgYWxpZ249J2Nl bnRlcic+PGI+ZmlsZW5hbWU8L2I+PC90aD4KICAgIDx0aCB3aWR0aD0nMTUlJyBjbGFzcz0nYm9s ZGJhc2UnIGFsaWduPSdjZW50ZXInPjxiPnJvb3QgcGF0aDwvYj48L3RoPgogICAgPHRoIGNvbHNw YW49JzMnIGNsYXNzPSdib2xkYmFzZScgYWxpZ249J2NlbnRlcic+PGI+JExhbmc6OnRyeydhY3Rp b24nfTwvYj48L3RoPgo8L3RyPgpFTkQKOwpteSAkaXBkdXAgPSAwOwpteSAlaXBpbnVzZSA9ICgp OwpteSAlbWFjZHVwbCA9ICgpOyAjIER1cGxpY2F0ZSBNQUNzIGhhdmUgdG8gYmUgb24gZGlmZmVy ZW50IHN1Ym5ldHMKbXkgJWlwb3V0c2lkZSA9ICgpOwoKIyBtYXJrIGR1cGxpY2F0ZSBpcCBvciBk dXBsaWNhdGUgTUFDCmZvcmVhY2ggbXkgJGxpbmUgKEBjdXJyZW50MikgewogICAgbXkgQHRlbXAg PSBzcGxpdCgvXCwvLCRsaW5lKTsKICAgICRtYWNkdXBseyR0ZW1wWzBdfSArPSAxOwogICAgaWYg KCRtYWNkdXBseyR0ZW1wWzBdfSA+IDEpIHsgCgkkaXBkdXAgPSAxOyAJIyBGbGFnIHVwIGR1cGxp Y2F0ZXMgZm9yIHVzZSBsYXRlcgogICAgfQogICAgJGlwaW51c2V7JHRlbXBbMV19ICs9IDE7CiAg ICBpZiAoJGlwaW51c2V7JHRlbXBbMV19ID4gMSkgeyAKCSRpcGR1cCA9IDE7IAkjIEZsYWcgdXAg ZHVwbGljYXRlcyBmb3IgdXNlIGxhdGVyCiAgICB9CiAgICAjIE1hcmsgSVAgYWRkcmVzc2VzIG91 dHdpdGgga25vd24gc3VibmV0cwogICAgJGlwb3V0c2lkZXskdGVtcFsxXX0gPSAxOwogICAgZm9y ZWFjaCBteSAkaXRmIChASVRGcykgewogICAgICAgIGlmICggJkdlbmVyYWw6OklwSW5TdWJuZXQo JHRlbXBbMV0sCiAgICAgICAgICAgICAgICAkbmV0c2V0dGluZ3N7IiR7aXRmfV9ORVRBRERSRVNT In0sIAogICAgICAgICAgICAgICAgJG5ldHNldHRpbmdzeyIke2l0Zn1fTkVUTUFTSyJ9KSkgewog ICAgICAgICAgICAkaXBvdXRzaWRleyR0ZW1wWzFdfSA9IDA7CiAgICAgICAgfQogICAgfQp9Cgok a2V5ID0gMDsKbXkgJGNvbD0iIjsKZm9yZWFjaCBteSAkbGluZSAoQGN1cnJlbnQyKSB7CiAgICBt eSAkZ2lmID0gJyc7CiAgICBteSAkZ2Rlc2MgPSAnJzsKICAgIGNob21wKCRsaW5lKTsgICAjIHJl bW92ZSBuZXdsaW5lCiAgICBteSBAdGVtcCA9IHNwbGl0KC9cLC8sJGxpbmUpOwoKICAgIGlmICgk dGVtcFsyXSBlcSAib24iKSB7CgkkZ2lmID0gJ29uLmdpZic7CgkkZ2Rlc2MgPSAkTGFuZzo6dHJ7 J2NsaWNrIHRvIGRpc2FibGUnfTsKICAgIH0gZWxzZSB7CgkkZ2lmID0gJ29mZi5naWYnOwoJJGdk ZXNjID0gJExhbmc6OnRyeydjbGljayB0byBlbmFibGUnfTsgCiAgICB9CgogICAgIyBTa2lwIGFs bCBlbnRyaWVzIHRoYXQgZG8gbm90IG1hdGNoIHRoZSBzZWFyY2ggcXVlcnkKICAgIGlmICgkc2Vh cmNoX3F1ZXJ5IG5lICIiKSB7CglpZiAoIWdyZXAoLyRzZWFyY2hfcXVlcnkvLCBAdGVtcCkpIHsK CQkka2V5Kys7CgkJbmV4dDsKCX0KICAgIH0KCiAgICBpZiAoJGRoY3BzZXR0aW5nc3snS0VZMid9 IGVxICRrZXkpIHsKCXByaW50ICI8dHI+IjsKCSRjb2w9ImJnY29sb3I9JyR7SGVhZGVyOjpjb2xv dXJ5ZWxsb3d9JyI7CiAgICB9IGVsc2lmICgka2V5ICUgMikgewoJcHJpbnQgIjx0cj4iOwoJJGNv bD0iYmdjb2xvcj0nJGNvbG9yeydjb2xvcjIwJ30nIjsKICAgIH0gZWxzZSB7CglwcmludCAiPHRy PiI7CgkkY29sPSJiZ2NvbG9yPSckY29sb3J7J2NvbG9yMjInfSciOwogICAgfQogICAgbXkgJFRB RzAgPSAnJzsKICAgIG15ICRUQUcxID0gJyc7CiAgICBteSAkVEFHMiA9ICcnOwogICAgbXkgJFRB RzMgPSAnJzsKICAgIG15ICRUQUc0ID0gJyc7CiAgICBpZiAoJGlwaW51c2V7JHRlbXBbMV19ID4g MSkgeyAKCSRUQUcwID0gJzxiPic7CgkkVEFHMSA9ICc8L2I+JzsKICAgIH0KICAgIGlmICgkbWFj ZHVwbHskdGVtcFswXX0gPiAxKSB7IAoJJFRBRzIgPSAnPGI+JzsKCSRUQUczID0gJzwvYj4nOwog ICAgfQogICAgaWYgKCRpcG91dHNpZGV7JHRlbXBbMV19ID4gMCkgeyAKCSRUQUc0ID0gImJnY29s b3I9J29yYW5nZSciIGlmICgkZGhjcHNldHRpbmdzeydLRVkyJ30gbmUgJGtleSk7CiAgICB9Cgog ICAgcHJpbnQgPDxFTkQKPHRkIGFsaWduPSdjZW50ZXInICRjb2w+JFRBRzIkdGVtcFswXSRUQUcz PC90ZD4KPHRkIGFsaWduPSdjZW50ZXInICRjb2wgJFRBRzQ+JFRBRzAkdGVtcFsxXSRUQUcxPC90 ZD4KPHRkIGFsaWduPSdjZW50ZXInICRjb2w+JHRlbXBbNl0mbmJzcDs8L3RkPgo8dGQgYWxpZ249 J2NlbnRlcicgJGNvbD4kdGVtcFszXSZuYnNwOzwvdGQ+Cjx0ZCBhbGlnbj0nY2VudGVyJyAkY29s PiR0ZW1wWzRdJm5ic3A7PC90ZD4KPHRkIGFsaWduPSdjZW50ZXInICRjb2w+JHRlbXBbNV0mbmJz cDs8L3RkPgoKPHRkIGFsaWduPSdjZW50ZXInICRjb2w+Cjxmb3JtIG1ldGhvZD0ncG9zdCcgYWN0 aW9uPSckRU5WeydTQ1JJUFRfTkFNRSd9Jz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nQUNU SU9OJyB2YWx1ZT0nJExhbmc6OnRyeyd0b2dnbGUgZW5hYmxlIGRpc2FibGUnfTInIC8+CjxpbnB1 dCB0eXBlPSdpbWFnZScgbmFtZT0nJExhbmc6OnRyeyd0b2dnbGUgZW5hYmxlIGRpc2FibGUnfScg c3JjPScvaW1hZ2VzLyRnaWYnIGFsdD0nJGdkZXNjJyB0aXRsZT0nJGdkZXNjJyAvPgo8aW5wdXQg dHlwZT0naGlkZGVuJyBuYW1lPSdLRVkyJyB2YWx1ZT0nJGtleScgLz4KPC9mb3JtPgo8L3RkPgoK PHRkIGFsaWduPSdjZW50ZXInICRjb2w+Cjxmb3JtIG1ldGhvZD0ncG9zdCcgYWN0aW9uPSckRU5W eydTQ1JJUFRfTkFNRSd9Jz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nQUNUSU9OJyB2YWx1 ZT0nJExhbmc6OnRyeydlZGl0J30yJyAvPgo8aW5wdXQgdHlwZT0naW1hZ2UnIG5hbWU9JyRMYW5n Ojp0cnsnZWRpdCd9JyBzcmM9Jy9pbWFnZXMvZWRpdC5naWYnIGFsdD0nJExhbmc6OnRyeydlZGl0 J30nIHRpdGxlPSckTGFuZzo6dHJ7J2VkaXQnfScgLz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFt ZT0nS0VZMicgdmFsdWU9JyRrZXknIC8+CjwvZm9ybT4KPC90ZD4KCjx0ZCBhbGlnbj0nY2VudGVy JyAkY29sPgo8Zm9ybSBtZXRob2Q9J3Bvc3QnIGFjdGlvbj0nJEVOVnsnU0NSSVBUX05BTUUnfSc+ CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J0FDVElPTicgdmFsdWU9JyRMYW5nOjp0cnsncmVt b3ZlJ30yJyAvPgo8aW5wdXQgdHlwZT0naW1hZ2UnIG5hbWU9JyRMYW5nOjp0cnsncmVtb3ZlJ30n IHNyYz0nL2ltYWdlcy9kZWxldGUuZ2lmJyBhbHQ9JyRMYW5nOjp0cnsncmVtb3ZlJ30nIHRpdGxl PSckTGFuZzo6dHJ7J3JlbW92ZSd9JyAvPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdLRVky JyB2YWx1ZT0nJGtleScgLz4KPC9mb3JtPgo8L3RkPgo8L3RyPgpFTkQKOwogICAgJGtleSsrOwp9 CnByaW50ICI8L3RhYmxlPiI7CgojIElmIHRoZSBmaXhlZCBsZWFzZSBmaWxlIGNvbnRhaW5zIGVu dHJpZXMsIHByaW50IEtleSB0byBhY3Rpb24gaWNvbnMKaWYgKCRrZXkpIHsKbXkgJGR1cCA9ICRp cGR1cCA/ICI8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnZHVwbGljYXRlIGlwIGJvbGQnfTwv dGQ+IiA6Jyc7CnByaW50IDw8RU5ECjx0YWJsZT4KPHRyPgoJPHRkIGNsYXNzPSdib2xkYmFzZSc+ Jm5ic3A7PGI+JExhbmc6OnRyeydsZWdlbmQnfTombmJzcDs8L2I+PC90ZD4KCTx0ZD48aW1nIHNy Yz0nL2ltYWdlcy9vbi5naWYnIGFsdD0nJExhbmc6OnRyeydjbGljayB0byBkaXNhYmxlJ30nIC8+ PC90ZD4KCTx0ZCBjbGFzcz0nYmFzZSc+JExhbmc6OnRyeydjbGljayB0byBkaXNhYmxlJ308L3Rk PgoJPHRkPiZuYnNwOyZuYnNwOzwvdGQ+Cgk8dGQ+PGltZyBzcmM9Jy9pbWFnZXMvb2ZmLmdpZicg YWx0PSckTGFuZzo6dHJ7J2NsaWNrIHRvIGVuYWJsZSd9JyAvPjwvdGQ+Cgk8dGQgY2xhc3M9J2Jh c2UnPiRMYW5nOjp0cnsnY2xpY2sgdG8gZW5hYmxlJ308L3RkPgoJPHRkPiZuYnNwOyZuYnNwOzwv dGQ+Cgk8dGQ+PGltZyBzcmM9Jy9pbWFnZXMvZWRpdC5naWYnIGFsdD0nJExhbmc6OnRyeydlZGl0 J30nIC8+PC90ZD4KCTx0ZCBjbGFzcz0nYmFzZSc+JExhbmc6OnRyeydlZGl0J308L3RkPgoJPHRk PiZuYnNwOyZuYnNwOzwvdGQ+Cgk8dGQ+PGltZyBzcmM9Jy9pbWFnZXMvZGVsZXRlLmdpZicgYWx0 PSckTGFuZzo6dHJ7J3JlbW92ZSd9JyAvPjwvdGQ+Cgk8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0 cnsncmVtb3ZlJ308L3RkPgo8L3RyPgo8dHI+Cgk8dGQ+Jm5ic3A7PC90ZD4KCTx0ZCBiZ2NvbG9y PSdvcmFuZ2UnPiZuYnNwOzwvdGQ+Cgk8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnaXAgYWRk cmVzcyBvdXRzaWRlIHN1Ym5ldHMnfTwvdGQ+Cgk8dGQ+Jm5ic3A7PC90ZD4KCTx0ZD4mbmJzcDs8 L3RkPgoJJGR1cAo8L3RyPgo8L3RhYmxlPgpFTkQKOwp9CgomSGVhZGVyOjpjbG9zZWJveCgpOwoK Zm9yZWFjaCBteSAkaXRmIChASVRGcykgewogICAgaWYgKCRkaGNwc2V0dGluZ3N7IkVOQUJMRV8k e2l0Zn0ifSBlcSAnb24nKSB7CgkjIGRpc3BsYXkgbGVhc2VzIHdpdGggYSBsaXN0IG9mIGFjdGlv bnMgdG8gZG8gd2l0aCB0aGUgZ2xvYmFsIHNlbGVjdCBjaGVja2JveC4KCSZIZWFkZXI6OlByaW50 QWN0dWFsTGVhc2VzKCIrIik7CSMgIisiID0+IGNyZWF0ZSBmaXhlZCBsZWFzZXMgZnJvbSBub2Rl YWRkcmVzcwoJbGFzdDsgCQkJI1ByaW50IG9uZSB0aW1lIG9ubHkgZm9yIGFsbCBpbnRlcmZhY2Vz CiAgICB9Owp9CgomSGVhZGVyOjpjbG9zZWJpZ2JveCgpOwomSGVhZGVyOjpjbG9zZXBhZ2UoKTsK CiMjIE91ZiBpdCdzIHRoZSBlbmQgIQoKc3ViIHNvcnRjdXJyZW50MSAgIyBieSBub3csIGRvIG5v dCBzb3J0LCBqdXN0IHdyaXRlCnsKICAgIG9wZW4oRklMRSwgIj4kZmlsZW5hbWUxIikgb3IgZGll ICdVbmFibGUgdG8gb3BlbiBkaGNwIGFkdmFuY2VkIG9wdGlvbnMgZmlsZS4nOwogICAgcHJpbnQg RklMRSBAY3VycmVudDE7CiAgICBjbG9zZShGSUxFKTsKfQoKCiMgU29ydCB0aGUgImN1cnJlbnQy IiBhcnJheSBhY2NvcmRpbmcgdG8gY2hvaWNlcwpzdWIgc29ydGN1cnJlbnQyCnsKICAgIG91ciAl ZW50cmllcyA9ICgpOwoKICAgIHN1YiBmaXhlZGxlYXNlc29ydCB7CglteSAkcXM9Jyc7CglpZiAo cmluZGV4ICgkZGhjcHNldHRpbmdzeydTT1JUX0ZMRUFTRUxJU1QnfSwnUmV2JykgIT0gLTEpIHsK CSAgICAkcXM9c3Vic3RyICgkZGhjcHNldHRpbmdzeydTT1JUX0ZMRUFTRUxJU1QnfSwwLGxlbmd0 aCgkZGhjcHNldHRpbmdzeydTT1JUX0ZMRUFTRUxJU1QnfSktMyk7CgkgICAgaWYgKCRxcyBlcSAn RklQQUREUicpIHsKCQlteSBAYSA9IHNwbGl0KC9cLi8sJGVudHJpZXN7JGF9LT57JHFzfSk7CgkJ bXkgQGIgPSBzcGxpdCgvXC4vLCRlbnRyaWVzeyRifS0+eyRxc30pOwoJCSgkYlswXTw9PiRhWzBd KSB8fAoJCSgkYlsxXTw9PiRhWzFdKSB8fAoJCSgkYlsyXTw9PiRhWzJdKSB8fAoJCSgkYlszXTw9 PiRhWzNdKTsKCSAgICB9IGVsc2UgewoJCSRlbnRyaWVzeyRifS0+eyRxc30gY21wICRlbnRyaWVz eyRhfS0+eyRxc307CgkgICAgfQoJfSBlbHNlIHsgI25vdCByZXZlcnNlCgkgICAgJHFzPSRkaGNw c2V0dGluZ3N7J1NPUlRfRkxFQVNFTElTVCd9OwoJICAgIGlmICgkcXMgZXEgJ0ZJUEFERFInKSB7 CgkJbXkgQGEgPSBzcGxpdCgvXC4vLCRlbnRyaWVzeyRhfS0+eyRxc30pOwoJCW15IEBiID0gc3Bs aXQoL1wuLywkZW50cmllc3skYn0tPnskcXN9KTsKCQkoJGFbMF08PT4kYlswXSkgfHwKCQkoJGFb MV08PT4kYlsxXSkgfHwKCQkoJGFbMl08PT4kYlsyXSkgfHwKCQkoJGFbM108PT4kYlszXSk7Cgkg ICAgfSBlbHNlIHsKCQkkZW50cmllc3skYX0tPnskcXN9IGNtcCAkZW50cmllc3skYn0tPnskcXN9 OwoJICAgIH0KCX0KICAgIH0KCiAgICAjVXNlIGFuIGFzc29jaWF0aXZlIGFycmF5ICglZW50cmll cykKICAgIGZvcmVhY2ggbXkgJGxpbmUgKEBjdXJyZW50MikgewoJY2hvbXAoICRsaW5lKTsgI3Jl bW92ZSBuZXdsaW5lIGJlY2F1c2UgY2FuIGJlIG9uIGZpZWxkIDUgb3IgNiAoYWRkaXRpb24gb2Yg UkVNQVJLKQoJbXkgQHRlbXAgPSBzcGxpdCAoJywnLCRsaW5lKTsKCW15IEByZWNvcmQgPSAoJ0ZF VEhFUicsJHRlbXBbMF0sJ0ZJUEFERFInLCR0ZW1wWzFdLCdEQVRBJyxqb2luKCcsJyxAdGVtcFsy Li42XSkpOwoJbXkgJHJlY29yZCA9IHt9OyAgICAgICAgICAgICAgICAgICAgICAgICMgY3JlYXRl IGEgcmVmZXJlbmNlIHRvIGVtcHR5IGhhc2gKCSV7JHJlY29yZH0gPSBAcmVjb3JkOyAgICAgICAg ICAgICAgICAJIyBwb3B1bGF0ZSB0aGF0IGhhc2ggd2l0aCBAcmVjb3JkCgkjIHVzZSBjb21iaW5h dGlvbiBvZiBldGhlciAmIElQIGFzIGtleSB0byBhbGxvdyBkdXBsaWNhdGVzIGluIGVpdGhlciBi dXQgbm90IGJvdGgKCSRlbnRyaWVzeyRyZWNvcmQtPntGRVRIRVJ9IC4gJHJlY29yZC0+e0ZJUEFE RFJ9fSA9ICRyZWNvcmQ7ICMgYWRkIHRoaXMgdG8gYSBoYXNoIG9mIGhhc2hlcwogICAgfQogICAg CiAgICBvcGVuKEZJTEUsICI+JGZpbGVuYW1lMiIpIG9yIGRpZSAnVW5hYmxlIHRvIG9wZW4gZml4 ZWQgbGVhc2UgZmlsZS4nOwogICAgZm9yZWFjaCBteSAkZW50cnkgKCBzb3J0IGZpeGVkbGVhc2Vz b3J0IGtleXMgJWVudHJpZXMpIHsKCXByaW50IEZJTEUgIiRlbnRyaWVzeyRlbnRyeX0tPntGRVRI RVJ9LCRlbnRyaWVzeyRlbnRyeX0tPntGSVBBRERSfSwkZW50cmllc3skZW50cnl9LT57REFUQX1c biI7CiAgICB9CiAgICBjbG9zZShGSUxFKTsKCiAgICAjIFJlbG9hZCBzb3J0ZWQgIEBjdXJyZW50 MgogICAgb3BlbiAoRklMRSwgIiRmaWxlbmFtZTIiKTsKICAgIEBjdXJyZW50MiA9IDxGSUxFPjsK ICAgIGNsb3NlIChGSUxFKTsKICAgIHVuZGVmICglZW50cmllcyk7ICAjVGhpcyBhcnJheSBpcyBy ZXVzZWQgbGF0dGVyLiBDbGVhciBpdC4KfQoJCQkJCQkgICAgCiMgQnVpbGQgdGhlIGNvbmZpZ3Vy YXRpb24gZmlsZSBtaXhpbmcgIHNldHRpbmdzLCBmaXhlZCBsZWFzZXMgYW5kIGFkdmFuY2VkIG9w dGlvbnMKc3ViIGJ1aWxkY29uZiB7CiAgICBvcGVuKEZJTEUsICI+LyR7R2VuZXJhbDo6c3dyb290 fS9kaGNwL2RoY3BkLmNvbmYiKSBvciBkaWUgIlVuYWJsZSB0byB3cml0ZSBkaGNwZC5jb25mIGZp bGUiOwogICAgZmxvY2soRklMRSwgMik7CgogICAgIyBHbG9iYWwgc2V0dGluZ3MKICAgIHByaW50 IEZJTEUgImRlbnkgYm9vdHA7CSNkZWZhdWx0XG4iOwogICAgcHJpbnQgRklMRSAiYXV0aG9yaXRh dGl2ZTtcbiI7CgogICAgIyBETlMgVXBkYXRlIHNldHRpbmdzCiAgICBpZiAoJGRoY3BzZXR0aW5n c3snRE5TX1VQREFURV9FTkFCTEVEJ30gZXEgJ29uJykgewogICAgICAgIHByaW50IEZJTEUgImRk bnMtdXBkYXRlcyAgICAgICAgICAgb247XG4iOwogICAgICAgIHByaW50IEZJTEUgImRkbnMtdXBk YXRlLXN0eWxlICAgICAgaW50ZXJpbTtcbiI7CiAgICAgICAgcHJpbnQgRklMRSAiZGRucy10dGwg ICAgICAgICAgICAgICA2MDsgIyAxIG1pblxuIjsKICAgICAgICBwcmludCBGSUxFICJpZ25vcmUg ICAgICAgICAgICAgICAgIGNsaWVudC11cGRhdGVzO1xuIjsKICAgICAgICBwcmludCBGSUxFICJ1 cGRhdGUtc3RhdGljLWxlYXNlcyAgIG9uO1xuIjsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQg RklMRSAiZGRucy11cGRhdGUtc3R5bGUgbm9uZTtcbiI7CiAgICB9CiAgICAKICAgICMgV3JpdGUg Zmlyc3QgbmV3IG9wdGlvbiBkZWZpbml0aW9uCiAgICBmb3JlYWNoIG15ICRsaW5lIChAY3VycmVu dDEpIHsKCWNob21wKCRsaW5lKTsgICAjIHJlbW92ZSBuZXdsaW5lCglteSBAdGVtcCA9IHNwbGl0 KC9cdC8sJGxpbmUpOwogICAgICAgIGlmIChFeGlzdE5ld09wdGlvbkRlZmluaXRpb24gKCR0ZW1w WzFdIC4gJyAnIC4gJHRlbXBbMl0pKSB7CgkJcHJpbnQgRklMRSAib3B0aW9uICR0ZW1wWzFdICR0 ZW1wWzJdO1xuIjsKCX0KICAgIH0KICAgICMgV3JpdGUgb3RoZXIgZ2xvYmFsIG9wdGlvbnMKICAg IGZvcmVhY2ggbXkgJGxpbmUgKEBjdXJyZW50MSkgewoJY2hvbXAoJGxpbmUpOyAgICMgcmVtb3Zl IG5ld2xpbmUKCW15IEB0ZW1wID0gc3BsaXQoL1x0LywkbGluZSk7CgkKCWlmICgkdGVtcFswXSBl cSAnb24nICYmICFFeGlzdE5ld09wdGlvbkRlZmluaXRpb24gKCR0ZW1wWzFdIC4gJyAnIC4gJHRl bXBbMl0pKXsgIyBhY3RpdmUgJiAhZGVmaW5pdGlvbgoJICAgIG15ICRnbG9iYWw9MTsKCSAgICBm b3IgKG15ICRrZXk9MDsgJGtleTxASVRGczsgJGtleSsrKSB7CgkJbXkgJGl0ZiA9ICR0ZW1wWzMr JGtleV07CgkJaWYgKCRpdGYgbmUgJ29mZicpICMgT25seSBpZiBhbiBpbnRlcmZhY2UgbmFtZSBp cyByZWFkCgkJewoJCSAgICAkZ2xvYmFsPTA7CgkJfQoJICAgIH0KCSAgICBpZiAoJGdsb2JhbCkg ewoJCXByaW50IEZJTEUgIm9wdGlvbiAkdGVtcFsxXSAkdGVtcFsyXTtcbiI7CgkgICAgfQoJfSMg b24gICAgCiAgICB9IyBmb3JlYWNoIGxpbmUKICAgIHByaW50IEZJTEUgIlxuIjsKCiAgICAjU3Vi bmV0IHJhbmdlIGRlZmluaXRpb24KICAgIGZvcmVhY2ggbXkgJGl0ZiAoQElURnMpIHsKCW15ICRs Y19pdGY9bGMoJGl0Zik7CglpZiAoJGRoY3BzZXR0aW5nc3siRU5BQkxFXyR7aXRmfSJ9IGVxICdv bicgKXsKCSAgICBwcmludCBGSUxFICJzdWJuZXQgIiAuICRuZXRzZXR0aW5nc3siJHtpdGZ9X05F VEFERFJFU1MifSAuICIgbmV0bWFzayAiLiAkbmV0c2V0dGluZ3N7IiR7aXRmfV9ORVRNQVNLIn0g LiAiICMkaXRmXG4iOwoJICAgIHByaW50IEZJTEUgIntcbiI7CgkgICAgaWYgKCRkaGNwc2V0dGlu Z3N7IlNUQVJUX0FERFJfJHtpdGZ9In0pIHsKCQlwcmludCBGSUxFICJwb29sIHtcbiI7CgkJcHJp bnQgRklMRSAiXHRyYW5nZSAiIC4gJGRoY3BzZXR0aW5nc3siU1RBUlRfQUREUl8ke2l0Zn0ifSAu ICcgJyAuICRkaGNwc2V0dGluZ3N7IkVORF9BRERSXyR7aXRmfSJ9LiI7XG4iOwoJCXByaW50IEZJ TEUgIlx0ZGVueSBrbm93bi1jbGllbnRzO1xuIiBpZiAoJGRoY3BzZXR0aW5nc3siREVOWV9LTk9X Tl9DTElFTlRTXyR7aXRmfSJ9IGVxICdvbicpOwoJCXByaW50IEZJTEUgIiAgICAgfVxuIjsgIyBw b29sCgkgICAgfQoJICAgIHByaW50IEZJTEUgIlx0b3B0aW9uIHN1Ym5ldC1tYXNrICIgICAuICRu ZXRzZXR0aW5nc3siJHtpdGZ9X05FVE1BU0sifSAuICI7XG4iOwoJICAgIHByaW50IEZJTEUgIlx0 b3B0aW9uIGRvbWFpbi1uYW1lIFwiIiAuICRkaGNwc2V0dGluZ3N7IkRPTUFJTl9OQU1FXyR7aXRm fSJ9IC4gIlwiO1xuIjsKCSAgICBwcmludCBGSUxFICJcdG9wdGlvbiByb3V0ZXJzICIgLiAkbmV0 c2V0dGluZ3N7IiR7aXRmfV9BRERSRVNTIn0gLiAiO1xuIjsKCSAgICBwcmludCBGSUxFICJcdG9w dGlvbiBkb21haW4tbmFtZS1zZXJ2ZXJzICIgLiAkZGhjcHNldHRpbmdzeyJETlMxXyR7aXRmfSJ9 ICBpZiAoJGRoY3BzZXR0aW5nc3siRE5TMV8ke2l0Zn0ifSk7CgkgICAgcHJpbnQgRklMRSAiLCAi IC4gJGRoY3BzZXR0aW5nc3siRE5TMl8ke2l0Zn0ifSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgaWYgKCRkaGNwc2V0dGluZ3N7IkROUzJfJHtpdGZ9In0pOwoJICAgIHByaW50IEZJTEUgIjtc biIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGlmICgkZGhjcHNldHRpbmdzeyJETlMxXyR7aXRmfSJ9KTsKCSAgICBwcmludCBGSUxFICJc dG9wdGlvbiBudHAtc2VydmVycyAiIC4gJGRoY3BzZXR0aW5nc3siTlRQMV8ke2l0Zn0ifSAgICAg ICAgICBpZiAoJGRoY3BzZXR0aW5nc3siTlRQMV8ke2l0Zn0ifSk7CgkgICAgcHJpbnQgRklMRSAi LCAiIC4gJGRoY3BzZXR0aW5nc3siTlRQMl8ke2l0Zn0ifSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgaWYgKCRkaGNwc2V0dGluZ3N7Ik5UUDJfJHtpdGZ9In0pOwoJICAgIHByaW50IEZJTEUg IjtcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGlmICgkZGhjcHNldHRpbmdzeyJOVFAxXyR7aXRmfSJ9KTsKCSAgICBwcmludCBGSUxF ICJcdG9wdGlvbiBuZXRiaW9zLW5hbWUtc2VydmVycyAiIC4gJGRoY3BzZXR0aW5nc3siV0lOUzFf JHtpdGZ9In0gICAgIGlmICgkZGhjcHNldHRpbmdzeyJXSU5TMV8ke2l0Zn0ifSk7CgkgICAgcHJp bnQgRklMRSAiLCAiIC4gJGRoY3BzZXR0aW5nc3siV0lOUzJfJHtpdGZ9In0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgaWYgKCRkaGNwc2V0dGluZ3N7IldJTlMyXyR7aXRmfSJ9KTsKCSAgICBw cmludCBGSUxFICI7XG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBpZiAoJGRoY3BzZXR0aW5nc3siV0lOUzFfJHtpdGZ9In0pOwoJICAg IHByaW50IEZJTEUgIlx0bmV4dC1zZXJ2ZXIgIiAuICRkaGNwc2V0dGluZ3N7Ik5FWFRfJHtpdGZ9 In0gLiAiO1xuIiBpZiAoJGRoY3BzZXR0aW5nc3siTkVYVF8ke2l0Zn0ifSk7CgkgICAgcHJpbnQg RklMRSAiXHRmaWxlbmFtZSBcIiIgLiAmRXNjYXBlRmlsZW5hbWUoJGRoY3BzZXR0aW5nc3siRklM RV8ke2l0Zn0ifSkgLiAiXCI7XG4iIGlmICgkZGhjcHNldHRpbmdzeyJGSUxFXyR7aXRmfSJ9KTsK CSAgICBwcmludCBGSUxFICJcdGRlZmF1bHQtbGVhc2UtdGltZSAiIC4gKCRkaGNwc2V0dGluZ3N7 IkRFRkFVTFRfTEVBU0VfVElNRV8ke2l0Zn0ifSAqIDYwKS4gIjtcbiI7CgkgICAgcHJpbnQgRklM RSAiXHRtYXgtbGVhc2UtdGltZSAiICAgICAuICgkZGhjcHNldHRpbmdzeyJNQVhfTEVBU0VfVElN RV8ke2l0Zn0ifSAqIDYwKSAgICAuICI7XG4iOwoJICAgIHByaW50IEZJTEUgIlx0YWxsb3cgYm9v dHA7XG4iIGlmICgkZGhjcHNldHRpbmdzeyJFTkFCTEVCT09UUF8ke2l0Zn0ifSBlcSAnb24nKTsK CgoKCSAgICAjIFdyaXRlIHNjb3BlZCBvcHRpb25zCgkgICAgZm9yZWFjaCBteSAkbGluZSAoQGN1 cnJlbnQxKSB7CgkJY2hvbXAoJGxpbmUpOyAgICMgcmVtb3ZlIG5ld2xpbmUKCQlteSBAdGVtcCA9 IHNwbGl0KC9cdC8sJGxpbmUpOwkJIyBVc2UgVEFCIHNlcGFyYXRvciAhCgkKCQlpZiAoJHRlbXBb MF0gZXEgJ29uJyl7CgkJICAgIGZvciAobXkgJGtleT0wOyAka2V5PEBJVEZzOyAka2V5KyspIHsK CQkJaWYgKCRpdGYgZXEgJHRlbXBbMyska2V5XSkgIyBPbmx5IGlzIGFuIGludGVyZmFjZSBuYW1l IGlzIHJlYWQKCQkJewoJCQkgICAgcHJpbnQgRklMRSAiXHRvcHRpb24gJHRlbXBbMV0gJHRlbXBb Ml07XG4iOwoJCQl9CgkJICAgIH0KCQl9IyBvbiAgICAKCSAgICB9IyBmb3JlYWNoIGxpbmUKCSAg ICBwcmludCBGSUxFICJ9ICMkaXRmXG5cbiI7CgoJICAgIGlmICgoJGRoY3BzZXR0aW5nc3siRE5T X1VQREFURV9FTkFCTEVEIn0gZXEgIm9uIikgJiYgKCRkaGNwc2V0dGluZ3N7IkROU19VUERBVEVf S0VZX05BTUVfJHtpdGZ9In0gbmUgIiIpKSB7CgkgICAgICAgIHByaW50IEZJTEUgImtleSAiIC4g JGRoY3BzZXR0aW5nc3siRE5TX1VQREFURV9LRVlfTkFNRV8ke2l0Zn0ifSAuICIge1xuIjsKCSAg ICAgICAgcHJpbnQgRklMRSAiXHRhbGdvcml0aG0gIiAuICRkaGNwc2V0dGluZ3N7IkROU19VUERB VEVfS0VZX0FMR09fJHtpdGZ9In0gLiAiO1xuIjsKCSAgICAgICAgcHJpbnQgRklMRSAiXHRzZWNy ZXQgXCIiIC4gJGRoY3BzZXR0aW5nc3siRE5TX1VQREFURV9LRVlfU0VDUkVUXyR7aXRmfSJ9IC4g IlwiO1xuIjsKCSAgICAgICAgcHJpbnQgRklMRSAifTtcblxuIjsKCgkgICAgICAgIHByaW50IEZJ TEUgInpvbmUgIiAuICRkaGNwc2V0dGluZ3N7IkRPTUFJTl9OQU1FXyR7aXRmfSJ9IC4gIi4ge1xu IjsKCSAgICAgICAgcHJpbnQgRklMRSAiXHRrZXkgIiAuICRkaGNwc2V0dGluZ3N7IkROU19VUERB VEVfS0VZX05BTUVfJHtpdGZ9In0gLiAiO1xuIjsKCQlwcmludCBGSUxFICJ9XG5cbiI7CgkgICAg fQoKCSAgICBzeXN0ZW0gKCcvdXNyL2Jpbi90b3VjaCcsICIke0dlbmVyYWw6OnN3cm9vdH0vZGhj cC9lbmFibGVfJHtsY19pdGZ9Iik7CgkgICAgJkdlbmVyYWw6OmxvZygiREhDUCBvbiAke2l0Zn06 ICIgLiAkTGFuZzo6dHJ7J2RoY3Agc2VydmVyIGVuYWJsZWQnfSkKCX0gZWxzZSB7CgkgICAgdW5s aW5rICIke0dlbmVyYWw6OnN3cm9vdH0vZGhjcC9lbmFibGVfJHtsY19pdGZ9IjsKCSAgICAmR2Vu ZXJhbDo6bG9nKCJESENQIG9uICR7aXRmfTogIiAuICRMYW5nOjp0cnsnZGhjcCBzZXJ2ZXIgZGlz YWJsZWQnfSkKCX0KICAgIH0KCiAgICAjd3JpdGUgZml4ZWQgbGVhc2VzIGlmIGFueS4gRG9lcyBu b3QgaGFuZGxlIGR1cGxpY2F0ZXMgdG8gd3JpdGUgdGhlbSBlbHNld2hlcmUgdGhhbiB0aGUgZ2xv YmFsIHNjb3BlLgogICAgbXkgJGtleSA9IDA7CiAgICBmb3JlYWNoIG15ICRsaW5lIChAY3VycmVu dDIpIHsKCWNob21wKCRsaW5lKTsKCW15IEB0ZW1wID0gc3BsaXQoL1wsLywkbGluZSk7CglpZiAo JHRlbXBbMl0gZXEgIm9uIikgewoJICAgIHByaW50IEZJTEUgIlxuaG9zdCBmaXgka2V5ICMgJHRl bXBbNl1cbiI7CgkgICAgcHJpbnQgRklMRSAie1xuIjsKCSAgICBwcmludCBGSUxFICJcdGhhcmR3 YXJlIGV0aGVybmV0ICR0ZW1wWzBdO1xuIjsKCSAgICBwcmludCBGSUxFICJcdGZpeGVkLWFkZHJl c3MgJHRlbXBbMV07XG4iOwoJICAgIHByaW50IEZJTEUgIlx0bmV4dC1zZXJ2ZXIgJHRlbXBbM107 XG4iICAgICAgICAgIGlmICgkdGVtcFszXSk7CgkgICAgcHJpbnQgRklMRSAiXHRmaWxlbmFtZSBc IiIgLiAmRXNjYXBlRmlsZW5hbWUoJHRlbXBbNF0pIC4gIlwiO1xuIiBpZiAoJHRlbXBbNF0pOwoJ ICAgIHByaW50IEZJTEUgIlx0b3B0aW9uIHJvb3QtcGF0aCBcIiR0ZW1wWzVdXCI7XG4iIGlmICgk dGVtcFs1XSk7CgkgICAgcHJpbnQgRklMRSAifVxuIjsKCSAgICAka2V5Kys7Cgl9CiAgICB9CiAg ICBwcmludCBGSUxFICJpbmNsdWRlIFwiJHtHZW5lcmFsOjpzd3Jvb3R9L2RoY3AvZGhjcGQuY29u Zi5sb2NhbFwiO1xuIjsKICAgIGNsb3NlIEZJTEU7CiAgICBpZiAoICRkaGNwc2V0dGluZ3N7IkVO QUJMRV9HUkVFTiJ9IGVxICdvbicgfHwgJGRoY3BzZXR0aW5nc3siRU5BQkxFX0JMVUUifSBlcSAn b24nICkge3N5c3RlbSAnL3Vzci9sb2NhbC9iaW4vZGhjcGN0cmwgZW5hYmxlID4vZGV2L251bGwg Mj4mMSc7fQogICAgZWxzZSB7c3lzdGVtICcvdXNyL2xvY2FsL2Jpbi9kaGNwY3RybCBkaXNhYmxl ID4vZGV2L251bGwgMj4mMSc7fQogICAgc3lzdGVtICcvdXNyL2xvY2FsL2Jpbi9kaGNwY3RybCBy ZXN0YXJ0ID4vZGV2L251bGwgMj4mMSAmJzsKfQoKIwojIFJlY2VpdmUgYSBzdHJpbmcgYW5kIGlm IGl0IG1hdGNoIG1vZGVsIGZvciBhIG5ldyBvcHRpb24sCiMgYWRkIGl0IHRvIHRoZSBsaXN0ICVu ZXdPcHRpb25zCiMKbXkgJU5ld09wdGlvbnMgPSAoKTsKCnN1YiBBZGROZXdPcHRpb25EZWZpbml0 aW9uIHsKICAgIG15ICgkbGluZSkgPSBAXzsKICAgIGlmICggJGxpbmUgPX4gL14oWy1cd10rKSgg Y29kZSBcZCs9KCRPcHRpb25UeXBlcykpLyApIHsKCSROZXdPcHRpb25zeyQxfSA9ICQyOwoJIyZH ZW5lcmFsOjpsb2cgKCJuZXc6PCQxPjwkMj4iKTsKCXJldHVybiAxOwogICAgfQogICAgcmV0dXJu IDA7Cn0KCiMKIyBDaGVjayBleGlzdGVuY2Ugb2YgZGVmaW5pdGlvbiBmb3IgYSBuZXcgb3B0aW9u CiMKc3ViIEV4aXN0TmV3T3B0aW9uRGVmaW5pdGlvbiB7CiAgICBteSAoJGxpbmUpID0gQF87Cgog ICAgaWYgKCAkbGluZSA9fiAvXihbLVx3XSspKCBjb2RlIFxkKz0oJE9wdGlvblR5cGVzKSkvICkg ewoJcmV0dXJuIGRlZmluZWQgJE5ld09wdGlvbnN7JDF9OwogICAgfQogICAgcmV0dXJuIDA7Cn0K CiMKIyBDaGVjayBpZiBpdCBpcyBhIG5ldyBvcHRpb24gKGRlZmluaXRpb24gbXVzdCBleGlzdCkK IyAiY29kZT0iIHRlc3QgZWxpbWluYXRlIGEgZmFsc2UgcmVzcG9uc2Ugd2hlbiBkZWZpbml0aW9u IGV4aXN0cwojIGJ1dCB0aGlzIHN0cmluZyBpcyBhIGRlZmluaXRpb24gd2l0aCBiYWQgJE9wdGlv blR5cGVzLgpzdWIgVmFsaWROZXdPcHRpb24gewogICAgbXkgKCRsaW5lKSA9IEBfOwogICAgaWYg KCRsaW5lID1+IC9eKFstXHddKykgKC4qKS8gKSB7CglyZXR1cm4gZGVmaW5lZCAoICROZXdPcHRp b25zeyQxfSApICYmICQyICF+IC9jb2RlPS87CiAgICB9CiAgICByZXR1cm4gMDsKfQoKIwojIENo ZWNrIGlmIHRoZSBuZXcgb3B0aW9uICRvcHQgaXMgdXNlZCwgZXhjZXB0IHRoZSBkZWZpbml0aW9u IG9mIGl0c2VsZiEKIwpzdWIgSXNVc2VkTmV3T3B0aW9uRGVmaW5pdGlvbiB7CiAgICBteSAoJG9w dCwkdmFsKSA9IEBfOwoKICAgIGZvcmVhY2ggbXkgJGxpbmUgKEBjdXJyZW50MSkgewoJI2Nob21w KCRsaW5lKTsgICAjIHJlbW92ZSBuZXdsaW5lICAgICAgICAjZG9uJ3Qga25vdyB3aHksIGJ1dCB0 aGlzIHJlbW92ZSBuZXdsaW5lIGluIEBjdXJyZW50MSAuLi4uICEKCW15IEB0ZW1wID0gc3BsaXQo L1x0LywkbGluZSk7CgkjIGlmIHdlIGZpbmQgc29tZXRoaW5nICJvcHQgdmFsdWUiICYgdmFsdWUg IT0gImNvZGUgbm5uPSIgaXQncyBvay4KCXJldHVybiAxIGlmICggKCRvcHQgZXEgJHRlbXBbMV0p ICYmICgkdGVtcFsyXSAhfiAvY29kZSBcZCs9LykgKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cgpz dWIgRXNjYXBlRmlsZW5hbWUoJCkgewoJbXkgJGZpbGVuYW1lID0gc2hpZnQ7CgoJIyBSZXBsYWNl IGFsbCBzaW5nbGUgLyBieSBcLwoJJGZpbGVuYW1lID1+IHMvXC8vXFxcLy9nOwoKCXJldHVybiAk ZmlsZW5hbWU7Cn0K --===============0820200156770295842==--