From unknown Mon Aug 18 11:12:14 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#46456 <46456@debbugs.gnu.org> To: bug#46456 <46456@debbugs.gnu.org> Subject: Status: [core-updates] d3.v5.js source checksum changed Reply-To: bug#46456 <46456@debbugs.gnu.org> Date: Mon, 18 Aug 2025 18:12:14 +0000 retitle 46456 [core-updates] d3.v5.js source checksum changed reassign 46456 guix submitter 46456 Danny Milosavljevic severity 46456 normal thanks From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 11 22:53:29 2021 Received: (at submit) by debbugs.gnu.org; 12 Feb 2021 03:53:29 +0000 Received: from localhost ([127.0.0.1]:59704 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lAPWL-0007i3-DD for submit@debbugs.gnu.org; Thu, 11 Feb 2021 22:53:29 -0500 Received: from lists.gnu.org ([209.51.188.17]:35164) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lAPWJ-0007hw-JK for submit@debbugs.gnu.org; Thu, 11 Feb 2021 22:53:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:60488) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lAPWJ-0003P4-7E for bug-guix@gnu.org; Thu, 11 Feb 2021 22:53:27 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:53900) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lAPWF-0003YZ-4v for bug-guix@gnu.org; Thu, 11 Feb 2021 22:53:26 -0500 Received: from localhost (80-110-127-104.cgn.dynamic.surfer.at [80.110.127.104]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 8724D3363970 for ; Fri, 12 Feb 2021 04:53:19 +0100 (CET) Date: Fri, 12 Feb 2021 04:53:15 +0100 From: Danny Milosavljevic To: Subject: [core-updates] d3.v5.js source checksum changed Message-ID: <20210212045315.3f4e0a82@scratchpost.org> X-Mailer: Claws Mail 3.17.8 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/ahh=buR+DkTF93fKWPzRP2H"; protocol="application/pgp-signature"; micalg=pgp-sha512 Received-SPF: none client-ip=85.13.145.193; envelope-from=dannym@scratchpost.org; helo=dd26836.kasserver.com X-Spam_score_int: -25 X-Spam_score: -2.6 X-Spam_bar: -- X-Spam_report: (-2.6 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" --Sig_/ahh=buR+DkTF93fKWPzRP2H Content-Type: multipart/mixed; boundary="MP_/huV/jc.jjRG1tiqg+FFlax7" --MP_/huV/jc.jjRG1tiqg+FFlax7 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Starting download of /gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.js =46rom https://d3js.org/d3.v5.js... downloading from https://d3js.org/d3.v5.js ... d3.v5.js = 2.22GiB/s 00:00 | 504KiB tr= ansferred sha256 hash mismatch for /gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.= js: expected hash: 0kxvx5pfagxn6nhavdwsdnzyd26g0z5dsfi1pi5dvcmb0c8ipcdn actual hash: 177ypw6mjrp2ch9lj6znibwacwrvm4ypjxflsxsnl2sigx5dcwic hash mismatch for store item '/gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d= 3.v5.js' build of /gnu/store/wqv41s7q5hxmx1am1000nm66rgkbljz0-d3.v5.js.drv failed View build log at '/var/log/guix/drvs/wq/v41s7q5hxmx1am1000nm66rgkbljz0-d3.= v5.js.drv.bz2'. building /gnu/store/7adynsyb7524qxkjxymyysva7dlslbvm-d3Network_0.5.2.1.tar.= gz.drv... cannot build derivation `/gnu/store/ahvcirzbb60xxy1mk1dk1shp2yfghcyy-r-d3r-= 0.9.1.drv': 1 dependencies couldn't be built Attached is the file I got. --MP_/huV/jc.jjRG1tiqg+FFlax7 Content-Type: application/javascript Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.js Ly8gaHR0cHM6Ly9kM2pzLm9yZyB2NS4xNi4wIENvcHlyaWdodCAyMDIwIE1pa2UgQm9zdG9jawoo ZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgewp0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcg JiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDoKdHlw ZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0 cyddLCBmYWN0b3J5KSA6CihnbG9iYWwgPSBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwu ZDMgPSBnbG9iYWwuZDMgfHwge30pKTsKfSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNl IHN0cmljdCc7Cgp2YXIgdmVyc2lvbiA9ICI1LjE2LjAiOwoKZnVuY3Rpb24gYXNjZW5kaW5nKGEs IGIpIHsKICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47 Cn0KCmZ1bmN0aW9uIGJpc2VjdG9yKGNvbXBhcmUpIHsKICBpZiAoY29tcGFyZS5sZW5ndGggPT09 IDEpIGNvbXBhcmUgPSBhc2NlbmRpbmdDb21wYXJhdG9yKGNvbXBhcmUpOwogIHJldHVybiB7CiAg ICBsZWZ0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsKICAgICAgaWYgKGxvID09IG51bGwpIGxv ID0gMDsKICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7CiAgICAgIHdoaWxlIChs byA8IGhpKSB7CiAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7CiAgICAgICAgaWYgKGNv bXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTsKICAgICAgICBlbHNlIGhpID0gbWlk OwogICAgICB9CiAgICAgIHJldHVybiBsbzsKICAgIH0sCiAgICByaWdodDogZnVuY3Rpb24oYSwg eCwgbG8sIGhpKSB7CiAgICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7CiAgICAgIGlmIChoaSA9 PSBudWxsKSBoaSA9IGEubGVuZ3RoOwogICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgIHZh ciBtaWQgPSBsbyArIGhpID4+PiAxOwogICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPiAw KSBoaSA9IG1pZDsKICAgICAgICBlbHNlIGxvID0gbWlkICsgMTsKICAgICAgfQogICAgICByZXR1 cm4gbG87CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihmKSB7CiAg cmV0dXJuIGZ1bmN0aW9uKGQsIHgpIHsKICAgIHJldHVybiBhc2NlbmRpbmcoZihkKSwgeCk7CiAg fTsKfQoKdmFyIGFzY2VuZGluZ0Jpc2VjdCA9IGJpc2VjdG9yKGFzY2VuZGluZyk7CnZhciBiaXNl Y3RSaWdodCA9IGFzY2VuZGluZ0Jpc2VjdC5yaWdodDsKdmFyIGJpc2VjdExlZnQgPSBhc2NlbmRp bmdCaXNlY3QubGVmdDsKCmZ1bmN0aW9uIHBhaXJzKGFycmF5LCBmKSB7CiAgaWYgKGYgPT0gbnVs bCkgZiA9IHBhaXI7CiAgdmFyIGkgPSAwLCBuID0gYXJyYXkubGVuZ3RoIC0gMSwgcCA9IGFycmF5 WzBdLCBwYWlycyA9IG5ldyBBcnJheShuIDwgMCA/IDAgOiBuKTsKICB3aGlsZSAoaSA8IG4pIHBh aXJzW2ldID0gZihwLCBwID0gYXJyYXlbKytpXSk7CiAgcmV0dXJuIHBhaXJzOwp9CgpmdW5jdGlv biBwYWlyKGEsIGIpIHsKICByZXR1cm4gW2EsIGJdOwp9CgpmdW5jdGlvbiBjcm9zcyh2YWx1ZXMw LCB2YWx1ZXMxLCByZWR1Y2UpIHsKICB2YXIgbjAgPSB2YWx1ZXMwLmxlbmd0aCwKICAgICAgbjEg PSB2YWx1ZXMxLmxlbmd0aCwKICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4wICogbjEpLAogICAg ICBpMCwKICAgICAgaTEsCiAgICAgIGksCiAgICAgIHZhbHVlMDsKCiAgaWYgKHJlZHVjZSA9PSBu dWxsKSByZWR1Y2UgPSBwYWlyOwoKICBmb3IgKGkwID0gaSA9IDA7IGkwIDwgbjA7ICsraTApIHsK ICAgIGZvciAodmFsdWUwID0gdmFsdWVzMFtpMF0sIGkxID0gMDsgaTEgPCBuMTsgKytpMSwgKytp KSB7CiAgICAgIHZhbHVlc1tpXSA9IHJlZHVjZSh2YWx1ZTAsIHZhbHVlczFbaTFdKTsKICAgIH0K ICB9CgogIHJldHVybiB2YWx1ZXM7Cn0KCmZ1bmN0aW9uIGRlc2NlbmRpbmcoYSwgYikgewogIHJl dHVybiBiIDwgYSA/IC0xIDogYiA+IGEgPyAxIDogYiA+PSBhID8gMCA6IE5hTjsKfQoKZnVuY3Rp b24gbnVtYmVyKHgpIHsKICByZXR1cm4geCA9PT0gbnVsbCA/IE5hTiA6ICt4Owp9CgpmdW5jdGlv biB2YXJpYW5jZSh2YWx1ZXMsIHZhbHVlb2YpIHsKICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsCiAg ICAgIG0gPSAwLAogICAgICBpID0gLTEsCiAgICAgIG1lYW4gPSAwLAogICAgICB2YWx1ZSwKICAg ICAgZGVsdGEsCiAgICAgIHN1bSA9IDA7CgogIGlmICh2YWx1ZW9mID09IG51bGwpIHsKICAgIHdo aWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1iZXIodmFsdWVzW2ld KSkpIHsKICAgICAgICBkZWx0YSA9IHZhbHVlIC0gbWVhbjsKICAgICAgICBtZWFuICs9IGRlbHRh IC8gKyttOwogICAgICAgIHN1bSArPSBkZWx0YSAqICh2YWx1ZSAtIG1lYW4pOwogICAgICB9CiAg ICB9CiAgfQoKICBlbHNlIHsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICghaXNOYU4o dmFsdWUgPSBudW1iZXIodmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpKSkgewogICAgICAg IGRlbHRhID0gdmFsdWUgLSBtZWFuOwogICAgICAgIG1lYW4gKz0gZGVsdGEgLyArK207CiAgICAg ICAgc3VtICs9IGRlbHRhICogKHZhbHVlIC0gbWVhbik7CiAgICAgIH0KICAgIH0KICB9CgogIGlm IChtID4gMSkgcmV0dXJuIHN1bSAvIChtIC0gMSk7Cn0KCmZ1bmN0aW9uIGRldmlhdGlvbihhcnJh eSwgZikgewogIHZhciB2ID0gdmFyaWFuY2UoYXJyYXksIGYpOwogIHJldHVybiB2ID8gTWF0aC5z cXJ0KHYpIDogdjsKfQoKZnVuY3Rpb24gZXh0ZW50KHZhbHVlcywgdmFsdWVvZikgewogIHZhciBu ID0gdmFsdWVzLmxlbmd0aCwKICAgICAgaSA9IC0xLAogICAgICB2YWx1ZSwKICAgICAgbWluLAog ICAgICBtYXg7CgogIGlmICh2YWx1ZW9mID09IG51bGwpIHsKICAgIHdoaWxlICgrK2kgPCBuKSB7 IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuCiAgICAgIGlmICgodmFsdWUgPSB2 YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsKICAgICAgICBtaW4gPSBtYXgg PSB2YWx1ZTsKICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5p bmcgdmFsdWVzLgogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCkgewog ICAgICAgICAgICBpZiAobWluID4gdmFsdWUpIG1pbiA9IHZhbHVlOwogICAgICAgICAgICBpZiAo bWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQog ICAgfQogIH0KCiAgZWxzZSB7CiAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJz dCBjb21wYXJhYmxlIHZhbHVlLgogICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0s IGksIHZhbHVlcykpICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsKICAgICAgICBtaW4gPSBt YXggPSB2YWx1ZTsKICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1h aW5pbmcgdmFsdWVzLgogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBp LCB2YWx1ZXMpKSAhPSBudWxsKSB7CiAgICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0g dmFsdWU7CiAgICAgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgbWF4ID0gdmFsdWU7CiAgICAgICAg ICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gW21pbiwgbWF4XTsKfQoK dmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlOwoKdmFyIHNsaWNlID0gYXJyYXkuc2xpY2U7CnZh ciBtYXAgPSBhcnJheS5tYXA7CgpmdW5jdGlvbiBjb25zdGFudCh4KSB7CiAgcmV0dXJuIGZ1bmN0 aW9uKCkgewogICAgcmV0dXJuIHg7CiAgfTsKfQoKZnVuY3Rpb24gaWRlbnRpdHkoeCkgewogIHJl dHVybiB4Owp9CgpmdW5jdGlvbiBzZXF1ZW5jZShzdGFydCwgc3RvcCwgc3RlcCkgewogIHN0YXJ0 ID0gK3N0YXJ0LCBzdG9wID0gK3N0b3AsIHN0ZXAgPSAobiA9IGFyZ3VtZW50cy5sZW5ndGgpIDwg MiA/IChzdG9wID0gc3RhcnQsIHN0YXJ0ID0gMCwgMSkgOiBuIDwgMyA/IDEgOiArc3RlcDsKCiAg dmFyIGkgPSAtMSwKICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0 KSAvIHN0ZXApKSB8IDAsCiAgICAgIHJhbmdlID0gbmV3IEFycmF5KG4pOwoKICB3aGlsZSAoKytp IDwgbikgewogICAgcmFuZ2VbaV0gPSBzdGFydCArIGkgKiBzdGVwOwogIH0KCiAgcmV0dXJuIHJh bmdlOwp9Cgp2YXIgZTEwID0gTWF0aC5zcXJ0KDUwKSwKICAgIGU1ID0gTWF0aC5zcXJ0KDEwKSwK ICAgIGUyID0gTWF0aC5zcXJ0KDIpOwoKZnVuY3Rpb24gdGlja3Moc3RhcnQsIHN0b3AsIGNvdW50 KSB7CiAgdmFyIHJldmVyc2UsCiAgICAgIGkgPSAtMSwKICAgICAgbiwKICAgICAgdGlja3MsCiAg ICAgIHN0ZXA7CgogIHN0b3AgPSArc3RvcCwgc3RhcnQgPSArc3RhcnQsIGNvdW50ID0gK2NvdW50 OwogIGlmIChzdGFydCA9PT0gc3RvcCAmJiBjb3VudCA+IDApIHJldHVybiBbc3RhcnRdOwogIGlm IChyZXZlcnNlID0gc3RvcCA8IHN0YXJ0KSBuID0gc3RhcnQsIHN0YXJ0ID0gc3RvcCwgc3RvcCA9 IG47CiAgaWYgKChzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpKSA9PT0g MCB8fCAhaXNGaW5pdGUoc3RlcCkpIHJldHVybiBbXTsKCiAgaWYgKHN0ZXAgPiAwKSB7CiAgICBz dGFydCA9IE1hdGguY2VpbChzdGFydCAvIHN0ZXApOwogICAgc3RvcCA9IE1hdGguZmxvb3Ioc3Rv cCAvIHN0ZXApOwogICAgdGlja3MgPSBuZXcgQXJyYXkobiA9IE1hdGguY2VpbChzdG9wIC0gc3Rh cnQgKyAxKSk7CiAgICB3aGlsZSAoKytpIDwgbikgdGlja3NbaV0gPSAoc3RhcnQgKyBpKSAqIHN0 ZXA7CiAgfSBlbHNlIHsKICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCAqIHN0ZXApOwogICAg c3RvcCA9IE1hdGguY2VpbChzdG9wICogc3RlcCk7CiAgICB0aWNrcyA9IG5ldyBBcnJheShuID0g TWF0aC5jZWlsKHN0YXJ0IC0gc3RvcCArIDEpKTsKICAgIHdoaWxlICgrK2kgPCBuKSB0aWNrc1tp XSA9IChzdGFydCAtIGkpIC8gc3RlcDsKICB9CgogIGlmIChyZXZlcnNlKSB0aWNrcy5yZXZlcnNl KCk7CgogIHJldHVybiB0aWNrczsKfQoKZnVuY3Rpb24gdGlja0luY3JlbWVudChzdGFydCwgc3Rv cCwgY291bnQpIHsKICB2YXIgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291 bnQpLAogICAgICBwb3dlciA9IE1hdGguZmxvb3IoTWF0aC5sb2coc3RlcCkgLyBNYXRoLkxOMTAp LAogICAgICBlcnJvciA9IHN0ZXAgLyBNYXRoLnBvdygxMCwgcG93ZXIpOwogIHJldHVybiBwb3dl ciA+PSAwCiAgICAgID8gKGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJy b3IgPj0gZTIgPyAyIDogMSkgKiBNYXRoLnBvdygxMCwgcG93ZXIpCiAgICAgIDogLU1hdGgucG93 KDEwLCAtcG93ZXIpIC8gKGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJy b3IgPj0gZTIgPyAyIDogMSk7Cn0KCmZ1bmN0aW9uIHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3Vu dCkgewogIHZhciBzdGVwMCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgwLCBj b3VudCksCiAgICAgIHN0ZXAxID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2coc3Rl cDApIC8gTWF0aC5MTjEwKSksCiAgICAgIGVycm9yID0gc3RlcDAgLyBzdGVwMTsKICBpZiAoZXJy b3IgPj0gZTEwKSBzdGVwMSAqPSAxMDsKICBlbHNlIGlmIChlcnJvciA+PSBlNSkgc3RlcDEgKj0g NTsKICBlbHNlIGlmIChlcnJvciA+PSBlMikgc3RlcDEgKj0gMjsKICByZXR1cm4gc3RvcCA8IHN0 YXJ0ID8gLXN0ZXAxIDogc3RlcDE7Cn0KCmZ1bmN0aW9uIHRocmVzaG9sZFN0dXJnZXModmFsdWVz KSB7CiAgcmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZXMubGVuZ3RoKSAvIE1hdGguTE4y KSArIDE7Cn0KCmZ1bmN0aW9uIGhpc3RvZ3JhbSgpIHsKICB2YXIgdmFsdWUgPSBpZGVudGl0eSwK ICAgICAgZG9tYWluID0gZXh0ZW50LAogICAgICB0aHJlc2hvbGQgPSB0aHJlc2hvbGRTdHVyZ2Vz OwoKICBmdW5jdGlvbiBoaXN0b2dyYW0oZGF0YSkgewogICAgdmFyIGksCiAgICAgICAgbiA9IGRh dGEubGVuZ3RoLAogICAgICAgIHgsCiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4pOwoKICAg IGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgdmFsdWVzW2ldID0gdmFsdWUoZGF0YVtp XSwgaSwgZGF0YSk7CiAgICB9CgogICAgdmFyIHh6ID0gZG9tYWluKHZhbHVlcyksCiAgICAgICAg eDAgPSB4elswXSwKICAgICAgICB4MSA9IHh6WzFdLAogICAgICAgIHR6ID0gdGhyZXNob2xkKHZh bHVlcywgeDAsIHgxKTsKCiAgICAvLyBDb252ZXJ0IG51bWJlciBvZiB0aHJlc2hvbGRzIGludG8g dW5pZm9ybSB0aHJlc2hvbGRzLgogICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkgewogICAgICB0 eiA9IHRpY2tTdGVwKHgwLCB4MSwgdHopOwogICAgICB0eiA9IHNlcXVlbmNlKE1hdGguY2VpbCh4 MCAvIHR6KSAqIHR6LCB4MSwgdHopOyAvLyBleGNsdXNpdmUKICAgIH0KCiAgICAvLyBSZW1vdmUg YW55IHRocmVzaG9sZHMgb3V0c2lkZSB0aGUgZG9tYWluLgogICAgdmFyIG0gPSB0ei5sZW5ndGg7 CiAgICB3aGlsZSAodHpbMF0gPD0geDApIHR6LnNoaWZ0KCksIC0tbTsKICAgIHdoaWxlICh0eltt IC0gMV0gPiB4MSkgdHoucG9wKCksIC0tbTsKCiAgICB2YXIgYmlucyA9IG5ldyBBcnJheShtICsg MSksCiAgICAgICAgYmluOwoKICAgIC8vIEluaXRpYWxpemUgYmlucy4KICAgIGZvciAoaSA9IDA7 IGkgPD0gbTsgKytpKSB7CiAgICAgIGJpbiA9IGJpbnNbaV0gPSBbXTsKICAgICAgYmluLngwID0g aSA+IDAgPyB0eltpIC0gMV0gOiB4MDsKICAgICAgYmluLngxID0gaSA8IG0gPyB0eltpXSA6IHgx OwogICAgfQoKICAgIC8vIEFzc2lnbiBkYXRhIHRvIGJpbnMgYnkgdmFsdWUsIGlnbm9yaW5nIGFu eSBvdXRzaWRlIHRoZSBkb21haW4uCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAg IHggPSB2YWx1ZXNbaV07CiAgICAgIGlmICh4MCA8PSB4ICYmIHggPD0geDEpIHsKICAgICAgICBi aW5zW2Jpc2VjdFJpZ2h0KHR6LCB4LCAwLCBtKV0ucHVzaChkYXRhW2ldKTsKICAgICAgfQogICAg fQoKICAgIHJldHVybiBiaW5zOwogIH0KCiAgaGlzdG9ncmFtLnZhbHVlID0gZnVuY3Rpb24oXykg ewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9PT0gImZ1 bmN0aW9uIiA/IF8gOiBjb25zdGFudChfKSwgaGlzdG9ncmFtKSA6IHZhbHVlOwogIH07CgogIGhp c3RvZ3JhbS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/IChkb21haW4gPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudChbX1sw XSwgX1sxXV0pLCBoaXN0b2dyYW0pIDogZG9tYWluOwogIH07CgogIGhpc3RvZ3JhbS50aHJlc2hv bGRzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhyZXNo b2xkID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogQXJyYXkuaXNBcnJheShfKSA/IGNv bnN0YW50KHNsaWNlLmNhbGwoXykpIDogY29uc3RhbnQoXyksIGhpc3RvZ3JhbSkgOiB0aHJlc2hv bGQ7CiAgfTsKCiAgcmV0dXJuIGhpc3RvZ3JhbTsKfQoKZnVuY3Rpb24gdGhyZXNob2xkKHZhbHVl cywgcCwgdmFsdWVvZikgewogIGlmICh2YWx1ZW9mID09IG51bGwpIHZhbHVlb2YgPSBudW1iZXI7 CiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpKSByZXR1cm47CiAgaWYgKChwID0gK3ApIDw9IDAg fHwgbiA8IDIpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbMF0sIDAsIHZhbHVlcyk7CiAgaWYgKHAg Pj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpOwogIHZh ciBuLAogICAgICBpID0gKG4gLSAxKSAqIHAsCiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSwKICAg ICAgdmFsdWUwID0gK3ZhbHVlb2YodmFsdWVzW2kwXSwgaTAsIHZhbHVlcyksCiAgICAgIHZhbHVl MSA9ICt2YWx1ZW9mKHZhbHVlc1tpMCArIDFdLCBpMCArIDEsIHZhbHVlcyk7CiAgcmV0dXJuIHZh bHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7Cn0KCmZ1bmN0aW9uIGZyZWVkbWFu RGlhY29uaXModmFsdWVzLCBtaW4sIG1heCkgewogIHZhbHVlcyA9IG1hcC5jYWxsKHZhbHVlcywg bnVtYmVyKS5zb3J0KGFzY2VuZGluZyk7CiAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAv ICgyICogKHRocmVzaG9sZCh2YWx1ZXMsIDAuNzUpIC0gdGhyZXNob2xkKHZhbHVlcywgMC4yNSkp ICogTWF0aC5wb3codmFsdWVzLmxlbmd0aCwgLTEgLyAzKSkpOwp9CgpmdW5jdGlvbiBzY290dCh2 YWx1ZXMsIG1pbiwgbWF4KSB7CiAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAvICgzLjUg KiBkZXZpYXRpb24odmFsdWVzKSAqIE1hdGgucG93KHZhbHVlcy5sZW5ndGgsIC0xIC8gMykpKTsK fQoKZnVuY3Rpb24gbWF4KHZhbHVlcywgdmFsdWVvZikgewogIHZhciBuID0gdmFsdWVzLmxlbmd0 aCwKICAgICAgaSA9IC0xLAogICAgICB2YWx1ZSwKICAgICAgbWF4OwoKICBpZiAodmFsdWVvZiA9 PSBudWxsKSB7CiAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJh YmxlIHZhbHVlLgogICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIHZhbHVl ID49IHZhbHVlKSB7CiAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgICAgd2hpbGUgKCsraSA8IG4p IHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5nIHZhbHVlcy4KICAgICAgICAgIGlmICgodmFsdWUg PSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPiBtYXgpIHsKICAgICAgICAgICAgbWF4ID0g dmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBlbHNlIHsK ICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUu CiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVs bCAmJiB2YWx1ZSA+PSB2YWx1ZSkgewogICAgICAgIG1heCA9IHZhbHVlOwogICAgICAgIHdoaWxl ICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuCiAgICAgICAgICBp ZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwgJiYgdmFs dWUgPiBtYXgpIHsKICAgICAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAg fQogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gbWF4Owp9CgpmdW5jdGlvbiBtZWFuKHZhbHVl cywgdmFsdWVvZikgewogIHZhciBuID0gdmFsdWVzLmxlbmd0aCwKICAgICAgbSA9IG4sCiAgICAg IGkgPSAtMSwKICAgICAgdmFsdWUsCiAgICAgIHN1bSA9IDA7CgogIGlmICh2YWx1ZW9mID09IG51 bGwpIHsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1i ZXIodmFsdWVzW2ldKSkpIHN1bSArPSB2YWx1ZTsKICAgICAgZWxzZSAtLW07CiAgICB9CiAgfQoK ICBlbHNlIHsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICghaXNOYU4odmFsdWUgPSBu dW1iZXIodmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpKSkgc3VtICs9IHZhbHVlOwogICAg ICBlbHNlIC0tbTsKICAgIH0KICB9CgogIGlmIChtKSByZXR1cm4gc3VtIC8gbTsKfQoKZnVuY3Rp b24gbWVkaWFuKHZhbHVlcywgdmFsdWVvZikgewogIHZhciBuID0gdmFsdWVzLmxlbmd0aCwKICAg ICAgaSA9IC0xLAogICAgICB2YWx1ZSwKICAgICAgbnVtYmVycyA9IFtdOwoKICBpZiAodmFsdWVv ZiA9PSBudWxsKSB7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBpZiAoIWlzTmFOKHZhbHVl ID0gbnVtYmVyKHZhbHVlc1tpXSkpKSB7CiAgICAgICAgbnVtYmVycy5wdXNoKHZhbHVlKTsKICAg ICAgfQogICAgfQogIH0KCiAgZWxzZSB7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBpZiAo IWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSkpIHsK ICAgICAgICBudW1iZXJzLnB1c2godmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4g dGhyZXNob2xkKG51bWJlcnMuc29ydChhc2NlbmRpbmcpLCAwLjUpOwp9CgpmdW5jdGlvbiBtZXJn ZShhcnJheXMpIHsKICB2YXIgbiA9IGFycmF5cy5sZW5ndGgsCiAgICAgIG0sCiAgICAgIGkgPSAt MSwKICAgICAgaiA9IDAsCiAgICAgIG1lcmdlZCwKICAgICAgYXJyYXk7CgogIHdoaWxlICgrK2kg PCBuKSBqICs9IGFycmF5c1tpXS5sZW5ndGg7CiAgbWVyZ2VkID0gbmV3IEFycmF5KGopOwoKICB3 aGlsZSAoLS1uID49IDApIHsKICAgIGFycmF5ID0gYXJyYXlzW25dOwogICAgbSA9IGFycmF5Lmxl bmd0aDsKICAgIHdoaWxlICgtLW0gPj0gMCkgewogICAgICBtZXJnZWRbLS1qXSA9IGFycmF5W21d OwogICAgfQogIH0KCiAgcmV0dXJuIG1lcmdlZDsKfQoKZnVuY3Rpb24gbWluKHZhbHVlcywgdmFs dWVvZikgewogIHZhciBuID0gdmFsdWVzLmxlbmd0aCwKICAgICAgaSA9IC0xLAogICAgICB2YWx1 ZSwKICAgICAgbWluOwoKICBpZiAodmFsdWVvZiA9PSBudWxsKSB7CiAgICB3aGlsZSAoKytpIDwg bikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLgogICAgICBpZiAoKHZhbHVl ID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7CiAgICAgICAgbWluID0g dmFsdWU7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5n IHZhbHVlcy4KICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgbWlu ID4gdmFsdWUpIHsKICAgICAgICAgICAgbWluID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAg fQogICAgICB9CiAgICB9CiAgfQoKICBlbHNlIHsKICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZp bmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuCiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9m KHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiB2YWx1ZSA+PSB2YWx1ZSkgewogICAg ICAgIG1pbiA9IHZhbHVlOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhl IHJlbWFpbmluZyB2YWx1ZXMuCiAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNb aV0sIGksIHZhbHVlcykpICE9IG51bGwgJiYgbWluID4gdmFsdWUpIHsKICAgICAgICAgICAgbWlu ID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICByZXR1 cm4gbWluOwp9CgpmdW5jdGlvbiBwZXJtdXRlKGFycmF5LCBpbmRleGVzKSB7CiAgdmFyIGkgPSBp bmRleGVzLmxlbmd0aCwgcGVybXV0ZXMgPSBuZXcgQXJyYXkoaSk7CiAgd2hpbGUgKGktLSkgcGVy bXV0ZXNbaV0gPSBhcnJheVtpbmRleGVzW2ldXTsKICByZXR1cm4gcGVybXV0ZXM7Cn0KCmZ1bmN0 aW9uIHNjYW4odmFsdWVzLCBjb21wYXJlKSB7CiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpKSBy ZXR1cm47CiAgdmFyIG4sCiAgICAgIGkgPSAwLAogICAgICBqID0gMCwKICAgICAgeGksCiAgICAg IHhqID0gdmFsdWVzW2pdOwoKICBpZiAoY29tcGFyZSA9PSBudWxsKSBjb21wYXJlID0gYXNjZW5k aW5nOwoKICB3aGlsZSAoKytpIDwgbikgewogICAgaWYgKGNvbXBhcmUoeGkgPSB2YWx1ZXNbaV0s IHhqKSA8IDAgfHwgY29tcGFyZSh4aiwgeGopICE9PSAwKSB7CiAgICAgIHhqID0geGksIGogPSBp OwogICAgfQogIH0KCiAgaWYgKGNvbXBhcmUoeGosIHhqKSA9PT0gMCkgcmV0dXJuIGo7Cn0KCmZ1 bmN0aW9uIHNodWZmbGUoYXJyYXksIGkwLCBpMSkgewogIHZhciBtID0gKGkxID09IG51bGwgPyBh cnJheS5sZW5ndGggOiBpMSkgLSAoaTAgPSBpMCA9PSBudWxsID8gMCA6ICtpMCksCiAgICAgIHQs CiAgICAgIGk7CgogIHdoaWxlIChtKSB7CiAgICBpID0gTWF0aC5yYW5kb20oKSAqIG0tLSB8IDA7 CiAgICB0ID0gYXJyYXlbbSArIGkwXTsKICAgIGFycmF5W20gKyBpMF0gPSBhcnJheVtpICsgaTBd OwogICAgYXJyYXlbaSArIGkwXSA9IHQ7CiAgfQoKICByZXR1cm4gYXJyYXk7Cn0KCmZ1bmN0aW9u IHN1bSh2YWx1ZXMsIHZhbHVlb2YpIHsKICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsCiAgICAgIGkg PSAtMSwKICAgICAgdmFsdWUsCiAgICAgIHN1bSA9IDA7CgogIGlmICh2YWx1ZW9mID09IG51bGwp IHsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICh2YWx1ZSA9ICt2YWx1ZXNbaV0pIHN1 bSArPSB2YWx1ZTsgLy8gTm90ZTogemVybyBhbmQgbnVsbCBhcmUgZXF1aXZhbGVudC4KICAgIH0K ICB9CgogIGVsc2UgewogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgaWYgKHZhbHVlID0gK3Zh bHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSBzdW0gKz0gdmFsdWU7CiAgICB9CiAgfQoKICBy ZXR1cm4gc3VtOwp9CgpmdW5jdGlvbiB0cmFuc3Bvc2UobWF0cml4KSB7CiAgaWYgKCEobiA9IG1h dHJpeC5sZW5ndGgpKSByZXR1cm4gW107CiAgZm9yICh2YXIgaSA9IC0xLCBtID0gbWluKG1hdHJp eCwgbGVuZ3RoKSwgdHJhbnNwb3NlID0gbmV3IEFycmF5KG0pOyArK2kgPCBtOykgewogICAgZm9y ICh2YXIgaiA9IC0xLCBuLCByb3cgPSB0cmFuc3Bvc2VbaV0gPSBuZXcgQXJyYXkobik7ICsraiA8 IG47KSB7CiAgICAgIHJvd1tqXSA9IG1hdHJpeFtqXVtpXTsKICAgIH0KICB9CiAgcmV0dXJuIHRy YW5zcG9zZTsKfQoKZnVuY3Rpb24gbGVuZ3RoKGQpIHsKICByZXR1cm4gZC5sZW5ndGg7Cn0KCmZ1 bmN0aW9uIHppcCgpIHsKICByZXR1cm4gdHJhbnNwb3NlKGFyZ3VtZW50cyk7Cn0KCnZhciBzbGlj ZSQxID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwoKZnVuY3Rpb24gaWRlbnRpdHkkMSh4KSB7CiAg cmV0dXJuIHg7Cn0KCnZhciB0b3AgPSAxLAogICAgcmlnaHQgPSAyLAogICAgYm90dG9tID0gMywK ICAgIGxlZnQgPSA0LAogICAgZXBzaWxvbiA9IDFlLTY7CgpmdW5jdGlvbiB0cmFuc2xhdGVYKHgp IHsKICByZXR1cm4gInRyYW5zbGF0ZSgiICsgKHggKyAwLjUpICsgIiwwKSI7Cn0KCmZ1bmN0aW9u IHRyYW5zbGF0ZVkoeSkgewogIHJldHVybiAidHJhbnNsYXRlKDAsIiArICh5ICsgMC41KSArICIp IjsKfQoKZnVuY3Rpb24gbnVtYmVyJDEoc2NhbGUpIHsKICByZXR1cm4gZnVuY3Rpb24oZCkgewog ICAgcmV0dXJuICtzY2FsZShkKTsKICB9Owp9CgpmdW5jdGlvbiBjZW50ZXIoc2NhbGUpIHsKICB2 YXIgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgc2NhbGUuYmFuZHdpZHRoKCkgLSAxKSAvIDI7IC8vIEFk anVzdCBmb3IgMC41cHggb2Zmc2V0LgogIGlmIChzY2FsZS5yb3VuZCgpKSBvZmZzZXQgPSBNYXRo LnJvdW5kKG9mZnNldCk7CiAgcmV0dXJuIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiArc2NhbGUo ZCkgKyBvZmZzZXQ7CiAgfTsKfQoKZnVuY3Rpb24gZW50ZXJpbmcoKSB7CiAgcmV0dXJuICF0aGlz Ll9fYXhpczsKfQoKZnVuY3Rpb24gYXhpcyhvcmllbnQsIHNjYWxlKSB7CiAgdmFyIHRpY2tBcmd1 bWVudHMgPSBbXSwKICAgICAgdGlja1ZhbHVlcyA9IG51bGwsCiAgICAgIHRpY2tGb3JtYXQgPSBu dWxsLAogICAgICB0aWNrU2l6ZUlubmVyID0gNiwKICAgICAgdGlja1NpemVPdXRlciA9IDYsCiAg ICAgIHRpY2tQYWRkaW5nID0gMywKICAgICAgayA9IG9yaWVudCA9PT0gdG9wIHx8IG9yaWVudCA9 PT0gbGVmdCA/IC0xIDogMSwKICAgICAgeCA9IG9yaWVudCA9PT0gbGVmdCB8fCBvcmllbnQgPT09 IHJpZ2h0ID8gIngiIDogInkiLAogICAgICB0cmFuc2Zvcm0gPSBvcmllbnQgPT09IHRvcCB8fCBv cmllbnQgPT09IGJvdHRvbSA/IHRyYW5zbGF0ZVggOiB0cmFuc2xhdGVZOwoKICBmdW5jdGlvbiBh eGlzKGNvbnRleHQpIHsKICAgIHZhciB2YWx1ZXMgPSB0aWNrVmFsdWVzID09IG51bGwgPyAoc2Nh bGUudGlja3MgPyBzY2FsZS50aWNrcy5hcHBseShzY2FsZSwgdGlja0FyZ3VtZW50cykgOiBzY2Fs ZS5kb21haW4oKSkgOiB0aWNrVmFsdWVzLAogICAgICAgIGZvcm1hdCA9IHRpY2tGb3JtYXQgPT0g bnVsbCA/IChzY2FsZS50aWNrRm9ybWF0ID8gc2NhbGUudGlja0Zvcm1hdC5hcHBseShzY2FsZSwg dGlja0FyZ3VtZW50cykgOiBpZGVudGl0eSQxKSA6IHRpY2tGb3JtYXQsCiAgICAgICAgc3BhY2lu ZyA9IE1hdGgubWF4KHRpY2tTaXplSW5uZXIsIDApICsgdGlja1BhZGRpbmcsCiAgICAgICAgcmFu Z2UgPSBzY2FsZS5yYW5nZSgpLAogICAgICAgIHJhbmdlMCA9ICtyYW5nZVswXSArIDAuNSwKICAg ICAgICByYW5nZTEgPSArcmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gKyAwLjUsCiAgICAgICAgcG9z aXRpb24gPSAoc2NhbGUuYmFuZHdpZHRoID8gY2VudGVyIDogbnVtYmVyJDEpKHNjYWxlLmNvcHko KSksCiAgICAgICAgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVj dGlvbigpIDogY29udGV4dCwKICAgICAgICBwYXRoID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgiLmRv bWFpbiIpLmRhdGEoW251bGxdKSwKICAgICAgICB0aWNrID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgi LnRpY2siKS5kYXRhKHZhbHVlcywgc2NhbGUpLm9yZGVyKCksCiAgICAgICAgdGlja0V4aXQgPSB0 aWNrLmV4aXQoKSwKICAgICAgICB0aWNrRW50ZXIgPSB0aWNrLmVudGVyKCkuYXBwZW5kKCJnIiku YXR0cigiY2xhc3MiLCAidGljayIpLAogICAgICAgIGxpbmUgPSB0aWNrLnNlbGVjdCgibGluZSIp LAogICAgICAgIHRleHQgPSB0aWNrLnNlbGVjdCgidGV4dCIpOwoKICAgIHBhdGggPSBwYXRoLm1l cmdlKHBhdGguZW50ZXIoKS5pbnNlcnQoInBhdGgiLCAiLnRpY2siKQogICAgICAgIC5hdHRyKCJj bGFzcyIsICJkb21haW4iKQogICAgICAgIC5hdHRyKCJzdHJva2UiLCAiY3VycmVudENvbG9yIikp OwoKICAgIHRpY2sgPSB0aWNrLm1lcmdlKHRpY2tFbnRlcik7CgogICAgbGluZSA9IGxpbmUubWVy Z2UodGlja0VudGVyLmFwcGVuZCgibGluZSIpCiAgICAgICAgLmF0dHIoInN0cm9rZSIsICJjdXJy ZW50Q29sb3IiKQogICAgICAgIC5hdHRyKHggKyAiMiIsIGsgKiB0aWNrU2l6ZUlubmVyKSk7Cgog ICAgdGV4dCA9IHRleHQubWVyZ2UodGlja0VudGVyLmFwcGVuZCgidGV4dCIpCiAgICAgICAgLmF0 dHIoImZpbGwiLCAiY3VycmVudENvbG9yIikKICAgICAgICAuYXR0cih4LCBrICogc3BhY2luZykK ICAgICAgICAuYXR0cigiZHkiLCBvcmllbnQgPT09IHRvcCA/ICIwZW0iIDogb3JpZW50ID09PSBi b3R0b20gPyAiMC43MWVtIiA6ICIwLjMyZW0iKSk7CgogICAgaWYgKGNvbnRleHQgIT09IHNlbGVj dGlvbikgewogICAgICBwYXRoID0gcGF0aC50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICB0aWNr ID0gdGljay50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICBsaW5lID0gbGluZS50cmFuc2l0aW9u KGNvbnRleHQpOwogICAgICB0ZXh0ID0gdGV4dC50cmFuc2l0aW9uKGNvbnRleHQpOwoKICAgICAg dGlja0V4aXQgPSB0aWNrRXhpdC50cmFuc2l0aW9uKGNvbnRleHQpCiAgICAgICAgICAuYXR0cigi b3BhY2l0eSIsIGVwc2lsb24pCiAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24o ZCkgeyByZXR1cm4gaXNGaW5pdGUoZCA9IHBvc2l0aW9uKGQpKSA/IHRyYW5zZm9ybShkKSA6IHRo aXMuZ2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iKTsgfSk7CgogICAgICB0aWNrRW50ZXIKICAgICAg ICAgIC5hdHRyKCJvcGFjaXR5IiwgZXBzaWxvbikKICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0i LCBmdW5jdGlvbihkKSB7IHZhciBwID0gdGhpcy5wYXJlbnROb2RlLl9fYXhpczsgcmV0dXJuIHRy YW5zZm9ybShwICYmIGlzRmluaXRlKHAgPSBwKGQpKSA/IHAgOiBwb3NpdGlvbihkKSk7IH0pOwog ICAgfQoKICAgIHRpY2tFeGl0LnJlbW92ZSgpOwoKICAgIHBhdGgKICAgICAgICAuYXR0cigiZCIs IG9yaWVudCA9PT0gbGVmdCB8fCBvcmllbnQgPT0gcmlnaHQKICAgICAgICAgICAgPyAodGlja1Np emVPdXRlciA/ICJNIiArIGsgKiB0aWNrU2l6ZU91dGVyICsgIiwiICsgcmFuZ2UwICsgIkgwLjVW IiArIHJhbmdlMSArICJIIiArIGsgKiB0aWNrU2l6ZU91dGVyIDogIk0wLjUsIiArIHJhbmdlMCAr ICJWIiArIHJhbmdlMSkKICAgICAgICAgICAgOiAodGlja1NpemVPdXRlciA/ICJNIiArIHJhbmdl MCArICIsIiArIGsgKiB0aWNrU2l6ZU91dGVyICsgIlYwLjVIIiArIHJhbmdlMSArICJWIiArIGsg KiB0aWNrU2l6ZU91dGVyIDogIk0iICsgcmFuZ2UwICsgIiwwLjVIIiArIHJhbmdlMSkpOwoKICAg IHRpY2sKICAgICAgICAuYXR0cigib3BhY2l0eSIsIDEpCiAgICAgICAgLmF0dHIoInRyYW5zZm9y bSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIHRyYW5zZm9ybShwb3NpdGlvbihkKSk7IH0pOwoKICAg IGxpbmUKICAgICAgICAuYXR0cih4ICsgIjIiLCBrICogdGlja1NpemVJbm5lcik7CgogICAgdGV4 dAogICAgICAgIC5hdHRyKHgsIGsgKiBzcGFjaW5nKQogICAgICAgIC50ZXh0KGZvcm1hdCk7Cgog ICAgc2VsZWN0aW9uLmZpbHRlcihlbnRlcmluZykKICAgICAgICAuYXR0cigiZmlsbCIsICJub25l IikKICAgICAgICAuYXR0cigiZm9udC1zaXplIiwgMTApCiAgICAgICAgLmF0dHIoImZvbnQtZmFt aWx5IiwgInNhbnMtc2VyaWYiKQogICAgICAgIC5hdHRyKCJ0ZXh0LWFuY2hvciIsIG9yaWVudCA9 PT0gcmlnaHQgPyAic3RhcnQiIDogb3JpZW50ID09PSBsZWZ0ID8gImVuZCIgOiAibWlkZGxlIik7 CgogICAgc2VsZWN0aW9uCiAgICAgICAgLmVhY2goZnVuY3Rpb24oKSB7IHRoaXMuX19heGlzID0g cG9zaXRpb247IH0pOwogIH0KCiAgYXhpcy5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlID0gXywgYXhpcykgOiBzY2FsZTsKICB9OwoKICBh eGlzLnRpY2tzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGlja0FyZ3VtZW50cyA9IHNsaWNl JDEuY2FsbChhcmd1bWVudHMpLCBheGlzOwogIH07CgogIGF4aXMudGlja0FyZ3VtZW50cyA9IGZ1 bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tBcmd1bWVudHMg PSBfID09IG51bGwgPyBbXSA6IHNsaWNlJDEuY2FsbChfKSwgYXhpcykgOiB0aWNrQXJndW1lbnRz LnNsaWNlKCk7CiAgfTsKCiAgYXhpcy50aWNrVmFsdWVzID0gZnVuY3Rpb24oXykgewogICAgcmV0 dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1ZhbHVlcyA9IF8gPT0gbnVsbCA/IG51bGwgOiBz bGljZSQxLmNhbGwoXyksIGF4aXMpIDogdGlja1ZhbHVlcyAmJiB0aWNrVmFsdWVzLnNsaWNlKCk7 CiAgfTsKCiAgYXhpcy50aWNrRm9ybWF0ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyAodGlja0Zvcm1hdCA9IF8sIGF4aXMpIDogdGlja0Zvcm1hdDsKICB9OwoK ICBheGlzLnRpY2tTaXplID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5n dGggPyAodGlja1NpemVJbm5lciA9IHRpY2tTaXplT3V0ZXIgPSArXywgYXhpcykgOiB0aWNrU2l6 ZUlubmVyOwogIH07CgogIGF4aXMudGlja1NpemVJbm5lciA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTaXplSW5uZXIgPSArXywgYXhpcykgOiB0aWNr U2l6ZUlubmVyOwogIH07CgogIGF4aXMudGlja1NpemVPdXRlciA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTaXplT3V0ZXIgPSArXywgYXhpcykgOiB0 aWNrU2l6ZU91dGVyOwogIH07CgogIGF4aXMudGlja1BhZGRpbmcgPSBmdW5jdGlvbihfKSB7CiAg ICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrUGFkZGluZyA9ICtfLCBheGlzKSA6IHRp Y2tQYWRkaW5nOwogIH07CgogIHJldHVybiBheGlzOwp9CgpmdW5jdGlvbiBheGlzVG9wKHNjYWxl KSB7CiAgcmV0dXJuIGF4aXModG9wLCBzY2FsZSk7Cn0KCmZ1bmN0aW9uIGF4aXNSaWdodChzY2Fs ZSkgewogIHJldHVybiBheGlzKHJpZ2h0LCBzY2FsZSk7Cn0KCmZ1bmN0aW9uIGF4aXNCb3R0b20o c2NhbGUpIHsKICByZXR1cm4gYXhpcyhib3R0b20sIHNjYWxlKTsKfQoKZnVuY3Rpb24gYXhpc0xl ZnQoc2NhbGUpIHsKICByZXR1cm4gYXhpcyhsZWZ0LCBzY2FsZSk7Cn0KCnZhciBub29wID0ge3Zh bHVlOiBmdW5jdGlvbigpIHt9fTsKCmZ1bmN0aW9uIGRpc3BhdGNoKCkgewogIGZvciAodmFyIGkg PSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7CiAgICBp ZiAoISh0ID0gYXJndW1lbnRzW2ldICsgIiIpIHx8ICh0IGluIF8pIHx8IC9bXHMuXS8udGVzdCh0 KSkgdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIgKyB0KTsKICAgIF9bdF0gPSBbXTsK ICB9CiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTsKfQoKZnVuY3Rpb24gRGlzcGF0Y2goXykgewog IHRoaXMuXyA9IF87Cn0KCmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcywgdHlwZXMp IHsKICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24o dCkgewogICAgdmFyIG5hbWUgPSAiIiwgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgaWYgKGkgPj0g MCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsKICAgIGlmICh0ICYm ICF0eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSkgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6 ICIgKyB0KTsKICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07CiAgfSk7Cn0KCkRpc3Bh dGNoLnByb3RvdHlwZSA9IGRpc3BhdGNoLnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogRGlz cGF0Y2gsCiAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykgewogICAgdmFyIF8gPSB0 aGlzLl8sCiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgIiIsIF8pLAogICAg ICAgIHQsCiAgICAgICAgaSA9IC0xLAogICAgICAgIG4gPSBULmxlbmd0aDsKCiAgICAvLyBJZiBu byBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZl biB0eXBlIGFuZCBuYW1lLgogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgIHdo aWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdl dChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0OwogICAgICByZXR1cm47CiAgICB9Cgog ICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBn aXZlbiB0eXBlIGFuZCBuYW1lLgogICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sg d2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS4KICAgIGlm IChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgdGhy b3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiICsgY2FsbGJhY2spOwogICAgd2hpbGUg KCsraSA8IG4pIHsKICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0g c2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTsKICAgICAgZWxzZSBpZiAoY2FsbGJh Y2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwg bnVsbCk7CiAgICB9CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKICBjb3B5OiBmdW5jdGlvbigpIHsK ICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87CiAgICBmb3IgKHZhciB0IGluIF8pIGNvcHlb dF0gPSBfW3RdLnNsaWNlKCk7CiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpOwogIH0sCiAg Y2FsbDogZnVuY3Rpb24odHlwZSwgdGhhdCkgewogICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0 aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkg PCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdOwogICAgaWYgKCF0aGlzLl8uaGFz T3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlw ZSk7CiAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBu OyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgfSwKICBhcHBseTogZnVuY3Rp b24odHlwZSwgdGhhdCwgYXJncykgewogICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlw ZSkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlwZSk7CiAgICBmb3IgKHZh ciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ld LnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOwogIH0KfTsKCmZ1bmN0aW9uIGdldCh0eXBlLCBuYW1l KSB7CiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkgewog ICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkgewogICAgICByZXR1cm4gYy52YWx1 ZTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHNldCh0eXBlLCBuYW1lLCBjYWxsYmFjaykgewogIGZv ciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgIGlmICh0eXBl W2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgdHlwZVtpXSA9IG5vb3AsIHR5cGUgPSB0eXBlLnNs aWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7CiAgICAgIGJyZWFrOwogICAgfQog IH0KICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTog Y2FsbGJhY2t9KTsKICByZXR1cm4gdHlwZTsKfQoKdmFyIHhodG1sID0gImh0dHA6Ly93d3cudzMu b3JnLzE5OTkveGh0bWwiOwoKdmFyIG5hbWVzcGFjZXMgPSB7CiAgc3ZnOiAiaHR0cDovL3d3dy53 My5vcmcvMjAwMC9zdmciLAogIHhodG1sOiB4aHRtbCwKICB4bGluazogImh0dHA6Ly93d3cudzMu b3JnLzE5OTkveGxpbmsiLAogIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVz cGFjZSIsCiAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIKfTsKCmZ1bmN0 aW9uIG5hbWVzcGFjZShuYW1lKSB7CiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gIiIsIGkgPSBwcmVm aXguaW5kZXhPZigiOiIpOwogIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwg aSkpICE9PSAieG1sbnMiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7CiAgcmV0dXJuIG5hbWVz cGFjZXMuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlc1twcmVmaXhd LCBsb2NhbDogbmFtZX0gOiBuYW1lOwp9CgpmdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3Vt ZW50LAogICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJOwogICAgcmV0dXJuIHVyaSA9PT0g eGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWwK ICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSkKICAgICAgICA6IGRvY3VtZW50 LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpOwogIH07Cn0KCmZ1bmN0aW9uIGNyZWF0b3JGaXhl ZChmdWxsbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm93bmVy RG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7 CiAgfTsKfQoKZnVuY3Rpb24gY3JlYXRvcihuYW1lKSB7CiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNw YWNlKG5hbWUpOwogIHJldHVybiAoZnVsbG5hbWUubG9jYWwKICAgICAgPyBjcmVhdG9yRml4ZWQK ICAgICAgOiBjcmVhdG9ySW5oZXJpdCkoZnVsbG5hbWUpOwp9CgpmdW5jdGlvbiBub25lKCkge30K CmZ1bmN0aW9uIHNlbGVjdG9yKHNlbGVjdG9yKSB7CiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwg PyBub25lIDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVj dG9yKTsKICB9Owp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0KHNlbGVjdCkgewogIGlmICh0 eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpOwoK ICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJn cm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBn cm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNb al0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAg ICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUs IG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHsKICAgICAgICBpZiAoIl9fZGF0YV9fIiBpbiBu b2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXzsKICAgICAgICBzdWJncm91cFtp XSA9IHN1Ym5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1 Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7Cn0KCmZ1bmN0aW9uIGVtcHR5KCkgewogIHJldHVybiBb XTsKfQoKZnVuY3Rpb24gc2VsZWN0b3JBbGwoc2VsZWN0b3IpIHsKICByZXR1cm4gc2VsZWN0b3Ig PT0gbnVsbCA/IGVtcHR5IDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVj dG9yQWxsKHNlbGVjdG9yKTsKICB9Owp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0QWxsKHNl bGVjdCkgewogIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxl Y3RvckFsbChzZWxlY3QpOwoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBn cm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07 ICsraikgewogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgs IG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsK ICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBp LCBncm91cCkpOwogICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgfQogICAgfQogIH0K CiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTsKfQoKZnVuY3Rpb24g bWF0Y2hlcihzZWxlY3RvcikgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlz Lm1hdGNoZXMoc2VsZWN0b3IpOwogIH07Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbl9maWx0ZXIobWF0 Y2gpIHsKICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNoZXIo bWF0Y2gpOwoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVu Z3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBm b3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBz dWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKChu b2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3Jv dXApKSB7CiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKICAgICAgfQogICAgfQogIH0KCiAg cmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKfQoKZnVuY3Rp b24gc3BhcnNlKHVwZGF0ZSkgewogIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7Cn0K CmZ1bmN0aW9uIHNlbGVjdGlvbl9lbnRlcigpIHsKICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlz Ll9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpOwp9Cgpm dW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkgewogIHRoaXMub3duZXJEb2N1bWVudCA9 IHBhcmVudC5vd25lckRvY3VtZW50OwogIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVz cGFjZVVSSTsKICB0aGlzLl9uZXh0ID0gbnVsbDsKICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAg dGhpcy5fX2RhdGFfXyA9IGRhdHVtOwp9CgpFbnRlck5vZGUucHJvdG90eXBlID0gewogIGNvbnN0 cnVjdG9yOiBFbnRlck5vZGUsCiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVy biB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSwKICBpbnNl cnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5z ZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSwKICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxl Y3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LAog IHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJl bnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH0KfTsKCmZ1bmN0aW9uIGNvbnN0YW50JDEo eCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn0KCnZhciBrZXlQ cmVmaXggPSAiJCI7IC8vIFByb3RlY3QgYWdhaW5zdCBrZXlzIGxpa2Ug4oCcX19wcm90b19f4oCd LgoKZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQs IGRhdGEpIHsKICB2YXIgaSA9IDAsCiAgICAgIG5vZGUsCiAgICAgIGdyb3VwTGVuZ3RoID0gZ3Jv dXAubGVuZ3RoLAogICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7CgogIC8vIFB1dCBhbnkg bm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuCiAgLy8gUHV0IGFueSBudWxsIG5v ZGVzIGludG8gZW50ZXIuCiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLgog IGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7 CiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICB1cGRhdGVbaV0gPSBub2RlOwog ICAgfSBlbHNlIHsKICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtp XSk7CiAgICB9CiAgfQoKICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9u4oCZdCBm aXQgaW50byBleGl0LgogIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkgewogICAgaWYgKG5v ZGUgPSBncm91cFtpXSkgewogICAgICBleGl0W2ldID0gbm9kZTsKICAgIH0KICB9Cn0KCmZ1bmN0 aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5 KSB7CiAgdmFyIGksCiAgICAgIG5vZGUsCiAgICAgIG5vZGVCeUtleVZhbHVlID0ge30sCiAgICAg IGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5n dGgsCiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksCiAgICAgIGtleVZh bHVlOwoKICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS4KICAvLyBJZiBtdWx0aXBs ZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4 aXQuCiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgIGlmIChub2RlID0g Z3JvdXBbaV0pIHsKICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXlQcmVmaXggKyBr ZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICAgIGlmIChrZXlWYWx1 ZSBpbiBub2RlQnlLZXlWYWx1ZSkgewogICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICB9IGVs c2UgewogICAgICAgIG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSA9IG5vZGU7CiAgICAgIH0KICAg IH0KICB9CgogIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS4KICAvLyBJZiB0aGVy ZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBk YXRlLgogIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFk ZCBpdCB0byBlbnRlci4KICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICBr ZXlWYWx1ZSA9IGtleVByZWZpeCArIGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSk7 CiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSkgewogICAgICB1cGRhdGVb aV0gPSBub2RlOwogICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTsKICAgICAgbm9kZUJ5S2V5 VmFsdWVba2V5VmFsdWVdID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIGVudGVyW2ldID0gbmV3 IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pOwogICAgfQogIH0KCiAgLy8gQWRkIGFueSByZW1h aW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuCiAgZm9yIChp ID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAm JiAobm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVzW2ldXSA9PT0gbm9kZSkpIHsKICAgICAgZXhpdFtp XSA9IG5vZGU7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fZGF0YSh2YWx1ZSwga2V5 KSB7CiAgaWYgKCF2YWx1ZSkgewogICAgZGF0YSA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGog PSAtMTsKICAgIHRoaXMuZWFjaChmdW5jdGlvbihkKSB7IGRhdGFbKytqXSA9IGQ7IH0pOwogICAg cmV0dXJuIGRhdGE7CiAgfQoKICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgs CiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLAogICAgICBncm91cHMgPSB0aGlzLl9ncm91 cHM7CgogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHZhbHVlID0gY29uc3RhbnQk MSh2YWx1ZSk7CgogIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJy YXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsg aiA8IG07ICsraikgewogICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sCiAgICAgICAgZ3JvdXAg PSBncm91cHNbal0sCiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgICAg ZGF0YSA9IHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBw YXJlbnRzKSwKICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgZW50ZXJH cm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIHVwZGF0ZUdy b3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIGV4aXRHcm91 cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOwoKICAgIGJpbmQocGFyZW50LCBn cm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTsKCiAg ICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0 ZSBub2RlLCBzdWNoIHRoYXQKICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVy aWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsCiAgICAvLyByYXRoZXIgdGhhbiBh dCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS4KICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAw LCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7CiAgICAgIGlmIChwcmV2 aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7CiAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsg MTsKICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0 YUxlbmd0aCk7CiAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7CiAgICAgIH0K ICAgIH0KICB9CgogIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTsKICB1 cGRhdGUuX2VudGVyID0gZW50ZXI7CiAgdXBkYXRlLl9leGl0ID0gZXhpdDsKICByZXR1cm4gdXBk YXRlOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fZXhpdCgpIHsKICByZXR1cm4gbmV3IFNlbGVjdGlv bih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7 Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbl9qb2luKG9uZW50ZXIsIG9udXBkYXRlLCBvbmV4aXQpIHsK ICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksIHVwZGF0ZSA9IHRoaXMsIGV4aXQgPSB0aGlzLmV4 aXQoKTsKICBlbnRlciA9IHR5cGVvZiBvbmVudGVyID09PSAiZnVuY3Rpb24iID8gb25lbnRlcihl bnRlcikgOiBlbnRlci5hcHBlbmQob25lbnRlciArICIiKTsKICBpZiAob251cGRhdGUgIT0gbnVs bCkgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTsKICBpZiAob25leGl0ID09IG51bGwpIGV4aXQu cmVtb3ZlKCk7IGVsc2Ugb25leGl0KGV4aXQpOwogIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBl bnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlv bl9tZXJnZShzZWxlY3Rpb24pIHsKCiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3Vwcywg Z3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdy b3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0w KSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0s IGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tq XSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKG5v ZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgbWVyZ2VbaV0gPSBub2RlOwog ICAgICB9CiAgICB9CiAgfQoKICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgIG1lcmdlc1tqXSA9 IGdyb3VwczBbal07CiAgfQoKICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3Bh cmVudHMpOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fb3JkZXIoKSB7CgogIGZvciAodmFyIGdyb3Vw cyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHsK ICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4 dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtp XSkgewogICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4 dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpOwogICAgICAg IG5leHQgPSBub2RlOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gdGhpczsKfQoKZnVuY3Rp b24gc2VsZWN0aW9uX3NvcnQoY29tcGFyZSkgewogIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFz Y2VuZGluZyQxOwoKICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7CiAgICByZXR1cm4gYSAm JiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7CiAgfQoKICBm b3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3Jv dXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgZm9yICh2YXIgZ3Jv dXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNb al0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGlmIChu b2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlOwogICAgICB9CiAg ICB9CiAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7CiAgfQoKICByZXR1cm4gbmV3IFNl bGVjdGlvbihzb3J0Z3JvdXBzLCB0aGlzLl9wYXJlbnRzKS5vcmRlcigpOwp9CgpmdW5jdGlvbiBh c2NlbmRpbmckMShhLCBiKSB7CiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49 IGIgPyAwIDogTmFOOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fY2FsbCgpIHsKICB2YXIgY2FsbGJh Y2sgPSBhcmd1bWVudHNbMF07CiAgYXJndW1lbnRzWzBdID0gdGhpczsKICBjYWxsYmFjay5hcHBs eShudWxsLCBhcmd1bWVudHMpOwogIHJldHVybiB0aGlzOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25f bm9kZXMoKSB7CiAgdmFyIG5vZGVzID0gbmV3IEFycmF5KHRoaXMuc2l6ZSgpKSwgaSA9IC0xOwog IHRoaXMuZWFjaChmdW5jdGlvbigpIHsgbm9kZXNbKytpXSA9IHRoaXM7IH0pOwogIHJldHVybiBu b2RlczsKfQoKZnVuY3Rpb24gc2VsZWN0aW9uX25vZGUoKSB7CgogIGZvciAodmFyIGdyb3VwcyA9 IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAg ICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkg PCBuOyArK2kpIHsKICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsKICAgICAgaWYgKG5vZGUpIHJl dHVybiBub2RlOwogICAgfQogIH0KCiAgcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlv bl9zaXplKCkgewogIHZhciBzaXplID0gMDsKICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7ICsrc2l6 ZTsgfSk7CiAgcmV0dXJuIHNpemU7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbl9lbXB0eSgpIHsKICBy ZXR1cm4gIXRoaXMubm9kZSgpOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fZWFjaChjYWxsYmFjaykg ewoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxl bmd0aDsgaiA8IG07ICsraikgewogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAw LCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7CiAgICAgIGlmIChub2RlID0g Z3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApOwog ICAgfQogIH0KCiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkgewog IHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogIH07 Cn0KCmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigp IHsKICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxv Y2FsKTsKICB9Owp9CgpmdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgdmFsdWUpIHsKICByZXR1 cm4gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgfTsK fQoKZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIHZhbHVlKSB7CiAgcmV0dXJuIGZ1 bmN0aW9uKCkgewogICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5h bWUubG9jYWwsIHZhbHVlKTsKICB9Owp9CgpmdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgdmFs dWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMs IGFyZ3VtZW50cyk7CiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1l KTsKICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7CiAgfTsKfQoKZnVuY3Rpb24g YXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewog ICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHYgPT0gbnVs bCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwp OwogICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5s b2NhbCwgdik7CiAgfTsKfQoKZnVuY3Rpb24gc2VsZWN0aW9uX2F0dHIobmFtZSwgdmFsdWUpIHsK ICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7CgogIGlmIChhcmd1bWVudHMubGVuZ3Ro IDwgMikgewogICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTsKICAgIHJldHVybiBmdWxsbmFtZS5s b2NhbAogICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5h bWUubG9jYWwpCiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7CiAgfQoKICBy ZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsCiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8g YXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24i CiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24p CiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQp KSkoZnVsbG5hbWUsIHZhbHVlKSk7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRWaWV3KG5vZGUpIHsKICBy ZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZp ZXcpIC8vIG5vZGUgaXMgYSBOb2RlCiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8v IG5vZGUgaXMgYSBXaW5kb3cKICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBh IERvY3VtZW50Cn0KCmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHsKICByZXR1cm4gZnVuY3Rp b24oKSB7CiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpOwogIH07Cn0KCmZ1bmN0 aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgcmV0dXJuIGZ1bmN0 aW9uKCkgewogICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkp OwogIH07Cn0KCmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1 bWVudHMpOwogICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1l KTsKICAgIGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2LCBwcmlvcml0eSk7CiAg fTsKfQoKZnVuY3Rpb24gc2VsZWN0aW9uX3N0eWxlKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewog IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMQogICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0g bnVsbAogICAgICAgICAgICA/IHN0eWxlUmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rp b24iCiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvbgogICAgICAgICAgICA6IHN0eWxlQ29uc3Rh bnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpCiAgICAg IDogc3R5bGVWYWx1ZSh0aGlzLm5vZGUoKSwgbmFtZSk7Cn0KCmZ1bmN0aW9uIHN0eWxlVmFsdWUo bm9kZSwgbmFtZSkgewogIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkK ICAgICAgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5n ZXRQcm9wZXJ0eVZhbHVlKG5hbWUpOwp9CgpmdW5jdGlvbiBwcm9wZXJ0eVJlbW92ZShuYW1lKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgZGVsZXRlIHRoaXNbbmFtZV07CiAgfTsKfQoKZnVu Y3Rpb24gcHJvcGVydHlDb25zdGFudChuYW1lLCB2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigp IHsKICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTsKICB9Owp9CgpmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0 aW9uKG5hbWUsIHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHYgPSB2YWx1 ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHYgPT0gbnVsbCkgZGVsZXRlIHRoaXNb bmFtZV07CiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2OwogIH07Cn0KCmZ1bmN0aW9uIHNlbGVjdGlv bl9wcm9wZXJ0eShuYW1lLCB2YWx1ZSkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMQog ICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgPyBwcm9wZXJ0eVJlbW92 ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0 aW9uCiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSkKICAgICAgOiB0 aGlzLm5vZGUoKVtuYW1lXTsKfQoKZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpIHsKICByZXR1 cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxccysvKTsKfQoKZnVuY3Rpb24gY2xhc3NMaXN0KG5v ZGUpIHsKICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTsKfQoK ZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHsKICB0aGlzLl9ub2RlID0gbm9kZTsKICB0aGlzLl9u YW1lcyA9IGNsYXNzQXJyYXkobm9kZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIpOwp9CgpD bGFzc0xpc3QucHJvdG90eXBlID0gewogIGFkZDogZnVuY3Rpb24obmFtZSkgewogICAgdmFyIGkg PSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpOwogICAgaWYgKGkgPCAwKSB7CiAgICAgIHRoaXMu X25hbWVzLnB1c2gobmFtZSk7CiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIs IHRoaXMuX25hbWVzLmpvaW4oIiAiKSk7CiAgICB9CiAgfSwKICByZW1vdmU6IGZ1bmN0aW9uKG5h bWUpIHsKICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgIGlmIChpID49 IDApIHsKICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpOwogICAgICB0aGlzLl9ub2RlLnNl dEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgfQogIH0sCiAg Y29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9m KG5hbWUpID49IDA7CiAgfQp9OwoKZnVuY3Rpb24gY2xhc3NlZEFkZChub2RlLCBuYW1lcykgewog IHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAg d2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTsKfQoKZnVuY3Rpb24gY2xhc3NlZFJl bW92ZShub2RlLCBuYW1lcykgewogIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEs IG4gPSBuYW1lcy5sZW5ndGg7CiAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ld KTsKfQoKZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7 CiAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTsKICB9Owp9CgpmdW5jdGlvbiBjbGFzc2VkRmFs c2UobmFtZXMpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICBjbGFzc2VkUmVtb3ZlKHRoaXMs IG5hbWVzKTsKICB9Owp9CgpmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykg PyBjbGFzc2VkQWRkIDogY2xhc3NlZFJlbW92ZSkodGhpcywgbmFtZXMpOwogIH07Cn0KCmZ1bmN0 aW9uIHNlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSB7CiAgdmFyIG5hbWVzID0gY2xhc3NB cnJheShuYW1lICsgIiIpOwoKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgIHZhciBs aXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwog ICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBm YWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZh bHVlID09PSAiZnVuY3Rpb24iCiAgICAgID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWUKICAgICAg PyBjbGFzc2VkVHJ1ZQogICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7Cn0KCmZ1 bmN0aW9uIHRleHRSZW1vdmUoKSB7CiAgdGhpcy50ZXh0Q29udGVudCA9ICIiOwp9CgpmdW5jdGlv biB0ZXh0Q29uc3RhbnQodmFsdWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRl eHRDb250ZW50ID0gdmFsdWU7CiAgfTsKfQoKZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1 bWVudHMpOwogICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICB9Owp9 CgpmdW5jdGlvbiBzZWxlY3Rpb25fdGV4dCh2YWx1ZSkgewogIHJldHVybiBhcmd1bWVudHMubGVu Z3RoCiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGwKICAgICAgICAgID8gdGV4dFJlbW92 ZSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gdGV4dEZ1bmN0aW9u CiAgICAgICAgICA6IHRleHRDb25zdGFudCkodmFsdWUpKQogICAgICA6IHRoaXMubm9kZSgpLnRl eHRDb250ZW50Owp9CgpmdW5jdGlvbiBodG1sUmVtb3ZlKCkgewogIHRoaXMuaW5uZXJIVE1MID0g IiI7Cn0KCmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigp IHsKICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7CiAgfTsKfQoKZnVuY3Rpb24gaHRtbEZ1bmN0 aW9uKHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHYgPSB2YWx1ZS5hcHBs eSh0aGlzLCBhcmd1bWVudHMpOwogICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyAiIiA6 IHY7CiAgfTsKfQoKZnVuY3Rpb24gc2VsZWN0aW9uX2h0bWwodmFsdWUpIHsKICByZXR1cm4gYXJn dW1lbnRzLmxlbmd0aAogICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICA/ IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IGh0 bWxGdW5jdGlvbgogICAgICAgICAgOiBodG1sQ29uc3RhbnQpKHZhbHVlKSkKICAgICAgOiB0aGlz Lm5vZGUoKS5pbm5lckhUTUw7Cn0KCmZ1bmN0aW9uIHJhaXNlKCkgewogIGlmICh0aGlzLm5leHRT aWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7Cn0KCmZ1bmN0aW9uIHNl bGVjdGlvbl9yYWlzZSgpIHsKICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTsKfQoKZnVuY3Rpb24g bG93ZXIoKSB7CiAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5z ZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTsKfQoKZnVuY3Rpb24g c2VsZWN0aW9uX2xvd2VyKCkgewogIHJldHVybiB0aGlzLmVhY2gobG93ZXIpOwp9CgpmdW5jdGlv biBzZWxlY3Rpb25fYXBwZW5kKG5hbWUpIHsKICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09 ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTsKICByZXR1cm4gdGhpcy5zZWxlY3Qo ZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhp cywgYXJndW1lbnRzKSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHsKICByZXR1 cm4gbnVsbDsKfQoKZnVuY3Rpb24gc2VsZWN0aW9uX2luc2VydChuYW1lLCBiZWZvcmUpIHsKICB2 YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihu YW1lKSwKICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBl b2YgYmVmb3JlID09PSAiZnVuY3Rpb24iID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTsKICBy ZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZv cmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1 bWVudHMpIHx8IG51bGwpOwogIH0pOwp9CgpmdW5jdGlvbiByZW1vdmUoKSB7CiAgdmFyIHBhcmVu dCA9IHRoaXMucGFyZW50Tm9kZTsKICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhp cyk7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbl9yZW1vdmUoKSB7CiAgcmV0dXJuIHRoaXMuZWFjaChy ZW1vdmUpOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KCkgewogIHZhciBjbG9u ZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogIHJl dHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5n KSA6IGNsb25lOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwKCkgewogIHZhciBjbG9u ZSA9IHRoaXMuY2xvbmVOb2RlKHRydWUpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgcmV0 dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcp IDogY2xvbmU7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZShkZWVwKSB7CiAgcmV0dXJuIHRo aXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hh bGxvdyk7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbl9kYXR1bSh2YWx1ZSkgewogIHJldHVybiBhcmd1 bWVudHMubGVuZ3RoCiAgICAgID8gdGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLCB2YWx1ZSkKICAg ICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXzsKfQoKdmFyIGZpbHRlckV2ZW50cyA9IHt9OwoKZXhw b3J0cy5ldmVudCA9IG51bGw7CgppZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikg ewogIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogIGlmICghKCJvbm1v dXNlZW50ZXIiIGluIGVsZW1lbnQpKSB7CiAgICBmaWx0ZXJFdmVudHMgPSB7bW91c2VlbnRlcjog Im1vdXNlb3ZlciIsIG1vdXNlbGVhdmU6ICJtb3VzZW91dCJ9OwogIH0KfQoKZnVuY3Rpb24gZmls dGVyQ29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHsKICBsaXN0ZW5lciA9 IGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKTsKICByZXR1cm4gZnVuY3Rp b24oZXZlbnQpIHsKICAgIHZhciByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldDsKICAgIGlm ICghcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGhpcyAmJiAhKHJlbGF0ZWQuY29tcGFyZURvY3Vt ZW50UG9zaXRpb24odGhpcykgJiA4KSkpIHsKICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVu dCk7CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRl eCwgZ3JvdXApIHsKICByZXR1cm4gZnVuY3Rpb24oZXZlbnQxKSB7CiAgICB2YXIgZXZlbnQwID0g ZXhwb3J0cy5ldmVudDsgLy8gRXZlbnRzIGNhbiBiZSByZWVudHJhbnQgKGUuZy4sIGZvY3VzKS4K ICAgIGV4cG9ydHMuZXZlbnQgPSBldmVudDE7CiAgICB0cnkgewogICAgICBsaXN0ZW5lci5jYWxs KHRoaXMsIHRoaXMuX19kYXRhX18sIGluZGV4LCBncm91cCk7CiAgICB9IGZpbmFsbHkgewogICAg ICBleHBvcnRzLmV2ZW50ID0gZXZlbnQwOwogICAgfQogIH07Cn0KCmZ1bmN0aW9uIHBhcnNlVHlw ZW5hbWVzJDEodHlwZW5hbWVzKSB7CiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158 XHMrLykubWFwKGZ1bmN0aW9uKHQpIHsKICAgIHZhciBuYW1lID0gIiIsIGkgPSB0LmluZGV4T2Yo Ii4iKTsKICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2Uo MCwgaSk7CiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9OwogIH0pOwp9CgpmdW5jdGlv biBvblJlbW92ZSh0eXBlbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBvbiA9 IHRoaXMuX19vbjsKICAgIGlmICghb24pIHJldHVybjsKICAgIGZvciAodmFyIGogPSAwLCBpID0g LTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgaWYgKG8gPSBvbltqXSwg KCF0eXBlbmFtZS50eXBlIHx8IG8udHlwZSA9PT0gdHlwZW5hbWUudHlwZSkgJiYgby5uYW1lID09 PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlw ZSwgby5saXN0ZW5lciwgby5jYXB0dXJlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvblsrK2ld ID0gbzsKICAgICAgfQogICAgfQogICAgaWYgKCsraSkgb24ubGVuZ3RoID0gaTsKICAgIGVsc2Ug ZGVsZXRlIHRoaXMuX19vbjsKICB9Owp9CgpmdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUs IGNhcHR1cmUpIHsKICB2YXIgd3JhcCA9IGZpbHRlckV2ZW50cy5oYXNPd25Qcm9wZXJ0eSh0eXBl bmFtZS50eXBlKSA/IGZpbHRlckNvbnRleHRMaXN0ZW5lciA6IGNvbnRleHRMaXN0ZW5lcjsKICBy ZXR1cm4gZnVuY3Rpb24oZCwgaSwgZ3JvdXApIHsKICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywg bGlzdGVuZXIgPSB3cmFwKHZhbHVlLCBpLCBncm91cCk7CiAgICBpZiAob24pIGZvciAodmFyIGog PSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgIGlmICgobyA9IG9uW2pdKS50 eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkgewogICAg ICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVy ZSk7CiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxp c3RlbmVyLCBvLmNhcHR1cmUgPSBjYXB0dXJlKTsKICAgICAgICBvLnZhbHVlID0gdmFsdWU7CiAg ICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlw ZW5hbWUudHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpOwogICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50 eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5l ciwgY2FwdHVyZTogY2FwdHVyZX07CiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107CiAgICBl bHNlIG9uLnB1c2gobyk7CiAgfTsKfQoKZnVuY3Rpb24gc2VsZWN0aW9uX29uKHR5cGVuYW1lLCB2 YWx1ZSwgY2FwdHVyZSkgewogIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyQxKHR5cGVu YW1lICsgIiIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDsKCiAgaWYgKGFyZ3VtZW50cy5s ZW5ndGggPCAyKSB7CiAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uOwogICAgaWYgKG9uKSBm b3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikgewogICAgICBmb3Ig KGkgPSAwLCBvID0gb25bal07IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoKHQgPSB0eXBlbmFt ZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkgewogICAgICAgICAg cmV0dXJuIG8udmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm47CiAgfQoK ICBvbiA9IHZhbHVlID8gb25BZGQgOiBvblJlbW92ZTsKICBpZiAoY2FwdHVyZSA9PSBudWxsKSBj YXB0dXJlID0gZmFsc2U7CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgdGhpcy5lYWNoKG9uKHR5 cGVuYW1lc1tpXSwgdmFsdWUsIGNhcHR1cmUpKTsKICByZXR1cm4gdGhpczsKfQoKZnVuY3Rpb24g Y3VzdG9tRXZlbnQoZXZlbnQxLCBsaXN0ZW5lciwgdGhhdCwgYXJncykgewogIHZhciBldmVudDAg PSBleHBvcnRzLmV2ZW50OwogIGV2ZW50MS5zb3VyY2VFdmVudCA9IGV4cG9ydHMuZXZlbnQ7CiAg ZXhwb3J0cy5ldmVudCA9IGV2ZW50MTsKICB0cnkgewogICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5 KHRoYXQsIGFyZ3MpOwogIH0gZmluYWxseSB7CiAgICBleHBvcnRzLmV2ZW50ID0gZXZlbnQwOwog IH0KfQoKZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChub2RlLCB0eXBlLCBwYXJhbXMpIHsKICB2YXIg d2luZG93ID0gZGVmYXVsdFZpZXcobm9kZSksCiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2 ZW50OwoKICBpZiAodHlwZW9mIGV2ZW50ID09PSAiZnVuY3Rpb24iKSB7CiAgICBldmVudCA9IG5l dyBldmVudCh0eXBlLCBwYXJhbXMpOwogIH0gZWxzZSB7CiAgICBldmVudCA9IHdpbmRvdy5kb2N1 bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTsKICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVu dCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwg PSBwYXJhbXMuZGV0YWlsOwogICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZh bHNlKTsKICB9CgogIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7Cn0KCmZ1bmN0aW9uIGRpc3Bh dGNoQ29uc3RhbnQodHlwZSwgcGFyYW1zKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0 dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zKTsKICB9Owp9CgpmdW5jdGlvbiBk aXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAg IHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1 bWVudHMpKTsKICB9Owp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fZGlzcGF0Y2godHlwZSwgcGFyYW1z KSB7CiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcyA9PT0gImZ1bmN0aW9uIgogICAg ICA/IGRpc3BhdGNoRnVuY3Rpb24KICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJh bXMpKTsKfQoKdmFyIHJvb3QgPSBbbnVsbF07CgpmdW5jdGlvbiBTZWxlY3Rpb24oZ3JvdXBzLCBw YXJlbnRzKSB7CiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzOwogIHRoaXMuX3BhcmVudHMgPSBwYXJl bnRzOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW1tk b2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7Cn0KClNlbGVjdGlvbi5wcm90b3R5cGUg PSBzZWxlY3Rpb24ucHJvdG90eXBlID0gewogIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sCiAgc2Vs ZWN0OiBzZWxlY3Rpb25fc2VsZWN0LAogIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCwK ICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsCiAgZGF0YTogc2VsZWN0aW9uX2RhdGEsCiAgZW50 ZXI6IHNlbGVjdGlvbl9lbnRlciwKICBleGl0OiBzZWxlY3Rpb25fZXhpdCwKICBqb2luOiBzZWxl Y3Rpb25fam9pbiwKICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLAogIG9yZGVyOiBzZWxlY3Rpb25f b3JkZXIsCiAgc29ydDogc2VsZWN0aW9uX3NvcnQsCiAgY2FsbDogc2VsZWN0aW9uX2NhbGwsCiAg bm9kZXM6IHNlbGVjdGlvbl9ub2RlcywKICBub2RlOiBzZWxlY3Rpb25fbm9kZSwKICBzaXplOiBz ZWxlY3Rpb25fc2l6ZSwKICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LAogIGVhY2g6IHNlbGVjdGlv bl9lYWNoLAogIGF0dHI6IHNlbGVjdGlvbl9hdHRyLAogIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUs CiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSwKICBjbGFzc2VkOiBzZWxlY3Rpb25fY2xh c3NlZCwKICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCwKICBodG1sOiBzZWxlY3Rpb25faHRtbCwKICBy YWlzZTogc2VsZWN0aW9uX3JhaXNlLAogIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsCiAgYXBwZW5k OiBzZWxlY3Rpb25fYXBwZW5kLAogIGluc2VydDogc2VsZWN0aW9uX2luc2VydCwKICByZW1vdmU6 IHNlbGVjdGlvbl9yZW1vdmUsCiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSwKICBkYXR1bTogc2Vs ZWN0aW9uX2RhdHVtLAogIG9uOiBzZWxlY3Rpb25fb24sCiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9k aXNwYXRjaAp9OwoKZnVuY3Rpb24gc2VsZWN0KHNlbGVjdG9yKSB7CiAgcmV0dXJuIHR5cGVvZiBz ZWxlY3RvciA9PT0gInN0cmluZyIKICAgICAgPyBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVl cnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pCiAgICAg IDogbmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0sIHJvb3QpOwp9CgpmdW5jdGlvbiBjcmVhdGUo bmFtZSkgewogIHJldHVybiBzZWxlY3QoY3JlYXRvcihuYW1lKS5jYWxsKGRvY3VtZW50LmRvY3Vt ZW50RWxlbWVudCkpOwp9Cgp2YXIgbmV4dElkID0gMDsKCmZ1bmN0aW9uIGxvY2FsKCkgewogIHJl dHVybiBuZXcgTG9jYWw7Cn0KCmZ1bmN0aW9uIExvY2FsKCkgewogIHRoaXMuXyA9ICJAIiArICgr K25leHRJZCkudG9TdHJpbmcoMzYpOwp9CgpMb2NhbC5wcm90b3R5cGUgPSBsb2NhbC5wcm90b3R5 cGUgPSB7CiAgY29uc3RydWN0b3I6IExvY2FsLAogIGdldDogZnVuY3Rpb24obm9kZSkgewogICAg dmFyIGlkID0gdGhpcy5fOwogICAgd2hpbGUgKCEoaWQgaW4gbm9kZSkpIGlmICghKG5vZGUgPSBu b2RlLnBhcmVudE5vZGUpKSByZXR1cm47CiAgICByZXR1cm4gbm9kZVtpZF07CiAgfSwKICBzZXQ6 IGZ1bmN0aW9uKG5vZGUsIHZhbHVlKSB7CiAgICByZXR1cm4gbm9kZVt0aGlzLl9dID0gdmFsdWU7 CiAgfSwKICByZW1vdmU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgIHJldHVybiB0aGlzLl8gaW4gbm9k ZSAmJiBkZWxldGUgbm9kZVt0aGlzLl9dOwogIH0sCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewog ICAgcmV0dXJuIHRoaXMuXzsKICB9Cn07CgpmdW5jdGlvbiBzb3VyY2VFdmVudCgpIHsKICB2YXIg Y3VycmVudCA9IGV4cG9ydHMuZXZlbnQsIHNvdXJjZTsKICB3aGlsZSAoc291cmNlID0gY3VycmVu dC5zb3VyY2VFdmVudCkgY3VycmVudCA9IHNvdXJjZTsKICByZXR1cm4gY3VycmVudDsKfQoKZnVu Y3Rpb24gcG9pbnQobm9kZSwgZXZlbnQpIHsKICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1l bnQgfHwgbm9kZTsKCiAgaWYgKHN2Zy5jcmVhdGVTVkdQb2ludCkgewogICAgdmFyIHBvaW50ID0g c3ZnLmNyZWF0ZVNWR1BvaW50KCk7CiAgICBwb2ludC54ID0gZXZlbnQuY2xpZW50WCwgcG9pbnQu eSA9IGV2ZW50LmNsaWVudFk7CiAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShub2Rl LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7CiAgICByZXR1cm4gW3BvaW50LngsIHBvaW50Lnld OwogIH0KCiAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIHJldHVy biBbZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIG5vZGUuY2xpZW50TGVmdCwgZXZlbnQuY2xp ZW50WSAtIHJlY3QudG9wIC0gbm9kZS5jbGllbnRUb3BdOwp9CgpmdW5jdGlvbiBtb3VzZShub2Rl KSB7CiAgdmFyIGV2ZW50ID0gc291cmNlRXZlbnQoKTsKICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNo ZXMpIGV2ZW50ID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07CiAgcmV0dXJuIHBvaW50KG5vZGUs IGV2ZW50KTsKfQoKZnVuY3Rpb24gc2VsZWN0QWxsKHNlbGVjdG9yKSB7CiAgcmV0dXJuIHR5cGVv ZiBzZWxlY3RvciA9PT0gInN0cmluZyIKICAgICAgPyBuZXcgU2VsZWN0aW9uKFtkb2N1bWVudC5x dWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKQog ICAgICA6IG5ldyBTZWxlY3Rpb24oW3NlbGVjdG9yID09IG51bGwgPyBbXSA6IHNlbGVjdG9yXSwg cm9vdCk7Cn0KCmZ1bmN0aW9uIHRvdWNoKG5vZGUsIHRvdWNoZXMsIGlkZW50aWZpZXIpIHsKICBp ZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGlkZW50aWZpZXIgPSB0b3VjaGVzLCB0b3VjaGVzID0g c291cmNlRXZlbnQoKS5jaGFuZ2VkVG91Y2hlczsKCiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3Vj aGVzID8gdG91Y2hlcy5sZW5ndGggOiAwLCB0b3VjaDsgaSA8IG47ICsraSkgewogICAgaWYgKCh0 b3VjaCA9IHRvdWNoZXNbaV0pLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHsKICAgICAgcmV0 dXJuIHBvaW50KG5vZGUsIHRvdWNoKTsKICAgIH0KICB9CgogIHJldHVybiBudWxsOwp9CgpmdW5j dGlvbiB0b3VjaGVzKG5vZGUsIHRvdWNoZXMpIHsKICBpZiAodG91Y2hlcyA9PSBudWxsKSB0b3Vj aGVzID0gc291cmNlRXZlbnQoKS50b3VjaGVzOwoKICBmb3IgKHZhciBpID0gMCwgbiA9IHRvdWNo ZXMgPyB0b3VjaGVzLmxlbmd0aCA6IDAsIHBvaW50cyA9IG5ldyBBcnJheShuKTsgaSA8IG47ICsr aSkgewogICAgcG9pbnRzW2ldID0gcG9pbnQobm9kZSwgdG91Y2hlc1tpXSk7CiAgfQoKICByZXR1 cm4gcG9pbnRzOwp9CgpmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKCkgewogIGV4cG9ydHMuZXZlbnQu c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7Cn0KCmZ1bmN0aW9uIG5vZXZlbnQoKSB7CiAgZXhw b3J0cy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogIGV4cG9ydHMuZXZlbnQuc3RvcEltbWVkaWF0 ZVByb3BhZ2F0aW9uKCk7Cn0KCmZ1bmN0aW9uIGRyYWdEaXNhYmxlKHZpZXcpIHsKICB2YXIgcm9v dCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAogICAgICBzZWxlY3Rpb24gPSBzZWxl Y3Qodmlldykub24oImRyYWdzdGFydC5kcmFnIiwgbm9ldmVudCwgdHJ1ZSk7CiAgaWYgKCJvbnNl bGVjdHN0YXJ0IiBpbiByb290KSB7CiAgICBzZWxlY3Rpb24ub24oInNlbGVjdHN0YXJ0LmRyYWci LCBub2V2ZW50LCB0cnVlKTsKICB9IGVsc2UgewogICAgcm9vdC5fX25vc2VsZWN0ID0gcm9vdC5z dHlsZS5Nb3pVc2VyU2VsZWN0OwogICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gIm5vbmUi OwogIH0KfQoKZnVuY3Rpb24geWVzZHJhZyh2aWV3LCBub2NsaWNrKSB7CiAgdmFyIHJvb3QgPSB2 aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZp ZXcpLm9uKCJkcmFnc3RhcnQuZHJhZyIsIG51bGwpOwogIGlmIChub2NsaWNrKSB7CiAgICBzZWxl Y3Rpb24ub24oImNsaWNrLmRyYWciLCBub2V2ZW50LCB0cnVlKTsKICAgIHNldFRpbWVvdXQoZnVu Y3Rpb24oKSB7IHNlbGVjdGlvbi5vbigiY2xpY2suZHJhZyIsIG51bGwpOyB9LCAwKTsKICB9CiAg aWYgKCJvbnNlbGVjdHN0YXJ0IiBpbiByb290KSB7CiAgICBzZWxlY3Rpb24ub24oInNlbGVjdHN0 YXJ0LmRyYWciLCBudWxsKTsKICB9IGVsc2UgewogICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0 ID0gcm9vdC5fX25vc2VsZWN0OwogICAgZGVsZXRlIHJvb3QuX19ub3NlbGVjdDsKICB9Cn0KCmZ1 bmN0aW9uIGNvbnN0YW50JDIoeCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4 OwogIH07Cn0KCmZ1bmN0aW9uIERyYWdFdmVudCh0YXJnZXQsIHR5cGUsIHN1YmplY3QsIGlkLCBh Y3RpdmUsIHgsIHksIGR4LCBkeSwgZGlzcGF0Y2gpIHsKICB0aGlzLnRhcmdldCA9IHRhcmdldDsK ICB0aGlzLnR5cGUgPSB0eXBlOwogIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7CiAgdGhpcy5pZGVu dGlmaWVyID0gaWQ7CiAgdGhpcy5hY3RpdmUgPSBhY3RpdmU7CiAgdGhpcy54ID0geDsKICB0aGlz LnkgPSB5OwogIHRoaXMuZHggPSBkeDsKICB0aGlzLmR5ID0gZHk7CiAgdGhpcy5fID0gZGlzcGF0 Y2g7Cn0KCkRyYWdFdmVudC5wcm90b3R5cGUub24gPSBmdW5jdGlvbigpIHsKICB2YXIgdmFsdWUg PSB0aGlzLl8ub24uYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOwogIHJldHVybiB2YWx1ZSA9PT0g dGhpcy5fID8gdGhpcyA6IHZhbHVlOwp9OwoKLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0 aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuCmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIo KSB7CiAgcmV0dXJuICFleHBvcnRzLmV2ZW50LmN0cmxLZXkgJiYgIWV4cG9ydHMuZXZlbnQuYnV0 dG9uOwp9CgpmdW5jdGlvbiBkZWZhdWx0Q29udGFpbmVyKCkgewogIHJldHVybiB0aGlzLnBhcmVu dE5vZGU7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRTdWJqZWN0KGQpIHsKICByZXR1cm4gZCA9PSBudWxs ID8ge3g6IGV4cG9ydHMuZXZlbnQueCwgeTogZXhwb3J0cy5ldmVudC55fSA6IGQ7Cn0KCmZ1bmN0 aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7CiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50 cyB8fCAoIm9udG91Y2hzdGFydCIgaW4gdGhpcyk7Cn0KCmZ1bmN0aW9uIGRyYWcoKSB7CiAgdmFy IGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsCiAgICAgIGNvbnRhaW5lciA9IGRlZmF1bHRDb250YWlu ZXIsCiAgICAgIHN1YmplY3QgPSBkZWZhdWx0U3ViamVjdCwKICAgICAgdG91Y2hhYmxlID0gZGVm YXVsdFRvdWNoYWJsZSwKICAgICAgZ2VzdHVyZXMgPSB7fSwKICAgICAgbGlzdGVuZXJzID0gZGlz cGF0Y2goInN0YXJ0IiwgImRyYWciLCAiZW5kIiksCiAgICAgIGFjdGl2ZSA9IDAsCiAgICAgIG1v dXNlZG93bngsCiAgICAgIG1vdXNlZG93bnksCiAgICAgIG1vdXNlbW92aW5nLAogICAgICB0b3Vj aGVuZGluZywKICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwOwoKICBmdW5jdGlvbiBkcmFnKHNlbGVj dGlvbikgewogICAgc2VsZWN0aW9uCiAgICAgICAgLm9uKCJtb3VzZWRvd24uZHJhZyIsIG1vdXNl ZG93bmVkKQogICAgICAuZmlsdGVyKHRvdWNoYWJsZSkKICAgICAgICAub24oInRvdWNoc3RhcnQu ZHJhZyIsIHRvdWNoc3RhcnRlZCkKICAgICAgICAub24oInRvdWNobW92ZS5kcmFnIiwgdG91Y2ht b3ZlZCkKICAgICAgICAub24oInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZyIsIHRvdWNo ZW5kZWQpCiAgICAgICAgLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCAibm9uZSIpCiAgICAgICAgLnN0 eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCAicmdiYSgwLDAsMCwwKSIpOwogIH0K CiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoKSB7CiAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRl ci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47CiAgICB2YXIgZ2VzdHVyZSA9IGJlZm9y ZXN0YXJ0KCJtb3VzZSIsIGNvbnRhaW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBtb3VzZSwg dGhpcywgYXJndW1lbnRzKTsKICAgIGlmICghZ2VzdHVyZSkgcmV0dXJuOwogICAgc2VsZWN0KGV4 cG9ydHMuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS5kcmFnIiwgbW91c2Vtb3ZlZCwgdHJ1ZSku b24oIm1vdXNldXAuZHJhZyIsIG1vdXNldXBwZWQsIHRydWUpOwogICAgZHJhZ0Rpc2FibGUoZXhw b3J0cy5ldmVudC52aWV3KTsKICAgIG5vcHJvcGFnYXRpb24oKTsKICAgIG1vdXNlbW92aW5nID0g ZmFsc2U7CiAgICBtb3VzZWRvd254ID0gZXhwb3J0cy5ldmVudC5jbGllbnRYOwogICAgbW91c2Vk b3dueSA9IGV4cG9ydHMuZXZlbnQuY2xpZW50WTsKICAgIGdlc3R1cmUoInN0YXJ0Iik7CiAgfQoK ICBmdW5jdGlvbiBtb3VzZW1vdmVkKCkgewogICAgbm9ldmVudCgpOwogICAgaWYgKCFtb3VzZW1v dmluZykgewogICAgICB2YXIgZHggPSBleHBvcnRzLmV2ZW50LmNsaWVudFggLSBtb3VzZWRvd254 LCBkeSA9IGV4cG9ydHMuZXZlbnQuY2xpZW50WSAtIG1vdXNlZG93bnk7CiAgICAgIG1vdXNlbW92 aW5nID0gZHggKiBkeCArIGR5ICogZHkgPiBjbGlja0Rpc3RhbmNlMjsKICAgIH0KICAgIGdlc3R1 cmVzLm1vdXNlKCJkcmFnIik7CiAgfQoKICBmdW5jdGlvbiBtb3VzZXVwcGVkKCkgewogICAgc2Vs ZWN0KGV4cG9ydHMuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS5kcmFnIG1vdXNldXAuZHJhZyIs IG51bGwpOwogICAgeWVzZHJhZyhleHBvcnRzLmV2ZW50LnZpZXcsIG1vdXNlbW92aW5nKTsKICAg IG5vZXZlbnQoKTsKICAgIGdlc3R1cmVzLm1vdXNlKCJlbmQiKTsKICB9CgogIGZ1bmN0aW9uIHRv dWNoc3RhcnRlZCgpIHsKICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJl dHVybjsKICAgIHZhciB0b3VjaGVzID0gZXhwb3J0cy5ldmVudC5jaGFuZ2VkVG91Y2hlcywKICAg ICAgICBjID0gY29udGFpbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgbiA9IHRv dWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsK ICAgICAgaWYgKGdlc3R1cmUgPSBiZWZvcmVzdGFydCh0b3VjaGVzW2ldLmlkZW50aWZpZXIsIGMs IHRvdWNoLCB0aGlzLCBhcmd1bWVudHMpKSB7CiAgICAgICAgbm9wcm9wYWdhdGlvbigpOwogICAg ICAgIGdlc3R1cmUoInN0YXJ0Iik7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHRvdWNo bW92ZWQoKSB7CiAgICB2YXIgdG91Y2hlcyA9IGV4cG9ydHMuZXZlbnQuY2hhbmdlZFRvdWNoZXMs CiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlOwoKICAgIGZvciAoaSA9IDA7 IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaGVzW2ldLmlk ZW50aWZpZXJdKSB7CiAgICAgICAgbm9ldmVudCgpOwogICAgICAgIGdlc3R1cmUoImRyYWciKTsK ICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gdG91Y2hlbmRlZCgpIHsKICAgIHZhciB0b3Vj aGVzID0gZXhwb3J0cy5ldmVudC5jaGFuZ2VkVG91Y2hlcywKICAgICAgICBuID0gdG91Y2hlcy5s ZW5ndGgsIGksIGdlc3R1cmU7CgogICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91 Y2hlbmRpbmcpOwogICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3Vj aGVuZGluZyA9IG51bGw7IH0sIDUwMCk7IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCEKICAg IGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0 b3VjaGVzW2ldLmlkZW50aWZpZXJdKSB7CiAgICAgICAgbm9wcm9wYWdhdGlvbigpOwogICAgICAg IGdlc3R1cmUoImVuZCIpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBiZWZvcmVzdGFy dChpZCwgY29udGFpbmVyLCBwb2ludCwgdGhhdCwgYXJncykgewogICAgdmFyIHAgPSBwb2ludChj b250YWluZXIsIGlkKSwgcywgZHgsIGR5LAogICAgICAgIHN1Ymxpc3RlbmVycyA9IGxpc3RlbmVy cy5jb3B5KCk7CgogICAgaWYgKCFjdXN0b21FdmVudChuZXcgRHJhZ0V2ZW50KGRyYWcsICJiZWZv cmVzdGFydCIsIHMsIGlkLCBhY3RpdmUsIHBbMF0sIHBbMV0sIDAsIDAsIHN1Ymxpc3RlbmVycyks IGZ1bmN0aW9uKCkgewogICAgICBpZiAoKGV4cG9ydHMuZXZlbnQuc3ViamVjdCA9IHMgPSBzdWJq ZWN0LmFwcGx5KHRoYXQsIGFyZ3MpKSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIGR4ID0g cy54IC0gcFswXSB8fCAwOwogICAgICBkeSA9IHMueSAtIHBbMV0gfHwgMDsKICAgICAgcmV0dXJu IHRydWU7CiAgICB9KSkgcmV0dXJuOwoKICAgIHJldHVybiBmdW5jdGlvbiBnZXN0dXJlKHR5cGUp IHsKICAgICAgdmFyIHAwID0gcCwgbjsKICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2Fz ZSAic3RhcnQiOiBnZXN0dXJlc1tpZF0gPSBnZXN0dXJlLCBuID0gYWN0aXZlKys7IGJyZWFrOwog ICAgICAgIGNhc2UgImVuZCI6IGRlbGV0ZSBnZXN0dXJlc1tpZF0sIC0tYWN0aXZlOyAvLyBub2Jy ZWFrCiAgICAgICAgY2FzZSAiZHJhZyI6IHAgPSBwb2ludChjb250YWluZXIsIGlkKSwgbiA9IGFj dGl2ZTsgYnJlYWs7CiAgICAgIH0KICAgICAgY3VzdG9tRXZlbnQobmV3IERyYWdFdmVudChkcmFn LCB0eXBlLCBzLCBpZCwgbiwgcFswXSArIGR4LCBwWzFdICsgZHksIHBbMF0gLSBwMFswXSwgcFsx XSAtIHAwWzFdLCBzdWJsaXN0ZW5lcnMpLCBzdWJsaXN0ZW5lcnMuYXBwbHksIHN1Ymxpc3RlbmVy cywgW3R5cGUsIHRoYXQsIGFyZ3NdKTsKICAgIH07CiAgfQoKICBkcmFnLmZpbHRlciA9IGZ1bmN0 aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBf ID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDIoISFfKSwgZHJhZykgOiBmaWx0ZXI7CiAg fTsKCiAgZHJhZy5jb250YWluZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRz Lmxlbmd0aCA/IChjb250YWluZXIgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25z dGFudCQyKF8pLCBkcmFnKSA6IGNvbnRhaW5lcjsKICB9OwoKICBkcmFnLnN1YmplY3QgPSBmdW5j dGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdWJqZWN0ID0gdHlwZW9m IF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMihfKSwgZHJhZykgOiBzdWJqZWN0Owog IH07CgogIGRyYWcudG91Y2hhYmxlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50 cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29u c3RhbnQkMighIV8pLCBkcmFnKSA6IHRvdWNoYWJsZTsKICB9OwoKICBkcmFnLm9uID0gZnVuY3Rp b24oKSB7CiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1 bWVudHMpOwogICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyBkcmFnIDogdmFsdWU7CiAg fTsKCiAgZHJhZy5jbGlja0Rpc3RhbmNlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIGRyYWcpIDogTWF0 aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTsKICB9OwoKICByZXR1cm4gZHJhZzsKfQoKZnVuY3Rpb24g ZGVmaW5lKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHsKICBjb25zdHJ1Y3Rvci5w cm90b3R5cGUgPSBmYWN0b3J5LnByb3RvdHlwZSA9IHByb3RvdHlwZTsKICBwcm90b3R5cGUuY29u c3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKfQoKZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5p dGlvbikgewogIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUp OwogIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRp b25ba2V5XTsKICByZXR1cm4gcHJvdG90eXBlOwp9CgpmdW5jdGlvbiBDb2xvcigpIHt9Cgp2YXIg ZGFya2VyID0gMC43Owp2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyOwoKdmFyIHJlSSA9ICJcXHMq KFsrLV0/XFxkKylcXHMqIiwKICAgIHJlTiA9ICJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VF XVsrLV0/XFxkKyk/KVxccyoiLAogICAgcmVQID0gIlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpb ZUVdWystXT9cXGQrKT8pJVxccyoiLAogICAgcmVIZXggPSAvXiMoWzAtOWEtZl17Myw4fSkkLywK ICAgIHJlUmdiSW50ZWdlciA9IG5ldyBSZWdFeHAoIl5yZ2JcXCgiICsgW3JlSSwgcmVJLCByZUld ICsgIlxcKSQiKSwKICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5yZ2JcXCgiICsgW3Jl UCwgcmVQLCByZVBdICsgIlxcKSQiKSwKICAgIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKCJe cmdiYVxcKCIgKyBbcmVJLCByZUksIHJlSSwgcmVOXSArICJcXCkkIiksCiAgICByZVJnYmFQZXJj ZW50ID0gbmV3IFJlZ0V4cCgiXnJnYmFcXCgiICsgW3JlUCwgcmVQLCByZVAsIHJlTl0gKyAiXFwp JCIpLAogICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cCgiXmhzbFxcKCIgKyBbcmVOLCByZVAs IHJlUF0gKyAiXFwpJCIpLAogICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5oc2xhXFwo IiArIFtyZU4sIHJlUCwgcmVQLCByZU5dICsgIlxcKSQiKTsKCnZhciBuYW1lZCA9IHsKICBhbGlj ZWJsdWU6IDB4ZjBmOGZmLAogIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsCiAgYXF1YTogMHgwMGZm ZmYsCiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsCiAgYXp1cmU6IDB4ZjBmZmZmLAogIGJlaWdlOiAw eGY1ZjVkYywKICBiaXNxdWU6IDB4ZmZlNGM0LAogIGJsYWNrOiAweDAwMDAwMCwKICBibGFuY2hl ZGFsbW9uZDogMHhmZmViY2QsCiAgYmx1ZTogMHgwMDAwZmYsCiAgYmx1ZXZpb2xldDogMHg4YTJi ZTIsCiAgYnJvd246IDB4YTUyYTJhLAogIGJ1cmx5d29vZDogMHhkZWI4ODcsCiAgY2FkZXRibHVl OiAweDVmOWVhMCwKICBjaGFydHJldXNlOiAweDdmZmYwMCwKICBjaG9jb2xhdGU6IDB4ZDI2OTFl LAogIGNvcmFsOiAweGZmN2Y1MCwKICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsCiAgY29ybnNp bGs6IDB4ZmZmOGRjLAogIGNyaW1zb246IDB4ZGMxNDNjLAogIGN5YW46IDB4MDBmZmZmLAogIGRh cmtibHVlOiAweDAwMDA4YiwKICBkYXJrY3lhbjogMHgwMDhiOGIsCiAgZGFya2dvbGRlbnJvZDog MHhiODg2MGIsCiAgZGFya2dyYXk6IDB4YTlhOWE5LAogIGRhcmtncmVlbjogMHgwMDY0MDAsCiAg ZGFya2dyZXk6IDB4YTlhOWE5LAogIGRhcmtraGFraTogMHhiZGI3NmIsCiAgZGFya21hZ2VudGE6 IDB4OGIwMDhiLAogIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZiwKICBkYXJrb3JhbmdlOiAweGZm OGMwMCwKICBkYXJrb3JjaGlkOiAweDk5MzJjYywKICBkYXJrcmVkOiAweDhiMDAwMCwKICBkYXJr c2FsbW9uOiAweGU5OTY3YSwKICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLAogIGRhcmtzbGF0ZWJs dWU6IDB4NDgzZDhiLAogIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLAogIGRhcmtzbGF0ZWdyZXk6 IDB4MmY0ZjRmLAogIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLAogIGRhcmt2aW9sZXQ6IDB4OTQw MGQzLAogIGRlZXBwaW5rOiAweGZmMTQ5MywKICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsCiAgZGlt Z3JheTogMHg2OTY5NjksCiAgZGltZ3JleTogMHg2OTY5NjksCiAgZG9kZ2VyYmx1ZTogMHgxZTkw ZmYsCiAgZmlyZWJyaWNrOiAweGIyMjIyMiwKICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsCiAgZm9y ZXN0Z3JlZW46IDB4MjI4YjIyLAogIGZ1Y2hzaWE6IDB4ZmYwMGZmLAogIGdhaW5zYm9ybzogMHhk Y2RjZGMsCiAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsCiAgZ29sZDogMHhmZmQ3MDAsCiAgZ29sZGVu cm9kOiAweGRhYTUyMCwKICBncmF5OiAweDgwODA4MCwKICBncmVlbjogMHgwMDgwMDAsCiAgZ3Jl ZW55ZWxsb3c6IDB4YWRmZjJmLAogIGdyZXk6IDB4ODA4MDgwLAogIGhvbmV5ZGV3OiAweGYwZmZm MCwKICBob3RwaW5rOiAweGZmNjliNCwKICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLAogIGluZGlnbzog MHg0YjAwODIsCiAgaXZvcnk6IDB4ZmZmZmYwLAogIGtoYWtpOiAweGYwZTY4YywKICBsYXZlbmRl cjogMHhlNmU2ZmEsCiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsCiAgbGF3bmdyZWVuOiAweDdj ZmMwMCwKICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLAogIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsCiAg bGlnaHRjb3JhbDogMHhmMDgwODAsCiAgbGlnaHRjeWFuOiAweGUwZmZmZiwKICBsaWdodGdvbGRl bnJvZHllbGxvdzogMHhmYWZhZDIsCiAgbGlnaHRncmF5OiAweGQzZDNkMywKICBsaWdodGdyZWVu OiAweDkwZWU5MCwKICBsaWdodGdyZXk6IDB4ZDNkM2QzLAogIGxpZ2h0cGluazogMHhmZmI2YzEs CiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLAogIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLAogIGxp Z2h0c2t5Ymx1ZTogMHg4N2NlZmEsCiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LAogIGxpZ2h0 c2xhdGVncmV5OiAweDc3ODg5OSwKICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsCiAgbGlnaHR5 ZWxsb3c6IDB4ZmZmZmUwLAogIGxpbWU6IDB4MDBmZjAwLAogIGxpbWVncmVlbjogMHgzMmNkMzIs CiAgbGluZW46IDB4ZmFmMGU2LAogIG1hZ2VudGE6IDB4ZmYwMGZmLAogIG1hcm9vbjogMHg4MDAw MDAsCiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsCiAgbWVkaXVtYmx1ZTogMHgwMDAwY2Qs CiAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMywKICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLAogIG1l ZGl1bXNlYWdyZWVuOiAweDNjYjM3MSwKICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLAogIG1l ZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSwKICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLAog IG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsCiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCwKICBt aW50Y3JlYW06IDB4ZjVmZmZhLAogIG1pc3R5cm9zZTogMHhmZmU0ZTEsCiAgbW9jY2FzaW46IDB4 ZmZlNGI1LAogIG5hdmFqb3doaXRlOiAweGZmZGVhZCwKICBuYXZ5OiAweDAwMDA4MCwKICBvbGRs YWNlOiAweGZkZjVlNiwKICBvbGl2ZTogMHg4MDgwMDAsCiAgb2xpdmVkcmFiOiAweDZiOGUyMywK ICBvcmFuZ2U6IDB4ZmZhNTAwLAogIG9yYW5nZXJlZDogMHhmZjQ1MDAsCiAgb3JjaGlkOiAweGRh NzBkNiwKICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSwKICBwYWxlZ3JlZW46IDB4OThmYjk4LAog IHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLAogIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLAogIHBh cGF5YXdoaXA6IDB4ZmZlZmQ1LAogIHBlYWNocHVmZjogMHhmZmRhYjksCiAgcGVydTogMHhjZDg1 M2YsCiAgcGluazogMHhmZmMwY2IsCiAgcGx1bTogMHhkZGEwZGQsCiAgcG93ZGVyYmx1ZTogMHhi MGUwZTYsCiAgcHVycGxlOiAweDgwMDA4MCwKICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSwKICBy ZWQ6IDB4ZmYwMDAwLAogIHJvc3licm93bjogMHhiYzhmOGYsCiAgcm95YWxibHVlOiAweDQxNjll MSwKICBzYWRkbGVicm93bjogMHg4YjQ1MTMsCiAgc2FsbW9uOiAweGZhODA3MiwKICBzYW5keWJy b3duOiAweGY0YTQ2MCwKICBzZWFncmVlbjogMHgyZThiNTcsCiAgc2Vhc2hlbGw6IDB4ZmZmNWVl LAogIHNpZW5uYTogMHhhMDUyMmQsCiAgc2lsdmVyOiAweGMwYzBjMCwKICBza3libHVlOiAweDg3 Y2VlYiwKICBzbGF0ZWJsdWU6IDB4NmE1YWNkLAogIHNsYXRlZ3JheTogMHg3MDgwOTAsCiAgc2xh dGVncmV5OiAweDcwODA5MCwKICBzbm93OiAweGZmZmFmYSwKICBzcHJpbmdncmVlbjogMHgwMGZm N2YsCiAgc3RlZWxibHVlOiAweDQ2ODJiNCwKICB0YW46IDB4ZDJiNDhjLAogIHRlYWw6IDB4MDA4 MDgwLAogIHRoaXN0bGU6IDB4ZDhiZmQ4LAogIHRvbWF0bzogMHhmZjYzNDcsCiAgdHVycXVvaXNl OiAweDQwZTBkMCwKICB2aW9sZXQ6IDB4ZWU4MmVlLAogIHdoZWF0OiAweGY1ZGViMywKICB3aGl0 ZTogMHhmZmZmZmYsCiAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsCiAgeWVsbG93OiAweGZmZmYwMCwK ICB5ZWxsb3dncmVlbjogMHg5YWNkMzIKfTsKCmRlZmluZShDb2xvciwgY29sb3IsIHsKICBjb3B5 OiBmdW5jdGlvbihjaGFubmVscykgewogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMu Y29uc3RydWN0b3IsIHRoaXMsIGNoYW5uZWxzKTsKICB9LAogIGRpc3BsYXlhYmxlOiBmdW5jdGlv bigpIHsKICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7CiAgfSwKICBoZXg6IGNv bG9yX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC4KICBmb3Jt YXRIZXg6IGNvbG9yX2Zvcm1hdEhleCwKICBmb3JtYXRIc2w6IGNvbG9yX2Zvcm1hdEhzbCwKICBm b3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYiwKICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiCn0p OwoKZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkgewogIHJldHVybiB0aGlzLnJnYigpLmZvcm1h dEhleCgpOwp9CgpmdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7CiAgcmV0dXJuIGhzbENvbnZl cnQodGhpcykuZm9ybWF0SHNsKCk7Cn0KCmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHsKICBy ZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKTsKfQoKZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7 CiAgdmFyIG0sIGw7CiAgZm9ybWF0ID0gKGZvcm1hdCArICIiKS50cmltKCkudG9Mb3dlckNhc2Uo KTsKICByZXR1cm4gKG0gPSByZUhleC5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwg bSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4obSkgLy8gI2ZmMDAwMAogICAg ICA6IGwgPT09IDMgPyBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAo bSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4Ziks IDEpIC8vICNmMDAKICAgICAgOiBsID09PSA4ID8gcmdiYShtID4+IDI0ICYgMHhmZiwgbSA+PiAx NiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDAK ICAgICAgOiBsID09PSA0ID8gcmdiYSgobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCks IChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYg MHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwCiAg ICAgIDogbnVsbCkgLy8gaW52YWxpZCBoZXgKICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVj KGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAw KQogICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0g KiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJn YigxMDAlLCAwJSwgMCUpCiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkg PyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKQogICAg ICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8g MTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAw JSwgMCUsIDAlLCAxKQogICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBo c2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAl KQogICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBt WzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpCiAg ICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkg Ly8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMKICAgICAgOiBmb3Jt YXQgPT09ICJ0cmFuc3BhcmVudCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApCiAgICAgIDog bnVsbDsKfQoKZnVuY3Rpb24gcmdibihuKSB7CiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4 ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTsKfQoKZnVuY3Rpb24gcmdiYShyLCBnLCBi LCBhKSB7CiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOOwogIHJldHVybiBuZXcgUmdiKHIs IGcsIGIsIGEpOwp9CgpmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHsKICBpZiAoIShvIGluc3RhbmNl b2YgQ29sb3IpKSBvID0gY29sb3Iobyk7CiAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjsKICBvID0g by5yZ2IoKTsKICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpOwp9Cgpm dW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3Ro ID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxs ID8gMSA6IG9wYWNpdHkpOwp9CgpmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkgewogIHRo aXMuciA9ICtyOwogIHRoaXMuZyA9ICtnOwogIHRoaXMuYiA9ICtiOwogIHRoaXMub3BhY2l0eSA9 ICtvcGFjaXR5Owp9CgpkZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwgewogIGJyaWdodGVy OiBmdW5jdGlvbihrKSB7CiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhi cmlnaHRlciwgayk7CiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0 aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogIH0sCiAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAg ICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsKICAgIHJldHVy biBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0 eSk7CiAgfSwKICByZ2I6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSwKICBkaXNw bGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMu ciA8IDI1NS41KQogICAgICAgICYmICgtMC41IDw9IHRoaXMuZyAmJiB0aGlzLmcgPCAyNTUuNSkK ICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmIgJiYgdGhpcy5iIDwgMjU1LjUpCiAgICAgICAgJiYg KDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTsKICB9LAogIGhleDogcmdi X2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC4KICBmb3JtYXRI ZXg6IHJnYl9mb3JtYXRIZXgsCiAgZm9ybWF0UmdiOiByZ2JfZm9ybWF0UmdiLAogIHRvU3RyaW5n OiByZ2JfZm9ybWF0UmdiCn0pKTsKCmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7CiAgcmV0dXJu ICIjIiArIGhleCh0aGlzLnIpICsgaGV4KHRoaXMuZykgKyBoZXgodGhpcy5iKTsKfQoKZnVuY3Rp b24gcmdiX2Zvcm1hdFJnYigpIHsKICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEp ID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTsKICByZXR1cm4gKGEgPT09IDEgPyAi cmdiKCIgOiAicmdiYSgiKQogICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5y b3VuZCh0aGlzLnIpIHx8IDApKSArICIsICIKICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigy NTUsIE1hdGgucm91bmQodGhpcy5nKSB8fCAwKSkgKyAiLCAiCiAgICAgICsgTWF0aC5tYXgoMCwg TWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuYikgfHwgMCkpCiAgICAgICsgKGEgPT09IDEg PyAiKSIgOiAiLCAiICsgYSArICIpIik7Cn0KCmZ1bmN0aW9uIGhleCh2YWx1ZSkgewogIHZhbHVl ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7CiAg cmV0dXJuICh2YWx1ZSA8IDE2ID8gIjAiIDogIiIpICsgdmFsdWUudG9TdHJpbmcoMTYpOwp9Cgpm dW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHsKICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47 CiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47CiAgZWxzZSBpZiAocyA8 PSAwKSBoID0gTmFOOwogIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpOwp9CgpmdW5jdGlvbiBo c2xDb252ZXJ0KG8pIHsKICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5o LCBvLnMsIG8ubCwgby5vcGFjaXR5KTsKICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0g Y29sb3Iobyk7CiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDsKICBpZiAobyBpbnN0YW5jZW9mIEhz bCkgcmV0dXJuIG87CiAgbyA9IG8ucmdiKCk7CiAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgIGcg PSBvLmcgLyAyNTUsCiAgICAgIGIgPSBvLmIgLyAyNTUsCiAgICAgIG1pbiA9IE1hdGgubWluKHIs IGcsIGIpLAogICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwKICAgICAgaCA9IE5hTiwKICAg ICAgcyA9IG1heCAtIG1pbiwKICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjsKICBpZiAocykgewog ICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7CiAgICBlbHNl IGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7CiAgICBlbHNlIGggPSAociAtIGcp IC8gcyArIDQ7CiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluOwog ICAgaCAqPSA2MDsKICB9IGVsc2UgewogICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7CiAg fQogIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7Cn0KCmZ1bmN0aW9uIGhzbCho LCBzLCBsLCBvcGFjaXR5KSB7CiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xD b252ZXJ0KGgpIDogbmV3IEhzbChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0 eSk7Cn0KCmZ1bmN0aW9uIEhzbChoLCBzLCBsLCBvcGFjaXR5KSB7CiAgdGhpcy5oID0gK2g7CiAg dGhpcy5zID0gK3M7CiAgdGhpcy5sID0gK2w7CiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7Cn0K CmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7CiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGsp IHsKICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTsK ICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNp dHkpOwogIH0sCiAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICBrID0gayA9PSBudWxsID8gZGFy a2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsKICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhp cy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogIH0sCiAgcmdiOiBmdW5jdGlvbigpIHsK ICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLAogICAgICAgIHMg PSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucywKICAgICAgICBsID0gdGhp cy5sLAogICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsCiAgICAgICAg bTEgPSAyICogbCAtIG0yOwogICAgcmV0dXJuIG5ldyBSZ2IoCiAgICAgIGhzbDJyZ2IoaCA+PSAy NDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSwKICAgICAgaHNsMnJnYihoLCBtMSwgbTIp LAogICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSwKICAg ICAgdGhpcy5vcGFjaXR5CiAgICApOwogIH0sCiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewog ICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKQog ICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSkKICAgICAgICAmJiAoMCA8PSB0 aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpOwogIH0sCiAgZm9ybWF0SHNsOiBmdW5j dGlvbigpIHsKICAgIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0 aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpOwogICAgcmV0dXJuIChhID09PSAxID8gImhzbCgiIDog ImhzbGEoIikKICAgICAgICArICh0aGlzLmggfHwgMCkgKyAiLCAiCiAgICAgICAgKyAodGhpcy5z IHx8IDApICogMTAwICsgIiUsICIKICAgICAgICArICh0aGlzLmwgfHwgMCkgKiAxMDAgKyAiJSIK ICAgICAgICArIChhID09PSAxID8gIikiIDogIiwgIiArIGEgKyAiKSIpOwogIH0KfSkpOwoKLyog RnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqLwpmdW5jdGlvbiBoc2wy cmdiKGgsIG0xLCBtMikgewogIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8g NjAKICAgICAgOiBoIDwgMTgwID8gbTIKICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkg KiAoMjQwIC0gaCkgLyA2MAogICAgICA6IG0xKSAqIDI1NTsKfQoKdmFyIGRlZzJyYWQgPSBNYXRo LlBJIC8gMTgwOwp2YXIgcmFkMmRlZyA9IDE4MCAvIE1hdGguUEk7CgovLyBodHRwczovL29ic2Vy dmFibGVocS5jb20vQG1ib3N0b2NrL2xhYi1hbmQtcmdiCnZhciBLID0gMTgsCiAgICBYbiA9IDAu OTY0MjIsCiAgICBZbiA9IDEsCiAgICBabiA9IDAuODI1MjEsCiAgICB0MCA9IDQgLyAyOSwKICAg IHQxID0gNiAvIDI5LAogICAgdDIgPSAzICogdDEgKiB0MSwKICAgIHQzID0gdDEgKiB0MSAqIHQx OwoKZnVuY3Rpb24gbGFiQ29udmVydChvKSB7CiAgaWYgKG8gaW5zdGFuY2VvZiBMYWIpIHJldHVy biBuZXcgTGFiKG8ubCwgby5hLCBvLmIsIG8ub3BhY2l0eSk7CiAgaWYgKG8gaW5zdGFuY2VvZiBI Y2wpIHJldHVybiBoY2wybGFiKG8pOwogIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IpKSBvID0gcmdi Q29udmVydChvKTsKICB2YXIgciA9IHJnYjJscmdiKG8uciksCiAgICAgIGcgPSByZ2IybHJnYihv LmcpLAogICAgICBiID0gcmdiMmxyZ2Ioby5iKSwKICAgICAgeSA9IHh5ejJsYWIoKDAuMjIyNTA0 NSAqIHIgKyAwLjcxNjg3ODYgKiBnICsgMC4wNjA2MTY5ICogYikgLyBZbiksIHgsIHo7CiAgaWYg KHIgPT09IGcgJiYgZyA9PT0gYikgeCA9IHogPSB5OyBlbHNlIHsKICAgIHggPSB4eXoybGFiKCgw LjQzNjA3NDcgKiByICsgMC4zODUwNjQ5ICogZyArIDAuMTQzMDgwNCAqIGIpIC8gWG4pOwogICAg eiA9IHh5ejJsYWIoKDAuMDEzOTMyMiAqIHIgKyAwLjA5NzEwNDUgKiBnICsgMC43MTQxNzMzICog YikgLyBabik7CiAgfQogIHJldHVybiBuZXcgTGFiKDExNiAqIHkgLSAxNiwgNTAwICogKHggLSB5 KSwgMjAwICogKHkgLSB6KSwgby5vcGFjaXR5KTsKfQoKZnVuY3Rpb24gZ3JheShsLCBvcGFjaXR5 KSB7CiAgcmV0dXJuIG5ldyBMYWIobCwgMCwgMCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNp dHkpOwp9CgpmdW5jdGlvbiBsYWIobCwgYSwgYiwgb3BhY2l0eSkgewogIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID09PSAxID8gbGFiQ29udmVydChsKSA6IG5ldyBMYWIobCwgYSwgYiwgb3BhY2l0 eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwp9CgpmdW5jdGlvbiBMYWIobCwgYSwgYiwgb3BhY2l0 eSkgewogIHRoaXMubCA9ICtsOwogIHRoaXMuYSA9ICthOwogIHRoaXMuYiA9ICtiOwogIHRoaXMu b3BhY2l0eSA9ICtvcGFjaXR5Owp9CgpkZWZpbmUoTGFiLCBsYWIsIGV4dGVuZChDb2xvciwgewog IGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICByZXR1cm4gbmV3IExhYih0aGlzLmwgKyBLICog KGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5hLCB0aGlzLmIsIHRoaXMub3BhY2l0eSk7CiAgfSwK ICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsKICAgIHJldHVybiBuZXcgTGFiKHRoaXMubCAtIEsgKiAo ayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsKICB9LAog IHJnYjogZnVuY3Rpb24oKSB7CiAgICB2YXIgeSA9ICh0aGlzLmwgKyAxNikgLyAxMTYsCiAgICAg ICAgeCA9IGlzTmFOKHRoaXMuYSkgPyB5IDogeSArIHRoaXMuYSAvIDUwMCwKICAgICAgICB6ID0g aXNOYU4odGhpcy5iKSA/IHkgOiB5IC0gdGhpcy5iIC8gMjAwOwogICAgeCA9IFhuICogbGFiMnh5 eih4KTsKICAgIHkgPSBZbiAqIGxhYjJ4eXooeSk7CiAgICB6ID0gWm4gKiBsYWIyeHl6KHopOwog ICAgcmV0dXJuIG5ldyBSZ2IoCiAgICAgIGxyZ2IycmdiKCAzLjEzMzg1NjEgKiB4IC0gMS42MTY4 NjY3ICogeSAtIDAuNDkwNjE0NiAqIHopLAogICAgICBscmdiMnJnYigtMC45Nzg3Njg0ICogeCAr IDEuOTE2MTQxNSAqIHkgKyAwLjAzMzQ1NDAgKiB6KSwKICAgICAgbHJnYjJyZ2IoIDAuMDcxOTQ1 MyAqIHggLSAwLjIyODk5MTQgKiB5ICsgMS40MDUyNDI3ICogeiksCiAgICAgIHRoaXMub3BhY2l0 eQogICAgKTsKICB9Cn0pKTsKCmZ1bmN0aW9uIHh5ejJsYWIodCkgewogIHJldHVybiB0ID4gdDMg PyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIgKyB0MDsKfQoKZnVuY3Rpb24gbGFiMnh5eih0 KSB7CiAgcmV0dXJuIHQgPiB0MSA/IHQgKiB0ICogdCA6IHQyICogKHQgLSB0MCk7Cn0KCmZ1bmN0 aW9uIGxyZ2IycmdiKHgpIHsKICByZXR1cm4gMjU1ICogKHggPD0gMC4wMDMxMzA4ID8gMTIuOTIg KiB4IDogMS4wNTUgKiBNYXRoLnBvdyh4LCAxIC8gMi40KSAtIDAuMDU1KTsKfQoKZnVuY3Rpb24g cmdiMmxyZ2IoeCkgewogIHJldHVybiAoeCAvPSAyNTUpIDw9IDAuMDQwNDUgPyB4IC8gMTIuOTIg OiBNYXRoLnBvdygoeCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpOwp9CgpmdW5jdGlvbiBoY2xDb252 ZXJ0KG8pIHsKICBpZiAobyBpbnN0YW5jZW9mIEhjbCkgcmV0dXJuIG5ldyBIY2woby5oLCBvLmMs IG8ubCwgby5vcGFjaXR5KTsKICBpZiAoIShvIGluc3RhbmNlb2YgTGFiKSkgbyA9IGxhYkNvbnZl cnQobyk7CiAgaWYgKG8uYSA9PT0gMCAmJiBvLmIgPT09IDApIHJldHVybiBuZXcgSGNsKE5hTiwg MCA8IG8ubCAmJiBvLmwgPCAxMDAgPyAwIDogTmFOLCBvLmwsIG8ub3BhY2l0eSk7CiAgdmFyIGgg PSBNYXRoLmF0YW4yKG8uYiwgby5hKSAqIHJhZDJkZWc7CiAgcmV0dXJuIG5ldyBIY2woaCA8IDAg PyBoICsgMzYwIDogaCwgTWF0aC5zcXJ0KG8uYSAqIG8uYSArIG8uYiAqIG8uYiksIG8ubCwgby5v cGFjaXR5KTsKfQoKZnVuY3Rpb24gbGNoKGwsIGMsIGgsIG9wYWNpdHkpIHsKICByZXR1cm4gYXJn dW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQobCkgOiBuZXcgSGNsKGgsIGMsIGwsIG9w YWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKfQoKZnVuY3Rpb24gaGNsKGgsIGMsIGwsIG9w YWNpdHkpIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQoaCkg OiBuZXcgSGNsKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKfQoKZnVu Y3Rpb24gSGNsKGgsIGMsIGwsIG9wYWNpdHkpIHsKICB0aGlzLmggPSAraDsKICB0aGlzLmMgPSAr YzsKICB0aGlzLmwgPSArbDsKICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKfQoKZnVuY3Rpb24g aGNsMmxhYihvKSB7CiAgaWYgKGlzTmFOKG8uaCkpIHJldHVybiBuZXcgTGFiKG8ubCwgMCwgMCwg by5vcGFjaXR5KTsKICB2YXIgaCA9IG8uaCAqIGRlZzJyYWQ7CiAgcmV0dXJuIG5ldyBMYWIoby5s LCBNYXRoLmNvcyhoKSAqIG8uYywgTWF0aC5zaW4oaCkgKiBvLmMsIG8ub3BhY2l0eSk7Cn0KCmRl ZmluZShIY2wsIGhjbCwgZXh0ZW5kKENvbG9yLCB7CiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsK ICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgKyBLICogKGsgPT0gbnVs bCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTsKICB9LAogIGRhcmtlcjogZnVuY3Rpb24oaykgewog ICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCAtIEsgKiAoayA9PSBudWxs ID8gMSA6IGspLCB0aGlzLm9wYWNpdHkpOwogIH0sCiAgcmdiOiBmdW5jdGlvbigpIHsKICAgIHJl dHVybiBoY2wybGFiKHRoaXMpLnJnYigpOwogIH0KfSkpOwoKdmFyIEEgPSAtMC4xNDg2MSwKICAg IEIgPSArMS43ODI3NywKICAgIEMgPSAtMC4yOTIyNywKICAgIEQgPSAtMC45MDY0OSwKICAgIEUg PSArMS45NzI5NCwKICAgIEVEID0gRSAqIEQsCiAgICBFQiA9IEUgKiBCLAogICAgQkNfREEgPSBC ICogQyAtIEQgKiBBOwoKZnVuY3Rpb24gY3ViZWhlbGl4Q29udmVydChvKSB7CiAgaWYgKG8gaW5z dGFuY2VvZiBDdWJlaGVsaXgpIHJldHVybiBuZXcgQ3ViZWhlbGl4KG8uaCwgby5zLCBvLmwsIG8u b3BhY2l0eSk7CiAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYikpIG8gPSByZ2JDb252ZXJ0KG8pOwog IHZhciByID0gby5yIC8gMjU1LAogICAgICBnID0gby5nIC8gMjU1LAogICAgICBiID0gby5iIC8g MjU1LAogICAgICBsID0gKEJDX0RBICogYiArIEVEICogciAtIEVCICogZykgLyAoQkNfREEgKyBF RCAtIEVCKSwKICAgICAgYmwgPSBiIC0gbCwKICAgICAgayA9IChFICogKGcgLSBsKSAtIEMgKiBi bCkgLyBELAogICAgICBzID0gTWF0aC5zcXJ0KGsgKiBrICsgYmwgKiBibCkgLyAoRSAqIGwgKiAo MSAtIGwpKSwgLy8gTmFOIGlmIGw9MCBvciBsPTEKICAgICAgaCA9IHMgPyBNYXRoLmF0YW4yKGss IGJsKSAqIHJhZDJkZWcgLSAxMjAgOiBOYU47CiAgcmV0dXJuIG5ldyBDdWJlaGVsaXgoaCA8IDAg PyBoICsgMzYwIDogaCwgcywgbCwgby5vcGFjaXR5KTsKfQoKZnVuY3Rpb24gY3ViZWhlbGl4KGgs IHMsIGwsIG9wYWNpdHkpIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGN1YmVo ZWxpeENvbnZlcnQoaCkgOiBuZXcgQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/ IDEgOiBvcGFjaXR5KTsKfQoKZnVuY3Rpb24gQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkpIHsK ICB0aGlzLmggPSAraDsKICB0aGlzLnMgPSArczsKICB0aGlzLmwgPSArbDsKICB0aGlzLm9wYWNp dHkgPSArb3BhY2l0eTsKfQoKZGVmaW5lKEN1YmVoZWxpeCwgY3ViZWhlbGl4LCBleHRlbmQoQ29s b3IsIHsKICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgayA9IGsgPT0gbnVsbCA/IGJyaWdo dGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspOwogICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgodGhp cy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7CiAgfSwKICBkYXJrZXI6IGZ1 bmN0aW9uKGspIHsKICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIs IGspOwogICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGss IHRoaXMub3BhY2l0eSk7CiAgfSwKICByZ2I6IGZ1bmN0aW9uKCkgewogICAgdmFyIGggPSBpc05h Tih0aGlzLmgpID8gMCA6ICh0aGlzLmggKyAxMjApICogZGVnMnJhZCwKICAgICAgICBsID0gK3Ro aXMubCwKICAgICAgICBhID0gaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMgKiBsICogKDEgLSBs KSwKICAgICAgICBjb3NoID0gTWF0aC5jb3MoaCksCiAgICAgICAgc2luaCA9IE1hdGguc2luKGgp OwogICAgcmV0dXJuIG5ldyBSZ2IoCiAgICAgIDI1NSAqIChsICsgYSAqIChBICogY29zaCArIEIg KiBzaW5oKSksCiAgICAgIDI1NSAqIChsICsgYSAqIChDICogY29zaCArIEQgKiBzaW5oKSksCiAg ICAgIDI1NSAqIChsICsgYSAqIChFICogY29zaCkpLAogICAgICB0aGlzLm9wYWNpdHkKICAgICk7 CiAgfQp9KSk7CgpmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHsKICB2YXIgdDIg PSB0MSAqIHQxLCB0MyA9IHQyICogdDE7CiAgcmV0dXJuICgoMSAtIDMgKiB0MSArIDMgKiB0MiAt IHQzKSAqIHYwCiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjEKICAgICAgKyAoMSAr IDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2MgogICAgICArIHQzICogdjMpIC8gNjsKfQoK ZnVuY3Rpb24gYmFzaXMkMSh2YWx1ZXMpIHsKICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxOwog IHJldHVybiBmdW5jdGlvbih0KSB7CiAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49 IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLAogICAgICAgIHYxID0gdmFs dWVzW2ldLAogICAgICAgIHYyID0gdmFsdWVzW2kgKyAxXSwKICAgICAgICB2MCA9IGkgPiAwID8g dmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLAogICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFs dWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxOwogICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICog biwgdjAsIHYxLCB2MiwgdjMpOwogIH07Cn0KCmZ1bmN0aW9uIGJhc2lzQ2xvc2VkKHZhbHVlcykg ewogIHZhciBuID0gdmFsdWVzLmxlbmd0aDsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgdmFy IGkgPSBNYXRoLmZsb29yKCgodCAlPSAxKSA8IDAgPyArK3QgOiB0KSAqIG4pLAogICAgICAgIHYw ID0gdmFsdWVzWyhpICsgbiAtIDEpICUgbl0sCiAgICAgICAgdjEgPSB2YWx1ZXNbaSAlIG5dLAog ICAgICAgIHYyID0gdmFsdWVzWyhpICsgMSkgJSBuXSwKICAgICAgICB2MyA9IHZhbHVlc1soaSAr IDIpICUgbl07CiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2 Myk7CiAgfTsKfQoKZnVuY3Rpb24gY29uc3RhbnQkMyh4KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkg ewogICAgcmV0dXJuIHg7CiAgfTsKfQoKZnVuY3Rpb24gbGluZWFyKGEsIGQpIHsKICByZXR1cm4g ZnVuY3Rpb24odCkgewogICAgcmV0dXJuIGEgKyB0ICogZDsKICB9Owp9CgpmdW5jdGlvbiBleHBv bmVudGlhbChhLCBiLCB5KSB7CiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgu cG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7CiAgICByZXR1cm4gTWF0aC5w b3coYSArIHQgKiBiLCB5KTsKICB9Owp9CgpmdW5jdGlvbiBodWUoYSwgYikgewogIHZhciBkID0g YiAtIGE7CiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAz NjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudCQzKGlzTmFOKGEpID8gYiA6 IGEpOwp9CgpmdW5jdGlvbiBnYW1tYSh5KSB7CiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9n YW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEs IGIsIHkpIDogY29uc3RhbnQkMyhpc05hTihhKSA/IGIgOiBhKTsKICB9Owp9CgpmdW5jdGlvbiBu b2dhbW1hKGEsIGIpIHsKICB2YXIgZCA9IGIgLSBhOwogIHJldHVybiBkID8gbGluZWFyKGEsIGQp IDogY29uc3RhbnQkMyhpc05hTihhKSA/IGIgOiBhKTsKfQoKdmFyIGludGVycG9sYXRlUmdiID0g KGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHsKICB2YXIgY29sb3IgPSBnYW1tYSh5KTsKCiAgZnVuY3Rp b24gcmdiJDEoc3RhcnQsIGVuZCkgewogICAgdmFyIHIgPSBjb2xvcigoc3RhcnQgPSByZ2Ioc3Rh cnQpKS5yLCAoZW5kID0gcmdiKGVuZCkpLnIpLAogICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBl bmQuZyksCiAgICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSwKICAgICAgICBvcGFjaXR5 ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgICByZXR1cm4gZnVuY3Rp b24odCkgewogICAgICBzdGFydC5yID0gcih0KTsKICAgICAgc3RhcnQuZyA9IGcodCk7CiAgICAg IHN0YXJ0LmIgPSBiKHQpOwogICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsKICAgICAg cmV0dXJuIHN0YXJ0ICsgIiI7CiAgICB9OwogIH0KCiAgcmdiJDEuZ2FtbWEgPSByZ2JHYW1tYTsK CiAgcmV0dXJuIHJnYiQxOwp9KSgxKTsKCmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHsKICBy ZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7CiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsCiAgICAg ICAgciA9IG5ldyBBcnJheShuKSwKICAgICAgICBnID0gbmV3IEFycmF5KG4pLAogICAgICAgIGIg PSBuZXcgQXJyYXkobiksCiAgICAgICAgaSwgY29sb3I7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsg KytpKSB7CiAgICAgIGNvbG9yID0gcmdiKGNvbG9yc1tpXSk7CiAgICAgIHJbaV0gPSBjb2xvci5y IHx8IDA7CiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7CiAgICAgIGJbaV0gPSBjb2xvci5iIHx8 IDA7CiAgICB9CiAgICByID0gc3BsaW5lKHIpOwogICAgZyA9IHNwbGluZShnKTsKICAgIGIgPSBz cGxpbmUoYik7CiAgICBjb2xvci5vcGFjaXR5ID0gMTsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7 CiAgICAgIGNvbG9yLnIgPSByKHQpOwogICAgICBjb2xvci5nID0gZyh0KTsKICAgICAgY29sb3Iu YiA9IGIodCk7CiAgICAgIHJldHVybiBjb2xvciArICIiOwogICAgfTsKICB9Owp9Cgp2YXIgcmdi QmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMkMSk7CnZhciByZ2JCYXNpc0Nsb3NlZCA9IHJnYlNwbGlu ZShiYXNpc0Nsb3NlZCk7CgpmdW5jdGlvbiBudW1iZXJBcnJheShhLCBiKSB7CiAgaWYgKCFiKSBi ID0gW107CiAgdmFyIG4gPSBhID8gTWF0aC5taW4oYi5sZW5ndGgsIGEubGVuZ3RoKSA6IDAsCiAg ICAgIGMgPSBiLnNsaWNlKCksCiAgICAgIGk7CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIGZv ciAoaSA9IDA7IGkgPCBuOyArK2kpIGNbaV0gPSBhW2ldICogKDEgLSB0KSArIGJbaV0gKiB0Owog ICAgcmV0dXJuIGM7CiAgfTsKfQoKZnVuY3Rpb24gaXNOdW1iZXJBcnJheSh4KSB7CiAgcmV0dXJu IEFycmF5QnVmZmVyLmlzVmlldyh4KSAmJiAhKHggaW5zdGFuY2VvZiBEYXRhVmlldyk7Cn0KCmZ1 bmN0aW9uIGFycmF5JDEoYSwgYikgewogIHJldHVybiAoaXNOdW1iZXJBcnJheShiKSA/IG51bWJl ckFycmF5IDogZ2VuZXJpY0FycmF5KShhLCBiKTsKfQoKZnVuY3Rpb24gZ2VuZXJpY0FycmF5KGEs IGIpIHsKICB2YXIgbmIgPSBiID8gYi5sZW5ndGggOiAwLAogICAgICBuYSA9IGEgPyBNYXRoLm1p bihuYiwgYS5sZW5ndGgpIDogMCwKICAgICAgeCA9IG5ldyBBcnJheShuYSksCiAgICAgIGMgPSBu ZXcgQXJyYXkobmIpLAogICAgICBpOwoKICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgeFtpXSA9 IGludGVycG9sYXRlVmFsdWUoYVtpXSwgYltpXSk7CiAgZm9yICg7IGkgPCBuYjsgKytpKSBjW2ld ID0gYltpXTsKCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuYTsg KytpKSBjW2ldID0geFtpXSh0KTsKICAgIHJldHVybiBjOwogIH07Cn0KCmZ1bmN0aW9uIGRhdGUo YSwgYikgewogIHZhciBkID0gbmV3IERhdGU7CiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5j dGlvbih0KSB7CiAgICByZXR1cm4gZC5zZXRUaW1lKGEgKiAoMSAtIHQpICsgYiAqIHQpLCBkOwog IH07Cn0KCmZ1bmN0aW9uIGludGVycG9sYXRlTnVtYmVyKGEsIGIpIHsKICByZXR1cm4gYSA9ICth LCBiID0gK2IsIGZ1bmN0aW9uKHQpIHsKICAgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0Owog IH07Cn0KCmZ1bmN0aW9uIG9iamVjdChhLCBiKSB7CiAgdmFyIGkgPSB7fSwKICAgICAgYyA9IHt9 LAogICAgICBrOwoKICBpZiAoYSA9PT0gbnVsbCB8fCB0eXBlb2YgYSAhPT0gIm9iamVjdCIpIGEg PSB7fTsKICBpZiAoYiA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gIm9iamVjdCIpIGIgPSB7fTsK CiAgZm9yIChrIGluIGIpIHsKICAgIGlmIChrIGluIGEpIHsKICAgICAgaVtrXSA9IGludGVycG9s YXRlVmFsdWUoYVtrXSwgYltrXSk7CiAgICB9IGVsc2UgewogICAgICBjW2tdID0gYltrXTsKICAg IH0KICB9CgogIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICBmb3IgKGsgaW4gaSkgY1trXSA9IGlb a10odCk7CiAgICByZXR1cm4gYzsKICB9Owp9Cgp2YXIgcmVBID0gL1stK10/KD86XGQrXC4/XGQq fFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLAogICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291 cmNlLCAiZyIpOwoKZnVuY3Rpb24gemVybyhiKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAg cmV0dXJuIGI7CiAgfTsKfQoKZnVuY3Rpb24gb25lKGIpIHsKICByZXR1cm4gZnVuY3Rpb24odCkg ewogICAgcmV0dXJuIGIodCkgKyAiIjsKICB9Owp9CgpmdW5jdGlvbiBpbnRlcnBvbGF0ZVN0cmlu ZyhhLCBiKSB7CiAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAv LyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiCiAgICAgIGFtLCAvLyBjdXJyZW50IG1h dGNoIGluIGEKICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYgogICAgICBicywgLy8gc3Ry aW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnkKICAgICAgaSA9IC0xLCAv LyBpbmRleCBpbiBzCiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vo b2xkZXJzCiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKCiAgLy8gQ29lcmNl IGlucHV0cyB0byBzdHJpbmdzLgogIGEgPSBhICsgIiIsIGIgPSBiICsgIiI7CgogIC8vIEludGVy cG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuCiAgd2hpbGUgKChhbSA9IHJlQS5leGVj KGEpKQogICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHsKICAgIGlmICgoYnMgPSBibS5pbmRl eCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYgogICAg ICBicyA9IGIuc2xpY2UoYmksIGJzKTsKICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNv YWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICB9 CiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBh ICYgYiBtYXRjaAogICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBw cmV2aW91cyBzdHJpbmcKICAgICAgZWxzZSBzWysraV0gPSBibTsKICAgIH0gZWxzZSB7IC8vIGlu dGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzCiAgICAgIHNbKytpXSA9IG51bGw7CiAgICAg IHEucHVzaCh7aTogaSwgeDogaW50ZXJwb2xhdGVOdW1iZXIoYW0sIGJtKX0pOwogICAgfQogICAg YmkgPSByZUIubGFzdEluZGV4OwogIH0KCiAgLy8gQWRkIHJlbWFpbnMgb2YgYi4KICBpZiAoYmkg PCBiLmxlbmd0aCkgewogICAgYnMgPSBiLnNsaWNlKGJpKTsKICAgIGlmIChzW2ldKSBzW2ldICs9 IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgZWxzZSBzWysraV0gPSBi czsKICB9CgogIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNo LgogIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVq b2luIHRoZSBzdHJpbmcuCiAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IChxWzBdCiAgICAgID8gb25l KHFbMF0ueCkKICAgICAgOiB6ZXJvKGIpKQogICAgICA6IChiID0gcS5sZW5ndGgsIGZ1bmN0aW9u KHQpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtp XSkuaV0gPSBvLngodCk7CiAgICAgICAgICByZXR1cm4gcy5qb2luKCIiKTsKICAgICAgICB9KTsK fQoKZnVuY3Rpb24gaW50ZXJwb2xhdGVWYWx1ZShhLCBiKSB7CiAgdmFyIHQgPSB0eXBlb2YgYiwg YzsKICByZXR1cm4gYiA9PSBudWxsIHx8IHQgPT09ICJib29sZWFuIiA/IGNvbnN0YW50JDMoYikK ICAgICAgOiAodCA9PT0gIm51bWJlciIgPyBpbnRlcnBvbGF0ZU51bWJlcgogICAgICA6IHQgPT09 ICJzdHJpbmciID8gKChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYikgOiBp bnRlcnBvbGF0ZVN0cmluZykKICAgICAgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0 ZVJnYgogICAgICA6IGIgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZQogICAgICA6IGlzTnVtYmVyQXJy YXkoYikgPyBudW1iZXJBcnJheQogICAgICA6IEFycmF5LmlzQXJyYXkoYikgPyBnZW5lcmljQXJy YXkKICAgICAgOiB0eXBlb2YgYi52YWx1ZU9mICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBiLnRv U3RyaW5nICE9PSAiZnVuY3Rpb24iIHx8IGlzTmFOKGIpID8gb2JqZWN0CiAgICAgIDogaW50ZXJw b2xhdGVOdW1iZXIpKGEsIGIpOwp9CgpmdW5jdGlvbiBkaXNjcmV0ZShyYW5nZSkgewogIHZhciBu ID0gcmFuZ2UubGVuZ3RoOwogIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICByZXR1cm4gcmFuZ2Vb TWF0aC5tYXgoMCwgTWF0aC5taW4obiAtIDEsIE1hdGguZmxvb3IodCAqIG4pKSldOwogIH07Cn0K CmZ1bmN0aW9uIGh1ZSQxKGEsIGIpIHsKICB2YXIgaSA9IGh1ZSgrYSwgK2IpOwogIHJldHVybiBm dW5jdGlvbih0KSB7CiAgICB2YXIgeCA9IGkodCk7CiAgICByZXR1cm4geCAtIDM2MCAqIE1hdGgu Zmxvb3IoeCAvIDM2MCk7CiAgfTsKfQoKZnVuY3Rpb24gaW50ZXJwb2xhdGVSb3VuZChhLCBiKSB7 CiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7CiAgICByZXR1cm4gTWF0aC5y b3VuZChhICogKDEgLSB0KSArIGIgKiB0KTsKICB9Owp9Cgp2YXIgZGVncmVlcyA9IDE4MCAvIE1h dGguUEk7Cgp2YXIgaWRlbnRpdHkkMiA9IHsKICB0cmFuc2xhdGVYOiAwLAogIHRyYW5zbGF0ZVk6 IDAsCiAgcm90YXRlOiAwLAogIHNrZXdYOiAwLAogIHNjYWxlWDogMSwKICBzY2FsZVk6IDEKfTsK CmZ1bmN0aW9uIGRlY29tcG9zZShhLCBiLCBjLCBkLCBlLCBmKSB7CiAgdmFyIHNjYWxlWCwgc2Nh bGVZLCBza2V3WDsKICBpZiAoc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKSBhIC89 IHNjYWxlWCwgYiAvPSBzY2FsZVg7CiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBh ICogc2tld1gsIGQgLT0gYiAqIHNrZXdYOwogIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMg KyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZOwogIGlm IChhICogZCA8IGIgKiBjKSBhID0gLWEsIGIgPSAtYiwgc2tld1ggPSAtc2tld1gsIHNjYWxlWCA9 IC1zY2FsZVg7CiAgcmV0dXJuIHsKICAgIHRyYW5zbGF0ZVg6IGUsCiAgICB0cmFuc2xhdGVZOiBm LAogICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcywKICAgIHNrZXdYOiBNYXRo LmF0YW4oc2tld1gpICogZGVncmVlcywKICAgIHNjYWxlWDogc2NhbGVYLAogICAgc2NhbGVZOiBz Y2FsZVkKICB9Owp9Cgp2YXIgY3NzTm9kZSwKICAgIGNzc1Jvb3QsCiAgICBjc3NWaWV3LAogICAg c3ZnTm9kZTsKCmZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7CiAgaWYgKHZhbHVlID09PSAibm9u ZSIpIHJldHVybiBpZGVudGl0eSQyOwogIGlmICghY3NzTm9kZSkgY3NzTm9kZSA9IGRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoIkRJViIpLCBjc3NSb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50 LCBjc3NWaWV3ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc7CiAgY3NzTm9kZS5zdHlsZS50cmFuc2Zv cm0gPSB2YWx1ZTsKICB2YWx1ZSA9IGNzc1ZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShjc3NSb290LmFw cGVuZENoaWxkKGNzc05vZGUpLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKTsK ICBjc3NSb290LnJlbW92ZUNoaWxkKGNzc05vZGUpOwogIHZhbHVlID0gdmFsdWUuc2xpY2UoNywg LTEpLnNwbGl0KCIsIik7CiAgcmV0dXJuIGRlY29tcG9zZSgrdmFsdWVbMF0sICt2YWx1ZVsxXSwg K3ZhbHVlWzJdLCArdmFsdWVbM10sICt2YWx1ZVs0XSwgK3ZhbHVlWzVdKTsKfQoKZnVuY3Rpb24g cGFyc2VTdmcodmFsdWUpIHsKICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5JDI7 CiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRw Oi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsICJnIik7CiAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoInRy YW5zZm9ybSIsIHZhbHVlKTsKICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUudHJhbnNmb3JtLmJhc2VW YWwuY29uc29saWRhdGUoKSkpIHJldHVybiBpZGVudGl0eSQyOwogIHZhbHVlID0gdmFsdWUubWF0 cml4OwogIHJldHVybiBkZWNvbXBvc2UodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUu ZCwgdmFsdWUuZSwgdmFsdWUuZik7Cn0KCmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBh cnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikgewoKICBmdW5jdGlvbiBwb3Aocykgewog ICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArICIgIiA6ICIiOwogIH0KCiAgZnVuY3Rpb24g dHJhbnNsYXRlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7CiAgICBpZiAoeGEgIT09IHhiIHx8IHlh ICE9PSB5YikgewogICAgICB2YXIgaSA9IHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsIHB4Q29t bWEsIG51bGwsIHB4UGFyZW4pOwogICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBpbnRlcnBvbGF0 ZU51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBpbnRlcnBvbGF0ZU51bWJlcih5YSwgeWIp fSk7CiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7CiAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIg KyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcm90 YXRlKGEsIGIsIHMsIHEpIHsKICAgIGlmIChhICE9PSBiKSB7CiAgICAgIGlmIChhIC0gYiA+IDE4 MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3Qg cGF0aAogICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyAicm90YXRlKCIsIG51bGwsIGRl Z1BhcmVuKSAtIDIsIHg6IGludGVycG9sYXRlTnVtYmVyKGEsIGIpfSk7CiAgICB9IGVsc2UgaWYg KGIpIHsKICAgICAgcy5wdXNoKHBvcChzKSArICJyb3RhdGUoIiArIGIgKyBkZWdQYXJlbik7CiAg ICB9CiAgfQoKICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7CiAgICBpZiAoYSAhPT0gYikg ewogICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyAic2tld1goIiwgbnVsbCwgZGVnUGFy ZW4pIC0gMiwgeDogaW50ZXJwb2xhdGVOdW1iZXIoYSwgYil9KTsKICAgIH0gZWxzZSBpZiAoYikg ewogICAgICBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIgKyBiICsgZGVnUGFyZW4pOwogICAgfQog IH0KCiAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgIGlmICh4YSAh PT0geGIgfHwgeWEgIT09IHliKSB7CiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArICJzY2Fs ZSgiLCBudWxsLCAiLCIsIG51bGwsICIpIik7CiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IGlu dGVycG9sYXRlTnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IGludGVycG9sYXRlTnVtYmVy KHlhLCB5Yil9KTsKICAgIH0gZWxzZSBpZiAoeGIgIT09IDEgfHwgeWIgIT09IDEpIHsKICAgICAg cy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7CiAgICB9CiAg fQoKICByZXR1cm4gZnVuY3Rpb24oYSwgYikgewogICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNv bnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJw b2xhdG9ycwogICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7CiAgICB0cmFuc2xhdGUoYS50 cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBx KTsKICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpOwogICAgc2tld1goYS5za2V3 WCwgYi5za2V3WCwgcywgcSk7CiAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVY LCBiLnNjYWxlWSwgcywgcSk7CiAgICBhID0gYiA9IG51bGw7IC8vIGdjCiAgICByZXR1cm4gZnVu Y3Rpb24odCkgewogICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87CiAgICAgIHdoaWxl ICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7CiAgICAgIHJldHVybiBzLmpvaW4o IiIpOwogICAgfTsKICB9Owp9Cgp2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBv bGF0ZVRyYW5zZm9ybShwYXJzZUNzcywgInB4LCAiLCAicHgpIiwgImRlZykiKTsKdmFyIGludGVy cG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsICIsICIs ICIpIiwgIikiKTsKCnZhciByaG8gPSBNYXRoLlNRUlQyLAogICAgcmhvMiA9IDIsCiAgICByaG80 ID0gNCwKICAgIGVwc2lsb24yID0gMWUtMTI7CgpmdW5jdGlvbiBjb3NoKHgpIHsKICByZXR1cm4g KCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjsKfQoKZnVuY3Rpb24gc2luaCh4KSB7CiAg cmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7Cn0KCmZ1bmN0aW9uIHRhbmgo eCkgewogIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpOwp9Cgov LyBwMCA9IFt1eDAsIHV5MCwgdzBdCi8vIHAxID0gW3V4MSwgdXkxLCB3MV0KZnVuY3Rpb24gaW50 ZXJwb2xhdGVab29tKHAwLCBwMSkgewogIHZhciB1eDAgPSBwMFswXSwgdXkwID0gcDBbMV0sIHcw ID0gcDBbMl0sCiAgICAgIHV4MSA9IHAxWzBdLCB1eTEgPSBwMVsxXSwgdzEgPSBwMVsyXSwKICAg ICAgZHggPSB1eDEgLSB1eDAsCiAgICAgIGR5ID0gdXkxIC0gdXkwLAogICAgICBkMiA9IGR4ICog ZHggKyBkeSAqIGR5LAogICAgICBpLAogICAgICBTOwoKICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUw IOKJhSB1MS4KICBpZiAoZDIgPCBlcHNpbG9uMikgewogICAgUyA9IE1hdGgubG9nKHcxIC8gdzAp IC8gcmhvOwogICAgaSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIFsKICAgICAgICB1eDAg KyB0ICogZHgsCiAgICAgICAgdXkwICsgdCAqIGR5LAogICAgICAgIHcwICogTWF0aC5leHAocmhv ICogdCAqIFMpCiAgICAgIF07CiAgICB9OwogIH0KCiAgLy8gR2VuZXJhbCBjYXNlLgogIGVsc2Ug ewogICAgdmFyIGQxID0gTWF0aC5zcXJ0KGQyKSwKICAgICAgICBiMCA9ICh3MSAqIHcxIC0gdzAg KiB3MCArIHJobzQgKiBkMikgLyAoMiAqIHcwICogcmhvMiAqIGQxKSwKICAgICAgICBiMSA9ICh3 MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSwKICAg ICAgICByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksCiAgICAgICAg cjEgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjEgKiBiMSArIDEpIC0gYjEpOwogICAgUyA9IChyMSAt IHIwKSAvIHJobzsKICAgIGkgPSBmdW5jdGlvbih0KSB7CiAgICAgIHZhciBzID0gdCAqIFMsCiAg ICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSwKICAgICAgICAgIHUgPSB3MCAvIChyaG8yICogZDEp ICogKGNvc2hyMCAqIHRhbmgocmhvICogcyArIHIwKSAtIHNpbmgocjApKTsKICAgICAgcmV0dXJu IFsKICAgICAgICB1eDAgKyB1ICogZHgsCiAgICAgICAgdXkwICsgdSAqIGR5LAogICAgICAgIHcw ICogY29zaHIwIC8gY29zaChyaG8gKiBzICsgcjApCiAgICAgIF07CiAgICB9OwogIH0KCiAgaS5k dXJhdGlvbiA9IFMgKiAxMDAwOwoKICByZXR1cm4gaTsKfQoKZnVuY3Rpb24gaHNsJDEoaHVlKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgIHZhciBoID0gaHVlKChzdGFydCA9 IGhzbChzdGFydCkpLmgsIChlbmQgPSBoc2woZW5kKSkuaCksCiAgICAgICAgcyA9IG5vZ2FtbWEo c3RhcnQucywgZW5kLnMpLAogICAgICAgIGwgPSBub2dhbW1hKHN0YXJ0LmwsIGVuZC5sKSwKICAg ICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgICBy ZXR1cm4gZnVuY3Rpb24odCkgewogICAgICBzdGFydC5oID0gaCh0KTsKICAgICAgc3RhcnQucyA9 IHModCk7CiAgICAgIHN0YXJ0LmwgPSBsKHQpOwogICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0 eSh0KTsKICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICB9OwogIH0KfQoKdmFyIGhzbCQyID0g aHNsJDEoaHVlKTsKdmFyIGhzbExvbmcgPSBoc2wkMShub2dhbW1hKTsKCmZ1bmN0aW9uIGxhYiQx KHN0YXJ0LCBlbmQpIHsKICB2YXIgbCA9IG5vZ2FtbWEoKHN0YXJ0ID0gbGFiKHN0YXJ0KSkubCwg KGVuZCA9IGxhYihlbmQpKS5sKSwKICAgICAgYSA9IG5vZ2FtbWEoc3RhcnQuYSwgZW5kLmEpLAog ICAgICBiID0gbm9nYW1tYShzdGFydC5iLCBlbmQuYiksCiAgICAgIG9wYWNpdHkgPSBub2dhbW1h KHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAg c3RhcnQubCA9IGwodCk7CiAgICBzdGFydC5hID0gYSh0KTsKICAgIHN0YXJ0LmIgPSBiKHQpOwog ICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICByZXR1cm4gc3RhcnQgKyAiIjsKICB9 Owp9CgpmdW5jdGlvbiBoY2wkMShodWUpIHsKICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCkg ewogICAgdmFyIGggPSBodWUoKHN0YXJ0ID0gaGNsKHN0YXJ0KSkuaCwgKGVuZCA9IGhjbChlbmQp KS5oKSwKICAgICAgICBjID0gbm9nYW1tYShzdGFydC5jLCBlbmQuYyksCiAgICAgICAgbCA9IG5v Z2FtbWEoc3RhcnQubCwgZW5kLmwpLAogICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9w YWNpdHksIGVuZC5vcGFjaXR5KTsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHN0YXJ0 LmggPSBoKHQpOwogICAgICBzdGFydC5jID0gYyh0KTsKICAgICAgc3RhcnQubCA9IGwodCk7CiAg ICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOwogICAgICByZXR1cm4gc3RhcnQgKyAiIjsK ICAgIH07CiAgfQp9Cgp2YXIgaGNsJDIgPSBoY2wkMShodWUpOwp2YXIgaGNsTG9uZyA9IGhjbCQx KG5vZ2FtbWEpOwoKZnVuY3Rpb24gY3ViZWhlbGl4JDEoaHVlKSB7CiAgcmV0dXJuIChmdW5jdGlv biBjdWJlaGVsaXhHYW1tYSh5KSB7CiAgICB5ID0gK3k7CgogICAgZnVuY3Rpb24gY3ViZWhlbGl4 JDEoc3RhcnQsIGVuZCkgewogICAgICB2YXIgaCA9IGh1ZSgoc3RhcnQgPSBjdWJlaGVsaXgoc3Rh cnQpKS5oLCAoZW5kID0gY3ViZWhlbGl4KGVuZCkpLmgpLAogICAgICAgICAgcyA9IG5vZ2FtbWEo c3RhcnQucywgZW5kLnMpLAogICAgICAgICAgbCA9IG5vZ2FtbWEoc3RhcnQubCwgZW5kLmwpLAog ICAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOwog ICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHN0YXJ0LmggPSBoKHQpOwogICAgICAg IHN0YXJ0LnMgPSBzKHQpOwogICAgICAgIHN0YXJ0LmwgPSBsKE1hdGgucG93KHQsIHkpKTsKICAg ICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsKICAgICAgICByZXR1cm4gc3RhcnQgKyAi IjsKICAgICAgfTsKICAgIH0KCiAgICBjdWJlaGVsaXgkMS5nYW1tYSA9IGN1YmVoZWxpeEdhbW1h OwoKICAgIHJldHVybiBjdWJlaGVsaXgkMTsKICB9KSgxKTsKfQoKdmFyIGN1YmVoZWxpeCQyID0g Y3ViZWhlbGl4JDEoaHVlKTsKdmFyIGN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXgkMShub2dhbW1h KTsKCmZ1bmN0aW9uIHBpZWNld2lzZShpbnRlcnBvbGF0ZSwgdmFsdWVzKSB7CiAgdmFyIGkgPSAw LCBuID0gdmFsdWVzLmxlbmd0aCAtIDEsIHYgPSB2YWx1ZXNbMF0sIEkgPSBuZXcgQXJyYXkobiA8 IDAgPyAwIDogbik7CiAgd2hpbGUgKGkgPCBuKSBJW2ldID0gaW50ZXJwb2xhdGUodiwgdiA9IHZh bHVlc1srK2ldKTsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgdmFyIGkgPSBNYXRoLm1heCgw LCBNYXRoLm1pbihuIC0gMSwgTWF0aC5mbG9vcih0ICo9IG4pKSk7CiAgICByZXR1cm4gSVtpXSh0 IC0gaSk7CiAgfTsKfQoKZnVuY3Rpb24gcXVhbnRpemUoaW50ZXJwb2xhdG9yLCBuKSB7CiAgdmFy IHNhbXBsZXMgPSBuZXcgQXJyYXkobik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHNh bXBsZXNbaV0gPSBpbnRlcnBvbGF0b3IoaSAvIChuIC0gMSkpOwogIHJldHVybiBzYW1wbGVzOwp9 Cgp2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz8KICAgIHRp bWVvdXQgPSAwLCAvLyBpcyBhIHRpbWVvdXQgcGVuZGluZz8KICAgIGludGVydmFsID0gMCwgLy8g YXJlIGFueSB0aW1lcnMgYWN0aXZlPwogICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1 ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXcKICAgIHRhc2tIZWFkLAogICAgdGFza1RhaWws CiAgICBjbG9ja0xhc3QgPSAwLAogICAgY2xvY2tOb3cgPSAwLAogICAgY2xvY2tTa2V3ID0gMCwK ICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSAib2JqZWN0IiAmJiBwZXJmb3JtYW5j ZS5ub3cgPyBwZXJmb3JtYW5jZSA6IERhdGUsCiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cg PT09ICJvYmplY3QiICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPyB3aW5kb3cucmVx dWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSA6IGZ1bmN0aW9uKGYpIHsgc2V0VGltZW91 dChmLCAxNyk7IH07CgpmdW5jdGlvbiBub3coKSB7CiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRG cmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpOwp9Cgpm dW5jdGlvbiBjbGVhck5vdygpIHsKICBjbG9ja05vdyA9IDA7Cn0KCmZ1bmN0aW9uIFRpbWVyKCkg ewogIHRoaXMuX2NhbGwgPQogIHRoaXMuX3RpbWUgPQogIHRoaXMuX25leHQgPSBudWxsOwp9CgpU aW1lci5wcm90b3R5cGUgPSB0aW1lci5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IFRpbWVy LAogIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgaWYgKHR5 cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJh Y2sgaXMgbm90IGEgZnVuY3Rpb24iKTsKICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkg OiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpOwogICAgaWYgKCF0aGlzLl9u ZXh0ICYmIHRhc2tUYWlsICE9PSB0aGlzKSB7CiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwu X25leHQgPSB0aGlzOwogICAgICBlbHNlIHRhc2tIZWFkID0gdGhpczsKICAgICAgdGFza1RhaWwg PSB0aGlzOwogICAgfQogICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrOwogICAgdGhpcy5fdGltZSA9 IHRpbWU7CiAgICBzbGVlcCgpOwogIH0sCiAgc3RvcDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhp cy5fY2FsbCkgewogICAgICB0aGlzLl9jYWxsID0gbnVsbDsKICAgICAgdGhpcy5fdGltZSA9IElu ZmluaXR5OwogICAgICBzbGVlcCgpOwogICAgfQogIH0KfTsKCmZ1bmN0aW9uIHRpbWVyKGNhbGxi YWNrLCBkZWxheSwgdGltZSkgewogIHZhciB0ID0gbmV3IFRpbWVyOwogIHQucmVzdGFydChjYWxs YmFjaywgZGVsYXksIHRpbWUpOwogIHJldHVybiB0Owp9CgpmdW5jdGlvbiB0aW1lckZsdXNoKCkg ewogIG5vdygpOyAvLyBHZXQgdGhlIGN1cnJlbnQgdGltZSwgaWYgbm90IGFscmVhZHkgc2V0Lgog ICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZ dCBhbHJlYWR5LgogIHZhciB0ID0gdGFza0hlYWQsIGU7CiAgd2hpbGUgKHQpIHsKICAgIGlmICgo ZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKG51bGwsIGUpOwogICAg dCA9IHQuX25leHQ7CiAgfQogIC0tZnJhbWU7Cn0KCmZ1bmN0aW9uIHdha2UoKSB7CiAgY2xvY2tO b3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3OwogIGZyYW1lID0gdGlt ZW91dCA9IDA7CiAgdHJ5IHsKICAgIHRpbWVyRmx1c2goKTsKICB9IGZpbmFsbHkgewogICAgZnJh bWUgPSAwOwogICAgbmFwKCk7CiAgICBjbG9ja05vdyA9IDA7CiAgfQp9CgpmdW5jdGlvbiBwb2tl KCkgewogIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7CiAg aWYgKGRlbGF5ID4gcG9rZURlbGF5KSBjbG9ja1NrZXcgLT0gZGVsYXksIGNsb2NrTGFzdCA9IG5v dzsKfQoKZnVuY3Rpb24gbmFwKCkgewogIHZhciB0MCwgdDEgPSB0YXNrSGVhZCwgdDIsIHRpbWUg PSBJbmZpbml0eTsKICB3aGlsZSAodDEpIHsKICAgIGlmICh0MS5fY2FsbCkgewogICAgICBpZiAo dGltZSA+IHQxLl90aW1lKSB0aW1lID0gdDEuX3RpbWU7CiAgICAgIHQwID0gdDEsIHQxID0gdDEu X25leHQ7CiAgICB9IGVsc2UgewogICAgICB0MiA9IHQxLl9uZXh0LCB0MS5fbmV4dCA9IG51bGw7 CiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjsKICAgIH0KICB9 CiAgdGFza1RhaWwgPSB0MDsKICBzbGVlcCh0aW1lKTsKfQoKZnVuY3Rpb24gc2xlZXAodGltZSkg ewogIGlmIChmcmFtZSkgcmV0dXJuOyAvLyBTb29uZXN0IGFsYXJtIGFscmVhZHkgc2V0LCBvciB3 aWxsIGJlLgogIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpOwog IHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdzsgLy8gU3RyaWN0bHkgbGVzcyB0aGFuIGlmIHdl IHJlY29tcHV0ZWQgY2xvY2tOb3cuCiAgaWYgKGRlbGF5ID4gMjQpIHsKICAgIGlmICh0aW1lIDwg SW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAt IGNsb2NrU2tldyk7CiAgICBpZiAoaW50ZXJ2YWwpIGludGVydmFsID0gY2xlYXJJbnRlcnZhbChp bnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2Nr Lm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7CiAgICBmcmFt ZSA9IDEsIHNldEZyYW1lKHdha2UpOwogIH0KfQoKZnVuY3Rpb24gdGltZW91dCQxKGNhbGxiYWNr LCBkZWxheSwgdGltZSkgewogIHZhciB0ID0gbmV3IFRpbWVyOwogIGRlbGF5ID0gZGVsYXkgPT0g bnVsbCA/IDAgOiArZGVsYXk7CiAgdC5yZXN0YXJ0KGZ1bmN0aW9uKGVsYXBzZWQpIHsKICAgIHQu c3RvcCgpOwogICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTsKICB9LCBkZWxheSwgdGltZSk7 CiAgcmV0dXJuIHQ7Cn0KCmZ1bmN0aW9uIGludGVydmFsJDEoY2FsbGJhY2ssIGRlbGF5LCB0aW1l KSB7CiAgdmFyIHQgPSBuZXcgVGltZXIsIHRvdGFsID0gZGVsYXk7CiAgaWYgKGRlbGF5ID09IG51 bGwpIHJldHVybiB0LnJlc3RhcnQoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSwgdDsKICBkZWxheSA9 ICtkZWxheSwgdGltZSA9IHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWU7CiAgdC5yZXN0YXJ0 KGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkgewogICAgZWxhcHNlZCArPSB0b3RhbDsKICAgIHQucmVz dGFydCh0aWNrLCB0b3RhbCArPSBkZWxheSwgdGltZSk7CiAgICBjYWxsYmFjayhlbGFwc2VkKTsK ICB9LCBkZWxheSwgdGltZSk7CiAgcmV0dXJuIHQ7Cn0KCnZhciBlbXB0eU9uID0gZGlzcGF0Y2go InN0YXJ0IiwgImVuZCIsICJjYW5jZWwiLCAiaW50ZXJydXB0Iik7CnZhciBlbXB0eVR3ZWVuID0g W107Cgp2YXIgQ1JFQVRFRCA9IDA7CnZhciBTQ0hFRFVMRUQgPSAxOwp2YXIgU1RBUlRJTkcgPSAy Owp2YXIgU1RBUlRFRCA9IDM7CnZhciBSVU5OSU5HID0gNDsKdmFyIEVORElORyA9IDU7CnZhciBF TkRFRCA9IDY7CgpmdW5jdGlvbiBzY2hlZHVsZShub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3Vw LCB0aW1pbmcpIHsKICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247CiAgaWYgKCFz Y2hlZHVsZXMpIG5vZGUuX190cmFuc2l0aW9uID0ge307CiAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1 bGVzKSByZXR1cm47CiAgY3JlYXRlJDEobm9kZSwgaWQsIHsKICAgIG5hbWU6IG5hbWUsCiAgICBp bmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4KICAgIGdyb3VwOiBn cm91cCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLgogICAgb246IGVtcHR5T24sCiAg ICB0d2VlbjogZW1wdHlUd2VlbiwKICAgIHRpbWU6IHRpbWluZy50aW1lLAogICAgZGVsYXk6IHRp bWluZy5kZWxheSwKICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sCiAgICBlYXNlOiB0aW1p bmcuZWFzZSwKICAgIHRpbWVyOiBudWxsLAogICAgc3RhdGU6IENSRUFURUQKICB9KTsKfQoKZnVu Y3Rpb24gaW5pdChub2RlLCBpZCkgewogIHZhciBzY2hlZHVsZSA9IGdldCQxKG5vZGUsIGlkKTsK ICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRl OyBhbHJlYWR5IHNjaGVkdWxlZCIpOwogIHJldHVybiBzY2hlZHVsZTsKfQoKZnVuY3Rpb24gc2V0 JDEobm9kZSwgaWQpIHsKICB2YXIgc2NoZWR1bGUgPSBnZXQkMShub2RlLCBpZCk7CiAgaWYgKHNj aGVkdWxlLnN0YXRlID4gU1RBUlRFRCkgdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFk eSBydW5uaW5nIik7CiAgcmV0dXJuIHNjaGVkdWxlOwp9CgpmdW5jdGlvbiBnZXQkMShub2RlLCBp ZCkgewogIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uOwogIGlmICghc2NoZWR1bGUg fHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcigidHJhbnNpdGlv biBub3QgZm91bmQiKTsKICByZXR1cm4gc2NoZWR1bGU7Cn0KCmZ1bmN0aW9uIGNyZWF0ZSQxKG5v ZGUsIGlkLCBzZWxmKSB7CiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLAogICAg ICB0d2VlbjsKCiAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VsZiB0aW1lciB3aGVuIHRoZSB0cmFuc2l0 aW9uIGlzIGNyZWF0ZWQuCiAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1 bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shCiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7CiAgc2VsZi50 aW1lciA9IHRpbWVyKHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpOwoKICBmdW5jdGlvbiBzY2hlZHVs ZShlbGFwc2VkKSB7CiAgICBzZWxmLnN0YXRlID0gU0NIRURVTEVEOwogICAgc2VsZi50aW1lci5y ZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpOwoKICAgIC8vIElmIHRoZSBlbGFw c2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5 LgogICAgaWYgKHNlbGYuZGVsYXkgPD0gZWxhcHNlZCkgc3RhcnQoZWxhcHNlZCAtIHNlbGYuZGVs YXkpOwogIH0KCiAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkgewogICAgdmFyIGksIGosIG4sIG87 CgogICAgLy8gSWYgdGhlIHN0YXRlIGlzIG5vdCBTQ0hFRFVMRUQsIHRoZW4gd2UgcHJldmlvdXNs eSBlcnJvcmVkIG9uIHN0YXJ0LgogICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCkgcmV0 dXJuIHN0b3AoKTsKCiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICAgIG8gPSBzY2hlZHVs ZXNbaV07CiAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7CgogICAgICAv LyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1 cmluZyB0aGlzIGZyYW1lLAogICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcg dHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGEKICAgICAgLy8gY2hhbmNlIHRv IHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCEKICAgICAg aWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0JDEoc3RhcnQpOwoKICAgICAg Ly8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LgogICAgICBpZiAoby5z dGF0ZSA9PT0gUlVOTklORykgewogICAgICAgIG8uc3RhdGUgPSBFTkRFRDsKICAgICAgICBvLnRp bWVyLnN0b3AoKTsKICAgICAgICBvLm9uLmNhbGwoImludGVycnVwdCIsIG5vZGUsIG5vZGUuX19k YXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApOwogICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAg ICAgIH0KCiAgICAgIC8vIENhbmNlbCBhbnkgcHJlLWVtcHRlZCB0cmFuc2l0aW9ucy4KICAgICAg ZWxzZSBpZiAoK2kgPCBpZCkgewogICAgICAgIG8uc3RhdGUgPSBFTkRFRDsKICAgICAgICBvLnRp bWVyLnN0b3AoKTsKICAgICAgICBvLm9uLmNhbGwoImNhbmNlbCIsIG5vZGUsIG5vZGUuX19kYXRh X18sIG8uaW5kZXgsIG8uZ3JvdXApOwogICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAg IH0KICAgIH0KCiAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJl bnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LgogICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkg YmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayEKICAgIC8v IE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUg ZDMvZDMtdHJhbnNpdGlvbiMxNiEKICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwg c3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay4KICAgIHRpbWVvdXQkMShm dW5jdGlvbigpIHsKICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHsKICAgICAgICBz ZWxmLnN0YXRlID0gUlVOTklORzsKICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2Vs Zi5kZWxheSwgc2VsZi50aW1lKTsKICAgICAgICB0aWNrKGVsYXBzZWQpOwogICAgICB9CiAgICB9 KTsKCiAgICAvLyBEaXNwYXRjaCB0aGUgc3RhcnQgZXZlbnQuCiAgICAvLyBOb3RlIHRoaXMgbXVz dCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLgogICAgc2VsZi5zdGF0 ZSA9IFNUQVJUSU5HOwogICAgc2VsZi5vbi5jYWxsKCJzdGFydCIsIG5vZGUsIG5vZGUuX19kYXRh X18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApOwogICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJU SU5HKSByZXR1cm47IC8vIGludGVycnVwdGVkCiAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDsKCiAg ICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi4KICAgIHR3ZWVu ID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7CiAgICBmb3IgKGkgPSAwLCBqID0g LTE7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwo bm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHsKICAgICAgICB0 d2VlblsrK2pdID0gbzsKICAgICAgfQogICAgfQogICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7CiAg fQoKICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHsKICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYu ZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikg OiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSwKICAg ICAgICBpID0gLTEsCiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDsKCiAgICB3aGlsZSAoKytpIDwg bikgewogICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpOwogICAgfQoKICAgIC8vIERpc3BhdGNo IHRoZSBlbmQgZXZlbnQuCiAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7CiAgICAgIHNl bGYub24uY2FsbCgiZW5kIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5n cm91cCk7CiAgICAgIHN0b3AoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHN0b3AoKSB7CiAgICBz ZWxmLnN0YXRlID0gRU5ERUQ7CiAgICBzZWxmLnRpbWVyLnN0b3AoKTsKICAgIGRlbGV0ZSBzY2hl ZHVsZXNbaWRdOwogICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50 LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9u OwogIH0KfQoKZnVuY3Rpb24gaW50ZXJydXB0KG5vZGUsIG5hbWUpIHsKICB2YXIgc2NoZWR1bGVz ID0gbm9kZS5fX3RyYW5zaXRpb24sCiAgICAgIHNjaGVkdWxlLAogICAgICBhY3RpdmUsCiAgICAg IGVtcHR5ID0gdHJ1ZSwKICAgICAgaTsKCiAgaWYgKCFzY2hlZHVsZXMpIHJldHVybjsKCiAgbmFt ZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7CgogIGZvciAoaSBpbiBzY2hlZHVs ZXMpIHsKICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsg ZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH0KICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4g U1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7CiAgICBzY2hlZHVsZS5zdGF0ZSA9 IEVOREVEOwogICAgc2NoZWR1bGUudGltZXIuc3RvcCgpOwogICAgc2NoZWR1bGUub24uY2FsbChh Y3RpdmUgPyAiaW50ZXJydXB0IiA6ICJjYW5jZWwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hl ZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApOwogICAgZGVsZXRlIHNjaGVkdWxlc1tpXTsKICB9 CgogIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uOwp9CgpmdW5jdGlvbiBzZWxl Y3Rpb25faW50ZXJydXB0KG5hbWUpIHsKICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewog ICAgaW50ZXJydXB0KHRoaXMsIG5hbWUpOwogIH0pOwp9CgpmdW5jdGlvbiB0d2VlblJlbW92ZShp ZCwgbmFtZSkgewogIHZhciB0d2VlbjAsIHR3ZWVuMTsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAg ICB2YXIgc2NoZWR1bGUgPSBzZXQkMSh0aGlzLCBpZCksCiAgICAgICAgdHdlZW4gPSBzY2hlZHVs ZS50d2VlbjsKCiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZp b3VzIG5vZGUsCiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5k IHdl4oCZcmUgZG9uZSEKICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgIGlmICh0 d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuOwogICAgICBm b3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICBp ZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5z bGljZSgpOwogICAgICAgICAgdHdlZW4xLnNwbGljZShpLCAxKTsKICAgICAgICAgIGJyZWFrOwog ICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xOwogIH07 Cn0KCmZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24oaWQsIG5hbWUsIHZhbHVlKSB7CiAgdmFyIHR3ZWVu MCwgdHdlZW4xOwogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBF cnJvcjsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgc2NoZWR1bGUgPSBzZXQkMSh0aGlz LCBpZCksCiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjsKCiAgICAvLyBJZiB0aGlzIG5v ZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAvLyBqdXN0IGFzc2ln biB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSEKICAgIC8vIE90aGVy d2lzZSwgY29weS1vbi13cml0ZS4KICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgIHR3 ZWVuMSA9ICh0d2VlbjAgPSB0d2Vlbikuc2xpY2UoKTsKICAgICAgZm9yICh2YXIgdCA9IHtuYW1l OiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyAr K2kpIHsKICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHR3 ZWVuMVtpXSA9IHQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYg KGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpOwogICAgfQoKICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdl ZW4xOwogIH07Cn0KCmZ1bmN0aW9uIHRyYW5zaXRpb25fdHdlZW4obmFtZSwgdmFsdWUpIHsKICB2 YXIgaWQgPSB0aGlzLl9pZDsKCiAgbmFtZSArPSAiIjsKCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGgg PCAyKSB7CiAgICB2YXIgdHdlZW4gPSBnZXQkMSh0aGlzLm5vZGUoKSwgaWQpLnR3ZWVuOwogICAg Zm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHsKICAgICAg aWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICByZXR1cm4gdC52YWx1 ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICByZXR1cm4gdGhpcy5lYWNo KCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUgOiB0d2VlbkZ1bmN0aW9uKShpZCwgbmFtZSwg dmFsdWUpKTsKfQoKZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkg ewogIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkOwoKICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24o KSB7CiAgICB2YXIgc2NoZWR1bGUgPSBzZXQkMSh0aGlzLCBpZCk7CiAgICAoc2NoZWR1bGUudmFs dWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFy Z3VtZW50cyk7CiAgfSk7CgogIHJldHVybiBmdW5jdGlvbihub2RlKSB7CiAgICByZXR1cm4gZ2V0 JDEobm9kZSwgaWQpLnZhbHVlW25hbWVdOwogIH07Cn0KCmZ1bmN0aW9uIGludGVycG9sYXRlKGEs IGIpIHsKICB2YXIgYzsKICByZXR1cm4gKHR5cGVvZiBiID09PSAibnVtYmVyIiA/IGludGVycG9s YXRlTnVtYmVyCiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gaW50ZXJwb2xhdGVSZ2IKICAg ICAgOiAoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgaW50ZXJwb2xhdGVSZ2IpCiAgICAgIDogaW50 ZXJwb2xhdGVTdHJpbmcpKGEsIGIpOwp9CgpmdW5jdGlvbiBhdHRyUmVtb3ZlJDEobmFtZSkgewog IHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogIH07 Cn0KCmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyQxKGZ1bGxuYW1lKSB7CiAgcmV0dXJuIGZ1bmN0aW9u KCkgewogICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUu bG9jYWwpOwogIH07Cn0KCmZ1bmN0aW9uIGF0dHJDb25zdGFudCQxKG5hbWUsIGludGVycG9sYXRl LCB2YWx1ZTEpIHsKICB2YXIgc3RyaW5nMDAsCiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIiwK ICAgICAgaW50ZXJwb2xhdGUwOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBzdHJpbmcw ID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5n MSA/IG51bGwKICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwCiAg ICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZh bHVlMSk7CiAgfTsKfQoKZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMkMShmdWxsbmFtZSwgaW50ZXJw b2xhdGUsIHZhbHVlMSkgewogIHZhciBzdHJpbmcwMCwKICAgICAgc3RyaW5nMSA9IHZhbHVlMSAr ICIiLAogICAgICBpbnRlcnBvbGF0ZTA7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHN0 cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2Nh bCk7CiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICA6IHN0cmlu ZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBp bnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgfTsKfQoKZnVuY3Rpb24g YXR0ckZ1bmN0aW9uJDEobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7CiAgdmFyIHN0cmluZzAw LAogICAgICBzdHJpbmcxMCwKICAgICAgaW50ZXJwb2xhdGUwOwogIHJldHVybiBmdW5jdGlvbigp IHsKICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTsKICAgIGlm ICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7 CiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICBzdHJpbmcxID0gdmFs dWUxICsgIiI7CiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICA6 IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xh dGUwCiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBv bGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogIH07Cn0KCmZ1bmN0aW9uIGF0dHJG dW5jdGlvbk5TJDEoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogIHZhciBzdHJpbmcw MCwKICAgICAgc3RyaW5nMTAsCiAgICAgIGludGVycG9sYXRlMDsKICByZXR1cm4gZnVuY3Rpb24o KSB7CiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7CiAgICBp ZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVs bG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJp YnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICBzdHJpbmcxID0gdmFs dWUxICsgIiI7CiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICA6 IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xh dGUwCiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBv bGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogIH07Cn0KCmZ1bmN0aW9uIHRyYW5z aXRpb25fYXR0cihuYW1lLCB2YWx1ZSkgewogIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1l KSwgaSA9IGZ1bGxuYW1lID09PSAidHJhbnNmb3JtIiA/IGludGVycG9sYXRlVHJhbnNmb3JtU3Zn IDogaW50ZXJwb2xhdGU7CiAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1 ZSA9PT0gImZ1bmN0aW9uIgogICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5T JDEgOiBhdHRyRnVuY3Rpb24kMSkoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgImF0dHIu IiArIG5hbWUsIHZhbHVlKSkKICAgICAgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2Fs ID8gYXR0clJlbW92ZU5TJDEgOiBhdHRyUmVtb3ZlJDEpKGZ1bGxuYW1lKQogICAgICA6IChmdWxs bmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TJDEgOiBhdHRyQ29uc3RhbnQkMSkoZnVsbG5hbWUs IGksIHZhbHVlKSk7Cn0KCmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKSB7CiAgcmV0 dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGkuY2FsbCh0aGlz LCB0KSk7CiAgfTsKfQoKZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHsK ICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5z cGFjZSwgZnVsbG5hbWUubG9jYWwsIGkuY2FsbCh0aGlzLCB0KSk7CiAgfTsKfQoKZnVuY3Rpb24g YXR0clR3ZWVuTlMoZnVsbG5hbWUsIHZhbHVlKSB7CiAgdmFyIHQwLCBpMDsKICBmdW5jdGlvbiB0 d2VlbigpIHsKICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlm IChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwg aSk7CiAgICByZXR1cm4gdDA7CiAgfQogIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogIHJldHVybiB0 d2VlbjsKfQoKZnVuY3Rpb24gYXR0clR3ZWVuKG5hbWUsIHZhbHVlKSB7CiAgdmFyIHQwLCBpMDsK ICBmdW5jdGlvbiB0d2VlbigpIHsKICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1l bnRzKTsKICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGUo bmFtZSwgaSk7CiAgICByZXR1cm4gdDA7CiAgfQogIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogIHJl dHVybiB0d2VlbjsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9hdHRyVHdlZW4obmFtZSwgdmFsdWUp IHsKICB2YXIga2V5ID0gImF0dHIuIiArIG5hbWU7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAy KSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsKICBpZiAodmFs dWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICBpZiAodHlwZW9mIHZh bHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7CiAgdmFyIGZ1bGxuYW1lID0gbmFt ZXNwYWNlKG5hbWUpOwogIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8g YXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pKGZ1bGxuYW1lLCB2YWx1ZSkpOwp9CgpmdW5jdGlvbiBk ZWxheUZ1bmN0aW9uKGlkLCB2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIGluaXQo dGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKfQoK ZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCwgdmFsdWUpIHsKICByZXR1cm4gdmFsdWUgPSArdmFs dWUsIGZ1bmN0aW9uKCkgewogICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTsKICB9Owp9 CgpmdW5jdGlvbiB0cmFuc2l0aW9uX2RlbGF5KHZhbHVlKSB7CiAgdmFyIGlkID0gdGhpcy5faWQ7 CgogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFs dWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gZGVsYXlGdW5jdGlvbgogICAgICAgICAgOiBk ZWxheUNvbnN0YW50KShpZCwgdmFsdWUpKQogICAgICA6IGdldCQxKHRoaXMubm9kZSgpLCBpZCku ZGVsYXk7Cn0KCmZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsIHZhbHVlKSB7CiAgcmV0dXJu IGZ1bmN0aW9uKCkgewogICAgc2V0JDEodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5 KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKfQoKZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwg dmFsdWUpIHsKICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkgewogICAgc2V0JDEo dGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7CiAgfTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9k dXJhdGlvbih2YWx1ZSkgewogIHZhciBpZCA9IHRoaXMuX2lkOwoKICByZXR1cm4gYXJndW1lbnRz Lmxlbmd0aAogICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAg ICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb24KICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCko aWQsIHZhbHVlKSkKICAgICAgOiBnZXQkMSh0aGlzLm5vZGUoKSwgaWQpLmR1cmF0aW9uOwp9Cgpm dW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0g ImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHNl dCQxKHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7CiAgfTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9l YXNlKHZhbHVlKSB7CiAgdmFyIGlkID0gdGhpcy5faWQ7CgogIHJldHVybiBhcmd1bWVudHMubGVu Z3RoCiAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKQogICAgICA6IGdl dCQxKHRoaXMubm9kZSgpLCBpZCkuZWFzZTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9maWx0ZXIo bWF0Y2gpIHsKICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNo ZXIobWF0Y2gpOwoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMu bGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAg ICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAg PSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYg KChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwg Z3JvdXApKSB7CiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKICAgICAgfQogICAgfQogIH0K CiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5f bmFtZSwgdGhpcy5faWQpOwp9CgpmdW5jdGlvbiB0cmFuc2l0aW9uX21lcmdlKHRyYW5zaXRpb24p IHsKICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3I7Cgog IGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9n cm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRo Lm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikg ewogICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwg biA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2Rl LCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91 cDFbaV0pIHsKICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIGZv ciAoOyBqIDwgbTA7ICsraikgewogICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICB9CgogIHJl dHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRo aXMuX2lkKTsKfQoKZnVuY3Rpb24gc3RhcnQobmFtZSkgewogIHJldHVybiAobmFtZSArICIiKS50 cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCkgewogICAgdmFyIGkgPSB0Lmlu ZGV4T2YoIi4iKTsKICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpOwogICAgcmV0dXJu ICF0IHx8IHQgPT09ICJzdGFydCI7CiAgfSk7Cn0KCmZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5h bWUsIGxpc3RlbmVyKSB7CiAgdmFyIG9uMCwgb24xLCBzaXQgPSBzdGFydChuYW1lKSA/IGluaXQg OiBzZXQkMTsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgc2NoZWR1bGUgPSBzaXQodGhp cywgaWQpLAogICAgICAgIG9uID0gc2NoZWR1bGUub247CgogICAgLy8gSWYgdGhpcyBub2RlIHNo YXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAvLyBqdXN0IGFzc2ln biB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSEKICAgIC8vIE90 aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgIGlmIChvbiAhPT0gb24wKSAob24xID0gKG9uMCA9 IG9uKS5jb3B5KCkpLm9uKG5hbWUsIGxpc3RlbmVyKTsKCiAgICBzY2hlZHVsZS5vbiA9IG9uMTsK ICB9Owp9CgpmdW5jdGlvbiB0cmFuc2l0aW9uX29uKG5hbWUsIGxpc3RlbmVyKSB7CiAgdmFyIGlk ID0gdGhpcy5faWQ7CgogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMgogICAgICA/IGdldCQx KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSkKICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlv bihpZCwgbmFtZSwgbGlzdGVuZXIpKTsKfQoKZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oaWQpIHsK ICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwog ICAgZm9yICh2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbikgaWYgKCtpICE9PSBpZCkgcmV0dXJu OwogICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOwogIH07Cn0KCmZ1bmN0 aW9uIHRyYW5zaXRpb25fcmVtb3ZlKCkgewogIHJldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwg cmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9zZWxlY3Qo c2VsZWN0KSB7CiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLAogICAgICBpZCA9IHRoaXMuX2lkOwoK ICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2Vs ZWN0KTsKCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0 aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgZm9y ICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3Vi Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsr aSkgewogICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2Fs bChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7CiAgICAgICAgaWYgKCJfX2RhdGFf XyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgc3Vi Z3JvdXBbaV0gPSBzdWJub2RlOwogICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBp ZCwgaSwgc3ViZ3JvdXAsIGdldCQxKG5vZGUsIGlkKSk7CiAgICAgIH0KICAgIH0KICB9CgogIHJl dHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsK fQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9zZWxlY3RBbGwoc2VsZWN0KSB7CiAgdmFyIG5hbWUgPSB0 aGlzLl9uYW1lLAogICAgICBpZCA9IHRoaXMuX2lkOwoKICBpZiAodHlwZW9mIHNlbGVjdCAhPT0g ImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTsKCiAgZm9yICh2YXIgZ3Jv dXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBh cmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGdyb3VwID0gZ3Jv dXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAg ICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxl Y3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0g Z2V0JDEobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykg ewogICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHsKICAgICAgICAgICAgc2NoZWR1 bGUoY2hpbGQsIG5hbWUsIGlkLCBrLCBjaGlsZHJlbiwgaW5oZXJpdCk7CiAgICAgICAgICB9CiAg ICAgICAgfQogICAgICAgIHN1Ymdyb3Vwcy5wdXNoKGNoaWxkcmVuKTsKICAgICAgICBwYXJlbnRz LnB1c2gobm9kZSk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBuZXcgVHJhbnNpdGlvbihz dWJncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKTsKfQoKdmFyIFNlbGVjdGlvbiQxID0gc2VsZWN0 aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjsKCmZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0aW9u KCkgewogIHJldHVybiBuZXcgU2VsZWN0aW9uJDEodGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRz KTsKfQoKZnVuY3Rpb24gc3R5bGVOdWxsKG5hbWUsIGludGVycG9sYXRlKSB7CiAgdmFyIHN0cmlu ZzAwLAogICAgICBzdHJpbmcxMCwKICAgICAgaW50ZXJwb2xhdGUwOwogIHJldHVybiBmdW5jdGlv bigpIHsKICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKSwKICAgICAgICBz dHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlVmFsdWUodGhp cywgbmFtZSkpOwogICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAg OiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9s YXRlMAogICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJp bmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpOwogIH07Cn0KCmZ1bmN0aW9uIHN0eWxlUmVtb3ZlJDEo bmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVy dHkobmFtZSk7CiAgfTsKfQoKZnVuY3Rpb24gc3R5bGVDb25zdGFudCQxKG5hbWUsIGludGVycG9s YXRlLCB2YWx1ZTEpIHsKICB2YXIgc3RyaW5nMDAsCiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAi IiwKICAgICAgaW50ZXJwb2xhdGUwOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBzdHJp bmcwID0gc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKTsKICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJp bmcxID8gbnVsbAogICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAK ICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwg dmFsdWUxKTsKICB9Owp9CgpmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uJDEobmFtZSwgaW50ZXJwb2xh dGUsIHZhbHVlKSB7CiAgdmFyIHN0cmluZzAwLAogICAgICBzdHJpbmcxMCwKICAgICAgaW50ZXJw b2xhdGUwOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1 ZSh0aGlzLCBuYW1lKSwKICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwKICAgICAgICBzdHJp bmcxID0gdmFsdWUxICsgIiI7CiAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1 ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGVWYWx1ZSh0aGlzLCBu YW1lKSk7CiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICA6IHN0 cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUw CiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0 ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogIH07Cn0KCmZ1bmN0aW9uIHN0eWxlTWF5 YmVSZW1vdmUoaWQsIG5hbWUpIHsKICB2YXIgb24wLCBvbjEsIGxpc3RlbmVyMCwga2V5ID0gInN0 eWxlLiIgKyBuYW1lLCBldmVudCA9ICJlbmQuIiArIGtleSwgcmVtb3ZlOwogIHJldHVybiBmdW5j dGlvbigpIHsKICAgIHZhciBzY2hlZHVsZSA9IHNldCQxKHRoaXMsIGlkKSwKICAgICAgICBvbiA9 IHNjaGVkdWxlLm9uLAogICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBu dWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZSQxKG5hbWUpKSA6IHVuZGVmaW5l ZDsKCiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlv dXMgbm9kZSwKICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBh bmQgd2XigJlyZSBkb25lIQogICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgaWYg KG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbiku Y29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpOwoKICAgIHNjaGVkdWxlLm9u ID0gb24xOwogIH07Cn0KCmZ1bmN0aW9uIHRyYW5zaXRpb25fc3R5bGUobmFtZSwgdmFsdWUsIHBy aW9yaXR5KSB7CiAgdmFyIGkgPSAobmFtZSArPSAiIikgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJw b2xhdGVUcmFuc2Zvcm1Dc3MgOiBpbnRlcnBvbGF0ZTsKICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ IHRoaXMKICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVOdWxsKG5hbWUsIGkpKQogICAgICAu b24oImVuZC5zdHlsZS4iICsgbmFtZSwgc3R5bGVSZW1vdmUkMShuYW1lKSkKICAgIDogdHlwZW9m IHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGhpcwogICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHls ZUZ1bmN0aW9uJDEobmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCAic3R5bGUuIiArIG5hbWUsIHZh bHVlKSkpCiAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUodGhpcy5faWQsIG5hbWUpKQogICAg OiB0aGlzCiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlQ29uc3RhbnQkMShuYW1lLCBpLCB2 YWx1ZSksIHByaW9yaXR5KQogICAgICAub24oImVuZC5zdHlsZS4iICsgbmFtZSwgbnVsbCk7Cn0K CmZ1bmN0aW9uIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpIHsKICByZXR1cm4g ZnVuY3Rpb24odCkgewogICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhp cywgdCksIHByaW9yaXR5KTsKICB9Owp9CgpmdW5jdGlvbiBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVl LCBwcmlvcml0eSkgewogIHZhciB0LCBpMDsKICBmdW5jdGlvbiB0d2VlbigpIHsKICAgIHZhciBp ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmIChpICE9PSBpMCkgdCA9IChp MCA9IGkpICYmIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpOwogICAgcmV0dXJu IHQ7CiAgfQogIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogIHJldHVybiB0d2VlbjsKfQoKZnVuY3Rp b24gdHJhbnNpdGlvbl9zdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogIHZhciBr ZXkgPSAic3R5bGUuIiArIChuYW1lICs9ICIiKTsKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIp IHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogIGlmICh2YWx1 ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpOwogIGlmICh0eXBlb2YgdmFs dWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsKICByZXR1cm4gdGhpcy50d2Vlbihr ZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyAiIiA6IHByaW9y aXR5KSk7Cn0KCmZ1bmN0aW9uIHRleHRDb25zdGFudCQxKHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0 aW9uKCkgewogICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwogIH07Cn0KCmZ1bmN0aW9uIHRl eHRGdW5jdGlvbiQxKHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHZhbHVl MSA9IHZhbHVlKHRoaXMpOwogICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8g IiIgOiB2YWx1ZTE7CiAgfTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl90ZXh0KHZhbHVlKSB7CiAg cmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAg ICAgPyB0ZXh0RnVuY3Rpb24kMSh0d2VlblZhbHVlKHRoaXMsICJ0ZXh0IiwgdmFsdWUpKQogICAg ICA6IHRleHRDb25zdGFudCQxKHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICsgIiIpKTsKfQoK ZnVuY3Rpb24gdGV4dEludGVycG9sYXRlKGkpIHsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAg dGhpcy50ZXh0Q29udGVudCA9IGkuY2FsbCh0aGlzLCB0KTsKICB9Owp9CgpmdW5jdGlvbiB0ZXh0 VHdlZW4odmFsdWUpIHsKICB2YXIgdDAsIGkwOwogIGZ1bmN0aW9uIHR3ZWVuKCkgewogICAgdmFy IGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKGkgIT09IGkwKSB0MCA9 IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTsKICAgIHJldHVybiB0MDsKICB9CiAgdHdl ZW4uX3ZhbHVlID0gdmFsdWU7CiAgcmV0dXJuIHR3ZWVuOwp9CgpmdW5jdGlvbiB0cmFuc2l0aW9u X3RleHRUd2Vlbih2YWx1ZSkgewogIHZhciBrZXkgPSAidGV4dCI7CiAgaWYgKGFyZ3VtZW50cy5s ZW5ndGggPCAxKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsK ICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICBpZiAo dHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7CiAgcmV0dXJuIHRo aXMudHdlZW4oa2V5LCB0ZXh0VHdlZW4odmFsdWUpKTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl90 cmFuc2l0aW9uKCkgewogIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQwID0gdGhpcy5f aWQsCiAgICAgIGlkMSA9IG5ld0lkKCk7CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3Vw cywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBn cm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyAr K2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIHZhciBpbmhlcml0ID0g Z2V0JDEobm9kZSwgaWQwKTsKICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZDEsIGksIGdy b3VwLCB7CiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5o ZXJpdC5kdXJhdGlvbiwKICAgICAgICAgIGRlbGF5OiAwLAogICAgICAgICAgZHVyYXRpb246IGlu aGVyaXQuZHVyYXRpb24sCiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2UKICAgICAgICB9KTsK ICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5f cGFyZW50cywgbmFtZSwgaWQxKTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9lbmQoKSB7CiAgdmFy IG9uMCwgb24xLCB0aGF0ID0gdGhpcywgaWQgPSB0aGF0Ll9pZCwgc2l6ZSA9IHRoYXQuc2l6ZSgp OwogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgIHZh ciBjYW5jZWwgPSB7dmFsdWU6IHJlamVjdH0sCiAgICAgICAgZW5kID0ge3ZhbHVlOiBmdW5jdGlv bigpIHsgaWYgKC0tc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpOyB9fTsKCiAgICB0aGF0LmVhY2goZnVu Y3Rpb24oKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCQxKHRoaXMsIGlkKSwKICAgICAgICAg IG9uID0gc2NoZWR1bGUub247CgogICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0 Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0 ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgIC8vIE90aGVyd2lzZSwg Y29weS1vbi13cml0ZS4KICAgICAgaWYgKG9uICE9PSBvbjApIHsKICAgICAgICBvbjEgPSAob24w ID0gb24pLmNvcHkoKTsKICAgICAgICBvbjEuXy5jYW5jZWwucHVzaChjYW5jZWwpOwogICAgICAg IG9uMS5fLmludGVycnVwdC5wdXNoKGNhbmNlbCk7CiAgICAgICAgb24xLl8uZW5kLnB1c2goZW5k KTsKICAgICAgfQoKICAgICAgc2NoZWR1bGUub24gPSBvbjE7CiAgICB9KTsKICB9KTsKfQoKdmFy IGlkID0gMDsKCmZ1bmN0aW9uIFRyYW5zaXRpb24oZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCkg ewogIHRoaXMuX2dyb3VwcyA9IGdyb3VwczsKICB0aGlzLl9wYXJlbnRzID0gcGFyZW50czsKICB0 aGlzLl9uYW1lID0gbmFtZTsKICB0aGlzLl9pZCA9IGlkOwp9CgpmdW5jdGlvbiB0cmFuc2l0aW9u KG5hbWUpIHsKICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTsKfQoKZnVuY3Rp b24gbmV3SWQoKSB7CiAgcmV0dXJuICsraWQ7Cn0KCnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0g c2VsZWN0aW9uLnByb3RvdHlwZTsKClRyYW5zaXRpb24ucHJvdG90eXBlID0gdHJhbnNpdGlvbi5w cm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sCiAgc2VsZWN0OiB0cmFuc2l0 aW9uX3NlbGVjdCwKICBzZWxlY3RBbGw6IHRyYW5zaXRpb25fc2VsZWN0QWxsLAogIGZpbHRlcjog dHJhbnNpdGlvbl9maWx0ZXIsCiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsCiAgc2VsZWN0aW9u OiB0cmFuc2l0aW9uX3NlbGVjdGlvbiwKICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uX3RyYW5zaXRp b24sCiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLAogIG5vZGVzOiBzZWxlY3Rpb25f cHJvdG90eXBlLm5vZGVzLAogIG5vZGU6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZSwKICBzaXpl OiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsCiAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUu ZW1wdHksCiAgZWFjaDogc2VsZWN0aW9uX3Byb3RvdHlwZS5lYWNoLAogIG9uOiB0cmFuc2l0aW9u X29uLAogIGF0dHI6IHRyYW5zaXRpb25fYXR0ciwKICBhdHRyVHdlZW46IHRyYW5zaXRpb25fYXR0 clR3ZWVuLAogIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLAogIHN0eWxlVHdlZW46IHRyYW5zaXRp b25fc3R5bGVUd2VlbiwKICB0ZXh0OiB0cmFuc2l0aW9uX3RleHQsCiAgdGV4dFR3ZWVuOiB0cmFu c2l0aW9uX3RleHRUd2VlbiwKICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlLAogIHR3ZWVuOiB0 cmFuc2l0aW9uX3R3ZWVuLAogIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LAogIGR1cmF0aW9uOiB0 cmFuc2l0aW9uX2R1cmF0aW9uLAogIGVhc2U6IHRyYW5zaXRpb25fZWFzZSwKICBlbmQ6IHRyYW5z aXRpb25fZW5kCn07CgpmdW5jdGlvbiBsaW5lYXIkMSh0KSB7CiAgcmV0dXJuICt0Owp9CgpmdW5j dGlvbiBxdWFkSW4odCkgewogIHJldHVybiB0ICogdDsKfQoKZnVuY3Rpb24gcXVhZE91dCh0KSB7 CiAgcmV0dXJuIHQgKiAoMiAtIHQpOwp9CgpmdW5jdGlvbiBxdWFkSW5PdXQodCkgewogIHJldHVy biAoKHQgKj0gMikgPD0gMSA/IHQgKiB0IDogLS10ICogKDIgLSB0KSArIDEpIC8gMjsKfQoKZnVu Y3Rpb24gY3ViaWNJbih0KSB7CiAgcmV0dXJuIHQgKiB0ICogdDsKfQoKZnVuY3Rpb24gY3ViaWNP dXQodCkgewogIHJldHVybiAtLXQgKiB0ICogdCArIDE7Cn0KCmZ1bmN0aW9uIGN1YmljSW5PdXQo dCkgewogIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAq IHQgKyAyKSAvIDI7Cn0KCnZhciBleHBvbmVudCA9IDM7Cgp2YXIgcG9seUluID0gKGZ1bmN0aW9u IGN1c3RvbShlKSB7CiAgZSA9ICtlOwoKICBmdW5jdGlvbiBwb2x5SW4odCkgewogICAgcmV0dXJu IE1hdGgucG93KHQsIGUpOwogIH0KCiAgcG9seUluLmV4cG9uZW50ID0gY3VzdG9tOwoKICByZXR1 cm4gcG9seUluOwp9KShleHBvbmVudCk7Cgp2YXIgcG9seU91dCA9IChmdW5jdGlvbiBjdXN0b20o ZSkgewogIGUgPSArZTsKCiAgZnVuY3Rpb24gcG9seU91dCh0KSB7CiAgICByZXR1cm4gMSAtIE1h dGgucG93KDEgLSB0LCBlKTsKICB9CgogIHBvbHlPdXQuZXhwb25lbnQgPSBjdXN0b207CgogIHJl dHVybiBwb2x5T3V0Owp9KShleHBvbmVudCk7Cgp2YXIgcG9seUluT3V0ID0gKGZ1bmN0aW9uIGN1 c3RvbShlKSB7CiAgZSA9ICtlOwoKICBmdW5jdGlvbiBwb2x5SW5PdXQodCkgewogICAgcmV0dXJu ICgodCAqPSAyKSA8PSAxID8gTWF0aC5wb3codCwgZSkgOiAyIC0gTWF0aC5wb3coMiAtIHQsIGUp KSAvIDI7CiAgfQoKICBwb2x5SW5PdXQuZXhwb25lbnQgPSBjdXN0b207CgogIHJldHVybiBwb2x5 SW5PdXQ7Cn0pKGV4cG9uZW50KTsKCnZhciBwaSA9IE1hdGguUEksCiAgICBoYWxmUGkgPSBwaSAv IDI7CgpmdW5jdGlvbiBzaW5Jbih0KSB7CiAgcmV0dXJuIDEgLSBNYXRoLmNvcyh0ICogaGFsZlBp KTsKfQoKZnVuY3Rpb24gc2luT3V0KHQpIHsKICByZXR1cm4gTWF0aC5zaW4odCAqIGhhbGZQaSk7 Cn0KCmZ1bmN0aW9uIHNpbkluT3V0KHQpIHsKICByZXR1cm4gKDEgLSBNYXRoLmNvcyhwaSAqIHQp KSAvIDI7Cn0KCmZ1bmN0aW9uIGV4cEluKHQpIHsKICByZXR1cm4gTWF0aC5wb3coMiwgMTAgKiB0 IC0gMTApOwp9CgpmdW5jdGlvbiBleHBPdXQodCkgewogIHJldHVybiAxIC0gTWF0aC5wb3coMiwg LTEwICogdCk7Cn0KCmZ1bmN0aW9uIGV4cEluT3V0KHQpIHsKICByZXR1cm4gKCh0ICo9IDIpIDw9 IDEgPyBNYXRoLnBvdygyLCAxMCAqIHQgLSAxMCkgOiAyIC0gTWF0aC5wb3coMiwgMTAgLSAxMCAq IHQpKSAvIDI7Cn0KCmZ1bmN0aW9uIGNpcmNsZUluKHQpIHsKICByZXR1cm4gMSAtIE1hdGguc3Fy dCgxIC0gdCAqIHQpOwp9CgpmdW5jdGlvbiBjaXJjbGVPdXQodCkgewogIHJldHVybiBNYXRoLnNx cnQoMSAtIC0tdCAqIHQpOwp9CgpmdW5jdGlvbiBjaXJjbGVJbk91dCh0KSB7CiAgcmV0dXJuICgo dCAqPSAyKSA8PSAxID8gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpIDogTWF0aC5zcXJ0KDEgLSAo dCAtPSAyKSAqIHQpICsgMSkgLyAyOwp9Cgp2YXIgYjEgPSA0IC8gMTEsCiAgICBiMiA9IDYgLyAx MSwKICAgIGIzID0gOCAvIDExLAogICAgYjQgPSAzIC8gNCwKICAgIGI1ID0gOSAvIDExLAogICAg YjYgPSAxMCAvIDExLAogICAgYjcgPSAxNSAvIDE2LAogICAgYjggPSAyMSAvIDIyLAogICAgYjkg PSA2MyAvIDY0LAogICAgYjAgPSAxIC8gYjEgLyBiMTsKCmZ1bmN0aW9uIGJvdW5jZUluKHQpIHsK ICByZXR1cm4gMSAtIGJvdW5jZU91dCgxIC0gdCk7Cn0KCmZ1bmN0aW9uIGJvdW5jZU91dCh0KSB7 CiAgcmV0dXJuICh0ID0gK3QpIDwgYjEgPyBiMCAqIHQgKiB0IDogdCA8IGIzID8gYjAgKiAodCAt PSBiMikgKiB0ICsgYjQgOiB0IDwgYjYgPyBiMCAqICh0IC09IGI1KSAqIHQgKyBiNyA6IGIwICog KHQgLT0gYjgpICogdCArIGI5Owp9CgpmdW5jdGlvbiBib3VuY2VJbk91dCh0KSB7CiAgcmV0dXJu ICgodCAqPSAyKSA8PSAxID8gMSAtIGJvdW5jZU91dCgxIC0gdCkgOiBib3VuY2VPdXQodCAtIDEp ICsgMSkgLyAyOwp9Cgp2YXIgb3ZlcnNob290ID0gMS43MDE1ODsKCnZhciBiYWNrSW4gPSAoZnVu Y3Rpb24gY3VzdG9tKHMpIHsKICBzID0gK3M7CgogIGZ1bmN0aW9uIGJhY2tJbih0KSB7CiAgICBy ZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTsKICB9CgogIGJhY2tJbi5vdmVyc2hvb3Qg PSBjdXN0b207CgogIHJldHVybiBiYWNrSW47Cn0pKG92ZXJzaG9vdCk7Cgp2YXIgYmFja091dCA9 IChmdW5jdGlvbiBjdXN0b20ocykgewogIHMgPSArczsKCiAgZnVuY3Rpb24gYmFja091dCh0KSB7 CiAgICByZXR1cm4gLS10ICogdCAqICgocyArIDEpICogdCArIHMpICsgMTsKICB9CgogIGJhY2tP dXQub3ZlcnNob290ID0gY3VzdG9tOwoKICByZXR1cm4gYmFja091dDsKfSkob3ZlcnNob290KTsK CnZhciBiYWNrSW5PdXQgPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHsKICBzID0gK3M7CgogIGZ1bmN0 aW9uIGJhY2tJbk91dCh0KSB7CiAgICByZXR1cm4gKCh0ICo9IDIpIDwgMSA/IHQgKiB0ICogKChz ICsgMSkgKiB0IC0gcykgOiAodCAtPSAyKSAqIHQgKiAoKHMgKyAxKSAqIHQgKyBzKSArIDIpIC8g MjsKICB9CgogIGJhY2tJbk91dC5vdmVyc2hvb3QgPSBjdXN0b207CgogIHJldHVybiBiYWNrSW5P dXQ7Cn0pKG92ZXJzaG9vdCk7Cgp2YXIgdGF1ID0gMiAqIE1hdGguUEksCiAgICBhbXBsaXR1ZGUg PSAxLAogICAgcGVyaW9kID0gMC4zOwoKdmFyIGVsYXN0aWNJbiA9IChmdW5jdGlvbiBjdXN0b20o YSwgcCkgewogIHZhciBzID0gTWF0aC5hc2luKDEgLyAoYSA9IE1hdGgubWF4KDEsIGEpKSkgKiAo cCAvPSB0YXUpOwoKICBmdW5jdGlvbiBlbGFzdGljSW4odCkgewogICAgcmV0dXJuIGEgKiBNYXRo LnBvdygyLCAxMCAqIC0tdCkgKiBNYXRoLnNpbigocyAtIHQpIC8gcCk7CiAgfQoKICBlbGFzdGlj SW4uYW1wbGl0dWRlID0gZnVuY3Rpb24oYSkgeyByZXR1cm4gY3VzdG9tKGEsIHAgKiB0YXUpOyB9 OwogIGVsYXN0aWNJbi5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7 IH07CgogIHJldHVybiBlbGFzdGljSW47Cn0pKGFtcGxpdHVkZSwgcGVyaW9kKTsKCnZhciBlbGFz dGljT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShhLCBwKSB7CiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAv IChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSk7CgogIGZ1bmN0aW9uIGVsYXN0aWNP dXQodCkgewogICAgcmV0dXJuIDEgLSBhICogTWF0aC5wb3coMiwgLTEwICogKHQgPSArdCkpICog TWF0aC5zaW4oKHQgKyBzKSAvIHApOwogIH0KCiAgZWxhc3RpY091dC5hbXBsaXR1ZGUgPSBmdW5j dGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSk7IH07CiAgZWxhc3RpY091dC5wZXJp b2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7IH07CgogIHJldHVybiBlbGFz dGljT3V0Owp9KShhbXBsaXR1ZGUsIHBlcmlvZCk7Cgp2YXIgZWxhc3RpY0luT3V0ID0gKGZ1bmN0 aW9uIGN1c3RvbShhLCBwKSB7CiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgo MSwgYSkpKSAqIChwIC89IHRhdSk7CgogIGZ1bmN0aW9uIGVsYXN0aWNJbk91dCh0KSB7CiAgICBy ZXR1cm4gKCh0ID0gdCAqIDIgLSAxKSA8IDAKICAgICAgICA/IGEgKiBNYXRoLnBvdygyLCAxMCAq IHQpICogTWF0aC5zaW4oKHMgLSB0KSAvIHApCiAgICAgICAgOiAyIC0gYSAqIE1hdGgucG93KDIs IC0xMCAqIHQpICogTWF0aC5zaW4oKHMgKyB0KSAvIHApKSAvIDI7CiAgfQoKICBlbGFzdGljSW5P dXQuYW1wbGl0dWRlID0gZnVuY3Rpb24oYSkgeyByZXR1cm4gY3VzdG9tKGEsIHAgKiB0YXUpOyB9 OwogIGVsYXN0aWNJbk91dC5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwg cCk7IH07CgogIHJldHVybiBlbGFzdGljSW5PdXQ7Cn0pKGFtcGxpdHVkZSwgcGVyaW9kKTsKCnZh ciBkZWZhdWx0VGltaW5nID0gewogIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuCiAgZGVsYXk6 IDAsCiAgZHVyYXRpb246IDI1MCwKICBlYXNlOiBjdWJpY0luT3V0Cn07CgpmdW5jdGlvbiBpbmhl cml0KG5vZGUsIGlkKSB7CiAgdmFyIHRpbWluZzsKICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9f dHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkgewogICAgaWYgKCEobm9kZSA9 IG5vZGUucGFyZW50Tm9kZSkpIHsKICAgICAgcmV0dXJuIGRlZmF1bHRUaW1pbmcudGltZSA9IG5v dygpLCBkZWZhdWx0VGltaW5nOwogICAgfQogIH0KICByZXR1cm4gdGltaW5nOwp9CgpmdW5jdGlv biBzZWxlY3Rpb25fdHJhbnNpdGlvbihuYW1lKSB7CiAgdmFyIGlkLAogICAgICB0aW1pbmc7Cgog IGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikgewogICAgaWQgPSBuYW1lLl9pZCwgbmFt ZSA9IG5hbWUuX25hbWU7CiAgfSBlbHNlIHsKICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRl ZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBu YW1lICsgIiI7CiAgfQoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91 cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikgewogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91 cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAg IGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZCwg aSwgZ3JvdXAsIHRpbWluZyB8fCBpbmhlcml0KG5vZGUsIGlkKSk7CiAgICAgIH0KICAgIH0KICB9 CgogIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlk KTsKfQoKc2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0 OwpzZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjsK CnZhciByb290JDEgPSBbbnVsbF07CgpmdW5jdGlvbiBhY3RpdmUobm9kZSwgbmFtZSkgewogIHZh ciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwKICAgICAgc2NoZWR1bGUsCiAgICAgIGk7 CgogIGlmIChzY2hlZHVsZXMpIHsKICAgIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFt ZSArICIiOwogICAgZm9yIChpIGluIHNjaGVkdWxlcykgewogICAgICBpZiAoKHNjaGVkdWxlID0g c2NoZWR1bGVzW2ldKS5zdGF0ZSA+IFNDSEVEVUxFRCAmJiBzY2hlZHVsZS5uYW1lID09PSBuYW1l KSB7CiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKFtbbm9kZV1dLCByb290JDEsIG5hbWUs ICtpKTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIGNvbnN0 YW50JDQoeCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn0KCmZ1 bmN0aW9uIEJydXNoRXZlbnQodGFyZ2V0LCB0eXBlLCBzZWxlY3Rpb24pIHsKICB0aGlzLnRhcmdl dCA9IHRhcmdldDsKICB0aGlzLnR5cGUgPSB0eXBlOwogIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0 aW9uOwp9CgpmdW5jdGlvbiBub3Byb3BhZ2F0aW9uJDEoKSB7CiAgZXhwb3J0cy5ldmVudC5zdG9w SW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfQoKZnVuY3Rpb24gbm9ldmVudCQxKCkgewogIGV4cG9y dHMuZXZlbnQucHJldmVudERlZmF1bHQoKTsKICBleHBvcnRzLmV2ZW50LnN0b3BJbW1lZGlhdGVQ cm9wYWdhdGlvbigpOwp9Cgp2YXIgTU9ERV9EUkFHID0ge25hbWU6ICJkcmFnIn0sCiAgICBNT0RF X1NQQUNFID0ge25hbWU6ICJzcGFjZSJ9LAogICAgTU9ERV9IQU5ETEUgPSB7bmFtZTogImhhbmRs ZSJ9LAogICAgTU9ERV9DRU5URVIgPSB7bmFtZTogImNlbnRlciJ9OwoKZnVuY3Rpb24gbnVtYmVy MShlKSB7CiAgcmV0dXJuIFsrZVswXSwgK2VbMV1dOwp9CgpmdW5jdGlvbiBudW1iZXIyKGUpIHsK ICByZXR1cm4gW251bWJlcjEoZVswXSksIG51bWJlcjEoZVsxXSldOwp9CgpmdW5jdGlvbiB0b3Vj aGVyKGlkZW50aWZpZXIpIHsKICByZXR1cm4gZnVuY3Rpb24odGFyZ2V0KSB7CiAgICByZXR1cm4g dG91Y2godGFyZ2V0LCBleHBvcnRzLmV2ZW50LnRvdWNoZXMsIGlkZW50aWZpZXIpOwogIH07Cn0K CnZhciBYID0gewogIG5hbWU6ICJ4IiwKICBoYW5kbGVzOiBbInciLCAiZSJdLm1hcCh0eXBlKSwK ICBpbnB1dDogZnVuY3Rpb24oeCwgZSkgeyByZXR1cm4geCA9PSBudWxsID8gbnVsbCA6IFtbK3hb MF0sIGVbMF1bMV1dLCBbK3hbMV0sIGVbMV1bMV1dXTsgfSwKICBvdXRwdXQ6IGZ1bmN0aW9uKHh5 KSB7IHJldHVybiB4eSAmJiBbeHlbMF1bMF0sIHh5WzFdWzBdXTsgfQp9OwoKdmFyIFkgPSB7CiAg bmFtZTogInkiLAogIGhhbmRsZXM6IFsibiIsICJzIl0ubWFwKHR5cGUpLAogIGlucHV0OiBmdW5j dGlvbih5LCBlKSB7IHJldHVybiB5ID09IG51bGwgPyBudWxsIDogW1tlWzBdWzBdLCAreVswXV0s IFtlWzFdWzBdLCAreVsxXV1dOyB9LAogIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5 ICYmIFt4eVswXVsxXSwgeHlbMV1bMV1dOyB9Cn07Cgp2YXIgWFkgPSB7CiAgbmFtZTogInh5IiwK ICBoYW5kbGVzOiBbIm4iLCAidyIsICJlIiwgInMiLCAibnciLCAibmUiLCAic3ciLCAic2UiXS5t YXAodHlwZSksCiAgaW5wdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSA9PSBudWxsID8gbnVs bCA6IG51bWJlcjIoeHkpOyB9LAogIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5OyB9 Cn07Cgp2YXIgY3Vyc29ycyA9IHsKICBvdmVybGF5OiAiY3Jvc3NoYWlyIiwKICBzZWxlY3Rpb246 ICJtb3ZlIiwKICBuOiAibnMtcmVzaXplIiwKICBlOiAiZXctcmVzaXplIiwKICBzOiAibnMtcmVz aXplIiwKICB3OiAiZXctcmVzaXplIiwKICBudzogIm53c2UtcmVzaXplIiwKICBuZTogIm5lc3ct cmVzaXplIiwKICBzZTogIm53c2UtcmVzaXplIiwKICBzdzogIm5lc3ctcmVzaXplIgp9OwoKdmFy IGZsaXBYID0gewogIGU6ICJ3IiwKICB3OiAiZSIsCiAgbnc6ICJuZSIsCiAgbmU6ICJudyIsCiAg c2U6ICJzdyIsCiAgc3c6ICJzZSIKfTsKCnZhciBmbGlwWSA9IHsKICBuOiAicyIsCiAgczogIm4i LAogIG53OiAic3ciLAogIG5lOiAic2UiLAogIHNlOiAibmUiLAogIHN3OiAibnciCn07Cgp2YXIg c2lnbnNYID0gewogIG92ZXJsYXk6ICsxLAogIHNlbGVjdGlvbjogKzEsCiAgbjogbnVsbCwKICBl OiArMSwKICBzOiBudWxsLAogIHc6IC0xLAogIG53OiAtMSwKICBuZTogKzEsCiAgc2U6ICsxLAog IHN3OiAtMQp9OwoKdmFyIHNpZ25zWSA9IHsKICBvdmVybGF5OiArMSwKICBzZWxlY3Rpb246ICsx LAogIG46IC0xLAogIGU6IG51bGwsCiAgczogKzEsCiAgdzogbnVsbCwKICBudzogLTEsCiAgbmU6 IC0xLAogIHNlOiArMSwKICBzdzogKzEKfTsKCmZ1bmN0aW9uIHR5cGUodCkgewogIHJldHVybiB7 dHlwZTogdH07Cn0KCi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3Bl biB0aGUgY29udGV4dCBtZW51LgpmdW5jdGlvbiBkZWZhdWx0RmlsdGVyJDEoKSB7CiAgcmV0dXJu ICFleHBvcnRzLmV2ZW50LmN0cmxLZXkgJiYgIWV4cG9ydHMuZXZlbnQuYnV0dG9uOwp9CgpmdW5j dGlvbiBkZWZhdWx0RXh0ZW50KCkgewogIHZhciBzdmcgPSB0aGlzLm93bmVyU1ZHRWxlbWVudCB8 fCB0aGlzOwogIGlmIChzdmcuaGFzQXR0cmlidXRlKCJ2aWV3Qm94IikpIHsKICAgIHN2ZyA9IHN2 Zy52aWV3Qm94LmJhc2VWYWw7CiAgICByZXR1cm4gW1tzdmcueCwgc3ZnLnldLCBbc3ZnLnggKyBz dmcud2lkdGgsIHN2Zy55ICsgc3ZnLmhlaWdodF1dOwogIH0KICByZXR1cm4gW1swLCAwXSwgW3N2 Zy53aWR0aC5iYXNlVmFsLnZhbHVlLCBzdmcuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTsKfQoKZnVu Y3Rpb24gZGVmYXVsdFRvdWNoYWJsZSQxKCkgewogIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQ b2ludHMgfHwgKCJvbnRvdWNoc3RhcnQiIGluIHRoaXMpOwp9CgovLyBMaWtlIGQzLmxvY2FsLCBi dXQgd2l0aCB0aGUgbmFtZSDigJxfX2JydXNo4oCdIHJhdGhlciB0aGFuIGF1dG8tZ2VuZXJhdGVk LgpmdW5jdGlvbiBsb2NhbCQxKG5vZGUpIHsKICB3aGlsZSAoIW5vZGUuX19icnVzaCkgaWYgKCEo bm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybjsKICByZXR1cm4gbm9kZS5fX2JydXNoOwp9 CgpmdW5jdGlvbiBlbXB0eSQxKGV4dGVudCkgewogIHJldHVybiBleHRlbnRbMF1bMF0gPT09IGV4 dGVudFsxXVswXQogICAgICB8fCBleHRlbnRbMF1bMV0gPT09IGV4dGVudFsxXVsxXTsKfQoKZnVu Y3Rpb24gYnJ1c2hTZWxlY3Rpb24obm9kZSkgewogIHZhciBzdGF0ZSA9IG5vZGUuX19icnVzaDsK ICByZXR1cm4gc3RhdGUgPyBzdGF0ZS5kaW0ub3V0cHV0KHN0YXRlLnNlbGVjdGlvbikgOiBudWxs Owp9CgpmdW5jdGlvbiBicnVzaFgoKSB7CiAgcmV0dXJuIGJydXNoJDEoWCk7Cn0KCmZ1bmN0aW9u IGJydXNoWSgpIHsKICByZXR1cm4gYnJ1c2gkMShZKTsKfQoKZnVuY3Rpb24gYnJ1c2goKSB7CiAg cmV0dXJuIGJydXNoJDEoWFkpOwp9CgpmdW5jdGlvbiBicnVzaCQxKGRpbSkgewogIHZhciBleHRl bnQgPSBkZWZhdWx0RXh0ZW50LAogICAgICBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyJDEsCiAgICAg IHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUkMSwKICAgICAga2V5cyA9IHRydWUsCiAgICAg IGxpc3RlbmVycyA9IGRpc3BhdGNoKCJzdGFydCIsICJicnVzaCIsICJlbmQiKSwKICAgICAgaGFu ZGxlU2l6ZSA9IDYsCiAgICAgIHRvdWNoZW5kaW5nOwoKICBmdW5jdGlvbiBicnVzaChncm91cCkg ewogICAgdmFyIG92ZXJsYXkgPSBncm91cAogICAgICAgIC5wcm9wZXJ0eSgiX19icnVzaCIsIGlu aXRpYWxpemUpCiAgICAgIC5zZWxlY3RBbGwoIi5vdmVybGF5IikKICAgICAgLmRhdGEoW3R5cGUo Im92ZXJsYXkiKV0pOwoKICAgIG92ZXJsYXkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQogICAgICAg IC5hdHRyKCJjbGFzcyIsICJvdmVybGF5IikKICAgICAgICAuYXR0cigicG9pbnRlci1ldmVudHMi LCAiYWxsIikKICAgICAgICAuYXR0cigiY3Vyc29yIiwgY3Vyc29ycy5vdmVybGF5KQogICAgICAu bWVyZ2Uob3ZlcmxheSkKICAgICAgICAuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBl eHRlbnQgPSBsb2NhbCQxKHRoaXMpLmV4dGVudDsKICAgICAgICAgIHNlbGVjdCh0aGlzKQogICAg ICAgICAgICAgIC5hdHRyKCJ4IiwgZXh0ZW50WzBdWzBdKQogICAgICAgICAgICAgIC5hdHRyKCJ5 IiwgZXh0ZW50WzBdWzFdKQogICAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIGV4dGVudFsxXVsw XSAtIGV4dGVudFswXVswXSkKICAgICAgICAgICAgICAuYXR0cigiaGVpZ2h0IiwgZXh0ZW50WzFd WzFdIC0gZXh0ZW50WzBdWzFdKTsKICAgICAgICB9KTsKCiAgICBncm91cC5zZWxlY3RBbGwoIi5z ZWxlY3Rpb24iKQogICAgICAuZGF0YShbdHlwZSgic2VsZWN0aW9uIildKQogICAgICAuZW50ZXIo KS5hcHBlbmQoInJlY3QiKQogICAgICAgIC5hdHRyKCJjbGFzcyIsICJzZWxlY3Rpb24iKQogICAg ICAgIC5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzLnNlbGVjdGlvbikKICAgICAgICAuYXR0cigiZmls bCIsICIjNzc3IikKICAgICAgICAuYXR0cigiZmlsbC1vcGFjaXR5IiwgMC4zKQogICAgICAgIC5h dHRyKCJzdHJva2UiLCAiI2ZmZiIpCiAgICAgICAgLmF0dHIoInNoYXBlLXJlbmRlcmluZyIsICJj cmlzcEVkZ2VzIik7CgogICAgdmFyIGhhbmRsZSA9IGdyb3VwLnNlbGVjdEFsbCgiLmhhbmRsZSIp CiAgICAgIC5kYXRhKGRpbS5oYW5kbGVzLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGU7IH0p OwoKICAgIGhhbmRsZS5leGl0KCkucmVtb3ZlKCk7CgogICAgaGFuZGxlLmVudGVyKCkuYXBwZW5k KCJyZWN0IikKICAgICAgICAuYXR0cigiY2xhc3MiLCBmdW5jdGlvbihkKSB7IHJldHVybiAiaGFu ZGxlIGhhbmRsZS0tIiArIGQudHlwZTsgfSkKICAgICAgICAuYXR0cigiY3Vyc29yIiwgZnVuY3Rp b24oZCkgeyByZXR1cm4gY3Vyc29yc1tkLnR5cGVdOyB9KTsKCiAgICBncm91cAogICAgICAgIC5l YWNoKHJlZHJhdykKICAgICAgICAuYXR0cigiZmlsbCIsICJub25lIikKICAgICAgICAuYXR0cigi cG9pbnRlci1ldmVudHMiLCAiYWxsIikKICAgICAgICAub24oIm1vdXNlZG93bi5icnVzaCIsIHN0 YXJ0ZWQpCiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKQogICAgICAgIC5vbigidG91Y2hzdGFydC5i cnVzaCIsIHN0YXJ0ZWQpCiAgICAgICAgLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLCB0b3VjaG1vdmVk KQogICAgICAgIC5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLCB0b3VjaGVu ZGVkKQogICAgICAgIC5zdHlsZSgidG91Y2gtYWN0aW9uIiwgIm5vbmUiKQogICAgICAgIC5zdHls ZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwgInJnYmEoMCwwLDAsMCkiKTsKICB9Cgog IGJydXNoLm1vdmUgPSBmdW5jdGlvbihncm91cCwgc2VsZWN0aW9uKSB7CiAgICBpZiAoZ3JvdXAu c2VsZWN0aW9uKSB7CiAgICAgIGdyb3VwCiAgICAgICAgICAub24oInN0YXJ0LmJydXNoIiwgZnVu Y3Rpb24oKSB7IGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KCk7 IH0pCiAgICAgICAgICAub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLCBmdW5jdGlvbigp IHsgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmVuZCgpOyB9KQogICAgICAgICAgLnR3ZWVuKCJi cnVzaCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAg ICAgICAgICBzdGF0ZSA9IHRoYXQuX19icnVzaCwKICAgICAgICAgICAgICAgIGVtaXQgPSBlbWl0 dGVyKHRoYXQsIGFyZ3VtZW50cyksCiAgICAgICAgICAgICAgICBzZWxlY3Rpb24wID0gc3RhdGUu c2VsZWN0aW9uLAogICAgICAgICAgICAgICAgc2VsZWN0aW9uMSA9IGRpbS5pbnB1dCh0eXBlb2Yg c2VsZWN0aW9uID09PSAiZnVuY3Rpb24iID8gc2VsZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50 cykgOiBzZWxlY3Rpb24sIHN0YXRlLmV4dGVudCksCiAgICAgICAgICAgICAgICBpID0gaW50ZXJw b2xhdGVWYWx1ZShzZWxlY3Rpb24wLCBzZWxlY3Rpb24xKTsKCiAgICAgICAgICAgIGZ1bmN0aW9u IHR3ZWVuKHQpIHsKICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSB0ID09PSAxICYmIHNl bGVjdGlvbjEgPT09IG51bGwgPyBudWxsIDogaSh0KTsKICAgICAgICAgICAgICByZWRyYXcuY2Fs bCh0aGF0KTsKICAgICAgICAgICAgICBlbWl0LmJydXNoKCk7CiAgICAgICAgICAgIH0KCiAgICAg ICAgICAgIHJldHVybiBzZWxlY3Rpb24wICE9PSBudWxsICYmIHNlbGVjdGlvbjEgIT09IG51bGwg PyB0d2VlbiA6IHR3ZWVuKDEpOwogICAgICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBncm91 cAogICAgICAgICAgLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhp cywKICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsCiAgICAgICAgICAgICAgICBzdGF0 ZSA9IHRoYXQuX19icnVzaCwKICAgICAgICAgICAgICAgIHNlbGVjdGlvbjEgPSBkaW0uaW5wdXQo dHlwZW9mIHNlbGVjdGlvbiA9PT0gImZ1bmN0aW9uIiA/IHNlbGVjdGlvbi5hcHBseSh0aGF0LCBh cmdzKSA6IHNlbGVjdGlvbiwgc3RhdGUuZXh0ZW50KSwKICAgICAgICAgICAgICAgIGVtaXQgPSBl bWl0dGVyKHRoYXQsIGFyZ3MpLmJlZm9yZXN0YXJ0KCk7CgogICAgICAgICAgICBpbnRlcnJ1cHQo dGhhdCk7CiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjEgPT09IG51bGwg PyBudWxsIDogc2VsZWN0aW9uMTsKICAgICAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAg ICAgICAgIGVtaXQuc3RhcnQoKS5icnVzaCgpLmVuZCgpOwogICAgICAgICAgfSk7CiAgICB9CiAg fTsKCiAgYnJ1c2guY2xlYXIgPSBmdW5jdGlvbihncm91cCkgewogICAgYnJ1c2gubW92ZShncm91 cCwgbnVsbCk7CiAgfTsKCiAgZnVuY3Rpb24gcmVkcmF3KCkgewogICAgdmFyIGdyb3VwID0gc2Vs ZWN0KHRoaXMpLAogICAgICAgIHNlbGVjdGlvbiA9IGxvY2FsJDEodGhpcykuc2VsZWN0aW9uOwoK ICAgIGlmIChzZWxlY3Rpb24pIHsKICAgICAgZ3JvdXAuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikK ICAgICAgICAgIC5zdHlsZSgiZGlzcGxheSIsIG51bGwpCiAgICAgICAgICAuYXR0cigieCIsIHNl bGVjdGlvblswXVswXSkKICAgICAgICAgIC5hdHRyKCJ5Iiwgc2VsZWN0aW9uWzBdWzFdKQogICAg ICAgICAgLmF0dHIoIndpZHRoIiwgc2VsZWN0aW9uWzFdWzBdIC0gc2VsZWN0aW9uWzBdWzBdKQog ICAgICAgICAgLmF0dHIoImhlaWdodCIsIHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsx XSk7CgogICAgICBncm91cC5zZWxlY3RBbGwoIi5oYW5kbGUiKQogICAgICAgICAgLnN0eWxlKCJk aXNwbGF5IiwgbnVsbCkKICAgICAgICAgIC5hdHRyKCJ4IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4g ZC50eXBlW2QudHlwZS5sZW5ndGggLSAxXSA9PT0gImUiID8gc2VsZWN0aW9uWzFdWzBdIC0gaGFu ZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMF0gLSBoYW5kbGVTaXplIC8gMjsgfSkKICAgICAg ICAgIC5hdHRyKCJ5IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlWzBdID09PSAicyIgPyBz ZWxlY3Rpb25bMV1bMV0gLSBoYW5kbGVTaXplIC8gMiA6IHNlbGVjdGlvblswXVsxXSAtIGhhbmRs ZVNpemUgLyAyOyB9KQogICAgICAgICAgLmF0dHIoIndpZHRoIiwgZnVuY3Rpb24oZCkgeyByZXR1 cm4gZC50eXBlID09PSAibiIgfHwgZC50eXBlID09PSAicyIgPyBzZWxlY3Rpb25bMV1bMF0gLSBz ZWxlY3Rpb25bMF1bMF0gKyBoYW5kbGVTaXplIDogaGFuZGxlU2l6ZTsgfSkKICAgICAgICAgIC5h dHRyKCJoZWlnaHQiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09ICJlIiB8fCBkLnR5 cGUgPT09ICJ3IiA/IHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSArIGhhbmRsZVNp emUgOiBoYW5kbGVTaXplOyB9KTsKICAgIH0KCiAgICBlbHNlIHsKICAgICAgZ3JvdXAuc2VsZWN0 QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKQogICAgICAgICAgLnN0eWxlKCJkaXNwbGF5IiwgIm5v bmUiKQogICAgICAgICAgLmF0dHIoIngiLCBudWxsKQogICAgICAgICAgLmF0dHIoInkiLCBudWxs KQogICAgICAgICAgLmF0dHIoIndpZHRoIiwgbnVsbCkKICAgICAgICAgIC5hdHRyKCJoZWlnaHQi LCBudWxsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtaXR0ZXIodGhhdCwgYXJncywgY2xlYW4p IHsKICAgIHJldHVybiAoIWNsZWFuICYmIHRoYXQuX19icnVzaC5lbWl0dGVyKSB8fCBuZXcgRW1p dHRlcih0aGF0LCBhcmdzKTsKICB9CgogIGZ1bmN0aW9uIEVtaXR0ZXIodGhhdCwgYXJncykgewog ICAgdGhpcy50aGF0ID0gdGhhdDsKICAgIHRoaXMuYXJncyA9IGFyZ3M7CiAgICB0aGlzLnN0YXRl ID0gdGhhdC5fX2JydXNoOwogICAgdGhpcy5hY3RpdmUgPSAwOwogIH0KCiAgRW1pdHRlci5wcm90 b3R5cGUgPSB7CiAgICBiZWZvcmVzdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICgrK3RoaXMu YWN0aXZlID09PSAxKSB0aGlzLnN0YXRlLmVtaXR0ZXIgPSB0aGlzLCB0aGlzLnN0YXJ0aW5nID0g dHJ1ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgc3RhcnQ6IGZ1bmN0aW9uKCkgewog ICAgICBpZiAodGhpcy5zdGFydGluZykgdGhpcy5zdGFydGluZyA9IGZhbHNlLCB0aGlzLmVtaXQo InN0YXJ0Iik7CiAgICAgIGVsc2UgdGhpcy5lbWl0KCJicnVzaCIpOwogICAgICByZXR1cm4gdGhp czsKICAgIH0sCiAgICBicnVzaDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuZW1pdCgiYnJ1c2gi KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgZW5kOiBmdW5jdGlvbigpIHsKICAgICAg aWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsIHRoaXMu ZW1pdCgiZW5kIik7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgIGVtaXQ6IGZ1bmN0aW9u KHR5cGUpIHsKICAgICAgY3VzdG9tRXZlbnQobmV3IEJydXNoRXZlbnQoYnJ1c2gsIHR5cGUsIGRp bS5vdXRwdXQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pKSwgbGlzdGVuZXJzLmFwcGx5LCBsaXN0ZW5l cnMsIFt0eXBlLCB0aGlzLnRoYXQsIHRoaXMuYXJnc10pOwogICAgfQogIH07CgogIGZ1bmN0aW9u IHN0YXJ0ZWQoKSB7CiAgICBpZiAodG91Y2hlbmRpbmcgJiYgIWV4cG9ydHMuZXZlbnQudG91Y2hl cykgcmV0dXJuOwogICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJu OwoKICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICB0eXBlID0gZXhwb3J0cy5ldmVudC50YXJn ZXQuX19kYXRhX18udHlwZSwKICAgICAgICBtb2RlID0gKGtleXMgJiYgZXhwb3J0cy5ldmVudC5t ZXRhS2V5ID8gdHlwZSA9ICJvdmVybGF5IiA6IHR5cGUpID09PSAic2VsZWN0aW9uIiA/IE1PREVf RFJBRyA6IChrZXlzICYmIGV4cG9ydHMuZXZlbnQuYWx0S2V5ID8gTU9ERV9DRU5URVIgOiBNT0RF X0hBTkRMRSksCiAgICAgICAgc2lnblggPSBkaW0gPT09IFkgPyBudWxsIDogc2lnbnNYW3R5cGVd LAogICAgICAgIHNpZ25ZID0gZGltID09PSBYID8gbnVsbCA6IHNpZ25zWVt0eXBlXSwKICAgICAg ICBzdGF0ZSA9IGxvY2FsJDEodGhhdCksCiAgICAgICAgZXh0ZW50ID0gc3RhdGUuZXh0ZW50LAog ICAgICAgIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbiwKICAgICAgICBXID0gZXh0ZW50WzBd WzBdLCB3MCwgdzEsCiAgICAgICAgTiA9IGV4dGVudFswXVsxXSwgbjAsIG4xLAogICAgICAgIEUg PSBleHRlbnRbMV1bMF0sIGUwLCBlMSwKICAgICAgICBTID0gZXh0ZW50WzFdWzFdLCBzMCwgczEs CiAgICAgICAgZHggPSAwLAogICAgICAgIGR5ID0gMCwKICAgICAgICBtb3ZpbmcsCiAgICAgICAg c2hpZnRpbmcgPSBzaWduWCAmJiBzaWduWSAmJiBrZXlzICYmIGV4cG9ydHMuZXZlbnQuc2hpZnRL ZXksCiAgICAgICAgbG9ja1gsCiAgICAgICAgbG9ja1ksCiAgICAgICAgcG9pbnRlciA9IGV4cG9y dHMuZXZlbnQudG91Y2hlcyA/IHRvdWNoZXIoZXhwb3J0cy5ldmVudC5jaGFuZ2VkVG91Y2hlc1sw XS5pZGVudGlmaWVyKSA6IG1vdXNlLAogICAgICAgIHBvaW50MCA9IHBvaW50ZXIodGhhdCksCiAg ICAgICAgcG9pbnQgPSBwb2ludDAsCiAgICAgICAgZW1pdCA9IGVtaXR0ZXIodGhhdCwgYXJndW1l bnRzLCB0cnVlKS5iZWZvcmVzdGFydCgpOwoKICAgIGlmICh0eXBlID09PSAib3ZlcmxheSIpIHsK ICAgICAgaWYgKHNlbGVjdGlvbikgbW92aW5nID0gdHJ1ZTsKICAgICAgc3RhdGUuc2VsZWN0aW9u ID0gc2VsZWN0aW9uID0gWwogICAgICAgIFt3MCA9IGRpbSA9PT0gWSA/IFcgOiBwb2ludDBbMF0s IG4wID0gZGltID09PSBYID8gTiA6IHBvaW50MFsxXV0sCiAgICAgICAgW2UwID0gZGltID09PSBZ ID8gRSA6IHcwLCBzMCA9IGRpbSA9PT0gWCA/IFMgOiBuMF0KICAgICAgXTsKICAgIH0gZWxzZSB7 CiAgICAgIHcwID0gc2VsZWN0aW9uWzBdWzBdOwogICAgICBuMCA9IHNlbGVjdGlvblswXVsxXTsK ICAgICAgZTAgPSBzZWxlY3Rpb25bMV1bMF07CiAgICAgIHMwID0gc2VsZWN0aW9uWzFdWzFdOwog ICAgfQoKICAgIHcxID0gdzA7CiAgICBuMSA9IG4wOwogICAgZTEgPSBlMDsKICAgIHMxID0gczA7 CgogICAgdmFyIGdyb3VwID0gc2VsZWN0KHRoYXQpCiAgICAgICAgLmF0dHIoInBvaW50ZXItZXZl bnRzIiwgIm5vbmUiKTsKCiAgICB2YXIgb3ZlcmxheSA9IGdyb3VwLnNlbGVjdEFsbCgiLm92ZXJs YXkiKQogICAgICAgIC5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzW3R5cGVdKTsKCiAgICBpZiAoZXhw b3J0cy5ldmVudC50b3VjaGVzKSB7CiAgICAgIGVtaXQubW92ZWQgPSBtb3ZlZDsKICAgICAgZW1p dC5lbmRlZCA9IGVuZGVkOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHZpZXcgPSBzZWxlY3QoZXhw b3J0cy5ldmVudC52aWV3KQogICAgICAgICAgLm9uKCJtb3VzZW1vdmUuYnJ1c2giLCBtb3ZlZCwg dHJ1ZSkKICAgICAgICAgIC5vbigibW91c2V1cC5icnVzaCIsIGVuZGVkLCB0cnVlKTsKICAgICAg aWYgKGtleXMpIHZpZXcKICAgICAgICAgIC5vbigia2V5ZG93bi5icnVzaCIsIGtleWRvd25lZCwg dHJ1ZSkKICAgICAgICAgIC5vbigia2V5dXAuYnJ1c2giLCBrZXl1cHBlZCwgdHJ1ZSk7CgogICAg ICBkcmFnRGlzYWJsZShleHBvcnRzLmV2ZW50LnZpZXcpOwogICAgfQoKICAgIG5vcHJvcGFnYXRp b24kMSgpOwogICAgaW50ZXJydXB0KHRoYXQpOwogICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICBl bWl0LnN0YXJ0KCk7CgogICAgZnVuY3Rpb24gbW92ZWQoKSB7CiAgICAgIHZhciBwb2ludDEgPSBw b2ludGVyKHRoYXQpOwogICAgICBpZiAoc2hpZnRpbmcgJiYgIWxvY2tYICYmICFsb2NrWSkgewog ICAgICAgIGlmIChNYXRoLmFicyhwb2ludDFbMF0gLSBwb2ludFswXSkgPiBNYXRoLmFicyhwb2lu dDFbMV0gLSBwb2ludFsxXSkpIGxvY2tZID0gdHJ1ZTsKICAgICAgICBlbHNlIGxvY2tYID0gdHJ1 ZTsKICAgICAgfQogICAgICBwb2ludCA9IHBvaW50MTsKICAgICAgbW92aW5nID0gdHJ1ZTsKICAg ICAgbm9ldmVudCQxKCk7CiAgICAgIG1vdmUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3ZlKCkg ewogICAgICB2YXIgdDsKCiAgICAgIGR4ID0gcG9pbnRbMF0gLSBwb2ludDBbMF07CiAgICAgIGR5 ID0gcG9pbnRbMV0gLSBwb2ludDBbMV07CgogICAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgICBj YXNlIE1PREVfU1BBQ0U6CiAgICAgICAgY2FzZSBNT0RFX0RSQUc6IHsKICAgICAgICAgIGlmIChz aWduWCkgZHggPSBNYXRoLm1heChXIC0gdzAsIE1hdGgubWluKEUgLSBlMCwgZHgpKSwgdzEgPSB3 MCArIGR4LCBlMSA9IGUwICsgZHg7CiAgICAgICAgICBpZiAoc2lnblkpIGR5ID0gTWF0aC5tYXgo TiAtIG4wLCBNYXRoLm1pbihTIC0gczAsIGR5KSksIG4xID0gbjAgKyBkeSwgczEgPSBzMCArIGR5 OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgTU9ERV9IQU5ETEU6IHsK ICAgICAgICAgIGlmIChzaWduWCA8IDApIGR4ID0gTWF0aC5tYXgoVyAtIHcwLCBNYXRoLm1pbihF IC0gdzAsIGR4KSksIHcxID0gdzAgKyBkeCwgZTEgPSBlMDsKICAgICAgICAgIGVsc2UgaWYgKHNp Z25YID4gMCkgZHggPSBNYXRoLm1heChXIC0gZTAsIE1hdGgubWluKEUgLSBlMCwgZHgpKSwgdzEg PSB3MCwgZTEgPSBlMCArIGR4OwogICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgZHkgPSBNYXRoLm1h eChOIC0gbjAsIE1hdGgubWluKFMgLSBuMCwgZHkpKSwgbjEgPSBuMCArIGR5LCBzMSA9IHMwOwog ICAgICAgICAgZWxzZSBpZiAoc2lnblkgPiAwKSBkeSA9IE1hdGgubWF4KE4gLSBzMCwgTWF0aC5t aW4oUyAtIHMwLCBkeSkpLCBuMSA9IG4wLCBzMSA9IHMwICsgZHk7CiAgICAgICAgICBicmVhazsK ICAgICAgICB9CiAgICAgICAgY2FzZSBNT0RFX0NFTlRFUjogewogICAgICAgICAgaWYgKHNpZ25Y KSB3MSA9IE1hdGgubWF4KFcsIE1hdGgubWluKEUsIHcwIC0gZHggKiBzaWduWCkpLCBlMSA9IE1h dGgubWF4KFcsIE1hdGgubWluKEUsIGUwICsgZHggKiBzaWduWCkpOwogICAgICAgICAgaWYgKHNp Z25ZKSBuMSA9IE1hdGgubWF4KE4sIE1hdGgubWluKFMsIG4wIC0gZHkgKiBzaWduWSkpLCBzMSA9 IE1hdGgubWF4KE4sIE1hdGgubWluKFMsIHMwICsgZHkgKiBzaWduWSkpOwogICAgICAgICAgYnJl YWs7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoZTEgPCB3MSkgewogICAgICAgIHNpZ25Y ICo9IC0xOwogICAgICAgIHQgPSB3MCwgdzAgPSBlMCwgZTAgPSB0OwogICAgICAgIHQgPSB3MSwg dzEgPSBlMSwgZTEgPSB0OwogICAgICAgIGlmICh0eXBlIGluIGZsaXBYKSBvdmVybGF5LmF0dHIo ImN1cnNvciIsIGN1cnNvcnNbdHlwZSA9IGZsaXBYW3R5cGVdXSk7CiAgICAgIH0KCiAgICAgIGlm IChzMSA8IG4xKSB7CiAgICAgICAgc2lnblkgKj0gLTE7CiAgICAgICAgdCA9IG4wLCBuMCA9IHMw LCBzMCA9IHQ7CiAgICAgICAgdCA9IG4xLCBuMSA9IHMxLCBzMSA9IHQ7CiAgICAgICAgaWYgKHR5 cGUgaW4gZmxpcFkpIG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29yc1t0eXBlID0gZmxpcFlb dHlwZV1dKTsKICAgICAgfQoKICAgICAgaWYgKHN0YXRlLnNlbGVjdGlvbikgc2VsZWN0aW9uID0g c3RhdGUuc2VsZWN0aW9uOyAvLyBNYXkgYmUgc2V0IGJ5IGJydXNoLm1vdmUhCiAgICAgIGlmIChs b2NrWCkgdzEgPSBzZWxlY3Rpb25bMF1bMF0sIGUxID0gc2VsZWN0aW9uWzFdWzBdOwogICAgICBp ZiAobG9ja1kpIG4xID0gc2VsZWN0aW9uWzBdWzFdLCBzMSA9IHNlbGVjdGlvblsxXVsxXTsKCiAg ICAgIGlmIChzZWxlY3Rpb25bMF1bMF0gIT09IHcxCiAgICAgICAgICB8fCBzZWxlY3Rpb25bMF1b MV0gIT09IG4xCiAgICAgICAgICB8fCBzZWxlY3Rpb25bMV1bMF0gIT09IGUxCiAgICAgICAgICB8 fCBzZWxlY3Rpb25bMV1bMV0gIT09IHMxKSB7CiAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gW1t3 MSwgbjFdLCBbZTEsIHMxXV07CiAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgICAgZW1p dC5icnVzaCgpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZW5kZWQoKSB7CiAgICAgIG5v cHJvcGFnYXRpb24kMSgpOwogICAgICBpZiAoZXhwb3J0cy5ldmVudC50b3VjaGVzKSB7CiAgICAg ICAgaWYgKGV4cG9ydHMuZXZlbnQudG91Y2hlcy5sZW5ndGgpIHJldHVybjsKICAgICAgICBpZiAo dG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7CiAgICAgICAgdG91Y2hlbmRp bmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIDUwMCk7 IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCEKICAgICAgfSBlbHNlIHsKICAgICAgICB5ZXNk cmFnKGV4cG9ydHMuZXZlbnQudmlldywgbW92aW5nKTsKICAgICAgICB2aWV3Lm9uKCJrZXlkb3du LmJydXNoIGtleXVwLmJydXNoIG1vdXNlbW92ZS5icnVzaCBtb3VzZXVwLmJydXNoIiwgbnVsbCk7 CiAgICAgIH0KICAgICAgZ3JvdXAuYXR0cigicG9pbnRlci1ldmVudHMiLCAiYWxsIik7CiAgICAg IG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29ycy5vdmVybGF5KTsKICAgICAgaWYgKHN0YXRl LnNlbGVjdGlvbikgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uOyAvLyBNYXkgYmUgc2V0IGJ5 IGJydXNoLm1vdmUgKG9uIHN0YXJ0KSEKICAgICAgaWYgKGVtcHR5JDEoc2VsZWN0aW9uKSkgc3Rh dGUuc2VsZWN0aW9uID0gbnVsbCwgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgIGVtaXQuZW5kKCk7 CiAgICB9CgogICAgZnVuY3Rpb24ga2V5ZG93bmVkKCkgewogICAgICBzd2l0Y2ggKGV4cG9ydHMu ZXZlbnQua2V5Q29kZSkgewogICAgICAgIGNhc2UgMTY6IHsgLy8gU0hJRlQKICAgICAgICAgIHNo aWZ0aW5nID0gc2lnblggJiYgc2lnblk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAg ICAgY2FzZSAxODogeyAvLyBBTFQKICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX0hBTkRMRSkg ewogICAgICAgICAgICBpZiAoc2lnblgpIGUwID0gZTEgLSBkeCAqIHNpZ25YLCB3MCA9IHcxICsg ZHggKiBzaWduWDsKICAgICAgICAgICAgaWYgKHNpZ25ZKSBzMCA9IHMxIC0gZHkgKiBzaWduWSwg bjAgPSBuMSArIGR5ICogc2lnblk7CiAgICAgICAgICAgIG1vZGUgPSBNT0RFX0NFTlRFUjsKICAg ICAgICAgICAgbW92ZSgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQog ICAgICAgIGNhc2UgMzI6IHsgLy8gU1BBQ0U7IHRha2VzIHByaW9yaXR5IG92ZXIgQUxUCiAgICAg ICAgICBpZiAobW9kZSA9PT0gTU9ERV9IQU5ETEUgfHwgbW9kZSA9PT0gTU9ERV9DRU5URVIpIHsK ICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMSAtIGR4OyBlbHNlIGlmIChzaWduWCA+ IDApIHcwID0gdzEgLSBkeDsKICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMSAtIGR5 OyBlbHNlIGlmIChzaWduWSA+IDApIG4wID0gbjEgLSBkeTsKICAgICAgICAgICAgbW9kZSA9IE1P REVfU1BBQ0U7CiAgICAgICAgICAgIG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29ycy5zZWxl Y3Rpb24pOwogICAgICAgICAgICBtb3ZlKCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsK ICAgICAgICB9CiAgICAgICAgZGVmYXVsdDogcmV0dXJuOwogICAgICB9CiAgICAgIG5vZXZlbnQk MSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGtleXVwcGVkKCkgewogICAgICBzd2l0Y2ggKGV4cG9y dHMuZXZlbnQua2V5Q29kZSkgewogICAgICAgIGNhc2UgMTY6IHsgLy8gU0hJRlQKICAgICAgICAg IGlmIChzaGlmdGluZykgewogICAgICAgICAgICBsb2NrWCA9IGxvY2tZID0gc2hpZnRpbmcgPSBm YWxzZTsKICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAg ICAgICAgfQogICAgICAgIGNhc2UgMTg6IHsgLy8gQUxUCiAgICAgICAgICBpZiAobW9kZSA9PT0g TU9ERV9DRU5URVIpIHsKICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMTsgZWxzZSBp ZiAoc2lnblggPiAwKSB3MCA9IHcxOwogICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBzMCA9IHMx OyBlbHNlIGlmIChzaWduWSA+IDApIG4wID0gbjE7CiAgICAgICAgICAgIG1vZGUgPSBNT0RFX0hB TkRMRTsKICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAg ICAgICAgfQogICAgICAgIGNhc2UgMzI6IHsgLy8gU1BBQ0UKICAgICAgICAgIGlmIChtb2RlID09 PSBNT0RFX1NQQUNFKSB7CiAgICAgICAgICAgIGlmIChleHBvcnRzLmV2ZW50LmFsdEtleSkgewog ICAgICAgICAgICAgIGlmIChzaWduWCkgZTAgPSBlMSAtIGR4ICogc2lnblgsIHcwID0gdzEgKyBk eCAqIHNpZ25YOwogICAgICAgICAgICAgIGlmIChzaWduWSkgczAgPSBzMSAtIGR5ICogc2lnblks IG4wID0gbjEgKyBkeSAqIHNpZ25ZOwogICAgICAgICAgICAgIG1vZGUgPSBNT0RFX0NFTlRFUjsK ICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoc2lnblggPCAwKSBlMCA9IGUx OyBlbHNlIGlmIChzaWduWCA+IDApIHcwID0gdzE7CiAgICAgICAgICAgICAgaWYgKHNpZ25ZIDwg MCkgczAgPSBzMTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xOwogICAgICAgICAgICAgIG1v ZGUgPSBNT0RFX0hBTkRMRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdmVybGF5LmF0dHIo ImN1cnNvciIsIGN1cnNvcnNbdHlwZV0pOwogICAgICAgICAgICBtb3ZlKCk7CiAgICAgICAgICB9 CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDogcmV0dXJuOwogICAg ICB9CiAgICAgIG5vZXZlbnQkMSgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG91Y2htb3ZlZCgp IHsKICAgIGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5tb3ZlZCgpOwogIH0KCiAgZnVuY3Rpb24g dG91Y2hlbmRlZCgpIHsKICAgIGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5lbmRlZCgpOwogIH0K CiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHsKICAgIHZhciBzdGF0ZSA9IHRoaXMuX19icnVzaCB8 fCB7c2VsZWN0aW9uOiBudWxsfTsKICAgIHN0YXRlLmV4dGVudCA9IG51bWJlcjIoZXh0ZW50LmFw cGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgc3RhdGUuZGltID0gZGltOwogICAgcmV0dXJuIHN0 YXRlOwogIH0KCiAgYnJ1c2guZXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29u c3RhbnQkNChudW1iZXIyKF8pKSwgYnJ1c2gpIDogZXh0ZW50OwogIH07CgogIGJydXNoLmZpbHRl ciA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9 IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDQoISFfKSwgYnJ1c2gpIDog ZmlsdGVyOwogIH07CgogIGJydXNoLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24i ID8gXyA6IGNvbnN0YW50JDQoISFfKSwgYnJ1c2gpIDogdG91Y2hhYmxlOwogIH07CgogIGJydXNo LmhhbmRsZVNpemUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ IChoYW5kbGVTaXplID0gK18sIGJydXNoKSA6IGhhbmRsZVNpemU7CiAgfTsKCiAgYnJ1c2gua2V5 TW9kaWZpZXJzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAo a2V5cyA9ICEhXywgYnJ1c2gpIDoga2V5czsKICB9OwoKICBicnVzaC5vbiA9IGZ1bmN0aW9uKCkg ewogICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRz KTsKICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gYnJ1c2ggOiB2YWx1ZTsKICB9OwoK ICByZXR1cm4gYnJ1c2g7Cn0KCnZhciBjb3MgPSBNYXRoLmNvczsKdmFyIHNpbiA9IE1hdGguc2lu Owp2YXIgcGkkMSA9IE1hdGguUEk7CnZhciBoYWxmUGkkMSA9IHBpJDEgLyAyOwp2YXIgdGF1JDEg PSBwaSQxICogMjsKdmFyIG1heCQxID0gTWF0aC5tYXg7CgpmdW5jdGlvbiBjb21wYXJlVmFsdWUo Y29tcGFyZSkgewogIHJldHVybiBmdW5jdGlvbihhLCBiKSB7CiAgICByZXR1cm4gY29tcGFyZSgK ICAgICAgYS5zb3VyY2UudmFsdWUgKyBhLnRhcmdldC52YWx1ZSwKICAgICAgYi5zb3VyY2UudmFs dWUgKyBiLnRhcmdldC52YWx1ZQogICAgKTsKICB9Owp9CgpmdW5jdGlvbiBjaG9yZCgpIHsKICB2 YXIgcGFkQW5nbGUgPSAwLAogICAgICBzb3J0R3JvdXBzID0gbnVsbCwKICAgICAgc29ydFN1Ymdy b3VwcyA9IG51bGwsCiAgICAgIHNvcnRDaG9yZHMgPSBudWxsOwoKICBmdW5jdGlvbiBjaG9yZCht YXRyaXgpIHsKICAgIHZhciBuID0gbWF0cml4Lmxlbmd0aCwKICAgICAgICBncm91cFN1bXMgPSBb XSwKICAgICAgICBncm91cEluZGV4ID0gc2VxdWVuY2UobiksCiAgICAgICAgc3ViZ3JvdXBJbmRl eCA9IFtdLAogICAgICAgIGNob3JkcyA9IFtdLAogICAgICAgIGdyb3VwcyA9IGNob3Jkcy5ncm91 cHMgPSBuZXcgQXJyYXkobiksCiAgICAgICAgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG4gKiBuKSwK ICAgICAgICBrLAogICAgICAgIHgsCiAgICAgICAgeDAsCiAgICAgICAgZHgsCiAgICAgICAgaSwK ICAgICAgICBqOwoKICAgIC8vIENvbXB1dGUgdGhlIHN1bS4KICAgIGsgPSAwLCBpID0gLTE7IHdo aWxlICgrK2kgPCBuKSB7CiAgICAgIHggPSAwLCBqID0gLTE7IHdoaWxlICgrK2ogPCBuKSB7CiAg ICAgICAgeCArPSBtYXRyaXhbaV1bal07CiAgICAgIH0KICAgICAgZ3JvdXBTdW1zLnB1c2goeCk7 CiAgICAgIHN1Ymdyb3VwSW5kZXgucHVzaChzZXF1ZW5jZShuKSk7CiAgICAgIGsgKz0geDsKICAg IH0KCiAgICAvLyBTb3J0IGdyb3Vwc+KApgogICAgaWYgKHNvcnRHcm91cHMpIGdyb3VwSW5kZXgu c29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgIHJldHVybiBzb3J0R3JvdXBzKGdyb3VwU3Vtc1th XSwgZ3JvdXBTdW1zW2JdKTsKICAgIH0pOwoKICAgIC8vIFNvcnQgc3ViZ3JvdXBz4oCmCiAgICBp ZiAoc29ydFN1Ymdyb3Vwcykgc3ViZ3JvdXBJbmRleC5mb3JFYWNoKGZ1bmN0aW9uKGQsIGkpIHsK ICAgICAgZC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4gc29ydFN1Ymdyb3Vw cyhtYXRyaXhbaV1bYV0sIG1hdHJpeFtpXVtiXSk7CiAgICAgIH0pOwogICAgfSk7CgogICAgLy8g Q29udmVydCB0aGUgc3VtIHRvIHNjYWxpbmcgZmFjdG9yIGZvciBbMCwgMnBpXS4KICAgIC8vIFRP RE8gQWxsb3cgc3RhcnQgYW5kIGVuZCBhbmdsZSB0byBiZSBzcGVjaWZpZWQ/CiAgICAvLyBUT0RP IEFsbG93IHBhZGRpbmcgdG8gYmUgc3BlY2lmaWVkIGFzIHBlcmNlbnRhZ2U/CiAgICBrID0gbWF4 JDEoMCwgdGF1JDEgLSBwYWRBbmdsZSAqIG4pIC8gazsKICAgIGR4ID0gayA/IHBhZEFuZ2xlIDog dGF1JDEgLyBuOwoKICAgIC8vIENvbXB1dGUgdGhlIHN0YXJ0IGFuZCBlbmQgYW5nbGUgZm9yIGVh Y2ggZ3JvdXAgYW5kIHN1Ymdyb3VwLgogICAgLy8gTm90ZTogT3BlcmEgaGFzIGEgYnVnIHJlb3Jk ZXJpbmcgb2JqZWN0IGxpdGVyYWwgcHJvcGVydGllcyEKICAgIHggPSAwLCBpID0gLTE7IHdoaWxl ICgrK2kgPCBuKSB7CiAgICAgIHgwID0geCwgaiA9IC0xOyB3aGlsZSAoKytqIDwgbikgewogICAg ICAgIHZhciBkaSA9IGdyb3VwSW5kZXhbaV0sCiAgICAgICAgICAgIGRqID0gc3ViZ3JvdXBJbmRl eFtkaV1bal0sCiAgICAgICAgICAgIHYgPSBtYXRyaXhbZGldW2RqXSwKICAgICAgICAgICAgYTAg PSB4LAogICAgICAgICAgICBhMSA9IHggKz0gdiAqIGs7CiAgICAgICAgc3ViZ3JvdXBzW2RqICog biArIGRpXSA9IHsKICAgICAgICAgIGluZGV4OiBkaSwKICAgICAgICAgIHN1YmluZGV4OiBkaiwK ICAgICAgICAgIHN0YXJ0QW5nbGU6IGEwLAogICAgICAgICAgZW5kQW5nbGU6IGExLAogICAgICAg ICAgdmFsdWU6IHYKICAgICAgICB9OwogICAgICB9CiAgICAgIGdyb3Vwc1tkaV0gPSB7CiAgICAg ICAgaW5kZXg6IGRpLAogICAgICAgIHN0YXJ0QW5nbGU6IHgwLAogICAgICAgIGVuZEFuZ2xlOiB4 LAogICAgICAgIHZhbHVlOiBncm91cFN1bXNbZGldCiAgICAgIH07CiAgICAgIHggKz0gZHg7CiAg ICB9CgogICAgLy8gR2VuZXJhdGUgY2hvcmRzIGZvciBlYWNoIChub24tZW1wdHkpIHN1Ymdyb3Vw LXN1Ymdyb3VwIGxpbmsuCiAgICBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGogPSBp IC0gMTsgd2hpbGUgKCsraiA8IG4pIHsKICAgICAgICB2YXIgc291cmNlID0gc3ViZ3JvdXBzW2og KiBuICsgaV0sCiAgICAgICAgICAgIHRhcmdldCA9IHN1Ymdyb3Vwc1tpICogbiArIGpdOwogICAg ICAgIGlmIChzb3VyY2UudmFsdWUgfHwgdGFyZ2V0LnZhbHVlKSB7CiAgICAgICAgICBjaG9yZHMu cHVzaChzb3VyY2UudmFsdWUgPCB0YXJnZXQudmFsdWUKICAgICAgICAgICAgICA/IHtzb3VyY2U6 IHRhcmdldCwgdGFyZ2V0OiBzb3VyY2V9CiAgICAgICAgICAgICAgOiB7c291cmNlOiBzb3VyY2Us IHRhcmdldDogdGFyZ2V0fSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHNv cnRDaG9yZHMgPyBjaG9yZHMuc29ydChzb3J0Q2hvcmRzKSA6IGNob3JkczsKICB9CgogIGNob3Jk LnBhZEFuZ2xlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAo cGFkQW5nbGUgPSBtYXgkMSgwLCBfKSwgY2hvcmQpIDogcGFkQW5nbGU7CiAgfTsKCiAgY2hvcmQu c29ydEdyb3VwcyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8g KHNvcnRHcm91cHMgPSBfLCBjaG9yZCkgOiBzb3J0R3JvdXBzOwogIH07CgogIGNob3JkLnNvcnRT dWJncm91cHMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChz b3J0U3ViZ3JvdXBzID0gXywgY2hvcmQpIDogc29ydFN1Ymdyb3VwczsKICB9OwoKICBjaG9yZC5z b3J0Q2hvcmRzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAo XyA9PSBudWxsID8gc29ydENob3JkcyA9IG51bGwgOiAoc29ydENob3JkcyA9IGNvbXBhcmVWYWx1 ZShfKSkuXyA9IF8sIGNob3JkKSA6IHNvcnRDaG9yZHMgJiYgc29ydENob3Jkcy5fOwogIH07Cgog IHJldHVybiBjaG9yZDsKfQoKdmFyIHNsaWNlJDIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7Cgpm dW5jdGlvbiBjb25zdGFudCQ1KHgpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4g eDsKICB9Owp9Cgp2YXIgcGkkMiA9IE1hdGguUEksCiAgICB0YXUkMiA9IDIgKiBwaSQyLAogICAg ZXBzaWxvbiQxID0gMWUtNiwKICAgIHRhdUVwc2lsb24gPSB0YXUkMiAtIGVwc2lsb24kMTsKCmZ1 bmN0aW9uIFBhdGgoKSB7CiAgdGhpcy5feDAgPSB0aGlzLl95MCA9IC8vIHN0YXJ0IG9mIGN1cnJl bnQgc3VicGF0aAogIHRoaXMuX3gxID0gdGhpcy5feTEgPSBudWxsOyAvLyBlbmQgb2YgY3VycmVu dCBzdWJwYXRoCiAgdGhpcy5fID0gIiI7Cn0KCmZ1bmN0aW9uIHBhdGgoKSB7CiAgcmV0dXJuIG5l dyBQYXRoOwp9CgpQYXRoLnByb3RvdHlwZSA9IHBhdGgucHJvdG90eXBlID0gewogIGNvbnN0cnVj dG9yOiBQYXRoLAogIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgewogICAgdGhpcy5fICs9ICJNIiAr ICh0aGlzLl94MCA9IHRoaXMuX3gxID0gK3gpICsgIiwiICsgKHRoaXMuX3kwID0gdGhpcy5feTEg PSAreSk7CiAgfSwKICBjbG9zZVBhdGg6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuX3gxICE9 PSBudWxsKSB7CiAgICAgIHRoaXMuX3gxID0gdGhpcy5feDAsIHRoaXMuX3kxID0gdGhpcy5feTA7 CiAgICAgIHRoaXMuXyArPSAiWiI7CiAgICB9CiAgfSwKICBsaW5lVG86IGZ1bmN0aW9uKHgsIHkp IHsKICAgIHRoaXMuXyArPSAiTCIgKyAodGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTEg PSAreSk7CiAgfSwKICBxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgsIHkpIHsK ICAgIHRoaXMuXyArPSAiUSIgKyAoK3gxKSArICIsIiArICgreTEpICsgIiwiICsgKHRoaXMuX3gx ID0gK3gpICsgIiwiICsgKHRoaXMuX3kxID0gK3kpOwogIH0sCiAgYmV6aWVyQ3VydmVUbzogZnVu Y3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHsKICAgIHRoaXMuXyArPSAiQyIgKyAoK3gxKSAr ICIsIiArICgreTEpICsgIiwiICsgKCt4MikgKyAiLCIgKyAoK3kyKSArICIsIiArICh0aGlzLl94 MSA9ICt4KSArICIsIiArICh0aGlzLl95MSA9ICt5KTsKICB9LAogIGFyY1RvOiBmdW5jdGlvbih4 MSwgeTEsIHgyLCB5MiwgcikgewogICAgeDEgPSAreDEsIHkxID0gK3kxLCB4MiA9ICt4MiwgeTIg PSAreTIsIHIgPSArcjsKICAgIHZhciB4MCA9IHRoaXMuX3gxLAogICAgICAgIHkwID0gdGhpcy5f eTEsCiAgICAgICAgeDIxID0geDIgLSB4MSwKICAgICAgICB5MjEgPSB5MiAtIHkxLAogICAgICAg IHgwMSA9IHgwIC0geDEsCiAgICAgICAgeTAxID0geTAgLSB5MSwKICAgICAgICBsMDFfMiA9IHgw MSAqIHgwMSArIHkwMSAqIHkwMTsKCiAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJv ci4KICAgIGlmIChyIDwgMCkgdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIgKyBy KTsKCiAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgxLHkxKS4KICAgIGlmICh0 aGlzLl94MSA9PT0gbnVsbCkgewogICAgICB0aGlzLl8gKz0gIk0iICsgKHRoaXMuX3gxID0geDEp ICsgIiwiICsgKHRoaXMuX3kxID0geTEpOwogICAgfQoKICAgIC8vIE9yLCBpcyAoeDEseTEpIGNv aW5jaWRlbnQgd2l0aCAoeDAseTApPyBEbyBub3RoaW5nLgogICAgZWxzZSBpZiAoIShsMDFfMiA+ IGVwc2lsb24kMSkpOwoKICAgIC8vIE9yLCBhcmUgKHgwLHkwKSwgKHgxLHkxKSBhbmQgKHgyLHky KSBjb2xsaW5lYXI/CiAgICAvLyBFcXVpdmFsZW50bHksIGlzICh4MSx5MSkgY29pbmNpZGVudCB3 aXRoICh4Mix5Mik/CiAgICAvLyBPciwgaXMgdGhlIHJhZGl1cyB6ZXJvPyBMaW5lIHRvICh4MSx5 MSkuCiAgICBlbHNlIGlmICghKE1hdGguYWJzKHkwMSAqIHgyMSAtIHkyMSAqIHgwMSkgPiBlcHNp bG9uJDEpIHx8ICFyKSB7CiAgICAgIHRoaXMuXyArPSAiTCIgKyAodGhpcy5feDEgPSB4MSkgKyAi LCIgKyAodGhpcy5feTEgPSB5MSk7CiAgICB9CgogICAgLy8gT3RoZXJ3aXNlLCBkcmF3IGFuIGFy YyEKICAgIGVsc2UgewogICAgICB2YXIgeDIwID0geDIgLSB4MCwKICAgICAgICAgIHkyMCA9IHky IC0geTAsCiAgICAgICAgICBsMjFfMiA9IHgyMSAqIHgyMSArIHkyMSAqIHkyMSwKICAgICAgICAg IGwyMF8yID0geDIwICogeDIwICsgeTIwICogeTIwLAogICAgICAgICAgbDIxID0gTWF0aC5zcXJ0 KGwyMV8yKSwKICAgICAgICAgIGwwMSA9IE1hdGguc3FydChsMDFfMiksCiAgICAgICAgICBsID0g ciAqIE1hdGgudGFuKChwaSQyIC0gTWF0aC5hY29zKChsMjFfMiArIGwwMV8yIC0gbDIwXzIpIC8g KDIgKiBsMjEgKiBsMDEpKSkgLyAyKSwKICAgICAgICAgIHQwMSA9IGwgLyBsMDEsCiAgICAgICAg ICB0MjEgPSBsIC8gbDIxOwoKICAgICAgLy8gSWYgdGhlIHN0YXJ0IHRhbmdlbnQgaXMgbm90IGNv aW5jaWRlbnQgd2l0aCAoeDAseTApLCBsaW5lIHRvLgogICAgICBpZiAoTWF0aC5hYnModDAxIC0g MSkgPiBlcHNpbG9uJDEpIHsKICAgICAgICB0aGlzLl8gKz0gIkwiICsgKHgxICsgdDAxICogeDAx KSArICIsIiArICh5MSArIHQwMSAqIHkwMSk7CiAgICAgIH0KCiAgICAgIHRoaXMuXyArPSAiQSIg KyByICsgIiwiICsgciArICIsMCwwLCIgKyAoKyh5MDEgKiB4MjAgPiB4MDEgKiB5MjApKSArICIs IiArICh0aGlzLl94MSA9IHgxICsgdDIxICogeDIxKSArICIsIiArICh0aGlzLl95MSA9IHkxICsg dDIxICogeTIxKTsKICAgIH0KICB9LAogIGFyYzogZnVuY3Rpb24oeCwgeSwgciwgYTAsIGExLCBj Y3cpIHsKICAgIHggPSAreCwgeSA9ICt5LCByID0gK3IsIGNjdyA9ICEhY2N3OwogICAgdmFyIGR4 ID0gciAqIE1hdGguY29zKGEwKSwKICAgICAgICBkeSA9IHIgKiBNYXRoLnNpbihhMCksCiAgICAg ICAgeDAgPSB4ICsgZHgsCiAgICAgICAgeTAgPSB5ICsgZHksCiAgICAgICAgY3cgPSAxIF4gY2N3 LAogICAgICAgIGRhID0gY2N3ID8gYTAgLSBhMSA6IGExIC0gYTA7CgogICAgLy8gSXMgdGhlIHJh ZGl1cyBuZWdhdGl2ZT8gRXJyb3IuCiAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcigibmVn YXRpdmUgcmFkaXVzOiAiICsgcik7CgogICAgLy8gSXMgdGhpcyBwYXRoIGVtcHR5PyBNb3ZlIHRv ICh4MCx5MCkuCiAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHsKICAgICAgdGhpcy5fICs9ICJN IiArIHgwICsgIiwiICsgeTA7CiAgICB9CgogICAgLy8gT3IsIGlzICh4MCx5MCkgbm90IGNvaW5j aWRlbnQgd2l0aCB0aGUgcHJldmlvdXMgcG9pbnQ/IExpbmUgdG8gKHgwLHkwKS4KICAgIGVsc2Ug aWYgKE1hdGguYWJzKHRoaXMuX3gxIC0geDApID4gZXBzaWxvbiQxIHx8IE1hdGguYWJzKHRoaXMu X3kxIC0geTApID4gZXBzaWxvbiQxKSB7CiAgICAgIHRoaXMuXyArPSAiTCIgKyB4MCArICIsIiAr IHkwOwogICAgfQoKICAgIC8vIElzIHRoaXMgYXJjIGVtcHR5PyBXZeKAmXJlIGRvbmUuCiAgICBp ZiAoIXIpIHJldHVybjsKCiAgICAvLyBEb2VzIHRoZSBhbmdsZSBnbyB0aGUgd3Jvbmcgd2F5PyBG bGlwIHRoZSBkaXJlY3Rpb24uCiAgICBpZiAoZGEgPCAwKSBkYSA9IGRhICUgdGF1JDIgKyB0YXUk MjsKCiAgICAvLyBJcyB0aGlzIGEgY29tcGxldGUgY2lyY2xlPyBEcmF3IHR3byBhcmNzIHRvIGNv bXBsZXRlIHRoZSBjaXJjbGUuCiAgICBpZiAoZGEgPiB0YXVFcHNpbG9uKSB7CiAgICAgIHRoaXMu XyArPSAiQSIgKyByICsgIiwiICsgciArICIsMCwxLCIgKyBjdyArICIsIiArICh4IC0gZHgpICsg IiwiICsgKHkgLSBkeSkgKyAiQSIgKyByICsgIiwiICsgciArICIsMCwxLCIgKyBjdyArICIsIiAr ICh0aGlzLl94MSA9IHgwKSArICIsIiArICh0aGlzLl95MSA9IHkwKTsKICAgIH0KCiAgICAvLyBJ cyB0aGlzIGFyYyBub24tZW1wdHk/IERyYXcgYW4gYXJjIQogICAgZWxzZSBpZiAoZGEgPiBlcHNp bG9uJDEpIHsKICAgICAgdGhpcy5fICs9ICJBIiArIHIgKyAiLCIgKyByICsgIiwwLCIgKyAoKyhk YSA+PSBwaSQyKSkgKyAiLCIgKyBjdyArICIsIiArICh0aGlzLl94MSA9IHggKyByICogTWF0aC5j b3MoYTEpKSArICIsIiArICh0aGlzLl95MSA9IHkgKyByICogTWF0aC5zaW4oYTEpKTsKICAgIH0K ICB9LAogIHJlY3Q6IGZ1bmN0aW9uKHgsIHksIHcsIGgpIHsKICAgIHRoaXMuXyArPSAiTSIgKyAo dGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MCA9IHRoaXMuX3kxID0g K3kpICsgImgiICsgKCt3KSArICJ2IiArICgraCkgKyAiaCIgKyAoLXcpICsgIloiOwogIH0sCiAg dG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuXzsKICB9Cn07CgpmdW5jdGlv biBkZWZhdWx0U291cmNlKGQpIHsKICByZXR1cm4gZC5zb3VyY2U7Cn0KCmZ1bmN0aW9uIGRlZmF1 bHRUYXJnZXQoZCkgewogIHJldHVybiBkLnRhcmdldDsKfQoKZnVuY3Rpb24gZGVmYXVsdFJhZGl1 cyhkKSB7CiAgcmV0dXJuIGQucmFkaXVzOwp9CgpmdW5jdGlvbiBkZWZhdWx0U3RhcnRBbmdsZShk KSB7CiAgcmV0dXJuIGQuc3RhcnRBbmdsZTsKfQoKZnVuY3Rpb24gZGVmYXVsdEVuZEFuZ2xlKGQp IHsKICByZXR1cm4gZC5lbmRBbmdsZTsKfQoKZnVuY3Rpb24gcmliYm9uKCkgewogIHZhciBzb3Vy Y2UgPSBkZWZhdWx0U291cmNlLAogICAgICB0YXJnZXQgPSBkZWZhdWx0VGFyZ2V0LAogICAgICBy YWRpdXMgPSBkZWZhdWx0UmFkaXVzLAogICAgICBzdGFydEFuZ2xlID0gZGVmYXVsdFN0YXJ0QW5n bGUsCiAgICAgIGVuZEFuZ2xlID0gZGVmYXVsdEVuZEFuZ2xlLAogICAgICBjb250ZXh0ID0gbnVs bDsKCiAgZnVuY3Rpb24gcmliYm9uKCkgewogICAgdmFyIGJ1ZmZlciwKICAgICAgICBhcmd2ID0g c2xpY2UkMi5jYWxsKGFyZ3VtZW50cyksCiAgICAgICAgcyA9IHNvdXJjZS5hcHBseSh0aGlzLCBh cmd2KSwKICAgICAgICB0ID0gdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3YpLAogICAgICAgIHNyID0g K3JhZGl1cy5hcHBseSh0aGlzLCAoYXJndlswXSA9IHMsIGFyZ3YpKSwKICAgICAgICBzYTAgPSBz dGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3YpIC0gaGFsZlBpJDEsCiAgICAgICAgc2ExID0gZW5k QW5nbGUuYXBwbHkodGhpcywgYXJndikgLSBoYWxmUGkkMSwKICAgICAgICBzeDAgPSBzciAqIGNv cyhzYTApLAogICAgICAgIHN5MCA9IHNyICogc2luKHNhMCksCiAgICAgICAgdHIgPSArcmFkaXVz LmFwcGx5KHRoaXMsIChhcmd2WzBdID0gdCwgYXJndikpLAogICAgICAgIHRhMCA9IHN0YXJ0QW5n bGUuYXBwbHkodGhpcywgYXJndikgLSBoYWxmUGkkMSwKICAgICAgICB0YTEgPSBlbmRBbmdsZS5h cHBseSh0aGlzLCBhcmd2KSAtIGhhbGZQaSQxOwoKICAgIGlmICghY29udGV4dCkgY29udGV4dCA9 IGJ1ZmZlciA9IHBhdGgoKTsKCiAgICBjb250ZXh0Lm1vdmVUbyhzeDAsIHN5MCk7CiAgICBjb250 ZXh0LmFyYygwLCAwLCBzciwgc2EwLCBzYTEpOwogICAgaWYgKHNhMCAhPT0gdGEwIHx8IHNhMSAh PT0gdGExKSB7IC8vIFRPRE8gc3IgIT09IHRyPwogICAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZl VG8oMCwgMCwgdHIgKiBjb3ModGEwKSwgdHIgKiBzaW4odGEwKSk7CiAgICAgIGNvbnRleHQuYXJj KDAsIDAsIHRyLCB0YTAsIHRhMSk7CiAgICB9CiAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8o MCwgMCwgc3gwLCBzeTApOwogICAgY29udGV4dC5jbG9zZVBhdGgoKTsKCiAgICBpZiAoYnVmZmVy KSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1ZmZlciArICIiIHx8IG51bGw7CiAgfQoKICByaWJi b24ucmFkaXVzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAo cmFkaXVzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNSgrXyksIHJp YmJvbikgOiByYWRpdXM7CiAgfTsKCiAgcmliYm9uLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7 CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFydEFuZ2xlID0gdHlwZW9mIF8gPT09 ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNSgrXyksIHJpYmJvbikgOiBzdGFydEFuZ2xlOwog IH07CgogIHJpYmJvbi5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29u c3RhbnQkNSgrXyksIHJpYmJvbikgOiBlbmRBbmdsZTsKICB9OwoKICByaWJib24uc291cmNlID0g ZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc291cmNlID0gXywg cmliYm9uKSA6IHNvdXJjZTsKICB9OwoKICByaWJib24udGFyZ2V0ID0gZnVuY3Rpb24oXykgewog ICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFyZ2V0ID0gXywgcmliYm9uKSA6IHRhcmdl dDsKICB9OwoKICByaWJib24uY29udGV4dCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1 bWVudHMubGVuZ3RoID8gKChjb250ZXh0ID0gXyA9PSBudWxsID8gbnVsbCA6IF8pLCByaWJib24p IDogY29udGV4dDsKICB9OwoKICByZXR1cm4gcmliYm9uOwp9Cgp2YXIgcHJlZml4ID0gIiQiOwoK ZnVuY3Rpb24gTWFwKCkge30KCk1hcC5wcm90b3R5cGUgPSBtYXAkMS5wcm90b3R5cGUgPSB7CiAg Y29uc3RydWN0b3I6IE1hcCwKICBoYXM6IGZ1bmN0aW9uKGtleSkgewogICAgcmV0dXJuIChwcmVm aXggKyBrZXkpIGluIHRoaXM7CiAgfSwKICBnZXQ6IGZ1bmN0aW9uKGtleSkgewogICAgcmV0dXJu IHRoaXNbcHJlZml4ICsga2V5XTsKICB9LAogIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewog ICAgdGhpc1twcmVmaXggKyBrZXldID0gdmFsdWU7CiAgICByZXR1cm4gdGhpczsKICB9LAogIHJl bW92ZTogZnVuY3Rpb24oa2V5KSB7CiAgICB2YXIgcHJvcGVydHkgPSBwcmVmaXggKyBrZXk7CiAg ICByZXR1cm4gcHJvcGVydHkgaW4gdGhpcyAmJiBkZWxldGUgdGhpc1twcm9wZXJ0eV07CiAgfSwK ICBjbGVhcjogZnVuY3Rpb24oKSB7CiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAo cHJvcGVydHlbMF0gPT09IHByZWZpeCkgZGVsZXRlIHRoaXNbcHJvcGVydHldOwogIH0sCiAga2V5 czogZnVuY3Rpb24oKSB7CiAgICB2YXIga2V5cyA9IFtdOwogICAgZm9yICh2YXIgcHJvcGVydHkg aW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGtleXMucHVzaChwcm9wZXJ0eS5z bGljZSgxKSk7CiAgICByZXR1cm4ga2V5czsKICB9LAogIHZhbHVlczogZnVuY3Rpb24oKSB7CiAg ICB2YXIgdmFsdWVzID0gW107CiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJv cGVydHlbMF0gPT09IHByZWZpeCkgdmFsdWVzLnB1c2godGhpc1twcm9wZXJ0eV0pOwogICAgcmV0 dXJuIHZhbHVlczsKICB9LAogIGVudHJpZXM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGVudHJpZXMg PSBbXTsKICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0g cHJlZml4KSBlbnRyaWVzLnB1c2goe2tleTogcHJvcGVydHkuc2xpY2UoMSksIHZhbHVlOiB0aGlz W3Byb3BlcnR5XX0pOwogICAgcmV0dXJuIGVudHJpZXM7CiAgfSwKICBzaXplOiBmdW5jdGlvbigp IHsKICAgIHZhciBzaXplID0gMDsKICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChw cm9wZXJ0eVswXSA9PT0gcHJlZml4KSArK3NpemU7CiAgICByZXR1cm4gc2l6ZTsKICB9LAogIGVt cHR5OiBmdW5jdGlvbigpIHsKICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9w ZXJ0eVswXSA9PT0gcHJlZml4KSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9LAog IGVhY2g6IGZ1bmN0aW9uKGYpIHsKICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChw cm9wZXJ0eVswXSA9PT0gcHJlZml4KSBmKHRoaXNbcHJvcGVydHldLCBwcm9wZXJ0eS5zbGljZSgx KSwgdGhpcyk7CiAgfQp9OwoKZnVuY3Rpb24gbWFwJDEob2JqZWN0LCBmKSB7CiAgdmFyIG1hcCA9 IG5ldyBNYXA7CgogIC8vIENvcHkgY29uc3RydWN0b3IuCiAgaWYgKG9iamVjdCBpbnN0YW5jZW9m IE1hcCkgb2JqZWN0LmVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkgeyBtYXAuc2V0KGtleSwgdmFs dWUpOyB9KTsKCiAgLy8gSW5kZXggYXJyYXkgYnkgbnVtZXJpYyBpbmRleCBvciBzcGVjaWZpZWQg a2V5IGZ1bmN0aW9uLgogIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkgewogICAgdmFy IGkgPSAtMSwKICAgICAgICBuID0gb2JqZWN0Lmxlbmd0aCwKICAgICAgICBvOwoKICAgIGlmIChm ID09IG51bGwpIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGksIG9iamVjdFtpXSk7CiAgICBlbHNl IHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGYobyA9IG9iamVjdFtpXSwgaSwgb2JqZWN0KSwgbyk7 CiAgfQoKICAvLyBDb252ZXJ0IG9iamVjdCB0byBtYXAuCiAgZWxzZSBpZiAob2JqZWN0KSBmb3Ig KHZhciBrZXkgaW4gb2JqZWN0KSBtYXAuc2V0KGtleSwgb2JqZWN0W2tleV0pOwoKICByZXR1cm4g bWFwOwp9CgpmdW5jdGlvbiBuZXN0KCkgewogIHZhciBrZXlzID0gW10sCiAgICAgIHNvcnRLZXlz ID0gW10sCiAgICAgIHNvcnRWYWx1ZXMsCiAgICAgIHJvbGx1cCwKICAgICAgbmVzdDsKCiAgZnVu Y3Rpb24gYXBwbHkoYXJyYXksIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkgewogICAg aWYgKGRlcHRoID49IGtleXMubGVuZ3RoKSB7CiAgICAgIGlmIChzb3J0VmFsdWVzICE9IG51bGwp IGFycmF5LnNvcnQoc29ydFZhbHVlcyk7CiAgICAgIHJldHVybiByb2xsdXAgIT0gbnVsbCA/IHJv bGx1cChhcnJheSkgOiBhcnJheTsKICAgIH0KCiAgICB2YXIgaSA9IC0xLAogICAgICAgIG4gPSBh cnJheS5sZW5ndGgsCiAgICAgICAga2V5ID0ga2V5c1tkZXB0aCsrXSwKICAgICAgICBrZXlWYWx1 ZSwKICAgICAgICB2YWx1ZSwKICAgICAgICB2YWx1ZXNCeUtleSA9IG1hcCQxKCksCiAgICAgICAg dmFsdWVzLAogICAgICAgIHJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpOwoKICAgIHdoaWxlICgrK2kg PCBuKSB7CiAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXko dmFsdWUgPSBhcnJheVtpXSkgKyAiIikpIHsKICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7CiAg ICAgIH0gZWxzZSB7CiAgICAgICAgdmFsdWVzQnlLZXkuc2V0KGtleVZhbHVlLCBbdmFsdWVdKTsK ICAgICAgfQogICAgfQoKICAgIHZhbHVlc0J5S2V5LmVhY2goZnVuY3Rpb24odmFsdWVzLCBrZXkp IHsKICAgICAgc2V0UmVzdWx0KHJlc3VsdCwga2V5LCBhcHBseSh2YWx1ZXMsIGRlcHRoLCBjcmVh dGVSZXN1bHQsIHNldFJlc3VsdCkpOwogICAgfSk7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9Cgog IGZ1bmN0aW9uIGVudHJpZXMobWFwLCBkZXB0aCkgewogICAgaWYgKCsrZGVwdGggPiBrZXlzLmxl bmd0aCkgcmV0dXJuIG1hcDsKICAgIHZhciBhcnJheSwgc29ydEtleSA9IHNvcnRLZXlzW2RlcHRo IC0gMV07CiAgICBpZiAocm9sbHVwICE9IG51bGwgJiYgZGVwdGggPj0ga2V5cy5sZW5ndGgpIGFy cmF5ID0gbWFwLmVudHJpZXMoKTsKICAgIGVsc2UgYXJyYXkgPSBbXSwgbWFwLmVhY2goZnVuY3Rp b24odiwgaykgeyBhcnJheS5wdXNoKHtrZXk6IGssIHZhbHVlczogZW50cmllcyh2LCBkZXB0aCl9 KTsgfSk7CiAgICByZXR1cm4gc29ydEtleSAhPSBudWxsID8gYXJyYXkuc29ydChmdW5jdGlvbihh LCBiKSB7IHJldHVybiBzb3J0S2V5KGEua2V5LCBiLmtleSk7IH0pIDogYXJyYXk7CiAgfQoKICBy ZXR1cm4gbmVzdCA9IHsKICAgIG9iamVjdDogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGFwcGx5 KGFycmF5LCAwLCBjcmVhdGVPYmplY3QsIHNldE9iamVjdCk7IH0sCiAgICBtYXA6IGZ1bmN0aW9u KGFycmF5KSB7IHJldHVybiBhcHBseShhcnJheSwgMCwgY3JlYXRlTWFwLCBzZXRNYXApOyB9LAog ICAgZW50cmllczogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGVudHJpZXMoYXBwbHkoYXJyYXks IDAsIGNyZWF0ZU1hcCwgc2V0TWFwKSwgMCk7IH0sCiAgICBrZXk6IGZ1bmN0aW9uKGQpIHsga2V5 cy5wdXNoKGQpOyByZXR1cm4gbmVzdDsgfSwKICAgIHNvcnRLZXlzOiBmdW5jdGlvbihvcmRlcikg eyBzb3J0S2V5c1trZXlzLmxlbmd0aCAtIDFdID0gb3JkZXI7IHJldHVybiBuZXN0OyB9LAogICAg c29ydFZhbHVlczogZnVuY3Rpb24ob3JkZXIpIHsgc29ydFZhbHVlcyA9IG9yZGVyOyByZXR1cm4g bmVzdDsgfSwKICAgIHJvbGx1cDogZnVuY3Rpb24oZikgeyByb2xsdXAgPSBmOyByZXR1cm4gbmVz dDsgfQogIH07Cn0KCmZ1bmN0aW9uIGNyZWF0ZU9iamVjdCgpIHsKICByZXR1cm4ge307Cn0KCmZ1 bmN0aW9uIHNldE9iamVjdChvYmplY3QsIGtleSwgdmFsdWUpIHsKICBvYmplY3Rba2V5XSA9IHZh bHVlOwp9CgpmdW5jdGlvbiBjcmVhdGVNYXAoKSB7CiAgcmV0dXJuIG1hcCQxKCk7Cn0KCmZ1bmN0 aW9uIHNldE1hcChtYXAsIGtleSwgdmFsdWUpIHsKICBtYXAuc2V0KGtleSwgdmFsdWUpOwp9Cgpm dW5jdGlvbiBTZXQoKSB7fQoKdmFyIHByb3RvID0gbWFwJDEucHJvdG90eXBlOwoKU2V0LnByb3Rv dHlwZSA9IHNldCQyLnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogU2V0LAogIGhhczogcHJv dG8uaGFzLAogIGFkZDogZnVuY3Rpb24odmFsdWUpIHsKICAgIHZhbHVlICs9ICIiOwogICAgdGhp c1twcmVmaXggKyB2YWx1ZV0gPSB2YWx1ZTsKICAgIHJldHVybiB0aGlzOwogIH0sCiAgcmVtb3Zl OiBwcm90by5yZW1vdmUsCiAgY2xlYXI6IHByb3RvLmNsZWFyLAogIHZhbHVlczogcHJvdG8ua2V5 cywKICBzaXplOiBwcm90by5zaXplLAogIGVtcHR5OiBwcm90by5lbXB0eSwKICBlYWNoOiBwcm90 by5lYWNoCn07CgpmdW5jdGlvbiBzZXQkMihvYmplY3QsIGYpIHsKICB2YXIgc2V0ID0gbmV3IFNl dDsKCiAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2V0KSBv YmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSkgeyBzZXQuYWRkKHZhbHVlKTsgfSk7CgogIC8vIE90 aGVyd2lzZSwgYXNzdW1lIGl04oCZcyBhbiBhcnJheS4KICBlbHNlIGlmIChvYmplY3QpIHsKICAg IHZhciBpID0gLTEsIG4gPSBvYmplY3QubGVuZ3RoOwogICAgaWYgKGYgPT0gbnVsbCkgd2hpbGUg KCsraSA8IG4pIHNldC5hZGQob2JqZWN0W2ldKTsKICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIHNl dC5hZGQoZihvYmplY3RbaV0sIGksIG9iamVjdCkpOwogIH0KCiAgcmV0dXJuIHNldDsKfQoKZnVu Y3Rpb24ga2V5cyhtYXApIHsKICB2YXIga2V5cyA9IFtdOwogIGZvciAodmFyIGtleSBpbiBtYXAp IGtleXMucHVzaChrZXkpOwogIHJldHVybiBrZXlzOwp9CgpmdW5jdGlvbiB2YWx1ZXMobWFwKSB7 CiAgdmFyIHZhbHVlcyA9IFtdOwogIGZvciAodmFyIGtleSBpbiBtYXApIHZhbHVlcy5wdXNoKG1h cFtrZXldKTsKICByZXR1cm4gdmFsdWVzOwp9CgpmdW5jdGlvbiBlbnRyaWVzKG1hcCkgewogIHZh ciBlbnRyaWVzID0gW107CiAgZm9yICh2YXIga2V5IGluIG1hcCkgZW50cmllcy5wdXNoKHtrZXk6 IGtleSwgdmFsdWU6IG1hcFtrZXldfSk7CiAgcmV0dXJuIGVudHJpZXM7Cn0KCnZhciBhcnJheSQy ID0gQXJyYXkucHJvdG90eXBlOwoKdmFyIHNsaWNlJDMgPSBhcnJheSQyLnNsaWNlOwoKZnVuY3Rp b24gYXNjZW5kaW5nJDIoYSwgYikgewogIHJldHVybiBhIC0gYjsKfQoKZnVuY3Rpb24gYXJlYShy aW5nKSB7CiAgdmFyIGkgPSAwLCBuID0gcmluZy5sZW5ndGgsIGFyZWEgPSByaW5nW24gLSAxXVsx XSAqIHJpbmdbMF1bMF0gLSByaW5nW24gLSAxXVswXSAqIHJpbmdbMF1bMV07CiAgd2hpbGUgKCsr aSA8IG4pIGFyZWEgKz0gcmluZ1tpIC0gMV1bMV0gKiByaW5nW2ldWzBdIC0gcmluZ1tpIC0gMV1b MF0gKiByaW5nW2ldWzFdOwogIHJldHVybiBhcmVhOwp9CgpmdW5jdGlvbiBjb25zdGFudCQ2KHgp IHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geDsKICB9Owp9CgpmdW5jdGlvbiBj b250YWlucyhyaW5nLCBob2xlKSB7CiAgdmFyIGkgPSAtMSwgbiA9IGhvbGUubGVuZ3RoLCBjOwog IHdoaWxlICgrK2kgPCBuKSBpZiAoYyA9IHJpbmdDb250YWlucyhyaW5nLCBob2xlW2ldKSkgcmV0 dXJuIGM7CiAgcmV0dXJuIDA7Cn0KCmZ1bmN0aW9uIHJpbmdDb250YWlucyhyaW5nLCBwb2ludCkg ewogIHZhciB4ID0gcG9pbnRbMF0sIHkgPSBwb2ludFsxXSwgY29udGFpbnMgPSAtMTsKICBmb3Ig KHZhciBpID0gMCwgbiA9IHJpbmcubGVuZ3RoLCBqID0gbiAtIDE7IGkgPCBuOyBqID0gaSsrKSB7 CiAgICB2YXIgcGkgPSByaW5nW2ldLCB4aSA9IHBpWzBdLCB5aSA9IHBpWzFdLCBwaiA9IHJpbmdb al0sIHhqID0gcGpbMF0sIHlqID0gcGpbMV07CiAgICBpZiAoc2VnbWVudENvbnRhaW5zKHBpLCBw aiwgcG9pbnQpKSByZXR1cm4gMDsKICAgIGlmICgoKHlpID4geSkgIT09ICh5aiA+IHkpKSAmJiAo KHggPCAoeGogLSB4aSkgKiAoeSAtIHlpKSAvICh5aiAtIHlpKSArIHhpKSkpIGNvbnRhaW5zID0g LWNvbnRhaW5zOwogIH0KICByZXR1cm4gY29udGFpbnM7Cn0KCmZ1bmN0aW9uIHNlZ21lbnRDb250 YWlucyhhLCBiLCBjKSB7CiAgdmFyIGk7IHJldHVybiBjb2xsaW5lYXIoYSwgYiwgYykgJiYgd2l0 aGluKGFbaSA9ICsoYVswXSA9PT0gYlswXSldLCBjW2ldLCBiW2ldKTsKfQoKZnVuY3Rpb24gY29s bGluZWFyKGEsIGIsIGMpIHsKICByZXR1cm4gKGJbMF0gLSBhWzBdKSAqIChjWzFdIC0gYVsxXSkg PT09IChjWzBdIC0gYVswXSkgKiAoYlsxXSAtIGFbMV0pOwp9CgpmdW5jdGlvbiB3aXRoaW4ocCwg cSwgcikgewogIHJldHVybiBwIDw9IHEgJiYgcSA8PSByIHx8IHIgPD0gcSAmJiBxIDw9IHA7Cn0K CmZ1bmN0aW9uIG5vb3AkMSgpIHt9Cgp2YXIgY2FzZXMgPSBbCiAgW10sCiAgW1tbMS4wLCAxLjVd LCBbMC41LCAxLjBdXV0sCiAgW1tbMS41LCAxLjBdLCBbMS4wLCAxLjVdXV0sCiAgW1tbMS41LCAx LjBdLCBbMC41LCAxLjBdXV0sCiAgW1tbMS4wLCAwLjVdLCBbMS41LCAxLjBdXV0sCiAgW1tbMS4w LCAxLjVdLCBbMC41LCAxLjBdXSwgW1sxLjAsIDAuNV0sIFsxLjUsIDEuMF1dXSwKICBbW1sxLjAs IDAuNV0sIFsxLjAsIDEuNV1dXSwKICBbW1sxLjAsIDAuNV0sIFswLjUsIDEuMF1dXSwKICBbW1sw LjUsIDEuMF0sIFsxLjAsIDAuNV1dXSwKICBbW1sxLjAsIDEuNV0sIFsxLjAsIDAuNV1dXSwKICBb W1swLjUsIDEuMF0sIFsxLjAsIDAuNV1dLCBbWzEuNSwgMS4wXSwgWzEuMCwgMS41XV1dLAogIFtb WzEuNSwgMS4wXSwgWzEuMCwgMC41XV1dLAogIFtbWzAuNSwgMS4wXSwgWzEuNSwgMS4wXV1dLAog IFtbWzEuMCwgMS41XSwgWzEuNSwgMS4wXV1dLAogIFtbWzAuNSwgMS4wXSwgWzEuMCwgMS41XV1d LAogIFtdCl07CgpmdW5jdGlvbiBjb250b3VycygpIHsKICB2YXIgZHggPSAxLAogICAgICBkeSA9 IDEsCiAgICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZFN0dXJnZXMsCiAgICAgIHNtb290aCA9IHNt b290aExpbmVhcjsKCiAgZnVuY3Rpb24gY29udG91cnModmFsdWVzKSB7CiAgICB2YXIgdHogPSB0 aHJlc2hvbGQodmFsdWVzKTsKCiAgICAvLyBDb252ZXJ0IG51bWJlciBvZiB0aHJlc2hvbGRzIGlu dG8gdW5pZm9ybSB0aHJlc2hvbGRzLgogICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkgewogICAg ICB2YXIgZG9tYWluID0gZXh0ZW50KHZhbHVlcyksIHN0YXJ0ID0gZG9tYWluWzBdLCBzdG9wID0g ZG9tYWluWzFdOwogICAgICB0eiA9IHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCB0eik7CiAgICAgIHR6 ID0gc2VxdWVuY2UoTWF0aC5mbG9vcihzdGFydCAvIHR6KSAqIHR6LCBNYXRoLmZsb29yKHN0b3Ag LyB0eikgKiB0eiwgdHopOwogICAgfSBlbHNlIHsKICAgICAgdHogPSB0ei5zbGljZSgpLnNvcnQo YXNjZW5kaW5nJDIpOwogICAgfQoKICAgIHJldHVybiB0ei5tYXAoZnVuY3Rpb24odmFsdWUpIHsK ICAgICAgcmV0dXJuIGNvbnRvdXIodmFsdWVzLCB2YWx1ZSk7CiAgICB9KTsKICB9CgogIC8vIEFj Y3VtdWxhdGUsIHNtb290aCBjb250b3VyIHJpbmdzLCBhc3NpZ24gaG9sZXMgdG8gZXh0ZXJpb3Ig cmluZ3MuCiAgLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21ib3N0b2NrL3NoYXBlZmls ZS9ibG9iL3YwLjYuMi9zaHAvcG9seWdvbi5qcwogIGZ1bmN0aW9uIGNvbnRvdXIodmFsdWVzLCB2 YWx1ZSkgewogICAgdmFyIHBvbHlnb25zID0gW10sCiAgICAgICAgaG9sZXMgPSBbXTsKCiAgICBp c29yaW5ncyh2YWx1ZXMsIHZhbHVlLCBmdW5jdGlvbihyaW5nKSB7CiAgICAgIHNtb290aChyaW5n LCB2YWx1ZXMsIHZhbHVlKTsKICAgICAgaWYgKGFyZWEocmluZykgPiAwKSBwb2x5Z29ucy5wdXNo KFtyaW5nXSk7CiAgICAgIGVsc2UgaG9sZXMucHVzaChyaW5nKTsKICAgIH0pOwoKICAgIGhvbGVz LmZvckVhY2goZnVuY3Rpb24oaG9sZSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHBvbHln b25zLmxlbmd0aCwgcG9seWdvbjsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChjb250YWlucygo cG9seWdvbiA9IHBvbHlnb25zW2ldKVswXSwgaG9sZSkgIT09IC0xKSB7CiAgICAgICAgICBwb2x5 Z29uLnB1c2goaG9sZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9 KTsKCiAgICByZXR1cm4gewogICAgICB0eXBlOiAiTXVsdGlQb2x5Z29uIiwKICAgICAgdmFsdWU6 IHZhbHVlLAogICAgICBjb29yZGluYXRlczogcG9seWdvbnMKICAgIH07CiAgfQoKICAvLyBNYXJj aGluZyBzcXVhcmVzIHdpdGggaXNvbGluZXMgc3RpdGNoZWQgaW50byByaW5ncy4KICAvLyBCYXNl ZCBvbiBodHRwczovL2dpdGh1Yi5jb20vdG9wb2pzb24vdG9wb2pzb24tY2xpZW50L2Jsb2IvdjMu MC4wL3NyYy9zdGl0Y2guanMKICBmdW5jdGlvbiBpc29yaW5ncyh2YWx1ZXMsIHZhbHVlLCBjYWxs YmFjaykgewogICAgdmFyIGZyYWdtZW50QnlTdGFydCA9IG5ldyBBcnJheSwKICAgICAgICBmcmFn bWVudEJ5RW5kID0gbmV3IEFycmF5LAogICAgICAgIHgsIHksIHQwLCB0MSwgdDIsIHQzOwoKICAg IC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlIGZpcnN0IHJvdyAoeSA9IC0xLCB0MiA9IHQzID0gMCku CiAgICB4ID0geSA9IC0xOwogICAgdDEgPSB2YWx1ZXNbMF0gPj0gdmFsdWU7CiAgICBjYXNlc1t0 MSA8PCAxXS5mb3JFYWNoKHN0aXRjaCk7CiAgICB3aGlsZSAoKyt4IDwgZHggLSAxKSB7CiAgICAg IHQwID0gdDEsIHQxID0gdmFsdWVzW3ggKyAxXSA+PSB2YWx1ZTsKICAgICAgY2FzZXNbdDAgfCB0 MSA8PCAxXS5mb3JFYWNoKHN0aXRjaCk7CiAgICB9CiAgICBjYXNlc1t0MSA8PCAwXS5mb3JFYWNo KHN0aXRjaCk7CgogICAgLy8gR2VuZXJhbCBjYXNlIGZvciB0aGUgaW50ZXJtZWRpYXRlIHJvd3Mu CiAgICB3aGlsZSAoKyt5IDwgZHkgLSAxKSB7CiAgICAgIHggPSAtMTsKICAgICAgdDEgPSB2YWx1 ZXNbeSAqIGR4ICsgZHhdID49IHZhbHVlOwogICAgICB0MiA9IHZhbHVlc1t5ICogZHhdID49IHZh bHVlOwogICAgICBjYXNlc1t0MSA8PCAxIHwgdDIgPDwgMl0uZm9yRWFjaChzdGl0Y2gpOwogICAg ICB3aGlsZSAoKyt4IDwgZHggLSAxKSB7CiAgICAgICAgdDAgPSB0MSwgdDEgPSB2YWx1ZXNbeSAq IGR4ICsgZHggKyB4ICsgMV0gPj0gdmFsdWU7CiAgICAgICAgdDMgPSB0MiwgdDIgPSB2YWx1ZXNb eSAqIGR4ICsgeCArIDFdID49IHZhbHVlOwogICAgICAgIGNhc2VzW3QwIHwgdDEgPDwgMSB8IHQy IDw8IDIgfCB0MyA8PCAzXS5mb3JFYWNoKHN0aXRjaCk7CiAgICAgIH0KICAgICAgY2FzZXNbdDEg fCB0MiA8PCAzXS5mb3JFYWNoKHN0aXRjaCk7CiAgICB9CgogICAgLy8gU3BlY2lhbCBjYXNlIGZv ciB0aGUgbGFzdCByb3cgKHkgPSBkeSAtIDEsIHQwID0gdDEgPSAwKS4KICAgIHggPSAtMTsKICAg IHQyID0gdmFsdWVzW3kgKiBkeF0gPj0gdmFsdWU7CiAgICBjYXNlc1t0MiA8PCAyXS5mb3JFYWNo KHN0aXRjaCk7CiAgICB3aGlsZSAoKyt4IDwgZHggLSAxKSB7CiAgICAgIHQzID0gdDIsIHQyID0g dmFsdWVzW3kgKiBkeCArIHggKyAxXSA+PSB2YWx1ZTsKICAgICAgY2FzZXNbdDIgPDwgMiB8IHQz IDw8IDNdLmZvckVhY2goc3RpdGNoKTsKICAgIH0KICAgIGNhc2VzW3QyIDw8IDNdLmZvckVhY2go c3RpdGNoKTsKCiAgICBmdW5jdGlvbiBzdGl0Y2gobGluZSkgewogICAgICB2YXIgc3RhcnQgPSBb bGluZVswXVswXSArIHgsIGxpbmVbMF1bMV0gKyB5XSwKICAgICAgICAgIGVuZCA9IFtsaW5lWzFd WzBdICsgeCwgbGluZVsxXVsxXSArIHldLAogICAgICAgICAgc3RhcnRJbmRleCA9IGluZGV4KHN0 YXJ0KSwKICAgICAgICAgIGVuZEluZGV4ID0gaW5kZXgoZW5kKSwKICAgICAgICAgIGYsIGc7CiAg ICAgIGlmIChmID0gZnJhZ21lbnRCeUVuZFtzdGFydEluZGV4XSkgewogICAgICAgIGlmIChnID0g ZnJhZ21lbnRCeVN0YXJ0W2VuZEluZGV4XSkgewogICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlF bmRbZi5lbmRdOwogICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlTdGFydFtnLnN0YXJ0XTsKICAg ICAgICAgIGlmIChmID09PSBnKSB7CiAgICAgICAgICAgIGYucmluZy5wdXNoKGVuZCk7CiAgICAg ICAgICAgIGNhbGxiYWNrKGYucmluZyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBm cmFnbWVudEJ5U3RhcnRbZi5zdGFydF0gPSBmcmFnbWVudEJ5RW5kW2cuZW5kXSA9IHtzdGFydDog Zi5zdGFydCwgZW5kOiBnLmVuZCwgcmluZzogZi5yaW5nLmNvbmNhdChnLnJpbmcpfTsKICAgICAg ICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlFbmRbZi5l bmRdOwogICAgICAgICAgZi5yaW5nLnB1c2goZW5kKTsKICAgICAgICAgIGZyYWdtZW50QnlFbmRb Zi5lbmQgPSBlbmRJbmRleF0gPSBmOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmID0gZnJh Z21lbnRCeVN0YXJ0W2VuZEluZGV4XSkgewogICAgICAgIGlmIChnID0gZnJhZ21lbnRCeUVuZFtz dGFydEluZGV4XSkgewogICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlTdGFydFtmLnN0YXJ0XTsK ICAgICAgICAgIGRlbGV0ZSBmcmFnbWVudEJ5RW5kW2cuZW5kXTsKICAgICAgICAgIGlmIChmID09 PSBnKSB7CiAgICAgICAgICAgIGYucmluZy5wdXNoKGVuZCk7CiAgICAgICAgICAgIGNhbGxiYWNr KGYucmluZyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcmFnbWVudEJ5U3RhcnRb Zy5zdGFydF0gPSBmcmFnbWVudEJ5RW5kW2YuZW5kXSA9IHtzdGFydDogZy5zdGFydCwgZW5kOiBm LmVuZCwgcmluZzogZy5yaW5nLmNvbmNhdChmLnJpbmcpfTsKICAgICAgICAgIH0KICAgICAgICB9 IGVsc2UgewogICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlTdGFydFtmLnN0YXJ0XTsKICAgICAg ICAgIGYucmluZy51bnNoaWZ0KHN0YXJ0KTsKICAgICAgICAgIGZyYWdtZW50QnlTdGFydFtmLnN0 YXJ0ID0gc3RhcnRJbmRleF0gPSBmOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBm cmFnbWVudEJ5U3RhcnRbc3RhcnRJbmRleF0gPSBmcmFnbWVudEJ5RW5kW2VuZEluZGV4XSA9IHtz dGFydDogc3RhcnRJbmRleCwgZW5kOiBlbmRJbmRleCwgcmluZzogW3N0YXJ0LCBlbmRdfTsKICAg ICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5kZXgocG9pbnQpIHsKICAgIHJldHVybiBwb2lu dFswXSAqIDIgKyBwb2ludFsxXSAqIChkeCArIDEpICogNDsKICB9CgogIGZ1bmN0aW9uIHNtb290 aExpbmVhcihyaW5nLCB2YWx1ZXMsIHZhbHVlKSB7CiAgICByaW5nLmZvckVhY2goZnVuY3Rpb24o cG9pbnQpIHsKICAgICAgdmFyIHggPSBwb2ludFswXSwKICAgICAgICAgIHkgPSBwb2ludFsxXSwK ICAgICAgICAgIHh0ID0geCB8IDAsCiAgICAgICAgICB5dCA9IHkgfCAwLAogICAgICAgICAgdjAs CiAgICAgICAgICB2MSA9IHZhbHVlc1t5dCAqIGR4ICsgeHRdOwogICAgICBpZiAoeCA+IDAgJiYg eCA8IGR4ICYmIHh0ID09PSB4KSB7CiAgICAgICAgdjAgPSB2YWx1ZXNbeXQgKiBkeCArIHh0IC0g MV07CiAgICAgICAgcG9pbnRbMF0gPSB4ICsgKHZhbHVlIC0gdjApIC8gKHYxIC0gdjApIC0gMC41 OwogICAgICB9CiAgICAgIGlmICh5ID4gMCAmJiB5IDwgZHkgJiYgeXQgPT09IHkpIHsKICAgICAg ICB2MCA9IHZhbHVlc1soeXQgLSAxKSAqIGR4ICsgeHRdOwogICAgICAgIHBvaW50WzFdID0geSAr ICh2YWx1ZSAtIHYwKSAvICh2MSAtIHYwKSAtIDAuNTsKICAgICAgfQogICAgfSk7CiAgfQoKICBj b250b3Vycy5jb250b3VyID0gY29udG91cjsKCiAgY29udG91cnMuc2l6ZSA9IGZ1bmN0aW9uKF8p IHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFtkeCwgZHldOwogICAgdmFyIF8w ID0gTWF0aC5jZWlsKF9bMF0pLCBfMSA9IE1hdGguY2VpbChfWzFdKTsKICAgIGlmICghKF8wID4g MCkgfHwgIShfMSA+IDApKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2l6ZSIpOwogICAgcmV0 dXJuIGR4ID0gXzAsIGR5ID0gXzEsIGNvbnRvdXJzOwogIH07CgogIGNvbnRvdXJzLnRocmVzaG9s ZHMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aHJlc2hv bGQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBBcnJheS5pc0FycmF5KF8pID8gY29u c3RhbnQkNihzbGljZSQzLmNhbGwoXykpIDogY29uc3RhbnQkNihfKSwgY29udG91cnMpIDogdGhy ZXNob2xkOwogIH07CgogIGNvbnRvdXJzLnNtb290aCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biBhcmd1bWVudHMubGVuZ3RoID8gKHNtb290aCA9IF8gPyBzbW9vdGhMaW5lYXIgOiBub29wJDEs IGNvbnRvdXJzKSA6IHNtb290aCA9PT0gc21vb3RoTGluZWFyOwogIH07CgogIHJldHVybiBjb250 b3VyczsKfQoKLy8gVE9ETyBPcHRpbWl6ZSBlZGdlIGNhc2VzLgovLyBUT0RPIE9wdGltaXplIGlu ZGV4IGNhbGN1bGF0aW9uLgovLyBUT0RPIE9wdGltaXplIGFyZ3VtZW50cy4KZnVuY3Rpb24gYmx1 clgoc291cmNlLCB0YXJnZXQsIHIpIHsKICB2YXIgbiA9IHNvdXJjZS53aWR0aCwKICAgICAgbSA9 IHNvdXJjZS5oZWlnaHQsCiAgICAgIHcgPSAociA8PCAxKSArIDE7CiAgZm9yICh2YXIgaiA9IDA7 IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGkgPSAwLCBzciA9IDA7IGkgPCBuICsgcjsgKytp KSB7CiAgICAgIGlmIChpIDwgbikgewogICAgICAgIHNyICs9IHNvdXJjZS5kYXRhW2kgKyBqICog bl07CiAgICAgIH0KICAgICAgaWYgKGkgPj0gcikgewogICAgICAgIGlmIChpID49IHcpIHsKICAg ICAgICAgIHNyIC09IHNvdXJjZS5kYXRhW2kgLSB3ICsgaiAqIG5dOwogICAgICAgIH0KICAgICAg ICB0YXJnZXQuZGF0YVtpIC0gciArIGogKiBuXSA9IHNyIC8gTWF0aC5taW4oaSArIDEsIG4gLSAx ICsgdyAtIGksIHcpOwogICAgICB9CiAgICB9CiAgfQp9CgovLyBUT0RPIE9wdGltaXplIGVkZ2Ug Y2FzZXMuCi8vIFRPRE8gT3B0aW1pemUgaW5kZXggY2FsY3VsYXRpb24uCi8vIFRPRE8gT3B0aW1p emUgYXJndW1lbnRzLgpmdW5jdGlvbiBibHVyWShzb3VyY2UsIHRhcmdldCwgcikgewogIHZhciBu ID0gc291cmNlLndpZHRoLAogICAgICBtID0gc291cmNlLmhlaWdodCwKICAgICAgdyA9IChyIDw8 IDEpICsgMTsKICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgewogICAgZm9yICh2YXIgaiA9 IDAsIHNyID0gMDsgaiA8IG0gKyByOyArK2opIHsKICAgICAgaWYgKGogPCBtKSB7CiAgICAgICAg c3IgKz0gc291cmNlLmRhdGFbaSArIGogKiBuXTsKICAgICAgfQogICAgICBpZiAoaiA+PSByKSB7 CiAgICAgICAgaWYgKGogPj0gdykgewogICAgICAgICAgc3IgLT0gc291cmNlLmRhdGFbaSArIChq IC0gdykgKiBuXTsKICAgICAgICB9CiAgICAgICAgdGFyZ2V0LmRhdGFbaSArIChqIC0gcikgKiBu XSA9IHNyIC8gTWF0aC5taW4oaiArIDEsIG0gLSAxICsgdyAtIGosIHcpOwogICAgICB9CiAgICB9 CiAgfQp9CgpmdW5jdGlvbiBkZWZhdWx0WChkKSB7CiAgcmV0dXJuIGRbMF07Cn0KCmZ1bmN0aW9u IGRlZmF1bHRZKGQpIHsKICByZXR1cm4gZFsxXTsKfQoKZnVuY3Rpb24gZGVmYXVsdFdlaWdodCgp IHsKICByZXR1cm4gMTsKfQoKZnVuY3Rpb24gZGVuc2l0eSgpIHsKICB2YXIgeCA9IGRlZmF1bHRY LAogICAgICB5ID0gZGVmYXVsdFksCiAgICAgIHdlaWdodCA9IGRlZmF1bHRXZWlnaHQsCiAgICAg IGR4ID0gOTYwLAogICAgICBkeSA9IDUwMCwKICAgICAgciA9IDIwLCAvLyBibHVyIHJhZGl1cwog ICAgICBrID0gMiwgLy8gbG9nMihncmlkIGNlbGwgc2l6ZSkKICAgICAgbyA9IHIgKiAzLCAvLyBn cmlkIG9mZnNldCwgdG8gcGFkIGZvciBibHVyCiAgICAgIG4gPSAoZHggKyBvICogMikgPj4gaywg Ly8gZ3JpZCB3aWR0aAogICAgICBtID0gKGR5ICsgbyAqIDIpID4+IGssIC8vIGdyaWQgaGVpZ2h0 CiAgICAgIHRocmVzaG9sZCA9IGNvbnN0YW50JDYoMjApOwoKICBmdW5jdGlvbiBkZW5zaXR5KGRh dGEpIHsKICAgIHZhciB2YWx1ZXMwID0gbmV3IEZsb2F0MzJBcnJheShuICogbSksCiAgICAgICAg dmFsdWVzMSA9IG5ldyBGbG9hdDMyQXJyYXkobiAqIG0pOwoKICAgIGRhdGEuZm9yRWFjaChmdW5j dGlvbihkLCBpLCBkYXRhKSB7CiAgICAgIHZhciB4aSA9ICgreChkLCBpLCBkYXRhKSArIG8pID4+ IGssCiAgICAgICAgICB5aSA9ICgreShkLCBpLCBkYXRhKSArIG8pID4+IGssCiAgICAgICAgICB3 aSA9ICt3ZWlnaHQoZCwgaSwgZGF0YSk7CiAgICAgIGlmICh4aSA+PSAwICYmIHhpIDwgbiAmJiB5 aSA+PSAwICYmIHlpIDwgbSkgewogICAgICAgIHZhbHVlczBbeGkgKyB5aSAqIG5dICs9IHdpOwog ICAgICB9CiAgICB9KTsKCiAgICAvLyBUT0RPIE9wdGltaXplLgogICAgYmx1clgoe3dpZHRoOiBu LCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczB9LCB7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTog dmFsdWVzMX0sIHIgPj4gayk7CiAgICBibHVyWSh7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTog dmFsdWVzMX0sIHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMwfSwgciA+PiBrKTsK ICAgIGJsdXJYKHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMwfSwge3dpZHRoOiBu LCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczF9LCByID4+IGspOwogICAgYmx1clkoe3dpZHRoOiBu LCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczF9LCB7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTog dmFsdWVzMH0sIHIgPj4gayk7CiAgICBibHVyWCh7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTog dmFsdWVzMH0sIHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMxfSwgciA+PiBrKTsK ICAgIGJsdXJZKHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMxfSwge3dpZHRoOiBu LCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczB9LCByID4+IGspOwoKICAgIHZhciB0eiA9IHRocmVz aG9sZCh2YWx1ZXMwKTsKCiAgICAvLyBDb252ZXJ0IG51bWJlciBvZiB0aHJlc2hvbGRzIGludG8g dW5pZm9ybSB0aHJlc2hvbGRzLgogICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkgewogICAgICB2 YXIgc3RvcCA9IG1heCh2YWx1ZXMwKTsKICAgICAgdHogPSB0aWNrU3RlcCgwLCBzdG9wLCB0eik7 CiAgICAgIHR6ID0gc2VxdWVuY2UoMCwgTWF0aC5mbG9vcihzdG9wIC8gdHopICogdHosIHR6KTsK ICAgICAgdHouc2hpZnQoKTsKICAgIH0KCiAgICByZXR1cm4gY29udG91cnMoKQogICAgICAgIC50 aHJlc2hvbGRzKHR6KQogICAgICAgIC5zaXplKFtuLCBtXSkKICAgICAgKHZhbHVlczApCiAgICAg ICAgLm1hcCh0cmFuc2Zvcm0pOwogIH0KCiAgZnVuY3Rpb24gdHJhbnNmb3JtKGdlb21ldHJ5KSB7 CiAgICBnZW9tZXRyeS52YWx1ZSAqPSBNYXRoLnBvdygyLCAtMiAqIGspOyAvLyBEZW5zaXR5IGlu IHBvaW50cyBwZXIgc3F1YXJlIHBpeGVsLgogICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMuZm9yRWFj aCh0cmFuc2Zvcm1Qb2x5Z29uKTsKICAgIHJldHVybiBnZW9tZXRyeTsKICB9CgogIGZ1bmN0aW9u IHRyYW5zZm9ybVBvbHlnb24oY29vcmRpbmF0ZXMpIHsKICAgIGNvb3JkaW5hdGVzLmZvckVhY2go dHJhbnNmb3JtUmluZyk7CiAgfQoKICBmdW5jdGlvbiB0cmFuc2Zvcm1SaW5nKGNvb3JkaW5hdGVz KSB7CiAgICBjb29yZGluYXRlcy5mb3JFYWNoKHRyYW5zZm9ybVBvaW50KTsKICB9CgogIC8vIFRP RE8gT3B0aW1pemUuCiAgZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnQoY29vcmRpbmF0ZXMpIHsKICAg IGNvb3JkaW5hdGVzWzBdID0gY29vcmRpbmF0ZXNbMF0gKiBNYXRoLnBvdygyLCBrKSAtIG87CiAg ICBjb29yZGluYXRlc1sxXSA9IGNvb3JkaW5hdGVzWzFdICogTWF0aC5wb3coMiwgaykgLSBvOwog IH0KCiAgZnVuY3Rpb24gcmVzaXplKCkgewogICAgbyA9IHIgKiAzOwogICAgbiA9IChkeCArIG8g KiAyKSA+PiBrOwogICAgbSA9IChkeSArIG8gKiAyKSA+PiBrOwogICAgcmV0dXJuIGRlbnNpdHk7 CiAgfQoKICBkZW5zaXR5LnggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNigrXyks IGRlbnNpdHkpIDogeDsKICB9OwoKICBkZW5zaXR5LnkgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1 cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDog Y29uc3RhbnQkNigrXyksIGRlbnNpdHkpIDogeTsKICB9OwoKICBkZW5zaXR5LndlaWdodCA9IGZ1 bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdlaWdodCA9IHR5cGVv ZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDYoK18pLCBkZW5zaXR5KSA6IHdlaWdo dDsKICB9OwoKICBkZW5zaXR5LnNpemUgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50 cy5sZW5ndGgpIHJldHVybiBbZHgsIGR5XTsKICAgIHZhciBfMCA9IE1hdGguY2VpbChfWzBdKSwg XzEgPSBNYXRoLmNlaWwoX1sxXSk7CiAgICBpZiAoIShfMCA+PSAwKSAmJiAhKF8wID49IDApKSB0 aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2l6ZSIpOwogICAgcmV0dXJuIGR4ID0gXzAsIGR5ID0g XzEsIHJlc2l6ZSgpOwogIH07CgogIGRlbnNpdHkuY2VsbFNpemUgPSBmdW5jdGlvbihfKSB7CiAg ICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiAxIDw8IGs7CiAgICBpZiAoISgoXyA9ICtf KSA+PSAxKSkgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNlbGwgc2l6ZSIpOwogICAgcmV0dXJu IGsgPSBNYXRoLmZsb29yKE1hdGgubG9nKF8pIC8gTWF0aC5MTjIpLCByZXNpemUoKTsKICB9OwoK ICBkZW5zaXR5LnRocmVzaG9sZHMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRz Lmxlbmd0aCA/ICh0aHJlc2hvbGQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBBcnJh eS5pc0FycmF5KF8pID8gY29uc3RhbnQkNihzbGljZSQzLmNhbGwoXykpIDogY29uc3RhbnQkNihf KSwgZGVuc2l0eSkgOiB0aHJlc2hvbGQ7CiAgfTsKCiAgZGVuc2l0eS5iYW5kd2lkdGggPSBmdW5j dGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBNYXRoLnNxcnQociAq IChyICsgMSkpOwogICAgaWYgKCEoKF8gPSArXykgPj0gMCkpIHRocm93IG5ldyBFcnJvcigiaW52 YWxpZCBiYW5kd2lkdGgiKTsKICAgIHJldHVybiByID0gTWF0aC5yb3VuZCgoTWF0aC5zcXJ0KDQg KiBfICogXyArIDEpIC0gMSkgLyAyKSwgcmVzaXplKCk7CiAgfTsKCiAgcmV0dXJuIGRlbnNpdHk7 Cn0KCnZhciBFT0wgPSB7fSwKICAgIEVPRiA9IHt9LAogICAgUVVPVEUgPSAzNCwKICAgIE5FV0xJ TkUgPSAxMCwKICAgIFJFVFVSTiA9IDEzOwoKZnVuY3Rpb24gb2JqZWN0Q29udmVydGVyKGNvbHVt bnMpIHsKICByZXR1cm4gbmV3IEZ1bmN0aW9uKCJkIiwgInJldHVybiB7IiArIGNvbHVtbnMubWFw KGZ1bmN0aW9uKG5hbWUsIGkpIHsKICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShuYW1lKSArICI6 IGRbIiArIGkgKyAiXSB8fCBcIlwiIjsKICB9KS5qb2luKCIsIikgKyAifSIpOwp9CgpmdW5jdGlv biBjdXN0b21Db252ZXJ0ZXIoY29sdW1ucywgZikgewogIHZhciBvYmplY3QgPSBvYmplY3RDb252 ZXJ0ZXIoY29sdW1ucyk7CiAgcmV0dXJuIGZ1bmN0aW9uKHJvdywgaSkgewogICAgcmV0dXJuIGYo b2JqZWN0KHJvdyksIGksIGNvbHVtbnMpOwogIH07Cn0KCi8vIENvbXB1dGUgdW5pcXVlIGNvbHVt bnMgaW4gb3JkZXIgb2YgZGlzY292ZXJ5LgpmdW5jdGlvbiBpbmZlckNvbHVtbnMocm93cykgewog IHZhciBjb2x1bW5TZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpLAogICAgICBjb2x1bW5zID0gW107 CgogIHJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHsKICAgIGZvciAodmFyIGNvbHVtbiBpbiBy b3cpIHsKICAgICAgaWYgKCEoY29sdW1uIGluIGNvbHVtblNldCkpIHsKICAgICAgICBjb2x1bW5z LnB1c2goY29sdW1uU2V0W2NvbHVtbl0gPSBjb2x1bW4pOwogICAgICB9CiAgICB9CiAgfSk7Cgog IHJldHVybiBjb2x1bW5zOwp9CgpmdW5jdGlvbiBwYWQodmFsdWUsIHdpZHRoKSB7CiAgdmFyIHMg PSB2YWx1ZSArICIiLCBsZW5ndGggPSBzLmxlbmd0aDsKICByZXR1cm4gbGVuZ3RoIDwgd2lkdGgg PyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKDApICsgcyA6IHM7Cn0KCmZ1bmN0 aW9uIGZvcm1hdFllYXIoeWVhcikgewogIHJldHVybiB5ZWFyIDwgMCA/ICItIiArIHBhZCgteWVh ciwgNikKICAgIDogeWVhciA+IDk5OTkgPyAiKyIgKyBwYWQoeWVhciwgNikKICAgIDogcGFkKHll YXIsIDQpOwp9CgpmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUpIHsKICB2YXIgaG91cnMgPSBkYXRl LmdldFVUQ0hvdXJzKCksCiAgICAgIG1pbnV0ZXMgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKSwKICAg ICAgc2Vjb25kcyA9IGRhdGUuZ2V0VVRDU2Vjb25kcygpLAogICAgICBtaWxsaXNlY29uZHMgPSBk YXRlLmdldFVUQ01pbGxpc2Vjb25kcygpOwogIHJldHVybiBpc05hTihkYXRlKSA/ICJJbnZhbGlk IERhdGUiCiAgICAgIDogZm9ybWF0WWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpICsgIi0iICsg cGFkKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEsIDIpICsgIi0iICsgcGFkKGRhdGUuZ2V0VVRDRGF0 ZSgpLCAyKQogICAgICArIChtaWxsaXNlY29uZHMgPyAiVCIgKyBwYWQoaG91cnMsIDIpICsgIjoi ICsgcGFkKG1pbnV0ZXMsIDIpICsgIjoiICsgcGFkKHNlY29uZHMsIDIpICsgIi4iICsgcGFkKG1p bGxpc2Vjb25kcywgMykgKyAiWiIKICAgICAgOiBzZWNvbmRzID8gIlQiICsgcGFkKGhvdXJzLCAy KSArICI6IiArIHBhZChtaW51dGVzLCAyKSArICI6IiArIHBhZChzZWNvbmRzLCAyKSArICJaIgog ICAgICA6IG1pbnV0ZXMgfHwgaG91cnMgPyAiVCIgKyBwYWQoaG91cnMsIDIpICsgIjoiICsgcGFk KG1pbnV0ZXMsIDIpICsgIloiCiAgICAgIDogIiIpOwp9CgpmdW5jdGlvbiBkc3ZGb3JtYXQoZGVs aW1pdGVyKSB7CiAgdmFyIHJlRm9ybWF0ID0gbmV3IFJlZ0V4cCgiW1wiIiArIGRlbGltaXRlciAr ICJcblxyXSIpLAogICAgICBERUxJTUlURVIgPSBkZWxpbWl0ZXIuY2hhckNvZGVBdCgwKTsKCiAg ZnVuY3Rpb24gcGFyc2UodGV4dCwgZikgewogICAgdmFyIGNvbnZlcnQsIGNvbHVtbnMsIHJvd3Mg PSBwYXJzZVJvd3ModGV4dCwgZnVuY3Rpb24ocm93LCBpKSB7CiAgICAgIGlmIChjb252ZXJ0KSBy ZXR1cm4gY29udmVydChyb3csIGkgLSAxKTsKICAgICAgY29sdW1ucyA9IHJvdywgY29udmVydCA9 IGYgPyBjdXN0b21Db252ZXJ0ZXIocm93LCBmKSA6IG9iamVjdENvbnZlcnRlcihyb3cpOwogICAg fSk7CiAgICByb3dzLmNvbHVtbnMgPSBjb2x1bW5zIHx8IFtdOwogICAgcmV0dXJuIHJvd3M7CiAg fQoKICBmdW5jdGlvbiBwYXJzZVJvd3ModGV4dCwgZikgewogICAgdmFyIHJvd3MgPSBbXSwgLy8g b3V0cHV0IHJvd3MKICAgICAgICBOID0gdGV4dC5sZW5ndGgsCiAgICAgICAgSSA9IDAsIC8vIGN1 cnJlbnQgY2hhcmFjdGVyIGluZGV4CiAgICAgICAgbiA9IDAsIC8vIGN1cnJlbnQgbGluZSBudW1i ZXIKICAgICAgICB0LCAvLyBjdXJyZW50IHRva2VuCiAgICAgICAgZW9mID0gTiA8PSAwLCAvLyBj dXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPRj8KICAgICAgICBlb2wgPSBmYWxzZTsgLy8gY3Vy cmVudCB0b2tlbiBmb2xsb3dlZCBieSBFT0w/CgogICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIG5l d2xpbmUuCiAgICBpZiAodGV4dC5jaGFyQ29kZUF0KE4gLSAxKSA9PT0gTkVXTElORSkgLS1OOwog ICAgaWYgKHRleHQuY2hhckNvZGVBdChOIC0gMSkgPT09IFJFVFVSTikgLS1OOwoKICAgIGZ1bmN0 aW9uIHRva2VuKCkgewogICAgICBpZiAoZW9mKSByZXR1cm4gRU9GOwogICAgICBpZiAoZW9sKSBy ZXR1cm4gZW9sID0gZmFsc2UsIEVPTDsKCiAgICAgIC8vIFVuZXNjYXBlIHF1b3Rlcy4KICAgICAg dmFyIGksIGogPSBJLCBjOwogICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGopID09PSBRVU9URSkg ewogICAgICAgIHdoaWxlIChJKysgPCBOICYmIHRleHQuY2hhckNvZGVBdChJKSAhPT0gUVVPVEUg fHwgdGV4dC5jaGFyQ29kZUF0KCsrSSkgPT09IFFVT1RFKTsKICAgICAgICBpZiAoKGkgPSBJKSA+ PSBOKSBlb2YgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKChjID0gdGV4dC5jaGFyQ29kZUF0KEkr KykpID09PSBORVdMSU5FKSBlb2wgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKGMgPT09IFJFVFVS TikgeyBlb2wgPSB0cnVlOyBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSBORVdMSU5FKSArK0k7 IH0KICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqICsgMSwgaSAtIDEpLnJlcGxhY2UoLyIiL2cs ICJcIiIpOwogICAgICB9CgogICAgICAvLyBGaW5kIG5leHQgZGVsaW1pdGVyIG9yIG5ld2xpbmUu CiAgICAgIHdoaWxlIChJIDwgTikgewogICAgICAgIGlmICgoYyA9IHRleHQuY2hhckNvZGVBdChp ID0gSSsrKSkgPT09IE5FV0xJTkUpIGVvbCA9IHRydWU7CiAgICAgICAgZWxzZSBpZiAoYyA9PT0g UkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUp ICsrSTsgfQogICAgICAgIGVsc2UgaWYgKGMgIT09IERFTElNSVRFUikgY29udGludWU7CiAgICAg ICAgcmV0dXJuIHRleHQuc2xpY2UoaiwgaSk7CiAgICAgIH0KCiAgICAgIC8vIFJldHVybiBsYXN0 IHRva2VuIGJlZm9yZSBFT0YuCiAgICAgIHJldHVybiBlb2YgPSB0cnVlLCB0ZXh0LnNsaWNlKGos IE4pOwogICAgfQoKICAgIHdoaWxlICgodCA9IHRva2VuKCkpICE9PSBFT0YpIHsKICAgICAgdmFy IHJvdyA9IFtdOwogICAgICB3aGlsZSAodCAhPT0gRU9MICYmIHQgIT09IEVPRikgcm93LnB1c2go dCksIHQgPSB0b2tlbigpOwogICAgICBpZiAoZiAmJiAocm93ID0gZihyb3csIG4rKykpID09IG51 bGwpIGNvbnRpbnVlOwogICAgICByb3dzLnB1c2gocm93KTsKICAgIH0KCiAgICByZXR1cm4gcm93 czsKICB9CgogIGZ1bmN0aW9uIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykgewogICAgcmV0 dXJuIHJvd3MubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVu Y3Rpb24oY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKHJvd1tjb2x1bW5dKTsK ICAgICAgfSkuam9pbihkZWxpbWl0ZXIpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXQo cm93cywgY29sdW1ucykgewogICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgY29sdW1ucyA9IGluZmVy Q29sdW1ucyhyb3dzKTsKICAgIHJldHVybiBbY29sdW1ucy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4o ZGVsaW1pdGVyKV0uY29uY2F0KHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykpLmpvaW4oIlxu Iik7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpIHsKICAgIGlmIChj b2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7CiAgICByZXR1cm4g cHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKS5qb2luKCJcbiIpOwogIH0KCiAgZnVuY3Rpb24g Zm9ybWF0Um93cyhyb3dzKSB7CiAgICByZXR1cm4gcm93cy5tYXAoZm9ybWF0Um93KS5qb2luKCJc biIpOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0Um93KHJvdykgewogICAgcmV0dXJuIHJvdy5tYXAo Zm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFZhbHVl KHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiCiAgICAgICAgOiB2YWx1ZSBp bnN0YW5jZW9mIERhdGUgPyBmb3JtYXREYXRlKHZhbHVlKQogICAgICAgIDogcmVGb3JtYXQudGVz dCh2YWx1ZSArPSAiIikgPyAiXCIiICsgdmFsdWUucmVwbGFjZSgvIi9nLCAiXCJcIiIpICsgIlwi IgogICAgICAgIDogdmFsdWU7CiAgfQoKICByZXR1cm4gewogICAgcGFyc2U6IHBhcnNlLAogICAg cGFyc2VSb3dzOiBwYXJzZVJvd3MsCiAgICBmb3JtYXQ6IGZvcm1hdCwKICAgIGZvcm1hdEJvZHk6 IGZvcm1hdEJvZHksCiAgICBmb3JtYXRSb3dzOiBmb3JtYXRSb3dzLAogICAgZm9ybWF0Um93OiBm b3JtYXRSb3csCiAgICBmb3JtYXRWYWx1ZTogZm9ybWF0VmFsdWUKICB9Owp9Cgp2YXIgY3N2ID0g ZHN2Rm9ybWF0KCIsIik7Cgp2YXIgY3N2UGFyc2UgPSBjc3YucGFyc2U7CnZhciBjc3ZQYXJzZVJv d3MgPSBjc3YucGFyc2VSb3dzOwp2YXIgY3N2Rm9ybWF0ID0gY3N2LmZvcm1hdDsKdmFyIGNzdkZv cm1hdEJvZHkgPSBjc3YuZm9ybWF0Qm9keTsKdmFyIGNzdkZvcm1hdFJvd3MgPSBjc3YuZm9ybWF0 Um93czsKdmFyIGNzdkZvcm1hdFJvdyA9IGNzdi5mb3JtYXRSb3c7CnZhciBjc3ZGb3JtYXRWYWx1 ZSA9IGNzdi5mb3JtYXRWYWx1ZTsKCnZhciB0c3YgPSBkc3ZGb3JtYXQoIlx0Iik7Cgp2YXIgdHN2 UGFyc2UgPSB0c3YucGFyc2U7CnZhciB0c3ZQYXJzZVJvd3MgPSB0c3YucGFyc2VSb3dzOwp2YXIg dHN2Rm9ybWF0ID0gdHN2LmZvcm1hdDsKdmFyIHRzdkZvcm1hdEJvZHkgPSB0c3YuZm9ybWF0Qm9k eTsKdmFyIHRzdkZvcm1hdFJvd3MgPSB0c3YuZm9ybWF0Um93czsKdmFyIHRzdkZvcm1hdFJvdyA9 IHRzdi5mb3JtYXRSb3c7CnZhciB0c3ZGb3JtYXRWYWx1ZSA9IHRzdi5mb3JtYXRWYWx1ZTsKCmZ1 bmN0aW9uIGF1dG9UeXBlKG9iamVjdCkgewogIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHsKICAg IHZhciB2YWx1ZSA9IG9iamVjdFtrZXldLnRyaW0oKSwgbnVtYmVyLCBtOwogICAgaWYgKCF2YWx1 ZSkgdmFsdWUgPSBudWxsOwogICAgZWxzZSBpZiAodmFsdWUgPT09ICJ0cnVlIikgdmFsdWUgPSB0 cnVlOwogICAgZWxzZSBpZiAodmFsdWUgPT09ICJmYWxzZSIpIHZhbHVlID0gZmFsc2U7CiAgICBl bHNlIGlmICh2YWx1ZSA9PT0gIk5hTiIpIHZhbHVlID0gTmFOOwogICAgZWxzZSBpZiAoIWlzTmFO KG51bWJlciA9ICt2YWx1ZSkpIHZhbHVlID0gbnVtYmVyOwogICAgZWxzZSBpZiAobSA9IHZhbHVl Lm1hdGNoKC9eKFstK11cZHsyfSk/XGR7NH0oLVxkezJ9KC1cZHsyfSk/KT8oVFxkezJ9OlxkezJ9 KDpcZHsyfShcLlxkezN9KT8pPyhafFstK11cZHsyfTpcZHsyfSk/KT8kLykpIHsKICAgICAgaWYg KGZpeHR6ICYmICEhbVs0XSAmJiAhbVs3XSkgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC8tL2csICIv IikucmVwbGFjZSgvVC8sICIgIik7CiAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpOwogICAg fQogICAgZWxzZSBjb250aW51ZTsKICAgIG9iamVjdFtrZXldID0gdmFsdWU7CiAgfQogIHJldHVy biBvYmplY3Q7Cn0KCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1kc3YvaXNzdWVzLzQ1CnZh ciBmaXh0eiA9IG5ldyBEYXRlKCIyMDE5LTAxLTAxVDAwOjAwIikuZ2V0SG91cnMoKSB8fCBuZXcg RGF0ZSgiMjAxOS0wNy0wMVQwMDowMCIpLmdldEhvdXJzKCk7CgpmdW5jdGlvbiByZXNwb25zZUJs b2IocmVzcG9uc2UpIHsKICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9u c2Uuc3RhdHVzICsgIiAiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7CiAgcmV0dXJuIHJlc3BvbnNl LmJsb2IoKTsKfQoKZnVuY3Rpb24gYmxvYihpbnB1dCwgaW5pdCkgewogIHJldHVybiBmZXRjaChp bnB1dCwgaW5pdCkudGhlbihyZXNwb25zZUJsb2IpOwp9CgpmdW5jdGlvbiByZXNwb25zZUFycmF5 QnVmZmVyKHJlc3BvbnNlKSB7CiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJl c3BvbnNlLnN0YXR1cyArICIgIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpOwogIHJldHVybiByZXNw b25zZS5hcnJheUJ1ZmZlcigpOwp9CgpmdW5jdGlvbiBidWZmZXIoaW5wdXQsIGluaXQpIHsKICBy ZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VBcnJheUJ1ZmZlcik7Cn0KCmZ1 bmN0aW9uIHJlc3BvbnNlVGV4dChyZXNwb25zZSkgewogIGlmICghcmVzcG9uc2Uub2spIHRocm93 IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyAiICIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTsK ICByZXR1cm4gcmVzcG9uc2UudGV4dCgpOwp9CgpmdW5jdGlvbiB0ZXh0KGlucHV0LCBpbml0KSB7 CiAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlVGV4dCk7Cn0KCmZ1bmN0 aW9uIGRzdlBhcnNlKHBhcnNlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBpbml0LCByb3cp IHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBpbml0ID09PSAiZnVu Y3Rpb24iKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkOwogICAgcmV0dXJuIHRleHQoaW5w dXQsIGluaXQpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgcmV0dXJuIHBhcnNlKHJl c3BvbnNlLCByb3cpOwogICAgfSk7CiAgfTsKfQoKZnVuY3Rpb24gZHN2KGRlbGltaXRlciwgaW5w dXQsIGluaXQsIHJvdykgewogIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBp bml0ID09PSAiZnVuY3Rpb24iKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkOwogIHZhciBm b3JtYXQgPSBkc3ZGb3JtYXQoZGVsaW1pdGVyKTsKICByZXR1cm4gdGV4dChpbnB1dCwgaW5pdCku dGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgcmV0dXJuIGZvcm1hdC5wYXJzZShyZXNwb25z ZSwgcm93KTsKICB9KTsKfQoKdmFyIGNzdiQxID0gZHN2UGFyc2UoY3N2UGFyc2UpOwp2YXIgdHN2 JDEgPSBkc3ZQYXJzZSh0c3ZQYXJzZSk7CgpmdW5jdGlvbiBpbWFnZShpbnB1dCwgaW5pdCkgewog IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgIHZhciBp bWFnZSA9IG5ldyBJbWFnZTsKICAgIGZvciAodmFyIGtleSBpbiBpbml0KSBpbWFnZVtrZXldID0g aW5pdFtrZXldOwogICAgaW1hZ2Uub25lcnJvciA9IHJlamVjdDsKICAgIGltYWdlLm9ubG9hZCA9 IGZ1bmN0aW9uKCkgeyByZXNvbHZlKGltYWdlKTsgfTsKICAgIGltYWdlLnNyYyA9IGlucHV0Owog IH0pOwp9CgpmdW5jdGlvbiByZXNwb25zZUpzb24ocmVzcG9uc2UpIHsKICBpZiAoIXJlc3BvbnNl Lm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgIiAiICsgcmVzcG9uc2Uuc3Rh dHVzVGV4dCk7CiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTsKfQoKZnVuY3Rpb24ganNvbihpbnB1 dCwgaW5pdCkgewogIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdCkudGhlbihyZXNwb25zZUpzb24p Owp9CgpmdW5jdGlvbiBwYXJzZXIodHlwZSkgewogIHJldHVybiBmdW5jdGlvbihpbnB1dCwgaW5p dCkgIHsKICAgIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHRleHQpIHsK ICAgICAgcmV0dXJuIChuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcodGV4dCwgdHlwZSk7 CiAgICB9KTsKICB9Owp9Cgp2YXIgeG1sID0gcGFyc2VyKCJhcHBsaWNhdGlvbi94bWwiKTsKCnZh ciBodG1sID0gcGFyc2VyKCJ0ZXh0L2h0bWwiKTsKCnZhciBzdmcgPSBwYXJzZXIoImltYWdlL3N2 Zyt4bWwiKTsKCmZ1bmN0aW9uIGNlbnRlciQxKHgsIHkpIHsKICB2YXIgbm9kZXM7CgogIGlmICh4 ID09IG51bGwpIHggPSAwOwogIGlmICh5ID09IG51bGwpIHkgPSAwOwoKICBmdW5jdGlvbiBmb3Jj ZSgpIHsKICAgIHZhciBpLAogICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgICAgbm9kZSwK ICAgICAgICBzeCA9IDAsCiAgICAgICAgc3kgPSAwOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuOyAr K2kpIHsKICAgICAgbm9kZSA9IG5vZGVzW2ldLCBzeCArPSBub2RlLngsIHN5ICs9IG5vZGUueTsK ICAgIH0KCiAgICBmb3IgKHN4ID0gc3ggLyBuIC0geCwgc3kgPSBzeSAvIG4gLSB5LCBpID0gMDsg aSA8IG47ICsraSkgewogICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueCAtPSBzeCwgbm9kZS55 IC09IHN5OwogICAgfQogIH0KCiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8pIHsKICAg IG5vZGVzID0gXzsKICB9OwoKICBmb3JjZS54ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFy Z3VtZW50cy5sZW5ndGggPyAoeCA9ICtfLCBmb3JjZSkgOiB4OwogIH07CgogIGZvcmNlLnkgPSBm dW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gK18sIGZvcmNl KSA6IHk7CiAgfTsKCiAgcmV0dXJuIGZvcmNlOwp9CgpmdW5jdGlvbiBjb25zdGFudCQ3KHgpIHsK ICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geDsKICB9Owp9CgpmdW5jdGlvbiBqaWdn bGUoKSB7CiAgcmV0dXJuIChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDFlLTY7Cn0KCmZ1bmN0aW9u IHRyZWVfYWRkKGQpIHsKICB2YXIgeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCksCiAgICAgIHkg PSArdGhpcy5feS5jYWxsKG51bGwsIGQpOwogIHJldHVybiBhZGQodGhpcy5jb3Zlcih4LCB5KSwg eCwgeSwgZCk7Cn0KCmZ1bmN0aW9uIGFkZCh0cmVlLCB4LCB5LCBkKSB7CiAgaWYgKGlzTmFOKHgp IHx8IGlzTmFOKHkpKSByZXR1cm4gdHJlZTsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzCgogIHZh ciBwYXJlbnQsCiAgICAgIG5vZGUgPSB0cmVlLl9yb290LAogICAgICBsZWFmID0ge2RhdGE6IGR9 LAogICAgICB4MCA9IHRyZWUuX3gwLAogICAgICB5MCA9IHRyZWUuX3kwLAogICAgICB4MSA9IHRy ZWUuX3gxLAogICAgICB5MSA9IHRyZWUuX3kxLAogICAgICB4bSwKICAgICAgeW0sCiAgICAgIHhw LAogICAgICB5cCwKICAgICAgcmlnaHQsCiAgICAgIGJvdHRvbSwKICAgICAgaSwKICAgICAgajsK CiAgLy8gSWYgdGhlIHRyZWUgaXMgZW1wdHksIGluaXRpYWxpemUgdGhlIHJvb3QgYXMgYSBsZWFm LgogIGlmICghbm9kZSkgcmV0dXJuIHRyZWUuX3Jvb3QgPSBsZWFmLCB0cmVlOwoKICAvLyBGaW5k IHRoZSBleGlzdGluZyBsZWFmIGZvciB0aGUgbmV3IHBvaW50LCBvciBhZGQgaXQuCiAgd2hpbGUg KG5vZGUubGVuZ3RoKSB7CiAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIp KSB4MCA9IHhtOyBlbHNlIHgxID0geG07CiAgICBpZiAoYm90dG9tID0geSA+PSAoeW0gPSAoeTAg KyB5MSkgLyAyKSkgeTAgPSB5bTsgZWxzZSB5MSA9IHltOwogICAgaWYgKHBhcmVudCA9IG5vZGUs ICEobm9kZSA9IG5vZGVbaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHRdKSkgcmV0dXJuIHBhcmVudFtp XSA9IGxlYWYsIHRyZWU7CiAgfQoKICAvLyBJcyB0aGUgbmV3IHBvaW50IGlzIGV4YWN0bHkgY29p bmNpZGVudCB3aXRoIHRoZSBleGlzdGluZyBwb2ludD8KICB4cCA9ICt0cmVlLl94LmNhbGwobnVs bCwgbm9kZS5kYXRhKTsKICB5cCA9ICt0cmVlLl95LmNhbGwobnVsbCwgbm9kZS5kYXRhKTsKICBp ZiAoeCA9PT0geHAgJiYgeSA9PT0geXApIHJldHVybiBsZWFmLm5leHQgPSBub2RlLCBwYXJlbnQg PyBwYXJlbnRbaV0gPSBsZWFmIDogdHJlZS5fcm9vdCA9IGxlYWYsIHRyZWU7CgogIC8vIE90aGVy d2lzZSwgc3BsaXQgdGhlIGxlYWYgbm9kZSB1bnRpbCB0aGUgb2xkIGFuZCBuZXcgcG9pbnQgYXJl IHNlcGFyYXRlZC4KICBkbyB7CiAgICBwYXJlbnQgPSBwYXJlbnQgPyBwYXJlbnRbaV0gPSBuZXcg QXJyYXkoNCkgOiB0cmVlLl9yb290ID0gbmV3IEFycmF5KDQpOwogICAgaWYgKHJpZ2h0ID0geCA+ PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtOwogICAgaWYgKGJv dHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTsK ICB9IHdoaWxlICgoaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHQpID09PSAoaiA9ICh5cCA+PSB5bSkg PDwgMSB8ICh4cCA+PSB4bSkpKTsKICByZXR1cm4gcGFyZW50W2pdID0gbm9kZSwgcGFyZW50W2ld ID0gbGVhZiwgdHJlZTsKfQoKZnVuY3Rpb24gYWRkQWxsKGRhdGEpIHsKICB2YXIgZCwgaSwgbiA9 IGRhdGEubGVuZ3RoLAogICAgICB4LAogICAgICB5LAogICAgICB4eiA9IG5ldyBBcnJheShuKSwK ICAgICAgeXogPSBuZXcgQXJyYXkobiksCiAgICAgIHgwID0gSW5maW5pdHksCiAgICAgIHkwID0g SW5maW5pdHksCiAgICAgIHgxID0gLUluZmluaXR5LAogICAgICB5MSA9IC1JbmZpbml0eTsKCiAg Ly8gQ29tcHV0ZSB0aGUgcG9pbnRzIGFuZCB0aGVpciBleHRlbnQuCiAgZm9yIChpID0gMDsgaSA8 IG47ICsraSkgewogICAgaWYgKGlzTmFOKHggPSArdGhpcy5feC5jYWxsKG51bGwsIGQgPSBkYXRh W2ldKSkgfHwgaXNOYU4oeSA9ICt0aGlzLl95LmNhbGwobnVsbCwgZCkpKSBjb250aW51ZTsKICAg IHh6W2ldID0geDsKICAgIHl6W2ldID0geTsKICAgIGlmICh4IDwgeDApIHgwID0geDsKICAgIGlm ICh4ID4geDEpIHgxID0geDsKICAgIGlmICh5IDwgeTApIHkwID0geTsKICAgIGlmICh5ID4geTEp IHkxID0geTsKICB9CgogIC8vIElmIHRoZXJlIHdlcmUgbm8gKHZhbGlkKSBwb2ludHMsIGFib3J0 LgogIGlmICh4MCA+IHgxIHx8IHkwID4geTEpIHJldHVybiB0aGlzOwoKICAvLyBFeHBhbmQgdGhl IHRyZWUgdG8gY292ZXIgdGhlIG5ldyBwb2ludHMuCiAgdGhpcy5jb3Zlcih4MCwgeTApLmNvdmVy KHgxLCB5MSk7CgogIC8vIEFkZCB0aGUgbmV3IHBvaW50cy4KICBmb3IgKGkgPSAwOyBpIDwgbjsg KytpKSB7CiAgICBhZGQodGhpcywgeHpbaV0sIHl6W2ldLCBkYXRhW2ldKTsKICB9CgogIHJldHVy biB0aGlzOwp9CgpmdW5jdGlvbiB0cmVlX2NvdmVyKHgsIHkpIHsKICBpZiAoaXNOYU4oeCA9ICt4 KSB8fCBpc05hTih5ID0gK3kpKSByZXR1cm4gdGhpczsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRz CgogIHZhciB4MCA9IHRoaXMuX3gwLAogICAgICB5MCA9IHRoaXMuX3kwLAogICAgICB4MSA9IHRo aXMuX3gxLAogICAgICB5MSA9IHRoaXMuX3kxOwoKICAvLyBJZiB0aGUgcXVhZHRyZWUgaGFzIG5v IGV4dGVudCwgaW5pdGlhbGl6ZSB0aGVtLgogIC8vIEludGVnZXIgZXh0ZW50IGFyZSBuZWNlc3Nh cnkgc28gdGhhdCBpZiB3ZSBsYXRlciBkb3VibGUgdGhlIGV4dGVudCwKICAvLyB0aGUgZXhpc3Rp bmcgcXVhZHJhbnQgYm91bmRhcmllcyBkb27igJl0IGNoYW5nZSBkdWUgdG8gZmxvYXRpbmcgcG9p bnQgZXJyb3IhCiAgaWYgKGlzTmFOKHgwKSkgewogICAgeDEgPSAoeDAgPSBNYXRoLmZsb29yKHgp KSArIDE7CiAgICB5MSA9ICh5MCA9IE1hdGguZmxvb3IoeSkpICsgMTsKICB9CgogIC8vIE90aGVy d2lzZSwgZG91YmxlIHJlcGVhdGVkbHkgdG8gY292ZXIuCiAgZWxzZSB7CiAgICB2YXIgeiA9IHgx IC0geDAsCiAgICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsCiAgICAgICAgcGFyZW50LAogICAgICAg IGk7CgogICAgd2hpbGUgKHgwID4geCB8fCB4ID49IHgxIHx8IHkwID4geSB8fCB5ID49IHkxKSB7 CiAgICAgIGkgPSAoeSA8IHkwKSA8PCAxIHwgKHggPCB4MCk7CiAgICAgIHBhcmVudCA9IG5ldyBB cnJheSg0KSwgcGFyZW50W2ldID0gbm9kZSwgbm9kZSA9IHBhcmVudCwgeiAqPSAyOwogICAgICBz d2l0Y2ggKGkpIHsKICAgICAgICBjYXNlIDA6IHgxID0geDAgKyB6LCB5MSA9IHkwICsgejsgYnJl YWs7CiAgICAgICAgY2FzZSAxOiB4MCA9IHgxIC0geiwgeTEgPSB5MCArIHo7IGJyZWFrOwogICAg ICAgIGNhc2UgMjogeDEgPSB4MCArIHosIHkwID0geTEgLSB6OyBicmVhazsKICAgICAgICBjYXNl IDM6IHgwID0geDEgLSB6LCB5MCA9IHkxIC0gejsgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBp ZiAodGhpcy5fcm9vdCAmJiB0aGlzLl9yb290Lmxlbmd0aCkgdGhpcy5fcm9vdCA9IG5vZGU7CiAg fQoKICB0aGlzLl94MCA9IHgwOwogIHRoaXMuX3kwID0geTA7CiAgdGhpcy5feDEgPSB4MTsKICB0 aGlzLl95MSA9IHkxOwogIHJldHVybiB0aGlzOwp9CgpmdW5jdGlvbiB0cmVlX2RhdGEoKSB7CiAg dmFyIGRhdGEgPSBbXTsKICB0aGlzLnZpc2l0KGZ1bmN0aW9uKG5vZGUpIHsKICAgIGlmICghbm9k ZS5sZW5ndGgpIGRvIGRhdGEucHVzaChub2RlLmRhdGEpOyB3aGlsZSAobm9kZSA9IG5vZGUubmV4 dCkKICB9KTsKICByZXR1cm4gZGF0YTsKfQoKZnVuY3Rpb24gdHJlZV9leHRlbnQoXykgewogIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgID8gdGhpcy5jb3ZlcigrX1swXVswXSwgK19bMF1b MV0pLmNvdmVyKCtfWzFdWzBdLCArX1sxXVsxXSkKICAgICAgOiBpc05hTih0aGlzLl94MCkgPyB1 bmRlZmluZWQgOiBbW3RoaXMuX3gwLCB0aGlzLl95MF0sIFt0aGlzLl94MSwgdGhpcy5feTFdXTsK fQoKZnVuY3Rpb24gUXVhZChub2RlLCB4MCwgeTAsIHgxLCB5MSkgewogIHRoaXMubm9kZSA9IG5v ZGU7CiAgdGhpcy54MCA9IHgwOwogIHRoaXMueTAgPSB5MDsKICB0aGlzLngxID0geDE7CiAgdGhp cy55MSA9IHkxOwp9CgpmdW5jdGlvbiB0cmVlX2ZpbmQoeCwgeSwgcmFkaXVzKSB7CiAgdmFyIGRh dGEsCiAgICAgIHgwID0gdGhpcy5feDAsCiAgICAgIHkwID0gdGhpcy5feTAsCiAgICAgIHgxLAog ICAgICB5MSwKICAgICAgeDIsCiAgICAgIHkyLAogICAgICB4MyA9IHRoaXMuX3gxLAogICAgICB5 MyA9IHRoaXMuX3kxLAogICAgICBxdWFkcyA9IFtdLAogICAgICBub2RlID0gdGhpcy5fcm9vdCwK ICAgICAgcSwKICAgICAgaTsKCiAgaWYgKG5vZGUpIHF1YWRzLnB1c2gobmV3IFF1YWQobm9kZSwg eDAsIHkwLCB4MywgeTMpKTsKICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5 OwogIGVsc2UgewogICAgeDAgPSB4IC0gcmFkaXVzLCB5MCA9IHkgLSByYWRpdXM7CiAgICB4MyA9 IHggKyByYWRpdXMsIHkzID0geSArIHJhZGl1czsKICAgIHJhZGl1cyAqPSByYWRpdXM7CiAgfQoK ICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7CgogICAgLy8gU3RvcCBzZWFyY2hpbmcgaWYgdGhp cyBxdWFkcmFudCBjYW7igJl0IGNvbnRhaW4gYSBjbG9zZXIgbm9kZS4KICAgIGlmICghKG5vZGUg PSBxLm5vZGUpCiAgICAgICAgfHwgKHgxID0gcS54MCkgPiB4MwogICAgICAgIHx8ICh5MSA9IHEu eTApID4geTMKICAgICAgICB8fCAoeDIgPSBxLngxKSA8IHgwCiAgICAgICAgfHwgKHkyID0gcS55 MSkgPCB5MCkgY29udGludWU7CgogICAgLy8gQmlzZWN0IHRoZSBjdXJyZW50IHF1YWRyYW50Lgog ICAgaWYgKG5vZGUubGVuZ3RoKSB7CiAgICAgIHZhciB4bSA9ICh4MSArIHgyKSAvIDIsCiAgICAg ICAgICB5bSA9ICh5MSArIHkyKSAvIDI7CgogICAgICBxdWFkcy5wdXNoKAogICAgICAgIG5ldyBR dWFkKG5vZGVbM10sIHhtLCB5bSwgeDIsIHkyKSwKICAgICAgICBuZXcgUXVhZChub2RlWzJdLCB4 MSwgeW0sIHhtLCB5MiksCiAgICAgICAgbmV3IFF1YWQobm9kZVsxXSwgeG0sIHkxLCB4MiwgeW0p LAogICAgICAgIG5ldyBRdWFkKG5vZGVbMF0sIHgxLCB5MSwgeG0sIHltKQogICAgICApOwoKICAg ICAgLy8gVmlzaXQgdGhlIGNsb3Nlc3QgcXVhZHJhbnQgZmlyc3QuCiAgICAgIGlmIChpID0gKHkg Pj0geW0pIDw8IDEgfCAoeCA+PSB4bSkpIHsKICAgICAgICBxID0gcXVhZHNbcXVhZHMubGVuZ3Ro IC0gMV07CiAgICAgICAgcXVhZHNbcXVhZHMubGVuZ3RoIC0gMV0gPSBxdWFkc1txdWFkcy5sZW5n dGggLSAxIC0gaV07CiAgICAgICAgcXVhZHNbcXVhZHMubGVuZ3RoIC0gMSAtIGldID0gcTsKICAg ICAgfQogICAgfQoKICAgIC8vIFZpc2l0IHRoaXMgcG9pbnQuIChWaXNpdGluZyBjb2luY2lkZW50 IHBvaW50cyBpc27igJl0IG5lY2Vzc2FyeSEpCiAgICBlbHNlIHsKICAgICAgdmFyIGR4ID0geCAt ICt0aGlzLl94LmNhbGwobnVsbCwgbm9kZS5kYXRhKSwKICAgICAgICAgIGR5ID0geSAtICt0aGlz Ll95LmNhbGwobnVsbCwgbm9kZS5kYXRhKSwKICAgICAgICAgIGQyID0gZHggKiBkeCArIGR5ICog ZHk7CiAgICAgIGlmIChkMiA8IHJhZGl1cykgewogICAgICAgIHZhciBkID0gTWF0aC5zcXJ0KHJh ZGl1cyA9IGQyKTsKICAgICAgICB4MCA9IHggLSBkLCB5MCA9IHkgLSBkOwogICAgICAgIHgzID0g eCArIGQsIHkzID0geSArIGQ7CiAgICAgICAgZGF0YSA9IG5vZGUuZGF0YTsKICAgICAgfQogICAg fQogIH0KCiAgcmV0dXJuIGRhdGE7Cn0KCmZ1bmN0aW9uIHRyZWVfcmVtb3ZlKGQpIHsKICBpZiAo aXNOYU4oeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCkpIHx8IGlzTmFOKHkgPSArdGhpcy5feS5j YWxsKG51bGwsIGQpKSkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50cwoKICB2 YXIgcGFyZW50LAogICAgICBub2RlID0gdGhpcy5fcm9vdCwKICAgICAgcmV0YWluZXIsCiAgICAg IHByZXZpb3VzLAogICAgICBuZXh0LAogICAgICB4MCA9IHRoaXMuX3gwLAogICAgICB5MCA9IHRo aXMuX3kwLAogICAgICB4MSA9IHRoaXMuX3gxLAogICAgICB5MSA9IHRoaXMuX3kxLAogICAgICB4 LAogICAgICB5LAogICAgICB4bSwKICAgICAgeW0sCiAgICAgIHJpZ2h0LAogICAgICBib3R0b20s CiAgICAgIGksCiAgICAgIGo7CgogIC8vIElmIHRoZSB0cmVlIGlzIGVtcHR5LCBpbml0aWFsaXpl IHRoZSByb290IGFzIGEgbGVhZi4KICBpZiAoIW5vZGUpIHJldHVybiB0aGlzOwoKICAvLyBGaW5k IHRoZSBsZWFmIG5vZGUgZm9yIHRoZSBwb2ludC4KICAvLyBXaGlsZSBkZXNjZW5kaW5nLCBhbHNv IHJldGFpbiB0aGUgZGVlcGVzdCBwYXJlbnQgd2l0aCBhIG5vbi1yZW1vdmVkIHNpYmxpbmcuCiAg aWYgKG5vZGUubGVuZ3RoKSB3aGlsZSAodHJ1ZSkgewogICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0g PSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtOwogICAgaWYgKGJvdHRvbSA9 IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTsKICAgIGlm ICghKHBhcmVudCA9IG5vZGUsIG5vZGUgPSBub2RlW2kgPSBib3R0b20gPDwgMSB8IHJpZ2h0XSkp IHJldHVybiB0aGlzOwogICAgaWYgKCFub2RlLmxlbmd0aCkgYnJlYWs7CiAgICBpZiAocGFyZW50 WyhpICsgMSkgJiAzXSB8fCBwYXJlbnRbKGkgKyAyKSAmIDNdIHx8IHBhcmVudFsoaSArIDMpICYg M10pIHJldGFpbmVyID0gcGFyZW50LCBqID0gaTsKICB9CgogIC8vIEZpbmQgdGhlIHBvaW50IHRv IHJlbW92ZS4KICB3aGlsZSAobm9kZS5kYXRhICE9PSBkKSBpZiAoIShwcmV2aW91cyA9IG5vZGUs IG5vZGUgPSBub2RlLm5leHQpKSByZXR1cm4gdGhpczsKICBpZiAobmV4dCA9IG5vZGUubmV4dCkg ZGVsZXRlIG5vZGUubmV4dDsKCiAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvaW5jaWRlbnQg cG9pbnRzLCByZW1vdmUganVzdCB0aGUgcG9pbnQuCiAgaWYgKHByZXZpb3VzKSByZXR1cm4gKG5l eHQgPyBwcmV2aW91cy5uZXh0ID0gbmV4dCA6IGRlbGV0ZSBwcmV2aW91cy5uZXh0KSwgdGhpczsK CiAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBwb2ludCwgcmVtb3ZlIGl0LgogIGlmICghcGFyZW50 KSByZXR1cm4gdGhpcy5fcm9vdCA9IG5leHQsIHRoaXM7CgogIC8vIFJlbW92ZSB0aGlzIGxlYWYu CiAgbmV4dCA/IHBhcmVudFtpXSA9IG5leHQgOiBkZWxldGUgcGFyZW50W2ldOwoKICAvLyBJZiB0 aGUgcGFyZW50IG5vdyBjb250YWlucyBleGFjdGx5IG9uZSBsZWFmLCBjb2xsYXBzZSBzdXBlcmZs dW91cyBwYXJlbnRzLgogIGlmICgobm9kZSA9IHBhcmVudFswXSB8fCBwYXJlbnRbMV0gfHwgcGFy ZW50WzJdIHx8IHBhcmVudFszXSkKICAgICAgJiYgbm9kZSA9PT0gKHBhcmVudFszXSB8fCBwYXJl bnRbMl0gfHwgcGFyZW50WzFdIHx8IHBhcmVudFswXSkKICAgICAgJiYgIW5vZGUubGVuZ3RoKSB7 CiAgICBpZiAocmV0YWluZXIpIHJldGFpbmVyW2pdID0gbm9kZTsKICAgIGVsc2UgdGhpcy5fcm9v dCA9IG5vZGU7CiAgfQoKICByZXR1cm4gdGhpczsKfQoKZnVuY3Rpb24gcmVtb3ZlQWxsKGRhdGEp IHsKICBmb3IgKHZhciBpID0gMCwgbiA9IGRhdGEubGVuZ3RoOyBpIDwgbjsgKytpKSB0aGlzLnJl bW92ZShkYXRhW2ldKTsKICByZXR1cm4gdGhpczsKfQoKZnVuY3Rpb24gdHJlZV9yb290KCkgewog IHJldHVybiB0aGlzLl9yb290Owp9CgpmdW5jdGlvbiB0cmVlX3NpemUoKSB7CiAgdmFyIHNpemUg PSAwOwogIHRoaXMudmlzaXQoZnVuY3Rpb24obm9kZSkgewogICAgaWYgKCFub2RlLmxlbmd0aCkg ZG8gKytzaXplOyB3aGlsZSAobm9kZSA9IG5vZGUubmV4dCkKICB9KTsKICByZXR1cm4gc2l6ZTsK fQoKZnVuY3Rpb24gdHJlZV92aXNpdChjYWxsYmFjaykgewogIHZhciBxdWFkcyA9IFtdLCBxLCBu b2RlID0gdGhpcy5fcm9vdCwgY2hpbGQsIHgwLCB5MCwgeDEsIHkxOwogIGlmIChub2RlKSBxdWFk cy5wdXNoKG5ldyBRdWFkKG5vZGUsIHRoaXMuX3gwLCB0aGlzLl95MCwgdGhpcy5feDEsIHRoaXMu X3kxKSk7CiAgd2hpbGUgKHEgPSBxdWFkcy5wb3AoKSkgewogICAgaWYgKCFjYWxsYmFjayhub2Rl ID0gcS5ub2RlLCB4MCA9IHEueDAsIHkwID0gcS55MCwgeDEgPSBxLngxLCB5MSA9IHEueTEpICYm IG5vZGUubGVuZ3RoKSB7CiAgICAgIHZhciB4bSA9ICh4MCArIHgxKSAvIDIsIHltID0gKHkwICsg eTEpIC8gMjsKICAgICAgaWYgKGNoaWxkID0gbm9kZVszXSkgcXVhZHMucHVzaChuZXcgUXVhZChj aGlsZCwgeG0sIHltLCB4MSwgeTEpKTsKICAgICAgaWYgKGNoaWxkID0gbm9kZVsyXSkgcXVhZHMu cHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHltLCB4bSwgeTEpKTsKICAgICAgaWYgKGNoaWxkID0g bm9kZVsxXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTsKICAg ICAgaWYgKGNoaWxkID0gbm9kZVswXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHkw LCB4bSwgeW0pKTsKICAgIH0KICB9CiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0aW9uIHRyZWVfdmlz aXRBZnRlcihjYWxsYmFjaykgewogIHZhciBxdWFkcyA9IFtdLCBuZXh0ID0gW10sIHE7CiAgaWYg KHRoaXMuX3Jvb3QpIHF1YWRzLnB1c2gobmV3IFF1YWQodGhpcy5fcm9vdCwgdGhpcy5feDAsIHRo aXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpKTsKICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7 CiAgICB2YXIgbm9kZSA9IHEubm9kZTsKICAgIGlmIChub2RlLmxlbmd0aCkgewogICAgICB2YXIg Y2hpbGQsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSwgeG0gPSAo eDAgKyB4MSkgLyAyLCB5bSA9ICh5MCArIHkxKSAvIDI7CiAgICAgIGlmIChjaGlsZCA9IG5vZGVb MF0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5MCwgeG0sIHltKSk7CiAgICAgIGlm IChjaGlsZCA9IG5vZGVbMV0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5MCwgeDEs IHltKSk7CiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hp bGQsIHgwLCB5bSwgeG0sIHkxKSk7CiAgICAgIGlmIChjaGlsZCA9IG5vZGVbM10pIHF1YWRzLnB1 c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5bSwgeDEsIHkxKSk7CiAgICB9CiAgICBuZXh0LnB1c2go cSk7CiAgfQogIHdoaWxlIChxID0gbmV4dC5wb3AoKSkgewogICAgY2FsbGJhY2socS5ub2RlLCBx LngwLCBxLnkwLCBxLngxLCBxLnkxKTsKICB9CiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0aW9uIGRl ZmF1bHRYJDEoZCkgewogIHJldHVybiBkWzBdOwp9CgpmdW5jdGlvbiB0cmVlX3goXykgewogIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3ggPSBfLCB0aGlzKSA6IHRoaXMuX3g7Cn0K CmZ1bmN0aW9uIGRlZmF1bHRZJDEoZCkgewogIHJldHVybiBkWzFdOwp9CgpmdW5jdGlvbiB0cmVl X3koXykgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3kgPSBfLCB0aGlzKSA6 IHRoaXMuX3k7Cn0KCmZ1bmN0aW9uIHF1YWR0cmVlKG5vZGVzLCB4LCB5KSB7CiAgdmFyIHRyZWUg PSBuZXcgUXVhZHRyZWUoeCA9PSBudWxsID8gZGVmYXVsdFgkMSA6IHgsIHkgPT0gbnVsbCA/IGRl ZmF1bHRZJDEgOiB5LCBOYU4sIE5hTiwgTmFOLCBOYU4pOwogIHJldHVybiBub2RlcyA9PSBudWxs ID8gdHJlZSA6IHRyZWUuYWRkQWxsKG5vZGVzKTsKfQoKZnVuY3Rpb24gUXVhZHRyZWUoeCwgeSwg eDAsIHkwLCB4MSwgeTEpIHsKICB0aGlzLl94ID0geDsKICB0aGlzLl95ID0geTsKICB0aGlzLl94 MCA9IHgwOwogIHRoaXMuX3kwID0geTA7CiAgdGhpcy5feDEgPSB4MTsKICB0aGlzLl95MSA9IHkx OwogIHRoaXMuX3Jvb3QgPSB1bmRlZmluZWQ7Cn0KCmZ1bmN0aW9uIGxlYWZfY29weShsZWFmKSB7 CiAgdmFyIGNvcHkgPSB7ZGF0YTogbGVhZi5kYXRhfSwgbmV4dCA9IGNvcHk7CiAgd2hpbGUgKGxl YWYgPSBsZWFmLm5leHQpIG5leHQgPSBuZXh0Lm5leHQgPSB7ZGF0YTogbGVhZi5kYXRhfTsKICBy ZXR1cm4gY29weTsKfQoKdmFyIHRyZWVQcm90byA9IHF1YWR0cmVlLnByb3RvdHlwZSA9IFF1YWR0 cmVlLnByb3RvdHlwZTsKCnRyZWVQcm90by5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgdmFyIGNvcHkg PSBuZXcgUXVhZHRyZWUodGhpcy5feCwgdGhpcy5feSwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlz Ll94MSwgdGhpcy5feTEpLAogICAgICBub2RlID0gdGhpcy5fcm9vdCwKICAgICAgbm9kZXMsCiAg ICAgIGNoaWxkOwoKICBpZiAoIW5vZGUpIHJldHVybiBjb3B5OwoKICBpZiAoIW5vZGUubGVuZ3Ro KSByZXR1cm4gY29weS5fcm9vdCA9IGxlYWZfY29weShub2RlKSwgY29weTsKCiAgbm9kZXMgPSBb e3NvdXJjZTogbm9kZSwgdGFyZ2V0OiBjb3B5Ll9yb290ID0gbmV3IEFycmF5KDQpfV07CiAgd2hp bGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyArK2kp IHsKICAgICAgaWYgKGNoaWxkID0gbm9kZS5zb3VyY2VbaV0pIHsKICAgICAgICBpZiAoY2hpbGQu bGVuZ3RoKSBub2Rlcy5wdXNoKHtzb3VyY2U6IGNoaWxkLCB0YXJnZXQ6IG5vZGUudGFyZ2V0W2ld ID0gbmV3IEFycmF5KDQpfSk7CiAgICAgICAgZWxzZSBub2RlLnRhcmdldFtpXSA9IGxlYWZfY29w eShjaGlsZCk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBjb3B5Owp9OwoKdHJlZVByb3Rv LmFkZCA9IHRyZWVfYWRkOwp0cmVlUHJvdG8uYWRkQWxsID0gYWRkQWxsOwp0cmVlUHJvdG8uY292 ZXIgPSB0cmVlX2NvdmVyOwp0cmVlUHJvdG8uZGF0YSA9IHRyZWVfZGF0YTsKdHJlZVByb3RvLmV4 dGVudCA9IHRyZWVfZXh0ZW50Owp0cmVlUHJvdG8uZmluZCA9IHRyZWVfZmluZDsKdHJlZVByb3Rv LnJlbW92ZSA9IHRyZWVfcmVtb3ZlOwp0cmVlUHJvdG8ucmVtb3ZlQWxsID0gcmVtb3ZlQWxsOwp0 cmVlUHJvdG8ucm9vdCA9IHRyZWVfcm9vdDsKdHJlZVByb3RvLnNpemUgPSB0cmVlX3NpemU7CnRy ZWVQcm90by52aXNpdCA9IHRyZWVfdmlzaXQ7CnRyZWVQcm90by52aXNpdEFmdGVyID0gdHJlZV92 aXNpdEFmdGVyOwp0cmVlUHJvdG8ueCA9IHRyZWVfeDsKdHJlZVByb3RvLnkgPSB0cmVlX3k7Cgpm dW5jdGlvbiB4KGQpIHsKICByZXR1cm4gZC54ICsgZC52eDsKfQoKZnVuY3Rpb24geShkKSB7CiAg cmV0dXJuIGQueSArIGQudnk7Cn0KCmZ1bmN0aW9uIGNvbGxpZGUocmFkaXVzKSB7CiAgdmFyIG5v ZGVzLAogICAgICByYWRpaSwKICAgICAgc3RyZW5ndGggPSAxLAogICAgICBpdGVyYXRpb25zID0g MTsKCiAgaWYgKHR5cGVvZiByYWRpdXMgIT09ICJmdW5jdGlvbiIpIHJhZGl1cyA9IGNvbnN0YW50 JDcocmFkaXVzID09IG51bGwgPyAxIDogK3JhZGl1cyk7CgogIGZ1bmN0aW9uIGZvcmNlKCkgewog ICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgICAgdHJlZSwKICAgICAgICBub2RlLAog ICAgICAgIHhpLAogICAgICAgIHlpLAogICAgICAgIHJpLAogICAgICAgIHJpMjsKCiAgICBmb3Ig KHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykgewogICAgICB0cmVlID0gcXVhZHRyZWUo bm9kZXMsIHgsIHkpLnZpc2l0QWZ0ZXIocHJlcGFyZSk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBu OyArK2kpIHsKICAgICAgICBub2RlID0gbm9kZXNbaV07CiAgICAgICAgcmkgPSByYWRpaVtub2Rl LmluZGV4XSwgcmkyID0gcmkgKiByaTsKICAgICAgICB4aSA9IG5vZGUueCArIG5vZGUudng7CiAg ICAgICAgeWkgPSBub2RlLnkgKyBub2RlLnZ5OwogICAgICAgIHRyZWUudmlzaXQoYXBwbHkpOwog ICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHkocXVhZCwgeDAsIHkwLCB4MSwgeTEpIHsK ICAgICAgdmFyIGRhdGEgPSBxdWFkLmRhdGEsIHJqID0gcXVhZC5yLCByID0gcmkgKyByajsKICAg ICAgaWYgKGRhdGEpIHsKICAgICAgICBpZiAoZGF0YS5pbmRleCA+IG5vZGUuaW5kZXgpIHsKICAg ICAgICAgIHZhciB4ID0geGkgLSBkYXRhLnggLSBkYXRhLnZ4LAogICAgICAgICAgICAgIHkgPSB5 aSAtIGRhdGEueSAtIGRhdGEudnksCiAgICAgICAgICAgICAgbCA9IHggKiB4ICsgeSAqIHk7CiAg ICAgICAgICBpZiAobCA8IHIgKiByKSB7CiAgICAgICAgICAgIGlmICh4ID09PSAwKSB4ID0gamln Z2xlKCksIGwgKz0geCAqIHg7CiAgICAgICAgICAgIGlmICh5ID09PSAwKSB5ID0gamlnZ2xlKCks IGwgKz0geSAqIHk7CiAgICAgICAgICAgIGwgPSAociAtIChsID0gTWF0aC5zcXJ0KGwpKSkgLyBs ICogc3RyZW5ndGg7CiAgICAgICAgICAgIG5vZGUudnggKz0gKHggKj0gbCkgKiAociA9IChyaiAq PSByaikgLyAocmkyICsgcmopKTsKICAgICAgICAgICAgbm9kZS52eSArPSAoeSAqPSBsKSAqIHI7 CiAgICAgICAgICAgIGRhdGEudnggLT0geCAqIChyID0gMSAtIHIpOwogICAgICAgICAgICBkYXRh LnZ5IC09IHkgKiByOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAg IH0KICAgICAgcmV0dXJuIHgwID4geGkgKyByIHx8IHgxIDwgeGkgLSByIHx8IHkwID4geWkgKyBy IHx8IHkxIDwgeWkgLSByOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcHJlcGFyZShxdWFkKSB7CiAg ICBpZiAocXVhZC5kYXRhKSByZXR1cm4gcXVhZC5yID0gcmFkaWlbcXVhZC5kYXRhLmluZGV4XTsK ICAgIGZvciAodmFyIGkgPSBxdWFkLnIgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgIGlmIChxdWFk W2ldICYmIHF1YWRbaV0uciA+IHF1YWQucikgewogICAgICAgIHF1YWQuciA9IHF1YWRbaV0ucjsK ICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHsKICAgIGlmICghbm9k ZXMpIHJldHVybjsKICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOwogICAgcmFkaWkg PSBuZXcgQXJyYXkobik7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNb aV0sIHJhZGlpW25vZGUuaW5kZXhdID0gK3JhZGl1cyhub2RlLCBpLCBub2Rlcyk7CiAgfQoKICBm b3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykgewogICAgbm9kZXMgPSBfOwogICAgaW5pdGlh bGl6ZSgpOwogIH07CgogIGZvcmNlLml0ZXJhdGlvbnMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1 cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpdGVyYXRpb25zID0gK18sIGZvcmNlKSA6IGl0ZXJhdGlv bnM7CiAgfTsKCiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJn dW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9ICtfLCBmb3JjZSkgOiBzdHJlbmd0aDsKICB9OwoK ICBmb3JjZS5yYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/IChyYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ3KCtf KSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiByYWRpdXM7CiAgfTsKCiAgcmV0dXJuIGZvcmNlOwp9 CgpmdW5jdGlvbiBpbmRleChkKSB7CiAgcmV0dXJuIGQuaW5kZXg7Cn0KCmZ1bmN0aW9uIGZpbmQo bm9kZUJ5SWQsIG5vZGVJZCkgewogIHZhciBub2RlID0gbm9kZUJ5SWQuZ2V0KG5vZGVJZCk7CiAg aWYgKCFub2RlKSB0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIgKyBub2RlSWQpOwogIHJldHVy biBub2RlOwp9CgpmdW5jdGlvbiBsaW5rKGxpbmtzKSB7CiAgdmFyIGlkID0gaW5kZXgsCiAgICAg IHN0cmVuZ3RoID0gZGVmYXVsdFN0cmVuZ3RoLAogICAgICBzdHJlbmd0aHMsCiAgICAgIGRpc3Rh bmNlID0gY29uc3RhbnQkNygzMCksCiAgICAgIGRpc3RhbmNlcywKICAgICAgbm9kZXMsCiAgICAg IGNvdW50LAogICAgICBiaWFzLAogICAgICBpdGVyYXRpb25zID0gMTsKCiAgaWYgKGxpbmtzID09 IG51bGwpIGxpbmtzID0gW107CgogIGZ1bmN0aW9uIGRlZmF1bHRTdHJlbmd0aChsaW5rKSB7CiAg ICByZXR1cm4gMSAvIE1hdGgubWluKGNvdW50W2xpbmsuc291cmNlLmluZGV4XSwgY291bnRbbGlu ay50YXJnZXQuaW5kZXhdKTsKICB9CgogIGZ1bmN0aW9uIGZvcmNlKGFscGhhKSB7CiAgICBmb3Ig KHZhciBrID0gMCwgbiA9IGxpbmtzLmxlbmd0aDsgayA8IGl0ZXJhdGlvbnM7ICsraykgewogICAg ICBmb3IgKHZhciBpID0gMCwgbGluaywgc291cmNlLCB0YXJnZXQsIHgsIHksIGwsIGI7IGkgPCBu OyArK2kpIHsKICAgICAgICBsaW5rID0gbGlua3NbaV0sIHNvdXJjZSA9IGxpbmsuc291cmNlLCB0 YXJnZXQgPSBsaW5rLnRhcmdldDsKICAgICAgICB4ID0gdGFyZ2V0LnggKyB0YXJnZXQudnggLSBz b3VyY2UueCAtIHNvdXJjZS52eCB8fCBqaWdnbGUoKTsKICAgICAgICB5ID0gdGFyZ2V0LnkgKyB0 YXJnZXQudnkgLSBzb3VyY2UueSAtIHNvdXJjZS52eSB8fCBqaWdnbGUoKTsKICAgICAgICBsID0g TWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpOwogICAgICAgIGwgPSAobCAtIGRpc3RhbmNlc1tpXSkg LyBsICogYWxwaGEgKiBzdHJlbmd0aHNbaV07CiAgICAgICAgeCAqPSBsLCB5ICo9IGw7CiAgICAg ICAgdGFyZ2V0LnZ4IC09IHggKiAoYiA9IGJpYXNbaV0pOwogICAgICAgIHRhcmdldC52eSAtPSB5 ICogYjsKICAgICAgICBzb3VyY2UudnggKz0geCAqIChiID0gMSAtIGIpOwogICAgICAgIHNvdXJj ZS52eSArPSB5ICogYjsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgp IHsKICAgIGlmICghbm9kZXMpIHJldHVybjsKCiAgICB2YXIgaSwKICAgICAgICBuID0gbm9kZXMu bGVuZ3RoLAogICAgICAgIG0gPSBsaW5rcy5sZW5ndGgsCiAgICAgICAgbm9kZUJ5SWQgPSBtYXAk MShub2RlcywgaWQpLAogICAgICAgIGxpbms7CgogICAgZm9yIChpID0gMCwgY291bnQgPSBuZXcg QXJyYXkobik7IGkgPCBtOyArK2kpIHsKICAgICAgbGluayA9IGxpbmtzW2ldLCBsaW5rLmluZGV4 ID0gaTsKICAgICAgaWYgKHR5cGVvZiBsaW5rLnNvdXJjZSAhPT0gIm9iamVjdCIpIGxpbmsuc291 cmNlID0gZmluZChub2RlQnlJZCwgbGluay5zb3VyY2UpOwogICAgICBpZiAodHlwZW9mIGxpbmsu dGFyZ2V0ICE9PSAib2JqZWN0IikgbGluay50YXJnZXQgPSBmaW5kKG5vZGVCeUlkLCBsaW5rLnRh cmdldCk7CiAgICAgIGNvdW50W2xpbmsuc291cmNlLmluZGV4XSA9IChjb3VudFtsaW5rLnNvdXJj ZS5pbmRleF0gfHwgMCkgKyAxOwogICAgICBjb3VudFtsaW5rLnRhcmdldC5pbmRleF0gPSAoY291 bnRbbGluay50YXJnZXQuaW5kZXhdIHx8IDApICsgMTsKICAgIH0KCiAgICBmb3IgKGkgPSAwLCBi aWFzID0gbmV3IEFycmF5KG0pOyBpIDwgbTsgKytpKSB7CiAgICAgIGxpbmsgPSBsaW5rc1tpXSwg Ymlhc1tpXSA9IGNvdW50W2xpbmsuc291cmNlLmluZGV4XSAvIChjb3VudFtsaW5rLnNvdXJjZS5p bmRleF0gKyBjb3VudFtsaW5rLnRhcmdldC5pbmRleF0pOwogICAgfQoKICAgIHN0cmVuZ3RocyA9 IG5ldyBBcnJheShtKSwgaW5pdGlhbGl6ZVN0cmVuZ3RoKCk7CiAgICBkaXN0YW5jZXMgPSBuZXcg QXJyYXkobSksIGluaXRpYWxpemVEaXN0YW5jZSgpOwogIH0KCiAgZnVuY3Rpb24gaW5pdGlhbGl6 ZVN0cmVuZ3RoKCkgewogICAgaWYgKCFub2RlcykgcmV0dXJuOwoKICAgIGZvciAodmFyIGkgPSAw LCBuID0gbGlua3MubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgIHN0cmVuZ3Roc1tpXSA9ICtz dHJlbmd0aChsaW5rc1tpXSwgaSwgbGlua3MpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdGlh bGl6ZURpc3RhbmNlKCkgewogICAgaWYgKCFub2RlcykgcmV0dXJuOwoKICAgIGZvciAodmFyIGkg PSAwLCBuID0gbGlua3MubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgIGRpc3RhbmNlc1tpXSA9 ICtkaXN0YW5jZShsaW5rc1tpXSwgaSwgbGlua3MpOwogICAgfQogIH0KCiAgZm9yY2UuaW5pdGlh bGl6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIG5vZGVzID0gXzsKICAgIGluaXRpYWxpemUoKTsKICB9 OwoKICBmb3JjZS5saW5rcyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVu Z3RoID8gKGxpbmtzID0gXywgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBsaW5rczsKICB9OwoKICBm b3JjZS5pZCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGlk ID0gXywgZm9yY2UpIDogaWQ7CiAgfTsKCiAgZm9yY2UuaXRlcmF0aW9ucyA9IGZ1bmN0aW9uKF8p IHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGl0ZXJhdGlvbnMgPSArXywgZm9yY2Up IDogaXRlcmF0aW9uczsKICB9OwoKICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09ICJmdW5j dGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxpemVTdHJlbmd0aCgpLCBmb3JjZSkg OiBzdHJlbmd0aDsKICB9OwoKICBmb3JjZS5kaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRpc3RhbmNlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlv biIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxpemVEaXN0YW5jZSgpLCBmb3JjZSkgOiBk aXN0YW5jZTsKICB9OwoKICByZXR1cm4gZm9yY2U7Cn0KCmZ1bmN0aW9uIHgkMShkKSB7CiAgcmV0 dXJuIGQueDsKfQoKZnVuY3Rpb24geSQxKGQpIHsKICByZXR1cm4gZC55Owp9Cgp2YXIgaW5pdGlh bFJhZGl1cyA9IDEwLAogICAgaW5pdGlhbEFuZ2xlID0gTWF0aC5QSSAqICgzIC0gTWF0aC5zcXJ0 KDUpKTsKCmZ1bmN0aW9uIHNpbXVsYXRpb24obm9kZXMpIHsKICB2YXIgc2ltdWxhdGlvbiwKICAg ICAgYWxwaGEgPSAxLAogICAgICBhbHBoYU1pbiA9IDAuMDAxLAogICAgICBhbHBoYURlY2F5ID0g MSAtIE1hdGgucG93KGFscGhhTWluLCAxIC8gMzAwKSwKICAgICAgYWxwaGFUYXJnZXQgPSAwLAog ICAgICB2ZWxvY2l0eURlY2F5ID0gMC42LAogICAgICBmb3JjZXMgPSBtYXAkMSgpLAogICAgICBz dGVwcGVyID0gdGltZXIoc3RlcCksCiAgICAgIGV2ZW50ID0gZGlzcGF0Y2goInRpY2siLCAiZW5k Iik7CgogIGlmIChub2RlcyA9PSBudWxsKSBub2RlcyA9IFtdOwoKICBmdW5jdGlvbiBzdGVwKCkg ewogICAgdGljaygpOwogICAgZXZlbnQuY2FsbCgidGljayIsIHNpbXVsYXRpb24pOwogICAgaWYg KGFscGhhIDwgYWxwaGFNaW4pIHsKICAgICAgc3RlcHBlci5zdG9wKCk7CiAgICAgIGV2ZW50LmNh bGwoImVuZCIsIHNpbXVsYXRpb24pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdGljayhpdGVyYXRp b25zKSB7CiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsKCiAgICBpZiAoaXRlcmF0 aW9ucyA9PT0gdW5kZWZpbmVkKSBpdGVyYXRpb25zID0gMTsKCiAgICBmb3IgKHZhciBrID0gMDsg ayA8IGl0ZXJhdGlvbnM7ICsraykgewogICAgICBhbHBoYSArPSAoYWxwaGFUYXJnZXQgLSBhbHBo YSkgKiBhbHBoYURlY2F5OwoKICAgICAgZm9yY2VzLmVhY2goZnVuY3Rpb24gKGZvcmNlKSB7CiAg ICAgICAgZm9yY2UoYWxwaGEpOwogICAgICB9KTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyAr K2kpIHsKICAgICAgICBub2RlID0gbm9kZXNbaV07CiAgICAgICAgaWYgKG5vZGUuZnggPT0gbnVs bCkgbm9kZS54ICs9IG5vZGUudnggKj0gdmVsb2NpdHlEZWNheTsKICAgICAgICBlbHNlIG5vZGUu eCA9IG5vZGUuZngsIG5vZGUudnggPSAwOwogICAgICAgIGlmIChub2RlLmZ5ID09IG51bGwpIG5v ZGUueSArPSBub2RlLnZ5ICo9IHZlbG9jaXR5RGVjYXk7CiAgICAgICAgZWxzZSBub2RlLnkgPSBu b2RlLmZ5LCBub2RlLnZ5ID0gMDsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBzaW11bGF0aW9u OwogIH0KCiAgZnVuY3Rpb24gaW5pdGlhbGl6ZU5vZGVzKCkgewogICAgZm9yICh2YXIgaSA9IDAs IG4gPSBub2Rlcy5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHsKICAgICAgbm9kZSA9IG5vZGVz W2ldLCBub2RlLmluZGV4ID0gaTsKICAgICAgaWYgKG5vZGUuZnggIT0gbnVsbCkgbm9kZS54ID0g bm9kZS5meDsKICAgICAgaWYgKG5vZGUuZnkgIT0gbnVsbCkgbm9kZS55ID0gbm9kZS5meTsKICAg ICAgaWYgKGlzTmFOKG5vZGUueCkgfHwgaXNOYU4obm9kZS55KSkgewogICAgICAgIHZhciByYWRp dXMgPSBpbml0aWFsUmFkaXVzICogTWF0aC5zcXJ0KGkpLCBhbmdsZSA9IGkgKiBpbml0aWFsQW5n bGU7CiAgICAgICAgbm9kZS54ID0gcmFkaXVzICogTWF0aC5jb3MoYW5nbGUpOwogICAgICAgIG5v ZGUueSA9IHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlKTsKICAgICAgfQogICAgICBpZiAoaXNOYU4o bm9kZS52eCkgfHwgaXNOYU4obm9kZS52eSkpIHsKICAgICAgICBub2RlLnZ4ID0gbm9kZS52eSA9 IDA7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGluaXRpYWxpemVGb3JjZShmb3JjZSkg ewogICAgaWYgKGZvcmNlLmluaXRpYWxpemUpIGZvcmNlLmluaXRpYWxpemUobm9kZXMpOwogICAg cmV0dXJuIGZvcmNlOwogIH0KCiAgaW5pdGlhbGl6ZU5vZGVzKCk7CgogIHJldHVybiBzaW11bGF0 aW9uID0gewogICAgdGljazogdGljaywKCiAgICByZXN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAg cmV0dXJuIHN0ZXBwZXIucmVzdGFydChzdGVwKSwgc2ltdWxhdGlvbjsKICAgIH0sCgogICAgc3Rv cDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzdGVwcGVyLnN0b3AoKSwgc2ltdWxhdGlvbjsK ICAgIH0sCgogICAgbm9kZXM6IGZ1bmN0aW9uKF8pIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5s ZW5ndGggPyAobm9kZXMgPSBfLCBpbml0aWFsaXplTm9kZXMoKSwgZm9yY2VzLmVhY2goaW5pdGlh bGl6ZUZvcmNlKSwgc2ltdWxhdGlvbikgOiBub2RlczsKICAgIH0sCgogICAgYWxwaGE6IGZ1bmN0 aW9uKF8pIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGEgPSArXywgc2lt dWxhdGlvbikgOiBhbHBoYTsKICAgIH0sCgogICAgYWxwaGFNaW46IGZ1bmN0aW9uKF8pIHsKICAg ICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFNaW4gPSArXywgc2ltdWxhdGlvbikg OiBhbHBoYU1pbjsKICAgIH0sCgogICAgYWxwaGFEZWNheTogZnVuY3Rpb24oXykgewogICAgICBy ZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYURlY2F5ID0gK18sIHNpbXVsYXRpb24pIDog K2FscGhhRGVjYXk7CiAgICB9LAoKICAgIGFscGhhVGFyZ2V0OiBmdW5jdGlvbihfKSB7CiAgICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFscGhhVGFyZ2V0ID0gK18sIHNpbXVsYXRpb24p IDogYWxwaGFUYXJnZXQ7CiAgICB9LAoKICAgIHZlbG9jaXR5RGVjYXk6IGZ1bmN0aW9uKF8pIHsK ICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmVsb2NpdHlEZWNheSA9IDEgLSBfLCBz aW11bGF0aW9uKSA6IDEgLSB2ZWxvY2l0eURlY2F5OwogICAgfSwKCiAgICBmb3JjZTogZnVuY3Rp b24obmFtZSwgXykgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAoKF8gPT0g bnVsbCA/IGZvcmNlcy5yZW1vdmUobmFtZSkgOiBmb3JjZXMuc2V0KG5hbWUsIGluaXRpYWxpemVG b3JjZShfKSkpLCBzaW11bGF0aW9uKSA6IGZvcmNlcy5nZXQobmFtZSk7CiAgICB9LAoKICAgIGZp bmQ6IGZ1bmN0aW9uKHgsIHksIHJhZGl1cykgewogICAgICB2YXIgaSA9IDAsCiAgICAgICAgICBu ID0gbm9kZXMubGVuZ3RoLAogICAgICAgICAgZHgsCiAgICAgICAgICBkeSwKICAgICAgICAgIGQy LAogICAgICAgICAgbm9kZSwKICAgICAgICAgIGNsb3Nlc3Q7CgogICAgICBpZiAocmFkaXVzID09 IG51bGwpIHJhZGl1cyA9IEluZmluaXR5OwogICAgICBlbHNlIHJhZGl1cyAqPSByYWRpdXM7Cgog ICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgbm9kZSA9IG5vZGVzW2ldOwog ICAgICAgIGR4ID0geCAtIG5vZGUueDsKICAgICAgICBkeSA9IHkgLSBub2RlLnk7CiAgICAgICAg ZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgICAgICBpZiAoZDIgPCByYWRpdXMpIGNsb3Nlc3Qg PSBub2RlLCByYWRpdXMgPSBkMjsKICAgICAgfQoKICAgICAgcmV0dXJuIGNsb3Nlc3Q7CiAgICB9 LAoKICAgIG9uOiBmdW5jdGlvbihuYW1lLCBfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVu Z3RoID4gMSA/IChldmVudC5vbihuYW1lLCBfKSwgc2ltdWxhdGlvbikgOiBldmVudC5vbihuYW1l KTsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBtYW55Qm9keSgpIHsKICB2YXIgbm9kZXMsCiAgICAg IG5vZGUsCiAgICAgIGFscGhhLAogICAgICBzdHJlbmd0aCA9IGNvbnN0YW50JDcoLTMwKSwKICAg ICAgc3RyZW5ndGhzLAogICAgICBkaXN0YW5jZU1pbjIgPSAxLAogICAgICBkaXN0YW5jZU1heDIg PSBJbmZpbml0eSwKICAgICAgdGhldGEyID0gMC44MTsKCiAgZnVuY3Rpb24gZm9yY2UoXykgewog ICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsIHRyZWUgPSBxdWFkdHJlZShub2RlcywgeCQxLCB5 JDEpLnZpc2l0QWZ0ZXIoYWNjdW11bGF0ZSk7CiAgICBmb3IgKGFscGhhID0gXywgaSA9IDA7IGkg PCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgdHJlZS52aXNpdChhcHBseSk7CiAgfQoKICBmdW5j dGlvbiBpbml0aWFsaXplKCkgewogICAgaWYgKCFub2RlcykgcmV0dXJuOwogICAgdmFyIGksIG4g PSBub2Rlcy5sZW5ndGgsIG5vZGU7CiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7CiAgICBm b3IgKGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNbaV0sIHN0cmVuZ3Roc1tub2RlLmlu ZGV4XSA9ICtzdHJlbmd0aChub2RlLCBpLCBub2Rlcyk7CiAgfQoKICBmdW5jdGlvbiBhY2N1bXVs YXRlKHF1YWQpIHsKICAgIHZhciBzdHJlbmd0aCA9IDAsIHEsIGMsIHdlaWdodCA9IDAsIHgsIHks IGk7CgogICAgLy8gRm9yIGludGVybmFsIG5vZGVzLCBhY2N1bXVsYXRlIGZvcmNlcyBmcm9tIGNo aWxkIHF1YWRyYW50cy4KICAgIGlmIChxdWFkLmxlbmd0aCkgewogICAgICBmb3IgKHggPSB5ID0g aSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICBpZiAoKHEgPSBxdWFkW2ldKSAmJiAoYyA9IE1h dGguYWJzKHEudmFsdWUpKSkgewogICAgICAgICAgc3RyZW5ndGggKz0gcS52YWx1ZSwgd2VpZ2h0 ICs9IGMsIHggKz0gYyAqIHEueCwgeSArPSBjICogcS55OwogICAgICAgIH0KICAgICAgfQogICAg ICBxdWFkLnggPSB4IC8gd2VpZ2h0OwogICAgICBxdWFkLnkgPSB5IC8gd2VpZ2h0OwogICAgfQoK ICAgIC8vIEZvciBsZWFmIG5vZGVzLCBhY2N1bXVsYXRlIGZvcmNlcyBmcm9tIGNvaW5jaWRlbnQg cXVhZHJhbnRzLgogICAgZWxzZSB7CiAgICAgIHEgPSBxdWFkOwogICAgICBxLnggPSBxLmRhdGEu eDsKICAgICAgcS55ID0gcS5kYXRhLnk7CiAgICAgIGRvIHN0cmVuZ3RoICs9IHN0cmVuZ3Roc1tx LmRhdGEuaW5kZXhdOwogICAgICB3aGlsZSAocSA9IHEubmV4dCk7CiAgICB9CgogICAgcXVhZC52 YWx1ZSA9IHN0cmVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gYXBwbHkocXVhZCwgeDEsIF8sIHgyKSB7 CiAgICBpZiAoIXF1YWQudmFsdWUpIHJldHVybiB0cnVlOwoKICAgIHZhciB4ID0gcXVhZC54IC0g bm9kZS54LAogICAgICAgIHkgPSBxdWFkLnkgLSBub2RlLnksCiAgICAgICAgdyA9IHgyIC0geDEs CiAgICAgICAgbCA9IHggKiB4ICsgeSAqIHk7CgogICAgLy8gQXBwbHkgdGhlIEJhcm5lcy1IdXQg YXBwcm94aW1hdGlvbiBpZiBwb3NzaWJsZS4KICAgIC8vIExpbWl0IGZvcmNlcyBmb3IgdmVyeSBj bG9zZSBub2RlczsgcmFuZG9taXplIGRpcmVjdGlvbiBpZiBjb2luY2lkZW50LgogICAgaWYgKHcg KiB3IC8gdGhldGEyIDwgbCkgewogICAgICBpZiAobCA8IGRpc3RhbmNlTWF4MikgewogICAgICAg IGlmICh4ID09PSAwKSB4ID0gamlnZ2xlKCksIGwgKz0geCAqIHg7CiAgICAgICAgaWYgKHkgPT09 IDApIHkgPSBqaWdnbGUoKSwgbCArPSB5ICogeTsKICAgICAgICBpZiAobCA8IGRpc3RhbmNlTWlu MikgbCA9IE1hdGguc3FydChkaXN0YW5jZU1pbjIgKiBsKTsKICAgICAgICBub2RlLnZ4ICs9IHgg KiBxdWFkLnZhbHVlICogYWxwaGEgLyBsOwogICAgICAgIG5vZGUudnkgKz0geSAqIHF1YWQudmFs dWUgKiBhbHBoYSAvIGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8g T3RoZXJ3aXNlLCBwcm9jZXNzIHBvaW50cyBkaXJlY3RseS4KICAgIGVsc2UgaWYgKHF1YWQubGVu Z3RoIHx8IGwgPj0gZGlzdGFuY2VNYXgyKSByZXR1cm47CgogICAgLy8gTGltaXQgZm9yY2VzIGZv ciB2ZXJ5IGNsb3NlIG5vZGVzOyByYW5kb21pemUgZGlyZWN0aW9uIGlmIGNvaW5jaWRlbnQuCiAg ICBpZiAocXVhZC5kYXRhICE9PSBub2RlIHx8IHF1YWQubmV4dCkgewogICAgICBpZiAoeCA9PT0g MCkgeCA9IGppZ2dsZSgpLCBsICs9IHggKiB4OwogICAgICBpZiAoeSA9PT0gMCkgeSA9IGppZ2ds ZSgpLCBsICs9IHkgKiB5OwogICAgICBpZiAobCA8IGRpc3RhbmNlTWluMikgbCA9IE1hdGguc3Fy dChkaXN0YW5jZU1pbjIgKiBsKTsKICAgIH0KCiAgICBkbyBpZiAocXVhZC5kYXRhICE9PSBub2Rl KSB7CiAgICAgIHcgPSBzdHJlbmd0aHNbcXVhZC5kYXRhLmluZGV4XSAqIGFscGhhIC8gbDsKICAg ICAgbm9kZS52eCArPSB4ICogdzsKICAgICAgbm9kZS52eSArPSB5ICogdzsKICAgIH0gd2hpbGUg KHF1YWQgPSBxdWFkLm5leHQpOwogIH0KCiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8p IHsKICAgIG5vZGVzID0gXzsKICAgIGluaXRpYWxpemUoKTsKICB9OwoKICBmb3JjZS5zdHJlbmd0 aCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3Ro ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxp emUoKSwgZm9yY2UpIDogc3RyZW5ndGg7CiAgfTsKCiAgZm9yY2UuZGlzdGFuY2VNaW4gPSBmdW5j dGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkaXN0YW5jZU1pbjIgPSBf ICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KGRpc3RhbmNlTWluMik7CiAgfTsKCiAgZm9yY2UuZGlz dGFuY2VNYXggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChk aXN0YW5jZU1heDIgPSBfICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KGRpc3RhbmNlTWF4Mik7CiAg fTsKCiAgZm9yY2UudGhldGEgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/ICh0aGV0YTIgPSBfICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KHRoZXRhMik7CiAgfTsK CiAgcmV0dXJuIGZvcmNlOwp9CgpmdW5jdGlvbiByYWRpYWwocmFkaXVzLCB4LCB5KSB7CiAgdmFy IG5vZGVzLAogICAgICBzdHJlbmd0aCA9IGNvbnN0YW50JDcoMC4xKSwKICAgICAgc3RyZW5ndGhz LAogICAgICByYWRpdXNlczsKCiAgaWYgKHR5cGVvZiByYWRpdXMgIT09ICJmdW5jdGlvbiIpIHJh ZGl1cyA9IGNvbnN0YW50JDcoK3JhZGl1cyk7CiAgaWYgKHggPT0gbnVsbCkgeCA9IDA7CiAgaWYg KHkgPT0gbnVsbCkgeSA9IDA7CgogIGZ1bmN0aW9uIGZvcmNlKGFscGhhKSB7CiAgICBmb3IgKHZh ciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICB2YXIgbm9kZSA9 IG5vZGVzW2ldLAogICAgICAgICAgZHggPSBub2RlLnggLSB4IHx8IDFlLTYsCiAgICAgICAgICBk eSA9IG5vZGUueSAtIHkgfHwgMWUtNiwKICAgICAgICAgIHIgPSBNYXRoLnNxcnQoZHggKiBkeCAr IGR5ICogZHkpLAogICAgICAgICAgayA9IChyYWRpdXNlc1tpXSAtIHIpICogc3RyZW5ndGhzW2ld ICogYWxwaGEgLyByOwogICAgICBub2RlLnZ4ICs9IGR4ICogazsKICAgICAgbm9kZS52eSArPSBk eSAqIGs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewogICAgaWYgKCFub2Rl cykgcmV0dXJuOwogICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGg7CiAgICBzdHJlbmd0aHMgPSBu ZXcgQXJyYXkobik7CiAgICByYWRpdXNlcyA9IG5ldyBBcnJheShuKTsKICAgIGZvciAoaSA9IDA7 IGkgPCBuOyArK2kpIHsKICAgICAgcmFkaXVzZXNbaV0gPSArcmFkaXVzKG5vZGVzW2ldLCBpLCBu b2Rlcyk7CiAgICAgIHN0cmVuZ3Roc1tpXSA9IGlzTmFOKHJhZGl1c2VzW2ldKSA/IDAgOiArc3Ry ZW5ndGgobm9kZXNbaV0sIGksIG5vZGVzKTsKICAgIH0KICB9CgogIGZvcmNlLmluaXRpYWxpemUg PSBmdW5jdGlvbihfKSB7CiAgICBub2RlcyA9IF8sIGluaXRpYWxpemUoKTsKICB9OwoKICBmb3Jj ZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8g KHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyks IGluaXRpYWxpemUoKSwgZm9yY2UpIDogc3RyZW5ndGg7CiAgfTsKCiAgZm9yY2UucmFkaXVzID0g ZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlw ZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxpemUoKSwg Zm9yY2UpIDogcmFkaXVzOwogIH07CgogIGZvcmNlLnggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1 cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gK18sIGZvcmNlKSA6IHg7CiAgfTsKCiAgZm9yY2Uu eSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSArXywg Zm9yY2UpIDogeTsKICB9OwoKICByZXR1cm4gZm9yY2U7Cn0KCmZ1bmN0aW9uIHgkMih4KSB7CiAg dmFyIHN0cmVuZ3RoID0gY29uc3RhbnQkNygwLjEpLAogICAgICBub2RlcywKICAgICAgc3RyZW5n dGhzLAogICAgICB4ejsKCiAgaWYgKHR5cGVvZiB4ICE9PSAiZnVuY3Rpb24iKSB4ID0gY29uc3Rh bnQkNyh4ID09IG51bGwgPyAwIDogK3gpOwoKICBmdW5jdGlvbiBmb3JjZShhbHBoYSkgewogICAg Zm9yICh2YXIgaSA9IDAsIG4gPSBub2Rlcy5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHsKICAg ICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLnZ4ICs9ICh4eltpXSAtIG5vZGUueCkgKiBzdHJlbmd0 aHNbaV0gKiBhbHBoYTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7CiAgICBp ZiAoIW5vZGVzKSByZXR1cm47CiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aDsKICAgIHN0cmVu Z3RocyA9IG5ldyBBcnJheShuKTsKICAgIHh6ID0gbmV3IEFycmF5KG4pOwogICAgZm9yIChpID0g MDsgaSA8IG47ICsraSkgewogICAgICBzdHJlbmd0aHNbaV0gPSBpc05hTih4eltpXSA9ICt4KG5v ZGVzW2ldLCBpLCBub2RlcykpID8gMCA6ICtzdHJlbmd0aChub2Rlc1tpXSwgaSwgbm9kZXMpOwog ICAgfQogIH0KCiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIG5vZGVzID0g XzsKICAgIGluaXRpYWxpemUoKTsKICB9OwoKICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8p IHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09 ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDog c3RyZW5ndGg7CiAgfTsKCiAgZm9yY2UueCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1 bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFu dCQ3KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiB4OwogIH07CgogIHJldHVybiBmb3JjZTsK fQoKZnVuY3Rpb24geSQyKHkpIHsKICB2YXIgc3RyZW5ndGggPSBjb25zdGFudCQ3KDAuMSksCiAg ICAgIG5vZGVzLAogICAgICBzdHJlbmd0aHMsCiAgICAgIHl6OwoKICBpZiAodHlwZW9mIHkgIT09 ICJmdW5jdGlvbiIpIHkgPSBjb25zdGFudCQ3KHkgPT0gbnVsbCA/IDAgOiAreSk7CgogIGZ1bmN0 aW9uIGZvcmNlKGFscGhhKSB7CiAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aCwg bm9kZTsgaSA8IG47ICsraSkgewogICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUudnkgKz0gKHl6 W2ldIC0gbm9kZS55KSAqIHN0cmVuZ3Roc1tpXSAqIGFscGhhOwogICAgfQogIH0KCiAgZnVuY3Rp b24gaW5pdGlhbGl6ZSgpIHsKICAgIGlmICghbm9kZXMpIHJldHVybjsKICAgIHZhciBpLCBuID0g bm9kZXMubGVuZ3RoOwogICAgc3RyZW5ndGhzID0gbmV3IEFycmF5KG4pOwogICAgeXogPSBuZXcg QXJyYXkobik7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIHN0cmVuZ3Roc1tp XSA9IGlzTmFOKHl6W2ldID0gK3kobm9kZXNbaV0sIGksIG5vZGVzKSkgPyAwIDogK3N0cmVuZ3Ro KG5vZGVzW2ldLCBpLCBub2Rlcyk7CiAgICB9CiAgfQoKICBmb3JjZS5pbml0aWFsaXplID0gZnVu Y3Rpb24oXykgewogICAgbm9kZXMgPSBfOwogICAgaW5pdGlhbGl6ZSgpOwogIH07CgogIGZvcmNl LnN0cmVuZ3RoID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAo c3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ3KCtfKSwg aW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBzdHJlbmd0aDsKICB9OwoKICBmb3JjZS55ID0gZnVuY3Rp b24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSAi ZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDcoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHk7 CiAgfTsKCiAgcmV0dXJuIGZvcmNlOwp9CgovLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmlj aWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoCi8vIHNpZ25p ZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0g b3IgdW5kZWZpbmVkLgovLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbCgxLjIzKSByZXR1cm5z IFsiMTIzIiwgMF0uCmZ1bmN0aW9uIGZvcm1hdERlY2ltYWwoeCwgcCkgewogIGlmICgoaSA9ICh4 ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhP ZigiZSIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMKxSW5maW5pdHkKICB2YXIgaSwgY29l ZmZpY2llbnQgPSB4LnNsaWNlKDAsIGkpOwoKICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRv RXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcZFwuXGQrZVstK11cZCsKICAvLyAoZS5n LiwgMS4yZSszKSBvciB0aGUgZm9ybSBcZGVbLStdXGQrIChlLmcuLCAxZSszKS4KICByZXR1cm4g WwogICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2ll bnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCwKICAgICt4LnNsaWNlKGkgKyAxKQogIF07Cn0KCmZ1 bmN0aW9uIGV4cG9uZW50JDEoeCkgewogIHJldHVybiB4ID0gZm9ybWF0RGVjaW1hbChNYXRoLmFi cyh4KSksIHggPyB4WzFdIDogTmFOOwp9CgpmdW5jdGlvbiBmb3JtYXRHcm91cChncm91cGluZywg dGhvdXNhbmRzKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCB3aWR0aCkgewogICAgdmFyIGkg PSB2YWx1ZS5sZW5ndGgsCiAgICAgICAgdCA9IFtdLAogICAgICAgIGogPSAwLAogICAgICAgIGcg PSBncm91cGluZ1swXSwKICAgICAgICBsZW5ndGggPSAwOwoKICAgIHdoaWxlIChpID4gMCAmJiBn ID4gMCkgewogICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEs IHdpZHRoIC0gbGVuZ3RoKTsKICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkg KyBnKSk7CiAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhazsKICAgICAg ZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTsKICAgIH0KCiAgICBy ZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpOwogIH07Cn0KCmZ1bmN0aW9uIGZvcm1h dE51bWVyYWxzKG51bWVyYWxzKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1 cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkgewogICAgICByZXR1cm4gbnVt ZXJhbHNbK2ldOwogICAgfSk7CiAgfTsKfQoKLy8gW1tmaWxsXWFsaWduXVtzaWduXVtzeW1ib2xd WzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt+XVt0eXBlXQp2YXIgcmUgPSAvXig/OiguKT8oWzw+ PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0p PyQvaTsKCmZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHsKICBpZiAoIShtYXRj aCA9IHJlLmV4ZWMoc3BlY2lmaWVyKSkpIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6 ICIgKyBzcGVjaWZpZXIpOwogIHZhciBtYXRjaDsKICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmll cih7CiAgICBmaWxsOiBtYXRjaFsxXSwKICAgIGFsaWduOiBtYXRjaFsyXSwKICAgIHNpZ246IG1h dGNoWzNdLAogICAgc3ltYm9sOiBtYXRjaFs0XSwKICAgIHplcm86IG1hdGNoWzVdLAogICAgd2lk dGg6IG1hdGNoWzZdLAogICAgY29tbWE6IG1hdGNoWzddLAogICAgcHJlY2lzaW9uOiBtYXRjaFs4 XSAmJiBtYXRjaFs4XS5zbGljZSgxKSwKICAgIHRyaW06IG1hdGNoWzldLAogICAgdHlwZTogbWF0 Y2hbMTBdCiAgfSk7Cn0KCmZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUgPSBGb3JtYXRTcGVjaWZp ZXIucHJvdG90eXBlOyAvLyBpbnN0YW5jZW9mCgpmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3Bl Y2lmaWVyKSB7CiAgdGhpcy5maWxsID0gc3BlY2lmaWVyLmZpbGwgPT09IHVuZGVmaW5lZCA/ICIg IiA6IHNwZWNpZmllci5maWxsICsgIiI7CiAgdGhpcy5hbGlnbiA9IHNwZWNpZmllci5hbGlnbiA9 PT0gdW5kZWZpbmVkID8gIj4iIDogc3BlY2lmaWVyLmFsaWduICsgIiI7CiAgdGhpcy5zaWduID0g c3BlY2lmaWVyLnNpZ24gPT09IHVuZGVmaW5lZCA/ICItIiA6IHNwZWNpZmllci5zaWduICsgIiI7 CiAgdGhpcy5zeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sID09PSB1bmRlZmluZWQgPyAiIiA6IHNw ZWNpZmllci5zeW1ib2wgKyAiIjsKICB0aGlzLnplcm8gPSAhIXNwZWNpZmllci56ZXJvOwogIHRo aXMud2lkdGggPSBzcGVjaWZpZXIud2lkdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtz cGVjaWZpZXIud2lkdGg7CiAgdGhpcy5jb21tYSA9ICEhc3BlY2lmaWVyLmNvbW1hOwogIHRoaXMu cHJlY2lzaW9uID0gc3BlY2lmaWVyLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVk IDogK3NwZWNpZmllci5wcmVjaXNpb247CiAgdGhpcy50cmltID0gISFzcGVjaWZpZXIudHJpbTsK ICB0aGlzLnR5cGUgPSBzcGVjaWZpZXIudHlwZSA9PT0gdW5kZWZpbmVkID8gIiIgOiBzcGVjaWZp ZXIudHlwZSArICIiOwp9CgpGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVu Y3Rpb24oKSB7CiAgcmV0dXJuIHRoaXMuZmlsbAogICAgICArIHRoaXMuYWxpZ24KICAgICAgKyB0 aGlzLnNpZ24KICAgICAgKyB0aGlzLnN5bWJvbAogICAgICArICh0aGlzLnplcm8gPyAiMCIgOiAi IikKICAgICAgKyAodGhpcy53aWR0aCA9PT0gdW5kZWZpbmVkID8gIiIgOiBNYXRoLm1heCgxLCB0 aGlzLndpZHRoIHwgMCkpCiAgICAgICsgKHRoaXMuY29tbWEgPyAiLCIgOiAiIikKICAgICAgKyAo dGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/ICIiIDogIi4iICsgTWF0aC5tYXgoMCwgdGhp cy5wcmVjaXNpb24gfCAwKSkKICAgICAgKyAodGhpcy50cmltID8gIn4iIDogIiIpCiAgICAgICsg dGhpcy50eXBlOwp9OwoKLy8gVHJpbXMgaW5zaWduaWZpY2FudCB6ZXJvcywgZS5nLiwgcmVwbGFj ZXMgMS4yMDAwayB3aXRoIDEuMmsuCmZ1bmN0aW9uIGZvcm1hdFRyaW0ocykgewogIG91dDogZm9y ICh2YXIgbiA9IHMubGVuZ3RoLCBpID0gMSwgaTAgPSAtMSwgaTE7IGkgPCBuOyArK2kpIHsKICAg IHN3aXRjaCAoc1tpXSkgewogICAgICBjYXNlICIuIjogaTAgPSBpMSA9IGk7IGJyZWFrOwogICAg ICBjYXNlICIwIjogaWYgKGkwID09PSAwKSBpMCA9IGk7IGkxID0gaTsgYnJlYWs7CiAgICAgIGRl ZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhazsK ICAgIH0KICB9CiAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSAr IDEpIDogczsKfQoKdmFyIHByZWZpeEV4cG9uZW50OwoKZnVuY3Rpb24gZm9ybWF0UHJlZml4QXV0 byh4LCBwKSB7CiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsKHgsIHApOwogIGlmICghZCkgcmV0dXJu IHggKyAiIjsKICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLAogICAgICBleHBvbmVudCA9IGRbMV0s CiAgICAgIGkgPSBleHBvbmVudCAtIChwcmVmaXhFeHBvbmVudCA9IE1hdGgubWF4KC04LCBNYXRo Lm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSwKICAgICAgbiA9IGNv ZWZmaWNpZW50Lmxlbmd0aDsKICByZXR1cm4gaSA9PT0gbiA/IGNvZWZmaWNpZW50CiAgICAgIDog aSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oIjAiKQogICAg ICA6IGkgPiAwID8gY29lZmZpY2llbnQuc2xpY2UoMCwgaSkgKyAiLiIgKyBjb2VmZmljaWVudC5z bGljZShpKQogICAgICA6ICIwLiIgKyBuZXcgQXJyYXkoMSAtIGkpLmpvaW4oIjAiKSArIGZvcm1h dERlY2ltYWwoeCwgTWF0aC5tYXgoMCwgcCArIGkgLSAxKSlbMF07IC8vIGxlc3MgdGhhbiAxeSEK fQoKZnVuY3Rpb24gZm9ybWF0Um91bmRlZCh4LCBwKSB7CiAgdmFyIGQgPSBmb3JtYXREZWNpbWFs KHgsIHApOwogIGlmICghZCkgcmV0dXJuIHggKyAiIjsKICB2YXIgY29lZmZpY2llbnQgPSBkWzBd LAogICAgICBleHBvbmVudCA9IGRbMV07CiAgcmV0dXJuIGV4cG9uZW50IDwgMCA/ICIwLiIgKyBu ZXcgQXJyYXkoLWV4cG9uZW50KS5qb2luKCIwIikgKyBjb2VmZmljaWVudAogICAgICA6IGNvZWZm aWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9u ZW50ICsgMSkgKyAiLiIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpCiAgICAgIDog Y29lZmZpY2llbnQgKyBuZXcgQXJyYXkoZXhwb25lbnQgLSBjb2VmZmljaWVudC5sZW5ndGggKyAy KS5qb2luKCIwIik7Cn0KCnZhciBmb3JtYXRUeXBlcyA9IHsKICAiJSI6IGZ1bmN0aW9uKHgsIHAp IHsgcmV0dXJuICh4ICogMTAwKS50b0ZpeGVkKHApOyB9LAogICJiIjogZnVuY3Rpb24oeCkgeyBy ZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygyKTsgfSwKICAiYyI6IGZ1bmN0aW9uKHgpIHsg cmV0dXJuIHggKyAiIjsgfSwKICAiZCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQo eCkudG9TdHJpbmcoMTApOyB9LAogICJlIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0V4 cG9uZW50aWFsKHApOyB9LAogICJmIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0ZpeGVk KHApOyB9LAogICJnIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b1ByZWNpc2lvbihwKTsg fSwKICAibyI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoOCk7 IH0sCiAgInAiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiBmb3JtYXRSb3VuZGVkKHggKiAxMDAs IHApOyB9LAogICJyIjogZm9ybWF0Um91bmRlZCwKICAicyI6IGZvcm1hdFByZWZpeEF1dG8sCiAg IlgiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1Vw cGVyQ2FzZSgpOyB9LAogICJ4IjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50 b1N0cmluZygxNik7IH0KfTsKCmZ1bmN0aW9uIGlkZW50aXR5JDMoeCkgewogIHJldHVybiB4Owp9 Cgp2YXIgbWFwJDIgPSBBcnJheS5wcm90b3R5cGUubWFwLAogICAgcHJlZml4ZXMgPSBbInkiLCJ6 IiwiYSIsImYiLCJwIiwibiIsIlx4QjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwi WiIsIlkiXTsKCmZ1bmN0aW9uIGZvcm1hdExvY2FsZShsb2NhbGUpIHsKICB2YXIgZ3JvdXAgPSBs b2NhbGUuZ3JvdXBpbmcgPT09IHVuZGVmaW5lZCB8fCBsb2NhbGUudGhvdXNhbmRzID09PSB1bmRl ZmluZWQgPyBpZGVudGl0eSQzIDogZm9ybWF0R3JvdXAobWFwJDIuY2FsbChsb2NhbGUuZ3JvdXBp bmcsIE51bWJlciksIGxvY2FsZS50aG91c2FuZHMgKyAiIiksCiAgICAgIGN1cnJlbmN5UHJlZml4 ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyAiIiA6IGxvY2FsZS5jdXJyZW5jeVsw XSArICIiLAogICAgICBjdXJyZW5jeVN1ZmZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZp bmVkID8gIiIgOiBsb2NhbGUuY3VycmVuY3lbMV0gKyAiIiwKICAgICAgZGVjaW1hbCA9IGxvY2Fs ZS5kZWNpbWFsID09PSB1bmRlZmluZWQgPyAiLiIgOiBsb2NhbGUuZGVjaW1hbCArICIiLAogICAg ICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkkMyA6 IGZvcm1hdE51bWVyYWxzKG1hcCQyLmNhbGwobG9jYWxlLm51bWVyYWxzLCBTdHJpbmcpKSwKICAg ICAgcGVyY2VudCA9IGxvY2FsZS5wZXJjZW50ID09PSB1bmRlZmluZWQgPyAiJSIgOiBsb2NhbGUu cGVyY2VudCArICIiLAogICAgICBtaW51cyA9IGxvY2FsZS5taW51cyA9PT0gdW5kZWZpbmVkID8g Ii0iIDogbG9jYWxlLm1pbnVzICsgIiIsCiAgICAgIG5hbiA9IGxvY2FsZS5uYW4gPT09IHVuZGVm aW5lZCA/ICJOYU4iIDogbG9jYWxlLm5hbiArICIiOwoKICBmdW5jdGlvbiBuZXdGb3JtYXQoc3Bl Y2lmaWVyKSB7CiAgICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTsKCiAg ICB2YXIgZmlsbCA9IHNwZWNpZmllci5maWxsLAogICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFs aWduLAogICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbiwKICAgICAgICBzeW1ib2wgPSBzcGVj aWZpZXIuc3ltYm9sLAogICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybywKICAgICAgICB3aWR0 aCA9IHNwZWNpZmllci53aWR0aCwKICAgICAgICBjb21tYSA9IHNwZWNpZmllci5jb21tYSwKICAg ICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLAogICAgICAgIHRyaW0gPSBzcGVj aWZpZXIudHJpbSwKICAgICAgICB0eXBlID0gc3BlY2lmaWVyLnR5cGU7CgogICAgLy8gVGhlICJu IiB0eXBlIGlzIGFuIGFsaWFzIGZvciAiLGciLgogICAgaWYgKHR5cGUgPT09ICJuIikgY29tbWEg PSB0cnVlLCB0eXBlID0gImciOwoKICAgIC8vIFRoZSAiIiB0eXBlLCBhbmQgYW55IGludmFsaWQg dHlwZSwgaXMgYW4gYWxpYXMgZm9yICIuMTJ+ZyIuCiAgICBlbHNlIGlmICghZm9ybWF0VHlwZXNb dHlwZV0pIHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkICYmIChwcmVjaXNpb24gPSAxMiksIHRyaW0g PSB0cnVlLCB0eXBlID0gImciOwoKICAgIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBh ZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLgogICAgaWYgKHplcm8gfHwg KGZpbGwgPT09ICIwIiAmJiBhbGlnbiA9PT0gIj0iKSkgemVybyA9IHRydWUsIGZpbGwgPSAiMCIs IGFsaWduID0gIj0iOwoKICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LgogICAg Ly8gRm9yIFNJLXByZWZpeCwgdGhlIHN1ZmZpeCBpcyBsYXppbHkgY29tcHV0ZWQuCiAgICB2YXIg cHJlZml4ID0gc3ltYm9sID09PSAiJCIgPyBjdXJyZW5jeVByZWZpeCA6IHN5bWJvbCA9PT0gIiMi ICYmIC9bYm94WF0vLnRlc3QodHlwZSkgPyAiMCIgKyB0eXBlLnRvTG93ZXJDYXNlKCkgOiAiIiwK ICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5U3VmZml4IDogL1slcF0v LnRlc3QodHlwZSkgPyBwZXJjZW50IDogIiI7CgogICAgLy8gV2hhdCBmb3JtYXQgZnVuY3Rpb24g c2hvdWxkIHdlIHVzZT8KICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlPwogICAgLy8gQ2Fu IHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj8KICAgIHZhciBmb3JtYXRU eXBlID0gZm9ybWF0VHlwZXNbdHlwZV0sCiAgICAgICAgbWF5YmVTdWZmaXggPSAvW2RlZmdwcnMl XS8udGVzdCh0eXBlKTsKCiAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG5vdCBz cGVjaWZpZWQsCiAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUg c3VwcG9ydGVkIHJhbmdlLgogICAgLy8gRm9yIHNpZ25pZmljYW50IHByZWNpc2lvbiwgaXQgbXVz dCBiZSBpbiBbMSwgMjFdLgogICAgLy8gRm9yIGZpeGVkIHByZWNpc2lvbiwgaXQgbXVzdCBiZSBp biBbMCwgMjBdLgogICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyA2CiAg ICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHBy ZWNpc2lvbikpCiAgICAgICAgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcHJlY2lzaW9uKSk7 CgogICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7CiAgICAgIHZhciB2YWx1ZVByZWZpeCA9IHBy ZWZpeCwKICAgICAgICAgIHZhbHVlU3VmZml4ID0gc3VmZml4LAogICAgICAgICAgaSwgbiwgYzsK CiAgICAgIGlmICh0eXBlID09PSAiYyIpIHsKICAgICAgICB2YWx1ZVN1ZmZpeCA9IGZvcm1hdFR5 cGUodmFsdWUpICsgdmFsdWVTdWZmaXg7CiAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgfSBlbHNl IHsKICAgICAgICB2YWx1ZSA9ICt2YWx1ZTsKCiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBzaWdu LiAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhCiAgICAgICAgdmFyIHZhbHVl TmVnYXRpdmUgPSB2YWx1ZSA8IDAgfHwgMSAvIHZhbHVlIDwgMDsKCiAgICAgICAgLy8gUGVyZm9y bSB0aGUgaW5pdGlhbCBmb3JtYXR0aW5nLgogICAgICAgIHZhbHVlID0gaXNOYU4odmFsdWUpID8g bmFuIDogZm9ybWF0VHlwZShNYXRoLmFicyh2YWx1ZSksIHByZWNpc2lvbik7CgogICAgICAgIC8v IFRyaW0gaW5zaWduaWZpY2FudCB6ZXJvcy4KICAgICAgICBpZiAodHJpbSkgdmFsdWUgPSBmb3Jt YXRUcmltKHZhbHVlKTsKCiAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8g emVybyBhZnRlciBmb3JtYXR0aW5nLCBhbmQgbm8gZXhwbGljaXQgcG9zaXRpdmUgc2lnbiBpcyBy ZXF1ZXN0ZWQsIGhpZGUgdGhlIHNpZ24uCiAgICAgICAgaWYgKHZhbHVlTmVnYXRpdmUgJiYgK3Zh bHVlID09PSAwICYmIHNpZ24gIT09ICIrIikgdmFsdWVOZWdhdGl2ZSA9IGZhbHNlOwoKICAgICAg ICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC4KICAgICAgICB2YWx1ZVByZWZpeCA9 ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09ICIoIiA/IHNpZ24gOiBtaW51cykgOiBzaWduID09 PSAiLSIgfHwgc2lnbiA9PT0gIigiID8gIiIgOiBzaWduKSArIHZhbHVlUHJlZml4OwogICAgICAg IHZhbHVlU3VmZml4ID0gKHR5cGUgPT09ICJzIiA/IHByZWZpeGVzWzggKyBwcmVmaXhFeHBvbmVu dCAvIDNdIDogIiIpICsgdmFsdWVTdWZmaXggKyAodmFsdWVOZWdhdGl2ZSAmJiBzaWduID09PSAi KCIgPyAiKSIgOiAiIik7CgogICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50 byB0aGUgaW50ZWdlciDigJx2YWx1ZeKAnSBwYXJ0IHRoYXQgY2FuIGJlCiAgICAgICAgLy8gZ3Jv dXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwg4oCcc3VmZml44oCdIHBhcnQgdGhh dCBpcyBub3QuCiAgICAgICAgaWYgKG1heWJlU3VmZml4KSB7CiAgICAgICAgICBpID0gLTEsIG4g PSB2YWx1ZS5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgICBp ZiAoYyA9IHZhbHVlLmNoYXJDb2RlQXQoaSksIDQ4ID4gYyB8fCBjID4gNTcpIHsKICAgICAgICAg ICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsg MSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDsKICAgICAgICAgICAgICB2YWx1ZSA9 IHZhbHVlLnNsaWNlKDAsIGkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAg ICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0 ZXIgaXMgbm90ICIwIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBiZWZvcmUgcGFkZGluZy4KICAgICAg aWYgKGNvbW1hICYmICF6ZXJvKSB2YWx1ZSA9IGdyb3VwKHZhbHVlLCBJbmZpbml0eSk7CgogICAg ICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLgogICAgICB2YXIgbGVuZ3RoID0gdmFsdWVQcmVmaXgu bGVuZ3RoICsgdmFsdWUubGVuZ3RoICsgdmFsdWVTdWZmaXgubGVuZ3RoLAogICAgICAgICAgcGFk ZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9p bihmaWxsKSA6ICIiOwoKICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzICIwIiwgZ3Jv dXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLgogICAgICBpZiAoY29tbWEgJiYgemVybykg dmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2 YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSAiIjsKCiAgICAgIC8vIFJl Y29uc3RydWN0IHRoZSBmaW5hbCBvdXRwdXQgYmFzZWQgb24gdGhlIGRlc2lyZWQgYWxpZ25tZW50 LgogICAgICBzd2l0Y2ggKGFsaWduKSB7CiAgICAgICAgY2FzZSAiPCI6IHZhbHVlID0gdmFsdWVQ cmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsgYnJlYWs7CiAgICAgICAgY2Fz ZSAiPSI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyBwYWRkaW5nICsgdmFsdWUgKyB2YWx1ZVN1ZmZp eDsgYnJlYWs7CiAgICAgICAgY2FzZSAiXiI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5n dGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1 ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogdmFs dWUgPSBwYWRkaW5nICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhazsK ICAgICAgfQoKICAgICAgcmV0dXJuIG51bWVyYWxzKHZhbHVlKTsKICAgIH0KCiAgICBmb3JtYXQu dG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHNwZWNpZmllciArICIiOwogICAg fTsKCiAgICByZXR1cm4gZm9ybWF0OwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0UHJlZml4KHNwZWNp ZmllciwgdmFsdWUpIHsKICAgIHZhciBmID0gbmV3Rm9ybWF0KChzcGVjaWZpZXIgPSBmb3JtYXRT cGVjaWZpZXIoc3BlY2lmaWVyKSwgc3BlY2lmaWVyLnR5cGUgPSAiZiIsIHNwZWNpZmllcikpLAog ICAgICAgIGUgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCQx KHZhbHVlKSAvIDMpKSkgKiAzLAogICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLAogICAgICAg IHByZWZpeCA9IHByZWZpeGVzWzggKyBlIC8gM107CiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUp IHsKICAgICAgcmV0dXJuIGYoayAqIHZhbHVlKSArIHByZWZpeDsKICAgIH07CiAgfQoKICByZXR1 cm4gewogICAgZm9ybWF0OiBuZXdGb3JtYXQsCiAgICBmb3JtYXRQcmVmaXg6IGZvcm1hdFByZWZp eAogIH07Cn0KCnZhciBsb2NhbGU7CgpkZWZhdWx0TG9jYWxlKHsKICBkZWNpbWFsOiAiLiIsCiAg dGhvdXNhbmRzOiAiLCIsCiAgZ3JvdXBpbmc6IFszXSwKICBjdXJyZW5jeTogWyIkIiwgIiJdLAog IG1pbnVzOiAiLSIKfSk7CgpmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pIHsKICBs b2NhbGUgPSBmb3JtYXRMb2NhbGUoZGVmaW5pdGlvbik7CiAgZXhwb3J0cy5mb3JtYXQgPSBsb2Nh bGUuZm9ybWF0OwogIGV4cG9ydHMuZm9ybWF0UHJlZml4ID0gbG9jYWxlLmZvcm1hdFByZWZpeDsK ICByZXR1cm4gbG9jYWxlOwp9CgpmdW5jdGlvbiBwcmVjaXNpb25GaXhlZChzdGVwKSB7CiAgcmV0 dXJuIE1hdGgubWF4KDAsIC1leHBvbmVudCQxKE1hdGguYWJzKHN0ZXApKSk7Cn0KCmZ1bmN0aW9u IHByZWNpc2lvblByZWZpeChzdGVwLCB2YWx1ZSkgewogIHJldHVybiBNYXRoLm1heCgwLCBNYXRo Lm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCQxKHZhbHVlKSAvIDMpKSkg KiAzIC0gZXhwb25lbnQkMShNYXRoLmFicyhzdGVwKSkpOwp9CgpmdW5jdGlvbiBwcmVjaXNpb25S b3VuZChzdGVwLCBtYXgpIHsKICBzdGVwID0gTWF0aC5hYnMoc3RlcCksIG1heCA9IE1hdGguYWJz KG1heCkgLSBzdGVwOwogIHJldHVybiBNYXRoLm1heCgwLCBleHBvbmVudCQxKG1heCkgLSBleHBv bmVudCQxKHN0ZXApKSArIDE7Cn0KCi8vIEFkZHMgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB3aXRo IHR3aWNlIHRoZSBub3JtYWwgcHJlY2lzaW9uLgovLyBSZWZlcmVuY2U6IEouIFIuIFNoZXdjaHVr LCBBZGFwdGl2ZSBQcmVjaXNpb24gRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYyBhbmQKLy8gRmFz dCBSb2J1c3QgR2VvbWV0cmljIFByZWRpY2F0ZXMsIERpc2NyZXRlICYgQ29tcHV0YXRpb25hbCBH ZW9tZXRyeSAxOCgzKQovLyAzMDXigJMzNjMgKDE5OTcpLgovLyBDb2RlIGFkYXB0ZWQgZnJvbSBH ZW9ncmFwaGljTGliIGJ5IENoYXJsZXMgRi4gRi4gS2FybmV5LAovLyBodHRwOi8vZ2VvZ3JhcGhp Y2xpYi5zb3VyY2Vmb3JnZS5uZXQvCgpmdW5jdGlvbiBhZGRlcigpIHsKICByZXR1cm4gbmV3IEFk ZGVyOwp9CgpmdW5jdGlvbiBBZGRlcigpIHsKICB0aGlzLnJlc2V0KCk7Cn0KCkFkZGVyLnByb3Rv dHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogQWRkZXIsCiAgcmVzZXQ6IGZ1bmN0aW9uKCkgewogICAg dGhpcy5zID0gLy8gcm91bmRlZCB2YWx1ZQogICAgdGhpcy50ID0gMDsgLy8gZXhhY3QgZXJyb3IK ICB9LAogIGFkZDogZnVuY3Rpb24oeSkgewogICAgYWRkJDEodGVtcCwgeSwgdGhpcy50KTsKICAg IGFkZCQxKHRoaXMsIHRlbXAucywgdGhpcy5zKTsKICAgIGlmICh0aGlzLnMpIHRoaXMudCArPSB0 ZW1wLnQ7CiAgICBlbHNlIHRoaXMucyA9IHRlbXAudDsKICB9LAogIHZhbHVlT2Y6IGZ1bmN0aW9u KCkgewogICAgcmV0dXJuIHRoaXMuczsKICB9Cn07Cgp2YXIgdGVtcCA9IG5ldyBBZGRlcjsKCmZ1 bmN0aW9uIGFkZCQxKGFkZGVyLCBhLCBiKSB7CiAgdmFyIHggPSBhZGRlci5zID0gYSArIGIsCiAg ICAgIGJ2ID0geCAtIGEsCiAgICAgIGF2ID0geCAtIGJ2OwogIGFkZGVyLnQgPSAoYSAtIGF2KSAr IChiIC0gYnYpOwp9Cgp2YXIgZXBzaWxvbiQyID0gMWUtNjsKdmFyIGVwc2lsb24yJDEgPSAxZS0x MjsKdmFyIHBpJDMgPSBNYXRoLlBJOwp2YXIgaGFsZlBpJDIgPSBwaSQzIC8gMjsKdmFyIHF1YXJ0 ZXJQaSA9IHBpJDMgLyA0Owp2YXIgdGF1JDMgPSBwaSQzICogMjsKCnZhciBkZWdyZWVzJDEgPSAx ODAgLyBwaSQzOwp2YXIgcmFkaWFucyA9IHBpJDMgLyAxODA7Cgp2YXIgYWJzID0gTWF0aC5hYnM7 CnZhciBhdGFuID0gTWF0aC5hdGFuOwp2YXIgYXRhbjIgPSBNYXRoLmF0YW4yOwp2YXIgY29zJDEg PSBNYXRoLmNvczsKdmFyIGNlaWwgPSBNYXRoLmNlaWw7CnZhciBleHAgPSBNYXRoLmV4cDsKdmFy IGxvZyA9IE1hdGgubG9nOwp2YXIgcG93ID0gTWF0aC5wb3c7CnZhciBzaW4kMSA9IE1hdGguc2lu Owp2YXIgc2lnbiA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbih4KSB7IHJldHVybiB4ID4gMCA/IDEg OiB4IDwgMCA/IC0xIDogMDsgfTsKdmFyIHNxcnQgPSBNYXRoLnNxcnQ7CnZhciB0YW4gPSBNYXRo LnRhbjsKCmZ1bmN0aW9uIGFjb3MoeCkgewogIHJldHVybiB4ID4gMSA/IDAgOiB4IDwgLTEgPyBw aSQzIDogTWF0aC5hY29zKHgpOwp9CgpmdW5jdGlvbiBhc2luKHgpIHsKICByZXR1cm4geCA+IDEg PyBoYWxmUGkkMiA6IHggPCAtMSA/IC1oYWxmUGkkMiA6IE1hdGguYXNpbih4KTsKfQoKZnVuY3Rp b24gaGF2ZXJzaW4oeCkgewogIHJldHVybiAoeCA9IHNpbiQxKHggLyAyKSkgKiB4Owp9CgpmdW5j dGlvbiBub29wJDIoKSB7fQoKZnVuY3Rpb24gc3RyZWFtR2VvbWV0cnkoZ2VvbWV0cnksIHN0cmVh bSkgewogIGlmIChnZW9tZXRyeSAmJiBzdHJlYW1HZW9tZXRyeVR5cGUuaGFzT3duUHJvcGVydHko Z2VvbWV0cnkudHlwZSkpIHsKICAgIHN0cmVhbUdlb21ldHJ5VHlwZVtnZW9tZXRyeS50eXBlXShn ZW9tZXRyeSwgc3RyZWFtKTsKICB9Cn0KCnZhciBzdHJlYW1PYmplY3RUeXBlID0gewogIEZlYXR1 cmU6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICBzdHJlYW1HZW9tZXRyeShvYmplY3Qu Z2VvbWV0cnksIHN0cmVhbSk7CiAgfSwKICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24ob2Jq ZWN0LCBzdHJlYW0pIHsKICAgIHZhciBmZWF0dXJlcyA9IG9iamVjdC5mZWF0dXJlcywgaSA9IC0x LCBuID0gZmVhdHVyZXMubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IG4pIHN0cmVhbUdlb21ldHJ5 KGZlYXR1cmVzW2ldLmdlb21ldHJ5LCBzdHJlYW0pOwogIH0KfTsKCnZhciBzdHJlYW1HZW9tZXRy eVR5cGUgPSB7CiAgU3BoZXJlOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgc3RyZWFt LnNwaGVyZSgpOwogIH0sCiAgUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICBv YmplY3QgPSBvYmplY3QuY29vcmRpbmF0ZXM7CiAgICBzdHJlYW0ucG9pbnQob2JqZWN0WzBdLCBv YmplY3RbMV0sIG9iamVjdFsyXSk7CiAgfSwKICBNdWx0aVBvaW50OiBmdW5jdGlvbihvYmplY3Qs IHN0cmVhbSkgewogICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0g LTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICB3aGlsZSAoKytpIDwgbikgb2JqZWN0ID0g Y29vcmRpbmF0ZXNbaV0sIHN0cmVhbS5wb2ludChvYmplY3RbMF0sIG9iamVjdFsxXSwgb2JqZWN0 WzJdKTsKICB9LAogIExpbmVTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICBz dHJlYW1MaW5lKG9iamVjdC5jb29yZGluYXRlcywgc3RyZWFtLCAwKTsKICB9LAogIE11bHRpTGlu ZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHsKICAgIHZhciBjb29yZGluYXRlcyA9 IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAg d2hpbGUgKCsraSA8IG4pIHN0cmVhbUxpbmUoY29vcmRpbmF0ZXNbaV0sIHN0cmVhbSwgMCk7CiAg fSwKICBQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgc3RyZWFtUG9seWdv bihvYmplY3QuY29vcmRpbmF0ZXMsIHN0cmVhbSk7CiAgfSwKICBNdWx0aVBvbHlnb246IGZ1bmN0 aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRp bmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBu KSBzdHJlYW1Qb2x5Z29uKGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0pOwogIH0sCiAgR2VvbWV0cnlD b2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgdmFyIGdlb21ldHJpZXMg PSBvYmplY3QuZ2VvbWV0cmllcywgaSA9IC0xLCBuID0gZ2VvbWV0cmllcy5sZW5ndGg7CiAgICB3 aGlsZSAoKytpIDwgbikgc3RyZWFtR2VvbWV0cnkoZ2VvbWV0cmllc1tpXSwgc3RyZWFtKTsKICB9 Cn07CgpmdW5jdGlvbiBzdHJlYW1MaW5lKGNvb3JkaW5hdGVzLCBzdHJlYW0sIGNsb3NlZCkgewog IHZhciBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGggLSBjbG9zZWQsIGNvb3JkaW5hdGU7 CiAgc3RyZWFtLmxpbmVTdGFydCgpOwogIHdoaWxlICgrK2kgPCBuKSBjb29yZGluYXRlID0gY29v cmRpbmF0ZXNbaV0sIHN0cmVhbS5wb2ludChjb29yZGluYXRlWzBdLCBjb29yZGluYXRlWzFdLCBj b29yZGluYXRlWzJdKTsKICBzdHJlYW0ubGluZUVuZCgpOwp9CgpmdW5jdGlvbiBzdHJlYW1Qb2x5 Z29uKGNvb3JkaW5hdGVzLCBzdHJlYW0pIHsKICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMu bGVuZ3RoOwogIHN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICB3aGlsZSAoKytpIDwgbikgc3RyZWFt TGluZShjb29yZGluYXRlc1tpXSwgc3RyZWFtLCAxKTsKICBzdHJlYW0ucG9seWdvbkVuZCgpOwp9 CgpmdW5jdGlvbiBnZW9TdHJlYW0ob2JqZWN0LCBzdHJlYW0pIHsKICBpZiAob2JqZWN0ICYmIHN0 cmVhbU9iamVjdFR5cGUuaGFzT3duUHJvcGVydHkob2JqZWN0LnR5cGUpKSB7CiAgICBzdHJlYW1P YmplY3RUeXBlW29iamVjdC50eXBlXShvYmplY3QsIHN0cmVhbSk7CiAgfSBlbHNlIHsKICAgIHN0 cmVhbUdlb21ldHJ5KG9iamVjdCwgc3RyZWFtKTsKICB9Cn0KCnZhciBhcmVhUmluZ1N1bSA9IGFk ZGVyKCk7Cgp2YXIgYXJlYVN1bSA9IGFkZGVyKCksCiAgICBsYW1iZGEwMCwKICAgIHBoaTAwLAog ICAgbGFtYmRhMCwKICAgIGNvc1BoaTAsCiAgICBzaW5QaGkwOwoKdmFyIGFyZWFTdHJlYW0gPSB7 CiAgcG9pbnQ6IG5vb3AkMiwKICBsaW5lU3RhcnQ6IG5vb3AkMiwKICBsaW5lRW5kOiBub29wJDIs CiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIGFyZWFSaW5nU3VtLnJlc2V0KCk7CiAg ICBhcmVhU3RyZWFtLmxpbmVTdGFydCA9IGFyZWFSaW5nU3RhcnQ7CiAgICBhcmVhU3RyZWFtLmxp bmVFbmQgPSBhcmVhUmluZ0VuZDsKICB9LAogIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAg dmFyIGFyZWFSaW5nID0gK2FyZWFSaW5nU3VtOwogICAgYXJlYVN1bS5hZGQoYXJlYVJpbmcgPCAw ID8gdGF1JDMgKyBhcmVhUmluZyA6IGFyZWFSaW5nKTsKICAgIHRoaXMubGluZVN0YXJ0ID0gdGhp cy5saW5lRW5kID0gdGhpcy5wb2ludCA9IG5vb3AkMjsKICB9LAogIHNwaGVyZTogZnVuY3Rpb24o KSB7CiAgICBhcmVhU3VtLmFkZCh0YXUkMyk7CiAgfQp9OwoKZnVuY3Rpb24gYXJlYVJpbmdTdGFy dCgpIHsKICBhcmVhU3RyZWFtLnBvaW50ID0gYXJlYVBvaW50Rmlyc3Q7Cn0KCmZ1bmN0aW9uIGFy ZWFSaW5nRW5kKCkgewogIGFyZWFQb2ludChsYW1iZGEwMCwgcGhpMDApOwp9CgpmdW5jdGlvbiBh cmVhUG9pbnRGaXJzdChsYW1iZGEsIHBoaSkgewogIGFyZWFTdHJlYW0ucG9pbnQgPSBhcmVhUG9p bnQ7CiAgbGFtYmRhMDAgPSBsYW1iZGEsIHBoaTAwID0gcGhpOwogIGxhbWJkYSAqPSByYWRpYW5z LCBwaGkgKj0gcmFkaWFuczsKICBsYW1iZGEwID0gbGFtYmRhLCBjb3NQaGkwID0gY29zJDEocGhp ID0gcGhpIC8gMiArIHF1YXJ0ZXJQaSksIHNpblBoaTAgPSBzaW4kMShwaGkpOwp9CgpmdW5jdGlv biBhcmVhUG9pbnQobGFtYmRhLCBwaGkpIHsKICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9IHJh ZGlhbnM7CiAgcGhpID0gcGhpIC8gMiArIHF1YXJ0ZXJQaTsgLy8gaGFsZiB0aGUgYW5ndWxhciBk aXN0YW5jZSBmcm9tIHNvdXRoIHBvbGUKCiAgLy8gU3BoZXJpY2FsIGV4Y2VzcyBFIGZvciBhIHNw aGVyaWNhbCB0cmlhbmdsZSB3aXRoIHZlcnRpY2VzOiBzb3V0aCBwb2xlLAogIC8vIHByZXZpb3Vz IHBvaW50LCBjdXJyZW50IHBvaW50LiAgVXNlcyBhIGZvcm11bGEgZGVyaXZlZCBmcm9tIENhZ25v bGnigJlzCiAgLy8gdGhlb3JlbS4gIFNlZSBUb2RodW50ZXIsIFNwaGVyaWNhbCBUcmlnLiAoMTg3 MSksIFNlYy4gMTAzLCBFcS4gKDIpLgogIHZhciBkTGFtYmRhID0gbGFtYmRhIC0gbGFtYmRhMCwK ICAgICAgc2RMYW1iZGEgPSBkTGFtYmRhID49IDAgPyAxIDogLTEsCiAgICAgIGFkTGFtYmRhID0g c2RMYW1iZGEgKiBkTGFtYmRhLAogICAgICBjb3NQaGkgPSBjb3MkMShwaGkpLAogICAgICBzaW5Q aGkgPSBzaW4kMShwaGkpLAogICAgICBrID0gc2luUGhpMCAqIHNpblBoaSwKICAgICAgdSA9IGNv c1BoaTAgKiBjb3NQaGkgKyBrICogY29zJDEoYWRMYW1iZGEpLAogICAgICB2ID0gayAqIHNkTGFt YmRhICogc2luJDEoYWRMYW1iZGEpOwogIGFyZWFSaW5nU3VtLmFkZChhdGFuMih2LCB1KSk7Cgog IC8vIEFkdmFuY2UgdGhlIHByZXZpb3VzIHBvaW50cy4KICBsYW1iZGEwID0gbGFtYmRhLCBjb3NQ aGkwID0gY29zUGhpLCBzaW5QaGkwID0gc2luUGhpOwp9CgpmdW5jdGlvbiBhcmVhJDEob2JqZWN0 KSB7CiAgYXJlYVN1bS5yZXNldCgpOwogIGdlb1N0cmVhbShvYmplY3QsIGFyZWFTdHJlYW0pOwog IHJldHVybiBhcmVhU3VtICogMjsKfQoKZnVuY3Rpb24gc3BoZXJpY2FsKGNhcnRlc2lhbikgewog IHJldHVybiBbYXRhbjIoY2FydGVzaWFuWzFdLCBjYXJ0ZXNpYW5bMF0pLCBhc2luKGNhcnRlc2lh blsyXSldOwp9CgpmdW5jdGlvbiBjYXJ0ZXNpYW4oc3BoZXJpY2FsKSB7CiAgdmFyIGxhbWJkYSA9 IHNwaGVyaWNhbFswXSwgcGhpID0gc3BoZXJpY2FsWzFdLCBjb3NQaGkgPSBjb3MkMShwaGkpOwog IHJldHVybiBbY29zUGhpICogY29zJDEobGFtYmRhKSwgY29zUGhpICogc2luJDEobGFtYmRhKSwg c2luJDEocGhpKV07Cn0KCmZ1bmN0aW9uIGNhcnRlc2lhbkRvdChhLCBiKSB7CiAgcmV0dXJuIGFb MF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTsKfQoKZnVuY3Rpb24gY2FydGVz aWFuQ3Jvc3MoYSwgYikgewogIHJldHVybiBbYVsxXSAqIGJbMl0gLSBhWzJdICogYlsxXSwgYVsy XSAqIGJbMF0gLSBhWzBdICogYlsyXSwgYVswXSAqIGJbMV0gLSBhWzFdICogYlswXV07Cn0KCi8v IFRPRE8gcmV0dXJuIGEKZnVuY3Rpb24gY2FydGVzaWFuQWRkSW5QbGFjZShhLCBiKSB7CiAgYVsw XSArPSBiWzBdLCBhWzFdICs9IGJbMV0sIGFbMl0gKz0gYlsyXTsKfQoKZnVuY3Rpb24gY2FydGVz aWFuU2NhbGUodmVjdG9yLCBrKSB7CiAgcmV0dXJuIFt2ZWN0b3JbMF0gKiBrLCB2ZWN0b3JbMV0g KiBrLCB2ZWN0b3JbMl0gKiBrXTsKfQoKLy8gVE9ETyByZXR1cm4gZApmdW5jdGlvbiBjYXJ0ZXNp YW5Ob3JtYWxpemVJblBsYWNlKGQpIHsKICB2YXIgbCA9IHNxcnQoZFswXSAqIGRbMF0gKyBkWzFd ICogZFsxXSArIGRbMl0gKiBkWzJdKTsKICBkWzBdIC89IGwsIGRbMV0gLz0gbCwgZFsyXSAvPSBs Owp9Cgp2YXIgbGFtYmRhMCQxLCBwaGkwLCBsYW1iZGExLCBwaGkxLCAvLyBib3VuZHMKICAgIGxh bWJkYTIsIC8vIHByZXZpb3VzIGxhbWJkYS1jb29yZGluYXRlCiAgICBsYW1iZGEwMCQxLCBwaGkw MCQxLCAvLyBmaXJzdCBwb2ludAogICAgcDAsIC8vIHByZXZpb3VzIDNEIHBvaW50CiAgICBkZWx0 YVN1bSA9IGFkZGVyKCksCiAgICByYW5nZXMsCiAgICByYW5nZTsKCnZhciBib3VuZHNTdHJlYW0g PSB7CiAgcG9pbnQ6IGJvdW5kc1BvaW50LAogIGxpbmVTdGFydDogYm91bmRzTGluZVN0YXJ0LAog IGxpbmVFbmQ6IGJvdW5kc0xpbmVFbmQsCiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAg IGJvdW5kc1N0cmVhbS5wb2ludCA9IGJvdW5kc1JpbmdQb2ludDsKICAgIGJvdW5kc1N0cmVhbS5s aW5lU3RhcnQgPSBib3VuZHNSaW5nU3RhcnQ7CiAgICBib3VuZHNTdHJlYW0ubGluZUVuZCA9IGJv dW5kc1JpbmdFbmQ7CiAgICBkZWx0YVN1bS5yZXNldCgpOwogICAgYXJlYVN0cmVhbS5wb2x5Z29u U3RhcnQoKTsKICB9LAogIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgYXJlYVN0cmVhbS5w b2x5Z29uRW5kKCk7CiAgICBib3VuZHNTdHJlYW0ucG9pbnQgPSBib3VuZHNQb2ludDsKICAgIGJv dW5kc1N0cmVhbS5saW5lU3RhcnQgPSBib3VuZHNMaW5lU3RhcnQ7CiAgICBib3VuZHNTdHJlYW0u bGluZUVuZCA9IGJvdW5kc0xpbmVFbmQ7CiAgICBpZiAoYXJlYVJpbmdTdW0gPCAwKSBsYW1iZGEw JDEgPSAtKGxhbWJkYTEgPSAxODApLCBwaGkwID0gLShwaGkxID0gOTApOwogICAgZWxzZSBpZiAo ZGVsdGFTdW0gPiBlcHNpbG9uJDIpIHBoaTEgPSA5MDsKICAgIGVsc2UgaWYgKGRlbHRhU3VtIDwg LWVwc2lsb24kMikgcGhpMCA9IC05MDsKICAgIHJhbmdlWzBdID0gbGFtYmRhMCQxLCByYW5nZVsx XSA9IGxhbWJkYTE7CiAgfSwKICBzcGhlcmU6IGZ1bmN0aW9uKCkgewogICAgbGFtYmRhMCQxID0g LShsYW1iZGExID0gMTgwKSwgcGhpMCA9IC0ocGhpMSA9IDkwKTsKICB9Cn07CgpmdW5jdGlvbiBi b3VuZHNQb2ludChsYW1iZGEsIHBoaSkgewogIHJhbmdlcy5wdXNoKHJhbmdlID0gW2xhbWJkYTAk MSA9IGxhbWJkYSwgbGFtYmRhMSA9IGxhbWJkYV0pOwogIGlmIChwaGkgPCBwaGkwKSBwaGkwID0g cGhpOwogIGlmIChwaGkgPiBwaGkxKSBwaGkxID0gcGhpOwp9CgpmdW5jdGlvbiBsaW5lUG9pbnQo bGFtYmRhLCBwaGkpIHsKICB2YXIgcCA9IGNhcnRlc2lhbihbbGFtYmRhICogcmFkaWFucywgcGhp ICogcmFkaWFuc10pOwogIGlmIChwMCkgewogICAgdmFyIG5vcm1hbCA9IGNhcnRlc2lhbkNyb3Nz KHAwLCBwKSwKICAgICAgICBlcXVhdG9yaWFsID0gW25vcm1hbFsxXSwgLW5vcm1hbFswXSwgMF0s CiAgICAgICAgaW5mbGVjdGlvbiA9IGNhcnRlc2lhbkNyb3NzKGVxdWF0b3JpYWwsIG5vcm1hbCk7 CiAgICBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKGluZmxlY3Rpb24pOwogICAgaW5mbGVjdGlv biA9IHNwaGVyaWNhbChpbmZsZWN0aW9uKTsKICAgIHZhciBkZWx0YSA9IGxhbWJkYSAtIGxhbWJk YTIsCiAgICAgICAgc2lnbiA9IGRlbHRhID4gMCA/IDEgOiAtMSwKICAgICAgICBsYW1iZGFpID0g aW5mbGVjdGlvblswXSAqIGRlZ3JlZXMkMSAqIHNpZ24sCiAgICAgICAgcGhpaSwKICAgICAgICBh bnRpbWVyaWRpYW4gPSBhYnMoZGVsdGEpID4gMTgwOwogICAgaWYgKGFudGltZXJpZGlhbiBeIChz aWduICogbGFtYmRhMiA8IGxhbWJkYWkgJiYgbGFtYmRhaSA8IHNpZ24gKiBsYW1iZGEpKSB7CiAg ICAgIHBoaWkgPSBpbmZsZWN0aW9uWzFdICogZGVncmVlcyQxOwogICAgICBpZiAocGhpaSA+IHBo aTEpIHBoaTEgPSBwaGlpOwogICAgfSBlbHNlIGlmIChsYW1iZGFpID0gKGxhbWJkYWkgKyAzNjAp ICUgMzYwIC0gMTgwLCBhbnRpbWVyaWRpYW4gXiAoc2lnbiAqIGxhbWJkYTIgPCBsYW1iZGFpICYm IGxhbWJkYWkgPCBzaWduICogbGFtYmRhKSkgewogICAgICBwaGlpID0gLWluZmxlY3Rpb25bMV0g KiBkZWdyZWVzJDE7CiAgICAgIGlmIChwaGlpIDwgcGhpMCkgcGhpMCA9IHBoaWk7CiAgICB9IGVs c2UgewogICAgICBpZiAocGhpIDwgcGhpMCkgcGhpMCA9IHBoaTsKICAgICAgaWYgKHBoaSA+IHBo aTEpIHBoaTEgPSBwaGk7CiAgICB9CiAgICBpZiAoYW50aW1lcmlkaWFuKSB7CiAgICAgIGlmIChs YW1iZGEgPCBsYW1iZGEyKSB7CiAgICAgICAgaWYgKGFuZ2xlKGxhbWJkYTAkMSwgbGFtYmRhKSA+ IGFuZ2xlKGxhbWJkYTAkMSwgbGFtYmRhMSkpIGxhbWJkYTEgPSBsYW1iZGE7CiAgICAgIH0gZWxz ZSB7CiAgICAgICAgaWYgKGFuZ2xlKGxhbWJkYSwgbGFtYmRhMSkgPiBhbmdsZShsYW1iZGEwJDEs IGxhbWJkYTEpKSBsYW1iZGEwJDEgPSBsYW1iZGE7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAg IGlmIChsYW1iZGExID49IGxhbWJkYTAkMSkgewogICAgICAgIGlmIChsYW1iZGEgPCBsYW1iZGEw JDEpIGxhbWJkYTAkMSA9IGxhbWJkYTsKICAgICAgICBpZiAobGFtYmRhID4gbGFtYmRhMSkgbGFt YmRhMSA9IGxhbWJkYTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAobGFtYmRhID4gbGFtYmRh MikgewogICAgICAgICAgaWYgKGFuZ2xlKGxhbWJkYTAkMSwgbGFtYmRhKSA+IGFuZ2xlKGxhbWJk YTAkMSwgbGFtYmRhMSkpIGxhbWJkYTEgPSBsYW1iZGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAg ICAgIGlmIChhbmdsZShsYW1iZGEsIGxhbWJkYTEpID4gYW5nbGUobGFtYmRhMCQxLCBsYW1iZGEx KSkgbGFtYmRhMCQxID0gbGFtYmRhOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0gZWxzZSB7 CiAgICByYW5nZXMucHVzaChyYW5nZSA9IFtsYW1iZGEwJDEgPSBsYW1iZGEsIGxhbWJkYTEgPSBs YW1iZGFdKTsKICB9CiAgaWYgKHBoaSA8IHBoaTApIHBoaTAgPSBwaGk7CiAgaWYgKHBoaSA+IHBo aTEpIHBoaTEgPSBwaGk7CiAgcDAgPSBwLCBsYW1iZGEyID0gbGFtYmRhOwp9CgpmdW5jdGlvbiBi b3VuZHNMaW5lU3RhcnQoKSB7CiAgYm91bmRzU3RyZWFtLnBvaW50ID0gbGluZVBvaW50Owp9Cgpm dW5jdGlvbiBib3VuZHNMaW5lRW5kKCkgewogIHJhbmdlWzBdID0gbGFtYmRhMCQxLCByYW5nZVsx XSA9IGxhbWJkYTE7CiAgYm91bmRzU3RyZWFtLnBvaW50ID0gYm91bmRzUG9pbnQ7CiAgcDAgPSBu dWxsOwp9CgpmdW5jdGlvbiBib3VuZHNSaW5nUG9pbnQobGFtYmRhLCBwaGkpIHsKICBpZiAocDAp IHsKICAgIHZhciBkZWx0YSA9IGxhbWJkYSAtIGxhbWJkYTI7CiAgICBkZWx0YVN1bS5hZGQoYWJz KGRlbHRhKSA+IDE4MCA/IGRlbHRhICsgKGRlbHRhID4gMCA/IDM2MCA6IC0zNjApIDogZGVsdGEp OwogIH0gZWxzZSB7CiAgICBsYW1iZGEwMCQxID0gbGFtYmRhLCBwaGkwMCQxID0gcGhpOwogIH0K ICBhcmVhU3RyZWFtLnBvaW50KGxhbWJkYSwgcGhpKTsKICBsaW5lUG9pbnQobGFtYmRhLCBwaGkp Owp9CgpmdW5jdGlvbiBib3VuZHNSaW5nU3RhcnQoKSB7CiAgYXJlYVN0cmVhbS5saW5lU3RhcnQo KTsKfQoKZnVuY3Rpb24gYm91bmRzUmluZ0VuZCgpIHsKICBib3VuZHNSaW5nUG9pbnQobGFtYmRh MDAkMSwgcGhpMDAkMSk7CiAgYXJlYVN0cmVhbS5saW5lRW5kKCk7CiAgaWYgKGFicyhkZWx0YVN1 bSkgPiBlcHNpbG9uJDIpIGxhbWJkYTAkMSA9IC0obGFtYmRhMSA9IDE4MCk7CiAgcmFuZ2VbMF0g PSBsYW1iZGEwJDEsIHJhbmdlWzFdID0gbGFtYmRhMTsKICBwMCA9IG51bGw7Cn0KCi8vIEZpbmRz IHRoZSBsZWZ0LXJpZ2h0IGRpc3RhbmNlIGJldHdlZW4gdHdvIGxvbmdpdHVkZXMuCi8vIFRoaXMg aXMgYWxtb3N0IHRoZSBzYW1lIGFzIChsYW1iZGExIC0gbGFtYmRhMCArIDM2MMKwKSAlIDM2MMKw LCBleGNlcHQgdGhhdCB3ZSB3YW50Ci8vIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIMKxMTgwwrAgdG8g YmUgMzYwwrAuCmZ1bmN0aW9uIGFuZ2xlKGxhbWJkYTAsIGxhbWJkYTEpIHsKICByZXR1cm4gKGxh bWJkYTEgLT0gbGFtYmRhMCkgPCAwID8gbGFtYmRhMSArIDM2MCA6IGxhbWJkYTE7Cn0KCmZ1bmN0 aW9uIHJhbmdlQ29tcGFyZShhLCBiKSB7CiAgcmV0dXJuIGFbMF0gLSBiWzBdOwp9CgpmdW5jdGlv biByYW5nZUNvbnRhaW5zKHJhbmdlLCB4KSB7CiAgcmV0dXJuIHJhbmdlWzBdIDw9IHJhbmdlWzFd ID8gcmFuZ2VbMF0gPD0geCAmJiB4IDw9IHJhbmdlWzFdIDogeCA8IHJhbmdlWzBdIHx8IHJhbmdl WzFdIDwgeDsKfQoKZnVuY3Rpb24gYm91bmRzKGZlYXR1cmUpIHsKICB2YXIgaSwgbiwgYSwgYiwg bWVyZ2VkLCBkZWx0YU1heCwgZGVsdGE7CgogIHBoaTEgPSBsYW1iZGExID0gLShsYW1iZGEwJDEg PSBwaGkwID0gSW5maW5pdHkpOwogIHJhbmdlcyA9IFtdOwogIGdlb1N0cmVhbShmZWF0dXJlLCBi b3VuZHNTdHJlYW0pOwoKICAvLyBGaXJzdCwgc29ydCByYW5nZXMgYnkgdGhlaXIgbWluaW11bSBs b25naXR1ZGVzLgogIGlmIChuID0gcmFuZ2VzLmxlbmd0aCkgewogICAgcmFuZ2VzLnNvcnQocmFu Z2VDb21wYXJlKTsKCiAgICAvLyBUaGVuLCBtZXJnZSBhbnkgcmFuZ2VzIHRoYXQgb3ZlcmxhcC4K ICAgIGZvciAoaSA9IDEsIGEgPSByYW5nZXNbMF0sIG1lcmdlZCA9IFthXTsgaSA8IG47ICsraSkg ewogICAgICBiID0gcmFuZ2VzW2ldOwogICAgICBpZiAocmFuZ2VDb250YWlucyhhLCBiWzBdKSB8 fCByYW5nZUNvbnRhaW5zKGEsIGJbMV0pKSB7CiAgICAgICAgaWYgKGFuZ2xlKGFbMF0sIGJbMV0p ID4gYW5nbGUoYVswXSwgYVsxXSkpIGFbMV0gPSBiWzFdOwogICAgICAgIGlmIChhbmdsZShiWzBd LCBhWzFdKSA+IGFuZ2xlKGFbMF0sIGFbMV0pKSBhWzBdID0gYlswXTsKICAgICAgfSBlbHNlIHsK ICAgICAgICBtZXJnZWQucHVzaChhID0gYik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBGaW5hbGx5 LCBmaW5kIHRoZSBsYXJnZXN0IGdhcCBiZXR3ZWVuIHRoZSBtZXJnZWQgcmFuZ2VzLgogICAgLy8g VGhlIGZpbmFsIGJvdW5kaW5nIGJveCB3aWxsIGJlIHRoZSBpbnZlcnNlIG9mIHRoaXMgZ2FwLgog ICAgZm9yIChkZWx0YU1heCA9IC1JbmZpbml0eSwgbiA9IG1lcmdlZC5sZW5ndGggLSAxLCBpID0g MCwgYSA9IG1lcmdlZFtuXTsgaSA8PSBuOyBhID0gYiwgKytpKSB7CiAgICAgIGIgPSBtZXJnZWRb aV07CiAgICAgIGlmICgoZGVsdGEgPSBhbmdsZShhWzFdLCBiWzBdKSkgPiBkZWx0YU1heCkgZGVs dGFNYXggPSBkZWx0YSwgbGFtYmRhMCQxID0gYlswXSwgbGFtYmRhMSA9IGFbMV07CiAgICB9CiAg fQoKICByYW5nZXMgPSByYW5nZSA9IG51bGw7CgogIHJldHVybiBsYW1iZGEwJDEgPT09IEluZmlu aXR5IHx8IHBoaTAgPT09IEluZmluaXR5CiAgICAgID8gW1tOYU4sIE5hTl0sIFtOYU4sIE5hTl1d CiAgICAgIDogW1tsYW1iZGEwJDEsIHBoaTBdLCBbbGFtYmRhMSwgcGhpMV1dOwp9Cgp2YXIgVzAs IFcxLAogICAgWDAsIFkwLCBaMCwKICAgIFgxLCBZMSwgWjEsCiAgICBYMiwgWTIsIFoyLAogICAg bGFtYmRhMDAkMiwgcGhpMDAkMiwgLy8gZmlyc3QgcG9pbnQKICAgIHgwLCB5MCwgejA7IC8vIHBy ZXZpb3VzIHBvaW50Cgp2YXIgY2VudHJvaWRTdHJlYW0gPSB7CiAgc3BoZXJlOiBub29wJDIsCiAg cG9pbnQ6IGNlbnRyb2lkUG9pbnQsCiAgbGluZVN0YXJ0OiBjZW50cm9pZExpbmVTdGFydCwKICBs aW5lRW5kOiBjZW50cm9pZExpbmVFbmQsCiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAg IGNlbnRyb2lkU3RyZWFtLmxpbmVTdGFydCA9IGNlbnRyb2lkUmluZ1N0YXJ0OwogICAgY2VudHJv aWRTdHJlYW0ubGluZUVuZCA9IGNlbnRyb2lkUmluZ0VuZDsKICB9LAogIHBvbHlnb25FbmQ6IGZ1 bmN0aW9uKCkgewogICAgY2VudHJvaWRTdHJlYW0ubGluZVN0YXJ0ID0gY2VudHJvaWRMaW5lU3Rh cnQ7CiAgICBjZW50cm9pZFN0cmVhbS5saW5lRW5kID0gY2VudHJvaWRMaW5lRW5kOwogIH0KfTsK Ci8vIEFyaXRobWV0aWMgbWVhbiBvZiBDYXJ0ZXNpYW4gdmVjdG9ycy4KZnVuY3Rpb24gY2VudHJv aWRQb2ludChsYW1iZGEsIHBoaSkgewogIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFu czsKICB2YXIgY29zUGhpID0gY29zJDEocGhpKTsKICBjZW50cm9pZFBvaW50Q2FydGVzaWFuKGNv c1BoaSAqIGNvcyQxKGxhbWJkYSksIGNvc1BoaSAqIHNpbiQxKGxhbWJkYSksIHNpbiQxKHBoaSkp Owp9CgpmdW5jdGlvbiBjZW50cm9pZFBvaW50Q2FydGVzaWFuKHgsIHksIHopIHsKICArK1cwOwog IFgwICs9ICh4IC0gWDApIC8gVzA7CiAgWTAgKz0gKHkgLSBZMCkgLyBXMDsKICBaMCArPSAoeiAt IFowKSAvIFcwOwp9CgpmdW5jdGlvbiBjZW50cm9pZExpbmVTdGFydCgpIHsKICBjZW50cm9pZFN0 cmVhbS5wb2ludCA9IGNlbnRyb2lkTGluZVBvaW50Rmlyc3Q7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lk TGluZVBvaW50Rmlyc3QobGFtYmRhLCBwaGkpIHsKICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9 IHJhZGlhbnM7CiAgdmFyIGNvc1BoaSA9IGNvcyQxKHBoaSk7CiAgeDAgPSBjb3NQaGkgKiBjb3Mk MShsYW1iZGEpOwogIHkwID0gY29zUGhpICogc2luJDEobGFtYmRhKTsKICB6MCA9IHNpbiQxKHBo aSk7CiAgY2VudHJvaWRTdHJlYW0ucG9pbnQgPSBjZW50cm9pZExpbmVQb2ludDsKICBjZW50cm9p ZFBvaW50Q2FydGVzaWFuKHgwLCB5MCwgejApOwp9CgpmdW5jdGlvbiBjZW50cm9pZExpbmVQb2lu dChsYW1iZGEsIHBoaSkgewogIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFuczsKICB2 YXIgY29zUGhpID0gY29zJDEocGhpKSwKICAgICAgeCA9IGNvc1BoaSAqIGNvcyQxKGxhbWJkYSks CiAgICAgIHkgPSBjb3NQaGkgKiBzaW4kMShsYW1iZGEpLAogICAgICB6ID0gc2luJDEocGhpKSwK ICAgICAgdyA9IGF0YW4yKHNxcnQoKHcgPSB5MCAqIHogLSB6MCAqIHkpICogdyArICh3ID0gejAg KiB4IC0geDAgKiB6KSAqIHcgKyAodyA9IHgwICogeSAtIHkwICogeCkgKiB3KSwgeDAgKiB4ICsg eTAgKiB5ICsgejAgKiB6KTsKICBXMSArPSB3OwogIFgxICs9IHcgKiAoeDAgKyAoeDAgPSB4KSk7 CiAgWTEgKz0gdyAqICh5MCArICh5MCA9IHkpKTsKICBaMSArPSB3ICogKHowICsgKHowID0geikp OwogIGNlbnRyb2lkUG9pbnRDYXJ0ZXNpYW4oeDAsIHkwLCB6MCk7Cn0KCmZ1bmN0aW9uIGNlbnRy b2lkTGluZUVuZCgpIHsKICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkUG9pbnQ7Cn0K Ci8vIFNlZSBKLiBFLiBCcm9jaywgVGhlIEluZXJ0aWEgVGVuc29yIGZvciBhIFNwaGVyaWNhbCBU cmlhbmdsZSwKLy8gSi4gQXBwbGllZCBNZWNoYW5pY3MgNDIsIDIzOSAoMTk3NSkuCmZ1bmN0aW9u IGNlbnRyb2lkUmluZ1N0YXJ0KCkgewogIGNlbnRyb2lkU3RyZWFtLnBvaW50ID0gY2VudHJvaWRS aW5nUG9pbnRGaXJzdDsKfQoKZnVuY3Rpb24gY2VudHJvaWRSaW5nRW5kKCkgewogIGNlbnRyb2lk UmluZ1BvaW50KGxhbWJkYTAwJDIsIHBoaTAwJDIpOwogIGNlbnRyb2lkU3RyZWFtLnBvaW50ID0g Y2VudHJvaWRQb2ludDsKfQoKZnVuY3Rpb24gY2VudHJvaWRSaW5nUG9pbnRGaXJzdChsYW1iZGEs IHBoaSkgewogIGxhbWJkYTAwJDIgPSBsYW1iZGEsIHBoaTAwJDIgPSBwaGk7CiAgbGFtYmRhICo9 IHJhZGlhbnMsIHBoaSAqPSByYWRpYW5zOwogIGNlbnRyb2lkU3RyZWFtLnBvaW50ID0gY2VudHJv aWRSaW5nUG9pbnQ7CiAgdmFyIGNvc1BoaSA9IGNvcyQxKHBoaSk7CiAgeDAgPSBjb3NQaGkgKiBj b3MkMShsYW1iZGEpOwogIHkwID0gY29zUGhpICogc2luJDEobGFtYmRhKTsKICB6MCA9IHNpbiQx KHBoaSk7CiAgY2VudHJvaWRQb2ludENhcnRlc2lhbih4MCwgeTAsIHowKTsKfQoKZnVuY3Rpb24g Y2VudHJvaWRSaW5nUG9pbnQobGFtYmRhLCBwaGkpIHsKICBsYW1iZGEgKj0gcmFkaWFucywgcGhp ICo9IHJhZGlhbnM7CiAgdmFyIGNvc1BoaSA9IGNvcyQxKHBoaSksCiAgICAgIHggPSBjb3NQaGkg KiBjb3MkMShsYW1iZGEpLAogICAgICB5ID0gY29zUGhpICogc2luJDEobGFtYmRhKSwKICAgICAg eiA9IHNpbiQxKHBoaSksCiAgICAgIGN4ID0geTAgKiB6IC0gejAgKiB5LAogICAgICBjeSA9IHow ICogeCAtIHgwICogeiwKICAgICAgY3ogPSB4MCAqIHkgLSB5MCAqIHgsCiAgICAgIG0gPSBzcXJ0 KGN4ICogY3ggKyBjeSAqIGN5ICsgY3ogKiBjeiksCiAgICAgIHcgPSBhc2luKG0pLCAvLyBsaW5l IHdlaWdodCA9IGFuZ2xlCiAgICAgIHYgPSBtICYmIC13IC8gbTsgLy8gYXJlYSB3ZWlnaHQgbXVs dGlwbGllcgogIFgyICs9IHYgKiBjeDsKICBZMiArPSB2ICogY3k7CiAgWjIgKz0gdiAqIGN6Owog IFcxICs9IHc7CiAgWDEgKz0gdyAqICh4MCArICh4MCA9IHgpKTsKICBZMSArPSB3ICogKHkwICsg KHkwID0geSkpOwogIFoxICs9IHcgKiAoejAgKyAoejAgPSB6KSk7CiAgY2VudHJvaWRQb2ludENh cnRlc2lhbih4MCwgeTAsIHowKTsKfQoKZnVuY3Rpb24gY2VudHJvaWQob2JqZWN0KSB7CiAgVzAg PSBXMSA9CiAgWDAgPSBZMCA9IFowID0KICBYMSA9IFkxID0gWjEgPQogIFgyID0gWTIgPSBaMiA9 IDA7CiAgZ2VvU3RyZWFtKG9iamVjdCwgY2VudHJvaWRTdHJlYW0pOwoKICB2YXIgeCA9IFgyLAog ICAgICB5ID0gWTIsCiAgICAgIHogPSBaMiwKICAgICAgbSA9IHggKiB4ICsgeSAqIHkgKyB6ICog ejsKCiAgLy8gSWYgdGhlIGFyZWEtd2VpZ2h0ZWQgY2NlbnRyb2lkIGlzIHVuZGVmaW5lZCwgZmFs bCBiYWNrIHRvIGxlbmd0aC13ZWlnaHRlZCBjY2VudHJvaWQuCiAgaWYgKG0gPCBlcHNpbG9uMiQx KSB7CiAgICB4ID0gWDEsIHkgPSBZMSwgeiA9IFoxOwogICAgLy8gSWYgdGhlIGZlYXR1cmUgaGFz IHplcm8gbGVuZ3RoLCBmYWxsIGJhY2sgdG8gYXJpdGhtZXRpYyBtZWFuIG9mIHBvaW50IHZlY3Rv cnMuCiAgICBpZiAoVzEgPCBlcHNpbG9uJDIpIHggPSBYMCwgeSA9IFkwLCB6ID0gWjA7CiAgICBt ID0geCAqIHggKyB5ICogeSArIHogKiB6OwogICAgLy8gSWYgdGhlIGZlYXR1cmUgc3RpbGwgaGFz IGFuIHVuZGVmaW5lZCBjY2VudHJvaWQsIHRoZW4gcmV0dXJuLgogICAgaWYgKG0gPCBlcHNpbG9u MiQxKSByZXR1cm4gW05hTiwgTmFOXTsKICB9CgogIHJldHVybiBbYXRhbjIoeSwgeCkgKiBkZWdy ZWVzJDEsIGFzaW4oeiAvIHNxcnQobSkpICogZGVncmVlcyQxXTsKfQoKZnVuY3Rpb24gY29uc3Rh bnQkOCh4KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHg7CiAgfTsKfQoKZnVu Y3Rpb24gY29tcG9zZShhLCBiKSB7CgogIGZ1bmN0aW9uIGNvbXBvc2UoeCwgeSkgewogICAgcmV0 dXJuIHggPSBhKHgsIHkpLCBiKHhbMF0sIHhbMV0pOwogIH0KCiAgaWYgKGEuaW52ZXJ0ICYmIGIu aW52ZXJ0KSBjb21wb3NlLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHJldHVybiB4ID0g Yi5pbnZlcnQoeCwgeSksIHggJiYgYS5pbnZlcnQoeFswXSwgeFsxXSk7CiAgfTsKCiAgcmV0dXJu IGNvbXBvc2U7Cn0KCmZ1bmN0aW9uIHJvdGF0aW9uSWRlbnRpdHkobGFtYmRhLCBwaGkpIHsKICBy ZXR1cm4gW2FicyhsYW1iZGEpID4gcGkkMyA/IGxhbWJkYSArIE1hdGgucm91bmQoLWxhbWJkYSAv IHRhdSQzKSAqIHRhdSQzIDogbGFtYmRhLCBwaGldOwp9Cgpyb3RhdGlvbklkZW50aXR5LmludmVy dCA9IHJvdGF0aW9uSWRlbnRpdHk7CgpmdW5jdGlvbiByb3RhdGVSYWRpYW5zKGRlbHRhTGFtYmRh LCBkZWx0YVBoaSwgZGVsdGFHYW1tYSkgewogIHJldHVybiAoZGVsdGFMYW1iZGEgJT0gdGF1JDMp ID8gKGRlbHRhUGhpIHx8IGRlbHRhR2FtbWEgPyBjb21wb3NlKHJvdGF0aW9uTGFtYmRhKGRlbHRh TGFtYmRhKSwgcm90YXRpb25QaGlHYW1tYShkZWx0YVBoaSwgZGVsdGFHYW1tYSkpCiAgICA6IHJv dGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSkKICAgIDogKGRlbHRhUGhpIHx8IGRlbHRhR2FtbWEg PyByb3RhdGlvblBoaUdhbW1hKGRlbHRhUGhpLCBkZWx0YUdhbW1hKQogICAgOiByb3RhdGlvbklk ZW50aXR5KTsKfQoKZnVuY3Rpb24gZm9yd2FyZFJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKGxhbWJkYSwgcGhpKSB7CiAgICByZXR1cm4gbGFtYmRhICs9IGRl bHRhTGFtYmRhLCBbbGFtYmRhID4gcGkkMyA/IGxhbWJkYSAtIHRhdSQzIDogbGFtYmRhIDwgLXBp JDMgPyBsYW1iZGEgKyB0YXUkMyA6IGxhbWJkYSwgcGhpXTsKICB9Owp9CgpmdW5jdGlvbiByb3Rh dGlvbkxhbWJkYShkZWx0YUxhbWJkYSkgewogIHZhciByb3RhdGlvbiA9IGZvcndhcmRSb3RhdGlv bkxhbWJkYShkZWx0YUxhbWJkYSk7CiAgcm90YXRpb24uaW52ZXJ0ID0gZm9yd2FyZFJvdGF0aW9u TGFtYmRhKC1kZWx0YUxhbWJkYSk7CiAgcmV0dXJuIHJvdGF0aW9uOwp9CgpmdW5jdGlvbiByb3Rh dGlvblBoaUdhbW1hKGRlbHRhUGhpLCBkZWx0YUdhbW1hKSB7CiAgdmFyIGNvc0RlbHRhUGhpID0g Y29zJDEoZGVsdGFQaGkpLAogICAgICBzaW5EZWx0YVBoaSA9IHNpbiQxKGRlbHRhUGhpKSwKICAg ICAgY29zRGVsdGFHYW1tYSA9IGNvcyQxKGRlbHRhR2FtbWEpLAogICAgICBzaW5EZWx0YUdhbW1h ID0gc2luJDEoZGVsdGFHYW1tYSk7CgogIGZ1bmN0aW9uIHJvdGF0aW9uKGxhbWJkYSwgcGhpKSB7 CiAgICB2YXIgY29zUGhpID0gY29zJDEocGhpKSwKICAgICAgICB4ID0gY29zJDEobGFtYmRhKSAq IGNvc1BoaSwKICAgICAgICB5ID0gc2luJDEobGFtYmRhKSAqIGNvc1BoaSwKICAgICAgICB6ID0g c2luJDEocGhpKSwKICAgICAgICBrID0geiAqIGNvc0RlbHRhUGhpICsgeCAqIHNpbkRlbHRhUGhp OwogICAgcmV0dXJuIFsKICAgICAgYXRhbjIoeSAqIGNvc0RlbHRhR2FtbWEgLSBrICogc2luRGVs dGFHYW1tYSwgeCAqIGNvc0RlbHRhUGhpIC0geiAqIHNpbkRlbHRhUGhpKSwKICAgICAgYXNpbihr ICogY29zRGVsdGFHYW1tYSArIHkgKiBzaW5EZWx0YUdhbW1hKQogICAgXTsKICB9CgogIHJvdGF0 aW9uLmludmVydCA9IGZ1bmN0aW9uKGxhbWJkYSwgcGhpKSB7CiAgICB2YXIgY29zUGhpID0gY29z JDEocGhpKSwKICAgICAgICB4ID0gY29zJDEobGFtYmRhKSAqIGNvc1BoaSwKICAgICAgICB5ID0g c2luJDEobGFtYmRhKSAqIGNvc1BoaSwKICAgICAgICB6ID0gc2luJDEocGhpKSwKICAgICAgICBr ID0geiAqIGNvc0RlbHRhR2FtbWEgLSB5ICogc2luRGVsdGFHYW1tYTsKICAgIHJldHVybiBbCiAg ICAgIGF0YW4yKHkgKiBjb3NEZWx0YUdhbW1hICsgeiAqIHNpbkRlbHRhR2FtbWEsIHggKiBjb3NE ZWx0YVBoaSArIGsgKiBzaW5EZWx0YVBoaSksCiAgICAgIGFzaW4oayAqIGNvc0RlbHRhUGhpIC0g eCAqIHNpbkRlbHRhUGhpKQogICAgXTsKICB9OwoKICByZXR1cm4gcm90YXRpb247Cn0KCmZ1bmN0 aW9uIHJvdGF0aW9uKHJvdGF0ZSkgewogIHJvdGF0ZSA9IHJvdGF0ZVJhZGlhbnMocm90YXRlWzBd ICogcmFkaWFucywgcm90YXRlWzFdICogcmFkaWFucywgcm90YXRlLmxlbmd0aCA+IDIgPyByb3Rh dGVbMl0gKiByYWRpYW5zIDogMCk7CgogIGZ1bmN0aW9uIGZvcndhcmQoY29vcmRpbmF0ZXMpIHsK ICAgIGNvb3JkaW5hdGVzID0gcm90YXRlKGNvb3JkaW5hdGVzWzBdICogcmFkaWFucywgY29vcmRp bmF0ZXNbMV0gKiByYWRpYW5zKTsKICAgIHJldHVybiBjb29yZGluYXRlc1swXSAqPSBkZWdyZWVz JDEsIGNvb3JkaW5hdGVzWzFdICo9IGRlZ3JlZXMkMSwgY29vcmRpbmF0ZXM7CiAgfQoKICBmb3J3 YXJkLmludmVydCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7CiAgICBjb29yZGluYXRlcyA9IHJv dGF0ZS5pbnZlcnQoY29vcmRpbmF0ZXNbMF0gKiByYWRpYW5zLCBjb29yZGluYXRlc1sxXSAqIHJh ZGlhbnMpOwogICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdICo9IGRlZ3JlZXMkMSwgY29vcmRpbmF0 ZXNbMV0gKj0gZGVncmVlcyQxLCBjb29yZGluYXRlczsKICB9OwoKICByZXR1cm4gZm9yd2FyZDsK fQoKLy8gR2VuZXJhdGVzIGEgY2lyY2xlIGNlbnRlcmVkIGF0IFswwrAsIDDCsF0sIHdpdGggYSBn aXZlbiByYWRpdXMgYW5kIHByZWNpc2lvbi4KZnVuY3Rpb24gY2lyY2xlU3RyZWFtKHN0cmVhbSwg cmFkaXVzLCBkZWx0YSwgZGlyZWN0aW9uLCB0MCwgdDEpIHsKICBpZiAoIWRlbHRhKSByZXR1cm47 CiAgdmFyIGNvc1JhZGl1cyA9IGNvcyQxKHJhZGl1cyksCiAgICAgIHNpblJhZGl1cyA9IHNpbiQx KHJhZGl1cyksCiAgICAgIHN0ZXAgPSBkaXJlY3Rpb24gKiBkZWx0YTsKICBpZiAodDAgPT0gbnVs bCkgewogICAgdDAgPSByYWRpdXMgKyBkaXJlY3Rpb24gKiB0YXUkMzsKICAgIHQxID0gcmFkaXVz IC0gc3RlcCAvIDI7CiAgfSBlbHNlIHsKICAgIHQwID0gY2lyY2xlUmFkaXVzKGNvc1JhZGl1cywg dDApOwogICAgdDEgPSBjaXJjbGVSYWRpdXMoY29zUmFkaXVzLCB0MSk7CiAgICBpZiAoZGlyZWN0 aW9uID4gMCA/IHQwIDwgdDEgOiB0MCA+IHQxKSB0MCArPSBkaXJlY3Rpb24gKiB0YXUkMzsKICB9 CiAgZm9yICh2YXIgcG9pbnQsIHQgPSB0MDsgZGlyZWN0aW9uID4gMCA/IHQgPiB0MSA6IHQgPCB0 MTsgdCAtPSBzdGVwKSB7CiAgICBwb2ludCA9IHNwaGVyaWNhbChbY29zUmFkaXVzLCAtc2luUmFk aXVzICogY29zJDEodCksIC1zaW5SYWRpdXMgKiBzaW4kMSh0KV0pOwogICAgc3RyZWFtLnBvaW50 KHBvaW50WzBdLCBwb2ludFsxXSk7CiAgfQp9CgovLyBSZXR1cm5zIHRoZSBzaWduZWQgYW5nbGUg b2YgYSBjYXJ0ZXNpYW4gcG9pbnQgcmVsYXRpdmUgdG8gW2Nvc1JhZGl1cywgMCwgMF0uCmZ1bmN0 aW9uIGNpcmNsZVJhZGl1cyhjb3NSYWRpdXMsIHBvaW50KSB7CiAgcG9pbnQgPSBjYXJ0ZXNpYW4o cG9pbnQpLCBwb2ludFswXSAtPSBjb3NSYWRpdXM7CiAgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFj ZShwb2ludCk7CiAgdmFyIHJhZGl1cyA9IGFjb3MoLXBvaW50WzFdKTsKICByZXR1cm4gKCgtcG9p bnRbMl0gPCAwID8gLXJhZGl1cyA6IHJhZGl1cykgKyB0YXUkMyAtIGVwc2lsb24kMikgJSB0YXUk MzsKfQoKZnVuY3Rpb24gY2lyY2xlKCkgewogIHZhciBjZW50ZXIgPSBjb25zdGFudCQ4KFswLCAw XSksCiAgICAgIHJhZGl1cyA9IGNvbnN0YW50JDgoOTApLAogICAgICBwcmVjaXNpb24gPSBjb25z dGFudCQ4KDYpLAogICAgICByaW5nLAogICAgICByb3RhdGUsCiAgICAgIHN0cmVhbSA9IHtwb2lu dDogcG9pbnR9OwoKICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7CiAgICByaW5nLnB1c2goeCA9IHJv dGF0ZSh4LCB5KSk7CiAgICB4WzBdICo9IGRlZ3JlZXMkMSwgeFsxXSAqPSBkZWdyZWVzJDE7CiAg fQoKICBmdW5jdGlvbiBjaXJjbGUoKSB7CiAgICB2YXIgYyA9IGNlbnRlci5hcHBseSh0aGlzLCBh cmd1bWVudHMpLAogICAgICAgIHIgPSByYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSAqIHJh ZGlhbnMsCiAgICAgICAgcCA9IHByZWNpc2lvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpICogcmFk aWFuczsKICAgIHJpbmcgPSBbXTsKICAgIHJvdGF0ZSA9IHJvdGF0ZVJhZGlhbnMoLWNbMF0gKiBy YWRpYW5zLCAtY1sxXSAqIHJhZGlhbnMsIDApLmludmVydDsKICAgIGNpcmNsZVN0cmVhbShzdHJl YW0sIHIsIHAsIDEpOwogICAgYyA9IHt0eXBlOiAiUG9seWdvbiIsIGNvb3JkaW5hdGVzOiBbcmlu Z119OwogICAgcmluZyA9IHJvdGF0ZSA9IG51bGw7CiAgICByZXR1cm4gYzsKICB9CgogIGNpcmNs ZS5jZW50ZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChj ZW50ZXIgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ4KFsrX1swXSwg K19bMV1dKSwgY2lyY2xlKSA6IGNlbnRlcjsKICB9OwoKICBjaXJjbGUucmFkaXVzID0gZnVuY3Rp b24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlwZW9mIF8g PT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkOCgrXyksIGNpcmNsZSkgOiByYWRpdXM7CiAg fTsKCiAgY2lyY2xlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID8gKHByZWNpc2lvbiA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNv bnN0YW50JDgoK18pLCBjaXJjbGUpIDogcHJlY2lzaW9uOwogIH07CgogIHJldHVybiBjaXJjbGU7 Cn0KCmZ1bmN0aW9uIGNsaXBCdWZmZXIoKSB7CiAgdmFyIGxpbmVzID0gW10sCiAgICAgIGxpbmU7 CiAgcmV0dXJuIHsKICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGxpbmUucHVzaChb eCwgeV0pOwogICAgfSwKICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIGxpbmVzLnB1 c2gobGluZSA9IFtdKTsKICAgIH0sCiAgICBsaW5lRW5kOiBub29wJDIsCiAgICByZWpvaW46IGZ1 bmN0aW9uKCkgewogICAgICBpZiAobGluZXMubGVuZ3RoID4gMSkgbGluZXMucHVzaChsaW5lcy5w b3AoKS5jb25jYXQobGluZXMuc2hpZnQoKSkpOwogICAgfSwKICAgIHJlc3VsdDogZnVuY3Rpb24o KSB7CiAgICAgIHZhciByZXN1bHQgPSBsaW5lczsKICAgICAgbGluZXMgPSBbXTsKICAgICAgbGlu ZSA9IG51bGw7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gcG9p bnRFcXVhbChhLCBiKSB7CiAgcmV0dXJuIGFicyhhWzBdIC0gYlswXSkgPCBlcHNpbG9uJDIgJiYg YWJzKGFbMV0gLSBiWzFdKSA8IGVwc2lsb24kMjsKfQoKZnVuY3Rpb24gSW50ZXJzZWN0aW9uKHBv aW50LCBwb2ludHMsIG90aGVyLCBlbnRyeSkgewogIHRoaXMueCA9IHBvaW50OwogIHRoaXMueiA9 IHBvaW50czsKICB0aGlzLm8gPSBvdGhlcjsgLy8gYW5vdGhlciBpbnRlcnNlY3Rpb24KICB0aGlz LmUgPSBlbnRyeTsgLy8gaXMgYW4gZW50cnk/CiAgdGhpcy52ID0gZmFsc2U7IC8vIHZpc2l0ZWQK ICB0aGlzLm4gPSB0aGlzLnAgPSBudWxsOyAvLyBuZXh0ICYgcHJldmlvdXMKfQoKLy8gQSBnZW5l cmFsaXplZCBwb2x5Z29uIGNsaXBwaW5nIGFsZ29yaXRobTogZ2l2ZW4gYSBwb2x5Z29uIHRoYXQg aGFzIGJlZW4gY3V0Ci8vIGludG8gaXRzIHZpc2libGUgbGluZSBzZWdtZW50cywgYW5kIHJlam9p bnMgdGhlIHNlZ21lbnRzIGJ5IGludGVycG9sYXRpbmcKLy8gYWxvbmcgdGhlIGNsaXAgZWRnZS4K ZnVuY3Rpb24gY2xpcFJlam9pbihzZWdtZW50cywgY29tcGFyZUludGVyc2VjdGlvbiwgc3RhcnRJ bnNpZGUsIGludGVycG9sYXRlLCBzdHJlYW0pIHsKICB2YXIgc3ViamVjdCA9IFtdLAogICAgICBj bGlwID0gW10sCiAgICAgIGksCiAgICAgIG47CgogIHNlZ21lbnRzLmZvckVhY2goZnVuY3Rpb24o c2VnbWVudCkgewogICAgaWYgKChuID0gc2VnbWVudC5sZW5ndGggLSAxKSA8PSAwKSByZXR1cm47 CiAgICB2YXIgbiwgcDAgPSBzZWdtZW50WzBdLCBwMSA9IHNlZ21lbnRbbl0sIHg7CgogICAgLy8g SWYgdGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBvZiBhIHNlZ21lbnQgYXJlIGNvaW5jaWRlbnQs IHRoZW4gdHJlYXQgYXMgYQogICAgLy8gY2xvc2VkIHJpbmcuIFRPRE8gaWYgYWxsIHJpbmdzIGFy ZSBjbG9zZWQsIHRoZW4gdGhlIHdpbmRpbmcgb3JkZXIgb2YgdGhlCiAgICAvLyBleHRlcmlvciBy aW5nIHNob3VsZCBiZSBjaGVja2VkLgogICAgaWYgKHBvaW50RXF1YWwocDAsIHAxKSkgewogICAg ICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHN0cmVh bS5wb2ludCgocDAgPSBzZWdtZW50W2ldKVswXSwgcDBbMV0pOwogICAgICBzdHJlYW0ubGluZUVu ZCgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgc3ViamVjdC5wdXNoKHggPSBuZXcgSW50ZXJz ZWN0aW9uKHAwLCBzZWdtZW50LCBudWxsLCB0cnVlKSk7CiAgICBjbGlwLnB1c2goeC5vID0gbmV3 IEludGVyc2VjdGlvbihwMCwgbnVsbCwgeCwgZmFsc2UpKTsKICAgIHN1YmplY3QucHVzaCh4ID0g bmV3IEludGVyc2VjdGlvbihwMSwgc2VnbWVudCwgbnVsbCwgZmFsc2UpKTsKICAgIGNsaXAucHVz aCh4Lm8gPSBuZXcgSW50ZXJzZWN0aW9uKHAxLCBudWxsLCB4LCB0cnVlKSk7CiAgfSk7CgogIGlm ICghc3ViamVjdC5sZW5ndGgpIHJldHVybjsKCiAgY2xpcC5zb3J0KGNvbXBhcmVJbnRlcnNlY3Rp b24pOwogIGxpbmskMShzdWJqZWN0KTsKICBsaW5rJDEoY2xpcCk7CgogIGZvciAoaSA9IDAsIG4g PSBjbGlwLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgY2xpcFtpXS5lID0gc3RhcnRJbnNpZGUg PSAhc3RhcnRJbnNpZGU7CiAgfQoKICB2YXIgc3RhcnQgPSBzdWJqZWN0WzBdLAogICAgICBwb2lu dHMsCiAgICAgIHBvaW50OwoKICB3aGlsZSAoMSkgewogICAgLy8gRmluZCBmaXJzdCB1bnZpc2l0 ZWQgaW50ZXJzZWN0aW9uLgogICAgdmFyIGN1cnJlbnQgPSBzdGFydCwKICAgICAgICBpc1N1Ympl Y3QgPSB0cnVlOwogICAgd2hpbGUgKGN1cnJlbnQudikgaWYgKChjdXJyZW50ID0gY3VycmVudC5u KSA9PT0gc3RhcnQpIHJldHVybjsKICAgIHBvaW50cyA9IGN1cnJlbnQuejsKICAgIHN0cmVhbS5s aW5lU3RhcnQoKTsKICAgIGRvIHsKICAgICAgY3VycmVudC52ID0gY3VycmVudC5vLnYgPSB0cnVl OwogICAgICBpZiAoY3VycmVudC5lKSB7CiAgICAgICAgaWYgKGlzU3ViamVjdCkgewogICAgICAg ICAgZm9yIChpID0gMCwgbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBuOyArK2kpIHN0cmVhbS5wb2lu dCgocG9pbnQgPSBwb2ludHNbaV0pWzBdLCBwb2ludFsxXSk7CiAgICAgICAgfSBlbHNlIHsKICAg ICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5uLngsIDEsIHN0cmVhbSk7CiAg ICAgICAgfQogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm47CiAgICAgIH0gZWxzZSB7CiAgICAg ICAgaWYgKGlzU3ViamVjdCkgewogICAgICAgICAgcG9pbnRzID0gY3VycmVudC5wLno7CiAgICAg ICAgICBmb3IgKGkgPSBwb2ludHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHN0cmVhbS5wb2lu dCgocG9pbnQgPSBwb2ludHNbaV0pWzBdLCBwb2ludFsxXSk7CiAgICAgICAgfSBlbHNlIHsKICAg ICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5wLngsIC0xLCBzdHJlYW0pOwog ICAgICAgIH0KICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wOwogICAgICB9CiAgICAgIGN1cnJl bnQgPSBjdXJyZW50Lm87CiAgICAgIHBvaW50cyA9IGN1cnJlbnQuejsKICAgICAgaXNTdWJqZWN0 ID0gIWlzU3ViamVjdDsKICAgIH0gd2hpbGUgKCFjdXJyZW50LnYpOwogICAgc3RyZWFtLmxpbmVF bmQoKTsKICB9Cn0KCmZ1bmN0aW9uIGxpbmskMShhcnJheSkgewogIGlmICghKG4gPSBhcnJheS5s ZW5ndGgpKSByZXR1cm47CiAgdmFyIG4sCiAgICAgIGkgPSAwLAogICAgICBhID0gYXJyYXlbMF0s CiAgICAgIGI7CiAgd2hpbGUgKCsraSA8IG4pIHsKICAgIGEubiA9IGIgPSBhcnJheVtpXTsKICAg IGIucCA9IGE7CiAgICBhID0gYjsKICB9CiAgYS5uID0gYiA9IGFycmF5WzBdOwogIGIucCA9IGE7 Cn0KCnZhciBzdW0kMSA9IGFkZGVyKCk7CgpmdW5jdGlvbiBsb25naXR1ZGUocG9pbnQpIHsKICBp ZiAoYWJzKHBvaW50WzBdKSA8PSBwaSQzKQogICAgcmV0dXJuIHBvaW50WzBdOwogIGVsc2UKICAg IHJldHVybiBzaWduKHBvaW50WzBdKSAqICgoYWJzKHBvaW50WzBdKSArIHBpJDMpICUgdGF1JDMg LSBwaSQzKTsKfQoKZnVuY3Rpb24gcG9seWdvbkNvbnRhaW5zKHBvbHlnb24sIHBvaW50KSB7CiAg dmFyIGxhbWJkYSA9IGxvbmdpdHVkZShwb2ludCksCiAgICAgIHBoaSA9IHBvaW50WzFdLAogICAg ICBzaW5QaGkgPSBzaW4kMShwaGkpLAogICAgICBub3JtYWwgPSBbc2luJDEobGFtYmRhKSwgLWNv cyQxKGxhbWJkYSksIDBdLAogICAgICBhbmdsZSA9IDAsCiAgICAgIHdpbmRpbmcgPSAwOwoKICBz dW0kMS5yZXNldCgpOwoKICBpZiAoc2luUGhpID09PSAxKSBwaGkgPSBoYWxmUGkkMiArIGVwc2ls b24kMjsKICBlbHNlIGlmIChzaW5QaGkgPT09IC0xKSBwaGkgPSAtaGFsZlBpJDIgLSBlcHNpbG9u JDI7CgogIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHsK ICAgIGlmICghKG0gPSAocmluZyA9IHBvbHlnb25baV0pLmxlbmd0aCkpIGNvbnRpbnVlOwogICAg dmFyIHJpbmcsCiAgICAgICAgbSwKICAgICAgICBwb2ludDAgPSByaW5nW20gLSAxXSwKICAgICAg ICBsYW1iZGEwID0gbG9uZ2l0dWRlKHBvaW50MCksCiAgICAgICAgcGhpMCA9IHBvaW50MFsxXSAv IDIgKyBxdWFydGVyUGksCiAgICAgICAgc2luUGhpMCA9IHNpbiQxKHBoaTApLAogICAgICAgIGNv c1BoaTAgPSBjb3MkMShwaGkwKTsKCiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG07ICsraiwgbGFt YmRhMCA9IGxhbWJkYTEsIHNpblBoaTAgPSBzaW5QaGkxLCBjb3NQaGkwID0gY29zUGhpMSwgcG9p bnQwID0gcG9pbnQxKSB7CiAgICAgIHZhciBwb2ludDEgPSByaW5nW2pdLAogICAgICAgICAgbGFt YmRhMSA9IGxvbmdpdHVkZShwb2ludDEpLAogICAgICAgICAgcGhpMSA9IHBvaW50MVsxXSAvIDIg KyBxdWFydGVyUGksCiAgICAgICAgICBzaW5QaGkxID0gc2luJDEocGhpMSksCiAgICAgICAgICBj b3NQaGkxID0gY29zJDEocGhpMSksCiAgICAgICAgICBkZWx0YSA9IGxhbWJkYTEgLSBsYW1iZGEw LAogICAgICAgICAgc2lnbiA9IGRlbHRhID49IDAgPyAxIDogLTEsCiAgICAgICAgICBhYnNEZWx0 YSA9IHNpZ24gKiBkZWx0YSwKICAgICAgICAgIGFudGltZXJpZGlhbiA9IGFic0RlbHRhID4gcGkk MywKICAgICAgICAgIGsgPSBzaW5QaGkwICogc2luUGhpMTsKCiAgICAgIHN1bSQxLmFkZChhdGFu MihrICogc2lnbiAqIHNpbiQxKGFic0RlbHRhKSwgY29zUGhpMCAqIGNvc1BoaTEgKyBrICogY29z JDEoYWJzRGVsdGEpKSk7CiAgICAgIGFuZ2xlICs9IGFudGltZXJpZGlhbiA/IGRlbHRhICsgc2ln biAqIHRhdSQzIDogZGVsdGE7CgogICAgICAvLyBBcmUgdGhlIGxvbmdpdHVkZXMgZWl0aGVyIHNp ZGUgb2YgdGhlIHBvaW504oCZcyBtZXJpZGlhbiAobGFtYmRhKSwKICAgICAgLy8gYW5kIGFyZSB0 aGUgbGF0aXR1ZGVzIHNtYWxsZXIgdGhhbiB0aGUgcGFyYWxsZWwgKHBoaSk/CiAgICAgIGlmIChh bnRpbWVyaWRpYW4gXiBsYW1iZGEwID49IGxhbWJkYSBeIGxhbWJkYTEgPj0gbGFtYmRhKSB7CiAg ICAgICAgdmFyIGFyYyA9IGNhcnRlc2lhbkNyb3NzKGNhcnRlc2lhbihwb2ludDApLCBjYXJ0ZXNp YW4ocG9pbnQxKSk7CiAgICAgICAgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZShhcmMpOwogICAg ICAgIHZhciBpbnRlcnNlY3Rpb24gPSBjYXJ0ZXNpYW5Dcm9zcyhub3JtYWwsIGFyYyk7CiAgICAg ICAgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZShpbnRlcnNlY3Rpb24pOwogICAgICAgIHZhciBw aGlBcmMgPSAoYW50aW1lcmlkaWFuIF4gZGVsdGEgPj0gMCA/IC0xIDogMSkgKiBhc2luKGludGVy c2VjdGlvblsyXSk7CiAgICAgICAgaWYgKHBoaSA+IHBoaUFyYyB8fCBwaGkgPT09IHBoaUFyYyAm JiAoYXJjWzBdIHx8IGFyY1sxXSkpIHsKICAgICAgICAgIHdpbmRpbmcgKz0gYW50aW1lcmlkaWFu IF4gZGVsdGEgPj0gMCA/IDEgOiAtMTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8v IEZpcnN0LCBkZXRlcm1pbmUgd2hldGhlciB0aGUgU291dGggcG9sZSBpcyBpbnNpZGUgb3Igb3V0 c2lkZToKICAvLwogIC8vIEl0IGlzIGluc2lkZSBpZjoKICAvLyAqIHRoZSBwb2x5Z29uIHdpbmRz IGFyb3VuZCBpdCBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uCiAgLy8gKiB0aGUgcG9seWdvbiBk b2VzIG5vdCAoY3VtdWxhdGl2ZWx5KSB3aW5kIGFyb3VuZCBpdCwgYnV0IGhhcyBhIG5lZ2F0aXZl CiAgLy8gICAoY291bnRlci1jbG9ja3dpc2UpIGFyZWEuCiAgLy8KICAvLyBTZWNvbmQsIGNvdW50 IHRoZSAoc2lnbmVkKSBudW1iZXIgb2YgdGltZXMgYSBzZWdtZW50IGNyb3NzZXMgYSBsYW1iZGEK ICAvLyBmcm9tIHRoZSBwb2ludCB0byB0aGUgU291dGggcG9sZS4gIElmIGl0IGlzIHplcm8sIHRo ZW4gdGhlIHBvaW50IGlzIHRoZQogIC8vIHNhbWUgc2lkZSBhcyB0aGUgU291dGggcG9sZS4KCiAg cmV0dXJuIChhbmdsZSA8IC1lcHNpbG9uJDIgfHwgYW5nbGUgPCBlcHNpbG9uJDIgJiYgc3VtJDEg PCAtZXBzaWxvbiQyKSBeICh3aW5kaW5nICYgMSk7Cn0KCmZ1bmN0aW9uIGNsaXAocG9pbnRWaXNp YmxlLCBjbGlwTGluZSwgaW50ZXJwb2xhdGUsIHN0YXJ0KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHNp bmspIHsKICAgIHZhciBsaW5lID0gY2xpcExpbmUoc2luayksCiAgICAgICAgcmluZ0J1ZmZlciA9 IGNsaXBCdWZmZXIoKSwKICAgICAgICByaW5nU2luayA9IGNsaXBMaW5lKHJpbmdCdWZmZXIpLAog ICAgICAgIHBvbHlnb25TdGFydGVkID0gZmFsc2UsCiAgICAgICAgcG9seWdvbiwKICAgICAgICBz ZWdtZW50cywKICAgICAgICByaW5nOwoKICAgIHZhciBjbGlwID0gewogICAgICBwb2ludDogcG9p bnQsCiAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LAogICAgICBsaW5lRW5kOiBsaW5lRW5kLAog ICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGNsaXAucG9pbnQgPSBwb2lu dFJpbmc7CiAgICAgICAgY2xpcC5saW5lU3RhcnQgPSByaW5nU3RhcnQ7CiAgICAgICAgY2xpcC5s aW5lRW5kID0gcmluZ0VuZDsKICAgICAgICBzZWdtZW50cyA9IFtdOwogICAgICAgIHBvbHlnb24g PSBbXTsKICAgICAgfSwKICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgY2xp cC5wb2ludCA9IHBvaW50OwogICAgICAgIGNsaXAubGluZVN0YXJ0ID0gbGluZVN0YXJ0OwogICAg ICAgIGNsaXAubGluZUVuZCA9IGxpbmVFbmQ7CiAgICAgICAgc2VnbWVudHMgPSBtZXJnZShzZWdt ZW50cyk7CiAgICAgICAgdmFyIHN0YXJ0SW5zaWRlID0gcG9seWdvbkNvbnRhaW5zKHBvbHlnb24s IHN0YXJ0KTsKICAgICAgICBpZiAoc2VnbWVudHMubGVuZ3RoKSB7CiAgICAgICAgICBpZiAoIXBv bHlnb25TdGFydGVkKSBzaW5rLnBvbHlnb25TdGFydCgpLCBwb2x5Z29uU3RhcnRlZCA9IHRydWU7 CiAgICAgICAgICBjbGlwUmVqb2luKHNlZ21lbnRzLCBjb21wYXJlSW50ZXJzZWN0aW9uLCBzdGFy dEluc2lkZSwgaW50ZXJwb2xhdGUsIHNpbmspOwogICAgICAgIH0gZWxzZSBpZiAoc3RhcnRJbnNp ZGUpIHsKICAgICAgICAgIGlmICghcG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdvblN0YXJ0KCks IHBvbHlnb25TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgIHNpbmsubGluZVN0YXJ0KCk7CiAgICAg ICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBzaW5rKTsKICAgICAgICAgIHNpbmsubGlu ZUVuZCgpOwogICAgICAgIH0KICAgICAgICBpZiAocG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdv bkVuZCgpLCBwb2x5Z29uU3RhcnRlZCA9IGZhbHNlOwogICAgICAgIHNlZ21lbnRzID0gcG9seWdv biA9IG51bGw7CiAgICAgIH0sCiAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICAgICAgc2lu ay5wb2x5Z29uU3RhcnQoKTsKICAgICAgICBzaW5rLmxpbmVTdGFydCgpOwogICAgICAgIGludGVy cG9sYXRlKG51bGwsIG51bGwsIDEsIHNpbmspOwogICAgICAgIHNpbmsubGluZUVuZCgpOwogICAg ICAgIHNpbmsucG9seWdvbkVuZCgpOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHBvaW50 KGxhbWJkYSwgcGhpKSB7CiAgICAgIGlmIChwb2ludFZpc2libGUobGFtYmRhLCBwaGkpKSBzaW5r LnBvaW50KGxhbWJkYSwgcGhpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb2ludExpbmUobGFtYmRh LCBwaGkpIHsKICAgICAgbGluZS5wb2ludChsYW1iZGEsIHBoaSk7CiAgICB9CgogICAgZnVuY3Rp b24gbGluZVN0YXJ0KCkgewogICAgICBjbGlwLnBvaW50ID0gcG9pbnRMaW5lOwogICAgICBsaW5l LmxpbmVTdGFydCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7CiAgICAgIGNsaXAu cG9pbnQgPSBwb2ludDsKICAgICAgbGluZS5saW5lRW5kKCk7CiAgICB9CgogICAgZnVuY3Rpb24g cG9pbnRSaW5nKGxhbWJkYSwgcGhpKSB7CiAgICAgIHJpbmcucHVzaChbbGFtYmRhLCBwaGldKTsK ICAgICAgcmluZ1NpbmsucG9pbnQobGFtYmRhLCBwaGkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJp bmdTdGFydCgpIHsKICAgICAgcmluZ1NpbmsubGluZVN0YXJ0KCk7CiAgICAgIHJpbmcgPSBbXTsK ICAgIH0KCiAgICBmdW5jdGlvbiByaW5nRW5kKCkgewogICAgICBwb2ludFJpbmcocmluZ1swXVsw XSwgcmluZ1swXVsxXSk7CiAgICAgIHJpbmdTaW5rLmxpbmVFbmQoKTsKCiAgICAgIHZhciBjbGVh biA9IHJpbmdTaW5rLmNsZWFuKCksCiAgICAgICAgICByaW5nU2VnbWVudHMgPSByaW5nQnVmZmVy LnJlc3VsdCgpLAogICAgICAgICAgaSwgbiA9IHJpbmdTZWdtZW50cy5sZW5ndGgsIG0sCiAgICAg ICAgICBzZWdtZW50LAogICAgICAgICAgcG9pbnQ7CgogICAgICByaW5nLnBvcCgpOwogICAgICBw b2x5Z29uLnB1c2gocmluZyk7CiAgICAgIHJpbmcgPSBudWxsOwoKICAgICAgaWYgKCFuKSByZXR1 cm47CgogICAgICAvLyBObyBpbnRlcnNlY3Rpb25zLgogICAgICBpZiAoY2xlYW4gJiAxKSB7CiAg ICAgICAgc2VnbWVudCA9IHJpbmdTZWdtZW50c1swXTsKICAgICAgICBpZiAoKG0gPSBzZWdtZW50 Lmxlbmd0aCAtIDEpID4gMCkgewogICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5w b2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgc2luay5saW5l U3RhcnQoKTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHNpbmsucG9pbnQoKHBv aW50ID0gc2VnbWVudFtpXSlbMF0sIHBvaW50WzFdKTsKICAgICAgICAgIHNpbmsubGluZUVuZCgp OwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vIFJlam9pbiBjb25u ZWN0ZWQgc2VnbWVudHMuCiAgICAgIC8vIFRPRE8gcmV1c2UgcmluZ0J1ZmZlci5yZWpvaW4oKT8K ICAgICAgaWYgKG4gPiAxICYmIGNsZWFuICYgMikgcmluZ1NlZ21lbnRzLnB1c2gocmluZ1NlZ21l bnRzLnBvcCgpLmNvbmNhdChyaW5nU2VnbWVudHMuc2hpZnQoKSkpOwoKICAgICAgc2VnbWVudHMu cHVzaChyaW5nU2VnbWVudHMuZmlsdGVyKHZhbGlkU2VnbWVudCkpOwogICAgfQoKICAgIHJldHVy biBjbGlwOwogIH07Cn0KCmZ1bmN0aW9uIHZhbGlkU2VnbWVudChzZWdtZW50KSB7CiAgcmV0dXJu IHNlZ21lbnQubGVuZ3RoID4gMTsKfQoKLy8gSW50ZXJzZWN0aW9ucyBhcmUgc29ydGVkIGFsb25n IHRoZSBjbGlwIGVkZ2UuIEZvciBib3RoIGFudGltZXJpZGlhbiBjdXR0aW5nCi8vIGFuZCBjaXJj bGUgY2xpcHBpbmcsIHRoZSBzYW1lIGNvbXBhcmlzb24gaXMgdXNlZC4KZnVuY3Rpb24gY29tcGFy ZUludGVyc2VjdGlvbihhLCBiKSB7CiAgcmV0dXJuICgoYSA9IGEueClbMF0gPCAwID8gYVsxXSAt IGhhbGZQaSQyIC0gZXBzaWxvbiQyIDogaGFsZlBpJDIgLSBhWzFdKQogICAgICAgLSAoKGIgPSBi LngpWzBdIDwgMCA/IGJbMV0gLSBoYWxmUGkkMiAtIGVwc2lsb24kMiA6IGhhbGZQaSQyIC0gYlsx XSk7Cn0KCnZhciBjbGlwQW50aW1lcmlkaWFuID0gY2xpcCgKICBmdW5jdGlvbigpIHsgcmV0dXJu IHRydWU7IH0sCiAgY2xpcEFudGltZXJpZGlhbkxpbmUsCiAgY2xpcEFudGltZXJpZGlhbkludGVy cG9sYXRlLAogIFstcGkkMywgLWhhbGZQaSQyXQopOwoKLy8gVGFrZXMgYSBsaW5lIGFuZCBjdXRz IGludG8gdmlzaWJsZSBzZWdtZW50cy4gUmV0dXJuIHZhbHVlczogMCAtIHRoZXJlIHdlcmUKLy8g aW50ZXJzZWN0aW9ucyBvciB0aGUgbGluZSB3YXMgZW1wdHk7IDEgLSBubyBpbnRlcnNlY3Rpb25z OyAyIC0gdGhlcmUgd2VyZQovLyBpbnRlcnNlY3Rpb25zLCBhbmQgdGhlIGZpcnN0IGFuZCBsYXN0 IHNlZ21lbnRzIHNob3VsZCBiZSByZWpvaW5lZC4KZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkxp bmUoc3RyZWFtKSB7CiAgdmFyIGxhbWJkYTAgPSBOYU4sCiAgICAgIHBoaTAgPSBOYU4sCiAgICAg IHNpZ24wID0gTmFOLAogICAgICBjbGVhbjsgLy8gbm8gaW50ZXJzZWN0aW9ucwoKICByZXR1cm4g ewogICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwog ICAgICBjbGVhbiA9IDE7CiAgICB9LAogICAgcG9pbnQ6IGZ1bmN0aW9uKGxhbWJkYTEsIHBoaTEp IHsKICAgICAgdmFyIHNpZ24xID0gbGFtYmRhMSA+IDAgPyBwaSQzIDogLXBpJDMsCiAgICAgICAg ICBkZWx0YSA9IGFicyhsYW1iZGExIC0gbGFtYmRhMCk7CiAgICAgIGlmIChhYnMoZGVsdGEgLSBw aSQzKSA8IGVwc2lsb24kMikgeyAvLyBsaW5lIGNyb3NzZXMgYSBwb2xlCiAgICAgICAgc3RyZWFt LnBvaW50KGxhbWJkYTAsIHBoaTAgPSAocGhpMCArIHBoaTEpIC8gMiA+IDAgPyBoYWxmUGkkMiA6 IC1oYWxmUGkkMik7CiAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24wLCBwaGkwKTsKICAgICAgICBz dHJlYW0ubGluZUVuZCgpOwogICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICBzdHJl YW0ucG9pbnQoc2lnbjEsIHBoaTApOwogICAgICAgIHN0cmVhbS5wb2ludChsYW1iZGExLCBwaGkw KTsKICAgICAgICBjbGVhbiA9IDA7CiAgICAgIH0gZWxzZSBpZiAoc2lnbjAgIT09IHNpZ24xICYm IGRlbHRhID49IHBpJDMpIHsgLy8gbGluZSBjcm9zc2VzIGFudGltZXJpZGlhbgogICAgICAgIGlm IChhYnMobGFtYmRhMCAtIHNpZ24wKSA8IGVwc2lsb24kMikgbGFtYmRhMCAtPSBzaWduMCAqIGVw c2lsb24kMjsgLy8gaGFuZGxlIGRlZ2VuZXJhY2llcwogICAgICAgIGlmIChhYnMobGFtYmRhMSAt IHNpZ24xKSA8IGVwc2lsb24kMikgbGFtYmRhMSAtPSBzaWduMSAqIGVwc2lsb24kMjsKICAgICAg ICBwaGkwID0gY2xpcEFudGltZXJpZGlhbkludGVyc2VjdChsYW1iZGEwLCBwaGkwLCBsYW1iZGEx LCBwaGkxKTsKICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjAsIHBoaTApOwogICAgICAgIHN0cmVh bS5saW5lRW5kKCk7CiAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgIHN0cmVhbS5w b2ludChzaWduMSwgcGhpMCk7CiAgICAgICAgY2xlYW4gPSAwOwogICAgICB9CiAgICAgIHN0cmVh bS5wb2ludChsYW1iZGEwID0gbGFtYmRhMSwgcGhpMCA9IHBoaTEpOwogICAgICBzaWduMCA9IHNp Z24xOwogICAgfSwKICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICBzdHJlYW0ubGluZUVu ZCgpOwogICAgICBsYW1iZGEwID0gcGhpMCA9IE5hTjsKICAgIH0sCiAgICBjbGVhbjogZnVuY3Rp b24oKSB7CiAgICAgIHJldHVybiAyIC0gY2xlYW47IC8vIGlmIGludGVyc2VjdGlvbnMsIHJlam9p biBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cwogICAgfQogIH07Cn0KCmZ1bmN0aW9uIGNsaXBBbnRp bWVyaWRpYW5JbnRlcnNlY3QobGFtYmRhMCwgcGhpMCwgbGFtYmRhMSwgcGhpMSkgewogIHZhciBj b3NQaGkwLAogICAgICBjb3NQaGkxLAogICAgICBzaW5MYW1iZGEwTGFtYmRhMSA9IHNpbiQxKGxh bWJkYTAgLSBsYW1iZGExKTsKICByZXR1cm4gYWJzKHNpbkxhbWJkYTBMYW1iZGExKSA+IGVwc2ls b24kMgogICAgICA/IGF0YW4oKHNpbiQxKHBoaTApICogKGNvc1BoaTEgPSBjb3MkMShwaGkxKSkg KiBzaW4kMShsYW1iZGExKQogICAgICAgICAgLSBzaW4kMShwaGkxKSAqIChjb3NQaGkwID0gY29z JDEocGhpMCkpICogc2luJDEobGFtYmRhMCkpCiAgICAgICAgICAvIChjb3NQaGkwICogY29zUGhp MSAqIHNpbkxhbWJkYTBMYW1iZGExKSkKICAgICAgOiAocGhpMCArIHBoaTEpIC8gMjsKfQoKZnVu Y3Rpb24gY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIHN0 cmVhbSkgewogIHZhciBwaGk7CiAgaWYgKGZyb20gPT0gbnVsbCkgewogICAgcGhpID0gZGlyZWN0 aW9uICogaGFsZlBpJDI7CiAgICBzdHJlYW0ucG9pbnQoLXBpJDMsIHBoaSk7CiAgICBzdHJlYW0u cG9pbnQoMCwgcGhpKTsKICAgIHN0cmVhbS5wb2ludChwaSQzLCBwaGkpOwogICAgc3RyZWFtLnBv aW50KHBpJDMsIDApOwogICAgc3RyZWFtLnBvaW50KHBpJDMsIC1waGkpOwogICAgc3RyZWFtLnBv aW50KDAsIC1waGkpOwogICAgc3RyZWFtLnBvaW50KC1waSQzLCAtcGhpKTsKICAgIHN0cmVhbS5w b2ludCgtcGkkMywgMCk7CiAgICBzdHJlYW0ucG9pbnQoLXBpJDMsIHBoaSk7CiAgfSBlbHNlIGlm IChhYnMoZnJvbVswXSAtIHRvWzBdKSA+IGVwc2lsb24kMikgewogICAgdmFyIGxhbWJkYSA9IGZy b21bMF0gPCB0b1swXSA/IHBpJDMgOiAtcGkkMzsKICAgIHBoaSA9IGRpcmVjdGlvbiAqIGxhbWJk YSAvIDI7CiAgICBzdHJlYW0ucG9pbnQoLWxhbWJkYSwgcGhpKTsKICAgIHN0cmVhbS5wb2ludCgw LCBwaGkpOwogICAgc3RyZWFtLnBvaW50KGxhbWJkYSwgcGhpKTsKICB9IGVsc2UgewogICAgc3Ry ZWFtLnBvaW50KHRvWzBdLCB0b1sxXSk7CiAgfQp9CgpmdW5jdGlvbiBjbGlwQ2lyY2xlKHJhZGl1 cykgewogIHZhciBjciA9IGNvcyQxKHJhZGl1cyksCiAgICAgIGRlbHRhID0gNiAqIHJhZGlhbnMs CiAgICAgIHNtYWxsUmFkaXVzID0gY3IgPiAwLAogICAgICBub3RIZW1pc3BoZXJlID0gYWJzKGNy KSA+IGVwc2lsb24kMjsgLy8gVE9ETyBvcHRpbWlzZSBmb3IgdGhpcyBjb21tb24gY2FzZQoKICBm dW5jdGlvbiBpbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBzdHJlYW0pIHsKICAgIGNp cmNsZVN0cmVhbShzdHJlYW0sIHJhZGl1cywgZGVsdGEsIGRpcmVjdGlvbiwgZnJvbSwgdG8pOwog IH0KCiAgZnVuY3Rpb24gdmlzaWJsZShsYW1iZGEsIHBoaSkgewogICAgcmV0dXJuIGNvcyQxKGxh bWJkYSkgKiBjb3MkMShwaGkpID4gY3I7CiAgfQoKICAvLyBUYWtlcyBhIGxpbmUgYW5kIGN1dHMg aW50byB2aXNpYmxlIHNlZ21lbnRzLiBSZXR1cm4gdmFsdWVzIHVzZWQgZm9yIHBvbHlnb24KICAv LyBjbGlwcGluZzogMCAtIHRoZXJlIHdlcmUgaW50ZXJzZWN0aW9ucyBvciB0aGUgbGluZSB3YXMg ZW1wdHk7IDEgLSBubwogIC8vIGludGVyc2VjdGlvbnMgMiAtIHRoZXJlIHdlcmUgaW50ZXJzZWN0 aW9ucywgYW5kIHRoZSBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cwogIC8vIHNob3VsZCBiZSByZWpv aW5lZC4KICBmdW5jdGlvbiBjbGlwTGluZShzdHJlYW0pIHsKICAgIHZhciBwb2ludDAsIC8vIHBy ZXZpb3VzIHBvaW50CiAgICAgICAgYzAsIC8vIGNvZGUgZm9yIHByZXZpb3VzIHBvaW50CiAgICAg ICAgdjAsIC8vIHZpc2liaWxpdHkgb2YgcHJldmlvdXMgcG9pbnQKICAgICAgICB2MDAsIC8vIHZp c2liaWxpdHkgb2YgZmlyc3QgcG9pbnQKICAgICAgICBjbGVhbjsgLy8gbm8gaW50ZXJzZWN0aW9u cwogICAgcmV0dXJuIHsKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB2MDAg PSB2MCA9IGZhbHNlOwogICAgICAgIGNsZWFuID0gMTsKICAgICAgfSwKICAgICAgcG9pbnQ6IGZ1 bmN0aW9uKGxhbWJkYSwgcGhpKSB7CiAgICAgICAgdmFyIHBvaW50MSA9IFtsYW1iZGEsIHBoaV0s CiAgICAgICAgICAgIHBvaW50MiwKICAgICAgICAgICAgdiA9IHZpc2libGUobGFtYmRhLCBwaGkp LAogICAgICAgICAgICBjID0gc21hbGxSYWRpdXMKICAgICAgICAgICAgICA/IHYgPyAwIDogY29k ZShsYW1iZGEsIHBoaSkKICAgICAgICAgICAgICA6IHYgPyBjb2RlKGxhbWJkYSArIChsYW1iZGEg PCAwID8gcGkkMyA6IC1waSQzKSwgcGhpKSA6IDA7CiAgICAgICAgaWYgKCFwb2ludDAgJiYgKHYw MCA9IHYwID0gdikpIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICAvLyBIYW5kbGUgZGVnZW5l cmFjaWVzLgogICAgICAgIC8vIFRPRE8gaWdub3JlIGlmIG5vdCBjbGlwcGluZyBwb2x5Z29ucy4K ICAgICAgICBpZiAodiAhPT0gdjApIHsKICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2lu dDAsIHBvaW50MSk7CiAgICAgICAgICBpZiAoIXBvaW50MiB8fCBwb2ludEVxdWFsKHBvaW50MCwg cG9pbnQyKSB8fCBwb2ludEVxdWFsKHBvaW50MSwgcG9pbnQyKSkgewogICAgICAgICAgICBwb2lu dDFbMF0gKz0gZXBzaWxvbiQyOwogICAgICAgICAgICBwb2ludDFbMV0gKz0gZXBzaWxvbiQyOwog ICAgICAgICAgICB2ID0gdmlzaWJsZShwb2ludDFbMF0sIHBvaW50MVsxXSk7CiAgICAgICAgICB9 CiAgICAgICAgfQogICAgICAgIGlmICh2ICE9PSB2MCkgewogICAgICAgICAgY2xlYW4gPSAwOwog ICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgLy8gb3V0c2lkZSBnb2luZyBpbgogICAgICAg ICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChw b2ludDEsIHBvaW50MCk7CiAgICAgICAgICAgIHN0cmVhbS5wb2ludChwb2ludDJbMF0sIHBvaW50 MlsxXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBpbnNpZGUgZ29pbmcgb3V0 CiAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7CiAgICAgICAg ICAgIHN0cmVhbS5wb2ludChwb2ludDJbMF0sIHBvaW50MlsxXSk7CiAgICAgICAgICAgIHN0cmVh bS5saW5lRW5kKCk7CiAgICAgICAgICB9CiAgICAgICAgICBwb2ludDAgPSBwb2ludDI7CiAgICAg ICAgfSBlbHNlIGlmIChub3RIZW1pc3BoZXJlICYmIHBvaW50MCAmJiBzbWFsbFJhZGl1cyBeIHYp IHsKICAgICAgICAgIHZhciB0OwogICAgICAgICAgLy8gSWYgdGhlIGNvZGVzIGZvciB0d28gcG9p bnRzIGFyZSBkaWZmZXJlbnQsIG9yIGFyZSBib3RoIHplcm8sCiAgICAgICAgICAvLyBhbmQgdGhl cmUgdGhpcyBzZWdtZW50IGludGVyc2VjdHMgd2l0aCB0aGUgc21hbGwgY2lyY2xlLgogICAgICAg ICAgaWYgKCEoYyAmIGMwKSAmJiAodCA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCwgdHJ1ZSkp KSB7CiAgICAgICAgICAgIGNsZWFuID0gMDsKICAgICAgICAgICAgaWYgKHNtYWxsUmFkaXVzKSB7 CiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgIHN0cmVhbS5w b2ludCh0WzBdWzBdLCB0WzBdWzFdKTsKICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFsxXVsw XSwgdFsxXVsxXSk7CiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAg fSBlbHNlIHsKICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFsxXVswXSwgdFsxXVsxXSk7CiAg ICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAgICBzdHJlYW0ubGluZVN0 YXJ0KCk7CiAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHRbMF1bMF0sIHRbMF1bMV0pOwogICAg ICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh2ICYmICghcG9pbnQw IHx8ICFwb2ludEVxdWFsKHBvaW50MCwgcG9pbnQxKSkpIHsKICAgICAgICAgIHN0cmVhbS5wb2lu dChwb2ludDFbMF0sIHBvaW50MVsxXSk7CiAgICAgICAgfQogICAgICAgIHBvaW50MCA9IHBvaW50 MSwgdjAgPSB2LCBjMCA9IGM7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewog ICAgICAgIGlmICh2MCkgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICBwb2ludDAgPSBudWxsOwog ICAgICB9LAogICAgICAvLyBSZWpvaW4gZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMgaWYgdGhlcmUg d2VyZSBpbnRlcnNlY3Rpb25zIGFuZCB0aGUgZmlyc3QKICAgICAgLy8gYW5kIGxhc3QgcG9pbnRz IHdlcmUgdmlzaWJsZS4KICAgICAgY2xlYW46IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBj bGVhbiB8ICgodjAwICYmIHYwKSA8PCAxKTsKICAgICAgfQogICAgfTsKICB9CgogIC8vIEludGVy c2VjdHMgdGhlIGdyZWF0IGNpcmNsZSBiZXR3ZWVuIGEgYW5kIGIgd2l0aCB0aGUgY2xpcCBjaXJj bGUuCiAgZnVuY3Rpb24gaW50ZXJzZWN0KGEsIGIsIHR3bykgewogICAgdmFyIHBhID0gY2FydGVz aWFuKGEpLAogICAgICAgIHBiID0gY2FydGVzaWFuKGIpOwoKICAgIC8vIFdlIGhhdmUgdHdvIHBs YW5lcywgbjEucCA9IGQxIGFuZCBuMi5wID0gZDIuCiAgICAvLyBGaW5kIGludGVyc2VjdGlvbiBs aW5lIHAodCkgPSBjMSBuMSArIGMyIG4yICsgdCAobjEg4qivIG4yKS4KICAgIHZhciBuMSA9IFsx LCAwLCAwXSwgLy8gbm9ybWFsCiAgICAgICAgbjIgPSBjYXJ0ZXNpYW5Dcm9zcyhwYSwgcGIpLAog ICAgICAgIG4ybjIgPSBjYXJ0ZXNpYW5Eb3QobjIsIG4yKSwKICAgICAgICBuMW4yID0gbjJbMF0s IC8vIGNhcnRlc2lhbkRvdChuMSwgbjIpLAogICAgICAgIGRldGVybWluYW50ID0gbjJuMiAtIG4x bjIgKiBuMW4yOwoKICAgIC8vIFR3byBwb2xhciBwb2ludHMuCiAgICBpZiAoIWRldGVybWluYW50 KSByZXR1cm4gIXR3byAmJiBhOwoKICAgIHZhciBjMSA9ICBjciAqIG4ybjIgLyBkZXRlcm1pbmFu dCwKICAgICAgICBjMiA9IC1jciAqIG4xbjIgLyBkZXRlcm1pbmFudCwKICAgICAgICBuMXhuMiA9 IGNhcnRlc2lhbkNyb3NzKG4xLCBuMiksCiAgICAgICAgQSA9IGNhcnRlc2lhblNjYWxlKG4xLCBj MSksCiAgICAgICAgQiA9IGNhcnRlc2lhblNjYWxlKG4yLCBjMik7CiAgICBjYXJ0ZXNpYW5BZGRJ blBsYWNlKEEsIEIpOwoKICAgIC8vIFNvbHZlIHxwKHQpfF4yID0gMS4KICAgIHZhciB1ID0gbjF4 bjIsCiAgICAgICAgdyA9IGNhcnRlc2lhbkRvdChBLCB1KSwKICAgICAgICB1dSA9IGNhcnRlc2lh bkRvdCh1LCB1KSwKICAgICAgICB0MiA9IHcgKiB3IC0gdXUgKiAoY2FydGVzaWFuRG90KEEsIEEp IC0gMSk7CgogICAgaWYgKHQyIDwgMCkgcmV0dXJuOwoKICAgIHZhciB0ID0gc3FydCh0MiksCiAg ICAgICAgcSA9IGNhcnRlc2lhblNjYWxlKHUsICgtdyAtIHQpIC8gdXUpOwogICAgY2FydGVzaWFu QWRkSW5QbGFjZShxLCBBKTsKICAgIHEgPSBzcGhlcmljYWwocSk7CgogICAgaWYgKCF0d28pIHJl dHVybiBxOwoKICAgIC8vIFR3byBpbnRlcnNlY3Rpb24gcG9pbnRzLgogICAgdmFyIGxhbWJkYTAg PSBhWzBdLAogICAgICAgIGxhbWJkYTEgPSBiWzBdLAogICAgICAgIHBoaTAgPSBhWzFdLAogICAg ICAgIHBoaTEgPSBiWzFdLAogICAgICAgIHo7CgogICAgaWYgKGxhbWJkYTEgPCBsYW1iZGEwKSB6 ID0gbGFtYmRhMCwgbGFtYmRhMCA9IGxhbWJkYTEsIGxhbWJkYTEgPSB6OwoKICAgIHZhciBkZWx0 YSA9IGxhbWJkYTEgLSBsYW1iZGEwLAogICAgICAgIHBvbGFyID0gYWJzKGRlbHRhIC0gcGkkMykg PCBlcHNpbG9uJDIsCiAgICAgICAgbWVyaWRpYW4gPSBwb2xhciB8fCBkZWx0YSA8IGVwc2lsb24k MjsKCiAgICBpZiAoIXBvbGFyICYmIHBoaTEgPCBwaGkwKSB6ID0gcGhpMCwgcGhpMCA9IHBoaTEs IHBoaTEgPSB6OwoKICAgIC8vIENoZWNrIHRoYXQgdGhlIGZpcnN0IHBvaW50IGlzIGJldHdlZW4g YSBhbmQgYi4KICAgIGlmIChtZXJpZGlhbgogICAgICAgID8gcG9sYXIKICAgICAgICAgID8gcGhp MCArIHBoaTEgPiAwIF4gcVsxXSA8IChhYnMocVswXSAtIGxhbWJkYTApIDwgZXBzaWxvbiQyID8g cGhpMCA6IHBoaTEpCiAgICAgICAgICA6IHBoaTAgPD0gcVsxXSAmJiBxWzFdIDw9IHBoaTEKICAg ICAgICA6IGRlbHRhID4gcGkkMyBeIChsYW1iZGEwIDw9IHFbMF0gJiYgcVswXSA8PSBsYW1iZGEx KSkgewogICAgICB2YXIgcTEgPSBjYXJ0ZXNpYW5TY2FsZSh1LCAoLXcgKyB0KSAvIHV1KTsKICAg ICAgY2FydGVzaWFuQWRkSW5QbGFjZShxMSwgQSk7CiAgICAgIHJldHVybiBbcSwgc3BoZXJpY2Fs KHExKV07CiAgICB9CiAgfQoKICAvLyBHZW5lcmF0ZXMgYSA0LWJpdCB2ZWN0b3IgcmVwcmVzZW50 aW5nIHRoZSBsb2NhdGlvbiBvZiBhIHBvaW50IHJlbGF0aXZlIHRvCiAgLy8gdGhlIHNtYWxsIGNp cmNsZSdzIGJvdW5kaW5nIGJveC4KICBmdW5jdGlvbiBjb2RlKGxhbWJkYSwgcGhpKSB7CiAgICB2 YXIgciA9IHNtYWxsUmFkaXVzID8gcmFkaXVzIDogcGkkMyAtIHJhZGl1cywKICAgICAgICBjb2Rl ID0gMDsKICAgIGlmIChsYW1iZGEgPCAtcikgY29kZSB8PSAxOyAvLyBsZWZ0CiAgICBlbHNlIGlm IChsYW1iZGEgPiByKSBjb2RlIHw9IDI7IC8vIHJpZ2h0CiAgICBpZiAocGhpIDwgLXIpIGNvZGUg fD0gNDsgLy8gYmVsb3cKICAgIGVsc2UgaWYgKHBoaSA+IHIpIGNvZGUgfD0gODsgLy8gYWJvdmUK ICAgIHJldHVybiBjb2RlOwogIH0KCiAgcmV0dXJuIGNsaXAodmlzaWJsZSwgY2xpcExpbmUsIGlu dGVycG9sYXRlLCBzbWFsbFJhZGl1cyA/IFswLCAtcmFkaXVzXSA6IFstcGkkMywgcmFkaXVzIC0g cGkkM10pOwp9CgpmdW5jdGlvbiBjbGlwTGluZShhLCBiLCB4MCwgeTAsIHgxLCB5MSkgewogIHZh ciBheCA9IGFbMF0sCiAgICAgIGF5ID0gYVsxXSwKICAgICAgYnggPSBiWzBdLAogICAgICBieSA9 IGJbMV0sCiAgICAgIHQwID0gMCwKICAgICAgdDEgPSAxLAogICAgICBkeCA9IGJ4IC0gYXgsCiAg ICAgIGR5ID0gYnkgLSBheSwKICAgICAgcjsKCiAgciA9IHgwIC0gYXg7CiAgaWYgKCFkeCAmJiBy ID4gMCkgcmV0dXJuOwogIHIgLz0gZHg7CiAgaWYgKGR4IDwgMCkgewogICAgaWYgKHIgPCB0MCkg cmV0dXJuOwogICAgaWYgKHIgPCB0MSkgdDEgPSByOwogIH0gZWxzZSBpZiAoZHggPiAwKSB7CiAg ICBpZiAociA+IHQxKSByZXR1cm47CiAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgfQoKICByID0g eDEgLSBheDsKICBpZiAoIWR4ICYmIHIgPCAwKSByZXR1cm47CiAgciAvPSBkeDsKICBpZiAoZHgg PCAwKSB7CiAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAg fSBlbHNlIGlmIChkeCA+IDApIHsKICAgIGlmIChyIDwgdDApIHJldHVybjsKICAgIGlmIChyIDwg dDEpIHQxID0gcjsKICB9CgogIHIgPSB5MCAtIGF5OwogIGlmICghZHkgJiYgciA+IDApIHJldHVy bjsKICByIC89IGR5OwogIGlmIChkeSA8IDApIHsKICAgIGlmIChyIDwgdDApIHJldHVybjsKICAg IGlmIChyIDwgdDEpIHQxID0gcjsKICB9IGVsc2UgaWYgKGR5ID4gMCkgewogICAgaWYgKHIgPiB0 MSkgcmV0dXJuOwogICAgaWYgKHIgPiB0MCkgdDAgPSByOwogIH0KCiAgciA9IHkxIC0gYXk7CiAg aWYgKCFkeSAmJiByIDwgMCkgcmV0dXJuOwogIHIgLz0gZHk7CiAgaWYgKGR5IDwgMCkgewogICAg aWYgKHIgPiB0MSkgcmV0dXJuOwogICAgaWYgKHIgPiB0MCkgdDAgPSByOwogIH0gZWxzZSBpZiAo ZHkgPiAwKSB7CiAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICBpZiAociA8IHQxKSB0MSA9IHI7 CiAgfQoKICBpZiAodDAgPiAwKSBhWzBdID0gYXggKyB0MCAqIGR4LCBhWzFdID0gYXkgKyB0MCAq IGR5OwogIGlmICh0MSA8IDEpIGJbMF0gPSBheCArIHQxICogZHgsIGJbMV0gPSBheSArIHQxICog ZHk7CiAgcmV0dXJuIHRydWU7Cn0KCnZhciBjbGlwTWF4ID0gMWU5LCBjbGlwTWluID0gLWNsaXBN YXg7CgovLyBUT0RPIFVzZSBkMy1wb2x5Z29u4oCZcyBwb2x5Z29uQ29udGFpbnMgaGVyZSBmb3Ig dGhlIHJpbmcgY2hlY2s/Ci8vIFRPRE8gRWxpbWluYXRlIGR1cGxpY2F0ZSBidWZmZXJpbmcgaW4g Y2xpcEJ1ZmZlciBhbmQgcG9seWdvbi5wdXNoPwoKZnVuY3Rpb24gY2xpcFJlY3RhbmdsZSh4MCwg eTAsIHgxLCB5MSkgewoKICBmdW5jdGlvbiB2aXNpYmxlKHgsIHkpIHsKICAgIHJldHVybiB4MCA8 PSB4ICYmIHggPD0geDEgJiYgeTAgPD0geSAmJiB5IDw9IHkxOwogIH0KCiAgZnVuY3Rpb24gaW50 ZXJwb2xhdGUoZnJvbSwgdG8sIGRpcmVjdGlvbiwgc3RyZWFtKSB7CiAgICB2YXIgYSA9IDAsIGEx ID0gMDsKICAgIGlmIChmcm9tID09IG51bGwKICAgICAgICB8fCAoYSA9IGNvcm5lcihmcm9tLCBk aXJlY3Rpb24pKSAhPT0gKGExID0gY29ybmVyKHRvLCBkaXJlY3Rpb24pKQogICAgICAgIHx8IGNv bXBhcmVQb2ludChmcm9tLCB0bykgPCAwIF4gZGlyZWN0aW9uID4gMCkgewogICAgICBkbyBzdHJl YW0ucG9pbnQoYSA9PT0gMCB8fCBhID09PSAzID8geDAgOiB4MSwgYSA+IDEgPyB5MSA6IHkwKTsK ICAgICAgd2hpbGUgKChhID0gKGEgKyBkaXJlY3Rpb24gKyA0KSAlIDQpICE9PSBhMSk7CiAgICB9 IGVsc2UgewogICAgICBzdHJlYW0ucG9pbnQodG9bMF0sIHRvWzFdKTsKICAgIH0KICB9CgogIGZ1 bmN0aW9uIGNvcm5lcihwLCBkaXJlY3Rpb24pIHsKICAgIHJldHVybiBhYnMocFswXSAtIHgwKSA8 IGVwc2lsb24kMiA/IGRpcmVjdGlvbiA+IDAgPyAwIDogMwogICAgICAgIDogYWJzKHBbMF0gLSB4 MSkgPCBlcHNpbG9uJDIgPyBkaXJlY3Rpb24gPiAwID8gMiA6IDEKICAgICAgICA6IGFicyhwWzFd IC0geTApIDwgZXBzaWxvbiQyID8gZGlyZWN0aW9uID4gMCA/IDEgOiAwCiAgICAgICAgOiBkaXJl Y3Rpb24gPiAwID8gMyA6IDI7IC8vIGFicyhwWzFdIC0geTEpIDwgZXBzaWxvbgogIH0KCiAgZnVu Y3Rpb24gY29tcGFyZUludGVyc2VjdGlvbihhLCBiKSB7CiAgICByZXR1cm4gY29tcGFyZVBvaW50 KGEueCwgYi54KTsKICB9CgogIGZ1bmN0aW9uIGNvbXBhcmVQb2ludChhLCBiKSB7CiAgICB2YXIg Y2EgPSBjb3JuZXIoYSwgMSksCiAgICAgICAgY2IgPSBjb3JuZXIoYiwgMSk7CiAgICByZXR1cm4g Y2EgIT09IGNiID8gY2EgLSBjYgogICAgICAgIDogY2EgPT09IDAgPyBiWzFdIC0gYVsxXQogICAg ICAgIDogY2EgPT09IDEgPyBhWzBdIC0gYlswXQogICAgICAgIDogY2EgPT09IDIgPyBhWzFdIC0g YlsxXQogICAgICAgIDogYlswXSAtIGFbMF07CiAgfQoKICByZXR1cm4gZnVuY3Rpb24oc3RyZWFt KSB7CiAgICB2YXIgYWN0aXZlU3RyZWFtID0gc3RyZWFtLAogICAgICAgIGJ1ZmZlclN0cmVhbSA9 IGNsaXBCdWZmZXIoKSwKICAgICAgICBzZWdtZW50cywKICAgICAgICBwb2x5Z29uLAogICAgICAg IHJpbmcsCiAgICAgICAgeF9fLCB5X18sIHZfXywgLy8gZmlyc3QgcG9pbnQKICAgICAgICB4Xywg eV8sIHZfLCAvLyBwcmV2aW91cyBwb2ludAogICAgICAgIGZpcnN0LAogICAgICAgIGNsZWFuOwoK ICAgIHZhciBjbGlwU3RyZWFtID0gewogICAgICBwb2ludDogcG9pbnQsCiAgICAgIGxpbmVTdGFy dDogbGluZVN0YXJ0LAogICAgICBsaW5lRW5kOiBsaW5lRW5kLAogICAgICBwb2x5Z29uU3RhcnQ6 IHBvbHlnb25TdGFydCwKICAgICAgcG9seWdvbkVuZDogcG9seWdvbkVuZAogICAgfTsKCiAgICBm dW5jdGlvbiBwb2ludCh4LCB5KSB7CiAgICAgIGlmICh2aXNpYmxlKHgsIHkpKSBhY3RpdmVTdHJl YW0ucG9pbnQoeCwgeSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9seWdvbkluc2lkZSgpIHsKICAg ICAgdmFyIHdpbmRpbmcgPSAwOwoKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBwb2x5Z29uLmxl bmd0aDsgaSA8IG47ICsraSkgewogICAgICAgIGZvciAodmFyIHJpbmcgPSBwb2x5Z29uW2ldLCBq ID0gMSwgbSA9IHJpbmcubGVuZ3RoLCBwb2ludCA9IHJpbmdbMF0sIGEwLCBhMSwgYjAgPSBwb2lu dFswXSwgYjEgPSBwb2ludFsxXTsgaiA8IG07ICsraikgewogICAgICAgICAgYTAgPSBiMCwgYTEg PSBiMSwgcG9pbnQgPSByaW5nW2pdLCBiMCA9IHBvaW50WzBdLCBiMSA9IHBvaW50WzFdOwogICAg ICAgICAgaWYgKGExIDw9IHkxKSB7IGlmIChiMSA+IHkxICYmIChiMCAtIGEwKSAqICh5MSAtIGEx KSA+IChiMSAtIGExKSAqICh4MCAtIGEwKSkgKyt3aW5kaW5nOyB9CiAgICAgICAgICBlbHNlIHsg aWYgKGIxIDw9IHkxICYmIChiMCAtIGEwKSAqICh5MSAtIGExKSA8IChiMSAtIGExKSAqICh4MCAt IGEwKSkgLS13aW5kaW5nOyB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gd2luZGlu ZzsKICAgIH0KCiAgICAvLyBCdWZmZXIgZ2VvbWV0cnkgd2l0aGluIGEgcG9seWdvbiBhbmQgdGhl biBjbGlwIGl0IGVuIG1hc3NlLgogICAgZnVuY3Rpb24gcG9seWdvblN0YXJ0KCkgewogICAgICBh Y3RpdmVTdHJlYW0gPSBidWZmZXJTdHJlYW0sIHNlZ21lbnRzID0gW10sIHBvbHlnb24gPSBbXSwg Y2xlYW4gPSB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvbHlnb25FbmQoKSB7CiAgICAgIHZh ciBzdGFydEluc2lkZSA9IHBvbHlnb25JbnNpZGUoKSwKICAgICAgICAgIGNsZWFuSW5zaWRlID0g Y2xlYW4gJiYgc3RhcnRJbnNpZGUsCiAgICAgICAgICB2aXNpYmxlID0gKHNlZ21lbnRzID0gbWVy Z2Uoc2VnbWVudHMpKS5sZW5ndGg7CiAgICAgIGlmIChjbGVhbkluc2lkZSB8fCB2aXNpYmxlKSB7 CiAgICAgICAgc3RyZWFtLnBvbHlnb25TdGFydCgpOwogICAgICAgIGlmIChjbGVhbkluc2lkZSkg ewogICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgaW50ZXJwb2xhdGUobnVs bCwgbnVsbCwgMSwgc3RyZWFtKTsKICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAg fQogICAgICAgIGlmICh2aXNpYmxlKSB7CiAgICAgICAgICBjbGlwUmVqb2luKHNlZ21lbnRzLCBj b21wYXJlSW50ZXJzZWN0aW9uLCBzdGFydEluc2lkZSwgaW50ZXJwb2xhdGUsIHN0cmVhbSk7CiAg ICAgICAgfQogICAgICAgIHN0cmVhbS5wb2x5Z29uRW5kKCk7CiAgICAgIH0KICAgICAgYWN0aXZl U3RyZWFtID0gc3RyZWFtLCBzZWdtZW50cyA9IHBvbHlnb24gPSByaW5nID0gbnVsbDsKICAgIH0K CiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7CiAgICAgIGNsaXBTdHJlYW0ucG9pbnQgPSBsaW5l UG9pbnQ7CiAgICAgIGlmIChwb2x5Z29uKSBwb2x5Z29uLnB1c2gocmluZyA9IFtdKTsKICAgICAg Zmlyc3QgPSB0cnVlOwogICAgICB2XyA9IGZhbHNlOwogICAgICB4XyA9IHlfID0gTmFOOwogICAg fQoKICAgIC8vIFRPRE8gcmF0aGVyIHRoYW4gc3BlY2lhbC1jYXNlIHBvbHlnb25zLCBzaW1wbHkg aGFuZGxlIHRoZW0gc2VwYXJhdGVseS4KICAgIC8vIElkZWFsbHksIGNvaW5jaWRlbnQgaW50ZXJz ZWN0aW9uIHBvaW50cyBzaG91bGQgYmUgaml0dGVyZWQgdG8gYXZvaWQKICAgIC8vIGNsaXBwaW5n IGlzc3Vlcy4KICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7CiAgICAgIGlmIChzZWdtZW50cykgewog ICAgICAgIGxpbmVQb2ludCh4X18sIHlfXyk7CiAgICAgICAgaWYgKHZfXyAmJiB2XykgYnVmZmVy U3RyZWFtLnJlam9pbigpOwogICAgICAgIHNlZ21lbnRzLnB1c2goYnVmZmVyU3RyZWFtLnJlc3Vs dCgpKTsKICAgICAgfQogICAgICBjbGlwU3RyZWFtLnBvaW50ID0gcG9pbnQ7CiAgICAgIGlmICh2 XykgYWN0aXZlU3RyZWFtLmxpbmVFbmQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lUG9pbnQo eCwgeSkgewogICAgICB2YXIgdiA9IHZpc2libGUoeCwgeSk7CiAgICAgIGlmIChwb2x5Z29uKSBy aW5nLnB1c2goW3gsIHldKTsKICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgeF9fID0geCwgeV9f ID0geSwgdl9fID0gdjsKICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgIGlmICh2KSB7CiAg ICAgICAgICBhY3RpdmVTdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICBhY3RpdmVTdHJlYW0u cG9pbnQoeCwgeSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICh2ICYmIHZf KSBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIg YSA9IFt4XyA9IE1hdGgubWF4KGNsaXBNaW4sIE1hdGgubWluKGNsaXBNYXgsIHhfKSksIHlfID0g TWF0aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeV8pKV0sCiAgICAgICAgICAgICAg YiA9IFt4ID0gTWF0aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeCkpLCB5ID0gTWF0 aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeSkpXTsKICAgICAgICAgIGlmIChjbGlw TGluZShhLCBiLCB4MCwgeTAsIHgxLCB5MSkpIHsKICAgICAgICAgICAgaWYgKCF2XykgewogICAg ICAgICAgICAgIGFjdGl2ZVN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICAgICAgICBhY3RpdmVT dHJlYW0ucG9pbnQoYVswXSwgYVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWN0aXZl U3RyZWFtLnBvaW50KGJbMF0sIGJbMV0pOwogICAgICAgICAgICBpZiAoIXYpIGFjdGl2ZVN0cmVh bS5saW5lRW5kKCk7CiAgICAgICAgICAgIGNsZWFuID0gZmFsc2U7CiAgICAgICAgICB9IGVsc2Ug aWYgKHYpIHsKICAgICAgICAgICAgYWN0aXZlU3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAg ICBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7CiAgICAgICAgICAgIGNsZWFuID0gZmFsc2U7CiAg ICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHhfID0geCwgeV8gPSB5LCB2XyA9IHY7 CiAgICB9CgogICAgcmV0dXJuIGNsaXBTdHJlYW07CiAgfTsKfQoKZnVuY3Rpb24gZXh0ZW50JDEo KSB7CiAgdmFyIHgwID0gMCwKICAgICAgeTAgPSAwLAogICAgICB4MSA9IDk2MCwKICAgICAgeTEg PSA1MDAsCiAgICAgIGNhY2hlLAogICAgICBjYWNoZVN0cmVhbSwKICAgICAgY2xpcDsKCiAgcmV0 dXJuIGNsaXAgPSB7CiAgICBzdHJlYW06IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICByZXR1cm4g Y2FjaGUgJiYgY2FjaGVTdHJlYW0gPT09IHN0cmVhbSA/IGNhY2hlIDogY2FjaGUgPSBjbGlwUmVj dGFuZ2xlKHgwLCB5MCwgeDEsIHkxKShjYWNoZVN0cmVhbSA9IHN0cmVhbSk7CiAgICB9LAogICAg ZXh0ZW50OiBmdW5jdGlvbihfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgw ID0gK19bMF1bMF0sIHkwID0gK19bMF1bMV0sIHgxID0gK19bMV1bMF0sIHkxID0gK19bMV1bMV0s IGNhY2hlID0gY2FjaGVTdHJlYW0gPSBudWxsLCBjbGlwKSA6IFtbeDAsIHkwXSwgW3gxLCB5MV1d OwogICAgfQogIH07Cn0KCnZhciBsZW5ndGhTdW0gPSBhZGRlcigpLAogICAgbGFtYmRhMCQyLAog ICAgc2luUGhpMCQxLAogICAgY29zUGhpMCQxOwoKdmFyIGxlbmd0aFN0cmVhbSA9IHsKICBzcGhl cmU6IG5vb3AkMiwKICBwb2ludDogbm9vcCQyLAogIGxpbmVTdGFydDogbGVuZ3RoTGluZVN0YXJ0 LAogIGxpbmVFbmQ6IG5vb3AkMiwKICBwb2x5Z29uU3RhcnQ6IG5vb3AkMiwKICBwb2x5Z29uRW5k OiBub29wJDIKfTsKCmZ1bmN0aW9uIGxlbmd0aExpbmVTdGFydCgpIHsKICBsZW5ndGhTdHJlYW0u cG9pbnQgPSBsZW5ndGhQb2ludEZpcnN0OwogIGxlbmd0aFN0cmVhbS5saW5lRW5kID0gbGVuZ3Ro TGluZUVuZDsKfQoKZnVuY3Rpb24gbGVuZ3RoTGluZUVuZCgpIHsKICBsZW5ndGhTdHJlYW0ucG9p bnQgPSBsZW5ndGhTdHJlYW0ubGluZUVuZCA9IG5vb3AkMjsKfQoKZnVuY3Rpb24gbGVuZ3RoUG9p bnRGaXJzdChsYW1iZGEsIHBoaSkgewogIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFu czsKICBsYW1iZGEwJDIgPSBsYW1iZGEsIHNpblBoaTAkMSA9IHNpbiQxKHBoaSksIGNvc1BoaTAk MSA9IGNvcyQxKHBoaSk7CiAgbGVuZ3RoU3RyZWFtLnBvaW50ID0gbGVuZ3RoUG9pbnQ7Cn0KCmZ1 bmN0aW9uIGxlbmd0aFBvaW50KGxhbWJkYSwgcGhpKSB7CiAgbGFtYmRhICo9IHJhZGlhbnMsIHBo aSAqPSByYWRpYW5zOwogIHZhciBzaW5QaGkgPSBzaW4kMShwaGkpLAogICAgICBjb3NQaGkgPSBj b3MkMShwaGkpLAogICAgICBkZWx0YSA9IGFicyhsYW1iZGEgLSBsYW1iZGEwJDIpLAogICAgICBj b3NEZWx0YSA9IGNvcyQxKGRlbHRhKSwKICAgICAgc2luRGVsdGEgPSBzaW4kMShkZWx0YSksCiAg ICAgIHggPSBjb3NQaGkgKiBzaW5EZWx0YSwKICAgICAgeSA9IGNvc1BoaTAkMSAqIHNpblBoaSAt IHNpblBoaTAkMSAqIGNvc1BoaSAqIGNvc0RlbHRhLAogICAgICB6ID0gc2luUGhpMCQxICogc2lu UGhpICsgY29zUGhpMCQxICogY29zUGhpICogY29zRGVsdGE7CiAgbGVuZ3RoU3VtLmFkZChhdGFu MihzcXJ0KHggKiB4ICsgeSAqIHkpLCB6KSk7CiAgbGFtYmRhMCQyID0gbGFtYmRhLCBzaW5QaGkw JDEgPSBzaW5QaGksIGNvc1BoaTAkMSA9IGNvc1BoaTsKfQoKZnVuY3Rpb24gbGVuZ3RoJDEob2Jq ZWN0KSB7CiAgbGVuZ3RoU3VtLnJlc2V0KCk7CiAgZ2VvU3RyZWFtKG9iamVjdCwgbGVuZ3RoU3Ry ZWFtKTsKICByZXR1cm4gK2xlbmd0aFN1bTsKfQoKdmFyIGNvb3JkaW5hdGVzID0gW251bGwsIG51 bGxdLAogICAgb2JqZWN0JDEgPSB7dHlwZTogIkxpbmVTdHJpbmciLCBjb29yZGluYXRlczogY29v cmRpbmF0ZXN9OwoKZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikgewogIGNvb3JkaW5hdGVzWzBdID0g YTsKICBjb29yZGluYXRlc1sxXSA9IGI7CiAgcmV0dXJuIGxlbmd0aCQxKG9iamVjdCQxKTsKfQoK dmFyIGNvbnRhaW5zT2JqZWN0VHlwZSA9IHsKICBGZWF0dXJlOiBmdW5jdGlvbihvYmplY3QsIHBv aW50KSB7CiAgICByZXR1cm4gY29udGFpbnNHZW9tZXRyeShvYmplY3QuZ2VvbWV0cnksIHBvaW50 KTsKICB9LAogIEZlYXR1cmVDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7CiAg ICB2YXIgZmVhdHVyZXMgPSBvYmplY3QuZmVhdHVyZXMsIGkgPSAtMSwgbiA9IGZlYXR1cmVzLmxl bmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoY29udGFpbnNHZW9tZXRyeShmZWF0dXJlc1tp XS5nZW9tZXRyeSwgcG9pbnQpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9Cn07 Cgp2YXIgY29udGFpbnNHZW9tZXRyeVR5cGUgPSB7CiAgU3BoZXJlOiBmdW5jdGlvbigpIHsKICAg IHJldHVybiB0cnVlOwogIH0sCiAgUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgcG9pbnQpIHsKICAg IHJldHVybiBjb250YWluc1BvaW50KG9iamVjdC5jb29yZGluYXRlcywgcG9pbnQpOwogIH0sCiAg TXVsdGlQb2ludDogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkgewogICAgdmFyIGNvb3JkaW5hdGVz ID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAg ICB3aGlsZSAoKytpIDwgbikgaWYgKGNvbnRhaW5zUG9pbnQoY29vcmRpbmF0ZXNbaV0sIHBvaW50 KSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfSwKICBMaW5lU3RyaW5nOiBmdW5j dGlvbihvYmplY3QsIHBvaW50KSB7CiAgICByZXR1cm4gY29udGFpbnNMaW5lKG9iamVjdC5jb29y ZGluYXRlcywgcG9pbnQpOwogIH0sCiAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3Qs IHBvaW50KSB7CiAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAt MSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoY29udGFp bnNMaW5lKGNvb3JkaW5hdGVzW2ldLCBwb2ludCkpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZh bHNlOwogIH0sCiAgUG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkgewogICAgcmV0dXJu IGNvbnRhaW5zUG9seWdvbihvYmplY3QuY29vcmRpbmF0ZXMsIHBvaW50KTsKICB9LAogIE11bHRp UG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkgewogICAgdmFyIGNvb3JkaW5hdGVzID0g b2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICB3 aGlsZSAoKytpIDwgbikgaWYgKGNvbnRhaW5zUG9seWdvbihjb29yZGluYXRlc1tpXSwgcG9pbnQp KSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9LAogIEdlb21ldHJ5Q29sbGVjdGlv bjogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkgewogICAgdmFyIGdlb21ldHJpZXMgPSBvYmplY3Qu Z2VvbWV0cmllcywgaSA9IC0xLCBuID0gZ2VvbWV0cmllcy5sZW5ndGg7CiAgICB3aGlsZSAoKytp IDwgbikgaWYgKGNvbnRhaW5zR2VvbWV0cnkoZ2VvbWV0cmllc1tpXSwgcG9pbnQpKSByZXR1cm4g dHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9Cn07CgpmdW5jdGlvbiBjb250YWluc0dlb21ldHJ5 KGdlb21ldHJ5LCBwb2ludCkgewogIHJldHVybiBnZW9tZXRyeSAmJiBjb250YWluc0dlb21ldHJ5 VHlwZS5oYXNPd25Qcm9wZXJ0eShnZW9tZXRyeS50eXBlKQogICAgICA/IGNvbnRhaW5zR2VvbWV0 cnlUeXBlW2dlb21ldHJ5LnR5cGVdKGdlb21ldHJ5LCBwb2ludCkKICAgICAgOiBmYWxzZTsKfQoK ZnVuY3Rpb24gY29udGFpbnNQb2ludChjb29yZGluYXRlcywgcG9pbnQpIHsKICByZXR1cm4gZGlz dGFuY2UoY29vcmRpbmF0ZXMsIHBvaW50KSA9PT0gMDsKfQoKZnVuY3Rpb24gY29udGFpbnNMaW5l KGNvb3JkaW5hdGVzLCBwb2ludCkgewogIHZhciBhbywgYm8sIGFiOwogIGZvciAodmFyIGkgPSAw LCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICBibyA9IGRpc3RhbmNl KGNvb3JkaW5hdGVzW2ldLCBwb2ludCk7CiAgICBpZiAoYm8gPT09IDApIHJldHVybiB0cnVlOwog ICAgaWYgKGkgPiAwKSB7CiAgICAgIGFiID0gZGlzdGFuY2UoY29vcmRpbmF0ZXNbaV0sIGNvb3Jk aW5hdGVzW2kgLSAxXSk7CiAgICAgIGlmICgKICAgICAgICBhYiA+IDAgJiYKICAgICAgICBhbyA8 PSBhYiAmJgogICAgICAgIGJvIDw9IGFiICYmCiAgICAgICAgKGFvICsgYm8gLSBhYikgKiAoMSAt IE1hdGgucG93KChhbyAtIGJvKSAvIGFiLCAyKSkgPCBlcHNpbG9uMiQxICogYWIKICAgICAgKQog ICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgYW8gPSBibzsKICB9CiAgcmV0dXJuIGZhbHNl Owp9CgpmdW5jdGlvbiBjb250YWluc1BvbHlnb24oY29vcmRpbmF0ZXMsIHBvaW50KSB7CiAgcmV0 dXJuICEhcG9seWdvbkNvbnRhaW5zKGNvb3JkaW5hdGVzLm1hcChyaW5nUmFkaWFucyksIHBvaW50 UmFkaWFucyhwb2ludCkpOwp9CgpmdW5jdGlvbiByaW5nUmFkaWFucyhyaW5nKSB7CiAgcmV0dXJu IHJpbmcgPSByaW5nLm1hcChwb2ludFJhZGlhbnMpLCByaW5nLnBvcCgpLCByaW5nOwp9CgpmdW5j dGlvbiBwb2ludFJhZGlhbnMocG9pbnQpIHsKICByZXR1cm4gW3BvaW50WzBdICogcmFkaWFucywg cG9pbnRbMV0gKiByYWRpYW5zXTsKfQoKZnVuY3Rpb24gY29udGFpbnMkMShvYmplY3QsIHBvaW50 KSB7CiAgcmV0dXJuIChvYmplY3QgJiYgY29udGFpbnNPYmplY3RUeXBlLmhhc093blByb3BlcnR5 KG9iamVjdC50eXBlKQogICAgICA/IGNvbnRhaW5zT2JqZWN0VHlwZVtvYmplY3QudHlwZV0KICAg ICAgOiBjb250YWluc0dlb21ldHJ5KShvYmplY3QsIHBvaW50KTsKfQoKZnVuY3Rpb24gZ3JhdGlj dWxlWCh5MCwgeTEsIGR5KSB7CiAgdmFyIHkgPSBzZXF1ZW5jZSh5MCwgeTEgLSBlcHNpbG9uJDIs IGR5KS5jb25jYXQoeTEpOwogIHJldHVybiBmdW5jdGlvbih4KSB7IHJldHVybiB5Lm1hcChmdW5j dGlvbih5KSB7IHJldHVybiBbeCwgeV07IH0pOyB9Owp9CgpmdW5jdGlvbiBncmF0aWN1bGVZKHgw LCB4MSwgZHgpIHsKICB2YXIgeCA9IHNlcXVlbmNlKHgwLCB4MSAtIGVwc2lsb24kMiwgZHgpLmNv bmNhdCh4MSk7CiAgcmV0dXJuIGZ1bmN0aW9uKHkpIHsgcmV0dXJuIHgubWFwKGZ1bmN0aW9uKHgp IHsgcmV0dXJuIFt4LCB5XTsgfSk7IH07Cn0KCmZ1bmN0aW9uIGdyYXRpY3VsZSgpIHsKICB2YXIg eDEsIHgwLCBYMSwgWDAsCiAgICAgIHkxLCB5MCwgWTEsIFkwLAogICAgICBkeCA9IDEwLCBkeSA9 IGR4LCBEWCA9IDkwLCBEWSA9IDM2MCwKICAgICAgeCwgeSwgWCwgWSwKICAgICAgcHJlY2lzaW9u ID0gMi41OwoKICBmdW5jdGlvbiBncmF0aWN1bGUoKSB7CiAgICByZXR1cm4ge3R5cGU6ICJNdWx0 aUxpbmVTdHJpbmciLCBjb29yZGluYXRlczogbGluZXMoKX07CiAgfQoKICBmdW5jdGlvbiBsaW5l cygpIHsKICAgIHJldHVybiBzZXF1ZW5jZShjZWlsKFgwIC8gRFgpICogRFgsIFgxLCBEWCkubWFw KFgpCiAgICAgICAgLmNvbmNhdChzZXF1ZW5jZShjZWlsKFkwIC8gRFkpICogRFksIFkxLCBEWSku bWFwKFkpKQogICAgICAgIC5jb25jYXQoc2VxdWVuY2UoY2VpbCh4MCAvIGR4KSAqIGR4LCB4MSwg ZHgpLmZpbHRlcihmdW5jdGlvbih4KSB7IHJldHVybiBhYnMoeCAlIERYKSA+IGVwc2lsb24kMjsg fSkubWFwKHgpKQogICAgICAgIC5jb25jYXQoc2VxdWVuY2UoY2VpbCh5MCAvIGR5KSAqIGR5LCB5 MSwgZHkpLmZpbHRlcihmdW5jdGlvbih5KSB7IHJldHVybiBhYnMoeSAlIERZKSA+IGVwc2lsb24k MjsgfSkubWFwKHkpKTsKICB9CgogIGdyYXRpY3VsZS5saW5lcyA9IGZ1bmN0aW9uKCkgewogICAg cmV0dXJuIGxpbmVzKCkubWFwKGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7IHJldHVybiB7dHlwZTog IkxpbmVTdHJpbmciLCBjb29yZGluYXRlczogY29vcmRpbmF0ZXN9OyB9KTsKICB9OwoKICBncmF0 aWN1bGUub3V0bGluZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogIlBv bHlnb24iLAogICAgICBjb29yZGluYXRlczogWwogICAgICAgIFgoWDApLmNvbmNhdCgKICAgICAg ICBZKFkxKS5zbGljZSgxKSwKICAgICAgICBYKFgxKS5yZXZlcnNlKCkuc2xpY2UoMSksCiAgICAg ICAgWShZMCkucmV2ZXJzZSgpLnNsaWNlKDEpKQogICAgICBdCiAgICB9OwogIH07CgogIGdyYXRp Y3VsZS5leHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJl dHVybiBncmF0aWN1bGUuZXh0ZW50TWlub3IoKTsKICAgIHJldHVybiBncmF0aWN1bGUuZXh0ZW50 TWFqb3IoXykuZXh0ZW50TWlub3IoXyk7CiAgfTsKCiAgZ3JhdGljdWxlLmV4dGVudE1ham9yID0g ZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW1tYMCwgWTBd LCBbWDEsIFkxXV07CiAgICBYMCA9ICtfWzBdWzBdLCBYMSA9ICtfWzFdWzBdOwogICAgWTAgPSAr X1swXVsxXSwgWTEgPSArX1sxXVsxXTsKICAgIGlmIChYMCA+IFgxKSBfID0gWDAsIFgwID0gWDEs IFgxID0gXzsKICAgIGlmIChZMCA+IFkxKSBfID0gWTAsIFkwID0gWTEsIFkxID0gXzsKICAgIHJl dHVybiBncmF0aWN1bGUucHJlY2lzaW9uKHByZWNpc2lvbik7CiAgfTsKCiAgZ3JhdGljdWxlLmV4 dGVudE1pbm9yID0gZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1 cm4gW1t4MCwgeTBdLCBbeDEsIHkxXV07CiAgICB4MCA9ICtfWzBdWzBdLCB4MSA9ICtfWzFdWzBd OwogICAgeTAgPSArX1swXVsxXSwgeTEgPSArX1sxXVsxXTsKICAgIGlmICh4MCA+IHgxKSBfID0g eDAsIHgwID0geDEsIHgxID0gXzsKICAgIGlmICh5MCA+IHkxKSBfID0geTAsIHkwID0geTEsIHkx ID0gXzsKICAgIHJldHVybiBncmF0aWN1bGUucHJlY2lzaW9uKHByZWNpc2lvbik7CiAgfTsKCiAg Z3JhdGljdWxlLnN0ZXAgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgp IHJldHVybiBncmF0aWN1bGUuc3RlcE1pbm9yKCk7CiAgICByZXR1cm4gZ3JhdGljdWxlLnN0ZXBN YWpvcihfKS5zdGVwTWlub3IoXyk7CiAgfTsKCiAgZ3JhdGljdWxlLnN0ZXBNYWpvciA9IGZ1bmN0 aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFtEWCwgRFldOwogICAg RFggPSArX1swXSwgRFkgPSArX1sxXTsKICAgIHJldHVybiBncmF0aWN1bGU7CiAgfTsKCiAgZ3Jh dGljdWxlLnN0ZXBNaW5vciA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0 aCkgcmV0dXJuIFtkeCwgZHldOwogICAgZHggPSArX1swXSwgZHkgPSArX1sxXTsKICAgIHJldHVy biBncmF0aWN1bGU7CiAgfTsKCiAgZ3JhdGljdWxlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsK ICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByZWNpc2lvbjsKICAgIHByZWNpc2lv biA9ICtfOwogICAgeCA9IGdyYXRpY3VsZVgoeTAsIHkxLCA5MCk7CiAgICB5ID0gZ3JhdGljdWxl WSh4MCwgeDEsIHByZWNpc2lvbik7CiAgICBYID0gZ3JhdGljdWxlWChZMCwgWTEsIDkwKTsKICAg IFkgPSBncmF0aWN1bGVZKFgwLCBYMSwgcHJlY2lzaW9uKTsKICAgIHJldHVybiBncmF0aWN1bGU7 CiAgfTsKCiAgcmV0dXJuIGdyYXRpY3VsZQogICAgICAuZXh0ZW50TWFqb3IoW1stMTgwLCAtOTAg KyBlcHNpbG9uJDJdLCBbMTgwLCA5MCAtIGVwc2lsb24kMl1dKQogICAgICAuZXh0ZW50TWlub3Io W1stMTgwLCAtODAgLSBlcHNpbG9uJDJdLCBbMTgwLCA4MCArIGVwc2lsb24kMl1dKTsKfQoKZnVu Y3Rpb24gZ3JhdGljdWxlMTAoKSB7CiAgcmV0dXJuIGdyYXRpY3VsZSgpKCk7Cn0KCmZ1bmN0aW9u IGludGVycG9sYXRlJDEoYSwgYikgewogIHZhciB4MCA9IGFbMF0gKiByYWRpYW5zLAogICAgICB5 MCA9IGFbMV0gKiByYWRpYW5zLAogICAgICB4MSA9IGJbMF0gKiByYWRpYW5zLAogICAgICB5MSA9 IGJbMV0gKiByYWRpYW5zLAogICAgICBjeTAgPSBjb3MkMSh5MCksCiAgICAgIHN5MCA9IHNpbiQx KHkwKSwKICAgICAgY3kxID0gY29zJDEoeTEpLAogICAgICBzeTEgPSBzaW4kMSh5MSksCiAgICAg IGt4MCA9IGN5MCAqIGNvcyQxKHgwKSwKICAgICAga3kwID0gY3kwICogc2luJDEoeDApLAogICAg ICBreDEgPSBjeTEgKiBjb3MkMSh4MSksCiAgICAgIGt5MSA9IGN5MSAqIHNpbiQxKHgxKSwKICAg ICAgZCA9IDIgKiBhc2luKHNxcnQoaGF2ZXJzaW4oeTEgLSB5MCkgKyBjeTAgKiBjeTEgKiBoYXZl cnNpbih4MSAtIHgwKSkpLAogICAgICBrID0gc2luJDEoZCk7CgogIHZhciBpbnRlcnBvbGF0ZSA9 IGQgPyBmdW5jdGlvbih0KSB7CiAgICB2YXIgQiA9IHNpbiQxKHQgKj0gZCkgLyBrLAogICAgICAg IEEgPSBzaW4kMShkIC0gdCkgLyBrLAogICAgICAgIHggPSBBICoga3gwICsgQiAqIGt4MSwKICAg ICAgICB5ID0gQSAqIGt5MCArIEIgKiBreTEsCiAgICAgICAgeiA9IEEgKiBzeTAgKyBCICogc3kx OwogICAgcmV0dXJuIFsKICAgICAgYXRhbjIoeSwgeCkgKiBkZWdyZWVzJDEsCiAgICAgIGF0YW4y KHosIHNxcnQoeCAqIHggKyB5ICogeSkpICogZGVncmVlcyQxCiAgICBdOwogIH0gOiBmdW5jdGlv bigpIHsKICAgIHJldHVybiBbeDAgKiBkZWdyZWVzJDEsIHkwICogZGVncmVlcyQxXTsKICB9OwoK ICBpbnRlcnBvbGF0ZS5kaXN0YW5jZSA9IGQ7CgogIHJldHVybiBpbnRlcnBvbGF0ZTsKfQoKZnVu Y3Rpb24gaWRlbnRpdHkkNCh4KSB7CiAgcmV0dXJuIHg7Cn0KCnZhciBhcmVhU3VtJDEgPSBhZGRl cigpLAogICAgYXJlYVJpbmdTdW0kMSA9IGFkZGVyKCksCiAgICB4MDAsCiAgICB5MDAsCiAgICB4 MCQxLAogICAgeTAkMTsKCnZhciBhcmVhU3RyZWFtJDEgPSB7CiAgcG9pbnQ6IG5vb3AkMiwKICBs aW5lU3RhcnQ6IG5vb3AkMiwKICBsaW5lRW5kOiBub29wJDIsCiAgcG9seWdvblN0YXJ0OiBmdW5j dGlvbigpIHsKICAgIGFyZWFTdHJlYW0kMS5saW5lU3RhcnQgPSBhcmVhUmluZ1N0YXJ0JDE7CiAg ICBhcmVhU3RyZWFtJDEubGluZUVuZCA9IGFyZWFSaW5nRW5kJDE7CiAgfSwKICBwb2x5Z29uRW5k OiBmdW5jdGlvbigpIHsKICAgIGFyZWFTdHJlYW0kMS5saW5lU3RhcnQgPSBhcmVhU3RyZWFtJDEu bGluZUVuZCA9IGFyZWFTdHJlYW0kMS5wb2ludCA9IG5vb3AkMjsKICAgIGFyZWFTdW0kMS5hZGQo YWJzKGFyZWFSaW5nU3VtJDEpKTsKICAgIGFyZWFSaW5nU3VtJDEucmVzZXQoKTsKICB9LAogIHJl c3VsdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgYXJlYSA9IGFyZWFTdW0kMSAvIDI7CiAgICBhcmVh U3VtJDEucmVzZXQoKTsKICAgIHJldHVybiBhcmVhOwogIH0KfTsKCmZ1bmN0aW9uIGFyZWFSaW5n U3RhcnQkMSgpIHsKICBhcmVhU3RyZWFtJDEucG9pbnQgPSBhcmVhUG9pbnRGaXJzdCQxOwp9Cgpm dW5jdGlvbiBhcmVhUG9pbnRGaXJzdCQxKHgsIHkpIHsKICBhcmVhU3RyZWFtJDEucG9pbnQgPSBh cmVhUG9pbnQkMTsKICB4MDAgPSB4MCQxID0geCwgeTAwID0geTAkMSA9IHk7Cn0KCmZ1bmN0aW9u IGFyZWFQb2ludCQxKHgsIHkpIHsKICBhcmVhUmluZ1N1bSQxLmFkZCh5MCQxICogeCAtIHgwJDEg KiB5KTsKICB4MCQxID0geCwgeTAkMSA9IHk7Cn0KCmZ1bmN0aW9uIGFyZWFSaW5nRW5kJDEoKSB7 CiAgYXJlYVBvaW50JDEoeDAwLCB5MDApOwp9Cgp2YXIgeDAkMiA9IEluZmluaXR5LAogICAgeTAk MiA9IHgwJDIsCiAgICB4MSA9IC14MCQyLAogICAgeTEgPSB4MTsKCnZhciBib3VuZHNTdHJlYW0k MSA9IHsKICBwb2ludDogYm91bmRzUG9pbnQkMSwKICBsaW5lU3RhcnQ6IG5vb3AkMiwKICBsaW5l RW5kOiBub29wJDIsCiAgcG9seWdvblN0YXJ0OiBub29wJDIsCiAgcG9seWdvbkVuZDogbm9vcCQy LAogIHJlc3VsdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgYm91bmRzID0gW1t4MCQyLCB5MCQyXSwg W3gxLCB5MV1dOwogICAgeDEgPSB5MSA9IC0oeTAkMiA9IHgwJDIgPSBJbmZpbml0eSk7CiAgICBy ZXR1cm4gYm91bmRzOwogIH0KfTsKCmZ1bmN0aW9uIGJvdW5kc1BvaW50JDEoeCwgeSkgewogIGlm ICh4IDwgeDAkMikgeDAkMiA9IHg7CiAgaWYgKHggPiB4MSkgeDEgPSB4OwogIGlmICh5IDwgeTAk MikgeTAkMiA9IHk7CiAgaWYgKHkgPiB5MSkgeTEgPSB5Owp9CgovLyBUT0RPIEVuZm9yY2UgcG9z aXRpdmUgYXJlYSBmb3IgZXh0ZXJpb3IsIG5lZ2F0aXZlIGFyZWEgZm9yIGludGVyaW9yPwoKdmFy IFgwJDEgPSAwLAogICAgWTAkMSA9IDAsCiAgICBaMCQxID0gMCwKICAgIFgxJDEgPSAwLAogICAg WTEkMSA9IDAsCiAgICBaMSQxID0gMCwKICAgIFgyJDEgPSAwLAogICAgWTIkMSA9IDAsCiAgICBa MiQxID0gMCwKICAgIHgwMCQxLAogICAgeTAwJDEsCiAgICB4MCQzLAogICAgeTAkMzsKCnZhciBj ZW50cm9pZFN0cmVhbSQxID0gewogIHBvaW50OiBjZW50cm9pZFBvaW50JDEsCiAgbGluZVN0YXJ0 OiBjZW50cm9pZExpbmVTdGFydCQxLAogIGxpbmVFbmQ6IGNlbnRyb2lkTGluZUVuZCQxLAogIHBv bHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICBjZW50cm9pZFN0cmVhbSQxLmxpbmVTdGFydCA9 IGNlbnRyb2lkUmluZ1N0YXJ0JDE7CiAgICBjZW50cm9pZFN0cmVhbSQxLmxpbmVFbmQgPSBjZW50 cm9pZFJpbmdFbmQkMTsKICB9LAogIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgY2VudHJv aWRTdHJlYW0kMS5wb2ludCA9IGNlbnRyb2lkUG9pbnQkMTsKICAgIGNlbnRyb2lkU3RyZWFtJDEu bGluZVN0YXJ0ID0gY2VudHJvaWRMaW5lU3RhcnQkMTsKICAgIGNlbnRyb2lkU3RyZWFtJDEubGlu ZUVuZCA9IGNlbnRyb2lkTGluZUVuZCQxOwogIH0sCiAgcmVzdWx0OiBmdW5jdGlvbigpIHsKICAg IHZhciBjZW50cm9pZCA9IFoyJDEgPyBbWDIkMSAvIFoyJDEsIFkyJDEgLyBaMiQxXQogICAgICAg IDogWjEkMSA/IFtYMSQxIC8gWjEkMSwgWTEkMSAvIFoxJDFdCiAgICAgICAgOiBaMCQxID8gW1gw JDEgLyBaMCQxLCBZMCQxIC8gWjAkMV0KICAgICAgICA6IFtOYU4sIE5hTl07CiAgICBYMCQxID0g WTAkMSA9IFowJDEgPQogICAgWDEkMSA9IFkxJDEgPSBaMSQxID0KICAgIFgyJDEgPSBZMiQxID0g WjIkMSA9IDA7CiAgICByZXR1cm4gY2VudHJvaWQ7CiAgfQp9OwoKZnVuY3Rpb24gY2VudHJvaWRQ b2ludCQxKHgsIHkpIHsKICBYMCQxICs9IHg7CiAgWTAkMSArPSB5OwogICsrWjAkMTsKfQoKZnVu Y3Rpb24gY2VudHJvaWRMaW5lU3RhcnQkMSgpIHsKICBjZW50cm9pZFN0cmVhbSQxLnBvaW50ID0g Y2VudHJvaWRQb2ludEZpcnN0TGluZTsKfQoKZnVuY3Rpb24gY2VudHJvaWRQb2ludEZpcnN0TGlu ZSh4LCB5KSB7CiAgY2VudHJvaWRTdHJlYW0kMS5wb2ludCA9IGNlbnRyb2lkUG9pbnRMaW5lOwog IGNlbnRyb2lkUG9pbnQkMSh4MCQzID0geCwgeTAkMyA9IHkpOwp9CgpmdW5jdGlvbiBjZW50cm9p ZFBvaW50TGluZSh4LCB5KSB7CiAgdmFyIGR4ID0geCAtIHgwJDMsIGR5ID0geSAtIHkwJDMsIHog PSBzcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsKICBYMSQxICs9IHogKiAoeDAkMyArIHgpIC8gMjsK ICBZMSQxICs9IHogKiAoeTAkMyArIHkpIC8gMjsKICBaMSQxICs9IHo7CiAgY2VudHJvaWRQb2lu dCQxKHgwJDMgPSB4LCB5MCQzID0geSk7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkTGluZUVuZCQxKCkg ewogIGNlbnRyb2lkU3RyZWFtJDEucG9pbnQgPSBjZW50cm9pZFBvaW50JDE7Cn0KCmZ1bmN0aW9u IGNlbnRyb2lkUmluZ1N0YXJ0JDEoKSB7CiAgY2VudHJvaWRTdHJlYW0kMS5wb2ludCA9IGNlbnRy b2lkUG9pbnRGaXJzdFJpbmc7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUmluZ0VuZCQxKCkgewogIGNl bnRyb2lkUG9pbnRSaW5nKHgwMCQxLCB5MDAkMSk7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRG aXJzdFJpbmcoeCwgeSkgewogIGNlbnRyb2lkU3RyZWFtJDEucG9pbnQgPSBjZW50cm9pZFBvaW50 UmluZzsKICBjZW50cm9pZFBvaW50JDEoeDAwJDEgPSB4MCQzID0geCwgeTAwJDEgPSB5MCQzID0g eSk7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRSaW5nKHgsIHkpIHsKICB2YXIgZHggPSB4IC0g eDAkMywKICAgICAgZHkgPSB5IC0geTAkMywKICAgICAgeiA9IHNxcnQoZHggKiBkeCArIGR5ICog ZHkpOwoKICBYMSQxICs9IHogKiAoeDAkMyArIHgpIC8gMjsKICBZMSQxICs9IHogKiAoeTAkMyAr IHkpIC8gMjsKICBaMSQxICs9IHo7CgogIHogPSB5MCQzICogeCAtIHgwJDMgKiB5OwogIFgyJDEg Kz0geiAqICh4MCQzICsgeCk7CiAgWTIkMSArPSB6ICogKHkwJDMgKyB5KTsKICBaMiQxICs9IHog KiAzOwogIGNlbnRyb2lkUG9pbnQkMSh4MCQzID0geCwgeTAkMyA9IHkpOwp9CgpmdW5jdGlvbiBQ YXRoQ29udGV4dChjb250ZXh0KSB7CiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7Cn0KClBhdGhD b250ZXh0LnByb3RvdHlwZSA9IHsKICBfcmFkaXVzOiA0LjUsCiAgcG9pbnRSYWRpdXM6IGZ1bmN0 aW9uKF8pIHsKICAgIHJldHVybiB0aGlzLl9yYWRpdXMgPSBfLCB0aGlzOwogIH0sCiAgcG9seWdv blN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSAwOwogIH0sCiAgcG9seWdvbkVu ZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gTmFOOwogIH0sCiAgbGluZVN0YXJ0OiBm dW5jdGlvbigpIHsKICAgIHRoaXMuX3BvaW50ID0gMDsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9u KCkgewogICAgaWYgKHRoaXMuX2xpbmUgPT09IDApIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7 CiAgICB0aGlzLl9wb2ludCA9IE5hTjsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAg ICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMDogewogICAgICAgIHRoaXMuX2Nv bnRleHQubW92ZVRvKHgsIHkpOwogICAgICAgIHRoaXMuX3BvaW50ID0gMTsKICAgICAgICBicmVh azsKICAgICAgfQogICAgICBjYXNlIDE6IHsKICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh4 LCB5KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBkZWZhdWx0OiB7CiAgICAgICAgdGhp cy5fY29udGV4dC5tb3ZlVG8oeCArIHRoaXMuX3JhZGl1cywgeSk7CiAgICAgICAgdGhpcy5fY29u dGV4dC5hcmMoeCwgeSwgdGhpcy5fcmFkaXVzLCAwLCB0YXUkMyk7CiAgICAgICAgYnJlYWs7CiAg ICAgIH0KICAgIH0KICB9LAogIHJlc3VsdDogbm9vcCQyCn07Cgp2YXIgbGVuZ3RoU3VtJDEgPSBh ZGRlcigpLAogICAgbGVuZ3RoUmluZywKICAgIHgwMCQyLAogICAgeTAwJDIsCiAgICB4MCQ0LAog ICAgeTAkNDsKCnZhciBsZW5ndGhTdHJlYW0kMSA9IHsKICBwb2ludDogbm9vcCQyLAogIGxpbmVT dGFydDogZnVuY3Rpb24oKSB7CiAgICBsZW5ndGhTdHJlYW0kMS5wb2ludCA9IGxlbmd0aFBvaW50 Rmlyc3QkMTsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKGxlbmd0aFJpbmcp IGxlbmd0aFBvaW50JDEoeDAwJDIsIHkwMCQyKTsKICAgIGxlbmd0aFN0cmVhbSQxLnBvaW50ID0g bm9vcCQyOwogIH0sCiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIGxlbmd0aFJpbmcg PSB0cnVlOwogIH0sCiAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICBsZW5ndGhSaW5nID0g bnVsbDsKICB9LAogIHJlc3VsdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgbGVuZ3RoID0gK2xlbmd0 aFN1bSQxOwogICAgbGVuZ3RoU3VtJDEucmVzZXQoKTsKICAgIHJldHVybiBsZW5ndGg7CiAgfQp9 OwoKZnVuY3Rpb24gbGVuZ3RoUG9pbnRGaXJzdCQxKHgsIHkpIHsKICBsZW5ndGhTdHJlYW0kMS5w b2ludCA9IGxlbmd0aFBvaW50JDE7CiAgeDAwJDIgPSB4MCQ0ID0geCwgeTAwJDIgPSB5MCQ0ID0g eTsKfQoKZnVuY3Rpb24gbGVuZ3RoUG9pbnQkMSh4LCB5KSB7CiAgeDAkNCAtPSB4LCB5MCQ0IC09 IHk7CiAgbGVuZ3RoU3VtJDEuYWRkKHNxcnQoeDAkNCAqIHgwJDQgKyB5MCQ0ICogeTAkNCkpOwog IHgwJDQgPSB4LCB5MCQ0ID0geTsKfQoKZnVuY3Rpb24gUGF0aFN0cmluZygpIHsKICB0aGlzLl9z dHJpbmcgPSBbXTsKfQoKUGF0aFN0cmluZy5wcm90b3R5cGUgPSB7CiAgX3JhZGl1czogNC41LAog IF9jaXJjbGU6IGNpcmNsZSQxKDQuNSksCiAgcG9pbnRSYWRpdXM6IGZ1bmN0aW9uKF8pIHsKICAg IGlmICgoXyA9ICtfKSAhPT0gdGhpcy5fcmFkaXVzKSB0aGlzLl9yYWRpdXMgPSBfLCB0aGlzLl9j aXJjbGUgPSBudWxsOwogICAgcmV0dXJuIHRoaXM7CiAgfSwKICBwb2x5Z29uU3RhcnQ6IGZ1bmN0 aW9uKCkgewogICAgdGhpcy5fbGluZSA9IDA7CiAgfSwKICBwb2x5Z29uRW5kOiBmdW5jdGlvbigp IHsKICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgfSwKICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewog ICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICBpZiAo dGhpcy5fbGluZSA9PT0gMCkgdGhpcy5fc3RyaW5nLnB1c2goIloiKTsKICAgIHRoaXMuX3BvaW50 ID0gTmFOOwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHN3aXRjaCAodGhpcy5f cG9pbnQpIHsKICAgICAgY2FzZSAwOiB7CiAgICAgICAgdGhpcy5fc3RyaW5nLnB1c2goIk0iLCB4 LCAiLCIsIHkpOwogICAgICAgIHRoaXMuX3BvaW50ID0gMTsKICAgICAgICBicmVhazsKICAgICAg fQogICAgICBjYXNlIDE6IHsKICAgICAgICB0aGlzLl9zdHJpbmcucHVzaCgiTCIsIHgsICIsIiwg eSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGVmYXVsdDogewogICAgICAgIGlmICh0 aGlzLl9jaXJjbGUgPT0gbnVsbCkgdGhpcy5fY2lyY2xlID0gY2lyY2xlJDEodGhpcy5fcmFkaXVz KTsKICAgICAgICB0aGlzLl9zdHJpbmcucHVzaCgiTSIsIHgsICIsIiwgeSwgdGhpcy5fY2lyY2xl KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0sCiAgcmVzdWx0OiBmdW5jdGlvbigp IHsKICAgIGlmICh0aGlzLl9zdHJpbmcubGVuZ3RoKSB7CiAgICAgIHZhciByZXN1bHQgPSB0aGlz Ll9zdHJpbmcuam9pbigiIik7CiAgICAgIHRoaXMuX3N0cmluZyA9IFtdOwogICAgICByZXR1cm4g cmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQp9OwoKZnVu Y3Rpb24gY2lyY2xlJDEocmFkaXVzKSB7CiAgcmV0dXJuICJtMCwiICsgcmFkaXVzCiAgICAgICsg ImEiICsgcmFkaXVzICsgIiwiICsgcmFkaXVzICsgIiAwIDEsMSAwLCIgKyAtMiAqIHJhZGl1cwog ICAgICArICJhIiArIHJhZGl1cyArICIsIiArIHJhZGl1cyArICIgMCAxLDEgMCwiICsgMiAqIHJh ZGl1cwogICAgICArICJ6IjsKfQoKZnVuY3Rpb24gaW5kZXgkMShwcm9qZWN0aW9uLCBjb250ZXh0 KSB7CiAgdmFyIHBvaW50UmFkaXVzID0gNC41LAogICAgICBwcm9qZWN0aW9uU3RyZWFtLAogICAg ICBjb250ZXh0U3RyZWFtOwoKICBmdW5jdGlvbiBwYXRoKG9iamVjdCkgewogICAgaWYgKG9iamVj dCkgewogICAgICBpZiAodHlwZW9mIHBvaW50UmFkaXVzID09PSAiZnVuY3Rpb24iKSBjb250ZXh0 U3RyZWFtLnBvaW50UmFkaXVzKCtwb2ludFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsK ICAgICAgZ2VvU3RyZWFtKG9iamVjdCwgcHJvamVjdGlvblN0cmVhbShjb250ZXh0U3RyZWFtKSk7 CiAgICB9CiAgICByZXR1cm4gY29udGV4dFN0cmVhbS5yZXN1bHQoKTsKICB9CgogIHBhdGguYXJl YSA9IGZ1bmN0aW9uKG9iamVjdCkgewogICAgZ2VvU3RyZWFtKG9iamVjdCwgcHJvamVjdGlvblN0 cmVhbShhcmVhU3RyZWFtJDEpKTsKICAgIHJldHVybiBhcmVhU3RyZWFtJDEucmVzdWx0KCk7CiAg fTsKCiAgcGF0aC5tZWFzdXJlID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICBnZW9TdHJlYW0ob2Jq ZWN0LCBwcm9qZWN0aW9uU3RyZWFtKGxlbmd0aFN0cmVhbSQxKSk7CiAgICByZXR1cm4gbGVuZ3Ro U3RyZWFtJDEucmVzdWx0KCk7CiAgfTsKCiAgcGF0aC5ib3VuZHMgPSBmdW5jdGlvbihvYmplY3Qp IHsKICAgIGdlb1N0cmVhbShvYmplY3QsIHByb2plY3Rpb25TdHJlYW0oYm91bmRzU3RyZWFtJDEp KTsKICAgIHJldHVybiBib3VuZHNTdHJlYW0kMS5yZXN1bHQoKTsKICB9OwoKICBwYXRoLmNlbnRy b2lkID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICBnZW9TdHJlYW0ob2JqZWN0LCBwcm9qZWN0aW9u U3RyZWFtKGNlbnRyb2lkU3RyZWFtJDEpKTsKICAgIHJldHVybiBjZW50cm9pZFN0cmVhbSQxLnJl c3VsdCgpOwogIH07CgogIHBhdGgucHJvamVjdGlvbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biBhcmd1bWVudHMubGVuZ3RoID8gKHByb2plY3Rpb25TdHJlYW0gPSBfID09IG51bGwgPyAocHJv amVjdGlvbiA9IG51bGwsIGlkZW50aXR5JDQpIDogKHByb2plY3Rpb24gPSBfKS5zdHJlYW0sIHBh dGgpIDogcHJvamVjdGlvbjsKICB9OwoKICBwYXRoLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAg ICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjb250ZXh0OwogICAgY29udGV4dFN0cmVh bSA9IF8gPT0gbnVsbCA/IChjb250ZXh0ID0gbnVsbCwgbmV3IFBhdGhTdHJpbmcpIDogbmV3IFBh dGhDb250ZXh0KGNvbnRleHQgPSBfKTsKICAgIGlmICh0eXBlb2YgcG9pbnRSYWRpdXMgIT09ICJm dW5jdGlvbiIpIGNvbnRleHRTdHJlYW0ucG9pbnRSYWRpdXMocG9pbnRSYWRpdXMpOwogICAgcmV0 dXJuIHBhdGg7CiAgfTsKCiAgcGF0aC5wb2ludFJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgIGlm ICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBvaW50UmFkaXVzOwogICAgcG9pbnRSYWRpdXMg PSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiAoY29udGV4dFN0cmVhbS5wb2ludFJhZGl1 cygrXyksICtfKTsKICAgIHJldHVybiBwYXRoOwogIH07CgogIHJldHVybiBwYXRoLnByb2plY3Rp b24ocHJvamVjdGlvbikuY29udGV4dChjb250ZXh0KTsKfQoKZnVuY3Rpb24gdHJhbnNmb3JtKG1l dGhvZHMpIHsKICByZXR1cm4gewogICAgc3RyZWFtOiB0cmFuc2Zvcm1lcihtZXRob2RzKQogIH07 Cn0KCmZ1bmN0aW9uIHRyYW5zZm9ybWVyKG1ldGhvZHMpIHsKICByZXR1cm4gZnVuY3Rpb24oc3Ry ZWFtKSB7CiAgICB2YXIgcyA9IG5ldyBUcmFuc2Zvcm1TdHJlYW07CiAgICBmb3IgKHZhciBrZXkg aW4gbWV0aG9kcykgc1trZXldID0gbWV0aG9kc1trZXldOwogICAgcy5zdHJlYW0gPSBzdHJlYW07 CiAgICByZXR1cm4gczsKICB9Owp9CgpmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW0oKSB7fQoKVHJh bnNmb3JtU3RyZWFtLnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtU3RyZWFt LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7IHRoaXMuc3RyZWFtLnBvaW50KHgsIHkpOyB9LAog IHNwaGVyZTogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLnNwaGVyZSgpOyB9LAogIGxpbmVTdGFy dDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLmxpbmVTdGFydCgpOyB9LAogIGxpbmVFbmQ6IGZ1 bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5saW5lRW5kKCk7IH0sCiAgcG9seWdvblN0YXJ0OiBmdW5j dGlvbigpIHsgdGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCk7IH0sCiAgcG9seWdvbkVuZDogZnVu Y3Rpb24oKSB7IHRoaXMuc3RyZWFtLnBvbHlnb25FbmQoKTsgfQp9OwoKZnVuY3Rpb24gZml0KHBy b2plY3Rpb24sIGZpdEJvdW5kcywgb2JqZWN0KSB7CiAgdmFyIGNsaXAgPSBwcm9qZWN0aW9uLmNs aXBFeHRlbnQgJiYgcHJvamVjdGlvbi5jbGlwRXh0ZW50KCk7CiAgcHJvamVjdGlvbi5zY2FsZSgx NTApLnRyYW5zbGF0ZShbMCwgMF0pOwogIGlmIChjbGlwICE9IG51bGwpIHByb2plY3Rpb24uY2xp cEV4dGVudChudWxsKTsKICBnZW9TdHJlYW0ob2JqZWN0LCBwcm9qZWN0aW9uLnN0cmVhbShib3Vu ZHNTdHJlYW0kMSkpOwogIGZpdEJvdW5kcyhib3VuZHNTdHJlYW0kMS5yZXN1bHQoKSk7CiAgaWYg KGNsaXAgIT0gbnVsbCkgcHJvamVjdGlvbi5jbGlwRXh0ZW50KGNsaXApOwogIHJldHVybiBwcm9q ZWN0aW9uOwp9CgpmdW5jdGlvbiBmaXRFeHRlbnQocHJvamVjdGlvbiwgZXh0ZW50LCBvYmplY3Qp IHsKICByZXR1cm4gZml0KHByb2plY3Rpb24sIGZ1bmN0aW9uKGIpIHsKICAgIHZhciB3ID0gZXh0 ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdLAogICAgICAgIGggPSBleHRlbnRbMV1bMV0gLSBleHRl bnRbMF1bMV0sCiAgICAgICAgayA9IE1hdGgubWluKHcgLyAoYlsxXVswXSAtIGJbMF1bMF0pLCBo IC8gKGJbMV1bMV0gLSBiWzBdWzFdKSksCiAgICAgICAgeCA9ICtleHRlbnRbMF1bMF0gKyAodyAt IGsgKiAoYlsxXVswXSArIGJbMF1bMF0pKSAvIDIsCiAgICAgICAgeSA9ICtleHRlbnRbMF1bMV0g KyAoaCAtIGsgKiAoYlsxXVsxXSArIGJbMF1bMV0pKSAvIDI7CiAgICBwcm9qZWN0aW9uLnNjYWxl KDE1MCAqIGspLnRyYW5zbGF0ZShbeCwgeV0pOwogIH0sIG9iamVjdCk7Cn0KCmZ1bmN0aW9uIGZp dFNpemUocHJvamVjdGlvbiwgc2l6ZSwgb2JqZWN0KSB7CiAgcmV0dXJuIGZpdEV4dGVudChwcm9q ZWN0aW9uLCBbWzAsIDBdLCBzaXplXSwgb2JqZWN0KTsKfQoKZnVuY3Rpb24gZml0V2lkdGgocHJv amVjdGlvbiwgd2lkdGgsIG9iamVjdCkgewogIHJldHVybiBmaXQocHJvamVjdGlvbiwgZnVuY3Rp b24oYikgewogICAgdmFyIHcgPSArd2lkdGgsCiAgICAgICAgayA9IHcgLyAoYlsxXVswXSAtIGJb MF1bMF0pLAogICAgICAgIHggPSAodyAtIGsgKiAoYlsxXVswXSArIGJbMF1bMF0pKSAvIDIsCiAg ICAgICAgeSA9IC1rICogYlswXVsxXTsKICAgIHByb2plY3Rpb24uc2NhbGUoMTUwICogaykudHJh bnNsYXRlKFt4LCB5XSk7CiAgfSwgb2JqZWN0KTsKfQoKZnVuY3Rpb24gZml0SGVpZ2h0KHByb2pl Y3Rpb24sIGhlaWdodCwgb2JqZWN0KSB7CiAgcmV0dXJuIGZpdChwcm9qZWN0aW9uLCBmdW5jdGlv bihiKSB7CiAgICB2YXIgaCA9ICtoZWlnaHQsCiAgICAgICAgayA9IGggLyAoYlsxXVsxXSAtIGJb MF1bMV0pLAogICAgICAgIHggPSAtayAqIGJbMF1bMF0sCiAgICAgICAgeSA9IChoIC0gayAqIChi WzFdWzFdICsgYlswXVsxXSkpIC8gMjsKICAgIHByb2plY3Rpb24uc2NhbGUoMTUwICogaykudHJh bnNsYXRlKFt4LCB5XSk7CiAgfSwgb2JqZWN0KTsKfQoKdmFyIG1heERlcHRoID0gMTYsIC8vIG1h eGltdW0gZGVwdGggb2Ygc3ViZGl2aXNpb24KICAgIGNvc01pbkRpc3RhbmNlID0gY29zJDEoMzAg KiByYWRpYW5zKTsgLy8gY29zKG1pbmltdW0gYW5ndWxhciBkaXN0YW5jZSkKCmZ1bmN0aW9uIHJl c2FtcGxlKHByb2plY3QsIGRlbHRhMikgewogIHJldHVybiArZGVsdGEyID8gcmVzYW1wbGUkMShw cm9qZWN0LCBkZWx0YTIpIDogcmVzYW1wbGVOb25lKHByb2plY3QpOwp9CgpmdW5jdGlvbiByZXNh bXBsZU5vbmUocHJvamVjdCkgewogIHJldHVybiB0cmFuc2Zvcm1lcih7CiAgICBwb2ludDogZnVu Y3Rpb24oeCwgeSkgewogICAgICB4ID0gcHJvamVjdCh4LCB5KTsKICAgICAgdGhpcy5zdHJlYW0u cG9pbnQoeFswXSwgeFsxXSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlc2FtcGxlJDEocHJv amVjdCwgZGVsdGEyKSB7CgogIGZ1bmN0aW9uIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRh MCwgYTAsIGIwLCBjMCwgeDEsIHkxLCBsYW1iZGExLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFt KSB7CiAgICB2YXIgZHggPSB4MSAtIHgwLAogICAgICAgIGR5ID0geTEgLSB5MCwKICAgICAgICBk MiA9IGR4ICogZHggKyBkeSAqIGR5OwogICAgaWYgKGQyID4gNCAqIGRlbHRhMiAmJiBkZXB0aC0t KSB7CiAgICAgIHZhciBhID0gYTAgKyBhMSwKICAgICAgICAgIGIgPSBiMCArIGIxLAogICAgICAg ICAgYyA9IGMwICsgYzEsCiAgICAgICAgICBtID0gc3FydChhICogYSArIGIgKiBiICsgYyAqIGMp LAogICAgICAgICAgcGhpMiA9IGFzaW4oYyAvPSBtKSwKICAgICAgICAgIGxhbWJkYTIgPSBhYnMo YWJzKGMpIC0gMSkgPCBlcHNpbG9uJDIgfHwgYWJzKGxhbWJkYTAgLSBsYW1iZGExKSA8IGVwc2ls b24kMiA/IChsYW1iZGEwICsgbGFtYmRhMSkgLyAyIDogYXRhbjIoYiwgYSksCiAgICAgICAgICBw ID0gcHJvamVjdChsYW1iZGEyLCBwaGkyKSwKICAgICAgICAgIHgyID0gcFswXSwKICAgICAgICAg IHkyID0gcFsxXSwKICAgICAgICAgIGR4MiA9IHgyIC0geDAsCiAgICAgICAgICBkeTIgPSB5MiAt IHkwLAogICAgICAgICAgZHogPSBkeSAqIGR4MiAtIGR4ICogZHkyOwogICAgICBpZiAoZHogKiBk eiAvIGQyID4gZGVsdGEyIC8vIHBlcnBlbmRpY3VsYXIgcHJvamVjdGVkIGRpc3RhbmNlCiAgICAg ICAgICB8fCBhYnMoKGR4ICogZHgyICsgZHkgKiBkeTIpIC8gZDIgLSAwLjUpID4gMC4zIC8vIG1p ZHBvaW50IGNsb3NlIHRvIGFuIGVuZAogICAgICAgICAgfHwgYTAgKiBhMSArIGIwICogYjEgKyBj MCAqIGMxIDwgY29zTWluRGlzdGFuY2UpIHsgLy8gYW5ndWxhciBkaXN0YW5jZQogICAgICAgIHJl c2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAsIGIwLCBjMCwgeDIsIHkyLCBsYW1iZGEy LCBhIC89IG0sIGIgLz0gbSwgYywgZGVwdGgsIHN0cmVhbSk7CiAgICAgICAgc3RyZWFtLnBvaW50 KHgyLCB5Mik7CiAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDIsIHkyLCBsYW1iZGEyLCBhLCBiLCBj LCB4MSwgeTEsIGxhbWJkYTEsIGExLCBiMSwgYzEsIGRlcHRoLCBzdHJlYW0pOwogICAgICB9CiAg ICB9CiAgfQogIHJldHVybiBmdW5jdGlvbihzdHJlYW0pIHsKICAgIHZhciBsYW1iZGEwMCwgeDAw LCB5MDAsIGEwMCwgYjAwLCBjMDAsIC8vIGZpcnN0IHBvaW50CiAgICAgICAgbGFtYmRhMCwgeDAs IHkwLCBhMCwgYjAsIGMwOyAvLyBwcmV2aW91cyBwb2ludAoKICAgIHZhciByZXNhbXBsZVN0cmVh bSA9IHsKICAgICAgcG9pbnQ6IHBvaW50LAogICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCwKICAg ICAgbGluZUVuZDogbGluZUVuZCwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsgc3Ry ZWFtLnBvbHlnb25TdGFydCgpOyByZXNhbXBsZVN0cmVhbS5saW5lU3RhcnQgPSByaW5nU3RhcnQ7 IH0sCiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgeyBzdHJlYW0ucG9seWdvbkVuZCgpOyBy ZXNhbXBsZVN0cmVhbS5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7IH0KICAgIH07CgogICAgZnVuY3Rp b24gcG9pbnQoeCwgeSkgewogICAgICB4ID0gcHJvamVjdCh4LCB5KTsKICAgICAgc3RyZWFtLnBv aW50KHhbMF0sIHhbMV0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmVTdGFydCgpIHsKICAgICAg eDAgPSBOYU47CiAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gbGluZVBvaW50OwogICAgICBz dHJlYW0ubGluZVN0YXJ0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gbGluZVBvaW50KGxhbWJkYSwg cGhpKSB7CiAgICAgIHZhciBjID0gY2FydGVzaWFuKFtsYW1iZGEsIHBoaV0pLCBwID0gcHJvamVj dChsYW1iZGEsIHBoaSk7CiAgICAgIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAs IGIwLCBjMCwgeDAgPSBwWzBdLCB5MCA9IHBbMV0sIGxhbWJkYTAgPSBsYW1iZGEsIGEwID0gY1sw XSwgYjAgPSBjWzFdLCBjMCA9IGNbMl0sIG1heERlcHRoLCBzdHJlYW0pOwogICAgICBzdHJlYW0u cG9pbnQoeDAsIHkwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lRW5kKCkgewogICAgICByZXNh bXBsZVN0cmVhbS5wb2ludCA9IHBvaW50OwogICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgfQoK ICAgIGZ1bmN0aW9uIHJpbmdTdGFydCgpIHsKICAgICAgbGluZVN0YXJ0KCk7CiAgICAgIHJlc2Ft cGxlU3RyZWFtLnBvaW50ID0gcmluZ1BvaW50OwogICAgICByZXNhbXBsZVN0cmVhbS5saW5lRW5k ID0gcmluZ0VuZDsKICAgIH0KCiAgICBmdW5jdGlvbiByaW5nUG9pbnQobGFtYmRhLCBwaGkpIHsK ICAgICAgbGluZVBvaW50KGxhbWJkYTAwID0gbGFtYmRhLCBwaGkpLCB4MDAgPSB4MCwgeTAwID0g eTAsIGEwMCA9IGEwLCBiMDAgPSBiMCwgYzAwID0gYzA7CiAgICAgIHJlc2FtcGxlU3RyZWFtLnBv aW50ID0gbGluZVBvaW50OwogICAgfQoKICAgIGZ1bmN0aW9uIHJpbmdFbmQoKSB7CiAgICAgIHJl c2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAsIGIwLCBjMCwgeDAwLCB5MDAsIGxhbWJk YTAwLCBhMDAsIGIwMCwgYzAwLCBtYXhEZXB0aCwgc3RyZWFtKTsKICAgICAgcmVzYW1wbGVTdHJl YW0ubGluZUVuZCA9IGxpbmVFbmQ7CiAgICAgIGxpbmVFbmQoKTsKICAgIH0KCiAgICByZXR1cm4g cmVzYW1wbGVTdHJlYW07CiAgfTsKfQoKdmFyIHRyYW5zZm9ybVJhZGlhbnMgPSB0cmFuc2Zvcm1l cih7CiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHRoaXMuc3RyZWFtLnBvaW50KHggKiBy YWRpYW5zLCB5ICogcmFkaWFucyk7CiAgfQp9KTsKCmZ1bmN0aW9uIHRyYW5zZm9ybVJvdGF0ZShy b3RhdGUpIHsKICByZXR1cm4gdHJhbnNmb3JtZXIoewogICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkp IHsKICAgICAgdmFyIHIgPSByb3RhdGUoeCwgeSk7CiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5w b2ludChyWzBdLCByWzFdKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gc2NhbGVUcmFuc2xhdGUo aywgZHgsIGR5LCBzeCwgc3kpIHsKICBmdW5jdGlvbiB0cmFuc2Zvcm0oeCwgeSkgewogICAgeCAq PSBzeDsgeSAqPSBzeTsKICAgIHJldHVybiBbZHggKyBrICogeCwgZHkgLSBrICogeV07CiAgfQog IHRyYW5zZm9ybS5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICByZXR1cm4gWyh4IC0gZHgp IC8gayAqIHN4LCAoZHkgLSB5KSAvIGsgKiBzeV07CiAgfTsKICByZXR1cm4gdHJhbnNmb3JtOwp9 CgpmdW5jdGlvbiBzY2FsZVRyYW5zbGF0ZVJvdGF0ZShrLCBkeCwgZHksIHN4LCBzeSwgYWxwaGEp IHsKICB2YXIgY29zQWxwaGEgPSBjb3MkMShhbHBoYSksCiAgICAgIHNpbkFscGhhID0gc2luJDEo YWxwaGEpLAogICAgICBhID0gY29zQWxwaGEgKiBrLAogICAgICBiID0gc2luQWxwaGEgKiBrLAog ICAgICBhaSA9IGNvc0FscGhhIC8gaywKICAgICAgYmkgPSBzaW5BbHBoYSAvIGssCiAgICAgIGNp ID0gKHNpbkFscGhhICogZHkgLSBjb3NBbHBoYSAqIGR4KSAvIGssCiAgICAgIGZpID0gKHNpbkFs cGhhICogZHggKyBjb3NBbHBoYSAqIGR5KSAvIGs7CiAgZnVuY3Rpb24gdHJhbnNmb3JtKHgsIHkp IHsKICAgIHggKj0gc3g7IHkgKj0gc3k7CiAgICByZXR1cm4gW2EgKiB4IC0gYiAqIHkgKyBkeCwg ZHkgLSBiICogeCAtIGEgKiB5XTsKICB9CiAgdHJhbnNmb3JtLmludmVydCA9IGZ1bmN0aW9uKHgs IHkpIHsKICAgIHJldHVybiBbc3ggKiAoYWkgKiB4IC0gYmkgKiB5ICsgY2kpLCBzeSAqIChmaSAt IGJpICogeCAtIGFpICogeSldOwogIH07CiAgcmV0dXJuIHRyYW5zZm9ybTsKfQoKZnVuY3Rpb24g cHJvamVjdGlvbihwcm9qZWN0KSB7CiAgcmV0dXJuIHByb2plY3Rpb25NdXRhdG9yKGZ1bmN0aW9u KCkgeyByZXR1cm4gcHJvamVjdDsgfSkoKTsKfQoKZnVuY3Rpb24gcHJvamVjdGlvbk11dGF0b3Io cHJvamVjdEF0KSB7CiAgdmFyIHByb2plY3QsCiAgICAgIGsgPSAxNTAsIC8vIHNjYWxlCiAgICAg IHggPSA0ODAsIHkgPSAyNTAsIC8vIHRyYW5zbGF0ZQogICAgICBsYW1iZGEgPSAwLCBwaGkgPSAw LCAvLyBjZW50ZXIKICAgICAgZGVsdGFMYW1iZGEgPSAwLCBkZWx0YVBoaSA9IDAsIGRlbHRhR2Ft bWEgPSAwLCByb3RhdGUsIC8vIHByZS1yb3RhdGUKICAgICAgYWxwaGEgPSAwLCAvLyBwb3N0LXJv dGF0ZSBhbmdsZQogICAgICBzeCA9IDEsIC8vIHJlZmxlY3RYCiAgICAgIHN5ID0gMSwgLy8gcmVm bGVjdFgKICAgICAgdGhldGEgPSBudWxsLCBwcmVjbGlwID0gY2xpcEFudGltZXJpZGlhbiwgLy8g cHJlLWNsaXAgYW5nbGUKICAgICAgeDAgPSBudWxsLCB5MCwgeDEsIHkxLCBwb3N0Y2xpcCA9IGlk ZW50aXR5JDQsIC8vIHBvc3QtY2xpcCBleHRlbnQKICAgICAgZGVsdGEyID0gMC41LCAvLyBwcmVj aXNpb24KICAgICAgcHJvamVjdFJlc2FtcGxlLAogICAgICBwcm9qZWN0VHJhbnNmb3JtLAogICAg ICBwcm9qZWN0Um90YXRlVHJhbnNmb3JtLAogICAgICBjYWNoZSwKICAgICAgY2FjaGVTdHJlYW07 CgogIGZ1bmN0aW9uIHByb2plY3Rpb24ocG9pbnQpIHsKICAgIHJldHVybiBwcm9qZWN0Um90YXRl VHJhbnNmb3JtKHBvaW50WzBdICogcmFkaWFucywgcG9pbnRbMV0gKiByYWRpYW5zKTsKICB9Cgog IGZ1bmN0aW9uIGludmVydChwb2ludCkgewogICAgcG9pbnQgPSBwcm9qZWN0Um90YXRlVHJhbnNm b3JtLmludmVydChwb2ludFswXSwgcG9pbnRbMV0pOwogICAgcmV0dXJuIHBvaW50ICYmIFtwb2lu dFswXSAqIGRlZ3JlZXMkMSwgcG9pbnRbMV0gKiBkZWdyZWVzJDFdOwogIH0KCiAgcHJvamVjdGlv bi5zdHJlYW0gPSBmdW5jdGlvbihzdHJlYW0pIHsKICAgIHJldHVybiBjYWNoZSAmJiBjYWNoZVN0 cmVhbSA9PT0gc3RyZWFtID8gY2FjaGUgOiBjYWNoZSA9IHRyYW5zZm9ybVJhZGlhbnModHJhbnNm b3JtUm90YXRlKHJvdGF0ZSkocHJlY2xpcChwcm9qZWN0UmVzYW1wbGUocG9zdGNsaXAoY2FjaGVT dHJlYW0gPSBzdHJlYW0pKSkpKTsKICB9OwoKICBwcm9qZWN0aW9uLnByZWNsaXAgPSBmdW5jdGlv bihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcmVjbGlwID0gXywgdGhldGEg PSB1bmRlZmluZWQsIHJlc2V0KCkpIDogcHJlY2xpcDsKICB9OwoKICBwcm9qZWN0aW9uLnBvc3Rj bGlwID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNs aXAgPSBfLCB4MCA9IHkwID0geDEgPSB5MSA9IG51bGwsIHJlc2V0KCkpIDogcG9zdGNsaXA7CiAg fTsKCiAgcHJvamVjdGlvbi5jbGlwQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJn dW1lbnRzLmxlbmd0aCA/IChwcmVjbGlwID0gK18gPyBjbGlwQ2lyY2xlKHRoZXRhID0gXyAqIHJh ZGlhbnMpIDogKHRoZXRhID0gbnVsbCwgY2xpcEFudGltZXJpZGlhbiksIHJlc2V0KCkpIDogdGhl dGEgKiBkZWdyZWVzJDE7CiAgfTsKCiAgcHJvamVjdGlvbi5jbGlwRXh0ZW50ID0gZnVuY3Rpb24o XykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNsaXAgPSBfID09IG51bGwg PyAoeDAgPSB5MCA9IHgxID0geTEgPSBudWxsLCBpZGVudGl0eSQ0KSA6IGNsaXBSZWN0YW5nbGUo eDAgPSArX1swXVswXSwgeTAgPSArX1swXVsxXSwgeDEgPSArX1sxXVswXSwgeTEgPSArX1sxXVsx XSksIHJlc2V0KCkpIDogeDAgPT0gbnVsbCA/IG51bGwgOiBbW3gwLCB5MF0sIFt4MSwgeTFdXTsK ICB9OwoKICBwcm9qZWN0aW9uLnNjYWxlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyAoayA9ICtfLCByZWNlbnRlcigpKSA6IGs7CiAgfTsKCiAgcHJvamVjdGlv bi50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ ICh4ID0gK19bMF0sIHkgPSArX1sxXSwgcmVjZW50ZXIoKSkgOiBbeCwgeV07CiAgfTsKCiAgcHJv amVjdGlvbi5jZW50ZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/IChsYW1iZGEgPSBfWzBdICUgMzYwICogcmFkaWFucywgcGhpID0gX1sxXSAlIDM2MCAqIHJh ZGlhbnMsIHJlY2VudGVyKCkpIDogW2xhbWJkYSAqIGRlZ3JlZXMkMSwgcGhpICogZGVncmVlcyQx XTsKICB9OwoKICBwcm9qZWN0aW9uLnJvdGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBh cmd1bWVudHMubGVuZ3RoID8gKGRlbHRhTGFtYmRhID0gX1swXSAlIDM2MCAqIHJhZGlhbnMsIGRl bHRhUGhpID0gX1sxXSAlIDM2MCAqIHJhZGlhbnMsIGRlbHRhR2FtbWEgPSBfLmxlbmd0aCA+IDIg PyBfWzJdICUgMzYwICogcmFkaWFucyA6IDAsIHJlY2VudGVyKCkpIDogW2RlbHRhTGFtYmRhICog ZGVncmVlcyQxLCBkZWx0YVBoaSAqIGRlZ3JlZXMkMSwgZGVsdGFHYW1tYSAqIGRlZ3JlZXMkMV07 CiAgfTsKCiAgcHJvamVjdGlvbi5hbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1 bWVudHMubGVuZ3RoID8gKGFscGhhID0gXyAlIDM2MCAqIHJhZGlhbnMsIHJlY2VudGVyKCkpIDog YWxwaGEgKiBkZWdyZWVzJDE7CiAgfTsKCiAgcHJvamVjdGlvbi5yZWZsZWN0WCA9IGZ1bmN0aW9u KF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN4ID0gXyA/IC0xIDogMSwgcmVj ZW50ZXIoKSkgOiBzeCA8IDA7CiAgfTsKCiAgcHJvamVjdGlvbi5yZWZsZWN0WSA9IGZ1bmN0aW9u KF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN5ID0gXyA/IC0xIDogMSwgcmVj ZW50ZXIoKSkgOiBzeSA8IDA7CiAgfTsKCiAgcHJvamVjdGlvbi5wcmVjaXNpb24gPSBmdW5jdGlv bihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcm9qZWN0UmVzYW1wbGUgPSBy ZXNhbXBsZShwcm9qZWN0VHJhbnNmb3JtLCBkZWx0YTIgPSBfICogXyksIHJlc2V0KCkpIDogc3Fy dChkZWx0YTIpOwogIH07CgogIHByb2plY3Rpb24uZml0RXh0ZW50ID0gZnVuY3Rpb24oZXh0ZW50 LCBvYmplY3QpIHsKICAgIHJldHVybiBmaXRFeHRlbnQocHJvamVjdGlvbiwgZXh0ZW50LCBvYmpl Y3QpOwogIH07CgogIHByb2plY3Rpb24uZml0U2l6ZSA9IGZ1bmN0aW9uKHNpemUsIG9iamVjdCkg ewogICAgcmV0dXJuIGZpdFNpemUocHJvamVjdGlvbiwgc2l6ZSwgb2JqZWN0KTsKICB9OwoKICBw cm9qZWN0aW9uLmZpdFdpZHRoID0gZnVuY3Rpb24od2lkdGgsIG9iamVjdCkgewogICAgcmV0dXJu IGZpdFdpZHRoKHByb2plY3Rpb24sIHdpZHRoLCBvYmplY3QpOwogIH07CgogIHByb2plY3Rpb24u Zml0SGVpZ2h0ID0gZnVuY3Rpb24oaGVpZ2h0LCBvYmplY3QpIHsKICAgIHJldHVybiBmaXRIZWln aHQocHJvamVjdGlvbiwgaGVpZ2h0LCBvYmplY3QpOwogIH07CgogIGZ1bmN0aW9uIHJlY2VudGVy KCkgewogICAgdmFyIGNlbnRlciA9IHNjYWxlVHJhbnNsYXRlUm90YXRlKGssIDAsIDAsIHN4LCBz eSwgYWxwaGEpLmFwcGx5KG51bGwsIHByb2plY3QobGFtYmRhLCBwaGkpKSwKICAgICAgICB0cmFu c2Zvcm0gPSAoYWxwaGEgPyBzY2FsZVRyYW5zbGF0ZVJvdGF0ZSA6IHNjYWxlVHJhbnNsYXRlKShr LCB4IC0gY2VudGVyWzBdLCB5IC0gY2VudGVyWzFdLCBzeCwgc3ksIGFscGhhKTsKICAgIHJvdGF0 ZSA9IHJvdGF0ZVJhZGlhbnMoZGVsdGFMYW1iZGEsIGRlbHRhUGhpLCBkZWx0YUdhbW1hKTsKICAg IHByb2plY3RUcmFuc2Zvcm0gPSBjb21wb3NlKHByb2plY3QsIHRyYW5zZm9ybSk7CiAgICBwcm9q ZWN0Um90YXRlVHJhbnNmb3JtID0gY29tcG9zZShyb3RhdGUsIHByb2plY3RUcmFuc2Zvcm0pOwog ICAgcHJvamVjdFJlc2FtcGxlID0gcmVzYW1wbGUocHJvamVjdFRyYW5zZm9ybSwgZGVsdGEyKTsK ICAgIHJldHVybiByZXNldCgpOwogIH0KCiAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICBjYWNoZSA9 IGNhY2hlU3RyZWFtID0gbnVsbDsKICAgIHJldHVybiBwcm9qZWN0aW9uOwogIH0KCiAgcmV0dXJu IGZ1bmN0aW9uKCkgewogICAgcHJvamVjdCA9IHByb2plY3RBdC5hcHBseSh0aGlzLCBhcmd1bWVu dHMpOwogICAgcHJvamVjdGlvbi5pbnZlcnQgPSBwcm9qZWN0LmludmVydCAmJiBpbnZlcnQ7CiAg ICByZXR1cm4gcmVjZW50ZXIoKTsKICB9Owp9CgpmdW5jdGlvbiBjb25pY1Byb2plY3Rpb24ocHJv amVjdEF0KSB7CiAgdmFyIHBoaTAgPSAwLAogICAgICBwaGkxID0gcGkkMyAvIDMsCiAgICAgIG0g PSBwcm9qZWN0aW9uTXV0YXRvcihwcm9qZWN0QXQpLAogICAgICBwID0gbShwaGkwLCBwaGkxKTsK CiAgcC5wYXJhbGxlbHMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/IG0ocGhpMCA9IF9bMF0gKiByYWRpYW5zLCBwaGkxID0gX1sxXSAqIHJhZGlhbnMpIDogW3Bo aTAgKiBkZWdyZWVzJDEsIHBoaTEgKiBkZWdyZWVzJDFdOwogIH07CgogIHJldHVybiBwOwp9Cgpm dW5jdGlvbiBjeWxpbmRyaWNhbEVxdWFsQXJlYVJhdyhwaGkwKSB7CiAgdmFyIGNvc1BoaTAgPSBj b3MkMShwaGkwKTsKCiAgZnVuY3Rpb24gZm9yd2FyZChsYW1iZGEsIHBoaSkgewogICAgcmV0dXJu IFtsYW1iZGEgKiBjb3NQaGkwLCBzaW4kMShwaGkpIC8gY29zUGhpMF07CiAgfQoKICBmb3J3YXJk LmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHJldHVybiBbeCAvIGNvc1BoaTAsIGFzaW4o eSAqIGNvc1BoaTApXTsKICB9OwoKICByZXR1cm4gZm9yd2FyZDsKfQoKZnVuY3Rpb24gY29uaWNF cXVhbEFyZWFSYXcoeTAsIHkxKSB7CiAgdmFyIHN5MCA9IHNpbiQxKHkwKSwgbiA9IChzeTAgKyBz aW4kMSh5MSkpIC8gMjsKCiAgLy8gQXJlIHRoZSBwYXJhbGxlbHMgc3ltbWV0cmljYWwgYXJvdW5k IHRoZSBFcXVhdG9yPwogIGlmIChhYnMobikgPCBlcHNpbG9uJDIpIHJldHVybiBjeWxpbmRyaWNh bEVxdWFsQXJlYVJhdyh5MCk7CgogIHZhciBjID0gMSArIHN5MCAqICgyICogbiAtIHN5MCksIHIw ID0gc3FydChjKSAvIG47CgogIGZ1bmN0aW9uIHByb2plY3QoeCwgeSkgewogICAgdmFyIHIgPSBz cXJ0KGMgLSAyICogbiAqIHNpbiQxKHkpKSAvIG47CiAgICByZXR1cm4gW3IgKiBzaW4kMSh4ICo9 IG4pLCByMCAtIHIgKiBjb3MkMSh4KV07CiAgfQoKICBwcm9qZWN0LmludmVydCA9IGZ1bmN0aW9u KHgsIHkpIHsKICAgIHZhciByMHkgPSByMCAtIHksCiAgICAgICAgbCA9IGF0YW4yKHgsIGFicyhy MHkpKSAqIHNpZ24ocjB5KTsKICAgIGlmIChyMHkgKiBuIDwgMCkKICAgICAgbCAtPSBwaSQzICog c2lnbih4KSAqIHNpZ24ocjB5KTsKICAgIHJldHVybiBbbCAvIG4sIGFzaW4oKGMgLSAoeCAqIHgg KyByMHkgKiByMHkpICogbiAqIG4pIC8gKDIgKiBuKSldOwogIH07CgogIHJldHVybiBwcm9qZWN0 Owp9CgpmdW5jdGlvbiBjb25pY0VxdWFsQXJlYSgpIHsKICByZXR1cm4gY29uaWNQcm9qZWN0aW9u KGNvbmljRXF1YWxBcmVhUmF3KQogICAgICAuc2NhbGUoMTU1LjQyNCkKICAgICAgLmNlbnRlcihb MCwgMzMuNjQ0Ml0pOwp9CgpmdW5jdGlvbiBhbGJlcnMoKSB7CiAgcmV0dXJuIGNvbmljRXF1YWxB cmVhKCkKICAgICAgLnBhcmFsbGVscyhbMjkuNSwgNDUuNV0pCiAgICAgIC5zY2FsZSgxMDcwKQog ICAgICAudHJhbnNsYXRlKFs0ODAsIDI1MF0pCiAgICAgIC5yb3RhdGUoWzk2LCAwXSkKICAgICAg LmNlbnRlcihbLTAuNiwgMzguN10pOwp9CgovLyBUaGUgcHJvamVjdGlvbnMgbXVzdCBoYXZlIG11 dHVhbGx5IGV4Y2x1c2l2ZSBjbGlwIHJlZ2lvbnMgb24gdGhlIHNwaGVyZSwKLy8gYXMgdGhpcyB3 aWxsIGF2b2lkIGVtaXR0aW5nIGludGVybGVhdmluZyBsaW5lcyBhbmQgcG9seWdvbnMuCmZ1bmN0 aW9uIG11bHRpcGxleChzdHJlYW1zKSB7CiAgdmFyIG4gPSBzdHJlYW1zLmxlbmd0aDsKICByZXR1 cm4gewogICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsgdmFyIGkgPSAtMTsgd2hpbGUgKCsraSA8 IG4pIHN0cmVhbXNbaV0ucG9pbnQoeCwgeSk7IH0sCiAgICBzcGhlcmU6IGZ1bmN0aW9uKCkgeyB2 YXIgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgc3RyZWFtc1tpXS5zcGhlcmUoKTsgfSwKICAgIGxp bmVTdGFydDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1z W2ldLmxpbmVTdGFydCgpOyB9LAogICAgbGluZUVuZDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7 IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLmxpbmVFbmQoKTsgfSwKICAgIHBvbHlnb25TdGFy dDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnBv bHlnb25TdGFydCgpOyB9LAogICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7 IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnBvbHlnb25FbmQoKTsgfQogIH07Cn0KCi8vIEEg Y29tcG9zaXRlIHByb2plY3Rpb24gZm9yIHRoZSBVbml0ZWQgU3RhdGVzLCBjb25maWd1cmVkIGJ5 IGRlZmF1bHQgZm9yCi8vIDk2MMOXNTAwLiBUaGUgcHJvamVjdGlvbiBhbHNvIHdvcmtzIHF1aXRl IHdlbGwgYXQgOTYww5c2MDAgaWYgeW91IGNoYW5nZSB0aGUKLy8gc2NhbGUgdG8gMTI4NSBhbmQg YWRqdXN0IHRoZSB0cmFuc2xhdGUgYWNjb3JkaW5nbHkuIFRoZSBzZXQgb2Ygc3RhbmRhcmQKLy8g cGFyYWxsZWxzIGZvciBlYWNoIHJlZ2lvbiBjb21lcyBmcm9tIFVTR1MsIHdoaWNoIGlzIHB1Ymxp c2hlZCBoZXJlOgovLyBodHRwOi8vZWdzYy51c2dzLmdvdi9pc2IvcHVicy9NYXBQcm9qZWN0aW9u cy9wcm9qZWN0aW9ucy5odG1sI2FsYmVycwpmdW5jdGlvbiBhbGJlcnNVc2EoKSB7CiAgdmFyIGNh Y2hlLAogICAgICBjYWNoZVN0cmVhbSwKICAgICAgbG93ZXI0OCA9IGFsYmVycygpLCBsb3dlcjQ4 UG9pbnQsCiAgICAgIGFsYXNrYSA9IGNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTQsIDBdKS5j ZW50ZXIoWy0yLCA1OC41XSkucGFyYWxsZWxzKFs1NSwgNjVdKSwgYWxhc2thUG9pbnQsIC8vIEVQ U0c6MzMzOAogICAgICBoYXdhaWkgPSBjb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU3LCAwXSku Y2VudGVyKFstMywgMTkuOV0pLnBhcmFsbGVscyhbOCwgMThdKSwgaGF3YWlpUG9pbnQsIC8vIEVT Ukk6MTAyMDA3CiAgICAgIHBvaW50LCBwb2ludFN0cmVhbSA9IHtwb2ludDogZnVuY3Rpb24oeCwg eSkgeyBwb2ludCA9IFt4LCB5XTsgfX07CgogIGZ1bmN0aW9uIGFsYmVyc1VzYShjb29yZGluYXRl cykgewogICAgdmFyIHggPSBjb29yZGluYXRlc1swXSwgeSA9IGNvb3JkaW5hdGVzWzFdOwogICAg cmV0dXJuIHBvaW50ID0gbnVsbCwKICAgICAgICAobG93ZXI0OFBvaW50LnBvaW50KHgsIHkpLCBw b2ludCkKICAgICAgICB8fCAoYWxhc2thUG9pbnQucG9pbnQoeCwgeSksIHBvaW50KQogICAgICAg IHx8IChoYXdhaWlQb2ludC5wb2ludCh4LCB5KSwgcG9pbnQpOwogIH0KCiAgYWxiZXJzVXNhLmlu dmVydCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7CiAgICB2YXIgayA9IGxvd2VyNDguc2NhbGUo KSwKICAgICAgICB0ID0gbG93ZXI0OC50cmFuc2xhdGUoKSwKICAgICAgICB4ID0gKGNvb3JkaW5h dGVzWzBdIC0gdFswXSkgLyBrLAogICAgICAgIHkgPSAoY29vcmRpbmF0ZXNbMV0gLSB0WzFdKSAv IGs7CiAgICByZXR1cm4gKHkgPj0gMC4xMjAgJiYgeSA8IDAuMjM0ICYmIHggPj0gLTAuNDI1ICYm IHggPCAtMC4yMTQgPyBhbGFza2EKICAgICAgICA6IHkgPj0gMC4xNjYgJiYgeSA8IDAuMjM0ICYm IHggPj0gLTAuMjE0ICYmIHggPCAtMC4xMTUgPyBoYXdhaWkKICAgICAgICA6IGxvd2VyNDgpLmlu dmVydChjb29yZGluYXRlcyk7CiAgfTsKCiAgYWxiZXJzVXNhLnN0cmVhbSA9IGZ1bmN0aW9uKHN0 cmVhbSkgewogICAgcmV0dXJuIGNhY2hlICYmIGNhY2hlU3RyZWFtID09PSBzdHJlYW0gPyBjYWNo ZSA6IGNhY2hlID0gbXVsdGlwbGV4KFtsb3dlcjQ4LnN0cmVhbShjYWNoZVN0cmVhbSA9IHN0cmVh bSksIGFsYXNrYS5zdHJlYW0oc3RyZWFtKSwgaGF3YWlpLnN0cmVhbShzdHJlYW0pXSk7CiAgfTsK CiAgYWxiZXJzVXNhLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRz Lmxlbmd0aCkgcmV0dXJuIGxvd2VyNDgucHJlY2lzaW9uKCk7CiAgICBsb3dlcjQ4LnByZWNpc2lv bihfKSwgYWxhc2thLnByZWNpc2lvbihfKSwgaGF3YWlpLnByZWNpc2lvbihfKTsKICAgIHJldHVy biByZXNldCgpOwogIH07CgogIGFsYmVyc1VzYS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIGlm ICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxvd2VyNDguc2NhbGUoKTsKICAgIGxvd2VyNDgu c2NhbGUoXyksIGFsYXNrYS5zY2FsZShfICogMC4zNSksIGhhd2FpaS5zY2FsZShfKTsKICAgIHJl dHVybiBhbGJlcnNVc2EudHJhbnNsYXRlKGxvd2VyNDgudHJhbnNsYXRlKCkpOwogIH07CgogIGFs YmVyc1VzYS50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5n dGgpIHJldHVybiBsb3dlcjQ4LnRyYW5zbGF0ZSgpOwogICAgdmFyIGsgPSBsb3dlcjQ4LnNjYWxl KCksIHggPSArX1swXSwgeSA9ICtfWzFdOwoKICAgIGxvd2VyNDhQb2ludCA9IGxvd2VyNDgKICAg ICAgICAudHJhbnNsYXRlKF8pCiAgICAgICAgLmNsaXBFeHRlbnQoW1t4IC0gMC40NTUgKiBrLCB5 IC0gMC4yMzggKiBrXSwgW3ggKyAwLjQ1NSAqIGssIHkgKyAwLjIzOCAqIGtdXSkKICAgICAgICAu c3RyZWFtKHBvaW50U3RyZWFtKTsKCiAgICBhbGFza2FQb2ludCA9IGFsYXNrYQogICAgICAgIC50 cmFuc2xhdGUoW3ggLSAwLjMwNyAqIGssIHkgKyAwLjIwMSAqIGtdKQogICAgICAgIC5jbGlwRXh0 ZW50KFtbeCAtIDAuNDI1ICogayArIGVwc2lsb24kMiwgeSArIDAuMTIwICogayArIGVwc2lsb24k Ml0sIFt4IC0gMC4yMTQgKiBrIC0gZXBzaWxvbiQyLCB5ICsgMC4yMzQgKiBrIC0gZXBzaWxvbiQy XV0pCiAgICAgICAgLnN0cmVhbShwb2ludFN0cmVhbSk7CgogICAgaGF3YWlpUG9pbnQgPSBoYXdh aWkKICAgICAgICAudHJhbnNsYXRlKFt4IC0gMC4yMDUgKiBrLCB5ICsgMC4yMTIgKiBrXSkKICAg ICAgICAuY2xpcEV4dGVudChbW3ggLSAwLjIxNCAqIGsgKyBlcHNpbG9uJDIsIHkgKyAwLjE2NiAq IGsgKyBlcHNpbG9uJDJdLCBbeCAtIDAuMTE1ICogayAtIGVwc2lsb24kMiwgeSArIDAuMjM0ICog ayAtIGVwc2lsb24kMl1dKQogICAgICAgIC5zdHJlYW0ocG9pbnRTdHJlYW0pOwoKICAgIHJldHVy biByZXNldCgpOwogIH07CgogIGFsYmVyc1VzYS5maXRFeHRlbnQgPSBmdW5jdGlvbihleHRlbnQs IG9iamVjdCkgewogICAgcmV0dXJuIGZpdEV4dGVudChhbGJlcnNVc2EsIGV4dGVudCwgb2JqZWN0 KTsKICB9OwoKICBhbGJlcnNVc2EuZml0U2l6ZSA9IGZ1bmN0aW9uKHNpemUsIG9iamVjdCkgewog ICAgcmV0dXJuIGZpdFNpemUoYWxiZXJzVXNhLCBzaXplLCBvYmplY3QpOwogIH07CgogIGFsYmVy c1VzYS5maXRXaWR0aCA9IGZ1bmN0aW9uKHdpZHRoLCBvYmplY3QpIHsKICAgIHJldHVybiBmaXRX aWR0aChhbGJlcnNVc2EsIHdpZHRoLCBvYmplY3QpOwogIH07CgogIGFsYmVyc1VzYS5maXRIZWln aHQgPSBmdW5jdGlvbihoZWlnaHQsIG9iamVjdCkgewogICAgcmV0dXJuIGZpdEhlaWdodChhbGJl cnNVc2EsIGhlaWdodCwgb2JqZWN0KTsKICB9OwoKICBmdW5jdGlvbiByZXNldCgpIHsKICAgIGNh Y2hlID0gY2FjaGVTdHJlYW0gPSBudWxsOwogICAgcmV0dXJuIGFsYmVyc1VzYTsKICB9CgogIHJl dHVybiBhbGJlcnNVc2Euc2NhbGUoMTA3MCk7Cn0KCmZ1bmN0aW9uIGF6aW11dGhhbFJhdyhzY2Fs ZSkgewogIHJldHVybiBmdW5jdGlvbih4LCB5KSB7CiAgICB2YXIgY3ggPSBjb3MkMSh4KSwKICAg ICAgICBjeSA9IGNvcyQxKHkpLAogICAgICAgIGsgPSBzY2FsZShjeCAqIGN5KTsKICAgIHJldHVy biBbCiAgICAgIGsgKiBjeSAqIHNpbiQxKHgpLAogICAgICBrICogc2luJDEoeSkKICAgIF07CiAg fQp9CgpmdW5jdGlvbiBhemltdXRoYWxJbnZlcnQoYW5nbGUpIHsKICByZXR1cm4gZnVuY3Rpb24o eCwgeSkgewogICAgdmFyIHogPSBzcXJ0KHggKiB4ICsgeSAqIHkpLAogICAgICAgIGMgPSBhbmds ZSh6KSwKICAgICAgICBzYyA9IHNpbiQxKGMpLAogICAgICAgIGNjID0gY29zJDEoYyk7CiAgICBy ZXR1cm4gWwogICAgICBhdGFuMih4ICogc2MsIHogKiBjYyksCiAgICAgIGFzaW4oeiAmJiB5ICog c2MgLyB6KQogICAgXTsKICB9Cn0KCnZhciBhemltdXRoYWxFcXVhbEFyZWFSYXcgPSBhemltdXRo YWxSYXcoZnVuY3Rpb24oY3hjeSkgewogIHJldHVybiBzcXJ0KDIgLyAoMSArIGN4Y3kpKTsKfSk7 CgphemltdXRoYWxFcXVhbEFyZWFSYXcuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0KGZ1bmN0aW9u KHopIHsKICByZXR1cm4gMiAqIGFzaW4oeiAvIDIpOwp9KTsKCmZ1bmN0aW9uIGF6aW11dGhhbEVx dWFsQXJlYSgpIHsKICByZXR1cm4gcHJvamVjdGlvbihhemltdXRoYWxFcXVhbEFyZWFSYXcpCiAg ICAgIC5zY2FsZSgxMjQuNzUpCiAgICAgIC5jbGlwQW5nbGUoMTgwIC0gMWUtMyk7Cn0KCnZhciBh emltdXRoYWxFcXVpZGlzdGFudFJhdyA9IGF6aW11dGhhbFJhdyhmdW5jdGlvbihjKSB7CiAgcmV0 dXJuIChjID0gYWNvcyhjKSkgJiYgYyAvIHNpbiQxKGMpOwp9KTsKCmF6aW11dGhhbEVxdWlkaXN0 YW50UmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChmdW5jdGlvbih6KSB7CiAgcmV0dXJuIHo7 Cn0pOwoKZnVuY3Rpb24gYXppbXV0aGFsRXF1aWRpc3RhbnQoKSB7CiAgcmV0dXJuIHByb2plY3Rp b24oYXppbXV0aGFsRXF1aWRpc3RhbnRSYXcpCiAgICAgIC5zY2FsZSg3OS40MTg4KQogICAgICAu Y2xpcEFuZ2xlKDE4MCAtIDFlLTMpOwp9CgpmdW5jdGlvbiBtZXJjYXRvclJhdyhsYW1iZGEsIHBo aSkgewogIHJldHVybiBbbGFtYmRhLCBsb2codGFuKChoYWxmUGkkMiArIHBoaSkgLyAyKSldOwp9 CgptZXJjYXRvclJhdy5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgcmV0dXJuIFt4LCAyICog YXRhbihleHAoeSkpIC0gaGFsZlBpJDJdOwp9OwoKZnVuY3Rpb24gbWVyY2F0b3IoKSB7CiAgcmV0 dXJuIG1lcmNhdG9yUHJvamVjdGlvbihtZXJjYXRvclJhdykKICAgICAgLnNjYWxlKDk2MSAvIHRh dSQzKTsKfQoKZnVuY3Rpb24gbWVyY2F0b3JQcm9qZWN0aW9uKHByb2plY3QpIHsKICB2YXIgbSA9 IHByb2plY3Rpb24ocHJvamVjdCksCiAgICAgIGNlbnRlciA9IG0uY2VudGVyLAogICAgICBzY2Fs ZSA9IG0uc2NhbGUsCiAgICAgIHRyYW5zbGF0ZSA9IG0udHJhbnNsYXRlLAogICAgICBjbGlwRXh0 ZW50ID0gbS5jbGlwRXh0ZW50LAogICAgICB4MCA9IG51bGwsIHkwLCB4MSwgeTE7IC8vIGNsaXAg ZXh0ZW50CgogIG0uc2NhbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/IChzY2FsZShfKSwgcmVjbGlwKCkpIDogc2NhbGUoKTsKICB9OwoKICBtLnRyYW5zbGF0 ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zbGF0 ZShfKSwgcmVjbGlwKCkpIDogdHJhbnNsYXRlKCk7CiAgfTsKCiAgbS5jZW50ZXIgPSBmdW5jdGlv bihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjZW50ZXIoXyksIHJlY2xpcCgp KSA6IGNlbnRlcigpOwogIH07CgogIG0uY2xpcEV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKChfID09IG51bGwgPyB4MCA9IHkwID0geDEgPSB5MSA9 IG51bGwgOiAoeDAgPSArX1swXVswXSwgeTAgPSArX1swXVsxXSwgeDEgPSArX1sxXVswXSwgeTEg PSArX1sxXVsxXSkpLCByZWNsaXAoKSkgOiB4MCA9PSBudWxsID8gbnVsbCA6IFtbeDAsIHkwXSwg W3gxLCB5MV1dOwogIH07CgogIGZ1bmN0aW9uIHJlY2xpcCgpIHsKICAgIHZhciBrID0gcGkkMyAq IHNjYWxlKCksCiAgICAgICAgdCA9IG0ocm90YXRpb24obS5yb3RhdGUoKSkuaW52ZXJ0KFswLCAw XSkpOwogICAgcmV0dXJuIGNsaXBFeHRlbnQoeDAgPT0gbnVsbAogICAgICAgID8gW1t0WzBdIC0g aywgdFsxXSAtIGtdLCBbdFswXSArIGssIHRbMV0gKyBrXV0gOiBwcm9qZWN0ID09PSBtZXJjYXRv clJhdwogICAgICAgID8gW1tNYXRoLm1heCh0WzBdIC0gaywgeDApLCB5MF0sIFtNYXRoLm1pbih0 WzBdICsgaywgeDEpLCB5MV1dCiAgICAgICAgOiBbW3gwLCBNYXRoLm1heCh0WzFdIC0gaywgeTAp XSwgW3gxLCBNYXRoLm1pbih0WzFdICsgaywgeTEpXV0pOwogIH0KCiAgcmV0dXJuIHJlY2xpcCgp Owp9CgpmdW5jdGlvbiB0YW55KHkpIHsKICByZXR1cm4gdGFuKChoYWxmUGkkMiArIHkpIC8gMik7 Cn0KCmZ1bmN0aW9uIGNvbmljQ29uZm9ybWFsUmF3KHkwLCB5MSkgewogIHZhciBjeTAgPSBjb3Mk MSh5MCksCiAgICAgIG4gPSB5MCA9PT0geTEgPyBzaW4kMSh5MCkgOiBsb2coY3kwIC8gY29zJDEo eTEpKSAvIGxvZyh0YW55KHkxKSAvIHRhbnkoeTApKSwKICAgICAgZiA9IGN5MCAqIHBvdyh0YW55 KHkwKSwgbikgLyBuOwoKICBpZiAoIW4pIHJldHVybiBtZXJjYXRvclJhdzsKCiAgZnVuY3Rpb24g cHJvamVjdCh4LCB5KSB7CiAgICBpZiAoZiA+IDApIHsgaWYgKHkgPCAtaGFsZlBpJDIgKyBlcHNp bG9uJDIpIHkgPSAtaGFsZlBpJDIgKyBlcHNpbG9uJDI7IH0KICAgIGVsc2UgeyBpZiAoeSA+IGhh bGZQaSQyIC0gZXBzaWxvbiQyKSB5ID0gaGFsZlBpJDIgLSBlcHNpbG9uJDI7IH0KICAgIHZhciBy ID0gZiAvIHBvdyh0YW55KHkpLCBuKTsKICAgIHJldHVybiBbciAqIHNpbiQxKG4gKiB4KSwgZiAt IHIgKiBjb3MkMShuICogeCldOwogIH0KCiAgcHJvamVjdC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5 KSB7CiAgICB2YXIgZnkgPSBmIC0geSwgciA9IHNpZ24obikgKiBzcXJ0KHggKiB4ICsgZnkgKiBm eSksCiAgICAgIGwgPSBhdGFuMih4LCBhYnMoZnkpKSAqIHNpZ24oZnkpOwogICAgaWYgKGZ5ICog biA8IDApCiAgICAgIGwgLT0gcGkkMyAqIHNpZ24oeCkgKiBzaWduKGZ5KTsKICAgIHJldHVybiBb bCAvIG4sIDIgKiBhdGFuKHBvdyhmIC8gciwgMSAvIG4pKSAtIGhhbGZQaSQyXTsKICB9OwoKICBy ZXR1cm4gcHJvamVjdDsKfQoKZnVuY3Rpb24gY29uaWNDb25mb3JtYWwoKSB7CiAgcmV0dXJuIGNv bmljUHJvamVjdGlvbihjb25pY0NvbmZvcm1hbFJhdykKICAgICAgLnNjYWxlKDEwOS41KQogICAg ICAucGFyYWxsZWxzKFszMCwgMzBdKTsKfQoKZnVuY3Rpb24gZXF1aXJlY3Rhbmd1bGFyUmF3KGxh bWJkYSwgcGhpKSB7CiAgcmV0dXJuIFtsYW1iZGEsIHBoaV07Cn0KCmVxdWlyZWN0YW5ndWxhclJh dy5pbnZlcnQgPSBlcXVpcmVjdGFuZ3VsYXJSYXc7CgpmdW5jdGlvbiBlcXVpcmVjdGFuZ3VsYXIo KSB7CiAgcmV0dXJuIHByb2plY3Rpb24oZXF1aXJlY3Rhbmd1bGFyUmF3KQogICAgICAuc2NhbGUo MTUyLjYzKTsKfQoKZnVuY3Rpb24gY29uaWNFcXVpZGlzdGFudFJhdyh5MCwgeTEpIHsKICB2YXIg Y3kwID0gY29zJDEoeTApLAogICAgICBuID0geTAgPT09IHkxID8gc2luJDEoeTApIDogKGN5MCAt IGNvcyQxKHkxKSkgLyAoeTEgLSB5MCksCiAgICAgIGcgPSBjeTAgLyBuICsgeTA7CgogIGlmIChh YnMobikgPCBlcHNpbG9uJDIpIHJldHVybiBlcXVpcmVjdGFuZ3VsYXJSYXc7CgogIGZ1bmN0aW9u IHByb2plY3QoeCwgeSkgewogICAgdmFyIGd5ID0gZyAtIHksIG54ID0gbiAqIHg7CiAgICByZXR1 cm4gW2d5ICogc2luJDEobngpLCBnIC0gZ3kgKiBjb3MkMShueCldOwogIH0KCiAgcHJvamVjdC5p bnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICB2YXIgZ3kgPSBnIC0geSwKICAgICAgICBsID0g YXRhbjIoeCwgYWJzKGd5KSkgKiBzaWduKGd5KTsKICAgIGlmIChneSAqIG4gPCAwKQogICAgICBs IC09IHBpJDMgKiBzaWduKHgpICogc2lnbihneSk7CiAgICByZXR1cm4gW2wgLyBuLCBnIC0gc2ln bihuKSAqIHNxcnQoeCAqIHggKyBneSAqIGd5KV07CiAgfTsKCiAgcmV0dXJuIHByb2plY3Q7Cn0K CmZ1bmN0aW9uIGNvbmljRXF1aWRpc3RhbnQoKSB7CiAgcmV0dXJuIGNvbmljUHJvamVjdGlvbihj b25pY0VxdWlkaXN0YW50UmF3KQogICAgICAuc2NhbGUoMTMxLjE1NCkKICAgICAgLmNlbnRlcihb MCwgMTMuOTM4OV0pOwp9Cgp2YXIgQTEgPSAxLjM0MDI2NCwKICAgIEEyID0gLTAuMDgxMTA2LAog ICAgQTMgPSAwLjAwMDg5MywKICAgIEE0ID0gMC4wMDM3OTYsCiAgICBNID0gc3FydCgzKSAvIDIs CiAgICBpdGVyYXRpb25zID0gMTI7CgpmdW5jdGlvbiBlcXVhbEVhcnRoUmF3KGxhbWJkYSwgcGhp KSB7CiAgdmFyIGwgPSBhc2luKE0gKiBzaW4kMShwaGkpKSwgbDIgPSBsICogbCwgbDYgPSBsMiAq IGwyICogbDI7CiAgcmV0dXJuIFsKICAgIGxhbWJkYSAqIGNvcyQxKGwpIC8gKE0gKiAoQTEgKyAz ICogQTIgKiBsMiArIGw2ICogKDcgKiBBMyArIDkgKiBBNCAqIGwyKSkpLAogICAgbCAqIChBMSAr IEEyICogbDIgKyBsNiAqIChBMyArIEE0ICogbDIpKQogIF07Cn0KCmVxdWFsRWFydGhSYXcuaW52 ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogIHZhciBsID0geSwgbDIgPSBsICogbCwgbDYgPSBsMiAq IGwyICogbDI7CiAgZm9yICh2YXIgaSA9IDAsIGRlbHRhLCBmeSwgZnB5OyBpIDwgaXRlcmF0aW9u czsgKytpKSB7CiAgICBmeSA9IGwgKiAoQTEgKyBBMiAqIGwyICsgbDYgKiAoQTMgKyBBNCAqIGwy KSkgLSB5OwogICAgZnB5ID0gQTEgKyAzICogQTIgKiBsMiArIGw2ICogKDcgKiBBMyArIDkgKiBB NCAqIGwyKTsKICAgIGwgLT0gZGVsdGEgPSBmeSAvIGZweSwgbDIgPSBsICogbCwgbDYgPSBsMiAq IGwyICogbDI7CiAgICBpZiAoYWJzKGRlbHRhKSA8IGVwc2lsb24yJDEpIGJyZWFrOwogIH0KICBy ZXR1cm4gWwogICAgTSAqIHggKiAoQTEgKyAzICogQTIgKiBsMiArIGw2ICogKDcgKiBBMyArIDkg KiBBNCAqIGwyKSkgLyBjb3MkMShsKSwKICAgIGFzaW4oc2luJDEobCkgLyBNKQogIF07Cn07Cgpm dW5jdGlvbiBlcXVhbEVhcnRoKCkgewogIHJldHVybiBwcm9qZWN0aW9uKGVxdWFsRWFydGhSYXcp CiAgICAgIC5zY2FsZSgxNzcuMTU4KTsKfQoKZnVuY3Rpb24gZ25vbW9uaWNSYXcoeCwgeSkgewog IHZhciBjeSA9IGNvcyQxKHkpLCBrID0gY29zJDEoeCkgKiBjeTsKICByZXR1cm4gW2N5ICogc2lu JDEoeCkgLyBrLCBzaW4kMSh5KSAvIGtdOwp9Cgpnbm9tb25pY1Jhdy5pbnZlcnQgPSBhemltdXRo YWxJbnZlcnQoYXRhbik7CgpmdW5jdGlvbiBnbm9tb25pYygpIHsKICByZXR1cm4gcHJvamVjdGlv bihnbm9tb25pY1JhdykKICAgICAgLnNjYWxlKDE0NC4wNDkpCiAgICAgIC5jbGlwQW5nbGUoNjAp Owp9CgpmdW5jdGlvbiBpZGVudGl0eSQ1KCkgewogIHZhciBrID0gMSwgdHggPSAwLCB0eSA9IDAs IHN4ID0gMSwgc3kgPSAxLCAvLyBzY2FsZSwgdHJhbnNsYXRlIGFuZCByZWZsZWN0CiAgICAgIGFs cGhhID0gMCwgY2EsIHNhLCAvLyBhbmdsZQogICAgICB4MCA9IG51bGwsIHkwLCB4MSwgeTEsIC8v IGNsaXAgZXh0ZW50CiAgICAgIGt4ID0gMSwga3kgPSAxLAogICAgICB0cmFuc2Zvcm0gPSB0cmFu c2Zvcm1lcih7CiAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICAgIHZhciBw ID0gcHJvamVjdGlvbihbeCwgeV0pOwogICAgICAgICAgdGhpcy5zdHJlYW0ucG9pbnQocFswXSwg cFsxXSk7CiAgICAgICAgfQogICAgICB9KSwKICAgICAgcG9zdGNsaXAgPSBpZGVudGl0eSQ0LAog ICAgICBjYWNoZSwKICAgICAgY2FjaGVTdHJlYW07CgogIGZ1bmN0aW9uIHJlc2V0KCkgewogICAg a3ggPSBrICogc3g7CiAgICBreSA9IGsgKiBzeTsKICAgIGNhY2hlID0gY2FjaGVTdHJlYW0gPSBu dWxsOwogICAgcmV0dXJuIHByb2plY3Rpb247CiAgfQoKICBmdW5jdGlvbiBwcm9qZWN0aW9uIChw KSB7CiAgICB2YXIgeCA9IHBbMF0gKiBreCwgeSA9IHBbMV0gKiBreTsKICAgIGlmIChhbHBoYSkg ewogICAgICB2YXIgdCA9IHkgKiBjYSAtIHggKiBzYTsKICAgICAgeCA9IHggKiBjYSArIHkgKiBz YTsKICAgICAgeSA9IHQ7CiAgICB9ICAgIAogICAgcmV0dXJuIFt4ICsgdHgsIHkgKyB0eV07CiAg fQogIHByb2plY3Rpb24uaW52ZXJ0ID0gZnVuY3Rpb24ocCkgewogICAgdmFyIHggPSBwWzBdIC0g dHgsIHkgPSBwWzFdIC0gdHk7CiAgICBpZiAoYWxwaGEpIHsKICAgICAgdmFyIHQgPSB5ICogY2Eg KyB4ICogc2E7CiAgICAgIHggPSB4ICogY2EgLSB5ICogc2E7CiAgICAgIHkgPSB0OwogICAgfQog ICAgcmV0dXJuIFt4IC8ga3gsIHkgLyBreV07CiAgfTsKICBwcm9qZWN0aW9uLnN0cmVhbSA9IGZ1 bmN0aW9uKHN0cmVhbSkgewogICAgcmV0dXJuIGNhY2hlICYmIGNhY2hlU3RyZWFtID09PSBzdHJl YW0gPyBjYWNoZSA6IGNhY2hlID0gdHJhbnNmb3JtKHBvc3RjbGlwKGNhY2hlU3RyZWFtID0gc3Ry ZWFtKSk7CiAgfTsKICBwcm9qZWN0aW9uLnBvc3RjbGlwID0gZnVuY3Rpb24oXykgewogICAgcmV0 dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNsaXAgPSBfLCB4MCA9IHkwID0geDEgPSB5MSA9 IG51bGwsIHJlc2V0KCkpIDogcG9zdGNsaXA7CiAgfTsKICBwcm9qZWN0aW9uLmNsaXBFeHRlbnQg PSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb3N0Y2xpcCA9 IF8gPT0gbnVsbCA/ICh4MCA9IHkwID0geDEgPSB5MSA9IG51bGwsIGlkZW50aXR5JDQpIDogY2xp cFJlY3RhbmdsZSh4MCA9ICtfWzBdWzBdLCB5MCA9ICtfWzBdWzFdLCB4MSA9ICtfWzFdWzBdLCB5 MSA9ICtfWzFdWzFdKSwgcmVzZXQoKSkgOiB4MCA9PSBudWxsID8gbnVsbCA6IFtbeDAsIHkwXSwg W3gxLCB5MV1dOwogIH07CiAgcHJvamVjdGlvbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGsgPSArXywgcmVzZXQoKSkgOiBrOwogIH07CiAgcHJv amVjdGlvbi50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/ICh0eCA9ICtfWzBdLCB0eSA9ICtfWzFdLCByZXNldCgpKSA6IFt0eCwgdHldOwogIH07 CiAgcHJvamVjdGlvbi5hbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMu bGVuZ3RoID8gKGFscGhhID0gXyAlIDM2MCAqIHJhZGlhbnMsIHNhID0gc2luJDEoYWxwaGEpLCBj YSA9IGNvcyQxKGFscGhhKSwgcmVzZXQoKSkgOiBhbHBoYSAqIGRlZ3JlZXMkMTsKICB9OwogIHBy b2plY3Rpb24ucmVmbGVjdFggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/IChzeCA9IF8gPyAtMSA6IDEsIHJlc2V0KCkpIDogc3ggPCAwOwogIH07CiAgcHJvamVj dGlvbi5yZWZsZWN0WSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3Ro ID8gKHN5ID0gXyA/IC0xIDogMSwgcmVzZXQoKSkgOiBzeSA8IDA7CiAgfTsKICBwcm9qZWN0aW9u LmZpdEV4dGVudCA9IGZ1bmN0aW9uKGV4dGVudCwgb2JqZWN0KSB7CiAgICByZXR1cm4gZml0RXh0 ZW50KHByb2plY3Rpb24sIGV4dGVudCwgb2JqZWN0KTsKICB9OwogIHByb2plY3Rpb24uZml0U2l6 ZSA9IGZ1bmN0aW9uKHNpemUsIG9iamVjdCkgewogICAgcmV0dXJuIGZpdFNpemUocHJvamVjdGlv biwgc2l6ZSwgb2JqZWN0KTsKICB9OwogIHByb2plY3Rpb24uZml0V2lkdGggPSBmdW5jdGlvbih3 aWR0aCwgb2JqZWN0KSB7CiAgICByZXR1cm4gZml0V2lkdGgocHJvamVjdGlvbiwgd2lkdGgsIG9i amVjdCk7CiAgfTsKICBwcm9qZWN0aW9uLmZpdEhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCwgb2Jq ZWN0KSB7CiAgICByZXR1cm4gZml0SGVpZ2h0KHByb2plY3Rpb24sIGhlaWdodCwgb2JqZWN0KTsK ICB9OwoKICByZXR1cm4gcHJvamVjdGlvbjsKfQoKZnVuY3Rpb24gbmF0dXJhbEVhcnRoMVJhdyhs YW1iZGEsIHBoaSkgewogIHZhciBwaGkyID0gcGhpICogcGhpLCBwaGk0ID0gcGhpMiAqIHBoaTI7 CiAgcmV0dXJuIFsKICAgIGxhbWJkYSAqICgwLjg3MDcgLSAwLjEzMTk3OSAqIHBoaTIgKyBwaGk0 ICogKC0wLjAxMzc5MSArIHBoaTQgKiAoMC4wMDM5NzEgKiBwaGkyIC0gMC4wMDE1MjkgKiBwaGk0 KSkpLAogICAgcGhpICogKDEuMDA3MjI2ICsgcGhpMiAqICgwLjAxNTA4NSArIHBoaTQgKiAoLTAu MDQ0NDc1ICsgMC4wMjg4NzQgKiBwaGkyIC0gMC4wMDU5MTYgKiBwaGk0KSkpCiAgXTsKfQoKbmF0 dXJhbEVhcnRoMVJhdy5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgdmFyIHBoaSA9IHksIGkg PSAyNSwgZGVsdGE7CiAgZG8gewogICAgdmFyIHBoaTIgPSBwaGkgKiBwaGksIHBoaTQgPSBwaGky ICogcGhpMjsKICAgIHBoaSAtPSBkZWx0YSA9IChwaGkgKiAoMS4wMDcyMjYgKyBwaGkyICogKDAu MDE1MDg1ICsgcGhpNCAqICgtMC4wNDQ0NzUgKyAwLjAyODg3NCAqIHBoaTIgLSAwLjAwNTkxNiAq IHBoaTQpKSkgLSB5KSAvCiAgICAgICAgKDEuMDA3MjI2ICsgcGhpMiAqICgwLjAxNTA4NSAqIDMg KyBwaGk0ICogKC0wLjA0NDQ3NSAqIDcgKyAwLjAyODg3NCAqIDkgKiBwaGkyIC0gMC4wMDU5MTYg KiAxMSAqIHBoaTQpKSk7CiAgfSB3aGlsZSAoYWJzKGRlbHRhKSA+IGVwc2lsb24kMiAmJiAtLWkg PiAwKTsKICByZXR1cm4gWwogICAgeCAvICgwLjg3MDcgKyAocGhpMiA9IHBoaSAqIHBoaSkgKiAo LTAuMTMxOTc5ICsgcGhpMiAqICgtMC4wMTM3OTEgKyBwaGkyICogcGhpMiAqIHBoaTIgKiAoMC4w MDM5NzEgLSAwLjAwMTUyOSAqIHBoaTIpKSkpLAogICAgcGhpCiAgXTsKfTsKCmZ1bmN0aW9uIG5h dHVyYWxFYXJ0aDEoKSB7CiAgcmV0dXJuIHByb2plY3Rpb24obmF0dXJhbEVhcnRoMVJhdykKICAg ICAgLnNjYWxlKDE3NS4yOTUpOwp9CgpmdW5jdGlvbiBvcnRob2dyYXBoaWNSYXcoeCwgeSkgewog IHJldHVybiBbY29zJDEoeSkgKiBzaW4kMSh4KSwgc2luJDEoeSldOwp9CgpvcnRob2dyYXBoaWNS YXcuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0KGFzaW4pOwoKZnVuY3Rpb24gb3J0aG9ncmFwaGlj KCkgewogIHJldHVybiBwcm9qZWN0aW9uKG9ydGhvZ3JhcGhpY1JhdykKICAgICAgLnNjYWxlKDI0 OS41KQogICAgICAuY2xpcEFuZ2xlKDkwICsgZXBzaWxvbiQyKTsKfQoKZnVuY3Rpb24gc3RlcmVv Z3JhcGhpY1Jhdyh4LCB5KSB7CiAgdmFyIGN5ID0gY29zJDEoeSksIGsgPSAxICsgY29zJDEoeCkg KiBjeTsKICByZXR1cm4gW2N5ICogc2luJDEoeCkgLyBrLCBzaW4kMSh5KSAvIGtdOwp9CgpzdGVy ZW9ncmFwaGljUmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChmdW5jdGlvbih6KSB7CiAgcmV0 dXJuIDIgKiBhdGFuKHopOwp9KTsKCmZ1bmN0aW9uIHN0ZXJlb2dyYXBoaWMoKSB7CiAgcmV0dXJu IHByb2plY3Rpb24oc3RlcmVvZ3JhcGhpY1JhdykKICAgICAgLnNjYWxlKDI1MCkKICAgICAgLmNs aXBBbmdsZSgxNDIpOwp9CgpmdW5jdGlvbiB0cmFuc3ZlcnNlTWVyY2F0b3JSYXcobGFtYmRhLCBw aGkpIHsKICByZXR1cm4gW2xvZyh0YW4oKGhhbGZQaSQyICsgcGhpKSAvIDIpKSwgLWxhbWJkYV07 Cn0KCnRyYW5zdmVyc2VNZXJjYXRvclJhdy5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgcmV0 dXJuIFsteSwgMiAqIGF0YW4oZXhwKHgpKSAtIGhhbGZQaSQyXTsKfTsKCmZ1bmN0aW9uIHRyYW5z dmVyc2VNZXJjYXRvcigpIHsKICB2YXIgbSA9IG1lcmNhdG9yUHJvamVjdGlvbih0cmFuc3ZlcnNl TWVyY2F0b3JSYXcpLAogICAgICBjZW50ZXIgPSBtLmNlbnRlciwKICAgICAgcm90YXRlID0gbS5y b3RhdGU7CgogIG0uY2VudGVyID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5s ZW5ndGggPyBjZW50ZXIoWy1fWzFdLCBfWzBdXSkgOiAoXyA9IGNlbnRlcigpLCBbX1sxXSwgLV9b MF1dKTsKICB9OwoKICBtLnJvdGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID8gcm90YXRlKFtfWzBdLCBfWzFdLCBfLmxlbmd0aCA+IDIgPyBfWzJdICsgOTAg OiA5MF0pIDogKF8gPSByb3RhdGUoKSwgW19bMF0sIF9bMV0sIF9bMl0gLSA5MF0pOwogIH07Cgog IHJldHVybiByb3RhdGUoWzAsIDAsIDkwXSkKICAgICAgLnNjYWxlKDE1OS4xNTUpOwp9CgpmdW5j dGlvbiBkZWZhdWx0U2VwYXJhdGlvbihhLCBiKSB7CiAgcmV0dXJuIGEucGFyZW50ID09PSBiLnBh cmVudCA/IDEgOiAyOwp9CgpmdW5jdGlvbiBtZWFuWChjaGlsZHJlbikgewogIHJldHVybiBjaGls ZHJlbi5yZWR1Y2UobWVhblhSZWR1Y2UsIDApIC8gY2hpbGRyZW4ubGVuZ3RoOwp9CgpmdW5jdGlv biBtZWFuWFJlZHVjZSh4LCBjKSB7CiAgcmV0dXJuIHggKyBjLng7Cn0KCmZ1bmN0aW9uIG1heFko Y2hpbGRyZW4pIHsKICByZXR1cm4gMSArIGNoaWxkcmVuLnJlZHVjZShtYXhZUmVkdWNlLCAwKTsK fQoKZnVuY3Rpb24gbWF4WVJlZHVjZSh5LCBjKSB7CiAgcmV0dXJuIE1hdGgubWF4KHksIGMueSk7 Cn0KCmZ1bmN0aW9uIGxlYWZMZWZ0KG5vZGUpIHsKICB2YXIgY2hpbGRyZW47CiAgd2hpbGUgKGNo aWxkcmVuID0gbm9kZS5jaGlsZHJlbikgbm9kZSA9IGNoaWxkcmVuWzBdOwogIHJldHVybiBub2Rl Owp9CgpmdW5jdGlvbiBsZWFmUmlnaHQobm9kZSkgewogIHZhciBjaGlsZHJlbjsKICB3aGlsZSAo Y2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSBub2RlID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3Ro IC0gMV07CiAgcmV0dXJuIG5vZGU7Cn0KCmZ1bmN0aW9uIGNsdXN0ZXIoKSB7CiAgdmFyIHNlcGFy YXRpb24gPSBkZWZhdWx0U2VwYXJhdGlvbiwKICAgICAgZHggPSAxLAogICAgICBkeSA9IDEsCiAg ICAgIG5vZGVTaXplID0gZmFsc2U7CgogIGZ1bmN0aW9uIGNsdXN0ZXIocm9vdCkgewogICAgdmFy IHByZXZpb3VzTm9kZSwKICAgICAgICB4ID0gMDsKCiAgICAvLyBGaXJzdCB3YWxrLCBjb21wdXRp bmcgdGhlIGluaXRpYWwgeCAmIHkgdmFsdWVzLgogICAgcm9vdC5lYWNoQWZ0ZXIoZnVuY3Rpb24o bm9kZSkgewogICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICBpZiAoY2hp bGRyZW4pIHsKICAgICAgICBub2RlLnggPSBtZWFuWChjaGlsZHJlbik7CiAgICAgICAgbm9kZS55 ID0gbWF4WShjaGlsZHJlbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS54ID0gcHJldmlv dXNOb2RlID8geCArPSBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzTm9kZSkgOiAwOwogICAgICAg IG5vZGUueSA9IDA7CiAgICAgICAgcHJldmlvdXNOb2RlID0gbm9kZTsKICAgICAgfQogICAgfSk7 CgogICAgdmFyIGxlZnQgPSBsZWFmTGVmdChyb290KSwKICAgICAgICByaWdodCA9IGxlYWZSaWdo dChyb290KSwKICAgICAgICB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8g MiwKICAgICAgICB4MSA9IHJpZ2h0LnggKyBzZXBhcmF0aW9uKHJpZ2h0LCBsZWZ0KSAvIDI7Cgog ICAgLy8gU2Vjb25kIHdhbGssIG5vcm1hbGl6aW5nIHggJiB5IHRvIHRoZSBkZXNpcmVkIHNpemUu CiAgICByZXR1cm4gcm9vdC5lYWNoQWZ0ZXIobm9kZVNpemUgPyBmdW5jdGlvbihub2RlKSB7CiAg ICAgIG5vZGUueCA9IChub2RlLnggLSByb290LngpICogZHg7CiAgICAgIG5vZGUueSA9IChyb290 LnkgLSBub2RlLnkpICogZHk7CiAgICB9IDogZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLngg PSAobm9kZS54IC0geDApIC8gKHgxIC0geDApICogZHg7CiAgICAgIG5vZGUueSA9ICgxIC0gKHJv b3QueSA/IG5vZGUueSAvIHJvb3QueSA6IDEpKSAqIGR5OwogICAgfSk7CiAgfQoKICBjbHVzdGVy LnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ IChzZXBhcmF0aW9uID0geCwgY2x1c3RlcikgOiBzZXBhcmF0aW9uOwogIH07CgogIGNsdXN0ZXIu c2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVT aXplID0gZmFsc2UsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIGNsdXN0ZXIpIDogKG5vZGVTaXpl ID8gbnVsbCA6IFtkeCwgZHldKTsKICB9OwoKICBjbHVzdGVyLm5vZGVTaXplID0gZnVuY3Rpb24o eCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSB0cnVlLCBkeCA9 ICt4WzBdLCBkeSA9ICt4WzFdLCBjbHVzdGVyKSA6IChub2RlU2l6ZSA/IFtkeCwgZHldIDogbnVs bCk7CiAgfTsKCiAgcmV0dXJuIGNsdXN0ZXI7Cn0KCmZ1bmN0aW9uIGNvdW50KG5vZGUpIHsKICB2 YXIgc3VtID0gMCwKICAgICAgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLAogICAgICBpID0gY2hp bGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoOwogIGlmICghaSkgc3VtID0gMTsKICBlbHNlIHdoaWxl ICgtLWkgPj0gMCkgc3VtICs9IGNoaWxkcmVuW2ldLnZhbHVlOwogIG5vZGUudmFsdWUgPSBzdW07 Cn0KCmZ1bmN0aW9uIG5vZGVfY291bnQoKSB7CiAgcmV0dXJuIHRoaXMuZWFjaEFmdGVyKGNvdW50 KTsKfQoKZnVuY3Rpb24gbm9kZV9lYWNoKGNhbGxiYWNrKSB7CiAgdmFyIG5vZGUgPSB0aGlzLCBj dXJyZW50LCBuZXh0ID0gW25vZGVdLCBjaGlsZHJlbiwgaSwgbjsKICBkbyB7CiAgICBjdXJyZW50 ID0gbmV4dC5yZXZlcnNlKCksIG5leHQgPSBbXTsKICAgIHdoaWxlIChub2RlID0gY3VycmVudC5w b3AoKSkgewogICAgICBjYWxsYmFjayhub2RlKSwgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwog ICAgICBpZiAoY2hpbGRyZW4pIGZvciAoaSA9IDAsIG4gPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBu OyArK2kpIHsKICAgICAgICBuZXh0LnB1c2goY2hpbGRyZW5baV0pOwogICAgICB9CiAgICB9CiAg fSB3aGlsZSAobmV4dC5sZW5ndGgpOwogIHJldHVybiB0aGlzOwp9CgpmdW5jdGlvbiBub2RlX2Vh Y2hCZWZvcmUoY2FsbGJhY2spIHsKICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdLCBj aGlsZHJlbiwgaTsKICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7CiAgICBjYWxsYmFjayhu b2RlKSwgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkg PSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICBub2Rlcy5wdXNoKGNo aWxkcmVuW2ldKTsKICAgIH0KICB9CiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0aW9uIG5vZGVfZWFj aEFmdGVyKGNhbGxiYWNrKSB7CiAgdmFyIG5vZGUgPSB0aGlzLCBub2RlcyA9IFtub2RlXSwgbmV4 dCA9IFtdLCBjaGlsZHJlbiwgaSwgbjsKICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7CiAg ICBuZXh0LnB1c2gobm9kZSksIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgIGlmIChjaGls ZHJlbikgZm9yIChpID0gMCwgbiA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAg ICBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTsKICAgIH0KICB9CiAgd2hpbGUgKG5vZGUgPSBuZXh0 LnBvcCgpKSB7CiAgICBjYWxsYmFjayhub2RlKTsKICB9CiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0 aW9uIG5vZGVfc3VtKHZhbHVlKSB7CiAgcmV0dXJuIHRoaXMuZWFjaEFmdGVyKGZ1bmN0aW9uKG5v ZGUpIHsKICAgIHZhciBzdW0gPSArdmFsdWUobm9kZS5kYXRhKSB8fCAwLAogICAgICAgIGNoaWxk cmVuID0gbm9kZS5jaGlsZHJlbiwKICAgICAgICBpID0gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVu Z3RoOwogICAgd2hpbGUgKC0taSA+PSAwKSBzdW0gKz0gY2hpbGRyZW5baV0udmFsdWU7CiAgICBu b2RlLnZhbHVlID0gc3VtOwogIH0pOwp9CgpmdW5jdGlvbiBub2RlX3NvcnQoY29tcGFyZSkgewog IHJldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgewogICAgaWYgKG5vZGUuY2hp bGRyZW4pIHsKICAgICAgbm9kZS5jaGlsZHJlbi5zb3J0KGNvbXBhcmUpOwogICAgfQogIH0pOwp9 CgpmdW5jdGlvbiBub2RlX3BhdGgoZW5kKSB7CiAgdmFyIHN0YXJ0ID0gdGhpcywKICAgICAgYW5j ZXN0b3IgPSBsZWFzdENvbW1vbkFuY2VzdG9yKHN0YXJ0LCBlbmQpLAogICAgICBub2RlcyA9IFtz dGFydF07CiAgd2hpbGUgKHN0YXJ0ICE9PSBhbmNlc3RvcikgewogICAgc3RhcnQgPSBzdGFydC5w YXJlbnQ7CiAgICBub2Rlcy5wdXNoKHN0YXJ0KTsKICB9CiAgdmFyIGsgPSBub2Rlcy5sZW5ndGg7 CiAgd2hpbGUgKGVuZCAhPT0gYW5jZXN0b3IpIHsKICAgIG5vZGVzLnNwbGljZShrLCAwLCBlbmQp OwogICAgZW5kID0gZW5kLnBhcmVudDsKICB9CiAgcmV0dXJuIG5vZGVzOwp9CgpmdW5jdGlvbiBs ZWFzdENvbW1vbkFuY2VzdG9yKGEsIGIpIHsKICBpZiAoYSA9PT0gYikgcmV0dXJuIGE7CiAgdmFy IGFOb2RlcyA9IGEuYW5jZXN0b3JzKCksCiAgICAgIGJOb2RlcyA9IGIuYW5jZXN0b3JzKCksCiAg ICAgIGMgPSBudWxsOwogIGEgPSBhTm9kZXMucG9wKCk7CiAgYiA9IGJOb2Rlcy5wb3AoKTsKICB3 aGlsZSAoYSA9PT0gYikgewogICAgYyA9IGE7CiAgICBhID0gYU5vZGVzLnBvcCgpOwogICAgYiA9 IGJOb2Rlcy5wb3AoKTsKICB9CiAgcmV0dXJuIGM7Cn0KCmZ1bmN0aW9uIG5vZGVfYW5jZXN0b3Jz KCkgewogIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV07CiAgd2hpbGUgKG5vZGUgPSBu b2RlLnBhcmVudCkgewogICAgbm9kZXMucHVzaChub2RlKTsKICB9CiAgcmV0dXJuIG5vZGVzOwp9 CgpmdW5jdGlvbiBub2RlX2Rlc2NlbmRhbnRzKCkgewogIHZhciBub2RlcyA9IFtdOwogIHRoaXMu ZWFjaChmdW5jdGlvbihub2RlKSB7CiAgICBub2Rlcy5wdXNoKG5vZGUpOwogIH0pOwogIHJldHVy biBub2RlczsKfQoKZnVuY3Rpb24gbm9kZV9sZWF2ZXMoKSB7CiAgdmFyIGxlYXZlcyA9IFtdOwog IHRoaXMuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7CiAgICBpZiAoIW5vZGUuY2hpbGRyZW4p IHsKICAgICAgbGVhdmVzLnB1c2gobm9kZSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIGxlYXZlczsK fQoKZnVuY3Rpb24gbm9kZV9saW5rcygpIHsKICB2YXIgcm9vdCA9IHRoaXMsIGxpbmtzID0gW107 CiAgcm9vdC5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsKICAgIGlmIChub2RlICE9PSByb290KSB7IC8v IERvbuKAmXQgaW5jbHVkZSB0aGUgcm9vdOKAmXMgcGFyZW50LCBpZiBhbnkuCiAgICAgIGxpbmtz LnB1c2goe3NvdXJjZTogbm9kZS5wYXJlbnQsIHRhcmdldDogbm9kZX0pOwogICAgfQogIH0pOwog IHJldHVybiBsaW5rczsKfQoKZnVuY3Rpb24gaGllcmFyY2h5KGRhdGEsIGNoaWxkcmVuKSB7CiAg dmFyIHJvb3QgPSBuZXcgTm9kZShkYXRhKSwKICAgICAgdmFsdWVkID0gK2RhdGEudmFsdWUgJiYg KHJvb3QudmFsdWUgPSBkYXRhLnZhbHVlKSwKICAgICAgbm9kZSwKICAgICAgbm9kZXMgPSBbcm9v dF0sCiAgICAgIGNoaWxkLAogICAgICBjaGlsZHMsCiAgICAgIGksCiAgICAgIG47CgogIGlmIChj aGlsZHJlbiA9PSBudWxsKSBjaGlsZHJlbiA9IGRlZmF1bHRDaGlsZHJlbjsKCiAgd2hpbGUgKG5v ZGUgPSBub2Rlcy5wb3AoKSkgewogICAgaWYgKHZhbHVlZCkgbm9kZS52YWx1ZSA9ICtub2RlLmRh dGEudmFsdWU7CiAgICBpZiAoKGNoaWxkcyA9IGNoaWxkcmVuKG5vZGUuZGF0YSkpICYmIChuID0g Y2hpbGRzLmxlbmd0aCkpIHsKICAgICAgbm9kZS5jaGlsZHJlbiA9IG5ldyBBcnJheShuKTsKICAg ICAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgbm9kZXMucHVzaChjaGls ZCA9IG5vZGUuY2hpbGRyZW5baV0gPSBuZXcgTm9kZShjaGlsZHNbaV0pKTsKICAgICAgICBjaGls ZC5wYXJlbnQgPSBub2RlOwogICAgICAgIGNoaWxkLmRlcHRoID0gbm9kZS5kZXB0aCArIDE7CiAg ICAgIH0KICAgIH0KICB9CgogIHJldHVybiByb290LmVhY2hCZWZvcmUoY29tcHV0ZUhlaWdodCk7 Cn0KCmZ1bmN0aW9uIG5vZGVfY29weSgpIHsKICByZXR1cm4gaGllcmFyY2h5KHRoaXMpLmVhY2hC ZWZvcmUoY29weURhdGEpOwp9CgpmdW5jdGlvbiBkZWZhdWx0Q2hpbGRyZW4oZCkgewogIHJldHVy biBkLmNoaWxkcmVuOwp9CgpmdW5jdGlvbiBjb3B5RGF0YShub2RlKSB7CiAgbm9kZS5kYXRhID0g bm9kZS5kYXRhLmRhdGE7Cn0KCmZ1bmN0aW9uIGNvbXB1dGVIZWlnaHQobm9kZSkgewogIHZhciBo ZWlnaHQgPSAwOwogIGRvIG5vZGUuaGVpZ2h0ID0gaGVpZ2h0OwogIHdoaWxlICgobm9kZSA9IG5v ZGUucGFyZW50KSAmJiAobm9kZS5oZWlnaHQgPCArK2hlaWdodCkpOwp9CgpmdW5jdGlvbiBOb2Rl KGRhdGEpIHsKICB0aGlzLmRhdGEgPSBkYXRhOwogIHRoaXMuZGVwdGggPQogIHRoaXMuaGVpZ2h0 ID0gMDsKICB0aGlzLnBhcmVudCA9IG51bGw7Cn0KCk5vZGUucHJvdG90eXBlID0gaGllcmFyY2h5 LnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogTm9kZSwKICBjb3VudDogbm9kZV9jb3VudCwK ICBlYWNoOiBub2RlX2VhY2gsCiAgZWFjaEFmdGVyOiBub2RlX2VhY2hBZnRlciwKICBlYWNoQmVm b3JlOiBub2RlX2VhY2hCZWZvcmUsCiAgc3VtOiBub2RlX3N1bSwKICBzb3J0OiBub2RlX3NvcnQs CiAgcGF0aDogbm9kZV9wYXRoLAogIGFuY2VzdG9yczogbm9kZV9hbmNlc3RvcnMsCiAgZGVzY2Vu ZGFudHM6IG5vZGVfZGVzY2VuZGFudHMsCiAgbGVhdmVzOiBub2RlX2xlYXZlcywKICBsaW5rczog bm9kZV9saW5rcywKICBjb3B5OiBub2RlX2NvcHkKfTsKCnZhciBzbGljZSQ0ID0gQXJyYXkucHJv dG90eXBlLnNsaWNlOwoKZnVuY3Rpb24gc2h1ZmZsZSQxKGFycmF5KSB7CiAgdmFyIG0gPSBhcnJh eS5sZW5ndGgsCiAgICAgIHQsCiAgICAgIGk7CgogIHdoaWxlIChtKSB7CiAgICBpID0gTWF0aC5y YW5kb20oKSAqIG0tLSB8IDA7CiAgICB0ID0gYXJyYXlbbV07CiAgICBhcnJheVttXSA9IGFycmF5 W2ldOwogICAgYXJyYXlbaV0gPSB0OwogIH0KCiAgcmV0dXJuIGFycmF5Owp9CgpmdW5jdGlvbiBl bmNsb3NlKGNpcmNsZXMpIHsKICB2YXIgaSA9IDAsIG4gPSAoY2lyY2xlcyA9IHNodWZmbGUkMShz bGljZSQ0LmNhbGwoY2lyY2xlcykpKS5sZW5ndGgsIEIgPSBbXSwgcCwgZTsKCiAgd2hpbGUgKGkg PCBuKSB7CiAgICBwID0gY2lyY2xlc1tpXTsKICAgIGlmIChlICYmIGVuY2xvc2VzV2VhayhlLCBw KSkgKytpOwogICAgZWxzZSBlID0gZW5jbG9zZUJhc2lzKEIgPSBleHRlbmRCYXNpcyhCLCBwKSks IGkgPSAwOwogIH0KCiAgcmV0dXJuIGU7Cn0KCmZ1bmN0aW9uIGV4dGVuZEJhc2lzKEIsIHApIHsK ICB2YXIgaSwgajsKCiAgaWYgKGVuY2xvc2VzV2Vha0FsbChwLCBCKSkgcmV0dXJuIFtwXTsKCiAg Ly8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBCIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudC4K ICBmb3IgKGkgPSAwOyBpIDwgQi5sZW5ndGg7ICsraSkgewogICAgaWYgKGVuY2xvc2VzTm90KHAs IEJbaV0pCiAgICAgICAgJiYgZW5jbG9zZXNXZWFrQWxsKGVuY2xvc2VCYXNpczIoQltpXSwgcCks IEIpKSB7CiAgICAgIHJldHVybiBbQltpXSwgcF07CiAgICB9CiAgfQoKICAvLyBJZiB3ZSBnZXQg aGVyZSB0aGVuIEIgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBlbGVtZW50cy4KICBmb3IgKGkgPSAw OyBpIDwgQi5sZW5ndGggLSAxOyArK2kpIHsKICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgQi5sZW5n dGg7ICsraikgewogICAgICBpZiAoZW5jbG9zZXNOb3QoZW5jbG9zZUJhc2lzMihCW2ldLCBCW2pd KSwgcCkKICAgICAgICAgICYmIGVuY2xvc2VzTm90KGVuY2xvc2VCYXNpczIoQltpXSwgcCksIEJb al0pCiAgICAgICAgICAmJiBlbmNsb3Nlc05vdChlbmNsb3NlQmFzaXMyKEJbal0sIHApLCBCW2ld KQogICAgICAgICAgJiYgZW5jbG9zZXNXZWFrQWxsKGVuY2xvc2VCYXNpczMoQltpXSwgQltqXSwg cCksIEIpKSB7CiAgICAgICAgcmV0dXJuIFtCW2ldLCBCW2pdLCBwXTsKICAgICAgfQogICAgfQog IH0KCiAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4KICB0 aHJvdyBuZXcgRXJyb3I7Cn0KCmZ1bmN0aW9uIGVuY2xvc2VzTm90KGEsIGIpIHsKICB2YXIgZHIg PSBhLnIgLSBiLnIsIGR4ID0gYi54IC0gYS54LCBkeSA9IGIueSAtIGEueTsKICByZXR1cm4gZHIg PCAwIHx8IGRyICogZHIgPCBkeCAqIGR4ICsgZHkgKiBkeTsKfQoKZnVuY3Rpb24gZW5jbG9zZXNX ZWFrKGEsIGIpIHsKICB2YXIgZHIgPSBhLnIgLSBiLnIgKyAxZS02LCBkeCA9IGIueCAtIGEueCwg ZHkgPSBiLnkgLSBhLnk7CiAgcmV0dXJuIGRyID4gMCAmJiBkciAqIGRyID4gZHggKiBkeCArIGR5 ICogZHk7Cn0KCmZ1bmN0aW9uIGVuY2xvc2VzV2Vha0FsbChhLCBCKSB7CiAgZm9yICh2YXIgaSA9 IDA7IGkgPCBCLmxlbmd0aDsgKytpKSB7CiAgICBpZiAoIWVuY2xvc2VzV2VhayhhLCBCW2ldKSkg ewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9CgpmdW5jdGlv biBlbmNsb3NlQmFzaXMoQikgewogIHN3aXRjaCAoQi5sZW5ndGgpIHsKICAgIGNhc2UgMTogcmV0 dXJuIGVuY2xvc2VCYXNpczEoQlswXSk7CiAgICBjYXNlIDI6IHJldHVybiBlbmNsb3NlQmFzaXMy KEJbMF0sIEJbMV0pOwogICAgY2FzZSAzOiByZXR1cm4gZW5jbG9zZUJhc2lzMyhCWzBdLCBCWzFd LCBCWzJdKTsKICB9Cn0KCmZ1bmN0aW9uIGVuY2xvc2VCYXNpczEoYSkgewogIHJldHVybiB7CiAg ICB4OiBhLngsCiAgICB5OiBhLnksCiAgICByOiBhLnIKICB9Owp9CgpmdW5jdGlvbiBlbmNsb3Nl QmFzaXMyKGEsIGIpIHsKICB2YXIgeDEgPSBhLngsIHkxID0gYS55LCByMSA9IGEuciwKICAgICAg eDIgPSBiLngsIHkyID0gYi55LCByMiA9IGIuciwKICAgICAgeDIxID0geDIgLSB4MSwgeTIxID0g eTIgLSB5MSwgcjIxID0gcjIgLSByMSwKICAgICAgbCA9IE1hdGguc3FydCh4MjEgKiB4MjEgKyB5 MjEgKiB5MjEpOwogIHJldHVybiB7CiAgICB4OiAoeDEgKyB4MiArIHgyMSAvIGwgKiByMjEpIC8g MiwKICAgIHk6ICh5MSArIHkyICsgeTIxIC8gbCAqIHIyMSkgLyAyLAogICAgcjogKGwgKyByMSAr IHIyKSAvIDIKICB9Owp9CgpmdW5jdGlvbiBlbmNsb3NlQmFzaXMzKGEsIGIsIGMpIHsKICB2YXIg eDEgPSBhLngsIHkxID0gYS55LCByMSA9IGEuciwKICAgICAgeDIgPSBiLngsIHkyID0gYi55LCBy MiA9IGIuciwKICAgICAgeDMgPSBjLngsIHkzID0gYy55LCByMyA9IGMuciwKICAgICAgYTIgPSB4 MSAtIHgyLAogICAgICBhMyA9IHgxIC0geDMsCiAgICAgIGIyID0geTEgLSB5MiwKICAgICAgYjMg PSB5MSAtIHkzLAogICAgICBjMiA9IHIyIC0gcjEsCiAgICAgIGMzID0gcjMgLSByMSwKICAgICAg ZDEgPSB4MSAqIHgxICsgeTEgKiB5MSAtIHIxICogcjEsCiAgICAgIGQyID0gZDEgLSB4MiAqIHgy IC0geTIgKiB5MiArIHIyICogcjIsCiAgICAgIGQzID0gZDEgLSB4MyAqIHgzIC0geTMgKiB5MyAr IHIzICogcjMsCiAgICAgIGFiID0gYTMgKiBiMiAtIGEyICogYjMsCiAgICAgIHhhID0gKGIyICog ZDMgLSBiMyAqIGQyKSAvIChhYiAqIDIpIC0geDEsCiAgICAgIHhiID0gKGIzICogYzIgLSBiMiAq IGMzKSAvIGFiLAogICAgICB5YSA9IChhMyAqIGQyIC0gYTIgKiBkMykgLyAoYWIgKiAyKSAtIHkx LAogICAgICB5YiA9IChhMiAqIGMzIC0gYTMgKiBjMikgLyBhYiwKICAgICAgQSA9IHhiICogeGIg KyB5YiAqIHliIC0gMSwKICAgICAgQiA9IDIgKiAocjEgKyB4YSAqIHhiICsgeWEgKiB5YiksCiAg ICAgIEMgPSB4YSAqIHhhICsgeWEgKiB5YSAtIHIxICogcjEsCiAgICAgIHIgPSAtKEEgPyAoQiAr IE1hdGguc3FydChCICogQiAtIDQgKiBBICogQykpIC8gKDIgKiBBKSA6IEMgLyBCKTsKICByZXR1 cm4gewogICAgeDogeDEgKyB4YSArIHhiICogciwKICAgIHk6IHkxICsgeWEgKyB5YiAqIHIsCiAg ICByOiByCiAgfTsKfQoKZnVuY3Rpb24gcGxhY2UoYiwgYSwgYykgewogIHZhciBkeCA9IGIueCAt IGEueCwgeCwgYTIsCiAgICAgIGR5ID0gYi55IC0gYS55LCB5LCBiMiwKICAgICAgZDIgPSBkeCAq IGR4ICsgZHkgKiBkeTsKICBpZiAoZDIpIHsKICAgIGEyID0gYS5yICsgYy5yLCBhMiAqPSBhMjsK ICAgIGIyID0gYi5yICsgYy5yLCBiMiAqPSBiMjsKICAgIGlmIChhMiA+IGIyKSB7CiAgICAgIHgg PSAoZDIgKyBiMiAtIGEyKSAvICgyICogZDIpOwogICAgICB5ID0gTWF0aC5zcXJ0KE1hdGgubWF4 KDAsIGIyIC8gZDIgLSB4ICogeCkpOwogICAgICBjLnggPSBiLnggLSB4ICogZHggLSB5ICogZHk7 CiAgICAgIGMueSA9IGIueSAtIHggKiBkeSArIHkgKiBkeDsKICAgIH0gZWxzZSB7CiAgICAgIHgg PSAoZDIgKyBhMiAtIGIyKSAvICgyICogZDIpOwogICAgICB5ID0gTWF0aC5zcXJ0KE1hdGgubWF4 KDAsIGEyIC8gZDIgLSB4ICogeCkpOwogICAgICBjLnggPSBhLnggKyB4ICogZHggLSB5ICogZHk7 CiAgICAgIGMueSA9IGEueSArIHggKiBkeSArIHkgKiBkeDsKICAgIH0KICB9IGVsc2UgewogICAg Yy54ID0gYS54ICsgYy5yOwogICAgYy55ID0gYS55OwogIH0KfQoKZnVuY3Rpb24gaW50ZXJzZWN0 cyhhLCBiKSB7CiAgdmFyIGRyID0gYS5yICsgYi5yIC0gMWUtNiwgZHggPSBiLnggLSBhLngsIGR5 ID0gYi55IC0gYS55OwogIHJldHVybiBkciA+IDAgJiYgZHIgKiBkciA+IGR4ICogZHggKyBkeSAq IGR5Owp9CgpmdW5jdGlvbiBzY29yZShub2RlKSB7CiAgdmFyIGEgPSBub2RlLl8sCiAgICAgIGIg PSBub2RlLm5leHQuXywKICAgICAgYWIgPSBhLnIgKyBiLnIsCiAgICAgIGR4ID0gKGEueCAqIGIu ciArIGIueCAqIGEucikgLyBhYiwKICAgICAgZHkgPSAoYS55ICogYi5yICsgYi55ICogYS5yKSAv IGFiOwogIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTsKfQoKZnVuY3Rpb24gTm9kZSQxKGNpcmNs ZSkgewogIHRoaXMuXyA9IGNpcmNsZTsKICB0aGlzLm5leHQgPSBudWxsOwogIHRoaXMucHJldmlv dXMgPSBudWxsOwp9CgpmdW5jdGlvbiBwYWNrRW5jbG9zZShjaXJjbGVzKSB7CiAgaWYgKCEobiA9 IGNpcmNsZXMubGVuZ3RoKSkgcmV0dXJuIDA7CgogIHZhciBhLCBiLCBjLCBuLCBhYSwgY2EsIGks IGosIGssIHNqLCBzazsKCiAgLy8gUGxhY2UgdGhlIGZpcnN0IGNpcmNsZS4KICBhID0gY2lyY2xl c1swXSwgYS54ID0gMCwgYS55ID0gMDsKICBpZiAoIShuID4gMSkpIHJldHVybiBhLnI7CgogIC8v IFBsYWNlIHRoZSBzZWNvbmQgY2lyY2xlLgogIGIgPSBjaXJjbGVzWzFdLCBhLnggPSAtYi5yLCBi LnggPSBhLnIsIGIueSA9IDA7CiAgaWYgKCEobiA+IDIpKSByZXR1cm4gYS5yICsgYi5yOwoKICAv LyBQbGFjZSB0aGUgdGhpcmQgY2lyY2xlLgogIHBsYWNlKGIsIGEsIGMgPSBjaXJjbGVzWzJdKTsK CiAgLy8gSW5pdGlhbGl6ZSB0aGUgZnJvbnQtY2hhaW4gdXNpbmcgdGhlIGZpcnN0IHRocmVlIGNp cmNsZXMgYSwgYiBhbmQgYy4KICBhID0gbmV3IE5vZGUkMShhKSwgYiA9IG5ldyBOb2RlJDEoYiks IGMgPSBuZXcgTm9kZSQxKGMpOwogIGEubmV4dCA9IGMucHJldmlvdXMgPSBiOwogIGIubmV4dCA9 IGEucHJldmlvdXMgPSBjOwogIGMubmV4dCA9IGIucHJldmlvdXMgPSBhOwoKICAvLyBBdHRlbXB0 IHRvIHBsYWNlIGVhY2ggcmVtYWluaW5nIGNpcmNsZeKApgogIHBhY2s6IGZvciAoaSA9IDM7IGkg PCBuOyArK2kpIHsKICAgIHBsYWNlKGEuXywgYi5fLCBjID0gY2lyY2xlc1tpXSksIGMgPSBuZXcg Tm9kZSQxKGMpOwoKICAgIC8vIEZpbmQgdGhlIGNsb3Nlc3QgaW50ZXJzZWN0aW5nIGNpcmNsZSBv biB0aGUgZnJvbnQtY2hhaW4sIGlmIGFueS4KICAgIC8vIOKAnENsb3NlbmVzc+KAnSBpcyBkZXRl cm1pbmVkIGJ5IGxpbmVhciBkaXN0YW5jZSBhbG9uZyB0aGUgZnJvbnQtY2hhaW4uCiAgICAvLyDi gJxBaGVhZOKAnSBvciDigJxiZWhpbmTigJ0gaXMgbGlrZXdpc2UgZGV0ZXJtaW5lZCBieSBsaW5l YXIgZGlzdGFuY2UuCiAgICBqID0gYi5uZXh0LCBrID0gYS5wcmV2aW91cywgc2ogPSBiLl8uciwg c2sgPSBhLl8ucjsKICAgIGRvIHsKICAgICAgaWYgKHNqIDw9IHNrKSB7CiAgICAgICAgaWYgKGlu dGVyc2VjdHMoai5fLCBjLl8pKSB7CiAgICAgICAgICBiID0gaiwgYS5uZXh0ID0gYiwgYi5wcmV2 aW91cyA9IGEsIC0taTsKICAgICAgICAgIGNvbnRpbnVlIHBhY2s7CiAgICAgICAgfQogICAgICAg IHNqICs9IGouXy5yLCBqID0gai5uZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpbnRl cnNlY3RzKGsuXywgYy5fKSkgewogICAgICAgICAgYSA9IGssIGEubmV4dCA9IGIsIGIucHJldmlv dXMgPSBhLCAtLWk7CiAgICAgICAgICBjb250aW51ZSBwYWNrOwogICAgICAgIH0KICAgICAgICBz ayArPSBrLl8uciwgayA9IGsucHJldmlvdXM7CiAgICAgIH0KICAgIH0gd2hpbGUgKGogIT09IGsu bmV4dCk7CgogICAgLy8gU3VjY2VzcyEgSW5zZXJ0IHRoZSBuZXcgY2lyY2xlIGMgYmV0d2VlbiBh IGFuZCBiLgogICAgYy5wcmV2aW91cyA9IGEsIGMubmV4dCA9IGIsIGEubmV4dCA9IGIucHJldmlv dXMgPSBiID0gYzsKCiAgICAvLyBDb21wdXRlIHRoZSBuZXcgY2xvc2VzdCBjaXJjbGUgcGFpciB0 byB0aGUgY2VudHJvaWQuCiAgICBhYSA9IHNjb3JlKGEpOwogICAgd2hpbGUgKChjID0gYy5uZXh0 KSAhPT0gYikgewogICAgICBpZiAoKGNhID0gc2NvcmUoYykpIDwgYWEpIHsKICAgICAgICBhID0g YywgYWEgPSBjYTsKICAgICAgfQogICAgfQogICAgYiA9IGEubmV4dDsKICB9CgogIC8vIENvbXB1 dGUgdGhlIGVuY2xvc2luZyBjaXJjbGUgb2YgdGhlIGZyb250IGNoYWluLgogIGEgPSBbYi5fXSwg YyA9IGI7IHdoaWxlICgoYyA9IGMubmV4dCkgIT09IGIpIGEucHVzaChjLl8pOyBjID0gZW5jbG9z ZShhKTsKCiAgLy8gVHJhbnNsYXRlIHRoZSBjaXJjbGVzIHRvIHB1dCB0aGUgZW5jbG9zaW5nIGNp cmNsZSBhcm91bmQgdGhlIG9yaWdpbi4KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBhID0gY2ly Y2xlc1tpXSwgYS54IC09IGMueCwgYS55IC09IGMueTsKCiAgcmV0dXJuIGMucjsKfQoKZnVuY3Rp b24gc2libGluZ3MoY2lyY2xlcykgewogIHBhY2tFbmNsb3NlKGNpcmNsZXMpOwogIHJldHVybiBj aXJjbGVzOwp9CgpmdW5jdGlvbiBvcHRpb25hbChmKSB7CiAgcmV0dXJuIGYgPT0gbnVsbCA/IG51 bGwgOiByZXF1aXJlZChmKTsKfQoKZnVuY3Rpb24gcmVxdWlyZWQoZikgewogIGlmICh0eXBlb2Yg ZiAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogIHJldHVybiBmOwp9CgpmdW5jdGlv biBjb25zdGFudFplcm8oKSB7CiAgcmV0dXJuIDA7Cn0KCmZ1bmN0aW9uIGNvbnN0YW50JDkoeCkg ewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn0KCmZ1bmN0aW9uIGRl ZmF1bHRSYWRpdXMkMShkKSB7CiAgcmV0dXJuIE1hdGguc3FydChkLnZhbHVlKTsKfQoKZnVuY3Rp b24gaW5kZXgkMigpIHsKICB2YXIgcmFkaXVzID0gbnVsbCwKICAgICAgZHggPSAxLAogICAgICBk eSA9IDEsCiAgICAgIHBhZGRpbmcgPSBjb25zdGFudFplcm87CgogIGZ1bmN0aW9uIHBhY2socm9v dCkgewogICAgcm9vdC54ID0gZHggLyAyLCByb290LnkgPSBkeSAvIDI7CiAgICBpZiAocmFkaXVz KSB7CiAgICAgIHJvb3QuZWFjaEJlZm9yZShyYWRpdXNMZWFmKHJhZGl1cykpCiAgICAgICAgICAu ZWFjaEFmdGVyKHBhY2tDaGlsZHJlbihwYWRkaW5nLCAwLjUpKQogICAgICAgICAgLmVhY2hCZWZv cmUodHJhbnNsYXRlQ2hpbGQoMSkpOwogICAgfSBlbHNlIHsKICAgICAgcm9vdC5lYWNoQmVmb3Jl KHJhZGl1c0xlYWYoZGVmYXVsdFJhZGl1cyQxKSkKICAgICAgICAgIC5lYWNoQWZ0ZXIocGFja0No aWxkcmVuKGNvbnN0YW50WmVybywgMSkpCiAgICAgICAgICAuZWFjaEFmdGVyKHBhY2tDaGlsZHJl bihwYWRkaW5nLCByb290LnIgLyBNYXRoLm1pbihkeCwgZHkpKSkKICAgICAgICAgIC5lYWNoQmVm b3JlKHRyYW5zbGF0ZUNoaWxkKE1hdGgubWluKGR4LCBkeSkgLyAoMiAqIHJvb3QucikpKTsKICAg IH0KICAgIHJldHVybiByb290OwogIH0KCiAgcGFjay5yYWRpdXMgPSBmdW5jdGlvbih4KSB7CiAg ICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYWRpdXMgPSBvcHRpb25hbCh4KSwgcGFjaykg OiByYWRpdXM7CiAgfTsKCiAgcGFjay5zaXplID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFy Z3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgcGFjaykgOiBbZHgsIGR5 XTsKICB9OwoKICBwYWNrLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1l bnRzLmxlbmd0aCA/IChwYWRkaW5nID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29u c3RhbnQkOSgreCksIHBhY2spIDogcGFkZGluZzsKICB9OwoKICByZXR1cm4gcGFjazsKfQoKZnVu Y3Rpb24gcmFkaXVzTGVhZihyYWRpdXMpIHsKICByZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAg aWYgKCFub2RlLmNoaWxkcmVuKSB7CiAgICAgIG5vZGUuciA9IE1hdGgubWF4KDAsICtyYWRpdXMo bm9kZSkgfHwgMCk7CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gcGFja0NoaWxkcmVuKHBhZGRpbmcs IGspIHsKICByZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAgaWYgKGNoaWxkcmVuID0gbm9kZS5j aGlsZHJlbikgewogICAgICB2YXIgY2hpbGRyZW4sCiAgICAgICAgICBpLAogICAgICAgICAgbiA9 IGNoaWxkcmVuLmxlbmd0aCwKICAgICAgICAgIHIgPSBwYWRkaW5nKG5vZGUpICogayB8fCAwLAog ICAgICAgICAgZTsKCiAgICAgIGlmIChyKSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGlsZHJl bltpXS5yICs9IHI7CiAgICAgIGUgPSBwYWNrRW5jbG9zZShjaGlsZHJlbik7CiAgICAgIGlmIChy KSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGlsZHJlbltpXS5yIC09IHI7CiAgICAgIG5vZGUu ciA9IGUgKyByOwogICAgfQogIH07Cn0KCmZ1bmN0aW9uIHRyYW5zbGF0ZUNoaWxkKGspIHsKICBy ZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAg bm9kZS5yICo9IGs7CiAgICBpZiAocGFyZW50KSB7CiAgICAgIG5vZGUueCA9IHBhcmVudC54ICsg ayAqIG5vZGUueDsKICAgICAgbm9kZS55ID0gcGFyZW50LnkgKyBrICogbm9kZS55OwogICAgfQog IH07Cn0KCmZ1bmN0aW9uIHJvdW5kTm9kZShub2RlKSB7CiAgbm9kZS54MCA9IE1hdGgucm91bmQo bm9kZS54MCk7CiAgbm9kZS55MCA9IE1hdGgucm91bmQobm9kZS55MCk7CiAgbm9kZS54MSA9IE1h dGgucm91bmQobm9kZS54MSk7CiAgbm9kZS55MSA9IE1hdGgucm91bmQobm9kZS55MSk7Cn0KCmZ1 bmN0aW9uIHRyZWVtYXBEaWNlKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgbm9kZXMg PSBwYXJlbnQuY2hpbGRyZW4sCiAgICAgIG5vZGUsCiAgICAgIGkgPSAtMSwKICAgICAgbiA9IG5v ZGVzLmxlbmd0aCwKICAgICAgayA9IHBhcmVudC52YWx1ZSAmJiAoeDEgLSB4MCkgLyBwYXJlbnQu dmFsdWU7CgogIHdoaWxlICgrK2kgPCBuKSB7CiAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueTAg PSB5MCwgbm9kZS55MSA9IHkxOwogICAgbm9kZS54MCA9IHgwLCBub2RlLngxID0geDAgKz0gbm9k ZS52YWx1ZSAqIGs7CiAgfQp9CgpmdW5jdGlvbiBwYXJ0aXRpb24oKSB7CiAgdmFyIGR4ID0gMSwK ICAgICAgZHkgPSAxLAogICAgICBwYWRkaW5nID0gMCwKICAgICAgcm91bmQgPSBmYWxzZTsKCiAg ZnVuY3Rpb24gcGFydGl0aW9uKHJvb3QpIHsKICAgIHZhciBuID0gcm9vdC5oZWlnaHQgKyAxOwog ICAgcm9vdC54MCA9CiAgICByb290LnkwID0gcGFkZGluZzsKICAgIHJvb3QueDEgPSBkeDsKICAg IHJvb3QueTEgPSBkeSAvIG47CiAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKGR5LCBu KSk7CiAgICBpZiAocm91bmQpIHJvb3QuZWFjaEJlZm9yZShyb3VuZE5vZGUpOwogICAgcmV0dXJu IHJvb3Q7CiAgfQoKICBmdW5jdGlvbiBwb3NpdGlvbk5vZGUoZHksIG4pIHsKICAgIHJldHVybiBm dW5jdGlvbihub2RlKSB7CiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7CiAgICAgICAgdHJlZW1h cERpY2Uobm9kZSwgbm9kZS54MCwgZHkgKiAobm9kZS5kZXB0aCArIDEpIC8gbiwgbm9kZS54MSwg ZHkgKiAobm9kZS5kZXB0aCArIDIpIC8gbik7CiAgICAgIH0KICAgICAgdmFyIHgwID0gbm9kZS54 MCwKICAgICAgICAgIHkwID0gbm9kZS55MCwKICAgICAgICAgIHgxID0gbm9kZS54MSAtIHBhZGRp bmcsCiAgICAgICAgICB5MSA9IG5vZGUueTEgLSBwYWRkaW5nOwogICAgICBpZiAoeDEgPCB4MCkg eDAgPSB4MSA9ICh4MCArIHgxKSAvIDI7CiAgICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkw ICsgeTEpIC8gMjsKICAgICAgbm9kZS54MCA9IHgwOwogICAgICBub2RlLnkwID0geTA7CiAgICAg IG5vZGUueDEgPSB4MTsKICAgICAgbm9kZS55MSA9IHkxOwogICAgfTsKICB9CgogIHBhcnRpdGlv bi5yb3VuZCA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJv dW5kID0gISF4LCBwYXJ0aXRpb24pIDogcm91bmQ7CiAgfTsKCiAgcGFydGl0aW9uLnNpemUgPSBm dW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBk eSA9ICt4WzFdLCBwYXJ0aXRpb24pIDogW2R4LCBkeV07CiAgfTsKCiAgcGFydGl0aW9uLnBhZGRp bmcgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5n ID0gK3gsIHBhcnRpdGlvbikgOiBwYWRkaW5nOwogIH07CgogIHJldHVybiBwYXJ0aXRpb247Cn0K CnZhciBrZXlQcmVmaXgkMSA9ICIkIiwgLy8gUHJvdGVjdCBhZ2FpbnN0IGtleXMgbGlrZSDigJxf X3Byb3RvX1/igJ0uCiAgICBwcmVyb290ID0ge2RlcHRoOiAtMX0sCiAgICBhbWJpZ3VvdXMgPSB7 fTsKCmZ1bmN0aW9uIGRlZmF1bHRJZChkKSB7CiAgcmV0dXJuIGQuaWQ7Cn0KCmZ1bmN0aW9uIGRl ZmF1bHRQYXJlbnRJZChkKSB7CiAgcmV0dXJuIGQucGFyZW50SWQ7Cn0KCmZ1bmN0aW9uIHN0cmF0 aWZ5KCkgewogIHZhciBpZCA9IGRlZmF1bHRJZCwKICAgICAgcGFyZW50SWQgPSBkZWZhdWx0UGFy ZW50SWQ7CgogIGZ1bmN0aW9uIHN0cmF0aWZ5KGRhdGEpIHsKICAgIHZhciBkLAogICAgICAgIGks CiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLAogICAgICAgIHJvb3QsCiAgICAgICAgcGFyZW50LAog ICAgICAgIG5vZGUsCiAgICAgICAgbm9kZXMgPSBuZXcgQXJyYXkobiksCiAgICAgICAgbm9kZUlk LAogICAgICAgIG5vZGVLZXksCiAgICAgICAgbm9kZUJ5S2V5ID0ge307CgogICAgZm9yIChpID0g MDsgaSA8IG47ICsraSkgewogICAgICBkID0gZGF0YVtpXSwgbm9kZSA9IG5vZGVzW2ldID0gbmV3 IE5vZGUoZCk7CiAgICAgIGlmICgobm9kZUlkID0gaWQoZCwgaSwgZGF0YSkpICE9IG51bGwgJiYg KG5vZGVJZCArPSAiIikpIHsKICAgICAgICBub2RlS2V5ID0ga2V5UHJlZml4JDEgKyAobm9kZS5p ZCA9IG5vZGVJZCk7CiAgICAgICAgbm9kZUJ5S2V5W25vZGVLZXldID0gbm9kZUtleSBpbiBub2Rl QnlLZXkgPyBhbWJpZ3VvdXMgOiBub2RlOwogICAgICB9CiAgICB9CgogICAgZm9yIChpID0gMDsg aSA8IG47ICsraSkgewogICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGVJZCA9IHBhcmVudElkKGRh dGFbaV0sIGksIGRhdGEpOwogICAgICBpZiAobm9kZUlkID09IG51bGwgfHwgIShub2RlSWQgKz0g IiIpKSB7CiAgICAgICAgaWYgKHJvb3QpIHRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMi KTsKICAgICAgICByb290ID0gbm9kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJlbnQgPSBu b2RlQnlLZXlba2V5UHJlZml4JDEgKyBub2RlSWRdOwogICAgICAgIGlmICghcGFyZW50KSB0aHJv dyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIgKyBub2RlSWQpOwogICAgICAgIGlmIChwYXJlbnQgPT09 IGFtYmlndW91cykgdGhyb3cgbmV3IEVycm9yKCJhbWJpZ3VvdXM6ICIgKyBub2RlSWQpOwogICAg ICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pIHBhcmVudC5jaGlsZHJlbi5wdXNoKG5vZGUpOwogICAg ICAgIGVsc2UgcGFyZW50LmNoaWxkcmVuID0gW25vZGVdOwogICAgICAgIG5vZGUucGFyZW50ID0g cGFyZW50OwogICAgICB9CiAgICB9CgogICAgaWYgKCFyb290KSB0aHJvdyBuZXcgRXJyb3IoIm5v IHJvb3QiKTsKICAgIHJvb3QucGFyZW50ID0gcHJlcm9vdDsKICAgIHJvb3QuZWFjaEJlZm9yZShm dW5jdGlvbihub2RlKSB7IG5vZGUuZGVwdGggPSBub2RlLnBhcmVudC5kZXB0aCArIDE7IC0tbjsg fSkuZWFjaEJlZm9yZShjb21wdXRlSGVpZ2h0KTsKICAgIHJvb3QucGFyZW50ID0gbnVsbDsKICAg IGlmIChuID4gMCkgdGhyb3cgbmV3IEVycm9yKCJjeWNsZSIpOwoKICAgIHJldHVybiByb290Owog IH0KCiAgc3RyYXRpZnkuaWQgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/IChpZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBpZDsKICB9OwoKICBzdHJhdGlm eS5wYXJlbnRJZCA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8g KHBhcmVudElkID0gcmVxdWlyZWQoeCksIHN0cmF0aWZ5KSA6IHBhcmVudElkOwogIH07CgogIHJl dHVybiBzdHJhdGlmeTsKfQoKZnVuY3Rpb24gZGVmYXVsdFNlcGFyYXRpb24kMShhLCBiKSB7CiAg cmV0dXJuIGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyOwp9CgovLyBmdW5jdGlvbiByYWRp YWxTZXBhcmF0aW9uKGEsIGIpIHsKLy8gICByZXR1cm4gKGEucGFyZW50ID09PSBiLnBhcmVudCA/ IDEgOiAyKSAvIGEuZGVwdGg7Ci8vIH0KCi8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB0cmF2 ZXJzZSB0aGUgbGVmdCBjb250b3VyIG9mIGEgc3VidHJlZSAob3IKLy8gc3ViZm9yZXN0KS4gSXQg cmV0dXJucyB0aGUgc3VjY2Vzc29yIG9mIHYgb24gdGhpcyBjb250b3VyLiBUaGlzIHN1Y2Nlc3Nv ciBpcwovLyBlaXRoZXIgZ2l2ZW4gYnkgdGhlIGxlZnRtb3N0IGNoaWxkIG9mIHYgb3IgYnkgdGhl IHRocmVhZCBvZiB2LiBUaGUgZnVuY3Rpb24KLy8gcmV0dXJucyBudWxsIGlmIGFuZCBvbmx5IGlm IHYgaXMgb24gdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgaXRzIHN1YnRyZWUuCmZ1bmN0aW9uIG5leHRM ZWZ0KHYpIHsKICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuOwogIHJldHVybiBjaGlsZHJlbiA/ IGNoaWxkcmVuWzBdIDogdi50Owp9CgovLyBUaGlzIGZ1bmN0aW9uIHdvcmtzIGFuYWxvZ291c2x5 IHRvIG5leHRMZWZ0LgpmdW5jdGlvbiBuZXh0UmlnaHQodikgewogIHZhciBjaGlsZHJlbiA9IHYu Y2hpbGRyZW47CiAgcmV0dXJuIGNoaWxkcmVuID8gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0g MV0gOiB2LnQ7Cn0KCi8vIFNoaWZ0cyB0aGUgY3VycmVudCBzdWJ0cmVlIHJvb3RlZCBhdCB3Ky4g VGhpcyBpcyBkb25lIGJ5IGluY3JlYXNpbmcKLy8gcHJlbGltKHcrKSBhbmQgbW9kKHcrKSBieSBz aGlmdC4KZnVuY3Rpb24gbW92ZVN1YnRyZWUod20sIHdwLCBzaGlmdCkgewogIHZhciBjaGFuZ2Ug PSBzaGlmdCAvICh3cC5pIC0gd20uaSk7CiAgd3AuYyAtPSBjaGFuZ2U7CiAgd3AucyArPSBzaGlm dDsKICB3bS5jICs9IGNoYW5nZTsKICB3cC56ICs9IHNoaWZ0OwogIHdwLm0gKz0gc2hpZnQ7Cn0K Ci8vIEFsbCBvdGhlciBzaGlmdHMsIGFwcGxpZWQgdG8gdGhlIHNtYWxsZXIgc3VidHJlZXMgYmV0 d2VlbiB3LSBhbmQgdyssIGFyZQovLyBwZXJmb3JtZWQgYnkgdGhpcyBmdW5jdGlvbi4gVG8gcHJl cGFyZSB0aGUgc2hpZnRzLCB3ZSBoYXZlIHRvIGFkanVzdAovLyBjaGFuZ2UodyspLCBzaGlmdCh3 KyksIGFuZCBjaGFuZ2Uody0pLgpmdW5jdGlvbiBleGVjdXRlU2hpZnRzKHYpIHsKICB2YXIgc2hp ZnQgPSAwLAogICAgICBjaGFuZ2UgPSAwLAogICAgICBjaGlsZHJlbiA9IHYuY2hpbGRyZW4sCiAg ICAgIGkgPSBjaGlsZHJlbi5sZW5ndGgsCiAgICAgIHc7CiAgd2hpbGUgKC0taSA+PSAwKSB7CiAg ICB3ID0gY2hpbGRyZW5baV07CiAgICB3LnogKz0gc2hpZnQ7CiAgICB3Lm0gKz0gc2hpZnQ7CiAg ICBzaGlmdCArPSB3LnMgKyAoY2hhbmdlICs9IHcuYyk7CiAgfQp9CgovLyBJZiB2aS3igJlzIGFu Y2VzdG9yIGlzIGEgc2libGluZyBvZiB2LCByZXR1cm5zIHZpLeKAmXMgYW5jZXN0b3IuIE90aGVy d2lzZSwKLy8gcmV0dXJucyB0aGUgc3BlY2lmaWVkIChkZWZhdWx0KSBhbmNlc3Rvci4KZnVuY3Rp b24gbmV4dEFuY2VzdG9yKHZpbSwgdiwgYW5jZXN0b3IpIHsKICByZXR1cm4gdmltLmEucGFyZW50 ID09PSB2LnBhcmVudCA/IHZpbS5hIDogYW5jZXN0b3I7Cn0KCmZ1bmN0aW9uIFRyZWVOb2RlKG5v ZGUsIGkpIHsKICB0aGlzLl8gPSBub2RlOwogIHRoaXMucGFyZW50ID0gbnVsbDsKICB0aGlzLmNo aWxkcmVuID0gbnVsbDsKICB0aGlzLkEgPSBudWxsOyAvLyBkZWZhdWx0IGFuY2VzdG9yCiAgdGhp cy5hID0gdGhpczsgLy8gYW5jZXN0b3IKICB0aGlzLnogPSAwOyAvLyBwcmVsaW0KICB0aGlzLm0g PSAwOyAvLyBtb2QKICB0aGlzLmMgPSAwOyAvLyBjaGFuZ2UKICB0aGlzLnMgPSAwOyAvLyBzaGlm dAogIHRoaXMudCA9IG51bGw7IC8vIHRocmVhZAogIHRoaXMuaSA9IGk7IC8vIG51bWJlcgp9CgpU cmVlTm9kZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE5vZGUucHJvdG90eXBlKTsKCmZ1bmN0 aW9uIHRyZWVSb290KHJvb3QpIHsKICB2YXIgdHJlZSA9IG5ldyBUcmVlTm9kZShyb290LCAwKSwK ICAgICAgbm9kZSwKICAgICAgbm9kZXMgPSBbdHJlZV0sCiAgICAgIGNoaWxkLAogICAgICBjaGls ZHJlbiwKICAgICAgaSwKICAgICAgbjsKCiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgewog ICAgaWYgKGNoaWxkcmVuID0gbm9kZS5fLmNoaWxkcmVuKSB7CiAgICAgIG5vZGUuY2hpbGRyZW4g PSBuZXcgQXJyYXkobiA9IGNoaWxkcmVuLmxlbmd0aCk7CiAgICAgIGZvciAoaSA9IG4gLSAxOyBp ID49IDA7IC0taSkgewogICAgICAgIG5vZGVzLnB1c2goY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ld ID0gbmV3IFRyZWVOb2RlKGNoaWxkcmVuW2ldLCBpKSk7CiAgICAgICAgY2hpbGQucGFyZW50ID0g bm9kZTsKICAgICAgfQogICAgfQogIH0KCiAgKHRyZWUucGFyZW50ID0gbmV3IFRyZWVOb2RlKG51 bGwsIDApKS5jaGlsZHJlbiA9IFt0cmVlXTsKICByZXR1cm4gdHJlZTsKfQoKLy8gTm9kZS1saW5r IHRyZWUgZGlhZ3JhbSB1c2luZyB0aGUgUmVpbmdvbGQtVGlsZm9yZCAidGlkeSIgYWxnb3JpdGht CmZ1bmN0aW9uIHRyZWUoKSB7CiAgdmFyIHNlcGFyYXRpb24gPSBkZWZhdWx0U2VwYXJhdGlvbiQx LAogICAgICBkeCA9IDEsCiAgICAgIGR5ID0gMSwKICAgICAgbm9kZVNpemUgPSBudWxsOwoKICBm dW5jdGlvbiB0cmVlKHJvb3QpIHsKICAgIHZhciB0ID0gdHJlZVJvb3Qocm9vdCk7CgogICAgLy8g Q29tcHV0ZSB0aGUgbGF5b3V0IHVzaW5nIEJ1Y2hoZWltIGV0IGFsLuKAmXMgYWxnb3JpdGhtLgog ICAgdC5lYWNoQWZ0ZXIoZmlyc3RXYWxrKSwgdC5wYXJlbnQubSA9IC10Lno7CiAgICB0LmVhY2hC ZWZvcmUoc2Vjb25kV2Fsayk7CgogICAgLy8gSWYgYSBmaXhlZCBub2RlIHNpemUgaXMgc3BlY2lm aWVkLCBzY2FsZSB4IGFuZCB5LgogICAgaWYgKG5vZGVTaXplKSByb290LmVhY2hCZWZvcmUoc2l6 ZU5vZGUpOwoKICAgIC8vIElmIGEgZml4ZWQgdHJlZSBzaXplIGlzIHNwZWNpZmllZCwgc2NhbGUg eCBhbmQgeSBiYXNlZCBvbiB0aGUgZXh0ZW50LgogICAgLy8gQ29tcHV0ZSB0aGUgbGVmdC1tb3N0 LCByaWdodC1tb3N0LCBhbmQgZGVwdGgtbW9zdCBub2RlcyBmb3IgZXh0ZW50cy4KICAgIGVsc2Ug ewogICAgICB2YXIgbGVmdCA9IHJvb3QsCiAgICAgICAgICByaWdodCA9IHJvb3QsCiAgICAgICAg ICBib3R0b20gPSByb290OwogICAgICByb290LmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgewog ICAgICAgIGlmIChub2RlLnggPCBsZWZ0LngpIGxlZnQgPSBub2RlOwogICAgICAgIGlmIChub2Rl LnggPiByaWdodC54KSByaWdodCA9IG5vZGU7CiAgICAgICAgaWYgKG5vZGUuZGVwdGggPiBib3R0 b20uZGVwdGgpIGJvdHRvbSA9IG5vZGU7CiAgICAgIH0pOwogICAgICB2YXIgcyA9IGxlZnQgPT09 IHJpZ2h0ID8gMSA6IHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwKICAgICAgICAgIHR4ID0g cyAtIGxlZnQueCwKICAgICAgICAgIGt4ID0gZHggLyAocmlnaHQueCArIHMgKyB0eCksCiAgICAg ICAgICBreSA9IGR5IC8gKGJvdHRvbS5kZXB0aCB8fCAxKTsKICAgICAgcm9vdC5lYWNoQmVmb3Jl KGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICBub2RlLnggPSAobm9kZS54ICsgdHgpICoga3g7CiAg ICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGt5OwogICAgICB9KTsKICAgIH0KCiAgICByZXR1 cm4gcm9vdDsKICB9CgogIC8vIENvbXB1dGVzIGEgcHJlbGltaW5hcnkgeC1jb29yZGluYXRlIGZv ciB2LiBCZWZvcmUgdGhhdCwgRklSU1QgV0FMSyBpcwogIC8vIGFwcGxpZWQgcmVjdXJzaXZlbHkg dG8gdGhlIGNoaWxkcmVuIG9mIHYsIGFzIHdlbGwgYXMgdGhlIGZ1bmN0aW9uCiAgLy8gQVBQT1JU SU9OLiBBZnRlciBzcGFjaW5nIG91dCB0aGUgY2hpbGRyZW4gYnkgY2FsbGluZyBFWEVDVVRFIFNI SUZUUywgdGhlCiAgLy8gbm9kZSB2IGlzIHBsYWNlZCB0byB0aGUgbWlkcG9pbnQgb2YgaXRzIG91 dGVybW9zdCBjaGlsZHJlbi4KICBmdW5jdGlvbiBmaXJzdFdhbGsodikgewogICAgdmFyIGNoaWxk cmVuID0gdi5jaGlsZHJlbiwKICAgICAgICBzaWJsaW5ncyA9IHYucGFyZW50LmNoaWxkcmVuLAog ICAgICAgIHcgPSB2LmkgPyBzaWJsaW5nc1t2LmkgLSAxXSA6IG51bGw7CiAgICBpZiAoY2hpbGRy ZW4pIHsKICAgICAgZXhlY3V0ZVNoaWZ0cyh2KTsKICAgICAgdmFyIG1pZHBvaW50ID0gKGNoaWxk cmVuWzBdLnogKyBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS56KSAvIDI7CiAgICAgIGlm ICh3KSB7CiAgICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7CiAgICAgICAg di5tID0gdi56IC0gbWlkcG9pbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdi56ID0gbWlkcG9p bnQ7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodykgewogICAgICB2LnogPSB3LnogKyBzZXBhcmF0 aW9uKHYuXywgdy5fKTsKICAgIH0KICAgIHYucGFyZW50LkEgPSBhcHBvcnRpb24odiwgdywgdi5w YXJlbnQuQSB8fCBzaWJsaW5nc1swXSk7CiAgfQoKICAvLyBDb21wdXRlcyBhbGwgcmVhbCB4LWNv b3JkaW5hdGVzIGJ5IHN1bW1pbmcgdXAgdGhlIG1vZGlmaWVycyByZWN1cnNpdmVseS4KICBmdW5j dGlvbiBzZWNvbmRXYWxrKHYpIHsKICAgIHYuXy54ID0gdi56ICsgdi5wYXJlbnQubTsKICAgIHYu bSArPSB2LnBhcmVudC5tOwogIH0KCiAgLy8gVGhlIGNvcmUgb2YgdGhlIGFsZ29yaXRobS4gSGVy ZSwgYSBuZXcgc3VidHJlZSBpcyBjb21iaW5lZCB3aXRoIHRoZQogIC8vIHByZXZpb3VzIHN1YnRy ZWVzLiBUaHJlYWRzIGFyZSB1c2VkIHRvIHRyYXZlcnNlIHRoZSBpbnNpZGUgYW5kIG91dHNpZGUK ICAvLyBjb250b3VycyBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgc3VidHJlZSB1cCB0byB0aGUgaGln aGVzdCBjb21tb24gbGV2ZWwuIFRoZQogIC8vIHZlcnRpY2VzIHVzZWQgZm9yIHRoZSB0cmF2ZXJz YWxzIGFyZSB2aSssIHZpLSwgdm8tLCBhbmQgdm8rLCB3aGVyZSB0aGUKICAvLyBzdXBlcnNjcmlw dCBvIG1lYW5zIG91dHNpZGUgYW5kIGkgbWVhbnMgaW5zaWRlLCB0aGUgc3Vic2NyaXB0IC0gbWVh bnMgbGVmdAogIC8vIHN1YnRyZWUgYW5kICsgbWVhbnMgcmlnaHQgc3VidHJlZS4gRm9yIHN1bW1p bmcgdXAgdGhlIG1vZGlmaWVycyBhbG9uZyB0aGUKICAvLyBjb250b3VyLCB3ZSB1c2UgcmVzcGVj dGl2ZSB2YXJpYWJsZXMgc2krLCBzaS0sIHNvLSwgYW5kIHNvKy4gV2hlbmV2ZXIgdHdvCiAgLy8g bm9kZXMgb2YgdGhlIGluc2lkZSBjb250b3VycyBjb25mbGljdCwgd2UgY29tcHV0ZSB0aGUgbGVm dCBvbmUgb2YgdGhlCiAgLy8gZ3JlYXRlc3QgdW5jb21tb24gYW5jZXN0b3JzIHVzaW5nIHRoZSBm dW5jdGlvbiBBTkNFU1RPUiBhbmQgY2FsbCBNT1ZFCiAgLy8gU1VCVFJFRSB0byBzaGlmdCB0aGUg c3VidHJlZSBhbmQgcHJlcGFyZSB0aGUgc2hpZnRzIG9mIHNtYWxsZXIgc3VidHJlZXMuCiAgLy8g RmluYWxseSwgd2UgYWRkIGEgbmV3IHRocmVhZCAoaWYgbmVjZXNzYXJ5KS4KICBmdW5jdGlvbiBh cHBvcnRpb24odiwgdywgYW5jZXN0b3IpIHsKICAgIGlmICh3KSB7CiAgICAgIHZhciB2aXAgPSB2 LAogICAgICAgICAgdm9wID0gdiwKICAgICAgICAgIHZpbSA9IHcsCiAgICAgICAgICB2b20gPSB2 aXAucGFyZW50LmNoaWxkcmVuWzBdLAogICAgICAgICAgc2lwID0gdmlwLm0sCiAgICAgICAgICBz b3AgPSB2b3AubSwKICAgICAgICAgIHNpbSA9IHZpbS5tLAogICAgICAgICAgc29tID0gdm9tLm0s CiAgICAgICAgICBzaGlmdDsKICAgICAgd2hpbGUgKHZpbSA9IG5leHRSaWdodCh2aW0pLCB2aXAg PSBuZXh0TGVmdCh2aXApLCB2aW0gJiYgdmlwKSB7CiAgICAgICAgdm9tID0gbmV4dExlZnQodm9t KTsKICAgICAgICB2b3AgPSBuZXh0UmlnaHQodm9wKTsKICAgICAgICB2b3AuYSA9IHY7CiAgICAg ICAgc2hpZnQgPSB2aW0ueiArIHNpbSAtIHZpcC56IC0gc2lwICsgc2VwYXJhdGlvbih2aW0uXywg dmlwLl8pOwogICAgICAgIGlmIChzaGlmdCA+IDApIHsKICAgICAgICAgIG1vdmVTdWJ0cmVlKG5l eHRBbmNlc3Rvcih2aW0sIHYsIGFuY2VzdG9yKSwgdiwgc2hpZnQpOwogICAgICAgICAgc2lwICs9 IHNoaWZ0OwogICAgICAgICAgc29wICs9IHNoaWZ0OwogICAgICAgIH0KICAgICAgICBzaW0gKz0g dmltLm07CiAgICAgICAgc2lwICs9IHZpcC5tOwogICAgICAgIHNvbSArPSB2b20ubTsKICAgICAg ICBzb3AgKz0gdm9wLm07CiAgICAgIH0KICAgICAgaWYgKHZpbSAmJiAhbmV4dFJpZ2h0KHZvcCkp IHsKICAgICAgICB2b3AudCA9IHZpbTsKICAgICAgICB2b3AubSArPSBzaW0gLSBzb3A7CiAgICAg IH0KICAgICAgaWYgKHZpcCAmJiAhbmV4dExlZnQodm9tKSkgewogICAgICAgIHZvbS50ID0gdmlw OwogICAgICAgIHZvbS5tICs9IHNpcCAtIHNvbTsKICAgICAgICBhbmNlc3RvciA9IHY7CiAgICAg IH0KICAgIH0KICAgIHJldHVybiBhbmNlc3RvcjsKICB9CgogIGZ1bmN0aW9uIHNpemVOb2RlKG5v ZGUpIHsKICAgIG5vZGUueCAqPSBkeDsKICAgIG5vZGUueSA9IG5vZGUuZGVwdGggKiBkeTsKICB9 CgogIHRyZWUuc2VwYXJhdGlvbiA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMu bGVuZ3RoID8gKHNlcGFyYXRpb24gPSB4LCB0cmVlKSA6IHNlcGFyYXRpb247CiAgfTsKCiAgdHJl ZS5zaXplID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9k ZVNpemUgPSBmYWxzZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZSkgOiAobm9kZVNpemUg PyBudWxsIDogW2R4LCBkeV0pOwogIH07CgogIHRyZWUubm9kZVNpemUgPSBmdW5jdGlvbih4KSB7 CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IHRydWUsIGR4ID0gK3hb MF0sIGR5ID0gK3hbMV0sIHRyZWUpIDogKG5vZGVTaXplID8gW2R4LCBkeV0gOiBudWxsKTsKICB9 OwoKICByZXR1cm4gdHJlZTsKfQoKZnVuY3Rpb24gdHJlZW1hcFNsaWNlKHBhcmVudCwgeDAsIHkw LCB4MSwgeTEpIHsKICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sCiAgICAgIG5vZGUsCiAg ICAgIGkgPSAtMSwKICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgayA9IHBhcmVudC52YWx1 ZSAmJiAoeTEgLSB5MCkgLyBwYXJlbnQudmFsdWU7CgogIHdoaWxlICgrK2kgPCBuKSB7CiAgICBu b2RlID0gbm9kZXNbaV0sIG5vZGUueDAgPSB4MCwgbm9kZS54MSA9IHgxOwogICAgbm9kZS55MCA9 IHkwLCBub2RlLnkxID0geTAgKz0gbm9kZS52YWx1ZSAqIGs7CiAgfQp9Cgp2YXIgcGhpID0gKDEg KyBNYXRoLnNxcnQoNSkpIC8gMjsKCmZ1bmN0aW9uIHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVu dCwgeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgcm93cyA9IFtdLAogICAgICBub2RlcyA9IHBhcmVu dC5jaGlsZHJlbiwKICAgICAgcm93LAogICAgICBub2RlVmFsdWUsCiAgICAgIGkwID0gMCwKICAg ICAgaTEgPSAwLAogICAgICBuID0gbm9kZXMubGVuZ3RoLAogICAgICBkeCwgZHksCiAgICAgIHZh bHVlID0gcGFyZW50LnZhbHVlLAogICAgICBzdW1WYWx1ZSwKICAgICAgbWluVmFsdWUsCiAgICAg IG1heFZhbHVlLAogICAgICBuZXdSYXRpbywKICAgICAgbWluUmF0aW8sCiAgICAgIGFscGhhLAog ICAgICBiZXRhOwoKICB3aGlsZSAoaTAgPCBuKSB7CiAgICBkeCA9IHgxIC0geDAsIGR5ID0geTEg LSB5MDsKCiAgICAvLyBGaW5kIHRoZSBuZXh0IG5vbi1lbXB0eSBub2RlLgogICAgZG8gc3VtVmFs dWUgPSBub2Rlc1tpMSsrXS52YWx1ZTsgd2hpbGUgKCFzdW1WYWx1ZSAmJiBpMSA8IG4pOwogICAg bWluVmFsdWUgPSBtYXhWYWx1ZSA9IHN1bVZhbHVlOwogICAgYWxwaGEgPSBNYXRoLm1heChkeSAv IGR4LCBkeCAvIGR5KSAvICh2YWx1ZSAqIHJhdGlvKTsKICAgIGJldGEgPSBzdW1WYWx1ZSAqIHN1 bVZhbHVlICogYWxwaGE7CiAgICBtaW5SYXRpbyA9IE1hdGgubWF4KG1heFZhbHVlIC8gYmV0YSwg YmV0YSAvIG1pblZhbHVlKTsKCiAgICAvLyBLZWVwIGFkZGluZyBub2RlcyB3aGlsZSB0aGUgYXNw ZWN0IHJhdGlvIG1haW50YWlucyBvciBpbXByb3Zlcy4KICAgIGZvciAoOyBpMSA8IG47ICsraTEp IHsKICAgICAgc3VtVmFsdWUgKz0gbm9kZVZhbHVlID0gbm9kZXNbaTFdLnZhbHVlOwogICAgICBp ZiAobm9kZVZhbHVlIDwgbWluVmFsdWUpIG1pblZhbHVlID0gbm9kZVZhbHVlOwogICAgICBpZiAo bm9kZVZhbHVlID4gbWF4VmFsdWUpIG1heFZhbHVlID0gbm9kZVZhbHVlOwogICAgICBiZXRhID0g c3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhOwogICAgICBuZXdSYXRpbyA9IE1hdGgubWF4KG1h eFZhbHVlIC8gYmV0YSwgYmV0YSAvIG1pblZhbHVlKTsKICAgICAgaWYgKG5ld1JhdGlvID4gbWlu UmF0aW8pIHsgc3VtVmFsdWUgLT0gbm9kZVZhbHVlOyBicmVhazsgfQogICAgICBtaW5SYXRpbyA9 IG5ld1JhdGlvOwogICAgfQoKICAgIC8vIFBvc2l0aW9uIGFuZCByZWNvcmQgdGhlIHJvdyBvcmll bnRhdGlvbi4KICAgIHJvd3MucHVzaChyb3cgPSB7dmFsdWU6IHN1bVZhbHVlLCBkaWNlOiBkeCA8 IGR5LCBjaGlsZHJlbjogbm9kZXMuc2xpY2UoaTAsIGkxKX0pOwogICAgaWYgKHJvdy5kaWNlKSB0 cmVlbWFwRGljZShyb3csIHgwLCB5MCwgeDEsIHZhbHVlID8geTAgKz0gZHkgKiBzdW1WYWx1ZSAv IHZhbHVlIDogeTEpOwogICAgZWxzZSB0cmVlbWFwU2xpY2Uocm93LCB4MCwgeTAsIHZhbHVlID8g eDAgKz0gZHggKiBzdW1WYWx1ZSAvIHZhbHVlIDogeDEsIHkxKTsKICAgIHZhbHVlIC09IHN1bVZh bHVlLCBpMCA9IGkxOwogIH0KCiAgcmV0dXJuIHJvd3M7Cn0KCnZhciBzcXVhcmlmeSA9IChmdW5j dGlvbiBjdXN0b20ocmF0aW8pIHsKCiAgZnVuY3Rpb24gc3F1YXJpZnkocGFyZW50LCB4MCwgeTAs IHgxLCB5MSkgewogICAgc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4MCwgeTAsIHgxLCB5 MSk7CiAgfQoKICBzcXVhcmlmeS5yYXRpbyA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBjdXN0 b20oKHggPSAreCkgPiAxID8geCA6IDEpOwogIH07CgogIHJldHVybiBzcXVhcmlmeTsKfSkocGhp KTsKCmZ1bmN0aW9uIGluZGV4JDMoKSB7CiAgdmFyIHRpbGUgPSBzcXVhcmlmeSwKICAgICAgcm91 bmQgPSBmYWxzZSwKICAgICAgZHggPSAxLAogICAgICBkeSA9IDEsCiAgICAgIHBhZGRpbmdTdGFj ayA9IFswXSwKICAgICAgcGFkZGluZ0lubmVyID0gY29uc3RhbnRaZXJvLAogICAgICBwYWRkaW5n VG9wID0gY29uc3RhbnRaZXJvLAogICAgICBwYWRkaW5nUmlnaHQgPSBjb25zdGFudFplcm8sCiAg ICAgIHBhZGRpbmdCb3R0b20gPSBjb25zdGFudFplcm8sCiAgICAgIHBhZGRpbmdMZWZ0ID0gY29u c3RhbnRaZXJvOwoKICBmdW5jdGlvbiB0cmVlbWFwKHJvb3QpIHsKICAgIHJvb3QueDAgPQogICAg cm9vdC55MCA9IDA7CiAgICByb290LngxID0gZHg7CiAgICByb290LnkxID0gZHk7CiAgICByb290 LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKTsKICAgIHBhZGRpbmdTdGFjayA9IFswXTsKICAgIGlm IChyb3VuZCkgcm9vdC5lYWNoQmVmb3JlKHJvdW5kTm9kZSk7CiAgICByZXR1cm4gcm9vdDsKICB9 CgogIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShub2RlKSB7CiAgICB2YXIgcCA9IHBhZGRpbmdTdGFj a1tub2RlLmRlcHRoXSwKICAgICAgICB4MCA9IG5vZGUueDAgKyBwLAogICAgICAgIHkwID0gbm9k ZS55MCArIHAsCiAgICAgICAgeDEgPSBub2RlLngxIC0gcCwKICAgICAgICB5MSA9IG5vZGUueTEg LSBwOwogICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyOwogICAgaWYgKHkx IDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyOwogICAgbm9kZS54MCA9IHgwOwogICAgbm9k ZS55MCA9IHkwOwogICAgbm9kZS54MSA9IHgxOwogICAgbm9kZS55MSA9IHkxOwogICAgaWYgKG5v ZGUuY2hpbGRyZW4pIHsKICAgICAgcCA9IHBhZGRpbmdTdGFja1tub2RlLmRlcHRoICsgMV0gPSBw YWRkaW5nSW5uZXIobm9kZSkgLyAyOwogICAgICB4MCArPSBwYWRkaW5nTGVmdChub2RlKSAtIHA7 CiAgICAgIHkwICs9IHBhZGRpbmdUb3Aobm9kZSkgLSBwOwogICAgICB4MSAtPSBwYWRkaW5nUmln aHQobm9kZSkgLSBwOwogICAgICB5MSAtPSBwYWRkaW5nQm90dG9tKG5vZGUpIC0gcDsKICAgICAg aWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyOwogICAgICBpZiAoeTEgPCB5MCkg eTAgPSB5MSA9ICh5MCArIHkxKSAvIDI7CiAgICAgIHRpbGUobm9kZSwgeDAsIHkwLCB4MSwgeTEp OwogICAgfQogIH0KCiAgdHJlZW1hcC5yb3VuZCA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBh cmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISF4LCB0cmVlbWFwKSA6IHJvdW5kOwogIH07Cgog IHRyZWVtYXAuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3Ro ID8gKGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIHRyZWVtYXApIDogW2R4LCBkeV07CiAgfTsKCiAg dHJlZW1hcC50aWxlID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgg PyAodGlsZSA9IHJlcXVpcmVkKHgpLCB0cmVlbWFwKSA6IHRpbGU7CiAgfTsKCiAgdHJlZW1hcC5w YWRkaW5nID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmVl bWFwLnBhZGRpbmdJbm5lcih4KS5wYWRkaW5nT3V0ZXIoeCkgOiB0cmVlbWFwLnBhZGRpbmdJbm5l cigpOwogIH07CgogIHRyZWVtYXAucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oeCkgewogICAgcmV0 dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gdHlwZW9mIHggPT09ICJmdW5j dGlvbiIgPyB4IDogY29uc3RhbnQkOSgreCksIHRyZWVtYXApIDogcGFkZGluZ0lubmVyOwogIH07 CgogIHRyZWVtYXAucGFkZGluZ091dGVyID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyB0cmVlbWFwLnBhZGRpbmdUb3AoeCkucGFkZGluZ1JpZ2h0KHgpLnBhZGRp bmdCb3R0b20oeCkucGFkZGluZ0xlZnQoeCkgOiB0cmVlbWFwLnBhZGRpbmdUb3AoKTsKICB9OwoK ICB0cmVlbWFwLnBhZGRpbmdUb3AgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRz Lmxlbmd0aCA/IChwYWRkaW5nVG9wID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29u c3RhbnQkOSgreCksIHRyZWVtYXApIDogcGFkZGluZ1RvcDsKICB9OwoKICB0cmVlbWFwLnBhZGRp bmdSaWdodCA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBh ZGRpbmdSaWdodCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGNvbnN0YW50JDkoK3gp LCB0cmVlbWFwKSA6IHBhZGRpbmdSaWdodDsKICB9OwoKICB0cmVlbWFwLnBhZGRpbmdCb3R0b20g PSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nQm90 dG9tID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQkOSgreCksIHRyZWVt YXApIDogcGFkZGluZ0JvdHRvbTsKICB9OwoKICB0cmVlbWFwLnBhZGRpbmdMZWZ0ID0gZnVuY3Rp b24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0xlZnQgPSB0eXBl b2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCQ5KCt4KSwgdHJlZW1hcCkgOiBwYWRk aW5nTGVmdDsKICB9OwoKICByZXR1cm4gdHJlZW1hcDsKfQoKZnVuY3Rpb24gYmluYXJ5KHBhcmVu dCwgeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sCiAgICAg IGksIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgIHN1bSwgc3VtcyA9IG5ldyBBcnJheShuICsgMSk7 CgogIGZvciAoc3Vtc1swXSA9IHN1bSA9IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICBzdW1zW2kg KyAxXSA9IHN1bSArPSBub2Rlc1tpXS52YWx1ZTsKICB9CgogIHBhcnRpdGlvbigwLCBuLCBwYXJl bnQudmFsdWUsIHgwLCB5MCwgeDEsIHkxKTsKCiAgZnVuY3Rpb24gcGFydGl0aW9uKGksIGosIHZh bHVlLCB4MCwgeTAsIHgxLCB5MSkgewogICAgaWYgKGkgPj0gaiAtIDEpIHsKICAgICAgdmFyIG5v ZGUgPSBub2Rlc1tpXTsKICAgICAgbm9kZS54MCA9IHgwLCBub2RlLnkwID0geTA7CiAgICAgIG5v ZGUueDEgPSB4MSwgbm9kZS55MSA9IHkxOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIHZh bHVlT2Zmc2V0ID0gc3Vtc1tpXSwKICAgICAgICB2YWx1ZVRhcmdldCA9ICh2YWx1ZSAvIDIpICsg dmFsdWVPZmZzZXQsCiAgICAgICAgayA9IGkgKyAxLAogICAgICAgIGhpID0gaiAtIDE7CgogICAg d2hpbGUgKGsgPCBoaSkgewogICAgICB2YXIgbWlkID0gayArIGhpID4+PiAxOwogICAgICBpZiAo c3Vtc1ttaWRdIDwgdmFsdWVUYXJnZXQpIGsgPSBtaWQgKyAxOwogICAgICBlbHNlIGhpID0gbWlk OwogICAgfQoKICAgIGlmICgodmFsdWVUYXJnZXQgLSBzdW1zW2sgLSAxXSkgPCAoc3Vtc1trXSAt IHZhbHVlVGFyZ2V0KSAmJiBpICsgMSA8IGspIC0tazsKCiAgICB2YXIgdmFsdWVMZWZ0ID0gc3Vt c1trXSAtIHZhbHVlT2Zmc2V0LAogICAgICAgIHZhbHVlUmlnaHQgPSB2YWx1ZSAtIHZhbHVlTGVm dDsKCiAgICBpZiAoKHgxIC0geDApID4gKHkxIC0geTApKSB7CiAgICAgIHZhciB4ayA9ICh4MCAq IHZhbHVlUmlnaHQgKyB4MSAqIHZhbHVlTGVmdCkgLyB2YWx1ZTsKICAgICAgcGFydGl0aW9uKGks IGssIHZhbHVlTGVmdCwgeDAsIHkwLCB4aywgeTEpOwogICAgICBwYXJ0aXRpb24oaywgaiwgdmFs dWVSaWdodCwgeGssIHkwLCB4MSwgeTEpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHlrID0gKHkw ICogdmFsdWVSaWdodCArIHkxICogdmFsdWVMZWZ0KSAvIHZhbHVlOwogICAgICBwYXJ0aXRpb24o aSwgaywgdmFsdWVMZWZ0LCB4MCwgeTAsIHgxLCB5ayk7CiAgICAgIHBhcnRpdGlvbihrLCBqLCB2 YWx1ZVJpZ2h0LCB4MCwgeWssIHgxLCB5MSk7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBzbGljZURp Y2UocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgewogIChwYXJlbnQuZGVwdGggJiAxID8gdHJlZW1h cFNsaWNlIDogdHJlZW1hcERpY2UpKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpOwp9Cgp2YXIgcmVz cXVhcmlmeSA9IChmdW5jdGlvbiBjdXN0b20ocmF0aW8pIHsKCiAgZnVuY3Rpb24gcmVzcXVhcmlm eShwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7CiAgICBpZiAoKHJvd3MgPSBwYXJlbnQuX3NxdWFy aWZ5KSAmJiAocm93cy5yYXRpbyA9PT0gcmF0aW8pKSB7CiAgICAgIHZhciByb3dzLAogICAgICAg ICAgcm93LAogICAgICAgICAgbm9kZXMsCiAgICAgICAgICBpLAogICAgICAgICAgaiA9IC0xLAog ICAgICAgICAgbiwKICAgICAgICAgIG0gPSByb3dzLmxlbmd0aCwKICAgICAgICAgIHZhbHVlID0g cGFyZW50LnZhbHVlOwoKICAgICAgd2hpbGUgKCsraiA8IG0pIHsKICAgICAgICByb3cgPSByb3dz W2pdLCBub2RlcyA9IHJvdy5jaGlsZHJlbjsKICAgICAgICBmb3IgKGkgPSByb3cudmFsdWUgPSAw LCBuID0gbm9kZXMubGVuZ3RoOyBpIDwgbjsgKytpKSByb3cudmFsdWUgKz0gbm9kZXNbaV0udmFs dWU7CiAgICAgICAgaWYgKHJvdy5kaWNlKSB0cmVlbWFwRGljZShyb3csIHgwLCB5MCwgeDEsIHkw ICs9ICh5MSAtIHkwKSAqIHJvdy52YWx1ZSAvIHZhbHVlKTsKICAgICAgICBlbHNlIHRyZWVtYXBT bGljZShyb3csIHgwLCB5MCwgeDAgKz0gKHgxIC0geDApICogcm93LnZhbHVlIC8gdmFsdWUsIHkx KTsKICAgICAgICB2YWx1ZSAtPSByb3cudmFsdWU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAg IHBhcmVudC5fc3F1YXJpZnkgPSByb3dzID0gc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4 MCwgeTAsIHgxLCB5MSk7CiAgICAgIHJvd3MucmF0aW8gPSByYXRpbzsKICAgIH0KICB9CgogIHJl c3F1YXJpZnkucmF0aW8gPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gY3VzdG9tKCh4ID0gK3gp ID4gMSA/IHggOiAxKTsKICB9OwoKICByZXR1cm4gcmVzcXVhcmlmeTsKfSkocGhpKTsKCmZ1bmN0 aW9uIGFyZWEkMihwb2x5Z29uKSB7CiAgdmFyIGkgPSAtMSwKICAgICAgbiA9IHBvbHlnb24ubGVu Z3RoLAogICAgICBhLAogICAgICBiID0gcG9seWdvbltuIC0gMV0sCiAgICAgIGFyZWEgPSAwOwoK ICB3aGlsZSAoKytpIDwgbikgewogICAgYSA9IGI7CiAgICBiID0gcG9seWdvbltpXTsKICAgIGFy ZWEgKz0gYVsxXSAqIGJbMF0gLSBhWzBdICogYlsxXTsKICB9CgogIHJldHVybiBhcmVhIC8gMjsK fQoKZnVuY3Rpb24gY2VudHJvaWQkMShwb2x5Z29uKSB7CiAgdmFyIGkgPSAtMSwKICAgICAgbiA9 IHBvbHlnb24ubGVuZ3RoLAogICAgICB4ID0gMCwKICAgICAgeSA9IDAsCiAgICAgIGEsCiAgICAg IGIgPSBwb2x5Z29uW24gLSAxXSwKICAgICAgYywKICAgICAgayA9IDA7CgogIHdoaWxlICgrK2kg PCBuKSB7CiAgICBhID0gYjsKICAgIGIgPSBwb2x5Z29uW2ldOwogICAgayArPSBjID0gYVswXSAq IGJbMV0gLSBiWzBdICogYVsxXTsKICAgIHggKz0gKGFbMF0gKyBiWzBdKSAqIGM7CiAgICB5ICs9 IChhWzFdICsgYlsxXSkgKiBjOwogIH0KCiAgcmV0dXJuIGsgKj0gMywgW3ggLyBrLCB5IC8ga107 Cn0KCi8vIFJldHVybnMgdGhlIDJEIGNyb3NzIHByb2R1Y3Qgb2YgQUIgYW5kIEFDIHZlY3RvcnMs IGkuZS4sIHRoZSB6LWNvbXBvbmVudCBvZgovLyB0aGUgM0QgY3Jvc3MgcHJvZHVjdCBpbiBhIHF1 YWRyYW50IEkgQ2FydGVzaWFuIGNvb3JkaW5hdGUgc3lzdGVtICgreCBpcwovLyByaWdodCwgK3kg aXMgdXApLiBSZXR1cm5zIGEgcG9zaXRpdmUgdmFsdWUgaWYgQUJDIGlzIGNvdW50ZXItY2xvY2t3 aXNlLAovLyBuZWdhdGl2ZSBpZiBjbG9ja3dpc2UsIGFuZCB6ZXJvIGlmIHRoZSBwb2ludHMgYXJl IGNvbGxpbmVhci4KZnVuY3Rpb24gY3Jvc3MkMShhLCBiLCBjKSB7CiAgcmV0dXJuIChiWzBdIC0g YVswXSkgKiAoY1sxXSAtIGFbMV0pIC0gKGJbMV0gLSBhWzFdKSAqIChjWzBdIC0gYVswXSk7Cn0K CmZ1bmN0aW9uIGxleGljb2dyYXBoaWNPcmRlcihhLCBiKSB7CiAgcmV0dXJuIGFbMF0gLSBiWzBd IHx8IGFbMV0gLSBiWzFdOwp9CgovLyBDb21wdXRlcyB0aGUgdXBwZXIgY29udmV4IGh1bGwgcGVy IHRoZSBtb25vdG9uZSBjaGFpbiBhbGdvcml0aG0uCi8vIEFzc3VtZXMgcG9pbnRzLmxlbmd0aCA+ PSAzLCBpcyBzb3J0ZWQgYnkgeCwgdW5pcXVlIGluIHkuCi8vIFJldHVybnMgYW4gYXJyYXkgb2Yg aW5kaWNlcyBpbnRvIHBvaW50cyBpbiBsZWZ0LXRvLXJpZ2h0IG9yZGVyLgpmdW5jdGlvbiBjb21w dXRlVXBwZXJIdWxsSW5kZXhlcyhwb2ludHMpIHsKICB2YXIgbiA9IHBvaW50cy5sZW5ndGgsCiAg ICAgIGluZGV4ZXMgPSBbMCwgMV0sCiAgICAgIHNpemUgPSAyOwoKICBmb3IgKHZhciBpID0gMjsg aSA8IG47ICsraSkgewogICAgd2hpbGUgKHNpemUgPiAxICYmIGNyb3NzJDEocG9pbnRzW2luZGV4 ZXNbc2l6ZSAtIDJdXSwgcG9pbnRzW2luZGV4ZXNbc2l6ZSAtIDFdXSwgcG9pbnRzW2ldKSA8PSAw KSAtLXNpemU7CiAgICBpbmRleGVzW3NpemUrK10gPSBpOwogIH0KCiAgcmV0dXJuIGluZGV4ZXMu c2xpY2UoMCwgc2l6ZSk7IC8vIHJlbW92ZSBwb3BwZWQgcG9pbnRzCn0KCmZ1bmN0aW9uIGh1bGwo cG9pbnRzKSB7CiAgaWYgKChuID0gcG9pbnRzLmxlbmd0aCkgPCAzKSByZXR1cm4gbnVsbDsKCiAg dmFyIGksCiAgICAgIG4sCiAgICAgIHNvcnRlZFBvaW50cyA9IG5ldyBBcnJheShuKSwKICAgICAg ZmxpcHBlZFBvaW50cyA9IG5ldyBBcnJheShuKTsKCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkg c29ydGVkUG9pbnRzW2ldID0gWytwb2ludHNbaV1bMF0sICtwb2ludHNbaV1bMV0sIGldOwogIHNv cnRlZFBvaW50cy5zb3J0KGxleGljb2dyYXBoaWNPcmRlcik7CiAgZm9yIChpID0gMDsgaSA8IG47 ICsraSkgZmxpcHBlZFBvaW50c1tpXSA9IFtzb3J0ZWRQb2ludHNbaV1bMF0sIC1zb3J0ZWRQb2lu dHNbaV1bMV1dOwoKICB2YXIgdXBwZXJJbmRleGVzID0gY29tcHV0ZVVwcGVySHVsbEluZGV4ZXMo c29ydGVkUG9pbnRzKSwKICAgICAgbG93ZXJJbmRleGVzID0gY29tcHV0ZVVwcGVySHVsbEluZGV4 ZXMoZmxpcHBlZFBvaW50cyk7CgogIC8vIENvbnN0cnVjdCB0aGUgaHVsbCBwb2x5Z29uLCByZW1v dmluZyBwb3NzaWJsZSBkdXBsaWNhdGUgZW5kcG9pbnRzLgogIHZhciBza2lwTGVmdCA9IGxvd2Vy SW5kZXhlc1swXSA9PT0gdXBwZXJJbmRleGVzWzBdLAogICAgICBza2lwUmlnaHQgPSBsb3dlcklu ZGV4ZXNbbG93ZXJJbmRleGVzLmxlbmd0aCAtIDFdID09PSB1cHBlckluZGV4ZXNbdXBwZXJJbmRl eGVzLmxlbmd0aCAtIDFdLAogICAgICBodWxsID0gW107CgogIC8vIEFkZCB1cHBlciBodWxsIGlu IHJpZ2h0LXRvLWwgb3JkZXIuCiAgLy8gVGhlbiBhZGQgbG93ZXIgaHVsbCBpbiBsZWZ0LXRvLXJp Z2h0IG9yZGVyLgogIGZvciAoaSA9IHVwcGVySW5kZXhlcy5sZW5ndGggLSAxOyBpID49IDA7IC0t aSkgaHVsbC5wdXNoKHBvaW50c1tzb3J0ZWRQb2ludHNbdXBwZXJJbmRleGVzW2ldXVsyXV0pOwog IGZvciAoaSA9ICtza2lwTGVmdDsgaSA8IGxvd2VySW5kZXhlcy5sZW5ndGggLSBza2lwUmlnaHQ7 ICsraSkgaHVsbC5wdXNoKHBvaW50c1tzb3J0ZWRQb2ludHNbbG93ZXJJbmRleGVzW2ldXVsyXV0p OwoKICByZXR1cm4gaHVsbDsKfQoKZnVuY3Rpb24gY29udGFpbnMkMihwb2x5Z29uLCBwb2ludCkg ewogIHZhciBuID0gcG9seWdvbi5sZW5ndGgsCiAgICAgIHAgPSBwb2x5Z29uW24gLSAxXSwKICAg ICAgeCA9IHBvaW50WzBdLCB5ID0gcG9pbnRbMV0sCiAgICAgIHgwID0gcFswXSwgeTAgPSBwWzFd LAogICAgICB4MSwgeTEsCiAgICAgIGluc2lkZSA9IGZhbHNlOwoKICBmb3IgKHZhciBpID0gMDsg aSA8IG47ICsraSkgewogICAgcCA9IHBvbHlnb25baV0sIHgxID0gcFswXSwgeTEgPSBwWzFdOwog ICAgaWYgKCgoeTEgPiB5KSAhPT0gKHkwID4geSkpICYmICh4IDwgKHgwIC0geDEpICogKHkgLSB5 MSkgLyAoeTAgLSB5MSkgKyB4MSkpIGluc2lkZSA9ICFpbnNpZGU7CiAgICB4MCA9IHgxLCB5MCA9 IHkxOwogIH0KCiAgcmV0dXJuIGluc2lkZTsKfQoKZnVuY3Rpb24gbGVuZ3RoJDIocG9seWdvbikg ewogIHZhciBpID0gLTEsCiAgICAgIG4gPSBwb2x5Z29uLmxlbmd0aCwKICAgICAgYiA9IHBvbHln b25bbiAtIDFdLAogICAgICB4YSwKICAgICAgeWEsCiAgICAgIHhiID0gYlswXSwKICAgICAgeWIg PSBiWzFdLAogICAgICBwZXJpbWV0ZXIgPSAwOwoKICB3aGlsZSAoKytpIDwgbikgewogICAgeGEg PSB4YjsKICAgIHlhID0geWI7CiAgICBiID0gcG9seWdvbltpXTsKICAgIHhiID0gYlswXTsKICAg IHliID0gYlsxXTsKICAgIHhhIC09IHhiOwogICAgeWEgLT0geWI7CiAgICBwZXJpbWV0ZXIgKz0g TWF0aC5zcXJ0KHhhICogeGEgKyB5YSAqIHlhKTsKICB9CgogIHJldHVybiBwZXJpbWV0ZXI7Cn0K CmZ1bmN0aW9uIGRlZmF1bHRTb3VyY2UkMSgpIHsKICByZXR1cm4gTWF0aC5yYW5kb20oKTsKfQoK dmFyIHVuaWZvcm0gPSAoZnVuY3Rpb24gc291cmNlUmFuZG9tVW5pZm9ybShzb3VyY2UpIHsKICBm dW5jdGlvbiByYW5kb21Vbmlmb3JtKG1pbiwgbWF4KSB7CiAgICBtaW4gPSBtaW4gPT0gbnVsbCA/ IDAgOiArbWluOwogICAgbWF4ID0gbWF4ID09IG51bGwgPyAxIDogK21heDsKICAgIGlmIChhcmd1 bWVudHMubGVuZ3RoID09PSAxKSBtYXggPSBtaW4sIG1pbiA9IDA7CiAgICBlbHNlIG1heCAtPSBt aW47CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzb3VyY2UoKSAqIG1heCAr IG1pbjsKICAgIH07CiAgfQoKICByYW5kb21Vbmlmb3JtLnNvdXJjZSA9IHNvdXJjZVJhbmRvbVVu aWZvcm07CgogIHJldHVybiByYW5kb21Vbmlmb3JtOwp9KShkZWZhdWx0U291cmNlJDEpOwoKdmFy IG5vcm1hbCA9IChmdW5jdGlvbiBzb3VyY2VSYW5kb21Ob3JtYWwoc291cmNlKSB7CiAgZnVuY3Rp b24gcmFuZG9tTm9ybWFsKG11LCBzaWdtYSkgewogICAgdmFyIHgsIHI7CiAgICBtdSA9IG11ID09 IG51bGwgPyAwIDogK211OwogICAgc2lnbWEgPSBzaWdtYSA9PSBudWxsID8gMSA6ICtzaWdtYTsK ICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHk7CgogICAgICAvLyBJZiBhdmFpbGFi bGUsIHVzZSB0aGUgc2Vjb25kIHByZXZpb3VzbHktZ2VuZXJhdGVkIHVuaWZvcm0gcmFuZG9tLgog ICAgICBpZiAoeCAhPSBudWxsKSB5ID0geCwgeCA9IG51bGw7CgogICAgICAvLyBPdGhlcndpc2Us IGdlbmVyYXRlIGEgbmV3IHggYW5kIHkuCiAgICAgIGVsc2UgZG8gewogICAgICAgIHggPSBzb3Vy Y2UoKSAqIDIgLSAxOwogICAgICAgIHkgPSBzb3VyY2UoKSAqIDIgLSAxOwogICAgICAgIHIgPSB4 ICogeCArIHkgKiB5OwogICAgICB9IHdoaWxlICghciB8fCByID4gMSk7CgogICAgICByZXR1cm4g bXUgKyBzaWdtYSAqIHkgKiBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpOwogICAgfTsK ICB9CgogIHJhbmRvbU5vcm1hbC5zb3VyY2UgPSBzb3VyY2VSYW5kb21Ob3JtYWw7CgogIHJldHVy biByYW5kb21Ob3JtYWw7Cn0pKGRlZmF1bHRTb3VyY2UkMSk7Cgp2YXIgbG9nTm9ybWFsID0gKGZ1 bmN0aW9uIHNvdXJjZVJhbmRvbUxvZ05vcm1hbChzb3VyY2UpIHsKICBmdW5jdGlvbiByYW5kb21M b2dOb3JtYWwoKSB7CiAgICB2YXIgcmFuZG9tTm9ybWFsID0gbm9ybWFsLnNvdXJjZShzb3VyY2Up LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHJl dHVybiBNYXRoLmV4cChyYW5kb21Ob3JtYWwoKSk7CiAgICB9OwogIH0KCiAgcmFuZG9tTG9nTm9y bWFsLnNvdXJjZSA9IHNvdXJjZVJhbmRvbUxvZ05vcm1hbDsKCiAgcmV0dXJuIHJhbmRvbUxvZ05v cm1hbDsKfSkoZGVmYXVsdFNvdXJjZSQxKTsKCnZhciBpcndpbkhhbGwgPSAoZnVuY3Rpb24gc291 cmNlUmFuZG9tSXJ3aW5IYWxsKHNvdXJjZSkgewogIGZ1bmN0aW9uIHJhbmRvbUlyd2luSGFsbChu KSB7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIHN1bSA9IDAsIGkgPSAw OyBpIDwgbjsgKytpKSBzdW0gKz0gc291cmNlKCk7CiAgICAgIHJldHVybiBzdW07CiAgICB9Owog IH0KCiAgcmFuZG9tSXJ3aW5IYWxsLnNvdXJjZSA9IHNvdXJjZVJhbmRvbUlyd2luSGFsbDsKCiAg cmV0dXJuIHJhbmRvbUlyd2luSGFsbDsKfSkoZGVmYXVsdFNvdXJjZSQxKTsKCnZhciBiYXRlcyA9 IChmdW5jdGlvbiBzb3VyY2VSYW5kb21CYXRlcyhzb3VyY2UpIHsKICBmdW5jdGlvbiByYW5kb21C YXRlcyhuKSB7CiAgICB2YXIgcmFuZG9tSXJ3aW5IYWxsID0gaXJ3aW5IYWxsLnNvdXJjZShzb3Vy Y2UpKG4pOwogICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcmFuZG9tSXJ3aW5I YWxsKCkgLyBuOwogICAgfTsKICB9CgogIHJhbmRvbUJhdGVzLnNvdXJjZSA9IHNvdXJjZVJhbmRv bUJhdGVzOwoKICByZXR1cm4gcmFuZG9tQmF0ZXM7Cn0pKGRlZmF1bHRTb3VyY2UkMSk7Cgp2YXIg ZXhwb25lbnRpYWwkMSA9IChmdW5jdGlvbiBzb3VyY2VSYW5kb21FeHBvbmVudGlhbChzb3VyY2Up IHsKICBmdW5jdGlvbiByYW5kb21FeHBvbmVudGlhbChsYW1iZGEpIHsKICAgIHJldHVybiBmdW5j dGlvbigpIHsKICAgICAgcmV0dXJuIC1NYXRoLmxvZygxIC0gc291cmNlKCkpIC8gbGFtYmRhOwog ICAgfTsKICB9CgogIHJhbmRvbUV4cG9uZW50aWFsLnNvdXJjZSA9IHNvdXJjZVJhbmRvbUV4cG9u ZW50aWFsOwoKICByZXR1cm4gcmFuZG9tRXhwb25lbnRpYWw7Cn0pKGRlZmF1bHRTb3VyY2UkMSk7 CgpmdW5jdGlvbiBpbml0UmFuZ2UoZG9tYWluLCByYW5nZSkgewogIHN3aXRjaCAoYXJndW1lbnRz Lmxlbmd0aCkgewogICAgY2FzZSAwOiBicmVhazsKICAgIGNhc2UgMTogdGhpcy5yYW5nZShkb21h aW4pOyBicmVhazsKICAgIGRlZmF1bHQ6IHRoaXMucmFuZ2UocmFuZ2UpLmRvbWFpbihkb21haW4p OyBicmVhazsKICB9CiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0aW9uIGluaXRJbnRlcnBvbGF0b3Io ZG9tYWluLCBpbnRlcnBvbGF0b3IpIHsKICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHsKICAg IGNhc2UgMDogYnJlYWs7CiAgICBjYXNlIDE6IHRoaXMuaW50ZXJwb2xhdG9yKGRvbWFpbik7IGJy ZWFrOwogICAgZGVmYXVsdDogdGhpcy5pbnRlcnBvbGF0b3IoaW50ZXJwb2xhdG9yKS5kb21haW4o ZG9tYWluKTsgYnJlYWs7CiAgfQogIHJldHVybiB0aGlzOwp9Cgp2YXIgYXJyYXkkMyA9IEFycmF5 LnByb3RvdHlwZTsKCnZhciBtYXAkMyA9IGFycmF5JDMubWFwOwp2YXIgc2xpY2UkNSA9IGFycmF5 JDMuc2xpY2U7Cgp2YXIgaW1wbGljaXQgPSB7bmFtZTogImltcGxpY2l0In07CgpmdW5jdGlvbiBv cmRpbmFsKCkgewogIHZhciBpbmRleCA9IG1hcCQxKCksCiAgICAgIGRvbWFpbiA9IFtdLAogICAg ICByYW5nZSA9IFtdLAogICAgICB1bmtub3duID0gaW1wbGljaXQ7CgogIGZ1bmN0aW9uIHNjYWxl KGQpIHsKICAgIHZhciBrZXkgPSBkICsgIiIsIGkgPSBpbmRleC5nZXQoa2V5KTsKICAgIGlmICgh aSkgewogICAgICBpZiAodW5rbm93biAhPT0gaW1wbGljaXQpIHJldHVybiB1bmtub3duOwogICAg ICBpbmRleC5zZXQoa2V5LCBpID0gZG9tYWluLnB1c2goZCkpOwogICAgfQogICAgcmV0dXJuIHJh bmdlWyhpIC0gMSkgJSByYW5nZS5sZW5ndGhdOwogIH0KCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rp b24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7 CiAgICBkb21haW4gPSBbXSwgaW5kZXggPSBtYXAkMSgpOwogICAgdmFyIGkgPSAtMSwgbiA9IF8u bGVuZ3RoLCBkLCBrZXk7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpbmRleC5oYXMoa2V5ID0g KGQgPSBfW2ldKSArICIiKSkgaW5kZXguc2V0KGtleSwgZG9tYWluLnB1c2goZCkpOwogICAgcmV0 dXJuIHNjYWxlOwogIH07CgogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJu IGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBzbGljZSQ1LmNhbGwoXyksIHNjYWxlKSA6IHJh bmdlLnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duOwog IH07CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBvcmRpbmFsKGRvbWFp biwgcmFuZ2UpLnVua25vd24odW5rbm93bik7CiAgfTsKCiAgaW5pdFJhbmdlLmFwcGx5KHNjYWxl LCBhcmd1bWVudHMpOwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIGJhbmQoKSB7CiAgdmFy IHNjYWxlID0gb3JkaW5hbCgpLnVua25vd24odW5kZWZpbmVkKSwKICAgICAgZG9tYWluID0gc2Nh bGUuZG9tYWluLAogICAgICBvcmRpbmFsUmFuZ2UgPSBzY2FsZS5yYW5nZSwKICAgICAgcmFuZ2Ug PSBbMCwgMV0sCiAgICAgIHN0ZXAsCiAgICAgIGJhbmR3aWR0aCwKICAgICAgcm91bmQgPSBmYWxz ZSwKICAgICAgcGFkZGluZ0lubmVyID0gMCwKICAgICAgcGFkZGluZ091dGVyID0gMCwKICAgICAg YWxpZ24gPSAwLjU7CgogIGRlbGV0ZSBzY2FsZS51bmtub3duOwoKICBmdW5jdGlvbiByZXNjYWxl KCkgewogICAgdmFyIG4gPSBkb21haW4oKS5sZW5ndGgsCiAgICAgICAgcmV2ZXJzZSA9IHJhbmdl WzFdIDwgcmFuZ2VbMF0sCiAgICAgICAgc3RhcnQgPSByYW5nZVtyZXZlcnNlIC0gMF0sCiAgICAg ICAgc3RvcCA9IHJhbmdlWzEgLSByZXZlcnNlXTsKICAgIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAv IE1hdGgubWF4KDEsIG4gLSBwYWRkaW5nSW5uZXIgKyBwYWRkaW5nT3V0ZXIgKiAyKTsKICAgIGlm IChyb3VuZCkgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7CiAgICBzdGFydCArPSAoc3RvcCAtIHN0 YXJ0IC0gc3RlcCAqIChuIC0gcGFkZGluZ0lubmVyKSkgKiBhbGlnbjsKICAgIGJhbmR3aWR0aCA9 IHN0ZXAgKiAoMSAtIHBhZGRpbmdJbm5lcik7CiAgICBpZiAocm91bmQpIHN0YXJ0ID0gTWF0aC5y b3VuZChzdGFydCksIGJhbmR3aWR0aCA9IE1hdGgucm91bmQoYmFuZHdpZHRoKTsKICAgIHZhciB2 YWx1ZXMgPSBzZXF1ZW5jZShuKS5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gc3RhcnQgKyBzdGVw ICogaTsgfSk7CiAgICByZXR1cm4gb3JkaW5hbFJhbmdlKHJldmVyc2UgPyB2YWx1ZXMucmV2ZXJz ZSgpIDogdmFsdWVzKTsKICB9CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbihfKSwgcmVzY2FsZSgpKSA6IGRvbWFpbigp OwogIH07CgogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50 cy5sZW5ndGggPyAocmFuZ2UgPSBbK19bMF0sICtfWzFdXSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNs aWNlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biByYW5nZSA9IFsrX1swXSwgK19bMV1dLCByb3VuZCA9IHRydWUsIHJlc2NhbGUoKTsKICB9OwoK ICBzY2FsZS5iYW5kd2lkdGggPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBiYW5kd2lkdGg7CiAg fTsKCiAgc2NhbGUuc3RlcCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHN0ZXA7CiAgfTsKCiAg c2NhbGUucm91bmQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ IChyb3VuZCA9ICEhXywgcmVzY2FsZSgpKSA6IHJvdW5kOwogIH07CgogIHNjYWxlLnBhZGRpbmcg PSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5u ZXIgPSBNYXRoLm1pbigxLCBwYWRkaW5nT3V0ZXIgPSArXyksIHJlc2NhbGUoKSkgOiBwYWRkaW5n SW5uZXI7CiAgfTsKCiAgc2NhbGUucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oXykgewogICAgcmV0 dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gTWF0aC5taW4oMSwgXyksIHJl c2NhbGUoKSkgOiBwYWRkaW5nSW5uZXI7CiAgfTsKCiAgc2NhbGUucGFkZGluZ091dGVyID0gZnVu Y3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ091dGVyID0g K18sIHJlc2NhbGUoKSkgOiBwYWRkaW5nT3V0ZXI7CiAgfTsKCiAgc2NhbGUuYWxpZ24gPSBmdW5j dGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbGlnbiA9IE1hdGgubWF4 KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IGFsaWduOwogIH07CgogIHNjYWxlLmNv cHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBiYW5kKGRvbWFpbigpLCByYW5nZSkKICAgICAg ICAucm91bmQocm91bmQpCiAgICAgICAgLnBhZGRpbmdJbm5lcihwYWRkaW5nSW5uZXIpCiAgICAg ICAgLnBhZGRpbmdPdXRlcihwYWRkaW5nT3V0ZXIpCiAgICAgICAgLmFsaWduKGFsaWduKTsKICB9 OwoKICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHJlc2NhbGUoKSwgYXJndW1lbnRzKTsKfQoKZnVu Y3Rpb24gcG9pbnRpc2goc2NhbGUpIHsKICB2YXIgY29weSA9IHNjYWxlLmNvcHk7CgogIHNjYWxl LnBhZGRpbmcgPSBzY2FsZS5wYWRkaW5nT3V0ZXI7CiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdJbm5l cjsKICBkZWxldGUgc2NhbGUucGFkZGluZ091dGVyOwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24o KSB7CiAgICByZXR1cm4gcG9pbnRpc2goY29weSgpKTsKICB9OwoKICByZXR1cm4gc2NhbGU7Cn0K CmZ1bmN0aW9uIHBvaW50JDEoKSB7CiAgcmV0dXJuIHBvaW50aXNoKGJhbmQuYXBwbHkobnVsbCwg YXJndW1lbnRzKS5wYWRkaW5nSW5uZXIoMSkpOwp9CgpmdW5jdGlvbiBjb25zdGFudCRhKHgpIHsK ICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geDsKICB9Owp9CgpmdW5jdGlvbiBudW1i ZXIkMih4KSB7CiAgcmV0dXJuICt4Owp9Cgp2YXIgdW5pdCA9IFswLCAxXTsKCmZ1bmN0aW9uIGlk ZW50aXR5JDYoeCkgewogIHJldHVybiB4Owp9CgpmdW5jdGlvbiBub3JtYWxpemUoYSwgYikgewog IHJldHVybiAoYiAtPSAoYSA9ICthKSkKICAgICAgPyBmdW5jdGlvbih4KSB7IHJldHVybiAoeCAt IGEpIC8gYjsgfQogICAgICA6IGNvbnN0YW50JGEoaXNOYU4oYikgPyBOYU4gOiAwLjUpOwp9Cgpm dW5jdGlvbiBjbGFtcGVyKGRvbWFpbikgewogIHZhciBhID0gZG9tYWluWzBdLCBiID0gZG9tYWlu W2RvbWFpbi5sZW5ndGggLSAxXSwgdDsKICBpZiAoYSA+IGIpIHQgPSBhLCBhID0gYiwgYiA9IHQ7 CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgubWF4KGEsIE1hdGgubWluKGIsIHgp KTsgfTsKfQoKLy8gbm9ybWFsaXplKGEsIGIpKHgpIHRha2VzIGEgZG9tYWluIHZhbHVlIHggaW4g W2EsYl0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHQgaW4gWzAsMV0u Ci8vIGludGVycG9sYXRlKGEsIGIpKHQpIHRha2VzIGEgcGFyYW1ldGVyIHQgaW4gWzAsMV0gYW5k IHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmFuZ2UgdmFsdWUgeCBpbiBbYSxiXS4KZnVuY3Rp b24gYmltYXAoZG9tYWluLCByYW5nZSwgaW50ZXJwb2xhdGUpIHsKICB2YXIgZDAgPSBkb21haW5b MF0sIGQxID0gZG9tYWluWzFdLCByMCA9IHJhbmdlWzBdLCByMSA9IHJhbmdlWzFdOwogIGlmIChk MSA8IGQwKSBkMCA9IG5vcm1hbGl6ZShkMSwgZDApLCByMCA9IGludGVycG9sYXRlKHIxLCByMCk7 CiAgZWxzZSBkMCA9IG5vcm1hbGl6ZShkMCwgZDEpLCByMCA9IGludGVycG9sYXRlKHIwLCByMSk7 CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHIwKGQwKHgpKTsgfTsKfQoKZnVuY3Rpb24g cG9seW1hcChkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSkgewogIHZhciBqID0gTWF0aC5taW4o ZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKSAtIDEsCiAgICAgIGQgPSBuZXcgQXJyYXkoaiks CiAgICAgIHIgPSBuZXcgQXJyYXkoaiksCiAgICAgIGkgPSAtMTsKCiAgLy8gUmV2ZXJzZSBkZXNj ZW5kaW5nIGRvbWFpbnMuCiAgaWYgKGRvbWFpbltqXSA8IGRvbWFpblswXSkgewogICAgZG9tYWlu ID0gZG9tYWluLnNsaWNlKCkucmV2ZXJzZSgpOwogICAgcmFuZ2UgPSByYW5nZS5zbGljZSgpLnJl dmVyc2UoKTsKICB9CgogIHdoaWxlICgrK2kgPCBqKSB7CiAgICBkW2ldID0gbm9ybWFsaXplKGRv bWFpbltpXSwgZG9tYWluW2kgKyAxXSk7CiAgICByW2ldID0gaW50ZXJwb2xhdGUocmFuZ2VbaV0s IHJhbmdlW2kgKyAxXSk7CiAgfQoKICByZXR1cm4gZnVuY3Rpb24oeCkgewogICAgdmFyIGkgPSBi aXNlY3RSaWdodChkb21haW4sIHgsIDEsIGopIC0gMTsKICAgIHJldHVybiByW2ldKGRbaV0oeCkp OwogIH07Cn0KCmZ1bmN0aW9uIGNvcHkoc291cmNlLCB0YXJnZXQpIHsKICByZXR1cm4gdGFyZ2V0 CiAgICAgIC5kb21haW4oc291cmNlLmRvbWFpbigpKQogICAgICAucmFuZ2Uoc291cmNlLnJhbmdl KCkpCiAgICAgIC5pbnRlcnBvbGF0ZShzb3VyY2UuaW50ZXJwb2xhdGUoKSkKICAgICAgLmNsYW1w KHNvdXJjZS5jbGFtcCgpKQogICAgICAudW5rbm93bihzb3VyY2UudW5rbm93bigpKTsKfQoKZnVu Y3Rpb24gdHJhbnNmb3JtZXIkMSgpIHsKICB2YXIgZG9tYWluID0gdW5pdCwKICAgICAgcmFuZ2Ug PSB1bml0LAogICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlVmFsdWUsCiAgICAgIHRyYW5z Zm9ybSwKICAgICAgdW50cmFuc2Zvcm0sCiAgICAgIHVua25vd24sCiAgICAgIGNsYW1wID0gaWRl bnRpdHkkNiwKICAgICAgcGllY2V3aXNlLAogICAgICBvdXRwdXQsCiAgICAgIGlucHV0OwoKICBm dW5jdGlvbiByZXNjYWxlKCkgewogICAgcGllY2V3aXNlID0gTWF0aC5taW4oZG9tYWluLmxlbmd0 aCwgcmFuZ2UubGVuZ3RoKSA+IDIgPyBwb2x5bWFwIDogYmltYXA7CiAgICBvdXRwdXQgPSBpbnB1 dCA9IG51bGw7CiAgICByZXR1cm4gc2NhbGU7CiAgfQoKICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAg ICByZXR1cm4gaXNOYU4oeCA9ICt4KSA/IHVua25vd24gOiAob3V0cHV0IHx8IChvdXRwdXQgPSBw aWVjZXdpc2UoZG9tYWluLm1hcCh0cmFuc2Zvcm0pLCByYW5nZSwgaW50ZXJwb2xhdGUpKSkodHJh bnNmb3JtKGNsYW1wKHgpKSk7CiAgfQoKICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7CiAg ICByZXR1cm4gY2xhbXAodW50cmFuc2Zvcm0oKGlucHV0IHx8IChpbnB1dCA9IHBpZWNld2lzZShy YW5nZSwgZG9tYWluLm1hcCh0cmFuc2Zvcm0pLCBpbnRlcnBvbGF0ZU51bWJlcikpKSh5KSkpOwog IH07CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMu bGVuZ3RoID8gKGRvbWFpbiA9IG1hcCQzLmNhbGwoXywgbnVtYmVyJDIpLCBjbGFtcCA9PT0gaWRl bnRpdHkkNiB8fCAoY2xhbXAgPSBjbGFtcGVyKGRvbWFpbikpLCByZXNjYWxlKCkpIDogZG9tYWlu LnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4g YXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IHNsaWNlJDUuY2FsbChfKSwgcmVzY2FsZSgpKSA6 IHJhbmdlLnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHsK ICAgIHJldHVybiByYW5nZSA9IHNsaWNlJDUuY2FsbChfKSwgaW50ZXJwb2xhdGUgPSBpbnRlcnBv bGF0ZVJvdW5kLCByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7 CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9IF8gPyBjbGFtcGVyKGRvbWFp bikgOiBpZGVudGl0eSQ2LCBzY2FsZSkgOiBjbGFtcCAhPT0gaWRlbnRpdHkkNjsKICB9OwoKICBz Y2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVu Z3RoID8gKGludGVycG9sYXRlID0gXywgcmVzY2FsZSgpKSA6IGludGVycG9sYXRlOwogIH07Cgog IHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjsKICB9OwoKICByZXR1cm4gZnVuY3Rp b24odCwgdSkgewogICAgdHJhbnNmb3JtID0gdCwgdW50cmFuc2Zvcm0gPSB1OwogICAgcmV0dXJu IHJlc2NhbGUoKTsKICB9Owp9CgpmdW5jdGlvbiBjb250aW51b3VzKHRyYW5zZm9ybSwgdW50cmFu c2Zvcm0pIHsKICByZXR1cm4gdHJhbnNmb3JtZXIkMSgpKHRyYW5zZm9ybSwgdW50cmFuc2Zvcm0p Owp9CgpmdW5jdGlvbiB0aWNrRm9ybWF0KHN0YXJ0LCBzdG9wLCBjb3VudCwgc3BlY2lmaWVyKSB7 CiAgdmFyIHN0ZXAgPSB0aWNrU3RlcChzdGFydCwgc3RvcCwgY291bnQpLAogICAgICBwcmVjaXNp b247CiAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciA9PSBudWxsID8gIixm IiA6IHNwZWNpZmllcik7CiAgc3dpdGNoIChzcGVjaWZpZXIudHlwZSkgewogICAgY2FzZSAicyI6 IHsKICAgICAgdmFyIHZhbHVlID0gTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhz dG9wKSk7CiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHBy ZWNpc2lvbiA9IHByZWNpc2lvblByZWZpeChzdGVwLCB2YWx1ZSkpKSBzcGVjaWZpZXIucHJlY2lz aW9uID0gcHJlY2lzaW9uOwogICAgICByZXR1cm4gZXhwb3J0cy5mb3JtYXRQcmVmaXgoc3BlY2lm aWVyLCB2YWx1ZSk7CiAgICB9CiAgICBjYXNlICIiOgogICAgY2FzZSAiZSI6CiAgICBjYXNlICJn IjoKICAgIGNhc2UgInAiOgogICAgY2FzZSAiciI6IHsKICAgICAgaWYgKHNwZWNpZmllci5wcmVj aXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gcHJlY2lzaW9uUm91bmQoc3RlcCwg TWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhzdG9wKSkpKSkgc3BlY2lmaWVyLnBy ZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gImUiKTsKICAgICAgYnJl YWs7CiAgICB9CiAgICBjYXNlICJmIjoKICAgIGNhc2UgIiUiOiB7CiAgICAgIGlmIChzcGVjaWZp ZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvbkZpeGVk KHN0ZXApKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlw ZSA9PT0gIiUiKSAqIDI7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gZXhwb3J0cy5m b3JtYXQoc3BlY2lmaWVyKTsKfQoKZnVuY3Rpb24gbGluZWFyaXNoKHNjYWxlKSB7CiAgdmFyIGRv bWFpbiA9IHNjYWxlLmRvbWFpbjsKCiAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihjb3VudCkgewog ICAgdmFyIGQgPSBkb21haW4oKTsKICAgIHJldHVybiB0aWNrcyhkWzBdLCBkW2QubGVuZ3RoIC0g MV0sIGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50KTsKICB9OwoKICBzY2FsZS50aWNrRm9ybWF0 ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikgewogICAgdmFyIGQgPSBkb21haW4oKTsKICAg IHJldHVybiB0aWNrRm9ybWF0KGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgY291bnQgPT0gbnVsbCA/ IDEwIDogY291bnQsIHNwZWNpZmllcik7CiAgfTsKCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGNv dW50KSB7CiAgICBpZiAoY291bnQgPT0gbnVsbCkgY291bnQgPSAxMDsKCiAgICB2YXIgZCA9IGRv bWFpbigpLAogICAgICAgIGkwID0gMCwKICAgICAgICBpMSA9IGQubGVuZ3RoIC0gMSwKICAgICAg ICBzdGFydCA9IGRbaTBdLAogICAgICAgIHN0b3AgPSBkW2kxXSwKICAgICAgICBzdGVwOwoKICAg IGlmIChzdG9wIDwgc3RhcnQpIHsKICAgICAgc3RlcCA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0 b3AgPSBzdGVwOwogICAgICBzdGVwID0gaTAsIGkwID0gaTEsIGkxID0gc3RlcDsKICAgIH0KCiAg ICBzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpOwoKICAgIGlmIChzdGVw ID4gMCkgewogICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnQgLyBzdGVwKSAqIHN0ZXA7CiAg ICAgIHN0b3AgPSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDsKICAgICAgc3RlcCA9IHRp Y2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KTsKICAgIH0gZWxzZSBpZiAoc3RlcCA8IDAp IHsKICAgICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgKiBzdGVwKSAvIHN0ZXA7CiAgICAgIHN0 b3AgPSBNYXRoLmZsb29yKHN0b3AgKiBzdGVwKSAvIHN0ZXA7CiAgICAgIHN0ZXAgPSB0aWNrSW5j cmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7CiAgICB9CgogICAgaWYgKHN0ZXAgPiAwKSB7CiAg ICAgIGRbaTBdID0gTWF0aC5mbG9vcihzdGFydCAvIHN0ZXApICogc3RlcDsKICAgICAgZFtpMV0g PSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDsKICAgICAgZG9tYWluKGQpOwogICAgfSBl bHNlIGlmIChzdGVwIDwgMCkgewogICAgICBkW2kwXSA9IE1hdGguY2VpbChzdGFydCAqIHN0ZXAp IC8gc3RlcDsKICAgICAgZFtpMV0gPSBNYXRoLmZsb29yKHN0b3AgKiBzdGVwKSAvIHN0ZXA7CiAg ICAgIGRvbWFpbihkKTsKICAgIH0KCiAgICByZXR1cm4gc2NhbGU7CiAgfTsKCiAgcmV0dXJuIHNj YWxlOwp9CgpmdW5jdGlvbiBsaW5lYXIkMigpIHsKICB2YXIgc2NhbGUgPSBjb250aW51b3VzKGlk ZW50aXR5JDYsIGlkZW50aXR5JDYpOwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICBy ZXR1cm4gY29weShzY2FsZSwgbGluZWFyJDIoKSk7CiAgfTsKCiAgaW5pdFJhbmdlLmFwcGx5KHNj YWxlLCBhcmd1bWVudHMpOwoKICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsKfQoKZnVuY3Rpb24g aWRlbnRpdHkkNyhkb21haW4pIHsKICB2YXIgdW5rbm93bjsKCiAgZnVuY3Rpb24gc2NhbGUoeCkg ewogICAgcmV0dXJuIGlzTmFOKHggPSAreCkgPyB1bmtub3duIDogeDsKICB9CgogIHNjYWxlLmlu dmVydCA9IHNjYWxlOwoKICBzY2FsZS5kb21haW4gPSBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8p IHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IG1hcCQzLmNhbGwoXywg bnVtYmVyJDIpLCBzY2FsZSkgOiBkb21haW4uc2xpY2UoKTsKICB9OwoKICBzY2FsZS51bmtub3du ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9 IF8sIHNjYWxlKSA6IHVua25vd247CiAgfTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewog ICAgcmV0dXJuIGlkZW50aXR5JDcoZG9tYWluKS51bmtub3duKHVua25vd24pOwogIH07CgogIGRv bWFpbiA9IGFyZ3VtZW50cy5sZW5ndGggPyBtYXAkMy5jYWxsKGRvbWFpbiwgbnVtYmVyJDIpIDog WzAsIDFdOwoKICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsKfQoKZnVuY3Rpb24gbmljZShkb21h aW4sIGludGVydmFsKSB7CiAgZG9tYWluID0gZG9tYWluLnNsaWNlKCk7CgogIHZhciBpMCA9IDAs CiAgICAgIGkxID0gZG9tYWluLmxlbmd0aCAtIDEsCiAgICAgIHgwID0gZG9tYWluW2kwXSwKICAg ICAgeDEgPSBkb21haW5baTFdLAogICAgICB0OwoKICBpZiAoeDEgPCB4MCkgewogICAgdCA9IGkw LCBpMCA9IGkxLCBpMSA9IHQ7CiAgICB0ID0geDAsIHgwID0geDEsIHgxID0gdDsKICB9CgogIGRv bWFpbltpMF0gPSBpbnRlcnZhbC5mbG9vcih4MCk7CiAgZG9tYWluW2kxXSA9IGludGVydmFsLmNl aWwoeDEpOwogIHJldHVybiBkb21haW47Cn0KCmZ1bmN0aW9uIHRyYW5zZm9ybUxvZyh4KSB7CiAg cmV0dXJuIE1hdGgubG9nKHgpOwp9CgpmdW5jdGlvbiB0cmFuc2Zvcm1FeHAoeCkgewogIHJldHVy biBNYXRoLmV4cCh4KTsKfQoKZnVuY3Rpb24gdHJhbnNmb3JtTG9nbih4KSB7CiAgcmV0dXJuIC1N YXRoLmxvZygteCk7Cn0KCmZ1bmN0aW9uIHRyYW5zZm9ybUV4cG4oeCkgewogIHJldHVybiAtTWF0 aC5leHAoLXgpOwp9CgpmdW5jdGlvbiBwb3cxMCh4KSB7CiAgcmV0dXJuIGlzRmluaXRlKHgpID8g KygiMWUiICsgeCkgOiB4IDwgMCA/IDAgOiB4Owp9CgpmdW5jdGlvbiBwb3dwKGJhc2UpIHsKICBy ZXR1cm4gYmFzZSA9PT0gMTAgPyBwb3cxMAogICAgICA6IGJhc2UgPT09IE1hdGguRSA/IE1hdGgu ZXhwCiAgICAgIDogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5wb3coYmFzZSwgeCk7IH07Cn0K CmZ1bmN0aW9uIGxvZ3AoYmFzZSkgewogIHJldHVybiBiYXNlID09PSBNYXRoLkUgPyBNYXRoLmxv ZwogICAgICA6IGJhc2UgPT09IDEwICYmIE1hdGgubG9nMTAKICAgICAgfHwgYmFzZSA9PT0gMiAm JiBNYXRoLmxvZzIKICAgICAgfHwgKGJhc2UgPSBNYXRoLmxvZyhiYXNlKSwgZnVuY3Rpb24oeCkg eyByZXR1cm4gTWF0aC5sb2coeCkgLyBiYXNlOyB9KTsKfQoKZnVuY3Rpb24gcmVmbGVjdChmKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiAtZigteCk7CiAgfTsKfQoKZnVuY3Rp b24gbG9nZ2lzaCh0cmFuc2Zvcm0pIHsKICB2YXIgc2NhbGUgPSB0cmFuc2Zvcm0odHJhbnNmb3Jt TG9nLCB0cmFuc2Zvcm1FeHApLAogICAgICBkb21haW4gPSBzY2FsZS5kb21haW4sCiAgICAgIGJh c2UgPSAxMCwKICAgICAgbG9ncywKICAgICAgcG93czsKCiAgZnVuY3Rpb24gcmVzY2FsZSgpIHsK ICAgIGxvZ3MgPSBsb2dwKGJhc2UpLCBwb3dzID0gcG93cChiYXNlKTsKICAgIGlmIChkb21haW4o KVswXSA8IDApIHsKICAgICAgbG9ncyA9IHJlZmxlY3QobG9ncyksIHBvd3MgPSByZWZsZWN0KHBv d3MpOwogICAgICB0cmFuc2Zvcm0odHJhbnNmb3JtTG9nbiwgdHJhbnNmb3JtRXhwbik7CiAgICB9 IGVsc2UgewogICAgICB0cmFuc2Zvcm0odHJhbnNmb3JtTG9nLCB0cmFuc2Zvcm1FeHApOwogICAg fQogICAgcmV0dXJuIHNjYWxlOwogIH0KCiAgc2NhbGUuYmFzZSA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhc2UgPSArXywgcmVzY2FsZSgpKSA6IGJhc2U7 CiAgfTsKCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50 cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7CiAgfTsKCiAgc2Nh bGUudGlja3MgPSBmdW5jdGlvbihjb3VudCkgewogICAgdmFyIGQgPSBkb21haW4oKSwKICAgICAg ICB1ID0gZFswXSwKICAgICAgICB2ID0gZFtkLmxlbmd0aCAtIDFdLAogICAgICAgIHI7CgogICAg aWYgKHIgPSB2IDwgdSkgaSA9IHUsIHUgPSB2LCB2ID0gaTsKCiAgICB2YXIgaSA9IGxvZ3ModSks CiAgICAgICAgaiA9IGxvZ3ModiksCiAgICAgICAgcCwKICAgICAgICBrLAogICAgICAgIHQsCiAg ICAgICAgbiA9IGNvdW50ID09IG51bGwgPyAxMCA6ICtjb3VudCwKICAgICAgICB6ID0gW107Cgog ICAgaWYgKCEoYmFzZSAlIDEpICYmIGogLSBpIDwgbikgewogICAgICBpID0gTWF0aC5yb3VuZChp KSAtIDEsIGogPSBNYXRoLnJvdW5kKGopICsgMTsKICAgICAgaWYgKHUgPiAwKSBmb3IgKDsgaSA8 IGo7ICsraSkgewogICAgICAgIGZvciAoayA9IDEsIHAgPSBwb3dzKGkpOyBrIDwgYmFzZTsgKytr KSB7CiAgICAgICAgICB0ID0gcCAqIGs7CiAgICAgICAgICBpZiAodCA8IHUpIGNvbnRpbnVlOwog ICAgICAgICAgaWYgKHQgPiB2KSBicmVhazsKICAgICAgICAgIHoucHVzaCh0KTsKICAgICAgICB9 CiAgICAgIH0gZWxzZSBmb3IgKDsgaSA8IGo7ICsraSkgewogICAgICAgIGZvciAoayA9IGJhc2Ug LSAxLCBwID0gcG93cyhpKTsgayA+PSAxOyAtLWspIHsKICAgICAgICAgIHQgPSBwICogazsKICAg ICAgICAgIGlmICh0IDwgdSkgY29udGludWU7CiAgICAgICAgICBpZiAodCA+IHYpIGJyZWFrOwog ICAgICAgICAgei5wdXNoKHQpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAg eiA9IHRpY2tzKGksIGosIE1hdGgubWluKGogLSBpLCBuKSkubWFwKHBvd3MpOwogICAgfQoKICAg IHJldHVybiByID8gei5yZXZlcnNlKCkgOiB6OwogIH07CgogIHNjYWxlLnRpY2tGb3JtYXQgPSBm dW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7CiAgICBpZiAoc3BlY2lmaWVyID09IG51bGwpIHNw ZWNpZmllciA9IGJhc2UgPT09IDEwID8gIi4wZSIgOiAiLCI7CiAgICBpZiAodHlwZW9mIHNwZWNp ZmllciAhPT0gImZ1bmN0aW9uIikgc3BlY2lmaWVyID0gZXhwb3J0cy5mb3JtYXQoc3BlY2lmaWVy KTsKICAgIGlmIChjb3VudCA9PT0gSW5maW5pdHkpIHJldHVybiBzcGVjaWZpZXI7CiAgICBpZiAo Y291bnQgPT0gbnVsbCkgY291bnQgPSAxMDsKICAgIHZhciBrID0gTWF0aC5tYXgoMSwgYmFzZSAq IGNvdW50IC8gc2NhbGUudGlja3MoKS5sZW5ndGgpOyAvLyBUT0RPIGZhc3QgZXN0aW1hdGU/CiAg ICByZXR1cm4gZnVuY3Rpb24oZCkgewogICAgICB2YXIgaSA9IGQgLyBwb3dzKE1hdGgucm91bmQo bG9ncyhkKSkpOwogICAgICBpZiAoaSAqIGJhc2UgPCBiYXNlIC0gMC41KSBpICo9IGJhc2U7CiAg ICAgIHJldHVybiBpIDw9IGsgPyBzcGVjaWZpZXIoZCkgOiAiIjsKICAgIH07CiAgfTsKCiAgc2Nh bGUubmljZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGRvbWFpbihuaWNlKGRvbWFpbigpLCB7 CiAgICAgIGZsb29yOiBmdW5jdGlvbih4KSB7IHJldHVybiBwb3dzKE1hdGguZmxvb3IobG9ncyh4 KSkpOyB9LAogICAgICBjZWlsOiBmdW5jdGlvbih4KSB7IHJldHVybiBwb3dzKE1hdGguY2VpbChs b2dzKHgpKSk7IH0KICAgIH0pKTsKICB9OwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIGxv ZyQxKCkgewogIHZhciBzY2FsZSA9IGxvZ2dpc2godHJhbnNmb3JtZXIkMSgpKS5kb21haW4oWzEs IDEwXSk7CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBjb3B5KHNjYWxl LCBsb2ckMSgpKS5iYXNlKHNjYWxlLmJhc2UoKSk7CiAgfTsKCiAgaW5pdFJhbmdlLmFwcGx5KHNj YWxlLCBhcmd1bWVudHMpOwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIHRyYW5zZm9ybVN5 bWxvZyhjKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBNYXRoLnNpZ24oeCkg KiBNYXRoLmxvZzFwKE1hdGguYWJzKHggLyBjKSk7CiAgfTsKfQoKZnVuY3Rpb24gdHJhbnNmb3Jt U3ltZXhwKGMpIHsKICByZXR1cm4gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIE1hdGguc2lnbih4 KSAqIE1hdGguZXhwbTEoTWF0aC5hYnMoeCkpICogYzsKICB9Owp9CgpmdW5jdGlvbiBzeW1sb2dp c2godHJhbnNmb3JtKSB7CiAgdmFyIGMgPSAxLCBzY2FsZSA9IHRyYW5zZm9ybSh0cmFuc2Zvcm1T eW1sb2coYyksIHRyYW5zZm9ybVN5bWV4cChjKSk7CgogIHNjYWxlLmNvbnN0YW50ID0gZnVuY3Rp b24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmFuc2Zvcm0odHJhbnNmb3Jt U3ltbG9nKGMgPSArXyksIHRyYW5zZm9ybVN5bWV4cChjKSkgOiBjOwogIH07CgogIHJldHVybiBs aW5lYXJpc2goc2NhbGUpOwp9CgpmdW5jdGlvbiBzeW1sb2coKSB7CiAgdmFyIHNjYWxlID0gc3lt bG9naXNoKHRyYW5zZm9ybWVyJDEoKSk7CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAg IHJldHVybiBjb3B5KHNjYWxlLCBzeW1sb2coKSkuY29uc3RhbnQoc2NhbGUuY29uc3RhbnQoKSk7 CiAgfTsKCiAgcmV0dXJuIGluaXRSYW5nZS5hcHBseShzY2FsZSwgYXJndW1lbnRzKTsKfQoKZnVu Y3Rpb24gdHJhbnNmb3JtUG93KGV4cG9uZW50KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAg IHJldHVybiB4IDwgMCA/IC1NYXRoLnBvdygteCwgZXhwb25lbnQpIDogTWF0aC5wb3coeCwgZXhw b25lbnQpOwogIH07Cn0KCmZ1bmN0aW9uIHRyYW5zZm9ybVNxcnQoeCkgewogIHJldHVybiB4IDwg MCA/IC1NYXRoLnNxcnQoLXgpIDogTWF0aC5zcXJ0KHgpOwp9CgpmdW5jdGlvbiB0cmFuc2Zvcm1T cXVhcmUoeCkgewogIHJldHVybiB4IDwgMCA/IC14ICogeCA6IHggKiB4Owp9CgpmdW5jdGlvbiBw b3dpc2godHJhbnNmb3JtKSB7CiAgdmFyIHNjYWxlID0gdHJhbnNmb3JtKGlkZW50aXR5JDYsIGlk ZW50aXR5JDYpLAogICAgICBleHBvbmVudCA9IDE7CgogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAg ICByZXR1cm4gZXhwb25lbnQgPT09IDEgPyB0cmFuc2Zvcm0oaWRlbnRpdHkkNiwgaWRlbnRpdHkk NikKICAgICAgICA6IGV4cG9uZW50ID09PSAwLjUgPyB0cmFuc2Zvcm0odHJhbnNmb3JtU3FydCwg dHJhbnNmb3JtU3F1YXJlKQogICAgICAgIDogdHJhbnNmb3JtKHRyYW5zZm9ybVBvdyhleHBvbmVu dCksIHRyYW5zZm9ybVBvdygxIC8gZXhwb25lbnQpKTsKICB9CgogIHNjYWxlLmV4cG9uZW50ID0g ZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXhwb25lbnQgPSAr XywgcmVzY2FsZSgpKSA6IGV4cG9uZW50OwogIH07CgogIHJldHVybiBsaW5lYXJpc2goc2NhbGUp Owp9CgpmdW5jdGlvbiBwb3ckMSgpIHsKICB2YXIgc2NhbGUgPSBwb3dpc2godHJhbnNmb3JtZXIk MSgpKTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGNvcHkoc2NhbGUs IHBvdyQxKCkpLmV4cG9uZW50KHNjYWxlLmV4cG9uZW50KCkpOwogIH07CgogIGluaXRSYW5nZS5h cHBseShzY2FsZSwgYXJndW1lbnRzKTsKCiAgcmV0dXJuIHNjYWxlOwp9CgpmdW5jdGlvbiBzcXJ0 JDEoKSB7CiAgcmV0dXJuIHBvdyQxLmFwcGx5KG51bGwsIGFyZ3VtZW50cykuZXhwb25lbnQoMC41 KTsKfQoKZnVuY3Rpb24gcXVhbnRpbGUoKSB7CiAgdmFyIGRvbWFpbiA9IFtdLAogICAgICByYW5n ZSA9IFtdLAogICAgICB0aHJlc2hvbGRzID0gW10sCiAgICAgIHVua25vd247CgogIGZ1bmN0aW9u IHJlc2NhbGUoKSB7CiAgICB2YXIgaSA9IDAsIG4gPSBNYXRoLm1heCgxLCByYW5nZS5sZW5ndGgp OwogICAgdGhyZXNob2xkcyA9IG5ldyBBcnJheShuIC0gMSk7CiAgICB3aGlsZSAoKytpIDwgbikg dGhyZXNob2xkc1tpIC0gMV0gPSB0aHJlc2hvbGQoZG9tYWluLCBpIC8gbik7CiAgICByZXR1cm4g c2NhbGU7CiAgfQoKICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICByZXR1cm4gaXNOYU4oeCA9ICt4 KSA/IHVua25vd24gOiByYW5nZVtiaXNlY3RSaWdodCh0aHJlc2hvbGRzLCB4KV07CiAgfQoKICBz Y2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7CiAgICB2YXIgaSA9IHJhbmdlLmluZGV4 T2YoeSk7CiAgICByZXR1cm4gaSA8IDAgPyBbTmFOLCBOYU5dIDogWwogICAgICBpID4gMCA/IHRo cmVzaG9sZHNbaSAtIDFdIDogZG9tYWluWzBdLAogICAgICBpIDwgdGhyZXNob2xkcy5sZW5ndGgg PyB0aHJlc2hvbGRzW2ldIDogZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXQogICAgXTsKICB9OwoK ICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgp IHJldHVybiBkb21haW4uc2xpY2UoKTsKICAgIGRvbWFpbiA9IFtdOwogICAgZm9yICh2YXIgaSA9 IDAsIG4gPSBfLmxlbmd0aCwgZDsgaSA8IG47ICsraSkgaWYgKGQgPSBfW2ldLCBkICE9IG51bGwg JiYgIWlzTmFOKGQgPSArZCkpIGRvbWFpbi5wdXNoKGQpOwogICAgZG9tYWluLnNvcnQoYXNjZW5k aW5nKTsKICAgIHJldHVybiByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlv bihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IHNsaWNlJDUuY2Fs bChfKSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUudW5rbm93biA9 IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBf LCBzY2FsZSkgOiB1bmtub3duOwogIH07CgogIHNjYWxlLnF1YW50aWxlcyA9IGZ1bmN0aW9uKCkg ewogICAgcmV0dXJuIHRocmVzaG9sZHMuc2xpY2UoKTsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVu Y3Rpb24oKSB7CiAgICByZXR1cm4gcXVhbnRpbGUoKQogICAgICAgIC5kb21haW4oZG9tYWluKQog ICAgICAgIC5yYW5nZShyYW5nZSkKICAgICAgICAudW5rbm93bih1bmtub3duKTsKICB9OwoKICBy ZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwp9CgpmdW5jdGlvbiBxdWFu dGl6ZSQxKCkgewogIHZhciB4MCA9IDAsCiAgICAgIHgxID0gMSwKICAgICAgbiA9IDEsCiAgICAg IGRvbWFpbiA9IFswLjVdLAogICAgICByYW5nZSA9IFswLCAxXSwKICAgICAgdW5rbm93bjsKCiAg ZnVuY3Rpb24gc2NhbGUoeCkgewogICAgcmV0dXJuIHggPD0geCA/IHJhbmdlW2Jpc2VjdFJpZ2h0 KGRvbWFpbiwgeCwgMCwgbildIDogdW5rbm93bjsKICB9CgogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7 CiAgICB2YXIgaSA9IC0xOwogICAgZG9tYWluID0gbmV3IEFycmF5KG4pOwogICAgd2hpbGUgKCsr aSA8IG4pIGRvbWFpbltpXSA9ICgoaSArIDEpICogeDEgLSAoaSAtIG4pICogeDApIC8gKG4gKyAx KTsKICAgIHJldHVybiBzY2FsZTsKICB9CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsK ICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gK19bMF0sIHgxID0gK19bMV0sIHJl c2NhbGUoKSkgOiBbeDAsIHgxXTsKICB9OwoKICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsK ICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG4gPSAocmFuZ2UgPSBzbGljZSQ1LmNhbGwo XykpLmxlbmd0aCAtIDEsIHJlc2NhbGUoKSkgOiByYW5nZS5zbGljZSgpOwogIH07CgogIHNjYWxl LmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHsKICAgIHZhciBpID0gcmFuZ2UuaW5kZXhPZih5 KTsKICAgIHJldHVybiBpIDwgMCA/IFtOYU4sIE5hTl0KICAgICAgICA6IGkgPCAxID8gW3gwLCBk b21haW5bMF1dCiAgICAgICAgOiBpID49IG4gPyBbZG9tYWluW24gLSAxXSwgeDFdCiAgICAgICAg OiBbZG9tYWluW2kgLSAxXSwgZG9tYWluW2ldXTsKICB9OwoKICBzY2FsZS51bmtub3duID0gZnVu Y3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNj YWxlKSA6IHNjYWxlOwogIH07CgogIHNjYWxlLnRocmVzaG9sZHMgPSBmdW5jdGlvbigpIHsKICAg IHJldHVybiBkb21haW4uc2xpY2UoKTsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7 CiAgICByZXR1cm4gcXVhbnRpemUkMSgpCiAgICAgICAgLmRvbWFpbihbeDAsIHgxXSkKICAgICAg ICAucmFuZ2UocmFuZ2UpCiAgICAgICAgLnVua25vd24odW5rbm93bik7CiAgfTsKCiAgcmV0dXJu IGluaXRSYW5nZS5hcHBseShsaW5lYXJpc2goc2NhbGUpLCBhcmd1bWVudHMpOwp9CgpmdW5jdGlv biB0aHJlc2hvbGQkMSgpIHsKICB2YXIgZG9tYWluID0gWzAuNV0sCiAgICAgIHJhbmdlID0gWzAs IDFdLAogICAgICB1bmtub3duLAogICAgICBuID0gMTsKCiAgZnVuY3Rpb24gc2NhbGUoeCkgewog ICAgcmV0dXJuIHggPD0geCA/IHJhbmdlW2Jpc2VjdFJpZ2h0KGRvbWFpbiwgeCwgMCwgbildIDog dW5rbm93bjsKICB9CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBh cmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IHNsaWNlJDUuY2FsbChfKSwgbiA9IE1hdGgubWlu KGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCAtIDEpLCBzY2FsZSkgOiBkb21haW4uc2xpY2Uo KTsKICB9OwoKICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID8gKHJhbmdlID0gc2xpY2UkNS5jYWxsKF8pLCBuID0gTWF0aC5taW4oZG9tYWlu Lmxlbmd0aCwgcmFuZ2UubGVuZ3RoIC0gMSksIHNjYWxlKSA6IHJhbmdlLnNsaWNlKCk7CiAgfTsK CiAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgewogICAgdmFyIGkgPSByYW5nZS5p bmRleE9mKHkpOwogICAgcmV0dXJuIFtkb21haW5baSAtIDFdLCBkb21haW5baV1dOwogIH07Cgog IHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjsKICB9OwoKICBzY2FsZS5jb3B5ID0g ZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhyZXNob2xkJDEoKQogICAgICAgIC5kb21haW4oZG9t YWluKQogICAgICAgIC5yYW5nZShyYW5nZSkKICAgICAgICAudW5rbm93bih1bmtub3duKTsKICB9 OwoKICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwp9Cgp2YXIgdDAk MSA9IG5ldyBEYXRlLAogICAgdDEkMSA9IG5ldyBEYXRlOwoKZnVuY3Rpb24gbmV3SW50ZXJ2YWwo Zmxvb3JpLCBvZmZzZXRpLCBjb3VudCwgZmllbGQpIHsKCiAgZnVuY3Rpb24gaW50ZXJ2YWwoZGF0 ZSkgewogICAgcmV0dXJuIGZsb29yaShkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMCA/IG5l dyBEYXRlIDogbmV3IERhdGUoK2RhdGUpKSwgZGF0ZTsKICB9CgogIGludGVydmFsLmZsb29yID0g ZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0dXJuIGZsb29yaShkYXRlID0gbmV3IERhdGUoK2RhdGUp KSwgZGF0ZTsKICB9OwoKICBpbnRlcnZhbC5jZWlsID0gZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0 dXJuIGZsb29yaShkYXRlID0gbmV3IERhdGUoZGF0ZSAtIDEpKSwgb2Zmc2V0aShkYXRlLCAxKSwg Zmxvb3JpKGRhdGUpLCBkYXRlOwogIH07CgogIGludGVydmFsLnJvdW5kID0gZnVuY3Rpb24oZGF0 ZSkgewogICAgdmFyIGQwID0gaW50ZXJ2YWwoZGF0ZSksCiAgICAgICAgZDEgPSBpbnRlcnZhbC5j ZWlsKGRhdGUpOwogICAgcmV0dXJuIGRhdGUgLSBkMCA8IGQxIC0gZGF0ZSA/IGQwIDogZDE7CiAg fTsKCiAgaW50ZXJ2YWwub2Zmc2V0ID0gZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgcmV0dXJu IG9mZnNldGkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSwgc3RlcCA9PSBudWxsID8gMSA6IE1hdGgu Zmxvb3Ioc3RlcCkpLCBkYXRlOwogIH07CgogIGludGVydmFsLnJhbmdlID0gZnVuY3Rpb24oc3Rh cnQsIHN0b3AsIHN0ZXApIHsKICAgIHZhciByYW5nZSA9IFtdLCBwcmV2aW91czsKICAgIHN0YXJ0 ID0gaW50ZXJ2YWwuY2VpbChzdGFydCk7CiAgICBzdGVwID0gc3RlcCA9PSBudWxsID8gMSA6IE1h dGguZmxvb3Ioc3RlcCk7CiAgICBpZiAoIShzdGFydCA8IHN0b3ApIHx8ICEoc3RlcCA+IDApKSBy ZXR1cm4gcmFuZ2U7IC8vIGFsc28gaGFuZGxlcyBJbnZhbGlkIERhdGUKICAgIGRvIHJhbmdlLnB1 c2gocHJldmlvdXMgPSBuZXcgRGF0ZSgrc3RhcnQpKSwgb2Zmc2V0aShzdGFydCwgc3RlcCksIGZs b29yaShzdGFydCk7CiAgICB3aGlsZSAocHJldmlvdXMgPCBzdGFydCAmJiBzdGFydCA8IHN0b3Ap OwogICAgcmV0dXJuIHJhbmdlOwogIH07CgogIGludGVydmFsLmZpbHRlciA9IGZ1bmN0aW9uKHRl c3QpIHsKICAgIHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICAgIGlmIChk YXRlID49IGRhdGUpIHdoaWxlIChmbG9vcmkoZGF0ZSksICF0ZXN0KGRhdGUpKSBkYXRlLnNldFRp bWUoZGF0ZSAtIDEpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBpZiAoZGF0 ZSA+PSBkYXRlKSB7CiAgICAgICAgaWYgKHN0ZXAgPCAwKSB3aGlsZSAoKytzdGVwIDw9IDApIHsK ICAgICAgICAgIHdoaWxlIChvZmZzZXRpKGRhdGUsIC0xKSwgIXRlc3QoZGF0ZSkpIHt9IC8vIGVz bGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHkKICAgICAgICB9IGVsc2Ugd2hpbGUgKC0tc3RlcCA+ PSAwKSB7CiAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCArMSksICF0ZXN0KGRhdGUpKSB7 fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5CiAgICAgICAgfQogICAgICB9CiAgICB9 KTsKICB9OwoKICBpZiAoY291bnQpIHsKICAgIGludGVydmFsLmNvdW50ID0gZnVuY3Rpb24oc3Rh cnQsIGVuZCkgewogICAgICB0MCQxLnNldFRpbWUoK3N0YXJ0KSwgdDEkMS5zZXRUaW1lKCtlbmQp OwogICAgICBmbG9vcmkodDAkMSksIGZsb29yaSh0MSQxKTsKICAgICAgcmV0dXJuIE1hdGguZmxv b3IoY291bnQodDAkMSwgdDEkMSkpOwogICAgfTsKCiAgICBpbnRlcnZhbC5ldmVyeSA9IGZ1bmN0 aW9uKHN0ZXApIHsKICAgICAgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7CiAgICAgIHJldHVybiAh aXNGaW5pdGUoc3RlcCkgfHwgIShzdGVwID4gMCkgPyBudWxsCiAgICAgICAgICA6ICEoc3RlcCA+ IDEpID8gaW50ZXJ2YWwKICAgICAgICAgIDogaW50ZXJ2YWwuZmlsdGVyKGZpZWxkCiAgICAgICAg ICAgICAgPyBmdW5jdGlvbihkKSB7IHJldHVybiBmaWVsZChkKSAlIHN0ZXAgPT09IDA7IH0KICAg ICAgICAgICAgICA6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGludGVydmFsLmNvdW50KDAsIGQpICUg c3RlcCA9PT0gMDsgfSk7CiAgICB9OwogIH0KCiAgcmV0dXJuIGludGVydmFsOwp9Cgp2YXIgbWls bGlzZWNvbmQgPSBuZXdJbnRlcnZhbChmdW5jdGlvbigpIHsKICAvLyBub29wCn0sIGZ1bmN0aW9u KGRhdGUsIHN0ZXApIHsKICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwKTsKfSwgZnVuY3Rpb24o c3RhcnQsIGVuZCkgewogIHJldHVybiBlbmQgLSBzdGFydDsKfSk7CgovLyBBbiBvcHRpbWl6ZWQg aW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuCm1pbGxpc2Vjb25kLmV2ZXJ5ID0g ZnVuY3Rpb24oaykgewogIGsgPSBNYXRoLmZsb29yKGspOwogIGlmICghaXNGaW5pdGUoaykgfHwg IShrID4gMCkpIHJldHVybiBudWxsOwogIGlmICghKGsgPiAxKSkgcmV0dXJuIG1pbGxpc2Vjb25k OwogIHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICBkYXRlLnNldFRpbWUo TWF0aC5mbG9vcihkYXRlIC8gaykgKiBrKTsKICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAg ICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogayk7CiAgfSwgZnVuY3Rpb24oc3RhcnQsIGVu ZCkgewogICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBrOwogIH0pOwp9Owp2YXIgbWlsbGlzZWNv bmRzID0gbWlsbGlzZWNvbmQucmFuZ2U7Cgp2YXIgZHVyYXRpb25TZWNvbmQgPSAxZTM7CnZhciBk dXJhdGlvbk1pbnV0ZSA9IDZlNDsKdmFyIGR1cmF0aW9uSG91ciA9IDM2ZTU7CnZhciBkdXJhdGlv bkRheSA9IDg2NGU1Owp2YXIgZHVyYXRpb25XZWVrID0gNjA0OGU1OwoKdmFyIHNlY29uZCA9IG5l d0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICBkYXRlLnNldFRpbWUoZGF0ZSAtIGRhdGUuZ2V0 TWlsbGlzZWNvbmRzKCkpOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRUaW1l KCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uU2Vjb25kKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkg ewogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25TZWNvbmQ7Cn0sIGZ1bmN0aW9uKGRh dGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENTZWNvbmRzKCk7Cn0pOwp2YXIgc2Vjb25kcyA9IHNl Y29uZC5yYW5nZTsKCnZhciBtaW51dGUgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAg ZGF0ZS5zZXRUaW1lKGRhdGUgLSBkYXRlLmdldE1pbGxpc2Vjb25kcygpIC0gZGF0ZS5nZXRTZWNv bmRzKCkgKiBkdXJhdGlvblNlY29uZCk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRl LnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25NaW51dGUpOwp9LCBmdW5jdGlvbihzdGFy dCwgZW5kKSB7CiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbk1pbnV0ZTsKfSwgZnVu Y3Rpb24oZGF0ZSkgewogIHJldHVybiBkYXRlLmdldE1pbnV0ZXMoKTsKfSk7CnZhciBtaW51dGVz ID0gbWludXRlLnJhbmdlOwoKdmFyIGhvdXIgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7 CiAgZGF0ZS5zZXRUaW1lKGRhdGUgLSBkYXRlLmdldE1pbGxpc2Vjb25kcygpIC0gZGF0ZS5nZXRT ZWNvbmRzKCkgKiBkdXJhdGlvblNlY29uZCAtIGRhdGUuZ2V0TWludXRlcygpICogZHVyYXRpb25N aW51dGUpOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsg c3RlcCAqIGR1cmF0aW9uSG91cik7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICByZXR1cm4g KGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uSG91cjsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJldHVy biBkYXRlLmdldEhvdXJzKCk7Cn0pOwp2YXIgaG91cnMgPSBob3VyLnJhbmdlOwoKdmFyIGRheSA9 IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDAp Owp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgp ICsgc3RlcCk7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICByZXR1cm4gKGVuZCAtIHN0YXJ0 IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkg KiBkdXJhdGlvbk1pbnV0ZSkgLyBkdXJhdGlvbkRheTsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJl dHVybiBkYXRlLmdldERhdGUoKSAtIDE7Cn0pOwp2YXIgZGF5cyA9IGRheS5yYW5nZTsKCmZ1bmN0 aW9uIHdlZWtkYXkoaSkgewogIHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAg ICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIDcgLSBpKSAl IDcpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICB9LCBmdW5jdGlvbihkYXRlLCBz dGVwKSB7CiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwICogNyk7CiAgfSwg ZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgcmV0dXJuIChlbmQgLSBzdGFydCAtIChlbmQuZ2V0 VGltZXpvbmVPZmZzZXQoKSAtIHN0YXJ0LmdldFRpbWV6b25lT2Zmc2V0KCkpICogZHVyYXRpb25N aW51dGUpIC8gZHVyYXRpb25XZWVrOwogIH0pOwp9Cgp2YXIgc3VuZGF5ID0gd2Vla2RheSgwKTsK dmFyIG1vbmRheSA9IHdlZWtkYXkoMSk7CnZhciB0dWVzZGF5ID0gd2Vla2RheSgyKTsKdmFyIHdl ZG5lc2RheSA9IHdlZWtkYXkoMyk7CnZhciB0aHVyc2RheSA9IHdlZWtkYXkoNCk7CnZhciBmcmlk YXkgPSB3ZWVrZGF5KDUpOwp2YXIgc2F0dXJkYXkgPSB3ZWVrZGF5KDYpOwoKdmFyIHN1bmRheXMg PSBzdW5kYXkucmFuZ2U7CnZhciBtb25kYXlzID0gbW9uZGF5LnJhbmdlOwp2YXIgdHVlc2RheXMg PSB0dWVzZGF5LnJhbmdlOwp2YXIgd2VkbmVzZGF5cyA9IHdlZG5lc2RheS5yYW5nZTsKdmFyIHRo dXJzZGF5cyA9IHRodXJzZGF5LnJhbmdlOwp2YXIgZnJpZGF5cyA9IGZyaWRheS5yYW5nZTsKdmFy IHNhdHVyZGF5cyA9IHNhdHVyZGF5LnJhbmdlOwoKdmFyIG1vbnRoID0gbmV3SW50ZXJ2YWwoZnVu Y3Rpb24oZGF0ZSkgewogIGRhdGUuc2V0RGF0ZSgxKTsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAs IDApOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1v bnRoKCkgKyBzdGVwKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJldHVybiBlbmQuZ2V0 TW9udGgoKSAtIHN0YXJ0LmdldE1vbnRoKCkgKyAoZW5kLmdldEZ1bGxZZWFyKCkgLSBzdGFydC5n ZXRGdWxsWWVhcigpKSAqIDEyOwp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0 TW9udGgoKTsKfSk7CnZhciBtb250aHMgPSBtb250aC5yYW5nZTsKCnZhciB5ZWFyID0gbmV3SW50 ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogIGRhdGUuc2V0TW9udGgoMCwgMSk7CiAgZGF0ZS5zZXRI b3VycygwLCAwLCAwLCAwKTsKfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogIGRhdGUuc2V0RnVs bFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgc3RlcCk7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQp IHsKICByZXR1cm4gZW5kLmdldEZ1bGxZZWFyKCkgLSBzdGFydC5nZXRGdWxsWWVhcigpOwp9LCBm dW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTsKfSk7CgovLyBBbiBv cHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuCnllYXIuZXZlcnkg PSBmdW5jdGlvbihrKSB7CiAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwg IShrID4gMCkgPyBudWxsIDogbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgZGF0ZS5z ZXRGdWxsWWVhcihNYXRoLmZsb29yKGRhdGUuZ2V0RnVsbFllYXIoKSAvIGspICogayk7CiAgICBk YXRlLnNldE1vbnRoKDAsIDEpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICB9LCBm dW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFll YXIoKSArIHN0ZXAgKiBrKTsKICB9KTsKfTsKdmFyIHllYXJzID0geWVhci5yYW5nZTsKCnZhciB1 dGNNaW51dGUgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgZGF0ZS5zZXRVVENTZWNv bmRzKDAsIDApOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRUaW1lKCtkYXRl ICsgc3RlcCAqIGR1cmF0aW9uTWludXRlKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJl dHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGU7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsK ICByZXR1cm4gZGF0ZS5nZXRVVENNaW51dGVzKCk7Cn0pOwp2YXIgdXRjTWludXRlcyA9IHV0Y01p bnV0ZS5yYW5nZTsKCnZhciB1dGNIb3VyID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewog IGRhdGUuc2V0VVRDTWludXRlcygwLCAwLCAwKTsKfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewog IGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbkhvdXIpOwp9LCBmdW5jdGlvbihz dGFydCwgZW5kKSB7CiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkhvdXI7Cn0sIGZ1 bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENIb3VycygpOwp9KTsKdmFyIHV0Y0hv dXJzID0gdXRjSG91ci5yYW5nZTsKCnZhciB1dGNEYXkgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihk YXRlKSB7CiAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKfSwgZnVuY3Rpb24oZGF0ZSwg c3RlcCkgewogIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIHN0ZXApOwp9LCBm dW5jdGlvbihzdGFydCwgZW5kKSB7CiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkRh eTsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJldHVybiBkYXRlLmdldFVUQ0RhdGUoKSAtIDE7Cn0p Owp2YXIgdXRjRGF5cyA9IHV0Y0RheS5yYW5nZTsKCmZ1bmN0aW9uIHV0Y1dlZWtkYXkoaSkgewog IHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICBkYXRlLnNldFVUQ0RhdGUo ZGF0ZS5nZXRVVENEYXRlKCkgLSAoZGF0ZS5nZXRVVENEYXkoKSArIDcgLSBpKSAlIDcpOwogICAg ZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7 CiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBzdGVwICogNyk7CiAgfSwg ZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlv bldlZWs7CiAgfSk7Cn0KCnZhciB1dGNTdW5kYXkgPSB1dGNXZWVrZGF5KDApOwp2YXIgdXRjTW9u ZGF5ID0gdXRjV2Vla2RheSgxKTsKdmFyIHV0Y1R1ZXNkYXkgPSB1dGNXZWVrZGF5KDIpOwp2YXIg dXRjV2VkbmVzZGF5ID0gdXRjV2Vla2RheSgzKTsKdmFyIHV0Y1RodXJzZGF5ID0gdXRjV2Vla2Rh eSg0KTsKdmFyIHV0Y0ZyaWRheSA9IHV0Y1dlZWtkYXkoNSk7CnZhciB1dGNTYXR1cmRheSA9IHV0 Y1dlZWtkYXkoNik7Cgp2YXIgdXRjU3VuZGF5cyA9IHV0Y1N1bmRheS5yYW5nZTsKdmFyIHV0Y01v bmRheXMgPSB1dGNNb25kYXkucmFuZ2U7CnZhciB1dGNUdWVzZGF5cyA9IHV0Y1R1ZXNkYXkucmFu Z2U7CnZhciB1dGNXZWRuZXNkYXlzID0gdXRjV2VkbmVzZGF5LnJhbmdlOwp2YXIgdXRjVGh1cnNk YXlzID0gdXRjVGh1cnNkYXkucmFuZ2U7CnZhciB1dGNGcmlkYXlzID0gdXRjRnJpZGF5LnJhbmdl Owp2YXIgdXRjU2F0dXJkYXlzID0gdXRjU2F0dXJkYXkucmFuZ2U7Cgp2YXIgdXRjTW9udGggPSBu ZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgZGF0ZS5zZXRVVENEYXRlKDEpOwogIGRhdGUu c2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRl LnNldFVUQ01vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSArIHN0ZXApOwp9LCBmdW5jdGlvbihzdGFy dCwgZW5kKSB7CiAgcmV0dXJuIGVuZC5nZXRVVENNb250aCgpIC0gc3RhcnQuZ2V0VVRDTW9udGgo KSArIChlbmQuZ2V0VVRDRnVsbFllYXIoKSAtIHN0YXJ0LmdldFVUQ0Z1bGxZZWFyKCkpICogMTI7 Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENNb250aCgpOwp9KTsKdmFy IHV0Y01vbnRocyA9IHV0Y01vbnRoLnJhbmdlOwoKdmFyIHV0Y1llYXIgPSBuZXdJbnRlcnZhbChm dW5jdGlvbihkYXRlKSB7CiAgZGF0ZS5zZXRVVENNb250aCgwLCAxKTsKICBkYXRlLnNldFVUQ0hv dXJzKDAsIDAsIDAsIDApOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRVVENG dWxsWWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgKyBzdGVwKTsKfSwgZnVuY3Rpb24oc3RhcnQs IGVuZCkgewogIHJldHVybiBlbmQuZ2V0VVRDRnVsbFllYXIoKSAtIHN0YXJ0LmdldFVUQ0Z1bGxZ ZWFyKCk7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENGdWxsWWVhcigp Owp9KTsKCi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2Fz ZS4KdXRjWWVhci5ldmVyeSA9IGZ1bmN0aW9uKGspIHsKICByZXR1cm4gIWlzRmluaXRlKGsgPSBN YXRoLmZsb29yKGspKSB8fCAhKGsgPiAwKSA/IG51bGwgOiBuZXdJbnRlcnZhbChmdW5jdGlvbihk YXRlKSB7CiAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3IoZGF0ZS5nZXRVVENGdWxs WWVhcigpIC8gaykgKiBrKTsKICAgIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7CiAgICBkYXRlLnNl dFVUQ0hvdXJzKDAsIDAsIDAsIDApOwogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgIGRh dGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCAqIGspOwogIH0p Owp9Owp2YXIgdXRjWWVhcnMgPSB1dGNZZWFyLnJhbmdlOwoKZnVuY3Rpb24gbG9jYWxEYXRlKGQp IHsKICBpZiAoMCA8PSBkLnkgJiYgZC55IDwgMTAwKSB7CiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRl KC0xLCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKTsKICAgIGRhdGUuc2V0RnVsbFllYXIo ZC55KTsKICAgIHJldHVybiBkYXRlOwogIH0KICByZXR1cm4gbmV3IERhdGUoZC55LCBkLm0sIGQu ZCwgZC5ILCBkLk0sIGQuUywgZC5MKTsKfQoKZnVuY3Rpb24gdXRjRGF0ZShkKSB7CiAgaWYgKDAg PD0gZC55ICYmIGQueSA8IDEwMCkgewogICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQygt MSwgZC5tLCBkLmQsIGQuSCwgZC5NLCBkLlMsIGQuTCkpOwogICAgZGF0ZS5zZXRVVENGdWxsWWVh cihkLnkpOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhk LnksIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpKTsKfQoKZnVuY3Rpb24gbmV3RGF0ZSh5 LCBtLCBkKSB7CiAgcmV0dXJuIHt5OiB5LCBtOiBtLCBkOiBkLCBIOiAwLCBNOiAwLCBTOiAwLCBM OiAwfTsKfQoKZnVuY3Rpb24gZm9ybWF0TG9jYWxlJDEobG9jYWxlKSB7CiAgdmFyIGxvY2FsZV9k YXRlVGltZSA9IGxvY2FsZS5kYXRlVGltZSwKICAgICAgbG9jYWxlX2RhdGUgPSBsb2NhbGUuZGF0 ZSwKICAgICAgbG9jYWxlX3RpbWUgPSBsb2NhbGUudGltZSwKICAgICAgbG9jYWxlX3BlcmlvZHMg PSBsb2NhbGUucGVyaW9kcywKICAgICAgbG9jYWxlX3dlZWtkYXlzID0gbG9jYWxlLmRheXMsCiAg ICAgIGxvY2FsZV9zaG9ydFdlZWtkYXlzID0gbG9jYWxlLnNob3J0RGF5cywKICAgICAgbG9jYWxl X21vbnRocyA9IGxvY2FsZS5tb250aHMsCiAgICAgIGxvY2FsZV9zaG9ydE1vbnRocyA9IGxvY2Fs ZS5zaG9ydE1vbnRoczsKCiAgdmFyIHBlcmlvZFJlID0gZm9ybWF0UmUobG9jYWxlX3BlcmlvZHMp LAogICAgICBwZXJpb2RMb29rdXAgPSBmb3JtYXRMb29rdXAobG9jYWxlX3BlcmlvZHMpLAogICAg ICB3ZWVrZGF5UmUgPSBmb3JtYXRSZShsb2NhbGVfd2Vla2RheXMpLAogICAgICB3ZWVrZGF5TG9v a3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV93ZWVrZGF5cyksCiAgICAgIHNob3J0V2Vla2RheVJl ID0gZm9ybWF0UmUobG9jYWxlX3Nob3J0V2Vla2RheXMpLAogICAgICBzaG9ydFdlZWtkYXlMb29r dXAgPSBmb3JtYXRMb29rdXAobG9jYWxlX3Nob3J0V2Vla2RheXMpLAogICAgICBtb250aFJlID0g Zm9ybWF0UmUobG9jYWxlX21vbnRocyksCiAgICAgIG1vbnRoTG9va3VwID0gZm9ybWF0TG9va3Vw KGxvY2FsZV9tb250aHMpLAogICAgICBzaG9ydE1vbnRoUmUgPSBmb3JtYXRSZShsb2NhbGVfc2hv cnRNb250aHMpLAogICAgICBzaG9ydE1vbnRoTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9z aG9ydE1vbnRocyk7CgogIHZhciBmb3JtYXRzID0gewogICAgImEiOiBmb3JtYXRTaG9ydFdlZWtk YXksCiAgICAiQSI6IGZvcm1hdFdlZWtkYXksCiAgICAiYiI6IGZvcm1hdFNob3J0TW9udGgsCiAg ICAiQiI6IGZvcm1hdE1vbnRoLAogICAgImMiOiBudWxsLAogICAgImQiOiBmb3JtYXREYXlPZk1v bnRoLAogICAgImUiOiBmb3JtYXREYXlPZk1vbnRoLAogICAgImYiOiBmb3JtYXRNaWNyb3NlY29u ZHMsCiAgICAiSCI6IGZvcm1hdEhvdXIyNCwKICAgICJJIjogZm9ybWF0SG91cjEyLAogICAgImoi OiBmb3JtYXREYXlPZlllYXIsCiAgICAiTCI6IGZvcm1hdE1pbGxpc2Vjb25kcywKICAgICJtIjog Zm9ybWF0TW9udGhOdW1iZXIsCiAgICAiTSI6IGZvcm1hdE1pbnV0ZXMsCiAgICAicCI6IGZvcm1h dFBlcmlvZCwKICAgICJxIjogZm9ybWF0UXVhcnRlciwKICAgICJRIjogZm9ybWF0VW5peFRpbWVz dGFtcCwKICAgICJzIjogZm9ybWF0VW5peFRpbWVzdGFtcFNlY29uZHMsCiAgICAiUyI6IGZvcm1h dFNlY29uZHMsCiAgICAidSI6IGZvcm1hdFdlZWtkYXlOdW1iZXJNb25kYXksCiAgICAiVSI6IGZv cm1hdFdlZWtOdW1iZXJTdW5kYXksCiAgICAiViI6IGZvcm1hdFdlZWtOdW1iZXJJU08sCiAgICAi dyI6IGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXksCiAgICAiVyI6IGZvcm1hdFdlZWtOdW1iZXJN b25kYXksCiAgICAieCI6IG51bGwsCiAgICAiWCI6IG51bGwsCiAgICAieSI6IGZvcm1hdFllYXIk MSwKICAgICJZIjogZm9ybWF0RnVsbFllYXIsCiAgICAiWiI6IGZvcm1hdFpvbmUsCiAgICAiJSI6 IGZvcm1hdExpdGVyYWxQZXJjZW50CiAgfTsKCiAgdmFyIHV0Y0Zvcm1hdHMgPSB7CiAgICAiYSI6 IGZvcm1hdFVUQ1Nob3J0V2Vla2RheSwKICAgICJBIjogZm9ybWF0VVRDV2Vla2RheSwKICAgICJi IjogZm9ybWF0VVRDU2hvcnRNb250aCwKICAgICJCIjogZm9ybWF0VVRDTW9udGgsCiAgICAiYyI6 IG51bGwsCiAgICAiZCI6IGZvcm1hdFVUQ0RheU9mTW9udGgsCiAgICAiZSI6IGZvcm1hdFVUQ0Rh eU9mTW9udGgsCiAgICAiZiI6IGZvcm1hdFVUQ01pY3Jvc2Vjb25kcywKICAgICJIIjogZm9ybWF0 VVRDSG91cjI0LAogICAgIkkiOiBmb3JtYXRVVENIb3VyMTIsCiAgICAiaiI6IGZvcm1hdFVUQ0Rh eU9mWWVhciwKICAgICJMIjogZm9ybWF0VVRDTWlsbGlzZWNvbmRzLAogICAgIm0iOiBmb3JtYXRV VENNb250aE51bWJlciwKICAgICJNIjogZm9ybWF0VVRDTWludXRlcywKICAgICJwIjogZm9ybWF0 VVRDUGVyaW9kLAogICAgInEiOiBmb3JtYXRVVENRdWFydGVyLAogICAgIlEiOiBmb3JtYXRVbml4 VGltZXN0YW1wLAogICAgInMiOiBmb3JtYXRVbml4VGltZXN0YW1wU2Vjb25kcywKICAgICJTIjog Zm9ybWF0VVRDU2Vjb25kcywKICAgICJ1IjogZm9ybWF0VVRDV2Vla2RheU51bWJlck1vbmRheSwK ICAgICJVIjogZm9ybWF0VVRDV2Vla051bWJlclN1bmRheSwKICAgICJWIjogZm9ybWF0VVRDV2Vl a051bWJlcklTTywKICAgICJ3IjogZm9ybWF0VVRDV2Vla2RheU51bWJlclN1bmRheSwKICAgICJX IjogZm9ybWF0VVRDV2Vla051bWJlck1vbmRheSwKICAgICJ4IjogbnVsbCwKICAgICJYIjogbnVs bCwKICAgICJ5IjogZm9ybWF0VVRDWWVhciwKICAgICJZIjogZm9ybWF0VVRDRnVsbFllYXIsCiAg ICAiWiI6IGZvcm1hdFVUQ1pvbmUsCiAgICAiJSI6IGZvcm1hdExpdGVyYWxQZXJjZW50CiAgfTsK CiAgdmFyIHBhcnNlcyA9IHsKICAgICJhIjogcGFyc2VTaG9ydFdlZWtkYXksCiAgICAiQSI6IHBh cnNlV2Vla2RheSwKICAgICJiIjogcGFyc2VTaG9ydE1vbnRoLAogICAgIkIiOiBwYXJzZU1vbnRo LAogICAgImMiOiBwYXJzZUxvY2FsZURhdGVUaW1lLAogICAgImQiOiBwYXJzZURheU9mTW9udGgs CiAgICAiZSI6IHBhcnNlRGF5T2ZNb250aCwKICAgICJmIjogcGFyc2VNaWNyb3NlY29uZHMsCiAg ICAiSCI6IHBhcnNlSG91cjI0LAogICAgIkkiOiBwYXJzZUhvdXIyNCwKICAgICJqIjogcGFyc2VE YXlPZlllYXIsCiAgICAiTCI6IHBhcnNlTWlsbGlzZWNvbmRzLAogICAgIm0iOiBwYXJzZU1vbnRo TnVtYmVyLAogICAgIk0iOiBwYXJzZU1pbnV0ZXMsCiAgICAicCI6IHBhcnNlUGVyaW9kLAogICAg InEiOiBwYXJzZVF1YXJ0ZXIsCiAgICAiUSI6IHBhcnNlVW5peFRpbWVzdGFtcCwKICAgICJzIjog cGFyc2VVbml4VGltZXN0YW1wU2Vjb25kcywKICAgICJTIjogcGFyc2VTZWNvbmRzLAogICAgInUi OiBwYXJzZVdlZWtkYXlOdW1iZXJNb25kYXksCiAgICAiVSI6IHBhcnNlV2Vla051bWJlclN1bmRh eSwKICAgICJWIjogcGFyc2VXZWVrTnVtYmVySVNPLAogICAgInciOiBwYXJzZVdlZWtkYXlOdW1i ZXJTdW5kYXksCiAgICAiVyI6IHBhcnNlV2Vla051bWJlck1vbmRheSwKICAgICJ4IjogcGFyc2VM b2NhbGVEYXRlLAogICAgIlgiOiBwYXJzZUxvY2FsZVRpbWUsCiAgICAieSI6IHBhcnNlWWVhciwK ICAgICJZIjogcGFyc2VGdWxsWWVhciwKICAgICJaIjogcGFyc2Vab25lLAogICAgIiUiOiBwYXJz ZUxpdGVyYWxQZXJjZW50CiAgfTsKCiAgLy8gVGhlc2UgcmVjdXJzaXZlIGRpcmVjdGl2ZSBkZWZp bml0aW9ucyBtdXN0IGJlIGRlZmVycmVkLgogIGZvcm1hdHMueCA9IG5ld0Zvcm1hdChsb2NhbGVf ZGF0ZSwgZm9ybWF0cyk7CiAgZm9ybWF0cy5YID0gbmV3Rm9ybWF0KGxvY2FsZV90aW1lLCBmb3Jt YXRzKTsKICBmb3JtYXRzLmMgPSBuZXdGb3JtYXQobG9jYWxlX2RhdGVUaW1lLCBmb3JtYXRzKTsK ICB1dGNGb3JtYXRzLnggPSBuZXdGb3JtYXQobG9jYWxlX2RhdGUsIHV0Y0Zvcm1hdHMpOwogIHV0 Y0Zvcm1hdHMuWCA9IG5ld0Zvcm1hdChsb2NhbGVfdGltZSwgdXRjRm9ybWF0cyk7CiAgdXRjRm9y bWF0cy5jID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlVGltZSwgdXRjRm9ybWF0cyk7CgogIGZ1bmN0 aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIsIGZvcm1hdHMpIHsKICAgIHJldHVybiBmdW5jdGlvbihk YXRlKSB7CiAgICAgIHZhciBzdHJpbmcgPSBbXSwKICAgICAgICAgIGkgPSAtMSwKICAgICAgICAg IGogPSAwLAogICAgICAgICAgbiA9IHNwZWNpZmllci5sZW5ndGgsCiAgICAgICAgICBjLAogICAg ICAgICAgcGFkLAogICAgICAgICAgZm9ybWF0OwoKICAgICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9m IERhdGUpKSBkYXRlID0gbmV3IERhdGUoK2RhdGUpOwoKICAgICAgd2hpbGUgKCsraSA8IG4pIHsK ICAgICAgICBpZiAoc3BlY2lmaWVyLmNoYXJDb2RlQXQoaSkgPT09IDM3KSB7CiAgICAgICAgICBz dHJpbmcucHVzaChzcGVjaWZpZXIuc2xpY2UoaiwgaSkpOwogICAgICAgICAgaWYgKChwYWQgPSBw YWRzW2MgPSBzcGVjaWZpZXIuY2hhckF0KCsraSldKSAhPSBudWxsKSBjID0gc3BlY2lmaWVyLmNo YXJBdCgrK2kpOwogICAgICAgICAgZWxzZSBwYWQgPSBjID09PSAiZSIgPyAiICIgOiAiMCI7CiAg ICAgICAgICBpZiAoZm9ybWF0ID0gZm9ybWF0c1tjXSkgYyA9IGZvcm1hdChkYXRlLCBwYWQpOwog ICAgICAgICAgc3RyaW5nLnB1c2goYyk7CiAgICAgICAgICBqID0gaSArIDE7CiAgICAgICAgfQog ICAgICB9CgogICAgICBzdHJpbmcucHVzaChzcGVjaWZpZXIuc2xpY2UoaiwgaSkpOwogICAgICBy ZXR1cm4gc3RyaW5nLmpvaW4oIiIpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIG5ld1BhcnNlKHNw ZWNpZmllciwgWikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykgewogICAgICB2YXIgZCA9 IG5ld0RhdGUoMTkwMCwgdW5kZWZpbmVkLCAxKSwKICAgICAgICAgIGkgPSBwYXJzZVNwZWNpZmll cihkLCBzcGVjaWZpZXIsIHN0cmluZyArPSAiIiwgMCksCiAgICAgICAgICB3ZWVrLCBkYXkkMTsK ICAgICAgaWYgKGkgIT0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIG51bGw7CgogICAgICAvLyBJZiBh IFVOSVggdGltZXN0YW1wIGlzIHNwZWNpZmllZCwgcmV0dXJuIGl0LgogICAgICBpZiAoIlEiIGlu IGQpIHJldHVybiBuZXcgRGF0ZShkLlEpOwogICAgICBpZiAoInMiIGluIGQpIHJldHVybiBuZXcg RGF0ZShkLnMgKiAxMDAwICsgKCJMIiBpbiBkID8gZC5MIDogMCkpOwoKICAgICAgLy8gSWYgdGhp cyBpcyB1dGNQYXJzZSwgbmV2ZXIgdXNlIHRoZSBsb2NhbCB0aW1lem9uZS4KICAgICAgaWYgKFog JiYgISgiWiIgaW4gZCkpIGQuWiA9IDA7CgogICAgICAvLyBUaGUgYW0tcG0gZmxhZyBpcyAwIGZv ciBBTSwgYW5kIDEgZm9yIFBNLgogICAgICBpZiAoInAiIGluIGQpIGQuSCA9IGQuSCAlIDEyICsg ZC5wICogMTI7CgogICAgICAvLyBJZiB0aGUgbW9udGggd2FzIG5vdCBzcGVjaWZpZWQsIGluaGVy aXQgZnJvbSB0aGUgcXVhcnRlci4KICAgICAgaWYgKGQubSA9PT0gdW5kZWZpbmVkKSBkLm0gPSAi cSIgaW4gZCA/IGQucSA6IDA7CgogICAgICAvLyBDb252ZXJ0IGRheS1vZi13ZWVrIGFuZCB3ZWVr LW9mLXllYXIgdG8gZGF5LW9mLXllYXIuCiAgICAgIGlmICgiViIgaW4gZCkgewogICAgICAgIGlm IChkLlYgPCAxIHx8IGQuViA+IDUzKSByZXR1cm4gbnVsbDsKICAgICAgICBpZiAoISgidyIgaW4g ZCkpIGQudyA9IDE7CiAgICAgICAgaWYgKCJaIiBpbiBkKSB7CiAgICAgICAgICB3ZWVrID0gdXRj RGF0ZShuZXdEYXRlKGQueSwgMCwgMSkpLCBkYXkkMSA9IHdlZWsuZ2V0VVRDRGF5KCk7CiAgICAg ICAgICB3ZWVrID0gZGF5JDEgPiA0IHx8IGRheSQxID09PSAwID8gdXRjTW9uZGF5LmNlaWwod2Vl aykgOiB1dGNNb25kYXkod2Vlayk7CiAgICAgICAgICB3ZWVrID0gdXRjRGF5Lm9mZnNldCh3ZWVr LCAoZC5WIC0gMSkgKiA3KTsKICAgICAgICAgIGQueSA9IHdlZWsuZ2V0VVRDRnVsbFllYXIoKTsK ICAgICAgICAgIGQubSA9IHdlZWsuZ2V0VVRDTW9udGgoKTsKICAgICAgICAgIGQuZCA9IHdlZWsu Z2V0VVRDRGF0ZSgpICsgKGQudyArIDYpICUgNzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAg d2VlayA9IGxvY2FsRGF0ZShuZXdEYXRlKGQueSwgMCwgMSkpLCBkYXkkMSA9IHdlZWsuZ2V0RGF5 KCk7CiAgICAgICAgICB3ZWVrID0gZGF5JDEgPiA0IHx8IGRheSQxID09PSAwID8gbW9uZGF5LmNl aWwod2VlaykgOiBtb25kYXkod2Vlayk7CiAgICAgICAgICB3ZWVrID0gZGF5Lm9mZnNldCh3ZWVr LCAoZC5WIC0gMSkgKiA3KTsKICAgICAgICAgIGQueSA9IHdlZWsuZ2V0RnVsbFllYXIoKTsKICAg ICAgICAgIGQubSA9IHdlZWsuZ2V0TW9udGgoKTsKICAgICAgICAgIGQuZCA9IHdlZWsuZ2V0RGF0 ZSgpICsgKGQudyArIDYpICUgNzsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIlciIGluIGQg fHwgIlUiIGluIGQpIHsKICAgICAgICBpZiAoISgidyIgaW4gZCkpIGQudyA9ICJ1IiBpbiBkID8g ZC51ICUgNyA6ICJXIiBpbiBkID8gMSA6IDA7CiAgICAgICAgZGF5JDEgPSAiWiIgaW4gZCA/IHV0 Y0RhdGUobmV3RGF0ZShkLnksIDAsIDEpKS5nZXRVVENEYXkoKSA6IGxvY2FsRGF0ZShuZXdEYXRl KGQueSwgMCwgMSkpLmdldERheSgpOwogICAgICAgIGQubSA9IDA7CiAgICAgICAgZC5kID0gIlci IGluIGQgPyAoZC53ICsgNikgJSA3ICsgZC5XICogNyAtIChkYXkkMSArIDUpICUgNyA6IGQudyAr IGQuVSAqIDcgLSAoZGF5JDEgKyA2KSAlIDc7CiAgICAgIH0KCiAgICAgIC8vIElmIGEgdGltZSB6 b25lIGlzIHNwZWNpZmllZCwgYWxsIGZpZWxkcyBhcmUgaW50ZXJwcmV0ZWQgYXMgVVRDIGFuZCB0 aGVuCiAgICAgIC8vIG9mZnNldCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0aW1lIHpvbmUu CiAgICAgIGlmICgiWiIgaW4gZCkgewogICAgICAgIGQuSCArPSBkLlogLyAxMDAgfCAwOwogICAg ICAgIGQuTSArPSBkLlogJSAxMDA7CiAgICAgICAgcmV0dXJuIHV0Y0RhdGUoZCk7CiAgICAgIH0K CiAgICAgIC8vIE90aGVyd2lzZSwgYWxsIGZpZWxkcyBhcmUgaW4gbG9jYWwgdGltZS4KICAgICAg cmV0dXJuIGxvY2FsRGF0ZShkKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBwYXJzZVNwZWNpZmll cihkLCBzcGVjaWZpZXIsIHN0cmluZywgaikgewogICAgdmFyIGkgPSAwLAogICAgICAgIG4gPSBz cGVjaWZpZXIubGVuZ3RoLAogICAgICAgIG0gPSBzdHJpbmcubGVuZ3RoLAogICAgICAgIGMsCiAg ICAgICAgcGFyc2U7CgogICAgd2hpbGUgKGkgPCBuKSB7CiAgICAgIGlmIChqID49IG0pIHJldHVy biAtMTsKICAgICAgYyA9IHNwZWNpZmllci5jaGFyQ29kZUF0KGkrKyk7CiAgICAgIGlmIChjID09 PSAzNykgewogICAgICAgIGMgPSBzcGVjaWZpZXIuY2hhckF0KGkrKyk7CiAgICAgICAgcGFyc2Ug PSBwYXJzZXNbYyBpbiBwYWRzID8gc3BlY2lmaWVyLmNoYXJBdChpKyspIDogY107CiAgICAgICAg aWYgKCFwYXJzZSB8fCAoKGogPSBwYXJzZShkLCBzdHJpbmcsIGopKSA8IDApKSByZXR1cm4gLTE7 CiAgICAgIH0gZWxzZSBpZiAoYyAhPSBzdHJpbmcuY2hhckNvZGVBdChqKyspKSB7CiAgICAgICAg cmV0dXJuIC0xOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGo7CiAgfQoKICBmdW5jdGlvbiBw YXJzZVBlcmlvZChkLCBzdHJpbmcsIGkpIHsKICAgIHZhciBuID0gcGVyaW9kUmUuZXhlYyhzdHJp bmcuc2xpY2UoaSkpOwogICAgcmV0dXJuIG4gPyAoZC5wID0gcGVyaW9kTG9va3VwW25bMF0udG9M b3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICB9CgogIGZ1bmN0aW9uIHBhcnNl U2hvcnRXZWVrZGF5KGQsIHN0cmluZywgaSkgewogICAgdmFyIG4gPSBzaG9ydFdlZWtkYXlSZS5l eGVjKHN0cmluZy5zbGljZShpKSk7CiAgICByZXR1cm4gbiA/IChkLncgPSBzaG9ydFdlZWtkYXlM b29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KCiAg ZnVuY3Rpb24gcGFyc2VXZWVrZGF5KGQsIHN0cmluZywgaSkgewogICAgdmFyIG4gPSB3ZWVrZGF5 UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgcmV0dXJuIG4gPyAoZC53ID0gd2Vla2RheUxv b2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgfQoKICBm dW5jdGlvbiBwYXJzZVNob3J0TW9udGgoZCwgc3RyaW5nLCBpKSB7CiAgICB2YXIgbiA9IHNob3J0 TW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICByZXR1cm4gbiA/IChkLm0gPSBzaG9y dE1vbnRoTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsK ICB9CgogIGZ1bmN0aW9uIHBhcnNlTW9udGgoZCwgc3RyaW5nLCBpKSB7CiAgICB2YXIgbiA9IG1v bnRoUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgcmV0dXJuIG4gPyAoZC5tID0gbW9udGhM b29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KCiAg ZnVuY3Rpb24gcGFyc2VMb2NhbGVEYXRlVGltZShkLCBzdHJpbmcsIGkpIHsKICAgIHJldHVybiBw YXJzZVNwZWNpZmllcihkLCBsb2NhbGVfZGF0ZVRpbWUsIHN0cmluZywgaSk7CiAgfQoKICBmdW5j dGlvbiBwYXJzZUxvY2FsZURhdGUoZCwgc3RyaW5nLCBpKSB7CiAgICByZXR1cm4gcGFyc2VTcGVj aWZpZXIoZCwgbG9jYWxlX2RhdGUsIHN0cmluZywgaSk7CiAgfQoKICBmdW5jdGlvbiBwYXJzZUxv Y2FsZVRpbWUoZCwgc3RyaW5nLCBpKSB7CiAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9j YWxlX3RpbWUsIHN0cmluZywgaSk7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRTaG9ydFdlZWtkYXko ZCkgewogICAgcmV0dXJuIGxvY2FsZV9zaG9ydFdlZWtkYXlzW2QuZ2V0RGF5KCldOwogIH0KCiAg ZnVuY3Rpb24gZm9ybWF0V2Vla2RheShkKSB7CiAgICByZXR1cm4gbG9jYWxlX3dlZWtkYXlzW2Qu Z2V0RGF5KCldOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0U2hvcnRNb250aChkKSB7CiAgICByZXR1 cm4gbG9jYWxlX3Nob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07CiAgfQoKICBmdW5jdGlvbiBmb3Jt YXRNb250aChkKSB7CiAgICByZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldE1vbnRoKCldOwogIH0K CiAgZnVuY3Rpb24gZm9ybWF0UGVyaW9kKGQpIHsKICAgIHJldHVybiBsb2NhbGVfcGVyaW9kc1sr KGQuZ2V0SG91cnMoKSA+PSAxMildOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0UXVhcnRlcihkKSB7 CiAgICByZXR1cm4gMSArIH5+KGQuZ2V0TW9udGgoKSAvIDMpOwogIH0KCiAgZnVuY3Rpb24gZm9y bWF0VVRDU2hvcnRXZWVrZGF5KGQpIHsKICAgIHJldHVybiBsb2NhbGVfc2hvcnRXZWVrZGF5c1tk LmdldFVUQ0RheSgpXTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtkYXkoZCkgewogICAg cmV0dXJuIGxvY2FsZV93ZWVrZGF5c1tkLmdldFVUQ0RheSgpXTsKICB9CgogIGZ1bmN0aW9uIGZv cm1hdFVUQ1Nob3J0TW9udGgoZCkgewogICAgcmV0dXJuIGxvY2FsZV9zaG9ydE1vbnRoc1tkLmdl dFVUQ01vbnRoKCldOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0VVRDTW9udGgoZCkgewogICAgcmV0 dXJuIGxvY2FsZV9tb250aHNbZC5nZXRVVENNb250aCgpXTsKICB9CgogIGZ1bmN0aW9uIGZvcm1h dFVUQ1BlcmlvZChkKSB7CiAgICByZXR1cm4gbG9jYWxlX3BlcmlvZHNbKyhkLmdldFVUQ0hvdXJz KCkgPj0gMTIpXTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFVUQ1F1YXJ0ZXIoZCkgewogICAgcmV0 dXJuIDEgKyB+fihkLmdldFVUQ01vbnRoKCkgLyAzKTsKICB9CgogIHJldHVybiB7CiAgICBmb3Jt YXQ6IGZ1bmN0aW9uKHNwZWNpZmllcikgewogICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZp ZXIgKz0gIiIsIGZvcm1hdHMpOwogICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVy biBzcGVjaWZpZXI7IH07CiAgICAgIHJldHVybiBmOwogICAgfSwKICAgIHBhcnNlOiBmdW5jdGlv bihzcGVjaWZpZXIpIHsKICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIgKz0gIiIsIGZh bHNlKTsKICAgICAgcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9 OwogICAgICByZXR1cm4gcDsKICAgIH0sCiAgICB1dGNGb3JtYXQ6IGZ1bmN0aW9uKHNwZWNpZmll cikgewogICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZpZXIgKz0gIiIsIHV0Y0Zvcm1hdHMp OwogICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07CiAg ICAgIHJldHVybiBmOwogICAgfSwKICAgIHV0Y1BhcnNlOiBmdW5jdGlvbihzcGVjaWZpZXIpIHsK ICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIgKz0gIiIsIHRydWUpOwogICAgICBwLnRv U3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07CiAgICAgIHJldHVybiBw OwogICAgfQogIH07Cn0KCnZhciBwYWRzID0geyItIjogIiIsICJfIjogIiAiLCAiMCI6ICIwIn0s CiAgICBudW1iZXJSZSA9IC9eXHMqXGQrLywgLy8gbm90ZTogaWdub3JlcyBuZXh0IGRpcmVjdGl2 ZQogICAgcGVyY2VudFJlID0gL14lLywKICAgIHJlcXVvdGVSZSA9IC9bXFxeJCorP3xbXF0oKS57 fV0vZzsKCmZ1bmN0aW9uIHBhZCQxKHZhbHVlLCBmaWxsLCB3aWR0aCkgewogIHZhciBzaWduID0g dmFsdWUgPCAwID8gIi0iIDogIiIsCiAgICAgIHN0cmluZyA9IChzaWduID8gLXZhbHVlIDogdmFs dWUpICsgIiIsCiAgICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7CiAgcmV0dXJuIHNpZ24gKyAo bGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwp ICsgc3RyaW5nIDogc3RyaW5nKTsKfQoKZnVuY3Rpb24gcmVxdW90ZShzKSB7CiAgcmV0dXJuIHMu cmVwbGFjZShyZXF1b3RlUmUsICJcXCQmIik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFJlKG5hbWVzKSB7 CiAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgbmFtZXMubWFwKHJlcXVvdGUpLmpvaW4oInwi KSArICIpIiwgImkiKTsKfQoKZnVuY3Rpb24gZm9ybWF0TG9va3VwKG5hbWVzKSB7CiAgdmFyIG1h cCA9IHt9LCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAgd2hpbGUgKCsraSA8IG4pIG1hcFtu YW1lc1tpXS50b0xvd2VyQ2FzZSgpXSA9IGk7CiAgcmV0dXJuIG1hcDsKfQoKZnVuY3Rpb24gcGFy c2VXZWVrZGF5TnVtYmVyU3VuZGF5KGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUu ZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTsKICByZXR1cm4gbiA/IChkLncgPSArblswXSwg aSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVdlZWtkYXlOdW1iZXJNb25k YXkoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShp LCBpICsgMSkpOwogIHJldHVybiBuID8gKGQudSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDog LTE7Cn0KCmZ1bmN0aW9uIHBhcnNlV2Vla051bWJlclN1bmRheShkLCBzdHJpbmcsIGkpIHsKICB2 YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgcmV0dXJuIG4g PyAoZC5VID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VX ZWVrTnVtYmVySVNPKGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJp bmcuc2xpY2UoaSwgaSArIDIpKTsKICByZXR1cm4gbiA/IChkLlYgPSArblswXSwgaSArIG5bMF0u bGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJNb25kYXkoZCwgc3RyaW5n LCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwog IHJldHVybiBuID8gKGQuVyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7Cn0KCmZ1bmN0 aW9uIHBhcnNlRnVsbFllYXIoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVj KHN0cmluZy5zbGljZShpLCBpICsgNCkpOwogIHJldHVybiBuID8gKGQueSA9ICtuWzBdLCBpICsg blswXS5sZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlWWVhcihkLCBzdHJpbmcsIGkpIHsK ICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgcmV0dXJu IG4gPyAoZC55ID0gK25bMF0gKyAoK25bMF0gPiA2OCA/IDE5MDAgOiAyMDAwKSwgaSArIG5bMF0u bGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVpvbmUoZCwgc3RyaW5nLCBpKSB7CiAgdmFy IG4gPSAvXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhzdHJpbmcuc2xpY2UoaSwg aSArIDYpKTsKICByZXR1cm4gbiA/IChkLlogPSBuWzFdID8gMCA6IC0oblsyXSArIChuWzNdIHx8 ICIwMCIpKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVF1YXJ0ZXIo ZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBp ICsgMSkpOwogIHJldHVybiBuID8gKGQucSA9IG5bMF0gKiAzIC0gMywgaSArIG5bMF0ubGVuZ3Ro KSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZU1vbnRoTnVtYmVyKGQsIHN0cmluZywgaSkgewogIHZh ciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICByZXR1cm4gbiA/ IChkLm0gPSBuWzBdIC0gMSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJz ZURheU9mTW9udGgoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmlu Zy5zbGljZShpLCBpICsgMikpOwogIHJldHVybiBuID8gKGQuZCA9ICtuWzBdLCBpICsgblswXS5s ZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlRGF5T2ZZZWFyKGQsIHN0cmluZywgaSkgewog IHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTsKICByZXR1cm4g biA/IChkLm0gPSAwLCBkLmQgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5j dGlvbiBwYXJzZUhvdXIyNChkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51bWJlclJlLmV4ZWMo c3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgcmV0dXJuIG4gPyAoZC5IID0gK25bMF0sIGkgKyBu WzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VNaW51dGVzKGQsIHN0cmluZywgaSkg ewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICByZXR1 cm4gbiA/IChkLk0gPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBw YXJzZVNlY29uZHMoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmlu Zy5zbGljZShpLCBpICsgMikpOwogIHJldHVybiBuID8gKGQuUyA9ICtuWzBdLCBpICsgblswXS5s ZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlTWlsbGlzZWNvbmRzKGQsIHN0cmluZywgaSkg ewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTsKICByZXR1 cm4gbiA/IChkLkwgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBw YXJzZU1pY3Jvc2Vjb25kcyhkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51bWJlclJlLmV4ZWMo c3RyaW5nLnNsaWNlKGksIGkgKyA2KSk7CiAgcmV0dXJuIG4gPyAoZC5MID0gTWF0aC5mbG9vcihu WzBdIC8gMTAwMCksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VMaXRl cmFsUGVyY2VudChkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IHBlcmNlbnRSZS5leGVjKHN0cmlu Zy5zbGljZShpLCBpICsgMSkpOwogIHJldHVybiBuID8gaSArIG5bMF0ubGVuZ3RoIDogLTE7Cn0K CmZ1bmN0aW9uIHBhcnNlVW5peFRpbWVzdGFtcChkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51 bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICByZXR1cm4gbiA/IChkLlEgPSArblswXSwg aSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVVuaXhUaW1lc3RhbXBTZWNv bmRzKGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2Uo aSkpOwogIHJldHVybiBuID8gKGQucyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7Cn0K CmZ1bmN0aW9uIGZvcm1hdERheU9mTW9udGgoZCwgcCkgewogIHJldHVybiBwYWQkMShkLmdldERh dGUoKSwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdEhvdXIyNChkLCBwKSB7CiAgcmV0dXJuIHBh ZCQxKGQuZ2V0SG91cnMoKSwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdEhvdXIxMihkLCBwKSB7 CiAgcmV0dXJuIHBhZCQxKGQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTsKfQoKZnVuY3Rp b24gZm9ybWF0RGF5T2ZZZWFyKGQsIHApIHsKICByZXR1cm4gcGFkJDEoMSArIGRheS5jb3VudCh5 ZWFyKGQpLCBkKSwgcCwgMyk7Cn0KCmZ1bmN0aW9uIGZvcm1hdE1pbGxpc2Vjb25kcyhkLCBwKSB7 CiAgcmV0dXJuIHBhZCQxKGQuZ2V0TWlsbGlzZWNvbmRzKCksIHAsIDMpOwp9CgpmdW5jdGlvbiBm b3JtYXRNaWNyb3NlY29uZHMoZCwgcCkgewogIHJldHVybiBmb3JtYXRNaWxsaXNlY29uZHMoZCwg cCkgKyAiMDAwIjsKfQoKZnVuY3Rpb24gZm9ybWF0TW9udGhOdW1iZXIoZCwgcCkgewogIHJldHVy biBwYWQkMShkLmdldE1vbnRoKCkgKyAxLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0TWludXRl cyhkLCBwKSB7CiAgcmV0dXJuIHBhZCQxKGQuZ2V0TWludXRlcygpLCBwLCAyKTsKfQoKZnVuY3Rp b24gZm9ybWF0U2Vjb25kcyhkLCBwKSB7CiAgcmV0dXJuIHBhZCQxKGQuZ2V0U2Vjb25kcygpLCBw LCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0V2Vla2RheU51bWJlck1vbmRheShkKSB7CiAgdmFyIGRh eSA9IGQuZ2V0RGF5KCk7CiAgcmV0dXJuIGRheSA9PT0gMCA/IDcgOiBkYXk7Cn0KCmZ1bmN0aW9u IGZvcm1hdFdlZWtOdW1iZXJTdW5kYXkoZCwgcCkgewogIHJldHVybiBwYWQkMShzdW5kYXkuY291 bnQoeWVhcihkKSAtIDEsIGQpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlcklT TyhkLCBwKSB7CiAgdmFyIGRheSA9IGQuZ2V0RGF5KCk7CiAgZCA9IChkYXkgPj0gNCB8fCBkYXkg PT09IDApID8gdGh1cnNkYXkoZCkgOiB0aHVyc2RheS5jZWlsKGQpOwogIHJldHVybiBwYWQkMSh0 aHVyc2RheS5jb3VudCh5ZWFyKGQpLCBkKSArICh5ZWFyKGQpLmdldERheSgpID09PSA0KSwgcCwg Mik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXkoZCkgewogIHJldHVybiBk LmdldERheSgpOwp9CgpmdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyTW9uZGF5KGQsIHApIHsKICBy ZXR1cm4gcGFkJDEobW9uZGF5LmNvdW50KHllYXIoZCkgLSAxLCBkKSwgcCwgMik7Cn0KCmZ1bmN0 aW9uIGZvcm1hdFllYXIkMShkLCBwKSB7CiAgcmV0dXJuIHBhZCQxKGQuZ2V0RnVsbFllYXIoKSAl IDEwMCwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdEZ1bGxZZWFyKGQsIHApIHsKICByZXR1cm4g cGFkJDEoZC5nZXRGdWxsWWVhcigpICUgMTAwMDAsIHAsIDQpOwp9CgpmdW5jdGlvbiBmb3JtYXRa b25lKGQpIHsKICB2YXIgeiA9IGQuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICByZXR1cm4gKHogPiAw ID8gIi0iIDogKHogKj0gLTEsICIrIikpCiAgICAgICsgcGFkJDEoeiAvIDYwIHwgMCwgIjAiLCAy KQogICAgICArIHBhZCQxKHogJSA2MCwgIjAiLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDRGF5 T2ZNb250aChkLCBwKSB7CiAgcmV0dXJuIHBhZCQxKGQuZ2V0VVRDRGF0ZSgpLCBwLCAyKTsKfQoK ZnVuY3Rpb24gZm9ybWF0VVRDSG91cjI0KGQsIHApIHsKICByZXR1cm4gcGFkJDEoZC5nZXRVVENI b3VycygpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDSG91cjEyKGQsIHApIHsKICByZXR1 cm4gcGFkJDEoZC5nZXRVVENIb3VycygpICUgMTIgfHwgMTIsIHAsIDIpOwp9CgpmdW5jdGlvbiBm b3JtYXRVVENEYXlPZlllYXIoZCwgcCkgewogIHJldHVybiBwYWQkMSgxICsgdXRjRGF5LmNvdW50 KHV0Y1llYXIoZCksIGQpLCBwLCAzKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDTWlsbGlzZWNvbmRz KGQsIHApIHsKICByZXR1cm4gcGFkJDEoZC5nZXRVVENNaWxsaXNlY29uZHMoKSwgcCwgMyk7Cn0K CmZ1bmN0aW9uIGZvcm1hdFVUQ01pY3Jvc2Vjb25kcyhkLCBwKSB7CiAgcmV0dXJuIGZvcm1hdFVU Q01pbGxpc2Vjb25kcyhkLCBwKSArICIwMDAiOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENNb250aE51 bWJlcihkLCBwKSB7CiAgcmV0dXJuIHBhZCQxKGQuZ2V0VVRDTW9udGgoKSArIDEsIHAsIDIpOwp9 CgpmdW5jdGlvbiBmb3JtYXRVVENNaW51dGVzKGQsIHApIHsKICByZXR1cm4gcGFkJDEoZC5nZXRV VENNaW51dGVzKCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENTZWNvbmRzKGQsIHApIHsK ICByZXR1cm4gcGFkJDEoZC5nZXRVVENTZWNvbmRzKCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3Jt YXRVVENXZWVrZGF5TnVtYmVyTW9uZGF5KGQpIHsKICB2YXIgZG93ID0gZC5nZXRVVENEYXkoKTsK ICByZXR1cm4gZG93ID09PSAwID8gNyA6IGRvdzsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051 bWJlclN1bmRheShkLCBwKSB7CiAgcmV0dXJuIHBhZCQxKHV0Y1N1bmRheS5jb3VudCh1dGNZZWFy KGQpIC0gMSwgZCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENXZWVrTnVtYmVySVNPKGQs IHApIHsKICB2YXIgZGF5ID0gZC5nZXRVVENEYXkoKTsKICBkID0gKGRheSA+PSA0IHx8IGRheSA9 PT0gMCkgPyB1dGNUaHVyc2RheShkKSA6IHV0Y1RodXJzZGF5LmNlaWwoZCk7CiAgcmV0dXJuIHBh ZCQxKHV0Y1RodXJzZGF5LmNvdW50KHV0Y1llYXIoZCksIGQpICsgKHV0Y1llYXIoZCkuZ2V0VVRD RGF5KCkgPT09IDQpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheU51bWJlclN1 bmRheShkKSB7CiAgcmV0dXJuIGQuZ2V0VVRDRGF5KCk7Cn0KCmZ1bmN0aW9uIGZvcm1hdFVUQ1dl ZWtOdW1iZXJNb25kYXkoZCwgcCkgewogIHJldHVybiBwYWQkMSh1dGNNb25kYXkuY291bnQodXRj WWVhcihkKSAtIDEsIGQpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDWWVhcihkLCBwKSB7 CiAgcmV0dXJuIHBhZCQxKGQuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMCwgcCwgMik7Cn0KCmZ1bmN0 aW9uIGZvcm1hdFVUQ0Z1bGxZZWFyKGQsIHApIHsKICByZXR1cm4gcGFkJDEoZC5nZXRVVENGdWxs WWVhcigpICUgMTAwMDAsIHAsIDQpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENab25lKCkgewogIHJl dHVybiAiKzAwMDAiOwp9CgpmdW5jdGlvbiBmb3JtYXRMaXRlcmFsUGVyY2VudCgpIHsKICByZXR1 cm4gIiUiOwp9CgpmdW5jdGlvbiBmb3JtYXRVbml4VGltZXN0YW1wKGQpIHsKICByZXR1cm4gK2Q7 Cn0KCmZ1bmN0aW9uIGZvcm1hdFVuaXhUaW1lc3RhbXBTZWNvbmRzKGQpIHsKICByZXR1cm4gTWF0 aC5mbG9vcigrZCAvIDEwMDApOwp9Cgp2YXIgbG9jYWxlJDE7CgpkZWZhdWx0TG9jYWxlJDEoewog IGRhdGVUaW1lOiAiJXgsICVYIiwKICBkYXRlOiAiJS1tLyUtZC8lWSIsCiAgdGltZTogIiUtSTol TTolUyAlcCIsCiAgcGVyaW9kczogWyJBTSIsICJQTSJdLAogIGRheXM6IFsiU3VuZGF5IiwgIk1v bmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0 dXJkYXkiXSwKICBzaG9ydERheXM6IFsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIs ICJGcmkiLCAiU2F0Il0sCiAgbW9udGhzOiBbIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2gi LCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwg Ik9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiXSwKICBzaG9ydE1vbnRoczogWyJKYW4i LCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIs ICJPY3QiLCAiTm92IiwgIkRlYyJdCn0pOwoKZnVuY3Rpb24gZGVmYXVsdExvY2FsZSQxKGRlZmlu aXRpb24pIHsKICBsb2NhbGUkMSA9IGZvcm1hdExvY2FsZSQxKGRlZmluaXRpb24pOwogIGV4cG9y dHMudGltZUZvcm1hdCA9IGxvY2FsZSQxLmZvcm1hdDsKICBleHBvcnRzLnRpbWVQYXJzZSA9IGxv Y2FsZSQxLnBhcnNlOwogIGV4cG9ydHMudXRjRm9ybWF0ID0gbG9jYWxlJDEudXRjRm9ybWF0Owog IGV4cG9ydHMudXRjUGFyc2UgPSBsb2NhbGUkMS51dGNQYXJzZTsKICByZXR1cm4gbG9jYWxlJDE7 Cn0KCnZhciBpc29TcGVjaWZpZXIgPSAiJVktJW0tJWRUJUg6JU06JVMuJUxaIjsKCmZ1bmN0aW9u IGZvcm1hdElzb05hdGl2ZShkYXRlKSB7CiAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKTsKfQoK dmFyIGZvcm1hdElzbyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nCiAgICA/IGZvcm1hdElz b05hdGl2ZQogICAgOiBleHBvcnRzLnV0Y0Zvcm1hdChpc29TcGVjaWZpZXIpOwoKZnVuY3Rpb24g cGFyc2VJc29OYXRpdmUoc3RyaW5nKSB7CiAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzdHJpbmcpOwog IHJldHVybiBpc05hTihkYXRlKSA/IG51bGwgOiBkYXRlOwp9Cgp2YXIgcGFyc2VJc28gPSArbmV3 IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpCiAgICA/IHBhcnNlSXNvTmF0aXZlCiAg ICA6IGV4cG9ydHMudXRjUGFyc2UoaXNvU3BlY2lmaWVyKTsKCnZhciBkdXJhdGlvblNlY29uZCQx ID0gMTAwMCwKICAgIGR1cmF0aW9uTWludXRlJDEgPSBkdXJhdGlvblNlY29uZCQxICogNjAsCiAg ICBkdXJhdGlvbkhvdXIkMSA9IGR1cmF0aW9uTWludXRlJDEgKiA2MCwKICAgIGR1cmF0aW9uRGF5 JDEgPSBkdXJhdGlvbkhvdXIkMSAqIDI0LAogICAgZHVyYXRpb25XZWVrJDEgPSBkdXJhdGlvbkRh eSQxICogNywKICAgIGR1cmF0aW9uTW9udGggPSBkdXJhdGlvbkRheSQxICogMzAsCiAgICBkdXJh dGlvblllYXIgPSBkdXJhdGlvbkRheSQxICogMzY1OwoKZnVuY3Rpb24gZGF0ZSQxKHQpIHsKICBy ZXR1cm4gbmV3IERhdGUodCk7Cn0KCmZ1bmN0aW9uIG51bWJlciQzKHQpIHsKICByZXR1cm4gdCBp bnN0YW5jZW9mIERhdGUgPyArdCA6ICtuZXcgRGF0ZSgrdCk7Cn0KCmZ1bmN0aW9uIGNhbGVuZGFy KHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29u ZCwgZm9ybWF0KSB7CiAgdmFyIHNjYWxlID0gY29udGludW91cyhpZGVudGl0eSQ2LCBpZGVudGl0 eSQ2KSwKICAgICAgaW52ZXJ0ID0gc2NhbGUuaW52ZXJ0LAogICAgICBkb21haW4gPSBzY2FsZS5k b21haW47CgogIHZhciBmb3JtYXRNaWxsaXNlY29uZCA9IGZvcm1hdCgiLiVMIiksCiAgICAgIGZv cm1hdFNlY29uZCA9IGZvcm1hdCgiOiVTIiksCiAgICAgIGZvcm1hdE1pbnV0ZSA9IGZvcm1hdCgi JUk6JU0iKSwKICAgICAgZm9ybWF0SG91ciA9IGZvcm1hdCgiJUkgJXAiKSwKICAgICAgZm9ybWF0 RGF5ID0gZm9ybWF0KCIlYSAlZCIpLAogICAgICBmb3JtYXRXZWVrID0gZm9ybWF0KCIlYiAlZCIp LAogICAgICBmb3JtYXRNb250aCA9IGZvcm1hdCgiJUIiKSwKICAgICAgZm9ybWF0WWVhciA9IGZv cm1hdCgiJVkiKTsKCiAgdmFyIHRpY2tJbnRlcnZhbHMgPSBbCiAgICBbc2Vjb25kLCAgMSwgICAg ICBkdXJhdGlvblNlY29uZCQxXSwKICAgIFtzZWNvbmQsICA1LCAgNSAqIGR1cmF0aW9uU2Vjb25k JDFdLAogICAgW3NlY29uZCwgMTUsIDE1ICogZHVyYXRpb25TZWNvbmQkMV0sCiAgICBbc2Vjb25k LCAzMCwgMzAgKiBkdXJhdGlvblNlY29uZCQxXSwKICAgIFttaW51dGUsICAxLCAgICAgIGR1cmF0 aW9uTWludXRlJDFdLAogICAgW21pbnV0ZSwgIDUsICA1ICogZHVyYXRpb25NaW51dGUkMV0sCiAg ICBbbWludXRlLCAxNSwgMTUgKiBkdXJhdGlvbk1pbnV0ZSQxXSwKICAgIFttaW51dGUsIDMwLCAz MCAqIGR1cmF0aW9uTWludXRlJDFdLAogICAgWyAgaG91ciwgIDEsICAgICAgZHVyYXRpb25Ib3Vy JDEgIF0sCiAgICBbICBob3VyLCAgMywgIDMgKiBkdXJhdGlvbkhvdXIkMSAgXSwKICAgIFsgIGhv dXIsICA2LCAgNiAqIGR1cmF0aW9uSG91ciQxICBdLAogICAgWyAgaG91ciwgMTIsIDEyICogZHVy YXRpb25Ib3VyJDEgIF0sCiAgICBbICAgZGF5LCAgMSwgICAgICBkdXJhdGlvbkRheSQxICAgXSwK ICAgIFsgICBkYXksICAyLCAgMiAqIGR1cmF0aW9uRGF5JDEgICBdLAogICAgWyAgd2VlaywgIDEs ICAgICAgZHVyYXRpb25XZWVrJDEgIF0sCiAgICBbIG1vbnRoLCAgMSwgICAgICBkdXJhdGlvbk1v bnRoIF0sCiAgICBbIG1vbnRoLCAgMywgIDMgKiBkdXJhdGlvbk1vbnRoIF0sCiAgICBbICB5ZWFy LCAgMSwgICAgICBkdXJhdGlvblllYXIgIF0KICBdOwoKICBmdW5jdGlvbiB0aWNrRm9ybWF0KGRh dGUpIHsKICAgIHJldHVybiAoc2Vjb25kKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1pbGxpc2Vjb25k CiAgICAgICAgOiBtaW51dGUoZGF0ZSkgPCBkYXRlID8gZm9ybWF0U2Vjb25kCiAgICAgICAgOiBo b3VyKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1pbnV0ZQogICAgICAgIDogZGF5KGRhdGUpIDwgZGF0 ZSA/IGZvcm1hdEhvdXIKICAgICAgICA6IG1vbnRoKGRhdGUpIDwgZGF0ZSA/ICh3ZWVrKGRhdGUp IDwgZGF0ZSA/IGZvcm1hdERheSA6IGZvcm1hdFdlZWspCiAgICAgICAgOiB5ZWFyKGRhdGUpIDwg ZGF0ZSA/IGZvcm1hdE1vbnRoCiAgICAgICAgOiBmb3JtYXRZZWFyKShkYXRlKTsKICB9CgogIGZ1 bmN0aW9uIHRpY2tJbnRlcnZhbChpbnRlcnZhbCwgc3RhcnQsIHN0b3AsIHN0ZXApIHsKICAgIGlm IChpbnRlcnZhbCA9PSBudWxsKSBpbnRlcnZhbCA9IDEwOwoKICAgIC8vIElmIGEgZGVzaXJlZCB0 aWNrIGNvdW50IGlzIHNwZWNpZmllZCwgcGljayBhIHJlYXNvbmFibGUgdGljayBpbnRlcnZhbAog ICAgLy8gYmFzZWQgb24gdGhlIGV4dGVudCBvZiB0aGUgZG9tYWluIGFuZCBhIHJvdWdoIGVzdGlt YXRlIG9mIHRpY2sgc2l6ZS4KICAgIC8vIE90aGVyd2lzZSwgYXNzdW1lIGludGVydmFsIGlzIGFs cmVhZHkgYSB0aW1lIGludGVydmFsIGFuZCB1c2UgaXQuCiAgICBpZiAodHlwZW9mIGludGVydmFs ID09PSAibnVtYmVyIikgewogICAgICB2YXIgdGFyZ2V0ID0gTWF0aC5hYnMoc3RvcCAtIHN0YXJ0 KSAvIGludGVydmFsLAogICAgICAgICAgaSA9IGJpc2VjdG9yKGZ1bmN0aW9uKGkpIHsgcmV0dXJu IGlbMl07IH0pLnJpZ2h0KHRpY2tJbnRlcnZhbHMsIHRhcmdldCk7CiAgICAgIGlmIChpID09PSB0 aWNrSW50ZXJ2YWxzLmxlbmd0aCkgewogICAgICAgIHN0ZXAgPSB0aWNrU3RlcChzdGFydCAvIGR1 cmF0aW9uWWVhciwgc3RvcCAvIGR1cmF0aW9uWWVhciwgaW50ZXJ2YWwpOwogICAgICAgIGludGVy dmFsID0geWVhcjsKICAgICAgfSBlbHNlIGlmIChpKSB7CiAgICAgICAgaSA9IHRpY2tJbnRlcnZh bHNbdGFyZ2V0IC8gdGlja0ludGVydmFsc1tpIC0gMV1bMl0gPCB0aWNrSW50ZXJ2YWxzW2ldWzJd IC8gdGFyZ2V0ID8gaSAtIDEgOiBpXTsKICAgICAgICBzdGVwID0gaVsxXTsKICAgICAgICBpbnRl cnZhbCA9IGlbMF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RlcCA9IE1hdGgubWF4KHRpY2tT dGVwKHN0YXJ0LCBzdG9wLCBpbnRlcnZhbCksIDEpOwogICAgICAgIGludGVydmFsID0gbWlsbGlz ZWNvbmQ7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc3RlcCA9PSBudWxsID8gaW50ZXJ2YWwg OiBpbnRlcnZhbC5ldmVyeShzdGVwKTsKICB9CgogIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHkp IHsKICAgIHJldHVybiBuZXcgRGF0ZShpbnZlcnQoeSkpOwogIH07CgogIHNjYWxlLmRvbWFpbiA9 IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gZG9tYWluKG1hcCQz LmNhbGwoXywgbnVtYmVyJDMpKSA6IGRvbWFpbigpLm1hcChkYXRlJDEpOwogIH07CgogIHNjYWxl LnRpY2tzID0gZnVuY3Rpb24oaW50ZXJ2YWwsIHN0ZXApIHsKICAgIHZhciBkID0gZG9tYWluKCks CiAgICAgICAgdDAgPSBkWzBdLAogICAgICAgIHQxID0gZFtkLmxlbmd0aCAtIDFdLAogICAgICAg IHIgPSB0MSA8IHQwLAogICAgICAgIHQ7CiAgICBpZiAocikgdCA9IHQwLCB0MCA9IHQxLCB0MSA9 IHQ7CiAgICB0ID0gdGlja0ludGVydmFsKGludGVydmFsLCB0MCwgdDEsIHN0ZXApOwogICAgdCA9 IHQgPyB0LnJhbmdlKHQwLCB0MSArIDEpIDogW107IC8vIGluY2x1c2l2ZSBzdG9wCiAgICByZXR1 cm4gciA/IHQucmV2ZXJzZSgpIDogdDsKICB9OwoKICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rp b24oY291bnQsIHNwZWNpZmllcikgewogICAgcmV0dXJuIHNwZWNpZmllciA9PSBudWxsID8gdGlj a0Zvcm1hdCA6IGZvcm1hdChzcGVjaWZpZXIpOwogIH07CgogIHNjYWxlLm5pY2UgPSBmdW5jdGlv bihpbnRlcnZhbCwgc3RlcCkgewogICAgdmFyIGQgPSBkb21haW4oKTsKICAgIHJldHVybiAoaW50 ZXJ2YWwgPSB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgc3Rl cCkpCiAgICAgICAgPyBkb21haW4obmljZShkLCBpbnRlcnZhbCkpCiAgICAgICAgOiBzY2FsZTsK ICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gY29weShzY2FsZSwg Y2FsZW5kYXIoeWVhciwgbW9udGgsIHdlZWssIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1p bGxpc2Vjb25kLCBmb3JtYXQpKTsKICB9OwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIHRp bWUoKSB7CiAgcmV0dXJuIGluaXRSYW5nZS5hcHBseShjYWxlbmRhcih5ZWFyLCBtb250aCwgc3Vu ZGF5LCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCwgZXhwb3J0cy50aW1l Rm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDIwMDAsIDAsIDEpLCBuZXcgRGF0ZSgyMDAwLCAwLCAy KV0pLCBhcmd1bWVudHMpOwp9CgpmdW5jdGlvbiB1dGNUaW1lKCkgewogIHJldHVybiBpbml0UmFu Z2UuYXBwbHkoY2FsZW5kYXIodXRjWWVhciwgdXRjTW9udGgsIHV0Y1N1bmRheSwgdXRjRGF5LCB1 dGNIb3VyLCB1dGNNaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsIGV4cG9ydHMudXRjRm9ybWF0 KS5kb21haW4oW0RhdGUuVVRDKDIwMDAsIDAsIDEpLCBEYXRlLlVUQygyMDAwLCAwLCAyKV0pLCBh cmd1bWVudHMpOwp9CgpmdW5jdGlvbiB0cmFuc2Zvcm1lciQyKCkgewogIHZhciB4MCA9IDAsCiAg ICAgIHgxID0gMSwKICAgICAgdDAsCiAgICAgIHQxLAogICAgICBrMTAsCiAgICAgIHRyYW5zZm9y bSwKICAgICAgaW50ZXJwb2xhdG9yID0gaWRlbnRpdHkkNiwKICAgICAgY2xhbXAgPSBmYWxzZSwK ICAgICAgdW5rbm93bjsKCiAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgcmV0dXJuIGlzTmFOKHgg PSAreCkgPyB1bmtub3duIDogaW50ZXJwb2xhdG9yKGsxMCA9PT0gMCA/IDAuNSA6ICh4ID0gKHRy YW5zZm9ybSh4KSAtIHQwKSAqIGsxMCwgY2xhbXAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB4 KSkgOiB4KSk7CiAgfQoKICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4g YXJndW1lbnRzLmxlbmd0aCA/ICh0MCA9IHRyYW5zZm9ybSh4MCA9ICtfWzBdKSwgdDEgPSB0cmFu c2Zvcm0oeDEgPSArX1sxXSksIGsxMCA9IHQwID09PSB0MSA/IDAgOiAxIC8gKHQxIC0gdDApLCBz Y2FsZSkgOiBbeDAsIHgxXTsKICB9OwoKICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsYW1wID0gISFfLCBzY2FsZSkgOiBjbGFtcDsK ICB9OwoKICBzY2FsZS5pbnRlcnBvbGF0b3IgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJn dW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0b3IgPSBfLCBzY2FsZSkgOiBpbnRlcnBvbGF0b3I7 CiAgfTsKCiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duOwogIH07CgogIHJldHVy biBmdW5jdGlvbih0KSB7CiAgICB0cmFuc2Zvcm0gPSB0LCB0MCA9IHQoeDApLCB0MSA9IHQoeDEp LCBrMTAgPSB0MCA9PT0gdDEgPyAwIDogMSAvICh0MSAtIHQwKTsKICAgIHJldHVybiBzY2FsZTsK ICB9Owp9CgpmdW5jdGlvbiBjb3B5JDEoc291cmNlLCB0YXJnZXQpIHsKICByZXR1cm4gdGFyZ2V0 CiAgICAgIC5kb21haW4oc291cmNlLmRvbWFpbigpKQogICAgICAuaW50ZXJwb2xhdG9yKHNvdXJj ZS5pbnRlcnBvbGF0b3IoKSkKICAgICAgLmNsYW1wKHNvdXJjZS5jbGFtcCgpKQogICAgICAudW5r bm93bihzb3VyY2UudW5rbm93bigpKTsKfQoKZnVuY3Rpb24gc2VxdWVudGlhbCgpIHsKICB2YXIg c2NhbGUgPSBsaW5lYXJpc2godHJhbnNmb3JtZXIkMigpKGlkZW50aXR5JDYpKTsKCiAgc2NhbGUu Y29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGNvcHkkMShzY2FsZSwgc2VxdWVudGlhbCgp KTsKICB9OwoKICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2FsZSwgYXJndW1lbnRz KTsKfQoKZnVuY3Rpb24gc2VxdWVudGlhbExvZygpIHsKICB2YXIgc2NhbGUgPSBsb2dnaXNoKHRy YW5zZm9ybWVyJDIoKSkuZG9tYWluKFsxLCAxMF0pOwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24o KSB7CiAgICByZXR1cm4gY29weSQxKHNjYWxlLCBzZXF1ZW50aWFsTG9nKCkpLmJhc2Uoc2NhbGUu YmFzZSgpKTsKICB9OwoKICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2FsZSwgYXJn dW1lbnRzKTsKfQoKZnVuY3Rpb24gc2VxdWVudGlhbFN5bWxvZygpIHsKICB2YXIgc2NhbGUgPSBz eW1sb2dpc2godHJhbnNmb3JtZXIkMigpKTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewog ICAgcmV0dXJuIGNvcHkkMShzY2FsZSwgc2VxdWVudGlhbFN5bWxvZygpKS5jb25zdGFudChzY2Fs ZS5jb25zdGFudCgpKTsKICB9OwoKICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2Fs ZSwgYXJndW1lbnRzKTsKfQoKZnVuY3Rpb24gc2VxdWVudGlhbFBvdygpIHsKICB2YXIgc2NhbGUg PSBwb3dpc2godHJhbnNmb3JtZXIkMigpKTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewog ICAgcmV0dXJuIGNvcHkkMShzY2FsZSwgc2VxdWVudGlhbFBvdygpKS5leHBvbmVudChzY2FsZS5l eHBvbmVudCgpKTsKICB9OwoKICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2FsZSwg YXJndW1lbnRzKTsKfQoKZnVuY3Rpb24gc2VxdWVudGlhbFNxcnQoKSB7CiAgcmV0dXJuIHNlcXVl bnRpYWxQb3cuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5leHBvbmVudCgwLjUpOwp9CgpmdW5jdGlv biBzZXF1ZW50aWFsUXVhbnRpbGUoKSB7CiAgdmFyIGRvbWFpbiA9IFtdLAogICAgICBpbnRlcnBv bGF0b3IgPSBpZGVudGl0eSQ2OwoKICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICBpZiAoIWlzTmFO KHggPSAreCkpIHJldHVybiBpbnRlcnBvbGF0b3IoKGJpc2VjdFJpZ2h0KGRvbWFpbiwgeCkgLSAx KSAvIChkb21haW4ubGVuZ3RoIC0gMSkpOwogIH0KCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24o XykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7CiAg ICBkb21haW4gPSBbXTsKICAgIGZvciAodmFyIGkgPSAwLCBuID0gXy5sZW5ndGgsIGQ7IGkgPCBu OyArK2kpIGlmIChkID0gX1tpXSwgZCAhPSBudWxsICYmICFpc05hTihkID0gK2QpKSBkb21haW4u cHVzaChkKTsKICAgIGRvbWFpbi5zb3J0KGFzY2VuZGluZyk7CiAgICByZXR1cm4gc2NhbGU7CiAg fTsKCiAgc2NhbGUuaW50ZXJwb2xhdG9yID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdG9yID0gXywgc2NhbGUpIDogaW50ZXJwb2xhdG9yOwog IH07CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBzZXF1ZW50aWFsUXVh bnRpbGUoaW50ZXJwb2xhdG9yKS5kb21haW4oZG9tYWluKTsKICB9OwoKICByZXR1cm4gaW5pdElu dGVycG9sYXRvci5hcHBseShzY2FsZSwgYXJndW1lbnRzKTsKfQoKZnVuY3Rpb24gdHJhbnNmb3Jt ZXIkMygpIHsKICB2YXIgeDAgPSAwLAogICAgICB4MSA9IDAuNSwKICAgICAgeDIgPSAxLAogICAg ICB0MCwKICAgICAgdDEsCiAgICAgIHQyLAogICAgICBrMTAsCiAgICAgIGsyMSwKICAgICAgaW50 ZXJwb2xhdG9yID0gaWRlbnRpdHkkNiwKICAgICAgdHJhbnNmb3JtLAogICAgICBjbGFtcCA9IGZh bHNlLAogICAgICB1bmtub3duOwoKICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICByZXR1cm4gaXNO YU4oeCA9ICt4KSA/IHVua25vd24gOiAoeCA9IDAuNSArICgoeCA9ICt0cmFuc2Zvcm0oeCkpIC0g dDEpICogKHggPCB0MSA/IGsxMCA6IGsyMSksIGludGVycG9sYXRvcihjbGFtcCA/IE1hdGgubWF4 KDAsIE1hdGgubWluKDEsIHgpKSA6IHgpKTsKICB9CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9u KF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHQwID0gdHJhbnNmb3JtKHgwID0g K19bMF0pLCB0MSA9IHRyYW5zZm9ybSh4MSA9ICtfWzFdKSwgdDIgPSB0cmFuc2Zvcm0oeDIgPSAr X1syXSksIGsxMCA9IHQwID09PSB0MSA/IDAgOiAwLjUgLyAodDEgLSB0MCksIGsyMSA9IHQxID09 PSB0MiA/IDAgOiAwLjUgLyAodDIgLSB0MSksIHNjYWxlKSA6IFt4MCwgeDEsIHgyXTsKICB9OwoK ICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3Ro ID8gKGNsYW1wID0gISFfLCBzY2FsZSkgOiBjbGFtcDsKICB9OwoKICBzY2FsZS5pbnRlcnBvbGF0 b3IgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBv bGF0b3IgPSBfLCBzY2FsZSkgOiBpbnRlcnBvbGF0b3I7CiAgfTsKCiAgc2NhbGUudW5rbm93biA9 IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBf LCBzY2FsZSkgOiB1bmtub3duOwogIH07CgogIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICB0cmFu c2Zvcm0gPSB0LCB0MCA9IHQoeDApLCB0MSA9IHQoeDEpLCB0MiA9IHQoeDIpLCBrMTAgPSB0MCA9 PT0gdDEgPyAwIDogMC41IC8gKHQxIC0gdDApLCBrMjEgPSB0MSA9PT0gdDIgPyAwIDogMC41IC8g KHQyIC0gdDEpOwogICAgcmV0dXJuIHNjYWxlOwogIH07Cn0KCmZ1bmN0aW9uIGRpdmVyZ2luZygp IHsKICB2YXIgc2NhbGUgPSBsaW5lYXJpc2godHJhbnNmb3JtZXIkMygpKGlkZW50aXR5JDYpKTsK CiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGNvcHkkMShzY2FsZSwgZGl2 ZXJnaW5nKCkpOwogIH07CgogIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5KHNjYWxlLCBh cmd1bWVudHMpOwp9CgpmdW5jdGlvbiBkaXZlcmdpbmdMb2coKSB7CiAgdmFyIHNjYWxlID0gbG9n Z2lzaCh0cmFuc2Zvcm1lciQzKCkpLmRvbWFpbihbMC4xLCAxLCAxMF0pOwoKICBzY2FsZS5jb3B5 ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gY29weSQxKHNjYWxlLCBkaXZlcmdpbmdMb2coKSku YmFzZShzY2FsZS5iYXNlKCkpOwogIH07CgogIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5 KHNjYWxlLCBhcmd1bWVudHMpOwp9CgpmdW5jdGlvbiBkaXZlcmdpbmdTeW1sb2coKSB7CiAgdmFy IHNjYWxlID0gc3ltbG9naXNoKHRyYW5zZm9ybWVyJDMoKSk7CgogIHNjYWxlLmNvcHkgPSBmdW5j dGlvbigpIHsKICAgIHJldHVybiBjb3B5JDEoc2NhbGUsIGRpdmVyZ2luZ1N5bWxvZygpKS5jb25z dGFudChzY2FsZS5jb25zdGFudCgpKTsKICB9OwoKICByZXR1cm4gaW5pdEludGVycG9sYXRvci5h cHBseShzY2FsZSwgYXJndW1lbnRzKTsKfQoKZnVuY3Rpb24gZGl2ZXJnaW5nUG93KCkgewogIHZh ciBzY2FsZSA9IHBvd2lzaCh0cmFuc2Zvcm1lciQzKCkpOwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rp b24oKSB7CiAgICByZXR1cm4gY29weSQxKHNjYWxlLCBkaXZlcmdpbmdQb3coKSkuZXhwb25lbnQo c2NhbGUuZXhwb25lbnQoKSk7CiAgfTsKCiAgcmV0dXJuIGluaXRJbnRlcnBvbGF0b3IuYXBwbHko c2NhbGUsIGFyZ3VtZW50cyk7Cn0KCmZ1bmN0aW9uIGRpdmVyZ2luZ1NxcnQoKSB7CiAgcmV0dXJu IGRpdmVyZ2luZ1Bvdy5hcHBseShudWxsLCBhcmd1bWVudHMpLmV4cG9uZW50KDAuNSk7Cn0KCmZ1 bmN0aW9uIGNvbG9ycyhzcGVjaWZpZXIpIHsKICB2YXIgbiA9IHNwZWNpZmllci5sZW5ndGggLyA2 IHwgMCwgY29sb3JzID0gbmV3IEFycmF5KG4pLCBpID0gMDsKICB3aGlsZSAoaSA8IG4pIGNvbG9y c1tpXSA9ICIjIiArIHNwZWNpZmllci5zbGljZShpICogNiwgKytpICogNik7CiAgcmV0dXJuIGNv bG9yczsKfQoKdmFyIGNhdGVnb3J5MTAgPSBjb2xvcnMoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2Mjcy ODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpOwoKdmFyIEFjY2VudCA9IGNv bG9ycygiN2ZjOTdmYmVhZWQ0ZmRjMDg2ZmZmZjk5Mzg2Y2IwZjAwMjdmYmY1YjE3NjY2NjY2Iik7 Cgp2YXIgRGFyazIgPSBjb2xvcnMoIjFiOWU3N2Q5NWYwMjc1NzBiM2U3Mjk4YTY2YTYxZWU2YWIw MmE2NzYxZDY2NjY2NiIpOwoKdmFyIFBhaXJlZCA9IGNvbG9ycygiYTZjZWUzMWY3OGI0YjJkZjhh MzNhMDJjZmI5YTk5ZTMxYTFjZmRiZjZmZmY3ZjAwY2FiMmQ2NmEzZDlhZmZmZjk5YjE1OTI4Iik7 Cgp2YXIgUGFzdGVsMSA9IGNvbG9ycygiZmJiNGFlYjNjZGUzY2NlYmM1ZGVjYmU0ZmVkOWE2ZmZm ZmNjZTVkOGJkZmRkYWVjZjJmMmYyIik7Cgp2YXIgUGFzdGVsMiA9IGNvbG9ycygiYjNlMmNkZmRj ZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIik7Cgp2YXIgU2V0MSA9IGNv bG9ycygiZTQxYTFjMzc3ZWI4NGRhZjRhOTg0ZWEzZmY3ZjAwZmZmZjMzYTY1NjI4Zjc4MWJmOTk5 OTk5Iik7Cgp2YXIgU2V0MiA9IGNvbG9ycygiNjZjMmE1ZmM4ZDYyOGRhMGNiZTc4YWMzYTZkODU0 ZmZkOTJmZTVjNDk0YjNiM2IzIik7Cgp2YXIgU2V0MyA9IGNvbG9ycygiOGRkM2M3ZmZmZmIzYmVi YWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZm Iik7Cgp2YXIgVGFibGVhdTEwID0gY29sb3JzKCI0ZTc5YTdmMjhlMmNlMTU3NTk3NmI3YjI1OWEx NGZlZGM5NDlhZjdhYTFmZjlkYTc5Yzc1NWZiYWIwYWIiKTsKCmZ1bmN0aW9uIHJhbXAoc2NoZW1l KSB7CiAgcmV0dXJuIHJnYkJhc2lzKHNjaGVtZVtzY2hlbWUubGVuZ3RoIC0gMV0pOwp9Cgp2YXIg c2NoZW1lID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAiZDhiMzY1ZjVmNWY1NWFiNGFjIiwKICAi YTY2MTFhZGZjMjdkODBjZGMxMDE4NTcxIiwKICAiYTY2MTFhZGZjMjdkZjVmNWY1ODBjZGMxMDE4 NTcxIiwKICAiOGM1MTBhZDhiMzY1ZjZlOGMzYzdlYWU1NWFiNGFjMDE2NjVlIiwKICAiOGM1MTBh ZDhiMzY1ZjZlOGMzZjVmNWY1YzdlYWU1NWFiNGFjMDE2NjVlIiwKICAiOGM1MTBhYmY4MTJkZGZj MjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwKICAiOGM1MTBhYmY4MTJkZGZjMjdk ZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwKICAiNTQzMDA1OGM1MTBhYmY4 MTJkZGZjMjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAzYzMwIiwKICAiNTQzMDA1 OGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAz YzMwIgopLm1hcChjb2xvcnMpOwoKdmFyIEJyQkcgPSByYW1wKHNjaGVtZSk7Cgp2YXIgc2NoZW1l JDEgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICJhZjhkYzNmN2Y3Zjc3ZmJmN2IiLAogICI3YjMy OTRjMmE1Y2ZhNmRiYTAwMDg4MzciLAogICI3YjMyOTRjMmE1Y2ZmN2Y3ZjdhNmRiYTAwMDg4Mzci LAogICI3NjJhODNhZjhkYzNlN2Q0ZThkOWYwZDM3ZmJmN2IxYjc4MzciLAogICI3NjJhODNhZjhk YzNlN2Q0ZThmN2Y3ZjdkOWYwZDM3ZmJmN2IxYjc4MzciLAogICI3NjJhODM5OTcwYWJjMmE1Y2Zl N2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLAogICI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0 ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLAogICI0MDAwNGI3NjJhODM5OTcwYWJj MmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiLAogICI0MDAwNGI3NjJh ODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIi CikubWFwKGNvbG9ycyk7Cgp2YXIgUFJHbiA9IHJhbXAoc2NoZW1lJDEpOwoKdmFyIHNjaGVtZSQy ID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAiZTlhM2M5ZjdmN2Y3YTFkNzZhIiwKICAiZDAxYzhi ZjFiNmRhYjhlMTg2NGRhYzI2IiwKICAiZDAxYzhiZjFiNmRhZjdmN2Y3YjhlMTg2NGRhYzI2IiwK ICAiYzUxYjdkZTlhM2M5ZmRlMGVmZTZmNWQwYTFkNzZhNGQ5MjIxIiwKICAiYzUxYjdkZTlhM2M5 ZmRlMGVmZjdmN2Y3ZTZmNWQwYTFkNzZhNGQ5MjIxIiwKICAiYzUxYjdkZGU3N2FlZjFiNmRhZmRl MGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwKICAiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVm ZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwKICAiOGUwMTUyYzUxYjdkZGU3N2FlZjFi NmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5IiwKICAiOGUwMTUyYzUxYjdk ZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5Igop Lm1hcChjb2xvcnMpOwoKdmFyIFBpWUcgPSByYW1wKHNjaGVtZSQyKTsKCnZhciBzY2hlbWUkMyA9 IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgIjk5OGVjM2Y3ZjdmN2YxYTM0MCIsCiAgIjVlM2M5OWIy YWJkMmZkYjg2M2U2NjEwMSIsCiAgIjVlM2M5OWIyYWJkMmY3ZjdmN2ZkYjg2M2U2NjEwMSIsCiAg IjU0Mjc4ODk5OGVjM2Q4ZGFlYmZlZTBiNmYxYTM0MGIzNTgwNiIsCiAgIjU0Mjc4ODk5OGVjM2Q4 ZGFlYmY3ZjdmN2ZlZTBiNmYxYTM0MGIzNTgwNiIsCiAgIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFl YmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsCiAgIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3 ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsCiAgIjJkMDA0YjU0Mjc4ODgwNzNhY2IyYWJk MmQ4ZGFlYmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOCIsCiAgIjJkMDA0YjU0Mjc4ODgw NzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOCIKKS5t YXAoY29sb3JzKTsKCnZhciBQdU9yID0gcmFtcChzY2hlbWUkMyk7Cgp2YXIgc2NoZW1lJDQgPSBu ZXcgQXJyYXkoMykuY29uY2F0KAogICJlZjhhNjJmN2Y3Zjc2N2E5Y2YiLAogICJjYTAwMjBmNGE1 ODI5MmM1ZGUwNTcxYjAiLAogICJjYTAwMjBmNGE1ODJmN2Y3Zjc5MmM1ZGUwNTcxYjAiLAogICJi MjE4MmJlZjhhNjJmZGRiYzdkMWU1ZjA2N2E5Y2YyMTY2YWMiLAogICJiMjE4MmJlZjhhNjJmZGRi YzdmN2Y3ZjdkMWU1ZjA2N2E5Y2YyMTY2YWMiLAogICJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdk MWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLAogICJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3 ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLAogICI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJm ZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiLAogICI2NzAwMWZiMjE4MmJkNjYw NGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiCikubWFw KGNvbG9ycyk7Cgp2YXIgUmRCdSA9IHJhbXAoc2NoZW1lJDQpOwoKdmFyIHNjaGVtZSQ1ID0gbmV3 IEFycmF5KDMpLmNvbmNhdCgKICAiZWY4YTYyZmZmZmZmOTk5OTk5IiwKICAiY2EwMDIwZjRhNTgy YmFiYWJhNDA0MDQwIiwKICAiY2EwMDIwZjRhNTgyZmZmZmZmYmFiYWJhNDA0MDQwIiwKICAiYjIx ODJiZWY4YTYyZmRkYmM3ZTBlMGUwOTk5OTk5NGQ0ZDRkIiwKICAiYjIxODJiZWY4YTYyZmRkYmM3 ZmZmZmZmZTBlMGUwOTk5OTk5NGQ0ZDRkIiwKICAiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBl MGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwKICAiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZm ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwKICAiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRk YmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIiwKICAiNjcwMDFmYjIxODJiZDY2MDRk ZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIgopLm1hcChj b2xvcnMpOwoKdmFyIFJkR3kgPSByYW1wKHNjaGVtZSQ1KTsKCnZhciBzY2hlbWUkNiA9IG5ldyBB cnJheSgzKS5jb25jYXQoCiAgImZjOGQ1OWZmZmZiZjkxYmZkYiIsCiAgImQ3MTkxY2ZkYWU2MWFi ZDllOTJjN2JiNiIsCiAgImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZDllOTJjN2JiNiIsCiAgImQ3MzAy N2ZjOGQ1OWZlZTA5MGUwZjNmODkxYmZkYjQ1NzViNCIsCiAgImQ3MzAyN2ZjOGQ1OWZlZTA5MGZm ZmZiZmUwZjNmODkxYmZkYjQ1NzViNCIsCiAgImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGUwZjNm OGFiZDllOTc0YWRkMTQ1NzViNCIsCiAgImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUw ZjNmOGFiZDllOTc0YWRkMTQ1NzViNCIsCiAgImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5 MGUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NSIsCiAgImE1MDAyNmQ3MzAyN2Y0NmQ0M2Zk YWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NSIKKS5tYXAoY29s b3JzKTsKCnZhciBSZFlsQnUgPSByYW1wKHNjaGVtZSQ2KTsKCnZhciBzY2hlbWUkNyA9IG5ldyBB cnJheSgzKS5jb25jYXQoCiAgImZjOGQ1OWZmZmZiZjkxY2Y2MCIsCiAgImQ3MTkxY2ZkYWU2MWE2 ZDk2YTFhOTY0MSIsCiAgImQ3MTkxY2ZkYWU2MWZmZmZiZmE2ZDk2YTFhOTY0MSIsCiAgImQ3MzAy N2ZjOGQ1OWZlZTA4YmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsCiAgImQ3MzAyN2ZjOGQ1OWZlZTA4YmZm ZmZiZmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsCiAgImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmQ5ZWY4 YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsCiAgImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmQ5 ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsCiAgImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4 YmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MDAwNjgzNyIsCiAgImE1MDAyNmQ3MzAyN2Y0NmQ0M2Zk YWU2MWZlZTA4YmZmZmZiZmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MDAwNjgzNyIKKS5tYXAoY29s b3JzKTsKCnZhciBSZFlsR24gPSByYW1wKHNjaGVtZSQ3KTsKCnZhciBzY2hlbWUkOCA9IG5ldyBB cnJheSgzKS5jb25jYXQoCiAgImZjOGQ1OWZmZmZiZjk5ZDU5NCIsCiAgImQ3MTkxY2ZkYWU2MWFi ZGRhNDJiODNiYSIsCiAgImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZGRhNDJiODNiYSIsCiAgImQ1M2U0 ZmZjOGQ1OWZlZTA4YmU2ZjU5ODk5ZDU5NDMyODhiZCIsCiAgImQ1M2U0ZmZjOGQ1OWZlZTA4YmZm ZmZiZmU2ZjU5ODk5ZDU5NDMyODhiZCIsCiAgImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmU2ZjU5 OGFiZGRhNDY2YzJhNTMyODhiZCIsCiAgImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2 ZjU5OGFiZGRhNDY2YzJhNTMyODhiZCIsCiAgIjllMDE0MmQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4 YmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMiIsCiAgIjllMDE0MmQ1M2U0ZmY0NmQ0M2Zk YWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMiIKKS5tYXAoY29s b3JzKTsKCnZhciBTcGVjdHJhbCA9IHJhbXAoc2NoZW1lJDgpOwoKdmFyIHNjaGVtZSQ5ID0gbmV3 IEFycmF5KDMpLmNvbmNhdCgKICAiZTVmNWY5OTlkOGM5MmNhMjVmIiwKICAiZWRmOGZiYjJlMmUy NjZjMmE0MjM4YjQ1IiwKICAiZWRmOGZiYjJlMmUyNjZjMmE0MmNhMjVmMDA2ZDJjIiwKICAiZWRm OGZiY2NlY2U2OTlkOGM5NjZjMmE0MmNhMjVmMDA2ZDJjIiwKICAiZWRmOGZiY2NlY2U2OTlkOGM5 NjZjMmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwKICAiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZj MmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwKICAiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0 NDFhZTc2MjM4YjQ1MDA2ZDJjMDA0NDFiIgopLm1hcChjb2xvcnMpOwoKdmFyIEJ1R24gPSByYW1w KHNjaGVtZSQ5KTsKCnZhciBzY2hlbWUkYSA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgImUwZWNm NDllYmNkYTg4NTZhNyIsCiAgImVkZjhmYmIzY2RlMzhjOTZjNjg4NDE5ZCIsCiAgImVkZjhmYmIz Y2RlMzhjOTZjNjg4NTZhNzgxMGY3YyIsCiAgImVkZjhmYmJmZDNlNjllYmNkYThjOTZjNjg4NTZh NzgxMGY3YyIsCiAgImVkZjhmYmJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIs CiAgImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIsCiAg ImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDgxMGY3YzRkMDA0YiIK KS5tYXAoY29sb3JzKTsKCnZhciBCdVB1ID0gcmFtcChzY2hlbWUkYSk7Cgp2YXIgc2NoZW1lJGIg PSBuZXcgQXJyYXkoMykuY29uY2F0KAogICJlMGYzZGJhOGRkYjU0M2EyY2EiLAogICJmMGY5ZThi YWU0YmM3YmNjYzQyYjhjYmUiLAogICJmMGY5ZThiYWU0YmM3YmNjYzQ0M2EyY2EwODY4YWMiLAog ICJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0M2EyY2EwODY4YWMiLAogICJmMGY5ZThjY2ViYzVh OGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLAogICJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRk YjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLAogICJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3 YmNjYzQ0ZWIzZDMyYjhjYmUwODY4YWMwODQwODEiCikubWFwKGNvbG9ycyk7Cgp2YXIgR25CdSA9 IHJhbXAoc2NoZW1lJGIpOwoKdmFyIHNjaGVtZSRjID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAi ZmVlOGM4ZmRiYjg0ZTM0YTMzIiwKICAiZmVmMGQ5ZmRjYzhhZmM4ZDU5ZDczMDFmIiwKICAiZmVm MGQ5ZmRjYzhhZmM4ZDU5ZTM0YTMzYjMwMDAwIiwKICAiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5 ZTM0YTMzYjMwMDAwIiwKICAiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkw MDAwIiwKICAiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkwMDAw IiwKICAiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmYjMwMDAwN2Yw MDAwIgopLm1hcChjb2xvcnMpOwoKdmFyIE9yUmQgPSByYW1wKHNjaGVtZSRjKTsKCnZhciBzY2hl bWUkZCA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgImVjZTJmMGE2YmRkYjFjOTA5OSIsCiAgImY2 ZWZmN2JkYzllMTY3YTljZjAyODE4YSIsCiAgImY2ZWZmN2JkYzllMTY3YTljZjFjOTA5OTAxNmM1 OSIsCiAgImY2ZWZmN2QwZDFlNmE2YmRkYjY3YTljZjFjOTA5OTAxNmM1OSIsCiAgImY2ZWZmN2Qw ZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsCiAgImZmZjdmYmVjZTJmMGQwZDFl NmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsCiAgImZmZjdmYmVjZTJmMGQwZDFlNmE2 YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNmM1OTAxNDYzNiIKKS5tYXAoY29sb3JzKTsKCnZhciBQ dUJ1R24gPSByYW1wKHNjaGVtZSRkKTsKCnZhciBzY2hlbWUkZSA9IG5ldyBBcnJheSgzKS5jb25j YXQoCiAgImVjZTdmMmE2YmRkYjJiOGNiZSIsCiAgImYxZWVmNmJkYzllMTc0YTljZjA1NzBiMCIs CiAgImYxZWVmNmJkYzllMTc0YTljZjJiOGNiZTA0NWE4ZCIsCiAgImYxZWVmNmQwZDFlNmE2YmRk Yjc0YTljZjJiOGNiZTA0NWE4ZCIsCiAgImYxZWVmNmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1 NzBiMDAzNGU3YiIsCiAgImZmZjdmYmVjZTdmMmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBi MDAzNGU3YiIsCiAgImZmZjdmYmVjZTdmMmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDA0 NWE4ZDAyMzg1OCIKKS5tYXAoY29sb3JzKTsKCnZhciBQdUJ1ID0gcmFtcChzY2hlbWUkZSk7Cgp2 YXIgc2NoZW1lJGYgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICJlN2UxZWZjOTk0YzdkZDFjNzci LAogICJmMWVlZjZkN2I1ZDhkZjY1YjBjZTEyNTYiLAogICJmMWVlZjZkN2I1ZDhkZjY1YjBkZDFj Nzc5ODAwNDMiLAogICJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBkZDFjNzc5ODAwNDMiLAogICJm MWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLAogICJmN2Y0ZjllN2Ux ZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLAogICJmN2Y0ZjllN2UxZWZk NGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5ODAwNDM2NzAwMWYiCikubWFwKGNvbG9ycyk7 Cgp2YXIgUHVSZCA9IHJhbXAoc2NoZW1lJGYpOwoKdmFyIHNjaGVtZSRnID0gbmV3IEFycmF5KDMp LmNvbmNhdCgKICAiZmRlMGRkZmE5ZmI1YzUxYjhhIiwKICAiZmVlYmUyZmJiNGI5Zjc2OGExYWUw MTdlIiwKICAiZmVlYmUyZmJiNGI5Zjc2OGExYzUxYjhhN2EwMTc3IiwKICAiZmVlYmUyZmNjNWMw ZmE5ZmI1Zjc2OGExYzUxYjhhN2EwMTc3IiwKICAiZmVlYmUyZmNjNWMwZmE5ZmI1Zjc2OGExZGQz NDk3YWUwMTdlN2EwMTc3IiwKICAiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3 YWUwMTdlN2EwMTc3IiwKICAiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUw MTdlN2EwMTc3NDkwMDZhIgopLm1hcChjb2xvcnMpOwoKdmFyIFJkUHUgPSByYW1wKHNjaGVtZSRn KTsKCnZhciBzY2hlbWUkaCA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgImVkZjhiMTdmY2RiYjJj N2ZiOCIsCiAgImZmZmZjY2ExZGFiNDQxYjZjNDIyNWVhOCIsCiAgImZmZmZjY2ExZGFiNDQxYjZj NDJjN2ZiODI1MzQ5NCIsCiAgImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDJjN2ZiODI1MzQ5NCIs CiAgImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsCiAgImZmZmZk OWVkZjhiMWM3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsCiAgImZmZmZkOWVk ZjhiMWM3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODI1MzQ5NDA4MWQ1OCIKKS5tYXAoY29s b3JzKTsKCnZhciBZbEduQnUgPSByYW1wKHNjaGVtZSRoKTsKCnZhciBzY2hlbWUkaSA9IG5ldyBB cnJheSgzKS5jb25jYXQoCiAgImY3ZmNiOWFkZGQ4ZTMxYTM1NCIsCiAgImZmZmZjY2MyZTY5OTc4 YzY3OTIzODQ0MyIsCiAgImZmZmZjY2MyZTY5OTc4YzY3OTMxYTM1NDAwNjgzNyIsCiAgImZmZmZj Y2Q5ZjBhM2FkZGQ4ZTc4YzY3OTMxYTM1NDAwNjgzNyIsCiAgImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4 YzY3OTQxYWI1ZDIzODQ0MzAwNWEzMiIsCiAgImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3 OTQxYWI1ZDIzODQ0MzAwNWEzMiIsCiAgImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQx YWI1ZDIzODQ0MzAwNjgzNzAwNDUyOSIKKS5tYXAoY29sb3JzKTsKCnZhciBZbEduID0gcmFtcChz Y2hlbWUkaSk7Cgp2YXIgc2NoZW1lJGogPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICJmZmY3YmNm ZWM0NGZkOTVmMGUiLAogICJmZmZmZDRmZWQ5OGVmZTk5MjljYzRjMDIiLAogICJmZmZmZDRmZWQ5 OGVmZTk5MjlkOTVmMGU5OTM0MDQiLAogICJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjlkOTVmMGU5 OTM0MDQiLAogICJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLAog ICJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLAogICJm ZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI5OTM0MDQ2NjI1MDYiCiku bWFwKGNvbG9ycyk7Cgp2YXIgWWxPckJyID0gcmFtcChzY2hlbWUkaik7Cgp2YXIgc2NoZW1lJGsg PSBuZXcgQXJyYXkoMykuY29uY2F0KAogICJmZmVkYTBmZWIyNGNmMDNiMjAiLAogICJmZmZmYjJm ZWNjNWNmZDhkM2NlMzFhMWMiLAogICJmZmZmYjJmZWNjNWNmZDhkM2NmMDNiMjBiZDAwMjYiLAog ICJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmMDNiMjBiZDAwMjYiLAogICJmZmZmYjJmZWQ5NzZm ZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLAogICJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIy NGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLAogICJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNm ZDhkM2NmYzRlMmFlMzFhMWNiZDAwMjY4MDAwMjYiCikubWFwKGNvbG9ycyk7Cgp2YXIgWWxPclJk ID0gcmFtcChzY2hlbWUkayk7Cgp2YXIgc2NoZW1lJGwgPSBuZXcgQXJyYXkoMykuY29uY2F0KAog ICJkZWViZjc5ZWNhZTEzMTgyYmQiLAogICJlZmYzZmZiZGQ3ZTc2YmFlZDYyMTcxYjUiLAogICJl ZmYzZmZiZGQ3ZTc2YmFlZDYzMTgyYmQwODUxOWMiLAogICJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFl ZDYzMTgyYmQwODUxOWMiLAogICJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUw ODQ1OTQiLAogICJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1 OTQiLAogICJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODUxOWMw ODMwNmIiCikubWFwKGNvbG9ycyk7Cgp2YXIgQmx1ZXMgPSByYW1wKHNjaGVtZSRsKTsKCnZhciBz Y2hlbWUkbSA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgImU1ZjVlMGExZDk5YjMxYTM1NCIsCiAg ImVkZjhlOWJhZTRiMzc0YzQ3NjIzOGI0NSIsCiAgImVkZjhlOWJhZTRiMzc0YzQ3NjMxYTM1NDAw NmQyYyIsCiAgImVkZjhlOWM3ZTljMGExZDk5Yjc0YzQ3NjMxYTM1NDAwNmQyYyIsCiAgImVkZjhl OWM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsCiAgImY3ZmNmNWU1ZjVlMGM3 ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsCiAgImY3ZmNmNWU1ZjVlMGM3ZTlj MGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNmQyYzAwNDQxYiIKKS5tYXAoY29sb3JzKTsKCnZh ciBHcmVlbnMgPSByYW1wKHNjaGVtZSRtKTsKCnZhciBzY2hlbWUkbiA9IG5ldyBBcnJheSgzKS5j b25jYXQoCiAgImYwZjBmMGJkYmRiZDYzNjM2MyIsCiAgImY3ZjdmN2NjY2NjYzk2OTY5NjUyNTI1 MiIsCiAgImY3ZjdmN2NjY2NjYzk2OTY5NjYzNjM2MzI1MjUyNSIsCiAgImY3ZjdmN2Q5ZDlkOWJk YmRiZDk2OTY5NjYzNjM2MzI1MjUyNSIsCiAgImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjczNzM3 MzUyNTI1MjI1MjUyNSIsCiAgImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUy NTI1MjI1MjUyNSIsCiAgImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1 MjI1MjUyNTAwMDAwMCIKKS5tYXAoY29sb3JzKTsKCnZhciBHcmV5cyA9IHJhbXAoc2NoZW1lJG4p OwoKdmFyIHNjaGVtZSRvID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAiZWZlZGY1YmNiZGRjNzU2 YmIxIiwKICAiZjJmMGY3Y2JjOWUyOWU5YWM4NmE1MWEzIiwKICAiZjJmMGY3Y2JjOWUyOWU5YWM4 NzU2YmIxNTQyNzhmIiwKICAiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4NzU2YmIxNTQyNzhmIiwK ICAiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwKICAiZmNmYmZk ZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwKICAiZmNmYmZkZWZl ZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNTQyNzhmM2YwMDdkIgopLm1hcChjb2xv cnMpOwoKdmFyIFB1cnBsZXMgPSByYW1wKHNjaGVtZSRvKTsKCnZhciBzY2hlbWUkcCA9IG5ldyBB cnJheSgzKS5jb25jYXQoCiAgImZlZTBkMmZjOTI3MmRlMmQyNiIsCiAgImZlZTVkOWZjYWU5MWZi NmE0YWNiMTgxZCIsCiAgImZlZTVkOWZjYWU5MWZiNmE0YWRlMmQyNmE1MGYxNSIsCiAgImZlZTVk OWZjYmJhMWZjOTI3MmZiNmE0YWRlMmQyNmE1MGYxNSIsCiAgImZlZTVkOWZjYmJhMWZjOTI3MmZi NmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsCiAgImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0 YWVmM2IyY2NiMTgxZDk5MDAwZCIsCiAgImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVm M2IyY2NiMTgxZGE1MGYxNTY3MDAwZCIKKS5tYXAoY29sb3JzKTsKCnZhciBSZWRzID0gcmFtcChz Y2hlbWUkcCk7Cgp2YXIgc2NoZW1lJHEgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICJmZWU2Y2Vm ZGFlNmJlNjU1MGQiLAogICJmZWVkZGVmZGJlODVmZDhkM2NkOTQ3MDEiLAogICJmZWVkZGVmZGJl ODVmZDhkM2NlNjU1MGRhNjM2MDMiLAogICJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NlNjU1MGRh NjM2MDMiLAogICJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLAog ICJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLAogICJm ZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDFhNjM2MDM3ZjI3MDQiCiku bWFwKGNvbG9ycyk7Cgp2YXIgT3JhbmdlcyA9IHJhbXAoc2NoZW1lJHEpOwoKZnVuY3Rpb24gY2l2 aWRpcyh0KSB7CiAgdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHQpKTsKICByZXR1cm4gInJn YigiCiAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKC00LjU0IC0g dCAqICgzNS4zNCAtIHQgKiAoMjM4MS43MyAtIHQgKiAoNjQwMi43IC0gdCAqICg3MDI0LjcyIC0g dCAqIDI3MTAuNTcpKSkpKSkpICsgIiwgIgogICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1 NSwgTWF0aC5yb3VuZCgzMi40OSArIHQgKiAoMTcwLjczICsgdCAqICg1Mi44MiAtIHQgKiAoMTMx LjQ2IC0gdCAqICgxNzYuNTggLSB0ICogNjcuMzcpKSkpKSkpICsgIiwgIgogICAgICArIE1hdGgu bWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCg4MS4yNCArIHQgKiAoNDQyLjM2IC0gdCAq ICgyNDgyLjQzIC0gdCAqICg2MTY3LjI0IC0gdCAqICg2NjE0Ljk0IC0gdCAqIDI0NzUuNjcpKSkp KSkpCiAgICAgICsgIikiOwp9Cgp2YXIgY3ViZWhlbGl4JDMgPSBjdWJlaGVsaXhMb25nKGN1YmVo ZWxpeCgzMDAsIDAuNSwgMC4wKSwgY3ViZWhlbGl4KC0yNDAsIDAuNSwgMS4wKSk7Cgp2YXIgd2Fy bSA9IGN1YmVoZWxpeExvbmcoY3ViZWhlbGl4KC0xMDAsIDAuNzUsIDAuMzUpLCBjdWJlaGVsaXgo ODAsIDEuNTAsIDAuOCkpOwoKdmFyIGNvb2wgPSBjdWJlaGVsaXhMb25nKGN1YmVoZWxpeCgyNjAs IDAuNzUsIDAuMzUpLCBjdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpOwoKdmFyIGMgPSBjdWJlaGVs aXgoKTsKCmZ1bmN0aW9uIHJhaW5ib3codCkgewogIGlmICh0IDwgMCB8fCB0ID4gMSkgdCAtPSBN YXRoLmZsb29yKHQpOwogIHZhciB0cyA9IE1hdGguYWJzKHQgLSAwLjUpOwogIGMuaCA9IDM2MCAq IHQgLSAxMDA7CiAgYy5zID0gMS41IC0gMS41ICogdHM7CiAgYy5sID0gMC44IC0gMC45ICogdHM7 CiAgcmV0dXJuIGMgKyAiIjsKfQoKdmFyIGMkMSA9IHJnYigpLAogICAgcGlfMV8zID0gTWF0aC5Q SSAvIDMsCiAgICBwaV8yXzMgPSBNYXRoLlBJICogMiAvIDM7CgpmdW5jdGlvbiBzaW5lYm93KHQp IHsKICB2YXIgeDsKICB0ID0gKDAuNSAtIHQpICogTWF0aC5QSTsKICBjJDEuciA9IDI1NSAqICh4 ID0gTWF0aC5zaW4odCkpICogeDsKICBjJDEuZyA9IDI1NSAqICh4ID0gTWF0aC5zaW4odCArIHBp XzFfMykpICogeDsKICBjJDEuYiA9IDI1NSAqICh4ID0gTWF0aC5zaW4odCArIHBpXzJfMykpICog eDsKICByZXR1cm4gYyQxICsgIiI7Cn0KCmZ1bmN0aW9uIHR1cmJvKHQpIHsKICB0ID0gTWF0aC5t YXgoMCwgTWF0aC5taW4oMSwgdCkpOwogIHJldHVybiAicmdiKCIKICAgICAgKyBNYXRoLm1heCgw LCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoMzQuNjEgKyB0ICogKDExNzIuMzMgLSB0ICogKDEw NzkzLjU2IC0gdCAqICgzMzMwMC4xMiAtIHQgKiAoMzgzOTQuNDkgLSB0ICogMTQ4MjUuMDUpKSkp KSkpICsgIiwgIgogICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCgy My4zMSArIHQgKiAoNTU3LjMzICsgdCAqICgxMjI1LjMzIC0gdCAqICgzNTc0Ljk2IC0gdCAqICgx MDczLjc3ICsgdCAqIDcwNy41NikpKSkpKSkgKyAiLCAiCiAgICAgICsgTWF0aC5tYXgoMCwgTWF0 aC5taW4oMjU1LCBNYXRoLnJvdW5kKDI3LjIgKyB0ICogKDMyMTEuMSAtIHQgKiAoMTUzMjcuOTcg LSB0ICogKDI3ODE0IC0gdCAqICgyMjU2OS4xOCAtIHQgKiA2ODM4LjY2KSkpKSkpKQogICAgICAr ICIpIjsKfQoKZnVuY3Rpb24gcmFtcCQxKHJhbmdlKSB7CiAgdmFyIG4gPSByYW5nZS5sZW5ndGg7 CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHJldHVybiByYW5nZVtNYXRoLm1heCgwLCBNYXRo Lm1pbihuIC0gMSwgTWF0aC5mbG9vcih0ICogbikpKV07CiAgfTsKfQoKdmFyIHZpcmlkaXMgPSBy YW1wJDEoY29sb3JzKCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0 NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4 NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0 ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMw N2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0 MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3 ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIz YjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVj OGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUz MTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZm OGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUy YTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgx OGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUy MzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDky OGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGEx ZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0 ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEy N2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2 N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0 MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1 Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2 OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQz NGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5 OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRk MmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBj YWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0 MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFm YmU3MjNmZGU3MjUiKSk7Cgp2YXIgbWFnbWEgPSByYW1wJDEoY29sb3JzKCIwMDAwMDQwMTAwMDUw MTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1 MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIx MDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEw NDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgy OTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEw NmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0 OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1 N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2 NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIx ODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4 NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJi ODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2Vh MzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1 N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZj MjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQx NmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5Njhk ZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2 NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNm MzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2 NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFm Yzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlh NmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRm ZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJk ODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBm ZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUw YTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJm Y2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYiKSk7Cgp2YXIgaW5mZXJu byA9IHJhbXAkMShjb2xvcnMoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAy MDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcy MjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2 MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0 ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2 MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2 OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1 MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2 ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0 MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2 Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODky MjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2 M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2Iw MzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1 M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNi NDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIz ZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUy NTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQy OWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYy NzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQx MGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2Zi OTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYw Y2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZi YmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2Iz NWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0 ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3 NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5 ZmM5ZGZhZmRhMWZjZmZhNCIpKTsKCnZhciBwbGFzbWEgPSByYW1wJDEoY29sb3JzKCIwZDA4ODcx MDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1 OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkz ODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAz OWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1 ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAw YTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3 NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1 YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5 MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4 OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZh YTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJl OGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODVi ZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQz N2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNk MTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4 NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNl MTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZm NWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJl ZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3 NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJm ODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmEx MzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJm ZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJk MmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZm Y2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRj MjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdm NGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7CgpmdW5j dGlvbiBjb25zdGFudCRiKHgpIHsKICByZXR1cm4gZnVuY3Rpb24gY29uc3RhbnQoKSB7CiAgICBy ZXR1cm4geDsKICB9Owp9Cgp2YXIgYWJzJDEgPSBNYXRoLmFiczsKdmFyIGF0YW4yJDEgPSBNYXRo LmF0YW4yOwp2YXIgY29zJDIgPSBNYXRoLmNvczsKdmFyIG1heCQyID0gTWF0aC5tYXg7CnZhciBt aW4kMSA9IE1hdGgubWluOwp2YXIgc2luJDIgPSBNYXRoLnNpbjsKdmFyIHNxcnQkMiA9IE1hdGgu c3FydDsKCnZhciBlcHNpbG9uJDMgPSAxZS0xMjsKdmFyIHBpJDQgPSBNYXRoLlBJOwp2YXIgaGFs ZlBpJDMgPSBwaSQ0IC8gMjsKdmFyIHRhdSQ0ID0gMiAqIHBpJDQ7CgpmdW5jdGlvbiBhY29zJDEo eCkgewogIHJldHVybiB4ID4gMSA/IDAgOiB4IDwgLTEgPyBwaSQ0IDogTWF0aC5hY29zKHgpOwp9 CgpmdW5jdGlvbiBhc2luJDEoeCkgewogIHJldHVybiB4ID49IDEgPyBoYWxmUGkkMyA6IHggPD0g LTEgPyAtaGFsZlBpJDMgOiBNYXRoLmFzaW4oeCk7Cn0KCmZ1bmN0aW9uIGFyY0lubmVyUmFkaXVz KGQpIHsKICByZXR1cm4gZC5pbm5lclJhZGl1czsKfQoKZnVuY3Rpb24gYXJjT3V0ZXJSYWRpdXMo ZCkgewogIHJldHVybiBkLm91dGVyUmFkaXVzOwp9CgpmdW5jdGlvbiBhcmNTdGFydEFuZ2xlKGQp IHsKICByZXR1cm4gZC5zdGFydEFuZ2xlOwp9CgpmdW5jdGlvbiBhcmNFbmRBbmdsZShkKSB7CiAg cmV0dXJuIGQuZW5kQW5nbGU7Cn0KCmZ1bmN0aW9uIGFyY1BhZEFuZ2xlKGQpIHsKICByZXR1cm4g ZCAmJiBkLnBhZEFuZ2xlOyAvLyBOb3RlOiBvcHRpb25hbCEKfQoKZnVuY3Rpb24gaW50ZXJzZWN0 KHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MykgewogIHZhciB4MTAgPSB4MSAtIHgwLCB5 MTAgPSB5MSAtIHkwLAogICAgICB4MzIgPSB4MyAtIHgyLCB5MzIgPSB5MyAtIHkyLAogICAgICB0 ID0geTMyICogeDEwIC0geDMyICogeTEwOwogIGlmICh0ICogdCA8IGVwc2lsb24kMykgcmV0dXJu OwogIHQgPSAoeDMyICogKHkwIC0geTIpIC0geTMyICogKHgwIC0geDIpKSAvIHQ7CiAgcmV0dXJu IFt4MCArIHQgKiB4MTAsIHkwICsgdCAqIHkxMF07Cn0KCi8vIENvbXB1dGUgcGVycGVuZGljdWxh ciBvZmZzZXQgbGluZSBvZiBsZW5ndGggcmMuCi8vIGh0dHA6Ly9tYXRod29ybGQud29sZnJhbS5j b20vQ2lyY2xlLUxpbmVJbnRlcnNlY3Rpb24uaHRtbApmdW5jdGlvbiBjb3JuZXJUYW5nZW50cyh4 MCwgeTAsIHgxLCB5MSwgcjEsIHJjLCBjdykgewogIHZhciB4MDEgPSB4MCAtIHgxLAogICAgICB5 MDEgPSB5MCAtIHkxLAogICAgICBsbyA9IChjdyA/IHJjIDogLXJjKSAvIHNxcnQkMih4MDEgKiB4 MDEgKyB5MDEgKiB5MDEpLAogICAgICBveCA9IGxvICogeTAxLAogICAgICBveSA9IC1sbyAqIHgw MSwKICAgICAgeDExID0geDAgKyBveCwKICAgICAgeTExID0geTAgKyBveSwKICAgICAgeDEwID0g eDEgKyBveCwKICAgICAgeTEwID0geTEgKyBveSwKICAgICAgeDAwID0gKHgxMSArIHgxMCkgLyAy LAogICAgICB5MDAgPSAoeTExICsgeTEwKSAvIDIsCiAgICAgIGR4ID0geDEwIC0geDExLAogICAg ICBkeSA9IHkxMCAtIHkxMSwKICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSwKICAgICAgciA9 IHIxIC0gcmMsCiAgICAgIEQgPSB4MTEgKiB5MTAgLSB4MTAgKiB5MTEsCiAgICAgIGQgPSAoZHkg PCAwID8gLTEgOiAxKSAqIHNxcnQkMihtYXgkMigwLCByICogciAqIGQyIC0gRCAqIEQpKSwKICAg ICAgY3gwID0gKEQgKiBkeSAtIGR4ICogZCkgLyBkMiwKICAgICAgY3kwID0gKC1EICogZHggLSBk eSAqIGQpIC8gZDIsCiAgICAgIGN4MSA9IChEICogZHkgKyBkeCAqIGQpIC8gZDIsCiAgICAgIGN5 MSA9ICgtRCAqIGR4ICsgZHkgKiBkKSAvIGQyLAogICAgICBkeDAgPSBjeDAgLSB4MDAsCiAgICAg IGR5MCA9IGN5MCAtIHkwMCwKICAgICAgZHgxID0gY3gxIC0geDAwLAogICAgICBkeTEgPSBjeTEg LSB5MDA7CgogIC8vIFBpY2sgdGhlIGNsb3NlciBvZiB0aGUgdHdvIGludGVyc2VjdGlvbiBwb2lu dHMuCiAgLy8gVE9ETyBJcyB0aGVyZSBhIGZhc3RlciB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIGlu dGVyc2VjdGlvbiB0byB1c2U/CiAgaWYgKGR4MCAqIGR4MCArIGR5MCAqIGR5MCA+IGR4MSAqIGR4 MSArIGR5MSAqIGR5MSkgY3gwID0gY3gxLCBjeTAgPSBjeTE7CgogIHJldHVybiB7CiAgICBjeDog Y3gwLAogICAgY3k6IGN5MCwKICAgIHgwMTogLW94LAogICAgeTAxOiAtb3ksCiAgICB4MTE6IGN4 MCAqIChyMSAvIHIgLSAxKSwKICAgIHkxMTogY3kwICogKHIxIC8gciAtIDEpCiAgfTsKfQoKZnVu Y3Rpb24gYXJjKCkgewogIHZhciBpbm5lclJhZGl1cyA9IGFyY0lubmVyUmFkaXVzLAogICAgICBv dXRlclJhZGl1cyA9IGFyY091dGVyUmFkaXVzLAogICAgICBjb3JuZXJSYWRpdXMgPSBjb25zdGFu dCRiKDApLAogICAgICBwYWRSYWRpdXMgPSBudWxsLAogICAgICBzdGFydEFuZ2xlID0gYXJjU3Rh cnRBbmdsZSwKICAgICAgZW5kQW5nbGUgPSBhcmNFbmRBbmdsZSwKICAgICAgcGFkQW5nbGUgPSBh cmNQYWRBbmdsZSwKICAgICAgY29udGV4dCA9IG51bGw7CgogIGZ1bmN0aW9uIGFyYygpIHsKICAg IHZhciBidWZmZXIsCiAgICAgICAgciwKICAgICAgICByMCA9ICtpbm5lclJhZGl1cy5hcHBseSh0 aGlzLCBhcmd1bWVudHMpLAogICAgICAgIHIxID0gK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFy Z3VtZW50cyksCiAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykg LSBoYWxmUGkkMywKICAgICAgICBhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykg LSBoYWxmUGkkMywKICAgICAgICBkYSA9IGFicyQxKGExIC0gYTApLAogICAgICAgIGN3ID0gYTEg PiBhMDsKCiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoKCk7CgogICAg Ly8gRW5zdXJlIHRoYXQgdGhlIG91dGVyIHJhZGl1cyBpcyBhbHdheXMgbGFyZ2VyIHRoYW4gdGhl IGlubmVyIHJhZGl1cy4KICAgIGlmIChyMSA8IHIwKSByID0gcjEsIHIxID0gcjAsIHIwID0gcjsK CiAgICAvLyBJcyBpdCBhIHBvaW50PwogICAgaWYgKCEocjEgPiBlcHNpbG9uJDMpKSBjb250ZXh0 Lm1vdmVUbygwLCAwKTsKCiAgICAvLyBPciBpcyBpdCBhIGNpcmNsZSBvciBhbm51bHVzPwogICAg ZWxzZSBpZiAoZGEgPiB0YXUkNCAtIGVwc2lsb24kMykgewogICAgICBjb250ZXh0Lm1vdmVUbyhy MSAqIGNvcyQyKGEwKSwgcjEgKiBzaW4kMihhMCkpOwogICAgICBjb250ZXh0LmFyYygwLCAwLCBy MSwgYTAsIGExLCAhY3cpOwogICAgICBpZiAocjAgPiBlcHNpbG9uJDMpIHsKICAgICAgICBjb250 ZXh0Lm1vdmVUbyhyMCAqIGNvcyQyKGExKSwgcjAgKiBzaW4kMihhMSkpOwogICAgICAgIGNvbnRl eHQuYXJjKDAsIDAsIHIwLCBhMSwgYTAsIGN3KTsKICAgICAgfQogICAgfQoKICAgIC8vIE9yIGlz IGl0IGEgY2lyY3VsYXIgb3IgYW5udWxhciBzZWN0b3I/CiAgICBlbHNlIHsKICAgICAgdmFyIGEw MSA9IGEwLAogICAgICAgICAgYTExID0gYTEsCiAgICAgICAgICBhMDAgPSBhMCwKICAgICAgICAg IGExMCA9IGExLAogICAgICAgICAgZGEwID0gZGEsCiAgICAgICAgICBkYTEgPSBkYSwKICAgICAg ICAgIGFwID0gcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAvIDIsCiAgICAgICAgICBy cCA9IChhcCA+IGVwc2lsb24kMykgJiYgKHBhZFJhZGl1cyA/ICtwYWRSYWRpdXMuYXBwbHkodGhp cywgYXJndW1lbnRzKSA6IHNxcnQkMihyMCAqIHIwICsgcjEgKiByMSkpLAogICAgICAgICAgcmMg PSBtaW4kMShhYnMkMShyMSAtIHIwKSAvIDIsICtjb3JuZXJSYWRpdXMuYXBwbHkodGhpcywgYXJn dW1lbnRzKSksCiAgICAgICAgICByYzAgPSByYywKICAgICAgICAgIHJjMSA9IHJjLAogICAgICAg ICAgdDAsCiAgICAgICAgICB0MTsKCiAgICAgIC8vIEFwcGx5IHBhZGRpbmc/IE5vdGUgdGhhdCBz aW5jZSByMSDiiaUgcjAsIGRhMSDiiaUgZGEwLgogICAgICBpZiAocnAgPiBlcHNpbG9uJDMpIHsK ICAgICAgICB2YXIgcDAgPSBhc2luJDEocnAgLyByMCAqIHNpbiQyKGFwKSksCiAgICAgICAgICAg IHAxID0gYXNpbiQxKHJwIC8gcjEgKiBzaW4kMihhcCkpOwogICAgICAgIGlmICgoZGEwIC09IHAw ICogMikgPiBlcHNpbG9uJDMpIHAwICo9IChjdyA/IDEgOiAtMSksIGEwMCArPSBwMCwgYTEwIC09 IHAwOwogICAgICAgIGVsc2UgZGEwID0gMCwgYTAwID0gYTEwID0gKGEwICsgYTEpIC8gMjsKICAg ICAgICBpZiAoKGRhMSAtPSBwMSAqIDIpID4gZXBzaWxvbiQzKSBwMSAqPSAoY3cgPyAxIDogLTEp LCBhMDEgKz0gcDEsIGExMSAtPSBwMTsKICAgICAgICBlbHNlIGRhMSA9IDAsIGEwMSA9IGExMSA9 IChhMCArIGExKSAvIDI7CiAgICAgIH0KCiAgICAgIHZhciB4MDEgPSByMSAqIGNvcyQyKGEwMSks CiAgICAgICAgICB5MDEgPSByMSAqIHNpbiQyKGEwMSksCiAgICAgICAgICB4MTAgPSByMCAqIGNv cyQyKGExMCksCiAgICAgICAgICB5MTAgPSByMCAqIHNpbiQyKGExMCk7CgogICAgICAvLyBBcHBs eSByb3VuZGVkIGNvcm5lcnM/CiAgICAgIGlmIChyYyA+IGVwc2lsb24kMykgewogICAgICAgIHZh ciB4MTEgPSByMSAqIGNvcyQyKGExMSksCiAgICAgICAgICAgIHkxMSA9IHIxICogc2luJDIoYTEx KSwKICAgICAgICAgICAgeDAwID0gcjAgKiBjb3MkMihhMDApLAogICAgICAgICAgICB5MDAgPSBy MCAqIHNpbiQyKGEwMCksCiAgICAgICAgICAgIG9jOwoKICAgICAgICAvLyBSZXN0cmljdCB0aGUg Y29ybmVyIHJhZGl1cyBhY2NvcmRpbmcgdG8gdGhlIHNlY3RvciBhbmdsZS4KICAgICAgICBpZiAo ZGEgPCBwaSQ0ICYmIChvYyA9IGludGVyc2VjdCh4MDEsIHkwMSwgeDAwLCB5MDAsIHgxMSwgeTEx LCB4MTAsIHkxMCkpKSB7CiAgICAgICAgICB2YXIgYXggPSB4MDEgLSBvY1swXSwKICAgICAgICAg ICAgICBheSA9IHkwMSAtIG9jWzFdLAogICAgICAgICAgICAgIGJ4ID0geDExIC0gb2NbMF0sCiAg ICAgICAgICAgICAgYnkgPSB5MTEgLSBvY1sxXSwKICAgICAgICAgICAgICBrYyA9IDEgLyBzaW4k MihhY29zJDEoKGF4ICogYnggKyBheSAqIGJ5KSAvIChzcXJ0JDIoYXggKiBheCArIGF5ICogYXkp ICogc3FydCQyKGJ4ICogYnggKyBieSAqIGJ5KSkpIC8gMiksCiAgICAgICAgICAgICAgbGMgPSBz cXJ0JDIob2NbMF0gKiBvY1swXSArIG9jWzFdICogb2NbMV0pOwogICAgICAgICAgcmMwID0gbWlu JDEocmMsIChyMCAtIGxjKSAvIChrYyAtIDEpKTsKICAgICAgICAgIHJjMSA9IG1pbiQxKHJjLCAo cjEgLSBsYykgLyAoa2MgKyAxKSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBJcyB0aGUg c2VjdG9yIGNvbGxhcHNlZCB0byBhIGxpbmU/CiAgICAgIGlmICghKGRhMSA+IGVwc2lsb24kMykp IGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKTsKCiAgICAgIC8vIERvZXMgdGhlIHNlY3RvcuKAmXMg b3V0ZXIgcmluZyBoYXZlIHJvdW5kZWQgY29ybmVycz8KICAgICAgZWxzZSBpZiAocmMxID4gZXBz aWxvbiQzKSB7CiAgICAgICAgdDAgPSBjb3JuZXJUYW5nZW50cyh4MDAsIHkwMCwgeDAxLCB5MDEs IHIxLCByYzEsIGN3KTsKICAgICAgICB0MSA9IGNvcm5lclRhbmdlbnRzKHgxMSwgeTExLCB4MTAs IHkxMCwgcjEsIHJjMSwgY3cpOwoKICAgICAgICBjb250ZXh0Lm1vdmVUbyh0MC5jeCArIHQwLngw MSwgdDAuY3kgKyB0MC55MDEpOwoKICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD8K ICAgICAgICBpZiAocmMxIDwgcmMpIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMxLCBhdGFu MiQxKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIkMSh0MS55MDEsIHQxLngwMSksICFjdyk7CgogICAg ICAgIC8vIE90aGVyd2lzZSwgZHJhdyB0aGUgdHdvIGNvcm5lcnMgYW5kIHRoZSByaW5nLgogICAg ICAgIGVsc2UgewogICAgICAgICAgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzEsIGF0YW4y JDEodDAueTAxLCB0MC54MDEpLCBhdGFuMiQxKHQwLnkxMSwgdDAueDExKSwgIWN3KTsKICAgICAg ICAgIGNvbnRleHQuYXJjKDAsIDAsIHIxLCBhdGFuMiQxKHQwLmN5ICsgdDAueTExLCB0MC5jeCAr IHQwLngxMSksIGF0YW4yJDEodDEuY3kgKyB0MS55MTEsIHQxLmN4ICsgdDEueDExKSwgIWN3KTsK ICAgICAgICAgIGNvbnRleHQuYXJjKHQxLmN4LCB0MS5jeSwgcmMxLCBhdGFuMiQxKHQxLnkxMSwg dDEueDExKSwgYXRhbjIkMSh0MS55MDEsIHQxLngwMSksICFjdyk7CiAgICAgICAgfQogICAgICB9 CgogICAgICAvLyBPciBpcyB0aGUgb3V0ZXIgcmluZyBqdXN0IGEgY2lyY3VsYXIgYXJjPwogICAg ICBlbHNlIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKSwgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEw MSwgYTExLCAhY3cpOwoKICAgICAgLy8gSXMgdGhlcmUgbm8gaW5uZXIgcmluZywgYW5kIGl04oCZ cyBhIGNpcmN1bGFyIHNlY3Rvcj8KICAgICAgLy8gT3IgcGVyaGFwcyBpdOKAmXMgYW4gYW5udWxh ciBzZWN0b3IgY29sbGFwc2VkIGR1ZSB0byBwYWRkaW5nPwogICAgICBpZiAoIShyMCA+IGVwc2ls b24kMykgfHwgIShkYTAgPiBlcHNpbG9uJDMpKSBjb250ZXh0LmxpbmVUbyh4MTAsIHkxMCk7Cgog ICAgICAvLyBEb2VzIHRoZSBzZWN0b3LigJlzIGlubmVyIHJpbmcgKG9yIHBvaW50KSBoYXZlIHJv dW5kZWQgY29ybmVycz8KICAgICAgZWxzZSBpZiAocmMwID4gZXBzaWxvbiQzKSB7CiAgICAgICAg dDAgPSBjb3JuZXJUYW5nZW50cyh4MTAsIHkxMCwgeDExLCB5MTEsIHIwLCAtcmMwLCBjdyk7CiAg ICAgICAgdDEgPSBjb3JuZXJUYW5nZW50cyh4MDEsIHkwMSwgeDAwLCB5MDAsIHIwLCAtcmMwLCBj dyk7CgogICAgICAgIGNvbnRleHQubGluZVRvKHQwLmN4ICsgdDAueDAxLCB0MC5jeSArIHQwLnkw MSk7CgogICAgICAgIC8vIEhhdmUgdGhlIGNvcm5lcnMgbWVyZ2VkPwogICAgICAgIGlmIChyYzAg PCByYykgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzAsIGF0YW4yJDEodDAueTAxLCB0MC54 MDEpLCBhdGFuMiQxKHQxLnkwMSwgdDEueDAxKSwgIWN3KTsKCiAgICAgICAgLy8gT3RoZXJ3aXNl LCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuCiAgICAgICAgZWxzZSB7CiAgICAg ICAgICBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMCwgYXRhbjIkMSh0MC55MDEsIHQwLngw MSksIGF0YW4yJDEodDAueTExLCB0MC54MTEpLCAhY3cpOwogICAgICAgICAgY29udGV4dC5hcmMo MCwgMCwgcjAsIGF0YW4yJDEodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIk MSh0MS5jeSArIHQxLnkxMSwgdDEuY3ggKyB0MS54MTEpLCBjdyk7CiAgICAgICAgICBjb250ZXh0 LmFyYyh0MS5jeCwgdDEuY3ksIHJjMCwgYXRhbjIkMSh0MS55MTEsIHQxLngxMSksIGF0YW4yJDEo dDEueTAxLCB0MS54MDEpLCAhY3cpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gT3IgaXMg dGhlIGlubmVyIHJpbmcganVzdCBhIGNpcmN1bGFyIGFyYz8KICAgICAgZWxzZSBjb250ZXh0LmFy YygwLCAwLCByMCwgYTEwLCBhMDAsIGN3KTsKICAgIH0KCiAgICBjb250ZXh0LmNsb3NlUGF0aCgp OwoKICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwg bnVsbDsKICB9CgogIGFyYy5jZW50cm9pZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHIgPSAoK2lu bmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyArb3V0ZXJSYWRpdXMuYXBwbHkodGhp cywgYXJndW1lbnRzKSkgLyAyLAogICAgICAgIGEgPSAoK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywg YXJndW1lbnRzKSArICtlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgLSBwaSQ0 IC8gMjsKICAgIHJldHVybiBbY29zJDIoYSkgKiByLCBzaW4kMihhKSAqIHJdOwogIH07CgogIGFy Yy5pbm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3Ro ID8gKGlubmVyUmFkaXVzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQk YigrXyksIGFyYykgOiBpbm5lclJhZGl1czsKICB9OwoKICBhcmMub3V0ZXJSYWRpdXMgPSBmdW5j dGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdXRlclJhZGl1cyA9IHR5 cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmMpIDogb3V0ZXJS YWRpdXM7CiAgfTsKCiAgYXJjLmNvcm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biBhcmd1bWVudHMubGVuZ3RoID8gKGNvcm5lclJhZGl1cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rp b24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmMpIDogY29ybmVyUmFkaXVzOwogIH07CgogIGFy Yy5wYWRSYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ IChwYWRSYWRpdXMgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIg PyBfIDogY29uc3RhbnQkYigrXyksIGFyYykgOiBwYWRSYWRpdXM7CiAgfTsKCiAgYXJjLnN0YXJ0 QW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFy dEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGFy YykgOiBzdGFydEFuZ2xlOwogIH07CgogIGFyYy5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5j dGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGFyYykgOiBlbmRBbmdsZTsKICB9OwoKICBhcmMu cGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChw YWRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBh cmMpIDogcGFkQW5nbGU7CiAgfTsKCiAgYXJjLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICBy ZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBf KSwgYXJjKSA6IGNvbnRleHQ7CiAgfTsKCiAgcmV0dXJuIGFyYzsKfQoKZnVuY3Rpb24gTGluZWFy KGNvbnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKfQoKTGluZWFyLnByb3RvdHlw ZSA9IHsKICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IDA7CiAgfSwK ICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgfSwKICBsaW5l U3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGluZUVuZDog ZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0 aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICB0aGlzLl9s aW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAg eCA9ICt4LCB5ID0gK3k7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMDog dGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkg OiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5f cG9pbnQgPSAyOyAvLyBwcm9jZWVkCiAgICAgIGRlZmF1bHQ6IHRoaXMuX2NvbnRleHQubGluZVRv KHgsIHkpOyBicmVhazsKICAgIH0KICB9Cn07CgpmdW5jdGlvbiBjdXJ2ZUxpbmVhcihjb250ZXh0 KSB7CiAgcmV0dXJuIG5ldyBMaW5lYXIoY29udGV4dCk7Cn0KCmZ1bmN0aW9uIHgkMyhwKSB7CiAg cmV0dXJuIHBbMF07Cn0KCmZ1bmN0aW9uIHkkMyhwKSB7CiAgcmV0dXJuIHBbMV07Cn0KCmZ1bmN0 aW9uIGxpbmUoKSB7CiAgdmFyIHggPSB4JDMsCiAgICAgIHkgPSB5JDMsCiAgICAgIGRlZmluZWQg PSBjb25zdGFudCRiKHRydWUpLAogICAgICBjb250ZXh0ID0gbnVsbCwKICAgICAgY3VydmUgPSBj dXJ2ZUxpbmVhciwKICAgICAgb3V0cHV0ID0gbnVsbDsKCiAgZnVuY3Rpb24gbGluZShkYXRhKSB7 CiAgICB2YXIgaSwKICAgICAgICBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgZCwKICAgICAgICBk ZWZpbmVkMCA9IGZhbHNlLAogICAgICAgIGJ1ZmZlcjsKCiAgICBpZiAoY29udGV4dCA9PSBudWxs KSBvdXRwdXQgPSBjdXJ2ZShidWZmZXIgPSBwYXRoKCkpOwoKICAgIGZvciAoaSA9IDA7IGkgPD0g bjsgKytpKSB7CiAgICAgIGlmICghKGkgPCBuICYmIGRlZmluZWQoZCA9IGRhdGFbaV0sIGksIGRh dGEpKSA9PT0gZGVmaW5lZDApIHsKICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIG91 dHB1dC5saW5lU3RhcnQoKTsKICAgICAgICBlbHNlIG91dHB1dC5saW5lRW5kKCk7CiAgICAgIH0K ICAgICAgaWYgKGRlZmluZWQwKSBvdXRwdXQucG9pbnQoK3goZCwgaSwgZGF0YSksICt5KGQsIGks IGRhdGEpKTsKICAgIH0KCiAgICBpZiAoYnVmZmVyKSByZXR1cm4gb3V0cHV0ID0gbnVsbCwgYnVm ZmVyICsgIiIgfHwgbnVsbDsKICB9CgogIGxpbmUueCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biBhcmd1bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBj b25zdGFudCRiKCtfKSwgbGluZSkgOiB4OwogIH07CgogIGxpbmUueSA9IGZ1bmN0aW9uKF8pIHsK ICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9u IiA/IF8gOiBjb25zdGFudCRiKCtfKSwgbGluZSkgOiB5OwogIH07CgogIGxpbmUuZGVmaW5lZCA9 IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRlZmluZWQgPSB0 eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCEhXyksIGxpbmUpIDogZGVm aW5lZDsKICB9OwoKICBsaW5lLmN1cnZlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyAoY3VydmUgPSBfLCBjb250ZXh0ICE9IG51bGwgJiYgKG91dHB1dCA9IGN1 cnZlKGNvbnRleHQpKSwgbGluZSkgOiBjdXJ2ZTsKICB9OwoKICBsaW5lLmNvbnRleHQgPSBmdW5j dGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfID09IG51bGwgPyBjb250 ZXh0ID0gb3V0cHV0ID0gbnVsbCA6IG91dHB1dCA9IGN1cnZlKGNvbnRleHQgPSBfKSwgbGluZSkg OiBjb250ZXh0OwogIH07CgogIHJldHVybiBsaW5lOwp9CgpmdW5jdGlvbiBhcmVhJDMoKSB7CiAg dmFyIHgwID0geCQzLAogICAgICB4MSA9IG51bGwsCiAgICAgIHkwID0gY29uc3RhbnQkYigwKSwK ICAgICAgeTEgPSB5JDMsCiAgICAgIGRlZmluZWQgPSBjb25zdGFudCRiKHRydWUpLAogICAgICBj b250ZXh0ID0gbnVsbCwKICAgICAgY3VydmUgPSBjdXJ2ZUxpbmVhciwKICAgICAgb3V0cHV0ID0g bnVsbDsKCiAgZnVuY3Rpb24gYXJlYShkYXRhKSB7CiAgICB2YXIgaSwKICAgICAgICBqLAogICAg ICAgIGssCiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLAogICAgICAgIGQsCiAgICAgICAgZGVmaW5l ZDAgPSBmYWxzZSwKICAgICAgICBidWZmZXIsCiAgICAgICAgeDB6ID0gbmV3IEFycmF5KG4pLAog ICAgICAgIHkweiA9IG5ldyBBcnJheShuKTsKCiAgICBpZiAoY29udGV4dCA9PSBudWxsKSBvdXRw dXQgPSBjdXJ2ZShidWZmZXIgPSBwYXRoKCkpOwoKICAgIGZvciAoaSA9IDA7IGkgPD0gbjsgKytp KSB7CiAgICAgIGlmICghKGkgPCBuICYmIGRlZmluZWQoZCA9IGRhdGFbaV0sIGksIGRhdGEpKSA9 PT0gZGVmaW5lZDApIHsKICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIHsKICAgICAg ICAgIGogPSBpOwogICAgICAgICAgb3V0cHV0LmFyZWFTdGFydCgpOwogICAgICAgICAgb3V0cHV0 LmxpbmVTdGFydCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvdXRwdXQubGluZUVuZCgp OwogICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpOwogICAgICAgICAgZm9yIChrID0gaSAtIDE7 IGsgPj0gajsgLS1rKSB7CiAgICAgICAgICAgIG91dHB1dC5wb2ludCh4MHpba10sIHkweltrXSk7 CiAgICAgICAgICB9CiAgICAgICAgICBvdXRwdXQubGluZUVuZCgpOwogICAgICAgICAgb3V0cHV0 LmFyZWFFbmQoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRlZmluZWQwKSB7CiAgICAg ICAgeDB6W2ldID0gK3gwKGQsIGksIGRhdGEpLCB5MHpbaV0gPSAreTAoZCwgaSwgZGF0YSk7CiAg ICAgICAgb3V0cHV0LnBvaW50KHgxID8gK3gxKGQsIGksIGRhdGEpIDogeDB6W2ldLCB5MSA/ICt5 MShkLCBpLCBkYXRhKSA6IHkweltpXSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoYnVmZmVyKSBy ZXR1cm4gb3V0cHV0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsKICB9CgogIGZ1bmN0aW9u IGFyZWFsaW5lKCkgewogICAgcmV0dXJuIGxpbmUoKS5kZWZpbmVkKGRlZmluZWQpLmN1cnZlKGN1 cnZlKS5jb250ZXh0KGNvbnRleHQpOwogIH0KCiAgYXJlYS54ID0gZnVuY3Rpb24oXykgewogICAg cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/ IF8gOiBjb25zdGFudCRiKCtfKSwgeDEgPSBudWxsLCBhcmVhKSA6IHgwOwogIH07CgogIGFyZWEu eDAgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9IHR5 cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmVhKSA6IHgwOwog IH07CgogIGFyZWEueDEgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/ICh4MSA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8g OiBjb25zdGFudCRiKCtfKSwgYXJlYSkgOiB4MTsKICB9OwoKICBhcmVhLnkgPSBmdW5jdGlvbihf KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MCA9IHR5cGVvZiBfID09PSAiZnVu Y3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCB5MSA9IG51bGwsIGFyZWEpIDogeTA7CiAgfTsK CiAgYXJlYS55MCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8g KHkwID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGFyZWEp IDogeTA7CiAgfTsKCiAgYXJlYS55MSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID8gKHkxID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSAiZnVuY3Rp b24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmVhKSA6IHkxOwogIH07CgogIGFyZWEubGluZVgw ID0KICBhcmVhLmxpbmVZMCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGFyZWFsaW5lKCkueCh4 MCkueSh5MCk7CiAgfTsKCiAgYXJlYS5saW5lWTEgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBh cmVhbGluZSgpLngoeDApLnkoeTEpOwogIH07CgogIGFyZWEubGluZVgxID0gZnVuY3Rpb24oKSB7 CiAgICByZXR1cm4gYXJlYWxpbmUoKS54KHgxKS55KHkwKTsKICB9OwoKICBhcmVhLmRlZmluZWQg PSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0g dHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYighIV8pLCBhcmVhKSA6IGRl ZmluZWQ7CiAgfTsKCiAgYXJlYS5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1 bWVudHMubGVuZ3RoID8gKGN1cnZlID0gXywgY29udGV4dCAhPSBudWxsICYmIChvdXRwdXQgPSBj dXJ2ZShjb250ZXh0KSksIGFyZWEpIDogY3VydmU7CiAgfTsKCiAgYXJlYS5jb250ZXh0ID0gZnVu Y3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29u dGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGFyZWEp IDogY29udGV4dDsKICB9OwoKICByZXR1cm4gYXJlYTsKfQoKZnVuY3Rpb24gZGVzY2VuZGluZyQx KGEsIGIpIHsKICByZXR1cm4gYiA8IGEgPyAtMSA6IGIgPiBhID8gMSA6IGIgPj0gYSA/IDAgOiBO YU47Cn0KCmZ1bmN0aW9uIGlkZW50aXR5JDgoZCkgewogIHJldHVybiBkOwp9CgpmdW5jdGlvbiBw aWUoKSB7CiAgdmFyIHZhbHVlID0gaWRlbnRpdHkkOCwKICAgICAgc29ydFZhbHVlcyA9IGRlc2Nl bmRpbmckMSwKICAgICAgc29ydCA9IG51bGwsCiAgICAgIHN0YXJ0QW5nbGUgPSBjb25zdGFudCRi KDApLAogICAgICBlbmRBbmdsZSA9IGNvbnN0YW50JGIodGF1JDQpLAogICAgICBwYWRBbmdsZSA9 IGNvbnN0YW50JGIoMCk7CgogIGZ1bmN0aW9uIHBpZShkYXRhKSB7CiAgICB2YXIgaSwKICAgICAg ICBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgaiwKICAgICAgICBrLAogICAgICAgIHN1bSA9IDAs CiAgICAgICAgaW5kZXggPSBuZXcgQXJyYXkobiksCiAgICAgICAgYXJjcyA9IG5ldyBBcnJheShu KSwKICAgICAgICBhMCA9ICtzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAg ICAgZGEgPSBNYXRoLm1pbih0YXUkNCwgTWF0aC5tYXgoLXRhdSQ0LCBlbmRBbmdsZS5hcHBseSh0 aGlzLCBhcmd1bWVudHMpIC0gYTApKSwKICAgICAgICBhMSwKICAgICAgICBwID0gTWF0aC5taW4o TWF0aC5hYnMoZGEpIC8gbiwgcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSksCiAgICAg ICAgcGEgPSBwICogKGRhIDwgMCA/IC0xIDogMSksCiAgICAgICAgdjsKCiAgICBmb3IgKGkgPSAw OyBpIDwgbjsgKytpKSB7CiAgICAgIGlmICgodiA9IGFyY3NbaW5kZXhbaV0gPSBpXSA9ICt2YWx1 ZShkYXRhW2ldLCBpLCBkYXRhKSkgPiAwKSB7CiAgICAgICAgc3VtICs9IHY7CiAgICAgIH0KICAg IH0KCiAgICAvLyBPcHRpb25hbGx5IHNvcnQgdGhlIGFyY3MgYnkgcHJldmlvdXNseS1jb21wdXRl ZCB2YWx1ZXMgb3IgYnkgZGF0YS4KICAgIGlmIChzb3J0VmFsdWVzICE9IG51bGwpIGluZGV4LnNv cnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gc29ydFZhbHVlcyhhcmNzW2ldLCBhcmNzW2pdKTsg fSk7CiAgICBlbHNlIGlmIChzb3J0ICE9IG51bGwpIGluZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikg eyByZXR1cm4gc29ydChkYXRhW2ldLCBkYXRhW2pdKTsgfSk7CgogICAgLy8gQ29tcHV0ZSB0aGUg YXJjcyEgVGhleSBhcmUgc3RvcmVkIGluIHRoZSBvcmlnaW5hbCBkYXRhJ3Mgb3JkZXIuCiAgICBm b3IgKGkgPSAwLCBrID0gc3VtID8gKGRhIC0gbiAqIHBhKSAvIHN1bSA6IDA7IGkgPCBuOyArK2ks IGEwID0gYTEpIHsKICAgICAgaiA9IGluZGV4W2ldLCB2ID0gYXJjc1tqXSwgYTEgPSBhMCArICh2 ID4gMCA/IHYgKiBrIDogMCkgKyBwYSwgYXJjc1tqXSA9IHsKICAgICAgICBkYXRhOiBkYXRhW2pd LAogICAgICAgIGluZGV4OiBpLAogICAgICAgIHZhbHVlOiB2LAogICAgICAgIHN0YXJ0QW5nbGU6 IGEwLAogICAgICAgIGVuZEFuZ2xlOiBhMSwKICAgICAgICBwYWRBbmdsZTogcAogICAgICB9Owog ICAgfQoKICAgIHJldHVybiBhcmNzOwogIH0KCiAgcGllLnZhbHVlID0gZnVuY3Rpb24oXykgewog ICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0 aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgcGllKSA6IHZhbHVlOwogIH07CgogIHBpZS5zb3J0 VmFsdWVzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29y dFZhbHVlcyA9IF8sIHNvcnQgPSBudWxsLCBwaWUpIDogc29ydFZhbHVlczsKICB9OwoKICBwaWUu c29ydCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnQg PSBfLCBzb3J0VmFsdWVzID0gbnVsbCwgcGllKSA6IHNvcnQ7CiAgfTsKCiAgcGllLnN0YXJ0QW5n bGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFydEFu Z2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIHBpZSkg OiBzdGFydEFuZ2xlOwogIH07CgogIHBpZS5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlv biIgPyBfIDogY29uc3RhbnQkYigrXyksIHBpZSkgOiBlbmRBbmdsZTsKICB9OwoKICBwaWUucGFk QW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRB bmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBwaWUp IDogcGFkQW5nbGU7CiAgfTsKCiAgcmV0dXJuIHBpZTsKfQoKdmFyIGN1cnZlUmFkaWFsTGluZWFy ID0gY3VydmVSYWRpYWwoY3VydmVMaW5lYXIpOwoKZnVuY3Rpb24gUmFkaWFsKGN1cnZlKSB7CiAg dGhpcy5fY3VydmUgPSBjdXJ2ZTsKfQoKUmFkaWFsLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6 IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fY3VydmUuYXJlYVN0YXJ0KCk7CiAgfSwKICBhcmVhRW5k OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2N1cnZlLmFyZWFFbmQoKTsKICB9LAogIGxpbmVTdGFy dDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKTsKICB9LAogIGxpbmVF bmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fY3VydmUubGluZUVuZCgpOwogIH0sCiAgcG9pbnQ6 IGZ1bmN0aW9uKGEsIHIpIHsKICAgIHRoaXMuX2N1cnZlLnBvaW50KHIgKiBNYXRoLnNpbihhKSwg ciAqIC1NYXRoLmNvcyhhKSk7CiAgfQp9OwoKZnVuY3Rpb24gY3VydmVSYWRpYWwoY3VydmUpIHsK CiAgZnVuY3Rpb24gcmFkaWFsKGNvbnRleHQpIHsKICAgIHJldHVybiBuZXcgUmFkaWFsKGN1cnZl KGNvbnRleHQpKTsKICB9CgogIHJhZGlhbC5fY3VydmUgPSBjdXJ2ZTsKCiAgcmV0dXJuIHJhZGlh bDsKfQoKZnVuY3Rpb24gbGluZVJhZGlhbChsKSB7CiAgdmFyIGMgPSBsLmN1cnZlOwoKICBsLmFu Z2xlID0gbC54LCBkZWxldGUgbC54OwogIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55OwoKICBs LmN1cnZlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1 cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7CiAgfTsKCiAgcmV0dXJuIGw7Cn0KCmZ1bmN0aW9u IGxpbmVSYWRpYWwkMSgpIHsKICByZXR1cm4gbGluZVJhZGlhbChsaW5lKCkuY3VydmUoY3VydmVS YWRpYWxMaW5lYXIpKTsKfQoKZnVuY3Rpb24gYXJlYVJhZGlhbCgpIHsKICB2YXIgYSA9IGFyZWEk MygpLmN1cnZlKGN1cnZlUmFkaWFsTGluZWFyKSwKICAgICAgYyA9IGEuY3VydmUsCiAgICAgIHgw ID0gYS5saW5lWDAsCiAgICAgIHgxID0gYS5saW5lWDEsCiAgICAgIHkwID0gYS5saW5lWTAsCiAg ICAgIHkxID0gYS5saW5lWTE7CgogIGEuYW5nbGUgPSBhLngsIGRlbGV0ZSBhLng7CiAgYS5zdGFy dEFuZ2xlID0gYS54MCwgZGVsZXRlIGEueDA7CiAgYS5lbmRBbmdsZSA9IGEueDEsIGRlbGV0ZSBh LngxOwogIGEucmFkaXVzID0gYS55LCBkZWxldGUgYS55OwogIGEuaW5uZXJSYWRpdXMgPSBhLnkw LCBkZWxldGUgYS55MDsKICBhLm91dGVyUmFkaXVzID0gYS55MSwgZGVsZXRlIGEueTE7CiAgYS5s aW5lU3RhcnRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh4MCgpKTsgfSwg ZGVsZXRlIGEubGluZVgwOwogIGEubGluZUVuZEFuZ2xlID0gZnVuY3Rpb24oKSB7IHJldHVybiBs aW5lUmFkaWFsKHgxKCkpOyB9LCBkZWxldGUgYS5saW5lWDE7CiAgYS5saW5lSW5uZXJSYWRpdXMg PSBmdW5jdGlvbigpIHsgcmV0dXJuIGxpbmVSYWRpYWwoeTAoKSk7IH0sIGRlbGV0ZSBhLmxpbmVZ MDsKICBhLmxpbmVPdXRlclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh5 MSgpKTsgfSwgZGVsZXRlIGEubGluZVkxOwoKICBhLmN1cnZlID0gZnVuY3Rpb24oXykgewogICAg cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7 CiAgfTsKCiAgcmV0dXJuIGE7Cn0KCmZ1bmN0aW9uIHBvaW50UmFkaWFsKHgsIHkpIHsKICByZXR1 cm4gWyh5ID0gK3kpICogTWF0aC5jb3MoeCAtPSBNYXRoLlBJIC8gMiksIHkgKiBNYXRoLnNpbih4 KV07Cn0KCnZhciBzbGljZSQ2ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwoKZnVuY3Rpb24gbGlu a1NvdXJjZShkKSB7CiAgcmV0dXJuIGQuc291cmNlOwp9CgpmdW5jdGlvbiBsaW5rVGFyZ2V0KGQp IHsKICByZXR1cm4gZC50YXJnZXQ7Cn0KCmZ1bmN0aW9uIGxpbmskMihjdXJ2ZSkgewogIHZhciBz b3VyY2UgPSBsaW5rU291cmNlLAogICAgICB0YXJnZXQgPSBsaW5rVGFyZ2V0LAogICAgICB4ID0g eCQzLAogICAgICB5ID0geSQzLAogICAgICBjb250ZXh0ID0gbnVsbDsKCiAgZnVuY3Rpb24gbGlu aygpIHsKICAgIHZhciBidWZmZXIsIGFyZ3YgPSBzbGljZSQ2LmNhbGwoYXJndW1lbnRzKSwgcyA9 IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd2KSwgdCA9IHRhcmdldC5hcHBseSh0aGlzLCBhcmd2KTsK ICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IHBhdGgoKTsKICAgIGN1cnZlKGNv bnRleHQsICt4LmFwcGx5KHRoaXMsIChhcmd2WzBdID0gcywgYXJndikpLCAreS5hcHBseSh0aGlz LCBhcmd2KSwgK3guYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSB0LCBhcmd2KSksICt5LmFwcGx5KHRo aXMsIGFyZ3YpKTsKICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVy ICsgIiIgfHwgbnVsbDsKICB9CgogIGxpbmsuc291cmNlID0gZnVuY3Rpb24oXykgewogICAgcmV0 dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc291cmNlID0gXywgbGluaykgOiBzb3VyY2U7CiAgfTsK CiAgbGluay50YXJnZXQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/ICh0YXJnZXQgPSBfLCBsaW5rKSA6IHRhcmdldDsKICB9OwoKICBsaW5rLnggPSBmdW5jdGlv bihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09ICJm dW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGxpbmspIDogeDsKICB9OwoKICBsaW5rLnkg PSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9m IF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGxpbmspIDogeTsKICB9OwoK ICBsaW5rLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfKSwgbGluaykgOiBjb250ZXh0Owog IH07CgogIHJldHVybiBsaW5rOwp9CgpmdW5jdGlvbiBjdXJ2ZUhvcml6b250YWwoY29udGV4dCwg eDAsIHkwLCB4MSwgeTEpIHsKICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApOwogIGNvbnRleHQuYmV6 aWVyQ3VydmVUbyh4MCA9ICh4MCArIHgxKSAvIDIsIHkwLCB4MCwgeTEsIHgxLCB5MSk7Cn0KCmZ1 bmN0aW9uIGN1cnZlVmVydGljYWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHsKICBjb250ZXh0 Lm1vdmVUbyh4MCwgeTApOwogIGNvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCwgeTAgPSAoeTAgKyB5 MSkgLyAyLCB4MSwgeTAsIHgxLCB5MSk7Cn0KCmZ1bmN0aW9uIGN1cnZlUmFkaWFsJDEoY29udGV4 dCwgeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgcDAgPSBwb2ludFJhZGlhbCh4MCwgeTApLAogICAg ICBwMSA9IHBvaW50UmFkaWFsKHgwLCB5MCA9ICh5MCArIHkxKSAvIDIpLAogICAgICBwMiA9IHBv aW50UmFkaWFsKHgxLCB5MCksCiAgICAgIHAzID0gcG9pbnRSYWRpYWwoeDEsIHkxKTsKICBjb250 ZXh0Lm1vdmVUbyhwMFswXSwgcDBbMV0pOwogIGNvbnRleHQuYmV6aWVyQ3VydmVUbyhwMVswXSwg cDFbMV0sIHAyWzBdLCBwMlsxXSwgcDNbMF0sIHAzWzFdKTsKfQoKZnVuY3Rpb24gbGlua0hvcml6 b250YWwoKSB7CiAgcmV0dXJuIGxpbmskMihjdXJ2ZUhvcml6b250YWwpOwp9CgpmdW5jdGlvbiBs aW5rVmVydGljYWwoKSB7CiAgcmV0dXJuIGxpbmskMihjdXJ2ZVZlcnRpY2FsKTsKfQoKZnVuY3Rp b24gbGlua1JhZGlhbCgpIHsKICB2YXIgbCA9IGxpbmskMihjdXJ2ZVJhZGlhbCQxKTsKICBsLmFu Z2xlID0gbC54LCBkZWxldGUgbC54OwogIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55OwogIHJl dHVybiBsOwp9Cgp2YXIgY2lyY2xlJDIgPSB7CiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6 ZSkgewogICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIHBpJDQpOwogICAgY29udGV4dC5tb3Zl VG8ociwgMCk7CiAgICBjb250ZXh0LmFyYygwLCAwLCByLCAwLCB0YXUkNCk7CiAgfQp9OwoKdmFy IGNyb3NzJDIgPSB7CiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkgewogICAgdmFyIHIg PSBNYXRoLnNxcnQoc2l6ZSAvIDUpIC8gMjsKICAgIGNvbnRleHQubW92ZVRvKC0zICogciwgLXIp OwogICAgY29udGV4dC5saW5lVG8oLXIsIC1yKTsKICAgIGNvbnRleHQubGluZVRvKC1yLCAtMyAq IHIpOwogICAgY29udGV4dC5saW5lVG8ociwgLTMgKiByKTsKICAgIGNvbnRleHQubGluZVRvKHIs IC1yKTsKICAgIGNvbnRleHQubGluZVRvKDMgKiByLCAtcik7CiAgICBjb250ZXh0LmxpbmVUbygz ICogciwgcik7CiAgICBjb250ZXh0LmxpbmVUbyhyLCByKTsKICAgIGNvbnRleHQubGluZVRvKHIs IDMgKiByKTsKICAgIGNvbnRleHQubGluZVRvKC1yLCAzICogcik7CiAgICBjb250ZXh0LmxpbmVU bygtciwgcik7CiAgICBjb250ZXh0LmxpbmVUbygtMyAqIHIsIHIpOwogICAgY29udGV4dC5jbG9z ZVBhdGgoKTsKICB9Cn07Cgp2YXIgdGFuMzAgPSBNYXRoLnNxcnQoMSAvIDMpLAogICAgdGFuMzBf MiA9IHRhbjMwICogMjsKCnZhciBkaWFtb25kID0gewogIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQs IHNpemUpIHsKICAgIHZhciB5ID0gTWF0aC5zcXJ0KHNpemUgLyB0YW4zMF8yKSwKICAgICAgICB4 ID0geSAqIHRhbjMwOwogICAgY29udGV4dC5tb3ZlVG8oMCwgLXkpOwogICAgY29udGV4dC5saW5l VG8oeCwgMCk7CiAgICBjb250ZXh0LmxpbmVUbygwLCB5KTsKICAgIGNvbnRleHQubGluZVRvKC14 LCAwKTsKICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CiAgfQp9OwoKdmFyIGthID0gMC44OTA4MTMw OTE1MjkyODUyMjgxMCwKICAgIGtyID0gTWF0aC5zaW4ocGkkNCAvIDEwKSAvIE1hdGguc2luKDcg KiBwaSQ0IC8gMTApLAogICAga3ggPSBNYXRoLnNpbih0YXUkNCAvIDEwKSAqIGtyLAogICAga3kg PSAtTWF0aC5jb3ModGF1JDQgLyAxMCkgKiBrcjsKCnZhciBzdGFyID0gewogIGRyYXc6IGZ1bmN0 aW9uKGNvbnRleHQsIHNpemUpIHsKICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgKiBrYSksCiAg ICAgICAgeCA9IGt4ICogciwKICAgICAgICB5ID0ga3kgKiByOwogICAgY29udGV4dC5tb3ZlVG8o MCwgLXIpOwogICAgY29udGV4dC5saW5lVG8oeCwgeSk7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8 IDU7ICsraSkgewogICAgICB2YXIgYSA9IHRhdSQ0ICogaSAvIDUsCiAgICAgICAgICBjID0gTWF0 aC5jb3MoYSksCiAgICAgICAgICBzID0gTWF0aC5zaW4oYSk7CiAgICAgIGNvbnRleHQubGluZVRv KHMgKiByLCAtYyAqIHIpOwogICAgICBjb250ZXh0LmxpbmVUbyhjICogeCAtIHMgKiB5LCBzICog eCArIGMgKiB5KTsKICAgIH0KICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CiAgfQp9OwoKdmFyIHNx dWFyZSA9IHsKICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7CiAgICB2YXIgdyA9IE1h dGguc3FydChzaXplKSwKICAgICAgICB4ID0gLXcgLyAyOwogICAgY29udGV4dC5yZWN0KHgsIHgs IHcsIHcpOwogIH0KfTsKCnZhciBzcXJ0MyA9IE1hdGguc3FydCgzKTsKCnZhciB0cmlhbmdsZSA9 IHsKICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7CiAgICB2YXIgeSA9IC1NYXRoLnNx cnQoc2l6ZSAvIChzcXJ0MyAqIDMpKTsKICAgIGNvbnRleHQubW92ZVRvKDAsIHkgKiAyKTsKICAg IGNvbnRleHQubGluZVRvKC1zcXJ0MyAqIHksIC15KTsKICAgIGNvbnRleHQubGluZVRvKHNxcnQz ICogeSwgLXkpOwogICAgY29udGV4dC5jbG9zZVBhdGgoKTsKICB9Cn07Cgp2YXIgYyQyID0gLTAu NSwKICAgIHMgPSBNYXRoLnNxcnQoMykgLyAyLAogICAgayA9IDEgLyBNYXRoLnNxcnQoMTIpLAog ICAgYSA9IChrIC8gMiArIDEpICogMzsKCnZhciB3eWUgPSB7CiAgZHJhdzogZnVuY3Rpb24oY29u dGV4dCwgc2l6ZSkgewogICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIGEpLAogICAgICAgIHgw ID0gciAvIDIsCiAgICAgICAgeTAgPSByICogaywKICAgICAgICB4MSA9IHgwLAogICAgICAgIHkx ID0gciAqIGsgKyByLAogICAgICAgIHgyID0gLXgxLAogICAgICAgIHkyID0geTE7CiAgICBjb250 ZXh0Lm1vdmVUbyh4MCwgeTApOwogICAgY29udGV4dC5saW5lVG8oeDEsIHkxKTsKICAgIGNvbnRl eHQubGluZVRvKHgyLCB5Mik7CiAgICBjb250ZXh0LmxpbmVUbyhjJDIgKiB4MCAtIHMgKiB5MCwg cyAqIHgwICsgYyQyICogeTApOwogICAgY29udGV4dC5saW5lVG8oYyQyICogeDEgLSBzICogeTEs IHMgKiB4MSArIGMkMiAqIHkxKTsKICAgIGNvbnRleHQubGluZVRvKGMkMiAqIHgyIC0gcyAqIHky LCBzICogeDIgKyBjJDIgKiB5Mik7CiAgICBjb250ZXh0LmxpbmVUbyhjJDIgKiB4MCArIHMgKiB5 MCwgYyQyICogeTAgLSBzICogeDApOwogICAgY29udGV4dC5saW5lVG8oYyQyICogeDEgKyBzICog eTEsIGMkMiAqIHkxIC0gcyAqIHgxKTsKICAgIGNvbnRleHQubGluZVRvKGMkMiAqIHgyICsgcyAq IHkyLCBjJDIgKiB5MiAtIHMgKiB4Mik7CiAgICBjb250ZXh0LmNsb3NlUGF0aCgpOwogIH0KfTsK CnZhciBzeW1ib2xzID0gWwogIGNpcmNsZSQyLAogIGNyb3NzJDIsCiAgZGlhbW9uZCwKICBzcXVh cmUsCiAgc3RhciwKICB0cmlhbmdsZSwKICB3eWUKXTsKCmZ1bmN0aW9uIHN5bWJvbCgpIHsKICB2 YXIgdHlwZSA9IGNvbnN0YW50JGIoY2lyY2xlJDIpLAogICAgICBzaXplID0gY29uc3RhbnQkYig2 NCksCiAgICAgIGNvbnRleHQgPSBudWxsOwoKICBmdW5jdGlvbiBzeW1ib2woKSB7CiAgICB2YXIg YnVmZmVyOwogICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gYnVmZmVyID0gcGF0aCgpOwogICAg dHlwZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLmRyYXcoY29udGV4dCwgK3NpemUuYXBwbHkodGhp cywgYXJndW1lbnRzKSk7CiAgICBpZiAoYnVmZmVyKSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1 ZmZlciArICIiIHx8IG51bGw7CiAgfQoKICBzeW1ib2wudHlwZSA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHR5cGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9u IiA/IF8gOiBjb25zdGFudCRiKF8pLCBzeW1ib2wpIDogdHlwZTsKICB9OwoKICBzeW1ib2wuc2l6 ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNpemUgPSB0 eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgc3ltYm9sKSA6IHNp emU7CiAgfTsKCiAgc3ltYm9sLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJn dW1lbnRzLmxlbmd0aCA/IChjb250ZXh0ID0gXyA9PSBudWxsID8gbnVsbCA6IF8sIHN5bWJvbCkg OiBjb250ZXh0OwogIH07CgogIHJldHVybiBzeW1ib2w7Cn0KCmZ1bmN0aW9uIG5vb3AkMygpIHt9 CgpmdW5jdGlvbiBwb2ludCQyKHRoYXQsIHgsIHkpIHsKICB0aGF0Ll9jb250ZXh0LmJlemllckN1 cnZlVG8oCiAgICAoMiAqIHRoYXQuX3gwICsgdGhhdC5feDEpIC8gMywKICAgICgyICogdGhhdC5f eTAgKyB0aGF0Ll95MSkgLyAzLAogICAgKHRoYXQuX3gwICsgMiAqIHRoYXQuX3gxKSAvIDMsCiAg ICAodGhhdC5feTAgKyAyICogdGhhdC5feTEpIC8gMywKICAgICh0aGF0Ll94MCArIDQgKiB0aGF0 Ll94MSArIHgpIC8gNiwKICAgICh0aGF0Ll95MCArIDQgKiB0aGF0Ll95MSArIHkpIC8gNgogICk7 Cn0KCmZ1bmN0aW9uIEJhc2lzKGNvbnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsK fQoKQmFzaXMucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlz Ll9saW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9 IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94MCA9IHRoaXMu X3gxID0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSBOYU47CiAgICB0aGlzLl9wb2ludCA9IDA7 CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsK ICAgICAgY2FzZSAzOiBwb2ludCQyKHRoaXMsIHRoaXMuX3gxLCB0aGlzLl95MSk7IC8vIHByb2Nl ZWQKICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSwgdGhpcy5feTEp OyBicmVhazsKICAgIH0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYm IHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIHRoaXMu X2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAg ICB4ID0gK3gsIHkgPSAreTsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAw OiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5 KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhazsKICAgICAgY2FzZSAxOiB0aGlz Ll9wb2ludCA9IDI7IGJyZWFrOwogICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5f Y29udGV4dC5saW5lVG8oKDUgKiB0aGlzLl94MCArIHRoaXMuX3gxKSAvIDYsICg1ICogdGhpcy5f eTAgKyB0aGlzLl95MSkgLyA2KTsgLy8gcHJvY2VlZAogICAgICBkZWZhdWx0OiBwb2ludCQyKHRo aXMsIHgsIHkpOyBicmVhazsKICAgIH0KICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gx ID0geDsKICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTsKICB9Cn07CgpmdW5j dGlvbiBiYXNpcyQyKGNvbnRleHQpIHsKICByZXR1cm4gbmV3IEJhc2lzKGNvbnRleHQpOwp9Cgpm dW5jdGlvbiBCYXNpc0Nsb3NlZChjb250ZXh0KSB7CiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7 Cn0KCkJhc2lzQ2xvc2VkLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6IG5vb3AkMywKICBhcmVh RW5kOiBub29wJDMsCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3gwID0gdGhp cy5feDEgPSB0aGlzLl94MiA9IHRoaXMuX3gzID0gdGhpcy5feDQgPQogICAgdGhpcy5feTAgPSB0 aGlzLl95MSA9IHRoaXMuX3kyID0gdGhpcy5feTMgPSB0aGlzLl95NCA9IE5hTjsKICAgIHRoaXMu X3BvaW50ID0gMDsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgc3dpdGNoICh0aGlz Ll9wb2ludCkgewogICAgICBjYXNlIDE6IHsKICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0 aGlzLl94MiwgdGhpcy5feTIpOwogICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAg ICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAyOiB7CiAgICAgICAgdGhpcy5fY29udGV4 dC5tb3ZlVG8oKHRoaXMuX3gyICsgMiAqIHRoaXMuX3gzKSAvIDMsICh0aGlzLl95MiArIDIgKiB0 aGlzLl95MykgLyAzKTsKICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMgKyAy ICogdGhpcy5feDIpIC8gMywgKHRoaXMuX3kzICsgMiAqIHRoaXMuX3kyKSAvIDMpOwogICAgICAg IHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAg Y2FzZSAzOiB7CiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MiwgdGhpcy5feTIpOwogICAgICAg IHRoaXMucG9pbnQodGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICB0aGlzLnBvaW50KHRoaXMu X3g0LCB0aGlzLl95NCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9LAogIHBvaW50 OiBmdW5jdGlvbih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKICAgIHN3aXRjaCAodGhpcy5f cG9pbnQpIHsKICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX3gyID0geCwgdGhp cy5feTIgPSB5OyBicmVhazsKICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IHRoaXMuX3gz ID0geCwgdGhpcy5feTMgPSB5OyBicmVhazsKICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7 IHRoaXMuX3g0ID0geCwgdGhpcy5feTQgPSB5OyB0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5f eDAgKyA0ICogdGhpcy5feDEgKyB4KSAvIDYsICh0aGlzLl95MCArIDQgKiB0aGlzLl95MSArIHkp IC8gNik7IGJyZWFrOwogICAgICBkZWZhdWx0OiBwb2ludCQyKHRoaXMsIHgsIHkpOyBicmVhazsK ICAgIH0KICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0geDsKICAgIHRoaXMuX3kw ID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTsKICB9Cn07CgpmdW5jdGlvbiBiYXNpc0Nsb3NlZCQx KGNvbnRleHQpIHsKICByZXR1cm4gbmV3IEJhc2lzQ2xvc2VkKGNvbnRleHQpOwp9CgpmdW5jdGlv biBCYXNpc09wZW4oY29udGV4dCkgewogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Owp9CgpCYXNp c09wZW4ucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9s aW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IE5h TjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94MCA9IHRoaXMuX3gx ID0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSBOYU47CiAgICB0aGlzLl9wb2ludCA9IDA7CiAg fSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9s aW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgo KTsKICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICB9LAogIHBvaW50OiBmdW5jdGlv bih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsK ICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOwogICAgICBjYXNlIDE6IHRoaXMu X3BvaW50ID0gMjsgYnJlYWs7CiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB2YXIgeDAg PSAodGhpcy5feDAgKyA0ICogdGhpcy5feDEgKyB4KSAvIDYsIHkwID0gKHRoaXMuX3kwICsgNCAq IHRoaXMuX3kxICsgeSkgLyA2OyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeDAs IHkwKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgwLCB5MCk7IGJyZWFrOwogICAgICBjYXNlIDM6 IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZAogICAgICBkZWZhdWx0OiBwb2ludCQyKHRoaXMs IHgsIHkpOyBicmVhazsKICAgIH0KICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0g eDsKICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTsKICB9Cn07CgpmdW5jdGlv biBiYXNpc09wZW4oY29udGV4dCkgewogIHJldHVybiBuZXcgQmFzaXNPcGVuKGNvbnRleHQpOwp9 CgpmdW5jdGlvbiBCdW5kbGUoY29udGV4dCwgYmV0YSkgewogIHRoaXMuX2Jhc2lzID0gbmV3IEJh c2lzKGNvbnRleHQpOwogIHRoaXMuX2JldGEgPSBiZXRhOwp9CgpCdW5kbGUucHJvdG90eXBlID0g ewogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94ID0gW107CiAgICB0aGlzLl95 ID0gW107CiAgICB0aGlzLl9iYXNpcy5saW5lU3RhcnQoKTsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0 aW9uKCkgewogICAgdmFyIHggPSB0aGlzLl94LAogICAgICAgIHkgPSB0aGlzLl95LAogICAgICAg IGogPSB4Lmxlbmd0aCAtIDE7CgogICAgaWYgKGogPiAwKSB7CiAgICAgIHZhciB4MCA9IHhbMF0s CiAgICAgICAgICB5MCA9IHlbMF0sCiAgICAgICAgICBkeCA9IHhbal0gLSB4MCwKICAgICAgICAg IGR5ID0geVtqXSAtIHkwLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgdDsKCiAgICAgIHdo aWxlICgrK2kgPD0gaikgewogICAgICAgIHQgPSBpIC8gajsKICAgICAgICB0aGlzLl9iYXNpcy5w b2ludCgKICAgICAgICAgIHRoaXMuX2JldGEgKiB4W2ldICsgKDEgLSB0aGlzLl9iZXRhKSAqICh4 MCArIHQgKiBkeCksCiAgICAgICAgICB0aGlzLl9iZXRhICogeVtpXSArICgxIC0gdGhpcy5fYmV0 YSkgKiAoeTAgKyB0ICogZHkpCiAgICAgICAgKTsKICAgICAgfQogICAgfQoKICAgIHRoaXMuX3gg PSB0aGlzLl95ID0gbnVsbDsKICAgIHRoaXMuX2Jhc2lzLmxpbmVFbmQoKTsKICB9LAogIHBvaW50 OiBmdW5jdGlvbih4LCB5KSB7CiAgICB0aGlzLl94LnB1c2goK3gpOwogICAgdGhpcy5feS5wdXNo KCt5KTsKICB9Cn07Cgp2YXIgYnVuZGxlID0gKGZ1bmN0aW9uIGN1c3RvbShiZXRhKSB7CgogIGZ1 bmN0aW9uIGJ1bmRsZShjb250ZXh0KSB7CiAgICByZXR1cm4gYmV0YSA9PT0gMSA/IG5ldyBCYXNp cyhjb250ZXh0KSA6IG5ldyBCdW5kbGUoY29udGV4dCwgYmV0YSk7CiAgfQoKICBidW5kbGUuYmV0 YSA9IGZ1bmN0aW9uKGJldGEpIHsKICAgIHJldHVybiBjdXN0b20oK2JldGEpOwogIH07CgogIHJl dHVybiBidW5kbGU7Cn0pKDAuODUpOwoKZnVuY3Rpb24gcG9pbnQkMyh0aGF0LCB4LCB5KSB7CiAg dGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKAogICAgdGhhdC5feDEgKyB0aGF0Ll9rICogKHRo YXQuX3gyIC0gdGhhdC5feDApLAogICAgdGhhdC5feTEgKyB0aGF0Ll9rICogKHRoYXQuX3kyIC0g dGhhdC5feTApLAogICAgdGhhdC5feDIgKyB0aGF0Ll9rICogKHRoYXQuX3gxIC0geCksCiAgICB0 aGF0Ll95MiArIHRoYXQuX2sgKiAodGhhdC5feTEgLSB5KSwKICAgIHRoYXQuX3gyLAogICAgdGhh dC5feTIKICApOwp9CgpmdW5jdGlvbiBDYXJkaW5hbChjb250ZXh0LCB0ZW5zaW9uKSB7CiAgdGhp cy5fY29udGV4dCA9IGNvbnRleHQ7CiAgdGhpcy5fayA9ICgxIC0gdGVuc2lvbikgLyA2Owp9CgpD YXJkaW5hbC5wcm90b3R5cGUgPSB7CiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMu X2xpbmUgPSAwOwogIH0sCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0g TmFOOwogIH0sCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3gwID0gdGhpcy5f eDEgPSB0aGlzLl94MiA9CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47 CiAgICB0aGlzLl9wb2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIHN3 aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0 aGlzLl94MiwgdGhpcy5feTIpOyBicmVhazsKICAgICAgY2FzZSAzOiBwb2ludCQzKHRoaXMsIHRo aXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrOwogICAgfQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRo aXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3Nl UGF0aCgpOwogICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogIH0sCiAgcG9pbnQ6IGZ1 bmN0aW9uKHgsIHkpIHsKICAgIHggPSAreCwgeSA9ICt5OwogICAgc3dpdGNoICh0aGlzLl9wb2lu dCkgewogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2Nv bnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrOwog ICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5feDEgPSB4LCB0aGlzLl95MSA9IHk7 IGJyZWFrOwogICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgLy8gcHJvY2VlZAogICAgICBk ZWZhdWx0OiBwb2ludCQzKHRoaXMsIHgsIHkpOyBicmVhazsKICAgIH0KICAgIHRoaXMuX3gwID0g dGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsKICAgIHRoaXMuX3kw ID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICB9Cn07Cgp2 YXIgY2FyZGluYWwgPSAoZnVuY3Rpb24gY3VzdG9tKHRlbnNpb24pIHsKCiAgZnVuY3Rpb24gY2Fy ZGluYWwoY29udGV4dCkgewogICAgcmV0dXJuIG5ldyBDYXJkaW5hbChjb250ZXh0LCB0ZW5zaW9u KTsKICB9CgogIGNhcmRpbmFsLnRlbnNpb24gPSBmdW5jdGlvbih0ZW5zaW9uKSB7CiAgICByZXR1 cm4gY3VzdG9tKCt0ZW5zaW9uKTsKICB9OwoKICByZXR1cm4gY2FyZGluYWw7Cn0pKDApOwoKZnVu Y3Rpb24gQ2FyZGluYWxDbG9zZWQoY29udGV4dCwgdGVuc2lvbikgewogIHRoaXMuX2NvbnRleHQg PSBjb250ZXh0OwogIHRoaXMuX2sgPSAoMSAtIHRlbnNpb24pIC8gNjsKfQoKQ2FyZGluYWxDbG9z ZWQucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogbm9vcCQzLAogIGFyZWFFbmQ6IG5vb3AkMywK ICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMu X3gyID0gdGhpcy5feDMgPSB0aGlzLl94NCA9IHRoaXMuX3g1ID0KICAgIHRoaXMuX3kwID0gdGhp cy5feTEgPSB0aGlzLl95MiA9IHRoaXMuX3kzID0gdGhpcy5feTQgPSB0aGlzLl95NSA9IE5hTjsK ICAgIHRoaXMuX3BvaW50ID0gMDsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgc3dp dGNoICh0aGlzLl9wb2ludCkgewogICAgICBjYXNlIDE6IHsKICAgICAgICB0aGlzLl9jb250ZXh0 Lm1vdmVUbyh0aGlzLl94MywgdGhpcy5feTMpOwogICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQ YXRoKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAyOiB7CiAgICAgICAgdGhp cy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICB0aGlzLl9jb250 ZXh0LmNsb3NlUGF0aCgpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgMzogewog ICAgICAgIHRoaXMucG9pbnQodGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICB0aGlzLnBvaW50 KHRoaXMuX3g0LCB0aGlzLl95NCk7CiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NSwgdGhpcy5f eTUpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfSwKICBwb2ludDogZnVuY3Rpb24o eCwgeSkgewogICAgeCA9ICt4LCB5ID0gK3k7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAg ICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsg YnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl9jb250ZXh0Lm1vdmVU byh0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geSk7IGJyZWFrOwogICAgICBjYXNlIDI6IHRoaXMu X3BvaW50ID0gMzsgdGhpcy5feDUgPSB4LCB0aGlzLl95NSA9IHk7IGJyZWFrOwogICAgICBkZWZh dWx0OiBwb2ludCQzKHRoaXMsIHgsIHkpOyBicmVhazsKICAgIH0KICAgIHRoaXMuX3gwID0gdGhp cy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsKICAgIHRoaXMuX3kwID0g dGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICB9Cn07Cgp2YXIg Y2FyZGluYWxDbG9zZWQgPSAoZnVuY3Rpb24gY3VzdG9tKHRlbnNpb24pIHsKCiAgZnVuY3Rpb24g Y2FyZGluYWwoY29udGV4dCkgewogICAgcmV0dXJuIG5ldyBDYXJkaW5hbENsb3NlZChjb250ZXh0 LCB0ZW5zaW9uKTsKICB9CgogIGNhcmRpbmFsLnRlbnNpb24gPSBmdW5jdGlvbih0ZW5zaW9uKSB7 CiAgICByZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKTsKICB9OwoKICByZXR1cm4gY2FyZGluYWw7Cn0p KDApOwoKZnVuY3Rpb24gQ2FyZGluYWxPcGVuKGNvbnRleHQsIHRlbnNpb24pIHsKICB0aGlzLl9j b250ZXh0ID0gY29udGV4dDsKICB0aGlzLl9rID0gKDEgLSB0ZW5zaW9uKSAvIDY7Cn0KCkNhcmRp bmFsT3Blbi5wcm90b3R5cGUgPSB7CiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMu X2xpbmUgPSAwOwogIH0sCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0g TmFOOwogIH0sCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3gwID0gdGhpcy5f eDEgPSB0aGlzLl94MiA9CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47 CiAgICB0aGlzLl9wb2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIGlm ICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkg dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGlu ZTsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKICAg IHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJy ZWFrOwogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7CiAgICAgIGNhc2UgMjog dGhpcy5fcG9pbnQgPSAzOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5f eDIsIHRoaXMuX3kyKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7 IGJyZWFrOwogICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZAogICAgICBk ZWZhdWx0OiBwb2ludCQzKHRoaXMsIHgsIHkpOyBicmVhazsKICAgIH0KICAgIHRoaXMuX3gwID0g dGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsKICAgIHRoaXMuX3kw ID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICB9Cn07Cgp2 YXIgY2FyZGluYWxPcGVuID0gKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7CgogIGZ1bmN0aW9u IGNhcmRpbmFsKGNvbnRleHQpIHsKICAgIHJldHVybiBuZXcgQ2FyZGluYWxPcGVuKGNvbnRleHQs IHRlbnNpb24pOwogIH0KCiAgY2FyZGluYWwudGVuc2lvbiA9IGZ1bmN0aW9uKHRlbnNpb24pIHsK ICAgIHJldHVybiBjdXN0b20oK3RlbnNpb24pOwogIH07CgogIHJldHVybiBjYXJkaW5hbDsKfSko MCk7CgpmdW5jdGlvbiBwb2ludCQ0KHRoYXQsIHgsIHkpIHsKICB2YXIgeDEgPSB0aGF0Ll94MSwK ICAgICAgeTEgPSB0aGF0Ll95MSwKICAgICAgeDIgPSB0aGF0Ll94MiwKICAgICAgeTIgPSB0aGF0 Ll95MjsKCiAgaWYgKHRoYXQuX2wwMV9hID4gZXBzaWxvbiQzKSB7CiAgICB2YXIgYSA9IDIgKiB0 aGF0Ll9sMDFfMmEgKyAzICogdGhhdC5fbDAxX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8y YSwKICAgICAgICBuID0gMyAqIHRoYXQuX2wwMV9hICogKHRoYXQuX2wwMV9hICsgdGhhdC5fbDEy X2EpOwogICAgeDEgPSAoeDEgKiBhIC0gdGhhdC5feDAgKiB0aGF0Ll9sMTJfMmEgKyB0aGF0Ll94 MiAqIHRoYXQuX2wwMV8yYSkgLyBuOwogICAgeTEgPSAoeTEgKiBhIC0gdGhhdC5feTAgKiB0aGF0 Ll9sMTJfMmEgKyB0aGF0Ll95MiAqIHRoYXQuX2wwMV8yYSkgLyBuOwogIH0KCiAgaWYgKHRoYXQu X2wyM19hID4gZXBzaWxvbiQzKSB7CiAgICB2YXIgYiA9IDIgKiB0aGF0Ll9sMjNfMmEgKyAzICog dGhhdC5fbDIzX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8yYSwKICAgICAgICBtID0gMyAq IHRoYXQuX2wyM19hICogKHRoYXQuX2wyM19hICsgdGhhdC5fbDEyX2EpOwogICAgeDIgPSAoeDIg KiBiICsgdGhhdC5feDEgKiB0aGF0Ll9sMjNfMmEgLSB4ICogdGhhdC5fbDEyXzJhKSAvIG07CiAg ICB5MiA9ICh5MiAqIGIgKyB0aGF0Ll95MSAqIHRoYXQuX2wyM18yYSAtIHkgKiB0aGF0Ll9sMTJf MmEpIC8gbTsKICB9CgogIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MSwgeTEsIHgyLCB5 MiwgdGhhdC5feDIsIHRoYXQuX3kyKTsKfQoKZnVuY3Rpb24gQ2F0bXVsbFJvbShjb250ZXh0LCBh bHBoYSkgewogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogIHRoaXMuX2FscGhhID0gYWxwaGE7 Cn0KCkNhdG11bGxSb20ucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAg ICB0aGlzLl9saW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5f bGluZSA9IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94MCA9 IHRoaXMuX3gxID0gdGhpcy5feDIgPQogICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3ky ID0gTmFOOwogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID0KICAg IHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYSA9CiAgICB0aGlzLl9w b2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIHN3aXRjaCAodGhpcy5f cG9pbnQpIHsKICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhp cy5feTIpOyBicmVhazsKICAgICAgY2FzZSAzOiB0aGlzLnBvaW50KHRoaXMuX3gyLCB0aGlzLl95 Mik7IGJyZWFrOwogICAgfQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAg JiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgdGhp cy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsK ICAgIHggPSAreCwgeSA9ICt5OwoKICAgIGlmICh0aGlzLl9wb2ludCkgewogICAgICB2YXIgeDIz ID0gdGhpcy5feDIgLSB4LAogICAgICAgICAgeTIzID0gdGhpcy5feTIgLSB5OwogICAgICB0aGlz Ll9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5 MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7CiAgICB9CgogICAgc3dpdGNoICh0aGlzLl9wb2ludCkg ewogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRl eHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrOwogICAg ICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7CiAgICAgIGNhc2UgMjogdGhpcy5fcG9p bnQgPSAzOyAvLyBwcm9jZWVkCiAgICAgIGRlZmF1bHQ6IHBvaW50JDQodGhpcywgeCwgeSk7IGJy ZWFrOwogICAgfQoKICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EsIHRoaXMuX2wxMl9hID0g dGhpcy5fbDIzX2E7CiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8y YSA9IHRoaXMuX2wyM18yYTsKICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhp cy5feDIsIHRoaXMuX3gyID0geDsKICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0g dGhpcy5feTIsIHRoaXMuX3kyID0geTsKICB9Cn07Cgp2YXIgY2F0bXVsbFJvbSA9IChmdW5jdGlv biBjdXN0b20oYWxwaGEpIHsKCiAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7CiAgICBy ZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbShjb250ZXh0LCBhbHBoYSkgOiBuZXcgQ2FyZGlu YWwoY29udGV4dCwgMCk7CiAgfQoKICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEp IHsKICAgIHJldHVybiBjdXN0b20oK2FscGhhKTsKICB9OwoKICByZXR1cm4gY2F0bXVsbFJvbTsK fSkoMC41KTsKCmZ1bmN0aW9uIENhdG11bGxSb21DbG9zZWQoY29udGV4dCwgYWxwaGEpIHsKICB0 aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICB0aGlzLl9hbHBoYSA9IGFscGhhOwp9CgpDYXRtdWxs Um9tQ2xvc2VkLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6IG5vb3AkMywKICBhcmVhRW5kOiBu b29wJDMsCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3gwID0gdGhpcy5feDEg PSB0aGlzLl94MiA9IHRoaXMuX3gzID0gdGhpcy5feDQgPSB0aGlzLl94NSA9CiAgICB0aGlzLl95 MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSB0aGlzLl95MyA9IHRoaXMuX3k0ID0gdGhpcy5feTUg PSBOYU47CiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2EgPQogICAg dGhpcy5fbDAxXzJhID0gdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhID0KICAgIHRoaXMuX3Bv aW50ID0gMDsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgc3dpdGNoICh0aGlzLl9w b2ludCkgewogICAgICBjYXNlIDE6IHsKICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlz Ll94MywgdGhpcy5feTMpOwogICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAg ICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAyOiB7CiAgICAgICAgdGhpcy5fY29udGV4dC5s aW5lVG8odGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0 aCgpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgMzogewogICAgICAgIHRoaXMu cG9pbnQodGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0 aGlzLl95NCk7CiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NSwgdGhpcy5feTUpOwogICAgICAg IGJyZWFrOwogICAgICB9CiAgICB9CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAg eCA9ICt4LCB5ID0gK3k7CgogICAgaWYgKHRoaXMuX3BvaW50KSB7CiAgICAgIHZhciB4MjMgPSB0 aGlzLl94MiAtIHgsCiAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7CiAgICAgIHRoaXMuX2wy M19hID0gTWF0aC5zcXJ0KHRoaXMuX2wyM18yYSA9IE1hdGgucG93KHgyMyAqIHgyMyArIHkyMyAq IHkyMywgdGhpcy5fYWxwaGEpKTsKICAgIH0KCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAg ICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsg YnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl9jb250ZXh0Lm1vdmVU byh0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geSk7IGJyZWFrOwogICAgICBjYXNlIDI6IHRoaXMu X3BvaW50ID0gMzsgdGhpcy5feDUgPSB4LCB0aGlzLl95NSA9IHk7IGJyZWFrOwogICAgICBkZWZh dWx0OiBwb2ludCQ0KHRoaXMsIHgsIHkpOyBicmVhazsKICAgIH0KCiAgICB0aGlzLl9sMDFfYSA9 IHRoaXMuX2wxMl9hLCB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hOwogICAgdGhpcy5fbDAxXzJh ID0gdGhpcy5fbDEyXzJhLCB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmE7CiAgICB0aGlzLl94 MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7CiAgICB0aGlz Ll95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7CiAgfQp9 OwoKdmFyIGNhdG11bGxSb21DbG9zZWQgPSAoZnVuY3Rpb24gY3VzdG9tKGFscGhhKSB7CgogIGZ1 bmN0aW9uIGNhdG11bGxSb20oY29udGV4dCkgewogICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11 bGxSb21DbG9zZWQoY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsQ2xvc2VkKGNvbnRleHQs IDApOwogIH0KCiAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7CiAgICByZXR1 cm4gY3VzdG9tKCthbHBoYSk7CiAgfTsKCiAgcmV0dXJuIGNhdG11bGxSb207Cn0pKDAuNSk7Cgpm dW5jdGlvbiBDYXRtdWxsUm9tT3Blbihjb250ZXh0LCBhbHBoYSkgewogIHRoaXMuX2NvbnRleHQg PSBjb250ZXh0OwogIHRoaXMuX2FscGhhID0gYWxwaGE7Cn0KCkNhdG11bGxSb21PcGVuLnByb3Rv dHlwZSA9IHsKICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IDA7CiAg fSwKICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgfSwKICBs aW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gy ID0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IE5hTjsKICAgIHRoaXMuX2ww MV9hID0gdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYSA9CiAgICB0aGlzLl9sMDFfMmEgPSB0aGlz Ll9sMTJfMmEgPSB0aGlzLl9sMjNfMmEgPQogICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGlu ZUVuZDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0g MCAmJiB0aGlzLl9wb2ludCA9PT0gMykpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICB0 aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkg ewogICAgeCA9ICt4LCB5ID0gK3k7CgogICAgaWYgKHRoaXMuX3BvaW50KSB7CiAgICAgIHZhciB4 MjMgPSB0aGlzLl94MiAtIHgsCiAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7CiAgICAgIHRo aXMuX2wyM19hID0gTWF0aC5zcXJ0KHRoaXMuX2wyM18yYSA9IE1hdGgucG93KHgyMyAqIHgyMyAr IHkyMyAqIHkyMywgdGhpcy5fYWxwaGEpKTsKICAgIH0KCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50 KSB7CiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyBicmVhazsKICAgICAgY2FzZSAxOiB0 aGlzLl9wb2ludCA9IDI7IGJyZWFrOwogICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhp cy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95MikgOiB0aGlz Ll9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhazsKICAgICAgY2FzZSAz OiB0aGlzLl9wb2ludCA9IDQ7IC8vIHByb2NlZWQKICAgICAgZGVmYXVsdDogcG9pbnQkNCh0aGlz LCB4LCB5KTsgYnJlYWs7CiAgICB9CgogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhp cy5fbDEyX2EgPSB0aGlzLl9sMjNfYTsKICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSwg dGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhOwogICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhp cy5feDEgPSB0aGlzLl94MiwgdGhpcy5feDIgPSB4OwogICAgdGhpcy5feTAgPSB0aGlzLl95MSwg dGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5OwogIH0KfTsKCnZhciBjYXRtdWxsUm9t T3BlbiA9IChmdW5jdGlvbiBjdXN0b20oYWxwaGEpIHsKCiAgZnVuY3Rpb24gY2F0bXVsbFJvbShj b250ZXh0KSB7CiAgICByZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbU9wZW4oY29udGV4dCwg YWxwaGEpIDogbmV3IENhcmRpbmFsT3Blbihjb250ZXh0LCAwKTsKICB9CgogIGNhdG11bGxSb20u YWxwaGEgPSBmdW5jdGlvbihhbHBoYSkgewogICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpOwogIH07 CgogIHJldHVybiBjYXRtdWxsUm9tOwp9KSgwLjUpOwoKZnVuY3Rpb24gTGluZWFyQ2xvc2VkKGNv bnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKfQoKTGluZWFyQ2xvc2VkLnByb3Rv dHlwZSA9IHsKICBhcmVhU3RhcnQ6IG5vb3AkMywKICBhcmVhRW5kOiBub29wJDMsCiAgbGluZVN0 YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3BvaW50ID0gMDsKICB9LAogIGxpbmVFbmQ6IGZ1 bmN0aW9uKCkgewogICAgaWYgKHRoaXMuX3BvaW50KSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgp OwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHggPSAreCwgeSA9ICt5OwogICAg aWYgKHRoaXMuX3BvaW50KSB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsKICAgIGVsc2UgdGhp cy5fcG9pbnQgPSAxLCB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsKICB9Cn07CgpmdW5jdGlv biBsaW5lYXJDbG9zZWQoY29udGV4dCkgewogIHJldHVybiBuZXcgTGluZWFyQ2xvc2VkKGNvbnRl eHQpOwp9CgpmdW5jdGlvbiBzaWduJDEoeCkgewogIHJldHVybiB4IDwgMCA/IC0xIDogMTsKfQoK Ly8gQ2FsY3VsYXRlIHRoZSBzbG9wZXMgb2YgdGhlIHRhbmdlbnRzIChIZXJtaXRlLXR5cGUgaW50 ZXJwb2xhdGlvbikgYmFzZWQgb24KLy8gdGhlIGZvbGxvd2luZyBwYXBlcjogU3RlZmZlbiwgTS4g MTk5MC4gQSBTaW1wbGUgTWV0aG9kIGZvciBNb25vdG9uaWMKLy8gSW50ZXJwb2xhdGlvbiBpbiBP bmUgRGltZW5zaW9uLiBBc3Ryb25vbXkgYW5kIEFzdHJvcGh5c2ljcywgVm9sLiAyMzksIE5PLgov LyBOT1YoSUkpLCBQLiA0NDMsIDE5OTAuCmZ1bmN0aW9uIHNsb3BlMyh0aGF0LCB4MiwgeTIpIHsK ICB2YXIgaDAgPSB0aGF0Ll94MSAtIHRoYXQuX3gwLAogICAgICBoMSA9IHgyIC0gdGhhdC5feDEs CiAgICAgIHMwID0gKHRoYXQuX3kxIC0gdGhhdC5feTApIC8gKGgwIHx8IGgxIDwgMCAmJiAtMCks CiAgICAgIHMxID0gKHkyIC0gdGhhdC5feTEpIC8gKGgxIHx8IGgwIDwgMCAmJiAtMCksCiAgICAg IHAgPSAoczAgKiBoMSArIHMxICogaDApIC8gKGgwICsgaDEpOwogIHJldHVybiAoc2lnbiQxKHMw KSArIHNpZ24kMShzMSkpICogTWF0aC5taW4oTWF0aC5hYnMoczApLCBNYXRoLmFicyhzMSksIDAu NSAqIE1hdGguYWJzKHApKSB8fCAwOwp9CgovLyBDYWxjdWxhdGUgYSBvbmUtc2lkZWQgc2xvcGUu CmZ1bmN0aW9uIHNsb3BlMih0aGF0LCB0KSB7CiAgdmFyIGggPSB0aGF0Ll94MSAtIHRoYXQuX3gw OwogIHJldHVybiBoID8gKDMgKiAodGhhdC5feTEgLSB0aGF0Ll95MCkgLyBoIC0gdCkgLyAyIDog dDsKfQoKLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1Ymlj X0hlcm1pdGVfc3BsaW5lI1JlcHJlc2VudGF0aW9ucwovLyAieW91IGNhbiBleHByZXNzIGN1Ymlj IEhlcm1pdGUgaW50ZXJwb2xhdGlvbiBpbiB0ZXJtcyBvZiBjdWJpYyBCw6l6aWVyIGN1cnZlcwov LyB3aXRoIHJlc3BlY3QgdG8gdGhlIGZvdXIgdmFsdWVzIHAwLCBwMCArIG0wIC8gMywgcDEgLSBt MSAvIDMsIHAxIi4KZnVuY3Rpb24gcG9pbnQkNSh0aGF0LCB0MCwgdDEpIHsKICB2YXIgeDAgPSB0 aGF0Ll94MCwKICAgICAgeTAgPSB0aGF0Ll95MCwKICAgICAgeDEgPSB0aGF0Ll94MSwKICAgICAg eTEgPSB0aGF0Ll95MSwKICAgICAgZHggPSAoeDEgLSB4MCkgLyAzOwogIHRoYXQuX2NvbnRleHQu YmV6aWVyQ3VydmVUbyh4MCArIGR4LCB5MCArIGR4ICogdDAsIHgxIC0gZHgsIHkxIC0gZHggKiB0 MSwgeDEsIHkxKTsKfQoKZnVuY3Rpb24gTW9ub3RvbmVYKGNvbnRleHQpIHsKICB0aGlzLl9jb250 ZXh0ID0gY29udGV4dDsKfQoKTW9ub3RvbmVYLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6IGZ1 bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IDA7CiAgfSwKICBhcmVhRW5kOiBmdW5jdGlvbigp IHsKICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgfSwKICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewog ICAgdGhpcy5feDAgPSB0aGlzLl94MSA9CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0KICAgIHRo aXMuX3QwID0gTmFOOwogICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGluZUVuZDogZnVuY3Rp b24oKSB7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMjogdGhpcy5fY29u dGV4dC5saW5lVG8odGhpcy5feDEsIHRoaXMuX3kxKTsgYnJlYWs7CiAgICAgIGNhc2UgMzogcG9p bnQkNSh0aGlzLCB0aGlzLl90MCwgc2xvcGUyKHRoaXMsIHRoaXMuX3QwKSk7IGJyZWFrOwogICAg fQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQg PT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgdGhpcy5fbGluZSA9IDEgLSB0 aGlzLl9saW5lOwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHZhciB0MSA9IE5h TjsKCiAgICB4ID0gK3gsIHkgPSAreTsKICAgIGlmICh4ID09PSB0aGlzLl94MSAmJiB5ID09PSB0 aGlzLl95MSkgcmV0dXJuOyAvLyBJZ25vcmUgY29pbmNpZGVudCBwb2ludHMuCiAgICBzd2l0Y2gg KHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5l ID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5 KTsgYnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhazsKICAgICAgY2Fz ZSAyOiB0aGlzLl9wb2ludCA9IDM7IHBvaW50JDUodGhpcywgc2xvcGUyKHRoaXMsIHQxID0gc2xv cGUzKHRoaXMsIHgsIHkpKSwgdDEpOyBicmVhazsKICAgICAgZGVmYXVsdDogcG9pbnQkNSh0aGlz LCB0aGlzLl90MCwgdDEgPSBzbG9wZTModGhpcywgeCwgeSkpOyBicmVhazsKICAgIH0KCiAgICB0 aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7CiAgICB0aGlzLl95MCA9IHRoaXMuX3kx LCB0aGlzLl95MSA9IHk7CiAgICB0aGlzLl90MCA9IHQxOwogIH0KfTsKCmZ1bmN0aW9uIE1vbm90 b25lWShjb250ZXh0KSB7CiAgdGhpcy5fY29udGV4dCA9IG5ldyBSZWZsZWN0Q29udGV4dChjb250 ZXh0KTsKfQoKKE1vbm90b25lWS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE1vbm90b25lWC5w cm90b3R5cGUpKS5wb2ludCA9IGZ1bmN0aW9uKHgsIHkpIHsKICBNb25vdG9uZVgucHJvdG90eXBl LnBvaW50LmNhbGwodGhpcywgeSwgeCk7Cn07CgpmdW5jdGlvbiBSZWZsZWN0Q29udGV4dChjb250 ZXh0KSB7CiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7Cn0KClJlZmxlY3RDb250ZXh0LnByb3Rv dHlwZSA9IHsKICBtb3ZlVG86IGZ1bmN0aW9uKHgsIHkpIHsgdGhpcy5fY29udGV4dC5tb3ZlVG8o eSwgeCk7IH0sCiAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHsgdGhpcy5fY29udGV4dC5jbG9zZVBh dGgoKTsgfSwKICBsaW5lVG86IGZ1bmN0aW9uKHgsIHkpIHsgdGhpcy5fY29udGV4dC5saW5lVG8o eSwgeCk7IH0sCiAgYmV6aWVyQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgsIHkp IHsgdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHkxLCB4MSwgeTIsIHgyLCB5LCB4KTsgfQp9 OwoKZnVuY3Rpb24gbW9ub3RvbmVYKGNvbnRleHQpIHsKICByZXR1cm4gbmV3IE1vbm90b25lWChj b250ZXh0KTsKfQoKZnVuY3Rpb24gbW9ub3RvbmVZKGNvbnRleHQpIHsKICByZXR1cm4gbmV3IE1v bm90b25lWShjb250ZXh0KTsKfQoKZnVuY3Rpb24gTmF0dXJhbChjb250ZXh0KSB7CiAgdGhpcy5f Y29udGV4dCA9IGNvbnRleHQ7Cn0KCk5hdHVyYWwucHJvdG90eXBlID0gewogIGFyZWFTdGFydDog ZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9u KCkgewogICAgdGhpcy5fbGluZSA9IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7 CiAgICB0aGlzLl94ID0gW107CiAgICB0aGlzLl95ID0gW107CiAgfSwKICBsaW5lRW5kOiBmdW5j dGlvbigpIHsKICAgIHZhciB4ID0gdGhpcy5feCwKICAgICAgICB5ID0gdGhpcy5feSwKICAgICAg ICBuID0geC5sZW5ndGg7CgogICAgaWYgKG4pIHsKICAgICAgdGhpcy5fbGluZSA/IHRoaXMuX2Nv bnRleHQubGluZVRvKHhbMF0sIHlbMF0pIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeFswXSwgeVsw XSk7CiAgICAgIGlmIChuID09PSAyKSB7CiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeFsx XSwgeVsxXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHB4ID0gY29udHJvbFBvaW50cyh4 KSwKICAgICAgICAgICAgcHkgPSBjb250cm9sUG9pbnRzKHkpOwogICAgICAgIGZvciAodmFyIGkw ID0gMCwgaTEgPSAxOyBpMSA8IG47ICsraTAsICsraTEpIHsKICAgICAgICAgIHRoaXMuX2NvbnRl eHQuYmV6aWVyQ3VydmVUbyhweFswXVtpMF0sIHB5WzBdW2kwXSwgcHhbMV1baTBdLCBweVsxXVtp MF0sIHhbaTFdLCB5W2kxXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKHRoaXMu X2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgbiA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xv c2VQYXRoKCk7CiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgICB0aGlzLl94ID0g dGhpcy5feSA9IG51bGw7CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgdGhpcy5f eC5wdXNoKCt4KTsKICAgIHRoaXMuX3kucHVzaCgreSk7CiAgfQp9OwoKLy8gU2VlIGh0dHBzOi8v d3d3LnBhcnRpY2xlaW5jZWxsLmNvbS8yMDEyL2Jlemllci1zcGxpbmVzLyBmb3IgZGVyaXZhdGlv bi4KZnVuY3Rpb24gY29udHJvbFBvaW50cyh4KSB7CiAgdmFyIGksCiAgICAgIG4gPSB4Lmxlbmd0 aCAtIDEsCiAgICAgIG0sCiAgICAgIGEgPSBuZXcgQXJyYXkobiksCiAgICAgIGIgPSBuZXcgQXJy YXkobiksCiAgICAgIHIgPSBuZXcgQXJyYXkobik7CiAgYVswXSA9IDAsIGJbMF0gPSAyLCByWzBd ID0geFswXSArIDIgKiB4WzFdOwogIGZvciAoaSA9IDE7IGkgPCBuIC0gMTsgKytpKSBhW2ldID0g MSwgYltpXSA9IDQsIHJbaV0gPSA0ICogeFtpXSArIDIgKiB4W2kgKyAxXTsKICBhW24gLSAxXSA9 IDIsIGJbbiAtIDFdID0gNywgcltuIC0gMV0gPSA4ICogeFtuIC0gMV0gKyB4W25dOwogIGZvciAo aSA9IDE7IGkgPCBuOyArK2kpIG0gPSBhW2ldIC8gYltpIC0gMV0sIGJbaV0gLT0gbSwgcltpXSAt PSBtICogcltpIC0gMV07CiAgYVtuIC0gMV0gPSByW24gLSAxXSAvIGJbbiAtIDFdOwogIGZvciAo aSA9IG4gLSAyOyBpID49IDA7IC0taSkgYVtpXSA9IChyW2ldIC0gYVtpICsgMV0pIC8gYltpXTsK ICBiW24gLSAxXSA9ICh4W25dICsgYVtuIC0gMV0pIC8gMjsKICBmb3IgKGkgPSAwOyBpIDwgbiAt IDE7ICsraSkgYltpXSA9IDIgKiB4W2kgKyAxXSAtIGFbaSArIDFdOwogIHJldHVybiBbYSwgYl07 Cn0KCmZ1bmN0aW9uIG5hdHVyYWwoY29udGV4dCkgewogIHJldHVybiBuZXcgTmF0dXJhbChjb250 ZXh0KTsKfQoKZnVuY3Rpb24gU3RlcChjb250ZXh0LCB0KSB7CiAgdGhpcy5fY29udGV4dCA9IGNv bnRleHQ7CiAgdGhpcy5fdCA9IHQ7Cn0KClN0ZXAucHJvdG90eXBlID0gewogIGFyZWFTdGFydDog ZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9u KCkgewogICAgdGhpcy5fbGluZSA9IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7 CiAgICB0aGlzLl94ID0gdGhpcy5feSA9IE5hTjsKICAgIHRoaXMuX3BvaW50ID0gMDsKICB9LAog IGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKDAgPCB0aGlzLl90ICYmIHRoaXMuX3QgPCAx ICYmIHRoaXMuX3BvaW50ID09PSAyKSB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LCB0aGlz Ll95KTsKICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3Bv aW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIGlmICh0aGlzLl9saW5l ID49IDApIHRoaXMuX3QgPSAxIC0gdGhpcy5fdCwgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5l OwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHggPSAreCwgeSA9ICt5OwogICAg c3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhp cy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3Zl VG8oeCwgeSk7IGJyZWFrOwogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgLy8gcHJvY2Vl ZAogICAgICBkZWZhdWx0OiB7CiAgICAgICAgaWYgKHRoaXMuX3QgPD0gMCkgewogICAgICAgICAg dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCwgeSk7CiAgICAgICAgICB0aGlzLl9jb250ZXh0 LmxpbmVUbyh4LCB5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHgxID0gdGhpcy5f eCAqICgxIC0gdGhpcy5fdCkgKyB4ICogdGhpcy5fdDsKICAgICAgICAgIHRoaXMuX2NvbnRleHQu bGluZVRvKHgxLCB0aGlzLl95KTsKICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgxLCB5 KTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuX3ggPSB4 LCB0aGlzLl95ID0geTsKICB9Cn07CgpmdW5jdGlvbiBzdGVwKGNvbnRleHQpIHsKICByZXR1cm4g bmV3IFN0ZXAoY29udGV4dCwgMC41KTsKfQoKZnVuY3Rpb24gc3RlcEJlZm9yZShjb250ZXh0KSB7 CiAgcmV0dXJuIG5ldyBTdGVwKGNvbnRleHQsIDApOwp9CgpmdW5jdGlvbiBzdGVwQWZ0ZXIoY29u dGV4dCkgewogIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAxKTsKfQoKZnVuY3Rpb24gbm9uZSQx KHNlcmllcywgb3JkZXIpIHsKICBpZiAoISgobiA9IHNlcmllcy5sZW5ndGgpID4gMSkpIHJldHVy bjsKICBmb3IgKHZhciBpID0gMSwgaiwgczAsIHMxID0gc2VyaWVzW29yZGVyWzBdXSwgbiwgbSA9 IHMxLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgczAgPSBzMSwgczEgPSBzZXJpZXNbb3JkZXJb aV1dOwogICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewogICAgICBzMVtqXVsxXSArPSBzMVtq XVswXSA9IGlzTmFOKHMwW2pdWzFdKSA/IHMwW2pdWzBdIDogczBbal1bMV07CiAgICB9CiAgfQp9 CgpmdW5jdGlvbiBub25lJDIoc2VyaWVzKSB7CiAgdmFyIG4gPSBzZXJpZXMubGVuZ3RoLCBvID0g bmV3IEFycmF5KG4pOwogIHdoaWxlICgtLW4gPj0gMCkgb1tuXSA9IG47CiAgcmV0dXJuIG87Cn0K CmZ1bmN0aW9uIHN0YWNrVmFsdWUoZCwga2V5KSB7CiAgcmV0dXJuIGRba2V5XTsKfQoKZnVuY3Rp b24gc3RhY2soKSB7CiAgdmFyIGtleXMgPSBjb25zdGFudCRiKFtdKSwKICAgICAgb3JkZXIgPSBu b25lJDIsCiAgICAgIG9mZnNldCA9IG5vbmUkMSwKICAgICAgdmFsdWUgPSBzdGFja1ZhbHVlOwoK ICBmdW5jdGlvbiBzdGFjayhkYXRhKSB7CiAgICB2YXIga3ogPSBrZXlzLmFwcGx5KHRoaXMsIGFy Z3VtZW50cyksCiAgICAgICAgaSwKICAgICAgICBtID0gZGF0YS5sZW5ndGgsCiAgICAgICAgbiA9 IGt6Lmxlbmd0aCwKICAgICAgICBzeiA9IG5ldyBBcnJheShuKSwKICAgICAgICBvejsKCiAgICBm b3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGZvciAodmFyIGtpID0ga3pbaV0sIHNpID0g c3pbaV0gPSBuZXcgQXJyYXkobSksIGogPSAwLCBzaWo7IGogPCBtOyArK2opIHsKICAgICAgICBz aVtqXSA9IHNpaiA9IFswLCArdmFsdWUoZGF0YVtqXSwga2ksIGosIGRhdGEpXTsKICAgICAgICBz aWouZGF0YSA9IGRhdGFbal07CiAgICAgIH0KICAgICAgc2kua2V5ID0ga2k7CiAgICB9CgogICAg Zm9yIChpID0gMCwgb3ogPSBvcmRlcihzeik7IGkgPCBuOyArK2kpIHsKICAgICAgc3pbb3pbaV1d LmluZGV4ID0gaTsKICAgIH0KCiAgICBvZmZzZXQoc3osIG96KTsKICAgIHJldHVybiBzejsKICB9 CgogIHN0YWNrLmtleXMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/IChrZXlzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYihzbGlj ZSQ2LmNhbGwoXykpLCBzdGFjaykgOiBrZXlzOwogIH07CgogIHN0YWNrLnZhbHVlID0gZnVuY3Rp b24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9 PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgc3RhY2spIDogdmFsdWU7CiAgfTsK CiAgc3RhY2sub3JkZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/IChvcmRlciA9IF8gPT0gbnVsbCA/IG5vbmUkMiA6IHR5cGVvZiBfID09PSAiZnVuY3Rpb24i ID8gXyA6IGNvbnN0YW50JGIoc2xpY2UkNi5jYWxsKF8pKSwgc3RhY2spIDogb3JkZXI7CiAgfTsK CiAgc3RhY2sub2Zmc2V0ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5n dGggPyAob2Zmc2V0ID0gXyA9PSBudWxsID8gbm9uZSQxIDogXywgc3RhY2spIDogb2Zmc2V0Owog IH07CgogIHJldHVybiBzdGFjazsKfQoKZnVuY3Rpb24gZXhwYW5kKHNlcmllcywgb3JkZXIpIHsK ICBpZiAoISgobiA9IHNlcmllcy5sZW5ndGgpID4gMCkpIHJldHVybjsKICBmb3IgKHZhciBpLCBu LCBqID0gMCwgbSA9IHNlcmllc1swXS5sZW5ndGgsIHk7IGogPCBtOyArK2opIHsKICAgIGZvciAo eSA9IGkgPSAwOyBpIDwgbjsgKytpKSB5ICs9IHNlcmllc1tpXVtqXVsxXSB8fCAwOwogICAgaWYg KHkpIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHNlcmllc1tpXVtqXVsxXSAvPSB5OwogIH0KICBu b25lJDEoc2VyaWVzLCBvcmRlcik7Cn0KCmZ1bmN0aW9uIGRpdmVyZ2luZyQxKHNlcmllcywgb3Jk ZXIpIHsKICBpZiAoISgobiA9IHNlcmllcy5sZW5ndGgpID4gMCkpIHJldHVybjsKICBmb3IgKHZh ciBpLCBqID0gMCwgZCwgZHksIHlwLCB5biwgbiwgbSA9IHNlcmllc1tvcmRlclswXV0ubGVuZ3Ro OyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHlwID0geW4gPSAwLCBpID0gMDsgaSA8IG47ICsraSkg ewogICAgICBpZiAoKGR5ID0gKGQgPSBzZXJpZXNbb3JkZXJbaV1dW2pdKVsxXSAtIGRbMF0pID4g MCkgewogICAgICAgIGRbMF0gPSB5cCwgZFsxXSA9IHlwICs9IGR5OwogICAgICB9IGVsc2UgaWYg KGR5IDwgMCkgewogICAgICAgIGRbMV0gPSB5biwgZFswXSA9IHluICs9IGR5OwogICAgICB9IGVs c2UgewogICAgICAgIGRbMF0gPSAwLCBkWzFdID0gZHk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1 bmN0aW9uIHNpbGhvdWV0dGUoc2VyaWVzLCBvcmRlcikgewogIGlmICghKChuID0gc2VyaWVzLmxl bmd0aCkgPiAwKSkgcmV0dXJuOwogIGZvciAodmFyIGogPSAwLCBzMCA9IHNlcmllc1tvcmRlclsw XV0sIG4sIG0gPSBzMC5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGkgPSAwLCB5 ID0gMDsgaSA8IG47ICsraSkgeSArPSBzZXJpZXNbaV1bal1bMV0gfHwgMDsKICAgIHMwW2pdWzFd ICs9IHMwW2pdWzBdID0gLXkgLyAyOwogIH0KICBub25lJDEoc2VyaWVzLCBvcmRlcik7Cn0KCmZ1 bmN0aW9uIHdpZ2dsZShzZXJpZXMsIG9yZGVyKSB7CiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3Ro KSA+IDApIHx8ICEoKG0gPSAoczAgPSBzZXJpZXNbb3JkZXJbMF1dKS5sZW5ndGgpID4gMCkpIHJl dHVybjsKICBmb3IgKHZhciB5ID0gMCwgaiA9IDEsIHMwLCBtLCBuOyBqIDwgbTsgKytqKSB7CiAg ICBmb3IgKHZhciBpID0gMCwgczEgPSAwLCBzMiA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgdmFy IHNpID0gc2VyaWVzW29yZGVyW2ldXSwKICAgICAgICAgIHNpajAgPSBzaVtqXVsxXSB8fCAwLAog ICAgICAgICAgc2lqMSA9IHNpW2ogLSAxXVsxXSB8fCAwLAogICAgICAgICAgczMgPSAoc2lqMCAt IHNpajEpIC8gMjsKICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBpOyArK2spIHsKICAgICAgICB2 YXIgc2sgPSBzZXJpZXNbb3JkZXJba11dLAogICAgICAgICAgICBza2owID0gc2tbal1bMV0gfHwg MCwKICAgICAgICAgICAgc2tqMSA9IHNrW2ogLSAxXVsxXSB8fCAwOwogICAgICAgIHMzICs9IHNr ajAgLSBza2oxOwogICAgICB9CiAgICAgIHMxICs9IHNpajAsIHMyICs9IHMzICogc2lqMDsKICAg IH0KICAgIHMwW2ogLSAxXVsxXSArPSBzMFtqIC0gMV1bMF0gPSB5OwogICAgaWYgKHMxKSB5IC09 IHMyIC8gczE7CiAgfQogIHMwW2ogLSAxXVsxXSArPSBzMFtqIC0gMV1bMF0gPSB5OwogIG5vbmUk MShzZXJpZXMsIG9yZGVyKTsKfQoKZnVuY3Rpb24gYXBwZWFyYW5jZShzZXJpZXMpIHsKICB2YXIg cGVha3MgPSBzZXJpZXMubWFwKHBlYWspOwogIHJldHVybiBub25lJDIoc2VyaWVzKS5zb3J0KGZ1 bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHBlYWtzW2FdIC0gcGVha3NbYl07IH0pOwp9CgpmdW5jdGlv biBwZWFrKHNlcmllcykgewogIHZhciBpID0gLTEsIGogPSAwLCBuID0gc2VyaWVzLmxlbmd0aCwg dmksIHZqID0gLUluZmluaXR5OwogIHdoaWxlICgrK2kgPCBuKSBpZiAoKHZpID0gK3Nlcmllc1tp XVsxXSkgPiB2aikgdmogPSB2aSwgaiA9IGk7CiAgcmV0dXJuIGo7Cn0KCmZ1bmN0aW9uIGFzY2Vu ZGluZyQzKHNlcmllcykgewogIHZhciBzdW1zID0gc2VyaWVzLm1hcChzdW0kMik7CiAgcmV0dXJu IG5vbmUkMihzZXJpZXMpLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gc3Vtc1thXSAtIHN1 bXNbYl07IH0pOwp9CgpmdW5jdGlvbiBzdW0kMihzZXJpZXMpIHsKICB2YXIgcyA9IDAsIGkgPSAt MSwgbiA9IHNlcmllcy5sZW5ndGgsIHY7CiAgd2hpbGUgKCsraSA8IG4pIGlmICh2ID0gK3Nlcmll c1tpXVsxXSkgcyArPSB2OwogIHJldHVybiBzOwp9CgpmdW5jdGlvbiBkZXNjZW5kaW5nJDIoc2Vy aWVzKSB7CiAgcmV0dXJuIGFzY2VuZGluZyQzKHNlcmllcykucmV2ZXJzZSgpOwp9CgpmdW5jdGlv biBpbnNpZGVPdXQoc2VyaWVzKSB7CiAgdmFyIG4gPSBzZXJpZXMubGVuZ3RoLAogICAgICBpLAog ICAgICBqLAogICAgICBzdW1zID0gc2VyaWVzLm1hcChzdW0kMiksCiAgICAgIG9yZGVyID0gYXBw ZWFyYW5jZShzZXJpZXMpLAogICAgICB0b3AgPSAwLAogICAgICBib3R0b20gPSAwLAogICAgICB0 b3BzID0gW10sCiAgICAgIGJvdHRvbXMgPSBbXTsKCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkg ewogICAgaiA9IG9yZGVyW2ldOwogICAgaWYgKHRvcCA8IGJvdHRvbSkgewogICAgICB0b3AgKz0g c3Vtc1tqXTsKICAgICAgdG9wcy5wdXNoKGopOwogICAgfSBlbHNlIHsKICAgICAgYm90dG9tICs9 IHN1bXNbal07CiAgICAgIGJvdHRvbXMucHVzaChqKTsKICAgIH0KICB9CgogIHJldHVybiBib3R0 b21zLnJldmVyc2UoKS5jb25jYXQodG9wcyk7Cn0KCmZ1bmN0aW9uIHJldmVyc2Uoc2VyaWVzKSB7 CiAgcmV0dXJuIG5vbmUkMihzZXJpZXMpLnJldmVyc2UoKTsKfQoKZnVuY3Rpb24gY29uc3RhbnQk Yyh4KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHg7CiAgfTsKfQoKZnVuY3Rp b24geCQ0KGQpIHsKICByZXR1cm4gZFswXTsKfQoKZnVuY3Rpb24geSQ0KGQpIHsKICByZXR1cm4g ZFsxXTsKfQoKZnVuY3Rpb24gUmVkQmxhY2tUcmVlKCkgewogIHRoaXMuXyA9IG51bGw7IC8vIHJv b3Qgbm9kZQp9CgpmdW5jdGlvbiBSZWRCbGFja05vZGUobm9kZSkgewogIG5vZGUuVSA9IC8vIHBh cmVudCBub2RlCiAgbm9kZS5DID0gLy8gY29sb3IgLSB0cnVlIGZvciByZWQsIGZhbHNlIGZvciBi bGFjawogIG5vZGUuTCA9IC8vIGxlZnQgbm9kZQogIG5vZGUuUiA9IC8vIHJpZ2h0IG5vZGUKICBu b2RlLlAgPSAvLyBwcmV2aW91cyBub2RlCiAgbm9kZS5OID0gbnVsbDsgLy8gbmV4dCBub2RlCn0K ClJlZEJsYWNrVHJlZS5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IFJlZEJsYWNrVHJlZSwK CiAgaW5zZXJ0OiBmdW5jdGlvbihhZnRlciwgbm9kZSkgewogICAgdmFyIHBhcmVudCwgZ3JhbmRw YSwgdW5jbGU7CgogICAgaWYgKGFmdGVyKSB7CiAgICAgIG5vZGUuUCA9IGFmdGVyOwogICAgICBu b2RlLk4gPSBhZnRlci5OOwogICAgICBpZiAoYWZ0ZXIuTikgYWZ0ZXIuTi5QID0gbm9kZTsKICAg ICAgYWZ0ZXIuTiA9IG5vZGU7CiAgICAgIGlmIChhZnRlci5SKSB7CiAgICAgICAgYWZ0ZXIgPSBh ZnRlci5SOwogICAgICAgIHdoaWxlIChhZnRlci5MKSBhZnRlciA9IGFmdGVyLkw7CiAgICAgICAg YWZ0ZXIuTCA9IG5vZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWZ0ZXIuUiA9IG5vZGU7CiAg ICAgIH0KICAgICAgcGFyZW50ID0gYWZ0ZXI7CiAgICB9IGVsc2UgaWYgKHRoaXMuXykgewogICAg ICBhZnRlciA9IFJlZEJsYWNrRmlyc3QodGhpcy5fKTsKICAgICAgbm9kZS5QID0gbnVsbDsKICAg ICAgbm9kZS5OID0gYWZ0ZXI7CiAgICAgIGFmdGVyLlAgPSBhZnRlci5MID0gbm9kZTsKICAgICAg cGFyZW50ID0gYWZ0ZXI7CiAgICB9IGVsc2UgewogICAgICBub2RlLlAgPSBub2RlLk4gPSBudWxs OwogICAgICB0aGlzLl8gPSBub2RlOwogICAgICBwYXJlbnQgPSBudWxsOwogICAgfQogICAgbm9k ZS5MID0gbm9kZS5SID0gbnVsbDsKICAgIG5vZGUuVSA9IHBhcmVudDsKICAgIG5vZGUuQyA9IHRy dWU7CgogICAgYWZ0ZXIgPSBub2RlOwogICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuQykgewog ICAgICBncmFuZHBhID0gcGFyZW50LlU7CiAgICAgIGlmIChwYXJlbnQgPT09IGdyYW5kcGEuTCkg ewogICAgICAgIHVuY2xlID0gZ3JhbmRwYS5SOwogICAgICAgIGlmICh1bmNsZSAmJiB1bmNsZS5D KSB7CiAgICAgICAgICBwYXJlbnQuQyA9IHVuY2xlLkMgPSBmYWxzZTsKICAgICAgICAgIGdyYW5k cGEuQyA9IHRydWU7CiAgICAgICAgICBhZnRlciA9IGdyYW5kcGE7CiAgICAgICAgfSBlbHNlIHsK ICAgICAgICAgIGlmIChhZnRlciA9PT0gcGFyZW50LlIpIHsKICAgICAgICAgICAgUmVkQmxhY2tS b3RhdGVMZWZ0KHRoaXMsIHBhcmVudCk7CiAgICAgICAgICAgIGFmdGVyID0gcGFyZW50OwogICAg ICAgICAgICBwYXJlbnQgPSBhZnRlci5VOwogICAgICAgICAgfQogICAgICAgICAgcGFyZW50LkMg PSBmYWxzZTsKICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7CiAgICAgICAgICBSZWRCbGFja1Jv dGF0ZVJpZ2h0KHRoaXMsIGdyYW5kcGEpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAg ICB1bmNsZSA9IGdyYW5kcGEuTDsKICAgICAgICBpZiAodW5jbGUgJiYgdW5jbGUuQykgewogICAg ICAgICAgcGFyZW50LkMgPSB1bmNsZS5DID0gZmFsc2U7CiAgICAgICAgICBncmFuZHBhLkMgPSB0 cnVlOwogICAgICAgICAgYWZ0ZXIgPSBncmFuZHBhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAg ICBpZiAoYWZ0ZXIgPT09IHBhcmVudC5MKSB7CiAgICAgICAgICAgIFJlZEJsYWNrUm90YXRlUmln aHQodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgYWZ0ZXIgPSBwYXJlbnQ7CiAgICAgICAgICAg IHBhcmVudCA9IGFmdGVyLlU7CiAgICAgICAgICB9CiAgICAgICAgICBwYXJlbnQuQyA9IGZhbHNl OwogICAgICAgICAgZ3JhbmRwYS5DID0gdHJ1ZTsKICAgICAgICAgIFJlZEJsYWNrUm90YXRlTGVm dCh0aGlzLCBncmFuZHBhKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcGFyZW50ID0gYWZ0ZXIu VTsKICAgIH0KICAgIHRoaXMuXy5DID0gZmFsc2U7CiAgfSwKCiAgcmVtb3ZlOiBmdW5jdGlvbihu b2RlKSB7CiAgICBpZiAobm9kZS5OKSBub2RlLk4uUCA9IG5vZGUuUDsKICAgIGlmIChub2RlLlAp IG5vZGUuUC5OID0gbm9kZS5OOwogICAgbm9kZS5OID0gbm9kZS5QID0gbnVsbDsKCiAgICB2YXIg cGFyZW50ID0gbm9kZS5VLAogICAgICAgIHNpYmxpbmcsCiAgICAgICAgbGVmdCA9IG5vZGUuTCwK ICAgICAgICByaWdodCA9IG5vZGUuUiwKICAgICAgICBuZXh0LAogICAgICAgIHJlZDsKCiAgICBp ZiAoIWxlZnQpIG5leHQgPSByaWdodDsKICAgIGVsc2UgaWYgKCFyaWdodCkgbmV4dCA9IGxlZnQ7 CiAgICBlbHNlIG5leHQgPSBSZWRCbGFja0ZpcnN0KHJpZ2h0KTsKCiAgICBpZiAocGFyZW50KSB7 CiAgICAgIGlmIChwYXJlbnQuTCA9PT0gbm9kZSkgcGFyZW50LkwgPSBuZXh0OwogICAgICBlbHNl IHBhcmVudC5SID0gbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuXyA9IG5leHQ7CiAgICB9 CgogICAgaWYgKGxlZnQgJiYgcmlnaHQpIHsKICAgICAgcmVkID0gbmV4dC5DOwogICAgICBuZXh0 LkMgPSBub2RlLkM7CiAgICAgIG5leHQuTCA9IGxlZnQ7CiAgICAgIGxlZnQuVSA9IG5leHQ7CiAg ICAgIGlmIChuZXh0ICE9PSByaWdodCkgewogICAgICAgIHBhcmVudCA9IG5leHQuVTsKICAgICAg ICBuZXh0LlUgPSBub2RlLlU7CiAgICAgICAgbm9kZSA9IG5leHQuUjsKICAgICAgICBwYXJlbnQu TCA9IG5vZGU7CiAgICAgICAgbmV4dC5SID0gcmlnaHQ7CiAgICAgICAgcmlnaHQuVSA9IG5leHQ7 CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV4dC5VID0gcGFyZW50OwogICAgICAgIHBhcmVudCA9 IG5leHQ7CiAgICAgICAgbm9kZSA9IG5leHQuUjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAg cmVkID0gbm9kZS5DOwogICAgICBub2RlID0gbmV4dDsKICAgIH0KCiAgICBpZiAobm9kZSkgbm9k ZS5VID0gcGFyZW50OwogICAgaWYgKHJlZCkgcmV0dXJuOwogICAgaWYgKG5vZGUgJiYgbm9kZS5D KSB7IG5vZGUuQyA9IGZhbHNlOyByZXR1cm47IH0KCiAgICBkbyB7CiAgICAgIGlmIChub2RlID09 PSB0aGlzLl8pIGJyZWFrOwogICAgICBpZiAobm9kZSA9PT0gcGFyZW50LkwpIHsKICAgICAgICBz aWJsaW5nID0gcGFyZW50LlI7CiAgICAgICAgaWYgKHNpYmxpbmcuQykgewogICAgICAgICAgc2li bGluZy5DID0gZmFsc2U7CiAgICAgICAgICBwYXJlbnQuQyA9IHRydWU7CiAgICAgICAgICBSZWRC bGFja1JvdGF0ZUxlZnQodGhpcywgcGFyZW50KTsKICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQu UjsKICAgICAgICB9CiAgICAgICAgaWYgKChzaWJsaW5nLkwgJiYgc2libGluZy5MLkMpCiAgICAg ICAgICAgIHx8IChzaWJsaW5nLlIgJiYgc2libGluZy5SLkMpKSB7CiAgICAgICAgICBpZiAoIXNp YmxpbmcuUiB8fCAhc2libGluZy5SLkMpIHsKICAgICAgICAgICAgc2libGluZy5MLkMgPSBmYWxz ZTsKICAgICAgICAgICAgc2libGluZy5DID0gdHJ1ZTsKICAgICAgICAgICAgUmVkQmxhY2tSb3Rh dGVSaWdodCh0aGlzLCBzaWJsaW5nKTsKICAgICAgICAgICAgc2libGluZyA9IHBhcmVudC5SOwog ICAgICAgICAgfQogICAgICAgICAgc2libGluZy5DID0gcGFyZW50LkM7CiAgICAgICAgICBwYXJl bnQuQyA9IHNpYmxpbmcuUi5DID0gZmFsc2U7CiAgICAgICAgICBSZWRCbGFja1JvdGF0ZUxlZnQo dGhpcywgcGFyZW50KTsKICAgICAgICAgIG5vZGUgPSB0aGlzLl87CiAgICAgICAgICBicmVhazsK ICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2libGluZyA9IHBhcmVudC5MOwogICAg ICAgIGlmIChzaWJsaW5nLkMpIHsKICAgICAgICAgIHNpYmxpbmcuQyA9IGZhbHNlOwogICAgICAg ICAgcGFyZW50LkMgPSB0cnVlOwogICAgICAgICAgUmVkQmxhY2tSb3RhdGVSaWdodCh0aGlzLCBw YXJlbnQpOwogICAgICAgICAgc2libGluZyA9IHBhcmVudC5MOwogICAgICAgIH0KICAgICAgICBp ZiAoKHNpYmxpbmcuTCAmJiBzaWJsaW5nLkwuQykKICAgICAgICAgIHx8IChzaWJsaW5nLlIgJiYg c2libGluZy5SLkMpKSB7CiAgICAgICAgICBpZiAoIXNpYmxpbmcuTCB8fCAhc2libGluZy5MLkMp IHsKICAgICAgICAgICAgc2libGluZy5SLkMgPSBmYWxzZTsKICAgICAgICAgICAgc2libGluZy5D ID0gdHJ1ZTsKICAgICAgICAgICAgUmVkQmxhY2tSb3RhdGVMZWZ0KHRoaXMsIHNpYmxpbmcpOwog ICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50Lkw7CiAgICAgICAgICB9CiAgICAgICAgICBzaWJs aW5nLkMgPSBwYXJlbnQuQzsKICAgICAgICAgIHBhcmVudC5DID0gc2libGluZy5MLkMgPSBmYWxz ZTsKICAgICAgICAgIFJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTsKICAgICAgICAg IG5vZGUgPSB0aGlzLl87CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAg c2libGluZy5DID0gdHJ1ZTsKICAgICAgbm9kZSA9IHBhcmVudDsKICAgICAgcGFyZW50ID0gcGFy ZW50LlU7CiAgICB9IHdoaWxlICghbm9kZS5DKTsKCiAgICBpZiAobm9kZSkgbm9kZS5DID0gZmFs c2U7CiAgfQp9OwoKZnVuY3Rpb24gUmVkQmxhY2tSb3RhdGVMZWZ0KHRyZWUsIG5vZGUpIHsKICB2 YXIgcCA9IG5vZGUsCiAgICAgIHEgPSBub2RlLlIsCiAgICAgIHBhcmVudCA9IHAuVTsKCiAgaWYg KHBhcmVudCkgewogICAgaWYgKHBhcmVudC5MID09PSBwKSBwYXJlbnQuTCA9IHE7CiAgICBlbHNl IHBhcmVudC5SID0gcTsKICB9IGVsc2UgewogICAgdHJlZS5fID0gcTsKICB9CgogIHEuVSA9IHBh cmVudDsKICBwLlUgPSBxOwogIHAuUiA9IHEuTDsKICBpZiAocC5SKSBwLlIuVSA9IHA7CiAgcS5M ID0gcDsKfQoKZnVuY3Rpb24gUmVkQmxhY2tSb3RhdGVSaWdodCh0cmVlLCBub2RlKSB7CiAgdmFy IHAgPSBub2RlLAogICAgICBxID0gbm9kZS5MLAogICAgICBwYXJlbnQgPSBwLlU7CgogIGlmIChw YXJlbnQpIHsKICAgIGlmIChwYXJlbnQuTCA9PT0gcCkgcGFyZW50LkwgPSBxOwogICAgZWxzZSBw YXJlbnQuUiA9IHE7CiAgfSBlbHNlIHsKICAgIHRyZWUuXyA9IHE7CiAgfQoKICBxLlUgPSBwYXJl bnQ7CiAgcC5VID0gcTsKICBwLkwgPSBxLlI7CiAgaWYgKHAuTCkgcC5MLlUgPSBwOwogIHEuUiA9 IHA7Cn0KCmZ1bmN0aW9uIFJlZEJsYWNrRmlyc3Qobm9kZSkgewogIHdoaWxlIChub2RlLkwpIG5v ZGUgPSBub2RlLkw7CiAgcmV0dXJuIG5vZGU7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUVkZ2UobGVmdCwg cmlnaHQsIHYwLCB2MSkgewogIHZhciBlZGdlID0gW251bGwsIG51bGxdLAogICAgICBpbmRleCA9 IGVkZ2VzLnB1c2goZWRnZSkgLSAxOwogIGVkZ2UubGVmdCA9IGxlZnQ7CiAgZWRnZS5yaWdodCA9 IHJpZ2h0OwogIGlmICh2MCkgc2V0RWRnZUVuZChlZGdlLCBsZWZ0LCByaWdodCwgdjApOwogIGlm ICh2MSkgc2V0RWRnZUVuZChlZGdlLCByaWdodCwgbGVmdCwgdjEpOwogIGNlbGxzW2xlZnQuaW5k ZXhdLmhhbGZlZGdlcy5wdXNoKGluZGV4KTsKICBjZWxsc1tyaWdodC5pbmRleF0uaGFsZmVkZ2Vz LnB1c2goaW5kZXgpOwogIHJldHVybiBlZGdlOwp9CgpmdW5jdGlvbiBjcmVhdGVCb3JkZXJFZGdl KGxlZnQsIHYwLCB2MSkgewogIHZhciBlZGdlID0gW3YwLCB2MV07CiAgZWRnZS5sZWZ0ID0gbGVm dDsKICByZXR1cm4gZWRnZTsKfQoKZnVuY3Rpb24gc2V0RWRnZUVuZChlZGdlLCBsZWZ0LCByaWdo dCwgdmVydGV4KSB7CiAgaWYgKCFlZGdlWzBdICYmICFlZGdlWzFdKSB7CiAgICBlZGdlWzBdID0g dmVydGV4OwogICAgZWRnZS5sZWZ0ID0gbGVmdDsKICAgIGVkZ2UucmlnaHQgPSByaWdodDsKICB9 IGVsc2UgaWYgKGVkZ2UubGVmdCA9PT0gcmlnaHQpIHsKICAgIGVkZ2VbMV0gPSB2ZXJ0ZXg7CiAg fSBlbHNlIHsKICAgIGVkZ2VbMF0gPSB2ZXJ0ZXg7CiAgfQp9CgovLyBMaWFuZ+KAk0JhcnNreSBs aW5lIGNsaXBwaW5nLgpmdW5jdGlvbiBjbGlwRWRnZShlZGdlLCB4MCwgeTAsIHgxLCB5MSkgewog IHZhciBhID0gZWRnZVswXSwKICAgICAgYiA9IGVkZ2VbMV0sCiAgICAgIGF4ID0gYVswXSwKICAg ICAgYXkgPSBhWzFdLAogICAgICBieCA9IGJbMF0sCiAgICAgIGJ5ID0gYlsxXSwKICAgICAgdDAg PSAwLAogICAgICB0MSA9IDEsCiAgICAgIGR4ID0gYnggLSBheCwKICAgICAgZHkgPSBieSAtIGF5 LAogICAgICByOwoKICByID0geDAgLSBheDsKICBpZiAoIWR4ICYmIHIgPiAwKSByZXR1cm47CiAg ciAvPSBkeDsKICBpZiAoZHggPCAwKSB7CiAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICBpZiAo ciA8IHQxKSB0MSA9IHI7CiAgfSBlbHNlIGlmIChkeCA+IDApIHsKICAgIGlmIChyID4gdDEpIHJl dHVybjsKICAgIGlmIChyID4gdDApIHQwID0gcjsKICB9CgogIHIgPSB4MSAtIGF4OwogIGlmICgh ZHggJiYgciA8IDApIHJldHVybjsKICByIC89IGR4OwogIGlmIChkeCA8IDApIHsKICAgIGlmIChy ID4gdDEpIHJldHVybjsKICAgIGlmIChyID4gdDApIHQwID0gcjsKICB9IGVsc2UgaWYgKGR4ID4g MCkgewogICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgaWYgKHIgPCB0MSkgdDEgPSByOwogIH0K CiAgciA9IHkwIC0gYXk7CiAgaWYgKCFkeSAmJiByID4gMCkgcmV0dXJuOwogIHIgLz0gZHk7CiAg aWYgKGR5IDwgMCkgewogICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgaWYgKHIgPCB0MSkgdDEg PSByOwogIH0gZWxzZSBpZiAoZHkgPiAwKSB7CiAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICBp ZiAociA+IHQwKSB0MCA9IHI7CiAgfQoKICByID0geTEgLSBheTsKICBpZiAoIWR5ICYmIHIgPCAw KSByZXR1cm47CiAgciAvPSBkeTsKICBpZiAoZHkgPCAwKSB7CiAgICBpZiAociA+IHQxKSByZXR1 cm47CiAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgfSBlbHNlIGlmIChkeSA+IDApIHsKICAgIGlm IChyIDwgdDApIHJldHVybjsKICAgIGlmIChyIDwgdDEpIHQxID0gcjsKICB9CgogIGlmICghKHQw ID4gMCkgJiYgISh0MSA8IDEpKSByZXR1cm4gdHJ1ZTsgLy8gVE9ETyBCZXR0ZXIgY2hlY2s/Cgog IGlmICh0MCA+IDApIGVkZ2VbMF0gPSBbYXggKyB0MCAqIGR4LCBheSArIHQwICogZHldOwogIGlm ICh0MSA8IDEpIGVkZ2VbMV0gPSBbYXggKyB0MSAqIGR4LCBheSArIHQxICogZHldOwogIHJldHVy biB0cnVlOwp9CgpmdW5jdGlvbiBjb25uZWN0RWRnZShlZGdlLCB4MCwgeTAsIHgxLCB5MSkgewog IHZhciB2MSA9IGVkZ2VbMV07CiAgaWYgKHYxKSByZXR1cm4gdHJ1ZTsKCiAgdmFyIHYwID0gZWRn ZVswXSwKICAgICAgbGVmdCA9IGVkZ2UubGVmdCwKICAgICAgcmlnaHQgPSBlZGdlLnJpZ2h0LAog ICAgICBseCA9IGxlZnRbMF0sCiAgICAgIGx5ID0gbGVmdFsxXSwKICAgICAgcnggPSByaWdodFsw XSwKICAgICAgcnkgPSByaWdodFsxXSwKICAgICAgZnggPSAobHggKyByeCkgLyAyLAogICAgICBm eSA9IChseSArIHJ5KSAvIDIsCiAgICAgIGZtLAogICAgICBmYjsKCiAgaWYgKHJ5ID09PSBseSkg ewogICAgaWYgKGZ4IDwgeDAgfHwgZnggPj0geDEpIHJldHVybjsKICAgIGlmIChseCA+IHJ4KSB7 CiAgICAgIGlmICghdjApIHYwID0gW2Z4LCB5MF07CiAgICAgIGVsc2UgaWYgKHYwWzFdID49IHkx KSByZXR1cm47CiAgICAgIHYxID0gW2Z4LCB5MV07CiAgICB9IGVsc2UgewogICAgICBpZiAoIXYw KSB2MCA9IFtmeCwgeTFdOwogICAgICBlbHNlIGlmICh2MFsxXSA8IHkwKSByZXR1cm47CiAgICAg IHYxID0gW2Z4LCB5MF07CiAgICB9CiAgfSBlbHNlIHsKICAgIGZtID0gKGx4IC0gcngpIC8gKHJ5 IC0gbHkpOwogICAgZmIgPSBmeSAtIGZtICogZng7CiAgICBpZiAoZm0gPCAtMSB8fCBmbSA+IDEp IHsKICAgICAgaWYgKGx4ID4gcngpIHsKICAgICAgICBpZiAoIXYwKSB2MCA9IFsoeTAgLSBmYikg LyBmbSwgeTBdOwogICAgICAgIGVsc2UgaWYgKHYwWzFdID49IHkxKSByZXR1cm47CiAgICAgICAg djEgPSBbKHkxIC0gZmIpIC8gZm0sIHkxXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIXYw KSB2MCA9IFsoeTEgLSBmYikgLyBmbSwgeTFdOwogICAgICAgIGVsc2UgaWYgKHYwWzFdIDwgeTAp IHJldHVybjsKICAgICAgICB2MSA9IFsoeTAgLSBmYikgLyBmbSwgeTBdOwogICAgICB9CiAgICB9 IGVsc2UgewogICAgICBpZiAobHkgPCByeSkgewogICAgICAgIGlmICghdjApIHYwID0gW3gwLCBm bSAqIHgwICsgZmJdOwogICAgICAgIGVsc2UgaWYgKHYwWzBdID49IHgxKSByZXR1cm47CiAgICAg ICAgdjEgPSBbeDEsIGZtICogeDEgKyBmYl07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCF2 MCkgdjAgPSBbeDEsIGZtICogeDEgKyBmYl07CiAgICAgICAgZWxzZSBpZiAodjBbMF0gPCB4MCkg cmV0dXJuOwogICAgICAgIHYxID0gW3gwLCBmbSAqIHgwICsgZmJdOwogICAgICB9CiAgICB9CiAg fQoKICBlZGdlWzBdID0gdjA7CiAgZWRnZVsxXSA9IHYxOwogIHJldHVybiB0cnVlOwp9CgpmdW5j dGlvbiBjbGlwRWRnZXMoeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgaSA9IGVkZ2VzLmxlbmd0aCwK ICAgICAgZWRnZTsKCiAgd2hpbGUgKGktLSkgewogICAgaWYgKCFjb25uZWN0RWRnZShlZGdlID0g ZWRnZXNbaV0sIHgwLCB5MCwgeDEsIHkxKQogICAgICAgIHx8ICFjbGlwRWRnZShlZGdlLCB4MCwg eTAsIHgxLCB5MSkKICAgICAgICB8fCAhKE1hdGguYWJzKGVkZ2VbMF1bMF0gLSBlZGdlWzFdWzBd KSA+IGVwc2lsb24kNAogICAgICAgICAgICB8fCBNYXRoLmFicyhlZGdlWzBdWzFdIC0gZWRnZVsx XVsxXSkgPiBlcHNpbG9uJDQpKSB7CiAgICAgIGRlbGV0ZSBlZGdlc1tpXTsKICAgIH0KICB9Cn0K CmZ1bmN0aW9uIGNyZWF0ZUNlbGwoc2l0ZSkgewogIHJldHVybiBjZWxsc1tzaXRlLmluZGV4XSA9 IHsKICAgIHNpdGU6IHNpdGUsCiAgICBoYWxmZWRnZXM6IFtdCiAgfTsKfQoKZnVuY3Rpb24gY2Vs bEhhbGZlZGdlQW5nbGUoY2VsbCwgZWRnZSkgewogIHZhciBzaXRlID0gY2VsbC5zaXRlLAogICAg ICB2YSA9IGVkZ2UubGVmdCwKICAgICAgdmIgPSBlZGdlLnJpZ2h0OwogIGlmIChzaXRlID09PSB2 YikgdmIgPSB2YSwgdmEgPSBzaXRlOwogIGlmICh2YikgcmV0dXJuIE1hdGguYXRhbjIodmJbMV0g LSB2YVsxXSwgdmJbMF0gLSB2YVswXSk7CiAgaWYgKHNpdGUgPT09IHZhKSB2YSA9IGVkZ2VbMV0s IHZiID0gZWRnZVswXTsKICBlbHNlIHZhID0gZWRnZVswXSwgdmIgPSBlZGdlWzFdOwogIHJldHVy biBNYXRoLmF0YW4yKHZhWzBdIC0gdmJbMF0sIHZiWzFdIC0gdmFbMV0pOwp9CgpmdW5jdGlvbiBj ZWxsSGFsZmVkZ2VTdGFydChjZWxsLCBlZGdlKSB7CiAgcmV0dXJuIGVkZ2VbKyhlZGdlLmxlZnQg IT09IGNlbGwuc2l0ZSldOwp9CgpmdW5jdGlvbiBjZWxsSGFsZmVkZ2VFbmQoY2VsbCwgZWRnZSkg ewogIHJldHVybiBlZGdlWysoZWRnZS5sZWZ0ID09PSBjZWxsLnNpdGUpXTsKfQoKZnVuY3Rpb24g c29ydENlbGxIYWxmZWRnZXMoKSB7CiAgZm9yICh2YXIgaSA9IDAsIG4gPSBjZWxscy5sZW5ndGgs IGNlbGwsIGhhbGZlZGdlcywgaiwgbTsgaSA8IG47ICsraSkgewogICAgaWYgKChjZWxsID0gY2Vs bHNbaV0pICYmIChtID0gKGhhbGZlZGdlcyA9IGNlbGwuaGFsZmVkZ2VzKS5sZW5ndGgpKSB7CiAg ICAgIHZhciBpbmRleCA9IG5ldyBBcnJheShtKSwKICAgICAgICAgIGFycmF5ID0gbmV3IEFycmF5 KG0pOwogICAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSBpbmRleFtqXSA9IGosIGFycmF5W2pd ID0gY2VsbEhhbGZlZGdlQW5nbGUoY2VsbCwgZWRnZXNbaGFsZmVkZ2VzW2pdXSk7CiAgICAgIGlu ZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gYXJyYXlbal0gLSBhcnJheVtpXTsgfSk7 CiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIGFycmF5W2pdID0gaGFsZmVkZ2VzW2luZGV4 W2pdXTsKICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgaGFsZmVkZ2VzW2pdID0gYXJyYXlb al07CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjbGlwQ2VsbHMoeDAsIHkwLCB4MSwgeTEpIHsKICB2 YXIgbkNlbGxzID0gY2VsbHMubGVuZ3RoLAogICAgICBpQ2VsbCwKICAgICAgY2VsbCwKICAgICAg c2l0ZSwKICAgICAgaUhhbGZlZGdlLAogICAgICBoYWxmZWRnZXMsCiAgICAgIG5IYWxmZWRnZXMs CiAgICAgIHN0YXJ0LAogICAgICBzdGFydFgsCiAgICAgIHN0YXJ0WSwKICAgICAgZW5kLAogICAg ICBlbmRYLAogICAgICBlbmRZLAogICAgICBjb3ZlciA9IHRydWU7CgogIGZvciAoaUNlbGwgPSAw OyBpQ2VsbCA8IG5DZWxsczsgKytpQ2VsbCkgewogICAgaWYgKGNlbGwgPSBjZWxsc1tpQ2VsbF0p IHsKICAgICAgc2l0ZSA9IGNlbGwuc2l0ZTsKICAgICAgaGFsZmVkZ2VzID0gY2VsbC5oYWxmZWRn ZXM7CiAgICAgIGlIYWxmZWRnZSA9IGhhbGZlZGdlcy5sZW5ndGg7CgogICAgICAvLyBSZW1vdmUg YW55IGRhbmdsaW5nIGNsaXBwZWQgZWRnZXMuCiAgICAgIHdoaWxlIChpSGFsZmVkZ2UtLSkgewog ICAgICAgIGlmICghZWRnZXNbaGFsZmVkZ2VzW2lIYWxmZWRnZV1dKSB7CiAgICAgICAgICBoYWxm ZWRnZXMuc3BsaWNlKGlIYWxmZWRnZSwgMSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBJ bnNlcnQgYW55IGJvcmRlciBlZGdlcyBhcyBuZWNlc3NhcnkuCiAgICAgIGlIYWxmZWRnZSA9IDAs IG5IYWxmZWRnZXMgPSBoYWxmZWRnZXMubGVuZ3RoOwogICAgICB3aGlsZSAoaUhhbGZlZGdlIDwg bkhhbGZlZGdlcykgewogICAgICAgIGVuZCA9IGNlbGxIYWxmZWRnZUVuZChjZWxsLCBlZGdlc1to YWxmZWRnZXNbaUhhbGZlZGdlXV0pLCBlbmRYID0gZW5kWzBdLCBlbmRZID0gZW5kWzFdOwogICAg ICAgIHN0YXJ0ID0gY2VsbEhhbGZlZGdlU3RhcnQoY2VsbCwgZWRnZXNbaGFsZmVkZ2VzWysraUhh bGZlZGdlICUgbkhhbGZlZGdlc11dKSwgc3RhcnRYID0gc3RhcnRbMF0sIHN0YXJ0WSA9IHN0YXJ0 WzFdOwogICAgICAgIGlmIChNYXRoLmFicyhlbmRYIC0gc3RhcnRYKSA+IGVwc2lsb24kNCB8fCBN YXRoLmFicyhlbmRZIC0gc3RhcnRZKSA+IGVwc2lsb24kNCkgewogICAgICAgICAgaGFsZmVkZ2Vz LnNwbGljZShpSGFsZmVkZ2UsIDAsIGVkZ2VzLnB1c2goY3JlYXRlQm9yZGVyRWRnZShzaXRlLCBl bmQsCiAgICAgICAgICAgICAgTWF0aC5hYnMoZW5kWCAtIHgwKSA8IGVwc2lsb24kNCAmJiB5MSAt IGVuZFkgPiBlcHNpbG9uJDQgPyBbeDAsIE1hdGguYWJzKHN0YXJ0WCAtIHgwKSA8IGVwc2lsb24k NCA/IHN0YXJ0WSA6IHkxXQogICAgICAgICAgICAgIDogTWF0aC5hYnMoZW5kWSAtIHkxKSA8IGVw c2lsb24kNCAmJiB4MSAtIGVuZFggPiBlcHNpbG9uJDQgPyBbTWF0aC5hYnMoc3RhcnRZIC0geTEp IDwgZXBzaWxvbiQ0ID8gc3RhcnRYIDogeDEsIHkxXQogICAgICAgICAgICAgIDogTWF0aC5hYnMo ZW5kWCAtIHgxKSA8IGVwc2lsb24kNCAmJiBlbmRZIC0geTAgPiBlcHNpbG9uJDQgPyBbeDEsIE1h dGguYWJzKHN0YXJ0WCAtIHgxKSA8IGVwc2lsb24kNCA/IHN0YXJ0WSA6IHkwXQogICAgICAgICAg ICAgIDogTWF0aC5hYnMoZW5kWSAtIHkwKSA8IGVwc2lsb24kNCAmJiBlbmRYIC0geDAgPiBlcHNp bG9uJDQgPyBbTWF0aC5hYnMoc3RhcnRZIC0geTApIDwgZXBzaWxvbiQ0ID8gc3RhcnRYIDogeDAs IHkwXQogICAgICAgICAgICAgIDogbnVsbCkpIC0gMSk7CiAgICAgICAgICArK25IYWxmZWRnZXM7 CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAobkhhbGZlZGdlcykgY292ZXIgPSBmYWxzZTsK ICAgIH0KICB9CgogIC8vIElmIHRoZXJlIHdlcmVu4oCZdCBhbnkgZWRnZXMsIGhhdmUgdGhlIGNs b3Nlc3Qgc2l0ZSBjb3ZlciB0aGUgZXh0ZW50LgogIC8vIEl0IGRvZXNu4oCZdCBtYXR0ZXIgd2hp Y2ggY29ybmVyIG9mIHRoZSBleHRlbnQgd2UgbWVhc3VyZSEKICBpZiAoY292ZXIpIHsKICAgIHZh ciBkeCwgZHksIGQyLCBkYyA9IEluZmluaXR5OwoKICAgIGZvciAoaUNlbGwgPSAwLCBjb3ZlciA9 IG51bGw7IGlDZWxsIDwgbkNlbGxzOyArK2lDZWxsKSB7CiAgICAgIGlmIChjZWxsID0gY2VsbHNb aUNlbGxdKSB7CiAgICAgICAgc2l0ZSA9IGNlbGwuc2l0ZTsKICAgICAgICBkeCA9IHNpdGVbMF0g LSB4MDsKICAgICAgICBkeSA9IHNpdGVbMV0gLSB5MDsKICAgICAgICBkMiA9IGR4ICogZHggKyBk eSAqIGR5OwogICAgICAgIGlmIChkMiA8IGRjKSBkYyA9IGQyLCBjb3ZlciA9IGNlbGw7CiAgICAg IH0KICAgIH0KCiAgICBpZiAoY292ZXIpIHsKICAgICAgdmFyIHYwMCA9IFt4MCwgeTBdLCB2MDEg PSBbeDAsIHkxXSwgdjExID0gW3gxLCB5MV0sIHYxMCA9IFt4MSwgeTBdOwogICAgICBjb3Zlci5o YWxmZWRnZXMucHVzaCgKICAgICAgICBlZGdlcy5wdXNoKGNyZWF0ZUJvcmRlckVkZ2Uoc2l0ZSA9 IGNvdmVyLnNpdGUsIHYwMCwgdjAxKSkgLSAxLAogICAgICAgIGVkZ2VzLnB1c2goY3JlYXRlQm9y ZGVyRWRnZShzaXRlLCB2MDEsIHYxMSkpIC0gMSwKICAgICAgICBlZGdlcy5wdXNoKGNyZWF0ZUJv cmRlckVkZ2Uoc2l0ZSwgdjExLCB2MTApKSAtIDEsCiAgICAgICAgZWRnZXMucHVzaChjcmVhdGVC b3JkZXJFZGdlKHNpdGUsIHYxMCwgdjAwKSkgLSAxCiAgICAgICk7CiAgICB9CiAgfQoKICAvLyBM YXN0bHkgZGVsZXRlIGFueSBjZWxscyB3aXRoIG5vIGVkZ2VzOyB0aGVzZSB3ZXJlIGVudGlyZWx5 IGNsaXBwZWQuCiAgZm9yIChpQ2VsbCA9IDA7IGlDZWxsIDwgbkNlbGxzOyArK2lDZWxsKSB7CiAg ICBpZiAoY2VsbCA9IGNlbGxzW2lDZWxsXSkgewogICAgICBpZiAoIWNlbGwuaGFsZmVkZ2VzLmxl bmd0aCkgewogICAgICAgIGRlbGV0ZSBjZWxsc1tpQ2VsbF07CiAgICAgIH0KICAgIH0KICB9Cn0K CnZhciBjaXJjbGVQb29sID0gW107Cgp2YXIgZmlyc3RDaXJjbGU7CgpmdW5jdGlvbiBDaXJjbGUo KSB7CiAgUmVkQmxhY2tOb2RlKHRoaXMpOwogIHRoaXMueCA9CiAgdGhpcy55ID0KICB0aGlzLmFy YyA9CiAgdGhpcy5zaXRlID0KICB0aGlzLmN5ID0gbnVsbDsKfQoKZnVuY3Rpb24gYXR0YWNoQ2ly Y2xlKGFyYykgewogIHZhciBsQXJjID0gYXJjLlAsCiAgICAgIHJBcmMgPSBhcmMuTjsKCiAgaWYg KCFsQXJjIHx8ICFyQXJjKSByZXR1cm47CgogIHZhciBsU2l0ZSA9IGxBcmMuc2l0ZSwKICAgICAg Y1NpdGUgPSBhcmMuc2l0ZSwKICAgICAgclNpdGUgPSByQXJjLnNpdGU7CgogIGlmIChsU2l0ZSA9 PT0gclNpdGUpIHJldHVybjsKCiAgdmFyIGJ4ID0gY1NpdGVbMF0sCiAgICAgIGJ5ID0gY1NpdGVb MV0sCiAgICAgIGF4ID0gbFNpdGVbMF0gLSBieCwKICAgICAgYXkgPSBsU2l0ZVsxXSAtIGJ5LAog ICAgICBjeCA9IHJTaXRlWzBdIC0gYngsCiAgICAgIGN5ID0gclNpdGVbMV0gLSBieTsKCiAgdmFy IGQgPSAyICogKGF4ICogY3kgLSBheSAqIGN4KTsKICBpZiAoZCA+PSAtZXBzaWxvbjIkMikgcmV0 dXJuOwoKICB2YXIgaGEgPSBheCAqIGF4ICsgYXkgKiBheSwKICAgICAgaGMgPSBjeCAqIGN4ICsg Y3kgKiBjeSwKICAgICAgeCA9IChjeSAqIGhhIC0gYXkgKiBoYykgLyBkLAogICAgICB5ID0gKGF4 ICogaGMgLSBjeCAqIGhhKSAvIGQ7CgogIHZhciBjaXJjbGUgPSBjaXJjbGVQb29sLnBvcCgpIHx8 IG5ldyBDaXJjbGU7CiAgY2lyY2xlLmFyYyA9IGFyYzsKICBjaXJjbGUuc2l0ZSA9IGNTaXRlOwog IGNpcmNsZS54ID0geCArIGJ4OwogIGNpcmNsZS55ID0gKGNpcmNsZS5jeSA9IHkgKyBieSkgKyBN YXRoLnNxcnQoeCAqIHggKyB5ICogeSk7IC8vIHkgYm90dG9tCgogIGFyYy5jaXJjbGUgPSBjaXJj bGU7CgogIHZhciBiZWZvcmUgPSBudWxsLAogICAgICBub2RlID0gY2lyY2xlcy5fOwoKICB3aGls ZSAobm9kZSkgewogICAgaWYgKGNpcmNsZS55IDwgbm9kZS55IHx8IChjaXJjbGUueSA9PT0gbm9k ZS55ICYmIGNpcmNsZS54IDw9IG5vZGUueCkpIHsKICAgICAgaWYgKG5vZGUuTCkgbm9kZSA9IG5v ZGUuTDsKICAgICAgZWxzZSB7IGJlZm9yZSA9IG5vZGUuUDsgYnJlYWs7IH0KICAgIH0gZWxzZSB7 CiAgICAgIGlmIChub2RlLlIpIG5vZGUgPSBub2RlLlI7CiAgICAgIGVsc2UgeyBiZWZvcmUgPSBu b2RlOyBicmVhazsgfQogICAgfQogIH0KCiAgY2lyY2xlcy5pbnNlcnQoYmVmb3JlLCBjaXJjbGUp OwogIGlmICghYmVmb3JlKSBmaXJzdENpcmNsZSA9IGNpcmNsZTsKfQoKZnVuY3Rpb24gZGV0YWNo Q2lyY2xlKGFyYykgewogIHZhciBjaXJjbGUgPSBhcmMuY2lyY2xlOwogIGlmIChjaXJjbGUpIHsK ICAgIGlmICghY2lyY2xlLlApIGZpcnN0Q2lyY2xlID0gY2lyY2xlLk47CiAgICBjaXJjbGVzLnJl bW92ZShjaXJjbGUpOwogICAgY2lyY2xlUG9vbC5wdXNoKGNpcmNsZSk7CiAgICBSZWRCbGFja05v ZGUoY2lyY2xlKTsKICAgIGFyYy5jaXJjbGUgPSBudWxsOwogIH0KfQoKdmFyIGJlYWNoUG9vbCA9 IFtdOwoKZnVuY3Rpb24gQmVhY2goKSB7CiAgUmVkQmxhY2tOb2RlKHRoaXMpOwogIHRoaXMuZWRn ZSA9CiAgdGhpcy5zaXRlID0KICB0aGlzLmNpcmNsZSA9IG51bGw7Cn0KCmZ1bmN0aW9uIGNyZWF0 ZUJlYWNoKHNpdGUpIHsKICB2YXIgYmVhY2ggPSBiZWFjaFBvb2wucG9wKCkgfHwgbmV3IEJlYWNo OwogIGJlYWNoLnNpdGUgPSBzaXRlOwogIHJldHVybiBiZWFjaDsKfQoKZnVuY3Rpb24gZGV0YWNo QmVhY2goYmVhY2gpIHsKICBkZXRhY2hDaXJjbGUoYmVhY2gpOwogIGJlYWNoZXMucmVtb3ZlKGJl YWNoKTsKICBiZWFjaFBvb2wucHVzaChiZWFjaCk7CiAgUmVkQmxhY2tOb2RlKGJlYWNoKTsKfQoK ZnVuY3Rpb24gcmVtb3ZlQmVhY2goYmVhY2gpIHsKICB2YXIgY2lyY2xlID0gYmVhY2guY2lyY2xl LAogICAgICB4ID0gY2lyY2xlLngsCiAgICAgIHkgPSBjaXJjbGUuY3ksCiAgICAgIHZlcnRleCA9 IFt4LCB5XSwKICAgICAgcHJldmlvdXMgPSBiZWFjaC5QLAogICAgICBuZXh0ID0gYmVhY2guTiwK ICAgICAgZGlzYXBwZWFyaW5nID0gW2JlYWNoXTsKCiAgZGV0YWNoQmVhY2goYmVhY2gpOwoKICB2 YXIgbEFyYyA9IHByZXZpb3VzOwogIHdoaWxlIChsQXJjLmNpcmNsZQogICAgICAmJiBNYXRoLmFi cyh4IC0gbEFyYy5jaXJjbGUueCkgPCBlcHNpbG9uJDQKICAgICAgJiYgTWF0aC5hYnMoeSAtIGxB cmMuY2lyY2xlLmN5KSA8IGVwc2lsb24kNCkgewogICAgcHJldmlvdXMgPSBsQXJjLlA7CiAgICBk aXNhcHBlYXJpbmcudW5zaGlmdChsQXJjKTsKICAgIGRldGFjaEJlYWNoKGxBcmMpOwogICAgbEFy YyA9IHByZXZpb3VzOwogIH0KCiAgZGlzYXBwZWFyaW5nLnVuc2hpZnQobEFyYyk7CiAgZGV0YWNo Q2lyY2xlKGxBcmMpOwoKICB2YXIgckFyYyA9IG5leHQ7CiAgd2hpbGUgKHJBcmMuY2lyY2xlCiAg ICAgICYmIE1hdGguYWJzKHggLSByQXJjLmNpcmNsZS54KSA8IGVwc2lsb24kNAogICAgICAmJiBN YXRoLmFicyh5IC0gckFyYy5jaXJjbGUuY3kpIDwgZXBzaWxvbiQ0KSB7CiAgICBuZXh0ID0gckFy Yy5OOwogICAgZGlzYXBwZWFyaW5nLnB1c2gockFyYyk7CiAgICBkZXRhY2hCZWFjaChyQXJjKTsK ICAgIHJBcmMgPSBuZXh0OwogIH0KCiAgZGlzYXBwZWFyaW5nLnB1c2gockFyYyk7CiAgZGV0YWNo Q2lyY2xlKHJBcmMpOwoKICB2YXIgbkFyY3MgPSBkaXNhcHBlYXJpbmcubGVuZ3RoLAogICAgICBp QXJjOwogIGZvciAoaUFyYyA9IDE7IGlBcmMgPCBuQXJjczsgKytpQXJjKSB7CiAgICByQXJjID0g ZGlzYXBwZWFyaW5nW2lBcmNdOwogICAgbEFyYyA9IGRpc2FwcGVhcmluZ1tpQXJjIC0gMV07CiAg ICBzZXRFZGdlRW5kKHJBcmMuZWRnZSwgbEFyYy5zaXRlLCByQXJjLnNpdGUsIHZlcnRleCk7CiAg fQoKICBsQXJjID0gZGlzYXBwZWFyaW5nWzBdOwogIHJBcmMgPSBkaXNhcHBlYXJpbmdbbkFyY3Mg LSAxXTsKICByQXJjLmVkZ2UgPSBjcmVhdGVFZGdlKGxBcmMuc2l0ZSwgckFyYy5zaXRlLCBudWxs LCB2ZXJ0ZXgpOwoKICBhdHRhY2hDaXJjbGUobEFyYyk7CiAgYXR0YWNoQ2lyY2xlKHJBcmMpOwp9 CgpmdW5jdGlvbiBhZGRCZWFjaChzaXRlKSB7CiAgdmFyIHggPSBzaXRlWzBdLAogICAgICBkaXJl Y3RyaXggPSBzaXRlWzFdLAogICAgICBsQXJjLAogICAgICByQXJjLAogICAgICBkeGwsCiAgICAg IGR4ciwKICAgICAgbm9kZSA9IGJlYWNoZXMuXzsKCiAgd2hpbGUgKG5vZGUpIHsKICAgIGR4bCA9 IGxlZnRCcmVha1BvaW50KG5vZGUsIGRpcmVjdHJpeCkgLSB4OwogICAgaWYgKGR4bCA+IGVwc2ls b24kNCkgbm9kZSA9IG5vZGUuTDsgZWxzZSB7CiAgICAgIGR4ciA9IHggLSByaWdodEJyZWFrUG9p bnQobm9kZSwgZGlyZWN0cml4KTsKICAgICAgaWYgKGR4ciA+IGVwc2lsb24kNCkgewogICAgICAg IGlmICghbm9kZS5SKSB7CiAgICAgICAgICBsQXJjID0gbm9kZTsKICAgICAgICAgIGJyZWFrOwog ICAgICAgIH0KICAgICAgICBub2RlID0gbm9kZS5SOwogICAgICB9IGVsc2UgewogICAgICAgIGlm IChkeGwgPiAtZXBzaWxvbiQ0KSB7CiAgICAgICAgICBsQXJjID0gbm9kZS5QOwogICAgICAgICAg ckFyYyA9IG5vZGU7CiAgICAgICAgfSBlbHNlIGlmIChkeHIgPiAtZXBzaWxvbiQ0KSB7CiAgICAg ICAgICBsQXJjID0gbm9kZTsKICAgICAgICAgIHJBcmMgPSBub2RlLk47CiAgICAgICAgfSBlbHNl IHsKICAgICAgICAgIGxBcmMgPSByQXJjID0gbm9kZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7 CiAgICAgIH0KICAgIH0KICB9CgogIGNyZWF0ZUNlbGwoc2l0ZSk7CiAgdmFyIG5ld0FyYyA9IGNy ZWF0ZUJlYWNoKHNpdGUpOwogIGJlYWNoZXMuaW5zZXJ0KGxBcmMsIG5ld0FyYyk7CgogIGlmICgh bEFyYyAmJiAhckFyYykgcmV0dXJuOwoKICBpZiAobEFyYyA9PT0gckFyYykgewogICAgZGV0YWNo Q2lyY2xlKGxBcmMpOwogICAgckFyYyA9IGNyZWF0ZUJlYWNoKGxBcmMuc2l0ZSk7CiAgICBiZWFj aGVzLmluc2VydChuZXdBcmMsIHJBcmMpOwogICAgbmV3QXJjLmVkZ2UgPSByQXJjLmVkZ2UgPSBj cmVhdGVFZGdlKGxBcmMuc2l0ZSwgbmV3QXJjLnNpdGUpOwogICAgYXR0YWNoQ2lyY2xlKGxBcmMp OwogICAgYXR0YWNoQ2lyY2xlKHJBcmMpOwogICAgcmV0dXJuOwogIH0KCiAgaWYgKCFyQXJjKSB7 IC8vICYmIGxBcmMKICAgIG5ld0FyYy5lZGdlID0gY3JlYXRlRWRnZShsQXJjLnNpdGUsIG5ld0Fy Yy5zaXRlKTsKICAgIHJldHVybjsKICB9CgogIC8vIGVsc2UgbEFyYyAhPT0gckFyYwogIGRldGFj aENpcmNsZShsQXJjKTsKICBkZXRhY2hDaXJjbGUockFyYyk7CgogIHZhciBsU2l0ZSA9IGxBcmMu c2l0ZSwKICAgICAgYXggPSBsU2l0ZVswXSwKICAgICAgYXkgPSBsU2l0ZVsxXSwKICAgICAgYngg PSBzaXRlWzBdIC0gYXgsCiAgICAgIGJ5ID0gc2l0ZVsxXSAtIGF5LAogICAgICByU2l0ZSA9IHJB cmMuc2l0ZSwKICAgICAgY3ggPSByU2l0ZVswXSAtIGF4LAogICAgICBjeSA9IHJTaXRlWzFdIC0g YXksCiAgICAgIGQgPSAyICogKGJ4ICogY3kgLSBieSAqIGN4KSwKICAgICAgaGIgPSBieCAqIGJ4 ICsgYnkgKiBieSwKICAgICAgaGMgPSBjeCAqIGN4ICsgY3kgKiBjeSwKICAgICAgdmVydGV4ID0g WyhjeSAqIGhiIC0gYnkgKiBoYykgLyBkICsgYXgsIChieCAqIGhjIC0gY3ggKiBoYikgLyBkICsg YXldOwoKICBzZXRFZGdlRW5kKHJBcmMuZWRnZSwgbFNpdGUsIHJTaXRlLCB2ZXJ0ZXgpOwogIG5l d0FyYy5lZGdlID0gY3JlYXRlRWRnZShsU2l0ZSwgc2l0ZSwgbnVsbCwgdmVydGV4KTsKICByQXJj LmVkZ2UgPSBjcmVhdGVFZGdlKHNpdGUsIHJTaXRlLCBudWxsLCB2ZXJ0ZXgpOwogIGF0dGFjaENp cmNsZShsQXJjKTsKICBhdHRhY2hDaXJjbGUockFyYyk7Cn0KCmZ1bmN0aW9uIGxlZnRCcmVha1Bv aW50KGFyYywgZGlyZWN0cml4KSB7CiAgdmFyIHNpdGUgPSBhcmMuc2l0ZSwKICAgICAgcmZvY3gg PSBzaXRlWzBdLAogICAgICByZm9jeSA9IHNpdGVbMV0sCiAgICAgIHBieTIgPSByZm9jeSAtIGRp cmVjdHJpeDsKCiAgaWYgKCFwYnkyKSByZXR1cm4gcmZvY3g7CgogIHZhciBsQXJjID0gYXJjLlA7 CiAgaWYgKCFsQXJjKSByZXR1cm4gLUluZmluaXR5OwoKICBzaXRlID0gbEFyYy5zaXRlOwogIHZh ciBsZm9jeCA9IHNpdGVbMF0sCiAgICAgIGxmb2N5ID0gc2l0ZVsxXSwKICAgICAgcGxieTIgPSBs Zm9jeSAtIGRpcmVjdHJpeDsKCiAgaWYgKCFwbGJ5MikgcmV0dXJuIGxmb2N4OwoKICB2YXIgaGwg PSBsZm9jeCAtIHJmb2N4LAogICAgICBhYnkyID0gMSAvIHBieTIgLSAxIC8gcGxieTIsCiAgICAg IGIgPSBobCAvIHBsYnkyOwoKICBpZiAoYWJ5MikgcmV0dXJuICgtYiArIE1hdGguc3FydChiICog YiAtIDIgKiBhYnkyICogKGhsICogaGwgLyAoLTIgKiBwbGJ5MikgLSBsZm9jeSArIHBsYnkyIC8g MiArIHJmb2N5IC0gcGJ5MiAvIDIpKSkgLyBhYnkyICsgcmZvY3g7CgogIHJldHVybiAocmZvY3gg KyBsZm9jeCkgLyAyOwp9CgpmdW5jdGlvbiByaWdodEJyZWFrUG9pbnQoYXJjLCBkaXJlY3RyaXgp IHsKICB2YXIgckFyYyA9IGFyYy5OOwogIGlmIChyQXJjKSByZXR1cm4gbGVmdEJyZWFrUG9pbnQo ckFyYywgZGlyZWN0cml4KTsKICB2YXIgc2l0ZSA9IGFyYy5zaXRlOwogIHJldHVybiBzaXRlWzFd ID09PSBkaXJlY3RyaXggPyBzaXRlWzBdIDogSW5maW5pdHk7Cn0KCnZhciBlcHNpbG9uJDQgPSAx ZS02Owp2YXIgZXBzaWxvbjIkMiA9IDFlLTEyOwp2YXIgYmVhY2hlczsKdmFyIGNlbGxzOwp2YXIg Y2lyY2xlczsKdmFyIGVkZ2VzOwoKZnVuY3Rpb24gdHJpYW5nbGVBcmVhKGEsIGIsIGMpIHsKICBy ZXR1cm4gKGFbMF0gLSBjWzBdKSAqIChiWzFdIC0gYVsxXSkgLSAoYVswXSAtIGJbMF0pICogKGNb MV0gLSBhWzFdKTsKfQoKZnVuY3Rpb24gbGV4aWNvZ3JhcGhpYyhhLCBiKSB7CiAgcmV0dXJuIGJb MV0gLSBhWzFdCiAgICAgIHx8IGJbMF0gLSBhWzBdOwp9CgpmdW5jdGlvbiBEaWFncmFtKHNpdGVz LCBleHRlbnQpIHsKICB2YXIgc2l0ZSA9IHNpdGVzLnNvcnQobGV4aWNvZ3JhcGhpYykucG9wKCks CiAgICAgIHgsCiAgICAgIHksCiAgICAgIGNpcmNsZTsKCiAgZWRnZXMgPSBbXTsKICBjZWxscyA9 IG5ldyBBcnJheShzaXRlcy5sZW5ndGgpOwogIGJlYWNoZXMgPSBuZXcgUmVkQmxhY2tUcmVlOwog IGNpcmNsZXMgPSBuZXcgUmVkQmxhY2tUcmVlOwoKICB3aGlsZSAodHJ1ZSkgewogICAgY2lyY2xl ID0gZmlyc3RDaXJjbGU7CiAgICBpZiAoc2l0ZSAmJiAoIWNpcmNsZSB8fCBzaXRlWzFdIDwgY2ly Y2xlLnkgfHwgKHNpdGVbMV0gPT09IGNpcmNsZS55ICYmIHNpdGVbMF0gPCBjaXJjbGUueCkpKSB7 CiAgICAgIGlmIChzaXRlWzBdICE9PSB4IHx8IHNpdGVbMV0gIT09IHkpIHsKICAgICAgICBhZGRC ZWFjaChzaXRlKTsKICAgICAgICB4ID0gc2l0ZVswXSwgeSA9IHNpdGVbMV07CiAgICAgIH0KICAg ICAgc2l0ZSA9IHNpdGVzLnBvcCgpOwogICAgfSBlbHNlIGlmIChjaXJjbGUpIHsKICAgICAgcmVt b3ZlQmVhY2goY2lyY2xlLmFyYyk7CiAgICB9IGVsc2UgewogICAgICBicmVhazsKICAgIH0KICB9 CgogIHNvcnRDZWxsSGFsZmVkZ2VzKCk7CgogIGlmIChleHRlbnQpIHsKICAgIHZhciB4MCA9ICtl eHRlbnRbMF1bMF0sCiAgICAgICAgeTAgPSArZXh0ZW50WzBdWzFdLAogICAgICAgIHgxID0gK2V4 dGVudFsxXVswXSwKICAgICAgICB5MSA9ICtleHRlbnRbMV1bMV07CiAgICBjbGlwRWRnZXMoeDAs IHkwLCB4MSwgeTEpOwogICAgY2xpcENlbGxzKHgwLCB5MCwgeDEsIHkxKTsKICB9CgogIHRoaXMu ZWRnZXMgPSBlZGdlczsKICB0aGlzLmNlbGxzID0gY2VsbHM7CgogIGJlYWNoZXMgPQogIGNpcmNs ZXMgPQogIGVkZ2VzID0KICBjZWxscyA9IG51bGw7Cn0KCkRpYWdyYW0ucHJvdG90eXBlID0gewog IGNvbnN0cnVjdG9yOiBEaWFncmFtLAoKICBwb2x5Z29uczogZnVuY3Rpb24oKSB7CiAgICB2YXIg ZWRnZXMgPSB0aGlzLmVkZ2VzOwoKICAgIHJldHVybiB0aGlzLmNlbGxzLm1hcChmdW5jdGlvbihj ZWxsKSB7CiAgICAgIHZhciBwb2x5Z29uID0gY2VsbC5oYWxmZWRnZXMubWFwKGZ1bmN0aW9uKGkp IHsgcmV0dXJuIGNlbGxIYWxmZWRnZVN0YXJ0KGNlbGwsIGVkZ2VzW2ldKTsgfSk7CiAgICAgIHBv bHlnb24uZGF0YSA9IGNlbGwuc2l0ZS5kYXRhOwogICAgICByZXR1cm4gcG9seWdvbjsKICAgIH0p OwogIH0sCgogIHRyaWFuZ2xlczogZnVuY3Rpb24oKSB7CiAgICB2YXIgdHJpYW5nbGVzID0gW10s CiAgICAgICAgZWRnZXMgPSB0aGlzLmVkZ2VzOwoKICAgIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5j dGlvbihjZWxsLCBpKSB7CiAgICAgIGlmICghKG0gPSAoaGFsZmVkZ2VzID0gY2VsbC5oYWxmZWRn ZXMpLmxlbmd0aCkpIHJldHVybjsKICAgICAgdmFyIHNpdGUgPSBjZWxsLnNpdGUsCiAgICAgICAg ICBoYWxmZWRnZXMsCiAgICAgICAgICBqID0gLTEsCiAgICAgICAgICBtLAogICAgICAgICAgczAs CiAgICAgICAgICBlMSA9IGVkZ2VzW2hhbGZlZGdlc1ttIC0gMV1dLAogICAgICAgICAgczEgPSBl MS5sZWZ0ID09PSBzaXRlID8gZTEucmlnaHQgOiBlMS5sZWZ0OwoKICAgICAgd2hpbGUgKCsraiA8 IG0pIHsKICAgICAgICBzMCA9IHMxOwogICAgICAgIGUxID0gZWRnZXNbaGFsZmVkZ2VzW2pdXTsK ICAgICAgICBzMSA9IGUxLmxlZnQgPT09IHNpdGUgPyBlMS5yaWdodCA6IGUxLmxlZnQ7CiAgICAg ICAgaWYgKHMwICYmIHMxICYmIGkgPCBzMC5pbmRleCAmJiBpIDwgczEuaW5kZXggJiYgdHJpYW5n bGVBcmVhKHNpdGUsIHMwLCBzMSkgPCAwKSB7CiAgICAgICAgICB0cmlhbmdsZXMucHVzaChbc2l0 ZS5kYXRhLCBzMC5kYXRhLCBzMS5kYXRhXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAg ICByZXR1cm4gdHJpYW5nbGVzOwogIH0sCgogIGxpbmtzOiBmdW5jdGlvbigpIHsKICAgIHJldHVy biB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbihlZGdlKSB7CiAgICAgIHJldHVybiBlZGdlLnJp Z2h0OwogICAgfSkubWFwKGZ1bmN0aW9uKGVkZ2UpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBz b3VyY2U6IGVkZ2UubGVmdC5kYXRhLAogICAgICAgIHRhcmdldDogZWRnZS5yaWdodC5kYXRhCiAg ICAgIH07CiAgICB9KTsKICB9LAoKICBmaW5kOiBmdW5jdGlvbih4LCB5LCByYWRpdXMpIHsKICAg IHZhciB0aGF0ID0gdGhpcywgaTAsIGkxID0gdGhhdC5fZm91bmQgfHwgMCwgbiA9IHRoYXQuY2Vs bHMubGVuZ3RoLCBjZWxsOwoKICAgIC8vIFVzZSB0aGUgcHJldmlvdXNseS1mb3VuZCBjZWxsLCBv ciBzdGFydCB3aXRoIGFuIGFyYml0cmFyeSBvbmUuCiAgICB3aGlsZSAoIShjZWxsID0gdGhhdC5j ZWxsc1tpMV0pKSBpZiAoKytpMSA+PSBuKSByZXR1cm4gbnVsbDsKICAgIHZhciBkeCA9IHggLSBj ZWxsLnNpdGVbMF0sIGR5ID0geSAtIGNlbGwuc2l0ZVsxXSwgZDIgPSBkeCAqIGR4ICsgZHkgKiBk eTsKCiAgICAvLyBUcmF2ZXJzZSB0aGUgaGFsZi1lZGdlcyB0byBmaW5kIGEgY2xvc2VyIGNlbGws IGlmIGFueS4KICAgIGRvIHsKICAgICAgY2VsbCA9IHRoYXQuY2VsbHNbaTAgPSBpMV0sIGkxID0g bnVsbDsKICAgICAgY2VsbC5oYWxmZWRnZXMuZm9yRWFjaChmdW5jdGlvbihlKSB7CiAgICAgICAg dmFyIGVkZ2UgPSB0aGF0LmVkZ2VzW2VdLCB2ID0gZWRnZS5sZWZ0OwogICAgICAgIGlmICgodiA9 PT0gY2VsbC5zaXRlIHx8ICF2KSAmJiAhKHYgPSBlZGdlLnJpZ2h0KSkgcmV0dXJuOwogICAgICAg IHZhciB2eCA9IHggLSB2WzBdLCB2eSA9IHkgLSB2WzFdLCB2MiA9IHZ4ICogdnggKyB2eSAqIHZ5 OwogICAgICAgIGlmICh2MiA8IGQyKSBkMiA9IHYyLCBpMSA9IHYuaW5kZXg7CiAgICAgIH0pOwog ICAgfSB3aGlsZSAoaTEgIT09IG51bGwpOwoKICAgIHRoYXQuX2ZvdW5kID0gaTA7CgogICAgcmV0 dXJuIHJhZGl1cyA9PSBudWxsIHx8IGQyIDw9IHJhZGl1cyAqIHJhZGl1cyA/IGNlbGwuc2l0ZSA6 IG51bGw7CiAgfQp9OwoKZnVuY3Rpb24gdm9yb25vaSgpIHsKICB2YXIgeCA9IHgkNCwKICAgICAg eSA9IHkkNCwKICAgICAgZXh0ZW50ID0gbnVsbDsKCiAgZnVuY3Rpb24gdm9yb25vaShkYXRhKSB7 CiAgICByZXR1cm4gbmV3IERpYWdyYW0oZGF0YS5tYXAoZnVuY3Rpb24oZCwgaSkgewogICAgICB2 YXIgcyA9IFtNYXRoLnJvdW5kKHgoZCwgaSwgZGF0YSkgLyBlcHNpbG9uJDQpICogZXBzaWxvbiQ0 LCBNYXRoLnJvdW5kKHkoZCwgaSwgZGF0YSkgLyBlcHNpbG9uJDQpICogZXBzaWxvbiQ0XTsKICAg ICAgcy5pbmRleCA9IGk7CiAgICAgIHMuZGF0YSA9IGQ7CiAgICAgIHJldHVybiBzOwogICAgfSks IGV4dGVudCk7CiAgfQoKICB2b3Jvbm9pLnBvbHlnb25zID0gZnVuY3Rpb24oZGF0YSkgewogICAg cmV0dXJuIHZvcm9ub2koZGF0YSkucG9seWdvbnMoKTsKICB9OwoKICB2b3Jvbm9pLmxpbmtzID0g ZnVuY3Rpb24oZGF0YSkgewogICAgcmV0dXJuIHZvcm9ub2koZGF0YSkubGlua3MoKTsKICB9OwoK ICB2b3Jvbm9pLnRyaWFuZ2xlcyA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgIHJldHVybiB2b3Jvbm9p KGRhdGEpLnRyaWFuZ2xlcygpOwogIH07CgogIHZvcm9ub2kueCA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/ IF8gOiBjb25zdGFudCRjKCtfKSwgdm9yb25vaSkgOiB4OwogIH07CgogIHZvcm9ub2kueSA9IGZ1 bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSB0eXBlb2YgXyA9 PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRjKCtfKSwgdm9yb25vaSkgOiB5OwogIH07Cgog IHZvcm9ub2kuZXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5n dGggPyAoZXh0ZW50ID0gXyA9PSBudWxsID8gbnVsbCA6IFtbK19bMF1bMF0sICtfWzBdWzFdXSwg WytfWzFdWzBdLCArX1sxXVsxXV1dLCB2b3Jvbm9pKSA6IGV4dGVudCAmJiBbW2V4dGVudFswXVsw XSwgZXh0ZW50WzBdWzFdXSwgW2V4dGVudFsxXVswXSwgZXh0ZW50WzFdWzFdXV07CiAgfTsKCiAg dm9yb25vaS5zaXplID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgg PyAoZXh0ZW50ID0gXyA9PSBudWxsID8gbnVsbCA6IFtbMCwgMF0sIFsrX1swXSwgK19bMV1dXSwg dm9yb25vaSkgOiBleHRlbnQgJiYgW2V4dGVudFsxXVswXSAtIGV4dGVudFswXVswXSwgZXh0ZW50 WzFdWzFdIC0gZXh0ZW50WzBdWzFdXTsKICB9OwoKICByZXR1cm4gdm9yb25vaTsKfQoKZnVuY3Rp b24gY29uc3RhbnQkZCh4KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHg7CiAg fTsKfQoKZnVuY3Rpb24gWm9vbUV2ZW50KHRhcmdldCwgdHlwZSwgdHJhbnNmb3JtKSB7CiAgdGhp cy50YXJnZXQgPSB0YXJnZXQ7CiAgdGhpcy50eXBlID0gdHlwZTsKICB0aGlzLnRyYW5zZm9ybSA9 IHRyYW5zZm9ybTsKfQoKZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHsKICB0aGlzLmsgPSBr OwogIHRoaXMueCA9IHg7CiAgdGhpcy55ID0geTsKfQoKVHJhbnNmb3JtLnByb3RvdHlwZSA9IHsK ICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLAogIHNjYWxlOiBmdW5jdGlvbihrKSB7CiAgICByZXR1 cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhp cy55KTsKICB9LAogIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSkgewogICAgcmV0dXJuIHggPT09 IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlz LmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTsKICB9LAogIGFwcGx5OiBmdW5jdGlvbihwb2lu dCkgewogICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0 aGlzLmsgKyB0aGlzLnldOwogIH0sCiAgYXBwbHlYOiBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4g eCAqIHRoaXMuayArIHRoaXMueDsKICB9LAogIGFwcGx5WTogZnVuY3Rpb24oeSkgewogICAgcmV0 dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7CiAgfSwKICBpbnZlcnQ6IGZ1bmN0aW9uKGxvY2F0aW9u KSB7CiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlv blsxXSAtIHRoaXMueSkgLyB0aGlzLmtdOwogIH0sCiAgaW52ZXJ0WDogZnVuY3Rpb24oeCkgewog ICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuazsKICB9LAogIGludmVydFk6IGZ1bmN0aW9u KHkpIHsKICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7CiAgfSwKICByZXNjYWxlWDog ZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRo aXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7CiAgfSwKICByZXNjYWxlWTogZnVu Y3Rpb24oeSkgewogICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMu aW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7CiAgfSwKICB0b1N0cmluZzogZnVuY3Rp b24oKSB7CiAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgdGhpcy54ICsgIiwiICsgdGhpcy55ICsg Iikgc2NhbGUoIiArIHRoaXMuayArICIpIjsKICB9Cn07Cgp2YXIgaWRlbnRpdHkkOSA9IG5ldyBU cmFuc2Zvcm0oMSwgMCwgMCk7Cgp0cmFuc2Zvcm0kMS5wcm90b3R5cGUgPSBUcmFuc2Zvcm0ucHJv dG90eXBlOwoKZnVuY3Rpb24gdHJhbnNmb3JtJDEobm9kZSkgewogIHdoaWxlICghbm9kZS5fX3pv b20pIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm4gaWRlbnRpdHkkOTsKICBy ZXR1cm4gbm9kZS5fX3pvb207Cn0KCmZ1bmN0aW9uIG5vcHJvcGFnYXRpb24kMigpIHsKICBleHBv cnRzLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwp9CgpmdW5jdGlvbiBub2V2ZW50 JDIoKSB7CiAgZXhwb3J0cy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogIGV4cG9ydHMuZXZlbnQu c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7Cn0KCi8vIElnbm9yZSByaWdodC1jbGljaywgc2lu Y2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LgpmdW5jdGlvbiBkZWZhdWx0Rmls dGVyJDIoKSB7CiAgcmV0dXJuICFleHBvcnRzLmV2ZW50LmN0cmxLZXkgJiYgIWV4cG9ydHMuZXZl bnQuYnV0dG9uOwp9CgpmdW5jdGlvbiBkZWZhdWx0RXh0ZW50JDEoKSB7CiAgdmFyIGUgPSB0aGlz OwogIGlmIChlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgewogICAgZSA9IGUub3duZXJTVkdFbGVt ZW50IHx8IGU7CiAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoInZpZXdCb3giKSkgewogICAgICBlID0g ZS52aWV3Qm94LmJhc2VWYWw7CiAgICAgIHJldHVybiBbW2UueCwgZS55XSwgW2UueCArIGUud2lk dGgsIGUueSArIGUuaGVpZ2h0XV07CiAgICB9CiAgICByZXR1cm4gW1swLCAwXSwgW2Uud2lkdGgu YmFzZVZhbC52YWx1ZSwgZS5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dOwogIH0KICByZXR1cm4gW1sw LCAwXSwgW2UuY2xpZW50V2lkdGgsIGUuY2xpZW50SGVpZ2h0XV07Cn0KCmZ1bmN0aW9uIGRlZmF1 bHRUcmFuc2Zvcm0oKSB7CiAgcmV0dXJuIHRoaXMuX196b29tIHx8IGlkZW50aXR5JDk7Cn0KCmZ1 bmN0aW9uIGRlZmF1bHRXaGVlbERlbHRhKCkgewogIHJldHVybiAtZXhwb3J0cy5ldmVudC5kZWx0 YVkgKiAoZXhwb3J0cy5ldmVudC5kZWx0YU1vZGUgPT09IDEgPyAwLjA1IDogZXhwb3J0cy5ldmVu dC5kZWx0YU1vZGUgPyAxIDogMC4wMDIpOwp9CgpmdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlJDIo KSB7CiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoIm9udG91Y2hzdGFydCIg aW4gdGhpcyk7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRDb25zdHJhaW4odHJhbnNmb3JtLCBleHRlbnQs IHRyYW5zbGF0ZUV4dGVudCkgewogIHZhciBkeDAgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRb MF1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzBdLAogICAgICBkeDEgPSB0cmFuc2Zvcm0uaW52 ZXJ0WChleHRlbnRbMV1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzBdLAogICAgICBkeTAgPSB0 cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMF1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzFdLAog ICAgICBkeTEgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMV1bMV0pIC0gdHJhbnNsYXRlRXh0 ZW50WzFdWzFdOwogIHJldHVybiB0cmFuc2Zvcm0udHJhbnNsYXRlKAogICAgZHgxID4gZHgwID8g KGR4MCArIGR4MSkgLyAyIDogTWF0aC5taW4oMCwgZHgwKSB8fCBNYXRoLm1heCgwLCBkeDEpLAog ICAgZHkxID4gZHkwID8gKGR5MCArIGR5MSkgLyAyIDogTWF0aC5taW4oMCwgZHkwKSB8fCBNYXRo Lm1heCgwLCBkeTEpCiAgKTsKfQoKZnVuY3Rpb24gem9vbSgpIHsKICB2YXIgZmlsdGVyID0gZGVm YXVsdEZpbHRlciQyLAogICAgICBleHRlbnQgPSBkZWZhdWx0RXh0ZW50JDEsCiAgICAgIGNvbnN0 cmFpbiA9IGRlZmF1bHRDb25zdHJhaW4sCiAgICAgIHdoZWVsRGVsdGEgPSBkZWZhdWx0V2hlZWxE ZWx0YSwKICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSQyLAogICAgICBzY2FsZUV4 dGVudCA9IFswLCBJbmZpbml0eV0sCiAgICAgIHRyYW5zbGF0ZUV4dGVudCA9IFtbLUluZmluaXR5 LCAtSW5maW5pdHldLCBbSW5maW5pdHksIEluZmluaXR5XV0sCiAgICAgIGR1cmF0aW9uID0gMjUw LAogICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlWm9vbSwKICAgICAgbGlzdGVuZXJzID0g ZGlzcGF0Y2goInN0YXJ0IiwgInpvb20iLCAiZW5kIiksCiAgICAgIHRvdWNoc3RhcnRpbmcsCiAg ICAgIHRvdWNoZW5kaW5nLAogICAgICB0b3VjaERlbGF5ID0gNTAwLAogICAgICB3aGVlbERlbGF5 ID0gMTUwLAogICAgICBjbGlja0Rpc3RhbmNlMiA9IDA7CgogIGZ1bmN0aW9uIHpvb20oc2VsZWN0 aW9uKSB7CiAgICBzZWxlY3Rpb24KICAgICAgICAucHJvcGVydHkoIl9fem9vbSIsIGRlZmF1bHRU cmFuc2Zvcm0pCiAgICAgICAgLm9uKCJ3aGVlbC56b29tIiwgd2hlZWxlZCkKICAgICAgICAub24o Im1vdXNlZG93bi56b29tIiwgbW91c2Vkb3duZWQpCiAgICAgICAgLm9uKCJkYmxjbGljay56b29t IiwgZGJsY2xpY2tlZCkKICAgICAgLmZpbHRlcih0b3VjaGFibGUpCiAgICAgICAgLm9uKCJ0b3Vj aHN0YXJ0Lnpvb20iLCB0b3VjaHN0YXJ0ZWQpCiAgICAgICAgLm9uKCJ0b3VjaG1vdmUuem9vbSIs IHRvdWNobW92ZWQpCiAgICAgICAgLm9uKCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb20i LCB0b3VjaGVuZGVkKQogICAgICAgIC5zdHlsZSgidG91Y2gtYWN0aW9uIiwgIm5vbmUiKQogICAg ICAgIC5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwgInJnYmEoMCwwLDAsMCki KTsKICB9CgogIHpvb20udHJhbnNmb3JtID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgdHJhbnNmb3Jt LCBwb2ludCkgewogICAgdmFyIHNlbGVjdGlvbiA9IGNvbGxlY3Rpb24uc2VsZWN0aW9uID8gY29s bGVjdGlvbi5zZWxlY3Rpb24oKSA6IGNvbGxlY3Rpb247CiAgICBzZWxlY3Rpb24ucHJvcGVydHko Il9fem9vbSIsIGRlZmF1bHRUcmFuc2Zvcm0pOwogICAgaWYgKGNvbGxlY3Rpb24gIT09IHNlbGVj dGlvbikgewogICAgICBzY2hlZHVsZShjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50KTsKICAg IH0gZWxzZSB7CiAgICAgIHNlbGVjdGlvbi5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCkgewog ICAgICAgIGdlc3R1cmUodGhpcywgYXJndW1lbnRzKQogICAgICAgICAgICAuc3RhcnQoKQogICAg ICAgICAgICAuem9vbShudWxsLCB0eXBlb2YgdHJhbnNmb3JtID09PSAiZnVuY3Rpb24iID8gdHJh bnNmb3JtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB0cmFuc2Zvcm0pCiAgICAgICAgICAgIC5l bmQoKTsKICAgICAgfSk7CiAgICB9CiAgfTsKCiAgem9vbS5zY2FsZUJ5ID0gZnVuY3Rpb24oc2Vs ZWN0aW9uLCBrLCBwKSB7CiAgICB6b29tLnNjYWxlVG8oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHsK ICAgICAgdmFyIGswID0gdGhpcy5fX3pvb20uaywKICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09 ICJmdW5jdGlvbiIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrOwogICAgICByZXR1cm4g azAgKiBrMTsKICAgIH0sIHApOwogIH07CgogIHpvb20uc2NhbGVUbyA9IGZ1bmN0aW9uKHNlbGVj dGlvbiwgaywgcCkgewogICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHsK ICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgIHQw ID0gdGhpcy5fX3pvb20sCiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDog dHlwZW9mIHAgPT09ICJmdW5jdGlvbiIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwLAog ICAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLAogICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0g ImZ1bmN0aW9uIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7CiAgICAgIHJldHVybiBj b25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGUsIHRyYW5zbGF0ZUV4 dGVudCk7CiAgICB9LCBwKTsKICB9OwoKICB6b29tLnRyYW5zbGF0ZUJ5ID0gZnVuY3Rpb24oc2Vs ZWN0aW9uLCB4LCB5KSB7CiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkg ewogICAgICByZXR1cm4gY29uc3RyYWluKHRoaXMuX196b29tLnRyYW5zbGF0ZSgKICAgICAgICB0 eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHgsCiAg ICAgICAgdHlwZW9mIHkgPT09ICJmdW5jdGlvbiIgPyB5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykg OiB5CiAgICAgICksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRl bnQpOwogICAgfSk7CiAgfTsKCiAgem9vbS50cmFuc2xhdGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlv biwgeCwgeSwgcCkgewogICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHsK ICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgIHQg PSB0aGlzLl9fem9vbSwKICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0 eXBlb2YgcCA9PT0gImZ1bmN0aW9uIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHA7CiAg ICAgIHJldHVybiBjb25zdHJhaW4oaWRlbnRpdHkkOS50cmFuc2xhdGUocDBbMF0sIHAwWzFdKS5z Y2FsZSh0LmspLnRyYW5zbGF0ZSgKICAgICAgICB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IC14 LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteCwKICAgICAgICB0eXBlb2YgeSA9PT0gImZ1bmN0 aW9uIiA/IC15LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteQogICAgICApLCBlLCB0cmFuc2xh dGVFeHRlbnQpOwogICAgfSwgcCk7CiAgfTsKCiAgZnVuY3Rpb24gc2NhbGUodHJhbnNmb3JtLCBr KSB7CiAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50 WzFdLCBrKSk7CiAgICByZXR1cm4gayA9PT0gdHJhbnNmb3JtLmsgPyB0cmFuc2Zvcm0gOiBuZXcg VHJhbnNmb3JtKGssIHRyYW5zZm9ybS54LCB0cmFuc2Zvcm0ueSk7CiAgfQoKICBmdW5jdGlvbiB0 cmFuc2xhdGUodHJhbnNmb3JtLCBwMCwgcDEpIHsKICAgIHZhciB4ID0gcDBbMF0gLSBwMVswXSAq IHRyYW5zZm9ybS5rLCB5ID0gcDBbMV0gLSBwMVsxXSAqIHRyYW5zZm9ybS5rOwogICAgcmV0dXJu IHggPT09IHRyYW5zZm9ybS54ICYmIHkgPT09IHRyYW5zZm9ybS55ID8gdHJhbnNmb3JtIDogbmV3 IFRyYW5zZm9ybSh0cmFuc2Zvcm0uaywgeCwgeSk7CiAgfQoKICBmdW5jdGlvbiBjZW50cm9pZChl eHRlbnQpIHsKICAgIHJldHVybiBbKCtleHRlbnRbMF1bMF0gKyArZXh0ZW50WzFdWzBdKSAvIDIs ICgrZXh0ZW50WzBdWzFdICsgK2V4dGVudFsxXVsxXSkgLyAyXTsKICB9CgogIGZ1bmN0aW9uIHNj aGVkdWxlKHRyYW5zaXRpb24sIHRyYW5zZm9ybSwgcG9pbnQpIHsKICAgIHRyYW5zaXRpb24KICAg ICAgICAub24oInN0YXJ0Lnpvb20iLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVu dHMpLnN0YXJ0KCk7IH0pCiAgICAgICAgLm9uKCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbSIsIGZ1 bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZW5kKCk7IH0pCiAgICAgICAgLnR3 ZWVuKCJ6b29tIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAg ICAgICAgICAgYXJncyA9IGFyZ3VtZW50cywKICAgICAgICAgICAgICBnID0gZ2VzdHVyZSh0aGF0 LCBhcmdzKSwKICAgICAgICAgICAgICBlID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpLAogICAg ICAgICAgICAgIHAgPSBwb2ludCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcG9pbnQg PT09ICJmdW5jdGlvbiIgPyBwb2ludC5hcHBseSh0aGF0LCBhcmdzKSA6IHBvaW50LAogICAgICAg ICAgICAgIHcgPSBNYXRoLm1heChlWzFdWzBdIC0gZVswXVswXSwgZVsxXVsxXSAtIGVbMF1bMV0p LAogICAgICAgICAgICAgIGEgPSB0aGF0Ll9fem9vbSwKICAgICAgICAgICAgICBiID0gdHlwZW9m IHRyYW5zZm9ybSA9PT0gImZ1bmN0aW9uIiA/IHRyYW5zZm9ybS5hcHBseSh0aGF0LCBhcmdzKSA6 IHRyYW5zZm9ybSwKICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoYS5pbnZlcnQocCkuY29u Y2F0KHcgLyBhLmspLCBiLmludmVydChwKS5jb25jYXQodyAvIGIuaykpOwogICAgICAgICAgcmV0 dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgICAgaWYgKHQgPT09IDEpIHQgPSBiOyAvLyBBdm9p ZCByb3VuZGluZyBlcnJvciBvbiBlbmQuCiAgICAgICAgICAgIGVsc2UgeyB2YXIgbCA9IGkodCks IGsgPSB3IC8gbFsyXTsgdCA9IG5ldyBUcmFuc2Zvcm0oaywgcFswXSAtIGxbMF0gKiBrLCBwWzFd IC0gbFsxXSAqIGspOyB9CiAgICAgICAgICAgIGcuem9vbShudWxsLCB0KTsKICAgICAgICAgIH07 CiAgICAgICAgfSk7CiAgfQoKICBmdW5jdGlvbiBnZXN0dXJlKHRoYXQsIGFyZ3MsIGNsZWFuKSB7 CiAgICByZXR1cm4gKCFjbGVhbiAmJiB0aGF0Ll9fem9vbWluZykgfHwgbmV3IEdlc3R1cmUodGhh dCwgYXJncyk7CiAgfQoKICBmdW5jdGlvbiBHZXN0dXJlKHRoYXQsIGFyZ3MpIHsKICAgIHRoaXMu dGhhdCA9IHRoYXQ7CiAgICB0aGlzLmFyZ3MgPSBhcmdzOwogICAgdGhpcy5hY3RpdmUgPSAwOwog ICAgdGhpcy5leHRlbnQgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyk7CiAgICB0aGlzLnRhcHMg PSAwOwogIH0KCiAgR2VzdHVyZS5wcm90b3R5cGUgPSB7CiAgICBzdGFydDogZnVuY3Rpb24oKSB7 CiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB7CiAgICAgICAgdGhpcy50aGF0Ll9fem9v bWluZyA9IHRoaXM7CiAgICAgICAgdGhpcy5lbWl0KCJzdGFydCIpOwogICAgICB9CiAgICAgIHJl dHVybiB0aGlzOwogICAgfSwKICAgIHpvb206IGZ1bmN0aW9uKGtleSwgdHJhbnNmb3JtKSB7CiAg ICAgIGlmICh0aGlzLm1vdXNlICYmIGtleSAhPT0gIm1vdXNlIikgdGhpcy5tb3VzZVsxXSA9IHRy YW5zZm9ybS5pbnZlcnQodGhpcy5tb3VzZVswXSk7CiAgICAgIGlmICh0aGlzLnRvdWNoMCAmJiBr ZXkgIT09ICJ0b3VjaCIpIHRoaXMudG91Y2gwWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRv dWNoMFswXSk7CiAgICAgIGlmICh0aGlzLnRvdWNoMSAmJiBrZXkgIT09ICJ0b3VjaCIpIHRoaXMu dG91Y2gxWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMVswXSk7CiAgICAgIHRoaXMu dGhhdC5fX3pvb20gPSB0cmFuc2Zvcm07CiAgICAgIHRoaXMuZW1pdCgiem9vbSIpOwogICAgICBy ZXR1cm4gdGhpczsKICAgIH0sCiAgICBlbmQ6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoLS10aGlz LmFjdGl2ZSA9PT0gMCkgewogICAgICAgIGRlbGV0ZSB0aGlzLnRoYXQuX196b29taW5nOwogICAg ICAgIHRoaXMuZW1pdCgiZW5kIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAog ICAgZW1pdDogZnVuY3Rpb24odHlwZSkgewogICAgICBjdXN0b21FdmVudChuZXcgWm9vbUV2ZW50 KHpvb20sIHR5cGUsIHRoaXMudGhhdC5fX3pvb20pLCBsaXN0ZW5lcnMuYXBwbHksIGxpc3RlbmVy cywgW3R5cGUsIHRoaXMudGhhdCwgdGhpcy5hcmdzXSk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24g d2hlZWxlZCgpIHsKICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVy bjsKICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgIHQgPSB0aGlz Ll9fem9vbSwKICAgICAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNj YWxlRXh0ZW50WzFdLCB0LmsgKiBNYXRoLnBvdygyLCB3aGVlbERlbHRhLmFwcGx5KHRoaXMsIGFy Z3VtZW50cykpKSksCiAgICAgICAgcCA9IG1vdXNlKHRoaXMpOwoKICAgIC8vIElmIHRoZSBtb3Vz ZSBpcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBiZWZvcmUsIHJldXNlIGl0LgogICAgLy8gSWYg dGhlcmUgd2VyZSByZWNlbnQgd2hlZWwgZXZlbnRzLCByZXNldCB0aGUgd2hlZWwgaWRsZSB0aW1l b3V0LgogICAgaWYgKGcud2hlZWwpIHsKICAgICAgaWYgKGcubW91c2VbMF1bMF0gIT09IHBbMF0g fHwgZy5tb3VzZVswXVsxXSAhPT0gcFsxXSkgewogICAgICAgIGcubW91c2VbMV0gPSB0LmludmVy dChnLm1vdXNlWzBdID0gcCk7CiAgICAgIH0KICAgICAgY2xlYXJUaW1lb3V0KGcud2hlZWwpOwog ICAgfQoKICAgIC8vIElmIHRoaXMgd2hlZWwgZXZlbnQgd29u4oCZdCB0cmlnZ2VyIGEgdHJhbnNm b3JtIGNoYW5nZSwgaWdub3JlIGl0LgogICAgZWxzZSBpZiAodC5rID09PSBrKSByZXR1cm47Cgog ICAgLy8gT3RoZXJ3aXNlLCBjYXB0dXJlIHRoZSBtb3VzZSBwb2ludCBhbmQgbG9jYXRpb24gYXQg dGhlIHN0YXJ0LgogICAgZWxzZSB7CiAgICAgIGcubW91c2UgPSBbcCwgdC5pbnZlcnQocCldOwog ICAgICBpbnRlcnJ1cHQodGhpcyk7CiAgICAgIGcuc3RhcnQoKTsKICAgIH0KCiAgICBub2V2ZW50 JDIoKTsKICAgIGcud2hlZWwgPSBzZXRUaW1lb3V0KHdoZWVsaWRsZWQsIHdoZWVsRGVsYXkpOwog ICAgZy56b29tKCJtb3VzZSIsIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodCwgayksIGcubW91 c2VbMF0sIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7CgogICAgZnVu Y3Rpb24gd2hlZWxpZGxlZCgpIHsKICAgICAgZy53aGVlbCA9IG51bGw7CiAgICAgIGcuZW5kKCk7 CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtb3VzZWRvd25lZCgpIHsKICAgIGlmICh0b3VjaGVuZGlu ZyB8fCAhZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKICAgIHZhciBnID0g Z2VzdHVyZSh0aGlzLCBhcmd1bWVudHMsIHRydWUpLAogICAgICAgIHYgPSBzZWxlY3QoZXhwb3J0 cy5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLnpvb20iLCBtb3VzZW1vdmVkLCB0cnVlKS5vbigi bW91c2V1cC56b29tIiwgbW91c2V1cHBlZCwgdHJ1ZSksCiAgICAgICAgcCA9IG1vdXNlKHRoaXMp LAogICAgICAgIHgwID0gZXhwb3J0cy5ldmVudC5jbGllbnRYLAogICAgICAgIHkwID0gZXhwb3J0 cy5ldmVudC5jbGllbnRZOwoKICAgIGRyYWdEaXNhYmxlKGV4cG9ydHMuZXZlbnQudmlldyk7CiAg ICBub3Byb3BhZ2F0aW9uJDIoKTsKICAgIGcubW91c2UgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0 KHApXTsKICAgIGludGVycnVwdCh0aGlzKTsKICAgIGcuc3RhcnQoKTsKCiAgICBmdW5jdGlvbiBt b3VzZW1vdmVkKCkgewogICAgICBub2V2ZW50JDIoKTsKICAgICAgaWYgKCFnLm1vdmVkKSB7CiAg ICAgICAgdmFyIGR4ID0gZXhwb3J0cy5ldmVudC5jbGllbnRYIC0geDAsIGR5ID0gZXhwb3J0cy5l dmVudC5jbGllbnRZIC0geTA7CiAgICAgICAgZy5tb3ZlZCA9IGR4ICogZHggKyBkeSAqIGR5ID4g Y2xpY2tEaXN0YW5jZTI7CiAgICAgIH0KICAgICAgZy56b29tKCJtb3VzZSIsIGNvbnN0cmFpbih0 cmFuc2xhdGUoZy50aGF0Ll9fem9vbSwgZy5tb3VzZVswXSA9IG1vdXNlKGcudGhhdCksIGcubW91 c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7CiAgICB9CgogICAgZnVuY3Rpb24g bW91c2V1cHBlZCgpIHsKICAgICAgdi5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIiwg bnVsbCk7CiAgICAgIHllc2RyYWcoZXhwb3J0cy5ldmVudC52aWV3LCBnLm1vdmVkKTsKICAgICAg bm9ldmVudCQyKCk7CiAgICAgIGcuZW5kKCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkYmxjbGlj a2VkKCkgewogICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuOwog ICAgdmFyIHQwID0gdGhpcy5fX3pvb20sCiAgICAgICAgcDAgPSBtb3VzZSh0aGlzKSwKICAgICAg ICBwMSA9IHQwLmludmVydChwMCksCiAgICAgICAgazEgPSB0MC5rICogKGV4cG9ydHMuZXZlbnQu c2hpZnRLZXkgPyAwLjUgOiAyKSwKICAgICAgICB0MSA9IGNvbnN0cmFpbih0cmFuc2xhdGUoc2Nh bGUodDAsIGsxKSwgcDAsIHAxKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRyYW5z bGF0ZUV4dGVudCk7CgogICAgbm9ldmVudCQyKCk7CiAgICBpZiAoZHVyYXRpb24gPiAwKSBzZWxl Y3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKHNjaGVkdWxlLCB0 MSwgcDApOwogICAgZWxzZSBzZWxlY3QodGhpcykuY2FsbCh6b29tLnRyYW5zZm9ybSwgdDEpOwog IH0KCiAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKCkgewogICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhp cywgYXJndW1lbnRzKSkgcmV0dXJuOwogICAgdmFyIHRvdWNoZXMgPSBleHBvcnRzLmV2ZW50LnRv dWNoZXMsCiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLAogICAgICAgIGcgPSBnZXN0dXJlKHRo aXMsIGFyZ3VtZW50cywgZXhwb3J0cy5ldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPT09IG4p LAogICAgICAgIHN0YXJ0ZWQsIGksIHQsIHA7CgogICAgbm9wcm9wYWdhdGlvbiQyKCk7CiAgICBm b3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gdG91Y2go dGhpcywgdG91Y2hlcywgdC5pZGVudGlmaWVyKTsKICAgICAgcCA9IFtwLCB0aGlzLl9fem9vbS5p bnZlcnQocCksIHQuaWRlbnRpZmllcl07CiAgICAgIGlmICghZy50b3VjaDApIGcudG91Y2gwID0g cCwgc3RhcnRlZCA9IHRydWUsIGcudGFwcyA9IDEgKyAhIXRvdWNoc3RhcnRpbmc7CiAgICAgIGVs c2UgaWYgKCFnLnRvdWNoMSAmJiBnLnRvdWNoMFsyXSAhPT0gcFsyXSkgZy50b3VjaDEgPSBwLCBn LnRhcHMgPSAwOwogICAgfQoKICAgIGlmICh0b3VjaHN0YXJ0aW5nKSB0b3VjaHN0YXJ0aW5nID0g Y2xlYXJUaW1lb3V0KHRvdWNoc3RhcnRpbmcpOwoKICAgIGlmIChzdGFydGVkKSB7CiAgICAgIGlm IChnLnRhcHMgPCAyKSB0b3VjaHN0YXJ0aW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91 Y2hzdGFydGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpOwogICAgICBpbnRlcnJ1cHQodGhpcyk7 CiAgICAgIGcuc3RhcnQoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRvdWNobW92ZWQoKSB7CiAg ICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47CiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywg YXJndW1lbnRzKSwKICAgICAgICB0b3VjaGVzID0gZXhwb3J0cy5ldmVudC5jaGFuZ2VkVG91Y2hl cywKICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQsIHAsIGw7CgogICAgbm9ldmVudCQy KCk7CiAgICBpZiAodG91Y2hzdGFydGluZykgdG91Y2hzdGFydGluZyA9IGNsZWFyVGltZW91dCh0 b3VjaHN0YXJ0aW5nKTsKICAgIGcudGFwcyA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytp KSB7CiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gdG91Y2godGhpcywgdG91Y2hlcywgdC5pZGVu dGlmaWVyKTsKICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZp ZXIpIGcudG91Y2gwWzBdID0gcDsKICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFb Ml0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDFbMF0gPSBwOwogICAgfQogICAgdCA9IGcudGhh dC5fX3pvb207CiAgICBpZiAoZy50b3VjaDEpIHsKICAgICAgdmFyIHAwID0gZy50b3VjaDBbMF0s IGwwID0gZy50b3VjaDBbMV0sCiAgICAgICAgICBwMSA9IGcudG91Y2gxWzBdLCBsMSA9IGcudG91 Y2gxWzFdLAogICAgICAgICAgZHAgPSAoZHAgPSBwMVswXSAtIHAwWzBdKSAqIGRwICsgKGRwID0g cDFbMV0gLSBwMFsxXSkgKiBkcCwKICAgICAgICAgIGRsID0gKGRsID0gbDFbMF0gLSBsMFswXSkg KiBkbCArIChkbCA9IGwxWzFdIC0gbDBbMV0pICogZGw7CiAgICAgIHQgPSBzY2FsZSh0LCBNYXRo LnNxcnQoZHAgLyBkbCkpOwogICAgICBwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSAr IHAxWzFdKSAvIDJdOwogICAgICBsID0gWyhsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwx WzFdKSAvIDJdOwogICAgfQogICAgZWxzZSBpZiAoZy50b3VjaDApIHAgPSBnLnRvdWNoMFswXSwg bCA9IGcudG91Y2gwWzFdOwogICAgZWxzZSByZXR1cm47CiAgICBnLnpvb20oInRvdWNoIiwgY29u c3RyYWluKHRyYW5zbGF0ZSh0LCBwLCBsKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpOwog IH0KCiAgZnVuY3Rpb24gdG91Y2hlbmRlZCgpIHsKICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJl dHVybjsKICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgIHRvdWNo ZXMgPSBleHBvcnRzLmV2ZW50LmNoYW5nZWRUb3VjaGVzLAogICAgICAgIG4gPSB0b3VjaGVzLmxl bmd0aCwgaSwgdDsKCiAgICBub3Byb3BhZ2F0aW9uJDIoKTsKICAgIGlmICh0b3VjaGVuZGluZykg Y2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTsKICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChm dW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTsKICAgIGZvciAo aSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgdCA9IHRvdWNoZXNbaV07CiAgICAgIGlmIChnLnRv dWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDA7CiAg ICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGRl bGV0ZSBnLnRvdWNoMTsKICAgIH0KICAgIGlmIChnLnRvdWNoMSAmJiAhZy50b3VjaDApIGcudG91 Y2gwID0gZy50b3VjaDEsIGRlbGV0ZSBnLnRvdWNoMTsKICAgIGlmIChnLnRvdWNoMCkgZy50b3Vj aDBbMV0gPSB0aGlzLl9fem9vbS5pbnZlcnQoZy50b3VjaDBbMF0pOwogICAgZWxzZSB7CiAgICAg IGcuZW5kKCk7CiAgICAgIC8vIElmIHRoaXMgd2FzIGEgZGJsdGFwLCByZXJvdXRlIHRvIHRoZSAo b3B0aW9uYWwpIGRibGNsaWNrLnpvb20gaGFuZGxlci4KICAgICAgaWYgKGcudGFwcyA9PT0gMikg ewogICAgICAgIHZhciBwID0gc2VsZWN0KHRoaXMpLm9uKCJkYmxjbGljay56b29tIik7CiAgICAg ICAgaWYgKHApIHAuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfQogICAgfQogIH0KCiAg em9vbS53aGVlbERlbHRhID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5n dGggPyAod2hlZWxEZWx0YSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50 JGQoK18pLCB6b29tKSA6IHdoZWVsRGVsdGE7CiAgfTsKCiAgem9vbS5maWx0ZXIgPSBmdW5jdGlv bihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9 PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRkKCEhXyksIHpvb20pIDogZmlsdGVyOwogIH07 CgogIHpvb20udG91Y2hhYmxlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5s ZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3Rh bnQkZCghIV8pLCB6b29tKSA6IHRvdWNoYWJsZTsKICB9OwoKICB6b29tLmV4dGVudCA9IGZ1bmN0 aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBf ID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGQoW1srX1swXVswXSwgK19bMF1bMV1dLCBb K19bMV1bMF0sICtfWzFdWzFdXV0pLCB6b29tKSA6IGV4dGVudDsKICB9OwoKICB6b29tLnNjYWxl RXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2Nh bGVFeHRlbnRbMF0gPSArX1swXSwgc2NhbGVFeHRlbnRbMV0gPSArX1sxXSwgem9vbSkgOiBbc2Nh bGVFeHRlbnRbMF0sIHNjYWxlRXh0ZW50WzFdXTsKICB9OwoKICB6b29tLnRyYW5zbGF0ZUV4dGVu dCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zbGF0 ZUV4dGVudFswXVswXSA9ICtfWzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMF0gPSArX1sxXVsw XSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdID0gK19bMF1bMV0sIHRyYW5zbGF0ZUV4dGVudFsxXVsx XSA9ICtfWzFdWzFdLCB6b29tKSA6IFtbdHJhbnNsYXRlRXh0ZW50WzBdWzBdLCB0cmFuc2xhdGVF eHRlbnRbMF1bMV1dLCBbdHJhbnNsYXRlRXh0ZW50WzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1b MV1dXTsKICB9OwoKICB6b29tLmNvbnN0cmFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBh cmd1bWVudHMubGVuZ3RoID8gKGNvbnN0cmFpbiA9IF8sIHpvb20pIDogY29uc3RyYWluOwogIH07 CgogIHpvb20uZHVyYXRpb24gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/IChkdXJhdGlvbiA9ICtfLCB6b29tKSA6IGR1cmF0aW9uOwogIH07CgogIHpvb20uaW50 ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChp bnRlcnBvbGF0ZSA9IF8sIHpvb20pIDogaW50ZXJwb2xhdGU7CiAgfTsKCiAgem9vbS5vbiA9IGZ1 bmN0aW9uKCkgewogICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywg YXJndW1lbnRzKTsKICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gem9vbSA6IHZhbHVl OwogIH07CgogIHpvb20uY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBh cmd1bWVudHMubGVuZ3RoID8gKGNsaWNrRGlzdGFuY2UyID0gKF8gPSArXykgKiBfLCB6b29tKSA6 IE1hdGguc3FydChjbGlja0Rpc3RhbmNlMik7CiAgfTsKCiAgcmV0dXJuIHpvb207Cn0KCmV4cG9y dHMuRm9ybWF0U3BlY2lmaWVyID0gRm9ybWF0U3BlY2lmaWVyOwpleHBvcnRzLmFjdGl2ZSA9IGFj dGl2ZTsKZXhwb3J0cy5hcmMgPSBhcmM7CmV4cG9ydHMuYXJlYSA9IGFyZWEkMzsKZXhwb3J0cy5h cmVhUmFkaWFsID0gYXJlYVJhZGlhbDsKZXhwb3J0cy5hc2NlbmRpbmcgPSBhc2NlbmRpbmc7CmV4 cG9ydHMuYXV0b1R5cGUgPSBhdXRvVHlwZTsKZXhwb3J0cy5heGlzQm90dG9tID0gYXhpc0JvdHRv bTsKZXhwb3J0cy5heGlzTGVmdCA9IGF4aXNMZWZ0OwpleHBvcnRzLmF4aXNSaWdodCA9IGF4aXNS aWdodDsKZXhwb3J0cy5heGlzVG9wID0gYXhpc1RvcDsKZXhwb3J0cy5iaXNlY3QgPSBiaXNlY3RS aWdodDsKZXhwb3J0cy5iaXNlY3RMZWZ0ID0gYmlzZWN0TGVmdDsKZXhwb3J0cy5iaXNlY3RSaWdo dCA9IGJpc2VjdFJpZ2h0OwpleHBvcnRzLmJpc2VjdG9yID0gYmlzZWN0b3I7CmV4cG9ydHMuYmxv YiA9IGJsb2I7CmV4cG9ydHMuYnJ1c2ggPSBicnVzaDsKZXhwb3J0cy5icnVzaFNlbGVjdGlvbiA9 IGJydXNoU2VsZWN0aW9uOwpleHBvcnRzLmJydXNoWCA9IGJydXNoWDsKZXhwb3J0cy5icnVzaFkg PSBicnVzaFk7CmV4cG9ydHMuYnVmZmVyID0gYnVmZmVyOwpleHBvcnRzLmNob3JkID0gY2hvcmQ7 CmV4cG9ydHMuY2xpZW50UG9pbnQgPSBwb2ludDsKZXhwb3J0cy5jbHVzdGVyID0gY2x1c3RlcjsK ZXhwb3J0cy5jb2xvciA9IGNvbG9yOwpleHBvcnRzLmNvbnRvdXJEZW5zaXR5ID0gZGVuc2l0eTsK ZXhwb3J0cy5jb250b3VycyA9IGNvbnRvdXJzOwpleHBvcnRzLmNyZWF0ZSA9IGNyZWF0ZTsKZXhw b3J0cy5jcmVhdG9yID0gY3JlYXRvcjsKZXhwb3J0cy5jcm9zcyA9IGNyb3NzOwpleHBvcnRzLmNz diA9IGNzdiQxOwpleHBvcnRzLmNzdkZvcm1hdCA9IGNzdkZvcm1hdDsKZXhwb3J0cy5jc3ZGb3Jt YXRCb2R5ID0gY3N2Rm9ybWF0Qm9keTsKZXhwb3J0cy5jc3ZGb3JtYXRSb3cgPSBjc3ZGb3JtYXRS b3c7CmV4cG9ydHMuY3N2Rm9ybWF0Um93cyA9IGNzdkZvcm1hdFJvd3M7CmV4cG9ydHMuY3N2Rm9y bWF0VmFsdWUgPSBjc3ZGb3JtYXRWYWx1ZTsKZXhwb3J0cy5jc3ZQYXJzZSA9IGNzdlBhcnNlOwpl eHBvcnRzLmNzdlBhcnNlUm93cyA9IGNzdlBhcnNlUm93czsKZXhwb3J0cy5jdWJlaGVsaXggPSBj dWJlaGVsaXg7CmV4cG9ydHMuY3VydmVCYXNpcyA9IGJhc2lzJDI7CmV4cG9ydHMuY3VydmVCYXNp c0Nsb3NlZCA9IGJhc2lzQ2xvc2VkJDE7CmV4cG9ydHMuY3VydmVCYXNpc09wZW4gPSBiYXNpc09w ZW47CmV4cG9ydHMuY3VydmVCdW5kbGUgPSBidW5kbGU7CmV4cG9ydHMuY3VydmVDYXJkaW5hbCA9 IGNhcmRpbmFsOwpleHBvcnRzLmN1cnZlQ2FyZGluYWxDbG9zZWQgPSBjYXJkaW5hbENsb3NlZDsK ZXhwb3J0cy5jdXJ2ZUNhcmRpbmFsT3BlbiA9IGNhcmRpbmFsT3BlbjsKZXhwb3J0cy5jdXJ2ZUNh dG11bGxSb20gPSBjYXRtdWxsUm9tOwpleHBvcnRzLmN1cnZlQ2F0bXVsbFJvbUNsb3NlZCA9IGNh dG11bGxSb21DbG9zZWQ7CmV4cG9ydHMuY3VydmVDYXRtdWxsUm9tT3BlbiA9IGNhdG11bGxSb21P cGVuOwpleHBvcnRzLmN1cnZlTGluZWFyID0gY3VydmVMaW5lYXI7CmV4cG9ydHMuY3VydmVMaW5l YXJDbG9zZWQgPSBsaW5lYXJDbG9zZWQ7CmV4cG9ydHMuY3VydmVNb25vdG9uZVggPSBtb25vdG9u ZVg7CmV4cG9ydHMuY3VydmVNb25vdG9uZVkgPSBtb25vdG9uZVk7CmV4cG9ydHMuY3VydmVOYXR1 cmFsID0gbmF0dXJhbDsKZXhwb3J0cy5jdXJ2ZVN0ZXAgPSBzdGVwOwpleHBvcnRzLmN1cnZlU3Rl cEFmdGVyID0gc3RlcEFmdGVyOwpleHBvcnRzLmN1cnZlU3RlcEJlZm9yZSA9IHN0ZXBCZWZvcmU7 CmV4cG9ydHMuY3VzdG9tRXZlbnQgPSBjdXN0b21FdmVudDsKZXhwb3J0cy5kZXNjZW5kaW5nID0g ZGVzY2VuZGluZzsKZXhwb3J0cy5kZXZpYXRpb24gPSBkZXZpYXRpb247CmV4cG9ydHMuZGlzcGF0 Y2ggPSBkaXNwYXRjaDsKZXhwb3J0cy5kcmFnID0gZHJhZzsKZXhwb3J0cy5kcmFnRGlzYWJsZSA9 IGRyYWdEaXNhYmxlOwpleHBvcnRzLmRyYWdFbmFibGUgPSB5ZXNkcmFnOwpleHBvcnRzLmRzdiA9 IGRzdjsKZXhwb3J0cy5kc3ZGb3JtYXQgPSBkc3ZGb3JtYXQ7CmV4cG9ydHMuZWFzZUJhY2sgPSBi YWNrSW5PdXQ7CmV4cG9ydHMuZWFzZUJhY2tJbiA9IGJhY2tJbjsKZXhwb3J0cy5lYXNlQmFja0lu T3V0ID0gYmFja0luT3V0OwpleHBvcnRzLmVhc2VCYWNrT3V0ID0gYmFja091dDsKZXhwb3J0cy5l YXNlQm91bmNlID0gYm91bmNlT3V0OwpleHBvcnRzLmVhc2VCb3VuY2VJbiA9IGJvdW5jZUluOwpl eHBvcnRzLmVhc2VCb3VuY2VJbk91dCA9IGJvdW5jZUluT3V0OwpleHBvcnRzLmVhc2VCb3VuY2VP dXQgPSBib3VuY2VPdXQ7CmV4cG9ydHMuZWFzZUNpcmNsZSA9IGNpcmNsZUluT3V0OwpleHBvcnRz LmVhc2VDaXJjbGVJbiA9IGNpcmNsZUluOwpleHBvcnRzLmVhc2VDaXJjbGVJbk91dCA9IGNpcmNs ZUluT3V0OwpleHBvcnRzLmVhc2VDaXJjbGVPdXQgPSBjaXJjbGVPdXQ7CmV4cG9ydHMuZWFzZUN1 YmljID0gY3ViaWNJbk91dDsKZXhwb3J0cy5lYXNlQ3ViaWNJbiA9IGN1YmljSW47CmV4cG9ydHMu ZWFzZUN1YmljSW5PdXQgPSBjdWJpY0luT3V0OwpleHBvcnRzLmVhc2VDdWJpY091dCA9IGN1Ymlj T3V0OwpleHBvcnRzLmVhc2VFbGFzdGljID0gZWxhc3RpY091dDsKZXhwb3J0cy5lYXNlRWxhc3Rp Y0luID0gZWxhc3RpY0luOwpleHBvcnRzLmVhc2VFbGFzdGljSW5PdXQgPSBlbGFzdGljSW5PdXQ7 CmV4cG9ydHMuZWFzZUVsYXN0aWNPdXQgPSBlbGFzdGljT3V0OwpleHBvcnRzLmVhc2VFeHAgPSBl eHBJbk91dDsKZXhwb3J0cy5lYXNlRXhwSW4gPSBleHBJbjsKZXhwb3J0cy5lYXNlRXhwSW5PdXQg PSBleHBJbk91dDsKZXhwb3J0cy5lYXNlRXhwT3V0ID0gZXhwT3V0OwpleHBvcnRzLmVhc2VMaW5l YXIgPSBsaW5lYXIkMTsKZXhwb3J0cy5lYXNlUG9seSA9IHBvbHlJbk91dDsKZXhwb3J0cy5lYXNl UG9seUluID0gcG9seUluOwpleHBvcnRzLmVhc2VQb2x5SW5PdXQgPSBwb2x5SW5PdXQ7CmV4cG9y dHMuZWFzZVBvbHlPdXQgPSBwb2x5T3V0OwpleHBvcnRzLmVhc2VRdWFkID0gcXVhZEluT3V0Owpl eHBvcnRzLmVhc2VRdWFkSW4gPSBxdWFkSW47CmV4cG9ydHMuZWFzZVF1YWRJbk91dCA9IHF1YWRJ bk91dDsKZXhwb3J0cy5lYXNlUXVhZE91dCA9IHF1YWRPdXQ7CmV4cG9ydHMuZWFzZVNpbiA9IHNp bkluT3V0OwpleHBvcnRzLmVhc2VTaW5JbiA9IHNpbkluOwpleHBvcnRzLmVhc2VTaW5Jbk91dCA9 IHNpbkluT3V0OwpleHBvcnRzLmVhc2VTaW5PdXQgPSBzaW5PdXQ7CmV4cG9ydHMuZW50cmllcyA9 IGVudHJpZXM7CmV4cG9ydHMuZXh0ZW50ID0gZXh0ZW50OwpleHBvcnRzLmZvcmNlQ2VudGVyID0g Y2VudGVyJDE7CmV4cG9ydHMuZm9yY2VDb2xsaWRlID0gY29sbGlkZTsKZXhwb3J0cy5mb3JjZUxp bmsgPSBsaW5rOwpleHBvcnRzLmZvcmNlTWFueUJvZHkgPSBtYW55Qm9keTsKZXhwb3J0cy5mb3Jj ZVJhZGlhbCA9IHJhZGlhbDsKZXhwb3J0cy5mb3JjZVNpbXVsYXRpb24gPSBzaW11bGF0aW9uOwpl eHBvcnRzLmZvcmNlWCA9IHgkMjsKZXhwb3J0cy5mb3JjZVkgPSB5JDI7CmV4cG9ydHMuZm9ybWF0 RGVmYXVsdExvY2FsZSA9IGRlZmF1bHRMb2NhbGU7CmV4cG9ydHMuZm9ybWF0TG9jYWxlID0gZm9y bWF0TG9jYWxlOwpleHBvcnRzLmZvcm1hdFNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcjsKZXhw b3J0cy5nZW9BbGJlcnMgPSBhbGJlcnM7CmV4cG9ydHMuZ2VvQWxiZXJzVXNhID0gYWxiZXJzVXNh OwpleHBvcnRzLmdlb0FyZWEgPSBhcmVhJDE7CmV4cG9ydHMuZ2VvQXppbXV0aGFsRXF1YWxBcmVh ID0gYXppbXV0aGFsRXF1YWxBcmVhOwpleHBvcnRzLmdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdyA9 IGF6aW11dGhhbEVxdWFsQXJlYVJhdzsKZXhwb3J0cy5nZW9BemltdXRoYWxFcXVpZGlzdGFudCA9 IGF6aW11dGhhbEVxdWlkaXN0YW50OwpleHBvcnRzLmdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3 ID0gYXppbXV0aGFsRXF1aWRpc3RhbnRSYXc7CmV4cG9ydHMuZ2VvQm91bmRzID0gYm91bmRzOwpl eHBvcnRzLmdlb0NlbnRyb2lkID0gY2VudHJvaWQ7CmV4cG9ydHMuZ2VvQ2lyY2xlID0gY2lyY2xl OwpleHBvcnRzLmdlb0NsaXBBbnRpbWVyaWRpYW4gPSBjbGlwQW50aW1lcmlkaWFuOwpleHBvcnRz Lmdlb0NsaXBDaXJjbGUgPSBjbGlwQ2lyY2xlOwpleHBvcnRzLmdlb0NsaXBFeHRlbnQgPSBleHRl bnQkMTsKZXhwb3J0cy5nZW9DbGlwUmVjdGFuZ2xlID0gY2xpcFJlY3RhbmdsZTsKZXhwb3J0cy5n ZW9Db25pY0NvbmZvcm1hbCA9IGNvbmljQ29uZm9ybWFsOwpleHBvcnRzLmdlb0NvbmljQ29uZm9y bWFsUmF3ID0gY29uaWNDb25mb3JtYWxSYXc7CmV4cG9ydHMuZ2VvQ29uaWNFcXVhbEFyZWEgPSBj b25pY0VxdWFsQXJlYTsKZXhwb3J0cy5nZW9Db25pY0VxdWFsQXJlYVJhdyA9IGNvbmljRXF1YWxB cmVhUmF3OwpleHBvcnRzLmdlb0NvbmljRXF1aWRpc3RhbnQgPSBjb25pY0VxdWlkaXN0YW50Owpl eHBvcnRzLmdlb0NvbmljRXF1aWRpc3RhbnRSYXcgPSBjb25pY0VxdWlkaXN0YW50UmF3OwpleHBv cnRzLmdlb0NvbnRhaW5zID0gY29udGFpbnMkMTsKZXhwb3J0cy5nZW9EaXN0YW5jZSA9IGRpc3Rh bmNlOwpleHBvcnRzLmdlb0VxdWFsRWFydGggPSBlcXVhbEVhcnRoOwpleHBvcnRzLmdlb0VxdWFs RWFydGhSYXcgPSBlcXVhbEVhcnRoUmF3OwpleHBvcnRzLmdlb0VxdWlyZWN0YW5ndWxhciA9IGVx dWlyZWN0YW5ndWxhcjsKZXhwb3J0cy5nZW9FcXVpcmVjdGFuZ3VsYXJSYXcgPSBlcXVpcmVjdGFu Z3VsYXJSYXc7CmV4cG9ydHMuZ2VvR25vbW9uaWMgPSBnbm9tb25pYzsKZXhwb3J0cy5nZW9Hbm9t b25pY1JhdyA9IGdub21vbmljUmF3OwpleHBvcnRzLmdlb0dyYXRpY3VsZSA9IGdyYXRpY3VsZTsK ZXhwb3J0cy5nZW9HcmF0aWN1bGUxMCA9IGdyYXRpY3VsZTEwOwpleHBvcnRzLmdlb0lkZW50aXR5 ID0gaWRlbnRpdHkkNTsKZXhwb3J0cy5nZW9JbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlJDE7CmV4 cG9ydHMuZ2VvTGVuZ3RoID0gbGVuZ3RoJDE7CmV4cG9ydHMuZ2VvTWVyY2F0b3IgPSBtZXJjYXRv cjsKZXhwb3J0cy5nZW9NZXJjYXRvclJhdyA9IG1lcmNhdG9yUmF3OwpleHBvcnRzLmdlb05hdHVy YWxFYXJ0aDEgPSBuYXR1cmFsRWFydGgxOwpleHBvcnRzLmdlb05hdHVyYWxFYXJ0aDFSYXcgPSBu YXR1cmFsRWFydGgxUmF3OwpleHBvcnRzLmdlb09ydGhvZ3JhcGhpYyA9IG9ydGhvZ3JhcGhpYzsK ZXhwb3J0cy5nZW9PcnRob2dyYXBoaWNSYXcgPSBvcnRob2dyYXBoaWNSYXc7CmV4cG9ydHMuZ2Vv UGF0aCA9IGluZGV4JDE7CmV4cG9ydHMuZ2VvUHJvamVjdGlvbiA9IHByb2plY3Rpb247CmV4cG9y dHMuZ2VvUHJvamVjdGlvbk11dGF0b3IgPSBwcm9qZWN0aW9uTXV0YXRvcjsKZXhwb3J0cy5nZW9S b3RhdGlvbiA9IHJvdGF0aW9uOwpleHBvcnRzLmdlb1N0ZXJlb2dyYXBoaWMgPSBzdGVyZW9ncmFw aGljOwpleHBvcnRzLmdlb1N0ZXJlb2dyYXBoaWNSYXcgPSBzdGVyZW9ncmFwaGljUmF3OwpleHBv cnRzLmdlb1N0cmVhbSA9IGdlb1N0cmVhbTsKZXhwb3J0cy5nZW9UcmFuc2Zvcm0gPSB0cmFuc2Zv cm07CmV4cG9ydHMuZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yID0gdHJhbnN2ZXJzZU1lcmNhdG9yOwpl eHBvcnRzLmdlb1RyYW5zdmVyc2VNZXJjYXRvclJhdyA9IHRyYW5zdmVyc2VNZXJjYXRvclJhdzsK ZXhwb3J0cy5ncmF5ID0gZ3JheTsKZXhwb3J0cy5oY2wgPSBoY2w7CmV4cG9ydHMuaGllcmFyY2h5 ID0gaGllcmFyY2h5OwpleHBvcnRzLmhpc3RvZ3JhbSA9IGhpc3RvZ3JhbTsKZXhwb3J0cy5oc2wg PSBoc2w7CmV4cG9ydHMuaHRtbCA9IGh0bWw7CmV4cG9ydHMuaW1hZ2UgPSBpbWFnZTsKZXhwb3J0 cy5pbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlVmFsdWU7CmV4cG9ydHMuaW50ZXJwb2xhdGVBcnJh eSA9IGFycmF5JDE7CmV4cG9ydHMuaW50ZXJwb2xhdGVCYXNpcyA9IGJhc2lzJDE7CmV4cG9ydHMu aW50ZXJwb2xhdGVCYXNpc0Nsb3NlZCA9IGJhc2lzQ2xvc2VkOwpleHBvcnRzLmludGVycG9sYXRl Qmx1ZXMgPSBCbHVlczsKZXhwb3J0cy5pbnRlcnBvbGF0ZUJyQkcgPSBCckJHOwpleHBvcnRzLmlu dGVycG9sYXRlQnVHbiA9IEJ1R247CmV4cG9ydHMuaW50ZXJwb2xhdGVCdVB1ID0gQnVQdTsKZXhw b3J0cy5pbnRlcnBvbGF0ZUNpdmlkaXMgPSBjaXZpZGlzOwpleHBvcnRzLmludGVycG9sYXRlQ29v bCA9IGNvb2w7CmV4cG9ydHMuaW50ZXJwb2xhdGVDdWJlaGVsaXggPSBjdWJlaGVsaXgkMjsKZXhw b3J0cy5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQgPSBjdWJlaGVsaXgkMzsKZXhwb3J0cy5p bnRlcnBvbGF0ZUN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXhMb25nOwpleHBvcnRzLmludGVycG9s YXRlRGF0ZSA9IGRhdGU7CmV4cG9ydHMuaW50ZXJwb2xhdGVEaXNjcmV0ZSA9IGRpc2NyZXRlOwpl eHBvcnRzLmludGVycG9sYXRlR25CdSA9IEduQnU7CmV4cG9ydHMuaW50ZXJwb2xhdGVHcmVlbnMg PSBHcmVlbnM7CmV4cG9ydHMuaW50ZXJwb2xhdGVHcmV5cyA9IEdyZXlzOwpleHBvcnRzLmludGVy cG9sYXRlSGNsID0gaGNsJDI7CmV4cG9ydHMuaW50ZXJwb2xhdGVIY2xMb25nID0gaGNsTG9uZzsK ZXhwb3J0cy5pbnRlcnBvbGF0ZUhzbCA9IGhzbCQyOwpleHBvcnRzLmludGVycG9sYXRlSHNsTG9u ZyA9IGhzbExvbmc7CmV4cG9ydHMuaW50ZXJwb2xhdGVIdWUgPSBodWUkMTsKZXhwb3J0cy5pbnRl cnBvbGF0ZUluZmVybm8gPSBpbmZlcm5vOwpleHBvcnRzLmludGVycG9sYXRlTGFiID0gbGFiJDE7 CmV4cG9ydHMuaW50ZXJwb2xhdGVNYWdtYSA9IG1hZ21hOwpleHBvcnRzLmludGVycG9sYXRlTnVt YmVyID0gaW50ZXJwb2xhdGVOdW1iZXI7CmV4cG9ydHMuaW50ZXJwb2xhdGVOdW1iZXJBcnJheSA9 IG51bWJlckFycmF5OwpleHBvcnRzLmludGVycG9sYXRlT2JqZWN0ID0gb2JqZWN0OwpleHBvcnRz LmludGVycG9sYXRlT3JSZCA9IE9yUmQ7CmV4cG9ydHMuaW50ZXJwb2xhdGVPcmFuZ2VzID0gT3Jh bmdlczsKZXhwb3J0cy5pbnRlcnBvbGF0ZVBSR24gPSBQUkduOwpleHBvcnRzLmludGVycG9sYXRl UGlZRyA9IFBpWUc7CmV4cG9ydHMuaW50ZXJwb2xhdGVQbGFzbWEgPSBwbGFzbWE7CmV4cG9ydHMu aW50ZXJwb2xhdGVQdUJ1ID0gUHVCdTsKZXhwb3J0cy5pbnRlcnBvbGF0ZVB1QnVHbiA9IFB1QnVH bjsKZXhwb3J0cy5pbnRlcnBvbGF0ZVB1T3IgPSBQdU9yOwpleHBvcnRzLmludGVycG9sYXRlUHVS ZCA9IFB1UmQ7CmV4cG9ydHMuaW50ZXJwb2xhdGVQdXJwbGVzID0gUHVycGxlczsKZXhwb3J0cy5p bnRlcnBvbGF0ZVJhaW5ib3cgPSByYWluYm93OwpleHBvcnRzLmludGVycG9sYXRlUmRCdSA9IFJk QnU7CmV4cG9ydHMuaW50ZXJwb2xhdGVSZEd5ID0gUmRHeTsKZXhwb3J0cy5pbnRlcnBvbGF0ZVJk UHUgPSBSZFB1OwpleHBvcnRzLmludGVycG9sYXRlUmRZbEJ1ID0gUmRZbEJ1OwpleHBvcnRzLmlu dGVycG9sYXRlUmRZbEduID0gUmRZbEduOwpleHBvcnRzLmludGVycG9sYXRlUmVkcyA9IFJlZHM7 CmV4cG9ydHMuaW50ZXJwb2xhdGVSZ2IgPSBpbnRlcnBvbGF0ZVJnYjsKZXhwb3J0cy5pbnRlcnBv bGF0ZVJnYkJhc2lzID0gcmdiQmFzaXM7CmV4cG9ydHMuaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3Nl ZCA9IHJnYkJhc2lzQ2xvc2VkOwpleHBvcnRzLmludGVycG9sYXRlUm91bmQgPSBpbnRlcnBvbGF0 ZVJvdW5kOwpleHBvcnRzLmludGVycG9sYXRlU2luZWJvdyA9IHNpbmVib3c7CmV4cG9ydHMuaW50 ZXJwb2xhdGVTcGVjdHJhbCA9IFNwZWN0cmFsOwpleHBvcnRzLmludGVycG9sYXRlU3RyaW5nID0g aW50ZXJwb2xhdGVTdHJpbmc7CmV4cG9ydHMuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRl cnBvbGF0ZVRyYW5zZm9ybUNzczsKZXhwb3J0cy5pbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGlu dGVycG9sYXRlVHJhbnNmb3JtU3ZnOwpleHBvcnRzLmludGVycG9sYXRlVHVyYm8gPSB0dXJibzsK ZXhwb3J0cy5pbnRlcnBvbGF0ZVZpcmlkaXMgPSB2aXJpZGlzOwpleHBvcnRzLmludGVycG9sYXRl V2FybSA9IHdhcm07CmV4cG9ydHMuaW50ZXJwb2xhdGVZbEduID0gWWxHbjsKZXhwb3J0cy5pbnRl cnBvbGF0ZVlsR25CdSA9IFlsR25CdTsKZXhwb3J0cy5pbnRlcnBvbGF0ZVlsT3JCciA9IFlsT3JC cjsKZXhwb3J0cy5pbnRlcnBvbGF0ZVlsT3JSZCA9IFlsT3JSZDsKZXhwb3J0cy5pbnRlcnBvbGF0 ZVpvb20gPSBpbnRlcnBvbGF0ZVpvb207CmV4cG9ydHMuaW50ZXJydXB0ID0gaW50ZXJydXB0Owpl eHBvcnRzLmludGVydmFsID0gaW50ZXJ2YWwkMTsKZXhwb3J0cy5pc29Gb3JtYXQgPSBmb3JtYXRJ c287CmV4cG9ydHMuaXNvUGFyc2UgPSBwYXJzZUlzbzsKZXhwb3J0cy5qc29uID0ganNvbjsKZXhw b3J0cy5rZXlzID0ga2V5czsKZXhwb3J0cy5sYWIgPSBsYWI7CmV4cG9ydHMubGNoID0gbGNoOwpl eHBvcnRzLmxpbmUgPSBsaW5lOwpleHBvcnRzLmxpbmVSYWRpYWwgPSBsaW5lUmFkaWFsJDE7CmV4 cG9ydHMubGlua0hvcml6b250YWwgPSBsaW5rSG9yaXpvbnRhbDsKZXhwb3J0cy5saW5rUmFkaWFs ID0gbGlua1JhZGlhbDsKZXhwb3J0cy5saW5rVmVydGljYWwgPSBsaW5rVmVydGljYWw7CmV4cG9y dHMubG9jYWwgPSBsb2NhbDsKZXhwb3J0cy5tYXAgPSBtYXAkMTsKZXhwb3J0cy5tYXRjaGVyID0g bWF0Y2hlcjsKZXhwb3J0cy5tYXggPSBtYXg7CmV4cG9ydHMubWVhbiA9IG1lYW47CmV4cG9ydHMu bWVkaWFuID0gbWVkaWFuOwpleHBvcnRzLm1lcmdlID0gbWVyZ2U7CmV4cG9ydHMubWluID0gbWlu OwpleHBvcnRzLm1vdXNlID0gbW91c2U7CmV4cG9ydHMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwpl eHBvcnRzLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOwpleHBvcnRzLm5lc3QgPSBuZXN0OwpleHBv cnRzLm5vdyA9IG5vdzsKZXhwb3J0cy5wYWNrID0gaW5kZXgkMjsKZXhwb3J0cy5wYWNrRW5jbG9z ZSA9IGVuY2xvc2U7CmV4cG9ydHMucGFja1NpYmxpbmdzID0gc2libGluZ3M7CmV4cG9ydHMucGFp cnMgPSBwYWlyczsKZXhwb3J0cy5wYXJ0aXRpb24gPSBwYXJ0aXRpb247CmV4cG9ydHMucGF0aCA9 IHBhdGg7CmV4cG9ydHMucGVybXV0ZSA9IHBlcm11dGU7CmV4cG9ydHMucGllID0gcGllOwpleHBv cnRzLnBpZWNld2lzZSA9IHBpZWNld2lzZTsKZXhwb3J0cy5wb2ludFJhZGlhbCA9IHBvaW50UmFk aWFsOwpleHBvcnRzLnBvbHlnb25BcmVhID0gYXJlYSQyOwpleHBvcnRzLnBvbHlnb25DZW50cm9p ZCA9IGNlbnRyb2lkJDE7CmV4cG9ydHMucG9seWdvbkNvbnRhaW5zID0gY29udGFpbnMkMjsKZXhw b3J0cy5wb2x5Z29uSHVsbCA9IGh1bGw7CmV4cG9ydHMucG9seWdvbkxlbmd0aCA9IGxlbmd0aCQy OwpleHBvcnRzLnByZWNpc2lvbkZpeGVkID0gcHJlY2lzaW9uRml4ZWQ7CmV4cG9ydHMucHJlY2lz aW9uUHJlZml4ID0gcHJlY2lzaW9uUHJlZml4OwpleHBvcnRzLnByZWNpc2lvblJvdW5kID0gcHJl Y2lzaW9uUm91bmQ7CmV4cG9ydHMucXVhZHRyZWUgPSBxdWFkdHJlZTsKZXhwb3J0cy5xdWFudGls ZSA9IHRocmVzaG9sZDsKZXhwb3J0cy5xdWFudGl6ZSA9IHF1YW50aXplOwpleHBvcnRzLnJhZGlh bEFyZWEgPSBhcmVhUmFkaWFsOwpleHBvcnRzLnJhZGlhbExpbmUgPSBsaW5lUmFkaWFsJDE7CmV4 cG9ydHMucmFuZG9tQmF0ZXMgPSBiYXRlczsKZXhwb3J0cy5yYW5kb21FeHBvbmVudGlhbCA9IGV4 cG9uZW50aWFsJDE7CmV4cG9ydHMucmFuZG9tSXJ3aW5IYWxsID0gaXJ3aW5IYWxsOwpleHBvcnRz LnJhbmRvbUxvZ05vcm1hbCA9IGxvZ05vcm1hbDsKZXhwb3J0cy5yYW5kb21Ob3JtYWwgPSBub3Jt YWw7CmV4cG9ydHMucmFuZG9tVW5pZm9ybSA9IHVuaWZvcm07CmV4cG9ydHMucmFuZ2UgPSBzZXF1 ZW5jZTsKZXhwb3J0cy5yZ2IgPSByZ2I7CmV4cG9ydHMucmliYm9uID0gcmliYm9uOwpleHBvcnRz LnNjYWxlQmFuZCA9IGJhbmQ7CmV4cG9ydHMuc2NhbGVEaXZlcmdpbmcgPSBkaXZlcmdpbmc7CmV4 cG9ydHMuc2NhbGVEaXZlcmdpbmdMb2cgPSBkaXZlcmdpbmdMb2c7CmV4cG9ydHMuc2NhbGVEaXZl cmdpbmdQb3cgPSBkaXZlcmdpbmdQb3c7CmV4cG9ydHMuc2NhbGVEaXZlcmdpbmdTcXJ0ID0gZGl2 ZXJnaW5nU3FydDsKZXhwb3J0cy5zY2FsZURpdmVyZ2luZ1N5bWxvZyA9IGRpdmVyZ2luZ1N5bWxv ZzsKZXhwb3J0cy5zY2FsZUlkZW50aXR5ID0gaWRlbnRpdHkkNzsKZXhwb3J0cy5zY2FsZUltcGxp Y2l0ID0gaW1wbGljaXQ7CmV4cG9ydHMuc2NhbGVMaW5lYXIgPSBsaW5lYXIkMjsKZXhwb3J0cy5z Y2FsZUxvZyA9IGxvZyQxOwpleHBvcnRzLnNjYWxlT3JkaW5hbCA9IG9yZGluYWw7CmV4cG9ydHMu c2NhbGVQb2ludCA9IHBvaW50JDE7CmV4cG9ydHMuc2NhbGVQb3cgPSBwb3ckMTsKZXhwb3J0cy5z Y2FsZVF1YW50aWxlID0gcXVhbnRpbGU7CmV4cG9ydHMuc2NhbGVRdWFudGl6ZSA9IHF1YW50aXpl JDE7CmV4cG9ydHMuc2NhbGVTZXF1ZW50aWFsID0gc2VxdWVudGlhbDsKZXhwb3J0cy5zY2FsZVNl cXVlbnRpYWxMb2cgPSBzZXF1ZW50aWFsTG9nOwpleHBvcnRzLnNjYWxlU2VxdWVudGlhbFBvdyA9 IHNlcXVlbnRpYWxQb3c7CmV4cG9ydHMuc2NhbGVTZXF1ZW50aWFsUXVhbnRpbGUgPSBzZXF1ZW50 aWFsUXVhbnRpbGU7CmV4cG9ydHMuc2NhbGVTZXF1ZW50aWFsU3FydCA9IHNlcXVlbnRpYWxTcXJ0 OwpleHBvcnRzLnNjYWxlU2VxdWVudGlhbFN5bWxvZyA9IHNlcXVlbnRpYWxTeW1sb2c7CmV4cG9y dHMuc2NhbGVTcXJ0ID0gc3FydCQxOwpleHBvcnRzLnNjYWxlU3ltbG9nID0gc3ltbG9nOwpleHBv cnRzLnNjYWxlVGhyZXNob2xkID0gdGhyZXNob2xkJDE7CmV4cG9ydHMuc2NhbGVUaW1lID0gdGlt ZTsKZXhwb3J0cy5zY2FsZVV0YyA9IHV0Y1RpbWU7CmV4cG9ydHMuc2NhbiA9IHNjYW47CmV4cG9y dHMuc2NoZW1lQWNjZW50ID0gQWNjZW50OwpleHBvcnRzLnNjaGVtZUJsdWVzID0gc2NoZW1lJGw7 CmV4cG9ydHMuc2NoZW1lQnJCRyA9IHNjaGVtZTsKZXhwb3J0cy5zY2hlbWVCdUduID0gc2NoZW1l JDk7CmV4cG9ydHMuc2NoZW1lQnVQdSA9IHNjaGVtZSRhOwpleHBvcnRzLnNjaGVtZUNhdGVnb3J5 MTAgPSBjYXRlZ29yeTEwOwpleHBvcnRzLnNjaGVtZURhcmsyID0gRGFyazI7CmV4cG9ydHMuc2No ZW1lR25CdSA9IHNjaGVtZSRiOwpleHBvcnRzLnNjaGVtZUdyZWVucyA9IHNjaGVtZSRtOwpleHBv cnRzLnNjaGVtZUdyZXlzID0gc2NoZW1lJG47CmV4cG9ydHMuc2NoZW1lT3JSZCA9IHNjaGVtZSRj OwpleHBvcnRzLnNjaGVtZU9yYW5nZXMgPSBzY2hlbWUkcTsKZXhwb3J0cy5zY2hlbWVQUkduID0g c2NoZW1lJDE7CmV4cG9ydHMuc2NoZW1lUGFpcmVkID0gUGFpcmVkOwpleHBvcnRzLnNjaGVtZVBh c3RlbDEgPSBQYXN0ZWwxOwpleHBvcnRzLnNjaGVtZVBhc3RlbDIgPSBQYXN0ZWwyOwpleHBvcnRz LnNjaGVtZVBpWUcgPSBzY2hlbWUkMjsKZXhwb3J0cy5zY2hlbWVQdUJ1ID0gc2NoZW1lJGU7CmV4 cG9ydHMuc2NoZW1lUHVCdUduID0gc2NoZW1lJGQ7CmV4cG9ydHMuc2NoZW1lUHVPciA9IHNjaGVt ZSQzOwpleHBvcnRzLnNjaGVtZVB1UmQgPSBzY2hlbWUkZjsKZXhwb3J0cy5zY2hlbWVQdXJwbGVz ID0gc2NoZW1lJG87CmV4cG9ydHMuc2NoZW1lUmRCdSA9IHNjaGVtZSQ0OwpleHBvcnRzLnNjaGVt ZVJkR3kgPSBzY2hlbWUkNTsKZXhwb3J0cy5zY2hlbWVSZFB1ID0gc2NoZW1lJGc7CmV4cG9ydHMu c2NoZW1lUmRZbEJ1ID0gc2NoZW1lJDY7CmV4cG9ydHMuc2NoZW1lUmRZbEduID0gc2NoZW1lJDc7 CmV4cG9ydHMuc2NoZW1lUmVkcyA9IHNjaGVtZSRwOwpleHBvcnRzLnNjaGVtZVNldDEgPSBTZXQx OwpleHBvcnRzLnNjaGVtZVNldDIgPSBTZXQyOwpleHBvcnRzLnNjaGVtZVNldDMgPSBTZXQzOwpl eHBvcnRzLnNjaGVtZVNwZWN0cmFsID0gc2NoZW1lJDg7CmV4cG9ydHMuc2NoZW1lVGFibGVhdTEw ID0gVGFibGVhdTEwOwpleHBvcnRzLnNjaGVtZVlsR24gPSBzY2hlbWUkaTsKZXhwb3J0cy5zY2hl bWVZbEduQnUgPSBzY2hlbWUkaDsKZXhwb3J0cy5zY2hlbWVZbE9yQnIgPSBzY2hlbWUkajsKZXhw b3J0cy5zY2hlbWVZbE9yUmQgPSBzY2hlbWUkazsKZXhwb3J0cy5zZWxlY3QgPSBzZWxlY3Q7CmV4 cG9ydHMuc2VsZWN0QWxsID0gc2VsZWN0QWxsOwpleHBvcnRzLnNlbGVjdGlvbiA9IHNlbGVjdGlv bjsKZXhwb3J0cy5zZWxlY3RvciA9IHNlbGVjdG9yOwpleHBvcnRzLnNlbGVjdG9yQWxsID0gc2Vs ZWN0b3JBbGw7CmV4cG9ydHMuc2V0ID0gc2V0JDI7CmV4cG9ydHMuc2h1ZmZsZSA9IHNodWZmbGU7 CmV4cG9ydHMuc3RhY2sgPSBzdGFjazsKZXhwb3J0cy5zdGFja09mZnNldERpdmVyZ2luZyA9IGRp dmVyZ2luZyQxOwpleHBvcnRzLnN0YWNrT2Zmc2V0RXhwYW5kID0gZXhwYW5kOwpleHBvcnRzLnN0 YWNrT2Zmc2V0Tm9uZSA9IG5vbmUkMTsKZXhwb3J0cy5zdGFja09mZnNldFNpbGhvdWV0dGUgPSBz aWxob3VldHRlOwpleHBvcnRzLnN0YWNrT2Zmc2V0V2lnZ2xlID0gd2lnZ2xlOwpleHBvcnRzLnN0 YWNrT3JkZXJBcHBlYXJhbmNlID0gYXBwZWFyYW5jZTsKZXhwb3J0cy5zdGFja09yZGVyQXNjZW5k aW5nID0gYXNjZW5kaW5nJDM7CmV4cG9ydHMuc3RhY2tPcmRlckRlc2NlbmRpbmcgPSBkZXNjZW5k aW5nJDI7CmV4cG9ydHMuc3RhY2tPcmRlckluc2lkZU91dCA9IGluc2lkZU91dDsKZXhwb3J0cy5z dGFja09yZGVyTm9uZSA9IG5vbmUkMjsKZXhwb3J0cy5zdGFja09yZGVyUmV2ZXJzZSA9IHJldmVy c2U7CmV4cG9ydHMuc3RyYXRpZnkgPSBzdHJhdGlmeTsKZXhwb3J0cy5zdHlsZSA9IHN0eWxlVmFs dWU7CmV4cG9ydHMuc3VtID0gc3VtOwpleHBvcnRzLnN2ZyA9IHN2ZzsKZXhwb3J0cy5zeW1ib2wg PSBzeW1ib2w7CmV4cG9ydHMuc3ltYm9sQ2lyY2xlID0gY2lyY2xlJDI7CmV4cG9ydHMuc3ltYm9s Q3Jvc3MgPSBjcm9zcyQyOwpleHBvcnRzLnN5bWJvbERpYW1vbmQgPSBkaWFtb25kOwpleHBvcnRz LnN5bWJvbFNxdWFyZSA9IHNxdWFyZTsKZXhwb3J0cy5zeW1ib2xTdGFyID0gc3RhcjsKZXhwb3J0 cy5zeW1ib2xUcmlhbmdsZSA9IHRyaWFuZ2xlOwpleHBvcnRzLnN5bWJvbFd5ZSA9IHd5ZTsKZXhw b3J0cy5zeW1ib2xzID0gc3ltYm9sczsKZXhwb3J0cy50ZXh0ID0gdGV4dDsKZXhwb3J0cy50aHJl c2hvbGRGcmVlZG1hbkRpYWNvbmlzID0gZnJlZWRtYW5EaWFjb25pczsKZXhwb3J0cy50aHJlc2hv bGRTY290dCA9IHNjb3R0OwpleHBvcnRzLnRocmVzaG9sZFN0dXJnZXMgPSB0aHJlc2hvbGRTdHVy Z2VzOwpleHBvcnRzLnRpY2tGb3JtYXQgPSB0aWNrRm9ybWF0OwpleHBvcnRzLnRpY2tJbmNyZW1l bnQgPSB0aWNrSW5jcmVtZW50OwpleHBvcnRzLnRpY2tTdGVwID0gdGlja1N0ZXA7CmV4cG9ydHMu dGlja3MgPSB0aWNrczsKZXhwb3J0cy50aW1lRGF5ID0gZGF5OwpleHBvcnRzLnRpbWVEYXlzID0g ZGF5czsKZXhwb3J0cy50aW1lRm9ybWF0RGVmYXVsdExvY2FsZSA9IGRlZmF1bHRMb2NhbGUkMTsK ZXhwb3J0cy50aW1lRm9ybWF0TG9jYWxlID0gZm9ybWF0TG9jYWxlJDE7CmV4cG9ydHMudGltZUZy aWRheSA9IGZyaWRheTsKZXhwb3J0cy50aW1lRnJpZGF5cyA9IGZyaWRheXM7CmV4cG9ydHMudGlt ZUhvdXIgPSBob3VyOwpleHBvcnRzLnRpbWVIb3VycyA9IGhvdXJzOwpleHBvcnRzLnRpbWVJbnRl cnZhbCA9IG5ld0ludGVydmFsOwpleHBvcnRzLnRpbWVNaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25k OwpleHBvcnRzLnRpbWVNaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7CmV4cG9ydHMudGltZU1p bnV0ZSA9IG1pbnV0ZTsKZXhwb3J0cy50aW1lTWludXRlcyA9IG1pbnV0ZXM7CmV4cG9ydHMudGlt ZU1vbmRheSA9IG1vbmRheTsKZXhwb3J0cy50aW1lTW9uZGF5cyA9IG1vbmRheXM7CmV4cG9ydHMu dGltZU1vbnRoID0gbW9udGg7CmV4cG9ydHMudGltZU1vbnRocyA9IG1vbnRoczsKZXhwb3J0cy50 aW1lU2F0dXJkYXkgPSBzYXR1cmRheTsKZXhwb3J0cy50aW1lU2F0dXJkYXlzID0gc2F0dXJkYXlz OwpleHBvcnRzLnRpbWVTZWNvbmQgPSBzZWNvbmQ7CmV4cG9ydHMudGltZVNlY29uZHMgPSBzZWNv bmRzOwpleHBvcnRzLnRpbWVTdW5kYXkgPSBzdW5kYXk7CmV4cG9ydHMudGltZVN1bmRheXMgPSBz dW5kYXlzOwpleHBvcnRzLnRpbWVUaHVyc2RheSA9IHRodXJzZGF5OwpleHBvcnRzLnRpbWVUaHVy c2RheXMgPSB0aHVyc2RheXM7CmV4cG9ydHMudGltZVR1ZXNkYXkgPSB0dWVzZGF5OwpleHBvcnRz LnRpbWVUdWVzZGF5cyA9IHR1ZXNkYXlzOwpleHBvcnRzLnRpbWVXZWRuZXNkYXkgPSB3ZWRuZXNk YXk7CmV4cG9ydHMudGltZVdlZG5lc2RheXMgPSB3ZWRuZXNkYXlzOwpleHBvcnRzLnRpbWVXZWVr ID0gc3VuZGF5OwpleHBvcnRzLnRpbWVXZWVrcyA9IHN1bmRheXM7CmV4cG9ydHMudGltZVllYXIg PSB5ZWFyOwpleHBvcnRzLnRpbWVZZWFycyA9IHllYXJzOwpleHBvcnRzLnRpbWVvdXQgPSB0aW1l b3V0JDE7CmV4cG9ydHMudGltZXIgPSB0aW1lcjsKZXhwb3J0cy50aW1lckZsdXNoID0gdGltZXJG bHVzaDsKZXhwb3J0cy50b3VjaCA9IHRvdWNoOwpleHBvcnRzLnRvdWNoZXMgPSB0b3VjaGVzOwpl eHBvcnRzLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uOwpleHBvcnRzLnRyYW5zcG9zZSA9IHRyYW5z cG9zZTsKZXhwb3J0cy50cmVlID0gdHJlZTsKZXhwb3J0cy50cmVlbWFwID0gaW5kZXgkMzsKZXhw b3J0cy50cmVlbWFwQmluYXJ5ID0gYmluYXJ5OwpleHBvcnRzLnRyZWVtYXBEaWNlID0gdHJlZW1h cERpY2U7CmV4cG9ydHMudHJlZW1hcFJlc3F1YXJpZnkgPSByZXNxdWFyaWZ5OwpleHBvcnRzLnRy ZWVtYXBTbGljZSA9IHRyZWVtYXBTbGljZTsKZXhwb3J0cy50cmVlbWFwU2xpY2VEaWNlID0gc2xp Y2VEaWNlOwpleHBvcnRzLnRyZWVtYXBTcXVhcmlmeSA9IHNxdWFyaWZ5OwpleHBvcnRzLnRzdiA9 IHRzdiQxOwpleHBvcnRzLnRzdkZvcm1hdCA9IHRzdkZvcm1hdDsKZXhwb3J0cy50c3ZGb3JtYXRC b2R5ID0gdHN2Rm9ybWF0Qm9keTsKZXhwb3J0cy50c3ZGb3JtYXRSb3cgPSB0c3ZGb3JtYXRSb3c7 CmV4cG9ydHMudHN2Rm9ybWF0Um93cyA9IHRzdkZvcm1hdFJvd3M7CmV4cG9ydHMudHN2Rm9ybWF0 VmFsdWUgPSB0c3ZGb3JtYXRWYWx1ZTsKZXhwb3J0cy50c3ZQYXJzZSA9IHRzdlBhcnNlOwpleHBv cnRzLnRzdlBhcnNlUm93cyA9IHRzdlBhcnNlUm93czsKZXhwb3J0cy51dGNEYXkgPSB1dGNEYXk7 CmV4cG9ydHMudXRjRGF5cyA9IHV0Y0RheXM7CmV4cG9ydHMudXRjRnJpZGF5ID0gdXRjRnJpZGF5 OwpleHBvcnRzLnV0Y0ZyaWRheXMgPSB1dGNGcmlkYXlzOwpleHBvcnRzLnV0Y0hvdXIgPSB1dGNI b3VyOwpleHBvcnRzLnV0Y0hvdXJzID0gdXRjSG91cnM7CmV4cG9ydHMudXRjTWlsbGlzZWNvbmQg PSBtaWxsaXNlY29uZDsKZXhwb3J0cy51dGNNaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7CmV4 cG9ydHMudXRjTWludXRlID0gdXRjTWludXRlOwpleHBvcnRzLnV0Y01pbnV0ZXMgPSB1dGNNaW51 dGVzOwpleHBvcnRzLnV0Y01vbmRheSA9IHV0Y01vbmRheTsKZXhwb3J0cy51dGNNb25kYXlzID0g dXRjTW9uZGF5czsKZXhwb3J0cy51dGNNb250aCA9IHV0Y01vbnRoOwpleHBvcnRzLnV0Y01vbnRo cyA9IHV0Y01vbnRoczsKZXhwb3J0cy51dGNTYXR1cmRheSA9IHV0Y1NhdHVyZGF5OwpleHBvcnRz LnV0Y1NhdHVyZGF5cyA9IHV0Y1NhdHVyZGF5czsKZXhwb3J0cy51dGNTZWNvbmQgPSBzZWNvbmQ7 CmV4cG9ydHMudXRjU2Vjb25kcyA9IHNlY29uZHM7CmV4cG9ydHMudXRjU3VuZGF5ID0gdXRjU3Vu ZGF5OwpleHBvcnRzLnV0Y1N1bmRheXMgPSB1dGNTdW5kYXlzOwpleHBvcnRzLnV0Y1RodXJzZGF5 ID0gdXRjVGh1cnNkYXk7CmV4cG9ydHMudXRjVGh1cnNkYXlzID0gdXRjVGh1cnNkYXlzOwpleHBv cnRzLnV0Y1R1ZXNkYXkgPSB1dGNUdWVzZGF5OwpleHBvcnRzLnV0Y1R1ZXNkYXlzID0gdXRjVHVl c2RheXM7CmV4cG9ydHMudXRjV2VkbmVzZGF5ID0gdXRjV2VkbmVzZGF5OwpleHBvcnRzLnV0Y1dl ZG5lc2RheXMgPSB1dGNXZWRuZXNkYXlzOwpleHBvcnRzLnV0Y1dlZWsgPSB1dGNTdW5kYXk7CmV4 cG9ydHMudXRjV2Vla3MgPSB1dGNTdW5kYXlzOwpleHBvcnRzLnV0Y1llYXIgPSB1dGNZZWFyOwpl eHBvcnRzLnV0Y1llYXJzID0gdXRjWWVhcnM7CmV4cG9ydHMudmFsdWVzID0gdmFsdWVzOwpleHBv cnRzLnZhcmlhbmNlID0gdmFyaWFuY2U7CmV4cG9ydHMudmVyc2lvbiA9IHZlcnNpb247CmV4cG9y dHMudm9yb25vaSA9IHZvcm9ub2k7CmV4cG9ydHMud2luZG93ID0gZGVmYXVsdFZpZXc7CmV4cG9y dHMueG1sID0geG1sOwpleHBvcnRzLnppcCA9IHppcDsKZXhwb3J0cy56b29tID0gem9vbTsKZXhw b3J0cy56b29tSWRlbnRpdHkgPSBpZGVudGl0eSQ5OwpleHBvcnRzLnpvb21UcmFuc2Zvcm0gPSB0 cmFuc2Zvcm0kMTsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScs IHsgdmFsdWU6IHRydWUgfSk7Cgp9KSk7Cg== --MP_/huV/jc.jjRG1tiqg+FFlax7-- --Sig_/ahh=buR+DkTF93fKWPzRP2H Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAmAl+6wACgkQ5xo1VCww uqV1FQf9F2LyGN1RB+8PwdL76vp1FqmPhlzYpX5WnKmDuj+68UiaH0lWLaS+Thb+ GF41AYGvXJq0X4YfRSayPZxKSwaM0tLc3z6vr8lfyhaNjiD3Z9OLiKHaNrO4FgRZ 429iXu1ZdNKfpr4xla/1NKmh0lL+IDxBebjB4VdCbWziKJ//gJvINHtXL+sorMbt 6aXoPdbnqt3DobwfT8GGJM6HhqfTJmfFb8UngCL5X0ZMAZb9S7970KZUooC9RlY/ +rULoKozoS8dC9MhTyP+0qte5LflpqWr9egLBIJbVB7rhuyxI4cf1D2HPajWpyt6 GJ6MUNsQUvW/SysR9NUGIBBSBOG7Pw== =zhbT -----END PGP SIGNATURE----- --Sig_/ahh=buR+DkTF93fKWPzRP2H-- From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 12 13:15:03 2021 Received: (at 46456) by debbugs.gnu.org; 12 Feb 2021 18:15:03 +0000 Received: from localhost ([127.0.0.1]:32935 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lAcy7-0007le-MR for submit@debbugs.gnu.org; Fri, 12 Feb 2021 13:15:03 -0500 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:60545) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lAcy6-0007kn-C3 for 46456@debbugs.gnu.org; Fri, 12 Feb 2021 13:15:02 -0500 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id 52EB95C019B; Fri, 12 Feb 2021 13:14:57 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Fri, 12 Feb 2021 13:14:57 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=famulari.name; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=mesmtp; bh=/wPYSHu+JUj1o5MiaXbRO00C 7DY+vJkSA8w2+42RRYk=; b=mcH7TFDb5SswUQE/ciQdVPra9lBlhRuAMNSUqRxX b+ic9KRn23b/Ng67oAfkhsRMs789vEc/NquW1IoDjIzS7KmH7KSy4xbjj54VpINz 0wkDkzB1hL/JX5ddVCSxtuZ3KoZmC4SyB+k5VPEXnkYiPC1PG/4ZNJD+cXIdlX3q BzA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=/wPYSH u+JUj1o5MiaXbRO00C7DY+vJkSA8w2+42RRYk=; b=LK0vaZEvW7BQIcRfRZCEpM lbp+VlAJm0PgtpSgwi0qllzlG5+OiKCVUgsMGWZabN02Xz1ROzFuViSSX2Zd6xbc wjgFpeLJTp3CdL4oR9G9VIQ0EOHBOCIj88Cqu4IR1+g5PnGPIlDgCcrcWNbxWJ5m SAnGHCauwGyyPn0vC5NlsOqU6gnPCv/dF8djKiTNTzhtmy425YHd9wbPp4/w5ZT2 wTv/kcVyqGWitYiAoq0dNdS1wYCiR0gbXclPkf/VDsOU7PzLvSWcqQO7Kp9/Wbh2 wBmyE8t/STj+Dlre8F+YBT59OU2y891kcB6zTh8uozgN0BwFIHeknlxyfstihpGA == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledriedugdduudegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepfffhvffukfhfgggtuggjsehgtderredttddvnecuhfhrohhmpefnvghoucfh rghmuhhlrghrihcuoehlvghosehfrghmuhhlrghrihdrnhgrmhgvqeenucggtffrrghtth gvrhhnpeetvedtffdtgfeuieelhefguefgleefjeevgfeivdefheelleffhfeftdeggfel teenucffohhmrghinhepugefjhhsrdhorhhgnecukfhppedutddtrdduuddrudeiledrud dukeenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehl vghosehfrghmuhhlrghrihdrnhgrmhgv X-ME-Proxy: Received: from localhost (pool-100-11-169-118.phlapa.fios.verizon.net [100.11.169.118]) by mail.messagingengine.com (Postfix) with ESMTPA id EF86424005A; Fri, 12 Feb 2021 13:14:55 -0500 (EST) Date: Fri, 12 Feb 2021 13:14:54 -0500 From: Leo Famulari To: Danny Milosavljevic Subject: Re: bug#46456: [core-updates] d3.v5.js source checksum changed Message-ID: References: <20210212045315.3f4e0a82@scratchpost.org> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="Ax9lNzlugw8JBjpt" Content-Disposition: inline In-Reply-To: <20210212045315.3f4e0a82@scratchpost.org> X-Debbugs-Envelope-To: 46456 Cc: 46456@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" --Ax9lNzlugw8JBjpt Content-Type: multipart/mixed; boundary="kLqR5wKUBEbm+NQl" Content-Disposition: inline --kLqR5wKUBEbm+NQl Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Fri, Feb 12, 2021 at 04:53:15AM +0100, Danny Milosavljevic wrote: > Starting download of /gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.js > From https://d3js.org/d3.v5.js... > downloading from https://d3js.org/d3.v5.js ... > d3.v5.js 2.22GiB/s 00:00 | 504KiB transferred > sha256 hash mismatch for /gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.js: > expected hash: 0kxvx5pfagxn6nhavdwsdnzyd26g0z5dsfi1pi5dvcmb0c8ipcdn Attached. --kLqR5wKUBEbm+NQl Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.js" Content-Transfer-Encoding: quoted-printable // https://d3js.org v5.9.7 Copyright 2019 Mike Bostock (function (global, factory) { typeof exports =3D=3D=3D 'object' && typeof module !=3D=3D 'undefined' ? fa= ctory(exports) : typeof define =3D=3D=3D 'function' && define.amd ? define(['exports'], fact= ory) : (factory((global.d3 =3D global.d3 || {}))); }(this, (function (exports) { 'use strict'; var version =3D "5.9.7"; function ascending(a, b) { return a < b ? -1 : a > b ? 1 : a >=3D b ? 0 : NaN; } function bisector(compare) { if (compare.length =3D=3D=3D 1) compare =3D ascendingComparator(compare); return { left: function(a, x, lo, hi) { if (lo =3D=3D null) lo =3D 0; if (hi =3D=3D null) hi =3D a.length; while (lo < hi) { var mid =3D lo + hi >>> 1; if (compare(a[mid], x) < 0) lo =3D mid + 1; else hi =3D mid; } return lo; }, right: function(a, x, lo, hi) { if (lo =3D=3D null) lo =3D 0; if (hi =3D=3D null) hi =3D a.length; while (lo < hi) { var mid =3D lo + hi >>> 1; if (compare(a[mid], x) > 0) hi =3D mid; else lo =3D mid + 1; } return lo; } }; } function ascendingComparator(f) { return function(d, x) { return ascending(f(d), x); }; } var ascendingBisect =3D bisector(ascending); var bisectRight =3D ascendingBisect.right; var bisectLeft =3D ascendingBisect.left; function pairs(array, f) { if (f =3D=3D null) f =3D pair; var i =3D 0, n =3D array.length - 1, p =3D array[0], pairs =3D new Array(= n < 0 ? 0 : n); while (i < n) pairs[i] =3D f(p, p =3D array[++i]); return pairs; } function pair(a, b) { return [a, b]; } function cross(values0, values1, reduce) { var n0 =3D values0.length, n1 =3D values1.length, values =3D new Array(n0 * n1), i0, i1, i, value0; if (reduce =3D=3D null) reduce =3D pair; for (i0 =3D i =3D 0; i0 < n0; ++i0) { for (value0 =3D values0[i0], i1 =3D 0; i1 < n1; ++i1, ++i) { values[i] =3D reduce(value0, values1[i1]); } } return values; } function descending(a, b) { return b < a ? -1 : b > a ? 1 : b >=3D a ? 0 : NaN; } function number(x) { return x =3D=3D=3D null ? NaN : +x; } function variance(values, valueof) { var n =3D values.length, m =3D 0, i =3D -1, mean =3D 0, value, delta, sum =3D 0; if (valueof =3D=3D null) { while (++i < n) { if (!isNaN(value =3D number(values[i]))) { delta =3D value - mean; mean +=3D delta / ++m; sum +=3D delta * (value - mean); } } } else { while (++i < n) { if (!isNaN(value =3D number(valueof(values[i], i, values)))) { delta =3D value - mean; mean +=3D delta / ++m; sum +=3D delta * (value - mean); } } } if (m > 1) return sum / (m - 1); } function deviation(array, f) { var v =3D variance(array, f); return v ? Math.sqrt(v) : v; } function extent(values, valueof) { var n =3D values.length, i =3D -1, value, min, max; if (valueof =3D=3D null) { while (++i < n) { // Find the first comparable value. if ((value =3D values[i]) !=3D null && value >=3D value) { min =3D max =3D value; while (++i < n) { // Compare the remaining values. if ((value =3D values[i]) !=3D null) { if (min > value) min =3D value; if (max < value) max =3D value; } } } } } else { while (++i < n) { // Find the first comparable value. if ((value =3D valueof(values[i], i, values)) !=3D null && value >=3D= value) { min =3D max =3D value; while (++i < n) { // Compare the remaining values. if ((value =3D valueof(values[i], i, values)) !=3D null) { if (min > value) min =3D value; if (max < value) max =3D value; } } } } } return [min, max]; } var array =3D Array.prototype; var slice =3D array.slice; var map =3D array.map; function constant(x) { return function() { return x; }; } function identity(x) { return x; } function sequence(start, stop, step) { start =3D +start, stop =3D +stop, step =3D (n =3D arguments.length) < 2 ?= (stop =3D start, start =3D 0, 1) : n < 3 ? 1 : +step; var i =3D -1, n =3D Math.max(0, Math.ceil((stop - start) / step)) | 0, range =3D new Array(n); while (++i < n) { range[i] =3D start + i * step; } return range; } var e10 =3D Math.sqrt(50), e5 =3D Math.sqrt(10), e2 =3D Math.sqrt(2); function ticks(start, stop, count) { var reverse, i =3D -1, n, ticks, step; stop =3D +stop, start =3D +start, count =3D +count; if (start =3D=3D=3D stop && count > 0) return [start]; if (reverse =3D stop < start) n =3D start, start =3D stop, stop =3D n; if ((step =3D tickIncrement(start, stop, count)) =3D=3D=3D 0 || !isFinite= (step)) return []; if (step > 0) { start =3D Math.ceil(start / step); stop =3D Math.floor(stop / step); ticks =3D new Array(n =3D Math.ceil(stop - start + 1)); while (++i < n) ticks[i] =3D (start + i) * step; } else { start =3D Math.floor(start * step); stop =3D Math.ceil(stop * step); ticks =3D new Array(n =3D Math.ceil(start - stop + 1)); while (++i < n) ticks[i] =3D (start - i) / step; } if (reverse) ticks.reverse(); return ticks; } function tickIncrement(start, stop, count) { var step =3D (stop - start) / Math.max(0, count), power =3D Math.floor(Math.log(step) / Math.LN10), error =3D step / Math.pow(10, power); return power >=3D 0 ? (error >=3D e10 ? 10 : error >=3D e5 ? 5 : error >=3D e2 ? 2 : 1) *= Math.pow(10, power) : -Math.pow(10, -power) / (error >=3D e10 ? 10 : error >=3D e5 ? 5 : = error >=3D e2 ? 2 : 1); } function tickStep(start, stop, count) { var step0 =3D Math.abs(stop - start) / Math.max(0, count), step1 =3D Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), error =3D step0 / step1; if (error >=3D e10) step1 *=3D 10; else if (error >=3D e5) step1 *=3D 5; else if (error >=3D e2) step1 *=3D 2; return stop < start ? -step1 : step1; } function thresholdSturges(values) { return Math.ceil(Math.log(values.length) / Math.LN2) + 1; } function histogram() { var value =3D identity, domain =3D extent, threshold =3D thresholdSturges; function histogram(data) { var i, n =3D data.length, x, values =3D new Array(n); for (i =3D 0; i < n; ++i) { values[i] =3D value(data[i], i, data); } var xz =3D domain(values), x0 =3D xz[0], x1 =3D xz[1], tz =3D threshold(values, x0, x1); // Convert number of thresholds into uniform thresholds. if (!Array.isArray(tz)) { tz =3D tickStep(x0, x1, tz); tz =3D sequence(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive } // Remove any thresholds outside the domain. var m =3D tz.length; while (tz[0] <=3D x0) tz.shift(), --m; while (tz[m - 1] > x1) tz.pop(), --m; var bins =3D new Array(m + 1), bin; // Initialize bins. for (i =3D 0; i <=3D m; ++i) { bin =3D bins[i] =3D []; bin.x0 =3D i > 0 ? tz[i - 1] : x0; bin.x1 =3D i < m ? tz[i] : x1; } // Assign data to bins by value, ignoring any outside the domain. for (i =3D 0; i < n; ++i) { x =3D values[i]; if (x0 <=3D x && x <=3D x1) { bins[bisectRight(tz, x, 0, m)].push(data[i]); } } return bins; } histogram.value =3D function(_) { return arguments.length ? (value =3D typeof _ =3D=3D=3D "function" ? _ = : constant(_), histogram) : value; }; histogram.domain =3D function(_) { return arguments.length ? (domain =3D typeof _ =3D=3D=3D "function" ? _= : constant([_[0], _[1]]), histogram) : domain; }; histogram.thresholds =3D function(_) { return arguments.length ? (threshold =3D typeof _ =3D=3D=3D "function" = ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) = : threshold; }; return histogram; } function threshold(values, p, valueof) { if (valueof =3D=3D null) valueof =3D number; if (!(n =3D values.length)) return; if ((p =3D +p) <=3D 0 || n < 2) return +valueof(values[0], 0, values); if (p >=3D 1) return +valueof(values[n - 1], n - 1, values); var n, i =3D (n - 1) * p, i0 =3D Math.floor(i), value0 =3D +valueof(values[i0], i0, values), value1 =3D +valueof(values[i0 + 1], i0 + 1, values); return value0 + (value1 - value0) * (i - i0); } function freedmanDiaconis(values, min, max) { values =3D map.call(values, number).sort(ascending); return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(= values, 0.25)) * Math.pow(values.length, -1 / 3))); } function scott(values, min, max) { return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values= =2Elength, -1 / 3))); } function max(values, valueof) { var n =3D values.length, i =3D -1, value, max; if (valueof =3D=3D null) { while (++i < n) { // Find the first comparable value. if ((value =3D values[i]) !=3D null && value >=3D value) { max =3D value; while (++i < n) { // Compare the remaining values. if ((value =3D values[i]) !=3D null && value > max) { max =3D value; } } } } } else { while (++i < n) { // Find the first comparable value. if ((value =3D valueof(values[i], i, values)) !=3D null && value >=3D= value) { max =3D value; while (++i < n) { // Compare the remaining values. if ((value =3D valueof(values[i], i, values)) !=3D null && value = > max) { max =3D value; } } } } } return max; } function mean(values, valueof) { var n =3D values.length, m =3D n, i =3D -1, value, sum =3D 0; if (valueof =3D=3D null) { while (++i < n) { if (!isNaN(value =3D number(values[i]))) sum +=3D value; else --m; } } else { while (++i < n) { if (!isNaN(value =3D number(valueof(values[i], i, values)))) sum +=3D= value; else --m; } } if (m) return sum / m; } function median(values, valueof) { var n =3D values.length, i =3D -1, value, numbers =3D []; if (valueof =3D=3D null) { while (++i < n) { if (!isNaN(value =3D number(values[i]))) { numbers.push(value); } } } else { while (++i < n) { if (!isNaN(value =3D number(valueof(values[i], i, values)))) { numbers.push(value); } } } return threshold(numbers.sort(ascending), 0.5); } function merge(arrays) { var n =3D arrays.length, m, i =3D -1, j =3D 0, merged, array; while (++i < n) j +=3D arrays[i].length; merged =3D new Array(j); while (--n >=3D 0) { array =3D arrays[n]; m =3D array.length; while (--m >=3D 0) { merged[--j] =3D array[m]; } } return merged; } function min(values, valueof) { var n =3D values.length, i =3D -1, value, min; if (valueof =3D=3D null) { while (++i < n) { // Find the first comparable value. if ((value =3D values[i]) !=3D null && value >=3D value) { min =3D value; while (++i < n) { // Compare the remaining values. if ((value =3D values[i]) !=3D null && min > value) { min =3D value; } } } } } else { while (++i < n) { // Find the first comparable value. if ((value =3D valueof(values[i], i, values)) !=3D null && value >=3D= value) { min =3D value; while (++i < n) { // Compare the remaining values. if ((value =3D valueof(values[i], i, values)) !=3D null && min > = value) { min =3D value; } } } } } return min; } function permute(array, indexes) { var i =3D indexes.length, permutes =3D new Array(i); while (i--) permutes[i] =3D array[indexes[i]]; return permutes; } function scan(values, compare) { if (!(n =3D values.length)) return; var n, i =3D 0, j =3D 0, xi, xj =3D values[j]; if (compare =3D=3D null) compare =3D ascending; while (++i < n) { if (compare(xi =3D values[i], xj) < 0 || compare(xj, xj) !=3D=3D 0) { xj =3D xi, j =3D i; } } if (compare(xj, xj) =3D=3D=3D 0) return j; } function shuffle(array, i0, i1) { var m =3D (i1 =3D=3D null ? array.length : i1) - (i0 =3D i0 =3D=3D null ?= 0 : +i0), t, i; while (m) { i =3D Math.random() * m-- | 0; t =3D array[m + i0]; array[m + i0] =3D array[i + i0]; array[i + i0] =3D t; } return array; } function sum(values, valueof) { var n =3D values.length, i =3D -1, value, sum =3D 0; if (valueof =3D=3D null) { while (++i < n) { if (value =3D +values[i]) sum +=3D value; // Note: zero and null are = equivalent. } } else { while (++i < n) { if (value =3D +valueof(values[i], i, values)) sum +=3D value; } } return sum; } function transpose(matrix) { if (!(n =3D matrix.length)) return []; for (var i =3D -1, m =3D min(matrix, length), transpose =3D new Array(m);= ++i < m;) { for (var j =3D -1, n, row =3D transpose[i] =3D new Array(n); ++j < n;) { row[j] =3D matrix[j][i]; } } return transpose; } function length(d) { return d.length; } function zip() { return transpose(arguments); } var slice$1 =3D Array.prototype.slice; function identity$1(x) { return x; } var top =3D 1, right =3D 2, bottom =3D 3, left =3D 4, epsilon =3D 1e-6; function translateX(x) { return "translate(" + (x + 0.5) + ",0)"; } function translateY(y) { return "translate(0," + (y + 0.5) + ")"; } function number$1(scale) { return function(d) { return +scale(d); }; } function center(scale) { var offset =3D Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5p= x offset. if (scale.round()) offset =3D Math.round(offset); return function(d) { return +scale(d) + offset; }; } function entering() { return !this.__axis; } function axis(orient, scale) { var tickArguments =3D [], tickValues =3D null, tickFormat =3D null, tickSizeInner =3D 6, tickSizeOuter =3D 6, tickPadding =3D 3, k =3D orient =3D=3D=3D top || orient =3D=3D=3D left ? -1 : 1, x =3D orient =3D=3D=3D left || orient =3D=3D=3D right ? "x" : "y", transform =3D orient =3D=3D=3D top || orient =3D=3D=3D bottom ? trans= lateX : translateY; function axis(context) { var values =3D tickValues =3D=3D null ? (scale.ticks ? scale.ticks.appl= y(scale, tickArguments) : scale.domain()) : tickValues, format =3D tickFormat =3D=3D null ? (scale.tickFormat ? scale.tickF= ormat.apply(scale, tickArguments) : identity$1) : tickFormat, spacing =3D Math.max(tickSizeInner, 0) + tickPadding, range =3D scale.range(), range0 =3D +range[0] + 0.5, range1 =3D +range[range.length - 1] + 0.5, position =3D (scale.bandwidth ? center : number$1)(scale.copy()), selection =3D context.selection ? context.selection() : context, path =3D selection.selectAll(".domain").data([null]), tick =3D selection.selectAll(".tick").data(values, scale).order(), tickExit =3D tick.exit(), tickEnter =3D tick.enter().append("g").attr("class", "tick"), line =3D tick.select("line"), text =3D tick.select("text"); path =3D path.merge(path.enter().insert("path", ".tick") .attr("class", "domain") .attr("stroke", "currentColor")); tick =3D tick.merge(tickEnter); line =3D line.merge(tickEnter.append("line") .attr("stroke", "currentColor") .attr(x + "2", k * tickSizeInner)); text =3D text.merge(tickEnter.append("text") .attr("fill", "currentColor") .attr(x, k * spacing) .attr("dy", orient =3D=3D=3D top ? "0em" : orient =3D=3D=3D bottom = ? "0.71em" : "0.32em")); if (context !=3D=3D selection) { path =3D path.transition(context); tick =3D tick.transition(context); line =3D line.transition(context); text =3D text.transition(context); tickExit =3D tickExit.transition(context) .attr("opacity", epsilon) .attr("transform", function(d) { return isFinite(d =3D position(d= )) ? transform(d) : this.getAttribute("transform"); }); tickEnter .attr("opacity", epsilon) .attr("transform", function(d) { var p =3D this.parentNode.__axis= ; return transform(p && isFinite(p =3D p(d)) ? p : position(d)); }); } tickExit.remove(); path .attr("d", orient =3D=3D=3D left || orient =3D=3D right ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0= =2E5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1) : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0= =2E5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1= )); tick .attr("opacity", 1) .attr("transform", function(d) { return transform(position(d)); }); line .attr(x + "2", k * tickSizeInner); text .attr(x, k * spacing) .text(format); selection.filter(entering) .attr("fill", "none") .attr("font-size", 10) .attr("font-family", "sans-serif") .attr("text-anchor", orient =3D=3D=3D right ? "start" : orient =3D= =3D=3D left ? "end" : "middle"); selection .each(function() { this.__axis =3D position; }); } axis.scale =3D function(_) { return arguments.length ? (scale =3D _, axis) : scale; }; axis.ticks =3D function() { return tickArguments =3D slice$1.call(arguments), axis; }; axis.tickArguments =3D function(_) { return arguments.length ? (tickArguments =3D _ =3D=3D null ? [] : slice= $1.call(_), axis) : tickArguments.slice(); }; axis.tickValues =3D function(_) { return arguments.length ? (tickValues =3D _ =3D=3D null ? null : slice$= 1.call(_), axis) : tickValues && tickValues.slice(); }; axis.tickFormat =3D function(_) { return arguments.length ? (tickFormat =3D _, axis) : tickFormat; }; axis.tickSize =3D function(_) { return arguments.length ? (tickSizeInner =3D tickSizeOuter =3D +_, axis= ) : tickSizeInner; }; axis.tickSizeInner =3D function(_) { return arguments.length ? (tickSizeInner =3D +_, axis) : tickSizeInner; }; axis.tickSizeOuter =3D function(_) { return arguments.length ? (tickSizeOuter =3D +_, axis) : tickSizeOuter; }; axis.tickPadding =3D function(_) { return arguments.length ? (tickPadding =3D +_, axis) : tickPadding; }; return axis; } function axisTop(scale) { return axis(top, scale); } function axisRight(scale) { return axis(right, scale); } function axisBottom(scale) { return axis(bottom, scale); } function axisLeft(scale) { return axis(left, scale); } var noop =3D {value: function() {}}; function dispatch() { for (var i =3D 0, n =3D arguments.length, _ =3D {}, t; i < n; ++i) { if (!(t =3D arguments[i] + "") || (t in _)) throw new Error("illegal ty= pe: " + t); _[t] =3D []; } return new Dispatch(_); } function Dispatch(_) { this._ =3D _; } function parseTypenames(typenames, types) { return typenames.trim().split(/^|\s+/).map(function(t) { var name =3D "", i =3D t.indexOf("."); if (i >=3D 0) name =3D t.slice(i + 1), t =3D t.slice(0, i); if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t= ); return {type: t, name: name}; }); } Dispatch.prototype =3D dispatch.prototype =3D { constructor: Dispatch, on: function(typename, callback) { var _ =3D this._, T =3D parseTypenames(typename + "", _), t, i =3D -1, n =3D T.length; // If no callback was specified, return the callback of the given type = and name. if (arguments.length < 2) { while (++i < n) if ((t =3D (typename =3D T[i]).type) && (t =3D get(_[= t], typename.name))) return t; return; } // If a type was specified, set the callback for the given type and nam= e. // Otherwise, if a null callback was specified, remove callbacks of the= given name. if (callback !=3D null && typeof callback !=3D=3D "function") throw new= Error("invalid callback: " + callback); while (++i < n) { if (t =3D (typename =3D T[i]).type) _[t] =3D set(_[t], typename.name,= callback); else if (callback =3D=3D null) for (t in _) _[t] =3D set(_[t], typena= me.name, null); } return this; }, copy: function() { var copy =3D {}, _ =3D this._; for (var t in _) copy[t] =3D _[t].slice(); return new Dispatch(copy); }, call: function(type, that) { if ((n =3D arguments.length - 2) > 0) for (var args =3D new Array(n), i= =3D 0, n, t; i < n; ++i) args[i] =3D arguments[i + 2]; if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + ty= pe); for (t =3D this._[type], i =3D 0, n =3D t.length; i < n; ++i) t[i].valu= e.apply(that, args); }, apply: function(type, that, args) { if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + ty= pe); for (var t =3D this._[type], i =3D 0, n =3D t.length; i < n; ++i) t[i].= value.apply(that, args); } }; function get(type, name) { for (var i =3D 0, n =3D type.length, c; i < n; ++i) { if ((c =3D type[i]).name =3D=3D=3D name) { return c.value; } } } function set(type, name, callback) { for (var i =3D 0, n =3D type.length; i < n; ++i) { if (type[i].name =3D=3D=3D name) { type[i] =3D noop, type =3D type.slice(0, i).concat(type.slice(i + 1)); break; } } if (callback !=3D null) type.push({name: name, value: callback}); return type; } var xhtml =3D "http://www.w3.org/1999/xhtml"; var namespaces =3D { svg: "http://www.w3.org/2000/svg", xhtml: xhtml, xlink: "http://www.w3.org/1999/xlink", xml: "http://www.w3.org/XML/1998/namespace", xmlns: "http://www.w3.org/2000/xmlns/" }; function namespace(name) { var prefix =3D name +=3D "", i =3D prefix.indexOf(":"); if (i >=3D 0 && (prefix =3D name.slice(0, i)) !=3D=3D "xmlns") name =3D n= ame.slice(i + 1); return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], lo= cal: name} : name; } function creatorInherit(name) { return function() { var document =3D this.ownerDocument, uri =3D this.namespaceURI; return uri =3D=3D=3D xhtml && document.documentElement.namespaceURI =3D= =3D=3D xhtml ? document.createElement(name) : document.createElementNS(uri, name); }; } function creatorFixed(fullname) { return function() { return this.ownerDocument.createElementNS(fullname.space, fullname.loca= l); }; } function creator(name) { var fullname =3D namespace(name); return (fullname.local ? creatorFixed : creatorInherit)(fullname); } function none() {} function selector(selector) { return selector =3D=3D null ? none : function() { return this.querySelector(selector); }; } function selection_select(select) { if (typeof select !=3D=3D "function") select =3D selector(select); for (var groups =3D this._groups, m =3D groups.length, subgroups =3D new = Array(m), j =3D 0; j < m; ++j) { for (var group =3D groups[j], n =3D group.length, subgroup =3D subgroup= s[j] =3D new Array(n), node, subnode, i =3D 0; i < n; ++i) { if ((node =3D group[i]) && (subnode =3D select.call(node, node.__data= __, i, group))) { if ("__data__" in node) subnode.__data__ =3D node.__data__; subgroup[i] =3D subnode; } } } return new Selection(subgroups, this._parents); } function empty() { return []; } function selectorAll(selector) { return selector =3D=3D null ? empty : function() { return this.querySelectorAll(selector); }; } function selection_selectAll(select) { if (typeof select !=3D=3D "function") select =3D selectorAll(select); for (var groups =3D this._groups, m =3D groups.length, subgroups =3D [], = parents =3D [], j =3D 0; j < m; ++j) { for (var group =3D groups[j], n =3D group.length, node, i =3D 0; i < n;= ++i) { if (node =3D group[i]) { subgroups.push(select.call(node, node.__data__, i, group)); parents.push(node); } } } return new Selection(subgroups, parents); } function matcher(selector) { return function() { return this.matches(selector); }; } function selection_filter(match) { if (typeof match !=3D=3D "function") match =3D matcher(match); for (var groups =3D this._groups, m =3D groups.length, subgroups =3D new = Array(m), j =3D 0; j < m; ++j) { for (var group =3D groups[j], n =3D group.length, subgroup =3D subgroup= s[j] =3D [], node, i =3D 0; i < n; ++i) { if ((node =3D group[i]) && match.call(node, node.__data__, i, group))= { subgroup.push(node); } } } return new Selection(subgroups, this._parents); } function sparse(update) { return new Array(update.length); } function selection_enter() { return new Selection(this._enter || this._groups.map(sparse), this._paren= ts); } function EnterNode(parent, datum) { this.ownerDocument =3D parent.ownerDocument; this.namespaceURI =3D parent.namespaceURI; this._next =3D null; this._parent =3D parent; this.__data__ =3D datum; } EnterNode.prototype =3D { constructor: EnterNode, appendChild: function(child) { return this._parent.insertBefore(child, th= is._next); }, insertBefore: function(child, next) { return this._parent.insertBefore(ch= ild, next); }, querySelector: function(selector) { return this._parent.querySelector(sel= ector); }, querySelectorAll: function(selector) { return this._parent.querySelectorA= ll(selector); } }; function constant$1(x) { return function() { return x; }; } var keyPrefix =3D "$"; // Protect against keys like =E2=80=9C__proto__=E2= =80=9D. function bindIndex(parent, group, enter, update, exit, data) { var i =3D 0, node, groupLength =3D group.length, dataLength =3D data.length; // Put any non-null nodes that fit into update. // Put any null nodes into enter. // Put any remaining data into enter. for (; i < dataLength; ++i) { if (node =3D group[i]) { node.__data__ =3D data[i]; update[i] =3D node; } else { enter[i] =3D new EnterNode(parent, data[i]); } } // Put any non-null nodes that don=E2=80=99t fit into exit. for (; i < groupLength; ++i) { if (node =3D group[i]) { exit[i] =3D node; } } } function bindKey(parent, group, enter, update, exit, data, key) { var i, node, nodeByKeyValue =3D {}, groupLength =3D group.length, dataLength =3D data.length, keyValues =3D new Array(groupLength), keyValue; // Compute the key for each node. // If multiple nodes have the same key, the duplicates are added to exit. for (i =3D 0; i < groupLength; ++i) { if (node =3D group[i]) { keyValues[i] =3D keyValue =3D keyPrefix + key.call(node, node.__data_= _, i, group); if (keyValue in nodeByKeyValue) { exit[i] =3D node; } else { nodeByKeyValue[keyValue] =3D node; } } } // Compute the key for each datum. // If there a node associated with this key, join and add it to update. // If there is not (or the key is a duplicate), add it to enter. for (i =3D 0; i < dataLength; ++i) { keyValue =3D keyPrefix + key.call(parent, data[i], i, data); if (node =3D nodeByKeyValue[keyValue]) { update[i] =3D node; node.__data__ =3D data[i]; nodeByKeyValue[keyValue] =3D null; } else { enter[i] =3D new EnterNode(parent, data[i]); } } // Add any remaining nodes that were not bound to data to exit. for (i =3D 0; i < groupLength; ++i) { if ((node =3D group[i]) && (nodeByKeyValue[keyValues[i]] =3D=3D=3D node= )) { exit[i] =3D node; } } } function selection_data(value, key) { if (!value) { data =3D new Array(this.size()), j =3D -1; this.each(function(d) { data[++j] =3D d; }); return data; } var bind =3D key ? bindKey : bindIndex, parents =3D this._parents, groups =3D this._groups; if (typeof value !=3D=3D "function") value =3D constant$1(value); for (var m =3D groups.length, update =3D new Array(m), enter =3D new Arra= y(m), exit =3D new Array(m), j =3D 0; j < m; ++j) { var parent =3D parents[j], group =3D groups[j], groupLength =3D group.length, data =3D value.call(parent, parent && parent.__data__, j, parents), dataLength =3D data.length, enterGroup =3D enter[j] =3D new Array(dataLength), updateGroup =3D update[j] =3D new Array(dataLength), exitGroup =3D exit[j] =3D new Array(groupLength); bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); // Now connect the enter nodes to their following update node, such that // appendChild can insert the materialized enter node before this node, // rather than at the end of the parent node. for (var i0 =3D 0, i1 =3D 0, previous, next; i0 < dataLength; ++i0) { if (previous =3D enterGroup[i0]) { if (i0 >=3D i1) i1 =3D i0 + 1; while (!(next =3D updateGroup[i1]) && ++i1 < dataLength); previous._next =3D next || null; } } } update =3D new Selection(update, parents); update._enter =3D enter; update._exit =3D exit; return update; } function selection_exit() { return new Selection(this._exit || this._groups.map(sparse), this._parent= s); } function selection_join(onenter, onupdate, onexit) { var enter =3D this.enter(), update =3D this, exit =3D this.exit(); enter =3D typeof onenter =3D=3D=3D "function" ? onenter(enter) : enter.ap= pend(onenter + ""); if (onupdate !=3D null) update =3D onupdate(update); if (onexit =3D=3D null) exit.remove(); else onexit(exit); return enter && update ? enter.merge(update).order() : update; } function selection_merge(selection$$1) { for (var groups0 =3D this._groups, groups1 =3D selection$$1._groups, m0 = =3D groups0.length, m1 =3D groups1.length, m =3D Math.min(m0, m1), merges = =3D new Array(m0), j =3D 0; j < m; ++j) { for (var group0 =3D groups0[j], group1 =3D groups1[j], n =3D group0.len= gth, merge =3D merges[j] =3D new Array(n), node, i =3D 0; i < n; ++i) { if (node =3D group0[i] || group1[i]) { merge[i] =3D node; } } } for (; j < m0; ++j) { merges[j] =3D groups0[j]; } return new Selection(merges, this._parents); } function selection_order() { for (var groups =3D this._groups, j =3D -1, m =3D groups.length; ++j < m;= ) { for (var group =3D groups[j], i =3D group.length - 1, next =3D group[i]= , node; --i >=3D 0;) { if (node =3D group[i]) { if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode= =2EinsertBefore(node, next); next =3D node; } } } return this; } function selection_sort(compare) { if (!compare) compare =3D ascending$1; function compareNode(a, b) { return a && b ? compare(a.__data__, b.__data__) : !a - !b; } for (var groups =3D this._groups, m =3D groups.length, sortgroups =3D new= Array(m), j =3D 0; j < m; ++j) { for (var group =3D groups[j], n =3D group.length, sortgroup =3D sortgro= ups[j] =3D new Array(n), node, i =3D 0; i < n; ++i) { if (node =3D group[i]) { sortgroup[i] =3D node; } } sortgroup.sort(compareNode); } return new Selection(sortgroups, this._parents).order(); } function ascending$1(a, b) { return a < b ? -1 : a > b ? 1 : a >=3D b ? 0 : NaN; } function selection_call() { var callback =3D arguments[0]; arguments[0] =3D this; callback.apply(null, arguments); return this; } function selection_nodes() { var nodes =3D new Array(this.size()), i =3D -1; this.each(function() { nodes[++i] =3D this; }); return nodes; } function selection_node() { for (var groups =3D this._groups, j =3D 0, m =3D groups.length; j < m; ++= j) { for (var group =3D groups[j], i =3D 0, n =3D group.length; i < n; ++i) { var node =3D group[i]; if (node) return node; } } return null; } function selection_size() { var size =3D 0; this.each(function() { ++size; }); return size; } function selection_empty() { return !this.node(); } function selection_each(callback) { for (var groups =3D this._groups, j =3D 0, m =3D groups.length; j < m; ++= j) { for (var group =3D groups[j], i =3D 0, n =3D group.length, node; i < n;= ++i) { if (node =3D group[i]) callback.call(node, node.__data__, i, group); } } return this; } function attrRemove(name) { return function() { this.removeAttribute(name); }; } function attrRemoveNS(fullname) { return function() { this.removeAttributeNS(fullname.space, fullname.local); }; } function attrConstant(name, value) { return function() { this.setAttribute(name, value); }; } function attrConstantNS(fullname, value) { return function() { this.setAttributeNS(fullname.space, fullname.local, value); }; } function attrFunction(name, value) { return function() { var v =3D value.apply(this, arguments); if (v =3D=3D null) this.removeAttribute(name); else this.setAttribute(name, v); }; } function attrFunctionNS(fullname, value) { return function() { var v =3D value.apply(this, arguments); if (v =3D=3D null) this.removeAttributeNS(fullname.space, fullname.loca= l); else this.setAttributeNS(fullname.space, fullname.local, v); }; } function selection_attr(name, value) { var fullname =3D namespace(name); if (arguments.length < 2) { var node =3D this.node(); return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname); } return this.each((value =3D=3D null ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value =3D=3D= =3D "function" ? (fullname.local ? attrFunctionNS : attrFunction) : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)= ); } function defaultView(node) { return (node.ownerDocument && node.ownerDocument.defaultView) // node is = a Node || (node.document && node) // node is a Window || node.defaultView; // node is a Document } function styleRemove(name) { return function() { this.style.removeProperty(name); }; } function styleConstant(name, value, priority) { return function() { this.style.setProperty(name, value, priority); }; } function styleFunction(name, value, priority) { return function() { var v =3D value.apply(this, arguments); if (v =3D=3D null) this.style.removeProperty(name); else this.style.setProperty(name, v, priority); }; } function selection_style(name, value, priority) { return arguments.length > 1 ? this.each((value =3D=3D null ? styleRemove : typeof value =3D=3D=3D "function" ? styleFunction : styleConstant)(name, value, priority =3D=3D null ? "" : prior= ity)) : styleValue(this.node(), name); } function styleValue(node, name) { return node.style.getPropertyValue(name) || defaultView(node).getComputedStyle(node, null).getPropertyValue(na= me); } function propertyRemove(name) { return function() { delete this[name]; }; } function propertyConstant(name, value) { return function() { this[name] =3D value; }; } function propertyFunction(name, value) { return function() { var v =3D value.apply(this, arguments); if (v =3D=3D null) delete this[name]; else this[name] =3D v; }; } function selection_property(name, value) { return arguments.length > 1 ? this.each((value =3D=3D null ? propertyRemove : typeof value =3D=3D=3D "function" ? propertyFunction : propertyConstant)(name, value)) : this.node()[name]; } function classArray(string) { return string.trim().split(/^|\s+/); } function classList(node) { return node.classList || new ClassList(node); } function ClassList(node) { this._node =3D node; this._names =3D classArray(node.getAttribute("class") || ""); } ClassList.prototype =3D { add: function(name) { var i =3D this._names.indexOf(name); if (i < 0) { this._names.push(name); this._node.setAttribute("class", this._names.join(" ")); } }, remove: function(name) { var i =3D this._names.indexOf(name); if (i >=3D 0) { this._names.splice(i, 1); this._node.setAttribute("class", this._names.join(" ")); } }, contains: function(name) { return this._names.indexOf(name) >=3D 0; } }; function classedAdd(node, names) { var list =3D classList(node), i =3D -1, n =3D names.length; while (++i < n) list.add(names[i]); } function classedRemove(node, names) { var list =3D classList(node), i =3D -1, n =3D names.length; while (++i < n) list.remove(names[i]); } function classedTrue(names) { return function() { classedAdd(this, names); }; } function classedFalse(names) { return function() { classedRemove(this, names); }; } function classedFunction(names, value) { return function() { (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names= ); }; } function selection_classed(name, value) { var names =3D classArray(name + ""); if (arguments.length < 2) { var list =3D classList(this.node()), i =3D -1, n =3D names.length; while (++i < n) if (!list.contains(names[i])) return false; return true; } return this.each((typeof value =3D=3D=3D "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value)); } function textRemove() { this.textContent =3D ""; } function textConstant(value) { return function() { this.textContent =3D value; }; } function textFunction(value) { return function() { var v =3D value.apply(this, arguments); this.textContent =3D v =3D=3D null ? "" : v; }; } function selection_text(value) { return arguments.length ? this.each(value =3D=3D null ? textRemove : (typeof value =3D=3D=3D "function" ? textFunction : textConstant)(value)) : this.node().textContent; } function htmlRemove() { this.innerHTML =3D ""; } function htmlConstant(value) { return function() { this.innerHTML =3D value; }; } function htmlFunction(value) { return function() { var v =3D value.apply(this, arguments); this.innerHTML =3D v =3D=3D null ? "" : v; }; } function selection_html(value) { return arguments.length ? this.each(value =3D=3D null ? htmlRemove : (typeof value =3D=3D=3D "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML; } function raise() { if (this.nextSibling) this.parentNode.appendChild(this); } function selection_raise() { return this.each(raise); } function lower() { if (this.previousSibling) this.parentNode.insertBefore(this, this.parentN= ode.firstChild); } function selection_lower() { return this.each(lower); } function selection_append(name) { var create =3D typeof name =3D=3D=3D "function" ? name : creator(name); return this.select(function() { return this.appendChild(create.apply(this, arguments)); }); } function constantNull() { return null; } function selection_insert(name, before) { var create =3D typeof name =3D=3D=3D "function" ? name : creator(name), select =3D before =3D=3D null ? constantNull : typeof before =3D=3D= =3D "function" ? before : selector(before); return this.select(function() { return this.insertBefore(create.apply(this, arguments), select.apply(th= is, arguments) || null); }); } function remove() { var parent =3D this.parentNode; if (parent) parent.removeChild(this); } function selection_remove() { return this.each(remove); } function selection_cloneShallow() { return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibli= ng); } function selection_cloneDeep() { return this.parentNode.insertBefore(this.cloneNode(true), this.nextSiblin= g); } function selection_clone(deep) { return this.select(deep ? selection_cloneDeep : selection_cloneShallow); } function selection_datum(value) { return arguments.length ? this.property("__data__", value) : this.node().__data__; } var filterEvents =3D {}; exports.event =3D null; if (typeof document !=3D=3D "undefined") { var element =3D document.documentElement; if (!("onmouseenter" in element)) { filterEvents =3D {mouseenter: "mouseover", mouseleave: "mouseout"}; } } function filterContextListener(listener, index, group) { listener =3D contextListener(listener, index, group); return function(event) { var related =3D event.relatedTarget; if (!related || (related !=3D=3D this && !(related.compareDocumentPosit= ion(this) & 8))) { listener.call(this, event); } }; } function contextListener(listener, index, group) { return function(event1) { var event0 =3D exports.event; // Events can be reentrant (e.g., focus). exports.event =3D event1; try { listener.call(this, this.__data__, index, group); } finally { exports.event =3D event0; } }; } function parseTypenames$1(typenames) { return typenames.trim().split(/^|\s+/).map(function(t) { var name =3D "", i =3D t.indexOf("."); if (i >=3D 0) name =3D t.slice(i + 1), t =3D t.slice(0, i); return {type: t, name: name}; }); } function onRemove(typename) { return function() { var on =3D this.__on; if (!on) return; for (var j =3D 0, i =3D -1, m =3D on.length, o; j < m; ++j) { if (o =3D on[j], (!typename.type || o.type =3D=3D=3D typename.type) &= & o.name =3D=3D=3D typename.name) { this.removeEventListener(o.type, o.listener, o.capture); } else { on[++i] =3D o; } } if (++i) on.length =3D i; else delete this.__on; }; } function onAdd(typename, value, capture) { var wrap =3D filterEvents.hasOwnProperty(typename.type) ? filterContextLi= stener : contextListener; return function(d, i, group) { var on =3D this.__on, o, listener =3D wrap(value, i, group); if (on) for (var j =3D 0, m =3D on.length; j < m; ++j) { if ((o =3D on[j]).type =3D=3D=3D typename.type && o.name =3D=3D=3D ty= pename.name) { this.removeEventListener(o.type, o.listener, o.capture); this.addEventListener(o.type, o.listener =3D listener, o.capture = =3D capture); o.value =3D value; return; } } this.addEventListener(typename.type, listener, capture); o =3D {type: typename.type, name: typename.name, value: value, listener= : listener, capture: capture}; if (!on) this.__on =3D [o]; else on.push(o); }; } function selection_on(typename, value, capture) { var typenames =3D parseTypenames$1(typename + ""), i, n =3D typenames.len= gth, t; if (arguments.length < 2) { var on =3D this.node().__on; if (on) for (var j =3D 0, m =3D on.length, o; j < m; ++j) { for (i =3D 0, o =3D on[j]; i < n; ++i) { if ((t =3D typenames[i]).type =3D=3D=3D o.type && t.name =3D=3D=3D = o.name) { return o.value; } } } return; } on =3D value ? onAdd : onRemove; if (capture =3D=3D null) capture =3D false; for (i =3D 0; i < n; ++i) this.each(on(typenames[i], value, capture)); return this; } function customEvent(event1, listener, that, args) { var event0 =3D exports.event; event1.sourceEvent =3D exports.event; exports.event =3D event1; try { return listener.apply(that, args); } finally { exports.event =3D event0; } } function dispatchEvent(node, type, params) { var window =3D defaultView(node), event =3D window.CustomEvent; if (typeof event =3D=3D=3D "function") { event =3D new event(type, params); } else { event =3D window.document.createEvent("Event"); if (params) event.initEvent(type, params.bubbles, params.cancelable), e= vent.detail =3D params.detail; else event.initEvent(type, false, false); } node.dispatchEvent(event); } function dispatchConstant(type, params) { return function() { return dispatchEvent(this, type, params); }; } function dispatchFunction(type, params) { return function() { return dispatchEvent(this, type, params.apply(this, arguments)); }; } function selection_dispatch(type, params) { return this.each((typeof params =3D=3D=3D "function" ? dispatchFunction : dispatchConstant)(type, params)); } var root =3D [null]; function Selection(groups, parents) { this._groups =3D groups; this._parents =3D parents; } function selection() { return new Selection([[document.documentElement]], root); } Selection.prototype =3D selection.prototype =3D { constructor: Selection, select: selection_select, selectAll: selection_selectAll, filter: selection_filter, data: selection_data, enter: selection_enter, exit: selection_exit, join: selection_join, merge: selection_merge, order: selection_order, sort: selection_sort, call: selection_call, nodes: selection_nodes, node: selection_node, size: selection_size, empty: selection_empty, each: selection_each, attr: selection_attr, style: selection_style, property: selection_property, classed: selection_classed, text: selection_text, html: selection_html, raise: selection_raise, lower: selection_lower, append: selection_append, insert: selection_insert, remove: selection_remove, clone: selection_clone, datum: selection_datum, on: selection_on, dispatch: selection_dispatch }; function select(selector) { return typeof selector =3D=3D=3D "string" ? new Selection([[document.querySelector(selector)]], [document.docum= entElement]) : new Selection([[selector]], root); } function create(name) { return select(creator(name).call(document.documentElement)); } var nextId =3D 0; function local() { return new Local; } function Local() { this._ =3D "@" + (++nextId).toString(36); } Local.prototype =3D local.prototype =3D { constructor: Local, get: function(node) { var id =3D this._; while (!(id in node)) if (!(node =3D node.parentNode)) return; return node[id]; }, set: function(node, value) { return node[this._] =3D value; }, remove: function(node) { return this._ in node && delete node[this._]; }, toString: function() { return this._; } }; function sourceEvent() { var current =3D exports.event, source; while (source =3D current.sourceEvent) current =3D source; return current; } function point(node, event) { var svg =3D node.ownerSVGElement || node; if (svg.createSVGPoint) { var point =3D svg.createSVGPoint(); point.x =3D event.clientX, point.y =3D event.clientY; point =3D point.matrixTransform(node.getScreenCTM().inverse()); return [point.x, point.y]; } var rect =3D node.getBoundingClientRect(); return [event.clientX - rect.left - node.clientLeft, event.clientY - rect= =2Etop - node.clientTop]; } function mouse(node) { var event =3D sourceEvent(); if (event.changedTouches) event =3D event.changedTouches[0]; return point(node, event); } function selectAll(selector) { return typeof selector =3D=3D=3D "string" ? new Selection([document.querySelectorAll(selector)], [document.docu= mentElement]) : new Selection([selector =3D=3D null ? [] : selector], root); } function touch(node, touches, identifier) { if (arguments.length < 3) identifier =3D touches, touches =3D sourceEvent= ().changedTouches; for (var i =3D 0, n =3D touches ? touches.length : 0, touch; i < n; ++i) { if ((touch =3D touches[i]).identifier =3D=3D=3D identifier) { return point(node, touch); } } return null; } function touches(node, touches) { if (touches =3D=3D null) touches =3D sourceEvent().touches; for (var i =3D 0, n =3D touches ? touches.length : 0, points =3D new Arra= y(n); i < n; ++i) { points[i] =3D point(node, touches[i]); } return points; } function nopropagation() { exports.event.stopImmediatePropagation(); } function noevent() { exports.event.preventDefault(); exports.event.stopImmediatePropagation(); } function dragDisable(view) { var root =3D view.document.documentElement, selection$$1 =3D select(view).on("dragstart.drag", noevent, true); if ("onselectstart" in root) { selection$$1.on("selectstart.drag", noevent, true); } else { root.__noselect =3D root.style.MozUserSelect; root.style.MozUserSelect =3D "none"; } } function yesdrag(view, noclick) { var root =3D view.document.documentElement, selection$$1 =3D select(view).on("dragstart.drag", null); if (noclick) { selection$$1.on("click.drag", noevent, true); setTimeout(function() { selection$$1.on("click.drag", null); }, 0); } if ("onselectstart" in root) { selection$$1.on("selectstart.drag", null); } else { root.style.MozUserSelect =3D root.__noselect; delete root.__noselect; } } function constant$2(x) { return function() { return x; }; } function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatc= h) { this.target =3D target; this.type =3D type; this.subject =3D subject; this.identifier =3D id; this.active =3D active; this.x =3D x; this.y =3D y; this.dx =3D dx; this.dy =3D dy; this._ =3D dispatch; } DragEvent.prototype.on =3D function() { var value =3D this._.on.apply(this._, arguments); return value =3D=3D=3D this._ ? this : value; }; // Ignore right-click, since that should open the context menu. function defaultFilter() { return !exports.event.button; } function defaultContainer() { return this.parentNode; } function defaultSubject(d) { return d =3D=3D null ? {x: exports.event.x, y: exports.event.y} : d; } function defaultTouchable() { return "ontouchstart" in this; } function drag() { var filter =3D defaultFilter, container =3D defaultContainer, subject =3D defaultSubject, touchable =3D defaultTouchable, gestures =3D {}, listeners =3D dispatch("start", "drag", "end"), active =3D 0, mousedownx, mousedowny, mousemoving, touchending, clickDistance2 =3D 0; function drag(selection$$1) { selection$$1 .on("mousedown.drag", mousedowned) .filter(touchable) .on("touchstart.drag", touchstarted) .on("touchmove.drag", touchmoved) .on("touchend.drag touchcancel.drag", touchended) .style("touch-action", "none") .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); } function mousedowned() { if (touchending || !filter.apply(this, arguments)) return; var gesture =3D beforestart("mouse", container.apply(this, arguments), = mouse, this, arguments); if (!gesture) return; select(exports.event.view).on("mousemove.drag", mousemoved, true).on("m= ouseup.drag", mouseupped, true); dragDisable(exports.event.view); nopropagation(); mousemoving =3D false; mousedownx =3D exports.event.clientX; mousedowny =3D exports.event.clientY; gesture("start"); } function mousemoved() { noevent(); if (!mousemoving) { var dx =3D exports.event.clientX - mousedownx, dy =3D exports.event.c= lientY - mousedowny; mousemoving =3D dx * dx + dy * dy > clickDistance2; } gestures.mouse("drag"); } function mouseupped() { select(exports.event.view).on("mousemove.drag mouseup.drag", null); yesdrag(exports.event.view, mousemoving); noevent(); gestures.mouse("end"); } function touchstarted() { if (!filter.apply(this, arguments)) return; var touches$$1 =3D exports.event.changedTouches, c =3D container.apply(this, arguments), n =3D touches$$1.length, i, gesture; for (i =3D 0; i < n; ++i) { if (gesture =3D beforestart(touches$$1[i].identifier, c, touch, this,= arguments)) { nopropagation(); gesture("start"); } } } function touchmoved() { var touches$$1 =3D exports.event.changedTouches, n =3D touches$$1.length, i, gesture; for (i =3D 0; i < n; ++i) { if (gesture =3D gestures[touches$$1[i].identifier]) { noevent(); gesture("drag"); } } } function touchended() { var touches$$1 =3D exports.event.changedTouches, n =3D touches$$1.length, i, gesture; if (touchending) clearTimeout(touchending); touchending =3D setTimeout(function() { touchending =3D null; }, 500); = // Ghost clicks are delayed! for (i =3D 0; i < n; ++i) { if (gesture =3D gestures[touches$$1[i].identifier]) { nopropagation(); gesture("end"); } } } function beforestart(id, container, point$$1, that, args) { var p =3D point$$1(container, id), s, dx, dy, sublisteners =3D listeners.copy(); if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0]= , p[1], 0, 0, sublisteners), function() { if ((exports.event.subject =3D s =3D subject.apply(that, args)) =3D= =3D null) return false; dx =3D s.x - p[0] || 0; dy =3D s.y - p[1] || 0; return true; })) return; return function gesture(type) { var p0 =3D p, n; switch (type) { case "start": gestures[id] =3D gesture, n =3D active++; break; case "end": delete gestures[id], --active; // nobreak case "drag": p =3D point$$1(container, id), n =3D active; break; } customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy,= p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublistener= s, [type, that, args]); }; } drag.filter =3D function(_) { return arguments.length ? (filter =3D typeof _ =3D=3D=3D "function" ? _= : constant$2(!!_), drag) : filter; }; drag.container =3D function(_) { return arguments.length ? (container =3D typeof _ =3D=3D=3D "function" = ? _ : constant$2(_), drag) : container; }; drag.subject =3D function(_) { return arguments.length ? (subject =3D typeof _ =3D=3D=3D "function" ? = _ : constant$2(_), drag) : subject; }; drag.touchable =3D function(_) { return arguments.length ? (touchable =3D typeof _ =3D=3D=3D "function" = ? _ : constant$2(!!_), drag) : touchable; }; drag.on =3D function() { var value =3D listeners.on.apply(listeners, arguments); return value =3D=3D=3D listeners ? drag : value; }; drag.clickDistance =3D function(_) { return arguments.length ? (clickDistance2 =3D (_ =3D +_) * _, drag) : M= ath.sqrt(clickDistance2); }; return drag; } function define(constructor, factory, prototype) { constructor.prototype =3D factory.prototype =3D prototype; prototype.constructor =3D constructor; } function extend(parent, definition) { var prototype =3D Object.create(parent.prototype); for (var key in definition) prototype[key] =3D definition[key]; return prototype; } function Color() {} var darker =3D 0.7; var brighter =3D 1 / darker; var reI =3D "\\s*([+-]?\\d+)\\s*", reN =3D "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", reP =3D "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", reHex3 =3D /^#([0-9a-f]{3})$/, reHex6 =3D /^#([0-9a-f]{6})$/, reRgbInteger =3D new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), reRgbPercent =3D new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), reRgbaInteger =3D new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"= ), reRgbaPercent =3D new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"= ), reHslPercent =3D new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), reHslaPercent =3D new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"= ); var named =3D { aliceblue: 0xf0f8ff, antiquewhite: 0xfaebd7, aqua: 0x00ffff, aquamarine: 0x7fffd4, azure: 0xf0ffff, beige: 0xf5f5dc, bisque: 0xffe4c4, black: 0x000000, blanchedalmond: 0xffebcd, blue: 0x0000ff, blueviolet: 0x8a2be2, brown: 0xa52a2a, burlywood: 0xdeb887, cadetblue: 0x5f9ea0, chartreuse: 0x7fff00, chocolate: 0xd2691e, coral: 0xff7f50, cornflowerblue: 0x6495ed, cornsilk: 0xfff8dc, crimson: 0xdc143c, cyan: 0x00ffff, darkblue: 0x00008b, darkcyan: 0x008b8b, darkgoldenrod: 0xb8860b, darkgray: 0xa9a9a9, darkgreen: 0x006400, darkgrey: 0xa9a9a9, darkkhaki: 0xbdb76b, darkmagenta: 0x8b008b, darkolivegreen: 0x556b2f, darkorange: 0xff8c00, darkorchid: 0x9932cc, darkred: 0x8b0000, darksalmon: 0xe9967a, darkseagreen: 0x8fbc8f, darkslateblue: 0x483d8b, darkslategray: 0x2f4f4f, darkslategrey: 0x2f4f4f, darkturquoise: 0x00ced1, darkviolet: 0x9400d3, deeppink: 0xff1493, deepskyblue: 0x00bfff, dimgray: 0x696969, dimgrey: 0x696969, dodgerblue: 0x1e90ff, firebrick: 0xb22222, floralwhite: 0xfffaf0, forestgreen: 0x228b22, fuchsia: 0xff00ff, gainsboro: 0xdcdcdc, ghostwhite: 0xf8f8ff, gold: 0xffd700, goldenrod: 0xdaa520, gray: 0x808080, green: 0x008000, greenyellow: 0xadff2f, grey: 0x808080, honeydew: 0xf0fff0, hotpink: 0xff69b4, indianred: 0xcd5c5c, indigo: 0x4b0082, ivory: 0xfffff0, khaki: 0xf0e68c, lavender: 0xe6e6fa, lavenderblush: 0xfff0f5, lawngreen: 0x7cfc00, lemonchiffon: 0xfffacd, lightblue: 0xadd8e6, lightcoral: 0xf08080, lightcyan: 0xe0ffff, lightgoldenrodyellow: 0xfafad2, lightgray: 0xd3d3d3, lightgreen: 0x90ee90, lightgrey: 0xd3d3d3, lightpink: 0xffb6c1, lightsalmon: 0xffa07a, lightseagreen: 0x20b2aa, lightskyblue: 0x87cefa, lightslategray: 0x778899, lightslategrey: 0x778899, lightsteelblue: 0xb0c4de, lightyellow: 0xffffe0, lime: 0x00ff00, limegreen: 0x32cd32, linen: 0xfaf0e6, magenta: 0xff00ff, maroon: 0x800000, mediumaquamarine: 0x66cdaa, mediumblue: 0x0000cd, mediumorchid: 0xba55d3, mediumpurple: 0x9370db, mediumseagreen: 0x3cb371, mediumslateblue: 0x7b68ee, mediumspringgreen: 0x00fa9a, mediumturquoise: 0x48d1cc, mediumvioletred: 0xc71585, midnightblue: 0x191970, mintcream: 0xf5fffa, mistyrose: 0xffe4e1, moccasin: 0xffe4b5, navajowhite: 0xffdead, navy: 0x000080, oldlace: 0xfdf5e6, olive: 0x808000, olivedrab: 0x6b8e23, orange: 0xffa500, orangered: 0xff4500, orchid: 0xda70d6, palegoldenrod: 0xeee8aa, palegreen: 0x98fb98, paleturquoise: 0xafeeee, palevioletred: 0xdb7093, papayawhip: 0xffefd5, peachpuff: 0xffdab9, peru: 0xcd853f, pink: 0xffc0cb, plum: 0xdda0dd, powderblue: 0xb0e0e6, purple: 0x800080, rebeccapurple: 0x663399, red: 0xff0000, rosybrown: 0xbc8f8f, royalblue: 0x4169e1, saddlebrown: 0x8b4513, salmon: 0xfa8072, sandybrown: 0xf4a460, seagreen: 0x2e8b57, seashell: 0xfff5ee, sienna: 0xa0522d, silver: 0xc0c0c0, skyblue: 0x87ceeb, slateblue: 0x6a5acd, slategray: 0x708090, slategrey: 0x708090, snow: 0xfffafa, springgreen: 0x00ff7f, steelblue: 0x4682b4, tan: 0xd2b48c, teal: 0x008080, thistle: 0xd8bfd8, tomato: 0xff6347, turquoise: 0x40e0d0, violet: 0xee82ee, wheat: 0xf5deb3, white: 0xffffff, whitesmoke: 0xf5f5f5, yellow: 0xffff00, yellowgreen: 0x9acd32 }; define(Color, color, { displayable: function() { return this.rgb().displayable(); }, hex: function() { return this.rgb().hex(); }, toString: function() { return this.rgb() + ""; } }); function color(format) { var m; format =3D (format + "").trim().toLowerCase(); return (m =3D reHex3.exec(format)) ? (m =3D parseInt(m[1], 16), new Rgb((= m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) <= < 4) | (m & 0xf), 1)) // #f00 : (m =3D reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000 : (m =3D reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) //= rgb(255, 0, 0) : (m =3D reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] = * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) : (m =3D reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) /= / rgba(255, 0, 0, 1) : (m =3D reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * = 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) : (m =3D reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 1= 00, 1) // hsl(120, 50%, 50%) : (m =3D reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / = 100, m[4]) // hsla(120, 50%, 50%, 1) : named.hasOwnProperty(format) ? rgbn(named[format]) : format =3D=3D=3D "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null; } function rgbn(n) { return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); } function rgba(r, g, b, a) { if (a <=3D 0) r =3D g =3D b =3D NaN; return new Rgb(r, g, b, a); } function rgbConvert(o) { if (!(o instanceof Color)) o =3D color(o); if (!o) return new Rgb; o =3D o.rgb(); return new Rgb(o.r, o.g, o.b, o.opacity); } function rgb(r, g, b, opacity) { return arguments.length =3D=3D=3D 1 ? rgbConvert(r) : new Rgb(r, g, b, op= acity =3D=3D null ? 1 : opacity); } function Rgb(r, g, b, opacity) { this.r =3D +r; this.g =3D +g; this.b =3D +b; this.opacity =3D +opacity; } define(Rgb, rgb, extend(Color, { brighter: function(k) { k =3D k =3D=3D null ? brighter : Math.pow(brighter, k); return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); }, darker: function(k) { k =3D k =3D=3D null ? darker : Math.pow(darker, k); return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); }, rgb: function() { return this; }, displayable: function() { return (-0.5 <=3D this.r && this.r < 255.5) && (-0.5 <=3D this.g && this.g < 255.5) && (-0.5 <=3D this.b && this.b < 255.5) && (0 <=3D this.opacity && this.opacity <=3D 1); }, hex: function() { return "#" + hex(this.r) + hex(this.g) + hex(this.b); }, toString: function() { var a =3D this.opacity; a =3D isNaN(a) ? 1 : Math.max(0, Math.min(1, a)= ); return (a =3D=3D=3D 1 ? "rgb(" : "rgba(") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (a =3D=3D=3D 1 ? ")" : ", " + a + ")"); } })); function hex(value) { value =3D Math.max(0, Math.min(255, Math.round(value) || 0)); return (value < 16 ? "0" : "") + value.toString(16); } function hsla(h, s, l, a) { if (a <=3D 0) h =3D s =3D l =3D NaN; else if (l <=3D 0 || l >=3D 1) h =3D s =3D NaN; else if (s <=3D 0) h =3D NaN; return new Hsl(h, s, l, a); } function hslConvert(o) { if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); if (!(o instanceof Color)) o =3D color(o); if (!o) return new Hsl; if (o instanceof Hsl) return o; o =3D o.rgb(); var r =3D o.r / 255, g =3D o.g / 255, b =3D o.b / 255, min =3D Math.min(r, g, b), max =3D Math.max(r, g, b), h =3D NaN, s =3D max - min, l =3D (max + min) / 2; if (s) { if (r =3D=3D=3D max) h =3D (g - b) / s + (g < b) * 6; else if (g =3D=3D=3D max) h =3D (b - r) / s + 2; else h =3D (r - g) / s + 4; s /=3D l < 0.5 ? max + min : 2 - max - min; h *=3D 60; } else { s =3D l > 0 && l < 1 ? 0 : h; } return new Hsl(h, s, l, o.opacity); } function hsl(h, s, l, opacity) { return arguments.length =3D=3D=3D 1 ? hslConvert(h) : new Hsl(h, s, l, op= acity =3D=3D null ? 1 : opacity); } function Hsl(h, s, l, opacity) { this.h =3D +h; this.s =3D +s; this.l =3D +l; this.opacity =3D +opacity; } define(Hsl, hsl, extend(Color, { brighter: function(k) { k =3D k =3D=3D null ? brighter : Math.pow(brighter, k); return new Hsl(this.h, this.s, this.l * k, this.opacity); }, darker: function(k) { k =3D k =3D=3D null ? darker : Math.pow(darker, k); return new Hsl(this.h, this.s, this.l * k, this.opacity); }, rgb: function() { var h =3D this.h % 360 + (this.h < 0) * 360, s =3D isNaN(h) || isNaN(this.s) ? 0 : this.s, l =3D this.l, m2 =3D l + (l < 0.5 ? l : 1 - l) * s, m1 =3D 2 * l - m2; return new Rgb( hsl2rgb(h >=3D 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity ); }, displayable: function() { return (0 <=3D this.s && this.s <=3D 1 || isNaN(this.s)) && (0 <=3D this.l && this.l <=3D 1) && (0 <=3D this.opacity && this.opacity <=3D 1); } })); /* From FvD 13.37, CSS Color Module Level 3 */ function hsl2rgb(h, m1, m2) { return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255; } var deg2rad =3D Math.PI / 180; var rad2deg =3D 180 / Math.PI; // https://observablehq.com/@mbostock/lab-and-rgb var K =3D 18, Xn =3D 0.96422, Yn =3D 1, Zn =3D 0.82521, t0 =3D 4 / 29, t1 =3D 6 / 29, t2 =3D 3 * t1 * t1, t3 =3D t1 * t1 * t1; function labConvert(o) { if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); if (o instanceof Hcl) return hcl2lab(o); if (!(o instanceof Rgb)) o =3D rgbConvert(o); var r =3D rgb2lrgb(o.r), g =3D rgb2lrgb(o.g), b =3D rgb2lrgb(o.b), y =3D xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), = x, z; if (r =3D=3D=3D g && g =3D=3D=3D b) x =3D z =3D y; else { x =3D xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); z =3D xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); } return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); } function gray(l, opacity) { return new Lab(l, 0, 0, opacity =3D=3D null ? 1 : opacity); } function lab(l, a, b, opacity) { return arguments.length =3D=3D=3D 1 ? labConvert(l) : new Lab(l, a, b, op= acity =3D=3D null ? 1 : opacity); } function Lab(l, a, b, opacity) { this.l =3D +l; this.a =3D +a; this.b =3D +b; this.opacity =3D +opacity; } define(Lab, lab, extend(Color, { brighter: function(k) { return new Lab(this.l + K * (k =3D=3D null ? 1 : k), this.a, this.b, th= is.opacity); }, darker: function(k) { return new Lab(this.l - K * (k =3D=3D null ? 1 : k), this.a, this.b, th= is.opacity); }, rgb: function() { var y =3D (this.l + 16) / 116, x =3D isNaN(this.a) ? y : y + this.a / 500, z =3D isNaN(this.b) ? y : y - this.b / 200; x =3D Xn * lab2xyz(x); y =3D Yn * lab2xyz(y); z =3D Zn * lab2xyz(z); return new Rgb( lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z), lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z), this.opacity ); } })); function xyz2lab(t) { return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; } function lab2xyz(t) { return t > t1 ? t * t * t : t2 * (t - t0); } function lrgb2rgb(x) { return 255 * (x <=3D 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4)= - 0.055); } function rgb2lrgb(x) { return (x /=3D 255) <=3D 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.0= 55, 2.4); } function hclConvert(o) { if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); if (!(o instanceof Lab)) o =3D labConvert(o); if (o.a =3D=3D=3D 0 && o.b =3D=3D=3D 0) return new Hcl(NaN, 0 < o.l && o.= l < 100 ? 0 : NaN, o.l, o.opacity); var h =3D Math.atan2(o.b, o.a) * rad2deg; return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l= , o.opacity); } function lch(l, c, h, opacity) { return arguments.length =3D=3D=3D 1 ? hclConvert(l) : new Hcl(h, c, l, op= acity =3D=3D null ? 1 : opacity); } function hcl(h, c, l, opacity) { return arguments.length =3D=3D=3D 1 ? hclConvert(h) : new Hcl(h, c, l, op= acity =3D=3D null ? 1 : opacity); } function Hcl(h, c, l, opacity) { this.h =3D +h; this.c =3D +c; this.l =3D +l; this.opacity =3D +opacity; } function hcl2lab(o) { if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); var h =3D o.h * deg2rad; return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); } define(Hcl, hcl, extend(Color, { brighter: function(k) { return new Hcl(this.h, this.c, this.l + K * (k =3D=3D null ? 1 : k), th= is.opacity); }, darker: function(k) { return new Hcl(this.h, this.c, this.l - K * (k =3D=3D null ? 1 : k), th= is.opacity); }, rgb: function() { return hcl2lab(this).rgb(); } })); var A =3D -0.14861, B =3D +1.78277, C =3D -0.29227, D =3D -0.90649, E =3D +1.97294, ED =3D E * D, EB =3D E * B, BC_DA =3D B * C - D * A; function cubehelixConvert(o) { if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity= ); if (!(o instanceof Rgb)) o =3D rgbConvert(o); var r =3D o.r / 255, g =3D o.g / 255, b =3D o.b / 255, l =3D (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), bl =3D b - l, k =3D (E * (g - l) - C * bl) / D, s =3D Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=3D0= or l=3D1 h =3D s ? Math.atan2(k, bl) * rad2deg - 120 : NaN; return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); } function cubehelix(h, s, l, opacity) { return arguments.length =3D=3D=3D 1 ? cubehelixConvert(h) : new Cubehelix= (h, s, l, opacity =3D=3D null ? 1 : opacity); } function Cubehelix(h, s, l, opacity) { this.h =3D +h; this.s =3D +s; this.l =3D +l; this.opacity =3D +opacity; } define(Cubehelix, cubehelix, extend(Color, { brighter: function(k) { k =3D k =3D=3D null ? brighter : Math.pow(brighter, k); return new Cubehelix(this.h, this.s, this.l * k, this.opacity); }, darker: function(k) { k =3D k =3D=3D null ? darker : Math.pow(darker, k); return new Cubehelix(this.h, this.s, this.l * k, this.opacity); }, rgb: function() { var h =3D isNaN(this.h) ? 0 : (this.h + 120) * deg2rad, l =3D +this.l, a =3D isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh =3D Math.cos(h), sinh =3D Math.sin(h); return new Rgb( 255 * (l + a * (A * cosh + B * sinh)), 255 * (l + a * (C * cosh + D * sinh)), 255 * (l + a * (E * cosh)), this.opacity ); } })); function basis(t1, v0, v1, v2, v3) { var t2 =3D t1 * t1, t3 =3D t2 * t1; return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6; } function basis$1(values) { var n =3D values.length - 1; return function(t) { var i =3D t <=3D 0 ? (t =3D 0) : t >=3D 1 ? (t =3D 1, n - 1) : Math.flo= or(t * n), v1 =3D values[i], v2 =3D values[i + 1], v0 =3D i > 0 ? values[i - 1] : 2 * v1 - v2, v3 =3D i < n - 1 ? values[i + 2] : 2 * v2 - v1; return basis((t - i / n) * n, v0, v1, v2, v3); }; } function basisClosed(values) { var n =3D values.length; return function(t) { var i =3D Math.floor(((t %=3D 1) < 0 ? ++t : t) * n), v0 =3D values[(i + n - 1) % n], v1 =3D values[i % n], v2 =3D values[(i + 1) % n], v3 =3D values[(i + 2) % n]; return basis((t - i / n) * n, v0, v1, v2, v3); }; } function constant$3(x) { return function() { return x; }; } function linear(a, d) { return function(t) { return a + t * d; }; } function exponential(a, b, y) { return a =3D Math.pow(a, y), b =3D Math.pow(b, y) - a, y =3D 1 / y, funct= ion(t) { return Math.pow(a + t * b, y); }; } function hue(a, b) { var d =3D b - a; return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) = : d) : constant$3(isNaN(a) ? b : a); } function gamma(y) { return (y =3D +y) =3D=3D=3D 1 ? nogamma : function(a, b) { return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a); }; } function nogamma(a, b) { var d =3D b - a; return d ? linear(a, d) : constant$3(isNaN(a) ? b : a); } var interpolateRgb =3D (function rgbGamma(y) { var color$$1 =3D gamma(y); function rgb$$1(start, end) { var r =3D color$$1((start =3D rgb(start)).r, (end =3D rgb(end)).r), g =3D color$$1(start.g, end.g), b =3D color$$1(start.b, end.b), opacity =3D nogamma(start.opacity, end.opacity); return function(t) { start.r =3D r(t); start.g =3D g(t); start.b =3D b(t); start.opacity =3D opacity(t); return start + ""; }; } rgb$$1.gamma =3D rgbGamma; return rgb$$1; })(1); function rgbSpline(spline) { return function(colors) { var n =3D colors.length, r =3D new Array(n), g =3D new Array(n), b =3D new Array(n), i, color$$1; for (i =3D 0; i < n; ++i) { color$$1 =3D rgb(colors[i]); r[i] =3D color$$1.r || 0; g[i] =3D color$$1.g || 0; b[i] =3D color$$1.b || 0; } r =3D spline(r); g =3D spline(g); b =3D spline(b); color$$1.opacity =3D 1; return function(t) { color$$1.r =3D r(t); color$$1.g =3D g(t); color$$1.b =3D b(t); return color$$1 + ""; }; }; } var rgbBasis =3D rgbSpline(basis$1); var rgbBasisClosed =3D rgbSpline(basisClosed); function array$1(a, b) { var nb =3D b ? b.length : 0, na =3D a ? Math.min(nb, a.length) : 0, x =3D new Array(na), c =3D new Array(nb), i; for (i =3D 0; i < na; ++i) x[i] =3D interpolateValue(a[i], b[i]); for (; i < nb; ++i) c[i] =3D b[i]; return function(t) { for (i =3D 0; i < na; ++i) c[i] =3D x[i](t); return c; }; } function date(a, b) { var d =3D new Date; return a =3D +a, b -=3D a, function(t) { return d.setTime(a + b * t), d; }; } function interpolateNumber(a, b) { return a =3D +a, b -=3D a, function(t) { return a + b * t; }; } function object(a, b) { var i =3D {}, c =3D {}, k; if (a =3D=3D=3D null || typeof a !=3D=3D "object") a =3D {}; if (b =3D=3D=3D null || typeof b !=3D=3D "object") b =3D {}; for (k in b) { if (k in a) { i[k] =3D interpolateValue(a[k], b[k]); } else { c[k] =3D b[k]; } } return function(t) { for (k in i) c[k] =3D i[k](t); return c; }; } var reA =3D /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, reB =3D new RegExp(reA.source, "g"); function zero(b) { return function() { return b; }; } function one(b) { return function(t) { return b(t) + ""; }; } function interpolateString(a, b) { var bi =3D reA.lastIndex =3D reB.lastIndex =3D 0, // scan index for next = number in b am, // current match in a bm, // current match in b bs, // string preceding current number in b, if any i =3D -1, // index in s s =3D [], // string constants and placeholders q =3D []; // number interpolators // Coerce inputs to strings. a =3D a + "", b =3D b + ""; // Interpolate pairs of numbers in a & b. while ((am =3D reA.exec(a)) && (bm =3D reB.exec(b))) { if ((bs =3D bm.index) > bi) { // a string precedes the next number in b bs =3D b.slice(bi, bs); if (s[i]) s[i] +=3D bs; // coalesce with previous string else s[++i] =3D bs; } if ((am =3D am[0]) =3D=3D=3D (bm =3D bm[0])) { // numbers in a & b match if (s[i]) s[i] +=3D bm; // coalesce with previous string else s[++i] =3D bm; } else { // interpolate non-matching numbers s[++i] =3D null; q.push({i: i, x: interpolateNumber(am, bm)}); } bi =3D reB.lastIndex; } // Add remains of b. if (bi < b.length) { bs =3D b.slice(bi); if (s[i]) s[i] +=3D bs; // coalesce with previous string else s[++i] =3D bs; } // Special optimization for only a single match. // Otherwise, interpolate each of the numbers and rejoin the string. return s.length < 2 ? (q[0] ? one(q[0].x) : zero(b)) : (b =3D q.length, function(t) { for (var i =3D 0, o; i < b; ++i) s[(o =3D q[i]).i] =3D o.x(t); return s.join(""); }); } function interpolateValue(a, b) { var t =3D typeof b, c; return b =3D=3D null || t =3D=3D=3D "boolean" ? constant$3(b) : (t =3D=3D=3D "number" ? interpolateNumber : t =3D=3D=3D "string" ? ((c =3D color(b)) ? (b =3D c, interpolateRgb= ) : interpolateString) : b instanceof color ? interpolateRgb : b instanceof Date ? date : Array.isArray(b) ? array$1 : typeof b.valueOf !=3D=3D "function" && typeof b.toString !=3D=3D "f= unction" || isNaN(b) ? object : interpolateNumber)(a, b); } function discrete(range) { var n =3D range.length; return function(t) { return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; }; } function hue$1(a, b) { var i =3D hue(+a, +b); return function(t) { var x =3D i(t); return x - 360 * Math.floor(x / 360); }; } function interpolateRound(a, b) { return a =3D +a, b -=3D a, function(t) { return Math.round(a + b * t); }; } var degrees =3D 180 / Math.PI; var identity$2 =3D { translateX: 0, translateY: 0, rotate: 0, skewX: 0, scaleX: 1, scaleY: 1 }; function decompose(a, b, c, d, e, f) { var scaleX, scaleY, skewX; if (scaleX =3D Math.sqrt(a * a + b * b)) a /=3D scaleX, b /=3D scaleX; if (skewX =3D a * c + b * d) c -=3D a * skewX, d -=3D b * skewX; if (scaleY =3D Math.sqrt(c * c + d * d)) c /=3D scaleY, d /=3D scaleY, sk= ewX /=3D scaleY; if (a * d < b * c) a =3D -a, b =3D -b, skewX =3D -skewX, scaleX =3D -scal= eX; return { translateX: e, translateY: f, rotate: Math.atan2(b, a) * degrees, skewX: Math.atan(skewX) * degrees, scaleX: scaleX, scaleY: scaleY }; } var cssNode, cssRoot, cssView, svgNode; function parseCss(value) { if (value =3D=3D=3D "none") return identity$2; if (!cssNode) cssNode =3D document.createElement("DIV"), cssRoot =3D docu= ment.documentElement, cssView =3D document.defaultView; cssNode.style.transform =3D value; value =3D cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).ge= tPropertyValue("transform"); cssRoot.removeChild(cssNode); value =3D value.slice(7, -1).split(","); return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], += value[5]); } function parseSvg(value) { if (value =3D=3D null) return identity$2; if (!svgNode) svgNode =3D document.createElementNS("http://www.w3.org/200= 0/svg", "g"); svgNode.setAttribute("transform", value); if (!(value =3D svgNode.transform.baseVal.consolidate())) return identity= $2; value =3D value.matrix; return decompose(value.a, value.b, value.c, value.d, value.e, value.f); } function interpolateTransform(parse, pxComma, pxParen, degParen) { function pop(s) { return s.length ? s.pop() + " " : ""; } function translate(xa, ya, xb, yb, s, q) { if (xa !=3D=3D xb || ya !=3D=3D yb) { var i =3D s.push("translate(", null, pxComma, null, pxParen); q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interp= olateNumber(ya, yb)}); } else if (xb || yb) { s.push("translate(" + xb + pxComma + yb + pxParen); } } function rotate(a, b, s, q) { if (a !=3D=3D b) { if (a - b > 180) b +=3D 360; else if (b - a > 180) a +=3D 360; // sho= rtest path q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpo= lateNumber(a, b)}); } else if (b) { s.push(pop(s) + "rotate(" + b + degParen); } } function skewX(a, b, s, q) { if (a !=3D=3D b) { q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpol= ateNumber(a, b)}); } else if (b) { s.push(pop(s) + "skewX(" + b + degParen); } } function scale(xa, ya, xb, yb, s, q) { if (xa !=3D=3D xb || ya !=3D=3D yb) { var i =3D s.push(pop(s) + "scale(", null, ",", null, ")"); q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interp= olateNumber(ya, yb)}); } else if (xb !=3D=3D 1 || yb !=3D=3D 1) { s.push(pop(s) + "scale(" + xb + "," + yb + ")"); } } return function(a, b) { var s =3D [], // string constants and placeholders q =3D []; // number interpolators a =3D parse(a), b =3D parse(b); translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); rotate(a.rotate, b.rotate, s, q); skewX(a.skewX, b.skewX, s, q); scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); a =3D b =3D null; // gc return function(t) { var i =3D -1, n =3D q.length, o; while (++i < n) s[(o =3D q[i]).i] =3D o.x(t); return s.join(""); }; }; } var interpolateTransformCss =3D interpolateTransform(parseCss, "px, ", "px)= ", "deg)"); var interpolateTransformSvg =3D interpolateTransform(parseSvg, ", ", ")", "= )"); var rho =3D Math.SQRT2, rho2 =3D 2, rho4 =3D 4, epsilon2 =3D 1e-12; function cosh(x) { return ((x =3D Math.exp(x)) + 1 / x) / 2; } function sinh(x) { return ((x =3D Math.exp(x)) - 1 / x) / 2; } function tanh(x) { return ((x =3D Math.exp(2 * x)) - 1) / (x + 1); } // p0 =3D [ux0, uy0, w0] // p1 =3D [ux1, uy1, w1] function interpolateZoom(p0, p1) { var ux0 =3D p0[0], uy0 =3D p0[1], w0 =3D p0[2], ux1 =3D p1[0], uy1 =3D p1[1], w1 =3D p1[2], dx =3D ux1 - ux0, dy =3D uy1 - uy0, d2 =3D dx * dx + dy * dy, i, S; // Special case for u0 =E2=89=85 u1. if (d2 < epsilon2) { S =3D Math.log(w1 / w0) / rho; i =3D function(t) { return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(rho * t * S) ]; }; } // General case. else { var d1 =3D Math.sqrt(d2), b0 =3D (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 =3D (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 =3D Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 =3D Math.log(Math.sqrt(b1 * b1 + 1) - b1); S =3D (r1 - r0) / rho; i =3D function(t) { var s =3D t * S, coshr0 =3D cosh(r0), u =3D w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / cosh(rho * s + r0) ]; }; } i.duration =3D S * 1000; return i; } function hsl$1(hue$$1) { return function(start, end) { var h =3D hue$$1((start =3D hsl(start)).h, (end =3D hsl(end)).h), s =3D nogamma(start.s, end.s), l =3D nogamma(start.l, end.l), opacity =3D nogamma(start.opacity, end.opacity); return function(t) { start.h =3D h(t); start.s =3D s(t); start.l =3D l(t); start.opacity =3D opacity(t); return start + ""; }; } } var hsl$2 =3D hsl$1(hue); var hslLong =3D hsl$1(nogamma); function lab$1(start, end) { var l =3D nogamma((start =3D lab(start)).l, (end =3D lab(end)).l), a =3D nogamma(start.a, end.a), b =3D nogamma(start.b, end.b), opacity =3D nogamma(start.opacity, end.opacity); return function(t) { start.l =3D l(t); start.a =3D a(t); start.b =3D b(t); start.opacity =3D opacity(t); return start + ""; }; } function hcl$1(hue$$1) { return function(start, end) { var h =3D hue$$1((start =3D hcl(start)).h, (end =3D hcl(end)).h), c =3D nogamma(start.c, end.c), l =3D nogamma(start.l, end.l), opacity =3D nogamma(start.opacity, end.opacity); return function(t) { start.h =3D h(t); start.c =3D c(t); start.l =3D l(t); start.opacity =3D opacity(t); return start + ""; }; } } var hcl$2 =3D hcl$1(hue); var hclLong =3D hcl$1(nogamma); function cubehelix$1(hue$$1) { return (function cubehelixGamma(y) { y =3D +y; function cubehelix$$1(start, end) { var h =3D hue$$1((start =3D cubehelix(start)).h, (end =3D cubehelix(e= nd)).h), s =3D nogamma(start.s, end.s), l =3D nogamma(start.l, end.l), opacity =3D nogamma(start.opacity, end.opacity); return function(t) { start.h =3D h(t); start.s =3D s(t); start.l =3D l(Math.pow(t, y)); start.opacity =3D opacity(t); return start + ""; }; } cubehelix$$1.gamma =3D cubehelixGamma; return cubehelix$$1; })(1); } var cubehelix$2 =3D cubehelix$1(hue); var cubehelixLong =3D cubehelix$1(nogamma); function piecewise(interpolate, values) { var i =3D 0, n =3D values.length - 1, v =3D values[0], I =3D new Array(n = < 0 ? 0 : n); while (i < n) I[i] =3D interpolate(v, v =3D values[++i]); return function(t) { var i =3D Math.max(0, Math.min(n - 1, Math.floor(t *=3D n))); return I[i](t - i); }; } function quantize(interpolator, n) { var samples =3D new Array(n); for (var i =3D 0; i < n; ++i) samples[i] =3D interpolator(i / (n - 1)); return samples; } var frame =3D 0, // is an animation frame pending? timeout =3D 0, // is a timeout pending? interval =3D 0, // are any timers active? pokeDelay =3D 1000, // how frequently we check for clock skew taskHead, taskTail, clockLast =3D 0, clockNow =3D 0, clockSkew =3D 0, clock =3D typeof performance =3D=3D=3D "object" && performance.now ? pe= rformance : Date, setFrame =3D typeof window =3D=3D=3D "object" && window.requestAnimatio= nFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeo= ut(f, 17); }; function now() { return clockNow || (setFrame(clearNow), clockNow =3D clock.now() + clockS= kew); } function clearNow() { clockNow =3D 0; } function Timer() { this._call =3D this._time =3D this._next =3D null; } Timer.prototype =3D timer.prototype =3D { constructor: Timer, restart: function(callback, delay, time) { if (typeof callback !=3D=3D "function") throw new TypeError("callback i= s not a function"); time =3D (time =3D=3D null ? now() : +time) + (delay =3D=3D null ? 0 : = +delay); if (!this._next && taskTail !=3D=3D this) { if (taskTail) taskTail._next =3D this; else taskHead =3D this; taskTail =3D this; } this._call =3D callback; this._time =3D time; sleep(); }, stop: function() { if (this._call) { this._call =3D null; this._time =3D Infinity; sleep(); } } }; function timer(callback, delay, time) { var t =3D new Timer; t.restart(callback, delay, time); return t; } function timerFlush() { now(); // Get the current time, if not already set. ++frame; // Pretend we=E2=80=99ve set an alarm, if we haven=E2=80=99t alr= eady. var t =3D taskHead, e; while (t) { if ((e =3D clockNow - t._time) >=3D 0) t._call.call(null, e); t =3D t._next; } --frame; } function wake() { clockNow =3D (clockLast =3D clock.now()) + clockSkew; frame =3D timeout =3D 0; try { timerFlush(); } finally { frame =3D 0; nap(); clockNow =3D 0; } } function poke() { var now =3D clock.now(), delay =3D now - clockLast; if (delay > pokeDelay) clockSkew -=3D delay, clockLast =3D now; } function nap() { var t0, t1 =3D taskHead, t2, time =3D Infinity; while (t1) { if (t1._call) { if (time > t1._time) time =3D t1._time; t0 =3D t1, t1 =3D t1._next; } else { t2 =3D t1._next, t1._next =3D null; t1 =3D t0 ? t0._next =3D t2 : taskHead =3D t2; } } taskTail =3D t0; sleep(time); } function sleep(time) { if (frame) return; // Soonest alarm already set, or will be. if (timeout) timeout =3D clearTimeout(timeout); var delay =3D time - clockNow; // Strictly less than if we recomputed clo= ckNow. if (delay > 24) { if (time < Infinity) timeout =3D setTimeout(wake, time - clock.now() - = clockSkew); if (interval) interval =3D clearInterval(interval); } else { if (!interval) clockLast =3D clock.now(), interval =3D setInterval(poke= , pokeDelay); frame =3D 1, setFrame(wake); } } function timeout$1(callback, delay, time) { var t =3D new Timer; delay =3D delay =3D=3D null ? 0 : +delay; t.restart(function(elapsed) { t.stop(); callback(elapsed + delay); }, delay, time); return t; } function interval$1(callback, delay, time) { var t =3D new Timer, total =3D delay; if (delay =3D=3D null) return t.restart(callback, delay, time), t; delay =3D +delay, time =3D time =3D=3D null ? now() : +time; t.restart(function tick(elapsed) { elapsed +=3D total; t.restart(tick, total +=3D delay, time); callback(elapsed); }, delay, time); return t; } var emptyOn =3D dispatch("start", "end", "cancel", "interrupt"); var emptyTween =3D []; var CREATED =3D 0; var SCHEDULED =3D 1; var STARTING =3D 2; var STARTED =3D 3; var RUNNING =3D 4; var ENDING =3D 5; var ENDED =3D 6; function schedule(node, name, id, index, group, timing) { var schedules =3D node.__transition; if (!schedules) node.__transition =3D {}; else if (id in schedules) return; create$1(node, id, { name: name, index: index, // For context during callback. group: group, // For context during callback. on: emptyOn, tween: emptyTween, time: timing.time, delay: timing.delay, duration: timing.duration, ease: timing.ease, timer: null, state: CREATED }); } function init(node, id) { var schedule =3D get$1(node, id); if (schedule.state > CREATED) throw new Error("too late; already schedule= d"); return schedule; } function set$1(node, id) { var schedule =3D get$1(node, id); if (schedule.state > STARTED) throw new Error("too late; already running"= ); return schedule; } function get$1(node, id) { var schedule =3D node.__transition; if (!schedule || !(schedule =3D schedule[id])) throw new Error("transitio= n not found"); return schedule; } function create$1(node, id, self) { var schedules =3D node.__transition, tween; // Initialize the self timer when the transition is created. // Note the actual delay is not known until the first callback! schedules[id] =3D self; self.timer =3D timer(schedule, 0, self.time); function schedule(elapsed) { self.state =3D SCHEDULED; self.timer.restart(start, self.delay, self.time); // If the elapsed delay is less than our first sleep, start immediately. if (self.delay <=3D elapsed) start(elapsed - self.delay); } function start(elapsed) { var i, j, n, o; // If the state is not SCHEDULED, then we previously errored on start. if (self.state !=3D=3D SCHEDULED) return stop(); for (i in schedules) { o =3D schedules[i]; if (o.name !=3D=3D self.name) continue; // While this element already has a starting transition during this f= rame, // defer starting an interrupting transition until that transition ha= s a // chance to tick (and possibly end); see d3/d3-transition#54! if (o.state =3D=3D=3D STARTED) return timeout$1(start); // Interrupt the active transition, if any. if (o.state =3D=3D=3D RUNNING) { o.state =3D ENDED; o.timer.stop(); o.on.call("interrupt", node, node.__data__, o.index, o.group); delete schedules[i]; } // Cancel any pre-empted transitions. else if (+i < id) { o.state =3D ENDED; o.timer.stop(); o.on.call("cancel", node, node.__data__, o.index, o.group); delete schedules[i]; } } // Defer the first tick to end of the current frame; see d3/d3#1576. // Note the transition may be canceled after start and before the first= tick! // Note this must be scheduled before the start event; see d3/d3-transi= tion#16! // Assuming this is successful, subsequent callbacks go straight to tic= k. timeout$1(function() { if (self.state =3D=3D=3D STARTED) { self.state =3D RUNNING; self.timer.restart(tick, self.delay, self.time); tick(elapsed); } }); // Dispatch the start event. // Note this must be done before the tween are initialized. self.state =3D STARTING; self.on.call("start", node, node.__data__, self.index, self.group); if (self.state !=3D=3D STARTING) return; // interrupted self.state =3D STARTED; // Initialize the tween, deleting null tween. tween =3D new Array(n =3D self.tween.length); for (i =3D 0, j =3D -1; i < n; ++i) { if (o =3D self.tween[i].value.call(node, node.__data__, self.index, s= elf.group)) { tween[++j] =3D o; } } tween.length =3D j + 1; } function tick(elapsed) { var t =3D elapsed < self.duration ? self.ease.call(null, elapsed / self= =2Eduration) : (self.timer.restart(stop), self.state =3D ENDING, 1), i =3D -1, n =3D tween.length; while (++i < n) { tween[i].call(node, t); } // Dispatch the end event. if (self.state =3D=3D=3D ENDING) { self.on.call("end", node, node.__data__, self.index, self.group); stop(); } } function stop() { self.state =3D ENDED; self.timer.stop(); delete schedules[id]; for (var i in schedules) return; // eslint-disable-line no-unused-vars delete node.__transition; } } function interrupt(node, name) { var schedules =3D node.__transition, schedule$$1, active, empty =3D true, i; if (!schedules) return; name =3D name =3D=3D null ? null : name + ""; for (i in schedules) { if ((schedule$$1 =3D schedules[i]).name !=3D=3D name) { empty =3D false= ; continue; } active =3D schedule$$1.state > STARTING && schedule$$1.state < ENDING; schedule$$1.state =3D ENDED; schedule$$1.timer.stop(); schedule$$1.on.call(active ? "interrupt" : "cancel", node, node.__data_= _, schedule$$1.index, schedule$$1.group); delete schedules[i]; } if (empty) delete node.__transition; } function selection_interrupt(name) { return this.each(function() { interrupt(this, name); }); } function tweenRemove(id, name) { var tween0, tween1; return function() { var schedule$$1 =3D set$1(this, id), tween =3D schedule$$1.tween; // If this node shared tween with the previous node, // just assign the updated shared tween and we=E2=80=99re done! // Otherwise, copy-on-write. if (tween !=3D=3D tween0) { tween1 =3D tween0 =3D tween; for (var i =3D 0, n =3D tween1.length; i < n; ++i) { if (tween1[i].name =3D=3D=3D name) { tween1 =3D tween1.slice(); tween1.splice(i, 1); break; } } } schedule$$1.tween =3D tween1; }; } function tweenFunction(id, name, value) { var tween0, tween1; if (typeof value !=3D=3D "function") throw new Error; return function() { var schedule$$1 =3D set$1(this, id), tween =3D schedule$$1.tween; // If this node shared tween with the previous node, // just assign the updated shared tween and we=E2=80=99re done! // Otherwise, copy-on-write. if (tween !=3D=3D tween0) { tween1 =3D (tween0 =3D tween).slice(); for (var t =3D {name: name, value: value}, i =3D 0, n =3D tween1.leng= th; i < n; ++i) { if (tween1[i].name =3D=3D=3D name) { tween1[i] =3D t; break; } } if (i =3D=3D=3D n) tween1.push(t); } schedule$$1.tween =3D tween1; }; } function transition_tween(name, value) { var id =3D this._id; name +=3D ""; if (arguments.length < 2) { var tween =3D get$1(this.node(), id).tween; for (var i =3D 0, n =3D tween.length, t; i < n; ++i) { if ((t =3D tween[i]).name =3D=3D=3D name) { return t.value; } } return null; } return this.each((value =3D=3D null ? tweenRemove : tweenFunction)(id, na= me, value)); } function tweenValue(transition, name, value) { var id =3D transition._id; transition.each(function() { var schedule$$1 =3D set$1(this, id); (schedule$$1.value || (schedule$$1.value =3D {}))[name] =3D value.apply= (this, arguments); }); return function(node) { return get$1(node, id).value[name]; }; } function interpolate(a, b) { var c; return (typeof b =3D=3D=3D "number" ? interpolateNumber : b instanceof color ? interpolateRgb : (c =3D color(b)) ? (b =3D c, interpolateRgb) : interpolateString)(a, b); } function attrRemove$1(name) { return function() { this.removeAttribute(name); }; } function attrRemoveNS$1(fullname) { return function() { this.removeAttributeNS(fullname.space, fullname.local); }; } function attrConstant$1(name, interpolate$$1, value1) { var string00, string1 =3D value1 + "", interpolate0; return function() { var string0 =3D this.getAttribute(name); return string0 =3D=3D=3D string1 ? null : string0 =3D=3D=3D string00 ? interpolate0 : interpolate0 =3D interpolate$$1(string00 =3D string0, value1); }; } function attrConstantNS$1(fullname, interpolate$$1, value1) { var string00, string1 =3D value1 + "", interpolate0; return function() { var string0 =3D this.getAttributeNS(fullname.space, fullname.local); return string0 =3D=3D=3D string1 ? null : string0 =3D=3D=3D string00 ? interpolate0 : interpolate0 =3D interpolate$$1(string00 =3D string0, value1); }; } function attrFunction$1(name, interpolate$$1, value) { var string00, string10, interpolate0; return function() { var string0, value1 =3D value(this), string1; if (value1 =3D=3D null) return void this.removeAttribute(name); string0 =3D this.getAttribute(name); string1 =3D value1 + ""; return string0 =3D=3D=3D string1 ? null : string0 =3D=3D=3D string00 && string1 =3D=3D=3D string10 ? interp= olate0 : (string10 =3D string1, interpolate0 =3D interpolate$$1(string00 = =3D string0, value1)); }; } function attrFunctionNS$1(fullname, interpolate$$1, value) { var string00, string10, interpolate0; return function() { var string0, value1 =3D value(this), string1; if (value1 =3D=3D null) return void this.removeAttributeNS(fullname.spa= ce, fullname.local); string0 =3D this.getAttributeNS(fullname.space, fullname.local); string1 =3D value1 + ""; return string0 =3D=3D=3D string1 ? null : string0 =3D=3D=3D string00 && string1 =3D=3D=3D string10 ? interp= olate0 : (string10 =3D string1, interpolate0 =3D interpolate$$1(string00 = =3D string0, value1)); }; } function transition_attr(name, value) { var fullname =3D namespace(name), i =3D fullname =3D=3D=3D "transform" ? = interpolateTransformSvg : interpolate; return this.attrTween(name, typeof value =3D=3D=3D "function" ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, t= weenValue(this, "attr." + name, value)) : value =3D=3D null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1= )(fullname) : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, v= alue)); } function attrInterpolate(name, i) { return function(t) { this.setAttribute(name, i(t)); }; } function attrInterpolateNS(fullname, i) { return function(t) { this.setAttributeNS(fullname.space, fullname.local, i(t)); }; } function attrTweenNS(fullname, value) { var t0, i0; function tween() { var i =3D value.apply(this, arguments); if (i !=3D=3D i0) t0 =3D (i0 =3D i) && attrInterpolateNS(fullname, i); return t0; } tween._value =3D value; return tween; } function attrTween(name, value) { var t0, i0; function tween() { var i =3D value.apply(this, arguments); if (i !=3D=3D i0) t0 =3D (i0 =3D i) && attrInterpolate(name, i); return t0; } tween._value =3D value; return tween; } function transition_attrTween(name, value) { var key =3D "attr." + name; if (arguments.length < 2) return (key =3D this.tween(key)) && key._value; if (value =3D=3D null) return this.tween(key, null); if (typeof value !=3D=3D "function") throw new Error; var fullname =3D namespace(name); return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullnam= e, value)); } function delayFunction(id, value) { return function() { init(this, id).delay =3D +value.apply(this, arguments); }; } function delayConstant(id, value) { return value =3D +value, function() { init(this, id).delay =3D value; }; } function transition_delay(value) { var id =3D this._id; return arguments.length ? this.each((typeof value =3D=3D=3D "function" ? delayFunction : delayConstant)(id, value)) : get$1(this.node(), id).delay; } function durationFunction(id, value) { return function() { set$1(this, id).duration =3D +value.apply(this, arguments); }; } function durationConstant(id, value) { return value =3D +value, function() { set$1(this, id).duration =3D value; }; } function transition_duration(value) { var id =3D this._id; return arguments.length ? this.each((typeof value =3D=3D=3D "function" ? durationFunction : durationConstant)(id, value)) : get$1(this.node(), id).duration; } function easeConstant(id, value) { if (typeof value !=3D=3D "function") throw new Error; return function() { set$1(this, id).ease =3D value; }; } function transition_ease(value) { var id =3D this._id; return arguments.length ? this.each(easeConstant(id, value)) : get$1(this.node(), id).ease; } function transition_filter(match) { if (typeof match !=3D=3D "function") match =3D matcher(match); for (var groups =3D this._groups, m =3D groups.length, subgroups =3D new = Array(m), j =3D 0; j < m; ++j) { for (var group =3D groups[j], n =3D group.length, subgroup =3D subgroup= s[j] =3D [], node, i =3D 0; i < n; ++i) { if ((node =3D group[i]) && match.call(node, node.__data__, i, group))= { subgroup.push(node); } } } return new Transition(subgroups, this._parents, this._name, this._id); } function transition_merge(transition$$1) { if (transition$$1._id !=3D=3D this._id) throw new Error; for (var groups0 =3D this._groups, groups1 =3D transition$$1._groups, m0 = =3D groups0.length, m1 =3D groups1.length, m =3D Math.min(m0, m1), merges = =3D new Array(m0), j =3D 0; j < m; ++j) { for (var group0 =3D groups0[j], group1 =3D groups1[j], n =3D group0.len= gth, merge =3D merges[j] =3D new Array(n), node, i =3D 0; i < n; ++i) { if (node =3D group0[i] || group1[i]) { merge[i] =3D node; } } } for (; j < m0; ++j) { merges[j] =3D groups0[j]; } return new Transition(merges, this._parents, this._name, this._id); } function start(name) { return (name + "").trim().split(/^|\s+/).every(function(t) { var i =3D t.indexOf("."); if (i >=3D 0) t =3D t.slice(0, i); return !t || t =3D=3D=3D "start"; }); } function onFunction(id, name, listener) { var on0, on1, sit =3D start(name) ? init : set$1; return function() { var schedule$$1 =3D sit(this, id), on =3D schedule$$1.on; // If this node shared a dispatch with the previous node, // just assign the updated shared dispatch and we=E2=80=99re done! // Otherwise, copy-on-write. if (on !=3D=3D on0) (on1 =3D (on0 =3D on).copy()).on(name, listener); schedule$$1.on =3D on1; }; } function transition_on(name, listener) { var id =3D this._id; return arguments.length < 2 ? get$1(this.node(), id).on.on(name) : this.each(onFunction(id, name, listener)); } function removeFunction(id) { return function() { var parent =3D this.parentNode; for (var i in this.__transition) if (+i !=3D=3D id) return; if (parent) parent.removeChild(this); }; } function transition_remove() { return this.on("end.remove", removeFunction(this._id)); } function transition_select(select$$1) { var name =3D this._name, id =3D this._id; if (typeof select$$1 !=3D=3D "function") select$$1 =3D selector(select$$1= ); for (var groups =3D this._groups, m =3D groups.length, subgroups =3D new = Array(m), j =3D 0; j < m; ++j) { for (var group =3D groups[j], n =3D group.length, subgroup =3D subgroup= s[j] =3D new Array(n), node, subnode, i =3D 0; i < n; ++i) { if ((node =3D group[i]) && (subnode =3D select$$1.call(node, node.__d= ata__, i, group))) { if ("__data__" in node) subnode.__data__ =3D node.__data__; subgroup[i] =3D subnode; schedule(subgroup[i], name, id, i, subgroup, get$1(node, id)); } } } return new Transition(subgroups, this._parents, name, id); } function transition_selectAll(select$$1) { var name =3D this._name, id =3D this._id; if (typeof select$$1 !=3D=3D "function") select$$1 =3D selectorAll(select= $$1); for (var groups =3D this._groups, m =3D groups.length, subgroups =3D [], = parents =3D [], j =3D 0; j < m; ++j) { for (var group =3D groups[j], n =3D group.length, node, i =3D 0; i < n;= ++i) { if (node =3D group[i]) { for (var children =3D select$$1.call(node, node.__data__, i, group)= , child, inherit =3D get$1(node, id), k =3D 0, l =3D children.length; k < l= ; ++k) { if (child =3D children[k]) { schedule(child, name, id, k, children, inherit); } } subgroups.push(children); parents.push(node); } } } return new Transition(subgroups, parents, name, id); } var Selection$1 =3D selection.prototype.constructor; function transition_selection() { return new Selection$1(this._groups, this._parents); } function styleNull(name, interpolate$$1) { var string00, string10, interpolate0; return function() { var string0 =3D styleValue(this, name), string1 =3D (this.style.removeProperty(name), styleValue(this, name= )); return string0 =3D=3D=3D string1 ? null : string0 =3D=3D=3D string00 && string1 =3D=3D=3D string10 ? interp= olate0 : interpolate0 =3D interpolate$$1(string00 =3D string0, string10 = =3D string1); }; } function styleRemove$1(name) { return function() { this.style.removeProperty(name); }; } function styleConstant$1(name, interpolate$$1, value1) { var string00, string1 =3D value1 + "", interpolate0; return function() { var string0 =3D styleValue(this, name); return string0 =3D=3D=3D string1 ? null : string0 =3D=3D=3D string00 ? interpolate0 : interpolate0 =3D interpolate$$1(string00 =3D string0, value1); }; } function styleFunction$1(name, interpolate$$1, value) { var string00, string10, interpolate0; return function() { var string0 =3D styleValue(this, name), value1 =3D value(this), string1 =3D value1 + ""; if (value1 =3D=3D null) string1 =3D value1 =3D (this.style.removeProper= ty(name), styleValue(this, name)); return string0 =3D=3D=3D string1 ? null : string0 =3D=3D=3D string00 && string1 =3D=3D=3D string10 ? interp= olate0 : (string10 =3D string1, interpolate0 =3D interpolate$$1(string00 = =3D string0, value1)); }; } function styleMaybeRemove(id, name) { var on0, on1, listener0, key =3D "style." + name, event =3D "end." + key,= remove; return function() { var schedule$$1 =3D set$1(this, id), on =3D schedule$$1.on, listener =3D schedule$$1.value[key] =3D=3D null ? remove || (remove= =3D styleRemove$1(name)) : undefined; // If this node shared a dispatch with the previous node, // just assign the updated shared dispatch and we=E2=80=99re done! // Otherwise, copy-on-write. if (on !=3D=3D on0 || listener0 !=3D=3D listener) (on1 =3D (on0 =3D on)= =2Ecopy()).on(event, listener0 =3D listener); schedule$$1.on =3D on1; }; } function transition_style(name, value, priority) { var i =3D (name +=3D "") =3D=3D=3D "transform" ? interpolateTransformCss = : interpolate; return value =3D=3D null ? this .styleTween(name, styleNull(name, i)) .on("end.style." + name, styleRemove$1(name)) : typeof value =3D=3D=3D "function" ? this .styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." = + name, value))) .each(styleMaybeRemove(this._id, name)) : this .styleTween(name, styleConstant$1(name, i, value), priority) .on("end.style." + name, null); } function styleInterpolate(name, i, priority) { return function(t) { this.style.setProperty(name, i(t), priority); }; } function styleTween(name, value, priority) { var t, i0; function tween() { var i =3D value.apply(this, arguments); if (i !=3D=3D i0) t =3D (i0 =3D i) && styleInterpolate(name, i, priorit= y); return t; } tween._value =3D value; return tween; } function transition_styleTween(name, value, priority) { var key =3D "style." + (name +=3D ""); if (arguments.length < 2) return (key =3D this.tween(key)) && key._value; if (value =3D=3D null) return this.tween(key, null); if (typeof value !=3D=3D "function") throw new Error; return this.tween(key, styleTween(name, value, priority =3D=3D null ? "" = : priority)); } function textConstant$1(value) { return function() { this.textContent =3D value; }; } function textFunction$1(value) { return function() { var value1 =3D value(this); this.textContent =3D value1 =3D=3D null ? "" : value1; }; } function transition_text(value) { return this.tween("text", typeof value =3D=3D=3D "function" ? textFunction$1(tweenValue(this, "text", value)) : textConstant$1(value =3D=3D null ? "" : value + "")); } function transition_transition() { var name =3D this._name, id0 =3D this._id, id1 =3D newId(); for (var groups =3D this._groups, m =3D groups.length, j =3D 0; j < m; ++= j) { for (var group =3D groups[j], n =3D group.length, node, i =3D 0; i < n;= ++i) { if (node =3D group[i]) { var inherit =3D get$1(node, id0); schedule(node, name, id1, i, group, { time: inherit.time + inherit.delay + inherit.duration, delay: 0, duration: inherit.duration, ease: inherit.ease }); } } } return new Transition(groups, this._parents, name, id1); } function transition_end() { var on0, on1, that =3D this, id =3D that._id, size =3D that.size(); return new Promise(function(resolve, reject) { var cancel =3D {value: reject}, end =3D {value: function() { if (--size =3D=3D=3D 0) resolve(); }}; that.each(function() { var schedule$$1 =3D set$1(this, id), on =3D schedule$$1.on; // If this node shared a dispatch with the previous node, // just assign the updated shared dispatch and we=E2=80=99re done! // Otherwise, copy-on-write. if (on !=3D=3D on0) { on1 =3D (on0 =3D on).copy(); on1._.cancel.push(cancel); on1._.interrupt.push(cancel); on1._.end.push(end); } schedule$$1.on =3D on1; }); }); } var id =3D 0; function Transition(groups, parents, name, id) { this._groups =3D groups; this._parents =3D parents; this._name =3D name; this._id =3D id; } function transition(name) { return selection().transition(name); } function newId() { return ++id; } var selection_prototype =3D selection.prototype; Transition.prototype =3D transition.prototype =3D { constructor: Transition, select: transition_select, selectAll: transition_selectAll, filter: transition_filter, merge: transition_merge, selection: transition_selection, transition: transition_transition, call: selection_prototype.call, nodes: selection_prototype.nodes, node: selection_prototype.node, size: selection_prototype.size, empty: selection_prototype.empty, each: selection_prototype.each, on: transition_on, attr: transition_attr, attrTween: transition_attrTween, style: transition_style, styleTween: transition_styleTween, text: transition_text, remove: transition_remove, tween: transition_tween, delay: transition_delay, duration: transition_duration, ease: transition_ease, end: transition_end }; function linear$1(t) { return +t; } function quadIn(t) { return t * t; } function quadOut(t) { return t * (2 - t); } function quadInOut(t) { return ((t *=3D 2) <=3D 1 ? t * t : --t * (2 - t) + 1) / 2; } function cubicIn(t) { return t * t * t; } function cubicOut(t) { return --t * t * t + 1; } function cubicInOut(t) { return ((t *=3D 2) <=3D 1 ? t * t * t : (t -=3D 2) * t * t + 2) / 2; } var exponent =3D 3; var polyIn =3D (function custom(e) { e =3D +e; function polyIn(t) { return Math.pow(t, e); } polyIn.exponent =3D custom; return polyIn; })(exponent); var polyOut =3D (function custom(e) { e =3D +e; function polyOut(t) { return 1 - Math.pow(1 - t, e); } polyOut.exponent =3D custom; return polyOut; })(exponent); var polyInOut =3D (function custom(e) { e =3D +e; function polyInOut(t) { return ((t *=3D 2) <=3D 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / = 2; } polyInOut.exponent =3D custom; return polyInOut; })(exponent); var pi =3D Math.PI, halfPi =3D pi / 2; function sinIn(t) { return 1 - Math.cos(t * halfPi); } function sinOut(t) { return Math.sin(t * halfPi); } function sinInOut(t) { return (1 - Math.cos(pi * t)) / 2; } function expIn(t) { return Math.pow(2, 10 * t - 10); } function expOut(t) { return 1 - Math.pow(2, -10 * t); } function expInOut(t) { return ((t *=3D 2) <=3D 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10= - 10 * t)) / 2; } function circleIn(t) { return 1 - Math.sqrt(1 - t * t); } function circleOut(t) { return Math.sqrt(1 - --t * t); } function circleInOut(t) { return ((t *=3D 2) <=3D 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= =3D 2) * t) + 1) / 2; } var b1 =3D 4 / 11, b2 =3D 6 / 11, b3 =3D 8 / 11, b4 =3D 3 / 4, b5 =3D 9 / 11, b6 =3D 10 / 11, b7 =3D 15 / 16, b8 =3D 21 / 22, b9 =3D 63 / 64, b0 =3D 1 / b1 / b1; function bounceIn(t) { return 1 - bounceOut(1 - t); } function bounceOut(t) { return (t =3D +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -=3D b2) * t + b4 = : t < b6 ? b0 * (t -=3D b5) * t + b7 : b0 * (t -=3D b8) * t + b9; } function bounceInOut(t) { return ((t *=3D 2) <=3D 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) = / 2; } var overshoot =3D 1.70158; var backIn =3D (function custom(s) { s =3D +s; function backIn(t) { return t * t * ((s + 1) * t - s); } backIn.overshoot =3D custom; return backIn; })(overshoot); var backOut =3D (function custom(s) { s =3D +s; function backOut(t) { return --t * t * ((s + 1) * t + s) + 1; } backOut.overshoot =3D custom; return backOut; })(overshoot); var backInOut =3D (function custom(s) { s =3D +s; function backInOut(t) { return ((t *=3D 2) < 1 ? t * t * ((s + 1) * t - s) : (t -=3D 2) * t * (= (s + 1) * t + s) + 2) / 2; } backInOut.overshoot =3D custom; return backInOut; })(overshoot); var tau =3D 2 * Math.PI, amplitude =3D 1, period =3D 0.3; var elasticIn =3D (function custom(a, p) { var s =3D Math.asin(1 / (a =3D Math.max(1, a))) * (p /=3D tau); function elasticIn(t) { return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p); } elasticIn.amplitude =3D function(a) { return custom(a, p * tau); }; elasticIn.period =3D function(p) { return custom(a, p); }; return elasticIn; })(amplitude, period); var elasticOut =3D (function custom(a, p) { var s =3D Math.asin(1 / (a =3D Math.max(1, a))) * (p /=3D tau); function elasticOut(t) { return 1 - a * Math.pow(2, -10 * (t =3D +t)) * Math.sin((t + s) / p); } elasticOut.amplitude =3D function(a) { return custom(a, p * tau); }; elasticOut.period =3D function(p) { return custom(a, p); }; return elasticOut; })(amplitude, period); var elasticInOut =3D (function custom(a, p) { var s =3D Math.asin(1 / (a =3D Math.max(1, a))) * (p /=3D tau); function elasticInOut(t) { return ((t =3D t * 2 - 1) < 0 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p) : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2; } elasticInOut.amplitude =3D function(a) { return custom(a, p * tau); }; elasticInOut.period =3D function(p) { return custom(a, p); }; return elasticInOut; })(amplitude, period); var defaultTiming =3D { time: null, // Set on use. delay: 0, duration: 250, ease: cubicInOut }; function inherit(node, id) { var timing; while (!(timing =3D node.__transition) || !(timing =3D timing[id])) { if (!(node =3D node.parentNode)) { return defaultTiming.time =3D now(), defaultTiming; } } return timing; } function selection_transition(name) { var id, timing; if (name instanceof Transition) { id =3D name._id, name =3D name._name; } else { id =3D newId(), (timing =3D defaultTiming).time =3D now(), name =3D nam= e =3D=3D null ? null : name + ""; } for (var groups =3D this._groups, m =3D groups.length, j =3D 0; j < m; ++= j) { for (var group =3D groups[j], n =3D group.length, node, i =3D 0; i < n;= ++i) { if (node =3D group[i]) { schedule(node, name, id, i, group, timing || inherit(node, id)); } } } return new Transition(groups, this._parents, name, id); } selection.prototype.interrupt =3D selection_interrupt; selection.prototype.transition =3D selection_transition; var root$1 =3D [null]; function active(node, name) { var schedules =3D node.__transition, schedule$$1, i; if (schedules) { name =3D name =3D=3D null ? null : name + ""; for (i in schedules) { if ((schedule$$1 =3D schedules[i]).state > SCHEDULED && schedule$$1.n= ame =3D=3D=3D name) { return new Transition([[node]], root$1, name, +i); } } } return null; } function constant$4(x) { return function() { return x; }; } function BrushEvent(target, type, selection) { this.target =3D target; this.type =3D type; this.selection =3D selection; } function nopropagation$1() { exports.event.stopImmediatePropagation(); } function noevent$1() { exports.event.preventDefault(); exports.event.stopImmediatePropagation(); } var MODE_DRAG =3D {name: "drag"}, MODE_SPACE =3D {name: "space"}, MODE_HANDLE =3D {name: "handle"}, MODE_CENTER =3D {name: "center"}; var X =3D { name: "x", handles: ["e", "w"].map(type), input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; }, output: function(xy) { return xy && [xy[0][0], xy[1][0]]; } }; var Y =3D { name: "y", handles: ["n", "s"].map(type), input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; }, output: function(xy) { return xy && [xy[0][1], xy[1][1]]; } }; var XY =3D { name: "xy", handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type), input: function(xy) { return xy; }, output: function(xy) { return xy; } }; var cursors =3D { overlay: "crosshair", selection: "move", n: "ns-resize", e: "ew-resize", s: "ns-resize", w: "ew-resize", nw: "nwse-resize", ne: "nesw-resize", se: "nwse-resize", sw: "nesw-resize" }; var flipX =3D { e: "w", w: "e", nw: "ne", ne: "nw", se: "sw", sw: "se" }; var flipY =3D { n: "s", s: "n", nw: "sw", ne: "se", se: "ne", sw: "nw" }; var signsX =3D { overlay: +1, selection: +1, n: null, e: +1, s: null, w: -1, nw: -1, ne: +1, se: +1, sw: -1 }; var signsY =3D { overlay: +1, selection: +1, n: -1, e: null, s: +1, w: null, nw: -1, ne: -1, se: +1, sw: +1 }; function type(t) { return {type: t}; } // Ignore right-click, since that should open the context menu. function defaultFilter$1() { return !exports.event.button; } function defaultExtent() { var svg =3D this.ownerSVGElement || this; return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; } // Like d3.local, but with the name =E2=80=9C__brush=E2=80=9D rather than a= uto-generated. function local$1(node) { while (!node.__brush) if (!(node =3D node.parentNode)) return; return node.__brush; } function empty$1(extent) { return extent[0][0] =3D=3D=3D extent[1][0] || extent[0][1] =3D=3D=3D extent[1][1]; } function brushSelection(node) { var state =3D node.__brush; return state ? state.dim.output(state.selection) : null; } function brushX() { return brush$1(X); } function brushY() { return brush$1(Y); } function brush() { return brush$1(XY); } function brush$1(dim) { var extent =3D defaultExtent, filter =3D defaultFilter$1, listeners =3D dispatch(brush, "start", "brush", "end"), handleSize =3D 6, touchending; function brush(group) { var overlay =3D group .property("__brush", initialize) .selectAll(".overlay") .data([type("overlay")]); overlay.enter().append("rect") .attr("class", "overlay") .attr("pointer-events", "all") .attr("cursor", cursors.overlay) .merge(overlay) .each(function() { var extent =3D local$1(this).extent; select(this) .attr("x", extent[0][0]) .attr("y", extent[0][1]) .attr("width", extent[1][0] - extent[0][0]) .attr("height", extent[1][1] - extent[0][1]); }); group.selectAll(".selection") .data([type("selection")]) .enter().append("rect") .attr("class", "selection") .attr("cursor", cursors.selection) .attr("fill", "#777") .attr("fill-opacity", 0.3) .attr("stroke", "#fff") .attr("shape-rendering", "crispEdges"); var handle =3D group.selectAll(".handle") .data(dim.handles, function(d) { return d.type; }); handle.exit().remove(); handle.enter().append("rect") .attr("class", function(d) { return "handle handle--" + d.type; }) .attr("cursor", function(d) { return cursors[d.type]; }); group .each(redraw) .attr("fill", "none") .attr("pointer-events", "all") .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)") .on("mousedown.brush touchstart.brush", started); } brush.move =3D function(group, selection$$1) { if (group.selection) { group .on("start.brush", function() { emitter(this, arguments).beforest= art().start(); }) .on("interrupt.brush end.brush", function() { emitter(this, argum= ents).end(); }) .tween("brush", function() { var that =3D this, state =3D that.__brush, emit =3D emitter(that, arguments), selection0 =3D state.selection, selection1 =3D dim.input(typeof selection$$1 =3D=3D=3D "fun= ction" ? selection$$1.apply(this, arguments) : selection$$1, state.extent), i =3D interpolateValue(selection0, selection1); function tween(t) { state.selection =3D t =3D=3D=3D 1 && empty$1(selection1) ? nu= ll : i(t); redraw.call(that); emit.brush(); } return selection0 && selection1 ? tween : tween(1); }); } else { group .each(function() { var that =3D this, args =3D arguments, state =3D that.__brush, selection1 =3D dim.input(typeof selection$$1 =3D=3D=3D "fun= ction" ? selection$$1.apply(that, args) : selection$$1, state.extent), emit =3D emitter(that, args).beforestart(); interrupt(that); state.selection =3D selection1 =3D=3D null || empty$1(selection= 1) ? null : selection1; redraw.call(that); emit.start().brush().end(); }); } }; function redraw() { var group =3D select(this), selection$$1 =3D local$1(this).selection; if (selection$$1) { group.selectAll(".selection") .style("display", null) .attr("x", selection$$1[0][0]) .attr("y", selection$$1[0][1]) .attr("width", selection$$1[1][0] - selection$$1[0][0]) .attr("height", selection$$1[1][1] - selection$$1[0][1]); group.selectAll(".handle") .style("display", null) .attr("x", function(d) { return d.type[d.type.length - 1] =3D=3D= =3D "e" ? selection$$1[1][0] - handleSize / 2 : selection$$1[0][0] - handle= Size / 2; }) .attr("y", function(d) { return d.type[0] =3D=3D=3D "s" ? selecti= on$$1[1][1] - handleSize / 2 : selection$$1[0][1] - handleSize / 2; }) .attr("width", function(d) { return d.type =3D=3D=3D "n" || d.typ= e =3D=3D=3D "s" ? selection$$1[1][0] - selection$$1[0][0] + handleSize : ha= ndleSize; }) .attr("height", function(d) { return d.type =3D=3D=3D "e" || d.ty= pe =3D=3D=3D "w" ? selection$$1[1][1] - selection$$1[0][1] + handleSize : h= andleSize; }); } else { group.selectAll(".selection,.handle") .style("display", "none") .attr("x", null) .attr("y", null) .attr("width", null) .attr("height", null); } } function emitter(that, args) { return that.__brush.emitter || new Emitter(that, args); } function Emitter(that, args) { this.that =3D that; this.args =3D args; this.state =3D that.__brush; this.active =3D 0; } Emitter.prototype =3D { beforestart: function() { if (++this.active =3D=3D=3D 1) this.state.emitter =3D this, this.star= ting =3D true; return this; }, start: function() { if (this.starting) this.starting =3D false, this.emit("start"); return this; }, brush: function() { this.emit("brush"); return this; }, end: function() { if (--this.active =3D=3D=3D 0) delete this.state.emitter, this.emit("= end"); return this; }, emit: function(type) { customEvent(new BrushEvent(brush, type, dim.output(this.state.selecti= on)), listeners.apply, listeners, [type, this.that, this.args]); } }; function started() { if (exports.event.touches) { if (exports.event.changedTouches.length < = exports.event.touches.length) return noevent$1(); } else if (touchending) return; if (!filter.apply(this, arguments)) return; var that =3D this, type =3D exports.event.target.__data__.type, mode =3D (exports.event.metaKey ? type =3D "overlay" : type) =3D=3D= =3D "selection" ? MODE_DRAG : (exports.event.altKey ? MODE_CENTER : MODE_HA= NDLE), signX =3D dim =3D=3D=3D Y ? null : signsX[type], signY =3D dim =3D=3D=3D X ? null : signsY[type], state =3D local$1(that), extent =3D state.extent, selection$$1 =3D state.selection, W =3D extent[0][0], w0, w1, N =3D extent[0][1], n0, n1, E =3D extent[1][0], e0, e1, S =3D extent[1][1], s0, s1, dx, dy, moving, shifting =3D signX && signY && exports.event.shiftKey, lockX, lockY, point0 =3D mouse(that), point$$1 =3D point0, emit =3D emitter(that, arguments).beforestart(); if (type =3D=3D=3D "overlay") { state.selection =3D selection$$1 =3D [ [w0 =3D dim =3D=3D=3D Y ? W : point0[0], n0 =3D dim =3D=3D=3D X ? N= : point0[1]], [e0 =3D dim =3D=3D=3D Y ? E : w0, s0 =3D dim =3D=3D=3D X ? S : n0] ]; } else { w0 =3D selection$$1[0][0]; n0 =3D selection$$1[0][1]; e0 =3D selection$$1[1][0]; s0 =3D selection$$1[1][1]; } w1 =3D w0; n1 =3D n0; e1 =3D e0; s1 =3D s0; var group =3D select(that) .attr("pointer-events", "none"); var overlay =3D group.selectAll(".overlay") .attr("cursor", cursors[type]); if (exports.event.touches) { group .on("touchmove.brush", moved, true) .on("touchend.brush touchcancel.brush", ended, true); } else { var view =3D select(exports.event.view) .on("keydown.brush", keydowned, true) .on("keyup.brush", keyupped, true) .on("mousemove.brush", moved, true) .on("mouseup.brush", ended, true); dragDisable(exports.event.view); } nopropagation$1(); interrupt(that); redraw.call(that); emit.start(); function moved() { var point1 =3D mouse(that); if (shifting && !lockX && !lockY) { if (Math.abs(point1[0] - point$$1[0]) > Math.abs(point1[1] - point$= $1[1])) lockY =3D true; else lockX =3D true; } point$$1 =3D point1; moving =3D true; noevent$1(); move(); } function move() { var t; dx =3D point$$1[0] - point0[0]; dy =3D point$$1[1] - point0[1]; switch (mode) { case MODE_SPACE: case MODE_DRAG: { if (signX) dx =3D Math.max(W - w0, Math.min(E - e0, dx)), w1 =3D = w0 + dx, e1 =3D e0 + dx; if (signY) dy =3D Math.max(N - n0, Math.min(S - s0, dy)), n1 =3D = n0 + dy, s1 =3D s0 + dy; break; } case MODE_HANDLE: { if (signX < 0) dx =3D Math.max(W - w0, Math.min(E - w0, dx)), w1 = =3D w0 + dx, e1 =3D e0; else if (signX > 0) dx =3D Math.max(W - e0, Math.min(E - e0, dx))= , w1 =3D w0, e1 =3D e0 + dx; if (signY < 0) dy =3D Math.max(N - n0, Math.min(S - n0, dy)), n1 = =3D n0 + dy, s1 =3D s0; else if (signY > 0) dy =3D Math.max(N - s0, Math.min(S - s0, dy))= , n1 =3D n0, s1 =3D s0 + dy; break; } case MODE_CENTER: { if (signX) w1 =3D Math.max(W, Math.min(E, w0 - dx * signX)), e1 = =3D Math.max(W, Math.min(E, e0 + dx * signX)); if (signY) n1 =3D Math.max(N, Math.min(S, n0 - dy * signY)), s1 = =3D Math.max(N, Math.min(S, s0 + dy * signY)); break; } } if (e1 < w1) { signX *=3D -1; t =3D w0, w0 =3D e0, e0 =3D t; t =3D w1, w1 =3D e1, e1 =3D t; if (type in flipX) overlay.attr("cursor", cursors[type =3D flipX[ty= pe]]); } if (s1 < n1) { signY *=3D -1; t =3D n0, n0 =3D s0, s0 =3D t; t =3D n1, n1 =3D s1, s1 =3D t; if (type in flipY) overlay.attr("cursor", cursors[type =3D flipY[ty= pe]]); } if (state.selection) selection$$1 =3D state.selection; // May be set = by brush.move! if (lockX) w1 =3D selection$$1[0][0], e1 =3D selection$$1[1][0]; if (lockY) n1 =3D selection$$1[0][1], s1 =3D selection$$1[1][1]; if (selection$$1[0][0] !=3D=3D w1 || selection$$1[0][1] !=3D=3D n1 || selection$$1[1][0] !=3D=3D e1 || selection$$1[1][1] !=3D=3D s1) { state.selection =3D [[w1, n1], [e1, s1]]; redraw.call(that); emit.brush(); } } function ended() { nopropagation$1(); if (exports.event.touches) { if (exports.event.touches.length) return; if (touchending) clearTimeout(touchending); touchending =3D setTimeout(function() { touchending =3D null; }, 50= 0); // Ghost clicks are delayed! group.on("touchmove.brush touchend.brush touchcancel.brush", null); } else { yesdrag(exports.event.view, moving); view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", = null); } group.attr("pointer-events", "all"); overlay.attr("cursor", cursors.overlay); if (state.selection) selection$$1 =3D state.selection; // May be set = by brush.move (on start)! if (empty$1(selection$$1)) state.selection =3D null, redraw.call(that= ); emit.end(); } function keydowned() { switch (exports.event.keyCode) { case 16: { // SHIFT shifting =3D signX && signY; break; } case 18: { // ALT if (mode =3D=3D=3D MODE_HANDLE) { if (signX) e0 =3D e1 - dx * signX, w0 =3D w1 + dx * signX; if (signY) s0 =3D s1 - dy * signY, n0 =3D n1 + dy * signY; mode =3D MODE_CENTER; move(); } break; } case 32: { // SPACE; takes priority over ALT if (mode =3D=3D=3D MODE_HANDLE || mode =3D=3D=3D MODE_CENTER) { if (signX < 0) e0 =3D e1 - dx; else if (signX > 0) w0 =3D w1 - = dx; if (signY < 0) s0 =3D s1 - dy; else if (signY > 0) n0 =3D n1 - = dy; mode =3D MODE_SPACE; overlay.attr("cursor", cursors.selection); move(); } break; } default: return; } noevent$1(); } function keyupped() { switch (exports.event.keyCode) { case 16: { // SHIFT if (shifting) { lockX =3D lockY =3D shifting =3D false; move(); } break; } case 18: { // ALT if (mode =3D=3D=3D MODE_CENTER) { if (signX < 0) e0 =3D e1; else if (signX > 0) w0 =3D w1; if (signY < 0) s0 =3D s1; else if (signY > 0) n0 =3D n1; mode =3D MODE_HANDLE; move(); } break; } case 32: { // SPACE if (mode =3D=3D=3D MODE_SPACE) { if (exports.event.altKey) { if (signX) e0 =3D e1 - dx * signX, w0 =3D w1 + dx * signX; if (signY) s0 =3D s1 - dy * signY, n0 =3D n1 + dy * signY; mode =3D MODE_CENTER; } else { if (signX < 0) e0 =3D e1; else if (signX > 0) w0 =3D w1; if (signY < 0) s0 =3D s1; else if (signY > 0) n0 =3D n1; mode =3D MODE_HANDLE; } overlay.attr("cursor", cursors[type]); move(); } break; } default: return; } noevent$1(); } } function initialize() { var state =3D this.__brush || {selection: null}; state.extent =3D extent.apply(this, arguments); state.dim =3D dim; return state; } brush.extent =3D function(_) { return arguments.length ? (extent =3D typeof _ =3D=3D=3D "function" ? _= : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : exten= t; }; brush.filter =3D function(_) { return arguments.length ? (filter =3D typeof _ =3D=3D=3D "function" ? _= : constant$4(!!_), brush) : filter; }; brush.handleSize =3D function(_) { return arguments.length ? (handleSize =3D +_, brush) : handleSize; }; brush.on =3D function() { var value =3D listeners.on.apply(listeners, arguments); return value =3D=3D=3D listeners ? brush : value; }; return brush; } var cos =3D Math.cos; var sin =3D Math.sin; var pi$1 =3D Math.PI; var halfPi$1 =3D pi$1 / 2; var tau$1 =3D pi$1 * 2; var max$1 =3D Math.max; function compareValue(compare) { return function(a, b) { return compare( a.source.value + a.target.value, b.source.value + b.target.value ); }; } function chord() { var padAngle =3D 0, sortGroups =3D null, sortSubgroups =3D null, sortChords =3D null; function chord(matrix) { var n =3D matrix.length, groupSums =3D [], groupIndex =3D sequence(n), subgroupIndex =3D [], chords =3D [], groups =3D chords.groups =3D new Array(n), subgroups =3D new Array(n * n), k, x, x0, dx, i, j; // Compute the sum. k =3D 0, i =3D -1; while (++i < n) { x =3D 0, j =3D -1; while (++j < n) { x +=3D matrix[i][j]; } groupSums.push(x); subgroupIndex.push(sequence(n)); k +=3D x; } // Sort groups=E2=80=A6 if (sortGroups) groupIndex.sort(function(a, b) { return sortGroups(groupSums[a], groupSums[b]); }); // Sort subgroups=E2=80=A6 if (sortSubgroups) subgroupIndex.forEach(function(d, i) { d.sort(function(a, b) { return sortSubgroups(matrix[i][a], matrix[i][b]); }); }); // Convert the sum to scaling factor for [0, 2pi]. // TODO Allow start and end angle to be specified? // TODO Allow padding to be specified as percentage? k =3D max$1(0, tau$1 - padAngle * n) / k; dx =3D k ? padAngle : tau$1 / n; // Compute the start and end angle for each group and subgroup. // Note: Opera has a bug reordering object literal properties! x =3D 0, i =3D -1; while (++i < n) { x0 =3D x, j =3D -1; while (++j < n) { var di =3D groupIndex[i], dj =3D subgroupIndex[di][j], v =3D matrix[di][dj], a0 =3D x, a1 =3D x +=3D v * k; subgroups[dj * n + di] =3D { index: di, subindex: dj, startAngle: a0, endAngle: a1, value: v }; } groups[di] =3D { index: di, startAngle: x0, endAngle: x, value: groupSums[di] }; x +=3D dx; } // Generate chords for each (non-empty) subgroup-subgroup link. i =3D -1; while (++i < n) { j =3D i - 1; while (++j < n) { var source =3D subgroups[j * n + i], target =3D subgroups[i * n + j]; if (source.value || target.value) { chords.push(source.value < target.value ? {source: target, target: source} : {source: source, target: target}); } } } return sortChords ? chords.sort(sortChords) : chords; } chord.padAngle =3D function(_) { return arguments.length ? (padAngle =3D max$1(0, _), chord) : padAngle; }; chord.sortGroups =3D function(_) { return arguments.length ? (sortGroups =3D _, chord) : sortGroups; }; chord.sortSubgroups =3D function(_) { return arguments.length ? (sortSubgroups =3D _, chord) : sortSubgroups; }; chord.sortChords =3D function(_) { return arguments.length ? (_ =3D=3D null ? sortChords =3D null : (sortC= hords =3D compareValue(_))._ =3D _, chord) : sortChords && sortChords._; }; return chord; } var slice$2 =3D Array.prototype.slice; function constant$5(x) { return function() { return x; }; } var pi$2 =3D Math.PI, tau$2 =3D 2 * pi$2, epsilon$1 =3D 1e-6, tauEpsilon =3D tau$2 - epsilon$1; function Path() { this._x0 =3D this._y0 =3D // start of current subpath this._x1 =3D this._y1 =3D null; // end of current subpath this._ =3D ""; } function path() { return new Path; } Path.prototype =3D path.prototype =3D { constructor: Path, moveTo: function(x, y) { this._ +=3D "M" + (this._x0 =3D this._x1 =3D +x) + "," + (this._y0 =3D = this._y1 =3D +y); }, closePath: function() { if (this._x1 !=3D=3D null) { this._x1 =3D this._x0, this._y1 =3D this._y0; this._ +=3D "Z"; } }, lineTo: function(x, y) { this._ +=3D "L" + (this._x1 =3D +x) + "," + (this._y1 =3D +y); }, quadraticCurveTo: function(x1, y1, x, y) { this._ +=3D "Q" + (+x1) + "," + (+y1) + "," + (this._x1 =3D +x) + "," += (this._y1 =3D +y); }, bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._ +=3D "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + ","= + (this._x1 =3D +x) + "," + (this._y1 =3D +y); }, arcTo: function(x1, y1, x2, y2, r) { x1 =3D +x1, y1 =3D +y1, x2 =3D +x2, y2 =3D +y2, r =3D +r; var x0 =3D this._x1, y0 =3D this._y1, x21 =3D x2 - x1, y21 =3D y2 - y1, x01 =3D x0 - x1, y01 =3D y0 - y1, l01_2 =3D x01 * x01 + y01 * y01; // Is the radius negative? Error. if (r < 0) throw new Error("negative radius: " + r); // Is this path empty? Move to (x1,y1). if (this._x1 =3D=3D=3D null) { this._ +=3D "M" + (this._x1 =3D x1) + "," + (this._y1 =3D y1); } // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. else if (!(l01_2 > epsilon$1)); // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? // Equivalently, is (x1,y1) coincident with (x2,y2)? // Or, is the radius zero? Line to (x1,y1). else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) { this._ +=3D "L" + (this._x1 =3D x1) + "," + (this._y1 =3D y1); } // Otherwise, draw an arc! else { var x20 =3D x2 - x0, y20 =3D y2 - y0, l21_2 =3D x21 * x21 + y21 * y21, l20_2 =3D x20 * x20 + y20 * y20, l21 =3D Math.sqrt(l21_2), l01 =3D Math.sqrt(l01_2), l =3D r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2= * l21 * l01))) / 2), t01 =3D l / l01, t21 =3D l / l21; // If the start tangent is not coincident with (x0,y0), line to. if (Math.abs(t01 - 1) > epsilon$1) { this._ +=3D "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); } this._ +=3D "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) = + "," + (this._x1 =3D x1 + t21 * x21) + "," + (this._y1 =3D y1 + t21 * y21); } }, arc: function(x, y, r, a0, a1, ccw) { x =3D +x, y =3D +y, r =3D +r; var dx =3D r * Math.cos(a0), dy =3D r * Math.sin(a0), x0 =3D x + dx, y0 =3D y + dy, cw =3D 1 ^ ccw, da =3D ccw ? a0 - a1 : a1 - a0; // Is the radius negative? Error. if (r < 0) throw new Error("negative radius: " + r); // Is this path empty? Move to (x0,y0). if (this._x1 =3D=3D=3D null) { this._ +=3D "M" + x0 + "," + y0; } // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y= 0). else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0)= > epsilon$1) { this._ +=3D "L" + x0 + "," + y0; } // Is this arc empty? We=E2=80=99re done. if (!r) return; // Does the angle go the wrong way? Flip the direction. if (da < 0) da =3D da % tau$2 + tau$2; // Is this a complete circle? Draw two arcs to complete the circle. if (da > tauEpsilon) { this._ +=3D "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," += (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 =3D x0) + ",= " + (this._y1 =3D y0); } // Is this arc non-empty? Draw an arc! else if (da > epsilon$1) { this._ +=3D "A" + r + "," + r + ",0," + (+(da >=3D pi$2)) + "," + cw = + "," + (this._x1 =3D x + r * Math.cos(a1)) + "," + (this._y1 =3D y + r * M= ath.sin(a1)); } }, rect: function(x, y, w, h) { this._ +=3D "M" + (this._x0 =3D this._x1 =3D +x) + "," + (this._y0 =3D = this._y1 =3D +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; }, toString: function() { return this._; } }; function defaultSource(d) { return d.source; } function defaultTarget(d) { return d.target; } function defaultRadius(d) { return d.radius; } function defaultStartAngle(d) { return d.startAngle; } function defaultEndAngle(d) { return d.endAngle; } function ribbon() { var source =3D defaultSource, target =3D defaultTarget, radius =3D defaultRadius, startAngle =3D defaultStartAngle, endAngle =3D defaultEndAngle, context =3D null; function ribbon() { var buffer, argv =3D slice$2.call(arguments), s =3D source.apply(this, argv), t =3D target.apply(this, argv), sr =3D +radius.apply(this, (argv[0] =3D s, argv)), sa0 =3D startAngle.apply(this, argv) - halfPi$1, sa1 =3D endAngle.apply(this, argv) - halfPi$1, sx0 =3D sr * cos(sa0), sy0 =3D sr * sin(sa0), tr =3D +radius.apply(this, (argv[0] =3D t, argv)), ta0 =3D startAngle.apply(this, argv) - halfPi$1, ta1 =3D endAngle.apply(this, argv) - halfPi$1; if (!context) context =3D buffer =3D path(); context.moveTo(sx0, sy0); context.arc(0, 0, sr, sa0, sa1); if (sa0 !=3D=3D ta0 || sa1 !=3D=3D ta1) { // TODO sr !=3D=3D tr? context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); context.arc(0, 0, tr, ta0, ta1); } context.quadraticCurveTo(0, 0, sx0, sy0); context.closePath(); if (buffer) return context =3D null, buffer + "" || null; } ribbon.radius =3D function(_) { return arguments.length ? (radius =3D typeof _ =3D=3D=3D "function" ? _= : constant$5(+_), ribbon) : radius; }; ribbon.startAngle =3D function(_) { return arguments.length ? (startAngle =3D typeof _ =3D=3D=3D "function"= ? _ : constant$5(+_), ribbon) : startAngle; }; ribbon.endAngle =3D function(_) { return arguments.length ? (endAngle =3D typeof _ =3D=3D=3D "function" ?= _ : constant$5(+_), ribbon) : endAngle; }; ribbon.source =3D function(_) { return arguments.length ? (source =3D _, ribbon) : source; }; ribbon.target =3D function(_) { return arguments.length ? (target =3D _, ribbon) : target; }; ribbon.context =3D function(_) { return arguments.length ? ((context =3D _ =3D=3D null ? null : _), ribb= on) : context; }; return ribbon; } var prefix =3D "$"; function Map() {} Map.prototype =3D map$1.prototype =3D { constructor: Map, has: function(key) { return (prefix + key) in this; }, get: function(key) { return this[prefix + key]; }, set: function(key, value) { this[prefix + key] =3D value; return this; }, remove: function(key) { var property =3D prefix + key; return property in this && delete this[property]; }, clear: function() { for (var property in this) if (property[0] =3D=3D=3D prefix) delete thi= s[property]; }, keys: function() { var keys =3D []; for (var property in this) if (property[0] =3D=3D=3D prefix) keys.push(= property.slice(1)); return keys; }, values: function() { var values =3D []; for (var property in this) if (property[0] =3D=3D=3D prefix) values.pus= h(this[property]); return values; }, entries: function() { var entries =3D []; for (var property in this) if (property[0] =3D=3D=3D prefix) entries.pu= sh({key: property.slice(1), value: this[property]}); return entries; }, size: function() { var size =3D 0; for (var property in this) if (property[0] =3D=3D=3D prefix) ++size; return size; }, empty: function() { for (var property in this) if (property[0] =3D=3D=3D prefix) return fal= se; return true; }, each: function(f) { for (var property in this) if (property[0] =3D=3D=3D prefix) f(this[pro= perty], property.slice(1), this); } }; function map$1(object, f) { var map =3D new Map; // Copy constructor. if (object instanceof Map) object.each(function(value, key) { map.set(key= , value); }); // Index array by numeric index or specified key function. else if (Array.isArray(object)) { var i =3D -1, n =3D object.length, o; if (f =3D=3D null) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f(o =3D object[i], i, object), o); } // Convert object to map. else if (object) for (var key in object) map.set(key, object[key]); return map; } function nest() { var keys =3D [], sortKeys =3D [], sortValues, rollup, nest; function apply(array, depth, createResult, setResult) { if (depth >=3D keys.length) { if (sortValues !=3D null) array.sort(sortValues); return rollup !=3D null ? rollup(array) : array; } var i =3D -1, n =3D array.length, key =3D keys[depth++], keyValue, value, valuesByKey =3D map$1(), values, result =3D createResult(); while (++i < n) { if (values =3D valuesByKey.get(keyValue =3D key(value =3D array[i]) += "")) { values.push(value); } else { valuesByKey.set(keyValue, [value]); } } valuesByKey.each(function(values, key) { setResult(result, key, apply(values, depth, createResult, setResult)); }); return result; } function entries(map, depth) { if (++depth > keys.length) return map; var array, sortKey =3D sortKeys[depth - 1]; if (rollup !=3D null && depth >=3D keys.length) array =3D map.entries(); else array =3D [], map.each(function(v, k) { array.push({key: k, values= : entries(v, depth)}); }); return sortKey !=3D null ? array.sort(function(a, b) { return sortKey(a= =2Ekey, b.key); }) : array; } return nest =3D { object: function(array) { return apply(array, 0, createObject, setObjec= t); }, map: function(array) { return apply(array, 0, createMap, setMap); }, entries: function(array) { return entries(apply(array, 0, createMap, se= tMap), 0); }, key: function(d) { keys.push(d); return nest; }, sortKeys: function(order) { sortKeys[keys.length - 1] =3D order; return= nest; }, sortValues: function(order) { sortValues =3D order; return nest; }, rollup: function(f) { rollup =3D f; return nest; } }; } function createObject() { return {}; } function setObject(object, key, value) { object[key] =3D value; } function createMap() { return map$1(); } function setMap(map, key, value) { map.set(key, value); } function Set() {} var proto =3D map$1.prototype; Set.prototype =3D set$2.prototype =3D { constructor: Set, has: proto.has, add: function(value) { value +=3D ""; this[prefix + value] =3D value; return this; }, remove: proto.remove, clear: proto.clear, values: proto.keys, size: proto.size, empty: proto.empty, each: proto.each }; function set$2(object, f) { var set =3D new Set; // Copy constructor. if (object instanceof Set) object.each(function(value) { set.add(value); = }); // Otherwise, assume it=E2=80=99s an array. else if (object) { var i =3D -1, n =3D object.length; if (f =3D=3D null) while (++i < n) set.add(object[i]); else while (++i < n) set.add(f(object[i], i, object)); } return set; } function keys(map) { var keys =3D []; for (var key in map) keys.push(key); return keys; } function values(map) { var values =3D []; for (var key in map) values.push(map[key]); return values; } function entries(map) { var entries =3D []; for (var key in map) entries.push({key: key, value: map[key]}); return entries; } var array$2 =3D Array.prototype; var slice$3 =3D array$2.slice; function ascending$2(a, b) { return a - b; } function area(ring) { var i =3D 0, n =3D ring.length, area =3D ring[n - 1][1] * ring[0][0] - ri= ng[n - 1][0] * ring[0][1]; while (++i < n) area +=3D ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * = ring[i][1]; return area; } function constant$6(x) { return function() { return x; }; } function contains(ring, hole) { var i =3D -1, n =3D hole.length, c; while (++i < n) if (c =3D ringContains(ring, hole[i])) return c; return 0; } function ringContains(ring, point) { var x =3D point[0], y =3D point[1], contains =3D -1; for (var i =3D 0, n =3D ring.length, j =3D n - 1; i < n; j =3D i++) { var pi =3D ring[i], xi =3D pi[0], yi =3D pi[1], pj =3D ring[j], xj =3D = pj[0], yj =3D pj[1]; if (segmentContains(pi, pj, point)) return 0; if (((yi > y) !=3D=3D (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - y= i) + xi))) contains =3D -contains; } return contains; } function segmentContains(a, b, c) { var i; return collinear(a, b, c) && within(a[i =3D +(a[0] =3D=3D=3D b[0])= ], c[i], b[i]); } function collinear(a, b, c) { return (b[0] - a[0]) * (c[1] - a[1]) =3D=3D=3D (c[0] - a[0]) * (b[1] - a[= 1]); } function within(p, q, r) { return p <=3D q && q <=3D r || r <=3D q && q <=3D p; } function noop$1() {} var cases =3D [ [], [[[1.0, 1.5], [0.5, 1.0]]], [[[1.5, 1.0], [1.0, 1.5]]], [[[1.5, 1.0], [0.5, 1.0]]], [[[1.0, 0.5], [1.5, 1.0]]], [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], [[[1.0, 0.5], [1.0, 1.5]]], [[[1.0, 0.5], [0.5, 1.0]]], [[[0.5, 1.0], [1.0, 0.5]]], [[[1.0, 1.5], [1.0, 0.5]]], [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], [[[1.5, 1.0], [1.0, 0.5]]], [[[0.5, 1.0], [1.5, 1.0]]], [[[1.0, 1.5], [1.5, 1.0]]], [[[0.5, 1.0], [1.0, 1.5]]], [] ]; function contours() { var dx =3D 1, dy =3D 1, threshold$$1 =3D thresholdSturges, smooth =3D smoothLinear; function contours(values) { var tz =3D threshold$$1(values); // Convert number of thresholds into uniform thresholds. if (!Array.isArray(tz)) { var domain =3D extent(values), start =3D domain[0], stop =3D domain[1= ]; tz =3D tickStep(start, stop, tz); tz =3D sequence(Math.floor(start / tz) * tz, Math.floor(stop / tz) * = tz, tz); } else { tz =3D tz.slice().sort(ascending$2); } return tz.map(function(value) { return contour(values, value); }); } // Accumulate, smooth contour rings, assign holes to exterior rings. // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon= =2Ejs function contour(values, value) { var polygons =3D [], holes =3D []; isorings(values, value, function(ring) { smooth(ring, values, value); if (area(ring) > 0) polygons.push([ring]); else holes.push(ring); }); holes.forEach(function(hole) { for (var i =3D 0, n =3D polygons.length, polygon; i < n; ++i) { if (contains((polygon =3D polygons[i])[0], hole) !=3D=3D -1) { polygon.push(hole); return; } } }); return { type: "MultiPolygon", value: value, coordinates: polygons }; } // Marching squares with isolines stitched into rings. // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/s= titch.js function isorings(values, value, callback) { var fragmentByStart =3D new Array, fragmentByEnd =3D new Array, x, y, t0, t1, t2, t3; // Special case for the first row (y =3D -1, t2 =3D t3 =3D 0). x =3D y =3D -1; t1 =3D values[0] >=3D value; cases[t1 << 1].forEach(stitch); while (++x < dx - 1) { t0 =3D t1, t1 =3D values[x + 1] >=3D value; cases[t0 | t1 << 1].forEach(stitch); } cases[t1 << 0].forEach(stitch); // General case for the intermediate rows. while (++y < dy - 1) { x =3D -1; t1 =3D values[y * dx + dx] >=3D value; t2 =3D values[y * dx] >=3D value; cases[t1 << 1 | t2 << 2].forEach(stitch); while (++x < dx - 1) { t0 =3D t1, t1 =3D values[y * dx + dx + x + 1] >=3D value; t3 =3D t2, t2 =3D values[y * dx + x + 1] >=3D value; cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); } cases[t1 | t2 << 3].forEach(stitch); } // Special case for the last row (y =3D dy - 1, t0 =3D t1 =3D 0). x =3D -1; t2 =3D values[y * dx] >=3D value; cases[t2 << 2].forEach(stitch); while (++x < dx - 1) { t3 =3D t2, t2 =3D values[y * dx + x + 1] >=3D value; cases[t2 << 2 | t3 << 3].forEach(stitch); } cases[t2 << 3].forEach(stitch); function stitch(line) { var start =3D [line[0][0] + x, line[0][1] + y], end =3D [line[1][0] + x, line[1][1] + y], startIndex =3D index(start), endIndex =3D index(end), f, g; if (f =3D fragmentByEnd[startIndex]) { if (g =3D fragmentByStart[endIndex]) { delete fragmentByEnd[f.end]; delete fragmentByStart[g.start]; if (f =3D=3D=3D g) { f.ring.push(end); callback(f.ring); } else { fragmentByStart[f.start] =3D fragmentByEnd[g.end] =3D {start: f= =2Estart, end: g.end, ring: f.ring.concat(g.ring)}; } } else { delete fragmentByEnd[f.end]; f.ring.push(end); fragmentByEnd[f.end =3D endIndex] =3D f; } } else if (f =3D fragmentByStart[endIndex]) { if (g =3D fragmentByEnd[startIndex]) { delete fragmentByStart[f.start]; delete fragmentByEnd[g.end]; if (f =3D=3D=3D g) { f.ring.push(end); callback(f.ring); } else { fragmentByStart[g.start] =3D fragmentByEnd[f.end] =3D {start: g= =2Estart, end: f.end, ring: g.ring.concat(f.ring)}; } } else { delete fragmentByStart[f.start]; f.ring.unshift(start); fragmentByStart[f.start =3D startIndex] =3D f; } } else { fragmentByStart[startIndex] =3D fragmentByEnd[endIndex] =3D {start:= startIndex, end: endIndex, ring: [start, end]}; } } } function index(point) { return point[0] * 2 + point[1] * (dx + 1) * 4; } function smoothLinear(ring, values, value) { ring.forEach(function(point) { var x =3D point[0], y =3D point[1], xt =3D x | 0, yt =3D y | 0, v0, v1 =3D values[yt * dx + xt]; if (x > 0 && x < dx && xt =3D=3D=3D x) { v0 =3D values[yt * dx + xt - 1]; point[0] =3D x + (value - v0) / (v1 - v0) - 0.5; } if (y > 0 && y < dy && yt =3D=3D=3D y) { v0 =3D values[(yt - 1) * dx + xt]; point[1] =3D y + (value - v0) / (v1 - v0) - 0.5; } }); } contours.contour =3D contour; contours.size =3D function(_) { if (!arguments.length) return [dx, dy]; var _0 =3D Math.ceil(_[0]), _1 =3D Math.ceil(_[1]); if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size"); return dx =3D _0, dy =3D _1, contours; }; contours.thresholds =3D function(_) { return arguments.length ? (threshold$$1 =3D typeof _ =3D=3D=3D "functio= n" ? _ : Array.isArray(_) ? constant$6(slice$3.call(_)) : constant$6(_), co= ntours) : threshold$$1; }; contours.smooth =3D function(_) { return arguments.length ? (smooth =3D _ ? smoothLinear : noop$1, contou= rs) : smooth =3D=3D=3D smoothLinear; }; return contours; } // TODO Optimize edge cases. // TODO Optimize index calculation. // TODO Optimize arguments. function blurX(source, target, r) { var n =3D source.width, m =3D source.height, w =3D (r << 1) + 1; for (var j =3D 0; j < m; ++j) { for (var i =3D 0, sr =3D 0; i < n + r; ++i) { if (i < n) { sr +=3D source.data[i + j * n]; } if (i >=3D r) { if (i >=3D w) { sr -=3D source.data[i - w + j * n]; } target.data[i - r + j * n] =3D sr / Math.min(i + 1, n - 1 + w - i, = w); } } } } // TODO Optimize edge cases. // TODO Optimize index calculation. // TODO Optimize arguments. function blurY(source, target, r) { var n =3D source.width, m =3D source.height, w =3D (r << 1) + 1; for (var i =3D 0; i < n; ++i) { for (var j =3D 0, sr =3D 0; j < m + r; ++j) { if (j < m) { sr +=3D source.data[i + j * n]; } if (j >=3D r) { if (j >=3D w) { sr -=3D source.data[i + (j - w) * n]; } target.data[i + (j - r) * n] =3D sr / Math.min(j + 1, m - 1 + w - j= , w); } } } } function defaultX(d) { return d[0]; } function defaultY(d) { return d[1]; } function defaultWeight() { return 1; } function density() { var x =3D defaultX, y =3D defaultY, weight =3D defaultWeight, dx =3D 960, dy =3D 500, r =3D 20, // blur radius k =3D 2, // log2(grid cell size) o =3D r * 3, // grid offset, to pad for blur n =3D (dx + o * 2) >> k, // grid width m =3D (dy + o * 2) >> k, // grid height threshold$$1 =3D constant$6(20); function density(data) { var values0 =3D new Float32Array(n * m), values1 =3D new Float32Array(n * m); data.forEach(function(d, i, data) { var xi =3D (+x(d, i, data) + o) >> k, yi =3D (+y(d, i, data) + o) >> k, wi =3D +weight(d, i, data); if (xi >=3D 0 && xi < n && yi >=3D 0 && yi < m) { values0[xi + yi * n] +=3D wi; } }); // TODO Optimize. blurX({width: n, height: m, data: values0}, {width: n, height: m, data:= values1}, r >> k); blurY({width: n, height: m, data: values1}, {width: n, height: m, data:= values0}, r >> k); blurX({width: n, height: m, data: values0}, {width: n, height: m, data:= values1}, r >> k); blurY({width: n, height: m, data: values1}, {width: n, height: m, data:= values0}, r >> k); blurX({width: n, height: m, data: values0}, {width: n, height: m, data:= values1}, r >> k); blurY({width: n, height: m, data: values1}, {width: n, height: m, data:= values0}, r >> k); var tz =3D threshold$$1(values0); // Convert number of thresholds into uniform thresholds. if (!Array.isArray(tz)) { var stop =3D max(values0); tz =3D tickStep(0, stop, tz); tz =3D sequence(0, Math.floor(stop / tz) * tz, tz); tz.shift(); } return contours() .thresholds(tz) .size([n, m]) (values0) .map(transform); } function transform(geometry) { geometry.value *=3D Math.pow(2, -2 * k); // Density in points per squar= e pixel. geometry.coordinates.forEach(transformPolygon); return geometry; } function transformPolygon(coordinates) { coordinates.forEach(transformRing); } function transformRing(coordinates) { coordinates.forEach(transformPoint); } // TODO Optimize. function transformPoint(coordinates) { coordinates[0] =3D coordinates[0] * Math.pow(2, k) - o; coordinates[1] =3D coordinates[1] * Math.pow(2, k) - o; } function resize() { o =3D r * 3; n =3D (dx + o * 2) >> k; m =3D (dy + o * 2) >> k; return density; } density.x =3D function(_) { return arguments.length ? (x =3D typeof _ =3D=3D=3D "function" ? _ : co= nstant$6(+_), density) : x; }; density.y =3D function(_) { return arguments.length ? (y =3D typeof _ =3D=3D=3D "function" ? _ : co= nstant$6(+_), density) : y; }; density.weight =3D function(_) { return arguments.length ? (weight =3D typeof _ =3D=3D=3D "function" ? _= : constant$6(+_), density) : weight; }; density.size =3D function(_) { if (!arguments.length) return [dx, dy]; var _0 =3D Math.ceil(_[0]), _1 =3D Math.ceil(_[1]); if (!(_0 >=3D 0) && !(_0 >=3D 0)) throw new Error("invalid size"); return dx =3D _0, dy =3D _1, resize(); }; density.cellSize =3D function(_) { if (!arguments.length) return 1 << k; if (!((_ =3D +_) >=3D 1)) throw new Error("invalid cell size"); return k =3D Math.floor(Math.log(_) / Math.LN2), resize(); }; density.thresholds =3D function(_) { return arguments.length ? (threshold$$1 =3D typeof _ =3D=3D=3D "functio= n" ? _ : Array.isArray(_) ? constant$6(slice$3.call(_)) : constant$6(_), de= nsity) : threshold$$1; }; density.bandwidth =3D function(_) { if (!arguments.length) return Math.sqrt(r * (r + 1)); if (!((_ =3D +_) >=3D 0)) throw new Error("invalid bandwidth"); return r =3D Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); }; return density; } var EOL =3D {}, EOF =3D {}, QUOTE =3D 34, NEWLINE =3D 10, RETURN =3D 13; function objectConverter(columns) { return new Function("d", "return {" + columns.map(function(name, i) { return JSON.stringify(name) + ": d[" + i + "]"; }).join(",") + "}"); } function customConverter(columns, f) { var object =3D objectConverter(columns); return function(row, i) { return f(object(row), i, columns); }; } // Compute unique columns in order of discovery. function inferColumns(rows) { var columnSet =3D Object.create(null), columns =3D []; rows.forEach(function(row) { for (var column in row) { if (!(column in columnSet)) { columns.push(columnSet[column] =3D column); } } }); return columns; } function pad(value, width) { var s =3D value + "", length =3D s.length; return length < width ? new Array(width - length + 1).join(0) + s : s; } function formatYear(year) { return year < 0 ? "-" + pad(-year, 6) : year > 9999 ? "+" + pad(year, 6) : pad(year, 4); } function formatDate(date) { var hours =3D date.getUTCHours(), minutes =3D date.getUTCMinutes(), seconds =3D date.getUTCSeconds(), milliseconds =3D date.getUTCMilliseconds(); return isNaN(date) ? "Invalid Date" : formatYear(date.getUTCFullYear(), 4) + "-" + pad(date.getUTCMonth()= + 1, 2) + "-" + pad(date.getUTCDate(), 2) + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" += pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(s= econds, 2) + "Z" : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" : ""); } function dsvFormat(delimiter) { var reFormat =3D new RegExp("[\"" + delimiter + "\n\r]"), DELIMITER =3D delimiter.charCodeAt(0); function parse(text, f) { var convert, columns, rows =3D parseRows(text, function(row, i) { if (convert) return convert(row, i - 1); columns =3D row, convert =3D f ? customConverter(row, f) : objectConv= erter(row); }); rows.columns =3D columns || []; return rows; } function parseRows(text, f) { var rows =3D [], // output rows N =3D text.length, I =3D 0, // current character index n =3D 0, // current line number t, // current token eof =3D N <=3D 0, // current token followed by EOF? eol =3D false; // current token followed by EOL? // Strip the trailing newline. if (text.charCodeAt(N - 1) =3D=3D=3D NEWLINE) --N; if (text.charCodeAt(N - 1) =3D=3D=3D RETURN) --N; function token() { if (eof) return EOF; if (eol) return eol =3D false, EOL; // Unescape quotes. var i, j =3D I, c; if (text.charCodeAt(j) =3D=3D=3D QUOTE) { while (I++ < N && text.charCodeAt(I) !=3D=3D QUOTE || text.charCode= At(++I) =3D=3D=3D QUOTE); if ((i =3D I) >=3D N) eof =3D true; else if ((c =3D text.charCodeAt(I++)) =3D=3D=3D NEWLINE) eol =3D tr= ue; else if (c =3D=3D=3D RETURN) { eol =3D true; if (text.charCodeAt(I)= =3D=3D=3D NEWLINE) ++I; } return text.slice(j + 1, i - 1).replace(/""/g, "\""); } // Find next delimiter or newline. while (I < N) { if ((c =3D text.charCodeAt(i =3D I++)) =3D=3D=3D NEWLINE) eol =3D t= rue; else if (c =3D=3D=3D RETURN) { eol =3D true; if (text.charCodeAt(I)= =3D=3D=3D NEWLINE) ++I; } else if (c !=3D=3D DELIMITER) continue; return text.slice(j, i); } // Return last token before EOF. return eof =3D true, text.slice(j, N); } while ((t =3D token()) !=3D=3D EOF) { var row =3D []; while (t !=3D=3D EOL && t !=3D=3D EOF) row.push(t), t =3D token(); if (f && (row =3D f(row, n++)) =3D=3D null) continue; rows.push(row); } return rows; } function preformatBody(rows, columns) { return rows.map(function(row) { return columns.map(function(column) { return formatValue(row[column]); }).join(delimiter); }); } function format(rows, columns) { if (columns =3D=3D null) columns =3D inferColumns(rows); return [columns.map(formatValue).join(delimiter)].concat(preformatBody(= rows, columns)).join("\n"); } function formatBody(rows, columns) { if (columns =3D=3D null) columns =3D inferColumns(rows); return preformatBody(rows, columns).join("\n"); } function formatRows(rows) { return rows.map(formatRow).join("\n"); } function formatRow(row) { return row.map(formatValue).join(delimiter); } function formatValue(value) { return value =3D=3D null ? "" : value instanceof Date ? formatDate(value) : reFormat.test(value +=3D "") ? "\"" + value.replace(/"/g, "\"\"")= + "\"" : value; } return { parse: parse, parseRows: parseRows, format: format, formatBody: formatBody, formatRows: formatRows }; } var csv =3D dsvFormat(","); var csvParse =3D csv.parse; var csvParseRows =3D csv.parseRows; var csvFormat =3D csv.format; var csvFormatBody =3D csv.formatBody; var csvFormatRows =3D csv.formatRows; var tsv =3D dsvFormat("\t"); var tsvParse =3D tsv.parse; var tsvParseRows =3D tsv.parseRows; var tsvFormat =3D tsv.format; var tsvFormatBody =3D tsv.formatBody; var tsvFormatRows =3D tsv.formatRows; function autoType(object) { for (var key in object) { var value =3D object[key].trim(), number; if (!value) value =3D null; else if (value =3D=3D=3D "true") value =3D true; else if (value =3D=3D=3D "false") value =3D false; else if (value =3D=3D=3D "NaN") value =3D NaN; else if (!isNaN(number =3D +value)) value =3D number; else if (/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d= {3})?)?(Z|[-+]\d{2}:\d{2})?)?$/.test(value)) value =3D new Date(value); else continue; object[key] =3D value; } return object; } function responseBlob(response) { if (!response.ok) throw new Error(response.status + " " + response.status= Text); return response.blob(); } function blob(input, init) { return fetch(input, init).then(responseBlob); } function responseArrayBuffer(response) { if (!response.ok) throw new Error(response.status + " " + response.status= Text); return response.arrayBuffer(); } function buffer(input, init) { return fetch(input, init).then(responseArrayBuffer); } function responseText(response) { if (!response.ok) throw new Error(response.status + " " + response.status= Text); return response.text(); } function text(input, init) { return fetch(input, init).then(responseText); } function dsvParse(parse) { return function(input, init, row) { if (arguments.length =3D=3D=3D 2 && typeof init =3D=3D=3D "function") r= ow =3D init, init =3D undefined; return text(input, init).then(function(response) { return parse(response, row); }); }; } function dsv(delimiter, input, init, row) { if (arguments.length =3D=3D=3D 3 && typeof init =3D=3D=3D "function") row= =3D init, init =3D undefined; var format =3D dsvFormat(delimiter); return text(input, init).then(function(response) { return format.parse(response, row); }); } var csv$1 =3D dsvParse(csvParse); var tsv$1 =3D dsvParse(tsvParse); function image(input, init) { return new Promise(function(resolve, reject) { var image =3D new Image; for (var key in init) image[key] =3D init[key]; image.onerror =3D reject; image.onload =3D function() { resolve(image); }; image.src =3D input; }); } function responseJson(response) { if (!response.ok) throw new Error(response.status + " " + response.status= Text); return response.json(); } function json(input, init) { return fetch(input, init).then(responseJson); } function parser(type) { return function(input, init) { return text(input, init).then(function(text$$1) { return (new DOMParser).parseFromString(text$$1, type); }); }; } var xml =3D parser("application/xml"); var html =3D parser("text/html"); var svg =3D parser("image/svg+xml"); function center$1(x, y) { var nodes; if (x =3D=3D null) x =3D 0; if (y =3D=3D null) y =3D 0; function force() { var i, n =3D nodes.length, node, sx =3D 0, sy =3D 0; for (i =3D 0; i < n; ++i) { node =3D nodes[i], sx +=3D node.x, sy +=3D node.y; } for (sx =3D sx / n - x, sy =3D sy / n - y, i =3D 0; i < n; ++i) { node =3D nodes[i], node.x -=3D sx, node.y -=3D sy; } } force.initialize =3D function(_) { nodes =3D _; }; force.x =3D function(_) { return arguments.length ? (x =3D +_, force) : x; }; force.y =3D function(_) { return arguments.length ? (y =3D +_, force) : y; }; return force; } function constant$7(x) { return function() { return x; }; } function jiggle() { return (Math.random() - 0.5) * 1e-6; } function tree_add(d) { var x =3D +this._x.call(null, d), y =3D +this._y.call(null, d); return add(this.cover(x, y), x, y, d); } function add(tree, x, y, d) { if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points var parent, node =3D tree._root, leaf =3D {data: d}, x0 =3D tree._x0, y0 =3D tree._y0, x1 =3D tree._x1, y1 =3D tree._y1, xm, ym, xp, yp, right, bottom, i, j; // If the tree is empty, initialize the root as a leaf. if (!node) return tree._root =3D leaf, tree; // Find the existing leaf for the new point, or add it. while (node.length) { if (right =3D x >=3D (xm =3D (x0 + x1) / 2)) x0 =3D xm; else x1 =3D xm; if (bottom =3D y >=3D (ym =3D (y0 + y1) / 2)) y0 =3D ym; else y1 =3D ym; if (parent =3D node, !(node =3D node[i =3D bottom << 1 | right])) retur= n parent[i] =3D leaf, tree; } // Is the new point is exactly coincident with the existing point? xp =3D +tree._x.call(null, node.data); yp =3D +tree._y.call(null, node.data); if (x =3D=3D=3D xp && y =3D=3D=3D yp) return leaf.next =3D node, parent ?= parent[i] =3D leaf : tree._root =3D leaf, tree; // Otherwise, split the leaf node until the old and new point are separat= ed. do { parent =3D parent ? parent[i] =3D new Array(4) : tree._root =3D new Arr= ay(4); if (right =3D x >=3D (xm =3D (x0 + x1) / 2)) x0 =3D xm; else x1 =3D xm; if (bottom =3D y >=3D (ym =3D (y0 + y1) / 2)) y0 =3D ym; else y1 =3D ym; } while ((i =3D bottom << 1 | right) =3D=3D=3D (j =3D (yp >=3D ym) << 1 |= (xp >=3D xm))); return parent[j] =3D node, parent[i] =3D leaf, tree; } function addAll(data) { var d, i, n =3D data.length, x, y, xz =3D new Array(n), yz =3D new Array(n), x0 =3D Infinity, y0 =3D Infinity, x1 =3D -Infinity, y1 =3D -Infinity; // Compute the points and their extent. for (i =3D 0; i < n; ++i) { if (isNaN(x =3D +this._x.call(null, d =3D data[i])) || isNaN(y =3D +thi= s._y.call(null, d))) continue; xz[i] =3D x; yz[i] =3D y; if (x < x0) x0 =3D x; if (x > x1) x1 =3D x; if (y < y0) y0 =3D y; if (y > y1) y1 =3D y; } // If there were no (valid) points, abort. if (x0 > x1 || y0 > y1) return this; // Expand the tree to cover the new points. this.cover(x0, y0).cover(x1, y1); // Add the new points. for (i =3D 0; i < n; ++i) { add(this, xz[i], yz[i], data[i]); } return this; } function tree_cover(x, y) { if (isNaN(x =3D +x) || isNaN(y =3D +y)) return this; // ignore invalid po= ints var x0 =3D this._x0, y0 =3D this._y0, x1 =3D this._x1, y1 =3D this._y1; // If the quadtree has no extent, initialize them. // Integer extent are necessary so that if we later double the extent, // the existing quadrant boundaries don=E2=80=99t change due to floating = point error! if (isNaN(x0)) { x1 =3D (x0 =3D Math.floor(x)) + 1; y1 =3D (y0 =3D Math.floor(y)) + 1; } // Otherwise, double repeatedly to cover. else { var z =3D x1 - x0, node =3D this._root, parent, i; while (x0 > x || x >=3D x1 || y0 > y || y >=3D y1) { i =3D (y < y0) << 1 | (x < x0); parent =3D new Array(4), parent[i] =3D node, node =3D parent, z *=3D = 2; switch (i) { case 0: x1 =3D x0 + z, y1 =3D y0 + z; break; case 1: x0 =3D x1 - z, y1 =3D y0 + z; break; case 2: x1 =3D x0 + z, y0 =3D y1 - z; break; case 3: x0 =3D x1 - z, y0 =3D y1 - z; break; } } if (this._root && this._root.length) this._root =3D node; } this._x0 =3D x0; this._y0 =3D y0; this._x1 =3D x1; this._y1 =3D y1; return this; } function tree_data() { var data =3D []; this.visit(function(node) { if (!node.length) do data.push(node.data); while (node =3D node.next) }); return data; } function tree_extent(_) { return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, thi= s._y1]]; } function Quad(node, x0, y0, x1, y1) { this.node =3D node; this.x0 =3D x0; this.y0 =3D y0; this.x1 =3D x1; this.y1 =3D y1; } function tree_find(x, y, radius) { var data, x0 =3D this._x0, y0 =3D this._y0, x1, y1, x2, y2, x3 =3D this._x1, y3 =3D this._y1, quads =3D [], node =3D this._root, q, i; if (node) quads.push(new Quad(node, x0, y0, x3, y3)); if (radius =3D=3D null) radius =3D Infinity; else { x0 =3D x - radius, y0 =3D y - radius; x3 =3D x + radius, y3 =3D y + radius; radius *=3D radius; } while (q =3D quads.pop()) { // Stop searching if this quadrant can=E2=80=99t contain a closer node. if (!(node =3D q.node) || (x1 =3D q.x0) > x3 || (y1 =3D q.y0) > y3 || (x2 =3D q.x1) < x0 || (y2 =3D q.y1) < y0) continue; // Bisect the current quadrant. if (node.length) { var xm =3D (x1 + x2) / 2, ym =3D (y1 + y2) / 2; quads.push( new Quad(node[3], xm, ym, x2, y2), new Quad(node[2], x1, ym, xm, y2), new Quad(node[1], xm, y1, x2, ym), new Quad(node[0], x1, y1, xm, ym) ); // Visit the closest quadrant first. if (i =3D (y >=3D ym) << 1 | (x >=3D xm)) { q =3D quads[quads.length - 1]; quads[quads.length - 1] =3D quads[quads.length - 1 - i]; quads[quads.length - 1 - i] =3D q; } } // Visit this point. (Visiting coincident points isn=E2=80=99t necessar= y!) else { var dx =3D x - +this._x.call(null, node.data), dy =3D y - +this._y.call(null, node.data), d2 =3D dx * dx + dy * dy; if (d2 < radius) { var d =3D Math.sqrt(radius =3D d2); x0 =3D x - d, y0 =3D y - d; x3 =3D x + d, y3 =3D y + d; data =3D node.data; } } } return data; } function tree_remove(d) { if (isNaN(x =3D +this._x.call(null, d)) || isNaN(y =3D +this._y.call(null= , d))) return this; // ignore invalid points var parent, node =3D this._root, retainer, previous, next, x0 =3D this._x0, y0 =3D this._y0, x1 =3D this._x1, y1 =3D this._y1, x, y, xm, ym, right, bottom, i, j; // If the tree is empty, initialize the root as a leaf. if (!node) return this; // Find the leaf node for the point. // While descending, also retain the deepest parent with a non-removed si= bling. if (node.length) while (true) { if (right =3D x >=3D (xm =3D (x0 + x1) / 2)) x0 =3D xm; else x1 =3D xm; if (bottom =3D y >=3D (ym =3D (y0 + y1) / 2)) y0 =3D ym; else y1 =3D ym; if (!(parent =3D node, node =3D node[i =3D bottom << 1 | right])) retur= n this; if (!node.length) break; if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) = retainer =3D parent, j =3D i; } // Find the point to remove. while (node.data !=3D=3D d) if (!(previous =3D node, node =3D node.next))= return this; if (next =3D node.next) delete node.next; // If there are multiple coincident points, remove just the point. if (previous) return (next ? previous.next =3D next : delete previous.nex= t), this; // If this is the root point, remove it. if (!parent) return this._root =3D next, this; // Remove this leaf. next ? parent[i] =3D next : delete parent[i]; // If the parent now contains exactly one leaf, collapse superfluous pare= nts. if ((node =3D parent[0] || parent[1] || parent[2] || parent[3]) && node =3D=3D=3D (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) { if (retainer) retainer[j] =3D node; else this._root =3D node; } return this; } function removeAll(data) { for (var i =3D 0, n =3D data.length; i < n; ++i) this.remove(data[i]); return this; } function tree_root() { return this._root; } function tree_size() { var size =3D 0; this.visit(function(node) { if (!node.length) do ++size; while (node =3D node.next) }); return size; } function tree_visit(callback) { var quads =3D [], q, node =3D this._root, child, x0, y0, x1, y1; if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y= 1)); while (q =3D quads.pop()) { if (!callback(node =3D q.node, x0 =3D q.x0, y0 =3D q.y0, x1 =3D q.x1, y= 1 =3D q.y1) && node.length) { var xm =3D (x0 + x1) / 2, ym =3D (y0 + y1) / 2; if (child =3D node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); if (child =3D node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); if (child =3D node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); if (child =3D node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); } } return this; } function tree_visitAfter(callback) { var quads =3D [], next =3D [], q; if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this.= _x1, this._y1)); while (q =3D quads.pop()) { var node =3D q.node; if (node.length) { var child, x0 =3D q.x0, y0 =3D q.y0, x1 =3D q.x1, y1 =3D q.y1, xm =3D= (x0 + x1) / 2, ym =3D (y0 + y1) / 2; if (child =3D node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); if (child =3D node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); if (child =3D node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); if (child =3D node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); } next.push(q); } while (q =3D next.pop()) { callback(q.node, q.x0, q.y0, q.x1, q.y1); } return this; } function defaultX$1(d) { return d[0]; } function tree_x(_) { return arguments.length ? (this._x =3D _, this) : this._x; } function defaultY$1(d) { return d[1]; } function tree_y(_) { return arguments.length ? (this._y =3D _, this) : this._y; } function quadtree(nodes, x, y) { var tree =3D new Quadtree(x =3D=3D null ? defaultX$1 : x, y =3D=3D null ?= defaultY$1 : y, NaN, NaN, NaN, NaN); return nodes =3D=3D null ? tree : tree.addAll(nodes); } function Quadtree(x, y, x0, y0, x1, y1) { this._x =3D x; this._y =3D y; this._x0 =3D x0; this._y0 =3D y0; this._x1 =3D x1; this._y1 =3D y1; this._root =3D undefined; } function leaf_copy(leaf) { var copy =3D {data: leaf.data}, next =3D copy; while (leaf =3D leaf.next) next =3D next.next =3D {data: leaf.data}; return copy; } var treeProto =3D quadtree.prototype =3D Quadtree.prototype; treeProto.copy =3D function() { var copy =3D new Quadtree(this._x, this._y, this._x0, this._y0, this._x1,= this._y1), node =3D this._root, nodes, child; if (!node) return copy; if (!node.length) return copy._root =3D leaf_copy(node), copy; nodes =3D [{source: node, target: copy._root =3D new Array(4)}]; while (node =3D nodes.pop()) { for (var i =3D 0; i < 4; ++i) { if (child =3D node.source[i]) { if (child.length) nodes.push({source: child, target: node.target[i]= =3D new Array(4)}); else node.target[i] =3D leaf_copy(child); } } } return copy; }; treeProto.add =3D tree_add; treeProto.addAll =3D addAll; treeProto.cover =3D tree_cover; treeProto.data =3D tree_data; treeProto.extent =3D tree_extent; treeProto.find =3D tree_find; treeProto.remove =3D tree_remove; treeProto.removeAll =3D removeAll; treeProto.root =3D tree_root; treeProto.size =3D tree_size; treeProto.visit =3D tree_visit; treeProto.visitAfter =3D tree_visitAfter; treeProto.x =3D tree_x; treeProto.y =3D tree_y; function x(d) { return d.x + d.vx; } function y(d) { return d.y + d.vy; } function collide(radius) { var nodes, radii, strength =3D 1, iterations =3D 1; if (typeof radius !=3D=3D "function") radius =3D constant$7(radius =3D=3D= null ? 1 : +radius); function force() { var i, n =3D nodes.length, tree, node, xi, yi, ri, ri2; for (var k =3D 0; k < iterations; ++k) { tree =3D quadtree(nodes, x, y).visitAfter(prepare); for (i =3D 0; i < n; ++i) { node =3D nodes[i]; ri =3D radii[node.index], ri2 =3D ri * ri; xi =3D node.x + node.vx; yi =3D node.y + node.vy; tree.visit(apply); } } function apply(quad, x0, y0, x1, y1) { var data =3D quad.data, rj =3D quad.r, r =3D ri + rj; if (data) { if (data.index > node.index) { var x =3D xi - data.x - data.vx, y =3D yi - data.y - data.vy, l =3D x * x + y * y; if (l < r * r) { if (x =3D=3D=3D 0) x =3D jiggle(), l +=3D x * x; if (y =3D=3D=3D 0) y =3D jiggle(), l +=3D y * y; l =3D (r - (l =3D Math.sqrt(l))) / l * strength; node.vx +=3D (x *=3D l) * (r =3D (rj *=3D rj) / (ri2 + rj)); node.vy +=3D (y *=3D l) * r; data.vx -=3D x * (r =3D 1 - r); data.vy -=3D y * r; } } return; } return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; } } function prepare(quad) { if (quad.data) return quad.r =3D radii[quad.data.index]; for (var i =3D quad.r =3D 0; i < 4; ++i) { if (quad[i] && quad[i].r > quad.r) { quad.r =3D quad[i].r; } } } function initialize() { if (!nodes) return; var i, n =3D nodes.length, node; radii =3D new Array(n); for (i =3D 0; i < n; ++i) node =3D nodes[i], radii[node.index] =3D +rad= ius(node, i, nodes); } force.initialize =3D function(_) { nodes =3D _; initialize(); }; force.iterations =3D function(_) { return arguments.length ? (iterations =3D +_, force) : iterations; }; force.strength =3D function(_) { return arguments.length ? (strength =3D +_, force) : strength; }; force.radius =3D function(_) { return arguments.length ? (radius =3D typeof _ =3D=3D=3D "function" ? _= : constant$7(+_), initialize(), force) : radius; }; return force; } function index(d) { return d.index; } function find(nodeById, nodeId) { var node =3D nodeById.get(nodeId); if (!node) throw new Error("missing: " + nodeId); return node; } function link(links) { var id =3D index, strength =3D defaultStrength, strengths, distance =3D constant$7(30), distances, nodes, count, bias, iterations =3D 1; if (links =3D=3D null) links =3D []; function defaultStrength(link) { return 1 / Math.min(count[link.source.index], count[link.target.index]); } function force(alpha) { for (var k =3D 0, n =3D links.length; k < iterations; ++k) { for (var i =3D 0, link, source, target, x, y, l, b; i < n; ++i) { link =3D links[i], source =3D link.source, target =3D link.target; x =3D target.x + target.vx - source.x - source.vx || jiggle(); y =3D target.y + target.vy - source.y - source.vy || jiggle(); l =3D Math.sqrt(x * x + y * y); l =3D (l - distances[i]) / l * alpha * strengths[i]; x *=3D l, y *=3D l; target.vx -=3D x * (b =3D bias[i]); target.vy -=3D y * b; source.vx +=3D x * (b =3D 1 - b); source.vy +=3D y * b; } } } function initialize() { if (!nodes) return; var i, n =3D nodes.length, m =3D links.length, nodeById =3D map$1(nodes, id), link; for (i =3D 0, count =3D new Array(n); i < m; ++i) { link =3D links[i], link.index =3D i; if (typeof link.source !=3D=3D "object") link.source =3D find(nodeByI= d, link.source); if (typeof link.target !=3D=3D "object") link.target =3D find(nodeByI= d, link.target); count[link.source.index] =3D (count[link.source.index] || 0) + 1; count[link.target.index] =3D (count[link.target.index] || 0) + 1; } for (i =3D 0, bias =3D new Array(m); i < m; ++i) { link =3D links[i], bias[i] =3D count[link.source.index] / (count[link= =2Esource.index] + count[link.target.index]); } strengths =3D new Array(m), initializeStrength(); distances =3D new Array(m), initializeDistance(); } function initializeStrength() { if (!nodes) return; for (var i =3D 0, n =3D links.length; i < n; ++i) { strengths[i] =3D +strength(links[i], i, links); } } function initializeDistance() { if (!nodes) return; for (var i =3D 0, n =3D links.length; i < n; ++i) { distances[i] =3D +distance(links[i], i, links); } } force.initialize =3D function(_) { nodes =3D _; initialize(); }; force.links =3D function(_) { return arguments.length ? (links =3D _, initialize(), force) : links; }; force.id =3D function(_) { return arguments.length ? (id =3D _, force) : id; }; force.iterations =3D function(_) { return arguments.length ? (iterations =3D +_, force) : iterations; }; force.strength =3D function(_) { return arguments.length ? (strength =3D typeof _ =3D=3D=3D "function" ?= _ : constant$7(+_), initializeStrength(), force) : strength; }; force.distance =3D function(_) { return arguments.length ? (distance =3D typeof _ =3D=3D=3D "function" ?= _ : constant$7(+_), initializeDistance(), force) : distance; }; return force; } function x$1(d) { return d.x; } function y$1(d) { return d.y; } var initialRadius =3D 10, initialAngle =3D Math.PI * (3 - Math.sqrt(5)); function simulation(nodes) { var simulation, alpha =3D 1, alphaMin =3D 0.001, alphaDecay =3D 1 - Math.pow(alphaMin, 1 / 300), alphaTarget =3D 0, velocityDecay =3D 0.6, forces =3D map$1(), stepper =3D timer(step), event =3D dispatch("tick", "end"); if (nodes =3D=3D null) nodes =3D []; function step() { tick(); event.call("tick", simulation); if (alpha < alphaMin) { stepper.stop(); event.call("end", simulation); } } function tick(iterations) { var i, n =3D nodes.length, node; if (iterations =3D=3D=3D undefined) iterations =3D 1; for (var k =3D 0; k < iterations; ++k) { alpha +=3D (alphaTarget - alpha) * alphaDecay; forces.each(function (force) { force(alpha); }); for (i =3D 0; i < n; ++i) { node =3D nodes[i]; if (node.fx =3D=3D null) node.x +=3D node.vx *=3D velocityDecay; else node.x =3D node.fx, node.vx =3D 0; if (node.fy =3D=3D null) node.y +=3D node.vy *=3D velocityDecay; else node.y =3D node.fy, node.vy =3D 0; } } return simulation; } function initializeNodes() { for (var i =3D 0, n =3D nodes.length, node; i < n; ++i) { node =3D nodes[i], node.index =3D i; if (node.fx !=3D null) node.x =3D node.fx; if (node.fy !=3D null) node.y =3D node.fy; if (isNaN(node.x) || isNaN(node.y)) { var radius =3D initialRadius * Math.sqrt(i), angle =3D i * initialA= ngle; node.x =3D radius * Math.cos(angle); node.y =3D radius * Math.sin(angle); } if (isNaN(node.vx) || isNaN(node.vy)) { node.vx =3D node.vy =3D 0; } } } function initializeForce(force) { if (force.initialize) force.initialize(nodes); return force; } initializeNodes(); return simulation =3D { tick: tick, restart: function() { return stepper.restart(step), simulation; }, stop: function() { return stepper.stop(), simulation; }, nodes: function(_) { return arguments.length ? (nodes =3D _, initializeNodes(), forces.eac= h(initializeForce), simulation) : nodes; }, alpha: function(_) { return arguments.length ? (alpha =3D +_, simulation) : alpha; }, alphaMin: function(_) { return arguments.length ? (alphaMin =3D +_, simulation) : alphaMin; }, alphaDecay: function(_) { return arguments.length ? (alphaDecay =3D +_, simulation) : +alphaDec= ay; }, alphaTarget: function(_) { return arguments.length ? (alphaTarget =3D +_, simulation) : alphaTar= get; }, velocityDecay: function(_) { return arguments.length ? (velocityDecay =3D 1 - _, simulation) : 1 -= velocityDecay; }, force: function(name, _) { return arguments.length > 1 ? ((_ =3D=3D null ? forces.remove(name) := forces.set(name, initializeForce(_))), simulation) : forces.get(name); }, find: function(x, y, radius) { var i =3D 0, n =3D nodes.length, dx, dy, d2, node, closest; if (radius =3D=3D null) radius =3D Infinity; else radius *=3D radius; for (i =3D 0; i < n; ++i) { node =3D nodes[i]; dx =3D x - node.x; dy =3D y - node.y; d2 =3D dx * dx + dy * dy; if (d2 < radius) closest =3D node, radius =3D d2; } return closest; }, on: function(name, _) { return arguments.length > 1 ? (event.on(name, _), simulation) : event= =2Eon(name); } }; } function manyBody() { var nodes, node, alpha, strength =3D constant$7(-30), strengths, distanceMin2 =3D 1, distanceMax2 =3D Infinity, theta2 =3D 0.81; function force(_) { var i, n =3D nodes.length, tree =3D quadtree(nodes, x$1, y$1).visitAfte= r(accumulate); for (alpha =3D _, i =3D 0; i < n; ++i) node =3D nodes[i], tree.visit(ap= ply); } function initialize() { if (!nodes) return; var i, n =3D nodes.length, node; strengths =3D new Array(n); for (i =3D 0; i < n; ++i) node =3D nodes[i], strengths[node.index] =3D = +strength(node, i, nodes); } function accumulate(quad) { var strength =3D 0, q, c, weight =3D 0, x, y, i; // For internal nodes, accumulate forces from child quadrants. if (quad.length) { for (x =3D y =3D i =3D 0; i < 4; ++i) { if ((q =3D quad[i]) && (c =3D Math.abs(q.value))) { strength +=3D q.value, weight +=3D c, x +=3D c * q.x, y +=3D c * = q.y; } } quad.x =3D x / weight; quad.y =3D y / weight; } // For leaf nodes, accumulate forces from coincident quadrants. else { q =3D quad; q.x =3D q.data.x; q.y =3D q.data.y; do strength +=3D strengths[q.data.index]; while (q =3D q.next); } quad.value =3D strength; } function apply(quad, x1, _, x2) { if (!quad.value) return true; var x =3D quad.x - node.x, y =3D quad.y - node.y, w =3D x2 - x1, l =3D x * x + y * y; // Apply the Barnes-Hut approximation if possible. // Limit forces for very close nodes; randomize direction if coincident. if (w * w / theta2 < l) { if (l < distanceMax2) { if (x =3D=3D=3D 0) x =3D jiggle(), l +=3D x * x; if (y =3D=3D=3D 0) y =3D jiggle(), l +=3D y * y; if (l < distanceMin2) l =3D Math.sqrt(distanceMin2 * l); node.vx +=3D x * quad.value * alpha / l; node.vy +=3D y * quad.value * alpha / l; } return true; } // Otherwise, process points directly. else if (quad.length || l >=3D distanceMax2) return; // Limit forces for very close nodes; randomize direction if coincident. if (quad.data !=3D=3D node || quad.next) { if (x =3D=3D=3D 0) x =3D jiggle(), l +=3D x * x; if (y =3D=3D=3D 0) y =3D jiggle(), l +=3D y * y; if (l < distanceMin2) l =3D Math.sqrt(distanceMin2 * l); } do if (quad.data !=3D=3D node) { w =3D strengths[quad.data.index] * alpha / l; node.vx +=3D x * w; node.vy +=3D y * w; } while (quad =3D quad.next); } force.initialize =3D function(_) { nodes =3D _; initialize(); }; force.strength =3D function(_) { return arguments.length ? (strength =3D typeof _ =3D=3D=3D "function" ?= _ : constant$7(+_), initialize(), force) : strength; }; force.distanceMin =3D function(_) { return arguments.length ? (distanceMin2 =3D _ * _, force) : Math.sqrt(d= istanceMin2); }; force.distanceMax =3D function(_) { return arguments.length ? (distanceMax2 =3D _ * _, force) : Math.sqrt(d= istanceMax2); }; force.theta =3D function(_) { return arguments.length ? (theta2 =3D _ * _, force) : Math.sqrt(theta2); }; return force; } function radial(radius, x, y) { var nodes, strength =3D constant$7(0.1), strengths, radiuses; if (typeof radius !=3D=3D "function") radius =3D constant$7(+radius); if (x =3D=3D null) x =3D 0; if (y =3D=3D null) y =3D 0; function force(alpha) { for (var i =3D 0, n =3D nodes.length; i < n; ++i) { var node =3D nodes[i], dx =3D node.x - x || 1e-6, dy =3D node.y - y || 1e-6, r =3D Math.sqrt(dx * dx + dy * dy), k =3D (radiuses[i] - r) * strengths[i] * alpha / r; node.vx +=3D dx * k; node.vy +=3D dy * k; } } function initialize() { if (!nodes) return; var i, n =3D nodes.length; strengths =3D new Array(n); radiuses =3D new Array(n); for (i =3D 0; i < n; ++i) { radiuses[i] =3D +radius(nodes[i], i, nodes); strengths[i] =3D isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, node= s); } } force.initialize =3D function(_) { nodes =3D _, initialize(); }; force.strength =3D function(_) { return arguments.length ? (strength =3D typeof _ =3D=3D=3D "function" ?= _ : constant$7(+_), initialize(), force) : strength; }; force.radius =3D function(_) { return arguments.length ? (radius =3D typeof _ =3D=3D=3D "function" ? _= : constant$7(+_), initialize(), force) : radius; }; force.x =3D function(_) { return arguments.length ? (x =3D +_, force) : x; }; force.y =3D function(_) { return arguments.length ? (y =3D +_, force) : y; }; return force; } function x$2(x) { var strength =3D constant$7(0.1), nodes, strengths, xz; if (typeof x !=3D=3D "function") x =3D constant$7(x =3D=3D null ? 0 : +x); function force(alpha) { for (var i =3D 0, n =3D nodes.length, node; i < n; ++i) { node =3D nodes[i], node.vx +=3D (xz[i] - node.x) * strengths[i] * alp= ha; } } function initialize() { if (!nodes) return; var i, n =3D nodes.length; strengths =3D new Array(n); xz =3D new Array(n); for (i =3D 0; i < n; ++i) { strengths[i] =3D isNaN(xz[i] =3D +x(nodes[i], i, nodes)) ? 0 : +stren= gth(nodes[i], i, nodes); } } force.initialize =3D function(_) { nodes =3D _; initialize(); }; force.strength =3D function(_) { return arguments.length ? (strength =3D typeof _ =3D=3D=3D "function" ?= _ : constant$7(+_), initialize(), force) : strength; }; force.x =3D function(_) { return arguments.length ? (x =3D typeof _ =3D=3D=3D "function" ? _ : co= nstant$7(+_), initialize(), force) : x; }; return force; } function y$2(y) { var strength =3D constant$7(0.1), nodes, strengths, yz; if (typeof y !=3D=3D "function") y =3D constant$7(y =3D=3D null ? 0 : +y); function force(alpha) { for (var i =3D 0, n =3D nodes.length, node; i < n; ++i) { node =3D nodes[i], node.vy +=3D (yz[i] - node.y) * strengths[i] * alp= ha; } } function initialize() { if (!nodes) return; var i, n =3D nodes.length; strengths =3D new Array(n); yz =3D new Array(n); for (i =3D 0; i < n; ++i) { strengths[i] =3D isNaN(yz[i] =3D +y(nodes[i], i, nodes)) ? 0 : +stren= gth(nodes[i], i, nodes); } } force.initialize =3D function(_) { nodes =3D _; initialize(); }; force.strength =3D function(_) { return arguments.length ? (strength =3D typeof _ =3D=3D=3D "function" ?= _ : constant$7(+_), initialize(), force) : strength; }; force.y =3D function(_) { return arguments.length ? (y =3D typeof _ =3D=3D=3D "function" ? _ : co= nstant$7(+_), initialize(), force) : y; }; return force; } // Computes the decimal coefficient and exponent of the specified number x = with // significant digits p, where x is positive and p is in [1, 21] or undefin= ed. // For example, formatDecimal(1.23) returns ["123", 0]. function formatDecimal(x, p) { if ((i =3D (x =3D p ? x.toExponential(p - 1) : x.toExponential()).indexOf= ("e")) < 0) return null; // NaN, =C2=B1Infinity var i, coefficient =3D x.slice(0, i); // The string returned by toExponential either has the form \d\.\d+e[-+]\= d+ // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). return [ coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coeffi= cient, +x.slice(i + 1) ]; } function exponent$1(x) { return x =3D formatDecimal(Math.abs(x)), x ? x[1] : NaN; } function formatGroup(grouping, thousands) { return function(value, width) { var i =3D value.length, t =3D [], j =3D 0, g =3D grouping[0], length =3D 0; while (i > 0 && g > 0) { if (length + g + 1 > width) g =3D Math.max(1, width - length); t.push(value.substring(i -=3D g, i + g)); if ((length +=3D g + 1) > width) break; g =3D grouping[j =3D (j + 1) % grouping.length]; } return t.reverse().join(thousands); }; } function formatNumerals(numerals) { return function(value) { return value.replace(/[0-9]/g, function(i) { return numerals[+i]; }); }; } // [[fill]align][sign][symbol][0][width][,][.precision][~][type] var re =3D /^(?:(.)?([<>=3D^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?= ([a-z%])?$/i; function formatSpecifier(specifier) { return new FormatSpecifier(specifier); } formatSpecifier.prototype =3D FormatSpecifier.prototype; // instanceof function FormatSpecifier(specifier) { if (!(match =3D re.exec(specifier))) throw new Error("invalid format: " += specifier); var match; this.fill =3D match[1] || " "; this.align =3D match[2] || ">"; this.sign =3D match[3] || "-"; this.symbol =3D match[4] || ""; this.zero =3D !!match[5]; this.width =3D match[6] && +match[6]; this.comma =3D !!match[7]; this.precision =3D match[8] && +match[8].slice(1); this.trim =3D !!match[9]; this.type =3D match[10] || ""; } FormatSpecifier.prototype.toString =3D function() { return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (this.width =3D=3D null ? "" : Math.max(1, this.width | 0)) + (this.comma ? "," : "") + (this.precision =3D=3D null ? "" : "." + Math.max(0, this.precision= | 0)) + (this.trim ? "~" : "") + this.type; }; // Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. function formatTrim(s) { out: for (var n =3D s.length, i =3D 1, i0 =3D -1, i1; i < n; ++i) { switch (s[i]) { case ".": i0 =3D i1 =3D i; break; case "0": if (i0 =3D=3D=3D 0) i0 =3D i; i1 =3D i; break; default: if (i0 > 0) { if (!+s[i]) break out; i0 =3D 0; } break; } } return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; } var prefixExponent; function formatPrefixAuto(x, p) { var d =3D formatDecimal(x, p); if (!d) return x + ""; var coefficient =3D d[0], exponent =3D d[1], i =3D exponent - (prefixExponent =3D Math.max(-8, Math.min(8, Math.fl= oor(exponent / 3))) * 3) + 1, n =3D coefficient.length; return i =3D=3D=3D n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join("0") : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p = + i - 1))[0]; // less than 1y! } function formatRounded(x, p) { var d =3D formatDecimal(x, p); if (!d) return x + ""; var coefficient =3D d[0], exponent =3D d[1]; return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent += 1) + "." + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join("0"= ); } var formatTypes =3D { "%": function(x, p) { return (x * 100).toFixed(p); }, "b": function(x) { return Math.round(x).toString(2); }, "c": function(x) { return x + ""; }, "d": function(x) { return Math.round(x).toString(10); }, "e": function(x, p) { return x.toExponential(p); }, "f": function(x, p) { return x.toFixed(p); }, "g": function(x, p) { return x.toPrecision(p); }, "o": function(x) { return Math.round(x).toString(8); }, "p": function(x, p) { return formatRounded(x * 100, p); }, "r": formatRounded, "s": formatPrefixAuto, "X": function(x) { return Math.round(x).toString(16).toUpperCase(); }, "x": function(x) { return Math.round(x).toString(16); } }; function identity$3(x) { return x; } var prefixes =3D ["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P"= ,"E","Z","Y"]; function formatLocale(locale) { var group =3D locale.grouping && locale.thousands ? formatGroup(locale.gr= ouping, locale.thousands) : identity$3, currency =3D locale.currency, decimal =3D locale.decimal, numerals =3D locale.numerals ? formatNumerals(locale.numerals) : iden= tity$3, percent =3D locale.percent || "%"; function newFormat(specifier) { specifier =3D formatSpecifier(specifier); var fill =3D specifier.fill, align =3D specifier.align, sign =3D specifier.sign, symbol =3D specifier.symbol, zero =3D specifier.zero, width =3D specifier.width, comma =3D specifier.comma, precision =3D specifier.precision, trim =3D specifier.trim, type =3D specifier.type; // The "n" type is an alias for ",g". if (type =3D=3D=3D "n") comma =3D true, type =3D "g"; // The "" type, and any invalid type, is an alias for ".12~g". else if (!formatTypes[type]) precision =3D=3D null && (precision =3D 12= ), trim =3D true, type =3D "g"; // If zero fill is specified, padding goes after sign and before digits. if (zero || (fill =3D=3D=3D "0" && align =3D=3D=3D "=3D")) zero =3D tru= e, fill =3D "0", align =3D "=3D"; // Compute the prefix and suffix. // For SI-prefix, the suffix is lazily computed. var prefix =3D symbol =3D=3D=3D "$" ? currency[0] : symbol =3D=3D=3D "#= " && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", suffix =3D symbol =3D=3D=3D "$" ? currency[1] : /[%p]/.test(type) ?= percent : ""; // What format function should we use? // Is this an integer type? // Can this type generate exponential notation? var formatType =3D formatTypes[type], maybeSuffix =3D /[defgprs%]/.test(type); // Set the default precision if not specified, // or clamp the specified precision to the supported range. // For significant precision, it must be in [1, 21]. // For fixed precision, it must be in [0, 20]. precision =3D precision =3D=3D null ? 6 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision)); function format(value) { var valuePrefix =3D prefix, valueSuffix =3D suffix, i, n, c; if (type =3D=3D=3D "c") { valueSuffix =3D formatType(value) + valueSuffix; value =3D ""; } else { value =3D +value; // Perform the initial formatting. var valueNegative =3D value < 0; value =3D formatType(Math.abs(value), precision); // Trim insignificant zeros. if (trim) value =3D formatTrim(value); // If a negative value rounds to zero during formatting, treat as p= ositive. if (valueNegative && +value =3D=3D=3D 0) valueNegative =3D false; // Compute the prefix and suffix. valuePrefix =3D (valueNegative ? (sign =3D=3D=3D "(" ? sign : "-") = : sign =3D=3D=3D "-" || sign =3D=3D=3D "(" ? "" : sign) + valuePrefix; valueSuffix =3D (type =3D=3D=3D "s" ? prefixes[8 + prefixExponent /= 3] : "") + valueSuffix + (valueNegative && sign =3D=3D=3D "(" ? ")" : ""); // Break the formatted value into the integer =E2=80=9Cvalue=E2=80= =9D part that can be // grouped, and fractional or exponential =E2=80=9Csuffix=E2=80=9D = part that is not. if (maybeSuffix) { i =3D -1, n =3D value.length; while (++i < n) { if (c =3D value.charCodeAt(i), 48 > c || c > 57) { valueSuffix =3D (c =3D=3D=3D 46 ? decimal + value.slice(i + 1= ) : value.slice(i)) + valueSuffix; value =3D value.slice(0, i); break; } } } } // If the fill character is not "0", grouping is applied before paddi= ng. if (comma && !zero) value =3D group(value, Infinity); // Compute the padding. var length =3D valuePrefix.length + value.length + valueSuffix.length, padding =3D length < width ? new Array(width - length + 1).join(f= ill) : ""; // If the fill character is "0", grouping is applied after padding. if (comma && zero) value =3D group(padding + value, padding.length ? = width - valueSuffix.length : Infinity), padding =3D ""; // Reconstruct the final output based on the desired alignment. switch (align) { case "<": value =3D valuePrefix + value + valueSuffix + padding; br= eak; case "=3D": value =3D valuePrefix + padding + value + valueSuffix; = break; case "^": value =3D padding.slice(0, length =3D padding.length >> 1= ) + valuePrefix + value + valueSuffix + padding.slice(length); break; default: value =3D padding + valuePrefix + value + valueSuffix; bre= ak; } return numerals(value); } format.toString =3D function() { return specifier + ""; }; return format; } function formatPrefix(specifier, value) { var f =3D newFormat((specifier =3D formatSpecifier(specifier), specifie= r.type =3D "f", specifier)), e =3D Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) = * 3, k =3D Math.pow(10, -e), prefix =3D prefixes[8 + e / 3]; return function(value) { return f(k * value) + prefix; }; } return { format: newFormat, formatPrefix: formatPrefix }; } var locale; defaultLocale({ decimal: ".", thousands: ",", grouping: [3], currency: ["$", ""] }); function defaultLocale(definition) { locale =3D formatLocale(definition); exports.format =3D locale.format; exports.formatPrefix =3D locale.formatPrefix; return locale; } function precisionFixed(step) { return Math.max(0, -exponent$1(Math.abs(step))); } function precisionPrefix(step, value) { return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) = / 3))) * 3 - exponent$1(Math.abs(step))); } function precisionRound(step, max) { step =3D Math.abs(step), max =3D Math.abs(max) - step; return Math.max(0, exponent$1(max) - exponent$1(step)) + 1; } // Adds floating point numbers with twice the normal precision. // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic = and // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3) // 305=E2=80=93363 (1997). // Code adapted from GeographicLib by Charles F. F. Karney, // http://geographiclib.sourceforge.net/ function adder() { return new Adder; } function Adder() { this.reset(); } Adder.prototype =3D { constructor: Adder, reset: function() { this.s =3D // rounded value this.t =3D 0; // exact error }, add: function(y) { add$1(temp, y, this.t); add$1(this, temp.s, this.s); if (this.s) this.t +=3D temp.t; else this.s =3D temp.t; }, valueOf: function() { return this.s; } }; var temp =3D new Adder; function add$1(adder, a, b) { var x =3D adder.s =3D a + b, bv =3D x - a, av =3D x - bv; adder.t =3D (a - av) + (b - bv); } var epsilon$2 =3D 1e-6; var epsilon2$1 =3D 1e-12; var pi$3 =3D Math.PI; var halfPi$2 =3D pi$3 / 2; var quarterPi =3D pi$3 / 4; var tau$3 =3D pi$3 * 2; var degrees$1 =3D 180 / pi$3; var radians =3D pi$3 / 180; var abs =3D Math.abs; var atan =3D Math.atan; var atan2 =3D Math.atan2; var cos$1 =3D Math.cos; var ceil =3D Math.ceil; var exp =3D Math.exp; var log =3D Math.log; var pow =3D Math.pow; var sin$1 =3D Math.sin; var sign =3D Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; = }; var sqrt =3D Math.sqrt; var tan =3D Math.tan; function acos(x) { return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x); } function asin(x) { return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x); } function haversin(x) { return (x =3D sin$1(x / 2)) * x; } function noop$2() {} function streamGeometry(geometry, stream) { if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { streamGeometryType[geometry.type](geometry, stream); } } var streamObjectType =3D { Feature: function(object, stream) { streamGeometry(object.geometry, stream); }, FeatureCollection: function(object, stream) { var features =3D object.features, i =3D -1, n =3D features.length; while (++i < n) streamGeometry(features[i].geometry, stream); } }; var streamGeometryType =3D { Sphere: function(object, stream) { stream.sphere(); }, Point: function(object, stream) { object =3D object.coordinates; stream.point(object[0], object[1], object[2]); }, MultiPoint: function(object, stream) { var coordinates =3D object.coordinates, i =3D -1, n =3D coordinates.len= gth; while (++i < n) object =3D coordinates[i], stream.point(object[0], obje= ct[1], object[2]); }, LineString: function(object, stream) { streamLine(object.coordinates, stream, 0); }, MultiLineString: function(object, stream) { var coordinates =3D object.coordinates, i =3D -1, n =3D coordinates.len= gth; while (++i < n) streamLine(coordinates[i], stream, 0); }, Polygon: function(object, stream) { streamPolygon(object.coordinates, stream); }, MultiPolygon: function(object, stream) { var coordinates =3D object.coordinates, i =3D -1, n =3D coordinates.len= gth; while (++i < n) streamPolygon(coordinates[i], stream); }, GeometryCollection: function(object, stream) { var geometries =3D object.geometries, i =3D -1, n =3D geometries.length; while (++i < n) streamGeometry(geometries[i], stream); } }; function streamLine(coordinates, stream, closed) { var i =3D -1, n =3D coordinates.length - closed, coordinate; stream.lineStart(); while (++i < n) coordinate =3D coordinates[i], stream.point(coordinate[0]= , coordinate[1], coordinate[2]); stream.lineEnd(); } function streamPolygon(coordinates, stream) { var i =3D -1, n =3D coordinates.length; stream.polygonStart(); while (++i < n) streamLine(coordinates[i], stream, 1); stream.polygonEnd(); } function geoStream(object, stream) { if (object && streamObjectType.hasOwnProperty(object.type)) { streamObjectType[object.type](object, stream); } else { streamGeometry(object, stream); } } var areaRingSum =3D adder(); var areaSum =3D adder(), lambda00, phi00, lambda0, cosPhi0, sinPhi0; var areaStream =3D { point: noop$2, lineStart: noop$2, lineEnd: noop$2, polygonStart: function() { areaRingSum.reset(); areaStream.lineStart =3D areaRingStart; areaStream.lineEnd =3D areaRingEnd; }, polygonEnd: function() { var areaRing =3D +areaRingSum; areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing); this.lineStart =3D this.lineEnd =3D this.point =3D noop$2; }, sphere: function() { areaSum.add(tau$3); } }; function areaRingStart() { areaStream.point =3D areaPointFirst; } function areaRingEnd() { areaPoint(lambda00, phi00); } function areaPointFirst(lambda, phi) { areaStream.point =3D areaPoint; lambda00 =3D lambda, phi00 =3D phi; lambda *=3D radians, phi *=3D radians; lambda0 =3D lambda, cosPhi0 =3D cos$1(phi =3D phi / 2 + quarterPi), sinPh= i0 =3D sin$1(phi); } function areaPoint(lambda, phi) { lambda *=3D radians, phi *=3D radians; phi =3D phi / 2 + quarterPi; // half the angular distance from south pole // Spherical excess E for a spherical triangle with vertices: south pole, // previous point, current point. Uses a formula derived from Cagnoli=E2= =80=99s // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). var dLambda =3D lambda - lambda0, sdLambda =3D dLambda >=3D 0 ? 1 : -1, adLambda =3D sdLambda * dLambda, cosPhi =3D cos$1(phi), sinPhi =3D sin$1(phi), k =3D sinPhi0 * sinPhi, u =3D cosPhi0 * cosPhi + k * cos$1(adLambda), v =3D k * sdLambda * sin$1(adLambda); areaRingSum.add(atan2(v, u)); // Advance the previous points. lambda0 =3D lambda, cosPhi0 =3D cosPhi, sinPhi0 =3D sinPhi; } function area$1(object) { areaSum.reset(); geoStream(object, areaStream); return areaSum * 2; } function spherical(cartesian) { return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; } function cartesian(spherical) { var lambda =3D spherical[0], phi =3D spherical[1], cosPhi =3D cos$1(phi); return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)]; } function cartesianDot(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } function cartesianCross(a, b) { return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1]= - a[1] * b[0]]; } // TODO return a function cartesianAddInPlace(a, b) { a[0] +=3D b[0], a[1] +=3D b[1], a[2] +=3D b[2]; } function cartesianScale(vector, k) { return [vector[0] * k, vector[1] * k, vector[2] * k]; } // TODO return d function cartesianNormalizeInPlace(d) { var l =3D sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); d[0] /=3D l, d[1] /=3D l, d[2] /=3D l; } var lambda0$1, phi0, lambda1, phi1, // bounds lambda2, // previous lambda-coordinate lambda00$1, phi00$1, // first point p0, // previous 3D point deltaSum =3D adder(), ranges, range; var boundsStream =3D { point: boundsPoint, lineStart: boundsLineStart, lineEnd: boundsLineEnd, polygonStart: function() { boundsStream.point =3D boundsRingPoint; boundsStream.lineStart =3D boundsRingStart; boundsStream.lineEnd =3D boundsRingEnd; deltaSum.reset(); areaStream.polygonStart(); }, polygonEnd: function() { areaStream.polygonEnd(); boundsStream.point =3D boundsPoint; boundsStream.lineStart =3D boundsLineStart; boundsStream.lineEnd =3D boundsLineEnd; if (areaRingSum < 0) lambda0$1 =3D -(lambda1 =3D 180), phi0 =3D -(phi1 = =3D 90); else if (deltaSum > epsilon$2) phi1 =3D 90; else if (deltaSum < -epsilon$2) phi0 =3D -90; range[0] =3D lambda0$1, range[1] =3D lambda1; }, sphere: function() { lambda0$1 =3D -(lambda1 =3D 180), phi0 =3D -(phi1 =3D 90); } }; function boundsPoint(lambda, phi) { ranges.push(range =3D [lambda0$1 =3D lambda, lambda1 =3D lambda]); if (phi < phi0) phi0 =3D phi; if (phi > phi1) phi1 =3D phi; } function linePoint(lambda, phi) { var p =3D cartesian([lambda * radians, phi * radians]); if (p0) { var normal =3D cartesianCross(p0, p), equatorial =3D [normal[1], -normal[0], 0], inflection =3D cartesianCross(equatorial, normal); cartesianNormalizeInPlace(inflection); inflection =3D spherical(inflection); var delta =3D lambda - lambda2, sign$$1 =3D delta > 0 ? 1 : -1, lambdai =3D inflection[0] * degrees$1 * sign$$1, phii, antimeridian =3D abs(delta) > 180; if (antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * = lambda)) { phii =3D inflection[1] * degrees$1; if (phii > phi1) phi1 =3D phii; } else if (lambdai =3D (lambdai + 360) % 360 - 180, antimeridian ^ (sig= n$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) { phii =3D -inflection[1] * degrees$1; if (phii < phi0) phi0 =3D phii; } else { if (phi < phi0) phi0 =3D phi; if (phi > phi1) phi1 =3D phi; } if (antimeridian) { if (lambda < lambda2) { if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = =3D lambda; } else { if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = =3D lambda; } } else { if (lambda1 >=3D lambda0$1) { if (lambda < lambda0$1) lambda0$1 =3D lambda; if (lambda > lambda1) lambda1 =3D lambda; } else { if (lambda > lambda2) { if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1= =3D lambda; } else { if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1= =3D lambda; } } } } else { ranges.push(range =3D [lambda0$1 =3D lambda, lambda1 =3D lambda]); } if (phi < phi0) phi0 =3D phi; if (phi > phi1) phi1 =3D phi; p0 =3D p, lambda2 =3D lambda; } function boundsLineStart() { boundsStream.point =3D linePoint; } function boundsLineEnd() { range[0] =3D lambda0$1, range[1] =3D lambda1; boundsStream.point =3D boundsPoint; p0 =3D null; } function boundsRingPoint(lambda, phi) { if (p0) { var delta =3D lambda - lambda2; deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delt= a); } else { lambda00$1 =3D lambda, phi00$1 =3D phi; } areaStream.point(lambda, phi); linePoint(lambda, phi); } function boundsRingStart() { areaStream.lineStart(); } function boundsRingEnd() { boundsRingPoint(lambda00$1, phi00$1); areaStream.lineEnd(); if (abs(deltaSum) > epsilon$2) lambda0$1 =3D -(lambda1 =3D 180); range[0] =3D lambda0$1, range[1] =3D lambda1; p0 =3D null; } // Finds the left-right distance between two longitudes. // This is almost the same as (lambda1 - lambda0 + 360=C2=B0) % 360=C2=B0, = except that we want // the distance between =C2=B1180=C2=B0 to be 360=C2=B0. function angle(lambda0, lambda1) { return (lambda1 -=3D lambda0) < 0 ? lambda1 + 360 : lambda1; } function rangeCompare(a, b) { return a[0] - b[0]; } function rangeContains(range, x) { return range[0] <=3D range[1] ? range[0] <=3D x && x <=3D range[1] : x < = range[0] || range[1] < x; } function bounds(feature) { var i, n, a, b, merged, deltaMax, delta; phi1 =3D lambda1 =3D -(lambda0$1 =3D phi0 =3D Infinity); ranges =3D []; geoStream(feature, boundsStream); // First, sort ranges by their minimum longitudes. if (n =3D ranges.length) { ranges.sort(rangeCompare); // Then, merge any ranges that overlap. for (i =3D 1, a =3D ranges[0], merged =3D [a]; i < n; ++i) { b =3D ranges[i]; if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] =3D b[1]; if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] =3D b[0]; } else { merged.push(a =3D b); } } // Finally, find the largest gap between the merged ranges. // The final bounding box will be the inverse of this gap. for (deltaMax =3D -Infinity, n =3D merged.length - 1, i =3D 0, a =3D me= rged[n]; i <=3D n; a =3D b, ++i) { b =3D merged[i]; if ((delta =3D angle(a[1], b[0])) > deltaMax) deltaMax =3D delta, lam= bda0$1 =3D b[0], lambda1 =3D a[1]; } } ranges =3D range =3D null; return lambda0$1 =3D=3D=3D Infinity || phi0 =3D=3D=3D Infinity ? [[NaN, NaN], [NaN, NaN]] : [[lambda0$1, phi0], [lambda1, phi1]]; } var W0, W1, X0, Y0, Z0, X1, Y1, Z1, X2, Y2, Z2, lambda00$2, phi00$2, // first point x0, y0, z0; // previous point var centroidStream =3D { sphere: noop$2, point: centroidPoint, lineStart: centroidLineStart, lineEnd: centroidLineEnd, polygonStart: function() { centroidStream.lineStart =3D centroidRingStart; centroidStream.lineEnd =3D centroidRingEnd; }, polygonEnd: function() { centroidStream.lineStart =3D centroidLineStart; centroidStream.lineEnd =3D centroidLineEnd; } }; // Arithmetic mean of Cartesian vectors. function centroidPoint(lambda, phi) { lambda *=3D radians, phi *=3D radians; var cosPhi =3D cos$1(phi); centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), si= n$1(phi)); } function centroidPointCartesian(x, y, z) { ++W0; X0 +=3D (x - X0) / W0; Y0 +=3D (y - Y0) / W0; Z0 +=3D (z - Z0) / W0; } function centroidLineStart() { centroidStream.point =3D centroidLinePointFirst; } function centroidLinePointFirst(lambda, phi) { lambda *=3D radians, phi *=3D radians; var cosPhi =3D cos$1(phi); x0 =3D cosPhi * cos$1(lambda); y0 =3D cosPhi * sin$1(lambda); z0 =3D sin$1(phi); centroidStream.point =3D centroidLinePoint; centroidPointCartesian(x0, y0, z0); } function centroidLinePoint(lambda, phi) { lambda *=3D radians, phi *=3D radians; var cosPhi =3D cos$1(phi), x =3D cosPhi * cos$1(lambda), y =3D cosPhi * sin$1(lambda), z =3D sin$1(phi), w =3D atan2(sqrt((w =3D y0 * z - z0 * y) * w + (w =3D z0 * x - x0 * z= ) * w + (w =3D x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); W1 +=3D w; X1 +=3D w * (x0 + (x0 =3D x)); Y1 +=3D w * (y0 + (y0 =3D y)); Z1 +=3D w * (z0 + (z0 =3D z)); centroidPointCartesian(x0, y0, z0); } function centroidLineEnd() { centroidStream.point =3D centroidPoint; } // See J. E. Brock, The Inertia Tensor for a Spherical Triangle, // J. Applied Mechanics 42, 239 (1975). function centroidRingStart() { centroidStream.point =3D centroidRingPointFirst; } function centroidRingEnd() { centroidRingPoint(lambda00$2, phi00$2); centroidStream.point =3D centroidPoint; } function centroidRingPointFirst(lambda, phi) { lambda00$2 =3D lambda, phi00$2 =3D phi; lambda *=3D radians, phi *=3D radians; centroidStream.point =3D centroidRingPoint; var cosPhi =3D cos$1(phi); x0 =3D cosPhi * cos$1(lambda); y0 =3D cosPhi * sin$1(lambda); z0 =3D sin$1(phi); centroidPointCartesian(x0, y0, z0); } function centroidRingPoint(lambda, phi) { lambda *=3D radians, phi *=3D radians; var cosPhi =3D cos$1(phi), x =3D cosPhi * cos$1(lambda), y =3D cosPhi * sin$1(lambda), z =3D sin$1(phi), cx =3D y0 * z - z0 * y, cy =3D z0 * x - x0 * z, cz =3D x0 * y - y0 * x, m =3D sqrt(cx * cx + cy * cy + cz * cz), w =3D asin(m), // line weight =3D angle v =3D m && -w / m; // area weight multiplier X2 +=3D v * cx; Y2 +=3D v * cy; Z2 +=3D v * cz; W1 +=3D w; X1 +=3D w * (x0 + (x0 =3D x)); Y1 +=3D w * (y0 + (y0 =3D y)); Z1 +=3D w * (z0 + (z0 =3D z)); centroidPointCartesian(x0, y0, z0); } function centroid(object) { W0 =3D W1 =3D X0 =3D Y0 =3D Z0 =3D X1 =3D Y1 =3D Z1 =3D X2 =3D Y2 =3D Z2 =3D 0; geoStream(object, centroidStream); var x =3D X2, y =3D Y2, z =3D Z2, m =3D x * x + y * y + z * z; // If the area-weighted ccentroid is undefined, fall back to length-weigh= ted ccentroid. if (m < epsilon2$1) { x =3D X1, y =3D Y1, z =3D Z1; // If the feature has zero length, fall back to arithmetic mean of poin= t vectors. if (W1 < epsilon$2) x =3D X0, y =3D Y0, z =3D Z0; m =3D x * x + y * y + z * z; // If the feature still has an undefined ccentroid, then return. if (m < epsilon2$1) return [NaN, NaN]; } return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1]; } function constant$8(x) { return function() { return x; }; } function compose(a, b) { function compose(x, y) { return x =3D a(x, y), b(x[0], x[1]); } if (a.invert && b.invert) compose.invert =3D function(x, y) { return x =3D b.invert(x, y), x && a.invert(x[0], x[1]); }; return compose; } function rotationIdentity(lambda, phi) { return [abs(lambda) > pi$3 ? lambda + Math.round(-lambda / tau$3) * tau$3= : lambda, phi]; } rotationIdentity.invert =3D rotationIdentity; function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { return (deltaLambda %=3D tau$3) ? (deltaPhi || deltaGamma ? compose(rotat= ionLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) : rotationLambda(deltaLambda)) : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) : rotationIdentity); } function forwardRotationLambda(deltaLambda) { return function(lambda, phi) { return lambda +=3D deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambd= a < -pi$3 ? lambda + tau$3 : lambda, phi]; }; } function rotationLambda(deltaLambda) { var rotation =3D forwardRotationLambda(deltaLambda); rotation.invert =3D forwardRotationLambda(-deltaLambda); return rotation; } function rotationPhiGamma(deltaPhi, deltaGamma) { var cosDeltaPhi =3D cos$1(deltaPhi), sinDeltaPhi =3D sin$1(deltaPhi), cosDeltaGamma =3D cos$1(deltaGamma), sinDeltaGamma =3D sin$1(deltaGamma); function rotation(lambda, phi) { var cosPhi =3D cos$1(phi), x =3D cos$1(lambda) * cosPhi, y =3D sin$1(lambda) * cosPhi, z =3D sin$1(phi), k =3D z * cosDeltaPhi + x * sinDeltaPhi; return [ atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * si= nDeltaPhi), asin(k * cosDeltaGamma + y * sinDeltaGamma) ]; } rotation.invert =3D function(lambda, phi) { var cosPhi =3D cos$1(phi), x =3D cos$1(lambda) * cosPhi, y =3D sin$1(lambda) * cosPhi, z =3D sin$1(phi), k =3D z * cosDeltaGamma - y * sinDeltaGamma; return [ atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * si= nDeltaPhi), asin(k * cosDeltaPhi - x * sinDeltaPhi) ]; }; return rotation; } function rotation(rotate) { rotate =3D rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate= =2Elength > 2 ? rotate[2] * radians : 0); function forward(coordinates) { coordinates =3D rotate(coordinates[0] * radians, coordinates[1] * radia= ns); return coordinates[0] *=3D degrees$1, coordinates[1] *=3D degrees$1, co= ordinates; } forward.invert =3D function(coordinates) { coordinates =3D rotate.invert(coordinates[0] * radians, coordinates[1] = * radians); return coordinates[0] *=3D degrees$1, coordinates[1] *=3D degrees$1, co= ordinates; }; return forward; } // Generates a circle centered at [0=C2=B0, 0=C2=B0], with a given radius a= nd precision. function circleStream(stream, radius, delta, direction, t0, t1) { if (!delta) return; var cosRadius =3D cos$1(radius), sinRadius =3D sin$1(radius), step =3D direction * delta; if (t0 =3D=3D null) { t0 =3D radius + direction * tau$3; t1 =3D radius - step / 2; } else { t0 =3D circleRadius(cosRadius, t0); t1 =3D circleRadius(cosRadius, t1); if (direction > 0 ? t0 < t1 : t0 > t1) t0 +=3D direction * tau$3; } for (var point, t =3D t0; direction > 0 ? t > t1 : t < t1; t -=3D step) { point =3D spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin= $1(t)]); stream.point(point[0], point[1]); } } // Returns the signed angle of a cartesian point relative to [cosRadius, 0,= 0]. function circleRadius(cosRadius, point) { point =3D cartesian(point), point[0] -=3D cosRadius; cartesianNormalizeInPlace(point); var radius =3D acos(-point[1]); return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3; } function circle() { var center =3D constant$8([0, 0]), radius =3D constant$8(90), precision =3D constant$8(6), ring, rotate, stream =3D {point: point}; function point(x, y) { ring.push(x =3D rotate(x, y)); x[0] *=3D degrees$1, x[1] *=3D degrees$1; } function circle() { var c =3D center.apply(this, arguments), r =3D radius.apply(this, arguments) * radians, p =3D precision.apply(this, arguments) * radians; ring =3D []; rotate =3D rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; circleStream(stream, r, p, 1); c =3D {type: "Polygon", coordinates: [ring]}; ring =3D rotate =3D null; return c; } circle.center =3D function(_) { return arguments.length ? (center =3D typeof _ =3D=3D=3D "function" ? _= : constant$8([+_[0], +_[1]]), circle) : center; }; circle.radius =3D function(_) { return arguments.length ? (radius =3D typeof _ =3D=3D=3D "function" ? _= : constant$8(+_), circle) : radius; }; circle.precision =3D function(_) { return arguments.length ? (precision =3D typeof _ =3D=3D=3D "function" = ? _ : constant$8(+_), circle) : precision; }; return circle; } function clipBuffer() { var lines =3D [], line; return { point: function(x, y) { line.push([x, y]); }, lineStart: function() { lines.push(line =3D []); }, lineEnd: noop$2, rejoin: function() { if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); }, result: function() { var result =3D lines; lines =3D []; line =3D null; return result; } }; } function pointEqual(a, b) { return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2; } function Intersection(point, points, other, entry) { this.x =3D point; this.z =3D points; this.o =3D other; // another intersection this.e =3D entry; // is an entry? this.v =3D false; // visited this.n =3D this.p =3D null; // next & previous } // A generalized polygon clipping algorithm: given a polygon that has been = cut // into its visible line segments, and rejoins the segments by interpolating // along the clip edge. function clipRejoin(segments, compareIntersection, startInside, interpolate= , stream) { var subject =3D [], clip =3D [], i, n; segments.forEach(function(segment) { if ((n =3D segment.length - 1) <=3D 0) return; var n, p0 =3D segment[0], p1 =3D segment[n], x; // If the first and last points of a segment are coincident, then treat= as a // closed ring. TODO if all rings are closed, then the winding order of= the // exterior ring should be checked. if (pointEqual(p0, p1)) { stream.lineStart(); for (i =3D 0; i < n; ++i) stream.point((p0 =3D segment[i])[0], p0[1]); stream.lineEnd(); return; } subject.push(x =3D new Intersection(p0, segment, null, true)); clip.push(x.o =3D new Intersection(p0, null, x, false)); subject.push(x =3D new Intersection(p1, segment, null, false)); clip.push(x.o =3D new Intersection(p1, null, x, true)); }); if (!subject.length) return; clip.sort(compareIntersection); link$1(subject); link$1(clip); for (i =3D 0, n =3D clip.length; i < n; ++i) { clip[i].e =3D startInside =3D !startInside; } var start =3D subject[0], points, point; while (1) { // Find first unvisited intersection. var current =3D start, isSubject =3D true; while (current.v) if ((current =3D current.n) =3D=3D=3D start) return; points =3D current.z; stream.lineStart(); do { current.v =3D current.o.v =3D true; if (current.e) { if (isSubject) { for (i =3D 0, n =3D points.length; i < n; ++i) stream.point((poin= t =3D points[i])[0], point[1]); } else { interpolate(current.x, current.n.x, 1, stream); } current =3D current.n; } else { if (isSubject) { points =3D current.p.z; for (i =3D points.length - 1; i >=3D 0; --i) stream.point((point = =3D points[i])[0], point[1]); } else { interpolate(current.x, current.p.x, -1, stream); } current =3D current.p; } current =3D current.o; points =3D current.z; isSubject =3D !isSubject; } while (!current.v); stream.lineEnd(); } } function link$1(array) { if (!(n =3D array.length)) return; var n, i =3D 0, a =3D array[0], b; while (++i < n) { a.n =3D b =3D array[i]; b.p =3D a; a =3D b; } a.n =3D b =3D array[0]; b.p =3D a; } var sum$1 =3D adder(); function longitude(point) { if (abs(point[0]) <=3D pi$3) return point[0]; else return sign(point[0]) * ((abs(point[0]) + pi$3) % tau$3 - pi$3); } function polygonContains(polygon, point) { var lambda =3D longitude(point), phi =3D point[1], sinPhi =3D sin$1(phi), normal =3D [sin$1(lambda), -cos$1(lambda), 0], angle =3D 0, winding =3D 0; sum$1.reset(); if (sinPhi =3D=3D=3D 1) phi =3D halfPi$2 + epsilon$2; else if (sinPhi =3D=3D=3D -1) phi =3D -halfPi$2 - epsilon$2; for (var i =3D 0, n =3D polygon.length; i < n; ++i) { if (!(m =3D (ring =3D polygon[i]).length)) continue; var ring, m, point0 =3D ring[m - 1], lambda0 =3D longitude(point0), phi0 =3D point0[1] / 2 + quarterPi, sinPhi0 =3D sin$1(phi0), cosPhi0 =3D cos$1(phi0); for (var j =3D 0; j < m; ++j, lambda0 =3D lambda1, sinPhi0 =3D sinPhi1,= cosPhi0 =3D cosPhi1, point0 =3D point1) { var point1 =3D ring[j], lambda1 =3D longitude(point1), phi1 =3D point1[1] / 2 + quarterPi, sinPhi1 =3D sin$1(phi1), cosPhi1 =3D cos$1(phi1), delta =3D lambda1 - lambda0, sign$$1 =3D delta >=3D 0 ? 1 : -1, absDelta =3D sign$$1 * delta, antimeridian =3D absDelta > pi$3, k =3D sinPhi0 * sinPhi1; sum$1.add(atan2(k * sign$$1 * sin$1(absDelta), cosPhi0 * cosPhi1 + k = * cos$1(absDelta))); angle +=3D antimeridian ? delta + sign$$1 * tau$3 : delta; // Are the longitudes either side of the point=E2=80=99s meridian (la= mbda), // and are the latitudes smaller than the parallel (phi)? if (antimeridian ^ lambda0 >=3D lambda ^ lambda1 >=3D lambda) { var arc =3D cartesianCross(cartesian(point0), cartesian(point1)); cartesianNormalizeInPlace(arc); var intersection =3D cartesianCross(normal, arc); cartesianNormalizeInPlace(intersection); var phiArc =3D (antimeridian ^ delta >=3D 0 ? -1 : 1) * asin(inters= ection[2]); if (phi > phiArc || phi =3D=3D=3D phiArc && (arc[0] || arc[1])) { winding +=3D antimeridian ^ delta >=3D 0 ? 1 : -1; } } } } // First, determine whether the South pole is inside or outside: // // It is inside if: // * the polygon winds around it in a clockwise direction. // * the polygon does not (cumulatively) wind around it, but has a negati= ve // (counter-clockwise) area. // // Second, count the (signed) number of times a segment crosses a lambda // from the point to the South pole. If it is zero, then the point is the // same side as the South pole. return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ = (winding & 1); } function clip(pointVisible, clipLine, interpolate, start) { return function(sink) { var line =3D clipLine(sink), ringBuffer =3D clipBuffer(), ringSink =3D clipLine(ringBuffer), polygonStarted =3D false, polygon, segments, ring; var clip =3D { point: point, lineStart: lineStart, lineEnd: lineEnd, polygonStart: function() { clip.point =3D pointRing; clip.lineStart =3D ringStart; clip.lineEnd =3D ringEnd; segments =3D []; polygon =3D []; }, polygonEnd: function() { clip.point =3D point; clip.lineStart =3D lineStart; clip.lineEnd =3D lineEnd; segments =3D merge(segments); var startInside =3D polygonContains(polygon, start); if (segments.length) { if (!polygonStarted) sink.polygonStart(), polygonStarted =3D true; clipRejoin(segments, compareIntersection, startInside, interpolat= e, sink); } else if (startInside) { if (!polygonStarted) sink.polygonStart(), polygonStarted =3D true; sink.lineStart(); interpolate(null, null, 1, sink); sink.lineEnd(); } if (polygonStarted) sink.polygonEnd(), polygonStarted =3D false; segments =3D polygon =3D null; }, sphere: function() { sink.polygonStart(); sink.lineStart(); interpolate(null, null, 1, sink); sink.lineEnd(); sink.polygonEnd(); } }; function point(lambda, phi) { if (pointVisible(lambda, phi)) sink.point(lambda, phi); } function pointLine(lambda, phi) { line.point(lambda, phi); } function lineStart() { clip.point =3D pointLine; line.lineStart(); } function lineEnd() { clip.point =3D point; line.lineEnd(); } function pointRing(lambda, phi) { ring.push([lambda, phi]); ringSink.point(lambda, phi); } function ringStart() { ringSink.lineStart(); ring =3D []; } function ringEnd() { pointRing(ring[0][0], ring[0][1]); ringSink.lineEnd(); var clean =3D ringSink.clean(), ringSegments =3D ringBuffer.result(), i, n =3D ringSegments.length, m, segment, point; ring.pop(); polygon.push(ring); ring =3D null; if (!n) return; // No intersections. if (clean & 1) { segment =3D ringSegments[0]; if ((m =3D segment.length - 1) > 0) { if (!polygonStarted) sink.polygonStart(), polygonStarted =3D true; sink.lineStart(); for (i =3D 0; i < m; ++i) sink.point((point =3D segment[i])[0], p= oint[1]); sink.lineEnd(); } return; } // Rejoin connected segments. // TODO reuse ringBuffer.rejoin()? if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(r= ingSegments.shift())); segments.push(ringSegments.filter(validSegment)); } return clip; }; } function validSegment(segment) { return segment.length > 1; } // Intersections are sorted along the clip edge. For both antimeridian cutt= ing // and circle clipping, the same comparison is used. function compareIntersection(a, b) { return ((a =3D a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1= ]) - ((b =3D b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1= ]); } var clipAntimeridian =3D clip( function() { return true; }, clipAntimeridianLine, clipAntimeridianInterpolate, [-pi$3, -halfPi$2] ); // Takes a line and cuts into visible segments. Return values: 0 - there we= re // intersections or the line was empty; 1 - no intersections; 2 - there were // intersections, and the first and last segments should be rejoined. function clipAntimeridianLine(stream) { var lambda0 =3D NaN, phi0 =3D NaN, sign0 =3D NaN, clean; // no intersections return { lineStart: function() { stream.lineStart(); clean =3D 1; }, point: function(lambda1, phi1) { var sign1 =3D lambda1 > 0 ? pi$3 : -pi$3, delta =3D abs(lambda1 - lambda0); if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole stream.point(lambda0, phi0 =3D (phi0 + phi1) / 2 > 0 ? halfPi$2 : -= halfPi$2); stream.point(sign0, phi0); stream.lineEnd(); stream.lineStart(); stream.point(sign1, phi0); stream.point(lambda1, phi0); clean =3D 0; } else if (sign0 !=3D=3D sign1 && delta >=3D pi$3) { // line crosses = antimeridian if (abs(lambda0 - sign0) < epsilon$2) lambda0 -=3D sign0 * epsilon$= 2; // handle degeneracies if (abs(lambda1 - sign1) < epsilon$2) lambda1 -=3D sign1 * epsilon$= 2; phi0 =3D clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); stream.point(sign0, phi0); stream.lineEnd(); stream.lineStart(); stream.point(sign1, phi0); clean =3D 0; } stream.point(lambda0 =3D lambda1, phi0 =3D phi1); sign0 =3D sign1; }, lineEnd: function() { stream.lineEnd(); lambda0 =3D phi0 =3D NaN; }, clean: function() { return 2 - clean; // if intersections, rejoin first and last segments } }; } function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { var cosPhi0, cosPhi1, sinLambda0Lambda1 =3D sin$1(lambda0 - lambda1); return abs(sinLambda0Lambda1) > epsilon$2 ? atan((sin$1(phi0) * (cosPhi1 =3D cos$1(phi1)) * sin$1(lambda1) - sin$1(phi1) * (cosPhi0 =3D cos$1(phi0)) * sin$1(lambda0)) / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) : (phi0 + phi1) / 2; } function clipAntimeridianInterpolate(from, to, direction, stream) { var phi; if (from =3D=3D null) { phi =3D direction * halfPi$2; stream.point(-pi$3, phi); stream.point(0, phi); stream.point(pi$3, phi); stream.point(pi$3, 0); stream.point(pi$3, -phi); stream.point(0, -phi); stream.point(-pi$3, -phi); stream.point(-pi$3, 0); stream.point(-pi$3, phi); } else if (abs(from[0] - to[0]) > epsilon$2) { var lambda =3D from[0] < to[0] ? pi$3 : -pi$3; phi =3D direction * lambda / 2; stream.point(-lambda, phi); stream.point(0, phi); stream.point(lambda, phi); } else { stream.point(to[0], to[1]); } } function clipCircle(radius) { var cr =3D cos$1(radius), delta =3D 6 * radians, smallRadius =3D cr > 0, notHemisphere =3D abs(cr) > epsilon$2; // TODO optimise for this comm= on case function interpolate(from, to, direction, stream) { circleStream(stream, radius, delta, direction, from, to); } function visible(lambda, phi) { return cos$1(lambda) * cos$1(phi) > cr; } // Takes a line and cuts into visible segments. Return values used for po= lygon // clipping: 0 - there were intersections or the line was empty; 1 - no // intersections 2 - there were intersections, and the first and last seg= ments // should be rejoined. function clipLine(stream) { var point0, // previous point c0, // code for previous point v0, // visibility of previous point v00, // visibility of first point clean; // no intersections return { lineStart: function() { v00 =3D v0 =3D false; clean =3D 1; }, point: function(lambda, phi) { var point1 =3D [lambda, phi], point2, v =3D visible(lambda, phi), c =3D smallRadius ? v ? 0 : code(lambda, phi) : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0; if (!point0 && (v00 =3D v0 =3D v)) stream.lineStart(); // Handle degeneracies. // TODO ignore if not clipping polygons. if (v !=3D=3D v0) { point2 =3D intersect(point0, point1); if (!point2 || pointEqual(point0, point2) || pointEqual(point1, p= oint2)) { point1[0] +=3D epsilon$2; point1[1] +=3D epsilon$2; v =3D visible(point1[0], point1[1]); } } if (v !=3D=3D v0) { clean =3D 0; if (v) { // outside going in stream.lineStart(); point2 =3D intersect(point1, point0); stream.point(point2[0], point2[1]); } else { // inside going out point2 =3D intersect(point0, point1); stream.point(point2[0], point2[1]); stream.lineEnd(); } point0 =3D point2; } else if (notHemisphere && point0 && smallRadius ^ v) { var t; // If the codes for two points are different, or are both zero, // and there this segment intersects with the small circle. if (!(c & c0) && (t =3D intersect(point1, point0, true))) { clean =3D 0; if (smallRadius) { stream.lineStart(); stream.point(t[0][0], t[0][1]); stream.point(t[1][0], t[1][1]); stream.lineEnd(); } else { stream.point(t[1][0], t[1][1]); stream.lineEnd(); stream.lineStart(); stream.point(t[0][0], t[0][1]); } } } if (v && (!point0 || !pointEqual(point0, point1))) { stream.point(point1[0], point1[1]); } point0 =3D point1, v0 =3D v, c0 =3D c; }, lineEnd: function() { if (v0) stream.lineEnd(); point0 =3D null; }, // Rejoin first and last segments if there were intersections and the= first // and last points were visible. clean: function() { return clean | ((v00 && v0) << 1); } }; } // Intersects the great circle between a and b with the clip circle. function intersect(a, b, two) { var pa =3D cartesian(a), pb =3D cartesian(b); // We have two planes, n1.p =3D d1 and n2.p =3D d2. // Find intersection line p(t) =3D c1 n1 + c2 n2 + t (n1 =E2=A8=AF n2). var n1 =3D [1, 0, 0], // normal n2 =3D cartesianCross(pa, pb), n2n2 =3D cartesianDot(n2, n2), n1n2 =3D n2[0], // cartesianDot(n1, n2), determinant =3D n2n2 - n1n2 * n1n2; // Two polar points. if (!determinant) return !two && a; var c1 =3D cr * n2n2 / determinant, c2 =3D -cr * n1n2 / determinant, n1xn2 =3D cartesianCross(n1, n2), A =3D cartesianScale(n1, c1), B =3D cartesianScale(n2, c2); cartesianAddInPlace(A, B); // Solve |p(t)|^2 =3D 1. var u =3D n1xn2, w =3D cartesianDot(A, u), uu =3D cartesianDot(u, u), t2 =3D w * w - uu * (cartesianDot(A, A) - 1); if (t2 < 0) return; var t =3D sqrt(t2), q =3D cartesianScale(u, (-w - t) / uu); cartesianAddInPlace(q, A); q =3D spherical(q); if (!two) return q; // Two intersection points. var lambda0 =3D a[0], lambda1 =3D b[0], phi0 =3D a[1], phi1 =3D b[1], z; if (lambda1 < lambda0) z =3D lambda0, lambda0 =3D lambda1, lambda1 =3D = z; var delta =3D lambda1 - lambda0, polar =3D abs(delta - pi$3) < epsilon$2, meridian =3D polar || delta < epsilon$2; if (!polar && phi1 < phi0) z =3D phi0, phi0 =3D phi1, phi1 =3D z; // Check that the first point is between a and b. if (meridian ? polar ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi= 0 : phi1) : phi0 <=3D q[1] && q[1] <=3D phi1 : delta > pi$3 ^ (lambda0 <=3D q[0] && q[0] <=3D lambda1)) { var q1 =3D cartesianScale(u, (-w + t) / uu); cartesianAddInPlace(q1, A); return [q, spherical(q1)]; } } // Generates a 4-bit vector representing the location of a point relative= to // the small circle's bounding box. function code(lambda, phi) { var r =3D smallRadius ? radius : pi$3 - radius, code =3D 0; if (lambda < -r) code |=3D 1; // left else if (lambda > r) code |=3D 2; // right if (phi < -r) code |=3D 4; // below else if (phi > r) code |=3D 8; // above return code; } return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : = [-pi$3, radius - pi$3]); } function clipLine(a, b, x0, y0, x1, y1) { var ax =3D a[0], ay =3D a[1], bx =3D b[0], by =3D b[1], t0 =3D 0, t1 =3D 1, dx =3D bx - ax, dy =3D by - ay, r; r =3D x0 - ax; if (!dx && r > 0) return; r /=3D dx; if (dx < 0) { if (r < t0) return; if (r < t1) t1 =3D r; } else if (dx > 0) { if (r > t1) return; if (r > t0) t0 =3D r; } r =3D x1 - ax; if (!dx && r < 0) return; r /=3D dx; if (dx < 0) { if (r > t1) return; if (r > t0) t0 =3D r; } else if (dx > 0) { if (r < t0) return; if (r < t1) t1 =3D r; } r =3D y0 - ay; if (!dy && r > 0) return; r /=3D dy; if (dy < 0) { if (r < t0) return; if (r < t1) t1 =3D r; } else if (dy > 0) { if (r > t1) return; if (r > t0) t0 =3D r; } r =3D y1 - ay; if (!dy && r < 0) return; r /=3D dy; if (dy < 0) { if (r > t1) return; if (r > t0) t0 =3D r; } else if (dy > 0) { if (r < t0) return; if (r < t1) t1 =3D r; } if (t0 > 0) a[0] =3D ax + t0 * dx, a[1] =3D ay + t0 * dy; if (t1 < 1) b[0] =3D ax + t1 * dx, b[1] =3D ay + t1 * dy; return true; } var clipMax =3D 1e9, clipMin =3D -clipMax; // TODO Use d3-polygon=E2=80=99s polygonContains here for the ring check? // TODO Eliminate duplicate buffering in clipBuffer and polygon.push? function clipRectangle(x0, y0, x1, y1) { function visible(x, y) { return x0 <=3D x && x <=3D x1 && y0 <=3D y && y <=3D y1; } function interpolate(from, to, direction, stream) { var a =3D 0, a1 =3D 0; if (from =3D=3D null || (a =3D corner(from, direction)) !=3D=3D (a1 =3D corner(to, direc= tion)) || comparePoint(from, to) < 0 ^ direction > 0) { do stream.point(a =3D=3D=3D 0 || a =3D=3D=3D 3 ? x0 : x1, a > 1 ? y1 = : y0); while ((a =3D (a + direction + 4) % 4) !=3D=3D a1); } else { stream.point(to[0], to[1]); } } function corner(p, direction) { return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon } function compareIntersection(a, b) { return comparePoint(a.x, b.x); } function comparePoint(a, b) { var ca =3D corner(a, 1), cb =3D corner(b, 1); return ca !=3D=3D cb ? ca - cb : ca =3D=3D=3D 0 ? b[1] - a[1] : ca =3D=3D=3D 1 ? a[0] - b[0] : ca =3D=3D=3D 2 ? a[1] - b[1] : b[0] - a[0]; } return function(stream) { var activeStream =3D stream, bufferStream =3D clipBuffer(), segments, polygon, ring, x__, y__, v__, // first point x_, y_, v_, // previous point first, clean; var clipStream =3D { point: point, lineStart: lineStart, lineEnd: lineEnd, polygonStart: polygonStart, polygonEnd: polygonEnd }; function point(x, y) { if (visible(x, y)) activeStream.point(x, y); } function polygonInside() { var winding =3D 0; for (var i =3D 0, n =3D polygon.length; i < n; ++i) { for (var ring =3D polygon[i], j =3D 1, m =3D ring.length, point =3D= ring[0], a0, a1, b0 =3D point[0], b1 =3D point[1]; j < m; ++j) { a0 =3D b0, a1 =3D b1, point =3D ring[j], b0 =3D point[0], b1 =3D = point[1]; if (a1 <=3D y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1= ) * (x0 - a0)) ++winding; } else { if (b1 <=3D y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 = - a0)) --winding; } } } return winding; } // Buffer geometry within a polygon and then clip it en masse. function polygonStart() { activeStream =3D bufferStream, segments =3D [], polygon =3D [], clean= =3D true; } function polygonEnd() { var startInside =3D polygonInside(), cleanInside =3D clean && startInside, visible =3D (segments =3D merge(segments)).length; if (cleanInside || visible) { stream.polygonStart(); if (cleanInside) { stream.lineStart(); interpolate(null, null, 1, stream); stream.lineEnd(); } if (visible) { clipRejoin(segments, compareIntersection, startInside, interpolat= e, stream); } stream.polygonEnd(); } activeStream =3D stream, segments =3D polygon =3D ring =3D null; } function lineStart() { clipStream.point =3D linePoint; if (polygon) polygon.push(ring =3D []); first =3D true; v_ =3D false; x_ =3D y_ =3D NaN; } // TODO rather than special-case polygons, simply handle them separatel= y. // Ideally, coincident intersection points should be jittered to avoid // clipping issues. function lineEnd() { if (segments) { linePoint(x__, y__); if (v__ && v_) bufferStream.rejoin(); segments.push(bufferStream.result()); } clipStream.point =3D point; if (v_) activeStream.lineEnd(); } function linePoint(x, y) { var v =3D visible(x, y); if (polygon) ring.push([x, y]); if (first) { x__ =3D x, y__ =3D y, v__ =3D v; first =3D false; if (v) { activeStream.lineStart(); activeStream.point(x, y); } } else { if (v && v_) activeStream.point(x, y); else { var a =3D [x_ =3D Math.max(clipMin, Math.min(clipMax, x_)), y_ = =3D Math.max(clipMin, Math.min(clipMax, y_))], b =3D [x =3D Math.max(clipMin, Math.min(clipMax, x)), y =3D M= ath.max(clipMin, Math.min(clipMax, y))]; if (clipLine(a, b, x0, y0, x1, y1)) { if (!v_) { activeStream.lineStart(); activeStream.point(a[0], a[1]); } activeStream.point(b[0], b[1]); if (!v) activeStream.lineEnd(); clean =3D false; } else if (v) { activeStream.lineStart(); activeStream.point(x, y); clean =3D false; } } } x_ =3D x, y_ =3D y, v_ =3D v; } return clipStream; }; } function extent$1() { var x0 =3D 0, y0 =3D 0, x1 =3D 960, y1 =3D 500, cache, cacheStream, clip; return clip =3D { stream: function(stream) { return cache && cacheStream =3D=3D=3D stream ? cache : cache =3D clip= Rectangle(x0, y0, x1, y1)(cacheStream =3D stream); }, extent: function(_) { return arguments.length ? (x0 =3D +_[0][0], y0 =3D +_[0][1], x1 =3D += _[1][0], y1 =3D +_[1][1], cache =3D cacheStream =3D null, clip) : [[x0, y0]= , [x1, y1]]; } }; } var lengthSum =3D adder(), lambda0$2, sinPhi0$1, cosPhi0$1; var lengthStream =3D { sphere: noop$2, point: noop$2, lineStart: lengthLineStart, lineEnd: noop$2, polygonStart: noop$2, polygonEnd: noop$2 }; function lengthLineStart() { lengthStream.point =3D lengthPointFirst; lengthStream.lineEnd =3D lengthLineEnd; } function lengthLineEnd() { lengthStream.point =3D lengthStream.lineEnd =3D noop$2; } function lengthPointFirst(lambda, phi) { lambda *=3D radians, phi *=3D radians; lambda0$2 =3D lambda, sinPhi0$1 =3D sin$1(phi), cosPhi0$1 =3D cos$1(phi); lengthStream.point =3D lengthPoint; } function lengthPoint(lambda, phi) { lambda *=3D radians, phi *=3D radians; var sinPhi =3D sin$1(phi), cosPhi =3D cos$1(phi), delta =3D abs(lambda - lambda0$2), cosDelta =3D cos$1(delta), sinDelta =3D sin$1(delta), x =3D cosPhi * sinDelta, y =3D cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, z =3D sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; lengthSum.add(atan2(sqrt(x * x + y * y), z)); lambda0$2 =3D lambda, sinPhi0$1 =3D sinPhi, cosPhi0$1 =3D cosPhi; } function length$1(object) { lengthSum.reset(); geoStream(object, lengthStream); return +lengthSum; } var coordinates =3D [null, null], object$1 =3D {type: "LineString", coordinates: coordinates}; function distance(a, b) { coordinates[0] =3D a; coordinates[1] =3D b; return length$1(object$1); } var containsObjectType =3D { Feature: function(object, point) { return containsGeometry(object.geometry, point); }, FeatureCollection: function(object, point) { var features =3D object.features, i =3D -1, n =3D features.length; while (++i < n) if (containsGeometry(features[i].geometry, point)) retu= rn true; return false; } }; var containsGeometryType =3D { Sphere: function() { return true; }, Point: function(object, point) { return containsPoint(object.coordinates, point); }, MultiPoint: function(object, point) { var coordinates =3D object.coordinates, i =3D -1, n =3D coordinates.len= gth; while (++i < n) if (containsPoint(coordinates[i], point)) return true; return false; }, LineString: function(object, point) { return containsLine(object.coordinates, point); }, MultiLineString: function(object, point) { var coordinates =3D object.coordinates, i =3D -1, n =3D coordinates.len= gth; while (++i < n) if (containsLine(coordinates[i], point)) return true; return false; }, Polygon: function(object, point) { return containsPolygon(object.coordinates, point); }, MultiPolygon: function(object, point) { var coordinates =3D object.coordinates, i =3D -1, n =3D coordinates.len= gth; while (++i < n) if (containsPolygon(coordinates[i], point)) return true; return false; }, GeometryCollection: function(object, point) { var geometries =3D object.geometries, i =3D -1, n =3D geometries.length; while (++i < n) if (containsGeometry(geometries[i], point)) return true; return false; } }; function containsGeometry(geometry, point) { return geometry && containsGeometryType.hasOwnProperty(geometry.type) ? containsGeometryType[geometry.type](geometry, point) : false; } function containsPoint(coordinates, point) { return distance(coordinates, point) =3D=3D=3D 0; } function containsLine(coordinates, point) { var ao, bo, ab; for (var i =3D 0, n =3D coordinates.length; i < n; i++) { bo =3D distance(coordinates[i], point); if (bo =3D=3D=3D 0) return true; if (i > 0) { ab =3D distance(coordinates[i], coordinates[i - 1]); if ( ab > 0 && ao <=3D ab && bo <=3D ab && (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2$1 * ab ) return true; } ao =3D bo; } return false; } function containsPolygon(coordinates, point) { return !!polygonContains(coordinates.map(ringRadians), pointRadians(point= )); } function ringRadians(ring) { return ring =3D ring.map(pointRadians), ring.pop(), ring; } function pointRadians(point) { return [point[0] * radians, point[1] * radians]; } function contains$1(object, point) { return (object && containsObjectType.hasOwnProperty(object.type) ? containsObjectType[object.type] : containsGeometry)(object, point); } function graticuleX(y0, y1, dy) { var y =3D sequence(y0, y1 - epsilon$2, dy).concat(y1); return function(x) { return y.map(function(y) { return [x, y]; }); }; } function graticuleY(x0, x1, dx) { var x =3D sequence(x0, x1 - epsilon$2, dx).concat(x1); return function(y) { return x.map(function(x) { return [x, y]; }); }; } function graticule() { var x1, x0, X1, X0, y1, y0, Y1, Y0, dx =3D 10, dy =3D dx, DX =3D 90, DY =3D 360, x, y, X, Y, precision =3D 2.5; function graticule() { return {type: "MultiLineString", coordinates: lines()}; } function lines() { return sequence(ceil(X0 / DX) * DX, X1, DX).map(X) .concat(sequence(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) .concat(sequence(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { r= eturn abs(x % DX) > epsilon$2; }).map(x)) .concat(sequence(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { r= eturn abs(y % DY) > epsilon$2; }).map(y)); } graticule.lines =3D function() { return lines().map(function(coordinates) { return {type: "LineString", = coordinates: coordinates}; }); }; graticule.outline =3D function() { return { type: "Polygon", coordinates: [ X(X0).concat( Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ] }; }; graticule.extent =3D function(_) { if (!arguments.length) return graticule.extentMinor(); return graticule.extentMajor(_).extentMinor(_); }; graticule.extentMajor =3D function(_) { if (!arguments.length) return [[X0, Y0], [X1, Y1]]; X0 =3D +_[0][0], X1 =3D +_[1][0]; Y0 =3D +_[0][1], Y1 =3D +_[1][1]; if (X0 > X1) _ =3D X0, X0 =3D X1, X1 =3D _; if (Y0 > Y1) _ =3D Y0, Y0 =3D Y1, Y1 =3D _; return graticule.precision(precision); }; graticule.extentMinor =3D function(_) { if (!arguments.length) return [[x0, y0], [x1, y1]]; x0 =3D +_[0][0], x1 =3D +_[1][0]; y0 =3D +_[0][1], y1 =3D +_[1][1]; if (x0 > x1) _ =3D x0, x0 =3D x1, x1 =3D _; if (y0 > y1) _ =3D y0, y0 =3D y1, y1 =3D _; return graticule.precision(precision); }; graticule.step =3D function(_) { if (!arguments.length) return graticule.stepMinor(); return graticule.stepMajor(_).stepMinor(_); }; graticule.stepMajor =3D function(_) { if (!arguments.length) return [DX, DY]; DX =3D +_[0], DY =3D +_[1]; return graticule; }; graticule.stepMinor =3D function(_) { if (!arguments.length) return [dx, dy]; dx =3D +_[0], dy =3D +_[1]; return graticule; }; graticule.precision =3D function(_) { if (!arguments.length) return precision; precision =3D +_; x =3D graticuleX(y0, y1, 90); y =3D graticuleY(x0, x1, precision); X =3D graticuleX(Y0, Y1, 90); Y =3D graticuleY(X0, X1, precision); return graticule; }; return graticule .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]]) .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]); } function graticule10() { return graticule()(); } function interpolate$1(a, b) { var x0 =3D a[0] * radians, y0 =3D a[1] * radians, x1 =3D b[0] * radians, y1 =3D b[1] * radians, cy0 =3D cos$1(y0), sy0 =3D sin$1(y0), cy1 =3D cos$1(y1), sy1 =3D sin$1(y1), kx0 =3D cy0 * cos$1(x0), ky0 =3D cy0 * sin$1(x0), kx1 =3D cy1 * cos$1(x1), ky1 =3D cy1 * sin$1(x1), d =3D 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0)= )), k =3D sin$1(d); var interpolate =3D d ? function(t) { var B =3D sin$1(t *=3D d) / k, A =3D sin$1(d - t) / k, x =3D A * kx0 + B * kx1, y =3D A * ky0 + B * ky1, z =3D A * sy0 + B * sy1; return [ atan2(y, x) * degrees$1, atan2(z, sqrt(x * x + y * y)) * degrees$1 ]; } : function() { return [x0 * degrees$1, y0 * degrees$1]; }; interpolate.distance =3D d; return interpolate; } function identity$4(x) { return x; } var areaSum$1 =3D adder(), areaRingSum$1 =3D adder(), x00, y00, x0$1, y0$1; var areaStream$1 =3D { point: noop$2, lineStart: noop$2, lineEnd: noop$2, polygonStart: function() { areaStream$1.lineStart =3D areaRingStart$1; areaStream$1.lineEnd =3D areaRingEnd$1; }, polygonEnd: function() { areaStream$1.lineStart =3D areaStream$1.lineEnd =3D areaStream$1.point = =3D noop$2; areaSum$1.add(abs(areaRingSum$1)); areaRingSum$1.reset(); }, result: function() { var area =3D areaSum$1 / 2; areaSum$1.reset(); return area; } }; function areaRingStart$1() { areaStream$1.point =3D areaPointFirst$1; } function areaPointFirst$1(x, y) { areaStream$1.point =3D areaPoint$1; x00 =3D x0$1 =3D x, y00 =3D y0$1 =3D y; } function areaPoint$1(x, y) { areaRingSum$1.add(y0$1 * x - x0$1 * y); x0$1 =3D x, y0$1 =3D y; } function areaRingEnd$1() { areaPoint$1(x00, y00); } var x0$2 =3D Infinity, y0$2 =3D x0$2, x1 =3D -x0$2, y1 =3D x1; var boundsStream$1 =3D { point: boundsPoint$1, lineStart: noop$2, lineEnd: noop$2, polygonStart: noop$2, polygonEnd: noop$2, result: function() { var bounds =3D [[x0$2, y0$2], [x1, y1]]; x1 =3D y1 =3D -(y0$2 =3D x0$2 =3D Infinity); return bounds; } }; function boundsPoint$1(x, y) { if (x < x0$2) x0$2 =3D x; if (x > x1) x1 =3D x; if (y < y0$2) y0$2 =3D y; if (y > y1) y1 =3D y; } // TODO Enforce positive area for exterior, negative area for interior? var X0$1 =3D 0, Y0$1 =3D 0, Z0$1 =3D 0, X1$1 =3D 0, Y1$1 =3D 0, Z1$1 =3D 0, X2$1 =3D 0, Y2$1 =3D 0, Z2$1 =3D 0, x00$1, y00$1, x0$3, y0$3; var centroidStream$1 =3D { point: centroidPoint$1, lineStart: centroidLineStart$1, lineEnd: centroidLineEnd$1, polygonStart: function() { centroidStream$1.lineStart =3D centroidRingStart$1; centroidStream$1.lineEnd =3D centroidRingEnd$1; }, polygonEnd: function() { centroidStream$1.point =3D centroidPoint$1; centroidStream$1.lineStart =3D centroidLineStart$1; centroidStream$1.lineEnd =3D centroidLineEnd$1; }, result: function() { var centroid =3D Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] : [NaN, NaN]; X0$1 =3D Y0$1 =3D Z0$1 =3D X1$1 =3D Y1$1 =3D Z1$1 =3D X2$1 =3D Y2$1 =3D Z2$1 =3D 0; return centroid; } }; function centroidPoint$1(x, y) { X0$1 +=3D x; Y0$1 +=3D y; ++Z0$1; } function centroidLineStart$1() { centroidStream$1.point =3D centroidPointFirstLine; } function centroidPointFirstLine(x, y) { centroidStream$1.point =3D centroidPointLine; centroidPoint$1(x0$3 =3D x, y0$3 =3D y); } function centroidPointLine(x, y) { var dx =3D x - x0$3, dy =3D y - y0$3, z =3D sqrt(dx * dx + dy * dy); X1$1 +=3D z * (x0$3 + x) / 2; Y1$1 +=3D z * (y0$3 + y) / 2; Z1$1 +=3D z; centroidPoint$1(x0$3 =3D x, y0$3 =3D y); } function centroidLineEnd$1() { centroidStream$1.point =3D centroidPoint$1; } function centroidRingStart$1() { centroidStream$1.point =3D centroidPointFirstRing; } function centroidRingEnd$1() { centroidPointRing(x00$1, y00$1); } function centroidPointFirstRing(x, y) { centroidStream$1.point =3D centroidPointRing; centroidPoint$1(x00$1 =3D x0$3 =3D x, y00$1 =3D y0$3 =3D y); } function centroidPointRing(x, y) { var dx =3D x - x0$3, dy =3D y - y0$3, z =3D sqrt(dx * dx + dy * dy); X1$1 +=3D z * (x0$3 + x) / 2; Y1$1 +=3D z * (y0$3 + y) / 2; Z1$1 +=3D z; z =3D y0$3 * x - x0$3 * y; X2$1 +=3D z * (x0$3 + x); Y2$1 +=3D z * (y0$3 + y); Z2$1 +=3D z * 3; centroidPoint$1(x0$3 =3D x, y0$3 =3D y); } function PathContext(context) { this._context =3D context; } PathContext.prototype =3D { _radius: 4.5, pointRadius: function(_) { return this._radius =3D _, this; }, polygonStart: function() { this._line =3D 0; }, polygonEnd: function() { this._line =3D NaN; }, lineStart: function() { this._point =3D 0; }, lineEnd: function() { if (this._line =3D=3D=3D 0) this._context.closePath(); this._point =3D NaN; }, point: function(x, y) { switch (this._point) { case 0: { this._context.moveTo(x, y); this._point =3D 1; break; } case 1: { this._context.lineTo(x, y); break; } default: { this._context.moveTo(x + this._radius, y); this._context.arc(x, y, this._radius, 0, tau$3); break; } } }, result: noop$2 }; var lengthSum$1 =3D adder(), lengthRing, x00$2, y00$2, x0$4, y0$4; var lengthStream$1 =3D { point: noop$2, lineStart: function() { lengthStream$1.point =3D lengthPointFirst$1; }, lineEnd: function() { if (lengthRing) lengthPoint$1(x00$2, y00$2); lengthStream$1.point =3D noop$2; }, polygonStart: function() { lengthRing =3D true; }, polygonEnd: function() { lengthRing =3D null; }, result: function() { var length =3D +lengthSum$1; lengthSum$1.reset(); return length; } }; function lengthPointFirst$1(x, y) { lengthStream$1.point =3D lengthPoint$1; x00$2 =3D x0$4 =3D x, y00$2 =3D y0$4 =3D y; } function lengthPoint$1(x, y) { x0$4 -=3D x, y0$4 -=3D y; lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); x0$4 =3D x, y0$4 =3D y; } function PathString() { this._string =3D []; } PathString.prototype =3D { _radius: 4.5, _circle: circle$1(4.5), pointRadius: function(_) { if ((_ =3D +_) !=3D=3D this._radius) this._radius =3D _, this._circle = =3D null; return this; }, polygonStart: function() { this._line =3D 0; }, polygonEnd: function() { this._line =3D NaN; }, lineStart: function() { this._point =3D 0; }, lineEnd: function() { if (this._line =3D=3D=3D 0) this._string.push("Z"); this._point =3D NaN; }, point: function(x, y) { switch (this._point) { case 0: { this._string.push("M", x, ",", y); this._point =3D 1; break; } case 1: { this._string.push("L", x, ",", y); break; } default: { if (this._circle =3D=3D null) this._circle =3D circle$1(this._radiu= s); this._string.push("M", x, ",", y, this._circle); break; } } }, result: function() { if (this._string.length) { var result =3D this._string.join(""); this._string =3D []; return result; } else { return null; } } }; function circle$1(radius) { return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z"; } function index$1(projection, context) { var pointRadius =3D 4.5, projectionStream, contextStream; function path(object) { if (object) { if (typeof pointRadius =3D=3D=3D "function") contextStream.pointRadiu= s(+pointRadius.apply(this, arguments)); geoStream(object, projectionStream(contextStream)); } return contextStream.result(); } path.area =3D function(object) { geoStream(object, projectionStream(areaStream$1)); return areaStream$1.result(); }; path.measure =3D function(object) { geoStream(object, projectionStream(lengthStream$1)); return lengthStream$1.result(); }; path.bounds =3D function(object) { geoStream(object, projectionStream(boundsStream$1)); return boundsStream$1.result(); }; path.centroid =3D function(object) { geoStream(object, projectionStream(centroidStream$1)); return centroidStream$1.result(); }; path.projection =3D function(_) { return arguments.length ? (projectionStream =3D _ =3D=3D null ? (projec= tion =3D null, identity$4) : (projection =3D _).stream, path) : projection; }; path.context =3D function(_) { if (!arguments.length) return context; contextStream =3D _ =3D=3D null ? (context =3D null, new PathString) : = new PathContext(context =3D _); if (typeof pointRadius !=3D=3D "function") contextStream.pointRadius(po= intRadius); return path; }; path.pointRadius =3D function(_) { if (!arguments.length) return pointRadius; pointRadius =3D typeof _ =3D=3D=3D "function" ? _ : (contextStream.poin= tRadius(+_), +_); return path; }; return path.projection(projection).context(context); } function transform(methods) { return { stream: transformer(methods) }; } function transformer(methods) { return function(stream) { var s =3D new TransformStream; for (var key in methods) s[key] =3D methods[key]; s.stream =3D stream; return s; }; } function TransformStream() {} TransformStream.prototype =3D { constructor: TransformStream, point: function(x, y) { this.stream.point(x, y); }, sphere: function() { this.stream.sphere(); }, lineStart: function() { this.stream.lineStart(); }, lineEnd: function() { this.stream.lineEnd(); }, polygonStart: function() { this.stream.polygonStart(); }, polygonEnd: function() { this.stream.polygonEnd(); } }; function fit(projection, fitBounds, object) { var clip =3D projection.clipExtent && projection.clipExtent(); projection.scale(150).translate([0, 0]); if (clip !=3D null) projection.clipExtent(null); geoStream(object, projection.stream(boundsStream$1)); fitBounds(boundsStream$1.result()); if (clip !=3D null) projection.clipExtent(clip); return projection; } function fitExtent(projection, extent, object) { return fit(projection, function(b) { var w =3D extent[1][0] - extent[0][0], h =3D extent[1][1] - extent[0][1], k =3D Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), x =3D +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, y =3D +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; projection.scale(150 * k).translate([x, y]); }, object); } function fitSize(projection, size, object) { return fitExtent(projection, [[0, 0], size], object); } function fitWidth(projection, width, object) { return fit(projection, function(b) { var w =3D +width, k =3D w / (b[1][0] - b[0][0]), x =3D (w - k * (b[1][0] + b[0][0])) / 2, y =3D -k * b[0][1]; projection.scale(150 * k).translate([x, y]); }, object); } function fitHeight(projection, height, object) { return fit(projection, function(b) { var h =3D +height, k =3D h / (b[1][1] - b[0][1]), x =3D -k * b[0][0], y =3D (h - k * (b[1][1] + b[0][1])) / 2; projection.scale(150 * k).translate([x, y]); }, object); } var maxDepth =3D 16, // maximum depth of subdivision cosMinDistance =3D cos$1(30 * radians); // cos(minimum angular distance) function resample(project, delta2) { return +delta2 ? resample$1(project, delta2) : resampleNone(project); } function resampleNone(project) { return transformer({ point: function(x, y) { x =3D project(x, y); this.stream.point(x[0], x[1]); } }); } function resample$1(project, delta2) { function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1,= b1, c1, depth, stream) { var dx =3D x1 - x0, dy =3D y1 - y0, d2 =3D dx * dx + dy * dy; if (d2 > 4 * delta2 && depth--) { var a =3D a0 + a1, b =3D b0 + b1, c =3D c0 + c1, m =3D sqrt(a * a + b * b + c * c), phi2 =3D asin(c /=3D m), lambda2 =3D abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1)= < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a), p =3D project(lambda2, phi2), x2 =3D p[0], y2 =3D p[1], dx2 =3D x2 - x0, dy2 =3D y2 - y0, dz =3D dy * dx2 - dx * dy2; if (dz * dz / d2 > delta2 // perpendicular projected distance || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close = to an end || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular dis= tance resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /=3D= m, b /=3D m, c, depth, stream); stream.point(x2, y2); resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c= 1, depth, stream); } } } return function(stream) { var lambda00, x00, y00, a00, b00, c00, // first point lambda0, x0, y0, a0, b0, c0; // previous point var resampleStream =3D { point: point, lineStart: lineStart, lineEnd: lineEnd, polygonStart: function() { stream.polygonStart(); resampleStream.line= Start =3D ringStart; }, polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStar= t =3D lineStart; } }; function point(x, y) { x =3D project(x, y); stream.point(x[0], x[1]); } function lineStart() { x0 =3D NaN; resampleStream.point =3D linePoint; stream.lineStart(); } function linePoint(lambda, phi) { var c =3D cartesian([lambda, phi]), p =3D project(lambda, phi); resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 =3D p[0], y0 =3D p[1],= lambda0 =3D lambda, a0 =3D c[0], b0 =3D c[1], c0 =3D c[2], maxDepth, strea= m); stream.point(x0, y0); } function lineEnd() { resampleStream.point =3D point; stream.lineEnd(); } function ringStart() { lineStart(); resampleStream.point =3D ringPoint; resampleStream.lineEnd =3D ringEnd; } function ringPoint(lambda, phi) { linePoint(lambda00 =3D lambda, phi), x00 =3D x0, y00 =3D y0, a00 =3D = a0, b00 =3D b0, c00 =3D c0; resampleStream.point =3D linePoint; } function ringEnd() { resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, = b00, c00, maxDepth, stream); resampleStream.lineEnd =3D lineEnd; lineEnd(); } return resampleStream; }; } var transformRadians =3D transformer({ point: function(x, y) { this.stream.point(x * radians, y * radians); } }); function transformRotate(rotate) { return transformer({ point: function(x, y) { var r =3D rotate(x, y); return this.stream.point(r[0], r[1]); } }); } function scaleTranslate(k, dx, dy) { function transform$$1(x, y) { return [dx + k * x, dy - k * y]; } transform$$1.invert =3D function(x, y) { return [(x - dx) / k, (dy - y) / k]; }; return transform$$1; } function scaleTranslateRotate(k, dx, dy, alpha) { var cosAlpha =3D cos$1(alpha), sinAlpha =3D sin$1(alpha), a =3D cosAlpha * k, b =3D sinAlpha * k, ai =3D cosAlpha / k, bi =3D sinAlpha / k, ci =3D (sinAlpha * dy - cosAlpha * dx) / k, fi =3D (sinAlpha * dx + cosAlpha * dy) / k; function transform$$1(x, y) { return [a * x - b * y + dx, dy - b * x - a * y]; } transform$$1.invert =3D function(x, y) { return [ai * x - bi * y + ci, fi - bi * x - ai * y]; }; return transform$$1; } function projection(project) { return projectionMutator(function() { return project; })(); } function projectionMutator(projectAt) { var project, k =3D 150, // scale x =3D 480, y =3D 250, // translate lambda =3D 0, phi =3D 0, // center deltaLambda =3D 0, deltaPhi =3D 0, deltaGamma =3D 0, rotate, // pre-r= otate alpha =3D 0, // post-rotate theta =3D null, preclip =3D clipAntimeridian, // pre-clip angle x0 =3D null, y0, x1, y1, postclip =3D identity$4, // post-clip extent delta2 =3D 0.5, // precision projectResample, projectTransform, projectRotateTransform, cache, cacheStream; function projection(point) { return projectRotateTransform(point[0] * radians, point[1] * radians); } function invert(point) { point =3D projectRotateTransform.invert(point[0], point[1]); return point && [point[0] * degrees$1, point[1] * degrees$1]; } projection.stream =3D function(stream) { return cache && cacheStream =3D=3D=3D stream ? cache : cache =3D transf= ormRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheSt= ream =3D stream))))); }; projection.preclip =3D function(_) { return arguments.length ? (preclip =3D _, theta =3D undefined, reset())= : preclip; }; projection.postclip =3D function(_) { return arguments.length ? (postclip =3D _, x0 =3D y0 =3D x1 =3D y1 =3D = null, reset()) : postclip; }; projection.clipAngle =3D function(_) { return arguments.length ? (preclip =3D +_ ? clipCircle(theta =3D _ * ra= dians) : (theta =3D null, clipAntimeridian), reset()) : theta * degrees$1; }; projection.clipExtent =3D function(_) { return arguments.length ? (postclip =3D _ =3D=3D null ? (x0 =3D y0 =3D = x1 =3D y1 =3D null, identity$4) : clipRectangle(x0 =3D +_[0][0], y0 =3D +_[= 0][1], x1 =3D +_[1][0], y1 =3D +_[1][1]), reset()) : x0 =3D=3D null ? null = : [[x0, y0], [x1, y1]]; }; projection.scale =3D function(_) { return arguments.length ? (k =3D +_, recenter()) : k; }; projection.translate =3D function(_) { return arguments.length ? (x =3D +_[0], y =3D +_[1], recenter()) : [x, = y]; }; projection.center =3D function(_) { return arguments.length ? (lambda =3D _[0] % 360 * radians, phi =3D _[1= ] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1]; }; projection.rotate =3D function(_) { return arguments.length ? (deltaLambda =3D _[0] % 360 * radians, deltaP= hi =3D _[1] % 360 * radians, deltaGamma =3D _.length > 2 ? _[2] % 360 * rad= ians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, del= taGamma * degrees$1]; }; projection.angle =3D function(_) { return arguments.length ? (alpha =3D _ % 360 * radians, recenter()) : a= lpha * degrees$1; }; projection.precision =3D function(_) { return arguments.length ? (projectResample =3D resample(projectTransfor= m, delta2 =3D _ * _), reset()) : sqrt(delta2); }; projection.fitExtent =3D function(extent, object) { return fitExtent(projection, extent, object); }; projection.fitSize =3D function(size, object) { return fitSize(projection, size, object); }; projection.fitWidth =3D function(width, object) { return fitWidth(projection, width, object); }; projection.fitHeight =3D function(height, object) { return fitHeight(projection, height, object); }; function recenter() { var center =3D scaleTranslateRotate(k, 0, 0, alpha).apply(null, project= (lambda, phi)), transform$$1 =3D (alpha ? scaleTranslateRotate : scaleTranslate)(k,= x - center[0], y - center[1], alpha); rotate =3D rotateRadians(deltaLambda, deltaPhi, deltaGamma); projectTransform =3D compose(project, transform$$1); projectRotateTransform =3D compose(rotate, projectTransform); projectResample =3D resample(projectTransform, delta2); return reset(); } function reset() { cache =3D cacheStream =3D null; return projection; } return function() { project =3D projectAt.apply(this, arguments); projection.invert =3D project.invert && invert; return recenter(); }; } function conicProjection(projectAt) { var phi0 =3D 0, phi1 =3D pi$3 / 3, m =3D projectionMutator(projectAt), p =3D m(phi0, phi1); p.parallels =3D function(_) { return arguments.length ? m(phi0 =3D _[0] * radians, phi1 =3D _[1] * ra= dians) : [phi0 * degrees$1, phi1 * degrees$1]; }; return p; } function cylindricalEqualAreaRaw(phi0) { var cosPhi0 =3D cos$1(phi0); function forward(lambda, phi) { return [lambda * cosPhi0, sin$1(phi) / cosPhi0]; } forward.invert =3D function(x, y) { return [x / cosPhi0, asin(y * cosPhi0)]; }; return forward; } function conicEqualAreaRaw(y0, y1) { var sy0 =3D sin$1(y0), n =3D (sy0 + sin$1(y1)) / 2; // Are the parallels symmetrical around the Equator? if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0); var c =3D 1 + sy0 * (2 * n - sy0), r0 =3D sqrt(c) / n; function project(x, y) { var r =3D sqrt(c - 2 * n * sin$1(y)) / n; return [r * sin$1(x *=3D n), r0 - r * cos$1(x)]; } project.invert =3D function(x, y) { var r0y =3D r0 - y; return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0= y) * n * n) / (2 * n))]; }; return project; } function conicEqualArea() { return conicProjection(conicEqualAreaRaw) .scale(155.424) .center([0, 33.6442]); } function albers() { return conicEqualArea() .parallels([29.5, 45.5]) .scale(1070) .translate([480, 250]) .rotate([96, 0]) .center([-0.6, 38.7]); } // The projections must have mutually exclusive clip regions on the sphere, // as this will avoid emitting interleaving lines and polygons. function multiplex(streams) { var n =3D streams.length; return { point: function(x, y) { var i =3D -1; while (++i < n) streams[i].point(= x, y); }, sphere: function() { var i =3D -1; while (++i < n) streams[i].sphere();= }, lineStart: function() { var i =3D -1; while (++i < n) streams[i].lineSt= art(); }, lineEnd: function() { var i =3D -1; while (++i < n) streams[i].lineEnd(= ); }, polygonStart: function() { var i =3D -1; while (++i < n) streams[i].pol= ygonStart(); }, polygonEnd: function() { var i =3D -1; while (++i < n) streams[i].polyg= onEnd(); } }; } // A composite projection for the United States, configured by default for // 960=C3=97500. The projection also works quite well at 960=C3=97600 if yo= u change the // scale to 1285 and adjust the translate accordingly. The set of standard // parallels for each region comes from USGS, which is published here: // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers function albersUsa() { var cache, cacheStream, lower48 =3D albers(), lower48Point, alaska =3D conicEqualArea().rotate([154, 0]).center([-2, 58.5]).paral= lels([55, 65]), alaskaPoint, // EPSG:3338 hawaii =3D conicEqualArea().rotate([157, 0]).center([-3, 19.9]).paral= lels([8, 18]), hawaiiPoint, // ESRI:102007 point, pointStream =3D {point: function(x, y) { point =3D [x, y]; }}; function albersUsa(coordinates) { var x =3D coordinates[0], y =3D coordinates[1]; return point =3D null, (lower48Point.point(x, y), point) || (alaskaPoint.point(x, y), point) || (hawaiiPoint.point(x, y), point); } albersUsa.invert =3D function(coordinates) { var k =3D lower48.scale(), t =3D lower48.translate(), x =3D (coordinates[0] - t[0]) / k, y =3D (coordinates[1] - t[1]) / k; return (y >=3D 0.120 && y < 0.234 && x >=3D -0.425 && x < -0.214 ? alas= ka : y >=3D 0.166 && y < 0.234 && x >=3D -0.214 && x < -0.115 ? hawaii : lower48).invert(coordinates); }; albersUsa.stream =3D function(stream) { return cache && cacheStream =3D=3D=3D stream ? cache : cache =3D multip= lex([lower48.stream(cacheStream =3D stream), alaska.stream(stream), hawaii.= stream(stream)]); }; albersUsa.precision =3D function(_) { if (!arguments.length) return lower48.precision(); lower48.precision(_), alaska.precision(_), hawaii.precision(_); return reset(); }; albersUsa.scale =3D function(_) { if (!arguments.length) return lower48.scale(); lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); return albersUsa.translate(lower48.translate()); }; albersUsa.translate =3D function(_) { if (!arguments.length) return lower48.translate(); var k =3D lower48.scale(), x =3D +_[0], y =3D +_[1]; lower48Point =3D lower48 .translate(_) .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.= 238 * k]]) .stream(pointStream); alaskaPoint =3D alaska .translate([x - 0.307 * k, y + 0.201 * k]) .clipExtent([[x - 0.425 * k + epsilon$2, y + 0.120 * k + epsilon$2]= , [x - 0.214 * k - epsilon$2, y + 0.234 * k - epsilon$2]]) .stream(pointStream); hawaiiPoint =3D hawaii .translate([x - 0.205 * k, y + 0.212 * k]) .clipExtent([[x - 0.214 * k + epsilon$2, y + 0.166 * k + epsilon$2]= , [x - 0.115 * k - epsilon$2, y + 0.234 * k - epsilon$2]]) .stream(pointStream); return reset(); }; albersUsa.fitExtent =3D function(extent, object) { return fitExtent(albersUsa, extent, object); }; albersUsa.fitSize =3D function(size, object) { return fitSize(albersUsa, size, object); }; albersUsa.fitWidth =3D function(width, object) { return fitWidth(albersUsa, width, object); }; albersUsa.fitHeight =3D function(height, object) { return fitHeight(albersUsa, height, object); }; function reset() { cache =3D cacheStream =3D null; return albersUsa; } return albersUsa.scale(1070); } function azimuthalRaw(scale) { return function(x, y) { var cx =3D cos$1(x), cy =3D cos$1(y), k =3D scale(cx * cy); return [ k * cy * sin$1(x), k * sin$1(y) ]; } } function azimuthalInvert(angle) { return function(x, y) { var z =3D sqrt(x * x + y * y), c =3D angle(z), sc =3D sin$1(c), cc =3D cos$1(c); return [ atan2(x * sc, z * cc), asin(z && y * sc / z) ]; } } var azimuthalEqualAreaRaw =3D azimuthalRaw(function(cxcy) { return sqrt(2 / (1 + cxcy)); }); azimuthalEqualAreaRaw.invert =3D azimuthalInvert(function(z) { return 2 * asin(z / 2); }); function azimuthalEqualArea() { return projection(azimuthalEqualAreaRaw) .scale(124.75) .clipAngle(180 - 1e-3); } var azimuthalEquidistantRaw =3D azimuthalRaw(function(c) { return (c =3D acos(c)) && c / sin$1(c); }); azimuthalEquidistantRaw.invert =3D azimuthalInvert(function(z) { return z; }); function azimuthalEquidistant() { return projection(azimuthalEquidistantRaw) .scale(79.4188) .clipAngle(180 - 1e-3); } function mercatorRaw(lambda, phi) { return [lambda, log(tan((halfPi$2 + phi) / 2))]; } mercatorRaw.invert =3D function(x, y) { return [x, 2 * atan(exp(y)) - halfPi$2]; }; function mercator() { return mercatorProjection(mercatorRaw) .scale(961 / tau$3); } function mercatorProjection(project) { var m =3D projection(project), center =3D m.center, scale =3D m.scale, translate =3D m.translate, clipExtent =3D m.clipExtent, x0 =3D null, y0, x1, y1; // clip extent m.scale =3D function(_) { return arguments.length ? (scale(_), reclip()) : scale(); }; m.translate =3D function(_) { return arguments.length ? (translate(_), reclip()) : translate(); }; m.center =3D function(_) { return arguments.length ? (center(_), reclip()) : center(); }; m.clipExtent =3D function(_) { return arguments.length ? ((_ =3D=3D null ? x0 =3D y0 =3D x1 =3D y1 =3D= null : (x0 =3D +_[0][0], y0 =3D +_[0][1], x1 =3D +_[1][0], y1 =3D +_[1][1]= )), reclip()) : x0 =3D=3D null ? null : [[x0, y0], [x1, y1]]; }; function reclip() { var k =3D pi$3 * scale(), t =3D m(rotation(m.rotate()).invert([0, 0])); return clipExtent(x0 =3D=3D null ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project =3D=3D=3D = mercatorRaw ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); } return reclip(); } function tany(y) { return tan((halfPi$2 + y) / 2); } function conicConformalRaw(y0, y1) { var cy0 =3D cos$1(y0), n =3D y0 =3D=3D=3D y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y= 1) / tany(y0)), f =3D cy0 * pow(tany(y0), n) / n; if (!n) return mercatorRaw; function project(x, y) { if (f > 0) { if (y < -halfPi$2 + epsilon$2) y =3D -halfPi$2 + epsilon$2= ; } else { if (y > halfPi$2 - epsilon$2) y =3D halfPi$2 - epsilon$2; } var r =3D f / pow(tany(y), n); return [r * sin$1(n * x), f - r * cos$1(n * x)]; } project.invert =3D function(x, y) { var fy =3D f - y, r =3D sign(n) * sqrt(x * x + fy * fy); return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) -= halfPi$2]; }; return project; } function conicConformal() { return conicProjection(conicConformalRaw) .scale(109.5) .parallels([30, 30]); } function equirectangularRaw(lambda, phi) { return [lambda, phi]; } equirectangularRaw.invert =3D equirectangularRaw; function equirectangular() { return projection(equirectangularRaw) .scale(152.63); } function conicEquidistantRaw(y0, y1) { var cy0 =3D cos$1(y0), n =3D y0 =3D=3D=3D y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0), g =3D cy0 / n + y0; if (abs(n) < epsilon$2) return equirectangularRaw; function project(x, y) { var gy =3D g - y, nx =3D n * x; return [gy * sin$1(nx), g - gy * cos$1(nx)]; } project.invert =3D function(x, y) { var gy =3D g - y; return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy= * gy)]; }; return project; } function conicEquidistant() { return conicProjection(conicEquidistantRaw) .scale(131.154) .center([0, 13.9389]); } var A1 =3D 1.340264, A2 =3D -0.081106, A3 =3D 0.000893, A4 =3D 0.003796, M =3D sqrt(3) / 2, iterations =3D 12; function equalEarthRaw(lambda, phi) { var l =3D asin(M * sin$1(phi)), l2 =3D l * l, l6 =3D l2 * l2 * l2; return [ lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2= ))), l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) ]; } equalEarthRaw.invert =3D function(x, y) { var l =3D y, l2 =3D l * l, l6 =3D l2 * l2 * l2; for (var i =3D 0, delta, fy, fpy; i < iterations; ++i) { fy =3D l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; fpy =3D A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); l -=3D delta =3D fy / fpy, l2 =3D l * l, l6 =3D l2 * l2 * l2; if (abs(delta) < epsilon2$1) break; } return [ M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l), asin(sin$1(l) / M) ]; }; function equalEarth() { return projection(equalEarthRaw) .scale(177.158); } function gnomonicRaw(x, y) { var cy =3D cos$1(y), k =3D cos$1(x) * cy; return [cy * sin$1(x) / k, sin$1(y) / k]; } gnomonicRaw.invert =3D azimuthalInvert(atan); function gnomonic() { return projection(gnomonicRaw) .scale(144.049) .clipAngle(60); } function scaleTranslate$1(kx, ky, tx, ty) { return kx =3D=3D=3D 1 && ky =3D=3D=3D 1 && tx =3D=3D=3D 0 && ty =3D=3D=3D= 0 ? identity$4 : transformer({ point: function(x, y) { this.stream.point(x * kx + tx, y * ky + ty); } }); } function identity$5() { var k =3D 1, tx =3D 0, ty =3D 0, sx =3D 1, sy =3D 1, transform$$1 =3D ide= ntity$4, // scale, translate and reflect x0 =3D null, y0, x1, y1, // clip extent postclip =3D identity$4, cache, cacheStream, projection; function reset() { cache =3D cacheStream =3D null; return projection; } return projection =3D { stream: function(stream) { return cache && cacheStream =3D=3D=3D stream ? cache : cache =3D tran= sform$$1(postclip(cacheStream =3D stream)); }, postclip: function(_) { return arguments.length ? (postclip =3D _, x0 =3D y0 =3D x1 =3D y1 = =3D null, reset()) : postclip; }, clipExtent: function(_) { return arguments.length ? (postclip =3D _ =3D=3D null ? (x0 =3D y0 = =3D x1 =3D y1 =3D null, identity$4) : clipRectangle(x0 =3D +_[0][0], y0 =3D= +_[0][1], x1 =3D +_[1][0], y1 =3D +_[1][1]), reset()) : x0 =3D=3D null ? n= ull : [[x0, y0], [x1, y1]]; }, scale: function(_) { return arguments.length ? (transform$$1 =3D scaleTranslate$1((k =3D += _) * sx, k * sy, tx, ty), reset()) : k; }, translate: function(_) { return arguments.length ? (transform$$1 =3D scaleTranslate$1(k * sx, = k * sy, tx =3D +_[0], ty =3D +_[1]), reset()) : [tx, ty]; }, reflectX: function(_) { return arguments.length ? (transform$$1 =3D scaleTranslate$1(k * (sx = =3D _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0; }, reflectY: function(_) { return arguments.length ? (transform$$1 =3D scaleTranslate$1(k * sx, = k * (sy =3D _ ? -1 : 1), tx, ty), reset()) : sy < 0; }, fitExtent: function(extent, object) { return fitExtent(projection, extent, object); }, fitSize: function(size, object) { return fitSize(projection, size, object); }, fitWidth: function(width, object) { return fitWidth(projection, width, object); }, fitHeight: function(height, object) { return fitHeight(projection, height, object); } }; } function naturalEarth1Raw(lambda, phi) { var phi2 =3D phi * phi, phi4 =3D phi2 * phi2; return [ lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.0039= 71 * phi2 - 0.001529 * phi4))), phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi= 2 - 0.005916 * phi4))) ]; } naturalEarth1Raw.invert =3D function(x, y) { var phi =3D y, i =3D 25, delta; do { var phi2 =3D phi * phi, phi4 =3D phi2 * phi2; phi -=3D delta =3D (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044= 475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874= * 9 * phi2 - 0.005916 * 11 * phi4))); } while (abs(delta) > epsilon$2 && --i > 0); return [ x / (0.8707 + (phi2 =3D phi * phi) * (-0.131979 + phi2 * (-0.013791 + p= hi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), phi ]; }; function naturalEarth1() { return projection(naturalEarth1Raw) .scale(175.295); } function orthographicRaw(x, y) { return [cos$1(y) * sin$1(x), sin$1(y)]; } orthographicRaw.invert =3D azimuthalInvert(asin); function orthographic() { return projection(orthographicRaw) .scale(249.5) .clipAngle(90 + epsilon$2); } function stereographicRaw(x, y) { var cy =3D cos$1(y), k =3D 1 + cos$1(x) * cy; return [cy * sin$1(x) / k, sin$1(y) / k]; } stereographicRaw.invert =3D azimuthalInvert(function(z) { return 2 * atan(z); }); function stereographic() { return projection(stereographicRaw) .scale(250) .clipAngle(142); } function transverseMercatorRaw(lambda, phi) { return [log(tan((halfPi$2 + phi) / 2)), -lambda]; } transverseMercatorRaw.invert =3D function(x, y) { return [-y, 2 * atan(exp(x)) - halfPi$2]; }; function transverseMercator() { var m =3D mercatorProjection(transverseMercatorRaw), center =3D m.center, rotate =3D m.rotate; m.center =3D function(_) { return arguments.length ? center([-_[1], _[0]]) : (_ =3D center(), [_[1= ], -_[0]]); }; m.rotate =3D function(_) { return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 = : 90]) : (_ =3D rotate(), [_[0], _[1], _[2] - 90]); }; return rotate([0, 0, 90]) .scale(159.155); } function defaultSeparation(a, b) { return a.parent =3D=3D=3D b.parent ? 1 : 2; } function meanX(children) { return children.reduce(meanXReduce, 0) / children.length; } function meanXReduce(x, c) { return x + c.x; } function maxY(children) { return 1 + children.reduce(maxYReduce, 0); } function maxYReduce(y, c) { return Math.max(y, c.y); } function leafLeft(node) { var children; while (children =3D node.children) node =3D children[0]; return node; } function leafRight(node) { var children; while (children =3D node.children) node =3D children[children.length - 1]; return node; } function cluster() { var separation =3D defaultSeparation, dx =3D 1, dy =3D 1, nodeSize =3D false; function cluster(root) { var previousNode, x =3D 0; // First walk, computing the initial x & y values. root.eachAfter(function(node) { var children =3D node.children; if (children) { node.x =3D meanX(children); node.y =3D maxY(children); } else { node.x =3D previousNode ? x +=3D separation(node, previousNode) : 0; node.y =3D 0; previousNode =3D node; } }); var left =3D leafLeft(root), right =3D leafRight(root), x0 =3D left.x - separation(left, right) / 2, x1 =3D right.x + separation(right, left) / 2; // Second walk, normalizing x & y to the desired size. return root.eachAfter(nodeSize ? function(node) { node.x =3D (node.x - root.x) * dx; node.y =3D (root.y - node.y) * dy; } : function(node) { node.x =3D (node.x - x0) / (x1 - x0) * dx; node.y =3D (1 - (root.y ? node.y / root.y : 1)) * dy; }); } cluster.separation =3D function(x) { return arguments.length ? (separation =3D x, cluster) : separation; }; cluster.size =3D function(x) { return arguments.length ? (nodeSize =3D false, dx =3D +x[0], dy =3D +x[= 1], cluster) : (nodeSize ? null : [dx, dy]); }; cluster.nodeSize =3D function(x) { return arguments.length ? (nodeSize =3D true, dx =3D +x[0], dy =3D +x[1= ], cluster) : (nodeSize ? [dx, dy] : null); }; return cluster; } function count(node) { var sum =3D 0, children =3D node.children, i =3D children && children.length; if (!i) sum =3D 1; else while (--i >=3D 0) sum +=3D children[i].value; node.value =3D sum; } function node_count() { return this.eachAfter(count); } function node_each(callback) { var node =3D this, current, next =3D [node], children, i, n; do { current =3D next.reverse(), next =3D []; while (node =3D current.pop()) { callback(node), children =3D node.children; if (children) for (i =3D 0, n =3D children.length; i < n; ++i) { next.push(children[i]); } } } while (next.length); return this; } function node_eachBefore(callback) { var node =3D this, nodes =3D [node], children, i; while (node =3D nodes.pop()) { callback(node), children =3D node.children; if (children) for (i =3D children.length - 1; i >=3D 0; --i) { nodes.push(children[i]); } } return this; } function node_eachAfter(callback) { var node =3D this, nodes =3D [node], next =3D [], children, i, n; while (node =3D nodes.pop()) { next.push(node), children =3D node.children; if (children) for (i =3D 0, n =3D children.length; i < n; ++i) { nodes.push(children[i]); } } while (node =3D next.pop()) { callback(node); } return this; } function node_sum(value) { return this.eachAfter(function(node) { var sum =3D +value(node.data) || 0, children =3D node.children, i =3D children && children.length; while (--i >=3D 0) sum +=3D children[i].value; node.value =3D sum; }); } function node_sort(compare) { return this.eachBefore(function(node) { if (node.children) { node.children.sort(compare); } }); } function node_path(end) { var start =3D this, ancestor =3D leastCommonAncestor(start, end), nodes =3D [start]; while (start !=3D=3D ancestor) { start =3D start.parent; nodes.push(start); } var k =3D nodes.length; while (end !=3D=3D ancestor) { nodes.splice(k, 0, end); end =3D end.parent; } return nodes; } function leastCommonAncestor(a, b) { if (a =3D=3D=3D b) return a; var aNodes =3D a.ancestors(), bNodes =3D b.ancestors(), c =3D null; a =3D aNodes.pop(); b =3D bNodes.pop(); while (a =3D=3D=3D b) { c =3D a; a =3D aNodes.pop(); b =3D bNodes.pop(); } return c; } function node_ancestors() { var node =3D this, nodes =3D [node]; while (node =3D node.parent) { nodes.push(node); } return nodes; } function node_descendants() { var nodes =3D []; this.each(function(node) { nodes.push(node); }); return nodes; } function node_leaves() { var leaves =3D []; this.eachBefore(function(node) { if (!node.children) { leaves.push(node); } }); return leaves; } function node_links() { var root =3D this, links =3D []; root.each(function(node) { if (node !=3D=3D root) { // Don=E2=80=99t include the root=E2=80=99s pa= rent, if any. links.push({source: node.parent, target: node}); } }); return links; } function hierarchy(data, children) { var root =3D new Node(data), valued =3D +data.value && (root.value =3D data.value), node, nodes =3D [root], child, childs, i, n; if (children =3D=3D null) children =3D defaultChildren; while (node =3D nodes.pop()) { if (valued) node.value =3D +node.data.value; if ((childs =3D children(node.data)) && (n =3D childs.length)) { node.children =3D new Array(n); for (i =3D n - 1; i >=3D 0; --i) { nodes.push(child =3D node.children[i] =3D new Node(childs[i])); child.parent =3D node; child.depth =3D node.depth + 1; } } } return root.eachBefore(computeHeight); } function node_copy() { return hierarchy(this).eachBefore(copyData); } function defaultChildren(d) { return d.children; } function copyData(node) { node.data =3D node.data.data; } function computeHeight(node) { var height =3D 0; do node.height =3D height; while ((node =3D node.parent) && (node.height < ++height)); } function Node(data) { this.data =3D data; this.depth =3D this.height =3D 0; this.parent =3D null; } Node.prototype =3D hierarchy.prototype =3D { constructor: Node, count: node_count, each: node_each, eachAfter: node_eachAfter, eachBefore: node_eachBefore, sum: node_sum, sort: node_sort, path: node_path, ancestors: node_ancestors, descendants: node_descendants, leaves: node_leaves, links: node_links, copy: node_copy }; var slice$4 =3D Array.prototype.slice; function shuffle$1(array) { var m =3D array.length, t, i; while (m) { i =3D Math.random() * m-- | 0; t =3D array[m]; array[m] =3D array[i]; array[i] =3D t; } return array; } function enclose(circles) { var i =3D 0, n =3D (circles =3D shuffle$1(slice$4.call(circles))).length,= B =3D [], p, e; while (i < n) { p =3D circles[i]; if (e && enclosesWeak(e, p)) ++i; else e =3D encloseBasis(B =3D extendBasis(B, p)), i =3D 0; } return e; } function extendBasis(B, p) { var i, j; if (enclosesWeakAll(p, B)) return [p]; // If we get here then B must have at least one element. for (i =3D 0; i < B.length; ++i) { if (enclosesNot(p, B[i]) && enclosesWeakAll(encloseBasis2(B[i], p), B)) { return [B[i], p]; } } // If we get here then B must have at least two elements. for (i =3D 0; i < B.length - 1; ++i) { for (j =3D i + 1; j < B.length; ++j) { if (enclosesNot(encloseBasis2(B[i], B[j]), p) && enclosesNot(encloseBasis2(B[i], p), B[j]) && enclosesNot(encloseBasis2(B[j], p), B[i]) && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { return [B[i], B[j], p]; } } } // If we get here then something is very wrong. throw new Error; } function enclosesNot(a, b) { var dr =3D a.r - b.r, dx =3D b.x - a.x, dy =3D b.y - a.y; return dr < 0 || dr * dr < dx * dx + dy * dy; } function enclosesWeak(a, b) { var dr =3D a.r - b.r + 1e-6, dx =3D b.x - a.x, dy =3D b.y - a.y; return dr > 0 && dr * dr > dx * dx + dy * dy; } function enclosesWeakAll(a, B) { for (var i =3D 0; i < B.length; ++i) { if (!enclosesWeak(a, B[i])) { return false; } } return true; } function encloseBasis(B) { switch (B.length) { case 1: return encloseBasis1(B[0]); case 2: return encloseBasis2(B[0], B[1]); case 3: return encloseBasis3(B[0], B[1], B[2]); } } function encloseBasis1(a) { return { x: a.x, y: a.y, r: a.r }; } function encloseBasis2(a, b) { var x1 =3D a.x, y1 =3D a.y, r1 =3D a.r, x2 =3D b.x, y2 =3D b.y, r2 =3D b.r, x21 =3D x2 - x1, y21 =3D y2 - y1, r21 =3D r2 - r1, l =3D Math.sqrt(x21 * x21 + y21 * y21); return { x: (x1 + x2 + x21 / l * r21) / 2, y: (y1 + y2 + y21 / l * r21) / 2, r: (l + r1 + r2) / 2 }; } function encloseBasis3(a, b, c) { var x1 =3D a.x, y1 =3D a.y, r1 =3D a.r, x2 =3D b.x, y2 =3D b.y, r2 =3D b.r, x3 =3D c.x, y3 =3D c.y, r3 =3D c.r, a2 =3D x1 - x2, a3 =3D x1 - x3, b2 =3D y1 - y2, b3 =3D y1 - y3, c2 =3D r2 - r1, c3 =3D r3 - r1, d1 =3D x1 * x1 + y1 * y1 - r1 * r1, d2 =3D d1 - x2 * x2 - y2 * y2 + r2 * r2, d3 =3D d1 - x3 * x3 - y3 * y3 + r3 * r3, ab =3D a3 * b2 - a2 * b3, xa =3D (b2 * d3 - b3 * d2) / (ab * 2) - x1, xb =3D (b3 * c2 - b2 * c3) / ab, ya =3D (a3 * d2 - a2 * d3) / (ab * 2) - y1, yb =3D (a2 * c3 - a3 * c2) / ab, A =3D xb * xb + yb * yb - 1, B =3D 2 * (r1 + xa * xb + ya * yb), C =3D xa * xa + ya * ya - r1 * r1, r =3D -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); return { x: x1 + xa + xb * r, y: y1 + ya + yb * r, r: r }; } function place(b, a, c) { var dx =3D b.x - a.x, x, a2, dy =3D b.y - a.y, y, b2, d2 =3D dx * dx + dy * dy; if (d2) { a2 =3D a.r + c.r, a2 *=3D a2; b2 =3D b.r + c.r, b2 *=3D b2; if (a2 > b2) { x =3D (d2 + b2 - a2) / (2 * d2); y =3D Math.sqrt(Math.max(0, b2 / d2 - x * x)); c.x =3D b.x - x * dx - y * dy; c.y =3D b.y - x * dy + y * dx; } else { x =3D (d2 + a2 - b2) / (2 * d2); y =3D Math.sqrt(Math.max(0, a2 / d2 - x * x)); c.x =3D a.x + x * dx - y * dy; c.y =3D a.y + x * dy + y * dx; } } else { c.x =3D a.x + c.r; c.y =3D a.y; } } function intersects(a, b) { var dr =3D a.r + b.r - 1e-6, dx =3D b.x - a.x, dy =3D b.y - a.y; return dr > 0 && dr * dr > dx * dx + dy * dy; } function score(node) { var a =3D node._, b =3D node.next._, ab =3D a.r + b.r, dx =3D (a.x * b.r + b.x * a.r) / ab, dy =3D (a.y * b.r + b.y * a.r) / ab; return dx * dx + dy * dy; } function Node$1(circle) { this._ =3D circle; this.next =3D null; this.previous =3D null; } function packEnclose(circles) { if (!(n =3D circles.length)) return 0; var a, b, c, n, aa, ca, i, j, k, sj, sk; // Place the first circle. a =3D circles[0], a.x =3D 0, a.y =3D 0; if (!(n > 1)) return a.r; // Place the second circle. b =3D circles[1], a.x =3D -b.r, b.x =3D a.r, b.y =3D 0; if (!(n > 2)) return a.r + b.r; // Place the third circle. place(b, a, c =3D circles[2]); // Initialize the front-chain using the first three circles a, b and c. a =3D new Node$1(a), b =3D new Node$1(b), c =3D new Node$1(c); a.next =3D c.previous =3D b; b.next =3D a.previous =3D c; c.next =3D b.previous =3D a; // Attempt to place each remaining circle=E2=80=A6 pack: for (i =3D 3; i < n; ++i) { place(a._, b._, c =3D circles[i]), c =3D new Node$1(c); // Find the closest intersecting circle on the front-chain, if any. // =E2=80=9CCloseness=E2=80=9D is determined by linear distance along t= he front-chain. // =E2=80=9CAhead=E2=80=9D or =E2=80=9Cbehind=E2=80=9D is likewise dete= rmined by linear distance. j =3D b.next, k =3D a.previous, sj =3D b._.r, sk =3D a._.r; do { if (sj <=3D sk) { if (intersects(j._, c._)) { b =3D j, a.next =3D b, b.previous =3D a, --i; continue pack; } sj +=3D j._.r, j =3D j.next; } else { if (intersects(k._, c._)) { a =3D k, a.next =3D b, b.previous =3D a, --i; continue pack; } sk +=3D k._.r, k =3D k.previous; } } while (j !=3D=3D k.next); // Success! Insert the new circle c between a and b. c.previous =3D a, c.next =3D b, a.next =3D b.previous =3D b =3D c; // Compute the new closest circle pair to the centroid. aa =3D score(a); while ((c =3D c.next) !=3D=3D b) { if ((ca =3D score(c)) < aa) { a =3D c, aa =3D ca; } } b =3D a.next; } // Compute the enclosing circle of the front chain. a =3D [b._], c =3D b; while ((c =3D c.next) !=3D=3D b) a.push(c._); c =3D= enclose(a); // Translate the circles to put the enclosing circle around the origin. for (i =3D 0; i < n; ++i) a =3D circles[i], a.x -=3D c.x, a.y -=3D c.y; return c.r; } function siblings(circles) { packEnclose(circles); return circles; } function optional(f) { return f =3D=3D null ? null : required(f); } function required(f) { if (typeof f !=3D=3D "function") throw new Error; return f; } function constantZero() { return 0; } function constant$9(x) { return function() { return x; }; } function defaultRadius$1(d) { return Math.sqrt(d.value); } function index$2() { var radius =3D null, dx =3D 1, dy =3D 1, padding =3D constantZero; function pack(root) { root.x =3D dx / 2, root.y =3D dy / 2; if (radius) { root.eachBefore(radiusLeaf(radius)) .eachAfter(packChildren(padding, 0.5)) .eachBefore(translateChild(1)); } else { root.eachBefore(radiusLeaf(defaultRadius$1)) .eachAfter(packChildren(constantZero, 1)) .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); } return root; } pack.radius =3D function(x) { return arguments.length ? (radius =3D optional(x), pack) : radius; }; pack.size =3D function(x) { return arguments.length ? (dx =3D +x[0], dy =3D +x[1], pack) : [dx, dy]; }; pack.padding =3D function(x) { return arguments.length ? (padding =3D typeof x =3D=3D=3D "function" ? = x : constant$9(+x), pack) : padding; }; return pack; } function radiusLeaf(radius) { return function(node) { if (!node.children) { node.r =3D Math.max(0, +radius(node) || 0); } }; } function packChildren(padding, k) { return function(node) { if (children =3D node.children) { var children, i, n =3D children.length, r =3D padding(node) * k || 0, e; if (r) for (i =3D 0; i < n; ++i) children[i].r +=3D r; e =3D packEnclose(children); if (r) for (i =3D 0; i < n; ++i) children[i].r -=3D r; node.r =3D e + r; } }; } function translateChild(k) { return function(node) { var parent =3D node.parent; node.r *=3D k; if (parent) { node.x =3D parent.x + k * node.x; node.y =3D parent.y + k * node.y; } }; } function roundNode(node) { node.x0 =3D Math.round(node.x0); node.y0 =3D Math.round(node.y0); node.x1 =3D Math.round(node.x1); node.y1 =3D Math.round(node.y1); } function treemapDice(parent, x0, y0, x1, y1) { var nodes =3D parent.children, node, i =3D -1, n =3D nodes.length, k =3D parent.value && (x1 - x0) / parent.value; while (++i < n) { node =3D nodes[i], node.y0 =3D y0, node.y1 =3D y1; node.x0 =3D x0, node.x1 =3D x0 +=3D node.value * k; } } function partition() { var dx =3D 1, dy =3D 1, padding =3D 0, round =3D false; function partition(root) { var n =3D root.height + 1; root.x0 =3D root.y0 =3D padding; root.x1 =3D dx; root.y1 =3D dy / n; root.eachBefore(positionNode(dy, n)); if (round) root.eachBefore(roundNode); return root; } function positionNode(dy, n) { return function(node) { if (node.children) { treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy *= (node.depth + 2) / n); } var x0 =3D node.x0, y0 =3D node.y0, x1 =3D node.x1 - padding, y1 =3D node.y1 - padding; if (x1 < x0) x0 =3D x1 =3D (x0 + x1) / 2; if (y1 < y0) y0 =3D y1 =3D (y0 + y1) / 2; node.x0 =3D x0; node.y0 =3D y0; node.x1 =3D x1; node.y1 =3D y1; }; } partition.round =3D function(x) { return arguments.length ? (round =3D !!x, partition) : round; }; partition.size =3D function(x) { return arguments.length ? (dx =3D +x[0], dy =3D +x[1], partition) : [dx= , dy]; }; partition.padding =3D function(x) { return arguments.length ? (padding =3D +x, partition) : padding; }; return partition; } var keyPrefix$1 =3D "$", // Protect against keys like =E2=80=9C__proto__=E2= =80=9D. preroot =3D {depth: -1}, ambiguous =3D {}; function defaultId(d) { return d.id; } function defaultParentId(d) { return d.parentId; } function stratify() { var id =3D defaultId, parentId =3D defaultParentId; function stratify(data) { var d, i, n =3D data.length, root, parent, node, nodes =3D new Array(n), nodeId, nodeKey, nodeByKey =3D {}; for (i =3D 0; i < n; ++i) { d =3D data[i], node =3D nodes[i] =3D new Node(d); if ((nodeId =3D id(d, i, data)) !=3D null && (nodeId +=3D "")) { nodeKey =3D keyPrefix$1 + (node.id =3D nodeId); nodeByKey[nodeKey] =3D nodeKey in nodeByKey ? ambiguous : node; } } for (i =3D 0; i < n; ++i) { node =3D nodes[i], nodeId =3D parentId(data[i], i, data); if (nodeId =3D=3D null || !(nodeId +=3D "")) { if (root) throw new Error("multiple roots"); root =3D node; } else { parent =3D nodeByKey[keyPrefix$1 + nodeId]; if (!parent) throw new Error("missing: " + nodeId); if (parent =3D=3D=3D ambiguous) throw new Error("ambiguous: " + nod= eId); if (parent.children) parent.children.push(node); else parent.children =3D [node]; node.parent =3D parent; } } if (!root) throw new Error("no root"); root.parent =3D preroot; root.eachBefore(function(node) { node.depth =3D node.parent.depth + 1; = --n; }).eachBefore(computeHeight); root.parent =3D null; if (n > 0) throw new Error("cycle"); return root; } stratify.id =3D function(x) { return arguments.length ? (id =3D required(x), stratify) : id; }; stratify.parentId =3D function(x) { return arguments.length ? (parentId =3D required(x), stratify) : parent= Id; }; return stratify; } function defaultSeparation$1(a, b) { return a.parent =3D=3D=3D b.parent ? 1 : 2; } // function radialSeparation(a, b) { // return (a.parent =3D=3D=3D b.parent ? 1 : 2) / a.depth; // } // This function is used to traverse the left contour of a subtree (or // subforest). It returns the successor of v on this contour. This successo= r is // either given by the leftmost child of v or by the thread of v. The funct= ion // returns null if and only if v is on the highest level of its subtree. function nextLeft(v) { var children =3D v.children; return children ? children[0] : v.t; } // This function works analogously to nextLeft. function nextRight(v) { var children =3D v.children; return children ? children[children.length - 1] : v.t; } // Shifts the current subtree rooted at w+. This is done by increasing // prelim(w+) and mod(w+) by shift. function moveSubtree(wm, wp, shift) { var change =3D shift / (wp.i - wm.i); wp.c -=3D change; wp.s +=3D shift; wm.c +=3D change; wp.z +=3D shift; wp.m +=3D shift; } // All other shifts, applied to the smaller subtrees between w- and w+, are // performed by this function. To prepare the shifts, we have to adjust // change(w+), shift(w+), and change(w-). function executeShifts(v) { var shift =3D 0, change =3D 0, children =3D v.children, i =3D children.length, w; while (--i >=3D 0) { w =3D children[i]; w.z +=3D shift; w.m +=3D shift; shift +=3D w.s + (change +=3D w.c); } } // If vi-=E2=80=99s ancestor is a sibling of v, returns vi-=E2=80=99s ances= tor. Otherwise, // returns the specified (default) ancestor. function nextAncestor(vim, v, ancestor) { return vim.a.parent =3D=3D=3D v.parent ? vim.a : ancestor; } function TreeNode(node, i) { this._ =3D node; this.parent =3D null; this.children =3D null; this.A =3D null; // default ancestor this.a =3D this; // ancestor this.z =3D 0; // prelim this.m =3D 0; // mod this.c =3D 0; // change this.s =3D 0; // shift this.t =3D null; // thread this.i =3D i; // number } TreeNode.prototype =3D Object.create(Node.prototype); function treeRoot(root) { var tree =3D new TreeNode(root, 0), node, nodes =3D [tree], child, children, i, n; while (node =3D nodes.pop()) { if (children =3D node._.children) { node.children =3D new Array(n =3D children.length); for (i =3D n - 1; i >=3D 0; --i) { nodes.push(child =3D node.children[i] =3D new TreeNode(children[i],= i)); child.parent =3D node; } } } (tree.parent =3D new TreeNode(null, 0)).children =3D [tree]; return tree; } // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm function tree() { var separation =3D defaultSeparation$1, dx =3D 1, dy =3D 1, nodeSize =3D null; function tree(root) { var t =3D treeRoot(root); // Compute the layout using Buchheim et al.=E2=80=99s algorithm. t.eachAfter(firstWalk), t.parent.m =3D -t.z; t.eachBefore(secondWalk); // If a fixed node size is specified, scale x and y. if (nodeSize) root.eachBefore(sizeNode); // If a fixed tree size is specified, scale x and y based on the extent. // Compute the left-most, right-most, and depth-most nodes for extents. else { var left =3D root, right =3D root, bottom =3D root; root.eachBefore(function(node) { if (node.x < left.x) left =3D node; if (node.x > right.x) right =3D node; if (node.depth > bottom.depth) bottom =3D node; }); var s =3D left =3D=3D=3D right ? 1 : separation(left, right) / 2, tx =3D s - left.x, kx =3D dx / (right.x + s + tx), ky =3D dy / (bottom.depth || 1); root.eachBefore(function(node) { node.x =3D (node.x + tx) * kx; node.y =3D node.depth * ky; }); } return root; } // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is // applied recursively to the children of v, as well as the function // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, t= he // node v is placed to the midpoint of its outermost children. function firstWalk(v) { var children =3D v.children, siblings =3D v.parent.children, w =3D v.i ? siblings[v.i - 1] : null; if (children) { executeShifts(v); var midpoint =3D (children[0].z + children[children.length - 1].z) / = 2; if (w) { v.z =3D w.z + separation(v._, w._); v.m =3D v.z - midpoint; } else { v.z =3D midpoint; } } else if (w) { v.z =3D w.z + separation(v._, w._); } v.parent.A =3D apportion(v, w, v.parent.A || siblings[0]); } // Computes all real x-coordinates by summing up the modifiers recursivel= y. function secondWalk(v) { v._.x =3D v.z + v.parent.m; v.m +=3D v.parent.m; } // The core of the algorithm. Here, a new subtree is combined with the // previous subtrees. Threads are used to traverse the inside and outside // contours of the left and right subtree up to the highest common level.= The // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the // superscript o means outside and i means inside, the subscript - means = left // subtree and + means right subtree. For summing up the modifiers along = the // contour, we use respective variables si+, si-, so-, and so+. Whenever = two // nodes of the inside contours conflict, we compute the left one of the // greatest uncommon ancestors using the function ANCESTOR and call MOVE // SUBTREE to shift the subtree and prepare the shifts of smaller subtree= s. // Finally, we add a new thread (if necessary). function apportion(v, w, ancestor) { if (w) { var vip =3D v, vop =3D v, vim =3D w, vom =3D vip.parent.children[0], sip =3D vip.m, sop =3D vop.m, sim =3D vim.m, som =3D vom.m, shift; while (vim =3D nextRight(vim), vip =3D nextLeft(vip), vim && vip) { vom =3D nextLeft(vom); vop =3D nextRight(vop); vop.a =3D v; shift =3D vim.z + sim - vip.z - sip + separation(vim._, vip._); if (shift > 0) { moveSubtree(nextAncestor(vim, v, ancestor), v, shift); sip +=3D shift; sop +=3D shift; } sim +=3D vim.m; sip +=3D vip.m; som +=3D vom.m; sop +=3D vop.m; } if (vim && !nextRight(vop)) { vop.t =3D vim; vop.m +=3D sim - sop; } if (vip && !nextLeft(vom)) { vom.t =3D vip; vom.m +=3D sip - som; ancestor =3D v; } } return ancestor; } function sizeNode(node) { node.x *=3D dx; node.y =3D node.depth * dy; } tree.separation =3D function(x) { return arguments.length ? (separation =3D x, tree) : separation; }; tree.size =3D function(x) { return arguments.length ? (nodeSize =3D false, dx =3D +x[0], dy =3D +x[= 1], tree) : (nodeSize ? null : [dx, dy]); }; tree.nodeSize =3D function(x) { return arguments.length ? (nodeSize =3D true, dx =3D +x[0], dy =3D +x[1= ], tree) : (nodeSize ? [dx, dy] : null); }; return tree; } function treemapSlice(parent, x0, y0, x1, y1) { var nodes =3D parent.children, node, i =3D -1, n =3D nodes.length, k =3D parent.value && (y1 - y0) / parent.value; while (++i < n) { node =3D nodes[i], node.x0 =3D x0, node.x1 =3D x1; node.y0 =3D y0, node.y1 =3D y0 +=3D node.value * k; } } var phi =3D (1 + Math.sqrt(5)) / 2; function squarifyRatio(ratio, parent, x0, y0, x1, y1) { var rows =3D [], nodes =3D parent.children, row, nodeValue, i0 =3D 0, i1 =3D 0, n =3D nodes.length, dx, dy, value =3D parent.value, sumValue, minValue, maxValue, newRatio, minRatio, alpha, beta; while (i0 < n) { dx =3D x1 - x0, dy =3D y1 - y0; // Find the next non-empty node. do sumValue =3D nodes[i1++].value; while (!sumValue && i1 < n); minValue =3D maxValue =3D sumValue; alpha =3D Math.max(dy / dx, dx / dy) / (value * ratio); beta =3D sumValue * sumValue * alpha; minRatio =3D Math.max(maxValue / beta, beta / minValue); // Keep adding nodes while the aspect ratio maintains or improves. for (; i1 < n; ++i1) { sumValue +=3D nodeValue =3D nodes[i1].value; if (nodeValue < minValue) minValue =3D nodeValue; if (nodeValue > maxValue) maxValue =3D nodeValue; beta =3D sumValue * sumValue * alpha; newRatio =3D Math.max(maxValue / beta, beta / minValue); if (newRatio > minRatio) { sumValue -=3D nodeValue; break; } minRatio =3D newRatio; } // Position and record the row orientation. rows.push(row =3D {value: sumValue, dice: dx < dy, children: nodes.slic= e(i0, i1)}); if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 +=3D dy * sumValu= e / value : y1); else treemapSlice(row, x0, y0, value ? x0 +=3D dx * sumValue / value : = x1, y1); value -=3D sumValue, i0 =3D i1; } return rows; } var squarify =3D (function custom(ratio) { function squarify(parent, x0, y0, x1, y1) { squarifyRatio(ratio, parent, x0, y0, x1, y1); } squarify.ratio =3D function(x) { return custom((x =3D +x) > 1 ? x : 1); }; return squarify; })(phi); function index$3() { var tile =3D squarify, round =3D false, dx =3D 1, dy =3D 1, paddingStack =3D [0], paddingInner =3D constantZero, paddingTop =3D constantZero, paddingRight =3D constantZero, paddingBottom =3D constantZero, paddingLeft =3D constantZero; function treemap(root) { root.x0 =3D root.y0 =3D 0; root.x1 =3D dx; root.y1 =3D dy; root.eachBefore(positionNode); paddingStack =3D [0]; if (round) root.eachBefore(roundNode); return root; } function positionNode(node) { var p =3D paddingStack[node.depth], x0 =3D node.x0 + p, y0 =3D node.y0 + p, x1 =3D node.x1 - p, y1 =3D node.y1 - p; if (x1 < x0) x0 =3D x1 =3D (x0 + x1) / 2; if (y1 < y0) y0 =3D y1 =3D (y0 + y1) / 2; node.x0 =3D x0; node.y0 =3D y0; node.x1 =3D x1; node.y1 =3D y1; if (node.children) { p =3D paddingStack[node.depth + 1] =3D paddingInner(node) / 2; x0 +=3D paddingLeft(node) - p; y0 +=3D paddingTop(node) - p; x1 -=3D paddingRight(node) - p; y1 -=3D paddingBottom(node) - p; if (x1 < x0) x0 =3D x1 =3D (x0 + x1) / 2; if (y1 < y0) y0 =3D y1 =3D (y0 + y1) / 2; tile(node, x0, y0, x1, y1); } } treemap.round =3D function(x) { return arguments.length ? (round =3D !!x, treemap) : round; }; treemap.size =3D function(x) { return arguments.length ? (dx =3D +x[0], dy =3D +x[1], treemap) : [dx, = dy]; }; treemap.tile =3D function(x) { return arguments.length ? (tile =3D required(x), treemap) : tile; }; treemap.padding =3D function(x) { return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : tre= emap.paddingInner(); }; treemap.paddingInner =3D function(x) { return arguments.length ? (paddingInner =3D typeof x =3D=3D=3D "functio= n" ? x : constant$9(+x), treemap) : paddingInner; }; treemap.paddingOuter =3D function(x) { return arguments.length ? treemap.paddingTop(x).paddingRight(x).padding= Bottom(x).paddingLeft(x) : treemap.paddingTop(); }; treemap.paddingTop =3D function(x) { return arguments.length ? (paddingTop =3D typeof x =3D=3D=3D "function"= ? x : constant$9(+x), treemap) : paddingTop; }; treemap.paddingRight =3D function(x) { return arguments.length ? (paddingRight =3D typeof x =3D=3D=3D "functio= n" ? x : constant$9(+x), treemap) : paddingRight; }; treemap.paddingBottom =3D function(x) { return arguments.length ? (paddingBottom =3D typeof x =3D=3D=3D "functi= on" ? x : constant$9(+x), treemap) : paddingBottom; }; treemap.paddingLeft =3D function(x) { return arguments.length ? (paddingLeft =3D typeof x =3D=3D=3D "function= " ? x : constant$9(+x), treemap) : paddingLeft; }; return treemap; } function binary(parent, x0, y0, x1, y1) { var nodes =3D parent.children, i, n =3D nodes.length, sum, sums =3D new Array(n + 1); for (sums[0] =3D sum =3D i =3D 0; i < n; ++i) { sums[i + 1] =3D sum +=3D nodes[i].value; } partition(0, n, parent.value, x0, y0, x1, y1); function partition(i, j, value, x0, y0, x1, y1) { if (i >=3D j - 1) { var node =3D nodes[i]; node.x0 =3D x0, node.y0 =3D y0; node.x1 =3D x1, node.y1 =3D y1; return; } var valueOffset =3D sums[i], valueTarget =3D (value / 2) + valueOffset, k =3D i + 1, hi =3D j - 1; while (k < hi) { var mid =3D k + hi >>> 1; if (sums[mid] < valueTarget) k =3D mid + 1; else hi =3D mid; } if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k)= --k; var valueLeft =3D sums[k] - valueOffset, valueRight =3D value - valueLeft; if ((x1 - x0) > (y1 - y0)) { var xk =3D (x0 * valueRight + x1 * valueLeft) / value; partition(i, k, valueLeft, x0, y0, xk, y1); partition(k, j, valueRight, xk, y0, x1, y1); } else { var yk =3D (y0 * valueRight + y1 * valueLeft) / value; partition(i, k, valueLeft, x0, y0, x1, yk); partition(k, j, valueRight, x0, yk, x1, y1); } } } function sliceDice(parent, x0, y0, x1, y1) { (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); } var resquarify =3D (function custom(ratio) { function resquarify(parent, x0, y0, x1, y1) { if ((rows =3D parent._squarify) && (rows.ratio =3D=3D=3D ratio)) { var rows, row, nodes, i, j =3D -1, n, m =3D rows.length, value =3D parent.value; while (++j < m) { row =3D rows[j], nodes =3D row.children; for (i =3D row.value =3D 0, n =3D nodes.length; i < n; ++i) row.val= ue +=3D nodes[i].value; if (row.dice) treemapDice(row, x0, y0, x1, y0 +=3D (y1 - y0) * row.= value / value); else treemapSlice(row, x0, y0, x0 +=3D (x1 - x0) * row.value / valu= e, y1); value -=3D row.value; } } else { parent._squarify =3D rows =3D squarifyRatio(ratio, parent, x0, y0, x1= , y1); rows.ratio =3D ratio; } } resquarify.ratio =3D function(x) { return custom((x =3D +x) > 1 ? x : 1); }; return resquarify; })(phi); function area$2(polygon) { var i =3D -1, n =3D polygon.length, a, b =3D polygon[n - 1], area =3D 0; while (++i < n) { a =3D b; b =3D polygon[i]; area +=3D a[1] * b[0] - a[0] * b[1]; } return area / 2; } function centroid$1(polygon) { var i =3D -1, n =3D polygon.length, x =3D 0, y =3D 0, a, b =3D polygon[n - 1], c, k =3D 0; while (++i < n) { a =3D b; b =3D polygon[i]; k +=3D c =3D a[0] * b[1] - b[0] * a[1]; x +=3D (a[0] + b[0]) * c; y +=3D (a[1] + b[1]) * c; } return k *=3D 3, [x / k, y / k]; } // Returns the 2D cross product of AB and AC vectors, i.e., the z-component= of // the 3D cross product in a quadrant I Cartesian coordinate system (+x is // right, +y is up). Returns a positive value if ABC is counter-clockwise, // negative if clockwise, and zero if the points are collinear. function cross$1(a, b, c) { return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); } function lexicographicOrder(a, b) { return a[0] - b[0] || a[1] - b[1]; } // Computes the upper convex hull per the monotone chain algorithm. // Assumes points.length >=3D 3, is sorted by x, unique in y. // Returns an array of indices into points in left-to-right order. function computeUpperHullIndexes(points) { var n =3D points.length, indexes =3D [0, 1], size =3D 2; for (var i =3D 2; i < n; ++i) { while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[si= ze - 1]], points[i]) <=3D 0) --size; indexes[size++] =3D i; } return indexes.slice(0, size); // remove popped points } function hull(points) { if ((n =3D points.length) < 3) return null; var i, n, sortedPoints =3D new Array(n), flippedPoints =3D new Array(n); for (i =3D 0; i < n; ++i) sortedPoints[i] =3D [+points[i][0], +points[i][= 1], i]; sortedPoints.sort(lexicographicOrder); for (i =3D 0; i < n; ++i) flippedPoints[i] =3D [sortedPoints[i][0], -sort= edPoints[i][1]]; var upperIndexes =3D computeUpperHullIndexes(sortedPoints), lowerIndexes =3D computeUpperHullIndexes(flippedPoints); // Construct the hull polygon, removing possible duplicate endpoints. var skipLeft =3D lowerIndexes[0] =3D=3D=3D upperIndexes[0], skipRight =3D lowerIndexes[lowerIndexes.length - 1] =3D=3D=3D upperIn= dexes[upperIndexes.length - 1], hull =3D []; // Add upper hull in right-to-l order. // Then add lower hull in left-to-right order. for (i =3D upperIndexes.length - 1; i >=3D 0; --i) hull.push(points[sorte= dPoints[upperIndexes[i]][2]]); for (i =3D +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push= (points[sortedPoints[lowerIndexes[i]][2]]); return hull; } function contains$2(polygon, point) { var n =3D polygon.length, p =3D polygon[n - 1], x =3D point[0], y =3D point[1], x0 =3D p[0], y0 =3D p[1], x1, y1, inside =3D false; for (var i =3D 0; i < n; ++i) { p =3D polygon[i], x1 =3D p[0], y1 =3D p[1]; if (((y1 > y) !=3D=3D (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1= ) + x1)) inside =3D !inside; x0 =3D x1, y0 =3D y1; } return inside; } function length$2(polygon) { var i =3D -1, n =3D polygon.length, b =3D polygon[n - 1], xa, ya, xb =3D b[0], yb =3D b[1], perimeter =3D 0; while (++i < n) { xa =3D xb; ya =3D yb; b =3D polygon[i]; xb =3D b[0]; yb =3D b[1]; xa -=3D xb; ya -=3D yb; perimeter +=3D Math.sqrt(xa * xa + ya * ya); } return perimeter; } function defaultSource$1() { return Math.random(); } var uniform =3D (function sourceRandomUniform(source) { function randomUniform(min, max) { min =3D min =3D=3D null ? 0 : +min; max =3D max =3D=3D null ? 1 : +max; if (arguments.length =3D=3D=3D 1) max =3D min, min =3D 0; else max -=3D min; return function() { return source() * max + min; }; } randomUniform.source =3D sourceRandomUniform; return randomUniform; })(defaultSource$1); var normal =3D (function sourceRandomNormal(source) { function randomNormal(mu, sigma) { var x, r; mu =3D mu =3D=3D null ? 0 : +mu; sigma =3D sigma =3D=3D null ? 1 : +sigma; return function() { var y; // If available, use the second previously-generated uniform random. if (x !=3D null) y =3D x, x =3D null; // Otherwise, generate a new x and y. else do { x =3D source() * 2 - 1; y =3D source() * 2 - 1; r =3D x * x + y * y; } while (!r || r > 1); return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); }; } randomNormal.source =3D sourceRandomNormal; return randomNormal; })(defaultSource$1); var logNormal =3D (function sourceRandomLogNormal(source) { function randomLogNormal() { var randomNormal =3D normal.source(source).apply(this, arguments); return function() { return Math.exp(randomNormal()); }; } randomLogNormal.source =3D sourceRandomLogNormal; return randomLogNormal; })(defaultSource$1); var irwinHall =3D (function sourceRandomIrwinHall(source) { function randomIrwinHall(n) { return function() { for (var sum =3D 0, i =3D 0; i < n; ++i) sum +=3D source(); return sum; }; } randomIrwinHall.source =3D sourceRandomIrwinHall; return randomIrwinHall; })(defaultSource$1); var bates =3D (function sourceRandomBates(source) { function randomBates(n) { var randomIrwinHall =3D irwinHall.source(source)(n); return function() { return randomIrwinHall() / n; }; } randomBates.source =3D sourceRandomBates; return randomBates; })(defaultSource$1); var exponential$1 =3D (function sourceRandomExponential(source) { function randomExponential(lambda) { return function() { return -Math.log(1 - source()) / lambda; }; } randomExponential.source =3D sourceRandomExponential; return randomExponential; })(defaultSource$1); function initRange(domain, range) { switch (arguments.length) { case 0: break; case 1: this.range(domain); break; default: this.range(range).domain(domain); break; } return this; } function initInterpolator(domain, interpolator) { switch (arguments.length) { case 0: break; case 1: this.interpolator(domain); break; default: this.interpolator(interpolator).domain(domain); break; } return this; } var array$3 =3D Array.prototype; var map$2 =3D array$3.map; var slice$5 =3D array$3.slice; var implicit =3D {name: "implicit"}; function ordinal() { var index =3D map$1(), domain =3D [], range =3D [], unknown =3D implicit; function scale(d) { var key =3D d + "", i =3D index.get(key); if (!i) { if (unknown !=3D=3D implicit) return unknown; index.set(key, i =3D domain.push(d)); } return range[(i - 1) % range.length]; } scale.domain =3D function(_) { if (!arguments.length) return domain.slice(); domain =3D [], index =3D map$1(); var i =3D -1, n =3D _.length, d, key; while (++i < n) if (!index.has(key =3D (d =3D _[i]) + "")) index.set(ke= y, domain.push(d)); return scale; }; scale.range =3D function(_) { return arguments.length ? (range =3D slice$5.call(_), scale) : range.sl= ice(); }; scale.unknown =3D function(_) { return arguments.length ? (unknown =3D _, scale) : unknown; }; scale.copy =3D function() { return ordinal(domain, range).unknown(unknown); }; initRange.apply(scale, arguments); return scale; } function band() { var scale =3D ordinal().unknown(undefined), domain =3D scale.domain, ordinalRange =3D scale.range, range$$1 =3D [0, 1], step, bandwidth, round =3D false, paddingInner =3D 0, paddingOuter =3D 0, align =3D 0.5; delete scale.unknown; function rescale() { var n =3D domain().length, reverse =3D range$$1[1] < range$$1[0], start =3D range$$1[reverse - 0], stop =3D range$$1[1 - reverse]; step =3D (stop - start) / Math.max(1, n - paddingInner + paddingOuter *= 2); if (round) step =3D Math.floor(step); start +=3D (stop - start - step * (n - paddingInner)) * align; bandwidth =3D step * (1 - paddingInner); if (round) start =3D Math.round(start), bandwidth =3D Math.round(bandwi= dth); var values =3D sequence(n).map(function(i) { return start + step * i; }= ); return ordinalRange(reverse ? values.reverse() : values); } scale.domain =3D function(_) { return arguments.length ? (domain(_), rescale()) : domain(); }; scale.range =3D function(_) { return arguments.length ? (range$$1 =3D [+_[0], +_[1]], rescale()) : ra= nge$$1.slice(); }; scale.rangeRound =3D function(_) { return range$$1 =3D [+_[0], +_[1]], round =3D true, rescale(); }; scale.bandwidth =3D function() { return bandwidth; }; scale.step =3D function() { return step; }; scale.round =3D function(_) { return arguments.length ? (round =3D !!_, rescale()) : round; }; scale.padding =3D function(_) { return arguments.length ? (paddingInner =3D Math.min(1, paddingOuter = =3D +_), rescale()) : paddingInner; }; scale.paddingInner =3D function(_) { return arguments.length ? (paddingInner =3D Math.min(1, _), rescale()) = : paddingInner; }; scale.paddingOuter =3D function(_) { return arguments.length ? (paddingOuter =3D +_, rescale()) : paddingOut= er; }; scale.align =3D function(_) { return arguments.length ? (align =3D Math.max(0, Math.min(1, _)), resca= le()) : align; }; scale.copy =3D function() { return band(domain(), range$$1) .round(round) .paddingInner(paddingInner) .paddingOuter(paddingOuter) .align(align); }; return initRange.apply(rescale(), arguments); } function pointish(scale) { var copy =3D scale.copy; scale.padding =3D scale.paddingOuter; delete scale.paddingInner; delete scale.paddingOuter; scale.copy =3D function() { return pointish(copy()); }; return scale; } function point$1() { return pointish(band.apply(null, arguments).paddingInner(1)); } function constant$a(x) { return function() { return x; }; } function number$2(x) { return +x; } var unit =3D [0, 1]; function identity$6(x) { return x; } function normalize(a, b) { return (b -=3D (a =3D +a)) ? function(x) { return (x - a) / b; } : constant$a(isNaN(b) ? NaN : 0.5); } function clamper(domain) { var a =3D domain[0], b =3D domain[domain.length - 1], t; if (a > b) t =3D a, a =3D b, b =3D t; return function(x) { return Math.max(a, Math.min(b, x)); }; } // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corre= sponding parameter t in [0,1]. // interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corres= ponding range value x in [a,b]. function bimap(domain, range, interpolate$$1) { var d0 =3D domain[0], d1 =3D domain[1], r0 =3D range[0], r1 =3D range[1]; if (d1 < d0) d0 =3D normalize(d1, d0), r0 =3D interpolate$$1(r1, r0); else d0 =3D normalize(d0, d1), r0 =3D interpolate$$1(r0, r1); return function(x) { return r0(d0(x)); }; } function polymap(domain, range, interpolate$$1) { var j =3D Math.min(domain.length, range.length) - 1, d =3D new Array(j), r =3D new Array(j), i =3D -1; // Reverse descending domains. if (domain[j] < domain[0]) { domain =3D domain.slice().reverse(); range =3D range.slice().reverse(); } while (++i < j) { d[i] =3D normalize(domain[i], domain[i + 1]); r[i] =3D interpolate$$1(range[i], range[i + 1]); } return function(x) { var i =3D bisectRight(domain, x, 1, j) - 1; return r[i](d[i](x)); }; } function copy(source, target) { return target .domain(source.domain()) .range(source.range()) .interpolate(source.interpolate()) .clamp(source.clamp()) .unknown(source.unknown()); } function transformer$1() { var domain =3D unit, range =3D unit, interpolate$$1 =3D interpolateValue, transform, untransform, unknown, clamp =3D identity$6, piecewise$$1, output, input; function rescale() { piecewise$$1 =3D Math.min(domain.length, range.length) > 2 ? polymap : = bimap; output =3D input =3D null; return scale; } function scale(x) { return isNaN(x =3D +x) ? unknown : (output || (output =3D piecewise$$1(= domain.map(transform), range, interpolate$$1)))(transform(clamp(x))); } scale.invert =3D function(y) { return clamp(untransform((input || (input =3D piecewise$$1(range, domai= n.map(transform), interpolateNumber)))(y))); }; scale.domain =3D function(_) { return arguments.length ? (domain =3D map$2.call(_, number$2), clamp = =3D=3D=3D identity$6 || (clamp =3D clamper(domain)), rescale()) : domain.sl= ice(); }; scale.range =3D function(_) { return arguments.length ? (range =3D slice$5.call(_), rescale()) : rang= e.slice(); }; scale.rangeRound =3D function(_) { return range =3D slice$5.call(_), interpolate$$1 =3D interpolateRound, = rescale(); }; scale.clamp =3D function(_) { return arguments.length ? (clamp =3D _ ? clamper(domain) : identity$6, = scale) : clamp !=3D=3D identity$6; }; scale.interpolate =3D function(_) { return arguments.length ? (interpolate$$1 =3D _, rescale()) : interpola= te$$1; }; scale.unknown =3D function(_) { return arguments.length ? (unknown =3D _, scale) : unknown; }; return function(t, u) { transform =3D t, untransform =3D u; return rescale(); }; } function continuous(transform, untransform) { return transformer$1()(transform, untransform); } function tickFormat(start, stop, count, specifier) { var step =3D tickStep(start, stop, count), precision; specifier =3D formatSpecifier(specifier =3D=3D null ? ",f" : specifier); switch (specifier.type) { case "s": { var value =3D Math.max(Math.abs(start), Math.abs(stop)); if (specifier.precision =3D=3D null && !isNaN(precision =3D precision= Prefix(step, value))) specifier.precision =3D precision; return exports.formatPrefix(specifier, value); } case "": case "e": case "g": case "p": case "r": { if (specifier.precision =3D=3D null && !isNaN(precision =3D precision= Round(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precisio= n =3D precision - (specifier.type =3D=3D=3D "e"); break; } case "f": case "%": { if (specifier.precision =3D=3D null && !isNaN(precision =3D precision= Fixed(step))) specifier.precision =3D precision - (specifier.type =3D=3D=3D= "%") * 2; break; } } return exports.format(specifier); } function linearish(scale) { var domain =3D scale.domain; scale.ticks =3D function(count) { var d =3D domain(); return ticks(d[0], d[d.length - 1], count =3D=3D null ? 10 : count); }; scale.tickFormat =3D function(count, specifier) { var d =3D domain(); return tickFormat(d[0], d[d.length - 1], count =3D=3D null ? 10 : count= , specifier); }; scale.nice =3D function(count) { if (count =3D=3D null) count =3D 10; var d =3D domain(), i0 =3D 0, i1 =3D d.length - 1, start =3D d[i0], stop =3D d[i1], step; if (stop < start) { step =3D start, start =3D stop, stop =3D step; step =3D i0, i0 =3D i1, i1 =3D step; } step =3D tickIncrement(start, stop, count); if (step > 0) { start =3D Math.floor(start / step) * step; stop =3D Math.ceil(stop / step) * step; step =3D tickIncrement(start, stop, count); } else if (step < 0) { start =3D Math.ceil(start * step) / step; stop =3D Math.floor(stop * step) / step; step =3D tickIncrement(start, stop, count); } if (step > 0) { d[i0] =3D Math.floor(start / step) * step; d[i1] =3D Math.ceil(stop / step) * step; domain(d); } else if (step < 0) { d[i0] =3D Math.ceil(start * step) / step; d[i1] =3D Math.floor(stop * step) / step; domain(d); } return scale; }; return scale; } function linear$2() { var scale =3D continuous(identity$6, identity$6); scale.copy =3D function() { return copy(scale, linear$2()); }; initRange.apply(scale, arguments); return linearish(scale); } function identity$7(domain) { var unknown; function scale(x) { return isNaN(x =3D +x) ? unknown : x; } scale.invert =3D scale; scale.domain =3D scale.range =3D function(_) { return arguments.length ? (domain =3D map$2.call(_, number$2), scale) := domain.slice(); }; scale.unknown =3D function(_) { return arguments.length ? (unknown =3D _, scale) : unknown; }; scale.copy =3D function() { return identity$7(domain).unknown(unknown); }; domain =3D arguments.length ? map$2.call(domain, number$2) : [0, 1]; return linearish(scale); } function nice(domain, interval) { domain =3D domain.slice(); var i0 =3D 0, i1 =3D domain.length - 1, x0 =3D domain[i0], x1 =3D domain[i1], t; if (x1 < x0) { t =3D i0, i0 =3D i1, i1 =3D t; t =3D x0, x0 =3D x1, x1 =3D t; } domain[i0] =3D interval.floor(x0); domain[i1] =3D interval.ceil(x1); return domain; } function transformLog(x) { return Math.log(x); } function transformExp(x) { return Math.exp(x); } function transformLogn(x) { return -Math.log(-x); } function transformExpn(x) { return -Math.exp(-x); } function pow10(x) { return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; } function powp(base) { return base =3D=3D=3D 10 ? pow10 : base =3D=3D=3D Math.E ? Math.exp : function(x) { return Math.pow(base, x); }; } function logp(base) { return base =3D=3D=3D Math.E ? Math.log : base =3D=3D=3D 10 && Math.log10 || base =3D=3D=3D 2 && Math.log2 || (base =3D Math.log(base), function(x) { return Math.log(x) / base;= }); } function reflect(f) { return function(x) { return -f(-x); }; } function loggish(transform) { var scale =3D transform(transformLog, transformExp), domain =3D scale.domain, base =3D 10, logs, pows; function rescale() { logs =3D logp(base), pows =3D powp(base); if (domain()[0] < 0) { logs =3D reflect(logs), pows =3D reflect(pows); transform(transformLogn, transformExpn); } else { transform(transformLog, transformExp); } return scale; } scale.base =3D function(_) { return arguments.length ? (base =3D +_, rescale()) : base; }; scale.domain =3D function(_) { return arguments.length ? (domain(_), rescale()) : domain(); }; scale.ticks =3D function(count) { var d =3D domain(), u =3D d[0], v =3D d[d.length - 1], r; if (r =3D v < u) i =3D u, u =3D v, v =3D i; var i =3D logs(u), j =3D logs(v), p, k, t, n =3D count =3D=3D null ? 10 : +count, z =3D []; if (!(base % 1) && j - i < n) { i =3D Math.round(i) - 1, j =3D Math.round(j) + 1; if (u > 0) for (; i < j; ++i) { for (k =3D 1, p =3D pows(i); k < base; ++k) { t =3D p * k; if (t < u) continue; if (t > v) break; z.push(t); } } else for (; i < j; ++i) { for (k =3D base - 1, p =3D pows(i); k >=3D 1; --k) { t =3D p * k; if (t < u) continue; if (t > v) break; z.push(t); } } } else { z =3D ticks(i, j, Math.min(j - i, n)).map(pows); } return r ? z.reverse() : z; }; scale.tickFormat =3D function(count, specifier) { if (specifier =3D=3D null) specifier =3D base =3D=3D=3D 10 ? ".0e" : ",= "; if (typeof specifier !=3D=3D "function") specifier =3D exports.format(s= pecifier); if (count =3D=3D=3D Infinity) return specifier; if (count =3D=3D null) count =3D 10; var k =3D Math.max(1, base * count / scale.ticks().length); // TODO fas= t estimate? return function(d) { var i =3D d / pows(Math.round(logs(d))); if (i * base < base - 0.5) i *=3D base; return i <=3D k ? specifier(d) : ""; }; }; scale.nice =3D function() { return domain(nice(domain(), { floor: function(x) { return pows(Math.floor(logs(x))); }, ceil: function(x) { return pows(Math.ceil(logs(x))); } })); }; return scale; } function log$1() { var scale =3D loggish(transformer$1()).domain([1, 10]); scale.copy =3D function() { return copy(scale, log$1()).base(scale.base()); }; initRange.apply(scale, arguments); return scale; } function transformSymlog(c) { return function(x) { return Math.sign(x) * Math.log1p(Math.abs(x / c)); }; } function transformSymexp(c) { return function(x) { return Math.sign(x) * Math.expm1(Math.abs(x)) * c; }; } function symlogish(transform) { var c =3D 1, scale =3D transform(transformSymlog(c), transformSymexp(c)); scale.constant =3D function(_) { return arguments.length ? transform(transformSymlog(c =3D +_), transfor= mSymexp(c)) : c; }; return linearish(scale); } function symlog() { var scale =3D symlogish(transformer$1()); scale.copy =3D function() { return copy(scale, symlog()).constant(scale.constant()); }; return initRange.apply(scale, arguments); } function transformPow(exponent) { return function(x) { return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); }; } function transformSqrt(x) { return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); } function transformSquare(x) { return x < 0 ? -x * x : x * x; } function powish(transform) { var scale =3D transform(identity$6, identity$6), exponent =3D 1; function rescale() { return exponent =3D=3D=3D 1 ? transform(identity$6, identity$6) : exponent =3D=3D=3D 0.5 ? transform(transformSqrt, transformSquare) : transform(transformPow(exponent), transformPow(1 / exponent)); } scale.exponent =3D function(_) { return arguments.length ? (exponent =3D +_, rescale()) : exponent; }; return linearish(scale); } function pow$1() { var scale =3D powish(transformer$1()); scale.copy =3D function() { return copy(scale, pow$1()).exponent(scale.exponent()); }; initRange.apply(scale, arguments); return scale; } function sqrt$1() { return pow$1.apply(null, arguments).exponent(0.5); } function quantile$$1() { var domain =3D [], range =3D [], thresholds =3D [], unknown; function rescale() { var i =3D 0, n =3D Math.max(1, range.length); thresholds =3D new Array(n - 1); while (++i < n) thresholds[i - 1] =3D threshold(domain, i / n); return scale; } function scale(x) { return isNaN(x =3D +x) ? unknown : range[bisectRight(thresholds, x)]; } scale.invertExtent =3D function(y) { var i =3D range.indexOf(y); return i < 0 ? [NaN, NaN] : [ i > 0 ? thresholds[i - 1] : domain[0], i < thresholds.length ? thresholds[i] : domain[domain.length - 1] ]; }; scale.domain =3D function(_) { if (!arguments.length) return domain.slice(); domain =3D []; for (var i =3D 0, n =3D _.length, d; i < n; ++i) if (d =3D _[i], d !=3D= null && !isNaN(d =3D +d)) domain.push(d); domain.sort(ascending); return rescale(); }; scale.range =3D function(_) { return arguments.length ? (range =3D slice$5.call(_), rescale()) : rang= e.slice(); }; scale.unknown =3D function(_) { return arguments.length ? (unknown =3D _, scale) : unknown; }; scale.quantiles =3D function() { return thresholds.slice(); }; scale.copy =3D function() { return quantile$$1() .domain(domain) .range(range) .unknown(unknown); }; return initRange.apply(scale, arguments); } function quantize$1() { var x0 =3D 0, x1 =3D 1, n =3D 1, domain =3D [0.5], range =3D [0, 1], unknown; function scale(x) { return x <=3D x ? range[bisectRight(domain, x, 0, n)] : unknown; } function rescale() { var i =3D -1; domain =3D new Array(n); while (++i < n) domain[i] =3D ((i + 1) * x1 - (i - n) * x0) / (n + 1); return scale; } scale.domain =3D function(_) { return arguments.length ? (x0 =3D +_[0], x1 =3D +_[1], rescale()) : [x0= , x1]; }; scale.range =3D function(_) { return arguments.length ? (n =3D (range =3D slice$5.call(_)).length - 1= , rescale()) : range.slice(); }; scale.invertExtent =3D function(y) { var i =3D range.indexOf(y); return i < 0 ? [NaN, NaN] : i < 1 ? [x0, domain[0]] : i >=3D n ? [domain[n - 1], x1] : [domain[i - 1], domain[i]]; }; scale.unknown =3D function(_) { return arguments.length ? (unknown =3D _, scale) : scale; }; scale.thresholds =3D function() { return domain.slice(); }; scale.copy =3D function() { return quantize$1() .domain([x0, x1]) .range(range) .unknown(unknown); }; return initRange.apply(linearish(scale), arguments); } function threshold$1() { var domain =3D [0.5], range =3D [0, 1], unknown, n =3D 1; function scale(x) { return x <=3D x ? range[bisectRight(domain, x, 0, n)] : unknown; } scale.domain =3D function(_) { return arguments.length ? (domain =3D slice$5.call(_), n =3D Math.min(d= omain.length, range.length - 1), scale) : domain.slice(); }; scale.range =3D function(_) { return arguments.length ? (range =3D slice$5.call(_), n =3D Math.min(do= main.length, range.length - 1), scale) : range.slice(); }; scale.invertExtent =3D function(y) { var i =3D range.indexOf(y); return [domain[i - 1], domain[i]]; }; scale.unknown =3D function(_) { return arguments.length ? (unknown =3D _, scale) : unknown; }; scale.copy =3D function() { return threshold$1() .domain(domain) .range(range) .unknown(unknown); }; return initRange.apply(scale, arguments); } var t0$1 =3D new Date, t1$1 =3D new Date; function newInterval(floori, offseti, count, field) { function interval(date) { return floori(date =3D new Date(+date)), date; } interval.floor =3D interval; interval.ceil =3D function(date) { return floori(date =3D new Date(date - 1)), offseti(date, 1), floori(da= te), date; }; interval.round =3D function(date) { var d0 =3D interval(date), d1 =3D interval.ceil(date); return date - d0 < d1 - date ? d0 : d1; }; interval.offset =3D function(date, step) { return offseti(date =3D new Date(+date), step =3D=3D null ? 1 : Math.fl= oor(step)), date; }; interval.range =3D function(start, stop, step) { var range =3D [], previous; start =3D interval.ceil(start); step =3D step =3D=3D null ? 1 : Math.floor(step); if (!(start < stop) || !(step > 0)) return range; // also handles Inval= id Date do range.push(previous =3D new Date(+start)), offseti(start, step), flo= ori(start); while (previous < start && start < stop); return range; }; interval.filter =3D function(test) { return newInterval(function(date) { if (date >=3D date) while (floori(date), !test(date)) date.setTime(da= te - 1); }, function(date, step) { if (date >=3D date) { if (step < 0) while (++step <=3D 0) { while (offseti(date, -1), !test(date)) {} // eslint-disable-line = no-empty } else while (--step >=3D 0) { while (offseti(date, +1), !test(date)) {} // eslint-disable-line = no-empty } } }); }; if (count) { interval.count =3D function(start, end) { t0$1.setTime(+start), t1$1.setTime(+end); floori(t0$1), floori(t1$1); return Math.floor(count(t0$1, t1$1)); }; interval.every =3D function(step) { step =3D Math.floor(step); return !isFinite(step) || !(step > 0) ? null : !(step > 1) ? interval : interval.filter(field ? function(d) { return field(d) % step =3D=3D=3D 0; } : function(d) { return interval.count(0, d) % step =3D=3D=3D = 0; }); }; } return interval; } var millisecond =3D newInterval(function() { // noop }, function(date, step) { date.setTime(+date + step); }, function(start, end) { return end - start; }); // An optimized implementation for this simple case. millisecond.every =3D function(k) { k =3D Math.floor(k); if (!isFinite(k) || !(k > 0)) return null; if (!(k > 1)) return millisecond; return newInterval(function(date) { date.setTime(Math.floor(date / k) * k); }, function(date, step) { date.setTime(+date + step * k); }, function(start, end) { return (end - start) / k; }); }; var milliseconds =3D millisecond.range; var durationSecond =3D 1e3; var durationMinute =3D 6e4; var durationHour =3D 36e5; var durationDay =3D 864e5; var durationWeek =3D 6048e5; var second =3D newInterval(function(date) { date.setTime(date - date.getMilliseconds()); }, function(date, step) { date.setTime(+date + step * durationSecond); }, function(start, end) { return (end - start) / durationSecond; }, function(date) { return date.getUTCSeconds(); }); var seconds =3D second.range; var minute =3D newInterval(function(date) { date.setTime(date - date.getMilliseconds() - date.getSeconds() * duration= Second); }, function(date, step) { date.setTime(+date + step * durationMinute); }, function(start, end) { return (end - start) / durationMinute; }, function(date) { return date.getMinutes(); }); var minutes =3D minute.range; var hour =3D newInterval(function(date) { date.setTime(date - date.getMilliseconds() - date.getSeconds() * duration= Second - date.getMinutes() * durationMinute); }, function(date, step) { date.setTime(+date + step * durationHour); }, function(start, end) { return (end - start) / durationHour; }, function(date) { return date.getHours(); }); var hours =3D hour.range; var day =3D newInterval(function(date) { date.setHours(0, 0, 0, 0); }, function(date, step) { date.setDate(date.getDate() + step); }, function(start, end) { return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset(= )) * durationMinute) / durationDay; }, function(date) { return date.getDate() - 1; }); var days =3D day.range; function weekday(i) { return newInterval(function(date) { date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); date.setHours(0, 0, 0, 0); }, function(date, step) { date.setDate(date.getDate() + step * 7); }, function(start, end) { return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffse= t()) * durationMinute) / durationWeek; }); } var sunday =3D weekday(0); var monday =3D weekday(1); var tuesday =3D weekday(2); var wednesday =3D weekday(3); var thursday =3D weekday(4); var friday =3D weekday(5); var saturday =3D weekday(6); var sundays =3D sunday.range; var mondays =3D monday.range; var tuesdays =3D tuesday.range; var wednesdays =3D wednesday.range; var thursdays =3D thursday.range; var fridays =3D friday.range; var saturdays =3D saturday.range; var month =3D newInterval(function(date) { date.setDate(1); date.setHours(0, 0, 0, 0); }, function(date, step) { date.setMonth(date.getMonth() + step); }, function(start, end) { return end.getMonth() - start.getMonth() + (end.getFullYear() - start.get= FullYear()) * 12; }, function(date) { return date.getMonth(); }); var months =3D month.range; var year =3D newInterval(function(date) { date.setMonth(0, 1); date.setHours(0, 0, 0, 0); }, function(date, step) { date.setFullYear(date.getFullYear() + step); }, function(start, end) { return end.getFullYear() - start.getFullYear(); }, function(date) { return date.getFullYear(); }); // An optimized implementation for this simple case. year.every =3D function(k) { return !isFinite(k =3D Math.floor(k)) || !(k > 0) ? null : newInterval(fu= nction(date) { date.setFullYear(Math.floor(date.getFullYear() / k) * k); date.setMonth(0, 1); date.setHours(0, 0, 0, 0); }, function(date, step) { date.setFullYear(date.getFullYear() + step * k); }); }; var years =3D year.range; var utcMinute =3D newInterval(function(date) { date.setUTCSeconds(0, 0); }, function(date, step) { date.setTime(+date + step * durationMinute); }, function(start, end) { return (end - start) / durationMinute; }, function(date) { return date.getUTCMinutes(); }); var utcMinutes =3D utcMinute.range; var utcHour =3D newInterval(function(date) { date.setUTCMinutes(0, 0, 0); }, function(date, step) { date.setTime(+date + step * durationHour); }, function(start, end) { return (end - start) / durationHour; }, function(date) { return date.getUTCHours(); }); var utcHours =3D utcHour.range; var utcDay =3D newInterval(function(date) { date.setUTCHours(0, 0, 0, 0); }, function(date, step) { date.setUTCDate(date.getUTCDate() + step); }, function(start, end) { return (end - start) / durationDay; }, function(date) { return date.getUTCDate() - 1; }); var utcDays =3D utcDay.range; function utcWeekday(i) { return newInterval(function(date) { date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); date.setUTCHours(0, 0, 0, 0); }, function(date, step) { date.setUTCDate(date.getUTCDate() + step * 7); }, function(start, end) { return (end - start) / durationWeek; }); } var utcSunday =3D utcWeekday(0); var utcMonday =3D utcWeekday(1); var utcTuesday =3D utcWeekday(2); var utcWednesday =3D utcWeekday(3); var utcThursday =3D utcWeekday(4); var utcFriday =3D utcWeekday(5); var utcSaturday =3D utcWeekday(6); var utcSundays =3D utcSunday.range; var utcMondays =3D utcMonday.range; var utcTuesdays =3D utcTuesday.range; var utcWednesdays =3D utcWednesday.range; var utcThursdays =3D utcThursday.range; var utcFridays =3D utcFriday.range; var utcSaturdays =3D utcSaturday.range; var utcMonth =3D newInterval(function(date) { date.setUTCDate(1); date.setUTCHours(0, 0, 0, 0); }, function(date, step) { date.setUTCMonth(date.getUTCMonth() + step); }, function(start, end) { return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - = start.getUTCFullYear()) * 12; }, function(date) { return date.getUTCMonth(); }); var utcMonths =3D utcMonth.range; var utcYear =3D newInterval(function(date) { date.setUTCMonth(0, 1); date.setUTCHours(0, 0, 0, 0); }, function(date, step) { date.setUTCFullYear(date.getUTCFullYear() + step); }, function(start, end) { return end.getUTCFullYear() - start.getUTCFullYear(); }, function(date) { return date.getUTCFullYear(); }); // An optimized implementation for this simple case. utcYear.every =3D function(k) { return !isFinite(k =3D Math.floor(k)) || !(k > 0) ? null : newInterval(fu= nction(date) { date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); date.setUTCMonth(0, 1); date.setUTCHours(0, 0, 0, 0); }, function(date, step) { date.setUTCFullYear(date.getUTCFullYear() + step * k); }); }; var utcYears =3D utcYear.range; function localDate(d) { if (0 <=3D d.y && d.y < 100) { var date =3D new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); date.setFullYear(d.y); return date; } return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); } function utcDate(d) { if (0 <=3D d.y && d.y < 100) { var date =3D new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); date.setUTCFullYear(d.y); return date; } return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); } function newYear(y) { return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0}; } function formatLocale$1(locale) { var locale_dateTime =3D locale.dateTime, locale_date =3D locale.date, locale_time =3D locale.time, locale_periods =3D locale.periods, locale_weekdays =3D locale.days, locale_shortWeekdays =3D locale.shortDays, locale_months =3D locale.months, locale_shortMonths =3D locale.shortMonths; var periodRe =3D formatRe(locale_periods), periodLookup =3D formatLookup(locale_periods), weekdayRe =3D formatRe(locale_weekdays), weekdayLookup =3D formatLookup(locale_weekdays), shortWeekdayRe =3D formatRe(locale_shortWeekdays), shortWeekdayLookup =3D formatLookup(locale_shortWeekdays), monthRe =3D formatRe(locale_months), monthLookup =3D formatLookup(locale_months), shortMonthRe =3D formatRe(locale_shortMonths), shortMonthLookup =3D formatLookup(locale_shortMonths); var formats =3D { "a": formatShortWeekday, "A": formatWeekday, "b": formatShortMonth, "B": formatMonth, "c": null, "d": formatDayOfMonth, "e": formatDayOfMonth, "f": formatMicroseconds, "H": formatHour24, "I": formatHour12, "j": formatDayOfYear, "L": formatMilliseconds, "m": formatMonthNumber, "M": formatMinutes, "p": formatPeriod, "Q": formatUnixTimestamp, "s": formatUnixTimestampSeconds, "S": formatSeconds, "u": formatWeekdayNumberMonday, "U": formatWeekNumberSunday, "V": formatWeekNumberISO, "w": formatWeekdayNumberSunday, "W": formatWeekNumberMonday, "x": null, "X": null, "y": formatYear$1, "Y": formatFullYear, "Z": formatZone, "%": formatLiteralPercent }; var utcFormats =3D { "a": formatUTCShortWeekday, "A": formatUTCWeekday, "b": formatUTCShortMonth, "B": formatUTCMonth, "c": null, "d": formatUTCDayOfMonth, "e": formatUTCDayOfMonth, "f": formatUTCMicroseconds, "H": formatUTCHour24, "I": formatUTCHour12, "j": formatUTCDayOfYear, "L": formatUTCMilliseconds, "m": formatUTCMonthNumber, "M": formatUTCMinutes, "p": formatUTCPeriod, "Q": formatUnixTimestamp, "s": formatUnixTimestampSeconds, "S": formatUTCSeconds, "u": formatUTCWeekdayNumberMonday, "U": formatUTCWeekNumberSunday, "V": formatUTCWeekNumberISO, "w": formatUTCWeekdayNumberSunday, "W": formatUTCWeekNumberMonday, "x": null, "X": null, "y": formatUTCYear, "Y": formatUTCFullYear, "Z": formatUTCZone, "%": formatLiteralPercent }; var parses =3D { "a": parseShortWeekday, "A": parseWeekday, "b": parseShortMonth, "B": parseMonth, "c": parseLocaleDateTime, "d": parseDayOfMonth, "e": parseDayOfMonth, "f": parseMicroseconds, "H": parseHour24, "I": parseHour24, "j": parseDayOfYear, "L": parseMilliseconds, "m": parseMonthNumber, "M": parseMinutes, "p": parsePeriod, "Q": parseUnixTimestamp, "s": parseUnixTimestampSeconds, "S": parseSeconds, "u": parseWeekdayNumberMonday, "U": parseWeekNumberSunday, "V": parseWeekNumberISO, "w": parseWeekdayNumberSunday, "W": parseWeekNumberMonday, "x": parseLocaleDate, "X": parseLocaleTime, "y": parseYear, "Y": parseFullYear, "Z": parseZone, "%": parseLiteralPercent }; // These recursive directive definitions must be deferred. formats.x =3D newFormat(locale_date, formats); formats.X =3D newFormat(locale_time, formats); formats.c =3D newFormat(locale_dateTime, formats); utcFormats.x =3D newFormat(locale_date, utcFormats); utcFormats.X =3D newFormat(locale_time, utcFormats); utcFormats.c =3D newFormat(locale_dateTime, utcFormats); function newFormat(specifier, formats) { return function(date) { var string =3D [], i =3D -1, j =3D 0, n =3D specifier.length, c, pad, format; if (!(date instanceof Date)) date =3D new Date(+date); while (++i < n) { if (specifier.charCodeAt(i) =3D=3D=3D 37) { string.push(specifier.slice(j, i)); if ((pad =3D pads[c =3D specifier.charAt(++i)]) !=3D null) c =3D = specifier.charAt(++i); else pad =3D c =3D=3D=3D "e" ? " " : "0"; if (format =3D formats[c]) c =3D format(date, pad); string.push(c); j =3D i + 1; } } string.push(specifier.slice(j, i)); return string.join(""); }; } function newParse(specifier, newDate) { return function(string) { var d =3D newYear(1900), i =3D parseSpecifier(d, specifier, string +=3D "", 0), week, day$$1; if (i !=3D string.length) return null; // If a UNIX timestamp is specified, return it. if ("Q" in d) return new Date(d.Q); // The am-pm flag is 0 for AM, and 1 for PM. if ("p" in d) d.H =3D d.H % 12 + d.p * 12; // Convert day-of-week and week-of-year to day-of-year. if ("V" in d) { if (d.V < 1 || d.V > 53) return null; if (!("w" in d)) d.w =3D 1; if ("Z" in d) { week =3D utcDate(newYear(d.y)), day$$1 =3D week.getUTCDay(); week =3D day$$1 > 4 || day$$1 =3D=3D=3D 0 ? utcMonday.ceil(week) = : utcMonday(week); week =3D utcDay.offset(week, (d.V - 1) * 7); d.y =3D week.getUTCFullYear(); d.m =3D week.getUTCMonth(); d.d =3D week.getUTCDate() + (d.w + 6) % 7; } else { week =3D newDate(newYear(d.y)), day$$1 =3D week.getDay(); week =3D day$$1 > 4 || day$$1 =3D=3D=3D 0 ? monday.ceil(week) : m= onday(week); week =3D day.offset(week, (d.V - 1) * 7); d.y =3D week.getFullYear(); d.m =3D week.getMonth(); d.d =3D week.getDate() + (d.w + 6) % 7; } } else if ("W" in d || "U" in d) { if (!("w" in d)) d.w =3D "u" in d ? d.u % 7 : "W" in d ? 1 : 0; day$$1 =3D "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(n= ewYear(d.y)).getDay(); d.m =3D 0; d.d =3D "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$$1 + 5) % 7 : d.w= + d.U * 7 - (day$$1 + 6) % 7; } // If a time zone is specified, all fields are interpreted as UTC and= then // offset according to the specified time zone. if ("Z" in d) { d.H +=3D d.Z / 100 | 0; d.M +=3D d.Z % 100; return utcDate(d); } // Otherwise, all fields are in local time. return newDate(d); }; } function parseSpecifier(d, specifier, string, j) { var i =3D 0, n =3D specifier.length, m =3D string.length, c, parse; while (i < n) { if (j >=3D m) return -1; c =3D specifier.charCodeAt(i++); if (c =3D=3D=3D 37) { c =3D specifier.charAt(i++); parse =3D parses[c in pads ? specifier.charAt(i++) : c]; if (!parse || ((j =3D parse(d, string, j)) < 0)) return -1; } else if (c !=3D string.charCodeAt(j++)) { return -1; } } return j; } function parsePeriod(d, string, i) { var n =3D periodRe.exec(string.slice(i)); return n ? (d.p =3D periodLookup[n[0].toLowerCase()], i + n[0].length) = : -1; } function parseShortWeekday(d, string, i) { var n =3D shortWeekdayRe.exec(string.slice(i)); return n ? (d.w =3D shortWeekdayLookup[n[0].toLowerCase()], i + n[0].le= ngth) : -1; } function parseWeekday(d, string, i) { var n =3D weekdayRe.exec(string.slice(i)); return n ? (d.w =3D weekdayLookup[n[0].toLowerCase()], i + n[0].length)= : -1; } function parseShortMonth(d, string, i) { var n =3D shortMonthRe.exec(string.slice(i)); return n ? (d.m =3D shortMonthLookup[n[0].toLowerCase()], i + n[0].leng= th) : -1; } function parseMonth(d, string, i) { var n =3D monthRe.exec(string.slice(i)); return n ? (d.m =3D monthLookup[n[0].toLowerCase()], i + n[0].length) := -1; } function parseLocaleDateTime(d, string, i) { return parseSpecifier(d, locale_dateTime, string, i); } function parseLocaleDate(d, string, i) { return parseSpecifier(d, locale_date, string, i); } function parseLocaleTime(d, string, i) { return parseSpecifier(d, locale_time, string, i); } function formatShortWeekday(d) { return locale_shortWeekdays[d.getDay()]; } function formatWeekday(d) { return locale_weekdays[d.getDay()]; } function formatShortMonth(d) { return locale_shortMonths[d.getMonth()]; } function formatMonth(d) { return locale_months[d.getMonth()]; } function formatPeriod(d) { return locale_periods[+(d.getHours() >=3D 12)]; } function formatUTCShortWeekday(d) { return locale_shortWeekdays[d.getUTCDay()]; } function formatUTCWeekday(d) { return locale_weekdays[d.getUTCDay()]; } function formatUTCShortMonth(d) { return locale_shortMonths[d.getUTCMonth()]; } function formatUTCMonth(d) { return locale_months[d.getUTCMonth()]; } function formatUTCPeriod(d) { return locale_periods[+(d.getUTCHours() >=3D 12)]; } return { format: function(specifier) { var f =3D newFormat(specifier +=3D "", formats); f.toString =3D function() { return specifier; }; return f; }, parse: function(specifier) { var p =3D newParse(specifier +=3D "", localDate); p.toString =3D function() { return specifier; }; return p; }, utcFormat: function(specifier) { var f =3D newFormat(specifier +=3D "", utcFormats); f.toString =3D function() { return specifier; }; return f; }, utcParse: function(specifier) { var p =3D newParse(specifier, utcDate); p.toString =3D function() { return specifier; }; return p; } }; } var pads =3D {"-": "", "_": " ", "0": "0"}, numberRe =3D /^\s*\d+/, // note: ignores next directive percentRe =3D /^%/, requoteRe =3D /[\\^$*+?|[\]().{}]/g; function pad$1(value, fill, width) { var sign =3D value < 0 ? "-" : "", string =3D (sign ? -value : value) + "", length =3D string.length; return sign + (length < width ? new Array(width - length + 1).join(fill) = + string : string); } function requote(s) { return s.replace(requoteRe, "\\$&"); } function formatRe(names) { return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); } function formatLookup(names) { var map =3D {}, i =3D -1, n =3D names.length; while (++i < n) map[names[i].toLowerCase()] =3D i; return map; } function parseWeekdayNumberSunday(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 1)); return n ? (d.w =3D +n[0], i + n[0].length) : -1; } function parseWeekdayNumberMonday(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 1)); return n ? (d.u =3D +n[0], i + n[0].length) : -1; } function parseWeekNumberSunday(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 2)); return n ? (d.U =3D +n[0], i + n[0].length) : -1; } function parseWeekNumberISO(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 2)); return n ? (d.V =3D +n[0], i + n[0].length) : -1; } function parseWeekNumberMonday(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 2)); return n ? (d.W =3D +n[0], i + n[0].length) : -1; } function parseFullYear(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 4)); return n ? (d.y =3D +n[0], i + n[0].length) : -1; } function parseYear(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 2)); return n ? (d.y =3D +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) = : -1; } function parseZone(d, string, i) { var n =3D /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); return n ? (d.Z =3D n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length)= : -1; } function parseMonthNumber(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 2)); return n ? (d.m =3D n[0] - 1, i + n[0].length) : -1; } function parseDayOfMonth(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 2)); return n ? (d.d =3D +n[0], i + n[0].length) : -1; } function parseDayOfYear(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 3)); return n ? (d.m =3D 0, d.d =3D +n[0], i + n[0].length) : -1; } function parseHour24(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 2)); return n ? (d.H =3D +n[0], i + n[0].length) : -1; } function parseMinutes(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 2)); return n ? (d.M =3D +n[0], i + n[0].length) : -1; } function parseSeconds(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 2)); return n ? (d.S =3D +n[0], i + n[0].length) : -1; } function parseMilliseconds(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 3)); return n ? (d.L =3D +n[0], i + n[0].length) : -1; } function parseMicroseconds(d, string, i) { var n =3D numberRe.exec(string.slice(i, i + 6)); return n ? (d.L =3D Math.floor(n[0] / 1000), i + n[0].length) : -1; } function parseLiteralPercent(d, string, i) { var n =3D percentRe.exec(string.slice(i, i + 1)); return n ? i + n[0].length : -1; } function parseUnixTimestamp(d, string, i) { var n =3D numberRe.exec(string.slice(i)); return n ? (d.Q =3D +n[0], i + n[0].length) : -1; } function parseUnixTimestampSeconds(d, string, i) { var n =3D numberRe.exec(string.slice(i)); return n ? (d.Q =3D (+n[0]) * 1000, i + n[0].length) : -1; } function formatDayOfMonth(d, p) { return pad$1(d.getDate(), p, 2); } function formatHour24(d, p) { return pad$1(d.getHours(), p, 2); } function formatHour12(d, p) { return pad$1(d.getHours() % 12 || 12, p, 2); } function formatDayOfYear(d, p) { return pad$1(1 + day.count(year(d), d), p, 3); } function formatMilliseconds(d, p) { return pad$1(d.getMilliseconds(), p, 3); } function formatMicroseconds(d, p) { return formatMilliseconds(d, p) + "000"; } function formatMonthNumber(d, p) { return pad$1(d.getMonth() + 1, p, 2); } function formatMinutes(d, p) { return pad$1(d.getMinutes(), p, 2); } function formatSeconds(d, p) { return pad$1(d.getSeconds(), p, 2); } function formatWeekdayNumberMonday(d) { var day$$1 =3D d.getDay(); return day$$1 =3D=3D=3D 0 ? 7 : day$$1; } function formatWeekNumberSunday(d, p) { return pad$1(sunday.count(year(d), d), p, 2); } function formatWeekNumberISO(d, p) { var day$$1 =3D d.getDay(); d =3D (day$$1 >=3D 4 || day$$1 =3D=3D=3D 0) ? thursday(d) : thursday.ceil= (d); return pad$1(thursday.count(year(d), d) + (year(d).getDay() =3D=3D=3D 4),= p, 2); } function formatWeekdayNumberSunday(d) { return d.getDay(); } function formatWeekNumberMonday(d, p) { return pad$1(monday.count(year(d), d), p, 2); } function formatYear$1(d, p) { return pad$1(d.getFullYear() % 100, p, 2); } function formatFullYear(d, p) { return pad$1(d.getFullYear() % 10000, p, 4); } function formatZone(d) { var z =3D d.getTimezoneOffset(); return (z > 0 ? "-" : (z *=3D -1, "+")) + pad$1(z / 60 | 0, "0", 2) + pad$1(z % 60, "0", 2); } function formatUTCDayOfMonth(d, p) { return pad$1(d.getUTCDate(), p, 2); } function formatUTCHour24(d, p) { return pad$1(d.getUTCHours(), p, 2); } function formatUTCHour12(d, p) { return pad$1(d.getUTCHours() % 12 || 12, p, 2); } function formatUTCDayOfYear(d, p) { return pad$1(1 + utcDay.count(utcYear(d), d), p, 3); } function formatUTCMilliseconds(d, p) { return pad$1(d.getUTCMilliseconds(), p, 3); } function formatUTCMicroseconds(d, p) { return formatUTCMilliseconds(d, p) + "000"; } function formatUTCMonthNumber(d, p) { return pad$1(d.getUTCMonth() + 1, p, 2); } function formatUTCMinutes(d, p) { return pad$1(d.getUTCMinutes(), p, 2); } function formatUTCSeconds(d, p) { return pad$1(d.getUTCSeconds(), p, 2); } function formatUTCWeekdayNumberMonday(d) { var dow =3D d.getUTCDay(); return dow =3D=3D=3D 0 ? 7 : dow; } function formatUTCWeekNumberSunday(d, p) { return pad$1(utcSunday.count(utcYear(d), d), p, 2); } function formatUTCWeekNumberISO(d, p) { var day$$1 =3D d.getUTCDay(); d =3D (day$$1 >=3D 4 || day$$1 =3D=3D=3D 0) ? utcThursday(d) : utcThursda= y.ceil(d); return pad$1(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() = =3D=3D=3D 4), p, 2); } function formatUTCWeekdayNumberSunday(d) { return d.getUTCDay(); } function formatUTCWeekNumberMonday(d, p) { return pad$1(utcMonday.count(utcYear(d), d), p, 2); } function formatUTCYear(d, p) { return pad$1(d.getUTCFullYear() % 100, p, 2); } function formatUTCFullYear(d, p) { return pad$1(d.getUTCFullYear() % 10000, p, 4); } function formatUTCZone() { return "+0000"; } function formatLiteralPercent() { return "%"; } function formatUnixTimestamp(d) { return +d; } function formatUnixTimestampSeconds(d) { return Math.floor(+d / 1000); } var locale$1; defaultLocale$1({ dateTime: "%x, %X", date: "%-m/%-d/%Y", time: "%-I:%M:%S %p", periods: ["AM", "PM"], days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", = "Saturday"], shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], months: ["January", "February", "March", "April", "May", "June", "July", = "August", "September", "October", "November", "December"], shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Se= p", "Oct", "Nov", "Dec"] }); function defaultLocale$1(definition) { locale$1 =3D formatLocale$1(definition); exports.timeFormat =3D locale$1.format; exports.timeParse =3D locale$1.parse; exports.utcFormat =3D locale$1.utcFormat; exports.utcParse =3D locale$1.utcParse; return locale$1; } var isoSpecifier =3D "%Y-%m-%dT%H:%M:%S.%LZ"; function formatIsoNative(date) { return date.toISOString(); } var formatIso =3D Date.prototype.toISOString ? formatIsoNative : exports.utcFormat(isoSpecifier); function parseIsoNative(string) { var date =3D new Date(string); return isNaN(date) ? null : date; } var parseIso =3D +new Date("2000-01-01T00:00:00.000Z") ? parseIsoNative : exports.utcParse(isoSpecifier); var durationSecond$1 =3D 1000, durationMinute$1 =3D durationSecond$1 * 60, durationHour$1 =3D durationMinute$1 * 60, durationDay$1 =3D durationHour$1 * 24, durationWeek$1 =3D durationDay$1 * 7, durationMonth =3D durationDay$1 * 30, durationYear =3D durationDay$1 * 365; function date$1(t) { return new Date(t); } function number$3(t) { return t instanceof Date ? +t : +new Date(+t); } function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, seco= nd$$1, millisecond$$1, format) { var scale =3D continuous(identity$6, identity$6), invert =3D scale.invert, domain =3D scale.domain; var formatMillisecond =3D format(".%L"), formatSecond =3D format(":%S"), formatMinute =3D format("%I:%M"), formatHour =3D format("%I %p"), formatDay =3D format("%a %d"), formatWeek =3D format("%b %d"), formatMonth =3D format("%B"), formatYear =3D format("%Y"); var tickIntervals =3D [ [second$$1, 1, durationSecond$1], [second$$1, 5, 5 * durationSecond$1], [second$$1, 15, 15 * durationSecond$1], [second$$1, 30, 30 * durationSecond$1], [minute$$1, 1, durationMinute$1], [minute$$1, 5, 5 * durationMinute$1], [minute$$1, 15, 15 * durationMinute$1], [minute$$1, 30, 30 * durationMinute$1], [ hour$$1, 1, durationHour$1 ], [ hour$$1, 3, 3 * durationHour$1 ], [ hour$$1, 6, 6 * durationHour$1 ], [ hour$$1, 12, 12 * durationHour$1 ], [ day$$1, 1, durationDay$1 ], [ day$$1, 2, 2 * durationDay$1 ], [ week, 1, durationWeek$1 ], [ month$$1, 1, durationMonth ], [ month$$1, 3, 3 * durationMonth ], [ year$$1, 1, durationYear ] ]; function tickFormat(date) { return (second$$1(date) < date ? formatMillisecond : minute$$1(date) < date ? formatSecond : hour$$1(date) < date ? formatMinute : day$$1(date) < date ? formatHour : month$$1(date) < date ? (week(date) < date ? formatDay : formatWe= ek) : year$$1(date) < date ? formatMonth : formatYear)(date); } function tickInterval(interval, start, stop, step) { if (interval =3D=3D null) interval =3D 10; // If a desired tick count is specified, pick a reasonable tick interval // based on the extent of the domain and a rough estimate of tick size. // Otherwise, assume interval is already a time interval and use it. if (typeof interval =3D=3D=3D "number") { var target =3D Math.abs(stop - start) / interval, i =3D bisector(function(i) { return i[2]; }).right(tickIntervals,= target); if (i =3D=3D=3D tickIntervals.length) { step =3D tickStep(start / durationYear, stop / durationYear, interv= al); interval =3D year$$1; } else if (i) { i =3D tickIntervals[target / tickIntervals[i - 1][2] < tickInterval= s[i][2] / target ? i - 1 : i]; step =3D i[1]; interval =3D i[0]; } else { step =3D Math.max(tickStep(start, stop, interval), 1); interval =3D millisecond$$1; } } return step =3D=3D null ? interval : interval.every(step); } scale.invert =3D function(y) { return new Date(invert(y)); }; scale.domain =3D function(_) { return arguments.length ? domain(map$2.call(_, number$3)) : domain().ma= p(date$1); }; scale.ticks =3D function(interval, step) { var d =3D domain(), t0 =3D d[0], t1 =3D d[d.length - 1], r =3D t1 < t0, t; if (r) t =3D t0, t0 =3D t1, t1 =3D t; t =3D tickInterval(interval, t0, t1, step); t =3D t ? t.range(t0, t1 + 1) : []; // inclusive stop return r ? t.reverse() : t; }; scale.tickFormat =3D function(count, specifier) { return specifier =3D=3D null ? tickFormat : format(specifier); }; scale.nice =3D function(interval, step) { var d =3D domain(); return (interval =3D tickInterval(interval, d[0], d[d.length - 1], step= )) ? domain(nice(d, interval)) : scale; }; scale.copy =3D function() { return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, m= inute$$1, second$$1, millisecond$$1, format)); }; return scale; } function time() { return initRange.apply(calendar(year, month, sunday, day, hour, minute, s= econd, millisecond, exports.timeFormat).domain([new Date(2000, 0, 1), new D= ate(2000, 0, 2)]), arguments); } function utcTime() { return initRange.apply(calendar(utcYear, utcMonth, utcSunday, utcDay, utc= Hour, utcMinute, second, millisecond, exports.utcFormat).domain([Date.UTC(2= 000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); } function transformer$2() { var x0 =3D 0, x1 =3D 1, t0, t1, k10, transform, interpolator =3D identity$6, clamp =3D false, unknown; function scale(x) { return isNaN(x =3D +x) ? unknown : interpolator(k10 =3D=3D=3D 0 ? 0.5 := (x =3D (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)= ); } scale.domain =3D function(_) { return arguments.length ? (t0 =3D transform(x0 =3D +_[0]), t1 =3D trans= form(x1 =3D +_[1]), k10 =3D t0 =3D=3D=3D t1 ? 0 : 1 / (t1 - t0), scale) : [= x0, x1]; }; scale.clamp =3D function(_) { return arguments.length ? (clamp =3D !!_, scale) : clamp; }; scale.interpolator =3D function(_) { return arguments.length ? (interpolator =3D _, scale) : interpolator; }; scale.unknown =3D function(_) { return arguments.length ? (unknown =3D _, scale) : unknown; }; return function(t) { transform =3D t, t0 =3D t(x0), t1 =3D t(x1), k10 =3D t0 =3D=3D=3D t1 ? = 0 : 1 / (t1 - t0); return scale; }; } function copy$1(source, target) { return target .domain(source.domain()) .interpolator(source.interpolator()) .clamp(source.clamp()) .unknown(source.unknown()); } function sequential() { var scale =3D linearish(transformer$2()(identity$6)); scale.copy =3D function() { return copy$1(scale, sequential()); }; return initInterpolator.apply(scale, arguments); } function sequentialLog() { var scale =3D loggish(transformer$2()).domain([1, 10]); scale.copy =3D function() { return copy$1(scale, sequentialLog()).base(scale.base()); }; return initInterpolator.apply(scale, arguments); } function sequentialSymlog() { var scale =3D symlogish(transformer$2()); scale.copy =3D function() { return copy$1(scale, sequentialSymlog()).constant(scale.constant()); }; return initInterpolator.apply(scale, arguments); } function sequentialPow() { var scale =3D powish(transformer$2()); scale.copy =3D function() { return copy$1(scale, sequentialPow()).exponent(scale.exponent()); }; return initInterpolator.apply(scale, arguments); } function sequentialSqrt() { return sequentialPow.apply(null, arguments).exponent(0.5); } function sequentialQuantile() { var domain =3D [], interpolator =3D identity$6; function scale(x) { if (!isNaN(x =3D +x)) return interpolator((bisectRight(domain, x) - 1) = / (domain.length - 1)); } scale.domain =3D function(_) { if (!arguments.length) return domain.slice(); domain =3D []; for (var i =3D 0, n =3D _.length, d; i < n; ++i) if (d =3D _[i], d !=3D= null && !isNaN(d =3D +d)) domain.push(d); domain.sort(ascending); return scale; }; scale.interpolator =3D function(_) { return arguments.length ? (interpolator =3D _, scale) : interpolator; }; scale.copy =3D function() { return sequentialQuantile(interpolator).domain(domain); }; return initInterpolator.apply(scale, arguments); } function transformer$3() { var x0 =3D 0, x1 =3D 0.5, x2 =3D 1, t0, t1, t2, k10, k21, interpolator =3D identity$6, transform, clamp =3D false, unknown; function scale(x) { return isNaN(x =3D +x) ? unknown : (x =3D 0.5 + ((x =3D +transform(x)) = - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, = x)) : x)); } scale.domain =3D function(_) { return arguments.length ? (t0 =3D transform(x0 =3D +_[0]), t1 =3D trans= form(x1 =3D +_[1]), t2 =3D transform(x2 =3D +_[2]), k10 =3D t0 =3D=3D=3D t1= ? 0 : 0.5 / (t1 - t0), k21 =3D t1 =3D=3D=3D t2 ? 0 : 0.5 / (t2 - t1), scal= e) : [x0, x1, x2]; }; scale.clamp =3D function(_) { return arguments.length ? (clamp =3D !!_, scale) : clamp; }; scale.interpolator =3D function(_) { return arguments.length ? (interpolator =3D _, scale) : interpolator; }; scale.unknown =3D function(_) { return arguments.length ? (unknown =3D _, scale) : unknown; }; return function(t) { transform =3D t, t0 =3D t(x0), t1 =3D t(x1), t2 =3D t(x2), k10 =3D t0 = =3D=3D=3D t1 ? 0 : 0.5 / (t1 - t0), k21 =3D t1 =3D=3D=3D t2 ? 0 : 0.5 / (t2= - t1); return scale; }; } function diverging() { var scale =3D linearish(transformer$3()(identity$6)); scale.copy =3D function() { return copy$1(scale, diverging()); }; return initInterpolator.apply(scale, arguments); } function divergingLog() { var scale =3D loggish(transformer$3()).domain([0.1, 1, 10]); scale.copy =3D function() { return copy$1(scale, divergingLog()).base(scale.base()); }; return initInterpolator.apply(scale, arguments); } function divergingSymlog() { var scale =3D symlogish(transformer$3()); scale.copy =3D function() { return copy$1(scale, divergingSymlog()).constant(scale.constant()); }; return initInterpolator.apply(scale, arguments); } function divergingPow() { var scale =3D powish(transformer$3()); scale.copy =3D function() { return copy$1(scale, divergingPow()).exponent(scale.exponent()); }; return initInterpolator.apply(scale, arguments); } function divergingSqrt() { return divergingPow.apply(null, arguments).exponent(0.5); } function colors(specifier) { var n =3D specifier.length / 6 | 0, colors =3D new Array(n), i =3D 0; while (i < n) colors[i] =3D "#" + specifier.slice(i * 6, ++i * 6); return colors; } var category10 =3D colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7f= bcbd2217becf"); var Accent =3D colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); var Dark2 =3D colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); var Paired =3D colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2= d66a3d9affff99b15928"); var Pastel1 =3D colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f= 2f2"); var Pastel2 =3D colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); var Set1 =3D colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999= "); var Set2 =3D colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); var Set3 =3D colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9= bc80bdccebc5ffed6f"); function ramp(scheme) { return rgbBasis(scheme[scheme.length - 1]); } var scheme =3D new Array(3).concat( "d8b365f5f5f55ab4ac", "a6611adfc27d80cdc1018571", "a6611adfc27df5f5f580cdc1018571", "8c510ad8b365f6e8c3c7eae55ab4ac01665e", "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" ).map(colors); var BrBG =3D ramp(scheme); var scheme$1 =3D new Array(3).concat( "af8dc3f7f7f77fbf7b", "7b3294c2a5cfa6dba0008837", "7b3294c2a5cff7f7f7a6dba0008837", "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" ).map(colors); var PRGn =3D ramp(scheme$1); var scheme$2 =3D new Array(3).concat( "e9a3c9f7f7f7a1d76a", "d01c8bf1b6dab8e1864dac26", "d01c8bf1b6daf7f7f7b8e1864dac26", "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" ).map(colors); var PiYG =3D ramp(scheme$2); var scheme$3 =3D new Array(3).concat( "998ec3f7f7f7f1a340", "5e3c99b2abd2fdb863e66101", "5e3c99b2abd2f7f7f7fdb863e66101", "542788998ec3d8daebfee0b6f1a340b35806", "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" ).map(colors); var PuOr =3D ramp(scheme$3); var scheme$4 =3D new Array(3).concat( "ef8a62f7f7f767a9cf", "ca0020f4a58292c5de0571b0", "ca0020f4a582f7f7f792c5de0571b0", "b2182bef8a62fddbc7d1e5f067a9cf2166ac", "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" ).map(colors); var RdBu =3D ramp(scheme$4); var scheme$5 =3D new Array(3).concat( "ef8a62ffffff999999", "ca0020f4a582bababa404040", "ca0020f4a582ffffffbababa404040", "b2182bef8a62fddbc7e0e0e09999994d4d4d", "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" ).map(colors); var RdGy =3D ramp(scheme$5); var scheme$6 =3D new Array(3).concat( "fc8d59ffffbf91bfdb", "d7191cfdae61abd9e92c7bb6", "d7191cfdae61ffffbfabd9e92c7bb6", "d73027fc8d59fee090e0f3f891bfdb4575b4", "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" ).map(colors); var RdYlBu =3D ramp(scheme$6); var scheme$7 =3D new Array(3).concat( "fc8d59ffffbf91cf60", "d7191cfdae61a6d96a1a9641", "d7191cfdae61ffffbfa6d96a1a9641", "d73027fc8d59fee08bd9ef8b91cf601a9850", "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" ).map(colors); var RdYlGn =3D ramp(scheme$7); var scheme$8 =3D new Array(3).concat( "fc8d59ffffbf99d594", "d7191cfdae61abdda42b83ba", "d7191cfdae61ffffbfabdda42b83ba", "d53e4ffc8d59fee08be6f59899d5943288bd", "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" ).map(colors); var Spectral =3D ramp(scheme$8); var scheme$9 =3D new Array(3).concat( "e5f5f999d8c92ca25f", "edf8fbb2e2e266c2a4238b45", "edf8fbb2e2e266c2a42ca25f006d2c", "edf8fbccece699d8c966c2a42ca25f006d2c", "edf8fbccece699d8c966c2a441ae76238b45005824", "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" ).map(colors); var BuGn =3D ramp(scheme$9); var scheme$a =3D new Array(3).concat( "e0ecf49ebcda8856a7", "edf8fbb3cde38c96c688419d", "edf8fbb3cde38c96c68856a7810f7c", "edf8fbbfd3e69ebcda8c96c68856a7810f7c", "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" ).map(colors); var BuPu =3D ramp(scheme$a); var scheme$b =3D new Array(3).concat( "e0f3dba8ddb543a2ca", "f0f9e8bae4bc7bccc42b8cbe", "f0f9e8bae4bc7bccc443a2ca0868ac", "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" ).map(colors); var GnBu =3D ramp(scheme$b); var scheme$c =3D new Array(3).concat( "fee8c8fdbb84e34a33", "fef0d9fdcc8afc8d59d7301f", "fef0d9fdcc8afc8d59e34a33b30000", "fef0d9fdd49efdbb84fc8d59e34a33b30000", "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" ).map(colors); var OrRd =3D ramp(scheme$c); var scheme$d =3D new Array(3).concat( "ece2f0a6bddb1c9099", "f6eff7bdc9e167a9cf02818a", "f6eff7bdc9e167a9cf1c9099016c59", "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" ).map(colors); var PuBuGn =3D ramp(scheme$d); var scheme$e =3D new Array(3).concat( "ece7f2a6bddb2b8cbe", "f1eef6bdc9e174a9cf0570b0", "f1eef6bdc9e174a9cf2b8cbe045a8d", "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" ).map(colors); var PuBu =3D ramp(scheme$e); var scheme$f =3D new Array(3).concat( "e7e1efc994c7dd1c77", "f1eef6d7b5d8df65b0ce1256", "f1eef6d7b5d8df65b0dd1c77980043", "f1eef6d4b9dac994c7df65b0dd1c77980043", "f1eef6d4b9dac994c7df65b0e7298ace125691003f", "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" ).map(colors); var PuRd =3D ramp(scheme$f); var scheme$g =3D new Array(3).concat( "fde0ddfa9fb5c51b8a", "feebe2fbb4b9f768a1ae017e", "feebe2fbb4b9f768a1c51b8a7a0177", "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" ).map(colors); var RdPu =3D ramp(scheme$g); var scheme$h =3D new Array(3).concat( "edf8b17fcdbb2c7fb8", "ffffcca1dab441b6c4225ea8", "ffffcca1dab441b6c42c7fb8253494", "ffffccc7e9b47fcdbb41b6c42c7fb8253494", "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" ).map(colors); var YlGnBu =3D ramp(scheme$h); var scheme$i =3D new Array(3).concat( "f7fcb9addd8e31a354", "ffffccc2e69978c679238443", "ffffccc2e69978c67931a354006837", "ffffccd9f0a3addd8e78c67931a354006837", "ffffccd9f0a3addd8e78c67941ab5d238443005a32", "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" ).map(colors); var YlGn =3D ramp(scheme$i); var scheme$j =3D new Array(3).concat( "fff7bcfec44fd95f0e", "ffffd4fed98efe9929cc4c02", "ffffd4fed98efe9929d95f0e993404", "ffffd4fee391fec44ffe9929d95f0e993404", "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" ).map(colors); var YlOrBr =3D ramp(scheme$j); var scheme$k =3D new Array(3).concat( "ffeda0feb24cf03b20", "ffffb2fecc5cfd8d3ce31a1c", "ffffb2fecc5cfd8d3cf03b20bd0026", "ffffb2fed976feb24cfd8d3cf03b20bd0026", "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" ).map(colors); var YlOrRd =3D ramp(scheme$k); var scheme$l =3D new Array(3).concat( "deebf79ecae13182bd", "eff3ffbdd7e76baed62171b5", "eff3ffbdd7e76baed63182bd08519c", "eff3ffc6dbef9ecae16baed63182bd08519c", "eff3ffc6dbef9ecae16baed64292c62171b5084594", "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" ).map(colors); var Blues =3D ramp(scheme$l); var scheme$m =3D new Array(3).concat( "e5f5e0a1d99b31a354", "edf8e9bae4b374c476238b45", "edf8e9bae4b374c47631a354006d2c", "edf8e9c7e9c0a1d99b74c47631a354006d2c", "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" ).map(colors); var Greens =3D ramp(scheme$m); var scheme$n =3D new Array(3).concat( "f0f0f0bdbdbd636363", "f7f7f7cccccc969696525252", "f7f7f7cccccc969696636363252525", "f7f7f7d9d9d9bdbdbd969696636363252525", "f7f7f7d9d9d9bdbdbd969696737373525252252525", "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" ).map(colors); var Greys =3D ramp(scheme$n); var scheme$o =3D new Array(3).concat( "efedf5bcbddc756bb1", "f2f0f7cbc9e29e9ac86a51a3", "f2f0f7cbc9e29e9ac8756bb154278f", "f2f0f7dadaebbcbddc9e9ac8756bb154278f", "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" ).map(colors); var Purples =3D ramp(scheme$o); var scheme$p =3D new Array(3).concat( "fee0d2fc9272de2d26", "fee5d9fcae91fb6a4acb181d", "fee5d9fcae91fb6a4ade2d26a50f15", "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" ).map(colors); var Reds =3D ramp(scheme$p); var scheme$q =3D new Array(3).concat( "fee6cefdae6be6550d", "feeddefdbe85fd8d3cd94701", "feeddefdbe85fd8d3ce6550da63603", "feeddefdd0a2fdae6bfd8d3ce6550da63603", "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" ).map(colors); var Oranges =3D ramp(scheme$q); var cubehelix$3 =3D cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240,= 0.5, 1.0)); var warm =3D cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50,= 0.8)); var cool =3D cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, = 0.8)); var c =3D cubehelix(); function rainbow(t) { if (t < 0 || t > 1) t -=3D Math.floor(t); var ts =3D Math.abs(t - 0.5); c.h =3D 360 * t - 100; c.s =3D 1.5 - 1.5 * ts; c.l =3D 0.8 - 0.9 * ts; return c + ""; } var c$1 =3D rgb(), pi_1_3 =3D Math.PI / 3, pi_2_3 =3D Math.PI * 2 / 3; function sinebow(t) { var x; t =3D (0.5 - t) * Math.PI; c$1.r =3D 255 * (x =3D Math.sin(t)) * x; c$1.g =3D 255 * (x =3D Math.sin(t + pi_1_3)) * x; c$1.b =3D 255 * (x =3D Math.sin(t + pi_2_3)) * x; return c$1 + ""; } function ramp$1(range) { var n =3D range.length; return function(t) { return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; }; } var viridis =3D ramp$1(colors("44015444025645045745055946075a46085c460a5d46= 0b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6= e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a47= 2d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b8= 4433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e= 4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588= c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32= 658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718= e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e28= 7d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888= e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f= 948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa08= 81fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225= ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67= 935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4a= c16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5= f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81= d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da3= 9a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2= df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e41= 8e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); var magma =3D ramp$1(colors("00000401000501010601010802010902020b02020d0303= 0f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290= e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11= 471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f11633= 1116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510= 774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5= a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d= 816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828= 125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c= 80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327da= a337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd39= 77bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd= 2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e= 65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef= 1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf876= 5cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63f= c8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea5= 71fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81f= ebd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed3= 95fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aaf= debacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); var inferno =3D ramp$1(colors("00000401000501010601010802010a02020c02020e03= 021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092= b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c4821= 0c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f36096= 13809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c= 0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136= e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e74= 1a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216= b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b= 29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305= cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c1= 3a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d2464= 4d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e1= 5635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec672= 6ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f5= 7d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa920= 7fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfc= aa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac22= 8fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5= db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f17= 9f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); var plasma =3D ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e200= 68f2206902406912605912805922a05932c05942e05952f0596310597330597350498370499= 38049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c0= 2a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a6= 6100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a8740= 1a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a6= 8707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a1981= 4a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197= a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb63= 08bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80= c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4= c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6a= da5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe46= 95ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754= ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48= 849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983e= f99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fda= b33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2a= febe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd= 225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626= f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); function constant$b(x) { return function constant() { return x; }; } var abs$1 =3D Math.abs; var atan2$1 =3D Math.atan2; var cos$2 =3D Math.cos; var max$2 =3D Math.max; var min$1 =3D Math.min; var sin$2 =3D Math.sin; var sqrt$2 =3D Math.sqrt; var epsilon$3 =3D 1e-12; var pi$4 =3D Math.PI; var halfPi$3 =3D pi$4 / 2; var tau$4 =3D 2 * pi$4; function acos$1(x) { return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x); } function asin$1(x) { return x >=3D 1 ? halfPi$3 : x <=3D -1 ? -halfPi$3 : Math.asin(x); } function arcInnerRadius(d) { return d.innerRadius; } function arcOuterRadius(d) { return d.outerRadius; } function arcStartAngle(d) { return d.startAngle; } function arcEndAngle(d) { return d.endAngle; } function arcPadAngle(d) { return d && d.padAngle; // Note: optional! } function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { var x10 =3D x1 - x0, y10 =3D y1 - y0, x32 =3D x3 - x2, y32 =3D y3 - y2, t =3D y32 * x10 - x32 * y10; if (t * t < epsilon$3) return; t =3D (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; return [x0 + t * x10, y0 + t * y10]; } // Compute perpendicular offset line of length rc. // http://mathworld.wolfram.com/Circle-LineIntersection.html function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { var x01 =3D x0 - x1, y01 =3D y0 - y1, lo =3D (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01), ox =3D lo * y01, oy =3D -lo * x01, x11 =3D x0 + ox, y11 =3D y0 + oy, x10 =3D x1 + ox, y10 =3D y1 + oy, x00 =3D (x11 + x10) / 2, y00 =3D (y11 + y10) / 2, dx =3D x10 - x11, dy =3D y10 - y11, d2 =3D dx * dx + dy * dy, r =3D r1 - rc, D =3D x11 * y10 - x10 * y11, d =3D (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)), cx0 =3D (D * dy - dx * d) / d2, cy0 =3D (-D * dx - dy * d) / d2, cx1 =3D (D * dy + dx * d) / d2, cy1 =3D (-D * dx + dy * d) / d2, dx0 =3D cx0 - x00, dy0 =3D cy0 - y00, dx1 =3D cx1 - x00, dy1 =3D cy1 - y00; // Pick the closer of the two intersection points. // TODO Is there a faster way to determine which intersection to use? if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 =3D cx1, cy0 =3D c= y1; return { cx: cx0, cy: cy0, x01: -ox, y01: -oy, x11: cx0 * (r1 / r - 1), y11: cy0 * (r1 / r - 1) }; } function arc() { var innerRadius =3D arcInnerRadius, outerRadius =3D arcOuterRadius, cornerRadius =3D constant$b(0), padRadius =3D null, startAngle =3D arcStartAngle, endAngle =3D arcEndAngle, padAngle =3D arcPadAngle, context =3D null; function arc() { var buffer, r, r0 =3D +innerRadius.apply(this, arguments), r1 =3D +outerRadius.apply(this, arguments), a0 =3D startAngle.apply(this, arguments) - halfPi$3, a1 =3D endAngle.apply(this, arguments) - halfPi$3, da =3D abs$1(a1 - a0), cw =3D a1 > a0; if (!context) context =3D buffer =3D path(); // Ensure that the outer radius is always larger than the inner radius. if (r1 < r0) r =3D r1, r1 =3D r0, r0 =3D r; // Is it a point? if (!(r1 > epsilon$3)) context.moveTo(0, 0); // Or is it a circle or annulus? else if (da > tau$4 - epsilon$3) { context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0)); context.arc(0, 0, r1, a0, a1, !cw); if (r0 > epsilon$3) { context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1)); context.arc(0, 0, r0, a1, a0, cw); } } // Or is it a circular or annular sector? else { var a01 =3D a0, a11 =3D a1, a00 =3D a0, a10 =3D a1, da0 =3D da, da1 =3D da, ap =3D padAngle.apply(this, arguments) / 2, rp =3D (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, ar= guments) : sqrt$2(r0 * r0 + r1 * r1)), rc =3D min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, argume= nts)), rc0 =3D rc, rc1 =3D rc, t0, t1; // Apply padding? Note that since r1 =E2=89=A5 r0, da1 =E2=89=A5 da0. if (rp > epsilon$3) { var p0 =3D asin$1(rp / r0 * sin$2(ap)), p1 =3D asin$1(rp / r1 * sin$2(ap)); if ((da0 -=3D p0 * 2) > epsilon$3) p0 *=3D (cw ? 1 : -1), a00 +=3D = p0, a10 -=3D p0; else da0 =3D 0, a00 =3D a10 =3D (a0 + a1) / 2; if ((da1 -=3D p1 * 2) > epsilon$3) p1 *=3D (cw ? 1 : -1), a01 +=3D = p1, a11 -=3D p1; else da1 =3D 0, a01 =3D a11 =3D (a0 + a1) / 2; } var x01 =3D r1 * cos$2(a01), y01 =3D r1 * sin$2(a01), x10 =3D r0 * cos$2(a10), y10 =3D r0 * sin$2(a10); // Apply rounded corners? if (rc > epsilon$3) { var x11 =3D r1 * cos$2(a11), y11 =3D r1 * sin$2(a11), x00 =3D r0 * cos$2(a00), y00 =3D r0 * sin$2(a00), oc; // Restrict the corner radius according to the sector angle. if (da < pi$4 && (oc =3D intersect(x01, y01, x00, y00, x11, y11, x1= 0, y10))) { var ax =3D x01 - oc[0], ay =3D y01 - oc[1], bx =3D x11 - oc[0], by =3D y11 - oc[1], kc =3D 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax= + ay * ay) * sqrt$2(bx * bx + by * by))) / 2), lc =3D sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]); rc0 =3D min$1(rc, (r0 - lc) / (kc - 1)); rc1 =3D min$1(rc, (r1 - lc) / (kc + 1)); } } // Is the sector collapsed to a line? if (!(da1 > epsilon$3)) context.moveTo(x01, y01); // Does the sector=E2=80=99s outer ring have rounded corners? else if (rc1 > epsilon$3) { t0 =3D cornerTangents(x00, y00, x01, y01, r1, rc1, cw); t1 =3D cornerTangents(x11, y11, x10, y10, r1, rc1, cw); context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); // Have the corners merged? if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01= ), atan2$1(t1.y01, t1.x01), !cw); // Otherwise, draw the two corners and the ring. else { context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t= 0.y11, t0.x11), !cw); context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), at= an2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw); context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t= 1.y01, t1.x01), !cw); } } // Or is the outer ring just a circular arc? else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); // Is there no inner ring, and it=E2=80=99s a circular sector? // Or perhaps it=E2=80=99s an annular sector collapsed due to padding? if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10); // Does the sector=E2=80=99s inner ring (or point) have rounded corne= rs? else if (rc0 > epsilon$3) { t0 =3D cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); t1 =3D cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); // Have the corners merged? if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01= ), atan2$1(t1.y01, t1.x01), !cw); // Otherwise, draw the two corners and the ring. else { context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t= 0.y11, t0.x11), !cw); context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), at= an2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw); context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t= 1.y01, t1.x01), !cw); } } // Or is the inner ring just a circular arc? else context.arc(0, 0, r0, a10, a00, cw); } context.closePath(); if (buffer) return context =3D null, buffer + "" || null; } arc.centroid =3D function() { var r =3D (+innerRadius.apply(this, arguments) + +outerRadius.apply(thi= s, arguments)) / 2, a =3D (+startAngle.apply(this, arguments) + +endAngle.apply(this, a= rguments)) / 2 - pi$4 / 2; return [cos$2(a) * r, sin$2(a) * r]; }; arc.innerRadius =3D function(_) { return arguments.length ? (innerRadius =3D typeof _ =3D=3D=3D "function= " ? _ : constant$b(+_), arc) : innerRadius; }; arc.outerRadius =3D function(_) { return arguments.length ? (outerRadius =3D typeof _ =3D=3D=3D "function= " ? _ : constant$b(+_), arc) : outerRadius; }; arc.cornerRadius =3D function(_) { return arguments.length ? (cornerRadius =3D typeof _ =3D=3D=3D "functio= n" ? _ : constant$b(+_), arc) : cornerRadius; }; arc.padRadius =3D function(_) { return arguments.length ? (padRadius =3D _ =3D=3D null ? null : typeof = _ =3D=3D=3D "function" ? _ : constant$b(+_), arc) : padRadius; }; arc.startAngle =3D function(_) { return arguments.length ? (startAngle =3D typeof _ =3D=3D=3D "function"= ? _ : constant$b(+_), arc) : startAngle; }; arc.endAngle =3D function(_) { return arguments.length ? (endAngle =3D typeof _ =3D=3D=3D "function" ?= _ : constant$b(+_), arc) : endAngle; }; arc.padAngle =3D function(_) { return arguments.length ? (padAngle =3D typeof _ =3D=3D=3D "function" ?= _ : constant$b(+_), arc) : padAngle; }; arc.context =3D function(_) { return arguments.length ? ((context =3D _ =3D=3D null ? null : _), arc)= : context; }; return arc; } function Linear(context) { this._context =3D context; } Linear.prototype =3D { areaStart: function() { this._line =3D 0; }, areaEnd: function() { this._line =3D NaN; }, lineStart: function() { this._point =3D 0; }, lineEnd: function() { if (this._line || (this._line !=3D=3D 0 && this._point =3D=3D=3D 1)) th= is._context.closePath(); this._line =3D 1 - this._line; }, point: function(x, y) { x =3D +x, y =3D +y; switch (this._point) { case 0: this._point =3D 1; this._line ? this._context.lineTo(x, y) : = this._context.moveTo(x, y); break; case 1: this._point =3D 2; // proceed default: this._context.lineTo(x, y); break; } } }; function curveLinear(context) { return new Linear(context); } function x$3(p) { return p[0]; } function y$3(p) { return p[1]; } function line() { var x$$1 =3D x$3, y$$1 =3D y$3, defined =3D constant$b(true), context =3D null, curve =3D curveLinear, output =3D null; function line(data) { var i, n =3D data.length, d, defined0 =3D false, buffer; if (context =3D=3D null) output =3D curve(buffer =3D path()); for (i =3D 0; i <=3D n; ++i) { if (!(i < n && defined(d =3D data[i], i, data)) =3D=3D=3D defined0) { if (defined0 =3D !defined0) output.lineStart(); else output.lineEnd(); } if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data)); } if (buffer) return output =3D null, buffer + "" || null; } line.x =3D function(_) { return arguments.length ? (x$$1 =3D typeof _ =3D=3D=3D "function" ? _ := constant$b(+_), line) : x$$1; }; line.y =3D function(_) { return arguments.length ? (y$$1 =3D typeof _ =3D=3D=3D "function" ? _ := constant$b(+_), line) : y$$1; }; line.defined =3D function(_) { return arguments.length ? (defined =3D typeof _ =3D=3D=3D "function" ? = _ : constant$b(!!_), line) : defined; }; line.curve =3D function(_) { return arguments.length ? (curve =3D _, context !=3D null && (output = =3D curve(context)), line) : curve; }; line.context =3D function(_) { return arguments.length ? (_ =3D=3D null ? context =3D output =3D null = : output =3D curve(context =3D _), line) : context; }; return line; } function area$3() { var x0 =3D x$3, x1 =3D null, y0 =3D constant$b(0), y1 =3D y$3, defined =3D constant$b(true), context =3D null, curve =3D curveLinear, output =3D null; function area(data) { var i, j, k, n =3D data.length, d, defined0 =3D false, buffer, x0z =3D new Array(n), y0z =3D new Array(n); if (context =3D=3D null) output =3D curve(buffer =3D path()); for (i =3D 0; i <=3D n; ++i) { if (!(i < n && defined(d =3D data[i], i, data)) =3D=3D=3D defined0) { if (defined0 =3D !defined0) { j =3D i; output.areaStart(); output.lineStart(); } else { output.lineEnd(); output.lineStart(); for (k =3D i - 1; k >=3D j; --k) { output.point(x0z[k], y0z[k]); } output.lineEnd(); output.areaEnd(); } } if (defined0) { x0z[i] =3D +x0(d, i, data), y0z[i] =3D +y0(d, i, data); output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : = y0z[i]); } } if (buffer) return output =3D null, buffer + "" || null; } function arealine() { return line().defined(defined).curve(curve).context(context); } area.x =3D function(_) { return arguments.length ? (x0 =3D typeof _ =3D=3D=3D "function" ? _ : c= onstant$b(+_), x1 =3D null, area) : x0; }; area.x0 =3D function(_) { return arguments.length ? (x0 =3D typeof _ =3D=3D=3D "function" ? _ : c= onstant$b(+_), area) : x0; }; area.x1 =3D function(_) { return arguments.length ? (x1 =3D _ =3D=3D null ? null : typeof _ =3D= =3D=3D "function" ? _ : constant$b(+_), area) : x1; }; area.y =3D function(_) { return arguments.length ? (y0 =3D typeof _ =3D=3D=3D "function" ? _ : c= onstant$b(+_), y1 =3D null, area) : y0; }; area.y0 =3D function(_) { return arguments.length ? (y0 =3D typeof _ =3D=3D=3D "function" ? _ : c= onstant$b(+_), area) : y0; }; area.y1 =3D function(_) { return arguments.length ? (y1 =3D _ =3D=3D null ? null : typeof _ =3D= =3D=3D "function" ? _ : constant$b(+_), area) : y1; }; area.lineX0 =3D area.lineY0 =3D function() { return arealine().x(x0).y(y0); }; area.lineY1 =3D function() { return arealine().x(x0).y(y1); }; area.lineX1 =3D function() { return arealine().x(x1).y(y0); }; area.defined =3D function(_) { return arguments.length ? (defined =3D typeof _ =3D=3D=3D "function" ? = _ : constant$b(!!_), area) : defined; }; area.curve =3D function(_) { return arguments.length ? (curve =3D _, context !=3D null && (output = =3D curve(context)), area) : curve; }; area.context =3D function(_) { return arguments.length ? (_ =3D=3D null ? context =3D output =3D null = : output =3D curve(context =3D _), area) : context; }; return area; } function descending$1(a, b) { return b < a ? -1 : b > a ? 1 : b >=3D a ? 0 : NaN; } function identity$8(d) { return d; } function pie() { var value =3D identity$8, sortValues =3D descending$1, sort =3D null, startAngle =3D constant$b(0), endAngle =3D constant$b(tau$4), padAngle =3D constant$b(0); function pie(data) { var i, n =3D data.length, j, k, sum =3D 0, index =3D new Array(n), arcs =3D new Array(n), a0 =3D +startAngle.apply(this, arguments), da =3D Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, argume= nts) - a0)), a1, p =3D Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), pa =3D p * (da < 0 ? -1 : 1), v; for (i =3D 0; i < n; ++i) { if ((v =3D arcs[index[i] =3D i] =3D +value(data[i], i, data)) > 0) { sum +=3D v; } } // Optionally sort the arcs by previously-computed values or by data. if (sortValues !=3D null) index.sort(function(i, j) { return sortValues= (arcs[i], arcs[j]); }); else if (sort !=3D null) index.sort(function(i, j) { return sort(data[i= ], data[j]); }); // Compute the arcs! They are stored in the original data's order. for (i =3D 0, k =3D sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 =3D a= 1) { j =3D index[i], v =3D arcs[j], a1 =3D a0 + (v > 0 ? v * k : 0) + pa, = arcs[j] =3D { data: data[j], index: i, value: v, startAngle: a0, endAngle: a1, padAngle: p }; } return arcs; } pie.value =3D function(_) { return arguments.length ? (value =3D typeof _ =3D=3D=3D "function" ? _ = : constant$b(+_), pie) : value; }; pie.sortValues =3D function(_) { return arguments.length ? (sortValues =3D _, sort =3D null, pie) : sort= Values; }; pie.sort =3D function(_) { return arguments.length ? (sort =3D _, sortValues =3D null, pie) : sort; }; pie.startAngle =3D function(_) { return arguments.length ? (startAngle =3D typeof _ =3D=3D=3D "function"= ? _ : constant$b(+_), pie) : startAngle; }; pie.endAngle =3D function(_) { return arguments.length ? (endAngle =3D typeof _ =3D=3D=3D "function" ?= _ : constant$b(+_), pie) : endAngle; }; pie.padAngle =3D function(_) { return arguments.length ? (padAngle =3D typeof _ =3D=3D=3D "function" ?= _ : constant$b(+_), pie) : padAngle; }; return pie; } var curveRadialLinear =3D curveRadial(curveLinear); function Radial(curve) { this._curve =3D curve; } Radial.prototype =3D { areaStart: function() { this._curve.areaStart(); }, areaEnd: function() { this._curve.areaEnd(); }, lineStart: function() { this._curve.lineStart(); }, lineEnd: function() { this._curve.lineEnd(); }, point: function(a, r) { this._curve.point(r * Math.sin(a), r * -Math.cos(a)); } }; function curveRadial(curve) { function radial(context) { return new Radial(curve(context)); } radial._curve =3D curve; return radial; } function lineRadial(l) { var c =3D l.curve; l.angle =3D l.x, delete l.x; l.radius =3D l.y, delete l.y; l.curve =3D function(_) { return arguments.length ? c(curveRadial(_)) : c()._curve; }; return l; } function lineRadial$1() { return lineRadial(line().curve(curveRadialLinear)); } function areaRadial() { var a =3D area$3().curve(curveRadialLinear), c =3D a.curve, x0 =3D a.lineX0, x1 =3D a.lineX1, y0 =3D a.lineY0, y1 =3D a.lineY1; a.angle =3D a.x, delete a.x; a.startAngle =3D a.x0, delete a.x0; a.endAngle =3D a.x1, delete a.x1; a.radius =3D a.y, delete a.y; a.innerRadius =3D a.y0, delete a.y0; a.outerRadius =3D a.y1, delete a.y1; a.lineStartAngle =3D function() { return lineRadial(x0()); }, delete a.li= neX0; a.lineEndAngle =3D function() { return lineRadial(x1()); }, delete a.line= X1; a.lineInnerRadius =3D function() { return lineRadial(y0()); }, delete a.l= ineY0; a.lineOuterRadius =3D function() { return lineRadial(y1()); }, delete a.l= ineY1; a.curve =3D function(_) { return arguments.length ? c(curveRadial(_)) : c()._curve; }; return a; } function pointRadial(x, y) { return [(y =3D +y) * Math.cos(x -=3D Math.PI / 2), y * Math.sin(x)]; } var slice$6 =3D Array.prototype.slice; function linkSource(d) { return d.source; } function linkTarget(d) { return d.target; } function link$2(curve) { var source =3D linkSource, target =3D linkTarget, x$$1 =3D x$3, y$$1 =3D y$3, context =3D null; function link() { var buffer, argv =3D slice$6.call(arguments), s =3D source.apply(this, = argv), t =3D target.apply(this, argv); if (!context) context =3D buffer =3D path(); curve(context, +x$$1.apply(this, (argv[0] =3D s, argv)), +y$$1.apply(th= is, argv), +x$$1.apply(this, (argv[0] =3D t, argv)), +y$$1.apply(this, argv= )); if (buffer) return context =3D null, buffer + "" || null; } link.source =3D function(_) { return arguments.length ? (source =3D _, link) : source; }; link.target =3D function(_) { return arguments.length ? (target =3D _, link) : target; }; link.x =3D function(_) { return arguments.length ? (x$$1 =3D typeof _ =3D=3D=3D "function" ? _ := constant$b(+_), link) : x$$1; }; link.y =3D function(_) { return arguments.length ? (y$$1 =3D typeof _ =3D=3D=3D "function" ? _ := constant$b(+_), link) : y$$1; }; link.context =3D function(_) { return arguments.length ? ((context =3D _ =3D=3D null ? null : _), link= ) : context; }; return link; } function curveHorizontal(context, x0, y0, x1, y1) { context.moveTo(x0, y0); context.bezierCurveTo(x0 =3D (x0 + x1) / 2, y0, x0, y1, x1, y1); } function curveVertical(context, x0, y0, x1, y1) { context.moveTo(x0, y0); context.bezierCurveTo(x0, y0 =3D (y0 + y1) / 2, x1, y0, x1, y1); } function curveRadial$1(context, x0, y0, x1, y1) { var p0 =3D pointRadial(x0, y0), p1 =3D pointRadial(x0, y0 =3D (y0 + y1) / 2), p2 =3D pointRadial(x1, y0), p3 =3D pointRadial(x1, y1); context.moveTo(p0[0], p0[1]); context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); } function linkHorizontal() { return link$2(curveHorizontal); } function linkVertical() { return link$2(curveVertical); } function linkRadial() { var l =3D link$2(curveRadial$1); l.angle =3D l.x, delete l.x; l.radius =3D l.y, delete l.y; return l; } var circle$2 =3D { draw: function(context, size) { var r =3D Math.sqrt(size / pi$4); context.moveTo(r, 0); context.arc(0, 0, r, 0, tau$4); } }; var cross$2 =3D { draw: function(context, size) { var r =3D Math.sqrt(size / 5) / 2; context.moveTo(-3 * r, -r); context.lineTo(-r, -r); context.lineTo(-r, -3 * r); context.lineTo(r, -3 * r); context.lineTo(r, -r); context.lineTo(3 * r, -r); context.lineTo(3 * r, r); context.lineTo(r, r); context.lineTo(r, 3 * r); context.lineTo(-r, 3 * r); context.lineTo(-r, r); context.lineTo(-3 * r, r); context.closePath(); } }; var tan30 =3D Math.sqrt(1 / 3), tan30_2 =3D tan30 * 2; var diamond =3D { draw: function(context, size) { var y =3D Math.sqrt(size / tan30_2), x =3D y * tan30; context.moveTo(0, -y); context.lineTo(x, 0); context.lineTo(0, y); context.lineTo(-x, 0); context.closePath(); } }; var ka =3D 0.89081309152928522810, kr =3D Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10), kx =3D Math.sin(tau$4 / 10) * kr, ky =3D -Math.cos(tau$4 / 10) * kr; var star =3D { draw: function(context, size) { var r =3D Math.sqrt(size * ka), x =3D kx * r, y =3D ky * r; context.moveTo(0, -r); context.lineTo(x, y); for (var i =3D 1; i < 5; ++i) { var a =3D tau$4 * i / 5, c =3D Math.cos(a), s =3D Math.sin(a); context.lineTo(s * r, -c * r); context.lineTo(c * x - s * y, s * x + c * y); } context.closePath(); } }; var square =3D { draw: function(context, size) { var w =3D Math.sqrt(size), x =3D -w / 2; context.rect(x, x, w, w); } }; var sqrt3 =3D Math.sqrt(3); var triangle =3D { draw: function(context, size) { var y =3D -Math.sqrt(size / (sqrt3 * 3)); context.moveTo(0, y * 2); context.lineTo(-sqrt3 * y, -y); context.lineTo(sqrt3 * y, -y); context.closePath(); } }; var c$2 =3D -0.5, s =3D Math.sqrt(3) / 2, k =3D 1 / Math.sqrt(12), a =3D (k / 2 + 1) * 3; var wye =3D { draw: function(context, size) { var r =3D Math.sqrt(size / a), x0 =3D r / 2, y0 =3D r * k, x1 =3D x0, y1 =3D r * k + r, x2 =3D -x1, y2 =3D y1; context.moveTo(x0, y0); context.lineTo(x1, y1); context.lineTo(x2, y2); context.lineTo(c$2 * x0 - s * y0, s * x0 + c$2 * y0); context.lineTo(c$2 * x1 - s * y1, s * x1 + c$2 * y1); context.lineTo(c$2 * x2 - s * y2, s * x2 + c$2 * y2); context.lineTo(c$2 * x0 + s * y0, c$2 * y0 - s * x0); context.lineTo(c$2 * x1 + s * y1, c$2 * y1 - s * x1); context.lineTo(c$2 * x2 + s * y2, c$2 * y2 - s * x2); context.closePath(); } }; var symbols =3D [ circle$2, cross$2, diamond, square, star, triangle, wye ]; function symbol() { var type =3D constant$b(circle$2), size =3D constant$b(64), context =3D null; function symbol() { var buffer; if (!context) context =3D buffer =3D path(); type.apply(this, arguments).draw(context, +size.apply(this, arguments)); if (buffer) return context =3D null, buffer + "" || null; } symbol.type =3D function(_) { return arguments.length ? (type =3D typeof _ =3D=3D=3D "function" ? _ := constant$b(_), symbol) : type; }; symbol.size =3D function(_) { return arguments.length ? (size =3D typeof _ =3D=3D=3D "function" ? _ := constant$b(+_), symbol) : size; }; symbol.context =3D function(_) { return arguments.length ? (context =3D _ =3D=3D null ? null : _, symbol= ) : context; }; return symbol; } function noop$3() {} function point$2(that, x, y) { that._context.bezierCurveTo( (2 * that._x0 + that._x1) / 3, (2 * that._y0 + that._y1) / 3, (that._x0 + 2 * that._x1) / 3, (that._y0 + 2 * that._y1) / 3, (that._x0 + 4 * that._x1 + x) / 6, (that._y0 + 4 * that._y1 + y) / 6 ); } function Basis(context) { this._context =3D context; } Basis.prototype =3D { areaStart: function() { this._line =3D 0; }, areaEnd: function() { this._line =3D NaN; }, lineStart: function() { this._x0 =3D this._x1 =3D this._y0 =3D this._y1 =3D NaN; this._point =3D 0; }, lineEnd: function() { switch (this._point) { case 3: point$2(this, this._x1, this._y1); // proceed case 2: this._context.lineTo(this._x1, this._y1); break; } if (this._line || (this._line !=3D=3D 0 && this._point =3D=3D=3D 1)) th= is._context.closePath(); this._line =3D 1 - this._line; }, point: function(x, y) { x =3D +x, y =3D +y; switch (this._point) { case 0: this._point =3D 1; this._line ? this._context.lineTo(x, y) : = this._context.moveTo(x, y); break; case 1: this._point =3D 2; break; case 2: this._point =3D 3; this._context.lineTo((5 * this._x0 + this.= _x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed default: point$2(this, x, y); break; } this._x0 =3D this._x1, this._x1 =3D x; this._y0 =3D this._y1, this._y1 =3D y; } }; function basis$2(context) { return new Basis(context); } function BasisClosed(context) { this._context =3D context; } BasisClosed.prototype =3D { areaStart: noop$3, areaEnd: noop$3, lineStart: function() { this._x0 =3D this._x1 =3D this._x2 =3D this._x3 =3D this._x4 =3D this._y0 =3D this._y1 =3D this._y2 =3D this._y3 =3D this._y4 =3D NaN; this._point =3D 0; }, lineEnd: function() { switch (this._point) { case 1: { this._context.moveTo(this._x2, this._y2); this._context.closePath(); break; } case 2: { this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 *= this._y3) / 3); this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 *= this._y2) / 3); this._context.closePath(); break; } case 3: { this.point(this._x2, this._y2); this.point(this._x3, this._y3); this.point(this._x4, this._y4); break; } } }, point: function(x, y) { x =3D +x, y =3D +y; switch (this._point) { case 0: this._point =3D 1; this._x2 =3D x, this._y2 =3D y; break; case 1: this._point =3D 2; this._x3 =3D x, this._y3 =3D y; break; case 2: this._point =3D 3; this._x4 =3D x, this._y4 =3D y; this._cont= ext.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y)= / 6); break; default: point$2(this, x, y); break; } this._x0 =3D this._x1, this._x1 =3D x; this._y0 =3D this._y1, this._y1 =3D y; } }; function basisClosed$1(context) { return new BasisClosed(context); } function BasisOpen(context) { this._context =3D context; } BasisOpen.prototype =3D { areaStart: function() { this._line =3D 0; }, areaEnd: function() { this._line =3D NaN; }, lineStart: function() { this._x0 =3D this._x1 =3D this._y0 =3D this._y1 =3D NaN; this._point =3D 0; }, lineEnd: function() { if (this._line || (this._line !=3D=3D 0 && this._point =3D=3D=3D 3)) th= is._context.closePath(); this._line =3D 1 - this._line; }, point: function(x, y) { x =3D +x, y =3D +y; switch (this._point) { case 0: this._point =3D 1; break; case 1: this._point =3D 2; break; case 2: this._point =3D 3; var x0 =3D (this._x0 + 4 * this._x1 + x) /= 6, y0 =3D (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.li= neTo(x0, y0) : this._context.moveTo(x0, y0); break; case 3: this._point =3D 4; // proceed default: point$2(this, x, y); break; } this._x0 =3D this._x1, this._x1 =3D x; this._y0 =3D this._y1, this._y1 =3D y; } }; function basisOpen(context) { return new BasisOpen(context); } function Bundle(context, beta) { this._basis =3D new Basis(context); this._beta =3D beta; } Bundle.prototype =3D { lineStart: function() { this._x =3D []; this._y =3D []; this._basis.lineStart(); }, lineEnd: function() { var x =3D this._x, y =3D this._y, j =3D x.length - 1; if (j > 0) { var x0 =3D x[0], y0 =3D y[0], dx =3D x[j] - x0, dy =3D y[j] - y0, i =3D -1, t; while (++i <=3D j) { t =3D i / j; this._basis.point( this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) ); } } this._x =3D this._y =3D null; this._basis.lineEnd(); }, point: function(x, y) { this._x.push(+x); this._y.push(+y); } }; var bundle =3D (function custom(beta) { function bundle(context) { return beta =3D=3D=3D 1 ? new Basis(context) : new Bundle(context, beta= ); } bundle.beta =3D function(beta) { return custom(+beta); }; return bundle; })(0.85); function point$3(that, x, y) { that._context.bezierCurveTo( that._x1 + that._k * (that._x2 - that._x0), that._y1 + that._k * (that._y2 - that._y0), that._x2 + that._k * (that._x1 - x), that._y2 + that._k * (that._y1 - y), that._x2, that._y2 ); } function Cardinal(context, tension) { this._context =3D context; this._k =3D (1 - tension) / 6; } Cardinal.prototype =3D { areaStart: function() { this._line =3D 0; }, areaEnd: function() { this._line =3D NaN; }, lineStart: function() { this._x0 =3D this._x1 =3D this._x2 =3D this._y0 =3D this._y1 =3D this._y2 =3D NaN; this._point =3D 0; }, lineEnd: function() { switch (this._point) { case 2: this._context.lineTo(this._x2, this._y2); break; case 3: point$3(this, this._x1, this._y1); break; } if (this._line || (this._line !=3D=3D 0 && this._point =3D=3D=3D 1)) th= is._context.closePath(); this._line =3D 1 - this._line; }, point: function(x, y) { x =3D +x, y =3D +y; switch (this._point) { case 0: this._point =3D 1; this._line ? this._context.lineTo(x, y) : = this._context.moveTo(x, y); break; case 1: this._point =3D 2; this._x1 =3D x, this._y1 =3D y; break; case 2: this._point =3D 3; // proceed default: point$3(this, x, y); break; } this._x0 =3D this._x1, this._x1 =3D this._x2, this._x2 =3D x; this._y0 =3D this._y1, this._y1 =3D this._y2, this._y2 =3D y; } }; var cardinal =3D (function custom(tension) { function cardinal(context) { return new Cardinal(context, tension); } cardinal.tension =3D function(tension) { return custom(+tension); }; return cardinal; })(0); function CardinalClosed(context, tension) { this._context =3D context; this._k =3D (1 - tension) / 6; } CardinalClosed.prototype =3D { areaStart: noop$3, areaEnd: noop$3, lineStart: function() { this._x0 =3D this._x1 =3D this._x2 =3D this._x3 =3D this._x4 =3D this._= x5 =3D this._y0 =3D this._y1 =3D this._y2 =3D this._y3 =3D this._y4 =3D this._= y5 =3D NaN; this._point =3D 0; }, lineEnd: function() { switch (this._point) { case 1: { this._context.moveTo(this._x3, this._y3); this._context.closePath(); break; } case 2: { this._context.lineTo(this._x3, this._y3); this._context.closePath(); break; } case 3: { this.point(this._x3, this._y3); this.point(this._x4, this._y4); this.point(this._x5, this._y5); break; } } }, point: function(x, y) { x =3D +x, y =3D +y; switch (this._point) { case 0: this._point =3D 1; this._x3 =3D x, this._y3 =3D y; break; case 1: this._point =3D 2; this._context.moveTo(this._x4 =3D x, this.= _y4 =3D y); break; case 2: this._point =3D 3; this._x5 =3D x, this._y5 =3D y; break; default: point$3(this, x, y); break; } this._x0 =3D this._x1, this._x1 =3D this._x2, this._x2 =3D x; this._y0 =3D this._y1, this._y1 =3D this._y2, this._y2 =3D y; } }; var cardinalClosed =3D (function custom(tension) { function cardinal$$1(context) { return new CardinalClosed(context, tension); } cardinal$$1.tension =3D function(tension) { return custom(+tension); }; return cardinal$$1; })(0); function CardinalOpen(context, tension) { this._context =3D context; this._k =3D (1 - tension) / 6; } CardinalOpen.prototype =3D { areaStart: function() { this._line =3D 0; }, areaEnd: function() { this._line =3D NaN; }, lineStart: function() { this._x0 =3D this._x1 =3D this._x2 =3D this._y0 =3D this._y1 =3D this._y2 =3D NaN; this._point =3D 0; }, lineEnd: function() { if (this._line || (this._line !=3D=3D 0 && this._point =3D=3D=3D 3)) th= is._context.closePath(); this._line =3D 1 - this._line; }, point: function(x, y) { x =3D +x, y =3D +y; switch (this._point) { case 0: this._point =3D 1; break; case 1: this._point =3D 2; break; case 2: this._point =3D 3; this._line ? this._context.lineTo(this._x2= , this._y2) : this._context.moveTo(this._x2, this._y2); break; case 3: this._point =3D 4; // proceed default: point$3(this, x, y); break; } this._x0 =3D this._x1, this._x1 =3D this._x2, this._x2 =3D x; this._y0 =3D this._y1, this._y1 =3D this._y2, this._y2 =3D y; } }; var cardinalOpen =3D (function custom(tension) { function cardinal$$1(context) { return new CardinalOpen(context, tension); } cardinal$$1.tension =3D function(tension) { return custom(+tension); }; return cardinal$$1; })(0); function point$4(that, x, y) { var x1 =3D that._x1, y1 =3D that._y1, x2 =3D that._x2, y2 =3D that._y2; if (that._l01_a > epsilon$3) { var a =3D 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_= 2a, n =3D 3 * that._l01_a * (that._l01_a + that._l12_a); x1 =3D (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; y1 =3D (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; } if (that._l23_a > epsilon$3) { var b =3D 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_= 2a, m =3D 3 * that._l23_a * (that._l23_a + that._l12_a); x2 =3D (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; y2 =3D (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; } that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); } function CatmullRom(context, alpha) { this._context =3D context; this._alpha =3D alpha; } CatmullRom.prototype =3D { areaStart: function() { this._line =3D 0; }, areaEnd: function() { this._line =3D NaN; }, lineStart: function() { this._x0 =3D this._x1 =3D this._x2 =3D this._y0 =3D this._y1 =3D this._y2 =3D NaN; this._l01_a =3D this._l12_a =3D this._l23_a =3D this._l01_2a =3D this._l12_2a =3D this._l23_2a =3D this._point =3D 0; }, lineEnd: function() { switch (this._point) { case 2: this._context.lineTo(this._x2, this._y2); break; case 3: this.point(this._x2, this._y2); break; } if (this._line || (this._line !=3D=3D 0 && this._point =3D=3D=3D 1)) th= is._context.closePath(); this._line =3D 1 - this._line; }, point: function(x, y) { x =3D +x, y =3D +y; if (this._point) { var x23 =3D this._x2 - x, y23 =3D this._y2 - y; this._l23_a =3D Math.sqrt(this._l23_2a =3D Math.pow(x23 * x23 + y23 *= y23, this._alpha)); } switch (this._point) { case 0: this._point =3D 1; this._line ? this._context.lineTo(x, y) : = this._context.moveTo(x, y); break; case 1: this._point =3D 2; break; case 2: this._point =3D 3; // proceed default: point$4(this, x, y); break; } this._l01_a =3D this._l12_a, this._l12_a =3D this._l23_a; this._l01_2a =3D this._l12_2a, this._l12_2a =3D this._l23_2a; this._x0 =3D this._x1, this._x1 =3D this._x2, this._x2 =3D x; this._y0 =3D this._y1, this._y1 =3D this._y2, this._y2 =3D y; } }; var catmullRom =3D (function custom(alpha) { function catmullRom(context) { return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0= ); } catmullRom.alpha =3D function(alpha) { return custom(+alpha); }; return catmullRom; })(0.5); function CatmullRomClosed(context, alpha) { this._context =3D context; this._alpha =3D alpha; } CatmullRomClosed.prototype =3D { areaStart: noop$3, areaEnd: noop$3, lineStart: function() { this._x0 =3D this._x1 =3D this._x2 =3D this._x3 =3D this._x4 =3D this._= x5 =3D this._y0 =3D this._y1 =3D this._y2 =3D this._y3 =3D this._y4 =3D this._= y5 =3D NaN; this._l01_a =3D this._l12_a =3D this._l23_a =3D this._l01_2a =3D this._l12_2a =3D this._l23_2a =3D this._point =3D 0; }, lineEnd: function() { switch (this._point) { case 1: { this._context.moveTo(this._x3, this._y3); this._context.closePath(); break; } case 2: { this._context.lineTo(this._x3, this._y3); this._context.closePath(); break; } case 3: { this.point(this._x3, this._y3); this.point(this._x4, this._y4); this.point(this._x5, this._y5); break; } } }, point: function(x, y) { x =3D +x, y =3D +y; if (this._point) { var x23 =3D this._x2 - x, y23 =3D this._y2 - y; this._l23_a =3D Math.sqrt(this._l23_2a =3D Math.pow(x23 * x23 + y23 *= y23, this._alpha)); } switch (this._point) { case 0: this._point =3D 1; this._x3 =3D x, this._y3 =3D y; break; case 1: this._point =3D 2; this._context.moveTo(this._x4 =3D x, this.= _y4 =3D y); break; case 2: this._point =3D 3; this._x5 =3D x, this._y5 =3D y; break; default: point$4(this, x, y); break; } this._l01_a =3D this._l12_a, this._l12_a =3D this._l23_a; this._l01_2a =3D this._l12_2a, this._l12_2a =3D this._l23_2a; this._x0 =3D this._x1, this._x1 =3D this._x2, this._x2 =3D x; this._y0 =3D this._y1, this._y1 =3D this._y2, this._y2 =3D y; } }; var catmullRomClosed =3D (function custom(alpha) { function catmullRom$$1(context) { return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClose= d(context, 0); } catmullRom$$1.alpha =3D function(alpha) { return custom(+alpha); }; return catmullRom$$1; })(0.5); function CatmullRomOpen(context, alpha) { this._context =3D context; this._alpha =3D alpha; } CatmullRomOpen.prototype =3D { areaStart: function() { this._line =3D 0; }, areaEnd: function() { this._line =3D NaN; }, lineStart: function() { this._x0 =3D this._x1 =3D this._x2 =3D this._y0 =3D this._y1 =3D this._y2 =3D NaN; this._l01_a =3D this._l12_a =3D this._l23_a =3D this._l01_2a =3D this._l12_2a =3D this._l23_2a =3D this._point =3D 0; }, lineEnd: function() { if (this._line || (this._line !=3D=3D 0 && this._point =3D=3D=3D 3)) th= is._context.closePath(); this._line =3D 1 - this._line; }, point: function(x, y) { x =3D +x, y =3D +y; if (this._point) { var x23 =3D this._x2 - x, y23 =3D this._y2 - y; this._l23_a =3D Math.sqrt(this._l23_2a =3D Math.pow(x23 * x23 + y23 *= y23, this._alpha)); } switch (this._point) { case 0: this._point =3D 1; break; case 1: this._point =3D 2; break; case 2: this._point =3D 3; this._line ? this._context.lineTo(this._x2= , this._y2) : this._context.moveTo(this._x2, this._y2); break; case 3: this._point =3D 4; // proceed default: point$4(this, x, y); break; } this._l01_a =3D this._l12_a, this._l12_a =3D this._l23_a; this._l01_2a =3D this._l12_2a, this._l12_2a =3D this._l23_2a; this._x0 =3D this._x1, this._x1 =3D this._x2, this._x2 =3D x; this._y0 =3D this._y1, this._y1 =3D this._y2, this._y2 =3D y; } }; var catmullRomOpen =3D (function custom(alpha) { function catmullRom$$1(context) { return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(co= ntext, 0); } catmullRom$$1.alpha =3D function(alpha) { return custom(+alpha); }; return catmullRom$$1; })(0.5); function LinearClosed(context) { this._context =3D context; } LinearClosed.prototype =3D { areaStart: noop$3, areaEnd: noop$3, lineStart: function() { this._point =3D 0; }, lineEnd: function() { if (this._point) this._context.closePath(); }, point: function(x, y) { x =3D +x, y =3D +y; if (this._point) this._context.lineTo(x, y); else this._point =3D 1, this._context.moveTo(x, y); } }; function linearClosed(context) { return new LinearClosed(context); } function sign$1(x) { return x < 0 ? -1 : 1; } // Calculate the slopes of the tangents (Hermite-type interpolation) based = on // the following paper: Steffen, M. 1990. A Simple Method for Monotonic // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. // NOV(II), P. 443, 1990. function slope3(that, x2, y2) { var h0 =3D that._x1 - that._x0, h1 =3D x2 - that._x1, s0 =3D (that._y1 - that._y0) / (h0 || h1 < 0 && -0), s1 =3D (y2 - that._y1) / (h1 || h0 < 0 && -0), p =3D (s0 * h1 + s1 * h0) / (h0 + h1); return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0= =2E5 * Math.abs(p)) || 0; } // Calculate a one-sided slope. function slope2(that, t) { var h =3D that._x1 - that._x0; return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; } // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Represen= tations // "you can express cubic Hermite interpolation in terms of cubic B=C3=A9zi= er curves // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". function point$5(that, t0, t1) { var x0 =3D that._x0, y0 =3D that._y0, x1 =3D that._x1, y1 =3D that._y1, dx =3D (x1 - x0) / 3; that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1,= x1, y1); } function MonotoneX(context) { this._context =3D context; } MonotoneX.prototype =3D { areaStart: function() { this._line =3D 0; }, areaEnd: function() { this._line =3D NaN; }, lineStart: function() { this._x0 =3D this._x1 =3D this._y0 =3D this._y1 =3D this._t0 =3D NaN; this._point =3D 0; }, lineEnd: function() { switch (this._point) { case 2: this._context.lineTo(this._x1, this._y1); break; case 3: point$5(this, this._t0, slope2(this, this._t0)); break; } if (this._line || (this._line !=3D=3D 0 && this._point =3D=3D=3D 1)) th= is._context.closePath(); this._line =3D 1 - this._line; }, point: function(x, y) { var t1 =3D NaN; x =3D +x, y =3D +y; if (x =3D=3D=3D this._x1 && y =3D=3D=3D this._y1) return; // Ignore coi= ncident points. switch (this._point) { case 0: this._point =3D 1; this._line ? this._context.lineTo(x, y) : = this._context.moveTo(x, y); break; case 1: this._point =3D 2; break; case 2: this._point =3D 3; point$5(this, slope2(this, t1 =3D slope3(t= his, x, y)), t1); break; default: point$5(this, this._t0, t1 =3D slope3(this, x, y)); break; } this._x0 =3D this._x1, this._x1 =3D x; this._y0 =3D this._y1, this._y1 =3D y; this._t0 =3D t1; } }; function MonotoneY(context) { this._context =3D new ReflectContext(context); } (MonotoneY.prototype =3D Object.create(MonotoneX.prototype)).point =3D func= tion(x, y) { MonotoneX.prototype.point.call(this, y, x); }; function ReflectContext(context) { this._context =3D context; } ReflectContext.prototype =3D { moveTo: function(x, y) { this._context.moveTo(y, x); }, closePath: function() { this._context.closePath(); }, lineTo: function(x, y) { this._context.lineTo(y, x); }, bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurve= To(y1, x1, y2, x2, y, x); } }; function monotoneX(context) { return new MonotoneX(context); } function monotoneY(context) { return new MonotoneY(context); } function Natural(context) { this._context =3D context; } Natural.prototype =3D { areaStart: function() { this._line =3D 0; }, areaEnd: function() { this._line =3D NaN; }, lineStart: function() { this._x =3D []; this._y =3D []; }, lineEnd: function() { var x =3D this._x, y =3D this._y, n =3D x.length; if (n) { this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(= x[0], y[0]); if (n =3D=3D=3D 2) { this._context.lineTo(x[1], y[1]); } else { var px =3D controlPoints(x), py =3D controlPoints(y); for (var i0 =3D 0, i1 =3D 1; i1 < n; ++i0, ++i1) { this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1= ][i0], x[i1], y[i1]); } } } if (this._line || (this._line !=3D=3D 0 && n =3D=3D=3D 1)) this._contex= t.closePath(); this._line =3D 1 - this._line; this._x =3D this._y =3D null; }, point: function(x, y) { this._x.push(+x); this._y.push(+y); } }; // See https://www.particleincell.com/2012/bezier-splines/ for derivation. function controlPoints(x) { var i, n =3D x.length - 1, m, a =3D new Array(n), b =3D new Array(n), r =3D new Array(n); a[0] =3D 0, b[0] =3D 2, r[0] =3D x[0] + 2 * x[1]; for (i =3D 1; i < n - 1; ++i) a[i] =3D 1, b[i] =3D 4, r[i] =3D 4 * x[i] += 2 * x[i + 1]; a[n - 1] =3D 2, b[n - 1] =3D 7, r[n - 1] =3D 8 * x[n - 1] + x[n]; for (i =3D 1; i < n; ++i) m =3D a[i] / b[i - 1], b[i] -=3D m, r[i] -=3D m= * r[i - 1]; a[n - 1] =3D r[n - 1] / b[n - 1]; for (i =3D n - 2; i >=3D 0; --i) a[i] =3D (r[i] - a[i + 1]) / b[i]; b[n - 1] =3D (x[n] + a[n - 1]) / 2; for (i =3D 0; i < n - 1; ++i) b[i] =3D 2 * x[i + 1] - a[i + 1]; return [a, b]; } function natural(context) { return new Natural(context); } function Step(context, t) { this._context =3D context; this._t =3D t; } Step.prototype =3D { areaStart: function() { this._line =3D 0; }, areaEnd: function() { this._line =3D NaN; }, lineStart: function() { this._x =3D this._y =3D NaN; this._point =3D 0; }, lineEnd: function() { if (0 < this._t && this._t < 1 && this._point =3D=3D=3D 2) this._contex= t.lineTo(this._x, this._y); if (this._line || (this._line !=3D=3D 0 && this._point =3D=3D=3D 1)) th= is._context.closePath(); if (this._line >=3D 0) this._t =3D 1 - this._t, this._line =3D 1 - this= =2E_line; }, point: function(x, y) { x =3D +x, y =3D +y; switch (this._point) { case 0: this._point =3D 1; this._line ? this._context.lineTo(x, y) : = this._context.moveTo(x, y); break; case 1: this._point =3D 2; // proceed default: { if (this._t <=3D 0) { this._context.lineTo(this._x, y); this._context.lineTo(x, y); } else { var x1 =3D this._x * (1 - this._t) + x * this._t; this._context.lineTo(x1, this._y); this._context.lineTo(x1, y); } break; } } this._x =3D x, this._y =3D y; } }; function step(context) { return new Step(context, 0.5); } function stepBefore(context) { return new Step(context, 0); } function stepAfter(context) { return new Step(context, 1); } function none$1(series, order) { if (!((n =3D series.length) > 1)) return; for (var i =3D 1, j, s0, s1 =3D series[order[0]], n, m =3D s1.length; i <= n; ++i) { s0 =3D s1, s1 =3D series[order[i]]; for (j =3D 0; j < m; ++j) { s1[j][1] +=3D s1[j][0] =3D isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; } } } function none$2(series) { var n =3D series.length, o =3D new Array(n); while (--n >=3D 0) o[n] =3D n; return o; } function stackValue(d, key) { return d[key]; } function stack() { var keys =3D constant$b([]), order =3D none$2, offset =3D none$1, value =3D stackValue; function stack(data) { var kz =3D keys.apply(this, arguments), i, m =3D data.length, n =3D kz.length, sz =3D new Array(n), oz; for (i =3D 0; i < n; ++i) { for (var ki =3D kz[i], si =3D sz[i] =3D new Array(m), j =3D 0, sij; j= < m; ++j) { si[j] =3D sij =3D [0, +value(data[j], ki, j, data)]; sij.data =3D data[j]; } si.key =3D ki; } for (i =3D 0, oz =3D order(sz); i < n; ++i) { sz[oz[i]].index =3D i; } offset(sz, oz); return sz; } stack.keys =3D function(_) { return arguments.length ? (keys =3D typeof _ =3D=3D=3D "function" ? _ := constant$b(slice$6.call(_)), stack) : keys; }; stack.value =3D function(_) { return arguments.length ? (value =3D typeof _ =3D=3D=3D "function" ? _ = : constant$b(+_), stack) : value; }; stack.order =3D function(_) { return arguments.length ? (order =3D _ =3D=3D null ? none$2 : typeof _ = =3D=3D=3D "function" ? _ : constant$b(slice$6.call(_)), stack) : order; }; stack.offset =3D function(_) { return arguments.length ? (offset =3D _ =3D=3D null ? none$1 : _, stack= ) : offset; }; return stack; } function expand(series, order) { if (!((n =3D series.length) > 0)) return; for (var i, n, j =3D 0, m =3D series[0].length, y; j < m; ++j) { for (y =3D i =3D 0; i < n; ++i) y +=3D series[i][j][1] || 0; if (y) for (i =3D 0; i < n; ++i) series[i][j][1] /=3D y; } none$1(series, order); } function diverging$1(series, order) { if (!((n =3D series.length) > 0)) return; for (var i, j =3D 0, d, dy, yp, yn, n, m =3D series[order[0]].length; j <= m; ++j) { for (yp =3D yn =3D 0, i =3D 0; i < n; ++i) { if ((dy =3D (d =3D series[order[i]][j])[1] - d[0]) >=3D 0) { d[0] =3D yp, d[1] =3D yp +=3D dy; } else if (dy < 0) { d[1] =3D yn, d[0] =3D yn +=3D dy; } else { d[0] =3D yp; } } } } function silhouette(series, order) { if (!((n =3D series.length) > 0)) return; for (var j =3D 0, s0 =3D series[order[0]], n, m =3D s0.length; j < m; ++j= ) { for (var i =3D 0, y =3D 0; i < n; ++i) y +=3D series[i][j][1] || 0; s0[j][1] +=3D s0[j][0] =3D -y / 2; } none$1(series, order); } function wiggle(series, order) { if (!((n =3D series.length) > 0) || !((m =3D (s0 =3D series[order[0]]).le= ngth) > 0)) return; for (var y =3D 0, j =3D 1, s0, m, n; j < m; ++j) { for (var i =3D 0, s1 =3D 0, s2 =3D 0; i < n; ++i) { var si =3D series[order[i]], sij0 =3D si[j][1] || 0, sij1 =3D si[j - 1][1] || 0, s3 =3D (sij0 - sij1) / 2; for (var k =3D 0; k < i; ++k) { var sk =3D series[order[k]], skj0 =3D sk[j][1] || 0, skj1 =3D sk[j - 1][1] || 0; s3 +=3D skj0 - skj1; } s1 +=3D sij0, s2 +=3D s3 * sij0; } s0[j - 1][1] +=3D s0[j - 1][0] =3D y; if (s1) y -=3D s2 / s1; } s0[j - 1][1] +=3D s0[j - 1][0] =3D y; none$1(series, order); } function appearance(series) { var peaks =3D series.map(peak); return none$2(series).sort(function(a, b) { return peaks[a] - peaks[b]; }= ); } function peak(series) { var i =3D -1, j =3D 0, n =3D series.length, vi, vj =3D -Infinity; while (++i < n) if ((vi =3D +series[i][1]) > vj) vj =3D vi, j =3D i; return j; } function ascending$3(series) { var sums =3D series.map(sum$2); return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; }); } function sum$2(series) { var s =3D 0, i =3D -1, n =3D series.length, v; while (++i < n) if (v =3D +series[i][1]) s +=3D v; return s; } function descending$2(series) { return ascending$3(series).reverse(); } function insideOut(series) { var n =3D series.length, i, j, sums =3D series.map(sum$2), order =3D appearance(series), top =3D 0, bottom =3D 0, tops =3D [], bottoms =3D []; for (i =3D 0; i < n; ++i) { j =3D order[i]; if (top < bottom) { top +=3D sums[j]; tops.push(j); } else { bottom +=3D sums[j]; bottoms.push(j); } } return bottoms.reverse().concat(tops); } function reverse(series) { return none$2(series).reverse(); } function constant$c(x) { return function() { return x; }; } function x$4(d) { return d[0]; } function y$4(d) { return d[1]; } function RedBlackTree() { this._ =3D null; // root node } function RedBlackNode(node) { node.U =3D // parent node node.C =3D // color - true for red, false for black node.L =3D // left node node.R =3D // right node node.P =3D // previous node node.N =3D null; // next node } RedBlackTree.prototype =3D { constructor: RedBlackTree, insert: function(after, node) { var parent, grandpa, uncle; if (after) { node.P =3D after; node.N =3D after.N; if (after.N) after.N.P =3D node; after.N =3D node; if (after.R) { after =3D after.R; while (after.L) after =3D after.L; after.L =3D node; } else { after.R =3D node; } parent =3D after; } else if (this._) { after =3D RedBlackFirst(this._); node.P =3D null; node.N =3D after; after.P =3D after.L =3D node; parent =3D after; } else { node.P =3D node.N =3D null; this._ =3D node; parent =3D null; } node.L =3D node.R =3D null; node.U =3D parent; node.C =3D true; after =3D node; while (parent && parent.C) { grandpa =3D parent.U; if (parent =3D=3D=3D grandpa.L) { uncle =3D grandpa.R; if (uncle && uncle.C) { parent.C =3D uncle.C =3D false; grandpa.C =3D true; after =3D grandpa; } else { if (after =3D=3D=3D parent.R) { RedBlackRotateLeft(this, parent); after =3D parent; parent =3D after.U; } parent.C =3D false; grandpa.C =3D true; RedBlackRotateRight(this, grandpa); } } else { uncle =3D grandpa.L; if (uncle && uncle.C) { parent.C =3D uncle.C =3D false; grandpa.C =3D true; after =3D grandpa; } else { if (after =3D=3D=3D parent.L) { RedBlackRotateRight(this, parent); after =3D parent; parent =3D after.U; } parent.C =3D false; grandpa.C =3D true; RedBlackRotateLeft(this, grandpa); } } parent =3D after.U; } this._.C =3D false; }, remove: function(node) { if (node.N) node.N.P =3D node.P; if (node.P) node.P.N =3D node.N; node.N =3D node.P =3D null; var parent =3D node.U, sibling, left =3D node.L, right =3D node.R, next, red; if (!left) next =3D right; else if (!right) next =3D left; else next =3D RedBlackFirst(right); if (parent) { if (parent.L =3D=3D=3D node) parent.L =3D next; else parent.R =3D next; } else { this._ =3D next; } if (left && right) { red =3D next.C; next.C =3D node.C; next.L =3D left; left.U =3D next; if (next !=3D=3D right) { parent =3D next.U; next.U =3D node.U; node =3D next.R; parent.L =3D node; next.R =3D right; right.U =3D next; } else { next.U =3D parent; parent =3D next; node =3D next.R; } } else { red =3D node.C; node =3D next; } if (node) node.U =3D parent; if (red) return; if (node && node.C) { node.C =3D false; return; } do { if (node =3D=3D=3D this._) break; if (node =3D=3D=3D parent.L) { sibling =3D parent.R; if (sibling.C) { sibling.C =3D false; parent.C =3D true; RedBlackRotateLeft(this, parent); sibling =3D parent.R; } if ((sibling.L && sibling.L.C) || (sibling.R && sibling.R.C)) { if (!sibling.R || !sibling.R.C) { sibling.L.C =3D false; sibling.C =3D true; RedBlackRotateRight(this, sibling); sibling =3D parent.R; } sibling.C =3D parent.C; parent.C =3D sibling.R.C =3D false; RedBlackRotateLeft(this, parent); node =3D this._; break; } } else { sibling =3D parent.L; if (sibling.C) { sibling.C =3D false; parent.C =3D true; RedBlackRotateRight(this, parent); sibling =3D parent.L; } if ((sibling.L && sibling.L.C) || (sibling.R && sibling.R.C)) { if (!sibling.L || !sibling.L.C) { sibling.R.C =3D false; sibling.C =3D true; RedBlackRotateLeft(this, sibling); sibling =3D parent.L; } sibling.C =3D parent.C; parent.C =3D sibling.L.C =3D false; RedBlackRotateRight(this, parent); node =3D this._; break; } } sibling.C =3D true; node =3D parent; parent =3D parent.U; } while (!node.C); if (node) node.C =3D false; } }; function RedBlackRotateLeft(tree, node) { var p =3D node, q =3D node.R, parent =3D p.U; if (parent) { if (parent.L =3D=3D=3D p) parent.L =3D q; else parent.R =3D q; } else { tree._ =3D q; } q.U =3D parent; p.U =3D q; p.R =3D q.L; if (p.R) p.R.U =3D p; q.L =3D p; } function RedBlackRotateRight(tree, node) { var p =3D node, q =3D node.L, parent =3D p.U; if (parent) { if (parent.L =3D=3D=3D p) parent.L =3D q; else parent.R =3D q; } else { tree._ =3D q; } q.U =3D parent; p.U =3D q; p.L =3D q.R; if (p.L) p.L.U =3D p; q.R =3D p; } function RedBlackFirst(node) { while (node.L) node =3D node.L; return node; } function createEdge(left, right, v0, v1) { var edge =3D [null, null], index =3D edges.push(edge) - 1; edge.left =3D left; edge.right =3D right; if (v0) setEdgeEnd(edge, left, right, v0); if (v1) setEdgeEnd(edge, right, left, v1); cells[left.index].halfedges.push(index); cells[right.index].halfedges.push(index); return edge; } function createBorderEdge(left, v0, v1) { var edge =3D [v0, v1]; edge.left =3D left; return edge; } function setEdgeEnd(edge, left, right, vertex) { if (!edge[0] && !edge[1]) { edge[0] =3D vertex; edge.left =3D left; edge.right =3D right; } else if (edge.left =3D=3D=3D right) { edge[1] =3D vertex; } else { edge[0] =3D vertex; } } // Liang=E2=80=93Barsky line clipping. function clipEdge(edge, x0, y0, x1, y1) { var a =3D edge[0], b =3D edge[1], ax =3D a[0], ay =3D a[1], bx =3D b[0], by =3D b[1], t0 =3D 0, t1 =3D 1, dx =3D bx - ax, dy =3D by - ay, r; r =3D x0 - ax; if (!dx && r > 0) return; r /=3D dx; if (dx < 0) { if (r < t0) return; if (r < t1) t1 =3D r; } else if (dx > 0) { if (r > t1) return; if (r > t0) t0 =3D r; } r =3D x1 - ax; if (!dx && r < 0) return; r /=3D dx; if (dx < 0) { if (r > t1) return; if (r > t0) t0 =3D r; } else if (dx > 0) { if (r < t0) return; if (r < t1) t1 =3D r; } r =3D y0 - ay; if (!dy && r > 0) return; r /=3D dy; if (dy < 0) { if (r < t0) return; if (r < t1) t1 =3D r; } else if (dy > 0) { if (r > t1) return; if (r > t0) t0 =3D r; } r =3D y1 - ay; if (!dy && r < 0) return; r /=3D dy; if (dy < 0) { if (r > t1) return; if (r > t0) t0 =3D r; } else if (dy > 0) { if (r < t0) return; if (r < t1) t1 =3D r; } if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check? if (t0 > 0) edge[0] =3D [ax + t0 * dx, ay + t0 * dy]; if (t1 < 1) edge[1] =3D [ax + t1 * dx, ay + t1 * dy]; return true; } function connectEdge(edge, x0, y0, x1, y1) { var v1 =3D edge[1]; if (v1) return true; var v0 =3D edge[0], left =3D edge.left, right =3D edge.right, lx =3D left[0], ly =3D left[1], rx =3D right[0], ry =3D right[1], fx =3D (lx + rx) / 2, fy =3D (ly + ry) / 2, fm, fb; if (ry =3D=3D=3D ly) { if (fx < x0 || fx >=3D x1) return; if (lx > rx) { if (!v0) v0 =3D [fx, y0]; else if (v0[1] >=3D y1) return; v1 =3D [fx, y1]; } else { if (!v0) v0 =3D [fx, y1]; else if (v0[1] < y0) return; v1 =3D [fx, y0]; } } else { fm =3D (lx - rx) / (ry - ly); fb =3D fy - fm * fx; if (fm < -1 || fm > 1) { if (lx > rx) { if (!v0) v0 =3D [(y0 - fb) / fm, y0]; else if (v0[1] >=3D y1) return; v1 =3D [(y1 - fb) / fm, y1]; } else { if (!v0) v0 =3D [(y1 - fb) / fm, y1]; else if (v0[1] < y0) return; v1 =3D [(y0 - fb) / fm, y0]; } } else { if (ly < ry) { if (!v0) v0 =3D [x0, fm * x0 + fb]; else if (v0[0] >=3D x1) return; v1 =3D [x1, fm * x1 + fb]; } else { if (!v0) v0 =3D [x1, fm * x1 + fb]; else if (v0[0] < x0) return; v1 =3D [x0, fm * x0 + fb]; } } } edge[0] =3D v0; edge[1] =3D v1; return true; } function clipEdges(x0, y0, x1, y1) { var i =3D edges.length, edge; while (i--) { if (!connectEdge(edge =3D edges[i], x0, y0, x1, y1) || !clipEdge(edge, x0, y0, x1, y1) || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4 || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) { delete edges[i]; } } } function createCell(site) { return cells[site.index] =3D { site: site, halfedges: [] }; } function cellHalfedgeAngle(cell, edge) { var site =3D cell.site, va =3D edge.left, vb =3D edge.right; if (site =3D=3D=3D vb) vb =3D va, va =3D site; if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]); if (site =3D=3D=3D va) va =3D edge[1], vb =3D edge[0]; else va =3D edge[0], vb =3D edge[1]; return Math.atan2(va[0] - vb[0], vb[1] - va[1]); } function cellHalfedgeStart(cell, edge) { return edge[+(edge.left !=3D=3D cell.site)]; } function cellHalfedgeEnd(cell, edge) { return edge[+(edge.left =3D=3D=3D cell.site)]; } function sortCellHalfedges() { for (var i =3D 0, n =3D cells.length, cell, halfedges, j, m; i < n; ++i) { if ((cell =3D cells[i]) && (m =3D (halfedges =3D cell.halfedges).length= )) { var index =3D new Array(m), array =3D new Array(m); for (j =3D 0; j < m; ++j) index[j] =3D j, array[j] =3D cellHalfedgeAn= gle(cell, edges[halfedges[j]]); index.sort(function(i, j) { return array[j] - array[i]; }); for (j =3D 0; j < m; ++j) array[j] =3D halfedges[index[j]]; for (j =3D 0; j < m; ++j) halfedges[j] =3D array[j]; } } } function clipCells(x0, y0, x1, y1) { var nCells =3D cells.length, iCell, cell, site, iHalfedge, halfedges, nHalfedges, start, startX, startY, end, endX, endY, cover =3D true; for (iCell =3D 0; iCell < nCells; ++iCell) { if (cell =3D cells[iCell]) { site =3D cell.site; halfedges =3D cell.halfedges; iHalfedge =3D halfedges.length; // Remove any dangling clipped edges. while (iHalfedge--) { if (!edges[halfedges[iHalfedge]]) { halfedges.splice(iHalfedge, 1); } } // Insert any border edges as necessary. iHalfedge =3D 0, nHalfedges =3D halfedges.length; while (iHalfedge < nHalfedges) { end =3D cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = =3D end[0], endY =3D end[1]; start =3D cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHa= lfedges]]), startX =3D start[0], startY =3D start[1]; if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) = > epsilon$4) { halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, = end, Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x= 0, Math.abs(startX - x0) < epsilon$4 ? startY : y1] : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? = [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1] : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? = [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0] : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? = [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0] : null)) - 1); ++nHalfedges; } } if (nHalfedges) cover =3D false; } } // If there weren=E2=80=99t any edges, have the closest site cover the ex= tent. // It doesn=E2=80=99t matter which corner of the extent we measure! if (cover) { var dx, dy, d2, dc =3D Infinity; for (iCell =3D 0, cover =3D null; iCell < nCells; ++iCell) { if (cell =3D cells[iCell]) { site =3D cell.site; dx =3D site[0] - x0; dy =3D site[1] - y0; d2 =3D dx * dx + dy * dy; if (d2 < dc) dc =3D d2, cover =3D cell; } } if (cover) { var v00 =3D [x0, y0], v01 =3D [x0, y1], v11 =3D [x1, y1], v10 =3D [x1= , y0]; cover.halfedges.push( edges.push(createBorderEdge(site =3D cover.site, v00, v01)) - 1, edges.push(createBorderEdge(site, v01, v11)) - 1, edges.push(createBorderEdge(site, v11, v10)) - 1, edges.push(createBorderEdge(site, v10, v00)) - 1 ); } } // Lastly delete any cells with no edges; these were entirely clipped. for (iCell =3D 0; iCell < nCells; ++iCell) { if (cell =3D cells[iCell]) { if (!cell.halfedges.length) { delete cells[iCell]; } } } } var circlePool =3D []; var firstCircle; function Circle() { RedBlackNode(this); this.x =3D this.y =3D this.arc =3D this.site =3D this.cy =3D null; } function attachCircle(arc) { var lArc =3D arc.P, rArc =3D arc.N; if (!lArc || !rArc) return; var lSite =3D lArc.site, cSite =3D arc.site, rSite =3D rArc.site; if (lSite =3D=3D=3D rSite) return; var bx =3D cSite[0], by =3D cSite[1], ax =3D lSite[0] - bx, ay =3D lSite[1] - by, cx =3D rSite[0] - bx, cy =3D rSite[1] - by; var d =3D 2 * (ax * cy - ay * cx); if (d >=3D -epsilon2$2) return; var ha =3D ax * ax + ay * ay, hc =3D cx * cx + cy * cy, x =3D (cy * ha - ay * hc) / d, y =3D (ax * hc - cx * ha) / d; var circle =3D circlePool.pop() || new Circle; circle.arc =3D arc; circle.site =3D cSite; circle.x =3D x + bx; circle.y =3D (circle.cy =3D y + by) + Math.sqrt(x * x + y * y); // y bott= om arc.circle =3D circle; var before =3D null, node =3D circles._; while (node) { if (circle.y < node.y || (circle.y =3D=3D=3D node.y && circle.x <=3D no= de.x)) { if (node.L) node =3D node.L; else { before =3D node.P; break; } } else { if (node.R) node =3D node.R; else { before =3D node; break; } } } circles.insert(before, circle); if (!before) firstCircle =3D circle; } function detachCircle(arc) { var circle =3D arc.circle; if (circle) { if (!circle.P) firstCircle =3D circle.N; circles.remove(circle); circlePool.push(circle); RedBlackNode(circle); arc.circle =3D null; } } var beachPool =3D []; function Beach() { RedBlackNode(this); this.edge =3D this.site =3D this.circle =3D null; } function createBeach(site) { var beach =3D beachPool.pop() || new Beach; beach.site =3D site; return beach; } function detachBeach(beach) { detachCircle(beach); beaches.remove(beach); beachPool.push(beach); RedBlackNode(beach); } function removeBeach(beach) { var circle =3D beach.circle, x =3D circle.x, y =3D circle.cy, vertex =3D [x, y], previous =3D beach.P, next =3D beach.N, disappearing =3D [beach]; detachBeach(beach); var lArc =3D previous; while (lArc.circle && Math.abs(x - lArc.circle.x) < epsilon$4 && Math.abs(y - lArc.circle.cy) < epsilon$4) { previous =3D lArc.P; disappearing.unshift(lArc); detachBeach(lArc); lArc =3D previous; } disappearing.unshift(lArc); detachCircle(lArc); var rArc =3D next; while (rArc.circle && Math.abs(x - rArc.circle.x) < epsilon$4 && Math.abs(y - rArc.circle.cy) < epsilon$4) { next =3D rArc.N; disappearing.push(rArc); detachBeach(rArc); rArc =3D next; } disappearing.push(rArc); detachCircle(rArc); var nArcs =3D disappearing.length, iArc; for (iArc =3D 1; iArc < nArcs; ++iArc) { rArc =3D disappearing[iArc]; lArc =3D disappearing[iArc - 1]; setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex); } lArc =3D disappearing[0]; rArc =3D disappearing[nArcs - 1]; rArc.edge =3D createEdge(lArc.site, rArc.site, null, vertex); attachCircle(lArc); attachCircle(rArc); } function addBeach(site) { var x =3D site[0], directrix =3D site[1], lArc, rArc, dxl, dxr, node =3D beaches._; while (node) { dxl =3D leftBreakPoint(node, directrix) - x; if (dxl > epsilon$4) node =3D node.L; else { dxr =3D x - rightBreakPoint(node, directrix); if (dxr > epsilon$4) { if (!node.R) { lArc =3D node; break; } node =3D node.R; } else { if (dxl > -epsilon$4) { lArc =3D node.P; rArc =3D node; } else if (dxr > -epsilon$4) { lArc =3D node; rArc =3D node.N; } else { lArc =3D rArc =3D node; } break; } } } createCell(site); var newArc =3D createBeach(site); beaches.insert(lArc, newArc); if (!lArc && !rArc) return; if (lArc =3D=3D=3D rArc) { detachCircle(lArc); rArc =3D createBeach(lArc.site); beaches.insert(newArc, rArc); newArc.edge =3D rArc.edge =3D createEdge(lArc.site, newArc.site); attachCircle(lArc); attachCircle(rArc); return; } if (!rArc) { // && lArc newArc.edge =3D createEdge(lArc.site, newArc.site); return; } // else lArc !=3D=3D rArc detachCircle(lArc); detachCircle(rArc); var lSite =3D lArc.site, ax =3D lSite[0], ay =3D lSite[1], bx =3D site[0] - ax, by =3D site[1] - ay, rSite =3D rArc.site, cx =3D rSite[0] - ax, cy =3D rSite[1] - ay, d =3D 2 * (bx * cy - by * cx), hb =3D bx * bx + by * by, hc =3D cx * cx + cy * cy, vertex =3D [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + a= y]; setEdgeEnd(rArc.edge, lSite, rSite, vertex); newArc.edge =3D createEdge(lSite, site, null, vertex); rArc.edge =3D createEdge(site, rSite, null, vertex); attachCircle(lArc); attachCircle(rArc); } function leftBreakPoint(arc, directrix) { var site =3D arc.site, rfocx =3D site[0], rfocy =3D site[1], pby2 =3D rfocy - directrix; if (!pby2) return rfocx; var lArc =3D arc.P; if (!lArc) return -Infinity; site =3D lArc.site; var lfocx =3D site[0], lfocy =3D site[1], plby2 =3D lfocy - directrix; if (!plby2) return lfocx; var hl =3D lfocx - rfocx, aby2 =3D 1 / pby2 - 1 / plby2, b =3D hl / plby2; if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby= 2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx; return (rfocx + lfocx) / 2; } function rightBreakPoint(arc, directrix) { var rArc =3D arc.N; if (rArc) return leftBreakPoint(rArc, directrix); var site =3D arc.site; return site[1] =3D=3D=3D directrix ? site[0] : Infinity; } var epsilon$4 =3D 1e-6; var epsilon2$2 =3D 1e-12; var beaches; var cells; var circles; var edges; function triangleArea(a, b, c) { return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]); } function lexicographic(a, b) { return b[1] - a[1] || b[0] - a[0]; } function Diagram(sites, extent) { var site =3D sites.sort(lexicographic).pop(), x, y, circle; edges =3D []; cells =3D new Array(sites.length); beaches =3D new RedBlackTree; circles =3D new RedBlackTree; while (true) { circle =3D firstCircle; if (site && (!circle || site[1] < circle.y || (site[1] =3D=3D=3D circle= =2Ey && site[0] < circle.x))) { if (site[0] !=3D=3D x || site[1] !=3D=3D y) { addBeach(site); x =3D site[0], y =3D site[1]; } site =3D sites.pop(); } else if (circle) { removeBeach(circle.arc); } else { break; } } sortCellHalfedges(); if (extent) { var x0 =3D +extent[0][0], y0 =3D +extent[0][1], x1 =3D +extent[1][0], y1 =3D +extent[1][1]; clipEdges(x0, y0, x1, y1); clipCells(x0, y0, x1, y1); } this.edges =3D edges; this.cells =3D cells; beaches =3D circles =3D edges =3D cells =3D null; } Diagram.prototype =3D { constructor: Diagram, polygons: function() { var edges =3D this.edges; return this.cells.map(function(cell) { var polygon =3D cell.halfedges.map(function(i) { return cellHalfedgeS= tart(cell, edges[i]); }); polygon.data =3D cell.site.data; return polygon; }); }, triangles: function() { var triangles =3D [], edges =3D this.edges; this.cells.forEach(function(cell, i) { if (!(m =3D (halfedges =3D cell.halfedges).length)) return; var site =3D cell.site, halfedges, j =3D -1, m, s0, e1 =3D edges[halfedges[m - 1]], s1 =3D e1.left =3D=3D=3D site ? e1.right : e1.left; while (++j < m) { s0 =3D s1; e1 =3D edges[halfedges[j]]; s1 =3D e1.left =3D=3D=3D site ? e1.right : e1.left; if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, = s0, s1) < 0) { triangles.push([site.data, s0.data, s1.data]); } } }); return triangles; }, links: function() { return this.edges.filter(function(edge) { return edge.right; }).map(function(edge) { return { source: edge.left.data, target: edge.right.data }; }); }, find: function(x, y, radius) { var that =3D this, i0, i1 =3D that._found || 0, n =3D that.cells.length= , cell; // Use the previously-found cell, or start with an arbitrary one. while (!(cell =3D that.cells[i1])) if (++i1 >=3D n) return null; var dx =3D x - cell.site[0], dy =3D y - cell.site[1], d2 =3D dx * dx + = dy * dy; // Traverse the half-edges to find a closer cell, if any. do { cell =3D that.cells[i0 =3D i1], i1 =3D null; cell.halfedges.forEach(function(e) { var edge =3D that.edges[e], v =3D edge.left; if ((v =3D=3D=3D cell.site || !v) && !(v =3D edge.right)) return; var vx =3D x - v[0], vy =3D y - v[1], v2 =3D vx * vx + vy * vy; if (v2 < d2) d2 =3D v2, i1 =3D v.index; }); } while (i1 !=3D=3D null); that._found =3D i0; return radius =3D=3D null || d2 <=3D radius * radius ? cell.site : null; } }; function voronoi() { var x$$1 =3D x$4, y$$1 =3D y$4, extent =3D null; function voronoi(data) { return new Diagram(data.map(function(d, i) { var s =3D [Math.round(x$$1(d, i, data) / epsilon$4) * epsilon$4, Math= =2Eround(y$$1(d, i, data) / epsilon$4) * epsilon$4]; s.index =3D i; s.data =3D d; return s; }), extent); } voronoi.polygons =3D function(data) { return voronoi(data).polygons(); }; voronoi.links =3D function(data) { return voronoi(data).links(); }; voronoi.triangles =3D function(data) { return voronoi(data).triangles(); }; voronoi.x =3D function(_) { return arguments.length ? (x$$1 =3D typeof _ =3D=3D=3D "function" ? _ := constant$c(+_), voronoi) : x$$1; }; voronoi.y =3D function(_) { return arguments.length ? (y$$1 =3D typeof _ =3D=3D=3D "function" ? _ := constant$c(+_), voronoi) : y$$1; }; voronoi.extent =3D function(_) { return arguments.length ? (extent =3D _ =3D=3D null ? null : [[+_[0][0]= , +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], ex= tent[0][1]], [extent[1][0], extent[1][1]]]; }; voronoi.size =3D function(_) { return arguments.length ? (extent =3D _ =3D=3D null ? null : [[0, 0], [= +_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1= ][1] - extent[0][1]]; }; return voronoi; } function constant$d(x) { return function() { return x; }; } function ZoomEvent(target, type, transform) { this.target =3D target; this.type =3D type; this.transform =3D transform; } function Transform(k, x, y) { this.k =3D k; this.x =3D x; this.y =3D y; } Transform.prototype =3D { constructor: Transform, scale: function(k) { return k =3D=3D=3D 1 ? this : new Transform(this.k * k, this.x, this.y); }, translate: function(x, y) { return x =3D=3D=3D 0 & y =3D=3D=3D 0 ? this : new Transform(this.k, thi= s.x + this.k * x, this.y + this.k * y); }, apply: function(point) { return [point[0] * this.k + this.x, point[1] * this.k + this.y]; }, applyX: function(x) { return x * this.k + this.x; }, applyY: function(y) { return y * this.k + this.y; }, invert: function(location) { return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.= k]; }, invertX: function(x) { return (x - this.x) / this.k; }, invertY: function(y) { return (y - this.y) / this.k; }, rescaleX: function(x) { return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, = x)); }, rescaleY: function(y) { return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, = y)); }, toString: function() { return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; } }; var identity$9 =3D new Transform(1, 0, 0); transform$1.prototype =3D Transform.prototype; function transform$1(node) { return node.__zoom || identity$9; } function nopropagation$2() { exports.event.stopImmediatePropagation(); } function noevent$2() { exports.event.preventDefault(); exports.event.stopImmediatePropagation(); } // Ignore right-click, since that should open the context menu. function defaultFilter$2() { return !exports.event.button; } function defaultExtent$1() { var e =3D this, w, h; if (e instanceof SVGElement) { e =3D e.ownerSVGElement || e; w =3D e.width.baseVal.value; h =3D e.height.baseVal.value; } else { w =3D e.clientWidth; h =3D e.clientHeight; } return [[0, 0], [w, h]]; } function defaultTransform() { return this.__zoom || identity$9; } function defaultWheelDelta() { return -exports.event.deltaY * (exports.event.deltaMode ? 120 : 1) / 500; } function defaultTouchable$1() { return "ontouchstart" in this; } function defaultConstrain(transform, extent, translateExtent) { var dx0 =3D transform.invertX(extent[0][0]) - translateExtent[0][0], dx1 =3D transform.invertX(extent[1][0]) - translateExtent[1][0], dy0 =3D transform.invertY(extent[0][1]) - translateExtent[0][1], dy1 =3D transform.invertY(extent[1][1]) - translateExtent[1][1]; return transform.translate( dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) ); } function zoom() { var filter =3D defaultFilter$2, extent =3D defaultExtent$1, constrain =3D defaultConstrain, wheelDelta =3D defaultWheelDelta, touchable =3D defaultTouchable$1, scaleExtent =3D [0, Infinity], translateExtent =3D [[-Infinity, -Infinity], [Infinity, Infinity]], duration =3D 250, interpolate =3D interpolateZoom, gestures =3D [], listeners =3D dispatch("start", "zoom", "end"), touchstarting, touchending, touchDelay =3D 500, wheelDelay =3D 150, clickDistance2 =3D 0; function zoom(selection$$1) { selection$$1 .property("__zoom", defaultTransform) .on("wheel.zoom", wheeled) .on("mousedown.zoom", mousedowned) .on("dblclick.zoom", dblclicked) .filter(touchable) .on("touchstart.zoom", touchstarted) .on("touchmove.zoom", touchmoved) .on("touchend.zoom touchcancel.zoom", touchended) .style("touch-action", "none") .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); } zoom.transform =3D function(collection, transform) { var selection$$1 =3D collection.selection ? collection.selection() : co= llection; selection$$1.property("__zoom", defaultTransform); if (collection !=3D=3D selection$$1) { schedule(collection, transform); } else { selection$$1.interrupt().each(function() { gesture(this, arguments) .start() .zoom(null, typeof transform =3D=3D=3D "function" ? transform.a= pply(this, arguments) : transform) .end(); }); } }; zoom.scaleBy =3D function(selection$$1, k) { zoom.scaleTo(selection$$1, function() { var k0 =3D this.__zoom.k, k1 =3D typeof k =3D=3D=3D "function" ? k.apply(this, arguments) := k; return k0 * k1; }); }; zoom.scaleTo =3D function(selection$$1, k) { zoom.transform(selection$$1, function() { var e =3D extent.apply(this, arguments), t0 =3D this.__zoom, p0 =3D centroid(e), p1 =3D t0.invert(p0), k1 =3D typeof k =3D=3D=3D "function" ? k.apply(this, arguments) := k; return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent= ); }); }; zoom.translateBy =3D function(selection$$1, x, y) { zoom.transform(selection$$1, function() { return constrain(this.__zoom.translate( typeof x =3D=3D=3D "function" ? x.apply(this, arguments) : x, typeof y =3D=3D=3D "function" ? y.apply(this, arguments) : y ), extent.apply(this, arguments), translateExtent); }); }; zoom.translateTo =3D function(selection$$1, x, y) { zoom.transform(selection$$1, function() { var e =3D extent.apply(this, arguments), t =3D this.__zoom, p =3D centroid(e); return constrain(identity$9.translate(p[0], p[1]).scale(t.k).translat= e( typeof x =3D=3D=3D "function" ? -x.apply(this, arguments) : -x, typeof y =3D=3D=3D "function" ? -y.apply(this, arguments) : -y ), e, translateExtent); }); }; function scale(transform, k) { k =3D Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); return k =3D=3D=3D transform.k ? transform : new Transform(k, transform= =2Ex, transform.y); } function translate(transform, p0, p1) { var x =3D p0[0] - p1[0] * transform.k, y =3D p0[1] - p1[1] * transform.= k; return x =3D=3D=3D transform.x && y =3D=3D=3D transform.y ? transform := new Transform(transform.k, x, y); } function centroid(extent) { return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1= ][1]) / 2]; } function schedule(transition$$1, transform, center) { transition$$1 .on("start.zoom", function() { gesture(this, arguments).start(); }) .on("interrupt.zoom end.zoom", function() { gesture(this, arguments= ).end(); }) .tween("zoom", function() { var that =3D this, args =3D arguments, g =3D gesture(that, args), e =3D extent.apply(that, args), p =3D center || centroid(e), w =3D Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a =3D that.__zoom, b =3D typeof transform =3D=3D=3D "function" ? transform.apply= (that, args) : transform, i =3D interpolate(a.invert(p).concat(w / a.k), b.invert(p).co= ncat(w / b.k)); return function(t) { if (t =3D=3D=3D 1) t =3D b; // Avoid rounding error on end. else { var l =3D i(t), k =3D w / l[2]; t =3D new Transform(k, p= [0] - l[0] * k, p[1] - l[1] * k); } g.zoom(null, t); }; }); } function gesture(that, args) { for (var i =3D 0, n =3D gestures.length, g; i < n; ++i) { if ((g =3D gestures[i]).that =3D=3D=3D that) { return g; } } return new Gesture(that, args); } function Gesture(that, args) { this.that =3D that; this.args =3D args; this.index =3D -1; this.active =3D 0; this.extent =3D extent.apply(that, args); } Gesture.prototype =3D { start: function() { if (++this.active =3D=3D=3D 1) { this.index =3D gestures.push(this) - 1; this.emit("start"); } return this; }, zoom: function(key, transform) { if (this.mouse && key !=3D=3D "mouse") this.mouse[1] =3D transform.in= vert(this.mouse[0]); if (this.touch0 && key !=3D=3D "touch") this.touch0[1] =3D transform.= invert(this.touch0[0]); if (this.touch1 && key !=3D=3D "touch") this.touch1[1] =3D transform.= invert(this.touch1[0]); this.that.__zoom =3D transform; this.emit("zoom"); return this; }, end: function() { if (--this.active =3D=3D=3D 0) { gestures.splice(this.index, 1); this.index =3D -1; this.emit("end"); } return this; }, emit: function(type) { customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.ap= ply, listeners, [type, this.that, this.args]); } }; function wheeled() { if (!filter.apply(this, arguments)) return; var g =3D gesture(this, arguments), t =3D this.__zoom, k =3D Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.= pow(2, wheelDelta.apply(this, arguments)))), p =3D mouse(this); // If the mouse is in the same location as before, reuse it. // If there were recent wheel events, reset the wheel idle timeout. if (g.wheel) { if (g.mouse[0][0] !=3D=3D p[0] || g.mouse[0][1] !=3D=3D p[1]) { g.mouse[1] =3D t.invert(g.mouse[0] =3D p); } clearTimeout(g.wheel); } // If this wheel event won=E2=80=99t trigger a transform change, ignore= it. else if (t.k =3D=3D=3D k) return; // Otherwise, capture the mouse point and location at the start. else { g.mouse =3D [p, t.invert(p)]; interrupt(this); g.start(); } noevent$2(); g.wheel =3D setTimeout(wheelidled, wheelDelay); g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]= ), g.extent, translateExtent)); function wheelidled() { g.wheel =3D null; g.end(); } } function mousedowned() { if (touchending || !filter.apply(this, arguments)) return; var g =3D gesture(this, arguments), v =3D select(exports.event.view).on("mousemove.zoom", mousemoved, t= rue).on("mouseup.zoom", mouseupped, true), p =3D mouse(this), x0 =3D exports.event.clientX, y0 =3D exports.event.clientY; dragDisable(exports.event.view); nopropagation$2(); g.mouse =3D [p, this.__zoom.invert(p)]; interrupt(this); g.start(); function mousemoved() { noevent$2(); if (!g.moved) { var dx =3D exports.event.clientX - x0, dy =3D exports.event.clientY= - y0; g.moved =3D dx * dx + dy * dy > clickDistance2; } g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] =3D mou= se(g.that), g.mouse[1]), g.extent, translateExtent)); } function mouseupped() { v.on("mousemove.zoom mouseup.zoom", null); yesdrag(exports.event.view, g.moved); noevent$2(); g.end(); } } function dblclicked() { if (!filter.apply(this, arguments)) return; var t0 =3D this.__zoom, p0 =3D mouse(this), p1 =3D t0.invert(p0), k1 =3D t0.k * (exports.event.shiftKey ? 0.5 : 2), t1 =3D constrain(translate(scale(t0, k1), p0, p1), extent.apply(thi= s, arguments), translateExtent); noevent$2(); if (duration > 0) select(this).transition().duration(duration).call(sch= edule, t1, p0); else select(this).call(zoom.transform, t1); } function touchstarted() { if (!filter.apply(this, arguments)) return; var g =3D gesture(this, arguments), touches$$1 =3D exports.event.changedTouches, started, n =3D touches$$1.length, i, t, p; nopropagation$2(); for (i =3D 0; i < n; ++i) { t =3D touches$$1[i], p =3D touch(this, touches$$1, t.identifier); p =3D [p, this.__zoom.invert(p), t.identifier]; if (!g.touch0) g.touch0 =3D p, started =3D true; else if (!g.touch1) g.touch1 =3D p; } // If this is a dbltap, reroute to the (optional) dblclick.zoom handler. if (touchstarting) { touchstarting =3D clearTimeout(touchstarting); if (!g.touch1) { g.end(); p =3D select(this).on("dblclick.zoom"); if (p) p.apply(this, arguments); return; } } if (started) { touchstarting =3D setTimeout(function() { touchstarting =3D null; }, = touchDelay); interrupt(this); g.start(); } } function touchmoved() { var g =3D gesture(this, arguments), touches$$1 =3D exports.event.changedTouches, n =3D touches$$1.length, i, t, p, l; noevent$2(); if (touchstarting) touchstarting =3D clearTimeout(touchstarting); for (i =3D 0; i < n; ++i) { t =3D touches$$1[i], p =3D touch(this, touches$$1, t.identifier); if (g.touch0 && g.touch0[2] =3D=3D=3D t.identifier) g.touch0[0] =3D p; else if (g.touch1 && g.touch1[2] =3D=3D=3D t.identifier) g.touch1[0] = =3D p; } t =3D g.that.__zoom; if (g.touch1) { var p0 =3D g.touch0[0], l0 =3D g.touch0[1], p1 =3D g.touch1[0], l1 =3D g.touch1[1], dp =3D (dp =3D p1[0] - p0[0]) * dp + (dp =3D p1[1] - p0[1]) * dp, dl =3D (dl =3D l1[0] - l0[0]) * dl + (dl =3D l1[1] - l0[1]) * dl; t =3D scale(t, Math.sqrt(dp / dl)); p =3D [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; l =3D [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; } else if (g.touch0) p =3D g.touch0[0], l =3D g.touch0[1]; else return; g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent= )); } function touchended() { var g =3D gesture(this, arguments), touches$$1 =3D exports.event.changedTouches, n =3D touches$$1.length, i, t; nopropagation$2(); if (touchending) clearTimeout(touchending); touchending =3D setTimeout(function() { touchending =3D null; }, touchD= elay); for (i =3D 0; i < n; ++i) { t =3D touches$$1[i]; if (g.touch0 && g.touch0[2] =3D=3D=3D t.identifier) delete g.touch0; else if (g.touch1 && g.touch1[2] =3D=3D=3D t.identifier) delete g.tou= ch1; } if (g.touch1 && !g.touch0) g.touch0 =3D g.touch1, delete g.touch1; if (g.touch0) g.touch0[1] =3D this.__zoom.invert(g.touch0[0]); else g.end(); } zoom.wheelDelta =3D function(_) { return arguments.length ? (wheelDelta =3D typeof _ =3D=3D=3D "function"= ? _ : constant$d(+_), zoom) : wheelDelta; }; zoom.filter =3D function(_) { return arguments.length ? (filter =3D typeof _ =3D=3D=3D "function" ? _= : constant$d(!!_), zoom) : filter; }; zoom.touchable =3D function(_) { return arguments.length ? (touchable =3D typeof _ =3D=3D=3D "function" = ? _ : constant$d(!!_), zoom) : touchable; }; zoom.extent =3D function(_) { return arguments.length ? (extent =3D typeof _ =3D=3D=3D "function" ? _= : constant$d([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; }; zoom.scaleExtent =3D function(_) { return arguments.length ? (scaleExtent[0] =3D +_[0], scaleExtent[1] =3D= +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; }; zoom.translateExtent =3D function(_) { return arguments.length ? (translateExtent[0][0] =3D +_[0][0], translat= eExtent[1][0] =3D +_[1][0], translateExtent[0][1] =3D +_[0][1], translateEx= tent[1][1] =3D +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0= ][1]], [translateExtent[1][0], translateExtent[1][1]]]; }; zoom.constrain =3D function(_) { return arguments.length ? (constrain =3D _, zoom) : constrain; }; zoom.duration =3D function(_) { return arguments.length ? (duration =3D +_, zoom) : duration; }; zoom.interpolate =3D function(_) { return arguments.length ? (interpolate =3D _, zoom) : interpolate; }; zoom.on =3D function() { var value =3D listeners.on.apply(listeners, arguments); return value =3D=3D=3D listeners ? zoom : value; }; zoom.clickDistance =3D function(_) { return arguments.length ? (clickDistance2 =3D (_ =3D +_) * _, zoom) : M= ath.sqrt(clickDistance2); }; return zoom; } exports.version =3D version; exports.bisect =3D bisectRight; exports.bisectRight =3D bisectRight; exports.bisectLeft =3D bisectLeft; exports.ascending =3D ascending; exports.bisector =3D bisector; exports.cross =3D cross; exports.descending =3D descending; exports.deviation =3D deviation; exports.extent =3D extent; exports.histogram =3D histogram; exports.thresholdFreedmanDiaconis =3D freedmanDiaconis; exports.thresholdScott =3D scott; exports.thresholdSturges =3D thresholdSturges; exports.max =3D max; exports.mean =3D mean; exports.median =3D median; exports.merge =3D merge; exports.min =3D min; exports.pairs =3D pairs; exports.permute =3D permute; exports.quantile =3D threshold; exports.range =3D sequence; exports.scan =3D scan; exports.shuffle =3D shuffle; exports.sum =3D sum; exports.ticks =3D ticks; exports.tickIncrement =3D tickIncrement; exports.tickStep =3D tickStep; exports.transpose =3D transpose; exports.variance =3D variance; exports.zip =3D zip; exports.axisTop =3D axisTop; exports.axisRight =3D axisRight; exports.axisBottom =3D axisBottom; exports.axisLeft =3D axisLeft; exports.brush =3D brush; exports.brushX =3D brushX; exports.brushY =3D brushY; exports.brushSelection =3D brushSelection; exports.chord =3D chord; exports.ribbon =3D ribbon; exports.nest =3D nest; exports.set =3D set$2; exports.map =3D map$1; exports.keys =3D keys; exports.values =3D values; exports.entries =3D entries; exports.color =3D color; exports.rgb =3D rgb; exports.hsl =3D hsl; exports.lab =3D lab; exports.hcl =3D hcl; exports.lch =3D lch; exports.gray =3D gray; exports.cubehelix =3D cubehelix; exports.contours =3D contours; exports.contourDensity =3D density; exports.dispatch =3D dispatch; exports.drag =3D drag; exports.dragDisable =3D dragDisable; exports.dragEnable =3D yesdrag; exports.dsvFormat =3D dsvFormat; exports.csvParse =3D csvParse; exports.csvParseRows =3D csvParseRows; exports.csvFormat =3D csvFormat; exports.csvFormatBody =3D csvFormatBody; exports.csvFormatRows =3D csvFormatRows; exports.tsvParse =3D tsvParse; exports.tsvParseRows =3D tsvParseRows; exports.tsvFormat =3D tsvFormat; exports.tsvFormatBody =3D tsvFormatBody; exports.tsvFormatRows =3D tsvFormatRows; exports.autoType =3D autoType; exports.easeLinear =3D linear$1; exports.easeQuad =3D quadInOut; exports.easeQuadIn =3D quadIn; exports.easeQuadOut =3D quadOut; exports.easeQuadInOut =3D quadInOut; exports.easeCubic =3D cubicInOut; exports.easeCubicIn =3D cubicIn; exports.easeCubicOut =3D cubicOut; exports.easeCubicInOut =3D cubicInOut; exports.easePoly =3D polyInOut; exports.easePolyIn =3D polyIn; exports.easePolyOut =3D polyOut; exports.easePolyInOut =3D polyInOut; exports.easeSin =3D sinInOut; exports.easeSinIn =3D sinIn; exports.easeSinOut =3D sinOut; exports.easeSinInOut =3D sinInOut; exports.easeExp =3D expInOut; exports.easeExpIn =3D expIn; exports.easeExpOut =3D expOut; exports.easeExpInOut =3D expInOut; exports.easeCircle =3D circleInOut; exports.easeCircleIn =3D circleIn; exports.easeCircleOut =3D circleOut; exports.easeCircleInOut =3D circleInOut; exports.easeBounce =3D bounceOut; exports.easeBounceIn =3D bounceIn; exports.easeBounceOut =3D bounceOut; exports.easeBounceInOut =3D bounceInOut; exports.easeBack =3D backInOut; exports.easeBackIn =3D backIn; exports.easeBackOut =3D backOut; exports.easeBackInOut =3D backInOut; exports.easeElastic =3D elasticOut; exports.easeElasticIn =3D elasticIn; exports.easeElasticOut =3D elasticOut; exports.easeElasticInOut =3D elasticInOut; exports.blob =3D blob; exports.buffer =3D buffer; exports.dsv =3D dsv; exports.csv =3D csv$1; exports.tsv =3D tsv$1; exports.image =3D image; exports.json =3D json; exports.text =3D text; exports.xml =3D xml; exports.html =3D html; exports.svg =3D svg; exports.forceCenter =3D center$1; exports.forceCollide =3D collide; exports.forceLink =3D link; exports.forceManyBody =3D manyBody; exports.forceRadial =3D radial; exports.forceSimulation =3D simulation; exports.forceX =3D x$2; exports.forceY =3D y$2; exports.formatDefaultLocale =3D defaultLocale; exports.formatLocale =3D formatLocale; exports.formatSpecifier =3D formatSpecifier; exports.precisionFixed =3D precisionFixed; exports.precisionPrefix =3D precisionPrefix; exports.precisionRound =3D precisionRound; exports.geoArea =3D area$1; exports.geoBounds =3D bounds; exports.geoCentroid =3D centroid; exports.geoCircle =3D circle; exports.geoClipAntimeridian =3D clipAntimeridian; exports.geoClipCircle =3D clipCircle; exports.geoClipExtent =3D extent$1; exports.geoClipRectangle =3D clipRectangle; exports.geoContains =3D contains$1; exports.geoDistance =3D distance; exports.geoGraticule =3D graticule; exports.geoGraticule10 =3D graticule10; exports.geoInterpolate =3D interpolate$1; exports.geoLength =3D length$1; exports.geoPath =3D index$1; exports.geoAlbers =3D albers; exports.geoAlbersUsa =3D albersUsa; exports.geoAzimuthalEqualArea =3D azimuthalEqualArea; exports.geoAzimuthalEqualAreaRaw =3D azimuthalEqualAreaRaw; exports.geoAzimuthalEquidistant =3D azimuthalEquidistant; exports.geoAzimuthalEquidistantRaw =3D azimuthalEquidistantRaw; exports.geoConicConformal =3D conicConformal; exports.geoConicConformalRaw =3D conicConformalRaw; exports.geoConicEqualArea =3D conicEqualArea; exports.geoConicEqualAreaRaw =3D conicEqualAreaRaw; exports.geoConicEquidistant =3D conicEquidistant; exports.geoConicEquidistantRaw =3D conicEquidistantRaw; exports.geoEqualEarth =3D equalEarth; exports.geoEqualEarthRaw =3D equalEarthRaw; exports.geoEquirectangular =3D equirectangular; exports.geoEquirectangularRaw =3D equirectangularRaw; exports.geoGnomonic =3D gnomonic; exports.geoGnomonicRaw =3D gnomonicRaw; exports.geoIdentity =3D identity$5; exports.geoProjection =3D projection; exports.geoProjectionMutator =3D projectionMutator; exports.geoMercator =3D mercator; exports.geoMercatorRaw =3D mercatorRaw; exports.geoNaturalEarth1 =3D naturalEarth1; exports.geoNaturalEarth1Raw =3D naturalEarth1Raw; exports.geoOrthographic =3D orthographic; exports.geoOrthographicRaw =3D orthographicRaw; exports.geoStereographic =3D stereographic; exports.geoStereographicRaw =3D stereographicRaw; exports.geoTransverseMercator =3D transverseMercator; exports.geoTransverseMercatorRaw =3D transverseMercatorRaw; exports.geoRotation =3D rotation; exports.geoStream =3D geoStream; exports.geoTransform =3D transform; exports.cluster =3D cluster; exports.hierarchy =3D hierarchy; exports.pack =3D index$2; exports.packSiblings =3D siblings; exports.packEnclose =3D enclose; exports.partition =3D partition; exports.stratify =3D stratify; exports.tree =3D tree; exports.treemap =3D index$3; exports.treemapBinary =3D binary; exports.treemapDice =3D treemapDice; exports.treemapSlice =3D treemapSlice; exports.treemapSliceDice =3D sliceDice; exports.treemapSquarify =3D squarify; exports.treemapResquarify =3D resquarify; exports.interpolate =3D interpolateValue; exports.interpolateArray =3D array$1; exports.interpolateBasis =3D basis$1; exports.interpolateBasisClosed =3D basisClosed; exports.interpolateDate =3D date; exports.interpolateDiscrete =3D discrete; exports.interpolateHue =3D hue$1; exports.interpolateNumber =3D interpolateNumber; exports.interpolateObject =3D object; exports.interpolateRound =3D interpolateRound; exports.interpolateString =3D interpolateString; exports.interpolateTransformCss =3D interpolateTransformCss; exports.interpolateTransformSvg =3D interpolateTransformSvg; exports.interpolateZoom =3D interpolateZoom; exports.interpolateRgb =3D interpolateRgb; exports.interpolateRgbBasis =3D rgbBasis; exports.interpolateRgbBasisClosed =3D rgbBasisClosed; exports.interpolateHsl =3D hsl$2; exports.interpolateHslLong =3D hslLong; exports.interpolateLab =3D lab$1; exports.interpolateHcl =3D hcl$2; exports.interpolateHclLong =3D hclLong; exports.interpolateCubehelix =3D cubehelix$2; exports.interpolateCubehelixLong =3D cubehelixLong; exports.piecewise =3D piecewise; exports.quantize =3D quantize; exports.path =3D path; exports.polygonArea =3D area$2; exports.polygonCentroid =3D centroid$1; exports.polygonHull =3D hull; exports.polygonContains =3D contains$2; exports.polygonLength =3D length$2; exports.quadtree =3D quadtree; exports.randomUniform =3D uniform; exports.randomNormal =3D normal; exports.randomLogNormal =3D logNormal; exports.randomBates =3D bates; exports.randomIrwinHall =3D irwinHall; exports.randomExponential =3D exponential$1; exports.scaleBand =3D band; exports.scalePoint =3D point$1; exports.scaleIdentity =3D identity$7; exports.scaleLinear =3D linear$2; exports.scaleLog =3D log$1; exports.scaleSymlog =3D symlog; exports.scaleOrdinal =3D ordinal; exports.scaleImplicit =3D implicit; exports.scalePow =3D pow$1; exports.scaleSqrt =3D sqrt$1; exports.scaleQuantile =3D quantile$$1; exports.scaleQuantize =3D quantize$1; exports.scaleThreshold =3D threshold$1; exports.scaleTime =3D time; exports.scaleUtc =3D utcTime; exports.scaleSequential =3D sequential; exports.scaleSequentialLog =3D sequentialLog; exports.scaleSequentialPow =3D sequentialPow; exports.scaleSequentialSqrt =3D sequentialSqrt; exports.scaleSequentialSymlog =3D sequentialSymlog; exports.scaleSequentialQuantile =3D sequentialQuantile; exports.scaleDiverging =3D diverging; exports.scaleDivergingLog =3D divergingLog; exports.scaleDivergingPow =3D divergingPow; exports.scaleDivergingSqrt =3D divergingSqrt; exports.scaleDivergingSymlog =3D divergingSymlog; exports.tickFormat =3D tickFormat; exports.schemeCategory10 =3D category10; exports.schemeAccent =3D Accent; exports.schemeDark2 =3D Dark2; exports.schemePaired =3D Paired; exports.schemePastel1 =3D Pastel1; exports.schemePastel2 =3D Pastel2; exports.schemeSet1 =3D Set1; exports.schemeSet2 =3D Set2; exports.schemeSet3 =3D Set3; exports.interpolateBrBG =3D BrBG; exports.schemeBrBG =3D scheme; exports.interpolatePRGn =3D PRGn; exports.schemePRGn =3D scheme$1; exports.interpolatePiYG =3D PiYG; exports.schemePiYG =3D scheme$2; exports.interpolatePuOr =3D PuOr; exports.schemePuOr =3D scheme$3; exports.interpolateRdBu =3D RdBu; exports.schemeRdBu =3D scheme$4; exports.interpolateRdGy =3D RdGy; exports.schemeRdGy =3D scheme$5; exports.interpolateRdYlBu =3D RdYlBu; exports.schemeRdYlBu =3D scheme$6; exports.interpolateRdYlGn =3D RdYlGn; exports.schemeRdYlGn =3D scheme$7; exports.interpolateSpectral =3D Spectral; exports.schemeSpectral =3D scheme$8; exports.interpolateBuGn =3D BuGn; exports.schemeBuGn =3D scheme$9; exports.interpolateBuPu =3D BuPu; exports.schemeBuPu =3D scheme$a; exports.interpolateGnBu =3D GnBu; exports.schemeGnBu =3D scheme$b; exports.interpolateOrRd =3D OrRd; exports.schemeOrRd =3D scheme$c; exports.interpolatePuBuGn =3D PuBuGn; exports.schemePuBuGn =3D scheme$d; exports.interpolatePuBu =3D PuBu; exports.schemePuBu =3D scheme$e; exports.interpolatePuRd =3D PuRd; exports.schemePuRd =3D scheme$f; exports.interpolateRdPu =3D RdPu; exports.schemeRdPu =3D scheme$g; exports.interpolateYlGnBu =3D YlGnBu; exports.schemeYlGnBu =3D scheme$h; exports.interpolateYlGn =3D YlGn; exports.schemeYlGn =3D scheme$i; exports.interpolateYlOrBr =3D YlOrBr; exports.schemeYlOrBr =3D scheme$j; exports.interpolateYlOrRd =3D YlOrRd; exports.schemeYlOrRd =3D scheme$k; exports.interpolateBlues =3D Blues; exports.schemeBlues =3D scheme$l; exports.interpolateGreens =3D Greens; exports.schemeGreens =3D scheme$m; exports.interpolateGreys =3D Greys; exports.schemeGreys =3D scheme$n; exports.interpolatePurples =3D Purples; exports.schemePurples =3D scheme$o; exports.interpolateReds =3D Reds; exports.schemeReds =3D scheme$p; exports.interpolateOranges =3D Oranges; exports.schemeOranges =3D scheme$q; exports.interpolateCubehelixDefault =3D cubehelix$3; exports.interpolateRainbow =3D rainbow; exports.interpolateWarm =3D warm; exports.interpolateCool =3D cool; exports.interpolateSinebow =3D sinebow; exports.interpolateViridis =3D viridis; exports.interpolateMagma =3D magma; exports.interpolateInferno =3D inferno; exports.interpolatePlasma =3D plasma; exports.create =3D create; exports.creator =3D creator; exports.local =3D local; exports.matcher =3D matcher; exports.mouse =3D mouse; exports.namespace =3D namespace; exports.namespaces =3D namespaces; exports.clientPoint =3D point; exports.select =3D select; exports.selectAll =3D selectAll; exports.selection =3D selection; exports.selector =3D selector; exports.selectorAll =3D selectorAll; exports.style =3D styleValue; exports.touch =3D touch; exports.touches =3D touches; exports.window =3D defaultView; exports.customEvent =3D customEvent; exports.arc =3D arc; exports.area =3D area$3; exports.line =3D line; exports.pie =3D pie; exports.areaRadial =3D areaRadial; exports.radialArea =3D areaRadial; exports.lineRadial =3D lineRadial$1; exports.radialLine =3D lineRadial$1; exports.pointRadial =3D pointRadial; exports.linkHorizontal =3D linkHorizontal; exports.linkVertical =3D linkVertical; exports.linkRadial =3D linkRadial; exports.symbol =3D symbol; exports.symbols =3D symbols; exports.symbolCircle =3D circle$2; exports.symbolCross =3D cross$2; exports.symbolDiamond =3D diamond; exports.symbolSquare =3D square; exports.symbolStar =3D star; exports.symbolTriangle =3D triangle; exports.symbolWye =3D wye; exports.curveBasisClosed =3D basisClosed$1; exports.curveBasisOpen =3D basisOpen; exports.curveBasis =3D basis$2; exports.curveBundle =3D bundle; exports.curveCardinalClosed =3D cardinalClosed; exports.curveCardinalOpen =3D cardinalOpen; exports.curveCardinal =3D cardinal; exports.curveCatmullRomClosed =3D catmullRomClosed; exports.curveCatmullRomOpen =3D catmullRomOpen; exports.curveCatmullRom =3D catmullRom; exports.curveLinearClosed =3D linearClosed; exports.curveLinear =3D curveLinear; exports.curveMonotoneX =3D monotoneX; exports.curveMonotoneY =3D monotoneY; exports.curveNatural =3D natural; exports.curveStep =3D step; exports.curveStepAfter =3D stepAfter; exports.curveStepBefore =3D stepBefore; exports.stack =3D stack; exports.stackOffsetExpand =3D expand; exports.stackOffsetDiverging =3D diverging$1; exports.stackOffsetNone =3D none$1; exports.stackOffsetSilhouette =3D silhouette; exports.stackOffsetWiggle =3D wiggle; exports.stackOrderAppearance =3D appearance; exports.stackOrderAscending =3D ascending$3; exports.stackOrderDescending =3D descending$2; exports.stackOrderInsideOut =3D insideOut; exports.stackOrderNone =3D none$2; exports.stackOrderReverse =3D reverse; exports.timeInterval =3D newInterval; exports.timeMillisecond =3D millisecond; exports.timeMilliseconds =3D milliseconds; exports.utcMillisecond =3D millisecond; exports.utcMilliseconds =3D milliseconds; exports.timeSecond =3D second; exports.timeSeconds =3D seconds; exports.utcSecond =3D second; exports.utcSeconds =3D seconds; exports.timeMinute =3D minute; exports.timeMinutes =3D minutes; exports.timeHour =3D hour; exports.timeHours =3D hours; exports.timeDay =3D day; exports.timeDays =3D days; exports.timeWeek =3D sunday; exports.timeWeeks =3D sundays; exports.timeSunday =3D sunday; exports.timeSundays =3D sundays; exports.timeMonday =3D monday; exports.timeMondays =3D mondays; exports.timeTuesday =3D tuesday; exports.timeTuesdays =3D tuesdays; exports.timeWednesday =3D wednesday; exports.timeWednesdays =3D wednesdays; exports.timeThursday =3D thursday; exports.timeThursdays =3D thursdays; exports.timeFriday =3D friday; exports.timeFridays =3D fridays; exports.timeSaturday =3D saturday; exports.timeSaturdays =3D saturdays; exports.timeMonth =3D month; exports.timeMonths =3D months; exports.timeYear =3D year; exports.timeYears =3D years; exports.utcMinute =3D utcMinute; exports.utcMinutes =3D utcMinutes; exports.utcHour =3D utcHour; exports.utcHours =3D utcHours; exports.utcDay =3D utcDay; exports.utcDays =3D utcDays; exports.utcWeek =3D utcSunday; exports.utcWeeks =3D utcSundays; exports.utcSunday =3D utcSunday; exports.utcSundays =3D utcSundays; exports.utcMonday =3D utcMonday; exports.utcMondays =3D utcMondays; exports.utcTuesday =3D utcTuesday; exports.utcTuesdays =3D utcTuesdays; exports.utcWednesday =3D utcWednesday; exports.utcWednesdays =3D utcWednesdays; exports.utcThursday =3D utcThursday; exports.utcThursdays =3D utcThursdays; exports.utcFriday =3D utcFriday; exports.utcFridays =3D utcFridays; exports.utcSaturday =3D utcSaturday; exports.utcSaturdays =3D utcSaturdays; exports.utcMonth =3D utcMonth; exports.utcMonths =3D utcMonths; exports.utcYear =3D utcYear; exports.utcYears =3D utcYears; exports.timeFormatDefaultLocale =3D defaultLocale$1; exports.timeFormatLocale =3D formatLocale$1; exports.isoFormat =3D formatIso; exports.isoParse =3D parseIso; exports.now =3D now; exports.timer =3D timer; exports.timerFlush =3D timerFlush; exports.timeout =3D timeout$1; exports.interval =3D interval$1; exports.transition =3D transition; exports.active =3D active; exports.interrupt =3D interrupt; exports.voronoi =3D voronoi; exports.zoom =3D zoom; exports.zoomTransform =3D transform$1; exports.zoomIdentity =3D identity$9; Object.defineProperty(exports, '__esModule', { value: true }); }))); --kLqR5wKUBEbm+NQl-- --Ax9lNzlugw8JBjpt Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEsFFZSPHn08G5gDigJkb6MLrKfwgFAmAmxZ4ACgkQJkb6MLrK fwhbohAA4NjAlfe+EHYyDBkUs3qD+7YuiivhEK3jXbkcGVE6i8KK4OHtN0PXReaM 1f7jIJ7iMbpFMMCsUkbacH8RM1Cq9PspPNhEPiSTTygjN3qXmQCsHtKLQoBaq53t j5LGwJwRUlcunNfU6fjhiMQWpLMkfBxjtJYLcFLgc65AuBkqqk8A3uHx+4b8pem7 tMP23MKYrVtO1dSldjuAUz9KGPvl69B6kL++im56czeYt3Bqn7/ru4i3a5R9nmKt qDODodenxt9FLq+C/r5ubdrENeVAiXyTvDxTfhP7iqUknIxhod6f9l+heiisBLLW RFl87j/KDMQCgwtecs8OKPK2qkYK0K06j/LeuDy8zEPua/R2HDp/aMFbs//Mg5ZJ Xc/bcbYlfbirxsgAZYk7VWlDP4y5eaI5OJyLCstHfwvgUZhU1DVLT5TVVp4yEf9O SZeIuCcSTZkaNOrpNMsC+JidqiKtZZvHZSr11CsNgGumTVtJiNe1SAYRYD1Ap+bD Ja5MFtR4EtEkU5eUvxUBOs6qamdRb4KGTBpZlWrHoOfKRtp6Vojd0mpZCRsKfy2l wbe2K/2xdJ3V7yVb9AYn7cQUgt7tUZfbhvoFD6bJwOthseSvalvmyrnrSiTUl9mz SN67DQstbOJLBI6GrJTD2M6IUuzZkMF5v7JNbdqEU7lS2F4aIfk= =PCKV -----END PGP SIGNATURE----- --Ax9lNzlugw8JBjpt-- From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 12 15:24:46 2021 Received: (at submit) by debbugs.gnu.org; 12 Feb 2021 20:24:47 +0000 Received: from localhost ([127.0.0.1]:33069 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lAeze-0002PA-Jq for submit@debbugs.gnu.org; Fri, 12 Feb 2021 15:24:46 -0500 Received: from lists.gnu.org ([209.51.188.17]:38528) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lAezb-0002Ox-R2 for submit@debbugs.gnu.org; Fri, 12 Feb 2021 15:24:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:60056) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lAezb-00064U-FS for bug-guix@gnu.org; Fri, 12 Feb 2021 15:24:43 -0500 Received: from sender4-of-o51.zoho.com ([136.143.188.51]:21114) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lAezZ-0007I7-GE for bug-guix@gnu.org; Fri, 12 Feb 2021 15:24:43 -0500 ARC-Seal: i=1; a=rsa-sha256; t=1613161477; cv=none; d=zohomail.com; s=zohoarc; b=NMTnLZdb+yJg/nrO3BbsKmQD0plafWgYQ5Zgd0FAR6rs1UuRzs5L8dFZaFWhSZ/H2bb96Alzk8rLHqTP8QWwtwNpcyJOKR4CJAbetbiOxKqAdwfC+KXAFre2qcesK4YYQgRupGkbeAEjv+9IBwqZ8BYabl20csFmfkuBVjWEesU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1613161477; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=FW9S8YXNgbhjqdg/UC+HTtVVdSNrqJN6Nys+3sd7svc=; b=Y+0UdSegzI9ayVp998RFyr64z/CMTbdtlOrvHMl1j5d3u/LFdy/e4JeYQqP56W0EdTzzpaEUGHoYUrEVRYwDMUfJ7bEK7+5C4ClR5/6ty4/FMpgwr60TDjQDmWOqgK3hOOvTzQazsCFnYtEBk+cC9zwddR2TJbbODgILYqrWcBU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=elephly.net; spf=pass smtp.mailfrom=rekado@elephly.net; dmarc=pass header.from= header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1613161477; s=zoho; d=elephly.net; i=rekado@elephly.net; h=References:From:To:Cc:Subject:In-reply-to:Date:Message-ID:MIME-Version:Content-Type:Content-Transfer-Encoding; bh=FW9S8YXNgbhjqdg/UC+HTtVVdSNrqJN6Nys+3sd7svc=; b=MUbUal5gLqQ3gkmpQWPGaezkcDmF87/If36K+5PIMHzpS4DTLKrIg/kqJwtQhK03 Mc+k1m2zqgKdqiGO36UihNnnPGCICMNJeN5ZLUHneQiXQEKFQdcbAwvqwNRHazri8tn q/H49RHglV6aK4JCOff7xV6ZjlBEp5DObAV2ZtZw= Received: from localhost (p54ad4ba3.dip0.t-ipconnect.de [84.173.75.163]) by mx.zohomail.com with SMTPS id 1613161474329566.5760788480368; Fri, 12 Feb 2021 12:24:34 -0800 (PST) References: <20210212045315.3f4e0a82@scratchpost.org> User-agent: mu4e 1.4.14; emacs 27.1 From: Ricardo Wurmus To: Leo Famulari Subject: Re: bug#46456: [core-updates] d3.v5.js source checksum changed In-reply-to: X-URL: https://elephly.net X-PGP-Key: https://elephly.net/rekado.pubkey X-PGP-Fingerprint: BCA6 89B6 3655 3801 C3C6 2150 197A 5888 235F ACAC Date: Fri, 12 Feb 2021 21:24:30 +0100 Message-ID: <87pn15owzl.fsf@elephly.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-ZohoMailClient: External Received-SPF: pass client-ip=136.143.188.51; envelope-from=rekado@elephly.net; helo=sender4-of-o51.zoho.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: submit Cc: 46456@debbugs.gnu.org, Danny Milosavljevic , bug-guix@gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) Leo Famulari writes: > On Fri, Feb 12, 2021 at 04:53:15AM +0100, Danny Milosavljevic wrote: >> Starting download of /gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.js >> From https://d3js.org/d3.v5.js... >> downloading from https://d3js.org/d3.v5.js ... >> d3.v5.js = 2.22GiB/s 00:00 | 504KiB= transferred >> sha256 hash mismatch for /gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.= v5.js: >> expected hash: 0kxvx5pfagxn6nhavdwsdnzyd26g0z5dsfi1pi5dvcmb0c8ipcdn > > Attached. I guess we can=E2=80=99t use this URL then. This is just for the latest mi= nor version for major version 5. We use similar d3 URLs for the other major versions. --=20 Ricardo From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 12 22:15:33 2021 Received: (at 46456) by debbugs.gnu.org; 13 Feb 2021 03:15:33 +0000 Received: from localhost ([127.0.0.1]:33349 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lAlPB-0003vc-Lq for submit@debbugs.gnu.org; Fri, 12 Feb 2021 22:15:33 -0500 Received: from out4-smtp.messagingengine.com ([66.111.4.28]:41699) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lAlPA-0003vR-Sz for 46456@debbugs.gnu.org; Fri, 12 Feb 2021 22:15:32 -0500 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id BB7C55C0191; Fri, 12 Feb 2021 22:15:27 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute3.internal (MEProxy); Fri, 12 Feb 2021 22:15:27 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=famulari.name; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=mesmtp; bh=MGxB/ughCu1Eqw8veB0Xu4YH behZn054pBsHqWQ2Qks=; b=sKtVBEf/v/BVogWTKvhdLOYAKOuwY1C4vfPXUBJ0 I6XZukfgKKgofcxX6fcX4uOD09EYG2haNhuSU2SBR3nE+7I2mEh0Dgn43A2gNO5j nAzJll2QlvTnD42UHEOMVeq2lpLoAhUIytveh5VTJoNOfV8OU0ss9BJQBEbB2oE9 qlc= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=MGxB/u ghCu1Eqw8veB0Xu4YHbehZn054pBsHqWQ2Qks=; b=irpqC7ibCTTBwrRbQ6c9C+ MnGAymDSoAOEoWfYqDU4HhipCY78efkCczL14m2wFpA3IVwQ3/+1lOs7EVeJQ+yh s+CYmhkntJoOQDDC9nh95s6Rz1nnJsngMjJ8KuETC1tLhxB/m/ASQdbQDP953Af6 siDcxgFmYEv5kOzxNSQoIH6wMPIVcRujbdCvxtgjeekBgeTUxYOMJc37mDeJfnLH KkrUTqG2xUeZhzR3y3jZ7SQbzyylLm49CkF/OlCIUkTL262eK1VHmR1iztN/QCXj Dt4ggDqTecZ43m3RZy6ScvmmmEbNr5V22s4528cJ80Wdhp0rgs6lEZmcwiPp/KIg == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledriedvgdehkecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpeffhffvuffkfhggtggujgesghdtroertddtvdenucfhrhhomhepnfgvohcuhfgr mhhulhgrrhhiuceolhgvohesfhgrmhhulhgrrhhirdhnrghmvgeqnecuggftrfgrthhtvg hrnhepueeutdeugeekffefjeegieeileeiudfgheekuefhheeuhfettdeggeefieduhfeh necuffhomhgrihhnpegufehjshdrohhrghenucfkphepuddttddruddurdduieelrdduud eknecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheplhgv ohesfhgrmhhulhgrrhhirdhnrghmvg X-ME-Proxy: Received: from localhost (pool-100-11-169-118.phlapa.fios.verizon.net [100.11.169.118]) by mail.messagingengine.com (Postfix) with ESMTPA id 0934D1080057; Fri, 12 Feb 2021 22:15:27 -0500 (EST) Date: Fri, 12 Feb 2021 22:15:25 -0500 From: Leo Famulari To: Danny Milosavljevic Subject: Re: bug#46456: [core-updates] d3.v5.js source checksum changed Message-ID: References: <20210212045315.3f4e0a82@scratchpost.org> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="nUovHRq0yVcQd8rS" Content-Disposition: inline In-Reply-To: <20210212045315.3f4e0a82@scratchpost.org> X-Debbugs-Envelope-To: 46456 Cc: 46456@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" --nUovHRq0yVcQd8rS Content-Type: multipart/mixed; boundary="q32K1KNCrb6y1rxk" Content-Disposition: inline --q32K1KNCrb6y1rxk Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Fri, Feb 12, 2021 at 04:53:15AM +0100, Danny Milosavljevic wrote: > Starting download of /gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.js > From https://d3js.org/d3.v5.js... > downloading from https://d3js.org/d3.v5.js ... > d3.v5.js 2.22GiB/s 00:00 | 504KiB transferred > sha256 hash mismatch for /gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.js: > expected hash: 0kxvx5pfagxn6nhavdwsdnzyd26g0z5dsfi1pi5dvcmb0c8ipcdn Attached as a zip file to avoid being blocked by virus scanners. --q32K1KNCrb6y1rxk Content-Type: application/x-zip-compressed Content-Disposition: attachment; filename="d3.zip" Content-Transfer-Encoding: base64 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 AAToAwAAUEsFBgAAAAABAAEAbwAAAN/TAQAAAA== --q32K1KNCrb6y1rxk-- --nUovHRq0yVcQd8rS Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEsFFZSPHn08G5gDigJkb6MLrKfwgFAmAnRE0ACgkQJkb6MLrK fwhtCxAAuAYS1+YamXnsPfgFclV8nvAaObLepL9Gdy+MR2SinQjHpM2oV6VqyKQr jK6tEJMDbs50fTozHCvGemzK4FWhze6XxFKckvNdwSeiO1Z20YhDh59lY49+oufO fFkPBj80gUvAiNezEDRx8nY6/Cd3v6OxbJVYpfl9LUqIlpYiYIpxwde1A6H1hyxj C8XG4TVoVhqvduc4yPfAwWj0oA+FJqsCWj8B4hwAagnGHkIaSCYDBeG56aJ70RCh LM14I21emNj5gHzPryLAr3GUFO7hr80LkgRKpPF1Yozzj321/B+MQqplNqyk6pWT JoFa4IIUivGtVecTVty01hXfD5Lc9CuXgDy1c9meGp6GN+YR1axcxkGipCum/O/f DlOgVPlviTsbUx7RMwNycFcoIrfvyi3JLaaYBEDxN+RDy1FdCAy/dX7+WnU7i0+/ bjtadjn1iiHLAjSYzNEJKwb8poPmBzoY47sIRlbXWU+KQZnMQKVwH9IT6Rh8gy+J y6njq6NYE52bXOFEE5APc++zBCaJBNf8WUMzDvgQmGFPlTFogNoMVDJ6jA8ctN8F Jm2/pAMjJsT1waaJ4JdLKWJmA7oTVu7kOBf8XzW81iGIw+aKkITi2vHT814PTjZ/ 5f37yC8yAF2UVCQoJtutvfqMPuFOODZVeadt8WytgOLSOB0p/Lc= =yqaJ -----END PGP SIGNATURE----- --nUovHRq0yVcQd8rS-- From debbugs-submit-bounces@debbugs.gnu.org Wed Jul 13 01:20:04 2022 Received: (at 46456-done) by debbugs.gnu.org; 13 Jul 2022 05:20:04 +0000 Received: from localhost ([127.0.0.1]:44253 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oBUn6-0006D0-Ak for submit@debbugs.gnu.org; Wed, 13 Jul 2022 01:20:04 -0400 Received: from mail-qt1-f175.google.com ([209.85.160.175]:34642) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oBUn1-0006CK-NC for 46456-done@debbugs.gnu.org; Wed, 13 Jul 2022 01:20:02 -0400 Received: by mail-qt1-f175.google.com with SMTP id e5so234715qts.1 for <46456-done@debbugs.gnu.org>; Tue, 12 Jul 2022 22:19:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-transfer-encoding; bh=t5zgDqG+O8KSW8LBQyEqBQ9LqHo2qnlh7k0kUyuqZe8=; b=agrtX6uDqvgw0kWySVlHkdvhCCKyN4Y52bkCpALpbNpy8CJzaDQ13BM9KXLt/G7A0A ih3yfhju8gF7UjYUV8GBi9n2sgH8q+qW2joejvQZLslJD5Abk1Y0PaVhDzfS7NXkLvjR 8Ig5j5+W91FewqPZao9VJ8Ji9TWws6p9n7oCdBpjf4Q7aD+gVEOXkRlMrmmaUddSNoIF TejztVkFPyM0RkzCxzzkerM8WFHuLiKPv9J6rebQfvKDgSDelPanfdqRVQd1f2oaAtga rlAjAPHGe9k0Xli3475C4eJDj4iXHca8rL4N2cayhZsL6XbA7gayyvaAz4JcggxkteU/ XyGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-transfer-encoding; bh=t5zgDqG+O8KSW8LBQyEqBQ9LqHo2qnlh7k0kUyuqZe8=; b=W1+QU2chw7eaP6Qm0gw+aumJnoHqCTXHKgNrxksDQaarJxHlxq92XF8DuqSlVfomBg ++7p/FnZIpmRVsMFDkE/7TorFelj7803xOjwDchxI1KzooMb5c+pvRhd4WYD65IbnVFw uQZZdQEQu0i3GQxrjcqQWsgSmKCR1GIKuD8bsvHoMcEaqCB2UTKNsEsnFwIgu782AuHs Uguc6SDrk9gNT3ofMkk8nv2UW0iR/QhgRcAl4XjE2iPmgR/rFhRhrvpkr+C9FdVtd0xj AdFAzmDcjMa8IenRIvbG3u7g9flVzVKNH5sxRzSXnODKzFy9FFaYQQEh2UmIzjuZTPqv i8lw== X-Gm-Message-State: AJIora/54uez1og69yYreTSz3SGtRJa5xXjPC9DWc2xlugeP7hftYYfW 57sa5Mu7LAqDlDmXryjanuk1Gp12N31StT8A X-Google-Smtp-Source: AGRyM1tmJmXndQAg5CTJuoC/N+eyI62xN5MO2ey8MClxEjbANdA3L62vr5YUWNZirFoxgT6/vfqGVg== X-Received: by 2002:a05:622a:c5:b0:31d:3c8d:74d with SMTP id p5-20020a05622a00c500b0031d3c8d074dmr1405359qtw.182.1657689594173; Tue, 12 Jul 2022 22:19:54 -0700 (PDT) Received: from hurd (dsl-155-226.b2b2c.ca. [66.158.155.226]) by smtp.gmail.com with ESMTPSA id n7-20020ae9c307000000b006a34a22bc60sm10174894qkg.9.2022.07.12.22.19.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Jul 2022 22:19:53 -0700 (PDT) From: Maxim Cournoyer To: Ricardo Wurmus Subject: Re: bug#46456: [core-updates] d3.v5.js source checksum changed References: <20210212045315.3f4e0a82@scratchpost.org> <87pn15owzl.fsf@elephly.net> Date: Wed, 13 Jul 2022 01:19:52 -0400 In-Reply-To: <87pn15owzl.fsf@elephly.net> (Ricardo Wurmus's message of "Fri, 12 Feb 2021 21:24:30 +0100") Message-ID: <87fsj537yf.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 46456-done Cc: 46456-done@debbugs.gnu.org, dannym@scratchpost.org, Leo Famulari X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi, Ricardo Wurmus writes: > Leo Famulari writes: > >> On Fri, Feb 12, 2021 at 04:53:15AM +0100, Danny Milosavljevic wrote: >>> Starting download of /gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.= js >>> From https://d3js.org/d3.v5.js... >>> downloading from https://d3js.org/d3.v5.js ... >>> d3.v5.js = 2.22GiB/s 00:00 | 504Ki= B transferred >>> sha256 hash mismatch for /gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d3= .v5.js: >>> expected hash: 0kxvx5pfagxn6nhavdwsdnzyd26g0z5dsfi1pi5dvcmb0c8ipcdn >> >> Attached. > > I guess we can=E2=80=99t use this URL then. This is just for the latest = minor > version for major version 5. We use similar d3 URLs for the other major > versions. Updated hashes for all mismatching cases in commit 5017cca351. Closing. Thanks for the report! Maxim From unknown Mon Aug 18 11:12:14 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Wed, 10 Aug 2022 11:24:12 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator