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 20DC72E03 for ; Tue, 11 May 2021 14:48:12 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.82,291,1613430000"; d="scan'208,217";a="507772820" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 11 May 2021 16:48:07 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 2C2F2E0163; Tue, 11 May 2021 16:48:07 +0200 (CEST) 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 96528E0143 for ; Tue, 11 May 2021 16:48:02 +0200 (CEST) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3A8gfXxKBum39kclTlHela55DYdb4zR+YMi2TD?= =?us-ascii?q?sHoBLyC9E/bo8PxG885rsCMc5Ax+ZJhCo6HiBED/ewK5yXcd2+B4AV7IZmnbUQ?= =?us-ascii?q?WTTb2KobGSoQHICmn19fBb0ON6f6JzCML9FjFB5/rS8U2zEMgmxZ2c/KekhfrT?= =?us-ascii?q?yx5WIT1CeuVr7Bl/D0KADkZtThJHHIc4Ep303KV6jivlc3cIacH+GmMIRIH4yu?= =?us-ascii?q?HjhdbtYgAAAlo55BKVjTWugYSQLySl?= X-IronPort-AV: E=Sophos;i="5.82,291,1613430000"; d="scan'208,217";a="507772783" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 May 2021 16:48:01 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 11 May 2021 16:47:52 +0200 Message-ID: <871rad499j.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 18488 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWF5IDA0IHRvIDExLA0KMjAyMS4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpTb2Z0d2FyZSBl bmdpbmVlciBwb3NpdGlvbiBhdCBMZXhpRmkgKFBhcmlzKQ0KT3BlbiBzb3VyY2UgZWRpdG9yIGZv ciBpT1MsIGlQYWRPUyBhbmQgbWFjT1MNCkJhY2tlbmQgZGV2ZWxvcGVyIHBvc2l0aW9uIGF0IElz c3V1IChDb3BlbmhhZ2VuKQ0KMjUgeWVhcnMgb2YgT0NhbWwNCk9DYW1sIGNvbXBpbGVyIGRldmVs b3BtZW50IG5ld3NsZXR0ZXIsIGlzc3VlIDE6IGJlZm9yZSBNYXkgMjAyMQ0KQWZ0ZXIgc28gbWFu eSB5ZWFycywgSSBkaXNjb3ZlciAnU3RyLmJvdW5kZWRfZnVsbF9zcGxpdCByZWdleHAgc3RyIG4n DQpQYXJzZXIgZm9yIHRoZSBTY2FsYSBwcm9ncmFtbWluZyBsYW5ndWFnZT8NCk9sZCBDV04NCg0K DQpTb2Z0d2FyZSBlbmdpbmVlciBwb3NpdGlvbiBhdCBMZXhpRmkgKFBhcmlzKQ0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9q b2Itc29mdHdhcmUtZW5naW5lZXItcG9zaXRpb24tYXQtbGV4aWZpLXBhcmlzLzc3ODIvMT4NCg0K DQpBbGFpbiBGcmlzY2ggYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBbTGV4aUZpXSBpcyBoaXJp bmchIFdlIGFyZSBsb29raW5nIGZvciBhIGZ1bGx5LXRpbWUgc29mdHdhcmUgZW5naW5lZXINCiAg dG8gam9pbiBvdXIgY29yZSBkZXZlbG9wbWVudCB0ZWFtLiBUaGUgdmFzdCBtYWpvcml0eSBvZiBv dXIgc3RhY2sgaXMNCiAgaW1wbGVtZW50ZWQgaW4gT0NhbWwsIGFuZCB3ZSBoYXZlIHBsZW50eSBv ZiBleGNpdGluZyBwcm9qZWN0cyBvbiBhDQogIHdpZGUgcmFuZ2Ugb2YgdG9waWNzLg0KDQogIE1v cmUgaW5mbyBvbiA8aHR0cHM6Ly93d3cubGV4aWZpLmNvbS9jYXJlZXJzL3NvZnR3YXJlX2VuZ2lu ZWVyLz4NCg0KDQpbTGV4aUZpXSA8aHR0cHM6Ly93d3cubGV4aWZpLmNvbT4NCg0KDQpPcGVuIHNv dXJjZSBlZGl0b3IgZm9yIGlPUywgaVBhZE9TIGFuZCBtYWNPUw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vcGVuLXNvdXJj ZS1lZGl0b3ItZm9yLWlvcy1pcGFkb3MtYW5kLW1hY29zLzc2MjQvMTU+DQoNCg0KQ29udGludWlu ZyB0aGlzIHRocmVhZCwgTmF0aGFuIEZhbGxldCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEp1c3QgdXBkYXRlZCB0aGUgZWRpdG9yLCBJIHJlZGVzaWduZWQgdGhl IG1hY09TIHZlcnNpb24sIGFuZCBpdCBqdXN0DQogIGxvb2tzIGJldHRlciBhbmQgbW9yZSBuYXRp dmUNCg0KICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJkMTEvdXBsb2Fk cy9vY2FtbC9vcHRpbWl6ZWQvMlgvNi82YjAzYzQ2Mjc1NWZiMzdhMmQ1MDE4MDEzYzNkMWM4YmQ0 NWY1M2JmXzJfMTM4MHg3NjYuanBlZz4NCg0KICBXaGF0IGFyZSB5b3VyIGZpcnN0IGltcHJlc3Np b25zIG9uIGl0Pw0KDQoNCkJhY2tlbmQgZGV2ZWxvcGVyIHBvc2l0aW9uIGF0IElzc3V1IChDb3Bl bmhhZ2VuKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9qb2ItYmFja2VuZC1kZXZlbG9wZXItcG9zaXRp b24tYXQtaXNzdXUtY29wZW5oYWdlbi83NzkzLzE+DQoNCg0KRGFyaW8gVGVpeGVpcmEgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgbG9va2luZyBmb3IgYSBCYWNrZW5kIERl dmVsb3BlciB3aXRoIGV4cGVyaWVuY2UgaW4gbWFjaGluZQ0KICBsZWFybmluZyDigJMgYW5kIHBy ZWZlcmFibHkgYWxzbyBPQ2FtbCEg4oCTIHRvIGpvaW4gb3VyIFJlc2VhcmNoICYNCiAgRGV2ZWxv cG1lbnQgdGVhbS4gWW91IHdpbGwgaGVscCBidWlsZCBtYWNoaW5lIGxlYXJuaW5nIHJlc2VhcmNo DQogIHByb3RvdHlwZXMgYW5kIGJlIHJlc3BvbnNpYmxlIGZvciBpbnRlZ3JhdGluZyB0aGVtIGlu dG8gbmV3IGFuZA0KICBleGlzdGluZyBwcm9kdWN0cy4NCg0KICBBdCBJc3N1dSwgd2UgdXNlIE9D YW1sIGV4dGVuc2l2ZWx5IGluIG91ciBwcm9kdWN0aW9uIHN5c3RlbXMuIElmIHlvdQ0KICBsb3Zl IE9DYW1sIGFuZCBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGluIGdlbmVyYWwsIElzc3V1IGlzIGEg Z3JlYXQNCiAgcGxhY2UgdG8gcHV0IHlvdXIgcGFzc2lvbiBpbnRvIHJlYWwtd29ybGQgcHJvZHVj dHMhDQoNCiAgUGxlYXNlIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHBvc2l0aW9u IGF0IHRoZSBmb2xsb3dpbmcNCiAgbGluazoNCiAgPGh0dHBzOi8vam9icy5sZXZlci5jby9pc3N1 dS9mNTAyY2IyMC1iMjE2LTRjNjctODM1Ny1kNzQ4ZTFiMzUxNzg+DQoNCg0KQW5lbnRyb3BpYyBh c2tlZCBhbmQgRGFyaW8gVGVpeGVpcmEgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgICAg ICAgSSB3b3VsZCBsb3ZlIHRvIGhlYXIgbW9yZSBhYm91dCB5b3VyIE9DYW1sIGJhY2tlbmQgc3Rh Y2sNCg0KICBXZWxsLCB3ZSBsb3ZlIHRvIHRhbGsgYWJvdXQgb3VyIE9DYW1sIHN0YWNrISA6c2xp Z2h0bHlfc21pbGluZ19mYWNlOg0KDQogIFdlIHJlbHkgb24gdGhlIEphbmUgU3RyZWV0IGVjb3N5 c3RlbSBhIGxvdCwgdXNpbmcgQ29yZSBhcyBhIFN0ZGxpYg0KICByZXBsYWNlbWVudCBhbmQgQXN5 bmMgZm9yIG1vbmFkaWMgY29uY3VycmVuY3kuDQoNCiAgQU1RUCBmb3JtcyB0aGUgYmFja2JvbmUg b2Ygb3VyIG1lc3NhZ2luZyBzeXN0ZW0sIGFuZCB0aGVyZWZvcmUgd2UgdXNlDQogIFthbXFwLWNs aWVudF0gZXh0ZW5zaXZlbHkuDQoNCiAgV2UgdXNlIGJvdGggTXlTUUwgYW5kIFBvc3RncmVzcWwg ZGF0YWJhc2VzIGluIHByb2R1Y3Rpb24uIEZvciB0aGUNCiAgZm9ybWVyIHdlIHVzZSBbcHB4X215 c3FsXSwgYW5kIGZvciB0aGUgbGF0dGVyLCBbUEdPQ2FtbF0uIChUaGFua3MgdG8NCiAgRG9ja2Vy LCB3ZSBjYW4gZ2l2ZSBQR09DYW1sIGNvbXBpbGUtdGltZSBhY2Nlc3MgdG8gdGhlIERCIHdpdGhv dXQNCiAgaGF2aW5nIHRvIGRlcGVuZCBvbiB0aGUgYWN0dWFsIHByb2R1Y3Rpb24gREIuKQ0KDQog IFdlIGN1cnJlbnRseSB1c2UgUHJvdG9idWYgZm9yIHNlcmlhbGlzYXRpb24sIGJ1dCBzcGVuZCBh IGdyZWF0IGFtb3VudA0KICBvZiB0aW1lIGNvbXBsYWluaW5nIGFib3V0IGl0LiBXZSByZWx5IG9u IFtvY2FtbC1wcm90b2MtcGx1Z2luXSB0bw0KICBnZW5lcmF0ZSB0aGUgT0NhbWwgY29kZSBmcm9t IFByb3RvYnVmIGRlZmluaXRpb25zLg0KDQogIEFueXdheSwgdGhhdCdzIGp1c3QgdGhlIGJhc2lj cyBvZiBvdXIgc3RhY2suIERvIGxldCBtZSBrbm93IGlmIHRoZXJlJ3MNCiAgc29tZXRoaW5nIGVs c2UgeW91J2QgbGlrZSB0byBrbm93IGluIG1vcmUgZGV0YWlsIQ0KDQoNClthbXFwLWNsaWVudF0g PGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRlcnNmdWdtYW5uL2FtcXAtY2xpZW50Pg0KDQpbcHB4X215 c3FsXSA8aHR0cHM6Ly9naXRodWIuY29tL2lzc3V1L3BweF9teXNxbD4NCg0KW1BHT0NhbWxdIDxo dHRwczovL2dpdGh1Yi5jb20vZGFyaW90ZWl4ZWlyYS9wZ29jYW1sPg0KDQpbb2NhbWwtcHJvdG9j LXBsdWdpbl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9pc3N1dS9vY2FtbC1wcm90b2MtcGx1Z2luPg0K DQoNCnJvZGR5IGFza2VkIGFuZCBEYXJpbyBUZWl4ZWlyYSByZXBsaWVkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICAgICAgICBE byB5b3UgdXNlIFByb3RvYnVmIGZvciBpbnRlcm9wIHdpdGggbm9uLU9DYW1sIHN5c3RlbXM/IElm DQogICAgICAgIG5vdCwgSSdtIGN1cmlvdXMgYWJvdXQgd2hldGhlciB5b3UndmUgY29uc2lkZXJl ZA0KICAgICAgICBbYmluX3Byb3RdIGFzIGFuIGFsdGVybmF0aXZlOyBpdCBzZWVtcyBsaWtlIGFu IG9idmlvdXMNCiAgICAgICAgY2hvaWNlIGlmIHlvdSdyZSB1c2luZyBDb3JlL0FzeW5jLg0KDQog IFllcywgd2UgdXNlIFByb3RvYnVmIG1haW5seSBiZWNhdXNlIHdlIGhhdmUgYSBoZXRlcm9nZW5l b3VzIHN0YWNrLA0KICB3aGVyZSBiZXNpZGVzIE9DYW1sIHdlIGFsc28gaGF2ZSBzZXJ2aWNlcyBy dW5uaW5nIFB5dGhvbiwgS290bGluLCBvcg0KICBFbGl4aXIuDQoNCg0KW2Jpbl9wcm90XQ0KPGh0 dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L2Jpbl9wcm90L2Jsb2IvbWFzdGVyL1JFQURNRS5t ZD4NCg0KDQpUaW0gTWNHaWxjaHJpc3QgYXNrZWQgYW5kIERhcmlvIFRlaXhlaXJhDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICAgICAgICBJJ20gY3VyaW91cyBhYm91dCBob3cgeW91IHN0cnVjdHVyZSB0aGUgYnVzaW5l c3MgY29kZSAoZm9yDQogICAgICAgIHdhbnQgb2YgYSBiZXR0ZXIgd29yZCksIGluIGJldHdlZW4g dGhlIHRlY2huaWNhbCBsYXllcnMgb2YNCiAgICAgICAgdGFsa2luZyB0byBBTVFQIG9yIGFuIFNR TCBzdG9yZS4gQXJlIHRoZXJlIGxhcmdlciBzY2FsZQ0KICAgICAgICBwYXR0ZXJucyBsaWtlIENR UlMgb3IgREREIHRoYXQgeW91IHVzZSB0byBvcmdhbmlzZSBjb2RlPw0KDQogIEhvdyBkbyB5b3Ug cGFja2FnZSB1cCBjb2RlIGZvciBkZXBsb3ltZW50PyBEb2NrZXIgLyBBV1Mgc29tZXRoaW5nLg0K ICBXZSdyZSBzbG93bHkgbWlncmF0aW5nIHRvIGEgbWljcm8tc2VydmljZSBhcmNoaXRlY3R1cmUg KHRoZSBwcm9zIGFuZA0KICBjb25zIG9mIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0 aGlzIHRocmVhZDsgdGhhdCdzIGEgY2FuIG9mDQogIHdvcm1zIEknZCByYXRoZXIgbm90IG9wZW7i gKYpIHdob3NlIGNhc3Qgb2YgY2hhcmFjdGVycyBpbmNsdWRlcw0KICAiZW50aXRpZXMiIChyZXNw b25zaWJsZSBmb3Igc3RvcmluZy9yZXRyaWV2aW5nIGRhdGEgZnJvbSBEQnMpLCBnZW5lcmljDQog IGJhY2tlbmQgc2VydmljZXMgdGhhdCBlbmNhcHN1bGF0ZSBidXNpbmVzcyBsb2dpYywgZnJvbnRl bmQgc2VydmljZXMsDQogIGFuZCBiYWNrZW5kLWZvci1mcm9udGVuZCBzZXJ2aWNlcy4NCg0KICBX ZSdyZSB1c2luZyBEb2NrZXIgZm9yIGRlcGxveW1lbnQgb24gQVdTIChtb3N0bHkpLCBhbmQgc2xv d2x5DQogIG1pZ3JhdGluZyBmcm9tIERvY2tlciBTd2FybSB0byBLdWJlcm5ldGVzLg0KDQoNCjI1 IHllYXJzIG9mIE9DYW1sDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90LzI1 LXllYXJzLW9mLW9jYW1sLzc4MTMvMT4NCg0KDQpYYXZpZXIgTGVyb3kgYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICAyNSB5ZWFycyBhZ28sIG9uIE1heSA5dGggMTk5NiwgcmVsZWFzZSAxLjAwIG9m IHRoZSBPYmplY3RpdmUgQ2FtbA0KICBsYW5ndWFnZSBhbmQgc3lzdGVtIHdhcyBhbm5vdW5jZWQ6 DQogIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2FyYy9jYW1sLWxpc3QvMTk5Ni0wNS9t c2cwMDAwMy5odG1sPg0KDQogIEl0IHdhcyBhbHJlYWR5IHRoZSBjb25zb2xpZGF0aW9uIG9mIG1h bnkgeWVhcnMgb2Ygd29yaywgaW50ZWdyYXRpbmcNCiAgSsOpcsO0bWUgVm91aWxsb24gYW5kIERp ZGllciBSw6lteSdzIHdvcmsgb24gb2JqZWN0cyBhbmQgY2xhc3NlcyB3aXRoaW4NCiAgQ2FtbCBT cGVjaWFsIExpZ2h0LCBpdHNlbGYgYSBjb21iaW5hdGlvbiBvZiBteSB3b3JrIG9uIG1vZHVsZXMg YW5kDQogIG5hdGl2ZS1jb2RlIGNvbXBpbGF0aW9uIHdpdGggZWFybGllciBjb2RlIHRha2VuIGZy b20gQ2FtbCBMaWdodCwNCiAgZXNwZWNpYWxseSBEYW1pZW4gRG9saWdleidzIEdDLg0KDQogIExp dHRsZSBkaWQgSSBrbm93IHRoYXQgTyhiamVjdGl2ZSkgQ2FtbCB3b3VsZCBzdGlsbCBiZSB0aGVy ZSAyNSB5ZWFycw0KICBsYXRlciENCg0KICBBIGxvdCBoYXBwZW5lZCBkdXJpbmcgdGhpcyB0aW1l LCBpbmNsdWRpbmcgc2V2ZXJhbCBtYWpvciBldm9sdXRpb25zIG9mDQogIHRoZSBsYW5ndWFnZSwg YW5kLCBtdWNoIG1vcmUgaW1wb3J0YW50bHksIHRoZSBlbWVyZ2VuY2Ugb2YgYSBjb21tdW5pdHkN CiAgb2YgdXNlcnMgYW5kIGFuIGVjb3N5c3RlbSBvZiB0b29scyBhbmQgbGlicmFyaWVzLiAgQnV0 IG1heWJlIHRoaXMgd2FzDQogIGp1c3QgdGhlIGJlZ2lubmluZyBmb3Igc29tZXRoaW5nIGV2ZW4g YmlnZ2VyPyAgV2UnbGwgc2Vl4oCmDQoNCiAgSGFwcHkgYmlydGhkYXksIE9DYW1sIQ0KDQoNCkRh dmlkIEFsbHNvcHAgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgTW9zdCBwbGVhc2luZ2x5LCB3aXRoIGEg W3Zlcnkgc21hbGwgbnVtYmVyIG9mIHBhdGNoZXNdLCB0aGUgV2luZG93cw0KICBwb3J0IHN0aWxs IHdvcmtzIGluIFZpc3VhbCBTdHVkaW8gMjAxOToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSC IEM6XEJpcnRoZGF5Pm9jYW1sLmV4ZQ0KICDilIIgCU9iamVjdGl2ZSBDYW1sIHZlcnNpb24gMS4w MA0KICDilIIgDQogIOKUgiAjcHJpbnRfZW5kbGluZSAiSGFwcHkgMjV0aCBCaXJ0aGRheSwgT0Nh bWwhIjs7DQogIOKUgiBIYXBweSAyNXRoIEJpcnRoZGF5LCBPQ2FtbCENCiAg4pSCIC0gOiB1bml0 ID0gKCkNCiAg4pSCICMjcXVpdDs7DQogIOKUgiANCiAg4pSCIEM6XEJpcnRoZGF5PnR5cGUgaG9v cmF5Lm1sDQogIOKUgiBsZXQgcmVjIGhpcF9oaXAgbiA9DQogIOKUgiAgIGlmIG4gPiAwIHRoZW4N CiAg4pSCICAgICBsZXQgKCkgPSBwcmludF9lbmRsaW5lICJoaXAgaGlwISBob29yYXkhIiBpbg0K ICDilIIgICAgIGhpcF9oaXAgKHByZWQgbikNCiAg4pSCIA0KICDilIIgbGV0ICgpID0gaGlwX2hp cCAyNQ0KICDilIIgQzpcQmlydGhkYXk+b2NhbWxvcHQgLW8gaG9vcmF5LmV4ZSBob29yYXkubWwN CiAg4pSCIA0KICDilIIgQzpcQmlydGhkYXk+aG9vcmF5DQogIOKUgiBoaXAgaGlwISBob29yYXkh DQogIOKUgiAuLi4NCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KW3Zlcnkgc21hbGwgbnVtYmVyIG9m IHBhdGNoZXNdDQo8aHR0cHM6Ly9naXRodWIuY29tL2RyYTI3L29jYW1sL2NvbW1pdHMvMjUteWVh cnMtb2Ytb2NhbWw+DQoNCg0KT24gdGhlIE9DYW1sIE1hbGluZyBMaXN0LCBSb2JlcnRvIERpIENv c21vIGFsc28gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgTG9uZyBsaXZlIE9DYW1sIQ0KDQogIFRoYW5rcyBYYXZpZXIsIGFu ZCB0byBhbGwgdGhlIGJyaWxsaWFudCBtaW5kcyB0aGF0IGNvbnRyaWJ1dGVkIHRvIHRoZQ0KICBl dm9sdXRpb24gYW5kIGFkb3B0aW9uIG9mIHRoaXMgYmVhdXRpZnVsIGxhbmd1YWdlLCBhbmQgc3lz dGVtLCBpbiB0aGlzDQogIHBhc3QgcXVhcnRlciBvZiBhIGNlbnR1cnkuDQoNCiAgSWYgSSBtYXkg YWRkIGEgcGVyc29uYWwgbm90ZSwgb25lIHRydWx5IHJlbWFya2FibGUgZmFjdCBpcyB0aGF0IHNv bWUNCiAgcmF0aGVyIGNvbXBsZXggY29kZSB3cml0dGVuIGluIDE5OTggdXNpbmcgT0NhbWwgMS4w NyBbMV0gY291bGQgYmUNCiAgY29tcGlsZWQgYW5kIHJ1biBsYXN0IHllYXIgdXNpbmcgT0NhbWwg NC54ICp3aXRob3V0IG1vZGlmaWNhdGlvbnMqOg0KICB0aGUgb25seSB2aXNpYmxlIGNoYW5nZXMg d2VyZSB0aGUgbmV3IHdhcm5pbmdzIHNwb3R0aW5nIHBvdGVudGlhbA0KICBpc3N1ZXMgaW4gdGhl IGNvZGUsIHRoYW5rcyB0byB0aGUgbWFueSBpbXByb3ZlbWVudHMgdG8gdGhlIGNvbXBpbGVyDQog IG92ZXIgdGltZS4NCg0KICBGb3IgdGhlIGN1cmlvdXMsIGFsbCB0aGUgZGV0YWlscyBhcmUgaGVy ZToNCiAgPGh0dHBzOi8vd3d3LmRpY29zbW8ub3JnL0FydGljbGVzLzIwMjAtUmVTY2llbmNlQy5w ZGY+DQoNCiAgQ2hlZXJzDQoNCiAgUm9iZXJ0bw0KDQogIFsxXSB0aGF0IHdhcyB0aGUgZmlyc3Qg dmVyc2lvbiBpbmNsdWRpbmcgc3VwcG9ydCBmb3IgbWFyc2hhbGxpbmcNCiAgY2xvc3VyZXMsIGFk ZGVkIGluIGEgZmFudGFzdGljIG9uZSB3ZWVrLXNwcmluZyBpbiBQaXNhIGV4YWN0bHkgZm9yDQog IHRoaXMgY29kZSA6LSkNCg0KDQpPQ2FtbCBjb21waWxlciBkZXZlbG9wbWVudCBuZXdzbGV0dGVy LCBpc3N1ZSAxOiBiZWZvcmUgTWF5IDIwMjENCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtY29tcGlsZXItZGV2ZWxv cG1lbnQtbmV3c2xldHRlci1pc3N1ZS0xLWJlZm9yZS1tYXktMjAyMS83ODMxLzE+DQoNCg0KZ2Fz Y2hlIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgSSdtIGhhcHB5IHRvIGludHJvZHVjZSB0aGUgZmlyc3QgaXNzdWUgb2YgdGhl ICJPQ2FtbCBjb21waWxlcg0KICBkZXZlbG9wbWVudCBuZXdzbGV0dGVyIi4gSSBhc2tlZCBmcmVx dWVudCBjb250cmlidXRvcnMgdG8gdGhlIE9DYW1sDQogIGNvbXBpbGVyIGNvZGViYXNlIHRvIHdy aXRlIGEgc21hbGwgYnVyYiBvbiB3aGF0IHRoZXkgaGF2ZSBiZWVuIGRvaW5nDQogIHJlY2VudGx5 LCBpbiB0aGUgaW50ZXJlc3Qgb2Ygc2hhcmluZyBtb3JlIGluZm9ybWF0aW9uIG9uIHdoYXQgcGVv cGxlDQogIGFyZSBpbnRlcmVzdGVkIGluLCBsb29raW5nIGF0IGFuZCB3b3JraW5nIG9uLg0KDQog IFRoaXMgaXMgYnkgbm8gbWVhbnMgZXhoYXVzdGl2ZTogbWFueSBwZW9wbGUgZGlkbid0IGVuZCB1 cCBoYXZpbmcgdGhlDQogIHRpbWUgdG8gd3JpdGUgc29tZXRoaW5nLCBhbmQgaXQncyBmaW5lLiBC dXQgaG9wZWZ1bGx5IHRoaXMgY2FuIGdpdmUgYQ0KICBzbWFsbCB3aW5kb3cgb24gZGV2ZWxvcG1l bnQgYWN0aXZpdHkgcmVsYXRlZCB0byB0aGUgT0NhbWwgY29tcGlsZXIsDQogIHN0cnVjdHVyZWQg ZGlmZmVyZW50bHkgZnJvbSB0aGUgZW5kbGVzcyBzdHJlYW0gb2YgW1B1bGwgUmVxdWVzdHNdIG9u DQogIHRoZSBjb21waWxlciBjb2RlYmFzZS4NCg0KICAoVGhpcyBpbml0aWF0aXZlIGlzIGluc3Bp cmVkIGJ5IHRoZSBleGNlbGxlbnQgTXVsdGljb3JlDQogIG5ld3NsZXR0ZXIuIFBsZWFzZSBkb24n dCBleHBlY3QgdGhhdCBpdCB3aWxsIGJlIGFzIHBvbGlzaGVkIG9yDQogIGNvbnNpc3RlbnQgOnlv LXlvOiAuKQ0KDQogIE5vdGU6DQoNCiAg4oCiIEZlZWwgZnJlZSBvZiBjb3Vyc2UgdG8gY29tbWVu dCBvciBhc2sgcXVlc3Rpb25zLCBidXQgSSBkb24ndCBrbm93IGlmDQogICAgdGhlIHBlb3BsZSB3 aG8gd3JvdGUgYSBzbWFsbCBibHVyYiB3aWxsIGJlIGxvb2tpbmcgYXQgdGhlIHRocmVhZCwgc28N CiAgICBubyBwcm9taXNlcy4NCg0KICDigKIgSWYgeW91IGhhdmUgYmVlbiB3b3JraW5nIG9uIHRo ZSBPQ2FtbCBjb21waWxlciBhbmQgd2FudCB0byBzYXkNCiAgICBzb21ldGhpbmcsIHBsZWFzZSBm ZWVsIGZyZWUgdG8gcG9zdCEgSWYgeW91IHdvdWxkIGxpa2UgbWUgdG8gZ2V0IGluDQogICAgdG91 Y2ggbmV4dCB0aW1lIEkgcHJlcGFyZSBhIG5ld3NsZXR0ZXIgaXNzdWUgKHNvbWUgcmFuZG9tIHBv aW50IGluDQogICAgdGhlIGZ1dHVyZSksIHBsZWFzZSBsZXQgbWUga25vdyBieSBlbWFpbCBhdCAo Z2FicmllbC5zY2hlcmVyIGF0DQogICAgZ21haWwpLg0KDQoNCltQdWxsIFJlcXVlc3RzXSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGxzPg0KDQpAZHJhMjcgKERhdmlkIEFsbHNv cHApDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYwNCg0KICBDb21waWxlciByZWxvY2F0aW9uIHBhdGNoZXMgbm93IGV4aXN0 LiBUaGVyZSdzIHN0aWxsIGEgZmV3IGxlZnQgdG8NCiAgd3JpdGUsIGFuZCB0aGV5IG5lZWQgc3Bs aXR0aW5nIGludG8gcmV2aWV3YWJsZSBQUnMsIGJ1dCB0aGUgY29yZQ0KICBmZWF0dXJlcyBhcmUg d29ya2luZy4gQSBjb21waWxlciBpbnN0YWxsYXRpb24gY2FuIGJlIGNvcGllZCB0byBhIG5ldw0K ICBsb2NhdGlvbiBhbmQgc3RpbGwgd29yaywgbWVhbmluZyB0aGF0IGxvY2FsIHN3aXRjaGVzIGlu IG9wYW0gbWF5IGluDQogIHRoZW9yeSBiZSByZW5hbWVkIGFuZCwgbW9yZSBpbXBvcnRhbnRseSwg d2UgY2FuIGNhY2hlIHByZXZpb3VzbHktYnVpbHQNCiAgY29tcGlsZXJzIGluIGFuIG9wYW0gcm9v dCB0byBhbGxvdyBhIG5ldyBzd2l0Y2gncyBjb21waWxlciB0byBiZSBhDQogIGNvcHkuIFRoaXMg cHJvYmFibHkgd29uJ3QgYmUgcmV2aWV3ZWQgaW4gdGltZSBmb3IgNC4xMywgYWx0aG91Z2ggaXQn cw0KICBpbnRlbmRlZCB0aGF0IG9uY2UgbWVyZ2VkIG9wYW0tcmVwb3NpdG9yeSB3aWxsIGNhcnJ5 IGJhY2stcG9ydHMgdG8NCiAgZWFybGllciBjb21waWxlcnMuDQoNCiAgQSB3aG9sZSBzbGV3IG9m IHNjcmlwdGluZyBwYWluIGhhcyBsZWFkIHRvIHNvbWUgcG9zc2libGUgcGF0Y2hlcyB0bw0KICBy ZWR1Y2UgdGhlIHVzZSBvZiBzY3JpcHRzIGluIHRoZSBjb21waWxlciBidWlsZCB0byBzb21ld2hh dCBjbG9zZXIgdG8NCiAgbm9uZS4NCg0KICBGbGV4RExMIGJvb3RzdHJhcCBoYXMgYmVlbiBjb21w bGV0ZWx5IG92ZXJoYXVsZWQsIHJlZHVjaW5nIGJ1aWxkIHRpbWUNCiAgY29uc2lkZXJhYmx5LiBU aGlzIHdpbGwgYmUgaW4gNC4xMyAoI1sxMDEzNV0pDQoNCg0KWzEwMTM1XSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTAxMzU+DQoNCg0KQG5vamIgKE5pY29sw6FzIE9qZWRh IELDpHIpDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJIGFtIHdvcmtpbmcgb24gI1sxMDE1OV0s IHdoaWNoIGVuYWJsZXMgZGVidWcgaW5mb3JtYXRpb24gaW4NCiAgYC1vdXRwdXQtY29tcGxldGUt ZXhlJyBiaW5hcmllcy4gSXQgdXNlcyBbaW5jYmluXSB1bmRlciBVbml4LWxpa2UNCiAgc3lzdGVt IGFuZCBzb21lIG90aGVyIG1ldGhvZCB1bmRlciBXaW5kb3dzLg0KDQoNClsxMDE1OV0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEwMTU5Pg0KDQpbaW5jYmluXSA8aHR0cHM6 Ly9naXRodWIuY29tL2dyYXBoaXRlbWFzdGVyL2luY2Jpbj4NCg0KDQpAZ2FzY2hlIChHYWJyaWVs IFNjaGVyZXIpDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJIHdvcmtlZCBvbiBicmluZ2luZyBt b3JlIFBScyB0byBhIGRlY2lzaW9uIChtZXJnZSBvciBjbG9zZSkuIFRoZQ0KICBudW1iZXIgb2Yg b3BlbiBQUnMgaGFzIGdvbmUgZnJvbSAyMjAtaXNoIHRvIDE4MCwgd2hpY2ggZmVlbHMgbmljZS4N Cg0KICBJIGhhdmUgYWxzbyBjb250cmlidXRlZCB0byBARWtkb2hpYnMnIHByb2plY3QgW2NhbWxi b290XSwgd2hpY2ggaXMgYQ0KICAiYm9vdHN0cmFwLWZyZWUiIGltcGxlbWVudGF0aW9uIG9mIE9D YW1sIGFibGUgdG8gY29tcGlsZSB0aGUgT0NhbWwNCiAgY29tcGlsZXIgaXRzZWxmLiBJdCBjdXJy ZW50bHkgdGFyZ2V0cyBPQ2FtbCA0LjA3IGZvciB2YXJpb3VzDQogIHJlYXNvbnMuIFdlIHdlcmUg YWJsZSB0byBkbyBhIGZ1bGwgYnVpbGQgb2YgdGhlIE9DYW1sIGNvbXBpbGVyLCBhbmQNCiAgY2hl Y2sgdGhhdCB0aGUgcmVzdWx0IHByb2R1Y2VzIGJvb3RzdHJhcCBiaW5hcmllcyB0aGF0IGNvaW5j aWRlIHdpdGgNCiAgdXBzdHJlYW0gYm9vdHN0cmFwcy4gVGhpcyBnaXZlcyBleHRyZW1lbHkgc3Ry b25nIGNvbmZpZGVuY2UgdGhhdCB0aGUNCiAgT0NhbWwgYm9vdHN0cmFwIGlzIGZyZWUgZnJvbSAi dHJ1c3RpbmcgdHJ1c3QiIGF0dGFja3MuIEZvciBtb3JlDQogIGRldGFpbHMsIHNlZSBvdXIgW2Ry YWZ0IHBhcGVyXS4NCg0KDQpbY2FtbGJvb3RdIDxodHRwczovL2dpdGh1Yi5jb20vRWtkb2hpYnMv Y2FtbGJvb3Q+DQoNCltkcmFmdCBwYXBlcl0gPGh0dHA6Ly9nYWxsaXVtLmlucmlhLmZyL35zY2hl cmVyL2RyYWZ0cy9jYW1sYm9vdC5wZGY+DQoNCndpdGggQE9jdGFjaHJvbiAoRmxvcmlhbiBBbmdl bGV0dGkpDQrilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITi lITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilIQN Cg0KICBJIHdvcmtlZCB3aXRoIEZsb3JpYW4gQW5nZWxldHRpIG9uIGRlcHJlY2F0aW5nIGNlcnRh aW4gY29tbWFuZC1saW5lDQogIHdhcm5pbmctc3BlY2lmaWVyIHNlcXVlbmNlcywgdG8gYXZvaWQg dXNhYmlsaXR5IGlzc3VlcyB3aXRoIChuZXcgaW4NCiAgNC4xMikgd2FybmluZyBuYW1lcy4gQmVm b3JlIGAtdyAtcGFydGlhbC1tYXRjaCcgZGlzYWJsZXMgd2FybmluZyA0LA0KICBidXQgYC13IC1w YXJ0aWFsJyBpcyBpbnRlcnByZXRlZCBhcyB0aGUgc2VxdWVuY2UgYHcgLXAgLXcgYSAtdyByIC13 IHQNCiAgLXcgaSAtdyBhIC13IGwnLCBtb3N0IG9mIHdoaWNoIGFyZSBpZ25vcmVkIGJ1dCBgLXcg YScgc2lsZW5jZXMgYWxsDQogIHdhcm5pbmdzLiBOb3cgbXVsdGktbGV0dGVyIHNlcXVlbmNlcyBv ZiAidW5zaWduZWQiIHNwZWNpZmllcnMgKGAtcCcgaXMNCiAgc2lnbmVkLCBgYScgaXMgdW5zaWdu ZWQpIGFyZSBkZXByZWNhdGVkLiAoV2UgZmlyc3QgZGVwcmVjYXRlZCBhbGwNCiAgdW5zaWduZWQg c3BlY2lmaWVycywgYnV0IExlbyBXaGl0ZSB0ZXN0ZWQgdGhlIHJlc3VsdCBhbmQgcmVtYXJrZWQg dGhhdA0KICBgLXcgQScgaXMgY29tbW9uLCBzbyBub3cgd2Ugb25seSB3YXJuIG9uIG11bHRpLWxl dHRlciBzZXF1ZW5jZXMgb2YNCiAgdW5zaWduZWQgc3BlY2lmaWVycy4NCg0KICBJIGFtIHdvcmtp bmcgd2l0aCBAT2N0YWNocm9uIChGbG9yaWFuIEFuZ2VsZXR0aSkgb24gZ3JvdXBpbmcgc2lnbmF0 dXJlDQogIGl0ZW1zIHdoZW4gdHJhdmVyc2luZyBtb2R1bGUgc2lnbmF0dXJlcy4gU29tZSBpdGVt cyBhcmUgImdob3N0IGl0ZW1zIg0KICB0aGF0IGFyZSBtb3JhbGx5IGF0dGFjaGVkIGluIGEgIm1h aW4gaXRlbSI7IHRoZSBjb2RlIG1vc3RseSBpZ25vcmVzDQogIHRoaXMgYW5kIHRoaXMgY3JlYXRl cyB2YXJpb3VzIGJ1Z3MgaW4gY29ybmVyIGNhc2VzLiBUaGlzIGlzIHdvcmsgdGhhdA0KICBGbG9y aWFuIHN0YXJ0ZWQgaW4gU2VwdGVtYmVyIDIwMTkgd2l0aCAjWzg5MjldLCB0byBmaXggYSBidWcg aW4gdGhlDQogIHJlcHJpbnRpbmcgb2Ygc2lnbmF0dXJlcy4gSSBvbmx5IHN0YXJ0ZWQgcmV2aWV3 aW5nIGluIE1heS1TZXB0ZW1iZXINCiAgMjAyMCBhbmQgd2UgZGVjaWRlZCB0byBkbyBzaXplYWJs ZSBjaGFuZ2VzLCBoZSBzcGxpdCBpdCBpbiBzZXZlcmFsDQogIHNtYWxsZXIgY2hhbmdlcyBpbiBK YW51YXJ5IDIwMjEgYW5kIHdlIG1lcmdlZCBpdCBpbiBBcHJpbCAyMDIxLiBOb3cgd2UNCiAgYXJl IGxvb2tpbmcgYXJlIGZpeGluZyBvdGhlciBidWdzIHdpdGggaGlzIGNvZGUgKCNbOTc3NF0sDQog ICNbMTAzODVdKS4gSnVzdCB0aGlzIHdlZWsgRmxvcmlhbiBsYW5kZWQgYSBuaWNlIFBSIGZpeGlu ZyBzZXZlcmFsDQogIGRpc3RpbmN0IGlzc3VlcyByZWxhdGVkIHRvIHNpZ25hdHVyZSBpdGVtIGdy b3VwaW5nOiAjWzEwNDAxXS4NCg0KDQpbODkyOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC9wdWxsLzg5Mjk+DQoNCls5Nzc0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s L3B1bGwvOTc3ND4NCg0KWzEwMzg1XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1 bGwvMTAzODU+DQoNClsxMDQwMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxs LzEwNDAxPg0KDQoNCkB4YXZpZXJsZXJveSAoWGF2aWVyIExlcm95KQ0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWMDQoNCiAgSSBmaXhlZCAjWzEwMzM5XSwgYSBteXN0ZXJpb3VzIGNyYXNoIG9uIHRo ZSBuZXcgTWFjcyB3aXRoICJBcHBsZQ0KICBzaWxpY29uIi4gIFRoaXMgd2FzIGR1ZSB0byBhIEFS TSAoMzIgYW5kIDY0IGJpdHMpLXNwZWNpZmljDQogIG9wdGltaXphdGlvbiBvZiBhcnJheSBib3Vu ZCBjaGVja2luZywgd2hpY2ggd2FzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQNCiAgYnkgdGhlIHBs YXRmb3JtLWluZGVwZW5kZW50IHBhcnRzIG9mIHRoZSBiYWNrLWVuZCwgbGVhZGluZyB0bw0KICBp bmNvcnJlY3QgbGl2ZW5lc3MgYW5hbHlzaXMgYW5kIHdyb25nIHJlZ2lzdGVyIGFsbG9jYXRpb24u ICAjWzEwMzU0XQ0KICBmaXhlcyB0aGlzIGJ5IGluZm9ybWluZyB0aGUgcGxhdGZvcm0taW5kZXBl bmRlbnQgcGFydHMgb2YgdGhlIGJhY2stZW5kDQogIHRoYXQgc29tZSBwbGF0Zm9ybS1zcGVjaWZp YyBpbnN0cnVjdGlvbnMgY2FuIHJhaXNlLiAgSW4gcGFzc2luZywgaXQNCiAgcmVmYWN0b3JzIHNp bWlsYXIgY29kZSB0aGF0IHdhcyBkdXBsaWNhdGluZyBwbGF0Zm9ybS1pbmRlcGVuZGVudA0KICBj YWxjdWxhdGlvbnMgKG9mIHdoaWNoIGluc3RydWN0aW9ucyBhcmUgcHVyZSkgaW4gcGxhdGZvcm0t ZGVwZW5kZW50DQogIGZpbGVzLg0KDQogIEkgc3BlbnQgcXVhbGl0eSB0aW1lIHdpdGggdGhlIEpl bmtpbnMgY29udGludW91cyBpbnRlZ3JhdGlvbiBzeXN0ZW0gYXQNCiAgSW5yaWEsIGludGVncmF0 aW5nIGEgbmV3IE1hYyBNaW5pIE0xLiAgRm9yIHVua25vd24gcmVhc29ucywgSmVua2lucw0KICBy YW4gdGhlIENJIHNjcmlwdCBpbiB4ODYtNjQgZW11bGF0aW9uIG1vZGUsIHNvIHdlIHdlcmUgYnVp bGRpbmcgYW5kDQogIHRlc3RpbmcgYW4geDg2LTY0IHZlcnNpb24gb2YgT0NhbWwgaW5zdGVhZCBv ZiB0aGUgaW50ZW5kZWQgQVJNNjQNCiAgdmVyc2lvbi4gIEEgYml0IG9mIHNjcmlwdGluZyBsYXRl ciAoOGIxYmMwMWMzKSBhbmQgdm9pbMOgLCBhcm02NC1tYWNvcw0KICBpcyBwcm9wZXJseSB0ZXN0 ZWQgYXMgcGFydCBvZiBvdXIgQ0kuDQoNCiAgQ3VycmVudGx5LCBJJ20gcmVhZGluZyB0aGUgInNh ZmUgcG9pbnRzIiBwcm9wb3NhbCBieSBTYWRpcSBKYWZmZXINCiAgKCNbMTAwMzldKSBhbmQgdGhl IGNoYW5nZXMgb24gdG9wIG9mIHRoaXMgcHJvcG9zZWQgYnkgRGFtaWVuIERvbGlnZXouDQogIEl0 J3MgYSBuZWNlc3Nhcnkgc3RlcCB0b3dhcmRzIE11bHRpY29yZSBPQ2FtbCwgc28gd2UgcmVhbGx5 IG5lZWQgdG8NCiAgbW92ZSBmb3J3YXJkIG9uIHRoaXMgb25lLiAgSXQncyBhIG5vbnRyaXZpYWwg Y2hhbmdlIGludm9sdmluZyBhIG5ldw0KICBzdGF0aWMgYW5hbHlzaXMgYW5kIGEgbnVtYmVyIG9m IHR3ZWFrcyBpbiBldmVyeSBjb2RlIGVtaXR0ZXIsIGJ1dA0KICB0aGluZ3MgYXJlIHN0YXJ0aW5n IHRvIGxvb2sgZ29vZCBoZXJlLg0KDQoNClsxMDMzOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC9wdWxsLzEwMzM5Pg0KDQpbMTAzNTRdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwvcHVsbC8xMDM1ND4NCg0KWzEwMDM5XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sL3B1bGwvMTAwMzk+DQoNCg0KQG1zaGlud2VsbCAoTWFyayBTaGlud2VsbCkNCuKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjA0KDQogIEkgZGlkIGEgZmlyc3QgcGFzcyBvZiByZXZpZXcgb24gdGhlIHNh ZmUgcG9pbnRzIFBSICgjWzEwMDM5XSkgYW5kDQogIHNpZ25pZmljYW50bHkgc2ltcGxpZmllZCB0 aGUgcHJvcG9zZWQgYmFja2VuZCBjaGFuZ2VzLiAgSSd2ZSBhbHNvIGJlZW4NCiAgaW52b2x2ZWQg aW4gZGlzY3Vzc2lvbnMgYWJvdXQgYSBuZXcgZnVuY3Rpb24tbGV2ZWwgYXR0cmlidXRlIHRvIGNh dXNlDQogIGFuIGVycm9yIGlmIHNhZmUgcG9pbnRzIChpbmNsdWRpbmcgYWxsb2NhdGlvbnMpIG1p Z2h0IGV4aXN0IHdpdGhpbiBhDQogIGZ1bmN0aW9uJ3MgYm9keSwgdG8gbWFrZSBjb2RlIHRoYXQg Y3VycmVudGx5IGFzc3VtZXMgdGhpcyByb2J1c3QuDQogIFRoZXJlIHdpbGwgYmUgYSBkZXNpZ24g ZG9jdW1lbnQgZm9yIHRoaXMgY29taW5nIGluIGR1ZSBjb3Vyc2UuDQoNCiAgSSBmaXhlZCB0aGUg cmFuZG9tIHNlZ2ZhdWx0cyB0aGF0IHdlcmUgb2NjdXJyaW5nIG9uIHRoZSBSSVNDLVYgSW5yaWEN CiAgQ0kgd29ya2VyICgjWzEwMzQ5XSkuDQoNCiAgSW4gRmxhbWJkYSAyIGxhbmQgd2Ugc3BlbnQg dHdvIHBlcnNvbi1kYXlzIGRlYnVnZ2luZyBhIHByb2JsZW0NCiAgcmVsYXRpbmcgdG8gSW5maXhf dGFnISAgV2UgZGlzY292ZXJlZCB0aGF0IHRoZSBjb2RlIGluIE9DYW1sIDQuMTINCiAgb253YXJk cyBmb3IgdHJhdmVyc2luZyBHQyByb290cyBpbiBzdGF0aWMgZGF0YSAoImNhbWxfZ2xvYmFscyIp IGlzIG5vdA0KICBjb3JyZWN0IGlmIGFueSBvZiB0aGUgcm9vdHMgYXJlIGNsb3N1cmVzLiAgVGhp cyBhcmlzZXMgaW4gcGFydCBiZWNhdXNlDQogIHRoZSBuZXcgY29tcGFjdGlvbiBjb2RlICgjWzk3 MjhdKSBoYXMgYSBoaWRkZW4gaW52YXJpYW50OiBpdCBtdXN0IG5vdA0KICBzZWUgYW55IGZpZWxk IG9mIGEgc3RhdGljIGRhdGEgcm9vdCBtb3JlIHRoYW4gb25jZSAobm90IGV2ZW4gdmlhIGFuDQog IEluZml4X3RhZykuICBBcyBmYXIgYXMgd2Uga25vdywgdGhlc2Ugc2l0dWF0aW9ucyBkbyBub3Qg YXJpc2UgaW4gdGhlDQogIGV4aXN0aW5nIGNvbXBpbGVyLCBhbHRob3VnaCB3ZSBtYXkgcHJvcG9z ZSBhIHBhdGNoIHRvIGd1YXJkIGFnYWluc3QNCiAgdGhlbS4gIFRoZXkgYXJpc2Ugd2l0aCBGbGFt YmRhIDIgYmVjYXVzZSBpbiBvcmRlciB0byBjb21waWxlDQogIHN0YXRpY2FsbHktYWxsb2NhdGVk IGluY29uc3RhbnQgY2xvc3VyZXMgKG9uZXMgd2hvc2UgZW52aXJvbm1lbnQgaXMNCiAgcGFydGlh bGx5IG9yIHdob2xseSBjb21wdXRlZCBhdCBydW50aW1lKSB3ZSByZWdpc3RlciBjbG9zdXJlcyBk aXJlY3RseQ0KICBhcyBnbG9iYWwgcm9vdHMsIHNvIHdlIGNhbiBwYXRjaCB0aGVpciBlbnZpcm9u bWVudHMgbGF0ZXIuDQoNCg0KWzEwMDM5XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s L3B1bGwvMTAwMzk+DQoNClsxMDM0OV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9w dWxsLzEwMzQ5Pg0KDQpbOTcyOF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxs Lzk3Mjg+DQoNCg0KQGdhcnJpZ3VlIChKYWNxdWVzIEdhcnJpZ3VlKQ0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWMDQoNCiAgSSBoYXZlIGJlZW4gd29ya2luZyBvbiBhIG51bWJlciBvZiBQUnMg Zml4aW5nIGJ1Z3MgaW4gdGhlIHR5cGUgc3lzdGVtLA0KICB3aGljaCBhcmUgbm93IG1lcmdlZDoN CiAg4oCiICNbMTAyNzddIGZpeGVzIGEgdGhlb3JldGljYWwgYnVnIGluIHRoZSBwcmluY2lwYWxp dHkgb2YgR0FEVCB0eXBlDQogICAgIGluZmVyZW5jZSAoI1sxMDM4M10gYXBwbGllcyBvbmx5IGlu IC1wcmluY2lwYWwgbW9kZSkNCiAg4oCiICNbMTAzMDhdIGZpeGVzIGFuIGludGVyYWN0aW9uIGJl dHdlZW4gbG9jYWwgb3BlbiBpbiBwYXR0ZXJucyBhbmQgdGhlDQogICAgIG5ldyBzeW50YXggZm9y IGludHJvZHVjaW5nIGV4aXN0ZW50aWFsIHR5cGUgdmFyaWFibGVzDQogIOKAoiAjWzEwMzIyXSBp cyBhbiBpbnRlcm5hbCBjaGFuZ2UgdXNpbmcgYSBub3JtYWwgcmVmZXJlbmNlIGluc2lkZSBvZiBh DQogICAgIHdlYWsgb25lIGZvciBiYWNrdHJhY2tpbmc7IHRoZSB3ZWFrIHJlZmVyZW5jZSB3YXMg YW4gb3B0aW1pemF0aW9uDQogICAgIHdoZW4gYmFja3RyYWNraW5nIHdhcyBhIHNlbGRvbSB1c2Vk IGZlYXR1cmUsIGFuZCB3YXMgbm90IHVzZWZ1bA0KICAgICBhbnltb3JlDQogIOKAoiAjWzEwMzQ0 XSBmaXhlcyBhIGJ1ZyBpbiB0aGUgZGVsYXlpbmcgb2YgdGhlIGV2YWx1YXRpb24gb2Ygb3B0aW9u YWwNCiAgICAgYXJndW1lbnRzDQogIOKAoiAjWzEwMzQ3XSBjbGVhbnMgdXAgc29tZSBjb2RlIGlu IHRoZSB1bmlmaWNhdGlvbiBhbGdvcml0aG0sIGFmdGVyIGENCiAgICAgc3RyZW5ndGhlbmluZyBv ZiB1bml2ZXJzYWwgdmFyaWFibGUgc2NvcGluZw0KICDigKIgI1sxMDM2Ml0gZml4ZXMgYSBmb3Jn b3R0ZW4gbm9ybWFsaXphdGlvbiBpbiB0aGUgdHlwZSBjaGVja2luZw0KICAgICBhbGdvcml0aG0N Cg0KICBTb21lIGFyZSBzdGlsbCBpbiBwcm9ncmVzczoNCiAg4oCiICNbMTAzNDhdIGltcHJvdmVz IHRoZSB3YXkgZXhwYW5zaW9uIGlzIGRvbmUgZHVyaW5nIHVuaWZpY2F0aW9uLCB0bw0KICAgICBh dm9pZCBzb21lIHNwdXJpb3VzIEdBRFQgcmVsYXRlZCBhbWJpZ3VpdHkgZXJyb3JzDQogIOKAoiAj WzEwMzY0XSBjaGFuZ2VzIHRoZSB0eXBpbmcgb2YgdGhlIGJvZHkgb2YgdGhlIGNhc2VzIG9mDQog ICAgIHBhdHRlcm4tbWF0Y2hpbmdzLCBhbGxvd2luZyB0byB3YXJuIGluIHNvbWUgbm9uLXByaW5j aXBhbA0KICAgICBzaXR1YXRpb25zOyBpdCBhbHNvIHVuY292ZXJlZCBhIG51bWJlciBvZiBwcmlu Y2lwYWxpdHkgcmVsYXRlZCBidWdzDQogICAgIGluc2lkZSB0aGUgdGhlIHR5cGUtY2hlY2tlcg0K DQogIEZpbmFsbHksIEkgaGF2ZSB3b3JrZWQgd2l0aCBUYWthZnVtaSBTYWlrYXdhIChAdDZzKSBv biBtYWtpbmcgdGhlDQogIHJlcHJlc2VudGF0aW9uIG9mIHR5cGVzIGNsb3NlciB0byBpdHMgbG9n aWNhbCBtZWFuaW5nLCBieSBlbnN1cmluZw0KICB0aGF0IG9uZSBhbHdheXMgbWFuaXB1bGF0ZSBh IG5vcm1hbGl6ZWQgdmlldyBpbiAjWzEwMzM3XSAobGFyZ2UNCiAgY2hhbmdlLCBldmFsdWF0aW9u IGluIHByb2dyZXNzKS4NCg0KDQpbMTAyNzddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvcHVsbC8xMDI3Nz4NCg0KWzEwMzgzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s L3B1bGwvMTAzODM+DQoNClsxMDMwOF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9w dWxsLzEwMzA4Pg0KDQpbMTAzMjJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVs bC8xMDMyMj4NCg0KWzEwMzQ0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwv MTAzNDQ+DQoNClsxMDM0N10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEw MzQ3Pg0KDQpbMTAzNjJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8xMDM2 Mj4NCg0KWzEwMzQ4XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTAzNDg+ DQoNClsxMDM2NF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEwMzY0Pg0K DQpbMTAzMzddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8xMDMzNz4NCg0K DQpAbGV0LWRlZiAoRnLDqWTDqXJpYyBCb3VyKQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgRm9yIHNv bWUgdGltZSwgSSBoYXZlIGJlZW4gd29ya2luZyBvbiBuZXcgYXBwcm9hY2hlcyB0byBnZW5lcmF0 ZSBlcnJvcg0KICBtZXNzYWdlcyBmcm9tIGEgTWVuaGlyIHBhcnNlci4NCg0KICBNeSBnb2FsIGF0 IHRoZSBiZWdpbm5pbmcgd2FzIHRvIGRldGVjdCBhbmQgcHJvZHVjZSBhIHByZWNpc2UgbWVzc2Fn ZQ0KICBmb3IgdGhlIOKAmGxldCA74oCZIHNpdHVhdGlvbjoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiBsZXQgeCA9IDU7DQogIOKUgiBsZXQgeSA9IDYNCiAg4pSCIGxldCB6ID0gNw0KICDilJTi lIDilIDilIDilIANCiAgTFIgZGV0ZWN0cyBhbiBlcnJvciBhdCB0aGUgdGhpcmQg4oCYbGV04oCZ IHdoaWNoIGlzIHRlY2huaWNhbGx5IGNvcnJlY3QsDQogIGFsdGhvdWdoIHdlIHdvdWxkIGxpa2Ug dG8gcG9pbnQgdGhlIHVzZXIgYXQgdGhlIOKAmDvigJkgd2hpY2ggbWlnaHQgYmUgdGhlDQogIHJv b3QgY2F1c2Ugb2YgdGhlIGVycm9yLiBUaGlzIGdvYWwgaGFzIGJlZW4gYWNoaWV2ZWQsIGJ1dCB0 aGUNCiAgcHJvdG90eXBlIGlzIGZhciBmcm9tIGJlaW5nIHJlYWR5IGZvciBwcm9kdWN0aW9uLg0K DQogIFRoZSBtYWluIGlkZWEgdG8gaW5jcmVhc2UgdGhlIGV4cHJlc3NpdmVuZXNzIGFuZCBtYWlu dGFpbmFiaWxpdHkgb2YNCiAgZXJyb3IgY29udGV4dCBpZGVudGlmaWNhdGlvbiBpcyB0byB1c2Ug YSBmbGF2b3Igb2YgcmVndWxhcg0KICBleHByZXNzaW9ucy4gIFRoZSBzdGFjayBvZiBhIHBhcnNl ciBkZWZpbmVzIGEgcHJlZml4IG9mIGEgc2VudGVudGlhbA0KICBmb3JtLiBPdXIgcmVndWxhciBl eHByZXNzaW9ucyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IGl0LiBJbnRlcm5hbCBkZXRhaWxzDQogIG9m IHRoZSBhdXRvbWF0b24gZG9lcyBub3QgbGVhayAobm8gcmVmZXJlbmNlIHRvIHN0YXRlcyksIHRo ZSByZWd1bGFyDQogIGxhbmd1YWdlIGlzIGRlZmluZWQgYnkgdGhlIGdyYW1tYXIgYWxvbmUuICBX aXRoIGFwcHJvcHJpYXRlIHRvb2xpbmcsDQogIHNwZWNpZmljIHNpdHVhdGlvbnMgY2FuIGJlIGNh cHR1cmVkIGJ5IHN0YXJ0aW5nIGZyb20gYSBjb2Fyc2UNCiAgZXhwcmVzc2lvbiBhbmQgcmVmaW5p bmcgaXQgdG8gbmFycm93IGRvd24gdGhlIGludGVyZXN0aW5nIGNhc2VzLg0KDQogIE5vdyBJIGFt IGZvY3VzaW5nIG9uIG9uZSBzcGVjaWZpYyBwb2ludCBvZiB0aGUg4oCYZXJyb3IgbWVzc2FnZeKA mQ0KICBkZXZlbG9wbWVudCBwaXBlbGluZTogaW1wcm92aW5nIHRoZSBlZmZpY2llbmN5IG9mIOKA mG1lbmhpcg0KICDigJNsaXN0LWVycm9yc+KAmS4gIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGVu dW1lcmF0ZSBzZW50ZW5jZXMgdGhhdCBjb3Zlcg0KICBhbGwgZXJyb25lb3VzIHNpdHVhdGlvbnMg KGFzIGRlZmluZWQgYnkgdGhlIExSIGdyYW1tYXIpLiBPbiBteQ0KICBjb21wdXRlciBhbmQgd2l0 aCB0aGUgT0NhbWwgZ3JhbW1hciwgaXQgdGFrZXMgYSBmZXcgbWludXRlcyBhbmQgcXVpdGUNCiAg YSBsb3Qgb2YgUkFNLiBFYXJseSByZXN1bHRzIGFyZSBlbmNvdXJhZ2luZyBhbmQgSSBob3BlIHRv IGhhdmUgYSBQUg0KICBmb3IgTWVuaGlyIHNvb24uIFRoZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVu dCB3ZSBhcmUgYWltaW5nIGZvciBpcyB0bw0KICBtYWtlIHRoZSBjb21tYW5kIGFsbW9zdCByZWFs IHRpbWUgZm9yIGNvbW1vbiBncmFtbWFycyBhbmQgdG8gdGFja2xlDQogIGJpZ2dlciBncmFtbWFy cyBieSByZWR1Y2luZyB0aGUgbWVtb3J5IG5lZWRzLiAgRm9yIGluc3RhbmNlLCBpbiB0aGUNCiAg T0NhbWwgY2FzZSwgdGhlIHJ1bnRpbWUgaXMgZG93biBmcm9tIDMgbWludXRlcyB0byAy4oCTMyBz ZWNvbmRzIGFuZA0KICBtZW1vcnkgY29uc3VtcHRpb24gZ29lcyBmcm9tIGEgZmV3IEdpQiBkb3du IHRvIDIwMCBNaUIuDQoNCg0KRGFuaWVsIELDvG56bGkgYXNrZWQgYW5kIGdhc2NoZSByZXBsaWVk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICAgICAgICA+IFvigKZdIEBFa2RvaGlic+KAmSBwcm9qZWN0IFtjYW1sYm9vdCBdLCB3 aGljaCBpcyBhDQogICAgICAgICAg4oCcYm9vdHN0cmFwLWZyZWXigJ0NCiAgICAgICAgPiBpbXBs ZW1lbnRhdGlvbiBvZiBPQ2FtbCBhYmxlIHRvIGNvbXBpbGUgdGhlIE9DYW1sDQogICAgICAgICAg Y29tcGlsZXIgaXRzZWxmLiBJdCBjdXJyZW50bHkgdGFyZ2V0cyBPQ2FtbCA0LjA3IGZvcg0KICAg ICAgICAgIHZhcmlvdXMNCiAgICAgICAgPiByZWFzb25zLiBXZSB3ZXJlIGFibGUgdG8gZG8gYSBm dWxsIGJ1aWxkIG9mIHRoZSBPQ2FtbA0KICAgICAgICAgIGNvbXBpbGVyLCBhbmQgY2hlY2sgdGhh dCB0aGUgcmVzdWx0IHByb2R1Y2VzIGJvb3RzdHJhcA0KICAgICAgICA+IGJpbmFyaWVzIHRoYXQg Y29pbmNpZGUgd2l0aCB1cHN0cmVhbSBib290c3RyYXBzLiBUaGlzDQogICAgICAgICAgZ2l2ZXMg ZXh0cmVtZWx5IHN0cm9uZyBjb25maWRlbmNlIHRoYXQgdGhlIE9DYW1sDQogICAgICAgICAgYm9v dHN0cmFwIGlzDQogICAgICAgID4gZnJlZSBmcm9tIOKAnHRydXN0aW5nIHRydXN04oCdIGF0dGFj a3MuIEZvciBtb3JlIGRldGFpbHMsDQogICAgICAgICAgc2VlIG91ciBbZHJhZnQgcGFwZXJdLg0K DQogICAgICAgIFNvbWV0aGluZyB0aGF0IGlzIG5vdCBjbGVhciB0byBtZSAoYnV0IEkgcmVhZCBx dWlja2x5KSBpcw0KICAgICAgICB0aGUgaW1wYWN0IG9mIGBndWlsZWAgaXRzZWxmIGJlaW5nIG5v dCBib290c3RyYXBwZWQgeWV0Lg0KICAgICAgICBDb3VsZCB0aGVyZSBiZSBhICp2ZXJ5KiBlbGFi b3JhdGUgYXR0YWNrICh3aXRoIHByb2JhYmlsaXR5DQogICAgICAgIDAgb2YgZXhpc3RpbmcpIG9u IGJvdGggdGhlIGd1aWxlIGFuZCBvY2FtbCBib290c3RyYXAgb3IgaXMNCiAgICAgICAgdGhlcmUg c29tZXRoaW5nIGluIHRoZSB3aG9sZSBzY2hlbWUgdGhhdCBwcmV2ZW50cyBpdCA/DQoNCiAgWWVz LCBjdXJyZW50bHkgR3VpbGUgbmVlZHMgdG8gYmUgdHJ1c3RlZCwgYW5kIGl0IHdvdWxkIGJlIHBv c3NpYmxlDQogIHRoYXQgYSBib290c3RyYXBwaW5nIHZpcnVzIGluIEd1aWxlIHdvdWxkIGJyZWFr IG91ciBjb3JyZWN0bmVzcw0KICByZXN1bHQuIChJdCB3b3VsZCBuZWVkIHRvIHJlcHJvZHVjZSBp dHNlbGYgdGhyb3VnaCBvdXIgY29tcGlsZXIgYW5kDQogIGludGVycHJldGVyIHRoYXQgd2VyZSB3 cml0dGVuIGFmdGVyIEd1aWxlIGl0c2VsZiwgYnV0IEkgdGhpbmsgaW4NCiAgdGhlb3J5IHRoaXMg Y291bGQgYmUgZG9uZSB3aXRoIGFuIGFsbW9zdC1pbmZpbml0ZWx5IGNsZXZlciBwcm9ncmFtDQog IGFuYWx5c2lzLikgT2YgY291cnNlLCBhbiBhdHRhY2sgYXQgdGhlIHNvdXJjZSBsZXZlbCAoaW5z ZXJ0aW5nDQogIG1hbGljaW91cyBzb3VyY2UsIGluc3RlYWQgb2YgbWFsaWNpb3VzIGJpbmFyaWVz KSBpcyBhbHNvIHBvc3NpYmxlDQogIGFueXdoZXJlIGluIHRoZSBjaGFpbi4gIE91ciBtYWluIHJl YXNvbiBmb3IgdXNpbmcgR3VpbGUgaXMgdGhhdCB0aGlzDQogIGlzIHRoZSBoaWdoLWxldmVsIGxh bmd1YWdlIGNvbW11bml0eSBtb3N0IGFjdGl2ZSBvbg0KICBkZWJvb3RzdHJhcHBpbmctdG93YXJk cy10aGUtbWV0YWwgKHRocm91Z2ggdGhlIEd1aXggY29ubmVjdGlvbiksIHNvIHdlDQogIGJlbGll dmUgaXQgaXMgbW9yZSBsaWtlbHkgdG8gbWFuYWdlIGRlYm9vdHN0cmFwcGluZyBhbmQgbWFpbnRh aW4gaXQgaW4NCiAgdGhlIGxvbmdlciBydW4uDQoNCiAgKFRoZSBzZWVkIHRoYXQgR3VpbGUgZGVw ZW5kcyBvbiBpcyBpdHMgbWFjcm8tZXhwYW5kZXIsIHdoaWNoIGlzDQogIHdyaXR0ZW4gdXNpbmcg bWFjcm9zIGl0c2VsZi4gSW4gdGhlb3J5IG9uZSBtYXkgcGVyZm9ybSB0aGUNCiAgbWFjcm8tZXhw YW5zaW9uIG9mIHRoZSBleHBhbmRlciwgYW5kIHRoZW4gbWFudWFsbHkgcmV2aWV3IHRoZSB0d28N CiAgdmVyc2lvbnMgdG8gdmVyaWZ5IHRoZSBhYnNlbmNlIG9mIGF0dGFjayB0aGVyZS4pDQoNCg0K W2NhbWxib290IF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9Fa2RvaGlicy9jYW1sYm9vdD4NCg0KW2Ry YWZ0IHBhcGVyXSA8aHR0cDovL2dhbGxpdW0uaW5yaWEuZnIvfnNjaGVyZXIvZHJhZnRzL2NhbWxi b290LnBkZj4NCg0KDQpBZnRlciBzbyBtYW55IHllYXJzLCBJIGRpc2NvdmVyICdTdHIuYm91bmRl ZF9mdWxsX3NwbGl0IHJlZ2V4cCBzdHIgbicNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYWZ0 ZXItc28tbWFueS15ZWFycy1pLWRpc2NvdmVyLXN0ci1ib3VuZGVkLWZ1bGwtc3BsaXQtcmVnZXhw LXN0ci1uLzc4MzgvMT4NCg0KDQpVbml4SnVua2llIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoaXMgaXMgc28gdXNlZnVsIGFuZCBwb3dl cmZ1bDoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAjcmVxdWlyZSAic3RyIjs7DQogIOKUgiBT dHIuYm91bmRlZF9mdWxsX3NwbGl0IChTdHIucmVnZXhwICJbKCldIikgInRvdG8gKHRpdGksIHRh dGEgKGV0IHR1dHUpKSB2b250IGF1IHBhcmMgKGVuIGNvdXJhbnQpIiAxMDI0OzsNCiAg4pSCIC0g OiBTdHIuc3BsaXRfcmVzdWx0IGxpc3QgPQ0KICDilIIgW1N0ci5UZXh0ICJ0b3RvICI7IFN0ci5E ZWxpbSAiKCI7IFN0ci5UZXh0ICJ0aXRpLCB0YXRhICI7IFN0ci5EZWxpbSAiKCI7DQogIOKUgiAg U3RyLlRleHQgImV0IHR1dHUiOyBTdHIuRGVsaW0gIikiOyBTdHIuRGVsaW0gIikiOyBTdHIuVGV4 dCAiIHZvbnQgYXUgcGFyYyAiOw0KICDilIIgIFN0ci5EZWxpbSAiKCI7IFN0ci5UZXh0ICJlbiBj b3VyYW50IjsgU3RyLkRlbGltICIpIl0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgU3RpbGwgZmlu ZGluZyBoaWRkZW4gcGVhcmxzIGluIHRoZSBzdGRsaWIgYWZ0ZXIgc28gbWFueSB5ZWFycyENCiAg OnNsaWdodF9zbWlsZToNCg0KDQpQYXJzZXIgZm9yIHRoZSBTY2FsYSBwcm9ncmFtbWluZyBsYW5n dWFnZT8NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvcGFyc2VyLWZvci10aGUtc2NhbGEtcHJvZ3JhbW1pbmctbGFuZ3VhZ2UvNzU0MS8x OD4NCg0KDQpEZWVwIGluIHRoaXMgdGhyZWFkLCBZb2FubiBQYWRpb2xlYXUgYW5ub3VuY2VkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIGVuZGVkIHVwIHBvcnRpbmcgdGhlIHJlY3Vy c2l2ZSBkZXNjZW50IHBhcnNlciBpbiB0aGUgU2NhbGEgY29tcGlsZXINCiAgdG8gT0NhbWwg4oCm ICBJIHRoaW5rIGl0IHdhcyB0aGUgZmFzdGVzdCB3YXkgdG8gZ2V0IGEgd29ya2luZyBwYXJzZXIN CiAgZnJvbSBPQ2FtbCDigKYNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL3JldHVybnRvY29ycC9w ZmZmL2Jsb2IvZGV2ZWxvcC9sYW5nX3NjYWxhL3BhcnNpbmcvUGFyc2VyX3NjYWxhX3JlY3Vyc2l2 ZV9kZXNjZW50Lm1sPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElm IHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFu ZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hp dmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxz byB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmli ZQ0KICBbb25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2Fn ZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2 ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRo ZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoN CltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVr bHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoN Cg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of May 04 to 11, 2021.

Software engineer position at LexiFi (Paris)

Alain Frisch announced

LexiFi is hiring! We are looking for= a fully-time software engineer to join our core development team. The vast majority of our stack is implemented in OCaml, a= nd we have plenty of exciting projects on a wide range of topics.

More info on = https://www.lexifi.com/careers/software_engineer/

Open source editor for iOS, iPadOS and macOS

Continuing this thread, Nathan Fallet announced

Just updated the editor, I redesigned the macOS version, and it just looks = better and more native

3D=

What are your first impressions on it?

Backend developer position at Issuu (Copenhagen)

Dario Teixeira announced

We are looking for a Backend Developer with experience in machine learning = – and preferably also OCaml! – to join our Research & Development team. You will help build machine learning r= esearch prototypes and be responsible for integrating them into new and existing products.

At Issuu, we use OCaml extensively in our production systems. If you love O= Caml and functional programming in general, Issuu is a great place to put your passion into real-world product= s!

Please find more information about this position at the following link: https://jobs.lever.co/issuu/f502cb20-b216-4c67-8357-d748e1b35178

Anentropic asked and Dario Teixeira replied

I would love to hear more about your OCaml backend stack

Well, we love to talk about our OCaml stack! :slightly_smiling_face:

We rely on the Jane Street ecosystem a lot, using Core as a Stdlib replacem= ent and Async for monadic concurrency.

AMQP forms the backbone of our messaging system, and therefore we use amqp-client ex= tensively.

We use both MySQL and Postgresql databases in production. For the former we= use ppx_mysql, and for the l= atter, PGOCaml. (Thanks t= o Docker, we can give PGOCaml compile-time access to the DB without having to depend on the actual production DB.)

We currently use Protobuf for serialisation, but spend a great amount of ti= me complaining about it. We rely on ocaml-protoc-plugi= n to generate the OCaml code from Protobuf definitions.

Anyway, that's just the basics of our stack. Do let me know if there's some= thing else you'd like to know in more detail!

roddy asked and Dario Teixeira replied

Do you use Protobuf for interop with non-OCaml systems? If not, I'm curious= about whether you've considered bi= n_prot as an alternative; it seems like an obvious choice if you're using Core/Async.

Yes, we use Protobuf mainly because we have a heterogeneous stack, where be= sides OCaml we also have services running Python, Kotlin, or Elixir.

Tim McGilchrist asked and Dario Teixeira

I'm curious about how you structure the business code (for want of a better= word), in between the technical layers of talking to AMQP or an SQL store. Are there larger scale patterns like CQRS = or DDD that you use to organise code?

How do you package up code for deployment? Docker / AWS something. We're slowly migrating to a micro-service architecture (the pros and cons o= f which are outside the scope of this thread; that's a can of worms I'd rather not open…) whose cast of ch= aracters includes "entities" (responsible for storing/retrieving data from DBs), generic backend services that encapsulat= e business logic, frontend services, and backend-for-frontend services.

We're using Docker for deployment on AWS (mostly), and slowly migrating fro= m Docker Swarm to Kubernetes.

25 years of OCaml

Xavier Leroy announced

25 years ago, on May 9th 1996, release 1.00 of the Objective Caml language = and system was announced: https://sympa.inria.fr/sympa/arc/caml-list/1996-05/msg00003.html

It was already the consolidation of many years of work, integrating J=C3=A9= r=C3=B4me Vouillon and Didier R=C3=A9my's work on objects and classes within Caml Special Light, itself a combination of my work on m= odules and native-code compilation with earlier code taken from Caml Light, especially Damien Doligez's GC.

Little did I know that O(bjective) Caml would still be there 25 years later!

A lot happened during this time, including several major evolutions of the = language, and, much more importantly, the emergence of a community of users and an ecosystem of tools and libraries. = But maybe this was just the beginning for something even bigger? We'll see…

Happy birthday, OCaml!

David Allsopp replied

Most pleasingly, with a very small number of patches, the Windows port still = works in Visual Studio 2019:

C:\Birthday>ocaml.exe
        Objectiv=
e Caml version 1.00

#print_endline "Happy 25th Birthday, OCaml!";;
Happy 25t=
h Birthday, OCaml<=
span style=3D"color: #a52a2a;">!
- : unit =3D ()
##quit;;

C:\Birthday>type hooray.ml
let rec hip_hip n =3D
  if n > 0 then
    let () =3D pr=
int_endline "hip hip! hooray!" in
    hip_hip (pred n)

let () =3D hip_hi=
p 25
C:\Birthday>oca=
mlopt -o hooray.exe hooray.ml

C:\Birthday>hoo=
ray
hip hip! hooray!
...

On the OCaml Maling List, Roberto Di Cosmo also repli= ed

Long live OCaml!

Thanks Xavier, and to all the brilliant minds that contributed to the evolu= tion and adoption of this beautiful language, and system, in this past quarter o= f a century.

If I may add a personal note, one truly remarkable fact is that some rather complex code written in 1998 using OCaml 1.07 [1] could be compiled and run= last year using OCaml 4.x without modifications: the only visible changes= were the new warnings spotting potential issues in the code, thanks to the many improvements to the compiler over time.

For the curious, all the details are here: https://www.dicosmo.org/Articles/2020-ReSc= ienceC.pdf

Cheers

Roberto

[1] that was the first version including support for marshalling closures, added in a fantastic one week-spring in Pisa exactly for this code :-)

OCaml compiler development newsletter, issue 1: before May 202= 1

gasche announced

I'm happy to introduce the first issue of the "OCaml compiler development n= ewsletter". I asked frequent contributors to the OCaml compiler codebase to write a small burb on what they have been= doing recently, in the interest of sharing more information on what people are interested in, looking at and w= orking on.

This is by no means exhaustive: many people didn't end up having the time t= o write something, and it's fine. But hopefully this can give a small window on development activity related to t= he OCaml compiler, structured differently from the endless stream of Pull Requests on the compiler codebase.

(This initiative is inspired by the excellent Multicore newsletter. Please = don't expect that it will be as polished or consistent :yo-yo: .)

Note:

  • Feel free of course to comment or ask questions, but I don't know if th= e people who wrote a small blurb will be looking at the thread, so no promi= ses.
  • If you have been working on the OCaml compiler and want to say somethin= g, please feel free to post! If you would like me to get in touch next time= I prepare a newsletter issue (some random point in the future), please let= me know by email at (gabriel.scherer at gmail).

@dra27 (David Allsopp)

Compiler relocation patches now exist. There's still a few left to write, a= nd they need splitting into reviewable PRs, but the core features are working. A compiler installation can be copi= ed to a new location and still work, meaning that local switches in opam may in theory be renamed and, more impo= rtantly, we can cache previously-built compilers in an opam root to allow a new switch's compiler to be a copy. Th= is probably won't be reviewed in time for 4.13, although it's intended that once merged opam-repository will carry ba= ck-ports to earlier compilers.

A whole slew of scripting pain has lead to some possible patches to reduce = the use of scripts in the compiler build to somewhat closer to none.

FlexDLL bootstrap has been completely overhauled, reducing build time consi= derably. This will be in 4.13 (#10135)

@nojb (Nicol=C3=A1s Ojeda B=C3=A4r)

I am working on #1015= 9, which enables debug information in -output-complete-exe binaries. It uses incbin under Unix-like system and some other method under Windows.

@gasche (Gabriel Scherer)

I worked on bringing more PRs to a decision (merge or close). The number of= open PRs has gone from 220-ish to 180, which feels nice.

I have also contributed to @Ekdohibs' project camlboot, which is a "bootstrap-free" implementation of OCaml able to compile the OCaml compiler= itself. It currently targets OCaml 4.07 for various reasons. We were able to do a full build of the OCaml compiler,= and check that the result produces bootstrap binaries that coincide with upstream bootstraps. This gives extre= mely strong confidence that the OCaml bootstrap is free from "trusting trust" attacks. For more details, see our = draft paper.

with @Octachron (Florian Angeletti)

I worked with Florian Angeletti on deprecating certain command-line warning= -specifier sequences, to avoid usability issues with (new in 4.12) warning names. Before -w -partial-match disables warning 4, but -w -partial is interpreted as the sequence w -p -w a -w r -w t -w i -w a -w l= , most of which are ignored but -w a silences all warnings. Now multi-letter sequences of "unsigned" specifiers (-p is signed, a is unsigned) are deprecated. (We first deprecated all unsigned specifiers, but Leo White tested the result a= nd remarked that -w A is common, so now we only warn on multi-letter sequences of unsigned specifiers.

I am working with @Octachron (Florian Angeletti) on grouping signature item= s when traversing module signatures. Some items are "ghost items" that are morally attached in a "main item"; the cod= e mostly ignores this and this creates various bugs in corner cases. This is work that Florian started in Septembe= r 2019 with #8929, to fix a bu= g in the reprinting of signatures. I only started reviewing in May-September 2020 and we decided to do sizeable changes, he s= plit it in several smaller changes in January 2021 and we merged it in April 2021. Now we are looking are fixing = other bugs with his code (#9774, #10385). Just this week Florian landed a nice PR fixing several distinct issues related to sig= nature item grouping: #10401.

@xavierleroy (Xavier Leroy)

I fixed #10339, a= mysterious crash on the new Macs with "Apple silicon". This was due to a ARM (32 and 64 bits)-specific optimization of array bound= checking, which was not taken into account by the platform-independent parts of the back-end, leading to incor= rect liveness analysis and wrong register allocation. #10354 fixes this by informing the platform-independent parts of the back-end that some platform-specific instructions can raise. = In passing, it refactors similar code that was duplicating platform-independent calculations (of which instructions ar= e pure) in platform-dependent files.

I spent quality time with the Jenkins continuous integration system at Inri= a, integrating a new Mac Mini M1. For unknown reasons, Jenkins ran the CI script in x86-64 emulation mode, so we = were building and testing an x86-64 version of OCaml instead of the intended ARM64 version. A bit of scripting= later (8b1bc01c3) and voil=C3=A0, arm64-macos is properly tested as part of our CI.

Currently, I'm reading the "safe points" proposal by Sadiq Jaffer (#10039) and the = changes on top of this proposed by Damien Doligez. It's a necessary step towards Multicore OCaml, so we really need to move fo= rward on this one. It's a nontrivial change involving a new static analysis and a number of tweaks in every code= emitter, but things are starting to look good here.

@mshinwell (Mark Shinwell)

I did a first pass of review on the safe points PR (#10039) and significantly simplified the proposed backend changes. I've also been invo= lved in discussions about a new function-level attribute to cause an error if safe points (including alloca= tions) might exist within a function's body, to make code that currently assumes this robust. There will be a des= ign document for this coming in due course.

I fixed the random segfaults that were occurring on the RISC-V Inria CI wor= ker (#10349).

In Flambda 2 land we spent two person-days debugging a problem relating to = Infix_tag! We discovered that the code in OCaml 4.12 onwards for traversing GC roots in static data ("caml_globals") = is not correct if any of the roots are closures. This arises in part because the new compaction code (#9728) has a hidden invariant: it must not see any field of a static data root mor= e than once (not even via an Infix_tag). As far as we know, these situations do not arise in the existing compiler, = although we may propose a patch to guard against them. They arise with Flambda 2 because in order to compile static= ally-allocated inconstant closures (ones whose environment is partially or wholly computed at runtime) we register c= losures directly as global roots, so we can patch their environments later.

@garrigue (Jacques Garrigue)

I have been working on a number of PRs fixing bugs in the type system, whic= h are now merged:

  • #10277 fixes = a theoretical bug in the principality of GADT type inference (#10383 applies only in -princi= pal mode)
  • #10308 fixes = an interaction between local open in patterns and the new syntax for introd= ucing existential type variables
  • #10322 is an = internal change using a normal reference inside of a weak one for backtrack= ing; the weak reference was an optimization when backtracking was a seldom = used feature, and was not useful anymore
  • #10344 fixes = a bug in the delaying of the evaluation of optional arguments
  • #10347 cleans= up some code in the unification algorithm, after a strengthening of univer= sal variable scoping
  • #10362 fixes = a forgotten normalization in the type checking algorithm

Some are still in progress:

  • #10348 improv= es the way expansion is done during unification, to avoid some spurious GAD= T related ambiguity errors
  • #10364 change= s the typing of the body of the cases of pattern-matchings, allowing to war= n in some non-principal situations; it also uncovered a number of principal= ity related bugs inside the the type-checker

Finally, I have worked with Takafumi Saikawa (@t6s) on making the represent= ation of types closer to its logical meaning, by ensuring that one always manipulate a normalized view in #10337 (large cha= nge, evaluation in progress).

@let-def (Fr=C3=A9d=C3=A9ric Bour)

For some time, I have been working on new approaches to generate error mess= ages from a Menhir parser.

My goal at the beginning was to detect and produce a precise message for th= e =E2=80=98let ;=E2=80=99 situation:

let x =3D 5;
let y =3D 6
let z =3D 7

LR detects an error at the third =E2=80=98let=E2=80=99 which is technically= correct, although we would like to point the user at the =E2=80=98;=E2=80=99 which might be the root cause of the error. This goal h= as been achieved, but the prototype is far from being ready for production.

The main idea to increase the expressiveness and maintainability of error c= ontext identification is to use a flavor of regular expressions. The stack of a parser defines a prefix of a sentential form. Our regular ex= pressions are matched against it. Internal details of the automaton does not leak (no reference to states), the regula= r language is defined by the grammar alone. With appropriate tooling, specific situations can be captured by starting f= rom a coarse expression and refining it to narrow down the interesting cases.

Now I am focusing on one specific point of the =E2=80=98error message=E2=80= =99 development pipeline: improving the efficiency of =E2=80=98menhir –list-errors=E2=80=99. This command is used to enumerate sentences that cover all erroneous situat= ions (as defined by the LR grammar). On my computer and with the OCaml grammar, it takes a few minutes and quite a lot= of RAM. Early results are encouraging and I hope to have a PR for Menhir soon. The performance improvement we are aim= ing for is to make the command almost real time for common grammars and to tackle bigger grammars by reducing the memo= ry needs. For instance, in the OCaml case, the runtime is down from 3 minutes to 2=E2= =80=933 seconds and memory consumption goes from a few GiB down to 200 MiB.

Daniel B=C3=BCnzli asked and gasche replied

> […] @Ekdohibs=E2=80=99 project camlboot , which is a =E2=80=9Cbootstrap-free=E2=80=9D=
> implementation of OCaml able to compile the OCaml compiler itself. It = currently targets OCaml 4.07 for various
> reasons. We were able to do a full build of the OCaml compiler, and ch= eck that the result produces bootstrap
> binaries that coincide with upstream bootstraps. This gives extremely = strong confidence that the OCaml bootstrap is
> free from =E2=80=9Ctrusting trust=E2=80=9D attacks. For more details, = see our dr= aft paper.

Something that is not clear to me (but I read quickly) is the impact of `gu= ile` itself being not bootstrapped yet. Could there be a very elaborate attack (with probability 0 of existi= ng) on both the guile and ocaml bootstrap or is there something in the whole scheme that prevents it ?

Yes, currently Guile needs to be trusted, and it would be possible that a b= ootstrapping virus in Guile would break our correctness result. (It would need to reproduce itself through our comp= iler and interpreter that were written after Guile itself, but I think in theory this could be done with an almost= -infinitely clever program analysis.) Of course, an attack at the source level (inserting malicious source, instead = of malicious binaries) is also possible anywhere in the chain. Our main reason for using Guile is that this is the high-level language com= munity most active on debootstrapping-towards-the-metal (through the Guix connection), so we beli= eve it is more likely to manage debootstrapping and maintain it in the longer run.

(The seed that Guile depends on is its macro-expander, which is written usi= ng macros itself. In theory one may perform the macro-expansion of the expander, and then manually review the t= wo versions to verify the absence of attack there.)

Parser for the Scala programming language?

Deep in this thread, Yoann Padioleau announced

I ended up porting the recursive descent parser in the Scala compiler to OC= aml … I think it was the fastest way to get a working parser from OCaml …

https://github.com/returntocorp/pff= f/blob/develop/lang_scala/parsing/Parser_scala_recursive_descent.ml

Old CWN

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

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

--=-=-=--