Attn: Development Editor, Latest OCaml Weekly News
Alan Schmitt <[email protected]> Tue, 05 May 2026 11:35:53 +0200
| Newsgroups | gmane.comp.lang.caml.inria |
|---|---|
| Message-ID | <[email protected]> |
--===-=-=
Content-Type: multipart/mixed; boundary="=-=-="
--=-=-=
Content-Type: multipart/alternative; boundary="==-=-="
--==-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64
SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl
ZWsgb2YgQXByaWwgMjggdG8gTWF5DQowNSwgMjAyNi4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpPYyDi
gJQgYSBDYXJnby1saWtlIENMSSBmb3IgT0NhbWwgYmVnaW5uZXJzIChBSS1hc3Npc3RlZCwgZmVl
ZGJhY2sgdmVyeSB3ZWxjb21lKQ0KRHVuZSBQYWNrYWdlIE1hbmFnZW1lbnQgVXBkYXRlcw0KT0Nh
bWwgVXNlcnMgU3VydmV5IDIwMjYNCk9DYW1sIFdlYiB0dXRvcmlhbHMNClZhbGtleSAwLjMuMTog
Y2xpZW50LXNpZGUgY2FjaGluZywgYmxvY2tpbmcgcG9vbHMsIElBTSBhdXRoIGFuZCBtVExTDQpP
bGQgQ1dODQoNCg0KT2Mg4oCUIGEgQ2FyZ28tbGlrZSBDTEkgZm9yIE9DYW1sIGJlZ2lubmVycyAo
QUktYXNzaXN0ZWQsIGZlZWRiYWNrIHZlcnkgd2VsY29tZSkNCuKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6
DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2MtYS1jYXJnby1saWtlLWNsaS1mb3It
b2NhbWwtYmVnaW5uZXJzLWFpLWFzc2lzdGVkLWZlZWRiYWNrLXZlcnktd2VsY29tZS8xODAyMC8x
Pg0KDQoNCkVtaWwgS2xvZWRlbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25l
LA0KDQogIEknbSBhIG5ld2NvbWVyIHRvIE9DYW1sLCBhbmQgb25lIG9mIHRoZSB0aGluZ3MgdGhh
dCBoYXMgc2xvd2VkIG1lIGRvd24NCiAgaXMgdGhlIHRvb2xpbmcgc2V0dXA6IHVuZGVyc3RhbmRp
bmcgb3BhbSBzd2l0Y2hlcywgcmVtZW1iZXJpbmcgdG8NCiAgYGV2YWwgJChvcGFtIGVudiknLCBr
bm93aW5nIHdoZW4gdG8gcmVnZW5lcmF0ZSBgLm9wYW1+ZmlsZXMuIFNvDQogICh0b2dldGhlciB3
aXRoIENsYXVkZSBDb2RlKSBJIGJ1aWx0IH5vYycgLSBhIHNtYWxsIENMSSB0aGF0IHdyYXBzDQog
IGBvcGFtJyBhbmQgYGR1bmUnIGFuZCBnaXZlcyB0aGVtIGEgQ2FyZ28tIG9yIHV2LWxpa2UgaW50
ZXJmYWNlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb2MgbmV3IG15X2FwcCAjIHNjYWZm
b2xkIHByb2plY3QgKyBpbml0aWFsaXNlIGlzb2xhdGVkIHN3aXRjaA0KICDilIIgb2MgYWRkIHlv
anNvbiAjIGFkZCBkZXBlbmRlbmN5LCB1cGRhdGUgb2MudG9tbCwgaW5zdGFsbA0KICDilIIgb2Mg
YnVpbGQgIyBlbnN1cmUgZGVwcywgZHVuZSBidWlsZA0KICDilIIgb2MgcnVuICMgZW5zdXJlIGRl
cHMsIGR1bmUgZXhlYw0KICDilJTilIDilIDilIDilIANCg0KICBObyBgb3BhbSBzd2l0Y2ggY3Jl
YXRlJywgbm8gYGV2YWwgJChvcGFtIGVudiknLCBubyBoYW5kLWVkaXRpbmcNCiAgYC5vcGFtJyBm
aWxlcy4NCg0KDQpXaGF0IGl0IGlzOg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
DQoNCiAgQSBzbWFsbCwgdGhpbiBvcmNoZXN0cmF0aW9uIGxheWVyIHdpdGggbm8gZGVwZW5kZW5j
aWVzIGJleW9uZCBvcGFtIGFuZA0KICBkdW5lIHRoZW1zZWx2ZXMuIEl0IGNhbGxzIG9wYW0gdG8g
bWFuYWdlIHN3aXRjaGVzIGFuZCByZXNvbHZlDQogIHBhY2thZ2VzLCBhbmQgZHVuZSB0byBidWls
ZCAtIHdyYXBwaW5nIHRoZSB0b29scyB0aGUgY29tbXVuaXR5IGFscmVhZHkNCiAgdXNlcyBhbmQg
dHJ1c3RzIHJhdGhlciB0aGFuIHJlcGxhY2luZyB0aGVtLiBJdCBkZWxpYmVyYXRlbHkgZG9lcyBs
ZXNzOg0KICBpZiB5b3Ugd2FudCBmdWxsIGNvbnRyb2wgb3ZlciB5b3VyIGVudmlyb25tZW50LCBv
cGFtIGdpdmVzIHlvdSB0aGF0DQogIGRpcmVjdGx5Lg0KDQoNCldoYXQgaXQgaXNuJ3Q6DQrilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBBIHJlcGxhY2VtZW50
IGZvciBvcGFtIG9yIGR1bmUuIFRoZSBpbnRlbnRpb24gaXMgdG8gb2ZmZXIgYSBzaW1wbGVyDQog
IHN1cmZhY2UgZm9yIHRob3NlIHdobyBwcmVmZXIgaXQsIHdoZXRoZXIgeW91J3JlIGp1c3Qgc3Rh
cnRpbmcgb3V0IG9yDQogIHlvdSd2ZSBiZWVuIHdyaXRpbmcgT0NhbWwgZm9yIHllYXJzIGFuZCB3
YW50IGxlc3MgY2VyZW1vbnkgZm9yDQogIGV2ZXJ5ZGF5IHRhc2tzLg0KDQoNCkEgbm90ZSBvbiBB
SSBhc3Npc3RhbmNlOg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSSBzaG91bGQgYmUgdXBmcm9udDog
dGhpcyBwcm9qZWN0IHdhcyBkZXZlbG9wZWQgYWxtb3N0IGVudGlyZWx5IHdpdGgNCiAgdGhlIGhl
bHAgb2YgQ2xhdWRlIENvZGUuIEkgd3JvdGUgdGhlIHNwZWNzLCBtYWRlIHRoZSBkZXNpZ24gZGVj
aXNpb25zLA0KICBhbmQgcmV2aWV3ZWQgZXZlcnl0aGluZyAtIGJ1dCB0aGUgY29kZSBpcyBhbG1v
c3QgZW50aXJlbHkNCiAgQUktZ2VuZXJhdGVkLiBJIHRoaW5rIHRoYXQncyB3b3J0aCBuYW1pbmcs
IGJvdGggZm9yIHRyYW5zcGFyZW5jeSBhbmQNCiAgYmVjYXVzZSBpdCdzIGFuIGludGVyZXN0aW5n
IGNhc2Ugc3R1ZHkgaW4gd2hhdCBBSS1hc3Npc3RlZCBkZXZlbG9wbWVudA0KICBsb29rcyBsaWtl
IGZvciBhIHNtYWxsIHRvb2wuDQoNCg0KUHJpb3IgYXJ0Og0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM
4pWM4pWM4pWMDQoNCiAgSSdtIGF3YXJlIG9mIGEgZmV3IHNpbWlsYXIgZWZmb3J0cy4gYGVzeScg
aXMgdGhlIGNsb3Nlc3QgaW4gc3Bpcml0IC0NCiAgc2FuZGJveGVkIGJ1aWxkcywgYSBsb2NrIGZp
bGUsIGEgc2ltcGxlciBtYW5pZmVzdCAtIGJ1dCBpdCBtYWtlcyBzb21lDQogIGRpZmZlcmVudCBj
aG9pY2VzOiBpdCByZXF1aXJlcyBOb2RlLmpzIChgbnBtIGluc3RhbGwgLWcgZXN5JykgYW5kDQog
IGJyaW5ncyBpdHMgb3duIGRlcGVuZGVuY3kgcmVzb2x2ZXIgcmF0aGVyIHRoYW4gZGVsZWdhdGlu
ZyB0bw0KICBvcGFtLiBgb2MnIGlzIGEgbmFycm93ZXIgdG9vbDogbm8gYWRkaXRpb25hbCBydW50
aW1lIGRlcGVuZGVuY2llcywNCiAgc3RheXMgb24gdG9wIG9mIHN0YW5kYXJkIG9wYW0gYW5kIGR1
bmUsIGFuZCB0cmFkZXMgcG93ZXIgZm9yDQogIHNpbXBsaWNpdHkufiBkdW5lIGluaXQgcHJvamVj
dH4gaGFuZGxlcyBzY2FmZm9sZGluZyBidXQgbGVhdmVzIHN3aXRjaA0KICBtYW5hZ2VtZW50IHRv
IHlvdS4gb3BhbSdzIG93biBsb2NhbCBzd2l0Y2hlcyAoYG9wYW0gc3dpdGNoIGNyZWF0ZQ0KICAu
IDUuMi4wJykgYXJlIGVzc2VudGlhbGx5IHdoYXQgYG9jJyBhdXRvbWF0ZXMsIGJ1dCB5b3Ugc3Rp
bGwgaGF2ZSB0bw0KICBkcml2ZSB0aGVtIG1hbnVhbGx5LiBJZiB0aGVyZSdzIHNvbWV0aGluZyBJ
J3ZlIG1pc3NlZCB0aGF0IGFscmVhZHkNCiAgc29sdmVzIHRoaXMgY2xlYW5seSwgSSdkIGdlbnVp
bmVseSBsaWtlIHRvIGtub3cuDQoNCg0KV2h5IG5vdCBqdXN0IHNoZWxsIGFsaWFzZXM/DQrilYzi
lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYwNCg0KICBZb3UgcHJvYmFibHkgY291bGQgZ2V0IGNsb3NlIHdp
dGggYSBmZXcgc2hlbGwgZnVuY3Rpb25zLiBUaGUgcmVhc29ucyBJDQogIHdlbnQgZnVydGhlcjog
YSBjcm9zcy1wbGF0Zm9ybSBiaW5hcnkgbmVlZHMgbm8gc2hlbGwgc2V0dXAsIHRoZQ0KICBsb2Nr
ZmlsZSBnaXZlcyByZXByb2R1Y2libGUgYnVpbGRzIGFjcm9zcyBtYWNoaW5lcywgYW5kIGhhdmlu
ZyBhDQogIHNpbmdsZSBgb2MudG9tbCcgYXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBpcyBjbGVhbmVy
IHRoYW4gcmVtZW1iZXJpbmcNCiAgd2hpY2ggb3BhbSBjb21tYW5kcyB0byBydW4uIFdoZXRoZXIg
dGhhdCdzIHdvcnRoIGl0IGlzIGEgZmFpcg0KICBxdWVzdGlvbi4NCg0KDQpXaHkgR28sIG5vdCBP
Q2FtbDoNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjA0KDQogIFBhcnRseSB0aGUgYm9vdHN0cmFwcGluZyBwcm9ibGVtIOKAlCBpdCBmZWx0IG9k
ZCB0byB3cml0ZSBhIHRvb2wgdGhhdA0KICBoZWxwcyB5b3Ugc2V0IHVwIE9DYW1sIGJlZm9yZSB5
b3UgY2FuIHNldCB1cCBPQ2FtbC4gTW9yZSBwcmFjdGljYWxseSwNCiAgR28gbWFkZSBpdCBlYXN5
IHRvIHNoaXAgYSBzaW5nbGUgc3RhdGljIGJpbmFyeSB3aXRoIG5vIHJ1bnRpbWUNCiAgZGVwZW5k
ZW5jaWVzLCBhbmQgaXQgbGV0IG1lIGJ1aWxkIGFuZCBpdGVyYXRlIG9uIHRoZSB0b29sIHF1aWNr
bHkuIEknbQ0KICBub3QgYWdhaW5zdCBhIHBvcnQgdG8gT0NhbWwgaWYgc29tZW9uZSB3YW50ZWQg
dG8gdGFrZSB0aGF0IG9uLg0KDQoNCkN1cnJlbnQgc3RhdGU6DQrilYzilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUgdG9vbCB3b3JrcyBmb3IgbXkgcGVyc29u
YWwgdXNlLCBoYXMgYSB0ZXN0IHN1aXRlLCBhIGxvY2tmaWxlLCBhbmQNCiAgYmFzaWMgQ0kuIEl0
J3Mgcm91Z2ggYXJvdW5kIHRoZSBlZGdlcyBhbmQgSSdtIHN1cmUgdGhlcmUgYXJlIHRoaW5ncw0K
ICB0aGF0IHdvdWxkIG1ha2UgYW4gZXhwZXJpZW5jZWQgT0NhbWwgZGV2ZWxvcGVyIHdpbmNlLiBU
aGF0J3MgcGFydCBvZg0KICB3aHkgSSdtIHBvc3RpbmcgLSBJJ2QgZ2VudWluZWx5IHZhbHVlIGZl
ZWRiYWNrIG9uOg0KICDigKIgRG9lcyB0aGlzIHNvbHZlIGEgcmVhbCBwcm9ibGVtLCBvciBkb2Vz
IHRoZSBjb21tdW5pdHkgaGF2ZSBiZXR0ZXINCiAgICBhbnN3ZXJzIEkgbWlzc2VkPw0KICDigKIg
QXJlIHRoZXJlIGNvcnJlY3RuZXNzIGlzc3VlcyB3aXRoIGhvdyBgb2MnIG1hbmFnZXMgc3dpdGNo
ZXMgb3INCiAgICBnZW5lcmF0ZXMgYC5vcGFtJyBmaWxlcz8NCiAg4oCiIFdoYXQncyBtaXNzaW5n
IGJlZm9yZSB0aGlzIHdvdWxkIGJlIHVzZWZ1bCB0byB5b3U/DQoNCiAgVGhlIGhvbWVwYWdlIGlz
IGF0IFtlbWlsa2xvZWRlbi5naXRodWIuaW8vb2MgXSBhbmQgdGhlIHNvdXJjZSBpcyBhdA0KICBb
Z2l0aHViLmNvbS9lbWlsa2xvZWRlbi9vY10uDQoNCiAgVGhhbmtzIGZvciByZWFkaW5nIGFuZCBJ
IGxvb2sgZm9yd2FyZCB0byB5b3VyIGZlZWRiYWNrLg0KDQoNCltlbWlsa2xvZWRlbi5naXRodWIu
aW8vb2MgXSA8aHR0cHM6Ly9lbWlsa2xvZWRlbi5naXRodWIuaW8vb2M+DQoNCltnaXRodWIuY29t
L2VtaWxrbG9lZGVuL29jXSA8aHR0cHM6Ly9naXRodWIuY29tL2VtaWxrbG9lZGVuL29jPg0KDQoN
CkR1bmUgUGFja2FnZSBNYW5hZ2VtZW50IFVwZGF0ZXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn
L3QvZHVuZS1wYWNrYWdlLW1hbmFnZW1lbnQtdXBkYXRlcy8xODAyMy8xPg0KDQoNClNob24gYW5u
b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBI
ZWxsbyEgVGhlIFRhcmlkZXMgdGVhbSBpcyB3cml0aW5nIHRvIHNoYXJlIHVwZGF0ZXMgb24gRHVu
ZSBwYWNrYWdlDQogIG1hbmFnZW1lbnQuDQoNCg0KQ29udGV4dA0K4pWM4pWM4pWM4pWM4pWM4pWM
4pWMDQoNCiAgRHVuZSBwYWNrYWdlIG1hbmFnZW1lbnQgYWltcyB0byBpbXByb3ZlIHNvbWUgZGV2
ZWxvcGVyIHdvcmtmbG93cyBieQ0KICBzaW1wbGlmeWluZyB0aGUgdXNlIG9mIG9wYW0gZGVwZW5k
ZW5jaWVzIGluIHByb2plY3RzIGJ1aWx0IHdpdGgNCiAgRHVuZS4gVG8gbGVhcm4gbW9yZSwgc2Vl
IHRoZSB0dXRvcmlhbCwgW09DYW1sIFBhY2thZ2UgTWFuYWdlbWVudCBXaXRoDQogIER1bmVdLg0K
DQogIEl04oCZcyBiZWVuIHRvbyBsb25nIHNpbmNlIHdlIHNoYXJlZCBhbiB1cGRhdGUsIGVzcGVj
aWFsbHkgY29uc2lkZXJpbmcNCiAgb3VyIGdyYXRpdHVkZSBmb3IgW2FsbCB0aGUgZXhjZWxsZW50
IGZlZWRiYWNrXSB3ZSBoYXZlIHJlY2VpdmVkLiBCdXQNCiAgRHVuZSBjb250cmlidXRvcnMgaGF2
ZSBiZWVuIGhhcmQgYXQgd29yayBbZml4aW5nIGlzc3Vlc10gYW5kIHNvbHZpbmcNCiAgdHJpY2t5
IGFyY2hpdGVjdHVyYWwgc25hZ3MgcHJlc2VudCBpbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uLg0K
DQoNCltPQ2FtbCBQYWNrYWdlIE1hbmFnZW1lbnQgV2l0aCBEdW5lXQ0KPGh0dHBzOi8vZHVuZS5y
ZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvdHV0b3JpYWxzL2R1bmUtcGFja2FnZS1tYW5hZ2VtZW50
L2luZGV4Lmh0bWw+DQoNClthbGwgdGhlIGV4Y2VsbGVudCBmZWVkYmFja10NCjxodHRwczovL2dp
dGh1Yi5jb20vb2NhbWwvZHVuZS9pc3N1ZXM/cT1pcyUzQWlzc3VlJTIwc3RhdGUlM0FvcGVuJTIw
bGFiZWwlM0ElMjJwYWNrYWdlJTIwbWFuYWdlbWVudCUyMj4NCg0KW2ZpeGluZyBpc3N1ZXNdDQo8
aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbHM/cT1pcyUzQXByK3BrZytpcyUzQWNs
b3NlZD4NCg0KDQpBdmFpbGFibGUgbm93DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi
lYzilYzilYwNCg0KICBUaGFua3MgdG8gbWFueSBjb250cmlidXRvcnMsIHRoZSBmb2xsb3dpbmcg
ZnVuY3Rpb25hbGl0aWVzIGFyZQ0KICBhdmFpbGFibGUgb24gTGludXggYW5kIE1hY09TIGluIHRo
ZSBsYXRlc3QgcmVsZWFzZSBvZiBEdW5lICgzLjIyKToNCg0KICDigKIgW21hbmFnaW5nIGRlcGVu
ZGVuY2llcyBwdWJsaXNoZWQgaW4gb3BhbSByZXBvc2l0b3JpZXNdICh0aGUgW3Zhc3QNCiAgICBt
YWpvcml0eSBvZiBvcGFtIHBhY2thZ2VzIGFyZSBzdXBwb3J0ZWRdLCBidXQgbm90IGFsbCkNCiAg
4oCiIFtwaW5uaW5nIGRlcGVuZGVuY2llcyAocmVjdXJzaXZlbHkpXQ0KICDigKIgW3N1cHBvcnQg
Zm9yIGN1c3RvbSBvcGFtLXJlcG9zaXRvcmllc10gKHdoaWNoLCBmb3IgZXhhbXBsZSwgY2FuIGJl
DQogICAgdXNlZCBmb3IgT3hDYW1sIHByb2plY3RzIGJ5IGZvbGxvd2luZyB0aGlzIFtkb2N1bWVu
dGVkIGNvbmZpZ3VyYXRpb24NCiAgICByZWNpcGVdKQ0KICDigKIgW2xvY2tpbmcgZGVwZW5kZW5j
eSB2ZXJzaW9uc10sIHRvIHByb3ZpZGUgYSByZXByb2R1Y2libGUgZW52aXJvbm1lbnQNCiAgICBm
b3IgZGV2ZWxvcGVycyBhbmQgQ0kgKHBvcnRhYmx5LCBhY3Jvc3Mgc3VwcG9ydGVkIHBsYXRmb3Jt
cykNCiAg4oCiIFtzdXBwb3J0IGZvciBtYW5hZ2luZyBzZWxlY3QgZGV2ZWxvcGVyIHRvb2xpbmdd
IChzaGFreSwgYnV0IHVzYWJsZQ0KICAgIG9uIHRoZSBoYXBweSBwYXRoKQ0KICDigKIgbW9zdCBy
ZWNlbnRseSwgd2XigJl2ZSBbYWRkZWQgc3VwcG9ydF0gZm9yIHRoZSBbcmVsb2NhdGFibGUgY29t
cGlsZXJdDQoNCiAgQWRkaXRpb25hbGx5LCB0aGUgZm9sbG93aW5nIHN1cHBvcnRpbmcgdXRpbGl0
aWVzIGFyZSBhdmFpbGFibGU6DQoNCiAg4oCiIFthIGJpbmFyeSBkaXN0cmlidXRpb24gZm9yIHN1
cHBvcnRlZCBwbGF0Zm9ybXNdIG9mZmVyaW5nIG5pZ2h0bHkNCiAgICBidWlsZHMgYW5kIHJlbGVh
c2VkIHZlcnNpb25zDQogIOKAoiBbc2V0dXAtZHVuZV0sIGEgR2l0SHViIGFjdGlvbiBlbmFibGlu
ZyBxdWljayBhbmQgZWFzeSBDSSBmb3INCiAgICBwcm9qZWN0cyB0aGF0IHVzZSBkdW5lIHBhY2th
Z2UgbWFuYWdlbWVudA0KDQoNClttYW5hZ2luZyBkZXBlbmRlbmNpZXMgcHVibGlzaGVkIGluIG9w
YW0gcmVwb3NpdG9yaWVzXQ0KPGh0dHBzOi8vZHVuZS5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUv
dHV0b3JpYWxzL2R1bmUtcGFja2FnZS1tYW5hZ2VtZW50L3NldHVwLmh0bWwjZGVjbGFyZS1kZXBl
bmRlbmNpZXM+DQoNClt2YXN0IG1ham9yaXR5IG9mIG9wYW0gcGFja2FnZXMgYXJlIHN1cHBvcnRl
ZF0NCjxodHRwczovL2R1bmUuY2hlY2suY2kuZGV2Lz4NCg0KW3Bpbm5pbmcgZGVwZW5kZW5jaWVz
IChyZWN1cnNpdmVseSldDQo8aHR0cHM6Ly9kdW5lLnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJsZS90
dXRvcmlhbHMvZHVuZS1wYWNrYWdlLW1hbmFnZW1lbnQvcGlubmluZy5odG1sPg0KDQpbc3VwcG9y
dCBmb3IgY3VzdG9tIG9wYW0tcmVwb3NpdG9yaWVzXQ0KPGh0dHBzOi8vZHVuZS5yZWFkdGhlZG9j
cy5pby9lbi9zdGFibGUvdHV0b3JpYWxzL2R1bmUtcGFja2FnZS1tYW5hZ2VtZW50L3JlcG9zLmh0
bWw+DQoNCltkb2N1bWVudGVkIGNvbmZpZ3VyYXRpb24gcmVjaXBlXQ0KPGh0dHBzOi8vZHVuZS5y
ZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvdHV0b3JpYWxzL2R1bmUtcGFja2FnZS1tYW5hZ2VtZW50
L294Y2FtbC5odG1sPg0KDQpbbG9ja2luZyBkZXBlbmRlbmN5IHZlcnNpb25zXQ0KPGh0dHBzOi8v
ZHVuZS5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvdHV0b3JpYWxzL2R1bmUtcGFja2FnZS1tYW5h
Z2VtZW50L2xvY2tpbmcuaHRtbD4NCg0KW3N1cHBvcnQgZm9yIG1hbmFnaW5nIHNlbGVjdCBkZXZl
bG9wZXIgdG9vbGluZ10NCjxodHRwczovL2R1bmUucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L3Jl
ZmVyZW5jZS9kdW5lLXRvb2xzLmh0bWw+DQoNClthZGRlZCBzdXBwb3J0XSA8aHR0cHM6Ly9naXRo
dWIuY29tL29jYW1sL2R1bmUvcHVsbC8xMzMyMT4NCg0KW3JlbG9jYXRhYmxlIGNvbXBpbGVyXQ0K
PGh0dHBzOi8vd3d3LmRyYTI3LnVrL2Jsb2cvcGxhdGZvcm0vMjAyNS8xMi8xNy9pdHMtbWVyZ2Vk
Lmh0bWw+DQoNClthIGJpbmFyeSBkaXN0cmlidXRpb24gZm9yIHN1cHBvcnRlZCBwbGF0Zm9ybXNd
DQo8aHR0cHM6Ly9uaWdodGx5LmR1bmUuYnVpbGQvPg0KDQpbc2V0dXAtZHVuZV0gPGh0dHBzOi8v
Z2l0aHViLmNvbS9vY2FtbC1kdW5lL3NldHVwLWR1bmU+DQoNCg0KQ3VycmVudCBzdGF0dXMgYW5k
IGZvY3VzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi
lYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGFua3MgdG8gc2V2ZXJhbCByZWd1bGFyIHVz
ZXJzIGluIHRoZSBjb21tdW5pdHkgYW5kIHVzYWdlIGluIG1hbnkgb2YNCiAgdGhlIENJIHN5c3Rl
bXMgd2UgbWFpbnRhaW4sIHdlIGFyZSBnYXRoZXJpbmcgb25nb2luZyBmZWVkYmFjayBhbmQNCiAg
ZXhlcmNpc2luZyB0aGUgY29yZSBmdW5jdGlvbmFsaXR5LiBIb3dldmVyLCBvdXIgdGVzdGluZyBo
YXMgc2hvd24gdGhlDQogIGZlYXR1cmVzIGFyZSBub3QgeWV0IG1hdHVyZSBlbm91Z2ggdG8gcmVj
b21tZW5kIHdpZGVyIHVzZSwgYmV5b25kDQogIGVhZ2VyIGFuZCBlYXJseSBhZG9wdGVycy4gQ29u
c2VxdWVudGx5LCBhbGwgdGhlIGRvY3VtZW50YXRpb24gd2FybnMNCiAgdGhhdCB0aGlzIGZ1bmN0
aW9uYWxpdHkgaXMgZXhwZXJpbWVudGFsIGFuZCBzdWJqZWN0IHRvIGNoYW5nZS4NCg0KICBXZSBh
cmUgY3VycmVudGx5IGZvY3VzZWQgb24gbWF0dXJpbmcgcGFja2FnZSBtYW5hZ2VtZW50IGJleW9u
ZCBpdHMNCiAgZXhwZXJpbWVudGFsIHN0YXR1cy4gVGhpcyByZXF1aXJlcyByZXdvcmtpbmcgdGhl
IGRldmVsb3BlciB0b29saW5nDQogIHN1cHBvcnQsIHN1cHBvcnRpbmcgcGFja2FnZXMgdGhhdCB1
c2Ugc3ltbGlua3MsIGFuZCBlbnN1cmluZyB3ZSBjYW4NCiAgZG9nZm9vZCBEdW5lIHBhY2thZ2Ug
bWFuYWdlbWVudCBpbiBpdHMgb3duIGRldmVsb3BtZW50LiBUaGUgYmVzdCBwbGFjZQ0KICB0byBs
b29rIGZvciB3aGF0IHdlIGhhdmUgcGxhbm5lZCBpbiB0aGlzIGN1cnJlbnQgcGhhc2UgaXMNCiAg
W05vbi1leHBlcmltZW50YWwgcGFja2FnZSBtYW5hZ2VtZW50IMK3IE1pbGVzdG9uZSAjNjIgwrcg
b2NhbWwvZHVuZV0uDQoNCg0KW05vbi1leHBlcmltZW50YWwgcGFja2FnZSBtYW5hZ2VtZW50IMK3
IE1pbGVzdG9uZSAjNjIgwrcgb2NhbWwvZHVuZV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv
ZHVuZS9taWxlc3RvbmUvNjI+DQoNCg0KTmV4dCAgdXANCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jA0KDQogIEFmdGVyIG1hdHVyaW5nIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHksIHdlIHdpbGwgdHVy
biBvdXIgZm9jdXMgdG8NCiAgZXh0ZW5kaW5nIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zIGFuZCBp
bXByb3ZpbmcgZWNvc3lzdGVtDQogIGludGVncmF0aW9uLiBUaGlzIHdvcmsgd2lsbCBpbmNsdWRl
IGFkZGluZyBzdXBwb3J0IGZvciBXaW5kb3dzLA0KICBpbXByb3ZpbmcgY3Jvc3MtY29tcGlsYXRp
b24sIHN1cHBvcnRpbmcgYWR2YW5jZWQgdmVuZG9yaW5nIHdvcmtmbG93cywNCiAgYW5kIGludGVn
cmF0aW5nIER1bmUgcGFja2FnZSBtYW5hZ2VtZW50IGludG8gdGhlICpvcGFtLWNpKi4gTW9yZQ0K
ICB1cGRhdGVzIGFuZCBtb3JlIGFjY2Vzc2libGUgcGxhbm5pbmcgd2lsbCBmb2xsb3cuDQoNCg0K
SW5wdXQgYW5kIGNvbnRyaWJ1dGlvbnMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV
jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFBsZWFzZSBbcmVhY2gg
b3V0XSBpZiB5b3UgZmluZCB0aGlzIHdvcmsgaW50ZXJlc3RpbmcgYW5kIHdvdWxkIGxpa2UgdG8N
CiAgaGVscCENCg0KDQpbcmVhY2ggb3V0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUv
YmxvYi9tYWluL0NPTlRSSUJVVElORy5tZD4NCg0KDQpPQ2FtbCBVc2VycyBTdXJ2ZXkgMjAyNg0K
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv
dC9hbm4tb2NhbWwtdXNlcnMtc3VydmV5LTIwMjYvMTgwMjYvMT4NCg0KDQpTYWJpbmUgU2NobWFs
dHogYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBldmVyeW9uZSwNCg0KICBP
biBiZWhhbGYgb2YgdGhlIFtPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uXSAoT0NTRiksIEknbSBk
ZWxpZ2h0ZWQgdG8NCiAgYW5ub3VuY2UgdGhlICpPQ2FtbCBVc2VycyBTdXJ2ZXkgMjAyNiouIFdl
IGludml0ZSB5b3UgdG8gdGFrZSAxMCB0byAxNQ0KICBtaW51dGVzIHRvIGZpbGwgaXQgb3V0IGFu
ZCB0byBzaGFyZSBpdCB3aXRoIG90aGVyIE9DYW1sIHByb2dyYW1tZXJzLg0KDQogICpTdXJ2ZXkg
bGluazoqIDxodHRwczovL2Zvcm1zLmdsZS9ndDVuaWtxVW1vUVdlWVlROT4NCg0KICA8aHR0cHM6
Ly9mb3Jtcy5nbGUvZ3Q1bmlrcVVtb1FXZVlZUTk+DQoNCiAgVGhlIHN1cnZleSB3aWxsIHJlbWFp
biBvcGVuIHVudGlsICpNYXkgMjV0aCwgMjAyNiAoQU9FKSouDQoNCiAgVGhpcyB5ZWFyJ3MgZWRp
dGlvbiBidWlsZHMgb24gdGhlIFsyMDIzIGl0ZXJhdGlvbl0uIE1hbnkgcXVlc3Rpb25zIGFyZQ0K
ICBrZXB0IGNvbXBhcmFibGUgc28gd2UgY2FuIHRyYWNrIHRyZW5kcyBvdmVyIHRpbWUsIHdoaWxl
IG90aGVycyBoYXZlDQogIGJlZW4gcmVmcmVzaGVkLCBmaXhlZCwgb3IgYWRkZWQgYmFzZWQgb24g
Y29tbXVuaXR5IGZlZWRiYWNrIGdhdGhlcmVkDQogIGVhcmxpZXIgdGhpcyB5ZWFyIChbZmVlZGJh
Y2sgdGhyZWFkXSkuIE5vdGFibGUgYWRkaXRpb25zIGluY2x1ZGUNCiAgcXVlc3Rpb25zIG9uIEFJ
L0xMTSB0b29saW5nIGFuZCBvbiBkZWJ1Z2dpbmcgJiBwcm9maWxpbmcuDQoNCiAgQSBmZXcgbm90
ZXM6DQoNCiAg4oCiIFRoZSBzdXJ2ZXkgaXMgYWRtaW5pc3RlcmVkIHZpYSBHb29nbGUgRm9ybXMg
YnV0IGNvbmZpZ3VyZWQgdG8gKm5vdCoNCiAgICByZXF1aXJlIHNpZ25pbmcgaW4gdG8gYSBHb29n
bGUgYWNjb3VudCwgYW5kIGFuc3dlcnMgYXJlIG5vdCB0aWVkIHRvDQogICAgYW55IGFjY291bnQu
IEFzIGEgY29uc2VxdWVuY2UsIHlvdXIgcHJvZ3Jlc3MgaXMgKm5vdCogc2F2ZWQgaWYgeW91DQog
ICAgY2xvc2UgeW91ciBicm93c2VyIHRhYiBiZWZvcmUgZmluaXNoaW5nLg0KICDigKIgQWxsIHF1
ZXN0aW9ucyBhcmUgb3B0aW9uYWwuDQogIOKAoiBQbGVhc2UgYXZvaWQgZW50ZXJpbmcgcGVyc29u
YWwgaW5mb3JtYXRpb24gaW4gZnJlZS1mb3JtIHRleHQgZmllbGRzOg0KICAgIHRoZSByYXcgcmVz
cG9uc2VzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGNvbW11bml0eSBhbG9uZ3NpZGUN
CiAgICB0aGUgc3VtbWFyeSByZXBvcnQuIFdlIHdpbGwgcmVkYWN0IHdoYXQgd2UgZGV0ZWN0LCBi
dXQgbWF5IG1pc3MNCiAgICBzb21lLg0KICDigKIgQXMgYW4gb2ZmaWNpYWwgT0NhbWwgb25saW5l
IHNwYWNlLCB0aGlzIHN1cnZleSBoYXMgYWRvcHRlZCB0aGUNCiAgICBbT0NhbWwgQ29kZSBvZiBD
b25kdWN0XS4NCg0KICBSZXN1bHRzIHdpbGwgYmUgcHVibGlzaGVkIG9uIHRoZSBPQ1NGIHdlYnNp
dGUgYW5kIGFubm91bmNlZCBoZXJlIG9uDQogIGRpc2N1c3Mub2NhbWwub3JnLg0KDQogIFRoYW5r
IHlvdSBpbiBhZHZhbmNlIGZvciB5b3VyIHBhcnRpY2lwYXRpb24sIGFuZCBwbGVhc2Ugc2hhcmUg
dGhlDQogIHN1cnZleSB3aWRlbHkhDQoNCiAg4oCTIFNhYmluZSBTY2htYWx0eiwgb24gYmVoYWxm
IG9mIHRoZSBPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uDQoNCg0KW09DYW1sIFNvZnR3YXJlIEZv
dW5kYXRpb25dIDxodHRwczovL29jYW1sLXNmLm9yZy8+DQoNClsyMDIzIGl0ZXJhdGlvbl0NCjxo
dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sLXVzZXItc3VydmV5LTIwMjMvMTM0
Njk+DQoNCltmZWVkYmFjayB0aHJlYWRdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Zl
ZWRiYWNrLXdhbnRlZC11cGNvbWluZy1vY2FtbC11c2Vycy1zdXJ2ZXktMjAyNi1xdWVzdGlvbnMv
MTc5MjU+DQoNCltPQ2FtbCBDb2RlIG9mIENvbmR1Y3RdIDxodHRwczovL29jYW1sLm9yZy9wb2xp
Y2llcy9jb2RlLW9mLWNvbmR1Y3Q+DQoNCg0KT0NhbWwgV2ViIHR1dG9yaWFscw0K4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj
aGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC13ZWItdHV0b3JpYWxzLzE4
MDM5LzE+DQoNCg0KRnLDqWTDqXJpYyBMb3llciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K
DQogIEkgaGF2ZSBzdGFydGVkIGEgc2VyaWVzIG9mIE9DYW1sIFdlYiB0dXRvcmlhbHMuIFRoZSBp
ZGVhIGlzIHRvIHRyeQ0KICBtdWx0aXBsZSBsaWJyYXJpZXMgYW5kIHNlZSBob3cgdGhleSBmaXQg
dG9nZXRoZXIuIChCdXQgdGhlIERyZWFtDQogIGZyYW1ld29yayBkb2N1bWVudCBhbmQgZXhhbXBs
ZSBzZXQgaXMgcXVpdGUgZ29vZCBlbm91Z2gsIEkgd2lsbCBub3QNCiAgcGFyYXBocmFzZSBpdCku
DQoNCiAgRm9yIHRoZSBtb21lbnQsIEkgaGF2ZSBvbmx5IHRyaWVkIGEgU2VydmVyIFNpZGUgUmVu
ZGVyaW5nLCBidXQgSSBwbGFuDQogIHRvIHRyeSBhIENsaWVudCBTaWRlIFJlbmRlcmluZyB3aGVy
ZSBPY3NpZ2VuIChhbmQgVmRvbSA/4oCmKSBjb3VsZCBiZQ0KICB3ZWxjb21lZC4NCg0KICBUaGUg
aWRlYSBpcyB0byBwcm9wb3NlIGEgZHVtbXkgYXBwbGljYXRpb24gdGhhdCB1c2Ugd2hhdCBtb3N0
IHBlb3BsZQ0KICB3b3VsZCBleHBlY3QgZnJvbSBhIFdlYiBGcmFtZXdvcmsgKGZvcm0gaGFuZGxp
bmcsIGRhdGFiYXNlIGFjY2Vzc2VzLA0KICDigKYpDQoNCiAgU2VlIFtPQ2FtIHdlYiB0dXRvcmlh
bHNdDQoNCg0KW09DYW0gd2ViIHR1dG9yaWFsc10gPGh0dHA6Ly9naXRodWIuY29tL0YtTG95ZXIv
T0NhbWxfV2ViX3R1dG8+DQoNCg0KQ2FsYXNjaWJldHRhIFJvbWFpbiB0aGVuIHN1Z2dlc3RlZA0K
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgWW91IGNh
biB0YWtlIGFuIGluc3BpcmF0aW9uIGZyb20gdGhlIHR1dG9yaWFsIHdlIG1hZGUgYWJvdXQgW2B2
aWYnXSwNCiAgaXQgc2hvd3MgeW91IHdlYnNvY2tldCBzdHVmZnMgYXQgdGhlIGVuZCBhbmQgaW5j
bHVkZSBgY2FxdGknIGFuZA0KICBgdHl4bWwnIDpzbGlnaHRfc21pbGU6DQoNCg0KW2B2aWYnXSA8
aHR0cHM6Ly9yb2J1ci1jb29wLmdpdGh1Yi5pby92aWYvPg0KDQoNClZhbGtleSAwLjMuMTogY2xp
ZW50LXNpZGUgY2FjaGluZywgYmxvY2tpbmcgcG9vbHMsIElBTSBhdXRoIGFuZCBtVExTDQrilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k
aXNjdXNzLm9jYW1sLm9yZy90L3ZhbGtleS0wLTMtMS1jbGllbnQtc2lkZS1jYWNoaW5nLWJsb2Nr
aW5nLXBvb2xzLWlhbS1hdXRoLWFuZC1tdGxzLzE4MDQxLzE+DQoNCg0KQXZpIEZlbmVzaCBhbm5v
dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lLA0KDQogIEkgd2FudGVkIHRvIHNoYXJlIHRoYXQg
YHZhbGtleS4wLjMuMScgaXMgbm93IG9uIG9wYW0uDQoNCiAgVGhpcyBpcyB0aGUgbmV4dCByZWxl
YXNlIGFmdGVyIHRoZSBgMC4yLjAnIGFubm91bmNlbWVudC4gVGhlIHNob3J0DQogIHZlcnNpb246
IGEgZmV3IG9mIHRoZSByb2FkbWFwIGl0ZW1zIGZyb20gdGhhdCBwb3N0IGFyZSBub3cgc2hpcHBl
ZCDigJQNCiAgY2xpZW50LXNpZGUgY2FjaGluZywgYmxvY2tpbmctY29tbWFuZCBwb29scywgSUFN
IGF1dGgsIGFuZCBtVExTLg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUN
CiAg4pSCIG9wYW0gaW5zdGFsbCB2YWxrZXkgZWlvX21haW4NCiAg4pSU4pSA4pSA4pSA4pSADQoN
CiAgUmVwbyBhbmQgZG9jczogPGh0dHBzOi8vZ2l0aHViLmNvbS9hdmlmZW5lc2gvb2NhbWwtdmFs
a2V5Pg0KDQogIFRoZSBsYXJnZXN0IG5ldyBmZWF0dXJlIGlzICpjbGllbnQtc2lkZSBjYWNoaW5n
Ki4NCg0KICBgdmFsa2V5JyBub3cgc3VwcG9ydHMgVmFsa2V5IGBDTElFTlQgVFJBQ0tJTkcnIHdp
dGggYSBib3VuZGVkDQogIGluLXByb2Nlc3MgTFJVIGNhY2hlLCBSRVNQMyBpbnZhbGlkYXRpb24g
cHVzaCBoYW5kbGluZywgc2luZ2xlLWZsaWdodA0KICBwcm90ZWN0aW9uLCBvcHRpb25hbCBUVEwg
c2FmZXR5IG5ldCwgYW5kIG1ldHJpY3MuIEl0IHdvcmtzIGluIGJvdGgNCiAgc3RhbmRhbG9uZSBh
bmQgY2x1c3RlciBtb2RlLCBhbmQgc3VwcG9ydHMgdGhlIHRocmVlIHRyYWNraW5nIHNoYXBlcyBJ
DQogIHdhbnRlZCB0byBjb3ZlcjoNCg0KICDigKIgZGVmYXVsdCB0cmFja2luZw0KICDigKIgYEJD
QVNUJyBwcmVmaXggdHJhY2tpbmcNCiAg4oCiIGBPUFRJTicgdHJhY2tpbmcNCg0KICBUaGUgY2x1
c3RlciBwYXRoIHdhcyB0aGUgdHJpY2t5IHBhcnQuIE9QVElOIHJlYWRzIG5lZWQgYENMSUVOVCBD
QUNISU5HDQogIFlFUycgdG8gc3RheSBhZGphY2VudCB0byB0aGUgYWN0dWFsIHJlYWQgb24gdGhl
IHdpcmUsIGluY2x1ZGluZyBhY3Jvc3MNCiAgTU9WRUQgLyBBU0sgcmVkaXJlY3RzLiBUaGF0IGlz
IG5vdyBoYW5kbGVkIGluc2lkZSB0aGUgY2xpZW50IHJhdGhlcg0KICB0aGFuIHB1c2hlZCBvbnRv
IGNhbGxlcnMuDQoNCiAgVGhlIHNlY29uZCBiaWcgYWRkaXRpb24gaXMgYSAqYmxvY2tpbmctY29t
bWFuZCBwb29sKi4NCg0KICBUaGUgbm9ybWFsIGNsaWVudCBpcyBzdGlsbCBidWlsdCBhcm91bmQg
bXVsdGlwbGV4ZWQgY29ubmVjdGlvbnMsIHdoaWNoDQogIGlzIHRoZSByaWdodCBzaGFwZSBmb3Ig
cmVndWxhciB0cmFmZmljLiBCdXQgY29tbWFuZHMgc3VjaCBhcyBgQkxQT1AnLA0KICBgQlJQT1An
LCBgQkxNT1ZFJywgYEJMTVBPUCcsIGBCWlBPUConLCBgWFJFQUQgQkxPQ0snLCBhbmQgYFhSRUFE
R1JPVVANCiAgQkxPQ0snIGFyZSBpbnRlbnRpb25hbGx5IGJsb2NraW5nIG9uIHRoZSBzZXJ2ZXIg
c2lkZS4gU2VuZGluZyBvbmUgb2YNCiAgdGhvc2UgdGhyb3VnaCB0aGUgbm9ybWFsIG11bHRpcGxl
eGVkIEZJRk8gY2FuIGZyZWV6ZSB1bnJlbGF0ZWQNCiAgcmVxdWVzdHMgcXVldWVkIGJlaGluZCBp
dC4NCg0KICBgMC4zLngnIGFkZHMgYSBuYXJyb3cgcGVyLW5vZGUgbGVhc2UgcG9vbCBmb3IgdGhv
c2UgY29tbWFuZHMuIEJsb2NraW5nDQogIGNhbGxzIGxlYXNlIGFuIGV4Y2x1c2l2ZSBjb25uZWN0
aW9uIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNvbW1hbmQsDQogIHdoaWxlIHJlZ3VsYXIgdHJh
ZmZpYyBjb250aW51ZXMgb24gdGhlIG5vcm1hbCBjbGllbnQuIFRoZSBwb29sIGlzDQogIGJvdW5k
ZWQsIGhhcyB0eXBlZCBlcnJvcnMsIGhhbmRsZXMgdG9wb2xvZ3kgY2hhbmdlcywgYW5kIGlzIG9m
ZiBieQ0KICBkZWZhdWx0IHVubGVzcyBjb25maWd1cmVkLg0KDQogIFRoZSB0aGlyZCBhZGRpdGlv
biBpcyAqSUFNIGF1dGggYW5kIG1UTFMqLg0KDQogIFRoZXJlIGlzIG5vdyBhIGZpcnN0LWNsYXNz
IGBDb25uZWN0aW9uLkF1dGgucHJvdmlkZXInIGFic3RyYWN0aW9uDQogIGluc3RlYWQgb2Ygb25s
eSBzdGF0aWMgdXNlcm5hbWUvcGFzc3dvcmQgY29uZmlnLiBUaGF0IG1lYW5zIGV2ZXJ5DQogIGlu
aXRpYWwgaGFuZHNoYWtlIGFuZCByZWNvbm5lY3QgY2FuIHB1bGwgZnJlc2ggY3JlZGVudGlhbHMg
ZnJvbSBhDQogIHByb3ZpZGVyLg0KDQogIE9uIHRvcCBvZiB0aGF0LCB0aGUgbGlicmFyeSBub3cg
aW5jbHVkZXM6DQoNCiAg4oCiIHB1cmUgT0NhbWwgQVdTIFNpZ1Y0IHNpZ25pbmcgZm9yIEVsYXN0
aUNhY2hlIElBTSBhdXRoDQogIOKAoiBhbiBhdXRvLXJlZnJlc2hpbmcgSUFNIHByb3ZpZGVyDQog
IOKAoiBgQ2xpZW50LmNvbm5lY3Rfd2l0aF9pYW0nDQogIOKAoiBsaXZlIGBBVVRIJyByZWZyZXNo
IHN1cHBvcnQNCiAg4oCiIG1UTFMgY2xpZW50IGNlcnRpZmljYXRlIGNvbmZpZ3VyYXRpb24gdmlh
DQogICAgYFRsc19jb25maWcud2l0aF9jbGllbnRfY2VydCcNCg0KICBUaGUgSUFNIHBhdGggZG9l
cyBub3QgZGVwZW5kIG9uIHRoZSBBV1MgU0RLLiBUaGUgc2lnbmVyIGlzIGltcGxlbWVudGVkDQog
IGluIE9DYW1sIGFuZCB0ZXN0ZWQgYWdhaW5zdCBBV1MgU2lnVjQgdGVzdCB2ZWN0b3JzLg0KDQog
IFRoZXJlIHdlcmUgYWxzbyBhIGZldyBjb3JyZWN0bmVzcyBhbmQgb3BlcmFiaWxpdHkgaW1wcm92
ZW1lbnRzOg0KDQogIOKAoiBPcGVuVGVsZW1ldHJ5IHNwYW5zIGZvciBjb25uZWN0LCBjbHVzdGVy
IGRpc2NvdmVyeSwgYW5kIHRvcG9sb2d5DQogICAgcmVmcmVzaA0KICDigKIgY2FjaGUgYW5kIGJs
b2NraW5nLXBvb2wgbWV0cmljIGJyaWRnZXMNCiAg4oCiIHRpZ2h0ZXIgVExTIC8gY29ubmVjdGlv
biBlcnJvciByZWRhY3Rpb24NCiAg4oCiIGJldHRlciBNT1ZFRCAvIEFTSyAvIHRvcG9sb2d5LXJl
ZnJlc2ggYmVoYXZpb3IgdW5kZXIgY2x1c3RlciBjaGFuZ2VzDQogIOKAoiBmaXhlcyBhcm91bmQg
V0FUQ0ggLyBNVUxUSSAvIEVYRUMgd2hlbiBzbG90IG93bmVyc2hpcCBjaGFuZ2VzIGR1cmluZw0K
ICAgIGFuIGF0b21pYyBmbG93DQogIOKAoiBtb3JlIHRlc3RzIGFyb3VuZCBDU0MgaW52YWxpZGF0
aW9uLCBjbHVzdGVyIG1pZ3JhdGlvbiwgYmxvY2tpbmctcG9vbA0KICAgIGJlaGF2aW9yLCBJQU0g
cmVmcmVzaCwgYW5kIG1UTFMgY29uZmlnDQoNCiAgYDAuMy4xJyBpdHNlbGYgaXMgYSBzbWFsbCBm
b2xsb3ctdXAgdG8gbWFrZSB0aGUgb3BhbSBzYW5kYm94IHRlc3RzDQogIGNsZWFuOiB0aGUgbVRM
UyBjb25maWcgdGVzdHMgbm93IHVzZSBjb21taXR0ZWQgdGVzdCBmaXh0dXJlcyBpbnN0ZWFkDQog
IG9mIGRlcGVuZGluZyBvbiBnZW5lcmF0ZWQgY2VydHMgZnJvbSB0aGUgbG9jYWwgZGV2ZWxvcG1l
bnQgc2NyaXB0cy4NCg0KICBUaGUgcHJvamVjdCBpcyBzdGlsbCBhbHBoYSwgYW5kIHRoZSBBUEkg
bWF5IHN0aWxsIGNoYW5nZSBiZWZvcmUgYDEuMCcsDQogIGJ1dCB0aGUgc3VyZmFjZSBpcyBnZXR0
aW5nIGNsb3NlciB0byB0aGUgc2hhcGUgSSBvcmlnaW5hbGx5IHdhbnRlZDogYW4NCiAgT0NhbWwg
NSAvIEVpby1uYXRpdmUgVmFsa2V5IGNsaWVudCB0aGF0IHRyZWF0cyBjbHVzdGVyIGJlaGF2aW9y
LA0KICBSRVNQMywgbW9kZXJuIFZhbGtleSBmZWF0dXJlcywgYW5kIHByb2R1Y3Rpb24gZmFpbHVy
ZSBtb2RlcyBhcw0KICBmaXJzdC1jbGFzcyBjb25jZXJucy4NCg0KICBJIHdvdWxkIGVzcGVjaWFs
bHkgYXBwcmVjaWF0ZSBmZWVkYmFjayBmcm9tIHBlb3BsZSB3aG8gdXNlIE9DYW1sIGluDQogIHBy
b2R1Y3Rpb24gb246DQoNCiAg4oCiIEFQSSBzaGFwZSBhbmQgbmFtaW5nDQogIOKAoiBFaW8gZXJn
b25vbWljcw0KICDigKIgZG9jcyBjbGFyaXR5DQogIOKAoiB3aGV0aGVyIHRoZSBjYWNoaW5nIC8g
YmxvY2tpbmctcG9vbCAvIElBTSBBUElzIGZlZWwgbmF0dXJhbA0KICDigKIgd2hhdCBzaG91bGQg
YmUgcHJpb3JpdGl6ZWQgYmVmb3JlIGAxLjAnDQoNCiAgTmV4dCB0aGluZ3Mgb24gdGhlIHJvYWRt
YXAgYXJlIHN0aWxsIFZhbGtleSBtb2R1bGUgc3VwcG9ydCDigJQgSlNPTiwNCiAgc2VhcmNoLCBi
bG9vbSDigJQgYW5kIGEgZGVlcGVyIHByZS1gMS4wJyBhdWRpdCBwYXNzLg0KDQogIElmIHlvdSB0
cnkgaXQsIEnigJlkIGxvdmUgdG8gaGVhciB3aGF0IGZlZWxzIGdvb2QsIHdoYXQgZmVlbHMgYXdr
d2FyZCwNCiAgYW5kIHdoYXQgaXMgbWlzc2luZy4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDi
lZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQg
bWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxv
b2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10u
DQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwg
eW91IG1heSBzdWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0KDQogIFtBbGFuIFNjaG1p
dHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVj
aG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5l
dC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0
ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0dHBzOi8vc3ltcGEuaW5y
aWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2Fs
YW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K
--==-=-=
Content-Type: text/html; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
<?xml version=3D"1.0" encoding=3D"utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml" lang=3D"en" xml:lang=3D"en">
<head>
<!-- 2026-05-05 Tue 11:34 -->
<meta http-equiv=3D"Content-Type" content=3D"text/html;charset=3Dutf-8" />
<meta name=3D"viewport" content=3D"width=3Ddevice-width, initial-scale=3D1"=
/>
<title>OCaml Weekly News</title>
<meta name=3D"generator" content=3D"Org Mode" />
<style type=3D"text/css">
#content { max-width: 60em; margin: auto; }
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #e6e6e6;
border-radius: 3px;
background-color: #f2f2f2;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: auto;
}
pre.src:before {
display: none;
position: absolute;
top: -8px;
right: 12px;
padding: 3px;
color: #555;
background-color: #f2f2f299;
}
pre.src:hover:before { display: inline; margin-top: 14px;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-authinfo::before { content: 'Authinfo'; }
pre.src-c:before { content: 'C'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'JavaScript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr {
font-size: smaller;
@supports (content: attr(data-linenr)) {
visibility: hidden;
&::before { content: attr(data-linenr); visibility: visible; }
}
}
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { }
</style>
<style type=3D"text/css">#table-of-contents h2 { display: none } .title { d=
isplay: none } .authorname { text-align: right }</style>
<style type=3D"text/css">.outline-2 {border-top: 1px solid black;}</style>
</head>
<body>
<div id=3D"content" class=3D"content">
<h1 class=3D"title">OCaml Weekly News</h1>
<p>
<a href=3D"https://alan.petitepomme.net/cwn/2026.04.28.html">Previous Week<=
/a> <a href=3D"https://alan.petitepomme.net/cwn/index.html">Up</a> <a href=
=3D"https://alan.petitepomme.net/cwn/2026.05.12.html">Next Week</a>
</p>
<p>
Hello
</p>
<p>
Here is the latest OCaml Weekly News, for the week of April 28 to May 05, 2=
026.
</p>
<div id=3D"table-of-contents" role=3D"doc-toc">
<h2>Table of Contents</h2>
<div id=3D"text-table-of-contents" role=3D"doc-toc">
<ul>
<li><a href=3D"#1">Oc =E2=80=94 a Cargo-like CLI for OCaml beginners (AI-as=
sisted, feedback very welcome)</a></li>
<li><a href=3D"#2">Dune Package Management Updates</a></li>
<li><a href=3D"#3">OCaml Users Survey 2026</a></li>
<li><a href=3D"#4">OCaml Web tutorials</a></li>
<li><a href=3D"#5">Valkey 0.3.1: client-side caching, blocking pools, IAM a=
uth and mTLS</a></li>
<li><a href=3D"#org4d17849">Old CWN</a></li>
</ul>
</div>
</div>
<div id=3D"outline-container-1" class=3D"outline-2">
<h2 id=3D"1">Oc =E2=80=94 a Cargo-like CLI for OCaml beginners (AI-assisted=
, feedback very welcome)</h2>
<div class=3D"outline-text-2" id=3D"text-1">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/oc-a-cargo-like-cli-for-oca=
ml-beginners-ai-assisted-feedback-very-welcome/18020/1">https://discuss.oca=
ml.org/t/oc-a-cargo-like-cli-for-ocaml-beginners-ai-assisted-feedback-very-=
welcome/18020/1</a>
</p>
</div>
<div id=3D"outline-container-org4f3be3a" class=3D"outline-3">
<h3 id=3D"org4f3be3a">Emil Kloeden announced</h3>
<div class=3D"outline-text-3" id=3D"text-org4f3be3a">
<p>
Hi everyone,=20
</p>
<p>
I'm a newcomer to OCaml, and one of the things that has slowed me down is t=
he tooling setup: understanding opam switches, remembering to <code>eval $(=
opam env)</code>, knowing when to regenerate <code>.opam~files. So (togethe=
r with Claude Code) I built ~oc</code> - a small CLI that wraps <code>opam<=
/code> and <code>dune</code> and gives them a Cargo- or uv-like interface:=
=20
</p>
<pre class=3D"example" id=3D"org51b74e5">
oc new my_app # scaffold project + initialise isolated switch
oc add yojson # add dependency, update oc.toml, install
oc build # ensure deps, dune build
oc run # ensure deps, dune exec
</pre>
<p>
No <code>opam switch create</code>, no <code>eval $(opam env)</code>, no ha=
nd-editing <code>.opam</code> files.
</p>
</div>
<div id=3D"outline-container-org58b55c5" class=3D"outline-4">
<h4 id=3D"org58b55c5">What it is:</h4>
<div class=3D"outline-text-4" id=3D"text-org58b55c5">
<p>
A small, thin orchestration layer with no dependencies beyond opam and dune=
themselves. It calls opam to manage switches and resolve packages, and dun=
e to build - wrapping the tools the community already uses and trusts rathe=
r than replacing them. It deliberately does less: if you want full control =
over your environment, opam gives you that directly.
</p>
</div>
</div>
<div id=3D"outline-container-org6610bb9" class=3D"outline-4">
<h4 id=3D"org6610bb9">What it isn't:</h4>
<div class=3D"outline-text-4" id=3D"text-org6610bb9">
<p>
A replacement for opam or dune. The intention is to offer a simpler surface=
for those who prefer it, whether you're just starting out or you've been w=
riting OCaml for years and want less ceremony for everyday tasks.
</p>
</div>
</div>
<div id=3D"outline-container-orgc9c3e34" class=3D"outline-4">
<h4 id=3D"orgc9c3e34">A note on AI assistance:</h4>
<div class=3D"outline-text-4" id=3D"text-orgc9c3e34">
<p>
I should be upfront: this project was developed almost entirely with the he=
lp of Claude Code. I wrote the specs, made the design decisions, and review=
ed everything - but the code is almost entirely AI-generated. I think that'=
s worth naming, both for transparency and because it's an interesting case =
study in what AI-assisted development looks like for a small tool.
</p>
</div>
</div>
<div id=3D"outline-container-org447e9f8" class=3D"outline-4">
<h4 id=3D"org447e9f8">Prior art:</h4>
<div class=3D"outline-text-4" id=3D"text-org447e9f8">
<p>
I'm aware of a few similar efforts. <code>esy</code> is the closest in spir=
it - sandboxed builds, a lock file, a simpler manifest - but it makes some =
different choices: it requires Node.js (<code>npm
install -g esy</code>) and brings its own dependency resolver rather than d=
elegating to opam. <code>oc</code>
is a narrower tool: no additional runtime dependencies, stays on top of sta=
ndard opam and dune, and trades power for simplicity.~ dune init project~ h=
andles scaffolding but leaves switch management to you. opam's own local sw=
itches (<code>opam switch create . 5.2.0</code>) are essentially what <code=
>oc</code> automates, but you still have to drive them manually. If there's=
something I've missed that already solves this cleanly, I'd genuinely like=
to know.
</p>
</div>
</div>
<div id=3D"outline-container-orge71563f" class=3D"outline-4">
<h4 id=3D"orge71563f">Why not just shell aliases?</h4>
<div class=3D"outline-text-4" id=3D"text-orge71563f">
<p>
You probably could get close with a few shell functions. The reasons I went=
further: a cross-platform binary needs no shell setup, the lockfile gives =
reproducible builds across machines, and having a single <code>oc.toml</cod=
e> as the source of truth is cleaner than remembering which opam commands t=
o run. Whether that's worth it is a fair question.
</p>
</div>
</div>
<div id=3D"outline-container-org76b069b" class=3D"outline-4">
<h4 id=3D"org76b069b">Why Go, not OCaml:</h4>
<div class=3D"outline-text-4" id=3D"text-org76b069b">
<p>
Partly the bootstrapping problem =E2=80=94 it felt odd to write a tool that=
helps you set up OCaml before you can set up OCaml. More practically, Go m=
ade it easy to ship a single static binary with no runtime dependencies, an=
d it let me build and iterate on the tool quickly. I'm not against a port t=
o OCaml if someone wanted to take that on.
</p>
</div>
</div>
<div id=3D"outline-container-orge331fb1" class=3D"outline-4">
<h4 id=3D"orge331fb1">Current state:</h4>
<div class=3D"outline-text-4" id=3D"text-orge331fb1">
<p>
The tool works for my personal use, has a test suite, a lockfile, and basic=
CI. It's rough around the edges and I'm sure there are things that would m=
ake an experienced OCaml developer wince. That's part of why I'm posting - =
I'd genuinely value feedback on:=20
</p>
<ul class=3D"org-ul">
<li>Does this solve a real problem, or does the community have better answe=
rs I missed?</li>
<li>Are there correctness issues with how <code>oc</code> manages switches =
or generates <code>.opam</code> files?</li>
<li>What's missing before this would be useful to you?</li>
</ul>
<p>
The homepage is at <a href=3D"https://emilkloeden.github.io/oc">emilkloeden=
.github.io/oc </a> and the source is at <a href=3D"https://github.com/emilk=
loeden/oc">github.com/emilkloeden/oc</a>.=20
</p>
<p>
Thanks for reading and I look forward to your feedback.
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-2" class=3D"outline-2">
<h2 id=3D"2">Dune Package Management Updates</h2>
<div class=3D"outline-text-2" id=3D"text-2">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/dune-package-management-upd=
ates/18023/1">https://discuss.ocaml.org/t/dune-package-management-updates/1=
8023/1</a>
</p>
</div>
<div id=3D"outline-container-orged42182" class=3D"outline-3">
<h3 id=3D"orged42182">Shon announced</h3>
<div class=3D"outline-text-3" id=3D"text-orged42182">
<p>
Hello! The Tarides team is writing to share updates on Dune package managem=
ent.
</p>
</div>
<div id=3D"outline-container-org24043f7" class=3D"outline-4">
<h4 id=3D"org24043f7">Context</h4>
<div class=3D"outline-text-4" id=3D"text-org24043f7">
<p>
Dune package management aims to improve some developer workflows by simplif=
ying the use of opam dependencies in projects built with Dune. To learn mor=
e, see the tutorial, <a href=3D"https://dune.readthedocs.io/en/stable/tutor=
ials/dune-package-management/index.html">OCaml Package Management With Dune=
</a>.
</p>
<p>
It=E2=80=99s been too long since we shared an update, especially considerin=
g our gratitude for <a href=3D"https://github.com/ocaml/dune/issues?q=3Dis%=
3Aissue%20state%3Aopen%20label%3A%22package%20management%22">all the excell=
ent feedback</a> we have received. But Dune contributors have been hard at =
work <a href=3D"https://github.com/ocaml/dune/pulls?q=3Dis%3Apr+pkg+is%3Acl=
osed">fixing issues</a> and solving tricky architectural snags present in t=
he previous iteration.
</p>
</div>
</div>
<div id=3D"outline-container-org0dab10e" class=3D"outline-4">
<h4 id=3D"org0dab10e">Available now</h4>
<div class=3D"outline-text-4" id=3D"text-org0dab10e">
<p>
Thanks to many contributors, the following functionalities are available on=
Linux and MacOS in the latest release of Dune (3.22):
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://dune.readthedocs.io/en/stable/tutorials/dune-package=
-management/setup.html#declare-dependencies">managing dependencies publishe=
d in opam repositories</a> (the <a href=3D"https://dune.check.ci.dev/">vast=
majority of opam packages are supported</a>, but not all)</li>
<li><a href=3D"https://dune.readthedocs.io/en/stable/tutorials/dune-package=
-management/pinning.html">pinning dependencies (recursively)</a></li>
<li><a href=3D"https://dune.readthedocs.io/en/stable/tutorials/dune-package=
-management/repos.html">support for custom opam-repositories</a> (which, fo=
r example, can be used for OxCaml projects by following this <a href=3D"htt=
ps://dune.readthedocs.io/en/stable/tutorials/dune-package-management/oxcaml=
.html">documented configuration recipe</a>)</li>
<li><a href=3D"https://dune.readthedocs.io/en/latest/tutorials/dune-package=
-management/locking.html">locking dependency versions</a>, to provide a rep=
roducible environment for developers and CI (portably, across supported pla=
tforms)</li>
<li><a href=3D"https://dune.readthedocs.io/en/latest/reference/dune-tools.h=
tml">support for managing select developer tooling</a> (shaky, but usable o=
n the happy path)</li>
<li>most recently, we=E2=80=99ve <a href=3D"https://github.com/ocaml/dune/p=
ull/13321">added support</a> for the <a href=3D"https://www.dra27.uk/blog/p=
latform/2025/12/17/its-merged.html">relocatable compiler</a></li>
</ul>
<p>
Additionally, the following supporting utilities are available:
</p>
<ul class=3D"org-ul">
<li><a href=3D"https://nightly.dune.build/">a binary distribution for suppo=
rted platforms</a> offering nightly builds and released versions</li>
<li><a href=3D"https://github.com/ocaml-dune/setup-dune">setup-dune</a>, a =
GitHub action enabling quick and easy CI for projects that use dune package=
management</li>
</ul>
</div>
</div>
<div id=3D"outline-container-org93bb2de" class=3D"outline-4">
<h4 id=3D"org93bb2de">Current status and focus</h4>
<div class=3D"outline-text-4" id=3D"text-org93bb2de">
<p>
Thanks to several regular users in the community and usage in many of the C=
I systems we maintain, we are gathering ongoing feedback and exercising the=
core functionality. However, our testing has shown the features are not ye=
t mature enough to recommend wider use, beyond eager and early adopters. Co=
nsequently, all the documentation warns that this functionality is experime=
ntal and subject to change.
</p>
<p>
We are currently focused on maturing package management beyond its experime=
ntal status. This requires reworking the developer tooling support, support=
ing packages that use symlinks, and ensuring we can dogfood Dune package ma=
nagement in its own development. The best place to look for what we have p=
lanned in this current phase is <a href=3D"https://github.com/ocaml/dune/mi=
lestone/62">Non-experimental package management =C2=B7 Milestone #62 =C2=B7=
ocaml/dune</a>.=20
</p>
</div>
</div>
<div id=3D"outline-container-org70fddbb" class=3D"outline-4">
<h4 id=3D"org70fddbb">Next up</h4>
<div class=3D"outline-text-4" id=3D"text-org70fddbb">
<p>
After maturing the core functionality, we will turn our focus to extending =
the supported platforms and improving ecosystem integration. This work will=
include adding support for Windows, improving cross-compilation, supportin=
g advanced vendoring workflows, and integrating Dune package management int=
o the <b>opam-ci</b>. More updates and more accessible planning will follow.
</p>
</div>
</div>
<div id=3D"outline-container-org29a2b9e" class=3D"outline-4">
<h4 id=3D"org29a2b9e">Input and contributions</h4>
<div class=3D"outline-text-4" id=3D"text-org29a2b9e">
<p>
Please <a href=3D"https://github.com/ocaml/dune/blob/main/CONTRIBUTING.md">=
reach out</a> if you find this work interesting and would like to help!
</p>
</div>
</div>
</div>
</div>
<div id=3D"outline-container-3" class=3D"outline-2">
<h2 id=3D"3">OCaml Users Survey 2026</h2>
<div class=3D"outline-text-2" id=3D"text-3">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ann-ocaml-users-survey-2026=
/18026/1">https://discuss.ocaml.org/t/ann-ocaml-users-survey-2026/18026/1</=
a>
</p>
</div>
<div id=3D"outline-container-orgf381428" class=3D"outline-3">
<h3 id=3D"orgf381428">Sabine Schmaltz announced</h3>
<div class=3D"outline-text-3" id=3D"text-orgf381428">
<p>
Hi everyone,
</p>
<p>
On behalf of the <a href=3D"https://ocaml-sf.org/">OCaml Software Foundatio=
n</a> (OCSF), I'm delighted to announce the <b>OCaml Users Survey 2026</b>.=
We invite you to take 10 to 15 minutes to fill it out and to share it with=
other OCaml programmers.
</p>
<p>
<b>Survey link:</b> <a href=3D"https://forms.gle/gt5nikqUmoQWeYYQ9">https:/=
/forms.gle/gt5nikqUmoQWeYYQ9</a>
</p>
<p>
<a href=3D"https://forms.gle/gt5nikqUmoQWeYYQ9">https://forms.gle/gt5nikqUm=
oQWeYYQ9</a>
</p>
<p>
The survey will remain open until <b>May 25th, 2026 (AOE)</b>.
</p>
<p>
This year's edition builds on the <a href=3D"https://discuss.ocaml.org/t/an=
n-ocaml-user-survey-2023/13469">2023 iteration</a>. Many questions are kept=
comparable so we can track trends over time, while others have been refres=
hed, fixed, or added based on community feedback gathered earlier this year=
(<a href=3D"https://discuss.ocaml.org/t/feedback-wanted-upcoming-ocaml-use=
rs-survey-2026-questions/17925">feedback thread</a>). Notable additions inc=
lude questions on AI/LLM tooling and on debugging & profiling.
</p>
<p>
A few notes:
</p>
<ul class=3D"org-ul">
<li>The survey is administered via Google Forms but configured to <b>not</b=
> require signing in to a Google account, and answers are not tied to any a=
ccount. As a consequence, your progress is <b>not</b> saved if you close yo=
ur browser tab before finishing.</li>
<li>All questions are optional.</li>
<li>Please avoid entering personal information in free-form text fields: th=
e raw responses will be made available to the community alongside the summa=
ry report. We will redact what we detect, but may miss some.</li>
<li>As an official OCaml online space, this survey has adopted the <a href=
=3D"https://ocaml.org/policies/code-of-conduct">OCaml Code of Conduct</a>.<=
/li>
</ul>
<p>
Results will be published on the OCSF website and announced here on discuss=
.ocaml.org.
</p>
<p>
Thank you in advance for your participation, and please share the survey wi=
dely!
</p>
<p>
– Sabine Schmaltz, on behalf of the OCaml Software Foundation
</p>
</div>
</div>
</div>
<div id=3D"outline-container-4" class=3D"outline-2">
<h2 id=3D"4">OCaml Web tutorials</h2>
<div class=3D"outline-text-2" id=3D"text-4">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/ocaml-web-tutorials/18039/1=
">https://discuss.ocaml.org/t/ocaml-web-tutorials/18039/1</a>
</p>
</div>
<div id=3D"outline-container-orga0900b4" class=3D"outline-3">
<h3 id=3D"orga0900b4">Fr=C3=A9d=C3=A9ric Loyer announced</h3>
<div class=3D"outline-text-3" id=3D"text-orga0900b4">
<p>
I have started a series of OCaml Web tutorials. The idea is to try multiple=
libraries and see how they fit together. (But the Dream framework document=
and example set is quite good enough, I will not paraphrase it).
</p>
<p>
For the moment, I have only tried a Server Side Rendering, but I plan to tr=
y a Client Side Rendering where Ocsigen (and Vdom ?=E2=80=A6) could be welc=
omed.
</p>
<p>
The idea is to propose a dummy application that use what most people would =
expect from a Web Framework (form handling, database accesses, =E2=80=A6)
</p>
<p>
See <a href=3D"http://github.com/F-Loyer/OCaml_Web_tuto">OCam web tutorials=
</a>
</p>
</div>
</div>
<div id=3D"outline-container-org6fd6225" class=3D"outline-3">
<h3 id=3D"org6fd6225">Calascibetta Romain then suggested</h3>
<div class=3D"outline-text-3" id=3D"text-org6fd6225">
<p>
You can take an inspiration from the tutorial we made about <a href=3D"http=
s://robur-coop.github.io/vif/"><code>vif</code></a>, it shows you websocket=
stuffs at the end and include <code>caqti</code> and <code>tyxml</code> :s=
light_smile:
</p>
</div>
</div>
</div>
<div id=3D"outline-container-5" class=3D"outline-2">
<h2 id=3D"5">Valkey 0.3.1: client-side caching, blocking pools, IAM auth an=
d mTLS</h2>
<div class=3D"outline-text-2" id=3D"text-5">
<p>
Archive: <a href=3D"https://discuss.ocaml.org/t/valkey-0-3-1-client-side-ca=
ching-blocking-pools-iam-auth-and-mtls/18041/1">https://discuss.ocaml.org/t=
/valkey-0-3-1-client-side-caching-blocking-pools-iam-auth-and-mtls/18041/1<=
/a>
</p>
</div>
<div id=3D"outline-container-org56a7854" class=3D"outline-3">
<h3 id=3D"org56a7854">Avi Fenesh announced</h3>
<div class=3D"outline-text-3" id=3D"text-org56a7854">
<p>
Hi everyone,
</p>
<p>
I wanted to share that <code>valkey.0.3.1</code> is now on opam.
</p>
<p>
This is the next release after the <code>0.2.0</code> announcement. The sho=
rt version: a few of the roadmap items from that post are now shipped =E2=
=80=94 client-side caching, blocking-command pools, IAM auth, and mTLS.
</p>
<pre class=3D"example" id=3D"org7cdabd5">
opam update
opam install valkey eio_main
</pre>
<p>
Repo and docs: <a href=3D"https://github.com/avifenesh/ocaml-valkey">https:=
//github.com/avifenesh/ocaml-valkey</a>
</p>
<p>
The largest new feature is <b>client-side caching</b>.
</p>
<p>
<code>valkey</code> now supports Valkey <code>CLIENT TRACKING</code> with a=
bounded in-process LRU cache, RESP3 invalidation push handling, single-fli=
ght protection, optional TTL safety net, and metrics. It works in both stan=
dalone and cluster mode, and supports the three tracking shapes I wanted to=
cover:
</p>
<ul class=3D"org-ul">
<li>default tracking</li>
<li><code>BCAST</code> prefix tracking</li>
<li><code>OPTIN</code> tracking</li>
</ul>
<p>
The cluster path was the tricky part. OPTIN reads need <code>CLIENT CACHING=
YES</code> to stay adjacent to the actual read on the wire, including acro=
ss MOVED / ASK redirects. That is now handled inside the client rather than=
pushed onto callers.
</p>
<p>
The second big addition is a <b>blocking-command pool</b>.
</p>
<p>
The normal client is still built around multiplexed connections, which is t=
he right shape for regular traffic. But commands such as <code>BLPOP</code>=
, <code>BRPOP</code>, <code>BLMOVE</code>, <code>BLMPOP</code>, <code>BZPOP=
*</code>, <code>XREAD BLOCK</code>, and <code>XREADGROUP BLOCK</code> are i=
ntentionally blocking on the server side. Sending one of those through the =
normal multiplexed FIFO can freeze unrelated requests queued behind it.
</p>
<p>
<code>0.3.x</code> adds a narrow per-node lease pool for those commands. Bl=
ocking calls lease an exclusive connection for the duration of the command,=
while regular traffic continues on the normal client. The pool is bounded,=
has typed errors, handles topology changes, and is off by default unless c=
onfigured.
</p>
<p>
The third addition is <b>IAM auth and mTLS</b>.
</p>
<p>
There is now a first-class <code>Connection.Auth.provider</code> abstractio=
n instead of only static username/password config. That means every initial=
handshake and reconnect can pull fresh credentials from a provider.
</p>
<p>
On top of that, the library now includes:
</p>
<ul class=3D"org-ul">
<li>pure OCaml AWS SigV4 signing for ElastiCache IAM auth</li>
<li>an auto-refreshing IAM provider</li>
<li><code>Client.connect_with_iam</code></li>
<li>live <code>AUTH</code> refresh support</li>
<li>mTLS client certificate configuration via <code>Tls_config.with_client_=
cert</code></li>
</ul>
<p>
The IAM path does not depend on the AWS SDK. The signer is implemented in O=
Caml and tested against AWS SigV4 test vectors.
</p>
<p>
There were also a few correctness and operability improvements:
</p>
<ul class=3D"org-ul">
<li>OpenTelemetry spans for connect, cluster discovery, and topology refres=
h</li>
<li>cache and blocking-pool metric bridges</li>
<li>tighter TLS / connection error redaction</li>
<li>better MOVED / ASK / topology-refresh behavior under cluster changes</l=
i>
<li>fixes around WATCH / MULTI / EXEC when slot ownership changes during an=
atomic flow</li>
<li>more tests around CSC invalidation, cluster migration, blocking-pool be=
havior, IAM refresh, and mTLS config</li>
</ul>
<p>
<code>0.3.1</code> itself is a small follow-up to make the opam sandbox tes=
ts clean: the mTLS config tests now use committed test fixtures instead of =
depending on generated certs from the local development scripts.
</p>
<p>
The project is still alpha, and the API may still change before <code>1.0</=
code>, but the surface is getting closer to the shape I originally wanted: =
an OCaml 5 / Eio-native Valkey client that treats cluster behavior, RESP3, =
modern Valkey features, and production failure modes as first-class concern=
s.
</p>
<p>
I would especially appreciate feedback from people who use OCaml in product=
ion on:
</p>
<ul class=3D"org-ul">
<li>API shape and naming</li>
<li>Eio ergonomics</li>
<li>docs clarity</li>
<li>whether the caching / blocking-pool / IAM APIs feel natural</li>
<li>what should be prioritized before <code>1.0</code></li>
</ul>
<p>
Next things on the roadmap are still Valkey module support =E2=80=94 JSON, =
search, bloom =E2=80=94 and a deeper pre-<code>1.0</code> audit pass.
</p>
<p>
If you try it, I=E2=80=99d love to hear what feels good, what feels awkward=
, and what is missing.
</p>
</div>
</div>
</div>
<div id=3D"outline-container-org4d17849" class=3D"outline-2">
<h2 id=3D"org4d17849">Old CWN</h2>
<div class=3D"outline-text-2" id=3D"text-org4d17849">
<p>
If you happen to miss a CWN, you can <a href=3D"mailto:alan.schmitt@polytec=
hnique.org">send me a message</a> and I'll mail it to you, or go take a loo=
k at <a href=3D"https://alan.petitepomme.net/cwn/">the archive</a> or the <=
a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive=
s</a>.
</p>
<p>
If you also wish to receive it every week by mail, you may subscribe to the=
<a href=3D"https://sympa.inria.fr/sympa/info/caml-list">caml-list</a>.
</p>
<div class=3D"authorname" id=3D"orgc09e50b">
<p>
<a href=3D"https://alan.petitepomme.net/">Alan Schmitt</a>
</p>
</div>
</div>
</div>
</div>
</body>
</html>
--==-=-=--
--=-=-=--
--===-=-=
Content-Type: application/pgp-signature; name="signature.asc"
-----BEGIN PGP SIGNATURE-----
iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmn5ufobFIAAAAAABAAO
bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v
cmcACgkQBA0KO07S5cfjbwf9EtZcfgp+7oiQNd2VoPgKNg0cO4QghVJ6BV+WEKYw
DCo9czrrvSS2d5GGpP/GLlpIW9dg0eqerpBsYd0xgo+dyC1q8c8QwD+zRHA8DMeb
hBfcBiFAGgGLTr/+IF8rwRH4pZYqjasiIFTCsAgbFBhuiE2y68pQHotDfvZViJws
hiLQcy6EXXQMxVUluH6TPtE+IMQRjnUugUpqj4TfYcI9F5VgOs5lk27++wtrqbX8
nV3VGPS3xxDJSalOFIpj77+re6vuGpFAlbGsgaROVDtDJmJIlNksjfiuPAIZuuPZ
yPyVtHlJNs+9gT8YGFBvWi02Zlx22V/6wUxfhJtbZoNFJQ==
=EYUu
-----END PGP SIGNATURE-----
--===-=-=--