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 9B4B65D5 for ; Tue, 28 Jul 2020 16:58:01 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.75,406,1589234400"; d="asc'?scan'208,217";a="461678659" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 28 Jul 2020 18:57:58 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 315DCE0172; Tue, 28 Jul 2020 18:57:58 +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 35A21E016E for ; Tue, 28 Jul 2020 18:57:56 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=sJ0C=BH=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org IronPort-PHdr: =?us-ascii?q?9a23=3A2A9UXh0/bjVayjIUsmDT+DRfVm0co7zxezQtwd8Z?= =?us-ascii?q?sesUL/7xwZ3uMQTl6Ol3ixeRBMOHsqwC1bCd6vi7EUU7or+5+EgYd5JNUxJXwe?= =?us-ascii?q?43pCcHRPC/NEvgMfTxZDY7FskRHHVs/nW8LFQHUJ2mPw6arXK99yMdFQviPgRp?= =?us-ascii?q?OOv1BpTSj8Oq3Oyu5pHfeQpFiCe8bL9oLRi6swrdutQKjYZsN6081gbHrnxUdu?= =?us-ascii?q?pM2GhmP0iTnxHy5sex+J5s7SFdsO8/+sBDTKv3Yb02QaRXAzo6PW814tbrtQTY?= =?us-ascii?q?QguU+nQcSGQWnQFWDAXD8Rr3Q43+sir+tup6xSmaIcj7Rq06VDi+86tmTgLjhC?= =?us-ascii?q?cEOT4/7mHXi9dwjKNArxKluRN03oDVYIaPNPVjZaPWYNcWSGRdUspUUSFKH4Gy?= =?us-ascii?q?YJYVD+cZPehWsZTzqVUNoxSxGQahH+bvxiNSi3LswaE2z+YsHAfb1wIgBdIOt3?= =?us-ascii?q?HUoc3pOacWS++1yrTDwyjfYPNW3Df96ZTIcgw8qvyLR71wddDeyU81GwPeklqQ?= =?us-ascii?q?qYnlPzKJ1uQRqGWb9+1gVeavim47tQ5+vjivxsEtionQm4Ia1ErI9SJjwIY6PN?= =?us-ascii?q?C1TlNwbtG4HpVKrS6aK5d2Td04Q2FuoCs0xb8LtIC6cSYE1pgr2h7SZvyZfoWW?= =?us-ascii?q?/B7uSvidLzdliH9leb+xhxi//0a8x+HgSsW50ktHoyhbntXRqn0D2AHf586aQf?= =?us-ascii?q?Vz+Ueh3CyA1wHV6uxcOUA7i7bbK589wrEujpoTtkHDHirol0nsiq+ZaFkk9vCv?= =?us-ascii?q?6+v7eLrmo5ucO5VzigHkPaQigsO/AeUkMggOQmiU4v6w26Hk/U38WLlKgfw2kr?= =?us-ascii?q?XZsJDHPssXvLS1DBNS0oYm8xq/FSmp384FknkbLFJKZg+Ij4/1NFHVOvz4DPC/?= =?us-ascii?q?j0ytkDdt3fDGP6fuDo/DLnjZiLvhc6x95FRZyAUp1NxQ+4hYBa0GIPL2QkPxtc?= =?us-ascii?q?HXDx89Mwyw2ernD8991owYVGmSAaGZKLvfvUKW6u8rOeWAeZMZtTnnJ/Ur+/Li?= =?us-ascii?q?l3E0lFAFcaSq3JYbcm60E/tpLkmDfHbhgckNHX0XsgYjUeDnjkCJXyRJaHaoRa?= =?us-ascii?q?084yk2CIK4AofHQYCgmLmB3SimEpFMfmBGDVSMEHf0d4qaR/gMaCSSIs54kjwZ?= =?us-ascii?q?S7etUYgh1QuhtAPiyrpnKPTb+jEAuJ7+ytR44/ffmQwu+TF7FciQ3X2BQ3t6k2?= =?us-ascii?q?4HXzM22bpwoU15yleNy6h4hPlYGMRO6f1VTwk2KYbRz/d+BdzuRA/MZsqERlS+?= =?us-ascii?q?T9W+BjExStIww8MQbElhG9WiiBHD3zO3A7ALjbCLA4Y08q3E0nfrI8Zy0XDG2L?= =?us-ascii?q?M6j1Y6QstPMGymhrJj9wXIHIHJlFiZl6C2eqsCxy7B7mKDwGWBvU1CVw5wS6rF?= =?us-ascii?q?UWgFZkTKtdT5+l/CT7i2BLs7KARBzMqCJrJOat3ollVGWOzuOM/eYmK0g2e/Hw?= =?us-ascii?q?yExrKKbIrwemUSxj/RCEYek1NbwXHTfwwhAG3p92bBChRqClSpZU7wp6024nik?= =?us-ascii?q?SAV8h1WBcEtJ07uu5gVThPCNT/dV2agL7mNpoDxxGBO53snKI9uGvQtoOqtGJZ?= =?us-ascii?q?s251Jf/WbYrBBmeJu6JaF+j1oQdBQxsl69+Q9wD9BplcEs5EghzA9zNb7QhFpF?= =?us-ascii?q?fjXexpvwP7zLNkHq+xS+d6Pd2lffycubvKAV56Jr+B3YoAi1Gx96oD1c2N5P3i?= =?us-ascii?q?7HvsyWXjpXaor4VwMMzzY/v6vTO3hv/4TQxGFhOqmysybf1pQuHuR3k0/9Leca?= =?us-ascii?q?C7uNEUrJK+NfB8WqL7ZxyV25N1QcO+RD6KM/P8WnbuaLnqmxM7Q5xWP0vSF8+I?= =?us-ascii?q?l4l3m02W95Q+/M0YwCxqjHjAGASjH3gUznt5zn34deamNLEw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0APBgB1WCBffSIeaIFgglWBIYEYAV1VM?= =?us-ascii?q?iyENIFdhySJIIINhTuNV4VnEAEDAQcFGAEMBwECBAEBgVaBQYE1AheCCQIdBgE?= =?us-ascii?q?FMxMCEAEBBQEBAQIBAwMEARMBAQsUCIYMDEMBAQQLAYFiDBmDHQEYAQgEBmUjA?= =?us-ascii?q?xQBBgMCBA0BFwEUChcBEhQGAYMMgnwEAQqTW5o2GTV2fzOEOwEDAgGEZoEwEA0?= =?us-ascii?q?CE4EWAYFSg2tIgnMIgXWBYSYPgUw/gRGCEkkHbIJFDAsBAQEBAYEzBwEBVoJgg?= =?us-ascii?q?mAEj0YLAx0Ha4h/gSWBUoYTgiOPX1wpB4JigQgEC4ZFfIY6hCKGXYJ7gSKIJ5I?= =?us-ascii?q?GgR8hkXaBaIVtB3SBXoV8ikuETYFAKoFnDAczGjBDgmkJYA1ZjSIMIxeDToE+g?= =?us-ascii?q?SaBPDk7hUQ/MwIBAQEGLAIGAQcBAQMJdQEBBRMLAWODHYkXLIE+XAEB?= X-IPAS-Result: =?us-ascii?q?A0APBgB1WCBffSIeaIFgglWBIYEYAV1VMiyENIFdhySJIII?= =?us-ascii?q?NhTuNV4VnEAEDAQcFGAEMBwECBAEBgVaBQYE1AheCCQIdBgEFMxMCEAEBBQEBA?= =?us-ascii?q?QIBAwMEARMBAQsUCIYMDEMBAQQLAYFiDBmDHQEYAQgEBmUjAxQBBgMCBA0BFwE?= =?us-ascii?q?UChcBEhQGAYMMgnwEAQqTW5o2GTV2fzOEOwEDAgGEZoEwEA0CE4EWAYFSg2tIg?= =?us-ascii?q?nMIgXWBYSYPgUw/gRGCEkkHbIJFDAsBAQEBAYEzBwEBVoJggmAEj0YLAx0Ha4h?= =?us-ascii?q?/gSWBUoYTgiOPX1wpB4JigQgEC4ZFfIY6hCKGXYJ7gSKIJ5IGgR8hkXaBaIVtB?= =?us-ascii?q?3SBXoV8ikuETYFAKoFnDAczGjBDgmkJYA1ZjSIMIxeDToE+gSaBPDk7hUQ/MwI?= =?us-ascii?q?BAQEGLAIGAQcBAQMJdQEBBRMLAWODHYkXLIE+XAEB?= X-IronPort-AV: E=Sophos;i="5.75,406,1589234400"; d="asc'?scan'208,217";a="461678643" X-MGA-submission: =?us-ascii?q?MDF/EoAjXwHeTlnKR4a4vV3jY7HY7VI/LmNuWa?= =?us-ascii?q?+zi24Y66iOUXlT+F1bwQQuuw4efykCISFlDAiKhe01taV6JyvrCtYUPj?= =?us-ascii?q?zMo6PcR+fqXzsVuBSMIV5PWAkhp+/SxmtlFl3ixWQLxyj7YzEL2gbT+d?= =?us-ascii?q?fEhFwWSkIaoAPWKlsCnZou3w=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; 28 Jul 2020 18:57:54 +0200 Received: from set (lfbn-orl-1-1118-111.w86-244.abo.wanadoo.fr [86.244.182.111]) (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 49154564E5E; Tue, 28 Jul 2020 18:57:48 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 28 Jul 2020 18:57:16 +0200 Message-ID: <87a6zj37df.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 28 18:57:53 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=626F0564E82 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: 18207 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/BsSVW56ZmGBA0KO07S5ccFAl8gWO0ACgkQBA0KO07S 5cdQFQf/bU+ly9mHCxvTgJS4I00rs+xK8N8ZC7m+b552QNQtv1i/xFRCk+IBdYEX sqBugQGK477DH6MQWzRte7Ghsy/GTVObzHTfdL/ppgYXTH3Ui58hEKo+PkUsLXGu XBZInuOlz0BuBppaju5NB1uxSuTpLofRJjP7iVn8ELm3Eq+2eQQrXqK+oFTaKbB2 xcN5x08VGPWx2Gg+31wdaiv8snrRWv0uZlz13c4DOcWMXoeplOV2IwRckclSyEYV OMvwzvG7EL+mIh4NVltLjrnaQg5/JFb3kPVcIQx1HFlh8UjGZdSLAUj93Pdl02Cr gfpIOhS+LY4WHPUQJnDjMHQLcfRyWw== =3eZm -----END PGP SIGNATURE----- --==-=-=-- --=-=-= Content-Type: multipart/alternative; boundary="===-=-=" --===-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAyMSB0byAyOCwNCjIwMjAuDQoNCkFzIEkgd2lsbCBiZSBhd2F5IHdpdGggbm8g aW50ZXJuZXQgbmV4dCB3ZWVrLCB0aGUgbmV4dCBDV04gd2lsbCBiZSBvbg0KQXVndXN0IDExLg0K DQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCkVtYmVkZGVkIG9jYW1sIHRlbXBsYXRlcw0KUHJvcG9zYWw6IEFu b3RoZXIgd2F5IHRvIGRlYnVnIG1lbW9yeSBsZWFrcw0KQ2FtbHA1ICg4LjAwfmFscGhhMDEpIGFu ZCBwYV9wcHggKDAuMDEpDQpPQ2FtbCA0LjExLjAsIHRoaXJkIChhbmQgbGFzdD8pIGJldGEgcmVs ZWFzZQ0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCkVtYmVkZGVkIG9jYW1sIHRlbXBs YXRlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogW2h0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9lbWJlZGRlZC1vY2FtbC10ZW1wbGF0ZXMvNjEyNC8xXQ0KDQoNCkVtaWxlIFRyb3Rp Z25vbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gdmVyeSBoYXBweSB0 byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBvY2FtbC1lbWJlZGRlZC10ZW1wbGF0ZXMuDQoNCiAg VGhpcyBpcyBhIHRvb2wgc2ltaWxhciB0byBjYW1sbWl4LCBidXQgY2FtbG1peCB3YXMgbm90IHVw ZGF0ZWQgZm9yIDcNCiAgeWVhcnMsIGFuZCB0aGVyZSBpcyBubyBlYXN5IHdheSB0byBoYW5kbGUg YSBsb3Qgb2YgdGVtcGxhdGVzIChteQ0KICBjb21tYW5kIHRha2VzIGEgZGlyZWN0b3J5IGFzIGFu IGFyZ3VtZW50IGFuZCBnZW5lcmF0ZSBhbiBvY2FtbCBtb2R1bGUNCiAgYnkgZ29pbmcgdGhyb3Vn aCB0aGUgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5KSBJIGFsc28gY2hvb3NlZCB0byB1c2UgYQ0KICBz eW50YXggc2ltaWxhciB0byBFSlMsIGFuZCB0aGVyZSBpcyBhIHBweCBmb3IgaW5saW5lIEVNTC4N Cg0KICBZb3UgY2FuIGNoZWNrIGl0IG91dCBoZXJlIDoNCiAgW2h0dHBzOi8vZ2l0aHViLmNvbS9F bWlsZVRyb3RpZ25vbi9lbWJlZGRlZF9vY2FtbF90ZW1wbGF0ZXNdDQoNCiAgSGVyZSBpcyBhIG1v cmUgZXh0ZW5zaXZlIGV4ZW1wbGUgb2Ygd2hhdCBjYW4gYmUgZG9uZSB3aXRoIHRoaXMgOg0KICBb aHR0cHM6Ly9naXRodWIuY29tL0VtaWxlVHJvdGlnbm9uL3Jlc3VtZV9vZl9vY2FtbF0gKFRoaXMg cHJvamVjdA0KICBnZW5lcmF0ZSBteSByZXN1bWUvd2Vic2l0ZSBpbiBib3RoIGxhdGV4IGFuZCBo dG1sKS4NCg0KICBUaGlzIGlzIG15IGZpcnN0IG9wYW0gcGFja2FnZSA6IGZlZWRiYWNrIGlzIHZl cnkgbXVjaCB3ZWxjb21lLg0KDQoNClByb3Bvc2FsOiBBbm90aGVyIHdheSB0byBkZWJ1ZyBtZW1v cnkgbGVha3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIFtodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvcHJvcG9zYWwtYW5vdGhlci13YXktdG8tZGVidWctbWVtb3J5LWxlYWtz LzYxMzQvMV0NCg0KDQpKaW0gRmVocmxlIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIGBtZW1wcm9mJyBoZWxwcyB5b3UgZGlzY292ZXIgd2hl cmUgbWVtb3J5IHdhcyBhbGxvY2F0ZWQsIHdoaWNoIGlzDQogIGNlcnRhaW5seSB1c2VmdWwuICBI b3dldmVyLCB0aGF0IG1heSBub3QgYmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvDQogIGlzb2xhdGUg YSBsZWFrLiAgU29tZXRpbWVzIHlvdSdkIGxpa2UgdG8ga25vdyB3aGF0IHZhcmlhYmxlcyByZWZl ciB0bw0KICBleGNlc3NpdmUgYW1vdW50cyBvZiBtZW1vcnkuDQoNCiAgRm9yIHRoaXMsIHlvdSdk IHdhbnQgdG8gZXhhbWluZSBhbGwgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiByb290cyBhbmQNCiAg cmVwb3J0IGhvdyBtdWNoIG1lbW9yeSBpcyB1c2VkIGJ5IGVhY2guICBUaGlzIGlzIHVzZWZ1bCBp bmZvcm1hdGlvbiBpZg0KICB5b3UgY2FuIG1hcCBhIEdDIHJvb3QgYmFjayB0byBhIHNvdXJjZSBm aWxlIGFuZCB2YXJpYWJsZS4NCg0KICBJIHByb3RvdHlwZWQgY29kZSB0byBkbyB0aGF0IHRvIGhl bHAgd2l0aCBDb3EgYnVnDQogIFtodHRwczovL2dpdGh1Yi5jb20vY29xL2NvcS9pc3N1ZXMvMTI0 ODddLiAgSXQgbG9jYWxpemVkIHNldmVyYWwgbGVha3MNCiAgZW5vdWdoIGFjcm9zcyBvdmVyIDUw MCBzb3VyY2UgZmlsZXMgc28gdGhhdCB3ZSBjb3VsZCBmaW5kIGFuZCBmaXgNCiAgdGhlbS4gIEJ1 dCBteSBwcm90b3R5cGUgY29kZSBpcyBhIGJpdCBjcnVkZS4gIEknZCBsaWtlIHRvIGNsZWFuIGl0 IHVwDQogIGFuZCBzdWJtaXQgaXQgYXMgYSBQUi4gIFNpbmNlIHRoaXMgY291bGQgYmUgZG9uZSBp biB2YXJpb3VzIHdheXMsIEkNCiAgd2FudGVkIHRvIGdldCBzb21lIGRlc2lnbi9BUEkgZmVlZGJh Y2sgdXAgZnJvbnQgcmF0aGVyIHRoYW4gbWF5YmUNCiAgZG9pbmcgc29tZSBvZiBpdCB0d2ljZS4g IEFsc28gSSdkIGxpa2UgdG8gY29uZmlkZW50IHRoYXQgc3VjaCBhIFBSDQogIHdvdWxkIGJlIGFj Y2VwdGVkIGFuZCBtZXJnZWQgaW4gYSByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1l4oCTb3RoZXJ3 aXNlDQogIHdoeSBib3RoZXIuDQoNCiAgW2NhbWxfZG9fcm9vdHNdIHNob3dzIGhvdyB0byBhY2Nl c3MgdGhlIEdDIHJvb3RzLiAgVGhlcmUgYXJlIHNldmVyYWwNCiAgdHlwZXMgb2Ygcm9vdHM6DQog IOKAoiBnbG9iYWwgcm9vdHMsIGNvcnJlc3BvbmRpbmcgdG8gdG9wLWxldmVsIHZhcmlhYmxlcyBp biBzb3VyY2UgZmlsZXMNCiAg4oCiIGR5bmFtaWMgZ2xvYmFsIHJvb3RzDQogIOKAoiBzdGFjayBh bmQgbG9jYWwgcm9vdHMNCiAg4oCiIGdsb2JhbCBDIHJvb3RzDQogIOKAoiBmaW5hbGl6ZWQgdmFs dWVzDQogIOKAoiBtZW1wcm9mDQogIOKAoiBob29rDQoNCiAgKkFQSSAoaW4gR2MpOioNCg0KICDi lIzilIDilIDilIDilIANCiAg4pSCIHZhbCBwcmludF9nbG9iYWxfcmVhY2hhYmxlIDogb3V0X2No YW5uZWwgLT4gaW50IC0+IHVuaXQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgUHJpbnRzIGEgbGlz dCB0byBgb3V0X2NoYW5uZWwnIG9mIHRoZSBnbG9iYWwgcm9vdHMgdGhhdCByZWFjaCBtb3JlDQog IHRoYW4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd29yZHMuICBFYWNoIGl0ZW0gc2hvd3MgdGhl IG51bWJlciBvZg0KICByZWFjaGFibGUgd29yZHMsIHRoZSBhc3NvY2lhdGVkIGluZGV4IG9mIHRo ZSByb290IGluIHRoZSBgKmdsb2InIGZvcg0KICB0aGF0IGZpbGUgYW5kIHRoZSBuYW1lIG9mIHRo ZSBzb3VyY2UgZmlsZS4NCg0KICBTb21ldGhpbmcgbGlrZSB0aGlzIChidXQgd2l0aCBvbmx5IGZp bGVuYW1lcyByYXRoZXIgdGhhbiBwYXRobmFtZXMpOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDi lIIgICAxMDI2NzggZmllbGQgIDE3IHBsdWdpbnMvbHRhYy9wbHRhYy5tbA0KICDilIIgICAxMDI3 MzAgZmllbGQgIDE4IHBsdWdpbnMvbHRhYy9wbHRhYy5tbA0KICDilIIgICAxNjQ4MjQgZmllbGQg IDIwIHBsdWdpbnMvbHRhYy90YWNlbnYubWwNCiAg4pSCICAxNTQyODU3IGZpZWxkICAyNiBwbHVn aW5zL2x0YWMvdGFjZW52Lm1sDQogIOKUgiAzNTI1Mzc0MyBmaWVsZCAgNjUgc3RtL3N0bS5tbA0K ICDilIIgMzUyMDE5MTMgZmllbGQgICA4IHZlcm5hYy92ZXJuYWNzdGF0ZS5tbA0KICDilIIgIDg5 OTE4NjQgZmllbGQgIDI0IHZlcm5hYy9saWJyYXJ5Lm1sDQogIOKUgiAgIDExMjAzNSBmaWVsZCAg IDggdmVybmFjL2VncmFtbWwubWwNCiAg4pSCICA2MTQ1NDU0IGZpZWxkICA4NCB2ZXJuYWMvZGVj bGFyZW1vZHMubWwNCiAg4pSCICA2NDM1ODc4IGZpZWxkICA4OSB2ZXJuYWMvZGVjbGFyZW1vZHMu bWwNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgSSB3b3VsZCB1c2UgRUxGIGluZm9ybWF0aW9uIGlu IHRoZSBiaW5hcnkgZmlsZSB0byBtYXAgZnJvbSBgKmdsb2InDQogIGJhY2sgdG8gYSBmaWxlbmFt ZS4gIEZvciBleGFtcGxlLCB0aGUgYWRkcmVzcyBzeW1ib2wgb2YgdGhlIGVudHJ5DQogIGBjYW1s VGVzdCcgY29ycmVzcG9uZHMgdG8gYHRlc3QubWwnLiAgVGhpcyB3b3VsZCBvbmx5IHdvcmsgZm9y IGJpbmFyeQ0KICBleGVjdXRhYmxlcyBjb21waWxlZCB3aXRoIHRoZSBgLWcnIG9wdGlvbi4gIEl0 IHdvdWxkbid0IHdvcmsgZm9yDQogIGJ5dGUtY29tcGlsZWQgY29kZS4gIEl0IHdvdWxkIHByaW50 IGFuIGVycm9yIG1lc3NhZ2UgaWYgaXQncyBub3QgRUxGDQogIG9yIG5vdCBgLWcnLiAgQWxzbywg YmVpbmcgYSBsaXR0bGUgbGF6eSwgaG93IGVzc2VudGlhbCBpcyBpdCB0bw0KICBzdXBwb3J0IDMy LWJpdCBiaW5hcmllcz8gIChROiBXaGF0IGhhcHBlbnMgaWYgeW91IGhhdmUgMiBzb3VyY2UgZmls ZXMNCiAgd2l0aCB0aGUgc2FtZSBuYW1lIHRob3VnaCBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXM/ ICBXb3VsZCB0aGUgc3ltYm9sDQogIHRhYmxlIGRpc3Rpbmd1aXNoIHRoZW0/KQ0KDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgdmFsIGdldF9maWVsZF9pbmRleCA6IE9iai50IC0+IGludA0KICDi lJTilIDilIDilIDilIANCg0KICBSZXR1cm5zIHRoZSBgKmdsb2InIGluZGV4IG51bWJlciBmb3Ig dGhlIHRvcC1sZXZlbCB2YXJpYWJsZSAocGFzc2VkIGFzDQogIGBPYmoucmVwciB2YXInKS4gIEkg ZXhwZWN0IHRoZXJlJ3Mgbm8gd2F5IHRvIHJlY292ZXIgdmFyaWFibGUgbmFtZXMNCiAgZnJvbSB0 aGUgYCpnbG9iJyBpbmRleC4gIEluIG15IGV4cGVyaW1lbnRzLCBpdCBhcHBlYXJlZCB0aGF0IHRo ZQ0KICBlbnRyaWVzIGluIGAqZ2xvYicgd2VyZSBpbiB0aGUgc2FtZSBvcmRlciBhcyBhcyB0aGUg dmFyaWFibGUgYW5kDQogIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gIFRoaXMgd291bGQgbGV0IGEg ZGV2ZWxvcGVyIGRvIGEgYmluYXJ5IHNlYXJjaA0KICBpbiB0aGUgY29kZSB0byBsb2NhdGUgdGhl IHZhcmlhYmxlIHdoaWNoIGl0IHByb2JhYmx5IGEgbmVjZXNzaXR5IGZvcg0KICBsYXJnZSwgY29t cGxleCBmaWxlcyBzdWNoIGFzIENvcSdzIGBzdG0ubWwn4oCTMzMwMCBsaW5lcywgMTArIG1vZHVs ZXMNCiAgZGVmaW5lZCB3aXRoaW4gdGhlIGZpbGUuICAoSSBub3RpY2VkIHRoYXQgdmFyaWFibGVz IGRlZmluZWQgaW4gbW9kdWxlcw0KICBkZWZpbmVkIHdpdGhpbiB0aGUgc291cmNlIGZpbGUgd2Vy ZSBub3QgaW4gYCpnbG9iJy4gIEkgZXhwZWN0IHRoZXJlIGlzDQogIGEgcm9vdCBmb3IgdGhlIG1v ZHVsZSBhcyBhIHdob2xlIGFuZCB0aGF0IHRob3NlIHZhcmlhYmxlcyBjYW4gYmUNCiAgcmVhZGls eSBmb3VuZCB3aXRoaW4gdGhhdCByb290LikNCg0KICBUaGlzIHdvdWxkIG5lZWQgYW4gZXh0ZW5k ZWQgZXhwbGFuYXRpb24gaW4gYGdjLm1saScuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB2 YWwgcHJpbnRfc3RhY2tfcmVhY2hhYmxlIDogb3V0X2NoYW5uZWwgLT4gaW50IC0+IHVuaXQNCiAg 4pSU4pSA4pSA4pSA4pSADQoNCiAgUHJpbnRzIGEgYmFja3RyYWNlIHRvIGBvdXRfY2hhbm5lbCcg dGhhdCBhbHNvIHNob3dzIHdoaWNoIHJvb3RzIGZvcg0KICBlYWNoIGZyYW1lIHJlYWNoIG1vcmUg dGhhbiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB3b3Jkcy4gIChJJ2Qga2VlcA0KICB0aGUgIml0 ZW0gbnVtYmVycyIgc2luY2UgdGhlcmUncyBubyB3YXkgdG8gdHJhbnNsYXRlIHRoZW0gdG8gdmFy aWFibGVzDQogIGFuZCB0aGV5IG1pZ2h0IGdpdmUgc29tZSBjbHVlcy4pDQoNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiBDYWxsZWQgZnJvbSBmaWxlICJ0YWN0aWNzL3JlZGV4cHIubWwiIChpbmxp bmVkKSwgbGluZSAyMDcsIGNoYXJhY3RlcnMgMjktNDANCiAg4pSCICAzNTY3NTgxNTQgaXRlbSAg ICAwIChzdGFjaykNCiAg4pSCIENhbGxlZCBmcm9tIGZpbGUgInBsdWdpbnMvbHRhYy90YWNpbnRl cnAubWwiLCBsaW5lIDc1MiwgY2hhcmFjdGVycyA2LTUxDQogIOKUgiAgIDE3NjQ2NzE5IGl0ZW0g ICAgMCAoc3RhY2spDQogIOKUgiAgICAgMTE5MDQxIGl0ZW0gICAgMSAoc3RhY2spDQogIOKUgiBD YWxsZWQgZnJvbSBmaWxlICJlbmdpbmUvbG9naWNfbW9uYWQubWwiLCBsaW5lIDE5NSwgY2hhcmFj dGVycyAzOC00Mw0KICDilIIgICAgIDExOTEzMCBpdGVtICAgIDAgKHN0YWNrKQ0KICDilIIgIDM3 MzM3ODIzNyBpdGVtICAgIDEgKHN0YWNrKQ0KICDilJTilIDilIDilIDilIANCg0KICBBcyBpdCB0 dXJucyBvdXQsIDkwJSBvZiB0aGUgbWVtb3J5IGluIENvcSBpc3N1ZSBtZW50aW9uZWQgYWJvdmUg aXMNCiAgcmVhY2hhYmxlIG9ubHkgZnJvbSB0aGUgc3RhY2suDQoNCiAgSSBkaWRuJ3QgY29uc2lk ZXIgdGhlIG90aGVyIHR5cGVzIG9mIHJvb3RzIHlldCwgd2hpY2ggSSBkb24ndCBmdWxseQ0KICB1 bmRlcnN0YW5kLCBzdWNoIGFzIGxvY2FsIHJvb3RzLiAgSnVzdCBjb3ZlcmluZyBnbG9iYWwgYW5k IHN0YWNrIHJvb3RzDQogIHNlZW1zIGxpa2UgYSBnb29kIGNvbnRyaWJ1dGlvbi4gIER5bmFtaWMg Z2xvYmFsIHJvb3RzIG1heSBiZSBlYXN5IHRvDQogIGFkZCBpZiB0aGV5IGFyZSBvdGhlcndpc2Ug c2ltaWxhciB0byBnbG9iYWwgcm9vdHMuICBGb3IgdGhlIG90aGVycyBJDQogIGNvdWxkIHByaW50 IHRoZSByZWFjaGFibGUgd29yZHMsIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIGRpcmVjdCB0aGUN CiAgZGV2ZWxvcGVyIHRvIGxvb2sgYXQgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIGNvZGUsIGVz cGVjaWFsbHkgaWYgaXQncw0KICBpbiBDIGNvZGUuICBJIHN1cHBvc2UgYHByaW50X2dsb2JhbF9y ZWFjaGFibGUnIGFuZA0KICBgcHJpbnRfc3RhY2tfcmVhY2hhYmxlJyBjb3VsZCBiZSBhIHNpbmds ZSByb3V0aW5lIGFzIHdlbGwuICBUaGF0J3MNCiAgcHJvYmFibHkgYmV0dGVyLg0KDQogIExldCBt ZSBrbm93IHlvdXIgdGhvdWdodHMuDQoNCg0KW2NhbWxfZG9fcm9vdHNdDQpodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi84MDMyNjAzM2NiZWRmZTU5YzA2NjRlMzkxMmYyMTAxN2U5 NjhhMWU1L3J1bnRpbWUvcm9vdHNfbmF0LmMjTDM5OQ0KDQoNCkNhbWxwNSAoOC4wMH5hbHBoYTAx KSBhbmQgcGFfcHB4ICgwLjAxKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tY2FtbHA1LTgtMDAtYWxwaGEwMS1hbmQtcGEtcHB4LTAtMDEvNjE0 NC8xXQ0KDQoNCkNoZXQgTXVydGh5IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCmBDYW1scDUgKDguMDB+ YWxwaGEwMSknIGFuZCBgcGFfcHB4ICgwLjAxKScNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEknbSBw bGVhc2VkIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIHR3byByZWxhdGVkIHByb2plY3RzOg0K DQogIDEuIFtDYW1scDVdOiB2ZXJzaW9uIDguMDB+YWxwaGEwMSBpcyBhbiBhbHBoYSByZWxlYXNl IG9mIENhbWxwNSwgd2l0aA0KICAgICBmdWxsIHN1cHBvcnQgZm9yIE9DYW1sIHN5bnRheCB1cCB0 byB2ZXJzaW9uIDQuMTAuMCwgYXMgd2VsbCBhcw0KICAgICBtaW5pbWFsIGNvbXBhdGliaWxpdHkg d2l0aCB2ZXJzaW9uIDQuMTEuMC4gSW4gcGFydGljdWxhciB0aGVyZSBpcw0KICAgICBmdWxsIHN1 cHBvcnQgZm9yIFBQWCBhdHRyaWJ1dGVzIGFuZCBleHRlbnNpb25zLg0KDQogIDIuIFtwYV9wcHhd OiB2ZXJzaW9uIDAuMDEgaXMgYSByZS1pbXBsZW1lbnRhdGlvbiBvZiBhIGxhcmdlIG51bWJlciBv Zg0KICAgICBQUFggcmV3cml0ZXJzIChlLmcuIHBweF9kZXJpdmluZyAoc3RkIChzaG93LCBlcSwg bWFwLCBldGMpLCB5b2pzb24sDQogICAgIHNleHAsIGV0YyksIHBweF9pbXBvcnQsIHBweF9hc3Nl cnQsIG90aGVycykgb24gdG9wIG9mIENhbWxwNSwgYWxvbmcNCiAgICAgd2l0aCBhbiBpbmZyYXN0 cnVjdHVyZSBmb3IgZGV2ZWxvcGluZyBuZXcgb25lcy4NCg0KICBUaGlzIGFsbG93cyBwcm9qZWN0 cyB0byBjb21iaW5lIHRoZSBleGlzdGluZyBzdHlsZSBvZiBDYW1scDUgc3ludGF4DQogIGV4dGVu c2lvbiwgd2l0aCBQUFggcmV3cml0aW5nLCB3aXRob3V0IGhhdmluZyB0byBqdW1wIHRocnUgaG9v cHMgdG8NCiAgaW52b2tlIGNhbWxwNSBvbiBzb21lIGZpbGVzLCBhbmQgUFBYIHByb2Nlc3NvcnMg b24gb3RoZXJzLg0KDQogIENhbWxwNSBhbG9uZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGV4aXN0 aW5nIFBQWCByZXdyaXRlcnM6IENhbWxwNQ0KICBzeW50YXgtZXh0ZW5zaW9ucyAoZS5nLiAic3Ry ZWFtIHBhcnNlcnMiKSB3b3VsZCBiZSByZWplY3RlZCBieSB0aGUNCiAgT0NhbWwgcGFyc2VyLCBh bmQgUFBYIGV4dGVuc2lvbnMvYXR0cmlidXRlcyBhcmUgaWdub3JlZCBieSBDYW1scDUNCiAgKGFn YWluLCB3aXRob3V0IGBwYV9wcHgnKS4gIGBwYV9wcHgnIHByb3ZpZGVzIENhbWxwNS1jb21wYXRp YmxlDQogIHZlcnNpb25zIG9mIG1hbnkgZXhpc3RpbmcgUFBYIHJld3JpdGVycywgYXMgd2VsbCBh cyBuZXcgb25lcywgc28gdGhhdA0KICBvbmUgY2FuIHVzZSBDYW1scDUgc3ludGF4IGV4dGVuc2lv bnMgYXMgd2VsbCBhcyBQUFggcmV3cml0ZXJzLiAgSW4NCiAgYWRkaXRpb24sIHNvbWUgb2YgdGhl IHJlLWltcGxlbWVudGVkIHJld3JpdGVycyBhcmUgbW9yZS1wb3dlcmZ1bCB0aGFuDQogIHRoZWly IG9yaWdpbmFsIG5hbWVzYWtlcywgYW5kIHRoZXJlIGFyZSBuZXcgb25lcyB0aGF0IGFkZCBpbnRl cmVzdGluZw0KICBmdW5jdGlvbmFsaXR5Lg0KDQoNCltDYW1scDVdIGh0dHBzOi8vZ2l0aHViLmNv bS9jYW1scDUvY2FtbHA1DQoNCltwYV9wcHhdIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGV0bXVydGh5 L3BhX3BweA0KDQoNCkZvciBkZW1vY3JhdGl6aW5nIG1hY3JvLWV4dGVuc2lvbi1hdXRob3Jpbmcg aW4gT0NhbWwNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IFRMO0RSIFdyaXRpbmcgT0NhbWwgUFBYIHJld3JpdGVycyBpcyAqaGFyZCB3b3JrKi4gIFRoZXJl IGlzIGENCiAgY29tcGxpY2F0ZWQgaW5mcmFzdHJ1Y3R1cmUgdGhhdCBpcyBoYXJkIHRvIGV4cGxh aW4sIHRoZXJlIGFyZSBtdWx0aXBsZQ0KICBzdWNoIGluY29tcGF0aWJsZSBpbmZyYXN0cnVjdHVy ZXMgKG1heWJlIHRoZXNlIGFyZSBtZXJnaW5nPykgYW5kIGl0IGlzDQogIGhhcmQgZW5vdWdoIHRo YXQgbW9zdCBPY2FtbCBwcm9ncmFtbWVycyBkbyBub3Qgd3JpdGUgbWFjcm8tZXh0ZW5zaW9ucw0K ICBhcyBhIHBhcnQgb2YgdGhlaXIgcHJvamVjdHMuICBJIGJlbGlldmUgdGhhdCB1c2luZyBDYW1s cDUgYW5kIHBhX3BweA0KICBjYW4gbWFrZSBpdCBlYXNpZXIgdG8gd3JpdGUgbWFjcm8tZXh0ZW5z aW9ucywgdmlhOg0KDQogIDEuIHByb3ZpZGluZyBhIHNpbXBsZSB3YXkgb2YgdGhpbmtpbmcgYWJv dXQgYWRkaW5nIHlvdXIgZXh0ZW5zaW9uIHRvDQogICAgIHRoZSBwYXJzaW5nIHByb2Nlc3MuDQoN CiAgMi4gcHJvdmlkaW5nIHRyYW5zcGFyZW50IHRvb2xzIChlLmcuIHF1b3RhdGlvbnMpIGZvcg0K ICAgICBwYXR0ZXJuLW1hdGNoaW5nL2NvbnN0cnVjdGluZyBBU1QgZnJhZ21lbnRzDQoNCiAgRXhw bGFpbmVkIGJlbG93IGluIFtNYWNybyBFeHRlbnNpb25zIHdpdGgNCiAgUGFfcHB4XSgjbWFjcm8t ZXh0ZW5zaW9ucy13aXRoLXBhX3BweCkuDQoNCg0K4peKIFRoZSBvcmlnaW5hbCBhcmd1bWVudHMg YWdhaW5zdCBDYW1scDQNCg0KICBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYWdhaW5zdCB1c2luZyBD YW1scDQgYXMgYSBiYXNpcyBmb3INCiAgbWFjcm8tcHJlcHJvY2Vzc2luZyBpbiBPY2FtbCwgaGFk IHNldmVyYWwgcG9pbnRzIChJIGNhbid0IGZpbmQgdGhlDQogIG9yaWdpbmFsIGRvY3VtZW50LCBi dXQgZnJvbSBtZW1vcnkpOg0KDQogIDEuICpzeW50YXgtZXh0ZW5zaW9uKiBhcyB0aGUgYmFzaXMg b2YgbWFjcm8tZXh0ZW5zaW9uIGxlYWRzIHRvIGJyaXR0bGUNCiAgICAgIHN5bnRheDogbXVsdGlw bGUgc3ludGF4IGV4dGVuc2lvbnMgb2Z0ZW4gZG8gbm90IGNvbWJpbmUgd2VsbC4NCg0KICAyLiBh IGRpZmZlcmVudCBBU1QgdHlwZSB0aGFuIHRoZSBPY2FtbCBBU1QNCg0KICAzLiBhIGRpZmZlcmVu dCBwYXJzaW5nL3ByZXR0eS1wcmludGluZyBpbmZyYXN0cnVjdHVyZSwgd2hpY2ggbXVzdCBiZQ0K ICAgICBtYWludGFpbmVkIGFsb25nc2lkZSBvZiBPY2FtbCdzIG93biBwYXJzZXIvcHJldHR5LXBy aW50ZXIuDQoNCiAgNC4gQSBuZXcgYW5kIGNvbXBsaWNhdGVkIHNldCBvZiBBUElzIGFyZSByZXF1 aXJlZCB0byB3cml0ZSBzeW50YXgNCiAgICAgZXh0ZW5zaW9ucy4NCg0KICBUbyB0aGlzLCBJJ2xs IGFkZA0KDQogIDEuIENhbWxwNCB3YXMgKmZvcmtlZCogZnJvbSBDYW1scDUsIHRoaW5ncyB3ZXJl IGNoYW5nZWQsIGFuZCBoZW5jZSwNCiAgICAgQ2FtbHA0IGxvc3QgdGhlIGNvbnRyaWJ1dGlvbiBv ZiBpdHMgb3JpZ2luYWwgYXV0aG9yLiAgSGVuY2UsDQogICAgIG1haW50YWluaW5nIENhbWxwNCB3 YXMgYWx3YXlzIGxhYm9yIHRoYXQgZmVsbCBvbiB0aGUgT2NhbWwNCiAgICAgdGVhbS4gW01heWJl IHRoaXMgZG9lc24ndCBtYXR0ZXIsIGJ1dCBpdCBjb3VudHMgZm9yIHNvbWV0aGluZy5dDQoNCg0K 4peKIEFzc2Vzc2luZyB0aGUgYXJndW1lbnRzLCB3aXRoIHNvbWUgaGluZHNpZ2h0DQoNCiAgMS4g KnN5bnRheC1leHRlbnNpb24qIGFzIHRoZSBiYXNpcyBvZiBtYWNyby1leHRlbnNpb24gbGVhZHMg dG8gYnJpdHRsZQ0KICAgICAgc3ludGF4OiBtdWx0aXBsZSBzeW50YXggZXh0ZW5zaW9ucyBvZnRl biBkbyBub3QgY29tYmluZSB3ZWxsLg0KDQogICAgIEluIHJldHJvc3BlY3QsIHRoaXMgaXMgcXVp dGUgdmFsaWQ6IGV2ZW4gaWYgb25lIHByZWZlcnMgYW5kIGVuam95cw0KICAgICBMTCgxKSBncmFt bWFycyBhbmQgcGFyc2luZywgd2hlbiBtdWx0aXBsZSBhdXRob3JzIHdyaXRlDQogICAgIGdyYW1t YXItZXh0ZW5zaW9ucyB3aGljaCBhcmUgb25seSBjb21iaW5lZCBieSB0aGlyZC1wYXJ0eSBwcm9q ZWN0cywNCiAgICAgdGhlIGNvbmRpdGlvbnMgYXJlIHBlcmZlY3QgZm9yIGNoYW9zLCBhbmQgb2Yg YSBzb3J0IHRoYXQNCiAgICAgcHJvamVjdC1hdXRob3JzIHNpbXBseSBzaG91bGRuJ3QgaGF2ZSB0 byBzb3J0IG91dC4gIEFuZCB0aGlzIGNoYW9zDQogICAgIGlzIG9mIGEgZGlmZmVyZW50IGZvcm0s IHRoYW4gbWVyZWx5IGhhdmluZyB0d28gUFBYIHJld3JpdGVycyB1c2UNCiAgICAgdGhlIHNhbWUg YXR0cmlidXRlL2V4dGVuc2lvbi1uYW1lcyAod2hpY2ggaXMsIGFyZ3VhYmx5LCBlYXNpbHkNCiAg ICAgZGV0ZWN0YWJsZSB3aXRoIHNvbWUgc3RyYWlnaHRmb3J3YXJkIHByZWRlY2xhcmF0aW9uKS4N Cg0KICAyLiBDYW1scDQvNSBoYXMgYSBkaWZmZXJlbnQgQVNUIHR5cGUgdGhhbiB0aGUgT2NhbWwg QVNUDQoNCiAgICAgT3ZlciB0aW1lLCB0aGUgUFBYIGF1dGhvcnMgdGhlbXNlbHZlcyBoYXZlIHNs b3dseSBzdGFydGVkIHRvDQogICAgIGNvbmNsdWRlIHRoYXQgdGhlIGN1cnJlbnQgcmVsaWFuY2Ug b24gdGhlIE9jYW1sIEFTVCBpcyBmcmF1Z2h0IHdpdGgNCiAgICAgcHJvYmxlbXMuICBUaGUgIkZ1 dHVyZSBvZiBQUFgiIGRpc2N1c3Npb24gdGhyZWFkIHRhbGtzIGFib3V0IHVzaW5nDQogICAgIHNv bWV0aGluZyBsaWtlIHMtZXhwcmVzc2lvbnMsIGFuZCBtb3JlIGdlbmVyYWxseSBhYm91dCBhDQog ICAgIG1vcmUtZmxleGlibGUgQVNUIHR5cGUuDQoNCiAgMy4gYSBkaWZmZXJlbnQgcGFyc2luZy9w cmV0dHktcHJpbnRpbmcgaW5mcmFzdHJ1Y3R1cmUsIHdoaWNoIG11c3QgYmUNCiAgICAgbWFpbnRh aW5lZCBhbG9uZ3NpZGUgb2YgT2NhbWwncyBvd24gcGFyc2VyL3ByZXR0eS1wcmludGVyLg0KDQog ICAgIEEgZGlmZmVyZW50IEFTVCB0eXBlIG5lY2Vzc2FyaWx5IG1lYW5zIGEgZGlmZmVyZW50DQog ICAgIHBhcnNlci9wcmV0dHktcHJpbnRlci4gIE9mIGNvdXJzZSwgb25lIGNvdWxkIG1vZGlmeSBP Y2FtbCdzIFlBQ0MNCiAgICAgcGFyc2VyIHRvIHByb2R1Y2UgQ2FtbHA1IEFTVHMsIGJ1dCB0aGlz IGlzIGEgbWlub3IgcG9pbnQuDQoNCiAgNC4gQSBuZXcgYW5kIGNvbXBsaWNhdGVkIHNldCBvZiBB UElzIGFyZSByZXF1aXJlZCB0byB3cml0ZSBzeW50YXgNCiAgICAgZXh0ZW5zaW9ucy4NCg0KICAg ICBXaXRoIHRpbWUsIGl0J3MgY2xlYXIgdGhhdCBQUFggaGFzIHByb2R1Y2VkIHRoZSBzYW1lIHRo aW5nLg0KDQogIDUuIE1haW50YWluaW5nIENhbWxwNCB3YXMgYWx3YXlzIGxhYm9yIHRoYXQgZmVs bCBvbiB0aGUgT2NhbWwgdGVhbS4NCg0KICAgICBUaGUgc2FtZSBhcmd1bWVudCAodGhhdCBlYWNo IGNoYW5nZSB0byB0aGUgT2NhbWwgQVNUIHJlcXVpcmVzIHdvcmsNCiAgICAgdG8gdXBkYXRlIENh bWxwNSkgY2FuIGJlIG1hZGUgZm9yIFBQWCAoc3BlY2lmaWNhbGx5LCB0aGlzIGlzIHRoZQ0KICAg ICByYWlzb24gZCdldHJlIG9mIG9jYW1sLW1pZ3JhdGUtcGFyc2V0cmVlKS4gIEFtdXNpbmdseSwg b25lIGNvdWxkDQogICAgIGltYWdpbmUgdXNpbmcgb2NhbWwtbWlncmF0ZS1wYXJzZXRyZWUgYXMg dGhlIGJhc2lzIGZvciBtYWtpbmcNCiAgICAgQ2FtbHA1IE9DYW1sLXZlcnNpb24taW5kZXBlbmRl bnQsIHRvby4gIFRoYXQgaXMsIHRoZSAiYmFja2VuZCIgb2YNCiAgICAgQ2FtbHA1IGNvdWxkIHVz ZSBvY2FtbC1taWdyYXRlLXBhcnNldHJlZSB0byBwcm9kdWNlIEFTVHMgZm9yIGENCiAgICAgdmVy c2lvbiBvZiBPQ2FtbCBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIG9uIHdoaWNoIGl0IHdhcyBjb21w aWxlZC4NCg0KDQpBcmd1bWVudHMgYWdhaW5zdCB0aGUgY3VycmVudCBBUEkocykgb2YgUFBYIHJl d3JpdGluZw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAgVGhlIG92ZXJhbGwgYXJndW1lbnQgaXMgdGhhdCBpdCdzIHRvbyBjb21wbGljYXRlZCBmb3Ig bW9zdCBPQ2FtbA0KICBwcm9ncmFtbWVycyB0byB3cml0ZSB0aGVpciBvd24gZXh0ZW5zaW9uczsg d2hhdCB3ZSBzZWUgaW5zdGVhZCBvZiBhDQogIGhlYWx0aHkgZWNvc3lzdGVtIG9mIG1hbnkgYXV0 aG9ycyB3cml0aW5nIGFuZCBoZWxwaW5nLWltcHJvdmUgUFBYDQogIHJld3JpdGVycywgaXMgYSBz bWFsbCBudW1iZXIgb2YgcmV3cml0ZXJzLCBtb3N0bHkgd3JpdHRlbiBieSBKYW5lDQogIFN0cmVl dCBhbmQgcGVyaGFwcyBvbmUgb3IgdHdvIG90aGVyIHNob3BzLiAgVGhlcmUgYXJlIGEgZmV3IGJp Zw0KICByZWFzb25zIHdoeSB0aGlzIGlzIHRoZSBjYXNlICh3aGljaCBjb3JyZXNwb25kIHRvIHRo ZSByZXNwb25zZXMNCiAgYWJvdmUpLCBidXQgb25lIHRoYXQgaXNuJ3QgbWVudGlvbmVkIGlzOg0K DQogIDEuIFdoZW4gdGhlICJleHRyYSBkYXRhIiBvZiBhIFBQWCBleHRlbnNpb24gb3IgYXR0cmli dXRlIGlzDQogICAgIGVhc2lseS1leHByZXNzZWQgd2l0aCB0aGUgZml4ZWQgc3ludGF4IG9mIFBQ WCBwYXlsb2FkcywgYWxsIGlzDQogICAgIGB+d2VsbH4nIG9rLCBidXQgY2VydGFpbmx5IG5vdCBp biBncmVhdCBzaGFwZS4gIEhlcmUncyBhbiBleGFtcGxlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0K ICDilIIgdHlwZSBwYWNrYWdlX3R5cGUgPQ0KICDilIIgWyVpbXBvcnQ6IFBhcnNldHJlZS5wYWNr YWdlX3R5cGUNCiAg4pSCIAkgIFtAd2l0aCBjb3JlX3R5cGUgICAgOj0gUGFyc2V0cmVlLmNvcmVf dHlwZSBbQHByaW50ZXIgUHByaW50YXN0LmNvcmVfdHlwZV07DQogIOKUgiAJCSBBc3R0eXBlcy5s b2MgOj0gQXN0dHlwZXMubG9jIFtAcG9seXByaW50ZXIgZnVuIHBwIGZtdCB4IC0+IHBwIGZtdCB4 LkFzdHR5cGVzLnR4dF07DQogIOKUgiAJCSBMb25naWRlbnQudCAgOj0gTG9uZ2lkZW50LnQgW0Bw cmludGVyIHBwX2xvbmdpZGVudF1dXQ0KICDilIIgW0BAZGVyaXZpbmcgc2hvd10NCiAg4pSU4pSA 4pSA4pSA4pSADQoNCiAgVGhlIGV4cHJlc3Npb24tc3ludGF4IG9mIGFzc2lnbm1lbnQgaXMgdXNl ZCB0byBleHByZXNzIHR5cGUtZXhwcmVzc2lvbg0KICByZXdyaXRlcy4gIEFuZCB0aGlzIGlzIG5l Y2VzYXJpbHkgbGltaXRlZCwgYmVjYXVzZSB3ZSBjYW5ub3QgKGZvcg0KICBleGFtcGxlKSBzcGVj aWZ5IGxlZnQtaGFuZC1zaXplcyB0aGF0IGFyZSB0eXBlLWV4cHJlc3Npb25zIHdpdGgNCiAgdmFy aWFibGVzLiAgSXQncyBhIHBlcnZlcnNpb24gb2YgdGhlIHN5bnRheCwgd2hlbiB3aGF0IHdlIHJl YWxseSB3YW50DQogIHRvIGhhdmUgaXMgc29tZXRoaW5nIHRoYXQgaXMgcHJlY2lzZTogIm1hcCB0 aGlzIHR5cGUtZXhwcmVzc2lvbiB0bw0KICB0aGF0IHR5cGUtZXhwcmVzc2lvbiIuDQoNCiAgTm93 LCB3aXRoIHRoZSBuZXcgT2NhbWwgNC4xMS4wIHN5bnRheCwgdGhlcmUncyBhIChwYXJ0aWFsKSBz b2x1dGlvbjoNCiAgdXNlICJyYXctc3RyaW5nLWV4dGVuc2lvbnMiIGxpa2UgYHslZm9vfGFyZ2xl fH0nLiAgVGhpcyBpcyB0aGUgc2FtZSBhcw0KICBgWyVmb28ge3xhcmdsZXx9XScuICBUaGlzIHJl bGllcyBvbiB0aGUgUFBYIGV4dGVuc2lvbiB0byBwYXJzZSB0aGUNCiAgcGF5bG9hZC4gIEJ1dCB0 aGVyZSBhcmUgcHJvYmxlbXM6DQoNCiAgMS4gT2YgY291cnNlLCB0aGVyZSdzIG5vIGVxdWl2YWxl bnQgYHtAZm9vfGFyZ2xlfH0nIChhbmQgIkBAIiwgIkBAQCINCiAgICAgb2YgY291cnNlKSBmb3Ig YXR0cmlidXRlcy4NCg0KICAyLiBJZiB0aGUgcGF5bG9hZCBpbiB0aGF0IHN0cmluZyBkb2Vzbid0 ICppdHNlbGYqIGNvcnJlc3BvbmQgdG8gc29tZQ0KICAgICBwYXJzZWFibGUgT2NhbWwgQVNUIHR5 cGUsIHRoZW4gYWdhaW4sIHdlJ3JlIHN0dWNrOiB3ZSBoYXZlIHRvDQogICAgIGNvYmJsZSB0b2dl dGhlciBhIHBhcnNlciBpbnN0ZWFkIG9mIGJlaW5nIGFibGUgdG8gbWVyZWx5IGV4dGVuZCB0aGUN CiAgICAgcGFyc2VyIG9mIE9jYW1sIHRvIGRlYWwgd2l0aCB0aGUgY2FzZS4NCg0KICBOb3RlIHdl bGwgdGhhdCBJJ20gbm90IHNheWluZyB0aGF0IHdlIHNob3VsZCBleHRlbmQgdGhlIHBhcnNpbmcg cnVsZXMNCiAgb2YgdGhlIE9jYW1sIGxhbmd1YWdlLiAgUmF0aGVyLCB0aGF0IHdpdGggYW4gKmV4 dGVuc2libGUgcGFyc2VyKg0KICAoaGVuY2UsIExMKDEpKSB3ZSBjYW4gYWRkIG5ldyBub250ZXJt aW5hbHMsIGFkZCBydWxlcyB0aGF0IHJlZmVyZW5jZQ0KICBleGlzdGluZyBub250ZXJtaW5hbHMs IGFuZCB0aGVyZWJ5IGdldCBhbiBleGFjdCBzeW50YXggKGUuZy4pIGZvciB0aGUNCiAgYHBweF9p bXBvcnQnIGV4YW1wbGUgYWJvdmUuICBUaGF0IG5ldyBub250ZXJtaW5hbCBpcyB1c2VkICpvbmx5 KiBpbg0KICBwYXJzaW5nIHRoZSBwYXlsb2FkIOKAkyBub3doZXJlIGVsc2Ug4oCTIHNvIHdlIGhh dmVuJ3QgaW50cm9kdWNlZCBleGFtcGxlcw0KICBvZiBvYmplY3Rpb24gIzEgYWJvdmUuDQoNCiAg QW5kIGl0J3Mgbm90IGV2ZW4gdmVyeSBoYXJkLg0KDQoNCk1hY3JvIEV4dGVuc2lvbnMgd2l0aCBQ YV9wcHgNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBiYXNpYyB0aGVzaXMg b2YgYHBhX3BweCcgaXMgImxldCdzIG5vdCB0aHJvdyB0aGUgYmFieSBvdXQgd2l0aCB0aGUNCiAg YmF0aHdhdGVyIi4gIENhbWxwNSBoYXMgYSBsb3Qgb2YgdmVyeSB2YWx1YWJsZSBpbmZyYXN0cnVj dHVyZSB0aGF0IGNhbg0KICBiZSB1c2VkIHRvIG1ha2Ugd3JpdGluZyBtYWNyby1wcmVwcm9jZXNz b3JzIG11Y2ggZWFzaWVyLiAgYHBhX3BweCcNCiAgYWRkcyBhIGZldyBtb3JlLg0KDQogIDEuIFF1 b3RhdGlvbnMgZm9yIHBhdHRlcm5zIGFuZCBleHByZXNzaW9ucyBvdmVyIGFsbCBpbXBvcnRhbnQg T0NhbWwNCiAgICAgQVNUIHR5cGVzLg0KDQogIDIuICJleHRlbnNpYmxlIGZ1bmN0aW9ucyIgdG8g bWFrZSB0aGUgcHJvY2VzcyBvZiByZWN1cnNpbmcgZG93biB0aGUNCiAgICAgQVNUIHRyYW5zcGFy ZW50LCBhbmQgdGhlIG1lYW5pbmcgb2YgYWRkaW5nIGNvZGUgdG8gdGhhdCBwcm9jZXNzDQogICAg IGVxdWFsbHkgdHJhbnNwYXJlbnQuDQoNCiAgMy4gYHBhX3BweCcgaW50cm9kdWNlcyAicGFzc2Vz IiBhbmQgYWxsb3dzIGVhY2ggZXh0ZW5zaW9uIHRvIHJlZ2lzdGVyDQogICAgIHdoaWNoIG90aGVy IGV4dGVuc2lvbnMgaXQgbXVzdCBmb2xsb3csIGFuZCB3aGljaCBtYXkgZm9sbG93IGl0Ow0KICAg ICB0aGVuIGBwYV9wcHgnIHRvcG9sb2dpY2FsbHkgc29ydHMgdGhlbSwgc28gdGhlcmUncyBubyBu ZWVkIGZvcg0KICAgICBwcm9qZWN0LWF1dGhvcnMgdG8gZmlndXJlIG91dCBob3cgdG8gb3JkZXIg dGhlaXIgUFBYIGV4dGVuc2lvbg0KICAgICBpbnZvY2F0aW9ucy4NCg0KICBBcyBhbiBleGFtcGxl IG9mIGEgUFBYIHJld3JpdGVyIGJhc2VkIG9uIGBwYV9wcHgnLCBoZXJlJ3MNCiAgW3BhX3BweC5o ZXJlXSBmcm9tIHRoZSBgcGFfcHB4JyB0dXRvcmlhbC4gIEluIHRoYXQgZXhhbXBsZSwgeW91J2xs IHNlZQ0KICB0aGF0IENhbWxwNSBpbmZyYXN0cnVjdHVyZSBpcyB1c2VkIHRvIG1ha2UgdGhpbmdz IGVhc3k6DQoNCiAgMS4gcXVvdGF0aW9ucyBhcmUgdXNlZCB0byBib3RoIGJ1aWxkIHRoZSBvdXRw dXQgQVNUIGZyYWdtZW50LCBhbmQgdG8NCiAgICAgcGF0dGVybi1tYXRjaCBvbiBpbnB1dHMuDQoN CiAgMi4gdGhlICJleHRlbnNpYmxlIGZ1bmN0aW9ucyIgYXJlIHVzZWQgdG8gYWRkIG91ciBsaXR0 bGUgYml0IG9mDQogICAgIHJld3JpdGVyIHRvIHRoZSB0b3AtZG93biByZWN1cnNpb24uDQoNCiAg My4gYW5kIHdlIGRlY2xhcmUgb3VyIHJld3JpdGVyIHRvIHRoZSBpbmZyYXN0cnVjdHVyZSAod2Ug ZG9uJ3Qgc3BlY2lmeQ0KICAgICB3aGF0IHBhc3NlcyBpdCBtdXN0IGNvbWUgYmVmb3JlIG9yIGFm dGVyLCBzaW5jZSBgcGFfcHB4LmhlcmUnIGlzIHNvDQogICAgIHNpbXBsZSkuDQoNCg0KW3BhX3Bw eC5oZXJlXQ0KaHR0cHM6Ly9wYS1wcHgucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L3R1dG9yaWFs Lmh0bWwjYW4tZXhhbXBsZS1wcHgtcmV3cml0ZXItYmFzZWQtb24tcGEtcHB4DQoNCg0KQ29uY2x1 c2lvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSSdtIG5vdCB0cnlpbmcg dG8gY29udmluY2UgeW91IHRvIHN3aXRjaCBhd2F5IGZyb20gUFBYIHRvIENhbWxwNS4NCiAgUGVy aGFwcywgSSdtIG5vdCBldmVuIG1lcmVseSBhcmd1aW5nIHRoYXQgeW91IHNob3VsZCB1c2UgYHBh X3BweCcgYW5kDQogIGF1dGhvciBuZXcgbWFjcm8tZXh0ZW5zaW9ucyBvbiBpdC4gIEJ1dCBJICph bSogYXJndWluZyB0aGF0IHRoZQ0KICBmZWF0dXJlcyBvZg0KDQogIDEuIHF1b3RhdGlvbnMsIHdp dGggYW50aXF1b3RhdGlvbnMgaW4gYXMgbWFueSBwbGFjZXMgYXMgcG9zc2libGUsIGFuZA0KICAg ICBoZW5jZSwgKmluIHBsYWNlcyB3aGVyZSBPY2FtbCBpZGVudGlmaWVycyBhcmUgbm90IHBlcm1p dHRlZCouDQoNCiAgMi4gZmFjaWxpdGllcyBsaWtlICJleHRlbnNpYmxlIGZ1bmN0aW9ucyIsIHdp dGggc3ludGF4IHN1cHBvcnQgZm9yDQogICAgIHRoZW0NCg0KICAzLiBhIG5ldyBBU1QgdHlwZSwg dGhhdCBpcyBzdWl0YWJsZSBmb3IgbWFjcm8tcHJlcHJvY2Vzc2luZywgYnV0IGlzbid0DQogICAg IG1lcmVseSAicy1leHByZXNzaW9ucyIgKGFmdGVyIGFsbCwgdGhlcmUncyBhIHJlYXNvbiB3ZSBh bGwgdXNlDQogICAgIHN0cm9uZ2x5LXR5cGVkIGxhbmd1YWdlcykNCg0KICA0LiBhbiBleHRlbnNp YmxlIHBhcnNlciBmb3IgdGhlIE9jYW1sIGxhbmd1YWdlLCB1c2FibGUgaW4gUFBYDQogICAgIGF0 dHJpYnV0ZS9leHRlbnNpb24gcGF5bG9hZHMNCg0KICBhcmUgaW1wb3J0YW50IGFuZCB2YWx1YWJs ZSwgYW5kIGEgUFBYIHJld3JpdGVyIGluZnJhc3RydWN0dXJlIHRoYXQNCiAgbWFrZXMgaXQgcG9z c2libGUgZm9yIHRoZSBtYXNzZXMgdG8gd3JpdGUgdGhlaXIgb3duIG1hY3JvLWV4dGVuc2lvbnMs DQogIGlzIGdvaW5nIHRvIGluY29ycG9yYXRlIHRoZXNlIHRoaW5ncy4NCg0KDQpPQ2FtbCA0LjEx LjAsIHRoaXJkIChhbmQgbGFzdD8pIGJldGEgcmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC00LTExLTAt dGhpcmQtYW5kLWxhc3QtYmV0YS1yZWxlYXNlLzYxNDkvMV0NCg0KDQpvY3RhY2hyb24gYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBUaGUgcmVsZWFzZSBvZiBPQ2FtbCA0LjExLjAgaXMgbmVhci4gIEFzIG9uZSBz dGVwIGZ1cnRoZXIgaW4gdGhpcw0KICBkaXJlY3Rpb24sIHdlIGhhdmUgcHVibGlzaGVkIGEgdGhp cmQgYW5kIHBvdGVudGlhbGx5IGxhc3QgYmV0YQ0KICByZWxlYXNlLg0KDQogIFRoaXMgbmV3IHJl bGVhc2UgZml4ZXMgYW4gaW5mcmVxdWVudCBiZXN0LWZpdCBhbGxvY2F0b3IgYnVnIGFuZCBhbg0K ICBpc3N1ZSB3aXRoIGZsb2F0aW5nLXBvaW50IHNvZnR3YXJlIGVtdWxhdGlvbiBpbiB0aGUgQVJN IEVBQkkgcG9ydC4gIE9uDQogIHRoZSBlY29zeXN0ZW0gc2lkZSwgbWVybGluIGlzIG5vdyBhdmFp bGFibGUgZm9yIHRoaXMgbmV3IHZlcnNpb24gb2YNCiAgT0NhbWwuICBUaGUgY29tcGF0aWJpbGl0 eSBvZiB0aGUgb3BhbSBlY29zeXN0ZW0gd2l0aCBPQ2FtbCA0LjExLjAgaXMNCiAgY3VycmVudGx5 IGdvb2QsIGFuZCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gdGVzdCB0aGlzIGJldGEgd2l0aG91 dA0KICB0b28gbXVjaCB0cm91YmxlLg0KDQogIFRoZSBzb3VyY2UgY29kZSBpcyBhdmFpbGFibGUg YXQgdGhlc2UgYWRkcmVzc2VzOg0KDQogIFtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwv YXJjaGl2ZS80LjExLjArYmV0YTMudGFyLmd6XQ0KICBbaHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1 Yi9kaXN0cmliL29jYW1sLTQuMTEvb2NhbWwtNC4xMS4wK2JldGEzLnRhci5nel0NCg0KICBUaGUg Y29tcGlsZXIgY2FuIGFsc28gYmUgaW5zdGFsbGVkIGFzIGFuIE9QQU0gc3dpdGNoIHdpdGggb25l IG9mIHRoZQ0KICBmb2xsb3dpbmcgY29tbWFuZHM6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg b3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSBvY2FtbC12YXJpYW50cy40LjEx LjArYmV0YTMgLS1yZXBvc2l0b3JpZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwtYmV0YS1yZXBvc2l0b3J5LmdpdA0KICDilJTilIDilIDilIDilIANCiAg b3INCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIgb3BhbSBzd2l0 Y2ggY3JlYXRlIG9jYW1sLXZhcmlhbnRzLjQuMTEuMCtiZXRhMytWQVJJQU5UIC0tcmVwb3NpdG9y aWVzPWRlZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJldGEt cmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIHdoZXJlIHlvdSByZXBsYWNlIFZB UklBTlQgd2l0aCBvbmUgb2YgdGhlc2U6IGFmbCwgZmxhbWJkYSwgZnAsDQogIGZwK2ZsYW1iZGEN Cg0KICBXZSB3b3VsZCBsb3ZlIHRvIGhlYXIgYWJvdXQgYW55IGJ1Z3MuIFBsZWFzZSByZXBvcnQg dGhlbSBoZXJlOg0KICAgW2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXNdDQoN CiAgQ29tcGFyZWQgdG8gdGhlIHByZXZpb3VzIGJldGEgcmVsZWFzZSwgdGhlIGV4aGF1c3RpdmUg bGlzdCBvZiBjaGFuZ2VzDQogIGlzIGFzIGZvbGxvd3M6DQoNCg0KUnVudGltZToNCuKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBbIzk3MzZdLCBbIzk3NDldOiBDb21wYWN0aW9uIG11 c3Qgc3RhcnQgaW4gYSBoZWFwIHdoZXJlIGFsbCBmcmVlDQogICAgYmxvY2tzIGFyZSBibHVlLCB3 aGljaCB3YXMgbm90IHRoZSBjYXNlIHdpdGggdGhlIGJlc3QtZml0DQogICAgYWxsb2NhdG9yLiAo RGFtaWVuIERvbGlnZXosIHJlcG9ydCBhbmQgcmV2aWV3IGJ5IExlbyBXaGl0ZSkNCg0KICDigKIg KyBbKm5ldyBidWcgZml4ZXMqXSBbIzkzMTZdLCBbIzk0NDNdLCBbIzk0NjNdLCBbIzk3ODJdOiBV c2UgdHlwaW5nDQogICAgaW5mb3JtYXRpb24gZnJvbSBDbGFtYmRhIG9yIG11dGFibGUgQ21tIHZh cmlhYmxlcy4gKFN0ZXBoZW4gRG9sYW4sDQogICAgcmV2aWV3IGJ5IFZpbmNlbnQgTGF2aXJvbiwg R3VpbGxhdW1lIEJ1cnksIFhhdmllciBMZXJveSwgYW5kIEdhYnJpZWwNCiAgICBTY2hlcmVyOyB0 ZW1wb3JhcnkgYnVnIHJlcG9ydCBieSBSaWNoYXJkIEpvbmVzKQ0KDQoNClsjOTczNl0gaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85NzM2DQoNClsjOTc0OV0gaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85NzQ5DQoNClsjOTMxNl0gaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85MzE2DQoNClsjOTQ0M10gaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL2lzc3Vlcy85NDQzDQoNClsjOTQ2M10gaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL2lzc3Vlcy85NDYzDQoNClsjOTc4Ml0gaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sL2lzc3Vlcy85NzgyDQoNCg0KTWFudWFsIGFuZCBkb2N1bWVudGF0aW9uOg0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIFsjOTU0MV06IEFkZCBhIGRvY3VtZW50YXRpb24gcGFn ZSBmb3IgdGhlIGluc3RydW1lbnRlZCBydW50aW1lOw0KICAgIGFkZGl0aW9uYWwgY2hhbmdlcyB0 byBvcHRpb24gbmFtZXMgaW4gdGhlIGluc3RydW1lbnRlZA0KICAgIHJ1bnRpbWUuIChFbmd1ZXJy YW5kIERlY29ybmUsIHJldmlldyBieSBBbmlsIE1hZGhhdmFwZWRkeSwgR2FicmllbA0KICAgIFNj aGVyZXIsIERhbmllbCBCw7xuemxpLCBEYXZpZCBBbGxzb3BwLCBGbG9yaWFuIEFuZ2VsZXR0aSwg YW5kDQogICAgU8OpYmFzdGllbiBIaW5kZXJlcikNCg0KICBFbnRyaWVzIG1hcmtlZCB3aXRoICIr IiB3ZXJlIGFscmVhZHkgcHJlc2VudCBpbiBwcmV2aW91cyBhbHBoYXMsIGJ1dA0KICB0aGV5IGhh dmUgYmVlbiBjb21wbGVtZW50ZWQgYnkgbmV3IGJ1ZyBmaXhlcy4NCg0KICBJZiB5b3UgYXJlIGlu dGVyZXN0ZWQgYnkgdGhlIGxpc3Qgb2YgbmV3IGZlYXR1cmVzLCBhbmQgdGhlIG5lYXJseQ0KICBm aW5hbCBsaXN0IG9mIGJ1ZyBmaXhlcyB0aGUgdXBkYXRlZCBjaGFuZ2UgbG9nIGZvciBPQ2FtbCA0 LjExLjAgaXMNCiAgYXZhaWxhYmxlIGF0Og0KDQogIFtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwvYmxvYi80LjExL0NoYW5nZXNdDQoNCg0KWyM5NTQxXSBodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzLzk1NDENCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KRnJvbSB0aGUgb2NhbWxj b3JlIHBsYW5ldCBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBI ZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbT0NhbWwg UGxhbmV0XS4NCg0KICDigKIgW0ZyYW1hLUNsYW5nIDAuMC45IGlzIG91dC4gRG93bmxvYWQgaXQg aGVyZS5dDQoNCg0KW09DYW1sIFBsYW5ldF0gaHR0cDovL29jYW1sLm9yZy9jb21tdW5pdHkvcGxh bmV0Lw0KDQpbRnJhbWEtQ2xhbmcgMC4wLjkgaXMgb3V0LiBEb3dubG9hZCBpdCBoZXJlLl0NCmh0 dHA6Ly9mcmFtYS1jLmNvbS9pbmRleC5odG1sDQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1l IGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29r IGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0K DQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlv dSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3Nl bmQgbWUgYSBtZXNzYWdlXSBtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnDQoN Clt0aGUgYXJjaGl2ZV0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8NCg0KW1JTUyBm ZWVkIG9mIHRoZSBhcmNoaXZlc10gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24u cnNzDQoNCltvbmxpbmVdIGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdz LXdlZWtseS8NCg0KW0FsYW4gU2NobWl0dF0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lw0K DQo= --===-=-= 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 July 21 to 28, 2020.

As I will be away with no internet next week, the next CWN will be on Augus= t 11.

Embedded ocaml templates

Emile Trotignon announced

I am very happy to announce the release of ocaml-embedded-templates.

This is a tool similar to camlmix, but camlmix was not updated for 7 years,= and there is no easy way to handle a lot of templates (my command takes a directory as an argument and = generate an ocaml module by going through the directory recursively) I also choosed to use a syntax similar to EJS, and there is a ppx for inlin= e EML.

You can check it out here : https://github.com/EmileTrotignon/embedded_ocaml_te= mplates

Here is a more extensive exemple of what can be done with this : https://githu= b.com/EmileTrotignon/resume_of_ocaml (This project generate my resume/w= ebsite in both latex and html).

This is my first opam package : feedback is very much welcome.

Proposal: Another way to debug memory= leaks

Jim Fehrle said

memprof helps you discover where memory was allocated, which i= s certainly useful. However, that may not be enough information to isolate a leak. Sometimes you'd like to know = what variables refer to excessive amounts of memory.

For this, you'd want to examine all the garbage collection roots and report= how much memory is used by each. This is useful information if you can map a GC root back to a source= file and variable.

I prototyped code to do that to help with Coq bug https://github.com/coq/coq/issues/12487. It localized several leaks enough across over 500 source files so that we coul= d find and fix them. But my prototype code is a bit crude. I'd like to clean it up and submit it as a = PR. Since this could be done in various ways, I wanted to get some design/API feedback up front rat= her than maybe doing some of it twice. Also I'd like to confident that such a PR would be accepted and = merged in a reasonable amount of time–otherwise why bother.

caml_do_roots shows how to access the GC roots. There are several types of roots:

  • global roots, corresponding to top-level variables in source files
  • dynamic global roots
  • stack and local roots
  • global C roots
  • finalized values
  • memprof
  • hook

API (in Gc):

val print_global_reachable : out_channel -> int -> unit

Prints a list to out_channel of the global roots that reach mo= re than the specified number of words. Each item shows the number of reachable words, the associated index of the = root in the *glob for that file and the name of the source file.

Something like this (but with only filenames rather than pathnames):

  102678 field  17 plugins/ltac/pltac.ml
  102730 field  18 plugins/ltac/pltac.ml
  164824 field  20 plugins/ltac/tacenv.ml
 1542857 field  26 plugins/ltac/tacenv.ml
35253743 field  65 stm/stm.ml
35201913 field   8 vernac/vernacstate.ml
 8991864 field  24 vernac/library.ml
  112035 field   8 vernac/egramml.ml
 6145454 field  84 vernac/declaremods.ml
 6435878 field  89 vernac/declaremods.ml

I would use ELF information in the binary file to map from *glob back to a filename. For example, the address symbol of the entry camlTest corresponds to = test.ml. This would only work for binary executables compiled with the -g option. It wouldn't work for= byte-compiled code. It would print an error message if it's not ELF or not -g. Also, being a little= lazy, how essential is it to support 32-bit binaries? (Q: What happens if you have 2 source files with the same= name though in different directories? Would the symbol table distinguish them?)

val get_field_index : Obj.t -> int

Returns the *glob index number for the top-level variable (pas= sed as Obj.repr var). I expect there's no way to recover variable names from the *glob index.= In my experiments, it appeared that the entries in *glob were in the same order as as the variable= and function declarations. This would let a developer do a binary search in the code to locate the variable which= it probably a necessity for large, complex files such as Coq's stm.ml–3300 lines, 1= 0+ modules defined within the file. (I noticed that variables defined in modules defined within the source file we= re not in *glob. I expect there is a root for the module as a whole and that those variables can be r= eadily found within that root.)

This would need an extended explanation in gc.mli.

val print_stack_reachable : out_channel -> int -> unit

Prints a backtrace to out_channel that also shows which roots = for each frame reach more than the specified number of words. (I'd keep the "item numbers" since there's no w= ay to translate them to variables and they might give some clues.)

Called from file "tactics/redexpr.ml" (inlined), line 207, characters 29-40
 356758154 item    0 (stack)
Called from file "plugins/ltac/tacinterp.ml", line 752, characters 6-51
  17646719 item    0 (stack)
    119041 item    1 (stack)
Called from file "engine/logic_monad.ml", line 195, characters 38-43
    119130 item    0 (stack)
 373378237 item    1 (stack)

As it turns out, 90% of the memory in Coq issue mentioned above is reachabl= e only from the stack.

I didn't consider the other types of roots yet, which I don't fully underst= and, such as local roots. Just covering global and stack roots seems like a good contribution. Dynam= ic global roots may be easy to add if they are otherwise similar to global roots. For the others I cou= ld print the reachable words, but I don't know how to direct the developer to look at the relevant= part of the code, especially if it's in C code. I suppose print_global_reachable and print_stack_reachable could be a single routine as well. That's probably better.

Let me know your thoughts.

Camlp5 (8.00~alpha01) and pa_ppx (0.0= 1)

Chet Murthy announced

Camlp5 (8.00~alpha01) and pa_ppx (= 0.01)

I'm pleased to announce the release of two related projects:

  1. Camlp5: version 8.00~a= lpha01 is an alpha release of Camlp5, with full support for OCaml syntax up= to version 4.10.0, as well as minimal compatibility with version 4.11.0. I= n particular there is full support for PPX attributes and extensions.
  2. pa_ppx: version 0.= 01 is a re-implementation of a large number of PPX rewriters (e.g. ppx_deri= ving (std (show, eq, map, etc), yojson, sexp, etc), ppx_import, ppx_assert,= others) on top of Camlp5, along with an infrastructure for developing new = ones.

This allows projects to combine the existing style of Camlp5 syntax extension, with PPX rewriting, without having to jump thru hoops to invoke camlp5 on some files, and PPX processors on others.

Camlp5 alone is not compatible with existing PPX rewriters: Camlp5 syntax-extensions (e.g. "stream parsers") would be rejected by the OCaml parser, and PPX extensions/attributes are ignored by Camlp5 (again, without pa_ppx). pa_ppx provides Camlp5-= compatible versions of many existing PPX rewriters, as well as new ones, so that one can use Camlp5 syntax extensions as well as PPX rewriters. In addition, some of the re-implemented rewriters are more-powerful than their original namesakes, and there are new ones that add interesting functionality.

For democratizing macro-extension-authoring in OCaml<= /h4>

TL;DR Writing OCaml PPX rewriters is hard work. There is a complicated infrastructure that is hard to explain, there are multiple such incompatible infrastructures (maybe these are merging?) and it is hard enough that most Ocaml programmers do not write macro-extensions as a part of their projects. I believe that using Camlp5 and pa_ppx can make it easier to write macro-extensions, via:

  1. providing a simple way of thinking about adding your extension to the p= arsing process.
  2. providing transparent tools (e.g. quotations) for pattern-matching/cons= tructing AST fragments

Explained below in [Macro Extensions with Pa_ppx](#macro-extensions-with-pa= _ppx).

  • The original arguments against Camlp4

    The original argument against using Camlp4 as a basis for macro-preprocessing in Ocaml, had several points (I can't find the original document, but from memory):

    1. syntax-extension as the basis of macro-extension leads to brittl= e syntax: multiple syntax extensions often do not combine well.
    2. a different AST type than the Ocaml AST
    3. a different parsing/pretty-printing infrastructure, which must be maint= ained alongside of Ocaml's own parser/pretty-printer.
    4. A new and complicated set of APIs are required to write syntax extensio= ns.

    To this, I'll add

    1. Camlp4 was forked from Camlp5, things were changed, and hence, C= amlp4 lost the contribution of its original author. Hence, maintaining Cam= lp4 was always labor that fell on the Ocaml team. [Maybe this doesn't matte= r, but it counts for something.]
  • Assessing the arguments, with some hindsight
    1. syntax-extension as the basis of macro-extension leads to brittle sy= ntax: multiple syntax extensions often do not combine well.

      In retrospect, this is quite valid: even if one prefers and enjoys LL(1) grammars and parsing, when multiple authors write grammar-extensions which are only combined by third-party projects, the conditions are perfect for chaos, and of a sort that project-authors simply shouldn't have to sort out. And this chaos is of a different form, than merely having two PPX rewriters use the same attribute/extension-names (which is, arguably, easily detectable with some straightforward predeclaration).

    2. Camlp4/5 has a different AST type than the Ocaml AST

      Over time, the PPX authors themselves have slowly started to conclude that the current reliance on the Ocaml AST is fraught with problems. The "Future of PPX" discussion thread talks about using something like s-expressions, and more generally about a more-flexible AST type.

    3. a different parsing/pretty-printing infrastructure, which must be maintaine= d alongside of Ocaml's own parser/pretty-printer.

      A different AST type necessarily means a different parser/pretty-printer. Of course, one could modify Ocaml's YACC parser to produce Camlp5 ASTs, but this is a minor point.

    4. A new and complicated set of APIs are required to write syntax extensions.

      With time, it's clear that PPX has produced the same thing.

    5. Maintaining Camlp4 was always labor that fell on the Ocaml team.

      The same argument (that each change to the Ocaml AST requires work to update Camlp5) can be made for PPX (specifically, this is the raison d'etre of ocaml-migrate-parsetree). Amusingly, one could imagine using ocaml-migrate-parsetree as the basis for making Camlp5 OCaml-version-independent, too. That is, the "backend" of Camlp5 could use ocaml-migrate-parsetree to produce ASTs for a version of OCaml different from the one on which it was compiled.

Arguments against the current API(s) of PPX rewriting=

The overall argument is that it's too complicated for most OCaml programmers to write their own extensions; what we see instead of a healthy ecosystem of many authors writing and helping-improve PPX rewriters, is a small number of rewriters, mostly written by Jane Street and perhaps one or two other shops. There are a few big reasons why this is the case (which correspond to the responses above), but one that isn't mentioned is:

  1. When the "extra data" of a PPX extension or attribute is easily-express= ed with the fixed syntax of PPX payloads, all is ~well~ ok, bu= t certainly not in great shape. Here's an example:
type package_type =3D
[%import:=
 Parsetree.package_type
          [@with core_type    :=3D Parsetre=
e.core_type [@printer Pprintast.core_type];
                 Asttypes.loc :=3D Asttypes=
.loc [@polyprinter fun pp fmt x -> pp fmt x.Asttypes.txt];
                 Longident.t  :=3D Longiden=
t.t [@printer pp_longident]]]
[@@deriving show]

The expression-syntax of assignment is used to express type-expression rewrites. And this is necesarily limited, because we cannot (for example) specify left-hand-sizes that are type-expressions with variables. It's a perversion of the syntax, when what we really want to have is something that is precise: "map this type-expression to that type-expression".

Now, with the new Ocaml 4.11.0 syntax, there's a (partial) solution: use "raw-string-extensions" like {%foo|argle|}. This is the s= ame as [%foo {|argle|}]. This relies on the PPX extension to parse t= he payload. But there are problems:

  1. Of course, there's no equivalent {@foo|argle|} (and "@@", = "@@@" of course) for attributes.
  2. If the payload in that string doesn't itself correspond to some = parseable Ocaml AST type, then again, we're stuck: we have to cobble togeth= er a parser instead of being able to merely extend the parser of Ocaml to d= eal with the case.

Note well that I'm not saying that we should extend the parsing rules of the Ocaml language. Rather, that with an extensible parser (hence, LL(1)) we can add new nonterminals, add rules that reference existing nonterminals, and thereby get an exact syntax (e.g.) for the ppx_import example above. That new nonterminal is used onl= y in parsing the payload – nowhere else – so we haven't introduced examples of objection #1 above.

And it's not even very hard.

Macro Extensions with Pa_ppx

The basic thesis of pa_ppx is "let's not throw the baby out wi= th the bathwater". Camlp5 has a lot of very valuable infrastructure that can be used to make writing macro-preprocessors much easier. pa_ppx adds a few more.

  1. Quotations for patterns and expressions over all important OCaml AST ty= pes.
  2. "extensible functions" to make the process of recursing down the AST tr= ansparent, and the meaning of adding code to that process equally transpare= nt.
  3. pa_ppx introduces "passes" and allows each extension to re= gister which other extensions it must follow, and which may follow it; then= pa_ppx topologically sorts them, so there's no need for proje= ct-authors to figure out how to order their PPX extension invocations.

As an example of a PPX rewriter based on pa_ppx, here's pa_ppx.here from the pa_ppx tutorial. In that example, you'll see that Ca= mlp5 infrastructure is used to make things easy:

  1. quotations are used to both build the output AST fragment, and to patte= rn-match on inputs.
  2. the "extensible functions" are used to add our little bit of rewriter t= o the top-down recursion.
  3. and we declare our rewriter to the infrastructure (we don't specify wha= t passes it must come before or after, since pa_ppx.here is so= simple).

Conclusion

I'm not trying to convince you to switch away from PPX to Camlp5. Perhaps, I'm not even merely arguing that you should use pa_ppx and author new macro-extensions on it. But I am arguing that the featur= es of

  1. quotations, with antiquotations in as many places as possible, and henc= e, in places where Ocaml identifiers are not permitted.
  2. facilities like "extensible functions", with syntax support for them
  3. a new AST type, that is suitable for macro-preprocessing, but isn't mer= ely "s-expressions" (after all, there's a reason we all use strongly-typed = languages)
  4. an extensible parser for the Ocaml language, usable in PPX attribute/ex= tension payloads

are important and valuable, and a PPX rewriter infrastructure that makes it possible for the masses to write their own macro-extensions, is going to incorporate these things.

OCaml 4.11.0, third (and last?) beta = release

octachron announced

The release of OCaml 4.11.0 is near. As one step further in this direction, we have published a third and potentially last beta release.

This new release fixes an infrequent best-fit allocator bug and an issue with floating-point software emulation in the ARM EABI port. On the ecosystem side, merlin is now available for this new version of OCam= l. The compatibility of the opam ecosystem with OCaml 4.11.0 is currently good, and it should be possible to test this beta without too much trouble.

The source code is available at these addresses:

http= s://github.com/ocaml/ocaml/archive/4.11.0+beta3.tar.gz
https://caml.inria.fr/pub/distrib/ocaml-4.11/ocaml-4.11.0+beta3.tar= .gz

The compiler can also be installed as an OPAM switch with one of the following commands:

opam update
opam switch create ocaml-variants.4.11.0+beta3 --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/oca=
ml-beta-repository.git

or

opam update
opam switch create ocaml-variants.4.11.0+beta3+VARIANT --repositories=3Ddef=
ault,beta=3Dgit+https://github.com/o=
caml/ocaml-beta-repository.git

where you replace VARIANT with one of these: afl, flambda, fp, fp+flambda

We would love to hear about any bugs. Please report them here: https://github.com/ocaml= /ocaml/issues

Compared to the previous beta release, the exhaustive list of changes is as follows:

Runtime:

  • #9736, #9749: Compaction mus= t start in a heap where all free blocks are blue, which was not the case wi= th the best-fit allocator. (Damien Doligez, report and review by Leo White)=
  • + [*new bug fixes*] #9316, #9443= , #9463, #9782: Use typing i= nformation from Clambda or mutable Cmm variables. (Stephen Dolan, review by= Vincent Laviron, Guillaume Bury, Xavier Leroy, and Gabriel Scherer; tempor= ary bug report by Richard Jones)

Manual and documentation:

  • #9541: Add a= documentation page for the instrumented runtime; additional changes to opt= ion names in the instrumented runtime. (Enguerrand Decorne, review by Anil = Madhavapeddy, Gabriel Scherer, Daniel B=C3=BCnzli, David Allsopp, Florian A= ngeletti, and S=C3=A9bastien Hinderer)

Entries marked with "+" were already present in previous alphas, but they have been complemented by new bug fixes.

If you are interested by the list of new features, and the nearly final list of bug fixes the updated change log for OCaml 4.11.0 is available at:

https://github= .com/ocaml/ocaml/blob/4.11/Changes

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

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.

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