From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Klaus-Dieter Bauer Newsgroups: gmane.emacs.devel Subject: Re: Can the byte-compiler check whether functions passed by name are defined? Date: Thu, 8 Aug 2013 10:44:19 +0200 Message-ID: References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=f46d042f931ececa7a04e36bab72 X-Trace: ger.gmane.org 1375951517 8296 80.91.229.3 (8 Aug 2013 08:45:17 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 8 Aug 2013 08:45:17 +0000 (UTC) Cc: Sebastian Wiesner , emacs-devel@gnu.org To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Aug 08 10:45:19 2013 Return-path: Envelope-to: ged-emacs-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 1V7LqQ-0001ZY-M2 for ged-emacs-devel@m.gmane.org; Thu, 08 Aug 2013 10:45:19 +0200 Original-Received: from localhost ([::1]:53346 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V7LqP-00021w-TX for ged-emacs-devel@m.gmane.org; Thu, 08 Aug 2013 04:45:17 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:56243) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V7LqI-0001gb-HV for emacs-devel@gnu.org; Thu, 08 Aug 2013 04:45:14 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V7Lq8-00086S-TL for emacs-devel@gnu.org; Thu, 08 Aug 2013 04:45:10 -0400 Original-Received: from mail-pa0-x230.google.com ([2607:f8b0:400e:c03::230]:50642) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V7Lpz-00081z-El; Thu, 08 Aug 2013 04:44:51 -0400 Original-Received: by mail-pa0-f48.google.com with SMTP id kp13so3124949pab.35 for ; Thu, 08 Aug 2013 01:44:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=Or2nlPVkj2oO0nOtlsXUFaAJle7C5+h8OMMx9kMIwFs=; b=lfrHYsgeosf5Vf+E0Ji/R/2hzDWhM01OGoXjSZ7oNsdZydFN13+o35cg/b7VfxGKaK PU18R/qLAJ6xjKC3tkkQU121JhmPmBLwkDdqHR/vk9+hc+57+6AfXtWUT1WNssYxz/sc GoJUW8zJfEgMZiBGhXftKtefIgI49NMJuucZp48RIujSRgy1agFp12Qk5KT5jR6C+/od 3jED7I6xxjOfR1bqobeKg3KGZORA0L6grlABMCMikFcz0uXmdpIZhWOf1/281wU8txcs EZXLN404NRoTXDxJbWKsNqbKMfgJnQEG0oBeyT5Qvr6plweUsE5sis5o6yc0ZwQegpkL aDBA== X-Received: by 10.66.74.65 with SMTP id r1mr4873764pav.81.1375951490302; Thu, 08 Aug 2013 01:44:50 -0700 (PDT) Original-Received: by 10.68.126.101 with HTTP; Thu, 8 Aug 2013 01:44:19 -0700 (PDT) In-Reply-To: X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:400e:c03::230 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 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.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:162485 Archived-At: --f46d042f931ececa7a04e36bab72 Content-Type: text/plain; charset=UTF-8 2013/8/8 Stefan Monnier : >> (defun foo (&rest args) t) >> (defun foo2 () (mapcar #'foo '(1 2 3))) > [...] >> foo.el:6:1:Warning: the function `foo' is not known to be defined. > >> (defun foo () #'assoc-ignore-case) > [...] >> foo.el:1:8:Warning: `function' is an obsolete variable. > > The patch below should fix them, indeed, thanks. > > > Stefan > > > === modified file 'lisp/emacs-lisp/bytecomp.el' > --- lisp/emacs-lisp/bytecomp.el 2013-08-07 17:33:30 +0000 > +++ lisp/emacs-lisp/bytecomp.el 2013-08-08 01:23:52 +0000 > @@ -3574,12 +3574,12 @@ > (when (and (symbolp f) > (byte-compile-warning-enabled-p 'callargs)) > (when (get f 'byte-obsolete-info) > - (byte-compile-warn-obsolete (car form))) > + (byte-compile-warn-obsolete f)) > > ;; Check to see if the function will be available at runtime > ;; and/or remember its arity if it's unknown. > (or (and (or (fboundp f) ; Might be a subr or autoload. > - (byte-compile-fdefinition (car form) nil)) > + (byte-compile-fdefinition f nil)) > (not (memq f byte-compile-noruntime-functions))) > (eq f byte-compile-current-form) ; ## This doesn't work > ; with recursion. > Applying either of your patches fails for me; Is there some possibility we can check, that we are actually starting from the same version of bytecomp.el? I have to admit, I don't have particularily much experience with patchibg files... What I intended to check: Does your code allow defining a function after its first use as #'FUNCTION, as is allowed with normal function calls (FUNCTION ...)? >> (funcall (if t #'foo) "Hello World") > >(if t #'foo) gets optimized into #'foo. Okay, I missed that one. If I write (funcall (if (some-condition) #'foo) nil) it warns only about some-condition. I have now moved the call to `byte-compile--higher-order--check-arguments' to `byte-compile-form' in my code. The code (funcall (if (some-condition) #'foo) nil) (mapc 'foo nil) (ignore '(#'bar)) No produces the warnings ------------------------------------------------------- In toplevel form: id1379159421d7d15c.el:7:1:Warning: mapc: Function argument should be passed as #'foo, not (quote foo) In end of data: id1379159421d7d15c.el:11:1:Warning: The symbol `foo' was used as function name but the function is not known to be defined. id1379159421d7d15c.el:11:1:Warning: the function `some-condition' is not known to be defined. Wrote c:/tmp/id1379159421d7d15c.elc Done. ------------------------------------------------------- - Klaus --f46d042f931ececa7a04e36bab72 Content-Type: application/octet-stream; name="bytecomp.el.klaus3.patch" Content-Disposition: attachment; filename="bytecomp.el.klaus3.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hk3pujb31 LS0tIGJ5dGVjb21wLmVsLm9yaWcJMjAxMy0wOC0wOCAxMDowNjo1OC4yMDIyOTUzMDAgKzAyMDAN CisrKyBieXRlY29tcC5lbAkyMDEzLTA4LTA4IDEwOjQwOjAwLjA4MzY1MjUwMCArMDIwMA0KQEAg LTI4NCw2ICsyODQsOCBAQA0KICAgZnJlZS12YXJzICAgcmVmZXJlbmNlcyB0byB2YXJpYWJsZXMg bm90IGluIHRoZSBjdXJyZW50IGxleGljYWwgc2NvcGUuDQogICB1bnJlc29sdmVkICBjYWxscyB0 byB1bmtub3duIGZ1bmN0aW9ucy4NCiAgIGNhbGxhcmdzICAgIGZ1bmN0aW9uIGNhbGxzIHdpdGgg YXJncyB0aGF0IGRvbid0IG1hdGNoIHRoZSBkZWZpbml0aW9uLg0KKyAgZnVuY2FyZ3MgICAgaGln aGVyIG9yZGVyIGZ1bmN0aW9uIGxpa2UgbWFwY2FyIHVzZWQgd2l0aCBmdW5jdGlvbiBhcmd1bWVu dCANCisgICAgICAgICAgICAgIGFzIChxdW90ZSBTWU1CT0wpIHJhdGhlciB0aGFuIChmdW5jdGlv biBTWU1CT0wpDQogICByZWRlZmluZSAgICBmdW5jdGlvbiBuYW1lIHJlZGVmaW5lZCBmcm9tIGEg bWFjcm8gdG8gb3JkaW5hcnkgZnVuY3Rpb24gb3IgdmljZQ0KICAgICAgICAgICAgICAgdmVyc2Es IG9yIHJlZGVmaW5lZCB0byB0YWtlIGEgZGlmZmVyZW50IG51bWJlciBvZiBhcmd1bWVudHMuDQog ICBvYnNvbGV0ZSAgICBvYnNvbGV0ZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucy4NCkBAIC0xMzY0 LDEwICsxMzY2LDcgQEANCiAgICAgICA7OyBUaGlzIGlzIHRoZSBmaXJzdCBkZWZpbml0aW9uLiAg U2VlIGlmIHByZXZpb3VzIGNhbGxzIGFyZSBjb21wYXRpYmxlLg0KICAgICAgIChsZXQgKChjYWxs cyAoYXNzcSBuYW1lIGJ5dGUtY29tcGlsZS11bnJlc29sdmVkLWZ1bmN0aW9ucykpDQogCSAgICBu dW1zIHNpZyBtaW4gbWF4KQ0KLSAgICAgICAgKHNldHEgYnl0ZS1jb21waWxlLXVucmVzb2x2ZWQt ZnVuY3Rpb25zDQotICAgICAgICAgICAgICAoZGVscSBjYWxscyBieXRlLWNvbXBpbGUtdW5yZXNv bHZlZC1mdW5jdGlvbnMpKQ0KLSAgICAgICAgKHNldHEgY2FsbHMgKGRlbHEgdCBjYWxscykpICA7 SWdub3JlIGhpZ2hlci1vcmRlciB1c2VzIG9mIHRoZSBmdW5jdGlvbi4NCi0gICAgICAgKHdoZW4g KGNkciBjYWxscykNCisJKHdoZW4gY2FsbHMNCiAgICAgICAgICAgKHdoZW4gKGFuZCAoc3ltYm9s cCBuYW1lKQ0KICAgICAgICAgICAgICAgICAgICAgIChlcSAoZnVuY3Rpb24tZ2V0IG5hbWUgJ2J5 dGUtb3B0aW1pemVyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAnYnl0ZS1jb21waWxlLWlu bGluZS1leHBhbmQpKQ0KQEAgLTEzODUsNyArMTM4NCwxMCBAQA0KICAgICAgICAgICAgICBuYW1l DQogICAgICAgICAgICAgIChieXRlLWNvbXBpbGUtYXJnbGlzdC1zaWduYXR1cmUtc3RyaW5nIHNp ZykNCiAgICAgICAgICAgICAgKGlmIChlcXVhbCBzaWcgJygxIC4gMSkpICIgYXJnIiAiIGFyZ3Mi KQ0KLSAgICAgICAgICAgICAoYnl0ZS1jb21waWxlLWFyZ2xpc3Qtc2lnbmF0dXJlLXN0cmluZyAo Y29ucyBtaW4gbWF4KSkpKSkpKSkpDQorICAgICAgICAgICAgIChieXRlLWNvbXBpbGUtYXJnbGlz dC1zaWduYXR1cmUtc3RyaW5nIChjb25zIG1pbiBtYXgpKSkpDQorDQorICAgICAgICAgIChzZXRx IGJ5dGUtY29tcGlsZS11bnJlc29sdmVkLWZ1bmN0aW9ucw0KKyAgICAgICAgICAgICAgICAoZGVs cSBjYWxscyBieXRlLWNvbXBpbGUtdW5yZXNvbHZlZC1mdW5jdGlvbnMpKSkpKSkpDQogDQogKGRl ZnZhciBieXRlLWNvbXBpbGUtY2wtZnVuY3Rpb25zIG5pbA0KICAgIkxpc3Qgb2YgZnVuY3Rpb25z IGRlZmluZWQgaW4gQ0wuIikNCkBAIC0xNDk2LDYgKzE0OTgsNyBAQA0KICAgICAgICAgIChieXRl LWNvbXBpbGUtY29uc3QtdmFyaWFibGVzIG5pbCkNCiAgICAgICAgICAoYnl0ZS1jb21waWxlLWZy ZWUtcmVmZXJlbmNlcyBuaWwpDQogICAgICAgICAgKGJ5dGUtY29tcGlsZS1mcmVlLWFzc2lnbm1l bnRzIG5pbCkNCisJIChieXRlLWNvbXBpbGUtLWhpZ2hlci1vcmRlci0tdW5yZXNvbHZlZC1mdW5j dGlvbnMgbmlsKQ0KICAgICAgICAgIDs7DQogICAgICAgICAgOzsgQ2xvc2Ugb3ZlciB0aGVzZSB2 YXJpYWJsZXMgc28gdGhhdCBgYnl0ZS1jb21waWxlci1vcHRpb25zJw0KICAgICAgICAgIDs7IGNh biBjaGFuZ2UgdGhlbSBvbiBhIHBlci1maWxlIGJhc2lzLg0KQEAgLTE5MzksNiArMTk0Miw3IEBA DQogCTs7IE1ha2Ugd2FybmluZ3MgYWJvdXQgdW5yZXNvbHZlZCBmdW5jdGlvbnMNCiAJOzsgZ2l2 ZSB0aGUgZW5kIG9mIHRoZSBmaWxlIGFzIHRoZWlyIHBvc2l0aW9uLg0KIAkoc2V0cSBieXRlLWNv bXBpbGUtbGFzdC1wb3NpdGlvbiAocG9pbnQtbWF4KSkNCisJKGJ5dGUtY29tcGlsZS0taGlnaGVy LW9yZGVyLS13YXJuLWFib3V0LXVucmVzb2x2ZWQtZnVuY3Rpb24tbmFtZXMpDQogCShieXRlLWNv bXBpbGUtd2Fybi1hYm91dC11bnJlc29sdmVkLWZ1bmN0aW9ucykpDQogICAgICAgOzsgRml4IHVw IHRoZSBoZWFkZXIgYXQgdGhlIGZyb250IG9mIHRoZSBvdXRwdXQNCiAgICAgICA7OyBpZiB0aGUg YnVmZmVyIGNvbnRhaW5zIG11bHRpYnl0ZSBjaGFyYWN0ZXJzLg0KQEAgLTI5MjksNiArMjkzMyw4 IEBADQogICAgICAgICAgICAgIChtZW1xIGZuIGJ5dGUtY29tcGlsZS1pbnRlcmFjdGl2ZS1vbmx5 LWZ1bmN0aW9ucykNCiAgICAgICAgICAgICAgKGJ5dGUtY29tcGlsZS13YXJuICJgJXMnIHVzZWQg ZnJvbSBMaXNwIGNvZGVcblwNCiBUaGF0IGNvbW1hbmQgaXMgZGVzaWduZWQgZm9yIGludGVyYWN0 aXZlIHVzZSBvbmx5IiBmbikpDQorCShhbmQgKGJ5dGUtY29tcGlsZS13YXJuaW5nLWVuYWJsZWQt cCAndW5yZXNvbHZlZCkNCisJICAgICAoYnl0ZS1jb21waWxlLS1oaWdoZXItb3JkZXItLWNoZWNr LWFyZ3VtZW50cyBmb3JtKSkNCiAgICAgICAgIChpZiAoYW5kIChmYm91bmRwIChjYXIgZm9ybSkp DQogICAgICAgICAgICAgICAgICAoZXEgKGNhci1zYWZlIChzeW1ib2wtZnVuY3Rpb24gKGNhciBm b3JtKSkpICdtYWNybykpDQogICAgICAgICAgICAgKGJ5dGUtY29tcGlsZS1sb2ctd2FybmluZw0K QEAgLTM1NzQsMzEgKzM1ODAsOSBAQA0KIDs7IGFuZCAoZnVuY2FsbCAoZnVuY3Rpb24gZm9vKSkg d2lsbCBsb3NlIHdpdGggYXV0b2xvYWRzLg0KIA0KIChkZWZ1biBieXRlLWNvbXBpbGUtZnVuY3Rp b24tZm9ybSAoZm9ybSkNCi0gIChsZXQgKChmIChudGggMSBmb3JtKSkpDQotICAgICh3aGVuIChh bmQgKHN5bWJvbHAgZikNCi0gICAgICAgICAgICAgICAoYnl0ZS1jb21waWxlLXdhcm5pbmctZW5h YmxlZC1wICdjYWxsYXJncykpDQotICAgICAgKHdoZW4gKGdldCBmICdieXRlLW9ic29sZXRlLWlu Zm8pDQotICAgICAgICAoYnl0ZS1jb21waWxlLXdhcm4tb2Jzb2xldGUgKGNhciBmb3JtKSkpDQot DQotICAgICAgOzsgQ2hlY2sgdG8gc2VlIGlmIHRoZSBmdW5jdGlvbiB3aWxsIGJlIGF2YWlsYWJs ZSBhdCBydW50aW1lDQotICAgICAgOzsgYW5kL29yIHJlbWVtYmVyIGl0cyBhcml0eSBpZiBpdCdz IHVua25vd24uDQotICAgICAgKG9yIChhbmQgKG9yIChmYm91bmRwIGYpICAgICAgICAgIDsgTWln aHQgYmUgYSBzdWJyIG9yIGF1dG9sb2FkLg0KLSAgICAgICAgICAgICAgICAgICAoYnl0ZS1jb21w aWxlLWZkZWZpbml0aW9uIChjYXIgZm9ybSkgbmlsKSkNCi0gICAgICAgICAgICAgICAobm90ICht ZW1xIGYgYnl0ZS1jb21waWxlLW5vcnVudGltZS1mdW5jdGlvbnMpKSkNCi0gICAgICAgICAgKGVx IGYgYnl0ZS1jb21waWxlLWN1cnJlbnQtZm9ybSkgOyAjIyBUaGlzIGRvZXNuJ3Qgd29yaw0KLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHdpdGggcmVjdXJzaW9u Lg0KLSAgICAgICAgICA7OyBJdCdzIGEgY3VycmVudGx5LXVuZGVmaW5lZCBmdW5jdGlvbi4NCi0g ICAgICAgICAgOzsgUmVtZW1iZXIgbnVtYmVyIG9mIGFyZ3MgaW4gY2FsbC4NCi0gICAgICAgICAg KGxldCAoKGNvbnMgKGFzc3EgZiBieXRlLWNvbXBpbGUtdW5yZXNvbHZlZC1mdW5jdGlvbnMpKSkN Ci0gICAgICAgICAgICAoaWYgY29ucw0KLSAgICAgICAgICAgICAgICAob3IgKG1lbXEgdCAoY2Ry IGNvbnMpKQ0KLSAgICAgICAgICAgICAgICAgICAgKHB1c2ggdCAoY2RyIGNvbnMpKSkNCi0gICAg ICAgICAgICAgIChwdXNoIChsaXN0IGYgdCkNCi0gICAgICAgICAgICAgICAgICAgIGJ5dGUtY29t cGlsZS11bnJlc29sdmVkLWZ1bmN0aW9ucykpKSkpDQotDQotICAgIChieXRlLWNvbXBpbGUtY29u c3RhbnQgKGlmIChlcSAnbGFtYmRhIChjYXItc2FmZSBmKSkNCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGJ5dGUtY29tcGlsZS1sYW1iZGEgZikNCi0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGYpKSkpDQorICAoYnl0ZS1jb21waWxlLWNvbnN0YW50IChpZiAoZXEgJ2xhbWJk YSAoY2FyLXNhZmUgKG50aCAxIGZvcm0pKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChieXRlLWNvbXBpbGUtbGFtYmRhIChudGggMSBmb3JtKSkNCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAobnRoIDEgZm9ybSkpKSkNCiANCiAoZGVmdW4gYnl0ZS1jb21waWxlLWluZGVudC10 byAoZm9ybSkNCiAgIChsZXQgKChsZW4gKGxlbmd0aCBmb3JtKSkpDQpAQCAtNDY4MSw2ICs0NjY1 LDE3NyBAQA0KIAkgICAgICAoaW5kZW50LXRvIDQwKQ0KIAkgICAgICAoaW5zZXJ0IChpbnQtdG8t c3RyaW5nIG4pICJcbiIpKSkNCiAJKHNldHEgaSAoMSsgaSkpKSkpKQ0KKw0KKzs7OzsgKERFQ0xB UkUgKEhJR0hFUi1PUkRFUi1BUkdVTUVOVFMpKSBBTkQgQ0hFQ0sgW0JFR0lOTklOR10gOzs7Ozs7 OzsNCisNCisoZGVmdmFyIGJ5dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS11bnJlc29sdmVkLWZ1 bmN0aW9ucyBuaWwNCisgICJBIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgd2VyZSBwYXNzZWQgYnkg bmFtZSB0byBoaWdoZXIgb3JkZXIgZnVuY3Rpb25zIGJ1dCB3aGVyZSBub3Qga25vd24gdG8gYmUg ZGVmaW5lZC4NCisNCitVc2VkIGR1cmluZyBjb21waWxhdGlvbiB0byByZXBvcnQgZnVuY3Rpb25z IHJlZmVycmVkIHRvIGJ5IChxdW90ZQ0KK1NZTUJPTCkgb3IgKGZ1bmN0aW9uIFNZTUJPTCkgdGhh dCBhcmUgbm90IGtub3duIHRvIGJlIGRlZmluZWQuDQorDQorIFNlZSBhbHNvDQorYGJ5dGUtY29t cGlsZS0taGlnaGVyLW9yZGVyLS13YXJuLWFib3V0LXVucmVzb2x2ZWQtZnVuY3Rpb24tbmFtZXMn LA0KK2BieXRlLWNvbXBpbGUtLWhpZ2hlci1vcmRlci0tY2hlY2stYXJndW1lbnRzJy4iKQ0KKw0K KyhkZWZ1biBieXRlLWNvbXBpbGUtLWhpZ2hlci1vcmRlci0td2Fybi1hYm91dC11bnJlc29sdmVk LWZ1bmN0aW9uLW5hbWVzICgpDQorICAiRW1pdCBjb21waWxlciB3YXJuaW5ncyB3aGVuIHRoZXJl IGFyZSB1bnJlc29sdmVkIGZ1bmN0aW9uIGEgc3ltYm9scyBwYXNzZWQgdG8gaGlnaGVyIG9yZGVy IGZ1bmN0aW9ucy4NCitTZWUgYWxzbyBgYnl0ZS1jb21waWxlLS1oaWdoZXItb3JkZXItLXVucmVz b2x2ZWQtZnVuY3Rpb25zJy4iDQorICA7OyBUaGUgbG9naWMgaXMgc2ltaWxpYXIgdG8gYGJ5dGUt Y29tcGlsZS13YXJuLWFib3V0LXVucmVzb2x2ZWQtZnVuY3Rpb25zJy4NCisgICh3aGVuIChieXRl LWNvbXBpbGUtd2FybmluZy1lbmFibGVkLXAgJ3VucmVzb2x2ZWQpDQorICAgIChsZXQgKChieXRl LWNvbXBpbGUtY3VycmVudC1mb3JtIDplbmQpDQorCSAgbm90LWRlZmluZWQtYXQtcnVudGltZS1t YXliZS1zeW1ib2wtbGlzdA0KKwkgIHJlc29sdmVkLXRvLWZ1bmN0aW9uLWxpc3QNCisJICByZXNv bHZlZC10by1tYWNyby1saXN0DQorCSAgdW5yZXNvbHZlZC1zeW1ib2wtbGlzdCkNCisgICAgKGRv bGlzdCAoZnVuY3Rpb24tbmFtZSBieXRlLWNvbXBpbGUtLWhpZ2hlci1vcmRlci0tdW5yZXNvbHZl ZC1mdW5jdGlvbnMpDQorICAgICAgKGNvbmQgKChhc3NxIGZ1bmN0aW9uLW5hbWUgYnl0ZS1jb21w aWxlLWZ1bmN0aW9uLWVudmlyb25tZW50KQ0KKwkgICAgIChwdXNoIGZ1bmN0aW9uLW5hbWUgcmVz b2x2ZWQtdG8tZnVuY3Rpb24tbGlzdCkpDQorCSAgICAoKGFzc3EgZnVuY3Rpb24tbmFtZSBieXRl LWNvbXBpbGUtbWFjcm8tZW52aXJvbm1lbnQpDQorCSAgICAgKHB1c2ggZnVuY3Rpb24tbmFtZSBy ZXNvbHZlZC10by1tYWNyby1saXN0KSkNCisJICAgICgoZmJvdW5kcCBmdW5jdGlvbi1uYW1lKQ0K KwkgICAgIChwdXNoIGZ1bmN0aW9uLW5hbWUgbm90LWRlZmluZWQtYXQtcnVudGltZS1tYXliZS1z eW1ib2wtbGlzdCkpDQorCSAgICAodCAocHVzaCBmdW5jdGlvbi1uYW1lIHVucmVzb2x2ZWQtc3lt Ym9sLWxpc3QpKSkpDQorICAgIChkb2xpc3QgKHJlc29sdmVkLW5hbWUgcmVzb2x2ZWQtdG8tZnVu Y3Rpb24tbGlzdCkNCisgICAgICAoc2V0cSBieXRlLWNvbXBpbGUtLWhpZ2hlci1vcmRlci0tdW5y ZXNvbHZlZC1mdW5jdGlvbnMNCisJICAgIChkZWxxIHJlc29sdmVkLW5hbWUNCisJCSAgYnl0ZS1j b21waWxlLS1oaWdoZXItb3JkZXItLXVucmVzb2x2ZWQtZnVuY3Rpb25zKSkpDQorICAgIChieXRl LWNvbXBpbGUtcHJpbnQtc3ltcyANCisgICAgICJUaGUgc3ltYm9sIGAlUycgd2FzIHBhc3NlZCB0 byBhIGZ1bmN0aW9uIGFzIGlmIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24sIGJ1dCBpcyBib3VuZCB0 byBhIG1hY3JvIGluc3RlYWQuIg0KKyAgICAgIlRoZSBmb2xsb3dpbmcgc3ltYm9scyB3ZXJlIHBh c3NlZCB0byBhIGZ1bmN0aW9uIGFzIGlmIHRoZSBuYW1lcyBmdW5jdGlvbnMgYnV0IGFyZSBib3Vu ZCB0byBtYWNyb3MgaW5zdGVhZDoiDQorICAgICByZXNvbHZlZC10by1tYWNyby1saXN0KQ0KKyAg ICAoYnl0ZS1jb21waWxlLXByaW50LXN5bXMNCisgICAgICJUaGUgc3ltYm9sIGAlUycgd2FzIHVz ZWQgYXMgZnVuY3Rpb24gbmFtZSBidXQgdGhlIGZ1bmN0aW9uIGlzIG5vdCBrbm93biB0byBiZSBk ZWZpbmVkLiINCisgICAgICJUaGUgZm9sbG93aW5nIHN5bWJvbHMgd2VyZSB1c2VkIGFzIGZ1bmN0 aW9uIG5hbWVzIGJ1dCB0aGUgZnVuY3Rpb25zIGFyZSBub3Qga25vd24gdG8gYmUgZGVmaW5lZDoi DQorICAgICB1bnJlc29sdmVkLXN5bWJvbC1saXN0KQ0KKyAgICAoYnl0ZS1jb21waWxlLXByaW50 LXN5bXMNCisgICAgICJUaGUgZnVuY3Rpb24gYCVTJyB3YXMgdXNlZCBhcyBmdW5jdGlvbiBuYW1l IGJ1dCB0aGUgZnVuY3Rpb24gbWlnaHQgbm90IGJlIGRlZmluZWQgYXQgcnVudGltZS4iDQorICAg ICAiVGhlIGZvbGxvd2luZyBzeW1ib2xzIHdlcmUgdXNlZCBhcyBmdW5jdGlvbiBuYW1lcyBidXQg dGhlIGZ1bmN0aW9ucyBtaWdodCBub3QgYmUgZGVmaW5lZCBhdCBydW50aW1lOiINCisgICAgIG5v dC1kZWZpbmVkLWF0LXJ1bnRpbWUtbWF5YmUtc3ltYm9sLWxpc3QpKSkpDQorDQorKGRlZnVuIGJ5 dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS1jaGVjay1hcmd1bWVudHMgKGZvcm0pDQorICAiT24g Rk9STSwgd2hpY2ggaXMgYSBmdW5jdGlvbiBjYWxsLCBjaGVjayB3aGV0aGVyIGZ1bmN0aW9ucyBw YXNzZWQgYnkgbmFtZSBhcmUga25vd24gdG8gYmUgZGVmaW5lZC4NCisNCitJZiBhIHBhcmFtZXRl ciBoYXMgdGhlIGZvcm0gKGZ1bmN0aW9uIFNZTUJPTCkgb3IgaXQgaXMga25vd24gdG8NCitiZSBl eHBlY3RlZCB0byBiZSBhIGZ1bmN0aW9uIHRocm91Z2ggdGhlIGBoaWdoZXItb3JkZXItYXJndW1l bnRzJw0KK3Byb3BlcnR5IG9mIHRoZSBzeW1ib2wgKGNhciBGT1JNKSBhbmQgaGFzIHRoZSBmb3Jt IChxdW90ZSBTWU1CT0wpDQord2UgZWl0aGVyIHdhcm4gcmlnaHQgYXdheSwgaWYgU1lNQk9MIGlz IGtub3duIHRvIGJlIGJvdW5kIHRvDQorc29tZXRoaW5nIHRoYXQgY2Fubm90IGJlIHBhc3NlZCB0 byBoaWdoZXIgb3JkZXIgZnVuY3Rpb25zIHN1Y2ggYXMNCitzcGVjaWFsIGZvcm1zIGFuZCBtYWNy b3MuIElmIFNZTUJPTCdzIGZ1bmN0aW9uIGNlbGwgaXMgZW1wdHksIHdlDQorcXVldWUgdGhlIHN5 bWJvbCBpbnRvDQorYGJ5dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS11bnJlc29sdmVkLWZ1bmN0 aW9ucycgZm9yIGNoZWNraW5nDQorYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgc2VlDQorYGJ5dGUt Y29tcGlsZS0taGlnaGVyLW9yZGVyLS13YXJuLWFib3V0LXVucmVzb2x2ZWQtZnVuY3Rpb24tbmFt ZXMnLiINCisgIChsZXQgKChoaWdoZXItb3JkZXItYXJndW1lbnRzDQorCSAoYW5kIChzeW1ib2xw IChjYXIgZm9ybSkpDQorCSAgICAgIChnZXQgKGNhciBmb3JtKSAnaGlnaGVyLW9yZGVyLWFyZ3Vt ZW50cykpKQ0KKwkocG9zIC0xKSkNCisgICAgKGRvbGlzdCAoc3ViZm9ybSAoY2RyIGZvcm0pKQ0K KyAgICAgIChzZXRxIHBvcyAoMSsgcG9zKSkNCisgICAgICA7OyBDaGVjayB3aGVuIHN1YmZvcm0g aGFzIGZvcm0gKGZ1bmN0aW9uIFNZTUJPTCkgb3IgKHF1b3RlIFNZTUJPTCkNCisgICAgICA7OyBh bmQgcG9zaXRpb24gbWF0Y2hlcyBvbmUgbWVudGlvbmVkIGluIGhpZ2hlci1vcmRlci1hcmd1bWVu dHMuDQorICAgICAgKHdoZW4gKG9yIChhbmQgKGxpc3RwIHN1YmZvcm0pIDs7IGNhc2U6IChmdW5j dGlvbiBTWU1CT0wpDQorCQkgICAgIChlcSAoY2FyIHN1YmZvcm0pICdmdW5jdGlvbikNCisJCSAg ICAgKHN5bWJvbHAgKGNhciAoY2RyIHN1YmZvcm0pKSkNCisJCSAgICAgKG51bGwgKGNkciAoY2Ry IHN1YmZvcm0pKSkpDQorCQkoYW5kIChsaXN0cCBzdWJmb3JtKSA7OyBjYXNlOiAocXVvdGUgU1lN Qk9MKQ0KKwkJICAgICAoZXEgKGNhciBzdWJmb3JtKSAncXVvdGUpDQorCQkgICAgIChzeW1ib2xw IChjYXIgKGNkciBzdWJmb3JtKSkpDQorCQkgICAgIChudWxsIChjZHIgKGNkciBzdWJmb3JtKSkp DQorCQkgICAgIChtZW1iZXIgcG9zIGhpZ2hlci1vcmRlci1hcmd1bWVudHMpKSkNCisJKGxldCAo KGZ1bmN0aW9uLW5hbWUgKGNhciAoY2RyIHN1YmZvcm0pKSkpDQorCSAgOzsgR2l2ZSBhIHN0eWxl IHdhcm5pbmcgd2hlbiBmb3JtIChxdW90ZSBmdW5jdGlvbikgd2FzIHVzZWQuDQorCSAgKHdoZW4g KGFuZCAoYnl0ZS1jb21waWxlLXdhcm5pbmctZW5hYmxlZC1wICdmdW5jYXJncykNCisJCSAgICAg KGVxIChjYXIgc3ViZm9ybSkgJ3F1b3RlKSkNCisJICAgIChieXRlLWNvbXBpbGUtd2FybiANCisJ ICAgICAiJVM6IEZ1bmN0aW9uIGFyZ3VtZW50IHNob3VsZCBiZSBwYXNzZWQgYXMgIyclUywgbm90 ICVTIg0KKwkgICAgIChjYXIgZm9ybSkgKGNhciAoY2RyIHN1YmZvcm0pKSBzdWJmb3JtKSkNCisJ ICA7OyBJcyB0aGUgZnVuY3Rpb24gYWxyZWFkeSBkZWZpbmVkIG9yIGFscmVhZHkga25vd24gdG8g YmUNCisJICA7OyBkZWZpbmVkIGluIHRoaXMgZmlsZT8gTm90ZSB0aGF0IG1hY3JvcyBhcmUgbm90 IGFsbG93ZWQhDQorCSAgKGNvbmQgKChhc3NxIGZ1bmN0aW9uLW5hbWUgYnl0ZS1jb21waWxlLWZ1 bmN0aW9uLWVudmlyb25tZW50KSkgOzsgRG8gbm90aGluZy4NCisJCSgoYXNzcSBmdW5jdGlvbi1u YW1lIGJ5dGUtY29tcGlsZS1tYWNyby1lbnZpcm9ubWVudCkNCisJCSAoYnl0ZS1jb21waWxlLXdh cm4gIkludmFsaWQgYXJndW1lbnQgYCVTJyB0byBmdW5jdGlvbiBgJVMnOiBOb3QgYSBmdW5jdGlv bi4iDQorCQkJCSAgICBmdW5jdGlvbi1uYW1lIChjYXIgZm9ybSkpKQ0KKwkJKChmdW5jdGlvbnAg ZnVuY3Rpb24tbmFtZSkpIDs7IE5vIG5vdGhpbmcsIGlzIG9rLg0KKwkJKChmYm91bmRwIGZ1bmN0 aW9uLW5hbWUpDQorCQkgKGJ5dGUtY29tcGlsZS13YXJuICJJbnZhbGlkIGFyZ3VtZW50IGAlUycg dG8gZnVuY3Rpb24gYCVTJzogTm90IGEgZnVuY3Rpb24uIg0KKwkJCQkgICAgZnVuY3Rpb24tbmFt ZSAoY2FyIGZvcm0pKSkNCisJCSh0IDs7IFVua25vd24gc3ltYm9sDQorCQkgKGFkZC10by1saXN0 ICdieXRlLWNvbXBpbGUtLWhpZ2hlci1vcmRlci0tdW5yZXNvbHZlZC1mdW5jdGlvbnMNCisJCQkg ICAgICBmdW5jdGlvbi1uYW1lKSkpKSkpKSkNCisNCis7OyBQbGFjaW5nIHRoZSBlbnRyeSBpbnNp ZGUgdGhlIGRlZmluaXRpb24gb2YNCis7OyBgZGVmdW4tZGVjbGFyYXRpb24tYWxpc3QnIGRpcmVj dGx5IGZvciBzb21lIHJlYXNvbiBkb2Vzbid0IHdvcmsuDQorKGFkZC10by1saXN0ICdkZWZ1bi1k ZWNsYXJhdGlvbnMtYWxpc3QNCisJICAgICAnKGhpZ2hlci1vcmRlci1hcmd1bWVudHMgDQorCSAg ICAgICBieXRlLWNvbXBpbGUtLWhpZ2hlci1vcmRlci0tZGVjbGFyZS1mb3JtLWhhbmRsZXIpKQ0K Kw0KKyhkZWZ1biBieXRlLWNvbXBpbGUtLWhpZ2hlci1vcmRlci0tZGVjbGFyZS1mb3JtLWhhbmRs ZXIgKGYgX2FyZ3MgJnJlc3QgdmFsKQ0KKyAgIkhhbmRsZXIgZm9yIHRoZSAoZGVjbGFyZSAoaGln aGVyLW9yZGVyLWFyZ3VtZW50cyBbTlVNIC4uLl0pKSBmb3JtLCBzZWUgYGRlZnVuLWRlY2xhcmF0 aW9ucy1hbGlzdCcuDQorDQorRiBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24sIF9BUkdTIHRo ZSBmb3JtYWwgcGFyYW1ldGVyIGxpc3QsDQorVkFMIHNob3VsZCBiZSAoTlVNIC4uKS4NCisNCitM SU1JVEFUSU9OOiBXaGVuIHRoZSBmdW5jdGlvbiBoYXMgYmVlbiB1c2VkIGJlZm9yZSBpdCB3YXMN CitkZWZpbmVkLCBhIGNvbXBpbGVyIHdhcm5pbmcgaXMgZW1pdHRlZCBwb2ludGluZyBvdXQgdGhh dCBwcmlvcg0KK3VzZSBtaWdodCBub3QgaGF2ZSBiZWVuIGNoZWNrZWQuIg0KKyAgOzsgQ2hlY2sg dGhhdCBWQUwgaXMgbGlzdCBvZiBpbnRlZ2Vycy4NCisgIChpZiAob3IgKG5vdCAobGlzdHAgdmFs KSkNCisJICAoZGVsZXRlIG5pbA0KKwkgICAgKG1hcGNhciAobGFtYmRhIChlKSAobm90IChpbnRl Z2VycCBlKSkpDQorCSAgICAgIHZhbCkpKQ0KKyAgICAgIDs7IFdhcm4gYWJvdXQgaW52YWxpZCBg ZGVjbGFyZScgZm9ybQ0KKyAgICAgIChsZXQgKCh3YXJuLXRleHQgDQorCSAgICAgKGNvbmNhdCAi KGRlY2xhcmUgLi4pIGZvcm0gKGhpZ2hlci1vcmRlci1hcmd1bWVudHMgW05VTSAuLl0pIHdpdGgg aW52YWxpZCBhcmd1bWVudHMgIg0KKwkJICAgICAobWFwY29uY2F0IChsYW1iZGEgKGUpIChmb3Jt YXQgIiVTIiBlKSkgdmFsICIgIikpKSkNCisJKGlmIGJ5dGUtY29tcGlsZS1jdXJyZW50LWZpbGUg DQorCSAgICAoYnl0ZS1jb21waWxlLXdhcm4gIiVzIiB3YXJuLXRleHQpDQorCSAgKHdhcm4gIiVz IiB3YXJuLXRleHQpKQ0KKwluaWwpDQorICAgIDs7IFJldHVybiBhIGBwdXQnIGZvcm0sIGJ1dCBh bHNvIHBlcmZvcm0gaXQgYXQgY29tcGlsZSB0aW1lLg0KKyAgICA7OyBMaW1pdGF0aW9uOiBBZmZh Y3RzIG9ubHkgaGlnaGVyIG9yZGVyIGZ1bmN0aW9ucyBkZWZpbmVkIGJlZm9yZQ0KKyAgICA7OyB0 aGVpciBmaXJzdCB1c2UuDQorICAgICh3aGVuIChhc3NxIGYgYnl0ZS1jb21waWxlLXVucmVzb2x2 ZWQtZnVuY3Rpb25zKQ0KKyAgICAgIChieXRlLWNvbXBpbGUtd2FybiANCisgICAgICAgIiVzIg0K KyAgICAgICAoY29uY2F0ICJIaWdoZXIgb3JkZXIgZnVuY3Rpb24gIiAoc3ltYm9sLW5hbWUgZikg IiB3YXMgdXNlZCBiZWZvcmUgaXQgd2FzIGRlZmluZWQuICINCisJICAgICAgICJBY3R1YWwgcGFy YW1ldGVycyB3ZXJlIG5vdCBjaGVja2VkIGZvciB2YWxpZGl0eS4iKSkpDQorICAgIChsaXN0ICdl dmFsLWFuZC1jb21waWxlIA0KKwkgIChsaXN0ICdwdXQgKGxpc3QgJ3F1b3RlIGYpICcnaGlnaGVy LW9yZGVyLWFyZ3VtZW50cw0KKwkJKGxpc3QgJ3F1b3RlIHZhbCkpKSkpDQorDQorOzsgU2V0dGlu ZyB0aGUgcHJvcGVydHkgZm9yIGNlcnRhaW4ga25vd24gZnVuY3Rpb25zLg0KKw0KKyhkZWZtYWNy byBieXRlLWNvbXBpbGUtLWhpZ2hlci1vcmRlci0tcmVnaXN0ZXIta25vd24tZnVuY3Rpb25zIChw b3MgJnJlc3Qgc3ltYm9sLWxpc3QpDQorICAiRm9yIGVsZW1lbnRzIG9mIFNZTUJPTC1MSVNUIHNl dCB0aGUgaGlnaGVyLW9yZGVyLWFyZ3VtZW50cyBwcm9wZXJ0eSB0byAoUE9TKSB3aGVuIGl0IGlz IG5vdCB5ZXQgc2V0Lg0KKw0KK09ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdXNlIGlu IGJ5dGVjb21wLmVsLiBJZiB5b3Ugd2FudA0KK3RvIHNldCB0aGUgcHJvcGVydHkgZm9yIHlvdXIg b3duIGZ1bmN0aW9ucyB1c2UNCit0aGUgKGRlY2xhcmUgKGhpZ2hlci1vcmRlciBbTlVNIC4uXSkp IGZvcm0uIg0KKyAgKGRlY2xhcmUgKGluZGVudCAxKSkNCisgIChsZXQgKGZvcm1zKQ0KKyAgICAo ZG9saXN0IChmdW5jdGlvbi1uYW1lIHN5bWJvbC1saXN0KQ0KKyAgICAgIChwdXNoIChsaXN0ICdp ZiAobGlzdCAnbm90IChsaXN0ICdnZXQgKGxpc3QgJ3F1b3RlIGZ1bmN0aW9uLW5hbWUpICcnaGln aGVyLW9yZGVyLWFyZ3VtZW50cykpDQorCQkgIChsaXN0ICdwdXQgKGxpc3QgJ3F1b3RlIGZ1bmN0 aW9uLW5hbWUpICcnaGlnaGVyLW9yZGVyLWFyZ3VtZW50cyANCisJCQkobGlzdCAncXVvdGUgKGxp c3QgcG9zKSkpKQ0KKwkgICAgZm9ybXMpKQ0KKyAgICAoY29ucyAncHJvZ24gKHJldmVyc2UgZm9y bXMpKSkpDQorDQorKGJ5dGUtY29tcGlsZS0taGlnaGVyLW9yZGVyLS1yZWdpc3Rlci1rbm93bi1m dW5jdGlvbnMgMA0KKyAgOzsgRnVuY3Rpb25zIGRlZmluZWQgaW4gQy1zb3VyY2UuDQorICBhcHBs eSBmdW5jYWxsIG1hcC1jaGFyLXRhYmxlIG1hcC1jaGFyc2V0LWNoYXJzIG1hcC1rZXltYXANCisg IG1hcC1rZXltYXAtaW50ZXJuYWwgbWFwYXRvbXMgbWFwYyBtYXBjYXIgbWFwY29uY2F0IG1hcGhh c2gNCisgIGNhbGwtaW50ZXJhY3RpdmVseQ0KKyAgOzsgRnVuY3Rpb25zIGRlZmluZWQgaW4gc3Rh bmRhcmQgZWxpc3AgZmlsZXMNCisgIG1hcC1rZXltYXAtc29ydGVkIG1hcC1xdWVyeS1yZXBsYWNl LXJlZ2V4cCBtYXAteS1vci1uLXANCisgIDs7IEZyb20gdGhlIGRlcHJlY2F0ZWQgYGNsJw0KKyAg bWFwIG1hcGNhbiBtYXBjYXIqIG1hcGNvbiBtYXBsIG1hcGxpc3QNCisgIDs7IE5vbi1vYnNvbGV0 ZSBub24taW50ZXJuYWwgZnVuY3Rpb25zIGZyb20gYGNsLWxpYicNCisgIGNsLW1hcCBjbC1tYXBj IGNsLW1hcGNhbiBjbC1tYXBjYXIgY2wtbWFwY29uIGNsLW1hcGhhc2ggY2wtbWFwbA0KKyAgY2wt bWFwbGlzdCkNCisNCis7Ozs7IChERUNMQVJFIChISUdIRVItT1JERVItQVJHVU1FTlRTKSkgQU5E IENIRUNLIFtFTkRdIDs7Ozs7Ozs7Ozs7Ozs7DQorDQogDA0KIDs7IFRvIGF2b2lkICJsaXNwIG5l c3RpbmcgZXhjZWVkcyBtYXgtbGlzcC1ldmFsLWRlcHRoIiB3aGVuIGJ5dGVjb21wIGNvbXBpbGVz DQogOzsgaXRzZWxmLCBjb21waWxlIHNvbWUgb2YgaXRzIG1vc3QgdXNlZCByZWN1cnNpdmUgZnVu Y3Rpb25zIChhdCBsb2FkIHRpbWUpLg0K --f46d042f931ececa7a04e36bab72--