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 C0E115D4 for ; Tue, 16 Jun 2020 08:36:40 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.73,518,1583190000"; d="asc'?scan'208,217";a="454927478" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 16 Jun 2020 10:36:36 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 45229E0C19; Tue, 16 Jun 2020 10:36:36 +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 CC2E8E002A for ; Tue, 16 Jun 2020 10:36:32 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=SZQf=75=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org IronPort-PHdr: =?us-ascii?q?9a23=3ADdMm0RKN60939wgeF9mcpTZWNBhigK39O0sv0rFi?= =?us-ascii?q?tYgXKfrzrarrMEGX3/hxlliBBdydt6sZzbOJ6+u4BCQp2tWoiDg6aptCVhsI24?= =?us-ascii?q?09vjcLJ4q7M3D9N+PgdCcgHc5PBxdP9nC/NlVJSo6lPwWB6nK94iQPFRrhKAF7?= =?us-ascii?q?Ovr6GpLIj8Swyuu+54Dfbx9HiTagYb5+Ngi6oAfNusUZnYdvKrs6xwfUrHdPZ+?= =?us-ascii?q?lY335jK0iJnxb76Mew/Zpj/DpVtvk86cNOUrj0crohQ7BAAzsoL2465MvwtRne?= =?us-ascii?q?VgSP/WcTUn8XkhVTHQfI6gzxU4rrvSv7sup93zSaPdHzQLspVzmu87tnRRn1gy?= =?us-ascii?q?gAKjA57XrXitRug61HvBKvqRt/w4vOb4GUMvp1Y6fRcNweSGZEWMtdVy9PAoWi?= =?us-ascii?q?b4sOFOoBPP1Xr43jqFAToxq+AhOsC/70yjRVgnP707E23+EnHArb3gIvAsgOvW?= =?us-ascii?q?zUotvrKakcX+O7w6bUwjjYavNaxS3w5ZLUfhw9o/yBW697f8rLyUkoEgPIlkmd?= =?us-ascii?q?qYj/MDOTy+8DrnSU7+plVeKul24ntxx6rz+1yccokIbJgJgZykvY+iV5xYY1JM?= =?us-ascii?q?G4SFJgbN68F5tQsyGbN5doTcw+Q2Fovic6yqQbuZGlZiQKz44nxxHGZvGBboOH?= =?us-ascii?q?7Q7tWvyLLjdkmHJqZqi/hxCq/EWjyODxVdW53VZKoCdLnNTBtnQA2wLT5MaISv?= =?us-ascii?q?Zw4Eev1DeS2w7c9OxJJVw4mbbaJpM8xrM8iocfv0rNECPqmUj7irKdeEsj+uit?= =?us-ascii?q?8evnY7Pmq4eEN4BqlgH+M7guldKnAeQ/NwgOWnaU9f661LL94U31WLJKgeEsna?= =?us-ascii?q?nctJDWP8MbprS2AwNN04Yj7Qy/Dza839gCk3kHNkpJeBWbgIfzPlHOJOj4De24?= =?us-ascii?q?g1i2jDhrwPXGMqXuApXMMnjDkKrhcq1n50FAzwozyMhT551VCrEdIPLzR1T+uM?= =?us-ascii?q?bZDh8+KwC1zefnCNZ81oMGR22AH66ZP7nIvV+P/OIvLPGAZJQJuDnnN/cl5Pnu?= =?us-ascii?q?jWEnll8Hc6mp2ZwXaX6iEvt6JEWZZGLggtkbEWgQuwoxVvXmh0GYXTFPYHayWr?= =?us-ascii?q?ow6Ss9CI27F4fMWIKtjKad0ye8G51afmFGBU2MEHfsc4WIQfAMaDidIsJnjzcK?= =?us-ascii?q?VqChRpc82R2wsAL20adrIvbb9yECu5/vyMJ56uPcmB0q9zF5DN6R33+CQm1qhG?= =?us-ascii?q?8EWjA70LpirUFy1luO17VzjeZCGtxJ/fxJVx83NZ7CwOx+DND/QgfBf9iURFq8?= =?us-ascii?q?WtWmBjUxT9Itw9AQf0l9G9OijhHa3yq3HbAZjbuLBIY78q7E3njxIdhyy2re2a?= =?us-ascii?q?U8kVUrRtFDOXC6iqNw7QTeCZLFn1+Xmqulbagc2TTC9GaHzWqApkFYVwtwXL3Y?= =?us-ascii?q?U34De0Xascz06F7BQLG1B7QqKglMxM6aJ6tSbd3piVVHROv9N9vCY2KxnWawBQ?= =?us-ascii?q?+VxrySdobqfH8d3CrFBUcelwAc53CGORIlBii9o2LeCT1uFU7zY0736uZ+r267?= =?us-ascii?q?TkkowA6UdE1tzb+19xEahPCGTPMTxL0EtD87qzpoBFa9w87WC92YqgV9ZqpcZN?= =?us-ascii?q?c97E5D1WLYrAx9IoetL7tih14bawR4pVni1xRxCoVakMgltmkmzARoKfHQ7FQU?= =?us-ascii?q?PTeH29q4brnILEH24xbpbaPKjBWWmt2J/O1HoKAztFPLuACyClFk8nl2190T1G?= =?us-ascii?q?GTsNGCBwMXVdf1U10r3xl8vbDTJCcno8vf0nh0Ga21qSPZndUzDuo5wxKueMcZ?= =?us-ascii?q?Pb7XOhX1FpgzA8GoYNchm12ocg5MaOlW/ahyJMimcvqaxIazO+JxgD+tjWJG+Z?= =?us-ascii?q?1wlEWW+HwvGabzw58ZzqTAjUO8XDDmgQL+45mqy7ABXikbGy+E8QahBINVYfcp?= =?us-ascii?q?L4MbUCG2JMmm2th1h5jsQmNVslm5CAFfgZP7SV+pd1X4mDZo+wEPu3X+yHmgyD?= =?us-ascii?q?hljzwirqyexTHDheP4e0heYz8ZdCxZlV7pZLOMoZUfVUmsYRIukUL6t0z92q5Q?= =?us-ascii?q?qb85KjXDB0BScHqvIg=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BhEwAUhOhefSIeaIFmFgcBAQEBCQESA?= =?us-ascii?q?QUFAYIKAoEhgRgBXVUyLIQkiQGHJYFigg2FOJJeA1AQAQMBBwUYAQwHAQIEAQG?= =?us-ascii?q?BUIIvRQIXgXwCHQYBBTMTAhABAQUBAQECAQMDBAETAQELFAiGCwxCFgGBYgwMA?= =?us-ascii?q?wODIQEYCQQGZSMDFAEGAwIEDQEXARQKFwESFAaDDYJ8BAEKmX2aNhk1dn8zhDo?= =?us-ascii?q?BCwEHQYQNgUANAhOBFgGBUoNchnUmD4FMP4ERghJJB2yBQYEEDAsBAQEBAQGBO?= =?us-ascii?q?QEBVoJegmAEjw0BDSRriXGHQ5I8KAeCXYEGBAuGMHiKN4ZIgnCBFogEhRqNRCG?= =?us-ascii?q?QeoFjhWKCSIVqih+EQ4FAKoF4MxowgngBATIJCVcNkg+BPoEmgXU7gX6DQwM/M?= =?us-ascii?q?wEBAQEzAgYBBwEBAwl1AQEFEwsBjCODJQEB?= X-IPAS-Result: =?us-ascii?q?A0BhEwAUhOhefSIeaIFmFgcBAQEBCQESAQUFAYIKAoEhgRg?= =?us-ascii?q?BXVUyLIQkiQGHJYFigg2FOJJeA1AQAQMBBwUYAQwHAQIEAQGBUIIvRQIXgXwCH?= =?us-ascii?q?QYBBTMTAhABAQUBAQECAQMDBAETAQELFAiGCwxCFgGBYgwMAwODIQEYCQQGZSM?= =?us-ascii?q?DFAEGAwIEDQEXARQKFwESFAaDDYJ8BAEKmX2aNhk1dn8zhDoBCwEHQYQNgUANA?= =?us-ascii?q?hOBFgGBUoNchnUmD4FMP4ERghJJB2yBQYEEDAsBAQEBAQGBOQEBVoJegmAEjw0?= =?us-ascii?q?BDSRriXGHQ5I8KAeCXYEGBAuGMHiKN4ZIgnCBFogEhRqNRCGQeoFjhWKCSIVqi?= =?us-ascii?q?h+EQ4FAKoF4MxowgngBATIJCVcNkg+BPoEmgXU7gX6DQwM/MwEBAQEzAgYBBwE?= =?us-ascii?q?BAwl1AQEFEwsBjCODJQEB?= X-IronPort-AV: E=Sophos;i="5.73,518,1583190000"; d="asc'?scan'208,217";a="454927370" X-MGA-submission: =?us-ascii?q?MDFYTH8QqrHbzjdBym24ma3abT6XSoAOW5xU5r?= =?us-ascii?q?hk5mDpg1jt6W8immNI0agae9vc1xKva8XqpFMzKvN8ZekAdiIVxra+2L?= =?us-ascii?q?PsY55nOQ2hj4OWeSHfLdO2r1X2UX9rzWgTPRknG5ITYrv7m1aMm7/3OM?= =?us-ascii?q?fr/QPZ0dLeR0FKJlvrA4b4jA=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; 16 Jun 2020 10:36:13 +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 9144C5649F1; Tue, 16 Jun 2020 10:36:11 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 16 Jun 2020 10:36:10 +0200 Message-ID: <87v9jrpfut.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 16 10:36:12 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=2410B5649F4 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: 18168 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" --==-=-= Content-Type: text/plain --==-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl7ohHoACgkQBA0KO07S 5ccAcQgAwwWcIo+/ICYeuwO6KtX1euoYorzNgUieNbzZl4szlIz4/J3mtRWE+/5o XEFXRTKw1yPbbEIOqcYa32Qbv7dZ75EroHjuke//0GrymWKAXfIGPMtqX7Nb6QuL rz7Ji3wQMyxp82oT95kumuU8Wfxe2tiRy/X4nnuo9Z+EKSLaKL7np4xHUqE1tQ58 ZWSifv3+4sWPnb4wcRB4gIfmydwA15tv6ajRlyO3G+hLTLUlfc/Sqzd7auH4YaED fOGiEwzcnLKtOnYUL0wXPVRZTf6KjkctTV51w1lWn56YmHUi+JCyD7FyhU1VP3t5 v9zWIJHaUZHOpRiLQ3gfQcMtKQgjCg== =B/tn -----END PGP SIGNATURE----- --==-=-=-- --=-=-= Content-Type: multipart/alternative; boundary="===-=-=" --===-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAwOSB0byAxNiwNCjIwMjAuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KRmlyc3QgcmVs ZWFzZSBvZiBtb25vbGl0aA0KU3lsdmFpbiBDb25jaG9uIGpvaW5lZCBPQ2FtbFBybydzIHRlYW0N CkZpcnN0IHJlbGVhc2Ugb2Ygc3RyZWFtaW5nDQpTZW5pb3Igc29mdHdhcmUgZW5naW5lZXIgYXQg QXNlbWlvIGluIFR1bHNhLCBPSw0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCkZpcnN0 IHJlbGVhc2Ugb2YgbW9ub2xpdGgNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQog IFtodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2YtbW9ub2xp dGgvNTk0Ni8xXQ0KDQoNCkZyYW7Dp29pcyBQb3R0aWVyIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJl bGVhc2Ugb2YgTW9ub2xpdGguDQoNCiAgTW9ub2xpdGggb2ZmZXJzIGZhY2lsaXRpZXMgZm9yIHRl c3RpbmcgYW4gT0NhbWwgbGlicmFyeSAoZm9yIGluc3RhbmNlLA0KICBhIGRhdGEgc3RydWN0dXJl IGltcGxlbWVudGF0aW9uKSBieSBjb21wYXJpbmcgaXQgYWdhaW5zdCBhIHJlZmVyZW5jZQ0KICBp bXBsZW1lbnRhdGlvbi4gIEl0IHVzZXMgYSBmb3JtIG9mIGJsYWNrLWJveCB0ZXN0aW5nLCBhbmQg cmVsaWVzIG9uDQogIGBhZmwtZnV6eicgZm9yIGVmZmljaWVuY3kuDQoNCiAgVGhlIHVzZXIgbXVz dCBkZXNjcmliZSB3aGF0IHR5cGVzIGFuZCBvcGVyYXRpb25zIHRoZSBsaWJyYXJ5DQogIHByb3Zp ZGVzLiBVbmRlciB0aGUgYmVzdCBjaXJjdW1zdGFuY2VzLCB0aGlzIHJlcXVpcmVzIDItMyBsaW5l cyBvZg0KICBjb2RlIHBlciB0eXBlIG9yIG9wZXJhdGlvbi4gIFRoZSB1c2VyIG11c3QgYWxzbyBw cm92aWRlIGEgcmVmZXJlbmNlDQogIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsaWJyYXJ5Lg0KDQog IFRoZW4sIGxpa2UgYSBtb25rZXkgdHlwaW5nIG9uIGEga2V5Ym9hcmQsIE1vbm9saXRoIGF0dGVt cHRzIHRvDQogIGV4ZXJjaXNlIHRoZSBsaWJyYXJ5IGluIGV2ZXJ5IHBvc3NpYmxlIHdheSwgaW4g dGhlIGhvcGUgb2YgZGlzY292ZXJpbmcNCiAgYSBzY2VuYXJpbyB3aGVyZSB0aGUgbGlicmFyeSBi ZWhhdmVzIGluY29ycmVjdGx5LiBJZiBzdWNoIGEgc2NlbmFyaW8NCiAgaXMgZGlzY292ZXJlZCwg aXQgaXMgcHJpbnRlZCBpbiB0aGUgZm9ybSBvZiBhbiBPQ2FtbCBwcm9ncmFtLCBzbyBhcyB0bw0K ICBoZWxwIHRoZSB1c2VyIHJlcHJvZHVjZSB0aGUgcHJvYmxlbS4NCg0KICBBdCB0aGlzIHRpbWUs IGEgdHV0b3JpYWwgaXMgbm90IHlldCBhdmFpbGFibGUuIFRoZXJlIGlzIGhvd2V2ZXIgYW4gQVBJ DQogIGRvY3VtZW50YXRpb24gYW5kIGEgbnVtYmVyIG9mIGRlbW9zLg0KDQogIFJlcG9zaXRvcnk6 IFtodHRwczovL2dpdGxhYi5pbnJpYS5mci9mcG90dGllci9tb25vbGl0aF0NCg0KICBBUEkgRG9j dW1lbnRhdGlvbjoNCiAgICBbaHR0cDovL2NhbWJpdW0uaW5yaWEuZnIvfmZwb3R0aWVyL21vbm9s aXRoL2RvYy9tb25vbGl0aC9Nb25vbGl0aC9pbmRleC5odG1sXQ0KDQogIEluc3RhbGxhdGlvbjoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIgb3BhbSBpbnN0YWxs IG1vbm9saXRoDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNClN5bHZhaW4gQ29uY2hvbiBqb2luZWQg T0NhbWxQcm8ncyB0ZWFtDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L3N5bHZhaW4tY29uY2hvbi1qb2luZWQtb2NhbWxwcm9zLXRlYW0vNTk1Ni8xXQ0KDQoN Ck9DYW1sUHJvIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgU3lsdmFpbiBDb25jaG9uIGpvaW5lZCBPQ2FtbFBybydz IHRlYW0gYXMgRm9ybWFsIE1ldGhvZHMgQ1NPLiBIZQ0KICBjcmVhdGVkIEFsdC1FcmdvIGFuZCBo YXMgYmVlbiB0ZWFjaGluZyBPQ2FtbCBpbiB1bml2ZXJzaXRpZXMgZm9yIGFib3V0DQogIDIwIHll YXJzLiBIZSBzaGFyZXMgdGhvdWdodHMgb24gaW50ZXJhY3Rpb25zIGJldHdlZW4gaW5kdXN0cnkg YW5kDQogIHJlc2VhcmNoIGxhYnMsIGFuZCBoaXMgdmlzaW9uIG9mIEZvcm1hbCBtZXRob2RzIGFu ZCBPQ2FtbCBhcyBsYW5ndWFnZQ0KICBmb3IgdGhlIGluZHVzdHJ5LiBSZWFkIGhpcyBpbnRlcnZp ZXcgb24gb3VyIGJsb2c6DQogIFtodHRwczovL3d3dy5vY2FtbHByby5jb20vMjAyMC8wNi8wNS9p bnRlcnZpZXctc3lsdmFpbi1jb25jaG9uLWNzby1vbi1mb3JtYWwtbWV0aG9kcy9dDQoNCg0KRmly c3QgcmVsZWFzZSBvZiBzdHJlYW1pbmcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6DQogIFtodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2Yt c3RyZWFtaW5nLzU5NjEvMV0NCg0KDQpSaXpvIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUgdG8gYW5ub3Vu Y2UgdGhlIGZpcnN0IHB1YmxpYyByZWxlYXNlIG9mIGBzdHJlYW1pbmcnDQogIOKAkyBhIGxpYnJh cnkgZm9yIGJ1aWxkaW5nIGVmZmljaWVudCwgaW5jcmVtZW50YWwgZGF0YSBwcm9jZXNzaW5nDQog IHBpcGVsaW5lcyB0aGF0IGNvbXBvc2UgYW5kIGRvbid0IGxlYWsgcmVzb3VyY2VzLg0KDQogIEkg YnVpbHQgc3RyZWFtaW5nIGFzIGEgcmVzdWx0IG9mIG1hbnkgZXhwZXJpbWVudHMgd2l0aCBkaWZm ZXJlbnQNCiAgc3RyZWFtaW5nIGFuZCBpdGVyYXRpb24gbW9kZWxzIGZvciBPQ2FtbC4gVGhlcmUg YXJlIG11bHRpcGxlIHBhY2thZ2VzDQogIG9uIE9QQU0gdGhhdCBzaGFyZSBzb21lIG9mIHRoZSBn b2FscyBvZiBgc3RyZWFtaW5nJyAod2UgZXZlbiBoYXZlDQogIGBTdGRsaWIuU2VxJyBub3chKSwg YnV0IG5vbmUgb2YgdGhlbSBjb21iaW5lICgxKSBleGNlbGxlbnQNCiAgcGVyZm9ybWFuY2UsICgy KSBzYWZlIHJlc291cmNlIGhhbmRsaW5nIGFuZCAoMykgcHVyZSBmdW5jdGlvbmFsIHN0eWxlDQog IGZvciBjb21iaW5hdG9ycy4gIFN0cmVhbWluZyBzb2x2ZXMgdGhlc2UgcHJvYmxlbXMgYnkgaW1w bGVtZW50aW5nDQogIHRocmVlIGJhc2ljIGFuZCBpbmRlcGVuZGVudCBtb2RlbHM6IF9zb3VyY2Vz XywgX3NpbmtzXyBhbmQgX2Zsb3dzXyDigJMNCiAgdGhleSByZXByZXNlbnRzIGRpZmZlcmVudCBw YXJ0cyBvZiB0aGUgcGlwZWxpbmUgdGhhdCBjb3JyZXNwb25kIHRvDQogIHByb2R1Y2luZywgY29u c3VtaW5nIGFuZCB0cmFuc2Zvcm1pbmcgZWxlbWVudHMuICBUaGVzZSBtb2RlbHMgY2FuIGJlDQog IGRlZmluZWQgYW5kIGNvbXBvc2VkIGluZGVwZW5kZW50bHkgdG8gcHJvZHVjZSByZXVzYWJsZSAi c3RyZWFtaW5nDQogIGJsb2NrcyIuDQoNCiAgVGhlIGxpYnJhcnkgZGVmaW5lcyBhIGNlbnRyYWwg YFN0cmVhbScgbW9kZWwgdGhhdCByZWxpZXMgb24gc291cmNlcywNCiAgc2lua3MgYW5kIGZsb3dz LiBUaGlzIG1vZGVsIGlzIGEgcHVzaC1iYXNlZCBpdGVyYXRvciB3aXRoIHBlcmZvcm1hbmNlDQog IGNoYXJhY3RlcmlzdGljcyBzaW1pbGFyIHRvIHRoZSBgaXRlcicgaXRlcmF0b3IsIHdoaWNoIGhh cyB0eXBlIGAoJ2EgLT4NCiAgdW5pdCkgLT4gdW5pdCcsIGFuZCBpcyBrbm93biBmb3IgYmVpbmcg dmVyeSBlZmZpY2llbnQuIEJ1dCB1bmxpa2UNCiAgYGl0ZXInLCBpdCBoYXMgYSBwdXJlIGZ1bmN0 aW9uYWwgY29yZSAobm8gbmVlZCB0byB1c2UgbXV0YWJsZSBzdGF0ZQ0KICBhbmQgZXhjZXB0aW9u cyBmb3IgZmxvdyBjb250cm9sISkgYW5kIGNhbiBoYW5kbGUgcmVzb3VyY2UgYWxsb2NhdGlvbg0K ICBhbmQgY2xlYW4gdXAgaW4gYSBsYXp5IGFuZCBkZXRlcm1pbmlzdGljIHdheS4gQWxsIG9mIHRo aXMgd2hpbGUgaGF2aW5nDQogIGEgc2xpZ2h0bHkgYmV0dGVyIHBlcmZvcm1hbmNlIGZvciBjb21t b24gc3RyZWFtIG9wZXJhdGlvbnMuDQoNCiAgRm9yIHRob3NlIHdobyBhcmUgY3VyaW91cyBhYm91 dCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mDQogIGBzdHJlYW1pbmcnIGFuZCBv dGhlciBtb2RlbHMsIEkgY3JlYXRlZCBhIGRlZGljYXRlZCByZXBvc2l0b3J5IGZvcg0KICBzdHJl YW0gYmVuY2htYXJrczogW2h0dHBzOi8vZ2l0aHViLmNvbS9yaXpvL3N0cmVhbXMtYmVuY2hdLiBJ bg0KICBwYXJ0aWN1bGFyLCBpdCBpbmNsdWRlcyBhIGZldyBzaW1wbGUgYmVuY2htYXJrcyBmb3Ig YEdlbicsDQogIGBCYXNlLlNlcXVlbmNlJywgYFN0ZGxpYi5TZXEnLCBgSXRlcicsIGBTdHJlYW1p bmcuU3RyZWFtJyBhbmQNCiAgYFN0cmVhbWluZy5Tb3VyY2UnLg0KDQogIFRoZSBsaWJyYXJ5IHNo b3VsZCBzb29uIGJlIHB1Ymxpc2hlZCBvbiBvcGFtLiBJbiB0aGUgbWVhbnRpbWUsIEkNCiAgaW52 aXRlIHlvdSB0byByZWFkIHRoZSBkb2NzIGFuZCBleHBsb3JlIHRoZSBjb2RlOg0KDQogIOKAoiBM aWJyYXJ5IGRvY3VtZW50YXRpb246IFtodHRwczovL29kaXMtbGFicy5naXRodWIuaW8vc3RyZWFt aW5nXQ0KICDigKIgR2l0aHViIHByb2plY3Q6IFtodHRwczovL2dpdGh1Yi5jb20vb2Rpcy1sYWJz L3N0cmVhbWluZ10NCg0KDQpHdWlsbGF1bWUgQnVyeSBhc2tlYw0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhhdCdzIGdy ZWF0ICEgRnJvbSB0aGUgYmVuY2htYXJrcywgaXQgbG9va3MgbGlrZSB5b3UgaGl0IGEgcmVhbGx5 DQogIGdvb2QgaW1wbGVtZW50YXRpb24gIQ0KDQogIEkndmUgbG9va2VkIChtYXliZSBhIGJpdCBm YXN0KSBhdCB0aGUgQVBJIGRvY3VtZW50YXRpb24sIGFuZCBpdCBpcw0KICBhZG1pdHRlZGx5IGEg Yml0IG91dHNpZGUgdGhlIHNjb3BlIG9mIHN0cmVhbXMvaXRlcmF0b3JzLCBidXQgSSB3YXMNCiAg d29uZGVyaW5nIGlmIHRoZXJlIHdhcyBzb21lIHByb3BlciB3YXkgdG86DQogIOKAoiBjb25uZWN0 IGEgc2luayB0byBhIHNvdXJjZSB0byBjcmVhdGUgc29tZSBsb29wDQogIOKAoiBoYXZlIHNvbWUg a2luZCBvZiBmaXhwb2ludCBvbiBzdHJlYW1zDQoNCiAgSSBndWVzcyBpdCB3b3VsZCBhbHdheXMg YmUgcG9zc2libGUgdG8gdXNlIHNvbWUgcmVmZXJlbmNlcyBhbmQvb3Igc29tZQ0KICBjb21wbGV4 IGZ1bmN0aW9ucyB0byBlbmNvZGUgdGhlc2UgaW50byB0aGUgcHJvdmlkZWQgQVBJLCBidXQgSSB3 YXMNCiAgd29uZGVyaW5nIGlmIHRoZXJlIHdhcyBhIGNsZWFuIHdheSB0byBkbyBpdC4NCg0KICBG b3IgYSBiaXQgb2YgY29udGV4dCBhbmQgZXhwbGFuYXRpb24sIHdoYXQgSSBoYXZlIGluIG1pbmQg aXMgdGhlIGNhc2UNCiAgb2YgYSBwcm9ncmFtIChsZXQncyBzYXkgYSB0eXBlLWNoZWNrZXIgb3Ig c29tZXRoaW5nIGNsb3NlIHRvIHRoZSBpZGVhKQ0KICB3aXRoIGEgKnBlcnNpc3RlbnQgc3RhdGUq LCB0aGF0IHNob3VsZCBvcGVyYXRlIG92ZXIgYSBzdHJlYW0gb2YNCiAgaW5wdXRzLCB3aGljaCBh cmUgdG9wLWxldmVsIHBocmFzZXMsIGFuZCBwcm9kdWNlIHNvbWUgb3V0cHV0cywgZm9yDQogIGlu c3RhbmNlIHByaW50IHNvbWUgcmVzdWx0IGZvciBlYWNoIGNvcnJlY3RseSB0eXBlLWNoZWNrZWQg c3RhdGVtZW50DQogIChhbmQgYW4gZXJyb3Igb3RoZXJ3aXNlKS4gIFRoZSB0eXBlLWNoZWNrZXIg d291bGQgYmFzaWNhbGx5IGJlIGENCiAgZnVuY3Rpb24gb2YgdHlwZSBgKGBpbnB1dCAqIGBzdGF0 ZSkgLT4gKGBvdXRwdXQgKiBgc3RhdGUpJywgYW5kDQogIHN0YXJ0aW5nIGZyb20gYW4gaW5pdGlh bCBzdGF0ZSwgaXQgd291bGQgcHJvY2VzcyBhbiBpbnB1dCBlbGVtZW50DQogIChnaXZpbmcgdGhl IG91dHB1dCB0byBzb21lIHNpbmspLCBhbmQgdGhlbiB0aGUgbmV4dCBpbnB1dCBlbGVtZW50DQog IHdvdWxkIGJlIHByb2Nlc3NlZCB3aXRoIHRoZSBzdGF0ZSB0aGF0IHdhcyByZWFjaGVkIGFmdGVy IHByb2Nlc3NpbmcNCiAgdGhlIHByZXZpb3VzIGVsZW1lbnQ6IHRoZSBzdGF0ZSB3b3VsZCByZWFj aCB0aGUgc2luayBvZiB0aGUgZmxvdywgYW5kDQogIHRoZW4gYmUgaW5zZXJ0ZWQgYmFjayBpbnRv IHRoZSBzb3VyY2UuICBTZXBhcmF0ZWx5LCBpbWFnaW5lIHRoZQ0KICBsYW5ndWFnZSBiZWluZyB0 eXBlLWNoZWNrZWQgaGFzIGEgbm90aW9uIG9mIGluY2x1ZGUsIHRoZW4gb25lIG9mIHRoZQ0KICBz dGVwIG9mIHRoZSBmbG93IHdvdWxkIGJlIHRvIGV4cGFuZCBlYWNoIGluY2x1ZGUgaW50byBhIHN0 cmVhbSBvZg0KICBpbnB1dHMvcGhyYXNlcywgYnV0IGVhY2ggb2YgdGhlIHBocmFzZXMgaW4gdGhp cyBzdHJlYW0gd291bGQgbmVlZCB0bw0KICBiZSBleHBhbmRlZCwgc28gYSBzaW1wbGUgYGZsYXRf bWFwfi9+ZmxhdHRlbicgaXMgbm90IGVub3VnaC4NCg0KICBJIGFscmVhZHkgaGF2ZSBhIGN1c3Rv bSBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhbmRsZSB0aGVzZSBmZWF0dXJlcywgYnV0DQogIEkgd2Fz IHdvbmRlcmluZyB3aGV0aGVyIEkgY291bGQgdXNlIGBzdHJlYW1pbmcnIHRvIGhhbmRsZSBtb3N0 IG9mIHRoZQ0KICBjb2RlIGxpbmtpbmcgYWxsIG9mIHRoZSBzdGVwcywgXl4NCg0KDQpSaXpvIHJl cGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICAgICAgIGlm IHRoZXJlIHdhcyBzb21lIHByb3BlciB3YXkgdG86DQogICAgICAgIOKAoiBjb25uZWN0IGEgc2lu ayB0byBhIHNvdXJjZSB0byBjcmVhdGUgc29tZSBsb29wDQogICAgICAgIOKAoiBoYXZlIHNvbWUg a2luZCBvZiBmaXhwb2ludCBvbiBzdHJlYW1zDQoNCiAgUmVnYXJkaW5nIHRoZSBmaXJzdCBwb2lu dDogeWVzISBUaGF0J3MgZXhhY3RseSB0aGUgcG9pbnQgb2YgdGhlDQogIGBTdHJlYW0nIG1vZHVs ZS4gWW91IHNlZSwgc291cmNlcyBhcmUgcHVsbC1iYXNlZCBhYnN0cmFjdGlvbnMsIHdoaWxlDQog IHNpbmtzIGFyZSBwdXNoLWJhc2VkLiBTb3VyY2UncyB0eXBlIGVzc2VudGlhbGx5IHNheXMgc29t ZXRoaW5nIGxpa2UNCiAgXyJJIG1pZ2h0IGdpdmUgeW91IHNvbWUgZGF0YSwgaWYgeW91IGFzayJf LCB3aGlsZSBzaW5rJ3MgdHlwZSBpcyB0aGUNCiAgb3Bwb3NpdGUgXyJJIG1pZ2h0IHRha2Ugc29t ZSBkYXRhLCBpZiB5b3UgZ2l2ZSBpdCB0byBtZSJfLiBUaGV5IGFyZQ0KICBjb21wbGV0ZWx5IGFu ZCBpbnRlbnRpb25hbGx5IGRlY291cGxlZDsgaXQgaXMgU3RyZWFtJ3Mgcm9sZSB0byBkcml2ZQ0K ICB0aGUgY29tcHV0YXRpb24gYnkgcHVsbGluZyBkYXRhIGZyb20gc291cmNlcyBhbmQgcHVzaGlu ZyBpdCBpbnRvDQogIHNpbmtzLiBTbyB0aGUgZWFzaWVzdCB3YXkgdG8gY29ubmVjdCB0aGVtIGlz Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgU3RyZWFtLihmcm9tIHNyb3VjZSB8PiBpbnRv IHNpbmspDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIE9mIGNvdXJzZSwgdGhhdCdzIG5vdCB2ZXJ5 IHVzZWZ1bCBwZXIgc2UsIGJ1dCBpdCBpbGx1c3RyYXRlcyBteQ0KICBwb2ludC4gVGFrZSBhIGxv b2sgYXQgdGhlIFtgU3RyZWFtLmZyb20nXSBjb2RlIHRvIHNlZSB0aGUNCiAgaW1wbGVtZW50YXRp b24gb2YgdGhlIGxvb3AgeW91J3JlIGFza2luZyBmb3IuIEl0IGRvZXMgc29tZSBleHRyYSB3b3Jr DQogIHRvIGVuc3VyZSB0aGF0IHJlc291cmNlcyBhcmUgY29ycmVjdGx5IGhhbmRsZWQsIGJ1dCBp dCBzaG91bGQgYmUgY2xlYXINCiAgd2hhdCB0aGUgbG9vcCBpcyBkb2luZy4NCg0KICBUaGUgc3Ry ZWFtIHR5cGVzIGluIHRoZSBsaWJyYXJ5IGFyZSBjdXJyZW50bHkgYWJzdHJhY3QgYmVjYXVzZSBJ DQogIGRpZG4ndCB3YW50IHRvIGNvbW1pdCB0byBhIHBhcnRpY3VsYXIgcmVwcmVzZW50YXRpb24g anVzdCB5ZXQuIElmIHRoaXMNCiAgaXMgYSBwcm9ibGVtIGZvciB5b3VyIHVzZSBjYXNlLCBsZXQg bWUga25vdywgSSdsbCBleHBvc2UgdGhlbSBpbiBhDQogIGBQcml2YXRlJyBtb2R1bGUuDQoNCiAg UmVnYXJkaW5nIHRoZSBzZWNvbmQgcG9pbnQ6IEknbSBub3Qgc3VyZSB3aGF0IHlvdSBtZWFuIGlu IHByYWN0aWNlIGJ5DQogICJmaXhwb2ludCBvbiBzdHJlYW1zIi4gSSBndWVzcyB0aGUgb25lIHRo aW5nIHRoYXQgY291bGQgaGVscCBpbXBsZW1lbnQNCiAgc29tZXRoaW5nIGxpa2UgdGhhdCBpcyB0 aGUgW2BTdHJlYW0ucnVuJ10gZnVuY3Rpb24uIEl0IGFsbG93cyB5b3UgdG8NCiAgY29udGludWUg cmVhZGluZyBlbGVtZW50cyBmcm9tIGEgc291cmNlIGV2ZW4gYWZ0ZXIgYSBzaW5rIGlzIGZpbGxl ZCBieQ0KICByZXR1cm5pbmcgYSBsZWZ0b3ZlciBzdHJlYW0uICBUaGlzIHN0cmVhbSBjYW4gYmUg dXNlZCB3aXRoDQogIGBTdHJlYW0ucnVuJyByZXBlYXRlZGx5Lg0KDQogIEFsdGVybmF0aXZlbHkg dGhlcmUncyBhbHNvIFtgRmxvdy50aHJvdWdoJ10sIHdoaWNoIGNvbnN1bWVzIGlucHV0DQogIHRy eWluZyB0byBmaWxsIHNpbmtzIHJlcGVhdGVkbHkgYW5kIHByb2R1Y2VzIHRoZWlyIGFnZ3JlZ2F0 ZWQgdmFsdWVzDQogIGFzIGEgc3RyZWFtLiBTdXBlciB1c2VmdWwgZm9yIHRoaW5ncyBsaWtlIHN0 cmVhbWluZyBwYXJzaW5nLiBNaWdodA0KICBldmVuIGhlbHAgd2l0aCB5b3VyIHVzZS1jYXNlIGZv ciB0b3AtbGV2ZWwgcGhyYXNlcy4NCg0KICBPbiBhIG1vcmUgZ2VuZXJhbCBub3RlIHRob3VnaCwg dGhlIHR5cGUgYCgnaW5wdXQgKiAnc3RhdGUpIC0+ICgnb3V0cHV0DQogICogJ3N0YXRlKScgbG9v a3MgYSBsb3QgbGlrZSBhIFttZWFseSBtYWNoaW5lXS4gYFN0cmVhbWluZy5TaW5rJyBpcyBhDQog IFttb29yZSBtYWNoaW5lXSwgd2hpY2ggaXMgc2xpZ2h0bHkgbGVzcyBnZW5lcmFsIGJlY2F1c2Ug dGhlIG91dHB1dA0KICB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiBpbnB1dCB2YWx1ZXMsIG9ubHkg b24gdGhlIHN0YXRlLg0KDQogIEkgdGhvdWdodCBhYm91dCBleHBvc2luZyBkaWZmZXJlbnQga2lu ZHMgb2Ygc2lua3MgaW4gc3RyZWFtaW5nLCBidXQNCiAgd2FudGVkIHRvIG1ha2Ugc3VyZSB0aGF0 IHRoZSBjb21tb24gdXNlIGNhc2VzIGFyZSBjb3ZlcmVkIGZpcnN0LiBJJ2xsDQogIGtlZXAgeW91 ciBjYXNlIGluIG1pbmQgZm9yIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4NCg0KDQpb YFN0cmVhbS5mcm9tJ10NCmh0dHBzOi8vZ2l0aHViLmNvbS9vZGlzLWxhYnMvc3RyZWFtaW5nL2Js b2IvMC44LjAvbGliL1N0cmVhbS5tbCNMNDINCg0KW2BTdHJlYW0ucnVuJ10NCmh0dHBzOi8vb2Rp cy1sYWJzLmdpdGh1Yi5pby9zdHJlYW1pbmcvc3RyZWFtaW5nL1N0cmVhbWluZy9TdHJlYW0vaW5k ZXguaHRtbCN2YWwtcnVuDQoNCltgRmxvdy50aHJvdWdoJ10NCmh0dHBzOi8vb2Rpcy1sYWJzLmdp dGh1Yi5pby9zdHJlYW1pbmcvc3RyZWFtaW5nL1N0cmVhbWluZy9GbG93L2luZGV4Lmh0bWwjdmFs LXRocm91Z2gNCg0KW21lYWx5IG1hY2hpbmVdIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtp L01lYWx5X21hY2hpbmUNCg0KW21vb3JlIG1hY2hpbmVdIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9y Zy93aWtpL01vb3JlX21hY2hpbmUNCg0KDQpTZW5pb3Igc29mdHdhcmUgZW5naW5lZXIgYXQgQXNl bWlvIGluIFR1bHNhLCBPSw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2 ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zZW5pb3Itc29mdHdhcmUtZW5naW5l ZXItYXQtYXNlbWlvLWluLXR1bHNhLW9rLzU5NzkvMV0NCg0KDQpTaW1vbiBHcm9uZGluIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UgYXJlIEFzZW1pbyBhbmQgb3VyIHRlYW0gb2YgZGF0 YSBzY2llbnRpc3RzLCBzb2Z0d2FyZSBlbmdpbmVlcnMsDQogIGFyY2hpdGVjdHMsIGFuZCBtYW5h Z2VtZW50IGNvbnN1bHRhbnRzIGFyZSB3b3JraW5nIHRvZ2V0aGVyIHRvIGFjaGlldmUNCiAgYSBu YXRpb253aWRlIGRhdGEgZWNvc3lzdGVtIGZvciBzb2NpYWwgZ29vZC4NCg0KICBZb3XigJlsbCBi ZSB3b3JraW5nIG9uIHRoZSBBc2VtaW8gQ29tbXVuaXR5IEludGVncmF0aW9uIFBsYXRmb3JtLiBJ dA0KICBmZWF0dXJlcyBzdGF0ZS1vZi10aGUtYXJ0IHByaXZhY3ktcHJlc2VydmluZywgcHJlLXBy b2Nlc3NpbmcgYW5kDQogIHBpcGVsaW5lIG1hbmFnZW1lbnQsIGFzIHdlbGwgYXMgcmVjb3JkIGxp bmthZ2UgdGVjaG5vbG9neS4NCg0KICBUaGUgYmFjayBlbmQgaXMgd3JpdHRlbiBpbiBPQ2FtbC4g VGhlIGZyb250IGVuZCBpcyBjb21waWxlZCBmcm9tIE9DYW1sDQogIHRvIEphdmFTY3JpcHQgYW5k IHVzZXMgYSBtb2Rlcm4gTVZDIGZyYW1ld29yay4gIFRoZSB3b3JrIHlvdeKAmWxsIGJlDQogIGRv aW5nIHdpbGwgdG91Y2ggbnVtZXJvdXMgdGVjaG5pY2FsIGRpc2NpcGxpbmVzLCBpbmNsdWRpbmcN CiAgY3J5cHRvZ3JhcGh5LCBkaXN0cmlidXRlZCBzeXN0ZW1zLCBsYW5ndWFnZSBkZXNpZ24gYW5k IGltcGxlbWVudGF0aW9uLA0KICBkYXRhIGFuYWx5dGljcywgYW5kIGRhdGEgdmlzdWFsaXphdGlv bnMuDQoNCiAgV2UgcHJlZmVyIGNhbmRpZGF0ZXMgd2lsbGluZyB0byByZWxvY2F0ZSwgYnV0IHdl IGNvdWxkIG1ha2UgYW4NCiAgZXhjZXB0aW9uIGZvciBhbiBleGNlcHRpb25hbCBjYW5kaWRhdGUu DQoNCiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb3IgdG8gYXBwbHksIHBsZWFzZSByZWZlciB0byBv dXIgU0UgbGlzdGluZzoNCiAgW2h0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vam9icy80MDEzODMv b2NhbWwtc2VuaW9yLXNvZnR3YXJlLWVuZ2luZWVyLWFzZW1pb10NCg0KDQpPdGhlciBPQ2FtbCBO ZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K RnJvbSB0aGUgb2NhbWxjb3JlIHBsYW5ldCBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVn YXRlZCBhdCBbT0NhbWwgUGxhbmV0XS4NCg0KICDigKIgW0ZyYW1hLUMgMjEuMCAoU2NhbmRpdW0p IGlzIG91dC4gRG93bmxvYWQgaXQgaGVyZS5dDQogIOKAoiBbRXZlcnkgcHJvb2YgYXNzaXN0YW50 OiBFcGlncmFtIDIgLSBBdXRvcHN5LCBPYml0dWFyeSwgQXBvbG9neV0NCg0KDQpbT0NhbWwgUGxh bmV0XSBodHRwOi8vb2NhbWwub3JnL2NvbW11bml0eS9wbGFuZXQvDQoNCltGcmFtYS1DIDIxLjAg KFNjYW5kaXVtKSBpcyBvdXQuIERvd25sb2FkIGl0IGhlcmUuXQ0KaHR0cDovL2ZyYW1hLWMuY29t L2luZGV4Lmh0bWwNCg0KW0V2ZXJ5IHByb29mIGFzc2lzdGFudDogRXBpZ3JhbSAyIC0gQXV0b3Bz eSwgT2JpdHVhcnksIEFwb2xvZ3ldDQpodHRwOi8vbWF0aC5hbmRyZWouY29tLzIwMjAvMDYvMDkv ZXBpZ3JhbS0yLWF1dG9wc3ktb2JpdHVhcnktYXBvbG9neS8NCg0KDQpPbGQgQ1dODQrilZDilZDi lZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4g W3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFr ZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNo aXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkg bWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0N Cg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1 ZS5vcmcNCg0KW3RoZSBhcmNoaXZlXSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLw0K DQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Y3duL2N3bi5yc3MNCg0KW29ubGluZV0gaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9j YW1sLW5ld3Mtd2Vla2x5Lw0KDQpbQWxhbiBTY2htaXR0XSBodHRwOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvDQoNCg== --===-=-= 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 June 09 to 16, 2020.

First release of monolith

Fran=C3=A7ois Pottier announced

It is my pleasure to announce the first release of Monolith.

Monolith offers facilities for testing an OCaml library (for instance, a da= ta structure implementation) by comparing it against a reference implementatio= n. It uses a form of black-box testing, and relies on afl-fuzz fo= r efficiency.

The user must describe what types and operations the library provides. Under the best circumstances, this requires 2-3 lines of code per type or operati= on. The user must also provide a reference implementation of the library.

Then, like a monkey typing on a keyboard, Monolith attempts to exercise the library in every possible way, in the hope of discovering a scenario where = the library behaves incorrectly. If such a scenario is discovered, it is printed in the form of an OCaml program, so as to help the user reproduce the probl= em.

At this time, a tutorial is not yet available. There is however an API documentation and a number of demos.

Repository: https://gitlab.inri= a.fr/fpottier/monolith

API Documentation: http://cambium.inria.fr/~fpottier/monolith/doc/monolith/Mono= lith/index.html

Installation:

opam update
opam install monolith

Sylvain Conchon joined OCamlPro's tea= m

OCamlPro announced

Sylvain Conchon joined OCamlPro's team as Formal Methods CSO. He created Al= t-Ergo and has been teaching OCaml in universities for about 20 years. He shares thoughts on interactions between= industry and research labs, and his vision of Formal methods and OCaml as language for the industry. Read his i= nterview on our blog: https://www.ocamlpro.com/2020/06/05/interview-sylvain= -conchon-cso-on-formal-methods/

First release of streaming

Rizo announced

It is my pleasure to announce the first public release of streaming =E2=80=93 a library for building efficient, incremental data processing pipelines that compose and don't leak resources.

I built streaming as a result of many experiments with different streaming = and iteration models for OCaml. There are multiple packages on OPAM that share some of the goals of streaming (we even have Stdlib.Seq now!), but none of them combine (1) excellent performance, (2) safe resource handling and (3) = pure functional style for combinators. Streaming solves these problems by implementing three basic and independent= models: sources, sinks and flows =E2=80=93 they represents different parts of the pipeline that correspond to producin= g, consuming and transforming elements. These models can be defined and composed independently to produce reusable = "streaming blocks".

The library defines a central Stream model that relies on sour= ces, sinks and flows. This model is a push-based iterator with performance characteristics similar to the iter = iterator, which has type ('a -> unit) -> unit, and is known for being very efficient. But unlike iter, it has a p= ure functional core (no need to use mutable state and exceptions for flow control!) and can handle resource allocation and clean = up in a lazy and deterministic way. All of this while having a slightly better performance for common stream operation= s.

For those who are curious about the performance characteristics of st= reaming and other models, I created a dedicated repository for stream benchmarks: https://github.com/rizo/streams-bench. In particular= , it includes a few simple benchmarks for Gen, Base.Sequence, S= tdlib.Seq, Iter, Streaming.Stream and Streaming.Source.

The library should soon be published on opam. In the meantime, I invite you= to read the docs and explore the code:

Guillaume Bury askec

That's great ! From the benchmarks, it looks like you hit a really good imp= lementation !

I've looked (maybe a bit fast) at the API documentation, and it is admitted= ly a bit outside the scope of streams/iterators, but I was wondering if there was some proper way to:

  • connect a sink to a source to create some loop
  • have some kind of fixpoint on streams

I guess it would always be possible to use some references and/or some comp= lex functions to encode these into the provided API, but I was wondering if there was a clean way to do it.

For a bit of context and explanation, what I have in mind is the case of a = program (let's say a type-checker or something close to the idea) with a persistent state, that should op= erate over a stream of inputs, which are top-level phrases, and produce some outputs, for instance print some result= for each correctly type-checked statement (and an error otherwise). The type-checker would basically be a function of type (`input * `sta= te) -> (`output * `state), and starting from an initial state, it would process an input element (giving the output= to some sink), and then the next input element would be processed with the state that was reached after processing= the previous element: the state would reach the sink of the flow, and then be inserted back into the source. Separately, imagine the language being type-checked has a notion of include= , then one of the step of the flow would be to expand each include into a stream of inputs/phrases, but each of the = phrases in this stream would need to be expanded, so a simple flat_map~/~flatten is not enough.

I already have a custom implementation that handle these features, but I wa= s wondering whether I could use streaming to handle most of the code linking all of the steps,= ^^

Rizo replied

if there was some proper way to:

  • connect a sink to a source to create some loop
  • have some kind of fixpoint on streams

Regarding the first point: yes! That's exactly the point of the Strea= m module. You see, sources are pull-based abstractions, while sinks are push-based. Source's type essentially says so= mething like "I might give you some data, if you ask", while sink's type is the opposite "I might take some data, if you give it to me". They are comple= tely and intentionally decoupled; it is Stream's role to drive the computation b= y pulling data from sources and pushing it into sinks. So the easiest way to connect them is:

Stream.=
(from srouce |> into sink)

Of course, that's not very useful per se, but it illustrates my point. Take= a look at the Stream.from code to see the implementation of the loop you're asking for. It does some extra work to ensure that resou= rces are correctly handled, but it should be clear what the loop is doing.

The stream types in the library are currently abstract because I didn't wan= t to commit to a particular representation just yet. If this is a problem for your use case, let me know, I'll expose = them in a Private module.

Regarding the second point: I'm not sure what you mean in practice by "fixp= oint on streams". I guess the one thing that could help implement something like that is the Stream.run function. It allows you to continue reading elements from a source even after a sink is = filled by returning a leftover stream. This stream can be used with Stream.run repeatedly.

Alternatively there's also Flow.through, which consumes input trying to fill sinks repeatedly and produces their aggregate= d values as a stream. Super useful for things like streaming parsing. Might even help with your use-case for top-l= evel phrases.

On a more general note though, the type ('input * 'state) -> ('out= put * 'state) looks a lot like a mealy machine. Streaming.Sink is a moore machine, which is slightly less general because the output values do not depend on input values, only on the state.

I thought about exposing different kinds of sinks in streaming, but wanted = to make sure that the common use cases are covered first. I'll keep your case in mind for future versions of the libra= ry.

Senior software engineer at Asemio in= Tulsa, OK

Simon Grondin announced

We are Asemio and our team of data scientists, software engineers, architec= ts, and management consultants are working together to achieve a nationwide data ecosystem for social good.

You=E2=80=99ll be working on the Asemio Community Integration Platform. It = features state-of-the-art privacy-preserving, pre-processing and pipeline management, as well as record linkage technolog= y.

The back end is written in OCaml. The front end is compiled from OCaml to J= avaScript and uses a modern MVC framework. The work you=E2=80=99ll be doing will touch numerous technical disciplines,= including cryptography, distributed systems, language design and implementation, data analytics, and data visualizations.

We prefer candidates willing to relocate, but we could make an exception fo= r an exceptional candidate.

For more information or to apply, please refer to our SE listing: https://stackoverflow.com/jobs/401383/ocaml-senior-software-en= gineer-asemio

Other OCaml News

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.

--===-=-=-- --=-=-=--