From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by c5ff346549e7 (Postfix) with ESMTPS id 24FB25D5 for ; Tue, 3 Dec 2019 15:43:03 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.69,273,1571695200"; d="asc'?scan'208,217";a="417352788" Received: from sympa.inria.fr ([193.51.193.213]) by mail2-relais-roc.national.inria.fr with ESMTP; 03 Dec 2019 16:43:01 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 3B1B77F3A9; Tue, 3 Dec 2019 16:43:01 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id B25027F332 for ; Tue, 3 Dec 2019 16:42:57 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.69,273,1571695200"; d="asc'?scan'208,217";a="417352768" Received: from 207-7-99-34.oc.nextlevelinternet.com (HELO set) ([207.7.99.34]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 03 Dec 2019 16:42:54 +0100 User-agent: mu4e 1.2.0; emacs 26.3 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 03 Dec 2019 16:42:51 +0100 Message-ID: <878sntl8jo.fsf@inria.fr> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 17893 Errors-to: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTm92ZW1iZXIgMjYgDQp0bw0KRGVjZW1iZXIgMDMsIDIwMTkuDQoNClRhYmxlIG9mIENv bnRlbnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KSXJtaW4gMi4wLjAgcmVsZWFzZQ0KSG93IHZpYWJsZSBpcyBkZWxpdmVyaW5nIGJpbmFy aWVzIGxpbmtlZCB0byBDeWd3aW4gdG8gV2luZG93cyANCmN1c3RvbWVycz8NCkR1bmUgMi4wLjAN CkFkdmFuY2VkIEMgYmluZGluZyB1c2luZyBvY2FtbC1jdHlwZXMgYW5kIGR1bmUNClVwY29taW5n IGJyZWFraW5nIGNoYW5nZSBpbiBCYXNlL0NvcmUgdjAuMTQNCkNJL0NEIFBpcGVsaW5lczogTW9u YWQsIEFycm93IG9yIERhcnQ/DQpVc2Ugb2YgZnVuY3RvcnMgdG8gYXBwcm94aW1hdGUgRiMgc3Rh dGljYWxseSByZXNvbHZlZCB0eXBlIA0KcGFyYW1ldGVycw0KT2xkIENXTg0KDQoNCklybWluIDIu MC4wIHJlbGVhc2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IA0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi1pcm1pbi0yLTAtMC1yZWxlYXNlLzQ3NDYvNT4NCg0KDQpDb250aW51aW5nIHRoaXMg dGhyZWFkLCBzYW1vaHQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBBbmQgdGhlcmUgaXMgbm93IGEg Zm9sbG93LXVwIGJsb2cgcG9zdCwgZXhwbGFpbmluZyBob3cgdG8gdXNlIA0KICB0aGUgbmV3DQog IEdyYXBoUUwgQVBJIGF2YWlsYWJsZSBpbiBJcm1pbjI6DQogIDxodHRwczovL3RhcmlkZXMuY29t L2Jsb2cvMjAxOS0xMS0yNy1pbnRyb2R1Y2luZy1pcm1pbi1ncmFwaHFsPi4NCg0KDQpIb3cgdmlh YmxlIGlzIGRlbGl2ZXJpbmcgYmluYXJpZXMgbGlua2VkIHRvIEN5Z3dpbiB0byBXaW5kb3dzIA0K Y3VzdG9tZXJzPw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ob3ctdmlhYmxl LWlzLWRlbGl2ZXJpbmctYmluYXJpZXMtbGlua2VkLXRvLWN5Z3dpbi10by13aW5kb3dzLWN1c3Rv bWVycy80Nzc1Pg0KDQoNCm1iYWNhcmVsbGEgYXNrZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEnigJltIGluIHRoZSBlYXJseSBzdGFnZXMg b2YgcGxhbm5pbmcgYSBkZWxpdmVyYWJsZSBiaW5hcnkgcHJvZHVjdCANCiAgdGhhdA0KICB3aWxs IHJ1biBvbiBMaW51eCwgTWFjIGFuZCBXaW5kb3dzLg0KDQogIE15IGJyaWVmIHNuaWZmIG9mIHRo ZSBhaXIgYXJvdW5kIHRoZSBPQ2FtbCBlY29zeXN0ZW0gc2F5cyBJIA0KICBzaG91bGQNCiAgZXhw ZWN0IHRvIHRhcmdldCBDeWd3aW4gdG8gZ2V0IFdpbmRvd3MgZ29pbmcgKGFsdGhvdWdoIHRoZXJl 4oCZcw0KICBpbXByZXNzaXZlIHdvcmsgdG8gZ2V0IG5hdGl2ZSBXaW5kb3dzIHN0dWZmIGRvbmUg dGhhdCBjYW4gYmVjb21lIA0KICB0aGUNCiAgcHJlZmVycmVkIGFwcHJvYWNoIGluIGEgZmV3IHll YXJzKS4NCg0KICBNeSBleHBlcmllbmNlIHVzaW5nIEN5Z3dpbiBhcyBhbiBvcGVyYXRpbmcgZW52 aXJvbm1lbnQgaXMgdGhhdCANCiAgaXTigJlzDQogIHByZXR0eSBkYXJuIHNsdWdnaXNoIGNvbXBh cmVkIHRvIExpbnV4IG9uIHRoZSBzYW1lIGNvbXB1dGVyLg0KDQogIFdoeSBpcyB0aGlzPyBUaGVy ZeKAmXMgYW4gYW5lY2RvdGUgdGhhdCBzYXlzIEN5Z3dpbiBjYW4gb25seSBmb3JrIA0KICBhdA0K ICBhYm91dCAzMC01MHggYSBzZWNvbmQgb24gV2luZG93cywgZHVlIHRvIGhvdyBpdCBoYXMgdG8g YWRhcHQgaXQgDQogIHRvDQogIHdvcmsgd2l0aGluIFdpbmRvd3PigJkgdGFzayBzcGF3bmluZyBt b2RlbC4gKEZvciBjb250cmFzdCwgTGludXggDQogIGNhbg0KICBhY2hpZXZlIHRob3VzYW5kcyBv ZiBmb3JrcyBwZXIgc2Vjb25kIGlmIHlvdSBwbGF5IGFyb3VuZCB3aXRoIA0KICBpdCkuDQoNCiAg SSB1bmRlcnN0YW5kIGZyb20gYW5vdGhlciBwcm9kdWN0IGRldmVsb3BlciB0aGF0IHdoZW4gdGhl eSBidWlsZA0KICBiaW5hcmllcyB0byBkZWxpdmVyIHRvIFdpbmRvd3MvQ3lnd2luLCB0aGV5IGFj dHVhbGx5IA0KICBjcm9zcy1jb21waWxlIG9uDQogIExpbnV4IGJlY2F1c2Ugb2YgaG93IHNsb3ds eSB0aGUgdG9vbGNoYWluIHJ1bnMgb24gQ3lnd2luLg0KDQogIFRoYXQgc291bmRzIGxpa2UgYmFk IG5ld3MgaWYgeW91IHdhbnQgdG8gZG8gVU5JWHkgdGhpbmdzLCBidXQgDQogIGZvciBhDQogIHNp bmdsZSBzdGFuZGFsb25lIGFwcGxpY2F0aW9uIHRoaXMgbWlnaHQgbm90IGJlIHNvIGJhZD8gSSBh c3N1bWUgDQogIGlmIEkNCiAgc2hpcCBhIGRlbGl2ZXJhYmxlIHRvIFdpbmRvd3MvQ3lnd2luLCB0 aGUgZW5kIHVzZXIgbWF5IGVuam95IA0KICBnb29kDQogIHBlcmZvcm1hbmNlLCBzbyBsb25nIGFz IEnigJltIG5vdCBzcGF3bmluZyB0b25zIG9mIHByb2Nlc3NlcyBvciANCiAgcmVseWluZw0KICBv biBmb3JrIGZvciBtdWx0aS1wcm9ncmFtbWluZy4gSXMgdGhpcyBhIHNhZmUgYXNzdW1wdGlvbnM/ DQoNCiAgQW55IG90aGVyIGdvdGNoYXMgd2hlbiBpdCBjb21lcyB0byBPQ2FtbCBvbiBDeWd3aW4g dy5yLnQuIA0KICBwZXJmb3JtYW5jZT8NCg0KICBUaGUgYXBwIHByZXR0eSBtdWNoIGhhcyByZWFs LXRpbWUgZ2FtaW5nIHJlcXVpcmVtZW50cyAodGhvdWdoIA0KICBpdOKAmXMgbm90DQogIGEgZ2Ft ZSBzbyBjYW4gc2lkZS1zdGVwIHdvcnJ5aW5nIGFib3V0IGFjY2VzcyB0byBHUFVzIGFuZA0KICB3 aGF0LW5vdCkuIFN0YXRlZCBhbm90aGVyIHdheSwgYWx0aG91Z2ggbXkgYXBwbGljYXRpb24gd2ls bCANCiAgZGVwZW5kIG9uDQogIHRoZSBQT1NJWCBsYXllciBvZmZlcmVkIGJ5IEN5Z3dpbiwgSSBl eHBlY3QgaXQgbm90IHRvIGNydW5jaCANCiAgUE9TSVgNCiAgcmVsYXRlZCBzdHVmZiBpbiB0aGUg bWFpbiBsb29wLg0KDQogIEhvdyBoYXMgeW91ciBleHBlcmllbmNlIGdvbmU/DQoNCg0KSm9obiBX aGl0aW5ndG9uIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgaGF2ZSBiZWVuIHNoaXBwaW5n IGNvbW1lcmNpYWwgYmluYXJpZXMgZm9yIExpbnV4ICgzMiBhbmQgNjQgDQogIGJpdCksDQogIFdp bmRvd3MgKDMyIGFuZCA2NGJpdCkgYW5kIE9TIFggZm9yIHllYXJzLiBGb3IgZXhhbXBsZToNCiAg PGh0dHBzOi8vZ2l0aHViLmNvbS9jb2hlcmVudGdyYXBoaWNzL2NwZGYtYmluYXJpZXM+DQoNCiAg QW5kIGV2ZW4gc3RhdGljIG9yIHNoYXJlZCBsaWJyYXJpZXMgaW4gYmluYXJ5IGZvcm06DQogIDxo dHRwczovL2dpdGh1Yi5jb20vY29oZXJlbnRncmFwaGljcy9jcGRmbGliLWJpbmFyeT4NCg0KICBP biBPUyBYLCB5b3UgbmVlZCB0byB1c2UgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIG9yIHNpbWls YXIgdG8gDQogIG1ha2UNCiAgc3VyZSB5b3VyIGJ1aWxkcyB3aWxsIHJ1biBvbiBvbGRlciBzeXN0 ZW1zLiBBbmQsIGluIGZhY3QsIHlvdSANCiAgbmVlZCB0bw0KICB1c2UgTUFDT1NYX0RFUExPWU1F TlRfVEFSR0VUIHdoZW4gYXNraW5nIE9QQU0gdG8gY29tcGlsZSB0aGUgDQogIE9DYW1sDQogIGNv bXBpbGVyIGl0c2VsZi4gQW5kLCB5b3Ugd2lsbCBuZWVkIHRvIGRlYWwgd2l0aCBjb2Rlc2lnbmlu ZyBhbmQNCiAgbm90YXJpemF0aW9uLiBCdXQgaXTigJlzIGFsbCBkb2FibGUuDQoNCiAgRm9yIGxp bnV4LCB5b3UgbWF5IG5lZWQgdG8gYnVpbGQgdW5kZXIgb2xkZXIgbGludXggdmVyc2lvbnMsIHRv IA0KICBtYWtlDQogIHN1cmUgdGhhdCB0aGUgZ2xpYmMgaW4gdXNlIGlzIG9sZCBlbm91Z2guIFRo aXMgaXMgbm90IGFuDQogIG9jYW1sLXNwZWNpZmljIHByb2JsZW0uIEkgaGF2ZSBhIDY0IGJpdCBh bmQgMzIgYml0IFZNIHdpdGggDQogIG9sZC1pc2gNCiAgZ2xpYmMgdmVyc2lvbnMgZm9yIHRoaXMg cHVycG9zZS4NCg0KICBVbmRlciBXaW5kb3dzLCB0aGVyZSBhcmUgbm8gc3VjaCBiYWNrd2FyZC1j b21wYXRpYmlsaXR5IA0KICBwcm9ibGVtcy4gSQ0KICB1c2UgdGhlIG5ldyBPQ2FtbCBmb3Igd2lu ZG93cyBzeXN0ZW0sIHdoaWNoIGNvbWVzIHdpdGggT1BBTSwgYW5kIA0KICBpcw0KICBtaW5ndy1i YXNlZC4gTm8gY3lnd2luIHJlbWFpbnMgaW4gdGhlIGZpbmFsIGJpbmFyeS4NCg0KICBGb3IgbW9y ZSBvYnNjdXJlIHN5c3RlbXMgKEFJWCwgSFBVWCwgU3BhcmMgZXRjKSBjdXN0b21lcnMgDQogIGNv bXBpbGUgZnJvbQ0KICBzb3VyY2UgKHdpdGggaGVscCBmcm9tIG1lKS4gTm90IG9uY2UgaW4gbW9y ZSB0aGFuIHRlbiB5ZWFycyBoYXMgDQogIGFueW9uZQ0KICBjYXJlZCB0aGF0IGl0IHdhcyB3cml0 dGVuIGluIE9DYW1sLg0KDQoNCmRidWVuemxpIGFsc28gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgcmVt ZW1iZXIgdGhhdCBvbiB0aGUgV2luZG93cyBuYXRpdmUgcG9ydCwgdGhlIFVuaXggbW9kdWxlIA0K ICBkaXN0cmlidXRlZA0KICB3aXRoIE9DYW1sIGlzIHlvdXIgUE9TSVggY29tcGF0aWJpbGl0eSBs YXllci4gVGhlcmUgYXJlIGEgZmV3IA0KICBlbnRyeQ0KICBwb2ludHMgdG8gYXZvaWQgdGhvdWdo LCB0aGUgbGlzdCBpcyBhdCB0aGUgYm90dG9tIG9mIFt0aGlzIA0KICBwYWdlXS4NCg0KDQpbdGhp cyBwYWdlXSANCjxodHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xp YnVuaXguaHRtbD4NCg0KDQpub2piIGFsc28gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQXQgTGV4aUZpIG91ciBtYWluIGFw cGxpY2F0aW9uIGlzIGRldmVsb3BlZCBhbmQgc2hpcHBlZCBvbiANCiAgV2luZG93cy4gV2UNCiAg dXNlIHRoZSBtc3ZjIHBvcnQgb2YgT0NhbWwuIFRoaXMgbWVhbnMgdGhhdCB5b3UgbmVlZCBDeWd3 aW4gdG8NCiAgZGV2ZWxvcCwgYnV0IHRoZSByZXN1bHRpbmcgYXBwbGljYXRpb24gaXMgZnVsbHkg bmF0aXZlIGFuZCBkb2VzIA0KICBub3QNCiAgZGVwZW5kIG9uIHRoZSBDeWd3aW4gRExMLiBBcyBA ZGJ1ZW56bGkgbWVudGlvbmVkLCB0aGUgVW5peCANCiAgbW9kdWxlICppcyoNCiAgdGhlIFBPU0lY IGNvbXBhdGliaWxpdHkgbGF5ZXIuDQoNCiAgQ29tcGlsYXRpb24gc3BlZWQgaXMgc2xvd2VyIG9u IFdpbmRvd3MgYmVjYXVzZSBwcm9jZXNzIGNyZWF0aW9uIA0KICBpcw0KICBzbG93ZXIgb24gV2lu ZG93cyBhcyBhIGdlbmVyYWwgcnVsZSwgYnV0IGl0IGlzIG1hbmFnZWFibGUgKG91cg0KICBhcHBs aWNhdGlvbiBoYXMgYXJvdW5kIDIwMDAgbW9kdWxlcyArIEpzX29mX29jYW1sICsgQyBiaW5kaW5n cyArIA0KICBDIw0KICBjb21wb25lbnQpLg0KDQogIFdlIGRvbuKAmXQgaGF2ZSBhbnkgaXNzdWVz IHdpdGggcnVudGltZSBwZXJmb3JtYW5jZS4gVGhlIGBVbml4JyANCiAgbGlicmFyeQ0KICBtZW50 aW9uZWQgYWJvdmUgaW1wbGVtZW50cyBXaW5kb3dzIHN1cHBvcnQgZGlyZWN0bHkgd2l0aG91dCAN CiAgZ29pbmcNCiAgdGhyb3VnaCBhbnkgY29tcGF0aWJpbGl0eSBsYXllciBhbmQgaXMgcXVpdGUg ZWZmaWNpZW50Lg0KDQoNCkJpa2FsR3VydW5nIGFsc28gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgVGhlcmUgaXMgYW4gZWRpdG9yIGJlaW5nIGJ1aWx0IGluIG9jYW1sL3JlYXNvbm1sIHdo aWNoIGN1cnJlbnRseQ0KICB0YXJnZXRzIHdpbmRvd3MsIGxpbnV4IGFuZCBtYWNvcyAtDQogIDxo dHRwczovL2dpdGh1Yi5jb20vb25pdmltL29uaTI+LiBIb3dldmVyLCB0aGUgYmluYXJ5IGlzIG5h dGl2ZQ0KICB3aW5kb3dzIHJhdGhlciB0aGFuIGN5Z3dpbiBkZXJpdmF0aXZlLiBTbyBpZiB5b3Ug ZG9u4oCZdCBoYXZlIHRvIA0KICB1c2UNCiAgY3lnd2luIGRlcGVuZGVuY2llcyB0aGVuIG5hdGl2 ZSB3aW5kb3dzIGJpbmFyeSBjb3VsZCBiZSB0aGUgd2F5IA0KICB0byBnby4NCg0KICBBbHNvIGVz eSAtIDxodHRwczovL2dpdGh1Yi5jb20vZXN5L2VzeT4gbWFrZXMgZGV2ZWxvcGluZw0KICBvY2Ft bC9yZWFzb25tbCBvbiB3aW5kb3dzIHZpYWJsZS4NCg0KDQprZWxlc2hldiBhbHNvIHJlcGxpZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogICpUTERSKjogSW5zdGFsbCB0aGUgW01pbmd3IHBvcnQgb2YgT0NhbWwgNF0s IGZyZWVseSB1c2UgbW9zdCANCiAgb3BhbQ0KICAgbGlicmFyaWVzLCBhbmQgY29tcGlsZSB0byBu YXRpdmUgV2luZG93cyBiaW5hcmllcywgd2l0aG91dCANCiAgIGxpY2Vuc2luZw0KICAgaXNzdWVz Lg0KDQogIEkgcmVjb21tZW5kIHlvdSByZWFkIHRoZSDigJxSZWxlYXNlIG5vdGVzIGZvciBXaW5k b3dz4oCdOg0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Jsb2IvdHJ1bmsvUkVB RE1FLndpbjMyLmFkb2M+DQoNCiAgVG8gc3VtbWFyaXNlLCB0aGVyZSBhcmUgdGhyZWUgV2luZG93 cyBwb3J0czoNCg0KICDigKIgTmF0aXZlIE1pY3Jvc29mdCBwb3J0LA0KICDigKIgTmF0aXZlIE1p bmd3IHBvcnQsDQogIOKAoiBDeWd3aW4gcG9ydC4NCg0KICBBbGwgdGhyZWUgcmVxdWlyZSBDeWd3 aW4gZm9yIGRldmVsb3BtZW50IHB1cnBvc2VzLiBJIHJlY29tbWVuZCANCiAgdXNpbmcNCiAgdGhl IE5hdGl2ZSBNaW5ndywgYXM6DQoNCiAg4oCiIGl0ICpkb2VzbuKAmXQqIHJlcXVpcmUgVmlzdWFs IFN0dWRpbyAoaXQgdXNlcyBhIG1pbmd3IGZvcmsgb2YgDQogIEdDQyB0aGF0DQogICAg4oCcY3Jv c3MtY29tcGlsZXPigJ0gbmF0aXZlIFdpbmRvd3MgZXhlY3V0YWJsZXMpLA0KICDigKIgaXQgKmRv ZXNu4oCZdCogcmVseSBvbiB0aGUgZHJlYWRlZCBjeWd3aW4uZGxsDQogIOKAoiBpdCBoYXMgZ29v ZCBvcGFtIHN1cHBvcnQgd2l0aCBvcGFtLXJlcG9zaXRvcnktbWluZ3c6DQogICAgPGh0dHBzOi8v Z2l0aHViLmNvbS9mZG9wZW4vb3BhbS1yZXBvc2l0b3J5LW1pbmd3Pg0KICDigKIgaXQgaGFzIGEg Y29udmVuaWVudCBpbnN0YWxsZXI6DQogICAgPGh0dHBzOi8vZmRvcGVuLmdpdGh1Yi5pby9vcGFt LXJlcG9zaXRvcnktbWluZ3cvPiA1Lg0KDQogIFRvIGNvbnRyYXN0LCBOYXRpdmUgTWljcm9zb2Z0 IHJlcXVpcmVzIFZpc3VhbCBTdHVkaW8sIGFuZCANCiAgZG9lc27igJl0IGhhdmUNCiAgb3BhbS4g WW91IGNhbiBzdGlsbCB2ZW5kb3IgcHVyZSBPQ2FtbCBwYWNrYWdlcywgYnV0IGFzIHNvb24gYXMg DQogIHlvdQ0KICB3YW50IHRvIHVzZSBzb21lIEMgYmluZGluZ3MgeW914oCZcmUgaW4gdHJvdWJs ZSwgYmVjYXVzZSBvZiB0aGUgDQogIOKAnG1pbm9y4oCdDQogIGRpZmZlcmVuY2VzIGJldHdlZW4g VmlzdWFsIEMgYW5kIEdDQy4gQW5kIGV2ZXJ5dGhpbmcgYXNzdW1lcyBHQ0MNCiAgbm93YWRheXMu DQoNCiAgQ3lnd2luIHBvcnQgaXMgdGhlIG9uZSBJIGRvbuKAmXQgaGF2ZSBleHBlcmllbmNlIHdp dGgsIGJ1dCANCiAgcmUtcmVhZGluZw0KICB0aGUg4oCcUmVsZWFzZSBub3RlcyBmb3IgV2luZG93 c+KAnSBhYm92ZSBpdCBzdHJpa2VzIG1lIHRoYXQgaXQgDQogIG1lbnRpb25zDQogIHRoYXQgQ3ln d2luIHdhcyByZS1saWNlbnNlZCBmcm9tIEdQTCB0byBMR1BMIHdpdGggc3RhdGljIGxpbmtpbmcN CiAgZXhjZXB0aW9uLiBTbyBpdCBsb29rcyBsaWtlIHRoZSBDeWd3aW4gcG9ydCBjb3VsZCBiZSB2 aWFibGUgZm9yDQogIGNvbW1lcmNpYWwgdXNlLCBidXQgSSBuZXZlciB0cmllZCB0byBzdGF0aWNh bGx5IGxpbmtlZCANCiAgYGN5Z3dpbi5kbGwnLA0KICBhbmQgSeKAmW0gbm90IHN1cmUgd2hhdCBh cmUgdGhlIGJlbmVmaXRzIG9mIEN5Z3dpbiBwb3J0IG92ZXIgdGhlIA0KICBNaW5ndw0KICBwb3J0 Lg0KDQoNCltNaW5ndyBwb3J0IG9mIE9DYW1sIDRdDQo8aHR0cHM6Ly9mZG9wZW4uZ2l0aHViLmlv L29wYW0tcmVwb3NpdG9yeS1taW5ndy8+DQoNCg0KZG1iYXR1cmluIGFsc28gcmVwbGllZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgV2l0aCBbc291cGF1bHQgNF0sIEkgZGVjaWRlZCB0byBzaGlwIHByZWJ1aWx0 IGJpbmFyaWVzIGZvciBhbGwNCiAgcGxhdGZvcm1zIGluY2x1ZGluZyBXaW5kb3dzLiBNb3N0bHkg dG8gc2VlIGlmIEkgY2FuLCBhbGwgaXRzIA0KICB1c2VycyBJDQogIGtub3cgb2YgYXJlIG9uIFVO SVgtbGlrZSBzeXN0ZW1zIGFuZCBrbm93IGhvdyB0byBidWlsZCBmcm9tIA0KICBzb3VyY2UsDQog IGJ1dCB0aGF04oCZcyBiZXNpZGUgdGhlIHBvaW50LiA6d2luazoNCg0KICBJIGNhbiBjb25maXJt IGV2ZXJ5dGhpbmcgQGtlbGVzaGV2IHNheXM6IGZkb3BlbuKAmXMgcGFja2FnZSBqdXN0IA0KICB3 b3JrcywNCiAgb3BhbSB3b3JrcyBleGFjdGx5IGxpa2UgaXQgZG9lcyBvbiBVTklYLCBwdXJlIE9D YW1sIGxpYnJhcmllcyANCiAgYXJlDQogIHRyaXZpYWwgdG8gaW5zdGFsbCwgYW5kIHRoZSBiaW5h cmllcyBkb27igJl0IGRlcGVuZCBvbiBjeWd3aW4uIA0KICBOb3RlDQogIHRoYXQg4oCcb3BhbSBz d2l0Y2ggY3JlYXRl4oCdIGFsc28ganVzdCB3b3JrcywgeW91IGNhbiBpbnN0YWxsIA0KICBlaXRo ZXINCiAgTWluR1cgb3IgTVNWQyBjb21waWxlciB2ZXJzaW9ucyBhcyBvcGFtIHN3aXRjaGVzLiAg SSBvbmx5IGV2ZXIgDQogIHN0YXJ0DQogIHRoZSBXaW5kb3dzIFZNIHRvIG1ha2UgcmVsZWFzZSBi dWlsZHMsIGFuZCB0aGUgd29ya2Zsb3cgaXMgDQogIGV4YWN0bHkgdGhlDQogIHNhbWUgYXMgb24g TGludXggd2hlcmUgSeKAmW0gYWN0dWFsbHkgd3JpdGluZyBjb2RlLg0KDQogIE15IG9ubHkgb2Jz dGFjbGUgb24gdGhhdCBwYXRoIHdhcyB0aGF0IEZpbGVVdGlscyBsb3N0IGl0cyANCiAgV2luZG93 cw0KICBjb21wYXRpYmlsaXR5LCBidXQgSSB3YW50ZWQgdG8gdXNlIGl0LCBzbyBJIHdvcmtlZCB3 aXRoIA0KICBAZ2lsZG9yNDc4IHRvDQogIG1ha2UgaXQgY3Jvc3MtcGxhdGZvcm0gYWdhaW4uIFVu Y292ZXJlZCBhIGJ1ZyBpbiB0aGUgDQogIGltcGxlbWVudGF0aW9uIG9mDQogIFVuaXgudXRpbWVz IGluIHRoZSBwcm9jZXNzLCBidXQgaXTigJlzIGhhcmRseSBhIGNvbW1vbmx5IHVzZWQgDQogIGZ1 bmN0aW9uLg0KDQogIFlvdSBjYW4gYWxzbyBzZXR1cCBBcHBWZXlvciBidWlsZHMuIEl04oCZcyBu b3QgYXMgc2ltcGxlIGFzIEkgd2lzaCANCiAgaXQNCiAgd291bGQgYmUsIGJ1dCB0aGVyZSBhcmUg cHJvamVjdHMgZG9pbmcgaXQgdGhhdCB5b3UgY2FuIHN0ZWFsIHRoZSANCiAgc2V0dXANCiAgZnJv bS4NCg0KICBUaGVyZeKAmXMgYWxzbyBvcGFtLWNyb3NzLXdpbmRvd3MsIGJ1dCBpdOKAmXMgdmVy eSBpbmNvbXBsZXRlIGFuZCANCiAgbmVlZHMNCiAgd29yayB0byBiZSBwcmFjdGljYWwuIFRoZXJl IGFyZSBubyBiaWcgb2JzdGFjbGVzLCBpdCBqdXN0IG5lZWRzDQogIHdvcmsuIFdoaWxlIGZpbGVz IGluIG9wYW0tcmVwb3NpdG9yeS1taW5ndyBhcmUgbm9ybWFsbHkgDQogIGlkZW50aWNhbCB0bw0K ICB0aGUgZGVmYXVsdCBvcGFtIHJlcG9zaXRvcnksIHRoZSBjcm9zcyBvbmUgbmVlZHMgc21hbGwg DQogIGFkanVzdG1lbnRzIGluDQogIGV2ZXJ5IHBhY2thZ2UgdG8gc3BlY2lmeSB0aGUgdG9vbGNo YWluIHRvIHVzZSwgc28gdGhlIHJlcXVpcmVkIA0KICB3b3JrIGlzDQogIG1vc3RseSBhIGxvdCBv ZiB0cml2aWFsIGJ1dCBtYW51YWwgYWN0aW9ucy4gSSBob3BlIGV2ZW50dWFsbHkgaXQNCiAgcmVh Y2hlcyBwYXJpdHkgd2l0aCBmZG9wZW7igJlzIG9uZSBhbmQgd2XigJlsbCBiZSBhYmxlIHRvIGVh c2lseSANCiAgYnVpbGQgZm9yDQogIFdpbmRvd3Mgd2l0aG91dCBldmVyIHRvdWNoaW5nIFdpbmRv d3MuDQoNCiAgQXMgb2Ygc3RhdGljIExpbnV4IGJ1aWxkcywgQEpvaG5XaGl0aW5ndG9u4oCZcyBh cHByb2FjaCBjYW4gd29yaywgDQogIGJ1dA0KICB0aGVyZeKAmXMgYSBiZXR0ZXIgb3B0aW9uIGlm IHlvdSBkb27igJl0IG5lZWQgYW55dGhpbmcgZnJvbSBnbGliYw0KICBzcGVjaWZpY2FsbHkgYW5k IGRvbuKAmXQgbGluayBhZ2FpbnN0IGFueSBDIGxpYnM6IGJ1aWxkIHN0YXRpY2FsbHkgDQogIHdp dGgNCiAgbXVzbC4gVGhlcmXigJlzIGEgYCttdXNsK3N0YXRpYytmbGFtYmRhJyBjb21waWxlciBm bGF2b3VyLiBZb3UgDQogIG5lZWQgbXVzbA0KICBhbmQgZ2NjLW11c2wgdG8gaW5zdGFsbCBpdCwg YnV0IGFmdGVyIHRoYXQsIGp1c3QgYnVpbGQgd2l0aCANCiAgYC1jY29wdA0KICAtc3RhdGljJyBm bGFnIGFuZCB5b3UgZ2V0IGEgYmluYXJ5IHRoYXQgZG9lc27igJl0IGRlcGVuZCBvbiANCiAgYW55 dGhpbmcuDQoNCg0KW3NvdXBhdWx0IDRdIDxodHRwczovL3NvdXBhdWx0Lm5lb2NpdGllcy5vcmcv Pg0KDQoNCkR1bmUgMi4wLjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1bmUtMi0wLTAvNDc1OD4N Cg0KDQpyZ3JpbmJlcmcgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBPbiBiZWhhbGYgb2YgdGhlIGR1bmUgdGVh bSwgSeKAmW0gZGVsaWdodGVkIHRvIGFubm91bmNlIHRoZSANCiAgcmVsZWFzZSBvZg0KICBkdW5l IDIuMC4gVGhpcyByZWxlYXNlIGlzIHRoZSBjdWxtaW5hdGlvbiBvZiA0IG1vbnRocyBvZiBoYXJk IA0KICB3b3JrIGJ5DQogIHRoZSBkdW5lIHRlYW0gYW5kIGNvbnRhaW5zIG5ldyBmZWF0dXJlcywg YnVnIGZpeGVzLCBhbmQgDQogIHBlcmZvcm1hbmNlDQogIGltcHJvdmVtZW50cyAuIEhlcmXigJlz IGEgc2VsZWN0aW9uIG9mIG5ldyBmZWF0dXJlcyB0aGF0IEkgDQogIHBlcnNvbmFsbHkNCiAgZmlu ZCBpbnRlcmVzdGluZzoNCg0KICDigKIgTmV3IGJvb3N0cmFwIHByb2NlZHVyZSB0aGF0IHdvcmtz IGluIGxvdyBtZW1vcnkgZW52aXJvbm1lbnRzDQogIOKAoiAoYGRlcHJlY2F0ZWRfbGlicmFyeV9u YW1lJyAuLikgc3RhbnphIHRvIHByb3Blcmx5IGRlcHJlY2F0ZSANCiAgb2xkDQogICAgbGlicmFy eSBuYW1lcw0KICDigKIgKGBmb3JlaWduX2xpYnJhcnknIC4uKSBzdGFuemEgdG8gZGVmaW5lIEMv QysrIGxpYnJhcmllcy4NCiAg4oCiIEMgc3R1YnMgZGlyZWN0bHkgaW4gT0NhbWwgZXhlY3V0YWJs ZXMNCg0KICBSZWZlciB0byB0aGUgY2hhbmdlIGxvZyBmb3IgYW4gZXhoYXVzdGl2ZSBsaXN0Lg0K DQogIFdlIHN0cml2ZSBmb3IgYSBnb29kIG91dCBvZiB0aGUgYm94IGV4cGVyaWVuY2UgdGhhdCBy ZXF1aXJlcyBubw0KICBjb25maWd1cmF0aW9uLCBzbyB3ZeKAmXZlIGFsc28gdHdlYWtlZCBhIGZl dyBkZWZhdWx0cy4gSW4gDQogIHBhcnRpY3VsYXIsIGAkDQogIGR1bmUgYnVpbGQnIHdpbGwgbm93 IGJ1aWxkIGBAYWxsJyBpbnN0ZWFkIG9mIGBAaW5zdGFsbCcsIGFuZA0KICBvY2FtbGZvcm1hdCBy dWxlcyBhcmUgc2V0dXAgYnkgZGVmYXVsdC4NCg0KICBMYXN0bHksIGR1bmUgMi4wIHNoZWRzIGFs bCB0aGUgbGVnYWN5IHJlbGF0ZWQgdG8gamJ1aWxkZXIgYW5kIA0KICB3aWxsIG5vDQogIGxvbmdl ciBidWlsZCBqYnVpbGRlciBwcm9qZWN0cy4gVGhpcyBjaGFuZ2UgaXMgbmVjZXNzYXJ5IHRvIGVh c2UNCiAgbWFpbnRlbmFuY2UgYW5kIG1ha2UgaXQgZWFzaWVyIHRvIGFkZCBuZXcgZmVhdHVyZXMg ZG93biB0aGUNCiAgbGluZS4gVGhlcmUgYXJlIGEgZmV3IG90aGVyIG1pbm9yIGJyZWFraW5nIGNo YW5nZXMuIFJlZmVyIHRvIHRoZQ0KICBjaGFuZ2UgbG9nIGZvciB0aGUgZnVsbCBsaXN0LiBXZSBh cG9sb2dpemUgaW4gYWR2YW5jZSBmb3IgYW55DQogIGNvbnZlbmllbmNlIHRoaXMgbWlnaHQgY2F1 c2UuDQoNCiAgW0NoYW5nZWxvZ10NCg0KDQpbQ2hhbmdlbG9nXSA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1kdW5lLTItMC0wLzQ3NTg+DQoNCg0KQWR2YW5jZWQgQyBiaW5kaW5nIHVz aW5nIG9jYW1sLWN0eXBlcyBhbmQgZHVuZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hZHZhbmNlZC1jLWJpbmRp bmctdXNpbmctb2NhbWwtY3R5cGVzLWFuZC1kdW5lLzQ4MDU+DQoNCg0KdG9vdHMgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHdv cmtlZCBvbiBhIHNvY2tldC5oIGJpbmRpbmcgbGFzdCBzdW1tZXIgYW5kIGhhZCBhIGdyZWF0IA0K ICBleHBlcmllbmNlDQogIGludGVncmF0aW5nIG9jYW1sLWN0eXBlcyB3aXRoIGR1bmUsIEkgdGhv dWdodCB0aGF0IG1pZ2h0IGJlIG9mDQogIGludGVyZXN0IHRvIG90aGVyIGRldmVsb3BlcnMgc28g SSB3cm90ZSBhYm91dCBpdDoNCiAgPGh0dHBzOi8vbWVkaXVtLmNvbS9Acm9tYWluLmJlYXV4aXMv YWR2YW5jZWQtYy1iaW5kaW5nLXVzaW5nLW9jYW1sLWN0eXBlcy1hbmQtZHVuZS1jYzNmNGNiYWIz MDI+DQoNCg0KcmdyaW5iZXJnIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoaXMgaXMgYSBnb29kIGFydGljbGUuIEkgZW5j b3VyYWdlIGFueW9uZSB3aG8gd3JpdGVzIEMgYmluZGluZ3MgDQogIHdpdGgNCiAgY3R5cGVzIHRv IHN0dWR5IGl0IGNhcmVmdWxseS4NCg0KICBBIGxpdHRsZSBiaXQgb2YgYWR2aWNlIHRvIHNob3J0 ZW4geW91ciBkdW5lIGZpbGVzOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKGRlcHMgICAg KDpnZW4gLi9nZW5fY29uc3RhbnRzX2MuZXhlKSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhp cyBsaW5lIGlzbuKAmXQgbmVjZXNzYXJ5LiBEdW5lIGlzIHNtYXJ0IGVub3VnaCB0byBrbm93IHRo YXQgDQogIHJ1bm5pbmcgYQ0KICBiaW5hcnkgaW4gYSBydWxlIGluY3VycyBhIGRlcGVuZGVuY3kg b24gaXQuDQoNCiAgICAgICAgZHVuZSBoYXMgYSB0cnVseSBhbWF6aW5nIFtzdXBwb3J0IGZvciBj cm9zcy1jb21waWxpbmddLA0KICAgICAgICB3aGljaCB3ZSBkbyBub3QgY292ZXIgaGVyZSwgYnV0 LCB1bmZvcnR1bmF0ZWx5LCBpdHMNCiAgICAgICAgcHJpbWl0aXZlcyBmb3IgYnVpbGRpbmcgYW5k IGV4ZWN1dGluZyBiaW5hcmllcyBkbyBub3QgeWV0DQogICAgICAgIGNvdmVyIHRoaXMgdXNlIGNh c2UuDQoNCiAgSW5kZWVkLCB3ZSBkb27igJl0IGhhdmUgYW55IHByaW1pdGl2ZXMgZm9yIHJ1bm5p bmcgYmluYXJpZXMgb24gdGhlDQogIHRhcmdldCBwbGF0Zm9ybS4gUGVyaGFwcyB3ZSBzaG91bGQg YWRkIHNvbWUuIEhvd2V2ZXIsIHdlIGRvIGluIA0KICBmYWN0DQogIGhhdmUgc29tZSBmZWF0dXJl cyBpbiBkdW5lIHRvIHNvbHZlIHRoaXMgY29uY3JldGUgY3Jvc3MgDQogIGNvbXBpbGF0aW9uDQog IHByb2JsZW0uIEFzIGZhciBhcyBJIHVuZGVyc3RhbmQsIHRoZSBnb2FsIGlzIHRvIG9idGFpbiBz b21lIA0KICBjb21waWxlDQogIHRpbWUgdmFsdWVzIHN1Y2ggYXMgI2RlZmluZSBjb25zdGFudHMg YW5kIGZpZWxkIG9mZnNldHMgZm9yIHRoZSANCiAgdGFyZ2V0DQogIHBsYXRmb3JtLiBUaGlzIGRv ZXMgbm90IGluIGZhY3QgcmVxdWlyZSB0byBydW4gYW55dGhpbmcgb24gdGhlIA0KICBjcm9zcw0K ICBjb21waWxhdGlvbiB0YXJnZXQuIEluIGNvbmZpZ3VyYXRvciwgd2UgaGF2ZSBhIHByaW1pdGl2 ZQ0KICBgQ19kZWZpbmUuaW1wb3J0JyB0byBleHRyYWN0IHRoaXMgaW5mb3JtYXRpb24uIFRoZSBl bmQgcmVzdWx0IGlzIA0KICB0aGF0DQogIHRoZXNlIGNvbmZpZ3VyYXRvciBzY3JpcHRzIGFyZSBj b21wbGV0ZWx5IGNvbXBhdGlibGUgd2l0aCBjcm9zcw0KICBjb21waWxhdGlvbi4NCg0KICBQZXJo YXBzIHRoaXMgY291bGQgYmUgZ2VuZXJhbGl6ZWQgdG8gd29yayB3aXRoIGN0eXBlcyBnZW5lcmF0 b3JzIA0KICBhcw0KICB3ZWxsPw0KDQogIEZ1bm55IGJpdCBvZiB0cml2aWE6IFRoZSBoYWNrIGlu IGNvbmZpZ3VyYXRvciByZXF1aXJlZCB0byBkbyANCiAgdGhpcyBpcw0KICBpbiBmYWN0IHNvbWV0 aGluZyBJIGV4dHJhY3RlZCBmcm9tIGN0eXBlcyBpdHNlbGYuIFRoZSBvcmlnaW5hbCANCiAgYXV0 aG9yDQogIGlzIFt3aGl0ZXF1YXJrXSwgd2hvIGluIHR1cm4gd3JvdGUgaXQgdG8gbWFrZSBjdHlw ZXMgaXRzZWxmIA0KICBhbWVuZGFibGUNCiAgdG8gY3Jvc3MgY29tcGlsYXRpb24uDQoNCg0KW3N1 cHBvcnQgZm9yIGNyb3NzLWNvbXBpbGluZ10NCjxodHRwczovL2R1bmUucmVhZHRoZWRvY3MuaW8v ZW4vbGF0ZXN0L2Nyb3NzLWNvbXBpbGF0aW9uLmh0bWw+DQoNClt3aGl0ZXF1YXJrXSA8aHR0cHM6 Ly9naXRodWIuY29tL3doaXRlcXVhcms+DQoNCg0KZW1pbGxvbiB0aGVuIGFkZGVkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICAgICAg ICBUaGlzIGRvZXMgbm90IGluIGZhY3QgcmVxdWlyZSB0byBydW4gYW55dGhpbmcgb24gdGhlIGNy b3NzDQogICAgICAgIGNvbXBpbGF0aW9uIHRhcmdldC4gSW4gY29uZmlndXJhdG9yLCB3ZSBoYXZl IGEgcHJpbWl0aXZlDQogICAgICAgIGBDX2RlZmluZS5pbXBvcnQnIHRvIGV4dHJhY3QgdGhpcyBp bmZvcm1hdGlvbi4gVGhlIGVuZA0KICAgICAgICByZXN1bHQgaXMgdGhhdCB0aGVzZSBjb25maWd1 cmF0b3Igc2NyaXB0cyBhcmUgY29tcGxldGVseQ0KICAgICAgICBjb21wYXRpYmxlIHdpdGggY3Jv c3MgY29tcGlsYXRpb24uDQoNCiAgSWYgYW55Ym9keSB3YW50cyB0byBrbm93IG1vcmUgYWJvdXQg dGhpcyBiaXQsIEkgd3JvdGUgYW4gYXJ0aWNsZSANCiAgYWJvdXQNCiAgdGhpcyBsYXN0IHllYXI6 IA0KICA8aHR0cHM6Ly9kdW5lLmJ1aWxkL2Jsb2cvY29uZmlndXJhdG9yLWNvbnN0YW50cy8+DQoN Cg0KVXBjb21pbmcgYnJlYWtpbmcgY2hhbmdlIGluIEJhc2UvQ29yZSB2MC4xNA0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC91cGNv bWluZy1icmVha2luZy1jaGFuZ2UtaW4tYmFzZS1jb3JlLXYwLTE0LzQ4MDY+DQoNCg0KYmNjMzIg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBXZeKAmXJlIGNoYW5naW5nIGZ1bmN0aW9ucyBpbiBCYXNlIHRoYXQgdXNlZCB0byB1c2Ug dGhlIA0KICBwb2x5bW9ycGhpYw0KICB2YXJpYW50IHR5cGUgYFsgYEZzdCBvZiAnYSB8IGBTbmQg b2YgJ2IgXScgdG8gdXNlIGAoJ2EsICdiKSANCiAgRWl0aGVyLnQnDQogIGluc3RlYWQuIEFzIHdl bGwgYXMgZW5hYmxpbmcgdGhlIHVzZSBvZiBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiANCiAgdGhl DQogIEVpdGhlciBtb2R1bGUsIHRoaXMgbWFrZXMgdGhlIGZ1bmN0aW9ucyBjb25zaXN0ZW50IHdp dGggb3RoZXINCiAgZnVuY3Rpb25zIHRoYXQgYWxyZWFkeSB1c2UgYEVpdGhlci50JywgKGN1cnJl bnRseSBqdXN0DQogIGBTZXQuc3ltbWV0cmljX2RpZmYnKQ0KDQogIFRoZSBmb2xsb3dpbmcgZnVu Y3Rpb25z4oCZIHR5cGVzIHdpbGwgY2hhbmdlOg0KICDigKIgYFJlc3VsdC5va19mc3QnDQogIOKA oiBgTGlzdC5wYXJ0aXRpb25fbWFwJw0KICDigKIgYE1hcC5wYXJ0aXRpb25fbWFwJywgYE1hcC5w YXJ0aXRpb25fbWFwaScNCiAg4oCiIGBIYXNodGJsLnBhcnRpdGlvbl9tYXAnLCBgSGFzaHRibC5w YXJ0aXRpb25fbWFwaScNCg0KICBUaGUgdHlwZSBvZiBMaXN0LnBhcnRpdGlvbjNfbWFwIHdpbGwg bm90IGNoYW5nZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHZhbCBwYXJ0aXRpb24zX21h cA0KICDilIIgICA6ICAnYSB0DQogIOKUgiAgIC0+IGY6KCdhIC0+IFsgYEZzdCBvZiAnYiB8IGBT bmQgb2YgJ2MgfCBgVHJkIG9mICdkIF0pDQogIOKUgiAgIC0+ICdiIHQgKiAnYyB0ICogJ2QgdA0K ICDilJTilIDilIDilIDilIANCg0KICBXZSBkb27igJl0IGhhdmUgYSBnZW5lcmljIHRlcm5hcnkg dmFyaWFudCwgYW5kIGl0IGRvZXNu4oCZdCBzZWVtIA0KICB3b3J0aCBpdA0KICB0byBtaW50IG9u ZSBqdXN0IGZvciB0aGlzIHB1cnBvc2UuDQoNCiAgU2luY2UgdGhpcyBjaGFuZ2UgaXMgcHJldHR5 IHN0cmFpZ2h0Zm9yd2FyZCwgd2UgZXhwZWN0IHRoYXQgYSANCiAgc2ltcGxlDQogIGZpbmQvcmVw bGFjZSB3aWxsIGJlIHN1ZmZpY2llbnQgdG8gdXBkYXRlIGFueSBhZmZlY3RlZCBjYWxsIA0KICBz aXRlcy4NCg0KDQpDSS9DRCBQaXBlbGluZXM6IE1vbmFkLCBBcnJvdyBvciBEYXJ0Pw0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZTogDQogIDxodHRwczovL3Jvc2NpZHVzLmNvbS9ibG9nL2Jsb2cvMjAxOS8xMS8xNC9j aWNkLXBpcGVsaW5lcy8+DQoNCg0KVGhvbWFzIExlb25hcmQgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBJbiB0aGlzIHBvc3QgSSBkZXNjcmliZSB0aHJlZSBhcHByb2FjaGVzIHRvIGJ1 aWxkaW5nIGEgbGFuZ3VhZ2UgDQogIGZvcg0KICB3cml0aW5nIENJL0NEIHBpcGVsaW5lcy4gTXkg Zmlyc3QgYXR0ZW1wdCB1c2VkIGEgbW9uYWQsIGJ1dCB0aGlzDQogIHByZXZlbnRlZCBzdGF0aWMg YW5hbHlzaXMgb2YgdGhlIHBpcGVsaW5lcy4gSSB0aGVuIHRyaWVkIHVzaW5nIA0KICBhbg0KICBh cnJvdywgYnV0IGZvdW5kIHRoZSBzeW50YXggdmVyeSBkaWZmaWN1bHQgdG8gdXNlLiBGaW5hbGx5 LCBJIA0KICBlbmRlZCB1cA0KICB1c2luZyBhIGxpZ2h0LXdlaWdodCBhbHRlcm5hdGl2ZSB0byBh cnJvd3MgdGhhdCBJIHdpbGwgcmVmZXIgdG8gDQogIGhlcmUNCiAgYXMgYSBkYXJ0IChJIGRvbuKA mXQga25vdyBpZiB0aGlzIGhhcyBhIG5hbWUgYWxyZWFkeSkuIFRoaXMgYWxsb3dzIA0KICBmb3IN CiAgc3RhdGljIGFuYWx5c2lzIGxpa2UgYW4gYXJyb3csIGJ1dCBoYXMgYSBzeW50YXggZXZlbiBz aW1wbGVyIA0KICB0aGFuIGENCiAgbW9uYWQuDQoNCiAgPGh0dHBzOi8vcm9zY2lkdXMuY29tL2Js b2cvYmxvZy8yMDE5LzExLzE0L2NpY2QtcGlwZWxpbmVzLz4NCg0KDQpVc2Ugb2YgZnVuY3RvcnMg dG8gYXBwcm94aW1hdGUgRiMgc3RhdGljYWxseSByZXNvbHZlZCB0eXBlIA0KcGFyYW1ldGVycw0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC91c2Utb2YtZnVuY3RvcnMtdG8tYXBwcm94aW1hdGUt Zi1zdGF0aWNhbGx5LXJlc29sdmVkLXR5cGUtcGFyYW1ldGVycy80NzgyPg0KDQoNCmNteGEgYXNr ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gbGVhcm5pbmcgT0Nh bWwgY29taW5nIGZyb20gRiMuIEluIEYjLCB0byBjYWxjdWxhdGUgdGhlIA0KICBhdmVyYWdlIG9m DQogIGFuIGFycmF5IHdob3NlIGVsZW1lbnQgdHlwZSBzdXBwb3J0cyBhZGRpdGlvbiBhbmQgZGl2 aXNpb24sIG9uZSANCiAgY2FuDQogIHdyaXRlDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBs ZXQgaW5saW5lIGF2ZXJhZ2UgKGFycjogJ2FbXSkgOiAnYQ0KICDilIIgICAgIHdoZW4gXmEgOiAo c3RhdGljIG1lbWJlciBEaXZpZGVCeUludCA6IF5hICogaW50IC0+IF5hKQ0KICDilIIgICAgIGFu ZCAgXmEgOiAoc3RhdGljIG1lbWJlciAoKykgOiBeYSAqIF5hIC0+IF5hKQ0KICDilIIgICAgIGFu ZCAgXmEgOiAoc3RhdGljIG1lbWJlciBaZXJvIDogXmEpDQogIOKUgiAgICAgPQ0KICDilIIgICAg IGlmIEFycmF5Lmxlbmd0aCBhcnIgPSAwIHRoZW4gDQogIChMYW5ndWFnZVByaW1pdGl2ZXMuR2Vu ZXJpY1plcm8pIGVsc2UNCiAg4pSCICAgICBMYW5ndWFnZVByaW1pdGl2ZXMuRGl2aWRlQnlJbnQg KEFycmF5LmZvbGQgKCspIA0KICAoTGFuZ3VhZ2VQcmltaXRpdmVzLkdlbmVyaWNaZXJvKSBhcnIp IChBcnJheS5sZW5ndGggYXJyKQ0KICDilJTilIDilIDilIDilIANCg0KICBNeSB1bmRlcnN0YW5k aW5nIGlzIHRoYXQgaW4gT0NhbWwsIG9uZSB3b3VsZCBoYXZlIGEgbW9kdWxlIHR5cGUgDQogIGxp a2UNCiAgc286DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1bGUgdHlwZSBBdmVyYWdh YmxlID0gc2lnDQogIOKUgiAgIHR5cGUgJ2EgdA0KICDilIINCiAg4pSCICAgdmFsIGRpdmlkZV9i eV9pbnQgOiAnYSAtPiBpbnQgLT4gJ2ENCiAg4pSCICAgdmFsIHBsdXMgOiAnYSAtPiAnYSAtPiAn YQ0KICDilIIgICB2YWwgemVybyA6ICdhDQogIOKUgiBlbmQNCiAg4pSU4pSA4pSA4pSA4pSADQoN CiAgTXkgcXVlc3Rpb24gaXMgaG93IHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIHdvdWxkIGJl IHdyaXR0ZW46DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgYXZlcmFnZSBhcnIgPQ0K ICDilIIgICA/Pz8NCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0Kc21vbGthaiByZXBsaWVkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBGaXJzdCwgYEF2 ZXJhZ2FibGUnIHNob3VsZCBsb29rIGxpa2UgdGhpczoNCg0KICDilIzilIDilIDilIDilIANCiAg 4pSCIG1vZHVsZSB0eXBlIEF2ZXJhZ2FibGUgPSBzaWcNCiAg4pSCICAgdHlwZSB0DQogIOKUgiAg IHZhbCBkaXZpZGVfYnlfaW50IDogdCAtPiBpbnQgLT4gdA0KICDilIIgICB2YWwgcGx1cyA6IHQg LT4gdCAtPiB0DQogIOKUgiAgIHZhbCB6ZXJvIDogdA0KICDilIIgZW5kDQogIOKUlOKUgOKUgOKU gOKUgA0KDQogIFRoZW4gYXZlcmFnZSB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoNCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBhdmVyYWdlICh0eXBlIHQpIChtb2R1bGUgQSA6 IEF2ZXJhZ2FibGUgd2l0aCB0eXBlIHQgPSB0KSANCiAgKGFyciA6IHQgYXJyYXkpIDogdCA9DQog IOKUgiAgIEFycmF5LmZvbGQgfmluaXQ6QS56ZXJvIH5mOkEucGx1cyBhcnINCiAg4pSU4pSA4pSA 4pSA4pSADQoNCiAgKFRoZSBjb2RlIGFib3ZlIHVzZXMgSmFuZSBTdHJlZXTigJlzIEJhc2UvQ29y ZSBsaWJyYXJ5LikNCg0KDQppdmcgdGhlbiBhZGRlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2hpbGUgQHNtb2xrYWrigJlzIGFuc3dlciBpcyBhIGNv cnJlY3QgYW5kIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiANCiAgb2YgeW91cg0KICBGIyBjb2RlLCBp dCBtaWdodCBiZSBuaWNlciBpZiB5b3VyIGNvZGUgY2FuIGludGVycGxheSB3aXRoIA0KICBleGlz dGluZw0KICBhYnN0cmFjdGlvbnMgaW4gdGhlIE9DYW1sIGluZnJhc3RydWN0dXJlLiBGb3IgZXhh bXBsZSwNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wZW4gQmFzZQ0KICDilIINCiAg4pSC IGxldCBhdmVyYWdlICh0eXBlIGEpIChtb2R1bGUgVCA6IEZsb2F0YWJsZS5TIHdpdGggdHlwZSB0 ID0gYSkgDQogIHhzID0NCiAg4pSCICAgQXJyYXkuZm9sZCB+aW5pdDowLiB+ZjooZnVuIHMgeCAt PiBzICsuIFQudG9fZmxvYXQgeCkgeHMgLy4NCiAg4pSCICAgRmxvYXQub2ZfaW50IChBcnJheS5s ZW5ndGggeHMpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIGFuZCBub3cgaXQgY291bGQgYmUgdXNl ZCB3aXRoIGFueSBleGlzdGluZyBudW1lcmljIGRhdGEgaW4gDQogIEJhc2UvQ29yZQ0KDQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgYXZlcmFnZSAobW9kdWxlIEludCkgW3wxOzI7Mzs0fF07Ow0K ICDilIIgLSA6IEJhc2UuRmxvYXQudCA9IDIuNQ0KICDilJTilIDilIDilIDilIANCg0KICBhbmQg ZXZlbiBhZGFwdGVkIHRvIG5vbi1udW1iZXJzLA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg bGV0IGF2ZXJhZ2VfbGVuZ3RoID0gYXZlcmFnZSAobW9kdWxlIHN0cnVjdA0KICDilIIgICAgIGlu Y2x1ZGUgU3RyaW5nDQogIOKUgiAgICAgbGV0IHRvX2Zsb2F0IHggPSBGbG9hdC5vZl9pbnQgKFN0 cmluZy5sZW5ndGggeCkNCiAg4pSCICAgICBsZXQgb2ZfZmxvYXQgXyA9IGFzc2VydCBmYWxzZQ0K ICDilIIgICBlbmQpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZSBsYXR0ZXIgZXhhbXBsZSBz aG93cyB0aGF0IHdlIHJlcXVlc3RlZCBtb3JlIGludGVyZmFjZSB0aGFuIA0KICBuZWVkLCBhDQog IGNvc3QgdGhhdCB3ZSBoYXZlIHRvIHBheSBmb3IgdXNpbmcgYW4gZXhpc3RpbmcgZGVmaW5pdGlv bi4gSW4gDQogIGNhc2VzDQogIHdoZW4gaXQgbWF0dGVycywgeW91IGNhbiBzcGVjaWZ5IHRoZSBz cGVjaWZpYyBpbnRlcmZhY2UsIGUuZy4sDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1 bGUgdHlwZSBGbG9hdGFibGUgPSBzaWcNCiAg4pSCICAgdHlwZSB0DQogIOKUgiAgIHZhbCB0b19m bG9hdCA6IHQgLT4gZmxvYXQNCiAg4pSCIGVuZA0KICDilIINCiAg4pSCIGxldCBhdmVyYWdlICh0 eXBlIGEpIChtb2R1bGUgVCA6IEZsb2F0YWJsZSB3aXRoIHR5cGUgdCA9IGEpIHhzIA0KICA9DQog IOKUgiAgIEFycmF5LmZvbGQgfmluaXQ6MC4gfmY6KGZ1biBzIHggLT4gcyArLiBULnRvX2Zsb2F0 IHgpIHhzIC8uDQogIOKUgiAgIEZsb2F0Lm9mX2ludCAoQXJyYXkubGVuZ3RoIHhzKQ0KICDilJTi lIDilIDilIDilIANCg0KICBCdXQgd2UgcmVhY2hlZCB0aGUgcG9pbnQgd2hlcmUgdXNpbmcgZmly c3QgY2xhc3MgbW9kdWxlcyBpcyANCiAgdG90YWxseQ0KICB1bm5lY2Vzc2FyeS4gT3VyIGludGVy ZmFjZSBoYXMgb25seSBvbmUgZnVuY3Rpb24sIHNvIHRoZSANCiAgZm9sbG93aW5nDQogIGRlZmlu aXRpb24gb2YgYXZlcmFnZSwgaXMgbXVjaCBtb3JlIG5hdHVyYWwNCg0KICDilIzilIDilIDilIDi lIANCiAg4pSCIGxldCBhdmVyYWdlIHhzIH5mID0NCiAg4pSCICAgQXJyYXkuZm9sZCB+aW5pdDow LiB+ZjooZnVuIHMgeCAtPiBzICsuIGYgeCkgeHMgLy4NCiAg4pSCICAgRmxvYXQub2ZfaW50IChB cnJheS5sZW5ndGggeHMpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIGl0IGhhcyB0eXBlIGAnYSBh cnJheSAtPiBmOignYSAtPiBmbG9hdCkgLT4gZmxvYXQnIGFuZCBjb21wdXRlcyANCiAgYW4NCiAg YXZlcmFnZSBvZiBgZiB4X2knIGZvciBhbGwgZWxlbWVudHMgaW4gdGhlIGFycmF5Lg0KDQoNCk9s ZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBh IENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCANCiAgSSdsbCBtYWlsDQogIGl0 IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBm ZWVkIA0KICBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVj ZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgDQogIHN1YnNjcmliZQ0KICBbb25s aW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0 bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHA6 Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVz XSANCjxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltvbmxpbmVd IDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0KDQpb QWxhbiBTY2htaXR0XSA8aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of November 26 to Decemb= er 03, 2019.

Irmin 2.0.0 release

Continuing this thread, samoht announced

And there is now a follow-up blog post, explaining how to use the new Graph= QL API available in Irmin2: https://tarides.com/blog/2019-11-27-introducing-= irmin-graphql.

How viable is delivering binaries linked to Cygwin to Windows = customers?

mbacarella asked

I=E2=80=99m in the early stages of planning a deliverable binary product th= at will run on Linux, Mac and Windows.

My brief sniff of the air around the OCaml ecosystem says I should expect t= o target Cygwin to get Windows going (although there=E2=80=99s impressive w= ork to get native Windows stuff done that can become the preferred approach= in a few years).

My experience using Cygwin as an operating environment is that it=E2=80=99s= pretty darn sluggish compared to Linux on the same computer.

Why is this? There=E2=80=99s an anecdote that says Cygwin can only fork at = about 30-50x a second on Windows, due to how it has to adapt it to work wit= hin Windows=E2=80=99 task spawning model. (For contrast, Linux can achieve = thousands of forks per second if you play around with it).

I understand from another product developer that when they build binaries t= o deliver to Windows/Cygwin, they actually cross-compile on Linux because o= f how slowly the toolchain runs on Cygwin.

That sounds like bad news if you want to do UNIXy things, but for a single = standalone application this might not be so bad? I assume if I ship a deliv= erable to Windows/Cygwin, the end user may enjoy good performance, so long = as I=E2=80=99m not spawning tons of processes or relying on fork for multi-= programming. Is this a safe assumptions?

Any other gotchas when it comes to OCaml on Cygwin w.r.t. performance?

The app pretty much has real-time gaming requirements (though it=E2=80=99s = not a game so can side-step worrying about access to GPUs and what-not). St= ated another way, although my application will depend on the POSIX layer of= fered by Cygwin, I expect it not to crunch POSIX related stuff in the main = loop.

How has your experience gone?

John Whitington replied

I have been shipping commercial binaries for Linux (32 and 64 bit), Windows= (32 and 64bit) and OS X for years. For example: https://githu= b.com/coherentgraphics/cpdf-binaries

And even static or shared libraries in binary form: https://gith= ub.com/coherentgraphics/cpdflib-binary

On OS X, you need to use MACOSX_DEPLOYMENT_TARGET or similar to make sure y= our builds will run on older systems. And, in fact, you need to use MACOSX_= DEPLOYMENT_TARGET when asking OPAM to compile the OCaml compiler itself. An= d, you will need to deal with codesigning and notarization. But it=E2=80=99= s all doable.

For linux, you may need to build under older linux versions, to make sure t= hat the glibc in use is old enough. This is not an ocaml-specific problem. = I have a 64 bit and 32 bit VM with old-ish glibc versions for this purpose.

Under Windows, there are no such backward-compatibility problems. I use the= new OCaml for windows system, which comes with OPAM, and is mingw-based. N= o cygwin remains in the final binary.

For more obscure systems (AIX, HPUX, Sparc etc) customers compile from sour= ce (with help from me). Not once in more than ten years has anyone cared that = it was written in OCaml.

dbuenzli also replied

remember that on the Windows native port, the Unix module distributed with = OCaml is your POSIX compatibility layer. There are a few entry points to av= oid though, the list is at the bottom of this page.

nojb also replied

At LexiFi our main application is developed and shipped on Windows. We use = the msvc port of OCaml. This means that you need Cygwin to develop, but the= resulting application is fully native and does not depend on the Cygwin DL= L. As @dbuenzli mentioned, the Unix module is the POSIX compatibilit= y layer.

Compilation speed is slower on Windows because process creation is slower o= n Windows as a general rule, but it is manageable (our application has arou= nd 2000 modules + Js_of_ocaml + C bindings + C# component).

We don=E2=80=99t have any issues with runtime performance. The Unix library mentioned above implements Windows support directly without g= oing through any compatibility layer and is quite efficient.

BikalGurung also replied

There is an editor being built in ocaml/reasonml which currently targets wi= ndows, linux and macos - https:/= /github.com/onivim/oni2. However, the binary is native windows rather t= han cygwin derivative. So if you don=E2=80=99t have to use cygwin dependenc= ies then native windows binary could be the way to go.

Also esy - https://github.com/esy/es= y makes developing ocaml/reasonml on windows viable.

keleshev also replied

TLDR: Install the Mingw port of OCaml 4, freely use most opam libraries, and co= mpile to native Windows binaries, without licensing issues.

I recommend you read the =E2=80=9CRelease notes for Windows=E2=80=9D: htt= ps://github.com/ocaml/ocaml/blob/trunk/README.win32.adoc

To summarise, there are three Windows ports:

  • Native Microsoft port,
  • Native Mingw port,
  • Cygwin port.

All three require Cygwin for development purposes. I recommend using the Na= tive Mingw, as:

To contrast, Native Microsoft requires Visual Studio, and doesn=E2=80=99t h= ave opam. You can still vendor pure OCaml packages, but as soon as you want= to use some C bindings you=E2=80=99re in trouble, because of the =E2=80=9C= minor=E2=80=9D differences between Visual C and GCC. And everything assumes= GCC nowadays.

Cygwin port is the one I don=E2=80=99t have experience with, but re-reading= the =E2=80=9CRelease notes for Windows=E2=80=9D above it strikes me that i= t mentions that Cygwin was re-licensed from GPL to LGPL with static linking= exception. So it looks like the Cygwin port could be viable for commercial= use, but I never tried to statically linked cygwin.dll, and I= =E2=80=99m not sure what are the benefits of Cygwin port over the Mingw por= t.

dmbaturin also replied

With soupault 4, I decided = to ship prebuilt binaries for all platforms including Windows. Mostly to se= e if I can, all its users I know of are on UNIX-like systems and know how t= o build from source, but that=E2=80=99s beside the point. :wink:

I can confirm everything @keleshev says: fdopen=E2=80=99s package just work= s, opam works exactly like it does on UNIX, pure OCaml libraries are trivia= l to install, and the binaries don=E2=80=99t depend on cygwin. Note that =E2=80=9Copam switch create=E2=80=9D also just works, you can ins= tall either MinGW or MSVC compiler versions as opam switches. I only ever start the Windows VM to make release builds, and the workflow i= s exactly the same as on Linux where I=E2=80=99m actually writing code.

My only obstacle on that path was that FileUtils lost its Windows compatibi= lity, but I wanted to use it, so I worked with @gildor478 to make it cross-= platform again. Uncovered a bug in the implementation of Unix.utimes in the= process, but it=E2=80=99s hardly a commonly used function.

You can also setup AppVeyor builds. It=E2=80=99s not as simple as I wish it= would be, but there are projects doing it that you can steal the setup fro= m.

There=E2=80=99s also opam-cross-windows, but it=E2=80=99s very incomplete a= nd needs work to be practical. There are no big obstacles, it just needs wo= rk. While files in opam-repository-mingw are normally identical to the defa= ult opam repository, the cross one needs small adjustments in every package= to specify the toolchain to use, so the required work is mostly a lot of t= rivial but manual actions. I hope eventually it reaches parity with fdopen= =E2=80=99s one and we=E2=80=99ll be able to easily build for Windows withou= t ever touching Windows.

As of static Linux builds, @JohnWhitington=E2=80=99s approach can work, but= there=E2=80=99s a better option if you don=E2=80=99t need anything from gl= ibc specifically and don=E2=80=99t link against any C libs: build staticall= y with musl. There=E2=80=99s a +musl+static+flambda compiler f= lavour. You need musl and gcc-musl to install it, but after that, just buil= d with -ccopt -static flag and you get a binary that doesn=E2= =80=99t depend on anything.

Dune 2.0.0

rgrinberg announced

On behalf of the dune team, I=E2=80=99m delighted to announce the release o= f dune 2.0. This release is the culmination of 4 months of hard work by the= dune team and contains new features, bug fixes, and performance improvemen= ts . Here=E2=80=99s a selection of new features that I personally find inte= resting:

  • New boostrap procedure that works in low memory environments
  • (deprecated_library_name ..) stanza to properly deprecate = old library names
  • (foreign_library ..) stanza to define C/C++ libraries.
  • C stubs directly in OCaml executables

Refer to the change log for an exhaustive list.

We strive for a good out of the box experience that requires no configurati= on, so we=E2=80=99ve also tweaked a few defaults. In particular, $ du= ne build will now build @all instead of @install<= /code>, and ocamlformat rules are setup by default.

Lastly, dune 2.0 sheds all the legacy related to jbuilder and will no longe= r build jbuilder projects. This change is necessary to ease maintenance and= make it easier to add new features down the line. There are a few other mi= nor breaking changes. Refer to the change log for the full list. We apologi= ze in advance for any convenience this might cause.

Changelog

Advanced C binding using ocaml-ctypes and dune

toots announced

I worked on a socket.h binding last summer and had a great experience integ= rating ocaml-ctypes with dune, I thought that might be of interest to other= developers so I wrote about it: https://me= dium.com/@romain.beauxis/advanced-c-binding-using-ocaml-ctypes-and-dune-cc3= f4cbab302

rgrinberg replied

This is a good article. I encourage anyone who writes C bindings with ctype= s to study it carefully.

A little bit of advice to shorten your dune files:

(deps    (:gen ./gen_constants_c.exe))

This line isn=E2=80=99t necessary. Dune is smart enough to know that runnin= g a binary in a rule incurs a dependency on it.

dune has a truly amazing support for cross-compiling, which we do not cov= er here, but, unfortunately, its primitives for building and executing bina= ries do not yet cover this use case.

Indeed, we don=E2=80=99t have any primitives for running binaries on the ta= rget platform. Perhaps we should add some. However, we do in fact have some= features in dune to solve this concrete cross compilation problem. As far = as I understand, the goal is to obtain some compile time values such as #de= fine constants and field offsets for the target platform. This does not in = fact require to run anything on the cross compilation target. In configurat= or, we have a primitive C_define.import to extract this inform= ation. The end result is that these configurator scripts are completely com= patible with cross compilation.

Perhaps this could be generalized to work with ctypes generators as well?

Funny bit of trivia: The hack in configurator required to do this is in fac= t something I extracted from ctypes itself. The original author is whitequark, who in turn wrote it to = make ctypes itself amendable to cross compilation.

emillon then added

This does not in fact require to run anything on the cross compilation targ= et. In configurator, we have a primitive C_define.import to ex= tract this information. The end result is that these configurator scripts a= re completely compatible with cross compilation.

If anybody wants to know more about this bit, I wrote an article about this= last year: https://dune.bu= ild/blog/configurator-constants/

Upcoming breaking change in Base/Core v0.14

bcc32 announced

We=E2=80=99re changing functions in Base that used to use the polymorphic variant type [ `Fst of 'a | `Snd of 'b ] to use ('a, 'b)= Either.t instead. As well as enabling the use of all of the functions in the Either module, this makes the functions consistent with other functions that already use Either.t, (currently just Set.symmetric_diff)

The following functions=E2=80=99 types will change:

  • Result.ok_fst
  • List.partition_map
  • Map.partition_map, Map.partition_mapi
  • Hashtbl.partition_map, Hashtbl.partition_mapi=

The type of List.partition3_map will not change:

val partition3_map
  :  'a t
  -> f:('a -> [ `Fst of 'b | `Snd of 'c | `Trd of 'd ])
  -> 'b t * 'c t * 'd t

We don=E2=80=99t have a generic ternary variant, and it doesn=E2=80=99t see= m worth it to mint one just for this purpose.

Since this change is pretty straightforward, we expect that a simple find/r= eplace will be sufficient to update any affected call sites.

CI/CD Pipelines: Monad, Arrow or Dart?

Thomas Leonard announced

In this post I describe three approaches to building a language for writing= CI/CD pipelines. My first attempt used a monad, but this prevented static = analysis of the pipelines. I then tried using an arrow, but found the synta= x very difficult to use. Finally, I ended up using a light-weight alternati= ve to arrows that I will refer to here as a dart (I don=E2=80=99t know if t= his has a name already). This allows for static analysis like an arrow, but= has a syntax even simpler than a monad.

https= ://roscidus.com/blog/blog/2019/11/14/cicd-pipelines/

Use of functors to approximate F# statically resolved type par= ameters

cmxa asked

I am learning OCaml coming from F#. In F#, to calculate the average of an a= rray whose element type supports addition and division, one can write

let inline average (arr: 'a[]) : 'a
    when ^a : (static member DivideByInt : ^a * int -> ^a)
    and  ^a : (static member (+) : ^a * ^a -> ^a)
    and  ^a : (static member Zero : ^a)
    =3D
    if Array.length arr =3D 0 then (LanguagePrimitives.GenericZero) else
    LanguagePrimitives.DivideByInt (Array.fold (+) (LanguagePrimitives.Gene=
ricZero) arr) (Array.length arr)

My understanding is that in OCaml, one would have a module type like so:

module type Averagable =
=3D sig
  type 'a t

  val divide_by_int : 'a -> int -> 'a
  val plus : 'a -> 'a -> 'a
  val zero : 'a
end

My question is how the corresponding function would be written:

let average arr =3D
  ???

smolkaj replied

First, Averagable should look like this:

module type Averagable =
=3D sig
  type t
  val divide_by_int : t -> int -> t
  val plus : t -> t -> t
  val zero : t
end

Then average will look something like this:

let average (type t) =
(module A : Averagable with type t =3D t) (arr : t array) : t =3D
  Array.fold ~init:A.zero ~f:A.plus arr

(The code above uses Jane Street=E2=80=99s Base/Core library.)

ivg then added

While @smolkaj=E2=80=99s answer is a correct and direct implementation of y= our F# code, it might be nicer if your code can interplay with existing abs= tractions in the OCaml infrastructure. For example,

open Base

let average (type a) (module T : Floatable.S with type t =3D a) xs =3D
  Array.fold ~init:0. ~f:(fun s x -> s +. T.to_float x) xs /.
  Float.of_int (Array.length xs)

and now it could be used with any existing numeric data in Base/Core

average (modul=
e Int) [|1;2;3;4|];;
=2D : Base.Float.t =3D 2.5

and even adapted to non-numbers,

let average_length =3D a=
verage (module struct
    include String
    let to_float x =3D Float.of_int (String.length x)
    let of_float _ =3D assert false
  end)

The latter example shows that we requested more interface than need, a cost= that we have to pay for using an existing definition. In cases when it mat= ters, you can specify the specific interface, e.g.,

module type Floatable =
=3D sig
  type t
  val to_float : t -> float
end

let average (type a) (module T : Floatable with type t =3D a) xs =3D
  Array.fold ~init:0. ~f:(fun s x -> s +. T.to_float x) xs /.
  Float.of_int (Array.length xs)

But we reached the point where using first class modules is totally unneces= sary. Our interface has only one function, so the following definition of a= verage, is much more natural

let average xs ~f =3D
  Array.fold ~init:0. ~f:(fun s x -> s +. f x) xs /.
  Float.of_int (Array.length xs)

it has type 'a array -> f:('a -> float) -> float and = computes an average of f x_i for all elements in the array.

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 RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl3mgnwACgkQBA0KO07S 5cf5fwf+OCEPaFcQMlEOtzuErgqjV/oabUhQIJqA3Yq7Kih3ehj3RGYDkUpZj6+T xWTHVEIRrH5zpyE851nzkwHPqMEkP1AyQYu24mtgwKTcfQgbNVJUMUB8vjtGA+Fc aW+XeC0IeTn3dv1lluGuR4w/4wkYjIxGAmsF+iXH2rEmvUzpM7+G8MjK98CM6W5e 9upIsJFmkr7LvAntKafU9bKxNfki8K8JdWlV9rJIoTwNhdx2oQYxAz+KVUagX1SW Yvoe8Kq1NAzFl0dWW91JM6O/dVpRvEo6WF/HBMePZuRbkySAzTJUascbJarxqHcn O4nLgjkzwmdfPZgsc6Q3MfVNWRNKfw== =a7+2 -----END PGP SIGNATURE----- --===-=-=--