From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Tristan Colgate Newsgroups: gmane.lisp.guile.devel Subject: Re: a passionate guy who want to join in as a developer Date: Mon, 13 Aug 2012 11:41:16 +0100 Message-ID: References: <5024F643.8040706@netris.org> <1344853122.30422.23.camel@Renee-SUSE.suse> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=e89a8fb1ef5662782a04c72355d2 X-Trace: dough.gmane.org 1344854487 28585 80.91.229.3 (13 Aug 2012 10:41:27 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Mon, 13 Aug 2012 10:41:27 +0000 (UTC) Cc: guile-devel To: nalaginrut Original-X-From: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Mon Aug 13 12:41:27 2012 Return-path: Envelope-to: guile-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1T0s5N-0008NP-1D for guile-devel@m.gmane.org; Mon, 13 Aug 2012 12:41:25 +0200 Original-Received: from localhost ([::1]:49602 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T0s5M-0008SF-4m for guile-devel@m.gmane.org; Mon, 13 Aug 2012 06:41:24 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:35868) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T0s5H-0008SA-NG for guile-devel@gnu.org; Mon, 13 Aug 2012 06:41:22 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T0s5G-0000VC-Dy for guile-devel@gnu.org; Mon, 13 Aug 2012 06:41:19 -0400 Original-Received: from mail-ob0-f169.google.com ([209.85.214.169]:33623) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T0s5G-0000V3-3r for guile-devel@gnu.org; Mon, 13 Aug 2012 06:41:18 -0400 Original-Received: by obhx4 with SMTP id x4so7950638obh.0 for ; Mon, 13 Aug 2012 03:41:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=zs/WzMCMEoix6K0JsIndq+WxeBt2yVSXBWXXeCMmYOw=; b=vo7wiGeOeCP/8Po3uq+Sg3cIHsyND9ZyjrPaij9wPAbc1jAETUZkTlfTwl//Z16t2l faCd5YYkoj7YWD8eesKDPMaAdkSmRMn402TeoPrJgoijQ4fpX+LQPBGF+9epYeZBJU4g es0N7bHWANo68p/Erd3aUdF/4Kzm/GAS299O4AmrrCrQ3/aWbTiizf/D6ilz6wYbGKOM W8txmc13MSGBT5wMuNFTlKP63Nzl7BTlv9IIh7be3jnTWIG+xRNDt6mKv35kBfcl+qP+ w8925o8tJyhBRiUuXlEhJaKUPkuBYqifGUO+7I+kOhW0UNX8QEsrzhfMFneE6q7hVaRd SNJQ== Original-Received: by 10.60.12.8 with SMTP id u8mr16965213oeb.46.1344854477141; Mon, 13 Aug 2012 03:41:17 -0700 (PDT) Original-Received: by 10.76.144.133 with HTTP; Mon, 13 Aug 2012 03:41:16 -0700 (PDT) In-Reply-To: <1344853122.30422.23.camel@Renee-SUSE.suse> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.214.169 X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Original-Sender: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.devel:14799 Archived-At: --e89a8fb1ef5662782a04c72355d2 Content-Type: text/plain; charset=ISO-8859-1 [Meant to send this to the list] There's an implementation of a trie in guile-snmp, but it's one of the first things I wrote in scheme and is pretty hideous. I keep meaning to redo it using records instead of GOOPs. I'd ask for code review, but, to be honest, I didn't really have a clue what I was doing when I wrote it (things have only improved slightly since then). I've attached it, the trie code is about a third of the way in. It appears I never bothered writing the delete-node code. On 13 August 2012 11:18, nalaginrut wrote: > On Sun, 2012-08-12 at 22:31 +0800, rushan chen wrote: >> Hi Mark, >> >> Very appreciate for your reply. >> >> I see you mention that it's useful to implement a larger library of >> efficient data structure, and I'm interested in that very much. I used to >> work on projects which involve complicated but very interesting data >> structures, implementing them could be challenging, but once done I feel a >> great sense of achievement. >> > > good > >> One such project is implementing a language model (LM) which is a core >> component of speech recognition and machine translation. I don't know if >> you heard of it before. Unfortunately, I can't cover it too detailed here, >> that would complicate things too much. >> >> Basically, one of the key operations LM supports is it should return a >> probability associated with any given id sequence. All id sequences are of >> the same length, and there are a mass amount of such id sequences (a >> commonly-seen LM may contain billions of them). So it's required to store >> LM in a concise way, and at the same time make the search for each id >> sequence very quickly. >> > > OK, it's very good > > >> Trie is finally chosen to be the data structure for LM (there were many >> papers discussing this issue). All id sequences with the same prefix share >> the same internal node, for example, for <1, 2, 3, 4> and <1, 2, 3, 5>, >> only one copy of <1, 2, 3> will be stored in LM, and a search for a id >> sequence is done by a sequence of binary search until the leaf is met. One >> extra thing worth mentioning is that I store the whole trie structure in a >> single large piece of memory (usually around 2 gigabytes), which makes >> it convenient to write out to disk and load into memory by simply using >> mmap, and I think it also makes the system faster than if you allocate >> memory every time it's needed. >> > > Seems we don't have any prefix-tree implementation yet? > Maybe some hero too busy to share it? ;-) > I'd like to see you make it, or I must write myself one. > IIRC, many guys here wrote their own data-structure/algorithm > implementations. > Sharing makes our world better. > But, sometimes we reinvent wheels just for fun. > So just do what you want to do if it's interesting to you. > > >> There are some other projects I worked or working on like Spell Corrector, >> which also involve complicated data structures, but due to privacy policy, >> I can't say much about it. >> > > Actually, there's no privacy policy, that's why GNU and GPL exists. > If something force you not to share, you may rewrite it all by > yourself(or other guys), and GPL it. Then no more privacy policy. Your > friends will see your creativity, and your work be enhanced by others. > >> All in all, I'm very interested in it, and I really really hope I can help. >> >> Looking forward to your reply. Thanks in advance. >> >> Have fun! >> > > happy hacking! > >> Rushan Chen > > > -- Tristan Colgate-McFarlane ---- "You can get all your daily vitamins from 52 pints of guiness, and a glass of milk" --e89a8fb1ef5662782a04c72355d2 Content-Type: application/octet-stream; name="ipv4-router.scm" Content-Disposition: attachment; filename="ipv4-router.scm" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h5tfm1wa0 KGRlZmluZS1tb2R1bGUgKGlwdjQtcm91dGVyKQogICM6dXNlLW1vZHVsZSAob29wIGdvb3BzKQog ICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTExKQogICM6ZXhwb3J0IAogICAgKDxpcHY0LWFkZHJl c3M+IGlwIAogICAgIDxpcHY0LW5ldHdvcms+IG5ldHdvcmsgcHJlZml4IHByZWZpeC1sZW5ndGgg bWFzawogICAgIHByZWZpeGxlbi0+aW50bWFzawogICAgIGlwLWluLW5ldHdvcms/CiAgICAgPGlw djQtcm91dGU+IHJvdXRlIG5ldCBndyBtaXNjCiAgICAgPGlwdjQtdGFibGU+CiAgICAgYWRkLWlw djQtcm91dGUKICAgICBhZGQtaXB2NC1yb3V0ZSEKICAgICByZW1vdmUtaXB2NC1yb3V0ZQogICAg IHJlbW92ZS1pcHY0LXJvdXRlIQogICAgIGZpbmQtaXB2NC1yb3V0ZQogICAgIHRyaWUtcm9vdAog ICAgIDx0cmllLW5vZGU+CiAgICAgdmFsdWUgdmFsdWUtbGVuZ3RoCiAgICAgYWRkLXRyaWUtbm9k ZQogICAgIHRyaWUtbm9kZS0+ZG90CiAgICAgcm9vdG5vZGUKICAgICBudWxsbm9kZQogICAgIG9i amVjdC1lcXVhbD8KICAgICApKQoKOyBBIGNsYXNzIHRvIHJlcHJlc2VudCBhbiBpcCBhZGRyZXNz CihkZWZpbmUgKGlwdjRzdHItPmlwdjRpbnQgaXBzdHIpCiAgKGlmIChzdHJpbmc/IGlwc3RyKQog ICAgKGNhciAodmVjdG9yLXJlZiAoZ2V0aG9zdGJ5bmFtZSBpcHN0cikgNCApKQogICAgKGVycm9y ICJpcHN0ciBleHBlY3RzIGEgc3RyaW5nIikpKQoKKGRlZmluZS1jbGFzcyA8aXB2NC1hZGRyZXNz PiAoKQogIChpbnQtaXAgIzphY2Nlc3NvciBpbnQtaXAgCiAgICAgICAgICAjOmluaXQtdmFsdWUg MAogICAgICAgICAgIzppbml0LWtleXdvcmQgIzppbnQtaXApCiAgKGlwICM6aW5pdC1rZXl3b3Jk ICM6aXAKICAgICAgIzphbGxvY2F0aW9uICM6dmlydHVhbAogICAgICAjOnNsb3QtcmVmIChsYW1i ZGEodGhpcykoaW50LWlwIHRoaXMpKQogICAgICAjOnNsb3Qtc2V0ISAobGFtYmRhKHRoaXMgdmFs KShzZXQhIChpbnQtaXAgdGhpcykgdmFsKSkKICAgICAgIzphY2Nlc3NvciBpcCApKQoKKGRlZmlu ZS1tZXRob2QgKChzZXR0ZXIgaW50LWlwKSAodGhpcyA8aXB2NC1hZGRyZXNzPikgKGlwLXN0cmlu ZyA8c3RyaW5nPikpCiAgKHNsb3Qtc2V0ISB0aGlzICdpbnQtaXAgKGlwdjRzdHItPmlwdjRpbnQg aXAtc3RyaW5nKSkpCgooZGVmaW5lLW1ldGhvZCAoKHNldHRlciBpbnQtaXApICh0aGlzIDxpcHY0 LWFkZHJlc3M+KSAoaXAtaW50ZWdlciA8aW50ZWdlcj4pKQogIChzbG90LXNldCEgdGhpcyAnaW50 LWlwICBpcC1pbnRlZ2VyKSkKCihkZWZpbmUtbWV0aG9kICgoc2V0dGVyIGludC1pcCkgKHRoaXMg PGlwdjQtYWRkcmVzcz4pIGRlZmF1bHQpCiAgKGZvcm1hdCAoY3VycmVudC1lcnJvci1wb3J0KSAi Q2Fubm90IGNvbnZlcnQgdG8gSVA6IH5hfiUiIGRlZmF1bHQpCiAgKHRocm93ICdlcnJvcikpCgoo ZGVmaW5lLW1ldGhvZCAob2JqZWN0LWVxdWFsPyAoYSA8aXB2NC1hZGRyZXNzPikgKGIgPGlwdjQt YWRkcmVzcz4pKQogIChlcXVhbD8gKGludC1pcCBhKSAoaW50LWlwIGIpKSkKCihkZWZpbmUtbWV0 aG9kIChkaXNwbGF5ICh0aGlzIDxpcHY0LWFkZHJlc3M+KSBwb3J0KQogIChkaXNwbGF5IChpbmV0 LW50b2EgKGludC1pcCB0aGlzKSkpKQoKKGRlZmluZS1tZXRob2QgKHdyaXRlICh0aGlzIDxpcHY0 LWFkZHJlc3M+KSBwb3J0KQogIChmb3JtYXQgcG9ydCAiIzppcCh+cykiIChpbmV0LW50b2EgKGlu dC1pcCB0aGlzKSkpKQoKOyBDbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgbmV0d29yawooZGVmaW5l LWNsYXNzIDxpcHY0LW5ldHdvcms+ICgpCiAgKHByZWZpeCAjOmFjY2Vzc29yIHByZWZpeCAKICAg ICAgICAgICM6aW5pdC12YWx1ZSAobWFrZSA8aXB2NC1hZGRyZXNzPikKICAgICAgICAgICM6aW5p dC1rZXl3b3JkICM6cHJlZml4KQogIChwcmVmaXgtbGVuZ3RoICAjOmFjY2Vzc29yIHByZWZpeC1s ZW5ndGggCiAgICAgICAgICAgICAgICM6aW5pdC12YWx1ZSAwCiAgICAgICAgICAgICAgICM6aW5p dC1rZXl3b3JkICM6cHJlZml4LWxlbikKICAobmV0d29yayAjOmFsbG9jYXRpb24gIzp2aXJ0dWFs IAogICAgICAgICAgICM6YWNjZXNzb3IgbmV0d29yawogICAgICAgICAgICM6c2xvdC1yZWYgKGxh bWJkYSh0aGlzKShwcmVmaXggdGhpcykpCiAgICAgICAgICAgIzpzbG90LXNldCEgKGxhbWJkYSh0 aGlzIHZhbCkoc2V0ISAobmV0d29yayB0aGlzKSB2YWwpKQogICAgICAgICAgICM6aW5pdC1rZXl3 b3JkICM6bmV0d29yaykKICAobWFzayAjOmFsbG9jYXRpb24gIzp2aXJ0dWFsIAogICAgICAgICM6 YWNjZXNzb3IgbWFzawogICAgICAgICM6c2xvdC1yZWYgKGxhbWJkYSh0aGlzKShpbmV0LW50b2Eg KHByZWZpeGxlbi0+aW50bWFzayAocHJlZml4LWxlbmd0aCB0aGlzKSkpKQogICAgICAgICM6c2xv dC1zZXQhIChsYW1iZGEodGhpcyB2YWwpKHNldCEgKG1hc2sgdGhpcykgdmFsKSkKICAgICAgICAj OmluaXQta2V5d29yZCAjOm1hc2spKQoKOyBzZXR0ZXJzCihkZWZpbmUtbWV0aG9kICgoc2V0dGVy IHByZWZpeCkgKHRoaXMgPGlwdjQtbmV0d29yaz4pICh2YWx1ZSA8aXB2NC1hZGRyZXNzPikpCiAg KHNsb3Qtc2V0ISB0aGlzICdwcmVmaXggdmFsdWUpKQooZGVmaW5lLW1ldGhvZCAoKHNldHRlciBw cmVmaXgpICh0aGlzIDxpcHY0LW5ldHdvcms+KSB2YWx1ZSkKICAoc2xvdC1zZXQhIHRoaXMgJ3By ZWZpeCAobWFrZSA8aXB2NC1hZGRyZXNzPiAjOmlwIHZhbHVlKSkpCgooZGVmaW5lLW1ldGhvZCAo KHNldHRlciBwcmVmaXgtbGVuKSAodGhpcyA8aXB2NC1uZXR3b3JrPikgKHZhbHVlIDxpbnRlZ2Vy PikpCiAgKHNsb3Qtc2V0ISB0aGlzICdwcmVmaXgtbGVuZ3RoIHZhbHVlKSkKCihkZWZpbmUtbWV0 aG9kICgoc2V0dGVyIG1hc2spICh0aGlzIDxpcHY0LW5ldHdvcms+KSAodmFsdWUgPHN0cmluZz4p KQogIChzZXQhIChtYXNrIHRoaXMpIChpbmV0LWF0b24gdmFsdWUpKSkKCihkZWZpbmUtbWV0aG9k ICgoc2V0dGVyIG1hc2spICh0aGlzIDxpcHY0LW5ldHdvcms+KSAodmFsdWUgPGludGVnZXI+KSkK ICAobGV0KiAoKGludGxlbiAgKGludGVnZXItbGVuZ3RoIHZhbHVlKSkKICAgICAgICAgKGxlbiAo LSAzMiAgKGludGVnZXItbGVuZ3RoIChsb2d4b3IgdmFsdWUgKC0gKGludGVnZXItZXhwdCAyIDMy KSAxKSkpKSkpCiAgICAoaWYgKGFuZCAob3IgKGVxPyBpbnRsZW4gMCkgKGVxPyBpbnRsZW4gMzIp KQogICAgICAgICAgICAgKGVxPyBsZW4gKGxvZ2NvdW50IHZhbHVlKSkpCiAgICAgKHNldCEgKHBy ZWZpeC1sZW5ndGggdGhpcykgbGVuKQogICAgIChlcnJvciAiaW52YWxpZCAob3IgZGlzY29udGln dW91cykgbmV0bWFzayIpKSkpCgooZGVmaW5lIChwcmVmaXhsZW4tPmludG1hc2sgcHJlZmxlbikK ICAoYXNoICgtIChpbnRlZ2VyLWV4cHQgMiBwcmVmbGVuKSAxKSAoLSAzMiBwcmVmbGVuICkpKQog CihkZWZpbmUtbWV0aG9kICgoc2V0dGVyIG5ldHdvcmspICh0aGlzIDxpcHY0LW5ldHdvcms+KSAo bmV0d29ya3NwZWMgPHN0cmluZz4pKQogIChpZiAoc3RyaW5nLWluZGV4IG5ldHdvcmtzcGVjICNc LykKICAgIChsZXQgKChzcGVjIChzdHJpbmctc3BsaXQgbmV0d29ya3NwZWMgI1wvKSkpCiAgICAg IChzZXQhIChuZXR3b3JrIHRoaXMpIChsaXN0IChtYWtlIDxpcHY0LWFkZHJlc3M+ICM6aXAgKGNh ciBzcGVjKSkgKHN0cmluZy0+bnVtYmVyIChjYWRyIHNwZWMpKSkpKQogICAgKGlmIChzdHJpbmct aW5kZXggbmV0d29ya3NwZWMgI1wgKQogICAgICAobGV0ICgoc3BlYyAoc3RyaW5nLXNwbGl0IG5l dHdvcmtzcGVjICNcICkpKQogICAgICAgIChzZXQhIChuZXR3b3JrIHRoaXMpIChsaXN0IChtYWtl IDxpcHY0LWFkZHJlc3M+ICM6aXAgKGNhciBzcGVjKSkgKGNhZHIgc3BlYykpKSkKICAgICAgKGVy cm9yICJCYWQgbmV0d29yayBzcGVjaWZpY2F0aW9uIikpKSkKCihkZWZpbmUtbWV0aG9kICgoc2V0 dGVyIG5ldHdvcmspICh0aGlzIDxpcHY0LW5ldHdvcms+KSAobmV0d29ya3NwZWMgPHBhaXI+KSkK ICAobGV0ICgobmV0IChjYXIgbmV0d29ya3NwZWMpKQogICAgICAgIChtYXNrc3BlYyAoY2FkciBu ZXR3b3Jrc3BlYykpKQogICAgKHNldCEgKHByZWZpeCB0aGlzKSBuZXQpCiAgICAoY29uZCAKICAg ICAgICgoZXF1YWw/IChjbGFzcy1vZiBtYXNrc3BlYykgPHN0cmluZz4pCiAgICAgICAgKHNldCEg KG1hc2sgdGhpcykgbWFza3NwZWMpKQogICAgICAgKChlcXVhbD8gKGNsYXNzLW9mIG1hc2tzcGVj KSA8aW50ZWdlcj4pCiAgICAgICAgKHNldCEgKHByZWZpeC1sZW5ndGggdGhpcykgbWFza3NwZWMp KQogICAgICAgKGVsc2UgKHRocm93ICdlcnJvcikpKSkpCgooZGVmaW5lLW1ldGhvZCAob2JqZWN0 LWVxdWFsPyAoYSA8aXB2NC1uZXR3b3JrPikgKGIgPGlwdjQtbmV0d29yaz4pKQogIChhbmQKICAg IChvYmplY3QtZXF1YWw/IChwcmVmaXggYSkgKHByZWZpeCBiKSkKICAgIChlcXVhbD8gKHByZWZp eC1sZW5ndGggYSkgKHByZWZpeC1sZW5ndGggYikpKSkKCihkZWZpbmUtbWV0aG9kIChkaXNwbGF5 ICh0aGlzIDxpcHY0LW5ldHdvcms+KSBwb3J0KQogIChmb3JtYXQgcG9ydCAifmEvfmEiIChwcmVm aXggdGhpcykgKHByZWZpeC1sZW5ndGggdGhpcykpKQooZGVmaW5lLW1ldGhvZCAod3JpdGUgKHRo aXMgPGlwdjQtbmV0d29yaz4pIHBvcnQpCiAgKGZvcm1hdCBwb3J0ICIjOm5ldCh+cy9+cykiIChw cmVmaXggdGhpcykgKHByZWZpeC1sZW5ndGggdGhpcykpKQoKKGRlZmluZSAoaXAtaW4tbmV0d29y az8gdGVzdGlwIHRlc3RuZXQpCiAgKGVxdj8gKGxvZ2FuZCAoaXAgdGVzdGlwKSAocHJlZml4bGVu LT5pbnRtYXNrIChwcmVmaXgtbGVuZ3RoIHRlc3RuZXQpKSkKICAgICAgICAgIChpcCAocHJlZml4 IHRlc3RuZXQpKSkpCgo7IENsYXNzIGZvciByZXByZXNlbnRpbmcgYSByb3V0ZQooZGVmaW5lLWNs YXNzIDxpcHY0LXJvdXRlPiAoKQogIChfbmV0ICM6aW5pdC12YWx1ZSAobWFrZSA8aXB2NC1uZXR3 b3JrPiApKQogIChfZ3cgICM6aW5pdC12YWx1ZSAobWFrZSA8aXB2NC1hZGRyZXNzPiApKQogICht aXNjICM6aW5pdC12YWx1ZSAnKCkKICAgICAgICAjOmFjY2Vzc29yIG1pc2MKICAgICAgICAjOmlu aXQta2V5d29yZCAjOm1pc2MpCiAgKG5ldCAgIzphbGxvY2F0aW9uICM6dmlydHVhbAogICAgICAg ICM6YWNjZXNzb3IgbmV0IAogICAgICAgICM6c2xvdC1yZWYgKGxhbWJkYSh0aGlzKShzbG90LXJl ZiB0aGlzICdfbmV0KSkKICAgICAgICAjOnNsb3Qtc2V0ISAobGFtYmRhKHRoaXMgdmFsKShzZXQh IChuZXQgdGhpcykgdmFsKSkKICAgICAgICAjOmluaXQta2V5d29yZCAjOm5ldCkKICAoZ3cgICAj OmFsbG9jYXRpb24gIzp2aXJ0dWFsCiAgICAgICAgIzphY2Nlc3NvciBndyAKICAgICAgICAjOnNs b3QtcmVmIChsYW1iZGEodGhpcykoc2xvdC1yZWYgdGhpcyAnX2d3KSkKICAgICAgICAjOnNsb3Qt c2V0ISAobGFtYmRhKHRoaXMgdmFsKShzZXQhIChndyB0aGlzKSB2YWwpKQogICAgICAgICM6aW5p dC1rZXl3b3JkICM6Z3cpKQoKOyBzZXR0ZXJzCihkZWZpbmUtbWV0aG9kICgoc2V0dGVyIG5ldCkg KHRoaXMgPGlwdjQtcm91dGU+KSAodmFsIDxpcHY0LW5ldHdvcms+KSkKICAoc2xvdC1zZXQhIHRo aXMgJ19uZXQgdmFsKSkKKGRlZmluZS1tZXRob2QgKChzZXR0ZXIgbmV0KSAodGhpcyA8aXB2NC1y b3V0ZT4pIHZhbCkKICAoc2xvdC1zZXQhIHRoaXMgJ19uZXQgKG1ha2UgPGlwdjQtbmV0d29yaz4g IzpuZXR3b3JrIHZhbCkpKQoKKGRlZmluZS1tZXRob2QgKChzZXR0ZXIgZ3cpICh0aGlzIDxpcHY0 LXJvdXRlPikgKHZhbCA8aXB2NC1hZGRyZXNzPikpCiAgKHNsb3Qtc2V0ISB0aGlzICdfZ3cgdmFs KSkKKGRlZmluZS1tZXRob2QgKChzZXR0ZXIgZ3cpICh0aGlzIDxpcHY0LXJvdXRlPikgdmFsKQog IChzbG90LXNldCEgdGhpcyAnX2d3IChtYWtlIDxpcHY0LWFkZHJlc3M+ICM6aXAgdmFsKSkpCgoo ZGVmaW5lLW1ldGhvZCAob2JqZWN0LWVxdWFsPyAoYSA8aXB2NC1yb3V0ZT4pIChiIDxpcHY0LXJv dXRlPikpCiAgKGFuZAogICAgKG9iamVjdC1lcXVhbD8gKG5ldCBhKSAobmV0IGIpKQogICAgKG9i amVjdC1lcXVhbD8gKGd3IGEpIChndyBiKSkpKQoKKGRlZmluZS1tZXRob2QgKGRpc3BsYXkgKHRo aXMgPGlwdjQtcm91dGU+KSBwb3J0KQogIChmb3JtYXQgcG9ydCAifmEgdmlhIH5hIiAobmV0IHRo aXMpIChndyB0aGlzKSkpCihkZWZpbmUtbWV0aG9kICh3cml0ZSAodGhpcyA8aXB2NC1yb3V0ZT4p IHBvcnQpCiAgKGZvcm1hdCBwb3J0ICIjOnJvdXRlKH5zIHZpYSB+cykiIChuZXQgdGhpcykgKGd3 IHRoaXMpKSkKCjsgQ2xhc3MgZm9yIGltcGxlbWVudGluZyBhIGNvbXByZXNzZWQgcmFkaXggdHJl ZQo7CihkZWZpbmUtZ2VuZXJpYyB2YWx1ZS1iaW5zdHIpCihkZWZpbmUgbnVsbG5vZGUpCihkZWZp bmUtY2xhc3MgPHRyaWUtbm9kZT4gKCkKICAodmFsdWUgICAgICAgICAjOmFjY2Vzc29yIHZhbHVl ICAgICAgICAgCiAgICAgICAgICAgICAgICAgIzppbml0LXZhbHVlICAwIAogICAgICAgICAgICAg ICAgICM6aW5pdC1rZXl3b3JkICM6dmFsKQogICh2YWx1ZS1iaW5zdHIgICM6YWxsb2NhdGlvbiAj OnZpcnR1YWwgICAKICAgICAgICAgICAgICAgICAjOnNsb3QtcmVmIHZhbHVlLWJpbnN0ciAKICAg ICAgICAgICAgICAgICAjOnNsb3Qtc2V0ISB2YWx1ZS1iaW5zdHIKICAgICAgICAgICAgICAgICAj OmluaXQta2V5d29yZCAjOnZhbGJpbikKICAodmFsdWUtbGVuZ3RoICAjOmFjY2Vzc29yIHZhbHVl LWxlbmd0aCAgCiAgICAgICAgICAgICAgICAgIzppbml0LXZhbHVlIDAgCiAgICAgICAgICAgICAg ICAgIzppbml0LWtleXdvcmQgIzpsZW4pCiAgKGxlZnQgICAgICAgICAgIzphY2Nlc3NvciBsZWZ0 ICAgICAgICAgIAogICAgICAgICAgICAgICAgICM6aW5pdC12YWx1ZSBudWxsbm9kZSAKICAgICAg ICAgICAgICAgICAjOmluaXQta2V5d29yZCAjOmwpCiAgKHJpZ2h0ICAgICAgICAgIzphY2Nlc3Nv ciByaWdodCAgICAgICAgIAogICAgICAgICAgICAgICAgICM6aW5pdC12YWx1ZSBudWxsbm9kZQog ICAgICAgICAgICAgICAgICM6aW5pdC1rZXl3b3JkICM6cikKICAodXNlcmRhdGEgICAgICAjOmFj Y2Vzc29yIHVzZXJkYXRhICAgICAgCiAgICAgICAgICAgICAgICAgIzppbml0LXZhbHVlICNmIAog ICAgICAgICAgICAgICAgICM6aW5pdC1rZXl3b3JkICM6dWRhdGEpKQooc2V0ISBudWxsbm9kZSAo bWFrZSA8dHJpZS1ub2RlPikpCihkZWZpbmUgcm9vdG5vZGUgKG1ha2UgPHRyaWUtbm9kZT4gIzps IG51bGxub2RlICM6ciBudWxsbm9kZSkpCgo7IHNldHRlcnMKKGRlZmluZS1tZXRob2QgKChzZXR0 ZXIgdmFsdWUpICh0aGlzIDx0cmllLW5vZGU+KSAodmFsIDxpbnRlZ2VyPikpCiAgKHNsb3Qtc2V0 ISB0aGlzICd2YWx1ZSB2YWwpKQooZGVmaW5lLW1ldGhvZCAoKHNldHRlciB2YWx1ZS1sZW5ndGgp ICh0aGlzIDx0cmllLW5vZGU+KSAobGVuIDxpbnRlZ2VyPikpCiAgKHNsb3Qtc2V0ISB0aGlzICd2 YWx1ZS1sZW5ndGggbGVuKSkKKGRlZmluZS1tZXRob2QgKChzZXR0ZXIgbGVmdCkgKHRoaXMgPHRy aWUtbm9kZT4pIChsIDx0cmllLW5vZGU+KSkKICAoc2xvdC1zZXQhIHRoaXMgJ2xlZnQgbCkpCihk ZWZpbmUtbWV0aG9kICgoc2V0dGVyIHJpZ2h0KSAodGhpcyA8dHJpZS1ub2RlPikgKHIgPHRyaWUt bm9kZT4pKQogIChzbG90LXNldCEgdGhpcyAncmlnaHQgcikpCihkZWZpbmUtbWV0aG9kICgoc2V0 dGVyIHVzZXJkYXRhKSAodGhpcyA8dHJpZS1ub2RlPikgdWQpCiAgKHNsb3Qtc2V0ISB0aGlzICd1 c2VyZGF0YSB1ZCkpCgo7IHZpcnR1YWwgZ2V0dGVycwooZGVmaW5lLW1ldGhvZCAodmFsdWUtYmlu c3RyICh0aGlzIDx0cmllLW5vZGU+KSkKICAod2l0aC1vdXRwdXQtdG8tc3RyaW5nCiAgICAobGFt YmRhKCkKICAgICAgKGZvcm1hdCAjdCAKICAgICAgICAoc3RyaW5nLWFwcGVuZAogICAgICAgICAg KHN0cmluZy1hcHBlbmQgIn4iIAogICAgICAgICAgICAoc3RyaW5nLWFwcGVuZCAobnVtYmVyLT5z dHJpbmcgKHZhbHVlLWxlbmd0aCB0aGlzKSkpKQogICAgICAgICAgIiwnMGIiKQogICAgICAgICh2 YWx1ZSB0aGlzKSkpKSkKCihkZWZpbmUgKHNoYXJlZC1wcmVmaXggdjEgbDEgdjIgbDIpCiAgIlRh a2VzIHR3byBiaW5hcnkgc3RyaW5nIChudW1iZXIgYW5kIGxlbmd0aCkgYW5kIHJldHVybnMsIHVz aW5nIG11bHRpcGxlIHZhbHVlcwogICB0aGUgY29tbW9uIHByZWZpeCBhbmQgaXRzIGxlbmd0aCIK ICAoY29uZCAKICAgICAoKD0gbDEgbDIpCiAgICAgIChsZXQgYWdhaW4gKChyb3R2MSAgdjEpCiAg ICAgICAgICAgICAgICAgIChyb3R2MiAgdjIpCiAgICAgICAgICAgICAgICAgIChsICAgICAgbDEp KQogICAgICAgIChpZiAoZXF1YWw/IHJvdHYxIHJvdHYyKQogICAgICAgICAgICAodmFsdWVzIHJv dHYxIGwpCiAgICAgICAgICAgIChhZ2FpbiAoYXNoIHJvdHYxIC0xKSAoYXNoIHJvdHYyIC0xKSAo LSBsIDEpKSkpKQogICAgICgoPiBsMSBsMikKICAgICAgKHNoYXJlZC1wcmVmaXggKGFzaCB2MSAo LSBsMiBsMSkpIGwyIHYyIGwyKSkKICAgICAoKDwgbDEgbDIpCiAgICAgIChzaGFyZWQtcHJlZml4 IHYxIGwxIChhc2ggdjIgKC0gbDEgbDIpKSBsMSkpKSkKICAKKGRlZmluZS1nZW5lcmljIGFkZC10 cmllLW5vZGUpCihkZWZpbmUtbWV0aG9kIChhZGQtdHJpZS1ub2RlIChyb290IDx0cmllLW5vZGU+ KSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbCA8aW50ZWdlcj4pIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAobGVuIDxpbnRlZ2VyPikgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVkYXRhKQogIChpZiAoZXE/IHJvb3QgbnVsbG5vZGUpCiAgICA7IFdlIGFy ZSBiZWluZyBhc2tlZCB0byBhZGQgYSBuZXcgbGVhZgogICAgKG1ha2UgPHRyaWUtbm9kZT4gIzp2 YWwgdmFsICM6bGVuIGxlbiAjOmwgbnVsbG5vZGUgIzpyIG51bGxub2RlICM6dWRhdGEgdWRhdGEp CiAgICA7IFRyeWluZyB0byBhZGQgdG8gYW4gZXhpc3Rpbmcgbm9kZQogICAgICAobGV0LXZhbHVl cyAoKChjb21tb24tcHJlZiBjb21tb24tbGVuKSAoc2hhcmVkLXByZWZpeCAodmFsdWUgcm9vdCko dmFsdWUtbGVuZ3RoIHJvb3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB2YWwgbGVuKSkpCiAgICAgICAgKGlmIChlcXVhbD8gY29tbW9uLWxlbiAodmFsdWUt bGVuZ3RoIHJvb3QpIGxlbikKICAgICAgICAgIDsgV2UgYXJlIGFuIGV4YWN0IG1hdGNoIGZvciB0 aGlzIHByZWZpeAogICAgICAgICAgKGlmIChlcXVhbD8gdWRhdGEgKHVzZXJkYXRhIHJvb3QpKQog ICAgICAgICAgICAgOyBXZSBhcmUgYW4gZXhhY3QgbWF0Y2ggZm9yIHRoaXMgbm9kZSwganVzdCBy ZXR1cm4KICAgICAgICAgICAgIHJvb3QKICAgICAgICAgICAgIDsgVXNlcmRhdGEgaXMgZGlmZmVy ZW50CiAgICAgICAgICAgICAobWFrZSA8dHJpZS1ub2RlPiAjOnZhbCAodmFsdWUgcm9vdCkgCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjOmxlbiAodmFsdWUtbGVuZ3RoIHJvb3QpIAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzpsIChsZWZ0IHJvb3QpIAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIzpyIChyaWdodCByb290KQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIzp1ZGF0YSB1ZGF0YSkpCiAgICAgICAgICAoaWYgKGVxdWFsPyBjb21tb24t bGVuICh2YWx1ZS1sZW5ndGggcm9vdCkpCiAgICAgICAgICAgIDsgV2UgYXJlIGFsZXJpbmcgYSBz dWIgdHJlZQogICAgICAgICAgICAobGV0KiAoKG5leHRsZW4gKC0gbGVuIGNvbW1vbi1sZW4pKQog ICAgICAgICAgICAgICAgICAgKG5leHR2YWwgKGxvZ2FuZCB2YWwgKC0gKGludGVnZXItZXhwdCAy IG5leHRsZW4pIDEpKSkpCiAgICAgICAgICAgICAgKGlmIChub3QgKGxvZ2JpdD8gKC0gbmV4dGxl biAxKSB2YWwpKQogICAgICAgICAgICAgICAgO2FkZCB0byBsZWZ0IGZvciBhIHplcm8KICAgICAg ICAgICAgICAgIChsZXQgKChuZXh0bm9kZSAoYWRkLXRyaWUtbm9kZSAobGVmdCByb290KSBuZXh0 dmFsIG5leHRsZW4gdWRhdGEpKSkKICAgICAgICAgICAgICAgICAgKGlmIChlcT8gbmV4dG5vZGUg KGxlZnQgcm9vdCkpCiAgICAgICAgICAgICAgICAgICAgICByb290CiAgICAgICAgICAgICAgICAg ICAgICAobWFrZSA8dHJpZS1ub2RlPiAjOnZhbCAodmFsdWUgcm9vdCkgCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAjOmxlbiAodmFsdWUtbGVuZ3RoIHJvb3QpIAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzpsIG5leHRub2RlIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzpyIChyaWdodCByb290KQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzp1ZGF0YSAodXNlcmRhdGEgcm9vdCkp KSkKICAgICAgICAgICAgICAgIDthZGQgdG8gcmlnaHQgZm9yIGEgb25lIAogICAgICAgICAgICAg ICAgKGxldCAoKG5leHRub2RlIChhZGQtdHJpZS1ub2RlIChyaWdodCByb290KSBuZXh0dmFsIG5l eHRsZW4gdWRhdGEpKSkKICAgICAgICAgICAgICAgICAgKGlmIChlcT8gbmV4dG5vZGUgKHJpZ2h0 IHJvb3QpKQogICAgICAgICAgICAgICAgICAgICAgcm9vdAogICAgICAgICAgICAgICAgICAgICAg KG1ha2UgPHRyaWUtbm9kZT4gIzp2YWwgKHZhbHVlIHJvb3QpIAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIzpsZW4gKHZhbHVlLWxlbmd0aCByb290KSAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICM6bCAobGVmdCByb290KSAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICM6ciBuZXh0bm9kZQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIzp1ZGF0YSAodXNlcmRhdGEgcm9vdCkpKSkpKQog ICAgICAgICAgICA7IFdlIG5lZWQgdG8gc3BsaXQgb3VyIGN1cnJlbnQgbm9kZQogICAgICAgICAg ICAobGV0KiAoKGNvbW1vbi1yZW1haW5zIChtYWtlIDx0cmllLW5vZGU+IAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICM6dmFsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGxvZ2FuZCAodmFsdWUgcm9vdCkgCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoLSAoaW50ZWdlci1leHB0IDIgCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtICh2YWx1 ZS1sZW5ndGggcm9vdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLWxlbikpIAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIzpsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoLSAodmFsdWUtbGVuZ3RoIHJvb3QpIGNvbW1vbi1sZW4pCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIzpsIChsZWZ0IHJvb3QpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIzpyIChyaWdodCByb290KQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICM6dWRhdGEgKHVzZXJkYXRhIHJvb3QpKSkKICAgICAgICAgICAgICAgICAg IChjb21tb24tbmV3ZGF0YSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYg KGVxdWFsPyBsZW4gY29tbW9uLWxlbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIG51bGxub2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFrZSA8 dHJpZS1ub2RlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzp2YWwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2dhbmQgdmFsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtIChpbnRlZ2VyLWV4 cHQgMiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoLSBsZW4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uLWxlbikpIAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSkKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICM6bGVuICgtIGxlbiBjb21tb24tbGVuKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIzpsIG51bGxub2RlCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjOnIgbnVsbG5vZGUKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICM6dWRhdGEgdWRhdGEpKSkKICAgICAgICAgICAg ICAgICAgIChuZXh0dWRhdGEgICAgICAoaWYgKGVxdWFsPyBsZW4gY29tbW9uLWxlbikKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGF0YQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICNmKSkKICAgICAgICAgICAgICAgICAgIChuZXh0bGVmdCAgICAg ICAoaWYgKG5vdCAobG9nYml0PyAoLSAodmFsdWUtbGVuZ3RoIGNvbW1vbi1yZW1haW5zKSAxKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1 ZSBjb21tb24tcmVtYWlucykpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNvbW1vbi1yZW1haW5zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29t bW9uLW5ld2RhdGEpKQogICAgICAgICAgICAgICAgICAgKG5leHRyaWdodCAgICAgIChpZiAoZXE/ IG5leHRsZWZ0IGNvbW1vbi1yZW1haW5zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbW1vbi1uZXdkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY29tbW9uLXJlbWFpbnMpKSkKICAgICAgICAgICAgICAobWFrZSA8dHJpZS1ub2RlPiAjOnZh bCBjb21tb24tcHJlZiAjOmxlbiBjb21tb24tbGVuICM6bCBuZXh0bGVmdCAjOnIgbmV4dHJpZ2h0 ICM6dWRhdGEgbmV4dHVkYXRhKSkpKSkpKQoKKGRlZmluZS1nZW5lcmljIGRlbGV0ZS10cmllLW5v ZGUpCihkZWZpbmUtbWV0aG9kIChkZWxldGUtdHJpZS1ub2RlIChyb290bm9kZSA8dHJpZS1ub2Rl PikgKHByZWZpeCA8aW50ZWdlcj4pKSkKCihkZWZpbmUtZ2VuZXJpYyBsb25nZXN0LXByZWZpeC1t YXRjaCkKKGRlZmluZS1tZXRob2QgKGxvbmdlc3QtcHJlZml4LW1hdGNoIChyb290IDx0cmllLW5v ZGU+KSAodmFsIDxpbnRlZ2VyPikgKGxlbiA8aW50ZWdlcj4pKQogIChsZXQgIGFnYWluICgoY3Vy cm5vZGUgcm9vdCkKICAgICAgICAgICAgICAgKGN1cnJ2YWwgdmFsKQogICAgICAgICAgICAgICAo Y3VycmxlbiBsZW4pCiAgICAgICAgICAgICAgIChwcmV2bWF0Y2ggMCkKICAgICAgICAgICAgICAg KHByZXZtYXRjaGxlbiAwKQogICAgICAgICAgICAgICAocHJldm5vZGUgbnVsbG5vZGUpCiAgICAg ICAgICAgICAgIChiZXN0bWF0Y2ggMCkgCiAgICAgICAgICAgICAgIChiZXN0bWF0Y2hsZW4gMCkg CiAgICAgICAgICAgICAgIChiZXN0bWF0Y2hub2RlIG51bGxub2RlKSkgCiAgIChpZiAoZXE/IGN1 cnJub2RlIG51bGxub2RlKQogICAgICh2YWx1ZXMgYmVzdG1hdGNoIGJlc3RtYXRjaGxlbiBiZXN0 bWF0Y2hub2RlKQogICAgIChsZXQtdmFsdWVzICgoKGNvbW1vbi1wcmVmIGNvbW1vbi1sZW4pIChz aGFyZWQtcHJlZml4ICh2YWx1ZSBjdXJybm9kZSkodmFsdWUtbGVuZ3RoIGN1cnJub2RlKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJydmFsIGN1cnJsZW4p KSkKICAgICAgIChjb25kIAogICAgICAgICA7IFdlIGhhdmUgZ29uZSBhcyBmYXIgYXMgd2UgY2Fu LCBwcmV2bWF0Y2ggaG9sZHMgdGhlIGxvbmdlc3QgZnVsbCBtYXRjaAogICAgICAgICAoKDwgY29t bW9uLWxlbiAodmFsdWUtbGVuZ3RoIGN1cnJub2RlKSkKICAgICAgICAgICh2YWx1ZXMgYmVzdG1h dGNoIGJlc3RtYXRjaGxlbiBiZXN0bWF0Y2hub2RlKSkKICAgICAgICAgOyBUaGlzIG5vZGUgaXMg YW4gZXhhY3QgbWF0Y2gpKSkgCiAgICAgICAgICgoZXF1YWw/IGNvbW1vbi1sZW4gY3Vycmxlbikg CiAgICAgICAgICAodmFsdWVzCiAgICAgICAgICAgICAobG9nYW5kIChhc2ggcHJldm1hdGNoIGN1 cnJsZW4pIGN1cnJ2YWwpCiAgICAgICAgICAgICAoKyBjdXJybGVuIHByZXZtYXRjaGxlbikKICAg ICAgICAgICAgIGN1cnJub2RlKSkKICAgICAgICAgKGVsc2UgCiAgICAgICAgICAgKGxldHJlYyAo KG5leHR2YWwgKGxvZ2FuZCBjdXJydmFsICgtIChpbnRlZ2VyLWV4cHQgMiAoLSBjdXJybGVuICh2 YWx1ZS1sZW5ndGggY3Vycm5vZGUpKSkgMSkpKSAKICAgICAgICAgICAgICAgICAgICAobmV4dGxl biAoLSBjdXJybGVuICh2YWx1ZS1sZW5ndGggY3Vycm5vZGUpKSkpCiAgICAgICAgICAgICAoYWdh aW4gIAogICAgICAgICAgICAgICAgIChpZiAobG9nYml0PyAoLSBuZXh0bGVuIDEpIG5leHR2YWwp CiAgICAgICAgICAgICAgICAgICAocmlnaHQgY3Vycm5vZGUpCiAgICAgICAgICAgICAgICAgICAo bGVmdCBjdXJybm9kZSkpCiAgICAgICAgICAgICAgICAgbmV4dHZhbAogICAgICAgICAgICAgICAg IG5leHRsZW4KICAgICAgICAgICAgICAgICAobG9naW9yIChhc2ggcHJldm1hdGNoICh2YWx1ZS1s ZW5ndGggY3Vycm5vZGUpKSAodmFsdWUgY3Vycm5vZGUpKQogICAgICAgICAgICAgICAgICgrICh2 YWx1ZS1sZW5ndGggY3Vycm5vZGUpIHByZXZtYXRjaGxlbikKICAgICAgICAgICAgICAgICBjdXJy bm9kZQogICAgICAgICAgICAgICAgIChpZiAoZXF1YWw/ICh1c2VyZGF0YSBjdXJybm9kZSkgI2Yp CiAgICAgICAgICAgICAgICAgICAgYmVzdG1hdGNoCiAgICAgICAgICAgICAgICAgICAgKGxvZ2lv ciAoYXNoIHByZXZtYXRjaCAodmFsdWUtbGVuZ3RoIGN1cnJub2RlKSkgKHZhbHVlIGN1cnJub2Rl KSkpCiAgICAgICAgICAgICAgICAgKGlmIChlcXVhbD8gKHVzZXJkYXRhIGN1cnJub2RlKSAjZikK ICAgICAgICAgICAgICAgICAgICBiZXN0bWF0Y2hsZW4KICAgICAgICAgICAgICAgICAgICAoKyAo dmFsdWUtbGVuZ3RoIGN1cnJub2RlKSBwcmV2bWF0Y2hsZW4pKQogICAgICAgICAgICAgICAgIChp ZiAoZXF1YWw/ICh1c2VyZGF0YSBjdXJybm9kZSkgI2YpCiAgICAgICAgICAgICAgICAgICAgYmVz dG1hdGNobm9kZQogICAgICAgICAgICAgICAgICAgIGN1cnJub2RlKSkpKSkpKSkpCiAgCgo7IERp c3BsYXkgbWV0aG9kcwooZGVmaW5lLW1ldGhvZCAoZGlzcGxheSAodGhpcyA8dHJpZS1ub2RlPikg cG9ydCkKICAoaWYgKGVxPyB0aGlzIG51bGxub2RlKQogICAgKGZvcm1hdCBwb3J0ICJudWxsIikK ICAgIChmb3JtYXQgcG9ydCAiKCB+YiB+YSB+YSB+YSB+YSkiCiAgICAgICAgICAgICAgICAgKHZh bHVlIHRoaXMpCiAgICAgICAgICAgICAgICAgKHZhbHVlLWxlbmd0aCB0aGlzKQogICAgICAgICAg ICAgICAgIChsZWZ0IHRoaXMpCiAgICAgICAgICAgICAgICAgKHJpZ2h0IHRoaXMpCiAgICAgICAg ICAgICAgICAgKHVzZXJkYXRhIHRoaXMpKSkpCihkZWZpbmUtbWV0aG9kICh3cml0ZSAodGhpcyA8 dHJpZS1ub2RlPikgcG9ydCkKICAoaWYgKGVxPyB0aGlzIG51bGxub2RlKQogICAgKGZvcm1hdCBw b3J0ICJudWxsIikKICAgIChmb3JtYXQgcG9ydCAiIzp0cmllLW5vZGUodmFsOiB+YiBsZW46IH5h IGw6IH5hIHI6IH5hIHVkOiB+YSkiIAogICAgICAgICAgICAgICAgICh2YWx1ZSB0aGlzKQogICAg ICAgICAgICAgICAgICh2YWx1ZS1sZW5ndGggdGhpcykKICAgICAgICAgICAgICAgICAobGVmdCB0 aGlzKQogICAgICAgICAgICAgICAgIChyaWdodCB0aGlzKQogICAgICAgICAgICAgICAgICh1c2Vy ZGF0YSB0aGlzKSkpKQoKKGRlZmluZSAod2Fsay10cmllIHJvb3QgZnVuYykKICAoaWYgKG5vdCAo ZXE/IG51bGxub2RlIHJvb3QpKQogICAgKGJlZ2luCiAgICAgIChmdW5jIHJvb3QpCiAgICAgICh3 YWxrLXRyaWUgKGxlZnQgcm9vdCkgZnVuYykKICAgICAgKHdhbGstdHJpZSAocmlnaHQgcm9vdCkg ZnVuYykpKSkKCihkZWZpbmUgKHRyaWUtbm9kZS0+ZG90IHBvcnQgc3RhcnQpCiAgKGZvcm1hdCBw b3J0ICJkaWdyYXBoIEcge34lIikKICAod2Fsay10cmllIHN0YXJ0IChsYW1iZGEobm9kZSkKICAg ICAgICAgICAgICAgICAgICAgKGlmIChub3QgKGVxPyBub2RlIG51bGxub2RlKSkKICAgICAgICAg ICAgICAgICAgICAgICAoaWYgKG5vdCAoZXE/ICh2YWx1ZS1sZW5ndGggbm9kZSkgMCkpCiAgICAg ICAgICAgICAgICAgICAgICAgICAoZm9ybWF0IHBvcnQgIn5hIFtsYWJlbD1+c107fiUiIChvYmpl Y3QtYWRkcmVzcyBub2RlKSh3aXRoLW91dHB1dC10by1zdHJpbmcgKGxhbWJkYSgpKGZvcm1hdCAj dCAifmEgdmlhIH5hIiAodmFsdWUtYmluc3RyIG5vZGUpICh1c2VyZGF0YSBub2RlKSkpKSkKICAg ICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgcG9ydCAifmEgW2xhYmVsPVwicm9vdFwiXTt+ JSIgKG9iamVjdC1hZGRyZXNzIG5vZGUpKSkpKSkKICAod2Fsay10cmllIHN0YXJ0IChsYW1iZGEo bm9kZSkKICAgICAgICAgICAgICAgICAgICAgKGlmIChub3QgKGVxPyBub2RlIG51bGxub2RlKSkK ICAgICAgICAgICAgICAgICAgICAgICAoYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgIChp ZiAobm90IChlcT8gKGxlZnQgbm9kZSkgbnVsbG5vZGUpKQogICAgICAgICAgICAgICAgICAgICAg ICAgICAoZm9ybWF0IHBvcnQgIn5hLT5+YTt+JSIgKG9iamVjdC1hZGRyZXNzIG5vZGUpCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3QtYWRk cmVzcyAobGVmdCBub2RlKSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChub3QgKGVx PyAocmlnaHQgbm9kZSkgbnVsbG5vZGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9y bWF0IHBvcnQgIn5hLT5+YTt+JSIgKG9iamVjdC1hZGRyZXNzIG5vZGUpCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3QtYWRkcmVzcyAocmln aHQgbm9kZSkpKSkpKSkpCiAgKGZvcm1hdCBwb3J0ICJ9fiUiKSkKCjsgV3JhcHBlciBhcm91bmQg Y29tcHJlc3NlZCByYWRpeCBjb2RlIHRvIHN1cHBvcnQgaXB2NCByb3V0aW5nIHRhYmxlLgooZGVm aW5lLWNsYXNzIDxpcHY0LXRhYmxlPiAoKQogICh0cmllLXJvb3QgIzppbml0LXZhbHVlIHJvb3Ru b2RlIAogICAgICAgICAgICAgIzphY2Nlc3NvciB0cmllLXJvb3QpKQpgCihkZWZpbmUtZ2VuZXJp YyBhZGQtaXB2NC1yb3V0ZSkKKGRlZmluZS1tZXRob2QgKGFkZC1pcHY0LXJvdXRlICh0YWJsZSA8 aXB2NC10YWJsZT4pKHJvdXRlIDxpcHY0LXJvdXRlPikpCiAgKGxldCogKChuZXd0YWJsZSAgICAo bWFrZSA8aXB2NC10YWJsZT4pKQogICAgICAgICAoYWRkciAgICAobmV0IHJvdXRlKSkKICAgICAg ICAgKHByZWYgICAgKGlwIChwcmVmaXggYWRkcikpKQogICAgICAgICAocHJlZmxlbiAocHJlZml4 LWxlbmd0aCBhZGRyKSkpCiAgICAoc2V0ISAodHJpZS1yb290IG5ld3RhYmxlKSAoYWRkLXRyaWUt bm9kZSAodHJpZS1yb290IHRhYmxlKSAoYXNoIHByZWYgKC0gcHJlZmxlbiAzMikpIHByZWZsZW4g cm91dGUpKQogICAgbmV3dGFibGUpKQoKKGRlZmluZS1nZW5lcmljIGFkZC1pcHY0LXJvdXRlISkK KGRlZmluZS1tZXRob2QgKGFkZC1pcHY0LXJvdXRlISAodGFibGUgPGlwdjQtdGFibGU+KShyb3V0 ZSA8aXB2NC1yb3V0ZT4pKQogIChsZXQqKChhZGRyICAgIChuZXQgcm91dGUpKQogICAgICAgIChw cmVmICAgIChpcCAocHJlZml4IGFkZHIpKSkKICAgICAgICAocHJlZmxlbiAocHJlZml4LWxlbmd0 aCBhZGRyKSkpIAogICAgKHNldCEgKHRyaWUtcm9vdCB0YWJsZSkgKGFkZC10cmllLW5vZGUgKHRy aWUtcm9vdCB0YWJsZSkgKGFzaCBwcmVmICgtIHByZWZsZW4gMzIpKSBwcmVmbGVuIHJvdXRlKSkp KQoKKGRlZmluZS1nZW5lcmljIHJlbW92ZS1pcHY0LXJvdXRlKQooZGVmaW5lLW1ldGhvZCAocmVt b3ZlLWlwdjQtcm91dGUgKHRhYmxlIDxpcHY0LXRhYmxlPikocm91dGUgPGlwdjQtcm91dGU+KSkK ICAobGV0ICgobmV3dGFibGUgICAgKG1ha2UgPGlwdjQtdGFibGU+KSkpCiAgICAoc2V0ISAodHJp ZS1yb290IG5ld3RhYmxlKSAocmVtb3ZlLXRyaWUtbm9kZSAodHJpZS1yb290IHRhYmxlKSAobmV0 IHJvdXRlKSByb3V0ZSkpCiAgICBuZXd0YWJsZSkpCgooZGVmaW5lLWdlbmVyaWMgcmVtb3ZlLWlw djQtcm91dGUhKQooZGVmaW5lLW1ldGhvZCAocmVtb3ZlLWlwdjQtcm91dGUhICh0YWJsZSA8aXB2 NC10YWJsZT4pKHJvdXRlIDxpcHY0LXJvdXRlPikpCiAgKHNldCEgKHRyaWUtcm9vdCB0YWJsZSkg KHJlbW92ZS10cmllLW5vZGUgKHRyaWUtcm9vdCB0YWJsZSkgKG5ldCByb3V0ZSkgcm91dGUpKSkK CihkZWZpbmUtZ2VuZXJpYyBmaW5kLWlwdjQtcm91dGUpCihkZWZpbmUtbWV0aG9kIChmaW5kLWlw djQtcm91dGUgKHRhYmxlIDxpcHY0LXRhYmxlPikocm91dGUgPGlwdjQtYWRkcmVzcz4pKQogIChs ZXQtdmFsdWVzICgoKGZvdW5kcHJlZiBmb3VuZGxlbiBmb3VuZG5vZGUpCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAobG9uZ2VzdC1wcmVmaXgtbWF0Y2gKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICh0cmllLXJvb3QgdGFibGUpCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAoaXAgcm91dGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAzMikpKQogICAgKHVzZXJkYXRhIGZvdW5kbm9kZSkpKQoK --e89a8fb1ef5662782a04c72355d2--