From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Colin Woodbury Newsgroups: gmane.lisp.guile.devel Subject: Re: [PATCHv3] Extensions for SRFI-171 (Transducers) Date: Sat, 21 Jan 2023 10:48:31 +0900 Message-ID: References: <1158f7bf-3093-8c3b-dd74-267f1fbb6f4c@fosskers.ca> <877cxp9mpn.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------GFxtAfiQZy38HmeIINYIBpmd" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="29649"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Cc: guile-devel@gnu.org, =?UTF-8?Q?Linus_Bj=c3=b6rnstam?= To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= Original-X-From: guile-devel-bounces+guile-devel=m.gmane-mx.org@gnu.org Sat Jan 21 02:49:03 2023 Return-path: Envelope-to: guile-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 1pJ309-0007Sr-06 for guile-devel@m.gmane-mx.org; Sat, 21 Jan 2023 02:49:01 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pJ2zr-0005u8-Je; Fri, 20 Jan 2023 20:48:43 -0500 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 1pJ2zp-0005tw-NA for guile-devel@gnu.org; Fri, 20 Jan 2023 20:48:41 -0500 Original-Received: from out1-smtp.messagingengine.com ([66.111.4.25]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pJ2zm-0002Ye-9o; Fri, 20 Jan 2023 20:48:41 -0500 Original-Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id 01DF35C0164; Fri, 20 Jan 2023 20:48:36 -0500 (EST) Original-Received: from mailfrontend2 ([10.202.2.163]) by compute3.internal (MEProxy); Fri, 20 Jan 2023 20:48:36 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fosskers.ca; h= cc:cc: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=fm3; t=1674265715; x=1674352115; bh=75F4kqEst9 hhCtcIiGe+/p+dWj1ddXmmxLb+Y95x/2I=; b=dbegkmTJF2KPmuw8Y1JTSQFDOw PlOYa767WBIVjBhJ8uD5wDYKxnTPdFPwLT7eDMVwzWsn1CfhEdV+6Q9bLV0vD03+ x/HbR/0yS4xus3XDETjXkqj6IkC80rYnKf5BRjleVz+XlJEqYZBczDIX1LCHSQNS 5xrQOlJ83JujHpYMEi2i86UlPi9APC3oDaL7Ro+U+6RlDl+hwhgedeR2NtFxTAuE pz4bEXupv3V9uCntS21ol5jsjzXs/+BFDuEYfDDEvWId6yuO94hx3FuoVgOCaW3h ewuGe/Uk0oYvuMWMM+oIpeTewQ5TOjuQ0bumwPP9UZRNorIXpcWTD0AS65+Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc: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=1674265715; x=1674352115; bh=75F4kqEst9hhCtcIiGe+/p+dWj1d dXmmxLb+Y95x/2I=; b=mgr9WYicRWqgQgXLiYB5INgiwwvP/g9RmSropfRLhBO4 7VCDelvQB2DfLGjvng6PGNwTfG7lUbgwXQBs696V5S6z8FJWBpq+bLDO2CL6PB6v iv21jbge5Z5EXb3i7GiGHFDr1m883+ZZNZWcBUrcxGcKb8NRfeEMotXkU6smloUH m/A2QA4TFpMczLcsXkNtaPFPflQkEWYgsK9OOapJL5z8S/BKQljHsqjBhQQgw5Fv +IvFLX+ksydyk468xAturHxBbWH3mZX2F/By7a3djNEWusZxtx0xrPPy1tARYaxL JGxJCKG3zvMQ9+V5tG2iZBhKiVOawbl8lPREu9sFPQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvhedruddufedgfeekucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurheptgfkffggfgfuvfevfhfhjgesmhdtreertdefjeenucfhrhhomhepveholhhi nhcuhghoohgusghurhihuceotgholhhinhesfhhoshhskhgvrhhsrdgtrgeqnecuggftrf grthhtvghrnhepjedtudffhfegkeefleffudetkeeujeelfedugfefgedvkeelvdevvdei ledvfedvnecuffhomhgrihhnpehgnhhurdhorhhgnecuvehluhhsthgvrhfuihiivgeptd enucfrrghrrghmpehmrghilhhfrhhomheptgholhhinhesfhhoshhskhgvrhhsrdgtrg X-ME-Proxy: Feedback-ID: iaef144a3:Fastmail Original-Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 20 Jan 2023 20:48:34 -0500 (EST) Content-Language: en-US In-Reply-To: <877cxp9mpn.fsf@gnu.org> Received-SPF: none client-ip=66.111.4.25; envelope-from=colin@fosskers.ca; helo=out1-smtp.messagingengine.com X-Spam_score_int: -28 X-Spam_score: -2.9 X-Spam_bar: -- X-Spam_report: (-2.9 / 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, NICE_REPLY_A=-0.089, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.29 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-mx.org@gnu.org Original-Sender: guile-devel-bounces+guile-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.lisp.guile.devel:21602 Archived-At: This is a multi-part message in MIME format. --------------GFxtAfiQZy38HmeIINYIBpmd Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi Ludovic, thanks for getting back to me! I've updated the patches as you've suggested. I think I've gotten the commit format correct this time. Also, I'll opt to assign copyright to the FSF, as I've already done so for Emacs (and signed the papers, etc.). Let there be transduction! Cheers, Colin On 1/15/23 00:09, Ludovic Courtès wrote: > Hi Colin and all! > > These patches look like a nice addition. > > First, you have the option of assigning your copyright for this > contribution (and future Guile contributions if you wish) to the FSF, or > you can choose not to: > > https://lists.gnu.org/archive/html/guile-devel/2022-10/msg00008.html > > Please take a look at the message above and let us know what you’d like > to do. If you choose not to assign copyright, you’ll have to add > copyright lines for you (or whatever entity holds copyright on your > work) in the modified files. > > Overall the changes LGTM; I have minor comments and suggestions: > > Colin Woodbury skribis: > >> From 96856b184a507886db2c5c20323983ae125a6bdb Mon Sep 17 00:00:00 2001 >> From: Colin Woodbury >> Date: Mon, 19 Dec 2022 09:39:37 +0900 >> Subject: [PATCH 1/4] srfi-171: add twindow and various reducers >> >> This adds a number of reduction primitives often seen in other languages >> to Guile's SRFI-171 extensions. >> >> Most critical may be `rfold`, which could be called the fundamental >> reducer, as it's likely that all other reducers could be defined in >> terms of it (though not all are). While `tfold` already exists in >> Guile's SRFI-171 extension as a transducer, folding is in essence a >> reduction. Also without a primative like `rlast` (also introduced here), >> the results of `tfold` are difficult to consume. This is avoided by >> providing `rfold` directly as a generalised means to collapse an entire >> transduction down into a single value (i.e. the whole point of >> reducers). `rfold` is also useful for the creation of ad-hoc reducers, >> as any 2-arg function can be passed to it to fold the stream of values. >> >> `rfirst`, `rlast`, and `rfind` are common idioms and so have been added. >> >> The equivalent of `rmax` and `rmin` are easy to write manually via >> `rfold`, but they have been provided here as a convenience in the same >> spirit as `rcons`. >> >> `rfor-each` also cannot be forgotten as a classic adaptation of its >> SRFI-1 cousin. >> >> Also added is `twindow`, handy for analysing groups of adjacent items. > [...] > >> From 58e7ca2718a860ca2fb5692684d6d128a7c1ae75 Mon Sep 17 00:00:00 2001 >> From: Colin Woodbury >> Date: Tue, 20 Dec 2022 09:41:51 +0900 >> Subject: [PATCH 2/4] doc: add new SRFI-171 reducers to the manual >> >> --- >> doc/ref/srfi-modules.texi | 96 +++++++++++++++++++++++++++++++++++++-- > [...] > >> From 7b7538c61799fa0fa0e2fa18efba98b7de7da1ca Mon Sep 17 00:00:00 2001 >> From: Colin Woodbury >> Date: Wed, 21 Dec 2022 09:30:50 +0900 >> Subject: [PATCH 3/4] srfi-171: add unit tests for new functions >> >> These tests mainly match the examples shown in the docs. >> --- >> test-suite/tests/srfi-171.test | 66 ++++++++++++++++++++++++++++++---- > We’d squash these three commits together to provide a single > self-contained commit with code and the corresponding tests and doc. > > The convention in Guile is for commit logs to follow the ChangeLog style > (see ‘git log’ for examples). If you’re not sure how to do that, I can > do it on your behalf as a welcome present. ;-) > >> From 87a74d106f11680c4924befb664d7ef685c16b06 Mon Sep 17 00:00:00 2001 >> From: Colin Woodbury >> Date: Thu, 22 Dec 2022 20:32:33 +0900 >> Subject: [PATCH 4/4] doc: added a guide for writing custom reducers >> >> The guide previously explained what reducers were, but not the specifics >> of how to write them yourself. This commits rectifies this. > Nice! > >> +++ b/doc/ref/srfi-modules.texi >> @@ -5966,6 +5966,82 @@ Yield the maximum (or minimum) value of the transduction, or the >> @var{seed} value if there is none. >> @end deffn >> >> +@subheading Writing your own reducers >> +If you want to reduce some values via an ordinary function that you > Please capitalize section titles and leave a blank line below it (same > for the section that follows). > >> +However, if you want more customized behaviour (such as early >> +termination and/or arbitrary manipulation of the input values) then >> +you're free to write a reducer manually. To do so, we need to write a > Normally we leave two spaces after end-of-sentence periods, to ease > navigation in Emacs and please Texinfo (info "(texinfo) Ending a > Sentence"). > > Could you send updated patches? > > Thanks for your work! > > Ludo’. --------------GFxtAfiQZy38HmeIINYIBpmd Content-Type: text/x-patch; charset=UTF-8; name="0001-srfi-171-Add-twindow-and-various-reducers.patch" Content-Disposition: attachment; filename="0001-srfi-171-Add-twindow-and-various-reducers.patch" Content-Transfer-Encoding: base64 RnJvbSBmMTdhNzQ4MGI5NzJlMTkyYTIxYzY3OTY1Y2U1NTk3Y2IzZDQzNzlkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDb2xpbiBXb29kYnVyeSA8Y29saW5AZm9zc2tlcnMu Y2E+CkRhdGU6IE1vbiwgMTkgRGVjIDIwMjIgMDk6Mzk6MzcgKzA5MDAKU3ViamVjdDogW1BB VENIIDEvMl0gc3JmaS0xNzE6IEFkZCB0d2luZG93IGFuZCB2YXJpb3VzIHJlZHVjZXJzCgpU aGlzIGFkZHMgYSBudW1iZXIgb2YgcmVkdWN0aW9uIHByaW1pdGl2ZXMgb2Z0ZW4gc2VlbiBp biBvdGhlciBsYW5ndWFnZXMKdG8gR3VpbGUncyBTUkZJLTE3MSBleHRlbnNpb25zLgoKTW9z dCBjcml0aWNhbCBtYXkgYmUgYHJmb2xkYCwgd2hpY2ggY291bGQgYmUgY2FsbGVkIHRoZSBm dW5kYW1lbnRhbApyZWR1Y2VyLCBhcyBpdCdzIGxpa2VseSB0aGF0IGFsbCBvdGhlciByZWR1 Y2VycyBjb3VsZCBiZSBkZWZpbmVkIGluCnRlcm1zIG9mIGl0ICh0aG91Z2ggbm90IGFsbCBh cmUpLiBXaGlsZSBgdGZvbGRgIGFscmVhZHkgZXhpc3RzIGluCkd1aWxlJ3MgU1JGSS0xNzEg ZXh0ZW5zaW9uIGFzIGEgdHJhbnNkdWNlciwgZm9sZGluZyBpcyBpbiBlc3NlbmNlIGEKcmVk dWN0aW9uLiBBbHNvIHdpdGhvdXQgYSBwcmltYXRpdmUgbGlrZSBgcmxhc3RgIChhbHNvIGlu dHJvZHVjZWQgaGVyZSksCnRoZSByZXN1bHRzIG9mIGB0Zm9sZGAgYXJlIGRpZmZpY3VsdCB0 byBjb25zdW1lLiBUaGlzIGlzIGF2b2lkZWQgYnkKcHJvdmlkaW5nIGByZm9sZGAgZGlyZWN0 bHkgYXMgYSBnZW5lcmFsaXNlZCBtZWFucyB0byBjb2xsYXBzZSBhbiBlbnRpcmUKdHJhbnNk dWN0aW9uIGRvd24gaW50byBhIHNpbmdsZSB2YWx1ZSAoaS5lLiB0aGUgd2hvbGUgcG9pbnQg b2YKcmVkdWNlcnMpLiBgcmZvbGRgIGlzIGFsc28gdXNlZnVsIGZvciB0aGUgY3JlYXRpb24g b2YgYWQtaG9jIHJlZHVjZXJzLAphcyBhbnkgMi1hcmcgZnVuY3Rpb24gY2FuIGJlIHBhc3Nl ZCB0byBpdCB0byBmb2xkIHRoZSBzdHJlYW0gb2YgdmFsdWVzLgoKYHJmaXJzdGAsIGBybGFz dGAsIGFuZCBgcmZpbmRgIGFyZSBjb21tb24gaWRpb21zIGFuZCBzbyBoYXZlIGJlZW4gYWRk ZWQuCgpUaGUgZXF1aXZhbGVudCBvZiBgcm1heGAgYW5kIGBybWluYCBhcmUgZWFzeSB0byB3 cml0ZSBtYW51YWxseSB2aWEKYHJmb2xkYCwgYnV0IHRoZXkgaGF2ZSBiZWVuIHByb3ZpZGVk IGhlcmUgYXMgYSBjb252ZW5pZW5jZSBpbiB0aGUgc2FtZQpzcGlyaXQgYXMgYHJjb25zYC4K CmByZm9yLWVhY2hgIGFsc28gY2Fubm90IGJlIGZvcmdvdHRlbiBhcyBhIGNsYXNzaWMgYWRh cHRhdGlvbiBvZiBpdHMKU1JGSS0xIGNvdXNpbi4KCkFsc28gYWRkZWQgaXMgYHR3aW5kb3dg LCBoYW5keSBmb3IgYW5hbHlzaW5nIGdyb3VwcyBvZiBhZGphY2VudCBpdGVtcy4KCiogbW9k dWxlL3NyZmkvc3JmaS0xNzEuc2NtOiBBZGQgbmV3IGZ1bmN0aW9ucy4KKiB0ZXN0LXN1aXRl L3Rlc3RzL3NyZmktMTcxLnRlc3Q6IEFkZCB0ZXN0cyBmb3IgbmV3IGZ1bmN0aW9ucy4KKiBk b2MvcmVmL3NyZmktbW9kdWxlcy50ZXhpOiBEb2N1bWVudCBuZXcgZnVuY3Rpb25zLgotLS0K IGRvYy9yZWYvc3JmaS1tb2R1bGVzLnRleGkgICAgICB8IDk2ICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrLS0KIG1vZHVsZS9zcmZpL3NyZmktMTcxL2dudS5zY20gICB8IDg3 ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQogdGVzdC1zdWl0ZS90ZXN0cy9zcmZp LTE3MS50ZXN0IHwgNjYgKysrKysrKysrKysrKysrKysrKystLS0KIDMgZmlsZXMgY2hhbmdl ZCwgMjM2IGluc2VydGlvbnMoKyksIDEzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2Rv Yy9yZWYvc3JmaS1tb2R1bGVzLnRleGkgYi9kb2MvcmVmL3NyZmktbW9kdWxlcy50ZXhpCmlu ZGV4IGJjZTViNGVhYy4uNmViMWE1NjNlIDEwMDY0NAotLS0gYS9kb2MvcmVmL3NyZmktbW9k dWxlcy50ZXhpCisrKyBiL2RvYy9yZWYvc3JmaS1tb2R1bGVzLnRleGkKQEAgLTU4MzYsNyAr NTgzNiw3IEBAIGlkZW50aXR5IGluIHRoZSByZWR1Y3Rpb24uCiBAY2luZGV4IHRyYW5zZHVj ZXJzIHJlZHVjZXJzCiAKIEBkZWZmbiB7U2NoZW1lIFByb2NlZHVyZX0gcmNvbnMKLWEgc2lt cGxlIGNvbnNpbmcgcmVkdWNlci4gV2hlbiBjYWxsZWQgd2l0aG91dCB2YWx1ZXMsIGl0IHJl dHVybnMgaXRzCitBIHNpbXBsZSBjb25zaW5nIHJlZHVjZXIuIFdoZW4gY2FsbGVkIHdpdGhv dXQgdmFsdWVzLCBpdCByZXR1cm5zIGl0cwogaWRlbnRpdHksIEBjb2RleycoKX0uICBXaXRo IG9uZSB2YWx1ZSwgd2hpY2ggd2lsbCBiZSBhIGxpc3QsIGl0IHJldmVyc2VzCiB0aGUgbGlz dCAodXNpbmcgQGNvZGV7cmV2ZXJzZSF9KS4gIFdoZW4gY2FsbGVkIHdpdGggdHdvIHZhbHVl cywgaXQgY29uc2VzCiB0aGUgc2Vjb25kIHZhbHVlIHRvIHRoZSBmaXJzdC4KQEAgLTU4NDgs NyArNTg0OCw3IEBAIHRoZSBzZWNvbmQgdmFsdWUgdG8gdGhlIGZpcnN0LgogQGVuZCBkZWZm bgogCiBAZGVmZm4ge1NjaGVtZSBQcm9jZWR1cmV9IHJldmVyc2UtcmNvbnMKLXNhbWUgYXMg cmNvbnMsIGJ1dCBsZWF2ZXMgdGhlIHZhbHVlcyBpbiB0aGVpciByZXZlcnNlZCBvcmRlci4K K1RoZSBzYW1lIGFzIEBjb2Rle3Jjb25zfSwgYnV0IGxlYXZlcyB0aGUgdmFsdWVzIGluIHRo ZWlyIHJldmVyc2VkIG9yZGVyLgogQGV4YW1wbGUKIChsaXN0LXRyYW5zZHVjZSAodG1hcCAo bGFtYmRhICh4KSAoKyB4IDEpKSkgcmV2ZXJzZS1yY29ucyAobGlzdCAwIDEgMiAzKSkKIEBy ZXN1bHR7fSAoNCAzIDIgMSkKQEAgLTU4NTYsNyArNTg1Niw3IEBAIHNhbWUgYXMgcmNvbnMs IGJ1dCBsZWF2ZXMgdGhlIHZhbHVlcyBpbiB0aGVpciByZXZlcnNlZCBvcmRlci4KIEBlbmQg ZGVmZm4KIAogQGRlZmZuIHtTY2hlbWUgUHJvY2VkdXJlfSByYW55IHByZWQ/Ci1UaGUgcmVk dWNlciB2ZXJzaW9uIG9mIGFueS4gIFJldHVybnMgQGNvZGV7KHJlZHVjZWQgKHByZWQ/IHZh bHVlKSl9IGlmCitUaGUgcmVkdWNlciB2ZXJzaW9uIG9mIEBjb2Rle2FueX0uICBSZXR1cm5z IEBjb2RleyhyZWR1Y2VkIChwcmVkPyB2YWx1ZSkpfSBpZgogYW55IEBjb2RleyhwcmVkPyB2 YWx1ZSl9IHJldHVybnMgbm9uLSNmLiAgVGhlIGlkZW50aXR5IGlzICNmLgogCiBAZXhhbXBs ZQpAQCAtNTg2OSw3ICs1ODY5LDcgQEAgYW55IEBjb2RleyhwcmVkPyB2YWx1ZSl9IHJldHVy bnMgbm9uLSNmLiAgVGhlIGlkZW50aXR5IGlzICNmLgogQGVuZCBkZWZmbgogCiBAZGVmZm4g e1NjaGVtZSBQcm9jZWR1cmV9IHJldmVyeSBwcmVkPwotVGhlIHJlZHVjZXIgdmVyc2lvbiBv ZiBldmVyeS4gIFN0b3BzIHRoZSB0cmFuc2R1Y3Rpb24gYW5kIHJldHVybnMKK1RoZSByZWR1 Y2VyIHZlcnNpb24gb2YgQGNvZGV7ZXZlcnl9LiAgU3RvcHMgdGhlIHRyYW5zZHVjdGlvbiBh bmQgcmV0dXJucwogQGNvZGV7KHJlZHVjZWQgI2YpfSBpZiBhbnkgQGNvZGV7KHByZWQ/IHZh bHVlKX0gcmV0dXJucyAjZi4gIElmIGV2ZXJ5CiBAY29kZXsocHJlZD8gdmFsdWUpfSByZXR1 cm5zIHRydWUsIGl0IHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgbGFzdAogaW52b2NhdGlv biBvZiBAY29kZXsocHJlZD8gdmFsdWUpfS4gIFRoZSBpZGVudGl0eSBpcyAjdC4KQEAgLTU4 OTQsNiArNTg5NCw3NyBAQCB0cmFuc2R1Y3Rpb24uCiBAZW5kIGV4YW1wbGUKIEBlbmQgZGVm Zm4KIAorQHN1YmhlYWRpbmcgR3VpbGUtc3BlY2lmaWMgcmVkdWNlcnMKK1RoZXNlIHJlZHVj ZXJzIGFyZSBhdmFpbGFibGUgaW4gdGhlIEBjb2RleyhzcmZpIHNyZmktMTcxIGdudSl9IG1v ZHVsZSwKK2FuZCBhcmUgcHJvdmlkZWQgb3V0c2lkZSB0aGUgc3RhbmRhcmQgZGVzY3JpYmVk IGJ5IHRoZSBTUkZJLTE3MQorZG9jdW1lbnQuCisKK0BkZWZmbiB7U2NoZW1lIFByb2NlZHVy ZX0gcmZvbGQgcHJvYyBzZWVkCitUaGUgZnVuZGFtZW50YWwgcmVkdWNlci4gQGNvZGV7cmZv bGR9IGNyZWF0ZXMgYW4gYWQtaG9jIHJlZHVjZXIgYmFzZWQgb24KK2EgZ2l2ZW4gMi1hcmd1 bWVudCBAdmFye3Byb2N9LiBBIEB2YXJ7c2VlZH0gaXMgcmVxdWlyZWQgYXMgdGhlIGluaXRp YWwKK2FjY3VtdWxhdG9yIHZhbHVlLCB3aGljaCBhbHNvIGJlY29tZXMgdGhlIGZpbmFsIHJl dHVybiB2YWx1ZSBpbiB0aGUgY2FzZQord2hlcmUgdGhlcmUgd2FzIG5vIGlucHV0IGxlZnQg aW4gdGhlIHRyYW5zZHVjdGlvbi4KKworVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBAdmFy e3Byb2N9IGlzIHRoZSBhY2N1bXVsYXRpbmcgdmFsdWUsIGFuZCB0aGUKK3NlY29uZCBpcyB0 aGUgY3VycmVudCBpdGVtIG9mIHRoZSB0cmFuc2R1Y3Rpb24uCisKK05vdGUgdGhhdCBmdW5j dGlvbnMgbGlrZSBAY29kZXsrfSBhbmQgQGNvZGV7Kn0gYXJlIGF1dG9tYXRpY2FsbHkgdmFs aWQKK3JlZHVjZXJzLCBiZWNhdXNlIHRoZXkgeWllbGQgc2FuZSB2YWx1ZXMgZXZlbiB3aGVu IGdpdmVuIDAgb3IgMQorYXJndW1lbnRzLiBPdGhlciBmdW5jdGlvbnMgbGlrZSBAY29kZXtt YXh9IGNhbm5vdCBiZSB1c2VkIGFzLWlzIGFzCityZWR1Y2VycyBzaW5jZSB0aGV5IHJlcXVp cmUgYXQgbGVhc3QgMiBhcmd1bWVudHMuIEZvciBmdW5jdGlvbnMgbGlrZQordGhpcywgQGNv ZGV7cmZvbGR9IGlzIGFwcHJvcHJpYXRlLgorCitAZXhhbXBsZQorOzsgVHVybmluZyBidWls dC1pbnMgaW50byByZWR1Y2Vycy4gSWRlbnRpY2FsIHRvIHJtYXguCisobGlzdC10cmFuc2R1 Y2UgKHRmaWx0ZXIgb2RkPykgKHJmb2xkIG1heCAwKSAnKDEgMiAzIDQgNSkpCitAcmVzdWx0 e30gNQorCis7OyBDdXN0b20gbGFtYmRhcyBpbnRvIHJlZHVjZXJzLiBJZGVudGljYWwgdG8g cmxhc3QuCisobGlzdC10cmFuc2R1Y2UgKHRtYXAgaWRlbnRpdHkpCisgICAgICAgICAgICAg ICAgKHJmb2xkIChsYW1iZGEgKF8gaW5wdXQpIGlucHV0KSAjZikKKyAgICAgICAgICAgICAg ICAnKCJhYmMiICJkZWYiICJnaGkiKSkKK0ByZXN1bHR7fSAiZ2hpIgorCis7OyBUcmFjayB0 aGUgMyBsYXJnZXN0IHZhbHVlcyBpbiBhIHRyYW5zZHVjdGlvbi4KKyhkZWZpbmUgKHRocmVl LWxhcmdlc3QgYWNjIGlucHV0KQorICAodGFrZSAoc29ydCAoY29ucyBpbnB1dCBhY2MpID4p IDMpKQorCisobGlzdC10cmFuc2R1Y2UgKHRmaWx0ZXIgb2RkPykKKyAgICAgICAgICAgICAg ICAocmZvbGQgdGhyZWUtbGFyZ2VzdCAnKDAgMCAwKSkKKyAgICAgICAgICAgICAgICAnKDcg MSA0IDIgMTMgNSA5IDIgOCkpCitAcmVzdWx0e30gKDEzIDkgNykKK0BlbmQgZXhhbXBsZQor QGVuZCBkZWZmbgorCitAZGVmZm4ge1NjaGVtZSBQcm9jZWR1cmV9IHJmaW5kIHByZWQ/CitG aW5kIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSB0cmFuc2R1Y3Rpb24gdGhhdCBzYXRpc2Zp ZXMgYSBnaXZlbgorcHJlZGljYXRlLiBZaWVsZHMgI2YgaWYgbm8gc3VjaCBlbGVtZW50IHdh cyBmb3VuZC4KKworQGV4YW1wbGUKKyhsaXN0LXRyYW5zZHVjZSAodG1hcCBpZGVudGl0eSkK KyAgICAgICAgICAgICAgICAocmZpbmQgc3RyaW5nPykKKyAgICAgICAgICAgICAgICAnKDEg YyAjdCA0LjEyICJKYWNrIiAoKSkpCitAcmVzdWx0e30gIkphY2siCitAZW5kIGV4YW1wbGUK K0BlbmQgZGVmZm4KKworQGRlZmZuIHtTY2hlbWUgUHJvY2VkdXJlfSByZmlyc3Qgc2VlZAor QGRlZmZueCB7U2NoZW1lIFByb2NlZHVyZX0gcmxhc3Qgc2VlZAorWWllbGQgdGhlIGZpcnN0 IChvciBsYXN0KSB2YWx1ZSBvZiB0aGUgdHJhbnNkdWN0aW9uLCBvciB0aGUgQHZhcntzZWVk fQordmFsdWUgaWYgdGhlcmUgaXMgbm9uZS4KK0BlbmQgZGVmZm4KKworQGRlZmZuIHtTY2hl bWUgUHJvY2VkdXJlfSByZm9yLWVhY2ggcHJvYworQXBwbHkgQHZhcntwcm9jfSBmb3IgaXRz IHNpZGUtZWZmZWN0cyB0byBldmVyeSB2YWx1ZSBvZiB0aGUKK3RyYW5zZHVjdGlvbiwgaWdu b3JpbmcgYWxsIHJlc3VsdHMuIExpa2UgaXRzIEByZWZ7U1JGSS0xfSBjb3VzaW4sIHlpZWxk cworQGNvZGV7KnVuc3BlY2lmaWVkKn0uCitAZW5kIGRlZmZuCisKK0BkZWZmbiB7U2NoZW1l IFByb2NlZHVyZX0gcm1heCBzZWVkCitAZGVmZm54IHtTY2hlbWUgUHJvY2VkdXJlfSBybWlu IHNlZWQKK1lpZWxkIHRoZSBtYXhpbXVtIChvciBtaW5pbXVtKSB2YWx1ZSBvZiB0aGUgdHJh bnNkdWN0aW9uLCBvciB0aGUKK0B2YXJ7c2VlZH0gdmFsdWUgaWYgdGhlcmUgaXMgbm9uZS4K K0BlbmQgZGVmZm4KIAogQG5vZGUgU1JGSS0xNzEgVHJhbnNkdWNlcnMKIEBzdWJzdWJzZWN0 aW9uIFRyYW5zZHVjZXJzCkBAIC02MDU3LDcgKzYxMjgsNyBAQCBTdGF0ZWxlc3MuCiAKIEBz dWJoZWFkaW5nIEd1aWxlLXNwZWNpZmljIHRyYW5zZHVjZXJzCiBUaGVzZSB0cmFuc2R1Y2Vy cyBhcmUgYXZhaWxhYmxlIGluIHRoZSBAY29kZXsoc3JmaSBzcmZpLTE3MSBnbnUpfQotbGli cmFyeSwgYW5kIGFyZSBwcm92aWRlZCBvdXRzaWRlIHRoZSBzdGFuZGFyZCBkZXNjcmliZWQg YnkgdGhlIFNSRkktMTcxCittb2R1bGUsIGFuZCBhcmUgcHJvdmlkZWQgb3V0c2lkZSB0aGUg c3RhbmRhcmQgZGVzY3JpYmVkIGJ5IHRoZSBTUkZJLTE3MQogZG9jdW1lbnQuCiAKIEBkZWZm biB7U2NoZW1lIFByb2NlZHVyZX0gdGJhdGNoIHJlZHVjZXIKQEAgLTYwODUsNiArNjE1Niwy MSBAQCB2YWx1ZSl9LCBzYXZpbmcgaXQncyByZXN1bHQgYmV0d2VlbiBpdGVyYXRpb25zLgog QGVuZCBleGFtcGxlCiBAZW5kIGRlZmZuCiAKK0BkZWZmbiB7U2NoZW1lIFByb2NlZHVyZX0g dHdpbmRvdyBuCisKK1JldHVybnMgYSB0cmFuc2R1Y2VyIHRoYXQgeWllbGRzIEB2YXJ7bn0t bGVuZ3RoIHdpbmRvd3Mgb2Ygb3ZlcmxhcHBpbmcKK3ZhbHVlcy4gVGhpcyBpcyBkaWZmZXJl bnQgZnJvbSBAY29kZXt0c2VnbWVudH0gd2hpY2ggeWllbGRzCitub24tb3ZlcmxhcHBpbmcg d2luZG93cy4gSWYgdGhlcmUgd2VyZSBmZXdlciBpdGVtcyBpbiB0aGUgaW5wdXQgdGhhbgor QHZhcntufSwgdGhlbiB0aGlzIHlpZWxkcyBub3RoaW5nLgorCitAZXhhbXBsZQorKGxpc3Qt dHJhbnNkdWNlICh0d2luZG93IDMpIHJjb25zICcoMSAyIDMgNCA1KSkKK0ByZXN1bHR7fSAo KDEgMiAzKSAoMiAzIDQpICgzIDQgNSkpCitAZW5kIGV4YW1wbGUKKworU3RhdGVmdWwuCitA ZW5kIGRlZmZuCisKIAogQG5vZGUgU1JGSS0xNzEgSGVscGVycwogQHN1YnN1YnNlY3Rpb24g SGVscGVyIGZ1bmN0aW9ucyBmb3Igd3JpdGluZyB0cmFuc2R1Y2VycwpkaWZmIC0tZ2l0IGEv bW9kdWxlL3NyZmkvc3JmaS0xNzEvZ251LnNjbSBiL21vZHVsZS9zcmZpL3NyZmktMTcxL2du dS5zY20KaW5kZXggNDVhNGUxOWFmLi5jNDE5MjVlOGEgMTAwNjQ0Ci0tLSBhL21vZHVsZS9z cmZpL3NyZmktMTcxL2dudS5zY20KKysrIGIvbW9kdWxlL3NyZmkvc3JmaS0xNzEvZ251LnNj bQpAQCAtMTUsMTAgKzE1LDE3IEBACiA7OyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp biBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAKIChk ZWZpbmUtbW9kdWxlIChzcmZpIHNyZmktMTcxIGdudSkKKyAgIzp1c2UtbW9kdWxlIChpY2Ut OSBxKQogICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0xNzEpCiAgICM6dXNlLW1vZHVsZSAo c3JmaSBzcmZpLTE3MSBtZXRhKQotICAjOmV4cG9ydCAodGJhdGNoIHRmb2xkKSkKLQorICAj OmV4cG9ydCAodGJhdGNoCisgICAgICAgICAgICB0Zm9sZAorICAgICAgICAgICAgdHdpbmRv dworICAgICAgICAgICAgcmZpbmQKKyAgICAgICAgICAgIHJmaXJzdCBybGFzdAorICAgICAg ICAgICAgcmZvbGQKKyAgICAgICAgICAgIHJmb3ItZWFjaAorICAgICAgICAgICAgcm1heCBy bWluKSkKIAogKGRlZmluZSB0YmF0Y2gKICAgKGNhc2UtbGFtYmRhCkBAIC02MywzICs3MCw3 OSBAQAogICAgICAgICAgKGlmIChyZWR1Y2VkPyBzdGF0ZSkKICAgICAgICAgICAgICAocmVk dWNlZCAocmVkdWNlciAodW5yZWR1Y2Ugc3RhdGUpKSkKICAgICAgICAgICAgICAociByZXN1 bHQgc3RhdGUpKSkpKSkpCisKKyhkZWZpbmUgKHR3aW5kb3cgbikKKyAgIllpZWxkIEB2YXJ7 bn0tbGVuZ3RoIHdpbmRvd3Mgb2Ygb3ZlcmxhcHBpbmcgdmFsdWVzLiAgVGhpcyBpcyBkaWZm ZXJlbnQgZnJvbQorQGNvZGV7dHNlZ21lbnR9IHdoaWNoIHlpZWxkcyBub24tb3ZlcmxhcHBp bmcgd2luZG93cy4gSWYgdGhlcmUgd2VyZQorZmV3ZXIgaXRlbXMgaW4gdGhlIGlucHV0IHRo YW4gQHZhcntufSwgdGhlbiB0aGlzIHlpZWxkcyBub3RoaW5nLiIKKyAgKHdoZW4gKG5vdCAo YW5kIChpbnRlZ2VyPyBuKSAocG9zaXRpdmU/IG4pKSkKKyAgICAgICAgKGVycm9yICJhcmd1 bWVudCB0byB0d2luZG93IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIikpCisgIChsYW1i ZGEgKHJlZHVjZXIpCisgICAgKGxldCAoKGkgMCkKKyAgICAgICAgICAocSAobWFrZS1xKSkp CisgICAgICAoY2FzZS1sYW1iZGEKKyAgICAgICAgKCgpIChyZWR1Y2VyKSkKKyAgICAgICAg KChyZXN1bHQpIChyZWR1Y2VyIHJlc3VsdCkpCisgICAgICAgICgocmVzdWx0IGlucHV0KQor ICAgICAgICAgKGVucSEgcSBpbnB1dCkKKyAgICAgICAgIChzZXQhIGkgKDErIGkpKQorICAg ICAgICAgKGNvbmQgKCg8IGkgbikgcmVzdWx0KQorICAgICAgICAgICAgICAgKCg9IGkgbikg KHJlZHVjZXIgcmVzdWx0IChsaXN0LWNvcHkgKGNhciBxKSkpKQorICAgICAgICAgICAgICAg KGVsc2UgKGRlcSEgcSkKKyAgICAgICAgICAgICAgICAgICAgIChyZWR1Y2VyIHJlc3VsdCAo bGlzdC1jb3B5IChjYXIgcSkpKSkpKSkpKSkKKworKGRlZmluZSByZm9yLWVhY2gKKyAgKGNh c2UtbGFtYmRhCisgICAgIlJ1biB0aHJvdWdoIGV2ZXJ5IGl0ZW0gaW4gYSB0cmFuc2R1Y3Rp b24gZm9yIHRoZWlyIHNpZGUgZWZmZWN0cyBidXQgdGhyb3cgYXdheQorYWxsIHJlc3VsdHMu IgorICAgICgoKSAqdW5zcGVjaWZpZWQqKQorICAgICgoYWNjKSAqdW5zcGVjaWZpZWQqKQor ICAgICgoYWNjIGlucHV0KSAqdW5zcGVjaWZpZWQqKSkpCisKKyhkZWZpbmUgKHJmaXJzdCBz ZWVkKQorICAiWWllbGQgdGhlIGZpcnN0IHZhbHVlIG9mIHRoZSB0cmFuc2R1Y3Rpb24sIG9y IHRoZSBAdmFye3NlZWR9IHZhbHVlIGlmIHRoZXJlIGlzIG5vbmUuIgorICAoY2FzZS1sYW1i ZGEKKyAgICAoKCkgc2VlZCkKKyAgICAoKGFjYykgYWNjKQorICAgICgoXyBpbnB1dCkgKHJl ZHVjZWQgaW5wdXQpKSkpCisKKyhkZWZpbmUgKHJsYXN0IHNlZWQpCisgICJZaWVsZCB0aGUg ZmluYWwgdmFsdWUgb2YgdGhlIHRyYW5zZHVjdGlvbiwgb3IgdGhlIEB2YXJ7c2VlZH0gdmFs dWUgaWYgdGhlcmUgaXMgbm9uZS4iCisgIChjYXNlLWxhbWJkYQorICAgICgoKSBzZWVkKQor ICAgICgoYWNjKSBhY2MpCisgICAgKChfIGlucHV0KSBpbnB1dCkpKQorCisoZGVmaW5lIChy Zm9sZCBmIHNlZWQpCisgICJUaGUgZnVuZGFtZW50YWwgcmVkdWNlci4gQGNvZGV7cmZvbGR9 IGNyZWF0ZXMgYW4gYWQtaG9jIHJlZHVjZXIgYmFzZWQgb24KK2EgZ2l2ZW4gMi1hcmd1bWVu dCBmdW5jdGlvbi4gQSBAdmFye3NlZWR9IGlzIGFsc28gcmVxdWlyZWQgYXMgdGhlCitpbml0 aWFsIGFjY3VtdWxhdG9yIHZhbHVlLCB3aGljaCBhbHNvIGJlY29tZXMgdGhlIHJldHVybiB2 YWx1ZSBpbiBjYXNlCit0aGVyZSB3YXMgbm8gaW5wdXQgbGVmdCBpbiB0aGUgdHJhbnNkdWN0 aW9uLgorCitGdW5jdGlvbnMgbGlrZSBAY29kZXsrfSBhbmQgQGNvZGV7Kn0gYXJlIGF1dG9t YXRpY2FsbHkgdmFsaWQgcmVkdWNlcnMsCitiZWNhdXNlIHRoZXkgeWllbGQgc2FuZSB2YWx1 ZXMgZXZlbiB3aGVuIGdpdmVuIDAgb3IgMSBhcmd1bWVudHMuIE90aGVyCitmdW5jdGlvbnMg bGlrZSBAY29kZXttYXh9IGNhbm5vdCBiZSB1c2VkIGFzLWlzIGFzIHJlZHVjZXJzIHNpbmNl IHRoZXkKK3JlcXVpcmUgYXQgbGVhc3QgMiBhcmd1bWVudHMuIEZvciBmdW5jdGlvbnMgbGlr ZSB0aGlzLCBAY29kZXtyZm9sZH0gaXMKK2FwcHJvcHJpYXRlLiIKKyAgKGNhc2UtbGFtYmRh CisgICAgKCgpIHNlZWQpCisgICAgKChhY2MpIGFjYykKKyAgICAoKGFjYyBpbnB1dCkgKGYg YWNjIGlucHV0KSkpKQorCisoZGVmaW5lIChybWF4IHNlZWQpCisgICJZaWVsZCB0aGUgbWF4 aW11bSB2YWx1ZSBvZiB0aGUgdHJhbnNkdWN0aW9uLCBvciB0aGUgQHZhcntzZWVkfSB2YWx1 ZSBpZgordGhlcmUgaXMgbm9uZS4iCisgIChyZm9sZCBtYXggc2VlZCkpCisKKyhkZWZpbmUg KHJtaW4gc2VlZCkKKyAgIllpZWxkIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSB0cmFuc2R1 Y3Rpb24sIG9yIHRoZSBAdmFye3NlZWR9IHZhbHVlIGlmCit0aGVyZSBpcyBub25lLiIKKyAg KHJmb2xkIG1pbiBzZWVkKSkKKworKGRlZmluZSAocmZpbmQgcHJlZD8pCisgICJGaW5kIHRo ZSBmaXJzdCBlbGVtZW50IGluIHRoZSB0cmFuc2R1Y3Rpb24gdGhhdCBzYXRpc2ZpZXMgYSBn aXZlbiBwcmVkaWNhdGUuCitZaWVsZHMgI2YgaWYgbm8gc3VjaCBlbGVtZW50IHdhcyBmb3Vu ZC4iCisgIChjYXNlLWxhbWJkYQorICAgICgoKSAjZikKKyAgICAoKGFjYykgYWNjKQorICAg ICgoYWNjIGlucHV0KSAoaWYgKHByZWQ/IGlucHV0KSAocmVkdWNlZCBpbnB1dCkgI2YpKSkp CmRpZmYgLS1naXQgYS90ZXN0LXN1aXRlL3Rlc3RzL3NyZmktMTcxLnRlc3QgYi90ZXN0LXN1 aXRlL3Rlc3RzL3NyZmktMTcxLnRlc3QKaW5kZXggMWVmN2JjNWYyLi5kMWQ1NGIyZWMgMTAw NjQ0Ci0tLSBhL3Rlc3Qtc3VpdGUvdGVzdHMvc3JmaS0xNzEudGVzdAorKysgYi90ZXN0LXN1 aXRlL3Rlc3RzL3NyZmktMTcxLnRlc3QKQEAgLTIwNywxNSArMjA3LDY5IEBACiAgICAgICAg ICAgICAobGlzdC10cmFuc2R1Y2UgKHRlbnVtZXJhdGUgKC0gMSkpIHJjb25zIG51bWVyaWMt bGlzdCkpKQogCiAgIChwYXNzLWlmICJ0YmF0Y2giCi0gICAgKGVxdWFsPwotICAgICAgICAg ICAgJygoMCAxKSAoMiAzKSAoNCkpCisgICAgKGVxdWFsPyAnKCgwIDEpICgyIDMpICg0KSkK ICAgICAgICAgICAgIChsaXN0LXRyYW5zZHVjZSAodGJhdGNoICh0dGFrZSAyKSByY29ucykg cmNvbnMgbnVtZXJpYy1saXN0KSkpCiAKICAgKHBhc3MtaWYgInRmb2xkIgotICAgICAgICAg ICAoZXF1YWw/Ci0gICAgICAgICAgICAnKDAgMSAzIDYgMTApCi0gICAgICAgICAgICAobGlz dC10cmFuc2R1Y2UgKHRmb2xkICspIHJjb25zIG51bWVyaWMtbGlzdCkpKSkKLQorICAgIChl cXVhbD8gJygwIDEgMyA2IDEwKQorICAgICAgICAgICAgKGxpc3QtdHJhbnNkdWNlICh0Zm9s ZCArKSByY29ucyBudW1lcmljLWxpc3QpKSkKKworICAocGFzcy1pZiAidHdpbmRvdzogdG9v IHdpZGUgb2YgYSB3aW5kb3ciCisgICAgKGVxdWFsPyAnKCkKKyAgICAgICAgICAgIChsaXN0 LXRyYW5zZHVjZSAodHdpbmRvdyAxMCkgcmNvbnMgJygxIDIgMykpKSkKKworICAocGFzcy1p ZiAidHdpbmRvdzogYWNjZXB0YWJsZSB3aW5kb3ciCisgICAgKGVxdWFsPyAnKCgxIDIgMykg KDIgMyA0KSAoMyA0IDUpKQorICAgICAgICAgICAgKGxpc3QtdHJhbnNkdWNlICh0d2luZG93 IDMpIHJjb25zICcoMSAyIDMgNCA1KSkpKSkKKworKHdpdGgtdGVzdC1wcmVmaXggInJlZHVj ZXJzIgorICAocGFzcy1pZiAicmZvbGQ6IGJ1aWx0aW4iCisgICAgKGVxdWFsPyA1CisgICAg ICAgICAgICAobGlzdC10cmFuc2R1Y2UgKHRmaWx0ZXIgb2RkPykgKHJmb2xkIG1heCAwKSAn KDEgMiAzIDQgNSkpKSkKKworICAocGFzcy1pZiAicmZvbGQ6IGN1c3RvbSBsYW1iZGEiCisg ICAgKGVxdWFsPyAiZ2hpIgorICAgICAgICAgICAgKGxpc3QtdHJhbnNkdWNlICh0bWFwIGlk ZW50aXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZm9sZCAobGFtYmRhIChf IGlucHV0KSBpbnB1dCkgI2YpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygiYWJj IiAiZGVmIiAiZ2hpIikpKSkKKworICAocGFzcy1pZiAicmZpcnN0OiBlbXB0eSIKKyAgICAo ZXF1YWw/IDAKKyAgICAgICAgICAgIChsaXN0LXRyYW5zZHVjZSAodG1hcCBpZGVudGl0eSkg KHJmaXJzdCAwKSAnKCkpKSkKKworICAocGFzcy1pZiAicmZpcnN0OiBub24tZW1wdHkiCisg ICAgKGVxdWFsPyAxCisgICAgICAgICAgICAobGlzdC10cmFuc2R1Y2UgKHRtYXAgaWRlbnRp dHkpIChyZmlyc3QgMCkgJygxIDIgMykpKSkKKworICAocGFzcy1pZiAicmxhc3Q6IGVtcHR5 IgorICAgIChlcXVhbD8gMAorICAgICAgICAgICAgKGxpc3QtdHJhbnNkdWNlICh0ZmlsdGVy IChsYW1iZGEgKF8pICNmKSkgKHJsYXN0IDApICcoMSAyIDMpKSkpCisKKyAgKHBhc3MtaWYg InJsYXN0OiBub24tZW1wdHkiCisgICAgKGVxdWFsPyA1CisgICAgICAgICAgICAobGlzdC10 cmFuc2R1Y2UgKHRtYXAgaWRlbnRpdHkpIChybGFzdCAwKSAnKDEgMiAzIDQgNSkpKSkKKwor ICAocGFzcy1pZiAicm1heDogZW1wdHkiCisgICAgKGVxdWFsPyAwCisgICAgICAgICAgICAo bGlzdC10cmFuc2R1Y2UgKHRtYXAgaWRlbnRpdHkpIChybWF4IDApICcoKSkpKQorCisgIChw YXNzLWlmICJybWF4OiBub24tZW1wdHkiCisgICAgKGVxdWFsPyAzMQorICAgICAgICAgICAg KGxpc3QtdHJhbnNkdWNlICh0bWFwIGlkZW50aXR5KSAocm1heCAwKSAnKDEgMiAzMSA0IDUp KSkpCisKKyAgKHBhc3MtaWYgInJtaW46IGVtcHR5IgorICAgIChlcXVhbD8gMAorICAgICAg ICAgICAgKGxpc3QtdHJhbnNkdWNlICh0bWFwIGlkZW50aXR5KSAocm1pbiAwKSAnKCkpKSkK KworICAocGFzcy1pZiAicm1pbjogbm9uLWVtcHR5IgorICAgIChlcXVhbD8gMQorICAgICAg ICAgICAgKGxpc3QtdHJhbnNkdWNlICh0bWFwIGlkZW50aXR5KSAocm1pbiAxMDAwKSAnKDUg MyAxIDcgNikpKSkKKworICAocGFzcy1pZiAicmZpbmQiCisgICAgKGVxdWFsPyAiSmFjayIK KyAgICAgICAgICAgIChsaXN0LXRyYW5zZHVjZSAodG1hcCBpZGVudGl0eSkKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAocmZpbmQgc3RyaW5nPykKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAnKDEgYyAjdCA0LjEyICJKYWNrIiAoKSkpKSkpCiAKICh3aXRoLXRlc3Qt cHJlZml4ICJ4LXRyYW5zZHVjZSIKICAgKHBhc3MtaWYgImxpc3QtdHJhbnNkdWNlIiAKLS0g CjIuMzkuMAoK --------------GFxtAfiQZy38HmeIINYIBpmd Content-Type: text/x-patch; charset=UTF-8; name="0002-doc-added-a-guide-for-writing-custom-reducers.patch" Content-Disposition: attachment; filename="0002-doc-added-a-guide-for-writing-custom-reducers.patch" Content-Transfer-Encoding: base64 RnJvbSA3NjdjNThjOTZjOGVjNjM3MjdmYTg1MDgwMTc5NzljYTVkNjRhZDk5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDb2xpbiBXb29kYnVyeSA8Y29saW5AZm9zc2tlcnMu Y2E+CkRhdGU6IFRodSwgMjIgRGVjIDIwMjIgMjA6MzI6MzMgKzA5MDAKU3ViamVjdDogW1BB VENIIDIvMl0gZG9jOiBhZGRlZCBhIGd1aWRlIGZvciB3cml0aW5nIGN1c3RvbSByZWR1Y2Vy cwoKVGhlIGd1aWRlIHByZXZpb3VzbHkgZXhwbGFpbmVkIHdoYXQgcmVkdWNlcnMgd2VyZSwg YnV0IG5vdCB0aGUgc3BlY2lmaWNzCm9mIGhvdyB0byB3cml0ZSB0aGVtIHlvdXJzZWxmLiBU aGlzIGNvbW1pdHMgcmVjdGlmaWVzIHRoaXMuCgoqIGRvYy9yZWYvc3JmaS1tb2R1bGVzLnRl eGk6IEV4cGxhaW4gaG93IHRvIHdyaXRlIG9uZSdzIG93biByZWR1Y2Vycy4KLS0tCiBkb2Mv cmVmL3NyZmktbW9kdWxlcy50ZXhpIHwgNzkgKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrCiAxIGZpbGUgY2hhbmdlZCwgNzkgaW5zZXJ0aW9ucygrKQoKZGlmZiAt LWdpdCBhL2RvYy9yZWYvc3JmaS1tb2R1bGVzLnRleGkgYi9kb2MvcmVmL3NyZmktbW9kdWxl cy50ZXhpCmluZGV4IDZlYjFhNTYzZS4uY2I0Y2VmNWE1IDEwMDY0NAotLS0gYS9kb2MvcmVm L3NyZmktbW9kdWxlcy50ZXhpCisrKyBiL2RvYy9yZWYvc3JmaS1tb2R1bGVzLnRleGkKQEAg LTU5NjYsNiArNTk2Niw4NSBAQCBZaWVsZCB0aGUgbWF4aW11bSAob3IgbWluaW11bSkgdmFs dWUgb2YgdGhlIHRyYW5zZHVjdGlvbiwgb3IgdGhlCiBAdmFye3NlZWR9IHZhbHVlIGlmIHRo ZXJlIGlzIG5vbmUuCiBAZW5kIGRlZmZuCiAKK0BzdWJoZWFkaW5nIFdyaXRpbmcgeW91ciBv d24gUmVkdWNlcnMKKworSWYgeW91IHdhbnQgdG8gcmVkdWNlIHNvbWUgdmFsdWVzIHZpYSBh biBvcmRpbmFyeSBmdW5jdGlvbiB0aGF0IHlvdQorYWxyZWFkeSBoYXZlIG9uLWhhbmQsIHRo ZW4gQGNvZGV7cmZvbGR9IGlzIGFsbCB5b3UgbmVlZDoKKworQGV4YW1wbGUKKzs7IFNhbWUg YXMgcm1heC4KKyhsaXN0LXRyYW5zZHVjZSAodG1hcCBpZGVudGl0eSkgKHJmb2xkIG1heCAw KSAnKDEgMiAzIDQgNSkpCitAcmVzdWx0e30gNQorQGVuZCBleGFtcGxlCisKK0hvd2V2ZXIs IGlmIHlvdSB3YW50IG1vcmUgY3VzdG9taXplZCBiZWhhdmlvdXIgKHN1Y2ggYXMgZWFybHkK K3Rlcm1pbmF0aW9uIGFuZC9vciBhcmJpdHJhcnkgbWFuaXB1bGF0aW9uIG9mIHRoZSBpbnB1 dCB2YWx1ZXMpIHRoZW4KK3lvdSdyZSBmcmVlIHRvIHdyaXRlIGEgcmVkdWNlciBtYW51YWxs eS4gIFRvIGRvIHNvLCB3ZSBuZWVkIHRvIHdyaXRlIGEKK2Z1bmN0aW9uIHRoYXQgY2FuIGFj Y2VwdCBvbmUgdG8gdGhyZWUgYXJndW1lbnRzLiAgV2UgZG8gdGhpcyB3aXRoCitAY29kZXtj YXNlLWxhbWJkYX0uICBMZXQncyBjcmVhdGUgYSBzaW1wbGUgcmVkdWNlciB0aGF0IGFkZHMg YWxsIHRoZQorbnVtYmVycyBpbiBpdHMgaW5wdXQ6CisKK0BleGFtcGxlCisoZGVmaW5lIHJz dW0KKyAgKGNhc2UtbGFtYmRhCisgICAgOzsgVGhpcyBpcyB0aGUgZmlyc3QgY2FzZSBjYWxs ZWQuIEl0IGVzdGFibGlzaGVzIHRoZSBvbi1nb2luZworICAgIDs7IGFjY3VtdWxhdG9yIHZh bHVlLgorICAgICgoKSAwKQorICAgIDs7IFRoaXMgaXMgdGhlIGxhc3QgY2FzZSBjYWxsZWQu IEl0cyByZXN1bHQgaXMgdGhlIGZpbmFsIG91dHB1dAorICAgIDs7IG9mIHRoZSByZWR1Y3Rp b24uCisgICAgKChyZXN1bHQtc28tZmFyKSByZXN1bHQtc28tZmFyKQorICAgIDs7IFRoaXMg aXMgdGhlIG5vcm1hbCBjYXNlLiBXZSBkbyBzb21ldGhpbmcgdG8gdGhlIGFjY3VtdWxhdG9y CisgICAgOzsgYW5kIHRoZSBjdXJyZW50IGlucHV0LgorICAgICgocmVzdWx0LXNvLWZhciBp bnB1dCkgKCsgcmVzdWx0LXNvLWZhciBpbnB1dCkpKQorCisobGlzdC10cmFuc2R1Y2UgKHRm aWx0ZXIgb2RkPykgcnN1bSAnKDEgMiAzIDQpKQorQHJlc3VsdHt9IDQKK0BlbmQgZXhhbXBs ZQorCitZb3UnbGwgbm90aWNlIHRoYXQgQGNvZGV7cnN1bX0gaXNuJ3QgYWN0dWFsbHkgaW5j bHVkZWQgaW4gU1JGSS0xNzEsCitiZWNhdXNlIEBjb2Rleyt9IGFscmVhZHkgYmVoYXZlcyBl eGFjdGx5IHRoaXMgd2F5LgorCitAc3Vic3ViaGVhZGluZyBIaWdoZXItb3JkZXIgUmVkdWNl cnMKKworT2YgY291cnNlLCB0aGUgdG9wLWxldmVsIEBjb2Rle2RlZmluZX0gY2FuIGFsc28g dGFrZSBhcmd1bWVudHMsIGFuZCB3ZQorY2FuIHVzZSB0aGVzZSB3aXRoaW4gdGhlIEBjb2Rl e2Nhc2UtbGFtYmRhfS4gIEhlcmUncyBob3cgQGNvZGV7cmxhc3R9IGlzCitpbXBsZW1lbnRl ZDoKKworQGV4YW1wbGUKKyhkZWZpbmUgKHJsYXN0IHNlZWQpCisgIChjYXNlLWxhbWJkYQor ICAgICgoKSBzZWVkKQorICAgICgocmVzdWx0LXNvLWZhcikgcmVzdWx0LXNvLWZhcikKKyAg ICAoKF8gaW5wdXQpIGlucHV0KSkpCisKKyhsaXN0LXRyYW5zZHVjZSAodGZpbHRlciBvZGQ/ KSAocmxhc3QgMCkgJygxIDIgMyA0IDUgNikpCitAcmVzdWx0e30gNQorQGVuZCBleGFtcGxl CisKK1RoZSBAY29kZXtzZWVkfSBoZXJlIGFjdHMgYXMgYSBkZWZhdWx0IGZvciB3aGVuIG5v dGhpbmcgd2FzIGxlZnQgaW4gdGhlCit0cmFuc2R1Y3Rpb24uICBZb3UncmUgZnJlZSBvZiBj b3Vyc2UgdG8gcGFzcyBpbiB3aGF0ZXZlciBhcmd1bWVudHMgeW91Cit3aXNoIChpbmNsdWRp bmcgb3RoZXIgZnVuY3Rpb25zKSBhbmQgdXNlIHRoZW0gYXMgeW91IHNlZSBmaXQuCisKK0Bz dWJzdWJoZWFkaW5nIEVhcmx5IFRlcm1pbmF0aW9uCisKK0ltcG9ydGluZyBAY29kZXsoc3Jm aSBzcmZpLTE3MSBtZXRhKX0gZXhwb3NlcyB0aGUgQGNvZGV7cmVkdWNlZH0KK2Z1bmN0aW9u LCB3aGljaCB3ZSBjYW4gdXNlIHRvIHNpZ25hbCB0byB0aGUgb3ZlcmFsbCB0cmFuc2R1Y3Rp b24gcHJvY2VzcwordGhhdCB3ZSdyZSBkb25lLCBhbmQgbm8gZnVydGhlciBpbnB1dCBuZWVk cyB0byBiZSBwdWxsZWQgZnJvbSB0aGUgZGF0YQorc291cmNlLiAgSGVyZSdzIEBjb2Rle3Jm aW5kfSAoYWxyZWFkeSBpbmNsdWRlZCBpbiBHdWlsZSdzIFNSRkktMTcxCitleHRlbnNpb25z KSB3aGljaCBlc2NhcGVzIHRoZSBpdGVyYXRpb24gd2hlbiBzb21lIGNvbmRpdGlvbiBpcyBt ZXQ6CisKK0BleGFtcGxlCisoZGVmaW5lIChyZmluZCBwcmVkPykKKyAgKGNhc2UtbGFtYmRh CisgICAgKCgpICNmKQorICAgICgoYWNjKSBhY2MpCisgICAgKChhY2MgaW5wdXQpIChpZiAo cHJlZD8gaW5wdXQpIChyZWR1Y2VkIGlucHV0KSAjZikpKSkKK0BlbmQgZXhhbXBsZQorCitJ bXBvcnRhbnQgbm90ZTogY2FsbGluZyBAY29kZXtyZWR1Y2VkfSB5b3Vyc2VsZiBsaWtlIHRo aXMgZG9lcyBhY3RpdmF0ZQordGhlIGZpbmFsIHJlc3VsdHMtb25seSBicmFuY2gsIHNvIGFu eSBleHRyYSBlZmZlY3RzIG9yIG1hbmlwdWxhdGlvbnMgeW91CitoYXZlIHRoZXJlIHdpbGwg YWxzbyBvY2N1ci4KKwogQG5vZGUgU1JGSS0xNzEgVHJhbnNkdWNlcnMKIEBzdWJzdWJzZWN0 aW9uIFRyYW5zZHVjZXJzCiBAY2luZGV4IHRyYW5zZHVjZXJzIHRyYW5zZHVjZXJzCi0tIAoy LjM5LjAKCg== --------------GFxtAfiQZy38HmeIINYIBpmd--