c<"z55.5.0+dev0-2025-04-28/$Misc+fatal_error@&string@@@!a@A@@@@4../../utils/misc.mliYY@@$Misc@@@,fatal_errorf@&Stdlib'format4!a@ A@&Stdlib&Format)formatter@@@ $unit@@@ !b@ A@ @@@  @@ @5\DD6\D@@4A@@±+Fatal_errorA##exnG@@@AB`C`@@AB@B@+try_finally&always&optionL@0@@@ 5@@@ @@ @@@ -exceptionally@D@@@ I@@@ @@ @@@ @@S@@@ !a@ B@ @@ @@ @@ @@ @dAAg@@C@@(@@@ @@ @@ @@ @P   P  @@F@@.map_left_right@@!a@ B@ !b@ B@ @@ @_)@@@ e*@@@ @@ @@ @/S l l0S l @@.G@@(for_all2@@!a@ !B@ @!b@ #B@ $bool+@@@ @@ @@ @,@@@ @-@@@ .@@@ @@ @@ @@ @eV  fV .@@dH@@.replicate_list@!a@ +B@ $@#int/@@@ %0@@@ '@@ (@@ )@[[@@I@@+list_remove@!a@ 4B@ ,@1 @@@ .2@@@ 0@@ 1@@ 2@_}}_}@@J@@*split_last@3!a@ =B@ 5@@@ 7@4@@@ 9@@@ :@@ ;@cc=@@K@@.repeated_label@ 6@5@@@ >@@@ @@!a@ JB@ A@@ B@@@ D7@@@ E@@@ G@@ H@ff@@L@@0create_hashtable@8@@@ K@E9@!a@B@ L@!b@B@ M@@ N@@@ P&Stdlib:'Hashtbl!t@@@@@@@@-k88.k8y@@,M@@ӱ&StdlibB@ӱ$ListC@!tD;!a@@A@A; E@@@@Y@@@@@SujnTuj@@@@RN@A@'compare@@!a@E@@<@@@@@@@@$Misc=&Stdlib$List!t@@@@$Misc>&Stdlib$List!t*@@@?@@@@@@@@@@ww@@O@@%equal@@!a@E@@[@@@@@@@@@$MiscA&Stdlib$List!t@@@@$MiscB&Stdlib$List!t*@@@~C@@@@@@@@@@{HL{H@@P@@=some_if_all_elements_are_some@$MiscD&Stdlib$List!t!a@E@@@@@@@$MiscE&Stdlib$List!t@@@@@@@@@U@@Q@@+map2_prefix@@!a@E@@!b@E@!c@E@@@@@@$MiscF&Stdlib$List!t"@@@@$MiscG&Stdlib$List!t)@@@@$MiscH&Stdlib$List!t4@@@砠@$MiscI&Stdlib$List!tI@@@@@@@@@@@@a#bf@@`R@@&iteri2@@J@@@@!a@E@@!b@E@\K@@@@@@@@@@L@@@@M@@@qN@@@@@@@@@@  U@@S@@(split_at@0O@@@@$MiscP&Stdlib$List!t!a@E@@@@ @$MiscQ&Stdlib$List!t@@@ @$MiscR&Stdlib$List!t&@@@@@@@@@@ @@T@@)chunks_of@uS@@@@$MiscT&Stdlib$List!t!a@E@@@@$MiscV&Stdlib$List!t$MiscU&Stdlib$List!t@@@@@@@@@@@!" @@ U@@)is_prefix%equal@!a@-E@ @W@@@!@@"@@#@{X@@@%#of_Y@@@'Z@@@(@@)@@*@@+@T Uer@@SV@@@@Z@@@@@_@@@@@@@@@W@A@ #find_and_chop_longest_common_prefix%equal@!a@aF@S@b^@@@T@@U@@V%first_@@@X&second` @@@Z$Misca&Stdlib$ListC@c@@@ӱ&StringI@!tIJ;@@@A&stringQ@@@@@@@*string.mliK  K  @@@@.Stdlib__String@@A@$makeJ@#intA@@@@$charB@@@!@@@@@@@@N   N  =@@A@@$initK@@@@@@%@@@!@@@@@@@@@@@@@@>T  ?T @@=B@@%emptyLM@@@@K[L[@@JC@@&lengthM@\@@@M@@@@@.%string_lengthAA @@@ca((da(Z@@bD@@#getN@t@@@@g@@@c@@@@@@@0%string_safe_getBA@@@@dd@@E@@(of_bytesO@%bytesC@@@@@@@@@juuju@@F@@(to_bytesP@@@@@@@@@@qq@@G@@$blitQ@@@@@@@@@4@@@@@@@@@@@$unitF@@@@@@@@@@@@@@xy@@H@@&concatR@@@@@$listK@@@@@@@@@@@@@@sss@@I@@#catS@@@@@ @@@@@@@@@@@ttt@@J@@%equalT@(@@@@@@@$boolE@@@@@@@@)rr*r@@(K@@'compareU@@@@~@@@@}/@@@|@@{@@z@@A*@@?L@@+starts_withV&prefixS@@@y@Y@@@x4@@@w@@v@@u@[\%@@ZM@@)ends_withW&suffixn@@@t@t@@@sO@@@r@@q@@p@vw@@uN@@-contains_fromX@@@@o@z@@@n@x@@@mn@@@l@@k@@j@@i@RRR@@O@@.rcontains_fromY@@@@h@@@@g@@@@f@@@e@@d@@c@@b@666h@@P@@(containsZ@@@@a@@@@`@@@_@@^@@]@000U@@Q@@#sub[@@@@\@@@@[@@@@Z@@@Y@@X@@W@@V@@@R@@-split_on_char\@@@@U@@@@T @@@S@@@R@@Q@@P@  @@ S@@#map]@@@@@O@@@N@@M@'@@@L+@@@K@@J@@I@)aa*a@@(T@@$mapi^@@)@@@H@'@@@G+@@@F@@E@@D@L@@@CP@@@B@@A@@@@NOE@@MU@@)fold_left_@@#acc@@L@@@? @@>@@=@ @o@@@<@@;@@:@@9@mn@@lV@@*fold_right`@@e@@@8@#acc@@@7@@6@@@@5@  @@4@@3@@2@@@W@@&existsb@@@@@*z@@@)@@(@@@@'@@@&@@%@@$@   !@@Y@@$trimc@@@@#@@@"@@!@!!!!@@Z@@'escapedd@@@@ @@@@@@"H"H"H"f@@[@@/uppercase_asciie@@@@@@@@@@$y$y$y$@@\@@/lowercase_asciif@@@@@@@@@@ %E%E %E%k@@]@@0capitalize_asciig@@@@ @@@@@@ && &&8@@ ^@@2uncapitalize_asciih@@@@@@@@@@&&&&@@_@@$iteri@@@@@^@@@@@@:@@@h@@@ @@ @@ @<!''=!''@@;`@@%iterij@@<@@@ @:@@@ @@@@@@@@_@@@@@@@@@@@a%((b%((@@`a@@*index_fromk@r@@@@e@@@@c@@@o@@@@@@@@@@-)P)P-)P)}@@b@@.index_from_optl@@@@@@@@@@@@&optionL@@@@@@@@@@@@@5*o*o5*o*@@c@@+rindex_fromm@@@@@@@@@@@@@@@@@@@@@@<+o+o<+o+@@d@@/rindex_from_optn@@@@@@@@@@@@E@@@@@@@@@@@@@C,,C,,@@e@@%indexo@@@@@@@@@@@@@@@@J--J--@@f@@)index_optp@@@@@@@@|@@@@@@@@@@@ M--!M-.@@g@@&rindexq@1@@@@@@@(@@@@@@@@9R.n.n:R.n.@@8h@@*rindex_optr@J@@@@5@@@E@@@@@@@@@@@WU..XU./@@Vi@@&to_seqs@H@@@&Stdlib#Seq!tZ@@@@@@@@@t\//u\//@@sj@@'to_seqit@e@@@#Seq!t@@@@Ǡ@~@@@@@@@@@@@b0 0 b0 0/@@k@@&of_sequ@>#Seq!t@@@@@@@@@@@@g00g00@@l@@/get_utf_8_ucharv@@@@@@@@a%Uchar*utf_decode@@@@@@@@r1V1Vr1V1@@m@@.is_valid_utf_8w@@@@@@@@@@v11v11@@n@@2get_utf_16be_ucharx@@@@@@@@%Uchar*utf_decode@@@@@@@@|2o2o|2o2@@o@@1is_valid_utf_16bey@@@@@@@@@@ 22 23@@ p@@2get_utf_16le_ucharz@@@@@@@@%Uchar*utf_decode@@@@@@@@'33(33@@&q@@1is_valid_utf_16le{@@@@@@@@@@94(4(:4(4I@@8r@@-edit_distance|%limit=@@@@@@@7@@@@<@@@L@@@@@@@@@@]44^44@@\s@@*spellcheck}(max_dist$@u@@@f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8888@@t@@)get_uint8~@@@@@@@@@@@@@@@@?;?;?;?_@@u@@(get_int8@@@@@@@@@@@@@@@@????@@v@@-get_uint16_ne@@@@@@@@@@@@@@@@@]@]@]@@@w@@-get_uint16_be@@@@@@@@@@@@@~@@}@AAAA/@@x@@-get_uint16_le@@@@|@@@@{@@@z@@y@@x@AAAA@@y@@,get_int16_ne@'@@@w@@@@v@@@u@@t@@s@/BXBX0BXB@@.z@@,get_int16_be@@@@@r@3@@@q7@@@p@@o@@n@HBBIBC%@@G{@@,get_int16_le@Y@@@m@L@@@lP@@@k@@j@@i@aCCbCC@@`|@@,get_int32_ne@r@@@h@e@@@g%int32N@@@f@@e@@d@| DGDG} DGDp@@{}@@$hash@m@@@c}@@@b@@a@DDDD@@~@@+seeded_hash@@@@`@@@@_@@@^@@]@@\@EEEE@@@@,get_int32_be@@@@[@@@@ZE@@@Y@@X@@W@ FF FF@@@@@,get_int32_le@@@@V@@@@U^@@@T@@S@@R@'GfGf'GfG@@A@@,get_int64_ne@@@@Q@@@@P%int64O@@@O@@N@@M@.HH.HH0@@B@@,get_int64_be@@@@L@@@@K@@@J@@I@@H@ 5HH 5HH@@ C@@,get_int64_le@@@@G@@@@F4@@@E@@D@@C@%<IFIF&<IFIo@@$D@@*unsafe_get@6@@@B@)@@@A%@@@@@@?@@>2%string_unsafe_getBA@@@@CGJ3J3DGJ3Ju@@BE@@+unsafe_blit@T@@@=@G@@@<@@@@;@S@@@:@Y@@@9@@@8@@7@@6@@5@@4@@30caml_blit_stringE@@@@@@@@vHJvJvwJJJ@'noalloc}JJJ~JJJ@@JJJ @@F@@ӱ#SetK@#eltL;@@@A Q@@@\@@@@ | }@@@@ {d@A@!tL;@@@A@@@@@'set.mliJ U YJ U _@@@@+Stdlib__SetD@A@%empty@@@[@M ~ M ~ @@E@@#add@1@@@Z@@@@Y@@@X@@W@@V@&P  'P  @@%F@@)singleton@@@@U)@@@T@@S@7V  8V  @@6G@@&remove@(@@@R@<@@@Q?@@@P@@O@@N@MY 5 9NY 5 R@@LH@@%union@M@@@M@R@@@LU@@@K@@J@@I@c_]ad_]w@@bI@@%inter@c@@@H@h@@@Gk@@@F@@E@@D@ybzb@@xJ@@(disjoint@y@@@C@~@@@B$boolE@@@A@@@@@?@ee@@K@@$diff@@@@>@@@@=@@@<@@;@@:@i(,i(A@@L@@(cardinal@@@@9#intA@@@8@@7@mm@@M@@(elements@@@@6$listK@@@5@@@4@@3@rr7@@N@@'min_elt@@@@2@@@1@@0@x x5@@O@@+min_elt_opt@@@@/&optionL@@@.@@@-@@,@}}@@P@@'max_elt@@@@+@@@*@@)@@@ Q@@+max_elt_opt@@@@()@@@'@@@&@@%@$%>@@#R@@&choose@$@@@$@@@#@@"@56@@4S@@*choose_opt@5@@@!P-@@@ @@@@@@KL@@JT@@$find@<@@@@P@@@D@@@@@@@@ab@@`U@@(find_opt@R@@@@f@@@^@@@@@@@@@@@|x|}x@@{V@@*find_first@@o@@@@@@@@@@@@{@@@@@ @@ @KOKx@@W@@.find_first_opt@@@@@ @@@ @@ @@@@@@@@@@@@@@@RVR@@X@@)find_last@@@@@=@@@@@@@@@@@@@@@@@{{@@Y@@-find_last_opt@@@@@Y@@@@@@@@@@@@@@@@@@@@@@Z@@$iter@@@@@$unitF@@@@@@@@@ @@@@@@@@@@[@@$fold@@@@@@#acc@%@@@@@"@@@@  @@@@@@@23@@1\@@#map@@%@@@(@@@@@@<@@@?@@@@@@@@MN@@L]@@&filter@@@@@@@@@@@@X@@@[@@@@@@@@i  j  @@h^@@*filter_map@@\@@@c@@@@@@@@@x@@@{@@@@@@@@"" ""7@@_@@)partition@@|@@@ @@@@@@@@@@@@@ˠ@@@@@@@@@@@$;$?$;$i@@`@@%split@@@@@@@@@@@@à@>@@@Ġ@@@@@@@@@@@%Z%^%Z%@@a@@(is_empty@@@@U@@@@@@'$'('$'?@@b@@#mem@@@@@@@@l@@@@@@@@'p't'p'@@c@@%equal@@@@@@@@@@@@@@@@ '' ''@@d@@'compare@@@@@@@@p@@@@@@@@*(_(c+(_(}@@)e@@&subset@*@@@@/@@@@@@@@@@@A((B() @@@f@@'for_all@@4@@@@@@@@@L@@@@@@@@@@@^)f)j_)f)@@]g@@&exists@@Q@@@@@@@@@i@@@@@@@@@@@{))|)*@@zh@@'to_list@{@@@s@@@@@@@@@ ** **@@i@@'of_list@Ҡ@@@@@@@@@@@@$+ + $+ +'@@j@@+to_seq_from@@@@@@@@&Stdlib#Seq!t@@@@@@@@@@@*,,*,,/@@k@@&to_seq@@@@#Seq!t@@@@@@@@@/,,/,,@@l@@*to_rev_seq@@@@5#Seq!t@@@@@@@@@3-*-.3-*-M@@m@@'add_seq@K#Seq!t@@@@@@@@@@ @@@@@@@@7--7--@@n@@&of_seq@i#Seq!t@@@~@@@}#@@@|@@{@1;..2;...@@0o@@@@?@e@@@ӱ#MapYM@#key,N;@@@AT@@@@@@@ @@@@f@A@!t-N;!a@@A@A@I@B@@@'map.mliI V ZI V e@@@@+Stdlib__MapD@A@%empty.!a@@@@@L  L  @@E@@#add/@<@@@@!a@@  @@@$ @@@@@@@@@@3O  4O  @@2F@@+add_to_list0@@@@@!a@@>$listK@@@@@@I @@@@@@@@@@@@@]X  ^X  @@\G@@&update1@I@@@@@&optionL!a@@@@  @@@@@@v@@@z@@@@@@@@@@^^@@H@@)singleton2@u@@@@!a@@@@@@@@@jW[jW{@@I@@&remove3@@@@@!a@@@@@@@@@@@@oo@@J@@%merge4@@@@@@`!a@u@@@@k!b@s@@@t!c@q@@@@@@@@@@@@@@@@@@@@@@@@@@@vY]x@@K@@%union5@@@@@@!a@e@ @@@@@@@@@@@@@@@@@@@@@@@@@@@)fj*f@@(L@@(cardinal6@)!a@`@@@#intA@@@@@@BC@@AM@@(bindings7@B!a@[@@@ @>@@@@@@@@@@@@c8<d8a@@bN@@+min_binding8@c!a@U@@@@[@@@@@@@@@bfb@@~O@@/min_binding_opt9@!a@P@@@#@{@@@@@@@@@@@@JNJ|@@P@@+max_binding:@!a@J@@@@@@@@@@@@@484[@@Q@@/max_binding_opt;@!a@E@@@`@@@@@@@@@@@@@ @@R@@&choose<@ݠ!a@?@@@@@@@~@@@}@@|@@@S@@*choose_opt=@!a@:@@@{@@@@z@@@y@@@x@@w@@@T@@$find>@@@@v@!a@3@@@u@@t@@s@23@@1U@@(find_opt?@@@@r@7!a@.@@@q۠ @@@p@@o@@n@OIMPIs@@NV@@*find_first@@@=@@@m$boolE@@@l@@k@\!a@&@@@j@T@@@i@@@h@@g@@f@x  y  D@@wW@@.find_first_optA@@f@@@e)@@@d@@c@!a@@@@b'@@@@a@@@`@@@_@@^@@]@"*"."*"l@@X@@)find_lastB@@@@@\U@@@[@@Z@!a@@@@Y@@@@X@@@W@@V@@U@#_#c#_#@@Y@@-find_last_optC@@@@@T|@@@S@@R@֠!a@ @@@Qz@@@@P@@@O@@@N@@M@@L@$y$}$y$@@Z@@$iterD@@@@@K@!a@$unitF@@@J@@I@@H@ @@@G @@@F@@E@@D@%%%& @@[@@$foldE@@ @@@C@!a@@#acc@@@B@@A@@@@0@@@?@  @@>@@=@@<@A'%')B'3'l@@@\@@#mapF@@!a@!b@@@;@M @@@:Q @@@9@@8@@7@`(e(ia(e(@@_]@@$mapiG@@N@@@6@!a@!b@@@5@@4@q @@@3u @@@2@@1@@0@))))@@^@@&filterH@@r@@@/@!a@;@@@.@@-@@,@ @@@+@@@*@@)@@(@****@@_@@*filter_mapI@@@@@'@!a@O!b@@@@&@@%@@$@@@@# @@@"@@!@@ @ ,, ,,?@@`@@)partitionJ@@@@@@!a@@@@@@@@@ @@@@@@@@@@@@@@@@@@.../%@@a@@%splitK@@@@@!a@@@@@ @@@@@@@@@@@@@@@@@@,$0'0+-$0'0\@@+b@@(is_emptyL@,!a@@@@ @@@ @@ @C022!D022;@@Bc@@#memM@/@@@ @H!a@@@@ @@@@@@@@_32l2p`32l2@@^d@@%equalN@@!a@@@@@@@@@@m@@@@s@@@#@@@@@@@@@@722723-@@e@@'compareO@@!a@@]@@@@@@@@@@@@@@@m@@@@@@@@@@=4(4,=4(4a@@f@@'for_allP@@@@@@!a@d@@@@@@@@ @@@n@@@@@@@@A45A450@@g@@&existsQ@@@@@@!a@@@@@@@@@ @@@@@@@@@@@F55F55@@h@@'to_listR@!a@@@@@@@@⠠@@@@@@@@@M6~6M6~6@@i@@'of_listS@ՠ@ @@@ޠ@!a@@@@@@(@@@@@@7Q668Q67@@6j@@&to_seqT@7!a@}@@@&Stdlib#Seq!t@9@@@ؠ@@@@@@@@@^W77_W77@@]k@@*to_rev_seqU@^!a@w@@@'#Seq!t@]@@@Ӡ@@@@@@@@@[8A8E[8A8n@@l@@+to_seq_fromV@n@@@@!a@p@@@P#Seq!t@@@@͠@@@@@@@@@@@_88_88@@m@@'add_seqW@l#Seq!t@@@@Ƞ@!a@f@@@@@@  @@@Ơ@@@@@@@@d99d99@@n@@&of_seqX@#Seq!t@@@@@!a@_@@@@@@@@@@@h::h::>@@o@@@@@g@@@ӱ#TblO@#keyP;@@@A v@@@w@@@@  $  5@@@@h@A@!tP;!a@@A@A@O@B@@@+hashtbl.mliw<<w<<@@@@/Stdlib__Hashtbld@A@&create@#intA@@@v!!a@@@@u@@t@x<<#x<<;@@e@@%clear@!a@@@@s$unitF@@@r@@q@5y<<<@6y<<@@Sp@@2filter_map_inplace@@@@@>@!a@Q@@@=@@<@@;@^@@@:F@@@9@@8@@7@y>>z>C>M@@xq@@$fold@@@@@6@!a@H@#acc@F@@5@@4@@3@@@@2@  @@1@@0@@/@>f>j>u>@@r@@&length@!a@B@@@.@@@-@@,@>>>>@@s@@%stats@!a@>@@@+*statistics@@@*@@)@>>>>@@t@@&to_seq@Ơ!a@9@@@(&Stdlib#Seq!t@w@@@'@@@&@@@%@@$@????+@@u@@+to_seq_keys@@@4@@@#%#Seq!t@@@"@@@!@@ @?D?H?D?j@@v@@-to_seq_values@ !a@.@@@C#Seq!t @@@@@@,??-??@@+w@@'add_seq@$!a@*@@@@`#Seq!t@@@@@@@@@@#@@@@@@@@V??W??@@Ux@@+replace_seq@N!a@"@@@@#Seq!t@@@@@@@@@@M@@@@@@@@@@@@E@@y@@&of_seq@#Seq!t@@@@@!a@@@ @@@ @@@ @@ @@^@b@^@@@z@@@@  @i@@@%print@&Stdlibq&Format)formatter@@@x@r@@@ys@@@z@@{@@|@ 7 ; 7 d@@j@@'for_all@@$chart@@@}u@@@~@@@ v@@@w@@@@@@@@ f j f @@k@@@@pr  @l@@@'compare@!a@Q@@x@@@@@@@(%compareBA @@@@    @@m@@@@q  @n@@@,find_in_path@[z0y@@@@@@@8{@@@=|@@@@@@@@6!!7!!2@@5o@@0find_in_path_rel@}~R}@@@@@@@Z@@@_@@@@@@@@X!j!jY!j!@@Wp@@8normalized_unit_filename@o@@@&Stdlib&Result!t~@@@@@@@@@@@@~"r"r"r"@@}q@@7find_in_path_normalized@@@@@@@@@@@@@@@@@@@""""@@r@@+remove_file@@@@@@@@@@####@@s@@0expand_directory@@@@@@@@@@@@@@@@$V$V$V$@@t@@3split_path_contents#sep @@@@@@@@@@*@@@@@@@@@@@%%%%S@@u@@)copy_file@&Stdlib*in_channel@@@@&Stdlib+out_channel@@@@@@@@@@@&&&&@@v@@/copy_file_chunk@&Stdlib*in_channel@@@@&Stdlib+out_channel@@@@@@@@@@@@@@@@@D'F'FE'F'@@Cw@@.string_of_file@&Stdlib*in_channel@@@c@@@@@@\(-(-](-(U@@[x@@-/7/S@@<@@/no_overflow_add@@@@@@@@ @@@@@@@@Y1//Z1//@@X@@@/no_overflow_sub@@@@@@@@&@@@@@@@@u50N0Nv50N0u@@tA@@/no_overflow_mul@@@@@@@@B@@@@@@@@900901@@B@@/no_overflow_lsl@$@@@@+@@@^@@@@@@@ @=11=11@@C@@-letter_of_int@@@@@ @@@ @@ @A2 2 A2 2A@@D@@ӱ5Int_literal_converterQ@#int@@@@ `@@@@@@D2f2hD2f2@@E@@%int32@@@@%int32@@@@@@I3B3DI3B3_@@F@@%int64@ @@@%int64@@@@@@ L33 L33@@G@@)nativeint@ @@@)nativeint@@@@@@O33 O33@@H@@@@#C2C2C$R44@"I@@@/find_first_mono@@@@@@@@@@@@@@@@?T44@T44I@@>J@@0search_substring@V@@@@]@@@@@@@ @@@!@@"@@#@@$@bi7575ci757i@@aK@@1replace_substring&before{@@@%%after@@@&@@@@'@@@(@@)@@*@@+@o8`8`o8`8@@L@@/rev_split_words@@@@,Ҡ@@@-@@@/@@0@t9R9Rt9R9|@@M@@&cut_at@@@@1@@@@2@@@@3@@@@4@@5@@6@@7@x::x::.@@N@@.ordinal_suffix@^@@@8@@@9@@:@;;;;@@O@@-normalise_eol@@@@;@@@<@@=@<<<=@@P@@1delete_eol_spaces@ @@@>@@@?@@@@ == =>$@@ Q@@-ref_and_valueR;@@!R&Stdlib#ref!a@ES@A@@@CS@F@$Misc-ref_and_value@@@H5>?6>? @@4S@@@A@@@@@9>>@@@@7R@A@,protect_refs@$Misc-ref_and_value@@@Y@@@[@@.@@@\!a@bS@]@@^@@_@@`@`?"?"a?"?]@@_T@@'get_ref@&Stdlib#ref!a@lS@c@@@e@@@g @@@i@@j@@L@L@L@o@@U@@-set_or_ignore@@!a@{S@mJ!b@}S@n@@@p@@q@&Stdlib#ref_@@@s@@@u@#@@@v@@w@@x@@y@@@@A3@@V@@$fst3@@!a@S@~@!b@S@@!c@S@@@@@@AAAB @@W@@$snd3@@!a@S@@!b@S@@!c@S@@@@@@ BB BB*@@ X@@$thd3@@!a@S@@!b@S@@!c@S@@@@@@ *B+B+ +B+BG@@ )Y@@$fst4@@!a@S@@!b@S@@!c@S@@!d@S@@@@@@ WBIBI XBIBj@@ VZ@@$snd4@@!a@S@@!b@S@@!c@S@@!d@S@@@@@@ BkBk BkB@@ [@@$thd4@@!a@S@@!b@S@@!c@S@@!d@S@@@@@@ BB BB@@ \@@$for4@@!a@S@ɠ@!b@S@ʠ@!c@S@ˠ@!d@S@@@@@@ BB BB@@ ]@@-edit_distance@ @@@@ @@@@@@@ @@@@@@@@@@@@@!CC!CCG@@!^@@*spellcheck@ M!"@@@@@@@!*@@@ _!4@@@@@@@@@@@!.E1E1!/E1Ef@@!-_@@*align_hintA&prefix!G@@@$main*Format_doc!t@@@ 0$hint*Format_doc!t@@@ 1@*Format_doc!t@@@ 2@*Format_doc!t@@@ 3@@ 4@@ 5@@ 6@@ 7@!nFhFh!oFF@@!m`@@0align_error_hintB$main*Format_doc!t@@@ 8$hint*Format_doc!t@@@ 9@*Format_doc!t@@@ :@*Format_doc!t@@@ ;@@ <@@ =@@ >@!JJ!JJ@@!a@@,aligned_hintC&prefix!@@@ ?@*Format_doc)formatter@@@ @@&Stdlib'format4!a@ RS@ A*Format_doc)formatter@@@ B!@@@ C@!*Format_doc!t@@@ D@@@ F!@@@ G@@ H@@@ M+@@ N@@ O@@ P@!KK!KKK@@!b@@,did_you_meanD"pp!*Format_doc'printer"@@@ S@@@ U@@@ ]@!S"(@@@ V@@@ X!Ӡ*Format_doc!t@@@ Y@@@ [@@ \@@ ^@"/LHLH"0L[L@@".c@@ӱ%ColorKS@'settingET;@@$AutoF@@"DMM"EMM@@"Ce@&AlwaysG@@"MMM"NMM@@"Lf@%NeverH@@"VMM"WMM@@"Ug@@@A@@@@@"ZMM@@A@"Xd@A@/default_settingI$Misc%Color'setting@@@ e@"lMM"mMM@@"kh@@*is_enabledJ@"P@@@ f!2@@@ g@@ h@"MM"MN@@"i@@@@"MM"NN@"j@@@ӱ%StylenU@%colorLV;@@%BlackM@@" N^Nb" N^Ni@@"l@#RedN@@" NjNn" NjNs@@"m@%GreenO@@" NtNx" NtN@@"n@&YellowP@@" NN" NN@@"o@$BlueQ@@" NN" NN@@"p@'MagentaR@@"NN"NN@@"q@$CyanS@@"NN"NN@@"r@%WhiteT@@"NN"NN@@"s@@@A@@@@@"NONQ@@A@"k@A@%styleUW;@@"FGV$Misc%Style%color@@@ o@@"NN"NN@@"u@"BGW$Misc %Style%color@@@ p@@# NN# NO@@# v@$BoldX@@#OO#OO@@#w@%ResetY@@#OO"#OO)@@#x@@@A@@@@@# NN@@@@#t@A@±%StyleZX#&Stdlib&Format$stag@"m $Misc %Style%style@@@ z@@@ |@@A#AO*O@#BO*OS@@#@y@@@/ansi_of_style_l[@" $Misc %Style%style@@@ ~@@@ #h@@@ @@ @#aOUOW#bOUO@@#`z@@)tag_style\Y;@@$ansi]@@"$Misc%Style%style@@@ @@@ #OO#OO@@#~|@)text_open^@@#@@@ #OO#OO@@#}@*text_close_@@#@@@ #OO#OP @@#~@@@A@@@@@#OO# P P @@@@#{@A@&styles`Z;@@%errora@@$Misc%Style)tag_style@@@ ##P!P%##P!P6@@#@'warningb@@$Misc%Style)tag_style@@@ #$P7P;#$P7PN@@#@#locc@@$Misc%Style)tag_style@@@ #%POPS#%POPb@@#@$hintd@@$Misc%Style)tag_style@@@ #&PcPg#&PcPw@@#@+inline_codee@@$Misc%Style)tag_style@@@ #'PxP|#'PxP@@#@@@A@@@@@$"PP$(PP@@@@$@A@$hintf@*Format_doc)formatter@@@ #@@@ @@ @$*PP$*PP@@$@@.as_inline_codeg@*Format_doc'printer!a@ [@ @@@ *Format_doc'printer@@@ @@ @$<+PP$=+PQ@@$;@@+inline_codeh*Format_doc'printer$Y@@@ @@@ @$S,QQ $T,QQ3@@$R@@.default_stylesi$Misc%Style&styles@@@ @$f.Q5Q7$g.Q5QQ@@$e@@*get_stylesj@$J@@@ $Misc %Style&styles@@@ @@ @$/QRQT$/QRQr@@$@@*set_stylesk@$Misc!%Style&styles@@@ $n"@@@ @@ @$0QsQu$0QsQ@@$@@%setupl@$V$Misc#%Color'setting@@@ @@@ $$@@@ @@ @$2QQ$2QQ@@$@@0set_tag_handlingm@&Stdlib%&Format)formatter@@@ $&@@@ @@ @$7RR$7RR@@$@@@@$N<N<$9RR@$@@@ӱ+Error_styles[@'settingo\;@@*Contextualp@@$>SGSK$>SGSW@@$@%Shortq@@$?SXS\$?SXSc@@$@@@A@@@@@$=S6S8@@A@$@A@/default_settingr$Misc'+Error_style'setting@@@ @% ASeSg% ASeS@@% @@@@%<SS%BSS@%@@@(print_ift@&Stdlib(&Format)formatter@@@ @&Stdlib*#ref#)@@@ @@@ @@&Stdlib+&Format)formatter@@@ @!a@ ]@ %#,@@@ @@ @@ @  @@ @@ @@ @@ @%QFSS%RGST@@%P@@0print_see_manualu*Format_doc/'printer$.#-@@@ @@@ @@@ @%nJTVTV%oJTVT@@%m@@4show_config_and_exitv@%R0@@@ %W1@@@ @@ @%OTT%OTT@@%@@=show_config_variable_and_exitw@%2@@@ %l3@@@ @@ @%SUU%SUU@@%@@9get_build_path_prefix_map@%|4@@@ %Y5Build_path_prefix_map5#map@@@!a@@@!c@@!d@%\VV%\VW @@%@@6debug_prefix_map_flags@%6@@@!e%8%7@@@!f@@@!h@@!i@%`WfWf%`WfW@@%@@ӱ,Magic_number]@1native_obj_config^;@@'flambda@@$9@@@!j%a&a*%a&a9@@%@@@A@@@@@%a a %a:a=@@@A%@A@1native_obj_config$Misc:,Magic_number1native_obj_config@@@!t@&bb&bb=@@%@@'version_;@@#A$;@@@!v@@@@&bb&bb@@A@&@A@$kind`;@@$Exec@@&bb&bb@@&@#Cmi@@&'bb&(bb@@&&@#Cmo@@&0bb&1bb@@&/@#Cma@@&9bb&:bb@@&8@#Cmx$Misc<,Magic_number1native_obj_config@@@!}@@&Mbb&Nbb@@&L@$Cmxa$Misc=,Magic_number1native_obj_config@@@!~@@&abb&bbc@@&`@$Cmxs@@&jcc&kcc@@&i@#Cmt@@&scc&tcc$@@&r@(Ast_impl@@&|cc%&}cc/@@&{@(Ast_intf@@&cc0&cc:@@&@@@A@@@@@&bb@@@@&@A@$infoa;@@$kind@@$Misc>,Magic_number$kind@@@!&cLcP&cLc[@@&@'version@@$Misc?,Magic_number'version@@@!&c\c`&c\cq@@&@@@A@@@@@&c<c>&dd@@@@&@A@#rawb;@@$xA&@@@@!@@@@&dd&dd@@@@&@A@+parse_errorc;@@)Truncated&A@@@!@@&eUeY&eUen@@&@2Not_a_magic_number&B@@@!@@&eoes&eoe@@&@@@A@@@@@&e@eB@@@@&@A@3explain_parse_error@&$MiscC,Magic_number$kind@@@!@@@!@$MiscD,Magic_number+parse_error@@@!'E@@@!@@!@@!@'ee'ee@@'@@%parse@$MiscF,Magic_number#raw@@@!&StdlibI&result$MiscG,Magic_number$info@@@!$MiscH,Magic_number+parse_error@@@!@@@!@@!@'Jff'Kff@@'I@@)read_info@&StdlibJ*in_channel@@@!&StdlibM&result$MiscK,Magic_number$info@@@!$MiscL,Magic_number+parse_error@@@!@@@!@@!@'{ff'|fg*@@'z@@,magic_length& N@@@!@'i-i/'i-iE@@'@@*unexpectedd;!a@!@A(expected@@ e@!İ'ii'ii@@'@&actual@@e@!Ȱ'ii'ii@@'@@@A@Y@@@@@'ii'ii@@@@'@A@0unexpected_errore;@@$Kind$MiscP,Magic_number*unexpected$MiscO,Magic_number$kind@@@!@@@!@@'jj 'jj$@@'@'Version$MiscQ,Magic_number$kind@@@!נ$MiscS,Magic_number*unexpected$MiscR,Magic_number'version@@@!@@@!@@'j%j)'j%jO@@'@@@A@@@@@(ii@@@@'@A@-check_current@$MiscT,Magic_number$kind@@@!@$MiscU,Magic_number$info@@@!&StdlibX&result(V@@@!$MiscW,Magic_number0unexpected_error@@@!@@@!@@!@@!@(:jQjS(;jQj@@(9@@8explain_unexpected_error@$MiscY,Magic_number0unexpected_error@@@!([Z@@@!@@!@(Tkk(UkkS@@(S@@%errorf;@@+Parse_error$Misc[,Magic_number+parse_error@@@!@@(nkk(okk@@(m@0Unexpected_error$Misc\,Magic_number0unexpected_error@@@!@@(kk(kk@@(@@@A@@@@@(kk@@@@(@A@1read_current_info-expected_kind(C$Misc],Magic_number$kind@@@"@@@"@&Stdlib^*in_channel@@@"&Stdliba&result$Misc_,Magic_number$info@@@" $Misc`,Magic_number%error@@@" @@@" @@"@@"@(kk(llJ@@(@@.string_of_kind@$Miscb,Magic_number$kind@@@"(c@@@"@@"@(m(m*(m(mM@@(@@2human_name_of_kind@$Miscd,Magic_number$kind@@@")e@@@"@@"@(mm(mm@@(@@+current_raw@$Miscf,Magic_number$kind@@@"$Miscg,Magic_number#raw@@@"@@"@)nYn[)nYnx@@)@@/current_version@$Misch,Magic_number$kind@@@"$Misci,Magic_number'version@@@"@@"@);nn)<nn@@):@@(raw_kindg;@@&A)Qj@@@"@@@@)J oMoO)K oMoe@@@@)I@A@*parse_kind@$Misck,Magic_number(raw_kind@@@"$)$Miscl,Magic_number$kind@@@"%@@@"'@@"(@)noo)ooo@@)m@@(raw_kind@$Miscm,Magic_number$kind@@@")$Miscn,Magic_number(raw_kind@@@"*@@"+@)pp)pp1@@)@@#raw@$Misco,Magic_number$info@@@",$Miscp,Magic_number#raw@@@"-@@".@)q\q^)q\qs@@)@@)all_kinds(r$Miscq,Magic_number$kind@@@"/@@@"1@)(s5s7)(s5sP@@)@@@@)fXSXS))sQsT@)@@@ӱ+Utf8_lexemeh@!ti;@@'A)s@@@"3@@@@)5tt)5tt@@@@)@A@)normalize@)t@@@":&Stdlibw&Result!t$Miscu+Utf8_lexeme!t@@@";$Miscv+Utf8_lexeme!t@@@"<@@@"?@@"@@*7tt*7tu@@* @@*capitalize@*%x@@@"A&Stdlib{&Result!t$Miscy+Utf8_lexeme!t@@@"B$Miscz+Utf8_lexeme!t@@@"C@@@"F@@"G@*>>uu*?>uv"@@*=@@,uncapitalize@*U|@@@"H&Stdlib&Result!t$Misc}+Utf8_lexeme!t@@@"I$Misc~+Utf8_lexeme!t@@@"J@@@"M@@"N@*nCvv*oCvw@@*m@@.is_capitalized@$Misc+Utf8_lexeme!t@@@"O)9@@@"P@@"Q@*Hww*Hwx@@*@@3is_valid_identifier@$Misc+Utf8_lexeme!t@@@"R)S@@@"S@@"T@*Mxx*Mxx@@*@@,is_lowercase@$Misc+Utf8_lexeme!t@@@"U)m@@@"V@@"W@*Syy*Syy@@*@@1validation_resultj;@@%Valid@@*Yzz*Yzz@@*@1Invalid_character&Stdlib%Uchar!t@@@"@@*Zzz*Zzz@@*@1Invalid_beginningߐ&Stdlib%Uchar!t@@@"@@*[zz*[z{ @@*@@@A@@@@@*Xzz@@@@*@A@3validate_identifier(with_dot*)@@@#@@@#@$Misc+Utf8_lexeme!t@@@#$Misc+Utf8_lexeme1validation_result@@@#@@#@@#@+"]{;{=+#]{;{~@@+!@@>starts_like_a_valid_identifier@$Misc+Utf8_lexeme!t@@@#)@@@#@@#@+<a||+=a||B@@+;@@@@+@4tt+Ae||@+?@@@(filepathk;@@)A+V@@@#@@@@+Oi}!}!+Pi}!}7@@@@+N@A@'modnamel;@@)A+e@@@#@@@@+^j}8}8+_j}8}M@@@@+]@A@$crcsm;@@) A*@$Misc'modname@@@#@+,&Stdlib&Digest!t@@@$0@@@$2@@$3@@@$5@@@@+k}N}N+k}N}z@@@@+@A@&alertsn;@@)MA$Misc&Stdlib&String#Map!t+@@@&@@@&@@@@+m}|}|+m}|}@@@@+@A@@3 (Miscellaneous useful types and functions@# (Warning:@ ' this module is unstable and part of -Compiler_libs@-compiler-libs@!.@@@@@@@@@@@@A+ǐA@6Reporting fatal errors@@0Misc.fatal_error3*Raise the +Fatal_error ! exception with the given string.@@@@@@@@@@@@+@ +@@@@+砕1Misc.fatal_errorf3 JFormat the arguments according to the given format string and raise +Fatal_error; with the resulting string.@@@@@@@@@@@@+@+@@@@+Ǡ0Misc.Fatal_error@@@@@++@@A@;Exceptions and finalization@@0Misc.try_finally3 'try_finally work ~always ~exceptionally is designed to run code in $work L that may fail with an exception, and has two kind of cleanup routines: &always j, that must be run after any execution of the function (typically, freeing system resources), and -exceptionally=, that should be run only if $work$ or &always failed with an exception (typically, undoing user-visible state changes that would only make sense if the function completes correctly). For example:@%  let objfile = outputprefix ^ ".cmo" in let oc = open_out_bin objfile in Misc.try_finally (fun () -> bytecode ++ Timings.(accumulate_time (Generate sourcefile)) (Emitcode.to_file oc modulename objfile); Warnings.check_fatal ()) ~always:(fun () -> close_out oc) ~exceptionally:(fun _exn -> remove_file objfile); @( If -exceptionally 7 fail with an exception, it is propagated as usual.@( If &always$ or -exceptionally G use exceptions internally for control-flow but do not raise, then +try_finally @ is careful to preserve any exception backtrace coming from $work$ or &always: for easier debugging.@@@@@@@@@@@@,@,,@, , @+@@@@+ !Misc.reraise_preserving_backtrace3 reraise_preserving_backtrace e f P is (f (); raise e) except that the current backtrace is preserved, even if !f< uses exceptions internally.@@@@@@@@@@@@+@+@+@@@@+栙A@/List operations@@,Misc.map_end3-map_end f l t$ is +map f l @ t6, just more efficient.@@@@@@@@@@@@+@+@+@+@@@@+۠0Misc.rev_map_end3-map_end f l t$ is 1map f (rev l) @ t6, just more efficient.@@@@@@@@@@@@+@+@+@+@@@@+ʠ3Misc.map_left_right3%Like (List.map 0, with guaranteed left-to-right evaluation order@@@@@@@@@@@@+@+@+@@@@+-Misc.for_all23(Same as ,List.for_all : but for a binary predicate. In addition, this (for_all2 R never fails: given two lists with different lengths, it returns false.@@@@@@@@@@@@+@+@"+@%+@@@@+3Misc.replicate_list35replicate_list elem n2 is the list with !n & elements all identical to $elem!.@@@@@@@@@@@@+@C+@F+@@@@+0Misc.list_remove3/list_remove x l3 returns a copy of !l , with the first element equal to !x) removed.@@@@@@@@@@@@+@d+@g+@@@@+/Misc.split_last3 AReturn the last element and the other elements of the given list.@@@@@@@@@@@@+@v+@@@@+3Misc.repeated_label3 7Detects a repeated label - for use with labeled tuples.@@@@@@@@@@@@+@+@@@@+tA@5Hash table operations@@5Misc.create_hashtable3 _Create a hashtable with the given initial size and fills it with the given bindings.@@@@@@@@@@@@+|@+}@+y@@@@+WA@ "Extensions to the standard library@@/+Misc.Stdlib+Y@A-/0Misc.Stdlib.List+X3B@=Extensions to the List module@@@@@@@@@@@@@A-#2Misc.Stdlib.List.t@+`Y@@A+\@+T+S@@8Misc.Stdlib.List.compare3 }The lexicographic order supported by the provided order. There is no constraint on the relative lengths of the lists.@@@@@@@@@@@@+V@+W@+I@+=@@@@+-6Misc.Stdlib.List.equal3(Returns $true u if and only if the given lists have the same length and content with respect to the given equality function.@@@@@@@@@@@@+4@+5@+'@+@@@@+ .Misc.Stdlib.List.some_if_all_elements_are_some3 &If all elements of the given list are &Some _& then 'Some xs> is returned with the "xs= being the contents of those $Some 3s, with order preserved. Otherwise return $None!.@@@@@@@@@@@@+*@++@@@@+Extensions to the Array module@@@@@@@@@@@@@A/-9Misc.Stdlib.Array.exists23(Same as -Array.exists2; from the standard library.@@@@@@@@@@@@)@_)@b)@e)@@@@)Ӡ:Misc.Stdlib.Array.for_alli3(Same as -Array.for_all from the standard library, but the function is applied with the index of the element as first argument, and the element itself as second argument.@@@@@@@@@@@@)@z)@})@@@@);Misc.Stdlib.Array.all_somes@)@)@@@@)@@))@@@@@/2Misc.Stdlib.String)3B@?Extensions to the String module@@@@@@@@@@@@@A/y&String@@/6Misc.Stdlib.String.Set"@A/%Set.S@7 with type elt = string@"@@@@@/6Misc.Stdlib.String.Map@A/%Map.S@7 with type key = string@@@@@@/6Misc.Stdlib.String.Tbl@A/)Hashtbl.S@7 with type key = string@@@@@@8Misc.Stdlib.String.print@@@@@@@栕:Misc.Stdlib.String.for_all@@@@@@@@@@@@@@3Misc.Stdlib.compare@@@@@@@@@@@@@@A@ "Operations on files and file paths@@1Misc.find_in_path3 'Search a file in a list of directories.@@@@@@@@@@@@@@@@@@5Misc.find_in_path_rel3 0Search a relative file in a list of directories.@@@@@@@@@@@@@@@@@@=Misc.normalized_unit_filename34Normalize file name &Foo.ml$ to &foo.ml *, using NFC and case-folding. Return %Error 0 if the input is not a valid utf-8 byte sequence@@@@@@@@@@@@@4@@@@ (an alternate root directory)@@@@@@@@@@@@@@@@@@8Misc.split_path_contents3:split_path_contents ?sep s, interprets !s o as the value of a "PATH"-like variable and returns the corresponding list of directories. !s > is split using the platform-specific delimiter, or $~sep1 if it is passed.@ % Returns the empty list if !s* is empty.@@@@@@@@@@@@@@@@@@.Misc.copy_file3/copy_file ic oc< reads the contents of file "ic? and copies them to "oc $. It stops when encountering EOF on "ic!.@@@@@@@@@@@@@@@@@@4Misc.copy_file_chunk37copy_file_chunk ic oc n' reads !n, bytes from "ic? and copies them to "oc,. It raises +End_of_file % when encountering EOF on "ic!.@@@@@@@@@@@@@@@@@@@3Misc.string_of_file31string_of_file ic< reads the contents of file "ic K and copies them to a string. It stops when encountering EOF on "ic!.@@@@@@@@@@@@@:@@@@Ġ !Misc.output_to_file_via_temporary3 Produce output in temporary file, then rename it (as atomically as possible) to the desired output file name. (output_to_file_via_temporary filename fn 6 opens a temporary file which is passed to "fn (name + output channel). When "fn [ returns, the channel is closed and the temporary file is renamed to (filename!.@@@@@@@@@@@@@@d@g@@@@@@@@ˠ4Misc.no_overflow_sub35no_overflow_sub n1 n2) returns $true " if the computation of 'n1 - n23 does not overflow.@@@@@@@@@@@@@\@_@@@@Р4Misc.no_overflow_mul35no_overflow_mul n1 n2) returns $true " if the computation of 'n1 * n23 does not overflow.@@@@@@@@@@@@@}@@@@@ՠ4Misc.no_overflow_lsl33no_overflow_lsl n k) returns $true " if the computation of 'n lsl k3 does not overflow.@@@@@@@@@@@@@@@@@@ڠ2Misc.letter_of_int@@@@@@Π/:Misc.Int_literal_converter@A2>Misc.Int_literal_converter.int3 (Convert a string to an integer. Unlike 4Stdlib.int_of_string@@ =, this function accepts the string representation of +max_int + 15 and returns 'min_int. in this case.@@@@@@@@@@@@@@@@@٠ Misc.Int_literal_converter.int3232Likewise, at type %int32@@@@@@@@@@@@@@@@@ՠ Misc.Int_literal_converter.int6432Likewise, at type %int64@@@@@@@@@@@@@@@@@Ѡ $Misc.Int_literal_converter.nativeint32Likewise, at type )nativeint@@@@@@@@@@@@@@@@@@@@@@@@4Misc.find_first_mono31find_first_mono p< takes an integer predicate /p : int -> bool J that we assume: 1. is monotonic on natural numbers: if &a <= b& then #p a) implies #p b 9, 2. is satisfied for some natural numbers in range *0; max_int ! (this is equivalent to: 0p max_int = true").@& 1find_first_mono p 1 is the smallest natural number N that satisfies !p &, computed in O(log(N)) calls to !p!.@ G Our implementation supports two cases where the preconditions on !p8 are not respected:#If !p+ is always %false5, we silently return 'max_int ' instead of looping or crashing.@#If !p N is non-monotonic but eventually true, we return some satisfying value.@@@@@@@@@@@@@@6@7@@@@(A@1String operations@@5Misc.search_substring3>search_substring pat str start C returns the position of the first occurrence of string #pat+ in string #str &. Search starts at offset %start$ in #str). Raise )Not_found$ if #pat; does not occur.@@@@@@@@@@@@W@X@T@P@@@@H6Misc.replace_substring3 $replace_substring ~before ~after str ( replaces all occurrences of &before& with %after$ in #str - and returns the resulting string.@@@@@@@@@@@@^@^]@XW@S@@@@K4Misc.rev_split_words31rev_split_words s( splits !s U in blank-separated words, and returns the list of words in reverse order.@@@@@@@@@@@@U@V@@@@H+Misc.cut_at31String.cut_at s c L returns a pair containing the sub-string before the first occurrence of !c$ in !s 6, and the sub-string after the first occurrence of !c$ in !s%. Olet (before, after) = String.cut_at s c in before ^ String.make 1 c ^ after4 is the identity if !s* contains !c!.@* Raise )Not_found / if the character does not appear in the string@@@@$4.01@@@@@@@@N@Q@@@@l3Misc.ordinal_suffix30ordinal_suffix n 4 is the appropriate suffix to append to the numeral !n; as an ordinal number: !1$ -> $"st"", !2$ -> $"nd"", !3$ -> $"rd"&, !4$ -> $"th" ,, and so on. Handles larger numbers (e.g., "42$ -> $"nd" ,) and the numbers 11--13 (which all get $"th",) correctly.@@@@@@@@@@@@@@@@@2Misc.normalise_eol3/normalise_eol s9 returns a fresh copy of !s with any '\r' characters removed. Intended for pre-processing text which will subsequently be printed on a channel which performs EOL transformations (i.e. Windows)@@@@@@@@@@@@@@@@@6Misc.delete_eol_spaces33delete_eol_spaces s9 returns a fresh copy of !s g with any end of line spaces removed. Intended to normalize the output of the toplevel for tests.@@@@@@@@@@@@@@@@@A@8Operations on references@@#2Misc.ref_and_value@@@@@A@@@@1Misc.protect_refs30protect_refs l f2 temporarily sets !r$ to !v* for each (R (r, v)$ in !l5 while executing !f B. The previous contents of the references is restored even if !f ? raises an exception, without altering the exception backtrace.@@@@@@@@@@@@@ &@ )@@@@,Misc.get_ref3*get_ref lr + returns the content of the list reference "lr 4 and reset its content to the empty list.@@@@@@@@@@@@@ A@@@@2Misc.set_or_ignore35set_or_ignore f opt x& sets #opt$ to #f x/ if it returns &Some _ 3, or leaves it unmodified if it returns $None!.@@@@@@@@@@@@@ k@ n@ q@@@@A@ $Operations on triples and quadruples@@)Misc.fst3@@ @ @ @@@@@)Misc.snd3@@ @ @ @@@@@{)Misc.thd3@v@ u@ p@ k@@@@@g)Misc.fst4@b@ a@ \@ W@ R@@n@@@N)Misc.snd4@I@ H@ C@ >@ 9@@U@@@5)Misc.thd4@0@ /@ *@ %@  @@<@@@)Misc.for4@@ @ @  @ @@#@@@A@ /Spell checking and ``did you mean'' suggestions@@2Misc.edit_distance38edit_distance a b cutoff 0 computes the edit distance between strings !a% and !b <. To help efficiency, it uses a cutoff: if the distance !d1 is smaller than &cutoff-, it returns &Some d+, else $None!.@  The distance algorithm currently used is Damerau-Levenshtein: it computes the number of insertion, deletion, substitution of letters, or swapping of adjacent letters to go from one word to the other. The particular algorithm may change in the future.@@@@@@@@@@@@6@ <7@ ?3@ B/@@@@"/Misc.spellcheck33spellcheck env name7 takes a list of names #env < that exist in the current environment and an erroneous $name 3, and returns a list of suggestions taken from #env?, that are close enough to $name ' that it may be a typo for one of them.@@@@@@@@@@@@>@ l?@ o5@@@@'/Misc.align_hint36aligned_hint main hint5 vertically aligns a $main T message and a hint message. The vertical alignment is controlled by the use of 5@{ ... @} boxes: the start of one box, in either the hint or the main message, will be shifted on the left to ensure that the end of the two boxes are vertically aligned, taking in account a pre-existing &prefix , before the main message. For instance, ) let main, sub = align_hint ~prefix:"Error: " (doc_printf "@{The value @}%a is not an instance variable" Style.inline_code "foobar" ) (doc_printf "@{Did you mean @}%a" Style.inline_code "foobaz" ) in printf "Error: %a%a" pp_doc main pp_doc sub @ produces the following text:@! V Error: The value "foobaz" is not an instance variable Hint: Did you mean "foobar"? @ @ where the main message has been shifted to the left to align ("foobaz"' and ("foobar"!.@@@@@@@@@@@@[@[Z@UT@LK@@@@/5Misc.align_error_hint3(Same as Misc.get_build_path_prefix_map3?Returns the map encoded in the 5BUILD_PATH_PREFIX_MAP: environment variable.@@@@@@@@@@@@@ @@@@;Misc.debug_prefix_map_flags34Returns the list of 2--debug-prefix-map 9 flags to be passed to the assembler, built from the 5BUILD_PATH_PREFIX_MAP6 environment variable.@@@@@@@@@@@@@ @@@@A@9Handling of magic numbers@@/1Misc.Magic_number@A8Ȑ  a typical magic number is "Caml1999I011"; it is formed of an alphanumeric prefix, here Caml1990I, followed by a version, here 011. The prefix identifies the kind of the versioned data: here the I indicates that it is the magic number for .cmi files.@ 4 All magic numbers have the same byte length, ,magic_length , and this is important for users as it gives them the number of bytes to read to obtain the byte sequence that should be a magic number. Typical user code will look like:  let ic = open_in_bin path in let magic = try really_input_string ic Magic_number.magic_length with End_of_file -> ... in match Magic_number.parse magic with | Error parse_error -> ... | Ok info -> ... @ s A given compiler version expects one specific version for each kind of object file, and will fail if given an unsupported version. Because versions grow monotonically, you can compare the parsed version with the expected "current version" for a kind, to tell whether the wrong-magic object file comes from the past or from the future.@ | An example of code block that expects the "currently supported version" of a given kind of magic numbers, here $Cmxa7, is as follows: let ic = open_in_bin path in begin try Magic_number.(expect_current Cmxa (get_info ic)) with | Parse_error error -> ... | Unexpected error -> ... end; ... @ 0 Parse errors distinguish inputs that are 6Not_a_magic_number str U, which are likely to come from the file being completely different, and -Truncated str W, raised by headers that are the (possibly empty) prefix of a valid magic number.@ Unexpected errors correspond to valid magic numbers that are not the one expected, either because it corresponds to a different kind, or to a newer or older version.@< The helper functions 3explain_parse_error% and 8explain_unexpected_error Z will generate a textual explanation of each error, for use in error messages.@# #Misc.Magic_number.native_obj_config3 native object files have a format and magic number that depend on certain native-compiler configuration parameters. This configuration space is expressed by the 1native_obj_config+ type.@@@@@@@@@@@@@B@@A@@A@@:9@@ #Misc.Magic_number.native_obj_config3 Gthe native object file configuration of the active/configured compiler.@@@@@@@@@@@@<@@@@4#9Misc.Magic_number.version@@@A0@-,@@#6Misc.Magic_number.kind@@(@@@"@@@@@@@@@@@@@@@@@@@@@@@@ޑ@@@@A@@@@#6Misc.Magic_number.info@@@@@@@Ɛ3 1Note: some versions of the compiler use the same 'version suffix for all kinds, but others use different versions counters for different kinds. We may only assume that versions are growing monotonically (not necessarily always by one) between compiler versions.@@@@@@@@@@@@@A@@@@#5Misc.Magic_number.raw3 \the type of raw magic numbers, such as "Caml1999A027" for the .cma files of OCaml 4.10@@@@@@@@@@@@@@Aɠ@@@C@5Parsing magic numbers@@#=Misc.Magic_number.parse_error@@ȑ@@@@@@@A@@@@ %Misc.Magic_number.explain_parse_error3 Produces an explanation for a parse error. If no kind is provided, we use an unspecific formulation suggesting that any compiler-produced object file would have been satisfying.@@@@@@@@@@@@@ @ @@@@7Misc.Magic_number.parse39Parses a raw magic number@@@@@@@@@@@@@ @@@@z;Misc.Magic_number.read_info3 .Read a raw magic number from an input channel.@8 If the data read #str A is not a valid magic number, it can be recovered from the &Truncated str | Not_a_magic_number str6 payload of the 1Error parse_error& case.@ # If parsing succeeds with an 'Ok info $ result, we know that exactly ,magic_length 7 bytes have been consumed from the input_channel.@ ^ If you also wish to enforce that the magic number is at the current version, see  #Misc.Magic_number.read_current_infoD@' below.@@@@@@@@@@@@@@@@@>Misc.Magic_number.magic_length3 /all magic numbers take the same number of bytes@@@@@@@@@@@@@@@@C@ 'Checking that magic numbers are current@@#@@@@ *Misc.Magic_number.explain_unexpected_error3?Provides an explanation of the 0unexpected_error!.@@@@@@@@@@@@$@%@@@@#7Misc.Magic_number.error@@@@@@@@@A@@@@37Read a magic number as )read_info K, and check that it is the current version as its kind. If the -expected_kind- argument is $None7, any kind is accepted.@@@@@@@@@@@@ @ @@@@@֠C@@@@@5Misc.Magic_number.raw3 /A valid raw representation of the magic number.@  Due to past and future changes in the string representation of magic numbers, we cannot guarantee that the raw strings returned for past and future versions actually match the expectations of those compilers. The representation is accurate for current versions, and it is correctly parsed back into the desired version by the parsing functions above.@@@@@@@@@@@@@Q@@@@;Misc.Magic_number.all_kinds@@@@@x@@vu@@@@@A@ 5Minimal support for Unicode characters in identifiers@@ 1Characters allowed in identifiers are, currently:5ASCII letters A-Z a-z@ :Latin-1 letters (U+00C0 - U+00FF except U+00D7 and U+00F7)@ DCharacter sequences which normalize to the above character under NFC@ $digits 0-9, underscore, single quote@@@/0Misc.Utf8_lexeme@A;`#2Misc.Utf8_lexeme.t@@@A@@@:Misc.Utf8_lexeme.normalize3 Normalize the given UTF-8 encoded string. Invalid UTF-8 sequences results in a error and are replaced by U+FFFD. Identifier characters are put in NFC normalized form. Other Unicode characters are left unchanged.@@@@@@@@@@@@@@@@@m;Misc.Utf8_lexeme.capitalize3%Like )normalize , but if the string starts with a lowercase identifier character, it is replaced by the corresponding uppercase character. Subsequent characters are not changed.@@@@@@@@@@@@t@u@@@@R=Misc.Utf8_lexeme.uncapitalize3%Like )normalize , but if the string starts with an uppercase identifier character, it is replaced by the corresponding lowercase character. Subsequent characters are not changed.@@@@@@@@@@@@Y@Z@@@@7?Misc.Utf8_lexeme.is_capitalized3(Returns $true U if the given normalized string starts with an uppercase identifier character, %false L otherwise. May return wrong results if the string is not normalized.@@@@@@@@@@@@D@E@@@@8 $Misc.Utf8_lexeme.is_valid_identifier3 FCheck whether the given normalized string is a valid OCaml identifier: (all characters are identifier characters@ 0it does not start with a digit or a single quote@@@@@@@@@@@@@@C@D@@@@7=Misc.Utf8_lexeme.is_lowercase3(Returns $true T if the given normalized string only contains lowercase identifier character, %false K otherwise. May return wrong results if the string is not normalized.@@@@@@@@@@@@D@E@@@@8# "Misc.Utf8_lexeme.validation_result@@2@@@,+@@35Character not allowed@@@@@@@@@@@@"!@@3 #Character not allowed as first char@@@@@@@@@@@@@A@@@@ $Misc.Utf8_lexeme.validate_identifier3%Like 3is_valid_identifier o, but returns a more detailed error code. Dots can be allowed to extend support to path-like identifiers.@@@@@@@@@@@@$@$#@E@@@@ /Misc.Utf8_lexeme.starts_like_a_valid_identifier3 Checks whether the given normalized string starts with an identifier character other than a digit or a single quote. Subsequent characters are not checked.@@@@@@@@@@@@ @T @@@@@@@@@@@A@:Miscellaneous type aliases@@#-Misc.filepath@@@A@@@#,Misc.modname@@@A@@@#)Misc.crcs@@@A@@@#+Misc.alerts@@@AР@@@@@