From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Dmitry Gutov Newsgroups: gmane.emacs.bugs Subject: bug#64735: 29.0.92; find invocations are ~15x slower because of ignores Date: Tue, 25 Jul 2023 05:41:13 +0300 Message-ID: <69a98e2a-5816-d36b-9d04-8609291333cd@gutov.dev> References: <1fd5e3ed-e1c3-5d6e-897f-1d5d55e379fa@gutov.dev> <87wmyupvlw.fsf@localhost> <5c4d9bea-3eb9-b262-138a-4ea0cb203436@gutov.dev> <87tttypp2e.fsf@localhost> <87r0p030w0.fsf@yahoo.com> <83sf9f6wm0.fsf@gnu.org> <83sf9eub9d.fsf@gnu.org> <2d844a34-857d-3d59-b897-73372baac480@gutov.dev> <83bkg2tsu6.fsf@gnu.org> <83bd4246-ac41-90ec-1df3-02d0bd59ca44@gutov.dev> <834jlttv1p.fsf@gnu.org> <937c3b8e-7742-91b7-c2cf-4cadd0782f0c@gutov.dev> <83a5vlsanw.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------jKC7NdUtouvK1j69QsODn7eD" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="3341"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Cc: luangruo@yahoo.com, sbaugh@janestreet.com, yantar92@posteo.net, 64735@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Tue Jul 25 04:42:24 2023 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qO80F-0000df-JV for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 25 Jul 2023 04:42:24 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qO7zx-0004rY-A3; Mon, 24 Jul 2023 22:42:05 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qO7zu-0004rB-NE for bug-gnu-emacs@gnu.org; Mon, 24 Jul 2023 22:42:02 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qO7zu-0002K6-6P for bug-gnu-emacs@gnu.org; Mon, 24 Jul 2023 22:42:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qO7zu-0001Vs-2c for bug-gnu-emacs@gnu.org; Mon, 24 Jul 2023 22:42:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Dmitry Gutov Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 25 Jul 2023 02:42:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 64735 X-GNU-PR-Package: emacs Original-Received: via spool by 64735-submit@debbugs.gnu.org id=B64735.16902528885773 (code B ref 64735); Tue, 25 Jul 2023 02:42:02 +0000 Original-Received: (at 64735) by debbugs.gnu.org; 25 Jul 2023 02:41:28 +0000 Original-Received: from localhost ([127.0.0.1]:44431 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qO7zL-0001V2-Pu for submit@debbugs.gnu.org; Mon, 24 Jul 2023 22:41:28 -0400 Original-Received: from out3-smtp.messagingengine.com ([66.111.4.27]:59715) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qO7zG-0001Um-OD for 64735@debbugs.gnu.org; Mon, 24 Jul 2023 22:41:26 -0400 Original-Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 88AB95C00C4; Mon, 24 Jul 2023 22:41:17 -0400 (EDT) Original-Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Mon, 24 Jul 2023 22:41:17 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gutov.dev; h=cc :cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:sender :subject:subject:to:to; s=fm2; t=1690252877; x=1690339277; bh=Kd D5CaufEZfzbvLLgSfE9fmyv5EqLYURgdScJ9kdKTE=; b=nw49x9lOqHPJVGu/0W vn4Bg5spnMUpe2mZIYelT6T4PNb9nHIVKpNL11HwHeLl0kq2TLtXEWwexqo66lTZ KxSoJ2XpxSZRmh71Rlao+NKChcjw3ebbRfyEwGMjqSOSYChA6GJBCvpThnJn4I2x AQLKIt4f0BE8jXZ4gVK/Ct+n5GXUNDzpCe368+dZUYEvyeEj500pXtAv9vW1luKx 5RehGpk71dM0zPNId7fGrdkxHEL8w77qdjXWIMlWWfl4tUctjmim3RGaQRkq9qmp LXCvRIcL8lK8pp6+uzp2F2uY9Q6HODPtOXSujrjCZMt8C5zaaxeMGpXwSvrkRj0I RWzA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:sender:subject :subject:to:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm3; t=1690252877; x=1690339277; bh=KdD5CaufEZfzb vLLgSfE9fmyv5EqLYURgdScJ9kdKTE=; b=1YfQoGQ04+1oX/FM8HljVelrMPR5G /MJmum4B88dNdr7NJAa2WbbbBCYHOh6Ka5B7FX0rGUK3oOKAkhEm3ogF5RWcfi5M r/MPI9uva9xc57MqDow0m6tnKu5I7nFC+d9rm3YTSvMSpx4mv4w0GtF7vuZ7eUq4 4brCsKd10JrVuSJJwOpbYnB1B6vr+DROVl+ViwFCTULWRxOb1zRgp/ilxBUdykoC mxCTNNVYWQQgO872AeG1as7D1f6suIt7aWZFS2rJ/G538PCFotXZ4J088ZJtIIHE bVmaDuqDqY6vJk3fiYJtZLSxditXZwm+mRRFo66AGUfaXtGgVF57VxzvQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedviedrheelgdeitdcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpegtkfffgggfuffvvehfhfgjsehmtderredtfeejnecuhfhrohhmpeffmhhithhr hicuifhuthhovhcuoegumhhithhrhiesghhuthhovhdruggvvheqnecuggftrfgrthhtvg hrnhepheetkefgteeiueejuedvtddvleetffeljeetuddvfeffjeeiheehueetffevieej necuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepughmih htrhihsehguhhtohhvrdguvghv X-ME-Proxy: Feedback-ID: i0e71465a:Fastmail Original-Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 24 Jul 2023 22:41:15 -0400 (EDT) Content-Language: en-US In-Reply-To: <83a5vlsanw.fsf@gnu.org> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:266016 Archived-At: This is a multi-part message in MIME format. --------------jKC7NdUtouvK1j69QsODn7eD Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 24/07/2023 16:26, Eli Zaretskii wrote: >> Date: Mon, 24 Jul 2023 15:55:13 +0300 >> Cc: luangruo@yahoo.com, sbaugh@janestreet.com, yantar92@posteo.net, >> 64735@debbugs.gnu.org >> From: Dmitry Gutov >> >>>> 1. 'find' itself is much slower there. There is room for improvement in >>>> the port. >>> >>> I think it's the filesystem, not the port (which I did myself in this >>> case). >> >> But directory-files-recursively goes through the same filesystem, >> doesn't it? > > It does (more or less; see below). But I was not trying to explain > why Find is slower than directory-files-recursively, I was trying to > explain why Find on Windows is slower than Find on GNU/Linux. Understood. But we probably don't need to worry about the differences between platforms as much as about choosing the best option for each platform (or not choosing the worst, at least). So I'm more interested about how the find-based solution is more than 4x slower than the built-in one on MS Windows. > If you are asking why directory-files-recursively is so much faster on > Windows than Find, then the main factors I can think about are: > > . IPC, at least in how we implement it in Emacs on MS-Windows, via a > separate thread and OS-level events between them to signal that > stuff is available for reading, whereas > directory-files-recursively avoids this overhead completely; > . Find uses Posix APIs: 'stat', 'chdir', 'readdir' -- which on > Windows are emulated by wrappers around native APIs. Moreover, > Find uses 'char *' for file names, so calling native APIs involves > transparent conversion to UTF-16 and back, which is what native > APIs accept and return. By contrast, Emacs on Windows calls the > native APIs directly, and converts to UTF-16 from UTF-8, which is > faster. (This last point also means that using Find on Windows > has another grave disadvantage: it cannot fully support non-ASCII > file names, only those that can be encoded by the current > single-byte system codepage.) I seem to remember that Wine, which also does a similar dance of translating library and system calls, is often very close to the native performance for many programs. So this could be a problem, but necessarily a significant one. Although text encoding conversion seems like a prime suspect, if the problem is here. >>>> 2. The process output handling is worse. >>> >>> Not sure what that means. >> >> Emacs's ability to process the output of a process on the particular >> platform. >> >> You said: >> >> Btw, the Find command with pipe to some other program, like wc, >> finishes much faster, like 2 to 4 times faster than when it is run >> from find-directory-files-recursively. That's probably the slowdown >> due to communications with async subprocesses in action. > > I see this slowdown on GNU/Linux as well. > >> One thing to try it changing the -with-find implementation to use a >> synchronous call, to compare (e.g. using 'process-file'). And repeat >> these tests on GNU/Linux too. > > This still uses pipes, albeit without the pselect stuff. I'm attaching an extended benchmark, one that includes a "synchronous" implementation as well. Please give it a spin as well. Here (GNU/Linux) the reported numbers look like this: > (my-bench 1 default-directory "") (("built-in" . "Elapsed time: 1.601649s (0.709108s in 22 GCs)") ("with-find" . "Elapsed time: 1.792383s (1.135869s in 38 GCs)") ("with-find-p" . "Elapsed time: 1.248543s (0.682827s in 20 GCs)") ("with-find-sync" . "Elapsed time: 0.922291s (0.343497s in 10 GCs)")) --------------jKC7NdUtouvK1j69QsODn7eD Content-Type: text/x-emacs-lisp; charset=UTF-8; name="find-bench.el" Content-Disposition: attachment; filename="find-bench.el" Content-Transfer-Encoding: base64 KGRlZnVuIGZpbmQtZGlyZWN0b3J5LWZpbGVzLXJlY3Vyc2l2ZWx5IChkaXIgcmVnZXhwICZv cHRpb25hbCBpbmNsdWRlLWRpcmVjdG9yaWVzIF9wIGZvbGxvdy1zeW1saW5rcykKICAoY2wt YXNzZXJ0IChudWxsIF9wKSB0ICJmaW5kLWRpcmVjdG9yeS1maWxlcy1yZWN1cnNpdmVseSBj YW4ndCBhY2NlcHQgYXJiaXRyYXJ5IHByZWRpY2F0ZXMiKQogICh3aXRoLXRlbXAtYnVmZmVy CiAgICAoc2V0cSBjYXNlLWZvbGQtc2VhcmNoIG5pbCkKICAgIChjZCBkaXIpCiAgICAobGV0 KiAoKGNvbW1hbmQKCSAgICAoYXBwZW5kCgkgICAgIChsaXN0ICJmaW5kIiAoZmlsZS1sb2Nh bC1uYW1lIGRpcikpCgkgICAgIChpZiBmb2xsb3ctc3ltbGlua3MKCQkgJygiLUwiKQoJICAg ICAgICcoIiEiICIoIiAiLXR5cGUiICJsIiAiLXh0eXBlIiAiZCIgIikiKSkKCSAgICAgKHVu bGVzcyAoc3RyaW5nLWVtcHR5LXAgcmVnZXhwKQoJICAgICAgIChsaXN0ICItcmVnZXgiIChj b25jYXQgIi4qIiByZWdleHAgIi4qIikpKQoJICAgICAodW5sZXNzIGluY2x1ZGUtZGlyZWN0 b3JpZXMKCSAgICAgICAnKCIhIiAiLXR5cGUiICJkIikpCgkgICAgICcoIi1wcmludDAiKQoJ ICAgICApKQoJICAgKHJlbW90ZSAoZmlsZS1yZW1vdGUtcCBkaXIpKQoJICAgKHByb2MKCSAg ICAoaWYgcmVtb3RlCgkJKGxldCAoKHByb2MgKGFwcGx5ICMnc3RhcnQtZmlsZS1wcm9jZXNz CgkJCQkgICAiZmluZCIgKGN1cnJlbnQtYnVmZmVyKSBjb21tYW5kKSkpCgkJICAoc2V0LXBy b2Nlc3Mtc2VudGluZWwgcHJvYyAobGFtYmRhIChfcHJvYyBfc3RhdGUpKSkKCQkgIChzZXQt cHJvY2Vzcy1xdWVyeS1vbi1leGl0LWZsYWcgcHJvYyBuaWwpCgkJICBwcm9jKQoJICAgICAg KG1ha2UtcHJvY2VzcyA6bmFtZSAiZmluZCIgOmJ1ZmZlciAoY3VycmVudC1idWZmZXIpCgkJ CSAgICA6Y29ubmVjdGlvbi10eXBlICdwaXBlCgkJCSAgICA6bm9xdWVyeSB0CgkJCSAgICA6 c2VudGluZWwgKGxhbWJkYSAoX3Byb2MgX3N0YXRlKSkKCQkJICAgIDpjb21tYW5kIGNvbW1h bmQpKSkpCiAgICAgICh3aGlsZSAoYWNjZXB0LXByb2Nlc3Mtb3V0cHV0IHByb2MpKQogICAg ICAobGV0ICgoc3RhcnQgKGdvdG8tY2hhciAocG9pbnQtbWluKSkpIHJldCkKCSh3aGlsZSAo c2VhcmNoLWZvcndhcmQgIlwwIiBuaWwgdCkKCSAgKHB1c2ggKGNvbmNhdCByZW1vdGUgKGJ1 ZmZlci1zdWJzdHJpbmctbm8tcHJvcGVydGllcyBzdGFydCAoMS0gKHBvaW50KSkpKSByZXQp CgkgIChzZXRxIHN0YXJ0IChwb2ludCkpKQoJcmV0KSkpKQoKKGRlZnVuIGZpbmQtZGlyZWN0 b3J5LWZpbGVzLXJlY3Vyc2l2ZWx5LTIgKGRpciByZWdleHAgJm9wdGlvbmFsIGluY2x1ZGUt ZGlyZWN0b3JpZXMgX3AgZm9sbG93LXN5bWxpbmtzKQogIChjbC1hc3NlcnQgKG51bGwgX3Ap IHQgImZpbmQtZGlyZWN0b3J5LWZpbGVzLXJlY3Vyc2l2ZWx5IGNhbid0IGFjY2VwdCBhcmJp dHJhcnkgcHJlZGljYXRlcyIpCiAgKGNsLWFzc2VydCAobm90IChmaWxlLXJlbW90ZS1wIGRp cikpKQogIChsZXQqIChidWZmZXJlZAogICAgICAgICByZXN1bHQKICAgICAgICAgKHByb2MK CSAgKG1ha2UtcHJvY2VzcwogICAgICAgICAgIDpuYW1lICJmaW5kIiA6YnVmZmVyIG5pbAoJ ICAgOmNvbm5lY3Rpb24tdHlwZSAncGlwZQoJICAgOm5vcXVlcnkgdAoJICAgOnNlbnRpbmVs IChsYW1iZGEgKF9wcm9jIF9zdGF0ZSkpCiAgICAgICAgICAgOmZpbHRlciAobGFtYmRhIChw cm9jIGRhdGEpCiAgICAgICAgICAgICAgICAgICAgIChsZXQgKChzdGFydCAwKSkKICAgICAg ICAgICAgICAgICAgICAgICAod2hlbi1sZXQgKGVuZCAoc3RyaW5nLXNlYXJjaCAiXDAiIGRh dGEgc3RhcnQpKQogICAgICAgICAgICAgICAgICAgICAgICAgKHB1c2ggKGNvbmNhdCBidWZm ZXJlZCAoc3Vic3RyaW5nIGRhdGEgc3RhcnQgZW5kKSkgcmVzdWx0KQogICAgICAgICAgICAg ICAgICAgICAgICAgKHNldHEgYnVmZmVyZWQgIiIpCiAgICAgICAgICAgICAgICAgICAgICAg ICAoc2V0cSBzdGFydCAoMSsgZW5kKSkKICAgICAgICAgICAgICAgICAgICAgICAgICh3aGls ZS1sZXQgKChlbmQgKHN0cmluZy1zZWFyY2ggIlwwIiBkYXRhIHN0YXJ0KSkpCiAgICAgICAg ICAgICAgICAgICAgICAgICAgIChwdXNoIChzdWJzdHJpbmcgZGF0YSBzdGFydCBlbmQpIHJl c3VsdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgc3RhcnQgKDErIGVuZCkp KSkKICAgICAgICAgICAgICAgICAgICAgICAoc2V0cSBidWZmZXJlZCAoY29uY2F0IGJ1ZmZl cmVkIChzdWJzdHJpbmcgZGF0YSBzdGFydCkpKSkpCgkgICA6Y29tbWFuZCAoYXBwZW5kCgkg ICAgICAgICAgICAgKGxpc3QgImZpbmQiIChmaWxlLWxvY2FsLW5hbWUgZGlyKSkKCSAgICAg ICAgICAgICAoaWYgZm9sbG93LXN5bWxpbmtzCgkJICAgICAgICAgJygiLUwiKQoJICAgICAg ICAgICAgICAgJygiISIgIigiICItdHlwZSIgImwiICIteHR5cGUiICJkIiAiKSIpKQoJICAg ICAgICAgICAgICh1bmxlc3MgKHN0cmluZy1lbXB0eS1wIHJlZ2V4cCkKCSAgICAgICAgICAg ICAgIChsaXN0ICItcmVnZXgiIChjb25jYXQgIi4qIiByZWdleHAgIi4qIikpKQoJICAgICAg ICAgICAgICh1bmxlc3MgaW5jbHVkZS1kaXJlY3RvcmllcwoJICAgICAgICAgICAgICAgJygi ISIgIi10eXBlIiAiZCIpKQoJICAgICAgICAgICAgICcoIi1wcmludDAiKQoJICAgICAgICAg ICAgICkpKSkKICAgICh3aGlsZSAoYWNjZXB0LXByb2Nlc3Mtb3V0cHV0IHByb2MpKQogICAg cmVzdWx0KSkKCihkZWZ1biBmaW5kLWRpcmVjdG9yeS1maWxlcy1yZWN1cnNpdmVseS0zIChk aXIgcmVnZXhwICZvcHRpb25hbCBpbmNsdWRlLWRpcmVjdG9yaWVzIF9wIGZvbGxvdy1zeW1s aW5rcykKICAoY2wtYXNzZXJ0IChudWxsIF9wKSB0ICJmaW5kLWRpcmVjdG9yeS1maWxlcy1y ZWN1cnNpdmVseSBjYW4ndCBhY2NlcHQgYXJiaXRyYXJ5IHByZWRpY2F0ZXMiKQogIChjbC1h c3NlcnQgKG5vdCAoZmlsZS1yZW1vdGUtcCBkaXIpKSkKICAobGV0ICgoYXJncyBgKCwoZmls ZS1sb2NhbC1uYW1lIGRpcikKCSAgICAgICAgLEAoaWYgZm9sbG93LXN5bWxpbmtzCgkJICAg ICAgJygiLUwiKQoJICAgICAgICAgICAgJygiISIgIigiICItdHlwZSIgImwiICIteHR5cGUi ICJkIiAiKSIpKQoJICAgICAgICAsQCh1bmxlc3MgKHN0cmluZy1lbXB0eS1wIHJlZ2V4cCkK CSAgICAgICAgICAgIChsaXN0ICItcmVnZXgiIChjb25jYXQgIi4qIiByZWdleHAgIi4qIikp KQoJICAgICAgICAsQCh1bmxlc3MgaW5jbHVkZS1kaXJlY3RvcmllcwoJICAgICAgICAgICAg JygiISIgIi10eXBlIiAiZCIpKQoJICAgICAgICAiLXByaW50MCIpKSkKICAgICh3aXRoLXRl bXAtYnVmZmVyCiAgICAgIChsZXQgKChzdGF0dXMgKGFwcGx5ICMncHJvY2Vzcy1maWxlCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5kIgogICAgICAgICAgICAgICAgICAgICAg ICAgICBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdAogICAgICAgICAgICAgICAg ICAgICAgICAgICBuaWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncykpCiAgICAg ICAgICAgIChwdCAocG9pbnQtbWluKSkKICAgICAgICAgICAgcmVzKQogICAgICAgICh1bmxl c3MgKHplcm9wIHN0YXR1cykKICAgICAgICAgIChlcnJvciAiTGlzdGluZyBmYWlsZWQiKSkK ICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQogICAgICAgICh3aGlsZSAoc2VhcmNo LWZvcndhcmQgIlwwIiBuaWwgdCkKICAgICAgICAgIChwdXNoIChidWZmZXItc3Vic3RyaW5n LW5vLXByb3BlcnRpZXMgcHQgKDEtIChwb2ludCkpKQogICAgICAgICAgICAgICAgcmVzKQog ICAgICAgICAgKHNldHEgcHQgKHBvaW50KSkpCiAgICAgICAgcmVzKSkpKQoKKGRlZnVuIG15 LWJlbmNoIChjb3VudCBwYXRoIHJlZ2V4cCkKICAoc2V0cSBwYXRoIChleHBhbmQtZmlsZS1u YW1lIHBhdGgpKQogIDs7IChsZXQgKChvbGQgKGRpcmVjdG9yeS1maWxlcy1yZWN1cnNpdmVs eSBwYXRoIHJlZ2V4cCkpCiAgOzsgICAgICAgKG5ldyAoZmluZC1kaXJlY3RvcnktZmlsZXMt cmVjdXJzaXZlbHktMyBwYXRoIHJlZ2V4cCkpKQogIDs7ICAgKGRvbGlzdCAocGF0aCBvbGQp CiAgOzsgICAgICh1bmxlc3MgKG1lbWJlciBwYXRoIG5ldykgKGVycm9yICIhICVzIG5vdCBp biIgcGF0aCkpKQogIDs7ICAgKGRvbGlzdCAocGF0aCBuZXcpCiAgOzsgICAgICh1bmxlc3Mg KG1lbWJlciBwYXRoIG9sZCkgKGVycm9yICIhISAlcyBub3QgaW4iIHBhdGgpKSkpCiAgKGxp c3QKICAgKGNvbnMgImJ1aWx0LWluIiAoYmVuY2htYXJrIGNvdW50IChsaXN0ICdkaXJlY3Rv cnktZmlsZXMtcmVjdXJzaXZlbHkgcGF0aCByZWdleHApKSkKICAgKGNvbnMgIndpdGgtZmlu ZCIgKGJlbmNobWFyayBjb3VudCAobGlzdCAnZmluZC1kaXJlY3RvcnktZmlsZXMtcmVjdXJz aXZlbHkgcGF0aCByZWdleHApKSkKICAgKGNvbnMgIndpdGgtZmluZC1wIiAoYmVuY2htYXJr IGNvdW50IChsaXN0ICdmaW5kLWRpcmVjdG9yeS1maWxlcy1yZWN1cnNpdmVseS0yIHBhdGgg cmVnZXhwKSkpCiAgIChjb25zICJ3aXRoLWZpbmQtc3luYyIgKGJlbmNobWFyayBjb3VudCAo bGlzdCAnZmluZC1kaXJlY3RvcnktZmlsZXMtcmVjdXJzaXZlbHktMyBwYXRoIHJlZ2V4cCkp KSkpCg== --------------jKC7NdUtouvK1j69QsODn7eD--