From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=FgjTL7iW; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=snS3x0UC; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 7C70740022 for ; Tue, 25 Nov 2025 13:49:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=MWvKDr+FS1Z/jw+523RMqHEFIqjSjmDvHLXFgwfmk8w=; b=FgjTL7iW4tl7nMVgohpe9chfs4RrKgAyhzdugqJJR3xIWyQ1GDLtq4x1 8BEaYsd/8pZqCeu4PrQvRP/cm6sHqxvBReIR/BAJAQ42CMh1a49MB6iCn mOaiZAU5kzrVOxKl/gy+ayuSU5IuQJZk9yUkEVuV9+vZJfjvC+Jis80NN w=; X-CSE-ConnectionGUID: TNUKQ9FlQiuWu1AOOyULuw== X-CSE-MsgGUID: F7YXeVhdSGSk5mv6r34HUw== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.20,225,1758578400"; d="scan'208,217";a="251130898" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 25 Nov 2025 14:49:34 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id B85AEE0AF1; Tue, 25 Nov 2025 14:49:33 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 79A84E0157 for ; Tue, 25 Nov 2025 14:49:31 +0100 (CET) X-CSE-ConnectionGUID: BvrE/t3QQOi+9THtcpBhng== X-CSE-MsgGUID: Yo32O+TwTyO0uQlXrSBYTA== IronPort-SDR: 6925b3e8_49OcZBKEO0EoPOQIlTNX1oo+rtaIBjTTCGOO42IpyP7pr1g kp0Fh+d1W88itk3VjX1MeBwZmVxrU8hoY2Lz1EA== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0FsBAAMsyVphSIeaIFahBZbKBkBaF4zBwhJA4RSgWOBb?= =?us-ascii?q?AiOHYEWkDeKe4FpgREDGBYjFQEDAQ0uARUKAQIEAQEDAQIBggyBPYE3AhaMS?= =?us-ascii?q?wIfBgEENBMBAgQBAQEBAwIDAQEBAQEBAQEBDQEBBQEBAQIBAQIEBgECEAEBA?= =?us-ascii?q?QFASYZPDUaBfxk4Ux5hAwEDBQEGAQEBAQEBAQEBAgEBASIBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgQEBAECLhJcAQgEB?= =?us-ascii?q?hMBATgYIwMUAQYDAgQNATUDARMBEhQGgmgBgiACAk8DBQwGlimbTHp/M4EBg?= =?us-ascii?q?gwBAQaBCD4DAgkCAgMBDgklAdoMgWQJgUqFboJKGwEFJUlrAoRJCYQ0Jw+BV?= =?us-ascii?q?USBFTWBVmcHb4I/CxcBAQEBARdCPA4YAQFNCYMlgmmCERV6FB2GCYFzfYcMB?= =?us-ascii?q?okygURLMywBVRMXCwcFW4EIAyo0LW4yHYEkPhhzgRSDSRATaA8GgRGDT4kaD?= =?us-ascii?q?4pOAwttPTcUG5R3QhkXFSWBMgkBJQ4/FksoBgcDHwEBIjY0DAMZNAQBFwEtC?= =?us-ascii?q?QILIA+QDoJAAwkkAgIqA49Zons0B4QfgV4GDIkIgSaOKwmDe4NXhASBV4s8h?= =?us-ascii?q?wKSUiKYZCKCNocngSYJYIEPa5UkPAQPGYUtgX8jPG8BHQwHMxowQw0VghEBA?= =?us-ascii?q?QExCRYwHA+Nf4FWAQeBJnYoEDF9gQyCDjt9wC5CNQEBAQEENAIHAQoBAQMJh?= =?us-ascii?q?WIBAWmLHw8XBwWBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:l7YlgKHJVGTLoSzmpLqE1ceALOsnbusQ8zAXPiFKOH9om6mj/f xG88506faZslsssRIb+exoWpPgfZq0z/ccirX5Vo3MYOCJggeVBbAnxbSn6TztES/z+4dmpM VdWpk7Lsb/SXxzjcOS2njdLz/M+qjjzJyV X-Talos-CUID: 9a23:fjKRIWG48zlvNPsEqmJN6lQ5Xdx+S0T6zTSBH2+kAn5DSLuaHAo= X-Talos-MUID: =?us-ascii?q?9a23=3AwfYw+Qy4Ifjvugg10uD7WkAcbRuaqJWpUxoq0qk?= =?us-ascii?q?Zh9ijbTFJPweHtx6GfqZyfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.20,225,1758578400"; d="scan'208,217";a="131871469" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDEsEsMudptCuGtxLvLDUQW2CpET7orIP0XqHR?= =?us-ascii?q?q5IV0trVl+j1nhontSg9yG9T8xoe0WmtOpbbmLXJs3gLVHnwRQmtkcaQ?= =?us-ascii?q?7AgFzU2Mjzoi1sJC86EvJVoThHOYzWlSERBuw86o93L/U7F5s4PvmSbC?= =?us-ascii?q?lZ/iwmHHV4SRBIpOjbbReP7w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Nov 2025 14:49:29 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id E74731A385; Tue, 25 Nov 2025 14:49:27 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1764078568; bh=DCDNPLQRXF139PUMIiWY6NWNX2CMMLo5YfAKj44LqAw=; h=From:To:Subject:Date:Message-ID; b=snS3x0UCpSDiH/4lO4OsyWHwMk3vAqxTJf+EfIllekKam9VzRapaoJIakXuZNzYzg q96dwYxNl2fzwfouaVyJW2hQM8dQnuHldbZUO++1L3LvCRUUf7Fh/wa2J2v1QDXX0I o/N1KGxyhChDuStYES79BFZsPklb/7g8hy4mm57w= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 25 Nov 2025 14:49:27 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 25 14:49:28 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.489604, queueID=11F8A1A387 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19404 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTm92ZW1iZXIgMTggdG8gMjUsDQoyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNClRhcGFr OiBFeHBlcmltZW50YWwgV2ViIEZyYW1ld29yayBCYXNlZCBvbiBFSU8NCkZVTiBPQ2FtbCBpcyBs aXZlIG9uIFlvdVR1YmUgYW5kIFR3aXRjaA0KTmF0aXZlIGRlYnVnZ2luZyBvbiBtYWNPUyAoRFdB UkYgc3VwcG9ydCkNClBhY2thZ2UgSHlnaWVuZSBpbiBBbGljZQ0KY3J5cHQgMi4wIC0gdW5peCBj cnlwdCBmdW5jdGlvbg0Kb3BhbSAyLjUuMH5yYzEgYW5kIG9wYW0tcHVibGlzaCAyLjcuMQ0Kb2Nh bWwtcHJvdG9jIDQuMCwgcGJydCA0LjANCkNtZGxpbmVyIDIuMS4wIOKAkyBUaGUgcG93ZXJzaGVs bCBlZGl0aW9uDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KVGFwYWs6IEV4cGVyaW1l bnRhbCBXZWIgRnJhbWV3b3JrIEJhc2VkIG9uIEVJTw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdGFwYWst ZXhwZXJpbWVudGFsLXdlYi1mcmFtZXdvcmstYmFzZWQtb24tZWlvLzE3NTA3LzE+DQoNCg0KU3lh aWZ1bCBCYWhyaSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlbGxvISBJIGFtIGEgbmV3 Y29tZXIgdG8gdGhlIE9DYW1sIGNvbW11bml0eSwgYW5kIHRoaXMgaXMgbXkgZmlyc3QNCiAgcG9z dC4NCg0KICBJIHdvdWxkIGxpa2UgdG8gc2hhcmUgYW4gZXhwZXJpbWVudGFsIHdlYiBmcmFtZXdv cmsgSSBoYXZlIGJlZW4NCiAgd29ya2luZyBvbiwgYmFzZWQgb24gRWlvLiBJIGFtIGEgaGFwcHkg dXNlciBvZiBEcmVhbSBhbmQgT3BpdW0sIGJ1dCBJDQogIGZlbHQgdGhlcmUgd2FzIHN0aWxsIHJv b20gZm9yIGltcHJvdmVtZW50Lg0KDQogIEnigJl2ZSBzaGFyZWQgbXkgbW90aXZhdGlvbiBoZXJl Og0KICA8aHR0cHM6Ly93d3cuc2JhaHJpLmNvbS9wcm9qZWN0cy90YXBhay8+DQoNCiAgSSB3b3Vs ZCBsb3ZlIHRvIGhlYXIgeW91ciBzdWdnZXN0aW9ucyBhbmQgb3BpbmlvbnMgcmVnYXJkaW5nIHRo ZQ0KICBBUEkuIFdoYXQgaW1wb3J0YW50IGZlYXR1cmVzIGRvIHlvdSBmZWVsIGFyZSBtaXNzaW5n IGluIGV4aXN0aW5nDQogIGxpYnJhcmllcz8gUGVyc29uYWxseSwgSSBtaXNzIHRoZSB0eXBlLXNh ZmUgcm91dGluZyB0aGF0IFNlcnZhbnQNCiAgb2ZmZXJzLCBhcyB3ZWxsIGFzIHRoZSBQaG9lbml4 IHJlYWwtdGltZSBBUEkuDQoNCg0KRlVOIE9DYW1sIGlzIGxpdmUgb24gWW91VHViZSBhbmQgVHdp dGNoDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Z1 bi1vY2FtbC1pcy1saXZlLW9uLXlvdXR1YmUtYW5kLXR3aXRjaC8xNzI1NC8zPg0KDQoNCkNvbnRp bnVpbmcgdGhpcyB0aHJlYWQsIFNhYmluZSBTY2htYWx0eiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEFmdGVyIGhpZGluZyB0aGUgb3JpZ2luYWwgbGl2 ZSBzdHJlYW0gcmVjb3JkaW5nLCBhbmQgc3RhcnRpbmcgdG8NCiAgcHVibGlzaCB0aGUgdGFsayBy ZWNvcmRpbmdzIGluZGl2aWR1YWxseSBvbiB0aGUgWW91VHViZSBjaGFubmVsIGF0DQogIDxodHRw czovL3d3dy55b3V0dWJlLmNvbS9ARlVOT0NhbWw+LCB3ZSdyZSBhbG1vc3QgZG9uZSBsaXN0aW5n IGFsbCB0aGUNCiAgdGFsa3MhDQoNCiAgPGh0dHBzOi8veW91dHUuYmUvMEh3ZDdOeFE4X2M/c2k9 UGtySnRKWFBZUzFrU0F5Zz4NCg0KDQpOYXRpdmUgZGVidWdnaW5nIG9uIG1hY09TIChEV0FSRiBz dXBwb3J0KQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9uYXRpdmUtZGVidWdnaW5nLW9uLW1hY29zLWR3YXJmLXN1cHBvcnQvMTc1MDkvMT4N Cg0KDQpKb2VsIFJleW1vbnQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXaXRoIERXQVJGIHY1 IHN1cHBvcnQsIHRoZSBjb21waWxlciBub3cgaW5jbHVkZXMgcHJvcGVyIGRlYnVnIGluZm8g4oCU DQogIGxpbmUgbWFwcGluZ3MsIHN5bWJvbHMsIGFuZCB2YXJpYWJsZSBuYW1lcyDigJQgc28gTExE QiBjYW4gYWN0dWFsbHkNCiAgZm9sbG93IHlvdXIgY29kZS4NCg0KICBBIHNtYWxsIExMREIgUHl0 aG9uIHBsdWctaW4gcmVhZHMgT0NhbWwgdmFsdWVzIGF0IHJ1bnRpbWUgYW5kIHByaW50cw0KICB0 aGVtIGluIGEgcmVhZGFibGUgZm9ybTogbGlzdHMsIHR1cGxlcywgY2xvc3VyZXMsIHN0cmluZ3Ms IGV0Yy4gSXQNCiAgZm9sbG93cyBEV0FSRiBsb2NhdGlvbiBsaXN0cyB0byB0cmFjayB3aGVyZSBl YWNoIHZhcmlhYmxlIGxpdmVzIGFuZA0KICB1c2VzIHRoZSBydW50aW1lIGhlYWRlcnMgdG8gZGVj b2RlIHRoZW0uIFRoZSBgcCcgYW5kIGBvY2FtbF92YXJzJw0KICBjb21tYW5kcyB3b3JrIGxpa2Ug bm9ybWFsIExMREIgY29tbWFuZHMgYnV0IHVuZGVyc3RhbmQgT0NhbWwgdmFsdWVzLg0KDQogIEl0 4oCZcyBub3QgY29tcGxldGUgeWV0IChyZWNvcmRzIGFuZCB2YXJpYW50cyBzdGlsbCBzaG93IGFz IHR1cGxlcyksIGJ1dA0KICBpdCBtYWtlcyBkZWJ1Z2dpbmcgbmF0aXZlIE9DYW1sIGNvZGUgc3Ry YWlnaHRmb3J3YXJkLiBZb3UgY2FuIGZpbmFsbHkNCiAgc2V0IGJyZWFrcG9pbnRzIGJ5IHNvdXJj ZSwgaW5zcGVjdCBsb2NhbHMsIGFuZCB1bmRlcnN0YW5kIHdoYXTigJlzIGluDQogIG1lbW9yeSB3 aXRob3V0IHN3aXRjaGluZyB0byBkaXNhc3NlbWJseS4NCg0KICA8aHR0cHM6Ly9qb2VsLmlkL25h dGl2ZS1iaW5hcnktZGVidWdnaW5nLWZvci1vY2FtbC8+DQoNCg0KUGFja2FnZSBIeWdpZW5lIGlu IEFsaWNlDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L3BhY2thZ2UtaHlnaWVuZS1pbi1hbGljZS8xNzUxMy8xPg0KDQoNClN0ZXZl IFNoZXJyYXR0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgPGh0dHBzOi8vd3d3LmFs aWNlY2FtbC5vcmcvYmxvZy9wYWNrYWdlLWh5Z2llbmUtaW4tYWxpY2UvPg0KDQogIEFsaWNlIGlz IGFuIE9DYW1sIGJ1aWxkIHN5c3RlbSBhbmQgcGFja2FnZSBtYW5hZ2VyIEknbSBkZXZlbG9waW5n IGluDQogIG15IHNwYXJlIHRpbWUuIFRoaXMgcG9zdCBpcyBhYm91dCBBbGljZSdzIHBhY2thZ2lu ZyBwcm90b2NvbCBhbmQgaG93DQogIGl0IGVuZm9yY2VzIGh5Z2llbmUgd2hpbGUgYnVpbGRpbmcg cGFja2FnZXMuDQoNCg0KY3J5cHQgMi4wIC0gdW5peCBjcnlwdCBmdW5jdGlvbg0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tY3J5cHQtMi0wLXVuaXgtY3J5cHQtZnVuY3Rpb24vMTc0ODUv Mj4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhyZWFkLCBNaWtoYWlsIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgTWlub3IgdXBkYXRlOiBjcnlwdCAyLjEuDQoNCiAgV2UgaGF2ZSBhZGRlZCBhIG11 dGV4IGZvciB0aGUgUE9TSVggY3J5cHQgZnVuY3Rpb24gYW5kIGENCiAgcGxhdGZvcm0tZGVwZW5k ZW50IGltcGxlbWVudGF0aW9uIG9mIGNyeXB0LCBpLmUuLCBjcnlwdF9yIGZvciBMaW51eA0KICBh bmQgRnJlZUJTRC4gV2UgaGF2ZSBhbHNvIGFkZGVkIHRoZSBGZmkgbW9kdWxlIGZvciBhY2Nlc3Np bmcgbmF0aXZlDQogIHBsYXRmb3JtIGJpbmRpbmdzLg0KDQoNCm9wYW0gMi41LjB+cmMxIGFuZCBv cGFtLXB1Ymxpc2ggMi43LjENCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLW9wYW0tMi01LTAtcmMxLW9wYW0tcHVibGlzaC0yLTctMS8xNzUxNS8xPg0KDQoN CkthdGUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBIaSBldmVyeW9uZSwNCg0KICBXZSBhcmUgaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZp cnN0IHJlbGVhc2UgY2FuZGlkYXRlIG9mIG9wYW0gYDIuNS4wJywNCiAgd2hpY2ggYm9hc3RzIGEg Z3JhbmQgdG90YWwgb2YgemVybyAoMCkgY2hhbmdlcyBjb21wYXJlZCB0bw0KICBgMi41LjB+YmV0 YTEnIQ0KDQogIFdlIGFsc28gdGFrZSB0aGlzIG9wcG9ydHVuaXR5IHRvIGFubm91bmNlIHRoZSBy ZWxlYXNlIG9mIG9wYW0tcHVibGlzaA0KICBgMi43LjEnLCB3aG9zZSBmdWxsIHJlbGVhc2Ugbm90 ZXMgY2FuIGJlIHNlZW4gW2hlcmVdLg0KDQoNCltoZXJlXSA8aHR0cHM6Ly9naXRodWIuY29tL29j YW1sLW9wYW0vb3BhbS1wdWJsaXNoL3JlbGVhc2VzL3RhZy8yLjcuMT4NCg0KQ2hhbmdlcyBpbiBv cGFtLXB1Ymxpc2ggMi43LjENCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIElu IGAyLjcuMCcsIG9wYW0tcHVibGlzaCBjaGFuZ2VkIHRoZSB3YXkgdXNlcidzIGJyYW5jaGVzIGFy ZSBwdXNoZWQgdG8NCiAgdGhlaXIgR2l0SHViIGZvcmtzIGJlZm9yZSBvcGVuaW5nIGEgUFIsIHN3 aXRjaGluZyBmcm9tIHVzaW5nIFNTSCBrZXlzDQogIHRvIHVzaW5nIHRoZSBHaXRIdWIgQVBJIHRv a2VuIHRoYXQgb3BhbS1wdWJsaXNoIGFscmVhZHkgcmVxdWlyZXMuDQoNCiAgYDIuNy4xJyBmaXhl cyBhIGNvdXBsZSBvZiBidWdzIHJlbGF0ZWQgdG8gdGhhdCB3aGVyZSBvcGFtLXB1Ymxpc2gNCiAg c3RvcHBlZCB3b3JraW5nIGlmIHRoZSBHaXRIdWIgQWN0aW9uIHdvcmtmbG93IGZpbGVzIG9mIHVw c3RyZWFtDQogIG9wYW0tcmVwb3NpdG9yeSBhcmUgY2hhbmdlZCwgb3dpbmcgdG8gdGhlIHdheSBH aXRIdWIgdG9rZW4gcGVybWlzc2lvbnMNCiAgd29yay4gICpUaGFua3MgdG8gW0BmaWxpcGVvbV0g Ym90aCBmb3IgdGhlIG9yaWdpbmFsIGNvbnRyaWJ1dGlvbiBpbg0KICBgMi43LjAnIGFuZCBmb3Ig c3Vic2VxdWVudCB3b3JrIG9uIGl0IGluIGAyLjcuMScqLg0KDQogIFJlYWQgb3VyIFtibG9nIHBv c3RdIGZvciBtb3JlIGRldGFpbHMuDQoNCiAgUGxlYXNlIHJlcG9ydCBhbnkgaXNzdWVzIHRvIFt0 aGUgb3BhbSBidWctdHJhY2tlcl0gb3IgW3RoZQ0KICBvcGFtLXB1Ymxpc2ggYnVnLXRyYWNrZXJd Lg0KDQoNCltAZmlsaXBlb21dIDxodHRwczovL2dpdGh1Yi5jb20vZmlsaXBlb20+DQoNCltibG9n IHBvc3RdIDxodHRwczovL29wYW0ub2NhbWwub3JnL2Jsb2cvb3BhbS0yLTUtMC1yYzEtcHVibGlz aC8+DQoNClt0aGUgb3BhbSBidWctdHJhY2tlcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v cGFtL2lzc3Vlcz4NCg0KW3RoZSBvcGFtLXB1Ymxpc2ggYnVnLXRyYWNrZXJdDQo8aHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29wYW0tcHVibGlzaC9pc3N1ZXM+DQoNCg0KVHJ5IHRoZSBuZXcgb3Bh bSAyLjUuMCByZWxlYXNlIGNhbmRpZGF0ZToNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSB1cGdyYWRlIGlu c3RydWN0aW9ucyBhcmUgdW5jaGFuZ2VkOg0KDQogIEZvciBVbml4IHN5c3RlbXMNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiBiYXNoIC1jICJzaCA8KGN1cmwgLWZzU0wgaHR0cHM6Ly9vcGFtLm9j YW1sLm9yZy9pbnN0YWxsLnNoKSAtLXZlcnNpb24gMi41LjB+cmMxIg0KICDilJTilIDilIDilIDi lIANCiAgb3IgZnJvbSBQb3dlclNoZWxsIGZvciBXaW5kb3dzIHN5c3RlbXMNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiBJbnZva2UtRXhwcmVzc2lvbiAiJiB7ICQoSW52b2tlLVJlc3RNZXRob2Qg aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9pbnN0YWxsLnBzMSkgfSAtVmVyc2lvbiAyLjUuMH5yYzEi DQogIOKUlOKUgOKUgOKUgOKUgA0KICBQbGVhc2UgcmVwb3J0IGFueSBpc3N1ZXMgdG8gdGhlIFti dWctdHJhY2tlcl0uDQoNCiAgSGFwcHkgaGFja2luZywgPD4gPD4gVGhlIG9wYW0gdGVhbSA8PiA8 PiA6Y2FtZWw6DQoNCg0KW2J1Zy10cmFja2VyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29w YW0vaXNzdWVzPg0KDQoNCm9jYW1sLXByb3RvYyA0LjAsIHBicnQgNC4wDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1vY2FtbC1wcm90b2MtNC0wLXBicnQtNC0wLzE3NTI0LzE+DQoNCg0KU2ltb24gQ3J1YW5lcyBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIERlYXIgY2FtbCByaWRlcnMsIEknbSBoYXBweSB0 byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBbb2NhbWwtcHJvdG9jXQ0KICA0LjAsIGFsb25nc2lk ZSBpdHMgcnVudGltZSBsaWJyYXJpZXMgYHBicnQnLCBgcGJydF95b2pzb24nLCBhbmQNCiAgYHBi cnRfc2VydmljZXMnLg0KDQogIE9jYW1sLXByb3RvYyBpcyBhIHB1cmUgT0NhbWwgaW1wbGVtZW50 YXRpb24gb2YgYSBbcHJvdG9idWZdIGNvbXBpbGVyDQogIGFuZCBydW50aW1lLiBbUHJvdG9idWZd IGlzIGEgYmluYXJ5IHNlcmlhbGl6YXRpb24gZm9ybWF0IGFuZCBJREwNCiAgKGludGVyZmFjZSBk ZXNjcmlwdGlvbiBsYW5ndWFnZSkgZmlyc3QgaW50cm9kdWNlZCBieSBHb29nbGUgaW4gdGhlDQog IGVhcmx5IDAwcywgYW5kIHN0aWxsIGluIHBlcnZhc2l2ZSB1c2UgdGhlcmUgYW5kIGVsc2V3aGVy ZS4gSXQgaXMNCiAgZmFzdGVyICh0byBlbmNvZGUvZGVjb2RlKSBhbmQgbW9yZSBjb21wYWN0IHRo YW4gSlNPTiwgYW5kIGlzIGRlc2lnbmVkDQogIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9u IHRoZSB3aXJlLg0KDQogIEFueXdheSwgdGhpcyBuZXcgbWFqb3IgcmVsZWFzZSBpcyAqYnJlYWtp bmcqIGJlY2F1c2UgaXQgZmluYWxseQ0KICBmb2xsb3dzIHRoZSBzdGFuZGFyZCdzIHNlbWFudGlj cyBhYm91dCBbX2ZpZWxkIHByZXNlbmNlX10uIEJ5IGRlZmF1bHQsDQogIG1hbnkgZmllbGRzIGlu IHByb3RvYnVmIGFyZSBzb21ld2hhdCBvcHRpb25hbFteMV0gYW5kIGFyZSBub3QNCiAgc2VyaWFs aXplZCBhdCBhbGwgaWYgbm90IHByZXNlbnQuIE9jYW1sLXByb3RvYyBub3cgdHJhY2tzIHRoaXMg Zm9yDQogIGV2ZXJ5IG5vbi1yZXF1aXJlZCBmaWVsZCwgZXZlbiBzY2FsYXJzLCBtb3ZpbmcgdG93 YXJkcyBiZXR0ZXINCiAgY29tcGxpYW5jZSB3aXRoIHRoZSBzdGFuZGFyZC4gSXQgZG9lcyB0aGF0 IGVpdGhlciB2aWEgYG9wdGlvbicgb3IgdmlhDQogIGEgcHJlc2VuY2UgYml0ZmllbGQuIEJlY2F1 c2Ugb2YgdGhpcywgdGhlIGdlbmVyYXRlZCBjb2RlIGhhcyBjaGFuZ2VkDQogIHNpZ25pZmljYW50 bHkgYW5kIGxvb2tzIG1vcmUgbGlrZSB3aGF0IHRoZSBvZmZpY2lhbCBgcHJvdG9jJyBwcm9kdWNl cy4NCg0KICBJbiBhIG51dHNoZWxsLCBlYWNoIHByb3RvYnVmIG1lc3NhZ2Ugbm93IGJlY29tZXMg YSBwcml2YXRlIHJlY29yZCB0eXBlDQogIHdpdGggbXV0YWJsZSBmaWVsZHMgYW5kIGEgcHJlc2Vu Y2UgYml0ZmllbGQuIEFsbCBtb2RpZmljYXRpb24gYW5kDQogIGNyZWF0aW9uIGZvciBhIHR5cGUg YGZvbycgaXMgZG9uZSB2aWEgYG1ha2VfZm9vJyBhbmQgYGZvb19zZXRfPGZpZWxkPicNCiAgZnVu Y3Rpb25zOyBwcmVzZW5jZSBjYW4gYmUgY2hlY2tlZCB3aXRoIGBmb29faGFzXzxmaWVsZD4nLiBU aGlzIG1lYW5zDQogIHRoZSBydW50aW1lIGtub3dzIHdoaWNoIGZpZWxkcyBoYXZlIGJlZW4gZXhw bGljaXRseSBtb2RpZmllZC4NCg0KICBJIGRvbid0IHRoaW5rIG9jYW1sLXByb3RvYyBpcyAxMDAl IGNvbXBsaWFudCB3aXRoIHRoZSBmaW5lIHByaW50IG9uDQogIGRlZmF1bHQgdmFsdWVzIGluIHBy b3RvMywgZXRjLiBidXQgdGhpcyBpcyBhIGxvdCBjbG9zZXIgdGhhbiBpdCB1c2VkDQogIHRvIGJl LiBUaGFua3MgdG8gdGhlIHdvcmsgb2YgW0BsdXB1c10gdGhlcmUncyBhbHNvIGEgbmV3IG9wdGlv bg0KICB2YWxpZGF0aW9uIGxheWVyLg0KDQoNCltvY2FtbC1wcm90b2NdIDxodHRwczovL2dpdGh1 Yi5jb20vbXJhbnNhbi9vY2FtbC1wcm90b2MvPg0KDQpbcHJvdG9idWZdIDxodHRwczovL3Byb3Rv YnVmLmRldj4NCg0KW1Byb3RvYnVmXSA8aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUHJv dG9jb2xfQnVmZmVycz4NCg0KW19maWVsZCBwcmVzZW5jZV9dDQo8aHR0cHM6Ly9wcm90b2J1Zi5k ZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2ZpZWxkX3ByZXNlbmNlLz4NCg0KW0BsdXB1c10gPGh0dHBz Oi8vZ2l0aHViLmNvbS9MdXB1cz4NCg0KZGV0YWlsZWQgZXhhbXBsZQ0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgTGV0J3MgbG9vayBhdCB0aGlz IHNpbXBsZSBleGFtcGxlOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHN5bnRheCA9ICJwcm90 bzMiOw0KICDilIIgDQogIOKUgiBtZXNzYWdlIFBlcnNvbiB7DQogIOKUgiAgIHN0cmluZyBuYW1l ID0gMTsNCiAg4pSCICAgc2ludDY0IGFnZSA9IDI7DQogIOKUgiB9DQogIOKUgiANCiAg4pSCIG1l c3NhZ2UgU3RvcmUgew0KICDilIIgICBzdHJpbmcgYWRkcmVzcyA9IDE7DQogIOKUgiAgIHJlcGVh dGVkIFBlcnNvbiBlbXBsb3llZXMgPSAyOw0KICDilIIgICByZXBlYXRlZCBQZXJzb24gY2xpZW50 cyA9IDM7DQogIOKUgiB9DQogIOKUgiANCiAg4pSCIG1lc3NhZ2UgQ29tcGFueSB7DQogIOKUgiAg IHN0cmluZyBuYW1lID0gMTsNCiAg4pSCICAgcmVwZWF0ZWQgU3RvcmUgc3RvcmVzID0gMjsNCiAg 4pSCICAgcmVwZWF0ZWQgQ29tcGFueSBzdWJzaWRpYXJpZXMgPSAzOw0KICDilIIgfQ0KICDilJTi lIDilIDilIDilIANCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICgqIGdlbmVyYXRlZCBmcm9t ICJvcmdjaGFydC5wcm90byIsIGRvIG5vdCBlZGl0ICopDQogIOKUgiANCiAg4pSCICgqKiB7MiBU eXBlc30gKikNCiAg4pSCIA0KICDilIIgdHlwZSBwZXJzb24gPSB7DQogIOKUgiAgIG5hbWUgOiBz dHJpbmc7DQogIOKUgiAgIGFnZSA6IGludDY0Ow0KICDilIIgfQ0KICDilIIgDQogIOKUgiB0eXBl IHN0b3JlID0gew0KICDilIIgICBhZGRyZXNzIDogc3RyaW5nOw0KICDilIIgICBlbXBsb3llZXMg OiBwZXJzb24gbGlzdDsNCiAg4pSCICAgY2xpZW50cyA6IHBlcnNvbiBsaXN0Ow0KICDilIIgfQ0K ICDilIIgDQogIOKUgiB0eXBlIGNvbXBhbnkgPSB7DQogIOKUgiAgIG5hbWUgOiBzdHJpbmc7DQog IOKUgiAgIHN0b3JlcyA6IHN0b3JlIGxpc3Q7DQogIOKUgiAgIHN1YnNpZGlhcmllcyA6IGNvbXBh bnkgbGlzdDsNCiAg4pSCIH0NCiAg4pSCIA0KICDilIIgDQogIOKUgiAoKiogezIgQmFzaWMgdmFs dWVzfSAqKQ0KICDilIIgDQogIOKUgiB2YWwgZGVmYXVsdF9wZXJzb24gOiANCiAg4pSCICAgP25h bWU6c3RyaW5nIC0+DQogIOKUgiAgID9hZ2U6aW50NjQgLT4NCiAg4pSCICAgdW5pdCAtPg0KICDi lIIgICBwZXJzb24NCiAg4pSCICgqKiBbZGVmYXVsdF9wZXJzb24gKCldIGlzIHRoZSBkZWZhdWx0 IHZhbHVlIGZvciB0eXBlIFtwZXJzb25dICopDQogIOKUgiANCiAg4pSCIHZhbCBkZWZhdWx0X3N0 b3JlIDogDQogIOKUgiAgID9hZGRyZXNzOnN0cmluZyAtPg0KICDilIIgICA/ZW1wbG95ZWVzOnBl cnNvbiBsaXN0IC0+DQogIOKUgiAgID9jbGllbnRzOnBlcnNvbiBsaXN0IC0+DQogIOKUgiAgIHVu aXQgLT4NCiAg4pSCICAgc3RvcmUNCiAg4pSCICgqKiBbZGVmYXVsdF9zdG9yZSAoKV0gaXMgdGhl IGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgW3N0b3JlXSAqKQ0KICDilIIgDQogIOKUgiB2YWwgZGVm YXVsdF9jb21wYW55IDogDQogIOKUgiAgID9uYW1lOnN0cmluZyAtPg0KICDilIIgICA/c3RvcmVz OnN0b3JlIGxpc3QgLT4NCiAg4pSCICAgP3N1YnNpZGlhcmllczpjb21wYW55IGxpc3QgLT4NCiAg 4pSCICAgdW5pdCAtPg0KICDilIIgICBjb21wYW55DQogIOKUgiAoKiogW2RlZmF1bHRfY29tcGFu eSAoKV0gaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgW2NvbXBhbnldICopDQogIOKUgiAN CiAg4pSCIA0KICDilIIgKCoqIHsyIEZvcm1hdHRlcnN9ICopDQogIOKUgiANCiAg4pSCIHZhbCBw cF9wZXJzb24gOiBGb3JtYXQuZm9ybWF0dGVyIC0+IHBlcnNvbiAtPiB1bml0IA0KICDilIIgKCoq IFtwcF9wZXJzb24gdl0gZm9ybWF0cyB2ICopDQogIOKUgiANCiAg4pSCIHZhbCBwcF9zdG9yZSA6 IEZvcm1hdC5mb3JtYXR0ZXIgLT4gc3RvcmUgLT4gdW5pdCANCiAg4pSCICgqKiBbcHBfc3RvcmUg dl0gZm9ybWF0cyB2ICopDQogIOKUgiANCiAg4pSCIHZhbCBwcF9jb21wYW55IDogRm9ybWF0LmZv cm1hdHRlciAtPiBjb21wYW55IC0+IHVuaXQgDQogIOKUgiAoKiogW3BwX2NvbXBhbnkgdl0gZm9y bWF0cyB2ICopDQogIOKUgiANCiAg4pSCIA0KICDilIIgKCoqIHsyIFByb3RvYnVmIEVuY29kaW5n fSAqKQ0KICDilIIgDQogIOKUgiB2YWwgZW5jb2RlX3BiX3BlcnNvbiA6IHBlcnNvbiAtPiBQYnJ0 LkVuY29kZXIudCAtPiB1bml0DQogIOKUgiAoKiogW2VuY29kZV9wYl9wZXJzb24gdiBlbmNvZGVy XSBlbmNvZGVzIFt2XSB3aXRoIHRoZSBnaXZlbiBbZW5jb2Rlcl0gKikNCiAg4pSCIA0KICDilIIg dmFsIGVuY29kZV9wYl9zdG9yZSA6IHN0b3JlIC0+IFBicnQuRW5jb2Rlci50IC0+IHVuaXQNCiAg 4pSCICgqKiBbZW5jb2RlX3BiX3N0b3JlIHYgZW5jb2Rlcl0gZW5jb2RlcyBbdl0gd2l0aCB0aGUg Z2l2ZW4gW2VuY29kZXJdICopDQogIOKUgiANCiAg4pSCIHZhbCBlbmNvZGVfcGJfY29tcGFueSA6 IGNvbXBhbnkgLT4gUGJydC5FbmNvZGVyLnQgLT4gdW5pdA0KICDilIIgKCoqIFtlbmNvZGVfcGJf Y29tcGFueSB2IGVuY29kZXJdIGVuY29kZXMgW3ZdIHdpdGggdGhlIGdpdmVuIFtlbmNvZGVyXSAq KQ0KICDilIIgDQogIOKUgiANCiAg4pSCICgqKiB7MiBQcm90b2J1ZiBEZWNvZGluZ30gKikNCiAg 4pSCIA0KICDilIIgdmFsIGRlY29kZV9wYl9wZXJzb24gOiBQYnJ0LkRlY29kZXIudCAtPiBwZXJz b24NCiAg4pSCICgqKiBbZGVjb2RlX3BiX3BlcnNvbiBkZWNvZGVyXSBkZWNvZGVzIGEgW3BlcnNv bl0gYmluYXJ5IHZhbHVlIGZyb20gW2RlY29kZXJdICopDQogIOKUgiANCiAg4pSCIHZhbCBkZWNv ZGVfcGJfc3RvcmUgOiBQYnJ0LkRlY29kZXIudCAtPiBzdG9yZQ0KICDilIIgKCoqIFtkZWNvZGVf cGJfc3RvcmUgZGVjb2Rlcl0gZGVjb2RlcyBhIFtzdG9yZV0gYmluYXJ5IHZhbHVlIGZyb20gW2Rl Y29kZXJdICopDQogIOKUgiANCiAg4pSCIHZhbCBkZWNvZGVfcGJfY29tcGFueSA6IFBicnQuRGVj b2Rlci50IC0+IGNvbXBhbnkNCiAg4pSCICgqKiBbZGVjb2RlX3BiX2NvbXBhbnkgZGVjb2Rlcl0g ZGVjb2RlcyBhIFtjb21wYW55XSBiaW5hcnkgdmFsdWUgZnJvbSBbZGVjb2Rlcl0gKikNCiAg4pSC IGBgYA0KICDilIIgDQogIOKUgiBuZXcgY29kZToNCiAg4pSCIA0KICDilIIgYGBgb2NhbWwNCiAg 4pSCIA0KICDilIIgKCoqIENvZGUgZm9yIG9yZ2NoYXJ0LnByb3RvICopDQogIOKUgiANCiAg4pSC ICgqIGdlbmVyYXRlZCBmcm9tICJvcmdjaGFydC5wcm90byIsIGRvIG5vdCBlZGl0ICopDQogIOKU giANCiAg4pSCIA0KICDilIIgDQogIOKUgiAoKiogezIgVHlwZXN9ICopDQogIOKUgiANCiAg4pSC IHR5cGUgcGVyc29uID0gcHJpdmF0ZSB7DQogIOKUgiAgIG11dGFibGUgX3ByZXNlbmNlOiBQYnJ0 LkJpdGZpZWxkLnQ7ICgqKiBwcmVzZW5jZSBmb3IgMiBmaWVsZHMgKikNCiAg4pSCICAgbXV0YWJs ZSBuYW1lIDogc3RyaW5nOw0KICDilIIgICBtdXRhYmxlIGFnZSA6IGludDY0Ow0KICDilIIgfQ0K ICDilIIgDQogIOKUgiB0eXBlIHN0b3JlID0gcHJpdmF0ZSB7DQogIOKUgiAgIG11dGFibGUgX3By ZXNlbmNlOiBQYnJ0LkJpdGZpZWxkLnQ7ICgqKiBwcmVzZW5jZSBmb3IgMSBmaWVsZHMgKikNCiAg 4pSCICAgbXV0YWJsZSBhZGRyZXNzIDogc3RyaW5nOw0KICDilIIgICBtdXRhYmxlIGVtcGxveWVl cyA6IHBlcnNvbiBsaXN0Ow0KICDilIIgICBtdXRhYmxlIGNsaWVudHMgOiBwZXJzb24gbGlzdDsN CiAg4pSCIH0NCiAg4pSCIA0KICDilIIgdHlwZSBjb21wYW55ID0gcHJpdmF0ZSB7DQogIOKUgiAg IG11dGFibGUgX3ByZXNlbmNlOiBQYnJ0LkJpdGZpZWxkLnQ7ICgqKiBwcmVzZW5jZSBmb3IgMSBm aWVsZHMgKikNCiAg4pSCICAgbXV0YWJsZSBuYW1lIDogc3RyaW5nOw0KICDilIIgICBtdXRhYmxl IHN0b3JlcyA6IHN0b3JlIGxpc3Q7DQogIOKUgiAgIG11dGFibGUgc3Vic2lkaWFyaWVzIDogY29t cGFueSBsaXN0Ow0KICDilIIgfQ0KICDilIIgDQogIOKUgiANCiAg4pSCICgqKiB7MiBCYXNpYyB2 YWx1ZXN9ICopDQogIOKUgiANCiAg4pSCIHZhbCBkZWZhdWx0X3BlcnNvbiA6IHVuaXQgLT4gcGVy c29uIA0KICDilIIgKCoqIFtkZWZhdWx0X3BlcnNvbiAoKV0gaXMgYSBuZXcgZW1wdHkgdmFsdWUg Zm9yIHR5cGUgW3BlcnNvbl0gKikNCiAg4pSCIA0KICDilIIgdmFsIGRlZmF1bHRfc3RvcmUgOiB1 bml0IC0+IHN0b3JlIA0KICDilIIgKCoqIFtkZWZhdWx0X3N0b3JlICgpXSBpcyBhIG5ldyBlbXB0 eSB2YWx1ZSBmb3IgdHlwZSBbc3RvcmVdICopDQogIOKUgiANCiAg4pSCIHZhbCBkZWZhdWx0X2Nv bXBhbnkgOiB1bml0IC0+IGNvbXBhbnkgDQogIOKUgiAoKiogW2RlZmF1bHRfY29tcGFueSAoKV0g aXMgYSBuZXcgZW1wdHkgdmFsdWUgZm9yIHR5cGUgW2NvbXBhbnldICopDQogIOKUgiANCiAg4pSC IA0KICDilIIgKCoqIHsyIE1ha2UgZnVuY3Rpb25zfSAqKQ0KICDilIIgDQogIOKUgiB2YWwgbWFr ZV9wZXJzb24gOiANCiAg4pSCICAgP25hbWU6c3RyaW5nIC0+DQogIOKUgiAgID9hZ2U6aW50NjQg LT4NCiAg4pSCICAgdW5pdCAtPg0KICDilIIgICBwZXJzb24NCiAg4pSCICgqKiBbbWFrZV9wZXJz b24g4oCmICgpXSBpcyBhIGJ1aWxkZXIgZm9yIHR5cGUgW3BlcnNvbl0gKikNCiAg4pSCIA0KICDi lIIgdmFsIGNvcHlfcGVyc29uIDogcGVyc29uIC0+IHBlcnNvbg0KICDilIIgDQogIOKUgiB2YWwg cGVyc29uX2hhc19uYW1lIDogcGVyc29uIC0+IGJvb2wNCiAg4pSCICAgKCoqIHByZXNlbmNlIG9m IGZpZWxkICJuYW1lIiBpbiBbcGVyc29uXSAqKQ0KICDilIIgDQogIOKUgiB2YWwgcGVyc29uX3Nl dF9uYW1lIDogcGVyc29uIC0+IHN0cmluZyAtPiB1bml0DQogIOKUgiAgICgqKiBzZXQgZmllbGQg bmFtZSBpbiBwZXJzb24gKikNCiAg4pSCIA0KICDilIIgdmFsIHBlcnNvbl9oYXNfYWdlIDogcGVy c29uIC0+IGJvb2wNCiAg4pSCICAgKCoqIHByZXNlbmNlIG9mIGZpZWxkICJhZ2UiIGluIFtwZXJz b25dICopDQogIOKUgiANCiAg4pSCIHZhbCBwZXJzb25fc2V0X2FnZSA6IHBlcnNvbiAtPiBpbnQ2 NCAtPiB1bml0DQogIOKUgiAgICgqKiBzZXQgZmllbGQgYWdlIGluIHBlcnNvbiAqKQ0KICDilIIg DQogIOKUgiB2YWwgbWFrZV9zdG9yZSA6IA0KICDilIIgICA/YWRkcmVzczpzdHJpbmcgLT4NCiAg 4pSCICAgP2VtcGxveWVlczpwZXJzb24gbGlzdCAtPg0KICDilIIgICA/Y2xpZW50czpwZXJzb24g bGlzdCAtPg0KICDilIIgICB1bml0IC0+DQogIOKUgiAgIHN0b3JlDQogIOKUgiAoKiogW21ha2Vf c3RvcmUg4oCmICgpXSBpcyBhIGJ1aWxkZXIgZm9yIHR5cGUgW3N0b3JlXSAqKQ0KICDilIIgDQog IOKUgiB2YWwgY29weV9zdG9yZSA6IHN0b3JlIC0+IHN0b3JlDQogIOKUgiANCiAg4pSCIHZhbCBz dG9yZV9oYXNfYWRkcmVzcyA6IHN0b3JlIC0+IGJvb2wNCiAg4pSCICAgKCoqIHByZXNlbmNlIG9m IGZpZWxkICJhZGRyZXNzIiBpbiBbc3RvcmVdICopDQogIOKUgiANCiAg4pSCIHZhbCBzdG9yZV9z ZXRfYWRkcmVzcyA6IHN0b3JlIC0+IHN0cmluZyAtPiB1bml0DQogIOKUgiAgICgqKiBzZXQgZmll bGQgYWRkcmVzcyBpbiBzdG9yZSAqKQ0KICDilIIgDQogIOKUgiB2YWwgc3RvcmVfc2V0X2VtcGxv eWVlcyA6IHN0b3JlIC0+IHBlcnNvbiBsaXN0IC0+IHVuaXQNCiAg4pSCICAgKCoqIHNldCBmaWVs ZCBlbXBsb3llZXMgaW4gc3RvcmUgKikNCiAg4pSCIA0KICDilIIgdmFsIHN0b3JlX3NldF9jbGll bnRzIDogc3RvcmUgLT4gcGVyc29uIGxpc3QgLT4gdW5pdA0KICDilIIgICAoKiogc2V0IGZpZWxk IGNsaWVudHMgaW4gc3RvcmUgKikNCiAg4pSCIA0KICDilIIgdmFsIG1ha2VfY29tcGFueSA6IA0K ICDilIIgICA/bmFtZTpzdHJpbmcgLT4NCiAg4pSCICAgP3N0b3JlczpzdG9yZSBsaXN0IC0+DQog IOKUgiAgID9zdWJzaWRpYXJpZXM6Y29tcGFueSBsaXN0IC0+DQogIOKUgiAgIHVuaXQgLT4NCiAg 4pSCICAgY29tcGFueQ0KICDilIIgKCoqIFttYWtlX2NvbXBhbnkg4oCmICgpXSBpcyBhIGJ1aWxk ZXIgZm9yIHR5cGUgW2NvbXBhbnldICopDQogIOKUgiANCiAg4pSCIHZhbCBjb3B5X2NvbXBhbnkg OiBjb21wYW55IC0+IGNvbXBhbnkNCiAg4pSCIA0KICDilIIgdmFsIGNvbXBhbnlfaGFzX25hbWUg OiBjb21wYW55IC0+IGJvb2wNCiAg4pSCICAgKCoqIHByZXNlbmNlIG9mIGZpZWxkICJuYW1lIiBp biBbY29tcGFueV0gKikNCiAg4pSCIA0KICDilIIgdmFsIGNvbXBhbnlfc2V0X25hbWUgOiBjb21w YW55IC0+IHN0cmluZyAtPiB1bml0DQogIOKUgiAgICgqKiBzZXQgZmllbGQgbmFtZSBpbiBjb21w YW55ICopDQogIOKUgiANCiAg4pSCIHZhbCBjb21wYW55X3NldF9zdG9yZXMgOiBjb21wYW55IC0+ IHN0b3JlIGxpc3QgLT4gdW5pdA0KICDilIIgICAoKiogc2V0IGZpZWxkIHN0b3JlcyBpbiBjb21w YW55ICopDQogIOKUgiANCiAg4pSCIHZhbCBjb21wYW55X3NldF9zdWJzaWRpYXJpZXMgOiBjb21w YW55IC0+IGNvbXBhbnkgbGlzdCAtPiB1bml0DQogIOKUgiAgICgqKiBzZXQgZmllbGQgc3Vic2lk aWFyaWVzIGluIGNvbXBhbnkgKikNCiAg4pSCIA0KICDilIIgDQogIOKUgiAoKiogezIgRm9ybWF0 dGVyc30gKikNCiAg4pSCIA0KICDilIIgdmFsIHBwX3BlcnNvbiA6IEZvcm1hdC5mb3JtYXR0ZXIg LT4gcGVyc29uIC0+IHVuaXQgDQogIOKUgiAoKiogW3BwX3BlcnNvbiB2XSBmb3JtYXRzIHYgKikN CiAg4pSCIA0KICDilIIgdmFsIHBwX3N0b3JlIDogRm9ybWF0LmZvcm1hdHRlciAtPiBzdG9yZSAt PiB1bml0IA0KICDilIIgKCoqIFtwcF9zdG9yZSB2XSBmb3JtYXRzIHYgKikNCiAg4pSCIA0KICDi lIIgdmFsIHBwX2NvbXBhbnkgOiBGb3JtYXQuZm9ybWF0dGVyIC0+IGNvbXBhbnkgLT4gdW5pdCAN CiAg4pSCICgqKiBbcHBfY29tcGFueSB2XSBmb3JtYXRzIHYgKikNCiAg4pSCIA0KICDilIIgDQog IOKUgiAoKiogezIgUHJvdG9idWYgRW5jb2Rpbmd9ICopDQogIOKUgiANCiAg4pSCIHZhbCBlbmNv ZGVfcGJfcGVyc29uIDogcGVyc29uIC0+IFBicnQuRW5jb2Rlci50IC0+IHVuaXQNCiAg4pSCICgq KiBbZW5jb2RlX3BiX3BlcnNvbiB2IGVuY29kZXJdIGVuY29kZXMgW3ZdIHdpdGggdGhlIGdpdmVu IFtlbmNvZGVyXSAqKQ0KICDilIIgDQogIOKUgiB2YWwgZW5jb2RlX3BiX3N0b3JlIDogc3RvcmUg LT4gUGJydC5FbmNvZGVyLnQgLT4gdW5pdA0KICDilIIgKCoqIFtlbmNvZGVfcGJfc3RvcmUgdiBl bmNvZGVyXSBlbmNvZGVzIFt2XSB3aXRoIHRoZSBnaXZlbiBbZW5jb2Rlcl0gKikNCiAg4pSCIA0K ICDilIIgdmFsIGVuY29kZV9wYl9jb21wYW55IDogY29tcGFueSAtPiBQYnJ0LkVuY29kZXIudCAt PiB1bml0DQogIOKUgiAoKiogW2VuY29kZV9wYl9jb21wYW55IHYgZW5jb2Rlcl0gZW5jb2RlcyBb dl0gd2l0aCB0aGUgZ2l2ZW4gW2VuY29kZXJdICopDQogIOKUgiANCiAg4pSCIA0KICDilIIgKCoq IHsyIFByb3RvYnVmIERlY29kaW5nfSAqKQ0KICDilIIgDQogIOKUgiB2YWwgZGVjb2RlX3BiX3Bl cnNvbiA6IFBicnQuRGVjb2Rlci50IC0+IHBlcnNvbg0KICDilIIgKCoqIFtkZWNvZGVfcGJfcGVy c29uIGRlY29kZXJdIGRlY29kZXMgYSBbcGVyc29uXSBiaW5hcnkgdmFsdWUgZnJvbSBbZGVjb2Rl cl0gKikNCiAg4pSCIA0KICDilIIgdmFsIGRlY29kZV9wYl9zdG9yZSA6IFBicnQuRGVjb2Rlci50 IC0+IHN0b3JlDQogIOKUgiAoKiogW2RlY29kZV9wYl9zdG9yZSBkZWNvZGVyXSBkZWNvZGVzIGEg W3N0b3JlXSBiaW5hcnkgdmFsdWUgZnJvbSBbZGVjb2Rlcl0gKikNCiAg4pSCIA0KICDilIIgdmFs IGRlY29kZV9wYl9jb21wYW55IDogUGJydC5EZWNvZGVyLnQgLT4gY29tcGFueQ0KICDilIIgKCoq IFtkZWNvZGVfcGJfY29tcGFueSBkZWNvZGVyXSBkZWNvZGVzIGEgW2NvbXBhbnldIGJpbmFyeSB2 YWx1ZSBmcm9tIFtkZWNvZGVyXSAqKQ0KICDilJTilIDilIDilIDilIANCg0KICBbXjFdOiB0aGUg cHJlY2lzZSBzZW1hbnRpY3Mgb2YgcHJlc2VuY2UgYXJlLCBpbWhvLCBxdWl0ZSBtZXNzeS4NCg0K DQpDbWRsaW5lciAyLjEuMCDigJMgVGhlIHBvd2Vyc2hlbGwgZWRpdGlvbg0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY21kbGluZXItMi0xLTAt dGhlLXBvd2Vyc2hlbGwtZWRpdGlvbi8xNzUyNy8xPg0KDQoNCkJyaWFuIFdhcmQgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBIZWxsbywNCg0KICBJdCdzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIHRoZSB2 ZXJzaW9uIDIuMS4wIG9mIGNtZGxpbmVyDQoNCiAgICAgICAgQ21kbGluZXIgaXMgYW4gSVNDLWxp Y2Vuc2VkIGxpYnJhcnkgdGhhdCBhbGxvd3MgdGhlDQogICAgICAgIGRlY2xhcmF0aXZlIGFuZCBj b21wb3NpdGlvbmFsIGRlZmluaXRpb24gb2YgY29tbWFuZCBsaW5lcw0KICAgICAgICB3aXRoIGV4 Y2VsbGVudCBzdXBwb3J0IGZvciBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIHVzZXINCiAgICAgICAg Y29udmVudGlvbnMgYW5kIHN0YW5kYXJkcy4NCg0KICBUaGlzIHJlbGVhc2VzIGNvbnNvbGlkYXRl cyBhZGRpdGlvbmFsIHdvcmsgb24gY29tbWFuZCBsaW5lDQogIGNvbXBsZXRpb24uIEkgYWRkZWQ6 DQoNCiAg4oCiIFN1cHBvcnQgZm9yIHBvd2Vyc2hlbGwgYXV0by1jb21wbGV0aW9uIChbZGV0YWls c10pLg0KICDigKIgU2lnbmlmaWNhbnQgaW1wcm92ZW1lbnRzIHRvIHRoZSBgYmFzaCcgY29tcGxl dGlvbi4NCiAg4oCiIFVwZGF0ZWQgW2BkdW5lJyBpbnN0YWxsIGluc3RydWN0aW9uc10gaW4gdGhl IGNvb2tib29rLg0KDQogIEknZCBsaWtlIHRvIHRoYW5rIEBkYnVlbnpsaSBmb3IgaGlzIGdyYWNp b3VzIGZlZWRiYWNrIG9uIHRoZXNlDQogIGNoYW5nZXMsIGFuZCBpbXBvcnRhbnRseSBmb3IgdGVs bGluZyBtZSDigJxub+KAnSB0byBzZXZlcmFsIG90aGVycw0KICBiZWZvcmVoYW5kIDopDQoNCiAg Rm9yIGFsbCB0aGUgb3RoZXIgZGV0YWlscyBzZWUgdGhlIFtyZWxlYXNlIG5vdGVzXS4NCg0KICDi gKIgSG9tZXBhZ2U6IDxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9jbWRsaW5lcj4NCiAg 4oCiIERvY3M6IDxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9kb2M+IG9yIGBvZGlnIGRv YyBjbWRsaW5lcicNCiAg4oCiIEluc3RhbGw6IGBvcGFtIGluc3RhbGwgY21kbGluZXInIChvbmNl IFt0aGUgUFJdIGlzIG1lcmdlZCwgbWF5IHRha2UNCiAgICBhIGZldyBkYXlzKQ0KDQoNCltkZXRh aWxzXQ0KPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2NtZGxpbmVyL2RvYy9jbGkuaHRt bCN1c2VyX3B3c2g+DQoNCltgZHVuZScgaW5zdGFsbCBpbnN0cnVjdGlvbnNdDQo8aHR0cHM6Ly9l cnJhdGlxdWUuY2gvc29mdHdhcmUvY21kbGluZXIvZG9jL2Nvb2tib29rLmh0bWwjdG9wX3Rvb2xf c3VwcG9ydF93aXRoX2R1bmVfaW5zdGFsbD4NCg0KW3JlbGVhc2Ugbm90ZXNdDQo8aHR0cHM6Ly9n aXRodWIuY29tL2RidWVuemxpL2NtZGxpbmVyL2Jsb2IvbWFzdGVyL0NIQU5HRVMubWQ+DQoNClt0 aGUgUFJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L3B1bGwvMjg5 NjI+DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBh dCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW1JlYWRpbmcgdGhlIEdhcyBNZXRl cl0NCiAg4oCiIFtFbmFibGluZyBTU0ggaW4gQXp1cmUgQXBwIFNlcnZpY2UgZm9yIE9DYW1sIENv bnRhaW5lcnM6IEENCiAgICBQcm9kdWN0aW9uIEpvdXJuZXldDQogIOKAoiBbQSBWaXNpb24gZm9y IE9DYW1sIGluIHRoZSBBSSBFcmEgLSBUaGliYXV0IE1hdHRpbyAtIEZVTiBPQ2FtbCAyMDI1XQ0K ICDigKIgW09DYW1sIGF0IExleGlGaSAtIE5pY29sw6FzIE9qZWRhIELDpHIgLSBGVU4gT0NhbWwg MjAyNV0NCiAg4oCiIFtUZXN0aW5nIGEgcHJpb3JpdHkgcXVldWUgd2l0aCBNb25vbGl0aF0NCiAg 4oCiIFtMaW51eCBtb2RlIHNldHRpbmcsIGZyb20gdGhlIGNvbWZvcnQgb2YgT0NhbWxdDQogIOKA oiBbT0NhbWwgb24gYSBSYXNwYmVycnkgUGldDQogIOKAoiBbSSBDYW4gU2VlIFRoZSBQaXhlbHM6 IERlc2lnbmluZyBDcm9zcy1TdGl0Y2ggUGF0dGVybnMgaW4gT0NhbWwgLQ0KICAgIE1pbmR5IFBy ZXN0b24gLSBGVU4gT0NhbWwgMjAyNV0NCiAg4oCiIFtGcmFtZXdvcmtzOiBObywgTGlicmFyaWVz OiBZZXMuIERldmVsb3BpbmcgYSBwcm9kdWN0IGluIE9DYW1sIGZyb20NCiAgICBTY3JhdGNoIC0g RlVOIE9DYW1sIDIwMjVdDQogIOKAoiBbUHVyZWx5IGZ1bmN0aW9uYWwgZ1JQQyBhbmQgSFRUUC8y IHdpdGggT0NhbWwgLSBBZGFtIENob2xld2luzIFza2kgLQ0KICAgIEZVTiBPQ2FtbCAyMDI1XQ0K ICDigKIgW0Fubm91bmNpbmcgVW5pa3JhZnQgU3VwcG9ydCBmb3IgTWlyYWdlT1MgVW5pa2VybmVs c10NCiAg4oCiIFtBbmFseXppbmcgUHJvZ3JhbXMgd2l0aCBTTVQgU29sdmVycyAtIFRpa2hvbiBK ZWx2aXMgLSBGVU4gT0NhbWwNCiAgICAyMDI1XQ0KICDigKIgW1NsaXBzaG93OiBBIEZ1bGwtRmVh dHVyZWQgUHJlc2VudGF0aW9uIFRvb2wgaW4gT0NhbWwgLSBQYXVsLUVsbGlvdA0KICAgIEFuZ2zD qHMgZCdBdXJpYWMgLSBGVU4gT0NhbWwgMjAyNV0NCiAg4oCiIFtPbiB0aGUgcGF0aCB0byB0aGUg VUsvSW5kaWEgQUkgU3VtbWl0IHdpdGggT3BlblVLIGFuZCB0aGUgQVRJXQ0KICDigKIgWzB4Q2Ft bCBGcm9tIGEgU3lzdGVtIEVuZ2luZWVyJ3MgUG9pbnQgb2YgVmlldyAtIERtaXRyaXkgS292YWxl bmtvIC0NCiAgICBGVU4gT0NhbWwgMjAyNV0NCiAg4oCiIFtQZXJmb3JtYW5jZSBQaXRmYWxsczog VGFsZXMgRnJvbSBhIFB5dGhvbi9PQ2FtbCBDb2RlYmFzZSAtIEVtbWEgSmluDQogICAgLSBGVU4g T0NhbWwgMjAyNV0NCiAg4oCiIFtHZW5lcmF0aW5nIFN0YXRpYyBXZWJzaXRlcyB0aGUgRnVuY3Rp b25hbCBQcm9ncmFtbWluZyBXYXkgLSBYYXZpZXINCiAgICBWYW4gZGUgV29lc3R5bmUgLSBGVU4g T0NhbWwgMjAyNV0NCiAg4oCiIFtGcm9tIE9DYW1sIDQgdG8gNSBhbmQgZnJvbSBQYXJtYXAgdG8g RWZmZWN0czogQSBsZWdhY3kgY29kZQ0KICAgIHRyYW5zaXRpb24gc3RvcnkgLSBGVU4gT0NhbWwg MjAyNV0NCiAg4oCiIFtDb25leCwgc2VjdXJpbmcgdGhlIG9wYW0tcmVwb3NpdG9yeSwgaXMgbm93 IGluIHByb2R1Y3Rpb25dDQogIOKAoiBbT0NhbWwgUm91bmR1cDogT2N0b2JlciAyMDI1XQ0KDQoN Clt0aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0KW1JlYWRp bmcgdGhlIEdhcyBNZXRlcl0gPGh0dHBzOi8vd3d3LnR1bmJ1cnkub3JnLzIwMjUvMTEvMjMvZ2Fz LW1ldGVyLz4NCg0KW0VuYWJsaW5nIFNTSCBpbiBBenVyZSBBcHAgU2VydmljZSBmb3IgT0NhbWwg Q29udGFpbmVyczogQSBQcm9kdWN0aW9uDQpKb3VybmV5XQ0KPGh0dHBzOi8vZmVhcmZ1bC1vZGRz LnJvY2tzL2Jsb2cvYXp1cmUtc3NoLW9jYW1sLWNvbnRhaW5lcnMtcHJvZHVjdGlvbj4NCg0KW0Eg VmlzaW9uIGZvciBPQ2FtbCBpbiB0aGUgQUkgRXJhIC0gVGhpYmF1dCBNYXR0aW8gLSBGVU4gT0Nh bWwgMjAyNV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC9CQXZYcWQwUWVWTT92ZXJz aW9uPTM+DQoNCltPQ2FtbCBhdCBMZXhpRmkgLSBOaWNvbMOhcyBPamVkYSBCw6RyIC0gRlVOIE9D YW1sIDIwMjVdDQo8aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2gvX3V3dnJhMU5GSmc/dmVy c2lvbj0zPg0KDQpbVGVzdGluZyBhIHByaW9yaXR5IHF1ZXVlIHdpdGggTW9ub2xpdGhdDQo8aHR0 cHM6Ly9jYW1iaXVtLmlucmlhLmZyL2Jsb2cvdGVzdGluZy1hLXByaW9yaXR5LXF1ZXVlLXdpdGgt TW9ub2xpdGg+DQoNCltMaW51eCBtb2RlIHNldHRpbmcsIGZyb20gdGhlIGNvbWZvcnQgb2YgT0Nh bWxdDQo8aHR0cHM6Ly9yb3NjaWR1cy5jb20vYmxvZy9ibG9nLzIwMjUvMTEvMTYvbGliZHJtLW9j YW1sLz4NCg0KW09DYW1sIG9uIGEgUmFzcGJlcnJ5IFBpXQ0KPGh0dHBzOi8vd3d3LnR1bmJ1cnku b3JnLzIwMjUvMTEvMTUvb2NhbWwtcmFzcGJlcnJ5LXBpLz4NCg0KW0kgQ2FuIFNlZSBUaGUgUGl4 ZWxzOiBEZXNpZ25pbmcgQ3Jvc3MtU3RpdGNoIFBhdHRlcm5zIGluIE9DYW1sIC0gTWluZHkNClBy ZXN0b24gLSBGVU4gT0NhbWwgMjAyNV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC9R Mi1xSXJZelNYdz92ZXJzaW9uPTM+DQoNCltGcmFtZXdvcmtzOiBObywgTGlicmFyaWVzOiBZZXMu IERldmVsb3BpbmcgYSBwcm9kdWN0IGluIE9DYW1sIGZyb20NClNjcmF0Y2ggLSBGVU4gT0NhbWwg MjAyNV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC8wSHdkN054UThfYz92ZXJzaW9u PTM+DQoNCltQdXJlbHkgZnVuY3Rpb25hbCBnUlBDIGFuZCBIVFRQLzIgd2l0aCBPQ2FtbCAtIEFk YW0gQ2hvbGV3aW7MgXNraSAtIEZVTg0KT0NhbWwgMjAyNV0gPGh0dHBzOi8vd3d3LnlvdXR1YmUu Y29tL3dhdGNoL2V4UjVlV1NRXzhvP3ZlcnNpb249Mz4NCg0KW0Fubm91bmNpbmcgVW5pa3JhZnQg U3VwcG9ydCBmb3IgTWlyYWdlT1MgVW5pa2VybmVsc10NCjxodHRwczovL3RhcmlkZXMuY29tL2Js b2cvMjAyNS0xMS0xMy1hbm5vdW5jaW5nLXVuaWtyYWZ0LXN1cHBvcnQtZm9yLW1pcmFnZW9zLXVu aWtlcm5lbHM+DQoNCltBbmFseXppbmcgUHJvZ3JhbXMgd2l0aCBTTVQgU29sdmVycyAtIFRpa2hv biBKZWx2aXMgLSBGVU4gT0NhbWwgMjAyNV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRj aC9CTDhibXRCZmQ3RT92ZXJzaW9uPTM+DQoNCltTbGlwc2hvdzogQSBGdWxsLUZlYXR1cmVkIFBy ZXNlbnRhdGlvbiBUb29sIGluIE9DYW1sIC0gUGF1bC1FbGxpb3QNCkFuZ2zDqHMgZCdBdXJpYWMg LSBGVU4gT0NhbWwgMjAyNV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC81SE1waUdL SHU5QT92ZXJzaW9uPTM+DQoNCltPbiB0aGUgcGF0aCB0byB0aGUgVUsvSW5kaWEgQUkgU3VtbWl0 IHdpdGggT3BlblVLIGFuZCB0aGUgQVRJXQ0KPGh0dHBzOi8vYW5pbC5yZWNvaWwub3JnL25vdGVz L3BhdGgtdG8tdWstaW5kaWEtYWktc3VtbWl0Pg0KDQpbMHhDYW1sIEZyb20gYSBTeXN0ZW0gRW5n aW5lZXIncyBQb2ludCBvZiBWaWV3IC0gRG1pdHJpeSBLb3ZhbGVua28gLSBGVU4NCk9DYW1sIDIw MjVdIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC9pUWM1ZkhXNVNaQT92ZXJzaW9uPTM+ DQoNCltQZXJmb3JtYW5jZSBQaXRmYWxsczogVGFsZXMgRnJvbSBhIFB5dGhvbi9PQ2FtbCBDb2Rl YmFzZSAtIEVtbWEgSmluIC0NCkZVTiBPQ2FtbCAyMDI1XSA8aHR0cHM6Ly93d3cueW91dHViZS5j b20vd2F0Y2gvVWZycnlxbHRaVVE/dmVyc2lvbj0zPg0KDQpbR2VuZXJhdGluZyBTdGF0aWMgV2Vi c2l0ZXMgdGhlIEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcgV2F5IC0gWGF2aWVyIFZhbg0KZGUgV29l c3R5bmUgLSBGVU4gT0NhbWwgMjAyNV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC9y SEdNRDQ5ZWJfaz92ZXJzaW9uPTM+DQoNCltGcm9tIE9DYW1sIDQgdG8gNSBhbmQgZnJvbSBQYXJt YXAgdG8gRWZmZWN0czogQSBsZWdhY3kgY29kZSB0cmFuc2l0aW9uDQpzdG9yeSAtIEZVTiBPQ2Ft bCAyMDI1XQ0KPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoL3pmR2xRWjJwa3NzP3ZlcnNp b249Mz4NCg0KW0NvbmV4LCBzZWN1cmluZyB0aGUgb3BhbS1yZXBvc2l0b3J5LCBpcyBub3cgaW4g cHJvZHVjdGlvbl0NCjxodHRwczovL2hhbm5lcy5yb2J1ci5jb29wL1Bvc3RzL0NvbmV4UnVubmlu Zz4NCg0KW09DYW1sIFJvdW5kdXA6IE9jdG9iZXIgMjAyNV0NCjxodHRwczovL3BhdHJpY2suc2ly cmVmLm9yZy9vY2FtbC1yb3VuZHVwLW9jdG9iZXItMjAyNS8+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2Fu IFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRh a2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJj aGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5 IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxh biBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRA cG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxh bi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5 bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of November 18 to 25, 20= 25.

Tapak: Experimental Web Framework Based on EIO

Syaiful Bahri announced

Hello! I am a newcomer to the OCaml community, and this is my first post.

I would like to share an experimental web framework I have been working on,= based on Eio. I am a happy user of Dream and Opium, but I felt there was s= till room for improvement.

I=E2=80=99ve shared my motivation here: https://www.sbahri.com/projects/tapak/

I would love to hear your suggestions and opinions regarding the API. What = important features do you feel are missing in existing libraries? Personall= y, I miss the type-safe routing that Servant offers, as well as the Phoenix= real-time API.

FUN OCaml is live on YouTube and Twitch

Continuing this thread, Sabine Schmaltz announced

After hiding the original live stream recording, and starting to publish th= e talk recordings individually on the YouTube channel at https://www.youtube.com/@FUNOCaml, we're al= most done listing all the talks!

https://yout= u.be/0Hwd7NxQ8_c?si=3DPkrJtJXPYS1kSAyg

Native debugging on macOS (DWARF support)

Joel Reymont announced

With DWARF v5 support, the compiler now includes proper debug info =E2=80= =94 line mappings, symbols, and variable names =E2=80=94 so LLDB can actual= ly follow your code.

A small LLDB Python plug-in reads OCaml values at runtime and prints them i= n a readable form: lists, tuples, closures, strings, etc. It follows DWARF = location lists to track where each variable lives and uses the runtime head= ers to decode them. The p and ocaml_vars commands= work like normal LLDB commands but understand OCaml values.

It=E2=80=99s not complete yet (records and variants still show as tuples), = but it makes debugging native OCaml code straightforward. You can finally s= et breakpoints by source, inspect locals, and understand what=E2=80=99s in = memory without switching to disassembly.

https://joel= .id/native-binary-debugging-for-ocaml/

Package Hygiene in Alice

Steve Sherratt announced

https:= //www.alicecaml.org/blog/package-hygiene-in-alice/

Alice is an OCaml build system and package manager I'm developing in my spa= re time. This post is about Alice's packaging protocol and how it enforces = hygiene while building packages.

crypt 2.0 - unix crypt function

Continuing this thread, Mikhail announced

Minor update: crypt 2.1.

We have added a mutex for the POSIX crypt function and a platform-dependent= implementation of crypt, i.e., crypt_r for Linux and FreeBSD. We have also= added the Ffi module for accessing native platform bindings.

opam 2.5.0~rc1 and opam-publish 2.7.1

Kate announced

Hi everyone,

We are happy to announce the first release candidate of opam 2.5.0, which boasts a grand total of zero (0) changes compared to 2.5.= 0~beta1!

We also take this opportunity to announce the release of opam-publish 2.7.1, whose full release notes can be seen here.

Changes in opam-publish 2.7.1

In 2.7.0, opam-publish changed the way user's branches are pus= hed to their GitHub forks before opening a PR, switching from using SSH key= s to using the GitHub API token that opam-publish already requires.

2.7.1 fixes a couple of bugs related to that where opam-publis= h stopped working if the GitHub Action workflow files of upstream opam-repo= sitory are changed, owing to the way GitHub token permissions work. Thanks to @filipeom both for= the original contribution in 2.7.0 and for subsequent work on= it in 2.7.1.

Read our bl= og post for more details.

Please report any issues to the opam bug-tracker or the opam-publish bug-tracker.

Try the new opam 2.5.0 release candidate:

The upgrade instructions are unchanged:

For Unix systems

bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
5.0~rc1"

or from PowerShell for Windows systems

Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
ll.ps1) } -Version 2.5.0~rc1"

Please report any issues to the bug-tracker.

Happy hacking, <> <> The opam team <> <> :camel:

ocaml-protoc 4.0, pbrt 4.0

Simon Cruanes announced

Dear caml riders, I'm happy to announce the release of ocaml-protoc 4.0, alongside its runtim= e libraries pbrt, pbrt_yojson, and pbrt_ser= vices.

Ocaml-protoc is a pure OCaml implementation of a protobuf compiler and runtime. Protobuf is a binary serialization format and= IDL (interface description language) first introduced by Google in the ear= ly 00s, and still in pervasive use there and elsewhere. It is faster (to en= code/decode) and more compact than JSON, and is designed for backward compa= tibility on the wire.

Anyway, this new major release is breaking because it finally follow= s the standard's semantics about field presence. By default, many fields in protobuf are somewhat optional[^1] and are n= ot serialized at all if not present. Ocaml-protoc now tracks this for every= non-required field, even scalars, moving towards better compliance with th= e standard. It does that either via option or via a presence b= itfield. Because of this, the generated code has changed significantly and = looks more like what the official protoc produces.

In a nutshell, each protobuf message now becomes a private record type with= mutable fields and a presence bitfield. All modification and creation for = a type foo is done via make_foo and foo_se= t_<field> functions; presence can be checked with foo_ha= s_<field>. This means the runtime knows which fields have been= explicitly modified.

I don't think ocaml-protoc is 100% compliant with the fine print on default= values in proto3, etc. but this is a lot closer than it used to be. Thanks= to the work of @lupus there's als= o a new option validation layer.

detailed example

Let's look at this simple example:

syntax =3D "proto3";

message Person {
  string name =3D 1;
  sint64 age =3D 2;
}

message Store {
  string address =3D 1;
  repeated Person employees =3D 2;
  repeated Person clients =3D 3;
}

message Company {
  string name =3D 1;
  repeated Store stores =3D 2;
  repeated Company subsidiaries =3D 3;
}
(* g=
enerated from "orgchart.proto", do not edit *)

(** {2 Types}type person =3D {
  name : string;
  age : int64;
}

type store =3D {
  address : string;
  employees : person list;
  clients : person list;
}

type company =3D {
  name : string;
  stores : store list;
  subsidiaries : company list;
}


(** {2 Basic values} *)

val default_person :=20
  ?name:string -&=
gt;
  ?age:int64 ->
  unit ->
  person
(** [default_person ()] is the default value for type [person] *)

val default_store :=20
  ?address:string=
 ->
  ?employees:pers=
on list ->
  ?clients:person=
 list ->
  unit ->
  store
(** [default_store ()] is the default value for type [store] *)

val default_company :=20
  ?name:string -&=
gt;
  ?stores:store l=
ist ->
  ?subsidiaries:c=
ompany list ->
  unit ->
  company
(** [default_company ()] is the default value for type [company] *)


(** {2 Formatters} *)

val pp_person : Format.formatter -> person -> unit=20
(** [pp_person v] formats v *)

val pp_store : Format.formatter -> store -> unit=20
(** [pp_store v] formats v *)

val pp_company : Format.formatter -> company -> unit=20
(** [pp_company v] formats v *)


(** {2 Protobuf Encoding} *)

val encode_pb_person : person -> Pbrt.Encoder.t -> unit
(** [encode_pb_person v encoder=
] encodes [v] with the given [encoder] *)

val encode_pb_store : store -> Pbrt.Encoder.t -> unit
(** [encode_pb_store v encoder<=
span style=3D"color: #804f60; font-style: italic;">] encodes [v]=
 with the given =
[encoder]=
 *)

val encode_pb_company : company -> Pbrt.Encoder.t -> unit
(** [encode_pb_company v encode=
r] encodes [v]] *)


(** {2 Protobuf Decoding} *)

val decode_pb_person : Pbrt.Decoder.t -> person
(** [decode_pb_person decoder] decodes a [person] binary value from [decoder] *)

val decode_pb_store : Pbrt.Decoder.t -> store
(** [decode_pb_store decoder] decodes a [store] binary value from [decoder]=
 *)

val decode_pb_company : Pbrt.Decoder.t -> company
(** [decode_pb_company decoder<=
span style=3D"color: #804f60; font-style: italic;">] decodes a [company] binary value from [decoder] *)
```

new code:

```ocaml

(** Code for orgchart.p=
roto *)

(* generated from "orgchart.proto", d=
o not edit *)



(** {2 Types}type person =3D private {
  mutable _presen=
ce: Pbrt.Bitfield.t; (** presence for 2 =
fields *)
  mutable name : =
string;
  mutable age : i=
nt64;
}

type store =3D private {
  mutable _presen=
ce: Pbrt.Bitfield.t; (** presence for 1 =
fields *)
  mutable address=
 : string;
  mutable employe=
es : person list;
  mutable clients=
 : person list;
}

type company =3D private {
  mutable _presen=
ce: Pbrt.Bitfield.t; (** presence for 1 =
fields *)
  mutable name : =
string;
  mutable stores =
: store list;
  mutable subsidi=
aries : company list;
}


(** {2 Basic values} *)

val default_person : unit -> person=20
(** [default_person ()] is a new empty value for type [person] *)

val default_store : unit -> store=20
(** [default_store ()] is a new empty value for type [store] *)

val default_company : unit -> company=20
(** [default_company ()] is a new empty value for type [company] *)


(** {2 Make functions} *)

val make_person :=20
  ?name:string -&=
gt;
  ?age:int64 ->
  unit ->
  person
(** [make_person … ()] is a builder for type [person] *)

val copy_person : person -> person

val person_has_name : person -> bool
  (** presence of field=
 "name" in [person] *)

val person_set_name : person -> string -> unit
  (** set field name in=
 person *)

val person_has_age : person -> bool
  (** presence of field=
 "age" in [person] *)

val person_set_age : person -> int64 -> unit
  (** set field age in =
person *)

val make_store :=20
  ?address:string=
 ->
  ?employees:pers=
on list ->
  ?clients:person=
 list ->
  unit ->
  store
(** [make_store … ()] is a builder for type [store] *)

val copy_store : store -> store

val store_has_address : store -> bool
  (** presence of field=
 "address" in [<=
/span>store] *)

val store_set_address : store -> string -> un=
it
  (** set field address=
 in store *)

val store_set_employees : store -> person list -=
> unit
  (** set field employe=
es in store *)

val store_set_clients : store -> person list -&g=
t; unit
  (** set field clients=
 in store *)

val make_company :=20
  ?name:string -&=
gt;
  ?stores:store l=
ist ->
  ?subsidiaries:c=
ompany list ->
  unit ->
  company
(** [make_company … ()] is a builder for type [company] *)

val copy_company : company -> company

val company_has_name : company -> bool
  (** presence of field=
 "name" in [company] *)

val company_set_name : company -> string -> u=
nit
  (** set field name in=
 company *)

val company_set_stores : company -> store list -=
> unit
  (** set field stores =
in company *)

val company_set_subsidiaries : company -> compan=
y list -> unit
  (** set field subsidi=
aries in company *)


(** {2 Formatters} *)

val pp_person : Format.formatter -> person -> unit=20
(** [pp_person v] formats v *)

val pp_store : Format.formatter -> store -> unit=20
(** [pp_store v] formats v *)

val pp_company : Format.formatter -> company -> unit=20
(** [pp_company v] formats v *)


(** {2 Protobuf Encoding} *)

val encode_pb_person : person -> Pbrt.Encoder.t -> unit
(** [encode_pb_person v encoder=
] encodes [v] with the given [encoder] *)

val encode_pb_store : store -> Pbrt.Encoder.t -> unit
(** [encode_pb_store v encoder<=
span style=3D"color: #804f60; font-style: italic;">] encodes [v]=
 with the given =
[encoder]=
 *)

val encode_pb_company : company -> Pbrt.Encoder.t -> unit
(** [encode_pb_company v encode=
r] encodes [v]] *)


(** {2 Protobuf Decoding} *)

val decode_pb_person : Pbrt.Decoder.t -> person
(** [decode_pb_person decoder] decodes a [person] binary value from [decoder] *)

val decode_pb_store : Pbrt.Decoder.t -> store
(** [decode_pb_store decoder] decodes a [store] binary value from [decoder]=
 *)

val decode_pb_company : Pbrt.Decoder.t -> company
(** [decode_pb_company decoder<=
span style=3D"color: #804f60; font-style: italic;">] decodes a [company] binary value from [decoder] *)

[^1]: the precise semantics of presence are, imho, quite messy.

Cmdliner 2.1.0 =E2=80=93 The powershell edition

Brian Ward announced

Hello,=20

It's my pleasure to announce the version 2.1.0 of cmdliner

Cmdliner is an ISC-licensed library that allows the declarative and compositional definition of command lines with excellent support for command line interface user conventions and standards.

This releases consolidates additional work on command line completion. I ad= ded:

I'd like to thank @dbuenzli for his gracious feedback on these changes, and= importantly for telling me =E2=80=9Cno=E2=80=9D to several others beforeha= nd :)

For all the other details see the release notes.

Other OCaml News

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

--=-=-=--