From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Jim Porter Newsgroups: gmane.emacs.devel Subject: Re: master 3e4d4f472d: Rework `abbreviate-file-name' in Tramp Date: Mon, 7 Mar 2022 22:22:00 -0800 Message-ID: <3b6d686e-7951-3ca5-129e-fba24beb35a5@gmail.com> References: <164665696336.29111.11356916615467348904@vcs2.savannah.gnu.org> <20220307124243.C094FC01681@vcs2.savannah.gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------62773F60ABEA7244AA34FEA1" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="26655"; mail-complaints-to="usenet@ciao.gmane.io" To: emacs-devel@gnu.org, Michael Albinus Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Tue Mar 08 07:23:49 2022 Return-path: Envelope-to: ged-emacs-devel@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 1nRTG8-0006ma-Gp for ged-emacs-devel@m.gmane-mx.org; Tue, 08 Mar 2022 07:23:48 +0100 Original-Received: from localhost ([::1]:57214 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nRTG5-0003Qz-Ty for ged-emacs-devel@m.gmane-mx.org; Tue, 08 Mar 2022 01:23:45 -0500 Original-Received: from eggs.gnu.org ([209.51.188.92]:36254) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nRTEW-0002k4-1K for emacs-devel@gnu.org; Tue, 08 Mar 2022 01:22:08 -0500 Original-Received: from [2607:f8b0:4864:20::434] (port=38792 helo=mail-pf1-x434.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nRTEQ-00060D-JH for emacs-devel@gnu.org; Tue, 08 Mar 2022 01:22:04 -0500 Original-Received: by mail-pf1-x434.google.com with SMTP id f8so6009016pfj.5 for ; Mon, 07 Mar 2022 22:22:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=subject:to:references:from:message-id:date:mime-version:in-reply-to :content-language; bh=Teq7rxGKCrE/esIxh8J+f/2UTWAwxACSN9P7cBMNyyM=; b=gGOe7lMvwlRAs6VYGpCtAVZNfmPp7d6YGHngj1d/1fdMTxRlR/qVJv/OrsDJ7houhc mZ1CokYIFYVsPNIWcnhhPSI0qHnpdNmc7uOyXDuyRx4XgRHDmbWbQDXxqxNWjvZmBfJx o+mqtASDnpq/FBovG+l8A0GciaOWPU95N6af1+EpHDUdts0ynq/Jxp+j22I4ZxdOezGh E7QVjS2+m9LM17aHSNsw1VOhvjgyYH8Lc70+UUBJ3Atn/kTJ+sREnqjsXO1r1+qoF6tD y0b5enitB24yHDlmC4+xciPKfOICs7OXskBSCUBideb35KUbA9LDh3XzDP72yNgV8lXY rrpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:subject:to:references:from:message-id:date :mime-version:in-reply-to:content-language; bh=Teq7rxGKCrE/esIxh8J+f/2UTWAwxACSN9P7cBMNyyM=; b=NVzIwrBeOupwLD2qCXTqeVsqQF3vEOIiaRIX7FlF6ctiIwERWSSkSjuZJeR/XWrX5E 4T7BaKU6vcG0BHa1HLYeLRDm/9FLqImikbXhlTHCx1C12cv0CgxK2UEFlgNDRJ6r9+ic ZvUj8iRCogsa4Iw7v4CWJODTUrpJNflFzMOjzF7QasDhyd9jiPGuT29MREy2PDx2XZuW I94nqVdz+eC5ZYTZyYD4YyzeHVFPDI9t2LLSxG+cWSsVaLOv6HU9fCIMIFD3nbLCTpAP uow9gaaH6IMV5FQueYUawtSrUtLEBXi8htcdBY7No4huF1xnj9pKw64hUaiEZKnjcO2H J7qQ== X-Gm-Message-State: AOAM53389iUEZ45ziH/kGG04WcyQxiREyO0Xm4bxcvzwbfMbFwCrmfAX uBcpho1JgKLzjxSwxBHUxXI= X-Google-Smtp-Source: ABdhPJxdjjIgp+zXyv/yn8uH3BYRmdQRyZ8EXTyGPEXvpx8qbupvhazi73xT68muAWh1RIpMt0ym1w== X-Received: by 2002:a05:6a00:1312:b0:4e1:58c4:ddfd with SMTP id j18-20020a056a00131200b004e158c4ddfdmr16980168pfu.65.1646720521143; Mon, 07 Mar 2022 22:22:01 -0800 (PST) Original-Received: from [192.168.1.2] (cpe-76-168-148-233.socal.res.rr.com. [76.168.148.233]) by smtp.googlemail.com with ESMTPSA id o65-20020a17090a0a4700b001bef5cffea7sm2139119pjo.0.2022.03.07.22.22.00 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 07 Mar 2022 22:22:00 -0800 (PST) In-Reply-To: <20220307124243.C094FC01681@vcs2.savannah.gnu.org> Content-Language: en-US X-Host-Lookup-Failed: Reverse DNS lookup failed for 2607:f8b0:4864:20::434 (failed) Received-SPF: pass client-ip=2607:f8b0:4864:20::434; envelope-from=jporterbugs@gmail.com; helo=mail-pf1-x434.google.com X-Spam_score_int: -6 X-Spam_score: -0.7 X-Spam_bar: / X-Spam_report: (-0.7 / 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, FREEMAIL_FROM=0.001, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:286915 Archived-At: This is a multi-part message in MIME format. --------------62773F60ABEA7244AA34FEA1 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 3/7/2022 4:42 AM, Michael Albinus wrote: > branch: master > commit 3e4d4f472d3960a7d18dad76b8d54a66bc5d9f6c [snip] > diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el > index 932dfb3691..5bf6a54020 100644 > --- a/lisp/net/tramp.el > +++ b/lisp/net/tramp.el [snip] > @@ -3360,15 +3362,16 @@ Let-bind it when necessary.") [snip] > ;; Otherwise, just use the cached value. > - (tramp-get-connection-property vec "home-directory" nil)))) > + (tramp-get-connection-property vec "~" nil)))) > + (when home-dir > + (setq home-dir > + (tramp-compat-funcall > + 'directory-abbrev-apply > + (tramp-make-tramp-file-name vec home-dir)))) > ;; If any elt of `directory-abbrev-alist' matches this name, > ;; abbreviate accordingly. I don't know how much this matters in practice, but one benefit of the old code is that it cached the *abbreviated* home directory (though I gave it a poor name; "home-directory" didn't indicate that it's abbreviated). This can significantly improve performance when there are many entries in `directory-abbrev-alist', since then Tramp doesn't have to abbreviate the home-dir on each call. That's similar to how `abbreviate-file-name' works on local files, which also caches the abbreviated home dir. See the attached benchmark/results. I also attached a sketch of a patch for a way to avoid that performance cost. I'm not sure it's actually a good way to do things (or even if it's correct in all cases), but hopefully it serves as a demonstration. It would probably be better to cache it somewhere that doesn't persist across sessions though[1]; it could get out of sync with `directory-abbrev-alist' and cause problems (this was a problem with the old code too). That said, I wouldn't have a problem if the answer is "`directory-abbrev-alist' is short, so caching this value is more trouble than it's worth." The `abbreviate-file-name' function even asks this question (for local files): ;; FIXME Is it even worth caching abbreviated-home-dir? ;; Ref: https://debbugs.gnu.org/19657#20 - Jim [1] At least, I *think* Tramp connection properties are cached across Emacs sessions... --------------62773F60ABEA7244AA34FEA1 Content-Type: text/plain; charset=UTF-8; name="benchmark.el" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="benchmark.el" KHNldHEgdHJhbXAtdmVyYm9zZSAwCiAgICAgIHVzZXItbmFtZSAiamltIgogICAgICByZW1v dGUtaG9zdCAoY29uY2F0ICIvc3NoeDoiIHVzZXItbmFtZSAiQGxvY2FsaG9zdDoiKSkKCihk ZWZ1biBmaWxsLWRpcmVjdG9yeS1hYmJyZXYtYWxpc3QgKGNvdW50KQogIChzZXRxIGRpcmVj dG9yeS1hYmJyZXYtYWxpc3QKICAgICAgICAobGV0IChyZXN1bHQpCiAgICAgICAgICAoZG90 aW1lcyAoaSBjb3VudCByZXN1bHQpCiAgICAgICAgICAgIChzZXRxIHJlc3VsdCAoY29ucyAo Y29ucyAoZm9ybWF0ICJcXGAvaG9tZS9hYmJyJWQiICgxKyBpKSkKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgIi9ob21lL2FiYnIlZCIgaSkpCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpKSkpKSkKCihkZWZ1biBydW4tdGVz dCAoY291bnQgJm9wdGlvbmFsIHBhdGgpCiAgKGxldCogKChhYmJyZXZpYXRlLWhvbWUtZGly IG5pbCkKICAgICAgICAgKHBhdGggKG9yIHBhdGggKGNvbmNhdCAiL2hvbWUvIiB1c2VyLW5h bWUgIi9zcmMvcHJvamVjdCIpKSkKICAgICAgICAgKHJlbW90ZS1wYXRoIChjb25jYXQgcmVt b3RlLWhvc3QgcGF0aCkpKQogICAgKGdhcmJhZ2UtY29sbGVjdCkKICAgIChiZW5jaG1hcmsg MTAwMCBgKGFiYnJldmlhdGUtZmlsZS1uYW1lICxwYXRoKSkKICAgIChnYXJiYWdlLWNvbGxl Y3QpCiAgICAoYmVuY2htYXJrIDEwMDAgYChhYmJyZXZpYXRlLWZpbGUtbmFtZSAscmVtb3Rl LXBhdGgpKSkpCgooZmluZC1maWxlIChjb25jYXQgcmVtb3RlLWhvc3QgIn4iKSkKCihtZXNz YWdlICJFbXB0eSBgZGlyZWN0b3J5LWFiYnJldi1hbGlzdCciKQoocnVuLXRlc3QgMTAwMCkK KG1lc3NhZ2UgIiIpCgooZmlsbC1kaXJlY3RvcnktYWJicmV2LWFsaXN0IDEwMCkKKG1lc3Nh Z2UgIjEwMCBpdGVtcyBpbiBgZGlyZWN0b3J5LWFiYnJldi1hbGlzdCcgKG5vIG1hdGNoZXMp IikKKHJ1bi10ZXN0IDEwMDApCihtZXNzYWdlICIiKQoKKG1lc3NhZ2UgIjEwMCBpdGVtcyBp biBgZGlyZWN0b3J5LWFiYnJldi1hbGlzdCcgKGFsbCBtYXRjaGVzKSIpCihydW4tdGVzdCAx MDAwICIvaG9tZS9hYmJyMTAwL3NyYy9wcm9qZWN0IikKKG1lc3NhZ2UgIiIpCgooZmlsbC1k aXJlY3RvcnktYWJicmV2LWFsaXN0IDUwMCkKKG1lc3NhZ2UgIjUwMCBpdGVtcyBpbiBgZGly ZWN0b3J5LWFiYnJldi1hbGlzdCcgKG5vIG1hdGNoZXMpIikKKHJ1bi10ZXN0IDEwMDApCiht ZXNzYWdlICIiKQoKKG1lc3NhZ2UgIjUwMCBpdGVtcyBpbiBgZGlyZWN0b3J5LWFiYnJldi1h bGlzdCcgKGFsbCBtYXRjaGVzKSIpCihydW4tdGVzdCAxMDAwICIvaG9tZS9hYmJyMTAwL3Ny Yy9wcm9qZWN0IikK --------------62773F60ABEA7244AA34FEA1 Content-Type: text/plain; charset=UTF-8; name="results.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="results.txt" QmVmb3JlCi0tLS0tLQoKRW1wdHkg4oCYZGlyZWN0b3J5LWFiYnJldi1hbGlzdOKAmQpMb2Nh bDogIEVsYXBzZWQgdGltZTogMC4wNzMyNjZzICgwLjAxNTc2NnMgaW4gMSBHQ3MpClJlbW90 ZTogRWxhcHNlZCB0aW1lOiAwLjY2MDg2OHMgKDAuMjYwNjE1cyBpbiAxNyBHQ3MpCgoxMDAg aXRlbXMgaW4g4oCYZGlyZWN0b3J5LWFiYnJldi1hbGlzdOKAmSAobm8gbWF0Y2hlcykKTG9j YWw6ICBFbGFwc2VkIHRpbWU6IDAuMzQ3MDI1cyAoMC4xNDcxOThzIGluIDEwIEdDcykKUmVt b3RlOiBFbGFwc2VkIHRpbWU6IDAuOTExNTU1cyAoMC4zNzAyOTFzIGluIDI1IEdDcykKCjEw MCBpdGVtcyBpbiDigJhkaXJlY3RvcnktYWJicmV2LWFsaXN04oCZIChhbGwgbWF0Y2hlcykK TG9jYWw6ICBFbGFwc2VkIHRpbWU6IDAuNTc1ODAzcyAoMC4zNzQxMDlzIGluIDI1IEdDcykK UmVtb3RlOiBFbGFwc2VkIHRpbWU6IDAuOTYwMjk2cyAoMC4zOTYwODdzIGluIDI2IEdDcykK CjUwMCBpdGVtcyBpbiDigJhkaXJlY3RvcnktYWJicmV2LWFsaXN04oCZIChubyBtYXRjaGVz KQpMb2NhbDogIEVsYXBzZWQgdGltZTogMS4xNTE0MThzICgwLjU4MjQ1N3MgaW4gMzggR0Nz KQpSZW1vdGU6IEVsYXBzZWQgdGltZTogMS43MTY4NjFzICgwLjgwMjU1N3MgaW4gNTMgR0Nz KQoKNTAwIGl0ZW1zIGluIOKAmGRpcmVjdG9yeS1hYmJyZXYtYWxpc3TigJkgKGFsbCBtYXRj aGVzKQpMb2NhbDogIEVsYXBzZWQgdGltZTogMS4zOTY5MzhzICgwLjgxNTcyMXMgaW4gNTMg R0NzKQpSZW1vdGU6IEVsYXBzZWQgdGltZTogMS43NTI0ODFzICgwLjgwMjk2N3MgaW4gNTQg R0NzKQoKCkFmdGVyCi0tLS0tCgpFbXB0eSDigJhkaXJlY3RvcnktYWJicmV2LWFsaXN04oCZ CkxvY2FsOiAgRWxhcHNlZCB0aW1lOiAwLjA3MzAzM3MgKDAuMDE0NjY3cyBpbiAxIEdDcykK UmVtb3RlOiBFbGFwc2VkIHRpbWU6IDAuNjgxOTc1cyAoMC4yNTU4OTBzIGluIDE3IEdDcykK CjEwMCBpdGVtcyBpbiDigJhkaXJlY3RvcnktYWJicmV2LWFsaXN04oCZIChubyBtYXRjaGVz KQpMb2NhbDogIEVsYXBzZWQgdGltZTogMC4zNjI5MjVzICgwLjE1NDkxN3MgaW4gMTAgR0Nz KQpSZW1vdGU6IEVsYXBzZWQgdGltZTogMS4xMjMyMzNzICgwLjQ3Nzg4MHMgaW4gMzIgR0Nz KQoKMTAwIGl0ZW1zIGluIOKAmGRpcmVjdG9yeS1hYmJyZXYtYWxpc3TigJkgKGFsbCBtYXRj aGVzKQpMb2NhbDogIEVsYXBzZWQgdGltZTogMC41OTM2NjZzICgwLjM4ODk0MnMgaW4gMjUg R0NzKQpSZW1vdGU6IEVsYXBzZWQgdGltZTogMS4xNDM3MDZzICgwLjQ4NDI4NHMgaW4gMzMg R0NzKQoKNTAwIGl0ZW1zIGluIOKAmGRpcmVjdG9yeS1hYmJyZXYtYWxpc3TigJkgKG5vIG1h dGNoZXMpCkxvY2FsOiAgRWxhcHNlZCB0aW1lOiAxLjEyMTE5NXMgKDAuNTYxNTI1cyBpbiAz OCBHQ3MpClJlbW90ZTogRWxhcHNlZCB0aW1lOiAyLjY0OTk2OXMgKDEuMjk1MTIwcyBpbiA4 OCBHQ3MpCgo1MDAgaXRlbXMgaW4g4oCYZGlyZWN0b3J5LWFiYnJldi1hbGlzdOKAmSAoYWxs IG1hdGNoZXMpCkxvY2FsOiAgRWxhcHNlZCB0aW1lOiAxLjM1NjMyM3MgKDAuNzgzNzc0cyBp biA1MyBHQ3MpClJlbW90ZTogRWxhcHNlZCB0aW1lOiAyLjc0MjA1OHMgKDEuMzM0MzU4cyBp biA4OSBHQ3MpCg== --------------62773F60ABEA7244AA34FEA1 Content-Type: text/plain; charset=UTF-8; name="0001-Cache-abbreviated-home-directory-for-Tramp.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0001-Cache-abbreviated-home-directory-for-Tramp.patch" RnJvbSA3NjAyYjIyNTQ4N2RhMzljY2M2MzkyNjFmNDI2ODQ0YWYxZDUyZWM3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKaW0gUG9ydGVyIDxqcG9ydGVyYnVnc0BnbWFpbC5j b20+CkRhdGU6IE1vbiwgNyBNYXIgMjAyMiAyMjowMToxMSAtMDgwMApTdWJqZWN0OiBbUEFU Q0hdIENhY2hlIGFiYnJldmlhdGVkIGhvbWUgZGlyZWN0b3J5IGZvciBUcmFtcAoKVGhpcyBp bXByb3ZlcyBwZXJmb3JtYW5jZSB3aGVuIHRoZXJlIGFyZSBtYW55IGVudHJpZXMgaW4KJ2Rp cmVjdG9yeS1hYmJyZXYtYWxpc3QnLgoKKiBsaXNwL25ldC90cmFtcC5lbCAodHJhbXAtaGFu ZGxlLWFiYnJldmlhdGUtZmlsZS1uYW1lKTogQ2FjaGUKYWJicmV2aWF0ZWQgaG9tZSBkaXJl Y3RvcnkuCi0tLQogbGlzcC9uZXQvdHJhbXAuZWwgfCAyNCArKysrKysrKysrKysrLS0tLS0t LS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxMyBpbnNlcnRpb25zKCspLCAxMSBkZWxldGlvbnMo LSkKCmRpZmYgLS1naXQgYS9saXNwL25ldC90cmFtcC5lbCBiL2xpc3AvbmV0L3RyYW1wLmVs CmluZGV4IDViZjZhNTQwMjAuLjU2MGVkMWY4ZWQgMTAwNjQ0Ci0tLSBhL2xpc3AvbmV0L3Ry YW1wLmVsCisrKyBiL2xpc3AvbmV0L3RyYW1wLmVsCkBAIC0zMzYxLDE3ICszMzYxLDE5IEBA IHRyYW1wLWhhbmRsZS1hYmJyZXZpYXRlLWZpbGUtbmFtZQogCSAodmVjICh0cmFtcC1kaXNz ZWN0LWZpbGUtbmFtZSBmaWxlbmFtZSkpCiAJICh0cmFtcC10b2xlcmF0ZS10aWxkZSB0KQog ICAgICAgICAgKGhvbWUtZGlyCi0gICAgICAgICAgKGlmIChsZXQgKChub24tZXNzZW50aWFs IHQpKSAodHJhbXAtY29ubmVjdGFibGUtcCB2ZWMpKQotICAgICAgICAgICAgICA7OyBJZiBh IGNvbm5lY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBlc3RhYmxpc2hlZCwgZ2V0IHRoZQotICAg ICAgICAgICAgICA7OyBob21lIGRpcmVjdG9yeS4KLQkgICAgICAodHJhbXAtZ2V0LWhvbWUt ZGlyZWN0b3J5IHZlYykKLSAgICAgICAgICAgIDs7IE90aGVyd2lzZSwganVzdCB1c2UgdGhl IGNhY2hlZCB2YWx1ZS4KLSAgICAgICAgICAgICh0cmFtcC1nZXQtY29ubmVjdGlvbi1wcm9w ZXJ0eSB2ZWMgIn4iIG5pbCkpKSkKLSAgICAod2hlbiBob21lLWRpcgotICAgICAgKHNldHEg aG9tZS1kaXIKLQkgICAgKHRyYW1wLWNvbXBhdC1mdW5jYWxsCi0JICAgICAnZGlyZWN0b3J5 LWFiYnJldi1hcHBseQotCSAgICAgKHRyYW1wLW1ha2UtdHJhbXAtZmlsZS1uYW1lIHZlYyBo b21lLWRpcikpKSkKKyAgICAgICAgICAoY2F0Y2ggJ25vLWhvbWUtZGlyCisgICAgICAgICAg ICAod2l0aC10cmFtcC1jb25uZWN0aW9uLXByb3BlcnR5IHZlYyAiYWJici1ob21lLWRpcmVj dG9yeSIKKwkgICAgICAodHJhbXAtY29tcGF0LWZ1bmNhbGwKKwkgICAgICAgJ2RpcmVjdG9y eS1hYmJyZXYtYXBwbHkKKyAgICAgICAgICAgICAgICh0cmFtcC1tYWtlLXRyYW1wLWZpbGUt bmFtZQorICAgICAgICAgICAgICAgIHZlYworICAgICAgICAgICAgICAgIChpZiAobGV0ICgo bm9uLWVzc2VudGlhbCB0KSkgKHRyYW1wLWNvbm5lY3RhYmxlLXAgdmVjKSkKKyAgICAgICAg ICAgICAgICAgICAgOzsgSWYgYSBjb25uZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gZXN0YWJs aXNoZWQsIGdldCB0aGUKKyAgICAgICAgICAgICAgICAgICAgOzsgaG9tZSBkaXJlY3Rvcnku CisgICAgICAgICAgICAgICAgICAgICh0cmFtcC1nZXQtaG9tZS1kaXJlY3RvcnkgdmVjKQor ICAgICAgICAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBqdXN0IHVzZSB0aGUgY2FjaGVkIHZh bHVlLgorICAgICAgICAgICAgICAgICAgKG9yICh0cmFtcC1nZXQtY29ubmVjdGlvbi1wcm9w ZXJ0eSB2ZWMgIn4iIG5pbCkKKyAgICAgICAgICAgICAgICAgICAgICAodGhyb3cgJ25vLWhv bWUtZGlyKSkpKSkpKSkpCiAgICAgOzsgSWYgYW55IGVsdCBvZiBgZGlyZWN0b3J5LWFiYnJl di1hbGlzdCcgbWF0Y2hlcyB0aGlzIG5hbWUsCiAgICAgOzsgYWJicmV2aWF0ZSBhY2NvcmRp bmdseS4KICAgICAoc2V0cSBmaWxlbmFtZSAodHJhbXAtY29tcGF0LWZ1bmNhbGwgJ2RpcmVj dG9yeS1hYmJyZXYtYXBwbHkgZmlsZW5hbWUpKQotLSAKMi4yNS4xCgo= --------------62773F60ABEA7244AA34FEA1--