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=N2kekb5x; 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]) by plum.tunbury.org (Postfix) with ESMTP id C14B440085 for ; Tue, 14 Apr 2026 09:50:14 +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=NI9ERJYthiWcrEZS0WaAR1/DWM27+XfVg3yqrpaOowQ=; b=N2kekb5xgVcuFtXeCeMOXe5pgq7IwIWaCYMb/smu7VbMr24wEyazsxnn CyoNv5gW9Yd0gWSbu0R+WFm3JbgBUvCOglUlUvS2YMHro65CD9GaYYUCO SOhaVZcte1GeHR5GUQEx2zkkuf5LyjoDqBpK+2JXHw47uFG8WlCh7igUN k=; X-CSE-ConnectionGUID: sSRPEU/lQ7qMwA0PPjx+Tw== X-CSE-MsgGUID: h4GGMINoTzWz0dE5JCWkCA== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; 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 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@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.23,179,1770591600"; d="asc'?scan'208,217";a="272404658" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 14 Apr 2026 11:50:14 +0200 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id A492D82CCD; Tue, 14 Apr 2026 11:50:13 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id D4B1682CBB for ; Tue, 14 Apr 2026 11:50:02 +0200 (CEST) X-CSE-ConnectionGUID: IgT2Wl2iRBGixnPnqCGKgQ== X-CSE-MsgGUID: srvPW6llROeU2EtVpPdcPg== IronPort-SDR: 69de0dc9_goDV0G9Breelx95FnUm0vlJKK2M7Kq1jUwk8b/GZ9nQduAy a+zdLmabJrPrvU0zeqn+t+0YdvNyzaNvNZa+iVw== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0G2EgCWDN5pjyIeaIFagRWDAVspGgFsXxkaBwhJSYQPg?= =?us-ascii?q?0+OJYEWkDeJcYEKDYJtAxgWIQIOBwEDAQgFLgEVCgECBAEBAwECAYIMgnQCF?= =?us-ascii?q?jkVjEkCHwYBBDQTAQIEAQEBAQMCAwEBAQEBAQEBAQEBCwEBBQEBAQIBAQIEB?= =?us-ascii?q?gECEAEBAQEBATkFSYZPDYJFUXFlCTcBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQECBAQDAQEjDW4DBgQGEwEBOBgjAxQBBgMCB?= =?us-ascii?q?A0BNRcBEhQGghBYAYIiAk8DBQwGmT6bRHp/M4EBggwBAQaBCD4DDwMBDgkm2?= =?us-ascii?q?hGBXgkJgTUYgViEGYJKDw0BBSVJagIBAoRPCYQ2Jw+BVUSBFTWCPQdvgVABe?= =?us-ascii?q?RcBAQEBAYE0BAMBAQhFCYMlgmmCJnoUHYJbBoFGYYIEBR0wgX+FP4JCLAFVE?= =?us-ascii?q?xcLBwVegQgDKi8tbjIdgSM+FzRYGwcFgUuFKoFhgRODbIEDAwttPTcUG4lYE?= =?us-ascii?q?CENgR1DGSKBPC0CDj0BAg8GCR4PFAEaEwEbDgEBIi0BCCMWCgUUDg4BEwQ3C?= =?us-ascii?q?QoIAw0tkk4MJQECBiSddJNZHW00B4QfgV4GDIkIgSaSMINXhASBV4s8hwKSU?= =?us-ascii?q?iKYZCKCNocogSYJgW9rlWACBoVQgX8jgVwzGjAiIYIzATMJRhwPiCGGDBaBE?= =?us-ascii?q?wEBgRuBByiBNAqBJoF0O7ooQTUBAQEBOwcCBwELBIVrAQGMBjRuXQEB?= IronPort-PHdr: A9a23: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 FjQRTtubovtrcn1fZJITT0JkKA= IronPort-Data: A9a23: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 M6s7jn2xG5rsu5jEewpcBf1r4WLd4s8Jzk= IronPort-HdrOrdr: A9a23:O+yhTag829+2GXmvK+6YA5lF93BQXuUji2hC6mlwRA09TyX4rb HNoB1/73WYtN9/YhAdcLy7VJVoIkmslqKdg7NwAV7KZmCP01dAR7sN0WKN+VLdMhy73tEY/6 ZteapzBbTLfD1HpPe/xhK3V/IpwNzvytHOuQ4y9QYIcT1X X-Talos-CUID: =?us-ascii?q?9a23=3AQ53+v2ped0XVGOVqJOZQtirmUeEqTifiyC3RGWW?= =?us-ascii?q?XCHZvcLuMYnCz95oxxg=3D=3D?= X-Talos-MUID: 9a23:fPXeaQT7RMP7mjcWRXT3ni9aC5ls556JBX1XvIk4o/GIPhR/bmI= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.23,179,1770591600"; d="asc'?scan'208,217";a="272404539" X-MGA-submission: =?us-ascii?q?MDE/sFmemRlXOlQkm50+FG0+oX3J/Mxmqffoe4?= =?us-ascii?q?S7hLGdwb/cQ1HjBUnWMMyOkmqKqVp6RVa6bxWrUiVBdxlSKhRBGQI5tt?= =?us-ascii?q?xM7NFivrvfu2PlNn6Mg+NJcUH+oFnt5HSBe2wkhWgUMVAZiGOB7Cxguo?= =?us-ascii?q?N8LwX6YMZX5jbBQoyCo4vTsg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Apr 2026 11:50:02 +0200 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 5D2CF1A47B; Tue, 14 Apr 2026 11:50:01 +0200 (CEST) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 14 Apr 2026 11:50:00 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 14 11:50:01 2026 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499622, queueID=7E42F1A828 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: 19486 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: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMDcgdG8gMTQsDQoyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkNhbGwgZm9y IHByZXNlbnRhdGlvbnM6IENhbWwgaW4gdGhlIENhcGl0YWwgSUkNCkxpc3QgeW91ciBvcGVuIE9D YW1sIHBvc2l0aW9ucyBvbiB0aGUgT0NhbWwub3JnIGpvYiBib2FyZA0KWUFNTHg6IHB1cmUtT0Nh bWwgWUFNTCAxLjIvMS4xIGxpYnJhcnkNCm9jYW1sLWxldHNlbmNyeXB0LCBhbiBPQ2FtbCB3YXkg dG8gZ2V0IFRMUyBjZXJ0aWZpY2F0ZXMNCk5ldyByZWxlYXNlIG9mIE9DYW1sIExTUCAxLjI2LjAg YW5kIE1lcmxpbiA1LjcuMC01MDQNCk9DYW1sIFlBTUwgbGlicmFyeQ0KSTE4biA1LjAg4oCUIElu dGVybmF0aW9uYWxpc2F0aW9uIG1hZGUgZWFzeSBmb3IgYW55IE9DYW1sIGFwcA0KQVREIDQuMS4w IC0gbm93IHdpdGggWUFNTCBzdXBwb3J0DQpPbGQgQ1dODQoNCg0KQ2FsbCBmb3IgcHJlc2VudGF0 aW9uczogQ2FtbCBpbiB0aGUgQ2FwaXRhbCBJSQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jYWxsLWZvci1wcmVz ZW50YXRpb25zLWNhbWwtaW4tdGhlLWNhcGl0YWwtaWkvMTc5NTkvMT4NCg0KDQpTYWNoYSBBeW91 biBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lIDp3YXZpbmdfaGFuZDoNCg0KICBG b2xsb3dpbmcgdGhlIHN1Y2Nlc3Mgb2YgdGhlIGxhc3QgZXZlbnQsIHdlJ3JlIG9yZ2FuaXNpbmcg YSBzZWNvbmQNCiAgZWRpdGlvbiBvZiBDYW1sIEluIHRoZSBDYXBpdGFsIChoYXBwZW5pbmcgaW4g TG9uZG9uKS4gRnJvbSB0YWxraW5nIHRvDQogIHRoZSBhdHRlbmRlZXMgYXQgdGhlIGZpcnN0IGV2 ZW50LCB3ZSB3aWxsIGJlIGRvaW5nIHNob3J0ZXIgdGFsa3MgYW5kDQogIG1vcmUgc29jaWFsaXNp bmcg8J+NlQ0KDQogIFNvIGZhciwgd2UgYXJlIGFpbWluZyBmb3IgKk1heSAxNHRoKiwgdG8gYmUg Y29uZmlybWVkIG9uY2Ugd2UgaGF2ZQ0KICBzZWN1cmVkIGEgdmVudWUuIFBsZWFzZSBsZXQgdXMg a25vdyBpZiB0aGlzIGlzIGNsYXNoaW5nIHdpdGggYW5vdGhlcg0KICBiaWcgZXZlbnQgb2ZmIG91 ciByYWRhci4NCg0KICBPbmNlIHdlIGNvbmZpcm0gdGhlIGRhdGUgYW5kIHByZXNlbnRhdGlvbnMs IHdlJ2xsIHBvc3QgaGVyZSBhbmQgb24gdGhlDQogIGRlZGljYXRlZCBbWnVsaXAgY2hhbm5lbF0g YXMgd2VsbCBhcyBbb3VyIHdlYnNpdGVdLg0KDQoNCltadWxpcCBjaGFubmVsXQ0KPGh0dHBzOi8v b2NhbWwuenVsaXBjaGF0LmNvbS8jbmFycm93L2NoYW5uZWwvNTUzMzc1LUNhbWwtSW4tVGhlLUNh cGl0YWw+DQoNCltvdXIgd2Vic2l0ZV0gPGh0dHBzOi8vY2FtbC1pbi10aGUtY2FwaXRhbC5naXRo dWIuaW8+DQoNCkNhbGwgZm9yIHByZXNlbnRhdGlvbnMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdlJ3JlIGxv b2tpbmcgZm9yIHRhbGtzIHRoYXQgYXJlIG9mIGludGVyZXN0IHRvIHRoZSBlbnRpcmUgT0NhbWwN CiAgY29tbXVuaXR5LiAgVG9waWNzIGluY2x1ZGVzIChidXQgYXJlIG5vdCBsaW1pdGVkIHRvKToN CiAg4oCiIE9DYW1sIHRvb2xpbmcgKGJ1aWxkIHN5c3RlbXMsIHBhY2thZ2UgbWFuYWdlbWVudCwg bHNwLA0KICAgIGRvY3VtZW50YXRpb27igKYpDQogIOKAoiBUaGUgY29vbCBsaWJyYXJ5IHlvdSdy ZSB3b3JraW5nIG9uDQogIOKAoiBZb3VyIE9DYW1sLXJlbGF0ZWQgcmVzZWFyY2ggKGFzIGxvbmcg YXMgeW91IG1ha2UgaXQgYWNjZXNzaWJsZSBmb3INCiAgICBwZW9wbGUgb3V0c2lkZSB5b3VyIGZp ZWxkKQ0KICDigKIgU29tZSBwaWVjZSBvZiB0aGUgT0NhbWwgZWNvc3lzdGVtIHRoYXQgeW91J2Qg bGlrZSBwZW9wbGUgdG8gaGVhcg0KICAgIGFib3V0IChvY2FtbC5vcmcsIHRoZSBPQ2FtbCBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCDigKYpDQogIOKAoiBZb3VyIGluZHVzdHJpYWwgdXNlIG9mIE9DYW1s DQogIOKAoiBldGMuDQoNCiAgSWYgeW914oCZZCBsaWtlIHRvIGdpdmUgYSB0YWxrLCBwbGVhc2Ug bWVzc2FnZSBtZSBvciBAQWxpc3RhaXIgZGlyZWN0bHkNCiAgd2l0aCBhIHRpdGxlIGFuZCBzaG9y dCBhYnN0cmFjdC4NCg0KDQpMaXN0IHlvdXIgb3BlbiBPQ2FtbCBwb3NpdGlvbnMgb24gdGhlIE9D YW1sLm9yZyBqb2IgYm9hcmQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvbGlzdC15b3VyLW9wZW4tb2NhbWwtcG9zaXRpb25zLW9uLXRoZS1vY2FtbC1vcmct am9iLWJvYXJkLzExMzc3LzIxPg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIFZpa2FzSyBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgd291bGQgbGlrZSB0byBwb3N0IHRoaXMgam9iIHRoYXQg d2UgYXJlIGhpcmluZyBmb3IuDQoNCiAg4oCiIHRpdGxlOiBMZWFkIFN5c3RlbXMgU29mdHdhcmUg RW5naW5lZXINCiAg4oCiIGxpbms6DQogICAgPGh0dHBzOi8vY2FyZWVycy5jbG91ZC5jb20vam9i cy9sZWFkLXN5c3RlbXMtc29mdHdhcmUtZW5naW5lZXItcmVtb3RlLXVuaXRlZC1raW5nZG9tPg0K ICDigKIgbG9jYXRpb25zOg0KICAgIOKAoiBSZW1vdGUNCiAgICDigKIgVW5pdGVkLUtpbmdkb20N CiAg4oCiIHB1YmxpY2F0aW9uX2RhdGU6IDIwMjYtMDQtMDgNCiAg4oCiIGNvbXBhbnk6IENsb3Vk IFNvZnR3YXJlIEdyb3VwDQogIOKAoiBjb21wYW55X2xvZ286DQogICAgPGh0dHBzOi8vd3d3LmNs b3VkLmNvbS9tZWRpYV8xZTQwZTdkMDQ4ZjAxMTdkNDU0M2M5NDBmOWU3NDMzYjU0OWMwOGEwMy5z dmc+DQoNCg0KWUFNTHg6IHB1cmUtT0NhbWwgWUFNTCAxLjIvMS4xIGxpYnJhcnkNCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXlhbWx4LXB1cmUtb2Nh bWwteWFtbC0xLTItMS0xLWxpYnJhcnkvMTc5NzAvMT4NCg0KDQpNYXJ0aW4gSmFtYm9uIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVsbG8sDQoNCiAgSSdtIGV4Y2l0ZWQgdG8gYW5ub3Vu Y2UgdGhlIGF2YWlsYWJpbGl0eSBvZiBbWUFNTHhdLCBhIGNvbXBsZXRlDQogIGltcGxlbWVudGF0 aW9uIG9mIHRoZSBZQU1MIDEuMiBhbmQgMS4xIHN0YW5kYXJkcy4gSXQgaXMgaW50ZW5kZWQgdG8N CiAgc3VwcG9ydCBtb3N0IHVzZXMgb2YgWUFNTCBpbmNsdWRpbmcgaXRzIHVzZSBhcyBhIGNvbmZp Z3VyYXRpb24gZmlsZQ0KICBmb3JtYXQgaW4gbmV3IGFwcGxpY2F0aW9ucyBhbmQgYW5hbHl6aW5n IFlBTUwgZmlsZXMgb2Ygb3RoZXINCiAgYXBwbGljYXRpb25zLg0KDQogIEZvciBhIGZ1bGxlciBk ZXNjcmlwdGlvbiwgY2hlY2sgb3V0IHRoZSBbcmVsZWFzZSBub3Rlc10uDQoNCiAgR2V0IHN0YXJ0 ZWQgd2l0aCBgb3BhbSBpbnN0YWxsIHlhbWx4Jy4gVGhlbiB1c2UgdGhlIGB5YW1seCcgY29tcGFu aW9uDQogIGNvbW1hbmQgdG8gY2hlY2sgdGhhdCBpdCBwYXJzZXMgYW5kIGludGVycHJldHMgeW91 ciBmYXZvcml0ZSBZQU1MDQogIGZpbGVzIGNvcnJlY3RseS4NCg0KICBIZXJlJ3MgYW4gZXhhbXBs ZSBzaG93aW5nIHRoZSB1c2Ugb2YgdGhlIGxpYnJhcnkgdG8gY29udmVydCBZQU1MIHRvDQogIEpT T046DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoKiBSZWFkIFlBTUwgZnJvbSBzdGRpbiB3 aXRoIFlBTUx4LCBwcmludCBKU09OIHRvIHN0ZG91dCB3aXRoIFlvanNvbg0KICDilIIgDQogIOKU giAgICBUaGlzIGlzIGEgZGVtbyBzaG93aW5nIGhvdyB0byB1c2UgdGhlIFlBTUx4IGxpYnJhcnkg d2l0aCB0aGUgZGVmYXVsdA0KICDilIIgICAgc2V0dGluZ3MuICdZQU1MeC5WYWx1ZXMub25lX29m X3lhbWxfZXhuJyBvZmZlcnMgb3B0aW9ucyB0byByZXN0cmljdA0KICDilIIgICAgdGhlIGlucHV0 IGxhbmd1YWdlIG9yIHRvIGZvcmNlIHRoZSBpbnRlcnByZXRhdGlvbiBhcyBZQU1MIDEuMSBpbnN0 ZWFkIG9mDQogIOKUgiAgICBZQU1MIDEuMi4NCiAg4pSCIA0KICDilIIgICAgQ29tcGlsZSB3aXRo Og0KICDilIIgICAgICBvY2FtbGZpbmQgb3B0IC1vIHlhbWwtdG8tanNvbiBcDQogIOKUgiAgICAg ICAgLXBhY2thZ2UgeWFtbHgseW9qc29uIC1saW5rcGtnIHlhbWxfdG9fanNvbi5tbA0KICDilIIg KikNCiAg4pSCIA0KICDilIIgb3BlbiBQcmludGYNCiAg4pSCIA0KICDilIIgbGV0IHJlYyB5b2pz b25fb2ZfeWFtbHggKHggOiBZQU1MeC52YWx1ZSkgOiBZb2pzb24uU2FmZS50ID0NCiAg4pSCICAg bWF0Y2ggeCB3aXRoDQogIOKUgiAgIHwgTnVsbCBfIC0+IGBOdWxsDQogIOKUgiAgIHwgQm9vbCAo XywgeCkgLT4gYEJvb2wgeA0KICDilIIgICB8IEludCAoXywgeCkgLT4gYEludGxpdCAoSW50NjQu dG9fc3RyaW5nIHgpDQogIOKUgiAgIHwgRmxvYXQgKF8sIHgpIC0+IGBGbG9hdCB4DQogIOKUgiAg IHwgU3RyaW5nIChfLCB4KSAtPiBgU3RyaW5nIHgNCiAg4pSCICAgfCBTZXEgKF8sIHhzKSAtPiBg TGlzdCAoTGlzdC5tYXAgeW9qc29uX29mX3lhbWx4IHhzKQ0KICDilIIgICB8IE1hcCAoXywgeHMp IC0+DQogIOKUgiAgICAgICBgQXNzb2MgKExpc3QubWFwIChmdW4gKGxvYywgaywgdikgLT4NCiAg 4pSCICAgICAgICAgbWF0Y2ggKGsgOiBZQU1MeC52YWx1ZSkgd2l0aA0KICDilIIgICAgICAgICB8 IFN0cmluZyAoXywgaykgLT4gKGssIHlvanNvbl9vZl95YW1seCB2KQ0KICDilIIgICAgICAgICB8 IF8gLT4NCiAg4pSCICAgICAgICAgICAgIGtzcHJpbnRmIGZhaWx3aXRoICIlczogb25seSBzdHJp bmcga2V5cyBhcmUgc3VwcG9ydGVkIg0KICDilIIgICAgICAgICAgICAgICAoWUFNTHguZGVmYXVs dF9mb3JtYXRfbG9jIGxvYykNCiAg4pSCICAgICAgICkgeHMpDQogIOKUgiANCiAg4pSCIGxldCAo KSA9DQogIOKUgiAgIFlBTUx4LnJlZ2lzdGVyX2V4Y2VwdGlvbl9wcmludGVycyAoKTsNCiAg4pSC ICAgc3RkaW4NCiAg4pSCICAgfD4gSW5fY2hhbm5lbC5pbnB1dF9hbGwNCiAg4pSCICAgfD4gWUFN THguVmFsdWVzLm9uZV9vZl95YW1sX2V4bg0KICDilIIgICB8PiB5b2pzb25fb2ZfeWFtbHgNCiAg 4pSCICAgfD4gWW9qc29uLlNhZmUucHJldHR5X3RvX2NoYW5uZWwgc3Rkb3V0DQogIOKUgiAgIHw+ IHByaW50X25ld2xpbmUNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KW1lBTUx4XSA8aHR0cHM6Ly9n aXRodWIuY29tL21qYW1ib24veWFtbHg+DQoNCltyZWxlYXNlIG5vdGVzXSA8aHR0cHM6Ly9naXRo dWIuY29tL21qYW1ib24veWFtbHgvcmVsZWFzZXMvdGFnLzAuMS4wPg0KDQpGdW5kaW5nDQrilYzi lYzilYzilYzilYzilYzilYwNCg0KICBZQU1MeCBpcyBjdXJyZW50bHkgcmVsZWFzZWQgdW5kZXIg dGhlICpBR1BMKi4gVGhlcmUgaXMgYW4gb25nb2luZw0KICBmdW5kcmFpc2VyOiBvbmNlIGEgZnVu ZGluZyBnb2FsIGlzIHJlYWNoZWQsIHRoZSBsaWNlbnNlIHdpbGwgc3dpdGNoIHRvDQogIHRoZSBw ZXJtaXNzaXZlICpJU0MqIGxpY2Vuc2UgZm9yIGV2ZXJ5b25lLiBEb25vcnMgYWJvdmUgYSBjZXJ0 YWluDQogIHRocmVzaG9sZCByZWNlaXZlIGFuIGltbWVkaWF0ZSAqY29tbWVyY2lhbCBsaWNlbnNl Ki4gU2VlIFtteSBHaXRIdWINCiAgU3BvbnNvcnMgcHJvZmlsZV0gZm9yIGRldGFpbHMuDQoNCg0K W215IEdpdEh1YiBTcG9uc29ycyBwcm9maWxlXSA8aHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3Jz L21qYW1ib24+DQoNCg0Kb2NhbWwtbGV0c2VuY3J5cHQsIGFuIE9DYW1sIHdheSB0byBnZXQgVExT IGNlcnRpZmljYXRlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tb2NhbWwtbGV0c2VuY3J5cHQtYW4tb2NhbWwtd2F5LXRvLWdldC10bHMtY2VydGlmaWNhdGVz LzE3OTc1LzE+DQoNCg0KQ2FsYXNjaWJldHRhIFJvbWFpbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gZGVsaWdodGVkIHRvIGFubm91bmNlIHRoZSBy ZWxlYXNlIG9mIFtvY2FtbC1sZXRzZW5jcnlwdF0gKHZlcnNpb24NCiAgMi4xLjApLiBUaGlzIHZl cnNpb24gaW50cm9kdWNlcyBhIG5ldyBBUEkgdGhhdCBhbGxvd3MgaXQgdG8gb3BlcmF0ZQ0KICBp bmRlcGVuZGVudGx5IG9mIGEgc2NoZWR1bGVyIGFuZCBhbiBIVFRQIGNsaWVudC4gSXQgaXMgYWxz byBhIHJld3JpdGUNCiAgdXNpbmcgb3VyIGJyYW5kLW5ldyBbandzXSBsaWJyYXJ5LCB3aGljaCBu b3cgdXRpbGlzZXMgdGhlIFtqc29udF0NCiAgbGlicmFyeSAocmF0aGVyIHRoYW4gW3lvanNvbl0p Lg0KDQogIGBvY2FtbC1sZXRzZW5jcnlwdCcgaW1wbGVtZW50cyBbY2hhbGxlbmdlc10gbmVlZGVk IHRvIG9idGFpbiBhDQogIGNlcnRpZmljYXRlIHZpYSB0aGUgdGhyZWUgd2F5czogRE5TLCBIVFRQ IGFuZCBBQ01FLVRMUy4gSXQgdGhlcmVmb3JlDQogIGVuYWJsZXMgYSB3ZWJzaXRlIGRlcGxveW1l bnQgc3RyYXRlZ3kgKGltcGxlbWVudGVkIHdpdGggW1ZpZl0sIGZvcg0KICBleGFtcGxlKSB0byBi ZSBwcm92aWRlZCBlbnRpcmVseSBpbiBPQ2FtbC4NCg0KICBXZSB1c2UgaXQgd2l0aGluIG91ciBj b29wZXJhdGl2ZSBmb3IgcHJvamVjdHMgc3VjaCBhczoNCiAg4oCiIFtgZG5zLWxldHNlbmNyeXB0 LXNlY29uZGFyeSddLCBhIHVuaWtlcm5lbCB0aGF0IGFjdHMgYXMgYSBzZWNvbmRhcnkNCiAgICBE TlMgc2VydmVyIGNhcGFibGUgb2YgcGVyZm9ybWluZyB0aGUgRE5TIGNoYWxsZW5nZSBmb3IgYSBz cGVjaWZpYw0KICAgIGRvbWFpbiBhbmQgZ2VuZXJhdGluZyB0aGUgY2VydGlmaWNhdGUgYW5kIHBy aXZhdGUga2V5LiBJdCBnZW5lcmFsbHkNCiAgICB3b3JrcyBpbiB0YW5kZW0gd2l0aCBvdXIgW2Bw cmltYXJ5LWdpdCddLCBvdXIgcHJpbWFyeSBETlMgc2VydmVyLg0KICDigKIgW2Bjb250cnVubydd LCBhIHVuaWtlcm5lbCB0aGF0IGFjdHMgYXMgYSBUTFMgcmV2ZXJzZSBwcm94eSBhbmQgaXMNCiAg ICBjYXBhYmxlIG9mIHBlcmZvcm1pbmcgSFRUUCBjaGFsbGVuZ2VzLiBUaGUgbGF0dGVyIGlzIGN1 cnJlbnRseSBiZWluZw0KICAgIGNvbXBsZXRlbHkgcmV3cml0dGVuIHVzaW5nIFtgbW5ldCddLg0K DQogIEdvb2QgbHVjayB3aXRoIGRlcGxveWluZyB5b3VyIHdlYnNpdGVzLCBhbmQgaGFwcHkgaGFj a2luZyEgSGVyZeKAmXMNCiAgaG9waW5nIHRoYXQgYGp3cycgYWxzbyBmaW5kcyBpdHMgcGxhY2Ug YXMgYSBsaWJyYXJ5IHdpdGhpbiB0aGUgT0NhbWwNCiAgZWNvc3lzdGVtLg0KDQoNCltvY2FtbC1s ZXRzZW5jcnlwdF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL29jYW1sLWxldHNlbmNy eXB0Pg0KDQpbandzXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvandzPg0KDQpbanNv bnRdIDxodHRwczovL2VycmF0aXF1ZS5jaC9sb2dpY2llbC9qc29udD4NCg0KW3lvanNvbl0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1jb21tdW5pdHkveW9qc29uPg0KDQpbY2hhbGxlbmdlc10g PGh0dHBzOi8vbGV0c2VuY3J5cHQub3JnL2ZyL2RvY3MvY2hhbGxlbmdlLXR5cGVzLz4NCg0KW1Zp Zl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL3ZpZj4NCg0KW2BkbnMtbGV0c2VuY3J5 cHQtc2Vjb25kYXJ5J10NCjxodHRwczovL2dpdGh1Yi5jb20vcm9idXItY29vcC9kbnMtbGV0c2Vu Y3J5cHQtc2Vjb25kYXJ5Lz4NCg0KW2BwcmltYXJ5LWdpdCddIDxodHRwczovL2dpdGh1Yi5jb20v cm9idXItY29vcC9kbnMtcHJpbWFyeS1naXQ+DQoNCltgY29udHJ1bm8nXSA8aHR0cHM6Ly9naXRo dWIuY29tL2Rpbm9zYXVyZS9jb250cnVubz4NCg0KW2BtbmV0J10NCjxodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLW1uZXQtYS1uZXctdGNwLWlwLXN0YWNrLWZvci11bmlrZXJuZWxzLWlu LW9jYW1sLzE3ODUxPg0KDQoNCk5ldyByZWxlYXNlIG9mIE9DYW1sIExTUCAxLjI2LjAgYW5kIE1l cmxpbiA1LjcuMC01MDQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1y ZWxlYXNlLW9mLW9jYW1sLWxzcC0xLTI2LTAtbWVybGluLTUtNy0wLTUwNC8xNzk3OC8xPg0KDQoN ClBpemllRHVzdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lLA0KDQogIFdlIGFyZSBoYXBw eSB0byBhbm5vdW5jZSB0aGUgZG91YmxlIHJlbGVhc2Ugb2YgW21lcmxpbiA1LjcuMC01MDRdIGFu ZA0KICBbb2NhbWwtbHNwIDEuMjYuMF0uDQoNCiAgVGhlIG5ldyByZWxlYXNlcyBjb250YWlucyBl eGNpdGluZyBjaGFuZ2VzIHN1Y2ggYXMgaW1wcm92ZW1lbnRzIHRvDQogIHR5cGUgZW5jbG9zaW5n IGJlaGF2aW91ciBvbiB2YXJpb3VzIGNsYXNzIGFuZCBvYmplY3QgcmVsYXRlZCBpdGVtcywNCiAg c2lnbmF0dXJlIGhlbHAgaW1wcm92ZW1lbnRzIGFuZCBzZXZlcmFsIHNldmVyYWwgYnVnIGZpeGVz Lg0KDQogIFBsZWFzZSBkbyBub3QgaGVzaXRhdGUgb3BlbiBpc3N1ZXMgb24gb3VyIGJ1ZyB0cmFj a2VycyBpZiB5b3UNCiAgZW5jb3VudGVyIGFueSBwcm9ibGVtczoNCg0KICDigKIgTWVybGluOiBb QnVnIFRyYWNrZXJdDQogIOKAoiBPQ2FtbCBMU1A6IFtCdWcgVGFja2VyXQ0KDQoNClttZXJsaW4g NS43LjAtNTA0XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vcmVsZWFzZXMvdGFn L3Y1LjcuMC01MDQ+DQoNCltvY2FtbC1sc3AgMS4yNi4wXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC1sc3AvcmVsZWFzZXMvdGFnLzEuMjYuMD4NCg0KW0J1ZyBUcmFja2VyXSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL21lcmxpbi9pc3N1ZXM+DQoNCltCdWcgVGFja2VyXSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWxzcC9pc3N1ZXM+DQoNCg0KT0NhbWwgWUFNTCBs aWJyYXJ5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXlh bWwtbGlicmFyeS80Mjk3Lzc+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgTWFydGluIEph bWJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIDIwMjYgdXBk YXRlOg0KICDigKIgaW4gRGVjZW1iZXIgMjAyNSwgQGF2c20gY3JlYXRlZCBhIHB1cmUtT0NhbWwg WUFNTCBsaWJyYXJ5IGluIGp1c3QNCiAgICBvbmUgZGF5IHVzaW5nIGFuIEFJIGFnZW50IGFuZCBb d3JvdGUgYWJvdXQgaXRdLg0KICDigKIgaW4gQXByaWwgMjAyNiwgSSBkaWQgc29tZXRoaW5nIHNp bWlsYXIgYW5kIHRvb2sgdGhlIHRpbWUgdG8gbWFrZSBpdA0KICAgIGEgY29tcGxldGUsIHByb2R1 Y3Rpb24tZ3JhZGUgMS4yLzEuMSBZQU1MIGxpYnJhcnkgY2FsbGVkIFlBTUx4IHRoYXQNCiAgICBJ IFthbm5vdW5jZWQgaGVyZV0uDQoNCg0KW3dyb3RlIGFib3V0IGl0XSA8aHR0cHM6Ly9hbmlsLnJl Y29pbC5vcmcvbm90ZXMvYW9haC0yMDI1LTY+DQoNClthbm5vdW5jZWQgaGVyZV0NCjxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXlhbWx4LXB1cmUtb2NhbWwteWFtbC0xLTItMS0xLWxp YnJhcnkvMTc5NzA+DQoNCg0KSTE4biA1LjAg4oCUIEludGVybmF0aW9uYWxpc2F0aW9uIG1hZGUg ZWFzeSBmb3IgYW55IE9DYW1sIGFwcA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4taTE4bi01LTAtaW50ZXJuYXRpb25hbGlzYXRpb24tbWFk ZS1lYXN5LWZvci1hbnktb2NhbWwtYXBwLzE3OTgxLzE+DQoNCg0KVmluY2VudCBCYWxhdCBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSBPY3NpZ2VuIHRlYW0gaXMgaGFwcHkgdG8gYW5u b3VuY2UgdGhlIHJlbGVhc2Ugb2YgKm9jc2lnZW4taTE4bg0KICA1LjAqLCBhIHNtYWxsIGJ1dCBw cmFjdGljYWwgaW50ZXJuYXRpb25hbGlzYXRpb24gbGlicmFyeSBmb3IgT0NhbWwuDQoNCiAgVGhl IGJpZyBjaGFuZ2UgaW4gdGhpcyByZWxlYXNlOiBvY3NpZ2VuLWkxOG4gaXMgbm8gbG9uZ2VyIHRp ZWQgdG8NCiAgRWxpb20uIEl0IGNhbiBub3cgYmUgdXNlZCBpbiAqYW55IE9DYW1sIHByb2plY3Qq LCB3aXRoIG9wdGlvbmFsDQogIGV4dGVuc2lvbnMgZm9yIFR5eG1sIGFuZCBFbGlvbSB3aGVuIHlv dSBuZWVkIHRoZW0uDQoNCiAgT2NzaWdlbi1pMThuIHdhcyBpbml0aWFsbHkgd3JpdHRlbiBieSBA c2Fnb3RjaCBmcm9tIEJlIFNwb3J0LiBUaGlzDQogIHJlbGVhc2UgaGFzIGJlZW4gbWFkZSBwb3Nz aWJsZSB0aGFua3MgdG8gdGhlIHdvcmsgb2YgW0hhYmliXSwgZnVuZGVkDQogIGJ5IFtJUklMTF0u DQoNCiAgICAgICAgb3BhbSBpbnN0YWxsIG9jc2lnZW4taTE4bg0KDQoNCltIYWJpYl0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9taGpkPg0KDQpbSVJJTExdIDxodHRwczovL3d3dy5pcmlsbC5vcmc+DQoN CkhvdyBpdCB3b3Jrcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg VHJhbnNsYXRpb25zIGFyZSB3cml0dGVuIGluIGEgcGxhaW4gKlRTViBmaWxlKiAob25lIGtleSBw ZXIgbGluZSwgb25lDQogIGNvbHVtbiBwZXIgbGFuZ3VhZ2UpOg0KDQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgZm9vICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgc2ltcGxlIGtleS4gICAgICAg IENlY2kgZXN0IHVuZSBjbMOpIHRvdXRlIHNpbXBsZS4NCiAg4pSCIGFfaHVtYW4gICAgICAgICAg ICAgYSBodW1hbiAgICAgICAgICAgICAgICAgICAgICB1biBodW1haW4NCiAg4pSCIGJhciAgICAg ICAgICAgICAgICAgSSBhbSB7e3h9fS4gICAgICAgICAgICAgICAgICBKZSBzdWlzIHt7eH19Lg0K ICDilIIgYmF6ICAgICAgICAgICAgICAgICBUaGVyZSB7e3tjP2FyZXx8aXMgYW59fX0gYXBwbGV7 e3tjP3N8fH19fSBoZXJlISAgSWwgeSBhIHt7e2M/ZGVzfHx1bmV9fX0gcG9tbWV7e3tjP3N8fH19 fSBpY2kgIQ0KICDilIIgYnUgICAgICAgICAgICAgICAgICBJIGFtIHt7eCAlc319ICh7e24gJWR9 fSkuICAgIEplIHN1aXMge3t4ICVzfX0gKHt7biAlZH19KS4NCiAg4pSU4pSA4pSA4pSA4pSADQoN CiAgVGhlIG1pbmktdGVtcGxhdGluZyBsYW5ndWFnZSBzdXBwb3J0czoNCg0KICDigKIgYHt7eH19 JyBhIHN0cmluZyB2YXJpYWJsZSBgfngnDQogIOKAoiBge3t4ICVkfX0nIGEgdHlwZWQgdmFyaWFi bGUgdXNpbmcgdGhlIGdpdmVuIGZvcm1hdCBzcGVjaWZpZXINCiAg4oCiIGB7e3tjP3llc3x8bm99 fX0nIGFuIG9wdGlvbmFsIGJvb2xlYW4gYD9jJyBzd2l0Y2hpbmcgYmV0d2VlbiB0d28NCiAgICBz dHJpbmdzDQoNCiAgVGhlbiBpbiB5b3VyIGNvZGUsIGEgKlBQWCBleHRlbnNpb24qIHR1cm5zIGBb JWkxOG4ga2V5XScgaW50byB0aGUNCiAgcmlnaHQgY2FsbDoNCg0KICDilIzilIDilIDilIDilIAN CiAg4pSCIHByaW50X2VuZGxpbmUgWyVpMThuIGZvb107DQogIOKUgiBwcmludF9lbmRsaW5lIFsl aTE4biBiYXIgfng6WyVpMThuIGFfaHVtYW5dXTsNCiAg4pSCIHByaW50X2VuZGxpbmUgWyVpMThu IGJheiB+YzoobmIgPiAxKV07DQogIOKUgiBwcmludF9lbmRsaW5lIFslaTE4biBidSB+eDoiSmVh bi1NaWNoZWwiIH5uOjQyXTsNCiAg4pSCIA0KICDilIIgKCogU3dpdGNoaW5nIGxhbmd1YWdlIGV4 cGxpY2l0bHkgKikNCiAg4pSCIHByaW50X2VuZGxpbmUgWyVpMThuIGZvbyB+bGFuZzpNeV9pMThu LkZyXTsNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhlIGN1cnJlbnQgbGFuZ3VhZ2UgaXMgaGVs ZCBpbiBhIG11dGFibGUgcmVmZXJlbmNlIHlvdSBjYW4gc3dhcCAob3INCiAgcmVwbGFjZSB3aXRo IGFuIEVsaW9tIHNjb3BlZCByZWZlcmVuY2UgaWYgeW91IG5lZWQgcGVyLXNlc3Npb24vdGFiDQog IGxhbmd1YWdlcykuDQoNCg0KRHVuZSBpbnRlZ3JhdGlvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIHRvb2wgcGx1Z3MgaW50byBEdW5l IHZlcnkgbmF0dXJhbGx5LiBHZW5lcmF0ZSB0aGUgT0NhbWwgbW9kdWxlDQogIGZyb20geW91ciBU U1YgZmlsZSB3aXRoIGEgcnVsZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIChydWxlDQog IOKUgiAgKHRhcmdldCBleGFtcGxlX2kxOG4ubWwpDQogIOKUgiAgKGRlcHMgZXhhbXBsZV9pMThu LnRzdikNCiAg4pSCICAoYWN0aW9uDQogIOKUgiAgIChydW4gJXtiaW46b2NzaWdlbi1pMThufSAt LWxhbmd1YWdlcyBlbixmciAtLWlucHV0LWZpbGUgJXtkZXBzfQ0KICDilIIgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLS1vdXRwdXQtZmlsZSAle3RhcmdldH0pKSkNCiAg4pSU4pSA4pSA4pSA 4pSADQoNCiAgQW5kIHdpcmUgdGhlIFBQWCBpbiB5b3VyIGxpYnJhcnkvZXhlY3V0YWJsZToNCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIChwcmVwcm9jZXNzIChwcHMgb2NzaWdlbi1pMThuIC0t IC0tZGVmYXVsdC1tb2R1bGUgRXhhbXBsZV9pMThuKSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg VGhhdOKAmXMgYWxsIHlvdSBuZWVkIGZvciBhIHBsYWluIE9DYW1sIHByb2plY3QuDQoNCg0KVHl4 bWwgc3VwcG9ydA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg UGFzcyBgLS10eXhtbCcgdG8gdGhlIGdlbmVyYXRvciBhbmQgdGhlIHNhbWUgYFslaTE4biBrZXld JyBleHByZXNzaW9uDQogIG5vdyBwcm9kdWNlcyBhICpsaXN0IG9mIFR5eG1sIEhUTUwgZWxlbWVu dHMqIGluc3RlYWQgb2YgYSBzdHJpbmc6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoKiBC dWlsZHMgYW4gSFRNTCBmcmFnbWVudCwgcmVhZHkgdG8gZHJvcCBpbnRvIGEgVHl4bWwgdHJlZSAq KQ0KICDilIIgbGV0IGdyZWV0aW5nID0gWyVpMThuIGJhciB+eDpbJWkxOG4gYV9odW1hbl1dDQog IOKUlOKUgOKUgOKUgOKUgA0KDQogIFZhcmlhYmxlcyBjYW4gdGhlbXNlbHZlcyBiZSBsaXN0cyBv ZiBIVE1MIG5vZGVzLCBzbyB5b3UgY2FuIG1peA0KICB0cmFuc2xhdGVkIHRleHQgd2l0aCBtYXJr dXAgbmF0dXJhbGx5Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgWyVpMThuIGJhciB+eDpb IHR4dCAiSmVhbi1NaWNoZWwgKCINCiAg4pSCICAgICAgICAgICAgICAgOyB0eHQgKHN0cmluZ19v Zl9pbnQgaWQpDQogIOKUgiAgICAgICAgICAgICAgIDsgdHh0ICIpIiBdXQ0KICDilJTilIDilIDi lIDilIANCg0KICBJZiB5b3UgbmVlZCBhIHBsYWluIHN0cmluZyBpbiBUeXhtbCBtb2RlIChmb3Ig YW4gYXR0cmlidXRlLCBmb3INCiAgaW5zdGFuY2UpLCBqdXN0IHByZWZpeCB3aXRoIGBTLic6DQoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBbJWkxOG4gUy5iYXIgfng6WyVpMThuIFMuYV9odW1h bl1dICAgKCogc3RyaW5nIG91dHB1dCAqKQ0KICDilJTilIDilIDilIDilIANCg0KDQpFbGlvbSBz dXBwb3J0DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBGb3Ig Y2xpZW504oCTc2VydmVyIEVsaW9tIGFwcHMsIHBhc3MgYC0tZWxpb20nLiBUaGUgZ2VuZXJhdG9y IGVtaXRzIGFuDQogIGAuZWxpb20nIGZpbGUgKHNvIHRoZSBzYW1lIHRyYW5zbGF0aW9ucyBhcmUg YXZhaWxhYmxlIG9uIGJvdGggc2lkZXMpLA0KICBpbXBsaWVzIGAtLXR5eG1sJywgYW5kIGFkZHMg YFtAQGRlcml2aW5nIGpzb25dJyBvbiB0aGUgbGFuZ3VhZ2UgdHlwZQ0KICBzbyB5b3UgY2FuIHNl cmlhbGlzZSBpdCBhY3Jvc3MgdGhlIHdpcmU6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAo cnVsZQ0KICDilIIgICh0YXJnZXQgZXhhbXBsZV9pMThuLmVsaW9tKQ0KICDilIIgIChkZXBzIGV4 YW1wbGVfaTE4bi50c3YpDQogIOKUgiAgKGFjdGlvbg0KICDilIIgICAocnVuICV7YmluOm9jc2ln ZW4taTE4bn0gLS1lbGlvbSAtLWxhbmd1YWdlcyBlbixmciAtLWlucHV0LWZpbGUgJXtkZXBzfQ0K ICDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1vdXRwdXQtZmlsZSAle3RhcmdldH0p KSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KTXVsdGlwbGUgVFNWIGZpbGVzDQrilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBZb3UgY2Fu IHNwbGl0IHRyYW5zbGF0aW9ucyBhY3Jvc3Mgc2V2ZXJhbCBmaWxlcy4gVGhlIFBQWCB1c2VzIHlv dXINCiAgbW9kdWxlIHBhdGggdG8gZmluZCB0aGUgcmlnaHQgb25lOg0KDQogIOKUjOKUgOKUgOKU gOKUgA0KICDilIIgWyVpMThuIGZvb10gICAgICAgICAgICAgICAgICAgICAgICAgICgqIGRlZmF1 bHQgbW9kdWxlICopDQogIOKUgiBbJWkxOG4gTXlJMThuLmZvb10gICAgICAgICAgICAgICAgICAg KCogTXlJMThuLmZvbyAqKQ0KICDilIIgWyVpMThuIE15STE4bi5TLmJhciB+eDpbJWkxOG4gUy5m b29dXQ0KICDilJTilIDilIDilIDilIANCg0KICBPcHRpb25hbCBgLS1wcmVmaXgnIC8gYC0tc3Vm Zml4JyBmbGFncyBsZXQgeW91IGtlZXAgY2FsbC1zaXRlcyBjb25jaXNlDQogIChgWyVpMThuIEZl YXR1cmUuZm9vXScg4oaSIGBQcl9GZWF0dXJlX2kxOG4uZm9vICgpJykuDQoNCiAg4oCUDQoNCiAg 4oCiIFNvdXJjZXM6IDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9vY3NpZ2VuLWkxOG4+DQog IOKAoiBEb2N1bWVudGF0aW9uOiBSRUFETUUgb24gdGhlIHJlcG8NCiAg4oCiIEJ1ZyByZXBvcnRz OiA8aHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vb2NzaWdlbi1pMThuL2lzc3Vlcz4NCg0KICBI YXBweSB0cmFuc2xhdGluZyENCg0KDQpBVEQgNC4xLjAgLSBub3cgd2l0aCBZQU1MIHN1cHBvcnQN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWF0ZC00LTEtMC1ub3ctd2l0aC15 YW1sLXN1cHBvcnQvMTc5ODIvMT4NCg0KDQpNYXJ0aW4gSmFtYm9uIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgW0FURF0gbm93IGhhcyBPQ2FtbCBzdXBwb3J0IGZvciBjb252ZW5pZW50bHkg cmVhZGluZyBkYXRhIGZyb20gWUFNTA0KICBmaWxlcyBhcyB3ZWxsIGFzIGZyb20gb3RoZXIgZm9y bWF0cyB3aXRoIG1pbmltYWwgZWZmb3J0LiBJdCBtZWFuczoNCg0KICAxLiBZb3UgZGVmaW5lIGEg W3R5cGUgZm9yIHlvdXIgY29uZmlnIGRhdGFdLg0KICAyLiBgYXRkbWwgLS1tb2RlIGpzb25saWtl IGFwcF9jb25maWcuYXRkJyBnZW5lcmF0ZXMgdGhlIE9DYW1sIGNvZGUNCiAgICAgdGhhdCBjb252 ZXJ0cyBhIEpTT04tbGlrZSBBU1QgY29udGFpbmluZyBzb3VyY2UgbG9jYXRpb25zIGludG8geW91 cg0KICAgICBjb25maWcgZGF0YSBzdHJ1Y3R1cmUuDQogIDMuIFtZb3VyIHByb2dyYW1dIGxvYWRz IGEgWUFNTCBmaWxlLCBjb252ZXJ0cyBpdCB0byBhIEpTT04tbGlrZSB0cmVlLA0KICAgICBhbmQg dGhlbiBjYWxscyB0aGUgZ2VuZXJhdGVkIGZ1bmN0aW9uIHRvIHRyYW5zbGF0ZSBpdCBpbnRvIGFu DQogICAgIE9DYW1sIGRhdGEgc3RydWN0dXJlLg0KICA0LiBZb3VyIGFwcGxpY2F0aW9uIHByaW50 cyB1c2VmdWwgZXJyb3IgbWVzc2FnZXMgaWYgdGhlIGNvbmZpZyBpcw0KICAgICBtYWxmb3JtZWQg b3IgaW5jb21wbGV0ZS4NCg0KICBBbiBbZXhhbXBsZV0gaXMgaW5jbHVkZWQgaW4gdGhlIGRpc3Ry aWJ1dGlvbi4gSXQgdXNlcyB0aGUgW3JlY2VudGx5DQogIHJlbGVhc2VkIFlBTUx4IGxpYnJhcnld Lg0KDQogIF9Ob3RlIHRoYXQgWUFNTHggbmVlZHMgZ2VuZXJvdXMgc3BvbnNvcnMgdG8gZnVuZCB0 aGUgd29yayB0aGF0IHdhcw0KICBkb25lIGFuZCBbdW5sb2NrIGEgcGVybWlzc2l2ZSBJU0MgbGlj ZW5zZV0gZm9yIGV2ZXJ5b25lLiBPciB5b3UgY2FuDQogIGFjY2VwdCB0aGUgdGVybXMgb2YgdGhl IFtBR1BMIGxpY2Vuc2VdIGlmIHlvdSdyZSBoYXBweSB0byBzaGFyZSB5b3VyDQogIGFwcGxpY2F0 aW9uJ3Mgc291cmNlIGNvZGUgd2l0aCB0aGUgdXNlcnMuXw0KDQogIE90aGVyIGlucHV0IGZpbGUg Zm9ybWF0cyBvciBvdGhlciBZQU1MIGxpYnJhcmllcyBjYW4gYmUgdXNlZCBzaW1pbGFybHkNCiAg d2l0aCBtaW5pbXVtIGVmZm9ydCBhcyBsb25nIGFzIHNvdXJjZSBsb2NhdGlvbnMgYXJlIGF2YWls YWJsZS4gRm9yDQogIHRoaXMsIHlvdSdsbCBuZWVkIFthIGJyaWRnZV0gdGhhdCBjb252ZXJ0cyB5 b3VyIEFTVCBpbnRvIHRoZQ0KICBbSlNPTi1saWtlIEFTVF0uDQoNCg0KW0FURF0gPGh0dHBzOi8v Z2l0aHViLmNvbS9haHJlZnMvYXRkPg0KDQpbdHlwZSBmb3IgeW91ciBjb25maWcgZGF0YV0NCjxo dHRwczovL2dpdGh1Yi5jb20vYWhyZWZzL2F0ZC9ibG9iL21hc3Rlci9hdGQteWFtbHgvZXhhbXBs ZXMvYXBwX2NvbmZpZy5hdGQ+DQoNCltZb3VyIHByb2dyYW1dDQo8aHR0cHM6Ly9naXRodWIuY29t L2FocmVmcy9hdGQvYmxvYi9tYXN0ZXIvYXRkLXlhbWx4L2V4YW1wbGVzL21haW4ubWw+DQoNCltl eGFtcGxlXSA8aHR0cHM6Ly9naXRodWIuY29tL2FocmVmcy9hdGQvYmxvYi9tYXN0ZXIvYXRkLXlh bWx4L2V4YW1wbGVzPg0KDQpbcmVjZW50bHkgcmVsZWFzZWQgWUFNTHggbGlicmFyeV0NCjxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXlhbWx4LXB1cmUtb2NhbWwteWFtbC0xLTItMS0x LWxpYnJhcnkvMTc5NzA+DQoNClt1bmxvY2sgYSBwZXJtaXNzaXZlIElTQyBsaWNlbnNlXQ0KPGh0 dHBzOi8vZ2l0aHViLmNvbS9tamFtYm9uL3lhbWx4L2Jsb2IvbWFpbi9GVU5ESU5HLm1kPg0KDQpb QUdQTCBsaWNlbnNlXQ0KPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dOVV9BZmZlcm9f R2VuZXJhbF9QdWJsaWNfTGljZW5zZT4NCg0KW2EgYnJpZGdlXQ0KPGh0dHBzOi8vZ2l0aHViLmNv bS9haHJlZnMvYXRkL2Jsb2IvbWFzdGVyL2F0ZC15YW1seC9zcmMvQXRkX3lhbWx4Lm1sPg0KDQpb SlNPTi1saWtlIEFTVF0NCjxodHRwczovL2dpdGh1Yi5jb20vYWhyZWZzL2F0ZC9ibG9iL21hc3Rl ci9hdGQtanNvbmxpa2Uvc3JjL0FTVC5tbGk+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1l IGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29r IGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0K DQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlv dSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0 XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2hu aXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Y3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlh LmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC8+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 April 07 to 14, 2026.

Call for presentations: Caml in the Capital II

Sacha Ayoun announced

Hi everyone :waving_hand:

Following the success of the last event, we're organising a second edition = of Caml In the Capital (happening in London). From talking to the attendees= at the first event, we will be doing shorter talks and more socialising = =F0=9F=8D=95

So far, we are aiming for May 14th, to be confirmed once we have sec= ured a venue. Please let us know if this is clashing with another big event= off our radar.

Once we confirm the date and presentations, we'll post here and on the dedi= cated Zulip channel as well as our website.

Call for presentations

We're looking for talks that are of interest to the entire OCaml community. Topics includes (but are not limited to):

  • OCaml tooling (build systems, package management, lsp, documentation&he= llip;)
  • The cool library you're working on
  • Your OCaml-related research (as long as you make it accessible for peop= le outside your field)
  • Some piece of the OCaml ecosystem that you'd like people to hear about = (ocaml.org, the OCaml Software Foundation, …)
  • Your industrial use of OCaml
  • etc.

If you=E2=80=99d like to give a talk, please message me or @Alistair direct= ly with a title and short abstract.

List your open OCaml positions on the OCaml.org job board

Continuing this thread, VikasK announced

I would like to post this job that we are hiring for.

YAMLx: pure-OCaml YAML 1.2/1.1 library

Martin Jambon announced

Hello,

I'm excited to announce the availability of YAMLx, a complete implementation of the YAML 1.2 and 1.1 = standards. It is intended to support most uses of YAML including its use as= a configuration file format in new applications and analyzing YAML files o= f other applications.

For a fuller description, check out the release notes.

Get started with opam install yamlx. Then use the yamlx<= /code> companion command to check that it parses and interprets your favori= te YAML files correctly.

Here's an example showing the use of the library to convert YAML to JSON:

(* R=
ead YAML from stdin with YAMLx, print JSON to stdout with Yojson

   This is a demo showing how to use the YAMLx library with the default
   settings. 'YAMLx.Values.one_of_yaml_exn' offers options to restrict
   the input language or to force the interpretation as YAML 1.1 instead of
   YAML 1.2.

   Compile with:
     ocamlfind opt -o yaml-to-json \
       -package yamlx,yojson -linkpkg yaml_to_json.ml
*)

open Printf

let rec yojson_of_yamlx (x :<=
span style=3D"color: #444fcf; font-weight: bold;"> YAMLx.value) : Yojson.Safe.t =3D
  match x with
  | Null _ -> `Null
  | Bool (_, x) -> `Bool x
  | Int (_, x) -> `Intlit (Int64.to_string x)
  | Float (_, x) -> `Float x
  | String (_, x) -> `String x
  | Seq (_, xs) -> `List (List.map yojson_of_yamlx xs)
  | Map (_, xs) ->
      `Assoc (List.map (fun (loc, k, match (k =
: YAMLx.value) with
        | String (_, k) -> (k, yo=
json_of_yamlx v)
        | _ ->
            ksprintf fai=
lwith "%s: only string keys are supp=
orted"
              (YAMLx.default_format_loc loc)
      ) xs)

let () =3D
  YAMLx.register_=
exception_printers ();
  stdin
  |> In_channel.input_all
  |> YAMLx.Values.one_of_yaml_exn
  |> yojson_of_yamlx
  |> Yojson.Safe.pretty_to_channel stdout
  |> print_newline

Funding

YAMLx is currently released under the AGPL. There is an ongoing fund= raiser: once a funding goal is reached, the license will switch to the perm= issive ISC license for everyone. Donors above a certain threshold re= ceive an immediate commercial license. See my GitHub Sponsors profile for details.

ocaml-letsencrypt, an OCaml way to get TLS certificates

Calascibetta Romain announced

I am delighted to announce the release of ocaml-letsencrypt (version 2.1.0). This vers= ion introduces a new API that allows it to operate independently of a sched= uler and an HTTP client. It is also a rewrite using our brand-new jws library, which now utilises = the jsont library (rath= er than yojson).

ocaml-letsencrypt implements challenges needed to obtain a certificate v= ia the three ways: DNS, HTTP and ACME-TLS. It therefore enables a website d= eployment strategy (implemented with Vif, for example) to be provided entirely in OCaml.

We use it within our cooperative for projects such as:

  • dns-letsencrypt-secondary, a unikernel that acts as a second= ary DNS server capable of performing the DNS challenge for a specific domai= n and generating the certificate and private key. It generally works in tan= dem with our primary-git, our primary DNS server.
  • contruno= , a unikernel that acts as a TLS reverse proxy and is capable of perfor= ming HTTP challenges. The latter is currently being completely rewritten us= ing mnet.

Good luck with deploying your websites, and happy hacking! Here=E2=80=99s h= oping that jws also finds its place as a library within the OC= aml ecosystem.

OCaml YAML library

Continuing this thread, Martin Jambon announced

2026 update:=20

  • in December 2025, @avsm created a pure-OCaml YAML library in just one d= ay using an AI agent and wrote about it.
  • in April 2026, I did something similar and took the time to make it a c= omplete, production-grade 1.2/1.1 YAML library called YAMLx that I announced here.

I18n 5.0 =E2=80=94 Internationalisation made easy for any OCam= l app

Vincent Balat announced

The Ocsigen team is happy to announce the release of ocsigen-i18n 5.0, a small but practical internationalisation library for OCaml.

The big change in this release: ocsigen-i18n is no longer tied to Eliom. It= can now be used in any OCaml project, with optional extensions for = Tyxml and Eliom when you need them.

Ocsigen-i18n was initially written by @sagotch from Be Sport. This release = has been made possible thanks to the work of Habib, funded by IRILL.

opam install ocsigen-i18n

How it works

Translations are written in a plain TSV file (one key per line, one = column per language):

foo                 This is a simple key.        Ceci est une cl=C3=A9 tout=
e simple.
a_human             a human                      un humain
bar                 I am {{x}}.                  Je suis {{x}}.
baz                 There {{{c?are||is an}}} apple{{{c?s||}}} here!  Il y a=
 {{{c?des||une}}} pomme{{{c?s||}}} ici !
bu                  I am {{x %s}} ({{n %d}}).    Je suis {{x %s}} ({{n %d}}=
).

The mini-templating language supports:

  • {{x}} a string variable ~x
  • {{x %d}} a typed variable using the given format specifier=
  • {{{c?yes||no}}} an optional boolean ?c switch= ing between two strings

Then in your code, a PPX extension turns [%i18n key] in= to the right call:

print_endline [%i18n foo];
print_endline [%=
i18n bar ~x:[%i18n a_human]];
print_endline [%=
i18n baz ~c:(nb > 1)];
print_endline [%=
i18n bu ~x=
:"Jean-Michel" ~n:42];

(* Switching language explicitly *)
print_endline [%=
i18n foo ~lang:My_i18n.Fr];

The current language is held in a mutable reference you can swap (or replac= e with an Eliom scoped reference if you need per-session/tab languages).

Dune integration

The tool plugs into Dune very naturally. Generate the OCaml module from you= r TSV file with a rule:

(rule
 (target example_i18n.ml)
 (deps example_i18n.tsv)
 (action
  (run %{bin:ocsigen-i18n} --languages en,fr --input-file %{deps}
                           --output-file %{target})))

And wire the PPX in your library/executable:

(preprocess (pps ocsigen-i18n -- --defaul=
t-module Example_i18n))

That=E2=80=99s all you need for a plain OCaml project.

Tyxml support

Pass --tyxml to the generator and the same [%i18n key] expression now produces a list of Tyxml HTML elements instead = of a string:

(* B=
uilds an HTML fragment, ready to drop into a Tyxml tree *)
let greeting =3D [%i18n bar ~x:[%i18n =
a_human]]

Variables can themselves be lists of HTML nodes, so you can mix translated = text with markup naturally:

[%i18n bar ~x:[ txt "Jean-Michel (=
"
              ; txt (string_of_int id)
              ; txt ")" ]]

If you need a plain string in Tyxml mode (for an attribute, for instance), = just prefix with S.:

[%i18n S.bar ~x=
:[%i18n S.a_human]]   (* string output *)

Eliom support

For client=E2=80=93server Eliom apps, pass --eliom. The genera= tor emits an .eliom file (so the same translations are availab= le on both sides), implies --tyxml, and adds [@@deriving= json] on the language type so you can serialise it across the wire:

(rule
 (target example_i18n.eliom)
 (deps example_i18n.tsv)
 (action
  (run %{bin:ocsigen-i18n} --eliom --languages en,fr --input-file %{deps}
                           --output-file %{target})))

Multiple TSV files

You can split translations across several files. The PPX uses your module p= ath to find the right one:

[%i18n foo]                          (* default module *)
[%i18n MyI18n.foo]                 =
  (* MyI18n.foo *)
[%i18n MyI18n.S.bar ~x:[%i18n ]=

Optional --prefix / --suffix flags let you keep c= all-sites concise ([%i18n Feature.foo] =E2=86=92 Pr_Feat= ure_i18n.foo ()).

Happy translating!

ATD 4.1.0 - now with YAML support

Martin Jambon announced

ATD now has OCaml support for= conveniently reading data from YAML files as well as from other formats wi= th minimal effort. It means:

  1. You define a type for your config data.
  2. atdml --mode jsonlike app_config.atd generates the OCaml c= ode that converts a JSON-like AST containing source locations into your con= fig data structure.
  3. Your program loads a YAML file, converts it to a JSON-like tr= ee, and then calls the generated function to translate it into an OCaml dat= a structure.
  4. Your application prints useful error messages if the config is malforme= d or incomplete.

An example is included in the distribution. It uses the rece= ntly released YAMLx library.

Note that YAMLx needs generous sponsors to fund t= he work that was done and unlock a permissive ISC license for everyone. Or you c= an accept the terms of the AGPL license if you're happy to share your = application's source code with the users.

Other input file formats or other YAML libraries can be used similarly with= minimum effort as long as source locations are available. For this, you'll= need a bridge that converts your AST into the JSON-like AST<= /a>.

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.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmneDckbFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmcACgkQBA0KO07S5ceFRgf/XhNku8f9cofDMBVUDoGIqf2diQ/AHn0a5pfJhZeu 9XdpslfekVBIkViylQfn2qVPgRMbFLG4S7REQcVjp+T9uT3luhyTY7cVY29/7VuV sRg5wSG5SP+mvKWYtPint/RJjhsKVgo1V3PadSDqMu70++N5w0Hw0nIUtlf0+keI qjbgVSXCWMBkGkia6AupuaqLr33WCr4q2ABZ3YKKVl5sIR+As49YIbzfeQ6Se3d7 9K5pMOur9IvTCoQ66T8AWVAY9Awmbt3NeIG/IXauIFBORw3FfDI0vNQCggzJLeGk 75dWJ+QhJKt5X3dbimKngZIuvs9GPsh1wmi2gxyMkpChWA== =fpPG -----END PGP SIGNATURE----- --===-=-=--