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 6707C5D5 for ; Tue, 7 Apr 2020 07:51:36 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.72,353,1580770800"; d="scan'208,217";a="444163966" Received: from sympa.inria.fr ([193.51.193.213]) by mail2-relais-roc.national.inria.fr with ESMTP; 07 Apr 2020 09:51:31 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id A60317F487; Tue, 7 Apr 2020 09:51:31 +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 20BE97F449 for ; Tue, 7 Apr 2020 09:51:25 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=3SsL=5X=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org IronPort-PHdr: =?us-ascii?q?9a23=3ArPoK3xKzuYfFtgFQ8dmcpTZWNBhigK39O0sv0rFi?= =?us-ascii?q?tYgXKPX4rarrMEGX3/hxlliBBdydt6sZzbOK+Pm6AyRAuc/H7CleNsQUFlcsso?= =?us-ascii?q?Y/oU8JOIa9E0r1LfrnPWQRPf9pcxtbxUy9KlVfA83kZlff8TWY5D8WHQjjZ0Iu?= =?us-ascii?q?frymUoHdgN6q2O+s5pbdfxtHhCanYbN1MR66sRjdutMZjId/Kqs90AbFr3RHd+?= =?us-ascii?q?hL229kO0+YkxLg6sut5pJu/Dlctv07+8JcTan2erkzQKBFAjghL20668rnuAXZ?= =?us-ascii?q?QwCS/HUcSGIWkhRJAwjB8h73W4r6vzX5uORgxiSUJNX6Qr8oVzus6adrUwLohz?= =?us-ascii?q?wcNzEl6mHXi9d/g7xdrRm8uhFw2Y/UYIWSNPpjYqPQeM4RSGRdUspNUSFKH4Sz?= =?us-ascii?q?YZYSD+oaJeZXsZXyp0cAoxu5AAmjHuLvyjlVjXPy0qA31+EtHAfG0AIjGdIOrn?= =?us-ascii?q?XUrM70NKgJVeC60rTDzDvEb/NMxDj985XDfhQvrP2QWL59d9fax0syGAPfllie?= =?us-ascii?q?qZLrMS6b2OoOvGeU8/FtWvizh2M9sQx9viSjy8Uqh4LUhowV0FfE9SBhzYspId?= =?us-ascii?q?23Ukh7asO5HpRMtyGaMop2Qt8+Q2p1vys10LkGtoS9fCQQ05Qo2x7fa/mGc4iU?= =?us-ascii?q?/hLuT/6RITB8hHNlZLKwmQq98Uimyu39T8m0zUhFojBCktnWuXAAzhre4dWJRP?= =?us-ascii?q?t6+0euwzeP1wbL5+FcP080iavbK4I/zb4okZoTtEHDETHslEXwkqCWal0o+u+0?= =?us-ascii?q?5Ov9Z7XmooWQN4huigHxKqgulc2/Afg4MggTRGeX4/iz1Lrm/UHhT7VKj+E2kq?= =?us-ascii?q?nEsJ/BP8gbp6m5DxdU0oYl8Ra/Di2p3M4WnXkdNF5FYxOHj4fxO1HKOv/4C+2z?= =?us-ascii?q?g1O2kDdk3/zGPrrhAonRIXjZiLftZ6py60lZyAYr0d9f54hbCqsOIPLuREDxrs?= =?us-ascii?q?bXDgIkPACuxObnEtp92psRWWKVGKCZKKPSsUGJ5uMuOeWMY5UVuDnlJ/gk+vHv?= =?us-ascii?q?jXs5mVsHcamux5sXZ3a1FellLUWBeXfgn8kNHGMQsgYjUODnh0eOXDBPa3qoUa?= =?us-ascii?q?8x6Sk3BYClAIvZWIygj6KN0D2mEpBZfGxKF1+BHWvueo6ZQfkDcjiSLdVkkjEc?= =?us-ascii?q?VbiuVYsh1Ra2uQ//xLtrM/DY+jUftZLn1Nl1+/Pcmg0y9TxyDsSdynyNQH9ukm?= =?us-ascii?q?MPXT8207hzoU17ylidzah1m+FUGcJX6v9TTws2KZHRw/Z0BtzuQA7McNiERE6j?= =?us-ascii?q?Qtq8ADExStwxw8UJY0Z4A9iskwzN0Te2D7INmbGFGYc0/KTE0nXxJslw027G1K?= =?us-ascii?q?4lj1gmXstAK3Gphq559wjSHo7JjluWm7ytdaQG0y7A7H2MzW6Us0FeSgJwSrnK?= =?us-ascii?q?XXAaZkvXsdT5+ljPQKSpCbQ6NAtO1dCNKrBQZt3sglhHS+3vONPEY2K+g2uwHw?= =?us-ascii?q?qHxquQbIr2fGUQxDnSB1IBkwAX5HqGMQk+Bjy9o2/FFzxvFVfvY1v2/uVkqXO7?= =?us-ascii?q?SFU0zwCQYEF72bq14E1dufvJAfcM2PhM7CM+rR1wA1D72d/KXZ7I7QF+eu8UKY?= =?us-ascii?q?c2/1Fv0WPCqxc7P5CxK6QkgUQRJUA/tErr01BzC55cuckstnIjigRobeqT11ZZ?= =?us-ascii?q?XzeZxozrfLrNIGju9RShbL6Q10yN/syR//Im7P0+427ovASoClZqp3xj2t8TyH?= =?us-ascii?q?Cc45TWECIKVpbgTks89x57vqzXJC4n6NWHhjVXLaCov2qaiJoSD+w/x0P/Lo4C?= =?us-ascii?q?YpPBLxf7FoghP+brKOEunALyPBcUZaZK86olI86td/2HwbOmeuF6k2D/1DgV0M?= =?us-ascii?q?VGykuJshFEZKvQxZ9ckqOA2Q+WSzr3jFGgq93634deamNLRzvt+W3fHIdUI5ZK?= =?us-ascii?q?U8MOAGaqLdeww4wh1ZTqRnhT+UXlAg8WnsizdkjLYg=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DgBQCKMIxehyIeaIFgBhaDUFiBGFUyK?= =?us-ascii?q?oQbiQGFe4UfhEVjizeHBQNQBQkBAwEMGAEOBQECBAEBgVCDDYIzHQYBBTMTAhA?= =?us-ascii?q?BAQUBAQECAQIDBAETAQEBCgsJCCmFXQyCOwwMAwODHAMBGAECBgQGOyojAxQBB?= =?us-ascii?q?gMCBA0BFwEUChcBCQkUBgGDCwGCfAQBCpQFm3l/M4Q1AQMDAgsDDy9Bg1CBPw0?= =?us-ascii?q?CE38XhSODF4NTJg+BTD+BEYISUGyBQYENDgsBAQEBAQGBGBMNBwEBEAGDIReCR?= =?us-ascii?q?wSLT4InGAMkA4hwYIcogTdTjmp6B4JAfASFSjVxhV2Dc0+FOIJOM1GDT4NlhF2?= =?us-ascii?q?MHyGPFoFShT5wgSaFQ4gIgTKEKoE/KoFIHgwHMxowgngBMwlfDVYBjVIXgQQBA?= =?us-ascii?q?oJJgT6BJoEkUTuFEzA/MwIBAQeBFwEBBRMLAYtBAiaCGwEB?= X-IPAS-Result: =?us-ascii?q?A0DgBQCKMIxehyIeaIFgBhaDUFiBGFUyKoQbiQGFe4UfhEV?= =?us-ascii?q?jizeHBQNQBQkBAwEMGAEOBQECBAEBgVCDDYIzHQYBBTMTAhABAQUBAQECAQIDB?= =?us-ascii?q?AETAQEBCgsJCCmFXQyCOwwMAwODHAMBGAECBgQGOyojAxQBBgMCBA0BFwEUChc?= =?us-ascii?q?BCQkUBgGDCwGCfAQBCpQFm3l/M4Q1AQMDAgsDDy9Bg1CBPw0CE38XhSODF4NTJ?= =?us-ascii?q?g+BTD+BEYISUGyBQYENDgsBAQEBAQGBGBMNBwEBEAGDIReCRwSLT4InGAMkA4h?= =?us-ascii?q?wYIcogTdTjmp6B4JAfASFSjVxhV2Dc0+FOIJOM1GDT4NlhF2MHyGPFoFShT5wg?= =?us-ascii?q?SaFQ4gIgTKEKoE/KoFIHgwHMxowgngBMwlfDVYBjVIXgQQBAoJJgT6BJoEkUTu?= =?us-ascii?q?FEzA/MwIBAQeBFwEBBRMLAYtBAiaCGwEB?= X-IronPort-AV: E=Sophos;i="5.72,353,1580770800"; d="scan'208,217";a="444163936" X-MGA-submission: =?us-ascii?q?MDGLKGXXDn+eRcdTNZtCngUyqltEaA+UchPYLh?= =?us-ascii?q?jUZWyD0IP4VllHIU/cgFR+F3kvgB5b5j0Z9L4Wz2G6YkCKNGsuM7gy4w?= =?us-ascii?q?/dhp3WZHC/jB7vnAjbS03b94BNm9qECYV3CJbhJoXL9mcepIxGjRiFj8?= =?us-ascii?q?Y3LdtLdRf2SLqZR94AVKoKpA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 Apr 2020 09:51:17 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 630C75646C9; Tue, 7 Apr 2020 09:51:14 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 07 Apr 2020 09:51:13 +0200 Message-ID: <87y2r7enta.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 7 09:51:15 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.001075, queueID=DF58B5646CC X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 18094 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: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMzEgdG8gQXByaWwNCjA3LCAyMDIwLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk1h a2luZyBhIG11c2ljIHBsYXllciBpbiBPQ2FtbA0KVGhlIGVuZCBvZiBDYW1scDQNCk9DYW1sZm9y bWF0IDAuMTQuMA0KTUwgRmFtaWx5IFdvcmtzaG9wIDIwMjA6IENhbGwgZm9yIHByZXNlbnRhdGlv bnMNCkFubm91bmNpbmcgU2VrLCBhbiBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gb2Ygc2VxdWVu Y2VzDQpBbm5vdW5jaW5nIGR1bmUtZGVwczogcHJvZHVjZXMgYSBwcm9qZWN0LWNlbnRyaWMgZGVw ZW5kZW5jeSBncmFwaA0KT0NhbWwgVXNlcnMgYW5kIERldmVsb3BlcnMgTWVldGluZyAyMDIwDQpP bGQgQ1dODQoNCg0KTWFraW5nIGEgbXVzaWMgcGxheWVyIGluIE9DYW1sDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L21ha2luZy1hLW11c2ljLXBsYXllci1pbi1vY2FtbC81NDEzLzE+DQoNCg0KRHJh Y29zZSBhc2tlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg SSdtIGludGVyZXN0ZWQgaW4gbWFraW5nIG15IG93biBtdXNpYyBwbGF5ZXIgaW4gT0NhbWwgc28g SSB3YW50ZWQgdG8NCiAga25vdyB3aGV0aGVyIHRoZXJlIHdlcmUgYW55IGV4aXN0aW5nIG9uZXMg YW5kL29yIGV4YW1wbGVzIG9mIGhvdyB0bw0KICBtYWtlIG9uZS4gQmVhciBpbiBtaW5kLCBJIGFt IGludGVyZXN0ZWQgaW4gdGhlIGFjdHVhbCBsb2dpYyBvZiBob3cgdG8NCiAgcmVhZCBhIG11c2lj IGZpbGUgKG9yIGEgcGxheWxpc3QpIGFuZCBsaXN0ZW5pbmcgdG8gaXQsIHJhdGhlciB0aGFuIHRo ZQ0KICBmcm9udC1lbmQgcGFydCBvZiBhIG11c2ljIHBsYXllci4gIChNeSBrbm93bGVkZ2Ugb2Yg T0NhbWwgaXMNCiAgaW50ZXJtZWRpYXRlKQ0KDQoNClRob21hcyBCbGFuYyBzdWdnZXN0ZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIFlvdSB3YW50IHRvIGNoZWNrIDxodHRwczovL2dpdGh1Yi5jb20vc2F2b25l dC9saXF1aWRzb2FwPg0KDQoNCllvdGFtIEJhcm5veSB0aGVuIHNhaWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IFdvdyBAUGF0SiBJIGRpZG4ndCBrbm93IGFib3V0IGxpcXVpZHNvYXAuIEkgYWRkZWQgaXQgdG8N CiAgb2NhbWx2ZXJzZS4gVGhpcyBpcyB3aGF0IHdlIGhhdmUgZm9yIHRoZSBhdWRpbyBwYWdlIG5v dywgaW4gY2FzZSBpdCdzDQogIGhlbHBmdWwgdG8gdGhlIE9QOiA8aHR0cHM6Ly9vY2FtbHZlcnNl LmdpdGh1Yi5pby9jb250ZW50L2F1ZGlvLmh0bWw+DQoNCg0KZ25kbCBhbHNvIHJlcGxpZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkg ZXhwZXJpbWVudGVkIHdpdGggc2V2ZXJhbCBzb2x1dGlvbnMgaW4gdGhlIFtwbGF5b10gcHJvamVj dC4gIE9uZSBvZg0KICB0aGUgcG9zc2libGUgc29sdXRpb25zIGlzIHRvIHVzZSBbb2NhbWwtZ3N0 cmVhbWVyXS4gIElmIHlvdSBmaW5kIHRoYXQNCiAgdGhlIGdzdHJlYW1lciBmcmFtZXdvcmsgaXMg dG9vIGFubm95aW5nICh3aGljaCBJIGNhbiB1bmRlcnN0YW5kIDotKSwNCiAgeW91IGNhbiB1c2Ug W29jYW1sLWZmbXBlZ10uIG5vdGUgaG93ZXZlciB0aGF0LCBpbiB0aGUgbGF0ZXN0IHZlcnNpb24N CiAgb2Ygb2NhbWwtZmZtcGVnLCB0aGUgYXVkaW8gZGV2aWNlIG91dHB1dCBbbm8gbG9uZ2VyIHdv cmtzXS4gVG8NCiAgb3ZlcmNvbWUgdGhpcyBkcmF3YmFjaywgeW91IGNhbiB1c2UgW29jYW1sLXBv cnRhdWRpb10uDQoNCg0KW3BsYXlvXSA8aHR0cHM6Ly9naXRodWIuY29tL2duZGwvcGxheW8+DQoN CltvY2FtbC1nc3RyZWFtZXJdIDxodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9vY2FtbC1nc3Ry ZWFtZXI+DQoNCltvY2FtbC1mZm1wZWddIDxodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9vY2Ft bC1mZm1wZWc+DQoNCltubyBsb25nZXIgd29ya3NdIDxodHRwczovL2dpdGh1Yi5jb20vc2F2b25l dC9vY2FtbC1mZm1wZWcvaXNzdWVzLzMyPg0KDQpbb2NhbWwtcG9ydGF1ZGlvXSA8aHR0cHM6Ly9n aXRodWIuY29tL3Nhdm9uZXQvb2NhbWwtcG9ydGF1ZGlvPg0KDQoNClRoZSBlbmQgb2YgQ2FtbHA0 DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3RoZS1lbmQtb2YtY2FtbHA0 LzQyMTYvOTY+DQoNCg0KQ29udGludWluZyB0aGlzIG9sZCB0aHJlYWQsIENoZXQgTXVydGh5IGFu bm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgUGVyaGFwcyB3 b3J0aCBtZW50aW9uaW5nIGJyaWVmbHkgdGhhdCBmb3IgYW55Ym9keSB3aG8gLXdhbnRzLSB0bw0K ICBjb250aW51ZSB1c2luZyBjYW1scDQsIEknbSAoYSkgbWFpbnRhaW5pbmcgY2FtbHA1IGFuZCBi cmluZ2luZyBpdA0KICB1cC10by1kYXRlIHdpdGggZXZlcnl0aGluZyBpbiBvY2FtbCA0LjEwLjAg dGhhdCBJIGNhbiB0aGluayBvZiwgYW5kDQogIChiKSBJJ2QgYmUgaGFwcHkgdG8gaGVscCB0aGVt IHBvcnQgdGhlaXIgZGVwZW5kZW5jeSBvdmVyIHRvIGNhbWxwNS4NCg0KICBUaGlzIGlzIG5vdCB0 byBiZSBjb25zdHJ1ZWQgYXMgYW4gYXJndW1lbnQgZm9yIHVzaW5nIGNhbWxwNC81Lg0KDQoNCk9D YW1sZm9ybWF0IDAuMTQuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tb2NhbWxmb3JtYXQtMC0xNC0wLzU0MzUvMT4NCg0KDQpFdGllbm5lIE1pbGxvbiBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE9uIGJlaGFsZiBvZiB0aGUgZGV2ZWxvcG1lbnQg dGVhbSwgSSdkIGxpa2UgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YNCiAgb2NhbWxmb3JtYXQg dmVyc2lvbiAwLjE0LjAgOnRhZGE6Lg0KDQogIEhlcmUgYXJlIHRoZSBtYWluIGhpZ2hsaWdodHMg b2YgdGhpcyByZWxlYXNlOg0KDQoNClN1cHBvcnQgZm9yIE9DYW1sIDQuMTANCuKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K DQogIFRoaXMgbWVhbnMgYm90aCB0aGF0IGl0IGNvbXBpbGVzIGFuZCBydW5zIHVzaW5nIHRoaXMg dmVyc2lvbiwgYnV0IGFsc28NCiAgdGhhdCBpdCBjYW4gZm9ybWF0IDQuMTAtc3BlY2lmaWMgbGFu Z3VhZ2UgZmVhdHVyZXMgKGBtb2R1bGUgXycgYW5kDQogIG11bHRpLWluZGljZXMgb3BlcmF0b3Jz KS4NCg0KDQpQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBpbnZhbGlkIGZpbGVzDQrilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBBcyBPQ2Ft bGZvcm1hdCBvcGVyYXRlcyBvbiBBU1RzLCBpdCBub3JtYWxseSByZXF1aXJlcyBhIHZhbGlkIGlu cHV0DQogIGZpbGUuIFRoaXMgcmVsZWFzZSBhZGRzIGEgYC0tZm9ybWF0LWludmFsaWQtZmlsZXMn IG9wdGlvbiB0byBkZXRlY3QNCiAgaW52YWxpZCBwYXJ0cyBhbmQgcHJpbnQgdGhlbSB2ZXJiYXRp bS4gVGhpcyBmZWF0dXJlIGlzIHN0aWxsDQogIGV4cGVyaW1lbnRhbC4NCg0KDQpQcmVzZXJ2aW5n IG1vcmUgY29uY3JldGUgc3ludGF4DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICBTdGFydGluZyB3aXRoIHRoaXMgcmVsZWFzZSwgT0NhbWxmb3JtYXQgaXMgZ29pbmcg dG8gcHJlc2VydmUgbW9yZQ0KICBjb25jcmV0ZSBzeW50YXguIEZvciBleGFtcGxlLCBgbW9kdWxl IE0gPSBmdW5jdG9yIChLIDogUykgLT4gc3RydWN0DQogIGVuZCcgYW5kIGBtb2R1bGUgTSAoSyA6 IFMpID0gc3RydWN0IGVuZCcgYXJlIGVxdWl2YWxlbnQuIEluIHRoZSBwYXN0LA0KICBib3RoIHZh cmlhbnRzIHdvdWxkIGJlIGZvcm1hdHRlZCBhcyB0aGUgbGF0dGVyLiBOb3csIHRoZSBvcmlnaW5h bA0KICBzeW50YXggaXMgcHJlc2VydmVkLiBJbiBzb21lIGNhc2VzLCBwcmVzZXJ2aW5nIHdhcyBw b3NzaWJsZSB0aHJvdWdoDQogIHRoZSBtZWFucyBvZiBhbiBvcHRpb246IGZvciBleGFtcGxlLCB0 byBjaG9pY2UgYmV0d2VlbiBgbGV0JW5hbWUgeCA9IGUNCiAgaW4gYm9keScgYW5kIGBbJW5hbWUg bGV0IHggPSBlIGluIGJvZHldJywgd2FzIGNvbnRyb2xsZWQgYnkgdGhlDQogIGBleHRlbnNpb24t c3VnYXInIG9wdGlvbi4gVGhpcyBvcHRpb24gaXMgbm93IGRlcHJlY2F0ZWQgYW5kDQogIE9DYW1s Zm9ybWF0IHdpbGwgbm93IGFsd2F5cyBwcmVzZXJ2ZSB3aGF0IHdhcyBpbiB0aGUgc291cmNlIGZp bGUgKHRoaXMNCiAgd2FzIHRoZSBkZWZhdWx0IGJlaGF2aW91cikuDQoNCiAgU2ltaWxhcmx5LCBp dCB3YXMgcG9zc2libGUgdG8gY29udHJvbCBob3cgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZQ0KICBl c2NhcGVkIGluIHN0cmluZyBhbmQgY2hhcmFjdGVyIGxpdGVyYWxzIHRocm91Z2ggdGhlIGBlc2Nh cGUtc3RyaW5ncycNCiAgYW5kIGBlc2NhcGUtY2hhcnMnIG9wdGlvbnMuIFRoZXkgYXJlIGJlaW5n IGRlcHJlY2F0ZWQgYW5kIHRoZSBvbmx5DQogIHBvc3NpYmxlIGJlaGF2aW9yIHdpbGwgYmUgcHJl c2VydmluZyB0aGUgY29uY3JldGUgc3ludGF4IChhcyBkb25lIGJ5DQogIGRlZmF1bHQpLg0KDQog IFRoZSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRoYXQgd2UgZmVlbCB0aGF0IG9jYW1sZm9y bWF0IHNob3VsZCBiZQ0KICBqdXN0IGFib3V0IGZvcm1hdHRpbmcuIFRoZSBmYWN0IHRoYXQgdGhp cyBiZWhhdmlvciB3YXMgY29uZmlndXJhYmxlIGlzDQogIGluIHBhcnQgZHVlIHRvIHRoZSBmYWN0 IHRoYXQgaXQgb3BlcmF0ZXMgb24gT0NhbWwgQVNUcywgYnV0IGVuZCB1c2Vycw0KICBzaG91bGQg bm90IGhhdmUgdG8gYmUgc3VycHJpc2VkIGJ5IHRoZWlyIGNvZGUgYmVpbmcgdHJhbnNmb3JtZWQg b24NCiAgcmVmb3JtYXR0aW5nLg0KDQogIEluIHRoZSBmdXR1cmUsIHdlIHBsYW4gdG8gZXh0ZW5k IHRoYXQgdG8gb3RoZXIgc2ltaWxhciBjb25zdHJ1Y3RzLA0KICBzdWNoIGFzIHVzaW5nIGAofi8n KX4gb3IgYGJlZ2lufi9+ZW5kJywgb3Igc3BhY2luZyBiZXR3ZWVuIG1vZHVsZQ0KICBpdGVtcy4N Cg0KDQpQbGFjZW1lbnQgb2YgZG9jIGNvbW1lbnRzDQrilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBQ bGFjaW5nIGRvYyBjb21tZW50cyBgKCoqIC4uLiAqKScgaXMgY29udHJvbGxlZCBieSB0aGUgYGRv Yy1jb21tZW50cycNCiAgY29uZmlndXJhdGlvbiBvcHRpb24uIEl0IGlzIGFsd2F5cyBwb3NzaWJs ZSB0byBwdXQgdGhlbSBiZWZvcmUgdGhlDQogIGl0ZW0gdGhleSByZWZlciB0bywgYW5kIHRoaXMg aXMgd2hhdCB0aGUgYGRvYy1jb21tZW50cz1iZWZvcmUnIG9wdGlvbg0KICBkb2VzLiBUaGUgYWx0 ZXJuYXRpdmUgYGRvYy1jb21tZW50cz1hZnRlcicgd2lsbCB0cnkgdG8gZG8gaXRzIGJlc3QgdG8N CiAgcHV0IHRoZW0gYWZ0ZXIsIGJ1dCBpbiBzb21lIGNhc2VzIGl0IGlzIG5vdCBwb3NzaWJsZS4g Rm9yIGV4YW1wbGUsIGluDQogIGEgdmFyaWFudCB0eXBlIGRlY2xhcmF0aW9uLCBhIGRvYy1jb21t ZW50IHB1dCBpbW1lZGlhdGVseSBhZnRlciB3aWxsDQogIGJlIGF0dGFjaGVkIHRvIHRoZSBsYXN0 IGNvbnN0cnVjdG9yIGJ5IGRvY3VtZW50YXRpb24NCiAgdG9vbHMuIE9jYW1sZm9ybWF0IG5lZWRz IHRvIHByZXNlcnZlIHRoZSBtZWFuaW5nIG9mIHByb2dyYW1zLCBzbyBpbg0KICB0aGVzZSBjYXNl cywgaXQgd2lsbCBpbnN0ZWFkIHB1dCB0aGUgY29tbWVudCBiZWZvcmUuIEluIHRoZSBjYXNlIG9m DQogIGBtb2R1bGUnIGRlY2xhcmF0aW9ucywgcHV0dGluZyB0aGUgY29tbWVudCBhZnRlciBtaWdo dCBub3QgYmUgdmVyeQ0KICB1c2VmdWwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIGlzIHZl cnkgbGFyZ2UuDQoNCiAgVGhpcyByZXF1aXJlcyBhIGNvbXBsZXggcnVsZSB0byBkZXRlcm1pbmUg d2hpY2ggY29tbWVudHMgd2lsbCBiZSBwdXQNCiAgYmVmb3JlIGFuZCB3aGljaCBjb21tZW50cyB3 aWxsIGJlIHB1dCBhZnRlci4gU28gaW4gdGhpcyB2ZXJzaW9uLCB3ZQ0KICBhcmUgZGVwcmVjYXRp bmcgdGhpcyBtZWNoYW5pc20gYW5kIHJlcGxhY2luZyBpdCB3aXRoIGEgc2ltcGxlciBvbmUNCiAg Y29udHJvbGxlZCBieSBgZG9jLWNvbW1lbnRzLXZhbCcgdGhhdCBhcHBsaWVzIG9ubHkgdG8gYHZh bCcgYW5kDQogIGBleHRlcm5hbCcgaXRlbXMuIEZvciB0aGVzZSBpdGVtcywgaXQgaXMgYWx3YXlz IHBvc3NpYmxlIHRvIGF0dGFjaA0KICBkb2N1bWVudHMgYmVmb3JlIG9yIGFmdGVyIHRoZW0uIEZv ciBhbGwgb3RoZXIgaXRlbXMsIGxpa2UgdHlwZSBvcg0KICBtb2R1bGUgZGVjbGFyYXRpb25zLCB0 aGUgZG9jIGNvbW1lbnRzIHdpbGwgY29uc2lzdGVubHkgYmUgcHV0IGJlZm9yZS4NCg0KDQpNYW55 IGJ1Z3MgZm91bmQgYnkgZnV6emluZw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgV2UgaG9v a2VkIG9jYW1sZm9ybWF0IHRvIEFGTCwgbG9va2luZyBmb3IgcHJvZ3JhbXMgdGhhdCBwYXJzZQ0K ICBjb3JyZWN0bHkgYnV0IHRyaWdnZXIgZXJyb3JzIGR1cmluZyBmb3JtYXR0aW5nLiBUaGlzIGFw cHJvYWNoIHdvcmtlZA0KICB2ZXJ5IHdlbGwgYW5kIG1vcmUgdGhhbiAyMCBsb2dpY2FsIGJ1Z3Mg d2VyZSBmb3VuZCB3aXRoIHRoaXMNCiAgdGVjaG5pcXVlLg0KDQoNClVwZ3JhZGluZw0K4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVG8gdXBncmFkZSBmcm9tIG9jYW1sZm9ybWF0IDAu MTMuMCwgb25lIG5lZWRzIHRvIHVwZ3JhZGUgdGhlDQogIG9jYW1sZm9ybWF0IGJpbmFyeSBhbmQg cmVwbGFjZSB0aGUgYHZlcnNpb24nIGZpZWxkIGluIGAub2NhbWxmb3JtYXQnDQogIGZpbGVzIGJ5 IGAwLjE0LjAnIGFuZCB0aGVuOg0KDQogIOKAoiBpZiB5b3UgdXNlZCBgZG9jLWNvbW1lbnRzPWFm dGVyJywgeW91IGNhbiByZXBsYWNlIGl0IGJ5DQogICAgYGRvYy1jb21tZW50cy12YWw9YWZ0ZXIn LiAgVGhpcyB3aWxsIG1vdmUgZG9jLWNvbW1lbnRzIG9uIG1vZHVsZQ0KICAgIGl0ZW1zIGV4Y2Vw dCBgdmFsJyBhbmQgYGV4dGVybmFsJyBvbmVzLg0KICDigKIgaWYgeW91IHVzZWQgYGRvYy1jb21t ZW50cz1iZWZvcmUnLCB5b3UgY2FuIHJlbW92ZSBpdCBhcyBpdCBpcyBub3cNCiAgICB0aGUgZGVm YXVsdC4NCiAg4oCiIGlmIHlvdSBzZXQgYGVzY2FwZS1jaGFycz1wcmVzZXJ2ZScsIGBlc2NhcGUt c3RyaW5ncz1wcmVzZXJ2ZScsIG9yDQogICAgYGV4dGVuc2lvbi1zdWdhcj1wcmVzZXJ2ZScgZXhw bGljaXRseSwgeW91IGNhbg0KICByZW1vdmUgdGhlbSBzYWZlbHkgKHRoZXkgd2VyZSB0aGUgZGVm YXVsdCkNCiAg4oCiIGlmIHlvdSB1c2VkIGFub3RoZXIgdmFsdWUgZm9yIG9uZSBvZiB0aGVzZSBv cHRpb25zIChzdWNoIGFzDQogICAgYGVzY2FwZS1zdHJpbmdzPWhleGFkZWNpbWFsJyksIHlvdSB3 aWxsIG5lZWQgdG8gcmVtb3ZlIHRoZW0gYXMNCiAgICB3ZWxsLiBUaGlzIHdpbGwgbm90IHRyaWdn ZXIgYSBkaWZmLCBidXQgb2NhbWxmb3JtYXQgd2lsbCBub3QgZW5mb3JjZQ0KICAgIGEgcGFydGlj dWxhciBjb25jcmV0ZSBzeW50YXggZm9yIG5ldyBjb2RlLg0KDQoNCkEgbm90ZSBmb3IgbmV3IHVz ZXJzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYwNCg0KICBXZSBlbmNvdXJhZ2UgeW91IHRvIHRyeSBvY2FtbGZvcm1hdCwgdGhhdCBj YW4gYmUgaW5zdGFsbGVkIGZyb20gb3BhbQ0KICBkaXJlY3RseSAoYG9wYW0gaW5zdGFsbCBvY2Ft bGZvcm1hdCcpLCBidXQgcGxlYXNlIHJlbWVtYmVyIHRoYXQgaXQgaXMNCiAgc3RpbGwgYmV0YSBz b2Z0d2FyZS4gV2UgYWRkZWQgYSBbRkFRIGZvciBuZXcgdXNlcnNdIHRoYXQgc2hvdWxkIGhlbHAN CiAgeW91IGRlY2lkZSBpZiBvY2FtbGZvcm1hdCBpcyB0aGUgcmlnaHQgY2hvaWNlIGZvciB5b3Uu DQoNCg0KW0ZBUSBmb3IgbmV3IHVzZXJzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgv b2NhbWxmb3JtYXQjZmFxLWZvci1uZXctdXNlcnM+DQoNCg0KRXRpZW5uZSBNaWxsb24gbGF0ZXIg YWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoaXMgdXBncmFkZSBpcyBsaWtlbHkg dG8gZ2VuZXJhdGUgYSBodWdlIGRpZmYgb24gcHJvamVjdHMgdGhhdCB1c2UNCiAgdGhlIGRlZmF1 bHQgcHJvZmlsZSwgc28gSSB3b3VsZCBsaWtlIHRvIGV4cGFuZCBhIGJpdCBvbiB0aGUgcmVhc29u Lg0KDQogIEFjY29yZGluZyB0byBbdGhlIHN5bnRheCBydWxlcyB1c2VkIGJ5IHRoZSBvY2FtbCB0 b29sc10gKHRoZSBvY2FtbA0KICBjb21waWxlcnMsIG9jYW1sZG9jLCBvZG9jKSwgaXQgaXMgYWx3 YXlzIHBvc3NpYmxlIHRvIHB1dCB0aGUNCiAgZG9jLWNvbW1lbnQgYmVmb3JlIGFuIGl0ZW0uDQoN CiAgU29tZSB0ZWFtcyBwcmVmZXIgdG8gcHV0IHRoZSBkb2N1bWVudGF0aW9uIGFmdGVyLiBCdXQg dGhhdCBpcyBub3QNCiAgYWx3YXlzIHBvc3NpYmxlLiBGb3IgZXhhbXBsZSwgYHR5cGUgdCA9IEEg fCBCICgqKiBkb2MgKiknIHdpbGwgYXR0YWNoDQogIHRoZSBkb2MtY29tbWVudCB0byBgQicsIG5v dCB0byBgdCcuIFRoZSBvbmx5IHdheSB0byBhdHRhY2ggdGhlIGNvbW1lbnQNCiAgdG8gYHQnIGlz IGJ5IHB1dHRpbmcgdGhlIGNvbW1lbnQgYmVmb3JlLg0KDQogIEVudGVyIG9jYW1sZm9ybWF0OiBk b2MtY29tbWVudCBwbGFjZW1lbnQgaXMgY29udHJvbGxlZCBieSBhbiBvcHRpb24NCiAgd2l0aCB0 d28gdmFsdWVzLCBgYmVmb3JlJyBvciBgYWZ0ZXInLiBgYmVmb3JlJyB3aWxsIGFsd2F5cyBwbGFj ZSB0aGUNCiAgY29tbWVudCBiZWZvcmUuIGBhZnRlcicgZGV0ZXJtaW5lcyBpZiBpdCBpcyBwb3Nz aWJsZSB0byBwdXQgdGhlDQogIGNvbW1lbnQgYWZ0ZXIsIGFuZCBpZiBpdCBpcyBub3QsIHdpbGwg cHV0IGl0IGJlZm9yZS4NCg0KICBTb21lIGl0ZW1zIGNhbm5vdCBoYXZlIGNvbW1lbnRzIGFmdGVy LCBsaWtlIHZhcmlhbnQgdHlwZXMgKGFzDQogIGRlc2NyaWJlZCBhYm92ZSkuIEJ1dCB0aGVyZSBp cyBhbm90aGVyIHJlYXNvbiBub3QgdG8gcHV0IGNvbW1lbnRzDQogIGFmdGVyLiBJbiBzb21lIGNh c2VzLCB0aGF0IGNhbiBwdXQgdGhlIGNvbW1lbnQgZmFyIGZyb20gdGhlIHRoaW5nIGl0DQogIGlz IGRvY3VtZW50aW5nLiBDb25zaWRlcmluZyBtb2R1bGVzLCB0aGUgZm9sbG93aW5nIGlzIG5pY2U6 DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1bGUgTSA9IEwuTQ0KICDilIIgKCoqIGRv YyAqKQ0KICDilJTilIDilIDilIDilIANCg0KICBCdXQgdGhpcyBpcyBub3QgZ3JlYXQgaXMgdGhl IHN0cnVjdHVyZSBpcyBsYXJnZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG1vZHVsZSBN ID0gc3RydWN0DQogIOKUgiAgIC4uLg0KICDilIIgICAuLi4NCiAg4pSCIGVuZA0KICDilIIgKCoq IGRvYyAqKQ0KICDilJTilIDilIDilIDilIANCg0KICBUbyBzdW1tYXJpemUsIHdoZW4gb2NhbWxm b3JtYXQgaXMgY29uZmlndXJlZCB0byBwdXQgY29tbWVudHMgYWZ0ZXIsIGl0DQogIGhhcyB0byBm b2xsb3cgYSBjb21wbGV4IGhldXJpc3RpYyB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBoYXMgdG8N CiAgZmFsbGJhY2sgdG8gYmVmb3JlLiBJbiB0aGUgY2FzZSBvZiBhIG1vZHVsZSwgaXQgZGVwZW5k cyBvbiBpdHMgc2hhcGUsDQogIGhvdyBtYW55IGZ1bmN0b3IgYXJndW1lbnRzIGFyZSB0aGVyZSwg dGhpcyBraW5kIG9mIHRoaW5ncyAoZm9yIHZhcmlvdXMNCiAgcmVhc29ucywgd2UgZG9uJ3Qga25v dyBob3cgbGFyZ2Ugc29tZXRoaW5nIGlzIGdvaW5nIHRvIGJlIGluIGFkdmFuY2UsDQogIHNvIHdl IGhhdmUgdG8gbG9vayBhdCBpdHMgc2hhcGUpLiBUaGUgcG9pbnQgaXMgdGhhdCBpdCBpcyBjb21w bGljYXRlZA0KICB0byB1bmRlcnN0YW5kIGFuZCBleHBsYWluLCBhbmQgdGhhdCBmaXhpbmcgaXQg YWx3YXlzIG1ha2VzIGl0IG1vcmUNCiAgY29tcGxleC4gQW5vdGhlciBhc3BlY3QgaXMgdGhhdCBp biB0aGUgZW5kLCB3ZSB3YW50IG9jYW1sZm9ybWF0IHRvIGJlDQogIHByZXR0eSBzdGFibGUgd2hl biBpdCByZWFjaGVzIDEuMC4wLCBhbmQgY29tcGxleCBydWxlcyBhcmUgYXQgb2Rkcw0KICB3aXRo IHRoaXMgZ29hbC4NCg0KICBTbywgd2UgaGF2ZSBkZWNpZGVkIHRvIHNpbXBsaWZ5IHRoZSBydWxl OiBpbnN0ZWFkIG9mIGxvb2tpbmcgZGVlcCBpbg0KICB0aGUgQVNULCB3ZSBqdXN0IGxvb2sgYXQg dGhlIGtpbmQgb2YgaXRlbSB0aGlzIGlzLiBGb3IgYHZhbCcgYW5kDQogIGBleHRlcm5hbCcgaXRl bXMsIGl0IGlzIGFsd2F5cyBwb3NzaWJsZSB0byBwdXQgdGhlIGRvYy1jb21tZW50IGFmdGVyLA0K ICBzbyB3ZSBmb2xsb3cgZXhhY3RseSB3aGF0IHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbiBzYXlz Lg0KDQogIEFzIGEgdXNlciBvZiB0aGUgZGVmYXVsdCBwcm9maWxlLCB3aGF0IHRoaXMgbWVhbnMg Zm9yIHlvdTogZm9yIGl0ZW1zDQogIHRoYXQgYXJlIG5vdCBgdmFsJyBvciBgZXh0ZXJuYWwnLCBh bmQgY29uc2lkZXJlZCAic2ltcGxlIiBieSB0aGUNCiAgMC4xMy4wIGhldXJpc3RpYywgZG9jLWNv bW1lbnRzIGFyZSBnb2luZyB0byBtb3ZlIGZyb20gYWZ0ZXIgdG8gYmVmb3JlLg0KDQogIEJhc2Vk IG9uIHRoZXNlIHJlYXNvbnMsIHlvdSB3aWxsIHVuZGVyc3RhbmQgdGhhdCBgYmVmb3JlJyBpcyBh bHdheXMNCiAgc2ltcGxlci4gWW91IGNhbiBvcHQgaW50byB0aGlzIGJ5IHNldHRpbmcNCiAgYGRv Yy1jb21tZW50cy12YWw9YmVmb3JlJy4gVGhpcyB3aWxsIGNhdXNlIGFuIGV2ZW4gbGFyZ2VyIGRp ZmYgYXMgYWxsDQogIGl0ZW1zIGFyZSBnb2luZyB0byBtb3ZlIGJlZm9yZSAodGhhdCBpczogYWxs IGl0ZW1zIGRlc2NyaWJlZCBqdXN0DQogIGFib3ZlLCBwbHVzIGB2YWwnIGFuZCBgZXh0ZXJuYWwn IGl0ZW1zKSwgYnV0IHRoZSBydWxlIGdldHMgZXh0cmVtZWx5DQogIHNpbXBsZSAoZXZlcnl0aGlu ZyBpcyBwdXQgYmVmb3JlKS4gSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIG9wdGlvbg0KICB3aWxs IGJlY29tZSB0aGUgZGVmYXVsdCBpbiB0aGUgZnV0dXJlLCBidXQgd2UgaGF2ZSBub3QgZGVjaWRl ZCB0aGlzDQogIHlldCAoaW4gdGhpcyBjYXNlLCBpZiB5b3UgZGlkIG5vdCBvcHQgaW50byBpdCwg eW91IHdpbGwgc2VlIGNvbW1lbnRzDQogIG9uIGB2YWwnIGFuZCBgZXh0ZXJuYWwnIGl0ZW1zIG1v dmUgYXQgdGhhdCB0aW1lKS4NCg0KDQpbdGhlIHN5bnRheCBydWxlcyB1c2VkIGJ5IHRoZSBvY2Ft bCB0b29sc10NCjxodHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL29j YW1sZG9jLmh0bWwjc3M6b2NhbWxkb2MtcGxhY2VtZW50Pg0KDQoNCk1MIEZhbWlseSBXb3Jrc2hv cCAyMDIwOiBDYWxsIGZvciBwcmVzZW50YXRpb25zDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L21sLWZhbWls eS13b3Jrc2hvcC0yMDIwLWNhbGwtZm9yLXByZXNlbnRhdGlvbnMvNTQ0MS8xPg0KDQoNCkxlbyBX aGl0ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlIGFyZSBoYXBweSB0byBpbnZpdGUgc3VibWlzc2lvbnMg dG8gdGhlIE1MIEZhbWlseSBXb3Jrc2hvcCAyMDIwLCB0bw0KICBiZSBoZWxkIGR1cmluZyB0aGUg SUNGUCBjb25mZXJlbmNlIHdlZWsgb24gVGh1cnNkYXksIEF1Z3VzdCAyN3RoLg0KDQogIFRoZSBN TCBmYW1pbHkgd29ya3Nob3Agd2FybWx5IHdlbGNvbWVzIHN1Ym1pc3Npb24gdG91Y2hpbmcgb24g dGhlDQogIHByb2dyYW1taW5nIGxhbmd1YWdlcyB0cmFkaXRpb25hbGx5IHNlZW4gYXMgcGFydCBv ZiB0aGUgIk1MIGZhbWlseSINCiAgKFN0YW5kYXJkIE1MLCBPQ2FtbCwgRiMsIENha2VNTCwgU01M IywgTWFudGljb3JlLCBNZXRhT0NhbWwsDQogIGV0Yy4pLiBUaGUgc2NvcGUgb2YgdGhlIHdvcmtz aG9wIGluY2x1ZGVzIGFsbCBhc3BlY3RzIG9mIHRoZSBkZXNpZ24sDQogIHNlbWFudGljcywgdGhl b3J5LCBhcHBsaWNhdGlvbiwgaW1wbGVtZW50YXRpb24sIGFuZCB0ZWFjaGluZyBvZiB0aGUNCiAg bWVtYmVycyBvZiB0aGUgTUwgZmFtaWx5LiBXZSBhbHNvIGVuY291cmFnZSBwcmVzZW50YXRpb25z IGZyb20gcmVsYXRlZA0KICBsYW5ndWFnZXMgKHN1Y2ggYXMgSGFza2VsbCwgU2NhbGEsIFJ1c3Qs IE5lbWVybGUsIExpbmtzLCBLb2thLCBGKiwNCiAgRWZmLCBBVFMsIGV0YyksIHRvIGV4Y2hhbmdl IGV4cGVyaWVuY2Ugb2YgZnVydGhlciBkZXZlbG9waW5nIE1MIGlkZWFzLg0KDQogIEN1cnJlbnRs eSwgdGhlIHdvcmtzaG9wIGlzIHN0aWxsIHNjaGVkdWxlZCB0byBnbyBhaGVhZCBhcyBwbGFubmVk IGluDQogIEplcnNleSBDaXR5LCBob3dldmVyIGl0IGlzIGxpa2VseSB0aGF0IHRoZSBNTCB3b3Jr c2hvcCB3aWxsIGVuZCB1cA0KICBiZWluZyBhIHZpcnR1YWwgd29ya3Nob3AgdGhpcyB5ZWFyLiBF aXRoZXIgd2F5IHByb3Zpc2lvbnMgd2lsbCBiZSBtYWRlDQogIHRvIGFsbG93IHNwZWFrZXJzIHRv IHByZXNlbnQgdGhlaXIgd29yayByZW1vdGVseS4NCg0KICBTZWUgb3VyIGRldGFpbGVkIENGUCBv bmxpbmUgb24gdGhlIElDRlAgd2Vic2l0ZToNCg0KICA8aHR0cHM6Ly9pY2ZwMjAuc2lncGxhbi5v cmcvaG9tZS9tbGZhbWlseXdvcmtzaG9wLTIwMjA+DQoNCg0KSW1wb3J0YW50IGRhdGVzDQrilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgRnJpZGF5 IDE1dGggTWF5IChhbnkgdGltZSB6b25lKTogQWJzdHJhY3Qgc3VibWlzc2lvbiBkZWFkbGluZQ0K ICDigKIgRnJpZGF5IDI2dGggSnVuZTogQXV0aG9yIG5vdGlmaWNhdGlvbg0KICDigKIgVGh1cnNk YXkgMjd0aCBBdWd1c3Q6IE1MIEZhbWlseSBXb3Jrc2hvcA0KDQoNClByb2dyYW0gY29tbWl0dGVl DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K ICDigKIgWW91eW91IENvbmcgKFRva3lvIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5KQ0KICDigKIg R293dGhhbSBLYWtpIChQdXJkdWUgVW5pdmVyc2l0eSkNCiAg4oCiIE5lZWwgS3Jpc2huYXN3YW1p IChVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSkNCiAg4oCiIERhYW4gTGVpamVuIChNaWNyb3NvZnQg UmVzZWFyY2gpDQogIOKAoiBLb2tvIE11cm95YSAoS3lvdG8gVW5pdmVyc2l0eSkNCiAg4oCiIEF0 c3VzaGkgT2hvcmkgKFRvaG9rdSBVbml2ZXJzaXR5KQ0KICDigKIgSm9uYXRoYW4gUHJvdHplbmtv IChNaWNyb3NvZnQgUmVzZWFyY2gpDQogIOKAoiBHYWJyaWVsIFJhZGFubmUgKElOUklBKQ0KICDi gKIgQ2xhdWRpbyBSdXNzbyAoRGZpbml0eSkNCiAg4oCiIExlbyBXaGl0ZSAoSmFuZSBTdHJlZXQp IChDaGFpcikNCiAg4oCiIEplcmVteSBZYWxsb3AgKFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlKQ0K DQoNClN1Ym1pc3Npb24gZGV0YWlscw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgU2VlIHRoZSBvbmxpbmUgQ0ZQIGZvciB0aGUgZGV0 YWlscyBvbiB0aGUgZXhwZWN0ZWQgc3VibWlzc2lvbiBmb3JtYXQuDQoNCiAgU3VibWlzc2lvbnMg bXVzdCBiZSB1cGxvYWRlZCB0byB0aGUgd29ya3Nob3Agc3VibWlzc2lvbiB3ZWJzaXRlDQoNCiAg PGh0dHBzOi8vbWwyMDIwLmhvdGNycC5jb20vPg0KDQogIGJlZm9yZSB0aGUgc3VibWlzc2lvbiBk ZWFkbGluZS4NCg0KDQpBbm5vdW5jaW5nIFNlaywgYW4gZWZmaWNpZW50IGltcGxlbWVudGF0aW9u IG9mIHNlcXVlbmNlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm5vdW5jaW5nLXNlay1hbi1lZmZpY2llbnQtaW1wbGVtZW50YXRpb24tb2Ytc2VxdWVuY2Vz LzU0NDIvMT4NCg0KDQpGcmFuw6dvaXMgUG90dGllciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIFdlIGFyZSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxlYXNl IG9mIFNlaywgYW4gT0NhbWwgbGlicmFyeQ0KICB0aGF0IG9mZmVycyBhbiBlZmZpY2llbnQgaW1w bGVtZW50YXRpb24gb2Ygc2VxdWVuY2VzLg0KDQogIFRoZSBsaWJyYXJ5IG9mZmVycyBib3RoIGVw aGVtZXJhbCAobXV0YWJsZSkgc2VxdWVuY2VzIGFuZCBwZXJzaXN0ZW50DQogIChpbW11dGFibGUp IHNlcXVlbmNlcywgYW5kIG9mZmVycyBjb25zdGFudC10aW1lIGNvbnZlcnNpb25zIGJldHdlZW4N CiAgdGhlc2UgZmxhdm9ycy4NCg0KICBJdCBzdXBwb3J0cyBhbGwgb2YgdGhlIHN0YW5kYXJkIG9w ZXJhdGlvbnMgb24gc3RhY2tzLCBxdWV1ZXMsIGRlcXVlcw0KICAoZS5nLiAgcHVzaCwgcG9wIGF0 IGVpdGhlciBlbmQpLCBjYXRlbmFibGUgc2VxdWVuY2VzIChjb25jYXQsIHNwbGl0KSwNCiAgYW5k IHJhbmRvbSBhY2Nlc3Mgc2VxdWVuY2VzIChnZXQsIHNldCkuDQoNCiAgRGF0YSBpcyBzdG9yZWQg aW50ZXJuYWxseSBpbiBjaHVua3MgKGZpeGVkLWNhcGFjaXR5IGFycmF5cyksIHdoaWNoIGlzDQog IHdoeSB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIGtub3duIGFzIGEgY2h1bksgU0VxdWVuY2UuDQoN CiAgSXQgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZSBleGNlbGxlbnQgdGltZSBjb21wbGV4aXR5IGFu ZCBtZW1vcnkgdXNhZ2UuDQoNCiAgVGhpcyBpcyBhbiBpbml0aWFsIHJlbGVhc2UuIFRoZSBsaWJy YXJ5IGhhcyBub3QgYmVlbiB0ZXN0ZWQgaW4NCiAgcHJvZHVjdGlvbiwgYnV0IGhhcyByZWNlaXZl ZCBleHRlbnNpdmUgdW5pdCB0ZXN0aW5nLCB2aWEgYWZsLWZ1enogYW5kDQogIG9jYW1sK2FmbCDi gJMgd2hpY2ggYXJlIHJlbWFya2FibHkgZWZmZWN0aXZlIHRvb2xzLCBieSB0aGUgd2F5IQ0KDQog IFRoaXMgaXMgd29yayBpbiBwcm9ncmVzczsgbW9yZSBmZWF0dXJlcywgc3VjaCBhcyBpdGVyYXRv cnMsIHdpbGwgYmUNCiAgYWRkZWQgaW4gdGhlIGZ1dHVyZS4NCg0KICBUbyBpbnN0YWxsIFNlaywg anVzdCB0eXBlDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZSAmJiBvcGFt IGluc3RhbGwgc2VrDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIERvY3VtZW50YXRpb24gaXMgW29u bGluZV0uDQoNCiAgRmVlZGJhY2sgaXMgd2VsY29tZSENCg0KICBBcnRodXIgQ2hhcmd1w6lyYXVk DQogIEZyYW7Dp29pcyBQb3R0aWVyDQogIHdpdGggY29udHJpYnV0aW9ucyBieSDDiW1pbGllIEd1 ZXJtZXVyDQoNCg0KW29ubGluZV0gPGh0dHA6Ly9jYW1iaXVtLmlucmlhLmZyL35mcG90dGllci9z ZWsvZG9jL3Nlay9TZWsvaW5kZXguaHRtbD4NCg0KDQpZYXJvbiBNaW5za3kgYXNrZWQgYW5kIEZh YmlhbiByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICAgICAgICBJ4oCZbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBo b3cgaXQgY29tcGFyZXMgdG8NCiAgICAgICAgQmFzZS5TZXF1ZW5jZSBhbmQgU2VxIGluIHRoZSBP Q2FtbCBkaXN0cmlidXRpb24sIGJ1dA0KICAgICAgICBzdXJlbHkgdGhlcmUgYXJlIG90aGVycyBh cyB3ZWxsLg0KDQogIFRoaXMgYWN0dWFsbHkgbG9va3MgbGlrZSBhbiBhcnJheS92ZWN0b3Igc3Ry dWN0dXJlIChzdXBwb3J0aW5nLCBhbW9uZw0KICBvdGhlciB0aGluZ3MsIGZhc3QgYWNjZXNzIHRv IHRoZSBudGggZWxlbWVudCksIHNvIGEgY29tcGFyaXNvbiB3aXRoDQogIGBDQ1ZlY3RvcicsIGBD Q0Z1bl92ZWMnLCBgQmF0VmVjdCcsIGBDbGFyaXR5LlZlY3RvcicgZXRjLiB3b3VsZCBiZQ0KICBt b3JlIGFwcHJvcHJpYXRlLiBUaGUgbmFtZSBpcyBhIGJpdCB1bmZvcnR1bmF0ZSBjb25zaWRlcmlu ZyB0aGUgbmFtaW5nDQogIHVzZWQgaW4gdGhlIGdlbmVyYWwgZWNvc3lzdGVtLg0KDQogIFNvbWUg dGltZSBhZ28sIEkgYWRkZWQgc29tZSBjcnVkZSBiZW5jaG1hcmtzIHRvIFtjb250YWluZXJzJw0K ICBiZW5jaHN1aXRlXS4gIEknbGwgc2VlIGlmIEkgY2FuIGFkZCBTZWsgd2hlbiBJIGZpbmQgdGlt ZS4NCg0KDQpbY29udGFpbmVycycgYmVuY2hzdWl0ZV0NCjxodHRwczovL2dpdGh1Yi5jb20vYy1j dWJlL29jYW1sLWNvbnRhaW5lcnMvYmxvYi9kMzRiNzU4OGIwMjhmMzYxOGNjNDRkM2Y0YzY0MTcy OTVkYjU4NmM4L2JlbmNocy9ydW5fYmVuY2hzLm1sI0wxMTI+DQoNCg0KZ2FzY2hlIHNhaWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgdGhpbmsgaXQgcmVhbGx5IGlz IGEgc2VxdWVuY2UgbGlicmFyeSBpbiB0aGUgc2Vuc2UgdGhhdCBpbiBtYWludGFpbnMNCiAgYW4g aW4tb3JkZXIgc2VxdWVuY2Ugb2YgaXRlbXMsIGFuZCBzZXF1ZW5jZXMgY2FuIGJlIGpvaW5lZC9z cGxpdA0KICBlZmZpY2llbnRseS4gSXQgYWxzbyBwcm92aWRlcyBsb2dhcml0aG1pYyByYW5kb20g YWNjZXNzLCBidXQgdGhpcyBpcw0KICBwcm9iYWJseSBub3QgY29tcGV0aXRpdmUgd2l0aCBmaXhl ZC1zaXplIGFycmF5cy4gSXQgd291bGQgYmUNCiAgY29tcGFyYWJsZSB0byAicGVyc2lzdGVudCB2 ZWN0b3IiIGxpYnJhcmllcywgcm9wZXMsIGZpbmdlciB0cmVlcywNCiAgZXRjLiBUaGUgZmFjdCB0 aGF0IHRoZSBhdXRob3JzIGV4cG9zZSBhIFN0YWNrL1F1ZXVlIGludGVyZmFjZSBzdWdnZXN0cw0K ICB0aGF0IGl0IGhhcyBhbHNvIGJlZW4gdHVuZWQgdG8gcGVyZm9ybSByZWFzb25hYmx5IHdlbGwg aW4gdGhpcyBjYXNlLg0KDQogIEl0IGRvZXMgbm90IHByb3ZpZGUgYW55IGRlbGF5ZWQgY29tcHV0 YXRpb24gb2YgaXRlbXMsIHNvIGluIHRoYXQNCiAgcmVnYXJkIGl0IGlzIG5vdCBjb21wYXJhYmxl IHRvIFNlcXVlbmNlL1NlcS4NCg0KICBAY2hhcmd1ZXIgaGFzIGRlc2lnbmVkIHNpbWlsYXIgZGF0 YXN0cnVjdHVyZXMgaW4gdGhlIHBhc3QgdG8gcmVwcmVzZW50DQogIHRoZSB3b3JrLXF1ZXVlcyBv ZiBjb25jdXJyZW50IHdvcmtlcnMgKHlvdSB3YW50IGF0IGxlYXN0IGEgZmFzdCAicHVzaCINCiAg dG8gYWRkIGEgbmV3IHRhc2sgYW5kLCB3aGVuIGRvaW5nIHdvcmstc3RlYWxpbmcsIGhhdmluZyBh IGZhc3QgInNwbGl0Ig0KICBpcyBjb252ZW5pZW50KS4gU2VlIFtUaGVvcnkgYW5kIFByYWN0aWNl IG9mIENodW5rZWQgU2VxdWVuY2VzXSwgVW11dA0KICBBY2FyLCBBcnRodXIgQ2hhcmd1w6lyYXVk LCBNaWtlIFJhaW5leSwgMjAxNCwgYW5kIFtBIFdvcmstRWZmaWNpZW50DQogIEFsZ29yaXRobSBm b3IgUGFyYWxsZWwgVW5vcmRlcmVkIERlcHRoLUZpcnN0IFNlYXJjaF0uDQoNCiAgQXMgZmFyIGFz IEkga25vdywgdGhlIE9DYW1sIGltcGxlbWVudGF0aW9uIGp1c3QgcmVsZWFzZWQgaGFzIG5vdCBi ZWVuDQogIHRlc3RlZC9iZW5jaG1hcmtlZCBmb3IgcGFyYWxsZWwgYWxnb3JpdGhtcy4gSSB3b3Vs ZCBiZSBjdXJpb3VzIHRvIHNlZQ0KICBhbiBleHBlcmltZW50IG9mIHBhcmFsbGVsIGdyYXBoIHRy YXZlcnNhbCB3aXRoIHRoaXMgc3RydWN0dXJlIGFuZA0KICBNdWx0aWNvcmUtT0NhbWwuDQoNCg0K W1RoZW9yeSBhbmQgUHJhY3RpY2Ugb2YgQ2h1bmtlZCBTZXF1ZW5jZXNdDQo8aHR0cHM6Ly93d3cu Y2hhcmd1ZXJhdWQub3JnL3Jlc2VhcmNoLzIwMTQvY2h1bmtlZHNlcS9jaHVua2Vkc2VxLnBkZj4N Cg0KW0EgV29yay1FZmZpY2llbnQgQWxnb3JpdGhtIGZvciBQYXJhbGxlbCBVbm9yZGVyZWQgRGVw dGgtRmlyc3QgU2VhcmNoXQ0KPGh0dHBzOi8vd3d3LmNoYXJndWVyYXVkLm9yZy9yZXNlYXJjaC8y MDE1L3BkZnMvcGRmc19zYzE1LnBkZj4NCg0KDQpBbm5vdW5jaW5nIGR1bmUtZGVwczogcHJvZHVj ZXMgYSBwcm9qZWN0LWNlbnRyaWMgZGVwZW5kZW5jeSBncmFwaA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm5v dW5jaW5nLWR1bmUtZGVwcy1wcm9kdWNlcy1hLXByb2plY3QtY2VudHJpYy1kZXBlbmRlbmN5LWdy YXBoLzU0NTEvMT4NCg0KDQpNYXJ0aW4gSmFtYm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgSSdtIGhhcHB5IHRvIGFubm91bmNlIHRoZSBhdmFpbGFiaWxpdHkgb2YgW2R1bmUtZGVwc10s IGEgY29tbWFuZC1saW5lDQogIHRvb2wgdGhhdCBzY2FucyBhIGR1bmUgcHJvamVjdCBhbmQgZ2F0 aGVycyB0aGUgZGVwZW5kZW5jaWVzIGludG8gYQ0KICBncmFwaC4gVGhlIG91dHB1dCBpcyBpbiB0 aGUgZG90IGZvcm1hdCwgc3VwcG9ydGVkIGJ5IHRoZSBgZG90JyBjb21tYW5kDQogIGZyb20gW2dy YXBodml6XS4NCg0KICBJdCBzaG93cyB0aGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlIGZvbGxv d2luZzoNCg0KICDigKIgbGlicmFyaWVzIGRlZmluZWQgYnkgdGhlIHByb2plY3QsDQogIOKAoiBl eGVjdXRhYmxlcyBkZWZpbmVkIGJ5IHRoZSBwcm9qZWN0LA0KICDigKIgZGlyZWN0IGRlcGVuZGVu Y2llcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMuDQoNCiAgRGVwZW5kZW5jaWVzIGFyZSBleHRyYWN0 ZWQgYnkgcGFyc2luZyBgZHVuZScgZmlsZXMuIEFzIGFuIGV4YW1wbGUsDQogIGhlcmUncyB3aGF0 IHdlIG9idGFpbiBmb3IgdGhlIFtzb3VyY2VzIG9mIG9wYW1dLCB3aGljaCBoYXMgb3ZlciA1MEsN CiAgbGluZXMgb2YgY29kZToNCg0KICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0 YW5kYXJkMTEvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC9mL2Y2MjEzZmE3ZmRhNTI1MjFjNjc4 Mjk4ODE1NWFiMjNiOTk3ZGFmYjgucG5nPg0KDQogIFRoZSBjb21tYW5kcyBmb3IgdGhpcyBhcmU6 DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgIyBvYnRhaW4gdGhlIHByb2plY3QncyBzb3VyY2Vz DQogIOKUgiAkIGdpdCBjbG9uZSAtLWRlcHRoPTEgaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29w YW0uZ2l0DQogIOKUgg0KICDilIIgIyBleHRyYWN0IGRlcGVuZGVuY2llcyBhbmQgZWxpbWluYXRl IHN1cGVyZmx1b3VzIGdyYXBoIGVkZ2VzDQogIOKUgiAkIGR1bmUtZGVwcyBvcGFtIHwgdHJlZCA+ IGRlcHMuZG90DQogIOKUgg0KICDilIIgIyByZW5kZXIgdGhlIGdyYXBoDQogIOKUgiAkIGRvdCAt VHBuZyBkZXBzLmRvdCAtbyBkZXBzLnBuZw0KICDilJTilIDilIDilIDilIANCg0KICBBIHN1Z2dl c3Rpb24gaXMgdG8gaW5jbHVkZSBzdWNoIGdyYXBoIGluIHlvdXIgcHJvamVjdCdzIGBSRUFETUUu bWQnLg0KDQoNCltkdW5lLWRlcHNdIDxodHRwczovL2dpdGh1Yi5jb20vbWphbWJvbi9kdW5lLWRl cHM+DQoNCltncmFwaHZpel0gPGh0dHBzOi8vd3d3LmdyYXBodml6Lm9yZy8+DQoNCltzb3VyY2Vz IG9mIG9wYW1dIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbT4NCg0KDQpPQ2FtbCBVc2Vy cyBhbmQgRGV2ZWxvcGVycyBNZWV0aW5nIDIwMjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtdXNlcnMtYW5kLWRldmVsb3BlcnMtbWVldGlu Zy0yMDIwLzU0NTQvMT4NCg0KDQpJdmFuIEdvdG92Y2hpdHMgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBJdCBpcyBteSBwbGVhc3VyZSB0byBpbnZpdGUgc3VibWlzc2lvbnMgdG8g dGhlIE9DYW1sIFVzZXJzIGFuZA0KICBEZXZlbG9wZXJzIFdvcmtzaG9wIDIwMjAsIHdoaWNoIGlz IGFnYWluIGNvLWxvY2F0ZWQgd2l0aCBJQ0ZQIGFuZCB3aWxsDQogIGJlIGhlbGQgb24gRnJpZGF5 IDI4dGggQXVndXN0IDIwMjAgaW4gSmVyc2V5IENpdHksIE5KLCBVU0EuDQoNCiAgVGhlIE9DYW1s IFVzZXJzIGFuZCBEZXZlbG9wZXJzIFdvcmtzaG9wIGJyaW5ncyB0b2dldGhlciB0aGUgT0NhbWwN CiAgY29tbXVuaXR5LCBpbmNsdWRpbmcgdXNlcnMgb2YgT0NhbWwgaW4gaW5kdXN0cnksIGFjYWRl bWlhLCBob2JieWlzdHMNCiAgYW5kIHRoZSBmcmVlIHNvZnR3YXJlIGNvbW11bml0eS4gUHJldmlv dXMgZWRpdGlvbnMgaGF2ZSBiZWVuDQogIGNvLWxvY2F0ZWQgd2l0aCBJQ0ZQIHNpbmNlIDIwMTIg aW4gQ29wZW5oYWdlbiwgQm9zdG9uLCBHb3RoZW5idXJnLA0KICBOYXJhLCBPeGZvcmQsIFN0IExv dWlzIGFuZCBsYXN0IHllYXIgaW4gQmVybGluLCBmb2xsb3dpbmcgT0NhbWwNCiAgTWVldGluZ3Mg aW4gUGFyaXMgaW4gMjAxMCBhbmQgMjAxMS4NCg0KDQpJbXBvcnRhbnQgTGlua3MNCuKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiA8aHR0cHM6Ly9v Y2FtbC5vcmcvbWVldGluZ3Mvb2NhbWwvMjAyMC8+DQogIOKAoiA8aHR0cHM6Ly9pY2ZwMjAuc2ln cGxhbi5vcmcvaG9tZS9vY2FtbC0yMDIwPg0KICDigKIgPGh0dHBzOi8vb2NhbWwyMDIwLmhvdGNy cC5jb20vPg0KDQoNCkltcG9ydGFudCBEYXRlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIFRhbGsgcHJvcG9zYWwgc3VibWlzc2lvbiBkZWFk bGluZTogTWF5IDh0aCwgMjAyMCwgQW9FDQogIOKAoiBBdXRob3IgTm90aWZpY2F0aW9uOiBKdW5l IDI2dGgsIDIwMjANCiAg4oCiIE9DYW1sIFdvcmtzaG9wOiBBdWd1c3QgMjh0aCwgMjAyMA0KDQoN ClNjb3BlDQrilYzilYzilYzilYzilYwNCg0KICBQcmVzZW50YXRpb25zIGFuZCBkaXNjdXNzaW9u cyBmb2N1cyBvbiB0aGUgT0NhbWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UNCiAgYW5kIGl0cyBjb21t dW5pdHkuIFdlIGFpbSB0byBzb2xpY2l0IHRhbGtzIG9uIGFsbCBhc3BlY3RzIHJlbGF0ZWQgdG8N CiAgaW1wcm92aW5nIHRoZSB1c2Ugb3IgZGV2ZWxvcG1lbnQgb2YgdGhlIGxhbmd1YWdlIGFuZCBp dHMgcHJvZ3JhbW1pbmcNCiAgZW52aXJvbm1lbnQsIGluY2x1ZGluZywgZm9yIGV4YW1wbGUgKGJ1 dCBub3QgbGltaXRlZCB0byk6DQoNCiAg4oCiIGNvbXBpbGVyIGRldmVsb3BtZW50cywgbmV3IGJh Y2tlbmRzLCBydW50aW1lIGFuZCBhcmNoaXRlY3R1cmVzDQoNCiAg4oCiIHByYWN0aWNhbCB0eXBl IHN5c3RlbSBpbXByb3ZlbWVudHMsIHN1Y2ggYXMgR0FEVHMsIGZpcnN0LWNsYXNzDQogICAgbW9k dWxlcywgZ2VuZXJpYyBwcm9ncmFtbWluZywgb3IgZGVwZW5kZW50IHR5cGVzDQoNCiAg4oCiIG5l dyBsaWJyYXJ5IG9yIGFwcGxpY2F0aW9uIHJlbGVhc2VzLCBhbmQgdGhlaXIgZGVzaWduIHJhdGlv bmFsZXMNCg0KICDigKIgdG9vbHMgYW5kIGluZnJhc3RydWN0dXJlIHNlcnZpY2VzLCBhbmQgdGhl aXIgZW5oYW5jZW1lbnRzDQoNCiAg4oCiIHByb21pbmVudCBpbmR1c3RyaWFsIG9yIGV4cGVyaW1l bnRhbCB1c2VzIG9mIE9DYW1sLCBvciBkZXBsb3ltZW50cw0KICAgIGluIHVudXN1YWwgc2l0dWF0 aW9ucy4NCg0KDQpQcmVzZW50YXRpb25zDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYwNCg0KICBUaGUgd29ya3Nob3AgaXMgYW4gaW5mb3JtYWwgbWVldGluZyB3aXRoIG5v IGZvcm1hbCBwcm9jZWVkaW5ncy4gVGhlDQogIHByZXNlbnRhdGlvbiBtYXRlcmlhbCB3aWxsIGJl IGF2YWlsYWJsZSBvbmxpbmUgZnJvbSB0aGUgd29ya3Nob3ANCiAgaG9tZXBhZ2UuIFRoZSBwcmVz ZW50YXRpb25zIG1heSBiZSByZWNvcmRlZCBhbmQgbWFkZSBhdmFpbGFibGUgYXQgYQ0KICBsYXRl ciBkYXRlLg0KDQogIFRoZSBtYWluIHByZXNlbnRhdGlvbiBmb3JtYXQgaXMgYSB3b3Jrc2hvcCB0 YWxrLCB0cmFkaXRpb25hbGx5IGFyb3VuZA0KICAyMCBtaW51dGVzIGluIGxlbmd0aCwgcGx1cyBx dWVzdGlvbiB0aW1lLCBidXQgd2UgYWxzbyBoYXZlIGEgcG9zdGVyDQogIHNlc3Npb24gZHVyaW5n IHRoZSB3b3Jrc2hvcCDigJMgdGhpcyBhbGxvd3MgdG8gcHJlc2VudCBtb3JlIGRpdmVyc2UNCiAg d29yaywgYW5kIGdpdmVzIHRpbWUgZm9yIGRpc2N1c3Npb24uIFRoZSBwcm9ncmFtIGNvbW1pdHRl ZSB3aWxsIGRlY2lkZQ0KICB3aGljaCBwcmVzZW50YXRpb25zIHNob3VsZCBiZSBkZWxpdmVyZWQg YXMgcG9zdGVycyBvciB0YWxrcy4NCg0KDQpTdWJtaXNzaW9uDQrilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYwNCg0KICBUbyBzdWJtaXQgYSBwcmVzZW50YXRpb24sIHBsZWFzZSByZWdpc3Rl ciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWxrDQogIChhYm91dCAyIHBhZ2VzIGxvbmcpIGF0DQoN CiAgPGh0dHBzOi8vb2NhbWwyMDIwLmhvdGNycC5jb20vPg0KDQogIHByb3ZpZGluZyBhIGNsZWFy IHN0YXRlbWVudCBvZiB3aGF0IHdpbGwgYmUgcHJvdmlkZWQgYnkgdGhlDQogIHByZXNlbnRhdGlv bjogdGhlIHByb2JsZW1zIHRoYXQgYXJlIGFkZHJlc3NlZCwgdGhlIHNvbHV0aW9ucyBvcg0KICBt ZXRob2RzIHRoYXQgYXJlIHByb3Bvc2VkLg0KDQogIExhVGVYLXByb2R1Y2VkIFBERnMgYXJlIGEg Y29tbW9uIGFuZCB3ZWxjb21lIHN1Ym1pc3Npb24gZm9ybWF0LiBGb3INCiAgYWNjZXNzaWJpbGl0 eSBwdXJwb3Nlcywgd2UgYXNrIFBERiBzdWJtaXR0ZXJzIHRvIGFsc28gcHJvdmlkZSB0aGUNCiAg c291cmNlcyBvZiB0aGVpciBzdWJtaXNzaW9uIGluIGEgdGV4dHVhbCBmb3JtYXQsIHN1Y2ggYXMg LnRleA0KICBzb3VyY2VzLiBSZXZpZXdlcnMgbWF5IHJlYWQgZWl0aGVyIHRoZSBzdWJtaXR0ZWQg UERGIG9yIHRoZSB0ZXh0DQogIHZlcnNpb24uDQoNCg0KTUwgZmFtaWx5IHdvcmtzaG9wDQrilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBU aGUgTUwgZmFtaWx5IHdvcmtzaG9wLCBoZWxkIG9uIHRoZSBwcmV2aW91cyBkYXksIGRlYWxzIHdp dGggZ2VuZXJhbA0KICBpc3N1ZXMgb2YgdGhlIE1MLXN0eWxlIHByb2dyYW1taW5nIGFuZCB0eXBl IHN5c3RlbXMsIGZvY3VzZXMgb24gbW9yZQ0KICByZXNlYXJjaC1vcmllbnRlZCB3b3JrIHRoYXQg aXMgbGVzcyBzcGVjaWZpYyB0byBhIGxhbmd1YWdlIGluDQogIHBhcnRpY3VsYXIuIFRoZXJlIGlz IGFuIG92ZXJsYXAgYmV0d2VlbiB0aGUgdHdvIHdvcmtzaG9wcywgYW5kIHdlIGhhdmUNCiAgb2Nj YXNpb25hbGx5IHRyYW5zZmVycmVkIHByZXNlbnRhdGlvbnMgZnJvbSBvbmUgdG8gdGhlIG90aGVy IGluIHRoZQ0KICBwYXN0LiBBdXRob3JzIHdobyBmZWVsIHRoZWlyIHN1Ym1pc3Npb24gZml0cyBi b3RoIHdvcmtzaG9wcyBhcmUNCiAgZW5jb3VyYWdlZCB0byBtZW50aW9uIGl0IGF0IHN1Ym1pc3Np b24gdGltZSBhbmQvb3IgY29udGFjdCB0aGUgUHJvZ3JhbQ0KICBDaGFpcnMuDQoNCg0KUHJvZ3Jh bSBDb21taXR0ZWUNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIOKAoiBJdmFuIEdvdG92Y2hpdHMsIENNVSwgVVNBDQogIOKAoiBGbG9yaWFu IEFuZ2VsZXR0aSwgSU5SSUEsIEZyYW5jZQ0KICDigKIgQ2hyaXMgQ2FzaW5naGlubywgRHJhcGVy IExhYm9yYXRvcnksIFVTQQ0KICDigKIgQ2F0aGVyaW5lIEdhc25pZXIsIEZhY2Vib29rLCBVU0EN CiAg4oCiIFJ1ZGkgR3JpbmJlcmcsIE9DYW1sIExhYnMsIFVLDQogIOKAoiBPbGVnIEtpc2VseW92 LCBUb2hva3UgVW5pdmVyc2l0eSwgSmFwYW4NCiAg4oCiIEFuZHJlYXMgUm9zc2JlcmcsIERmaW5p dHkgU3RpZnR1bmcsIEdlcm1hbnkNCiAg4oCiIE1hcmNlbGxvIFNlcmksIFVuaXZlcnNpdHkgb2Yg R3JvbmluZ2VuLCBOZXRoZXJsYW5kcw0KICDigKIgRWR3aW4gVG9yb2ssIENpdHJpeCwgVUsNCiAg 4oCiIExlbyBXaGl0ZSwgSmFuZSBTdHJlZXQsIFVTQQ0KICDigKIgR3JldGEgWW9yc2gsIEphbmUg U3RyZWV0LCBVU0ENCiAg4oCiIFNhcmFoIFplbm5vdSwgQWlyYnVzLCBGcmFuY2UNCg0KDQpDT1ZJ RC0xOSBOb3RpY2UNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIFdoaWxlIElDRlAtMjAgW2lzIHN0aWxsIHNjaGVkdWxlZCB0byBiZSBoZWxkIGFzIHBs YW5uZWRdLCBjaGFuY2VzIGFyZQ0KICBoaWdoIHRoYXQgaXQgd2lsbCBiZSB0dXJuZWQgaW50byBh IHZpcnR1YWwgY29uZmVyZW5jZS4gV2hpY2ggbWVhbnMgYQ0KICB3aWRlciBhdWRpZW5jZSBhbmQg cmVkdWNlZCAoaG9wZWZ1bGx5KSBmZWVzLiBXZSB3aWxsIGtlZXAgeW91IHBvc3RlZC4NCg0KDQpb aXMgc3RpbGwgc2NoZWR1bGVkIHRvIGJlIGhlbGQgYXMgcGxhbm5lZF0NCjxodHRwczovL2ljZnAy MC5zaWdwbGFuLm9yZy9ob21lL2ljZnAtMjAyMD4NCg0KDQpRdWVzdGlvbnMgYW5kIGNvbnRhY3QN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIFBsZWFzZSBzZW5kIGFueSBxdWVzdGlvbnMgdG8gdGhlIGNoYWlyOiBJdmFu IEdvdG92Y2hpdHMgKGl2Z0BpZWVlLm9yZykNCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDi lZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUg YSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sg YXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoN CiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91 IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2Vu ZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0K DQpbdGhlIGFyY2hpdmVdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JT UyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24v Y3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2Ft bC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvPg0KDQo= --=-=-= 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 March 31 to April 07,= 2020.

Making a music player in OCaml

Dracose asked

I'm interested in making my own music player in OCaml so I wanted to know whether there were any existing ones and/or examples of how to make one. Be= ar in mind, I am interested in the actual logic of how to read a music file (or a playlist) and listening to it, rather than the front-end part of a music pl= ayer. (My knowledge of OCaml is intermediate)

Thomas Blanc suggested

Yotam Barnoy then said

Wow @PatJ I didn't know about liquidsoap. I added it to ocamlverse. This is= what we have for the audio page now, in case it's helpful to the OP: https://ocamlverse.github.io/content/audio.html

gndl also replied

I experimented with several solutions in the playo project. One of the possible solutions is to use ocaml-gstreamer. If you find that the gstreamer framework is too annoying (which I can under= stand :-), you can use ocaml-ffmpeg. note = however that, in the latest version of ocaml-ffmpeg, the audio device output no longer works. To overcome this drawback, you can use ocaml-portaudio.

The end of Camlp4

Continuing this old thread, Chet Murthy announced

Perhaps worth mentioning briefly that for anybody who -wants- to continue u= sing camlp4, I'm (a) maintaining camlp5 and bringing it up-to-date with everything in ocaml 4.10.0 that I can think= of, and (b) I'd be happy to help them port their dependency over to camlp5.

This is not to be construed as an argument for using camlp4/5.

OCamlformat 0.14.0

Etienne Millon announced

On behalf of the development team, I'd like to announce the release of ocam= lformat version 0.14.0 :tada:.

Here are the main highlights of this release:

Support for OCaml 4.10

This means both that it compiles and runs using this version, but also that= it can format 4.10-specific language features (module _ and multi-indices operators).

Preliminary support for invalid files

As OCamlformat operates on ASTs, it normally requires a valid input file. T= his release adds a --format-invalid-files option to detect invalid parts and prin= t them verbatim. This feature is still experimental.

Preserving more concrete syntax

Starting with this release, OCamlformat is going to preserve more concrete = syntax. For example, module M =3D functor (K : S) -> struct end and module M (K : S) =3D struct end are equivalent. In the past, both variants would be formatted as the latter. Now, the original syntax is preserved. In some cas= es, preserving was possible through the means of an option: for example, to choice between let%name x =3D e i= n body and [%name let x =3D e in body], was controlled by the extension-sugar option. This option is now d= eprecated and OCamlformat will now always preserve what was in the source file (this was the default behaviour).

Similarly, it was possible to control how special characters are escaped in= string and character literals through the escape-strings and escape-chars options. They are= being deprecated and the only possible behavior will be preserving the concrete syntax (as done by default).

The reason for this change is that we feel that ocamlformat should be just = about formatting. The fact that this behavior was configurable is in part due to the fact that it operates on OC= aml ASTs, but end users should not have to be surprised by their code being transformed on reformatting.

In the future, we plan to extend that to other similar constructs, such as = using (~/)~ or begin~/~end, or spacing between module items.

Placement of doc comments

Placing doc comments (** ... *) is controlled by the doc= -comments configuration option. It is always possible to put them before the item they refer to, and this is what the doc-comm= ents=3Dbefore option does. The alternative doc-comments=3Dafter will try to do its best to put them after= , but in some cases it is not possible. For example, in a variant type declaration, a doc-comment put immediately after will be att= ached to the last constructor by documentation tools. Ocamlformat needs to preserve the meaning of programs,= so in these cases, it will instead put the comment before. In the case of module declarations, putting the comment after might not be ve= ry useful if the corresponding module is very large.

This requires a complex rule to determine which comments will be put before= and which comments will be put after. So in this version, we are deprecating this mechanism and replacing it with a = simpler one controlled by doc-comments-val that applies only to val<= /code> and external items. For these items, it is always possible to attach documents before or after them. For all other items, lik= e type or module declarations, the doc comments will consistenly be put before.

Many bugs found by fuzzing

We hooked ocamlformat to AFL, looking for programs that parse correctly but= trigger errors during formatting. This approach worked very well and more than 20 logical bugs were found with this technique.

Upgrading

To upgrade from ocamlformat 0.13.0, one needs to upgrade the ocamlformat bi= nary and replace the version field in .ocamlformat files by 0.14.0 and then:

  • if you used doc-comments=3Dafter, you can replace it by doc-comments-val=3Dafter. This will move doc-comments on module items except val and external ones.
  • if you used doc-comments=3Dbefore, you can remove it as it= is now the default.
  • if you set escape-chars=3Dpreserve, escape-strings= =3Dpreserve, or extension-sugar=3Dpreserve explicitly, = you can

remove them safely (they were the default)

  • if you used another value for one of these options (such as escap= e-strings=3Dhexadecimal), you will need to remove them as well. This= will not trigger a diff, but ocamlformat will not enforce a particular con= crete syntax for new code.

A note for new users

We encourage you to try ocamlformat, that can be installed from opam direct= ly (opam install ocamlformat), but please remember that it is still beta software. We added a FAQ for new users that should help you decide if ocamlformat is the right choice for you.

Etienne Millon later added

This upgrade is likely to generate a huge diff on projects that use the def= ault profile, so I would like to expand a bit on the reason.

According to the syntax rules used by the ocaml tools (the ocaml compilers, ocamldoc, odoc), it is always possible to put the doc-comment before an ite= m.

Some teams prefer to put the documentation after. But that is not always po= ssible. For example, type t =3D A | B (** doc *) will attach t= he doc-comment to B, not to t. The only way to at= tach the comment to t is by putting the comment before.

Enter ocamlformat: doc-comment placement is controlled by an option with tw= o values, before or after. before will always place the comment before. after determines if it i= s possible to put the comment after, and if it is not, will put it before.

Some items cannot have comments after, like variant types (as described abo= ve). But there is another reason not to put comments after. In some cases, that can put the comment far from the th= ing it is documenting. Considering modules, the following is nice:

module M =3D L.M
(** doc *)

But this is not great is the structure is large:

module M =3D struct
  ...
  ...
end
(** doc *)

To summarize, when ocamlformat is configured to put comments after, it has = to follow a complex heuristic to determine whether it has to fallback to before. In the case of a module, it depends o= n its shape, how many functor arguments are there, this kind of things (for various reasons, we don't know how larg= e something is going to be in advance, so we have to look at its shape). The point is that it is complicated to under= stand and explain, and that fixing it always makes it more complex. Another aspect is that in the end, we want oc= amlformat to be pretty stable when it reaches 1.0.0, and complex rules are at odds with this goal.

So, we have decided to simplify the rule: instead of looking deep in the AS= T, we just look at the kind of item this is. For val and external items, it is always poss= ible to put the doc-comment after, so we follow exactly what the configuration option says.

As a user of the default profile, what this means for you: for items that a= re not val or external, and considered "simple" by the 0.13.0 heuristic, doc-comments are going to move from after= to before.

Based on these reasons, you will understand that before is alw= ays simpler. You can opt into this by setting doc-comments-val=3Dbefore. This will cause an even larger diff= as all items are going to move before (that is: all items described just above, plus val and external= items), but the rule gets extremely simple (everything is put before). It is possible that this option will become the default in the fut= ure, but we have not decided this yet (in this case, if you did not opt into it, you will see comments on val and external items move at that time).

ML Family Workshop 2020: Call for presentations

Leo White announced

We are happy to invite submissions to the ML Family Workshop 2020, to be held during the ICFP conference week on Thursday, August 27th.

The ML family workshop warmly welcomes submission touching on the programming languages traditionally seen as part of the "ML family" (Standard ML, OCaml, F#, CakeML, SML#, Manticore, MetaOCaml, etc.). The scope of the workshop includes all aspects of the design, semantics, theory, application, implementation, and teaching of the members of the ML family. We also encourage presentations from related languages (such as Haskell, Scala, Rust, Nemerle, Links, Koka, F*, Eff, ATS, etc), to exchange experience of further developing ML ideas.

Currently, the workshop is still scheduled to go ahead as planned in Jersey City, however it is likely that the ML workshop will end up being a virtual workshop this year. Either way provisions will be made to allow speakers to present their work remotely.

See our detailed CFP online on the ICFP website:

https://i= cfp20.sigplan.org/home/mlfamilyworkshop-2020

Important dates

  • Friday 15th May (any time zone): Abstract submission deadline
  • Friday 26th June: Author notification
  • Thursday 27th August: ML Family Workshop

Program committee

  • Youyou Cong (Tokyo Institute of Technology)
  • Gowtham Kaki (Purdue University)
  • Neel Krishnaswami (University of Cambridge)
  • Daan Leijen (Microsoft Research)
  • Koko Muroya (Kyoto University)
  • Atsushi Ohori (Tohoku University)
  • Jonathan Protzenko (Microsoft Research)
  • Gabriel Radanne (INRIA)
  • Claudio Russo (Dfinity)
  • Leo White (Jane Street) (Chair)
  • Jeremy Yallop (University of Cambridge)

Submission details

See the online CFP for the details on the expected submission format.

Submissions must be uploaded to the workshop submission website

https://ml2020.hotcrp.com/

before the submission deadline.

Announcing Sek, an efficient implementation of sequences

Fran=C3=A7ois Pottier announced

We are pleased to announce the first release of Sek, an OCaml library that offers an efficient implementation of sequences.

The library offers both ephemeral (mutable) sequences and persistent (immutable) sequences, and offers constant-time conversions between these flavors.

It supports all of the standard operations on stacks, queues, deques (e.g. push, pop at either end), catenable sequences (concat, split), and random access sequences (get, set).

Data is stored internally in chunks (fixed-capacity arrays), which is why this data structure is known as a chunK SEquence.

It is intended to achieve excellent time complexity and memory usage.

This is an initial release. The library has not been tested in production, but has received extensive unit testing, via afl-fuzz and ocaml+afl – which are remarkably effective tools, by the way!

This is work in progress; more features, such as iterators, will be added in the future.

To install Sek, just type

opam update && opam install sek

Documentation is online.

Feedback is welcome!

Arthur Chargu=C3=A9raud
Fran=C3=A7ois Pottier
with contributions by =C3=89milie Guermeur

Yaron Minsky asked and Fabian replied

I=E2=80=99m particularly interested in how it compares to Base.Sequence and= Seq in the OCaml distribution, but surely there are others as well.

This actually looks like an array/vector structure (supporting, among other= things, fast access to the nth element), so a comparison with CCVector, CCFun_vec, B= atVect, Clarity.Vector etc. would be more appropriate. = The name is a bit unfortunate considering the naming used in the general ecosystem.

Some time ago, I added some crude benchmarks to containers' benchsuite. I'll see if I can add Sek when I find time.

gasche said

I think it really is a sequence library in the sense that in maintains an i= n-order sequence of items, and sequences can be joined/split efficiently. It also provides logarithmic random access= , but this is probably not competitive with fixed-size arrays. It would be comparable to "persistent vector" libra= ries, ropes, finger trees, etc. The fact that the authors expose a Stack/Queue interface suggests that it has also b= een tuned to perform reasonably well in this case.

It does not provide any delayed computation of items, so in that regard it = is not comparable to Sequence/Seq.

@charguer has designed similar datastructures in the past to represent the = work-queues of concurrent workers (you want at least a fast "push" to add a= new task and, when doing work-stealing, having a fast "split" is convenien= t). See Theory and Practice of Chunked Sequences, Umut Acar, Arthu= r Chargu=C3=A9raud, Mike Rainey, 2014, and A Work-Efficient Algorithm for Par= allel Unordered Depth-First Search.

As far as I know, the OCaml implementation just released has not been teste= d/benchmarked for parallel algorithms. I would be curious to see an experiment of parallel graph traversal with this= structure and Multicore-OCaml.

Announcing dune-deps: produces a project-centric dependency gr= aph

Martin Jambon announced

I'm happy to announce the availability of dune-deps, a command-line tool that scans a dune project and gathers the dependencies into a graph. The output = is in the dot format, supported by the dot command from graphvi= z.

It shows the dependencies between the following:

  • libraries defined by the project,
  • executables defined by the project,
  • direct dependencies on external libraries.

Dependencies are extracted by parsing dune files. As an exampl= e, here's what we obtain for the = sources of opam, which has over 50K lines of code:

3D"f6213fa7fda5=

The commands for this are:

# obtain the project's sources
$ git clone --depth=3D1 https://github.com/ocaml/opam.git

# ex=
tract dependencies and eliminate superfluous graph edges
$ dune-deps opam | tred > deps.dot

# re=
nder the graph
$ dot -Tpng deps.dot -o deps.png

A suggestion is to include such graph in your project's README.md.

OCaml Users and Developers Meeting 2020

Ivan Gotovchits announced

It is my pleasure to invite submissions to the OCaml Users and Developers Workshop 2020, which is again co-located with ICFP and will be held on Friday 28th August 2020 in Jersey City, NJ, USA.

The OCaml Users and Developers Workshop brings together the OCaml community, including users of OCaml in industry, academia, hobbyists and the free software community. Previous editions have been co-located with ICFP since 2012 in Copenhagen, Boston, Gothenburg, Nara, Oxford, St Louis and last year in Berlin, following OCaml Meetings in Paris in 2010 and 2011.

Important Dates

  • Talk proposal submission deadline: May 8th, 2020, AoE
  • Author Notification: June 26th, 2020
  • OCaml Workshop: August 28th, 2020

Scope

Presentations and discussions focus on the OCaml programming language and its community. We aim to solicit talks on all aspects related to improving the use or development of the language and its programming environment, including, for example (but not limited to):

  • compiler developments, new backends, runtime and architectures
  • practical type system improvements, such as GADTs, first-class modules, generic programming, or dependent types
  • new library or application releases, and their design rationales
  • tools and infrastructure services, and their enhancements
  • prominent industrial or experimental uses of OCaml, or deployments in unusual situations.

Presentations

The workshop is an informal meeting with no formal proceedings. The presentation material will be available online from the workshop homepage. The presentations may be recorded and made available at a later date.

The main presentation format is a workshop talk, traditionally around 20 minutes in length, plus question time, but we also have a poster session during the workshop – this allows to present more diverse work, and gives time for discussion. The program committee will decide which presentations should be delivered as posters or talks.

Submission

To submit a presentation, please register a description of the talk (about 2 pages long) at

https://ocaml2020.hotcrp.com/

providing a clear statement of what will be provided by the presentation: the problems that are addressed, the solutions or methods that are proposed.

LaTeX-produced PDFs are a common and welcome submission format. For accessibility purposes, we ask PDF submitters to also provide the sources of their submission in a textual format, such as .tex sources. Reviewers may read either the submitted PDF or the text version.

ML family workshop

The ML family workshop, held on the previous day, deals with general issues of the ML-style programming and type systems, focuses on more research-oriented work that is less specific to a language in particular. There is an overlap between the two workshops, and we have occasionally transferred presentations from one to the other in the past. Authors who feel their submission fits both workshops are encouraged to mention it at submission time and/or contact the Program Chairs.

Program Committee

  • Ivan Gotovchits, CMU, USA
  • Florian Angeletti, INRIA, France
  • Chris Casinghino, Draper Laboratory, USA
  • Catherine Gasnier, Facebook, USA
  • Rudi Grinberg, OCaml Labs, UK
  • Oleg Kiselyov, Tohoku University, Japan
  • Andreas Rossberg, Dfinity Stiftung, Germany
  • Marcello Seri, University of Groningen, Netherlands
  • Edwin Torok, Citrix, UK
  • Leo White, Jane Street, USA
  • Greta Yorsh, Jane Street, USA
  • Sarah Zennou, Airbus, France

COVID-19 Notice

While ICFP-20 is stil= l scheduled to be held as planned, chances are high that it will be turned into a virtual conference. Which means a wider audie= nce and reduced (hopefully) fees. We will keep you posted.

Questions and contact

Please send any questions to the chair: Ivan Gotovchits (ivg@ieee.org)

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.

--=-=-=--