X-Authentication-Warning: delorie.com: mail set sender to geda-user-bounces using -f X-Recipient: geda-user AT delorie DOT com Date: Sun, 15 Feb 2015 15:43:02 +0100 (CET) From: Roland Lutz To: geda-user AT delorie DOT com Subject: Re: [geda-user] work on gEDA In-Reply-To: Message-ID: References: <20150215021721 DOT 28d94fde AT jive> <20150215092144 DOT EF6D381A5EB8 AT turkos DOT aspodata DOT se> User-Agent: Alpine 2.11 (DEB 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-337791766-1424011382=:26783" Reply-To: geda-user AT delorie DOT com Errors-To: nobody AT delorie DOT com X-Mailing-List: geda-user AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323329-337791766-1424011382=:26783 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed On Sun, 15 Feb 2015, gedau AT igor2 DOT repo DOT hu wrote: > - support for non-scheme scripts; I have my own favorite non-popular > language (awk) which I don't expect to be supported, but honestly, I'd > be happy with anything mostly procedural (e.g. tcl, lua, python) > > - at least one complex backend rewritten in such a non-scheme/non-lisp > language, to serve as an example to those who want to write their own. > Preferably a backend in common use should be the victim and the scheme > variant should be removed so that the rewritten code has more chance to > stay up to date long term I'm currently working on porting gnetlist to Python. As a temporary fix, you can use some files I wrote some time ago which allow writing gnetlist backends in Python. Use gnet-python.scm as a gnetlist backend to generate a Python module which provides the netlist: $ gnetlist -L ... -g python -o example.py example.sch As an example, I translated the osmond backend to Python. To run it, call the function "osmond" on the netlist object: $ python -c ' > from example import netlist > from gnet_osmond import osmond > osmond(netlist, "example.out")' This is assuming example.py and gnet_osmond.py are in the current working directory. If they are not, you will have to set PYTHONPATH accordingly. Roland --8323329-337791766-1424011382=:26783 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=gnet-python.scm Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=gnet-python.scm OyBDb3B5cmlnaHQgKEMpIDIwMTMgUm9sYW5kIEx1dHoNCjsNCjsgVGhpcyBw cm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vciBtb2RpZnkNCjsgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkN CjsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMiBvZiB0aGUgTGljZW5zZSwgb3INCjsgKGF0IHlvdXIgb3B0aW9uKSBh bnkgbGF0ZXIgdmVyc2lvbi4NCjsNCjsgVGhpcyBwcm9ncmFtIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQo7 IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mDQo7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCjsgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCjsN CjsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCjsgYWxvbmcgd2l0aCB0aGlzIHBy b2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbiwNCjsgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG bG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuDQoNCihkZWZpbmUg KHB5dGhvbjpnZXQtYWxsLXBpbnMpDQogIChsZXQgY29sbGVjdC1waW5zICgo cGFja2FnZXMgcGFja2FnZXMpDQoJCSAgICAgKHJlc3VsdCAnKCkpKQ0KICAg IChpZiAobnVsbD8gcGFja2FnZXMpDQoJcmVzdWx0DQoJKGNvbGxlY3QtcGlu cw0KCSAoY2RyIHBhY2thZ2VzKQ0KCSAobGV0IGNvbGxlY3QtcGluczEgKChy ZWZkZXMgKGNhciBwYWNrYWdlcykpDQoJCQkgICAgIChwaW5zIChnbmV0bGlz dDpnZXQtcGlucyAoY2FyIHBhY2thZ2VzKSkpDQoJCQkgICAgIChyZXN1bHQg cmVzdWx0KSkNCgkgICAoaWYgKG51bGw/IHBpbnMpDQoJICAgICAgIHJlc3Vs dA0KCSAgICAgICAoY29ucyAoY29ucyByZWZkZXMgKGNhciBwaW5zKSkNCgkJ ICAgICAoY29sbGVjdC1waW5zMSByZWZkZXMgKGNkciBwaW5zKSByZXN1bHQp KSkpKSkpKQ0KDQooZGVmaW5lIChweXRob246cGFja2FnZS1pbmRleCByZWZk ZXMpDQogIChsZXQgZmluZC1wYWNrYWdlICgocGFja2FnZXMgcGFja2FnZXMp DQoJCSAgICAgKGluZGV4IDApKQ0KICAgIChpZiAobnVsbD8gcGFja2FnZXMp DQoJKGVycm9yICJyZWZkZXMgbm90IGZvdW5kIikNCgkoaWYgKHN0cmluZz0/ IHJlZmRlcyAoY2FyIHBhY2thZ2VzKSkNCgkgICAgaW5kZXgNCgkgICAgKGZp bmQtcGFja2FnZSAoY2RyIHBhY2thZ2VzKSAoKyBpbmRleCAxKSkpKSkpDQoN CihkZWZpbmUgKHB5dGhvbjpuZXQtaW5kZXggcmVmZGVzKQ0KICAobGV0IGZp bmQtbmV0ICgobmV0cyBhbGwtdW5pcXVlLW5ldHMpDQoJCSAoaW5kZXggMCkp DQogICAgKGlmIChudWxsPyBuZXRzKQ0KCSNmDQoJKGlmIChzdHJpbmc9PyBy ZWZkZXMgKGNhciBuZXRzKSkNCgkgICAgaW5kZXgNCgkgICAgKGZpbmQtbmV0 IChjZHIgbmV0cykgKCsgaW5kZXggMSkpKSkpKQ0KDQooZGVmaW5lIChweXRo b246d3JpdGUtYXR0cmlidXRlcyBnZXR0ZXIgZGVmYXVsdCBwb3J0KQ0KICAo Zm9yLWVhY2ggKGxhbWJkYSAoa2V5KQ0KCSAgICAgIChsZXQgKCh2YWx1ZSAo Z2V0dGVyIGtleSkpKQ0KCQkoaWYgKG5vdCAoc3RyaW5nPT8gZGVmYXVsdCB2 YWx1ZSkpDQoJCSAgICAoYmVnaW4gKGRpc3BsYXkga2V5IHBvcnQpDQoJCQkg ICAoZGlzcGxheSAiID0gJyIgcG9ydCkNCgkJCSAgIChkaXNwbGF5IHZhbHVl IHBvcnQpDQoJCQkgICAoZGlzcGxheSAiJywgIiBwb3J0KSkpKSkNCgkgICAg JygiYXV0aG9yIiAiY29tbWVudCIgImRlc2NyaXB0aW9uIiAiZGV2aWNlIiAi ZGlzdC1saWNlbnNlIg0KCSAgICAgICJkb2N1bWVudGF0aW9uIiAiZm9vdHBy aW50IiAiZ3JhcGhpY2FsIiAibmV0IiAibmV0bmFtZSINCgkgICAgICAibnVt c2xvdHMiICJwaW5sYWJlbCIgInBpbm51bWJlciIgInBpbnNlcSIgInBpbnR5 cGUiICJyZWZkZXMiDQoJICAgICAgInNsb3QiICJzbG90ZGVmIiAic291cmNl IiAic3ltdmVyc2lvbiIgInVzZS1saWNlbnNlIiAidmFsdWUiKSkpDQoNCihk ZWZpbmUgKHB5dGhvbiBvdXRwdXQtZmlsZW5hbWUpDQogIChsZXQgKChwb3J0 IChvcGVuLW91dHB1dC1maWxlIG91dHB1dC1maWxlbmFtZSkpKQ0KICAgIChk aXNwbGF5ICJmcm9tIG5ldGxpc3QgaW1wb3J0ICpcblxuIiBwb3J0KQ0KICAg IChkaXNwbGF5ICJuZXRsaXN0ID0gTmV0bGlzdCgiIHBvcnQpDQogICAgKHB5 dGhvbjp3cml0ZS1hdHRyaWJ1dGVzIChsYW1iZGEgKGtleSkNCgkJCSAgICAg ICAoZ25ldGxpc3Q6Z2V0LXRvcGxldmVsLWF0dHJpYnV0ZSBrZXkpKQ0KCQkJ ICAgICAibm90IGZvdW5kIiBwb3J0KQ0KICAgIChkaXNwbGF5ICIpXG4iIHBv cnQpDQogICAgKGRpc3BsYXkgIm5ldGxpc3QucGFja2FnZXMgPSBbXG4iIHBv cnQpDQogICAgKGZvci1lYWNoIChsYW1iZGEgKHBhY2thZ2UpDQoJCShkaXNw bGF5ICIgIFBhY2thZ2UoIiBwb3J0KQ0KCQk7KGRpc3BsYXkgIiciIHBvcnQp DQoJCTsoZGlzcGxheSBwYWNrYWdlIHBvcnQpDQoJCTsoZGlzcGxheSAiJywg IiBwb3J0KQ0KCQkocHl0aG9uOndyaXRlLWF0dHJpYnV0ZXMgKGxhbWJkYSAo a2V5KQ0KCQkJCQkgICAoZ25ldGxpc3Q6Z2V0LXBhY2thZ2UtYXR0cmlidXRl DQoJCQkJCSAgICBwYWNrYWdlIGtleSkpDQoJCQkJCSAidW5rbm93biIgcG9y dCkNCgkJKGRpc3BsYXkgIiksXG4iIHBvcnQpKQ0KCSAgICAgIHBhY2thZ2Vz KQ0KICAgIChkaXNwbGF5ICJdXG4iIHBvcnQpDQogICAgKGRpc3BsYXkgIm5l dGxpc3QubmV0cyA9IFtcbiIgcG9ydCkNCiAgICAoZm9yLWVhY2ggKGxhbWJk YSAobmV0KQ0KCQkoZGlzcGxheSAiICBOZXQoJyIgcG9ydCkNCgkJKGRpc3Bs YXkgbmV0IHBvcnQpDQoJCShkaXNwbGF5ICInKSxcbiIgcG9ydCkpDQoJICAg ICAgYWxsLXVuaXF1ZS1uZXRzKQ0KICAgIChkaXNwbGF5ICJdXG4iIHBvcnQp DQogICAgKGRpc3BsYXkgIm5ldGxpc3QucGlucyA9IFtcbiIgcG9ydCkNCiAg ICAoZm9yLWVhY2ggKGxhbWJkYSAocGFja2FnZSkNCgkJKGxldCAoKHBhY2th Z2UtaW5kZXggKHB5dGhvbjpwYWNrYWdlLWluZGV4IHBhY2thZ2UpKSkNCgkJ ICAoZm9yLWVhY2ggKGxhbWJkYSAocGluLW5ldCkNCgkJCSAgICAgIChkaXNw bGF5ICIgIFBpbihuZXRsaXN0LnBhY2thZ2VzWyIgcG9ydCkNCgkJCSAgICAg IChkaXNwbGF5IHBhY2thZ2UtaW5kZXggcG9ydCkNCgkJCSAgICAgIChkaXNw bGF5ICJdLCAiIHBvcnQpDQoJCQkgICAgICAobGV0ICgobmV0LWluZGV4DQoJ CQkJICAgICAocHl0aG9uOm5ldC1pbmRleCAoY2RyIHBpbi1uZXQpKSkpDQoJ CQkJKGlmIChlcT8gbmV0LWluZGV4ICNmKQ0KCQkJCSAgICAoZGlzcGxheSAi Tm9uZSwgIiBwb3J0KQ0KCQkJCSAgICAoYmVnaW4gKGRpc3BsYXkgIm5ldGxp c3QubmV0c1siIHBvcnQpDQoJCQkJCSAgIChkaXNwbGF5IG5ldC1pbmRleCBw b3J0KQ0KCQkJCQkgICAoZGlzcGxheSAiXSwgIiBwb3J0KSkpKQ0KCQkJICAg ICAgKGlmIChub3QgKHN0cmluZz0/DQoJCQkJCShnbmV0bGlzdDpnZXQtYXR0 cmlidXRlLWJ5LXBpbm51bWJlcg0KCQkJCQkgcGFja2FnZSAoY2FyIHBpbi1u ZXQpICJwaW5udW1iZXIiKQ0KCQkJCQkoY2FyIHBpbi1uZXQpKSkNCgkJCQkg IChiZWdpbiAoZGlzcGxheSAiVHJ1ZSwgcGlubnVtYmVyID0gJyIgcG9ydCkN CgkJCQkJIChkaXNwbGF5IChjYXIgcGluLW5ldCkgcG9ydCkNCgkJCQkJIChk aXNwbGF5ICInLCAiIHBvcnQpKQ0KCQkJCSAgKGRpc3BsYXkgIkZhbHNlLCAi IHBvcnQpKQ0KCQkJICAgICAgKHB5dGhvbjp3cml0ZS1hdHRyaWJ1dGVzDQoJ CQkgICAgICAgKGxhbWJkYSAoa2V5KQ0KCQkJCSAoZ25ldGxpc3Q6Z2V0LWF0 dHJpYnV0ZS1ieS1waW5udW1iZXINCgkJCQkgIHBhY2thZ2UgKGNhciBwaW4t bmV0KSBrZXkpKQ0KCQkJICAgICAgICJ1bmtub3duIiBwb3J0KQ0KCQkJICAg ICAgKGRpc3BsYXkgIiksXG4iIHBvcnQpKQ0KCQkJICAgIChnbmV0bGlzdDpn ZXQtcGlucy1uZXRzIHBhY2thZ2UpKSkpDQoJICAgICAgcGFja2FnZXMpDQog ICAgKGRpc3BsYXkgIl1cbiIgcG9ydCkNCiAgICAoZGlzcGxheSAibmV0bGlz dC5pbml0KClcbiIgcG9ydCkNCiAgICAoY2xvc2Utb3V0cHV0LXBvcnQgcG9y dCkpKQ0K --8323329-337791766-1424011382=:26783 Content-Type: TEXT/x-python; name=netlist.py Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=netlist.py IyBDb3B5cmlnaHQgKEMpIDIwMTMgUm9sYW5kIEx1dHoNCiMNCiMgVGhpcyBw cm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkN CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMiBvZiB0aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBh bnkgbGF0ZXIgdmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQoj IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMN CiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHBy b2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbiwNCiMgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG bG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuDQoNCmNsYXNzIE5l dGxpc3Q6DQogICAgZGVmIF9faW5pdF9fKHNlbGYsICoqYXR0cnMpOg0KICAg ICAgICBzZWxmLmF0dHJzID0gYXR0cnMNCg0KICAgIGRlZiBpbml0KHNlbGYp Og0KICAgICAgICBmb3IgcGluIGluIHNlbGYucGluczoNCiAgICAgICAgICAg IHBpbi5wYWNrYWdlLnBpbnMgKz0gW3Bpbl0NCiAgICAgICAgICAgIGlmIHBp bi5uZXQ6DQogICAgICAgICAgICAgICAgcGluLm5ldC5jb25uZWN0aW9ucyAr PSBbcGluXQ0KICAgICAgICAgICAgaWYgInBpbm51bWJlciIgaW4gcGluLmF0 dHJzOg0KICAgICAgICAgICAgICAgIHBpbi5wYWNrYWdlLnBpbnNfYnlfcGlu bnVtYmVyW3Bpbi5hdHRyc1sicGlubnVtYmVyIl1dID0gcGluDQogICAgICAg ICAgICBpZiAicGluc2VxIiBpbiBwaW4uYXR0cnM6DQogICAgICAgICAgICAg ICAgcGluLnBhY2thZ2UucGluc19ieV9waW5zZXFbcGluLmF0dHJzWyJwaW5z ZXEiXV0gPSBwaW4NCg0KY2xhc3MgUGFja2FnZToNCiAgICBkZWYgX19pbml0 X18oc2VsZiwgKiphdHRycyk6DQogICAgICAgIHNlbGYuYXR0cnMgPSBhdHRy cw0KICAgICAgICBzZWxmLnBpbnMgPSBbXQ0KICAgICAgICBzZWxmLnBpbnNf YnlfcGlubnVtYmVyID0ge30NCiAgICAgICAgc2VsZi5waW5zX2J5X3BpbnNl cSA9IHt9DQoNCmNsYXNzIE5ldDoNCiAgICBkZWYgX19pbml0X18oc2VsZiwg bmFtZSk6DQogICAgICAgIHNlbGYubmFtZSA9IG5hbWUNCiAgICAgICAgc2Vs Zi5jb25uZWN0aW9ucyA9IFtdDQoNCmNsYXNzIFBpbjoNCiAgICBkZWYgX19p bml0X18oc2VsZiwgcGFja2FnZSwgbmV0LCBpc192aXJ0dWFsLCAqKmF0dHJz KToNCiAgICAgICAgc2VsZi5wYWNrYWdlID0gcGFja2FnZQ0KICAgICAgICBz ZWxmLm5ldCA9IG5ldA0KICAgICAgICBzZWxmLmlzX3ZpcnR1YWwgPSBpc192 aXJ0dWFsDQogICAgICAgIHNlbGYuYXR0cnMgPSBhdHRycw0K --8323329-337791766-1424011382=:26783 Content-Type: TEXT/x-python; name=gnet_osmond.py Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=gnet_osmond.py IyBnRURBIC0gR1BMIEVsZWN0cm9uaWMgRGVzaWduIEF1dG9tYXRpb24NCiMg Z25ldGxpc3QgYmFjayBlbmQgZm9yIE9zbW9uZCBQQ0IgRGVzaWduDQojIENv cHlyaWdodCAoQykgMjAwNy0yMDEwIEpvaG4gUC4gRG90eQ0KIyBDb3B5cmln aHQgKEMpIDIwMTMgUm9sYW5kIEx1dHoNCiMNCiMgVGhpcyBwcm9ncmFtIGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v ciBtb2RpZnkNCiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0 aGUgTGljZW5zZSwgb3INCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQojIGJ1dCBXSVRI T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh cnJhbnR5IG9mDQojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUNCiMgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiMNCiMgWW91IHNo b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UNCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlm IG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUNCiMgRm91bmRhdGlv biwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBV U0EuDQoNCmRlZiBvc21vbmQobmV0bGlzdCwgb3V0cHV0X2ZpbGVuYW1lKToN CiAgICBmID0gb3BlbihvdXRwdXRfZmlsZW5hbWUsICd3JykNCiAgICBmb3Ig cGFja2FnZSBpbiBuZXRsaXN0LnBhY2thZ2VzOg0KICAgICAgICBmLndyaXRl KCdQYXJ0ICVzIHsgTmFtZSAlcyB9XG4nICUgKHBhY2thZ2UuYXR0cnNbJ2Zv b3RwcmludCddLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHBhY2thZ2UuYXR0cnNbJ3JlZmRlcyddKSkNCiAgICBmb3Ig bmV0IGluIG5ldGxpc3QubmV0czoNCiAgICAgICAgZi53cml0ZSgnU2lnbmFs ICIlcyJcbiAgeycgJSBuZXQubmFtZSkNCiAgICAgICAgZm9yIHBpbiBpbiBu ZXQuY29ubmVjdGlvbnM6DQogICAgICAgICAgICBmLndyaXRlKCIgJXMtJXMi ICUgKHBpbi5wYWNrYWdlLmF0dHJzWydyZWZkZXMnXSwNCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcGluLmF0dHJzWydwaW5udW1iZXInXSkp DQogICAgICAgIGYud3JpdGUoJyB9XG4nKQ0KICAgIGYuY2xvc2UoKQ0K --8323329-337791766-1424011382=:26783--