From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id JAA01608; Wed, 26 Mar 2003 09:29:07 +0100 (MET) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id JAA01328 for ; Wed, 26 Mar 2003 09:29:06 +0100 (MET) Received: from lri.lri.fr (lri.lri.fr [129.175.15.1]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id h2Q8T5X04474 for ; Wed, 26 Mar 2003 09:29:05 +0100 (MET) Received: from pc8-123 (mail@pc8-123 [129.175.8.123]) by lri.lri.fr (8.11.6/jtpda-5.3.2) with ESMTP id h2Q8PDj20187 ; Wed, 26 Mar 2003 09:25:13 +0100 (MET) Received: from filliatr by pc8-123 with local (Exim 3.35 #1 (Debian)) id 18y6Dh-0007SK-00; Wed, 26 Mar 2003 09:25:13 +0100 From: Jean-Christophe Filliatre MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="CKE+e+ll0J" Content-Transfer-Encoding: 7bit Message-ID: <16001.25577.356783.999902@gargle.gargle.HOWL> Date: Wed, 26 Mar 2003 09:25:13 +0100 To: David Brown Cc: Caml List Subject: Re: [Caml-list] Recursive types and functors. In-Reply-To: <20030326062854.GA15098@opus.davidb.org> References: <20030326062854.GA15098@opus.davidb.org> X-Mailer: VM 7.03 under Emacs 20.7.2 Reply-To: Jean-Christophe.Filliatre@lri.fr (Jean-Christophe Filliatre) X-MailScanner: Found to be clean X-Spam: no; 0.00; filliatre:01 lri:01 caml-list:01 functors:01 foo:01 struct:01 orderedtype:01 functor:01 ord:01 mli:01 generic:01 val:01 elt:01 hash-consing:01 tagging:01 X-Attachments: type="application/octet-stream" name="mset.mli" type="application/octet-stream" name="mset.ml" Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk --CKE+e+ll0J Content-Type: text/plain; charset=iso-8859-1 Content-Description: message body and .signature Content-Transfer-Encoding: 8bit David Brown writes: > I have a recursive type where I'd like one of the constructors of the > type to contain a set of the type (or something like set). However, I > can't figure out how to represent this. > > For example: > > type foo = > | Integer of int > | String of string > | Set of FooSet > > module FooSet = Set.Make (struct type t = foo let compare = compare end) > > but this obviously doesn't work. I'm pretty sure this has already been discussed on this list, but I couldn't find the related thread in the archives... A (too) naive solution could be to make a polymorphic instance of the Set module (either by adding an argument 'a everywhere in signatures OrderedType and S, or by copying the functor body and replacing Ord.compare by compare); then you have polymorphic sets, say 'a Set.t, balanced using compare, and you can define type foo = Integer of int | ... | Set of foo Set.t Unfortunately this doesn't work because sets themselves shouldn't be compared with compare, but with Set.compare (see set.mli). And then you point out the main difficulty: comparing values in type foo requires to be able to compare sets of foo, and comparing sets requires to *implement* sets and thus to compare values in foo. Fortunately, there is another solution (though a bit more complex). First we define a more generic type 'a foo where 'a will be substituted later by sets of foo: type 'a foo = Integer of int | ... | Set of 'a Then we implement a variant of module Set which implements sets given the following signature: module type OrderedType = sig type 'a t val compare: ('a -> 'a -> int) -> 'a t -> 'a t -> int end that is where elements are in the polymorphic type 'a t and where the comparison function depends on a comparison function for arguments in 'a (which will represent the sets, in fine). The functor implements a type t for sets using balanced trees, as usual, and defines the type of elements elt to be t Ord.t: module Make(Ord: OrderedType) = struct type elt = t Ord.t and t = Empty | Node of t * elt * t * int Right after, it implements comparison over elements and sets in a mutually recursive way: let rec compare_elt x y = Ord.compare compare x y and compare = ... (usual comparison of sets, using compare_elt) The remaining of the functor is exactly the same as for Set, with compare_elt used instead of Ord.compare. I attach the implementation of this module. There is (at least) another solution: to use a set implementation where comparison does not require a comparison of elements. This is possible if, for instance, you are performing hash-consing on type foo (which result in tagging foo values with integers, then used in the comparison). This solution is used in Claude Marché's regexp library (http://www.lri.fr/~marche/regexp/) and uses a hash-consing technique available here: http://www.lri.fr/~filliatr/software.en.html Hope this helps, -- Jean-Christophe Filliātre (http://www.lri.fr/~filliatr) --CKE+e+ll0J Content-Type: application/octet-stream Content-Description: mset.mli Content-Disposition: attachment; filename="mset.mli" Content-Transfer-Encoding: base64 KCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKQooKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopCigqICAgICAgICAgICAgICAgICAgICAg ICAgICAgT2JqZWN0aXZlIENhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKKCogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqKQooKiAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElO UklBIFJvY3F1ZW5jb3VydCAgICAgICAgICopCigqICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKKCogIENvcHlyaWdo dCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQg ICAqKQooKiAgZW4gQXV0b21hdGlxdWUuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxl IGlzIGRpc3RyaWJ1dGVkICAgICopCigqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICAgICAgICAgKikKKCogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKQoo KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiopCgooKiAkSWQ6IHBzZXQubWxpLHYgMS4yIDIwMDIvMDIvMjIgMTU6NTQ6 NDMgZmlsbGlhdHIgRXhwICQgKikKCigqIE1vZHVsZSBbTXNldF06IHZhcmlhbnQgb2YgbW9kdWxl IFtTZXRdIHRvIGJ1aWxkIGEgdHlwZSBhbmQgc2V0cyBvZgogICBlbGVtZW50cyBpbiB0aGlzIHR5 cGUgaW4gYSBtdXR1YWxseSByZWN1cnNpdmUgd2F5LiAqKQoKbW9kdWxlIHR5cGUgT3JkZXJlZFR5 cGUgPQogIHNpZwogICAgdHlwZSAnYSB0CiAgICB2YWwgY29tcGFyZTogKCdhIC0+ICdhIC0+IGlu dCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGludAogIGVuZAogICAgICAgICAgKCogVGhlIGlucHV0IHNp Z25hdHVyZSBvZiB0aGUgZnVuY3RvciBbTXNldC5NYWtlXS4KICAgICAgICAgICAgIFsnYSB0XSBp cyB0aGUgdHlwZSBvZiB0aGUgc2V0IGVsZW1lbnRzIHdoZXJlIFsnYV0gd2lsbCBiZSAKCSAgICAg c3Vic3RpdHV0ZWQgYnkgdGhlIHR5cGUgZm9yIHNldHMgb2Ygc3VjaCBlbGVtZW50cy4KICAgICAg ICAgICAgIFtjb21wYXJlXSBpcyBhIHRvdGFsIG9yZGVyaW5nIGZ1bmN0aW9uIG92ZXIgdGhlIHNl dCBlbGVtZW50cywKCSAgICAgZ2l2ZW4gYSB0b3RhbCBvcmRlcmluZyBmdW5jdGlvbiBvdmVyIHNl dHMuICopCgoKbW9kdWxlIE1ha2UoT3JkOiBPcmRlcmVkVHlwZSk6CiAgICAgICAgKCogRnVuY3Rv ciBidWlsZGluZyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2V0IHN0cnVjdHVyZSAqKQogIHNp ZwogICAgdHlwZSB0CiAgICAgICAgICAoKiBUaGUgdHlwZSBvZiBzZXRzLiAqKQogICAgdHlwZSBl bHQgPSB0IE9yZC50CiAgICAgICAgICAoKiBUaGUgdHlwZSBvZiB0aGUgc2V0IGVsZW1lbnRzLiAq KQogICAgdmFsIGVtcHR5OiB0CiAgICAgICAgICAoKiBUaGUgZW1wdHkgc2V0LiAqKQogICAgdmFs IGlzX2VtcHR5OiB0IC0+IGJvb2wKICAgICAgICAoKiBUZXN0IHdoZXRoZXIgYSBzZXQgaXMgZW1w dHkgb3Igbm90LiAqKQogICAgdmFsIG1lbTogZWx0IC0+IHQgLT4gYm9vbAogICAgICAgICgqIFtt ZW0geCBzXSB0ZXN0cyB3aGV0aGVyIFt4XSBiZWxvbmdzIHRvIHRoZSBzZXQgW3NdLiAqKQogICAg dmFsIGFkZDogZWx0IC0+IHQgLT4gdAogICAgICAgICgqIFthZGQgeCBzXSByZXR1cm5zIGEgc2V0 IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIG9mIFtzXSwKICAgICAgICAgICBwbHVzIFt4XS4gSWYg W3hdIHdhcyBhbHJlYWR5IGluIFtzXSwgW3NdIGlzIHJldHVybmVkIHVuY2hhbmdlZC4gKikKICAg IHZhbCBzaW5nbGV0b246IGVsdCAtPiB0CiAgICAgICAgKCogW3NpbmdsZXRvbiB4XSByZXR1cm5z IHRoZSBvbmUtZWxlbWVudCBzZXQgY29udGFpbmluZyBvbmx5IFt4XS4gKikKICAgIHZhbCByZW1v dmU6IGVsdCAtPiB0IC0+IHQKICAgICAgICAoKiBbcmVtb3ZlIHggc10gcmV0dXJucyBhIHNldCBj b250YWluaW5nIGFsbCBlbGVtZW50cyBvZiBbc10sCiAgICAgICAgICAgZXhjZXB0IFt4XS4gSWYg W3hdIHdhcyBub3QgaW4gW3NdLCBbc10gaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLiAqKQogICAgdmFs IHVuaW9uOiB0IC0+IHQgLT4gdAogICAgdmFsIGludGVyOiB0IC0+IHQgLT4gdAogICAgdmFsIGRp ZmY6IHQgLT4gdCAtPiB0CiAgICAgICAgKCogVW5pb24sIGludGVyc2VjdGlvbiBhbmQgc2V0IGRp ZmZlcmVuY2UuICopCiAgICB2YWwgY29tcGFyZV9lbHQ6IGVsdCAtPiBlbHQgLT4gaW50CgkoKiBU b3RhbCBvcmRlcmluZyBiZXR3ZWVuIGVsZW1lbnRzLiAqKQogICAgdmFsIGNvbXBhcmU6IHQgLT4g dCAtPiBpbnQKICAgICAgICAoKiBUb3RhbCBvcmRlcmluZyBiZXR3ZWVuIHNldHMuIENhbiBiZSB1 c2VkIGFzIHRoZSBvcmRlcmluZyBmdW5jdGlvbgogICAgICAgICAgIGZvciBkb2luZyBzZXRzIG9m IHNldHMuICopCiAgICB2YWwgZXF1YWw6IHQgLT4gdCAtPiBib29sCiAgICAgICAgKCogW2VxdWFs IHMxIHMyXSB0ZXN0cyB3aGV0aGVyIHRoZSBzZXRzIFtzMV0gYW5kIFtzMl0gYXJlCiAgICAgICAg ICAgZXF1YWwsIHRoYXQgaXMsIGNvbnRhaW4gZXF1YWwgZWxlbWVudHMuICopCiAgICB2YWwgc3Vi c2V0OiB0IC0+IHQgLT4gYm9vbAogICAgICAgICgqIFtzdWJzZXQgczEgczJdIHRlc3RzIHdoZXRo ZXIgdGhlIHNldCBbczFdIGlzIGEgc3Vic2V0IG9mCiAgICAgICAgICAgdGhlIHNldCBbczJdLiAq KQogICAgdmFsIGl0ZXI6IChlbHQgLT4gdW5pdCkgLT4gdCAtPiB1bml0CiAgICAgICAgKCogW2l0 ZXIgZiBzXSBhcHBsaWVzIFtmXSBpbiB0dXJuIHRvIGFsbCBlbGVtZW50cyBvZiBbc10uCiAgICAg ICAgICAgVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBlbGVtZW50cyBvZiBbc10gYXJlIHByZXNlbnRl ZCB0byBbZl0KICAgICAgICAgICBpcyB1bnNwZWNpZmllZC4gKikKICAgIHZhbCBmb2xkOiAoZWx0 IC0+ICdiIC0+ICdiKSAtPiB0IC0+ICdiIC0+ICdiCiAgICAgICAgKCogW2ZvbGQgZiBzIGFdIGNv bXB1dGVzIFsoZiB4TiAuLi4gKGYgeDIgKGYgeDEgYSkpLi4uKV0sCiAgICAgICAgICAgd2hlcmUg W3gxIC4uLiB4Tl0gYXJlIHRoZSBlbGVtZW50cyBvZiBbc10uCiAgICAgICAgICAgVGhlIG9yZGVy IGluIHdoaWNoIGVsZW1lbnRzIG9mIFtzXSBhcmUgcHJlc2VudGVkIHRvIFtmXSBpcwogICAgICAg ICAgIHVuc3BlY2lmaWVkLiAqKQogICAgdmFsIGZvcl9hbGw6IChlbHQgLT4gYm9vbCkgLT4gdCAt PiBib29sCiAgICAgICAgKCogW2Zvcl9hbGwgcCBzXSBjaGVja3MgaWYgYWxsIGVsZW1lbnRzIG9m IHRoZSBzZXQKICAgICAgICAgICBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUgW3BdLiAqKQogICAgdmFs IGV4aXN0czogKGVsdCAtPiBib29sKSAtPiB0IC0+IGJvb2wKICAgICAgICAoKiBbZXhpc3RzIHAg c10gY2hlY2tzIGlmIGF0IGxlYXN0IG9uZSBlbGVtZW50IG9mCiAgICAgICAgICAgdGhlIHNldCBz YXRpc2ZpZXMgdGhlIHByZWRpY2F0ZSBbcF0uICopCiAgICB2YWwgZmlsdGVyOiAoZWx0IC0+IGJv b2wpIC0+IHQgLT4gdAogICAgICAgICgqIFtmaWx0ZXIgcCBzXSByZXR1cm5zIHRoZSBzZXQgb2Yg YWxsIGVsZW1lbnRzIGluIFtzXQogICAgICAgICAgIHRoYXQgc2F0aXNmeSBwcmVkaWNhdGUgW3Bd LiAqKQogICAgdmFsIHBhcnRpdGlvbjogKGVsdCAtPiBib29sKSAtPiB0IC0+IHQgKiB0CiAgICAg ICAgKCogW3BhcnRpdGlvbiBwIHNdIHJldHVybnMgYSBwYWlyIG9mIHNldHMgWyhzMSwgczIpXSwg d2hlcmUKICAgICAgICAgICBbczFdIGlzIHRoZSBzZXQgb2YgYWxsIHRoZSBlbGVtZW50cyBvZiBb c10gdGhhdCBzYXRpc2Z5IHRoZQogICAgICAgICAgIHByZWRpY2F0ZSBbcF0sIGFuZCBbczJdIGlz IHRoZSBzZXQgb2YgYWxsIHRoZSBlbGVtZW50cyBvZgogICAgICAgICAgIFtzXSB0aGF0IGRvIG5v dCBzYXRpc2Z5IFtwXS4gKikKICAgIHZhbCBjYXJkaW5hbDogdCAtPiBpbnQKICAgICAgICAoKiBS ZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiBhIHNldC4gKikKICAgIHZhbCBlbGVtZW50 czogdCAtPiBlbHQgbGlzdAogICAgICAgICgqIFJldHVybiB0aGUgbGlzdCBvZiBhbGwgZWxlbWVu dHMgb2YgdGhlIGdpdmVuIHNldC4KICAgICAgICAgICBUaGUgcmV0dXJuZWQgbGlzdCBpcyBzb3J0 ZWQgaW4gaW5jcmVhc2luZyBvcmRlciB3aXRoIHJlc3BlY3QKICAgICAgICAgICB0byB0aGUgb3Jk ZXJpbmcgW09yZC5jb21wYXJlXSwgd2hlcmUgW09yZF0gaXMgdGhlIGFyZ3VtZW50CiAgICAgICAg ICAgZ2l2ZW4gdG8gW1NldC5NYWtlXS4gKikKICAgIHZhbCBtaW5fZWx0OiB0IC0+IGVsdAogICAg ICAgICgqIFJldHVybiB0aGUgc21hbGxlc3QgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gc2V0CiAgICAg ICAgICAgKHdpdGggcmVzcGVjdCB0byB0aGUgW09yZC5jb21wYXJlXSBvcmRlcmluZyksIG9yIHJh aXNlCiAgICAgICAgICAgW05vdF9mb3VuZF0gaWYgdGhlIHNldCBpcyBlbXB0eS4gKikKICAgIHZh bCBtYXhfZWx0OiB0IC0+IGVsdAogICAgICAgICgqIFNhbWUgYXMgW21pbl9lbHRdLCBidXQgcmV0 dXJucyB0aGUgbGFyZ2VzdCBlbGVtZW50IG9mIHRoZQogICAgICAgICAgIGdpdmVuIHNldC4gKikK ICAgIHZhbCBjaG9vc2U6IHQgLT4gZWx0CiAgICAgICAgKCogUmV0dXJuIG9uZSBlbGVtZW50IG9m IHRoZSBnaXZlbiBzZXQsIG9yIHJhaXNlIFtOb3RfZm91bmRdIGlmCiAgICAgICAgICAgdGhlIHNl dCBpcyBlbXB0eS4gV2hpY2ggZWxlbWVudCBpcyBjaG9zZW4gaXMgdW5zcGVjaWZpZWQsCiAgICAg ICAgICAgYnV0IGVxdWFsIGVsZW1lbnRzIHdpbGwgYmUgY2hvc2VuIGZvciBlcXVhbCBzZXRzLiAq KQogIGVuZAoK --CKE+e+ll0J Content-Type: application/octet-stream Content-Description: mset.ml Content-Disposition: attachment; filename="mset.ml" Content-Transfer-Encoding: base64 KCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKQooKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopCigqICAgICAgICAgICAgICAgICAgICAg ICAgICAgT2JqZWN0aXZlIENhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKKCogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqKQooKiAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElO UklBIFJvY3F1ZW5jb3VydCAgICAgICAgICopCigqICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikKKCogIENvcHlyaWdo dCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQg ICAqKQooKiAgZW4gQXV0b21hdGlxdWUuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxl IGlzIGRpc3RyaWJ1dGVkICAgICopCigqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICAgICAgICAgKikKKCogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKQoo KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiopCgooKiAkSWQ6IHBzZXQubWwsdiAxLjEgMjAwMC8wNy8wNyAxNjoxMzox NyBmaWxsaWF0ciBFeHAgJCAqKQoKKCogU2V0cyBvdmVyIG9yZGVyZWQgdHlwZXMgKikKCm1vZHVs ZSB0eXBlIE9yZGVyZWRUeXBlID0KICBzaWcKICAgIHR5cGUgJ2EgdAogICAgdmFsIGNvbXBhcmU6 ICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIHQgLT4gJ2EgdCAtPiBpbnQKICBlbmQKCm1vZHVsZSB0 eXBlIFMgPQogIHNpZwogICAgdHlwZSBlbHQKICAgIHR5cGUgdAogICAgdmFsIGVtcHR5OiB0CiAg ICB2YWwgaXNfZW1wdHk6IHQgLT4gYm9vbAogICAgdmFsIG1lbTogZWx0IC0+IHQgLT4gYm9vbAog ICAgdmFsIGFkZDogZWx0IC0+IHQgLT4gdAogICAgdmFsIHNpbmdsZXRvbjogZWx0IC0+IHQKICAg IHZhbCByZW1vdmU6IGVsdCAtPiB0IC0+IHQKICAgIHZhbCB1bmlvbjogdCAtPiB0IC0+IHQKICAg IHZhbCBpbnRlcjogdCAtPiB0IC0+IHQKICAgIHZhbCBkaWZmOiB0IC0+IHQgLT4gdAogICAgdmFs IGNvbXBhcmVfZWx0IDogZWx0IC0+IGVsdCAtPiBpbnQKICAgIHZhbCBjb21wYXJlOiB0IC0+IHQg LT4gaW50CiAgICB2YWwgZXF1YWw6IHQgLT4gdCAtPiBib29sCiAgICB2YWwgc3Vic2V0OiB0IC0+ IHQgLT4gYm9vbAogICAgdmFsIGl0ZXI6IChlbHQgLT4gdW5pdCkgLT4gdCAtPiB1bml0CiAgICB2 YWwgZm9sZDogKGVsdCAtPiAnYiAtPiAnYikgLT4gdCAtPiAnYiAtPiAnYgogICAgdmFsIGZvcl9h bGw6IChlbHQgLT4gYm9vbCkgLT4gdCAtPiBib29sCiAgICB2YWwgZXhpc3RzOiAoZWx0IC0+IGJv b2wpIC0+IHQgLT4gYm9vbAogICAgdmFsIGZpbHRlcjogKGVsdCAtPiBib29sKSAtPiB0IC0+IHQK ICAgIHZhbCBwYXJ0aXRpb246IChlbHQgLT4gYm9vbCkgLT4gdCAtPiB0ICogdAogICAgdmFsIGNh cmRpbmFsOiB0IC0+IGludAogICAgdmFsIGVsZW1lbnRzOiB0IC0+IGVsdCBsaXN0CiAgICB2YWwg bWluX2VsdDogdCAtPiBlbHQKICAgIHZhbCBtYXhfZWx0OiB0IC0+IGVsdAogICAgdmFsIGNob29z ZTogdCAtPiBlbHQKICBlbmQKCm1vZHVsZSBNYWtlKE9yZDogT3JkZXJlZFR5cGUpID0KICBzdHJ1 Y3QKICAgIHR5cGUgZWx0ID0gdCBPcmQudAogICAgYW5kIHQgPSBFbXB0eSB8IE5vZGUgb2YgdCAq IGVsdCAqIHQgKiBpbnQKCiAgICBsZXQgcmVjIGNvbXBhcmVfZWx0IHggeSA9IAogICAgICBPcmQu Y29tcGFyZSBjb21wYXJlIHggeQoKICAgIGFuZCBjb21wYXJlX2F1eCBsMSBsMiA9CiAgICAgICAg bWF0Y2ggKGwxLCBsMikgd2l0aAogICAgICAgIChbXSwgW10pIC0+IDAKICAgICAgfCAoW10sIF8p ICAtPiAtMQogICAgICB8IChfLCBbXSkgLT4gMQogICAgICB8IChFbXB0eSA6OiB0MSwgRW1wdHkg OjogdDIpIC0+CiAgICAgICAgICBjb21wYXJlX2F1eCB0MSB0MgogICAgICB8IChOb2RlKEVtcHR5 LCB2MSwgcjEsIF8pIDo6IHQxLCBOb2RlKEVtcHR5LCB2MiwgcjIsIF8pIDo6IHQyKSAtPgogICAg ICAgICAgbGV0IGMgPSBjb21wYXJlX2VsdCB2MSB2MiBpbgogICAgICAgICAgaWYgYyA8PiAwIHRo ZW4gYyBlbHNlIGNvbXBhcmVfYXV4IChyMTo6dDEpIChyMjo6dDIpCiAgICAgIHwgKE5vZGUobDEs IHYxLCByMSwgXykgOjogdDEsIHQyKSAtPgogICAgICAgICAgY29tcGFyZV9hdXggKGwxIDo6IE5v ZGUoRW1wdHksIHYxLCByMSwgMCkgOjogdDEpIHQyCiAgICAgIHwgKHQxLCBOb2RlKGwyLCB2Miwg cjIsIF8pIDo6IHQyKSAtPgogICAgICAgICAgY29tcGFyZV9hdXggdDEgKGwyIDo6IE5vZGUoRW1w dHksIHYyLCByMiwgMCkgOjogdDIpCgogICAgYW5kIGNvbXBhcmUgczEgczIgPQogICAgICBjb21w YXJlX2F1eCBbczFdIFtzMl0KCiAgICAoKiBTZXRzIGFyZSByZXByZXNlbnRlZCBieSBiYWxhbmNl ZCBiaW5hcnkgdHJlZXMgKHRoZSBoZWlnaHRzIG9mIHRoZQogICAgICAgY2hpbGRyZW4gZGlmZmVy IGJ5IGF0IG1vc3QgMiAqKQoKICAgIGxldCBoZWlnaHQgPSBmdW5jdGlvbgogICAgICAgIEVtcHR5 IC0+IDAKICAgICAgfCBOb2RlKF8sIF8sIF8sIGgpIC0+IGgKCiAgICAoKiBDcmVhdGVzIGEgbmV3 IG5vZGUgd2l0aCBsZWZ0IHNvbiBsLCB2YWx1ZSB4IGFuZCByaWdodCBzb24gci4KICAgICAgIGwg YW5kIHIgbXVzdCBiZSBiYWxhbmNlZCBhbmQgfCBoZWlnaHQgbCAtIGhlaWdodCByIHwgPD0gMi4K ICAgICAgIElubGluZSBleHBhbnNpb24gb2YgaGVpZ2h0IGZvciBiZXR0ZXIgc3BlZWQuICopCgog ICAgbGV0IGNyZWF0ZSBsIHggciA9CiAgICAgIGxldCBobCA9IG1hdGNoIGwgd2l0aCBFbXB0eSAt PiAwIHwgTm9kZShfLF8sXyxoKSAtPiBoIGluCiAgICAgIGxldCBociA9IG1hdGNoIHIgd2l0aCBF bXB0eSAtPiAwIHwgTm9kZShfLF8sXyxoKSAtPiBoIGluCiAgICAgIE5vZGUobCwgeCwgciwgKGlm IGhsID49IGhyIHRoZW4gaGwgKyAxIGVsc2UgaHIgKyAxKSkKCiAgICAoKiBTYW1lIGFzIGNyZWF0 ZSwgYnV0IHBlcmZvcm1zIG9uZSBzdGVwIG9mIHJlYmFsYW5jaW5nIGlmIG5lY2Vzc2FyeS4KICAg ICAgIEFzc3VtZXMgbCBhbmQgciBiYWxhbmNlZC4KICAgICAgIElubGluZSBleHBhbnNpb24gb2Yg Y3JlYXRlIGZvciBiZXR0ZXIgc3BlZWQgaW4gdGhlIG1vc3QgZnJlcXVlbnQgY2FzZQogICAgICAg d2hlcmUgbm8gcmViYWxhbmNpbmcgaXMgcmVxdWlyZWQuICopCgogICAgbGV0IGJhbCBsIHggciA9 CiAgICAgIGxldCBobCA9IG1hdGNoIGwgd2l0aCBFbXB0eSAtPiAwIHwgTm9kZShfLF8sXyxoKSAt PiBoIGluCiAgICAgIGxldCBociA9IG1hdGNoIHIgd2l0aCBFbXB0eSAtPiAwIHwgTm9kZShfLF8s XyxoKSAtPiBoIGluCiAgICAgIGlmIGhsID4gaHIgKyAyIHRoZW4gYmVnaW4KICAgICAgICBtYXRj aCBsIHdpdGgKICAgICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnICJTZXQuYmFsIgogICAgICAg IHwgTm9kZShsbCwgbHYsIGxyLCBfKSAtPgogICAgICAgICAgICBpZiBoZWlnaHQgbGwgPj0gaGVp Z2h0IGxyIHRoZW4KICAgICAgICAgICAgICBjcmVhdGUgbGwgbHYgKGNyZWF0ZSBsciB4IHIpCiAg ICAgICAgICAgIGVsc2UgYmVnaW4KICAgICAgICAgICAgICBtYXRjaCBsciB3aXRoCiAgICAgICAg ICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyAiU2V0LmJhbCIKICAgICAgICAgICAgICB8IE5v ZGUobHJsLCBscnYsIGxyciwgXyktPgogICAgICAgICAgICAgICAgICBjcmVhdGUgKGNyZWF0ZSBs bCBsdiBscmwpIGxydiAoY3JlYXRlIGxyciB4IHIpCiAgICAgICAgICAgIGVuZAogICAgICBlbmQg ZWxzZSBpZiBociA+IGhsICsgMiB0aGVuIGJlZ2luCiAgICAgICAgbWF0Y2ggciB3aXRoCiAgICAg ICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyAiU2V0LmJhbCIKICAgICAgICB8IE5vZGUocmwsIHJ2 LCByciwgXykgLT4KICAgICAgICAgICAgaWYgaGVpZ2h0IHJyID49IGhlaWdodCBybCB0aGVuCiAg ICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbCB4IHJsKSBydiBycgogICAgICAgICAgICBlbHNl IGJlZ2luCiAgICAgICAgICAgICAgbWF0Y2ggcmwgd2l0aAogICAgICAgICAgICAgICAgRW1wdHkg LT4gaW52YWxpZF9hcmcgIlNldC5iYWwiCiAgICAgICAgICAgICAgfCBOb2RlKHJsbCwgcmx2LCBy bHIsIF8pIC0+CiAgICAgICAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGwgeCBybGwpIHJsdiAo Y3JlYXRlIHJsciBydiBycikKICAgICAgICAgICAgZW5kCiAgICAgIGVuZCBlbHNlCiAgICAgICAg Tm9kZShsLCB4LCByLCAoaWYgaGwgPj0gaHIgdGhlbiBobCArIDEgZWxzZSBociArIDEpKQoKICAg ICgqIFNhbWUgYXMgYmFsLCBidXQgcmVwZWF0IHJlYmFsYW5jaW5nIHVudGlsIHRoZSBmaW5hbCBy ZXN1bHQKICAgICAgIGlzIGJhbGFuY2VkLiAqKQoKICAgIGxldCByZWMgam9pbiBsIHggciA9CiAg ICAgIG1hdGNoIGJhbCBsIHggciB3aXRoCiAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgIlNl dC5qb2luIgogICAgICB8IE5vZGUobCcsIHgnLCByJywgXykgYXMgdCcgLT4KICAgICAgICAgIGxl dCBkID0gaGVpZ2h0IGwnIC0gaGVpZ2h0IHInIGluCiAgICAgICAgICBpZiBkIDwgLTIgb3IgZCA+ IDIgdGhlbiBqb2luIGwnIHgnIHInIGVsc2UgdCcKCiAgICAoKiBNZXJnZSB0d28gdHJlZXMgbCBh bmQgciBpbnRvIG9uZS4KICAgICAgIEFsbCBlbGVtZW50cyBvZiBsIG11c3QgcHJlY2VkZSB0aGUg ZWxlbWVudHMgb2Ygci4KICAgICAgIEFzc3VtZXMgfCBoZWlnaHQgbCAtIGhlaWdodCByIHwgPD0g Mi4gKikKCiAgICBsZXQgcmVjIG1lcmdlIHQxIHQyID0KICAgICAgbWF0Y2ggKHQxLCB0Mikgd2l0 aAogICAgICAgIChFbXB0eSwgdCkgLT4gdAogICAgICB8ICh0LCBFbXB0eSkgLT4gdAogICAgICB8 IChOb2RlKGwxLCB2MSwgcjEsIGgxKSwgTm9kZShsMiwgdjIsIHIyLCBoMikpIC0+CiAgICAgICAg ICBiYWwgbDEgdjEgKGJhbCAobWVyZ2UgcjEgbDIpIHYyIHIyKQoKICAgICgqIFNhbWUgYXMgbWVy Z2UsIGJ1dCBkb2VzIG5vdCBhc3N1bWUgYW55dGhpbmcgYWJvdXQgbCBhbmQgci4gKikKCiAgICBs ZXQgcmVjIGNvbmNhdCB0MSB0MiA9CiAgICAgIG1hdGNoICh0MSwgdDIpIHdpdGgKICAgICAgICAo RW1wdHksIHQpIC0+IHQKICAgICAgfCAodCwgRW1wdHkpIC0+IHQKICAgICAgfCAoTm9kZShsMSwg djEsIHIxLCBoMSksIE5vZGUobDIsIHYyLCByMiwgaDIpKSAtPgogICAgICAgICAgam9pbiBsMSB2 MSAoam9pbiAoY29uY2F0IHIxIGwyKSB2MiByMikKCiAgICAoKiBTcGxpdHRpbmcgKikKCiAgICBs ZXQgcmVjIHNwbGl0IHggPSBmdW5jdGlvbgogICAgICAgIEVtcHR5IC0+CiAgICAgICAgICAoRW1w dHksIE5vbmUsIEVtcHR5KQogICAgICB8IE5vZGUobCwgdiwgciwgXykgLT4KICAgICAgICAgIGxl dCBjID0gY29tcGFyZV9lbHQgeCB2IGluCiAgICAgICAgICBpZiBjID0gMCB0aGVuIChsLCBTb21l IHYsIHIpCiAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW4KICAgICAgICAgICAgbGV0IChsbCwg dmwsIHJsKSA9IHNwbGl0IHggbCBpbiAobGwsIHZsLCBqb2luIHJsIHYgcikKICAgICAgICAgIGVs c2UKICAgICAgICAgICAgbGV0IChsciwgdnIsIHJyKSA9IHNwbGl0IHggciBpbiAoam9pbiBsIHYg bHIsIHZyLCBycikKCiAgICAoKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2V0IG9wZXJhdGlvbnMg KikKCiAgICBsZXQgZW1wdHkgPSBFbXB0eQoKICAgIGxldCBpc19lbXB0eSA9IGZ1bmN0aW9uIEVt cHR5IC0+IHRydWUgfCBfIC0+IGZhbHNlCgogICAgbGV0IHJlYyBtZW0geCA9IGZ1bmN0aW9uCiAg ICAgICAgRW1wdHkgLT4gZmFsc2UKICAgICAgfCBOb2RlKGwsIHYsIHIsIF8pIC0+CiAgICAgICAg ICBsZXQgYyA9IGNvbXBhcmVfZWx0IHggdiBpbgogICAgICAgICAgYyA9IDAgfHwgbWVtIHggKGlm IGMgPCAwIHRoZW4gbCBlbHNlIHIpCgogICAgbGV0IHJlYyBhZGQgeCA9IGZ1bmN0aW9uCiAgICAg ICAgRW1wdHkgLT4gTm9kZShFbXB0eSwgeCwgRW1wdHksIDEpCiAgICAgIHwgTm9kZShsLCB2LCBy LCBfKSBhcyB0IC0+CiAgICAgICAgICBsZXQgYyA9IGNvbXBhcmVfZWx0IHggdiBpbgogICAgICAg ICAgaWYgYyA9IDAgdGhlbiB0IGVsc2UKICAgICAgICAgIGlmIGMgPCAwIHRoZW4gYmFsIChhZGQg eCBsKSB2IHIgZWxzZSBiYWwgbCB2IChhZGQgeCByKQoKICAgIGxldCBzaW5nbGV0b24geCA9IE5v ZGUoRW1wdHksIHgsIEVtcHR5LCAxKQoKICAgIGxldCByZWMgcmVtb3ZlIHggPSBmdW5jdGlvbgog ICAgICAgIEVtcHR5IC0+IEVtcHR5CiAgICAgIHwgTm9kZShsLCB2LCByLCBfKSAtPgogICAgICAg ICAgbGV0IGMgPSBjb21wYXJlX2VsdCB4IHYgaW4KICAgICAgICAgIGlmIGMgPSAwIHRoZW4gbWVy Z2UgbCByIGVsc2UKICAgICAgICAgIGlmIGMgPCAwIHRoZW4gYmFsIChyZW1vdmUgeCBsKSB2IHIg ZWxzZSBiYWwgbCB2IChyZW1vdmUgeCByKQoKICAgIGxldCByZWMgdW5pb24gczEgczIgPQogICAg ICBtYXRjaCAoczEsIHMyKSB3aXRoCiAgICAgICAgKEVtcHR5LCB0MikgLT4gdDIKICAgICAgfCAo dDEsIEVtcHR5KSAtPiB0MQogICAgICB8IChOb2RlKGwxLCB2MSwgcjEsIGgxKSwgTm9kZShsMiwg djIsIHIyLCBoMikpIC0+CiAgICAgICAgICBpZiBoMSA+PSBoMiB0aGVuCiAgICAgICAgICAgIGlm IGgyID0gMSB0aGVuIGFkZCB2MiBzMSBlbHNlIGJlZ2luCiAgICAgICAgICAgICAgbGV0IChsMiwg XywgcjIpID0gc3BsaXQgdjEgczIgaW4KICAgICAgICAgICAgICBqb2luICh1bmlvbiBsMSBsMikg djEgKHVuaW9uIHIxIHIyKQogICAgICAgICAgICBlbmQKICAgICAgICAgIGVsc2UKICAgICAgICAg ICAgaWYgaDEgPSAxIHRoZW4gYWRkIHYxIHMyIGVsc2UgYmVnaW4KICAgICAgICAgICAgICBsZXQg KGwxLCBfLCByMSkgPSBzcGxpdCB2MiBzMSBpbgogICAgICAgICAgICAgIGpvaW4gKHVuaW9uIGwx IGwyKSB2MiAodW5pb24gcjEgcjIpCiAgICAgICAgICAgIGVuZAoKICAgIGxldCByZWMgaW50ZXIg czEgczIgPQogICAgICBtYXRjaCAoczEsIHMyKSB3aXRoCiAgICAgICAgKEVtcHR5LCB0MikgLT4g RW1wdHkKICAgICAgfCAodDEsIEVtcHR5KSAtPiBFbXB0eQogICAgICB8IChOb2RlKGwxLCB2MSwg cjEsIF8pLCB0MikgLT4KICAgICAgICAgIG1hdGNoIHNwbGl0IHYxIHQyIHdpdGgKICAgICAgICAg ICAgKGwyLCBOb25lLCByMikgLT4KICAgICAgICAgICAgICBjb25jYXQgKGludGVyIGwxIGwyKSAo aW50ZXIgcjEgcjIpCiAgICAgICAgICB8IChsMiwgU29tZSBfLCByMikgLT4KICAgICAgICAgICAg ICBqb2luIChpbnRlciBsMSBsMikgdjEgKGludGVyIHIxIHIyKQoKICAgIGxldCByZWMgZGlmZiBz MSBzMiA9CiAgICAgIG1hdGNoIChzMSwgczIpIHdpdGgKICAgICAgICAoRW1wdHksIHQyKSAtPiBF bXB0eQogICAgICB8ICh0MSwgRW1wdHkpIC0+IHQxCiAgICAgIHwgKE5vZGUobDEsIHYxLCByMSwg XyksIHQyKSAtPgogICAgICAgICAgbWF0Y2ggc3BsaXQgdjEgdDIgd2l0aAogICAgICAgICAgICAo bDIsIE5vbmUsIHIyKSAtPgogICAgICAgICAgICAgIGpvaW4gKGRpZmYgbDEgbDIpIHYxIChkaWZm IHIxIHIyKQogICAgICAgICAgfCAobDIsIFNvbWUgXywgcjIpIC0+CiAgICAgICAgICAgICAgY29u Y2F0IChkaWZmIGwxIGwyKSAoZGlmZiByMSByMikKCiAgICBsZXQgZXF1YWwgczEgczIgPQogICAg ICBjb21wYXJlIHMxIHMyID0gMAoKICAgIGxldCByZWMgc3Vic2V0IHMxIHMyID0KICAgICAgbWF0 Y2ggKHMxLCBzMikgd2l0aAogICAgICAgIEVtcHR5LCBfIC0+CiAgICAgICAgICB0cnVlCiAgICAg IHwgXywgRW1wdHkgLT4KICAgICAgICAgIGZhbHNlCiAgICAgIHwgTm9kZSAobDEsIHYxLCByMSwg XyksIChOb2RlIChsMiwgdjIsIHIyLCBfKSBhcyB0MikgLT4KICAgICAgICAgIGxldCBjID0gY29t cGFyZV9lbHQgdjEgdjIgaW4KICAgICAgICAgIGlmIGMgPSAwIHRoZW4KICAgICAgICAgICAgc3Vi c2V0IGwxIGwyICYmIHN1YnNldCByMSByMgogICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuCiAg ICAgICAgICAgIHN1YnNldCAoTm9kZSAobDEsIHYxLCBFbXB0eSwgMCkpIGwyICYmIHN1YnNldCBy MSB0MgogICAgICAgICAgZWxzZQogICAgICAgICAgICBzdWJzZXQgKE5vZGUgKEVtcHR5LCB2MSwg cjEsIDApKSByMiAmJiBzdWJzZXQgbDEgdDIKCiAgICBsZXQgcmVjIGl0ZXIgZiA9IGZ1bmN0aW9u CiAgICAgICAgRW1wdHkgLT4gKCkKICAgICAgfCBOb2RlKGwsIHYsIHIsIF8pIC0+IGl0ZXIgZiBs OyBmIHY7IGl0ZXIgZiByCgogICAgbGV0IHJlYyBmb2xkIGYgcyBhY2N1ID0KICAgICAgbWF0Y2gg cyB3aXRoCiAgICAgICAgRW1wdHkgLT4gYWNjdQogICAgICB8IE5vZGUobCwgdiwgciwgXykgLT4g Zm9sZCBmIGwgKGYgdiAoZm9sZCBmIHIgYWNjdSkpCgogICAgbGV0IHJlYyBmb3JfYWxsIHAgPSBm dW5jdGlvbgogICAgICAgIEVtcHR5IC0+IHRydWUKICAgICAgfCBOb2RlKGwsIHYsIHIsIF8pIC0+ IHAgdiAmJiBmb3JfYWxsIHAgbCAmJiBmb3JfYWxsIHAgcgoKICAgIGxldCByZWMgZXhpc3RzIHAg PSBmdW5jdGlvbgogICAgICAgIEVtcHR5IC0+IGZhbHNlCiAgICAgIHwgTm9kZShsLCB2LCByLCBf KSAtPiBwIHYgfHwgZXhpc3RzIHAgbCB8fCBleGlzdHMgcCByCgogICAgbGV0IGZpbHRlciBwIHMg PQogICAgICBsZXQgcmVjIGZpbHQgYWNjdSA9IGZ1bmN0aW9uCiAgICAgICAgfCBFbXB0eSAtPiBh Y2N1CiAgICAgICAgfCBOb2RlKGwsIHYsIHIsIF8pIC0+CiAgICAgICAgICAgIGZpbHQgKGZpbHQg KGlmIHAgdiB0aGVuIGFkZCB2IGFjY3UgZWxzZSBhY2N1KSBsKSByIGluCiAgICAgIGZpbHQgRW1w dHkgcwoKICAgIGxldCBwYXJ0aXRpb24gcCBzID0KICAgICAgbGV0IHJlYyBwYXJ0ICh0LCBmIGFz IGFjY3UpID0gZnVuY3Rpb24KICAgICAgICB8IEVtcHR5IC0+IGFjY3UKICAgICAgICB8IE5vZGUo bCwgdiwgciwgXykgLT4KICAgICAgICAgICAgcGFydCAocGFydCAoaWYgcCB2IHRoZW4gKGFkZCB2 IHQsIGYpIGVsc2UgKHQsIGFkZCB2IGYpKSBsKSByIGluCiAgICAgIHBhcnQgKEVtcHR5LCBFbXB0 eSkgcwoKICAgIGxldCByZWMgY2FyZGluYWwgPSBmdW5jdGlvbgogICAgICAgIEVtcHR5IC0+IDAK ICAgICAgfCBOb2RlKGwsIHYsIHIsIF8pIC0+IGNhcmRpbmFsIGwgKyAxICsgY2FyZGluYWwgcgoK ICAgIGxldCByZWMgZWxlbWVudHNfYXV4IGFjY3UgPSBmdW5jdGlvbgogICAgICAgIEVtcHR5IC0+ IGFjY3UKICAgICAgfCBOb2RlKGwsIHYsIHIsIF8pIC0+IGVsZW1lbnRzX2F1eCAodiA6OiBlbGVt ZW50c19hdXggYWNjdSByKSBsCgogICAgbGV0IGVsZW1lbnRzIHMgPQogICAgICBlbGVtZW50c19h dXggW10gcwoKICAgIGxldCByZWMgbWluX2VsdCA9IGZ1bmN0aW9uCiAgICAgICAgRW1wdHkgLT4g cmFpc2UgTm90X2ZvdW5kCiAgICAgIHwgTm9kZShFbXB0eSwgdiwgciwgXykgLT4gdgogICAgICB8 IE5vZGUobCwgdiwgciwgXykgLT4gbWluX2VsdCBsCgogICAgbGV0IHJlYyBtYXhfZWx0ID0gZnVu Y3Rpb24KICAgICAgICBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmQKICAgICAgfCBOb2RlKGwsIHYs IEVtcHR5LCBfKSAtPiB2CiAgICAgIHwgTm9kZShsLCB2LCByLCBfKSAtPiBtYXhfZWx0IHIKCiAg ICBsZXQgY2hvb3NlID0gbWluX2VsdAoKICBlbmQK --CKE+e+ll0J-- ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners