diff --git a/.depend b/.depend index 7867d3167eb..8c421f84057 100644 --- a/.depend +++ b/.depend @@ -272,12 +272,14 @@ parsing/attr_helper.cmo : \ parsing/parsetree.cmi \ utils/misc.cmi \ parsing/location.cmi \ + parsing/builtin_attributes.cmi \ parsing/asttypes.cmi \ parsing/attr_helper.cmi parsing/attr_helper.cmx : \ parsing/parsetree.cmi \ utils/misc.cmx \ parsing/location.cmx \ + parsing/builtin_attributes.cmx \ parsing/asttypes.cmi \ parsing/attr_helper.cmi parsing/attr_helper.cmi : \ @@ -290,7 +292,10 @@ parsing/builtin_attributes.cmo : \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + utils/clflags.cmi \ parsing/asttypes.cmi \ + parsing/ast_iterator.cmi \ + parsing/ast_helper.cmi \ parsing/builtin_attributes.cmi parsing/builtin_attributes.cmx : \ utils/warnings.cmx \ @@ -298,7 +303,10 @@ parsing/builtin_attributes.cmx : \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + utils/clflags.cmx \ parsing/asttypes.cmi \ + parsing/ast_iterator.cmx \ + parsing/ast_helper.cmx \ parsing/builtin_attributes.cmi parsing/builtin_attributes.cmi : \ parsing/parsetree.cmi \ @@ -413,6 +421,7 @@ parsing/parser.cmo : \ parsing/docstrings.cmi \ utils/clflags.cmi \ parsing/camlinternalMenhirLib.cmi \ + parsing/builtin_attributes.cmi \ parsing/asttypes.cmi \ parsing/ast_helper.cmi \ parsing/parser.cmi @@ -424,6 +433,7 @@ parsing/parser.cmx : \ parsing/docstrings.cmx \ utils/clflags.cmx \ parsing/camlinternalMenhirLib.cmx \ + parsing/builtin_attributes.cmx \ parsing/asttypes.cmi \ parsing/ast_helper.cmx \ parsing/parser.cmi @@ -728,6 +738,7 @@ typing/includeclass.cmo : \ typing/types.cmi \ typing/printtyp.cmi \ typing/path.cmi \ + utils/misc.cmi \ typing/ctype.cmi \ parsing/builtin_attributes.cmi \ typing/includeclass.cmi @@ -735,6 +746,7 @@ typing/includeclass.cmx : \ typing/types.cmx \ typing/printtyp.cmx \ typing/path.cmx \ + utils/misc.cmx \ typing/ctype.cmx \ parsing/builtin_attributes.cmx \ typing/includeclass.cmi @@ -1036,6 +1048,7 @@ typing/persistent_env.cmi : \ typing/types.cmi \ utils/misc.cmi \ parsing/location.cmi \ + utils/load_path.cmi \ utils/lazy_backtrack.cmi \ utils/consistbl.cmi \ file_formats/cmi_format.cmi @@ -1187,29 +1200,6 @@ typing/printtyped.cmx : \ typing/printtyped.cmi typing/printtyped.cmi : \ typing/typedtree.cmi -typing/rec_check.cmo : \ - typing/types.cmi \ - typing/typeopt.cmi \ - typing/typedtree.cmi \ - typing/primitive.cmi \ - typing/path.cmi \ - lambda/lambda.cmi \ - typing/ident.cmi \ - parsing/asttypes.cmi \ - typing/rec_check.cmi -typing/rec_check.cmx : \ - typing/types.cmx \ - typing/typeopt.cmx \ - typing/typedtree.cmx \ - typing/primitive.cmx \ - typing/path.cmx \ - lambda/lambda.cmx \ - typing/ident.cmx \ - parsing/asttypes.cmi \ - typing/rec_check.cmi -typing/rec_check.cmi : \ - typing/typedtree.cmi \ - typing/ident.cmi typing/shape.cmo : \ typing/path.cmi \ utils/misc.cmi \ @@ -1411,6 +1401,7 @@ typing/typeclass.cmi : \ parsing/asttypes.cmi typing/typecore.cmo : \ utils/warnings.cmi \ + typing/value_rec_check.cmi \ typing/untypeast.cmi \ typing/typetexp.cmi \ typing/types.cmi \ @@ -1418,7 +1409,6 @@ typing/typecore.cmo : \ typing/typedecl.cmi \ typing/subst.cmi \ typing/shape.cmi \ - typing/rec_check.cmi \ typing/printtyp.cmi \ typing/printpat.cmi \ typing/primitive.cmi \ @@ -1445,6 +1435,7 @@ typing/typecore.cmo : \ typing/typecore.cmi typing/typecore.cmx : \ utils/warnings.cmx \ + typing/value_rec_check.cmx \ typing/untypeast.cmx \ typing/typetexp.cmx \ typing/types.cmx \ @@ -1452,7 +1443,6 @@ typing/typecore.cmx : \ typing/typedecl.cmx \ typing/subst.cmx \ typing/shape.cmx \ - typing/rec_check.cmx \ typing/printtyp.cmx \ typing/printpat.cmx \ typing/primitive.cmx \ @@ -1688,6 +1678,7 @@ typing/typedecl_variance.cmi : \ typing/env.cmi \ parsing/asttypes.cmi typing/typedtree.cmo : \ + typing/value_rec_types.cmi \ typing/types.cmi \ typing/shape.cmi \ typing/primitive.cmi \ @@ -1700,6 +1691,7 @@ typing/typedtree.cmo : \ parsing/asttypes.cmi \ typing/typedtree.cmi typing/typedtree.cmx : \ + typing/value_rec_types.cmi \ typing/types.cmx \ typing/shape.cmx \ typing/primitive.cmx \ @@ -1712,6 +1704,7 @@ typing/typedtree.cmx : \ parsing/asttypes.cmi \ typing/typedtree.cmi typing/typedtree.cmi : \ + typing/value_rec_types.cmi \ typing/types.cmi \ typing/shape.cmi \ typing/primitive.cmi \ @@ -1957,7 +1950,35 @@ typing/untypeast.cmi : \ parsing/longident.cmi \ parsing/location.cmi \ parsing/asttypes.cmi +typing/value_rec_check.cmo : \ + typing/value_rec_types.cmi \ + typing/types.cmi \ + typing/typeopt.cmi \ + typing/typedtree.cmi \ + typing/primitive.cmi \ + typing/path.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + parsing/asttypes.cmi \ + typing/value_rec_check.cmi +typing/value_rec_check.cmx : \ + typing/value_rec_types.cmi \ + typing/types.cmx \ + typing/typeopt.cmx \ + typing/typedtree.cmx \ + typing/primitive.cmx \ + typing/path.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + parsing/asttypes.cmi \ + typing/value_rec_check.cmi +typing/value_rec_check.cmi : \ + typing/value_rec_types.cmi \ + typing/typedtree.cmi \ + typing/ident.cmi +typing/value_rec_types.cmi : bytecomp/bytegen.cmo : \ + typing/value_rec_types.cmi \ typing/types.cmi \ lambda/switch.cmi \ typing/subst.cmi \ @@ -1974,6 +1995,7 @@ bytecomp/bytegen.cmo : \ parsing/asttypes.cmi \ bytecomp/bytegen.cmi bytecomp/bytegen.cmx : \ + typing/value_rec_types.cmi \ typing/types.cmx \ lambda/switch.cmx \ typing/subst.cmx \ @@ -2223,7 +2245,6 @@ bytecomp/symtable.cmo : \ file_formats/cmo_format.cmi \ utils/clflags.cmi \ bytecomp/bytesections.cmi \ - parsing/asttypes.cmi \ bytecomp/symtable.cmi bytecomp/symtable.cmx : \ lambda/runtimedef.cmx \ @@ -2238,10 +2259,8 @@ bytecomp/symtable.cmx : \ file_formats/cmo_format.cmi \ utils/clflags.cmx \ bytecomp/bytesections.cmx \ - parsing/asttypes.cmi \ bytecomp/symtable.cmi bytecomp/symtable.cmi : \ - utils/misc.cmi \ lambda/lambda.cmi \ typing/ident.cmi \ file_formats/cmo_format.cmi @@ -2634,6 +2653,7 @@ asmcomp/cmm_invariants.cmx : \ asmcomp/cmm_invariants.cmi : \ asmcomp/cmm.cmi asmcomp/cmmgen.cmo : \ + typing/value_rec_types.cmi \ typing/types.cmi \ asmcomp/thread_sanitizer.cmi \ middle_end/printclambda_primitives.cmi \ @@ -2654,6 +2674,7 @@ asmcomp/cmmgen.cmo : \ asmcomp/afl_instrument.cmi \ asmcomp/cmmgen.cmi asmcomp/cmmgen.cmx : \ + typing/value_rec_types.cmi \ typing/types.cmx \ asmcomp/thread_sanitizer.cmx \ middle_end/printclambda_primitives.cmx \ @@ -2794,6 +2815,7 @@ asmcomp/emitaux.cmo : \ asmcomp/emitenv.cmi \ lambda/debuginfo.cmi \ utils/config.cmi \ + middle_end/compilenv.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ asmcomp/arch.cmi \ @@ -2802,6 +2824,7 @@ asmcomp/emitaux.cmx : \ asmcomp/emitenv.cmi \ lambda/debuginfo.cmx \ utils/config.cmx \ + middle_end/compilenv.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ asmcomp/arch.cmx \ @@ -3300,6 +3323,7 @@ asmcomp/x86_proc.cmo : \ asmcomp/x86_ast.cmi \ utils/misc.cmi \ utils/config.cmi \ + middle_end/compilenv.cmi \ utils/clflags.cmi \ utils/ccomp.cmi \ asmcomp/x86_proc.cmi @@ -3307,6 +3331,7 @@ asmcomp/x86_proc.cmx : \ asmcomp/x86_ast.cmi \ utils/misc.cmx \ utils/config.cmx \ + middle_end/compilenv.cmx \ utils/clflags.cmx \ utils/ccomp.cmx \ asmcomp/x86_proc.cmi @@ -3334,6 +3359,7 @@ middle_end/backend_var.cmi : \ typing/ident.cmi \ lambda/debuginfo.cmi middle_end/clambda.cmo : \ + typing/value_rec_types.cmi \ typing/path.cmi \ lambda/lambda.cmi \ typing/ident.cmi \ @@ -3343,6 +3369,7 @@ middle_end/clambda.cmo : \ parsing/asttypes.cmi \ middle_end/clambda.cmi middle_end/clambda.cmx : \ + typing/value_rec_types.cmi \ typing/path.cmx \ lambda/lambda.cmx \ typing/ident.cmx \ @@ -3352,6 +3379,7 @@ middle_end/clambda.cmx : \ parsing/asttypes.cmi \ middle_end/clambda.cmi middle_end/clambda.cmi : \ + typing/value_rec_types.cmi \ typing/path.cmi \ lambda/lambda.cmi \ typing/ident.cmi \ @@ -3485,6 +3513,7 @@ middle_end/linkage_name.cmx : \ middle_end/linkage_name.cmi : \ utils/identifiable.cmi middle_end/printclambda.cmo : \ + typing/value_rec_types.cmi \ lambda/printlambda.cmi \ middle_end/printclambda_primitives.cmi \ lambda/lambda.cmi \ @@ -3494,6 +3523,7 @@ middle_end/printclambda.cmo : \ parsing/asttypes.cmi \ middle_end/printclambda.cmi middle_end/printclambda.cmx : \ + typing/value_rec_types.cmi \ lambda/printlambda.cmx \ middle_end/printclambda_primitives.cmx \ lambda/lambda.cmx \ @@ -3587,6 +3617,7 @@ lambda/debuginfo.cmi : \ typing/ident.cmi \ parsing/asttypes.cmi lambda/lambda.cmo : \ + typing/value_rec_types.cmi \ typing/types.cmi \ typing/primitive.cmi \ typing/path.cmi \ @@ -3599,6 +3630,7 @@ lambda/lambda.cmo : \ parsing/asttypes.cmi \ lambda/lambda.cmi lambda/lambda.cmx : \ + typing/value_rec_types.cmi \ typing/types.cmx \ typing/primitive.cmx \ typing/path.cmx \ @@ -3611,6 +3643,7 @@ lambda/lambda.cmx : \ parsing/asttypes.cmi \ lambda/lambda.cmi lambda/lambda.cmi : \ + typing/value_rec_types.cmi \ typing/types.cmi \ typing/primitive.cmi \ typing/path.cmi \ @@ -3757,6 +3790,7 @@ lambda/translattribute.cmo : \ parsing/location.cmi \ lambda/lambda.cmi \ utils/config.cmi \ + parsing/builtin_attributes.cmi \ lambda/translattribute.cmi lambda/translattribute.cmx : \ utils/warnings.cmx \ @@ -3767,6 +3801,7 @@ lambda/translattribute.cmx : \ parsing/location.cmx \ lambda/lambda.cmx \ utils/config.cmx \ + parsing/builtin_attributes.cmx \ lambda/translattribute.cmi lambda/translattribute.cmi : \ typing/typedtree.cmi \ @@ -4009,8 +4044,7 @@ file_formats/cmi_format.cmx : \ file_formats/cmi_format.cmi : \ typing/types.cmi \ utils/misc.cmi -file_formats/cmo_format.cmi : \ - utils/misc.cmi +file_formats/cmo_format.cmi : file_formats/cmt_format.cmo : \ parsing/unit_info.cmi \ typing/types.cmi \ @@ -4048,14 +4082,14 @@ file_formats/cmt_format.cmi : \ typing/shape.cmi \ utils/misc.cmi \ parsing/location.cmi \ + utils/load_path.cmi \ typing/env.cmi \ file_formats/cmi_format.cmi file_formats/cmx_format.cmi : \ utils/misc.cmi \ middle_end/flambda/export_info.cmi \ middle_end/clambda.cmi -file_formats/cmxs_format.cmi : \ - utils/misc.cmi +file_formats/cmxs_format.cmi : file_formats/linear_format.cmo : \ utils/misc.cmi \ parsing/location.cmi \ @@ -4519,6 +4553,7 @@ middle_end/flambda/find_recursive_functions.cmi : \ middle_end/backend_intf.cmi middle_end/flambda/flambda.cmo : \ middle_end/variable.cmi \ + typing/value_rec_types.cmi \ middle_end/flambda/base_types/tag.cmi \ middle_end/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ @@ -4545,6 +4580,7 @@ middle_end/flambda/flambda.cmo : \ middle_end/flambda/flambda.cmi middle_end/flambda/flambda.cmx : \ middle_end/variable.cmx \ + typing/value_rec_types.cmi \ middle_end/flambda/base_types/tag.cmx \ middle_end/symbol.cmx \ middle_end/flambda/base_types/static_exception.cmx \ @@ -4571,6 +4607,7 @@ middle_end/flambda/flambda.cmx : \ middle_end/flambda/flambda.cmi middle_end/flambda/flambda.cmi : \ middle_end/variable.cmi \ + typing/value_rec_types.cmi \ middle_end/flambda/base_types/tag.cmi \ middle_end/symbol.cmi \ middle_end/flambda/base_types/static_exception.cmi \ @@ -4640,11 +4677,13 @@ middle_end/flambda/flambda_invariants.cmi : \ middle_end/flambda/flambda.cmi middle_end/flambda/flambda_iterators.cmo : \ middle_end/variable.cmi \ + typing/value_rec_types.cmi \ utils/int_replace_polymorphic_compare.cmi \ middle_end/flambda/flambda.cmi \ middle_end/flambda/flambda_iterators.cmi middle_end/flambda/flambda_iterators.cmx : \ middle_end/variable.cmx \ + typing/value_rec_types.cmi \ utils/int_replace_polymorphic_compare.cmx \ middle_end/flambda/flambda.cmx \ middle_end/flambda/flambda_iterators.cmi @@ -4794,6 +4833,7 @@ middle_end/flambda/flambda_to_clambda.cmi : \ middle_end/flambda/flambda_utils.cmo : \ middle_end/variable.cmi \ middle_end/flambda/base_types/var_within_closure.cmi \ + typing/value_rec_types.cmi \ middle_end/symbol.cmi \ lambda/switch.cmi \ middle_end/flambda/base_types/static_exception.cmi \ @@ -4819,6 +4859,7 @@ middle_end/flambda/flambda_utils.cmo : \ middle_end/flambda/flambda_utils.cmx : \ middle_end/variable.cmx \ middle_end/flambda/base_types/var_within_closure.cmx \ + typing/value_rec_types.cmi \ middle_end/symbol.cmx \ lambda/switch.cmx \ middle_end/flambda/base_types/static_exception.cmx \ @@ -5759,6 +5800,7 @@ middle_end/flambda/traverse_for_exported_symbols.cmi : \ middle_end/flambda/base_types/export_id.cmi \ middle_end/flambda/base_types/closure_id.cmi middle_end/flambda/un_anf.cmo : \ + typing/value_rec_types.cmi \ middle_end/symbol.cmi \ middle_end/semantics_of_primitives.cmi \ middle_end/printclambda.cmi \ @@ -5772,6 +5814,7 @@ middle_end/flambda/un_anf.cmo : \ parsing/asttypes.cmi \ middle_end/flambda/un_anf.cmi middle_end/flambda/un_anf.cmx : \ + typing/value_rec_types.cmi \ middle_end/symbol.cmx \ middle_end/semantics_of_primitives.cmx \ middle_end/printclambda.cmx \ @@ -7928,6 +7971,1018 @@ debugger/unix_tools.cmx : \ debugger/unix_tools.cmi debugger/unix_tools.cmi : \ otherlibs/unix/unix.cmi +ocamldoc/odoc.cmo : \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_info.cmi \ + ocamldoc/odoc_global.cmi \ + ocamldoc/odoc_gen.cmi \ + ocamldoc/odoc_config.cmi \ + ocamldoc/odoc_args.cmi \ + ocamldoc/odoc_analyse.cmi \ + otherlibs/dynlink/dynlink.cmi \ + ocamldoc/odoc.cmi +ocamldoc/odoc.cmx : \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_info.cmx \ + ocamldoc/odoc_global.cmx \ + ocamldoc/odoc_gen.cmx \ + ocamldoc/odoc_config.cmx \ + ocamldoc/odoc_args.cmx \ + ocamldoc/odoc_analyse.cmx \ + otherlibs/dynlink/dynlink.cmi \ + ocamldoc/odoc.cmi +ocamldoc/odoc.cmi : +ocamldoc/odoc_analyse.cmo : \ + utils/warnings.cmi \ + parsing/unit_info.cmi \ + typing/types.cmi \ + typing/typemod.cmi \ + typing/typedtree.cmi \ + parsing/syntaxerr.cmi \ + driver/pparse.cmi \ + parsing/parse.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_text.cmi \ + ocamldoc/odoc_sig.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_misc.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_merge.cmi \ + ocamldoc/odoc_global.cmi \ + ocamldoc/odoc_dep.cmi \ + ocamldoc/odoc_cross.cmi \ + ocamldoc/odoc_comments.cmi \ + ocamldoc/odoc_class.cmi \ + ocamldoc/odoc_ast.cmi \ + parsing/location.cmi \ + parsing/lexer.cmi \ + typing/env.cmi \ + driver/compmisc.cmi \ + utils/clflags.cmi \ + ocamldoc/odoc_analyse.cmi +ocamldoc/odoc_analyse.cmx : \ + utils/warnings.cmx \ + parsing/unit_info.cmx \ + typing/types.cmx \ + typing/typemod.cmx \ + typing/typedtree.cmx \ + parsing/syntaxerr.cmx \ + driver/pparse.cmx \ + parsing/parse.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_text.cmx \ + ocamldoc/odoc_sig.cmx \ + ocamldoc/odoc_module.cmx \ + ocamldoc/odoc_misc.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_merge.cmx \ + ocamldoc/odoc_global.cmx \ + ocamldoc/odoc_dep.cmx \ + ocamldoc/odoc_cross.cmx \ + ocamldoc/odoc_comments.cmx \ + ocamldoc/odoc_class.cmx \ + ocamldoc/odoc_ast.cmx \ + parsing/location.cmx \ + parsing/lexer.cmx \ + typing/env.cmx \ + driver/compmisc.cmx \ + utils/clflags.cmx \ + ocamldoc/odoc_analyse.cmi +ocamldoc/odoc_analyse.cmi : \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_global.cmi +ocamldoc/odoc_args.cmo : \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_texi.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_man.cmi \ + ocamldoc/odoc_latex.cmi \ + ocamldoc/odoc_html.cmi \ + ocamldoc/odoc_global.cmi \ + ocamldoc/odoc_gen.cmi \ + ocamldoc/odoc_dot.cmi \ + ocamldoc/odoc_config.cmi \ + driver/main_args.cmi \ + utils/config.cmi \ + driver/compenv.cmi \ + ocamldoc/odoc_args.cmi +ocamldoc/odoc_args.cmx : \ + otherlibs/str/str.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_texi.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_man.cmx \ + ocamldoc/odoc_latex.cmx \ + ocamldoc/odoc_html.cmx \ + ocamldoc/odoc_global.cmx \ + ocamldoc/odoc_gen.cmx \ + ocamldoc/odoc_dot.cmx \ + ocamldoc/odoc_config.cmx \ + driver/main_args.cmx \ + utils/config.cmx \ + driver/compenv.cmx \ + ocamldoc/odoc_args.cmi +ocamldoc/odoc_args.cmi : \ + ocamldoc/odoc_gen.cmi +ocamldoc/odoc_ast.cmo : \ + parsing/unit_info.cmi \ + typing/types.cmi \ + typing/typedtree.cmi \ + typing/predef.cmi \ + typing/path.cmi \ + parsing/parsetree.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_sig.cmi \ + ocamldoc/odoc_parameter.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_global.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_env.cmi \ + ocamldoc/odoc_class.cmi \ + parsing/location.cmi \ + typing/ident.cmi \ + typing/btype.cmi \ + parsing/asttypes.cmi \ + ocamldoc/odoc_ast.cmi +ocamldoc/odoc_ast.cmx : \ + parsing/unit_info.cmx \ + typing/types.cmx \ + typing/typedtree.cmx \ + typing/predef.cmx \ + typing/path.cmx \ + parsing/parsetree.cmi \ + ocamldoc/odoc_value.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_type.cmx \ + ocamldoc/odoc_sig.cmx \ + ocamldoc/odoc_parameter.cmx \ + ocamldoc/odoc_module.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_global.cmx \ + ocamldoc/odoc_extension.cmx \ + ocamldoc/odoc_exception.cmx \ + ocamldoc/odoc_env.cmx \ + ocamldoc/odoc_class.cmx \ + parsing/location.cmx \ + typing/ident.cmx \ + typing/btype.cmx \ + parsing/asttypes.cmi \ + ocamldoc/odoc_ast.cmi +ocamldoc/odoc_ast.cmi : \ + typing/types.cmi \ + typing/typedtree.cmi \ + parsing/parsetree.cmi \ + ocamldoc/odoc_sig.cmi \ + ocamldoc/odoc_name.cmi \ + ocamldoc/odoc_module.cmi +ocamldoc/odoc_class.cmo : \ + typing/types.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_parameter.cmi \ + ocamldoc/odoc_name.cmi \ + ocamldoc/odoc_class.cmi +ocamldoc/odoc_class.cmx : \ + typing/types.cmx \ + ocamldoc/odoc_value.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_parameter.cmx \ + ocamldoc/odoc_name.cmx \ + ocamldoc/odoc_class.cmi +ocamldoc/odoc_class.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_parameter.cmi \ + ocamldoc/odoc_name.cmi +ocamldoc/odoc_comments.cmo : \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_text.cmi \ + ocamldoc/odoc_see_lexer.cmi \ + ocamldoc/odoc_parser.cmi \ + ocamldoc/odoc_misc.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_merge.cmi \ + ocamldoc/odoc_lexer.cmi \ + ocamldoc/odoc_global.cmi \ + ocamldoc/odoc_cross.cmi \ + ocamldoc/odoc_comments_global.cmi \ + ocamldoc/odoc_comments.cmi +ocamldoc/odoc_comments.cmx : \ + otherlibs/str/str.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_text.cmx \ + ocamldoc/odoc_see_lexer.cmx \ + ocamldoc/odoc_parser.cmx \ + ocamldoc/odoc_misc.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_merge.cmx \ + ocamldoc/odoc_lexer.cmx \ + ocamldoc/odoc_global.cmx \ + ocamldoc/odoc_cross.cmx \ + ocamldoc/odoc_comments_global.cmx \ + ocamldoc/odoc_comments.cmi +ocamldoc/odoc_comments.cmi : \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_module.cmi +ocamldoc/odoc_comments_global.cmo : \ + ocamldoc/odoc_comments_global.cmi +ocamldoc/odoc_comments_global.cmx : \ + ocamldoc/odoc_comments_global.cmi +ocamldoc/odoc_comments_global.cmi : +ocamldoc/odoc_config.cmo : \ + utils/config.cmi \ + ocamldoc/odoc_config.cmi +ocamldoc/odoc_config.cmx : \ + utils/config.cmx \ + ocamldoc/odoc_config.cmi +ocamldoc/odoc_config.cmi : +ocamldoc/odoc_cross.cmo : \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_search.cmi \ + ocamldoc/odoc_scan.cmi \ + ocamldoc/odoc_parameter.cmi \ + ocamldoc/odoc_name.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_misc.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_global.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_class.cmi \ + utils/misc.cmi \ + ocamldoc/odoc_cross.cmi +ocamldoc/odoc_cross.cmx : \ + otherlibs/str/str.cmx \ + ocamldoc/odoc_value.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_type.cmx \ + ocamldoc/odoc_search.cmx \ + ocamldoc/odoc_scan.cmx \ + ocamldoc/odoc_parameter.cmx \ + ocamldoc/odoc_name.cmx \ + ocamldoc/odoc_module.cmx \ + ocamldoc/odoc_misc.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_global.cmx \ + ocamldoc/odoc_extension.cmx \ + ocamldoc/odoc_exception.cmx \ + ocamldoc/odoc_class.cmx \ + utils/misc.cmx \ + ocamldoc/odoc_cross.cmi +ocamldoc/odoc_cross.cmi : \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_module.cmi +ocamldoc/odoc_dag2html.cmo : \ + ocamldoc/odoc_info.cmi \ + ocamldoc/odoc_dag2html.cmi +ocamldoc/odoc_dag2html.cmx : \ + ocamldoc/odoc_info.cmx \ + ocamldoc/odoc_dag2html.cmi +ocamldoc/odoc_dag2html.cmi : \ + ocamldoc/odoc_info.cmi +ocamldoc/odoc_dep.cmo : \ + otherlibs/str/str.cmi \ + parsing/parsetree.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_print.cmi \ + ocamldoc/odoc_module.cmi \ + utils/misc.cmi \ + parsing/depend.cmi \ + ocamldoc/odoc_dep.cmi +ocamldoc/odoc_dep.cmx : \ + otherlibs/str/str.cmx \ + parsing/parsetree.cmi \ + ocamldoc/odoc_type.cmx \ + ocamldoc/odoc_print.cmx \ + ocamldoc/odoc_module.cmx \ + utils/misc.cmx \ + parsing/depend.cmx \ + ocamldoc/odoc_dep.cmi +ocamldoc/odoc_dep.cmi : \ + parsing/parsetree.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_module.cmi \ + utils/misc.cmi +ocamldoc/odoc_dot.cmo : \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_info.cmi \ + ocamldoc/odoc_dot.cmi +ocamldoc/odoc_dot.cmx : \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_info.cmx \ + ocamldoc/odoc_dot.cmi +ocamldoc/odoc_dot.cmi : \ + ocamldoc/odoc_info.cmi +ocamldoc/odoc_env.cmo : \ + typing/types.cmi \ + typing/predef.cmi \ + typing/path.cmi \ + ocamldoc/odoc_name.cmi \ + typing/btype.cmi \ + ocamldoc/odoc_env.cmi +ocamldoc/odoc_env.cmx : \ + typing/types.cmx \ + typing/predef.cmx \ + typing/path.cmx \ + ocamldoc/odoc_name.cmx \ + typing/btype.cmx \ + ocamldoc/odoc_env.cmi +ocamldoc/odoc_env.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_name.cmi +ocamldoc/odoc_exception.cmo : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_name.cmi \ + ocamldoc/odoc_exception.cmi +ocamldoc/odoc_exception.cmx : \ + typing/types.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_type.cmx \ + ocamldoc/odoc_name.cmx \ + ocamldoc/odoc_exception.cmi +ocamldoc/odoc_exception.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_name.cmi +ocamldoc/odoc_extension.cmo : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_name.cmi \ + parsing/asttypes.cmi \ + ocamldoc/odoc_extension.cmi +ocamldoc/odoc_extension.cmx : \ + typing/types.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_type.cmx \ + ocamldoc/odoc_name.cmx \ + parsing/asttypes.cmi \ + ocamldoc/odoc_extension.cmi +ocamldoc/odoc_extension.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_name.cmi \ + parsing/asttypes.cmi +ocamldoc/odoc_gen.cmo : \ + ocamldoc/odoc_texi.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_man.cmi \ + ocamldoc/odoc_latex.cmi \ + ocamldoc/odoc_html.cmi \ + ocamldoc/odoc_dot.cmi \ + ocamldoc/odoc_gen.cmi +ocamldoc/odoc_gen.cmx : \ + ocamldoc/odoc_texi.cmx \ + ocamldoc/odoc_module.cmx \ + ocamldoc/odoc_man.cmx \ + ocamldoc/odoc_latex.cmx \ + ocamldoc/odoc_html.cmx \ + ocamldoc/odoc_dot.cmx \ + ocamldoc/odoc_gen.cmi +ocamldoc/odoc_gen.cmi : \ + ocamldoc/odoc_texi.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_man.cmi \ + ocamldoc/odoc_latex.cmi \ + ocamldoc/odoc_html.cmi \ + ocamldoc/odoc_dot.cmi +ocamldoc/odoc_global.cmo : \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_config.cmi \ + utils/clflags.cmi \ + ocamldoc/odoc_global.cmi +ocamldoc/odoc_global.cmx : \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_config.cmx \ + utils/clflags.cmx \ + ocamldoc/odoc_global.cmi +ocamldoc/odoc_global.cmi : \ + ocamldoc/odoc_types.cmi +ocamldoc/odoc_html.cmo : \ + otherlibs/str/str.cmi \ + middle_end/flambda/parameter.cmi \ + ocamldoc/odoc_text.cmi \ + ocamldoc/odoc_ocamlhtml.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_info.cmi \ + ocamldoc/odoc_global.cmi \ + ocamldoc/odoc_dag2html.cmi \ + utils/misc.cmi \ + parsing/asttypes.cmi \ + ocamldoc/odoc_html.cmi +ocamldoc/odoc_html.cmx : \ + otherlibs/str/str.cmx \ + middle_end/flambda/parameter.cmx \ + ocamldoc/odoc_text.cmx \ + ocamldoc/odoc_ocamlhtml.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_info.cmx \ + ocamldoc/odoc_global.cmx \ + ocamldoc/odoc_dag2html.cmx \ + utils/misc.cmx \ + parsing/asttypes.cmi \ + ocamldoc/odoc_html.cmi +ocamldoc/odoc_html.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_parameter.cmi \ + ocamldoc/odoc_info.cmi \ + ocamldoc/odoc_dag2html.cmi \ + utils/misc.cmi +ocamldoc/odoc_info.cmo : \ + typing/printtyp.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_text.cmi \ + ocamldoc/odoc_str.cmi \ + ocamldoc/odoc_search.cmi \ + ocamldoc/odoc_scan.cmi \ + ocamldoc/odoc_print.cmi \ + ocamldoc/odoc_parameter.cmi \ + ocamldoc/odoc_name.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_misc.cmi \ + ocamldoc/odoc_global.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_dep.cmi \ + ocamldoc/odoc_config.cmi \ + ocamldoc/odoc_comments.cmi \ + ocamldoc/odoc_class.cmi \ + ocamldoc/odoc_analyse.cmi \ + parsing/location.cmi \ + ocamldoc/odoc_info.cmi +ocamldoc/odoc_info.cmx : \ + typing/printtyp.cmx \ + ocamldoc/odoc_value.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_type.cmx \ + ocamldoc/odoc_text.cmx \ + ocamldoc/odoc_str.cmx \ + ocamldoc/odoc_search.cmx \ + ocamldoc/odoc_scan.cmx \ + ocamldoc/odoc_print.cmx \ + ocamldoc/odoc_parameter.cmx \ + ocamldoc/odoc_name.cmx \ + ocamldoc/odoc_module.cmx \ + ocamldoc/odoc_misc.cmx \ + ocamldoc/odoc_global.cmx \ + ocamldoc/odoc_extension.cmx \ + ocamldoc/odoc_exception.cmx \ + ocamldoc/odoc_dep.cmx \ + ocamldoc/odoc_config.cmx \ + ocamldoc/odoc_comments.cmx \ + ocamldoc/odoc_class.cmx \ + ocamldoc/odoc_analyse.cmx \ + parsing/location.cmx \ + ocamldoc/odoc_info.cmi +ocamldoc/odoc_info.cmi : \ + typing/types.cmi \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_search.cmi \ + ocamldoc/odoc_parameter.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_global.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_class.cmi \ + parsing/location.cmi \ + parsing/asttypes.cmi +ocamldoc/odoc_latex.cmo : \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_to_text.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_latex_style.cmi \ + ocamldoc/odoc_info.cmi \ + parsing/asttypes.cmi \ + ocamldoc/odoc_latex.cmi +ocamldoc/odoc_latex.cmx : \ + otherlibs/str/str.cmx \ + ocamldoc/odoc_to_text.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_latex_style.cmx \ + ocamldoc/odoc_info.cmx \ + parsing/asttypes.cmi \ + ocamldoc/odoc_latex.cmi +ocamldoc/odoc_latex.cmi : \ + typing/types.cmi \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_info.cmi +ocamldoc/odoc_latex_style.cmo : \ + ocamldoc/odoc_latex_style.cmi +ocamldoc/odoc_latex_style.cmx : \ + ocamldoc/odoc_latex_style.cmi +ocamldoc/odoc_latex_style.cmi : +ocamldoc/odoc_lexer.cmo : \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_parser.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_global.cmi \ + ocamldoc/odoc_comments_global.cmi \ + ocamldoc/odoc_lexer.cmi +ocamldoc/odoc_lexer.cmx : \ + otherlibs/str/str.cmx \ + ocamldoc/odoc_parser.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_global.cmx \ + ocamldoc/odoc_comments_global.cmx \ + ocamldoc/odoc_lexer.cmi +ocamldoc/odoc_lexer.cmi : \ + ocamldoc/odoc_parser.cmi +ocamldoc/odoc_man.cmo : \ + otherlibs/str/str.cmi \ + middle_end/flambda/parameter.cmi \ + ocamldoc/odoc_str.cmi \ + ocamldoc/odoc_print.cmi \ + ocamldoc/odoc_misc.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_info.cmi \ + parsing/asttypes.cmi \ + ocamldoc/odoc_man.cmi +ocamldoc/odoc_man.cmx : \ + otherlibs/str/str.cmx \ + middle_end/flambda/parameter.cmx \ + ocamldoc/odoc_str.cmx \ + ocamldoc/odoc_print.cmx \ + ocamldoc/odoc_misc.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_info.cmx \ + parsing/asttypes.cmi \ + ocamldoc/odoc_man.cmi +ocamldoc/odoc_man.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_info.cmi +ocamldoc/odoc_merge.cmo : \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_parameter.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_global.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_class.cmi \ + ocamldoc/odoc_merge.cmi +ocamldoc/odoc_merge.cmx : \ + otherlibs/str/str.cmx \ + ocamldoc/odoc_value.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_type.cmx \ + ocamldoc/odoc_parameter.cmx \ + ocamldoc/odoc_module.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_global.cmx \ + ocamldoc/odoc_extension.cmx \ + ocamldoc/odoc_exception.cmx \ + ocamldoc/odoc_class.cmx \ + ocamldoc/odoc_merge.cmi +ocamldoc/odoc_merge.cmi : \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_module.cmi +ocamldoc/odoc_messages.cmo : \ + otherlibs/str/str.cmi \ + utils/config.cmi \ + ocamldoc/odoc_messages.cmi +ocamldoc/odoc_messages.cmx : \ + otherlibs/str/str.cmx \ + utils/config.cmx \ + ocamldoc/odoc_messages.cmi +ocamldoc/odoc_messages.cmi : +ocamldoc/odoc_misc.cmo : \ + otherlibs/unix/unix.cmi \ + typing/types.cmi \ + typing/predef.cmi \ + typing/path.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_messages.cmi \ + parsing/longident.cmi \ + typing/btype.cmi \ + ocamldoc/odoc_misc.cmi +ocamldoc/odoc_misc.cmx : \ + otherlibs/unix/unix.cmx \ + typing/types.cmx \ + typing/predef.cmx \ + typing/path.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_messages.cmx \ + parsing/longident.cmx \ + typing/btype.cmx \ + ocamldoc/odoc_misc.cmi +ocamldoc/odoc_misc.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + parsing/longident.cmi \ + parsing/asttypes.cmi +ocamldoc/odoc_module.cmo : \ + typing/types.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_name.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_class.cmi \ + utils/misc.cmi \ + ocamldoc/odoc_module.cmi +ocamldoc/odoc_module.cmx : \ + typing/types.cmx \ + ocamldoc/odoc_value.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_type.cmx \ + ocamldoc/odoc_name.cmx \ + ocamldoc/odoc_extension.cmx \ + ocamldoc/odoc_exception.cmx \ + ocamldoc/odoc_class.cmx \ + utils/misc.cmx \ + ocamldoc/odoc_module.cmi +ocamldoc/odoc_module.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_name.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_class.cmi \ + utils/misc.cmi +ocamldoc/odoc_name.cmo : \ + parsing/unit_info.cmi \ + otherlibs/str/str.cmi \ + typing/path.cmi \ + ocamldoc/odoc_misc.cmi \ + typing/ident.cmi \ + ocamldoc/odoc_name.cmi +ocamldoc/odoc_name.cmx : \ + parsing/unit_info.cmx \ + otherlibs/str/str.cmx \ + typing/path.cmx \ + ocamldoc/odoc_misc.cmx \ + typing/ident.cmx \ + ocamldoc/odoc_name.cmi +ocamldoc/odoc_name.cmi : \ + typing/path.cmi \ + parsing/longident.cmi \ + typing/ident.cmi +ocamldoc/odoc_ocamlhtml.cmo : \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_ocamlhtml.cmi +ocamldoc/odoc_ocamlhtml.cmx : \ + otherlibs/str/str.cmx \ + ocamldoc/odoc_ocamlhtml.cmi +ocamldoc/odoc_ocamlhtml.cmi : +ocamldoc/odoc_parameter.cmo : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_parameter.cmi +ocamldoc/odoc_parameter.cmx : \ + typing/types.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_parameter.cmi +ocamldoc/odoc_parameter.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi +ocamldoc/odoc_parser.cmo : \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_comments_global.cmi \ + ocamldoc/odoc_parser.cmi +ocamldoc/odoc_parser.cmx : \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_comments_global.cmx \ + ocamldoc/odoc_parser.cmi +ocamldoc/odoc_parser.cmi : \ + ocamldoc/odoc_types.cmi +ocamldoc/odoc_print.cmo : \ + typing/types.cmi \ + typing/printtyp.cmi \ + typing/btype.cmi \ + ocamldoc/odoc_print.cmi +ocamldoc/odoc_print.cmx : \ + typing/types.cmx \ + typing/printtyp.cmx \ + typing/btype.cmx \ + ocamldoc/odoc_print.cmi +ocamldoc/odoc_print.cmi : \ + typing/types.cmi +ocamldoc/odoc_scan.cmo : \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_class.cmi \ + ocamldoc/odoc_scan.cmi +ocamldoc/odoc_scan.cmx : \ + ocamldoc/odoc_value.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_type.cmx \ + ocamldoc/odoc_module.cmx \ + ocamldoc/odoc_extension.cmx \ + ocamldoc/odoc_exception.cmx \ + ocamldoc/odoc_class.cmx \ + ocamldoc/odoc_scan.cmi +ocamldoc/odoc_scan.cmi : \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_class.cmi +ocamldoc/odoc_search.cmo : \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_misc.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_class.cmi \ + ocamldoc/odoc_search.cmi +ocamldoc/odoc_search.cmx : \ + otherlibs/str/str.cmx \ + ocamldoc/odoc_value.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_type.cmx \ + ocamldoc/odoc_module.cmx \ + ocamldoc/odoc_misc.cmx \ + ocamldoc/odoc_extension.cmx \ + ocamldoc/odoc_exception.cmx \ + ocamldoc/odoc_class.cmx \ + ocamldoc/odoc_search.cmi +ocamldoc/odoc_search.cmi : \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_class.cmi +ocamldoc/odoc_see_lexer.cmo : \ + ocamldoc/odoc_parser.cmi \ + ocamldoc/odoc_see_lexer.cmi +ocamldoc/odoc_see_lexer.cmx : \ + ocamldoc/odoc_parser.cmx \ + ocamldoc/odoc_see_lexer.cmi +ocamldoc/odoc_see_lexer.cmi : \ + ocamldoc/odoc_parser.cmi +ocamldoc/odoc_sig.cmo : \ + parsing/unit_info.cmi \ + typing/types.cmi \ + typing/typedtree.cmi \ + parsing/parsetree.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_parameter.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_misc.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_merge.cmi \ + ocamldoc/odoc_global.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_env.cmi \ + ocamldoc/odoc_class.cmi \ + parsing/longident.cmi \ + parsing/location.cmi \ + typing/ident.cmi \ + typing/ctype.cmi \ + typing/btype.cmi \ + parsing/asttypes.cmi \ + ocamldoc/odoc_sig.cmi +ocamldoc/odoc_sig.cmx : \ + parsing/unit_info.cmx \ + typing/types.cmx \ + typing/typedtree.cmx \ + parsing/parsetree.cmi \ + ocamldoc/odoc_value.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_type.cmx \ + ocamldoc/odoc_parameter.cmx \ + ocamldoc/odoc_module.cmx \ + ocamldoc/odoc_misc.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_merge.cmx \ + ocamldoc/odoc_global.cmx \ + ocamldoc/odoc_extension.cmx \ + ocamldoc/odoc_exception.cmx \ + ocamldoc/odoc_env.cmx \ + ocamldoc/odoc_class.cmx \ + parsing/longident.cmx \ + parsing/location.cmx \ + typing/ident.cmx \ + typing/ctype.cmx \ + typing/btype.cmx \ + parsing/asttypes.cmi \ + ocamldoc/odoc_sig.cmi +ocamldoc/odoc_sig.cmi : \ + typing/types.cmi \ + typing/typedtree.cmi \ + parsing/parsetree.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_name.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_env.cmi \ + ocamldoc/odoc_class.cmi \ + parsing/location.cmi +ocamldoc/odoc_str.cmo : \ + typing/types.cmi \ + typing/printtyp.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_print.cmi \ + ocamldoc/odoc_name.cmi \ + ocamldoc/odoc_misc.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_class.cmi \ + parsing/asttypes.cmi \ + ocamldoc/odoc_str.cmi +ocamldoc/odoc_str.cmx : \ + typing/types.cmx \ + typing/printtyp.cmx \ + ocamldoc/odoc_value.cmx \ + ocamldoc/odoc_type.cmx \ + ocamldoc/odoc_print.cmx \ + ocamldoc/odoc_name.cmx \ + ocamldoc/odoc_misc.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_extension.cmx \ + ocamldoc/odoc_exception.cmx \ + ocamldoc/odoc_class.cmx \ + parsing/asttypes.cmi \ + ocamldoc/odoc_str.cmi +ocamldoc/odoc_str.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_value.cmi \ + ocamldoc/odoc_type.cmi \ + ocamldoc/odoc_extension.cmi \ + ocamldoc/odoc_exception.cmi \ + ocamldoc/odoc_class.cmi +ocamldoc/odoc_test.cmo : \ + ocamldoc/odoc_info.cmi \ + ocamldoc/odoc_gen.cmi \ + ocamldoc/odoc_args.cmi \ + ocamldoc/odoc_test.cmi +ocamldoc/odoc_test.cmx : \ + ocamldoc/odoc_info.cmx \ + ocamldoc/odoc_gen.cmx \ + ocamldoc/odoc_args.cmx \ + ocamldoc/odoc_test.cmi +ocamldoc/odoc_test.cmi : +ocamldoc/odoc_texi.cmo : \ + typing/types.cmi \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_to_text.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_info.cmi \ + parsing/asttypes.cmi \ + ocamldoc/odoc_texi.cmi +ocamldoc/odoc_texi.cmx : \ + typing/types.cmx \ + otherlibs/str/str.cmx \ + ocamldoc/odoc_to_text.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_info.cmx \ + parsing/asttypes.cmi \ + ocamldoc/odoc_texi.cmi +ocamldoc/odoc_texi.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_info.cmi +ocamldoc/odoc_text.cmo : \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_text_parser.cmi \ + ocamldoc/odoc_text_lexer.cmi \ + ocamldoc/odoc_text.cmi +ocamldoc/odoc_text.cmx : \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_text_parser.cmx \ + ocamldoc/odoc_text_lexer.cmx \ + ocamldoc/odoc_text.cmi +ocamldoc/odoc_text.cmi : \ + ocamldoc/odoc_types.cmi +ocamldoc/odoc_text_lexer.cmo : \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_text_parser.cmi \ + ocamldoc/odoc_misc.cmi \ + ocamldoc/odoc_text_lexer.cmi +ocamldoc/odoc_text_lexer.cmx : \ + otherlibs/str/str.cmx \ + ocamldoc/odoc_text_parser.cmx \ + ocamldoc/odoc_misc.cmx \ + ocamldoc/odoc_text_lexer.cmi +ocamldoc/odoc_text_lexer.cmi : \ + ocamldoc/odoc_text_parser.cmi +ocamldoc/odoc_text_parser.cmo : \ + otherlibs/str/str.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_misc.cmi \ + ocamldoc/odoc_text_parser.cmi +ocamldoc/odoc_text_parser.cmx : \ + otherlibs/str/str.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_misc.cmx \ + ocamldoc/odoc_text_parser.cmi +ocamldoc/odoc_text_parser.cmi : \ + ocamldoc/odoc_types.cmi +ocamldoc/odoc_to_text.cmo : \ + otherlibs/str/str.cmi \ + middle_end/flambda/parameter.cmi \ + ocamldoc/odoc_str.cmi \ + ocamldoc/odoc_module.cmi \ + ocamldoc/odoc_messages.cmi \ + ocamldoc/odoc_info.cmi \ + ocamldoc/odoc_to_text.cmi +ocamldoc/odoc_to_text.cmx : \ + otherlibs/str/str.cmx \ + middle_end/flambda/parameter.cmx \ + ocamldoc/odoc_str.cmx \ + ocamldoc/odoc_module.cmx \ + ocamldoc/odoc_messages.cmx \ + ocamldoc/odoc_info.cmx \ + ocamldoc/odoc_to_text.cmi +ocamldoc/odoc_to_text.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_info.cmi +ocamldoc/odoc_type.cmo : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_name.cmi \ + parsing/asttypes.cmi \ + ocamldoc/odoc_type.cmi +ocamldoc/odoc_type.cmx : \ + typing/types.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_name.cmx \ + parsing/asttypes.cmi \ + ocamldoc/odoc_type.cmi +ocamldoc/odoc_type.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_name.cmi \ + parsing/asttypes.cmi +ocamldoc/odoc_types.cmo : \ + ocamldoc/odoc_messages.cmi \ + parsing/location.cmi \ + ocamldoc/odoc_types.cmi +ocamldoc/odoc_types.cmx : \ + ocamldoc/odoc_messages.cmx \ + parsing/location.cmx \ + ocamldoc/odoc_types.cmi +ocamldoc/odoc_types.cmi : \ + parsing/location.cmi +ocamldoc/odoc_value.cmo : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_parameter.cmi \ + ocamldoc/odoc_name.cmi \ + ocamldoc/odoc_misc.cmi \ + parsing/asttypes.cmi \ + ocamldoc/odoc_value.cmi +ocamldoc/odoc_value.cmx : \ + typing/types.cmx \ + ocamldoc/odoc_types.cmx \ + ocamldoc/odoc_parameter.cmx \ + ocamldoc/odoc_name.cmx \ + ocamldoc/odoc_misc.cmx \ + parsing/asttypes.cmi \ + ocamldoc/odoc_value.cmi +ocamldoc/odoc_value.cmi : \ + typing/types.cmi \ + ocamldoc/odoc_types.cmi \ + ocamldoc/odoc_parameter.cmi \ + ocamldoc/odoc_name.cmi ocamltest/actions.cmo : \ ocamltest/variables.cmi \ ocamltest/result.cmi \ @@ -8025,15 +9080,18 @@ ocamltest/filecompare.cmx : \ ocamltest/filecompare.cmi ocamltest/filecompare.cmi : ocamltest/main.cmo : \ + ocamltest/variables.cmi \ otherlibs/unix/unix.cmi \ ocamltest/tsl_semantics.cmi \ ocamltest/tsl_parser.cmi \ ocamltest/tsl_lexer.cmi \ + ocamltest/tsl_ast.cmi \ ocamltest/translate.cmi \ ocamltest/tests.cmi \ ocamltest/result.cmi \ ocamltest/options.cmi \ ocamltest/ocamltest_stdlib.cmi \ + ocamltest/ocaml_actions.cmi \ parsing/location.cmi \ ocamltest/environments.cmi \ ocamltest/builtin_variables.cmi \ @@ -8041,15 +9099,18 @@ ocamltest/main.cmo : \ ocamltest/actions.cmi \ ocamltest/main.cmi ocamltest/main.cmx : \ + ocamltest/variables.cmx \ otherlibs/unix/unix.cmx \ ocamltest/tsl_semantics.cmx \ ocamltest/tsl_parser.cmx \ ocamltest/tsl_lexer.cmx \ + ocamltest/tsl_ast.cmx \ ocamltest/translate.cmx \ ocamltest/tests.cmx \ ocamltest/result.cmx \ ocamltest/options.cmx \ ocamltest/ocamltest_stdlib.cmx \ + ocamltest/ocaml_actions.cmx \ parsing/location.cmx \ ocamltest/environments.cmx \ ocamltest/builtin_variables.cmx \ diff --git a/.depend.menhir b/.depend.menhir index 3b9e6e095e3..67a4e60e733 100644 --- a/.depend.menhir +++ b/.depend.menhir @@ -1,11 +1,28 @@ -parsing/parser.cmo : parsing/syntaxerr.cmi parsing/parsetree.cmi \ - parsing/longident.cmi parsing/location.cmi parsing/docstrings.cmi \ - utils/clflags.cmi parsing/asttypes.cmi parsing/ast_helper.cmi \ +parsing/parser.cmo : \ + parsing/syntaxerr.cmi \ + parsing/parsetree.cmi \ + parsing/longident.cmi \ + parsing/location.cmi \ + parsing/docstrings.cmi \ + utils/clflags.cmi \ + parsing/builtin_attributes.cmi \ + parsing/asttypes.cmi \ + parsing/ast_helper.cmi \ parsing/parser.cmi -parsing/parser.cmx : parsing/syntaxerr.cmx parsing/parsetree.cmi \ - parsing/longident.cmx parsing/location.cmx parsing/docstrings.cmx \ - utils/clflags.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ +parsing/parser.cmx : \ + parsing/syntaxerr.cmx \ + parsing/parsetree.cmi \ + parsing/longident.cmx \ + parsing/location.cmx \ + parsing/docstrings.cmx \ + utils/clflags.cmx \ + parsing/builtin_attributes.cmx \ + parsing/asttypes.cmi \ + parsing/ast_helper.cmx \ parsing/parser.cmi -parsing/parser.cmi : parsing/parsetree.cmi parsing/location.cmi \ +parsing/parser.cmi : \ + parsing/parsetree.cmi \ + parsing/longident.cmi \ + parsing/location.cmi \ parsing/docstrings.cmi -parsing/parser.ml parsing/parser.mli: parsing/ast_helper.cmi parsing/asttypes.cmi utils/clflags.cmi parsing/docstrings.cmi parsing/location.cmi parsing/longident.cmi parsing/parsetree.cmi parsing/syntaxerr.cmi +parsing/parser.ml parsing/parser.mli: parsing/ast_helper.cmi parsing/asttypes.cmi parsing/builtin_attributes.cmi utils/clflags.cmi parsing/docstrings.cmi parsing/location.cmi parsing/longident.cmi parsing/parsetree.cmi parsing/syntaxerr.cmi diff --git a/.gitattributes b/.gitattributes index d944f09490b..bb0f185fd7e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -108,7 +108,7 @@ runtime/sak.c typo.non-ascii stdlib/hashbang typo.white-at-eol typo.missing-lf testsuite/tests/** typo.missing-header typo.long-line=may -testsuite/tests/lib-bigarray-2/bigarrf.f typo.tab +testsuite/tests/lib-bigarray-2/bigarrf.f typo.tab linguist-language=Fortran testsuite/tests/lib-unix/win-stat/fakeclock.c typo.missing-header=false testsuite/tests/misc-unsafe/almabench.ml typo.long-line testsuite/tests/tool-toplevel/strings.ml typo.utf8 @@ -118,6 +118,7 @@ testsuite/tests/generated-parse-errors/errors.* typo.very-long-line testsuite/tools/*.S typo.missing-header testsuite/tools/*.asm typo.missing-header testsuite/tests/messages/highlight_tabs.ml typo.tab +testsuite/tests/tool-toplevel/multi_phrase_line.ml typo.very-long-line # prune testsuite reference files testsuite/tests/**/*.reference typo.prune @@ -147,7 +148,7 @@ tools/magic typo.missing-header *.sh text eol=lf *.sh.in text eol=lf *.awk text eol=lf -*.m4 text eol=lf +*.m4 text eol=lf linguist-language=M4Sugar # ocamltest hooks which are used in the testsuite *.check-program-output text eol=lf @@ -155,26 +156,43 @@ tools/magic typo.missing-header /tools/ci/appveyor/appveyor_build.cmd text eol=crlf -aclocal.m4 typo.tab +Makefile* linguist-language=Makefile +*.c linguist-language=C +*.h linguist-language=C +*.h.in linguist-language=C +*.hva linguist-language=TeX +*.ml linguist-language=OCaml +*.ml? linguist-language=OCaml +*.mld linguist-documentation +*.ml*.in linguist-language=OCaml +*.tbl linguist-language=C + +aclocal.m4 typo.tab -linguist-vendored linguist-language=M4Sugar configure.ac text eol=lf -build-aux/compile text eol=lf +# These scripts are all parts of autoconf and are tagged linguist-generated +# to suppress inclusion in PR diffs. +build-aux/compile linguist-generated text eol=lf build-aux/config.guess linguist-generated text eol=lf build-aux/config.sub linguist-generated text eol=lf -build-aux/install-sh text eol=lf -build-aux/missing text eol=lf +build-aux/install-sh linguist-generated text eol=lf +build-aux/ltmain.sh linguist-generated text eol=lf +build-aux/missing linguist-generated text eol=lf +build-aux/*.m4 linguist-vendored +build-aux/ocaml_version.m4 -linguist-vendored linguist-language=M4Sugar ocamltest/OCAMLTEST.org typo.long-line=may typo.missing-header stdlib/Compflags text eol=lf stdlib/hashbang -text tools/autogen text eol=lf +tools/bump-magic-numbers eol=lf typo.long-line tools/ci/inria/bootstrap/remove-sinh-primitive.patch -text tools/check-typo text eol=lf tools/check-symbol-names text eol=lf tools/msvs-promote-path text eol=lf -tools/gdb-macros text eol=lf +tools/gdb-macros text eol=lf linguist-language=GDB tools/magic text eol=lf tools/ocamlsize text eol=lf tools/pre-commit-githook text eol=lf -runtime/caml/sizeclasses.h typo.missing-header typo.white-at-eol +runtime/caml/sizeclasses.h typo.missing-header # Tests which include references spanning multiple lines fail with \r\n # endings, so use \n endings only, even on Windows. diff --git a/.github/workflows/hygiene.yml b/.github/workflows/hygiene.yml index 725e46c398b..61f4a4961b4 100644 --- a/.github/workflows/hygiene.yml +++ b/.github/workflows/hygiene.yml @@ -47,6 +47,20 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} if: github.event_name == 'pull_request' + - name: Parsetree updated + run: >- + tools/ci/actions/check-parsetree-modified.sh + '${{ github.event.pull_request.issue_url }}' + '${{ github.ref }}' + 'pull_request' + '${{ github.event.pull_request.base.ref }}' + '${{ github.event.pull_request.base.sha }}' + '${{ github.event.pull_request.head.ref }}' + '${{ github.event.pull_request.head.sha }}' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + if: github.event_name == 'pull_request' + - name: configure correctly generated run: >- tools/ci/actions/check-configure.sh diff --git a/.gitignore b/.gitignore index cb62271a829..f8fd91ce5ca 100644 --- a/.gitignore +++ b/.gitignore @@ -38,7 +38,6 @@ _ocamltestd .merlin _build META -.vscode # local to root directory @@ -236,12 +235,14 @@ META /parsing/camlinternalMenhirLib.ml /parsing/camlinternalMenhirLib.mli +/runtime/domain_state.inc /runtime/caml/jumptbl.h /runtime/caml/m.h /runtime/caml/s.h /runtime/primitives -/runtime/primitives.new +/runtime/primitives*.new /runtime/prims.c +/runtime/caml/exec.h /runtime/caml/opnames.h /runtime/caml/version.h /runtime/ocamlrun @@ -251,8 +252,6 @@ META /runtime/.gdb_history /runtime/build_config.h /runtime/sak -/runtime/domain_state32.inc -/runtime/domain_state64.inc /stdlib/camlheader /stdlib/target_camlheader @@ -325,6 +324,7 @@ META /utils/config_boot.ml /utils/config_boot.mli +/utils/config.common.ml /utils/config.generated.ml /utils/config_main.ml /utils/config_main.mli diff --git a/.mailmap b/.mailmap index 242dcc64191..465449bab49 100644 --- a/.mailmap +++ b/.mailmap @@ -116,6 +116,7 @@ Thomas Leonard Adrien Nader Sébastien Hinderer Sébastien Hinderer +Sébastien Hinderer Gabriel Scherer Immanuel Litzroth Jacques Le Normand diff --git a/Changes b/Changes index 0c9e98c8a18..3ab2ca0dc34 100644 --- a/Changes +++ b/Changes @@ -1,14 +1,19 @@ Working version --------------- -### Restored backends: +### Restored and new backends: -- #12276: native-code compilation for POWER (64 bits, little-endian) - (Xavier Leroy, review by KC Sivaramakrishnan and Anil Madhavapeddy) +- #12276, #12601: native-code compilation for POWER (64 bits, little-endian) + (Xavier Leroy, review by KC Sivaramakrishnan, Anil Madhavapeddy, + and Stephen Dolan) + +- #12667: extend the latter to POWER 64 bits, big-endian, ELFv2 ABI + (A. Wilcox, review by Xavier Leroy) ### Language features: -- #12295: Give `while true' a polymorphic type, similarly to `assert false' +- #12295, #12568: Give `while true' a polymorphic type, similarly to + `assert false' (Jeremy Yallop, review by Nicolás Ojeda Bär and Gabriel Scherer, suggestion by Rodolphe Lepigre and John Whitington) @@ -40,6 +45,15 @@ Working version and variant with only constant constructors. (Christophe Raffalli, review by Gabriel Scherer) +* #12502: the compiler now normalizes the newline sequence \r\n to + a single \n character during lexing, to guarantee that the semantics + of newlines in string literals is not modified by Windows tools + transforming \n into \r\n in source files. + Warning 29 [eol-in-string] is not emitted anymore, as the normalization + gives a more robust semantics to newlines in string literals. + (Gabriel Scherer and Damien Doligez, review by Daniel Bünzli, David + Allsopp, Andreas Rossberg, Xavier Leroy, report by Andreas Rossberg) + ### Type system: - #12313, #11799: Do not re-build as-pattern type when a ground type annotation @@ -47,6 +61,13 @@ Working version (Jacques Garrigue, report by Leo White, review by Gabriel Scherer) ### Runtime system: +- #12193: Re-introduce GC compaction for shared pools + Adds a parallel compactor for the shared pools (which contain major heap + blocks sized less than 128 words). Explicit only for now, on calls to + `Gc.compact`. + (Sadiq Jaffer, Nick Barnes, review by Anil Madhavapeddy, Damien Doligez, + David Allsopp, Miod Vallat, Artem Pianykh, Stephen Dolan, Mark Shinwell + and KC Sivaramakrishnan) - #10111: Increase the detail of location information for debugging events to allow the end line number and character offset to be reported. @@ -57,6 +78,9 @@ Working version of `caml_read_directory`. Also, check for overflows in ext table sizes. (Xavier Leroy, report by Arseniy Alekseyev, review by Gabriel Scherer) +- #11332, #12702: make sure `Bool_val(v)` has type `bool` in C++ + (Xavier Leroy, report by ygrek, review by Gabriel Scherer) + - #12223: Constify constructors and flags tables in C code. Now these tables will go in the readonly segment, where they belong. (Antonin Décimo, review by Gabriel Scherer and Xavier Leroy) @@ -64,9 +88,10 @@ Working version - #12234: make instrumented time calculation more thread-safe on macOS. (Anil Madhavapeddy, review by Daniel Bünzli and Xavier Leroy) -- #12235: introduce and use the `CAMLnoret` macro as a lighter alternative - to `CAMLnoreturn_start` / `CAMLnoreturn_end` - (Xavier Leroy, with help from Antonin Décimo, review by +- #12235, #12468: introduce and use the `CAMLnoret` macro as + a lighter alternative to `CAMLnoreturn_start` / `CAMLnoreturn_end`. + Implement it so as to conform with C11, C23, C++11, C++17. + (Xavier Leroy and Dhruv Maroo, with help from Antonin Décimo, review by Gabriel Scherer and David Allsopp) - #12275: caml/stack.h: more abstract macros to describe OCaml stacks and @@ -85,6 +110,11 @@ Working version (Guillaume Munch-Maccagnoni, review by Anil Madhavapeddy and KC Sivaramakrishnan) +- #12318: GC: simplify the meaning of custom_minor_max_size: blocks with + out-of-heap memory above this limit are now allocated directly in + the major heap. + (Damien Doligez, report by Stephen Dolan, review by Gabriel Scherer) + - #12408: `Domain.spawn` no longer leaks its functional argument for the whole duration of the children domain lifetime. (Guillaume Munch-Maccagnoni, review by Gabriel Scherer) @@ -95,7 +125,7 @@ Working version - #12114: Add ThreadSanitizer support (Fabrice Buoro and Olivier Nicole, based on an initial work by Anmol Sahoo, - review by Damien Doligez, Sebastien Hinderer, Jacques-Henri Jourdan, Luc + review by Damien Doligez, Sébastien Hinderer, Jacques-Henri Jourdan, Luc Maranget, Guillaume Munch-Maccagnoni, Gabriel Scherer) - #11911, #12381: Restore statmemprof functionality in part @@ -105,10 +135,54 @@ Working version (Stephen Dolan, review by Sébastien Hinderer, Vincent Laviron and Xavier Leroy) +- #12439: Finalize and collect dead custom blocks during minor collection + (Damien Doligez, review by Xavier Leroy, Gabriel Scherer and KC + Sivaramakrishnan) + - #12489: Fix an error-handling bug in caml_alloc_sprintf (Stephen Dolan, report by Chris Casinghino, review by Jeremy Yallop and Xavier Leroy) +- #11307: Finish adapting the implementation of asynchronous actions for + multicore: soundness, liveness, and performance issues. + Do not crash if a signal handler is called from an unregistered C + thread, and other possible soundness issues. Prevent issues where join + on other domains could make the toplevel unresponsible to Ctrl-C. Avoid + needless repeated polling in C code when callbacks cannot run + immediately. + (Guillaume Munch-Maccagnoni, review by Enguerrand Decorne, Xavier + Leroy, and KC Sivaramakrishnan) + +- #12634: Simplify TSan backtrace bookkeeping upon raise + (Olivier Nicole and Fabrice Buoro, review by Gabriel Scherer) + +* #12686: Some primitives had the wrong types to be callable from the bytecode + interpreter. Either fix their types, mark them as `CAMLexport` instead of + `CAMLprim`, or remove them entirely if no longer used. + (Xavier Leroy, review by David Allsopp) + +- #12700, continuing #11763 and trying to address #12660: + Use the correct types for primitives when generating the table of primitives + used by ocamlrun. + (Xavier Leroy, motivation, review and improvements by Antonin Décimo) + +- #12345, #12710: Fix issues with finaliser orphaning at domain termination + (KC Sivaramakrishnan, report by Gabriel Scherer, review by Gabriel Scherer, + Sadiq Jaffer and Fabrice Buoro) + +- #12681: Fix TSan false positives due to volatile write handling + (Olivier Nicole, Fabrice Buoro and Anmol Sahoo, review by Luc Maranget, + Gabriel Scherer, Hernan Ponce de Leon and Xavier Leroy) + +- #12743: Use pthread_sigmask instead of sigprocmask + Updates usage of sigprocmask to pthread_sigmask in otherlibs/unix. + (Max Slater, review by Miod Vallat and Xavier Leroy) + +- #12769: Unify MSVC and MinGW-w64 code paths, by always using WinAPI + directly. + (David Allsopp, Antonin Décimo, and Samuel Hym, review by Nicolas + Ojeda Bar) + ### Code generation and optimizations: - #11239: on x86-64 and RISC-V, reduce alignment of OCaml stacks from 16 to 8. @@ -119,11 +193,34 @@ Working version were not correctly rounded sometimes. (Xavier Leroy, review by Anil Madhavapeddy and Tim McGilchrist) +- #12551, #12608: Overhaul of recursive value compilation. + Extend the Rec_check classification to handle constants, propagate the + classification through the compiler. + (Vincent Laviron and Lunia Ayanides, review by Gabriel Scherer) + +- #1809, #12181: rewrite `compare x y op 0` to `x op y` when values are integers + (Xavier Clerc, Stefan Muenzel, review by Gabriel Scherer and Vincent Laviron) + ### Standard library: +- #12716: Add `Format.pp_print_nothing` function. + (Léo Andrès, review by Gabriel Scherer and Nicolás Ojeda Bär) + +- #11563: Add the Dynarray module to the stdlib. Dynamic arrays are + arrays whose length can be changed by adding or removing elements at + the end, similar to 'vectors' in C++ or Rust. + (Gabriel Scherer, Simon Cruanes and Florian Angeletti, review by + Daniel Bünzli, Guillaume Munch-Maccagnoni, Clément Allain, + Damien Doligez, Wiktor Kuchta and Pieter Goetschalckx) + * #10775, #12499: Half-precision floating-point elements in Bigarray. (Anton Yabchinskiy, review by Xavier Leroy and Nicolás Ojeda Bär) +- #11517, #12477: Expose pp_infinity in interface of the format module, and + check that margin is less than pp_infinity when setting or checking geometry. + (Janith Petangoda, reported by Simmo Saan, reviewed by Florian Angeletti, + Simmo Saan, Josh Berdine and Gabriel Scherer) + - #12217: Add `Array.shuffle`. (Daniel Bünzli, review by Nicolás Ojeda Bär, David Allsopp and Alain Frisch) @@ -140,15 +237,47 @@ Working version (Nicolás Ojeda Bär, review by Jeremy Yallop, Xavier Leroy, Gabriel Scherer, David Allsopp) +- #12455: Add `Array.init_matrix`, `Float.Array.make_matrix`, + `Float.Array.init_matrix`. + (Glen Mével, review by Xavier Leroy, Gabriel Scherer, Jeremy Yallop, + Nicolas Ojeda Bar) + +* #12455: `Array.make_matrix dimx dimy f` now raises `Invalid_argument` + when `dimx = 0 && dimy < 0` This was already specified but not enforced. + (Glen Mével, report by Jeremy Yallop, review by Nicolas Ojeda Bar) + +- #12459: Add `Random.int_in_range`, `Random.int32_in_range`, + `Random.int64_in_range`, `Random.nativeint_in_range`, + and their counterpart in `Random.State`. + (Glen Mével and Xavier Leroy, review by Gabriel Scherer, Xavier Leroy, + Florian Angeletti) + +- #12459: `Random`: restore compatibility between 32-bit integers (JavaScript) + and 63-bit integers (64-bit OCaml). + For `Random.full_int` this was guaranteed in 4.14 but wrongly removed in 5.0. + (Xavier Leroy, review by Glen Mével) + - #12511: Minor performance improvements and cleanups in the implementation of modules Int32, Int64, and Nativeint (Xavier Leroy, review by Gabriel Scherer and Daniel Bünzli) +- #12558: Adapt GC alarms for multicore and fix their documentation. + (Guillaume Munch-Maccagnoni, review by KC Sivaramakrishnan + and Gabriel Scherer) + +- #12625: Remove the Closure module from Obj + (Vincent Laviron, review by Xavier Leroy) + ### Other libraries: - #12213: Dynlink library, improve legibility of error messages (Samuel Hym, review by Gabriel Scherer and Nicolás Ojeda Bär) +* #12686: Runtime_events library, C API: define + `caml_runtime_events_{start,pause,resume}` as returning `void` + instead of `value`. + (Xavier Leroy, review by David Allsopp) + ### Tools: - #12340: testsuite: collect known issues with current -short-paths @@ -169,6 +298,27 @@ Working version (Antonin Décimo, Damien Doligez, review by Sébastien Hinderer, Damien Doligez, Gabriel Scherer, and Xavier Leroy) +* #12497, #12613: Make ocamlc/ocamlopt fail with an error when no + input files are specified to build an executable. + (Antonin Décimo, review by Sébastien Hinderer) + +- #12576: ocamldep: various refactors. + (Antonin Décimo, review by Florian Angeletti, Gabriel Scherer, and Léo Andrès) + +- #12615: ocamldoc: get rid of the odoc_literate and odoc_todo generators. + (Sébaistien Hinderer, review by Gabriel Scherer and Florian Angeletti) + +- #12688: Setting the env variable `NO_COLOR` with an empty value no longer + has effects. Previously, setting `NO_COLOR` with any value, including + the empty value, would disable colors (unless `OCAML_COLOR` is also set). + After this change, the user must set `NO_COLOR` with an non-empty value + to disable colors. This reflects a specification clarification/change + from the upstream website at https://no-color.org. + (Favonia, review by Gabriel Scherer) + +- #12744: ocamltest: run tests in recursive subdirs more eagerly + (Nick Roberts, review by Nicolás Ojeda Bär) + ### Manual and documentation: - #12338: clarification of the documentation of process related function in @@ -181,6 +331,11 @@ Working version (Gabriel Scherer and Guillaume Munch-Maccagnoni, review by Olivier Nicole and Xavier Leroy) +- #12694: Document in runtime/tsan.c the TSan instrumentation choices and the + consequences with regard to the memory model. + (Olivier Nicole, review by Miod Vallat, Gabriel Scherer, Guillaume + Munch-Maccagnoni and Fabrice Buoro) + ### Compiler user-interface and warnings: * #10613, #12405: Simplify the values used for the system variable (`system:` in @@ -194,10 +349,18 @@ Working version (David Allsopp, request by Kate Deplaix, review by Sébastien Hinderer and Xavier Leroy) +- #11989, #12246, RFC 31: New flag, -H, to allow for transitive dependencies + without including them in the initial environment. + (Chris Casinghino, François Bobot, and Gabriel Scherer, review by Leo White + and Stefan Muenzel, RFC by François Bobot) + - #12247: configure: --disable-ocamldebug can now be used instead of --disable-debugger (which remains available for compatibility) (Gabriel Scherer, review by Damien Doligez and Sébastien Hinderer) +- #12199: improve the error message for non-overriding `inherit!` + (Florian Angeletti, review by Jules Aguillon) + - #12210: uniform style for inline code in compiler messages (Florian Angeletti, review by Gabriel Scherer) @@ -214,8 +377,31 @@ Working version module (e.g `module M = Int(Int)`) (Florian Angeletti, review by Gabriel Scherer) +- #12451: Warning 53 (misplaced attributes) now works for all attributes. + (Chris Casinghino, review by Florian Angeletti) + +- #12622: Give hints about existential types appearing in error messages + (Leo White, review by Gabriel Scherer and Florian Angeletti) + +- #12671: When a class type parameter or class parameter does not match, + identify which parameter in the error message, instead of saying + "A type parameter" or "A parameter". + (Stefan Muenzel, review by Gabriel Scherer) + +- #12679: Add more detail to the error message and manual in case of + invalid module type substitutions. + (Stefan Muenzel, review by Gabriel Scherer and Florian Angeletti) + +- #12750: Display the command executed to extract primitives in + `ocamlc -verbose`. + (David Allsopp, review by Nicolás Ojeda Bär) + ### Internal/compiler-libs changes: +- #12639: parsing: Attach a location to the RHS of Ptyp_alias + and improve the 'alias type mismatch' error message. + (Jules Aguillon, review by Florian Angeletti) + - #12447: Remove 32-bit targets from X86_proc.system (Masanori Ogino, review by David Allsopp) @@ -246,7 +432,7 @@ Working version in Typecore in favor of local mutable state. (Nick Roberts, review by Takafumi Saikawa) -- #12236, #12386, #12391: Use syntax as the sole determiner of function arity +- #12236, #12386, #12391, #12496, #12673: Use syntax as sole determiner of arity This changes function arity to be based solely on the source program's parsetree. Previously, the heuristic for arity had more subtle heuristics that involved type information about patterns. Function arity is important @@ -261,6 +447,9 @@ Working version (Nick Roberts; review by Richard Eisenberg, Leo White, and Gabriel Scherer; RFC by Stephen Dolan) +- #12542: Minor bugfix to #12236: restore dropped call to `instance` + (Nick Roberts, review by Jacques Garrigue) + - #12242: Move the computation of stack frame parameters to a separate `Stackframe` module, and save the parameters in the results of the `Linearize` pass @@ -273,32 +462,89 @@ Working version - #12446: remove the hooks machinery around channel locking in runtimee/io.c (Gabriel Scherer, review by Xavier Leroy) -- #12509: Use strict prototypes on primitives when generating a standalone - bytecode executable (`ocamlc -custom`). - (Antonin Décimo, review by Xavier Leroy) - -- #12389, centralize the handling of metadata for compilation units and +- #12389, #12544: centralize the handling of metadata for compilation units and artifacts in preparation for better unicode support for OCaml source files. (Florian Angeletti, review by Gabriel Scherer) +- #12532, #12553: improve readability of the pattern-matching debug output + (Gabriel Scherer, review by Thomas Refis) + +- #12537: Use C11/C++11 standard static assertion. + (Antonin Décimo, review by Sebastien Hinderer, Xavier Leroy, + and KC Sivaramakrishnan) + +- #12169: runtime: document and enforce naming conventions around STW sections. + (Gabriel Scherer, review by Enguerrand Decorne, Miod Vallat, B. Szilvasy + and Nick Barnes, report by KC Sivaramakrishnan) + +- #12669 : Clean up some global state handling in schedgen + (Stefan Muenzel, review by Miod Vallat and Gabriel Scherer) + +- #12640: Make the module separator used in symbol names configurable + (Miod Vallat, review by Hugo Heuzard and Xavier Leroy) + +- #12691 : Clean up Ctype.expand_abbrev_gen and + rename Env.add_local_type to add_local_constraint + (Takafumi Saikawa and Jacques Garrigue, review by Florian Angeletti) + ### Build system: -- #12198, #12321: continue the merge of the sub-makefiles into the root Makefile - started with #11243, #11248, #11268, #11420 and #11675. +- #12198, #12321, #12586, #12616: continue the merge of the sub-makefiles + into the root Makefile started with #11243, #11248, #11268, #11420 + and #11675. (Sébastien Hinderer, review by David Allsopp and Florian Angeletti) +- #12569, #12570: remove 'otherlibraries' as a prerequisite for 'runtop'; + use 'runtop-with-otherlibs' to use a library from otherlibs/ + (Gabriel Scherer, review by Sébastien Hinderer, suggestion by David Allsopp) + +- #12652: Make magic numbers easier to bump and duplicate. + (Sébastien Hinderer, review by Antonin Décimo, David Allsopp and Florian + Angeletti) + ### Bug fixes: +- #12712, #12742: fix an assertion boundary case in `caml_reset_young_limit` + (Jan Midtgaard, review by Guillaume Munch-Maccagnoni and KC Sivaramakrishnan) + +- #10652, #12720: fix evaluation order in presence of optional arguments + (Jacques Garrigue, report by Leo White, review by Vincent Laviron) + +- #11800, #12707: fix an assertion race condition in `install_backup_thread` + (Jan Midtgaard, review by Gabriel Scherer) + +- #12590, #12595: fix a race in `caml_collect_gc_stats_sample` + (B. Szilvasy, review by Gabriel Scherer) + +- #12595, #12597: fix a race in `caml_clear_gc_stats_sample` + (Gabriel Scherer, review by B. Szilvasy, report by B. Szilvasy) + +- #12580: Fix location of alias pattern variables. + (Chris Casinghino, review Gabriel Scherer, report by Milo Davis) + +- #12583: Add a closing event for when `EV_MAJOR_EPHE_MARK` is complete + (Sudha Parimala, review by Gabriel Scherer) + +- #12566: caml_output_value_to_malloc wrongly uses `caml_stat_alloc` + instead of `malloc` since 4.06, breaking (in pooled mode) user code + that uses `free` on the result. Symmetrically, + caml_input_value_from_malloc should use `free`. + (Gabriel Scherer, review by Xavier Leroy and Enguerrand Decorne, + report by Ido Yariv) + - #12490: Unix: protect the popen_processes hashtable with a mutex (Gabriel Scherer, report by Olivier Nicole, review by Xavier Leroy) - #11931: Fix tricky typing bug with type substitutions (Stephen Dolan, review by Leo White and Jacques Garrigue) -- #12037: get_extern_state potential NULL dereference. +- #12037, #12171: Fix get_extern_state potential NULL dereference. (Alexander Skvortsov, report by Török Edwin, design by Gabriel Scherer, Xavier Leroy) +- #12635: Fix get_intern_state potential NULL dereference. + (Antonin Décimo, review by KC Sivaramakrishnan) + - #12032, #12059: Bug fixes related to compilation of recursive definitions (Vincent Laviron, report by Victoire Noizet, review by Gabriel Scherer) @@ -316,7 +562,12 @@ Working version (Vincent Laviron, report by François Pottier, review by Nathanaëlle Courant and Gabriel Scherer) -- #12238, #12403: read input files in one go to avoid source reprinting issues +- #11040, #12591: fix a data race in major_gc.c + (Gabriel Scherer, review by Guillaume Munch-Maccagnoni + and KC Sivaramakrishnan, report by Sadiq Jaffer) + +- #12238, #12403, #12698: read input files in one go to avoid source reprinting + issues. (Gabriel Scherer, report by Mike Spivey and Vincent Laviron, review by Nicolás Ojeda Bär, Xavier Leroy and Jeremy Yallop) @@ -339,16 +590,74 @@ Working version - #12949: open shadowing mistriggers (Gabriel Scherer, review by Florian Angeletti, report by Andreas Rossberg) -- #12486: Fix delivery of unhandled effect exceptions on s390x - (Miod Vallat, report by Jan Midtgaard, review by Vincent Laviron and Xavier - Leroy) - - #12526: Honor `ocaml.inline always` attribute on functions with optional arguments and default values in the Closure backend (Alain Frisch, review by Vincent Laviron) -OCaml 5.1.0 ---------------- +- #12486: Fix delivery of unhandled effect exceptions on amd64 with + --enable-frame-pointers + (Miod Vallat, report by Jan Midtgaard, review by Gabriel Scherer) + +- #12561: Fix crash when combining TSan and frame-pointers + (Fabrice Buoro and Olivier Nicole, report by Jan Midtgaard, review by Miod + Vallat and Gabriel Scherer) + +- #12482: Rework bounds checking code in the POWER backend + (Miod Vallat and Xavier Leroy, report by Jan Midtgaard, review by + KC Sivaramakrishnan) + +- #12528, #12703: Avoid pointer arithmetic overflow in Tag_val macro + (very likely harmless, but can trigger alarms) + (Xavier Leroy, report by Sam Goldman, review by Guillaume Munch-Maccagnoni) + +- #12593: TSan should handle Effect.Unhandled correctly + (Fabrice Buoro and Olivier Nicole, report by Jan Midtgaard and Miod Vallat, + review by Gabriel Scherer) + +- #12684: fix locations filename in AST produced by the `-pp` option + (Gabriel Scherer, review by Florian Angeletti) + +- #12713, #12715: disable common subexpression elimination for atomic loads + (Gabriel Scherer and Vincent Laviron, + review by Vincent Laviron, KC Sivaramakrishnan and Xavier Leroy, + report by Vesa Karvonen and Carine Morel) + +- #12714: check whether macros are defined before using them to ensure + that the headers can always be used in code which turns on -Wundef + (or equivalent). + (Antonin Décimo, review by Miod Vallat, Gabriel Scherer, + Xavier Leroy, and David Allsopp) + +- #12726: fix segmentation fault under Windows when executing a bytecode file if + the runtime (`ocamlrun.exe`) cannot be found. + (Vadim Zborovskii, Nicolás Ojeda Bär, report by Vadim Zborovskii, review by + David Allsopp) + +- #12727, #12730: fix bug with value let-rec and labelled applications + (Vincent Laviron, review by Gabriel Scherer) + +OCaml 5.1.1 +----------- + +### Bug fixes: + +- #12623, fix the computation of variance composition + (Florian Angeletti, report by Vesa Karvonen, review by Gabriel Scherer) + +- #12645, fix error messages for cyclic type definitions in presence of + the `-short-paths` flag. + (Florian Angeletti, report by Vesa Karvonen, review by Gabriel Scherer) + +- #12581, #12609: Fix error on uses of packed modules outside their pack + to correctly handle nested packs + (Vincent Laviron, report by Javier Chávarri, review by Pierre Chambart) + +- #12757: Fix ocamlnat (native toplevel) by registering frametables correctly + (Stephen Dolan, Nick Barnes and Mark Shinwell, + review by Vincent Laviron and Sébastien Hinderer) + +OCaml 5.1.0 (14 September 2023) +------------------------------- ### Restored backends @@ -456,7 +765,7 @@ OCaml 5.1.0 fold_right : ('a -> 'acc -> 'acc) -> 'a list -> 'acc -> 'acc fold_left_map : ('acc -> 'a -> 'acc * 'b) -> 'acc -> 'a list -> 'acc * 'b list ... - (Valentin Gatien-Baron and Francois Berenger, + (Valentin Gatien-Baron and François Berenger, review by Gabriel Scherer and Nicolás Ojeda Bär) - #11354: Hashtbl.find_all is now tail-recursive. @@ -537,7 +846,7 @@ Some of those changes will benefit all OCaml packages. (Fabrice Buoro and Stephen Dolan, review by Gabriel Scherer and Sadiq Jaffer) - #11144: Restore frame-pointers support for amd64 - (Fabrice Buoro, review by Frederic Bour and KC Sivaramakrishnan) + (Fabrice Buoro, review by Frédéric Bour and KC Sivaramakrishnan) - #11935: Load frametables of dynlink'd modules in batch (Stephen Dolan, review by David Allsopp and Guillaume Munch-Maccagnoni) @@ -619,6 +928,11 @@ Some of those changes will benefit all OCaml packages. to set up to get flexdll working changed (David Allsopp and Samuel Hym, light review by Xavier Leroy) +- #12491, #12493, #12500, #12754: Do not change GC pace when creating + sub-arrays of bigarrays + (Xavier Leroy, report by Ido Yariv, analysis by Gabriel Scherer, + review by Gabriel Scherer and Fabrice Buoro) + ### Language features: * #11694: Add short syntax for generative functor types `() -> ...` @@ -641,7 +955,7 @@ Some of those changes will benefit all OCaml packages. was made based on the type of `F`. With this patch, we now distinguish these two application forms; writing `F (struct end)` for a generative functor leads to new warning 73. - (Frederic Bour and Richard Eisenberg, review by Florian Angeletti) + (Frédéric Bour and Richard Eisenberg, review by Florian Angeletti) - #9975, #11365: Make empty types (`type t = |`) immediate. @@ -1074,6 +1388,10 @@ Some of those changes will benefit all OCaml packages. lists for simpler printing of manual references (Stefan Muenzel, review by Florian Angeletti) +- #12509: Use strict prototypes on primitives when generating a standalone + bytecode executable (`ocamlc -custom`). + (Antonin Décimo, review by Xavier Leroy) + ### Build system: - #11844: Reduce verbosity of `make` logs by printing program invocations in @@ -1106,6 +1424,10 @@ Some of those changes will benefit all OCaml packages. ### Bug fixes: +- #8813, #12029: In the toplevel, let the user type several phrases in one line + (Damien Doligez, report by Daniel Bünzli, review by Gabriel Scherer and + Wiktor Kuchta) + - #12062: fix runtime events consumer: when events are dropped they shouldn't be parsed. (Lucas Pluvinage) @@ -1138,7 +1460,7 @@ Some of those changes will benefit all OCaml packages. - #11450, #12018: Fix erroneous functor error messages that were too eager to cast `struct end` functor arguments as unit modules in `F(struct end)`. - (Florian Angetti, review by Gabriel Scherer) + (Florian Angeletti, review by Gabriel Scherer) - #11643: Add missing test declaration to float_compare test, so that it will run. @@ -1207,7 +1529,7 @@ Some of those changes will benefit all OCaml packages. - #12075: auto-detect whether `ar` support @FILE arguments at configure-time to avoid using this feature with toolchains that do not support it (eg FreeBSD/Darwin). - (Nicolás Ojeda Bär, review by Xavier Leroy, David Allsop, Javier + (Nicolás Ojeda Bär, review by Xavier Leroy, David Allsopp, Javier Chávarri, Anil Madhavapeddy) - #12103, 12104: fix a concurrency memory-safety bug in Buffer @@ -1262,6 +1584,10 @@ Some of those changes will benefit all OCaml packages. - #11186, #11188: Fix composition of coercions with aliases (Vincent Laviron, report and review by Leo White) +- #12486: Fix delivery of unhandled effect exceptions on s390x + (Miod Vallat, report by Jan Midtgaard, review by Vincent Laviron and Xavier + Leroy) + OCaml 5.0.0 (15 December 2022) ------------------------------ @@ -1431,7 +1757,7 @@ OCaml 5.0.0 (15 December 2022) - #10972: ARM64 multicore support: OCaml & C stack separation; dynamic stack size checks; fiber and effects support. - (Tom Kelly and Xavier Leroy, review by KC Sivaramakrishnan, Xavier Leroy + (Tom Kelly and Xavier Leroy, review by KC Sivaramakrishnan, Xavier Leroy, Guillaume Munch-Maccagnoni, Eduardo Rafael, Stephen Dolan and Gabriel Scherer) @@ -1522,7 +1848,7 @@ OCaml 5.0.0 (15 December 2022) - #11309, #11424, #11427, #11545: Add Domain.recommended_domain_count. (Christiano Haesbaert, Konstantin Belousov, review by David Allsopp, - KC Sivaramakrishnan, Gabriel Scherer, Nicolas Ojeda Bar) + KC Sivaramakrishnan, Gabriel Scherer, Nicolás Ojeda Bär) - #11461, #11466: Fix gethostbyaddr for IPv6 arguments and make it domain-safe (Olivier Nicole, Nicolás Ojeda Bär, David Allsopp and Xavier Leroy, @@ -1946,7 +2272,7 @@ OCaml 4.14.0 (28 March 2022) * #10583, #10998: Add over 40 new functions in Seq. (François Pottier and Simon Cruanes, review by Nicolás Ojeda Bär, - Daniel Bünzli, Naëla Courant, Craig Ferguson, Wiktor Kuchta, + Daniel Bünzli, Nathanaëlle Courant, Craig Ferguson, Wiktor Kuchta, Xavier Leroy, Guillaume Munch-Maccagnoni, Raphaël Proust, Gabriel Scherer and Thierry Martinez) @@ -2058,7 +2384,7 @@ OCaml 4.14.0 (28 March 2022) (Dong An, review by Xavier Leroy and David Allsopp) - #10397: Document exceptions raised by Unix module functions on Windows - (Martin Jambon, review by Daniel Bünzli, David Alsopp, Damien Doligez, + (Martin Jambon, review by Daniel Bünzli, David Allsopp, Damien Doligez, Xavier Leroy, and Florian Angeletti) - #10589: Fix many typos (excess/inconsistent spaces) in the HTML manual. @@ -2448,7 +2774,7 @@ OCaml 4.13.0 (24 September 2021) A mostly-internal change that preserves more information in errors during type checking; most significantly, it split the errors from unification, moregen, and type equality into three different types. - (Antal Spector-Zabusky and Mekhrubon Tuarev, review by Leo White, + (Antal Spector-Zabusky and Mekhrubon Turaev, review by Leo White, Florian Angeletti, and Jacques Garrigue) - #9994: Make Types.type_expr a private type, and abstract marking mechanism @@ -2550,7 +2876,7 @@ OCaml 4.13.0 (24 September 2021) - #1400: Add an optional invariants check on Cmm, which can be activated with the -dcmm-invariants flag - (Vincent Laviron, with help from Sebastien Hinderer, review by Stephen Dolan + (Vincent Laviron, with help from Sébastien Hinderer, review by Stephen Dolan and David Allsopp) - #9562, #367: Allow CSE of immutable loads across stores @@ -2586,7 +2912,7 @@ OCaml 4.13.0 (24 September 2021) - #9487, #9489: Add Random.full_int which allows 62-bit bounds on 64-bit systems. - (David Allsopp, request by Francois Berenger, review by Xavier Leroy and + (David Allsopp, request by François Berenger, review by Xavier Leroy and Damien Doligez) - #9961: Add Array.fold_left_map. @@ -2738,7 +3064,7 @@ OCaml 4.13.0 (24 September 2021) (Gabriel Scherer, review by Thomas Refis and Florian Angeletti) - #9827: Replace references with functions arguments in Simplif - (Anukriti Kumar, review by Vincent Laviron and David Allsop) + (Anukriti Kumar, review by Vincent Laviron and David Allsopp) - #10007: Driver.compile_common: when typing a .ml file, return the compilation unit signature (inferred or from the .cmi) in addition @@ -3113,8 +3439,8 @@ OCaml 4.12.0 (24 February 2021) I/O locks are not held while it runs. A polling point was removed from caml_leave_blocking_section, and one added to caml_raise. (Stephen Dolan, review by Goswin von Brederlow, Xavier Leroy, Damien - Doligez, Anil Madhavapeddy, Guillaume Munch-Maccagnoni and Jacques- - Henri Jourdan) + Doligez, Anil Madhavapeddy, Guillaume Munch-Maccagnoni + and Jacques-Henri Jourdan) * #5154, #9569, #9734: Add `Val_none`, `Some_val`, `Is_none`, `Is_some`, `caml_alloc_some`, and `Tag_some`. As these macros are sometimes defined by @@ -3248,7 +3574,7 @@ OCaml 4.12.0 (24 February 2021) - #10050: update {PUSH,}OFFSETCLOSURE* bytecode instructions to match new representation for closures - (Nathanaël Courant, review by Xavier Leroy) + (Nathanaëlle Courant, review by Xavier Leroy) - #9728: Take advantage of the new closure representation to simplify the compaction algorithm and remove its dependence on the page table @@ -3547,7 +3873,7 @@ OCaml 4.12.0 (24 February 2021) report by Alex Fedoseev through Hongbo Zhang) - #9514: optimize pattern-matching exhaustivity analysis in the single-row case - (Gabriel Scherer, review by Stephen DOlan) + (Gabriel Scherer, review by Stephen Dolan) - #9442: refactor the implementation of the [@tailcall] attribute to allow for a structured attribute payload @@ -3580,7 +3906,7 @@ OCaml 4.12.0 (24 February 2021) not low (Chet Murthy, review by Florian Angeletti) - #9590: fix pprint of extension constructors (and exceptions) that rebind - (Chet Murthy, review by octachron@) + (Chet Murthy, review by Florian Angeletti) - #9963: Centralized tracking of frontend's global state (Frédéric Bour and Thomas Refis, review by Gabriel Scherer) @@ -3638,7 +3964,7 @@ OCaml 4.12.0 (24 February 2021) - #7902, #9556: Type-checker infers recursive type, even though -rectypes is off. - (Jacques Garrigue, report by Francois Pottier, review by Leo White) + (Jacques Garrigue, report by François Pottier, review by Leo White) - #8746: Hashtbl: Restore ongoing traversal status after filter_map_inplace (Mehdi Bouaziz, review by Alain Frisch) @@ -4044,7 +4370,7 @@ OCaml 4.11.0 (19 August 2020) (Glenn Slotte, review by Florian Angeletti) - #9410, #9422: replaced naive fibonacci example with gcd - (Anukriti Kumar, review by San Vu Ngoc, Florian Angeletti, Léo Andrès) + (Anukriti Kumar, review by San Vũ Ngọc, Florian Angeletti, Léo Andrès) - #9541: Add a documentation page for the instrumented runtime; additional changes to option names in the instrumented runtime. @@ -4142,7 +4468,7 @@ OCaml 4.11.0 (19 August 2020) Caml_inline to stop abuse of the inline keyword on MSVC and to help ensure that only static inline is used in the codebase (erroneous instance in runtime/win32.c removed). - (David Allsopp, review by Oliver Andrieu and Xavier Leroy) + (David Allsopp, review by Olivier Andrieu and Xavier Leroy) - #8934: Stop relying on location to track usage (Thomas Refis, review by Gabriel Radanne) @@ -4675,7 +5001,7 @@ OCaml 4.10.0 (21 February 2020) locate an `.ocamlinit` file. Reads an `$XDG_CONFIG_HOME/ocaml/init.ml` file before trying to lookup `~/.ocamlinit`. On Windows the behaviour is unchanged. - (Daniel C. Bünzli, review by David Allsopp, Armaël Guéneau and + (Daniel Bünzli, review by David Allsopp, Armaël Guéneau and Nicolás Ojeda Bär) - #9113: ocamldoc: fix the rendering of multi-line code blocks @@ -4683,7 +5009,7 @@ OCaml 4.10.0 (21 February 2020) (Gabriel Scherer, review by Florian Angeletti) - #9127, #9130: ocamldoc: fix the formatting of closing brace in record types. - (David Allsopp, report by San Vu Ngoc) + (David Allsopp, report by San Vũ Ngọc) - #9181: make objinfo work on Cygwin and look for the caml_plugin_header symbol in both the static and the dynamic symbol tables. @@ -4990,7 +5316,7 @@ OCaml 4.09.0 (19 September 2019) - #2112: Fix Thread.yield unfairness with busy threads yielding to each other. (Andrew Hunter, review by Jacques-Henri Jourdan, Spiros Eliopoulos, Stephen - Weeks, & Mark Shinwell) + Weeks, Mark Shinwell) - #7903, #2306: Make Thread.delay interruptible by signals again (Xavier Leroy, review by Jacques-Henri Jourdan and Edwin Török) @@ -5452,7 +5778,7 @@ OCaml 4.08.0 (13 June 2019) ### Other libraries: - #2533, #1839, #1949: added Unix.fsync - (Francois Berenger, Nicolás Ojeda Bär, review by Daniel Bünzli, David Allsopp + (François Berenger, Nicolás Ojeda Bär, review by Daniel Bünzli, David Allsopp and ygrek) - #1792, #7794: Add Unix.open_process_args{,_in,_out,_full} similar to @@ -6228,7 +6554,7 @@ OCaml 4.07.0 (10 July 2018) - #7528, #1500: add a Format.pp_set_geometry function to avoid memory effects in set_margin and set_max_indent. (Florian Angeletti, review by Richard Bonichon, Gabriel Radanne, - Gabiel Scherer and Pierre Weis) + Gabriel Scherer and Pierre Weis) - #7690, #1528: fix the float_of_string function for hexadecimal floats with very large values of the exponent. @@ -6382,15 +6708,15 @@ OCaml 4.07.0 (10 July 2018) (Hugo Heuzard, reviewed by Nicolás Ojeda Bär) - #1627: Reduce cmx sizes by sharing variable names (Flambda only). - (Fuyong Quah, Leo White, review by Xavier Clerc) + (Fu Yong Quah, Leo White, review by Xavier Clerc) - #1665: reduce the size of cmx files in classic mode by dropping the bodies of functions that will not be inlined. - (Fuyong Quah, review by Leo White and Pierre Chambart) + (Fu Yong Quah, review by Leo White and Pierre Chambart) - #1666: reduce the size of cmx files in classic mode by dropping the bodies of functions that cannot be reached from the module block. - (Fuyong Quah, review by Leo White and Pierre Chambart) + (Fu Yong Quah, review by Leo White and Pierre Chambart) - #1686: Turn off by default flambda invariants checks. (Pierre Chambart) @@ -7226,7 +7552,7 @@ OCaml 4.06.0 (3 Nov 2017): - #1012: ocamlyacc, fix parsing of raw strings and nested comments, as well as the handling of ' characters in identifiers. - (Demi Obenour) + (Demi Marie Obenour) - #1045: ocamldep, add a "-shared" option to generate dependencies for native plugin files (i.e. .cmxs files) @@ -7746,7 +8072,7 @@ OCaml 4.05.0 (13 Jul 2017): - #7279, #710: `Weak.get_copy` `Ephemeron.*_copy` doesn't copy custom blocks anymore - (François Bobot, Alain Frisch, bug reported by Martin R. Neuhäußer, + (François Bobot, Alain Frisch, report by Martin R. Neuhäußer, review by Thomas Braibant and Damien Doligez) * #7500, #1081: Remove Uchar.dump @@ -8408,7 +8734,7 @@ OCaml 4.04.0 (4 Nov 2016): - #427: Obj.is_block is now an inlined OCaml function instead of a C external. This should be faster. - (Demi Obenour) + (Demi Marie Obenour) - #580: Optimize immutable float records (Pierre Chambart, review by Mark Shinwell) @@ -8550,7 +8876,7 @@ OCaml 4.04.0 (4 Nov 2016): * #512, #587: Installed `ocamlc`, `ocamlopt`, and `ocamllex` are now the native-code versions of the tools, if those versions were built. - (Demi Obenour) + (Demi Marie Obenour) - #525: fix build on OpenIndiana (Sergey Avseyev, review by Damien Doligez) @@ -8852,9 +9178,9 @@ OCaml 4.03.0 (25 Apr 2016): (Alain Frisch) - #6943: native-code generator for POWER/PowerPC 64 bits, both in - big-endian (ppc64) and little-endian (ppc64le) configuration. - (Xavier Leroy, with inspiration from RedHat's unofficial ppc64 and ppc64le - ports) + big-endian (ppc64) and little-endian (ppc64le) configuration, + inspired from RedHat's unofficial ppc64 and ppc64le ports + (Xavier Leroy) - #6979: better code generation in x86-32 backend for copying floats to the stack @@ -8972,7 +9298,7 @@ OCaml 4.03.0 (25 Apr 2016): settings that are currently the default: `-alias-deps`, `-app-funct`, `-no-keep-docs`, `-no-keep-locs`, `-no-principal`, `-no-rectypes`, `-no-strict-formats` - (Demi Obenour) + (Demi Marie Obenour) - #545: use reraise to preserve backtrace on `match .. with exception e -> raise e` @@ -9569,7 +9895,7 @@ OCaml 4.03.0 (25 Apr 2016): - #220: minor -dsource error on recursive modules (Hongbo Zhang) -- #228: fix a dangling internal pointer in (bytecode )debug_info +- #228: fix a dangling internal pointer in (bytecode) debug_info (Gabriel Scherer and Mark Shinwell and Xavier Leroy) - #233: Make CamlinternalMod.init_mod robust to optimization @@ -9921,7 +10247,7 @@ Bug fixes: (Jacques Garrigue, report by David Sheets) - #6768: Typechecker overflow the stack on cyclic type (Jacques Garrigue, report by user 'darktenaibre') -- #6770: (duplicate of #6686) +- #6770: duplicate of #6686 - #6772: asmrun/signals_asm.c doesn't compile on NetBSD/i386 (Kenji Tokudome) - #6775: Digest.file leaks file descriptor on error @@ -10868,7 +11194,6 @@ Tools: - #6030: Improve performance of -annot (Guillaume Melquiond, Alain Frisch) - OCaml 4.00.1 (5 Oct 2012): -------------------------- @@ -13380,7 +13705,7 @@ Objective Caml 2.00 (19 Aug 1998): - Check for overflow when generating the tables for the automaton. - Error messages in generated .ml file now point to .mll source. - Added "let = " to name regular expressions - (inspired by Christian Lindig's patch). + (inspired by Christian Lindig). * ocamlyacc: - Better error recovery in presence of EOF tokens. diff --git a/HACKING.adoc b/HACKING.adoc index afbd65d9756..3860a3f0b54 100644 --- a/HACKING.adoc +++ b/HACKING.adoc @@ -252,8 +252,7 @@ work locally) by pinning: ---- opam switch create my-switch-name --empty -# Replace $VERSION by the trunk version -opam pin add ocaml-variants.$VERSION+branch git+https://$REPO#branch +opam pin add ocaml-variants git+https://$REPO#branch ---- ==== Incremental builds with `opam` @@ -399,6 +398,8 @@ installation, the following targets may be of use: `make runtop` :: builds and runs the ocaml toplevel of the distribution (optionally uses `rlwrap` for readline+history support) + (use `make runtop-with-otherlibs` if you need `Unix` or other + `otherlibs/` libraries) `make natruntop`:: builds and runs the native ocaml toplevel (experimental) `make partialclean`:: Clean the OCaml files but keep the compiled C files. @@ -585,7 +586,7 @@ the following environment variables, which should be set in link:appveyor.yml[]: `world`, `opt`, `opt.opt` targets. The `C` build is a fast test used to build just enough of the tree to cover the C sources (it's used to test old MSVC compilers). -- `SDK`. Defaults to Visual Studio 2015. Specifies the exact command to run +- `SDK`. Defaults to Visual Studio 2022. Specifies the exact command to run to set-up the Microsoft build environment. - `CYGWIN_DIST`. Default: `64`. Either `64` or `32`, selects 32-bit or 64-bit Cygwin as the build environment. diff --git a/INSTALL.adoc b/INSTALL.adoc index 8c0a1e47498..ed29bf01df9 100644 --- a/INSTALL.adoc +++ b/INSTALL.adoc @@ -38,6 +38,9 @@ * If you do not have write access to `/tmp`, you should set the environment variable `TMPDIR` to the name of some other temporary directory. +* The zstd library is used for compression of marshaled data. The option + `--without-zstd` may be passed to `configure` in order to disable it. + == Prerequisites (special cases) * Under Cygwin, the `gcc-core` package is required. `flexdll` is also necessary diff --git a/Makefile b/Makefile index 59343613778..7bf8bbc1956 100644 --- a/Makefile +++ b/Makefile @@ -45,7 +45,6 @@ endif OC_OCAMLDEPDIRS = $(VPATH) -OCAMLDOC_OPT=$(WITH_OCAMLDOC:=.opt) OCAMLTEST_OPT=$(WITH_OCAMLTEST:=.opt) # This list is passed to expunge, which accepts both uncapitalized and @@ -60,8 +59,400 @@ TOPINCLUDES=$(addprefix -I otherlibs/,$(filter-out %threads,$(OTHERLIBRARIES))) expunge := expunge$(EXE) -# targets for the compilerlibs/*.{cma,cmxa} archives -include compilerlibs/Makefile.compilerlibs +# Targets and dependencies for the compilerlibs/*.{cma,cmxa} archives + +utils_SOURCES = $(addprefix utils/, \ + config.mli config.ml \ + build_path_prefix_map.mli build_path_prefix_map.ml \ + misc.mli misc.ml \ + identifiable.mli identifiable.ml \ + numbers.mli numbers.ml \ + arg_helper.mli arg_helper.ml \ + local_store.mli local_store.ml \ + load_path.mli load_path.ml \ + clflags.mli clflags.ml \ + profile.mli profile.ml \ + terminfo.mli terminfo.ml \ + ccomp.mli ccomp.ml \ + warnings.mli warnings.ml \ + consistbl.mli consistbl.ml \ + strongly_connected_components.mli strongly_connected_components.ml \ + targetint.mli targetint.ml \ + int_replace_polymorphic_compare.mli int_replace_polymorphic_compare.ml \ + domainstate.mli domainstate.ml \ + binutils.mli binutils.ml \ + lazy_backtrack.mli lazy_backtrack.ml \ + diffing.mli diffing.ml \ + diffing_with_keys.mli diffing_with_keys.ml) + +parsing_SOURCES = $(addprefix parsing/, \ + location.mli location.ml \ + unit_info.mli unit_info.ml \ + asttypes.mli \ + longident.mli longident.ml \ + parsetree.mli \ + docstrings.mli docstrings.ml \ + syntaxerr.mli syntaxerr.ml \ + ast_helper.mli ast_helper.ml \ + ast_iterator.mli ast_iterator.ml \ + builtin_attributes.mli builtin_attributes.ml \ + camlinternalMenhirLib.mli camlinternalMenhirLib.ml \ + parser.mly \ + lexer.mll \ + pprintast.mli pprintast.ml \ + parse.mli parse.ml \ + printast.mli printast.ml \ + ast_mapper.mli ast_mapper.ml \ + attr_helper.mli attr_helper.ml \ + ast_invariants.mli ast_invariants.ml \ + depend.mli depend.ml) + +typing_SOURCES = \ + typing/annot.mli \ + typing/value_rec_types.mli \ + typing/ident.mli typing/ident.ml \ + typing/path.mli typing/path.ml \ + typing/primitive.mli typing/primitive.ml \ + typing/type_immediacy.mli typing/type_immediacy.ml \ + typing/outcometree.mli \ + typing/shape.mli typing/shape.ml \ + typing/types.mli typing/types.ml \ + typing/btype.mli typing/btype.ml \ + typing/oprint.mli typing/oprint.ml \ + typing/subst.mli typing/subst.ml \ + typing/predef.mli typing/predef.ml \ + typing/datarepr.mli typing/datarepr.ml \ + file_formats/cmi_format.mli file_formats/cmi_format.ml \ + typing/persistent_env.mli typing/persistent_env.ml \ + typing/env.mli typing/env.ml \ + typing/errortrace.mli typing/errortrace.ml \ + typing/typedtree.mli typing/typedtree.ml \ + typing/signature_group.mli typing/signature_group.ml \ + typing/printtyped.mli typing/printtyped.ml \ + typing/ctype.mli typing/ctype.ml \ + typing/printtyp.mli typing/printtyp.ml \ + typing/includeclass.mli typing/includeclass.ml \ + typing/mtype.mli typing/mtype.ml \ + typing/envaux.mli typing/envaux.ml \ + typing/includecore.mli typing/includecore.ml \ + typing/tast_iterator.mli typing/tast_iterator.ml \ + typing/tast_mapper.mli typing/tast_mapper.ml \ + typing/stypes.mli typing/stypes.ml \ + file_formats/cmt_format.mli file_formats/cmt_format.ml \ + typing/cmt2annot.mli typing/cmt2annot.ml \ + typing/untypeast.mli typing/untypeast.ml \ + typing/includemod.mli typing/includemod.ml \ + typing/includemod_errorprinter.mli typing/includemod_errorprinter.ml \ + typing/typetexp.mli typing/typetexp.ml \ + typing/printpat.mli typing/printpat.ml \ + typing/patterns.mli typing/patterns.ml \ + typing/parmatch.mli typing/parmatch.ml \ + typing/typedecl_properties.mli typing/typedecl_properties.ml \ + typing/typedecl_variance.mli typing/typedecl_variance.ml \ + typing/typedecl_unboxed.mli typing/typedecl_unboxed.ml \ + typing/typedecl_immediacy.mli typing/typedecl_immediacy.ml \ + typing/typedecl_separability.mli typing/typedecl_separability.ml \ + typing/typeopt.mli typing/typeopt.ml \ + typing/typedecl.mli typing/typedecl.ml \ + typing/value_rec_check.mli typing/value_rec_check.ml \ + typing/typecore.mli typing/typecore.ml \ + typing/typeclass.mli typing/typeclass.ml \ + typing/typemod.mli typing/typemod.ml + +lambda_SOURCES = $(addprefix lambda/, \ + debuginfo.mli debuginfo.ml \ + lambda.mli lambda.ml \ + printlambda.mli printlambda.ml \ + switch.mli switch.ml \ + matching.mli matching.ml \ + translobj.mli translobj.ml \ + translattribute.mli translattribute.ml \ + translprim.mli translprim.ml \ + translcore.mli translcore.ml \ + translclass.mli translclass.ml \ + translmod.mli translmod.ml \ + tmc.mli tmc.ml \ + simplif.mli simplif.ml \ + runtimedef.mli runtimedef.ml) + +comp_SOURCES = \ + file_formats/cmo_format.mli \ + file_formats/cmx_format.mli \ + file_formats/cmxs_format.mli \ + bytecomp/meta.mli bytecomp/meta.ml \ + bytecomp/opcodes.mli bytecomp/opcodes.ml \ + bytecomp/bytesections.mli bytecomp/bytesections.ml \ + bytecomp/dll.mli bytecomp/dll.ml \ + bytecomp/symtable.mli bytecomp/symtable.ml \ + driver/pparse.mli driver/pparse.ml \ + driver/compenv.mli driver/compenv.ml \ + driver/main_args.mli driver/main_args.ml \ + driver/compmisc.mli driver/compmisc.ml \ + driver/makedepend.mli driver/makedepend.ml \ + driver/compile_common.mli driver/compile_common.ml +# All file format descriptions (including cmx{,s}) are in the +# ocamlcommon library so that ocamlobjinfo can depend on them. + +ocamlcommon_SOURCES = \ + $(utils_SOURCES) $(parsing_SOURCES) $(typing_SOURCES) \ + $(lambda_SOURCES) $(comp_SOURCES) + +ocamlbytecomp_SOURCES = \ + bytecomp/instruct.mli bytecomp/instruct.ml \ + bytecomp/bytegen.mli bytecomp/bytegen.ml \ + bytecomp/printinstr.mli bytecomp/printinstr.ml \ + bytecomp/emitcode.mli bytecomp/emitcode.ml \ + bytecomp/bytelink.mli bytecomp/bytelink.ml \ + bytecomp/bytelibrarian.mli bytecomp/bytelibrarian.ml \ + bytecomp/bytepackager.mli bytecomp/bytepackager.ml \ + driver/errors.mli driver/errors.ml \ + driver/compile.mli driver/compile.ml \ + driver/maindriver.mli driver/maindriver.ml + +intel_SOURCES = \ + x86_ast.mli \ + x86_proc.mli x86_proc.ml \ + x86_dsl.mli x86_dsl.ml \ + x86_gas.mli x86_gas.ml \ + x86_masm.mli x86_masm.ml + +asmcomp_SOURCES = \ + $(addprefix asmcomp/, $(arch_specific_SOURCES)) \ + asmcomp/arch.mli asmcomp/arch.ml \ + asmcomp/cmm.mli asmcomp/cmm.ml \ + asmcomp/printcmm.mli asmcomp/printcmm.ml \ + asmcomp/reg.mli asmcomp/reg.ml \ + asmcomp/mach.mli asmcomp/mach.ml \ + asmcomp/proc.mli asmcomp/proc.ml \ + asmcomp/strmatch.mli asmcomp/strmatch.ml \ + asmcomp/cmmgen_state.mli asmcomp/cmmgen_state.ml \ + asmcomp/cmm_helpers.mli asmcomp/cmm_helpers.ml \ + asmcomp/afl_instrument.mli asmcomp/afl_instrument.ml \ + asmcomp/thread_sanitizer.mli asmcomp/thread_sanitizer.ml \ + asmcomp/cmmgen.mli asmcomp/cmmgen.ml \ + asmcomp/cmm_invariants.mli asmcomp/cmm_invariants.ml \ + asmcomp/interval.mli asmcomp/interval.ml \ + asmcomp/printmach.mli asmcomp/printmach.ml \ + asmcomp/dataflow.mli asmcomp/dataflow.ml \ + asmcomp/polling.mli asmcomp/polling.ml \ + asmcomp/selectgen.mli asmcomp/selectgen.ml \ + asmcomp/selection.mli asmcomp/selection.ml \ + asmcomp/comballoc.mli asmcomp/comballoc.ml \ + asmcomp/CSEgen.mli asmcomp/CSEgen.ml \ + asmcomp/CSE.mli asmcomp/CSE.ml \ + asmcomp/liveness.mli asmcomp/liveness.ml \ + asmcomp/spill.mli asmcomp/spill.ml \ + asmcomp/split.mli asmcomp/split.ml \ + asmcomp/interf.mli asmcomp/interf.ml \ + asmcomp/coloring.mli asmcomp/coloring.ml \ + asmcomp/linscan.mli asmcomp/linscan.ml \ + asmcomp/reloadgen.mli asmcomp/reloadgen.ml \ + asmcomp/reload.mli asmcomp/reload.ml \ + asmcomp/deadcode.mli asmcomp/deadcode.ml \ + asmcomp/stackframegen.mli asmcomp/stackframegen.ml \ + asmcomp/stackframe.mli asmcomp/stackframe.ml \ + asmcomp/linear.mli asmcomp/linear.ml \ + asmcomp/printlinear.mli asmcomp/printlinear.ml \ + asmcomp/linearize.mli asmcomp/linearize.ml \ + file_formats/linear_format.mli file_formats/linear_format.ml \ + asmcomp/schedgen.mli asmcomp/schedgen.ml \ + asmcomp/scheduling.mli asmcomp/scheduling.ml \ + asmcomp/branch_relaxation.mli asmcomp/branch_relaxation.ml \ + asmcomp/emitaux.mli asmcomp/emitaux.ml \ + asmcomp/emit.mli asmcomp/emit.ml \ + asmcomp/asmgen.mli asmcomp/asmgen.ml \ + asmcomp/asmlink.mli asmcomp/asmlink.ml \ + asmcomp/asmlibrarian.mli asmcomp/asmlibrarian.ml \ + asmcomp/asmpackager.mli asmcomp/asmpackager.ml \ + driver/opterrors.mli driver/opterrors.ml \ + driver/optcompile.mli driver/optcompile.ml \ + driver/optmaindriver.mli driver/optmaindriver.ml + +# Files under middle_end/ are not to reference files under asmcomp/. +# This ensures that the middle end can be linked (e.g. for objinfo) even when +# the native code compiler is not present for some particular target. + +middle_end_closure_SOURCES = $(addprefix middle_end/closure/, \ + closure.mli closure.ml \ + closure_middle_end.mli closure_middle_end.ml) + +# Owing to dependencies through [Compilenv], which would be +# difficult to remove, some of the lower parts of Flambda (anything that is +# saved in a .cmx file) have to be included in the [MIDDLE_END] stanza, below. +middle_end_flambda_SOURCES = \ +$(addprefix middle_end/flambda/, \ + import_approx.mli import_approx.ml \ + lift_code.mli lift_code.ml \ + closure_conversion_aux.mli closure_conversion_aux.ml \ + closure_conversion.mli closure_conversion.ml \ + initialize_symbol_to_let_symbol.mli initialize_symbol_to_let_symbol.ml \ + lift_let_to_initialize_symbol.mli lift_let_to_initialize_symbol.ml \ + find_recursive_functions.mli find_recursive_functions.ml \ + invariant_params.mli invariant_params.ml \ + inconstant_idents.mli inconstant_idents.ml \ + alias_analysis.mli alias_analysis.ml \ + lift_constants.mli lift_constants.ml \ + share_constants.mli share_constants.ml \ + simplify_common.mli simplify_common.ml \ + remove_unused_arguments.mli remove_unused_arguments.ml \ + remove_unused_closure_vars.mli remove_unused_closure_vars.ml \ + remove_unused_program_constructs.mli remove_unused_program_constructs.ml \ + simplify_boxed_integer_ops.mli simplify_boxed_integer_ops.ml \ + simplify_primitives.mli simplify_primitives.ml \ + inlining_stats_types.mli inlining_stats_types.ml \ + inlining_stats.mli inlining_stats.ml \ + inline_and_simplify_aux.mli inline_and_simplify_aux.ml \ + inlining_decision_intf.mli \ + remove_free_vars_equal_to_args.mli remove_free_vars_equal_to_args.ml \ + extract_projections.mli extract_projections.ml \ + augment_specialised_args.mli augment_specialised_args.ml \ + unbox_free_vars_of_closures.mli unbox_free_vars_of_closures.ml \ + unbox_specialised_args.mli unbox_specialised_args.ml \ + unbox_closures.mli unbox_closures.ml \ + inlining_transforms.mli inlining_transforms.ml \ + inlining_decision.mli inlining_decision.ml \ + inline_and_simplify.mli inline_and_simplify.ml \ + ref_to_variables.mli ref_to_variables.ml \ + flambda_invariants.mli flambda_invariants.ml \ + traverse_for_exported_symbols.mli traverse_for_exported_symbols.ml \ + build_export_info.mli build_export_info.ml \ + closure_offsets.mli closure_offsets.ml \ + un_anf.mli un_anf.ml \ + flambda_to_clambda.mli flambda_to_clambda.ml \ + flambda_middle_end.mli flambda_middle_end.ml \ + simplify_boxed_integer_ops_intf.mli) + +ocamlmiddleend_SOURCES = \ +$(addprefix middle_end/, \ + internal_variable_names.mli internal_variable_names.ml \ + linkage_name.mli linkage_name.ml \ + compilation_unit.mli compilation_unit.ml \ + variable.mli variable.ml \ + $(addprefix flambda/base_types/, \ + closure_element.mli closure_element.ml \ + closure_id.mli closure_id.ml) \ + symbol.mli symbol.ml \ + backend_var.mli backend_var.ml \ + clambda_primitives.mli clambda_primitives.ml \ + printclambda_primitives.mli printclambda_primitives.ml \ + clambda.mli clambda.ml \ + printclambda.mli printclambda.ml \ + semantics_of_primitives.mli semantics_of_primitives.ml \ + convert_primitives.mli convert_primitives.ml \ + $(addprefix flambda/, \ + $(addprefix base_types/, \ + id_types.mli id_types.ml \ + export_id.mli export_id.ml \ + tag.mli tag.ml \ + mutable_variable.mli mutable_variable.ml \ + set_of_closures_id.mli set_of_closures_id.ml \ + set_of_closures_origin.mli set_of_closures_origin.ml \ + closure_origin.mli closure_origin.ml \ + var_within_closure.mli var_within_closure.ml \ + static_exception.mli static_exception.ml) \ + pass_wrapper.mli pass_wrapper.ml \ + allocated_const.mli allocated_const.ml \ + parameter.mli parameter.ml \ + projection.mli projection.ml \ + flambda.mli flambda.ml \ + flambda_iterators.mli flambda_iterators.ml \ + flambda_utils.mli flambda_utils.ml \ + freshening.mli freshening.ml \ + effect_analysis.mli effect_analysis.ml \ + inlining_cost.mli inlining_cost.ml \ + simple_value_approx.mli simple_value_approx.ml \ + export_info.mli export_info.ml \ + export_info_for_pack.mli export_info_for_pack.ml) \ + compilenv.mli compilenv.ml \ + backend_intf.mli) \ + $(middle_end_closure_SOURCES) \ + $(middle_end_flambda_SOURCES) + +ocamloptcomp_SOURCES = $(ocamlmiddleend_SOURCES) $(asmcomp_SOURCES) + +ocamltoplevel_SOURCES = $(addprefix toplevel/, \ + genprintval.mli genprintval.ml \ + topcommon.mli topcommon.ml \ + native/tophooks.mli native/tophooks.ml \ + byte/topeval.mli byte/topeval.ml \ + native/topeval.mli native/topeval.ml \ + byte/trace.mli byte/trace.ml \ + native/trace.mli native/trace.ml \ + toploop.mli toploop.ml \ + topprinters.mli topprinters.ml \ + topdirs.mli topdirs.ml \ + byte/topmain.mli byte/topmain.ml \ + native/topmain.mli native/topmain.ml) + +TOPLEVEL_SHARED_MLIS = topeval.mli trace.mli topmain.mli +TOPLEVEL_SHARED_CMIS = $(TOPLEVEL_SHARED_MLIS:%.mli=%.cmi) +TOPLEVEL_SHARED_ARTEFACTS = $(TOPLEVEL_SHARED_MLIS) $(TOPLEVEL_SHARED_CMIS) + +$(addprefix toplevel/byte/, $(TOPLEVEL_SHARED_CMIS)):\ +toplevel/byte/%.cmi: toplevel/%.cmi + cp $< toplevel/$*.mli $(@D) + +$(addprefix toplevel/native/, $(TOPLEVEL_SHARED_CMIS)):\ +toplevel/native/%.cmi: toplevel/%.cmi + cp $< toplevel/$*.mli $(@D) + +beforedepend:: + cd toplevel ; cp $(TOPLEVEL_SHARED_MLIS) byte/ + cd toplevel ; cp $(TOPLEVEL_SHARED_MLIS) native/ + +partialclean:: + cd toplevel/byte ; rm -f $(TOPLEVEL_SHARED_ARTEFACTS) + cd toplevel/native ; rm -f $(TOPLEVEL_SHARED_ARTEFACTS) + +ALL_CONFIG_CMO = utils/config_main.cmo utils/config_boot.cmo + +utils/config_%.mli: utils/config.mli + cp $^ $@ + +beforedepend:: utils/config_main.mli utils/config_boot.mli + +$(addprefix compilerlibs/ocamlcommon., cma cmxa): \ + OC_COMMON_LINKFLAGS += -linkall + +partialclean:: + rm -f compilerlibs/ocamlcommon.cma + +partialclean:: + rm -f compilerlibs/ocamlcommon.cmxa \ + compilerlibs/ocamlcommon.a compilerlibs/ocamlcommon.lib + + +partialclean:: + rm -f compilerlibs/ocamlbytecomp.cma + +partialclean:: + rm -f compilerlibs/ocamlbytecomp.cmxa \ + compilerlibs/ocamlbytecomp.a compilerlibs/ocamlbytecomp.lib + + +partialclean:: + rm -f compilerlibs/ocamlmiddleend.cma \ + compilerlibs/ocamlmiddleend.cmxa \ + compilerlibs/ocamlmiddleend.a \ + compilerlibs/ocamlmiddleend.lib + + +partialclean:: + rm -f compilerlibs/ocamloptcomp.cma + +partialclean:: + rm -f compilerlibs/ocamloptcomp.cmxa \ + compilerlibs/ocamloptcomp.a compilerlibs/ocamloptcomp.lib + + +compilerlibs/ocamltoplevel.cma: VPATH += toplevel/byte +partialclean:: + rm -f compilerlibs/ocamltoplevel.cma + +compilerlibs/ocamltoplevel.cmxa: VPATH += toplevel/native +partialclean:: + rm -f compilerlibs/ocamltoplevel.cmxa \ + compilerlibs/ocamltoplevel.a compilerlibs/ocamltoplevel.lib # The configuration file @@ -138,7 +529,7 @@ $(foreach PROGRAM, $(C_PROGRAMS),\ # OCaml programs that are compiled in both bytecode and native code OCAML_PROGRAMS = ocamlc ocamlopt lex/ocamllex $(TOOLS_NAT_PROGRAMS) \ - ocamltest/ocamltest + ocamldoc/ocamldoc ocamltest/ocamltest $(foreach PROGRAM, $(OCAML_PROGRAMS),\ $(eval $(call OCAML_PROGRAM,$(PROGRAM)))) @@ -164,6 +555,54 @@ OCAML_NATIVE_PROGRAMS = ocamlnat tools/lintapidiff.opt $(foreach PROGRAM, $(OCAML_NATIVE_PROGRAMS),\ $(eval $(call OCAML_NATIVE_PROGRAM,$(PROGRAM)))) +# OCaml libraries that are compiled in both bytecode and native code + +# List of compilerlibs + +COMPILERLIBS = $(addprefix compilerlibs/, \ + ocamlbytecomp \ + ocamlcommon \ + ocamlmiddleend \ + ocamloptcomp \ + ocamltoplevel) + +# Since the compiler libraries are necessarily compiled with boot/ocamlc, +# make sure they *always are*, even when rebuilding a program compiled +# with ./ocamlc (e.g. ocamltex) + +$(COMPILERLIBS:=.cma): \ + CAMLC = $(BOOT_OCAMLC) $(BOOT_STDLIBFLAGS) -use-prims runtime/primitives + +# The following dependency ensures that the two versions of the +# configuration module (the one for the bootstrap compiler and the +# one for the compiler to be installed) are compiled. This is to make +# sure these two versions remain in sync with each other + +compilerlibs/ocamlcommon.cma: $(ALL_CONFIG_CMO) + +OCAML_LIBRARIES = $(COMPILERLIBS) + +ifeq "$(build_ocamldoc)" "true" +OCAML_LIBRARIES += ocamldoc/odoc_info +endif + +$(foreach LIBRARY, $(OCAML_LIBRARIES),\ + $(eval $(call OCAML_LIBRARY,$(LIBRARY)))) + +# OCaml libraries that are compiled only in bytecode + +OCAML_BYTECODE_LIBRARIES = + +$(foreach LIBRARY, $(OCAML_BYTECODE_LIBRARIES),\ + $(eval $(call OCAML_BYTECODE_LIBRARY,$(LIBRARY)))) + +# OCaml libraries that are compiled only in native code + +OCAML_NATIVE_LIBRARIES = + +$(foreach LIBRARY, $(OCAML_NATIVE_LIBRARIES),\ + $(eval $(call OCAML_NATIVE_LIBRARY,$(LIBRARY)))) + USE_RUNTIME_PRIMS = -use-prims ../runtime/primitives USE_STDLIB = -nostdlib -I ../stdlib @@ -308,13 +747,17 @@ ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" $(MAKE) flexlink.opt$(EXE) endif $(MAKE) ocamlc.opt - $(MAKE) otherlibraries $(WITH_DEBUGGER) $(WITH_OCAMLDOC) \ +# TODO: introduce OPTIONAL_LIBRARIES and OPTIONAL_TOOLS variables to be +# computed at configure time to keep track of which tools and libraries +# need to be built + $(MAKE) otherlibraries $(WITH_DEBUGGER) $(OCAMLDOC_TARGET) \ $(WITH_OCAMLTEST) $(MAKE) ocamlopt.opt $(MAKE) otherlibrariesopt - $(MAKE) ocamllex.opt ocamltoolsopt ocamltoolsopt.opt $(OCAMLDOC_OPT) \ + $(MAKE) ocamllex.opt ocamltoolsopt ocamltoolsopt.opt \ + $(OCAMLDOC_OPT_TARGET) \ $(OCAMLTEST_OPT) othertools ocamlnat -ifeq "$(WITH_OCAMLDOC)-$(STDLIB_MANPAGES)" "ocamldoc-true" +ifeq "$(build_libraries_manpages)" "true" $(MAKE) manpages endif @@ -351,10 +794,10 @@ endif .PHONY: all all: coreall $(MAKE) ocaml - $(MAKE) otherlibraries $(WITH_DEBUGGER) $(WITH_OCAMLDOC) \ + $(MAKE) otherlibraries $(WITH_DEBUGGER) $(OCAMLDOC_TARGET) \ $(WITH_OCAMLTEST) $(MAKE) othertools -ifeq "$(WITH_OCAMLDOC)-$(STDLIB_MANPAGES)" "ocamldoc-true" +ifeq "$(build_libraries_manpages)" "true" $(MAKE) manpages endif @@ -535,23 +978,31 @@ partialclean:: TOPFLAGS ?= OC_TOPFLAGS = $(STDLIBFLAGS) -I toplevel -noinit $(TOPINCLUDES) $(TOPFLAGS) -# Note: Beware that, since this rule begins with a coldstart, both +RUN_OCAML = $(RLWRAP) $(OCAMLRUN) ./ocaml$(EXE) $(OC_TOPFLAGS) +RUN_OCAMLNAT = $(RLWRAP) ./ocamlnat$(EXE) $(OC_TOPFLAGS) + +# Note: Beware that, since these rules begin with a coldstart, both # boot/ocamlrun and runtime/ocamlrun will be the same when the toplevel # is run. .PHONY: runtop -runtop: - $(MAKE) coldstart +runtop: coldstart + $(MAKE) ocamlc + $(MAKE) ocaml + @$(RUN_OCAML) + +.PHONY: runtop-with-otherlibs +runtop-with-otherlibs: coldstart $(MAKE) ocamlc $(MAKE) otherlibraries $(MAKE) ocaml - @$(RLWRAP) $(OCAMLRUN) ./ocaml$(EXE) $(OC_TOPFLAGS) + @$(RUN_OCAML) .PHONY: natruntop natruntop: $(MAKE) core $(MAKE) opt $(MAKE) ocamlnat - @$(RLWRAP) ./ocamlnat$(EXE) $(OC_TOPFLAGS) + @$(RUN_OCAMLNAT) # Native dynlink @@ -709,7 +1160,8 @@ runtime_NATIVE_C_SOURCES = \ $(runtime_NATIVE_ONLY_C_SOURCES:%=runtime/%.c) ## Header files generated by configure -runtime_CONFIGURED_HEADERS = $(addprefix runtime/caml/, m.h s.h version.h) +runtime_CONFIGURED_HEADERS = \ + $(addprefix runtime/caml/, exec.h m.h s.h version.h) ## Header files generated by make runtime_BUILT_HEADERS = $(addprefix runtime/, \ @@ -800,48 +1252,22 @@ runtime/ld.conf: $(ROOTDIR)/Makefile.config $(V_GEN)echo "$(STUBLIBDIR)" > $@ && \ echo "$(LIBDIR)" >> $@ -# If primitives contain duplicated lines (e.g. because the code is defined -# like -# #ifdef X -# CAMLprim value caml_foo() ... -# #else -# CAMLprim value caml_foo() ... -# #endif), horrible things will happen: duplicated entries in Runtimedef -> -# double registration in Symtable -> empty entry in the PRIM table -> -# the bytecode interpreter is confused. -# We sort the primitive file and remove duplicates to avoid this problem. - -# Warning: we use "sort | uniq" instead of "sort -u" because in the MSVC -# port, the "sort" program in the path is Microsoft's and not cygwin's - -# Warning: POSIX sort is locale dependent, that's why we set LC_ALL explicitly. -# Sort is unstable for "is_directory" and "isatty" -# see http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html: -# "using sort to process pathnames, it is recommended that LC_ALL .. set to C" +PRIMITIVES_NEW := runtime/primitives$(shell echo "$$PPID").new # To speed up builds, we avoid changing "primitives" when files # containing primitives change but the primitives table does not -runtime/primitives: \ - $(shell runtime/gen_primitives.sh > runtime/primitives.new; \ - cmp -s runtime/primitives runtime/primitives.new || \ - echo runtime/primitives.new) - $(V_GEN)cp $^ $@ - -runtime/prims.c : runtime/primitives - $(V_GEN)export LC_ALL=C; \ - (echo '#include "caml/config.h"'; \ - echo 'typedef intnat value;'; \ - echo 'typedef value (*c_primitive)(void);'; \ - echo; \ - sed -e 's/.*/extern value &(void);/' $<; \ - echo; \ - echo 'const c_primitive caml_builtin_cprim[] = {'; \ - sed -e 's/.*/ &,/' $<; \ - echo ' 0 };'; \ - echo; \ - echo 'const char * const caml_names_of_builtin_cprim[] = {'; \ - sed -e 's/.*/ "&",/' $<; \ - echo ' 0 };') > $@ +runtime/primitives: runtime/gen_primitives.sh \ + $(shell runtime/gen_primitives.sh $(runtime_BYTECODE_C_SOURCES) \ + > $(PRIMITIVES_NEW); \ + { cmp -s runtime/primitives $(PRIMITIVES_NEW) && \ + rm -f $(PRIMITIVES_NEW) ; } || \ + echo $(runtime_BYTECODE_C_SOURCES)) + $(V_GEN)mv $(PRIMITIVES_NEW) $@ + +runtime/prims.c: runtime/gen_primsc.sh runtime/primitives + $(V_GEN)runtime/gen_primsc.sh \ + runtime/primitives $(runtime_BYTECODE_C_SOURCES) \ + > $@ runtime/caml/opnames.h : runtime/caml/instruct.h $(V_GEN)tr -d '\r' < $< | \ @@ -1023,21 +1449,16 @@ runtime/%.i.o: runtime/%.S runtime/%_libasmrunpic.o: runtime/%.S $(V_ASM)$(ASPP) $(OC_ASPPFLAGS) $(SHAREDLIB_CFLAGS) -o $@ $< -runtime/domain_state64.inc: \ - runtime/gen_domain_state64_inc.awk runtime/caml/domain_state.tbl - $(V_GEN)$(AWK) -f $^ > $@ - -runtime/domain_state32.inc: \ - runtime/gen_domain_state32_inc.awk runtime/caml/domain_state.tbl - $(V_GEN)$(AWK) -f $^ > $@ +runtime/domain_state.inc: runtime/caml/domain_state.tbl + $(V_GEN)$(CPP) $< > $@ -runtime/amd64nt.obj: runtime/amd64nt.asm runtime/domain_state64.inc +runtime/amd64nt.obj: runtime/amd64nt.asm runtime/domain_state.inc $(V_ASM)$(ASM)$@ $< -runtime/amd64nt.d.obj: runtime/amd64nt.asm runtime/domain_state64.inc +runtime/amd64nt.d.obj: runtime/amd64nt.asm runtime/domain_state.inc $(V_ASM)$(ASM)$@ $(ocamlrund_CPPFLAGS) $< -runtime/amd64nt.i.obj: runtime/amd64nt.asm runtime/domain_state64.inc +runtime/amd64nt.i.obj: runtime/amd64nt.asm runtime/domain_state.inc $(V_ASM)$(ASM)$@ $(ocamlruni_CPPFLAGS) $< runtime/%_libasmrunpic.obj: runtime/%.asm @@ -1071,9 +1492,9 @@ clean:: rm -f $(addprefix runtime/, ocamlrun ocamlrund ocamlruni ocamlruns sak) rm -f $(addprefix runtime/, \ ocamlrun.exe ocamlrund.exe ocamlruni.exe ocamlruns.exe sak.exe) - rm -f runtime/primitives runtime/primitives.new runtime/prims.c \ + rm -f runtime/primitives runtime/primitives*.new runtime/prims.c \ $(runtime_BUILT_HEADERS) - rm -f runtime/domain_state*.inc + rm -f runtime/domain_state.inc rm -rf $(DEPDIR) rm -f stdlib/libcamlrun.a stdlib/libcamlrun.lib @@ -1090,8 +1511,7 @@ clean:: # Dependencies -subdirs = stdlib $(addprefix otherlibs/, $(ALL_OTHERLIBS)) \ - ocamldoc +subdirs = stdlib $(addprefix otherlibs/, $(ALL_OTHERLIBS)) .PHONY: alldepend alldepend: depend @@ -1236,13 +1656,85 @@ partialclean:: partialclean-menhir # OCamldoc +# First define the odoc_info library used to build OCamldoc + +odoc_info_SOURCES = $(addprefix ocamldoc/,\ + odoc_config.mli odoc_config.ml \ + odoc_messages.mli odoc_messages.ml \ + odoc_global.mli odoc_global.ml \ + odoc_types.mli odoc_types.ml \ + odoc_misc.mli odoc_misc.ml \ + odoc_text_parser.mly \ + odoc_text_lexer.mli odoc_text_lexer.mll \ + odoc_text.mli odoc_text.ml \ + odoc_name.mli odoc_name.ml \ + odoc_parameter.mli odoc_parameter.ml \ + odoc_value.mli odoc_value.ml \ + odoc_type.mli odoc_type.ml \ + odoc_extension.mli odoc_extension.ml \ + odoc_exception.mli odoc_exception.ml \ + odoc_class.mli odoc_class.ml \ + odoc_module.mli odoc_module.ml \ + odoc_print.mli odoc_print.ml \ + odoc_str.mli odoc_str.ml \ + odoc_comments_global.mli odoc_comments_global.ml \ + odoc_parser.mly \ + odoc_lexer.mli odoc_lexer.mll \ + odoc_see_lexer.mli odoc_see_lexer.mll \ + odoc_env.mli odoc_env.ml \ + odoc_merge.mli odoc_merge.ml \ + odoc_sig.mli odoc_sig.ml \ + odoc_ast.mli odoc_ast.ml \ + odoc_search.mli odoc_search.ml \ + odoc_scan.mli odoc_scan.ml \ + odoc_cross.mli odoc_cross.ml \ + odoc_comments.mli odoc_comments.ml \ + odoc_dep.mli odoc_dep.ml \ + odoc_analyse.mli odoc_analyse.ml \ + odoc_info.mli odoc_info.ml) + +ocamldoc_LIBRARIES = \ + compilerlibs/ocamlcommon \ + $(addprefix otherlibs/,\ + unix/unix \ + str/str \ + dynlink/dynlink) \ + ocamldoc/odoc_info + +ocamldoc_SOURCES = $(addprefix ocamldoc/,\ + odoc_dag2html.mli odoc_dag2html.ml \ + odoc_to_text.mli odoc_to_text.ml \ + odoc_ocamlhtml.mli odoc_ocamlhtml.mll \ + odoc_html.mli odoc_html.ml \ + odoc_man.mli odoc_man.ml \ + odoc_latex_style.mli odoc_latex_style.ml \ + odoc_latex.mli odoc_latex.ml \ + odoc_texi.mli odoc_texi.ml \ + odoc_dot.mli odoc_dot.ml \ + odoc_gen.mli odoc_gen.ml \ + odoc_args.mli odoc_args.ml \ + odoc.mli odoc.ml) + +# OCamldoc files to install (a subset of what is built) + +OCAMLDOC_LIBMLIS = $(addprefix ocamldoc/,$(addsuffix .mli,\ + odoc_dep odoc_dot odoc_extension odoc_html odoc_info odoc_latex \ + odoc_latex_style odoc_man odoc_messages odoc_ocamlhtml odoc_parameter \ + odoc_texi odoc_text_lexer odoc_to_text odoc_type odoc_value)) +OCAMLDOC_LIBCMIS=$(OCAMLDOC_LIBMLIS:.mli=.cmi) +OCAMLDOC_LIBCMTS=$(OCAMLDOC_LIBMLIS:.mli=.cmt) $(OCAMLDOC_LIBMLIS:.mli=.cmti) + +ocamldoc/%: CAMLC = $(BEST_OCAMLC) $(STDLIBFLAGS) + .PHONY: ocamldoc -ocamldoc: ocamlc ocamlyacc ocamllex otherlibraries - $(MAKE) -C ocamldoc all +ocamldoc: ocamldoc/ocamldoc$(EXE) ocamldoc/odoc_test.cmo + +ocamldoc/ocamldoc$(EXE): ocamlc ocamlyacc ocamllex .PHONY: ocamldoc.opt -ocamldoc.opt: ocamlc.opt ocamlyacc ocamllex - $(MAKE) -C ocamldoc opt.opt +ocamldoc.opt: ocamldoc/ocamldoc.opt$(EXE) + +ocamldoc/ocamldoc.opt$(EXE): ocamlc.opt ocamlyacc ocamllex # OCamltest @@ -1318,8 +1810,6 @@ $(DEPDIR)/ocamltest: $(ocamltest_DEP_FILES): $(DEPDIR)/ocamltest/%.$(D): ocamltest/%.c $(V_CCDEPS)$(DEP_CC) $(OC_CPPFLAGS) $(CPPFLAGS) $< -MT '$*.$(O)' -MF $@ -beforedepend:: $(ocamltest_MLI_FILES) $(ocamltest_ML_FILES) - ocamltest/%: CAMLC = $(BEST_OCAMLC) $(STDLIBFLAGS) ocamltest: ocamltest/ocamltest$(EXE) @@ -1367,7 +1857,14 @@ manpages: $(MAKE) -C api_docgen man partialclean:: - $(MAKE) -C ocamldoc clean + rm -f ocamldoc/\#*\# + rm -f ocamldoc/*.cm[aiotx] ocamldoc/*.cmxa ocamldoc/*.cmti \ + ocamldoc/*.a ocamldoc/*.lib ocamldoc/*.o ocamldoc/*.obj + rm -f ocamldoc/odoc_parser.output ocamldoc/odoc_text_parser.output + rm -f ocamldoc/odoc_lexer.ml ocamldoc/odoc_text_lexer.ml \ + ocamldoc/odoc_see_lexer.ml ocamldoc/odoc_ocamlhtml.ml + rm -f ocamldoc/odoc_parser.ml ocamldoc/odoc_parser.mli \ + ocamldoc/odoc_text_parser.ml ocamldoc/odoc_text_parser.mli partialclean:: $(MAKE) -C api_docgen clean @@ -1390,6 +1887,10 @@ otherlibraries: ocamltools otherlibrariesopt: $(MAKE) -C otherlibs allopt +otherlibs/unix/unix.cmxa: otherlibrariesopt +otherlibs/dynlink/dynlink.cmxa: otherlibrariesopt +otherlibs/str/str.cmxa: otherlibrariesopt + partialclean:: $(MAKE) -C otherlibs partialclean @@ -1408,6 +1909,7 @@ ocamldebug_LIBRARIES = compilerlibs/ocamlcommon \ otherlibs/unix/unix.cma: otherlibraries otherlibs/dynlink/dynlink.cma: otherlibraries +otherlibs/str/str.cma: otherlibraries debugger/%: VPATH += otherlibs/unix otherlibs/dynlink @@ -1608,6 +2110,8 @@ ocamlprof_SOURCES = \ docstrings.mli docstrings.ml \ syntaxerr.mli syntaxerr.ml \ ast_helper.mli ast_helper.ml \ + ast_iterator.mli ast_iterator.ml \ + builtin_attributes.mli builtin_attributes.ml \ camlinternalMenhirLib.mli camlinternalMenhirLib.ml \ parser.mli parser.ml \ lexer.mli lexer.ml \ @@ -1840,7 +2344,7 @@ depend: beforedepend lambda file_formats middle_end/closure middle_end/flambda \ middle_end/flambda/base_types \ driver toplevel toplevel/byte toplevel/native lex tools debugger \ - ocamltest; \ + ocamldoc ocamltest; \ do \ $(OCAMLDEP) $(OC_OCAMLDEPFLAGS) -I $$d $(INCLUDES) \ $(OCAMLDEPFLAGS) $$d/*.mli $$d/*.ml \ @@ -1850,14 +2354,14 @@ depend: beforedepend .PHONY: distclean distclean: clean $(MAKE) -C manual distclean - $(MAKE) -C ocamldoc distclean + rm -f ocamldoc/META rm -f $(addprefix ocamltest/,ocamltest_config.ml ocamltest_unix.ml) $(MAKE) -C otherlibs distclean rm -f $(runtime_CONFIGURED_HEADERS) $(MAKE) -C stdlib distclean $(MAKE) -C testsuite distclean rm -f tools/eventlog_metadata tools/*.bak - rm -f utils/config.generated.ml + rm -f utils/config.common.ml utils/config.generated.ml rm -f compilerlibs/META rm -f boot/ocamlrun boot/ocamlrun.exe boot/camlheader \ boot/flexdll_*.o boot/flexdll_*.obj \ @@ -1970,9 +2474,22 @@ endif $(MAKE) -C otherlibs/$$i install || exit $$?; \ done ifeq "$(build_ocamldoc)" "true" - $(MAKE) -C ocamldoc install + $(MKDIR) "$(INSTALL_LIBDIR)/ocamldoc" + $(INSTALL_PROG) $(OCAMLDOC) "$(INSTALL_BINDIR)" + $(INSTALL_DATA) \ + ocamldoc/ocamldoc.hva ocamldoc/*.cmi ocamldoc/odoc_info.cma \ + ocamldoc/META \ + "$(INSTALL_LIBDIR)/ocamldoc" + $(INSTALL_DATA) \ + $(OCAMLDOC_LIBCMIS) \ + "$(INSTALL_LIBDIR)/ocamldoc" +ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" + $(INSTALL_DATA) \ + $(OCAMLDOC_LIBMLIS) $(OCAMLDOC_LIBCMTS) \ + "$(INSTALL_LIBDIR)/ocamldoc" endif -ifeq "$(WITH_OCAMLDOC)-$(STDLIB_MANPAGES)" "ocamldoc-true" +endif +ifeq "$(build_libraries_manpages)" "true" $(MAKE) -C api_docgen install endif if test -n "$(WITH_DEBUGGER)"; then \ @@ -2059,7 +2576,20 @@ endif $(ocamlopt_CMO_FILES) \ "$(INSTALL_COMPLIBDIR)" ifeq "$(build_ocamldoc)" "true" - $(MAKE) -C ocamldoc installopt + $(MKDIR) "$(INSTALL_LIBDIR)/ocamldoc" + $(INSTALL_PROG) $(OCAMLDOC_OPT) "$(INSTALL_BINDIR)" + $(INSTALL_DATA) \ + $(OCAMLDOC_LIBCMIS) \ + "$(INSTALL_LIBDIR)/ocamldoc" +ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" + $(INSTALL_DATA) \ + $(OCAMLDOC_LIBMLIS) $(OCAMLDOC_LIBCMTS) \ + "$(INSTALL_LIBDIR)/ocamldoc" +endif + $(INSTALL_DATA) \ + ocamldoc/ocamldoc.hva ocamldoc/*.cmx ocamldoc/odoc_info.$(A) \ + ocamldoc/odoc_info.cmxa \ + "$(INSTALL_LIBDIR)/ocamldoc" endif for i in $(OTHERLIBRARIES); do \ $(MAKE) -C otherlibs/$$i installopt || exit $$?; \ @@ -2147,3 +2677,11 @@ config.status: @echo " make install" @echo "should work." @false + +# We need to express that all the CMX files depend on the native compiler, +# so that they get invalidated and rebuilt when the compiler is updated +# This dependency must appear after all the definitions of the +# _SOURCES variable so that GNU make's secondary expansion mechanism works +# This is why this dependency is kept at the very end of this file + +$(ALL_CMX_FILES): ocamlopt$(EXE) diff --git a/Makefile.best_binaries b/Makefile.best_binaries index 4f05f698d15..d77cc1a63a0 100644 --- a/Makefile.best_binaries +++ b/Makefile.best_binaries @@ -57,3 +57,28 @@ BEST_OCAMLDEP := $(strip $(if \ $(call check_not_stale,boot/ocamlc,ocamlc.opt$(EXE)))), \ $(ROOTDIR)/ocamlc.opt$(EXE) -depend, \ $(BOOT_OCAMLC) -depend)) + +OCAMLDOC = $(ROOTDIR)/ocamldoc/ocamldoc$(EXE) +OCAMLDOC_OPT = $(ROOTDIR)/ocamldoc/ocamldoc.opt$(EXE) + +ifeq "$(TARGET)" "$(HOST)" + ifeq "$(SUPPORTS_SHARED_LIBRARIES)" "true" + OCAMLDOC_RUN_BYTE = $(NEW_OCAMLRUN) -I $(ROOTDIR)/otherlibs/unix \ + -I $(ROOTDIR)/otherlibs/str $(OCAMLDOC) + else + # if shared-libraries are not supported, unix.cma and str.cma + # are compiled with -custom, so ocamldoc also uses -custom, + # and (ocamlrun ocamldoc) does not work. + OCAMLDOC_RUN_BYTE = $(OCAMLDOC) + endif +else + OCAMLDOC_RUN_BYTE = $(NEW_OCAMLRUN) $(OCAMLDOC) +endif + +OCAMLDOC_RUN_OPT = $(OCAMLDOC_OPT) + +ifeq "$(wildcard $(OCAMLDOC_OPT))" "" + OCAMLDOC_RUN = $(OCAMLDOC_RUN_BYTE) +else + OCAMLDOC_RUN = $(OCAMLDOC_RUN_OPT) +endif diff --git a/Makefile.build_config.in b/Makefile.build_config.in index ccfb09b4128..6d4442d2dc2 100644 --- a/Makefile.build_config.in +++ b/Makefile.build_config.in @@ -34,6 +34,11 @@ INSTALL_PROG ?= @INSTALL_PROGRAM@ build_ocamldebug = @build_ocamldebug@ build_ocamldoc = @build_ocamldoc@ +build_libraries_manpages = @build_libraries_manpages@ + +OCAMLDOC_TARGET = @ocamldoc_target@ + +OCAMLDOC_OPT_TARGET = @ocamldoc_opt_target@ build_ocamltex = @build_ocamltex@ @@ -151,6 +156,9 @@ runtime_ASM_OBJECTS = $(addprefix runtime/,@runtime_asm_objects@) # Platform-dependent module for ocamlyacc ocamlyacc_WSTR_MODULE = @ocamlyacc_wstr_module@ +# Architecture-specific modules, if any +arch_specific_SOURCES = @arch_specific_SOURCES@ + # ThreadSanitizer support enabled TSAN=@tsan@ # Contains TSan-specific runtime files, or nothing if TSan support is diff --git a/Makefile.common b/Makefile.common index 760318e8301..e753fa8fa3c 100644 --- a/Makefile.common +++ b/Makefile.common @@ -231,7 +231,14 @@ if_file_exists = ( test ! -f $(1) || $(2) && rm -f $(1) ) MERGEMANIFESTEXE = $(call if_file_exists, $(1).manifest, \ mt -nologo -outputresource:$(1) -manifest $(1).manifest) -# Macros and rules to compile OCaml programs +# Macros and rules to compile OCaml programs and libraries + +# The following variable is used to accumulate a list of all the CMX +# files that get built. Is is then used in the root Makefile to express +# the dependency on all these files on the native compiler, so that +# they get rebuilt if the native compiler is updated + +ALL_CMX_FILES = # We use secondary expansion here so that variables like # foo_LIBRARIES and foo_SOURCES can be defined after the calls @@ -240,27 +247,17 @@ MERGEMANIFESTEXE = $(call if_file_exists, $(1).manifest, \ .SECONDEXPANSION: -# Each program foo is characterised by the foo_LIBRARIES and foo_SOURCES -# variables. The following macros provide the infrastructure to build foo -# from the object files whose names are derived from these two -# varialbes. In particular, the following macros define several -# variables whose names are prefixed with foo_ to compute the -# different lists of files used to build foo. - -# The first macro, _OCAML_PROGRAM_BASE, is a private macro (hence the _ at the -# beginning of its name) which defines foo_ variables common to both -# bytecode and native programs. The next two macros, OCAML_BYTECODE_PROGRAM -# and OCAML_NATIVE_PROGRAM are used to define programs that are provided -# only in bytecode or native form, respectively. Programs provided -# in both forms should use OCAML_PROGRAM. +# Definitions that are common to both programs and libraries -define _OCAML_PROGRAM_BASE +define _OCAML_COMMON_BASE $(basename $(notdir $(1)))_C_FILES = \ $$(filter %.c, $$($(basename $(notdir $(1)))_SOURCES)) $(basename $(notdir $(1)))_MLI_FILES = \ $$(filter %.mli, \ $$(subst .mly,.mli,\ $$($(basename $(notdir $(1)))_SOURCES))) +$(basename $(notdir $(1)))_CMI_FILES = \ + $$(subst .mli,.cmi,$$($(basename $(notdir $(1)))_MLI_FILES)) $(basename $(notdir $(1)))_ML_FILES = \ $$(filter %.ml, \ $$(subst .ml.in,.ml,$$(subst .mll,.ml,$$(subst .mly,.ml,\ @@ -280,6 +277,26 @@ beforedepend:: $$$$($(basename $(notdir $(1)))_SECONDARY_FILES) $(basename $(notdir $(1)))_GENERATED_FILES = \ $$($(basename $(notdir $(1)))_SECONDARY_FILES) \ $$(patsubst %.mly,%.output, $$($(basename $(notdir $(1)))_MLY_FILES)) +endef # _OCAML_COMMON_BASE + +# Macros to build OCaml programs + +# Each program foo is characterised by the foo_LIBRARIES and foo_SOURCES +# variables. The following macros provide the infrastructure to build foo +# from the object files whose names are derived from these two +# varialbes. In particular, the following macros define several +# variables whose names are prefixed with foo_ to compute the +# different lists of files used to build foo. + +# The first macro, _OCAML_PROGRAM_BASE, is a private macro (hence the _ at the +# beginning of its name) which defines foo_ variables common to both +# bytecode and native programs. The next two macros, OCAML_BYTECODE_PROGRAM +# and OCAML_NATIVE_PROGRAM are used to define programs that are provided +# only in bytecode or native form, respectively. Programs provided +# in both forms should use OCAML_PROGRAM. + +define _OCAML_PROGRAM_BASE +$(eval $(call _OCAML_COMMON_BASE,$(1))) endef # _OCAML_PROGRAM_BASE LINK_BYTECODE_PROGRAM =\ @@ -323,6 +340,7 @@ $(basename $(notdir $(1)))_NO_FILES = \ $$(patsubst %.c,%.n.$(O), $$($(basename $(notdir $(1)))_C_FILES)) $(basename $(notdir $(1)))_CMX_FILES = \ $$(patsubst %.ml,%.cmx, $$($(basename $(notdir $(1)))_ML_FILES)) +ALL_CMX_FILES += $$($(basename $(notdir $(1)))_CMX_FILES) $(basename $(notdir $(1)))_NCOBJS = \ $$($(basename $(notdir $(1)))_CMXA_FILES) \ $$($(basename $(notdir $(1)))_NO_FILES) \ @@ -343,6 +361,80 @@ $(eval $(call _OCAML_BYTECODE_PROGRAM,$(1))) $(eval $(call _OCAML_NATIVE_PROGRAM,$(1).opt)) endef # OCAML_PROGRAM +# Macros for OCaml libraries, similar to those for OCaml programs + +define _OCAML_LIBRARY_BASE +$(eval $(call _OCAML_COMMON_BASE,$(1))) +endef # _OCAML_LIBRARY_BASE + +LINK_BYTECODE_LIBRARY =\ + $(CAMLC) $(OC_COMMON_LINKFLAGS) $(OC_BYTECODE_LINKFLAGS) + +# The _OCAML_BYTECODE_LIBRARY macro defines a bytecode library but assuming +# that _OCAML_LIBRARY_BASE has already been called. Its public counterpart +# does not rely on this assumption and rather does call _OCAML_LIBRARY_BASE +# itself. + +define _OCAML_BYTECODE_LIBRARY +$(basename $(notdir $(1)))_BYTE_CMI_FILES = \ + $$(foreach F,$$($(basename $(notdir $(1)))_CMI_FILES),\ + $$(if $$(findstring /native/,$$(F)),,$$(F))) +$(basename $(notdir $(1)))_BO_FILES = \ + $$(patsubst %.c,%.b.$(O), $$($(basename $(notdir $(1)))_C_FILES)) +$(basename $(notdir $(1)))_CMO_FILES = \ + $$(patsubst %.ml,%.cmo, \ + $$(foreach F,$$($(basename $(notdir $(1)))_ML_FILES),\ + $$(if $$(findstring /native/,$$(F)),,$$(F)))) +$(basename $(notdir $(1)))_BCOBJS = \ + $$($(basename $(notdir $(1)))_BO_FILES) \ + $$($(basename $(notdir $(1)))_CMO_FILES) +$(1).cma: \ + $$$$($(basename $(notdir $(1)))_BYTE_CMI_FILES) \ + $$$$($(basename $(notdir $(1)))_BCOBJS) + $$(V_LINKC)$$(LINK_BYTECODE_LIBRARY) -a -o $$@ \ + $$($(basename $(notdir $(1)))_BCOBJS) +endef # _OCAML_BYTECODE_LIBRARY + +define OCAML_BYTECODE_LIBRARY +$(eval $(call _OCAML_LIBRARY_BASE,$(1))) +$(eval $(call _OCAML_BYTECODE_LIBRARY,$(1))) +endef # OCAML_BYTECODE_LIBRARY + +LINK_NATIVE_LIBRARY =\ + $(CAMLOPT) $(OC_COMMON_LINKFLAGS) $(OC_NATIVE_LINKFLAGS) + +define _OCAML_NATIVE_LIBRARY +$(basename $(notdir $(1)))_NATIVE_CMI_FILES = \ + $$(foreach F,$$($(basename $(notdir $(1)))_CMI_FILES),\ + $$(if $$(findstring /byte/,$$(F)),,$$(F))) +$(basename $(notdir $(1)))_NO_FILES = \ + $$(patsubst %.c,%.n.$(O), $$($(basename $(notdir $(1)))_C_FILES)) +$(basename $(notdir $(1)))_CMX_FILES = \ + $$(patsubst %.ml,%.cmx, \ + $$(foreach F,$$($(basename $(notdir $(1)))_ML_FILES),\ + $$(if $$(findstring /byte/,$$(F)),,$$(F)))) +ALL_CMX_FILES += $$($(basename $(notdir $(1)))_CMX_FILES) +$(basename $(notdir $(1)))_NCOBJS = \ + $$($(basename $(notdir $(1)))_NO_FILES) \ + $$($(basename $(notdir $(1)))_CMX_FILES) +$(1).cmxa: \ + $$$$($(basename $(notdir $(1)))_NATIVE_CMI_FILES) \ + $$$$($(basename $(notdir $(1)))_NCOBJS) + $$(V_LINKOPT)$$(LINK_NATIVE_LIBRARY) -a -o $$@ \ + $$($(basename $(notdir $(1)))_NCOBJS) +endef # _OCAML_NATIVE_LIBRARY + +define OCAML_NATIVE_LIBRARY +$(eval $(call _OCAML_LIBRARY_BASE,$(1))) +$(eval $(call _OCAML_NATIVE_LIBRARY,$(1))) +endef # OCAML_NATIVE_LIBRARY + +define OCAML_LIBRARY +$(eval $(call _OCAML_LIBRARY_BASE,$(1))) +$(eval $(call _OCAML_BYTECODE_LIBRARY,$(1))) +$(eval $(call _OCAML_NATIVE_LIBRARY,$(1))) +endef # OCAML_LIBRARY + # Installing a bytecode executable, with debug information removed define INSTALL_STRIPPED_BYTE_PROG $(OCAMLRUN) $(ROOTDIR)/tools/stripdebug $(1) $(1).tmp \ diff --git a/Makefile.config.in b/Makefile.config.in index 5940dfa2c45..4c49ad77a5d 100644 --- a/Makefile.config.in +++ b/Makefile.config.in @@ -205,7 +205,6 @@ RUNTIMED=@debug_runtime@ INSTRUMENTED_RUNTIME=@instrumented_runtime@ INSTRUMENTED_RUNTIME_LIBS=@instrumented_runtime_libs@ WITH_DEBUGGER=@with_debugger@ -WITH_OCAMLDOC=@ocamldoc@ WITH_OCAMLTEST=@ocamltest@ ASM_CFI_SUPPORTED=@asm_cfi_supported@ WITH_FRAME_POINTERS=@frame_pointers@ @@ -223,11 +222,15 @@ AFL_INSTRUMENT=@afl@ FLAT_FLOAT_ARRAY=@flat_float_array@ FUNCTION_SECTIONS=@function_sections@ AWK=@AWK@ -STDLIB_MANPAGES=@stdlib_manpages@ NAKED_POINTERS=false # Deprecated variables +## Variables deprecated since OCaml 5.2 + +STDLIB_MANPAGES=@build_libraries_manpages@ +WITH_OCAMLDOC=@with_ocamldoc@ + ## Variables deprecated since OCaml 5.0 UNIXLIB=unix diff --git a/README.adoc b/README.adoc index 2d9438fcdfa..078bd745084 100644 --- a/README.adoc +++ b/README.adoc @@ -71,7 +71,7 @@ compiler currently runs on the following platforms: | x86 64 bits | Linux, macOS, Windows, FreeBSD | NetBSD, OpenBSD, OmniOS (Solaris) | ARM 64 bits | Linux, macOS | FreeBSD, OpenBSD, NetBSD -| Power 64 bits | Linux | +| Power 64 bits | Linux (little-endian, ABIv2) | Linux (big-endian, ABIv2) | RISC-V 64 bits | Linux | | IBM Z (s390x) | Linux | |==== diff --git a/README.win32.adoc b/README.win32.adoc index 3668526efa1..0cff45a2b43 100644 --- a/README.win32.adoc +++ b/README.win32.adoc @@ -118,6 +118,7 @@ Visual C/C++ Compiler as well as the Build Tools for Visual Studio. | Visual Studio 2015 | 19.00.x.x | 32/64-bit | Build Tools for Visual Studio 2015 also provides 32/64-bit compilers | Visual Studio 2017 | 19.10.x.x | 32/64-bit | Build Tools for Visual Studio 2017 also provides 32/64-bit compilers | Visual Studio 2019 | 19.20.x.x | 32/64-bit | Build Tools for Visual Studio 2019 also provides 32/64-bit compilers +| Visual Studio 2022 | 19.37.x.x | 32/64-bit | Build Tools for Visual Studio 2022 also provides 32/64-bit compilers |===== === COMPILATION FROM THE SOURCES @@ -166,11 +167,11 @@ work with OCaml. For Visual Studio 2012 and 2013, both x86 and x64 Command Prompt shortcuts indicate if they are the "Native Tools" or "Cross Tools" versions. Visual Studio -2015 and 2017 make the shortcuts even clearer by including the full name of the -architecture. +2015, 2017, and 2022 make the shortcuts even clearer by including the full name +of the architecture. -The Build Tools for Visual Studio 2015 and 2017 provide shortcuts similar to -the ones of their respective Visual Studio version. +The Build Tools for Visual Studio 2015, 2017, and 2022 provide shortcuts similar +to the ones of their respective Visual Studio version. You cannot at present use a cross-compiler to compile 64-bit OCaml on 32-bit Windows. @@ -179,7 +180,7 @@ Once you have started a Command Prompt, you can verify that you have the compiler you are expecting simply by running: cl - Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x86 + Microsoft (R) C/C++ Optimizing Compiler Version 19.37.32825 for x64 ... You then need to start Cygwin from this Command Prompt. Assuming you have diff --git a/aclocal.m4 b/aclocal.m4 index aefc1112db4..c7b94fed750 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -26,6 +26,7 @@ m4_include([build-aux/ltoptions.m4]) m4_include([build-aux/ltsugar.m4]) m4_include([build-aux/ltversion.m4]) m4_include([build-aux/lt~obsolete.m4]) +m4_include([build-aux/ax_check_compile_flag.m4]) # Macros from the autoconf macro archive m4_include([build-aux/ax_func_which_gethostbyname_r.m4]) diff --git a/api_docgen/ocamldoc/Makefile b/api_docgen/ocamldoc/Makefile index 3821836dcf5..5b1f8946d80 100644 --- a/api_docgen/ocamldoc/Makefile +++ b/api_docgen/ocamldoc/Makefile @@ -15,7 +15,6 @@ # Used by included Makefiles ROOTDIR = ../.. include ../Makefile.common -include ../../ocamldoc/Makefile.best_ocamldoc vpath %.mli ../../stdlib $(DOC_COMPILERLIBS_DIRS) $(DOC_STDLIB_DIRS) diff --git a/appveyor.yml b/appveyor.yml index 333bcad1af8..2c351715cef 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,6 +12,12 @@ #* * #************************************************************************** +branches: + only: + - /4\.*/ + - /5\.*/ + - trunk + # Compile the 64 bits version platform: - x64 @@ -26,7 +32,7 @@ environment: CYG_ROOT: C:/cygwin64 CYG_MIRROR: http://mirrors.kernel.org/sourceware/cygwin/ CYG_CACHE: C:/cygwin64/var/cache/setup - FLEXDLL_VERSION: 0.39 + FLEXDLL_VERSION: 0.43 OCAMLRUNPARAM: v=0,b FORCE_CYGWIN_UPGRADE: 0 BUILD_MODE: world.opt diff --git a/asmcomp/CSEgen.ml b/asmcomp/CSEgen.ml index bb47047ffcf..7d08106d741 100644 --- a/asmcomp/CSEgen.ml +++ b/asmcomp/CSEgen.ml @@ -226,7 +226,10 @@ method class_of_operation op = | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ | Iextcall _ | Iopaque -> assert false (* treated specially *) | Istackoffset _ -> Op_other - | Iload { mutability } -> Op_load mutability + | Iload { mutability; is_atomic } -> + (* #12173: disable CSE for atomic loads. *) + if is_atomic then Op_other + else Op_load mutability | Istore(_,_,asg) -> Op_store asg | Ialloc _ | Ipoll _ -> assert false (* treated specially *) | Iintop(Icheckbound) -> Op_checkbound diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index 09c8b790890..619ce9c3c59 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -864,17 +864,10 @@ let emit_instr env fallthrough i = emit_call "caml_reraise_exn"; record_frame env Reg.Set.empty (Dbg_raise i.dbg) | Lambda.Raise_notrace -> - if Config.tsan then begin - (* TSan requires to signal function exits upon exceptions, - even with [Raise_notrace] *) - emit_call "caml_tsan_raise_notrace_exn"; - record_frame env Reg.Set.empty (Dbg_raise i.dbg) - end else begin - I.mov (domain_field Domainstate.Domain_exn_handler) rsp; - I.pop (domain_field Domainstate.Domain_exn_handler); - I.pop r11; - I.jmp r11 - end + I.mov (domain_field Domainstate.Domain_exn_handler) rsp; + I.pop (domain_field Domainstate.Domain_exn_handler); + I.pop r11; + I.jmp r11 end let rec emit_all env fallthrough i = diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp index 630ff9eaff3..1dbb4b2b1ea 100644 --- a/asmcomp/arm64/emit.mlp +++ b/asmcomp/arm64/emit.mlp @@ -898,10 +898,10 @@ let emit_instr env i = ` smulh {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` | Lop(Iintop op) -> let instr = name_for_int_operation op in - ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` + ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` | Lop(Iintop_imm(op, n)) -> let instr = name_for_int_operation op in - ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, #{emit_int n}\n` + ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, #{emit_int n}\n` | Lop(Ifloatofint | Iintoffloat | Iabsf | Inegf | Ispecific Isqrtf as op) -> let instr = (match op with | Ifloatofint -> "scvtf" diff --git a/asmcomp/asmpackager.ml b/asmcomp/asmpackager.ml index 0c45299f1c8..f480b200697 100644 --- a/asmcomp/asmpackager.ml +++ b/asmcomp/asmpackager.ml @@ -49,8 +49,12 @@ let read_member_info pack_path file = ( let (info, crc) = Compilenv.read_unit_info file in if info.ui_name <> name then raise(Error(Illegal_renaming(name, file, info.ui_name))); - if info.ui_symbol <> - (Compilenv.current_unit_infos()).ui_symbol ^ "." ^ info.ui_name + let expected_symbol = + Printf.sprintf "%s%c%s" + (Compilenv.current_unit_infos()).ui_symbol Compilenv.symbol_separator + info.ui_name + in + if info.ui_symbol <> expected_symbol then raise(Error(Wrong_for_pack(file, pack_path))); Asmlink.check_consistency file info crc; Compilenv.cache_unit_info info; diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index 35af8ebebf6..b0ed9d92450 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -152,7 +152,7 @@ let rec expr_size env = function | Uletrec(bindings, body) -> let env = List.fold_right - (fun (id, exp) env -> V.add (VP.var id) (expr_size env exp) env) + (fun (id, _, exp) env -> V.add (VP.var id) (expr_size env exp) env) bindings env in expr_size env body @@ -222,6 +222,25 @@ let rec expr_size env = function | Uassign _ | Usend _ -> RHS_nonrec | Uunreachable -> RHS_unreachable +let expr_size_of_binding (clas : Value_rec_types.recursive_binding_kind) expr = + match clas with + | Not_recursive | Constant -> RHS_nonrec + | Class -> + (* Actual size is always 4, but [transl_class] only generates + explicit allocations when the classes are actually recursive. + Computing the size means that we don't go through pre-allocation + when the classes are not recursive. *) + expr_size V.empty expr + | Static -> + let result = expr_size V.empty expr in + (* Patching Closure to properly propagate Constant kinds is too complex; + for now, just live with the fact that Static expressions may not always + be statically allocated with Closure. + Forthcoming patches will remove all this logic anyway. *) + if Config.flambda then + assert (result <> RHS_nonrec); + result + (* Translate structured constants to Cmm data items *) let transl_constant dbg = function @@ -575,6 +594,14 @@ let rec transl env e = tag_int (Cop(mk_load_mut Word_int, [field_address (transl env b) dim_ofs dbg], dbg)) dbg + | (Pintcomp _ as comp, + [Uprim(Pcompare_ints, [arg1; arg2], _); + Uconst(Uconst_int 0)]) -> + transl env (Uprim (comp, [arg1; arg2], dbg)) + | (Pintcomp comp, + [Uprim(Pcompare_bints b, [arg1; arg2], _); + Uconst(Uconst_int 0)]) -> + transl env (Uprim (Pbintcomp (b, comp), [arg1; arg2], dbg)) | (p, [arg]) -> transl_prim_1 env p arg dbg | (p, [arg1; arg2]) -> @@ -1425,7 +1452,7 @@ and transl_switch dbg env arg index cases = match Array.length cases with and transl_letrec env bindings cont = let dbg = Debuginfo.none in let bsz = - List.map (fun (id, exp) -> (id, exp, expr_size V.empty exp)) + List.map (fun (id, clas, exp) -> (id, exp, expr_size_of_binding clas exp)) bindings in let op_alloc prim args = diff --git a/asmcomp/emitaux.ml b/asmcomp/emitaux.ml index 0e4a6be1e54..e177e46b0ed 100644 --- a/asmcomp/emitaux.ml +++ b/asmcomp/emitaux.ml @@ -39,9 +39,12 @@ let emit_symbol s = for i = 0 to String.length s - 1 do let c = s.[i] in match c with - 'A'..'Z' | 'a'..'z' | '0'..'9' | '_' | '.' -> + 'A'..'Z' | 'a'..'z' | '0'..'9' | '_' -> output_char !output_channel c | _ -> + if c = Compilenv.symbol_separator then + output_char !output_channel c + else Printf.fprintf !output_channel "$%02x" (Char.code c) done diff --git a/asmcomp/emitenv.mli b/asmcomp/emitenv.mli index c618f3ee726..fcd2c57db6e 100644 --- a/asmcomp/emitenv.mli +++ b/asmcomp/emitenv.mli @@ -72,8 +72,7 @@ type per_function_env = { mutable call_gc_sites : gc_call list; (* used in all targets except power *) mutable call_gc_label : label; (* used only in power *) mutable bound_error_sites : bound_error_call list; - (* used in all targets except power *) - mutable bound_error_call : label option; (* used in amd64,s390x *) + mutable bound_error_call : label option; (* used in amd64,power,s390x *) (* record jump tables (for PPC64). In order to reduce the size of the TOC, we concatenate all jumptables and emit them at the end of the function. *) diff --git a/asmcomp/power/arch.ml b/asmcomp/power/arch.ml index f0662236396..649618f6cc9 100644 --- a/asmcomp/power/arch.ml +++ b/asmcomp/power/arch.ml @@ -33,6 +33,10 @@ type specific_operation = | Ialloc_far of (* allocation in large functions *) { bytes : int; dbginfo : Debuginfo.alloc_dbginfo } | Ipoll_far of { return_label : cmm_label option } + (* poll point in large functions *) + | Icheckbound_far (* bounds check in large functions *) + | Icheckbound_imm_far of int (* bounds check in large functions, + constant 2nd arg (the index) *) (* Addressing modes *) @@ -43,7 +47,11 @@ type addressing_mode = (* Sizes, endianness *) -let big_endian = false (* ppc64le only *) +let big_endian = + match Config.model with + | "ppc64" -> true + | "ppc64le" -> false + | _ -> assert false let size_addr = 8 let size_int = size_addr let size_float = 8 @@ -94,15 +102,25 @@ let print_specific_operation printreg op ppf arg = fprintf ppf "alloc_far %d" bytes | Ipoll_far _ -> fprintf ppf "poll_far" + | Icheckbound_far -> + fprintf ppf "check_far > %a %a" printreg arg.(0) printreg arg.(1) + | Icheckbound_imm_far n -> + fprintf ppf "check_far > %a %d" printreg arg.(0) n (* Specific operations that are pure *) let operation_is_pure = function - | Ialloc_far _ | Ipoll_far _ -> false + | Ialloc_far _ + | Ipoll_far _ + | Icheckbound_far + | Icheckbound_imm_far _ -> false | _ -> true (* Specific operations that can raise *) let operation_can_raise = function - | Ialloc_far _ | Ipoll_far _ -> true + | Ialloc_far _ + | Ipoll_far _ + | Icheckbound_far + | Icheckbound_imm_far _ -> true | _ -> false diff --git a/asmcomp/power/arch.mli b/asmcomp/power/arch.mli index 9931722feff..a4a619a9561 100644 --- a/asmcomp/power/arch.mli +++ b/asmcomp/power/arch.mli @@ -31,6 +31,9 @@ type specific_operation = | Ialloc_far of (* allocation in large functions *) { bytes : int; dbginfo : Debuginfo.alloc_dbginfo } | Ipoll_far of { return_label : cmm_label option } + (* poll point in large functions *) + | Icheckbound_far (* bounds check in large functions *) + | Icheckbound_imm_far of int (* bounds check in large functions *) (* Addressing modes *) diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp index 6630728a372..9d758293384 100644 --- a/asmcomp/power/emit.mlp +++ b/asmcomp/power/emit.mlp @@ -31,9 +31,12 @@ let reserved_stack_space = 32 (* Layout of the stack. The stack is kept 16-aligned. *) let initial_stack_offset f = - reserved_stack_space + (* Including the return address *) - size_int * f.fun_num_stack_slots.(0) + (* Local int variables *) - size_float * f.fun_num_stack_slots.(1) (* Local float variables *) + if f.fun_frame_required then + reserved_stack_space + (* Including the return address *) + size_int * f.fun_num_stack_slots.(0) + (* Local int variables *) + size_float * f.fun_num_stack_slots.(1) (* Local float variables *) + else + 0 let frame_size env = let size = @@ -271,7 +274,7 @@ let adjust_stack_offset env delta = (* Record live pointers at call points *) -let record_frame env live dbg = +let record_frame_label env live dbg = let lbl = new_label() in let live_offset = ref [] in Reg.Set.iter @@ -286,6 +289,10 @@ let record_frame env live dbg = live; record_frame_descr ~label:lbl ~frame_size:(frame_size env) ~live_offset:!live_offset dbg; + lbl + +let record_frame env live dbg = + let lbl = record_frame_label env live dbg in `{emit_label lbl}:\n` (* Names for conditional branches after comparisons *) @@ -359,8 +366,11 @@ module BR = Branch_relaxation.Make (struct let classify_instr = function | Lop (Ialloc _) | Lop (Ipoll _) - (* [Ialloc_far] does not need to be here, since its code sequence - never involves any conditional branches that might need relaxing. *) + | Lop (Iintop Icheckbound) + | Lop (Iintop_imm (Icheckbound, _)) + (* The various "far" variants in [specific_operation] don't need to + return [Some] here, since their code sequences never contain any + conditional branches that might need relaxing. *) | Lcondbranch _ | Lcondbranch3 _ -> Some Branch | _ -> None @@ -368,12 +378,8 @@ module BR = Branch_relaxation.Make (struct let offset_pc_at_branch = 1 - let profiling_prologue_size = 6 - let prologue_size f = - profiling_prologue_size - + (if initial_stack_offset f > 0 then 1 else 0) - + (if f.fun_frame_required then 3 else 0) + if f.fun_frame_required then 4 else 0 let tocload_size = 2 @@ -427,9 +433,13 @@ module BR = Branch_relaxation.Make (struct | Lop(Ispecific(Ipoll_far { return_label = None } )) -> 4 | Lop(Iintop Imod) -> 3 | Lop(Iintop(Icomp _)) -> 4 + | Lop(Iintop(Icheckbound)) -> 2 + | Lop(Ispecific(Icheckbound_far)) -> 3 | Lop(Icompf _) -> 5 | Lop(Iintop _) -> 1 | Lop(Iintop_imm(Icomp _, _)) -> 4 + | Lop(Iintop_imm(Icheckbound, _)) -> 2 + | Lop(Ispecific(Icheckbound_imm_far _)) -> 3 | Lop(Iintop_imm _) -> 1 | Lop(Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf) -> 1 | Lop(Ifloatofint) -> 9 @@ -464,11 +474,15 @@ module BR = Branch_relaxation.Make (struct let relax_poll ~return_label = Lop (Ispecific (Ipoll_far { return_label })) + let relax_intop_checkbound () = + Lop (Ispecific (Icheckbound_far)) + + let relax_intop_imm_checkbound ~bound = + Lop (Ispecific (Icheckbound_imm_far bound)) + (* [classify_addr], above, never identifies these instructions as needing relaxing. As such, these functions should never be called. *) let relax_specific_op _ = assert false - let relax_intop_checkbound () = assert false - let relax_intop_imm_checkbound ~bound:_ = assert false end) (* Assembly code for inlined allocation *) @@ -477,7 +491,7 @@ let emit_alloc env i bytes dbginfo far = if env.call_gc_label = 0 then env.call_gc_label <- new_label (); let offset = Domainstate.(idx_of_field Domain_young_limit) * 8 in ` ld 0, {emit_int offset}(30)\n`; - ` addi 31, 31, {emit_int(-bytes)}\n`; + ` addi 31, 31, {emit_int(-bytes)}\n`; ` cmpld 31, 0\n`; if not far then begin ` bltl- {emit_label env.call_gc_label}\n`; @@ -505,9 +519,9 @@ let emit_poll env i return_label far = end | Some return_label -> begin - ` bltl- {emit_label env.call_gc_label}\n`; + ` bltl- {emit_label env.call_gc_label}\n`; record_frame env i.live (Dbg_alloc []); - ` b {emit_label return_label}\n` + ` b {emit_label return_label}\n` end end; end else begin @@ -515,12 +529,41 @@ let emit_poll env i return_label far = ` bge+ {emit_label lbl}\n`; ` bl {emit_label env.call_gc_label}\n`; record_frame env i.live (Dbg_alloc []); - ` {emit_label lbl}: \n`; + `{emit_label lbl}: \n`; match return_label with | None -> () - | Some return_label -> ` b {emit_label return_label}\n` + | Some return_label -> ` b {emit_label return_label}\n` + end + +let bound_error_label env dbg = + if !Clflags.debug then begin + let lbl_bound_error = new_label() in + let lbl_frame = record_frame_label env Reg.Set.empty (Dbg_other dbg) in + env.bound_error_sites <- + { bd_lbl = lbl_bound_error; + bd_frame = lbl_frame; } :: env.bound_error_sites; + lbl_bound_error + end else begin + match env.bound_error_call with + | None -> + let lbl = new_label() in + env.bound_error_call <- Some lbl; + lbl + | Some lbl -> lbl end +let emit_call_bound_error bd = + `{emit_label bd.bd_lbl}:`; emit_call "caml_ml_array_bound_error"; + `{emit_label bd.bd_frame}:`; emit_call_nop() + +let emit_call_bound_errors env = + List.iter emit_call_bound_error env.bound_error_sites; + match env.bound_error_call with + | None -> () + | Some lbl -> + `{emit_label lbl}:`; emit_call "caml_ml_array_bound_error"; + emit_call_nop() + (* Output the assembly code for an instruction *) let emit_instr env i = @@ -733,9 +776,16 @@ let emit_instr env i = let (bitnum, negated) = emit_float_comp cmp i.arg in emit_extract_crbit bitnum negated i.res.(0) | Lop(Iintop (Icheckbound)) -> - if !Clflags.debug then - record_frame env Reg.Set.empty (Dbg_other i.dbg); - ` tdlle {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` + let lbl = bound_error_label env i.dbg in + ` cmpld {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; + ` ble- {emit_label lbl}\n` + | Lop(Ispecific (Icheckbound_far)) -> + let lbl_err = bound_error_label env i.dbg in + let lbl_next = new_label() in + ` cmpld {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; + ` bgt+ {emit_label lbl_next}\n`; + ` b {emit_label lbl_err}\n`; + `{emit_label lbl_next}:\n` | Lop(Iintop op) -> let instr = name_for_intop op in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` @@ -751,9 +801,16 @@ let emit_instr env i = emit_set_comp c i.res.(0) end | Lop(Iintop_imm(Icheckbound, n)) -> - if !Clflags.debug then - record_frame env Reg.Set.empty (Dbg_other i.dbg); - ` tdllei {emit_reg i.arg.(0)}, {emit_int n}\n` + let lbl = bound_error_label env i.dbg in + ` cmpldi {emit_reg i.arg.(0)}, {emit_int n}\n`; + ` ble- {emit_label lbl}\n` + | Lop(Ispecific(Icheckbound_imm_far n)) -> + let lbl_err = bound_error_label env i.dbg in + let lbl_next = new_label() in + ` cmpldi {emit_reg i.arg.(0)}, {emit_int n}\n`; + ` bgt+ {emit_label lbl_next}\n`; + ` b {emit_label lbl_err}\n`; + `{emit_label lbl_next}:\n` | Lop(Iintop_imm(op, n)) -> let instr = name_for_intop_imm op in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_int n}\n` @@ -780,7 +837,7 @@ let emit_instr env i = ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}\n` | Lop (Idls_get) -> let offset = Domainstate.(idx_of_field Domain_dls_root) * 8 in - ` ld {emit_reg i.res.(0)}, {emit_int offset}(30)\n` + ` ld {emit_reg i.res.(0)}, {emit_int offset}(30)\n` | Lop (Ireturn_addr) -> invalid_arg ( "Support for Ireturn_addr is not implemented on architecture " @@ -867,7 +924,7 @@ let emit_instr env i = adjust_stack_offset env trap_size; ` std 29, {emit_int reserved_stack_space}(1)\n`; emit_tocload emit_gpr 29 (TocLabel lbl_handler); - ` std 29, {emit_int (reserved_stack_space + 8)}(1)\n`; + ` std 29, {emit_int (reserved_stack_space + 8)}(1)\n`; ` addi 29, 1, {emit_int reserved_stack_space}\n` | Lpoptrap -> ` ld 29, {emit_int reserved_stack_space}(1)\n`; @@ -886,7 +943,7 @@ let emit_instr env i = | Lambda.Raise_notrace -> ` ld 0, 8(29)\n`; ` addi 1, 29, {emit_int (trap_size - reserved_stack_space)}\n`; - ` mtctr 0\n`; + ` mtctr 0\n`; ` ld 29, {emit_int (reserved_stack_space - trap_size)}(1)\n`; ` bctr\n` end @@ -898,6 +955,35 @@ let rec emit_all env i = | Lend -> () | _ -> emit_instr env i; emit_all env i.next +(* On this target, the possible "out of line" code blocks are: + - a single "call GC" point, which comes immediately after the + function's body; + - zero, one or several "call bound error" point, which comes just after. +*) + +let max_out_of_line_code_offset fundecl = + let rec num_checkbounds count instr = + match instr.desc with + | Lend -> count + | Lop (Iintop Icheckbound) + | Lop (Iintop_imm (Icheckbound, _)) -> + num_checkbounds (count + 1) instr.next + (* The following two should never be seen, since this function is run + before branch relaxation. *) + | Lop (Ispecific Icheckbound_far) + | Lop (Ispecific (Icheckbound_imm_far _)) -> assert false + | _ -> num_checkbounds count instr.next in + let num_chk = num_checkbounds 0 fundecl.fun_body in + (* This is what the end of the function looks like: + - offset 0: call GC point (5 insn) + - offset 5: first (or only if not !Clflags.debug) call bound error + (2 insns) + - offsets 7, 9, .. : second, third, ..., call bound error + (2 insns each) *) + if num_chk = 0 then 0 + else if !Clflags.debug then 5 + (num_chk - 1) * 2 + else 5 + (* Emission of a function declaration *) let fundecl fundecl = @@ -943,10 +1029,8 @@ let fundecl fundecl = ` ble- {emit_label overflow}\n`; `{emit_label ret}:\n` end; - (* On this target, there is at most one "out of line" code block per - function: a single "call GC" point. It comes immediately after the - function's body. *) - BR.relax fundecl ~max_out_of_line_code_offset:0; + BR.relax fundecl + ~max_out_of_line_code_offset: (max_out_of_line_code_offset fundecl); emit_all env fundecl.fun_body; (* Emit the glue code to call the GC *) if env.call_gc_label > 0 then begin @@ -957,6 +1041,8 @@ let fundecl fundecl = ` mtctr 12\n`; ` bctr\n` end; + (* Emit the glue code to handle bound errors *) + emit_call_bound_errors env; cfi_endproc(); ` .size {emit_symbol fundecl.fun_name}, . - {emit_symbol fundecl.fun_name}\n`; (* Emit the numeric literals *) diff --git a/asmcomp/power/stackframe.ml b/asmcomp/power/stackframe.ml index 0d7398e4cf6..d165a2078cf 100644 --- a/asmcomp/power/stackframe.ml +++ b/asmcomp/power/stackframe.ml @@ -24,8 +24,6 @@ class stackframe = object inherit Stackframegen.stackframe_generic -method! frame_required _f _contains_calls = true - method trap_handler_size = trap_handler_size end diff --git a/asmcomp/riscv/emit.mlp b/asmcomp/riscv/emit.mlp index 01d4b5d7178..545e7013705 100644 --- a/asmcomp/riscv/emit.mlp +++ b/asmcomp/riscv/emit.mlp @@ -99,10 +99,10 @@ let emit_reg r = let emit_stack_adjustment n = if n <> 0 then begin if is_immediate n then - ` addi sp, sp, {emit_int n}\n` + ` addi sp, sp, {emit_int n}\n` else begin - ` li {emit_reg reg_tmp}, {emit_int n}\n`; - ` add sp, sp, {emit_reg reg_tmp}\n` + ` li {emit_reg reg_tmp}, {emit_int n}\n`; + ` add sp, sp, {emit_reg reg_tmp}\n` end; cfi_adjust_cfa_offset (-n) end @@ -274,7 +274,7 @@ let emit_instr env i = if src.loc <> dst.loc then begin match (src, dst) with | {loc = Reg _; typ = (Val | Int | Addr)}, {loc = Reg _} -> - ` mv {emit_reg dst}, {emit_reg src}\n` + ` mv {emit_reg dst}, {emit_reg src}\n` | {loc = Reg _; typ = Float}, {loc = Reg _; typ = Float} -> ` fmv.d {emit_reg dst}, {emit_reg src}\n` | {loc = Reg _; typ = Float}, {loc = Reg _; typ = (Val | Int | Addr)} -> @@ -431,8 +431,8 @@ let emit_instr env i = begin match return_label with | None -> ` bltu {emit_reg reg_alloc_ptr}, {emit_reg reg_tmp}, {emit_label lbl_call_gc}\n`; `{emit_label lbl_after_poll}:\n`; - | Some lbl -> ` bgeu {emit_reg reg_alloc_ptr}, {emit_reg reg_tmp}, {emit_label lbl}\n`; - ` j {emit_label lbl_call_gc}\n` + | Some lbl -> ` bgeu {emit_reg reg_alloc_ptr}, {emit_reg reg_tmp}, {emit_label lbl}\n`; + ` j {emit_label lbl_call_gc}\n` end; env.call_gc_sites <- { gc_lbl = lbl_call_gc; diff --git a/asmcomp/s390x/emit.mlp b/asmcomp/s390x/emit.mlp index e72f2ba97da..dae5920fe60 100644 --- a/asmcomp/s390x/emit.mlp +++ b/asmcomp/s390x/emit.mlp @@ -367,8 +367,8 @@ let emit_instr env i = | Lop(Iextcall {func; alloc; stack_ofs}) -> if stack_ofs > 0 then begin - ` lgr {emit_reg reg_stack_arg_begin}, %r15\n`; - ` lay {emit_reg reg_stack_arg_end}, {emit_int stack_ofs}(%r15)\n`; + ` lgr {emit_reg reg_stack_arg_begin}, %r15\n`; + ` lay {emit_reg reg_stack_arg_end}, {emit_int stack_ofs}(%r15)\n`; emit_load_symbol_addr reg_r7 func; emit_call "caml_c_call_stack_args"; `{record_frame env i.live (Dbg_other i.dbg)}\n` @@ -378,16 +378,16 @@ let emit_instr env i = `{record_frame env i.live (Dbg_other i.dbg)}\n` end else begin (* Save OCaml SP in C callee-save register *) - ` lgr %r12, %r15\n`; + ` lgr %r12, %r15\n`; cfi_remember_state (); cfi_def_cfa_register "%r12"; (* NB: gdb has asserts on contiguous stacks that mean it will not unwind through this unless we were to tag this calling frame with cfi_signal_frame in it's definition. *) let offset = Domainstate.(idx_of_field Domain_c_stack) * 8 in - ` lg %r15, {emit_int offset}(%r10)\n`; + ` lg %r15, {emit_int offset}(%r10)\n`; emit_call func; - ` lgr %r15, %r12\n`; + ` lgr %r15, %r12\n`; cfi_restore_state () end @@ -431,11 +431,11 @@ let emit_instr env i = let lbl_after_alloc = new_label () in let lbl_call_gc = new_label () in let offset = Domainstate.(idx_of_field Domain_young_limit) * 8 in - ` lay %r11, {emit_int(-n)}(%r11)\n`; + ` lay %r11, {emit_int(-n)}(%r11)\n`; ` clg %r11, {emit_int offset}(%r10)\n`; - ` brcl 4, {emit_label lbl_call_gc}\n`; (* less than *) + ` brcl 4, {emit_label lbl_call_gc}\n`; (* less than *) `{emit_label lbl_after_alloc}:`; - ` la {emit_reg i.res.(0)}, 8(%r11)\n`; + ` la {emit_reg i.res.(0)}, 8(%r11)\n`; env.call_gc_sites <- { gc_lbl = lbl_call_gc; gc_return_lbl = lbl_after_alloc; @@ -446,11 +446,11 @@ let emit_instr env i = | 24 -> ` {emit_call "caml_alloc2"}\n` | 32 -> ` {emit_call "caml_alloc3"}\n` | _ -> - ` lay %r11, {emit_int(-n)}(%r11)\n`; + ` lay %r11, {emit_int(-n)}(%r11)\n`; ` {emit_call "caml_allocN"}\n` end; `{emit_label lbl_frame_lbl}:\n`; - ` la {emit_reg i.res.(0)}, 8(%r11)\n` + ` la {emit_reg i.res.(0)}, 8(%r11)\n` end | Lop(Ipoll { return_label }) -> @@ -464,8 +464,8 @@ let emit_instr env i = record_frame_label env i.live (Dbg_alloc []) in begin match return_label with - | None -> ` brcl 4, {emit_label lbl_call_gc}\n`; (* less than *) - | Some return_label -> ` brcl 10, {emit_label return_label}\n`; (* greater or equal *) + | None -> ` brcl 4, {emit_label lbl_call_gc}\n`; (* less than *) + | Some return_label -> ` brcl 10, {emit_label return_label}\n`; (* greater or equal *) end; env.call_gc_sites <- { gc_lbl = lbl_call_gc; @@ -473,7 +473,7 @@ let emit_instr env i = gc_frame_lbl = lbl_frame; } :: env.call_gc_sites; begin match return_label with | None -> `{emit_label label_after_gc}:`; - | Some _ -> ` brcl 15, {emit_label lbl_call_gc}\n`; (* unconditional *) + | Some _ -> ` brcl 15, {emit_label lbl_call_gc}\n`; (* unconditional *) end | Lop(Iintop Imulh) -> (* Hacker's Delight section 8.3: @@ -731,9 +731,9 @@ let fundecl fundecl = let threshold_offset = Domainstate.stack_ctx_words * 8 + stack_threshold_size in let f = max_frame_size + threshold_offset in let offset = Domainstate.(idx_of_field Domain_current_stack) * 8 in - ` lay %r1, {emit_int (-f)}(%r15)\n`; - ` clg %r1, {emit_int offset}(%r10)\n`; - ` brcl 4, {emit_label overflow}\n`; + ` lay %r1, {emit_int (-f)}(%r15)\n`; + ` clg %r1, {emit_int offset}(%r10)\n`; + ` brcl 4, {emit_label overflow}\n`; `{emit_label ret}:\n`; handle_overflow := Some (overflow, ret); end; @@ -749,13 +749,13 @@ let fundecl fundecl = | Some (overflow,ret) -> begin `{emit_label overflow}:\n`; let s = (Config.stack_threshold + max_frame_size / 8) in - ` lay %r15, -8(%r15)\n`; - ` stg %r14, 0(%r15)\n`; - ` lgfi %r12, {emit_int s}\n`; - ` brasl %r14, {emit_symbol "caml_call_realloc_stack"}\n`; - ` lg %r14, 0(%r15)\n`; - ` la %r15, 8(%r15)\n`; - ` brcl 15, {emit_label ret}\n` + ` lay %r15, -8(%r15)\n`; + ` stg %r14, 0(%r15)\n`; + ` lgfi %r12, {emit_int s}\n`; + ` brasl %r14, {emit_symbol "caml_call_realloc_stack"}\n`; + ` lg %r14, 0(%r15)\n`; + ` la %r15, 8(%r15)\n`; + ` brcl 15, {emit_label ret}\n` end end; diff --git a/asmcomp/schedgen.ml b/asmcomp/schedgen.ml index bd3d38013ae..e36f6bfe30d 100644 --- a/asmcomp/schedgen.ml +++ b/asmcomp/schedgen.ml @@ -21,15 +21,16 @@ open Linear (* Representation of the code DAG. *) -type code_dag_node = - { instr: instruction; (* The instruction *) +type code_dag_node = { + instr: instruction; (* The instruction *) delay: int; (* How many cycles before result is available *) mutable sons: (code_dag_node * int) list; (* Instructions that depend on it *) mutable date: int; (* Start date *) mutable length: int; (* Length of longest path to result *) mutable ancestors: int; (* Number of ancestors *) - mutable emitted_ancestors: int } (* Number of emitted ancestors *) + mutable emitted_ancestors: int (* Number of emitted ancestors *) + } let dummy_node = { instr = end_instr; delay = 0; sons = []; date = 0; @@ -44,18 +45,22 @@ let dummy_node = - code_checkbounds contains the latest checkbound node not matched by a subsequent load or store. *) -let code_results = (Hashtbl.create 31 : (location, code_dag_node) Hashtbl.t) -let code_uses = (Hashtbl.create 31 : (location, code_dag_node) Hashtbl.t) -let code_stores = ref ([] : code_dag_node list) -let code_loads = ref ([] : code_dag_node list) -let code_checkbounds = ref ([] : code_dag_node list) - -let clear_code_dag () = - Hashtbl.clear code_results; - Hashtbl.clear code_uses; - code_stores := []; - code_loads := []; - code_checkbounds := [] +type code_dag = { + results : (location, code_dag_node) Hashtbl.t; + uses : (location, code_dag_node) Hashtbl.t; + mutable stores : code_dag_node list; + mutable loads : code_dag_node list; + mutable checkbounds : code_dag_node list; + } + +let empty_dag () = + { + results = Hashtbl.create 31; + uses = Hashtbl.create 31; + stores = []; + loads = []; + checkbounds = []; + } (* Add an edge to the code DAG *) @@ -68,9 +73,9 @@ let add_edge_after son ancestor = add_edge ancestor son 0 (* Add edges from all instructions that define a pseudoregister [arg] being used as argument to node [node] (RAW dependencies *) -let add_RAW_dependencies node arg = +let add_RAW_dependencies t node arg = try - let ancestor = Hashtbl.find code_results arg.loc in + let ancestor = Hashtbl.find t.results arg.loc in add_edge ancestor node ancestor.delay with Not_found -> () @@ -78,16 +83,16 @@ let add_RAW_dependencies node arg = (* Add edges from all instructions that use a pseudoregister [res] that is defined by node [node] (WAR dependencies). *) -let add_WAR_dependencies node res = - let ancestors = Hashtbl.find_all code_uses res.loc in +let add_WAR_dependencies t node res = + let ancestors = Hashtbl.find_all t.uses res.loc in List.iter (add_edge_after node) ancestors (* Add edges from all instructions that have already defined a pseudoregister [res] that is defined by node [node] (WAW dependencies). *) -let add_WAW_dependencies node res = +let add_WAW_dependencies t node res = try - let ancestor = Hashtbl.find code_results res.loc in + let ancestor = Hashtbl.find t.results res.loc in add_edge ancestor node 0 with Not_found -> () @@ -146,8 +151,6 @@ let some_load = class virtual scheduler_generic = object (self) -val mutable trywith_nesting = 0 - (* Determine whether an operation ends a basic block or not. Can be overridden for some processors to signal specific instructions that terminate a basic block. *) @@ -256,7 +259,7 @@ method private destroyed_by_instr instr = (* Add an instruction to the code dag *) -method private add_instruction ready_queue instr = +method private add_instruction t ready_queue instr = let delay = self#instr_latency instr in let destroyed = self#destroyed_by_instr instr in let node = @@ -269,50 +272,50 @@ method private add_instruction ready_queue instr = emitted_ancestors = 0 } in (* Add edges from all instructions that define one of the registers used (RAW dependencies) *) - Array.iter (add_RAW_dependencies node) instr.arg; + Array.iter (add_RAW_dependencies t node) instr.arg; (* Also add edges from all instructions that use one of the result regs of this instruction, or a reg destroyed by this instruction (WAR dependencies). *) - Array.iter (add_WAR_dependencies node) instr.res; - Array.iter (add_WAR_dependencies node) destroyed; (* PR#5731 *) + Array.iter (add_WAR_dependencies t node) instr.res; + Array.iter (add_WAR_dependencies t node) destroyed; (* PR#5731 *) (* Also add edges from all instructions that have already defined one of the results of this instruction, or a reg destroyed by this instruction (WAW dependencies). *) - Array.iter (add_WAW_dependencies node) instr.res; - Array.iter (add_WAW_dependencies node) destroyed; (* PR#5731 *) + Array.iter (add_WAW_dependencies t node) instr.res; + Array.iter (add_WAW_dependencies t node) destroyed; (* PR#5731 *) (* If this is a load, add edges from the most recent store viewed so far (if any) and remember the load. Also add edges from the most recent checkbound and forget that checkbound. *) if self#instr_is_load instr then begin - List.iter (add_edge_after node) !code_stores; - code_loads := node :: !code_loads; - List.iter (add_edge_after node) !code_checkbounds; - code_checkbounds := [] + List.iter (add_edge_after node) t.stores; + t.loads <- node :: t.loads; + List.iter (add_edge_after node) t.checkbounds; + t.checkbounds <- [] end (* If this is a store, add edges from the most recent store, as well as all loads viewed since then, and also the most recent checkbound. Remember the store, discarding the previous stores, loads and checkbounds. *) else if self#instr_is_store instr then begin - List.iter (add_edge_after node) !code_stores; - List.iter (add_edge_after node) !code_loads; - List.iter (add_edge_after node) !code_checkbounds; - code_stores := [node]; - code_loads := []; - code_checkbounds := [] + List.iter (add_edge_after node) t.stores; + List.iter (add_edge_after node) t.loads; + List.iter (add_edge_after node) t.checkbounds; + t.stores <- [node]; + t.loads <- []; + t.checkbounds <- [] end else if self#instr_is_checkbound instr then begin - code_checkbounds := [node] + t.checkbounds <- [node] end; (* Remember the registers used and produced by this instruction *) for i = 0 to Array.length instr.res - 1 do - Hashtbl.add code_results instr.res.(i).loc node + Hashtbl.add t.results instr.res.(i).loc node done; for i = 0 to Array.length destroyed - 1 do - Hashtbl.add code_results destroyed.(i).loc node (* PR#5731 *) + Hashtbl.add t.results destroyed.(i).loc node (* PR#5731 *) done; for i = 0 to Array.length instr.arg - 1 do - Hashtbl.add code_uses instr.arg.(i).loc node + Hashtbl.add t.uses instr.arg.(i).loc node done; (* If this is a root instruction (all arguments already computed), add it to the ready queue *) @@ -375,14 +378,13 @@ method schedule_fundecl f = | Lpoptrap -> { i with next = schedule i.next (try_nesting - 1) } | _ -> if self#instr_in_basic_block i try_nesting then begin - clear_code_dag(); - schedule_block [] i try_nesting + schedule_block (empty_dag ()) [] i try_nesting end else { i with next = schedule i.next try_nesting } - and schedule_block ready_queue i try_nesting = + and schedule_block t ready_queue i try_nesting = if self#instr_in_basic_block i try_nesting then - schedule_block (self#add_instruction ready_queue i) i.next try_nesting + schedule_block t (self#add_instruction t ready_queue i) i.next try_nesting else begin let critical_outputs = match i.desc with @@ -396,11 +398,8 @@ method schedule_fundecl f = if f.fun_fast && !Clflags.insn_sched then begin let new_body = schedule f.fun_body 0 in - clear_code_dag(); { f with fun_body = new_body } end else f end - -let reset () = clear_code_dag () diff --git a/asmcomp/schedgen.mli b/asmcomp/schedgen.mli index 3f2ea61f368..80df1c05c24 100644 --- a/asmcomp/schedgen.mli +++ b/asmcomp/schedgen.mli @@ -46,5 +46,3 @@ class virtual scheduler_generic : object (* Entry point *) method schedule_fundecl : Linear.fundecl -> Linear.fundecl end - -val reset : unit -> unit diff --git a/asmcomp/thread_sanitizer.ml b/asmcomp/thread_sanitizer.ml index d05666d93ae..fa1fbf7fcc4 100644 --- a/asmcomp/thread_sanitizer.ml +++ b/asmcomp/thread_sanitizer.ml @@ -240,12 +240,22 @@ let instrument body = | Cop ((Cload { mutability = Immutable; _ } as op), es, dbg_none) -> (* Loads of immutable location require no instrumentation *) Cop (op, List.map aux es, dbg_none) + | Cop (Craise _, _, _) as raise -> + (* Call a routine that will call [__tsan_func_exit] for every function + about to be exited due to the exception *) + Csequence + (Cmm_helpers.return_unit dbg_none + (Cop (Capply typ_int, + [Cconst_symbol ("caml_tsan_exit_on_raise_asm", dbg_none); + Cconst_int (0, dbg_none)], + dbg_none)), + raise) | Cop ( (( Capply _ | Caddi | Calloc | Csubi | Cmuli | Cmulhi | Cdivi | Cmodi | Cand | Cor | Cxor | Clsl | Clsr | Casr | Caddv | Cadda | Cnegf | Cabsf | Caddf | Csubf | Cmulf | Cdivf | Cfloatofint | Cintoffloat | Ccheckbound | Copaque | Cdls_get | Cextcall _ | Ccmpi _ | Ccmpa _ - | Ccmpf _ | Craise _ ) as op), + | Ccmpf _ ) as op), es, dbg_none ) -> Cop (op, List.map aux es, dbg_none) diff --git a/asmcomp/x86_proc.ml b/asmcomp/x86_proc.ml index 8450c3e7984..b7abe4d3d1c 100644 --- a/asmcomp/x86_proc.ml +++ b/asmcomp/x86_proc.ml @@ -71,22 +71,25 @@ let string_of_string_literal s = Buffer.contents b let string_of_symbol prefix s = - let spec = ref false in - for i = 0 to String.length s - 1 do - match String.unsafe_get s i with - | 'A'..'Z' | 'a'..'z' | '0'..'9' | '_' | '.' -> () - | _ -> spec := true; - done; - if not !spec then if prefix = "" then s else prefix ^ s + let is_special_char = function + | 'A'..'Z' | 'a'..'z' | '0'..'9' | '_' -> false + | c -> c <> Compilenv.symbol_separator + in + let spec = String.exists is_special_char s in + if not spec then if prefix = "" then s else prefix ^ s else let b = Buffer.create (String.length s + 10) in Buffer.add_string b prefix; String.iter - (function - | ('A'..'Z' | 'a'..'z' | '0'..'9' | '_' | '.') as c -> - Buffer.add_char b c - | c -> - Printf.bprintf b "$%02x" (Char.code c) + (fun c -> + (* FIXME: using $ to prefix escaped characters can make names + ambiguous if the symbol separator is also set to $; a different + escape prefix should be used in this case, if this ever causes + problems in the real world. *) + if is_special_char c then + Printf.bprintf b "$%02x" (Char.code c) + else + Buffer.add_char b c ) s; Buffer.contents b diff --git a/boot/menhir/parser.ml b/boot/menhir/parser.ml index 43c2a51043d..c31d5f98e27 100644 --- a/boot/menhir/parser.ml +++ b/boot/menhir/parser.ml @@ -16,7 +16,7 @@ module MenhirBasics = struct | VAL | UNDERSCORE | UIDENT of ( -# 825 "parsing/parser.mly" +# 829 "parsing/parser.mly" (string) # 22 "parsing/parser.ml" ) @@ -28,7 +28,7 @@ module MenhirBasics = struct | THEN | STRUCT | STRING of ( -# 812 "parsing/parser.mly" +# 816 "parsing/parser.mly" (string * Location.t * string option) # 34 "parsing/parser.ml" ) @@ -41,12 +41,12 @@ module MenhirBasics = struct | RBRACKET | RBRACE | QUOTED_STRING_ITEM of ( -# 816 "parsing/parser.mly" +# 820 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) # 47 "parsing/parser.ml" ) | QUOTED_STRING_EXPR of ( -# 814 "parsing/parser.mly" +# 818 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) # 52 "parsing/parser.ml" ) @@ -54,7 +54,7 @@ module MenhirBasics = struct | QUESTION | PRIVATE | PREFIXOP of ( -# 798 "parsing/parser.mly" +# 802 "parsing/parser.mly" (string) # 60 "parsing/parser.ml" ) @@ -64,7 +64,7 @@ module MenhirBasics = struct | PERCENT | OR | OPTLABEL of ( -# 791 "parsing/parser.mly" +# 795 "parsing/parser.mly" (string) # 70 "parsing/parser.ml" ) @@ -82,12 +82,12 @@ module MenhirBasics = struct | MATCH | LPAREN | LIDENT of ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) # 88 "parsing/parser.ml" ) | LETOP of ( -# 756 "parsing/parser.mly" +# 760 "parsing/parser.mly" (string) # 93 "parsing/parser.ml" ) @@ -107,39 +107,39 @@ module MenhirBasics = struct | LBRACE | LAZY | LABEL of ( -# 761 "parsing/parser.mly" +# 765 "parsing/parser.mly" (string) # 113 "parsing/parser.ml" ) | INT of ( -# 760 "parsing/parser.mly" +# 764 "parsing/parser.mly" (string * char option) # 118 "parsing/parser.ml" ) | INITIALIZER | INHERIT | INFIXOP4 of ( -# 754 "parsing/parser.mly" +# 758 "parsing/parser.mly" (string) # 125 "parsing/parser.ml" ) | INFIXOP3 of ( -# 753 "parsing/parser.mly" +# 757 "parsing/parser.mly" (string) # 130 "parsing/parser.ml" ) | INFIXOP2 of ( -# 752 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) # 135 "parsing/parser.ml" ) | INFIXOP1 of ( -# 751 "parsing/parser.mly" +# 755 "parsing/parser.mly" (string) # 140 "parsing/parser.ml" ) | INFIXOP0 of ( -# 750 "parsing/parser.mly" +# 754 "parsing/parser.mly" (string) # 145 "parsing/parser.ml" ) @@ -147,7 +147,7 @@ module MenhirBasics = struct | IN | IF | HASHOP of ( -# 809 "parsing/parser.mly" +# 813 "parsing/parser.mly" (string) # 153 "parsing/parser.ml" ) @@ -160,7 +160,7 @@ module MenhirBasics = struct | FUN | FOR | FLOAT of ( -# 739 "parsing/parser.mly" +# 743 "parsing/parser.mly" (string * char option) # 166 "parsing/parser.ml" ) @@ -174,7 +174,7 @@ module MenhirBasics = struct | ELSE | DOWNTO | DOTOP of ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) # 180 "parsing/parser.ml" ) @@ -182,14 +182,14 @@ module MenhirBasics = struct | DOT | DONE | DOCSTRING of ( -# 833 "parsing/parser.mly" +# 837 "parsing/parser.mly" (Docstrings.docstring) # 188 "parsing/parser.ml" ) | DO | CONSTRAINT | COMMENT of ( -# 832 "parsing/parser.mly" +# 836 "parsing/parser.mly" (string * Location.t) # 195 "parsing/parser.ml" ) @@ -200,7 +200,7 @@ module MenhirBasics = struct | COLON | CLASS | CHAR of ( -# 719 "parsing/parser.mly" +# 723 "parsing/parser.mly" (char) # 206 "parsing/parser.ml" ) @@ -213,7 +213,7 @@ module MenhirBasics = struct | ASSERT | AS | ANDOP of ( -# 757 "parsing/parser.mly" +# 761 "parsing/parser.mly" (string) # 219 "parsing/parser.ml" ) @@ -374,6 +374,10 @@ let mkuplus ~oploc name arg = | _ -> Pexp_apply(mkoperator ~loc:oploc ("~" ^ name), [Nolabel, arg]) +let mk_attr ~loc name payload = + Builtin_attributes.(register_attr Parser name); + Attr.mk ~loc name payload + (* TODO define an abstraction boundary between locations-as-pairs and locations-as-Location.t; it should be clear when we move from one world to the other *) @@ -900,7 +904,7 @@ let mk_directive ~loc name arg = } -# 904 "parsing/parser.ml" +# 908 "parsing/parser.ml" module Tables = struct @@ -1410,22 +1414,22 @@ module Tables = struct Obj.repr () and default_reduction = - (16, "\000\000\000\000\000\000\003H\003G\003F\003E\003D\003\023\003C\003B\003A\003@\003?\003>\003=\003<\003;\003:\0039\0038\0037\0036\0035\0034\0033\0032\0031\003\022\0030\003/\003.\003-\003,\003+\003*\003)\003(\003'\003&\003%\003$\003#\003\"\003!\003 \003\031\003\030\003\029\003\028\003\027\003\026\003\025\003\024\000\000\000\000\000\"\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\140\001\226\001\205\001\223\001\222\001\221\001\227\001\231\000\000\003\141\001\225\001\224\001\206\001\229\001\220\001\219\001\218\001\217\001\216\001\214\001\230\001\228\000\000\000\000\000\000\001\n\000\000\000\000\001\209\000\000\000\000\000\000\001\211\000\000\000\000\000\000\001\213\001\235\001\232\001\215\001\207\001\233\001\234\000\000\003\139\003\138\003\142\000\000\000\000\000 \001t\000\131\000\000\001\006\001\007\000\000\000\000\000\000\002\004\002\003\000\000\000\000\000\031\000\000\000\000\000\000\000\000\000\000\001\159\000\000\000\000\000\000\000\000\000\000\003\135\000\000\003\130\000\000\000\000\003\132\000\000\003\134\000\000\003\131\003\133\000\000\003}\000\000\003|\003x\002{\000\000\003{\000\000\002|\000\000\000\000\000\000\000\000\000b\000\000\000\000\000`\000\000\000\000\001r\000\000\000\000\000\000\000\000\000\000\000\236\001\128\000\000\000\000\000\000\000\000\000\000\000\000\002d\000\000\000\000\000\000\000\000\000\000\000\000\000]\000\000\000\000\000\000\000\000\000\000\003\004\000\000\002\180\002\181\000\000\002\178\002\179\000\000\000\000\000\000\000\000\000\000\001\154\001\153\000\000\003\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\r\000\017\000\016\000\000\000\000\000\000\000\000\000\000\001\145\000\000\000\000\000\000\000\000\000\000\000\000\001~\000\000\000\000\001\129\001\127\001\135\0009\002\213\000\000\001D\003`\003_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000_\000\000\001\021\000\000\002\183\002\182\000\000\000\000\000\000\001\239\000\000\000\000\000{\000\000\000\000\000\000\000\000\000\000\001\134\000\000\001\133\000\000\001u\001\132\000\000\001s\000Z\000\027\000\000\000\000\001\180\000\024\000\000\000\000\000\000\000\000\000r\000\000\000\000\000\000\000\000\000\000\000\000\003w\000\245\000s\000\134\000t\000\023\000\000\000\000\000\000\000\000\000\028\000\025\000\018\000\000\000u\000q\000\000\000\000\000\000\000\019\000\030\000\000\000\247\002\137\002w\000\000\000x\000\000\002x\000\000\000\000\001\236\000\000\000\000\000\000\000\000\003a\000\000\003b\000\000\000\000\000w\000\000\000\000\000\000\000y\000\000\000z\000\000\000|\000\000\000\000\000}\002m\002l\000\000\000\000\000\000\000\000\000\000\000\000\000[\000\000\003\t\000^\000a\000\\\002\254\003\143\002\255\0026\003\001\000\000\000\000\003\006\002\177\003\b\000\000\000\000\000\000\003\015\003\012\000\000\000\000\000\000\0022\002$\000\000\000\000\000\000\000\000\002(\000\000\002#\000\000\0025\003\021\000\000\000\000\000\000\000\000\001\182\000\000\000\000\0024\003\007\000i\000\000\000\000\000h\000\000\003\016\003\000\000\000\002.\000\000\000\000\003\019\000\000\003\018\003\017\000\000\002*\000\000\000\000\002&\002%\0023\002+\000\000\000g\000\000\003\014\003\r\000\000\003\011\000\000\002\185\002\184\000\000\000\000\002\150\003\n\000\000\000\000\000\000\000\000\001\241\001_\001`\002\187\000\000\002\188\002\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\165\000\000\000\000\000\000\000\000\000\000\000\000\003\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003z\000\000\000\000\000\000\000\000\000\000\001\164\000\000\000\000\000\000\001}\001\172\001|\001\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002u\000\000\000\000\002v\002i\002h\000\000\000\000\001\163\001\162\000\000\000\249\000\000\000\000\001\147\000\000\000\000\001\151\000\000\002\b\002\007\000\000\000\000\002\006\002\005\001\150\001\148\000\000\001\152\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\219\001\130\002\224\002\222\000\000\000\000\000\000\002\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\253\000\000\002\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002A\000\000\000\000\000\000\000\000\000\000\000\000\001\030\002@\001\031\000\000\000\000\000\000\000\237\000\000\001\"\001#\000\000\000\238\002g\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002r\002p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\206\000\000\000\000\000\000\000\000\000\000\003t\000\000\000\000\003s\000\000\000\000\000\000\000\000\001\025\001\024\000\000\001\026\000\000\000\000\000\000\002\232\000\000\000\000\000\000\002\201\002\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\144\002\234\002\221\002\220\000\000\000\000\000\209\002\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\235\000\000\000\000\000\000\000\000\000\000\000\000\000\208\000\207\000\000\000\000\000\000\000\243\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003K\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\002o\000\000\000\000\000\000\001(\000\000\000\000\001'\001&\000\000\002\002\000\000\000\000\000\139\003L\002f\000\000\000\000\000\000\000\000\001+\000\000\000\000\001*\000\000\0021\000\000\000\000\002=\000\000\000\000\002?\000\000\000\000\002;\002:\0028\0029\000\000\000\000\000\000\001$\000\000\000\000\001J\000\020\001-\000\000\000\000\000\000\002\203\002\194\000\000\000\000\002\202\002\193\000\000\000\000\000\000\000\000\002\205\002\196\000\000\000\000\002\143\000\000\000\000\002\209\002\200\000\000\000\000\002\207\002\198\002\228\000\000\000\000\000\000\000\000\000\000\002\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002k\002j\000\205\002\144\000\000\002\195\000\000\000\000\002\199\000\000\000\000\002\197\000\000\000~\000\127\000\000\000\000\000\000\000\000\000\158\000\157\000\000\000\145\000\000\000\000\001b\000\000\001c\001a\002q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0015\000\000\000\000\0016\000\000\000\000\000\210\000\000\0018\0017\000\000\000\000\002\236\002\229\000\000\002\245\000\000\002\246\002\244\000\000\002\250\000\000\002\251\002\249\000\000\000\000\002\231\002\230\000\000\000\000\000\000\002W\000\000\000\000\000\000\000\000\002\153\002V\000\000\002\240\002\239\000\000\000\000\000\000\001\131\000\000\002\211\000\000\002\212\002\210\000\000\002\238\002\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\147\002\227\000\000\002\226\002\225\000\000\002\248\002\247\000\144\000\000\000\000\000\000\000\000\000\143\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\137\000\000\000\000\000\000\000\000\000\000\000\141\000\000\001\139\000\000\000\000\000\000\000c\000\000\000\000\000d\000\000\000\000\000\000\000\000\001\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\015\000\000\000\000\000m\000\000\001\018\001\016\000\000\000\000\000\000\000\251\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\142\000e\000\000\000\000\002U\000\000\000\000\001,\002\000\000\000\001\028\001\029\0013\000\000\000\000\000\000\000\000\000\000\002\243\000\000\002\242\002\241\002\223\000\000\000\000\000\000\000\000\002\214\000\000\002\216\000\000\002\215\000\000\002\190\002\189\000\000\002\191\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\022\002\n\000\000\002\020\000\000\002\016\000\000\002\018\000\000\002\012\000\000\000\000\002\014\000\000\002\021\002\t\000\000\002\019\000\000\002\015\000\000\002\017\000\000\002\011\000\000\000\000\002\r\000\000\001\202\000\000\000\000\000\000\001\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001@\003Y\000\000\000\000\003X\000\000\000\000\000\000\000\000\000\000\002F\000\000\000\000\000\000\000\000\000\000\000\000\003^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\184\000\000\002L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003J\000\000\000\000\002\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\204\000\000\000\000\000\000\001\203\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\171\000\000\000\000\000\000\000\000\001\156\000\000\001\155\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001B\002\170\000\000\000\000\001\141\000\000\002\168\000\000\000\000\000\000\002\167\000\000\000\000\001\142\000\000\000\000\000\000\000\000\002\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\152\000\000\000\000\000\000\000\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=\000\000\000\000\000\000\000\000\001\179\000\000\001\178\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\002S\000\000\002R\000\000\000\000\000\000\000\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000F\000\000\000\000\000\000\000G\000E\000\000\000J\000\000\000\000\000\000\000\000\000\000\000?\000\000\000\000\000\000\000\000\000\000\000\000\000B\000\000\000I\000H\000\000\000C\000D\000\000\001S\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\000Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000V\000\000\000X\000W\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001<\002\175\002\160\000\000\002\166\002\161\002\173\002\172\002\171\002\169\001M\000\000\002\158\000\000\000\000\000\000\000\000\000\000\002d\000\000\000\000\001F\002\162\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\195\001\191\000\000\000\000\000\000\001\000\000\000\000\000\002Z\002d\000\000\000\000\001H\002X\002Y\000\000\000\000\000\000\000\000\000\000\001\198\001\194\001\190\000\000\000\000\001\001\000\000\000\000\001\197\001\193\001\189\001\187\002\163\002\159\002\176\001L\002C\002\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\147\000\000\000\000\003\149\000\000\000.\000\000\000\000\003\155\000\000\003\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\146\000\000\000\000\003\148\000\000\000\000\000\000\002N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001q\000\000\000\000\001o\001m\000\000\000/\000\000\000\000\003\158\000\000\003\157\000\000\000\000\000\000\001k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001p\000\000\000\000\001n\001l\000\000\000\000\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001/\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000P\000\000\000\000\000\000\000\000\000\000\000\000\000+\000\000\000\000\000O\000\000\000)\0010\000\000\0008\000%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\000\000\000N\000M\000\000\000\000\000S\000R\000\000\000\000\001\243\000\000\000-\000\000\000\000\000\000\000,\000\000\000\000\000\000\0000\000\000\000Q\000T\000\000\0002\0003\000\000\001U\000\000\000\000\000\000\000\000\000\000\000\000\0006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001:\003\\\003S\000\000\000\000\003W\003I\003R\003[\003Z\001Q\000\000\000\000\003P\000\000\003T\003Q\003]\002B\000\000\000\000\003N\000\000\000\135\003M\000\000\000\000\001\012\000\000\000\000\001P\001O\000\000\001\144\001\143\000\000\000\000\003\020\003\003\000\000\000:\000\000\000\000\000;\000\000\000\000\002\218\002\217\000\000\000\000\000\148\000\000\000\000\002K\001\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\003V\002_\002`\002[\002]\002\\\002^\000\000\000\000\000\000\000\133\000\000\000\000\002d\000\000\001\004\000\000\000\000\000\000\000\000\003U\000\000\000\130\000\000\000\000\000\000\000\000\001j\001d\000\000\000\000\001e\001\200\000\000\001\199\000\000\000\000\000\246\000\000\000\000\000\000\000\029\000\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\196\001\192\000\000\001\188\003v\000\000\002d\000\000\001\003\000\000\000\000\000\000\000\000\002\165\002c\002a\002b\000\000\000\000\000\000\002d\000\000\001\002\000\000\000\000\000\000\000\000\002\164\000\000\001\158\001\157\000\000\000v\000\000\003\150\000\000\000#\000\000\000\000\000\000\000\000\000\156\000\155\000\000\001\b\000\001\000\000\000\000\001\011\000\002\000\000\000\000\000\000\001w\001x\000\003\000\000\000\000\000\000\000\000\001z\001{\001y\000\021\001v\000\022\000\000\002\023\000\000\000\004\000\000\002\024\000\000\000\005\000\000\002\025\000\000\000\000\002\026\000\006\000\000\000\007\000\000\002\027\000\000\000\b\000\000\002\028\000\000\000\t\000\000\002\029\000\000\000\n\000\000\002\030\000\000\000\011\000\000\002\031\000\000\000\000\002 \000\012\000\000\000\000\002!\000\r\000\000\000\000\000\000\000\000\000\000\003i\003d\003e\003h\003f\000\000\003m\000\014\000\000\003l\000\000\001W\000\000\000\000\003j\000\000\003k\000\000\000\000\000\000\000\000\001[\001\\\000\000\000\000\001Z\001Y\000\015\000\000\000\000\000\000\003\137\000\000\003\136") + (16, "\000\000\000\000\000\000\003I\003H\003G\003F\003E\003\024\003D\003C\003B\003A\003@\003?\003>\003=\003<\003;\003:\0039\0038\0037\0036\0035\0034\0033\0032\003\023\0031\0030\003/\003.\003-\003,\003+\003*\003)\003(\003'\003&\003%\003$\003#\003\"\003!\003 \003\031\003\030\003\029\003\028\003\027\003\026\003\025\000\000\000\000\000\"\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\141\001\227\001\206\001\224\001\223\001\222\001\228\001\232\000\000\003\142\001\226\001\225\001\207\001\230\001\221\001\220\001\219\001\218\001\217\001\215\001\231\001\229\000\000\000\000\000\000\001\011\000\000\000\000\001\210\000\000\000\000\000\000\001\212\000\000\000\000\000\000\001\214\001\236\001\233\001\216\001\208\001\234\001\235\000\000\003\140\003\139\003\143\000\000\000\000\000 \001u\000\132\000\000\001\007\001\b\000\000\000\000\000\000\002\005\002\004\000\000\000\000\000\031\000\000\000\000\000\000\000\000\000\000\001\160\000\000\000\000\000\000\000\000\000\000\003\136\000\000\003\131\000\000\000\000\003\133\000\000\003\135\000\000\003\132\003\134\000\000\003~\000\000\003}\003y\002|\000\000\003|\000\000\002}\000\000\000\000\000\000\000\000\000c\000\000\000\000\000a\000\000\000\000\001s\000\000\000\000\000\000\000\000\000\000\000\237\001\129\000\000\000\000\000\000\000\000\000\000\000\000\002e\000\000\000\000\000\000\000\000\000\000\000\000\000^\000\000\000\000\000\000\000\000\000\000\003\005\000\000\002\181\002\182\000\000\002\179\002\180\000\000\000\000\000\000\000\000\000\000\001\155\001\154\000\000\003\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\014\000\017\000\016\000\000\000\000\000\000\000\000\000\000\001\146\000\000\000\000\000\000\000\000\000\000\000\000\001\127\000\000\000\000\001\130\001\128\001\136\000:\002\214\000\000\001E\003a\003`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\000\001\022\000\000\002\184\002\183\000\000\000\000\000\000\001\240\000\000\000\000\000|\000\000\000\000\000\000\000\000\000\000\001\135\000\000\001\134\000\000\001v\001\133\000\000\001t\000[\000\027\000\000\000\000\001\181\000\024\000\000\000\000\000\000\000\000\000s\000\000\000\000\000\000\000\000\000\000\000\000\003x\000\246\000t\000\135\000u\000\023\000\000\000\000\000\000\000\000\000\028\000\025\000\018\000\000\000v\000r\000\000\000\000\000\000\000\019\000\030\000\000\000\248\002\138\002x\000\000\000y\000\000\002y\000\000\000\000\001\237\000\000\000\000\000\000\000\000\003b\000\000\003c\000\000\000\000\000x\000\000\000\000\000\000\000z\000\000\000{\000\000\000}\000\000\000\000\000~\002n\002m\000\000\000\000\000\000\000\000\000\000\000\000\000\\\000\000\003\n\000_\000b\000]\002\255\003\144\003\000\0027\003\002\000\000\000\000\003\007\002\178\003\t\000\000\000\000\000\000\003\016\003\r\000\000\000\000\000\000\0023\002%\000\000\000\000\000\000\000\000\002)\000\000\002$\000\000\0026\003\022\000\000\000\000\000\000\000\000\001\183\000\000\000\000\0025\003\b\000j\000\000\000\000\000i\000\000\003\017\003\001\000\000\002/\000\000\000\000\003\020\000\000\003\019\003\018\000\000\002+\000\000\000\000\002'\002&\0024\002,\000\000\000h\000\000\003\015\003\014\000\000\003\012\000\000\002\186\002\185\000\000\000\000\002\151\003\011\000\000\000\000\000\000\000\000\001\242\001`\001a\002\188\000\000\002\189\002\187\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\166\000\000\000\000\000\000\000\000\000\000\000\000\003\167\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003{\000\000\000\000\000\000\000\000\000\000\001\165\000\000\000\000\000\000\001~\001\173\001}\001\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002v\000\000\000\000\002w\002j\002i\000\000\000\000\001\164\001\163\000\000\000\250\000\000\000\000\001\148\000\000\000\000\001\152\000\000\002\t\002\b\000\000\000\000\002\007\002\006\001\151\001\149\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\220\001\131\002\225\002\223\000\000\000\000\000\000\002\236\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\254\000\000\002\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002B\000\000\000\000\000\000\000\000\000\000\000\000\001\031\002A\001 \000\000\000\000\000\000\000\238\000\000\001#\001$\000\000\000\239\002h\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002s\002q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\207\000\000\000\000\000\000\000\000\000\000\003u\000\000\000\000\003t\000\000\000\000\000\000\000\000\001\026\001\025\000\000\001\027\000\000\000\000\000\000\002\233\000\000\000\000\000\000\002\202\002\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\145\002\235\002\222\002\221\000\000\000\000\000\210\002\155\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\236\000\000\000\000\000\000\000\000\000\000\000\000\000\209\000\208\000\000\000\000\000\000\000\244\000\243\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003L\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\002p\000\000\000\000\000\000\001)\000\000\000\000\001(\001'\000\000\002\003\000\000\000\000\000\140\003M\002g\000\000\000\000\000\000\000\000\001,\000\000\000\000\001+\000\000\0022\000\000\000\000\002>\000\000\000\000\002@\000\000\000\000\002<\002;\0029\002:\000\000\000\000\000\000\001%\000\000\000\000\001K\000\020\001.\000\000\000\000\000\000\002\204\002\195\000\000\000\000\002\203\002\194\000\000\000\000\000\000\000\000\002\206\002\197\000\000\000\000\002\144\000\000\000\000\002\210\002\201\000\000\000\000\002\208\002\199\002\229\000\000\000\000\000\000\000\000\000\000\002\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\002k\000\206\002\145\000\000\002\196\000\000\000\000\002\200\000\000\000\000\002\198\000\000\000\127\000\128\000\000\000\000\000\000\000\000\000\159\000\158\000\000\000\146\000\000\000\000\001c\000\000\001d\001b\002r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0016\000\000\000\000\0017\000\000\000\000\000\211\000\000\0019\0018\000\000\000\000\002\237\002\230\000\000\002\246\000\000\002\247\002\245\000\000\002\251\000\000\002\252\002\250\000\000\000\000\002\232\002\231\000\000\000\000\000\000\002X\000\000\000\000\000\000\000\000\002\154\002W\000\000\002\241\002\240\000\000\000\000\000\000\001\132\000\000\002\212\000\000\002\213\002\211\000\000\002\239\002\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\148\002\228\000\000\002\227\002\226\000\000\002\249\002\248\000\145\000\000\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\138\000\000\000\000\000\000\000\000\000\000\000\142\000\000\001\140\000\000\000\000\000\000\000d\000\000\000\000\000e\000\000\000\000\000\000\000\000\001\175\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000\000n\000\000\001\019\001\017\000\000\000\000\000\000\000\252\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\143\000f\000\000\000\000\002V\000\000\000\000\001-\002\001\000\000\001\029\001\030\0014\000\000\000\000\000\000\000\000\000\000\002\244\000\000\002\243\002\242\002\224\000\000\000\000\000\000\000\000\002\215\000\000\002\217\000\000\002\216\000\000\002\191\002\190\000\000\002\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\023\002\011\000\000\002\021\000\000\002\017\000\000\002\019\000\000\002\r\000\000\000\000\002\015\000\000\002\022\002\n\000\000\002\020\000\000\002\016\000\000\002\018\000\000\002\012\000\000\000\000\002\014\000\000\001\203\000\000\000\000\000\000\001\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\171\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001A\003Z\000\000\000\000\003Y\000\000\000\000\000\000\000\000\000\000\002G\000\000\000\000\000\000\000\000\000\000\000\000\003_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\185\000\000\002M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003K\000\000\000\000\002\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\205\000\000\000\000\000\000\001\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\172\000\000\000\000\000\000\000\000\001\157\000\000\001\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001C\002\171\000\000\000\000\001\142\000\000\002\169\000\000\000\000\000\000\002\168\000\000\000\000\001\143\000\000\000\000\000\000\000\000\002\175\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\153\000\000\000\000\000\000\000\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000>\000\000\000\000\000\000\000\000\001\180\000\000\001\179\000\000\000\000\000\000\000\000\000A\000\000\000\000\000\000\002T\000\000\002S\000\000\000\000\000\000\000\000\000B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000G\000\000\000\000\000\000\000H\000F\000\000\000K\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000C\000\000\000J\000I\000\000\000D\000E\000\000\001T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001?\000Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000W\000\000\000Y\000X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001=\002\176\002\161\000\000\002\167\002\162\002\174\002\173\002\172\002\170\001N\000\000\002\159\000\000\000\000\000\000\000\000\000\000\002e\000\000\000\000\001G\002\163\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\196\001\192\000\000\000\000\000\000\001\001\000\000\000\000\002[\002e\000\000\000\000\001I\002Y\002Z\000\000\000\000\000\000\000\000\000\000\001\199\001\195\001\191\000\000\000\000\001\002\000\000\000\000\001\198\001\194\001\190\001\188\002\164\002\160\002\177\001M\002D\002\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\148\000\000\000\000\003\150\000\000\000/\000\000\000\000\003\156\000\000\003\155\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\147\000\000\000\000\003\149\000\000\000\000\000\000\002O\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001r\000\000\000\000\001p\001n\000\000\0000\000\000\000\000\003\159\000\000\003\158\000\000\000\000\000\000\001l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001q\000\000\000\000\001o\001m\000\000\000\000\000\000\0002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Q\000\000\000\000\000\000\000\000\000\000\000\000\000,\000\000\000\000\000P\000\000\000*\0011\000\000\0009\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001/\000\000\000O\000N\000\000\000\000\000T\000S\000\000\000\000\001\244\000\000\000.\000\000\000\000\000\000\000-\000\000\000\000\000\000\0001\000\000\000R\000U\000\000\0003\0004\000\000\001V\000\000\000\000\000\000\000\000\000\000\000\000\0007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001;\003]\003T\000\000\000\000\003X\003J\003S\003\\\003[\001R\000\000\000\000\003Q\000\000\003U\003R\003^\002C\000\000\000\000\003O\000#\003N\000\000\000\000\000\136\000\000\001\r\000\000\000\000\001Q\001P\000\000\001\145\001\144\000\000\000\000\003\021\003\004\000\000\000;\000\000\000\000\000<\000\000\000\000\002\219\002\218\000\000\000\000\000\149\000\000\000\000\002L\001\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\000\000\003W\002`\002a\002\\\002^\002]\002_\000\000\000\000\000\000\000\134\000\000\000\000\002e\000\000\001\005\000\000\000\000\000\000\000\000\003V\000\000\000\131\000\000\000\000\000\000\000\000\001k\001e\000\000\000\000\001f\001\201\000\000\001\200\000\000\000\000\000\247\000\000\000\000\000\000\000\029\000\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\197\001\193\000\000\001\189\003w\000\000\002e\000\000\001\004\000\000\000\000\000\000\000\000\002\166\002d\002b\002c\000\000\000\000\000\000\002e\000\000\001\003\000\000\000\000\000\000\000\000\002\165\000\000\001\159\001\158\000\000\000w\000\000\003\151\000\000\000$\000\000\000\000\000\000\000\000\000\157\000\156\000\000\001\t\000\001\000\000\000\000\001\012\000\002\000\000\000\000\000\000\001x\001y\000\003\000\000\000\000\000\000\000\000\001{\001|\001z\000\021\001w\000\022\000\000\002\024\000\000\000\004\000\000\002\025\000\000\000\005\000\000\002\026\000\000\000\000\002\027\000\006\000\000\000\007\000\000\002\028\000\000\000\b\000\000\002\029\000\000\000\t\000\000\002\030\000\000\000\n\000\000\002\031\000\000\000\011\000\000\002 \000\000\000\000\002!\000\012\000\000\000\000\002\"\000\r\000\000\000\000\000\000\000\000\000\000\003j\003e\003f\003i\003g\000\000\003n\000\014\000\000\003m\000\000\001X\000\000\000\000\003k\000\000\003l\000\000\000\000\000\000\000\000\001\\\001]\000\000\000\000\001[\001Z\000\015\000\000\000\000\000\000\003\138\000\000\003\137") and error = - (124, "'\225 \197\138\173\2433\208\020\015\228\000\003\142\0026\016\004\\(\223\018}\000@\248\000\000\024\224}\246D\b/\227P\000L\028\030\227\139\002\131@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235f\245\155\175\2437\252\149\031\226\017\007\158\007\223d@\130\2545\000\004\193\193\2388\176(4\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241'\208\004\015\128\000\001\142\007\223d@\130\2545\000\004\193\193\2388\176(4'\225\"\213\138\173\2433\208\020\015\224\000\007\142\000\000\000\000\004\000\012\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\128\000\128\007\224,$\000\003\226 \016@\016(\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000(\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\128\179\160\b2R\028\012\025 v\017\"\017@\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\002\012\\ \000\016\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@@ \193\004\000\000\016\000\000\000\000\000\016$\004\000\002\012\016@\000\001\000\000\000\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\003 \004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128 \128\b \002\020\000\016\000b\000\002\000\bH\002\b\000\130\000!\000\001\000\006 \000 \000\003\000\000$\193\004\192\004\000\128\000\000\000\000\b\0000\000\002H\016L\000@\b\000\000\000\000\000\128\003\000\000$\129\004\192\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\192\000\000\128\000\000\000\000\b\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002H\000@\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000$\128\004\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\000!\128\001\000\007`\017 \004\003 \000x\016\000\197\194\128\001\000\128 \000\016\bH\002(\000\194\t!\192\001\016\006a\016a\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\000\007\001\000\012\\(\000\016\b\002\000\001\000\003\000\bp\016 \197\194\000\001\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\128\187\128\b2R\028\012\017 v\001f\017`0\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\018\000\002\000\000\000\001\000\016\000\000\000@\000\000\001 \000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\193\004\192\004\000\128\000\000\000\000\b\0000\000\002H\016L\000@\b\000\000\000\000\000\128\003\000\000$\129\004\192\000\000\128\000\000\000\000\b\0000\000\002H\000L\000\000\b\000\000\000\000\000\128\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\001!\128\001\016\007`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\016 \004}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224#a\000E\194\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\128\193#\144\000\001\128\000\001\140\b@\000\b\004\000(!@\192\000\000 \016\000\000\132\000\000\128\000\002\130\020\012\000\000\002\001\000\000\b@\000\b\000\000(!\000\192\000\000 \016\000\000\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\136G\224,\229\"\211\227!\176@\025,\184\000\000\128\000\000\000\000\001\000\000\016\000\000\000\000\131\000\000\000@\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000@\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\167\225 \197\138\173\2437\208\020\015\226\000\003\142\n~\018\012X\170\2233=\001@\254 \0008\224\167\225\"\197\138\173\2433\208\020\015\230\000\003\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@@\000\129\004\000\000\016\000\000\000\b\000\016$\004\004\000\b\016@\000\001\000\000\000\000\000\001\002@@\000\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\002@@\000\000\129\000\000\000\016\000\000\000\000\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\000\016\000\000\004\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\004\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235w\253\155\239\247\255\252\157?\230!\003\158@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\194\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\n6\024\132~*\223R=>b\249\004\001\154\235\129!\bD\002\128\193#\144\000\001\128\000\001\140\0026\016\004X(\223\018=\000@\248\000\000\028\224\197\189\187\215\250\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\128\004\193\"\208\001\001\128\000\001\004\0002\016\004\b\000L\018-\000\016\026\000\000\020@\003!\002@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000\000\000\000\001\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\003\000\002p\016\000\197\194\000\001\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\004\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\001\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\003\184\000\131!!\192\193\018\007`\022!\022\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\012H\011\184\000\131!!\192\193\018\007`\022!\022\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\016\000\000\000\016\000\000\000\000\012\012 \000\000\000\000\000\000\000\003\000\000p\016 \197\194\000\001\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\128\187\128\b2R\028\012\017 v\001b\017`0\000\006\000\000\012\\ \000\016\000\000\000\000\000\197\128\187\128\b2R\028\012\017 v\001b\017`\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128;\128\b2\018\028\012\017 v\001b\017@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012X\011\184\000\131%!\192\193\018\007`\022!\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000@\000\000@\000\002\000\000\000\001\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\002\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000 \000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000 \000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000@\000\000\001\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\016\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\016@\003!\000@\192\004\193&\144\001\001\128\000\001\004\0002\016\004\b\000L\018i\000\016\024\000\000\016@\003!\000@\128\004\193\"\144\001\001\128\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147)\027P\144\020\193&\176\001\001\148 mU\000\000\016\000\b\000@\000\001\000\000\016\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t2\145\181\t\001L\018o\000\016\027A\006\213P\001\000\000\000\000\000\128\"\128\000\000\000\000\000\000\b2\016\132\b\000L\018-\000\016\026\000\000\144@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\192\004\193&\208\001\001\160\000\001\004\0002\016\004\b\000L\018m\000\016\026\000\000\016@\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\003!\000@\128\004\193\"\208\001\001\160\000\001\004\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\131!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\004\000\000\000\020\000LQ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147!\027@\128\020\193&\208\001\001\180\000MU\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t2\017\180\b\001L\018m\000\016\027@\004\213P\131\161\136G\224,\229\"\211\227!\176@\025,\176\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000@\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018)\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\001\000\000\016\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\004\000\000\000\000\000L\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\131\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\128\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000@\000\000\000\000\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\002@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001 \000\000\000\000@\000\000\000\000\004\133\016\131!\002@\128\004\193\"\208\001\001\160\000\001D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000@\000\000\000\000\004\129\016\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\b0\000\016\000\000\004\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193&\176\t\001\144\000M\021\128\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016D\012\130L\018m\000\016\026\000\000\016@\001\002@@@\000\129\004\000\000\016\000\000\000\b\000\016$\004\004\000\b\016@\000\001\000\000\000\000\000\001\002@@\000\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\003\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\001\002H@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\000\000\000\000\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\000\"\000@\b\000\000\000\002\000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\192\000\000\128\000\000\000\000\b\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\0000\000\007\129\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\000\"\001@0\000\007\001\000\012\\ \000\016\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\001\"\001LH\002\168\000\131\001!\192\001\016\007`\018 \004\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\018 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\001\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\003 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\001\002@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\000\000\000\000\000\000\000\000\000\000\000\016\016\016\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\017\000v\016\"\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\000\128\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\000\"\000L\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\128\000\000\000\000\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\144\007`\002`\004\005\002H@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\128\004\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\192\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\144\007a\002`\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\128\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0026\016$X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000@\000\000\000@\000\000\000\000\b\000\001\000\000\000\000\000\000\000\004\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\018\016\004@(\012\0189\000\000\024\000\000\024\192\192\000\017\000\000\000\000\000\000\003\000\016P$\000\0026\016\004\\(\223\018}\000@\248 \000\024\224#a\000E\130\141\241'\208\004\015\130\000\001\142\0026\016\004X(\223\018=\000@\248 \000\024\224\001!\000DB\128\193'\144\000\001\128\000\001\140\000\018\016\004@(\012\018y\000\000\024\000\000\024\192\001!\000D\002\128\193#\144\000\001\128\000\001\140\000\018\016\004@(\012\0189\000\000\024\000\000\024\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\190\215?\191\251a\247\219\127\253\240\016\000\000\000\000\012\0028\000\000\000\000\000\000\000\163a\136G\226\173\245#\211\230/\144@\025\174\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\163a\bE\130\141\241#\208\004\015\128\000\001\142\n6\016\132X(\223\018=\000@\248\000\000\024\224\129\002@@@\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016@\000\001\000\000\000\000\000\001\002@@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000@\000\129\002@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\163a\bE\130\141\241#\208\004\015\128\000\001\142\n6\016\132X(\223\018=\000@\248\000\000\024\224\131!\b@\128\004\193\"\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000@\000\000\001\000\004\193\016\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0026\016\004\\(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\016@\016\000\000\000\000\016\000\004\000\000\000\000\000H\017\0026\016\004X(\223\018=\000@\248\000\000\024\224\003)\000P\208\004\193&\176\001\001\128\000\001\004\0002\144\005\t\000L\018k\000\016\024\000\000\016@\003)\000P\144\004\193\"\176\001\001\128\000\001\004\000 \000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\b\000\000\000\000\004\000\000\000\016\000L\017\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\016\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\161\136G\224,\229\"\211\227!\176@\025,\176\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\193\"\144\001\001\128\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\144\005\t\001L\018+\000\016\025\000\002P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\004\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\001\000\000\000\000\016@\000\000\001\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\012\000L\018m\000\016\026\000\000\016@\003!\000@\128\004\193&\208\001\001\160\000\001\004\0002\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\0026\016\004X(\223\018=\000@\248\000\000\024\224\001!\000DB\128\193'\144\000\001\128\000\001\140\000\018\016\004@(\012\018y\000\000\024\000\000\024\192\001!\000D\002\128\193#\144\000\001\128\000\001\140\012IK\184>\131\225a\192\255\182\007}\183\231\015\001!\000D\002\128\193#\144\000\001\128\000\001\140\012[\219\189\127\171\237s\251\255\182\031}\183\255\223\000\000\000\000\000\000\128\002\128\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\b\000\001\176\000\000\000\000\000\000\000\000\000\004\005\000\163a\011E\130\141\241#\208\004\015\128\000\001\206\0026\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\190\215?\191\251a\247\219\127\252\240\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\131\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\025\000\000\000\000\004\000\000\000\016\000\000\000\b0\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\144\000\000\000\000@\000\000\001\000\002\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b\000\001\144\000\000\000\000@\000\000\001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\016\004@(\012\0189\000\000\024\000\000\024\192\197\189\187\215\250\190\215?\191\251a\247\219\127\253\240\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\012\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\197\189\187\215\250\190\215?\191\251a\247\219\127\252\252IK\184>\131\225a\192\255\182\007}\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000B6\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\190\215?\191\251a\247\219\127\252\252IK\184>\131\225a\192\255\182\007}\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\231\245\187\199\234\191\247?\223\253o\247\139\127\254\247\223d@\130\2545\000\004\193\193\2388\176(4#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2402\016\004\b\000L\018m\000\016\024\000\000\016@\003!\000@\128\004\193\"\208\001\001\128\000\001\004\bz\146-\t\130M3\235\001\144\031`\006\241T#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\128\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\193\016\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\131!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\128\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\144\006`\000 \004\132\128\"\128\b\"\018\024\012\025\000f\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\128\002\128\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\t\176>\000\192@@>\002\001\000\005\134\003\163a\011E\130\141\241#\208\004\015\128\000\001\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\016\004@(\012\0189\000\000\024\000\000\024\192\197\189\187\215\250\190\215?\191\251a\247\219\127\253\240\000\000\000\000\000\b\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015\001\000\000\000\000\000\192\002\128\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000P\000\000\000\000\000\000\000\000\b\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\252[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015\197\189\187\215\250\190\215?\191\251a\247\219\127\253\252[\219\189\127\171\237s\251\255\150\031x\183\255\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012IK\184>\131\225a\192\255\150\007x\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\016\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\240\000@\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\1306\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129!\bD\002\128\193#\144\000\001\128\000\001\140\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016$X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\128\193#\144\000\001\128\000\001\140\004\000\000\000\000\000\000\000\000\0000\000\005\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\016\000$\000\b\000\001\016\000\000\000\000\000\000\000\001\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\b\016\000\016\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\0000\000\005\000\000\000\001\000\000\000\000\000\192#\128\000\000\000\000\000\000\012\000\001\016\000\000\000\000\000\0000\001\005\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012IK\184>\131\225a\192\255\182\007}\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\128\000\017\000\000\000\000\000\000\000@\000\000@\016\b\000\t\016>\000\192@@>\006\001\000\005\130\003\128\000\016\000\000\000\000\000\000\000@\000\000\000\000\b\000\000\000\000\000\004\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\000\b\016@\000\001\000\000\000\000\000\001\002@@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\000@\000\128\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000@\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000@\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000@\000\001\002@@\000\000\129\000\000\000\016\000\000\000\000\bH\002(\000\130\t!\192\001\144\006`\000 \004\129\002@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\016\000\004\000\000\000\016\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\132\128\"\128\b \146\028\000\025\000f\000\002\000@\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000@\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\004\000\b\000\000\000\004\000\0000\000\006\000\000\012\\(\000\016\000\000\000\000\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\001\016\000\000\000\000@\000\002\000\000\000\000\016\000\000\017\000\000\000\000\004\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@@\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\004\000\000 \000\000\000\001\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\133\128\162\128\b0R\028\000\025\000f\001\002\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\128\162\128\b R\028\000\025\000f\001\002\016@0\000\006\000\000\012\\(\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\016\000\000\0000\000\006\000\000\012\\(\000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\133\128\"\128\b R\028\000\025\000f\001\002\016HX\n(\000\131\005!\192\001\144\006`\016!\004\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\133\128\"\128\b R\028\000\025\000f\001\002\016HX\n(\000\131\005!\192\001\144\006`\016!\004\000\000\000\000\000\000\000\004\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016D\b\000L\018m\000\016\024\000\000\016@\003!\004@\128\004\193\"\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\193\"\208\001\001\128\000\001\004\bH\002(\000\130\001!\128\001\144\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@@\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016@\000\001\000\000\000\000\000\001\002@@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\128\000\000\b\000@\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\2402\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\128\000\b\000\000\000\000\000\000\000\000\000\000d\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\136\003\224\012\004\004\003\224 \016\000| 0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \146\028\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\132\128\"\128\b \146\028\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\004\000@\000\000\004\000\000\000\000\000\000\000\000\016\000\000\004\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\004\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000v\000\002\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\018\028\000\017\000f\000\002\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000@\000\000\000\000@\000\000\000\000\000\000\000\003\000\004\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\bH\002(\000\130\001!\128\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@0\000\000\000\000\000\000@\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000@\000\132\128\"\128\b \018\024\000\017\000f\000\002\000HH\002(\000\130\001!\000\001\016\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\223d@\130\2545\000\004\193\193\2388\176(4'\225\"\213\138\173\2433\208\020\015\224\000\007\142\0002\016\004\b\000L\018-\000\016\026\000\000\016@\016\000\002\000\000\000\000\004\000\000\000\000\000H\017\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\223d@\130\2545\000\004\193\193\2388\176(4'\225\"\213\138\173\2433\208\020\015\224\000\007\142\000\016$\004\004\000\b\016@\000\001\000\000\000\000\000\001\002@@\000\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\132\128\"\128\b \146\028\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\192\004\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\bH\002(\000\130!!\192\193\016\007`\016 \000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\132\129\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b\"\018\028\012\017\000v\001\002\000\000\018\000\000\004\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\012 \018\028\000\017\000v\000\006\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\b\000\bH\002(\000\130\001!\192\001\016\006a\000!\000\001\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\132\128\"\128\b \018\028\000\017\000f\000\002\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\128\"\240\024 \199\210\000\017\000`\000\002\000\bH\002(\000\130\000!\000\001\000\006`\000 \000\001\000\000\000@\000\000\004\000\000\000\000\000\000\b\000\016\000\000\004\000\000\000@\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \130\024\000\016\000f\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \130\024\000\016\000f\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\004\000@\000\000\004\000\000\000\000\000\000\000\000\016\000\000\004\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\004\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000v\000\018\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\004\000\000\000\000\004\000\000\000\000\000\000\000\0000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\020\000\b\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\b!\128\001\000\006a\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\003\000\000\000\000\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\b\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\128\001\000\006a\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000\bH\002(\000\130\000!\128\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000@\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@@ \193\004\000\000\016\000\000\000\000\000\016$\004\000\002\012\016@\000\001\000\000\000\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\012H\002(\000\131\000!\192\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\004\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\012 \002\028\000\016\000f\000\006\000\000\136\000\000\004\000\004\000`\000\000\000\000\000\000\000\b\000\000\000@\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000 \000\002H\000@\000\000\b\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\b@\000\b\000\000(!@@\000\000 \016\000\000\132\000\000\128\000\002\130\016\004\000\000\002\001\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\016\004\000\000\002\001\000\000\000\128\000\000\000\004\004\000@\000\000\000\000\000\000\000\b\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\028\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000@\004\000\000\000\000\000\000\000\000\128\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b@\000\b\000\000 !\128@\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\000 \005\016`\000\000\000\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\b\000\016\000\000\000\000\000\000@\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\002\000\000\000\000\004\000\000\000\000\000@\000\000\000\000 \000\000\000\000@\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\018\028\004\017\000v\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\bH\002\168\000\130!!\192A\016\007`\016 \004\132\000\000\128\000\002\002\028\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\198\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\001\000\000\b@\000\b\000\000 !\128@\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\000@\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\bX\n\168\000\131\004!\192\001\016\007`\000`\004\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\000\000\002\000\000\000\000\004\000\000\000\000\000@\016\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\007\001 \r\\ \000\016\000\000\000\000\000\133\128\170\128\b0B\028\000\017\000v\000\002\000HX\n\168\000\131\004!\192\001\016\007`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002\168\000\130\000!\192\001\000\007`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\b\000\000\000\000\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001 \r\\ \000\016\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\000\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\128\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\000\001\000\006`\000 \004\002\000\000$\128\004\192\004\000\128\000\000\000\000\b\000 \000\002H\000L\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\007`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\016 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\000\001\000\006`\000 \004\002\000\000$\128\004\192\004\000\128\000\000\000\000\b\000 \000\002H\000L\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\003 \000x\016\000\197\194\128\001\000\128 \000\016\0000\000'\001\000\012\\ \000\016\000\000\000\001@\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\160\"\128\b \146\026\000\017\000\230\001\002\000HH\002(\000\194\001!\192\001\016\006`\016a\004\132\128\"\128\b \018\028\000\017\000f\001\002\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\001\002\016@\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\001\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\007`\016 \004\001 \000\b\000\000\128\002\128\000\000\128 \000\016\000\018\000\000\000\000\b\000(\000\000\b\002\000\001\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\194\001!\192\001\016\006`\016a\004\132\128\"\128\b \018\028\000\017\000f\001\002\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\004\000\000\000\000\000\000\000\000\136\000\000\004\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000\005\004\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\132\000\000\128\000\002\130\020\012\000\000\002\001\000\000\b@\000\b\000\000(!\000\192\000\000 \016\000\000\132\000\000\128\000\002\002\016\012\000\000\002\001\000\000\000\128\000\000\000\004\004\000@\000\000\000\000\000\000\128\000\000\000\000\000@@\004\000\000\000\000\000\000\000\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\002@\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b@\000\b\000\000 !\192\192\000\000 \016\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\002@\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\128\000\004\000@\000\000\000\000\000\000\128\000\000\000\b\000\000@\004\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000\005\004\0008\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000\005\004\0008\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018=\000@\248\000\000\024\224\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\002\000\209\006\000\000\004\000\000\000\b\000\016\000\004\000 \r\016`\000\000@\000\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\003!\004@\200\004\193&\208\001\001\128\000\001\004\007\223d@\130\2545\000\004\193\193\2388\176(4\003!\004@\128\004\193&\208\001\001\128\000\001\004\0002\016D\b\000L\018-\000\016\024\000\000\016@\003!\000@\128\004\193\"\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000\128\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000@\000\000\000\000\000\000\128\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\016\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193&\176\001\001\128\000\001\004\0002\144\005\t\000L\018+\000\016\024\000\000\016@\003)\000P\144\020\193\"\176\001\001\128\000\001\004\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\016\000\004\000 \r\016 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bZ\146\173A\170-3\251\193\016\030`\016x\212\133\169*\212\026\162\211?\188\017\001\230\001\007\141@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\018\028\012\017\000f\001\006\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002\168\000\130!!\192\193\016\006`\016`\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\018\028\012\017\000f\001\006\001@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\016\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\132\128*\128\b\"\018\028\012\017\000f\001\006\001@2\016D\b\000L\018-\000\016\024\000\000\016@\003!\000@\128\004\193\"\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000\128\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000@\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\001\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\001\000\001\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\`\000\016\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\000\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\003)\000P\144\004\193\"\176\001\001\144\000\005\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\000\002\000HH\002(\000\130\001!\000\001\016\006`\000 \004\b\000\000\000\000\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000\005\004\bH\002(\000\130\001!\128\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\016\000\016\000f\000\002\000\0002\016D\012\000L\018m\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\016\000\017\000f\000\002\000HH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\000\001\016\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\016\000f\000\002\000\bH\002(\000\130\001!\000\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\016\000\025\000f\000\002\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\000\006`\000 \000\132\128\"\128\b \018\016\000\016\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\017\000v\000\"\000L\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000L\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\000\192\000\000 \016\000\000\128\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\000@\128\004\193\"\208\001\001\160\000\001\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\240\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\128\000\b\000 \000\000\b\000\000\001\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\012 \018\028\000\017\000v\000\006\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\012 \018\028\000\017\000v\000\006\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\001!\128\001\016\007`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\001\000\132\128\"\128\b \018\024\000\017\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000 \000\000\000\000\000\000\001\000\000\000\000\000\000\000\002\000\000\000\000\000\003\000\000`\000\000\197\198\000\001 \000 \000\000\0000\000\006\000\000\012\\ \000\018\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\000\000\000@\000\000\001 \000\000\000\000\0000\000\006\000\000\012\\ \000\018\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000@\000\000\001\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\004\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000@\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000@\000\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003 \000x\016\000\197\194\128\001\000\128 \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\128\000\b\000 \000\000\b\000\000\001\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\016\bH\002(\000\130\000!\128\001\000\006`\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\000!\128\001\000\007`\017 \004\003 \000x\016\000\197\194\128\001\000\128 \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\128\000\b\000 \000\000\b\000\000\001\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\016\bH\002(\000\130\000!\128\001\000\006`\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\002\b\000\130\000!\000\001\000\006@\000 \000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\012\000 \000\000\b\000\000\000\000\128\000\136\007\224,$\000\003\226 \016@\024(\176\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\192\000\000\000\000\000\000\000\000\b\000\b\000~\002\194@\000>\"\001\004\001\130\139\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\001\000\000@\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\004\000\000\000\004\000H\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\192\000\000\000\000\000\000\000\000\002~\018\012X\170\2233=\001P\254@\0008\224\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000Z\018\b\000\130\r!\001\001\016\014@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\002\b\000\130\001!\000\001\016\006A\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \018\016\000\016\000`\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\b\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002~\018\012X\170\2233=\001P\254@\0008\224'\225 \197\138\173\2433\208\021\015\228\000\003\142\000H\002\b\000\130\001!\000\001\016\006@\000 \000\004\128 \128\b \018\016\000\017\000d\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\002\b\000\130\001!\128\001\016\006@\000 \000\004\128 \128\b \018\016\000\017\000d\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \018\024\000\017\000d\000\002\000\000H\002\b\000\130\001!\000\001\016\006@\000 \000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000") + (124, "'\225 \197\138\173\2433\208\020\015\228\000\003\142\0026\016\004\\(\223\018}\000@\248\000\000\024\224}\246D\b/\227P\000L\028\030\227\139\002\131@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235f\245\155\175\2437\252\149\031\226\017\007\158\007\223d@\130\2545\000\004\193\193\2388\176(4\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241'\208\004\015\128\000\001\142\007\223d@\130\2545\000\004\193\193\2388\176(4'\225\"\213\138\173\2433\208\020\015\224\000\007\142\000\000\000\000\004\000\012\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\128\000\128\007\224,$\000\003\226 \016@\016(\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000(\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\128\179\160\b2R\028\012\025 v\017\"\017@\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\002\012\\ \000\016\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@@ \193\004\000\000\016\000\000\000\000\000\016$\004\000\002\012\016@\000\001\000\000\000\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\003 \004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128 \128\b \002\020\000\016\000b\000\002\000\bH\002\b\000\130\000!\000\001\000\006 \000 \000\003\000\000$\193\004\192\004\000\128\000\000\000\000\b\0000\000\002H\016L\000@\b\000\000\000\000\000\128\003\000\000$\129\004\192\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\192\000\000\128\000\000\000\000\b\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002H\000@\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000$\128\004\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\000!\128\001\000\007`\017 \004\003 \000x\016\000\197\194\128\001\000\128 \000\016\bH\002(\000\194\t!\192\001\016\006a\016a\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\000\007\001\000\012\\(\000\016\b\002\000\001\000\003\000\bp\016 \197\194\000\001\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\128\187\128\b2R\028\012\017 v\001f\017`0\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\018\000\002\000\000\000\001\000\016\000\000\000@\000\000\001 \000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\193\004\192\004\000\128\000\000\000\000\b\0000\000\002H\016L\000@\b\000\000\000\000\000\128\003\000\000$\129\004\192\000\000\128\000\000\000\000\b\0000\000\002H\000L\000\000\b\000\000\000\000\000\128\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\001!\128\001\016\007`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\016 \004}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224#a\000E\194\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\128\193#\144\000\001\128\000\001\140\b@\000\b\004\000(!@\192\000\000 \016\000\000\132\000\000\128\000\002\130\020\012\000\000\002\001\000\000\b@\000\b\000\000(!\000\192\000\000 \016\000\000\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\136G\224,\229\"\211\227!\176@\025,\184\000\000\128\000\000\000\000\001\000\000\016\000\000\000\000\131\000\000\000@\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000@\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\167\225 \197\138\173\2437\208\020\015\226\000\003\142\n~\018\012X\170\2233=\001@\254 \0008\224\167\225\"\197\138\173\2433\208\020\015\230\000\003\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@@\000\129\004\000\000\016\000\000\000\b\000\016$\004\004\000\b\016@\000\001\000\000\000\000\000\001\002@@\000\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\002@@\000\000\129\000\000\000\016\000\000\000\000\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\000\016\000\000\004\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\004\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235w\253\155\239\247\255\252\157?\230!\003\158@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\194\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\n6\024\132~*\223R=>b\249\004\001\154\235\129!\bD\002\128\193#\144\000\001\128\000\001\140\0026\016\004X(\223\018=\000@\248\000\000\028\224\197\189\187\215\250\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\128\004\193\"\208\001\001\128\000\001\004\0002\016\004\b\000L\018-\000\016\026\000\000\020@\003!\002@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000\000\000\000\001\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\003\000\002p\016\000\197\194\000\001\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\004\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\001\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\003\184\000\131!!\192\193\018\007`\022!\022\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\012H\011\184\000\131!!\192\193\018\007`\022!\022\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\016\000\000\000\016\000\000\000\000\012\012 \000\000\000\000\000\000\000\003\000\000p\016 \197\194\000\001\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\128\187\128\b2R\028\012\017 v\001b\017`0\000\006\000\000\012\\ \000\016\000\000\000\000\000\197\128\187\128\b2R\028\012\017 v\001b\017`\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128;\128\b2\018\028\012\017 v\001b\017@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012X\011\184\000\131%!\192\193\018\007`\022!\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000@\000\000@\000\002\000\000\000\001\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\002\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000 \000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000 \000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000@\000\000\001\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\016\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\016@\003!\000@\192\004\193&\144\001\001\128\000\001\004\0002\016\004\b\000L\018i\000\016\024\000\000\016@\003!\000@\128\004\193\"\144\001\001\128\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147)\027P\144\020\193&\176\001\001\148 mU\000\000\016\000\b\000@\000\001\000\000\016\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t2\145\181\t\001L\018o\000\016\027A\006\213P\001\000\000\000\000\000\128\"\128\000\000\000\000\000\000\b2\016\132\b\000L\018-\000\016\026\000\000\144@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\192\004\193&\208\001\001\160\000\001\004\0002\016\004\b\000L\018m\000\016\026\000\000\016@\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\003!\000@\128\004\193\"\208\001\001\160\000\001\004\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\131!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\004\000\000\000\020\000LQ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147!\027@\128\020\193&\208\001\001\180\000MU\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t2\017\180\b\001L\018m\000\016\027@\004\213P\131\161\136G\224,\229\"\211\227!\176@\025,\176\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000@\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018)\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\001\000\000\016\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\004\000\000\000\000\000L\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\131\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\128\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000@\000\000\000\000\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\002@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001 \000\000\000\000@\000\000\000\000\004\133\016\131!\002@\128\004\193\"\208\001\001\160\000\001D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000@\000\000\000\000\004\129\016\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\b0\000\016\000\000\004\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193&\176\t\001\144\000M\021\128\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016D\012\130L\018m\000\016\026\000\000\016@\001\002@@@\000\129\004\000\000\016\000\000\000\b\000\016$\004\004\000\b\016@\000\001\000\000\000\000\000\001\002@@\000\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\003\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\001\002H@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\000\000\000\000\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\000\"\000@\b\000\000\000\002\000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\192\000\000\128\000\000\000\000\b\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\0000\000\007\129\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\000\"\001@0\000\007\001\000\012\\ \000\016\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\001\"\001LH\002\168\000\131\001!\192\001\016\007`\018 \004\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\018 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\001\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\003 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\001\002@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\000\000\000\000\000\000\000\000\000\000\000\016\016\016\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\017\000v\016\"\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\000\128\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\000\"\000L\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\128\000\000\000\000\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\144\007`\002`\004\005\002H@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\128\004\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\192\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\144\007a\002`\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000@\000\128\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0026\016$X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000@\000\000\000@\000\000\000\000\b\000\001\000\000\000\000\000\000\000\004\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\018\016\004@(\012\0189\000\000\024\000\000\024\192\192\000\017\000\000\000\000\000\000\003\000\016P$\000\0026\016\004\\(\223\018}\000@\248 \000\024\224#a\000E\130\141\241'\208\004\015\130\000\001\142\0026\016\004X(\223\018=\000@\248 \000\024\224\001!\000DB\128\193'\144\000\001\128\000\001\140\000\018\016\004@(\012\018y\000\000\024\000\000\024\192\001!\000D\002\128\193#\144\000\001\128\000\001\140\000\018\016\004@(\012\0189\000\000\024\000\000\024\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\190\215?\191\251a\247\219\127\253\240\016\000\000\000\000\012\0028\000\000\000\000\000\000\000\163a\136G\226\173\245#\211\230/\144@\025\174\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\163a\bE\130\141\241#\208\004\015\128\000\001\142\n6\016\132X(\223\018=\000@\248\000\000\024\224\129\002@@@\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016@\000\001\000\000\000\000\000\001\002@@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000@\000\129\002@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\163a\bE\130\141\241#\208\004\015\128\000\001\142\n6\016\132X(\223\018=\000@\248\000\000\024\224\131!\b@\128\004\193\"\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000@\000\000\001\000\004\193\016\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0026\016\004\\(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\016@\016\000\000\000\000\016\000\004\000\000\000\000\000H\017\0026\016\004X(\223\018=\000@\248\000\000\024\224\003)\000P\208\004\193&\176\001\001\128\000\001\004\0002\144\005\t\000L\018k\000\016\024\000\000\016@\003)\000P\144\004\193\"\176\001\001\128\000\001\004\000 \000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\b\000\000\000\000\004\000\000\000\016\000L\017\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\016\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\161\136G\224,\229\"\211\227!\176@\025,\176\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\193\"\144\001\001\128\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\144\005\t\001L\018+\000\016\025\000\002P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\004\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\001\000\000\000\000\016@\000\000\001\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\012\000L\018m\000\016\026\000\000\016@\003!\000@\128\004\193&\208\001\001\160\000\001\004\0002\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\0026\016\004X(\223\018=\000@\248\000\000\024\224\001!\000DB\128\193'\144\000\001\128\000\001\140\000\018\016\004@(\012\018y\000\000\024\000\000\024\192\001!\000D\002\128\193#\144\000\001\128\000\001\140\012IK\184>\131\225a\192\255\182\007}\183\231\015\001!\000D\002\128\193#\144\000\001\128\000\001\140\012[\219\189\127\171\237s\251\255\182\031}\183\255\223\000\000\000\000\000\000\128\002\128\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\b\000\001\176\000\000\000\000\000\000\000\000\000\004\005\000\163a\011E\130\141\241#\208\004\015\128\000\001\206\0026\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\190\215?\191\251a\247\219\127\252\240\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\131\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\025\000\000\000\000\004\000\000\000\016\000\000\000\b0\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\144\000\000\000\000@\000\000\001\000\002\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b\000\001\144\000\000\000\000@\000\000\001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\016\004@(\012\0189\000\000\024\000\000\024\192\197\189\187\215\250\190\215?\191\251a\247\219\127\253\240\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\012\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\197\189\187\215\250\190\215?\191\251a\247\219\127\252\252IK\184>\131\225a\192\255\182\007}\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000B6\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\190\215?\191\251a\247\219\127\252\252IK\184>\131\225a\192\255\182\007}\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\231\245\187\199\234\191\247?\223\253o\247\139\127\254\247\223d@\130\2545\000\004\193\193\2388\176(4#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2402\016\004\b\000L\018m\000\016\024\000\000\016@\003!\000@\128\004\193\"\208\001\001\128\000\001\004\bz\146-\t\130M3\235\001\144\031`\006\241T#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\128\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\193\016\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\131!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\128\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\144\006`\000 \004\132\128\"\128\b\"\018\024\012\025\000f\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\128\002\128\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\t\176>\000\192@@>\002\001\000\005\134\003\163a\011E\130\141\241#\208\004\015\128\000\001\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\016\004@(\012\0189\000\000\024\000\000\024\192\197\189\187\215\250\190\215?\191\251a\247\219\127\253\240\000\000\000\000\000\b\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015\001\000\000\000\000\000\192\002\128\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000P\000\000\000\000\000\000\000\000\b\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\250\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\252[\219\189\127\171\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015\197\189\187\215\250\190\215?\191\251a\247\219\127\253\252[\219\189\127\171\237s\251\255\150\031x\183\255\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012IK\184>\131\225a\192\255\150\007x\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\016\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\240\000@\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\252IK\184>\131\225a\192\255\150\007x\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\1306\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129!\bD\002\128\193#\144\000\001\128\000\001\140\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016$X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\002\128\193#\144\000\001\128\000\001\140\004\000\000\000\000\000\000\000\000\0000\000\005\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\016\000$\000\b\000\001\016\000\000\000\000\000\000\000\001\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\b\016\000\016\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\0000\000\005\000\000\000\001\000\000\000\000\000\192#\128\000\000\000\000\000\000\012\000\001\016\000\000\000\000\000\0000\001\005\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012IK\184>\131\225a\192\255\182\007}\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\128\000\017\000\000\000\000\000\000\000@\000\000@\016\b\000\t\016>\000\192@@>\006\001\000\005\130\003\128\000\016\000\000\000\000\000\000\000@\000\000\000\000\b\000\000\000\000\000\004\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\000\b\016@\000\001\000\000\000\000\000\001\002@@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\000@\000\128\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000@\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000@\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000@\000\001\002@@\000\000\129\000\000\000\016\000\000\000\000\bH\002(\000\130\t!\192\001\144\006`\000 \004\129\002@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\016\000\004\000\000\000\016\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\132\128\"\128\b \146\028\000\025\000f\000\002\000@\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000@\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\004\000\b\000\000\000\004\000\0000\000\006\000\000\012\\(\000\016\000\000\000\000\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\001\016\000\000\000\000@\000\002\000\000\000\000\016\000\000\017\000\000\000\000\004\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@@\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\004\000\000 \000\000\000\001\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\133\128\162\128\b0R\028\000\025\000f\001\002\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\128\162\128\b R\028\000\025\000f\001\002\016@0\000\006\000\000\012\\(\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\016\000\000\0000\000\006\000\000\012\\(\000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\133\128\"\128\b R\028\000\025\000f\001\002\016HX\n(\000\131\005!\192\001\144\006`\016!\004\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\133\128\"\128\b R\028\000\025\000f\001\002\016HX\n(\000\131\005!\192\001\144\006`\016!\004\000\000\000\000\000\000\000\004\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016D\b\000L\018m\000\016\024\000\000\016@\003!\004@\128\004\193\"\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\193\"\208\001\001\128\000\001\004\bH\002(\000\130\001!\128\001\144\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\192\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\196\148\187\131\232>\022\028\015\249`w\139~p\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002@@@\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016@\000\001\000\000\000\000\000\001\002@@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\128\000\000\b\000@\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\2402\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\128\000\b\000\000\000\000\000\000\000\000\000\000d\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\136\003\224\012\004\004\003\224 \016\000| 0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \146\028\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\132\128\"\128\b \146\028\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\004\000@\000\000\004\000\000\000\000\000\000\000\000\016\000\000\004\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\004\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000v\000\002\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\018\028\000\017\000f\000\002\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000@\000\000\000\000@\000\000\000\000\000\000\000\003\000\004\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\bH\002(\000\130\001!\128\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@0\000\000\000\000\000\000@\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000@\000\132\128\"\128\b \018\024\000\017\000f\000\002\000HH\002(\000\130\001!\000\001\016\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\223d@\130\2545\000\004\193\193\2388\176(4'\225\"\213\138\173\2433\208\020\015\224\000\007\142\0002\016\004\b\000L\018-\000\016\026\000\000\016@\016\000\002\000\000\000\000\004\000\000\000\000\000H\017\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\223d@\130\2545\000\004\193\193\2388\176(4'\225\"\213\138\173\2433\208\020\015\224\000\007\142\000\016$\004\004\000\b\016@\000\001\000\000\000\000\000\001\002@@\000\000\129\004\000\000\016\000\000\000\000\000\016$\004\000\000\b\016\000\000\001\000\000\000\000\000\132\128\"\128\b \146\028\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\192\004\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\bH\002(\000\130!!\192\193\016\007`\016 \000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\132\129\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b\"\018\028\012\017\000v\001\002\000\000\018\000\000\004\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\012 \018\028\000\017\000v\000\006\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\b\000\bH\002(\000\130\001!\192\001\016\006a\000!\000\001\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\132\128\"\128\b \018\028\000\017\000f\000\002\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\128\"\240\024 \199\210\000\017\000`\000\002\000\bH\002(\000\130\000!\000\001\000\006`\000 \000\001\000\000\000@\000\000\004\000\000\000\000\000\000\b\000\016\000\000\004\000\000\000@\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \130\024\000\016\000f\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \130\024\000\016\000f\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\004\000@\000\000\004\000\000\000\000\000\000\000\000\016\000\000\004\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\004\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000v\000\018\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\004\000\000\000\000\004\000\000\000\000\000\000\000\0000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\020\000\b\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\b!\128\001\000\006a\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\003\000\000\000\000\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\b\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\128\001\000\006a\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016$\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000\bH\002(\000\130\000!\128\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000@\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@@ \193\004\000\000\016\000\000\000\000\000\016$\004\000\002\012\016@\000\001\000\000\000\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\012H\002(\000\131\000!\192\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\004\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\012 \002\028\000\016\000f\000\006\000\000\136\000\000\004\000\004\000`\000\000\000\000\000\000\000\b\000\000\000@\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000 \000\002H\000@\000\000\b\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\b@\000\b\000\000(!@@\000\000 \016\000\000\132\000\000\128\000\002\130\016\004\000\000\002\001\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\016\004\000\000\002\001\000\000\000\128\000\000\000\004\004\000@\000\000\000\000\000\000\000\b\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\028\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000@\004\000\000\000\000\000\000\000\000\128\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b@\000\b\000\000 !\128@\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\000 \005\016`\000\000\000\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\b\000\016\000\000\000\000\000\000@\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\002\000\000\000\000\004\000\000\000\000\000@\000\000\000\000 \000\000\000\000@\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\018\028\004\017\000v\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\bH\002\168\000\130!!\192A\016\007`\016 \004\132\000\000\128\000\002\002\028\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\198\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\001\000\000\b@\000\b\000\000 !\128@\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\000@\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\bX\n\168\000\131\004!\192\001\016\007`\000`\004\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\000\000\002\000\000\000\000\004\000\000\000\000\000@\016\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\007\001 \r\\ \000\016\000\000\000\000\000\133\128\170\128\b0B\028\000\017\000v\000\002\000HX\n\168\000\131\004!\192\001\016\007`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002\168\000\130\000!\192\001\000\007`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\b\000\000\000\000\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001 \r\\ \000\016\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\000\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\128\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\000\001\000\006`\000 \004\002\000\000$\128\004\192\004\000\128\000\000\000\000\b\000 \000\002H\000L\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\007`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\016 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\000\001\000\006`\000 \004\002\000\000$\128\004\192\004\000\128\000\000\000\000\b\000 \000\002H\000L\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\003 \000x\016\000\197\194\128\001\000\128 \000\016\0000\000'\001\000\012\\ \000\016\000\000\000\001@\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\160\"\128\b \146\026\000\017\000\230\001\002\000HH\002(\000\194\001!\192\001\016\006`\016a\004\132\128\"\128\b \018\028\000\017\000f\001\002\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\001\002\016@\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\001\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\007`\016 \004\001 \000\b\000\000\128\002\128\000\000\128 \000\016\000\018\000\000\000\000\b\000(\000\000\b\002\000\001\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\194\001!\192\001\016\006`\016a\004\132\128\"\128\b \018\028\000\017\000f\001\002\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\004\000\000\000\000\000\000\000\000\136\000\000\004\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000\005\004\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\132\000\000\128\000\002\130\020\012\000\000\002\001\000\000\b@\000\b\000\000(!\000\192\000\000 \016\000\000\132\000\000\128\000\002\002\016\012\000\000\002\001\000\000\000\128\000\000\000\004\004\000@\000\000\000\000\000\000\128\000\000\000\000\000@@\004\000\000\000\000\000\000\000\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\002@\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b@\000\b\000\000 !\192\192\000\000 \016\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\002@\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\128\000\004\000@\000\000\000\000\000\000\128\000\000\000\b\000\000@\004\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000\005\004\0008\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000\005\004\0008\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018=\000@\248\000\000\024\224\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\002\000\209\006\000\000\004\000\000\000\b\000\016\000\004\000 \r\016`\000\000@\000\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\003!\004@\200\004\193&\208\001\001\128\000\001\004\007\223d@\130\2545\000\004\193\193\2388\176(4\003!\004@\128\004\193&\208\001\001\128\000\001\004\0002\016D\b\000L\018-\000\016\024\000\000\016@\003!\000@\128\004\193\"\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000\128\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000@\000\000\000\000\000\000\128\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\016\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193&\176\001\001\128\000\001\004\0002\144\005\t\000L\018+\000\016\024\000\000\016@\003)\000P\144\020\193\"\176\001\001\128\000\001\004\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\016\000\004\000 \r\016 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bZ\146\173A\170-3\251\193\016\030`\016x\212\133\169*\212\026\162\211?\188\017\001\230\001\007\141@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\018\028\012\017\000f\001\006\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002\168\000\130!!\192\193\016\006`\016`\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\018\028\012\017\000f\001\006\001@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\016\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\132\128*\128\b\"\018\028\012\017\000f\001\006\001@2\016D\b\000L\018-\000\016\024\000\000\016@\003!\000@\128\004\193\"\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000\128\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000@\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\001\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\001\000\001\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\`\000\016\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\000\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\003)\000P\144\004\193\"\176\001\001\144\000\005\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\000\002\000HH\002(\000\130\001!\000\001\016\006`\000 \004\b\000\000\000\000\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000\005\004\bH\002(\000\130\001!\128\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\016\000\016\000f\000\002\000\0002\016D\012\000L\018m\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\016\000\017\000f\000\002\000HH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\000\001\016\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\016\000f\000\002\000\bH\002(\000\130\001!\000\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\000\001\144\006`\000 \004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\016\000f\000\002\000\bH\002(\000\130\001!\000\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007`\002 \004\192\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\004\193\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\016\012\000\000\002\001\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b2\016\004\b\000L\018-\000\016\026\000\000\017@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012IK\184>\131\225a\192\255\150\007x\183\231\015\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\001\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\bH\002(\000\194\001!\192\001\016\007`\000a\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\194\001!\192\001\016\007`\000a\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\130\b \018\024\000\017\000v\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\128\000\b\000 \000\000\b\000\000\001\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\016\bH\002(\000\130\001!\128\001\016\006`\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\002\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000 \000\000\000\000\0000\000\006\000\000\012\\`\000\018\000\002\000\000\000\003\000\000`\000\000\197\194\000\001 \000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000\000\000\004\000\000\000\018\000\000\000\000\000\003\000\000`\000\000\197\194\000\001 \000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000@\000\000\016\000\000\000\000\004\000\000\000\016\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000@\000\000\000\000\128\000\000\000\000@\000\000\000\000\004\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\004\000\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\000\007\129\000\012\\(\000\016\b\002\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\128\001\000\006`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\001\000\132\128\"\128\b \002\024\000\016\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\130\b \002\024\000\016\000v\001\018\000@2\000\007\129\000\012\\(\000\016\b\002\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\128\001\000\006`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\001\000\132\128\"\128\b \002\024\000\016\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \002\016\000\016\000d\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\192\002\000\000\000\128\000\000\000\b\000\b\128~\002\194@\000>\"\001\004\001\130\139\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\016\000\000\000\016\000\000\000\000\012\000\000\000\000\000\000\000\000\000\128\000\128\007\224,$\000\003\226 \016@\024(\176\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\004\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\016\000\004\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000@\000\000\000@\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\000\000\000\012\000\000\000\000\000\000\000\000\000'\225 \197\138\173\2433\208\021\015\228\000\003\142\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\005\161 \128\b \210\016\016\017\000\228\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \018\016\000\017\000d\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\002\b\000\130\001!\000\001\000\006\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\225 \197\138\173\2433\208\021\015\228\000\003\142\002~\018\012X\170\2233=\001P\254@\0008\224\004\128 \128\b \018\016\000\017\000d\000\002\000\000H\002\b\000\130\001!\000\001\016\006@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \018\024\000\017\000d\000\002\000\000H\002\b\000\130\001!\000\001\016\006@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\002\b\000\130\001!\128\001\016\006@\000 \000\004\128 \128\b \018\016\000\017\000d\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000") and start = 15 and action = - ((16, "kby\132n\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021Hn\030\000\000\000\000\020Xn\030kb\020\182\000-\000[\164L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\138\001\208\001d\000\000\002t\001\188\000\000\003\214\003$\007\140\000\000\005\244\003r\b\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\220\000\000\000\000\000\000\002\216tj\000\000\000\000\000\000\006&\000\000\000\000zh\0046\0046\000\000\000\000\179N\006&\000\000y\140\020Xj6\164\228\005\236\000\000\020X\129&o8\020Xzx\000\000\005\144\000\000l(\006\136\000\000kJ\000\000\021\224\000\000\000\000\003\224\000\000\006&\000\000\000\000\000\000\006\242\000\000kJ\000\000\006\214\194L\166\164\173&\000\000\203\252\205\226\000\000t\242\132\164\000\000\132\"\0218tjn\030kb\000\000\000\000o8\020X{\194l(\007\030\190\180\000\000\185\024n\030kby\132\020X\000\000\000\000\016xy~\020X\130\172\131\142\000\000\001\026\000\000\000\000\004\250\000\000\000\000qn\001\026\025\130\005\200\b$\000\000\000\000\002\026\000\000j6\005\248\005\228\020X\023.\020Xkbkb\000\000\000\000\000\000u\254u\254\020X\023.\b`\000\000q\152\020X\129&\023\022\bZ\b\004\000\000\000\220\b\022\000\000\000\000\000\000\000\000\000\000\020X\000\000\000\000\000\000y\132\020X\000\000i\134\191:}\252\000\248\129\218\131\142\193\254\194\230\000\000\b\004\000\000\007:\000\000\000\000\020\250\177\148~X\000\000\177\148~X\000\000\177\148\177\148\000b\006\n\0008\000\000\020\190\000\000\bL\000\000\000\000\bL\000\000\000\000\000\000\177\148\006&\000\000\000\000\130\164\177\148~\224\132\164\000\000\0072\028\254\179N\132\164\011\228\177\148\000\000\000\000\000\000\000\000\000\000\000\000v\204\132\164w\194\000b\000\000\000\000\000\000\004\006\000\000\000\000\162&\012$\006&\000\000\000\000x\184\000\000\000\000\000\000\003b\000\000\177\148\000\000\001\000\180F\000\000\177\148\005\216\177\148\023\224\000\000\024\216\000\000\006\208\006\230\000\000\011\132\177\148\t\206\000\000\t\246\000\000\t\184\000\000\000\000\005\016\000\000\000\000\000\000\029\n\030D\131\142yp\020X\131\142\000\000\000b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\220\027v\000\000\000\000\000\000\001\244%\182\188\132\000\000\000\000yp\020X\131\142\000\000\000\000\207p\131\142\207\184\194\230\000\000\208N\000\000\131\142\000\000\000\000\132zqn\001\154\001\154\000\000\014\020\131\142\000\000\000\000\000\000\004\250\014,\000\000h\196\000\000\000\000\195.\000\000\208`\177\148\000\000\004R\000\000\000\000\195\186\000\000\208\150\012\226\000\000\000\000\000\000\000\000\014\178\000\000\023\160\000\000\000\000\195\186\000\000\004\224\000\000\000\000l\000\189\016\000\000\000\000j&\024t\019\252\025\"\000\000\000\000\000\000\000\000\002>\000\000\000\000\162\240\n\238\014\168\000\017\177\148\000\226\015t\000\000\000\000\011\176\014\168\005\"\000\000y\132yvu\254\020X\023.\000-\000\018\r\138\000\000\015Lj6\131\196\015\212j6\000-\000\018\000\018j6\000\000\178\132\t`l(\b\004\bT\209 \000\000\177\148\173\198\177\148\167\132\174f\177\148\006`\177\148\175\000\000\000\012\250\tD\nDj6\179$\000\000\b*\t\190\165\006\000\000\000\000\000\000\000\000j6\179|j6\180\028\020d\0008\168$\b\022\0008\168|\000\000\180t\t`\000\000\000\000\000\000\181\020\002\152\000\000\000\000\006x\000\000\007|\023.\000\000\165\196q\152\000\000\0268\000\000\000\000j6\003\144\000\000\000\000\000\000\000\000\163\168\000\000\001\248\000\000\127\172\t \0032\133<\0226\131\132y\132\020Xo\244y\132\020X\016x\016x\000\000\000\000\000\000\000\000\001\240\025\030jt\000\000{,{\224u\254\020X\023.\007hnB\000\000\007p\000\000|\148}H\196\002qZ\177\148\006p\000\000y\132\020X\000\000yp\020X\193\254\131\142ih\000\000y\132\020Xo\b\001\b\000\000\131\142ih\177\148\002\210\005\"\016r\000\000\000\000\000\000rZ\001\154\016\136\000\000\131\142\000\000\000\000\175\140\000\000\000\000\t\014\132\164\000b\016\200\133\240yp\020X\193\254\026\022\134\164yp\020X\193\254\027\014\131\142\000\000\000\000yp\020X\131\142\026J\000\000y\132\020X\016x\0226\016x\002\232\021\238sHyp\020X\193\254m\200sH\135Xyp\020X\193\254\000\000\016x\r\160\016\190\000*\177\180\000\000\021\146\179N\000\000\026\"\177\148\028\018\016\250\000\000\000\000\016\206\000\000\016x\003\224\017\004\000\000&\174\000\000\n\202\000\000\000\000\028\006\136\012yp\020X\193\254\028\254\017p\023.\000\000\000\000\000\000\000\000\004\234\000\000\000\000\000\000\029\246\136\192yp\020X\193\254\030\238\031\230\137typ\020X\193\254 \222!\214\000\000\018h\024&\138(yp\020X\193\254\000\000\000\000\000\000n\030\000\000\000\000\000\000\138\220yp\020X\193\254\"\206#\198\139\144yp\020X\193\254$\190%\182\140Dyp\020X\193\254&\174'\166\140\248yp\020X\193\254(\158)\150\141\172yp\020X\193\254*\142+\134\142`yp\020X\193\254,~-v\143\020yp\020X\193\254.n/f\143\200yp\020X\193\2540^1V\144|yp\020X\193\2542N3F\1450yp\020X\193\2544>56\145\228yp\020X\193\2546.7&\146\152yp\020X\193\2548\0309\022\147Lyp\020X\193\254:\014;\006\148\000yp\020X\193\254;\254<\246\148\180yp\020X\193\254=\238>\230\149hyp\020X\193\254?\222@\214\150\028yp\020X\193\254A\206B\198\150\208yp\020X\193\254C\190D\182\151\132yp\020X\193\254E\174F\166\1528yp\020X\193\254G\158H\150\020X\131\142o\b\000\000\000\000tj\001\154\016\182\177\148\bP\000\000\000\000\nF\006&\000\000\177\148\b\162\000\000\000\000\017\"\000\000\000\000\000\000\004\164\000\000\017,\133\240\000\000\000\000\000\000q\154\177\148\t\154\000\000\000\000\0292\000\000\000\000\196\142\000\000\030*\196\214\000\000\031\"\197b\000\000 \026\014\210\000\000\000\000\000\000\000\000!\018\131\142\"\n\000\000\185\004\185\004\000\000\000\000\000\000I\142\000\000\006\212\000\000\000\000\000\000\011\188\000\000\000\000\000\220\025\158sH\011\172\000\000\000\000\166ft\014\000\000sH\t\210\000\000\000\000sH\012\140\000\000\000\000\000\000\016x\004\216\026\bsH\012\164\000\000\005\208\152\236yp\020X\193\254J\134K~sH\r\156\000\000\006\200\153\160yp\020X\193\254LvMnsH\r\172\000\000\007\192\154Typ\020X\193\254NfO^'\166\000\000\r\186\b\184\155\byp\020X\193\254PVQN\000\000\014\144\t\176\155\188yp\020X\193\254RFS>\000\000\014\250\n\168\156pyp\020X\193\254T6U.\007H\026\198sH\015L\011\160\157$yp\020X\193\254V&W\030sH\014\148\012\152\157\216yp\020X\193\254X\022Y\014sH\015\134\r\144\158\140yp\020X\193\254Z\006Z\254\014\136\159@yp\020X\193\254[\246\\\238\015\128\019`\000\000\000\000\000\000\000\000\015\162\000\000sH\014\170\000\000sH\015\242\000\000\t\236\000\000\000\000\000\000\017J\000\000\n\224\000\000\000\000]\230\000\000\017\196\000\000\000\000\000\000\000\000\000\000\000\000^\222\018\014\159\244yp\020X\193\254_\214\160\168yp\020X\193\254`\206a\198b\190\161\\yp\020X\193\254c\182d\174\000\000#\002\000\000\000\000\005\134\000\000\000\000\131\142\000\000\000\000\191\150\016D\000\000\000\000\127\172\000\000\b\218\000\000\000\000\128r\000\000\015\140\000\000\000\000\005@\011\194\000\000\000\000\0226\022\028\b\004\000\000j\228\031<\027\\\021\218\000\000\000\000\016\148\000\000\000\000\001\238\026\022\133D\000\000\025\030\000\000\n\246\000\000\000\000\016\234\000\000\000\000yp\020X\193\254i*\175\244\t\002\005@\000\000\000\000\012H\000\000\000\000\016\128\000\000\000\000\000\000\020X\023.\003\202\000\000\000\000\023\022\005\200\b$\b`\023.\192&\162\016\000\000\020X\023.\192\164\017\162\000\000\000\000\b`\000\000n\174\019\248\023\228\000\000\011\220\0184\000\000\018H\000V\132\164\000\244\000\000\018\024\017\170tj\011,\177\148\026\160\020F\016V\003\b\000\000\029\136\018d\000\000\000\244\000\000\000\000\018|\132\164\169\028\000\000\176\146\168N\012\156\132\164\018J\132\164\181\146\169\188\018\\\132\164\182\016\170\\\001\024\018\030\000\000\000\000\000\000\020X\200\164\000\000\131\142\185\004\000\000\000\000\018\146\000\000\000\000\000\000yp\020X\193\254e\166f\158\000\000\015\228\000\000\000\000\000\000u\254\020X\023.\003\202\000\000\163\148\000\000\bh\000\000\000*\000\000\000\000\018\158\000\000\018\202\193\254g\150yp\020X\193\254\022`\000\000\000\000\165\228\000\000\t`\000\000\167\164\000\000\020X\000\000j6\nX\000\000\176\250\000\000\000\000\171(\000\000\011P\000\000\171\196\000\000\025\198\000\000j6\012H\000\000\200\234\000\000\020X\023.\200\234\000\000\023l\023\022\bZ\006&\202\150j6\197\168\185\004\000\000\005\200\tR\b$\b`\185\004\204p\005\200\b$\b`\185\004\204p\000\000\000\000\b`\185\004\000\000n\030kb\131\142\027B\000\000\000\000n\030kbu\254\020X\023.\200\234\000\000\020\182\000-\000[\017\246tj\r(\177\148\185\150\018$\018\204\203\020\000\000\185\004\000\000\186\018n\174\019\248\023\228\192\252\024\220\r\204\198$\n<\018*\020X\185\004\000\000\020X\185\004\000\000\177\180\174\202\019\134\003\214\005\200\0008w\140\000\000\005\200\0008w\140\000\000\026\178\023\022\bZ\006&x\130j6\185\024\000\000\005\200\nJ\022\214\012\156\000\000w\140\000\000\b$\0184j6\185\024\206*\005\200\b$\0186j6\185\024\206*\000\000\000\000\tX\r\148\000\000\205j\000\000j6\203lw\140\000\000\nP\r\148\000\000y\140\020Xj6\185\024\000\000n\174\019\248\023\228\186\142kr\024\014\019\170\002\142\000\000\rbkJ\000\017\000\000\018\176\018^\024\196\020X\162\190\177\148\n@\000\000\135X\012\238\004\212\r\230\000\000\014\132\000\000\018\190\018X\177\148w\202\000\000\0032\002\228\011\016\000\000\014\240\000\000\018\214\018ztjw\202\000\000\020X\024\196\019\014\011^\005\200\000\000\016\176\024\196\177\148\012\020\000b\000\000\177\148\004\018\007\242\000\000\000\000\182j\000\000\000\000\016\204\024\196\182\232w\202\000\000\020X\177\148\015d\177\148tXw\202\000\000\016\232\000\000\000\000w\202\000\000\000\000\135X\000\000\185\024\204~\019\170\002\142\rb\019\002\018\176\024\196\185\024\204~\000\000\000\000\019\170\002\142\rb\019\006\018\146v\158t\252\132\164\019\028v\158\177\148\020\184\019&v\158\132\164\019,v\158\183\136\184\b\000\000\201h\000\000\000\000\185\004\206d\019\170\002\142\rb\019(\018\190v\158\185\004\206d\000\000\000\000\000\000\174\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000w\140\000\000\205\016\020Xl(\019H\190\180\000\000\185\024\205\016\000\000\000\000\206\152\020Xl(\019L\018\232\166\164\206\202\000\244\019\150\000\000\000\000\184\134\186\142\020X\000\000\198|\023\228\000\000\000\000\185\024\206\152\000\000\000\000\000\000\193xl\156n>\000\244\019\162\000\000\000\000\000\000\186\142\020X\000\000\000\244\019\164\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015Xkr\019\170\002\142\rb\019\128\186\254\023\204\020X\130\172\134\164\020(\003\b\000\244\019\152\012d\000\000\000\000\019b\000\000\000\000\128r\000\000\011\156\014\222\000\000\015&\000\000\019\192\019r\177\148~F\020\022\r\\\000\000\000\000\019\222\000\000\000\000\020F\0032\016\218\000\000\0208\187\128\209\146\001\154\019\214\177\148\017\b\000\000\000\000\0204\000\000\000\000\000\000\128r\000\000\0068\017\168\000\000\015\232\000\000\020\138\020Htj\000\000\020\218\188\002\209\168\001\154\020\136\177\148\017Z\000\000\000\000\020\178\000\000\000\000\000\000\020X\000\000\128r\000\000\020z\020X\023\204\023\204\189Xn\030\020X\200\164\131\142\025p\000\000\012\020\005\200\000\000\016\244\023\204\177\148\014\192\b\004\000\000\020X\131\142\186\254\023\204\0162\023\204\000\000lFm,\000\000\170\182\000\000\000\000\171R\000\000\000\000\171\238\000\000\017\168\023\204\172\138\200\164\131\142\025p\000\000\000\"\000\000\000\000v\158\017\154\000\000\000\000\127\172\021\012\000\000\128r\000\000\023\204\127\172\128r\000\000\020X\177\148\128r\000\000\017x\000\000\000\000\128r\000\000\000\000\134\164\000\000\201\192v\158\020\186\023\204\202>\186\254\000\000\185\004\205\030\019\170\002\142\rb\021\020\186\254\185\004\205\030\000\000\000\000\000\000\207byp\000\000\000\000\000\000\000\000\000\000\000\000\203\166\185\004\000\000\205\016\000\000\000\000\000\000\000\000\185\004\207b\000\000\021T\000\000\000\000\203\166\021`\000\000\185\004\207b\000\000\000\000\017\206\000\000\000\000\178,\004\136\000\000\000\000jV\000\000\177\148\016\016\000\000\134\164\018\028\000\000\000\000\021\176\193\254\000\000h\142\021\180\000\000\000\000\021\168\028B$\002\023\228\189\224\024\220\020X\000\000\185\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\189\244\024\220\020X\000\000\012>\190\180\000\000\185\024\000\000\021\194\028B$\002\185\024\000\000\021\212\000\000\004\206\017N\020X\210,\000\000\000\000\028\190\210J\000\000\000\000\021^\000\000\021\186\177\148\000\000\0186\n\182\000b\000\000\000\000\177\148\0150\016\004\177\148\016(\000\244\021\234\000\000\000\000\199\022\000\000\000\000\166\164\000\000\185\024\000\000\021\222\028B$\250w\140\000\000\000\000\000\000\000\000\015\020\199\176\166\164\000\000\185\024\000\000\021\224\028B$\250w\140\000\000\018p\000\000\000\000\0148\000\000\185\004\000\000\021\254\000\000\000\000\021`\000\000\016\224\000\000\000\000\021\132\000\000\000\000sH\021\136\000\000\000\000$\190\164L\022*\000\000\000\000\000\000\016|\0114\166\236\0220\000\000\000\000\000\000\000\000\000\000\000\000\021\178\000\000\024\220\000\000\021\194\000\000\177\148\000\000\r\224\000\000\000\000\021\198\000\000\000\000\0008\000\000\004\202\000\000\000\000\000\000\006\168\000\000\023.\000\000\015n\000\000j6\000\000\0040\000\000\tD\000\000\021\202\000\000\131\142\026J\000\000\000\000\r$\021\218\000\000\000\000\021\212\014\028o\244\006&\200.\000\000\000\000\000\000\000\000\000\000\163\226\000\000\000\000\022z\000\000\190\238\000\000\017\244\022\130\000\000\022\132\000\000p\168p\168\209\214\209\214\000\000\000\000\184\254\209\214\000\000\000\000\000\000\184\254\209\214\022\022\000\000\022\028\000\000"), (16, "\003\193\003\193\000\006\001\002\001\190\003\193\002\194\002\198\003\193\002\242\002\146\003\193\004I\003\193\022\158\002\254\003\193\027\146\003\193\003\193\003\193\019\202\003\193\003\193\003\193\001\210\005\t\005\t\004V\003\002\003\193\003z\003~\011~\003\193\001\206\003\193\027\150\003\006\000\238\003\166\019\206\003\193\003\193\003\218\003\222\003\193\003\226\003\238\003\250\004\002\007V\007\154\003\193\003\193\002\186\001\206\007r\003\246\003\193\003\193\003\193\b\190\b\194\b\206\b\226\001*\005\174\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\003\193\tV\000\238\003\193\018\174\003\193\003\193\004I\tb\tz\n\030\005\186\005\190\003\193\003\193\003\193\007\209\003\193\003\193\003\193\003\193\002z\002\170\016\198\003\193\0072\003\193\003\193\003\229\003\193\003\193\003\193\003\193\003\193\003\193\005\194\b\214\003\193\003\193\003\193\b\238\004\130\n2\003\229\003\193\003\193\003\193\003\193\0145\0145\027\154\n\138\004\222\0145\n\150\0145\0145\004M\0145\0145\0145\0145\t\138\0145\0145\007q\0145\0145\0145\004A\0145\0145\0145\0145\005\t\0145\019\014\0145\0145\0145\0145\0145\0145\0145\0145\007q\0145\018\182\0145\0052\0145\0145\0145\0145\0145\006\177\0145\0145\000\238\0145\003\254\0145\0145\0145\t\142\t\170\0145\0145\0145\0145\0145\0145\0145\000\238\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\000\238\0145\0145\004M\0145\0145\014\138\003\030\003\186\005\t\0145\0145\0145\0145\0145\005\t\0145\0145\0145\0145\0145\007=\0145\0145\006\209\0145\0145\003\"\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\0145\007=\005\t\0145\0145\0145\0145\001\149\001\149\001\149\001f\004!\001\149\006J\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001v\001\149\001j\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\007\026\001\149\003R\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\b\130\001\149\001\149\001\149\006\209\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\000\238\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\b\186\001\149\001\149\022\142\bb\007\166\001r\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\017\202\t\006\001\149\005\242\001\149\001\149\bf\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\182\001\149\001\149\001\149\001\149\001\149\011\161\011\161\022\250\b\"\014Y\011\161\003V\011\161\011\161\004\197\011\161\011\161\011\161\011\161\001\186\011\161\011\161\014Y\011\161\011\161\011\161\000\238\011\161\011\161\011\161\011\161\023\002\011\161\007\030\011\161\011\161\011\161\011\161\011\161\011\161\011\161\011\161\007\221\011\161\005\t\011\161\005\t\011\161\011\161\011\161\011\161\011\161\t9\011\161\011\161\000\238\011\161\001\130\011\161\011\161\011\161\007\221\005\t\011\161\011\161\011\161\011\161\011\161\011\161\011\161\005\t\011\161\011\161\011\161\011\161\011\161\011\161\011\161\011\161\011\161\011\161\011\161\000\238\011\161\011\161\004\197\011\161\011\161\005\"\b\158\007\166\005\t\011\161\011\161\011\161\011\161\011\161\001\146\011\161\011\161\011\161\011\161\nJ\000\238\n\206\011\161\001\198\011\161\011\161\b\162\011\161\011\161\011\161\011\161\011\161\011\161\011\161\011\161\011\161\011\161\011\161\011\161\011\161\007\221\011\161\011\161\011\161\011\161\011\161\004i\004i\001\253\b\"\b\202\004i\002^\004i\004i\019\178\004i\004i\004i\004i\001f\004i\004i\004!\004i\004i\004i\000\238\004i\004i\004i\004i\002b\004i\000\n\004i\004i\004i\004i\004i\004i\004i\004i\b\130\004i\004\242\004i\007\166\004i\004i\004i\004i\004i\t\229\004i\004i\000\238\004i\005&\004i\004i\004i\001\253\006\150\004i\004i\004i\004i\004i\004i\004i\018B\004i\004i\004i\004i\004i\004i\004i\004i\004i\004i\004i\006\154\nB\n\198\000\238\004i\004i\b\"\028\210\007\166\000\238\004i\004i\004i\004i\004i\001\234\004i\004i\004i\004i\nJ\019\182\n\206\004i\000\238\004i\004i\028\214\004i\004i\004i\004i\004i\004i\004i\004i\004i\004i\004i\004i\004i\000\238\004i\004i\004i\004i\004i\004Y\004Y\022\206\b\"\006\222\004Y\t\229\004Y\004Y\031\131\004Y\004Y\004Y\004Y\005\t\004Y\004Y\007}\004Y\004Y\004Y\000\238\004Y\004Y\004Y\004Y\006\226\004Y\001\238\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\007}\004Y\022\214\004Y\004R\004Y\004Y\004Y\004Y\004Y\006\185\004Y\004Y\005\138\004Y\nE\004Y\004Y\004Y\000\238\007\249\004Y\004Y\004Y\004Y\004Y\004Y\004Y\b\001\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\005\t\nB\n\198\n\138\004Y\004Y\n\150\003*\011\022\031S\004Y\004Y\004Y\004Y\004Y\004b\004Y\004Y\004Y\004Y\nJ\r\249\n\206\004Y\b\198\004Y\004Y\003.\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\r\249\004Y\004Y\004Y\004Y\004Y\011\t\011\t\005\t\005\t\007R\011\t\rn\011\t\011\t\nE\011\t\011\t\011\t\011\t\002\022\011\t\011\t\005\t\011\t\011\t\011\t\004\130\011\t\011\t\011\t\011\t\005\t\011\t\003^\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\001f\011\t\0176\011\t\004!\011\t\011\t\011\t\011\t\011\t\003b\011\t\011\t\001\218\011\t\014\234\011\t\011\t\011\t\026v\000\238\011\t\011\t\011\t\011\t\011\t\011\t\011\t\000\238\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\004R\011\t\011\t\026~\011\t\011\t\017>\0026\007\166\005\t\011\t\011\t\011\t\011\t\011\t\001\222\011\t\011\t\011\t\011\t\011\t\r\253\011\t\011\t\t1\011\t\011\t\bn\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\r\253\005\t\011\t\011\t\011\t\011\t\011\025\011\025\005B\b\"\004n\011\025\014n\011\025\011\025\000\238\011\025\011\025\011\025\011\025\001\206\011\025\011\025\000\238\011\025\011\025\011\025\000\238\011\025\011\025\011\025\011\025\n%\011\025\014r\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\005^\011\025\007\218\011\025\002v\011\025\011\025\011\025\011\025\011\025\tR\011\025\011\025\001\206\011\025\015\018\011\025\011\025\011\025\002\134\004\030\011\025\011\025\011\025\011\025\011\025\011\025\011\025\000\238\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\031c\011\025\011\025\004\"\011\025\011\025\b6\002B\007\166\n%\011\025\011\025\011\025\011\025\011\025\002\222\011\025\011\025\011\025\011\025\011\025\007E\011\025\011\025\004R\011\025\011\025\t6\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\007E\n%\011\025\011\025\011\025\011\025\011\017\011\017\002z\b\"\b\130\011\017\n!\011\017\011\017\bv\011\017\011\017\011\017\011\017\007r\011\017\011\017\000\238\011\017\011\017\011\017\000\238\011\017\011\017\011\017\011\017\001\134\011\017\004\166\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\015\198\011\017\003\186\011\017\002\198\011\017\011\017\011\017\011\017\011\017\t\225\011\017\011\017\003\190\011\017\015:\011\017\011\017\011\017\003F\003J\011\017\011\017\011\017\011\017\011\017\011\017\011\017\t*\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\004f\011\017\011\017\003\150\011\017\011\017\003\178\005\t\007\166\000\238\011\017\011\017\011\017\011\017\011\017\003\194\011\017\011\017\011\017\011\017\011\017\007M\011\017\011\017\004R\011\017\011\017\019\194\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\007M\004r\011\017\011\017\011\017\011\017\n\253\n\253\005\t\b\"\007r\n\253\t\225\n\253\n\253\000\238\n\253\n\253\n\253\n\253\000\238\n\253\n\253\017f\n\253\n\253\n\253\000\238\n\253\n\253\n\253\n\253\001\150\n\253\b\002\n\253\n\253\n\253\n\253\n\253\n\253\n\253\n\253\nA\n\253\r\150\n\253\007\182\n\253\n\253\n\253\n\253\n\253\018Z\n\253\n\253\000\238\n\253\015b\n\253\n\253\n\253\018\014\007\190\n\253\n\253\n\253\n\253\n\253\n\253\n\253\018b\n\253\n\253\n\253\n\253\n\253\n\253\n\253\n\253\n\253\n\253\n\253\002\014\n\253\n\253\r\178\n\253\n\253\003F\003J\007\166\007\205\n\253\n\253\n\253\n\253\n\253\007\170\n\253\n\253\n\253\n\253\n\253\020\166\n\253\n\253\b\198\n\253\n\253\020\n\n\253\n\253\n\253\n\253\n\253\n\253\n\253\n\253\n\253\n\253\n\253\n\253\n\253\nA\001\222\n\253\n\253\n\253\n\253\011\005\011\005\007\230\b\"\007r\011\005\017j\011\005\011\005\018\022\011\005\011\005\011\005\011\005\b\006\011\005\011\005\014\178\011\005\011\005\011\005\000\238\011\005\011\005\011\005\011\005\005~\011\005\t\222\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\005n\011\005\014\182\011\005\016\142\011\005\011\005\011\005\011\005\011\005\022.\011\005\011\005\000\238\011\005\015\134\011\005\011\005\011\005\001\222\005v\011\005\011\005\011\005\011\005\011\005\011\005\011\005\022>\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\003\190\011\005\011\005\r\242\011\005\011\005\003F\021\226\007\166\005\130\011\005\011\005\011\005\011\005\011\005\022\190\011\005\011\005\011\005\011\005\011\005\021\246\011\005\011\005\r\162\011\005\011\005\020&\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\021n\005&\011\005\011\005\011\005\011\005\011\001\011\001\016\146\b\"\007r\011\001\005&\011\001\011\001\000\238\011\001\011\001\011\001\011\001\001\206\011\001\011\001\n\218\011\001\011\001\011\001\000\238\011\001\011\001\011\001\011\001\005&\011\001\016\166\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\n\222\011\001\017\226\011\001\007\242\011\001\011\001\011\001\011\001\011\001\022R\011\001\011\001\r\170\011\001\015\170\011\001\011\001\011\001\002\170\b\026\011\001\011\001\011\001\011\001\011\001\011\001\011\001\022>\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\b\006\011\001\011\001\022\254\011\001\011\001\007*\007B\007\166\029\222\011\001\011\001\011\001\011\001\011\001\r\162\011\001\011\001\011\001\011\001\011\001\005\t\011\001\011\001\tA\011\001\011\001\020B\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\030\238\001\222\011\001\011\001\011\001\011\001\011\r\011\r\025\234\b\"\016\170\011\r\014\150\011\r\011\r\017\230\011\r\011\r\011\r\011\r\014~\011\r\011\r\017\138\011\r\011\r\011\r\000\238\011\r\011\r\011\r\011\r\014\154\011\r\000\238\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\014\130\011\r\025\242\011\r\018\202\011\r\011\r\011\r\011\r\011\r\006\177\011\r\011\r\002\158\011\r\015\214\011\r\011\r\011\r\007J\019r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\005\t\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\004\182\011\r\011\r\023F\011\r\011\r\023.\018\030\007\166\001\206\011\r\011\r\011\r\011\r\011\r\005\002\011\r\011\r\011\r\011\r\011\r\017\142\011\r\011\r\005f\011\r\011\r\020^\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\014\194\000\238\011\r\011\r\011\r\011\r\011\029\011\029\021\234\b\"\029n\011\029\014\226\011\029\011\029\001\206\011\029\011\029\011\029\011\029\018\158\011\029\011\029\014\198\011\029\011\029\011\029\000\238\011\029\011\029\011\029\011\029\014\230\011\029\r\162\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\006\174\011\029\023N\011\029\018\"\011\029\011\029\011\029\011\029\011\029\005\t\011\029\011\029\027\n\011\029\015\250\011\029\011\029\011\029\002\198\007\234\011\029\011\029\011\029\011\029\011\029\011\029\011\029\025\202\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\002\198\011\029\011\029\n\138\011\029\011\029\n\150\005\t\001\002\001\190\011\029\011\029\011\029\011\029\011\029\005\t\011\029\011\029\011\029\011\029\011\029\r\162\011\029\011\029\019\022\011\029\011\029\000\238\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\001\002\001\190\011\029\011\029\011\029\011\029\011\021\011\021\0222\003F\003J\011\021\015\n\011\021\011\021\002\198\011\021\011\021\011\021\011\021\0152\011\021\011\021\007v\011\021\011\021\011\021\n\218\011\021\011\021\011\021\011\021\002\029\011\021\015\014\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\0156\011\021\022\150\011\021\015^\011\021\011\021\011\021\011\021\011\021\021*\011\021\011\021\002\158\011\021\016\030\011\021\011\021\011\021\n\130\n\178\011\021\011\021\011\021\011\021\011\021\011\021\011\021\026\018\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\003\190\011\021\011\021\n\138\011\021\011\021\n\150\022\210\007\166\006V\011\021\011\021\011\021\011\021\011\021\006\193\011\021\011\021\011\021\011\021\011\021\006n\011\021\011\021\000\238\011\021\011\021\030\134\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\001\002\001\190\011\021\011\021\011\021\011\021\011\141\011\141\022\218\b\"\014n\011\141\014\178\011\141\011\141\0313\011\141\011\141\011\141\011\141\006j\011\141\011\141\015\n\011\141\011\141\011\141\000\238\011\141\011\141\011\141\011\141\015\130\011\141\015\246\011\141\011\141\011\141\011\141\011\141\011\141\011\141\011\141\014.\011\141\016z\011\141\006\194\011\141\011\141\011\141\011\141\011\141\006\189\011\141\011\141\027\"\011\141\016:\011\141\011\141\011\141\023\006\014~\011\141\011\141\011\141\011\141\011\141\011\141\011\141\007.\011\141\011\141\011\141\011\141\011\141\011\141\011\141\011\141\011\141\011\141\011\141\001\206\011\141\011\141\015\166\011\141\011\141\025\246\025\238\001\002\001\190\011\141\011\141\011\141\011\141\011\141\014a\011\141\011\141\011\141\011\141\011\141\014\150\011\141\011\141\t=\011\141\011\141\t\249\011\141\011\141\011\141\011\141\011\141\011\141\011\141\011\141\011\141\011\141\011\141\011\141\011\141\015\210\030N\011\141\011\141\011\141\011\141\004U\004U\t\r\014\194\006\181\004U\017z\004U\004U\023N\004U\004U\004U\004U\007>\004U\004U\014\226\004U\004U\004U\000\238\004U\004U\004U\004U\016\026\004U\017~\004U\004U\004U\004U\004U\004U\004U\004U\016n\004U\b\130\004U\000\238\004U\004U\004U\004U\004U\000\238\004U\004U\019\150\004U\000\238\004U\004U\004U\026\130\0152\004U\004U\004U\004U\004U\004U\004U\t\249\004U\004U\004U\004U\004U\004U\004U\004U\004U\004U\004U\023\142\nB\n\198\016\134\004U\004U\007~\031s\007\138\004\242\004U\004U\004U\004U\004U\028\234\004U\004U\004U\004U\nJ\017R\n\206\004U\t5\004U\004U\t\253\004U\004U\004U\004U\004U\004U\004U\004U\004U\004U\004U\004U\004U\017V\004U\004U\004U\004U\004U\002-\002-\018\218\000\238\018*\002-\0045\002\198\002-\000\238\002\146\002-\n~\002-\017\190\002\254\002-\t\166\002-\002-\002-\000\238\002-\002-\002-\001\210\018.\n\182\t\190\003\002\002-\002-\002-\002-\002-\n\190\002-\017\194\003\006\019\154\003\166\027>\002-\002-\002-\002-\002-\029\246\003\238\001\190\004R\002-\030\170\002-\002-\002\186\023\162\017\238\003\246\002-\002-\002-\b\190\b\194\b\206\t\253\014\206\005\174\002-\002-\002-\002-\002-\002-\002-\002-\002-\0262\nB\n\198\017\242\002-\002-\t\234\n\134\n\174\rn\005\186\005\190\002-\002-\002-\n\186\002-\002-\002-\002-\014\214\t1\015R\002-\030\234\002-\002-\023:\002-\002-\002-\002-\002-\002-\005\194\b\214\002-\002-\002-\b\238\004\130\023r\n\202\002-\002-\002-\002-\011u\011u\029\162\b6\027\226\011u\r\142\002\198\011u\000\238\002\146\011u\011u\011u\027\022\002\254\011u\b6\011u\011u\011u\027\162\011u\011u\011u\001\210\023\166\011u\030\174\003\002\011u\011u\011u\011u\011u\011u\011u\b6\003\006\026R\003\166\027\166\011u\011u\011u\011u\011u\028\194\003\238\001\190\000\238\011u\r\190\011u\011u\002\186\026z\r\214\003\246\011u\011u\011u\b\190\b\194\b\206\005\157\011u\005\174\011u\011u\011u\011u\011u\011u\011u\011u\011u\014m\011u\011u\026\178\011u\011u\016\158\005!\016\186\028\246\005\186\005\190\011u\011u\011u\016\218\011u\011u\011u\011u\011u\027\230\011u\011u\018z\011u\011u\027v\011u\011u\011u\011u\011u\011u\005\194\b\214\011u\011u\011u\b\238\004\130\018\162\029\218\011u\011u\011u\011u\011q\011q\002\234\b6\030z\011q\004\014\002\198\011q\018\190\002\146\011q\011q\011q\018\194\002\254\011q\028\198\011q\011q\011q\018\234\011q\011q\011q\001\210\018\254\011q\019\030\003\002\011q\011q\011q\011q\011q\011q\011q\019.\003\006\019B\003\166\019n\011q\011q\011q\011q\011q\019\214\003\238\001\190\019\222\011q\021\"\011q\011q\002\186\028\250\0216\003\246\011q\011q\011q\b\190\b\194\b\206\021:\011q\005\174\011q\011q\011q\011q\011q\011q\011q\011q\011q\006\190\011q\011q\029\234\011q\011q\021\254\022\022\022\166\022\170\005\186\005\190\011q\011q\011q\022\226\011q\011q\011q\011q\011q\030~\011q\011q\022\230\011q\011q\023\014\011q\011q\011q\011q\011q\011q\005\194\b\214\011q\011q\011q\b\238\004\130\023\018\023*\011q\011q\011q\011q\002\129\002\129\023\214\023\218\023\254\002\129\024\002\002\198\002\129\024\018\002\146\002\129\n~\002\129\024\"\002\254\002\129\024.\002\129\002\129\002\129\024b\002\129\002\129\002\129\001\210\001\253\n\182\024f\003\002\002\129\002\129\002\129\002\129\002\129\n\190\002\129\024\182\003\006\024\222\003\166\005\t\002\129\002\129\002\129\002\129\002\129\024\226\003\238\001\190\024\242\002\129\000\n\002\129\002\129\002\186\025B\025b\003\246\002\129\002\129\002\129\b\190\b\194\b\206\025\162\014\206\005\174\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\025\198\005u\002\129\001\253\002\129\002\129\005\t\007\002\002\198\005\t\005\186\005\190\002\129\002\129\002\129\025\214\002\129\002\129\002\129\002\129\025\254\000\238\005\t\002\129\005u\002\129\002\129\005\t\002\129\002\129\002\129\002\129\002\129\002\129\005\194\b\214\002\129\002\129\002\129\b\238\004\130\026\002\005\t\002\129\002\129\002\129\002\129\005\t\007\166\005\t\003\178\005\t\005\t\005\t\005\t\005\t\005\t\005\t\021\150\005\t\000\238\005\t\005\t\026\014\005\t\005\t\005\t\020\026\005\t\005\t\005\t\005\t\005\t\005\t\005\t\005\t\005\t\026\030\005\t\005\t\026:\026J\005\t\005\t\000\238\005\t\005\t\005\t\005\t\005\t\b\"\005\t\005\t\005\t\005\t\005\t\005\t\005\t\005\t\000\238\005\t\005\t\005\t\005\t\005\t\005\t\005\t\005\t\000\238\005\t\005\t\005\t\005\t\005\t\005\t\005\t\005\t\t\225\004^\005\t\026^\026\138\005\t\005\t\005\t\000\238\005\t\000\n\007\213\005\t\005\t\005\t\005\t\005\t\005\t\005\t\005\t\005\t\018n\025\186\005\t\005\t\001\253\001\253\b.\005\t\004R\007\213\026\142\005\t\005\t\007\213\b6\020\030\026*\001\253\000\238\005\t\005\t\005\t\b:\026\154\005\t\005\t\005\t\005\t\005\197\000\129\005\t\000\129\026\170\000\129\000\129\000\129\000\129\000\129\000\129\000\129\005\197\000\129\026\222\000\129\000\129\026\190\000\129\000\129\027\178\028\n\000\129\000\129\0282\000\129\000\129\000\129\000\129\028\154\000\129\004b\000\129\000\129\t\225\028\170\000\129\000\129\r\197\000\129\000\129\000\129\005\197\000\129\n%\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\007\213\029\002\000\129\000\129\r\197\r\197\000\129\000\129\r\197\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\004*\005\197\000\129\n]\005\197\000\129\029\018\000\129\029\030\000\129\002\198\001b\014\001\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\029\130\029\150\029\198\000\129\001z\n]\001\138\000\238\000\222\029\206\002\182\014\001\000\129\030\006\030.\030f\017\154\002R\000\129\000\129\000\129\000\129\030\150\030\162\000\129\000\129\000\129\000\129\002y\002y\002V\003\178\030\183\002y\030\199\002\198\002y\r\197\002\146\002y\nN\002y\030\218\002\254\002y\030\246\002y\002y\002y\019\246\002y\002y\002y\001\210\016r\031\019\016~\003\002\002y\002y\002y\002y\002y\031#\002y\031?\003\006\031\147\003\166\019\250\002y\002y\002y\002y\002y\031\175\003\238\b\210\031\186\002y\031\239\002y\002y\002\186 \003 \011\003\246\002y\002y\002y\b\190\b\194\b\206\nB\n\198\005\174\002y\002y\002y\002y\002y\002y\002y\002y\002y G\nB\n\198 O\002y\002y\000\000\nJ\000\000\n\206\005\186\005\190\002y\002y\002y\000\000\002y\002y\002y\002y\nJ\000\000\n\206\002y\000\000\002y\002y\000\000\002y\002y\002y\002y\002y\002y\005\194\b\214\002y\002y\002y\b\238\004\130\001\253\001\253\002y\002y\002y\002y\002\141\002\141\t\254\019\254\006a\002\141\020\014\002\198\002\141\000\000\000\000\002\141\n\018\002\141\003j\000\000\002\141\003\146\002\141\002\141\002\141\000\n\002\141\002\141\002\141\001\210\000\000\000\000\000\000\000\000\002\141\002\141\002\141\002\141\002\141\000\000\002\141\001\253\001\253\020~\000\000\000\000\002\141\002\141\002\141\002\141\002\141\006a\003\154\001\253\000\000\002\141\001\253\002\141\002\141\002\186\000\000\006\202\000\000\002\141\002\141\002\141\000\000\021\230\000\n\006a\000\000\000\000\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\006\206\nB\n\198\000\000\002\141\002\141\007j\000\000\000\000\002\198\000\000\000\000\002\141\002\141\002\141\001\253\002\141\002\141\002\141\002\141\nJ\018\150\n\206\002\141\002\146\002\141\002\141\001\210\002\141\002\141\002\141\002\141\002\141\002\141\t\205\000\000\002\141\002\141\002\141\001\253\025\170\000\238\000\000\002\141\002\141\002\141\002\141\002\137\002\137\000\000\026\230\003\178\002\137\026\234\000\000\002\137\000\000\002\186\002\137\000\000\002\137\000\000\018\154\002\137\027\026\002\137\002\137\002\137\000\n\002\137\002\137\002\137\000\000\t\205\000\000\000\000\018\166\002\137\002\137\002\137\002\137\002\137\000\000\002\137\001\253\006~\005q\027*\006\"\002\137\002\137\002\137\002\137\002\137\t\205\006\158\001\253\001\253\002\137\006\170\002\137\002\137\005\190\000\000\000\000\006\254\002\137\002\137\002\137\005q\000\000\000\000\000\000\000\000\000\000\002\137\002\137\002\137\002\137\002\137\002\137\002\137\002\137\002\137\000\000\nB\n\198\t\205\002\137\002\137\000\000\004\254\000\000\001\206\t\205\000\000\002\137\002\137\002\137\000\000\002\137\002\137\002\137\002\137\nJ\002\198\n\206\002\137\002\146\002\137\002\137\001\210\002\137\002\137\002\137\002\137\002\137\002\137\t\201\000\000\002\137\002\137\002\137\000\000\022\174\000\000\000\000\002\137\002\137\002\137\002\137\002}\002}\007\189\000\000\002\170\002}\023&\003\190\002}\000\000\002\186\002}\000\000\002}\000\000\021b\002}\023>\002}\002}\002}\007\006\002}\002}\002}\007\189\t\201\000\000\000\000\018\166\002}\002}\002}\002}\002}\000\000\002}\000\000\000\000\000\000\000\000\000\000\002}\002}\002}\002}\002}\t\201\t\n\001\190\001*\002}\000\000\002}\002}\005\190\001\253\001\253\017Z\002}\002}\002}\017n\017\130\017\146\000\000\000\000\000\000\002}\002}\002}\002}\002}\002}\002}\002}\002}\000\000\nB\n\198\t\201\002}\002}\000\n\004\254\007\166\000\000\t\201\000\000\002}\002}\002}\000\000\002}\002}\002}\002}\nJ\000\000\n\206\002}\002\234\002}\002}\020R\002}\002}\002}\002}\002}\002}\001\253\014\142\002}\002}\002}\000\000\005!\000\000\000\000\002}\002}\002}\002}\002%\002%\014\170\b\"\014\186\002%\r\189\003\190\002%\000\000\000\000\002%\000\000\002%\000\000\000\000\002%\b\142\002%\002%\002%\000\238\002%\002%\002%\r\189\r\189\000\000\000\000\r\189\002%\002%\002%\002%\002%\000\000\002%\b\146\005!\000\000\000\000\014\218\002%\002%\002%\002%\002%\000\000\t\n\017\206\000\000\002%\000\000\002%\002%\015\002\000\000\015*\017Z\002%\002%\002%\017n\017\130\017\146\b\130\020V\000\238\002%\002%\002%\002%\002%\002%\002%\002%\002%\000\000\000\238\002%\000\000\002%\002%\000\000\001\253\001\253\021\190\000\238\t%\002%\002%\002%\t%\002%\002%\002%\002%\r\189\000\000\001\253\002%\000\000\002%\002%\000\000\t\254\002%\002%\002%\002%\002%\000\n\n\162\002%\002%\n\018\000\000\n.\000\000\031\159\002%\002%\002%\002%\n\021\n\021\b\150\000\000\000\000\n\021\t%\006~\n\021\000\000\006\"\n\021\015\202\n\021\000\000\001\253\n\021\006\158\n\021\n\021\n\021\006\170\n\021\n\021\n\021\000\000\015\238\t%\016\018\020\238\n\021\n\021\n\021\n\021\n\021\000\000\n\021\000\000\000\000\nY\000\000\000\000\n\021\n\021\n\021\n\021\n\021\000\000\t\017\000\000\000\000\n\021\000\000\n\021\n\021\000\000\000\000\000\000\017\174\n\021\n\021\n\021\nY\000\000\004\254\000\000\000\000\002\254\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\n\021\000\000\000\000\n\021\000\000\n\021\n\021\000\000\003\026\000\000\000\000\000\238\000\000\n\021\n\021\n\021\000\000\n\021\n\021\n\021\n\021\003&\000\000\000\000\n\021\000\000\n\021\n\021\000\000\t\254\n\021\n\021\n\021\n\021\n\021\000\000\000\000\n\021\n\021\n\018\000\000\000\000\000\000\005\174\n\021\n\021\n\021\n\021\002\133\002\133\000\000\000\000\000\000\002\133\r\193\006~\002\133\000\000\006\"\002\133\000\000\002\133\000\000\005\186\002\133\006\158\002\133\002\133\002\133\006\170\002\133\002\133\002\133\r\193\r\193\000\000\000\000\r\193\002\133\002\133\002\133\002\133\002\133\000\000\002\133\t1\000\000\005\194\t1\000\000\002\133\002\133\002\133\002\133\002\133\000\000\000\000\000\000\000\000\002\133\000\000\002\133\002\133\000\000\000\000\000\000\0262\002\133\002\133\002\133\000\000\000\000\000\000\000\000\000\000\000\238\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\000\000\t1\002\133\000\000\002\133\002\133\000\000\000\000\000\000\000\000\000\000\000\000\002\133\002\133\002\133\t1\002\133\002\133\002\133\002\133\r\193\000\000\001\206\002\133\000\000\002\133\002\133\000\000\n\230\002\133\002\133\002\133\002\133\002\133\029\182\000\000\002\133\002\133\002\133\000\000\000\000\t1\000\000\002\133\002\133\002\133\002\133\n\005\n\005\000\000\000\000\000\000\n\005\007\217\004f\n\005\000\000\000\000\n\005\000\000\n\005\000\000\000\000\n\005\002\170\n\005\n\005\n\005\t1\n\005\n\005\n\005\007\217\000\000\000\000\000\000\007\217\n\005\n\005\n\005\n\005\n\005\000\000\n\005\000\000\000\000\000\000\000\000\000\000\n\005\n\005\n\005\n\005\n\005\004\222\004\170\004r\005\161\n\005\000\000\n\005\n\005\000\000\004.\004:\000\000\n\005\n\005\n\005\004F\000\000\000\000\000\000\000\000\000\238\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\n\005\000\000\000\000\n\005\000\000\n\005\n\005\000\000\000\000\000\000\000\000\000\238\t!\n\005\n\005\n\005\t!\n\005\n\005\n\005\n\005\007\217\000\000\000\000\n\005\000\000\n\005\n\005\000\000\t\254\n\005\n\005\n\005\n\005\n\005\000\000\000\000\n\005\n\005\n\018\000\000\r\254\000\000\000\000\n\005\n\005\n\005\n\005\003\189\003\189\000\000\000\000\000\000\003\189\t!\014\006\003\189\000\000\014\018\003\189\000\000\003\189\000\000\000\000\011&\014\030\003\189\011z\003\189\014*\003\189\003\189\003\189\000\000\000\000\t!\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\189\000\000\000\000\007\241\000\000\000\000\003\189\003\189\012\030\0126\003\189\000\000\000\000\000\000\000\000\003\189\000\000\012N\003\189\000\000\000\000\000\000\007\241\003\189\003\189\000\238\007\241\000\000\004\254\000\000\000\000\000\000\003\189\003\189\011>\011\190\012f\012~\012\174\003\189\003\189\000\000\000\000\003\189\000\000\003\189\012\198\000\000\000\000\000\000\000\000\000\238\000\000\003\189\003\189\012\222\000\000\003\189\003\189\003\189\003\189\000\000\000\000\000\000\003\189\000\000\003\189\003\189\000\000\r>\003\189\rV\012\150\003\189\003\189\000\000\000\000\003\189\012\246\003\189\000\000\b\189\000\000\000\000\003\189\003\189\r\014\r&\002\229\002\229\000\000\000\000\000\000\002\229\005\158\b\189\002\229\000\000\006\"\002\229\000\000\002\229\000\000\000\000\002\229\b\189\002\229\002\229\002\229\b\189\002\229\002\229\002\229\000\000\000\000\000\000\000\000\000\000\002\229\002\229\002\229\002\229\002\229\000\000\002\229\000\000\000\000\007\221\000\000\000\000\002\229\002\229\002\229\002\229\002\229\000\000\000\000\000\000\000\000\002\229\000\000\002\229\002\229\000\000\000\000\000\000\007\221\002\229\002\229\002\229\007\221\000\000\000\000\000\000\000\000\000\000\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\000\000\000\000\002\229\000\000\002\229\002\229\000\000\000\000\000\000\000\000\b\217\000\000\002\229\002\229\002\229\000\000\002\229\002\229\002\229\002\229\000\000\000\000\000\000\002\229\000\000\002\229\002\229\000\000\t\254\002\229\002\229\002\229\002\229\002\229\000\000\000\000\002\229\002\229\n\018\000\000\b\217\000\000\000\000\002\229\002\229\002\229\002\229\002\225\002\225\000\000\000\000\000\000\002\225\b\202\b\217\002\225\000\000\006\"\002\225\000\000\002\225\000\000\000\000\002\225\b\217\002\225\002\225\002\225\b\217\002\225\002\225\002\225\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\225\000\000\002\225\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\225\000\000\000\000\000\000\000\000\002\225\000\000\002\225\002\225\000\000\000\000\000\000\000\000\002\225\002\225\002\225\000\000\000\000\000\000\000\000\000\000\000\000\002\225\002\225\011>\002\225\002\225\002\225\002\225\002\225\002\225\000\000\000\000\002\225\000\000\002\225\002\225\000\000\000\000\000\000\000\000\000\238\000\000\002\225\002\225\002\225\000\000\002\225\002\225\002\225\002\225\000\000\000\000\000\000\002\225\000\000\002\225\002\225\000\000\002\225\002\225\002\225\002\225\002\225\002\225\000\000\000\000\002\225\002\225\002\225\000\000\b\245\000\000\000\000\002\225\002\225\002\225\002\225\002\181\002\181\000\000\000\000\000\000\002\181\000\000\006~\002\181\000\000\006\"\002\181\000\000\002\181\000\000\000\000\002\181\b\245\002\181\002\181\002\181\b\245\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\181\000\000\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\181\000\000\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\000\000\000\000\000\000\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\181\002\181\002\181\002\181\002\181\000\000\000\000\002\181\000\000\002\181\002\181\000\000\000\000\000\000\000\000\b\237\000\000\002\181\002\181\002\181\000\000\002\181\002\181\002\181\002\181\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\t\254\002\181\002\181\002\181\002\181\002\181\000\000\000\000\002\181\002\181\n\018\000\000\b\237\000\000\000\000\002\181\002\181\002\181\002\181\002\177\002\177\000\000\000\000\000\000\002\177\000\000\014B\002\177\000\000\b\237\002\177\000\000\002\177\000\000\000\000\002\177\b\237\002\177\002\177\002\177\b\237\002\177\002\177\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\177\000\000\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\177\000\000\000\000\000\000\000\000\002\177\000\000\002\177\002\177\000\000\000\000\000\000\000\000\002\177\002\177\002\177\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\011>\002\177\002\177\002\177\002\177\002\177\002\177\000\000\000\000\002\177\000\000\002\177\002\177\000\000\000\000\000\000\000\000\000\238\000\000\002\177\002\177\002\177\000\000\002\177\002\177\002\177\002\177\000\000\000\000\000\000\002\177\000\000\002\177\002\177\000\000\002\177\002\177\002\177\002\177\002\177\002\177\000\000\000\000\002\177\002\177\002\177\000\000\b\185\000\000\000\000\002\177\002\177\002\177\002\177\002\205\002\205\000\000\000\000\000\000\002\205\000\000\b\185\002\205\000\000\006\"\002\205\000\000\002\205\000\000\000\000\002\205\b\185\002\205\002\205\002\205\b\185\002\205\002\205\002\205\000\000\000\000\000\000\000\000\000\000\002\205\002\205\002\205\002\205\002\205\000\000\002\205\000\000\000\000\000\000\000\000\000\000\002\205\002\205\002\205\002\205\002\205\000\000\000\000\000\000\000\000\002\205\000\000\002\205\002\205\000\000\000\000\000\000\000\000\002\205\002\205\002\205\000\000\000\000\000\000\000\000\000\000\000\000\002\205\002\205\002\205\002\205\002\205\002\205\002\205\002\205\002\205\000\000\000\000\002\205\000\000\002\205\002\205\000\000\000\000\000\000\000\000\000\238\000\000\002\205\002\205\002\205\000\000\002\205\002\205\002\205\002\205\000\000\000\000\000\000\002\205\000\000\002\205\002\205\000\000\t\254\002\205\002\205\002\205\002\205\002\205\000\000\000\000\002\205\002\205\n\018\000\000\017*\000\000\000\000\002\205\002\205\002\205\002\205\002\201\002\201\000\000\000\000\000\000\002\201\000\000\014\006\002\201\000\000\014\018\002\201\000\000\002\201\000\000\000\000\011&\014\030\002\201\002\201\002\201\014*\002\201\002\201\002\201\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\011\166\002\201\000\000\002\201\018\150\000\000\000\000\002\146\000\000\002\201\002\201\002\201\002\201\002\201\000\000\000\000\000\000\000\000\002\201\000\000\002\201\002\201\000\000\000\000\000\000\000\000\002\201\002\201\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002\201\011>\011\190\002\201\002\201\002\201\002\201\002\201\000\000\018\154\002\201\000\000\002\201\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\018\166\002\201\002\201\002\201\002\201\000\000\000\000\000\000\002\201\000\000\002\201\002\201\000\000\002\201\002\201\002\201\002\201\002\201\002\201\000\000\000\000\002\201\002\201\002\201\000\000\000\000\005\190\000\000\002\201\002\201\002\201\002\201\002\237\002\237\000\000\000\000\000\000\002\237\000\000\002\014\002\237\000\000\002\146\002\237\000\000\002\237\000\000\000\000\002\237\000\000\002\237\002\237\002\237\029&\002\237\002\237\002\237\000\000\000\000\000\000\000\000\000\000\002\237\002\237\002\237\002\237\002\237\000\000\002\237\018\150\000\000\000\000\002\146\000\000\002\237\002\237\002\237\002\237\002\237\000\000\030\210\001\222\000\000\002\237\000\000\002\237\002\237\000\000\000\000\000\000\000\000\002\237\002\237\002\237\018\166\000\000\000\000\000\000\000\000\000\000\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\000\000\018\154\002\237\000\000\002\237\002\237\000\000\000\000\000\000\000\000\000\000\005\190\002\237\002\237\002\237\018\166\002\237\002\237\002\237\002\237\000\000\000\000\000\000\002\237\000\000\002\237\002\237\000\000\t\254\002\237\002\237\002\237\002\237\002\237\000\000\000\000\002\237\002\237\n\018\000\000\000\000\005\190\000\000\002\237\002\237\002\237\002\237\002\233\002\233\000\000\000\000\000\000\002\233\000\000\003\190\002\233\000\000\000\000\002\233\000\000\002\233\000\000\000\000\002\233\000\000\002\233\002\233\002\233\025\014\002\233\002\233\002\233\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\233\000\000\002\233\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\233\000\000\005\246\000\000\000\000\002\233\000\000\002\233\002\233\000\000\000\000\000\000\004\006\002\233\002\233\002\233\006\210\000\000\004\018\000\000\000\000\000\000\002\233\002\233\011>\002\233\002\233\002\233\002\233\002\233\002\233\000\000\000\000\002\233\000\000\002\233\002\233\000\000\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\000\000\002\233\002\233\002\233\002\233\000\000\000\000\000\000\002\233\000\000\002\233\002\233\000\000\002\233\002\233\002\233\002\233\002\233\002\233\000\000\000\000\002\233\002\233\002\233\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\173\002\173\000\000\000\000\000\000\002\173\000\000\002\198\002\173\000\000\000\000\002\173\000\000\002\173\000\000\000\000\002\173\000\000\002\173\002\173\002\173\000\000\002\173\002\173\002\173\000\000\000\000\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\173\000\000\002\173\000\000\000\000\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\173\000\000\n\210\003\178\000\000\002\173\000\000\002\173\002\173\000\000\000\000\000\000\000\000\002\173\002\173\002\173\014f\000\000\014v\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\173\002\173\002\173\002\173\002\173\000\000\000\000\002\173\000\000\002\173\002\173\000\000\000\000\000\000\000\000\000\000\000\000\002\173\002\173\002\173\000\000\002\173\002\173\002\173\002\173\000\000\000\000\000\000\002\173\000\000\002\173\002\173\000\000\t\254\002\173\002\173\002\173\002\173\002\173\000\000\000\000\002\173\002\173\n\018\000\000\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\169\002\169\000\000\000\000\000\000\002\169\000\000\002\198\002\169\000\000\000\000\002\169\000\000\002\169\000\000\000\000\002\169\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\169\000\000\002\169\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\169\000\000\015V\003\178\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\002\169\015z\000\000\015\158\000\000\000\000\000\000\002\169\002\169\011>\002\169\002\169\002\169\002\169\002\169\002\169\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\002\169\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\002\169\002\169\002\169\002\169\002\169\002\169\000\000\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\197\002\197\000\000\000\000\000\000\002\197\000\000\000\000\002\197\000\000\000\000\002\197\000\000\002\197\000\000\000\000\002\197\000\000\002\197\002\197\002\197\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\002\197\002\197\000\000\002\197\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\002\197\002\197\000\000\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\000\000\000\000\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\000\000\000\000\002\197\000\000\002\197\002\197\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\000\000\002\197\002\197\002\197\002\197\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\t\254\002\197\002\197\002\197\002\197\002\197\000\000\000\000\002\197\002\197\n\018\000\000\000\000\000\000\000\000\002\197\002\197\002\197\002\197\002\193\002\193\000\000\000\000\000\000\002\193\000\000\000\000\002\193\000\000\000\000\002\193\000\000\002\193\000\000\000\000\011&\000\000\002\193\002\193\002\193\000\000\002\193\002\193\002\193\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\011\166\002\193\000\000\002\193\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\193\000\000\000\000\000\000\000\000\002\193\000\000\002\193\002\193\000\000\000\000\000\000\000\000\002\193\002\193\002\193\000\000\000\000\000\000\000\000\000\000\000\000\002\193\002\193\011>\011\190\002\193\002\193\002\193\002\193\002\193\000\000\000\000\002\193\000\000\002\193\002\193\000\000\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\000\000\002\193\002\193\002\193\002\193\000\000\000\000\000\000\002\193\000\000\002\193\002\193\000\000\002\193\002\193\002\193\002\193\002\193\002\193\000\000\000\000\002\193\002\193\002\193\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\189\002\189\000\000\000\000\000\000\002\189\000\000\000\000\002\189\000\000\000\000\002\189\000\000\002\189\000\000\000\000\002\189\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\002\189\002\189\000\000\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\002\189\002\189\000\000\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\000\000\000\000\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\002\189\002\189\002\189\002\189\002\189\002\189\000\000\000\000\002\189\000\000\002\189\002\189\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\002\189\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\t\254\002\189\002\189\002\189\002\189\002\189\000\000\000\000\002\189\002\189\n\018\000\000\000\000\000\000\000\000\002\189\002\189\002\189\002\189\002\185\002\185\000\000\000\000\000\000\002\185\000\000\000\000\002\185\000\000\000\000\002\185\000\000\002\185\000\000\000\000\011&\000\000\002\185\002\185\002\185\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\002\185\011\166\002\185\000\000\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\002\185\002\185\002\185\000\000\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\000\000\000\000\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\185\011>\011\190\002\185\002\185\002\185\002\185\002\185\000\000\000\000\002\185\000\000\002\185\002\185\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\185\002\185\000\000\002\185\002\185\002\185\002\185\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\002\185\002\185\002\185\002\185\002\185\002\185\000\000\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\002\185\002\185\002\185\002\185\003\r\003\r\000\000\000\000\000\000\003\r\000\000\000\000\003\r\000\000\000\000\003\r\000\000\003\r\000\000\000\000\003\r\000\000\003\r\003\r\003\r\000\000\003\r\003\r\003\r\000\000\000\000\000\000\000\000\000\000\003\r\003\r\003\r\003\r\003\r\000\000\003\r\000\000\000\000\000\000\000\000\000\000\003\r\003\r\003\r\003\r\003\r\000\000\000\000\000\000\000\000\003\r\000\000\003\r\003\r\000\000\000\000\000\000\000\000\003\r\003\r\003\r\000\000\000\000\000\000\000\000\000\000\000\000\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\000\000\000\000\003\r\000\000\003\r\003\r\000\000\000\000\000\000\000\000\000\000\000\000\003\r\003\r\003\r\000\000\003\r\003\r\003\r\003\r\000\000\000\000\000\000\003\r\000\000\003\r\003\r\000\000\t\254\003\r\003\r\003\r\003\r\003\r\000\000\000\000\003\r\003\r\n\018\000\000\000\000\000\000\000\000\003\r\003\r\003\r\003\r\003\t\003\t\000\000\000\000\000\000\003\t\000\000\000\000\003\t\000\000\000\000\003\t\000\000\003\t\000\000\000\000\011&\000\000\003\t\003\t\003\t\000\000\003\t\003\t\003\t\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\t\000\000\000\000\000\000\000\000\000\000\003\t\003\t\012\030\0126\003\t\000\000\000\000\000\000\000\000\003\t\000\000\012N\003\t\000\000\000\000\000\000\000\000\003\t\003\t\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\t\003\t\011>\011\190\012f\012~\012\174\003\t\003\t\000\000\000\000\003\t\000\000\003\t\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\t\003\t\012\222\000\000\003\t\003\t\003\t\003\t\000\000\000\000\000\000\003\t\000\000\003\t\003\t\000\000\003\t\003\t\003\t\012\150\003\t\003\t\000\000\000\000\003\t\012\246\003\t\000\000\000\000\000\000\000\000\003\t\003\t\r\014\r&\002\221\002\221\000\000\000\000\000\000\002\221\000\000\000\000\002\221\000\000\000\000\002\221\000\000\002\221\000\000\000\000\002\221\000\000\002\221\002\221\002\221\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\002\221\002\221\000\000\002\221\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\002\221\002\221\000\000\000\000\000\000\000\000\002\221\000\000\002\221\002\221\000\000\000\000\000\000\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\000\000\000\000\002\221\000\000\002\221\002\221\000\000\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\000\000\002\221\002\221\002\221\002\221\000\000\000\000\000\000\002\221\000\000\002\221\002\221\000\000\t\254\002\221\002\221\002\221\002\221\002\221\000\000\000\000\002\221\002\221\n\018\000\000\000\000\000\000\000\000\002\221\002\221\002\221\002\221\002\217\002\217\000\000\000\000\000\000\002\217\000\000\000\000\002\217\000\000\000\000\002\217\000\000\002\217\000\000\000\000\011&\000\000\002\217\002\217\002\217\000\000\002\217\002\217\002\217\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\011\166\002\217\000\000\002\217\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\217\000\000\000\000\000\000\000\000\002\217\000\000\002\217\002\217\000\000\000\000\000\000\000\000\002\217\002\217\002\217\000\000\000\000\000\000\000\000\000\000\000\000\002\217\002\217\011>\011\190\002\217\002\217\002\217\002\217\002\217\000\000\000\000\002\217\000\000\002\217\002\217\000\000\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\000\000\002\217\002\217\002\217\002\217\000\000\000\000\000\000\002\217\000\000\002\217\002\217\000\000\002\217\002\217\002\217\002\217\002\217\002\217\000\000\000\000\002\217\002\217\002\217\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\213\002\213\000\000\000\000\000\000\002\213\000\000\000\000\002\213\000\000\000\000\002\213\000\000\002\213\000\000\000\000\002\213\000\000\002\213\002\213\002\213\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\002\213\002\213\000\000\002\213\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\002\213\002\213\000\000\000\000\000\000\000\000\002\213\000\000\002\213\002\213\000\000\000\000\000\000\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\002\213\002\213\002\213\002\213\002\213\002\213\000\000\000\000\002\213\000\000\002\213\002\213\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\000\000\002\213\002\213\002\213\002\213\000\000\000\000\000\000\002\213\000\000\002\213\002\213\000\000\t\254\002\213\002\213\002\213\002\213\002\213\000\000\000\000\002\213\002\213\n\018\000\000\000\000\000\000\000\000\002\213\002\213\002\213\002\213\002\209\002\209\000\000\000\000\000\000\002\209\000\000\000\000\002\209\000\000\000\000\002\209\000\000\002\209\000\000\000\000\011&\000\000\002\209\002\209\002\209\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\011\166\002\209\000\000\002\209\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\209\000\000\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\000\000\000\000\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\000\000\002\209\002\209\011>\011\190\002\209\002\209\002\209\002\209\002\209\000\000\000\000\002\209\000\000\002\209\002\209\000\000\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\000\000\002\209\002\209\002\209\002\209\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\002\209\002\209\002\209\002\209\002\209\002\209\000\000\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\253\002\253\000\000\000\000\000\000\002\253\000\000\000\000\002\253\000\000\000\000\002\253\000\000\002\253\000\000\000\000\002\253\000\000\002\253\002\253\002\253\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\000\000\002\253\002\253\002\253\002\253\002\253\000\000\002\253\000\000\000\000\000\000\000\000\000\000\002\253\002\253\002\253\002\253\002\253\000\000\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\000\000\000\000\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\000\000\000\000\002\253\000\000\002\253\002\253\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\002\253\000\000\002\253\002\253\002\253\002\253\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\t\254\002\253\002\253\002\253\002\253\002\253\000\000\000\000\002\253\002\253\n\018\000\000\000\000\000\000\000\000\002\253\002\253\002\253\002\253\002\249\002\249\000\000\000\000\000\000\002\249\000\000\000\000\002\249\000\000\000\000\002\249\000\000\002\249\000\000\000\000\011&\000\000\002\249\002\249\002\249\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\002\249\000\000\002\249\000\000\000\000\000\000\000\000\000\000\002\249\002\249\012\030\0126\002\249\000\000\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\000\000\000\000\000\000\002\249\002\249\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\011>\011\190\012f\012~\002\249\002\249\002\249\000\000\000\000\002\249\000\000\002\249\002\249\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\000\000\002\249\002\249\002\249\002\249\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\002\249\002\249\002\249\012\150\002\249\002\249\000\000\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\165\002\165\000\000\000\000\000\000\002\165\000\000\000\000\002\165\000\000\000\000\002\165\000\000\002\165\000\000\000\000\002\165\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\165\000\000\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\165\000\000\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\165\002\165\002\165\002\165\002\165\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\002\165\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\t\254\002\165\002\165\002\165\002\165\002\165\000\000\000\000\002\165\002\165\n\018\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\161\002\161\000\000\000\000\000\000\002\161\000\000\000\000\002\161\000\000\000\000\002\161\000\000\002\161\000\000\000\000\011&\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\011\166\002\161\000\000\002\161\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\161\000\000\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\011>\011\190\002\161\002\161\002\161\002\161\002\161\000\000\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\002\161\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\002\161\002\161\002\161\002\161\002\161\002\161\000\000\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\157\002\157\000\000\000\000\000\000\002\157\000\000\000\000\002\157\000\000\000\000\002\157\000\000\002\157\000\000\000\000\002\157\000\000\002\157\002\157\002\157\000\000\002\157\002\157\002\157\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\002\157\000\000\002\157\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\002\157\000\000\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\002\157\002\157\002\157\000\000\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\002\157\000\000\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\000\000\002\157\002\157\002\157\002\157\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\t\254\002\157\002\157\002\157\002\157\002\157\000\000\000\000\002\157\002\157\n\018\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\002\153\002\153\000\000\000\000\000\000\002\153\000\000\000\000\002\153\000\000\000\000\002\153\000\000\002\153\000\000\000\000\011&\000\000\002\153\002\153\002\153\000\000\002\153\002\153\002\153\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\002\153\000\000\002\153\000\000\000\000\000\000\000\000\000\000\002\153\002\153\012\030\0126\002\153\000\000\000\000\000\000\000\000\002\153\000\000\002\153\002\153\000\000\000\000\000\000\000\000\002\153\002\153\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\153\002\153\011>\011\190\012f\012~\002\153\002\153\002\153\000\000\000\000\002\153\000\000\002\153\002\153\000\000\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\000\000\002\153\002\153\002\153\002\153\000\000\000\000\000\000\002\153\000\000\002\153\002\153\000\000\002\153\002\153\002\153\012\150\002\153\002\153\000\000\000\000\002\153\002\153\002\153\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\003M\003M\000\000\000\000\000\000\003M\000\000\000\000\003M\000\000\000\000\003M\000\000\003M\000\000\000\000\003M\000\000\003M\003M\003M\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\000\000\003M\003M\003M\003M\003M\000\000\003M\000\000\000\000\000\000\000\000\000\000\003M\003M\003M\003M\003M\000\000\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\000\000\000\000\003M\003M\003M\003M\003M\003M\003M\003M\003M\000\000\000\000\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\000\000\000\000\003M\003M\003M\000\000\003M\003M\003M\003M\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\t\254\003M\003M\003M\003M\003M\000\000\000\000\003M\003M\n\018\000\000\000\000\000\000\000\000\003M\003M\003M\003M\003I\003I\000\000\000\000\000\000\003I\000\000\000\000\003I\000\000\000\000\003I\000\000\003I\000\000\000\000\011&\000\000\003I\003I\003I\000\000\003I\003I\003I\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\003I\000\000\003I\000\000\000\000\000\000\000\000\000\000\003I\003I\012\030\0126\003I\000\000\000\000\000\000\000\000\003I\000\000\003I\003I\000\000\000\000\000\000\000\000\003I\003I\003I\000\000\000\000\000\000\000\000\000\000\000\000\003I\003I\011>\011\190\012f\003I\003I\003I\003I\000\000\000\000\003I\000\000\003I\003I\000\000\000\000\000\000\000\000\000\000\000\000\003I\003I\003I\000\000\003I\003I\003I\003I\000\000\000\000\000\000\003I\000\000\003I\003I\000\000\003I\003I\003I\012\150\003I\003I\000\000\000\000\003I\003I\003I\000\000\000\000\000\000\000\000\003I\003I\003I\003I\002\149\002\149\000\000\000\000\000\000\002\149\000\000\000\000\002\149\000\000\000\000\002\149\000\000\002\149\000\000\000\000\002\149\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\002\149\000\000\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\002\149\000\000\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\002\149\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\t\254\002\149\002\149\002\149\002\149\002\149\000\000\000\000\002\149\002\149\n\018\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\002\145\002\145\000\000\000\000\000\000\002\145\000\000\000\000\002\145\000\000\000\000\002\145\000\000\002\145\000\000\000\000\011&\000\000\002\145\002\145\002\145\000\000\002\145\002\145\002\145\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\002\145\000\000\002\145\000\000\000\000\000\000\000\000\000\000\002\145\002\145\012\030\0126\002\145\000\000\000\000\000\000\000\000\002\145\000\000\002\145\002\145\000\000\000\000\000\000\000\000\002\145\002\145\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\145\002\145\011>\011\190\012f\012~\002\145\002\145\002\145\000\000\000\000\002\145\000\000\002\145\002\145\000\000\000\000\000\000\000\000\000\000\000\000\002\145\002\145\002\145\000\000\002\145\002\145\002\145\002\145\000\000\000\000\000\000\002\145\000\000\002\145\002\145\000\000\002\145\002\145\002\145\012\150\002\145\002\145\000\000\000\000\002\145\002\145\002\145\000\000\000\000\000\000\000\000\002\145\002\145\002\145\002\145\003\005\003\005\000\000\000\000\000\000\003\005\000\000\000\000\003\005\000\000\000\000\003\005\000\000\003\005\000\000\000\000\003\005\000\000\003\005\003\005\003\005\000\000\003\005\003\005\003\005\000\000\000\000\000\000\000\000\000\000\003\005\003\005\003\005\003\005\003\005\000\000\003\005\000\000\000\000\000\000\000\000\000\000\003\005\003\005\003\005\003\005\003\005\000\000\000\000\000\000\000\000\003\005\000\000\003\005\003\005\000\000\000\000\000\000\000\000\003\005\003\005\003\005\000\000\000\000\000\000\000\000\000\000\000\000\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\000\000\000\000\003\005\000\000\003\005\003\005\000\000\000\000\000\000\000\000\000\000\000\000\003\005\003\005\003\005\000\000\003\005\003\005\003\005\003\005\000\000\000\000\000\000\003\005\000\000\003\005\003\005\000\000\t\254\003\005\003\005\003\005\003\005\003\005\000\000\000\000\003\005\003\005\n\018\000\000\000\000\000\000\000\000\003\005\003\005\003\005\003\005\003\001\003\001\000\000\000\000\000\000\003\001\000\000\000\000\003\001\000\000\000\000\003\001\000\000\003\001\000\000\000\000\011&\000\000\003\001\003\001\003\001\000\000\003\001\003\001\003\001\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\003\001\000\000\003\001\000\000\000\000\000\000\000\000\000\000\003\001\003\001\012\030\0126\003\001\000\000\000\000\000\000\000\000\003\001\000\000\003\001\003\001\000\000\000\000\000\000\000\000\003\001\003\001\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\001\003\001\011>\011\190\012f\012~\003\001\003\001\003\001\000\000\000\000\003\001\000\000\003\001\003\001\000\000\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\000\000\003\001\003\001\003\001\003\001\000\000\000\000\000\000\003\001\000\000\003\001\003\001\000\000\003\001\003\001\003\001\012\150\003\001\003\001\000\000\000\000\003\001\003\001\003\001\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\002\245\002\245\000\000\000\000\000\000\002\245\000\000\000\000\002\245\000\000\000\000\002\245\000\000\002\245\000\000\000\000\002\245\000\000\002\245\002\245\002\245\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\000\000\002\245\002\245\002\245\002\245\002\245\000\000\002\245\000\000\000\000\000\000\000\000\000\000\002\245\002\245\002\245\002\245\002\245\000\000\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\000\000\000\000\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\000\000\000\000\002\245\000\000\002\245\002\245\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\002\245\000\000\002\245\002\245\002\245\002\245\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\t\254\002\245\002\245\002\245\002\245\002\245\000\000\000\000\002\245\002\245\n\018\000\000\000\000\000\000\000\000\002\245\002\245\002\245\002\245\002\241\002\241\000\000\000\000\000\000\002\241\000\000\000\000\002\241\000\000\000\000\002\241\000\000\002\241\000\000\000\000\011&\000\000\002\241\002\241\002\241\000\000\002\241\002\241\002\241\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\002\241\000\000\002\241\000\000\000\000\000\000\000\000\000\000\002\241\002\241\012\030\0126\002\241\000\000\000\000\000\000\000\000\002\241\000\000\002\241\002\241\000\000\000\000\000\000\000\000\002\241\002\241\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\241\002\241\011>\011\190\012f\012~\002\241\002\241\002\241\000\000\000\000\002\241\000\000\002\241\002\241\000\000\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\000\000\002\241\002\241\002\241\002\241\000\000\000\000\000\000\002\241\000\000\002\241\002\241\000\000\002\241\002\241\002\241\012\150\002\241\002\241\000\000\000\000\002\241\002\241\002\241\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\003\021\003\021\000\000\000\000\000\000\003\021\000\000\000\000\003\021\000\000\000\000\003\021\000\000\003\021\000\000\000\000\003\021\000\000\003\021\003\021\003\021\000\000\003\021\003\021\003\021\000\000\000\000\000\000\000\000\000\000\003\021\003\021\003\021\003\021\003\021\000\000\003\021\000\000\000\000\000\000\000\000\000\000\003\021\003\021\003\021\003\021\003\021\000\000\000\000\000\000\000\000\003\021\000\000\003\021\003\021\000\000\000\000\000\000\000\000\003\021\003\021\003\021\000\000\000\000\000\000\000\000\000\000\000\000\003\021\003\021\003\021\003\021\003\021\003\021\003\021\003\021\003\021\000\000\000\000\003\021\000\000\003\021\003\021\000\000\000\000\000\000\000\000\000\000\000\000\003\021\003\021\003\021\000\000\003\021\003\021\003\021\003\021\000\000\000\000\000\000\003\021\000\000\003\021\003\021\000\000\t\254\003\021\003\021\003\021\003\021\003\021\000\000\000\000\003\021\003\021\n\018\000\000\000\000\000\000\000\000\003\021\003\021\003\021\003\021\003\017\003\017\000\000\000\000\000\000\003\017\000\000\000\000\003\017\000\000\000\000\003\017\000\000\003\017\000\000\000\000\011&\000\000\003\017\003\017\003\017\000\000\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\017\000\000\000\000\000\000\000\000\000\000\003\017\003\017\012\030\0126\003\017\000\000\000\000\000\000\000\000\003\017\000\000\012N\003\017\000\000\000\000\000\000\000\000\003\017\003\017\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\017\011>\011\190\012f\012~\012\174\003\017\003\017\000\000\000\000\003\017\000\000\003\017\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\017\012\222\000\000\003\017\003\017\003\017\003\017\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\003\017\003\017\003\017\012\150\003\017\003\017\000\000\000\000\003\017\012\246\003\017\000\000\000\000\000\000\000\000\003\017\003\017\r\014\r&\003\029\003\029\000\000\000\000\000\000\003\029\000\000\000\000\003\029\000\000\000\000\003\029\000\000\003\029\000\000\000\000\003\029\000\000\003\029\003\029\003\029\000\000\003\029\003\029\003\029\000\000\000\000\000\000\000\000\000\000\003\029\003\029\003\029\003\029\003\029\000\000\003\029\000\000\000\000\000\000\000\000\000\000\003\029\003\029\003\029\003\029\003\029\000\000\000\000\000\000\000\000\003\029\000\000\003\029\003\029\000\000\000\000\000\000\000\000\003\029\003\029\003\029\000\000\000\000\000\000\000\000\000\000\000\000\003\029\003\029\003\029\003\029\003\029\003\029\003\029\003\029\003\029\000\000\000\000\003\029\000\000\003\029\003\029\000\000\000\000\000\000\000\000\000\000\000\000\003\029\003\029\003\029\000\000\003\029\003\029\003\029\003\029\000\000\000\000\000\000\003\029\000\000\003\029\003\029\000\000\t\254\003\029\003\029\003\029\003\029\003\029\000\000\000\000\003\029\003\029\n\018\000\000\000\000\000\000\000\000\003\029\003\029\003\029\003\029\003\025\003\025\000\000\000\000\000\000\003\025\000\000\000\000\003\025\000\000\000\000\003\025\000\000\003\025\000\000\000\000\011&\000\000\003\025\003\025\003\025\000\000\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\003\025\000\000\003\025\000\000\000\000\000\000\000\000\000\000\003\025\003\025\012\030\0126\003\025\000\000\000\000\000\000\000\000\003\025\000\000\012N\003\025\000\000\000\000\000\000\000\000\003\025\003\025\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\025\003\025\011>\011\190\012f\012~\012\174\003\025\003\025\000\000\000\000\003\025\000\000\003\025\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\025\003\025\012\222\000\000\003\025\003\025\003\025\003\025\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\003\025\003\025\003\025\012\150\003\025\003\025\000\000\000\000\003\025\003\025\003\025\000\000\000\000\000\000\000\000\003\025\003\025\r\014\r&\003%\003%\000\000\000\000\000\000\003%\000\000\000\000\003%\000\000\000\000\003%\000\000\003%\000\000\000\000\003%\000\000\003%\003%\003%\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\000\000\003%\003%\003%\003%\003%\000\000\003%\000\000\000\000\000\000\000\000\000\000\003%\003%\003%\003%\003%\000\000\000\000\000\000\000\000\003%\000\000\003%\003%\000\000\000\000\000\000\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\000\000\000\000\003%\003%\003%\003%\003%\003%\003%\003%\003%\000\000\000\000\003%\000\000\003%\003%\000\000\000\000\000\000\000\000\000\000\000\000\003%\003%\003%\000\000\003%\003%\003%\003%\000\000\000\000\000\000\003%\000\000\003%\003%\000\000\t\254\003%\003%\003%\003%\003%\000\000\000\000\003%\003%\n\018\000\000\000\000\000\000\000\000\003%\003%\003%\003%\003!\003!\000\000\000\000\000\000\003!\000\000\000\000\003!\000\000\000\000\003!\000\000\003!\000\000\000\000\011&\000\000\003!\003!\003!\000\000\003!\003!\003!\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\003!\000\000\003!\000\000\000\000\000\000\000\000\000\000\003!\003!\012\030\0126\003!\000\000\000\000\000\000\000\000\003!\000\000\012N\003!\000\000\000\000\000\000\000\000\003!\003!\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003!\003!\011>\011\190\012f\012~\012\174\003!\003!\000\000\000\000\003!\000\000\003!\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003!\003!\012\222\000\000\003!\003!\003!\003!\000\000\000\000\000\000\003!\000\000\003!\003!\000\000\003!\003!\003!\012\150\003!\003!\000\000\000\000\003!\003!\003!\000\000\000\000\000\000\000\000\003!\003!\r\014\r&\n\r\n\r\000\000\000\000\000\000\n\r\000\000\000\000\n\r\000\000\000\000\n\r\000\000\n\r\000\000\000\000\n\r\000\000\n\r\n\r\n\r\000\000\n\r\n\r\n\r\000\000\000\000\000\000\000\000\000\000\n\r\n\r\n\r\n\r\n\r\000\000\n\r\000\000\000\000\000\000\000\000\000\000\n\r\n\r\n\r\n\r\n\r\000\000\000\000\000\000\000\000\n\r\000\000\n\r\n\r\000\000\000\000\000\000\000\000\n\r\n\r\n\r\000\000\000\000\000\000\000\000\000\000\000\000\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\000\000\000\000\n\r\000\000\n\r\n\r\000\000\000\000\000\000\000\000\000\000\000\000\n\r\n\r\n\r\000\000\n\r\n\r\n\r\n\r\000\000\000\000\000\000\n\r\000\000\n\r\n\r\000\000\t\254\n\r\n\r\n\r\n\r\n\r\000\000\000\000\n\r\n\r\n\018\000\000\000\000\000\000\000\000\n\r\n\r\n\r\n\r\n\t\n\t\000\000\000\000\000\000\n\t\000\000\000\000\n\t\000\000\000\000\n\t\000\000\n\t\000\000\000\000\011&\000\000\n\t\n\t\n\t\000\000\n\t\n\t\n\t\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\n\t\000\000\000\000\000\000\000\000\000\000\n\t\n\t\012\030\0126\n\t\000\000\000\000\000\000\000\000\n\t\000\000\012N\n\t\000\000\000\000\000\000\000\000\n\t\n\t\000\238\000\000\000\000\000\000\000\000\000\000\000\000\n\t\n\t\011>\011\190\012f\012~\012\174\n\t\n\t\000\000\000\000\n\t\000\000\n\t\012\198\000\000\000\000\000\000\000\000\000\000\000\000\n\t\n\t\012\222\000\000\n\t\n\t\n\t\n\t\000\000\000\000\000\000\n\t\000\000\n\t\n\t\000\000\n\t\n\t\n\t\012\150\n\t\n\t\000\000\000\000\n\t\012\246\n\t\000\000\000\000\000\000\000\000\n\t\n\t\r\014\r&\003-\003-\000\000\000\000\000\000\003-\000\000\000\000\003-\000\000\000\000\003-\000\000\003-\000\000\000\000\003-\000\000\003-\003-\003-\000\000\003-\003-\003-\000\000\000\000\000\000\000\000\000\000\003-\003-\003-\003-\003-\000\000\003-\000\000\000\000\000\000\000\000\000\000\003-\003-\003-\003-\003-\000\000\000\000\000\000\000\000\003-\000\000\003-\003-\000\000\000\000\000\000\000\000\003-\003-\003-\000\000\000\000\000\000\000\000\000\000\000\000\003-\003-\003-\003-\003-\003-\003-\003-\003-\000\000\000\000\003-\000\000\003-\003-\000\000\000\000\000\000\000\000\000\000\000\000\003-\003-\003-\000\000\003-\003-\003-\003-\000\000\000\000\000\000\003-\000\000\003-\003-\000\000\t\254\003-\003-\003-\003-\003-\000\000\000\000\003-\003-\n\018\000\000\000\000\000\000\000\000\003-\003-\003-\003-\003)\003)\000\000\000\000\000\000\003)\000\000\000\000\003)\000\000\000\000\003)\000\000\003)\000\000\000\000\011&\000\000\003)\003)\003)\000\000\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003)\000\000\000\000\000\000\000\000\000\000\003)\003)\012\030\0126\003)\000\000\000\000\000\000\000\000\003)\000\000\012N\003)\000\000\000\000\000\000\000\000\003)\003)\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003)\003)\011>\011\190\012f\012~\012\174\003)\003)\000\000\000\000\003)\000\000\003)\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003)\003)\012\222\000\000\003)\003)\003)\003)\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\r>\003)\rV\012\150\003)\003)\000\000\000\000\003)\012\246\003)\000\000\000\000\000\000\000\000\003)\003)\r\014\r&\n\001\n\001\000\000\000\000\000\000\n\001\000\000\000\000\n\001\000\000\000\000\n\001\000\000\n\001\000\000\000\000\011&\000\000\n\001\n\001\n\001\000\000\n\001\n\001\n\001\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\n\001\000\000\000\000\000\000\000\000\000\000\n\001\n\001\012\030\0126\n\001\000\000\000\000\000\000\000\000\n\001\000\000\012N\n\001\000\000\000\000\000\000\000\000\n\001\n\001\000\238\000\000\000\000\000\000\000\000\000\000\000\000\n\001\n\001\011>\011\190\012f\012~\012\174\n\001\n\001\000\000\000\000\n\001\000\000\n\001\012\198\000\000\000\000\000\000\000\000\000\000\000\000\n\001\n\001\012\222\000\000\n\001\n\001\n\001\n\001\000\000\000\000\000\000\n\001\000\000\n\001\n\001\000\000\n\001\n\001\n\001\012\150\n\001\n\001\000\000\000\000\n\001\012\246\n\001\000\000\000\000\000\000\000\000\n\001\n\001\r\014\r&\003}\003}\000\000\000\000\000\000\003}\000\000\000\000\003}\000\000\000\000\003}\000\000\003}\000\000\000\000\003}\000\000\003}\003}\003}\000\000\003}\003}\003}\000\000\000\000\000\000\000\000\000\000\003}\003}\003}\003}\003}\000\000\003}\000\000\000\000\000\000\000\000\000\000\003}\003}\003}\003}\003}\000\000\000\000\000\000\000\000\003}\000\000\003}\003}\000\000\000\000\000\000\000\000\003}\003}\003}\000\000\000\000\000\000\000\000\000\000\000\000\003}\003}\003}\003}\003}\003}\003}\003}\003}\000\000\000\000\003}\000\000\003}\003}\000\000\000\000\000\000\000\000\000\000\000\000\003}\003}\003}\000\000\003}\003}\003}\003}\000\000\000\000\000\000\003}\000\000\003}\003}\000\000\t\254\003}\003}\003}\003}\003}\000\000\000\000\003}\003}\n\018\000\000\000\000\000\000\000\000\003}\003}\003}\003}\003y\003y\000\000\000\000\000\000\003y\000\000\000\000\003y\000\000\000\000\003y\000\000\003y\000\000\000\000\011&\000\000\003y\003y\003y\000\000\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003y\000\000\000\000\000\000\000\000\000\000\003y\003y\012\030\0126\003y\000\000\000\000\000\000\000\000\003y\000\000\012N\003y\000\000\000\000\000\000\000\000\003y\003y\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003y\003y\011>\011\190\012f\012~\012\174\003y\003y\000\000\000\000\003y\000\000\003y\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003y\003y\012\222\000\000\003y\003y\003y\003y\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\r>\003y\rV\012\150\003y\003y\000\000\000\000\003y\012\246\003y\000\000\000\000\000\000\000\000\003y\003y\r\014\r&\003\157\003\157\000\000\000\000\000\000\003\157\000\000\000\000\003\157\000\000\000\000\003\157\000\000\003\157\000\000\000\000\003\157\000\000\003\157\003\157\003\157\000\000\003\157\003\157\003\157\000\000\000\000\000\000\000\000\000\000\003\157\003\157\003\157\003\157\003\157\000\000\003\157\000\000\000\000\000\000\000\000\000\000\003\157\003\157\003\157\003\157\003\157\000\000\000\000\000\000\000\000\003\157\000\000\003\157\003\157\000\000\000\000\000\000\000\000\003\157\003\157\003\157\000\000\000\000\000\000\000\000\000\000\000\000\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\000\000\000\000\003\157\000\000\003\157\003\157\000\000\000\000\000\000\000\000\000\000\000\000\003\157\003\157\003\157\000\000\003\157\003\157\003\157\003\157\000\000\000\000\000\000\003\157\000\000\003\157\003\157\000\000\t\254\003\157\003\157\003\157\003\157\003\157\000\000\000\000\003\157\003\157\n\018\000\000\000\000\000\000\000\000\003\157\003\157\003\157\003\157\003\153\003\153\000\000\000\000\000\000\003\153\000\000\000\000\003\153\000\000\000\000\003\153\000\000\003\153\000\000\000\000\011&\000\000\003\153\003\153\003\153\000\000\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\153\000\000\000\000\000\000\000\000\000\000\003\153\003\153\012\030\0126\003\153\000\000\000\000\000\000\000\000\003\153\000\000\012N\003\153\000\000\000\000\000\000\000\000\003\153\003\153\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\153\003\153\011>\011\190\012f\012~\012\174\003\153\003\153\000\000\000\000\003\153\000\000\003\153\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\153\003\153\012\222\000\000\003\153\003\153\003\153\003\153\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\r>\003\153\rV\012\150\003\153\003\153\000\000\000\000\003\153\012\246\003\153\000\000\000\000\000\000\000\000\003\153\003\153\r\014\r&\003\141\003\141\000\000\000\000\000\000\003\141\000\000\000\000\003\141\000\000\000\000\003\141\000\000\003\141\000\000\000\000\003\141\000\000\003\141\003\141\003\141\000\000\003\141\003\141\003\141\000\000\000\000\000\000\000\000\000\000\003\141\003\141\003\141\003\141\003\141\000\000\003\141\000\000\000\000\000\000\000\000\000\000\003\141\003\141\003\141\003\141\003\141\000\000\000\000\000\000\000\000\003\141\000\000\003\141\003\141\000\000\000\000\000\000\000\000\003\141\003\141\003\141\000\000\000\000\000\000\000\000\000\000\000\000\003\141\003\141\003\141\003\141\003\141\003\141\003\141\003\141\003\141\000\000\000\000\003\141\000\000\003\141\003\141\000\000\000\000\000\000\000\000\000\000\000\000\003\141\003\141\003\141\000\000\003\141\003\141\003\141\003\141\000\000\000\000\000\000\003\141\000\000\003\141\003\141\000\000\t\254\003\141\003\141\003\141\003\141\003\141\000\000\000\000\003\141\003\141\n\018\000\000\000\000\000\000\000\000\003\141\003\141\003\141\003\141\003\137\003\137\000\000\000\000\000\000\003\137\000\000\000\000\003\137\000\000\000\000\003\137\000\000\003\137\000\000\000\000\011&\000\000\003\137\003\137\003\137\000\000\003\137\003\137\003\137\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\137\000\000\000\000\000\000\000\000\000\000\003\137\003\137\012\030\0126\003\137\000\000\000\000\000\000\000\000\003\137\000\000\012N\003\137\000\000\000\000\000\000\000\000\003\137\003\137\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\137\003\137\011>\011\190\012f\012~\012\174\003\137\003\137\000\000\000\000\003\137\000\000\003\137\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\137\003\137\012\222\000\000\003\137\003\137\003\137\003\137\000\000\000\000\000\000\003\137\000\000\003\137\003\137\000\000\r>\003\137\rV\012\150\003\137\003\137\000\000\000\000\003\137\012\246\003\137\000\000\000\000\000\000\000\000\003\137\003\137\r\014\r&\003e\003e\000\000\000\000\000\000\003e\000\000\000\000\003e\000\000\000\000\003e\000\000\003e\000\000\000\000\003e\000\000\003e\003e\003e\000\000\003e\003e\003e\000\000\000\000\000\000\000\000\000\000\003e\003e\003e\003e\003e\000\000\003e\000\000\000\000\000\000\000\000\000\000\003e\003e\003e\003e\003e\000\000\000\000\000\000\000\000\003e\000\000\003e\003e\000\000\000\000\000\000\000\000\003e\003e\003e\000\000\000\000\000\000\000\000\000\000\000\000\003e\003e\003e\003e\003e\003e\003e\003e\003e\000\000\000\000\003e\000\000\003e\003e\000\000\000\000\000\000\000\000\000\000\000\000\003e\003e\003e\000\000\003e\003e\003e\003e\000\000\000\000\000\000\003e\000\000\003e\003e\000\000\t\254\003e\003e\003e\003e\003e\000\000\000\000\003e\003e\n\018\000\000\000\000\000\000\000\000\003e\003e\003e\003e\003a\003a\000\000\000\000\000\000\003a\000\000\000\000\003a\000\000\000\000\003a\000\000\003a\000\000\000\000\011&\000\000\003a\003a\003a\000\000\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003a\000\000\000\000\000\000\000\000\000\000\003a\003a\012\030\0126\003a\000\000\000\000\000\000\000\000\003a\000\000\012N\003a\000\000\000\000\000\000\000\000\003a\003a\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003a\003a\011>\011\190\012f\012~\012\174\003a\003a\000\000\000\000\003a\000\000\003a\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003a\003a\012\222\000\000\003a\003a\003a\003a\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\r>\003a\rV\012\150\003a\003a\000\000\000\000\003a\012\246\003a\000\000\000\000\000\000\000\000\003a\003a\r\014\r&\003u\003u\000\000\000\000\000\000\003u\000\000\000\000\003u\000\000\000\000\003u\000\000\003u\000\000\000\000\003u\000\000\003u\003u\003u\000\000\003u\003u\003u\000\000\000\000\000\000\000\000\000\000\003u\003u\003u\003u\003u\000\000\003u\000\000\000\000\000\000\000\000\000\000\003u\003u\003u\003u\003u\000\000\000\000\000\000\000\000\003u\000\000\003u\003u\000\000\000\000\000\000\000\000\003u\003u\003u\000\000\000\000\000\000\000\000\000\000\000\000\003u\003u\003u\003u\003u\003u\003u\003u\003u\000\000\000\000\003u\000\000\003u\003u\000\000\000\000\000\000\000\000\000\000\000\000\003u\003u\003u\000\000\003u\003u\003u\003u\000\000\000\000\000\000\003u\000\000\003u\003u\000\000\t\254\003u\003u\003u\003u\003u\000\000\000\000\003u\003u\n\018\000\000\000\000\000\000\000\000\003u\003u\003u\003u\003q\003q\000\000\000\000\000\000\003q\000\000\000\000\003q\000\000\000\000\003q\000\000\003q\000\000\000\000\011&\000\000\003q\003q\003q\000\000\003q\003q\003q\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003q\000\000\000\000\000\000\000\000\000\000\003q\003q\012\030\0126\003q\000\000\000\000\000\000\000\000\003q\000\000\012N\003q\000\000\000\000\000\000\000\000\003q\003q\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003q\003q\011>\011\190\012f\012~\012\174\003q\003q\000\000\000\000\003q\000\000\003q\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003q\003q\012\222\000\000\003q\003q\003q\003q\000\000\000\000\000\000\003q\000\000\003q\003q\000\000\r>\003q\rV\012\150\003q\003q\000\000\000\000\003q\012\246\003q\000\000\000\000\000\000\000\000\003q\003q\r\014\r&\003m\003m\000\000\000\000\000\000\003m\000\000\000\000\003m\000\000\000\000\003m\000\000\003m\000\000\000\000\003m\000\000\003m\003m\003m\000\000\003m\003m\003m\000\000\000\000\000\000\000\000\000\000\003m\003m\003m\003m\003m\000\000\003m\000\000\000\000\000\000\000\000\000\000\003m\003m\003m\003m\003m\000\000\000\000\000\000\000\000\003m\000\000\003m\003m\000\000\000\000\000\000\000\000\003m\003m\003m\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\003m\003m\003m\003m\003m\003m\003m\000\000\000\000\003m\000\000\003m\003m\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\003m\000\000\003m\003m\003m\003m\000\000\000\000\000\000\003m\000\000\003m\003m\000\000\t\254\003m\003m\003m\003m\003m\000\000\000\000\003m\003m\n\018\000\000\000\000\000\000\000\000\003m\003m\003m\003m\003i\003i\000\000\000\000\000\000\003i\000\000\000\000\003i\000\000\000\000\003i\000\000\003i\000\000\000\000\011&\000\000\003i\003i\003i\000\000\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003i\000\000\000\000\000\000\000\000\000\000\003i\003i\012\030\0126\003i\000\000\000\000\000\000\000\000\003i\000\000\012N\003i\000\000\000\000\000\000\000\000\003i\003i\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003i\003i\011>\011\190\012f\012~\012\174\003i\003i\000\000\000\000\003i\000\000\003i\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003i\003i\012\222\000\000\003i\003i\003i\003i\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\r>\003i\rV\012\150\003i\003i\000\000\000\000\003i\012\246\003i\000\000\000\000\000\000\000\000\003i\003i\r\014\r&\003\133\003\133\000\000\000\000\000\000\003\133\000\000\000\000\003\133\000\000\000\000\003\133\000\000\003\133\000\000\000\000\003\133\000\000\003\133\003\133\003\133\000\000\003\133\003\133\003\133\000\000\000\000\000\000\000\000\000\000\003\133\003\133\003\133\003\133\003\133\000\000\003\133\000\000\000\000\000\000\000\000\000\000\003\133\003\133\003\133\003\133\003\133\000\000\000\000\000\000\000\000\003\133\000\000\003\133\003\133\000\000\000\000\000\000\000\000\003\133\003\133\003\133\000\000\000\000\000\000\000\000\000\000\000\000\003\133\003\133\003\133\003\133\003\133\003\133\003\133\003\133\003\133\000\000\000\000\003\133\000\000\003\133\003\133\000\000\000\000\000\000\000\000\000\000\000\000\003\133\003\133\003\133\000\000\003\133\003\133\003\133\003\133\000\000\000\000\000\000\003\133\000\000\003\133\003\133\000\000\t\254\003\133\003\133\003\133\003\133\003\133\000\000\000\000\003\133\003\133\n\018\000\000\000\000\000\000\000\000\003\133\003\133\003\133\003\133\003\129\003\129\000\000\000\000\000\000\003\129\000\000\000\000\003\129\000\000\000\000\003\129\000\000\003\129\000\000\000\000\011&\000\000\003\129\003\129\003\129\000\000\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\129\000\000\000\000\000\000\000\000\000\000\003\129\003\129\012\030\0126\003\129\000\000\000\000\000\000\000\000\003\129\000\000\012N\003\129\000\000\000\000\000\000\000\000\003\129\003\129\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\129\003\129\011>\011\190\012f\012~\012\174\003\129\003\129\000\000\000\000\003\129\000\000\003\129\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\129\003\129\012\222\000\000\003\129\003\129\003\129\003\129\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\r>\003\129\rV\012\150\003\129\003\129\000\000\000\000\003\129\012\246\003\129\000\000\000\000\000\000\000\000\003\129\003\129\r\014\r&\003\165\003\165\000\000\000\000\000\000\003\165\000\000\000\000\003\165\000\000\000\000\003\165\000\000\003\165\000\000\000\000\003\165\000\000\003\165\003\165\003\165\000\000\003\165\003\165\003\165\000\000\000\000\000\000\000\000\000\000\003\165\003\165\003\165\003\165\003\165\000\000\003\165\000\000\000\000\000\000\000\000\000\000\003\165\003\165\003\165\003\165\003\165\000\000\000\000\000\000\000\000\003\165\000\000\003\165\003\165\000\000\000\000\000\000\000\000\003\165\003\165\003\165\000\000\000\000\000\000\000\000\000\000\000\000\003\165\003\165\003\165\003\165\003\165\003\165\003\165\003\165\003\165\000\000\000\000\003\165\000\000\003\165\003\165\000\000\000\000\000\000\000\000\000\000\000\000\003\165\003\165\003\165\000\000\003\165\003\165\003\165\003\165\000\000\000\000\000\000\003\165\000\000\003\165\003\165\000\000\t\254\003\165\003\165\003\165\003\165\003\165\000\000\000\000\003\165\003\165\n\018\000\000\000\000\000\000\000\000\003\165\003\165\003\165\003\165\003\161\003\161\000\000\000\000\000\000\003\161\000\000\000\000\003\161\000\000\000\000\003\161\000\000\003\161\000\000\000\000\011&\000\000\003\161\003\161\003\161\000\000\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\161\000\000\000\000\000\000\000\000\000\000\003\161\003\161\012\030\0126\003\161\000\000\000\000\000\000\000\000\003\161\000\000\012N\003\161\000\000\000\000\000\000\000\000\003\161\003\161\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\161\003\161\011>\011\190\012f\012~\012\174\003\161\003\161\000\000\000\000\003\161\000\000\003\161\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\161\003\161\012\222\000\000\003\161\003\161\003\161\003\161\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\r>\003\161\rV\012\150\003\161\003\161\000\000\000\000\003\161\012\246\003\161\000\000\000\000\000\000\000\000\003\161\003\161\r\014\r&\003\149\003\149\000\000\000\000\000\000\003\149\000\000\000\000\003\149\000\000\000\000\003\149\000\000\003\149\000\000\000\000\003\149\000\000\003\149\003\149\003\149\000\000\003\149\003\149\003\149\000\000\000\000\000\000\000\000\000\000\003\149\003\149\003\149\003\149\003\149\000\000\003\149\000\000\000\000\000\000\000\000\000\000\003\149\003\149\003\149\003\149\003\149\000\000\000\000\000\000\000\000\003\149\000\000\003\149\003\149\000\000\000\000\000\000\000\000\003\149\003\149\003\149\000\000\000\000\000\000\000\000\000\000\000\000\003\149\003\149\003\149\003\149\003\149\003\149\003\149\003\149\003\149\000\000\000\000\003\149\000\000\003\149\003\149\000\000\000\000\000\000\000\000\000\000\000\000\003\149\003\149\003\149\000\000\003\149\003\149\003\149\003\149\000\000\000\000\000\000\003\149\000\000\003\149\003\149\000\000\t\254\003\149\003\149\003\149\003\149\003\149\000\000\000\000\003\149\003\149\n\018\000\000\000\000\000\000\000\000\003\149\003\149\003\149\003\149\003\145\003\145\000\000\000\000\000\000\003\145\000\000\000\000\003\145\000\000\000\000\003\145\000\000\003\145\000\000\000\000\011&\000\000\003\145\003\145\003\145\000\000\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\145\000\000\000\000\000\000\000\000\000\000\003\145\003\145\012\030\0126\003\145\000\000\000\000\000\000\000\000\003\145\000\000\012N\003\145\000\000\000\000\000\000\000\000\003\145\003\145\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\145\003\145\011>\011\190\012f\012~\012\174\003\145\003\145\000\000\000\000\003\145\000\000\003\145\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\145\003\145\012\222\000\000\003\145\003\145\003\145\003\145\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\r>\003\145\rV\012\150\003\145\003\145\000\000\000\000\003\145\012\246\003\145\000\000\000\000\000\000\000\000\003\145\003\145\r\014\r&\003]\003]\000\000\000\000\000\000\003]\000\000\000\000\003]\000\000\000\000\003]\000\000\003]\000\000\000\000\003]\000\000\003]\003]\003]\000\000\003]\003]\003]\000\000\000\000\000\000\000\000\000\000\003]\003]\003]\003]\003]\000\000\003]\000\000\000\000\000\000\000\000\000\000\003]\003]\003]\003]\003]\000\000\000\000\000\000\000\000\003]\000\000\003]\003]\000\000\000\000\000\000\000\000\003]\003]\003]\000\000\000\000\000\000\000\000\000\000\000\000\003]\003]\003]\003]\003]\003]\003]\003]\003]\000\000\000\000\003]\000\000\003]\003]\000\000\000\000\000\000\000\000\000\000\000\000\003]\003]\003]\000\000\003]\003]\003]\003]\000\000\000\000\000\000\003]\000\000\003]\003]\000\000\t\254\003]\003]\003]\003]\003]\000\000\000\000\003]\003]\n\018\000\000\000\000\000\000\000\000\003]\003]\003]\003]\003Y\003Y\000\000\000\000\000\000\003Y\000\000\000\000\003Y\000\000\000\000\003Y\000\000\003Y\000\000\000\000\011&\000\000\003Y\003Y\003Y\000\000\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003Y\000\000\000\000\000\000\000\000\000\000\003Y\003Y\012\030\0126\003Y\000\000\000\000\000\000\000\000\003Y\000\000\012N\003Y\000\000\000\000\000\000\000\000\003Y\003Y\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\011>\011\190\012f\012~\012\174\003Y\003Y\000\000\000\000\003Y\000\000\003Y\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\012\222\000\000\003Y\003Y\003Y\003Y\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\r>\003Y\rV\012\150\003Y\003Y\000\000\000\000\003Y\012\246\003Y\000\000\000\000\000\000\000\000\003Y\003Y\r\014\r&\n\017\n\017\000\000\000\000\000\000\n\017\000\000\000\000\n\017\000\000\000\000\n\017\000\000\n\017\000\000\000\000\011&\000\000\n\017\n\017\n\017\000\000\n\017\n\017\n\017\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\n\017\000\000\000\000\000\000\000\000\000\000\n\017\n\017\012\030\0126\n\017\000\000\000\000\000\000\000\000\n\017\000\000\012N\n\017\000\000\000\000\000\000\000\000\n\017\n\017\000\238\000\000\000\000\000\000\000\000\000\000\000\000\n\017\n\017\011>\011\190\012f\012~\012\174\n\017\n\017\000\000\000\000\n\017\000\000\n\017\012\198\000\000\000\000\000\000\000\000\000\000\000\000\n\017\n\017\012\222\000\000\n\017\n\017\n\017\n\017\000\000\000\000\000\000\n\017\000\000\n\017\n\017\000\000\n\017\n\017\n\017\012\150\n\017\n\017\000\000\000\000\n\017\012\246\n\017\000\000\000\000\000\000\000\000\n\017\n\017\r\014\r&\ni\ni\000\000\000\000\000\000\ni\000\000\000\000\ni\000\000\000\000\ni\000\000\ni\000\000\000\000\ni\000\000\ni\ni\ni\000\000\ni\ni\ni\000\000\000\000\000\000\000\000\000\000\ni\ni\ni\ni\ni\000\000\ni\000\000\000\000\000\000\000\000\000\000\ni\ni\ni\ni\ni\000\000\000\000\000\000\000\000\ni\000\000\ni\ni\000\000\000\000\000\000\000\000\ni\ni\ni\000\000\000\000\000\000\000\000\000\000\000\000\ni\ni\ni\ni\ni\ni\ni\ni\ni\000\000\000\000\ni\000\000\ni\ni\000\000\000\000\000\000\000\000\000\000\000\000\ni\ni\ni\000\000\ni\ni\ni\ni\000\000\000\000\000\000\ni\000\000\ni\ni\000\000\t\254\ni\ni\ni\ni\ni\000\000\000\000\ni\ni\n\018\000\000\000\000\000\000\000\000\ni\ni\ni\ni\002e\002e\000\000\000\000\000\000\002e\000\000\000\000\002e\000\000\000\000\002e\000\000\002e\000\000\000\000\002e\000\000\002e\002e\002e\000\000\002e\002e\002e\000\000\000\000\000\000\000\000\000\000\002e\002e\002e\002e\002e\000\000\002e\000\000\000\000\000\000\000\000\000\000\002e\002e\002e\002e\002e\000\000\000\000\000\000\000\000\002e\000\000\002e\002e\000\000\000\000\000\000\000\000\002e\002e\002e\000\000\000\000\000\000\000\000\000\000\000\000\002e\002e\002e\002e\002e\002e\002e\002e\002e\000\000\000\000\002e\000\000\002e\002e\000\000\000\000\000\000\000\000\000\000\000\000\002e\002e\002e\000\000\002e\002e\016\238\002e\000\000\000\000\000\000\002e\000\000\002e\002e\000\000\t\254\002e\002e\002e\002e\002e\000\000\000\000\002e\002e\n\018\000\000\000\000\000\000\000\000\002e\002e\002e\002e\002]\002]\000\000\000\000\000\000\002]\000\000\000\000\002]\000\000\000\000\002]\000\000\002]\000\000\000\000\002]\000\000\002]\002]\002]\000\000\002]\002]\002]\000\000\000\000\000\000\000\000\000\000\002]\002]\002]\002]\002]\000\000\002]\000\000\000\000\000\000\000\000\000\000\002]\002]\002]\002]\002]\000\000\000\000\000\000\000\000\002]\000\000\002]\002]\000\000\000\000\000\000\000\000\002]\002]\002]\000\000\000\000\000\000\000\000\000\000\000\000\002]\002]\002]\002]\002]\002]\002]\002]\002]\000\000\000\000\002]\000\000\002]\002]\000\000\000\000\000\000\000\000\000\000\000\000\002]\002]\002]\000\000\002]\002]\002]\002]\000\000\000\000\000\000\002]\000\000\002]\002]\000\000\t\254\002]\002]\002]\002]\002]\000\000\000\000\002]\002]\n\018\000\000\000\000\000\000\000\000\002]\002]\002]\002]\002Y\002Y\000\000\000\000\000\000\002Y\000\000\000\000\002Y\000\000\000\000\002Y\000\000\002Y\000\000\000\000\011&\000\000\002Y\002Y\002Y\000\000\002Y\002Y\002Y\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\002Y\000\000\000\000\000\000\000\000\000\000\002Y\002Y\012\030\0126\002Y\000\000\000\000\000\000\000\000\002Y\000\000\012N\002Y\000\000\000\000\000\000\000\000\002Y\002Y\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002Y\002Y\011>\011\190\012f\012~\012\174\002Y\002Y\000\000\000\000\002Y\000\000\002Y\012\198\000\000\000\000\000\000\000\000\000\000\000\000\002Y\002Y\012\222\000\000\002Y\002Y\002Y\002Y\000\000\000\000\000\000\002Y\000\000\002Y\002Y\000\000\r>\002Y\rV\012\150\002Y\002Y\000\000\000\000\002Y\012\246\002Y\000\000\000\000\000\000\000\000\002Y\002Y\r\014\r&\002a\002a\000\000\000\000\000\000\002a\000\000\000\000\002a\000\000\000\000\002a\000\000\002a\000\000\000\000\011&\000\000\002a\002a\002a\000\000\002a\002a\002a\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\002a\000\000\000\000\000\000\000\000\000\000\002a\002a\012\030\0126\002a\000\000\000\000\000\000\000\000\002a\000\000\012N\002a\000\000\000\000\000\000\000\000\002a\002a\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002a\002a\011>\011\190\012f\012~\012\174\002a\002a\000\000\000\000\002a\000\000\002a\012\198\000\000\000\000\000\000\000\000\000\000\000\000\002a\002a\012\222\000\000\002a\002a\017\n\002a\000\000\000\000\000\000\002a\000\000\002a\002a\000\000\r>\002a\rV\012\150\002a\002a\000\000\000\000\002a\012\246\002a\000\000\000\000\000\000\000\000\002a\002a\r\014\r&\002U\002U\000\000\000\000\000\000\002U\000\000\000\000\002U\000\000\000\000\002U\000\000\002U\000\000\000\000\002U\000\000\002U\002U\002U\000\000\002U\002U\002U\000\000\000\000\000\000\000\000\000\000\002U\002U\002U\002U\002U\000\000\002U\000\000\000\000\000\000\000\000\000\000\002U\002U\002U\002U\002U\000\000\000\000\000\000\000\000\002U\000\000\002U\002U\000\000\000\000\000\000\000\000\002U\002U\002U\000\000\000\000\000\000\000\000\000\000\000\000\002U\002U\002U\002U\002U\002U\002U\002U\002U\000\000\000\000\002U\000\000\002U\002U\000\000\000\000\000\000\000\000\000\000\000\000\002U\002U\002U\000\000\002U\002U\002U\002U\000\000\000\000\000\000\002U\000\000\002U\002U\000\000\t\254\002U\002U\002U\002U\002U\000\000\000\000\002U\002U\n\018\000\000\000\000\000\000\000\000\002U\002U\002U\002U\002Q\002Q\000\000\000\000\000\000\002Q\000\000\000\000\002Q\000\000\000\000\002Q\000\000\002Q\000\000\000\000\011&\000\000\002Q\002Q\002Q\000\000\002Q\002Q\002Q\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\002Q\000\000\000\000\000\000\000\000\000\000\002Q\002Q\012\030\0126\002Q\000\000\000\000\000\000\000\000\002Q\000\000\012N\002Q\000\000\000\000\000\000\000\000\002Q\002Q\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002Q\002Q\011>\011\190\012f\012~\012\174\002Q\002Q\000\000\000\000\002Q\000\000\002Q\012\198\000\000\000\000\000\000\000\000\000\000\000\000\002Q\002Q\012\222\000\000\002Q\002Q\002Q\002Q\000\000\000\000\000\000\002Q\000\000\002Q\002Q\000\000\r>\002Q\rV\012\150\002Q\002Q\000\000\000\000\002Q\012\246\002Q\000\000\000\000\000\000\000\000\002Q\002Q\r\014\r&\003U\003U\000\000\000\000\000\000\003U\000\000\000\000\003U\000\000\000\000\003U\000\000\003U\000\000\000\000\003U\000\000\003U\003U\003U\000\000\003U\003U\003U\000\000\000\000\000\000\000\000\000\000\003U\003U\003U\003U\003U\000\000\003U\000\000\000\000\000\000\000\000\000\000\003U\003U\003U\003U\003U\000\000\000\000\000\000\000\000\003U\000\000\003U\003U\000\000\000\000\000\000\000\000\003U\003U\003U\000\000\000\000\000\000\000\000\000\000\000\000\003U\003U\003U\003U\003U\003U\003U\003U\003U\000\000\000\000\003U\000\000\003U\003U\000\000\000\000\000\000\000\000\000\000\000\000\003U\003U\003U\000\000\003U\003U\003U\003U\000\000\000\000\000\000\003U\000\000\003U\003U\000\000\t\254\003U\003U\003U\003U\003U\000\000\000\000\003U\003U\n\018\000\000\000\000\000\000\000\000\003U\003U\003U\003U\003Q\003Q\000\000\000\000\000\000\003Q\000\000\000\000\003Q\000\000\000\000\003Q\000\000\003Q\000\000\000\000\011&\000\000\003Q\003Q\003Q\000\000\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003Q\000\000\000\000\000\000\000\000\000\000\003Q\003Q\012\030\0126\003Q\000\000\000\000\000\000\000\000\003Q\000\000\012N\003Q\000\000\000\000\000\000\000\000\003Q\003Q\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003Q\003Q\011>\011\190\012f\012~\012\174\003Q\003Q\000\000\000\000\003Q\000\000\003Q\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003Q\003Q\012\222\000\000\003Q\003Q\003Q\003Q\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\r>\003Q\rV\012\150\003Q\003Q\000\000\000\000\003Q\012\246\003Q\000\000\000\000\000\000\000\000\003Q\003Q\r\014\r&\002E\002E\000\000\000\000\000\000\002E\000\000\000\000\002E\000\000\000\000\002E\000\000\002E\000\000\000\000\002E\000\000\002E\002E\002E\000\000\002E\002E\002E\000\000\000\000\000\000\000\000\000\000\002E\002E\002E\002E\002E\000\000\002E\000\000\000\000\000\000\000\000\000\000\002E\002E\002E\002E\002E\000\000\000\000\000\000\000\000\002E\000\000\002E\002E\000\000\000\000\000\000\000\000\002E\002E\002E\000\000\000\000\000\000\000\000\000\000\000\000\002E\002E\002E\002E\002E\002E\002E\002E\002E\000\000\000\000\002E\000\000\002E\002E\000\000\000\000\000\000\000\000\000\000\000\000\002E\002E\002E\000\000\002E\002E\002E\002E\000\000\000\000\000\000\002E\000\000\002E\002E\000\000\002E\002E\002E\002E\002E\002E\000\000\000\000\002E\002E\n\018\000\000\000\000\000\000\000\000\002E\002E\002E\002E\002I\002I\000\000\000\000\000\000\002I\000\000\000\000\002I\000\000\000\000\002I\000\000\002I\000\000\000\000\002I\000\000\002I\002I\002I\000\000\002I\002I\002I\000\000\000\000\006v\000\000\000\000\002I\002I\002I\002I\002I\000\000\002I\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002I\006z\000\000\000\000\000\000\002I\000\000\002I\002I\000\000\000\000\000\000\000\000\002I\002I\002I\000\000\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002I\002I\002I\002I\002I\000\000\007\229\002I\000\000\002I\002I\000\000\000\000\000\000\000\000\000\000\000\238\002I\002I\002I\000\000\002I\002I\002I\002I\007\229\000\000\000\000\002I\007\229\002I\002I\000\000\002I\002I\002I\002I\002I\002I\000\000\tv\002I\002I\n\018\000\000\000\000\000\000\000\000\002I\002I\002I\002I\001\006\000\000\000\006\000\000\000\000\004\193\002\194\002\198\006~\002\242\002\146\006\"\006\138\000\000\000\000\002\254\001\n\000\000\006\158\000\000\002\158\000\000\006\170\000\000\000\000\001\210\000\000\000\000\016\194\003\242\001\018\t\018\t\022\001\030\001\"\007\229\000\000\000\000\003\006\000\000\003\166\000\000\019\162\000\000\t:\t>\000\238\003\226\003\238\003\250\tB\007V\000\000\001:\000\000\002\186\000\000\000\000\003\246\t\254\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\n\018\001>\001B\001F\001J\001N\000\000\004\193\tV\001R\000\000\007\245\000\000\001V\000\000\tb\tz\n\030\005\186\005\190\000\000\006~\001Z\000\000\006\"\t\150\002\014\000\000\001^\000\000\007\245\006\158\000\000\002\018\007\245\006\170\002\026\000\000\001\154\006j\000\000\000\000\005\194\b\214\001\210\001\158\000\000\017J\004\130\n2\001\006\001\166\000\006\001\170\001\174\028\222\002\194\002\198\000\000\002\242\002\146\003Z\000\000\000\000\000\000\002\254\001\n\007\130\001\222\000\000\t\014\000\000\000\238\000\000\002\186\001\210\000\000\000\000\000\000\003\242\001\018\t\018\t\022\001\030\001\"\000\000\000\000\000\000\003\006\000\000\003\166\000\000\t\026\000\000\t:\t>\000\238\003\226\003\238\003\250\tB\007V\007\142\001:\000\000\002\186\b\001\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\006~\005\174\000\000\006\"\001>\001B\001F\001J\001N\b\001\006\158\tV\001R\b\001\006\170\000\000\001V\000\000\tb\tz\n\030\005\186\005\190\000\000\006~\001Z\000\000\006\"\028\226\000\000\000\000\001^\000\000\000\000\006\158\000\000\000\000\000\000\006\170\000\000\000\000\001\154\006\190\000\000\000\000\005\194\b\214\r\245\001\158\000\000\017J\004\130\n2\0055\001\166\000\006\001\170\001\174\000\246\002\194\002\198\002\202\002\242\002\146\000\000\001\253\000\000\r\245\002\254\022\130\002.\003r\000\000\0022\000\000\0055\000\000\003v\001\210\000\000\020\230\b\001\003\002\000\000\003z\003~\002>\000\000\000\000\003\130\000\000\003\006\000\000\003\166\000\n\020z\n\138\003\218\003\222\n\150\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\001\253\003\246\020\246\002J\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\001\253\001\253\000\000\000\000\000\000\000\000\020\254\000\000\tV\000\000\nM\000\000\000\000\000\000\000\000\tb\tz\n\030\005\186\005\190\021\018\021N\000\000\000\000\0055\0055\000\000\000\000\000\000\006\234\000\000\000\000\nM\000\000\000\000\002N\r\245\r\225\000\000\000\000\021\138\025\142\005\194\b\214\000\000\000\141\000\000\b\238\004\130\n2\000\141\000\000\002\198\000\141\000\000\002\146\r\245\n~\000\000\002.\002\254\000\000\0022\000\141\000\000\000\141\000\000\000\141\000\000\000\141\001\210\000\238\n\182\000\000\003\002\002>\000\000\000\000\002F\r\225\n\190\000\141\000\000\003\006\000\000\003\166\000\000\000\141\000\000\000\000\000\000\000\141\000\000\003\238\001\190\018\150\000\141\000\000\002\146\000\141\002\186\000\000\002J\003\246\000\141\000\141\000\141\b\190\b\194\b\206\000\000\014\206\005\174\000\141\000\141\006~\0256\000\000\006\"\000\000\000\141\000\000\000\000\nM\000\141\006\158\000\000\000\000\000\000\006\170\000\000\000\000\005\186\005\190\000\141\000\141\018\154\000\000\000\141\000\141\000\000\000\000\000\000\000\000\000\000\000\000\002N\000\000\000\141\000\000\018\166\000\000\025Z\000\000\000\141\000\141\005\194\b\214\000\000\000\000\000\165\b\238\004\130\000\000\000\141\000\165\000\141\002\198\000\165\000\000\002\146\000\000\n~\000\000\000\000\002\254\005\190\000\000\000\165\000\000\000\165\000\000\000\165\000\000\000\165\001\210\025f\n\182\000\000\003\002\000\000\000\000\000\000\000\000\000\000\n\190\000\165\000\000\003\006\000\000\003\166\000\000\000\165\024\250\000\000\000\000\000\165\000\000\003\238\001\190\000\000\000\165\000\000\000\000\000\165\002\186\000\000\000\000\003\246\000\165\000\165\000\165\b\190\b\194\b\206\000\000\014\206\005\174\000\165\000\165\000\000\000\000\000\000\000\000\000\000\000\165\000\000\000\000\n1\000\165\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\186\005\190\000\165\000\165\000\000\000\000\000\165\000\165\000\000\000\000\nb\n1\000\000\n1\n1\000\000\000\165\000\000\000\000\000\000\000\000\000\000\000\165\000\165\005\194\b\214\000\000\000\000\000\000\b\238\004\130\000\000\000\165\000\000\000\165\000\014\000\018\000\022\000\026\000\030\000\000\000\"\000&\000*\000.\0002\000\000\0006\000:\000\000\000\000\000>\t.\000\000\000\000\000B\000\000\018\150\000\000\002\014\002\146\000\000\000F\000\000\000\000\000\000\002\018\000\000\000J\002\026\000N\000R\000V\000Z\000^\000b\000f\001\210\000\000\000\000\000j\000n\000\000\000r\000\000\000v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\t\254\000\000\018\154\000z\007\130\001\222\000~\000\130\n1\000\000\n\018\002\186\000\000\000\134\000\138\000\142\018\166\001\253\025:\000\000\001\253\000\146\000\150\000\154\000\158\000\000\000\162\000\166\000\170\000\000\000\000\000\000\000\174\000\178\000\182\000\000\000\000\000\000\000\186\007\142\000\190\000\194\005\190\000\n\000\000\000\000\000\000\000\000\000\198\000\000\000\202\000\000\025F\000\000\000\000\004\145\000\206\000\210\001\253\000\214\004\145\003\022\002\198\004\145\000\000\002\146\000\000\007&\000\000\024\250\002\254\001\253\001\253\004\145\000\000\000\000\000\000\004\145\000\000\004\145\001\210\000\000\007F\000\000\000\000\001\253\001\253\003\026\000\000\000\000\t\134\004\145\000\000\000\000\000\000\000\000\000\000\004\145\001\253\000\000\003&\000\000\000\000\t\178\001\190\001\253\004\145\000\000\001\253\004\145\002\186\001\253\000\n\004\006\004\145\004\145\011\245\004\n\001\253\004\018\000\000\t\194\005\174\000\000\001\253\000\000\000\000\001\253\001\253\000\000\004\145\004\145\000\000\000\000\005\178\000\000\000\000\000\000\000\000\000\000\001\253\000\000\005\186\005\190\004\145\004\145\rz\000\000\004\145\004\145\000\000\001\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\245\n\138\000\000\011\245\r\130\004\145\005\194\000\000\000\000\000\000\011\245\000\000\004\130\000\000\011\245\000\006\004\145\000\000\000\246\002\194\002\198\002\202\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\005U\000\000\000\000\000\000\001\253\000\000\003v\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\003\130\000\000\003\006\000\000\003\166\000\000\020z\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\000\000\003\246\020\246\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\254\000\000\tV\000\000\031\194\000\000\000\000\000\000\000\000\tb\tz\n\030\005\186\005\190\021\018\021N\000\000\000\006\031\227\017\218\000\246\002\194\002\198\002\202\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000 \018\000\000\025\142\005\194\b\214\000\000\003v\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\003\130\000\000\003\006\000\000\003\166\000\000\020z\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\000\000\003\246\020\246\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\254\000\000\tV\000\000\031\194\000\000\000\000\000\000\000\000\tb\tz\n\030\005\186\005\190\021\018\021N\000\000\000\000\005]\000\000\000\000\000\000\000\000\000\000\001\006\000\000\000\000\000\000\000\000\000\000\003\022\002\198\006F\000\000\002\146\025\142\005\194\b\214\000\000\002\254\001\n\b\238\004\130\n2\002\158\000\000\000\000\000\000\000\000\001\210\003\158\000\000\002\198\001\014\001\018\001\022\0036\001\030\001\"\003j\000\000\000\000\003\146\000\000\000\000\b\134\003:\000\000\001.\006f\001\210\000\000\0032\001\190\0016\b\197\000\000\001:\000\000\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\003\154\001>\001B\001F\001J\001N\000\000\002\186\000\000\001R\005\178\000\000\b\197\001V\011\249\000\000\000\000\000\000\005\186\005\190\000\000\006\002\001Z\000\000\000\000\000\000\b\197\000\000\001^\b\197\tJ\000\000\000\000\000\000\000\000\007j\b\197\000\000\001\154\006j\b\197\000\000\005\194\000\000\011\249\001\158\000\000\001\162\004\130\001\006\000\000\001\166\000\000\001\170\001\174\003\022\002\198\t\182\011\249\002\146\000\000\011\249\r\234\000\000\002\254\001\n\000\000\000\000\011\249\002\158\000\000\000\000\011\249\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\0036\001\030\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003:\000\000\001.\006f\000\000\000\000\0032\001\190\0016\000\000\000\000\001:\000\000\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\000\000\001>\001B\001F\001J\001N\000\000\000\000\000\000\001R\005\178\000\000\000\000\001V\000\000\000\000\000\000\000\000\005\186\005\190\000\000\006\002\001Z\000\000\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\154\006j\000\000\000\000\005\194\000\000\000\000\001\158\000\000\001\162\004\130\000\000\n5\001\166\000\006\001\170\001\174\000\246\002\194\002\198\002\"\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\021\142\000\000\n5\000\000\n5\n5\003v\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\021\146\000\000\003\006\000\000\003\166\000\000\021\186\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\000\000\003\246\020\246\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022Z\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\nR\tz\n\030\005\186\005\190\021\018\022n\000\000\000\000\005)\000\000\000\000\000\000\000\000\000\000\n-\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\022~\005\194\b\214\n5\002\254\000\000\b\238\004\130\n2\n-\000\000\n-\n-\000\000\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\001\165\003\006\000\000\003\166\000\000\001\165\000\000\003\218\003\222\n\154\003\226\003\238\003\250\004\002\007V\001\202\001\206\r\134\002\186\000\000\000\000\003\246\000\000\000\000\001\165\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\001\210\001\214\001\230\000\000\000\000\000\000\tV\000\000\000\000\000\000\001\242\000\000\001\165\nR\tz\n\030\005\186\005\190\000\000\000\000\001\165\000\000\000\000\001\246\002\162\001\165\001\165\000\238\002\174\000\000\002\186\004.\004:\000\000\001\165\001\165\000\000\004F\000\000\000\000\005\194\b\214\n-\005\197\005\197\b\238\004\130\n2\005\197\000\000\005\197\005\197\000\000\005\197\004J\005\197\005\197\000\000\000\000\005\197\001\165\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\001\165\005\197\000\000\005\197\000\000\000\000\000\000\000\000\000\000\000\000\005\197\000\000\000\000\000\000\000\000\005\197\005\197\005\197\000\000\000\000\005\197\005\197\005\197\005\197\000\000\005\197\000\000\000\000\005\197\000\000\000\000\000\000\000\000\005\197\005\197\005\197\000\000\000\000\005\197\005\197\005\197\000\000\005\197\005\197\000\000\000\000\000\000\000\000\000\000\005\197\000\000\000\000\000\000\005\197\005\197\000\000\005\197\000\000\005\197\000\000\000\000\000\000\000\000\005\197\005\197\005\197\000\000\005\197\005\197\005\197\005\197\000\000\005\197\005\197\000\000\000\000\000\000\005\197\000\000\005\197\005\197\000\000\000\000\002\166\005\197\000\000\000\000\000\000\024\n\005\197\000\000\012\017\000\000\005\197\012\017\005\197\005\197\012\017\012\017\000\000\005\197\012\017\000\000\012\017\000\000\000\000\012\017\000\000\001*\000\000\012\017\012\017\000\000\012\017\012\017\001\253\012\017\000\000\012\017\000\000\000\000\000\000\001\253\012\017\000\000\001\253\012\017\000\000\000\000\000\000\000\000\000\000\000\000\001\253\012\017\000\000\012\017\000\000\000\000\012\017\012\017\000\n\000\000\000\000\000\000\000\000\012\017\000\000\000\000\012\017\000\000\000\000\012\017\012\017\000\000\012\017\001\253\012\017\012\017\000\000\000\000\000\000\000\000\001\253\000\000\000\000\000\000\000\000\000\000\001\253\012\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\017\012\017\000\000\000\000\012\017\000\000\012\017\000\000\000\000\000\000\000\000\005\222\000\000\001\253\000\000\000\000\001\202\001\206\012\017\012\017\000\000\012\017\012\017\000\000\012\017\000\000\012\017\000\000\012\017\000\000\012\017\000\000\012\017\r\181\r\181\001\210\001\250\001\230\r\181\000\000\001\206\r\181\000\000\000\000\000\000\001\242\003\134\000\000\022\174\004\214\000\000\r\181\r\181\r\181\000\000\r\181\r\181\r\181\001\246\024\006\000\000\023&\000\000\002\174\000\000\002\186\004.\004:\000\000\r\181\000\000\000\000\024\022\000\000\000\000\r\181\r\181\000\000\000\000\r\181\000\000\000\000\002\170\000\000\r\181\000\000\000\000\r\181\000\000\004J\000\000\000\000\r\181\r\181\r\181\000\000\000\000\000\000\000\000\000\000\000\000\r\181\r\181\000\000\000\000\000\000\000\000\000\000\r\181\000\000\000\000\000\000\004\222\000\000\000\000\r\181\000\000\000\000\000\000\000\000\000\000\000\000\r\181\r\181\r\181\000\000\r\181\r\181\000\000\005!\000\000\000\000\000\000\000\000\005!\000\000\r\181\005!\r\181\r\181\000\000\000\000\000\000\r\181\000\000\000\000\000\000\005!\r\181\000\000\000\000\005!\r\181\005!\r\181\r\181\n\029\n\029\000\000\000\000\005!\n\029\000\000\001\206\n\029\005!\000\000\000\000\000\000\000\000\000\000\005!\n\029\000\000\n\029\n\029\n\029\004R\n\029\n\029\n\029\000\000\000\000\005!\005!\000\000\000\000\000\000\005!\002\234\000\000\000\000\n\029\000\000\000\000\000\000\000\000\000\000\n\029\n\029\000\000\000\000\n\029\000\000\005!\002\170\005!\n\029\000\000\000\000\n\029\000\000\000\000\000\000\005!\n\029\n\029\n\029\005!\005!\002\234\000\238\005!\005!\n\029\n\029\000\000\000\000\004b\005!\000\000\n\029\000\000\000\000\000\000\004\222\000\000\000\000\n\029\005!\000\000\000\000\000\000\000\000\025\014\n\029\n\029\n\029\000\000\n\029\n\029\000\000\007\233\000\000\005!\000\000\000\000\007\233\000\000\n\029\007\233\n\029\n\029\005!\000\000\000\000\n\029\000\000\000\000\000\000\007\233\n\029\000\000\000\000\007\233\n\029\007\233\n\029\n\029\n\025\n\025\000\000\000\000\000\000\n\025\000\000\001\206\n\025\007\233\000\000\000\000\000\000\000\000\000\000\007\233\n\025\000\000\n\025\n\025\n\025\000\000\n\025\n\025\n\025\000\000\000\000\007\233\000\000\000\000\000\000\000\000\007\233\007\233\000\000\000\000\n\025\000\000\000\000\000\000\000\000\000\000\n\025\n\025\000\000\000\000\n\025\000\000\007\233\002\170\000\000\n\025\000\000\000\000\n\025\000\000\000\000\000\000\000\000\n\025\n\025\n\025\007\233\007\233\020\142\000\000\007\233\007\233\n\025\n\025\000\000\000\000\000\000\000\000\000\000\n\025\000\000\000\000\000\000\004\222\021\206\000\000\n\025\007\233\000\000\000\000\000\000\000\000\000\000\n\025\n\025\n\025\000\000\n\025\n\025\000\000\000\000\000\000\001\253\001\253\000\000\000\000\001\253\n\025\001\253\n\025\n\025\001\253\001\253\001\253\n\025\001\253\001\253\001\253\001\253\n\025\000\000\001\253\000\000\n\025\001\253\n\025\n\025\001\253\001\253\000\n\000\000\001\253\000\n\001\253\000\000\001\253\000\n\001\253\001\253\000\n\000\000\001\253\007Z\000\n\001\253\001\253\001\253\001\253\018J\001\253\001\253\001\253\001\253\001\253\001\253\001\253\001\253\001\253\001\253\001\253\001\253\001\253\001\253\001\253\001\253\001\253\000\000\001\253\001\253\001\253\001\253\001\253\001\253\001\253\000\000\001\253\000\000\000\000\000\000\000\000\000\000\000\000\001\253\001\253\001\253\001\253\001\253\000\000\000\000\000\000\001\253\001\253\001\253\001\253\001\253\000\000\018\138\001\253\000\000\000\000\001\253\000\000\000\000\000\000\000\000\000\000\001\253\001\253\000\000\000\000\000\000\001\253\000\000\001\253\000\000\007^\000\000\001\253\001\253\000\000\000y\000\000\001\253\001\253\001\253\000y\000\000\000y\000y\000\000\000\000\000\000\000\000\000\000\r\245\r\225\000y\000\000\000y\000y\000\000\000\000\000y\000y\000y\000\000\t\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\245\000\000\000y\002.\000\000\000\000\0022\000\000\000y\000y\000\000\000\000\000y\002:\000\000\000y\000\000\000y\000\000\002>\000y\000\000\002F\r\225\000\000\000y\000y\000y\000\000\000\000\000\000\000\000\000\000\000\000\000y\000y\000\000\000\000\000\000\000\000\000\000\000y\000y\000\000\000\000\000y\002J\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000y\000y\000y\000\000\000y\000y\000\000\000\000\000\000\007u\t\181\000A\000\000\000\000\000y\000A\000A\000y\000A\000A\000\000\000y\000\000\000\000\000A\000\000\000y\000\000\000\000\007u\000y\000\000\000y\000\000\000A\002N\000\000\000\000\000A\000\000\000A\000A\000\000\000\000\000\000\000\000\000\000\000A\000\000\000A\000\000\000\000\000\000\000A\000A\000\000\000A\000A\000A\000A\000A\000\000\000\000\000\000\000A\000\000\000\000\000A\000\000\000\000\000\000\000A\000A\000A\000A\000\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\000\000\000\000\000\000\r\245\r\225\000\000\000A\000A\000A\000A\000A\000\000\007q\000\000\000=\000\000\000\000\000\000\000=\000=\000\000\000=\000=\r\245\000\000\000\000\002.\000=\000\000\0022\000\000\000\000\007q\000A\000A\000\000\002\214\000=\000A\000A\000A\000=\002>\000=\000=\002F\r\225\000\000\000\000\000\000\000=\000\000\000=\000\000\000\000\000\000\000=\000=\000\000\000=\000=\000=\000=\000=\000\000\000\000\000\000\000=\000\000\002J\000=\000\000\000\000\000\000\000=\000=\000=\000=\000\000\000=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=\000\000\000\000\000\000\000\000\000\000\000\000\000=\000=\000=\000=\000=\000\000\007\129\000\000\r}\000\000\000\000\000\000\r}\r}\000\000\r}\r}\002N\000\000\000\000\000\000\r}\000\000\000\000\000\000\000\000\007\129\000=\000=\000\000\000\000\r}\000=\000=\000=\r}\000\000\r}\r}\000\000\000\000\000\000\000\000\000\000\r}\000\000\r}\000\000\000\000\000\000\r}\r}\000\000\r}\r}\r}\r}\r}\000\000\000\000\000\000\r}\000\000\000\000\r}\000\000\000\000\000\000\r}\r}\r}\r}\000\000\r}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r}\000\000\000\000\000\000\000\000\000\000\000\000\r}\r}\r}\r}\r}\000\000\007}\000\000\ry\000\000\000\000\000\000\ry\ry\000\000\ry\ry\000\000\000\000\000\000\000\000\ry\000\000\000\000\000\000\000\000\007}\r}\r}\000\000\000\000\ry\r}\r}\r}\ry\000\000\ry\ry\000\000\000\000\000\000\000\000\000\000\ry\000\000\ry\000\000\000\000\000\000\ry\ry\000\000\ry\ry\ry\ry\ry\000\000\000\000\000\000\ry\000\000\000\000\ry\000\000\000\000\000\000\ry\ry\ry\ry\000\000\ry\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ry\000\000\000\000\000\000\000\000\000\000\000\000\ry\ry\ry\ry\ry\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\ry\ry\000\000\000\000\001\210\ry\ry\ry\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\014A\003\006\000\000\003\166\000\000\014A\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\007\181\007\181\000\000\002\186\000\000\000\000\003\246\000\000\000\000\014A\b\190\b\194\b\206\b\226\000\000\005\174\004>\000\000\000\000\007\181\007\181\007\181\000\000\000\000\000\000\tV\000\000\000\000\000\000\007\181\000\000\014A\nR\tz\n\030\005\186\005\190\000\000\000\000\014A\000\000\000\000\007\181\007\181\014A\014A\000\238\007\181\000\000\007\181\007\181\007\181\000\000\014A\014A\000\000\007\181\000\000\000\000\005\194\b\214\019\142\r\185\r\185\b\238\004\130\n2\r\185\000\000\000\000\r\185\000\000\000\000\007\181\000\000\000\000\000\000\000\000\004\154\014A\r\185\r\185\r\185\000\000\r\185\r\185\r\185\000\000\014A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\185\000\000\000\000\000\000\000\000\000\000\r\185\r\185\000\000\000\000\r\185\0042\000\000\007\181\000\000\r\185\000\000\000\000\r\185\000\000\000\000\000\000\000\000\r\185\r\185\r\185\000\000\000\000\000\000\000\000\000\000\000\000\r\185\r\185\000\000\000\000\000\000\000\000\000\000\r\185\000\000\000\000\000\000\r\185\000\000\000\000\r\185\000\000\000\000\000\000\000\000\000\000\000\000\r\185\r\185\r\185\000\000\r\185\r\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\197\r\185\000\006\r\185\r\185\007\197\002\194\002\198\r\185\002\242\002\146\000\000\000\000\r\185\000\000\002\254\000\000\r\185\000\000\r\185\r\185\000\000\004\014\000\000\007\197\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\007\197\003\226\003\238\003\250\004\002\007V\000\000\000\000\007\197\002\186\000\000\000\000\003\246\007\197\007\197\000\238\b\190\b\194\b\206\b\226\000\000\005\174\007\197\007\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\nR\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\000\000\000\007\197\000\000\000\000\000\000\000\000\005!\000\000\000\006\000\000\007\197\005!\002\194\002\198\000\000\002\242\002\146\000\000\005\194\b\214\017^\002\254\000\000\b\238\004\130\n2\027\174\000\000\017r\000\000\005!\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\005!\003\226\003\238\003\250\004\002\007V\000\000\000\000\005!\002\186\000\000\000\000\003\246\005!\002\234\000\000\b\190\b\194\b\206\b\226\000\000\005\174\005!\005!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\nR\tz\n\030\005\186\005\190\000\000\005)\000\000\000\006\000\000\005!\000\246\002\194\002\198\002\"\002\242\002\146\000\000\000\000\005!\000\000\002\254\000\000\000\000\021\142\000\000\000\000\005\194\b\214\000\000\003v\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\021\146\000\000\003\006\000\000\003\166\000\000\021\186\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\000\000\003\246\020\246\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022Z\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\019\230\tz\n\030\005\186\005\190\021\018\022n\000\000\000\006\000\000\005)\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\022~\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\019z\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\205\003\205\000\000\000\000\000\237\003\205\000\000\000\000\003\205\000\237\005\194\b\214\000\000\000\000\000\000\b\238\004\130\n2\003\205\003\205\003\205\000\000\003\205\003\205\003\205\000\000\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\205\000\000\000\000\000\000\000\000\000\000\003\205\004\146\000\000\000\000\003\205\000\000\000\000\000\000\000\237\003\205\003\018\000\000\003\205\000\000\000\000\000\000\000\237\003\205\003\205\003\205\000\000\000\237\000\000\000\000\000\000\000\000\003\205\003\205\000\000\000\000\000\237\000\237\000\000\003\205\000\000\000\000\000\000\003\205\000\000\000\000\003\205\000\000\000\000\000\000\000\000\000\000\000\000\003\205\003\205\003\205\000\000\003\205\003\205\000\000\000\000\000\000\000\237\000\000\000\000\000\000\000\000\003\205\000\000\003\205\003\205\000\237\000\000\000\000\003\205\000\000\005\245\0145\000\000\003\205\000\000\012\029\000\000\003\205\012\029\003\205\003\205\003\022\002\198\000\000\000\000\002\146\000\000\007&\000\000\005\245\002\254\000\000\000\000\005\245\012\029\012\029\000\000\012\029\012\029\000\000\001\210\000\000\007F\000\000\000\000\000\000\000\000\003\026\000\000\002\014\t\134\000\000\000\000\000\000\000\000\000\000\002\018\000\000\012\029\002\026\003&\000\000\007\134\0032\001\190\000\000\000\000\001\210\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\012\029\004\n\000\000\004\018\005\162\t\194\005\174\000\000\003Z\000\000\000\000\000\000\0145\0145\007\130\001\222\000\000\000\000\005\178\001\202\001\206\002\186\000\000\000\000\000\000\005\245\005\186\005\190\000\000\006\002\012\029\0145\012\029\0145\000\000\000\000\000\000\000\000\001\210\001\250\005\245\000\000\000\000\005\245\012\029\000\000\000\000\012\029\012\029\007\142\005\194\000\000\012\029\000\000\012\029\000\000\004\130\012\025\012\029\000\000\012\025\001\246\002\178\003\022\002\198\000\000\002\174\002\146\002\186\004.\004:\000\000\002\254\000\000\000\000\004F\012\025\012\025\000\000\012\025\012\025\000\000\001\210\000\000\001\202\001\206\000\000\000\000\000\000\003\026\000\000\000\000\004J\000\000\000\000\029\190\000\000\000\000\000\000\000\000\012\025\000\000\003&\001\210\001\250\006B\001\190\000\000\000\000\000\000\000\000\029\170\002\186\000\000\000\000\004\006\000\000\000\000\012\025\004\n\000\000\004\018\005\162\000\000\005\174\000\000\001\246\002\170\000\000\000\000\000\000\002\174\000\000\002\186\004.\004:\005\178\000\000\000\000\000\000\004F\000\000\018\178\000\000\005\186\005\190\000\000\006\002\012\025\000\000\012\025\000\000\000\000\000\000\000\000\000\000\000\006\004J\005\249\0145\002\194\002\198\012\025\002\242\002\146\012\025\012\025\000\000\005\194\002\254\012\025\000\000\012\025\000\000\004\130\000\000\012\025\005\249\000\000\001\210\000\000\005\249\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\0145\0145\017\246\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\005\249\002\194\002\198\000\000\002\242\002\146\0145\000\000\0145\000\000\002\254\000\000\000\000\000\000\000\000\005\249\005\194\b\214\005\249\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\t\238\tz\n\030\005\186\005\190\000\000\005M\000\000\000\006\000\000\000\000\025\182\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\003v\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\026&\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\000\000\003\246\020\246\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\026\202\026\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\n\002\tz\n\030\005\186\005\190\000\000\005E\000\000\000\006\000\000\005M\022\198\002\194\002\198\000\000\002\242\002\146\000\000\000\000\027\206\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\003v\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\022\242\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\000\000\003\246\020\246\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\023\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\nj\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\005E\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\023\130\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\n\234\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011*\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011B\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011f\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011\146\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011\170\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011\194\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011\218\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011\242\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\n\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\"\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012:\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012R\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012j\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\130\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\154\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\178\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\202\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\226\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\250\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\r\018\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\r*\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\rB\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\rZ\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\014\238\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015\022\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015>\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015f\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015\138\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015\174\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015\218\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015\254\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\016\"\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\016>\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\016\222\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\016\242\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\017\014\tz\n\030\005\186\005\190\000\000\018f\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\000\000\001\189\001\189\000\000\002\018\000\000\001\189\002\026\000\000\001\189\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\001\189\001\189\001\189\000\000\001\189\001\189\001\189\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\000\000\001\189\007\130\001\222\000\000\000\000\000\000\001\189\001\189\002\186\000\000\001\189\000\000\000\000\000\000\000\000\001\189\000\000\000\000\001\189\000\000\000\000\000\000\000\000\001\189\001\189\001\189\000\000\000\000\000\000\000\000\000\000\000\000\001\189\001\189\000\000\000\000\007\142\000\000\000\000\001\189\000\245\000\000\000\000\001\189\000\000\000\245\001\189\000\000\000\000\000\000\000\000\000\000\000\000\001\189\001\189\001\189\000\000\001\189\001\189\000\000\000\000\000\000\000\000\000\000\000\245\000\000\000\000\001\189\000\000\001\189\001\189\003\022\002\198\000\000\001\189\002\146\000\000\007&\000\000\001\189\002\254\000\000\000\000\004\254\000\000\001\189\000\245\000\000\022\182\000\000\001\210\000\000\007F\000\000\000\245\000\000\000\000\003\026\000\000\000\245\t\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\245\003&\000\000\000\000\t\178\001\190\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\011\245\004\n\000\000\004\018\000\000\t\194\005\174\000\000\000\245\000\000\000\000\000\000\000\000\000\000\000\000\004\205\000\000\000\245\005\178\000\000\000\000\019\186\000\000\000\000\000\000\000\000\005\186\005\190\002\014\000\000\rz\006Q\006Q\000\000\000\000\002\018\006Q\000\000\002\026\006Q\000\000\000\000\000\000\000\000\011\245\000\000\001\210\011\245\011\245\006Q\005\194\006Q\000\000\006Q\011\245\006Q\004\130\000\000\011\245\004\205\000\000\000\000\000\000\003Z\000\000\r\153\000\000\006Q\r\153\007\130\001\222\000\000\000\000\006Q\006Q\000\000\002\186\000\000\r\153\006Q\000\000\000\000\006Q\000\000\r\153\006Q\000\000\000\000\000\000\000\000\006Q\006Q\006Q\000\000\000\000\000\000\r\153\000\000\000\000\000\000\000\000\000\000\r\153\000\000\007\142\000\000\006Q\006Q\000\000\000\000\006Q\r\153\000\000\001\006\r\153\000\000\000\000\000\000\000\000\r\153\006Q\006Q\006Q\000\000\006Q\006Q\000\000\000\000\000\000\001\n\b6\000\000\000\000\002\158\000\000\r\153\000\000\006Q\000\000\r\153\006Q\006Q\001\014\001\018\001\022\001\026\001\030\001\"\000\000\r\153\r\153\000\000\006Q\r\153\000\000\001&\000\000\001.\0012\031\186\000\000\000\000\000\000\0016\000\000\000\000\001:\000\000\000\000\000\000\r\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\001B\001F\001J\001N\000\000\004\021\004\021\001R\000\000\000\000\004\021\001V\000\000\004\021\000\000\000\000\000\000\000\000\000\000\000\000\001Z\000\000\004\021\004\021\000\000\004\021\001^\004\021\000\000\004\021\004\021\000\000\000\000\000\000\000\000\000\000\001\154\030\214\000\000\000\000\004\021\004\021\004\021\001\158\004\021\001\162\004\021\004\021\004\021\001\166\000\000\001\170\001\174\005\205\000\000\000\000\004\021\000\000\004\021\004\021\000\000\000\000\000\000\000\000\004\021\004\021\004\021\000\000\000\000\000\000\005\209\000\000\000\000\004\021\000\000\000\000\004\021\000\000\000\000\000\000\004\021\004\021\004\021\004\021\004\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\021\004\021\004\021\004\021\004\021\004\021\000\000\004\021\000\000\000\000\005\205\000\000\000\000\000\000\000\000\000\000\000\000\004\021\004\021\004\021\000\000\004\021\004\021\006E\006E\000\000\000\000\005\209\006E\000\000\000\000\006E\004\021\000\000\004\021\004\021\000\000\000\000\004\021\020\002\000\000\006E\000\000\006E\000\000\006E\002\014\006E\000\000\004\021\000\000\000\000\000\000\002\018\000\000\000\000\002\026\000\000\000\000\006E\000\000\000\000\000\000\000\000\001\210\006E\006E\000\000\000\000\000\000\000\000\b\130\000\000\000\000\006E\000\000\000\000\006E\000\000\000\000\000\000\003Z\006E\006E\000\238\000\000\000\000\007\130\001\222\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\000\000\006E\006E\000\000\000\000\006E\000\000\n)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006E\006E\006E\000\000\006E\006E\000\000\000\000\011&\000\000\007\142\014\162\n)\000\000\n)\n)\000\000\006E\000\000\000\000\006E\006E\011\142\011\214\011\238\011\166\012\006\000\000\000\000\001\202\002\142\000\000\006E\002\146\000\000\000\000\012\030\0126\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012N\000\000\000\000\001\210\001\250\001\230\002\150\000\000\000\238\000\000\000\000\000\000\000\000\001\242\001\006\000\000\000\000\011>\011\190\012f\012~\012\174\000\000\000\000\000\000\000\000\002\154\002\162\000\000\012\198\001\n\002\174\000\000\002\186\004.\004:\000\000\000\000\012\222\000\000\024\230\000\000\024\234\001\014\001\018\001\022\001\026\001\030\001\"\000\000\000\000\000\000\r>\000\000\rV\012\150\001&\004J\001.\0012\n)\012\246\000\000\000\000\0016\000\000\005\190\001:\000\000\r\014\r&\000\000\000\000\000\000\000\000\000\000\024\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\001B\001F\001J\001N\000\000\t\141\t\141\001R\024\250\000\000\t\141\001V\000\000\t\141\000\000\000\000\000\000\000\000\000\000\000\000\001Z\020\018\000\000\t\141\000\000\t\141\001^\t\141\002\014\t\141\000\000\000\000\000\000\000\000\000\000\002\018\001\154\030\242\002\026\000\000\000\000\t\141\000\000\001\158\000\000\001\162\001\210\t\141\t\141\001\166\000\000\001\170\001\174\000\000\000\000\000\000\t\141\000\000\000\000\t\141\000\000\000\000\000\000\003Z\t\141\t\141\t\141\000\000\000\000\007\130\001\222\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\000\000\t\141\000\000\000\000\000\000\t\141\014\129\014\129\000\000\000\000\000\000\014\129\000\000\000\000\014\129\t\141\t\141\t\141\000\000\t\141\t\141\000\000\000\000\000\000\014\129\007\142\014\129\000\000\014\129\t\141\014\129\000\000\t\141\001\202\001\206\000\000\t\141\000\000\000\000\000\000\000\000\000\000\014\129\000\000\000\000\004\254\000\000\t\141\014\129\014\129\014\133\014\133\001\210\001\214\004R\014\133\000\000\014\129\014\133\000\000\014\129\000\000\000\000\000\000\000\000\014\129\014\129\014\129\014\133\000\000\014\133\000\000\014\133\000\000\014\133\001\246\002\170\000\000\000\000\000\000\002\174\014\129\002\186\004.\004:\014\129\014\133\000\000\000\000\004F\000\000\018\178\014\133\014\133\000\000\014\129\014\129\014\129\004R\014\129\014\129\014\133\000\000\000\000\014\133\004b\004J\000\000\000\000\014\133\014\133\014\133\014\129\000\000\000\000\000\000\014\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\133\000\000\014\129\000\000\014\133\001\173\000\000\000\000\000\000\000\000\001\173\000\000\001\206\001\173\014\133\014\133\014\133\000\000\014\133\014\133\000\000\t\245\000\000\001\173\004b\000\000\000\000\001\173\000\000\001\173\000\000\014\133\000\000\000\000\000\000\014\133\000\000\000\000\000\000\000\000\000\000\001\173\000\000\000\000\000\000\000\000\014\133\001\173\001\173\000\000\000\000\000\000\000\000\000\000\002\170\000\000\001\173\000\000\000\000\001\173\000\000\000\000\000\000\000\000\001\173\001\173\001\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\173\001\173\000\000\000\000\004\222\003\249\000\000\000\000\000\000\000\000\003\249\000\000\001\206\003\249\001\173\001\173\000\000\000\000\001\173\001\173\000\000\t\241\000\000\003\249\000\000\000\000\000\000\003\249\001\173\003\249\000\000\000\000\000\000\000\000\000\000\001\173\000\000\000\000\000\000\000\000\001\173\003\249\000\000\000\000\000\000\000\000\001\173\003\249\001\169\000\000\000\000\000\000\000\000\000\000\002\170\000\000\003\249\000\000\000\000\003\249\000\000\000\000\000\000\000\000\003\249\003\249\003\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\249\003\249\000\000\000\000\004\222\003\245\000\000\000\000\000\000\000\000\003\245\000\000\001\206\003\245\003\249\003\249\000\000\000\000\003\249\003\249\000\000\t\241\000\000\003\245\000\000\000\000\000\000\003\245\003\249\003\245\000\000\000\000\000\000\000\000\000\000\003\249\000\000\000\000\000\000\000\000\003\249\003\245\000\000\000\000\000\000\000\000\003\249\003\245\001\169\000\000\000\149\000\000\000\000\000\000\002\170\000\149\003\245\000\000\000\149\003\245\000\000\000\000\000\000\000\000\003\245\003\245\003\245\000\000\000\149\000\000\000\149\000\000\000\149\000\000\000\149\000\000\000\000\000\000\000\000\000\000\003\245\003\245\000\000\000\000\004\222\000\000\000\149\000\000\000\000\000\000\000\000\000\000\000\149\000\000\003\245\003\245\000\149\000\000\003\245\003\245\000\000\000\149\000\000\000\000\000\149\000\000\000\000\020:\003\245\000\149\000\149\000\238\000\000\000\000\002\014\003\245\000\000\000\000\000\149\000\149\003\245\002\018\000\000\000\000\002\026\000\149\003\245\000\000\000\217\000\149\000\000\000\000\001\210\000\217\000\000\000\000\000\217\000\000\000\000\000\149\000\149\000\000\000\000\000\149\000\149\000\000\000\217\000\000\000\217\003Z\000\217\000\000\000\217\000\149\000\000\007\130\001\222\000\000\000\000\000\149\000\149\000\000\002\186\000\000\000\217\000\000\000\000\000\000\000\000\000\149\000\217\000\149\000\000\000\000\000\217\000\000\000\000\000\000\000\000\000\217\000\000\000\000\000\217\000\000\000\000\020J\000\000\000\217\000\217\000\238\007\142\000\000\002\014\000\000\000\000\000\000\000\217\000\217\000\000\002\018\000\000\000\000\002\026\000\217\000\000\000\000\000\157\000\217\000\000\000\000\001\210\000\157\000\000\000\000\000\157\000\000\000\000\000\217\000\217\000\000\000\000\000\217\000\217\000\000\000\157\000\000\000\157\003Z\000\157\000\000\000\157\000\217\000\000\007\130\001\222\000\000\000\000\000\217\000\217\000\000\002\186\000\000\000\157\000\000\000\000\000\000\000\000\000\217\000\157\000\217\000\000\000\000\000\157\000\000\000\000\000\000\000\000\000\157\000\000\000\000\000\157\000\000\000\000\000\000\000\000\000\157\000\157\000\238\007\142\000\000\000\000\000\000\000\000\000\000\000\157\000\157\000\000\000\000\000\000\000\000\000\000\000\157\000\000\000\000\000\153\000\157\000\000\000\000\000\000\000\153\000\000\000\000\000\153\000\000\000\000\000\157\000\157\000\000\000\000\000\157\000\157\000\000\000\153\000\000\000\153\000\000\000\153\000\000\000\153\000\157\000\000\000\000\000\000\000\000\000\000\000\157\000\157\000\000\000\000\000\000\000\153\000\000\000\000\000\000\000\000\000\157\000\153\000\157\000\000\000\000\000\153\000\000\000\000\000\000\000\000\000\153\000\000\000\000\000\153\000\000\000\000\000\000\000\000\000\153\000\153\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\153\000\153\000\000\000\000\000\000\000\000\000\000\000\153\000\000\000\000\001\137\000\153\000\000\000\000\000\000\001\137\000\000\000\000\001\137\000\000\000\000\000\153\000\153\000\000\000\000\000\153\000\153\000\000\001\137\000\000\000\000\000\000\001\137\000\000\001\137\000\153\000\000\000\000\000\000\000\000\000\000\000\153\000\153\000\000\000\000\000\000\001\137\001\137\000\000\000\000\000\000\000\153\001\137\000\153\000\000\000\000\000\000\000\000\005\205\000\000\000\000\001\137\000\000\000\000\001\137\000\000\000\000\000\000\000\000\001\137\001\137\001\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\137\000\000\000\000\000\000\001\137\014}\014}\000\000\000\000\000\000\014}\000\000\000\000\014}\001\137\001\137\000\000\000\000\001\137\001\137\000\000\000\000\000\000\014}\005\205\014}\000\000\014}\001\137\014}\000\000\000\000\000\000\000\000\001\137\001\137\000\000\000\000\000\000\000\000\001\137\014}\000\000\000\000\000\000\000\000\001\137\014}\014}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014}\000\000\000\000\014}\000\000\000\000\000\000\000\000\014}\014}\014}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014}\000\000\000\000\000\000\014}\014y\014y\000\000\000\000\000\000\014y\000\000\000\000\014y\014}\014}\014}\000\000\014}\014}\000\000\000\000\000\000\014y\000\000\014y\000\000\014y\000\000\014y\000\000\014}\000\000\000\000\000\000\014}\000\000\000\000\000\000\000\000\000\000\014y\000\000\000\000\004\254\000\000\014}\014y\014y\000\000\000\000\000\000\000\000\000\000\000\000\005)\014y\000\000\000\000\014y\000\246\000\000\000\000\002\"\014y\014y\014y\000\000\000\000\000\000\000\000\000\000\000\000\021\142\000\000\000\000\000\000\005)\000\000\003v\014y\000\000\t\145\t\145\014y\000\000\000\000\t\145\000\000\000\000\t\145\021\146\000\000\000\000\014y\014y\014y\021\186\014y\014y\t\145\000\000\t\145\000\000\t\145\000\000\t\145\000\000\007\210\020\222\000\000\014y\000\000\000\000\020\246\014y\000\000\000\000\t\145\000\000\000\000\000\000\000\000\000\000\t\145\t\145\014y\000\000\000\000\000\000\022Z\000\000\000\000\t\145\000\000\000\000\t\145\000\000\000\000\000\000\000\000\t\145\t\145\000\238\021\018\022n\000\000\000\000\005)\005)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\145\003\022\002\198\000\000\t\145\002\146\000\000\007&\022~\000\000\002\254\000\000\000\000\000\000\t\145\t\145\t\145\000\000\t\145\t\145\001\210\000\000\007F\000\000\000\000\000\000\000\000\003\026\t\145\000\000\t\134\t\145\000\000\000\000\000\000\t\145\000\000\000\000\003\185\000\000\003&\000\000\000\000\t\178\001\190\000\000\t\145\007\225\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\000\000\t\194\005\174\011&\000\000\000\000\007\225\000\000\000\000\000\000\007\225\000\000\000\000\000\000\005\178\000\000\000\000\011\142\011\214\011\238\011\166\012\006\005\186\005\190\000\000\000\000\003\185\000\000\000\000\000\000\000\000\012\030\0126\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012N\003\185\000\000\000\000\003\185\000\000\005\194\000\000\000\238\000\000\000\000\000\000\004\130\000\000\000\000\000\000\000\000\011>\011\190\012f\012~\012\174\000\000\000\000\000\000\000\000\001\169\000\000\007\225\012\198\000\000\001\169\000\000\001\206\001\169\000\000\000\000\000\000\012\222\000\000\000\000\000\000\t\241\000\000\001\169\000\000\000\000\000\000\001\169\000\000\001\169\000\000\r>\000\000\rV\012\150\000\000\000\000\000\000\000\000\000\000\012\246\001\169\000\000\000\000\000\000\000\000\000\000\001\169\r\014\r&\000\000\000\000\000\000\000\000\002\170\000\000\001\169\020.\000\000\001\169\000\000\000\000\000\000\000\000\001\169\001\169\001\169\000\000\000\000\000\000\000\000\000\000\000\000\011&\000\000\000\000\000\000\0202\000\000\000\000\001\169\001\169\000\000\000\000\004\222\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\000\000\001\169\001\169\000\000\000\000\001\169\001\169\000\000\012\030\0126\000\000\000\000\000\000\000\000\000\000\001\169\000\000\012N\000\000\000\000\000\000\000\000\001\169\000\000\000\000\000\238\000\000\001\169\000\000\000\000\000\000\000\000\000\000\001\169\011>\011\190\012f\012~\012\174\000\000\000\000\006\142\000\000\000\000\000\000\000\000\012\198\001\202\001\206\000\000\000\000\000\000\000\000\000\000\000\000\012\222\000\000\n\142\000\000\000\000\000\000\000\000\000\246\001\202\001\206\002\"\001\210\001\250\001\230\r>\0206\rV\012\150\020F\000\000\021\142\001\242\000\000\012\246\005)\000\000\003v\001\210\001\250\001\230\000\000\r\014\r&\000\000\001\246\002\162\000\000\001\242\021\146\002\174\000\000\002\186\004.\004:\021\186\000\000\000\000\000\000\004F\000\000\001\246\002\162\000\000\000\000\000\000\002\174\020\222\002\186\004.\004:\000\000\020\246\006\129\006\129\004F\004J\000\000\006\129\000\000\000\000\006\129\000\000\000\000\000\000\000\000\000\000\000\000\022Z\000\000\000\000\006\129\004J\006\129\000\000\006\129\000\000\006\129\000\000\000\000\000\000\000\000\021\018\022n\000\000\000\000\000\000\000\000\000\000\006\129\000\000\000\000\004~\000\000\004\130\006\129\006\129\006}\007\166\000\000\000\000\b\130\006}\022~\006\129\006}\000\000\006\129\000\000\000\000\000\000\000\000\006\129\006\129\000\238\006}\000\000\006}\000\000\006}\000\000\006}\000\000\000\000\000\000\000\000\000\000\000\000\006\129\000\000\000\000\000\000\006\129\006}\000\000\000\000\000\000\000\000\000\000\006}\b\"\000\000\006\129\006\129\006\129\000\000\006\129\006\129\006}\000\000\000\000\006}\000\000\000\000\000\000\000\000\006}\006}\000\238\006\129\000\000\000\000\000\000\006\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006}\000\000\006\129\000\000\006}\014\137\014\137\000\000\000\000\000\000\014\137\000\000\000\000\014\137\006}\006}\006}\000\000\006}\006}\000\000\000\000\000\000\014\137\000\000\014\137\n\154\014\137\000\000\014\137\000\000\006}\001\202\001\206\000\000\006}\000\000\000\000\000\000\000\000\000\000\014\137\000\000\000\000\000\000\000\000\006}\014\137\014\137\014\141\014\141\001\210\001\250\001\230\014\141\000\000\014\137\014\141\000\000\014\137\000\000\001\242\000\000\000\000\014\137\014\137\000\238\014\141\002\002\014\141\000\000\014\141\000\000\014\141\001\246\002\162\000\000\000\000\000\000\002\174\014\137\002\186\004.\004:\014\137\014\141\000\000\000\000\004F\000\000\000\000\014\141\b\"\000\000\014\137\014\137\014\137\000\000\014\137\014\137\014\141\000\000\000\000\014\141\000\000\004J\000\000\000\000\014\141\014\141\000\238\014\137\000\000\000\000\000\000\014\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\141\000\000\014\137\000\000\014\141\006\153\007\166\000\000\000\000\000\000\006\153\000\000\000\000\006\153\014\141\014\141\014\141\000\000\014\141\014\141\000\000\000\000\000\000\006\153\000\000\006\153\000\000\006\153\000\000\006\153\000\000\014\141\007\177\007\177\000\000\014\141\000\000\000\000\000\000\000\000\000\000\006\153\000\000\000\000\000\000\000\000\014\141\006\153\b\"\006\157\006\157\007\177\007\177\007\177\006\157\000\000\006\153\006\157\000\000\006\153\000\000\007\177\000\000\000\000\006\153\006\153\000\238\006\157\000\000\006\157\000\000\006\157\000\000\006\157\007\177\007\177\000\000\000\000\000\000\007\177\006\153\007\177\007\177\007\177\006\153\006\157\000\000\000\000\007\177\000\000\000\000\006\157\006\157\000\000\006\153\006\153\006\153\000\000\006\153\006\153\006\157\000\000\000\000\006\157\000\000\007\177\000\000\000\000\006\157\006\157\006\157\006\153\000\000\000\000\000\000\006\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\157\000\000\006\153\000\000\006\157\006\149\006\149\000\000\000\000\000\000\006\149\000\000\000\000\006\149\006\157\006\157\006\157\000\000\006\157\006\157\000\000\000\000\000\000\006\149\0056\006\149\000\000\006\149\000\000\006\149\000\000\006\157\000\000\000\000\000\000\006\157\000\000\000\000\000\000\000\000\000\000\006\149\000\000\000\000\000\000\000\000\bJ\006\149\b\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\149\000\000\000\000\006\149\000\000\000\000\000\000\000\000\006\149\006\149\000\238\000\000\003\241\000\000\000\000\000\000\000\000\003\241\000\000\001\206\003\241\000\000\000\000\000\000\006\149\000\000\000\000\000\000\006\149\000\000\003\241\000\000\000\000\000\000\003\241\000\000\003\241\000\000\006\149\006\149\006\149\000\000\006\149\006\149\000\000\000\000\000\000\000\000\003\241\000\000\000\000\000\000\000\000\000\000\003\241\006\149\000\000\000\000\000\000\006\149\000\000\002\170\000\000\003\241\000\000\000\000\003\241\000\000\000\000\000\000\006\149\003\241\003\241\003\241\000\000\003\237\000\000\000\000\000\000\000\000\003\237\000\000\001\206\003\237\000\000\000\000\000\000\003\241\003\241\000\000\000\000\004\222\000\000\003\237\000\000\000\000\000\000\003\237\000\000\003\237\000\000\003\241\003\241\000\000\000\000\003\241\003\241\000\000\000\000\000\000\000\000\003\237\000\000\000\000\000\000\003\241\000\000\003\237\000\000\000\000\001-\000\000\003\241\000\000\002\170\001-\003\237\003\241\001-\003\237\000\000\000\000\000\000\003\241\003\237\003\237\003\237\000\000\001-\000\000\001-\000\000\001-\000\000\001-\000\000\000\000\000\000\000\000\000\000\003\237\003\237\000\000\000\000\004\222\000\000\001-\000\000\000\000\000\000\000\000\000\000\001-\000\000\003\237\003\237\001-\000\000\003\237\003\237\000\000\001-\000\000\000\000\001-\000\000\000\000\000\000\003\237\001-\001-\000\238\000\000\001)\000\000\003\237\000\000\000\000\001)\001-\003\237\001)\000\000\000\000\000\000\001-\003\237\000\000\000\000\001-\000\000\001)\000\000\001)\000\000\001)\000\000\001)\000\000\001-\001-\001-\000\000\001-\001-\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\001-\000\000\001)\000\000\000\000\000\000\001)\001-\000\000\000\000\000\000\001)\000\000\000\000\001)\000\000\000\000\000\000\001-\001)\001)\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\001)\001e\000\000\000\000\000\000\000\000\001e\000\000\r\217\001e\001)\001)\001)\000\000\001)\001)\000\000\r\217\000\000\001e\000\000\001e\000\000\001e\001)\001e\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001e\000\000\000\000\000\000\000\000\001)\001e\r\217\000\000\000\000\000\000\000\000\000\000\r\217\000\000\000\000\000\000\000\000\001e\000\000\000\000\000\000\000\000\001e\001e\001e\000\000\000\000\001\025\000\000\000\000\000\000\000\000\001\025\000\000\002\021\001\025\000\000\000\000\001e\000\000\000\000\000\000\r\217\002\021\000\000\001\025\000\000\001\025\000\000\001\025\000\000\001\025\001e\001e\001e\000\000\001e\001e\000\000\000\000\000\000\000\000\000\000\001\025\000\000\000\000\000\000\000\000\000\000\001\025\002\021\000\000\000\000\001e\000\000\000\000\002\021\000\000\000\000\000\000\000\000\001\025\000\000\000\000\001e\000\000\001\025\001\025\001\025\000\000\001\181\000\000\000\000\000\000\000\000\001\181\000\000\018\150\001\181\000\000\002\146\000\000\001\025\000\000\000\000\000\000\002\021\000\000\001\181\000\000\000\000\000\000\001\181\000\000\001\181\000\000\001\025\001\025\001\025\000\000\001\025\001\025\000\000\000\000\000\000\000\000\001\181\000\000\000\000\000\000\000\000\000\000\001\181\000\000\000\000\000\000\000\000\001\025\018\154\000\000\000\000\001\181\000\000\000\000\001\181\000\000\000\000\000\000\001\025\001\181\001\181\000\000\018\166\005!\000\000\005!\000\000\000\000\005!\000\000\000\000\005!\000\000\005!\007\166\001\181\000\000\000\000\005!\001\181\000\000\005!\000\000\000\000\005!\005!\000\000\005!\005\190\001\181\001\181\005!\000\000\001\181\001\181\005!\005!\005!\000\000\005!\000\000\000\000\005!\001\181\000\000\005!\000\000\000\000\000\000\005!\001\181\005!\000\000\000\000\005!\005!\b\"\005!\000\000\005!\002\234\001\181\005!\002\234\005!\000\000\000\000\005!\000\000\000\000\000\000\005!\005!\002\234\000\238\005!\t\029\000\000\005!\005!\000\000\t\029\005!\000\000\t\029\000\000\000\000\000\000\005!\005!\005!\000\000\005!\005!\t\029\000\000\005!\005!\t\029\000\000\t\029\000\000\005!\005!\000\000\000\000\005!\005!\000\000\000\000\005!\000\000\t\029\005!\000\000\000\000\007\210\000\000\t\029\000\000\000\000\000\000\t\029\005!\005!\000\000\000\000\t\029\029&\000\000\t\029\000\000\000\000\000\000\005!\t\029\t\029\000\238\t\025\000\000\000\000\000\000\000\000\t\025\t\029\t\029\t\025\000\000\000\000\000\000\000\000\t\029\000\000\000\000\000\000\t\029\t\025\000\000\000\000\000\000\t\025\000\000\t\025\000\000\000\000\t\029\t\029\t\029\000\000\t\029\t\029\000\000\000\000\000\000\t\025\000\000\000\000\000\000\000\000\t\029\t\025\000\000\000\000\000\000\t\025\000\000\t\029\000\000\000\000\t\025\000\000\000\000\t\025\000\000\000\000\000\000\000\000\t\025\t\025\000\238\003\229\000\000\000\000\000\000\000\000\003\229\t\025\t\025\003\229\000\000\000\000\000\000\000\000\t\025\000\000\000\000\000\000\t\025\003\229\000\000\000\000\000\000\003\229\000\000\003\229\000\000\000\000\t\025\t\025\t\025\000\000\t\025\t\025\000\000\000\000\000\000\003\229\018\174\000\000\000\000\000\000\t\025\003\229\000\000\000\000\000\000\000\000\000\000\t\025\000\000\000\000\003\229\000\000\000\000\003\229\000\000\000\000\000\000\000\000\003\229\003\229\003\229\003\022\002\198\000\000\000\000\002\146\000\000\007&\000\000\000\000\002\254\000\000\000\000\000\000\003\229\000\000\000\000\000\000\003\229\000\000\001\210\000\000\007F\000\000\000\000\000\000\000\000\003\026\003\229\003\229\t\134\000\000\003\229\003\229\000\000\000\000\000\000\000\000\0276\000\000\003&\000\000\003\229\0032\001\190\000\000\000\000\000\000\019\014\003\229\002\186\000\000\000\000\004\006\003\229\000\000\000\000\004\n\000\000\004\018\003\229\t\194\005\174\000\000\000\000\000\000\003\022\002\198\000\000\000\000\002\146\000\000\007&\000\000\005\178\002\254\000\000\000\000\000\000\000\000\000\000\000\000\005\186\005\190\000\000\001\210\025\166\007F\000\000\000\000\000\000\000\000\003\026\000\000\000\000\t\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\028\002\003&\005\194\000\000\t\178\001\190\000\000\000\000\004\130\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\000\000\t\194\005\174\000\000\000\000\000\000\003\022\002\198\000\000\000\000\002\146\000\000\007&\000\000\005\178\002\254\000\000\000\000\000\000\000\000\000\000\000\000\005\186\005\190\000\000\001\210\rz\007F\000\000\000\000\000\000\000\000\003\026\000\000\000\000\t\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026>\003&\005\194\000\000\t\178\001\190\000\000\000\000\004\130\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\250\t\194\005\174\000\000\000\000\000\000\003\022\002\198\000\000\000\000\002\146\000\000\000\000\000\000\005\178\002\254\000\000\000\000\000\000\000\000\005\254\000\000\005\186\005\190\000\000\001\210\rz\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\158\003&\005\194\000\000\0032\001\190\000\000\000\000\004\130\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\000\000\nQ\000\000\000\000\000\000\000\000\000\000\003\022\002\198\000\000\005\178\002\146\000\000\000\000\000\000\000\000\002\254\000\000\005\186\005\190\000\000\006\002\000\000\nQ\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\000\000\000\000\006\190\000\000\000\000\005\194\005\t\005\t\000\000\003&\005\t\004\130\0032\001\190\000\000\005\t\000\000\000\000\000\000\002\186\000\000\005\t\004\006\000\000\000\000\005\t\004\n\000\000\004\018\005\162\000\000\005\174\005\t\026\238\000\000\000\000\027\006\000\000\000\000\000\000\000\000\000\000\000\000\005\178\000\000\005\t\000\000\000\000\005\t\005\t\000\000\005\186\005\190\000\000\006\002\005\t\000\000\000\000\005\t\000\000\000\000\000\238\005\t\000\000\005\t\005\t\000\000\005\t\003\229\000\000\000\000\000\000\000\000\003\229\000\000\005\194\003\229\nQ\003\229\005\t\000\000\004\130\000\000\003\229\000\000\000\000\003\229\005\t\005\t\000\000\003\229\000\000\003\229\000\000\000\000\000\000\003\229\000\000\000\000\000\000\003\229\000\000\003\229\000\000\003\229\018\174\000\000\000\000\000\000\000\000\003\229\005\t\000\000\000\000\003\229\018\174\000\000\005\t\000\000\003\229\003\229\000\000\003\229\000\000\000\000\000\000\000\000\003\229\003\229\003\229\000\000\000\000\003\229\000\000\000\000\000\000\000\000\003\229\003\229\003\229\000\000\000\000\000\000\003\229\000\000\000\000\000\000\003\229\000\000\000\000\000\000\000\000\000\000\003\229\000\000\000\000\000\000\003\229\003\229\029.\000\000\003\229\003\229\000\000\000\000\000\000\000\000\003\229\003\229\029^\000\000\003\229\003\229\000\000\r\209\000\000\000\000\019\014\003\229\r\209\000\000\000\000\r\209\003\229\000\000\000\000\000\000\019\014\003\229\000\000\000\000\000\000\r\209\003\229\000\000\000\000\r\209\000\000\r\209\000\000\000\000\000\000\000\000\000\000\005\197\000\000\000\000\000\000\000\246\000\000\r\209\002\202\000\000\000\000\000\000\000\000\r\209\000\000\000\000\000\000\000\000\005U\000\000\000\000\000\000\r\209\000\000\003v\r\209\000\000\000\000\000\000\000\000\r\209\r\209\000\000\000\000\000\000\000\000\003\130\000\000\0071\000\000\000\000\000\000\020z\000\000\000\000\002\198\r\209\000\000\002\146\000\000\r\209\028N\000\000\002\254\020\222\000\000\000\000\000\000\0071\020\246\r\209\r\209\002\138\001\210\r\209\r\209\000\000\003\002\000\000\000\000\000\000\000\000\000\000\000\000\r\209\020\254\003\006\000\000\003\166\000\000\000\000\r\209\000\000\000\000\007Y\000\000\003\238\001\190\000\000\021\018\021N\002\198\r\209\002\186\002\146\000\000\003\246\000\000\000\000\002\254\b\190\b\194\b\206\000\000\007Y\005\174\000\000\000\000\000\000\001\210\025\142\000\000\000\000\003\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\005\186\005\190\000\000\000\000\000\000\000\000\000\000\003\238\001\190\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\005\194\b\214\005\174\000\000\000\000\b\238\004\130\006\029\000\000\000\000\000\000\000\000\006\029\000\000\000\000\006\029\000\000\000\000\000\000\000\000\000\000\000\000\005\186\005\190\000\000\006\029\000\000\000\000\000\000\006\029\000\000\006\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\029\000\000\000\000\005\194\b\214\000\000\006\029\000\000\b\238\004\130\000\000\000\000\b\130\000\000\000\000\006\029\000\000\000\000\006\029\000\000\000\000\000\000\000\000\006\029\006\029\000\238\000\000\006%\000\000\000\000\000\000\000\000\006%\000\000\000\000\006%\000\000\000\000\000\000\006\029\006\029\000\000\000\000\006\029\000\000\006%\000\000\000\000\000\000\006%\000\000\006%\000\000\006\029\006\029\000\000\000\000\006\029\006\029\000\000\000\000\000\000\000\000\006%\000\000\000\000\000\000\000\000\000\000\006%\000\000\003\229\000\000\000\000\006\029\b\130\003\229\000\000\006%\003\229\000\000\006%\000\000\000\000\000\000\006\029\006%\006%\000\238\003\229\000\000\000\000\000\000\003\229\000\000\003\229\000\000\000\000\000\000\000\000\000\000\000\000\006%\006%\000\000\000\000\006%\003\229\018\174\000\000\000\000\000\000\000\000\003\229\000\000\000\000\006%\006%\000\000\000\000\006%\006%\003\229\000\000\000\000\003\229\000\000\000\000\000\000\000\000\003\229\003\229\003\229\006\225\000\000\000\000\000\000\006%\006\225\000\000\000\000\006\225\000\000\000\000\000\000\000\000\003\229\000\000\006%\000\000\003\229\006\225\000\000\000\000\000\000\006\225\000\000\006\225\000\000\000\000\003\229\003\229\021^\000\000\003\229\003\229\000\000\000\000\000\000\006\225\000\000\000\000\000\000\000\000\000\000\006\225\000\000\000\000\000\000\000\000\019\014\003\229\000\000\000\000\006\225\000\000\000\000\006\225\000\000\000\000\000\000\000\000\006\225\006\225\000\238\000\000\000\000\000\000\000\000\000\000\029\006\000\000\000\000\000\000\000\000\000\000\003\022\002\198\006\225\000\000\002\146\000\000\006\225\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\000\000\006\225\006\225\0252\001\210\006\225\006\225\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\006\225\000\000\000\000\r\209\000\000\000\000\000\000\006\225\r\209\003&\000\000\r\209\0032\001\190\000\000\000\000\000\000\000\000\006\225\002\186\000\000\r\209\004\006\000\000\000\000\r\209\004\n\r\209\004\018\005\162\000\000\005\174\000\000\005\197\000\000\000\000\000\000\000\000\000\000\r\209\000\000\000\000\000\000\005\178\000\000\r\209\000\000\000\000\000\000\000\000\000\000\005\186\005\190\000\000\006\002\000\000\000\000\r\209\000\000\000\000\000\000\000\000\r\209\r\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\194\000\000\007\018\r\209\tn\006&\004\130\000\000\000\000\000\000\000\000\003\022\002\198\000\000\000\000\002\146\000\000\r\209\r\209\002\138\002\254\r\209\r\209\000\000\000\000\000\000\000\000\004\014\000\000\000\000\001\210\r\209\000\000\000\000\000\000\030\026\000\000\003\026\r\209\000\000\000\000\006\130\000\000\000\000\000\000\000\000\000\000\003\022\002\198\r\209\003&\002\146\000\000\0032\001\190\000\000\002\254\000\000\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\001\210\004\n\000\000\004\018\005\162\000\000\005\174\003\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\178\000\000\003&\000\000\000\000\0032\001\190\000\000\005\186\005\190\000\000\006\002\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\000\000\006\162\000\000\000\000\000\000\000\000\005\194\003\022\002\198\000\000\005\178\002\146\004\130\000\000\000\000\000\000\002\254\000\000\005\186\005\190\000\000\006\002\000\000\006\214\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\0075\000\000\000\000\000\000\000\000\005\194\003\022\002\198\000\000\003&\002\146\004\130\0032\001\190\000\000\002\254\000\000\000\000\000\000\002\186\0075\000\000\004\006\000\000\000\000\001\210\004\n\000\000\004\018\005\162\000\000\005\174\003\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\178\000\000\003&\000\000\000\000\0032\001\190\000\000\005\186\005\190\000\000\006\002\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\000\000\014\n\000\000\000\000\000\000\000\000\005\194\003\022\002\198\000\000\005\178\002\146\004\130\000\000\000\000\000\000\002\254\000\000\005\186\005\190\000\000\000\000\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\014\022\000\000\000\000\000\000\000\000\005\194\003\022\002\198\000\000\003&\002\146\004\130\0032\001\190\000\000\002\254\000\000\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\001\210\004\n\000\000\004\018\005\162\000\000\005\174\003\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\178\000\000\003&\000\000\000\000\0032\001\190\000\000\005\186\005\190\000\000\006\002\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\000\000\014\"\000\000\000\000\000\000\000\000\005\194\003\022\002\198\000\000\005\178\002\146\004\130\000\000\000\000\000\000\002\254\000\000\005\186\005\190\000\000\006\002\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\007\237\007\166\000\000\000\000\000\000\007\237\005\194\000\000\007\237\000\000\003&\000\000\004\130\0032\001\190\000\000\000\000\000\000\007\237\000\000\002\186\000\000\007\237\004\006\007\237\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\000\000\000\000\007\237\000\000\000\000\000\000\000\000\000\000\007\237\b\"\005\178\000\000\000\000\000\000\000\000\000\000\000\000\007\237\005\186\005\190\007\237\006\002\000\000\000\000\000\000\007\237\007\237\000\238\001\149\000\000\000\000\000\000\000\000\001\149\000\000\000\000\001\149\000\000\000\000\000\000\000\000\007\237\005\194\000\000\000\000\007\237\001\149\000\000\004\130\000\000\001\149\000\000\001\149\000\000\000\000\007\237\007\237\000\000\000\000\007\237\007\237\000\000\000\000\000\000\001\149\000\000\000\000\000\000\000\000\000\000\001\149\000\000\001\185\000\000\000\000\000\000\007\237\001\185\000\000\001\149\001\185\000\000\001\149\000\000\000\000\000\000\000\000\001\149\001\149\001\149\001\185\000\000\000\000\000\000\001\185\000\000\001\185\000\000\000\000\000\000\000\000\000\000\000\000\001\149\000\000\000\000\000\000\001\149\001\185\000\000\000\000\000\000\000\000\000\000\001\185\000\000\000\000\001\149\001\149\000\000\000\000\001\149\001\149\001\185\000\000\000\000\001\185\021j\000\000\000\000\000\000\001\185\001\185\000\000\000\000\000\000\000\000\000\000\001\149\000\000\000\000\000\000\000\000\001\149\000\000\000\000\000\000\001\185\000\000\006\229\000\000\001\185\000\000\000\000\006\229\000\000\000\000\006\229\000\000\000\000\000\000\001\185\001\185\000\000\000\000\001\185\001\185\006\229\000\000\000\000\000\000\006\229\000\000\006\229\000\000\001\185\000\000\000\000\000\000\000\000\000\000\000\000\001\185\000\000\000\000\006\229\000\000\025\014\000\000\000\000\000\000\006\229\000\000\001\185\000\000\000\000\000\000\000\000\000\000\000\000\006\229\000\000\000\000\006\229\000\000\000\000\000\000\000\000\006\229\006\229\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\229\000\000\r\209\000\000\006\229\000\000\000\000\r\209\000\000\000\000\r\209\000\000\000\000\000\000\006\229\006\229\000\000\000\000\006\229\006\229\r\209\000\000\000\000\000\000\r\209\000\000\r\209\000\000\006\229\000\000\000\000\000\000\005\197\000\000\000\000\006\229\000\000\000\000\r\209\000\000\000\000\000\000\000\000\000\000\r\209\000\000\006\229\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\209\000\000\000\000\000\000\000\000\r\209\r\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\137\000\000\002\198\r\137\000\000\031\202\000\000\r\209\000\000\000\000\031\206\000\000\000\000\r\137\000\000\000\000\000\000\000\000\000\000\r\137\000\000\r\209\r\209\002\138\000\000\r\209\r\209\000\000\000\000\000\000\000\000\r\137\000\000\000\000\000\000\r\209\000\000\r\137\000\000\030R\000\000\000\000\r\209\001\002\001\190\000\000\r\137\000\000\000\000\r\137\000\000\000\000\000\000\r\209\r\137\000\000\000\000\000\000\000\000\000\000\tM\tM\031\210\000\000\tM\000\000\000\000\000\000\000\000\tM\r\137\000\000\000\000\000\000\r\137\019V\000\000\000\000\000\000\tM\000\000\000\000\000\000\031\214\r\137\r\137\tM\000\000\r\137\005!\000\000\000\000\000\000\000\000\005!\000\000\000\000\005!\000\000\tM\000\000\000\000\tM\tM\000\000\r\137\000\000\005!\000\000\tM\000\000\005!\tM\005!\000\000\000\000\tM\000\000\tM\tM\000\000\tM\000\000\000\000\000\000\005!\000\000\000\000\000\000\000\000\000\000\005!\000\000\tM\000\000\000\000\000\000\b\130\000\000\000\000\005!\tM\tM\005!\000\000\000\000\000\000\000\000\005!\002\234\000\238\000\000\001Q\000\000\000\000\000\000\000\000\001Q\000\000\000\000\001Q\000\000\000\000\000\000\005!\tM\000\000\000\000\005!\000\000\001Q\tM\001Q\000\000\001Q\000\000\001Q\000\000\005!\005!\000\000\000\000\005!\005!\000\000\000\000\000\000\000\000\001Q\000\000\000\000\000\000\000\000\000\000\001Q\000\000\000\205\000\000\000\000\005!\000\000\000\205\000\000\000\000\000\205\000\000\001Q\000\000\000\000\000\000\000\000\001Q\001Q\000\238\000\205\000\000\000\000\000\000\000\205\000\000\000\205\000\000\000\000\000\000\000\000\000\000\000\000\001Q\000\000\000\000\000\000\000\000\000\205\000\000\000\000\000\000\000\000\000\000\000\205\000\000\000\000\001Q\001Q\001Q\000\000\001Q\001Q\000\205\000\000\000\000\000\205\000\000\000\000\000\000\000\000\000\205\000\205\000\238\000\000\000\209\000\000\000\000\001Q\000\000\000\209\000\000\000\000\000\209\000\000\000\000\000\000\000\205\000\000\001Q\000\000\000\205\000\000\000\209\000\000\000\000\000\000\000\209\000\000\000\209\000\000\000\205\000\205\000\000\000\000\000\205\000\205\000\000\000\000\000\000\000\000\000\209\000\000\000\000\000\000\000\000\000\000\000\209\000\000\007\233\000\000\000\000\000\205\000\000\007\233\000\000\000\209\007\233\000\000\000\209\000\000\000\000\000\000\000\205\000\209\000\209\000\238\007\233\000\000\000\000\000\000\007\233\000\000\007\233\000\000\000\000\000\000\000\000\000\000\000\000\000\209\000\000\000\000\000\000\000\209\007\233\000\000\000\000\000\000\000\000\000\000\007\233\000\000\000\000\000\209\000\209\000\000\000\000\000\209\000\209\007\233\000\000\000\000\007\233\000\000\000\000\000\000\000\000\007\233\007\233\000\000\000\000\006\217\000\000\000\000\000\209\000\000\006\217\000\000\000\000\006\217\000\000\000\000\000\000\007\233\000\000\000\209\021:\007\233\000\000\006\217\000\000\000\000\000\000\006\217\000\000\006\217\000\000\007\233\007\233\020\142\000\000\007\233\007\233\000\000\000\000\000\000\000\000\006\217\000\000\000\000\000\000\000\000\000\000\006\217\000\000\006-\007\166\000\000\007\233\000\000\006-\000\000\006\217\006-\000\000\006\217\000\000\000\000\000\000\000\000\006\217\006\217\000\000\006-\000\000\000\000\000\000\006-\000\000\006-\000\000\000\000\000\000\000\000\r9\000\000\006\217\000\000\000\000\r9\006\217\006-\r9\000\000\000\000\000\000\000\000\006-\b\"\000\000\006\217\006\217\r9\000\000\006\217\006\217\r9\000\000\r9\006-\000\000\000\000\000\000\000\000\006-\006-\000\238\000\000\000\000\000\000\r9\006\217\000\000\000\000\000\000\000\000\r9\000\000\000\000\000\000\006-\000\000\000\000\001\202\002\142\r9\000\000\002\146\r9\000\000\000\000\000\000\000\000\r9\006-\006-\000\000\000\000\006-\006-\000\000\000\000\001\210\001\250\001\230\000\000\000\000\000\000\000\000\r9\011\022\000\000\001\242\r9\000\000\006-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r9\r9\002\154\002\162\r9\r9\000\000\002\174\000\000\002\186\004.\004:\004\249\000\000\000\000\000\000\024\230\004\249\029\254\004\241\004\249\r9\000\000\000\000\004\241\000\000\000\000\004\241\000\000\000\000\004\249\000\000\rn\004J\004\249\000\000\004\249\004\241\000\000\000\000\000\000\004\241\005\190\004\241\000\000\000\000\000\000\000\000\004\249\000\000\000\000\000\000\030\n\000\000\004\249\004\241\000\000\000\000\000\000\000\000\000\000\004\241\000\000\004\249\000\000\000\000\004\249\000\000\000\000\024\250\004\241\004\249\000\000\004\241\000\000\000\000\000\000\000\000\004\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\249\000\000\000\000\000\000\004\249\005\017\000\000\004\241\000\000\000\000\005\017\004\241\004\225\005\017\004\249\004\249\000\000\004\225\004\249\004\249\004\225\004\241\004\241\005\017\000\000\004\241\004\241\005\017\000\000\005\017\004\225\000\000\000\000\000\000\004\225\004\249\004\225\000\000\000\000\000\000\000\000\005\017\004\241\000\000\000\000\000\000\020\182\005\017\004\225\000\000\005!\000\000\000\000\023\198\004\225\005!\005\017\000\000\005!\005\017\000\000\000\000\000\000\004\225\005\017\000\000\004\225\000\000\005!\000\000\000\000\004\225\005!\000\000\005!\000\000\000\000\000\000\000\000\000\000\005\017\000\000\000\000\000\000\005\017\000\000\005!\004\225\000\000\000\000\000\000\004\225\005!\000\000\005\017\005\017\000\000\000\000\005\017\005\017\000\000\004\225\004\225\000\000\005!\004\225\004\225\000\000\000\000\005!\002\234\000\000\000\000\000\000\000\000\005\017\001\202\001\206\000\000\000\000\000\000\000\000\004\225\000\000\000\000\005!\024\170\000\000\000\000\000\000\002\158\000\000\000\000\028\"\000\000\001\210\001\250\001\230\000\000\005!\005!\000\000\000\000\005!\005!\001\242\005\001\000\000\000\000\b6\000\000\005\001\002\002\000\000\005\001\000\000\000\000\000\000\001\246\002\162\005!\000\000\000\000\002\174\005\001\002\186\004.\004:\005\001\000\000\005\001\000\000\004F\000\000\000\000\004\233\000\000\000\000\000\000\000\000\004\233\000\000\005\001\004\233\000\000\000\000\000\000\000\000\005\001\004J\000\000\000\000\000\000\004\233\000\000\000\000\000\000\004\233\000\000\004\233\005\001\005\025\000\000\000\000\000\000\005\001\005\025\000\000\000\000\005\025\000\000\004\233\000\000\000\000\000\000\000\000\000\000\004\233\018\158\005\025\000\000\005\001\000\000\005\025\000\000\005\025\000\000\000\000\000\000\004\233\000\000\000\000\001\202\001\206\004\233\005\001\005\001\005\025\000\000\005\001\005\001\000\000\000\000\005\025\000\000\000\000\000\000\000\000\004\014\000\000\004\233\001\210\001\250\001\230\000\000\005\025\005\001\000\000\000\000\000\000\005\025\001\242\000\000\000\000\004\233\004\233\000\000\022\n\004\233\004\233\000\000\000\000\000\000\000\000\001\246\002\162\005\025\000\000\000\000\002\174\000\000\002\186\004.\004:\000\000\004\233\000\000\000\000\004F\000\000\005\025\005\025\000\000\000\000\005\025\005\025\024R\000\000\000\000\000\000\000\000\000\000\0055\000\000\000\000\004J\000\000\000\246\000\000\b\153\002\202\005\025\b\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003r\000\000\024\210\000\000\0055\000\000\003v\000\000\b\153\b\153\000\000\b\153\b\153\000\000\000\000\000\000\000\000\000\000\003\130\000\000\000\000\004~\000\000\004\130\020z\b\173\000\000\000\000\b\173\000\000\000\000\000\000\b\153\028N\000\000\000\000\020\222\000\000\000\000\000\000\000\000\020\246\000\000\000\000\b\173\b\173\000\000\b\173\b\173\000\000\b\153\000\000\000\000\000\000\000\000\000\000\000\000\020\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\173\000\000\000\000\021\018\021N\000\000\000\000\0055\0055\000\000\000\000\000\000\b\153\000\000\b\153\000\000\000\000\000\000\000\238\000\000\000\000\000\000\000\000\000\000\025\142\000\000\006\026\000\000\000\000\b\153\b\153\000\000\b\133\000\000\b\153\b\133\b\153\000\000\000\000\000\000\b\153\b\177\000\000\000\000\b\177\000\000\000\000\000\000\b\173\000\000\b\173\b\133\b\133\000\000\b\133\b\133\000\000\000\000\000\000\000\000\b\177\b\177\b\173\b\177\b\177\006\"\b\173\000\000\b\161\000\000\b\173\b\161\b\173\000\000\000\000\b\133\b\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\177\000\000\000\000\b\161\b\161\000\000\b\161\b\161\000\000\b\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\133\000\000\b\133\000\000\000\000\000\000\000\238\000\000\000\000\b\177\000\000\b\177\000\000\000\000\b\133\000\000\000\000\006\"\b\133\000\000\014\145\014\145\b\133\b\177\b\133\000\000\006\"\b\177\b\133\000\000\000\000\b\177\000\000\b\177\000\000\000\000\b\161\b\177\b\161\014\145\014\145\014\145\007\186\000\000\000\000\000\000\000\000\000\000\000\000\014\145\006~\000\000\000\000\006\"\b\161\000\000\000\000\000\000\b\161\000\000\b\161\000\000\014\145\014\145\b\161\000\000\000\000\014\145\000\000\014\145\014\145\014\145\000\000\000\000\000\000\000\000\014\145\001\202\001\206\026B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\202\001\206\026\162\000\000\000\000\014\145\000\000\000\000\001\210\001\214\001\230\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\242\001\210\001\214\001\230\000\246\000\000\000\000\002\202\000\000\000\000\000\000\001\242\000\000\001\246\002\162\000\000\000\000 \018\002\174\000\000\002\186\004.\004:\003v\001\246\002\162\000\000\004F\000\000\002\174\000\000\002\186\004.\004:\000\000\003\130\000\000\000\000\004F\000\000\000\000\020z\000\000\000\000\004J\000\000\000\000\000\000\001\202\001\206\028N\000\000\000\000\020\222\000\000\004J\000\000\000\000\020\246\000\000\000\000\000\000\000\000\001\202\001\206\000\000\000\000\001\210\001\250\000\000\000\000\000\000\000\000\000\000\020\254\000\000\000\000\000\000\031\194\000\000\000\000\000\000\001\210\001\250\000\000\000\000\000\000\000\000\021\018\021N\001\246\002\178\005]\000\000\000\000\002\174\000\000\002\186\004.\004:\000\000\000\000\000\000\000\000\004F\001\246\002\178\000\000\000\000\025\142\002\174\000\000\002\186\004.\004:\000\000\000\000\000\000\000\000\004F\000\000\004J\000\000\000\000\005\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004J\000\000\000\000\005\153\029\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\029\170")) + ((16, "kby\132n\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021Hn\030\000\000\000\000\020Xn\030kb\020\182\000-\000[\164L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\138\001\208\001d\000\000\002t\001\188\000\000\003\214\003$\007\140\000\000\005\244\003r\b\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\220\000\000\000\000\000\000\002\216tj\000\000\000\000\000\000\006&\000\000\000\000zh\0046\0046\000\000\000\000\179N\006&\000\000y\140\020Xj6\164\228\005\236\000\000\020X\129&o8\020Xzx\000\000\005\144\000\000l(\006\136\000\000kJ\000\000\021\224\000\000\000\000\003\224\000\000\006&\000\000\000\000\000\000\006\242\000\000kJ\000\000\006\214\194L\166\164\173&\000\000\203\252\205\226\000\000t\242\132\164\000\000\132\"\0218tjn\030kb\000\000\000\000o8\020X{\194l(\007\030\190\180\000\000\185\024n\030kby\132\020X\000\000\000\000\016xy~\020X\130\172\131\142\000\000\001\026\000\000\000\000\004\250\000\000\000\000qn\001\026\025\130\005\200\b$\000\000\000\000\002\026\000\000j6\005\248\005\228\020X\023.\020Xkbkb\000\000\000\000\000\000u\254u\254\020X\023.\b`\000\000q\152\020X\129&\023\022\bZ\b\004\000\000\000\220\b\022\000\000\000\000\000\000\000\000\000\000\020X\000\000\000\000\000\000y\132\020X\000\000i\134\191:}\252\000\248\129\218\131\142\193\254\194\230\000\000\b\004\000\000\007:\000\000\000\000\020\250\177\148~X\000\000\177\148~X\000\000\177\148\177\148\000b\006\n\0008\000\000\020\190\000\000\bL\000\000\000\000\bL\000\000\000\000\000\000\177\148\006&\000\000\000\000\130\164\177\148~\224\132\164\000\000\0072\028\254\179N\132\164\011\228\177\148\000\000\000\000\000\000\000\000\000\000\000\000v\204\132\164w\194\000b\000\000\000\000\000\000\004\006\000\000\000\000\162&\012$\006&\000\000\000\000x\184\000\000\000\000\000\000\003b\000\000\177\148\000\000\001\000\180F\000\000\177\148\005\216\177\148\023\224\000\000\024\216\000\000\006\208\006\230\000\000\011\132\177\148\t\206\000\000\t\246\000\000\t\184\000\000\000\000\005\016\000\000\000\000\000\000\029\n\030D\131\142yp\020X\131\142\000\000\000b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\220\027v\000\000\000\000\000\000\001\244%\182\188\132\000\000\000\000yp\020X\131\142\000\000\000\000\207p\131\142\207\184\194\230\000\000\208N\000\000\131\142\000\000\000\000\132zqn\001\154\001\154\000\000\014\020\131\142\000\000\000\000\000\000\004\250\014,\000\000h\196\000\000\000\000\195.\000\000\208`\177\148\000\000\004R\000\000\000\000\195\186\000\000\208\150\012\226\000\000\000\000\000\000\000\000\014\178\000\000\023\160\000\000\000\000\195\186\000\000\004\224\000\000\000\000l\000\189\016\000\000\000\000j&\024t\019\252\025\"\000\000\000\000\000\000\000\000\002>\000\000\000\000\162\240\n\238\014\168\000\017\177\148\000\226\015t\000\000\000\000\011\176\014\168\005\"\000\000y\132yvu\254\020X\023.\000-\000\018\r\138\000\000\015Lj6\131\196\015\212j6\000-\000\018\000\018j6\000\000\178\132\t`l(\b\004\bT\209 \000\000\177\148\173\198\177\148\167\132\174f\177\148\006`\177\148\175\000\000\000\012\250\tD\nDj6\179$\000\000\b*\t\190\165\006\000\000\000\000\000\000\000\000j6\179|j6\180\028\020d\0008\168$\b\022\0008\168|\000\000\180t\t`\000\000\000\000\000\000\181\020\002\152\000\000\000\000\006x\000\000\007|\023.\000\000\165\196q\152\000\000\0268\000\000\000\000j6\003\144\000\000\000\000\000\000\000\000\163\168\000\000\001\248\000\000\127\172\t \0032\133<\0226\131\132y\132\020Xo\244y\132\020X\016x\016x\000\000\000\000\000\000\000\000\001\240\025\030jt\000\000{,{\224u\254\020X\023.\007hnB\000\000\007p\000\000|\148}H\196\002qZ\177\148\006p\000\000y\132\020X\000\000yp\020X\193\254\131\142ih\000\000y\132\020Xo\b\001\b\000\000\131\142ih\177\148\002\210\005\"\016r\000\000\000\000\000\000rZ\001\154\016\136\000\000\131\142\000\000\000\000\175\140\000\000\000\000\t\014\132\164\000b\016\200\133\240yp\020X\193\254\026\022\134\164yp\020X\193\254\027\014\131\142\000\000\000\000yp\020X\131\142\026J\000\000y\132\020X\016x\0226\016x\002\232\021\238sHyp\020X\193\254m\200sH\135Xyp\020X\193\254\000\000\016x\r\160\016\190\000*\177\180\000\000\021\146\179N\000\000\026\"\177\148\028\018\016\250\000\000\000\000\016\206\000\000\016x\003\224\017\004\000\000&\174\000\000\n\202\000\000\000\000\028\006\136\012yp\020X\193\254\028\254\017p\023.\000\000\000\000\000\000\000\000\004\234\000\000\000\000\000\000\029\246\136\192yp\020X\193\254\030\238\031\230\137typ\020X\193\254 \222!\214\000\000\018h\024&\138(yp\020X\193\254\000\000\000\000\000\000n\030\000\000\000\000\000\000\138\220yp\020X\193\254\"\206#\198\139\144yp\020X\193\254$\190%\182\140Dyp\020X\193\254&\174'\166\140\248yp\020X\193\254(\158)\150\141\172yp\020X\193\254*\142+\134\142`yp\020X\193\254,~-v\143\020yp\020X\193\254.n/f\143\200yp\020X\193\2540^1V\144|yp\020X\193\2542N3F\1450yp\020X\193\2544>56\145\228yp\020X\193\2546.7&\146\152yp\020X\193\2548\0309\022\147Lyp\020X\193\254:\014;\006\148\000yp\020X\193\254;\254<\246\148\180yp\020X\193\254=\238>\230\149hyp\020X\193\254?\222@\214\150\028yp\020X\193\254A\206B\198\150\208yp\020X\193\254C\190D\182\151\132yp\020X\193\254E\174F\166\1528yp\020X\193\254G\158H\150\020X\131\142o\b\000\000\000\000tj\001\154\016\182\177\148\bP\000\000\000\000\nF\006&\000\000\177\148\b\162\000\000\000\000\017\"\000\000\000\000\000\000\004\164\000\000\017,\133\240\000\000\000\000\000\000q\154\177\148\t\154\000\000\000\000\0292\000\000\000\000\196\142\000\000\030*\196\214\000\000\031\"\197b\000\000 \026\014\210\000\000\000\000\000\000\000\000!\018\131\142\"\n\000\000\185\004\185\004\000\000\000\000\000\000I\142\000\000\006\212\000\000\000\000\000\000\011\188\000\000\000\000\000\220\025\158sH\011\172\000\000\000\000\166ft\014\000\000sH\t\210\000\000\000\000sH\012\140\000\000\000\000\000\000\016x\004\216\026\bsH\012\164\000\000\005\208\152\236yp\020X\193\254J\134K~sH\r\156\000\000\006\200\153\160yp\020X\193\254LvMnsH\r\172\000\000\007\192\154Typ\020X\193\254NfO^'\166\000\000\r\186\b\184\155\byp\020X\193\254PVQN\000\000\014\144\t\176\155\188yp\020X\193\254RFS>\000\000\014\250\n\168\156pyp\020X\193\254T6U.\007H\026\198sH\015L\011\160\157$yp\020X\193\254V&W\030sH\014\148\012\152\157\216yp\020X\193\254X\022Y\014sH\015\134\r\144\158\140yp\020X\193\254Z\006Z\254\014\136\159@yp\020X\193\254[\246\\\238\015\128\019`\000\000\000\000\000\000\000\000\015\162\000\000sH\014\170\000\000sH\015\242\000\000\t\236\000\000\000\000\000\000\017J\000\000\n\224\000\000\000\000]\230\000\000\017\196\000\000\000\000\000\000\000\000\000\000\000\000^\222\018\014\159\244yp\020X\193\254_\214\160\168yp\020X\193\254`\206a\198b\190\161\\yp\020X\193\254c\182d\174\000\000#\002\000\000\000\000\005\134\000\000\000\000\131\142\000\000\000\000\191\150\016D\000\000\000\000\127\172\000\000\b\218\000\000\000\000\128r\000\000\015\140\000\000\000\000\005@\011\194\000\000\000\000\0226\022\028\b\004\000\000j\228\031<\027\\\021\218\000\000\000\000\016\148\000\000\000\000\001\238\026\022\133D\000\000\025\030\000\000\n\246\000\000\000\000\016\234\000\000\000\000yp\020X\193\254i*\175\244\t\002\005@\000\000\000\000\012H\000\000\000\000\016\128\000\000\000\000\000\000\020X\023.\003\202\000\000\000\000\023\022\005\200\b$\b`\023.\192&\162\016\000\000\020X\023.\192\164\017\162\000\000\000\000\b`\000\000n\174\019\248\023\228\000\000\011\220\0184\000\000\018H\000V\132\164\000\244\000\000\018\024\017\170tj\011,\177\148\026\160\020F\016V\003\b\000\000\029\136\018d\000\000\000\244\000\000\000\000\018|\132\164\169\028\000\000\176\146\168N\012\156\132\164\018J\132\164\181\146\169\188\018\\\132\164\182\016\170\\\001\024\018\030\000\000\000\000\000\000\020X\200\164\000\000\131\142\185\004\000\000\000\000\018\146\000\000\000\000\000\000yp\020X\193\254e\166f\158\000\000\015\228\000\000\000\000\000\000u\254\020X\023.\003\202\000\000\163\148\000\000\bh\000\000\000*\000\000\000\000\018\158\000\000\018\202\193\254g\150yp\020X\193\254\022`\000\000\000\000\165\228\000\000\t`\000\000\167\164\000\000\020X\000\000j6\nX\000\000\176\250\000\000\000\000\171(\000\000\011P\000\000\171\196\000\000\025\198\000\000j6\012H\000\000\200\234\000\000\020X\023.\200\234\000\000\023l\023\022\bZ\006&\202\150j6\197\168\185\004\000\000\005\200\tR\b$\b`\185\004\204p\005\200\b$\b`\185\004\204p\000\000\000\000\b`\185\004\000\000n\030kb\131\142\027B\000\000\000\000n\030kbu\254\020X\023.\200\234\000\000\020\182\000-\000[\017\246tj\r(\177\148\185\150\018$\018\204\203\020\000\000\185\004\000\000\186\018n\174\019\248\023\228\192\252\024\220\r\204\198$\n<\018*\020X\185\004\000\000\020X\185\004\000\000\177\180\174\202\019\134\003\214\005\200\0008w\140\000\000\005\200\0008w\140\000\000\026\178\023\022\bZ\006&x\130j6\185\024\000\000\005\200\nJ\022\214\012\156\000\000w\140\000\000\b$\0184j6\185\024\206*\005\200\b$\0186j6\185\024\206*\000\000\000\000\tX\r\148\000\000\205j\000\000j6\203lw\140\000\000\nP\r\148\000\000y\140\020Xj6\185\024\000\000n\174\019\248\023\228\186\142kr\024\014\019\170\002\142\000\000\rbkJ\000\017\000\000\018\176\018^\024\196\020X\162\190\177\148\n@\000\000\135X\012\238\004\212\r\230\000\000\014\132\000\000\018\190\018X\177\148w\202\000\000\0032\002\228\011\016\000\000\014\240\000\000\018\214\018ztjw\202\000\000\020X\024\196\019\014\011^\005\200\000\000\016\176\024\196\177\148\012\020\000b\000\000\177\148\004\018\007\242\000\000\000\000\182j\000\000\000\000\016\204\024\196\182\232w\202\000\000\020X\177\148\015d\177\148tXw\202\000\000\016\232\000\000\000\000w\202\000\000\000\000\135X\000\000\185\024\204~\019\170\002\142\rb\019\002\018\176\024\196\185\024\204~\000\000\000\000\019\170\002\142\rb\019\006\018\146v\158t\252\132\164\019\028v\158\177\148\020\184\019&v\158\132\164\019,v\158\183\136\184\b\000\000\201h\000\000\000\000\185\004\206d\019\170\002\142\rb\019(\018\190v\158\185\004\206d\000\000\000\000\000\000\174\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000w\140\000\000\205\016\020Xl(\019H\190\180\000\000\185\024\205\016\000\000\000\000\206\152\020Xl(\019L\018\232\166\164\206\202\000\244\019\150\000\000\000\000\184\134\186\142\020X\000\000\198|\023\228\000\000\000\000\185\024\206\152\000\000\000\000\000\000\193xl\156n>\000\244\019\162\000\000\000\000\000\000\186\142\020X\000\000\000\244\019\164\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015Xkr\019\170\002\142\rb\019\128\186\254\023\204\020X\130\172\134\164\020(\003\b\000\244\019\152\012d\000\000\000\000\019b\000\000\000\000\128r\000\000\011\156\014\222\000\000\015&\000\000\019\192\019r\177\148~F\020\022\r\\\000\000\000\000\019\222\000\000\000\000\020F\0032\016\218\000\000\0208\187\128\209\146\001\154\019\214\177\148\017\b\000\000\000\000\0204\000\000\000\000\000\000\128r\000\000\0068\017\168\000\000\015\232\000\000\020\138\020Htj\000\000\020\218\188\002\209\168\001\154\020\136\177\148\017Z\000\000\000\000\020\178\000\000\000\000\000\000\020X\000\000\128r\000\000\020z\020X\023\204\023\204\189Xn\030\020X\200\164\131\142\025p\000\000\012\020\005\200\000\000\016\244\023\204\177\148\014\192\b\004\000\000\020X\131\142\186\254\023\204\0162\023\204\000\000lFm,\000\000\170\182\000\000\000\000\171R\000\000\000\000\171\238\000\000\017\168\023\204\172\138\200\164\131\142\025p\000\000\000\"\000\000\000\000v\158\017\154\000\000\000\000\127\172\021\012\000\000\128r\000\000\023\204\127\172\128r\000\000\020X\177\148\128r\000\000\017x\000\000\000\000\128r\000\000\000\000\134\164\000\000\201\192v\158\020\186\023\204\202>\186\254\000\000\185\004\205\030\019\170\002\142\rb\021\020\186\254\185\004\205\030\000\000\000\000\000\000\207byp\000\000\000\000\000\000\000\000\000\000\000\000\203\166\185\004\000\000\205\016\000\000\000\000\000\000\000\000\185\004\207b\000\000\000\000\000\000\203\166\021T\000\000\021`\000\000\185\004\207b\000\000\000\000\017\206\000\000\000\000\178,\004\136\000\000\000\000jV\000\000\177\148\016\016\000\000\134\164\018\028\000\000\000\000\021\176\193\254\000\000h\142\021\180\000\000\000\000\021\168\028B$\002\023\228\189\224\024\220\020X\000\000\185\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\189\244\024\220\020X\000\000\012>\190\180\000\000\185\024\000\000\021\194\028B$\002\185\024\000\000\021\212\000\000\004\206\017N\020X\210,\000\000\000\000\028\190\210J\000\000\000\000\021^\000\000\021\186\177\148\000\000\0186\n\182\000b\000\000\000\000\177\148\0150\016\004\177\148\016(\000\244\021\234\000\000\000\000\199\022\000\000\000\000\166\164\000\000\185\024\000\000\021\222\028B$\250w\140\000\000\000\000\000\000\000\000\015\020\199\176\166\164\000\000\185\024\000\000\021\224\028B$\250w\140\000\000\018p\000\000\000\000\0148\000\000\185\004\000\000\021\254\000\000\000\000\021`\000\000\016\224\000\000\000\000\021\132\000\000\000\000sH\021\136\000\000\000\000$\190\164L\022*\000\000\000\000\000\000\016|\0114\166\236\0220\000\000\000\000\000\000\000\000\000\000\000\000\021\178\000\000\024\220\000\000\021\194\000\000\177\148\000\000\r\224\000\000\000\000\021\198\000\000\000\000\0008\000\000\004\202\000\000\000\000\000\000\006\168\000\000\023.\000\000\015n\000\000j6\000\000\0040\000\000\tD\000\000\021\202\000\000\131\142\026J\000\000\000\000\r$\021\218\000\000\000\000\021\212\014\028o\244\006&\200.\000\000\000\000\000\000\000\000\000\000\163\226\000\000\000\000\022z\000\000\190\238\000\000\017\244\022\130\000\000\022\132\000\000p\168p\168\209\214\209\214\000\000\000\000\184\254\209\214\000\000\000\000\000\000\184\254\209\214\022\022\000\000\022\028\000\000"), (16, "\003\197\003\197\000\006\001\002\001\190\003\197\002\194\002\198\003\197\002\242\002\146\003\197\004M\003\197\022\158\002\254\003\197\027\146\003\197\003\197\003\197\019\202\003\197\003\197\003\197\001\210\005\r\005\r\004V\003\002\003\197\003z\003~\011~\003\197\001\206\003\197\027\150\003\006\000\238\003\166\019\206\003\197\003\197\003\218\003\222\003\197\003\226\003\238\003\250\004\002\007V\007\154\003\197\003\197\002\186\001\206\007r\003\246\003\197\003\197\003\197\b\190\b\194\b\206\b\226\001*\005\174\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\003\197\tV\000\238\003\197\018\174\003\197\003\197\004M\tb\tz\n\030\005\186\005\190\003\197\003\197\003\197\007\213\003\197\003\197\003\197\003\197\002z\002\170\016\198\003\197\0072\003\197\003\197\003\233\003\197\003\197\003\197\003\197\003\197\003\197\005\194\b\214\003\197\003\197\003\197\b\238\004\130\n2\003\233\003\197\003\197\003\197\003\197\0149\0149\027\154\n\138\004\222\0149\n\150\0149\0149\004Q\0149\0149\0149\0149\t\138\0149\0149\007u\0149\0149\0149\004E\0149\0149\0149\0149\005\r\0149\019\014\0149\0149\0149\0149\0149\0149\0149\0149\007u\0149\018\182\0149\0052\0149\0149\0149\0149\0149\006\181\0149\0149\000\238\0149\003\254\0149\0149\0149\t\142\t\170\0149\0149\0149\0149\0149\0149\0149\000\238\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\000\238\0149\0149\004Q\0149\0149\014\138\003\030\003\186\005\r\0149\0149\0149\0149\0149\005\r\0149\0149\0149\0149\0149\007A\0149\0149\006\213\0149\0149\003\"\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\0149\007A\005\r\0149\0149\0149\0149\001\153\001\153\001\153\001f\004%\001\153\006J\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001v\001\153\001j\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\007\026\001\153\003R\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\b\130\001\153\001\153\001\153\006\213\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\000\238\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\b\186\001\153\001\153\022\142\bb\007\166\001r\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\017\202\t\006\001\153\005\242\001\153\001\153\bf\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\182\001\153\001\153\001\153\001\153\001\153\011\165\011\165\022\250\b\"\014]\011\165\003V\011\165\011\165\004\201\011\165\011\165\011\165\011\165\001\186\011\165\011\165\014]\011\165\011\165\011\165\000\238\011\165\011\165\011\165\011\165\023\002\011\165\007\030\011\165\011\165\011\165\011\165\011\165\011\165\011\165\011\165\007\225\011\165\005\r\011\165\005\r\011\165\011\165\011\165\011\165\011\165\t=\011\165\011\165\000\238\011\165\001\130\011\165\011\165\011\165\007\225\005\r\011\165\011\165\011\165\011\165\011\165\011\165\011\165\005\r\011\165\011\165\011\165\011\165\011\165\011\165\011\165\011\165\011\165\011\165\011\165\000\238\011\165\011\165\004\201\011\165\011\165\005\"\b\158\007\166\005\r\011\165\011\165\011\165\011\165\011\165\001\146\011\165\011\165\011\165\011\165\nJ\000\238\n\206\011\165\001\198\011\165\011\165\b\162\011\165\011\165\011\165\011\165\011\165\011\165\011\165\011\165\011\165\011\165\011\165\011\165\011\165\007\225\011\165\011\165\011\165\011\165\011\165\004m\004m\002\001\b\"\b\202\004m\002^\004m\004m\019\178\004m\004m\004m\004m\001f\004m\004m\004%\004m\004m\004m\000\238\004m\004m\004m\004m\002b\004m\000\n\004m\004m\004m\004m\004m\004m\004m\004m\b\130\004m\004\242\004m\007\166\004m\004m\004m\004m\004m\t\233\004m\004m\000\238\004m\005&\004m\004m\004m\002\001\006\150\004m\004m\004m\004m\004m\004m\004m\018B\004m\004m\004m\004m\004m\004m\004m\004m\004m\004m\004m\006\154\nB\n\198\000\238\004m\004m\b\"\028\214\007\166\000\238\004m\004m\004m\004m\004m\001\234\004m\004m\004m\004m\nJ\019\182\n\206\004m\000\238\004m\004m\028\218\004m\004m\004m\004m\004m\004m\004m\004m\004m\004m\004m\004m\004m\000\238\004m\004m\004m\004m\004m\004]\004]\022\206\b\"\006\222\004]\t\233\004]\004]\031\135\004]\004]\004]\004]\005\r\004]\004]\007\129\004]\004]\004]\000\238\004]\004]\004]\004]\006\226\004]\001\238\004]\004]\004]\004]\004]\004]\004]\004]\007\129\004]\022\214\004]\004R\004]\004]\004]\004]\004]\006\189\004]\004]\005\138\004]\nI\004]\004]\004]\000\238\007\253\004]\004]\004]\004]\004]\004]\004]\b\005\004]\004]\004]\004]\004]\004]\004]\004]\004]\004]\004]\005\r\nB\n\198\n\138\004]\004]\n\150\003*\011\022\031W\004]\004]\004]\004]\004]\004b\004]\004]\004]\004]\nJ\r\253\n\206\004]\b\198\004]\004]\003.\004]\004]\004]\004]\004]\004]\004]\004]\004]\004]\004]\004]\004]\r\253\004]\004]\004]\004]\004]\011\r\011\r\005\r\005\r\007R\011\r\rn\011\r\011\r\nI\011\r\011\r\011\r\011\r\002\022\011\r\011\r\005\r\011\r\011\r\011\r\004\130\011\r\011\r\011\r\011\r\005\r\011\r\003^\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\001f\011\r\0176\011\r\004%\011\r\011\r\011\r\011\r\011\r\003b\011\r\011\r\001\218\011\r\014\234\011\r\011\r\011\r\026v\000\238\011\r\011\r\011\r\011\r\011\r\011\r\011\r\000\238\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\004R\011\r\011\r\026~\011\r\011\r\017>\0026\007\166\005\r\011\r\011\r\011\r\011\r\011\r\001\222\011\r\011\r\011\r\011\r\011\r\014\001\011\r\011\r\t5\011\r\011\r\bn\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\011\r\014\001\005\r\011\r\011\r\011\r\011\r\011\029\011\029\005B\b\"\004n\011\029\014n\011\029\011\029\000\238\011\029\011\029\011\029\011\029\001\206\011\029\011\029\000\238\011\029\011\029\011\029\000\238\011\029\011\029\011\029\011\029\n)\011\029\014r\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\005^\011\029\007\218\011\029\002v\011\029\011\029\011\029\011\029\011\029\tR\011\029\011\029\001\206\011\029\015\018\011\029\011\029\011\029\002\134\004\030\011\029\011\029\011\029\011\029\011\029\011\029\011\029\000\238\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\031g\011\029\011\029\004\"\011\029\011\029\b6\002B\007\166\n)\011\029\011\029\011\029\011\029\011\029\002\222\011\029\011\029\011\029\011\029\011\029\007I\011\029\011\029\004R\011\029\011\029\t6\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\011\029\007I\n)\011\029\011\029\011\029\011\029\011\021\011\021\002z\b\"\b\130\011\021\n%\011\021\011\021\bv\011\021\011\021\011\021\011\021\007r\011\021\011\021\000\238\011\021\011\021\011\021\000\238\011\021\011\021\011\021\011\021\001\134\011\021\004\166\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\015\198\011\021\003\186\011\021\002\198\011\021\011\021\011\021\011\021\011\021\t\229\011\021\011\021\003\190\011\021\015:\011\021\011\021\011\021\003F\003J\011\021\011\021\011\021\011\021\011\021\011\021\011\021\t*\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\004f\011\021\011\021\003\150\011\021\011\021\003\178\005\r\007\166\000\238\011\021\011\021\011\021\011\021\011\021\003\194\011\021\011\021\011\021\011\021\011\021\007Q\011\021\011\021\004R\011\021\011\021\019\194\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\011\021\007Q\004r\011\021\011\021\011\021\011\021\011\001\011\001\005\r\b\"\007r\011\001\t\229\011\001\011\001\000\238\011\001\011\001\011\001\011\001\000\238\011\001\011\001\017f\011\001\011\001\011\001\000\238\011\001\011\001\011\001\011\001\001\150\011\001\b\002\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\nE\011\001\r\150\011\001\007\182\011\001\011\001\011\001\011\001\011\001\018Z\011\001\011\001\000\238\011\001\015b\011\001\011\001\011\001\018\014\007\190\011\001\011\001\011\001\011\001\011\001\011\001\011\001\018b\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\002\014\011\001\011\001\r\178\011\001\011\001\003F\003J\007\166\007\209\011\001\011\001\011\001\011\001\011\001\007\170\011\001\011\001\011\001\011\001\011\001\020\166\011\001\011\001\b\198\011\001\011\001\020\n\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\nE\001\222\011\001\011\001\011\001\011\001\011\t\011\t\007\230\b\"\007r\011\t\017j\011\t\011\t\018\022\011\t\011\t\011\t\011\t\b\006\011\t\011\t\014\178\011\t\011\t\011\t\000\238\011\t\011\t\011\t\011\t\005~\011\t\t\222\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\005n\011\t\014\182\011\t\016\142\011\t\011\t\011\t\011\t\011\t\022.\011\t\011\t\000\238\011\t\015\134\011\t\011\t\011\t\001\222\005v\011\t\011\t\011\t\011\t\011\t\011\t\011\t\022>\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\003\190\011\t\011\t\r\242\011\t\011\t\003F\021\226\007\166\005\130\011\t\011\t\011\t\011\t\011\t\022\190\011\t\011\t\011\t\011\t\011\t\021\246\011\t\011\t\r\162\011\t\011\t\020&\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\011\t\021n\005&\011\t\011\t\011\t\011\t\011\005\011\005\016\146\b\"\007r\011\005\005&\011\005\011\005\000\238\011\005\011\005\011\005\011\005\001\206\011\005\011\005\n\218\011\005\011\005\011\005\000\238\011\005\011\005\011\005\011\005\005&\011\005\016\166\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\n\222\011\005\017\226\011\005\007\242\011\005\011\005\011\005\011\005\011\005\022R\011\005\011\005\r\170\011\005\015\170\011\005\011\005\011\005\002\170\b\026\011\005\011\005\011\005\011\005\011\005\011\005\011\005\022>\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\b\006\011\005\011\005\022\254\011\005\011\005\007*\007B\007\166\029\226\011\005\011\005\011\005\011\005\011\005\r\162\011\005\011\005\011\005\011\005\011\005\005\r\011\005\011\005\tE\011\005\011\005\020B\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\011\005\030\242\001\222\011\005\011\005\011\005\011\005\011\017\011\017\025\234\b\"\016\170\011\017\014\150\011\017\011\017\017\230\011\017\011\017\011\017\011\017\014~\011\017\011\017\017\138\011\017\011\017\011\017\000\238\011\017\011\017\011\017\011\017\014\154\011\017\000\238\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\014\130\011\017\025\242\011\017\018\202\011\017\011\017\011\017\011\017\011\017\006\181\011\017\011\017\002\158\011\017\015\214\011\017\011\017\011\017\007J\019r\011\017\011\017\011\017\011\017\011\017\011\017\011\017\005\r\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\004\182\011\017\011\017\023F\011\017\011\017\023.\018\030\007\166\001\206\011\017\011\017\011\017\011\017\011\017\005\002\011\017\011\017\011\017\011\017\011\017\017\142\011\017\011\017\005f\011\017\011\017\020^\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\011\017\014\194\000\238\011\017\011\017\011\017\011\017\011!\011!\021\234\b\"\029r\011!\014\226\011!\011!\001\206\011!\011!\011!\011!\018\158\011!\011!\014\198\011!\011!\011!\000\238\011!\011!\011!\011!\014\230\011!\r\162\011!\011!\011!\011!\011!\011!\011!\011!\006\174\011!\023N\011!\018\"\011!\011!\011!\011!\011!\005\r\011!\011!\027\n\011!\015\250\011!\011!\011!\002\198\007\234\011!\011!\011!\011!\011!\011!\011!\025\202\011!\011!\011!\011!\011!\011!\011!\011!\011!\011!\011!\002\198\011!\011!\n\138\011!\011!\n\150\005\r\001\002\001\190\011!\011!\011!\011!\011!\005\r\011!\011!\011!\011!\011!\r\162\011!\011!\019\022\011!\011!\000\238\011!\011!\011!\011!\011!\011!\011!\011!\011!\011!\011!\011!\011!\001\002\001\190\011!\011!\011!\011!\011\025\011\025\0222\003F\003J\011\025\015\n\011\025\011\025\002\198\011\025\011\025\011\025\011\025\0152\011\025\011\025\007v\011\025\011\025\011\025\n\218\011\025\011\025\011\025\011\025\002!\011\025\015\014\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\0156\011\025\022\150\011\025\015^\011\025\011\025\011\025\011\025\011\025\021*\011\025\011\025\002\158\011\025\016\030\011\025\011\025\011\025\n\130\n\178\011\025\011\025\011\025\011\025\011\025\011\025\011\025\026\018\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\003\190\011\025\011\025\n\138\011\025\011\025\n\150\022\210\007\166\006V\011\025\011\025\011\025\011\025\011\025\006\197\011\025\011\025\011\025\011\025\011\025\006n\011\025\011\025\000\238\011\025\011\025\030\138\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\011\025\001\002\001\190\011\025\011\025\011\025\011\025\011\145\011\145\022\218\b\"\014n\011\145\014\178\011\145\011\145\0317\011\145\011\145\011\145\011\145\006j\011\145\011\145\015\n\011\145\011\145\011\145\000\238\011\145\011\145\011\145\011\145\015\130\011\145\015\246\011\145\011\145\011\145\011\145\011\145\011\145\011\145\011\145\014.\011\145\016z\011\145\006\194\011\145\011\145\011\145\011\145\011\145\006\193\011\145\011\145\027\"\011\145\016:\011\145\011\145\011\145\023\006\014~\011\145\011\145\011\145\011\145\011\145\011\145\011\145\007.\011\145\011\145\011\145\011\145\011\145\011\145\011\145\011\145\011\145\011\145\011\145\001\206\011\145\011\145\015\166\011\145\011\145\025\246\025\238\001\002\001\190\011\145\011\145\011\145\011\145\011\145\014e\011\145\011\145\011\145\011\145\011\145\014\150\011\145\011\145\tA\011\145\011\145\t\253\011\145\011\145\011\145\011\145\011\145\011\145\011\145\011\145\011\145\011\145\011\145\011\145\011\145\015\210\030R\011\145\011\145\011\145\011\145\004Y\004Y\t\017\014\194\006\185\004Y\017z\004Y\004Y\023N\004Y\004Y\004Y\004Y\007>\004Y\004Y\014\226\004Y\004Y\004Y\000\238\004Y\004Y\004Y\004Y\016\026\004Y\017~\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\016n\004Y\b\130\004Y\000\238\004Y\004Y\004Y\004Y\004Y\000\238\004Y\004Y\019\150\004Y\000\238\004Y\004Y\004Y\026\130\0152\004Y\004Y\004Y\004Y\004Y\004Y\004Y\t\253\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\023\142\nB\n\198\016\134\004Y\004Y\007~\031w\007\138\004\242\004Y\004Y\004Y\004Y\004Y\028\238\004Y\004Y\004Y\004Y\nJ\017R\n\206\004Y\t9\004Y\004Y\n\001\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\004Y\017V\004Y\004Y\004Y\004Y\004Y\0021\0021\018\218\000\238\018*\0021\0049\002\198\0021\000\238\002\146\0021\n~\0021\017\190\002\254\0021\t\166\0021\0021\0021\000\238\0021\0021\0021\001\210\018.\n\182\t\190\003\002\0021\0021\0021\0021\0021\n\190\0021\017\194\003\006\019\154\003\166\027>\0021\0021\0021\0021\0021\029\250\003\238\001\190\004R\0021\030\174\0021\0021\002\186\023\162\017\238\003\246\0021\0021\0021\b\190\b\194\b\206\n\001\014\206\005\174\0021\0021\0021\0021\0021\0021\0021\0021\0021\0262\nB\n\198\017\242\0021\0021\t\234\n\134\n\174\rn\005\186\005\190\0021\0021\0021\n\186\0021\0021\0021\0021\014\214\t5\015R\0021\030\238\0021\0021\023:\0021\0021\0021\0021\0021\0021\005\194\b\214\0021\0021\0021\b\238\004\130\023r\n\202\0021\0021\0021\0021\011y\011y\029\166\b6\027\226\011y\r\142\002\198\011y\000\238\002\146\011y\011y\011y\027\022\002\254\011y\b6\011y\011y\011y\027\162\011y\011y\011y\001\210\023\166\011y\030\178\003\002\011y\011y\011y\011y\011y\011y\011y\b6\003\006\026R\003\166\027\166\011y\011y\011y\011y\011y\028\198\003\238\001\190\000\238\011y\r\190\011y\011y\002\186\026z\r\214\003\246\011y\011y\011y\b\190\b\194\b\206\005\161\011y\005\174\011y\011y\011y\011y\011y\011y\011y\011y\011y\014q\011y\011y\026\178\011y\011y\016\158\005%\016\186\028\250\005\186\005\190\011y\011y\011y\016\218\011y\011y\011y\011y\011y\027\230\011y\011y\018z\011y\011y\027v\011y\011y\011y\011y\011y\011y\005\194\b\214\011y\011y\011y\b\238\004\130\018\162\029\222\011y\011y\011y\011y\011u\011u\002\234\b6\030~\011u\004\014\002\198\011u\018\190\002\146\011u\011u\011u\018\194\002\254\011u\028\202\011u\011u\011u\018\234\011u\011u\011u\001\210\018\254\011u\019\030\003\002\011u\011u\011u\011u\011u\011u\011u\019.\003\006\019B\003\166\019n\011u\011u\011u\011u\011u\019\214\003\238\001\190\019\222\011u\021\"\011u\011u\002\186\028\254\0216\003\246\011u\011u\011u\b\190\b\194\b\206\021:\011u\005\174\011u\011u\011u\011u\011u\011u\011u\011u\011u\006\190\011u\011u\029\238\011u\011u\021\254\022\022\022\166\022\170\005\186\005\190\011u\011u\011u\022\226\011u\011u\011u\011u\011u\030\130\011u\011u\022\230\011u\011u\023\014\011u\011u\011u\011u\011u\011u\005\194\b\214\011u\011u\011u\b\238\004\130\023\018\023*\011u\011u\011u\011u\002\133\002\133\023\214\023\218\023\254\002\133\024\002\002\198\002\133\024\018\002\146\002\133\n~\002\133\024\"\002\254\002\133\024.\002\133\002\133\002\133\024b\002\133\002\133\002\133\001\210\002\001\n\182\024f\003\002\002\133\002\133\002\133\002\133\002\133\n\190\002\133\024\182\003\006\024\222\003\166\005\r\002\133\002\133\002\133\002\133\002\133\024\226\003\238\001\190\024\242\002\133\000\n\002\133\002\133\002\186\025B\025b\003\246\002\133\002\133\002\133\b\190\b\194\b\206\025\162\014\206\005\174\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\025\198\005y\002\133\002\001\002\133\002\133\005\r\007\002\002\198\005\r\005\186\005\190\002\133\002\133\002\133\025\214\002\133\002\133\002\133\002\133\025\254\000\238\005\r\002\133\005y\002\133\002\133\005\r\002\133\002\133\002\133\002\133\002\133\002\133\005\194\b\214\002\133\002\133\002\133\b\238\004\130\026\002\005\r\002\133\002\133\002\133\002\133\005\r\007\166\005\r\003\178\005\r\005\r\005\r\005\r\005\r\005\r\005\r\021\150\005\r\000\238\005\r\005\r\026\014\005\r\005\r\005\r\020\026\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\026\030\005\r\005\r\026:\026J\005\r\005\r\000\238\005\r\005\r\005\r\005\r\005\r\b\"\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\000\238\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\000\238\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\t\229\004^\005\r\026^\026\138\005\r\005\r\005\r\000\238\005\r\000\n\007\217\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\005\r\018n\025\186\005\r\005\r\002\001\002\001\b.\005\r\004R\007\217\026\142\005\r\005\r\007\217\b6\020\030\026*\002\001\000\238\005\r\005\r\005\r\b:\026\154\005\r\005\r\005\r\005\r\005\201\000\129\005\r\000\129\026\170\000\129\000\129\000\129\000\129\000\129\000\129\000\129\005\201\000\129\026\222\000\129\000\129\026\190\000\129\000\129\027\178\028\n\000\129\000\129\0282\000\129\000\129\000\129\000\129\028\166\000\129\004b\000\129\000\129\t\229\028\174\000\129\000\129\r\201\000\129\000\129\000\129\005\201\000\129\n)\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\007\217\029\006\000\129\000\129\r\201\r\201\000\129\000\129\r\201\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\004*\005\201\000\129\na\005\201\000\129\029\022\000\129\029\"\000\129\002\198\001b\014\005\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\029\134\029\154\029\202\000\129\001z\na\001\138\000\238\000\222\029\210\002\182\014\005\000\129\030\n\0302\030j\017\154\002R\000\129\000\129\000\129\000\129\030\154\030\166\000\129\000\129\000\129\000\129\002}\002}\002V\003\178\030\187\002}\030\203\002\198\002}\r\201\002\146\002}\nN\002}\030\222\002\254\002}\030\250\002}\002}\002}\019\246\002}\002}\002}\001\210\016r\031\023\016~\003\002\002}\002}\002}\002}\002}\031'\002}\031C\003\006\031\151\003\166\019\250\002}\002}\002}\002}\002}\031\179\003\238\b\210\031\190\002}\031\243\002}\002}\002\186 \007 \015\003\246\002}\002}\002}\b\190\b\194\b\206\nB\n\198\005\174\002}\002}\002}\002}\002}\002}\002}\002}\002} K\nB\n\198 S\002}\002}\000\000\nJ\000\000\n\206\005\186\005\190\002}\002}\002}\000\000\002}\002}\002}\002}\nJ\000\000\n\206\002}\000\000\002}\002}\000\000\002}\002}\002}\002}\002}\002}\005\194\b\214\002}\002}\002}\b\238\004\130\002\001\002\001\002}\002}\002}\002}\002\145\002\145\t\254\019\254\006e\002\145\020\014\002\198\002\145\000\000\000\000\002\145\n\018\002\145\003j\000\000\002\145\003\146\002\145\002\145\002\145\000\n\002\145\002\145\002\145\001\210\000\000\000\000\000\000\000\000\002\145\002\145\002\145\002\145\002\145\000\000\002\145\002\001\002\001\020~\000\000\000\000\002\145\002\145\002\145\002\145\002\145\006e\003\154\002\001\000\000\002\145\002\001\002\145\002\145\002\186\000\000\006\202\000\000\002\145\002\145\002\145\000\000\021\230\000\n\006e\000\000\000\000\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\006\206\nB\n\198\000\000\002\145\002\145\007j\000\000\000\000\002\198\000\000\000\000\002\145\002\145\002\145\002\001\002\145\002\145\002\145\002\145\nJ\018\150\n\206\002\145\002\146\002\145\002\145\001\210\002\145\002\145\002\145\002\145\002\145\002\145\t\209\000\000\002\145\002\145\002\145\002\001\025\170\000\238\000\000\002\145\002\145\002\145\002\145\002\141\002\141\000\000\026\230\003\178\002\141\026\234\000\000\002\141\000\000\002\186\002\141\000\000\002\141\000\000\018\154\002\141\027\026\002\141\002\141\002\141\000\n\002\141\002\141\002\141\000\000\t\209\000\000\000\000\018\166\002\141\002\141\002\141\002\141\002\141\000\000\002\141\002\001\006~\005u\027*\006\"\002\141\002\141\002\141\002\141\002\141\t\209\006\158\002\001\002\001\002\141\006\170\002\141\002\141\005\190\000\000\000\000\006\254\002\141\002\141\002\141\005u\000\000\000\000\000\000\000\000\000\000\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\000\000\nB\n\198\t\209\002\141\002\141\000\000\004\254\000\000\001\206\t\209\000\000\002\141\002\141\002\141\000\000\002\141\002\141\002\141\002\141\nJ\002\198\n\206\002\141\002\146\002\141\002\141\001\210\002\141\002\141\002\141\002\141\002\141\002\141\t\205\000\000\002\141\002\141\002\141\000\000\022\174\000\000\000\000\002\141\002\141\002\141\002\141\002\129\002\129\007\193\000\000\002\170\002\129\023&\003\190\002\129\000\000\002\186\002\129\000\000\002\129\000\000\021b\002\129\023>\002\129\002\129\002\129\007\006\002\129\002\129\002\129\007\193\t\205\000\000\000\000\018\166\002\129\002\129\002\129\002\129\002\129\000\000\002\129\000\000\000\000\000\000\000\000\000\000\002\129\002\129\002\129\002\129\002\129\t\205\t\n\001\190\001*\002\129\000\000\002\129\002\129\005\190\002\001\002\001\017Z\002\129\002\129\002\129\017n\017\130\017\146\000\000\000\000\000\000\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\000\000\nB\n\198\t\205\002\129\002\129\000\n\004\254\007\166\000\000\t\205\000\000\002\129\002\129\002\129\000\000\002\129\002\129\002\129\002\129\nJ\000\000\n\206\002\129\002\234\002\129\002\129\020R\002\129\002\129\002\129\002\129\002\129\002\129\002\001\014\142\002\129\002\129\002\129\000\000\005%\000\000\000\000\002\129\002\129\002\129\002\129\002)\002)\014\170\b\"\014\186\002)\r\193\003\190\002)\000\000\000\000\002)\000\000\002)\000\000\000\000\002)\b\142\002)\002)\002)\000\238\002)\002)\002)\r\193\r\193\000\000\000\000\r\193\002)\002)\002)\002)\002)\000\000\002)\b\146\005%\000\000\000\000\014\218\002)\002)\002)\002)\002)\000\000\t\n\017\206\000\000\002)\000\000\002)\002)\015\002\000\000\015*\017Z\002)\002)\002)\017n\017\130\017\146\b\130\020V\000\238\002)\002)\002)\002)\002)\002)\002)\002)\002)\000\000\000\238\002)\000\000\002)\002)\000\000\002\001\002\001\021\190\000\238\t)\002)\002)\002)\t)\002)\002)\002)\002)\r\193\000\000\002\001\002)\000\000\002)\002)\000\000\t\254\002)\002)\002)\002)\002)\000\n\n\162\002)\002)\n\018\000\000\n.\000\000\031\163\002)\002)\002)\002)\n\025\n\025\b\150\000\000\000\000\n\025\t)\006~\n\025\000\000\006\"\n\025\015\202\n\025\000\000\002\001\n\025\006\158\n\025\n\025\n\025\006\170\n\025\n\025\n\025\000\000\015\238\t)\016\018\020\238\n\025\n\025\n\025\n\025\n\025\000\000\n\025\000\000\000\000\n]\000\000\000\000\n\025\n\025\n\025\n\025\n\025\000\000\t\021\000\000\000\000\n\025\000\000\n\025\n\025\000\000\000\000\000\000\017\174\n\025\n\025\n\025\n]\000\000\004\254\000\000\000\000\002\254\n\025\n\025\n\025\n\025\n\025\n\025\n\025\n\025\n\025\000\000\000\000\n\025\000\000\n\025\n\025\000\000\003\026\000\000\000\000\000\238\000\000\n\025\n\025\n\025\000\000\n\025\n\025\n\025\n\025\003&\000\000\000\000\n\025\000\000\n\025\n\025\000\000\t\254\n\025\n\025\n\025\n\025\n\025\000\000\000\000\n\025\n\025\n\018\000\000\000\000\000\000\005\174\n\025\n\025\n\025\n\025\002\137\002\137\000\000\000\000\000\000\002\137\r\197\006~\002\137\000\000\006\"\002\137\000\000\002\137\000\000\005\186\002\137\006\158\002\137\002\137\002\137\006\170\002\137\002\137\002\137\r\197\r\197\000\000\000\000\r\197\002\137\002\137\002\137\002\137\002\137\000\000\002\137\t5\000\000\005\194\t5\000\000\002\137\002\137\002\137\002\137\002\137\000\000\000\000\000\000\000\000\002\137\000\000\002\137\002\137\000\000\000\000\000\000\0262\002\137\002\137\002\137\000\000\000\000\000\000\000\000\000\000\000\238\002\137\002\137\002\137\002\137\002\137\002\137\002\137\002\137\002\137\000\000\t5\002\137\000\000\002\137\002\137\000\000\000\000\000\000\000\000\000\000\000\000\002\137\002\137\002\137\t5\002\137\002\137\002\137\002\137\r\197\000\000\001\206\002\137\000\000\002\137\002\137\000\000\n\230\002\137\002\137\002\137\002\137\002\137\029\186\000\000\002\137\002\137\002\137\000\000\000\000\t5\000\000\002\137\002\137\002\137\002\137\n\t\n\t\000\000\000\000\000\000\n\t\007\221\004f\n\t\000\000\000\000\n\t\000\000\n\t\000\000\000\000\n\t\002\170\n\t\n\t\n\t\t5\n\t\n\t\n\t\007\221\000\000\000\000\000\000\007\221\n\t\n\t\n\t\n\t\n\t\000\000\n\t\000\000\000\000\000\000\000\000\000\000\n\t\n\t\n\t\n\t\n\t\004\222\004\170\004r\005\165\n\t\000\000\n\t\n\t\000\000\004.\004:\000\000\n\t\n\t\n\t\004F\000\000\000\000\000\000\000\000\000\238\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\000\000\000\000\n\t\000\000\n\t\n\t\000\000\000\000\000\000\000\000\000\238\t%\n\t\n\t\n\t\t%\n\t\n\t\n\t\n\t\007\221\000\000\000\000\n\t\000\000\n\t\n\t\000\000\t\254\n\t\n\t\n\t\n\t\n\t\000\000\000\000\n\t\n\t\n\018\000\000\r\254\000\000\000\000\n\t\n\t\n\t\n\t\003\193\003\193\000\000\000\000\000\000\003\193\t%\014\006\003\193\000\000\014\018\003\193\000\000\003\193\000\000\000\000\011&\014\030\003\193\011z\003\193\014*\003\193\003\193\003\193\000\000\000\000\t%\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\193\000\000\000\000\007\245\000\000\000\000\003\193\003\193\012\030\0126\003\193\000\000\000\000\000\000\000\000\003\193\000\000\012N\003\193\000\000\000\000\000\000\007\245\003\193\003\193\000\238\007\245\000\000\004\254\000\000\000\000\000\000\003\193\003\193\011>\011\190\012f\012~\012\174\003\193\003\193\000\000\000\000\003\193\000\000\003\193\012\198\000\000\000\000\000\000\000\000\000\238\000\000\003\193\003\193\012\222\000\000\003\193\003\193\003\193\003\193\000\000\000\000\000\000\003\193\000\000\003\193\003\193\000\000\r>\003\193\rV\012\150\003\193\003\193\000\000\000\000\003\193\012\246\003\193\000\000\b\193\000\000\000\000\003\193\003\193\r\014\r&\002\233\002\233\000\000\000\000\000\000\002\233\005\158\b\193\002\233\000\000\006\"\002\233\000\000\002\233\000\000\000\000\002\233\b\193\002\233\002\233\002\233\b\193\002\233\002\233\002\233\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\233\000\000\002\233\000\000\000\000\007\225\000\000\000\000\002\233\002\233\002\233\002\233\002\233\000\000\000\000\000\000\000\000\002\233\000\000\002\233\002\233\000\000\000\000\000\000\007\225\002\233\002\233\002\233\007\225\000\000\000\000\000\000\000\000\000\000\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\000\000\000\000\002\233\000\000\002\233\002\233\000\000\000\000\000\000\000\000\b\221\000\000\002\233\002\233\002\233\000\000\002\233\002\233\002\233\002\233\000\000\000\000\000\000\002\233\000\000\002\233\002\233\000\000\t\254\002\233\002\233\002\233\002\233\002\233\000\000\000\000\002\233\002\233\n\018\000\000\b\221\000\000\000\000\002\233\002\233\002\233\002\233\002\229\002\229\000\000\000\000\000\000\002\229\b\202\b\221\002\229\000\000\006\"\002\229\000\000\002\229\000\000\000\000\002\229\b\221\002\229\002\229\002\229\b\221\002\229\002\229\002\229\000\000\000\000\000\000\000\000\000\000\002\229\002\229\002\229\002\229\002\229\000\000\002\229\000\000\000\000\000\000\000\000\000\000\002\229\002\229\002\229\002\229\002\229\000\000\000\000\000\000\000\000\002\229\000\000\002\229\002\229\000\000\000\000\000\000\000\000\002\229\002\229\002\229\000\000\000\000\000\000\000\000\000\000\000\000\002\229\002\229\011>\002\229\002\229\002\229\002\229\002\229\002\229\000\000\000\000\002\229\000\000\002\229\002\229\000\000\000\000\000\000\000\000\000\238\000\000\002\229\002\229\002\229\000\000\002\229\002\229\002\229\002\229\000\000\000\000\000\000\002\229\000\000\002\229\002\229\000\000\002\229\002\229\002\229\002\229\002\229\002\229\000\000\000\000\002\229\002\229\002\229\000\000\b\249\000\000\000\000\002\229\002\229\002\229\002\229\002\185\002\185\000\000\000\000\000\000\002\185\000\000\006~\002\185\000\000\006\"\002\185\000\000\002\185\000\000\000\000\002\185\b\249\002\185\002\185\002\185\b\249\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\002\185\002\185\002\185\000\000\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\002\185\002\185\002\185\000\000\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\000\000\000\000\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\185\002\185\002\185\002\185\002\185\002\185\002\185\002\185\000\000\000\000\002\185\000\000\002\185\002\185\000\000\000\000\000\000\000\000\b\241\000\000\002\185\002\185\002\185\000\000\002\185\002\185\002\185\002\185\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\t\254\002\185\002\185\002\185\002\185\002\185\000\000\000\000\002\185\002\185\n\018\000\000\b\241\000\000\000\000\002\185\002\185\002\185\002\185\002\181\002\181\000\000\000\000\000\000\002\181\000\000\014B\002\181\000\000\b\241\002\181\000\000\002\181\000\000\000\000\002\181\b\241\002\181\002\181\002\181\b\241\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\181\000\000\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\002\181\002\181\002\181\000\000\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\000\000\000\000\000\000\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\181\011>\002\181\002\181\002\181\002\181\002\181\002\181\000\000\000\000\002\181\000\000\002\181\002\181\000\000\000\000\000\000\000\000\000\238\000\000\002\181\002\181\002\181\000\000\002\181\002\181\002\181\002\181\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\002\181\002\181\002\181\002\181\002\181\002\181\000\000\000\000\002\181\002\181\002\181\000\000\b\189\000\000\000\000\002\181\002\181\002\181\002\181\002\209\002\209\000\000\000\000\000\000\002\209\000\000\b\189\002\209\000\000\006\"\002\209\000\000\002\209\000\000\000\000\002\209\b\189\002\209\002\209\002\209\b\189\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\209\000\000\002\209\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\209\000\000\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\000\000\000\000\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\000\000\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\000\000\000\000\002\209\000\000\002\209\002\209\000\000\000\000\000\000\000\000\000\238\000\000\002\209\002\209\002\209\000\000\002\209\002\209\002\209\002\209\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\t\254\002\209\002\209\002\209\002\209\002\209\000\000\000\000\002\209\002\209\n\018\000\000\017*\000\000\000\000\002\209\002\209\002\209\002\209\002\205\002\205\000\000\000\000\000\000\002\205\000\000\014\006\002\205\000\000\014\018\002\205\000\000\002\205\000\000\000\000\011&\014\030\002\205\002\205\002\205\014*\002\205\002\205\002\205\000\000\000\000\000\000\000\000\000\000\002\205\002\205\002\205\011\166\002\205\000\000\002\205\018\150\000\000\000\000\002\146\000\000\002\205\002\205\002\205\002\205\002\205\000\000\000\000\000\000\000\000\002\205\000\000\002\205\002\205\000\000\000\000\000\000\000\000\002\205\002\205\002\205\000\000\000\000\000\000\000\000\000\000\000\000\002\205\002\205\011>\011\190\002\205\002\205\002\205\002\205\002\205\000\000\018\154\002\205\000\000\002\205\002\205\000\000\000\000\000\000\000\000\000\000\000\000\002\205\002\205\002\205\018\166\002\205\002\205\002\205\002\205\000\000\000\000\000\000\002\205\000\000\002\205\002\205\000\000\002\205\002\205\002\205\002\205\002\205\002\205\000\000\000\000\002\205\002\205\002\205\000\000\000\000\005\190\000\000\002\205\002\205\002\205\002\205\002\241\002\241\000\000\000\000\000\000\002\241\000\000\002\014\002\241\000\000\002\146\002\241\000\000\002\241\000\000\000\000\002\241\000\000\002\241\002\241\002\241\029*\002\241\002\241\002\241\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\241\000\000\002\241\018\150\000\000\000\000\002\146\000\000\002\241\002\241\002\241\002\241\002\241\000\000\030\214\001\222\000\000\002\241\000\000\002\241\002\241\000\000\000\000\000\000\000\000\002\241\002\241\002\241\018\166\000\000\000\000\000\000\000\000\000\000\002\241\002\241\002\241\002\241\002\241\002\241\002\241\002\241\002\241\000\000\018\154\002\241\000\000\002\241\002\241\000\000\000\000\000\000\000\000\000\000\005\190\002\241\002\241\002\241\018\166\002\241\002\241\002\241\002\241\000\000\000\000\000\000\002\241\000\000\002\241\002\241\000\000\t\254\002\241\002\241\002\241\002\241\002\241\000\000\000\000\002\241\002\241\n\018\000\000\000\000\005\190\000\000\002\241\002\241\002\241\002\241\002\237\002\237\000\000\000\000\000\000\002\237\000\000\003\190\002\237\000\000\000\000\002\237\000\000\002\237\000\000\000\000\002\237\000\000\002\237\002\237\002\237\025\014\002\237\002\237\002\237\000\000\000\000\000\000\000\000\000\000\002\237\002\237\002\237\002\237\002\237\000\000\002\237\000\000\000\000\000\000\000\000\000\000\002\237\002\237\002\237\002\237\002\237\000\000\005\246\000\000\000\000\002\237\000\000\002\237\002\237\000\000\000\000\000\000\004\006\002\237\002\237\002\237\006\210\000\000\004\018\000\000\000\000\000\000\002\237\002\237\011>\002\237\002\237\002\237\002\237\002\237\002\237\000\000\000\000\002\237\000\000\002\237\002\237\000\000\000\000\000\000\000\000\000\000\000\000\002\237\002\237\002\237\000\000\002\237\002\237\002\237\002\237\000\000\000\000\000\000\002\237\000\000\002\237\002\237\000\000\002\237\002\237\002\237\002\237\002\237\002\237\000\000\000\000\002\237\002\237\002\237\000\000\000\000\000\000\000\000\002\237\002\237\002\237\002\237\002\177\002\177\000\000\000\000\000\000\002\177\000\000\002\198\002\177\000\000\000\000\002\177\000\000\002\177\000\000\000\000\002\177\000\000\002\177\002\177\002\177\000\000\002\177\002\177\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\177\000\000\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\177\000\000\n\210\003\178\000\000\002\177\000\000\002\177\002\177\000\000\000\000\000\000\000\000\002\177\002\177\002\177\014f\000\000\014v\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\177\002\177\002\177\002\177\002\177\000\000\000\000\002\177\000\000\002\177\002\177\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\002\177\000\000\002\177\002\177\002\177\002\177\000\000\000\000\000\000\002\177\000\000\002\177\002\177\000\000\t\254\002\177\002\177\002\177\002\177\002\177\000\000\000\000\002\177\002\177\n\018\000\000\000\000\000\000\000\000\002\177\002\177\002\177\002\177\002\173\002\173\000\000\000\000\000\000\002\173\000\000\002\198\002\173\000\000\000\000\002\173\000\000\002\173\000\000\000\000\002\173\000\000\002\173\002\173\002\173\000\000\002\173\002\173\002\173\000\000\000\000\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\173\000\000\002\173\000\000\000\000\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\173\000\000\015V\003\178\000\000\002\173\000\000\002\173\002\173\000\000\000\000\000\000\000\000\002\173\002\173\002\173\015z\000\000\015\158\000\000\000\000\000\000\002\173\002\173\011>\002\173\002\173\002\173\002\173\002\173\002\173\000\000\000\000\002\173\000\000\002\173\002\173\000\000\000\000\000\000\000\000\000\000\000\000\002\173\002\173\002\173\000\000\002\173\002\173\002\173\002\173\000\000\000\000\000\000\002\173\000\000\002\173\002\173\000\000\002\173\002\173\002\173\002\173\002\173\002\173\000\000\000\000\002\173\002\173\002\173\000\000\000\000\000\000\000\000\002\173\002\173\002\173\002\173\002\201\002\201\000\000\000\000\000\000\002\201\000\000\000\000\002\201\000\000\000\000\002\201\000\000\002\201\000\000\000\000\002\201\000\000\002\201\002\201\002\201\000\000\002\201\002\201\002\201\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\002\201\002\201\000\000\002\201\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\002\201\002\201\000\000\000\000\000\000\000\000\002\201\000\000\002\201\002\201\000\000\000\000\000\000\000\000\002\201\002\201\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\000\000\000\000\002\201\000\000\002\201\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002\201\002\201\000\000\002\201\002\201\002\201\002\201\000\000\000\000\000\000\002\201\000\000\002\201\002\201\000\000\t\254\002\201\002\201\002\201\002\201\002\201\000\000\000\000\002\201\002\201\n\018\000\000\000\000\000\000\000\000\002\201\002\201\002\201\002\201\002\197\002\197\000\000\000\000\000\000\002\197\000\000\000\000\002\197\000\000\000\000\002\197\000\000\002\197\000\000\000\000\011&\000\000\002\197\002\197\002\197\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\011\166\002\197\000\000\002\197\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\002\197\002\197\000\000\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\000\000\000\000\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\011>\011\190\002\197\002\197\002\197\002\197\002\197\000\000\000\000\002\197\000\000\002\197\002\197\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\002\197\000\000\002\197\002\197\002\197\002\197\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\002\197\002\197\002\197\002\197\002\197\002\197\000\000\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\002\197\002\197\002\197\002\197\002\193\002\193\000\000\000\000\000\000\002\193\000\000\000\000\002\193\000\000\000\000\002\193\000\000\002\193\000\000\000\000\002\193\000\000\002\193\002\193\002\193\000\000\002\193\002\193\002\193\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\193\000\000\002\193\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\193\000\000\000\000\000\000\000\000\002\193\000\000\002\193\002\193\000\000\000\000\000\000\000\000\002\193\002\193\002\193\000\000\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\193\002\193\002\193\002\193\002\193\000\000\000\000\002\193\000\000\002\193\002\193\000\000\000\000\000\000\000\000\000\000\000\000\002\193\002\193\002\193\000\000\002\193\002\193\002\193\002\193\000\000\000\000\000\000\002\193\000\000\002\193\002\193\000\000\t\254\002\193\002\193\002\193\002\193\002\193\000\000\000\000\002\193\002\193\n\018\000\000\000\000\000\000\000\000\002\193\002\193\002\193\002\193\002\189\002\189\000\000\000\000\000\000\002\189\000\000\000\000\002\189\000\000\000\000\002\189\000\000\002\189\000\000\000\000\011&\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\011\166\002\189\000\000\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\002\189\002\189\000\000\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\000\000\000\000\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\011>\011\190\002\189\002\189\002\189\002\189\002\189\000\000\000\000\002\189\000\000\002\189\002\189\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\002\189\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\002\189\002\189\002\189\002\189\002\189\002\189\000\000\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\002\189\002\189\002\189\002\189\003\017\003\017\000\000\000\000\000\000\003\017\000\000\000\000\003\017\000\000\000\000\003\017\000\000\003\017\000\000\000\000\003\017\000\000\003\017\003\017\003\017\000\000\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\000\000\003\017\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\000\000\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\000\000\000\000\000\000\003\017\003\017\003\017\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\017\003\017\003\017\003\017\003\017\000\000\000\000\003\017\000\000\003\017\003\017\000\000\000\000\000\000\000\000\000\000\000\000\003\017\003\017\003\017\000\000\003\017\003\017\003\017\003\017\000\000\000\000\000\000\003\017\000\000\003\017\003\017\000\000\t\254\003\017\003\017\003\017\003\017\003\017\000\000\000\000\003\017\003\017\n\018\000\000\000\000\000\000\000\000\003\017\003\017\003\017\003\017\003\r\003\r\000\000\000\000\000\000\003\r\000\000\000\000\003\r\000\000\000\000\003\r\000\000\003\r\000\000\000\000\011&\000\000\003\r\003\r\003\r\000\000\003\r\003\r\003\r\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\r\000\000\000\000\000\000\000\000\000\000\003\r\003\r\012\030\0126\003\r\000\000\000\000\000\000\000\000\003\r\000\000\012N\003\r\000\000\000\000\000\000\000\000\003\r\003\r\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\r\003\r\011>\011\190\012f\012~\012\174\003\r\003\r\000\000\000\000\003\r\000\000\003\r\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\r\003\r\012\222\000\000\003\r\003\r\003\r\003\r\000\000\000\000\000\000\003\r\000\000\003\r\003\r\000\000\003\r\003\r\003\r\012\150\003\r\003\r\000\000\000\000\003\r\012\246\003\r\000\000\000\000\000\000\000\000\003\r\003\r\r\014\r&\002\225\002\225\000\000\000\000\000\000\002\225\000\000\000\000\002\225\000\000\000\000\002\225\000\000\002\225\000\000\000\000\002\225\000\000\002\225\002\225\002\225\000\000\002\225\002\225\002\225\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\225\000\000\002\225\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\225\000\000\000\000\000\000\000\000\002\225\000\000\002\225\002\225\000\000\000\000\000\000\000\000\002\225\002\225\002\225\000\000\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\000\000\000\000\002\225\000\000\002\225\002\225\000\000\000\000\000\000\000\000\000\000\000\000\002\225\002\225\002\225\000\000\002\225\002\225\002\225\002\225\000\000\000\000\000\000\002\225\000\000\002\225\002\225\000\000\t\254\002\225\002\225\002\225\002\225\002\225\000\000\000\000\002\225\002\225\n\018\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\221\002\221\000\000\000\000\000\000\002\221\000\000\000\000\002\221\000\000\000\000\002\221\000\000\002\221\000\000\000\000\011&\000\000\002\221\002\221\002\221\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\011\166\002\221\000\000\002\221\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\002\221\002\221\000\000\000\000\000\000\000\000\002\221\000\000\002\221\002\221\000\000\000\000\000\000\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\000\000\000\000\002\221\002\221\011>\011\190\002\221\002\221\002\221\002\221\002\221\000\000\000\000\002\221\000\000\002\221\002\221\000\000\000\000\000\000\000\000\000\000\000\000\002\221\002\221\002\221\000\000\002\221\002\221\002\221\002\221\000\000\000\000\000\000\002\221\000\000\002\221\002\221\000\000\002\221\002\221\002\221\002\221\002\221\002\221\000\000\000\000\002\221\002\221\002\221\000\000\000\000\000\000\000\000\002\221\002\221\002\221\002\221\002\217\002\217\000\000\000\000\000\000\002\217\000\000\000\000\002\217\000\000\000\000\002\217\000\000\002\217\000\000\000\000\002\217\000\000\002\217\002\217\002\217\000\000\002\217\002\217\002\217\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\217\000\000\002\217\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\217\000\000\000\000\000\000\000\000\002\217\000\000\002\217\002\217\000\000\000\000\000\000\000\000\002\217\002\217\002\217\000\000\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\217\002\217\002\217\002\217\002\217\000\000\000\000\002\217\000\000\002\217\002\217\000\000\000\000\000\000\000\000\000\000\000\000\002\217\002\217\002\217\000\000\002\217\002\217\002\217\002\217\000\000\000\000\000\000\002\217\000\000\002\217\002\217\000\000\t\254\002\217\002\217\002\217\002\217\002\217\000\000\000\000\002\217\002\217\n\018\000\000\000\000\000\000\000\000\002\217\002\217\002\217\002\217\002\213\002\213\000\000\000\000\000\000\002\213\000\000\000\000\002\213\000\000\000\000\002\213\000\000\002\213\000\000\000\000\011&\000\000\002\213\002\213\002\213\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\011\166\002\213\000\000\002\213\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\002\213\002\213\000\000\000\000\000\000\000\000\002\213\000\000\002\213\002\213\000\000\000\000\000\000\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\011>\011\190\002\213\002\213\002\213\002\213\002\213\000\000\000\000\002\213\000\000\002\213\002\213\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\002\213\000\000\002\213\002\213\002\213\002\213\000\000\000\000\000\000\002\213\000\000\002\213\002\213\000\000\002\213\002\213\002\213\002\213\002\213\002\213\000\000\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\002\213\002\213\002\213\002\213\003\001\003\001\000\000\000\000\000\000\003\001\000\000\000\000\003\001\000\000\000\000\003\001\000\000\003\001\000\000\000\000\003\001\000\000\003\001\003\001\003\001\000\000\003\001\003\001\003\001\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\003\001\000\000\003\001\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\003\001\000\000\000\000\000\000\000\000\003\001\000\000\003\001\003\001\000\000\000\000\000\000\000\000\003\001\003\001\003\001\000\000\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\000\000\000\000\003\001\000\000\003\001\003\001\000\000\000\000\000\000\000\000\000\000\000\000\003\001\003\001\003\001\000\000\003\001\003\001\003\001\003\001\000\000\000\000\000\000\003\001\000\000\003\001\003\001\000\000\t\254\003\001\003\001\003\001\003\001\003\001\000\000\000\000\003\001\003\001\n\018\000\000\000\000\000\000\000\000\003\001\003\001\003\001\003\001\002\253\002\253\000\000\000\000\000\000\002\253\000\000\000\000\002\253\000\000\000\000\002\253\000\000\002\253\000\000\000\000\011&\000\000\002\253\002\253\002\253\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\002\253\000\000\002\253\000\000\000\000\000\000\000\000\000\000\002\253\002\253\012\030\0126\002\253\000\000\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\000\000\000\000\000\000\002\253\002\253\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\011>\011\190\012f\012~\002\253\002\253\002\253\000\000\000\000\002\253\000\000\002\253\002\253\000\000\000\000\000\000\000\000\000\000\000\000\002\253\002\253\002\253\000\000\002\253\002\253\002\253\002\253\000\000\000\000\000\000\002\253\000\000\002\253\002\253\000\000\002\253\002\253\002\253\012\150\002\253\002\253\000\000\000\000\002\253\002\253\002\253\000\000\000\000\000\000\000\000\002\253\002\253\002\253\002\253\002\169\002\169\000\000\000\000\000\000\002\169\000\000\000\000\002\169\000\000\000\000\002\169\000\000\002\169\000\000\000\000\002\169\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\169\000\000\002\169\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\169\000\000\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\002\169\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\t\254\002\169\002\169\002\169\002\169\002\169\000\000\000\000\002\169\002\169\n\018\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002\165\002\165\000\000\000\000\000\000\002\165\000\000\000\000\002\165\000\000\000\000\002\165\000\000\002\165\000\000\000\000\011&\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\011\166\002\165\000\000\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\165\000\000\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\011>\011\190\002\165\002\165\002\165\002\165\002\165\000\000\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\002\165\002\165\000\000\002\165\002\165\002\165\002\165\000\000\000\000\000\000\002\165\000\000\002\165\002\165\000\000\002\165\002\165\002\165\002\165\002\165\002\165\000\000\000\000\002\165\002\165\002\165\000\000\000\000\000\000\000\000\002\165\002\165\002\165\002\165\002\161\002\161\000\000\000\000\000\000\002\161\000\000\000\000\002\161\000\000\000\000\002\161\000\000\002\161\000\000\000\000\002\161\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\161\000\000\002\161\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\161\000\000\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\000\000\002\161\002\161\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\002\161\000\000\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002\161\002\161\002\161\000\000\002\161\002\161\002\161\002\161\000\000\000\000\000\000\002\161\000\000\002\161\002\161\000\000\t\254\002\161\002\161\002\161\002\161\002\161\000\000\000\000\002\161\002\161\n\018\000\000\000\000\000\000\000\000\002\161\002\161\002\161\002\161\002\157\002\157\000\000\000\000\000\000\002\157\000\000\000\000\002\157\000\000\000\000\002\157\000\000\002\157\000\000\000\000\011&\000\000\002\157\002\157\002\157\000\000\002\157\002\157\002\157\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\002\157\000\000\002\157\000\000\000\000\000\000\000\000\000\000\002\157\002\157\012\030\0126\002\157\000\000\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\002\157\002\157\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\157\002\157\011>\011\190\012f\012~\002\157\002\157\002\157\000\000\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\000\000\000\000\002\157\002\157\002\157\000\000\002\157\002\157\002\157\002\157\000\000\000\000\000\000\002\157\000\000\002\157\002\157\000\000\002\157\002\157\002\157\012\150\002\157\002\157\000\000\000\000\002\157\002\157\002\157\000\000\000\000\000\000\000\000\002\157\002\157\002\157\002\157\003Q\003Q\000\000\000\000\000\000\003Q\000\000\000\000\003Q\000\000\000\000\003Q\000\000\003Q\000\000\000\000\003Q\000\000\003Q\003Q\003Q\000\000\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\000\000\003Q\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\000\000\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\000\000\000\000\000\000\003Q\003Q\003Q\000\000\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003Q\003Q\003Q\003Q\003Q\000\000\000\000\003Q\000\000\003Q\003Q\000\000\000\000\000\000\000\000\000\000\000\000\003Q\003Q\003Q\000\000\003Q\003Q\003Q\003Q\000\000\000\000\000\000\003Q\000\000\003Q\003Q\000\000\t\254\003Q\003Q\003Q\003Q\003Q\000\000\000\000\003Q\003Q\n\018\000\000\000\000\000\000\000\000\003Q\003Q\003Q\003Q\003M\003M\000\000\000\000\000\000\003M\000\000\000\000\003M\000\000\000\000\003M\000\000\003M\000\000\000\000\011&\000\000\003M\003M\003M\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\003M\000\000\003M\000\000\000\000\000\000\000\000\000\000\003M\003M\012\030\0126\003M\000\000\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\000\000\000\000\003M\003M\011>\011\190\012f\003M\003M\003M\003M\000\000\000\000\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\000\000\000\000\003M\003M\003M\000\000\003M\003M\003M\003M\000\000\000\000\000\000\003M\000\000\003M\003M\000\000\003M\003M\003M\012\150\003M\003M\000\000\000\000\003M\003M\003M\000\000\000\000\000\000\000\000\003M\003M\003M\003M\002\153\002\153\000\000\000\000\000\000\002\153\000\000\000\000\002\153\000\000\000\000\002\153\000\000\002\153\000\000\000\000\002\153\000\000\002\153\002\153\002\153\000\000\002\153\002\153\002\153\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\002\153\000\000\002\153\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\002\153\000\000\000\000\000\000\000\000\002\153\000\000\002\153\002\153\000\000\000\000\000\000\000\000\002\153\002\153\002\153\000\000\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\002\153\002\153\002\153\002\153\002\153\000\000\000\000\002\153\000\000\002\153\002\153\000\000\000\000\000\000\000\000\000\000\000\000\002\153\002\153\002\153\000\000\002\153\002\153\002\153\002\153\000\000\000\000\000\000\002\153\000\000\002\153\002\153\000\000\t\254\002\153\002\153\002\153\002\153\002\153\000\000\000\000\002\153\002\153\n\018\000\000\000\000\000\000\000\000\002\153\002\153\002\153\002\153\002\149\002\149\000\000\000\000\000\000\002\149\000\000\000\000\002\149\000\000\000\000\002\149\000\000\002\149\000\000\000\000\011&\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\002\149\000\000\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\012\030\0126\002\149\000\000\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\002\149\002\149\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\011>\011\190\012f\012~\002\149\002\149\002\149\000\000\000\000\002\149\000\000\002\149\002\149\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\002\149\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\002\149\002\149\002\149\012\150\002\149\002\149\000\000\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\002\149\002\149\002\149\002\149\003\t\003\t\000\000\000\000\000\000\003\t\000\000\000\000\003\t\000\000\000\000\003\t\000\000\003\t\000\000\000\000\003\t\000\000\003\t\003\t\003\t\000\000\003\t\003\t\003\t\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\000\000\003\t\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\000\000\000\000\000\000\000\000\003\t\000\000\003\t\003\t\000\000\000\000\000\000\000\000\003\t\003\t\003\t\000\000\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\000\000\000\000\003\t\000\000\003\t\003\t\000\000\000\000\000\000\000\000\000\000\000\000\003\t\003\t\003\t\000\000\003\t\003\t\003\t\003\t\000\000\000\000\000\000\003\t\000\000\003\t\003\t\000\000\t\254\003\t\003\t\003\t\003\t\003\t\000\000\000\000\003\t\003\t\n\018\000\000\000\000\000\000\000\000\003\t\003\t\003\t\003\t\003\005\003\005\000\000\000\000\000\000\003\005\000\000\000\000\003\005\000\000\000\000\003\005\000\000\003\005\000\000\000\000\011&\000\000\003\005\003\005\003\005\000\000\003\005\003\005\003\005\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\003\005\000\000\003\005\000\000\000\000\000\000\000\000\000\000\003\005\003\005\012\030\0126\003\005\000\000\000\000\000\000\000\000\003\005\000\000\003\005\003\005\000\000\000\000\000\000\000\000\003\005\003\005\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\005\003\005\011>\011\190\012f\012~\003\005\003\005\003\005\000\000\000\000\003\005\000\000\003\005\003\005\000\000\000\000\000\000\000\000\000\000\000\000\003\005\003\005\003\005\000\000\003\005\003\005\003\005\003\005\000\000\000\000\000\000\003\005\000\000\003\005\003\005\000\000\003\005\003\005\003\005\012\150\003\005\003\005\000\000\000\000\003\005\003\005\003\005\000\000\000\000\000\000\000\000\003\005\003\005\003\005\003\005\002\249\002\249\000\000\000\000\000\000\002\249\000\000\000\000\002\249\000\000\000\000\002\249\000\000\002\249\000\000\000\000\002\249\000\000\002\249\002\249\002\249\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\000\000\002\249\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\000\000\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\000\000\000\000\000\000\002\249\002\249\002\249\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\000\000\000\000\002\249\000\000\002\249\002\249\000\000\000\000\000\000\000\000\000\000\000\000\002\249\002\249\002\249\000\000\002\249\002\249\002\249\002\249\000\000\000\000\000\000\002\249\000\000\002\249\002\249\000\000\t\254\002\249\002\249\002\249\002\249\002\249\000\000\000\000\002\249\002\249\n\018\000\000\000\000\000\000\000\000\002\249\002\249\002\249\002\249\002\245\002\245\000\000\000\000\000\000\002\245\000\000\000\000\002\245\000\000\000\000\002\245\000\000\002\245\000\000\000\000\011&\000\000\002\245\002\245\002\245\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\002\245\000\000\002\245\000\000\000\000\000\000\000\000\000\000\002\245\002\245\012\030\0126\002\245\000\000\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\000\000\000\000\000\000\002\245\002\245\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\011>\011\190\012f\012~\002\245\002\245\002\245\000\000\000\000\002\245\000\000\002\245\002\245\000\000\000\000\000\000\000\000\000\000\000\000\002\245\002\245\002\245\000\000\002\245\002\245\002\245\002\245\000\000\000\000\000\000\002\245\000\000\002\245\002\245\000\000\002\245\002\245\002\245\012\150\002\245\002\245\000\000\000\000\002\245\002\245\002\245\000\000\000\000\000\000\000\000\002\245\002\245\002\245\002\245\003\025\003\025\000\000\000\000\000\000\003\025\000\000\000\000\003\025\000\000\000\000\003\025\000\000\003\025\000\000\000\000\003\025\000\000\003\025\003\025\003\025\000\000\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\000\000\003\025\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\000\000\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\000\000\000\000\000\000\003\025\003\025\003\025\000\000\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\025\003\025\000\000\000\000\003\025\000\000\003\025\003\025\000\000\000\000\000\000\000\000\000\000\000\000\003\025\003\025\003\025\000\000\003\025\003\025\003\025\003\025\000\000\000\000\000\000\003\025\000\000\003\025\003\025\000\000\t\254\003\025\003\025\003\025\003\025\003\025\000\000\000\000\003\025\003\025\n\018\000\000\000\000\000\000\000\000\003\025\003\025\003\025\003\025\003\021\003\021\000\000\000\000\000\000\003\021\000\000\000\000\003\021\000\000\000\000\003\021\000\000\003\021\000\000\000\000\011&\000\000\003\021\003\021\003\021\000\000\003\021\003\021\003\021\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\021\000\000\000\000\000\000\000\000\000\000\003\021\003\021\012\030\0126\003\021\000\000\000\000\000\000\000\000\003\021\000\000\012N\003\021\000\000\000\000\000\000\000\000\003\021\003\021\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\021\003\021\011>\011\190\012f\012~\012\174\003\021\003\021\000\000\000\000\003\021\000\000\003\021\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\021\003\021\012\222\000\000\003\021\003\021\003\021\003\021\000\000\000\000\000\000\003\021\000\000\003\021\003\021\000\000\003\021\003\021\003\021\012\150\003\021\003\021\000\000\000\000\003\021\012\246\003\021\000\000\000\000\000\000\000\000\003\021\003\021\r\014\r&\003!\003!\000\000\000\000\000\000\003!\000\000\000\000\003!\000\000\000\000\003!\000\000\003!\000\000\000\000\003!\000\000\003!\003!\003!\000\000\003!\003!\003!\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003!\000\000\003!\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003!\000\000\000\000\000\000\000\000\003!\000\000\003!\003!\000\000\000\000\000\000\000\000\003!\003!\003!\000\000\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003!\003!\003!\003!\003!\000\000\000\000\003!\000\000\003!\003!\000\000\000\000\000\000\000\000\000\000\000\000\003!\003!\003!\000\000\003!\003!\003!\003!\000\000\000\000\000\000\003!\000\000\003!\003!\000\000\t\254\003!\003!\003!\003!\003!\000\000\000\000\003!\003!\n\018\000\000\000\000\000\000\000\000\003!\003!\003!\003!\003\029\003\029\000\000\000\000\000\000\003\029\000\000\000\000\003\029\000\000\000\000\003\029\000\000\003\029\000\000\000\000\011&\000\000\003\029\003\029\003\029\000\000\003\029\003\029\003\029\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\003\029\000\000\003\029\000\000\000\000\000\000\000\000\000\000\003\029\003\029\012\030\0126\003\029\000\000\000\000\000\000\000\000\003\029\000\000\012N\003\029\000\000\000\000\000\000\000\000\003\029\003\029\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\029\003\029\011>\011\190\012f\012~\012\174\003\029\003\029\000\000\000\000\003\029\000\000\003\029\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\029\003\029\012\222\000\000\003\029\003\029\003\029\003\029\000\000\000\000\000\000\003\029\000\000\003\029\003\029\000\000\003\029\003\029\003\029\012\150\003\029\003\029\000\000\000\000\003\029\003\029\003\029\000\000\000\000\000\000\000\000\003\029\003\029\r\014\r&\003)\003)\000\000\000\000\000\000\003)\000\000\000\000\003)\000\000\000\000\003)\000\000\003)\000\000\000\000\003)\000\000\003)\003)\003)\000\000\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\000\000\003)\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\000\000\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\000\000\000\000\000\000\003)\003)\003)\000\000\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003)\003)\003)\003)\003)\000\000\000\000\003)\000\000\003)\003)\000\000\000\000\000\000\000\000\000\000\000\000\003)\003)\003)\000\000\003)\003)\003)\003)\000\000\000\000\000\000\003)\000\000\003)\003)\000\000\t\254\003)\003)\003)\003)\003)\000\000\000\000\003)\003)\n\018\000\000\000\000\000\000\000\000\003)\003)\003)\003)\003%\003%\000\000\000\000\000\000\003%\000\000\000\000\003%\000\000\000\000\003%\000\000\003%\000\000\000\000\011&\000\000\003%\003%\003%\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\003%\000\000\003%\000\000\000\000\000\000\000\000\000\000\003%\003%\012\030\0126\003%\000\000\000\000\000\000\000\000\003%\000\000\012N\003%\000\000\000\000\000\000\000\000\003%\003%\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003%\003%\011>\011\190\012f\012~\012\174\003%\003%\000\000\000\000\003%\000\000\003%\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003%\003%\012\222\000\000\003%\003%\003%\003%\000\000\000\000\000\000\003%\000\000\003%\003%\000\000\003%\003%\003%\012\150\003%\003%\000\000\000\000\003%\003%\003%\000\000\000\000\000\000\000\000\003%\003%\r\014\r&\n\017\n\017\000\000\000\000\000\000\n\017\000\000\000\000\n\017\000\000\000\000\n\017\000\000\n\017\000\000\000\000\n\017\000\000\n\017\n\017\n\017\000\000\n\017\n\017\n\017\000\000\000\000\000\000\000\000\000\000\n\017\n\017\n\017\n\017\n\017\000\000\n\017\000\000\000\000\000\000\000\000\000\000\n\017\n\017\n\017\n\017\n\017\000\000\000\000\000\000\000\000\n\017\000\000\n\017\n\017\000\000\000\000\000\000\000\000\n\017\n\017\n\017\000\000\000\000\000\000\000\000\000\000\000\000\n\017\n\017\n\017\n\017\n\017\n\017\n\017\n\017\n\017\000\000\000\000\n\017\000\000\n\017\n\017\000\000\000\000\000\000\000\000\000\000\000\000\n\017\n\017\n\017\000\000\n\017\n\017\n\017\n\017\000\000\000\000\000\000\n\017\000\000\n\017\n\017\000\000\t\254\n\017\n\017\n\017\n\017\n\017\000\000\000\000\n\017\n\017\n\018\000\000\000\000\000\000\000\000\n\017\n\017\n\017\n\017\n\r\n\r\000\000\000\000\000\000\n\r\000\000\000\000\n\r\000\000\000\000\n\r\000\000\n\r\000\000\000\000\011&\000\000\n\r\n\r\n\r\000\000\n\r\n\r\n\r\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\n\r\000\000\000\000\000\000\000\000\000\000\n\r\n\r\012\030\0126\n\r\000\000\000\000\000\000\000\000\n\r\000\000\012N\n\r\000\000\000\000\000\000\000\000\n\r\n\r\000\238\000\000\000\000\000\000\000\000\000\000\000\000\n\r\n\r\011>\011\190\012f\012~\012\174\n\r\n\r\000\000\000\000\n\r\000\000\n\r\012\198\000\000\000\000\000\000\000\000\000\000\000\000\n\r\n\r\012\222\000\000\n\r\n\r\n\r\n\r\000\000\000\000\000\000\n\r\000\000\n\r\n\r\000\000\n\r\n\r\n\r\012\150\n\r\n\r\000\000\000\000\n\r\012\246\n\r\000\000\000\000\000\000\000\000\n\r\n\r\r\014\r&\0031\0031\000\000\000\000\000\000\0031\000\000\000\000\0031\000\000\000\000\0031\000\000\0031\000\000\000\000\0031\000\000\0031\0031\0031\000\000\0031\0031\0031\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\000\000\0031\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\000\000\000\000\000\000\000\000\0031\000\000\0031\0031\000\000\000\000\000\000\000\000\0031\0031\0031\000\000\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\0031\0031\0031\0031\0031\0031\000\000\000\000\0031\000\000\0031\0031\000\000\000\000\000\000\000\000\000\000\000\000\0031\0031\0031\000\000\0031\0031\0031\0031\000\000\000\000\000\000\0031\000\000\0031\0031\000\000\t\254\0031\0031\0031\0031\0031\000\000\000\000\0031\0031\n\018\000\000\000\000\000\000\000\000\0031\0031\0031\0031\003-\003-\000\000\000\000\000\000\003-\000\000\000\000\003-\000\000\000\000\003-\000\000\003-\000\000\000\000\011&\000\000\003-\003-\003-\000\000\003-\003-\003-\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003-\000\000\000\000\000\000\000\000\000\000\003-\003-\012\030\0126\003-\000\000\000\000\000\000\000\000\003-\000\000\012N\003-\000\000\000\000\000\000\000\000\003-\003-\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003-\003-\011>\011\190\012f\012~\012\174\003-\003-\000\000\000\000\003-\000\000\003-\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003-\003-\012\222\000\000\003-\003-\003-\003-\000\000\000\000\000\000\003-\000\000\003-\003-\000\000\r>\003-\rV\012\150\003-\003-\000\000\000\000\003-\012\246\003-\000\000\000\000\000\000\000\000\003-\003-\r\014\r&\n\005\n\005\000\000\000\000\000\000\n\005\000\000\000\000\n\005\000\000\000\000\n\005\000\000\n\005\000\000\000\000\011&\000\000\n\005\n\005\n\005\000\000\n\005\n\005\n\005\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\n\005\000\000\000\000\000\000\000\000\000\000\n\005\n\005\012\030\0126\n\005\000\000\000\000\000\000\000\000\n\005\000\000\012N\n\005\000\000\000\000\000\000\000\000\n\005\n\005\000\238\000\000\000\000\000\000\000\000\000\000\000\000\n\005\n\005\011>\011\190\012f\012~\012\174\n\005\n\005\000\000\000\000\n\005\000\000\n\005\012\198\000\000\000\000\000\000\000\000\000\000\000\000\n\005\n\005\012\222\000\000\n\005\n\005\n\005\n\005\000\000\000\000\000\000\n\005\000\000\n\005\n\005\000\000\n\005\n\005\n\005\012\150\n\005\n\005\000\000\000\000\n\005\012\246\n\005\000\000\000\000\000\000\000\000\n\005\n\005\r\014\r&\003\129\003\129\000\000\000\000\000\000\003\129\000\000\000\000\003\129\000\000\000\000\003\129\000\000\003\129\000\000\000\000\003\129\000\000\003\129\003\129\003\129\000\000\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\000\000\003\129\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\000\000\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\000\000\000\000\000\000\003\129\003\129\003\129\000\000\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003\129\003\129\003\129\003\129\003\129\000\000\000\000\003\129\000\000\003\129\003\129\000\000\000\000\000\000\000\000\000\000\000\000\003\129\003\129\003\129\000\000\003\129\003\129\003\129\003\129\000\000\000\000\000\000\003\129\000\000\003\129\003\129\000\000\t\254\003\129\003\129\003\129\003\129\003\129\000\000\000\000\003\129\003\129\n\018\000\000\000\000\000\000\000\000\003\129\003\129\003\129\003\129\003}\003}\000\000\000\000\000\000\003}\000\000\000\000\003}\000\000\000\000\003}\000\000\003}\000\000\000\000\011&\000\000\003}\003}\003}\000\000\003}\003}\003}\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003}\000\000\000\000\000\000\000\000\000\000\003}\003}\012\030\0126\003}\000\000\000\000\000\000\000\000\003}\000\000\012N\003}\000\000\000\000\000\000\000\000\003}\003}\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003}\003}\011>\011\190\012f\012~\012\174\003}\003}\000\000\000\000\003}\000\000\003}\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003}\003}\012\222\000\000\003}\003}\003}\003}\000\000\000\000\000\000\003}\000\000\003}\003}\000\000\r>\003}\rV\012\150\003}\003}\000\000\000\000\003}\012\246\003}\000\000\000\000\000\000\000\000\003}\003}\r\014\r&\003\161\003\161\000\000\000\000\000\000\003\161\000\000\000\000\003\161\000\000\000\000\003\161\000\000\003\161\000\000\000\000\003\161\000\000\003\161\003\161\003\161\000\000\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\000\000\003\161\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\000\000\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\000\000\000\000\000\000\003\161\003\161\003\161\000\000\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\000\000\000\000\003\161\000\000\003\161\003\161\000\000\000\000\000\000\000\000\000\000\000\000\003\161\003\161\003\161\000\000\003\161\003\161\003\161\003\161\000\000\000\000\000\000\003\161\000\000\003\161\003\161\000\000\t\254\003\161\003\161\003\161\003\161\003\161\000\000\000\000\003\161\003\161\n\018\000\000\000\000\000\000\000\000\003\161\003\161\003\161\003\161\003\157\003\157\000\000\000\000\000\000\003\157\000\000\000\000\003\157\000\000\000\000\003\157\000\000\003\157\000\000\000\000\011&\000\000\003\157\003\157\003\157\000\000\003\157\003\157\003\157\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\157\000\000\000\000\000\000\000\000\000\000\003\157\003\157\012\030\0126\003\157\000\000\000\000\000\000\000\000\003\157\000\000\012N\003\157\000\000\000\000\000\000\000\000\003\157\003\157\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\157\003\157\011>\011\190\012f\012~\012\174\003\157\003\157\000\000\000\000\003\157\000\000\003\157\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\157\003\157\012\222\000\000\003\157\003\157\003\157\003\157\000\000\000\000\000\000\003\157\000\000\003\157\003\157\000\000\r>\003\157\rV\012\150\003\157\003\157\000\000\000\000\003\157\012\246\003\157\000\000\000\000\000\000\000\000\003\157\003\157\r\014\r&\003\145\003\145\000\000\000\000\000\000\003\145\000\000\000\000\003\145\000\000\000\000\003\145\000\000\003\145\000\000\000\000\003\145\000\000\003\145\003\145\003\145\000\000\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\000\000\003\145\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\000\000\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\000\000\000\000\000\000\003\145\003\145\003\145\000\000\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\145\003\145\003\145\003\145\003\145\000\000\000\000\003\145\000\000\003\145\003\145\000\000\000\000\000\000\000\000\000\000\000\000\003\145\003\145\003\145\000\000\003\145\003\145\003\145\003\145\000\000\000\000\000\000\003\145\000\000\003\145\003\145\000\000\t\254\003\145\003\145\003\145\003\145\003\145\000\000\000\000\003\145\003\145\n\018\000\000\000\000\000\000\000\000\003\145\003\145\003\145\003\145\003\141\003\141\000\000\000\000\000\000\003\141\000\000\000\000\003\141\000\000\000\000\003\141\000\000\003\141\000\000\000\000\011&\000\000\003\141\003\141\003\141\000\000\003\141\003\141\003\141\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\141\000\000\000\000\000\000\000\000\000\000\003\141\003\141\012\030\0126\003\141\000\000\000\000\000\000\000\000\003\141\000\000\012N\003\141\000\000\000\000\000\000\000\000\003\141\003\141\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\141\003\141\011>\011\190\012f\012~\012\174\003\141\003\141\000\000\000\000\003\141\000\000\003\141\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\141\003\141\012\222\000\000\003\141\003\141\003\141\003\141\000\000\000\000\000\000\003\141\000\000\003\141\003\141\000\000\r>\003\141\rV\012\150\003\141\003\141\000\000\000\000\003\141\012\246\003\141\000\000\000\000\000\000\000\000\003\141\003\141\r\014\r&\003i\003i\000\000\000\000\000\000\003i\000\000\000\000\003i\000\000\000\000\003i\000\000\003i\000\000\000\000\003i\000\000\003i\003i\003i\000\000\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\000\000\003i\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\000\000\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\000\000\000\000\000\000\003i\003i\003i\000\000\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003i\003i\003i\003i\003i\000\000\000\000\003i\000\000\003i\003i\000\000\000\000\000\000\000\000\000\000\000\000\003i\003i\003i\000\000\003i\003i\003i\003i\000\000\000\000\000\000\003i\000\000\003i\003i\000\000\t\254\003i\003i\003i\003i\003i\000\000\000\000\003i\003i\n\018\000\000\000\000\000\000\000\000\003i\003i\003i\003i\003e\003e\000\000\000\000\000\000\003e\000\000\000\000\003e\000\000\000\000\003e\000\000\003e\000\000\000\000\011&\000\000\003e\003e\003e\000\000\003e\003e\003e\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003e\000\000\000\000\000\000\000\000\000\000\003e\003e\012\030\0126\003e\000\000\000\000\000\000\000\000\003e\000\000\012N\003e\000\000\000\000\000\000\000\000\003e\003e\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003e\003e\011>\011\190\012f\012~\012\174\003e\003e\000\000\000\000\003e\000\000\003e\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003e\003e\012\222\000\000\003e\003e\003e\003e\000\000\000\000\000\000\003e\000\000\003e\003e\000\000\r>\003e\rV\012\150\003e\003e\000\000\000\000\003e\012\246\003e\000\000\000\000\000\000\000\000\003e\003e\r\014\r&\003y\003y\000\000\000\000\000\000\003y\000\000\000\000\003y\000\000\000\000\003y\000\000\003y\000\000\000\000\003y\000\000\003y\003y\003y\000\000\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\000\000\003y\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\000\000\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\000\000\000\000\000\000\003y\003y\003y\000\000\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003y\003y\003y\003y\003y\000\000\000\000\003y\000\000\003y\003y\000\000\000\000\000\000\000\000\000\000\000\000\003y\003y\003y\000\000\003y\003y\003y\003y\000\000\000\000\000\000\003y\000\000\003y\003y\000\000\t\254\003y\003y\003y\003y\003y\000\000\000\000\003y\003y\n\018\000\000\000\000\000\000\000\000\003y\003y\003y\003y\003u\003u\000\000\000\000\000\000\003u\000\000\000\000\003u\000\000\000\000\003u\000\000\003u\000\000\000\000\011&\000\000\003u\003u\003u\000\000\003u\003u\003u\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003u\000\000\000\000\000\000\000\000\000\000\003u\003u\012\030\0126\003u\000\000\000\000\000\000\000\000\003u\000\000\012N\003u\000\000\000\000\000\000\000\000\003u\003u\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003u\003u\011>\011\190\012f\012~\012\174\003u\003u\000\000\000\000\003u\000\000\003u\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003u\003u\012\222\000\000\003u\003u\003u\003u\000\000\000\000\000\000\003u\000\000\003u\003u\000\000\r>\003u\rV\012\150\003u\003u\000\000\000\000\003u\012\246\003u\000\000\000\000\000\000\000\000\003u\003u\r\014\r&\003q\003q\000\000\000\000\000\000\003q\000\000\000\000\003q\000\000\000\000\003q\000\000\003q\000\000\000\000\003q\000\000\003q\003q\003q\000\000\003q\003q\003q\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\000\000\003q\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\000\000\000\000\000\000\000\000\003q\000\000\003q\003q\000\000\000\000\000\000\000\000\003q\003q\003q\000\000\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003q\003q\003q\003q\003q\000\000\000\000\003q\000\000\003q\003q\000\000\000\000\000\000\000\000\000\000\000\000\003q\003q\003q\000\000\003q\003q\003q\003q\000\000\000\000\000\000\003q\000\000\003q\003q\000\000\t\254\003q\003q\003q\003q\003q\000\000\000\000\003q\003q\n\018\000\000\000\000\000\000\000\000\003q\003q\003q\003q\003m\003m\000\000\000\000\000\000\003m\000\000\000\000\003m\000\000\000\000\003m\000\000\003m\000\000\000\000\011&\000\000\003m\003m\003m\000\000\003m\003m\003m\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003m\000\000\000\000\000\000\000\000\000\000\003m\003m\012\030\0126\003m\000\000\000\000\000\000\000\000\003m\000\000\012N\003m\000\000\000\000\000\000\000\000\003m\003m\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\011>\011\190\012f\012~\012\174\003m\003m\000\000\000\000\003m\000\000\003m\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003m\003m\012\222\000\000\003m\003m\003m\003m\000\000\000\000\000\000\003m\000\000\003m\003m\000\000\r>\003m\rV\012\150\003m\003m\000\000\000\000\003m\012\246\003m\000\000\000\000\000\000\000\000\003m\003m\r\014\r&\003\137\003\137\000\000\000\000\000\000\003\137\000\000\000\000\003\137\000\000\000\000\003\137\000\000\003\137\000\000\000\000\003\137\000\000\003\137\003\137\003\137\000\000\003\137\003\137\003\137\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\137\000\000\003\137\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\137\000\000\000\000\000\000\000\000\003\137\000\000\003\137\003\137\000\000\000\000\000\000\000\000\003\137\003\137\003\137\000\000\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\137\003\137\003\137\003\137\003\137\000\000\000\000\003\137\000\000\003\137\003\137\000\000\000\000\000\000\000\000\000\000\000\000\003\137\003\137\003\137\000\000\003\137\003\137\003\137\003\137\000\000\000\000\000\000\003\137\000\000\003\137\003\137\000\000\t\254\003\137\003\137\003\137\003\137\003\137\000\000\000\000\003\137\003\137\n\018\000\000\000\000\000\000\000\000\003\137\003\137\003\137\003\137\003\133\003\133\000\000\000\000\000\000\003\133\000\000\000\000\003\133\000\000\000\000\003\133\000\000\003\133\000\000\000\000\011&\000\000\003\133\003\133\003\133\000\000\003\133\003\133\003\133\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\133\000\000\000\000\000\000\000\000\000\000\003\133\003\133\012\030\0126\003\133\000\000\000\000\000\000\000\000\003\133\000\000\012N\003\133\000\000\000\000\000\000\000\000\003\133\003\133\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\133\003\133\011>\011\190\012f\012~\012\174\003\133\003\133\000\000\000\000\003\133\000\000\003\133\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\133\003\133\012\222\000\000\003\133\003\133\003\133\003\133\000\000\000\000\000\000\003\133\000\000\003\133\003\133\000\000\r>\003\133\rV\012\150\003\133\003\133\000\000\000\000\003\133\012\246\003\133\000\000\000\000\000\000\000\000\003\133\003\133\r\014\r&\003\169\003\169\000\000\000\000\000\000\003\169\000\000\000\000\003\169\000\000\000\000\003\169\000\000\003\169\000\000\000\000\003\169\000\000\003\169\003\169\003\169\000\000\003\169\003\169\003\169\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\000\000\003\169\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\000\000\000\000\000\000\000\000\003\169\000\000\003\169\003\169\000\000\000\000\000\000\000\000\003\169\003\169\003\169\000\000\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\169\003\169\003\169\003\169\003\169\000\000\000\000\003\169\000\000\003\169\003\169\000\000\000\000\000\000\000\000\000\000\000\000\003\169\003\169\003\169\000\000\003\169\003\169\003\169\003\169\000\000\000\000\000\000\003\169\000\000\003\169\003\169\000\000\t\254\003\169\003\169\003\169\003\169\003\169\000\000\000\000\003\169\003\169\n\018\000\000\000\000\000\000\000\000\003\169\003\169\003\169\003\169\003\165\003\165\000\000\000\000\000\000\003\165\000\000\000\000\003\165\000\000\000\000\003\165\000\000\003\165\000\000\000\000\011&\000\000\003\165\003\165\003\165\000\000\003\165\003\165\003\165\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\165\000\000\000\000\000\000\000\000\000\000\003\165\003\165\012\030\0126\003\165\000\000\000\000\000\000\000\000\003\165\000\000\012N\003\165\000\000\000\000\000\000\000\000\003\165\003\165\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\165\003\165\011>\011\190\012f\012~\012\174\003\165\003\165\000\000\000\000\003\165\000\000\003\165\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\165\003\165\012\222\000\000\003\165\003\165\003\165\003\165\000\000\000\000\000\000\003\165\000\000\003\165\003\165\000\000\r>\003\165\rV\012\150\003\165\003\165\000\000\000\000\003\165\012\246\003\165\000\000\000\000\000\000\000\000\003\165\003\165\r\014\r&\003\153\003\153\000\000\000\000\000\000\003\153\000\000\000\000\003\153\000\000\000\000\003\153\000\000\003\153\000\000\000\000\003\153\000\000\003\153\003\153\003\153\000\000\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\000\000\003\153\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\000\000\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\000\000\000\000\000\000\003\153\003\153\003\153\000\000\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\153\003\153\003\153\003\153\003\153\000\000\000\000\003\153\000\000\003\153\003\153\000\000\000\000\000\000\000\000\000\000\000\000\003\153\003\153\003\153\000\000\003\153\003\153\003\153\003\153\000\000\000\000\000\000\003\153\000\000\003\153\003\153\000\000\t\254\003\153\003\153\003\153\003\153\003\153\000\000\000\000\003\153\003\153\n\018\000\000\000\000\000\000\000\000\003\153\003\153\003\153\003\153\003\149\003\149\000\000\000\000\000\000\003\149\000\000\000\000\003\149\000\000\000\000\003\149\000\000\003\149\000\000\000\000\011&\000\000\003\149\003\149\003\149\000\000\003\149\003\149\003\149\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003\149\000\000\000\000\000\000\000\000\000\000\003\149\003\149\012\030\0126\003\149\000\000\000\000\000\000\000\000\003\149\000\000\012N\003\149\000\000\000\000\000\000\000\000\003\149\003\149\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003\149\003\149\011>\011\190\012f\012~\012\174\003\149\003\149\000\000\000\000\003\149\000\000\003\149\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003\149\003\149\012\222\000\000\003\149\003\149\003\149\003\149\000\000\000\000\000\000\003\149\000\000\003\149\003\149\000\000\r>\003\149\rV\012\150\003\149\003\149\000\000\000\000\003\149\012\246\003\149\000\000\000\000\000\000\000\000\003\149\003\149\r\014\r&\003a\003a\000\000\000\000\000\000\003a\000\000\000\000\003a\000\000\000\000\003a\000\000\003a\000\000\000\000\003a\000\000\003a\003a\003a\000\000\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\000\000\003a\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\000\000\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\000\000\000\000\000\000\003a\003a\003a\000\000\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003a\003a\003a\003a\003a\000\000\000\000\003a\000\000\003a\003a\000\000\000\000\000\000\000\000\000\000\000\000\003a\003a\003a\000\000\003a\003a\003a\003a\000\000\000\000\000\000\003a\000\000\003a\003a\000\000\t\254\003a\003a\003a\003a\003a\000\000\000\000\003a\003a\n\018\000\000\000\000\000\000\000\000\003a\003a\003a\003a\003]\003]\000\000\000\000\000\000\003]\000\000\000\000\003]\000\000\000\000\003]\000\000\003]\000\000\000\000\011&\000\000\003]\003]\003]\000\000\003]\003]\003]\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003]\000\000\000\000\000\000\000\000\000\000\003]\003]\012\030\0126\003]\000\000\000\000\000\000\000\000\003]\000\000\012N\003]\000\000\000\000\000\000\000\000\003]\003]\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003]\003]\011>\011\190\012f\012~\012\174\003]\003]\000\000\000\000\003]\000\000\003]\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003]\003]\012\222\000\000\003]\003]\003]\003]\000\000\000\000\000\000\003]\000\000\003]\003]\000\000\r>\003]\rV\012\150\003]\003]\000\000\000\000\003]\012\246\003]\000\000\000\000\000\000\000\000\003]\003]\r\014\r&\n\021\n\021\000\000\000\000\000\000\n\021\000\000\000\000\n\021\000\000\000\000\n\021\000\000\n\021\000\000\000\000\011&\000\000\n\021\n\021\n\021\000\000\n\021\n\021\n\021\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\n\021\000\000\000\000\000\000\000\000\000\000\n\021\n\021\012\030\0126\n\021\000\000\000\000\000\000\000\000\n\021\000\000\012N\n\021\000\000\000\000\000\000\000\000\n\021\n\021\000\238\000\000\000\000\000\000\000\000\000\000\000\000\n\021\n\021\011>\011\190\012f\012~\012\174\n\021\n\021\000\000\000\000\n\021\000\000\n\021\012\198\000\000\000\000\000\000\000\000\000\000\000\000\n\021\n\021\012\222\000\000\n\021\n\021\n\021\n\021\000\000\000\000\000\000\n\021\000\000\n\021\n\021\000\000\n\021\n\021\n\021\012\150\n\021\n\021\000\000\000\000\n\021\012\246\n\021\000\000\000\000\000\000\000\000\n\021\n\021\r\014\r&\nm\nm\000\000\000\000\000\000\nm\000\000\000\000\nm\000\000\000\000\nm\000\000\nm\000\000\000\000\nm\000\000\nm\nm\nm\000\000\nm\nm\nm\000\000\000\000\000\000\000\000\000\000\nm\nm\nm\nm\nm\000\000\nm\000\000\000\000\000\000\000\000\000\000\nm\nm\nm\nm\nm\000\000\000\000\000\000\000\000\nm\000\000\nm\nm\000\000\000\000\000\000\000\000\nm\nm\nm\000\000\000\000\000\000\000\000\000\000\000\000\nm\nm\nm\nm\nm\nm\nm\nm\nm\000\000\000\000\nm\000\000\nm\nm\000\000\000\000\000\000\000\000\000\000\000\000\nm\nm\nm\000\000\nm\nm\nm\nm\000\000\000\000\000\000\nm\000\000\nm\nm\000\000\t\254\nm\nm\nm\nm\nm\000\000\000\000\nm\nm\n\018\000\000\000\000\000\000\000\000\nm\nm\nm\nm\002i\002i\000\000\000\000\000\000\002i\000\000\000\000\002i\000\000\000\000\002i\000\000\002i\000\000\000\000\002i\000\000\002i\002i\002i\000\000\002i\002i\002i\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002i\000\000\002i\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002i\000\000\000\000\000\000\000\000\002i\000\000\002i\002i\000\000\000\000\000\000\000\000\002i\002i\002i\000\000\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002i\002i\002i\002i\002i\000\000\000\000\002i\000\000\002i\002i\000\000\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\000\000\002i\002i\016\238\002i\000\000\000\000\000\000\002i\000\000\002i\002i\000\000\t\254\002i\002i\002i\002i\002i\000\000\000\000\002i\002i\n\018\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002a\002a\000\000\000\000\000\000\002a\000\000\000\000\002a\000\000\000\000\002a\000\000\002a\000\000\000\000\002a\000\000\002a\002a\002a\000\000\002a\002a\002a\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\002a\002a\000\000\002a\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\002a\002a\000\000\000\000\000\000\000\000\002a\000\000\002a\002a\000\000\000\000\000\000\000\000\002a\002a\002a\000\000\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\002a\002a\002a\002a\002a\002a\000\000\000\000\002a\000\000\002a\002a\000\000\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\000\000\002a\002a\002a\002a\000\000\000\000\000\000\002a\000\000\002a\002a\000\000\t\254\002a\002a\002a\002a\002a\000\000\000\000\002a\002a\n\018\000\000\000\000\000\000\000\000\002a\002a\002a\002a\002]\002]\000\000\000\000\000\000\002]\000\000\000\000\002]\000\000\000\000\002]\000\000\002]\000\000\000\000\011&\000\000\002]\002]\002]\000\000\002]\002]\002]\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\002]\000\000\000\000\000\000\000\000\000\000\002]\002]\012\030\0126\002]\000\000\000\000\000\000\000\000\002]\000\000\012N\002]\000\000\000\000\000\000\000\000\002]\002]\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002]\002]\011>\011\190\012f\012~\012\174\002]\002]\000\000\000\000\002]\000\000\002]\012\198\000\000\000\000\000\000\000\000\000\000\000\000\002]\002]\012\222\000\000\002]\002]\002]\002]\000\000\000\000\000\000\002]\000\000\002]\002]\000\000\r>\002]\rV\012\150\002]\002]\000\000\000\000\002]\012\246\002]\000\000\000\000\000\000\000\000\002]\002]\r\014\r&\002e\002e\000\000\000\000\000\000\002e\000\000\000\000\002e\000\000\000\000\002e\000\000\002e\000\000\000\000\011&\000\000\002e\002e\002e\000\000\002e\002e\002e\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\002e\000\000\000\000\000\000\000\000\000\000\002e\002e\012\030\0126\002e\000\000\000\000\000\000\000\000\002e\000\000\012N\002e\000\000\000\000\000\000\000\000\002e\002e\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002e\002e\011>\011\190\012f\012~\012\174\002e\002e\000\000\000\000\002e\000\000\002e\012\198\000\000\000\000\000\000\000\000\000\000\000\000\002e\002e\012\222\000\000\002e\002e\017\n\002e\000\000\000\000\000\000\002e\000\000\002e\002e\000\000\r>\002e\rV\012\150\002e\002e\000\000\000\000\002e\012\246\002e\000\000\000\000\000\000\000\000\002e\002e\r\014\r&\002Y\002Y\000\000\000\000\000\000\002Y\000\000\000\000\002Y\000\000\000\000\002Y\000\000\002Y\000\000\000\000\002Y\000\000\002Y\002Y\002Y\000\000\002Y\002Y\002Y\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002Y\000\000\002Y\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002Y\000\000\000\000\000\000\000\000\002Y\000\000\002Y\002Y\000\000\000\000\000\000\000\000\002Y\002Y\002Y\000\000\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\002Y\000\000\000\000\002Y\000\000\002Y\002Y\000\000\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\000\000\002Y\002Y\002Y\002Y\000\000\000\000\000\000\002Y\000\000\002Y\002Y\000\000\t\254\002Y\002Y\002Y\002Y\002Y\000\000\000\000\002Y\002Y\n\018\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002U\002U\000\000\000\000\000\000\002U\000\000\000\000\002U\000\000\000\000\002U\000\000\002U\000\000\000\000\011&\000\000\002U\002U\002U\000\000\002U\002U\002U\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\002U\000\000\000\000\000\000\000\000\000\000\002U\002U\012\030\0126\002U\000\000\000\000\000\000\000\000\002U\000\000\012N\002U\000\000\000\000\000\000\000\000\002U\002U\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002U\002U\011>\011\190\012f\012~\012\174\002U\002U\000\000\000\000\002U\000\000\002U\012\198\000\000\000\000\000\000\000\000\000\000\000\000\002U\002U\012\222\000\000\002U\002U\002U\002U\000\000\000\000\000\000\002U\000\000\002U\002U\000\000\r>\002U\rV\012\150\002U\002U\000\000\000\000\002U\012\246\002U\000\000\000\000\000\000\000\000\002U\002U\r\014\r&\003Y\003Y\000\000\000\000\000\000\003Y\000\000\000\000\003Y\000\000\000\000\003Y\000\000\003Y\000\000\000\000\003Y\000\000\003Y\003Y\003Y\000\000\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\000\000\003Y\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\000\000\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\000\000\000\000\000\000\003Y\003Y\003Y\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003Y\003Y\003Y\003Y\003Y\000\000\000\000\003Y\000\000\003Y\003Y\000\000\000\000\000\000\000\000\000\000\000\000\003Y\003Y\003Y\000\000\003Y\003Y\003Y\003Y\000\000\000\000\000\000\003Y\000\000\003Y\003Y\000\000\t\254\003Y\003Y\003Y\003Y\003Y\000\000\000\000\003Y\003Y\n\018\000\000\000\000\000\000\000\000\003Y\003Y\003Y\003Y\003U\003U\000\000\000\000\000\000\003U\000\000\000\000\003U\000\000\000\000\003U\000\000\003U\000\000\000\000\011&\000\000\003U\003U\003U\000\000\003U\003U\003U\000\000\000\000\000\000\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\003U\000\000\000\000\000\000\000\000\000\000\003U\003U\012\030\0126\003U\000\000\000\000\000\000\000\000\003U\000\000\012N\003U\000\000\000\000\000\000\000\000\003U\003U\000\238\000\000\000\000\000\000\000\000\000\000\000\000\003U\003U\011>\011\190\012f\012~\012\174\003U\003U\000\000\000\000\003U\000\000\003U\012\198\000\000\000\000\000\000\000\000\000\000\000\000\003U\003U\012\222\000\000\003U\003U\003U\003U\000\000\000\000\000\000\003U\000\000\003U\003U\000\000\r>\003U\rV\012\150\003U\003U\000\000\000\000\003U\012\246\003U\000\000\000\000\000\000\000\000\003U\003U\r\014\r&\002I\002I\000\000\000\000\000\000\002I\000\000\000\000\002I\000\000\000\000\002I\000\000\002I\000\000\000\000\002I\000\000\002I\002I\002I\000\000\002I\002I\002I\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002I\000\000\002I\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002I\000\000\000\000\000\000\000\000\002I\000\000\002I\002I\000\000\000\000\000\000\000\000\002I\002I\002I\000\000\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002I\002I\002I\002I\002I\000\000\000\000\002I\000\000\002I\002I\000\000\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\000\000\002I\002I\002I\002I\000\000\000\000\000\000\002I\000\000\002I\002I\000\000\002I\002I\002I\002I\002I\002I\000\000\000\000\002I\002I\n\018\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002M\002M\000\000\000\000\000\000\002M\000\000\000\000\002M\000\000\000\000\002M\000\000\002M\000\000\000\000\002M\000\000\002M\002M\002M\000\000\002M\002M\002M\000\000\000\000\006v\000\000\000\000\002M\002M\002M\002M\002M\000\000\002M\000\000\000\000\000\000\000\000\000\000\002M\002M\002M\002M\002M\006z\000\000\000\000\000\000\002M\000\000\002M\002M\000\000\000\000\000\000\000\000\002M\002M\002M\000\000\000\000\000\000\000\000\000\000\000\000\002M\002M\002M\002M\002M\002M\002M\002M\002M\000\000\007\233\002M\000\000\002M\002M\000\000\000\000\000\000\000\000\000\000\000\238\002M\002M\002M\000\000\002M\002M\002M\002M\007\233\000\000\000\000\002M\007\233\002M\002M\000\000\002M\002M\002M\002M\002M\002M\000\000\tv\002M\002M\n\018\000\000\000\000\000\000\000\000\002M\002M\002M\002M\001\006\000\000\000\006\000\000\000\000\004\197\002\194\002\198\006~\002\242\002\146\006\"\006\138\000\000\000\000\002\254\001\n\000\000\006\158\000\000\002\158\000\000\006\170\000\000\000\000\001\210\000\000\000\000\016\194\003\242\001\018\t\018\t\022\001\030\001\"\007\233\000\000\000\000\003\006\000\000\003\166\000\000\019\162\000\000\t:\t>\000\238\003\226\003\238\003\250\tB\007V\000\000\001:\000\000\002\186\000\000\000\000\003\246\t\254\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\n\018\001>\001B\001F\001J\001N\000\000\004\197\tV\001R\000\000\007\249\000\000\001V\000\000\tb\tz\n\030\005\186\005\190\000\000\006~\001Z\000\000\006\"\t\150\002\014\000\000\001^\000\000\007\249\006\158\000\000\002\018\007\249\006\170\002\026\000\000\001\154\006j\000\000\000\000\005\194\b\214\001\210\001\158\000\000\017J\004\130\n2\001\006\001\166\000\006\001\170\001\174\028\226\002\194\002\198\000\000\002\242\002\146\003Z\000\000\000\000\000\000\002\254\001\n\007\130\001\222\000\000\t\014\000\000\000\238\000\000\002\186\001\210\000\000\000\000\000\000\003\242\001\018\t\018\t\022\001\030\001\"\000\000\000\000\000\000\003\006\000\000\003\166\000\000\t\026\000\000\t:\t>\000\238\003\226\003\238\003\250\tB\007V\007\142\001:\000\000\002\186\b\005\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\006~\005\174\000\000\006\"\001>\001B\001F\001J\001N\b\005\006\158\tV\001R\b\005\006\170\000\000\001V\000\000\tb\tz\n\030\005\186\005\190\000\000\006~\001Z\000\000\006\"\028\230\000\000\000\000\001^\000\000\000\000\006\158\000\000\000\000\000\000\006\170\000\000\000\000\001\154\006\190\000\000\000\000\005\194\b\214\r\249\001\158\000\000\017J\004\130\n2\0059\001\166\000\006\001\170\001\174\000\246\002\194\002\198\002\202\002\242\002\146\000\000\002\001\000\000\r\249\002\254\022\130\002.\003r\000\000\0022\000\000\0059\000\000\003v\001\210\000\000\020\230\b\005\003\002\000\000\003z\003~\002>\000\000\000\000\003\130\000\000\003\006\000\000\003\166\000\n\020z\n\138\003\218\003\222\n\150\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\002\001\003\246\020\246\002J\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\002\001\002\001\000\000\000\000\000\000\000\000\020\254\000\000\tV\000\000\nQ\000\000\000\000\000\000\000\000\tb\tz\n\030\005\186\005\190\021\018\021N\000\000\000\000\0059\0059\000\000\000\000\000\000\006\234\000\000\000\000\nQ\000\000\000\000\002N\r\249\r\229\000\000\000\000\021\138\025\142\005\194\b\214\000\000\000\145\000\000\b\238\004\130\n2\000\145\000\000\002\198\000\145\000\000\002\146\r\249\n~\000\000\002.\002\254\000\000\0022\000\145\000\000\000\145\000\000\000\145\000\000\000\145\001\210\000\238\n\182\000\000\003\002\002>\000\000\000\000\002F\r\229\n\190\000\145\000\000\003\006\000\000\003\166\000\000\000\145\000\000\000\000\000\000\000\145\000\000\003\238\001\190\018\150\000\145\000\000\002\146\000\145\002\186\000\000\002J\003\246\000\145\000\145\000\145\b\190\b\194\b\206\000\000\014\206\005\174\000\145\000\145\006~\0256\000\000\006\"\000\000\000\145\000\000\000\000\nQ\000\145\006\158\000\000\000\000\000\000\006\170\000\000\000\000\005\186\005\190\000\145\000\145\018\154\000\000\000\145\000\145\000\000\000\000\000\000\000\000\000\000\000\000\002N\000\000\000\145\000\000\018\166\000\000\025Z\000\000\000\145\000\145\005\194\b\214\000\000\000\000\000\169\b\238\004\130\000\000\000\145\000\169\000\145\002\198\000\169\000\000\002\146\000\000\n~\000\000\000\000\002\254\005\190\000\000\000\169\000\000\000\169\000\000\000\169\000\000\000\169\001\210\025f\n\182\000\000\003\002\000\000\000\000\000\000\000\000\000\000\n\190\000\169\000\000\003\006\000\000\003\166\000\000\000\169\024\250\000\000\000\000\000\169\000\000\003\238\001\190\000\000\000\169\000\000\000\000\000\169\002\186\000\000\000\000\003\246\000\169\000\169\000\169\b\190\b\194\b\206\000\000\014\206\005\174\000\169\000\169\000\000\000\000\000\000\000\000\000\000\000\169\000\000\000\000\n5\000\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\186\005\190\000\169\000\169\000\000\000\000\000\169\000\169\000\000\000\000\nb\n5\000\000\n5\n5\000\000\000\169\000\000\000\000\000\000\000\000\000\000\000\169\000\169\005\194\b\214\000\000\000\000\000\000\b\238\004\130\000\000\000\169\000\000\000\169\000\014\000\018\000\022\000\026\000\030\000\000\000\"\000&\000*\000.\0002\000\000\0006\000:\000\000\000\000\000>\t.\000\000\000\000\000B\000\000\018\150\000\000\002\014\002\146\000\000\000F\000\000\000\000\000\000\002\018\000\000\000J\002\026\000N\000R\000V\000Z\000^\000b\000f\001\210\000\000\000\000\000j\000n\000\000\000r\000\000\000v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\t\254\000\000\018\154\000z\007\130\001\222\000~\000\130\n5\000\000\n\018\002\186\000\000\000\134\000\138\000\142\018\166\002\001\025:\000\000\002\001\000\146\000\150\000\154\000\158\000\000\000\162\000\166\000\170\000\000\000\000\000\000\000\174\000\178\000\182\000\000\000\000\000\000\000\186\007\142\000\190\000\194\005\190\000\n\000\000\000\000\000\000\000\000\000\198\000\000\000\202\000\000\025F\000\000\000\000\004\149\000\206\000\210\002\001\000\214\004\149\003\022\002\198\004\149\000\000\002\146\000\000\007&\000\000\024\250\002\254\002\001\002\001\004\149\000\000\000\000\000\000\004\149\000\000\004\149\001\210\000\000\007F\000\000\000\000\002\001\002\001\003\026\000\000\000\000\t\134\004\149\000\000\000\000\000\000\000\000\000\000\004\149\002\001\000\000\003&\000\000\000\000\t\178\001\190\002\001\004\149\000\000\002\001\004\149\002\186\002\001\000\n\004\006\004\149\004\149\011\249\004\n\002\001\004\018\000\000\t\194\005\174\000\000\002\001\000\000\000\000\002\001\002\001\000\000\004\149\004\149\000\000\000\000\005\178\000\000\000\000\000\000\000\000\000\000\002\001\000\000\005\186\005\190\004\149\004\149\rz\000\000\004\149\004\149\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\249\n\138\000\000\011\249\r\130\004\149\005\194\000\000\000\000\000\000\011\249\000\000\004\130\000\000\011\249\000\006\004\149\000\000\000\246\002\194\002\198\002\202\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\005Y\000\000\000\000\000\000\002\001\000\000\003v\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\003\130\000\000\003\006\000\000\003\166\000\000\020z\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\000\000\003\246\020\246\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\254\000\000\tV\000\000\031\198\000\000\000\000\000\000\000\000\tb\tz\n\030\005\186\005\190\021\018\021N\000\000\000\006\031\231\017\218\000\246\002\194\002\198\002\202\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000 \022\000\000\025\142\005\194\b\214\000\000\003v\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\003\130\000\000\003\006\000\000\003\166\000\000\020z\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\000\000\003\246\020\246\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\254\000\000\tV\000\000\031\198\000\000\000\000\000\000\000\000\tb\tz\n\030\005\186\005\190\021\018\021N\000\000\000\000\005a\000\000\000\000\000\000\000\000\000\000\001\006\000\000\000\000\000\000\000\000\000\000\003\022\002\198\006F\000\000\002\146\025\142\005\194\b\214\000\000\002\254\001\n\b\238\004\130\n2\002\158\000\000\000\000\000\000\000\000\001\210\003\158\000\000\002\198\001\014\001\018\001\022\0036\001\030\001\"\003j\000\000\000\000\003\146\000\000\000\000\b\134\003:\000\000\001.\006f\001\210\000\000\0032\001\190\0016\b\201\000\000\001:\000\000\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\003\154\001>\001B\001F\001J\001N\000\000\002\186\000\000\001R\005\178\000\000\b\201\001V\011\253\000\000\000\000\000\000\005\186\005\190\000\000\006\002\001Z\000\000\000\000\000\000\b\201\000\000\001^\b\201\tJ\000\000\000\000\000\000\000\000\007j\b\201\000\000\001\154\006j\b\201\000\000\005\194\000\000\011\253\001\158\000\000\001\162\004\130\001\006\000\000\001\166\000\000\001\170\001\174\003\022\002\198\t\182\011\253\002\146\000\000\011\253\r\234\000\000\002\254\001\n\000\000\000\000\011\253\002\158\000\000\000\000\011\253\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\0036\001\030\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003:\000\000\001.\006f\000\000\000\000\0032\001\190\0016\000\000\000\000\001:\000\000\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\000\000\001>\001B\001F\001J\001N\000\000\000\000\000\000\001R\005\178\000\000\000\000\001V\000\000\000\000\000\000\000\000\005\186\005\190\000\000\006\002\001Z\000\000\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\154\006j\000\000\000\000\005\194\000\000\000\000\001\158\000\000\001\162\004\130\000\000\n9\001\166\000\006\001\170\001\174\000\246\002\194\002\198\002\"\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\021\142\000\000\n9\000\000\n9\n9\003v\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\021\146\000\000\003\006\000\000\003\166\000\000\021\186\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\000\000\003\246\020\246\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022Z\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\nR\tz\n\030\005\186\005\190\021\018\022n\000\000\000\000\005-\000\000\000\000\000\000\000\000\000\000\n1\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\022~\005\194\b\214\n9\002\254\000\000\b\238\004\130\n2\n1\000\000\n1\n1\000\000\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\001\169\003\006\000\000\003\166\000\000\001\169\000\000\003\218\003\222\n\154\003\226\003\238\003\250\004\002\007V\001\202\001\206\r\134\002\186\000\000\000\000\003\246\000\000\000\000\001\169\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\001\210\001\214\001\230\000\000\000\000\000\000\tV\000\000\000\000\000\000\001\242\000\000\001\169\nR\tz\n\030\005\186\005\190\000\000\000\000\001\169\000\000\000\000\001\246\002\162\001\169\001\169\000\238\002\174\000\000\002\186\004.\004:\000\000\001\169\001\169\000\000\004F\000\000\000\000\005\194\b\214\n1\005\201\005\201\b\238\004\130\n2\005\201\000\000\005\201\005\201\000\000\005\201\004J\005\201\005\201\000\000\000\000\005\201\001\169\005\201\005\201\005\201\005\201\005\201\005\201\005\201\005\201\001\169\005\201\000\000\005\201\000\000\000\000\000\000\000\000\000\000\000\000\005\201\000\000\000\000\000\000\000\000\005\201\005\201\005\201\000\000\000\000\005\201\005\201\005\201\005\201\000\000\005\201\000\000\000\000\005\201\000\000\000\000\000\000\000\000\005\201\005\201\005\201\000\000\000\000\005\201\005\201\005\201\000\000\005\201\005\201\000\000\000\000\000\000\000\000\000\000\005\201\000\000\000\000\000\000\005\201\005\201\000\000\005\201\000\000\005\201\000\000\000\000\000\000\000\000\005\201\005\201\005\201\000\000\005\201\005\201\005\201\005\201\000\000\005\201\005\201\000\000\000\000\000\000\005\201\000\000\005\201\005\201\000\000\000\000\002\166\005\201\000\000\000\000\000\000\024\n\005\201\000\000\012\021\000\000\005\201\012\021\005\201\005\201\012\021\012\021\000\000\005\201\012\021\000\000\012\021\000\000\000\000\012\021\000\000\001*\000\000\012\021\012\021\000\000\012\021\012\021\002\001\012\021\000\000\012\021\000\000\000\000\000\000\002\001\012\021\000\000\002\001\012\021\000\000\000\000\000\000\000\000\000\000\000\000\002\001\012\021\000\000\012\021\000\000\000\000\012\021\012\021\000\n\000\000\000\000\000\000\000\000\012\021\000\000\000\000\012\021\000\000\000\000\012\021\012\021\000\000\012\021\002\001\012\021\012\021\000\000\000\000\000\000\000\000\002\001\000\000\000\000\000\000\000\000\000\000\002\001\012\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\021\012\021\000\000\000\000\012\021\000\000\012\021\000\000\000\000\000\000\000\000\005\222\000\000\002\001\000\000\000\000\001\202\001\206\012\021\012\021\000\000\012\021\012\021\000\000\012\021\000\000\012\021\000\000\012\021\000\000\012\021\000\000\012\021\r\185\r\185\001\210\001\250\001\230\r\185\000\000\001\206\r\185\000\000\000\000\000\000\001\242\003\134\000\000\022\174\004\214\000\000\r\185\r\185\r\185\000\000\r\185\r\185\r\185\001\246\024\006\000\000\023&\000\000\002\174\000\000\002\186\004.\004:\000\000\r\185\000\000\000\000\024\022\000\000\000\000\r\185\r\185\000\000\000\000\r\185\000\000\000\000\002\170\000\000\r\185\000\000\000\000\r\185\000\000\004J\000\000\000\000\r\185\r\185\r\185\000\000\000\000\000\000\000\000\000\000\000\000\r\185\r\185\000\000\000\000\000\000\000\000\000\000\r\185\000\000\000\000\000\000\004\222\000\000\000\000\r\185\000\000\000\000\000\000\000\000\000\000\000\000\r\185\r\185\r\185\000\000\r\185\r\185\000\000\005%\000\000\000\000\000\000\000\000\005%\000\000\r\185\005%\r\185\r\185\000\000\000\000\000\000\r\185\000\000\000\000\000\000\005%\r\185\000\000\000\000\005%\r\185\005%\r\185\r\185\n!\n!\000\000\000\000\005%\n!\000\000\001\206\n!\005%\000\000\000\000\000\000\000\000\000\000\005%\n!\000\000\n!\n!\n!\004R\n!\n!\n!\000\000\000\000\005%\005%\000\000\000\000\000\000\005%\002\234\000\000\000\000\n!\000\000\000\000\000\000\000\000\000\000\n!\n!\000\000\000\000\n!\000\000\005%\002\170\005%\n!\000\000\000\000\n!\000\000\000\000\000\000\005%\n!\n!\n!\005%\005%\002\234\000\238\005%\005%\n!\n!\000\000\000\000\004b\005%\000\000\n!\000\000\000\000\000\000\004\222\000\000\000\000\n!\005%\000\000\000\000\000\000\000\000\025\014\n!\n!\n!\000\000\n!\n!\000\000\007\237\000\000\005%\000\000\000\000\007\237\000\000\n!\007\237\n!\n!\005%\000\000\000\000\n!\000\000\000\000\000\000\007\237\n!\000\000\000\000\007\237\n!\007\237\n!\n!\n\029\n\029\000\000\000\000\000\000\n\029\000\000\001\206\n\029\007\237\000\000\000\000\000\000\000\000\000\000\007\237\n\029\000\000\n\029\n\029\n\029\000\000\n\029\n\029\n\029\000\000\000\000\007\237\000\000\000\000\000\000\000\000\007\237\007\237\000\000\000\000\n\029\000\000\000\000\000\000\000\000\000\000\n\029\n\029\000\000\000\000\n\029\000\000\007\237\002\170\000\000\n\029\000\000\000\000\n\029\000\000\000\000\000\000\000\000\n\029\n\029\n\029\007\237\007\237\020\142\000\000\007\237\007\237\n\029\n\029\000\000\000\000\000\000\000\000\000\000\n\029\000\000\000\000\000\000\004\222\021\206\000\000\n\029\007\237\000\000\000\000\000\000\000\000\000\000\n\029\n\029\n\029\000\000\n\029\n\029\000\000\000\000\000\000\002\001\002\001\000\000\000\000\002\001\n\029\002\001\n\029\n\029\002\001\002\001\002\001\n\029\002\001\002\001\002\001\002\001\n\029\000\000\002\001\000\000\n\029\002\001\n\029\n\029\002\001\002\001\000\n\000\000\002\001\000\n\002\001\000\000\002\001\000\n\002\001\002\001\000\n\000\000\002\001\007Z\000\n\002\001\002\001\002\001\002\001\018J\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\000\000\002\001\002\001\002\001\002\001\002\001\002\001\002\001\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\002\001\002\001\002\001\002\001\002\001\000\000\000\000\000\000\002\001\002\001\002\001\002\001\002\001\000\000\018\138\002\001\000\000\000\000\002\001\000\000\000\000\000\000\000\000\000\000\002\001\002\001\000\000\000\000\000\000\002\001\000\000\002\001\000\000\007^\000\000\002\001\002\001\000\000\000y\000\000\002\001\002\001\002\001\000y\000\000\000y\000y\000\000\000\000\000\000\000\000\000\000\r\249\r\229\000y\000\000\000y\000y\000\000\000\000\000y\000y\000y\000\000\t\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\249\000\000\000y\002.\000\000\000\000\0022\000\000\000y\000y\000\000\000\000\000y\002:\000\000\000y\000\000\000y\000\000\002>\000y\000\000\002F\r\229\000\000\000y\000y\000y\000\000\000\000\000\000\000\000\000\000\000\000\000y\000y\000\000\000\000\000\000\000\000\000\000\000y\000y\000\000\000\000\000y\002J\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000y\000y\000y\000\000\000y\000y\000\000\000\000\000\000\007y\t\185\000A\000\000\000\000\000y\000A\000A\000y\000A\000A\000\000\000y\000\000\000\000\000A\000\000\000y\000\000\000\000\007y\000y\000\000\000y\000\000\000A\002N\000\000\000\000\000A\000\000\000A\000A\000\000\000\000\000\000\000\000\000\000\000A\000\000\000A\000\000\000\000\000\000\000A\000A\000\000\000A\000A\000A\000A\000A\000\000\000\000\000\000\000A\000\000\000\000\000A\000\000\000\000\000\000\000A\000A\000A\000A\000\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\000\000\000\000\000\000\r\249\r\229\000\000\000A\000A\000A\000A\000A\000\000\007u\000\000\000=\000\000\000\000\000\000\000=\000=\000\000\000=\000=\r\249\000\000\000\000\002.\000=\000\000\0022\000\000\000\000\007u\000A\000A\000\000\002\214\000=\000A\000A\000A\000=\002>\000=\000=\002F\r\229\000\000\000\000\000\000\000=\000\000\000=\000\000\000\000\000\000\000=\000=\000\000\000=\000=\000=\000=\000=\000\000\000\000\000\000\000=\000\000\002J\000=\000\000\000\000\000\000\000=\000=\000=\000=\000\000\000=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=\000\000\000\000\000\000\000\000\000\000\000\000\000=\000=\000=\000=\000=\000\000\007\133\000\000\r\129\000\000\000\000\000\000\r\129\r\129\000\000\r\129\r\129\002N\000\000\000\000\000\000\r\129\000\000\000\000\000\000\000\000\007\133\000=\000=\000\000\000\000\r\129\000=\000=\000=\r\129\000\000\r\129\r\129\000\000\000\000\000\000\000\000\000\000\r\129\000\000\r\129\000\000\000\000\000\000\r\129\r\129\000\000\r\129\r\129\r\129\r\129\r\129\000\000\000\000\000\000\r\129\000\000\000\000\r\129\000\000\000\000\000\000\r\129\r\129\r\129\r\129\000\000\r\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\129\000\000\000\000\000\000\000\000\000\000\000\000\r\129\r\129\r\129\r\129\r\129\000\000\007\129\000\000\r}\000\000\000\000\000\000\r}\r}\000\000\r}\r}\000\000\000\000\000\000\000\000\r}\000\000\000\000\000\000\000\000\007\129\r\129\r\129\000\000\000\000\r}\r\129\r\129\r\129\r}\000\000\r}\r}\000\000\000\000\000\000\000\000\000\000\r}\000\000\r}\000\000\000\000\000\000\r}\r}\000\000\r}\r}\r}\r}\r}\000\000\000\000\000\000\r}\000\000\000\000\r}\000\000\000\000\000\000\r}\r}\r}\r}\000\000\r}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r}\000\000\000\000\000\000\000\000\000\000\000\000\r}\r}\r}\r}\r}\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\r}\r}\000\000\000\000\001\210\r}\r}\r}\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\014E\003\006\000\000\003\166\000\000\014E\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\007\185\007\185\000\000\002\186\000\000\000\000\003\246\000\000\000\000\014E\b\190\b\194\b\206\b\226\000\000\005\174\004>\000\000\000\000\007\185\007\185\007\185\000\000\000\000\000\000\tV\000\000\000\000\000\000\007\185\000\000\014E\nR\tz\n\030\005\186\005\190\000\000\000\000\014E\000\000\000\000\007\185\007\185\014E\014E\000\238\007\185\000\000\007\185\007\185\007\185\000\000\014E\014E\000\000\007\185\000\000\000\000\005\194\b\214\019\142\r\189\r\189\b\238\004\130\n2\r\189\000\000\000\000\r\189\000\000\000\000\007\185\000\000\000\000\000\000\000\000\004\154\014E\r\189\r\189\r\189\000\000\r\189\r\189\r\189\000\000\014E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\189\000\000\000\000\000\000\000\000\000\000\r\189\r\189\000\000\000\000\r\189\0042\000\000\007\185\000\000\r\189\000\000\000\000\r\189\000\000\000\000\000\000\000\000\r\189\r\189\r\189\000\000\000\000\000\000\000\000\000\000\000\000\r\189\r\189\000\000\000\000\000\000\000\000\000\000\r\189\000\000\000\000\000\000\r\189\000\000\000\000\r\189\000\000\000\000\000\000\000\000\000\000\000\000\r\189\r\189\r\189\000\000\r\189\r\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\201\r\189\000\006\r\189\r\189\007\201\002\194\002\198\r\189\002\242\002\146\000\000\000\000\r\189\000\000\002\254\000\000\r\189\000\000\r\189\r\189\000\000\004\014\000\000\007\201\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\007\201\003\226\003\238\003\250\004\002\007V\000\000\000\000\007\201\002\186\000\000\000\000\003\246\007\201\007\201\000\238\b\190\b\194\b\206\b\226\000\000\005\174\007\201\007\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\nR\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\000\000\000\007\201\000\000\000\000\000\000\000\000\005%\000\000\000\006\000\000\007\201\005%\002\194\002\198\000\000\002\242\002\146\000\000\005\194\b\214\017^\002\254\000\000\b\238\004\130\n2\027\174\000\000\017r\000\000\005%\001\210\000\000\000\000\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\005%\003\226\003\238\003\250\004\002\007V\000\000\000\000\005%\002\186\000\000\000\000\003\246\005%\002\234\000\000\b\190\b\194\b\206\b\226\000\000\005\174\005%\005%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\nR\tz\n\030\005\186\005\190\000\000\005-\000\000\000\006\000\000\005%\000\246\002\194\002\198\002\"\002\242\002\146\000\000\000\000\005%\000\000\002\254\000\000\000\000\021\142\000\000\000\000\005\194\b\214\000\000\003v\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\021\146\000\000\003\006\000\000\003\166\000\000\021\186\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\000\000\003\246\020\246\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022Z\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\019\230\tz\n\030\005\186\005\190\021\018\022n\000\000\000\006\000\000\005-\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\022~\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\019z\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\209\003\209\000\000\000\000\000\241\003\209\000\000\000\000\003\209\000\241\005\194\b\214\000\000\000\000\000\000\b\238\004\130\n2\003\209\003\209\003\209\000\000\003\209\003\209\003\209\000\000\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\209\000\000\000\000\000\000\000\000\000\000\003\209\004\146\000\000\000\000\003\209\000\000\000\000\000\000\000\241\003\209\003\018\000\000\003\209\000\000\000\000\000\000\000\241\003\209\003\209\003\209\000\000\000\241\000\000\000\000\000\000\000\000\003\209\003\209\000\000\000\000\000\241\000\241\000\000\003\209\000\000\000\000\000\000\003\209\000\000\000\000\003\209\000\000\000\000\000\000\000\000\000\000\000\000\003\209\003\209\003\209\000\000\003\209\003\209\000\000\000\000\000\000\000\241\000\000\000\000\000\000\000\000\003\209\000\000\003\209\003\209\000\241\000\000\000\000\003\209\000\000\005\249\0149\000\000\003\209\000\000\012!\000\000\003\209\012!\003\209\003\209\003\022\002\198\000\000\000\000\002\146\000\000\007&\000\000\005\249\002\254\000\000\000\000\005\249\012!\012!\000\000\012!\012!\000\000\001\210\000\000\007F\000\000\000\000\000\000\000\000\003\026\000\000\002\014\t\134\000\000\000\000\000\000\000\000\000\000\002\018\000\000\012!\002\026\003&\000\000\007\134\0032\001\190\000\000\000\000\001\210\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\012!\004\n\000\000\004\018\005\162\t\194\005\174\000\000\003Z\000\000\000\000\000\000\0149\0149\007\130\001\222\000\000\000\000\005\178\001\202\001\206\002\186\000\000\000\000\000\000\005\249\005\186\005\190\000\000\006\002\012!\0149\012!\0149\000\000\000\000\000\000\000\000\001\210\001\250\005\249\000\000\000\000\005\249\012!\000\000\000\000\012!\012!\007\142\005\194\000\000\012!\000\000\012!\000\000\004\130\012\029\012!\000\000\012\029\001\246\002\178\003\022\002\198\000\000\002\174\002\146\002\186\004.\004:\000\000\002\254\000\000\000\000\004F\012\029\012\029\000\000\012\029\012\029\000\000\001\210\000\000\001\202\001\206\000\000\000\000\000\000\003\026\000\000\000\000\004J\000\000\000\000\029\194\000\000\000\000\000\000\000\000\012\029\000\000\003&\001\210\001\250\006B\001\190\000\000\000\000\000\000\000\000\029\174\002\186\000\000\000\000\004\006\000\000\000\000\012\029\004\n\000\000\004\018\005\162\000\000\005\174\000\000\001\246\002\170\000\000\000\000\000\000\002\174\000\000\002\186\004.\004:\005\178\000\000\000\000\000\000\004F\000\000\018\178\000\000\005\186\005\190\000\000\006\002\012\029\000\000\012\029\000\000\000\000\000\000\000\000\000\000\000\006\004J\005\253\0149\002\194\002\198\012\029\002\242\002\146\012\029\012\029\000\000\005\194\002\254\012\029\000\000\012\029\000\000\004\130\000\000\012\029\005\253\000\000\001\210\000\000\005\253\000\000\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\0149\0149\017\246\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\005\253\002\194\002\198\000\000\002\242\002\146\0149\000\000\0149\000\000\002\254\000\000\000\000\000\000\000\000\005\253\005\194\b\214\005\253\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\t\238\tz\n\030\005\186\005\190\000\000\005Q\000\000\000\006\000\000\000\000\025\182\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\003v\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\026&\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\000\000\003\246\020\246\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\026\202\026\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\n\002\tz\n\030\005\186\005\190\000\000\005I\000\000\000\006\000\000\005Q\022\198\002\194\002\198\000\000\002\242\002\146\000\000\000\000\027\206\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\003v\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\022\242\003\226\003\238\003\250\004\002\007V\000\000\000\000\020\222\002\186\000\000\000\000\003\246\020\246\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\023\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\nj\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\005I\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\023\130\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\n\234\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011*\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011B\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011f\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011\146\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011\170\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011\194\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011\218\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\011\242\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\n\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\"\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012:\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012R\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012j\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\130\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\154\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\178\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\202\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\226\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\012\250\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\r\018\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\r*\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\rB\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\rZ\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\014\238\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015\022\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015>\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015f\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015\138\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015\174\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015\218\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\015\254\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\016\"\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\016>\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\016\222\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\016\242\tz\n\030\005\186\005\190\000\000\000\000\000\000\000\006\000\000\000\000\000\000\002\194\002\198\000\000\002\242\002\146\000\000\000\000\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\003\002\000\000\003z\003~\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\000\000\000\000\000\000\003\218\003\222\000\000\003\226\003\238\003\250\004\002\007V\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\b\226\000\000\005\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tV\000\000\000\000\000\000\000\000\000\000\000\000\017\014\tz\n\030\005\186\005\190\000\000\018f\000\000\000\000\000\000\000\000\000\000\000\000\002\014\000\000\000\000\000\000\001\193\001\193\000\000\002\018\000\000\001\193\002\026\000\000\001\193\000\000\005\194\b\214\000\000\000\000\001\210\b\238\004\130\n2\001\193\001\193\001\193\000\000\001\193\001\193\001\193\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\000\000\001\193\007\130\001\222\000\000\000\000\000\000\001\193\001\193\002\186\000\000\001\193\000\000\000\000\000\000\000\000\001\193\000\000\000\000\001\193\000\000\000\000\000\000\000\000\001\193\001\193\001\193\000\000\000\000\000\000\000\000\000\000\000\000\001\193\001\193\000\000\000\000\007\142\000\000\000\000\001\193\000\249\000\000\000\000\001\193\000\000\000\249\001\193\000\000\000\000\000\000\000\000\000\000\000\000\001\193\001\193\001\193\000\000\001\193\001\193\000\000\000\000\000\000\000\000\000\000\000\249\000\000\000\000\001\193\000\000\001\193\001\193\003\022\002\198\000\000\001\193\002\146\000\000\007&\000\000\001\193\002\254\000\000\000\000\004\254\000\000\001\193\000\249\000\000\022\182\000\000\001\210\000\000\007F\000\000\000\249\000\000\000\000\003\026\000\000\000\249\t\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\249\003&\000\000\000\000\t\178\001\190\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\011\249\004\n\000\000\004\018\000\000\t\194\005\174\000\000\000\249\000\000\000\000\000\000\000\000\000\000\000\000\004\209\000\000\000\249\005\178\000\000\000\000\019\186\000\000\000\000\000\000\000\000\005\186\005\190\002\014\000\000\rz\006U\006U\000\000\000\000\002\018\006U\000\000\002\026\006U\000\000\000\000\000\000\000\000\011\249\000\000\001\210\011\249\011\249\006U\005\194\006U\000\000\006U\011\249\006U\004\130\000\000\011\249\004\209\000\000\000\000\000\000\003Z\000\000\r\157\000\000\006U\r\157\007\130\001\222\000\000\000\000\006U\006U\000\000\002\186\000\000\r\157\006U\000\000\000\000\006U\000\000\r\157\006U\000\000\000\000\000\000\000\000\006U\006U\006U\000\000\000\000\000\000\r\157\000\000\000\000\000\000\000\000\000\000\r\157\000\000\007\142\000\000\006U\006U\000\000\000\000\006U\r\157\000\000\001\006\r\157\000\000\000\000\000\000\000\000\r\157\006U\006U\006U\000\000\006U\006U\000\000\000\000\000\000\001\n\b6\000\000\000\000\002\158\000\000\r\157\000\000\006U\000\000\r\157\006U\006U\001\014\001\018\001\022\001\026\001\030\001\"\000\000\r\157\r\157\000\000\006U\r\157\000\000\001&\000\000\001.\0012\031\190\000\000\000\000\000\000\0016\000\000\000\000\001:\000\000\000\000\000\000\r\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\001B\001F\001J\001N\000\000\004\025\004\025\001R\000\000\000\000\004\025\001V\000\000\004\025\000\000\000\000\000\000\000\000\000\000\000\000\001Z\000\000\004\025\004\025\000\000\004\025\001^\004\025\000\000\004\025\004\025\000\000\000\000\000\000\000\000\000\000\001\154\030\218\000\000\000\000\004\025\004\025\004\025\001\158\004\025\001\162\004\025\004\025\004\025\001\166\000\000\001\170\001\174\005\209\000\000\000\000\004\025\000\000\004\025\004\025\000\000\000\000\000\000\000\000\004\025\004\025\004\025\000\000\000\000\000\000\005\213\000\000\000\000\004\025\000\000\000\000\004\025\000\000\000\000\000\000\004\025\004\025\004\025\004\025\004\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\025\004\025\004\025\004\025\004\025\004\025\000\000\004\025\000\000\000\000\005\209\000\000\000\000\000\000\000\000\000\000\000\000\004\025\004\025\004\025\000\000\004\025\004\025\006I\006I\000\000\000\000\005\213\006I\000\000\000\000\006I\004\025\000\000\004\025\004\025\000\000\000\000\004\025\020\002\000\000\006I\000\000\006I\000\000\006I\002\014\006I\000\000\004\025\000\000\000\000\000\000\002\018\000\000\000\000\002\026\000\000\000\000\006I\000\000\000\000\000\000\000\000\001\210\006I\006I\000\000\000\000\000\000\000\000\b\130\000\000\000\000\006I\000\000\000\000\006I\000\000\000\000\000\000\003Z\006I\006I\000\238\000\000\000\000\007\130\001\222\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\000\000\006I\006I\000\000\000\000\006I\000\000\n-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006I\006I\006I\000\000\006I\006I\000\000\000\000\011&\000\000\007\142\014\162\n-\000\000\n-\n-\000\000\006I\000\000\000\000\006I\006I\011\142\011\214\011\238\011\166\012\006\000\000\000\000\001\202\002\142\000\000\006I\002\146\000\000\000\000\012\030\0126\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012N\000\000\000\000\001\210\001\250\001\230\002\150\000\000\000\238\000\000\000\000\000\000\000\000\001\242\001\006\000\000\000\000\011>\011\190\012f\012~\012\174\000\000\000\000\000\000\000\000\002\154\002\162\000\000\012\198\001\n\002\174\000\000\002\186\004.\004:\000\000\000\000\012\222\000\000\024\230\000\000\024\234\001\014\001\018\001\022\001\026\001\030\001\"\000\000\000\000\000\000\r>\000\000\rV\012\150\001&\004J\001.\0012\n-\012\246\000\000\000\000\0016\000\000\005\190\001:\000\000\r\014\r&\000\000\000\000\000\000\000\000\000\000\024\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\001B\001F\001J\001N\000\000\t\145\t\145\001R\024\250\000\000\t\145\001V\000\000\t\145\000\000\000\000\000\000\000\000\000\000\000\000\001Z\020\018\000\000\t\145\000\000\t\145\001^\t\145\002\014\t\145\000\000\000\000\000\000\000\000\000\000\002\018\001\154\030\246\002\026\000\000\000\000\t\145\000\000\001\158\000\000\001\162\001\210\t\145\t\145\001\166\000\000\001\170\001\174\000\000\000\000\000\000\t\145\000\000\000\000\t\145\000\000\000\000\000\000\003Z\t\145\t\145\t\145\000\000\000\000\007\130\001\222\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\000\000\t\145\000\000\000\000\000\000\t\145\014\133\014\133\000\000\000\000\000\000\014\133\000\000\000\000\014\133\t\145\t\145\t\145\000\000\t\145\t\145\000\000\000\000\000\000\014\133\007\142\014\133\000\000\014\133\t\145\014\133\000\000\t\145\001\202\001\206\000\000\t\145\000\000\000\000\000\000\000\000\000\000\014\133\000\000\000\000\004\254\000\000\t\145\014\133\014\133\014\137\014\137\001\210\001\214\004R\014\137\000\000\014\133\014\137\000\000\014\133\000\000\000\000\000\000\000\000\014\133\014\133\014\133\014\137\000\000\014\137\000\000\014\137\000\000\014\137\001\246\002\170\000\000\000\000\000\000\002\174\014\133\002\186\004.\004:\014\133\014\137\000\000\000\000\004F\000\000\018\178\014\137\014\137\000\000\014\133\014\133\014\133\004R\014\133\014\133\014\137\000\000\000\000\014\137\004b\004J\000\000\000\000\014\137\014\137\014\137\014\133\000\000\000\000\000\000\014\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\137\000\000\014\133\000\000\014\137\001\177\000\000\000\000\000\000\000\000\001\177\000\000\001\206\001\177\014\137\014\137\014\137\000\000\014\137\014\137\000\000\t\249\000\000\001\177\004b\000\000\000\000\001\177\000\000\001\177\000\000\014\137\000\000\000\000\000\000\014\137\000\000\000\000\000\000\000\000\000\000\001\177\000\000\000\000\000\000\000\000\014\137\001\177\001\177\000\000\000\000\000\000\000\000\000\000\002\170\000\000\001\177\000\000\000\000\001\177\000\000\000\000\000\000\000\000\001\177\001\177\001\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\177\001\177\000\000\000\000\004\222\003\253\000\000\000\000\000\000\000\000\003\253\000\000\001\206\003\253\001\177\001\177\000\000\000\000\001\177\001\177\000\000\t\245\000\000\003\253\000\000\000\000\000\000\003\253\001\177\003\253\000\000\000\000\000\000\000\000\000\000\001\177\000\000\000\000\000\000\000\000\001\177\003\253\000\000\000\000\000\000\000\000\001\177\003\253\001\173\000\000\000\000\000\000\000\000\000\000\002\170\000\000\003\253\000\000\000\000\003\253\000\000\000\000\000\000\000\000\003\253\003\253\003\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\253\003\253\000\000\000\000\004\222\003\249\000\000\000\000\000\000\000\000\003\249\000\000\001\206\003\249\003\253\003\253\000\000\000\000\003\253\003\253\000\000\t\245\000\000\003\249\000\000\000\000\000\000\003\249\003\253\003\249\000\000\000\000\000\000\000\000\000\000\003\253\000\000\000\000\000\000\000\000\003\253\003\249\000\000\000\000\000\000\000\000\003\253\003\249\001\173\000\000\000\153\000\000\000\000\000\000\002\170\000\153\003\249\000\000\000\153\003\249\000\000\000\000\000\000\000\000\003\249\003\249\003\249\000\000\000\153\000\000\000\153\000\000\000\153\000\000\000\153\000\000\000\000\000\000\000\000\000\000\003\249\003\249\000\000\000\000\004\222\000\000\000\153\000\000\000\000\000\000\000\000\000\000\000\153\000\000\003\249\003\249\000\153\000\000\003\249\003\249\000\000\000\153\000\000\000\000\000\153\000\000\000\000\020:\003\249\000\153\000\153\000\238\000\000\000\000\002\014\003\249\000\000\000\000\000\153\000\153\003\249\002\018\000\000\000\000\002\026\000\153\003\249\000\000\000\221\000\153\000\000\000\000\001\210\000\221\000\000\000\000\000\221\000\000\000\000\000\153\000\153\000\000\000\000\000\153\000\153\000\000\000\221\000\000\000\221\003Z\000\221\000\000\000\221\000\153\000\000\007\130\001\222\000\000\000\000\000\153\000\153\000\000\002\186\000\000\000\221\000\000\000\000\000\000\000\000\000\153\000\221\000\153\000\000\000\000\000\221\000\000\000\000\000\000\000\000\000\221\000\000\000\000\000\221\000\000\000\000\020J\000\000\000\221\000\221\000\238\007\142\000\000\002\014\000\000\000\000\000\000\000\221\000\221\000\000\002\018\000\000\000\000\002\026\000\221\000\000\000\000\000\161\000\221\000\000\000\000\001\210\000\161\000\000\000\000\000\161\000\000\000\000\000\221\000\221\000\000\000\000\000\221\000\221\000\000\000\161\000\000\000\161\003Z\000\161\000\000\000\161\000\221\000\000\007\130\001\222\000\000\000\000\000\221\000\221\000\000\002\186\000\000\000\161\000\000\000\000\000\000\000\000\000\221\000\161\000\221\000\000\000\000\000\161\000\000\000\000\000\000\000\000\000\161\000\000\000\000\000\161\000\000\000\000\000\000\000\000\000\161\000\161\000\238\007\142\000\000\000\000\000\000\000\000\000\000\000\161\000\161\000\000\000\000\000\000\000\000\000\000\000\161\000\000\000\000\000\157\000\161\000\000\000\000\000\000\000\157\000\000\000\000\000\157\000\000\000\000\000\161\000\161\000\000\000\000\000\161\000\161\000\000\000\157\000\000\000\157\000\000\000\157\000\000\000\157\000\161\000\000\000\000\000\000\000\000\000\000\000\161\000\161\000\000\000\000\000\000\000\157\000\000\000\000\000\000\000\000\000\161\000\157\000\161\000\000\000\000\000\157\000\000\000\000\000\000\000\000\000\157\000\000\000\000\000\157\000\000\000\000\000\000\000\000\000\157\000\157\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\157\000\157\000\000\000\000\000\000\000\000\000\000\000\157\000\000\000\000\001\141\000\157\000\000\000\000\000\000\001\141\000\000\000\000\001\141\000\000\000\000\000\157\000\157\000\000\000\000\000\157\000\157\000\000\001\141\000\000\000\000\000\000\001\141\000\000\001\141\000\157\000\000\000\000\000\000\000\000\000\000\000\157\000\157\000\000\000\000\000\000\001\141\001\141\000\000\000\000\000\000\000\157\001\141\000\157\000\000\000\000\000\000\000\000\005\209\000\000\000\000\001\141\000\000\000\000\001\141\000\000\000\000\000\000\000\000\001\141\001\141\001\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\141\000\000\000\000\000\000\001\141\014\129\014\129\000\000\000\000\000\000\014\129\000\000\000\000\014\129\001\141\001\141\000\000\000\000\001\141\001\141\000\000\000\000\000\000\014\129\005\209\014\129\000\000\014\129\001\141\014\129\000\000\000\000\000\000\000\000\001\141\001\141\000\000\000\000\000\000\000\000\001\141\014\129\000\000\000\000\000\000\000\000\001\141\014\129\014\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\129\000\000\000\000\014\129\000\000\000\000\000\000\000\000\014\129\014\129\014\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\129\000\000\000\000\000\000\014\129\014}\014}\000\000\000\000\000\000\014}\000\000\000\000\014}\014\129\014\129\014\129\000\000\014\129\014\129\000\000\000\000\000\000\014}\000\000\014}\000\000\014}\000\000\014}\000\000\014\129\000\000\000\000\000\000\014\129\000\000\000\000\000\000\000\000\000\000\014}\000\000\000\000\004\254\000\000\014\129\014}\014}\000\000\000\000\000\000\000\000\000\000\000\000\005-\014}\000\000\000\000\014}\000\246\000\000\000\000\002\"\014}\014}\014}\000\000\000\000\000\000\000\000\000\000\000\000\021\142\000\000\000\000\000\000\005-\000\000\003v\014}\000\000\t\149\t\149\014}\000\000\000\000\t\149\000\000\000\000\t\149\021\146\000\000\000\000\014}\014}\014}\021\186\014}\014}\t\149\000\000\t\149\000\000\t\149\000\000\t\149\000\000\007\210\020\222\000\000\014}\000\000\000\000\020\246\014}\000\000\000\000\t\149\000\000\000\000\000\000\000\000\000\000\t\149\t\149\014}\000\000\000\000\000\000\022Z\000\000\000\000\t\149\000\000\000\000\t\149\000\000\000\000\000\000\000\000\t\149\t\149\000\238\021\018\022n\000\000\000\000\005-\005-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\149\003\022\002\198\000\000\t\149\002\146\000\000\007&\022~\000\000\002\254\000\000\000\000\000\000\t\149\t\149\t\149\000\000\t\149\t\149\001\210\000\000\007F\000\000\000\000\000\000\000\000\003\026\t\149\000\000\t\134\t\149\000\000\000\000\000\000\t\149\000\000\000\000\003\189\000\000\003&\000\000\000\000\t\178\001\190\000\000\t\149\007\229\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\000\000\t\194\005\174\011&\000\000\000\000\007\229\000\000\000\000\000\000\007\229\000\000\000\000\000\000\005\178\000\000\000\000\011\142\011\214\011\238\011\166\012\006\005\186\005\190\000\000\000\000\003\189\000\000\000\000\000\000\000\000\012\030\0126\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012N\003\189\000\000\000\000\003\189\000\000\005\194\000\000\000\238\000\000\000\000\000\000\004\130\000\000\000\000\000\000\000\000\011>\011\190\012f\012~\012\174\000\000\000\000\000\000\000\000\001\173\000\000\007\229\012\198\000\000\001\173\000\000\001\206\001\173\000\000\000\000\000\000\012\222\000\000\000\000\000\000\t\245\000\000\001\173\000\000\000\000\000\000\001\173\000\000\001\173\000\000\r>\000\000\rV\012\150\000\000\000\000\000\000\000\000\000\000\012\246\001\173\000\000\000\000\000\000\000\000\000\000\001\173\r\014\r&\000\000\000\000\000\000\000\000\002\170\000\000\001\173\020.\000\000\001\173\000\000\000\000\000\000\000\000\001\173\001\173\001\173\000\000\000\000\000\000\000\000\000\000\000\000\011&\000\000\000\000\000\000\0202\000\000\000\000\001\173\001\173\000\000\000\000\004\222\000\000\000\000\011\142\011\214\011\238\011\166\012\006\000\000\000\000\001\173\001\173\000\000\000\000\001\173\001\173\000\000\012\030\0126\000\000\000\000\000\000\000\000\000\000\001\173\000\000\012N\000\000\000\000\000\000\000\000\001\173\000\000\000\000\000\238\000\000\001\173\000\000\000\000\000\000\000\000\000\000\001\173\011>\011\190\012f\012~\012\174\000\000\000\000\006\142\000\000\000\000\000\000\000\000\012\198\001\202\001\206\000\000\000\000\000\000\000\000\000\000\000\000\012\222\000\000\n\142\000\000\000\000\000\000\000\000\000\246\001\202\001\206\002\"\001\210\001\250\001\230\r>\0206\rV\012\150\020F\000\000\021\142\001\242\000\000\012\246\005-\000\000\003v\001\210\001\250\001\230\000\000\r\014\r&\000\000\001\246\002\162\000\000\001\242\021\146\002\174\000\000\002\186\004.\004:\021\186\000\000\000\000\000\000\004F\000\000\001\246\002\162\000\000\000\000\000\000\002\174\020\222\002\186\004.\004:\000\000\020\246\006\133\006\133\004F\004J\000\000\006\133\000\000\000\000\006\133\000\000\000\000\000\000\000\000\000\000\000\000\022Z\000\000\000\000\006\133\004J\006\133\000\000\006\133\000\000\006\133\000\000\000\000\000\000\000\000\021\018\022n\000\000\000\000\000\000\000\000\000\000\006\133\000\000\000\000\004~\000\000\004\130\006\133\006\133\006\129\007\166\000\000\000\000\b\130\006\129\022~\006\133\006\129\000\000\006\133\000\000\000\000\000\000\000\000\006\133\006\133\000\238\006\129\000\000\006\129\000\000\006\129\000\000\006\129\000\000\000\000\000\000\000\000\000\000\000\000\006\133\000\000\000\000\000\000\006\133\006\129\000\000\000\000\000\000\000\000\000\000\006\129\b\"\000\000\006\133\006\133\006\133\000\000\006\133\006\133\006\129\000\000\000\000\006\129\000\000\000\000\000\000\000\000\006\129\006\129\000\238\006\133\000\000\000\000\000\000\006\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\129\000\000\006\133\000\000\006\129\014\141\014\141\000\000\000\000\000\000\014\141\000\000\000\000\014\141\006\129\006\129\006\129\000\000\006\129\006\129\000\000\000\000\000\000\014\141\000\000\014\141\n\154\014\141\000\000\014\141\000\000\006\129\001\202\001\206\000\000\006\129\000\000\000\000\000\000\000\000\000\000\014\141\000\000\000\000\000\000\000\000\006\129\014\141\014\141\014\145\014\145\001\210\001\250\001\230\014\145\000\000\014\141\014\145\000\000\014\141\000\000\001\242\000\000\000\000\014\141\014\141\000\238\014\145\002\002\014\145\000\000\014\145\000\000\014\145\001\246\002\162\000\000\000\000\000\000\002\174\014\141\002\186\004.\004:\014\141\014\145\000\000\000\000\004F\000\000\000\000\014\145\b\"\000\000\014\141\014\141\014\141\000\000\014\141\014\141\014\145\000\000\000\000\014\145\000\000\004J\000\000\000\000\014\145\014\145\000\238\014\141\000\000\000\000\000\000\014\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\145\000\000\014\141\000\000\014\145\006\157\007\166\000\000\000\000\000\000\006\157\000\000\000\000\006\157\014\145\014\145\014\145\000\000\014\145\014\145\000\000\000\000\000\000\006\157\000\000\006\157\000\000\006\157\000\000\006\157\000\000\014\145\007\181\007\181\000\000\014\145\000\000\000\000\000\000\000\000\000\000\006\157\000\000\000\000\000\000\000\000\014\145\006\157\b\"\006\161\006\161\007\181\007\181\007\181\006\161\000\000\006\157\006\161\000\000\006\157\000\000\007\181\000\000\000\000\006\157\006\157\000\238\006\161\000\000\006\161\000\000\006\161\000\000\006\161\007\181\007\181\000\000\000\000\000\000\007\181\006\157\007\181\007\181\007\181\006\157\006\161\000\000\000\000\007\181\000\000\000\000\006\161\006\161\000\000\006\157\006\157\006\157\000\000\006\157\006\157\006\161\000\000\000\000\006\161\000\000\007\181\000\000\000\000\006\161\006\161\006\161\006\157\000\000\000\000\000\000\006\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\161\000\000\006\157\000\000\006\161\006\153\006\153\000\000\000\000\000\000\006\153\000\000\000\000\006\153\006\161\006\161\006\161\000\000\006\161\006\161\000\000\000\000\000\000\006\153\0056\006\153\000\000\006\153\000\000\006\153\000\000\006\161\000\000\000\000\000\000\006\161\000\000\000\000\000\000\000\000\000\000\006\153\000\000\000\000\000\000\000\000\bJ\006\153\b\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\153\000\000\000\000\006\153\000\000\000\000\000\000\000\000\006\153\006\153\000\238\000\000\003\245\000\000\000\000\000\000\000\000\003\245\000\000\001\206\003\245\000\000\000\000\000\000\006\153\000\000\000\000\000\000\006\153\000\000\003\245\000\000\000\000\000\000\003\245\000\000\003\245\000\000\006\153\006\153\006\153\000\000\006\153\006\153\000\000\000\000\000\000\000\000\003\245\000\000\000\000\000\000\000\000\000\000\003\245\006\153\000\000\000\000\000\000\006\153\000\000\002\170\000\000\003\245\000\000\000\000\003\245\000\000\000\000\000\000\006\153\003\245\003\245\003\245\000\000\003\241\000\000\000\000\000\000\000\000\003\241\000\000\001\206\003\241\000\000\000\000\000\000\003\245\003\245\000\000\000\000\004\222\000\000\003\241\000\000\000\000\000\000\003\241\000\000\003\241\000\000\003\245\003\245\000\000\000\000\003\245\003\245\000\000\000\000\000\000\000\000\003\241\000\000\000\000\000\000\003\245\000\000\003\241\000\000\000\000\0011\000\000\003\245\000\000\002\170\0011\003\241\003\245\0011\003\241\000\000\000\000\000\000\003\245\003\241\003\241\003\241\000\000\0011\000\000\0011\000\000\0011\000\000\0011\000\000\000\000\000\000\000\000\000\000\003\241\003\241\000\000\000\000\004\222\000\000\0011\000\000\000\000\000\000\000\000\000\000\0011\000\000\003\241\003\241\0011\000\000\003\241\003\241\000\000\0011\000\000\000\000\0011\000\000\000\000\000\000\003\241\0011\0011\000\238\000\000\001-\000\000\003\241\000\000\000\000\001-\0011\003\241\001-\000\000\000\000\000\000\0011\003\241\000\000\000\000\0011\000\000\001-\000\000\001-\000\000\001-\000\000\001-\000\000\0011\0011\0011\000\000\0011\0011\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\0011\000\000\001-\000\000\000\000\000\000\001-\0011\000\000\000\000\000\000\001-\000\000\000\000\001-\000\000\000\000\000\000\0011\001-\001-\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\001-\001i\000\000\000\000\000\000\000\000\001i\000\000\r\221\001i\001-\001-\001-\000\000\001-\001-\000\000\r\221\000\000\001i\000\000\001i\000\000\001i\001-\001i\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\000\001i\000\000\000\000\000\000\000\000\001-\001i\r\221\000\000\000\000\000\000\000\000\000\000\r\221\000\000\000\000\000\000\000\000\001i\000\000\000\000\000\000\000\000\001i\001i\001i\000\000\000\000\001\029\000\000\000\000\000\000\000\000\001\029\000\000\002\025\001\029\000\000\000\000\001i\000\000\000\000\000\000\r\221\002\025\000\000\001\029\000\000\001\029\000\000\001\029\000\000\001\029\001i\001i\001i\000\000\001i\001i\000\000\000\000\000\000\000\000\000\000\001\029\000\000\000\000\000\000\000\000\000\000\001\029\002\025\000\000\000\000\001i\000\000\000\000\002\025\000\000\000\000\000\000\000\000\001\029\000\000\000\000\001i\000\000\001\029\001\029\001\029\000\000\001\185\000\000\000\000\000\000\000\000\001\185\000\000\018\150\001\185\000\000\002\146\000\000\001\029\000\000\000\000\000\000\002\025\000\000\001\185\000\000\000\000\000\000\001\185\000\000\001\185\000\000\001\029\001\029\001\029\000\000\001\029\001\029\000\000\000\000\000\000\000\000\001\185\000\000\000\000\000\000\000\000\000\000\001\185\000\000\000\000\000\000\000\000\001\029\018\154\000\000\000\000\001\185\000\000\000\000\001\185\000\000\000\000\000\000\001\029\001\185\001\185\000\000\018\166\005%\000\000\005%\000\000\000\000\005%\000\000\000\000\005%\000\000\005%\007\166\001\185\000\000\000\000\005%\001\185\000\000\005%\000\000\000\000\005%\005%\000\000\005%\005\190\001\185\001\185\005%\000\000\001\185\001\185\005%\005%\005%\000\000\005%\000\000\000\000\005%\001\185\000\000\005%\000\000\000\000\000\000\005%\001\185\005%\000\000\000\000\005%\005%\b\"\005%\000\000\005%\002\234\001\185\005%\002\234\005%\000\000\000\000\005%\000\000\000\000\000\000\005%\005%\002\234\000\238\005%\t!\000\000\005%\005%\000\000\t!\005%\000\000\t!\000\000\000\000\000\000\005%\005%\005%\000\000\005%\005%\t!\000\000\005%\005%\t!\000\000\t!\000\000\005%\005%\000\000\000\000\005%\005%\000\000\000\000\005%\000\000\t!\005%\000\000\000\000\007\210\000\000\t!\000\000\000\000\000\000\t!\005%\005%\000\000\000\000\t!\029*\000\000\t!\000\000\000\000\000\000\005%\t!\t!\000\238\t\029\000\000\000\000\000\000\000\000\t\029\t!\t!\t\029\000\000\000\000\000\000\000\000\t!\000\000\000\000\000\000\t!\t\029\000\000\000\000\000\000\t\029\000\000\t\029\000\000\000\000\t!\t!\t!\000\000\t!\t!\000\000\000\000\000\000\t\029\000\000\000\000\000\000\000\000\t!\t\029\000\000\000\000\000\000\t\029\000\000\t!\000\000\000\000\t\029\000\000\000\000\t\029\000\000\000\000\000\000\000\000\t\029\t\029\000\238\003\233\000\000\000\000\000\000\000\000\003\233\t\029\t\029\003\233\000\000\000\000\000\000\000\000\t\029\000\000\000\000\000\000\t\029\003\233\000\000\000\000\000\000\003\233\000\000\003\233\000\000\000\000\t\029\t\029\t\029\000\000\t\029\t\029\000\000\000\000\000\000\003\233\018\174\000\000\000\000\000\000\t\029\003\233\000\000\000\000\000\000\000\000\000\000\t\029\000\000\000\000\003\233\000\000\000\000\003\233\000\000\000\000\000\000\000\000\003\233\003\233\003\233\003\022\002\198\000\000\000\000\002\146\000\000\007&\000\000\000\000\002\254\000\000\000\000\000\000\003\233\000\000\000\000\000\000\003\233\000\000\001\210\000\000\007F\000\000\000\000\000\000\000\000\003\026\003\233\003\233\t\134\000\000\003\233\003\233\000\000\000\000\000\000\000\000\0276\000\000\003&\000\000\003\233\0032\001\190\000\000\000\000\000\000\019\014\003\233\002\186\000\000\000\000\004\006\003\233\000\000\000\000\004\n\000\000\004\018\003\233\t\194\005\174\000\000\000\000\000\000\003\022\002\198\000\000\000\000\002\146\000\000\007&\000\000\005\178\002\254\000\000\000\000\000\000\000\000\000\000\000\000\005\186\005\190\000\000\001\210\025\166\007F\000\000\000\000\000\000\000\000\003\026\000\000\000\000\t\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\028\002\003&\005\194\000\000\t\178\001\190\000\000\000\000\004\130\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\000\000\t\194\005\174\000\000\000\000\000\000\003\022\002\198\000\000\000\000\002\146\000\000\007&\000\000\005\178\002\254\000\000\000\000\000\000\000\000\000\000\000\000\005\186\005\190\000\000\001\210\rz\007F\000\000\000\000\000\000\000\000\003\026\000\000\000\000\t\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026>\003&\005\194\000\000\t\178\001\190\000\000\000\000\004\130\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\250\t\194\005\174\000\000\000\000\000\000\003\022\002\198\000\000\000\000\002\146\000\000\000\000\000\000\005\178\002\254\000\000\000\000\000\000\000\000\005\254\000\000\005\186\005\190\000\000\001\210\rz\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\158\003&\005\194\000\000\0032\001\190\000\000\000\000\004\130\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\000\000\nU\000\000\000\000\000\000\000\000\000\000\003\022\002\198\000\000\005\178\002\146\000\000\000\000\000\000\000\000\002\254\000\000\005\186\005\190\000\000\006\002\000\000\nU\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\000\000\000\000\006\190\000\000\000\000\005\194\005\r\005\r\000\000\003&\005\r\004\130\0032\001\190\000\000\005\r\000\000\000\000\000\000\002\186\000\000\005\r\004\006\000\000\000\000\005\r\004\n\000\000\004\018\005\162\000\000\005\174\005\r\026\238\000\000\000\000\027\006\000\000\000\000\000\000\000\000\000\000\000\000\005\178\000\000\005\r\000\000\000\000\005\r\005\r\000\000\005\186\005\190\000\000\006\002\005\r\000\000\000\000\005\r\000\000\000\000\000\238\005\r\000\000\005\r\005\r\000\000\005\r\003\233\000\000\000\000\000\000\000\000\003\233\000\000\005\194\003\233\nU\003\233\005\r\000\000\004\130\000\000\003\233\000\000\000\000\003\233\005\r\005\r\000\000\003\233\000\000\003\233\000\000\000\000\000\000\003\233\000\000\000\000\000\000\003\233\000\000\003\233\000\000\003\233\018\174\000\000\000\000\000\000\000\000\003\233\005\r\000\000\000\000\003\233\018\174\000\000\005\r\000\000\003\233\003\233\000\000\003\233\000\000\000\000\000\000\000\000\003\233\003\233\003\233\000\000\000\000\003\233\000\000\000\000\000\000\000\000\003\233\003\233\003\233\000\000\000\000\000\000\003\233\000\000\000\000\000\000\003\233\000\000\000\000\000\000\000\000\000\000\003\233\000\000\000\000\000\000\003\233\003\233\0292\000\000\003\233\003\233\000\000\000\000\000\000\000\000\003\233\003\233\029b\000\000\003\233\003\233\000\000\r\213\000\000\000\000\019\014\003\233\r\213\000\000\000\000\r\213\003\233\000\000\000\000\000\000\019\014\003\233\000\000\000\000\000\000\r\213\003\233\000\000\000\000\r\213\000\000\r\213\000\000\000\000\000\000\000\000\000\000\005\201\000\000\000\000\000\000\000\246\000\000\r\213\002\202\000\000\000\000\000\000\000\000\r\213\000\000\000\000\000\000\000\000\005Y\000\000\000\000\000\000\r\213\000\000\003v\r\213\000\000\000\000\000\000\000\000\r\213\r\213\000\000\000\000\000\000\000\000\003\130\000\000\0075\000\000\000\000\000\000\020z\000\000\000\000\002\198\r\213\000\000\002\146\000\000\r\213\028N\000\000\002\254\020\222\000\000\000\000\000\000\0075\020\246\r\213\r\213\002\138\001\210\r\213\r\213\000\000\003\002\000\000\000\000\000\000\000\000\000\000\000\000\r\213\020\254\003\006\000\000\003\166\000\000\000\000\r\213\000\000\000\000\007]\000\000\003\238\001\190\000\000\021\018\021N\002\198\r\213\002\186\002\146\000\000\003\246\000\000\000\000\002\254\b\190\b\194\b\206\000\000\007]\005\174\000\000\000\000\000\000\001\210\025\142\000\000\000\000\003\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\006\000\000\003\166\005\186\005\190\000\000\000\000\000\000\000\000\000\000\003\238\001\190\000\000\000\000\000\000\000\000\000\000\002\186\000\000\000\000\003\246\000\000\000\000\000\000\b\190\b\194\b\206\005\194\b\214\005\174\000\000\000\000\b\238\004\130\006!\000\000\000\000\000\000\000\000\006!\000\000\000\000\006!\000\000\000\000\000\000\000\000\000\000\000\000\005\186\005\190\000\000\006!\000\000\000\000\000\000\006!\000\000\006!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006!\000\000\000\000\005\194\b\214\000\000\006!\000\000\b\238\004\130\000\000\000\000\b\130\000\000\000\000\006!\000\000\000\000\006!\000\000\000\000\000\000\000\000\006!\006!\000\238\000\000\006)\000\000\000\000\000\000\000\000\006)\000\000\000\000\006)\000\000\000\000\000\000\006!\006!\000\000\000\000\006!\000\000\006)\000\000\000\000\000\000\006)\000\000\006)\000\000\006!\006!\000\000\000\000\006!\006!\000\000\000\000\000\000\000\000\006)\000\000\000\000\000\000\000\000\000\000\006)\000\000\003\233\000\000\000\000\006!\b\130\003\233\000\000\006)\003\233\000\000\006)\000\000\000\000\000\000\006!\006)\006)\000\238\003\233\000\000\000\000\000\000\003\233\000\000\003\233\000\000\000\000\000\000\000\000\000\000\000\000\006)\006)\000\000\000\000\006)\003\233\018\174\000\000\000\000\000\000\000\000\003\233\000\000\000\000\006)\006)\000\000\000\000\006)\006)\003\233\000\000\000\000\003\233\000\000\000\000\000\000\000\000\003\233\003\233\003\233\006\229\000\000\000\000\000\000\006)\006\229\000\000\000\000\006\229\000\000\000\000\000\000\000\000\003\233\000\000\006)\000\000\003\233\006\229\000\000\000\000\000\000\006\229\000\000\006\229\000\000\000\000\003\233\003\233\021^\000\000\003\233\003\233\000\000\000\000\000\000\006\229\000\000\000\000\000\000\000\000\000\000\006\229\000\000\000\000\000\000\000\000\019\014\003\233\000\000\000\000\006\229\000\000\000\000\006\229\000\000\000\000\000\000\000\000\006\229\006\229\000\238\000\000\000\000\000\000\000\000\000\000\029\n\000\000\000\000\000\000\000\000\000\000\003\022\002\198\006\229\000\000\002\146\000\000\006\229\000\000\000\000\002\254\000\000\000\000\000\000\000\000\000\000\000\000\006\229\006\229\0252\001\210\006\229\006\229\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\006\229\000\000\000\000\r\213\000\000\000\000\000\000\006\229\r\213\003&\000\000\r\213\0032\001\190\000\000\000\000\000\000\000\000\006\229\002\186\000\000\r\213\004\006\000\000\000\000\r\213\004\n\r\213\004\018\005\162\000\000\005\174\000\000\005\201\000\000\000\000\000\000\000\000\000\000\r\213\000\000\000\000\000\000\005\178\000\000\r\213\000\000\000\000\000\000\000\000\000\000\005\186\005\190\000\000\006\002\000\000\000\000\r\213\000\000\000\000\000\000\000\000\r\213\r\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\194\000\000\007\018\r\213\tn\006&\004\130\000\000\000\000\000\000\000\000\003\022\002\198\000\000\000\000\002\146\000\000\r\213\r\213\002\138\002\254\r\213\r\213\000\000\000\000\000\000\000\000\004\014\000\000\000\000\001\210\r\213\000\000\000\000\000\000\030\030\000\000\003\026\r\213\000\000\000\000\006\130\000\000\000\000\000\000\000\000\000\000\003\022\002\198\r\213\003&\002\146\000\000\0032\001\190\000\000\002\254\000\000\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\001\210\004\n\000\000\004\018\005\162\000\000\005\174\003\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\178\000\000\003&\000\000\000\000\0032\001\190\000\000\005\186\005\190\000\000\006\002\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\000\000\006\162\000\000\000\000\000\000\000\000\005\194\003\022\002\198\000\000\005\178\002\146\004\130\000\000\000\000\000\000\002\254\000\000\005\186\005\190\000\000\006\002\000\000\006\214\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\0079\000\000\000\000\000\000\000\000\005\194\003\022\002\198\000\000\003&\002\146\004\130\0032\001\190\000\000\002\254\000\000\000\000\000\000\002\186\0079\000\000\004\006\000\000\000\000\001\210\004\n\000\000\004\018\005\162\000\000\005\174\003\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\178\000\000\003&\000\000\000\000\0032\001\190\000\000\005\186\005\190\000\000\006\002\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\000\000\014\n\000\000\000\000\000\000\000\000\005\194\003\022\002\198\000\000\005\178\002\146\004\130\000\000\000\000\000\000\002\254\000\000\005\186\005\190\000\000\000\000\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\000\000\014\022\000\000\000\000\000\000\000\000\005\194\003\022\002\198\000\000\003&\002\146\004\130\0032\001\190\000\000\002\254\000\000\000\000\000\000\002\186\000\000\000\000\004\006\000\000\000\000\001\210\004\n\000\000\004\018\005\162\000\000\005\174\003\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\178\000\000\003&\000\000\000\000\0032\001\190\000\000\005\186\005\190\000\000\006\002\002\186\000\000\000\000\004\006\000\000\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\000\000\014\"\000\000\000\000\000\000\000\000\005\194\003\022\002\198\000\000\005\178\002\146\004\130\000\000\000\000\000\000\002\254\000\000\005\186\005\190\000\000\006\002\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\000\000\007\241\007\166\000\000\000\000\000\000\007\241\005\194\000\000\007\241\000\000\003&\000\000\004\130\0032\001\190\000\000\000\000\000\000\007\241\000\000\002\186\000\000\007\241\004\006\007\241\000\000\000\000\004\n\000\000\004\018\005\162\000\000\005\174\000\000\000\000\000\000\007\241\000\000\000\000\000\000\000\000\000\000\007\241\b\"\005\178\000\000\000\000\000\000\000\000\000\000\000\000\007\241\005\186\005\190\007\241\006\002\000\000\000\000\000\000\007\241\007\241\000\238\001\153\000\000\000\000\000\000\000\000\001\153\000\000\000\000\001\153\000\000\000\000\000\000\000\000\007\241\005\194\000\000\000\000\007\241\001\153\000\000\004\130\000\000\001\153\000\000\001\153\000\000\000\000\007\241\007\241\000\000\000\000\007\241\007\241\000\000\000\000\000\000\001\153\000\000\000\000\000\000\000\000\000\000\001\153\000\000\001\189\000\000\000\000\000\000\007\241\001\189\000\000\001\153\001\189\000\000\001\153\000\000\000\000\000\000\000\000\001\153\001\153\001\153\001\189\000\000\000\000\000\000\001\189\000\000\001\189\000\000\000\000\000\000\000\000\000\000\000\000\001\153\000\000\000\000\000\000\001\153\001\189\000\000\000\000\000\000\000\000\000\000\001\189\000\000\000\000\001\153\001\153\000\000\000\000\001\153\001\153\001\189\000\000\000\000\001\189\021j\000\000\000\000\000\000\001\189\001\189\000\000\000\000\000\000\000\000\000\000\001\153\000\000\000\000\000\000\000\000\001\153\000\000\000\000\000\000\001\189\000\000\006\233\000\000\001\189\000\000\000\000\006\233\000\000\000\000\006\233\000\000\000\000\000\000\001\189\001\189\000\000\000\000\001\189\001\189\006\233\000\000\000\000\000\000\006\233\000\000\006\233\000\000\001\189\000\000\000\000\000\000\000\000\000\000\000\000\001\189\000\000\000\000\006\233\000\000\025\014\000\000\000\000\000\000\006\233\000\000\001\189\000\000\000\000\000\000\000\000\000\000\000\000\006\233\000\000\000\000\006\233\000\000\000\000\000\000\000\000\006\233\006\233\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\233\000\000\r\213\000\000\006\233\000\000\000\000\r\213\000\000\000\000\r\213\000\000\000\000\000\000\006\233\006\233\000\000\000\000\006\233\006\233\r\213\000\000\000\000\000\000\r\213\000\000\r\213\000\000\006\233\000\000\000\000\000\000\005\201\000\000\000\000\006\233\000\000\000\000\r\213\000\000\000\000\000\000\000\000\000\000\r\213\000\000\006\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\213\000\000\000\000\000\000\000\000\r\213\r\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\141\000\000\002\198\r\141\000\000\031\206\000\000\r\213\000\000\000\000\031\210\000\000\000\000\r\141\000\000\000\000\000\000\000\000\000\000\r\141\000\000\r\213\r\213\002\138\000\000\r\213\r\213\000\000\000\000\000\000\000\000\r\141\000\000\000\000\000\000\r\213\000\000\r\141\000\000\030V\000\000\000\000\r\213\001\002\001\190\000\000\r\141\000\000\000\000\r\141\000\000\000\000\000\000\r\213\r\141\000\000\000\000\000\000\000\000\000\000\tQ\tQ\031\214\000\000\tQ\000\000\000\000\000\000\000\000\tQ\r\141\000\000\000\000\000\000\r\141\019V\000\000\000\000\000\000\tQ\000\000\000\000\000\000\031\218\r\141\r\141\tQ\000\000\r\141\005%\000\000\000\000\000\000\000\000\005%\000\000\000\000\005%\000\000\tQ\000\000\000\000\tQ\tQ\000\000\r\141\000\000\005%\000\000\tQ\000\000\005%\tQ\005%\000\000\000\000\tQ\000\000\tQ\tQ\000\000\tQ\000\000\000\000\000\000\005%\000\000\000\000\000\000\000\000\000\000\005%\000\000\tQ\000\000\000\000\000\000\b\130\000\000\000\000\005%\tQ\tQ\005%\000\000\000\000\000\000\000\000\005%\002\234\000\238\000\000\001U\000\000\000\000\000\000\000\000\001U\000\000\000\000\001U\000\000\000\000\000\000\005%\tQ\000\000\000\000\005%\000\000\001U\tQ\001U\000\000\001U\000\000\001U\000\000\005%\005%\000\000\000\000\005%\005%\000\000\000\000\000\000\000\000\001U\000\000\000\000\000\000\000\000\000\000\001U\000\000\000\209\000\000\000\000\005%\000\000\000\209\000\000\000\000\000\209\000\000\001U\000\000\000\000\000\000\000\000\001U\001U\000\238\000\209\000\000\000\000\000\000\000\209\000\000\000\209\000\000\000\000\000\000\000\000\000\000\000\000\001U\000\000\000\000\000\000\000\000\000\209\000\000\000\000\000\000\000\000\000\000\000\209\000\000\000\000\001U\001U\001U\000\000\001U\001U\000\209\000\000\000\000\000\209\000\000\000\000\000\000\000\000\000\209\000\209\000\238\000\000\000\213\000\000\000\000\001U\000\000\000\213\000\000\000\000\000\213\000\000\000\000\000\000\000\209\000\000\001U\000\000\000\209\000\000\000\213\000\000\000\000\000\000\000\213\000\000\000\213\000\000\000\209\000\209\000\000\000\000\000\209\000\209\000\000\000\000\000\000\000\000\000\213\000\000\000\000\000\000\000\000\000\000\000\213\000\000\007\237\000\000\000\000\000\209\000\000\007\237\000\000\000\213\007\237\000\000\000\213\000\000\000\000\000\000\000\209\000\213\000\213\000\238\007\237\000\000\000\000\000\000\007\237\000\000\007\237\000\000\000\000\000\000\000\000\000\000\000\000\000\213\000\000\000\000\000\000\000\213\007\237\000\000\000\000\000\000\000\000\000\000\007\237\000\000\000\000\000\213\000\213\000\000\000\000\000\213\000\213\007\237\000\000\000\000\007\237\000\000\000\000\000\000\000\000\007\237\007\237\000\000\000\000\006\221\000\000\000\000\000\213\000\000\006\221\000\000\000\000\006\221\000\000\000\000\000\000\007\237\000\000\000\213\021:\007\237\000\000\006\221\000\000\000\000\000\000\006\221\000\000\006\221\000\000\007\237\007\237\020\142\000\000\007\237\007\237\000\000\000\000\000\000\000\000\006\221\000\000\000\000\000\000\000\000\000\000\006\221\000\000\0061\007\166\000\000\007\237\000\000\0061\000\000\006\221\0061\000\000\006\221\000\000\000\000\000\000\000\000\006\221\006\221\000\000\0061\000\000\000\000\000\000\0061\000\000\0061\000\000\000\000\000\000\000\000\r=\000\000\006\221\000\000\000\000\r=\006\221\0061\r=\000\000\000\000\000\000\000\000\0061\b\"\000\000\006\221\006\221\r=\000\000\006\221\006\221\r=\000\000\r=\0061\000\000\000\000\000\000\000\000\0061\0061\000\238\000\000\000\000\000\000\r=\006\221\000\000\000\000\000\000\000\000\r=\000\000\000\000\000\000\0061\000\000\000\000\001\202\002\142\r=\000\000\002\146\r=\000\000\000\000\000\000\000\000\r=\0061\0061\000\000\000\000\0061\0061\000\000\000\000\001\210\001\250\001\230\000\000\000\000\000\000\000\000\r=\011\022\000\000\001\242\r=\000\000\0061\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r=\r=\002\154\002\162\r=\r=\000\000\002\174\000\000\002\186\004.\004:\004\253\000\000\000\000\000\000\024\230\004\253\030\002\004\245\004\253\r=\000\000\000\000\004\245\000\000\000\000\004\245\000\000\000\000\004\253\000\000\rn\004J\004\253\000\000\004\253\004\245\000\000\000\000\000\000\004\245\005\190\004\245\000\000\000\000\000\000\000\000\004\253\000\000\000\000\000\000\030\014\000\000\004\253\004\245\000\000\000\000\000\000\000\000\000\000\004\245\000\000\004\253\000\000\000\000\004\253\000\000\000\000\024\250\004\245\004\253\000\000\004\245\000\000\000\000\000\000\000\000\004\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\253\000\000\000\000\000\000\004\253\005\021\000\000\004\245\000\000\000\000\005\021\004\245\004\229\005\021\004\253\004\253\000\000\004\229\004\253\004\253\004\229\004\245\004\245\005\021\000\000\004\245\004\245\005\021\000\000\005\021\004\229\000\000\000\000\000\000\004\229\004\253\004\229\000\000\000\000\000\000\000\000\005\021\004\245\000\000\000\000\000\000\020\182\005\021\004\229\000\000\005%\000\000\000\000\023\198\004\229\005%\005\021\000\000\005%\005\021\000\000\000\000\000\000\004\229\005\021\000\000\004\229\000\000\005%\000\000\000\000\004\229\005%\000\000\005%\000\000\000\000\000\000\000\000\000\000\005\021\000\000\000\000\000\000\005\021\000\000\005%\004\229\000\000\000\000\000\000\004\229\005%\000\000\005\021\005\021\000\000\000\000\005\021\005\021\000\000\004\229\004\229\000\000\005%\004\229\004\229\000\000\000\000\005%\002\234\000\000\000\000\000\000\000\000\005\021\001\202\001\206\000\000\000\000\000\000\000\000\004\229\000\000\000\000\005%\024\170\000\000\000\000\000\000\002\158\000\000\000\000\028\"\000\000\001\210\001\250\001\230\000\000\005%\005%\000\000\000\000\005%\005%\001\242\005\005\000\000\000\000\b6\000\000\005\005\002\002\000\000\005\005\000\000\000\000\000\000\001\246\002\162\005%\000\000\000\000\002\174\005\005\002\186\004.\004:\005\005\000\000\005\005\000\000\004F\000\000\000\000\004\237\000\000\000\000\000\000\000\000\004\237\000\000\005\005\004\237\000\000\000\000\000\000\000\000\005\005\004J\000\000\000\000\000\000\004\237\000\000\000\000\000\000\004\237\000\000\004\237\005\005\005\029\000\000\000\000\000\000\005\005\005\029\000\000\000\000\005\029\000\000\004\237\000\000\000\000\000\000\000\000\000\000\004\237\018\158\005\029\000\000\005\005\000\000\005\029\000\000\005\029\000\000\000\000\000\000\004\237\000\000\000\000\001\202\001\206\004\237\005\005\005\005\005\029\000\000\005\005\005\005\000\000\000\000\005\029\000\000\000\000\000\000\000\000\004\014\000\000\004\237\001\210\001\250\001\230\000\000\005\029\005\005\000\000\000\000\000\000\005\029\001\242\000\000\000\000\004\237\004\237\000\000\022\n\004\237\004\237\000\000\000\000\000\000\000\000\001\246\002\162\005\029\000\000\000\000\002\174\000\000\002\186\004.\004:\000\000\004\237\000\000\000\000\004F\000\000\005\029\005\029\000\000\000\000\005\029\005\029\024R\000\000\000\000\000\000\000\000\000\000\0059\000\000\000\000\004J\000\000\000\246\000\000\b\157\002\202\005\029\b\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003r\000\000\024\210\000\000\0059\000\000\003v\000\000\b\157\b\157\000\000\b\157\b\157\000\000\000\000\000\000\000\000\000\000\003\130\000\000\000\000\004~\000\000\004\130\020z\b\177\000\000\000\000\b\177\000\000\000\000\000\000\b\157\028N\000\000\000\000\020\222\000\000\000\000\000\000\000\000\020\246\000\000\000\000\b\177\b\177\000\000\b\177\b\177\000\000\b\157\000\000\000\000\000\000\000\000\000\000\000\000\020\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\177\000\000\000\000\021\018\021N\000\000\000\000\0059\0059\000\000\000\000\000\000\b\157\000\000\b\157\000\000\000\000\000\000\000\238\000\000\000\000\000\000\000\000\000\000\025\142\000\000\006\026\000\000\000\000\b\157\b\157\000\000\b\137\000\000\b\157\b\137\b\157\000\000\000\000\000\000\b\157\b\181\000\000\000\000\b\181\000\000\000\000\000\000\b\177\000\000\b\177\b\137\b\137\000\000\b\137\b\137\000\000\000\000\000\000\000\000\b\181\b\181\b\177\b\181\b\181\006\"\b\177\000\000\b\165\000\000\b\177\b\165\b\177\000\000\000\000\b\137\b\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\181\000\000\000\000\b\165\b\165\000\000\b\165\b\165\000\000\b\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\165\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\137\000\000\b\137\000\000\000\000\000\000\000\238\000\000\000\000\b\181\000\000\b\181\000\000\000\000\b\137\000\000\000\000\006\"\b\137\000\000\014\149\014\149\b\137\b\181\b\137\000\000\006\"\b\181\b\137\000\000\000\000\b\181\000\000\b\181\000\000\000\000\b\165\b\181\b\165\014\149\014\149\014\149\007\186\000\000\000\000\000\000\000\000\000\000\000\000\014\149\006~\000\000\000\000\006\"\b\165\000\000\000\000\000\000\b\165\000\000\b\165\000\000\014\149\014\149\b\165\000\000\000\000\014\149\000\000\014\149\014\149\014\149\000\000\000\000\000\000\000\000\014\149\001\202\001\206\026B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\202\001\206\026\162\000\000\000\000\014\149\000\000\000\000\001\210\001\214\001\230\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\242\001\210\001\214\001\230\000\246\000\000\000\000\002\202\000\000\000\000\000\000\001\242\000\000\001\246\002\162\000\000\000\000 \022\002\174\000\000\002\186\004.\004:\003v\001\246\002\162\000\000\004F\000\000\002\174\000\000\002\186\004.\004:\000\000\003\130\000\000\000\000\004F\000\000\000\000\020z\000\000\000\000\004J\000\000\000\000\000\000\001\202\001\206\028N\000\000\000\000\020\222\000\000\004J\000\000\000\000\020\246\000\000\000\000\000\000\000\000\001\202\001\206\000\000\000\000\001\210\001\250\000\000\000\000\000\000\000\000\000\000\020\254\000\000\000\000\000\000\031\198\000\000\000\000\000\000\001\210\001\250\000\000\000\000\000\000\000\000\021\018\021N\001\246\002\178\005a\000\000\000\000\002\174\000\000\002\186\004.\004:\000\000\000\000\000\000\000\000\004F\001\246\002\178\000\000\000\000\025\142\002\174\000\000\002\186\004.\004:\000\000\000\000\000\000\000\000\004F\000\000\004J\000\000\000\000\005\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004J\000\000\000\000\005\157\029\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\029\174")) and lhs = - (8, "\014\r\012\011\n\t\b\007\006\005\004\003\002\001\000\230\230\229\229\228\227\227\226\226\226\226\226\226\226\226\226\226\225\225\224\223\223\223\223\223\223\223\223\222\222\222\222\222\222\222\222\221\221\221\220\220\219\218\218\218\217\217\216\216\216\216\216\216\215\215\215\215\215\215\215\215\214\214\214\214\214\214\214\214\213\213\213\213\212\211\210\210\210\210\209\209\209\209\208\208\208\207\207\207\207\206\205\205\205\204\204\203\203\202\202\202\201\201\201\201\201\201\201\201\201\200\200\199\199\198\198\197\196\195\194\193\193\192\192\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\190\190\189\188\188\188\188\187\187\187\187\186\186\185\185\185\185\185\185\184\183\182\182\181\181\180\180\179\178\178\177\176\176\175\174\173\173\173\172\172\171\170\170\170\170\170\170\169\169\169\169\169\169\169\169\168\168\167\167\167\167\167\167\166\166\165\165\165\164\164\163\163\163\163\162\162\161\161\160\160\159\159\158\158\157\157\156\156\155\155\154\154\153\153\152\152\152\151\151\151\151\150\150\149\149\148\148\147\147\147\147\147\146\146\146\146\145\145\145\144\144\144\144\144\144\144\143\143\143\143\143\143\143\142\142\141\141\140\140\140\140\140\140\139\139\138\138\137\137\136\136\135\135\135\134\133\133\133\133\132\132\132\131\131\131\131\131\131\131\131\131\131\130\130\129\129\128\128\128\128\128\128\128\128\128\128\128\128\128\127~}||{{{{{zyyxxwwwwwwwwwwwwwwvvuuttsssssssssssssssssssssssssssssssrrqqppoonnmmlllkkjjiihhggffffffffffffffffffedcba`_^]\\[ZZZZZZZZZZYYYXXXWWWWWVVVVVVVVVUUTTTTTSSRRQPOONNNNNMMLLKKKJJJJJJIIIHHGGFFEEDDCCBBBAA@@??>>==<<;;::::::998877777766655544433210000000000000000000/////.......-----------------------------------------------------------------,,++++++++++++++++++++++***************************************************))((''&&&&&&&&&&&&&&&&%%$$#######\"\"\"\"!! \031\031\030\029\028\028\028\027\027\026\026\026\026\026\026\026\026\026\026\025\025\024\024\024\024\023\023\022\021\021\021\021\021\020\019\019\018\018\018\017\017\017\016\016\016\016\016\016\015\015") + (8, "\014\r\012\011\n\t\b\007\006\005\004\003\002\001\000\231\231\230\230\229\228\228\227\227\227\227\227\227\227\227\227\227\226\226\225\224\223\223\223\223\223\223\223\223\222\222\222\222\222\222\222\222\221\221\221\220\220\219\218\218\218\217\217\216\216\216\216\216\216\215\215\215\215\215\215\215\215\214\214\214\214\214\214\214\214\213\213\213\213\212\211\210\210\210\210\209\209\209\209\208\208\208\207\207\207\207\206\205\205\205\204\204\203\203\202\202\202\201\201\201\201\201\201\201\201\201\200\200\199\199\198\198\197\196\195\194\193\193\192\192\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\191\190\190\189\188\188\188\188\187\187\187\187\186\186\185\185\185\185\185\185\184\183\182\182\181\181\180\180\179\178\178\177\176\176\175\174\173\173\173\172\172\171\170\170\170\170\170\170\169\169\169\169\169\169\169\169\168\168\167\167\167\167\167\167\166\166\165\165\165\164\164\163\163\163\163\162\162\161\161\160\160\159\159\158\158\157\157\156\156\155\155\154\154\153\153\152\152\152\151\151\151\151\150\150\149\149\148\148\147\147\147\147\147\146\146\146\146\145\145\145\144\144\144\144\144\144\144\143\143\143\143\143\143\143\142\142\141\141\140\140\140\140\140\140\139\139\138\138\137\137\136\136\135\135\135\134\133\133\133\133\132\132\132\131\131\131\131\131\131\131\131\131\131\130\130\129\129\128\128\128\128\128\128\128\128\128\128\128\128\128\127~}||{{{{{zyyxxwwwwwwwwwwwwwwvvuuttsssssssssssssssssssssssssssssssrrqqppoonnmmlllkkjjiihhggffffffffffffffffffedcba`_^]\\[ZZZZZZZZZZYYYXXXWWWWWVVVVVVVVVUUTTTTTSSRRQPOONNNNNMMLLKKKJJJJJJIIIHHGGFFEEDDCCBBBAA@@??>>==<<;;::::::998877777766655544433210000000000000000000/////.......-----------------------------------------------------------------,,++++++++++++++++++++++***************************************************))((''&&&&&&&&&&&&&&&&%%$$#######\"\"\"\"!! \031\031\030\029\028\028\028\027\027\026\026\026\026\026\026\026\026\026\026\025\025\024\024\024\024\023\023\022\021\021\021\021\021\020\019\019\018\018\018\017\017\017\016\016\016\016\016\016\015\015") and goto = - ((16, "\000)\0015\000=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\031\000L\0008\000\247\001\011\002H\0003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000;\000\000\000\000\000\000\000\000\000\000\0001\000\000\000\000\000\000\000~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\166\000\000\000\000\000\000\000\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\194\000\210\000\000\001$\0005\001l\000\000\000\000\000\000\000\014-\014\001H\001^\000\218\000\000\000\000\000\000\b\190\000\000\000\000\0014\000\000\000\000\000\000\000\000\002\174\000\000\002\n\000\000\000\000\000\000\000\000\000\000\0006\000\000\000\152\003\162\007\226\000\000\000\000\t\206\018\194\000\000\000\000\020\230\000\000\b\218\000\000\022`\000\136\001D\000\000\000\000\002\150\001t\b\224\t\144\002\142\003\162\003\170\001V\000\166\001\164\002\228\001\188\012:\000\000'\192\003p\001\224\003\148I\242\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\226\000\000\003\204\002\130\004\146\000\000\000\000\000\000\000\000\002\136\000\000\000\000\002\150\000\195\002\230\005\222\007@\000\000\000\000\000\000\004.\004X\003R\001^\000\000\000\000\003\006\003\1408\152\004p\003\236\000\151\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000\000\004\172\003\242\r\012\004|'\192\031\218\000\0009V\015\b9\1609\170\000\000\001*\000\000\000\000\000\000\000\000\005~J8\006\000\000\000\n\020\006&\000\000\nN\r&\000\172\000\000\001\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\136\005\184\000\000\000\000\000\000(\220\000\000\t \000\000\000\000\005\150JL\025.\000\000X\228\000\000\000\000\000\000\000\000\000\000\000\000\002\186!T\002\186\002R\000\000\000\000\000\000\004\186\000\000\000\000\000\000\000\000\005\248\000\000\000\000\002\186\000\000\000\000\000\000\000\000\000\000\rx\000\000\004\148\006\160\000\000J\142\004\164 D\000\000\000\000\000\000\000\000\004\186\000\000\000\000\000\000\011<\000\000\000\000\000\000\000\000\000\000\000\000\000\246\006\168\000\000\000\000\000\000\004\186\006\218KB\006@\005v;>\000\000\005\188\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003N\000\000\000\000\000\000\000\000\007|K\208\000\000\000\000\006j\005\166K\220\000\000\000\000\000\000L\014\006HL\024\000\000\006H\000\000LL\006H\000\000L\2148\226\007p\007\130\000\000\000\000Br\000\000\000\000\000\000\000\000\000\000\000\000\006H\000\000\000\000L\224\000\000\006HM\016\000\000\004\186\000\000\000\000M\172\000\000\006H\003d\000\000\000\000\006H\006H\000\000\000\000\006H\000\000\000\0009\170\000\000\000\000\000\000\000\000\006H:\020\000\000\000\000\006H\000\000\0014\b\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\002\000\000\007\202\000\000M\208\004\186\000\000\000\000\000\000\000\000\007\208\bl\014\012\007\248\b\012\b(\005\180\003\238\006@\002\194\b\208\000\000\000\000\002\232\005\168\000\000\006d\006\188\003\160\b\230\n\184\000\000\000&\002:\t\248\000U\n\\\000\000\000\000W\028\000\000W\164\n>\000\000M\228\004\186M\246\004\186\000\000\001r\000\239\000\000\012\014\000&\000\000\000\000\tp\000\000\000\000\000\000\000\000\000\000\r\022\000&\015J\000&\000\000\003\238\000\000\000\000\004\180\000\000\000\000\000\000\n\204\000\000\000\000\000\000\000&\000&\000\000\000\000\000&\000\000\b\230\004\140\000\000\000\133\003\006\000\000\000\133\000\000\000\000\016\016\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\133\014\146 \152\n\166\n@:LN\200\000\000\t\144\006\210\014\244\t\164\006\228I\234Y\026\000\000\000\000\000\000\000\000\000\000\005P\011\146\000\000\000\000\000\000\t\170\007R\006\b\000\133\017\236\000\000\000&\000\000\000\000\000\000\015\b\000\000N\226\004\186\014\252\t\184\007t\015\200\t\188\007\132 \232:\128\006H\015\252\t\190\007\138:\188\n\166\000\000;\"\006HO\028\004\186\n\128\000\000\000\000\000\000\000\0008\226\n\144\000\000\000\000Z\016\000\000\000\000\012\252\000\000\000\000\n\180)P\002\186\000\000\016\158\n<\007\154!,\000\000;\146\nX\007\200!\148\000\000;2\000\000\000\000\nZ\007\228On\006H\016\206\nn\b\002Y\216\000\000ZP\000\000\000\000!\136\n\156\b.!\208\000\000\"|;\252\n\186\bD\"\244\000\000OD\000\000\004\186\026\168\000\000\004\186OV\004\186\000\000\000\000\000\000\000\000\000\000Z\128\000\000\000\000\000\000\004b\016\214\000\000\000\000\000\000\000\000\136\011`\t0%0\000\000\n\232>\198\011n\tP%\150\000\000\n\232>\210\011t\tV%\202\000\000\n\232?\016\011\164\t\128&0\000\000\n\232?r\012\022\t\182&T\000\000\n\232?\206\012\030\t\186&\146\000\000\n\232@L\012V\t\198&\156\000\000\n\232@\152\012h\t\212'T\000\000\n\232A\026\012j\t\220'\244\000\000\n\232Af\012|\n\016(\020\000\000\n\232A\228\012~\n\022((\000\000\n\232A\238\012\148\n4(`\000\000\n\232B0\012\164\n:(\250\000\000\n\232Bf\012\218\nH)\178\000\000\n\232B\228\012\226\nP)\204\000\000\n\232C\026\r\002\nV)\254\000\000\n\232Cj\r\b\nf*t\000\000\n\232C\236\r8\nx+\b\000\000\n\232\n|\006H\018\b\018\198\000\000\026\168\r\220\000\000PF\004\186\019N\000\000\000\000\rj\000\000P\128\004\186\019\144\000\000\000\000\020D\000\000\000\000\001\208\000\000\000\000\020N\000\000\000\000\000\000\000\000P\186\004\186\020\184\000\000\r\020\021\024\000\000P\210\000\000\006HQ\206\000\000\006HR\004\000\000\006H\005\228\000\000\000\000\000\000\000\000\000\000R6\006H\000\000\0054\005\148\000\000\000\000\000\000\n\232\021:\000\000\000\000\000\000\022\014\000\000\000\000\000\000\000\000\000\000*\188\000\000\000\000\000\000\n\232+d\000\000+\176\000\000\000\000\000\000,\134\000\000\000\000\000\000\000\000Z\248\000\000\000\000,\232\000\000\000\000\000\000D`\rH\n~-\n\000\000\n\232-R\000\000\000\000\000\000D\170\rR\n\144-\242\000\000\n\232.P\000\000\000\000\000\000D\232\rt\n\148.\020\000\000\n\232\004\204\022\194\000\000\000\000E2\r\140\n\178.\140\000\000\n\232\022\204\000\000\000\000E\166\r\186\n\182.\244\000\000\n\232\023\014\000\000\000\000E\240\r\222\n\200/\142\000\000\n\232\000\000\000\000/\150\000\000\000\000F(\r\234\n\234/\200\000\000\n\2320\024\000\000\000\000Fr\r\242\n\2360\156\000\000\n\2321\020\000\000\000\000F\220\014\012\n\2441D\000\000\n\232\000\000F\230\014\024\n\2461|\000\000\n\232\000\000&n\000\000\000\000\n\232\000\000\000\000\000\0001\234\000\000\000\0002L\000\000\000\000\014,\000\000\000\000\023\150\000\000\023\216\000\000\000\000\000\000\n\232\000\000\000\000\024\140\000\000\024\150\000\000\000\000\000\000\000\000\000\000G0\0140\n\2502~\000\000G\178\0148\n\2522\244\000\000\n\232\n\232G\212\014@\n\2543~\000\000\n\232\000\000\r\020\025\000\000\000\000\000\025`\000\000?\218\000\000\000\000Y\026\000\000\000\000\000\0003\202\000\000\000\000\000\000\000\0004\026\000\000\000\000\000\000\000\000\015h\000\000\000\000\000\000R>\000\000\001\244\000\000\006\000\015\004\000\000\003r\000\000\000\000\000\000\000\000\000\000\000\000\005P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014R\011\n4N\000\000\n\232\000\000\015v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\022\006:\000\133\025\130\000\000\014\\\011\"\014\246\000\245\007`\000\133\018\244\000\000\000&\b\138\000\133\000\000\026V\000\000\001\158\000\000\014p\011$\005v\000\000\000\000\000\000\000\000\000\000\014\166\025\198\000\183\000\000\000\000\000\000H\028\000\000W\200\000\000\011,\000\000\0114\000\000\000\000\000\000\000\000\005.\000\000\000\000\000\0002:\002\186\000\000\002\186\007\186\000\000\030\014\000\000<|\002\186\002\186\000\000G~\002\186\002\186\011R\000\000\027\n\000\000\000\000\011b\015\130\000\0004\136\007\016\000\000\000\000\000\000\000\000\000\000\000\000\014\146\011\1285\028\000\000\n\232\000\000\000\000\000\000\000\000\000\000\014\164\011\136\b\204\000\133\000\000\019\026\000\000\000&\000\000\015\254\000\000\000\000\000\000\000\000\000\0005X\000\000\014\180\011\1425\236\000\000\000\000\000\000\023h\000\000\000&\000\000\026\158\000\000\000&\000\000\026\216\000&\000\000\n\232\000\000\000\000\027\176\000\000\000&\000\000\029\012\000\000\000&\000\000\030b\000&\000\000\000\133\000\000\011\156\b\222\000o\000\000\014\194\014\206\011\160\015\000\015\148\030\164\000&\b\208\000\000\011\164\015j\015t\005<\b\236\015H\011\176\015\130\005D\b\242\015N\000\000\000\000\005f\t@\000\000\0060\002\176Rn\006H\027\020\000\000\006X\003\016\014\254\011\184\b\236\001\192\000\000\015\000\011\194\007\248\000\000*\214\000\000R\146\004\186\000\000\015\160\015\172\000\000\t\132\000\000\004\186\015\020\011\204\007\192\0152\003\146\000\000\000\000\000\000\000\000\011\220\t\220\000\000\011\222\t\242\000\000\007\154+$\015\026\015 \011\232\007\172\nZ\000\000\0122\b\238\011N\000\000\015\"\015&\012B\015N\015\148\031 \000&\000\000\012D\015\180\000\000\t(\000\000\011P\000\000\015\182\000\000\031\162\002\216\015\132\012h\015\190\000\000!R\003\144\015\138\000\000\000\000\002\234\003\142\000\000\011j\000\000\"\004\000&\012V\000\000\0040\000\000\000\000\0158\012j$<\004\020\000\000\015B\012n\b:\0152\015D\015N\012v\016\184\000\000\015^\001\164\000\000\000\000\000\000\000\000\004$\012~\0150R\226\004\186\000\000\000\203\012\132\015\238\000\000\000\000\000\000\000\000\000\000\000\000S(\004\186\000\000\012\140\016J\000\000\000\000\000\000\000\000\000\000\000\0006\028\012\\\000\000\012\146\004D\000\000\012\148\012\154\004\228\000\000\0064@\186\000\000\003\196\000\000Sx\004\186\004\186\000\000\000\000\006\212\000\000\0068\000\000\006\244\006\212\006\212\000\000\012\162H \004\186S\218\004\186\012\174\000\000\000\000\000\000\000\000\012\202\000\000\000\000\002\006\000\000\006\238\015\172\012\170\016\198\015l\000\000\000\000\n\232\007\028\015\180\000\000\000\000\012\174\016\206\015t\000\000\000\0003\254\000\000\029v\000\000T\014\011\254\004\186\000\000ThP\\\000\000T\142\000\000\000\000\000\000\006\212\000\000\000\000\r,\015\192\012\182\016\240\015\152\000\000\000\000T\228\rJ\015\220\000\000\000\000\000\000=\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rr\000\000\015\236\012\194\np\000\000\016\230\016\156\r\132\015\248\000\000\000\000\015\254\012\232\n\142\000\000\000\000\b\028\r&\005\200\000\000\000\000\000\000\br\015\196\r\016\000\000\015\200\br\000\000\016\170\r\168\016\n\000\000\000\000\000\000\004\186\002D\003j\005\212\000\000\000\000\000\000\000\000\015\210\r$\000\000\006\184\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\186\015\190\r(\017(\015\206\000\000\004\144\000\221\rV\015\158\0056\001\254\rn\016^\000\000\017\024\027V\000\000\000\000\027\222\000\000\014\018\000\000\002\160\000\000\000\000\000\000\000\000\000\000\000\000U\n\004\186\000\000\017\026\028 \000\000\000\000\028\212\000\000\000\248\r\140\016\190\000\000\000\0006v6\206\016l\000\000U\152\004\186\028\222\000\000\000\000\029H\000\000\000\000\014*\000\000\000\176\000\000\000\000\000\000\000\000\000\000\000\0007&\000\000\000\0007\2067\136\016n\000\000U\238\004\186\029\168\000\000\000\000\029\202\000\000\000\000\r\146\030\158\014<\000\000\r\170\r\186\000\191\000\161\r\188\b\174\r\190\016\2005\164\014D\000\000\r\194\r\208\006|\000\000\000\133H\234\000\000\005J\000\000\r\220X(Xv\000v\015\156\000\232\000\000X\232&n\000\000\006\222\000\000\000\000\006\222\000\000\000\000\006\222\007^\000\000\002\026\006\222\016\2067\218\014Z\000\000\006\222\000\000\000\000V\026\000\000\000\000\000\000\006\222\000\000\000\000\014n\000\000\002z\t\252\014\142\000\000\r\250I&\014\146\000\000\000\000\000\000\000\000\014\152\000\000\000\000\007\004\000\000\006\222Vn\000\000\003X\006\222X\150\000\000\014\168\016,\014\b\017J\015\240\000\000X\170\014\178\0164\000\000\000\000\000\000\001\192\007\248\000\000\000\000\000\000\000\000\000\000\000\000\n\202\014\208\000\000\016F\000\000\000\000\000\000\000\000\014\242\003,\000\000\000\000\000\000\000\000\n\202\000\000\000\000\014\244\023D\000\000\000\000\000\000\000\000\000\000\000\133\000&\000\000\000\000\006H\000\000V\154\004\186\000\000\007\174\000\000\000\000\000\000\000\0008\"\000\000\000\000\000\000\000\000\000\000\000\000\016\224\005\018\tT\015\196\006\220\014V\000\000\005\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\210\007\206\014z\000\000\t\000\017B\016\242\015\006\000\000\000\000\016\230\0060\007\006\000\000\000\000\000\000\014\148\000\000\014\154\017\146\000\000\000\000\002\186/J\000\000\000\000\000\000\000\000\000\000Y<\000\000\000\000\t~\003\220\000\000\000\000V\190\004\186\004\186V\214\004\186\006\236\000\000\000\000\000\000\004\186\000\000\000\000\b\178\016\246\015 \000\000\000\000\016\236\000A\002\152\000\000\000\000\000\000\000\000\t\196\017B\t\148\016\252\0154\000\000\000\000\016\240\001,\005\202\000\000\000\000\000\000\000\000\000&\000\000\015D\000\000\000\000\000\000\031R\000\000\031\\\000\000\000\000\000\000\000\000\000\000\000\000#n\000\000\000\000\000\000\004\156\0003\000\000\000\000\000\000\000\000\000\000\000\246\0003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\180\000\000\000\000\000\000IN\000\000\004\186\000\000\0122\000\000\000\000\000\000\000\017\000\000\000\000\000\000\0034\000\000\000\000\000\000\000\142\000\000\000\133\000\000\001\006\000\000\000&\000\000\000\002\000\000\000\000\000\000I*\006H\000\000\000\000\000\029\000\000\000\000\000\000\000\000\005P\004\028\016(\003\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014(\000\000\015J\000\000\000\000\000\000\000\000\004\240\006\184\000\r\005&\000\000\000\000\015L\021\194\000\000\000\000\000\000\015P\026\n\000\000\000\000\000\000\000\000"), (16, "\007\018\001\023\002=\002>\001s\002\031\001\252\001\027\007\235\002>\001s\004\158\0007\007\167\007\018\003\149\002\000\002\154\007\019\007\173\002\004\007\021\001\027\000@\000\238\002\159\003\149\000\242\000\243\b\006\007\022\007#\b\007\004\175\0073\007\021\002*\002,\002\185\000\238\000\242\007\142\000\242\000\243\007\022\000;\0007\002*\007\018\005\232\002=\002>\001s\000\151\000\238\006\207\000\160\000\242\000\243\000\238\007\023\002\005\000\242\000\243\004\161\002\154\007\019\007\"\000\238\007\021\006\207\000\242\000\243\002\159\007\023\005\235\000?\007\237\007\022\007#\0007\000\245\004\186\004\188\004\190\006\207\002\185\005\026\006\209\007\211\000m\000\245\000\238\005\237\007\227\000\242\001\006\007\024\005\030\006\207\003\149\002-\002\191\006\209\006\210\006\162\007\139\007\025\007\023\006\212\0007\007\024\007\165\007\000\002A\005\238\002\193\000\242\006\209\006\210\007\238\007\025\002\193\000\242\006\212\0007\007\228\007\212\006\235\001\237\000\131\007(\006\209\001\027\006\210\000\151\002\000\007\147\001\249\006\212\002\004\b\t\001\027\006\228\000\244\007\024\007)\007\191\006\210\000\\\002\191\007\145\007\146\006\212\000`\007\025\007\028\006\219\002+\007\175\007\027\007\030\002A\000\136\002\193\000\242\007\219\006\166\002\200\002+\007\028\002\201\005v\002\031\007 \007\030\006T\004\211\002\194\007(\000\151\002\005\007\018\000\156\002=\002>\001s\002\215\007 \001\153\002\196\001b\007!\000\238\007)\000:\000\242\000\243\000\245\002\154\007\019\007\"\007\220\007\021\007\028\002,\007!\002\159\000\242\007\030\002\217\001\020\007\022\007#\0007\000\157\002\200\001\027\001/\002\201\002\185\001\020\007 \007\156\006\207\007\223\002\194\001\027\001\030\0009\007\018\000\245\002=\002>\001s\002\215\000\151\001\153\002\196\000\156\007!\000d\007\023\001\255\007\018\001e\007e\002\154\007\019\007\"\000\238\007\021\003\149\000\242\000\243\002\159\001\232\006\209\002\217\007\224\007\022\007#\007\019\000=\003t\007\021\002\000\006\155\002\185\002-\002\004\005\167\001\027\006\210\007\022\000y\006x\002\031\006\212\007\024\006\157\006\207\006\216\000\238\002\191\000\128\000\242\001\006\000\238\007\025\007\023\000\242\001\006\000\176\007D\001\007\002A\001\031\002\193\000\242\001\196\002\017\004h\007\192\007\023\003\149\005\025\001\232\000\188\002,\007\161\002\005\000\242\007(\006\209\000q\001s\002\000\007\199\002\011\001\n\002\004\000\242\001\027\007F\001\n\002*\007\024\007)\002\006\006\210\000\139\002\191\007\145\007\146\006\212\003u\007\025\007\028\006\213\004\162\007\024\000\181\007\030\002A\000\130\002\193\000\242\000\245\002\018\002\200\007\025\005Z\002\201\006\127\000\242\007 \007G\006T\004\211\002\194\007(\002\005\000\138\007\018\006C\002=\002>\001s\002\215\000\155\001\153\002\196\002-\007!\007\026\007)\005D\000\191\001:\002\006\002\154\007\019\007\"\000\238\007\021\007\028\000\242\001\006\002\159\007\027\007\030\002\217\004\161\007\022\007#\000\196\002\225\002\200\000\245\007\028\002\201\002\185\000\238\007 \007\030\000\242\000\243\002\194\005\239\000\245\006z\007\018\003\149\002=\002>\001s\002\215\007 \001\153\002\196\004i\007!\002\029\007\023\007\200\007\018\001\153\007*\002\154\007\019\007\"\001\020\007\021\006\207\005\235\007!\002\159\001\027\001\030\002\217\000\154\007\022\007#\007\019\003\149\000\245\007\021\002+\001\232\002\185\000\238\0074\005\237\000\242\000\243\007\022\001\173\001s\002\000\006\131\007\024\001\020\002\004\000\245\001\027\002\191\006\209\001\027\001/\001y\007\025\007\023\006J\006K\005\238\007&\000\209\002A\000\245\002\193\000\242\006\207\006\210\001\020\007\143\007\023\000\218\006\212\002\031\001\027\001/\006\223\004m\006[\007(\000\185\001\232\006T\004\211\002\027\007\247\002>\001s\002\005\005\146\007\215\002\000\0019\007\024\007)\002\004\006C\001\027\002\191\006\209\007\144\005\130\002#\007\025\007\028\002,\002\006\007\024\000\242\007\030\002A\000\220\002\193\000\242\000\180\006\210\002\200\007\025\001\230\002\201\006\212\003\149\007 \002\022\006\241\000\186\002\194\007(\007\216\000\245\007\018\000\242\002=\002>\001s\002\215\002\005\001\153\002\196\000\245\007!\007%\007)\005\148\007\250\007\251\000\238\002\154\007\253\000\242\000\243\007\021\007\028\000\190\002\006\002\159\007\027\007\030\002\217\000\238\007\022\007\255\000\242\001\006\002\200\000\228\007\028\002\201\002\185\002-\007 \007\030\001\255\005\142\002\194\005Z\000\242\006\207\000\242\000\245\002=\002>\001s\002\215\007 \001\153\002\196\003\149\007!\002\031\007\023\001r\001s\005\136\000\233\002\154\004i\007\248\007\184\002\193\000\242\001\020\007!\002\159\006J\006K\002\217\001\027\001\030\004\242\006\209\001t\002s\001\020\001v\001w\002\185\001z\002.\001\027\001\030\002,\002\r\000\195\000\242\006S\006\210\007\024\001\027\006T\004\211\006\212\002\191\000\245\002\022\007\004\007\018\007\025\002=\002>\001s\b\014\000\236\000\246\002A\000\251\002\193\000\242\005]\001\020\001\153\b\006\005\150\002\154\b\007\001\027\001\030\007\021\b\002\005\155\007<\002\159\000\245\007\018\001\255\001\020\007\022\b\015\002\031\000\208\003\149\001\027\001\030\000m\002\185\007\185\007)\005\211\b\006\003\162\002\191\b\007\000\242\001\006\007\021\002-\007\028\004u\001s\007y\001{\007\030\002A\007\022\002\193\000\242\007\023\002 \002\200\000\212\002,\002\201\001|\000\242\007 \000\242\005\148\007O\002\194\007\186\000\245\000\245\005\215\000\245\007\193\001\027\003\179\002\215\005\027\001\153\002\196\002\016\007!\007\023\002\197\005\216\001U\001\027\005\215\005\240\001\255\003\149\003\241\007\024\001S\000\242\001\006\007\005\002\191\000\227\002\217\005\216\005\188\007\025\005\206\005\223\002\200\000\242\001n\002\201\002A\000\235\002\193\000\242\007\194\007\018\002\194\002=\002>\001s\007\024\003\141\001s\b\019\002-\002\215\001\143\001\153\002\196\004\014\007\025\004\175\002\154\007\019\0070\001\152\007\021\001\153\001z\003\149\002\159\000\250\007)\007\195\003t\007\022\007#\005,\002\217\007\007\b\b\0051\007\028\002\185\000\245\000\238\001g\007\030\000\242\000\243\006\248\007\196\000\245\003\151\002\200\003\149\003\149\002\201\0056\007\027\007 \003^\001s\001>\002\194\007\023\007S\007T\0007\007\028\004\189\004\188\004\190\002\215\007\030\001\153\002\196\006\251\007!\007U\007V\003z\001\132\001\232\001v\001w\002\024\007 \0007\001k\004\161\007W\004\211\002\000\004\161\006\253\002\217\002\004\004\175\001\027\007c\003\150\007\024\001\020\004\175\007!\004j\002\191\002\031\001\027\001/\004\161\007\025\001\131\007\018\001\014\002=\002>\001s\002A\001\218\002\193\000\242\006\254\003\127\003\143\003\144\007P\007\157\b\006\006\202\002\154\b\007\002\031\001\017\007\021\007(\002J\002\005\002\159\002,\004\171\004\211\000\242\007\022\b\n\001\"\006<\004\188\004\190\001C\007)\002\185\006P\004\188\004\190\002\006\000\245\007Q\007\144\001\141\007\028\004\144\001\020\005\220\002,\007\030\000\242\000\242\001\027\001\030\007R\001|\002\200\007\023\000\242\002\201\001\232\001B\007 \002\023\000\245\007\018\002\194\002=\002>\001s\002\000\000\245\003\149\001\220\002\004\002\215\001\027\001\153\002\196\001O\007!\006\197\002\154\007\019\000\242\003\149\007\021\002-\003\147\003\148\002\159\001d\007S\007T\007\024\007\022\007,\003\149\002\217\002\191\001\191\004\175\003\149\002\185\007\025\007U\007V\006\238\003\149\005\215\006\031\002A\002-\002\193\000\242\002\005\001j\007W\004\211\001\143\001#\001\189\005\216\001$\b\r\007\023\005\217\004\175\001\144\005Z\001\153\001z\000\242\002\006\0059\001\229\001#\001\130\006 \006a\006!\000\245\001\020\007)\005\224\001\140\0028\001&\001\027\001\030\006X\004\188\004\190\007\028\005?\002;\001#\005\241\007\030\001$\005H\001s\007\024\002\031\006\255\002\200\004\191\002\191\002\201\007d\006\"\007 \007\025\004\197\004\217\002\194\007\129\004\188\004\190\002A\005\249\002\193\000\242\001&\002\215\001#\001\153\002\196\001$\007!\001\149\006\251\004\152\001,\006\221\002,\007/\000\242\000\242\001\148\007Q\006C\007M\000\245\001\153\005\215\006#\002\217\001(\006\253\002I\007)\001&\007R\000\245\005\218\006$\006%\005\216\006&\006\214\007\028\005\222\000\245\001(\001)\007\030\002X\005\218\001,\006C\001\027\001/\002\200\005i\002[\002\201\006\254\002a\007 \001\027\001)\006b\002\194\001(\007\134\002~\001\027\001/\007=\005Z\005\218\002\215\000\242\001\153\002\196\001\195\007!\001,\002-\001#\001)\000\151\001$\000\161\001\249\006(\001\027\001/\002\131\0007\006*\0064\001(\006F\002\217\006\251\001;\000\245\000\151\001#\007[\001\249\002\138\006^\0011\001\207\001&\0012\001\212\001)\0013\0014\006c\006\253\000\245\001\027\001/\002\143\007`\004\219\0011\006_\000\245\0012\006C\000\245\0013\0014\006J\006K\004\203\002\031\001;\000\245\001#\0015\005W\004\211\001?\002\151\0011\006\254\007Y\0012\001\153\003\149\0013\0014\006L\006\\\002\157\004\206\001,\006T\004\211\004\212\000\245\006J\006K\003\149\004\157\001;\003\149\002,\002\031\004\142\000\242\001(\007\136\0011\000\245\0015\0012\002\031\001?\0013\0014\006L\006\\\001\217\002\031\007z\006T\004\211\001)\000\245\000\151\001(\000\183\001\249\001\027\001/\001#\004\236\001\223\001$\002,\005\159\004\211\000\242\0015\003\149\005\029\001?\001)\002,\002\189\000\245\000\242\005C\001\027\001/\002,\007q\005m\000\242\007\153\005'\000\245\001&\001\027\001#\001(\001\020\001$\006@\004\211\002-\002\205\001\027\001/\005-\006J\006K\0052\003\149\001;\006C\000\151\001)\001\236\001\249\002\211\005|\0011\001\027\001/\0012\001&\001\027\0013\0014\006L\006\\\002\220\002\231\001#\006T\004\211\001$\002-\002\021\001F\002\237\0011\001,\006C\0012\002\243\002-\0013\0014\006\189\0057\000\245\0015\002-\001\242\001?\003\149\001(\007\150\001G\001&\002\249\001#\001\020\002\255\001$\001_\003\149\001F\001\027\001/\001,\007m\000\245\001)\000\151\0011\006-\001\249\0012\001\027\001/\0013\0014\005R\003\005\001(\000\245\001G\001&\000\151\001#\0067\001\249\001$\001]\001\244\001F\001\020\000\245\000\245\002\003\006\242\001)\001\027\001/\001,\001D\000\245\001\027\001/\002\020\003\011\000\245\003\017\007K\004\211\001G\001&\003\149\003\023\001(\006J\006K\001H\001L\001;\003\029\005_\000\245\004\135\003#\000\245\004\131\0011\001,\0027\0012\001)\005b\0013\0014\006L\006\\\001\027\001/\002:\006T\004\211\002H\001(\006J\006K\000\245\001L\001;\002W\003)\002Z\002`\003/\002l\002i\0011\001,\0015\0012\001)\001?\0013\0014\007\132\007\133\001\027\001/\0035\006T\004\211\003;\001(\000\245\001#\000\245\001L\001$\003A\002o\001F\000\245\003G\001;\005j\003M\002z\0015\000\245\001)\001?\0011\000\245\003S\0012\001\027\001/\0013\0014\001V\001G\001&\003Y\001\232\003]\003\190\001\233\001[\006\214\002=\002>\001s\001;\002\000\003\200\002}\003\210\002\004\000\245\001\027\0011\000\245\0015\0012\002\154\001?\0013\0014\001V\002\130\002\137\003\220\002\159\003\229\003\149\003\149\000\245\001\020\004T\000\245\002\142\001;\003\238\001\027\001\030\002\185\000\245\001,\003\149\0011\000\245\0015\0012\000\245\001?\0013\0014\001V\002\005\003\249\004\002\000\245\001(\002\150\004\011\004\018\001L\004:\004?\004F\000\245\001#\000\245\000\245\001$\004\128\002\006\001W\002\156\001)\0015\004\143\000\245\001?\000\245\001\027\001/\004\149\004\165\002=\002>\001s\004\182\002=\002>\001s\004\184\001Y\001&\000\245\005\215\000\245\000m\005\209\002\154\002\171\005n\005}\002\154\002\191\000\245\004\208\002\159\005\216\002\188\003\152\002\159\005\248\007\207\004\213\005\143\002A\007@\002\193\000\242\002\185\002\214\000\245\000\245\002\185\002\204\001;\000\245\000\245\004\225\000\245\000\245\000\245\004\235\0011\002\210\004\252\0012\000\245\001,\0013\0014\001V\005\028\000\245\005\"\002\219\005)\002\197\002\230\000\245\000\245\002\236\005/\001(\000\245\002\242\005B\001L\000\245\007\209\003\149\005G\002\248\003\149\0015\002\254\005V\001?\001\232\002\200\001)\001\254\002\201\000\245\005^\005a\001\027\001/\002\000\002\194\005h\000\245\002\004\002\191\001\027\001r\001s\002\191\002\215\003\004\001\153\002\196\002=\002>\001s\002A\000\245\002\193\000\242\002A\000\245\002\193\000\242\000\245\003\149\001t\002s\002\154\001v\001w\000\245\002\217\000\245\001#\000\245\002\159\001$\005l\003\149\001W\000\245\004\247\001;\002\005\000\245\005r\005x\002\197\002\185\000\245\0011\002\197\005\147\0012\000\245\005\199\0013\0014\006\007\001Y\001&\002\006\000\245\000\245\005\132\005\153\003\n\005\158\000\245\002\200\003\016\005\163\002\201\002\200\001#\005\173\002\201\001$\005\179\002\194\001F\0015\005\190\002\194\001?\005\201\005\219\003\149\002\215\005\205\001\153\002\196\002\215\005\226\001\153\002\196\005\231\005\243\003\022\005\253\001K\001&\003\149\006\022\001{\000\245\001,\003\028\003\"\006,\005\236\002\217\002\191\000\245\000\245\002\217\001|\003(\003.\000\242\001\232\001(\003\149\002\b\002A\001L\002\193\000\242\0066\0034\002\000\003\149\000\245\000\245\002\004\000\245\001\027\003:\001)\000\245\002=\002>\001s\000\245\001\027\001/\000\245\001,\006B\003\149\000\245\002u\007\018\000\245\000\245\002\154\002\197\000\245\006V\006\020\006f\000\245\001(\002\159\003@\000\245\001L\000\245\003F\004\218\007\253\000\245\002v\007\021\006\028\002\005\002\185\000\245\002\200\001)\001\143\002\201\007\022\006l\003L\001\027\001/\003R\002\194\001\152\001;\001\153\001z\002\006\006)\006p\000\245\002\215\0011\001\153\002\196\0012\003\149\0061\0013\0014\001V\002=\002>\001s\006\140\003X\007\023\006\180\003\149\003c\000\245\003j\003\142\003\189\002\217\006H\002\154\003\149\003\199\006\240\000\245\003\149\000\245\0015\002\159\001;\001?\006\185\006\224\006\190\004\141\006\220\003\149\0011\002\191\003\209\0012\002\185\006\196\0013\0014\001V\003\149\007\024\006\204\000\245\002A\003\219\002\193\000\242\002=\002>\001s\007\025\002=\002>\001s\000\245\003\149\006\245\003\149\001\201\001s\003\149\0015\002\154\007\n\001?\006y\002\154\003\228\003\149\000\245\002\159\007\254\000\245\003\149\002\159\002\197\004x\006\156\001t\002R\004I\001v\001w\002\185\000\245\003\237\006\182\002\185\003\149\007\027\006\193\003\248\000\245\000\245\000\245\004\001\000\245\002\200\002\191\007\028\002\201\006\227\007N\000\245\007\030\003\149\003\149\002\194\004\n\000\245\002A\006\239\002\193\000\242\004\017\003\149\002\215\007 \001\153\002\196\007Z\004J\003\143\003\144\000\245\004&\0049\006\243\003\149\006\247\004>\000\245\006\252\007h\004E\007!\007j\004b\003\149\002\217\007\b\004k\002\197\004\127\004\133\007\015\003\149\002\191\004\148\003\149\003\149\002\191\003\149\002=\002>\001s\004\150\001\141\004\164\002A\007\029\002\193\000\242\002A\002\200\002\193\000\242\002\201\002\154\001|\000\245\004\207\000\242\004\215\002\194\004\224\002\159\007$\007-\002=\002>\001s\0046\002\215\004\234\001\153\002\196\007_\000\245\002\185\004\245\002\197\004\251\001\232\002\154\002\197\002\n\004M\004R\005(\007\138\000\245\002\159\002\000\000\245\005!\002\217\002\004\004.\001\027\007\152\005#\005&\002\200\0055\002\185\002\201\002\200\007\164\005+\002\201\b\000\b\011\002\194\b\016\0054\0050\002\194\0053\005A\005F\005Q\002\215\001\143\001\153\002\196\002\215\005P\001\153\002\196\005U\005`\001\144\005k\001\153\001z\005g\005w\002\005\005q\005s\005\139\005\127\002\191\005\138\002\217\005\133\005\137\005\152\002\217\002=\002>\001s\005\157\005\252\002A\002\006\002\193\000\242\005\162\005\165\005\169\005\177\005\184\005\195\002\154\005\251\005\244\005\245\002\191\005\250\005\254\005\255\002\159\002=\002>\001s\006\030\002=\002>\001s\002A\001\232\002\193\000\242\002'\002\185\002\197\006\023\002\154\006\024\006\029\002\000\002\154\0063\006/\002\004\002\159\001\027\0060\0062\002\159\006]\004#\006A\006E\006G\002\182\006I\002\200\002\185\006U\002\201\002\197\002\185\006e\006g\006h\006m\002\194\006q\006u\006\135\006\142\006\146\006\170\006\191\006\215\002\215\006\225\001\153\002\196\007\017\007\011\007\012\002\200\007\016\002\005\002\201\007\031\007I\007]\007^\007b\007\137\002\194\007\141\007\151\007\155\007\242\002\191\002\217\000\000\000\000\002\215\002\006\001\153\002\196\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\191\000\000\000\000\002\217\002\191\000\000\001#\002=\002>\001s\000\000\000\000\002A\000\000\002\193\000\242\002A\000\000\002\193\000\242\002\197\000\000\002\154\000\000\002=\002>\001s\000\000\000\000\000\000\002\159\000\000\000\000\000\000\000\000\000\000\002\199\000\000\000\000\002\154\000\000\000\000\003w\002\185\002\197\002\201\004-\002\159\002\197\000\000\000\000\000\000\002\194\002\227\000\000\000\000\000\000\000\000\001r\001s\002\185\002\215\000\000\001\153\002\196\000\000\002\200\003o\000\000\002\201\002\200\000\000\000\000\002\201\000\000\003r\002\194\000\000\001t\002s\002\194\001v\001w\000\000\002\217\002\215\000\000\001\153\002\196\002\215\000\000\001\153\002\196\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002t\002\191\002\217\000\000\000\000\001)\002\217\000\000\002=\002>\001s\001\027\001/\002A\007l\002\193\000\242\000\000\002\191\000\000\000\000\000\000\000\000\002\154\000\000\000\000\000\000\000\000\000\000\000\000\002A\002\159\002\193\000\242\000\000\000\000\000\000\002\226\000\000\000\000\001\232\000\000\000\000\002M\002\185\002\197\002=\002>\001s\000\000\002\000\001{\001#\000\000\002\004\001$\001\027\000\000\000\000\000\000\000\000\002\154\002\197\001|\000\000\0011\000\242\002\200\0012\002\159\002\201\0013\0014\000\000\000\000\003`\000\000\002\194\000\000\001&\000\000\007v\002\185\000\000\002\200\000\000\002\215\002\201\001\153\002\196\000\000\000\000\000\000\000\000\002\194\002\005\007m\000\000\002u\000\000\000\000\000\000\000\000\002\215\000\000\001\153\002\196\000\000\002\191\002\217\000\000\000\000\000\000\002\006\002=\002>\001s\000\000\003s\003y\002A\000\000\002\193\000\242\000\000\001,\002\217\001\143\000\000\002\154\000\000\000\000\000\000\000\000\000\000\000\000\001\152\002\159\001\153\001z\001(\000\000\000\000\003g\000\000\000\000\002\191\002=\002>\001s\002\185\000\000\002\197\000\000\000\000\000\000\000\000\001)\002A\000\000\002\193\000\242\002\154\001\027\001/\000\000\000\000\000\000\000\000\000\000\002\159\000\000\001\232\000\000\002\200\004\155\003n\002\201\000\000\000\000\000\000\000\000\002\000\002\185\002\194\000\000\002\004\000\000\001\027\000\000\002\197\001\232\000\000\002\215\004\240\001\153\002\196\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\002\004\000\000\001\027\000\000\001;\000\000\000\000\002\200\000\000\002\191\002\201\002\217\0011\000\000\000\000\0012\000\000\002\194\0013\0014\007}\002A\002\005\002\193\000\242\000\000\002\215\000\000\001\153\002\196\000\000\000\000\002=\002>\001s\000\000\000\000\002=\002>\001s\002\006\002\005\002\191\0015\000\000\000\000\001?\002\154\000\000\002\217\000\000\000\000\002\154\002\197\002A\002\159\002\193\000\242\000\000\002\006\002\159\003q\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\000\000\000\000\000\000\002\185\000\000\002\200\000\000\000\000\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\194\002\197\000\000\000\000\000\000\002=\002>\001s\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\154\000\000\000\000\002\200\000\000\000\000\002\201\000\000\002\159\000\000\000\000\000\000\002\217\002\194\003~\000\000\001#\000\000\000\000\007s\000\000\002\185\002\215\000\000\001\153\002\196\000\000\002\191\000\000\000\000\000\000\000\000\002\191\002=\002>\001s\000\000\000\000\000\000\002A\000\000\002\193\000\242\001&\002A\002\217\002\193\000\242\002\154\000\000\002=\002>\001s\000\000\000\000\000\000\002\159\000\000\000\000\000\000\000\000\000\000\003\129\000\000\000\000\002\154\000\000\000\000\000\000\002\185\000\000\002\197\000\000\002\159\000\000\000\000\002\197\000\000\000\000\003\155\000\000\000\000\000\000\000\000\000\000\002\191\002\185\000\000\000\000\000\000\000\000\000\000\000\000\002\200\000\000\000\000\002\201\002A\003w\002\193\000\242\002\201\003x\002\194\001(\000\000\000\000\000\000\002\194\000\000\000\000\000\000\002\215\000\000\001\153\002\196\007\018\002\215\000\000\001\153\002\196\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\002\197\000\000\b\006\000\000\002\191\b\007\002\217\000\000\007\021\000\000\000\000\002\217\000\000\000\000\000\000\000\000\002A\007\022\002\193\000\242\000\000\002\191\002\200\000\000\000\000\002\201\000\000\002=\002>\001s\000\000\000\000\002\194\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\002\215\002\154\001\153\002\196\000\000\000\000\007\023\002\197\000\000\002\159\000\000\0011\000\000\000\000\0012\003\159\000\000\0013\0014\000\000\000\000\000\000\002\185\002\217\002\197\000\000\000\000\000\000\000\000\002\200\000\000\000\000\002\201\000\000\000\000\001#\000\000\000\000\001$\002\194\000\000\000\000\0015\007\024\000\000\000\000\002\200\000\000\002\215\002\201\001\153\002\196\000\000\007\025\000\000\000\000\002\194\000\000\000\000\000\000\000\000\000\000\001&\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\002\217\004\178\b\012\000\000\000\000\002=\002>\001s\000\000\000\000\002=\002>\001s\000\000\000\000\002\191\007g\002\217\000\000\000\000\002\154\007\027\000\000\000\000\000\000\002\154\000\000\002A\002\159\002\193\000\242\007\028\000\000\002\159\003\215\000\000\007\030\001,\000\000\003\224\000\000\002\185\000\000\002=\002>\001s\002\185\000\000\000\000\007 \000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\002\154\002\197\000\000\000\000\000\000\000\000\000\000\000\000\002\159\007!\007\018\001)\000\000\000\000\003\233\000\000\000\000\001\027\001/\000\000\000\000\002\185\000\000\002\200\000\000\000\000\002\201\000\000\007\019\000\000\000\000\007\021\000\000\002\194\000\000\000\000\000\000\000\000\000\000\000\000\007\022\000\000\002\215\000\000\001\153\002\196\000\000\002\191\000\000\000\000\000\000\000\000\002\191\002=\002>\001s\000\000\000\000\000\000\002A\000\000\002\193\000\242\001;\002A\002\217\002\193\000\242\002\154\000\000\007\023\0011\000\000\000\000\0012\000\000\002\159\0013\0014\000\000\000\000\000\000\004'\000\000\000\000\002\191\002=\002>\001s\002\185\000\000\002\197\000\000\000\000\000\000\000\000\002\197\002A\000\000\002\193\000\242\002\154\0015\000\000\000\000\004\185\000\000\007\024\000\000\002\159\000\000\000\000\000\000\002\200\000\000\004)\002\201\007\025\002\200\000\000\000\000\002\201\002\185\002\194\000\000\000\000\000\000\000\000\002\194\002\197\000\000\000\000\002\215\001\232\001\153\002\196\005\002\002\215\000\000\001\153\002\196\007.\000\000\002\000\000\000\000\000\000\000\002\004\000\000\001\027\000\000\002\200\000\000\002\191\002\201\002\217\007\027\000\000\000\000\000\000\002\217\002\194\000\000\000\000\000\000\002A\007\028\002\193\000\242\000\000\002\215\007\030\001\153\002\196\000\000\000\000\002=\002>\001s\000\000\000\000\002=\002>\001s\007 \000\000\002\191\000\000\002\005\000\000\000\000\002\154\000\000\002\217\000\000\000\000\002\154\002\197\002A\002\159\002\193\000\242\007!\000\000\002\159\0040\002\006\000\000\000\000\000\000\0043\000\000\002\185\000\000\000\000\000\000\000\000\002\185\000\000\002\200\000\000\000\000\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\194\002\197\000\000\000\000\000\000\002=\002>\001s\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\154\000\000\000\000\002\200\000\000\000\000\002\201\000\000\002\159\000\000\000\000\000\000\002\217\002\194\004L\000\000\001#\000\000\000\000\001-\000\000\002\185\002\215\000\000\001\153\002\196\000\000\002\191\000\000\000\000\000\000\000\000\002\191\002=\002>\001s\000\000\000\000\000\000\002A\000\000\002\193\000\242\001&\002A\002\217\002\193\000\242\002\154\000\000\002=\002>\001s\000\000\000\000\000\000\002\159\000\000\000\000\000\000\000\000\000\000\004O\000\000\000\000\002\154\000\000\000\000\000\000\002\185\000\000\002\197\000\000\002\159\000\000\000\000\002\197\000\000\000\000\004\146\000\000\000\000\000\000\000\000\000\000\002\191\002\185\000\000\000\000\000\000\000\000\000\000\001#\002\200\000\000\000\000\002\201\002A\002\200\002\193\000\242\002\201\000\000\002\194\001(\000\000\000\000\000\000\002\194\000\000\000\000\000\000\002\215\000\000\001\153\002\196\007\018\002\215\000\000\001\153\002\196\001)\004\191\000\000\000\000\000\000\000\000\001\027\001/\002\197\000\000\b\006\000\000\002\191\b\007\002\217\000\000\007\021\000\000\000\000\002\217\000\000\000\000\000\000\000\000\002A\007\022\002\193\000\242\000\000\002\191\002\200\000\000\000\000\002\201\000\000\002=\002>\001s\000\000\000\000\002\194\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\002\215\002\154\001\153\002\196\000\000\000\000\007\023\002\197\000\000\002\159\001(\0011\000\000\000\000\0012\004\160\000\000\0013\0014\000\000\000\000\000\000\002\185\002\217\002\197\000\000\000\000\001)\000\000\002\200\000\000\000\000\002\201\001\027\001/\001#\000\000\000\000\001$\002\194\000\000\000\000\0015\007\024\000\000\000\000\002\200\000\000\002\215\002\201\001\153\002\196\000\000\007\025\000\000\000\000\002\194\000\000\000\000\000\000\000\000\000\000\001&\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\002\217\003h\b\017\000\000\000\000\002=\002>\001s\000\000\000\000\002=\002>\001s\000\000\000\000\002\191\0011\002\217\000\000\0012\002\154\007\027\0013\0014\000\000\002\154\004\194\002A\002\159\002\193\000\242\007\028\000\000\002\159\004\210\000\000\007\030\001,\000\000\005=\000\000\002\185\000\000\002=\002>\001s\002\185\004\195\000\000\007 \000\000\000\000\001(\000\000\001\232\000\000\000\000\005\006\002\154\002\197\000\000\000\000\000\000\000\000\002\000\000\000\002\159\007!\002\004\001)\001\027\000\000\006t\000\000\000\000\001\027\001/\000\000\000\000\002\185\000\000\002\200\000\000\001\232\002\201\000\000\005\t\000\000\000\000\000\000\000\000\002\194\000\000\002\000\000\000\000\000\000\000\002\004\000\000\001\027\002\215\000\000\001\153\002\196\000\000\002\191\000\000\000\000\000\000\002\005\002\191\002=\002>\001s\000\000\000\000\000\000\002A\000\000\002\193\000\242\001;\002A\002\217\002\193\000\242\002\154\002\006\000\000\0011\000\000\000\000\0012\000\000\002\159\0013\0014\002\168\002\005\000\000\006w\000\000\000\000\002\191\002=\002>\001s\002\185\000\000\002\197\000\000\000\000\000\000\000\000\002\197\002A\002\006\002\193\000\242\002\154\0015\000\000\000\000\001?\000\000\000\000\000\000\002\159\000\000\000\000\000\000\002\200\000\000\006\134\002\201\000\000\002\200\000\000\000\000\002\201\002\185\002\194\000\000\000\000\000\000\000\000\002\194\002\197\000\000\000\000\002\215\001\232\001\153\002\196\005\016\002\215\000\000\001\153\002\196\000\000\000\000\002\000\000\000\000\000\000\000\002\004\000\000\001\027\000\000\002\200\000\000\002\191\002\201\002\217\000\000\000\000\000\000\000\000\002\217\002\194\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\002\215\000\000\001\153\002\196\000\000\000\000\002=\002>\001s\000\000\000\000\002=\002>\001s\000\000\000\000\002\191\000\000\002\005\000\000\000\000\002\154\000\000\002\217\000\000\000\000\002\154\002\197\002A\002\159\002\193\000\242\000\000\000\000\002\159\006\137\002\006\000\000\000\000\000\000\006\150\000\000\002\185\000\000\000\000\000\000\000\000\002\185\000\000\002\200\000\000\000\000\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\194\002\197\000\000\000\000\000\000\002=\002>\001s\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\154\000\000\000\000\002\200\000\000\000\000\002\201\000\000\002\159\000\000\000\000\000\000\002\217\002\194\006\153\000\000\001#\000\000\000\000\006\004\000\000\002\185\002\215\000\000\001\153\002\196\000\000\002\191\000\000\000\000\000\000\000\000\002\191\002=\002>\001s\000\000\000\000\000\000\002A\000\000\002\193\000\242\001&\002A\002\217\002\193\000\242\002\154\000\000\002=\002>\001s\000\000\000\000\000\000\002\159\000\000\001\232\000\000\000\000\005\020\006\174\000\000\000\000\002\154\000\000\000\000\002\000\002\185\000\000\002\197\002\004\002\159\001\027\000\000\002\197\000\000\000\000\006\177\000\000\000\000\000\000\000\000\000\000\002\191\002\185\000\000\000\000\000\000\000\000\000\000\001#\002\200\000\000\000\000\002\201\002A\002\200\002\193\000\242\002\201\000\000\002\194\001(\000\000\000\000\000\000\002\194\000\000\000\000\000\000\002\215\002\005\001\153\002\196\000\000\002\215\000\000\001\153\002\196\001)\004\191\000\000\000\000\000\000\000\000\001\027\001/\002\197\000\000\002\006\000\000\002\191\000\000\002\217\000\000\000\000\000\000\000\000\002\217\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\002\191\002\200\000\000\000\000\002\201\000\000\002=\002>\001s\000\000\000\000\002\194\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\002\215\002\154\001\153\002\196\000\000\000\000\000\000\002\197\000\000\002\159\001(\0011\000\000\000\000\0012\006\181\000\000\0013\0014\000\000\000\000\000\000\002\185\002\217\002\197\000\000\000\000\001)\000\000\002\200\000\000\000\000\002\201\001\027\001/\000\000\000\000\001r\001s\002\194\000\000\000\000\0015\000\000\000\000\000\000\002\200\000\000\002\215\002\201\001\153\002\196\000\000\000\000\004\222\000\000\002\194\001t\002s\001\232\001v\001w\005\023\000\000\000\000\002\215\000\000\001\153\002\196\002\000\000\000\002\217\000\000\002\004\000\000\001\027\002=\002>\001s\000\000\000\000\002=\002>\001s\000\000\002t\002\191\0011\002\217\000\000\0012\002\154\001\232\0013\0014\005%\002\154\004\199\002A\002\159\002\193\000\242\002\000\000\000\002\159\007\168\002\004\000\000\001\027\000\000\007\170\000\000\002\185\000\000\002\005\000\000\000\000\002\185\004\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001#\000\000\000\000\001$\002\197\000\000\002\006\000\000\000\000\000\000\001{\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\002\005\001|\000\000\000\000\000\242\002\200\001&\001\232\002\201\000\000\005u\000\000\002\154\000\000\000\000\002\194\005J\002\000\002\006\000\000\002\159\002\004\000\000\001\027\002\215\000\000\001\153\002\196\000\000\002\191\004\229\000\000\007\163\002\185\002\191\000\000\002u\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\002A\002\217\002\193\000\242\000\000\000\000\001,\000\000\000\000\000\000\003s\003y\001#\000\000\000\000\001$\002\005\000\000\000\000\001\143\000\000\001(\000\000\000\000\000\000\000\000\001\232\002\197\001\152\005\129\001\153\001z\002\197\000\000\002\006\000\000\002\000\000\000\001)\001&\002\004\000\000\001\027\000\000\001\027\001/\002=\002>\001s\002\200\000\000\002\191\002\201\000\000\002\200\000\000\000\000\002\201\000\000\002\194\000\000\002\154\000\000\002A\002\194\002\193\000\242\000\000\002\215\002\159\001\153\002\196\000\000\002\215\000\000\001\153\002\196\000\000\000\000\004\138\000\000\002\005\002\185\000\000\000\000\001,\000\000\001r\001s\000\000\001;\002\217\000\000\000\000\000\000\002\197\002\217\000\000\0011\002\006\001(\0012\000\000\000\000\0013\0014\005S\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\003\168\001r\001s\001\027\001/\000\000\000\000\002\194\000\000\0015\0045\000\000\001?\000\000\000\000\000\000\002\215\000\000\001\153\002\196\000\000\001t\001\132\000\000\001v\001w\002\191\000\000\001#\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\002A\002\217\002\193\000\242\000\000\000\000\002\127\000\000\002=\002>\001s\001;\000\000\000\000\000\000\001r\001s\000\000\000\000\0011\000\000\000\000\0012\002\154\000\000\0013\0014\001\133\001\141\001\134\002]\002\159\002\197\000\000\000\000\001t\001\132\000\000\001v\001w\001|\004\027\000\000\000\242\002\185\001r\001s\000\000\000\000\000\000\0015\002\135\000\000\001R\000\000\000\000\000\000\003\168\002\132\000\000\000\000\000\000\001\141\000\000\002\194\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\002\215\001|\001\153\002\196\000\242\001(\001\133\000\000\001\134\002]\000\000\001\232\002\135\000\000\005\135\002\152\000\000\000\000\000\000\000\000\000\000\002\000\001)\002\217\000\000\002\004\000\000\001\027\001\027\001/\000\000\001\143\000\000\000\000\000\000\002\191\001\133\000\000\001\134\002]\001\144\001\141\001\153\001z\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\001|\000\000\000\000\000\242\002=\002>\001s\000\000\000\000\000\000\000\000\002\135\001\143\002\005\000\000\000\000\000\000\000\000\001\141\002\154\000\000\001\144\000\000\001\153\001z\000\000\002\197\002\159\000\000\0011\001|\002\006\0012\000\242\000\000\0013\0014\004\026\000\000\000\000\002\185\002\135\000\000\000\000\000\000\000\000\000\000\001\232\000\000\000\000\005\145\003\168\000\000\000\000\000\000\000\000\000\000\002\000\002\194\000\000\0017\002\004\000\000\001\027\001\143\001r\001s\002\215\000\000\001\153\002\196\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001t\001\132\000\000\001v\001w\002\217\001r\001s\000\000\001\143\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\005\001\144\002\191\001\153\001z\000\000\002\158\000\000\000\000\001t\001\132\000\000\001v\001w\002A\000\000\002\193\000\242\002\006\000\000\000\000\006\031\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\002\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001r\001s\000\000\000\000\000\000\000\000\002\197\000\000\000\000\006 \007\177\006!\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\001t\001\132\001\141\001v\001w\000\000\000\000\000\000\000\000\000\000\000\000\003\168\000\000\000\000\001|\000\000\000\000\000\242\002\194\000\000\000\000\006\"\000\000\002\206\000\000\002\135\000\000\002\215\001\141\001\153\002\196\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\001\133\000\000\001\134\002]\000\000\000\000\002\217\002\135\001t\001\132\000\000\001v\001w\006#\000\000\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\006$\006%\000\000\006&\000\000\000\000\000\000\000\000\002\212\000\000\000\000\001\143\001\141\001t\001\132\000\000\001v\001w\000\000\000\000\001\144\000\000\001\153\001z\001|\000\000\006b\000\242\000\000\001\133\000\000\001\134\002]\000\000\000\000\002\135\002\221\001\143\000\000\000\000\000\000\000\000\001r\001s\000\000\000\000\001\144\000\000\001\153\001z\006(\007\179\000\000\000\000\000\000\006*\0064\001\133\000\000\001\134\002]\000\000\001t\001\132\001\141\001v\001w\000\000\006^\000\000\001r\001s\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\002\232\006_\002\135\001\143\000\000\001t\001\132\001\141\001v\001w\000\000\000\000\001\144\000\000\001\153\001z\000\000\001\232\000\000\001|\005\154\001\133\000\242\001\134\002]\000\000\000\000\002\000\002\238\000\000\002\135\002\004\000\000\001\027\000\000\000\000\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\001\143\001\141\001t\001\132\000\000\001v\001w\000\000\000\000\001\144\000\000\001\153\001z\001|\000\000\000\000\000\242\002\005\000\000\000\000\000\000\000\000\000\000\000\000\002\135\002\244\000\000\000\000\001\143\001\141\000\000\000\000\000\000\001r\001s\002\006\000\000\001\144\000\000\001\153\001z\001|\000\000\000\000\000\242\000\000\001\133\000\000\001\134\002]\000\000\000\000\002\135\001t\001\132\000\000\001v\001w\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\250\001\143\000\000\001t\001\132\001\141\001v\001w\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\001|\000\000\000\000\000\242\001\133\000\000\001\134\002]\000\000\003\000\000\000\002\135\001\143\000\000\000\000\000\000\000\000\001r\001s\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\001r\001s\001t\001\132\001\141\001v\001w\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\000\000\001|\000\000\000\000\000\242\001t\001\132\000\000\001v\001w\003\006\000\000\002\135\000\000\001\143\001\141\001r\001s\000\000\000\000\004\021\001r\001s\001\144\000\000\001\153\001z\001|\003\012\000\000\000\242\001\133\000\000\001\134\002]\000\000\001t\001\132\002\135\001v\001w\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\000\000\000\000\000\000\003\018\000\000\000\000\000\000\000\000\003\024\001\143\001\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\144\000\000\001\153\001z\001|\000\000\001\133\000\242\001\134\002]\001\141\001\133\000\000\001\134\002]\002\135\000\000\001\143\000\000\000\000\000\000\000\000\001|\002@\000\000\000\242\001\144\000\000\001\153\001z\000\000\000\000\000\000\002\135\000\000\002A\000\000\002\193\000\242\001r\001s\001\141\000\000\000\000\000\000\000\000\001\141\000\000\000\000\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\001|\001t\001\132\000\242\001v\001w\002\135\000\000\000\000\000\000\001\143\002\135\000\000\004\023\000\000\000\000\000\000\000\000\000\000\001\144\000\000\001\153\001z\000\000\003\030\000\000\000\000\000\000\001\143\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\001\144\000\000\001\153\001z\002\194\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\002\195\000\000\001\153\002\196\000\000\000\000\000\000\004\232\000\000\001\143\000\000\001r\001s\000\000\001\143\000\000\000\000\000\000\001\144\000\000\001\153\001z\000\000\001\144\000\000\001\153\001z\001r\001s\000\000\001\141\001t\001\132\000\000\001v\001w\000\000\001r\001s\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\001t\001\132\000\000\001v\001w\000\000\002\135\003$\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\001r\001s\000\000\000\000\000\000\003*\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\0030\000\000\000\000\000\000\002@\001t\001\132\000\000\001v\001w\000\000\001\133\000\000\001\134\002]\000\000\002A\000\000\002\193\000\242\000\000\001\133\000\000\001\134\002]\000\000\001\143\000\000\0036\000\000\001\141\000\000\000\000\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\001|\000\000\000\000\000\242\001\141\000\000\000\000\001\133\000\000\001\134\002]\002\135\001#\000\000\001\141\001$\001|\000\000\000\000\000\242\001r\001s\000\000\000\000\000\000\000\000\001|\002\135\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\135\002\194\001&\001t\001\132\001\141\001v\001w\000\000\000\000\002\195\000\000\001\153\002\196\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\003<\001\143\002\135\000\000\000\000\000\000\000\000\001#\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\001\143\000\000\000\000\000\000\001\133\001,\001\134\002]\000\000\001\144\001\143\001\153\001z\000\000\000\000\000\000\000\000\000\000\000\000\001\144\001(\001\153\001z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001r\001s\000\000\000\000\000\000\001)\001\143\001\141\000\000\000\000\000\000\001\027\001/\001r\001s\001\144\000\000\001\153\001z\001|\001t\001\132\000\242\001v\001w\000\000\000\000\000\000\000\000\000\000\002\135\000\000\000\000\001t\001\132\000\000\001v\001w\001r\001s\000\000\000\000\000\000\003B\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003H\001E\001t\001\132\000\000\001v\001w\001)\001\133\0011\001\134\002]\0012\001\027\001/\0013\0014\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\003N\000\000\001\143\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\144\000\000\001\153\001z\0015\001r\001s\001\141\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\000\000\000\000\001|\001\141\000\000\000\242\000\000\000\000\001t\001\132\000\000\001v\001w\002\135\0011\001|\000\000\0012\000\242\000\000\0013\0014\000\000\002=\002>\001s\002\135\000\000\001\141\000\000\000\000\003T\000\000\000\000\000\000\000\000\000\000\000\000\002\154\000\000\001|\000\000\000\000\000\242\001#\002y\002\159\001$\000\000\000\000\000\000\002\135\001\133\000\000\001\134\002]\003\165\000\000\000\000\002\185\000\000\000\000\001r\001s\000\000\000\000\001\143\000\000\000\000\000\000\000\000\001&\000\000\006\031\000\000\001\144\000\000\001\153\001z\001\143\000\000\005J\001t\001\132\000\000\001v\001w\001\141\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\005M\000\000\001|\000\000\006 \000\242\006!\001\143\003Z\000\000\002=\002>\001s\002\135\000\000\000\000\001\144\000\000\001\153\001z\001,\000\000\000\000\000\000\000\000\002\154\002\191\000\000\000\000\001\133\000\000\001\134\002]\002\159\000\000\001(\006\"\000\000\002A\000\000\002\193\000\242\000\000\003\170\000\000\000\000\002\185\000\000\002=\002>\001s\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\002\154\001\141\000\000\001\143\000\000\000\000\000\000\002\197\002\159\006#\000\000\000\000\001\144\001|\001\153\001z\000\242\000\000\003\172\006$\006%\002\185\006&\000\000\002\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\168\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\001;\000\000\000\000\000\000\006`\000\000\002\191\002\215\0011\001\153\002\196\0012\000\000\000\000\0013\0014\005S\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\000\000\000\000\006(\000\000\002\217\000\000\000\000\006*\0064\000\000\001\143\000\000\000\000\0015\000\000\000\000\001?\000\000\002\191\001\144\006^\001\153\001z\000\000\002\197\002=\002>\001s\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\006_\000\000\002\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\159\003\168\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\003\176\000\000\000\000\002\185\002\197\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\168\002\217\002\154\000\000\006\031\001r\001s\002\194\000\000\000\000\002\159\000\000\000\000\000\000\000\000\000\000\002\215\000\000\001\153\002\196\003\184\000\000\000\000\002\185\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\006 \007\158\006!\000\000\000\000\000\000\002\191\002\217\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\003\191\000\000\002A\000\000\002\193\000\242\000\000\002\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\159\006\"\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\003\194\000\000\000\000\002\185\000\000\000\000\000\000\000\000\000\000\002\197\000\000\000\000\000\000\000\000\002\191\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002A\006#\002\193\000\242\000\000\001\141\000\000\000\000\003\168\000\000\000\000\006$\006%\000\000\006&\002\194\000\000\001|\000\000\000\000\000\242\000\000\001r\001s\002\215\000\000\001\153\002\196\002\135\000\000\000\000\000\000\002\197\000\000\000\000\000\000\000\000\006b\000\000\001r\001s\002\191\001t\001\132\000\000\001v\001w\002\217\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\003\168\000\000\001t\001\132\006(\001v\001w\002\194\003\201\006*\0064\002=\002>\001s\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\006^\000\000\001\143\003\211\002\154\000\000\002\197\001\133\000\000\001\134\002]\001\144\002\159\001\153\001z\000\000\000\000\002\217\006_\000\000\001r\001s\003\204\000\000\001\133\002\185\001\134\002]\000\000\000\000\000\000\003\168\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\001t\001\132\001\141\001v\001w\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\001\141\000\000\000\000\000\000\003\221\000\000\002\135\000\000\000\000\000\000\000\000\002\217\001|\001r\001s\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\135\000\000\001\133\000\000\001\134\002]\000\000\002\191\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\000\000\000\000\001\143\001\141\000\000\000\000\001#\000\000\000\000\000\000\000\000\001\144\000\000\001\153\001z\001|\000\000\002\197\000\242\001\143\001\133\000\000\001\134\002]\000\000\000\000\002\135\000\000\001\144\000\000\001\153\001z\000\000\001r\001s\000\000\002=\002>\001s\000\000\000\000\000\000\003\168\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\002\154\000\000\001t\001\132\001\141\001v\001w\002\215\002\159\001\153\002\196\001r\001s\000\000\000\000\000\000\001|\000\000\003\244\000\242\000\000\002\185\000\000\000\000\000\000\003\239\000\000\002\135\001\143\000\000\002\217\001t\001\132\000\000\001v\001w\000\000\001\144\000\000\001\153\001z\000\000\000\000\001(\000\000\000\000\001\133\000\000\001\134\002]\002=\002>\001s\000\000\003\250\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\002\154\001\027\001/\000\000\007o\000\000\000\000\000\000\002\159\000\000\001\133\000\000\001\134\002]\000\000\001\143\001\141\000\000\003\253\000\000\002\191\002\185\000\000\000\000\001\144\000\000\001\153\001z\001|\000\000\000\000\000\242\002A\000\000\002\193\000\242\000\000\000\000\000\000\002\135\000\000\000\000\000\000\000\000\000\000\001\141\000\000\000\000\000\000\000\000\000\000\000\000\001r\001s\000\000\0011\000\000\001|\0012\000\000\000\242\0013\0014\000\000\002\197\000\000\000\000\000\000\002\135\000\000\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\191\007m\000\000\000\000\003\168\000\000\000\000\001\143\000\000\000\000\004\003\002\194\002A\000\000\002\193\000\242\001\144\000\000\001\153\001z\002\215\000\000\001\153\002\196\000\000\000\000\002=\002>\001s\000\000\000\000\001\133\000\000\001\134\002]\000\000\001\143\000\000\000\000\000\000\000\000\002\154\000\000\002\217\002\197\001\144\000\000\001\153\001z\002\159\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\000\000\004\006\000\000\000\000\002\185\000\000\000\000\000\000\001\141\000\000\000\000\003\168\000\000\001t\001\132\000\000\001v\001w\002\194\000\000\001|\001r\001s\000\242\000\000\000\000\000\000\002\215\000\000\001\153\002\196\002\135\000\000\000\000\000\000\000\000\004\012\000\000\000\000\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\002\217\000\000\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\004\019\000\000\000\000\000\000\002\191\000\000\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\000\000\000\000\002A\000\000\002\193\000\242\001\143\001\133\000\000\001\134\002]\000\000\002\154\000\000\001\141\001\144\000\000\001\153\001z\000\000\002\159\000\000\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\004\030\000\000\000\000\002\185\002\197\000\000\000\000\002\135\000\000\000\000\000\000\000\000\001\141\000\000\000\000\001#\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\003\168\000\000\002\154\000\000\000\000\000\000\002\135\002\194\000\000\000\000\002\159\000\000\000\000\001r\001s\000\000\002\215\000\000\001\153\002\196\004!\000\000\000\000\002\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\143\000\000\001t\001\132\000\000\001v\001w\002\191\002\217\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\004;\000\000\000\000\001\143\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\144\000\000\001\153\001z\001r\001s\001(\000\000\000\000\001\133\000\000\001\134\002]\000\000\002\197\000\000\000\000\000\000\000\000\002\191\000\000\000\000\000\000\001)\001t\001\132\000\000\001v\001w\001\027\001/\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\003\168\000\000\000\000\000\000\000\000\001\141\000\000\002\194\004@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\215\001|\001\153\002\196\000\242\000\000\000\000\000\000\002\197\000\000\000\000\000\000\002\135\001\133\000\000\001\134\002]\000\000\001r\001s\000\000\000\000\000\000\002\217\000\000\000\000\000\000\000\000\0011\000\000\000\000\0012\000\000\003\168\0013\0014\000\000\000\000\001t\001\132\002\194\001v\001w\000\000\000\000\000\000\000\000\000\000\001\141\002\215\000\000\001\153\002\196\000\000\000\000\002=\002>\001s\000\000\004\193\001|\004G\000\000\000\242\000\000\001\143\000\000\000\000\000\000\000\000\002\154\002\135\002\217\000\000\001\144\000\000\001\153\001z\002\159\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\004Y\001#\000\000\002\185\006\b\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\154\000\000\000\000\000\000\000\000\000\000\001&\001\141\002\159\000\000\000\000\000\000\001r\001s\001\143\000\000\000\000\000\000\004^\001|\000\000\002\185\000\242\001\144\000\000\001\153\001z\000\000\000\000\000\000\002\135\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\003^\001s\000\000\000\000\002\191\000\000\000\000\000\000\000\000\000\000\000\000\006\n\000\000\000\000\004\129\000\000\002A\000\000\002\193\000\242\003z\001\132\000\000\001v\001w\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\001\143\001)\002\191\000\000\000\000\000\000\002\197\001\027\006\r\001\144\000\000\001\153\001z\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\003\127\003\143\003\144\000\000\000\000\000\000\000\000\001\141\000\000\000\000\003\168\001r\001s\000\000\000\000\000\000\000\000\002\194\000\000\001|\000\000\000\000\000\242\000\000\000\000\002\197\002\215\000\000\001\153\002\196\002\135\001t\001\132\000\000\001v\001w\001\141\000\000\000\000\000\000\0011\001r\001s\006\014\000\000\000\000\0013\0014\001|\002\217\003\168\000\242\000\000\000\000\004\226\000\000\005\216\002\194\006\019\000\000\006\016\001t\001\132\000\000\001v\001w\002\215\000\000\001\153\002\196\000\000\0015\000\000\000\000\000\000\001\133\000\000\001\134\002]\003^\001s\003\147\004\216\001\143\004\249\000\000\000\000\000\000\000\000\002\217\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\003z\001\132\000\000\001v\001w\000\000\001\133\000\000\001\134\002]\000\000\001\141\000\000\001\143\000\000\000\000\001r\001s\000\000\000\000\000\000\000\000\001\144\001|\001\153\001z\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\135\000\000\001t\001\132\000\000\001v\001w\001\141\000\000\003\127\003\143\003\144\000\000\001#\000\000\000\000\001$\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\004\253\000\000\000\000\000\000\000\000\002\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001&\000\000\000\000\000\000\000\000\001\141\001\133\000\000\001\134\002]\005J\001r\001s\001\143\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\001\144\000\000\001\153\001z\005\198\000\000\006\154\000\000\000\000\001t\002s\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\001\141\000\000\001\143\000\000\000\000\001,\000\000\000\000\000\000\003\147\006\192\001\144\001|\001\153\001z\000\242\000\000\000\000\002t\000\000\001(\001#\000\000\002\135\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\001\143\000\000\000\000\001\027\001/\000\000\000\000\000\000\001&\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\005J\000\000\000\000\000\000\000\000\000\000\000\000\001#\000\000\000\000\001$\001{\000\000\000\000\000\000\000\000\006\151\000\000\001\143\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\001\144\000\000\001\153\001z\001;\000\000\000\000\001&\000\000\001,\000\000\000\000\0011\000\000\000\000\0012\000\000\005J\0013\0014\005S\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\001#\000\000\002u\001$\006\165\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\0015\000\000\000\000\001?\001\027\001/\000\000\000\000\003s\003y\001,\000\000\000\000\001&\001r\001s\000\000\001\143\000\000\000\000\003^\001s\000\000\005J\000\000\001(\001\152\000\000\001\153\001z\000\000\006\178\000\000\000\000\001t\002s\000\000\001v\001w\006\175\003z\001\132\001)\001v\001w\000\000\000\000\000\000\001\027\001/\001;\000\000\000\000\000\000\000\000\000\000\001r\001s\0011\001,\000\000\0012\002t\000\000\0013\0014\005S\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001(\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\003\127\003\143\003\144\000\000\000\000\000\000\0015\000\000\001)\001?\000\000\001;\000\000\000\000\001\027\001/\007C\000\000\000\000\0011\000\000\000\000\0012\000\000\000\000\0013\0014\005S\000\000\000\000\001{\002=\002>\001s\000\000\000\000\001\141\001\133\000\000\001\134\002]\000\000\001|\000\000\000\000\000\242\002\154\000\000\001|\000\000\0015\000\242\000\000\001?\002\159\000\000\000\000\000\000\000\000\000\000\001;\000\000\000\000\000\000\000\000\000\000\000\000\002\185\0011\001r\001s\0012\001\141\000\000\0013\0014\005S\002u\000\000\000\000\000\000\003\147\006\226\000\000\001|\000\000\000\000\000\242\000\000\001t\001\132\000\000\001v\001w\000\000\002\135\000\000\003s\003y\0015\000\000\000\000\001?\000\000\000\000\000\000\001\143\000\000\000\000\000\000\000\000\000\000\001\143\000\000\000\000\001\152\000\000\001\153\001z\000\000\000\000\001\144\000\000\001\153\001z\000\000\002=\002>\001s\000\000\000\000\002\191\000\000\001\133\000\000\001\134\001\157\000\000\000\000\000\000\000\000\002\154\000\000\002A\000\000\002\193\000\242\000\000\001\143\002\159\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\144\000\000\001\153\001z\000m\002\185\000\000\001r\001s\000\000\000\000\001\141\001r\001s\000\000\000\000\000\000\000\000\002\197\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\001t\001\132\000\000\001v\001w\001t\001\132\000\000\001v\001w\001\198\000\000\000\000\000\000\000\000\001\183\005\011\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\001r\001s\000\000\000\000\002\191\000\000\001\133\000\000\001\134\001\186\000\000\001\133\000\000\001\134\001\186\000\000\002A\002\217\002\193\000\242\001t\001\132\001\143\001v\001w\000\000\000\000\002=\002>\001s\001\188\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\000\000\001\141\002\154\000\000\000\000\000\000\001\141\000\000\002\197\000\000\002\159\000\000\000\000\001|\001r\001s\000\242\000\000\001|\000\000\000\000\000\242\000\000\002\185\001\133\000\000\001\134\001\186\000\000\000\000\000\000\000\000\000\000\004\227\001t\001\132\000\000\001v\001w\000\000\002\194\000\000\000\000\000\000\001r\001s\000\000\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\001\141\000\000\000\000\000\000\000\000\001t\002s\000\000\001v\001w\000\000\000\000\001|\002\217\000\000\000\242\000\000\000\000\001\143\001\133\000\000\001\134\002]\001\143\000\000\000\000\000\000\001\144\002\191\001\153\001z\000\000\001\144\002t\001\153\001z\001r\001s\000\000\000\000\002A\000\000\002\193\000\242\001r\001s\000\000\000\000\000\000\000\000\001r\001s\000\000\000\000\001\141\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\001t\001\132\001|\001v\001w\000\242\001t\001u\002\197\001v\001w\000\000\001\143\0044\000\000\000\000\000\000\000\000\000\000\000\000\001{\001\144\000\000\001\153\001z\000\000\000\000\002=\002>\001s\000\000\000\000\001|\004\130\000\000\000\242\001\133\000\000\001\134\002e\002\194\000\000\002\154\000\000\001\133\000\000\001\134\002]\000\000\002\215\002\159\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\000\000\001\143\002u\000\000\000\000\000\000\001\141\002\217\000\000\000\000\001\144\000\000\001\153\001z\001\141\002=\002>\001s\001|\000\000\001{\000\242\002w\003y\000\000\000\000\001|\000\000\000\000\000\242\002\154\001\143\001|\000\000\000\000\000\242\000\000\002\134\002\159\000\000\001\152\000\000\001\153\001z\000\000\000\000\000\000\000\000\002h\000\000\000\000\002\185\002=\002>\001s\000\000\000\000\002=\002>\001s\000\000\000\000\002\191\000\000\000\000\000\000\000\000\002\154\000\000\000\000\000\000\000\000\000\000\000\000\002A\002\159\002\193\000\242\000\000\000\000\004\021\000\000\001\143\000\000\000\000\000\000\000\000\001#\002\185\000\000\001\143\001\144\000\000\001\153\001z\000\000\001\143\000\000\000\000\001\144\000\000\001\153\001z\000\000\004\022\001\152\002\197\001\153\001z\000\000\002=\002>\001s\000\000\000\000\002\191\000\000\000\000\000\000\000\000\002=\002>\001s\000\000\000\000\002\154\000\000\002A\000\000\002\193\000\242\004,\000\000\002\159\000\000\002\154\000\000\000\000\002\194\000\000\000\000\000\000\000\000\002\159\000\000\000\000\002\185\002\215\000\000\001\153\002\196\000\000\002\191\000\000\000\000\000\000\002\185\002@\000\000\002\197\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\002A\002\217\002\193\000\242\000\000\000\000\001(\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\004\025\000\000\000\000\000\000\000\000\000\000\000\000\002\194\001)\002\154\000\000\000\000\002\197\000\000\001\027\001/\002\215\002\159\001\153\002\196\000\000\004\024\000\000\000\000\000\000\000\000\002\191\000\000\000\000\000\000\002\185\002=\002>\001s\000\000\000\000\002\191\003\153\002A\002\217\002\193\000\242\000\000\000\000\002\194\000\000\002\154\000\000\002A\002\194\002\193\000\242\000\000\002\215\002\159\001\153\002\196\000\000\002\195\006\031\001\153\002\196\002=\002>\001s\000\000\000\000\002\185\0011\000\000\002\197\0012\000\000\000\000\0013\0014\002\217\002\154\000\000\000\000\002\197\000\000\000\000\000\000\000\000\002\159\000\000\006 \000\000\006!\000\000\000\000\000\000\000\000\002\191\002\207\000\000\000\000\002\185\004\201\000\000\000\000\002\194\000\000\000\000\002\213\002A\000\000\002\193\000\242\000\000\002\215\002\194\001\153\002\196\000\000\000\000\000\000\000\000\006\"\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\002\191\000\000\000\000\002\217\000\000\000\000\000\000\002\197\000\000\000\000\000\000\000\000\002A\002\217\002\193\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006#\000\000\002=\002>\001s\000\000\000\000\002\191\002\222\000\000\006$\006%\000\000\006&\000\000\002\194\000\000\002\154\000\000\002A\002\197\002\193\000\242\000\000\002\215\002\159\001\153\002\196\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\006'\000\000\002\185\002=\002>\001s\000\000\000\000\000\000\002\233\000\000\002\217\002\154\000\000\000\000\002\197\002\194\000\000\002\154\000\000\002\159\000\000\000\000\000\000\006(\002\215\002\159\001\153\002\196\006*\0064\000\000\000\000\002\185\002=\002>\001s\000\000\000\000\002\185\002\239\000\000\006^\000\000\000\000\000\000\000\000\002\194\002\217\002\154\000\000\000\000\000\000\000\000\000\000\000\000\002\215\002\159\001\153\002\196\006_\000\000\000\000\000\000\000\000\000\000\002\191\000\000\000\000\000\000\002\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002A\002\217\002\193\000\242\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\191\002\154\000\000\000\000\000\000\000\000\002\191\000\000\000\000\002\159\000\000\000\000\002A\002\197\002\193\000\242\000\000\000\000\002A\000\000\002\193\000\242\002\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\000\000\000\000\002\191\002\245\001\201\001s\000\000\000\000\000\000\002\197\002\194\000\000\002\154\000\000\002A\002\197\002\193\000\242\000\000\002\215\002\159\001\153\002\196\000\000\001t\002R\000\000\001v\001w\000\000\000\000\000\000\000\000\002\185\002\251\000\000\000\000\000\000\000\000\000\000\003\001\002\194\002\217\000\000\000\000\000\000\002\197\002\194\000\000\000\000\002\215\002\191\001\153\002\196\000\000\000\000\002\215\000\000\001\153\002\196\002=\002>\001s\002A\000\000\002\193\000\242\004J\003\143\003\144\000\000\003\007\000\000\002\217\000\000\002\154\000\000\000\000\002\194\002\217\000\000\000\000\000\000\002\159\000\000\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\002\197\002\185\002\191\002=\002>\001s\000\000\000\000\001\141\000\000\000\000\000\000\000\000\000\000\002A\002\217\002\193\000\242\002\154\000\000\001|\000\000\000\000\000\242\000\000\003\r\002\159\000\000\001#\000\000\000\000\001$\002\194\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\215\000\000\001\153\002\196\000\000\002\197\000\000\000\000\004Q\000\000\000\000\000\000\000\000\000\000\001&\000\000\000\000\000\000\000\000\005\209\000\000\000\000\000\000\002\217\002\191\000\000\000\000\002=\002>\001s\003\019\000\000\000\000\000\000\000\000\000\000\002A\002\194\002\193\000\242\000\000\000\000\002\154\001\143\000\000\000\000\002\215\000\000\001\153\002\196\002\159\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\001,\000\000\002\191\002\185\000\000\002=\002>\001s\002\197\002\217\000\000\000\000\000\000\000\000\002A\001(\002\193\000\242\000\000\000\000\002\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\159\000\000\000\000\000\000\001)\003\025\000\000\000\000\000\000\000\000\001\027\001/\002\194\002\185\000\000\000\000\000\000\000\000\002\197\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\191\002=\002>\001s\003\031\002\217\002=\002>\001s\000\000\000\000\002\194\002A\000\000\002\193\000\242\002\154\001;\000\000\000\000\002\215\002\154\001\153\002\196\002\159\0011\000\000\000\000\0012\002\159\000\000\0013\0014\005\214\000\000\000\000\000\000\002\185\002\191\002=\002>\001s\002\185\002\217\002\197\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\002\154\000\000\0015\000\000\000\000\001?\000\000\000\000\002\159\000\000\000\000\000\000\002=\002>\001s\003%\000\000\000\000\000\000\001r\001s\002\185\002\194\000\000\000\000\000\000\000\000\002\154\002\197\000\000\000\000\002\215\000\000\001\153\002\196\002\159\000\000\000\000\000\000\001t\001\151\000\000\001v\001w\000\000\000\000\000\000\002\191\002\185\000\000\000\000\000\000\002\191\003+\002\217\000\000\000\000\000\000\000\000\002A\002\194\002\193\000\242\000\000\002A\000\000\002\193\000\242\000\000\002\215\000\000\001\153\002\196\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\191\000\000\000\000\000\000\000\000\002\154\002\197\002\217\000\000\000\000\000\000\002\197\002A\002\159\002\193\000\242\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\191\000\000\000\000\000\000\0031\002\154\001{\000\000\000\000\0037\000\000\002\194\002A\002\159\002\193\000\242\002\194\002\197\001|\000\000\002\215\000\242\001\153\002\196\000\000\002\215\002\185\001\153\002\196\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003=\002\217\002\197\002\154\000\000\000\000\002\217\002\194\000\000\000\000\000\000\002\159\000\000\000\000\000\000\000\000\002\215\000\000\001\153\002\196\000\000\002\191\000\000\000\000\002\185\000\000\000\000\003C\000\000\000\000\000\000\000\000\000\000\002A\002\194\002\193\000\242\000\000\000\000\002\217\001\143\000\000\000\000\002\215\000\000\001\153\002\196\000\000\002\191\001\152\000\000\001\153\001z\002=\002>\001s\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\002\197\002\217\000\000\002\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\159\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\191\002\185\003I\000\000\002\197\000\000\000\000\000\000\000\000\002\194\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\002\215\000\000\001\153\002\196\000\000\002=\002>\001s\000\000\000\000\000\000\003O\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\002\154\000\000\000\000\002\217\000\000\000\000\002\197\002\215\002\159\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002=\002>\001s\000\000\000\000\002\191\000\000\000\000\002\217\003U\000\000\000\000\000\000\000\000\000\000\002\154\002\194\002A\000\000\002\193\000\242\000\000\000\000\002\159\000\000\002\215\000\000\001\153\002\196\000\000\000\000\002=\002>\001s\000\000\000\000\002\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\154\000\000\002\217\002\197\000\000\000\000\000\000\000\000\002\159\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\191\000\000\000\000\000\000\002\185\002=\002>\001s\000\000\000\000\000\000\003[\002A\000\000\002\193\000\242\000\000\000\000\002\194\000\000\002\154\000\000\000\000\000\000\000\000\000\000\000\000\002\215\002\159\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\002\191\000\000\000\000\000\000\002\185\000\000\000\000\002\197\000\000\000\000\000\000\000\000\002A\002\217\002\193\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\000\000\000\000\002\191\003\192\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\002\154\000\000\002A\002\197\002\193\000\242\000\000\002\215\002\159\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002=\002>\001s\000\000\000\000\002\191\003\202\000\000\002\217\000\000\000\000\000\000\002\197\002\194\000\000\002\154\000\000\002A\000\000\002\193\000\242\000\000\002\215\002\159\001\153\002\196\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\002\185\003\212\000\000\000\000\000\000\000\000\000\000\002\154\002\194\002\217\000\000\000\000\000\000\002\197\000\000\002\159\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\002\191\002\185\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\003\222\002A\002\217\002\193\000\242\000\000\002\154\002\194\000\000\000\000\000\000\000\000\000\000\000\000\002\159\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\002\191\002\185\000\000\000\000\000\000\000\000\000\000\002\197\000\000\000\000\000\000\000\000\002A\002\217\002\193\000\242\000\000\000\000\002=\002>\001s\000\000\000\000\002=\002>\001s\000\000\000\000\002\191\000\000\000\000\000\000\003\231\002\154\000\000\000\000\000\000\000\000\002\154\002\194\002A\002\159\002\193\000\242\002\197\000\000\002\159\000\000\002\215\000\000\001\153\002\196\000\000\000\000\002\185\000\000\000\000\000\000\000\000\002\185\002=\002>\001s\000\000\000\000\002\191\000\000\000\000\000\000\003\240\000\000\002\217\002\197\000\000\000\000\002\154\002\194\002A\000\000\002\193\000\242\000\000\000\000\002\159\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\185\003\251\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\001#\002\217\002\197\000\000\000\000\000\000\002\215\000\000\001\153\002\196\000\000\002\191\000\000\000\000\000\000\000\000\002\191\000\000\002=\002>\001s\000\000\000\000\002A\000\000\002\193\000\242\004\004\002A\002\217\002\193\000\242\000\000\002\154\002\194\002=\002>\001s\000\000\000\000\000\000\002\159\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\002\154\000\000\000\000\002\191\002\185\002\197\000\000\000\000\002\159\000\000\002\197\000\000\000\000\000\000\000\000\002A\002\217\002\193\000\242\000\000\000\000\002\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001#\004\r\001#\001$\000\000\001$\004\020\000\000\002\194\001(\000\000\000\000\000\000\002\194\000\000\000\000\000\000\002\215\002\197\001\153\002\196\000\000\002\215\000\000\001\153\002\196\001)\001&\000\000\001&\000\000\000\000\001\027\001/\000\000\000\000\000\000\004\178\000\000\002\191\002\217\000\000\000\000\004B\000\000\002\217\000\000\000\000\000\000\000\000\002\194\002A\004\181\002\193\000\242\000\000\002\191\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\001,\000\000\001,\000\000\000\000\000\000\000\000\000\000\000\000\002\217\002\197\000\000\000\000\0011\000\000\001(\0012\001(\000\000\0013\0014\000\000\000\000\000\000\000\000\000\000\000\000\002\197\000\000\000\000\001#\000\000\001)\001$\001)\004A\000\000\000\000\001\027\001/\001\027\001/\002\194\000\000\004\205\000\000\000\000\000\000\000\000\000\000\000\000\002\215\004H\001\153\002\196\001r\001s\001&\000\000\002\194\001#\000\000\006\200\001$\000\000\000\000\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\002\217\001t\001\132\000\000\001v\001w\001#\000\000\000\000\001$\001;\000\000\001;\001&\000\000\000\000\000\000\002\217\0011\000\000\0011\0012\000\000\0012\0013\0014\0013\0014\005\227\001,\000\000\005\230\000\000\001&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001(\001\133\000\000\001\134\007\231\0015\007\233\0015\004\185\000\000\001?\000\000\000\000\000\000\000\000\001,\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\000\000\000\000\001(\007\203\002=\002>\001s\001,\001\141\001r\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\001|\000\000\001(\000\242\000\000\001\027\001/\004v\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\001)\000\000\001;\000\000\000\000\000\000\001\027\001/\000\000\000\000\0011\000\000\001#\0012\000\000\001$\0013\0014\005\214\000\000\000\000\000\000\001#\000\000\000\000\001$\000\000\000\000\000\000\000\000\000\000\000\000\001;\000\000\001\133\000\000\001\134\0077\000\000\001&\0011\0015\000\000\0012\001?\001\143\0013\0014\005\227\001&\000\000\006\246\001;\000\000\001\144\001#\001\153\001z\001$\000\000\0011\000\000\000\000\0012\000\000\002@\0013\0014\007\204\001\141\000\000\0015\000\000\000\000\001?\000\000\000\000\002A\000\000\002\193\000\242\001|\001&\000\000\000\242\001,\000\000\000\000\000\000\000\000\001P\0015\000\000\000\000\001?\001,\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\001)\001,\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\001r\001s\000\000\002\194\000\000\001(\000\000\001\143\000\000\000\000\000\000\000\000\002\195\000\000\001\153\002\196\001\144\000\000\001\153\001z\001t\001\132\001)\001v\001w\000\000\000\000\000\000\001\027\001/\000\000\001;\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0011\000\000\001;\0012\000\000\000\000\0013\0014\001f\000\000\0011\000\000\000\000\0012\000\000\000\000\0013\0014\001<\000\000\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\001\190\000\000\000\000\0015\001r\001s\001?\001;\000\000\000\000\001r\001s\000\000\0015\000\000\0011\001?\000\000\0012\000\000\000\000\0013\0014\000\000\001t\001\132\000\000\001v\001w\000\000\001t\001\132\001\141\001v\001w\001r\001s\000\000\000\000\000\000\001r\001s\000\000\000\000\001|\000\000\0015\000\242\000\000\001T\000\000\000\000\000\000\000\000\000\000\001t\001\132\000\000\001v\001w\001t\001\132\000\000\001v\001w\000\000\001r\001s\001\133\000\000\001\134\001\178\000\000\000\000\001\133\000\000\001\134\001\175\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\001\136\001\141\001\133\000\000\001\134\001\139\001\143\001\141\000\000\000\000\000\000\000\000\000\000\001|\000\000\001\144\000\242\001\153\001z\001|\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\001\142\001\141\001r\001s\000\000\000\000\001\141\001r\001s\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\001|\000\000\000\000\000\242\001t\001\132\000\000\001v\001w\001t\001\132\000\000\001v\001w\001\141\000\000\000\000\000\000\000\000\000\000\001#\000\000\000\000\001$\000\000\000\000\001|\000\000\001\143\000\242\000\000\000\000\000\000\000\000\001\143\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\001\144\000\000\001\153\001z\001&\001\133\000\000\001\134\001\174\000\000\001\133\000\000\001\134\001\162\000\000\000\000\001\143\000\000\000\000\000\000\000\000\001\143\000\000\000\000\000\000\001\144\000\000\001\153\001z\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\000\000\001\141\000\000\000\000\000\000\000\000\001\141\000\000\001\143\001r\001s\001,\000\000\001|\000\000\000\000\000\242\001\144\001|\001\153\001z\000\242\000\000\000\000\000\000\000\000\001(\000\000\000\000\001t\001\132\000\000\001v\001w\001#\000\000\000\000\001$\000\000\000\000\000\000\000\000\000\000\001)\001#\000\000\000\000\001$\000\000\001\027\001/\000\000\000\000\001#\000\000\000\000\001$\000\000\000\000\000\000\000\000\001&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001&\000\000\001\133\000\000\001\134\001\170\001\143\000\000\000\000\001&\000\000\001\143\000\000\000\000\000\000\001\144\000\000\001\153\001z\000\000\001\144\000\000\001\153\001z\001;\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\000\0012\001,\001\141\0013\0014\001\165\000\000\000\000\000\000\000\000\000\000\001,\000\000\000\000\001|\000\000\001(\000\242\000\000\000\000\001,\000\000\000\000\000\000\000\000\000\000\001(\000\000\0015\000\000\000\000\001?\000\000\001)\000\000\001(\000\000\000\000\000\000\001\027\001/\000\000\000\000\001)\002=\002>\001s\000\000\000\000\001\027\001/\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\000\000\000\000\001#\000\000\004f\001$\000\000\000\000\000\000\000\000\000\000\004n\000\000\000\000\000\000\001\143\000\000\000\000\000\000\000\000\000\000\000\000\001;\000\000\001\144\000\000\001\153\001z\000\000\001&\0011\001#\001;\0012\001$\004{\0013\0014\001\206\000\000\0011\001;\000\000\0012\000\000\000\000\0013\0014\001\246\0011\000\000\001#\0012\000\000\001$\0013\0014\001\248\001&\000\000\001#\0015\000\000\001$\001?\001r\001s\000\000\000\000\000\000\000\000\0015\000\000\000\000\001?\001,\000\000\000\000\001&\000\000\0015\002@\000\000\001?\000\000\001t\001\132\001&\001v\001w\001(\000\000\000\000\004r\000\000\002\193\000\242\001\006\000\000\000\000\000\000\000\000\000\000\000\000\001,\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\001,\000\000\000\000\000\000\000\000\001\133\004i\001\134\002\139\001,\000\000\000\000\001)\000\000\000\000\001(\000\000\000\000\001\027\001/\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\002\194\000\000\001;\000\000\000\000\001\027\001/\001\141\001)\002\195\0011\001\153\002\196\0012\001\027\001/\0013\0014\002T\001|\000\000\000\000\000\242\001#\000\000\000\000\001$\000\000\000\000\000\000\000\000\001;\000\000\000\000\001#\000\000\000\000\006\011\000\000\0011\000\000\0015\0012\000\000\001?\0013\0014\002g\000\000\000\000\001&\001;\001#\000\000\000\000\001$\000\000\000\000\000\000\0011\001;\001&\0012\000\000\000\000\0013\0014\002\165\0011\000\000\0015\0012\000\000\001?\0013\0014\002\170\000\000\000\000\001&\000\000\001#\000\000\001\143\001$\000\000\001r\001s\000\000\000\000\0015\000\000\001\144\001?\001\153\001z\001,\000\000\000\000\0015\000\000\000\000\001?\000\000\000\000\000\000\001t\001\132\001&\001v\001w\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001(\000\000\000\000\001,\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\001)\001(\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\001\133\000\000\001\134\003\132\001,\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001;\000\000\000\000\000\000\000\000\001\141\001)\000\000\0011\000\000\000\000\0012\001\027\001/\0013\0014\003e\001|\000\000\0011\000\242\000\000\0012\000\000\000\000\0013\0014\000\000\000\000\001;\000\000\000\000\001r\001s\000\000\000\000\000\000\0011\000\000\0015\0012\000\000\001?\0013\0014\003l\000\000\000\000\000\000\000\000\0015\000\000\001t\001\132\000\000\001v\001w\000\000\001;\001r\001s\000\000\000\000\000\000\000\000\000\000\0011\000\000\0015\0012\000\000\001?\0013\0014\003|\000\000\000\000\000\000\000\000\001t\001\132\001\143\001v\001w\001r\001s\000\000\002=\002>\001s\001\144\000\000\001\153\001z\000\000\000\000\001\133\0015\001\134\003\135\001?\000\000\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\004f\000\000\001r\001s\000\000\000\000\000\000\004n\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\003\138\000\000\000\000\000\000\000\000\001\141\001t\001\132\000\000\001v\001w\001#\000\000\000\000\001$\004o\000\000\001|\000\000\000\000\000\242\000\000\001\133\000\000\001\134\003\146\000\000\000\000\000\000\000\000\000\000\000\000\001\141\000\000\000\000\000\000\000\000\000\000\001&\000\000\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\001\133\001#\001\134\005;\001$\000\000\000\000\001\141\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\004r\000\000\002\193\000\242\001\006\001&\000\000\000\000\001\143\000\000\000\000\001,\001\141\001#\000\000\000\000\001$\001\144\000\000\001\153\001z\000\000\000\000\000\000\001|\000\000\001(\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\143\000\000\004i\000\000\000\000\001&\000\000\000\000\001)\001\144\000\000\001\153\001z\000\000\001\027\001/\001,\000\000\001#\000\000\000\000\001$\000\000\000\000\000\000\001\143\000\000\000\000\000\000\002\194\000\000\001(\000\000\000\000\001\144\000\000\001\153\001z\002\195\000\000\001\153\002\196\000\000\000\000\000\000\001&\000\000\000\000\001)\000\000\000\000\001,\000\000\001\143\001\027\001/\000\000\000\000\000\000\000\000\001;\000\000\001\144\000\000\001\153\001z\001(\001#\0011\000\000\001$\0012\000\000\000\000\0013\0014\005L\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\001,\000\000\001#\001&\000\000\006\b\000\000\000\000\0015\001;\000\000\001?\000\000\000\000\000\000\001(\000\000\0011\000\000\000\000\0012\000\000\000\000\0013\0014\005\175\000\000\000\000\000\000\001&\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\000\000\001;\000\000\000\000\001#\0015\001,\006\b\001?\0011\000\000\000\000\0012\000\000\000\000\0013\0014\005\187\000\000\000\000\000\000\001(\000\000\001#\000\000\000\000\006\b\000\000\000\000\000\000\000\000\001&\006\n\000\000\000\000\000\000\000\000\000\000\001)\000\000\0015\001;\000\000\001?\001\027\001/\000\000\001(\000\000\0011\001&\000\000\0012\000\000\000\000\0013\0014\005\213\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\001#\000\000\000\000\006\b\001\027\006\r\000\000\000\000\000\000\000\000\000\000\006\n\000\000\000\000\0015\000\000\000\000\001?\000\000\001#\000\000\000\000\001$\000\000\001;\000\000\001(\001&\000\000\000\000\006\n\000\000\0011\000\000\000\000\0012\000\000\000\000\0013\0014\005\229\000\000\000\000\001)\000\000\001(\001&\000\000\000\000\001\027\006\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\000\006\014\001)\0015\0013\0014\001?\000\000\001\027\006\r\000\000\000\000\000\000\006\n\005\216\000\000\006\018\000\000\006\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001(\0015\001#\000\000\001,\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0011\000\000\001)\006\014\001(\000\000\0013\0014\001\027\006\r\000\000\000\000\000\000\000\000\001&\000\000\005\216\000\000\006\017\0011\006\016\001)\006\014\000\000\000\000\0013\0014\001\027\001/\000\000\001#\0015\000\000\001$\000\000\005\216\000\000\006\015\000\000\006\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0015\000\000\001#\000\000\000\000\006\b\000\000\001&\000\000\000\000\001,\000\000\0011\000\000\000\000\006\014\000\000\000\000\0013\0014\000\000\000\000\000\000\001;\000\000\001(\000\000\000\000\005\216\001&\006\027\0011\006\016\000\000\0012\000\000\000\000\0013\0014\006\130\000\000\000\000\001)\0015\001#\000\000\000\000\006\b\001\027\001/\000\000\000\000\000\000\001,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0015\000\000\000\000\001?\001#\000\000\001(\001$\000\000\001&\000\000\000\000\000\000\006\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001#\001)\000\000\001$\000\000\000\000\001(\001\027\001/\001&\001;\000\000\001#\000\000\000\000\001$\000\000\000\000\0011\000\000\000\000\0012\000\000\001)\0013\0014\006\148\001&\000\000\001\027\006\r\000\000\000\000\006\n\000\000\000\000\000\000\000\000\000\000\001&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001#\001(\0015\001$\000\000\001?\001;\000\000\001,\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\000\0012\001)\000\000\0013\0014\006\172\001(\001\027\006\r\001,\001&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0011\000\000\001,\006\014\001)\001(\0013\0014\000\000\0015\001\027\001/\001?\000\000\000\000\000\000\005\216\001(\006\232\000\000\006\016\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\0015\001#\000\000\001)\001$\000\000\001,\000\000\000\000\001\027\001/\0011\000\000\000\000\006\014\000\000\000\000\0013\0014\001#\000\000\001(\001$\000\000\000\000\001;\000\000\005\216\001&\007\002\000\000\006\016\000\000\0011\000\000\000\000\0012\000\000\001)\0013\0014\007:\0015\001;\001\027\001/\001&\000\000\000\000\000\000\000\000\0011\000\000\000\000\0012\001;\000\000\0013\0014\007|\001r\001s\000\000\0011\0015\000\000\0012\001?\000\000\0013\0014\007\127\000\000\000\000\001,\000\000\000\000\000\000\000\000\000\000\001t\002s\0015\001v\001w\001?\000\000\000\000\000\000\001(\001;\000\000\001,\000\000\0015\000\000\000\000\001?\0011\001r\001s\0012\000\000\000\000\0013\0014\001)\001(\000\000\000\000\000\000\000\000\001\027\001/\000\000\001r\001s\000\000\000\000\001t\002s\000\000\001v\001w\001)\001r\001s\000\000\000\000\0015\001\027\001/\001\241\000\000\000\000\001t\002s\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\001t\002s\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\001;\001{\000\000\001#\000\000\000\000\001$\000\000\0011\000\000\000\000\0012\000\000\001|\0013\0014\000\242\000\000\001;\000\000\004\021\000\000\002=\002>\001s\000\000\0011\000\000\000\000\0012\001&\000\000\0013\0014\000\000\000\000\000\000\000\000\000\000\0015\001{\000\000\001\243\000\000\006\211\002?\000\000\001#\006\205\000\000\001$\000\000\001|\000\000\000\000\000\242\001{\0015\000\000\000\000\004\180\000\000\000\000\000\000\000\000\000\000\001{\000\000\001|\000\000\000\000\000\242\000\000\000\000\001&\000\000\001,\001\143\001|\000\000\000\000\000\242\000\000\000\000\000\000\000\000\001\152\006\205\001\153\001z\000\000\001(\000\000\000\000\000\000\000\000\000\000\002@\000\000\006\218\000\000\000\000\000\000\007\005\000\000\000\000\000\000\000\000\001)\002A\000\000\002\193\000\242\007\005\001\027\001/\001\143\002=\002>\001s\001,\000\000\002@\000\000\000\000\001\152\000\000\001\153\001z\000\000\000\000\000\000\001\143\000\000\002A\001(\002\193\000\242\006\217\000\000\002\144\001\152\001\143\001\153\001z\004\024\001r\001s\000\000\000\000\000\000\001\152\001)\001\153\001z\007\006\000\000\000\000\001\027\001/\0010\000\000\000\000\000\000\000\000\007\014\001t\002r\0011\001v\001w\0012\000\000\002\194\0013\0014\000\000\002=\002>\001s\000\000\000\000\002\195\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\194\0015\002\146\002=\002>\001s\007u\000\000\000\000\002\195\000\000\001\153\002\196\000\000\0011\000\000\000\000\0012\000\000\002@\0013\0014\000\000\000\000\000\000\000\000\002\177\002=\002>\001s\000\000\002A\000\000\002\193\000\242\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\0015\000\000\001{\000\000\000\000\002\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001|\002\216\000\000\000\242\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\003\181\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\002\195\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\001\143\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\001\152\000\000\001\153\001z\000\000\002@\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\002\195\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\195\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\195\002\194\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\002\195\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\195\000\000\001\153\002\196")) + ((16, "\001\164\001\141\000G\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\000\000\000\000\000\239\000\006\000)\001{\000\219\001X\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\029\022\000\000\000\000\000\000\000v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022N\001p\000\000\001\244\000\145\001|\000\000\000\000\000\000\001\006Vj\002\016\0018\001\238\000\000\000\000\000\000\002(\000\000\000\000\000\222\000\000\000\000\000\000\000\000\003\154\000\000\002\130\000\000\000\000\000\000\000\000\000\000\000(\000\000\002\184\003\228\b\184\000\000\000\000\n6\022N\000\000\000\000\016N\000\000\017\210\000\0008&\001\246\003\006\000\000\000\000\002\192\001\182\004\194\005\150\003\002\003\228\004`\000\t\001\248\0008\003~\002L\r\174\000\000\007\200\003\212\002\150\004\bID\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\176\000\000\0042\002\220\005(\000\000\000\000\000\000\000\000\005(\000\000\000\000\002\244\001n\003\b\0064\007\160\000\000\000\000\000\000\004\166\004\174\003n\001\172\000\000\000\000\003b\003\1683\234\004\204\003\170\001\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\022\000\000\000\000\000\000\004\234\004R\014\002\004\210\007\200 d\000\0008r\001\184909\164\000\000\001\024\000\000\000\000\000\000\000\000\005\178I\014\005\200\000\000\011\004\005\228\000\000\0110\r\170\000\203\000\000\000\165\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\190\005\136\000\000\000\000\000\000I\004\000\000\nb\000\000\000\000\005\142I\156\018$\000\000Xr\000\000\000\000\000\000\000\000\000\000\000\000\003P\030\024\003P\000y\000\000\000\000\000\000\005n\000\000\000\000\000\000\000\000\005\228\000\000\000\000\003P\000\000\000\000\000\000\000\000\000\000\014\166\000\000\004\212\006p\000\000I\254\004\228V\012\000\000\000\000\000\000\000\000\005n\000\000\000\000\000\000\011\234\000\000\000\000\000\000\000\000\000\000\000\000\003\244\006~\000\000\000\000\000\000\005n\006\166J\152\006\000\004\238#\238\000\000\003l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000T\000\000\000\000\000\000\000\000\007\132J\168\000\000\000\000\006\128\006\nJ\230\000\000\000\000\000\000K \006zK\168\000\000\006z\000\000K\180\006z\000\000L \015\176\007T\007\196\000\000\000\000-\022\000\000\000\000\000\000\000\000\000\000\000\000\006z\000\000\000\000L<\000\000\006zK\238\000\000\005n\000\000\000\000L\136\000\000\006z\001\152\000\000\000\000\006z\006z\000\000\000\000\006z\000\000\000\0009\164\000\000\000\000\000\000\000\000\006z9\220\000\000\000\000\006z\000\000\001F\007\218\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\018\000\000\007p\000\000L\184\005n\000\000\000\000\000\000\000\000\007\140\bf\014V\007\190\007\212\007\226\006l\004t\006\162\002\028\b\132\000\000\000\000\005\178\007\016\000\000\007\232\006\208\002j\b:\011H\000\000\004,\003*\006\222\000\174\t\156\000\000\000\000V\148\000\000V\192\t@\000\000L\226\005nL\252\005n\000\000\002\026\000\239\000\000\011\134\004,\000\000\000\000\b\182\000\000\000\000\000\000\000\000\000\000\012\016\004,\0122\004,\000\000\000G\000\000\000\000\000\r\000\000\000\000\000\000\n<\000\000\000\000\000\000\004,\004,\000\000\000\000\004,\000\000\b:\005B\000\000\000\133\003b\000\000\000\133\000\000\000\000\r@\004,\000\000\000\000\000\000\000\000\000\000\000\000\000\133\015\130 n\n\000\t\2029f\006\210\000\000\t*\007L\015\140\t6\007V/\1449v\000\000\000\000\000\000\000\000\000\000\005\002\012\n\000\000\000\000\000\000\tL\007|\005\202\000\133\r\152\000\000\004,\000\000\000\000\000\000\001\184\000\000M&\005n\015\192\t~\007\152\016z\t\152\007\158\006\178:L\006z\016\174\t\154\007\178:>\n\142\000\000:\224\006zM\190\005n\n\148\000\000\000\000\000\000\000\000\015\176\nv\000\000\000\000E\210\000\000\000\000W\024\000\000\000\000\n\188\"\250\003P\000\000\016\184\n\016\007\196!f\000\000:\146\n$\b\b!p\000\000;h\000\000\000\000\nF\b\014Nh\006z\017x\nN\b\030J\026\000\000T\156\000\000\000\000\"\018\nR\bZ\"\n\000\000\"l;\184\nv\br\"\210\000\0001\234\000\000\000\000\011\200N\"\000\000\005nC^\000\000\005nN\162\005n\000\000\000\000\000\000\000\000\000\000Y\154\000\000\000\000\000\000\001\202\017\130\000\000\000\000\000\000\000\000<\012\n\130\b\158#\014\000\000Z6\000\000\000\000\000\000\000\000\000\000\nX\018B\000\000\000\000\nj<\020\n\166\b\162#v\000\000\nj<`\n\182\t6#\168\000\000\nj\000\000ZV\000\000<\180\n\192\tt$\016\000\000\nj\018v\0024\018\128\000\000\000\000=\026\n\194\t\130$J\000\000\nj=\158\n\196\t\150$\136\000\000\nj=\198\n\210\t\210%\018\000\000\nj>\134\n\224\t\218%H\000\000\nj>\154\n\232\t\220%\180\000\000\nj>\174\n\238\t\246%\232\000\000\nj?T\n\250\n\004&\028\000\000\nj?\168\011\000\n\006&N\000\000\nj?\188\011\030\n\016&\176\000\000\nj@\\\0110\n\"&\238\000\000\nj@h\011:\n&'T\000\000\nj@\144\011N\nL'\182\000\000\njAP\011V\nV'\232\000\000\njAd\011t\nX(P\000\000\njB\016\011z\n\128(Z\000\000\njB$\011\128\n\134(\140\000\000\njB8\011\134\n\166(\244\000\000\njB\134\011\146\n\172)`\000\000\njB\228\011\216\n\178)l\000\000\njC\012\012.\n\180*\006\000\000\nj\n\210*\018\019J\019\254\000\000C^\012\214\000\000N\186\005n\020\006\000\000\000\000\012d\000\000N\228\005n\020Z\000\000\000\000\020\208\000\000\000\000\004\198\000\000\000\000\021\014\000\000\000\000\000\000\000\000N\246\005n\021\216\000\000\012(\021\224\000\000O\230\000\000\006zPb\000\000\006zPn\000\000\006z\005\204\000\000\000\000\000\000\000\000\000\000P\166\006z\000\000\004\230\005\020\000\000\000\000\000\000\nj\022:\000\000\000\000\000\000\022\170\000\000\000\000\000\000\000\000\000\000*r\000\000\000\000\000\000\nj*z\000\000+\026\000\000\000\000\000\000+&\000\000\000\000\000\000\000\000Zf\000\000\000\000,\014\000\000\000\000\000\000C\204\012f\n\226+\158\000\000\nj,\022\000\000\000\000\000\000Dn\012\130\011 ,\182\000\000\nj-\002\000\000\000\000\000\000Dx\012\136\011@-\"\000\000\nj\002\208\022\222\000\000\000\000D\204\012\138\011L-\194\000\000\nj\023\158\000\000\000\000D\212\012\144\011p..\000\000\nj\023\210\000\000\000\000Et\012\154\011v.:\000\000\nj\000\000\000\000.\156\000\000\000\000E\128\012\156\011\154.\206\000\000\nj/<\000\000\000\000E\218\012\166\011\170/D\000\000\nj00\000\000\000\000Fz\012\210\011\1740P\000\000\nj\000\000F\134\012\216\011\1800\158\000\000\nj\000\000)\160\000\000\000\000\nj\000\000\000\000\000\0000\146\000\000\000\0000\252\000\000\000\000\012\222\000\000\000\000\024B\000\000\024\140\000\000\000\000\000\000\nj\000\000\000\000\024\192\000\000\024\202\000\000\000\000\000\000\000\000\000\000F\142\r\002\011\2241\202\000\000Gv\r\014\012\0001\254\000\000\nj\njG~\r4\012\00226\000\000\nj\000\000\012(\025\246\000\000\000\000\026J\000\000G\138\000\000\000\0009v\000\000\000\000\000\0002\164\000\000\000\000\000\000\000\0002\216\000\000\000\000\000\000\000\000\014\140\000\000\000\000\000\000.\240\000\000\000N\000\000\005\242\014.\000\000\003\132\000\000\000\000\000\000\000\000\000\000\000\000\005\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\144\012\n3\174\000\000\nj\000\000\014\188\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\022\b\176\000\133\026R\000\000\r\156\012 \0144\006\166\t\138\000\133\0202\000\000\004,\t\148\000\133\000\000\026\158\000\000\006\222\000\000\r\186\012$\006\000\000\000\000\000\000\000\000\000\000\000\r\228\002b\001(\000\000\000\000\000\000G\204\000\000Wv\000\000\012*\000\000\0120\000\000\000\000\000\000\000\000\002\n\000\000\000\000\000\000*>\003P\000\000\003P\012\182\000\000\005`\000\000*\208\003P\003P\000\000+r\003P\003P\012:\000\000\026\242\000\000\000\000\012B\014\198\000\0003\160\006\022\000\000\000\000\000\000\000\000\000\000\000\000\r\220\012`4R\000\000\nj\000\000\000\000\000\000\000\000\000\000\r\224\012f\t\204\000\133\000\000\021<\000\000\004,\000\000\015>\000\000\000\000\000\000\000\000\000\0004`\000\000\r\246\012l4n\000\000\000\000\000\000\022\146\000\000\004,\000\000\023&\000\000\004,\000\000\024\248\004,\000\000\nj\000\000\000\000\025\140\000\000\004,\000\000\025\224\000\000\004,\000\000\027\176\004,\000\000\000\133\000\000\012\170\t\226\002\b\000\000\014\014\014\016\012\190\014D\015J\027\206\004,\007v\000\000\012\200\015\030\015@\006\228\007\154\015\012\012\206\015F\007\232\b\152\015\024\000\000\000\000\b\168\t\014\000\000\003\234\003fP\222\006z\027\222\000\000\007\190\001D\014\200\012\218\n$\004\252\000\000\014\202\r\014\tl\000\0005\012\000\000P\168\005n\000\000\015v\015\128\000\000\tT\000\000\005n\014\230\r\026\007\254\015\006\000\223\000\000\000\000\000\000\000\000\r \t\206\000\000\r&\t\230\000\000\b|X\176\014\238\014\240\r*\004\152\n.\000\000\r<\005\234\nx\000\000\014\244\014\250\rH\0152\015J\031\182\004,\000\000\r\\\015\156\000\000\007\022\000\000\n\130\000\000\015\168\000\000 \006\234\015t\rr\015\210\000\000 x\007\018\015\176\000\000\000\000\003\194\002\212\000\000\n\168\000\000!6\004,\011P\000\000\004\b\000\000\000\000\015d\r\152$\022\007N\000\000\015f\r\154\bt\015\006\015n\015p\r\156\016\224\000\000\015\142\0014\000\000\000\000\000\000\000\000\001\254\r\158\015dQj\005n\000\000\002\020\r\164\016$\000\000\000\000\000\000\000\000\000\000\000\000Q\132\b\000\000\000\r\172\016\128\000\000\000\000\000\000\000\000\000\000\000\0005H\011l\000\000\r\184\003F\000\000\r\212\r\216\004\226\000\000\007l\030\134\000\000\000\230\000\000Q\234\005n\005n\000\000\000\000\b \000\000\007`\000\000\br\b \b \000\000\r\234!\188\005nR&\005n\011r\000\000\000\000\000\000\000\000\011\200\000\000\000\000\003,\000\000\bb\015\224\014\n\017\002\015\178\000\000\000\000\t\174\b\134\015\248\000\000\000\000\014P\017\026\015\192\000\000\000\000RN\000\000\021\142\000\000Rx\012x\005n\000\000S\022PB\000\000SN\000\000\000\000\000\000\b \000\000\000\000\012,\016\004\014R\017 \015\214\000\000\000\000S^\012\128\016 \000\000\000\000\000\000X\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\130\000\000\0160\014T\007J\000\000\017.\016\224\012\134\016<\000\000\000\000\016@\014X\b^\000\000\000\000\t\030\r\170\004\172\000\000\000\000\000\000\b\200\016\004\014^\000\000\016\b\b\200\000\000\016\234\012\156\016H\000\000\000\000\000\000\005n\003\176\006\200\005\012\000\000\000\000\000\000\000\000\016\012\014p\000\000\005\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005n\015\242\014~\017\\\016\002\000\000\b\216\000\221\014\134\015\212\000q\000\212\014\140\016\152\000\000\017R\028\000\000\000\000\000\028(\000\000\r\004\000\000\001\"\000\000\000\000\000\000\000\000\000\000\000\000T\000\005n\000\000\017T\028\\\000\000\000\000\028\204\000\000\000\161\014\142\016\248\000\000\000\0005z5\246\016\166\000\000TB\005n\029\192\000\000\000\000\029\226\000\000\000\000\rZ\000\000\001\192\000\000\000\000\000\000\000\000\000\000\000\0006\134\000\000\000\0006\"6\222\016\168\000\000TT\005n\0300\000\000\000\000\030\138\000\000\000\000\014\144\031\\\r\150\000\000\014\154\014\160\000\191\000\161\014\196\t\"\014\198\017\0027x\r\194\000\000\014\204\014\240\b\178\000\000\000\133G\242\000\000\002\246\000\000\014\242\004\230W\142\0014\015\212\002t\000\000@|)\160\000\000\005\252\000\000\000\000\005\252\000\000\000\000\005\252\b\232\000\000\002\142\005\252\017\0067\130\r\216\000\000\005\252\000\000\000\000T\214\000\000\000\000\000\000\005\252\000\000\000\000\r\232\000\000\003\174\t\232\014\002\000\000\014\246H:\014\018\000\000\000\000\000\000\000\000\014\020\000\000\000\000\004d\000\000\005\252U\002\000\000\004\022\005\252W\214\000\000\014P\016h\014\254\017\142\0164\000\000X@\014\178\016v\000\000\000\000\000\000\000T\007\190\000\000\000\000\000\000\000\000\000\000\000\000\nX\014\208\000\000\016\134\000\000\000\000\000\000\000\000\014\228Y \000\000\000\000\000\000\nX\000\000\000\000\000\000\000\000\0158Y\176\000\000\000\000\000\000\000\000\000\000\000\133\004,\000\000\000\000\006z\000\000U(\005n\000\000\005x\000\000\000\000\000\000\000\0008*\000\000\000\000\000\000\000\000\000\000\000\000\0170\006\b\t|\016\004\005\250\015\b\000\000\002,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\012\006\024\015\n\000\000\b\006\017\146\017F\015H\000\000\000\000\017:\006\220\002\192\000\000\000\000\000\000\0150\000\000\0156\019\202\000\000\000\000\003P D\000\000\000\000\000\000\000\000\000\000X\180\000\000\000\000\b\212\007@\000\000\000\000U\184\005n\005nU\202\005n\006\162\000\000\000\000\000\000\005n\000\000\000\000\tf\017T\015\176\000\000\000\000\017H\003\170\000\028\000\000\000\000\000\000\000\000\b\234\017\146\t\244\017Z\015\186\000\000\000\000\017P\003\182\000z\000\000\000\000\000\000\000\000\004,\000\000\016\000\000\000\000\000\000\000\031\154\000\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\031\138\000\000\000\000\000\000\001\004\000w\000\000\000\000\000\000\000\000\000\000\002\006\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\024\000\000\000\000\000\000H\160\000\000\005n\000\000\r`\000\000\000\000\000\000\003t\000\000\000\000\000\000\001\142\000\000\000\000\000\000\000\003\000\000\000\133\000\000\006\"\000\000\004,\000\000\004\154\000\000\000\000\000\000>>\006z\000\000\000\000\002\004\000\000\000\000\000\000\000\000\005\002\004r\016\136\000\023\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025>\000\000\016\022\000\000\000\000\000\000\000\000\005F\007\"\000\r\002\216\000\000\000\000\016\024\0278\000\000\000\000\000\000\016$X\198\000\000\000\000\000\000\000\000"), (16, "\007\018\000;\002=\002>\001s\000\238\001\252\0007\000\242\000\243\000?\007\248\002>\001s\007\018\003\149\002\000\002\154\007\019\007\"\002\004\007\021\001\027\005Z\000\238\002\159\000\242\000\242\000\243\b\007\007\022\007#\b\b\0007\001\020\007\021\002*\007\168\002\185\000\238\001\027\001\030\000\242\000\243\007\022\0007\000\151\000@\007\018\000\160\002=\002>\001s\001\023\000\238\006\207\000m\000\242\000\243\001\027\007\023\002\005\007\018\006\155\007&\002\154\007\019\007\"\000\238\007\021\006\207\000\242\000\243\002\159\007\023\001\020\006\157\003\149\007\022\007#\007\019\001\027\001\030\007\021\000\131\006\207\002\185\005\026\006\209\001y\000\244\004h\007\022\006\248\007\220\003\149\005]\007\024\001\153\006\207\002\r\002\031\002\191\006\209\006\210\000\245\001\027\007\025\007\023\006\212\001\031\007\024\007&\007\000\002A\000\245\002\193\000\242\006\209\006\210\006\251\007\025\007\023\007\249\006\212\002\193\000\242\006x\006\235\002\016\007\221\007'\006\209\002,\006\210\001\027\000\242\000\151\006\253\006\212\000\156\b\n\003\149\006\228\000\245\007\024\007(\000\\\006\210\007G\002\191\0019\000\245\006\212\007\185\007\025\007\028\006\219\002+\007\024\007\027\007\030\002A\006\127\002\193\000\242\006\254\007\144\002\200\007\025\007\028\002\201\000\157\000\238\007 \007\030\000\242\001\006\002\194\007'\000\151\000`\007\018\000\156\002=\002>\001s\002\215\007 \001\153\002\196\000:\007!\007\026\007(\000q\001s\002-\007\145\002\154\007\019\007\"\000d\007\021\007\028\007\166\007!\002\159\007\027\007\030\004i\002\217\007\022\007#\007\158\005\167\002\200\0009\007\028\002\201\002\185\000\238\007 \007\030\000\242\001\006\002\194\001\173\001s\000=\007\018\007\186\002=\002>\001s\002\215\007 \001\153\002\196\000y\007!\006\162\007\023\001\201\001s\007\145\007&\002\154\007\019\007\174\001\020\007\021\001z\007E\007!\002\159\001\027\001\030\001\237\002\217\007\022\007#\006z\001t\002R\007\187\001v\001w\002\185\006\131\007\194\001\027\004\175\000\151\000\238\007\148\001\249\000\242\001\006\007\024\007\236\002>\001s\007\192\002\191\002\031\001\007\000\136\000\238\007\025\007\023\000\242\000\243\0007\0007\007\216\002A\000\238\002\193\000\242\000\242\001\006\000\151\006\166\000\161\001\249\004J\003\143\003\144\001\196\007\195\001\n\000\139\007'\0074\001\232\002\031\002,\007\162\006\207\000\242\004\186\004\188\004\190\0007\002\000\005\211\007\024\007(\002\004\000\245\001\027\002\191\007\217\001\n\001#\000\242\007\025\007\028\007\196\002\029\003\149\001\141\007\030\002A\005\025\002\193\000\242\002,\007\238\002\200\000\242\006\209\002\201\001|\000\245\007 \000\242\007\197\003\149\002\194\007'\002*\003\162\000\128\004\191\000\242\001\006\006\210\002\215\002\005\001\153\002\196\006\212\007!\000\181\007(\006\216\007\140\001\230\000\245\002-\004M\004R\007\018\004\175\007\028\007)\002\006\007\176\001\020\007\030\007\239\002\217\002\193\000\242\001\027\001\030\002\200\b\007\003\179\002\201\b\b\002\011\007 \007\021\000\242\007\018\002\194\002=\002>\001s\002-\005\030\007\022\007H\005\232\002\215\001\143\001\153\002\196\002\017\007!\001(\002\154\007\019\007\"\001\144\007\021\001\153\001z\007Q\002\159\003\149\004\189\004\188\004\190\007\022\007#\007\193\001)\002\217\005\235\000\245\007\023\002\185\001\027\001/\000\238\000\130\000\191\000\242\000\243\005\215\001:\007\018\002\022\002=\002>\001s\005\237\000\238\007R\000\138\000\242\000\243\005\216\007\023\001n\002\018\005\240\007f\002\154\007\019\007\"\007S\007\021\000\176\000\188\006\207\002\159\007\024\005\238\001\020\002+\007\022\007#\000\196\000\155\001\027\001/\007\025\006\207\002\185\003\241\002\022\005\142\000\242\001\006\000\242\0011\000\154\004m\0012\007\024\007e\0013\0014\002\225\002\191\004\194\b\t\006\209\000\238\007\025\007\023\000\242\000\243\000\245\007+\001\020\002A\000\209\002\193\000\242\006\209\001\027\001/\006\210\000\185\007\027\004\014\004\195\006\212\000\218\002\031\007R\006\213\007'\007\212\007\028\006\210\007\143\0007\000\220\007\030\006\212\006C\007\157\007S\006\223\000\180\007\024\007(\001\020\000\245\005\239\002\191\007 \001\020\001\027\001\030\007\025\007\028\002#\001\027\001/\002,\007\030\002A\000\242\002\193\000\242\001\020\001b\002\200\007!\007\213\002\201\001\027\001/\007 \005\235\001\027\000\238\002\194\007'\000\242\001\006\007\018\000\245\002=\002>\001s\002\215\000\228\001\153\002\196\006\202\007!\005\237\007(\000\245\007\251\007\252\000\238\002\154\007\254\000\242\000\243\007\021\007\028\000\245\005\146\002\159\003\149\007\030\005\215\002\217\007\022\b\000\004i\005\238\002\200\000\233\000\236\002\201\002\185\001e\007 \005\216\002-\000\186\002\194\005\223\000\151\006\207\007\\\001\249\002=\002>\001s\002\215\003t\001\153\002\196\000\190\007!\005\150\007\023\001r\001s\007\146\007\147\002\154\006J\006K\000\238\007\146\007\147\000\242\000\243\002\159\000\245\004u\001s\002\217\005\148\004\242\006\209\001t\002s\002\031\001v\001w\002\185\006[\006T\004\211\000\246\006T\004\211\007\228\006T\004\211\006\210\007\024\005v\006\207\000\195\006\212\002\191\000\245\000\245\006\241\007\018\007\025\002=\002>\001s\b\015\002.\005\148\002A\002,\002\193\000\242\000\242\003\149\000\251\b\007\006\255\002\154\b\b\007\229\003u\007\021\b\003\001#\003\149\002\159\006\209\004\175\005i\002\000\007\022\b\016\0059\002\004\001\027\001\027\003\149\000m\002\185\007=\007(\000\208\006\210\006\251\002\191\002*\000\151\006\212\000\183\001\249\007\028\007\004\000\245\004\191\001{\007\030\002A\007\200\002\193\000\242\007\023\006\253\002\200\001\255\005\206\002\201\001|\000\242\007 \000\242\003\141\001s\002\194\002-\002\005\004\175\006<\004\188\004\190\001U\002\031\002\215\000\245\001\153\002\196\003\151\007!\001S\002\197\006\254\001\232\005Z\001k\0075\000\242\000\212\005D\007\024\003t\005\027\002\000\006\205\002\191\000\227\002\004\002\217\001\027\007\025\003\150\002 \002\200\001(\002,\002\201\002A\000\242\002\193\000\242\000\235\007\018\002\194\002=\002>\001s\006P\004\188\004\190\b\020\001)\002\215\001\143\001\153\002\196\000\250\001\027\001/\002\154\007\019\0071\001\152\007\021\001\153\001z\001g\002\159\002\005\007(\000\245\002\031\007\022\007#\007P\006\218\002\217\007>\000\245\007\028\002\185\001\014\001\232\000\245\007\030\002\027\002\006\007\201\003\149\001\153\002+\002\200\002\000\004j\002\201\001\017\002\004\007 \001\027\002-\002J\002\194\007\023\002,\006\251\006\238\000\242\007\224\001r\001s\002\215\0011\001\153\002\196\0012\007!\001\"\0013\0014\004\175\005m\004\199\006\253\002=\002>\001s\001\027\005Z\001t\001\132\000\242\001v\001w\000\151\002\217\001\236\001\249\002\005\001\232\007\024\001C\007\225\005Z\004\202\002\191\000\242\004f\001>\002\000\007\025\006\254\0045\002\004\004n\001\027\002\006\002A\001\131\002\193\000\242\004\217\007\018\001B\002=\002>\001s\001O\002-\006X\004\188\004\190\006C\001\133\007'\001\134\002]\b\007\004{\002\154\b\b\007d\001d\007\021\007T\007U\001\191\002\159\000\151\007(\006-\001\249\007\022\b\011\002\005\003\149\001j\007V\007W\007\028\002\185\007N\004\175\001\153\007\030\004\171\004\211\001\218\001\141\007X\004\211\002\200\002\006\004\158\002\201\003\149\007Z\007 \001\153\006\214\001|\002\194\007\023\000\242\002@\007\018\000\245\002=\002>\001s\002\215\002\135\001\153\002\196\001\220\007!\004r\001\189\002\193\000\242\001\006\004\162\002\154\007\019\005,\003\149\007\021\002=\002>\001s\002\159\007\130\004\188\004\190\002\217\007\022\007-\001\229\001\232\007\024\001\130\002\024\0007\002\185\002\191\003\149\004\161\005\130\002\000\007\025\004\232\005|\002\004\004i\001\027\000\245\002A\001\027\002\193\000\242\006J\006K\001\140\003\149\001\143\007\023\007a\005\136\001\149\b\014\007T\007U\001\020\001\144\004\161\001\153\001z\004\161\001\027\001\030\002\194\006S\000\245\007V\007W\006T\004\211\005\220\007(\002\195\000\242\001\153\002\196\002\005\001\020\007X\004\211\005\155\007\028\0028\001\027\001\030\007\024\007\030\002;\000\245\000\151\002\191\0067\001\249\002\200\002\006\007\025\002\201\003\149\006\031\007 \005'\001\255\002A\002\194\002\193\000\242\002I\001\148\001#\001\195\002@\001$\002\215\003\149\001\153\002\196\001\207\007!\005-\0070\002X\001\255\002A\002[\002\193\000\242\006 \006a\006!\001\232\001\212\007z\002\023\002a\007(\001&\002\217\0051\001#\002\000\005\215\001$\002~\002\004\007\028\001\027\003\149\001r\001s\007\030\000\245\001\255\007{\005\216\001\020\000\245\002\200\005\217\006\"\002\201\001\027\001/\007 \007\154\003\149\001&\002\194\001t\002s\005\188\001v\001w\004\219\003\149\000\245\002\215\002\131\001\153\002\196\002\138\007!\001,\004\212\006C\002\005\005\224\002\194\002\143\000\245\001#\004\161\000\245\001$\004\142\006#\002\195\001(\001\153\002\196\002\217\001\217\000\245\002\006\0007\006$\006%\002\031\006&\001\020\005?\000\245\001,\001\223\001)\001\027\001\030\001&\002\151\005\241\001\027\001/\005H\001s\005W\004\211\001#\001(\007\135\001$\002\157\006b\002\021\003\149\0056\006C\004\144\005\249\001\242\002,\006\197\001>\000\242\000\242\001)\000\245\0052\001{\000\245\001\244\001\027\001/\002\189\001&\002\205\006(\000\245\005\218\001\020\001|\006*\0064\000\242\001,\001\027\001/\001;\006\221\003\149\001\020\000\242\006C\005\215\006^\0011\001\027\001/\0012\001(\006F\0013\0014\006c\005\159\004\211\005\216\000\245\004\161\002\003\005\222\005\218\006_\006J\006K\007\005\001)\001;\001#\000\245\001,\001$\001\027\001/\002-\0011\0057\0015\0012\005\218\001?\0013\0014\006L\006\\\001(\007\137\002\031\006T\004\211\002\020\000\245\002\031\000\245\001\143\001&\006@\004\211\004\135\002\211\003\149\001#\001)\001\152\001$\001\153\001z\0015\001\027\001/\001?\005R\003\149\006C\006J\006K\004\152\007\007\001;\002,\002\031\004\157\000\242\001#\002,\004\131\0011\000\242\001&\0012\002\220\002\031\0013\0014\006L\006\\\0027\002\231\001\020\006T\004\211\001,\002:\006\242\001\027\001\030\006C\002\237\003\149\004\236\006J\006K\002,\002H\001;\000\242\001(\007\151\0015\006\189\005\029\001?\0011\002,\002\031\0012\000\242\000\245\0013\0014\006L\006\\\005_\001)\001,\006T\004\211\002\243\002W\001\027\001/\002\249\002\255\002-\005b\003\149\007L\004\211\002-\001(\003\149\002Z\002`\005C\0015\003\005\002,\001?\000\245\000\242\002l\005\215\003\011\003\017\001#\000\245\001)\001$\003\023\003\149\001F\001(\001\027\001/\005\216\000\245\002-\003\029\005\248\003#\005j\006J\006K\002i\002o\001;\001#\002-\001)\001$\001G\001&\001F\0011\001\027\001/\0012\001_\003)\0013\0014\006L\006\\\003/\0035\000\245\006T\004\211\002z\000\245\000\245\002}\001G\001&\006J\006K\006\214\005n\001;\001]\002-\002\130\005}\000\245\003;\0015\0011\003A\001?\0012\000\245\000\245\0013\0014\007\133\007\134\000\245\001,\002\137\006T\004\211\005\143\002\142\003G\002\150\000\245\003M\000\245\0011\003S\003Y\0012\001(\003\149\0013\0014\001L\001#\0015\001,\001$\001?\002\156\001F\002\171\003]\000\245\003\149\002\188\001)\003\149\000\245\000\245\003\190\001(\001\027\001/\003\152\001L\001#\001D\002\214\001$\001G\001&\001F\002\204\002=\002>\001s\001H\001)\000\245\001\232\002\210\000\245\001\233\001\027\001/\002\219\002\230\002\236\002\154\002\000\003\200\001G\001&\002\004\002\242\001\027\002\159\000\245\001[\003\149\000\245\002\248\004T\000\245\000\245\002\254\003\210\001;\003\004\002\185\001\232\005\147\003\220\001\254\003\n\0011\001,\003\016\0012\000\245\002\000\0013\0014\001V\002\004\005\199\001\027\000\245\005\231\001;\003\229\001(\003\022\003\238\002\005\001L\001#\0011\001,\001$\0012\003\028\001W\0013\0014\001V\003\"\0015\001)\003\149\001?\003\249\002\006\001(\001\027\001/\003(\001L\000\245\004\002\003.\004\011\001Y\001&\004\018\002\005\000m\001#\005\209\0015\001)\005\236\001?\002\191\000\245\0034\001\027\001/\003:\001\232\000\245\003@\002\b\002\006\003F\002A\004:\002\193\000\242\002\000\003L\003\149\003\149\002\004\003\149\001\027\001\232\004\191\000\245\002\n\001;\000\245\004?\004F\004\197\003\149\002\000\004\128\0011\001,\002\004\0012\001\027\004\143\0013\0014\001V\002\197\004\149\000\245\004\165\006\020\001;\004\182\001(\003R\004\184\000\245\001L\000\245\0011\004\208\000\245\0012\002\005\004\213\0013\0014\001V\002\200\0015\001)\002\201\001?\002=\002>\001s\001\027\001/\002\194\004\225\002\005\002\006\004\235\000\245\001(\004\252\003\149\002\215\002\154\001\153\002\196\0015\006\028\006)\001?\0061\002\159\003X\002\006\000\245\000\245\001)\007\208\003c\000\245\003j\006H\001\027\001/\002\185\000\245\002\217\002=\002>\001s\000\245\005\028\000\245\001#\003\142\000\245\001$\001;\000\245\001W\003\189\005\"\002\154\000\245\003\149\0011\005)\000\245\0012\005/\002\159\0013\0014\006\007\003\199\005B\007A\003\209\003\219\001Y\001&\003\228\000\245\002\185\007\210\000\245\003\237\003\248\000\245\002=\002>\001s\004\001\006y\003\149\001\232\0011\0015\002'\0012\001?\005G\0013\0014\002\154\002\000\004\203\005V\002\191\002\004\005^\001\027\002\159\005a\004\n\005h\003\149\004\017\004\247\000\245\002A\004&\002\193\000\242\005l\002\185\001,\003\149\004\206\000\245\005r\002=\002>\001s\000\245\003\149\006\156\000\245\0049\001\232\005x\001(\002M\000\245\004>\001L\002\154\002\191\003\149\002\000\002\005\005\132\002\197\002\004\002\159\001\027\003\149\003\149\001)\002A\004\218\002\193\000\242\004E\001\027\001/\006\182\002\185\002\006\000\245\005\153\005\158\005\163\005\173\002\200\000\245\005\179\002\201\000\245\001#\005\190\000\245\001$\000\245\002\194\001F\005\201\003\149\006\193\002\191\004b\002\197\000\245\002\215\002\005\001\153\002\196\004k\000\245\006\227\005\219\002A\005\205\002\193\000\242\001K\001&\006\239\000\245\004\127\001;\005\226\002\006\002\200\004\133\004\148\002\201\002\217\0011\000\245\006\243\0012\004\150\002\194\0013\0014\001V\005\243\006\247\006\252\004\164\002\191\002\215\002\197\001\153\002\196\003\149\004\207\000\245\000\245\000\245\000\245\004\215\002A\000\245\002\193\000\242\004\224\000\245\004\234\0015\003\149\001,\001?\000\245\002\200\002\217\004\245\002\201\007\b\004\251\003\149\005\253\006\022\006,\002\194\0066\001(\000\245\006B\000\245\001L\005(\005!\002\215\002\197\001\153\002\196\006V\000\245\005#\002=\002>\001s\001)\006f\002=\002>\001s\006l\001\027\001/\006p\006\140\006\180\000\245\002\154\002\200\002\217\006\240\002\201\002\154\006\185\003\149\002\159\001r\001s\002\194\007\015\002\159\004\141\003\149\002=\002>\001s\004x\002\215\002\185\001\153\002\196\006\224\006\190\002\185\007\029\006\220\001t\001\132\002\154\001v\001w\000\245\000\245\000\245\007$\000\245\002\159\001;\000\245\005&\0055\002\217\004I\006\196\006\204\0011\006\245\000\245\0012\002\185\007\n\0013\0014\001V\000\245\007O\007[\005+\000\245\0054\0050\000\245\000\245\000\245\003\149\0053\005A\005F\000\245\003\149\001\133\000\245\001\134\001\157\005Q\007i\007.\0015\007k\005P\001?\005U\002\191\005`\007`\005k\005g\002\191\005w\000\245\000\245\005q\001#\000\245\002A\007t\002\193\000\242\000m\002A\005s\002\193\000\242\005\139\003\149\001\141\002=\002>\001s\005\127\005\138\000\245\000\245\002\191\000\245\003\149\003\149\001|\000\245\001&\000\242\002\154\003\149\000\245\000\245\002A\002\197\002\193\000\242\002\159\005\133\002\197\002=\002>\001s\0046\007\139\002=\002>\001s\005\137\007\153\002\185\000\245\005\152\005\157\000\245\002\154\002\200\005\252\005\162\002\201\002\154\002\200\005\165\002\159\002\201\002\197\002\194\005\169\002\159\004.\005\177\002\194\005\184\005\195\005\251\002\215\002\185\001\153\002\196\005\244\002\215\002\185\001\153\002\196\007\165\005\245\005\250\002\200\001(\001\143\002\201\005\254\005\255\006\030\006\023\b\001\b\012\002\194\001\144\002\217\001\153\001z\b\017\006\024\002\217\001)\002\215\006\029\001\153\002\196\0063\001\027\001/\006/\002\191\0060\0062\006]\006A\006E\006G\006I\006U\006e\006g\006h\002A\006m\002\193\000\242\002\217\006q\006u\006\135\006\142\006\146\006\170\006\191\006\215\006\225\002\191\002=\002>\001s\007\017\002\191\002=\002>\001s\007\011\007\012\007\016\002A\007\031\002\193\000\242\002\154\002A\002\197\002\193\000\242\002\154\007J\007^\002\159\0011\007_\007c\0012\002\159\004#\0013\0014\007\138\007\142\002\182\007\152\002\185\007\156\007\243\002\200\000\000\002\185\002\201\002\197\000\000\000\000\000\000\000\000\002\197\002\194\000\000\000\000\000\000\001#\000\000\000\000\0015\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\002\200\000\000\000\000\002\201\000\000\003w\000\000\000\000\002\201\004-\002\194\000\000\000\000\000\000\000\000\002\194\000\000\002\217\000\000\002\215\000\000\001\153\002\196\000\000\002\215\000\000\001\153\002\196\000\000\001#\000\000\000\000\001-\000\000\000\000\002\191\002=\002>\001s\000\000\002\191\000\000\000\000\002\217\000\000\000\000\000\000\002A\002\217\002\193\000\242\002\154\002A\000\000\002\193\000\242\001&\000\000\000\000\002\159\000\000\000\000\002=\002>\001s\002\199\000\000\002=\002>\001s\000\000\000\000\002\185\000\000\000\000\000\000\001(\002\154\000\000\002\197\000\000\000\000\002\154\000\000\002\197\002\159\000\000\000\000\000\000\000\000\002\159\002\227\000\000\001)\000\000\000\000\002\226\000\000\002\185\001\027\001/\002\200\007r\002\185\002\201\000\000\002\200\000\000\000\000\002\201\000\000\002\194\000\000\000\000\000\000\000\000\002\194\001(\000\000\000\000\002\215\000\000\001\153\002\196\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\001)\000\000\002\191\000\000\000\000\000\000\001\027\001/\000\000\000\000\002\217\000\000\000\000\000\000\002A\002\217\002\193\000\242\000\000\0011\000\000\000\000\0012\000\000\000\000\0013\0014\000\000\002\191\000\000\000\000\000\000\000\000\002\191\000\000\001r\001s\000\000\000\000\000\000\002A\000\000\002\193\000\242\003o\002A\002\197\002\193\000\242\000\000\000\000\007n\003r\000\000\000\000\001t\002s\000\000\001v\001w\0011\000\000\000\000\0012\000\000\000\000\0013\0014\002\200\000\000\000\000\002\201\002\197\000\000\000\000\000\000\000\000\002\197\002\194\000\000\000\000\000\000\000\000\002t\000\000\000\000\000\000\002\215\000\000\001\153\002\196\000\000\0015\000\000\002\200\000\000\000\000\002\201\000\000\002\200\000\000\000\000\002\201\000\000\002\194\000\000\001#\000\000\000\000\002\194\000\000\002\217\000\000\002\215\000\000\001\153\002\196\000\000\002\215\000\000\001\153\002\196\000\000\000\000\002=\002>\001s\000\000\002=\002>\001s\000\000\000\000\000\000\001{\001r\001s\002\217\000\000\002\154\000\000\000\000\002\217\002\154\000\000\000\000\001|\002\159\000\000\000\242\000\000\002\159\004\222\003`\000\000\001t\002s\003g\001v\001w\002\185\000\000\000\000\000\000\002\185\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002u\000\000\002t\000\000\002\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\159\001(\000\000\000\000\000\000\000\000\003n\000\000\003s\003y\000\000\000\000\000\000\002\185\000\000\000\000\000\000\001\143\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\001\152\007m\001\153\001z\000\000\002\191\000\000\000\000\000\000\002\191\002=\002>\001s\000\000\000\000\001{\000\000\002A\000\000\002\193\000\242\002A\000\000\002\193\000\242\002\154\000\000\001|\000\000\000\000\000\242\000\000\000\000\002\159\001\232\000\000\000\000\004\155\000\000\003q\000\000\002=\002>\001s\002\000\000\000\002\185\000\000\002\004\002\197\001\027\002\191\0011\002\197\000\000\0012\002\154\000\000\0013\0014\000\000\000\000\002u\002A\002\159\002\193\000\242\000\000\000\000\000\000\000\000\002\200\000\000\000\000\002\201\002\200\000\000\002\185\002\201\000\000\000\000\002\194\003s\003y\007n\002\194\000\000\000\000\000\000\002\005\002\215\001\143\001\153\002\196\002\215\002\197\001\153\002\196\000\000\000\000\001\152\000\000\001\153\001z\000\000\000\000\000\000\002\006\000\000\000\000\002\191\000\000\000\000\001#\002\217\000\000\006\004\002\200\002\217\000\000\002\201\000\000\002A\000\000\002\193\000\242\000\000\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\215\000\000\001\153\002\196\001&\002\191\002=\002>\001s\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\002A\002\197\002\193\000\242\002\154\000\000\000\000\002\217\002\154\000\000\000\000\000\000\002\159\000\000\001\232\000\000\002\159\004\240\003~\000\000\000\000\000\000\003\129\002\200\002\000\002\185\002\201\000\000\002\004\002\185\001\027\000\000\002\197\002\194\000\000\000\000\000\000\000\000\002=\002>\001s\000\000\002\215\000\000\001\153\002\196\000\000\000\000\001(\000\000\000\000\000\000\000\000\002\154\003w\000\000\001#\002\201\003x\001$\000\000\002\159\000\000\000\000\002\194\001)\002\217\003\155\000\000\002\005\000\000\001\027\001/\002\215\002\185\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\001&\000\000\007w\000\000\002\006\000\000\002\191\000\000\000\000\000\000\002\191\002=\002>\001s\002\217\000\000\000\000\000\000\002A\000\000\002\193\000\242\002A\000\000\002\193\000\242\002\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\159\000\000\000\000\002=\002>\001s\003\159\000\000\0011\000\000\000\000\0012\001,\002\185\0013\0014\002\197\000\000\002\154\000\000\002\197\002\191\000\000\000\000\000\000\000\000\002\159\001(\000\000\000\000\000\000\000\000\003\215\002A\000\000\002\193\000\242\000\000\002\200\002\185\0015\002\201\002\200\000\000\001)\002\201\000\000\000\000\002\194\000\000\001\027\001/\002\194\000\000\000\000\000\000\000\000\002\215\000\000\001\153\002\196\002\215\000\000\001\153\002\196\002\197\000\000\000\000\001\232\000\000\000\000\005\002\000\000\000\000\000\000\000\000\000\000\002\191\002\000\000\000\000\000\002\217\002\004\000\000\001\027\002\217\000\000\002\200\000\000\002A\002\201\002\193\000\242\000\000\000\000\000\000\001;\002\194\000\000\002=\002>\001s\000\000\002\191\0011\000\000\002\215\0012\001\153\002\196\0013\0014\007~\000\000\002\154\002A\000\000\002\193\000\242\000\000\000\000\002\197\002\159\002\005\000\000\002=\002>\001s\003\224\000\000\002\217\000\000\000\000\000\000\000\000\002\185\0015\000\000\000\000\001?\002\154\002\006\001\232\002\200\000\000\005\006\002\201\002\197\002\159\000\000\000\000\000\000\002\000\002\194\003\233\000\000\002\004\000\000\001\027\000\000\000\000\002\185\002\215\000\000\001\153\002\196\000\000\000\000\000\000\002\200\000\000\000\000\002\201\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\002=\002>\001s\000\000\000\000\002\217\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\002\154\002\005\000\000\002\191\000\000\000\000\000\000\000\000\002\159\000\000\000\000\000\000\000\000\000\000\004'\002A\002\217\002\193\000\242\002\006\000\000\002\185\002=\002>\001s\000\000\000\000\000\000\000\000\002\191\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\154\000\000\000\000\000\000\002A\000\000\002\193\000\242\002\159\000\000\002\197\002=\002>\001s\004)\000\000\002=\002>\001s\000\000\000\000\002\185\000\000\000\000\000\000\000\000\002\154\000\000\000\000\000\000\000\000\002\154\002\200\000\000\002\159\002\201\002\197\000\000\000\000\002\159\0040\000\000\002\194\000\000\000\000\0043\000\000\002\185\002\191\000\000\000\000\002\215\002\185\001\153\002\196\000\000\000\000\000\000\002\200\000\000\002A\002\201\002\193\000\242\000\000\000\000\000\000\000\000\002\194\000\000\000\000\000\000\007\018\000\000\000\000\002\217\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\002\191\000\000\000\000\000\000\000\000\007\254\000\000\002\197\007\021\000\000\000\000\000\000\002A\000\000\002\193\000\242\002\217\007\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\191\000\000\000\000\002\200\000\000\002\191\002\201\000\000\000\000\000\000\000\000\000\000\002A\002\194\002\193\000\242\000\000\002A\002\197\002\193\000\242\007\023\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\001\232\000\000\000\000\005\t\000\000\000\000\000\000\000\000\000\000\002\200\002\000\000\000\002\201\002\197\002\004\002\217\001\027\000\000\002\197\002\194\000\000\000\000\000\000\000\000\002=\002>\001s\007\024\002\215\000\000\001\153\002\196\000\000\000\000\000\000\002\200\000\000\007\025\002\201\002\154\002\200\000\000\000\000\002\201\000\000\002\194\000\000\002\159\000\000\000\000\002\194\000\000\002\217\004L\002\215\002\005\001\153\002\196\007\255\002\215\002\185\001\153\002\196\000\000\000\000\000\000\002=\002>\001s\000\000\002=\002>\001s\002\006\001\232\000\000\007\027\005\016\002\217\000\000\000\000\002\154\000\000\002\217\002\000\002\154\007\028\000\000\002\004\002\159\001\027\007\030\000\000\002\159\000\000\004O\000\000\000\000\000\000\004\146\000\000\000\000\002\185\000\000\007 \000\000\002\185\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\001\232\000\000\000\000\005\020\000\000\000\000\007!\002\154\002\191\000\000\002\000\000\000\000\000\002\005\002\004\002\159\001\027\000\000\000\000\000\000\002A\004\160\002\193\000\242\000\000\000\000\000\000\000\000\002\185\000\000\000\000\002\006\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\154\002\191\000\000\002\197\000\000\002\191\002\005\000\000\002\159\000\000\000\000\000\000\000\000\002A\004\210\002\193\000\242\002A\007\018\002\193\000\242\002\185\000\000\000\000\002\006\002\200\000\000\000\000\002\201\000\000\000\000\000\000\000\000\b\007\000\000\002\194\b\b\000\000\000\000\007\021\000\000\000\000\000\000\002\191\002\215\002\197\001\153\002\196\007\022\002\197\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\200\002\217\000\000\002\201\002\200\000\000\000\000\002\201\000\000\000\000\002\194\007\023\000\000\000\000\002\194\000\000\000\000\000\000\002\191\002\215\002\197\001\153\002\196\002\215\000\000\001\153\002\196\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\002\200\002\217\000\000\002\201\000\000\002\217\007\024\000\000\000\000\002\154\002\194\002=\002>\001s\000\000\000\000\007\025\002\159\000\000\002\215\002\197\001\153\002\196\005=\000\000\000\000\002\154\000\000\000\000\000\000\002\185\002=\002>\001s\002\159\000\000\b\r\000\000\000\000\000\000\006t\000\000\002\200\002\217\000\000\002\201\002\154\002\185\000\000\000\000\000\000\000\000\002\194\000\000\002\159\007\027\000\000\002=\002>\001s\006w\002\215\000\000\001\153\002\196\007\028\000\000\002\185\000\000\000\000\007\030\000\000\002\154\000\000\001\232\000\000\000\000\005\023\000\000\000\000\002\159\000\000\000\000\007 \002\000\002\217\006\134\000\000\002\004\001\232\001\027\000\000\005%\002\185\002\191\000\000\000\000\000\000\000\000\002\000\000\000\007!\000\000\002\004\000\000\001\027\002A\000\000\002\193\000\242\000\000\002\191\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\002\154\002\005\000\000\002\191\000\000\000\000\000\000\000\000\002\159\000\000\002\197\000\000\000\000\000\000\006\137\002A\002\005\002\193\000\242\002\006\000\000\002\185\000\000\000\000\000\000\000\000\000\000\002\197\000\000\002\191\001#\000\000\002\200\001$\002\006\002\201\000\000\000\000\000\000\000\000\000\000\002A\002\194\002\193\000\242\000\000\000\000\002\197\000\000\002\200\000\000\002\215\002\201\001\153\002\196\000\000\000\000\001&\000\000\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005J\002\215\002\200\001\153\002\196\002\201\002\197\000\000\002\217\000\000\000\000\000\000\002\194\000\000\000\000\000\000\007\164\000\000\002\191\000\000\000\000\002\215\000\000\001\153\002\196\002\217\000\000\000\000\002\200\000\000\002A\002\201\002\193\000\242\000\000\000\000\001,\000\000\002\194\000\000\002=\002>\001s\000\000\000\000\002\217\000\000\002\215\000\000\001\153\002\196\001(\000\000\000\000\000\000\002\154\000\000\002=\002>\001s\000\000\000\000\002\197\002\159\000\000\000\000\000\000\000\000\001)\006\150\000\000\002\217\002\154\000\000\001\027\001/\002\185\000\000\000\000\000\000\002\159\000\000\000\000\000\000\002\200\000\000\006\153\002\201\000\000\000\000\000\000\000\000\001#\002\185\002\194\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\002\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\159\001;\000\000\000\000\000\000\000\000\006\174\000\000\002\217\0011\000\000\000\000\0012\002\185\000\000\0013\0014\005S\000\000\000\000\000\000\002\191\002=\002>\001s\000\000\000\000\000\000\001#\000\000\000\000\001$\000\000\002A\000\000\002\193\000\242\002\154\002\191\000\000\000\000\0015\000\000\000\000\001?\002\159\000\000\000\000\000\000\000\000\002A\006\177\002\193\000\242\000\000\001&\000\000\000\000\002\185\000\000\005\209\001(\000\000\000\000\000\000\002\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\191\001)\000\000\000\000\000\000\002\197\000\000\001\027\001/\000\000\002\200\000\000\002A\002\201\002\193\000\242\000\000\000\000\000\000\000\000\002\194\000\000\000\000\000\000\001,\000\000\000\000\002\200\000\000\002\215\002\201\001\153\002\196\000\000\000\000\000\000\000\000\002\194\000\000\001(\000\000\000\000\000\000\000\000\002\197\002\191\002\215\000\000\001\153\002\196\002=\002>\001s\002\217\000\000\000\000\001)\002A\000\000\002\193\000\242\0011\001\027\001/\0012\002\154\002\200\0013\0014\002\201\002\217\006\031\000\000\002\159\000\000\000\000\002\194\000\000\000\000\006\181\000\000\002=\002>\001s\000\000\002\215\002\185\001\153\002\196\002\197\000\000\000\000\000\000\0017\000\000\000\000\002\154\000\000\000\000\006 \007\178\006!\000\000\000\000\002\159\000\000\000\000\000\000\001;\002\217\007\169\002\200\000\000\000\000\002\201\000\000\0011\002\185\000\000\0012\000\000\002\194\0013\0014\005\214\000\000\000\000\000\000\000\000\000\000\002\215\006\"\001\153\002\196\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0015\002\154\002\191\001?\000\000\000\000\002\217\000\000\000\000\002\159\000\000\000\000\000\000\000\000\002A\007\171\002\193\000\242\000\000\006#\000\000\000\000\002\185\000\000\000\000\000\000\001#\000\000\000\000\006$\006%\000\000\006&\002\191\002=\002>\001s\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\002A\002\197\002\193\000\242\002\154\001\232\000\000\000\000\005u\002\154\006b\000\000\002\159\000\000\000\000\002\000\000\000\002\159\000\000\002\004\000\000\001\027\004\229\002\200\000\000\002\185\002\201\004\138\000\000\000\000\002\185\000\000\002\197\002\194\006(\007\180\000\000\000\000\000\000\006*\0064\002\191\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\006^\002A\002\200\002\193\000\242\002\201\001\232\000\000\002\005\005\129\000\000\000\000\002\194\000\000\002\217\000\000\002\000\001(\006_\000\000\002\004\002\215\001\027\001\153\002\196\000\000\002\006\000\000\000\000\000\000\000\000\000\000\000\000\002\197\001)\000\000\000\000\002\191\000\000\000\000\001\027\001/\002\191\007p\000\000\002\217\000\000\000\000\000\000\002A\001\232\002\193\000\242\005\135\002A\002\200\002\193\000\242\002\201\000\000\002\000\002\005\000\000\000\000\002\004\002\194\001\027\001r\001s\000\000\000\000\000\000\001r\001s\002\215\000\000\001\153\002\196\000\000\002\006\000\000\002\197\000\000\000\000\000\000\000\000\002\197\001t\001\132\000\000\001v\001w\001t\001\132\0011\001v\001w\0012\002\217\000\000\0013\0014\000\000\000\000\000\000\002\005\003\168\000\000\000\000\000\000\002\127\003\168\000\000\002\194\000\000\002\132\000\000\001#\002\194\000\000\001$\000\000\002\215\002\006\001\153\002\196\007n\002\215\000\000\001\153\002\196\001\133\000\000\001\134\002]\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\000\000\001&\001\232\002\217\000\000\005\145\001r\001s\002\217\002=\002>\001s\002\000\000\000\000\000\000\000\002\004\000\000\001\027\000\000\000\000\000\000\000\000\001\141\002\154\000\000\001t\001\132\001\141\001v\001w\000\000\002\159\000\000\000\000\001|\000\000\000\000\000\242\000\000\001|\000\000\004\027\000\242\000\000\002\185\002\135\001,\000\000\002\152\000\000\002\135\000\000\000\000\002=\002>\001s\002\005\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\002\154\001\133\000\000\001\134\002]\000\000\002\006\000\000\002\159\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\004\026\000\000\000\000\002\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\143\000\000\000\000\000\000\000\000\001\143\001\141\001r\001s\001\144\002\191\001\153\001z\000\000\001\144\000\000\001\153\001z\001|\000\000\000\000\000\242\002A\000\000\002\193\000\242\000\000\001t\001\132\002\135\001v\001w\001;\000\000\001#\000\000\000\000\001r\001s\000\000\0011\000\000\000\000\0012\000\000\000\000\0013\0014\005\227\000\000\002\158\005\230\000\000\000\000\002\197\002\191\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\001\133\0015\001\134\002]\001?\000\000\000\000\000\000\003\168\002\190\000\000\001\143\000\000\000\000\000\000\002\194\000\000\000\000\001r\001s\001\144\000\000\001\153\001z\002\215\000\000\001\153\002\196\002\197\000\000\001\133\000\000\001\134\002]\000\000\001\141\000\000\000\000\001t\001\132\000\000\001v\001w\001r\001s\000\000\000\000\001|\002\217\000\000\000\242\001(\000\000\003\168\000\000\000\000\000\000\000\000\002\135\000\000\002\194\002\206\000\000\001t\001\132\001\141\001v\001w\001)\002\215\000\000\001\153\002\196\000\000\001\027\001/\000\000\001|\001r\001s\000\242\000\000\001\133\000\000\001\134\002]\002\212\000\000\002\135\000\000\000\000\000\000\000\000\002\217\000\000\001r\001s\000\000\001t\001u\000\000\001v\001w\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\001\143\000\000\000\000\000\000\001t\001\132\001\141\001v\001w\001\144\000\000\001\153\001z\001r\001s\000\000\000\000\0011\001|\000\000\0012\000\242\000\000\0013\0014\000\000\000\000\002\221\000\000\002\135\001\143\001\141\000\000\001t\001\132\000\000\001v\001w\000\000\001\144\000\000\001\153\001z\001|\001r\001s\000\242\000\000\001\133\002y\001\134\002]\000\000\000\000\002\135\000\000\002\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001t\001\132\001{\001v\001w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\133\001|\001\134\002]\000\242\001\143\001\141\000\000\000\000\000\000\002\238\000\000\001\232\000\000\001\144\005\154\001\153\001z\001|\000\000\000\000\000\242\002\000\000\000\000\000\000\000\002\004\000\000\001\027\002\135\001\143\001\133\000\000\001\134\002]\001\141\001r\001s\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\001t\001\132\002\135\001v\001w\000\000\000\000\001r\001s\001\143\001\141\002\005\000\000\000\000\000\000\000\000\000\000\000\000\001\152\000\000\001\153\001z\001|\002\244\000\000\000\242\001\143\001t\001\132\002\006\001v\001w\000\000\002\135\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\002\250\000\000\000\000\000\000\000\000\001\143\000\000\000\000\000\000\000\000\000\000\001r\001s\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\000\000\001\141\000\000\001t\001\132\000\000\001v\001w\001\143\001r\001s\000\000\000\000\001|\000\000\000\000\000\242\001\144\000\000\001\153\001z\000\000\000\000\000\000\002\135\000\000\003\000\000\000\001\141\001t\001\132\000\000\001v\001w\000\000\001r\001s\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\000\000\001\133\000\000\001\134\002]\002\135\003\006\000\000\000\000\001t\001\132\000\000\001v\001w\001r\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\001\143\003\012\000\000\001t\001\132\001\141\001v\001w\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\001\133\000\000\001\134\002]\003\018\001\143\002\135\000\000\000\000\001\141\001r\001s\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\001|\000\000\000\000\000\242\001\133\000\000\001\134\002]\000\000\001t\001\132\002\135\001v\001w\001\141\000\000\000\000\000\000\000\000\000\000\001r\001s\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\003\024\000\000\000\000\000\000\000\000\002\135\001\143\001\141\001t\001\132\000\000\001v\001w\000\000\000\000\001\144\000\000\001\153\001z\001|\000\000\001\133\000\242\001\134\002]\000\000\000\000\000\000\000\000\000\000\002\135\003\030\001\143\000\000\000\000\000\000\000\000\000\000\000\000\001r\001s\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\001\141\000\000\001\143\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\001\144\001|\001\153\001z\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\135\000\000\000\000\003$\001\143\000\000\000\000\000\000\001\141\001r\001s\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\001|\000\000\000\000\000\242\001\133\000\000\001\134\002]\000\000\001t\001\132\002\135\001v\001w\001r\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003*\001\143\001t\001\132\000\000\001v\001w\001\141\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\001|\000\000\001\133\000\242\001\134\002]\0030\000\000\000\000\000\000\000\000\002\135\000\000\001\143\000\000\001r\001s\000\000\000\000\000\000\001r\001s\001\144\000\000\001\153\001z\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\000\000\001t\001\132\001\141\001v\001w\001t\001\132\000\000\001v\001w\001r\001s\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\0036\000\000\002\135\000\000\001\141\003<\001\143\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\001\144\001|\001\153\001z\000\242\000\000\001\133\000\000\001\134\002]\000\000\001\133\002\135\001\134\002]\003B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\001\143\001\141\000\000\000\000\001t\001\132\001\141\001v\001w\001\144\000\000\001\153\001z\001|\000\000\000\000\000\242\000\000\001|\000\000\000\000\000\242\000\000\000\000\002\135\001\143\000\000\003H\000\000\002\135\000\000\001\141\000\000\000\000\001\144\000\000\001\153\001z\001r\001s\000\000\000\000\000\000\001|\001r\001s\000\242\000\000\001\133\000\000\001\134\002]\000\000\000\000\002\135\000\000\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\001t\001\132\000\000\001v\001w\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\001\143\000\000\000\000\000\000\003N\001\143\001\141\000\000\000\000\001\144\003T\001\153\001z\000\000\001\144\004\021\001\153\001z\001|\000\000\000\000\000\242\000\000\000\000\000\000\001\133\000\000\001\134\002]\002\135\001\143\001\133\000\000\001\134\002]\000\000\000\000\000\000\000\000\001\144\000\000\001\153\001z\000\000\001r\001s\000\000\000\000\000\000\000\000\003^\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\141\000\000\000\000\000\000\001t\001\132\001\141\001v\001w\000\000\003z\001\132\001|\001v\001w\000\242\000\000\000\000\001|\001#\000\000\000\242\001\143\002\135\000\000\000\000\000\000\003Z\000\000\002\135\000\000\001\144\002@\001\153\001z\000\000\000\000\002=\002>\001s\000\000\002=\002>\001s\002A\000\000\002\193\000\242\001\133\000\000\001\134\002]\002\154\003\127\003\143\003\144\002\154\000\000\000\000\000\000\002\159\000\000\000\000\000\000\002\159\000\000\000\000\000\000\000\000\000\000\003\165\000\000\000\000\002\185\003\170\000\000\001\143\002\185\000\000\000\000\004\023\000\000\001\143\001\141\000\000\001\144\000\000\001\153\001z\001\141\000\000\001\144\001#\001\153\001z\001|\000\000\000\000\000\242\000\000\000\000\001|\000\000\000\000\000\242\000\000\002\135\001(\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\195\000\000\001\153\002\196\002=\002>\001s\001)\000\000\000\000\002=\002>\001s\001\027\001/\000\000\000\000\003\147\003\148\002\154\002\191\000\000\000\000\000\000\002\191\002\154\000\000\002\159\000\000\000\000\000\000\000\000\002A\002\159\002\193\000\242\002A\003\172\002\193\000\242\002\185\000\000\001\143\003\176\000\000\000\000\002\185\000\000\001\143\000\000\000\000\001\144\000\000\001\153\001z\000\000\001#\001\144\000\000\001\153\001z\000\000\000\000\001(\002\197\000\000\000\000\0011\002\197\000\000\0012\001r\001s\0013\0014\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\003\168\000\000\001t\001\132\003\168\001v\001w\002\194\000\000\000\000\004\193\002\194\000\000\000\000\000\000\002\191\002\215\000\000\001\153\002\196\002\215\002\191\001\153\002\196\000\000\003\191\000\000\002A\000\000\002\193\000\242\000\000\000\000\002A\000\000\002\193\000\242\002=\002>\001s\002\217\002=\002>\001s\002\217\000\000\001\133\000\000\001\134\002]\000\000\0011\002\154\000\000\0012\001(\002\154\0013\0014\002\197\002\159\000\000\000\000\000\000\002\159\002\197\000\000\000\000\000\000\000\000\003\184\000\000\001)\002\185\003\194\000\000\000\000\002\185\001\027\001/\000\000\001\141\000\000\004\201\003\168\000\000\000\000\000\000\000\000\000\000\003\168\002\194\000\000\001|\000\000\000\000\000\242\002\194\000\000\000\000\002\215\000\000\001\153\002\196\002\135\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001r\001s\002\217\000\000\000\000\000\000\000\000\000\000\002\217\000\000\0011\000\000\000\000\0012\000\000\002\191\0013\0014\000\000\002\191\001t\001\132\000\000\001v\001w\000\000\000\000\002A\000\000\002\193\000\242\002A\000\000\002\193\000\242\001\143\000\000\002=\002>\001s\000\000\000\000\004\205\003\201\001\144\000\000\001\153\001z\001r\001s\000\000\000\000\002\154\000\000\001r\001s\000\000\000\000\000\000\002\197\002\159\000\000\000\000\002\197\001\133\000\000\001\134\002]\001t\001\151\003\204\001v\001w\002\185\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\003\168\000\000\000\000\000\000\003\168\000\000\000\000\002\194\000\000\000\000\000\000\002\194\000\000\003\211\000\000\001\141\002\215\000\000\001\153\002\196\002\215\000\000\001\153\002\196\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\000\000\001\133\000\000\001\134\002]\002\135\000\000\002\217\000\000\000\000\000\000\002\217\000\000\000\000\000\000\000\000\000\000\001r\001s\000\000\002\191\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001{\000\000\002A\000\000\002\193\000\242\001\141\001t\001\132\000\000\001v\001w\001|\000\000\000\000\000\242\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\001\143\002\135\003\221\000\000\000\000\000\000\002\197\000\000\000\000\001\144\000\000\001\153\001z\001r\001s\000\000\000\000\000\000\000\000\001r\001s\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\000\000\003\168\000\000\001t\001\132\000\000\001v\001w\002\194\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\002\215\001\143\001\153\002\196\000\000\000\000\000\000\001\143\000\000\003\230\001\152\001\141\001\153\001z\000\000\003\239\001\144\000\000\001\153\001z\002=\002>\001s\001|\002\217\000\000\000\242\000\000\000\000\000\000\001\133\000\000\001\134\002]\002\135\002\154\001\133\000\000\001\134\002]\000\000\000\000\000\000\002\159\000\000\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\003\244\000\000\000\000\002\185\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\001\141\001t\001\132\000\000\001v\001w\001\141\000\000\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\001|\000\000\004f\000\242\001\143\002\135\003\250\000\000\000\000\004n\000\000\002\135\000\000\001\144\000\000\001\153\001z\002=\002>\001s\000\000\000\000\001r\001s\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\002\154\004o\000\000\000\000\000\000\002\191\000\000\000\000\002\159\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\002A\003\253\002\193\000\242\002\185\000\000\000\000\000\000\000\000\001\143\002=\002>\001s\001\141\000\000\001\143\004\003\000\000\001\144\000\000\001\153\001z\000\000\000\000\001\144\001|\001\153\001z\000\242\000\000\002@\000\000\002\197\004v\000\000\000\000\002\135\001\133\000\000\001\134\002]\000\000\004r\000\000\002\193\000\242\001\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\168\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\000\000\002\191\000\000\000\000\000\000\001\141\002\215\000\000\001\153\002\196\000\000\000\000\004i\002A\000\000\002\193\000\242\001|\000\000\000\000\000\242\000\000\001\143\002=\002>\001s\000\000\000\000\002\135\000\000\002\217\001\144\000\000\001\153\001z\000\000\000\000\000\000\002\154\002\194\001r\001s\000\000\002@\000\000\002\197\002\159\000\000\002\195\000\000\001\153\002\196\000\000\000\000\000\000\002A\004\006\002\193\000\242\002\185\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\003\168\000\000\002=\002>\001s\000\000\000\000\002\194\000\000\001r\001s\001\143\000\000\004\012\000\000\000\000\002\215\002\154\001\153\002\196\001\144\000\000\001\153\001z\000\000\002\159\000\000\000\000\000\000\001t\001\132\000\000\001v\001w\001\133\004\030\001\134\002]\002\185\000\000\002\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\004\019\002\191\000\000\002=\002>\001s\002\195\000\000\001\153\002\196\000\000\000\000\000\000\002A\000\000\002\193\000\242\001\141\002\154\000\000\000\000\001\133\000\000\001\134\002]\000\000\002\159\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\000\000\004!\000\000\000\000\002\185\002\135\000\000\000\000\000\000\000\000\002\197\000\000\000\000\000\000\000\000\002\191\000\000\000\000\000\000\000\000\000\000\001\141\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\001|\000\000\003\168\000\242\000\000\000\000\000\000\000\000\000\000\002\194\000\000\002\135\000\000\000\000\000\000\000\000\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\001\143\002\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\144\002\191\001\153\001z\000\000\001r\001s\000\000\002\217\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\003\168\000\000\000\000\002=\002>\001s\000\000\002\194\001t\001\132\000\000\001v\001w\001\143\001r\001s\002\215\000\000\001\153\002\196\000\000\000\000\001\144\000\000\001\153\001z\004\021\000\000\002\197\000\000\000\000\004;\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\002\217\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\000\000\004\022\000\000\001\133\003\168\001\134\002]\000\000\004@\000\000\000\000\002\194\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\004G\000\000\001\141\000\000\000\000\000\000\000\000\000\000\002\217\000\000\000\000\002=\002>\001s\001|\000\000\000\000\000\242\002@\000\000\000\000\001\133\000\000\001\134\002]\002\135\002\154\000\000\001\141\000\000\002A\000\000\002\193\000\242\002\159\000\000\000\000\002=\002>\001s\001|\000\000\000\000\000\242\004Y\000\000\000\000\002\185\000\000\000\000\000\000\002\135\002\154\000\000\000\000\000\000\001\141\000\000\000\000\000\000\002\159\000\000\000\000\000\000\000\000\000\000\004\024\000\000\001|\000\000\004^\000\242\000\000\002\185\000\000\000\000\000\000\000\000\001\143\002\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\195\001\143\001\153\002\196\000\000\000\000\000\000\000\000\002\191\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\000\000\001\143\000\000\000\000\000\000\000\000\002\191\003^\001s\000\000\001\144\000\000\001\153\001z\001r\001s\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\002\197\000\000\000\000\003z\001\132\000\000\001v\001w\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\003\168\002\197\000\000\000\000\000\000\000\000\000\000\002\194\004\129\002\154\000\000\000\000\000\000\000\000\000\000\000\000\002\215\002\159\001\153\002\196\000\000\003\127\003\143\003\144\000\000\000\000\003\168\000\000\000\000\001\133\002\185\001\134\002]\002\194\000\000\000\000\000\000\000\000\000\000\000\000\002\217\000\000\002\215\000\000\001\153\002\196\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\001r\001s\000\000\001\141\000\000\000\000\000\000\001r\001s\000\000\001\141\000\000\002\217\001t\001\132\001|\001v\001w\000\242\000\000\001t\001\132\001|\001v\001w\000\242\000\000\001t\001\132\000\000\001v\001w\000\000\002\135\000\000\000\000\004\226\000\000\000\000\000\000\002\191\000\000\000\000\004\249\000\000\000\000\000\000\000\000\003\147\004\216\004\253\000\000\002A\000\000\002\193\000\242\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\000\000\001\143\000\000\000\000\000\000\000\000\002\197\000\000\001\143\000\000\001\144\000\000\001\153\001z\001\141\001#\000\000\001\144\001$\001\153\001z\001\141\000\000\000\000\000\000\000\000\001|\000\000\001\141\000\242\000\000\005\011\000\000\001|\000\000\000\000\000\242\002\135\002\194\000\000\001|\000\000\001&\000\242\002\135\001#\000\000\002\215\001$\001\153\002\196\002\135\005J\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001r\001s\000\000\000\000\000\000\005M\000\000\000\000\002\217\001&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\154\000\000\005J\001t\002s\000\000\001v\001w\001,\000\000\001\143\000\000\000\000\000\000\000\000\000\000\000\000\001\143\005\198\001\144\000\000\001\153\001z\001(\001\143\000\000\001\144\000\000\001\153\001z\000\000\002t\000\000\001\144\000\000\001\153\001z\000\000\001,\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\000\000\001#\001(\000\000\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001r\001s\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\001&\000\000\000\000\001{\000\000\006\178\000\000\000\000\001t\002s\005J\001v\001w\001;\000\000\001|\000\000\000\000\000\242\000\000\000\000\0011\000\000\000\000\0012\000\000\006\151\0013\0014\005S\000\000\000\000\000\000\000\000\000\000\000\000\002t\000\000\000\000\000\000\000\000\000\000\000\000\001;\000\000\001#\001,\000\000\001$\000\000\002u\0011\000\000\0015\0012\000\000\001?\0013\0014\005S\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003s\003y\001&\000\000\000\000\000\000\000\000\000\000\001)\001\143\000\000\000\000\005J\0015\001\027\001/\001?\001{\001\152\001#\001\153\001z\001$\000\000\000\000\000\000\000\000\000\000\006\165\001|\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001&\000\000\001,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005J\000\000\000\000\000\000\001;\000\000\000\000\001(\002u\000\000\000\000\000\000\0011\000\000\000\000\0012\006\175\000\000\0013\0014\005S\000\000\000\000\000\000\001)\000\000\000\000\000\000\003s\003y\001\027\001/\000\000\003^\001s\000\000\001,\001\143\003^\001s\000\000\000\000\000\000\000\000\0015\000\000\001\152\001?\001\153\001z\000\000\001(\000\000\003z\001\132\000\000\001v\001w\003z\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\001;\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\000\0012\000\000\000\000\0013\0014\005S\000\000\000\000\000\000\003\127\003\143\003\144\000\000\000\000\003\127\003\143\003\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0015\000\000\000\000\001?\001;\000\000\001r\001s\000\000\000\000\000\000\001#\0011\000\000\001$\0012\001\141\000\000\0013\0014\005S\001\141\000\000\000\000\000\000\000\000\001t\001\132\001|\001v\001w\000\242\000\000\001|\000\000\000\000\000\242\000\000\001&\000\000\000\000\002=\002>\001s\0015\000\000\000\000\001?\004\178\007D\000\000\000\000\000\000\000\000\000\000\000\000\002\154\000\000\000\000\000\000\000\000\003\147\006\192\007h\002\159\000\000\003\147\006\226\000\000\000\000\001\133\000\000\001\134\002]\000\000\000\000\000\000\002\185\000\000\000\000\000\000\000\000\000\000\000\000\001,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\143\000\000\000\000\000\000\000\000\001\143\000\000\001(\000\000\001\144\000\000\001\153\001z\001\141\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\000\000\001)\001|\000\000\000\000\000\242\000\000\001\027\001/\000\000\000\000\000\000\000\000\002\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001r\001s\000\000\000\000\002\191\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\001t\001\132\000\000\001v\001w\000\000\002=\002>\001s\000\000\001\198\001;\000\000\000\000\002=\002>\001s\000\000\000\000\0011\000\000\002\154\0012\000\000\001\143\0013\0014\000\000\002\197\002\159\000\000\000\000\000\000\001\144\000\000\001\153\001z\002?\001r\001s\000\000\000\000\002\185\000\000\001\133\000\000\001\134\001\186\000\000\000\000\000\000\0015\000\000\004\227\004\185\000\000\000\000\000\000\001t\001\132\002\194\001v\001w\000\000\000\000\000\000\001r\001s\001\183\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\001\141\000\000\000\000\000\000\000\000\000\000\000\000\001t\001\132\000\000\001v\001w\001|\000\000\002\217\000\242\000\000\001\188\000\000\000\000\000\000\000\000\000\000\001\133\000\000\001\134\001\186\002\191\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\001r\001s\000\000\002A\000\000\002\193\000\242\001r\001s\000\000\000\000\002A\000\000\002\193\000\242\001\133\000\000\001\134\001\186\000\000\001t\002s\001\141\001v\001w\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\001|\002\197\000\000\000\242\000\000\000\000\001\143\002=\002>\001s\000\000\000\000\000\000\000\000\002t\001\144\001\141\001\153\001z\000\000\000\000\000\000\002\154\000\000\000\000\000\000\004\130\000\000\001|\000\000\002\159\000\242\000\000\002\194\000\000\000\000\000\000\001\133\000\000\001\134\002]\002\194\002\215\002\185\001\153\002\196\000\000\001r\001s\000\000\002\195\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\143\001{\002\217\001t\001\132\000\000\001v\001w\001\141\001\144\000\000\001\153\001z\001|\000\000\000\000\000\242\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\000\000\000\000\001\143\000\000\000\000\0044\000\000\000\000\000\000\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\002\191\000\000\000\000\000\000\001\133\002u\001\134\002e\001r\001s\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002w\003y\000\000\001t\001\132\000\000\001v\001w\000\000\001\143\000\000\000\000\000\000\000\000\001\141\000\000\001\143\000\000\001\152\002\197\001\153\001z\002=\002>\001s\001\144\001|\001\153\001z\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\154\000\000\000\000\000\000\000\000\000\000\000\000\004,\002\159\000\000\001\133\000\000\001\134\002]\002\194\000\000\000\000\000\000\000\000\002h\000\000\002\185\000\000\002\215\000\000\001\153\002\196\002=\002>\001s\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\154\000\000\000\000\001\141\002\154\002\217\000\000\000\000\002\159\000\000\000\000\001\143\002\159\000\000\000\000\001|\000\000\000\000\000\242\000\000\001\144\002\185\001\153\001z\000\000\002\185\002\134\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\154\002\191\000\000\000\000\000\000\000\000\000\000\000\000\002\159\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\002\185\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\143\000\000\000\000\000\000\000\000\002\154\002\191\000\000\002\197\001\144\002\191\001\153\001z\002\159\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\002A\000\000\002\193\000\242\002\185\000\000\000\000\000\000\000\000\000\000\000\000\004\025\000\000\000\000\000\000\000\000\000\000\000\000\002\194\002=\002>\001s\000\000\000\000\000\000\000\000\002\191\002\215\002\197\001\153\002\196\000\000\002\197\000\000\002\154\000\000\000\000\000\000\002A\000\000\002\193\000\242\002\159\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\217\000\000\003\153\000\000\002\185\000\000\002\207\000\000\000\000\002\194\000\000\000\000\000\000\002\194\000\000\000\000\000\000\002\191\002\215\002\197\001\153\002\196\002\215\000\000\001\153\002\196\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\002\217\000\000\002\213\000\000\002\217\000\000\000\000\002\154\000\000\002\194\000\000\000\000\002=\002>\001s\002\159\000\000\000\000\002\215\002\197\001\153\002\196\000\000\000\000\000\000\000\000\002\191\002\154\002\185\000\000\000\000\000\000\000\000\000\000\000\000\002\159\000\000\000\000\002A\000\000\002\193\000\242\002\217\000\000\002\222\000\000\000\000\000\000\002\185\000\000\000\000\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\000\000\000\000\000\000\000\000\002\197\000\000\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\191\001t\001\132\002\233\001v\001w\000\000\000\000\000\000\000\000\002\194\000\000\002A\000\000\002\193\000\242\002=\002>\001s\002\215\002\191\001\153\002\196\000\000\000\000\000\000\002=\002>\001s\000\000\000\000\002\154\002A\000\000\002\193\000\242\002=\002>\001s\002\159\000\000\002\154\000\000\002\217\002\197\001\133\000\000\001\134\007\232\002\159\007\234\002\154\002\185\000\000\000\000\000\000\000\000\000\000\000\000\002\159\000\000\000\000\002\185\000\000\002\197\000\000\000\000\000\000\000\000\002\239\000\000\000\000\002\185\000\000\000\000\000\000\002\194\000\000\000\000\000\000\001\141\000\000\000\000\000\000\000\000\002\215\000\000\001\153\002\196\002\245\000\000\000\000\001|\000\000\000\000\000\242\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\215\000\000\001\153\002\196\002\217\000\000\000\000\000\000\000\000\000\000\000\000\002\191\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\002\191\000\000\002A\002\217\002\193\000\242\000\000\000\000\002\154\000\000\002\191\000\000\002A\000\000\002\193\000\242\002\159\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\002\185\001\143\000\000\000\000\000\000\002\197\002=\002>\001s\000\000\001\144\000\000\001\153\001z\000\000\002\197\002=\002>\001s\000\000\000\000\002\154\000\000\000\000\000\000\002\197\000\000\000\000\000\000\002\159\002\251\002\154\000\000\000\000\000\000\000\000\000\000\002\194\000\000\002\159\003\001\000\000\002\185\000\000\000\000\000\000\002\215\002\194\001\153\002\196\003\007\000\000\002\185\000\000\000\000\000\000\002\215\002\194\001\153\002\196\000\000\000\000\000\000\000\000\002\191\000\000\002\215\000\000\001\153\002\196\002\217\000\000\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\002\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\217\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\002=\002>\001s\000\000\002\191\000\000\002\197\000\000\000\000\002\154\002=\002>\001s\000\000\002\191\002\154\002A\002\159\002\193\000\242\002=\002>\001s\002\159\000\000\000\000\002A\000\000\002\193\000\242\002\185\003\r\000\000\004\021\000\000\002\154\002\185\000\000\002\194\000\000\000\000\000\000\000\000\002\159\000\000\000\000\000\000\002\215\002\197\001\153\002\196\000\000\000\000\000\000\000\000\000\000\002\185\006\211\002\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\217\000\000\003\019\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\003\025\000\000\000\000\000\000\000\000\000\000\002\215\002\194\001\153\002\196\000\000\002\191\000\000\000\000\000\000\000\000\002\215\002\191\001\153\002\196\000\000\000\000\000\000\002A\000\000\002\193\000\242\002@\000\000\002A\002\217\002\193\000\242\002=\002>\001s\000\000\002\191\000\000\002A\002\217\002\193\000\242\002=\002>\001s\000\000\000\000\002\154\002A\000\000\002\193\000\242\000\000\000\000\002\197\002\159\000\000\002\154\000\000\000\000\002\197\000\000\000\000\000\000\000\000\002\159\000\000\000\000\002\185\000\000\000\000\000\000\000\000\000\000\004\024\000\000\000\000\000\000\002\185\003\031\002\197\000\000\000\000\000\000\000\000\003%\002\194\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\002\215\002\194\001\153\002\196\003+\000\000\000\000\000\000\000\000\000\000\002\195\002\194\001\153\002\196\000\000\000\000\000\000\000\000\002\217\000\000\002\215\000\000\001\153\002\196\002\217\000\000\000\000\002=\002>\001s\000\000\002\191\000\000\000\000\000\000\000\000\000\000\002=\002>\001s\000\000\002\191\002\154\002A\002\217\002\193\000\242\002=\002>\001s\002\159\000\000\002\154\002A\000\000\002\193\000\242\000\000\000\000\000\000\002\159\000\000\002\154\002\185\000\000\000\000\000\000\000\000\000\000\000\000\002\159\000\000\000\000\002\185\000\000\002\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\002\197\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0031\002\154\000\000\000\000\000\000\000\000\000\000\002\194\000\000\002\159\0037\000\000\000\000\000\000\000\000\000\000\002\215\002\194\001\153\002\196\000\000\000\000\002\185\000\000\000\000\000\000\002\215\002\191\001\153\002\196\000\000\000\000\000\000\002=\002>\001s\000\000\002\191\000\000\002A\002\217\002\193\000\242\000\000\000\000\000\000\000\000\002\191\002\154\002A\002\217\002\193\000\242\002=\002>\001s\002\159\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\000\000\002\154\002\185\000\000\002\197\000\000\000\000\000\000\000\000\002\159\000\000\000\000\000\000\000\000\002\197\000\000\000\000\000\000\000\000\002\191\000\000\000\000\002\185\000\000\002\197\000\000\000\000\000\000\000\000\003=\000\000\002A\000\000\002\193\000\242\001#\002\194\000\000\001$\003C\000\000\000\000\000\000\000\000\000\000\002\215\002\194\001\153\002\196\003I\000\000\000\000\000\000\000\000\000\000\002\215\002\194\001\153\002\196\000\000\000\000\000\000\001&\002\197\000\000\002\215\002\191\001\153\002\196\002\217\000\000\000\000\003h\000\000\000\000\000\000\000\000\000\000\002A\002\217\002\193\000\242\002=\002>\001s\000\000\002\191\000\000\003O\002\217\000\000\000\000\000\000\000\000\000\000\002\194\000\000\002\154\002A\000\000\002\193\000\242\000\000\000\000\002\215\002\159\001\153\002\196\001,\000\000\002\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\002\217\000\000\002\197\000\000\000\000\000\000\000\000\003U\000\000\000\000\000\000\000\000\001)\000\000\002\194\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\002\215\000\000\001\153\002\196\003[\000\000\000\000\000\000\000\000\000\000\000\000\002\194\002=\002>\001s\000\000\000\000\002=\002>\001s\002\215\000\000\001\153\002\196\002\217\000\000\000\000\002\154\000\000\000\000\000\000\002\191\002\154\000\000\000\000\002\159\000\000\000\000\000\000\000\000\002\159\001;\000\000\002A\002\217\002\193\000\242\000\000\002\185\0011\000\000\000\000\0012\002\185\000\000\0013\0014\002\168\000\000\002=\002>\001s\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\154\002\197\000\000\000\000\002\154\000\000\000\000\0015\002\159\000\000\001?\000\000\002\159\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\000\000\000\000\002\185\003\192\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\000\000\000\000\002\191\000\000\000\000\000\000\002\215\002\191\001\153\002\196\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\217\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\002=\002>\001s\000\000\000\000\000\000\000\000\002\197\000\000\002\154\002\191\000\000\002\197\000\000\002\191\002\154\000\000\002\159\000\000\000\000\000\000\000\000\002A\002\159\002\193\000\242\002A\000\000\002\193\000\242\002\185\000\000\003\202\000\000\000\000\000\000\002\185\003\212\000\000\002\194\000\000\000\000\001r\001s\002\194\002=\002>\001s\002\215\000\000\001\153\002\196\000\000\002\215\002\197\001\153\002\196\000\000\002\197\000\000\002\154\000\000\001t\002r\000\000\001v\001w\000\000\002\159\000\000\000\000\000\000\002\217\000\000\000\000\000\000\000\000\002\217\000\000\003\222\000\000\002\185\000\000\003\231\000\000\000\000\002\194\000\000\000\000\000\000\002\194\000\000\000\000\000\000\002\191\002\215\000\000\001\153\002\196\002\215\002\191\001\153\002\196\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\002\217\000\000\000\000\000\000\002\217\000\000\002=\002>\001s\000\000\000\000\000\000\002=\002>\001s\000\000\002=\002>\001s\002\197\000\000\002\154\001{\000\000\000\000\002\197\002\191\002\154\000\000\002\159\000\000\002\154\000\000\000\000\001|\002\159\000\000\000\242\002A\002\159\002\193\000\242\002\185\000\000\003\240\000\000\000\000\000\000\002\185\000\000\003\251\002\194\002\185\000\000\000\000\000\000\000\000\002\194\000\000\000\000\002\215\000\000\001\153\002\196\000\000\000\000\002\215\000\000\001\153\002\196\002\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\217\000\000\000\000\000\000\000\000\000\000\002\217\000\000\000\000\000\000\000\000\004\004\000\000\000\000\001\143\000\000\000\000\000\000\002\194\000\000\000\000\000\000\002\191\001\152\000\000\001\153\001z\002\215\002\191\001\153\002\196\000\000\002\191\000\000\002A\000\000\002\193\000\242\000\000\000\000\002A\000\000\002\193\000\242\002A\000\000\002\193\000\242\002=\002>\001s\002\217\002=\002>\001s\000\000\000\000\000\000\000\000\001\201\001s\000\000\000\000\002\154\000\000\000\000\002\197\002\154\000\000\000\000\000\000\002\159\002\197\000\000\000\000\002\159\002\197\000\000\000\000\001t\002R\000\000\001v\001w\002\185\000\000\000\000\000\000\002\185\000\000\000\000\004\r\000\000\000\000\000\000\000\000\000\000\004\020\002\194\001#\000\000\004B\001$\000\000\002\194\000\000\000\000\002\215\002\194\001\153\002\196\000\000\000\000\002\215\000\000\001\153\002\196\002\215\001#\001\153\002\196\001$\004J\003\143\003\144\000\000\001&\000\000\000\000\000\000\000\000\002\217\000\000\000\000\000\000\000\000\004\178\002\217\000\000\000\000\000\000\002\217\000\000\000\000\000\000\001&\000\000\000\000\002\191\000\000\006\200\004\181\002\191\000\000\001#\000\000\000\000\001$\001\141\000\000\002A\000\000\002\193\000\242\002A\000\000\002\193\000\242\000\000\000\000\001|\000\000\001,\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001&\000\000\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\001,\002\197\000\000\000\000\000\000\002\197\000\000\000\000\004Q\000\000\000\000\000\000\000\000\001)\001#\001(\000\000\001$\000\000\001\027\001/\000\000\000\000\000\000\000\000\000\000\004A\000\000\000\000\000\000\004H\000\000\001)\002\194\000\000\000\000\001,\002\194\001\027\001/\000\000\001&\002\215\001\143\001\153\002\196\002\215\000\000\001\153\002\196\000\000\001(\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001#\001;\002\217\001$\001)\001#\002\217\000\000\001$\0011\001\027\001/\0012\000\000\000\000\0013\0014\000\000\000\000\007\204\001;\000\000\000\000\001,\000\000\001r\001s\001&\0011\000\000\000\000\0012\001&\000\000\0013\0014\005\214\000\000\001(\000\000\000\000\0015\000\000\000\000\004\185\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\001)\001;\000\000\000\000\000\000\0015\001\027\001/\001?\0011\000\000\000\000\0012\000\000\000\000\0013\0014\005\227\001,\000\000\006\246\001#\000\000\001,\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001(\001\133\000\000\001\134\0078\001(\000\000\000\000\0015\000\000\000\000\001?\000\000\000\000\000\000\001&\000\000\001)\000\000\001;\000\000\000\000\001)\001\027\001/\000\000\000\000\0011\001\027\001/\0012\000\000\000\000\0013\0014\007\205\001\141\001#\000\000\000\000\001$\000\000\000\000\002=\002>\001s\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0015\000\000\001,\001?\000\000\001&\000\000\002\144\000\000\000\000\001E\000\000\000\000\001P\000\000\001;\000\000\001(\0011\000\000\000\000\0012\000\000\0011\0013\0014\0012\000\000\000\000\0013\0014\001f\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\000\000\000\000\000\000\001r\001s\0015\001,\000\000\001\143\000\000\0015\001r\001s\001?\000\000\000\000\000\000\001\144\000\000\001\153\001z\001(\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\001)\002@\000\000\001;\001r\001s\001\027\001/\000\000\000\000\000\000\0011\000\000\002A\0012\002\193\000\242\0013\0014\001<\000\000\000\000\000\000\000\000\001t\001\132\000\000\001v\001w\001\133\000\000\001\134\001\190\001r\001s\000\000\000\000\001\133\000\000\001\134\001\178\000\000\000\000\0015\000\000\000\000\001?\000\000\000\000\000\000\000\000\000\000\001;\001t\001\132\000\000\001v\001w\000\000\000\000\0011\000\000\000\000\0012\001\141\000\000\0013\0014\001\133\000\000\001\134\001\175\001\141\000\000\000\000\000\000\001|\002\194\000\000\000\242\000\000\000\000\000\000\000\000\001|\000\000\002\195\000\242\001\153\002\196\000\000\000\000\0015\000\000\000\000\001T\000\000\001\133\000\000\001\134\001\136\001r\001s\001\141\000\000\000\000\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\001t\001\132\000\000\001v\001w\001\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\143\000\000\000\000\001#\001|\000\000\001$\000\242\001\143\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\001\144\000\000\001\153\001z\001r\001s\000\000\000\000\001\133\000\000\001\134\001\139\000\000\001&\001\133\000\000\001\134\001\142\001r\001s\000\000\000\000\001\143\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\001t\001\132\000\000\001v\001w\001\141\000\000\000\000\000\000\000\000\000\000\001\141\000\000\001\143\000\000\000\000\000\000\001|\001r\001s\000\242\001,\001\144\001|\001\153\001z\000\242\000\000\000\000\000\000\001\133\000\000\001\134\001\174\000\000\000\000\001(\000\000\001t\001\132\000\000\001v\001w\000\000\001\133\000\000\001\134\001\162\000\000\001#\000\000\000\000\001$\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\000\000\001\141\000\000\000\000\000\000\000\000\001#\000\000\000\000\001$\000\000\000\000\001&\001|\000\000\001\141\000\242\001\143\001\133\001#\001\134\001\170\001$\001\143\000\000\000\000\001\144\001|\001\153\001z\000\242\000\000\001\144\001&\001\153\001z\000\000\000\000\000\000\000\000\001#\001;\000\000\001$\000\000\000\000\001&\000\000\000\000\0011\000\000\000\000\0012\001\141\000\000\0013\0014\001\165\001,\000\000\000\000\000\000\000\000\000\000\000\000\001|\000\000\001&\000\242\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\001\143\000\000\001,\000\000\0015\000\000\000\000\001?\000\000\001\144\000\000\001\153\001z\001)\001\143\001,\000\000\001(\000\000\001\027\001/\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\001(\000\000\000\000\000\000\001)\000\000\001,\000\000\000\000\001#\001\027\001/\001$\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\001(\001\143\001\027\001/\000\000\000\000\000\000\000\000\000\000\000\000\001\144\000\000\001\153\001z\001;\001&\000\000\001)\000\000\000\000\000\000\000\000\0011\001\027\001/\0012\000\000\000\000\0013\0014\001\206\000\000\000\000\000\000\000\000\001;\000\000\000\000\001#\000\000\000\000\001$\000\000\0011\000\000\000\000\0012\000\000\001;\0013\0014\001\246\000\000\000\000\0015\000\000\0011\001?\000\000\0012\000\000\001,\0013\0014\001\248\001&\001r\001s\000\000\001;\000\000\000\000\000\000\000\000\000\000\0015\001(\0011\001?\000\000\0012\000\000\000\000\0013\0014\002T\001t\001\132\0015\001v\001w\001?\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\001#\000\000\000\000\001$\000\000\000\000\000\000\0015\000\000\001,\001?\000\000\001#\000\000\000\000\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001(\000\000\000\000\001&\001\133\000\000\001\134\002\139\000\000\001#\000\000\000\000\001$\000\000\000\000\001&\000\000\001)\001#\001;\000\000\001$\000\000\001\027\001/\000\000\000\000\0011\000\000\000\000\0012\000\000\000\000\0013\0014\002g\001&\000\000\000\000\001\141\000\000\000\000\000\000\000\000\000\000\001&\000\000\000\000\000\000\001,\000\000\001|\000\000\000\000\000\242\000\000\000\000\000\000\000\000\0015\000\000\001,\001?\000\000\001(\000\000\000\000\000\000\000\000\001;\000\000\000\000\000\000\000\000\000\000\000\000\001(\0011\000\000\000\000\0012\001)\001,\0013\0014\002\165\000\000\001\027\001/\000\000\000\000\001,\000\000\001)\000\000\000\000\000\000\001(\000\000\001\027\001/\000\000\000\000\000\000\000\000\000\000\001(\000\000\000\000\0015\000\000\000\000\001?\000\000\001)\001\143\000\000\000\000\000\000\000\000\001\027\001/\000\000\001)\001\144\000\000\001\153\001z\000\000\001\027\001/\001r\001s\001;\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\000\0012\001;\000\000\0013\0014\002\170\000\000\001t\001\132\0011\001v\001w\0012\000\000\000\000\0013\0014\003e\000\000\000\000\000\000\000\000\001;\000\000\000\000\000\000\000\000\000\000\000\000\0015\0011\001;\001?\0012\000\000\000\000\0013\0014\003l\0011\001#\0015\0012\006\011\001?\0013\0014\003|\000\000\001r\001s\001\133\000\000\001\134\003\132\001r\001s\000\000\000\000\000\000\000\000\000\000\0015\000\000\000\000\001?\000\000\001&\000\000\001t\001\132\0015\001v\001w\001?\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\001r\001s\000\000\001\141\000\000\000\000\000\000\000\000\001#\000\000\000\000\001$\000\000\000\000\000\000\001|\000\000\000\000\000\242\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\001r\001s\001\133\000\000\001\134\003\135\000\000\001&\001\133\000\000\001\134\003\138\000\000\000\000\000\000\000\000\000\000\001(\000\000\000\000\001t\001\132\000\000\001v\001w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\001\133\001\141\001\134\003\146\001\027\001/\000\000\001\141\000\000\000\000\000\000\000\000\000\000\001|\000\000\001\143\000\242\001,\000\000\001|\000\000\000\000\000\242\000\000\001\144\000\000\001\153\001z\001\133\000\000\001\134\005;\001(\000\000\000\000\001\141\000\000\000\000\000\000\000\000\000\000\001#\000\000\000\000\001$\000\000\000\000\001|\000\000\001)\000\242\000\000\000\000\000\000\001#\001\027\001/\001$\0011\000\000\000\000\0012\000\000\001\141\0013\0014\000\000\000\000\001&\000\000\000\000\000\000\000\000\000\000\000\000\001|\000\000\001\143\000\242\000\000\000\000\001&\000\000\001\143\000\000\000\000\001\144\000\000\001\153\001z\0015\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\001;\000\000\000\000\000\000\001#\000\000\000\000\001$\0011\000\000\001\143\0012\000\000\001,\0013\0014\005L\000\000\000\000\001\144\000\000\001\153\001z\000\000\000\000\000\000\001,\000\000\001(\000\000\000\000\001&\000\000\000\000\001#\000\000\000\000\001$\001\143\000\000\0015\001(\000\000\001?\000\000\001)\000\000\001\144\000\000\001\153\001z\001\027\001/\000\000\001#\000\000\000\000\006\b\001)\000\000\000\000\001&\000\000\000\000\001\027\001/\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001#\000\000\001,\006\b\000\000\000\000\001&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\001;\000\000\000\000\000\000\000\000\001&\000\000\000\000\0011\000\000\001,\0012\001)\001;\0013\0014\005\175\000\000\001\027\001/\000\000\0011\000\000\000\000\0012\001(\000\000\0013\0014\005\187\006\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0015\000\000\001)\001?\000\000\001(\000\000\000\000\001\027\001/\000\000\006\n\000\000\0015\000\000\000\000\001?\001#\000\000\000\000\006\b\000\000\001)\000\000\001;\000\000\001(\000\000\001\027\006\r\000\000\000\000\0011\000\000\000\000\0012\000\000\000\000\0013\0014\005\213\000\000\000\000\001)\001&\001#\000\000\000\000\006\b\001\027\006\r\000\000\000\000\001#\001;\000\000\006\b\000\000\000\000\000\000\000\000\000\000\0011\000\000\0015\0012\000\000\001?\0013\0014\005\229\000\000\001&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001&\000\000\0011\000\000\000\000\006\014\000\000\000\000\0013\0014\006\n\000\000\000\000\000\000\0015\000\000\000\000\001?\005\216\000\000\006\019\000\000\006\016\0011\000\000\001(\006\014\000\000\000\000\0013\0014\000\000\000\000\000\000\0015\000\000\000\000\000\000\006\n\005\216\000\000\006\018\001)\006\016\000\000\000\000\006\n\000\000\001\027\006\r\000\000\000\000\000\000\001(\001#\0015\000\000\001$\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\006\r\001)\000\000\000\000\001&\000\000\000\000\001\027\006\r\000\000\001#\000\000\000\000\001$\000\000\000\000\000\000\000\000\000\000\001#\000\000\000\000\001$\000\000\000\000\0011\000\000\000\000\006\014\000\000\000\000\0013\0014\000\000\000\000\000\000\000\000\001&\000\000\000\000\000\000\005\216\000\000\006\017\000\000\006\016\001&\002=\002>\001s\001,\000\000\000\000\0011\000\000\000\000\006\014\0015\000\000\0013\0014\0011\000\000\000\000\006\014\001(\000\000\0013\0014\005\216\002\146\006\015\000\000\006\016\000\000\000\000\000\000\005\216\000\000\006\027\000\000\006\016\001)\001,\001#\0015\000\000\006\b\001\027\001/\000\000\000\000\001,\0015\000\000\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001#\001(\000\000\006\b\000\000\001&\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\001)\001#\000\000\000\000\001$\000\000\001\027\001/\000\000\001&\001;\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\000\0012\000\000\002@\0013\0014\006\130\000\000\001&\000\000\000\000\000\000\000\000\006\n\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\001;\000\000\000\000\000\000\000\000\001(\000\000\0015\0011\001;\001?\0012\006\n\000\000\0013\0014\006\148\0011\000\000\000\000\0012\000\000\001)\0013\0014\006\172\000\000\001(\001\027\006\r\001#\001,\000\000\001$\000\000\000\000\000\000\000\000\000\000\001#\0015\000\000\001$\001?\001)\000\000\001(\000\000\000\000\0015\001\027\006\r\001?\000\000\000\000\000\000\002\194\001&\000\000\000\000\000\000\000\000\000\000\001)\000\000\002\195\001&\001\153\002\196\001\027\001/\000\000\001#\000\000\000\000\001$\000\000\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\000\006\014\000\000\000\000\0013\0014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\216\001&\006\232\000\000\006\016\001,\0011\000\000\000\000\006\014\000\000\006\031\0013\0014\001,\000\000\0015\001;\000\000\000\000\001(\000\000\005\216\000\000\007\002\0011\006\016\000\000\0012\001(\000\000\0013\0014\007;\000\000\000\000\000\000\001)\0015\006 \007\159\006!\001#\001\027\001/\001$\001)\001,\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\000\000\0015\000\000\000\000\001?\000\000\001(\000\000\001#\000\000\000\000\001$\000\000\001&\000\000\006\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\001\027\001/\000\000\000\000\001;\000\000\001&\000\000\000\000\000\000\000\000\000\000\0011\001;\000\000\0012\001r\001s\0013\0014\007}\0011\006#\000\000\0012\000\000\000\000\0013\0014\007\128\001,\000\000\006$\006%\000\000\006&\001t\002s\000\000\001v\001w\000\000\000\000\000\000\0015\001(\001;\001?\000\000\000\000\000\000\000\000\001,\0015\0011\000\000\001?\0012\006b\000\000\0013\0014\001)\000\000\000\000\000\000\000\000\001(\001\027\001/\001#\000\000\000\000\001$\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\006(\000\000\001)\000\000\0015\006*\0064\001R\001\027\001/\000\000\000\000\000\000\001t\002s\001&\001v\001w\006^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001r\001s\000\000\001;\001{\000\000\000\000\006_\000\000\000\000\000\000\0011\000\000\000\000\0012\000\000\001|\0013\0014\000\242\001t\002s\000\000\001v\001w\001;\000\000\000\000\000\000\000\000\000\000\000\000\001,\0011\000\000\000\000\0012\000\000\000\000\0013\0014\000\000\000\000\0015\000\000\000\000\001\241\001(\000\000\000\000\000\000\002u\000\000\001r\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001{\001)\0015\000\000\000\000\001\243\000\000\001\027\001/\002v\001t\002s\001|\001v\001w\000\242\000\000\001\143\000\000\000\000\000\000\000\000\001#\000\000\000\000\001$\001\152\000\000\001\153\001z\000\000\000\000\000\000\000\000\000\000\000\000\001{\000\000\000\000\000\000\000\000\000\000\000\000\006\031\000\000\000\000\000\000\006\205\001|\001&\000\000\000\242\000\000\001;\007\018\001#\000\000\000\000\001$\000\000\000\000\0011\000\000\000\000\0012\000\000\000\000\0013\0014\b\007\000\000\006 \b\b\006!\000\000\007\021\001\143\006\031\000\000\000\000\000\000\000\000\001&\007\005\007\022\001\152\000\000\001\153\001z\001{\000\000\000\000\000\000\0015\000\000\001,\004\180\000\000\006\217\007\018\000\000\001|\000\000\006\"\000\242\006 \000\000\006!\000\000\000\000\001(\000\000\001\143\000\000\007\023\000\000\000\000\007\019\000\000\000\000\007\021\001\152\000\000\001\153\001z\000\000\000\000\001)\001,\007\022\000\000\000\000\000\000\001\027\001/\007\006\007\005\006\"\000\000\006#\000\000\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\006$\006%\007\024\006&\000\000\000\000\000\000\000\000\000\000\000\000\007\023\001)\007\025\002=\002>\001s\001\143\001\027\001/\000\000\000\000\000\000\007\018\000\000\006#\001\152\006`\001\153\001z\000\000\0010\000\000\b\018\000\000\006$\006%\002\177\006&\0011\007\014\007\019\0012\000\000\007\021\0013\0014\000\000\007\024\000\000\000\000\006(\007\027\007\022\000\000\000\000\006*\0064\007\025\000\000\000\000\006'\007\028\000\000\007v\000\000\000\000\007\030\000\000\006^\000\000\0015\0011\000\000\000\000\0012\000\000\000\000\0013\0014\007 \000\000\007%\007\023\000\000\006(\000\000\006_\000\000\000\000\006*\0064\002=\002>\001s\000\000\000\000\007\027\007!\000\000\000\000\000\000\000\000\006^\0015\000\000\000\000\007\028\002=\002>\001s\000\000\007\030\000\000\002@\002\192\002=\002>\001s\000\000\007\024\006_\000\000\000\000\000\000\007 \002A\000\000\002\193\000\242\007\025\002\216\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\181\000\000\000\000\000\000\007!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007/\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\028\000\000\000\000\000\000\000\000\007\030\000\000\000\000\000\000\000\000\000\000\002\194\000\000\002@\000\000\000\000\000\000\000\000\007 \000\000\002\195\000\000\001\153\002\196\000\000\002A\000\000\002\193\000\242\002@\000\000\000\000\000\000\000\000\000\000\000\000\007!\002@\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\002A\000\000\002\193\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\195\000\000\001\153\002\196\000\000\000\000\000\000\002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\194\002\195\000\000\001\153\002\196\000\000\000\000\000\000\000\000\002\195\000\000\001\153\002\196")) and semantic_action = [| @@ -1443,9 +1447,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3968 "parsing/parser.mly" +# 3972 "parsing/parser.mly" ( "+" ) -# 1449 "parsing/parser.ml" +# 1453 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1468,9 +1472,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3969 "parsing/parser.mly" +# 3973 "parsing/parser.mly" ( "+." ) -# 1474 "parsing/parser.ml" +# 1478 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1493,9 +1497,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3465 "parsing/parser.mly" +# 3469 "parsing/parser.mly" ( _1 ) -# 1499 "parsing/parser.ml" +# 1503 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1508,14 +1512,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = tyvar; - MenhirLib.EngineTypes.startp = _startpos_tyvar_; - MenhirLib.EngineTypes.endp = _endpos_tyvar_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -1531,33 +1535,46 @@ module Tables = struct }; }; } = _menhir_stack in - let tyvar : (Asttypes.label) = Obj.magic tyvar in - let _3 : unit = Obj.magic _3 in + let _2_inlined1 : (Asttypes.label) = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in let _2 : unit = Obj.magic _2 in let ty : (Parsetree.core_type) = Obj.magic ty in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_ty_ in - let _endpos = _endpos_tyvar_ in + let _endpos = _endpos__2_inlined1_ in let _v : (Parsetree.core_type) = let _1 = - let _1 = -# 3468 "parsing/parser.mly" + let _1 = + let tyvar = + let (_endpos__2_, _2) = (_endpos__2_inlined1_, _2_inlined1) in + let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 3417 "parsing/parser.mly" + ( mkrhs _2 _sloc ) +# 1556 "parsing/parser.ml" + + in + +# 3472 "parsing/parser.mly" ( Ptyp_alias(ty, tyvar) ) -# 1546 "parsing/parser.ml" - in - let (_endpos__1_, _startpos__1_) = (_endpos_tyvar_, _startpos_ty_) in +# 1562 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__2_inlined1_, _startpos_ty_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1555 "parsing/parser.ml" +# 1572 "parsing/parser.ml" in -# 3470 "parsing/parser.mly" +# 3474 "parsing/parser.mly" ( _1 ) -# 1561 "parsing/parser.ml" +# 1578 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1604,30 +1621,30 @@ module Tables = struct let _v : (let_binding) = let attrs2 = let _1 = _1_inlined2 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 1610 "parsing/parser.ml" +# 1627 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 1619 "parsing/parser.ml" +# 1636 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2701 "parsing/parser.mly" +# 2705 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in mklb ~loc:_sloc false body attrs ) -# 1631 "parsing/parser.ml" +# 1648 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1650,9 +1667,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3852 "parsing/parser.mly" +# 3856 "parsing/parser.mly" ( _1 ) -# 1656 "parsing/parser.ml" +# 1673 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1675,9 +1692,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3853 "parsing/parser.mly" +# 3857 "parsing/parser.mly" ( Lident _1 ) -# 1681 "parsing/parser.ml" +# 1698 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1700,9 +1717,9 @@ module Tables = struct let _startpos = _startpos_type__ in let _endpos = _endpos_type__ in let _v : (Parsetree.core_type) = -# 3601 "parsing/parser.mly" +# 3605 "parsing/parser.mly" ( type_ ) -# 1706 "parsing/parser.ml" +# 1723 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1731,35 +1748,35 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1737 "parsing/parser.ml" +# 1754 "parsing/parser.ml" in let tys = -# 3634 "parsing/parser.mly" +# 3638 "parsing/parser.mly" ( [] ) -# 1743 "parsing/parser.ml" +# 1760 "parsing/parser.ml" in -# 3605 "parsing/parser.mly" +# 3609 "parsing/parser.mly" ( Ptyp_constr (tid, tys) ) -# 1748 "parsing/parser.ml" +# 1765 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1757 "parsing/parser.ml" +# 1774 "parsing/parser.ml" in -# 3619 "parsing/parser.mly" +# 3623 "parsing/parser.mly" ( _1 ) -# 1763 "parsing/parser.ml" +# 1780 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1795,20 +1812,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1801 "parsing/parser.ml" +# 1818 "parsing/parser.ml" in let tys = -# 3636 "parsing/parser.mly" +# 3640 "parsing/parser.mly" ( [ ty ] ) -# 1807 "parsing/parser.ml" +# 1824 "parsing/parser.ml" in -# 3605 "parsing/parser.mly" +# 3609 "parsing/parser.mly" ( Ptyp_constr (tid, tys) ) -# 1812 "parsing/parser.ml" +# 1829 "parsing/parser.ml" in let _startpos__1_ = _startpos_ty_ in @@ -1816,15 +1833,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1822 "parsing/parser.ml" +# 1839 "parsing/parser.ml" in -# 3619 "parsing/parser.mly" +# 3623 "parsing/parser.mly" ( _1 ) -# 1828 "parsing/parser.ml" +# 1845 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1875,9 +1892,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1881 "parsing/parser.ml" +# 1898 "parsing/parser.ml" in let tys = @@ -1885,24 +1902,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 1889 "parsing/parser.ml" +# 1906 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1143 "parsing/parser.mly" ( xs ) -# 1894 "parsing/parser.ml" +# 1911 "parsing/parser.ml" in -# 3638 "parsing/parser.mly" +# 3642 "parsing/parser.mly" ( tys ) -# 1900 "parsing/parser.ml" +# 1917 "parsing/parser.ml" in -# 3605 "parsing/parser.mly" +# 3609 "parsing/parser.mly" ( Ptyp_constr (tid, tys) ) -# 1906 "parsing/parser.ml" +# 1923 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -1910,15 +1927,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1916 "parsing/parser.ml" +# 1933 "parsing/parser.ml" in -# 3619 "parsing/parser.mly" +# 3623 "parsing/parser.mly" ( _1 ) -# 1922 "parsing/parser.ml" +# 1939 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1954,20 +1971,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1960 "parsing/parser.ml" +# 1977 "parsing/parser.ml" in let tys = -# 3634 "parsing/parser.mly" +# 3638 "parsing/parser.mly" ( [] ) -# 1966 "parsing/parser.ml" +# 1983 "parsing/parser.ml" in -# 3609 "parsing/parser.mly" +# 3613 "parsing/parser.mly" ( Ptyp_class (cid, tys) ) -# 1971 "parsing/parser.ml" +# 1988 "parsing/parser.ml" in let _startpos__1_ = _startpos__2_ in @@ -1975,15 +1992,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1981 "parsing/parser.ml" +# 1998 "parsing/parser.ml" in -# 3619 "parsing/parser.mly" +# 3623 "parsing/parser.mly" ( _1 ) -# 1987 "parsing/parser.ml" +# 2004 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2026,20 +2043,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2032 "parsing/parser.ml" +# 2049 "parsing/parser.ml" in let tys = -# 3636 "parsing/parser.mly" +# 3640 "parsing/parser.mly" ( [ ty ] ) -# 2038 "parsing/parser.ml" +# 2055 "parsing/parser.ml" in -# 3609 "parsing/parser.mly" +# 3613 "parsing/parser.mly" ( Ptyp_class (cid, tys) ) -# 2043 "parsing/parser.ml" +# 2060 "parsing/parser.ml" in let _startpos__1_ = _startpos_ty_ in @@ -2047,15 +2064,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2053 "parsing/parser.ml" +# 2070 "parsing/parser.ml" in -# 3619 "parsing/parser.mly" +# 3623 "parsing/parser.mly" ( _1 ) -# 2059 "parsing/parser.ml" +# 2076 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2113,9 +2130,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2119 "parsing/parser.ml" +# 2136 "parsing/parser.ml" in let tys = @@ -2123,24 +2140,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2127 "parsing/parser.ml" +# 2144 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1143 "parsing/parser.mly" ( xs ) -# 2132 "parsing/parser.ml" +# 2149 "parsing/parser.ml" in -# 3638 "parsing/parser.mly" +# 3642 "parsing/parser.mly" ( tys ) -# 2138 "parsing/parser.ml" +# 2155 "parsing/parser.ml" in -# 3609 "parsing/parser.mly" +# 3613 "parsing/parser.mly" ( Ptyp_class (cid, tys) ) -# 2144 "parsing/parser.ml" +# 2161 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -2148,15 +2165,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2154 "parsing/parser.ml" +# 2171 "parsing/parser.ml" in -# 3619 "parsing/parser.mly" +# 3623 "parsing/parser.mly" ( _1 ) -# 2160 "parsing/parser.ml" +# 2177 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2199,15 +2216,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2205 "parsing/parser.ml" +# 2222 "parsing/parser.ml" in -# 3613 "parsing/parser.mly" +# 3617 "parsing/parser.mly" ( Ptyp_open (mod_ident, type_) ) -# 2211 "parsing/parser.ml" +# 2228 "parsing/parser.ml" in let _endpos__1_ = _endpos_type__ in @@ -2215,15 +2232,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2221 "parsing/parser.ml" +# 2238 "parsing/parser.ml" in -# 3619 "parsing/parser.mly" +# 3623 "parsing/parser.mly" ( _1 ) -# 2227 "parsing/parser.ml" +# 2244 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2254,24 +2271,24 @@ module Tables = struct let _endpos = _endpos_ident_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3615 "parsing/parser.mly" +# 3619 "parsing/parser.mly" ( Ptyp_var ident ) -# 2260 "parsing/parser.ml" +# 2277 "parsing/parser.ml" in let _endpos__1_ = _endpos_ident_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2269 "parsing/parser.ml" +# 2286 "parsing/parser.ml" in -# 3619 "parsing/parser.mly" +# 3623 "parsing/parser.mly" ( _1 ) -# 2275 "parsing/parser.ml" +# 2292 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2295,23 +2312,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3617 "parsing/parser.mly" +# 3621 "parsing/parser.mly" ( Ptyp_any ) -# 2301 "parsing/parser.ml" +# 2318 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2309 "parsing/parser.ml" +# 2326 "parsing/parser.ml" in -# 3619 "parsing/parser.mly" +# 3623 "parsing/parser.mly" ( _1 ) -# 2315 "parsing/parser.ml" +# 2332 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2335,23 +2352,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Ast_helper.str) = let _1 = let _1 = -# 4035 "parsing/parser.mly" +# 4039 "parsing/parser.mly" ( _1 ) -# 2341 "parsing/parser.ml" +# 2358 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 986 "parsing/parser.mly" +# 990 "parsing/parser.mly" ( mkloc _1 (make_loc _sloc) ) -# 2349 "parsing/parser.ml" +# 2366 "parsing/parser.ml" in -# 4037 "parsing/parser.mly" +# 4041 "parsing/parser.mly" ( _1 ) -# 2355 "parsing/parser.ml" +# 2372 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2389,24 +2406,51 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Ast_helper.str) = let _1 = let _1 = -# 4036 "parsing/parser.mly" +# 4040 "parsing/parser.mly" ( _1 ^ "." ^ _3.txt ) -# 2395 "parsing/parser.ml" +# 2412 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 986 "parsing/parser.mly" +# 990 "parsing/parser.mly" ( mkloc _1 (make_loc _sloc) ) -# 2404 "parsing/parser.ml" +# 2421 "parsing/parser.ml" in -# 4037 "parsing/parser.mly" +# 4041 "parsing/parser.mly" ( _1 ) -# 2410 "parsing/parser.ml" +# 2427 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.payload) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.payload) = +# 4096 "parsing/parser.mly" + ( Builtin_attributes.mark_payload_attrs_used _1; + _1 + ) +# 2454 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2453,9 +2497,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4041 "parsing/parser.mly" - ( Attr.mk ~loc:(make_loc _sloc) _2 _3 ) -# 2459 "parsing/parser.ml" +# 4045 "parsing/parser.mly" + ( mk_attr ~loc:(make_loc _sloc) _2 _3 ) +# 2503 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2478,9 +2522,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.class_expr) = -# 1971 "parsing/parser.mly" +# 1975 "parsing/parser.mly" ( _1 ) -# 2484 "parsing/parser.ml" +# 2528 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2519,18 +2563,18 @@ module Tables = struct let _v : (Parsetree.class_expr) = let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 2525 "parsing/parser.ml" +# 2569 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1973 "parsing/parser.mly" +# 1977 "parsing/parser.mly" ( wrap_class_attrs ~loc:_sloc _3 _2 ) -# 2534 "parsing/parser.ml" +# 2578 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2570,9 +2614,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1975 "parsing/parser.mly" +# 1979 "parsing/parser.mly" ( class_of_let_bindings ~loc:_sloc _1 _3 ) -# 2576 "parsing/parser.ml" +# 2620 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2635,34 +2679,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2641 "parsing/parser.ml" +# 2685 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in let _4 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 2650 "parsing/parser.ml" +# 2694 "parsing/parser.ml" in let _3 = -# 3960 "parsing/parser.mly" +# 3964 "parsing/parser.mly" ( Fresh ) -# 2656 "parsing/parser.ml" +# 2700 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1977 "parsing/parser.mly" +# 1981 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkclass ~loc:_sloc ~attrs:_4 (Pcl_open(od, _7)) ) -# 2666 "parsing/parser.ml" +# 2710 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2732,34 +2776,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2738 "parsing/parser.ml" +# 2782 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 2747 "parsing/parser.ml" +# 2791 "parsing/parser.ml" in let _3 = -# 3961 "parsing/parser.mly" +# 3965 "parsing/parser.mly" ( Override ) -# 2753 "parsing/parser.ml" +# 2797 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1977 "parsing/parser.mly" +# 1981 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkclass ~loc:_sloc ~attrs:_4 (Pcl_open(od, _7)) ) -# 2763 "parsing/parser.ml" +# 2807 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2789,9 +2833,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = -# 1981 "parsing/parser.mly" +# 1985 "parsing/parser.mly" ( Cl.attr _1 _2 ) -# 2795 "parsing/parser.ml" +# 2839 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2826,18 +2870,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2830 "parsing/parser.ml" +# 2874 "parsing/parser.ml" in -# 1058 "parsing/parser.mly" +# 1062 "parsing/parser.mly" ( xs ) -# 2835 "parsing/parser.ml" +# 2879 "parsing/parser.ml" in -# 1984 "parsing/parser.mly" +# 1988 "parsing/parser.mly" ( Pcl_apply(_1, _2) ) -# 2841 "parsing/parser.ml" +# 2885 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -2845,15 +2889,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1009 "parsing/parser.mly" +# 1013 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 2851 "parsing/parser.ml" +# 2895 "parsing/parser.ml" in -# 1987 "parsing/parser.mly" +# 1991 "parsing/parser.mly" ( _1 ) -# 2857 "parsing/parser.ml" +# 2901 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2877,23 +2921,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1986 "parsing/parser.mly" +# 1990 "parsing/parser.mly" ( Pcl_extension _1 ) -# 2883 "parsing/parser.ml" +# 2927 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1009 "parsing/parser.mly" +# 1013 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 2891 "parsing/parser.ml" +# 2935 "parsing/parser.ml" in -# 1987 "parsing/parser.mly" +# 1991 "parsing/parser.mly" ( _1 ) -# 2897 "parsing/parser.ml" +# 2941 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2946,33 +2990,33 @@ module Tables = struct let _v : (Parsetree.class_field) = let _6 = let _1 = _1_inlined2 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 2952 "parsing/parser.ml" +# 2996 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 2961 "parsing/parser.ml" +# 3005 "parsing/parser.ml" in let _2 = -# 3960 "parsing/parser.mly" +# 3964 "parsing/parser.mly" ( Fresh ) -# 2967 "parsing/parser.ml" +# 3011 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2036 "parsing/parser.mly" +# 2040 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_inherit (_2, _4, self)) ~attrs:(_3@_6) ~docs ) -# 2976 "parsing/parser.ml" +# 3020 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3032,33 +3076,33 @@ module Tables = struct let _v : (Parsetree.class_field) = let _6 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 3038 "parsing/parser.ml" +# 3082 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined3_ in let _3 = let _1 = _1_inlined2 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 3047 "parsing/parser.ml" +# 3091 "parsing/parser.ml" in let _2 = -# 3961 "parsing/parser.mly" +# 3965 "parsing/parser.mly" ( Override ) -# 3053 "parsing/parser.ml" +# 3097 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2036 "parsing/parser.mly" +# 2040 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_inherit (_2, _4, self)) ~attrs:(_3@_6) ~docs ) -# 3062 "parsing/parser.ml" +# 3106 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3099,9 +3143,9 @@ module Tables = struct let _v : (Parsetree.class_field) = let _3 = let _1 = _1_inlined1 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 3105 "parsing/parser.ml" +# 3149 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -3109,11 +3153,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2039 "parsing/parser.mly" +# 2043 "parsing/parser.mly" ( let v, attrs = _2 in let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_val v) ~attrs:(attrs@_3) ~docs ) -# 3117 "parsing/parser.ml" +# 3161 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3154,9 +3198,9 @@ module Tables = struct let _v : (Parsetree.class_field) = let _3 = let _1 = _1_inlined1 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 3160 "parsing/parser.ml" +# 3204 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -3164,11 +3208,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2043 "parsing/parser.mly" +# 2047 "parsing/parser.mly" ( let meth, attrs = _2 in let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_method meth) ~attrs:(attrs@_3) ~docs ) -# 3172 "parsing/parser.ml" +# 3216 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3214,28 +3258,28 @@ module Tables = struct let _v : (Parsetree.class_field) = let _4 = let _1 = _1_inlined2 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 3220 "parsing/parser.ml" +# 3264 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 3229 "parsing/parser.ml" +# 3273 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2047 "parsing/parser.mly" +# 2051 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_constraint _3) ~attrs:(_2@_4) ~docs ) -# 3239 "parsing/parser.ml" +# 3283 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3281,28 +3325,28 @@ module Tables = struct let _v : (Parsetree.class_field) = let _4 = let _1 = _1_inlined2 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 3287 "parsing/parser.ml" +# 3331 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 3296 "parsing/parser.ml" +# 3340 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2050 "parsing/parser.mly" +# 2054 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_initializer _3) ~attrs:(_2@_4) ~docs ) -# 3306 "parsing/parser.ml" +# 3350 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3334,9 +3378,9 @@ module Tables = struct let _v : (Parsetree.class_field) = let _2 = let _1 = _1_inlined1 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 3340 "parsing/parser.ml" +# 3384 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -3344,10 +3388,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2053 "parsing/parser.mly" +# 2057 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_extension _1) ~attrs:_2 ~docs ) -# 3351 "parsing/parser.ml" +# 3395 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3371,23 +3415,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_field) = let _1 = let _1 = -# 2056 "parsing/parser.mly" +# 2060 "parsing/parser.mly" ( Pcf_attribute _1 ) -# 3377 "parsing/parser.ml" +# 3421 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1007 "parsing/parser.mly" +# 1011 "parsing/parser.mly" ( mkcf ~loc:_sloc _1 ) -# 3385 "parsing/parser.ml" +# 3429 "parsing/parser.ml" in -# 2057 "parsing/parser.mly" +# 2061 "parsing/parser.mly" ( _1 ) -# 3391 "parsing/parser.ml" +# 3435 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3417,9 +3461,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = -# 1951 "parsing/parser.mly" +# 1955 "parsing/parser.mly" ( _2 ) -# 3423 "parsing/parser.ml" +# 3467 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3464,24 +3508,24 @@ module Tables = struct let _endpos = _endpos__4_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1954 "parsing/parser.mly" +# 1958 "parsing/parser.mly" ( Pcl_constraint(_4, _2) ) -# 3470 "parsing/parser.ml" +# 3514 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1009 "parsing/parser.mly" +# 1013 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3479 "parsing/parser.ml" +# 3523 "parsing/parser.ml" in -# 1957 "parsing/parser.mly" +# 1961 "parsing/parser.mly" ( _1 ) -# 3485 "parsing/parser.ml" +# 3529 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3512,24 +3556,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1956 "parsing/parser.mly" +# 1960 "parsing/parser.mly" ( let (l,o,p) = _1 in Pcl_fun(l, o, p, _2) ) -# 3518 "parsing/parser.ml" +# 3562 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1009 "parsing/parser.mly" +# 1013 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3527 "parsing/parser.ml" +# 3571 "parsing/parser.ml" in -# 1957 "parsing/parser.mly" +# 1961 "parsing/parser.mly" ( _1 ) -# 3533 "parsing/parser.ml" +# 3577 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3567,24 +3611,24 @@ module Tables = struct let _endpos = _endpos_e_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 2012 "parsing/parser.mly" +# 2016 "parsing/parser.mly" ( let (l,o,p) = _1 in Pcl_fun(l, o, p, e) ) -# 3573 "parsing/parser.ml" +# 3617 "parsing/parser.ml" in let _endpos__1_ = _endpos_e_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1009 "parsing/parser.mly" +# 1013 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3582 "parsing/parser.ml" +# 3626 "parsing/parser.ml" in -# 2013 "parsing/parser.mly" +# 2017 "parsing/parser.mly" ( _1 ) -# 3588 "parsing/parser.ml" +# 3632 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3615,24 +3659,24 @@ module Tables = struct let _endpos = _endpos_e_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 2012 "parsing/parser.mly" +# 2016 "parsing/parser.mly" ( let (l,o,p) = _1 in Pcl_fun(l, o, p, e) ) -# 3621 "parsing/parser.ml" +# 3665 "parsing/parser.ml" in let _endpos__1_ = _endpos_e_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1009 "parsing/parser.mly" +# 1013 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3630 "parsing/parser.ml" +# 3674 "parsing/parser.ml" in -# 2013 "parsing/parser.mly" +# 2017 "parsing/parser.mly" ( _1 ) -# 3636 "parsing/parser.ml" +# 3680 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3655,9 +3699,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3842 "parsing/parser.mly" +# 3846 "parsing/parser.mly" ( _1 ) -# 3661 "parsing/parser.ml" +# 3705 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3697,9 +3741,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2021 "parsing/parser.mly" +# 2025 "parsing/parser.mly" ( reloc_pat ~loc:_sloc _2 ) -# 3703 "parsing/parser.ml" +# 3747 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3751,24 +3795,24 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2023 "parsing/parser.mly" +# 2027 "parsing/parser.mly" ( Ppat_constraint(_2, _4) ) -# 3757 "parsing/parser.ml" +# 3801 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 3766 "parsing/parser.ml" +# 3810 "parsing/parser.ml" in -# 2024 "parsing/parser.mly" +# 2028 "parsing/parser.mly" ( _1 ) -# 3772 "parsing/parser.ml" +# 3816 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3787,9 +3831,9 @@ module Tables = struct let _symbolstartpos = _endpos in let _sloc = (_symbolstartpos, _endpos) in -# 2026 "parsing/parser.mly" +# 2030 "parsing/parser.mly" ( ghpat ~loc:_sloc Ppat_any ) -# 3793 "parsing/parser.ml" +# 3837 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3826,9 +3870,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = -# 2151 "parsing/parser.mly" +# 2155 "parsing/parser.mly" ( _2 ) -# 3832 "parsing/parser.ml" +# 3876 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3845,24 +3889,24 @@ module Tables = struct let _endpos = _startpos in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 2152 "parsing/parser.mly" +# 2156 "parsing/parser.mly" ( Ptyp_any ) -# 3851 "parsing/parser.ml" +# 3895 "parsing/parser.ml" in let _endpos__1_ = _endpos__0_ in let _endpos = _endpos__1_ in let _symbolstartpos = _endpos in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 3860 "parsing/parser.ml" +# 3904 "parsing/parser.ml" in -# 2153 "parsing/parser.mly" +# 2157 "parsing/parser.mly" ( _1 ) -# 3866 "parsing/parser.ml" +# 3910 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3908,28 +3952,28 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _4 = let _1 = _1_inlined2 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 3914 "parsing/parser.ml" +# 3958 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 3923 "parsing/parser.ml" +# 3967 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2161 "parsing/parser.mly" +# 2165 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_inherit _3) ~attrs:(_2@_4) ~docs ) -# 3933 "parsing/parser.ml" +# 3977 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3987,9 +4031,9 @@ module Tables = struct let ty : (Parsetree.core_type) = Obj.magic ty in let _3 : unit = Obj.magic _3 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 3993 "parsing/parser.ml" +# 4037 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let flags : (Asttypes.mutable_flag * Asttypes.virtual_flag) = Obj.magic flags in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -4000,9 +4044,9 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _4 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 4006 "parsing/parser.ml" +# 4050 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined3_ in @@ -4010,44 +4054,44 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let label = let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 4016 "parsing/parser.ml" +# 4060 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4024 "parsing/parser.ml" +# 4068 "parsing/parser.ml" in -# 2186 "parsing/parser.mly" +# 2190 "parsing/parser.mly" ( let mut, virt = flags in label, mut, virt, ty ) -# 4033 "parsing/parser.ml" +# 4077 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 4041 "parsing/parser.ml" +# 4085 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2164 "parsing/parser.mly" +# 2168 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_val _3) ~attrs:(_2@_4) ~docs ) -# 4051 "parsing/parser.ml" +# 4095 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4105,9 +4149,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.core_type) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 4111 "parsing/parser.ml" +# 4155 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag * Asttypes.virtual_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -4118,53 +4162,53 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _7 = let _1 = _1_inlined4 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 4124 "parsing/parser.ml" +# 4168 "parsing/parser.ml" in let _endpos__7_ = _endpos__1_inlined4_ in let _6 = let _1 = _1_inlined3 in -# 3431 "parsing/parser.mly" +# 3435 "parsing/parser.mly" ( _1 ) -# 4133 "parsing/parser.ml" +# 4177 "parsing/parser.ml" in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 4141 "parsing/parser.ml" +# 4185 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4149 "parsing/parser.ml" +# 4193 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 4157 "parsing/parser.ml" +# 4201 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2168 "parsing/parser.mly" +# 2172 "parsing/parser.mly" ( let (p, v) = _3 in let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_method (_4, p, v, _6)) ~attrs:(_2@_7) ~docs ) -# 4168 "parsing/parser.ml" +# 4212 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4210,28 +4254,28 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _4 = let _1 = _1_inlined2 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 4216 "parsing/parser.ml" +# 4260 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 4225 "parsing/parser.ml" +# 4269 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2172 "parsing/parser.mly" +# 2176 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_constraint _3) ~attrs:(_2@_4) ~docs ) -# 4235 "parsing/parser.ml" +# 4279 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4263,9 +4307,9 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _2 = let _1 = _1_inlined1 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 4269 "parsing/parser.ml" +# 4313 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -4273,10 +4317,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2175 "parsing/parser.mly" +# 2179 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_extension _1) ~attrs:_2 ~docs ) -# 4280 "parsing/parser.ml" +# 4324 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4300,23 +4344,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_type_field) = let _1 = let _1 = -# 2178 "parsing/parser.mly" +# 2182 "parsing/parser.mly" ( Pctf_attribute _1 ) -# 4306 "parsing/parser.ml" +# 4350 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1005 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( mkctf ~loc:_sloc _1 ) -# 4314 "parsing/parser.ml" +# 4358 "parsing/parser.ml" in -# 2179 "parsing/parser.mly" +# 2183 "parsing/parser.mly" ( _1 ) -# 4320 "parsing/parser.ml" +# 4364 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4345,42 +4389,42 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4351 "parsing/parser.ml" +# 4395 "parsing/parser.ml" in let tys = let tys = -# 2137 "parsing/parser.mly" +# 2141 "parsing/parser.mly" ( [] ) -# 4358 "parsing/parser.ml" +# 4402 "parsing/parser.ml" in -# 2143 "parsing/parser.mly" +# 2147 "parsing/parser.mly" ( tys ) -# 4363 "parsing/parser.ml" +# 4407 "parsing/parser.ml" in -# 2120 "parsing/parser.mly" +# 2124 "parsing/parser.mly" ( Pcty_constr (cid, tys) ) -# 4369 "parsing/parser.ml" +# 4413 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1003 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 4378 "parsing/parser.ml" +# 4422 "parsing/parser.ml" in -# 2123 "parsing/parser.mly" +# 2127 "parsing/parser.mly" ( _1 ) -# 4384 "parsing/parser.ml" +# 4428 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4431,9 +4475,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4437 "parsing/parser.ml" +# 4481 "parsing/parser.ml" in let tys = @@ -4442,30 +4486,30 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 4446 "parsing/parser.ml" +# 4490 "parsing/parser.ml" in -# 1111 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( xs ) -# 4451 "parsing/parser.ml" +# 4495 "parsing/parser.ml" in -# 2139 "parsing/parser.mly" +# 2143 "parsing/parser.mly" ( params ) -# 4457 "parsing/parser.ml" +# 4501 "parsing/parser.ml" in -# 2143 "parsing/parser.mly" +# 2147 "parsing/parser.mly" ( tys ) -# 4463 "parsing/parser.ml" +# 4507 "parsing/parser.ml" in -# 2120 "parsing/parser.mly" +# 2124 "parsing/parser.mly" ( Pcty_constr (cid, tys) ) -# 4469 "parsing/parser.ml" +# 4513 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -4473,15 +4517,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1003 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 4479 "parsing/parser.ml" +# 4523 "parsing/parser.ml" in -# 2123 "parsing/parser.mly" +# 2127 "parsing/parser.mly" ( _1 ) -# 4485 "parsing/parser.ml" +# 4529 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4505,23 +4549,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_type) = let _1 = let _1 = -# 2122 "parsing/parser.mly" +# 2126 "parsing/parser.mly" ( Pcty_extension _1 ) -# 4511 "parsing/parser.ml" +# 4555 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1003 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 4519 "parsing/parser.ml" +# 4563 "parsing/parser.ml" in -# 2123 "parsing/parser.mly" +# 2127 "parsing/parser.mly" ( _1 ) -# 4525 "parsing/parser.ml" +# 4569 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4578,44 +4622,44 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 4582 "parsing/parser.ml" +# 4626 "parsing/parser.ml" in -# 2157 "parsing/parser.mly" +# 2161 "parsing/parser.mly" ( _1 ) -# 4587 "parsing/parser.ml" +# 4631 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 951 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( extra_csig _startpos _endpos _1 ) -# 4596 "parsing/parser.ml" +# 4640 "parsing/parser.ml" in -# 2147 "parsing/parser.mly" +# 2151 "parsing/parser.mly" ( Csig.mk _1 _2 ) -# 4602 "parsing/parser.ml" +# 4646 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 4610 "parsing/parser.ml" +# 4654 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2125 "parsing/parser.mly" +# 2129 "parsing/parser.mly" ( mkcty ~loc:_sloc ~attrs:_2 (Pcty_signature _3) ) -# 4619 "parsing/parser.ml" +# 4663 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4672,43 +4716,43 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 4676 "parsing/parser.ml" +# 4720 "parsing/parser.ml" in -# 2157 "parsing/parser.mly" +# 2161 "parsing/parser.mly" ( _1 ) -# 4681 "parsing/parser.ml" +# 4725 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 951 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( extra_csig _startpos _endpos _1 ) -# 4690 "parsing/parser.ml" +# 4734 "parsing/parser.ml" in -# 2147 "parsing/parser.mly" +# 2151 "parsing/parser.mly" ( Csig.mk _1 _2 ) -# 4696 "parsing/parser.ml" +# 4740 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 4704 "parsing/parser.ml" +# 4748 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2127 "parsing/parser.mly" +# 2131 "parsing/parser.mly" ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 4712 "parsing/parser.ml" +# 4756 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4738,9 +4782,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_type) = -# 2129 "parsing/parser.mly" +# 2133 "parsing/parser.mly" ( Cty.attr _1 _2 ) -# 4744 "parsing/parser.ml" +# 4788 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4803,34 +4847,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4809 "parsing/parser.ml" +# 4853 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in let _4 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 4818 "parsing/parser.ml" +# 4862 "parsing/parser.ml" in let _3 = -# 3960 "parsing/parser.mly" +# 3964 "parsing/parser.mly" ( Fresh ) -# 4824 "parsing/parser.ml" +# 4868 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2131 "parsing/parser.mly" +# 2135 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkcty ~loc:_sloc ~attrs:_4 (Pcty_open(od, _7)) ) -# 4834 "parsing/parser.ml" +# 4878 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4900,34 +4944,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4906 "parsing/parser.ml" +# 4950 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 4915 "parsing/parser.ml" +# 4959 "parsing/parser.ml" in let _3 = -# 3961 "parsing/parser.mly" +# 3965 "parsing/parser.mly" ( Override ) -# 4921 "parsing/parser.ml" +# 4965 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2131 "parsing/parser.mly" +# 2135 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkcty ~loc:_sloc ~attrs:_4 (Pcty_open(od, _7)) ) -# 4931 "parsing/parser.ml" +# 4975 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4964,9 +5008,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.class_expr) = -# 1991 "parsing/parser.mly" +# 1995 "parsing/parser.mly" ( _2 ) -# 4970 "parsing/parser.ml" +# 5014 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5005,9 +5049,9 @@ module Tables = struct let _v : (Parsetree.class_expr) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1993 "parsing/parser.mly" +# 1997 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 5011 "parsing/parser.ml" +# 5055 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5036,42 +5080,42 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5042 "parsing/parser.ml" +# 5086 "parsing/parser.ml" in let tys = let tys = -# 2137 "parsing/parser.mly" +# 2141 "parsing/parser.mly" ( [] ) -# 5049 "parsing/parser.ml" +# 5093 "parsing/parser.ml" in -# 2143 "parsing/parser.mly" +# 2147 "parsing/parser.mly" ( tys ) -# 5054 "parsing/parser.ml" +# 5098 "parsing/parser.ml" in -# 1996 "parsing/parser.mly" +# 2000 "parsing/parser.mly" ( Pcl_constr(cid, tys) ) -# 5060 "parsing/parser.ml" +# 5104 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1009 "parsing/parser.mly" +# 1013 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5069 "parsing/parser.ml" +# 5113 "parsing/parser.ml" in -# 2003 "parsing/parser.mly" +# 2007 "parsing/parser.mly" ( _1 ) -# 5075 "parsing/parser.ml" +# 5119 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5122,9 +5166,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5128 "parsing/parser.ml" +# 5172 "parsing/parser.ml" in let tys = @@ -5133,30 +5177,30 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 5137 "parsing/parser.ml" +# 5181 "parsing/parser.ml" in -# 1111 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( xs ) -# 5142 "parsing/parser.ml" +# 5186 "parsing/parser.ml" in -# 2139 "parsing/parser.mly" +# 2143 "parsing/parser.mly" ( params ) -# 5148 "parsing/parser.ml" +# 5192 "parsing/parser.ml" in -# 2143 "parsing/parser.mly" +# 2147 "parsing/parser.mly" ( tys ) -# 5154 "parsing/parser.ml" +# 5198 "parsing/parser.ml" in -# 1996 "parsing/parser.mly" +# 2000 "parsing/parser.mly" ( Pcl_constr(cid, tys) ) -# 5160 "parsing/parser.ml" +# 5204 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -5164,15 +5208,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1009 "parsing/parser.mly" +# 1013 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5170 "parsing/parser.ml" +# 5214 "parsing/parser.ml" in -# 2003 "parsing/parser.mly" +# 2007 "parsing/parser.mly" ( _1 ) -# 5176 "parsing/parser.ml" +# 5220 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5231,43 +5275,43 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 5235 "parsing/parser.ml" +# 5279 "parsing/parser.ml" in -# 2030 "parsing/parser.mly" +# 2034 "parsing/parser.mly" ( _1 ) -# 5240 "parsing/parser.ml" +# 5284 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 950 "parsing/parser.mly" +# 954 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 5249 "parsing/parser.ml" +# 5293 "parsing/parser.ml" in -# 2017 "parsing/parser.mly" +# 2021 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 5255 "parsing/parser.ml" +# 5299 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 5263 "parsing/parser.ml" +# 5307 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1998 "parsing/parser.mly" +# 2002 "parsing/parser.mly" ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 5271 "parsing/parser.ml" +# 5315 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -5275,15 +5319,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1009 "parsing/parser.mly" +# 1013 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5281 "parsing/parser.ml" +# 5325 "parsing/parser.ml" in -# 2003 "parsing/parser.mly" +# 2007 "parsing/parser.mly" ( _1 ) -# 5287 "parsing/parser.ml" +# 5331 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5335,24 +5379,24 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 2000 "parsing/parser.mly" +# 2004 "parsing/parser.mly" ( Pcl_constraint(_2, _4) ) -# 5341 "parsing/parser.ml" +# 5385 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1009 "parsing/parser.mly" +# 1013 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5350 "parsing/parser.ml" +# 5394 "parsing/parser.ml" in -# 2003 "parsing/parser.mly" +# 2007 "parsing/parser.mly" ( _1 ) -# 5356 "parsing/parser.ml" +# 5400 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5407,9 +5451,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2002 "parsing/parser.mly" +# 2006 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 5413 "parsing/parser.ml" +# 5457 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -5417,15 +5461,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1009 "parsing/parser.mly" +# 1013 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5423 "parsing/parser.ml" +# 5467 "parsing/parser.ml" in -# 2003 "parsing/parser.mly" +# 2007 "parsing/parser.mly" ( _1 ) -# 5429 "parsing/parser.ml" +# 5473 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5482,44 +5526,44 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 5486 "parsing/parser.ml" +# 5530 "parsing/parser.ml" in -# 2030 "parsing/parser.mly" +# 2034 "parsing/parser.mly" ( _1 ) -# 5491 "parsing/parser.ml" +# 5535 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 950 "parsing/parser.mly" +# 954 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 5500 "parsing/parser.ml" +# 5544 "parsing/parser.ml" in -# 2017 "parsing/parser.mly" +# 2021 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 5506 "parsing/parser.ml" +# 5550 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 5514 "parsing/parser.ml" +# 5558 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2005 "parsing/parser.mly" +# 2009 "parsing/parser.mly" ( mkclass ~loc:_sloc ~attrs:_2 (Pcl_structure _3) ) -# 5523 "parsing/parser.ml" +# 5567 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5542,9 +5586,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.class_type) = -# 2108 "parsing/parser.mly" +# 2112 "parsing/parser.mly" ( _1 ) -# 5548 "parsing/parser.ml" +# 5592 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5590,14 +5634,14 @@ module Tables = struct let _v : (Parsetree.class_type) = let _1 = let _1 = let label = -# 3494 "parsing/parser.mly" +# 3498 "parsing/parser.mly" ( Optional label ) -# 5596 "parsing/parser.ml" +# 5640 "parsing/parser.ml" in -# 2114 "parsing/parser.mly" +# 2118 "parsing/parser.mly" ( Pcty_arrow(label, domain, codomain) ) -# 5601 "parsing/parser.ml" +# 5645 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -5605,15 +5649,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1003 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 5611 "parsing/parser.ml" +# 5655 "parsing/parser.ml" in -# 2115 "parsing/parser.mly" +# 2119 "parsing/parser.mly" ( _1 ) -# 5617 "parsing/parser.ml" +# 5661 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5660,9 +5704,9 @@ module Tables = struct let domain : (Parsetree.core_type) = Obj.magic domain in let _2 : unit = Obj.magic _2 in let label : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 5666 "parsing/parser.ml" +# 5710 "parsing/parser.ml" ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in @@ -5670,14 +5714,14 @@ module Tables = struct let _v : (Parsetree.class_type) = let _1 = let _1 = let label = -# 3496 "parsing/parser.mly" +# 3500 "parsing/parser.mly" ( Labelled label ) -# 5676 "parsing/parser.ml" +# 5720 "parsing/parser.ml" in -# 2114 "parsing/parser.mly" +# 2118 "parsing/parser.mly" ( Pcty_arrow(label, domain, codomain) ) -# 5681 "parsing/parser.ml" +# 5725 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -5685,15 +5729,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1003 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 5691 "parsing/parser.ml" +# 5735 "parsing/parser.ml" in -# 2115 "parsing/parser.mly" +# 2119 "parsing/parser.mly" ( _1 ) -# 5697 "parsing/parser.ml" +# 5741 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5732,14 +5776,14 @@ module Tables = struct let _v : (Parsetree.class_type) = let _1 = let _1 = let label = -# 3498 "parsing/parser.mly" +# 3502 "parsing/parser.mly" ( Nolabel ) -# 5738 "parsing/parser.ml" +# 5782 "parsing/parser.ml" in -# 2114 "parsing/parser.mly" +# 2118 "parsing/parser.mly" ( Pcty_arrow(label, domain, codomain) ) -# 5743 "parsing/parser.ml" +# 5787 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_domain_) in @@ -5747,15 +5791,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1003 "parsing/parser.mly" +# 1007 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 5753 "parsing/parser.ml" +# 5797 "parsing/parser.ml" in -# 2115 "parsing/parser.mly" +# 2119 "parsing/parser.mly" ( _1 ) -# 5759 "parsing/parser.ml" +# 5803 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5838,9 +5882,9 @@ module Tables = struct let csig : (Parsetree.class_type) = Obj.magic csig in let _8 : unit = Obj.magic _8 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 5844 "parsing/parser.ml" +# 5888 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -5856,9 +5900,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 5862 "parsing/parser.ml" +# 5906 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -5868,24 +5912,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5874 "parsing/parser.ml" +# 5918 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 5882 "parsing/parser.ml" +# 5926 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2253 "parsing/parser.mly" +# 2257 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -5893,19 +5937,19 @@ module Tables = struct ext, Ci.mk id csig ~virt ~params ~attrs ~loc ~docs ) -# 5897 "parsing/parser.ml" +# 5941 "parsing/parser.ml" in -# 1208 "parsing/parser.mly" +# 1212 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 5903 "parsing/parser.ml" +# 5947 "parsing/parser.ml" in -# 2241 "parsing/parser.mly" +# 2245 "parsing/parser.mly" ( _1 ) -# 5909 "parsing/parser.ml" +# 5953 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5928,9 +5972,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3839 "parsing/parser.mly" +# 3843 "parsing/parser.mly" ( _1 ) -# 5934 "parsing/parser.ml" +# 5978 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5949,17 +5993,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 760 "parsing/parser.mly" +# 764 "parsing/parser.mly" (string * char option) -# 5955 "parsing/parser.ml" +# 5999 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 3722 "parsing/parser.mly" +# 3726 "parsing/parser.mly" ( let (n, m) = _1 in Pconst_integer (n, m) ) -# 5963 "parsing/parser.ml" +# 6007 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5978,17 +6022,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 719 "parsing/parser.mly" +# 723 "parsing/parser.mly" (char) -# 5984 "parsing/parser.ml" +# 6028 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 3723 "parsing/parser.mly" +# 3727 "parsing/parser.mly" ( Pconst_char _1 ) -# 5992 "parsing/parser.ml" +# 6036 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6007,17 +6051,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 812 "parsing/parser.mly" +# 816 "parsing/parser.mly" (string * Location.t * string option) -# 6013 "parsing/parser.ml" +# 6057 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 3724 "parsing/parser.mly" +# 3728 "parsing/parser.mly" ( let (s, strloc, d) = _1 in Pconst_string (s, strloc, d) ) -# 6021 "parsing/parser.ml" +# 6065 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6036,17 +6080,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 739 "parsing/parser.mly" +# 743 "parsing/parser.mly" (string * char option) -# 6042 "parsing/parser.ml" +# 6086 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 3725 "parsing/parser.mly" +# 3729 "parsing/parser.mly" ( let (f, m) = _1 in Pconst_float (f, m) ) -# 6050 "parsing/parser.ml" +# 6094 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6076,9 +6120,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.label) = -# 3796 "parsing/parser.mly" +# 3800 "parsing/parser.mly" ( "[]" ) -# 6082 "parsing/parser.ml" +# 6126 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6108,9 +6152,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.label) = -# 3797 "parsing/parser.mly" +# 3801 "parsing/parser.mly" ( "()" ) -# 6114 "parsing/parser.ml" +# 6158 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6133,9 +6177,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3798 "parsing/parser.mly" +# 3802 "parsing/parser.mly" ( "false" ) -# 6139 "parsing/parser.ml" +# 6183 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6158,9 +6202,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3799 "parsing/parser.mly" +# 3803 "parsing/parser.mly" ( "true" ) -# 6164 "parsing/parser.ml" +# 6208 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6179,17 +6223,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 825 "parsing/parser.mly" +# 829 "parsing/parser.mly" (string) -# 6185 "parsing/parser.ml" +# 6229 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3802 "parsing/parser.mly" +# 3806 "parsing/parser.mly" ( _1 ) -# 6193 "parsing/parser.ml" +# 6237 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6226,14 +6270,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Asttypes.label) = let _1 = -# 3793 "parsing/parser.mly" +# 3797 "parsing/parser.mly" ( "::" ) -# 6232 "parsing/parser.ml" +# 6276 "parsing/parser.ml" in -# 3803 "parsing/parser.mly" +# 3807 "parsing/parser.mly" ( _1 ) -# 6237 "parsing/parser.ml" +# 6281 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6256,9 +6300,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3804 "parsing/parser.mly" +# 3808 "parsing/parser.mly" ( _1 ) -# 6262 "parsing/parser.ml" +# 6306 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6281,9 +6325,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3807 "parsing/parser.mly" +# 3811 "parsing/parser.mly" ( _1 ) -# 6287 "parsing/parser.ml" +# 6331 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6334,14 +6378,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = let _3 = -# 3793 "parsing/parser.mly" +# 3797 "parsing/parser.mly" ( "::" ) -# 6340 "parsing/parser.ml" +# 6384 "parsing/parser.ml" in -# 3808 "parsing/parser.mly" +# 3812 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 6345 "parsing/parser.ml" +# 6389 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6378,14 +6422,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = let _1 = -# 3793 "parsing/parser.mly" +# 3797 "parsing/parser.mly" ( "::" ) -# 6384 "parsing/parser.ml" +# 6428 "parsing/parser.ml" in -# 3809 "parsing/parser.mly" +# 3813 "parsing/parser.mly" ( Lident _1 ) -# 6389 "parsing/parser.ml" +# 6433 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6408,9 +6452,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3810 "parsing/parser.mly" +# 3814 "parsing/parser.mly" ( Lident _1 ) -# 6414 "parsing/parser.ml" +# 6458 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6447,9 +6491,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type * Parsetree.core_type) = -# 2197 "parsing/parser.mly" +# 2201 "parsing/parser.mly" ( _1, _3 ) -# 6453 "parsing/parser.ml" +# 6497 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6474,26 +6518,26 @@ module Tables = struct let _v : (Parsetree.constructor_arguments) = let tys = let xs = let xs = -# 1095 "parsing/parser.mly" +# 1099 "parsing/parser.mly" ( [ x ] ) -# 6480 "parsing/parser.ml" +# 6524 "parsing/parser.ml" in # 253 "" ( List.rev xs ) -# 6485 "parsing/parser.ml" +# 6529 "parsing/parser.ml" in -# 1115 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 6491 "parsing/parser.ml" +# 6535 "parsing/parser.ml" in -# 3297 "parsing/parser.mly" +# 3301 "parsing/parser.mly" ( Pcstr_tuple tys ) -# 6497 "parsing/parser.ml" +# 6541 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6532,26 +6576,26 @@ module Tables = struct let _v : (Parsetree.constructor_arguments) = let tys = let xs = let xs = -# 1099 "parsing/parser.mly" +# 1103 "parsing/parser.mly" ( x :: xs ) -# 6538 "parsing/parser.ml" +# 6582 "parsing/parser.ml" in # 253 "" ( List.rev xs ) -# 6543 "parsing/parser.ml" +# 6587 "parsing/parser.ml" in -# 1115 "parsing/parser.mly" +# 1119 "parsing/parser.mly" ( xs ) -# 6549 "parsing/parser.ml" +# 6593 "parsing/parser.ml" in -# 3297 "parsing/parser.mly" +# 3301 "parsing/parser.mly" ( Pcstr_tuple tys ) -# 6555 "parsing/parser.ml" +# 6599 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6588,9 +6632,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.constructor_arguments) = -# 3299 "parsing/parser.mly" +# 3303 "parsing/parser.mly" ( Pcstr_record _2 ) -# 6594 "parsing/parser.ml" +# 6638 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6613,9 +6657,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constructor_declaration list) = -# 3213 "parsing/parser.mly" +# 3217 "parsing/parser.mly" ( [] ) -# 6619 "parsing/parser.ml" +# 6663 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6638,14 +6682,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.constructor_declaration list) = let cs = -# 1200 "parsing/parser.mly" +# 1204 "parsing/parser.mly" ( List.rev xs ) -# 6644 "parsing/parser.ml" +# 6688 "parsing/parser.ml" in -# 3215 "parsing/parser.mly" +# 3219 "parsing/parser.mly" ( cs ) -# 6649 "parsing/parser.ml" +# 6693 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6668,14 +6712,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = -# 3456 "parsing/parser.mly" +# 3460 "parsing/parser.mly" ( _1 ) -# 6674 "parsing/parser.ml" +# 6718 "parsing/parser.ml" in -# 3446 "parsing/parser.mly" +# 3450 "parsing/parser.mly" ( _1 ) -# 6679 "parsing/parser.ml" +# 6723 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6705,9 +6749,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = -# 3448 "parsing/parser.mly" +# 3452 "parsing/parser.mly" ( Typ.attr _1 _2 ) -# 6711 "parsing/parser.ml" +# 6755 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6730,9 +6774,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3596 "parsing/parser.mly" +# 3600 "parsing/parser.mly" ( _1 ) -# 6736 "parsing/parser.ml" +# 6780 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6755,9 +6799,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3596 "parsing/parser.mly" +# 3600 "parsing/parser.mly" ( _1 ) -# 6761 "parsing/parser.ml" +# 6805 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6780,9 +6824,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3596 "parsing/parser.mly" +# 3600 "parsing/parser.mly" ( _1 ) -# 6786 "parsing/parser.ml" +# 6830 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6819,9 +6863,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = -# 3549 "parsing/parser.mly" +# 3553 "parsing/parser.mly" ( type_ ) -# 6825 "parsing/parser.ml" +# 6869 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6884,11 +6928,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 6892 "parsing/parser.ml" +# 6936 "parsing/parser.ml" in let attrs = @@ -6896,24 +6940,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 6902 "parsing/parser.ml" +# 6946 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 6908 "parsing/parser.ml" +# 6952 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3551 "parsing/parser.mly" +# 3555 "parsing/parser.mly" ( wrap_typ_attrs ~loc:_sloc (reloc_typ ~loc:_sloc package_type) attrs ) -# 6917 "parsing/parser.ml" +# 6961 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6951,24 +6995,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3554 "parsing/parser.mly" +# 3558 "parsing/parser.mly" ( Ptyp_variant([ field ], Closed, None) ) -# 6957 "parsing/parser.ml" +# 7001 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 6966 "parsing/parser.ml" +# 7010 "parsing/parser.ml" in -# 3571 "parsing/parser.mly" +# 3575 "parsing/parser.mly" ( _1 ) -# 6972 "parsing/parser.ml" +# 7016 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7018,24 +7062,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7022 "parsing/parser.ml" +# 7066 "parsing/parser.ml" in -# 1111 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( xs ) -# 7027 "parsing/parser.ml" +# 7071 "parsing/parser.ml" in -# 3648 "parsing/parser.mly" +# 3652 "parsing/parser.mly" ( _1 ) -# 7033 "parsing/parser.ml" +# 7077 "parsing/parser.ml" in -# 3556 "parsing/parser.mly" +# 3560 "parsing/parser.mly" ( Ptyp_variant(fields, Closed, None) ) -# 7039 "parsing/parser.ml" +# 7083 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -7043,15 +7087,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7049 "parsing/parser.ml" +# 7093 "parsing/parser.ml" in -# 3571 "parsing/parser.mly" +# 3575 "parsing/parser.mly" ( _1 ) -# 7055 "parsing/parser.ml" +# 7099 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7108,24 +7152,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7112 "parsing/parser.ml" +# 7156 "parsing/parser.ml" in -# 1111 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( xs ) -# 7117 "parsing/parser.ml" +# 7161 "parsing/parser.ml" in -# 3648 "parsing/parser.mly" +# 3652 "parsing/parser.mly" ( _1 ) -# 7123 "parsing/parser.ml" +# 7167 "parsing/parser.ml" in -# 3558 "parsing/parser.mly" +# 3562 "parsing/parser.mly" ( Ptyp_variant(field :: fields, Closed, None) ) -# 7129 "parsing/parser.ml" +# 7173 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -7133,15 +7177,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7139 "parsing/parser.ml" +# 7183 "parsing/parser.ml" in -# 3571 "parsing/parser.mly" +# 3575 "parsing/parser.mly" ( _1 ) -# 7145 "parsing/parser.ml" +# 7189 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7191,24 +7235,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7195 "parsing/parser.ml" +# 7239 "parsing/parser.ml" in -# 1111 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( xs ) -# 7200 "parsing/parser.ml" +# 7244 "parsing/parser.ml" in -# 3648 "parsing/parser.mly" +# 3652 "parsing/parser.mly" ( _1 ) -# 7206 "parsing/parser.ml" +# 7250 "parsing/parser.ml" in -# 3560 "parsing/parser.mly" +# 3564 "parsing/parser.mly" ( Ptyp_variant(fields, Open, None) ) -# 7212 "parsing/parser.ml" +# 7256 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -7216,15 +7260,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7222 "parsing/parser.ml" +# 7266 "parsing/parser.ml" in -# 3571 "parsing/parser.mly" +# 3575 "parsing/parser.mly" ( _1 ) -# 7228 "parsing/parser.ml" +# 7272 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7255,24 +7299,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3562 "parsing/parser.mly" +# 3566 "parsing/parser.mly" ( Ptyp_variant([], Open, None) ) -# 7261 "parsing/parser.ml" +# 7305 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7270 "parsing/parser.ml" +# 7314 "parsing/parser.ml" in -# 3571 "parsing/parser.mly" +# 3575 "parsing/parser.mly" ( _1 ) -# 7276 "parsing/parser.ml" +# 7320 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7322,24 +7366,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7326 "parsing/parser.ml" +# 7370 "parsing/parser.ml" in -# 1111 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( xs ) -# 7331 "parsing/parser.ml" +# 7375 "parsing/parser.ml" in -# 3648 "parsing/parser.mly" +# 3652 "parsing/parser.mly" ( _1 ) -# 7337 "parsing/parser.ml" +# 7381 "parsing/parser.ml" in -# 3564 "parsing/parser.mly" +# 3568 "parsing/parser.mly" ( Ptyp_variant(fields, Closed, Some []) ) -# 7343 "parsing/parser.ml" +# 7387 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -7347,15 +7391,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7353 "parsing/parser.ml" +# 7397 "parsing/parser.ml" in -# 3571 "parsing/parser.mly" +# 3575 "parsing/parser.mly" ( _1 ) -# 7359 "parsing/parser.ml" +# 7403 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7420,18 +7464,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7424 "parsing/parser.ml" +# 7468 "parsing/parser.ml" in -# 1058 "parsing/parser.mly" +# 1062 "parsing/parser.mly" ( xs ) -# 7429 "parsing/parser.ml" +# 7473 "parsing/parser.ml" in -# 3676 "parsing/parser.mly" +# 3680 "parsing/parser.mly" ( _1 ) -# 7435 "parsing/parser.ml" +# 7479 "parsing/parser.ml" in let fields = @@ -7439,24 +7483,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7443 "parsing/parser.ml" +# 7487 "parsing/parser.ml" in -# 1111 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( xs ) -# 7448 "parsing/parser.ml" +# 7492 "parsing/parser.ml" in -# 3648 "parsing/parser.mly" +# 3652 "parsing/parser.mly" ( _1 ) -# 7454 "parsing/parser.ml" +# 7498 "parsing/parser.ml" in -# 3569 "parsing/parser.mly" +# 3573 "parsing/parser.mly" ( Ptyp_variant(fields, Closed, Some tags) ) -# 7460 "parsing/parser.ml" +# 7504 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -7464,15 +7508,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7470 "parsing/parser.ml" +# 7514 "parsing/parser.ml" in -# 3571 "parsing/parser.mly" +# 3575 "parsing/parser.mly" ( _1 ) -# 7476 "parsing/parser.ml" +# 7520 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7495,9 +7539,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.direction_flag) = -# 3905 "parsing/parser.mly" +# 3909 "parsing/parser.mly" ( Upto ) -# 7501 "parsing/parser.ml" +# 7545 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7520,9 +7564,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.direction_flag) = -# 3906 "parsing/parser.mly" +# 3910 "parsing/parser.mly" ( Downto ) -# 7526 "parsing/parser.ml" +# 7570 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7538,9 +7582,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (string Asttypes.loc option) = -# 4061 "parsing/parser.mly" +# 4065 "parsing/parser.mly" ( None ) -# 7544 "parsing/parser.ml" +# 7588 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7570,9 +7614,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (string Asttypes.loc option) = -# 4062 "parsing/parser.mly" +# 4066 "parsing/parser.mly" ( Some _2 ) -# 7576 "parsing/parser.ml" +# 7620 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7616,9 +7660,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.extension) = -# 4074 "parsing/parser.mly" +# 4078 "parsing/parser.mly" ( (_2, _3) ) -# 7622 "parsing/parser.ml" +# 7666 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7637,9 +7681,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 814 "parsing/parser.mly" +# 818 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) -# 7643 "parsing/parser.ml" +# 7687 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -7648,9 +7692,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4076 "parsing/parser.mly" +# 4080 "parsing/parser.mly" ( mk_quotedext ~loc:_sloc _1 ) -# 7654 "parsing/parser.ml" +# 7698 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7703,9 +7747,9 @@ module Tables = struct let _v : (Parsetree.extension_constructor) = let attrs = let _1 = _1_inlined3 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 7709 "parsing/parser.ml" +# 7753 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined3_ in @@ -7715,9 +7759,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 7721 "parsing/parser.ml" +# 7765 "parsing/parser.ml" in let cid = @@ -7726,19 +7770,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 7732 "parsing/parser.ml" +# 7776 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3366 "parsing/parser.mly" +# 3370 "parsing/parser.mly" ( let info = symbol_info _endpos in Te.rebind cid lid ~attrs ~loc:(make_loc _sloc) ~info ) -# 7742 "parsing/parser.ml" +# 7786 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7784,9 +7828,9 @@ module Tables = struct let _v : (Parsetree.extension_constructor) = let attrs = let _1 = _1_inlined2 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 7790 "parsing/parser.ml" +# 7834 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined2_ in @@ -7796,9 +7840,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 7802 "parsing/parser.ml" +# 7846 "parsing/parser.ml" in let cid = @@ -7806,25 +7850,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 7812 "parsing/parser.ml" +# 7856 "parsing/parser.ml" in let _startpos_cid_ = _startpos__1_ in let _1 = -# 3879 "parsing/parser.mly" +# 3883 "parsing/parser.mly" ( () ) -# 7819 "parsing/parser.ml" +# 7863 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos_cid_ in let _sloc = (_symbolstartpos, _endpos) in -# 3366 "parsing/parser.mly" +# 3370 "parsing/parser.mly" ( let info = symbol_info _endpos in Te.rebind cid lid ~attrs ~loc:(make_loc _sloc) ~info ) -# 7828 "parsing/parser.ml" +# 7872 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7848,24 +7892,24 @@ module Tables = struct let _endpos = _endpos_ext_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3587 "parsing/parser.mly" +# 3591 "parsing/parser.mly" ( Ptyp_extension ext ) -# 7854 "parsing/parser.ml" +# 7898 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_ext_, _startpos_ext_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 7863 "parsing/parser.ml" +# 7907 "parsing/parser.ml" in -# 3589 "parsing/parser.mly" +# 3593 "parsing/parser.mly" ( _1 ) -# 7869 "parsing/parser.ml" +# 7913 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7912,10 +7956,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4049 "parsing/parser.mly" +# 4053 "parsing/parser.mly" ( mark_symbol_docs _sloc; - Attr.mk ~loc:(make_loc _sloc) _2 _3 ) -# 7919 "parsing/parser.ml" + mk_attr ~loc:(make_loc _sloc) _2 _3 ) +# 7963 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7931,14 +7975,14 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let params = -# 2137 "parsing/parser.mly" +# 2141 "parsing/parser.mly" ( [] ) -# 7937 "parsing/parser.ml" +# 7981 "parsing/parser.ml" in -# 1962 "parsing/parser.mly" +# 1966 "parsing/parser.mly" ( params ) -# 7942 "parsing/parser.ml" +# 7986 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7979,24 +8023,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7983 "parsing/parser.ml" +# 8027 "parsing/parser.ml" in -# 1111 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( xs ) -# 7988 "parsing/parser.ml" +# 8032 "parsing/parser.ml" in -# 2139 "parsing/parser.mly" +# 2143 "parsing/parser.mly" ( params ) -# 7994 "parsing/parser.ml" +# 8038 "parsing/parser.ml" in -# 1962 "parsing/parser.mly" +# 1966 "parsing/parser.mly" ( params ) -# 8000 "parsing/parser.ml" +# 8044 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8044,18 +8088,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8048 "parsing/parser.ml" +# 8092 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 8053 "parsing/parser.ml" +# 8097 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 8059 "parsing/parser.ml" +# 8103 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -8064,22 +8108,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 8070 "parsing/parser.ml" +# 8114 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 8076 "parsing/parser.ml" +# 8120 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2738 "parsing/parser.mly" +# 2742 "parsing/parser.mly" ( let ext, attrs = _2 in match ext with | None -> Pfunction_cases (_3, make_loc _sloc, attrs) @@ -8089,7 +8133,7 @@ module Tables = struct Pfunction_body (mkexp_attrs ~loc:_sloc (mkfunction [] None cases) _2) ) -# 8093 "parsing/parser.ml" +# 8137 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8112,9 +8156,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.function_body) = -# 2748 "parsing/parser.mly" +# 2752 "parsing/parser.mly" ( Pfunction_body _1 ) -# 8118 "parsing/parser.ml" +# 8162 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8137,9 +8181,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = -# 2395 "parsing/parser.mly" +# 2399 "parsing/parser.mly" ( _1 ) -# 8143 "parsing/parser.ml" +# 8187 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8217,9 +8261,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 8223 "parsing/parser.ml" +# 8267 "parsing/parser.ml" in let _3 = @@ -8227,21 +8271,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 8233 "parsing/parser.ml" +# 8277 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 8239 "parsing/parser.ml" +# 8283 "parsing/parser.ml" in -# 2431 "parsing/parser.mly" +# 2435 "parsing/parser.mly" ( Pexp_letmodule(_4, _5, _7), _3 ) -# 8245 "parsing/parser.ml" +# 8289 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -8249,10 +8293,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8256 "parsing/parser.ml" +# 8300 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8337,9 +8381,9 @@ module Tables = struct let _3 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 8343 "parsing/parser.ml" +# 8387 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -8348,19 +8392,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 8354 "parsing/parser.ml" +# 8398 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3277 "parsing/parser.mly" +# 3281 "parsing/parser.mly" ( let vars, args, res = _2 in Te.decl _1 ~vars ~args ?res ~attrs:_3 ~loc:(make_loc _sloc) ) -# 8364 "parsing/parser.ml" +# 8408 "parsing/parser.ml" in let _3 = @@ -8368,21 +8412,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 8374 "parsing/parser.ml" +# 8418 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 8380 "parsing/parser.ml" +# 8424 "parsing/parser.ml" in -# 2433 "parsing/parser.mly" +# 2437 "parsing/parser.mly" ( Pexp_letexception(_4, _6), _3 ) -# 8386 "parsing/parser.ml" +# 8430 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -8390,10 +8434,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8397 "parsing/parser.ml" +# 8441 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8463,28 +8507,28 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 8469 "parsing/parser.ml" +# 8513 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 8475 "parsing/parser.ml" +# 8519 "parsing/parser.ml" in let _3 = -# 3960 "parsing/parser.mly" +# 3964 "parsing/parser.mly" ( Fresh ) -# 8481 "parsing/parser.ml" +# 8525 "parsing/parser.ml" in -# 2435 "parsing/parser.mly" +# 2439 "parsing/parser.mly" ( let open_loc = make_loc (_startpos__2_, _endpos__5_) in let od = Opn.mk _5 ~override:_3 ~loc:open_loc in Pexp_open(od, _7), _4 ) -# 8488 "parsing/parser.ml" +# 8532 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -8492,10 +8536,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8499 "parsing/parser.ml" +# 8543 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8572,28 +8616,28 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 8578 "parsing/parser.ml" +# 8622 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 8584 "parsing/parser.ml" +# 8628 "parsing/parser.ml" in let _3 = -# 3961 "parsing/parser.mly" +# 3965 "parsing/parser.mly" ( Override ) -# 8590 "parsing/parser.ml" +# 8634 "parsing/parser.ml" in -# 2435 "parsing/parser.mly" +# 2439 "parsing/parser.mly" ( let open_loc = make_loc (_startpos__2_, _endpos__5_) in let od = Opn.mk _5 ~override:_3 ~loc:open_loc in Pexp_open(od, _7), _4 ) -# 8597 "parsing/parser.ml" +# 8641 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -8601,10 +8645,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8608 "parsing/parser.ml" +# 8652 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8674,23 +8718,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 8680 "parsing/parser.ml" +# 8724 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 8686 "parsing/parser.ml" +# 8730 "parsing/parser.ml" in -# 2441 "parsing/parser.mly" +# 2445 "parsing/parser.mly" ( let body_constraint = Option.map (fun x -> Pconstraint x) _4 in mkfunction _3 body_constraint _6, _2 ) -# 8694 "parsing/parser.ml" +# 8738 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -8698,10 +8742,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8705 "parsing/parser.ml" +# 8749 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8764,18 +8808,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8768 "parsing/parser.ml" +# 8812 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 8773 "parsing/parser.ml" +# 8817 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 8779 "parsing/parser.ml" +# 8823 "parsing/parser.ml" in let _2 = @@ -8783,21 +8827,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 8789 "parsing/parser.ml" +# 8833 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 8795 "parsing/parser.ml" +# 8839 "parsing/parser.ml" in -# 2445 "parsing/parser.mly" +# 2449 "parsing/parser.mly" ( Pexp_match(_3, _5), _2 ) -# 8801 "parsing/parser.ml" +# 8845 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -8805,10 +8849,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8812 "parsing/parser.ml" +# 8856 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8871,18 +8915,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8875 "parsing/parser.ml" +# 8919 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 8880 "parsing/parser.ml" +# 8924 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 8886 "parsing/parser.ml" +# 8930 "parsing/parser.ml" in let _2 = @@ -8890,21 +8934,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 8896 "parsing/parser.ml" +# 8940 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 8902 "parsing/parser.ml" +# 8946 "parsing/parser.ml" in -# 2447 "parsing/parser.mly" +# 2451 "parsing/parser.mly" ( Pexp_try(_3, _5), _2 ) -# 8908 "parsing/parser.ml" +# 8952 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -8912,10 +8956,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8919 "parsing/parser.ml" +# 8963 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8978,21 +9022,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 8984 "parsing/parser.ml" +# 9028 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 8990 "parsing/parser.ml" +# 9034 "parsing/parser.ml" in -# 2449 "parsing/parser.mly" +# 2453 "parsing/parser.mly" ( syntax_error() ) -# 8996 "parsing/parser.ml" +# 9040 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -9000,10 +9044,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9007 "parsing/parser.ml" +# 9051 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9078,27 +9122,27 @@ module Tables = struct let _7 = let _1 = _1_inlined4 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 9084 "parsing/parser.ml" +# 9128 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 9089 "parsing/parser.ml" +# 9133 "parsing/parser.ml" in let _5 = let _1 = _1_inlined3 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 9097 "parsing/parser.ml" +# 9141 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 9102 "parsing/parser.ml" +# 9146 "parsing/parser.ml" in let _2 = @@ -9106,21 +9150,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 9112 "parsing/parser.ml" +# 9156 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 9118 "parsing/parser.ml" +# 9162 "parsing/parser.ml" in -# 2451 "parsing/parser.mly" +# 2455 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 9124 "parsing/parser.ml" +# 9168 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -9128,10 +9172,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9135 "parsing/parser.ml" +# 9179 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9232,18 +9276,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 9236 "parsing/parser.ml" +# 9280 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 9241 "parsing/parser.ml" +# 9285 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 9247 "parsing/parser.ml" +# 9291 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -9252,22 +9296,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 9258 "parsing/parser.ml" +# 9302 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 9264 "parsing/parser.ml" +# 9308 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -9280,26 +9324,26 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 9284 "parsing/parser.ml" +# 9328 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 9290 "parsing/parser.ml" +# 9334 "parsing/parser.ml" in let _5 = let _1 = _1_inlined3 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 9298 "parsing/parser.ml" +# 9342 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 9303 "parsing/parser.ml" +# 9347 "parsing/parser.ml" in let _2 = @@ -9307,21 +9351,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 9313 "parsing/parser.ml" +# 9357 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 9319 "parsing/parser.ml" +# 9363 "parsing/parser.ml" in -# 2451 "parsing/parser.mly" +# 2455 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 9325 "parsing/parser.ml" +# 9369 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -9329,10 +9373,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9336 "parsing/parser.ml" +# 9380 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9428,14 +9472,14 @@ module Tables = struct let _7 = let _1 = _1_inlined6 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 9434 "parsing/parser.ml" +# 9478 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 9439 "parsing/parser.ml" +# 9483 "parsing/parser.ml" in let _5 = @@ -9446,18 +9490,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 9450 "parsing/parser.ml" +# 9494 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 9455 "parsing/parser.ml" +# 9499 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 9461 "parsing/parser.ml" +# 9505 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -9466,22 +9510,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 9472 "parsing/parser.ml" +# 9516 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 9478 "parsing/parser.ml" +# 9522 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -9494,13 +9538,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 9498 "parsing/parser.ml" +# 9542 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 9504 "parsing/parser.ml" +# 9548 "parsing/parser.ml" in let _2 = @@ -9508,21 +9552,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 9514 "parsing/parser.ml" +# 9558 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 9520 "parsing/parser.ml" +# 9564 "parsing/parser.ml" in -# 2451 "parsing/parser.mly" +# 2455 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 9526 "parsing/parser.ml" +# 9570 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined6_ in @@ -9530,10 +9574,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9537 "parsing/parser.ml" +# 9581 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9655,18 +9699,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 9659 "parsing/parser.ml" +# 9703 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 9664 "parsing/parser.ml" +# 9708 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 9670 "parsing/parser.ml" +# 9714 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -9675,22 +9719,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 9681 "parsing/parser.ml" +# 9725 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 9687 "parsing/parser.ml" +# 9731 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -9703,13 +9747,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 9707 "parsing/parser.ml" +# 9751 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 9713 "parsing/parser.ml" +# 9757 "parsing/parser.ml" in let _5 = @@ -9720,18 +9764,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 9724 "parsing/parser.ml" +# 9768 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 9729 "parsing/parser.ml" +# 9773 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 9735 "parsing/parser.ml" +# 9779 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -9740,22 +9784,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 9746 "parsing/parser.ml" +# 9790 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 9752 "parsing/parser.ml" +# 9796 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -9768,13 +9812,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 9772 "parsing/parser.ml" +# 9816 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 9778 "parsing/parser.ml" +# 9822 "parsing/parser.ml" in let _2 = @@ -9782,21 +9826,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 9788 "parsing/parser.ml" +# 9832 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 9794 "parsing/parser.ml" +# 9838 "parsing/parser.ml" in -# 2451 "parsing/parser.mly" +# 2455 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 9800 "parsing/parser.ml" +# 9844 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_inlined1_ in @@ -9804,10 +9848,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9811 "parsing/parser.ml" +# 9855 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9868,14 +9912,14 @@ module Tables = struct let _5 = let _1 = _1_inlined3 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 9874 "parsing/parser.ml" +# 9918 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 9879 "parsing/parser.ml" +# 9923 "parsing/parser.ml" in let _2 = @@ -9883,21 +9927,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 9889 "parsing/parser.ml" +# 9933 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 9895 "parsing/parser.ml" +# 9939 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2457 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, None), _2 ) -# 9901 "parsing/parser.ml" +# 9945 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -9905,10 +9949,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9912 "parsing/parser.ml" +# 9956 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9995,18 +10039,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 9999 "parsing/parser.ml" +# 10043 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 10004 "parsing/parser.ml" +# 10048 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 10010 "parsing/parser.ml" +# 10054 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -10015,22 +10059,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 10021 "parsing/parser.ml" +# 10065 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 10027 "parsing/parser.ml" +# 10071 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -10043,13 +10087,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 10047 "parsing/parser.ml" +# 10091 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 10053 "parsing/parser.ml" +# 10097 "parsing/parser.ml" in let _2 = @@ -10057,21 +10101,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 10063 "parsing/parser.ml" +# 10107 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 10069 "parsing/parser.ml" +# 10113 "parsing/parser.ml" in -# 2453 "parsing/parser.mly" +# 2457 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, None), _2 ) -# 10075 "parsing/parser.ml" +# 10119 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -10079,10 +10123,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10086 "parsing/parser.ml" +# 10130 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10148,30 +10192,30 @@ module Tables = struct let _endpos = _endpos__3_inlined1_ in let _v : (Parsetree.expression) = let _1 = let _4 = -# 2466 "parsing/parser.mly" +# 2470 "parsing/parser.mly" ( e ) -# 10154 "parsing/parser.ml" +# 10198 "parsing/parser.ml" in let _2 = let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 10163 "parsing/parser.ml" +# 10207 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 10169 "parsing/parser.ml" +# 10213 "parsing/parser.ml" in -# 2455 "parsing/parser.mly" +# 2459 "parsing/parser.mly" ( Pexp_while(_3, _4), _2 ) -# 10175 "parsing/parser.ml" +# 10219 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_inlined1_ in @@ -10179,10 +10223,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10186 "parsing/parser.ml" +# 10230 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10252,9 +10296,9 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2468 "parsing/parser.mly" +# 2472 "parsing/parser.mly" ( unclosed "do" _loc__1_ "done" _loc__2_ ) -# 10258 "parsing/parser.ml" +# 10302 "parsing/parser.ml" in let _2 = @@ -10262,21 +10306,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 10268 "parsing/parser.ml" +# 10312 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 10274 "parsing/parser.ml" +# 10318 "parsing/parser.ml" in -# 2455 "parsing/parser.mly" +# 2459 "parsing/parser.mly" ( Pexp_while(_3, _4), _2 ) -# 10280 "parsing/parser.ml" +# 10324 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_inlined1_ in @@ -10284,10 +10328,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10291 "parsing/parser.ml" +# 10335 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10381,30 +10425,30 @@ module Tables = struct let _endpos = _endpos__3_inlined1_ in let _v : (Parsetree.expression) = let _1 = let _8 = -# 2466 "parsing/parser.mly" +# 2470 "parsing/parser.mly" ( e ) -# 10387 "parsing/parser.ml" +# 10431 "parsing/parser.ml" in let _2 = let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 10396 "parsing/parser.ml" +# 10440 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 10402 "parsing/parser.ml" +# 10446 "parsing/parser.ml" in -# 2458 "parsing/parser.mly" +# 2462 "parsing/parser.mly" ( Pexp_for(_3, _5, _7, _6, _8), _2 ) -# 10408 "parsing/parser.ml" +# 10452 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_inlined1_ in @@ -10412,10 +10456,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10419 "parsing/parser.ml" +# 10463 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10513,9 +10557,9 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2468 "parsing/parser.mly" +# 2472 "parsing/parser.mly" ( unclosed "do" _loc__1_ "done" _loc__2_ ) -# 10519 "parsing/parser.ml" +# 10563 "parsing/parser.ml" in let _2 = @@ -10523,21 +10567,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 10529 "parsing/parser.ml" +# 10573 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 10535 "parsing/parser.ml" +# 10579 "parsing/parser.ml" in -# 2458 "parsing/parser.mly" +# 2462 "parsing/parser.mly" ( Pexp_for(_3, _5, _7, _6, _8), _2 ) -# 10541 "parsing/parser.ml" +# 10585 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_inlined1_ in @@ -10545,10 +10589,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10552 "parsing/parser.ml" +# 10596 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10597,21 +10641,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 10603 "parsing/parser.ml" +# 10647 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 10609 "parsing/parser.ml" +# 10653 "parsing/parser.ml" in -# 2460 "parsing/parser.mly" +# 2464 "parsing/parser.mly" ( Pexp_assert _3, _2 ) -# 10615 "parsing/parser.ml" +# 10659 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -10619,10 +10663,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10626 "parsing/parser.ml" +# 10670 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10671,21 +10715,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 10677 "parsing/parser.ml" +# 10721 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 10683 "parsing/parser.ml" +# 10727 "parsing/parser.ml" in -# 2462 "parsing/parser.mly" +# 2466 "parsing/parser.mly" ( Pexp_lazy _3, _2 ) -# 10689 "parsing/parser.ml" +# 10733 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -10693,10 +10737,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2397 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 10700 "parsing/parser.ml" +# 10744 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10731,18 +10775,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 10735 "parsing/parser.ml" +# 10779 "parsing/parser.ml" in -# 1058 "parsing/parser.mly" +# 1062 "parsing/parser.mly" ( xs ) -# 10740 "parsing/parser.ml" +# 10784 "parsing/parser.ml" in -# 2472 "parsing/parser.mly" +# 2476 "parsing/parser.mly" ( Pexp_apply(_1, _2) ) -# 10746 "parsing/parser.ml" +# 10790 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -10750,15 +10794,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10756 "parsing/parser.ml" +# 10800 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 10762 "parsing/parser.ml" +# 10806 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10787,24 +10831,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 10791 "parsing/parser.ml" +# 10835 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1143 "parsing/parser.mly" ( xs ) -# 10796 "parsing/parser.ml" +# 10840 "parsing/parser.ml" in -# 2787 "parsing/parser.mly" +# 2791 "parsing/parser.mly" ( es ) -# 10802 "parsing/parser.ml" +# 10846 "parsing/parser.ml" in -# 2474 "parsing/parser.mly" +# 2478 "parsing/parser.mly" ( Pexp_tuple(_1) ) -# 10808 "parsing/parser.ml" +# 10852 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_xs_) in @@ -10812,15 +10856,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10818 "parsing/parser.ml" +# 10862 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 10824 "parsing/parser.ml" +# 10868 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10856,15 +10900,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 10862 "parsing/parser.ml" +# 10906 "parsing/parser.ml" in -# 2476 "parsing/parser.mly" +# 2480 "parsing/parser.mly" ( Pexp_construct(_1, Some _2) ) -# 10868 "parsing/parser.ml" +# 10912 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -10872,15 +10916,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10878 "parsing/parser.ml" +# 10922 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 10884 "parsing/parser.ml" +# 10928 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10911,24 +10955,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2478 "parsing/parser.mly" +# 2482 "parsing/parser.mly" ( Pexp_variant(_1, Some _2) ) -# 10917 "parsing/parser.ml" +# 10961 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10926 "parsing/parser.ml" +# 10970 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 10932 "parsing/parser.ml" +# 10976 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10960,9 +11004,9 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 750 "parsing/parser.mly" +# 754 "parsing/parser.mly" (string) -# 10966 "parsing/parser.ml" +# 11010 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -10972,36 +11016,36 @@ module Tables = struct let _1 = let e2 = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 10978 "parsing/parser.ml" +# 11022 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 10983 "parsing/parser.ml" +# 11027 "parsing/parser.ml" in let op = let _1 = -# 3766 "parsing/parser.mly" +# 3770 "parsing/parser.mly" ( op ) -# 10990 "parsing/parser.ml" +# 11034 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10999 "parsing/parser.ml" +# 11043 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11005 "parsing/parser.ml" +# 11049 "parsing/parser.ml" in let _startpos__1_ = _startpos_e1_ in @@ -11009,15 +11053,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11015 "parsing/parser.ml" +# 11059 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 11021 "parsing/parser.ml" +# 11065 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11070,9 +11114,9 @@ module Tables = struct let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let op : ( -# 750 "parsing/parser.mly" +# 754 "parsing/parser.mly" (string) -# 11076 "parsing/parser.ml" +# 11120 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11087,18 +11131,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 11091 "parsing/parser.ml" +# 11135 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 11096 "parsing/parser.ml" +# 11140 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 11102 "parsing/parser.ml" +# 11146 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -11107,22 +11151,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 11113 "parsing/parser.ml" +# 11157 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 11119 "parsing/parser.ml" +# 11163 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -11135,35 +11179,35 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 11139 "parsing/parser.ml" +# 11183 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 11145 "parsing/parser.ml" +# 11189 "parsing/parser.ml" in let op = let _1 = -# 3766 "parsing/parser.mly" +# 3770 "parsing/parser.mly" ( op ) -# 11152 "parsing/parser.ml" +# 11196 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11161 "parsing/parser.ml" +# 11205 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11167 "parsing/parser.ml" +# 11211 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -11171,15 +11215,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11177 "parsing/parser.ml" +# 11221 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 11183 "parsing/parser.ml" +# 11227 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11211,9 +11255,9 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 751 "parsing/parser.mly" +# 755 "parsing/parser.mly" (string) -# 11217 "parsing/parser.ml" +# 11261 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11223,36 +11267,36 @@ module Tables = struct let _1 = let e2 = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 11229 "parsing/parser.ml" +# 11273 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 11234 "parsing/parser.ml" +# 11278 "parsing/parser.ml" in let op = let _1 = -# 3767 "parsing/parser.mly" +# 3771 "parsing/parser.mly" ( op ) -# 11241 "parsing/parser.ml" +# 11285 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11250 "parsing/parser.ml" +# 11294 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11256 "parsing/parser.ml" +# 11300 "parsing/parser.ml" in let _startpos__1_ = _startpos_e1_ in @@ -11260,15 +11304,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11266 "parsing/parser.ml" +# 11310 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 11272 "parsing/parser.ml" +# 11316 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11321,9 +11365,9 @@ module Tables = struct let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let op : ( -# 751 "parsing/parser.mly" +# 755 "parsing/parser.mly" (string) -# 11327 "parsing/parser.ml" +# 11371 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11338,18 +11382,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 11342 "parsing/parser.ml" +# 11386 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 11347 "parsing/parser.ml" +# 11391 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 11353 "parsing/parser.ml" +# 11397 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -11358,22 +11402,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 11364 "parsing/parser.ml" +# 11408 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 11370 "parsing/parser.ml" +# 11414 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -11386,35 +11430,35 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 11390 "parsing/parser.ml" +# 11434 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 11396 "parsing/parser.ml" +# 11440 "parsing/parser.ml" in let op = let _1 = -# 3767 "parsing/parser.mly" +# 3771 "parsing/parser.mly" ( op ) -# 11403 "parsing/parser.ml" +# 11447 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11412 "parsing/parser.ml" +# 11456 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11418 "parsing/parser.ml" +# 11462 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -11422,15 +11466,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11428 "parsing/parser.ml" +# 11472 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 11434 "parsing/parser.ml" +# 11478 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11462,9 +11506,9 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 752 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 11468 "parsing/parser.ml" +# 11512 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11474,36 +11518,36 @@ module Tables = struct let _1 = let e2 = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 11480 "parsing/parser.ml" +# 11524 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 11485 "parsing/parser.ml" +# 11529 "parsing/parser.ml" in let op = let _1 = -# 3768 "parsing/parser.mly" +# 3772 "parsing/parser.mly" ( op ) -# 11492 "parsing/parser.ml" +# 11536 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11501 "parsing/parser.ml" +# 11545 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11507 "parsing/parser.ml" +# 11551 "parsing/parser.ml" in let _startpos__1_ = _startpos_e1_ in @@ -11511,15 +11555,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11517 "parsing/parser.ml" +# 11561 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 11523 "parsing/parser.ml" +# 11567 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11572,9 +11616,9 @@ module Tables = struct let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let op : ( -# 752 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 11578 "parsing/parser.ml" +# 11622 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11589,18 +11633,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 11593 "parsing/parser.ml" +# 11637 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 11598 "parsing/parser.ml" +# 11642 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 11604 "parsing/parser.ml" +# 11648 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -11609,22 +11653,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 11615 "parsing/parser.ml" +# 11659 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 11621 "parsing/parser.ml" +# 11665 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -11637,35 +11681,35 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 11641 "parsing/parser.ml" +# 11685 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 11647 "parsing/parser.ml" +# 11691 "parsing/parser.ml" in let op = let _1 = -# 3768 "parsing/parser.mly" +# 3772 "parsing/parser.mly" ( op ) -# 11654 "parsing/parser.ml" +# 11698 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11663 "parsing/parser.ml" +# 11707 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11669 "parsing/parser.ml" +# 11713 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -11673,15 +11717,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11679 "parsing/parser.ml" +# 11723 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 11685 "parsing/parser.ml" +# 11729 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11713,9 +11757,9 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 753 "parsing/parser.mly" +# 757 "parsing/parser.mly" (string) -# 11719 "parsing/parser.ml" +# 11763 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11725,36 +11769,36 @@ module Tables = struct let _1 = let e2 = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 11731 "parsing/parser.ml" +# 11775 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 11736 "parsing/parser.ml" +# 11780 "parsing/parser.ml" in let op = let _1 = -# 3769 "parsing/parser.mly" +# 3773 "parsing/parser.mly" ( op ) -# 11743 "parsing/parser.ml" +# 11787 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11752 "parsing/parser.ml" +# 11796 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11758 "parsing/parser.ml" +# 11802 "parsing/parser.ml" in let _startpos__1_ = _startpos_e1_ in @@ -11762,15 +11806,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11768 "parsing/parser.ml" +# 11812 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 11774 "parsing/parser.ml" +# 11818 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11823,9 +11867,9 @@ module Tables = struct let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let op : ( -# 753 "parsing/parser.mly" +# 757 "parsing/parser.mly" (string) -# 11829 "parsing/parser.ml" +# 11873 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11840,18 +11884,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 11844 "parsing/parser.ml" +# 11888 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 11849 "parsing/parser.ml" +# 11893 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 11855 "parsing/parser.ml" +# 11899 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -11860,22 +11904,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 11866 "parsing/parser.ml" +# 11910 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 11872 "parsing/parser.ml" +# 11916 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -11888,35 +11932,35 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 11892 "parsing/parser.ml" +# 11936 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 11898 "parsing/parser.ml" +# 11942 "parsing/parser.ml" in let op = let _1 = -# 3769 "parsing/parser.mly" +# 3773 "parsing/parser.mly" ( op ) -# 11905 "parsing/parser.ml" +# 11949 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 11914 "parsing/parser.ml" +# 11958 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 11920 "parsing/parser.ml" +# 11964 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -11924,15 +11968,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11930 "parsing/parser.ml" +# 11974 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 11936 "parsing/parser.ml" +# 11980 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11964,9 +12008,9 @@ module Tables = struct } = _menhir_stack in let _1 : (Parsetree.expression) = Obj.magic _1 in let op : ( -# 754 "parsing/parser.mly" +# 758 "parsing/parser.mly" (string) -# 11970 "parsing/parser.ml" +# 12014 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -11976,36 +12020,36 @@ module Tables = struct let _1 = let e2 = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 11982 "parsing/parser.ml" +# 12026 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 11987 "parsing/parser.ml" +# 12031 "parsing/parser.ml" in let op = let _1 = -# 3770 "parsing/parser.mly" +# 3774 "parsing/parser.mly" ( op ) -# 11994 "parsing/parser.ml" +# 12038 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12003 "parsing/parser.ml" +# 12047 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12009 "parsing/parser.ml" +# 12053 "parsing/parser.ml" in let _startpos__1_ = _startpos_e1_ in @@ -12013,15 +12057,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12019 "parsing/parser.ml" +# 12063 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 12025 "parsing/parser.ml" +# 12069 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12074,9 +12118,9 @@ module Tables = struct let _1_inlined1 : (string Asttypes.loc option) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let op : ( -# 754 "parsing/parser.mly" +# 758 "parsing/parser.mly" (string) -# 12080 "parsing/parser.ml" +# 12124 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -12091,18 +12135,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 12095 "parsing/parser.ml" +# 12139 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 12100 "parsing/parser.ml" +# 12144 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 12106 "parsing/parser.ml" +# 12150 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -12111,22 +12155,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 12117 "parsing/parser.ml" +# 12161 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 12123 "parsing/parser.ml" +# 12167 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -12139,35 +12183,35 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 12143 "parsing/parser.ml" +# 12187 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 12149 "parsing/parser.ml" +# 12193 "parsing/parser.ml" in let op = let _1 = -# 3770 "parsing/parser.mly" +# 3774 "parsing/parser.mly" ( op ) -# 12156 "parsing/parser.ml" +# 12200 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12165 "parsing/parser.ml" +# 12209 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12171 "parsing/parser.ml" +# 12215 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -12175,15 +12219,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12181 "parsing/parser.ml" +# 12225 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 12187 "parsing/parser.ml" +# 12231 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12224,35 +12268,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 12230 "parsing/parser.ml" +# 12274 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 12235 "parsing/parser.ml" +# 12279 "parsing/parser.ml" in let op = let _1 = -# 3771 "parsing/parser.mly" +# 3775 "parsing/parser.mly" ("+") -# 12242 "parsing/parser.ml" +# 12286 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12250 "parsing/parser.ml" +# 12294 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12256 "parsing/parser.ml" +# 12300 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -12260,15 +12304,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12266 "parsing/parser.ml" +# 12310 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 12272 "parsing/parser.ml" +# 12316 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12335,18 +12379,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 12339 "parsing/parser.ml" +# 12383 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 12344 "parsing/parser.ml" +# 12388 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 12350 "parsing/parser.ml" +# 12394 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -12355,22 +12399,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 12361 "parsing/parser.ml" +# 12405 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 12367 "parsing/parser.ml" +# 12411 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -12383,34 +12427,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 12387 "parsing/parser.ml" +# 12431 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 12393 "parsing/parser.ml" +# 12437 "parsing/parser.ml" in let op = let _1 = -# 3771 "parsing/parser.mly" +# 3775 "parsing/parser.mly" ("+") -# 12400 "parsing/parser.ml" +# 12444 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12408 "parsing/parser.ml" +# 12452 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12414 "parsing/parser.ml" +# 12458 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -12418,15 +12462,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12424 "parsing/parser.ml" +# 12468 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 12430 "parsing/parser.ml" +# 12474 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12467,35 +12511,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 12473 "parsing/parser.ml" +# 12517 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 12478 "parsing/parser.ml" +# 12522 "parsing/parser.ml" in let op = let _1 = -# 3772 "parsing/parser.mly" +# 3776 "parsing/parser.mly" ("+.") -# 12485 "parsing/parser.ml" +# 12529 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12493 "parsing/parser.ml" +# 12537 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12499 "parsing/parser.ml" +# 12543 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -12503,15 +12547,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12509 "parsing/parser.ml" +# 12553 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 12515 "parsing/parser.ml" +# 12559 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12578,18 +12622,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 12582 "parsing/parser.ml" +# 12626 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 12587 "parsing/parser.ml" +# 12631 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 12593 "parsing/parser.ml" +# 12637 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -12598,22 +12642,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 12604 "parsing/parser.ml" +# 12648 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 12610 "parsing/parser.ml" +# 12654 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -12626,34 +12670,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 12630 "parsing/parser.ml" +# 12674 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 12636 "parsing/parser.ml" +# 12680 "parsing/parser.ml" in let op = let _1 = -# 3772 "parsing/parser.mly" +# 3776 "parsing/parser.mly" ("+.") -# 12643 "parsing/parser.ml" +# 12687 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12651 "parsing/parser.ml" +# 12695 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12657 "parsing/parser.ml" +# 12701 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -12661,15 +12705,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12667 "parsing/parser.ml" +# 12711 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 12673 "parsing/parser.ml" +# 12717 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12710,35 +12754,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 12716 "parsing/parser.ml" +# 12760 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 12721 "parsing/parser.ml" +# 12765 "parsing/parser.ml" in let op = let _1 = -# 3773 "parsing/parser.mly" +# 3777 "parsing/parser.mly" ("+=") -# 12728 "parsing/parser.ml" +# 12772 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12736 "parsing/parser.ml" +# 12780 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12742 "parsing/parser.ml" +# 12786 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -12746,15 +12790,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12752 "parsing/parser.ml" +# 12796 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 12758 "parsing/parser.ml" +# 12802 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12821,18 +12865,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 12825 "parsing/parser.ml" +# 12869 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 12830 "parsing/parser.ml" +# 12874 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 12836 "parsing/parser.ml" +# 12880 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -12841,22 +12885,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 12847 "parsing/parser.ml" +# 12891 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 12853 "parsing/parser.ml" +# 12897 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -12869,34 +12913,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 12873 "parsing/parser.ml" +# 12917 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 12879 "parsing/parser.ml" +# 12923 "parsing/parser.ml" in let op = let _1 = -# 3773 "parsing/parser.mly" +# 3777 "parsing/parser.mly" ("+=") -# 12886 "parsing/parser.ml" +# 12930 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12894 "parsing/parser.ml" +# 12938 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12900 "parsing/parser.ml" +# 12944 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -12904,15 +12948,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12910 "parsing/parser.ml" +# 12954 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 12916 "parsing/parser.ml" +# 12960 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12953,35 +12997,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 12959 "parsing/parser.ml" +# 13003 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 12964 "parsing/parser.ml" +# 13008 "parsing/parser.ml" in let op = let _1 = -# 3774 "parsing/parser.mly" +# 3778 "parsing/parser.mly" ("-") -# 12971 "parsing/parser.ml" +# 13015 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 12979 "parsing/parser.ml" +# 13023 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 12985 "parsing/parser.ml" +# 13029 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -12989,15 +13033,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12995 "parsing/parser.ml" +# 13039 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 13001 "parsing/parser.ml" +# 13045 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13064,18 +13108,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 13068 "parsing/parser.ml" +# 13112 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 13073 "parsing/parser.ml" +# 13117 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 13079 "parsing/parser.ml" +# 13123 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -13084,22 +13128,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 13090 "parsing/parser.ml" +# 13134 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 13096 "parsing/parser.ml" +# 13140 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -13112,34 +13156,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 13116 "parsing/parser.ml" +# 13160 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 13122 "parsing/parser.ml" +# 13166 "parsing/parser.ml" in let op = let _1 = -# 3774 "parsing/parser.mly" +# 3778 "parsing/parser.mly" ("-") -# 13129 "parsing/parser.ml" +# 13173 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13137 "parsing/parser.ml" +# 13181 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13143 "parsing/parser.ml" +# 13187 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -13147,15 +13191,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13153 "parsing/parser.ml" +# 13197 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 13159 "parsing/parser.ml" +# 13203 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13196,35 +13240,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 13202 "parsing/parser.ml" +# 13246 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 13207 "parsing/parser.ml" +# 13251 "parsing/parser.ml" in let op = let _1 = -# 3775 "parsing/parser.mly" +# 3779 "parsing/parser.mly" ("-.") -# 13214 "parsing/parser.ml" +# 13258 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13222 "parsing/parser.ml" +# 13266 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13228 "parsing/parser.ml" +# 13272 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -13232,15 +13276,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13238 "parsing/parser.ml" +# 13282 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 13244 "parsing/parser.ml" +# 13288 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13307,18 +13351,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 13311 "parsing/parser.ml" +# 13355 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 13316 "parsing/parser.ml" +# 13360 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 13322 "parsing/parser.ml" +# 13366 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -13327,22 +13371,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 13333 "parsing/parser.ml" +# 13377 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 13339 "parsing/parser.ml" +# 13383 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -13355,34 +13399,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 13359 "parsing/parser.ml" +# 13403 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 13365 "parsing/parser.ml" +# 13409 "parsing/parser.ml" in let op = let _1 = -# 3775 "parsing/parser.mly" +# 3779 "parsing/parser.mly" ("-.") -# 13372 "parsing/parser.ml" +# 13416 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13380 "parsing/parser.ml" +# 13424 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13386 "parsing/parser.ml" +# 13430 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -13390,15 +13434,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13396 "parsing/parser.ml" +# 13440 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 13402 "parsing/parser.ml" +# 13446 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13439,35 +13483,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 13445 "parsing/parser.ml" +# 13489 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 13450 "parsing/parser.ml" +# 13494 "parsing/parser.ml" in let op = let _1 = -# 3776 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ("*") -# 13457 "parsing/parser.ml" +# 13501 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13465 "parsing/parser.ml" +# 13509 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13471 "parsing/parser.ml" +# 13515 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -13475,15 +13519,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13481 "parsing/parser.ml" +# 13525 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 13487 "parsing/parser.ml" +# 13531 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13550,18 +13594,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 13554 "parsing/parser.ml" +# 13598 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 13559 "parsing/parser.ml" +# 13603 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 13565 "parsing/parser.ml" +# 13609 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -13570,22 +13614,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 13576 "parsing/parser.ml" +# 13620 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 13582 "parsing/parser.ml" +# 13626 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -13598,34 +13642,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 13602 "parsing/parser.ml" +# 13646 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 13608 "parsing/parser.ml" +# 13652 "parsing/parser.ml" in let op = let _1 = -# 3776 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ("*") -# 13615 "parsing/parser.ml" +# 13659 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13623 "parsing/parser.ml" +# 13667 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13629 "parsing/parser.ml" +# 13673 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -13633,15 +13677,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13639 "parsing/parser.ml" +# 13683 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 13645 "parsing/parser.ml" +# 13689 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13682,35 +13726,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 13688 "parsing/parser.ml" +# 13732 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 13693 "parsing/parser.ml" +# 13737 "parsing/parser.ml" in let op = let _1 = -# 3777 "parsing/parser.mly" +# 3781 "parsing/parser.mly" ("%") -# 13700 "parsing/parser.ml" +# 13744 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13708 "parsing/parser.ml" +# 13752 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13714 "parsing/parser.ml" +# 13758 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -13718,15 +13762,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13724 "parsing/parser.ml" +# 13768 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 13730 "parsing/parser.ml" +# 13774 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13793,18 +13837,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 13797 "parsing/parser.ml" +# 13841 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 13802 "parsing/parser.ml" +# 13846 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 13808 "parsing/parser.ml" +# 13852 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -13813,22 +13857,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 13819 "parsing/parser.ml" +# 13863 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 13825 "parsing/parser.ml" +# 13869 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -13841,34 +13885,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 13845 "parsing/parser.ml" +# 13889 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 13851 "parsing/parser.ml" +# 13895 "parsing/parser.ml" in let op = let _1 = -# 3777 "parsing/parser.mly" +# 3781 "parsing/parser.mly" ("%") -# 13858 "parsing/parser.ml" +# 13902 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13866 "parsing/parser.ml" +# 13910 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13872 "parsing/parser.ml" +# 13916 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -13876,15 +13920,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13882 "parsing/parser.ml" +# 13926 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 13888 "parsing/parser.ml" +# 13932 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13925,35 +13969,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 13931 "parsing/parser.ml" +# 13975 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 13936 "parsing/parser.ml" +# 13980 "parsing/parser.ml" in let op = let _1 = -# 3778 "parsing/parser.mly" +# 3782 "parsing/parser.mly" ("=") -# 13943 "parsing/parser.ml" +# 13987 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 13951 "parsing/parser.ml" +# 13995 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 13957 "parsing/parser.ml" +# 14001 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -13961,15 +14005,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 13967 "parsing/parser.ml" +# 14011 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 13973 "parsing/parser.ml" +# 14017 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14036,18 +14080,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 14040 "parsing/parser.ml" +# 14084 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 14045 "parsing/parser.ml" +# 14089 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 14051 "parsing/parser.ml" +# 14095 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -14056,22 +14100,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 14062 "parsing/parser.ml" +# 14106 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 14068 "parsing/parser.ml" +# 14112 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -14084,34 +14128,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 14088 "parsing/parser.ml" +# 14132 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 14094 "parsing/parser.ml" +# 14138 "parsing/parser.ml" in let op = let _1 = -# 3778 "parsing/parser.mly" +# 3782 "parsing/parser.mly" ("=") -# 14101 "parsing/parser.ml" +# 14145 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14109 "parsing/parser.ml" +# 14153 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14115 "parsing/parser.ml" +# 14159 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -14119,15 +14163,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14125 "parsing/parser.ml" +# 14169 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 14131 "parsing/parser.ml" +# 14175 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14168,35 +14212,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 14174 "parsing/parser.ml" +# 14218 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 14179 "parsing/parser.ml" +# 14223 "parsing/parser.ml" in let op = let _1 = -# 3779 "parsing/parser.mly" +# 3783 "parsing/parser.mly" ("<") -# 14186 "parsing/parser.ml" +# 14230 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14194 "parsing/parser.ml" +# 14238 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14200 "parsing/parser.ml" +# 14244 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -14204,15 +14248,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14210 "parsing/parser.ml" +# 14254 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 14216 "parsing/parser.ml" +# 14260 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14279,18 +14323,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 14283 "parsing/parser.ml" +# 14327 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 14288 "parsing/parser.ml" +# 14332 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 14294 "parsing/parser.ml" +# 14338 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -14299,22 +14343,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 14305 "parsing/parser.ml" +# 14349 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 14311 "parsing/parser.ml" +# 14355 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -14327,34 +14371,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 14331 "parsing/parser.ml" +# 14375 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 14337 "parsing/parser.ml" +# 14381 "parsing/parser.ml" in let op = let _1 = -# 3779 "parsing/parser.mly" +# 3783 "parsing/parser.mly" ("<") -# 14344 "parsing/parser.ml" +# 14388 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14352 "parsing/parser.ml" +# 14396 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14358 "parsing/parser.ml" +# 14402 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -14362,15 +14406,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14368 "parsing/parser.ml" +# 14412 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 14374 "parsing/parser.ml" +# 14418 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14411,35 +14455,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 14417 "parsing/parser.ml" +# 14461 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 14422 "parsing/parser.ml" +# 14466 "parsing/parser.ml" in let op = let _1 = -# 3780 "parsing/parser.mly" +# 3784 "parsing/parser.mly" (">") -# 14429 "parsing/parser.ml" +# 14473 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14437 "parsing/parser.ml" +# 14481 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14443 "parsing/parser.ml" +# 14487 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -14447,15 +14491,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14453 "parsing/parser.ml" +# 14497 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 14459 "parsing/parser.ml" +# 14503 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14522,18 +14566,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 14526 "parsing/parser.ml" +# 14570 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 14531 "parsing/parser.ml" +# 14575 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 14537 "parsing/parser.ml" +# 14581 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -14542,22 +14586,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 14548 "parsing/parser.ml" +# 14592 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 14554 "parsing/parser.ml" +# 14598 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -14570,34 +14614,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 14574 "parsing/parser.ml" +# 14618 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 14580 "parsing/parser.ml" +# 14624 "parsing/parser.ml" in let op = let _1 = -# 3780 "parsing/parser.mly" +# 3784 "parsing/parser.mly" (">") -# 14587 "parsing/parser.ml" +# 14631 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14595 "parsing/parser.ml" +# 14639 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14601 "parsing/parser.ml" +# 14645 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -14605,15 +14649,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14611 "parsing/parser.ml" +# 14655 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 14617 "parsing/parser.ml" +# 14661 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14654,35 +14698,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 14660 "parsing/parser.ml" +# 14704 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 14665 "parsing/parser.ml" +# 14709 "parsing/parser.ml" in let op = let _1 = -# 3781 "parsing/parser.mly" +# 3785 "parsing/parser.mly" ("or") -# 14672 "parsing/parser.ml" +# 14716 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14680 "parsing/parser.ml" +# 14724 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14686 "parsing/parser.ml" +# 14730 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -14690,15 +14734,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14696 "parsing/parser.ml" +# 14740 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 14702 "parsing/parser.ml" +# 14746 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14765,18 +14809,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 14769 "parsing/parser.ml" +# 14813 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 14774 "parsing/parser.ml" +# 14818 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 14780 "parsing/parser.ml" +# 14824 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -14785,22 +14829,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 14791 "parsing/parser.ml" +# 14835 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 14797 "parsing/parser.ml" +# 14841 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -14813,34 +14857,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 14817 "parsing/parser.ml" +# 14861 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 14823 "parsing/parser.ml" +# 14867 "parsing/parser.ml" in let op = let _1 = -# 3781 "parsing/parser.mly" +# 3785 "parsing/parser.mly" ("or") -# 14830 "parsing/parser.ml" +# 14874 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14838 "parsing/parser.ml" +# 14882 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14844 "parsing/parser.ml" +# 14888 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -14848,15 +14892,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14854 "parsing/parser.ml" +# 14898 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 14860 "parsing/parser.ml" +# 14904 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14897,35 +14941,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 14903 "parsing/parser.ml" +# 14947 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 14908 "parsing/parser.ml" +# 14952 "parsing/parser.ml" in let op = let _1 = -# 3782 "parsing/parser.mly" +# 3786 "parsing/parser.mly" ("||") -# 14915 "parsing/parser.ml" +# 14959 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 14923 "parsing/parser.ml" +# 14967 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 14929 "parsing/parser.ml" +# 14973 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -14933,15 +14977,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 14939 "parsing/parser.ml" +# 14983 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 14945 "parsing/parser.ml" +# 14989 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15008,18 +15052,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 15012 "parsing/parser.ml" +# 15056 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 15017 "parsing/parser.ml" +# 15061 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 15023 "parsing/parser.ml" +# 15067 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -15028,22 +15072,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 15034 "parsing/parser.ml" +# 15078 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 15040 "parsing/parser.ml" +# 15084 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -15056,34 +15100,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 15060 "parsing/parser.ml" +# 15104 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 15066 "parsing/parser.ml" +# 15110 "parsing/parser.ml" in let op = let _1 = -# 3782 "parsing/parser.mly" +# 3786 "parsing/parser.mly" ("||") -# 15073 "parsing/parser.ml" +# 15117 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15081 "parsing/parser.ml" +# 15125 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15087 "parsing/parser.ml" +# 15131 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -15091,15 +15135,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15097 "parsing/parser.ml" +# 15141 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 15103 "parsing/parser.ml" +# 15147 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15140,35 +15184,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 15146 "parsing/parser.ml" +# 15190 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 15151 "parsing/parser.ml" +# 15195 "parsing/parser.ml" in let op = let _1 = -# 3783 "parsing/parser.mly" +# 3787 "parsing/parser.mly" ("&") -# 15158 "parsing/parser.ml" +# 15202 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15166 "parsing/parser.ml" +# 15210 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15172 "parsing/parser.ml" +# 15216 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -15176,15 +15220,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15182 "parsing/parser.ml" +# 15226 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 15188 "parsing/parser.ml" +# 15232 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15251,18 +15295,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 15255 "parsing/parser.ml" +# 15299 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 15260 "parsing/parser.ml" +# 15304 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 15266 "parsing/parser.ml" +# 15310 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -15271,22 +15315,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 15277 "parsing/parser.ml" +# 15321 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 15283 "parsing/parser.ml" +# 15327 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -15299,34 +15343,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 15303 "parsing/parser.ml" +# 15347 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 15309 "parsing/parser.ml" +# 15353 "parsing/parser.ml" in let op = let _1 = -# 3783 "parsing/parser.mly" +# 3787 "parsing/parser.mly" ("&") -# 15316 "parsing/parser.ml" +# 15360 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15324 "parsing/parser.ml" +# 15368 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15330 "parsing/parser.ml" +# 15374 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -15334,15 +15378,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15340 "parsing/parser.ml" +# 15384 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 15346 "parsing/parser.ml" +# 15390 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15383,35 +15427,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 15389 "parsing/parser.ml" +# 15433 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 15394 "parsing/parser.ml" +# 15438 "parsing/parser.ml" in let op = let _1 = -# 3784 "parsing/parser.mly" +# 3788 "parsing/parser.mly" ("&&") -# 15401 "parsing/parser.ml" +# 15445 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15409 "parsing/parser.ml" +# 15453 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15415 "parsing/parser.ml" +# 15459 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -15419,15 +15463,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15425 "parsing/parser.ml" +# 15469 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 15431 "parsing/parser.ml" +# 15475 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15494,18 +15538,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 15498 "parsing/parser.ml" +# 15542 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 15503 "parsing/parser.ml" +# 15547 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 15509 "parsing/parser.ml" +# 15553 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -15514,22 +15558,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 15520 "parsing/parser.ml" +# 15564 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 15526 "parsing/parser.ml" +# 15570 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -15542,34 +15586,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 15546 "parsing/parser.ml" +# 15590 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 15552 "parsing/parser.ml" +# 15596 "parsing/parser.ml" in let op = let _1 = -# 3784 "parsing/parser.mly" +# 3788 "parsing/parser.mly" ("&&") -# 15559 "parsing/parser.ml" +# 15603 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15567 "parsing/parser.ml" +# 15611 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15573 "parsing/parser.ml" +# 15617 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -15577,15 +15621,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15583 "parsing/parser.ml" +# 15627 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 15589 "parsing/parser.ml" +# 15633 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15626,35 +15670,35 @@ module Tables = struct let e2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 15632 "parsing/parser.ml" +# 15676 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 15637 "parsing/parser.ml" +# 15681 "parsing/parser.ml" in let op = let _1 = -# 3785 "parsing/parser.mly" +# 3789 "parsing/parser.mly" (":=") -# 15644 "parsing/parser.ml" +# 15688 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15652 "parsing/parser.ml" +# 15696 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15658 "parsing/parser.ml" +# 15702 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_e1_) in @@ -15662,15 +15706,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15668 "parsing/parser.ml" +# 15712 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 15674 "parsing/parser.ml" +# 15718 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15737,18 +15781,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 15741 "parsing/parser.ml" +# 15785 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 15746 "parsing/parser.ml" +# 15790 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 15752 "parsing/parser.ml" +# 15796 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -15757,22 +15801,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 15763 "parsing/parser.ml" +# 15807 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 15769 "parsing/parser.ml" +# 15813 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -15785,34 +15829,34 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 15789 "parsing/parser.ml" +# 15833 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 15795 "parsing/parser.ml" +# 15839 "parsing/parser.ml" in let op = let _1 = -# 3785 "parsing/parser.mly" +# 3789 "parsing/parser.mly" (":=") -# 15802 "parsing/parser.ml" +# 15846 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 15810 "parsing/parser.ml" +# 15854 "parsing/parser.ml" in -# 2480 "parsing/parser.mly" +# 2484 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 15816 "parsing/parser.ml" +# 15860 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_e1_) in @@ -15820,15 +15864,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15826 "parsing/parser.ml" +# 15870 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 15832 "parsing/parser.ml" +# 15876 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15862,21 +15906,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 15868 "parsing/parser.ml" +# 15912 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 15873 "parsing/parser.ml" +# 15917 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2482 "parsing/parser.mly" +# 2486 "parsing/parser.mly" ( mkuminus ~oploc:_loc__1_ _1 _2 ) -# 15880 "parsing/parser.ml" +# 15924 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -15884,15 +15928,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 15890 "parsing/parser.ml" +# 15934 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 15896 "parsing/parser.ml" +# 15940 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15952,18 +15996,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 15956 "parsing/parser.ml" +# 16000 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 15961 "parsing/parser.ml" +# 16005 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 15967 "parsing/parser.ml" +# 16011 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -15972,22 +16016,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 15978 "parsing/parser.ml" +# 16022 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 15984 "parsing/parser.ml" +# 16028 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -16000,20 +16044,20 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 16004 "parsing/parser.ml" +# 16048 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 16010 "parsing/parser.ml" +# 16054 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2482 "parsing/parser.mly" +# 2486 "parsing/parser.mly" ( mkuminus ~oploc:_loc__1_ _1 _2 ) -# 16017 "parsing/parser.ml" +# 16061 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -16021,15 +16065,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 16027 "parsing/parser.ml" +# 16071 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 16033 "parsing/parser.ml" +# 16077 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16063,21 +16107,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 16069 "parsing/parser.ml" +# 16113 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 16074 "parsing/parser.ml" +# 16118 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2484 "parsing/parser.mly" +# 2488 "parsing/parser.mly" ( mkuplus ~oploc:_loc__1_ _1 _2 ) -# 16081 "parsing/parser.ml" +# 16125 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -16085,15 +16129,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 16091 "parsing/parser.ml" +# 16135 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 16097 "parsing/parser.ml" +# 16141 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16153,18 +16197,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 16157 "parsing/parser.ml" +# 16201 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 16162 "parsing/parser.ml" +# 16206 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 16168 "parsing/parser.ml" +# 16212 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -16173,22 +16217,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 16179 "parsing/parser.ml" +# 16223 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 16185 "parsing/parser.ml" +# 16229 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -16201,20 +16245,20 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 16205 "parsing/parser.ml" +# 16249 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 16211 "parsing/parser.ml" +# 16255 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2484 "parsing/parser.mly" +# 2488 "parsing/parser.mly" ( mkuplus ~oploc:_loc__1_ _1 _2 ) -# 16218 "parsing/parser.ml" +# 16262 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -16222,15 +16266,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 16228 "parsing/parser.ml" +# 16272 "parsing/parser.ml" in -# 2400 "parsing/parser.mly" +# 2404 "parsing/parser.mly" ( _1 ) -# 16234 "parsing/parser.ml" +# 16278 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16270,9 +16314,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2402 "parsing/parser.mly" +# 2406 "parsing/parser.mly" ( expr_of_let_bindings ~loc:_sloc _1 _3 ) -# 16276 "parsing/parser.ml" +# 16320 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16312,9 +16356,9 @@ module Tables = struct let _3 : unit = Obj.magic _3 in let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in let _1 : ( -# 756 "parsing/parser.mly" +# 760 "parsing/parser.mly" (string) -# 16318 "parsing/parser.ml" +# 16362 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -16324,9 +16368,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 16330 "parsing/parser.ml" +# 16374 "parsing/parser.ml" in let _startpos_pbop_op_ = _startpos__1_ in @@ -16334,13 +16378,13 @@ module Tables = struct let _symbolstartpos = _startpos_pbop_op_ in let _sloc = (_symbolstartpos, _endpos) in -# 2404 "parsing/parser.mly" +# 2408 "parsing/parser.mly" ( let (pbop_pat, pbop_exp, rev_ands) = bindings in let ands = List.rev rev_ands in let pbop_loc = make_loc _sloc in let let_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in mkexp ~loc:_sloc (Pexp_letop{ let_; ands; body}) ) -# 16344 "parsing/parser.ml" +# 16388 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16379,14 +16423,14 @@ module Tables = struct let _v : (Parsetree.expression) = let _3 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 16385 "parsing/parser.ml" +# 16429 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 16390 "parsing/parser.ml" +# 16434 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -16395,9 +16439,9 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in -# 2410 "parsing/parser.mly" +# 2414 "parsing/parser.mly" ( mkexp_cons ~loc:_sloc _loc__2_ (ghexp ~loc:_sloc (Pexp_tuple[_1;_3])) ) -# 16401 "parsing/parser.ml" +# 16445 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16462,18 +16506,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 16466 "parsing/parser.ml" +# 16510 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 16471 "parsing/parser.ml" +# 16515 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 16477 "parsing/parser.ml" +# 16521 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -16482,22 +16526,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 16488 "parsing/parser.ml" +# 16532 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 16494 "parsing/parser.ml" +# 16538 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -16510,13 +16554,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 16514 "parsing/parser.ml" +# 16558 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 16520 "parsing/parser.ml" +# 16564 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -16525,9 +16569,9 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in -# 2410 "parsing/parser.mly" +# 2414 "parsing/parser.mly" ( mkexp_cons ~loc:_sloc _loc__2_ (ghexp ~loc:_sloc (Pexp_tuple[_1;_3])) ) -# 16531 "parsing/parser.ml" +# 16575 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16560,9 +16604,9 @@ module Tables = struct let _1_inlined1 : (Parsetree.expression) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 16566 "parsing/parser.ml" +# 16610 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -16570,39 +16614,39 @@ module Tables = struct let _v : (Parsetree.expression) = let _3 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 16576 "parsing/parser.ml" +# 16620 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 16581 "parsing/parser.ml" +# 16625 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in let _1 = let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 16589 "parsing/parser.ml" +# 16633 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 16597 "parsing/parser.ml" +# 16641 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2412 "parsing/parser.mly" +# 2416 "parsing/parser.mly" ( mkexp ~loc:_sloc (Pexp_setinstvar(_1, _3)) ) -# 16606 "parsing/parser.ml" +# 16650 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16656,9 +16700,9 @@ module Tables = struct let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 16662 "parsing/parser.ml" +# 16706 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -16671,18 +16715,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 16675 "parsing/parser.ml" +# 16719 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 16680 "parsing/parser.ml" +# 16724 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 16686 "parsing/parser.ml" +# 16730 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -16691,22 +16735,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 16697 "parsing/parser.ml" +# 16741 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 16703 "parsing/parser.ml" +# 16747 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -16719,38 +16763,38 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 16723 "parsing/parser.ml" +# 16767 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 16729 "parsing/parser.ml" +# 16773 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in let _1 = let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 16737 "parsing/parser.ml" +# 16781 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 16745 "parsing/parser.ml" +# 16789 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2412 "parsing/parser.mly" +# 2416 "parsing/parser.mly" ( mkexp ~loc:_sloc (Pexp_setinstvar(_1, _3)) ) -# 16754 "parsing/parser.ml" +# 16798 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16803,14 +16847,14 @@ module Tables = struct let _v : (Parsetree.expression) = let _5 = let _1 = _1_inlined2 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 16809 "parsing/parser.ml" +# 16853 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 16814 "parsing/parser.ml" +# 16858 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in @@ -16820,18 +16864,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 16826 "parsing/parser.ml" +# 16870 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2414 "parsing/parser.mly" +# 2418 "parsing/parser.mly" ( mkexp ~loc:_sloc (Pexp_setfield(_1, _3, _5)) ) -# 16835 "parsing/parser.ml" +# 16879 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16910,18 +16954,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 16914 "parsing/parser.ml" +# 16958 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 16919 "parsing/parser.ml" +# 16963 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 16925 "parsing/parser.ml" +# 16969 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -16930,22 +16974,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 16936 "parsing/parser.ml" +# 16980 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 16942 "parsing/parser.ml" +# 16986 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -16958,13 +17002,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 16962 "parsing/parser.ml" +# 17006 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 16968 "parsing/parser.ml" +# 17012 "parsing/parser.ml" in let _endpos__5_ = _endpos_xs_ in @@ -16974,18 +17018,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 16980 "parsing/parser.ml" +# 17024 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2414 "parsing/parser.mly" +# 2418 "parsing/parser.mly" ( mkexp ~loc:_sloc (Pexp_setfield(_1, _3, _5)) ) -# 16989 "parsing/parser.ml" +# 17033 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17054,26 +17098,26 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 17060 "parsing/parser.ml" +# 17104 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 17065 "parsing/parser.ml" +# 17109 "parsing/parser.ml" in -# 2415 "parsing/parser.mly" +# 2419 "parsing/parser.mly" (Some v) -# 17071 "parsing/parser.ml" +# 17115 "parsing/parser.ml" in -# 2375 "parsing/parser.mly" +# 2379 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 17077 "parsing/parser.ml" +# 17121 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in @@ -17081,9 +17125,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2416 "parsing/parser.mly" +# 2420 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 17087 "parsing/parser.ml" +# 17131 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17178,18 +17222,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 17182 "parsing/parser.ml" +# 17226 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 17187 "parsing/parser.ml" +# 17231 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 17193 "parsing/parser.ml" +# 17237 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -17198,22 +17242,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 17204 "parsing/parser.ml" +# 17248 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 17210 "parsing/parser.ml" +# 17254 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -17226,25 +17270,25 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 17230 "parsing/parser.ml" +# 17274 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 17236 "parsing/parser.ml" +# 17280 "parsing/parser.ml" in -# 2415 "parsing/parser.mly" +# 2419 "parsing/parser.mly" (Some v) -# 17242 "parsing/parser.ml" +# 17286 "parsing/parser.ml" in -# 2375 "parsing/parser.mly" +# 2379 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 17248 "parsing/parser.ml" +# 17292 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -17252,9 +17296,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2416 "parsing/parser.mly" +# 2420 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 17258 "parsing/parser.ml" +# 17302 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17323,26 +17367,26 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 17329 "parsing/parser.ml" +# 17373 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 17334 "parsing/parser.ml" +# 17378 "parsing/parser.ml" in -# 2415 "parsing/parser.mly" +# 2419 "parsing/parser.mly" (Some v) -# 17340 "parsing/parser.ml" +# 17384 "parsing/parser.ml" in -# 2377 "parsing/parser.mly" +# 2381 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 17346 "parsing/parser.ml" +# 17390 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in @@ -17350,9 +17394,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2416 "parsing/parser.mly" +# 2420 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 17356 "parsing/parser.ml" +# 17400 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17447,18 +17491,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 17451 "parsing/parser.ml" +# 17495 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 17456 "parsing/parser.ml" +# 17500 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 17462 "parsing/parser.ml" +# 17506 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -17467,22 +17511,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 17473 "parsing/parser.ml" +# 17517 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 17479 "parsing/parser.ml" +# 17523 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -17495,25 +17539,25 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 17499 "parsing/parser.ml" +# 17543 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 17505 "parsing/parser.ml" +# 17549 "parsing/parser.ml" in -# 2415 "parsing/parser.mly" +# 2419 "parsing/parser.mly" (Some v) -# 17511 "parsing/parser.ml" +# 17555 "parsing/parser.ml" in -# 2377 "parsing/parser.mly" +# 2381 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 17517 "parsing/parser.ml" +# 17561 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -17521,9 +17565,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2416 "parsing/parser.mly" +# 2420 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 17527 "parsing/parser.ml" +# 17571 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17592,26 +17636,26 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 17598 "parsing/parser.ml" +# 17642 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 17603 "parsing/parser.ml" +# 17647 "parsing/parser.ml" in -# 2415 "parsing/parser.mly" +# 2419 "parsing/parser.mly" (Some v) -# 17609 "parsing/parser.ml" +# 17653 "parsing/parser.ml" in -# 2379 "parsing/parser.mly" +# 2383 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 17615 "parsing/parser.ml" +# 17659 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in @@ -17619,9 +17663,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2416 "parsing/parser.mly" +# 2420 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 17625 "parsing/parser.ml" +# 17669 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17716,18 +17760,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 17720 "parsing/parser.ml" +# 17764 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 17725 "parsing/parser.ml" +# 17769 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 17731 "parsing/parser.ml" +# 17775 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -17736,22 +17780,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 17742 "parsing/parser.ml" +# 17786 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 17748 "parsing/parser.ml" +# 17792 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -17764,25 +17808,25 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 17768 "parsing/parser.ml" +# 17812 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 17774 "parsing/parser.ml" +# 17818 "parsing/parser.ml" in -# 2415 "parsing/parser.mly" +# 2419 "parsing/parser.mly" (Some v) -# 17780 "parsing/parser.ml" +# 17824 "parsing/parser.ml" in -# 2379 "parsing/parser.mly" +# 2383 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 17786 "parsing/parser.ml" +# 17830 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -17790,9 +17834,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2416 "parsing/parser.mly" +# 2420 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 17796 "parsing/parser.ml" +# 17840 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17852,9 +17896,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 17858 "parsing/parser.ml" +# 17902 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -17865,43 +17909,43 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 17871 "parsing/parser.ml" +# 17915 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 17876 "parsing/parser.ml" +# 17920 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2421 "parsing/parser.mly" (Some v) -# 17882 "parsing/parser.ml" +# 17926 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 17888 "parsing/parser.ml" +# 17932 "parsing/parser.ml" in let d = let _1 = # 124 "" ( None ) -# 17894 "parsing/parser.ml" +# 17938 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 17899 "parsing/parser.ml" +# 17943 "parsing/parser.ml" in -# 2375 "parsing/parser.mly" +# 2379 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 17905 "parsing/parser.ml" +# 17949 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in @@ -17909,9 +17953,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2418 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 17915 "parsing/parser.ml" +# 17959 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17992,9 +18036,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 17998 "parsing/parser.ml" +# 18042 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -18010,18 +18054,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 18014 "parsing/parser.ml" +# 18058 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 18019 "parsing/parser.ml" +# 18063 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 18025 "parsing/parser.ml" +# 18069 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -18030,22 +18074,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 18036 "parsing/parser.ml" +# 18080 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 18042 "parsing/parser.ml" +# 18086 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -18058,42 +18102,42 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 18062 "parsing/parser.ml" +# 18106 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 18068 "parsing/parser.ml" +# 18112 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2421 "parsing/parser.mly" (Some v) -# 18074 "parsing/parser.ml" +# 18118 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 18080 "parsing/parser.ml" +# 18124 "parsing/parser.ml" in let d = let _1 = # 124 "" ( None ) -# 18086 "parsing/parser.ml" +# 18130 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 18091 "parsing/parser.ml" +# 18135 "parsing/parser.ml" in -# 2375 "parsing/parser.mly" +# 2379 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 18097 "parsing/parser.ml" +# 18141 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -18101,9 +18145,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2418 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 18107 "parsing/parser.ml" +# 18151 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18175,9 +18219,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 18181 "parsing/parser.ml" +# 18225 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -18191,51 +18235,51 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 18197 "parsing/parser.ml" +# 18241 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 18202 "parsing/parser.ml" +# 18246 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2421 "parsing/parser.mly" (Some v) -# 18208 "parsing/parser.ml" +# 18252 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 18214 "parsing/parser.ml" +# 18258 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" (_2) -# 18222 "parsing/parser.ml" +# 18266 "parsing/parser.ml" in # 126 "" ( Some x ) -# 18227 "parsing/parser.ml" +# 18271 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 18233 "parsing/parser.ml" +# 18277 "parsing/parser.ml" in -# 2375 "parsing/parser.mly" +# 2379 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 18239 "parsing/parser.ml" +# 18283 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in @@ -18243,9 +18287,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2418 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 18249 "parsing/parser.ml" +# 18293 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18338,9 +18382,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 18344 "parsing/parser.ml" +# 18388 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -18359,18 +18403,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 18363 "parsing/parser.ml" +# 18407 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 18368 "parsing/parser.ml" +# 18412 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 18374 "parsing/parser.ml" +# 18418 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -18379,22 +18423,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 18385 "parsing/parser.ml" +# 18429 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 18391 "parsing/parser.ml" +# 18435 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -18407,50 +18451,50 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 18411 "parsing/parser.ml" +# 18455 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 18417 "parsing/parser.ml" +# 18461 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2421 "parsing/parser.mly" (Some v) -# 18423 "parsing/parser.ml" +# 18467 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 18429 "parsing/parser.ml" +# 18473 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" (_2) -# 18437 "parsing/parser.ml" +# 18481 "parsing/parser.ml" in # 126 "" ( Some x ) -# 18442 "parsing/parser.ml" +# 18486 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 18448 "parsing/parser.ml" +# 18492 "parsing/parser.ml" in -# 2375 "parsing/parser.mly" +# 2379 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 18454 "parsing/parser.ml" +# 18498 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -18458,9 +18502,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2418 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 18464 "parsing/parser.ml" +# 18508 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18520,9 +18564,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 18526 "parsing/parser.ml" +# 18570 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -18533,43 +18577,43 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 18539 "parsing/parser.ml" +# 18583 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 18544 "parsing/parser.ml" +# 18588 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2421 "parsing/parser.mly" (Some v) -# 18550 "parsing/parser.ml" +# 18594 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 18556 "parsing/parser.ml" +# 18600 "parsing/parser.ml" in let d = let _1 = # 124 "" ( None ) -# 18562 "parsing/parser.ml" +# 18606 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 18567 "parsing/parser.ml" +# 18611 "parsing/parser.ml" in -# 2377 "parsing/parser.mly" +# 2381 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 18573 "parsing/parser.ml" +# 18617 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in @@ -18577,9 +18621,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2418 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 18583 "parsing/parser.ml" +# 18627 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18660,9 +18704,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 18666 "parsing/parser.ml" +# 18710 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -18678,18 +18722,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 18682 "parsing/parser.ml" +# 18726 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 18687 "parsing/parser.ml" +# 18731 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 18693 "parsing/parser.ml" +# 18737 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -18698,22 +18742,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 18704 "parsing/parser.ml" +# 18748 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 18710 "parsing/parser.ml" +# 18754 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -18726,42 +18770,42 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 18730 "parsing/parser.ml" +# 18774 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 18736 "parsing/parser.ml" +# 18780 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2421 "parsing/parser.mly" (Some v) -# 18742 "parsing/parser.ml" +# 18786 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 18748 "parsing/parser.ml" +# 18792 "parsing/parser.ml" in let d = let _1 = # 124 "" ( None ) -# 18754 "parsing/parser.ml" +# 18798 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 18759 "parsing/parser.ml" +# 18803 "parsing/parser.ml" in -# 2377 "parsing/parser.mly" +# 2381 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 18765 "parsing/parser.ml" +# 18809 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -18769,9 +18813,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2418 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 18775 "parsing/parser.ml" +# 18819 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18843,9 +18887,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 18849 "parsing/parser.ml" +# 18893 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -18859,51 +18903,51 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 18865 "parsing/parser.ml" +# 18909 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 18870 "parsing/parser.ml" +# 18914 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2421 "parsing/parser.mly" (Some v) -# 18876 "parsing/parser.ml" +# 18920 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 18882 "parsing/parser.ml" +# 18926 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" (_2) -# 18890 "parsing/parser.ml" +# 18934 "parsing/parser.ml" in # 126 "" ( Some x ) -# 18895 "parsing/parser.ml" +# 18939 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 18901 "parsing/parser.ml" +# 18945 "parsing/parser.ml" in -# 2377 "parsing/parser.mly" +# 2381 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 18907 "parsing/parser.ml" +# 18951 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in @@ -18911,9 +18955,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2418 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 18917 "parsing/parser.ml" +# 18961 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19006,9 +19050,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 19012 "parsing/parser.ml" +# 19056 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -19027,18 +19071,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 19031 "parsing/parser.ml" +# 19075 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 19036 "parsing/parser.ml" +# 19080 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 19042 "parsing/parser.ml" +# 19086 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -19047,22 +19091,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 19053 "parsing/parser.ml" +# 19097 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 19059 "parsing/parser.ml" +# 19103 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -19075,50 +19119,50 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 19079 "parsing/parser.ml" +# 19123 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 19085 "parsing/parser.ml" +# 19129 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2421 "parsing/parser.mly" (Some v) -# 19091 "parsing/parser.ml" +# 19135 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 19097 "parsing/parser.ml" +# 19141 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" (_2) -# 19105 "parsing/parser.ml" +# 19149 "parsing/parser.ml" in # 126 "" ( Some x ) -# 19110 "parsing/parser.ml" +# 19154 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 19116 "parsing/parser.ml" +# 19160 "parsing/parser.ml" in -# 2377 "parsing/parser.mly" +# 2381 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 19122 "parsing/parser.ml" +# 19166 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -19126,9 +19170,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2418 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 19132 "parsing/parser.ml" +# 19176 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19188,9 +19232,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 19194 "parsing/parser.ml" +# 19238 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -19201,43 +19245,43 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 19207 "parsing/parser.ml" +# 19251 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 19212 "parsing/parser.ml" +# 19256 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2421 "parsing/parser.mly" (Some v) -# 19218 "parsing/parser.ml" +# 19262 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 19224 "parsing/parser.ml" +# 19268 "parsing/parser.ml" in let d = let _1 = # 124 "" ( None ) -# 19230 "parsing/parser.ml" +# 19274 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 19235 "parsing/parser.ml" +# 19279 "parsing/parser.ml" in -# 2379 "parsing/parser.mly" +# 2383 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 19241 "parsing/parser.ml" +# 19285 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos_array_) in @@ -19245,9 +19289,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2418 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 19251 "parsing/parser.ml" +# 19295 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19328,9 +19372,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 19334 "parsing/parser.ml" +# 19378 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -19346,18 +19390,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 19350 "parsing/parser.ml" +# 19394 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 19355 "parsing/parser.ml" +# 19399 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 19361 "parsing/parser.ml" +# 19405 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -19366,22 +19410,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 19372 "parsing/parser.ml" +# 19416 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 19378 "parsing/parser.ml" +# 19422 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -19394,42 +19438,42 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 19398 "parsing/parser.ml" +# 19442 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 19404 "parsing/parser.ml" +# 19448 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2421 "parsing/parser.mly" (Some v) -# 19410 "parsing/parser.ml" +# 19454 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 19416 "parsing/parser.ml" +# 19460 "parsing/parser.ml" in let d = let _1 = # 124 "" ( None ) -# 19422 "parsing/parser.ml" +# 19466 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 19427 "parsing/parser.ml" +# 19471 "parsing/parser.ml" in -# 2379 "parsing/parser.mly" +# 2383 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 19433 "parsing/parser.ml" +# 19477 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -19437,9 +19481,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2418 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 19443 "parsing/parser.ml" +# 19487 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19511,9 +19555,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 19517 "parsing/parser.ml" +# 19561 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -19527,51 +19571,51 @@ module Tables = struct let v = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 19533 "parsing/parser.ml" +# 19577 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 19538 "parsing/parser.ml" +# 19582 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2421 "parsing/parser.mly" (Some v) -# 19544 "parsing/parser.ml" +# 19588 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 19550 "parsing/parser.ml" +# 19594 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" (_2) -# 19558 "parsing/parser.ml" +# 19602 "parsing/parser.ml" in # 126 "" ( Some x ) -# 19563 "parsing/parser.ml" +# 19607 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 19569 "parsing/parser.ml" +# 19613 "parsing/parser.ml" in -# 2379 "parsing/parser.mly" +# 2383 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 19575 "parsing/parser.ml" +# 19619 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos_array_) in @@ -19579,9 +19623,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2418 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 19585 "parsing/parser.ml" +# 19629 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19674,9 +19718,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 19680 "parsing/parser.ml" +# 19724 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -19695,18 +19739,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 19699 "parsing/parser.ml" +# 19743 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 19704 "parsing/parser.ml" +# 19748 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 19710 "parsing/parser.ml" +# 19754 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -19715,22 +19759,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 19721 "parsing/parser.ml" +# 19765 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 19727 "parsing/parser.ml" +# 19771 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -19743,50 +19787,50 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 19747 "parsing/parser.ml" +# 19791 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 19753 "parsing/parser.ml" +# 19797 "parsing/parser.ml" in -# 2417 "parsing/parser.mly" +# 2421 "parsing/parser.mly" (Some v) -# 19759 "parsing/parser.ml" +# 19803 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 19765 "parsing/parser.ml" +# 19809 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" (_2) -# 19773 "parsing/parser.ml" +# 19817 "parsing/parser.ml" in # 126 "" ( Some x ) -# 19778 "parsing/parser.ml" +# 19822 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 19784 "parsing/parser.ml" +# 19828 "parsing/parser.ml" in -# 2379 "parsing/parser.mly" +# 2383 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 19790 "parsing/parser.ml" +# 19834 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_array_) in @@ -19794,9 +19838,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2418 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 19800 "parsing/parser.ml" +# 19844 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19826,9 +19870,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2420 "parsing/parser.mly" +# 2424 "parsing/parser.mly" ( Exp.attr _1 _2 ) -# 19832 "parsing/parser.ml" +# 19876 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19852,9 +19896,9 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2423 "parsing/parser.mly" +# 2427 "parsing/parser.mly" ( not_expecting _loc__1_ "wildcard \"_\"" ) -# 19858 "parsing/parser.ml" +# 19902 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19898,15 +19942,15 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.function_param list) = let ty_params = -# 2633 "parsing/parser.mly" +# 2637 "parsing/parser.mly" ( xs ) -# 19904 "parsing/parser.ml" +# 19948 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2764 "parsing/parser.mly" +# 2768 "parsing/parser.mly" ( (* We desugar (type a b c) to (type a) (type b) (type c). If we do this desugaring, the loc for each parameter is a ghost. *) @@ -19920,7 +19964,7 @@ module Tables = struct (fun x -> { pparam_loc = loc; pparam_desc = Pparam_newtype x }) ty_params ) -# 19924 "parsing/parser.ml" +# 19968 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19946,11 +19990,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2778 "parsing/parser.mly" +# 2782 "parsing/parser.mly" ( let a, b, c = _1 in [ { pparam_loc = make_loc _sloc; pparam_desc = Pparam_val (a, b, c) } ] ) -# 19954 "parsing/parser.ml" +# 19998 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19976,18 +20020,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 19980 "parsing/parser.ml" +# 20024 "parsing/parser.ml" in -# 1079 "parsing/parser.mly" +# 1083 "parsing/parser.mly" ( xs ) -# 19985 "parsing/parser.ml" +# 20029 "parsing/parser.ml" in -# 2783 "parsing/parser.mly" +# 2787 "parsing/parser.mly" ( _1 ) -# 19991 "parsing/parser.ml" +# 20035 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20010,9 +20054,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = -# 2310 "parsing/parser.mly" +# 2314 "parsing/parser.mly" ( _1 ) -# 20016 "parsing/parser.ml" +# 20060 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20042,9 +20086,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2311 "parsing/parser.mly" +# 2315 "parsing/parser.mly" ( _1 ) -# 20048 "parsing/parser.ml" +# 20092 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20082,24 +20126,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2313 "parsing/parser.mly" +# 2317 "parsing/parser.mly" ( Pexp_sequence(_1, _3) ) -# 20088 "parsing/parser.ml" +# 20132 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 20097 "parsing/parser.ml" +# 20141 "parsing/parser.ml" in -# 2314 "parsing/parser.mly" +# 2318 "parsing/parser.mly" ( _1 ) -# 20103 "parsing/parser.ml" +# 20147 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20153,11 +20197,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2316 "parsing/parser.mly" +# 2320 "parsing/parser.mly" ( let seq = mkexp ~loc:_sloc (Pexp_sequence (_1, _5)) in let payload = PStr [mkstrexp seq []] in mkexp ~loc:_sloc (Pexp_extension (_4, payload)) ) -# 20161 "parsing/parser.ml" +# 20205 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20180,9 +20224,9 @@ module Tables = struct let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.core_type) = -# 3482 "parsing/parser.mly" +# 3486 "parsing/parser.mly" ( ty ) -# 20186 "parsing/parser.ml" +# 20230 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20228,19 +20272,19 @@ module Tables = struct let _v : (Parsetree.core_type) = let _1 = let _1 = let domain = -# 954 "parsing/parser.mly" +# 958 "parsing/parser.mly" ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 20234 "parsing/parser.ml" +# 20278 "parsing/parser.ml" in let label = -# 3494 "parsing/parser.mly" +# 3498 "parsing/parser.mly" ( Optional label ) -# 20239 "parsing/parser.ml" +# 20283 "parsing/parser.ml" in -# 3488 "parsing/parser.mly" +# 3492 "parsing/parser.mly" ( Ptyp_arrow(label, domain, codomain) ) -# 20244 "parsing/parser.ml" +# 20288 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -20248,15 +20292,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 20254 "parsing/parser.ml" +# 20298 "parsing/parser.ml" in -# 3490 "parsing/parser.mly" +# 3494 "parsing/parser.mly" ( _1 ) -# 20260 "parsing/parser.ml" +# 20304 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20303,9 +20347,9 @@ module Tables = struct let _1 : (Parsetree.core_type) = Obj.magic _1 in let _2 : unit = Obj.magic _2 in let label : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 20309 "parsing/parser.ml" +# 20353 "parsing/parser.ml" ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in @@ -20313,19 +20357,19 @@ module Tables = struct let _v : (Parsetree.core_type) = let _1 = let _1 = let domain = -# 954 "parsing/parser.mly" +# 958 "parsing/parser.mly" ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 20319 "parsing/parser.ml" +# 20363 "parsing/parser.ml" in let label = -# 3496 "parsing/parser.mly" +# 3500 "parsing/parser.mly" ( Labelled label ) -# 20324 "parsing/parser.ml" +# 20368 "parsing/parser.ml" in -# 3488 "parsing/parser.mly" +# 3492 "parsing/parser.mly" ( Ptyp_arrow(label, domain, codomain) ) -# 20329 "parsing/parser.ml" +# 20373 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -20333,15 +20377,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 20339 "parsing/parser.ml" +# 20383 "parsing/parser.ml" in -# 3490 "parsing/parser.mly" +# 3494 "parsing/parser.mly" ( _1 ) -# 20345 "parsing/parser.ml" +# 20389 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20380,19 +20424,19 @@ module Tables = struct let _v : (Parsetree.core_type) = let _1 = let _1 = let domain = -# 954 "parsing/parser.mly" +# 958 "parsing/parser.mly" ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 20386 "parsing/parser.ml" +# 20430 "parsing/parser.ml" in let label = -# 3498 "parsing/parser.mly" +# 3502 "parsing/parser.mly" ( Nolabel ) -# 20391 "parsing/parser.ml" +# 20435 "parsing/parser.ml" in -# 3488 "parsing/parser.mly" +# 3492 "parsing/parser.mly" ( Ptyp_arrow(label, domain, codomain) ) -# 20396 "parsing/parser.ml" +# 20440 "parsing/parser.ml" in let _endpos__1_ = _endpos_codomain_ in @@ -20400,15 +20444,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 20406 "parsing/parser.ml" +# 20450 "parsing/parser.ml" in -# 3490 "parsing/parser.mly" +# 3494 "parsing/parser.mly" ( _1 ) -# 20412 "parsing/parser.ml" +# 20456 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20439,9 +20483,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Lexing.position * Parsetree.functor_parameter) = let _startpos = _startpos__1_ in -# 1365 "parsing/parser.mly" +# 1369 "parsing/parser.mly" ( _startpos, Unit ) -# 20445 "parsing/parser.ml" +# 20489 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20497,16 +20541,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 20503 "parsing/parser.ml" +# 20547 "parsing/parser.ml" in let _startpos = _startpos__1_ in -# 1368 "parsing/parser.mly" +# 1372 "parsing/parser.mly" ( _startpos, Named (x, mty) ) -# 20510 "parsing/parser.ml" +# 20554 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20523,9 +20567,9 @@ module Tables = struct let _endpos = _startpos in let _v : (Ast_helper.str list * Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3281 "parsing/parser.mly" +# 3285 "parsing/parser.mly" ( ([],Pcstr_tuple [],None) ) -# 20529 "parsing/parser.ml" +# 20573 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20556,9 +20600,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Ast_helper.str list * Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3282 "parsing/parser.mly" +# 3286 "parsing/parser.mly" ( ([],_2,None) ) -# 20562 "parsing/parser.ml" +# 20606 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20603,9 +20647,9 @@ module Tables = struct let _endpos = _endpos__4_ in let _v : (Ast_helper.str list * Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3284 "parsing/parser.mly" +# 3288 "parsing/parser.mly" ( ([],_2,Some _4) ) -# 20609 "parsing/parser.ml" +# 20653 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20668,24 +20712,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 20672 "parsing/parser.ml" +# 20716 "parsing/parser.ml" in -# 1058 "parsing/parser.mly" +# 1062 "parsing/parser.mly" ( xs ) -# 20677 "parsing/parser.ml" +# 20721 "parsing/parser.ml" in -# 3417 "parsing/parser.mly" +# 3421 "parsing/parser.mly" ( _1 ) -# 20683 "parsing/parser.ml" +# 20727 "parsing/parser.ml" in -# 3287 "parsing/parser.mly" +# 3291 "parsing/parser.mly" ( (_2,_4,Some _6) ) -# 20689 "parsing/parser.ml" +# 20733 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20716,9 +20760,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Ast_helper.str list * Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3289 "parsing/parser.mly" +# 3293 "parsing/parser.mly" ( ([],Pcstr_tuple [],Some _2) ) -# 20722 "parsing/parser.ml" +# 20766 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20767,24 +20811,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 20771 "parsing/parser.ml" +# 20815 "parsing/parser.ml" in -# 1058 "parsing/parser.mly" +# 1062 "parsing/parser.mly" ( xs ) -# 20776 "parsing/parser.ml" +# 20820 "parsing/parser.ml" in -# 3417 "parsing/parser.mly" +# 3421 "parsing/parser.mly" ( _1 ) -# 20782 "parsing/parser.ml" +# 20826 "parsing/parser.ml" in -# 3291 "parsing/parser.mly" +# 3295 "parsing/parser.mly" ( (_2,Pcstr_tuple [],Some _4) ) -# 20788 "parsing/parser.ml" +# 20832 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20833,9 +20877,9 @@ module Tables = struct Docstrings.info) = let attrs = let _1 = _1_inlined2 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 20839 "parsing/parser.ml" +# 20883 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined2_ in @@ -20845,23 +20889,23 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 20851 "parsing/parser.ml" +# 20895 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3229 "parsing/parser.mly" +# 3233 "parsing/parser.mly" ( let vars, args, res = vars_args_res in let info = symbol_info _endpos in let loc = make_loc _sloc in cid, vars, args, res, attrs, loc, info ) -# 20865 "parsing/parser.ml" +# 20909 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20903,9 +20947,9 @@ module Tables = struct Docstrings.info) = let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 20909 "parsing/parser.ml" +# 20953 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined1_ in @@ -20914,29 +20958,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 20920 "parsing/parser.ml" +# 20964 "parsing/parser.ml" in let _startpos_cid_ = _startpos__1_ in let _1 = -# 3879 "parsing/parser.mly" +# 3883 "parsing/parser.mly" ( () ) -# 20927 "parsing/parser.ml" +# 20971 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos_cid_ in let _sloc = (_symbolstartpos, _endpos) in -# 3229 "parsing/parser.mly" +# 3233 "parsing/parser.mly" ( let vars, args, res = vars_args_res in let info = symbol_info _endpos in let loc = make_loc _sloc in cid, vars, args, res, attrs, loc, info ) -# 20940 "parsing/parser.ml" +# 20984 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21007,9 +21051,9 @@ module Tables = struct let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 21013 "parsing/parser.ml" +# 21057 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -21022,9 +21066,9 @@ module Tables = struct Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined4 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 21028 "parsing/parser.ml" +# 21072 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -21033,24 +21077,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 21037 "parsing/parser.ml" +# 21081 "parsing/parser.ml" in -# 1040 "parsing/parser.mly" +# 1044 "parsing/parser.mly" ( xs ) -# 21042 "parsing/parser.ml" +# 21086 "parsing/parser.ml" in -# 3134 "parsing/parser.mly" +# 3138 "parsing/parser.mly" ( _1 ) -# 21048 "parsing/parser.ml" +# 21092 "parsing/parser.ml" in let kind_priv_manifest = -# 3169 "parsing/parser.mly" +# 3173 "parsing/parser.mly" ( _2 ) -# 21054 "parsing/parser.ml" +# 21098 "parsing/parser.ml" in let id = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -21058,29 +21102,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21064 "parsing/parser.ml" +# 21108 "parsing/parser.ml" in let flag = -# 3899 "parsing/parser.mly" +# 3903 "parsing/parser.mly" ( Recursive ) -# 21070 "parsing/parser.ml" +# 21114 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 21077 "parsing/parser.ml" +# 21121 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3106 "parsing/parser.mly" +# 3110 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -21089,7 +21133,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 21093 "parsing/parser.ml" +# 21137 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21166,9 +21210,9 @@ module Tables = struct let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in let _1_inlined4 : unit = Obj.magic _1_inlined4 in let _1_inlined3 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 21172 "parsing/parser.ml" +# 21216 "parsing/parser.ml" ) = Obj.magic _1_inlined3 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined2 : unit = Obj.magic _1_inlined2 in @@ -21182,9 +21226,9 @@ module Tables = struct Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined5 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 21188 "parsing/parser.ml" +# 21232 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined5_ in @@ -21193,24 +21237,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 21197 "parsing/parser.ml" +# 21241 "parsing/parser.ml" in -# 1040 "parsing/parser.mly" +# 1044 "parsing/parser.mly" ( xs ) -# 21202 "parsing/parser.ml" +# 21246 "parsing/parser.ml" in -# 3134 "parsing/parser.mly" +# 3138 "parsing/parser.mly" ( _1 ) -# 21208 "parsing/parser.ml" +# 21252 "parsing/parser.ml" in let kind_priv_manifest = -# 3169 "parsing/parser.mly" +# 3173 "parsing/parser.mly" ( _2 ) -# 21214 "parsing/parser.ml" +# 21258 "parsing/parser.ml" in let id = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in @@ -21218,9 +21262,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21224 "parsing/parser.ml" +# 21268 "parsing/parser.ml" in let flag = @@ -21229,24 +21273,24 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3901 "parsing/parser.mly" +# 3905 "parsing/parser.mly" ( not_expecting _loc "nonrec flag" ) -# 21235 "parsing/parser.ml" +# 21279 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 21243 "parsing/parser.ml" +# 21287 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3106 "parsing/parser.mly" +# 3110 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -21255,7 +21299,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 21259 "parsing/parser.ml" +# 21303 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21319,9 +21363,9 @@ module Tables = struct let xs : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs in let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 21325 "parsing/parser.ml" +# 21369 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -21334,9 +21378,9 @@ module Tables = struct Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 21340 "parsing/parser.ml" +# 21384 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -21345,18 +21389,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 21349 "parsing/parser.ml" +# 21393 "parsing/parser.ml" in -# 1040 "parsing/parser.mly" +# 1044 "parsing/parser.mly" ( xs ) -# 21354 "parsing/parser.ml" +# 21398 "parsing/parser.ml" in -# 3134 "parsing/parser.mly" +# 3138 "parsing/parser.mly" ( _1 ) -# 21360 "parsing/parser.ml" +# 21404 "parsing/parser.ml" in let id = @@ -21365,29 +21409,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21371 "parsing/parser.ml" +# 21415 "parsing/parser.ml" in let flag = -# 3895 "parsing/parser.mly" +# 3899 "parsing/parser.mly" ( Recursive ) -# 21377 "parsing/parser.ml" +# 21421 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 21384 "parsing/parser.ml" +# 21428 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3106 "parsing/parser.mly" +# 3110 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -21396,7 +21440,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 21400 "parsing/parser.ml" +# 21444 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21466,9 +21510,9 @@ module Tables = struct let xs : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs in let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in let _1_inlined3 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 21472 "parsing/parser.ml" +# 21516 "parsing/parser.ml" ) = Obj.magic _1_inlined3 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined2 : unit = Obj.magic _1_inlined2 in @@ -21482,9 +21526,9 @@ module Tables = struct Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined4 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 21488 "parsing/parser.ml" +# 21532 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -21493,18 +21537,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 21497 "parsing/parser.ml" +# 21541 "parsing/parser.ml" in -# 1040 "parsing/parser.mly" +# 1044 "parsing/parser.mly" ( xs ) -# 21502 "parsing/parser.ml" +# 21546 "parsing/parser.ml" in -# 3134 "parsing/parser.mly" +# 3138 "parsing/parser.mly" ( _1 ) -# 21508 "parsing/parser.ml" +# 21552 "parsing/parser.ml" in let id = @@ -21513,29 +21557,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21519 "parsing/parser.ml" +# 21563 "parsing/parser.ml" in let flag = -# 3896 "parsing/parser.mly" +# 3900 "parsing/parser.mly" ( Nonrecursive ) -# 21525 "parsing/parser.ml" +# 21569 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 21532 "parsing/parser.ml" +# 21576 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3106 "parsing/parser.mly" +# 3110 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -21544,7 +21588,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 21548 "parsing/parser.ml" +# 21592 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21563,17 +21607,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 825 "parsing/parser.mly" +# 829 "parsing/parser.mly" (string) -# 21569 "parsing/parser.ml" +# 21613 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3738 "parsing/parser.mly" +# 3742 "parsing/parser.mly" ( _1 ) -# 21577 "parsing/parser.ml" +# 21621 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21592,17 +21636,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 21598 "parsing/parser.ml" +# 21642 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3739 "parsing/parser.mly" +# 3743 "parsing/parser.mly" ( _1 ) -# 21606 "parsing/parser.ml" +# 21650 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21632,9 +21676,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.structure) = -# 1232 "parsing/parser.mly" +# 1236 "parsing/parser.mly" ( _1 ) -# 21638 "parsing/parser.ml" +# 21682 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21650,9 +21694,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (string) = -# 3788 "parsing/parser.mly" +# 3792 "parsing/parser.mly" ( "" ) -# 21656 "parsing/parser.ml" +# 21700 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21682,9 +21726,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (string) = -# 3789 "parsing/parser.mly" +# 3793 "parsing/parser.mly" ( ";.." ) -# 21688 "parsing/parser.ml" +# 21732 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21714,9 +21758,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.signature) = -# 1239 "parsing/parser.mly" +# 1243 "parsing/parser.mly" ( _1 ) -# 21720 "parsing/parser.ml" +# 21764 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21760,9 +21804,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.extension) = -# 4079 "parsing/parser.mly" +# 4083 "parsing/parser.mly" ( (_2, _3) ) -# 21766 "parsing/parser.ml" +# 21810 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21781,9 +21825,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 816 "parsing/parser.mly" +# 820 "parsing/parser.mly" (string * Location.t * string * Location.t * string option) -# 21787 "parsing/parser.ml" +# 21831 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -21792,9 +21836,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4081 "parsing/parser.mly" +# 4085 "parsing/parser.mly" ( mk_quotedext ~loc:_sloc _1 ) -# 21798 "parsing/parser.ml" +# 21842 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21840,9 +21884,9 @@ module Tables = struct let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _3 : unit = Obj.magic _3 in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 21846 "parsing/parser.ml" +# 21890 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : (Asttypes.mutable_flag) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -21851,34 +21895,34 @@ module Tables = struct let _v : (Parsetree.label_declaration) = let _5 = let _1 = _1_inlined3 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 21857 "parsing/parser.ml" +# 21901 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3435 "parsing/parser.mly" +# 3439 "parsing/parser.mly" ( _1 ) -# 21866 "parsing/parser.ml" +# 21910 "parsing/parser.ml" in let _2 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 21874 "parsing/parser.ml" +# 21918 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21882 "parsing/parser.ml" +# 21926 "parsing/parser.ml" in let _startpos__2_ = _startpos__1_inlined1_ in @@ -21889,10 +21933,10 @@ module Tables = struct _startpos__2_ in let _sloc = (_symbolstartpos, _endpos) in -# 3308 "parsing/parser.mly" +# 3312 "parsing/parser.mly" ( let info = symbol_info _endpos in Type.field _2 _4 ~mut:_1 ~attrs:_5 ~loc:(make_loc _sloc) ~info ) -# 21896 "parsing/parser.ml" +# 21940 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21952,9 +21996,9 @@ module Tables = struct let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _3 : unit = Obj.magic _3 in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 21958 "parsing/parser.ml" +# 22002 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : (Asttypes.mutable_flag) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -21963,43 +22007,43 @@ module Tables = struct let _v : (Parsetree.label_declaration) = let _7 = let _1 = _1_inlined4 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 21969 "parsing/parser.ml" +# 22013 "parsing/parser.ml" in let _endpos__7_ = _endpos__1_inlined4_ in let _5 = let _1 = _1_inlined3 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 21978 "parsing/parser.ml" +# 22022 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3435 "parsing/parser.mly" +# 3439 "parsing/parser.mly" ( _1 ) -# 21987 "parsing/parser.ml" +# 22031 "parsing/parser.ml" in let _2 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 21995 "parsing/parser.ml" +# 22039 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22003 "parsing/parser.ml" +# 22047 "parsing/parser.ml" in let _startpos__2_ = _startpos__1_inlined1_ in @@ -22010,14 +22054,14 @@ module Tables = struct _startpos__2_ in let _sloc = (_symbolstartpos, _endpos) in -# 3313 "parsing/parser.mly" +# 3317 "parsing/parser.mly" ( let info = match rhs_info _endpos__5_ with | Some _ as info_before_semi -> info_before_semi | None -> symbol_info _endpos in Type.field _2 _4 ~mut:_1 ~attrs:(_5 @ _7) ~loc:(make_loc _sloc) ~info ) -# 22021 "parsing/parser.ml" +# 22065 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22040,9 +22084,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.label_declaration list) = -# 3302 "parsing/parser.mly" +# 3306 "parsing/parser.mly" ( [_1] ) -# 22046 "parsing/parser.ml" +# 22090 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22065,9 +22109,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.label_declaration list) = -# 3303 "parsing/parser.mly" +# 3307 "parsing/parser.mly" ( [_1] ) -# 22071 "parsing/parser.ml" +# 22115 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22097,9 +22141,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.label_declaration list) = -# 3304 "parsing/parser.mly" +# 3308 "parsing/parser.mly" ( _1 :: _2 ) -# 22103 "parsing/parser.ml" +# 22147 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22118,9 +22162,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 22124 "parsing/parser.ml" +# 22168 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -22131,24 +22175,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22137 "parsing/parser.ml" +# 22181 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2363 "parsing/parser.mly" +# 2367 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 22146 "parsing/parser.ml" +# 22190 "parsing/parser.ml" in -# 2355 "parsing/parser.mly" +# 2359 "parsing/parser.mly" ( x ) -# 22152 "parsing/parser.ml" +# 22196 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22181,9 +22225,9 @@ module Tables = struct let cty : (Parsetree.core_type) = Obj.magic cty in let _2 : unit = Obj.magic _2 in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 22187 "parsing/parser.ml" +# 22231 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -22194,18 +22238,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22200 "parsing/parser.ml" +# 22244 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2363 "parsing/parser.mly" +# 2367 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 22209 "parsing/parser.ml" +# 22253 "parsing/parser.ml" in let _startpos_x_ = _startpos__1_ in @@ -22213,11 +22257,11 @@ module Tables = struct let _symbolstartpos = _startpos_x_ in let _sloc = (_symbolstartpos, _endpos) in -# 2357 "parsing/parser.mly" +# 2361 "parsing/parser.mly" ( let lab, pat = x in lab, mkpat ~loc:_sloc (Ppat_constraint (pat, cty)) ) -# 22221 "parsing/parser.ml" +# 22265 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22240,9 +22284,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3820 "parsing/parser.mly" +# 3824 "parsing/parser.mly" ( _1 ) -# 22246 "parsing/parser.ml" +# 22290 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22265,9 +22309,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.arg_label * Parsetree.expression) = -# 2616 "parsing/parser.mly" +# 2620 "parsing/parser.mly" ( (Nolabel, _1) ) -# 22271 "parsing/parser.ml" +# 22315 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22293,17 +22337,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : ( -# 761 "parsing/parser.mly" +# 765 "parsing/parser.mly" (string) -# 22299 "parsing/parser.ml" +# 22343 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.arg_label * Parsetree.expression) = -# 2618 "parsing/parser.mly" +# 2622 "parsing/parser.mly" ( (Labelled _1, _2) ) -# 22307 "parsing/parser.ml" +# 22351 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22328,9 +22372,9 @@ module Tables = struct }; } = _menhir_stack in let label : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 22334 "parsing/parser.ml" +# 22378 "parsing/parser.ml" ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -22338,10 +22382,10 @@ module Tables = struct let _endpos = _endpos_label_ in let _v : (Asttypes.arg_label * Parsetree.expression) = let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2620 "parsing/parser.mly" +# 2624 "parsing/parser.mly" ( let loc = _loc_label_ in (Labelled label, mkexpvar ~loc label) ) -# 22345 "parsing/parser.ml" +# 22389 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22386,9 +22430,9 @@ module Tables = struct let _5 : unit = Obj.magic _5 in let ty : (Parsetree.type_constraint) = Obj.magic ty in let label : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 22392 "parsing/parser.ml" +# 22436 "parsing/parser.ml" ) = Obj.magic label in let _2 : unit = Obj.magic _2 in let _1 : unit = Obj.magic _1 in @@ -22398,10 +22442,10 @@ module Tables = struct let _v : (Asttypes.arg_label * Parsetree.expression) = let _endpos = _endpos__5_ in let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2623 "parsing/parser.mly" +# 2627 "parsing/parser.mly" ( (Labelled label, mkexp_constraint ~loc:(_startpos__2_, _endpos) (mkexpvar ~loc:_loc_label_ label) ty) ) -# 22405 "parsing/parser.ml" +# 22449 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22426,9 +22470,9 @@ module Tables = struct }; } = _menhir_stack in let label : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 22432 "parsing/parser.ml" +# 22476 "parsing/parser.ml" ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -22436,10 +22480,10 @@ module Tables = struct let _endpos = _endpos_label_ in let _v : (Asttypes.arg_label * Parsetree.expression) = let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2626 "parsing/parser.mly" +# 2630 "parsing/parser.mly" ( let loc = _loc_label_ in (Optional label, mkexpvar ~loc label) ) -# 22443 "parsing/parser.ml" +# 22487 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22465,17 +22509,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : ( -# 791 "parsing/parser.mly" +# 795 "parsing/parser.mly" (string) -# 22471 "parsing/parser.ml" +# 22515 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.arg_label * Parsetree.expression) = -# 2629 "parsing/parser.mly" +# 2633 "parsing/parser.mly" ( (Optional _1, _2) ) -# 22479 "parsing/parser.ml" +# 22523 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22528,15 +22572,15 @@ module Tables = struct let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _4 = let _1 = _1_inlined1 in -# 2351 "parsing/parser.mly" +# 2355 "parsing/parser.mly" ( _1 ) -# 22534 "parsing/parser.ml" +# 22578 "parsing/parser.ml" in -# 2325 "parsing/parser.mly" +# 2329 "parsing/parser.mly" ( (Optional (fst _3), _4, snd _3) ) -# 22540 "parsing/parser.ml" +# 22584 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22561,9 +22605,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 22567 "parsing/parser.ml" +# 22611 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -22576,24 +22620,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22582 "parsing/parser.ml" +# 22626 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2363 "parsing/parser.mly" +# 2367 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 22591 "parsing/parser.ml" +# 22635 "parsing/parser.ml" in -# 2327 "parsing/parser.mly" +# 2331 "parsing/parser.mly" ( (Optional (fst _2), None, snd _2) ) -# 22597 "parsing/parser.ml" +# 22641 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22640,9 +22684,9 @@ module Tables = struct let _3 : (Parsetree.pattern) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 791 "parsing/parser.mly" +# 795 "parsing/parser.mly" (string) -# 22646 "parsing/parser.ml" +# 22690 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -22650,15 +22694,15 @@ module Tables = struct let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _4 = let _1 = _1_inlined1 in -# 2351 "parsing/parser.mly" +# 2355 "parsing/parser.mly" ( _1 ) -# 22656 "parsing/parser.ml" +# 22700 "parsing/parser.ml" in -# 2329 "parsing/parser.mly" +# 2333 "parsing/parser.mly" ( (Optional _1, _4, _3) ) -# 22662 "parsing/parser.ml" +# 22706 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22684,17 +22728,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.pattern) = Obj.magic _2 in let _1 : ( -# 791 "parsing/parser.mly" +# 795 "parsing/parser.mly" (string) -# 22690 "parsing/parser.ml" +# 22734 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2331 "parsing/parser.mly" +# 2335 "parsing/parser.mly" ( (Optional _1, None, _2) ) -# 22698 "parsing/parser.ml" +# 22742 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22738,9 +22782,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2333 "parsing/parser.mly" +# 2337 "parsing/parser.mly" ( (Labelled (fst _3), None, snd _3) ) -# 22744 "parsing/parser.ml" +# 22788 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22765,9 +22809,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 22771 "parsing/parser.ml" +# 22815 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -22780,24 +22824,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22786 "parsing/parser.ml" +# 22830 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2363 "parsing/parser.mly" +# 2367 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 22795 "parsing/parser.ml" +# 22839 "parsing/parser.ml" in -# 2335 "parsing/parser.mly" +# 2339 "parsing/parser.mly" ( (Labelled (fst _2), None, snd _2) ) -# 22801 "parsing/parser.ml" +# 22845 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22823,17 +22867,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.pattern) = Obj.magic _2 in let _1 : ( -# 761 "parsing/parser.mly" +# 765 "parsing/parser.mly" (string) -# 22829 "parsing/parser.ml" +# 22873 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2337 "parsing/parser.mly" +# 2341 "parsing/parser.mly" ( (Labelled _1, None, _2) ) -# 22837 "parsing/parser.ml" +# 22881 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22856,9 +22900,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2339 "parsing/parser.mly" +# 2343 "parsing/parser.mly" ( (Nolabel, None, _1) ) -# 22862 "parsing/parser.ml" +# 22906 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22883,9 +22927,9 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.value_constraint option * bool) = -# 2668 "parsing/parser.mly" +# 2672 "parsing/parser.mly" ( let p,e,c = _1 in (p,e,c,false) ) -# 22889 "parsing/parser.ml" +# 22933 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22912,9 +22956,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 2671 "parsing/parser.mly" +# 2675 "parsing/parser.mly" ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1, None, true) ) -# 22918 "parsing/parser.ml" +# 22962 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22949,15 +22993,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2636 "parsing/parser.mly" +# 2640 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 22955 "parsing/parser.ml" +# 22999 "parsing/parser.ml" in -# 2640 "parsing/parser.mly" +# 2644 "parsing/parser.mly" ( (_1, _2, None) ) -# 22961 "parsing/parser.ml" +# 23005 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23006,13 +23050,13 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2636 "parsing/parser.mly" +# 2640 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 23012 "parsing/parser.ml" +# 23056 "parsing/parser.ml" in -# 2642 "parsing/parser.mly" +# 2646 "parsing/parser.mly" ( let v = _1 in (* PR#7344 *) let t = match _2 with @@ -23022,7 +23066,7 @@ module Tables = struct in (v, _4, Some t) ) -# 23026 "parsing/parser.ml" +# 23070 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23093,24 +23137,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 23097 "parsing/parser.ml" +# 23141 "parsing/parser.ml" in -# 1058 "parsing/parser.mly" +# 1062 "parsing/parser.mly" ( xs ) -# 23102 "parsing/parser.ml" +# 23146 "parsing/parser.ml" in -# 3417 "parsing/parser.mly" +# 3421 "parsing/parser.mly" ( _1 ) -# 23108 "parsing/parser.ml" +# 23152 "parsing/parser.ml" in -# 3421 "parsing/parser.mly" +# 3425 "parsing/parser.mly" ( Ptyp_poly(_1, _3) ) -# 23114 "parsing/parser.ml" +# 23158 "parsing/parser.ml" in let _startpos__3_ = _startpos_xs_ in @@ -23119,19 +23163,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2636 "parsing/parser.mly" +# 2640 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 23125 "parsing/parser.ml" +# 23169 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2652 "parsing/parser.mly" +# 2656 "parsing/parser.mly" ( let t = ghtyp ~loc:(_loc__3_) _3 in (_1, _5, Some (Pvc_constraint { locally_abstract_univars = []; typ=t })) ) -# 23135 "parsing/parser.ml" +# 23179 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23204,27 +23248,27 @@ module Tables = struct let _endpos = _endpos__8_ in let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.value_constraint option) = let _4 = -# 2633 "parsing/parser.mly" +# 2637 "parsing/parser.mly" ( xs ) -# 23210 "parsing/parser.ml" +# 23254 "parsing/parser.ml" in let _1 = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2636 "parsing/parser.mly" +# 2640 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 23219 "parsing/parser.ml" +# 23263 "parsing/parser.ml" in -# 2657 "parsing/parser.mly" +# 2661 "parsing/parser.mly" ( let constraint' = Pvc_constraint { locally_abstract_univars=_4; typ = _6} in (_1, _8, Some constraint') ) -# 23228 "parsing/parser.ml" +# 23272 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23262,9 +23306,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.value_constraint option) = -# 2662 "parsing/parser.mly" +# 2666 "parsing/parser.mly" ( (_1, _3, None) ) -# 23268 "parsing/parser.ml" +# 23312 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23316,9 +23360,9 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.value_constraint option) = -# 2664 "parsing/parser.mly" +# 2668 "parsing/parser.mly" ( (_1, _5, Some(Pvc_constraint { locally_abstract_univars=[]; typ=_3 })) ) -# 23322 "parsing/parser.ml" +# 23366 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23380,36 +23424,36 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 23386 "parsing/parser.ml" +# 23430 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 23395 "parsing/parser.ml" +# 23439 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2691 "parsing/parser.mly" +# 2695 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) ) -# 23407 "parsing/parser.ml" +# 23451 "parsing/parser.ml" in -# 2681 "parsing/parser.mly" +# 2685 "parsing/parser.mly" ( _1 ) -# 23413 "parsing/parser.ml" +# 23457 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23439,9 +23483,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (let_bindings) = -# 2682 "parsing/parser.mly" +# 2686 "parsing/parser.mly" ( addlb _1 _2 ) -# 23445 "parsing/parser.ml" +# 23489 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23496,41 +23540,41 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 23502 "parsing/parser.ml" +# 23546 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 23511 "parsing/parser.ml" +# 23555 "parsing/parser.ml" in let ext = -# 4065 "parsing/parser.mly" +# 4069 "parsing/parser.mly" ( None ) -# 23517 "parsing/parser.ml" +# 23561 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2691 "parsing/parser.mly" +# 2695 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) ) -# 23528 "parsing/parser.ml" +# 23572 "parsing/parser.ml" in -# 2681 "parsing/parser.mly" +# 2685 "parsing/parser.mly" ( _1 ) -# 23534 "parsing/parser.ml" +# 23578 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23599,18 +23643,18 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 23605 "parsing/parser.ml" +# 23649 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let attrs1 = let _1 = _1_inlined2 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 23614 "parsing/parser.ml" +# 23658 "parsing/parser.ml" in let ext = @@ -23619,27 +23663,27 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 4067 "parsing/parser.mly" +# 4071 "parsing/parser.mly" ( not_expecting _loc "extension" ) -# 23625 "parsing/parser.ml" +# 23669 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2691 "parsing/parser.mly" +# 2695 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) ) -# 23637 "parsing/parser.ml" +# 23681 "parsing/parser.ml" in -# 2681 "parsing/parser.mly" +# 2685 "parsing/parser.mly" ( _1 ) -# 23643 "parsing/parser.ml" +# 23687 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23669,9 +23713,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (let_bindings) = -# 2682 "parsing/parser.mly" +# 2686 "parsing/parser.mly" ( addlb _1 _2 ) -# 23675 "parsing/parser.ml" +# 23719 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23694,9 +23738,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2367 "parsing/parser.mly" +# 2371 "parsing/parser.mly" ( _1 ) -# 23700 "parsing/parser.ml" +# 23744 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23734,24 +23778,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2369 "parsing/parser.mly" +# 2373 "parsing/parser.mly" ( Ppat_constraint(_1, _3) ) -# 23740 "parsing/parser.ml" +# 23784 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 23749 "parsing/parser.ml" +# 23793 "parsing/parser.ml" in -# 2370 "parsing/parser.mly" +# 2374 "parsing/parser.mly" ( _1 ) -# 23755 "parsing/parser.ml" +# 23799 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23785,15 +23829,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2636 "parsing/parser.mly" +# 2640 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 23791 "parsing/parser.ml" +# 23835 "parsing/parser.ml" in -# 2708 "parsing/parser.mly" +# 2712 "parsing/parser.mly" ( (pat, exp) ) -# 23797 "parsing/parser.ml" +# 23841 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23819,9 +23863,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 2711 "parsing/parser.mly" +# 2715 "parsing/parser.mly" ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1) ) -# 23825 "parsing/parser.ml" +# 23869 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23872,10 +23916,10 @@ module Tables = struct let _startpos = _startpos_pat_ in let _endpos = _endpos_exp_ in let _v : (Parsetree.pattern * Parsetree.expression) = -# 2713 "parsing/parser.mly" +# 2717 "parsing/parser.mly" ( let loc = (_startpos_pat_, _endpos_typ_) in (ghpat ~loc (Ppat_constraint(pat, typ)), exp) ) -# 23879 "parsing/parser.ml" +# 23923 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23912,9 +23956,9 @@ module Tables = struct let _startpos = _startpos_pat_ in let _endpos = _endpos_exp_ in let _v : (Parsetree.pattern * Parsetree.expression) = -# 2716 "parsing/parser.mly" +# 2720 "parsing/parser.mly" ( (pat, exp) ) -# 23918 "parsing/parser.ml" +# 23962 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23937,10 +23981,10 @@ module Tables = struct let _startpos = _startpos_body_ in let _endpos = _endpos_body_ in let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = -# 2720 "parsing/parser.mly" +# 2724 "parsing/parser.mly" ( let let_pat, let_exp = body in let_pat, let_exp, [] ) -# 23944 "parsing/parser.ml" +# 23988 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23972,9 +24016,9 @@ module Tables = struct } = _menhir_stack in let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in let _1 : ( -# 757 "parsing/parser.mly" +# 761 "parsing/parser.mly" (string) -# 23978 "parsing/parser.ml" +# 24022 "parsing/parser.ml" ) = Obj.magic _1 in let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -23985,22 +24029,22 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 23991 "parsing/parser.ml" +# 24035 "parsing/parser.ml" in let _endpos = _endpos_body_ in let _symbolstartpos = _startpos_bindings_ in let _sloc = (_symbolstartpos, _endpos) in -# 2723 "parsing/parser.mly" +# 2727 "parsing/parser.mly" ( let let_pat, let_exp, rev_ands = bindings in let pbop_pat, pbop_exp = body in let pbop_loc = make_loc _sloc in let and_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in let_pat, let_exp, and_ :: rev_ands ) -# 24004 "parsing/parser.ml" +# 24048 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24018,7 +24062,7 @@ module Tables = struct let _v : (Parsetree.class_declaration list) = # 211 "" ( [] ) -# 24022 "parsing/parser.ml" +# 24066 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24082,9 +24126,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in let body : (Parsetree.class_expr) = Obj.magic body in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 24088 "parsing/parser.ml" +# 24132 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -24097,9 +24141,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 24103 "parsing/parser.ml" +# 24147 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -24109,24 +24153,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 24115 "parsing/parser.ml" +# 24159 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 24123 "parsing/parser.ml" +# 24167 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1940 "parsing/parser.mly" +# 1944 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -24134,13 +24178,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Ci.mk id body ~virt ~params ~attrs ~loc ~text ~docs ) -# 24138 "parsing/parser.ml" +# 24182 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 24144 "parsing/parser.ml" +# 24188 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24158,7 +24202,7 @@ module Tables = struct let _v : (Parsetree.class_description list) = # 211 "" ( [] ) -# 24162 "parsing/parser.ml" +# 24206 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24229,9 +24273,9 @@ module Tables = struct let cty : (Parsetree.class_type) = Obj.magic cty in let _6 : unit = Obj.magic _6 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 24235 "parsing/parser.ml" +# 24279 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -24244,9 +24288,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 24250 "parsing/parser.ml" +# 24294 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -24256,24 +24300,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 24262 "parsing/parser.ml" +# 24306 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 24270 "parsing/parser.ml" +# 24314 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2231 "parsing/parser.mly" +# 2235 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -24281,13 +24325,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Ci.mk id cty ~virt ~params ~attrs ~loc ~text ~docs ) -# 24285 "parsing/parser.ml" +# 24329 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 24291 "parsing/parser.ml" +# 24335 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24305,7 +24349,7 @@ module Tables = struct let _v : (Parsetree.class_type_declaration list) = # 211 "" ( [] ) -# 24309 "parsing/parser.ml" +# 24353 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24376,9 +24420,9 @@ module Tables = struct let csig : (Parsetree.class_type) = Obj.magic csig in let _6 : unit = Obj.magic _6 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 24382 "parsing/parser.ml" +# 24426 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -24391,9 +24435,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 24397 "parsing/parser.ml" +# 24441 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -24403,24 +24447,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 24409 "parsing/parser.ml" +# 24453 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 24417 "parsing/parser.ml" +# 24461 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2270 "parsing/parser.mly" +# 2274 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -24428,13 +24472,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Ci.mk id csig ~virt ~params ~attrs ~loc ~text ~docs ) -# 24432 "parsing/parser.ml" +# 24476 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 24438 "parsing/parser.ml" +# 24482 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24452,7 +24496,7 @@ module Tables = struct let _v : (Parsetree.module_binding list) = # 211 "" ( [] ) -# 24456 "parsing/parser.ml" +# 24500 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24513,9 +24557,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 24519 "parsing/parser.ml" +# 24563 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -24525,24 +24569,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 24531 "parsing/parser.ml" +# 24575 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 24539 "parsing/parser.ml" +# 24583 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1596 "parsing/parser.mly" +# 1600 "parsing/parser.mly" ( let loc = make_loc _sloc in let attrs = attrs1 @ attrs2 in @@ -24550,13 +24594,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Mb.mk name body ~attrs ~loc ~text ~docs ) -# 24554 "parsing/parser.ml" +# 24598 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 24560 "parsing/parser.ml" +# 24604 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24574,7 +24618,7 @@ module Tables = struct let _v : (Parsetree.module_declaration list) = # 211 "" ( [] ) -# 24578 "parsing/parser.ml" +# 24622 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24642,9 +24686,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 24648 "parsing/parser.ml" +# 24692 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -24654,24 +24698,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 24660 "parsing/parser.ml" +# 24704 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 24668 "parsing/parser.ml" +# 24712 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1881 "parsing/parser.mly" +# 1885 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let docs = symbol_docs _sloc in @@ -24679,13 +24723,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Md.mk name mty ~attrs ~loc ~text ~docs ) -# 24683 "parsing/parser.ml" +# 24727 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 24689 "parsing/parser.ml" +# 24733 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24703,7 +24747,7 @@ module Tables = struct let _v : (Parsetree.attributes) = # 211 "" ( [] ) -# 24707 "parsing/parser.ml" +# 24751 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24735,7 +24779,7 @@ module Tables = struct let _v : (Parsetree.attributes) = # 213 "" ( x :: xs ) -# 24739 "parsing/parser.ml" +# 24783 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24753,7 +24797,7 @@ module Tables = struct let _v : (Parsetree.type_declaration list) = # 211 "" ( [] ) -# 24757 "parsing/parser.ml" +# 24801 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24818,9 +24862,9 @@ module Tables = struct let xs_inlined1 : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs_inlined1 in let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 24824 "parsing/parser.ml" +# 24868 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -24833,9 +24877,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 24839 "parsing/parser.ml" +# 24883 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -24844,18 +24888,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 24848 "parsing/parser.ml" +# 24892 "parsing/parser.ml" in -# 1040 "parsing/parser.mly" +# 1044 "parsing/parser.mly" ( xs ) -# 24853 "parsing/parser.ml" +# 24897 "parsing/parser.ml" in -# 3134 "parsing/parser.mly" +# 3138 "parsing/parser.mly" ( _1 ) -# 24859 "parsing/parser.ml" +# 24903 "parsing/parser.ml" in let id = @@ -24864,24 +24908,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 24870 "parsing/parser.ml" +# 24914 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 24878 "parsing/parser.ml" +# 24922 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3123 "parsing/parser.mly" +# 3127 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -24890,13 +24934,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text ) -# 24894 "parsing/parser.ml" +# 24938 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 24900 "parsing/parser.ml" +# 24944 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24914,7 +24958,7 @@ module Tables = struct let _v : (Parsetree.type_declaration list) = # 211 "" ( [] ) -# 24918 "parsing/parser.ml" +# 24962 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24986,9 +25030,9 @@ module Tables = struct let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 24992 "parsing/parser.ml" +# 25036 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -25001,9 +25045,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 25007 "parsing/parser.ml" +# 25051 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -25012,24 +25056,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 25016 "parsing/parser.ml" +# 25060 "parsing/parser.ml" in -# 1040 "parsing/parser.mly" +# 1044 "parsing/parser.mly" ( xs ) -# 25021 "parsing/parser.ml" +# 25065 "parsing/parser.ml" in -# 3134 "parsing/parser.mly" +# 3138 "parsing/parser.mly" ( _1 ) -# 25027 "parsing/parser.ml" +# 25071 "parsing/parser.ml" in let kind_priv_manifest = -# 3169 "parsing/parser.mly" +# 3173 "parsing/parser.mly" ( _2 ) -# 25033 "parsing/parser.ml" +# 25077 "parsing/parser.ml" in let id = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -25037,24 +25081,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 25043 "parsing/parser.ml" +# 25087 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 25051 "parsing/parser.ml" +# 25095 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3123 "parsing/parser.mly" +# 3127 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -25063,13 +25107,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text ) -# 25067 "parsing/parser.ml" +# 25111 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25073 "parsing/parser.ml" +# 25117 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25087,7 +25131,7 @@ module Tables = struct let _v : (Parsetree.attributes) = # 211 "" ( [] ) -# 25091 "parsing/parser.ml" +# 25135 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25119,7 +25163,7 @@ module Tables = struct let _v : (Parsetree.attributes) = # 213 "" ( x :: xs ) -# 25123 "parsing/parser.ml" +# 25167 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25137,7 +25181,7 @@ module Tables = struct let _v : (Parsetree.signature_item list list) = # 211 "" ( [] ) -# 25141 "parsing/parser.ml" +# 25185 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25170,21 +25214,21 @@ module Tables = struct let _1 = let _startpos = _startpos__1_ in -# 966 "parsing/parser.mly" +# 970 "parsing/parser.mly" ( text_sig _startpos ) -# 25176 "parsing/parser.ml" +# 25220 "parsing/parser.ml" in -# 1738 "parsing/parser.mly" +# 1742 "parsing/parser.mly" ( _1 ) -# 25182 "parsing/parser.ml" +# 25226 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25188 "parsing/parser.ml" +# 25232 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25217,21 +25261,21 @@ module Tables = struct let _1 = let _startpos = _startpos__1_ in -# 964 "parsing/parser.mly" +# 968 "parsing/parser.mly" ( text_sig _startpos @ [_1] ) -# 25223 "parsing/parser.ml" +# 25267 "parsing/parser.ml" in -# 1738 "parsing/parser.mly" +# 1742 "parsing/parser.mly" ( _1 ) -# 25229 "parsing/parser.ml" +# 25273 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25235 "parsing/parser.ml" +# 25279 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25249,7 +25293,7 @@ module Tables = struct let _v : (Parsetree.structure_item list list) = # 211 "" ( [] ) -# 25253 "parsing/parser.ml" +# 25297 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25282,40 +25326,40 @@ module Tables = struct let _1 = let ys = let items = -# 1026 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( [] ) -# 25288 "parsing/parser.ml" +# 25332 "parsing/parser.ml" in -# 1477 "parsing/parser.mly" +# 1481 "parsing/parser.mly" ( items ) -# 25293 "parsing/parser.ml" +# 25337 "parsing/parser.ml" in let xs = let _startpos = _startpos__1_ in -# 962 "parsing/parser.mly" +# 966 "parsing/parser.mly" ( text_str _startpos ) -# 25301 "parsing/parser.ml" +# 25345 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 25307 "parsing/parser.ml" +# 25351 "parsing/parser.ml" in -# 1493 "parsing/parser.mly" +# 1497 "parsing/parser.mly" ( _1 ) -# 25313 "parsing/parser.ml" +# 25357 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25319 "parsing/parser.ml" +# 25363 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25367,70 +25411,70 @@ module Tables = struct let _1 = let _1 = let attrs = -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 25373 "parsing/parser.ml" +# 25417 "parsing/parser.ml" in -# 1484 "parsing/parser.mly" +# 1488 "parsing/parser.mly" ( mkstrexp e attrs ) -# 25378 "parsing/parser.ml" +# 25422 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 960 "parsing/parser.mly" +# 964 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 25386 "parsing/parser.ml" +# 25430 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 979 "parsing/parser.mly" +# 983 "parsing/parser.mly" ( mark_rhs_docs _startpos _endpos; _1 ) -# 25396 "parsing/parser.ml" +# 25440 "parsing/parser.ml" in -# 1028 "parsing/parser.mly" +# 1032 "parsing/parser.mly" ( x ) -# 25402 "parsing/parser.ml" +# 25446 "parsing/parser.ml" in -# 1477 "parsing/parser.mly" +# 1481 "parsing/parser.mly" ( items ) -# 25408 "parsing/parser.ml" +# 25452 "parsing/parser.ml" in let xs = let _startpos = _startpos__1_ in -# 962 "parsing/parser.mly" +# 966 "parsing/parser.mly" ( text_str _startpos ) -# 25416 "parsing/parser.ml" +# 25460 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 25422 "parsing/parser.ml" +# 25466 "parsing/parser.ml" in -# 1493 "parsing/parser.mly" +# 1497 "parsing/parser.mly" ( _1 ) -# 25428 "parsing/parser.ml" +# 25472 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25434 "parsing/parser.ml" +# 25478 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25463,21 +25507,21 @@ module Tables = struct let _1 = let _startpos = _startpos__1_ in -# 960 "parsing/parser.mly" +# 964 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 25469 "parsing/parser.ml" +# 25513 "parsing/parser.ml" in -# 1493 "parsing/parser.mly" +# 1497 "parsing/parser.mly" ( _1 ) -# 25475 "parsing/parser.ml" +# 25519 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25481 "parsing/parser.ml" +# 25525 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25495,7 +25539,7 @@ module Tables = struct let _v : (Parsetree.class_type_field list list) = # 211 "" ( [] ) -# 25499 "parsing/parser.ml" +# 25543 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25527,15 +25571,15 @@ module Tables = struct let _v : (Parsetree.class_type_field list list) = let x = let _startpos = _startpos__1_ in -# 974 "parsing/parser.mly" +# 978 "parsing/parser.mly" ( text_csig _startpos @ [_1] ) -# 25533 "parsing/parser.ml" +# 25577 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25539 "parsing/parser.ml" +# 25583 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25553,7 +25597,7 @@ module Tables = struct let _v : (Parsetree.class_field list list) = # 211 "" ( [] ) -# 25557 "parsing/parser.ml" +# 25601 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25585,15 +25629,15 @@ module Tables = struct let _v : (Parsetree.class_field list list) = let x = let _startpos = _startpos__1_ in -# 972 "parsing/parser.mly" +# 976 "parsing/parser.mly" ( text_cstr _startpos @ [_1] ) -# 25591 "parsing/parser.ml" +# 25635 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25597 "parsing/parser.ml" +# 25641 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25611,7 +25655,7 @@ module Tables = struct let _v : (Parsetree.structure_item list list) = # 211 "" ( [] ) -# 25615 "parsing/parser.ml" +# 25659 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25643,15 +25687,15 @@ module Tables = struct let _v : (Parsetree.structure_item list list) = let x = let _startpos = _startpos__1_ in -# 960 "parsing/parser.mly" +# 964 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 25649 "parsing/parser.ml" +# 25693 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25655 "parsing/parser.ml" +# 25699 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25669,7 +25713,7 @@ module Tables = struct let _v : (Parsetree.toplevel_phrase list list) = # 211 "" ( [] ) -# 25673 "parsing/parser.ml" +# 25717 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25702,32 +25746,32 @@ module Tables = struct let _1 = let x = let _1 = -# 1026 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( [] ) -# 25708 "parsing/parser.ml" +# 25752 "parsing/parser.ml" in -# 1279 "parsing/parser.mly" +# 1283 "parsing/parser.mly" ( _1 ) -# 25713 "parsing/parser.ml" +# 25757 "parsing/parser.ml" in # 183 "" ( x ) -# 25719 "parsing/parser.ml" +# 25763 "parsing/parser.ml" in -# 1291 "parsing/parser.mly" +# 1295 "parsing/parser.mly" ( _1 ) -# 25725 "parsing/parser.ml" +# 25769 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25731 "parsing/parser.ml" +# 25775 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25779,58 +25823,58 @@ module Tables = struct let _1 = let _1 = let attrs = -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 25785 "parsing/parser.ml" +# 25829 "parsing/parser.ml" in -# 1484 "parsing/parser.mly" +# 1488 "parsing/parser.mly" ( mkstrexp e attrs ) -# 25790 "parsing/parser.ml" +# 25834 "parsing/parser.ml" in -# 970 "parsing/parser.mly" +# 974 "parsing/parser.mly" ( Ptop_def [_1] ) -# 25796 "parsing/parser.ml" +# 25840 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 968 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 25804 "parsing/parser.ml" +# 25848 "parsing/parser.ml" in -# 1028 "parsing/parser.mly" +# 1032 "parsing/parser.mly" ( x ) -# 25810 "parsing/parser.ml" +# 25854 "parsing/parser.ml" in -# 1279 "parsing/parser.mly" +# 1283 "parsing/parser.mly" ( _1 ) -# 25816 "parsing/parser.ml" +# 25860 "parsing/parser.ml" in # 183 "" ( x ) -# 25822 "parsing/parser.ml" +# 25866 "parsing/parser.ml" in -# 1291 "parsing/parser.mly" +# 1295 "parsing/parser.mly" ( _1 ) -# 25828 "parsing/parser.ml" +# 25872 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25834 "parsing/parser.ml" +# 25878 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25862,27 +25906,27 @@ module Tables = struct let _v : (Parsetree.toplevel_phrase list list) = let x = let _1 = let _1 = -# 970 "parsing/parser.mly" +# 974 "parsing/parser.mly" ( Ptop_def [_1] ) -# 25868 "parsing/parser.ml" +# 25912 "parsing/parser.ml" in let _startpos = _startpos__1_ in -# 968 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 25874 "parsing/parser.ml" +# 25918 "parsing/parser.ml" in -# 1291 "parsing/parser.mly" +# 1295 "parsing/parser.mly" ( _1 ) -# 25880 "parsing/parser.ml" +# 25924 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25886 "parsing/parser.ml" +# 25930 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25917,29 +25961,29 @@ module Tables = struct let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 979 "parsing/parser.mly" +# 983 "parsing/parser.mly" ( mark_rhs_docs _startpos _endpos; _1 ) -# 25924 "parsing/parser.ml" +# 25968 "parsing/parser.ml" in let _startpos = _startpos__1_ in -# 968 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 25931 "parsing/parser.ml" +# 25975 "parsing/parser.ml" in -# 1291 "parsing/parser.mly" +# 1295 "parsing/parser.mly" ( _1 ) -# 25937 "parsing/parser.ml" +# 25981 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 25943 "parsing/parser.ml" +# 25987 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25978,7 +26022,7 @@ module Tables = struct let _v : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = let _2 = # 124 "" ( None ) -# 25982 "parsing/parser.ml" +# 26026 "parsing/parser.ml" in let x = let label = @@ -25986,9 +26030,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 25992 "parsing/parser.ml" +# 26036 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -25996,7 +26040,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 3009 "parsing/parser.mly" +# 3013 "parsing/parser.mly" ( let constraint_loc, label, pat = match opat with | None -> @@ -26010,13 +26054,13 @@ module Tables = struct in label, mkpat_opt_constraint ~loc:constraint_loc pat octy ) -# 26014 "parsing/parser.ml" +# 26058 "parsing/parser.ml" in -# 1216 "parsing/parser.mly" +# 1220 "parsing/parser.mly" ( [x], None ) -# 26020 "parsing/parser.ml" +# 26064 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26062,7 +26106,7 @@ module Tables = struct let _v : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = let _2 = # 126 "" ( Some x ) -# 26066 "parsing/parser.ml" +# 26110 "parsing/parser.ml" in let x = let label = @@ -26070,9 +26114,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 26076 "parsing/parser.ml" +# 26120 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -26080,7 +26124,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 3009 "parsing/parser.mly" +# 3013 "parsing/parser.mly" ( let constraint_loc, label, pat = match opat with | None -> @@ -26094,13 +26138,13 @@ module Tables = struct in label, mkpat_opt_constraint ~loc:constraint_loc pat octy ) -# 26098 "parsing/parser.ml" +# 26142 "parsing/parser.ml" in -# 1216 "parsing/parser.mly" +# 1220 "parsing/parser.mly" ( [x], None ) -# 26104 "parsing/parser.ml" +# 26148 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26163,9 +26207,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 26169 "parsing/parser.ml" +# 26213 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -26173,7 +26217,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 3009 "parsing/parser.mly" +# 3013 "parsing/parser.mly" ( let constraint_loc, label, pat = match opat with | None -> @@ -26187,13 +26231,13 @@ module Tables = struct in label, mkpat_opt_constraint ~loc:constraint_loc pat octy ) -# 26191 "parsing/parser.ml" +# 26235 "parsing/parser.ml" in -# 1218 "parsing/parser.mly" +# 1222 "parsing/parser.mly" ( [x], Some y ) -# 26197 "parsing/parser.ml" +# 26241 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26249,9 +26293,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 26255 "parsing/parser.ml" +# 26299 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -26259,7 +26303,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 3009 "parsing/parser.mly" +# 3013 "parsing/parser.mly" ( let constraint_loc, label, pat = match opat with | None -> @@ -26273,14 +26317,14 @@ module Tables = struct in label, mkpat_opt_constraint ~loc:constraint_loc pat octy ) -# 26277 "parsing/parser.ml" +# 26321 "parsing/parser.ml" in -# 1222 "parsing/parser.mly" +# 1226 "parsing/parser.mly" ( let xs, y = tail in x :: xs, y ) -# 26284 "parsing/parser.ml" +# 26328 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26317,9 +26361,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.case) = -# 2756 "parsing/parser.mly" +# 2760 "parsing/parser.mly" ( Exp.case _1 _3 ) -# 26323 "parsing/parser.ml" +# 26367 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26370,9 +26414,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Parsetree.case) = -# 2758 "parsing/parser.mly" +# 2762 "parsing/parser.mly" ( Exp.case _1 ~guard:_3 _5 ) -# 26376 "parsing/parser.ml" +# 26420 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26410,9 +26454,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.case) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2760 "parsing/parser.mly" +# 2764 "parsing/parser.mly" ( Exp.case _1 (Exp.unreachable ~loc:(make_loc _loc__3_) ()) ) -# 26416 "parsing/parser.ml" +# 26460 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26473,9 +26517,9 @@ module Tables = struct let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 26479 "parsing/parser.ml" +# 26523 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -26484,49 +26528,49 @@ module Tables = struct let _6 = let _1 = _1_inlined3 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 26490 "parsing/parser.ml" +# 26534 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 26499 "parsing/parser.ml" +# 26543 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 3435 "parsing/parser.mly" +# 3439 "parsing/parser.mly" ( _1 ) -# 26508 "parsing/parser.ml" +# 26552 "parsing/parser.ml" in let _1 = let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 26515 "parsing/parser.ml" +# 26559 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 26523 "parsing/parser.ml" +# 26567 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3701 "parsing/parser.mly" +# 3705 "parsing/parser.mly" ( let info = match rhs_info _endpos__4_ with | Some _ as info_before_semi -> info_before_semi @@ -26534,13 +26578,13 @@ module Tables = struct in let attrs = add_info_attrs info (_4 @ _6) in Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 26538 "parsing/parser.ml" +# 26582 "parsing/parser.ml" in -# 3682 "parsing/parser.mly" +# 3686 "parsing/parser.mly" ( let (f, c) = tail in (head :: f, c) ) -# 26544 "parsing/parser.ml" +# 26588 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26581,15 +26625,15 @@ module Tables = struct let _symbolstartpos = _startpos_ty_ in let _sloc = (_symbolstartpos, _endpos) in -# 3712 "parsing/parser.mly" +# 3716 "parsing/parser.mly" ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 26587 "parsing/parser.ml" +# 26631 "parsing/parser.ml" in -# 3682 "parsing/parser.mly" +# 3686 "parsing/parser.mly" ( let (f, c) = tail in (head :: f, c) ) -# 26593 "parsing/parser.ml" +# 26637 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26643,9 +26687,9 @@ module Tables = struct let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 26649 "parsing/parser.ml" +# 26693 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -26654,49 +26698,49 @@ module Tables = struct let _6 = let _1 = _1_inlined3 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 26660 "parsing/parser.ml" +# 26704 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 26669 "parsing/parser.ml" +# 26713 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 3435 "parsing/parser.mly" +# 3439 "parsing/parser.mly" ( _1 ) -# 26678 "parsing/parser.ml" +# 26722 "parsing/parser.ml" in let _1 = let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 26685 "parsing/parser.ml" +# 26729 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 26693 "parsing/parser.ml" +# 26737 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3701 "parsing/parser.mly" +# 3705 "parsing/parser.mly" ( let info = match rhs_info _endpos__4_ with | Some _ as info_before_semi -> info_before_semi @@ -26704,13 +26748,13 @@ module Tables = struct in let attrs = add_info_attrs info (_4 @ _6) in Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 26708 "parsing/parser.ml" +# 26752 "parsing/parser.ml" in -# 3685 "parsing/parser.mly" +# 3689 "parsing/parser.mly" ( [head], Closed ) -# 26714 "parsing/parser.ml" +# 26758 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26744,15 +26788,15 @@ module Tables = struct let _symbolstartpos = _startpos_ty_ in let _sloc = (_symbolstartpos, _endpos) in -# 3712 "parsing/parser.mly" +# 3716 "parsing/parser.mly" ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 26750 "parsing/parser.ml" +# 26794 "parsing/parser.ml" in -# 3685 "parsing/parser.mly" +# 3689 "parsing/parser.mly" ( [head], Closed ) -# 26756 "parsing/parser.ml" +# 26800 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26792,9 +26836,9 @@ module Tables = struct let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 26798 "parsing/parser.ml" +# 26842 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -26803,50 +26847,50 @@ module Tables = struct let _4 = let _1 = _1_inlined2 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 26809 "parsing/parser.ml" +# 26853 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 3435 "parsing/parser.mly" +# 3439 "parsing/parser.mly" ( _1 ) -# 26818 "parsing/parser.ml" +# 26862 "parsing/parser.ml" in let _1 = let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 26825 "parsing/parser.ml" +# 26869 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 26833 "parsing/parser.ml" +# 26877 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3694 "parsing/parser.mly" +# 3698 "parsing/parser.mly" ( let info = symbol_info _endpos in let attrs = add_info_attrs info _4 in Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 26844 "parsing/parser.ml" +# 26888 "parsing/parser.ml" in -# 3688 "parsing/parser.mly" +# 3692 "parsing/parser.mly" ( [head], Closed ) -# 26850 "parsing/parser.ml" +# 26894 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26873,15 +26917,15 @@ module Tables = struct let _symbolstartpos = _startpos_ty_ in let _sloc = (_symbolstartpos, _endpos) in -# 3712 "parsing/parser.mly" +# 3716 "parsing/parser.mly" ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 26879 "parsing/parser.ml" +# 26923 "parsing/parser.ml" in -# 3688 "parsing/parser.mly" +# 3692 "parsing/parser.mly" ( [head], Closed ) -# 26885 "parsing/parser.ml" +# 26929 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26904,9 +26948,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.object_field list * Asttypes.closed_flag) = -# 3690 "parsing/parser.mly" +# 3694 "parsing/parser.mly" ( [], Open ) -# 26910 "parsing/parser.ml" +# 26954 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26951,9 +26995,9 @@ module Tables = struct let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 26957 "parsing/parser.ml" +# 27001 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let private_ : (Asttypes.private_flag) = Obj.magic private_ in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -26965,41 +27009,41 @@ module Tables = struct Parsetree.attributes) = let ty = let _1 = _1_inlined2 in -# 3431 "parsing/parser.mly" +# 3435 "parsing/parser.mly" ( _1 ) -# 26971 "parsing/parser.ml" +# 27015 "parsing/parser.ml" in let label = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 26979 "parsing/parser.ml" +# 27023 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 26987 "parsing/parser.ml" +# 27031 "parsing/parser.ml" in let attrs = -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 26993 "parsing/parser.ml" +# 27037 "parsing/parser.ml" in let _1 = -# 3957 "parsing/parser.mly" +# 3961 "parsing/parser.mly" ( Fresh ) -# 26998 "parsing/parser.ml" +# 27042 "parsing/parser.ml" in -# 2078 "parsing/parser.mly" +# 2082 "parsing/parser.mly" ( (label, private_, Cfk_virtual ty), attrs ) -# 27003 "parsing/parser.ml" +# 27047 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27037,9 +27081,9 @@ module Tables = struct } = _menhir_stack in let _5 : (Parsetree.expression) = Obj.magic _5 in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 27043 "parsing/parser.ml" +# 27087 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -27051,36 +27095,36 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 27057 "parsing/parser.ml" +# 27101 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 27065 "parsing/parser.ml" +# 27109 "parsing/parser.ml" in let _2 = -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 27071 "parsing/parser.ml" +# 27115 "parsing/parser.ml" in let _1 = -# 3960 "parsing/parser.mly" +# 3964 "parsing/parser.mly" ( Fresh ) -# 27076 "parsing/parser.ml" +# 27120 "parsing/parser.ml" in -# 2080 "parsing/parser.mly" +# 2084 "parsing/parser.mly" ( let e = _5 in let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in (_4, _3, Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) -# 27084 "parsing/parser.ml" +# 27128 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27124,9 +27168,9 @@ module Tables = struct } = _menhir_stack in let _5 : (Parsetree.expression) = Obj.magic _5 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 27130 "parsing/parser.ml" +# 27174 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -27139,39 +27183,39 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 27145 "parsing/parser.ml" +# 27189 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 27153 "parsing/parser.ml" +# 27197 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 27161 "parsing/parser.ml" +# 27205 "parsing/parser.ml" in let _1 = -# 3961 "parsing/parser.mly" +# 3965 "parsing/parser.mly" ( Override ) -# 27167 "parsing/parser.ml" +# 27211 "parsing/parser.ml" in -# 2080 "parsing/parser.mly" +# 2084 "parsing/parser.mly" ( let e = _5 in let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in (_4, _3, Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) -# 27175 "parsing/parser.ml" +# 27219 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27230,9 +27274,9 @@ module Tables = struct let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 27236 "parsing/parser.ml" +# 27280 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -27244,45 +27288,45 @@ module Tables = struct Parsetree.attributes) = let _6 = let _1 = _1_inlined2 in -# 3431 "parsing/parser.mly" +# 3435 "parsing/parser.mly" ( _1 ) -# 27250 "parsing/parser.ml" +# 27294 "parsing/parser.ml" in let _startpos__6_ = _startpos__1_inlined2_ in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 27259 "parsing/parser.ml" +# 27303 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 27267 "parsing/parser.ml" +# 27311 "parsing/parser.ml" in let _2 = -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 27273 "parsing/parser.ml" +# 27317 "parsing/parser.ml" in let _1 = -# 3960 "parsing/parser.mly" +# 3964 "parsing/parser.mly" ( Fresh ) -# 27278 "parsing/parser.ml" +# 27322 "parsing/parser.ml" in -# 2086 "parsing/parser.mly" +# 2090 "parsing/parser.mly" ( let poly_exp = let loc = (_startpos__6_, _endpos__8_) in ghexp ~loc (Pexp_poly(_8, Some _6)) in (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 27286 "parsing/parser.ml" +# 27330 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27347,9 +27391,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.core_type) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 27353 "parsing/parser.ml" +# 27397 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -27362,48 +27406,48 @@ module Tables = struct Parsetree.attributes) = let _6 = let _1 = _1_inlined3 in -# 3431 "parsing/parser.mly" +# 3435 "parsing/parser.mly" ( _1 ) -# 27368 "parsing/parser.ml" +# 27412 "parsing/parser.ml" in let _startpos__6_ = _startpos__1_inlined3_ in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 27377 "parsing/parser.ml" +# 27421 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 27385 "parsing/parser.ml" +# 27429 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 27393 "parsing/parser.ml" +# 27437 "parsing/parser.ml" in let _1 = -# 3961 "parsing/parser.mly" +# 3965 "parsing/parser.mly" ( Override ) -# 27399 "parsing/parser.ml" +# 27443 "parsing/parser.ml" in -# 2086 "parsing/parser.mly" +# 2090 "parsing/parser.mly" ( let poly_exp = let loc = (_startpos__6_, _endpos__8_) in ghexp ~loc (Pexp_poly(_8, Some _6)) in (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 27407 "parsing/parser.ml" +# 27451 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27483,9 +27527,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 27489 "parsing/parser.ml" +# 27533 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -27495,38 +27539,38 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * Parsetree.class_field_kind) * Parsetree.attributes) = let _7 = -# 2633 "parsing/parser.mly" +# 2637 "parsing/parser.mly" ( xs ) -# 27501 "parsing/parser.ml" +# 27545 "parsing/parser.ml" in let _startpos__7_ = _startpos_xs_ in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 27509 "parsing/parser.ml" +# 27553 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 27517 "parsing/parser.ml" +# 27561 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined1_ in let _2 = -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 27524 "parsing/parser.ml" +# 27568 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in let _1 = -# 3960 "parsing/parser.mly" +# 3964 "parsing/parser.mly" ( Fresh ) -# 27530 "parsing/parser.ml" +# 27574 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in let _endpos = _endpos__11_ in @@ -27542,7 +27586,7 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 2092 "parsing/parser.mly" +# 2096 "parsing/parser.mly" ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in let poly_exp = let exp, poly = @@ -27553,7 +27597,7 @@ module Tables = struct ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 27557 "parsing/parser.ml" +# 27601 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27639,9 +27683,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 27645 "parsing/parser.ml" +# 27689 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -27652,41 +27696,41 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * Parsetree.class_field_kind) * Parsetree.attributes) = let _7 = -# 2633 "parsing/parser.mly" +# 2637 "parsing/parser.mly" ( xs ) -# 27658 "parsing/parser.ml" +# 27702 "parsing/parser.ml" in let _startpos__7_ = _startpos_xs_ in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 27666 "parsing/parser.ml" +# 27710 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 27674 "parsing/parser.ml" +# 27718 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 27683 "parsing/parser.ml" +# 27727 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in let _1 = -# 3961 "parsing/parser.mly" +# 3965 "parsing/parser.mly" ( Override ) -# 27690 "parsing/parser.ml" +# 27734 "parsing/parser.ml" in let _endpos = _endpos__11_ in let _symbolstartpos = if _startpos__1_ != _endpos__1_ then @@ -27701,7 +27745,7 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 2092 "parsing/parser.mly" +# 2096 "parsing/parser.mly" ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in let poly_exp = let exp, poly = @@ -27712,7 +27756,7 @@ module Tables = struct ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 27716 "parsing/parser.ml" +# 27760 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27731,17 +27775,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 27737 "parsing/parser.ml" +# 27781 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3813 "parsing/parser.mly" +# 3817 "parsing/parser.mly" ( Lident _1 ) -# 27745 "parsing/parser.ml" +# 27789 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27772,9 +27816,9 @@ module Tables = struct }; } = _menhir_stack in let _3 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 27778 "parsing/parser.ml" +# 27822 "parsing/parser.ml" ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Longident.t) = Obj.magic _1 in @@ -27782,9 +27826,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3814 "parsing/parser.mly" +# 3818 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 27788 "parsing/parser.ml" +# 27832 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27803,17 +27847,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 825 "parsing/parser.mly" +# 829 "parsing/parser.mly" (string) -# 27809 "parsing/parser.ml" +# 27853 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3813 "parsing/parser.mly" +# 3817 "parsing/parser.mly" ( Lident _1 ) -# 27817 "parsing/parser.ml" +# 27861 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27844,9 +27888,9 @@ module Tables = struct }; } = _menhir_stack in let _3 : ( -# 825 "parsing/parser.mly" +# 829 "parsing/parser.mly" (string) -# 27850 "parsing/parser.ml" +# 27894 "parsing/parser.ml" ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Longident.t) = Obj.magic _1 in @@ -27854,9 +27898,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3814 "parsing/parser.mly" +# 3818 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 27860 "parsing/parser.ml" +# 27904 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27879,14 +27923,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = let _1 = -# 3851 "parsing/parser.mly" +# 3855 "parsing/parser.mly" ( _1 ) -# 27885 "parsing/parser.ml" +# 27929 "parsing/parser.ml" in -# 3813 "parsing/parser.mly" +# 3817 "parsing/parser.mly" ( Lident _1 ) -# 27890 "parsing/parser.ml" +# 27934 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27924,20 +27968,20 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Longident.t) = let _1 = let _1 = -# 3793 "parsing/parser.mly" +# 3797 "parsing/parser.mly" ( "::" ) -# 27930 "parsing/parser.ml" +# 27974 "parsing/parser.ml" in -# 3851 "parsing/parser.mly" +# 3855 "parsing/parser.mly" ( _1 ) -# 27935 "parsing/parser.ml" +# 27979 "parsing/parser.ml" in -# 3813 "parsing/parser.mly" +# 3817 "parsing/parser.mly" ( Lident _1 ) -# 27941 "parsing/parser.ml" +# 27985 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27960,14 +28004,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = let _1 = -# 3851 "parsing/parser.mly" +# 3855 "parsing/parser.mly" ( _1 ) -# 27966 "parsing/parser.ml" +# 28010 "parsing/parser.ml" in -# 3813 "parsing/parser.mly" +# 3817 "parsing/parser.mly" ( Lident _1 ) -# 27971 "parsing/parser.ml" +# 28015 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28006,15 +28050,15 @@ module Tables = struct let _v : (Longident.t) = let _3 = let _1 = _1_inlined1 in -# 3851 "parsing/parser.mly" +# 3855 "parsing/parser.mly" ( _1 ) -# 28012 "parsing/parser.ml" +# 28056 "parsing/parser.ml" in -# 3814 "parsing/parser.mly" +# 3818 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 28018 "parsing/parser.ml" +# 28062 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28066,20 +28110,20 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Longident.t) = let _3 = let _1 = -# 3793 "parsing/parser.mly" +# 3797 "parsing/parser.mly" ( "::" ) -# 28072 "parsing/parser.ml" +# 28116 "parsing/parser.ml" in -# 3851 "parsing/parser.mly" +# 3855 "parsing/parser.mly" ( _1 ) -# 28077 "parsing/parser.ml" +# 28121 "parsing/parser.ml" in -# 3814 "parsing/parser.mly" +# 3818 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 28083 "parsing/parser.ml" +# 28127 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28118,15 +28162,15 @@ module Tables = struct let _v : (Longident.t) = let _3 = let _1 = _1_inlined1 in -# 3851 "parsing/parser.mly" +# 3855 "parsing/parser.mly" ( _1 ) -# 28124 "parsing/parser.ml" +# 28168 "parsing/parser.ml" in -# 3814 "parsing/parser.mly" +# 3818 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 28130 "parsing/parser.ml" +# 28174 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28149,9 +28193,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3813 "parsing/parser.mly" +# 3817 "parsing/parser.mly" ( Lident _1 ) -# 28155 "parsing/parser.ml" +# 28199 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28188,9 +28232,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3814 "parsing/parser.mly" +# 3818 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 28194 "parsing/parser.ml" +# 28238 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28209,17 +28253,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 28215 "parsing/parser.ml" +# 28259 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3813 "parsing/parser.mly" +# 3817 "parsing/parser.mly" ( Lident _1 ) -# 28223 "parsing/parser.ml" +# 28267 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28250,9 +28294,9 @@ module Tables = struct }; } = _menhir_stack in let _3 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 28256 "parsing/parser.ml" +# 28300 "parsing/parser.ml" ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Longident.t) = Obj.magic _1 in @@ -28260,9 +28304,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3814 "parsing/parser.mly" +# 3818 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 28266 "parsing/parser.ml" +# 28310 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28281,17 +28325,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 825 "parsing/parser.mly" +# 829 "parsing/parser.mly" (string) -# 28287 "parsing/parser.ml" +# 28331 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3813 "parsing/parser.mly" +# 3817 "parsing/parser.mly" ( Lident _1 ) -# 28295 "parsing/parser.ml" +# 28339 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28322,9 +28366,9 @@ module Tables = struct }; } = _menhir_stack in let _3 : ( -# 825 "parsing/parser.mly" +# 829 "parsing/parser.mly" (string) -# 28328 "parsing/parser.ml" +# 28372 "parsing/parser.ml" ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Longident.t) = Obj.magic _1 in @@ -28332,9 +28376,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3814 "parsing/parser.mly" +# 3818 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 28338 "parsing/parser.ml" +# 28382 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28357,9 +28401,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3813 "parsing/parser.mly" +# 3817 "parsing/parser.mly" ( Lident _1 ) -# 28363 "parsing/parser.ml" +# 28407 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28396,9 +28440,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3814 "parsing/parser.mly" +# 3818 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 28402 "parsing/parser.ml" +# 28446 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28421,9 +28465,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3829 "parsing/parser.mly" +# 3833 "parsing/parser.mly" ( _1 ) -# 28427 "parsing/parser.ml" +# 28471 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28470,9 +28514,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3831 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( lapply ~loc:_sloc _1 _3 ) -# 28476 "parsing/parser.ml" +# 28520 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28510,9 +28554,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Longident.t) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 3833 "parsing/parser.mly" +# 3837 "parsing/parser.mly" ( expecting _loc__3_ "module path" ) -# 28516 "parsing/parser.ml" +# 28560 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28535,9 +28579,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3826 "parsing/parser.mly" +# 3830 "parsing/parser.mly" ( _1 ) -# 28541 "parsing/parser.ml" +# 28585 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28567,9 +28611,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos_me_ in let _v : (Parsetree.module_expr) = -# 1553 "parsing/parser.mly" +# 1557 "parsing/parser.mly" ( me ) -# 28573 "parsing/parser.ml" +# 28617 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28600,9 +28644,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.module_expr) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1555 "parsing/parser.mly" +# 1559 "parsing/parser.mly" ( expecting _loc__1_ "=" ) -# 28606 "parsing/parser.ml" +# 28650 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28647,24 +28691,24 @@ module Tables = struct let _endpos = _endpos_me_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1558 "parsing/parser.mly" +# 1562 "parsing/parser.mly" ( Pmod_constraint(me, mty) ) -# 28653 "parsing/parser.ml" +# 28697 "parsing/parser.ml" in let _endpos__1_ = _endpos_me_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 999 "parsing/parser.mly" +# 1003 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 28662 "parsing/parser.ml" +# 28706 "parsing/parser.ml" in -# 1562 "parsing/parser.mly" +# 1566 "parsing/parser.mly" ( _1 ) -# 28668 "parsing/parser.ml" +# 28712 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28695,25 +28739,25 @@ module Tables = struct let _endpos = _endpos_body_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1560 "parsing/parser.mly" +# 1564 "parsing/parser.mly" ( let (_, arg) = arg_and_pos in Pmod_functor(arg, body) ) -# 28702 "parsing/parser.ml" +# 28746 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 999 "parsing/parser.mly" +# 1003 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 28711 "parsing/parser.ml" +# 28755 "parsing/parser.ml" in -# 1562 "parsing/parser.mly" +# 1566 "parsing/parser.mly" ( _1 ) -# 28717 "parsing/parser.ml" +# 28761 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28743,9 +28787,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos_mty_ in let _v : (Parsetree.module_type) = -# 1805 "parsing/parser.mly" +# 1809 "parsing/parser.mly" ( mty ) -# 28749 "parsing/parser.ml" +# 28793 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28776,9 +28820,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.module_type) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1807 "parsing/parser.mly" +# 1811 "parsing/parser.mly" ( expecting _loc__1_ ":" ) -# 28782 "parsing/parser.ml" +# 28826 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28809,25 +28853,25 @@ module Tables = struct let _endpos = _endpos_body_ in let _v : (Parsetree.module_type) = let _1 = let _1 = -# 1810 "parsing/parser.mly" +# 1814 "parsing/parser.mly" ( let (_, arg) = arg_and_pos in Pmty_functor(arg, body) ) -# 28816 "parsing/parser.ml" +# 28860 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1001 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 28825 "parsing/parser.ml" +# 28869 "parsing/parser.ml" in -# 1813 "parsing/parser.mly" +# 1817 "parsing/parser.mly" ( _1 ) -# 28831 "parsing/parser.ml" +# 28875 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28873,18 +28917,18 @@ module Tables = struct let _v : (Parsetree.module_expr) = let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 28879 "parsing/parser.ml" +# 28923 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1391 "parsing/parser.mly" +# 1395 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_structure s) ) -# 28888 "parsing/parser.ml" +# 28932 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28930,17 +28974,17 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 28936 "parsing/parser.ml" +# 28980 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1393 "parsing/parser.mly" +# 1397 "parsing/parser.mly" ( unclosed "struct" _loc__1_ "end" _loc__4_ ) -# 28944 "parsing/parser.ml" +# 28988 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28971,9 +29015,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.module_expr) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1395 "parsing/parser.mly" +# 1399 "parsing/parser.mly" ( expecting _loc__1_ "struct" ) -# 28977 "parsing/parser.ml" +# 29021 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29026,30 +29070,30 @@ module Tables = struct let _v : (Parsetree.module_expr) = let args = let _1 = _1_inlined2 in -# 1357 "parsing/parser.mly" +# 1361 "parsing/parser.mly" ( _1 ) -# 29032 "parsing/parser.ml" +# 29076 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 29040 "parsing/parser.ml" +# 29084 "parsing/parser.ml" in let _endpos = _endpos_me_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1397 "parsing/parser.mly" +# 1401 "parsing/parser.mly" ( wrap_mod_attrs ~loc:_sloc attrs ( List.fold_left (fun acc (startpos, arg) -> mkmod ~loc:(startpos, _endpos) (Pmod_functor (arg, acc)) ) me args ) ) -# 29053 "parsing/parser.ml" +# 29097 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29072,9 +29116,9 @@ module Tables = struct let _startpos = _startpos_me_ in let _endpos = _endpos_me_ in let _v : (Parsetree.module_expr) = -# 1403 "parsing/parser.mly" +# 1407 "parsing/parser.mly" ( me ) -# 29078 "parsing/parser.ml" +# 29122 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29104,9 +29148,9 @@ module Tables = struct let _startpos = _startpos_me_ in let _endpos = _endpos_attr_ in let _v : (Parsetree.module_expr) = -# 1405 "parsing/parser.mly" +# 1409 "parsing/parser.mly" ( Mod.attr me attr ) -# 29110 "parsing/parser.ml" +# 29154 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29135,30 +29179,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 29141 "parsing/parser.ml" +# 29185 "parsing/parser.ml" in -# 1409 "parsing/parser.mly" +# 1413 "parsing/parser.mly" ( Pmod_ident x ) -# 29147 "parsing/parser.ml" +# 29191 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 999 "parsing/parser.mly" +# 1003 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 29156 "parsing/parser.ml" +# 29200 "parsing/parser.ml" in -# 1420 "parsing/parser.mly" +# 1424 "parsing/parser.mly" ( _1 ) -# 29162 "parsing/parser.ml" +# 29206 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29189,24 +29233,24 @@ module Tables = struct let _endpos = _endpos_me2_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1412 "parsing/parser.mly" +# 1416 "parsing/parser.mly" ( Pmod_apply(me1, me2) ) -# 29195 "parsing/parser.ml" +# 29239 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_me2_, _startpos_me1_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 999 "parsing/parser.mly" +# 1003 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 29204 "parsing/parser.ml" +# 29248 "parsing/parser.ml" in -# 1420 "parsing/parser.mly" +# 1424 "parsing/parser.mly" ( _1 ) -# 29210 "parsing/parser.ml" +# 29254 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29244,24 +29288,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1415 "parsing/parser.mly" +# 1419 "parsing/parser.mly" ( Pmod_apply_unit me ) -# 29250 "parsing/parser.ml" +# 29294 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_me_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 999 "parsing/parser.mly" +# 1003 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 29259 "parsing/parser.ml" +# 29303 "parsing/parser.ml" in -# 1420 "parsing/parser.mly" +# 1424 "parsing/parser.mly" ( _1 ) -# 29265 "parsing/parser.ml" +# 29309 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29285,24 +29329,24 @@ module Tables = struct let _endpos = _endpos_ex_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1418 "parsing/parser.mly" +# 1422 "parsing/parser.mly" ( Pmod_extension ex ) -# 29291 "parsing/parser.ml" +# 29335 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_ex_, _startpos_ex_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 999 "parsing/parser.mly" +# 1003 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 29300 "parsing/parser.ml" +# 29344 "parsing/parser.ml" in -# 1420 "parsing/parser.mly" +# 1424 "parsing/parser.mly" ( _1 ) -# 29306 "parsing/parser.ml" +# 29350 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29321,17 +29365,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let x : ( -# 825 "parsing/parser.mly" +# 829 "parsing/parser.mly" (string) -# 29327 "parsing/parser.ml" +# 29371 "parsing/parser.ml" ) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (string option) = -# 1374 "parsing/parser.mly" +# 1378 "parsing/parser.mly" ( Some x ) -# 29335 "parsing/parser.ml" +# 29379 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29354,9 +29398,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string option) = -# 1377 "parsing/parser.mly" +# 1381 "parsing/parser.mly" ( None ) -# 29360 "parsing/parser.ml" +# 29404 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29414,9 +29458,9 @@ module Tables = struct let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 825 "parsing/parser.mly" +# 829 "parsing/parser.mly" (string) -# 29420 "parsing/parser.ml" +# 29464 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let ext : (string Asttypes.loc option) = Obj.magic ext in @@ -29427,9 +29471,9 @@ module Tables = struct let _v : (Parsetree.module_substitution * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined4 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 29433 "parsing/parser.ml" +# 29477 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -29439,9 +29483,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 29445 "parsing/parser.ml" +# 29489 "parsing/parser.ml" in let uid = @@ -29450,31 +29494,31 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 29456 "parsing/parser.ml" +# 29500 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 29464 "parsing/parser.ml" +# 29508 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1843 "parsing/parser.mly" +# 1847 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Ms.mk uid body ~attrs ~loc ~docs, ext ) -# 29478 "parsing/parser.ml" +# 29522 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29525,9 +29569,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 825 "parsing/parser.mly" +# 829 "parsing/parser.mly" (string) -# 29531 "parsing/parser.ml" +# 29575 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _2 : (string Asttypes.loc option) = Obj.magic _2 in @@ -29541,24 +29585,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 29547 "parsing/parser.ml" +# 29591 "parsing/parser.ml" in let _3 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 29555 "parsing/parser.ml" +# 29599 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in -# 1850 "parsing/parser.mly" +# 1854 "parsing/parser.mly" ( expecting _loc__6_ "module path" ) -# 29562 "parsing/parser.ml" +# 29606 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29604,18 +29648,18 @@ module Tables = struct let _v : (Parsetree.module_type) = let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 29610 "parsing/parser.ml" +# 29654 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1687 "parsing/parser.mly" +# 1691 "parsing/parser.mly" ( mkmty ~loc:_sloc ~attrs (Pmty_signature s) ) -# 29619 "parsing/parser.ml" +# 29663 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29661,17 +29705,17 @@ module Tables = struct let _v : (Parsetree.module_type) = let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 29667 "parsing/parser.ml" +# 29711 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1689 "parsing/parser.mly" +# 1693 "parsing/parser.mly" ( unclosed "sig" _loc__1_ "end" _loc__4_ ) -# 29675 "parsing/parser.ml" +# 29719 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29702,9 +29746,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.module_type) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1691 "parsing/parser.mly" +# 1695 "parsing/parser.mly" ( expecting _loc__1_ "sig" ) -# 29708 "parsing/parser.ml" +# 29752 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29757,30 +29801,30 @@ module Tables = struct let _v : (Parsetree.module_type) = let args = let _1 = _1_inlined2 in -# 1357 "parsing/parser.mly" +# 1361 "parsing/parser.mly" ( _1 ) -# 29763 "parsing/parser.ml" +# 29807 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 29771 "parsing/parser.ml" +# 29815 "parsing/parser.ml" in let _endpos = _endpos_mty_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1695 "parsing/parser.mly" +# 1699 "parsing/parser.mly" ( wrap_mty_attrs ~loc:_sloc attrs ( List.fold_left (fun acc (startpos, arg) -> mkmty ~loc:(startpos, _endpos) (Pmty_functor (arg, acc)) ) mty args ) ) -# 29784 "parsing/parser.ml" +# 29828 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29833,18 +29877,18 @@ module Tables = struct let _v : (Parsetree.module_type) = let _4 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 29839 "parsing/parser.ml" +# 29883 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1701 "parsing/parser.mly" +# 1705 "parsing/parser.mly" ( mkmty ~loc:_sloc ~attrs:_4 (Pmty_typeof _5) ) -# 29848 "parsing/parser.ml" +# 29892 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29881,9 +29925,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.module_type) = -# 1703 "parsing/parser.mly" +# 1707 "parsing/parser.mly" ( _2 ) -# 29887 "parsing/parser.ml" +# 29931 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29922,9 +29966,9 @@ module Tables = struct let _v : (Parsetree.module_type) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1705 "parsing/parser.mly" +# 1709 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 29928 "parsing/parser.ml" +# 29972 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29954,9 +29998,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.module_type) = -# 1707 "parsing/parser.mly" +# 1711 "parsing/parser.mly" ( Mty.attr _1 _2 ) -# 29960 "parsing/parser.ml" +# 30004 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29985,30 +30029,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 29991 "parsing/parser.ml" +# 30035 "parsing/parser.ml" in -# 1710 "parsing/parser.mly" +# 1714 "parsing/parser.mly" ( Pmty_ident _1 ) -# 29997 "parsing/parser.ml" +# 30041 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1001 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 30006 "parsing/parser.ml" +# 30050 "parsing/parser.ml" in -# 1723 "parsing/parser.mly" +# 1727 "parsing/parser.mly" ( _1 ) -# 30012 "parsing/parser.ml" +# 30056 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30053,24 +30097,24 @@ module Tables = struct let _endpos = _endpos__4_ in let _v : (Parsetree.module_type) = let _1 = let _1 = -# 1712 "parsing/parser.mly" +# 1716 "parsing/parser.mly" ( Pmty_functor(Unit, _4) ) -# 30059 "parsing/parser.ml" +# 30103 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1001 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 30068 "parsing/parser.ml" +# 30112 "parsing/parser.ml" in -# 1723 "parsing/parser.mly" +# 1727 "parsing/parser.mly" ( _1 ) -# 30074 "parsing/parser.ml" +# 30118 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30108,24 +30152,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.module_type) = let _1 = let _1 = -# 1715 "parsing/parser.mly" +# 1719 "parsing/parser.mly" ( Pmty_functor(Named (mknoloc None, _1), _3) ) -# 30114 "parsing/parser.ml" +# 30158 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1001 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 30123 "parsing/parser.ml" +# 30167 "parsing/parser.ml" in -# 1723 "parsing/parser.mly" +# 1727 "parsing/parser.mly" ( _1 ) -# 30129 "parsing/parser.ml" +# 30173 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30167,18 +30211,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 30171 "parsing/parser.ml" +# 30215 "parsing/parser.ml" in -# 1111 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( xs ) -# 30176 "parsing/parser.ml" +# 30220 "parsing/parser.ml" in -# 1717 "parsing/parser.mly" +# 1721 "parsing/parser.mly" ( Pmty_with(_1, _3) ) -# 30182 "parsing/parser.ml" +# 30226 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -30186,15 +30230,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1001 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 30192 "parsing/parser.ml" +# 30236 "parsing/parser.ml" in -# 1723 "parsing/parser.mly" +# 1727 "parsing/parser.mly" ( _1 ) -# 30198 "parsing/parser.ml" +# 30242 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30218,23 +30262,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.module_type) = let _1 = let _1 = -# 1721 "parsing/parser.mly" +# 1725 "parsing/parser.mly" ( Pmty_extension _1 ) -# 30224 "parsing/parser.ml" +# 30268 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1001 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 30232 "parsing/parser.ml" +# 30276 "parsing/parser.ml" in -# 1723 "parsing/parser.mly" +# 1727 "parsing/parser.mly" ( _1 ) -# 30238 "parsing/parser.ml" +# 30282 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30301,9 +30345,9 @@ module Tables = struct let _v : (Parsetree.module_type_declaration * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 30307 "parsing/parser.ml" +# 30351 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -30313,31 +30357,31 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30319 "parsing/parser.ml" +# 30363 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 30327 "parsing/parser.ml" +# 30371 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1633 "parsing/parser.mly" +# 1637 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Mtd.mk id ?typ ~attrs ~loc ~docs, ext ) -# 30341 "parsing/parser.ml" +# 30385 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30411,9 +30455,9 @@ module Tables = struct let _v : (Parsetree.module_type_declaration * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 30417 "parsing/parser.ml" +# 30461 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -30423,31 +30467,31 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30429 "parsing/parser.ml" +# 30473 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 30437 "parsing/parser.ml" +# 30481 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1899 "parsing/parser.mly" +# 1903 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Mtd.mk id ~typ ~attrs ~loc ~docs, ext ) -# 30451 "parsing/parser.ml" +# 30495 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30470,9 +30514,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3836 "parsing/parser.mly" +# 3840 "parsing/parser.mly" ( _1 ) -# 30476 "parsing/parser.ml" +# 30520 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30488,9 +30532,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.mutable_flag) = -# 3917 "parsing/parser.mly" +# 3921 "parsing/parser.mly" ( Immutable ) -# 30494 "parsing/parser.ml" +# 30538 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30513,9 +30557,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag) = -# 3918 "parsing/parser.mly" +# 3922 "parsing/parser.mly" ( Mutable ) -# 30519 "parsing/parser.ml" +# 30563 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30531,9 +30575,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3926 "parsing/parser.mly" +# 3930 "parsing/parser.mly" ( Immutable, Concrete ) -# 30537 "parsing/parser.ml" +# 30581 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30556,9 +30600,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3928 "parsing/parser.mly" +# 3932 "parsing/parser.mly" ( Mutable, Concrete ) -# 30562 "parsing/parser.ml" +# 30606 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30581,9 +30625,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3930 "parsing/parser.mly" +# 3934 "parsing/parser.mly" ( Immutable, Virtual ) -# 30587 "parsing/parser.ml" +# 30631 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30613,9 +30657,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3933 "parsing/parser.mly" +# 3937 "parsing/parser.mly" ( Mutable, Virtual ) -# 30619 "parsing/parser.ml" +# 30663 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30645,9 +30689,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3933 "parsing/parser.mly" +# 3937 "parsing/parser.mly" ( Mutable, Virtual ) -# 30651 "parsing/parser.ml" +# 30695 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30677,9 +30721,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.label) = -# 3888 "parsing/parser.mly" +# 3892 "parsing/parser.mly" ( _2 ) -# 30683 "parsing/parser.ml" +# 30727 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30698,9 +30742,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 30704 "parsing/parser.ml" +# 30748 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -30710,15 +30754,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30716 "parsing/parser.ml" +# 30760 "parsing/parser.ml" in # 221 "" ( [ x ] ) -# 30722 "parsing/parser.ml" +# 30766 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30744,9 +30788,9 @@ module Tables = struct } = _menhir_stack in let xs : (string Asttypes.loc list) = Obj.magic xs in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 30750 "parsing/parser.ml" +# 30794 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -30756,15 +30800,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30762 "parsing/parser.ml" +# 30806 "parsing/parser.ml" in # 223 "" ( x :: xs ) -# 30768 "parsing/parser.ml" +# 30812 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30783,22 +30827,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let s : ( -# 812 "parsing/parser.mly" +# 816 "parsing/parser.mly" (string * Location.t * string option) -# 30789 "parsing/parser.ml" +# 30833 "parsing/parser.ml" ) = Obj.magic s in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_s_ in let _endpos = _endpos_s_ in let _v : (string list) = let x = -# 3884 "parsing/parser.mly" +# 3888 "parsing/parser.mly" ( let body, _, _ = s in body ) -# 30797 "parsing/parser.ml" +# 30841 "parsing/parser.ml" in # 221 "" ( [ x ] ) -# 30802 "parsing/parser.ml" +# 30846 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30824,22 +30868,22 @@ module Tables = struct } = _menhir_stack in let xs : (string list) = Obj.magic xs in let s : ( -# 812 "parsing/parser.mly" +# 816 "parsing/parser.mly" (string * Location.t * string option) -# 30830 "parsing/parser.ml" +# 30874 "parsing/parser.ml" ) = Obj.magic s in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_s_ in let _endpos = _endpos_xs_ in let _v : (string list) = let x = -# 3884 "parsing/parser.mly" +# 3888 "parsing/parser.mly" ( let body, _, _ = s in body ) -# 30838 "parsing/parser.ml" +# 30882 "parsing/parser.ml" in # 223 "" ( x :: xs ) -# 30843 "parsing/parser.ml" +# 30887 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30862,14 +30906,14 @@ module Tables = struct let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3913 "parsing/parser.mly" +# 3917 "parsing/parser.mly" ( Public ) -# 30868 "parsing/parser.ml" +# 30912 "parsing/parser.ml" in -# 3143 "parsing/parser.mly" +# 3147 "parsing/parser.mly" ( (Ptype_abstract, priv, Some ty) ) -# 30873 "parsing/parser.ml" +# 30917 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30899,14 +30943,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3914 "parsing/parser.mly" +# 3918 "parsing/parser.mly" ( Private ) -# 30905 "parsing/parser.ml" +# 30949 "parsing/parser.ml" in -# 3143 "parsing/parser.mly" +# 3147 "parsing/parser.mly" ( (Ptype_abstract, priv, Some ty) ) -# 30910 "parsing/parser.ml" +# 30954 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30929,26 +30973,26 @@ module Tables = struct let _startpos = _startpos_cs_ in let _endpos = _endpos_cs_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3913 "parsing/parser.mly" +# 3917 "parsing/parser.mly" ( Public ) -# 30935 "parsing/parser.ml" +# 30979 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 30941 "parsing/parser.ml" +# 30985 "parsing/parser.ml" in -# 3159 "parsing/parser.mly" +# 3163 "parsing/parser.mly" ( _1 ) -# 30946 "parsing/parser.ml" +# 30990 "parsing/parser.ml" in -# 3147 "parsing/parser.mly" +# 3151 "parsing/parser.mly" ( (Ptype_variant cs, priv, oty) ) -# 30952 "parsing/parser.ml" +# 30996 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30978,26 +31022,26 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos_cs_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3914 "parsing/parser.mly" +# 3918 "parsing/parser.mly" ( Private ) -# 30984 "parsing/parser.ml" +# 31028 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 30990 "parsing/parser.ml" +# 31034 "parsing/parser.ml" in -# 3159 "parsing/parser.mly" +# 3163 "parsing/parser.mly" ( _1 ) -# 30995 "parsing/parser.ml" +# 31039 "parsing/parser.ml" in -# 3147 "parsing/parser.mly" +# 3151 "parsing/parser.mly" ( (Ptype_variant cs, priv, oty) ) -# 31001 "parsing/parser.ml" +# 31045 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31034,33 +31078,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_cs_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3913 "parsing/parser.mly" +# 3917 "parsing/parser.mly" ( Public ) -# 31040 "parsing/parser.ml" +# 31084 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 31047 "parsing/parser.ml" +# 31091 "parsing/parser.ml" in # 126 "" ( Some x ) -# 31052 "parsing/parser.ml" +# 31096 "parsing/parser.ml" in -# 3159 "parsing/parser.mly" +# 3163 "parsing/parser.mly" ( _1 ) -# 31058 "parsing/parser.ml" +# 31102 "parsing/parser.ml" in -# 3147 "parsing/parser.mly" +# 3151 "parsing/parser.mly" ( (Ptype_variant cs, priv, oty) ) -# 31064 "parsing/parser.ml" +# 31108 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31104,33 +31148,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_cs_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3914 "parsing/parser.mly" +# 3918 "parsing/parser.mly" ( Private ) -# 31110 "parsing/parser.ml" +# 31154 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 31117 "parsing/parser.ml" +# 31161 "parsing/parser.ml" in # 126 "" ( Some x ) -# 31122 "parsing/parser.ml" +# 31166 "parsing/parser.ml" in -# 3159 "parsing/parser.mly" +# 3163 "parsing/parser.mly" ( _1 ) -# 31128 "parsing/parser.ml" +# 31172 "parsing/parser.ml" in -# 3147 "parsing/parser.mly" +# 3151 "parsing/parser.mly" ( (Ptype_variant cs, priv, oty) ) -# 31134 "parsing/parser.ml" +# 31178 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31153,26 +31197,26 @@ module Tables = struct let _startpos = _startpos__3_ in let _endpos = _endpos__3_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3913 "parsing/parser.mly" +# 3917 "parsing/parser.mly" ( Public ) -# 31159 "parsing/parser.ml" +# 31203 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 31165 "parsing/parser.ml" +# 31209 "parsing/parser.ml" in -# 3159 "parsing/parser.mly" +# 3163 "parsing/parser.mly" ( _1 ) -# 31170 "parsing/parser.ml" +# 31214 "parsing/parser.ml" in -# 3151 "parsing/parser.mly" +# 3155 "parsing/parser.mly" ( (Ptype_open, priv, oty) ) -# 31176 "parsing/parser.ml" +# 31220 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31202,26 +31246,26 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3914 "parsing/parser.mly" +# 3918 "parsing/parser.mly" ( Private ) -# 31208 "parsing/parser.ml" +# 31252 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 31214 "parsing/parser.ml" +# 31258 "parsing/parser.ml" in -# 3159 "parsing/parser.mly" +# 3163 "parsing/parser.mly" ( _1 ) -# 31219 "parsing/parser.ml" +# 31263 "parsing/parser.ml" in -# 3151 "parsing/parser.mly" +# 3155 "parsing/parser.mly" ( (Ptype_open, priv, oty) ) -# 31225 "parsing/parser.ml" +# 31269 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31258,33 +31302,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos__3_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3913 "parsing/parser.mly" +# 3917 "parsing/parser.mly" ( Public ) -# 31264 "parsing/parser.ml" +# 31308 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 31271 "parsing/parser.ml" +# 31315 "parsing/parser.ml" in # 126 "" ( Some x ) -# 31276 "parsing/parser.ml" +# 31320 "parsing/parser.ml" in -# 3159 "parsing/parser.mly" +# 3163 "parsing/parser.mly" ( _1 ) -# 31282 "parsing/parser.ml" +# 31326 "parsing/parser.ml" in -# 3151 "parsing/parser.mly" +# 3155 "parsing/parser.mly" ( (Ptype_open, priv, oty) ) -# 31288 "parsing/parser.ml" +# 31332 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31328,33 +31372,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos__3_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3914 "parsing/parser.mly" +# 3918 "parsing/parser.mly" ( Private ) -# 31334 "parsing/parser.ml" +# 31378 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 31341 "parsing/parser.ml" +# 31385 "parsing/parser.ml" in # 126 "" ( Some x ) -# 31346 "parsing/parser.ml" +# 31390 "parsing/parser.ml" in -# 3159 "parsing/parser.mly" +# 3163 "parsing/parser.mly" ( _1 ) -# 31352 "parsing/parser.ml" +# 31396 "parsing/parser.ml" in -# 3151 "parsing/parser.mly" +# 3155 "parsing/parser.mly" ( (Ptype_open, priv, oty) ) -# 31358 "parsing/parser.ml" +# 31402 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31391,26 +31435,26 @@ module Tables = struct let _startpos = _startpos__3_ in let _endpos = _endpos__5_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3913 "parsing/parser.mly" +# 3917 "parsing/parser.mly" ( Public ) -# 31397 "parsing/parser.ml" +# 31441 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 31403 "parsing/parser.ml" +# 31447 "parsing/parser.ml" in -# 3159 "parsing/parser.mly" +# 3163 "parsing/parser.mly" ( _1 ) -# 31408 "parsing/parser.ml" +# 31452 "parsing/parser.ml" in -# 3155 "parsing/parser.mly" +# 3159 "parsing/parser.mly" ( (Ptype_record ls, priv, oty) ) -# 31414 "parsing/parser.ml" +# 31458 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31454,26 +31498,26 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3914 "parsing/parser.mly" +# 3918 "parsing/parser.mly" ( Private ) -# 31460 "parsing/parser.ml" +# 31504 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 31466 "parsing/parser.ml" +# 31510 "parsing/parser.ml" in -# 3159 "parsing/parser.mly" +# 3163 "parsing/parser.mly" ( _1 ) -# 31471 "parsing/parser.ml" +# 31515 "parsing/parser.ml" in -# 3155 "parsing/parser.mly" +# 3159 "parsing/parser.mly" ( (Ptype_record ls, priv, oty) ) -# 31477 "parsing/parser.ml" +# 31521 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31524,33 +31568,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos__5_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3913 "parsing/parser.mly" +# 3917 "parsing/parser.mly" ( Public ) -# 31530 "parsing/parser.ml" +# 31574 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 31537 "parsing/parser.ml" +# 31581 "parsing/parser.ml" in # 126 "" ( Some x ) -# 31542 "parsing/parser.ml" +# 31586 "parsing/parser.ml" in -# 3159 "parsing/parser.mly" +# 3163 "parsing/parser.mly" ( _1 ) -# 31548 "parsing/parser.ml" +# 31592 "parsing/parser.ml" in -# 3155 "parsing/parser.mly" +# 3159 "parsing/parser.mly" ( (Ptype_record ls, priv, oty) ) -# 31554 "parsing/parser.ml" +# 31598 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31608,33 +31652,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos__5_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3914 "parsing/parser.mly" +# 3918 "parsing/parser.mly" ( Private ) -# 31614 "parsing/parser.ml" +# 31658 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 31621 "parsing/parser.ml" +# 31665 "parsing/parser.ml" in # 126 "" ( Some x ) -# 31626 "parsing/parser.ml" +# 31670 "parsing/parser.ml" in -# 3159 "parsing/parser.mly" +# 3163 "parsing/parser.mly" ( _1 ) -# 31632 "parsing/parser.ml" +# 31676 "parsing/parser.ml" in -# 3155 "parsing/parser.mly" +# 3159 "parsing/parser.mly" ( (Ptype_record ls, priv, oty) ) -# 31638 "parsing/parser.ml" +# 31682 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31672,24 +31716,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3577 "parsing/parser.mly" +# 3581 "parsing/parser.mly" ( let (f, c) = meth_list in Ptyp_object (f, c) ) -# 31678 "parsing/parser.ml" +# 31722 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 31687 "parsing/parser.ml" +# 31731 "parsing/parser.ml" in -# 3581 "parsing/parser.mly" +# 3585 "parsing/parser.mly" ( _1 ) -# 31693 "parsing/parser.ml" +# 31737 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31720,24 +31764,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3579 "parsing/parser.mly" +# 3583 "parsing/parser.mly" ( Ptyp_object ([], Closed) ) -# 31726 "parsing/parser.ml" +# 31770 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 31735 "parsing/parser.ml" +# 31779 "parsing/parser.ml" in -# 3581 "parsing/parser.mly" +# 3585 "parsing/parser.mly" ( _1 ) -# 31741 "parsing/parser.ml" +# 31785 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31790,37 +31834,37 @@ module Tables = struct let _v : (Parsetree.open_declaration * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined2 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 31796 "parsing/parser.ml" +# 31840 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 31805 "parsing/parser.ml" +# 31849 "parsing/parser.ml" in let override = -# 3960 "parsing/parser.mly" +# 3964 "parsing/parser.mly" ( Fresh ) -# 31811 "parsing/parser.ml" +# 31855 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1652 "parsing/parser.mly" +# 1656 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Opn.mk me ~override ~attrs ~loc ~docs, ext ) -# 31824 "parsing/parser.ml" +# 31868 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31880,37 +31924,37 @@ module Tables = struct let _v : (Parsetree.open_declaration * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 31886 "parsing/parser.ml" +# 31930 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let attrs1 = let _1 = _1_inlined2 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 31895 "parsing/parser.ml" +# 31939 "parsing/parser.ml" in let override = -# 3961 "parsing/parser.mly" +# 3965 "parsing/parser.mly" ( Override ) -# 31901 "parsing/parser.ml" +# 31945 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1652 "parsing/parser.mly" +# 1656 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Opn.mk me ~override ~attrs ~loc ~docs, ext ) -# 31914 "parsing/parser.ml" +# 31958 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31963,9 +32007,9 @@ module Tables = struct let _v : (Parsetree.open_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 31969 "parsing/parser.ml" +# 32013 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -31975,36 +32019,36 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31981 "parsing/parser.ml" +# 32025 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 31989 "parsing/parser.ml" +# 32033 "parsing/parser.ml" in let override = -# 3960 "parsing/parser.mly" +# 3964 "parsing/parser.mly" ( Fresh ) -# 31995 "parsing/parser.ml" +# 32039 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1667 "parsing/parser.mly" +# 1671 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Opn.mk id ~override ~attrs ~loc ~docs, ext ) -# 32008 "parsing/parser.ml" +# 32052 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32064,9 +32108,9 @@ module Tables = struct let _v : (Parsetree.open_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined4 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 32070 "parsing/parser.ml" +# 32114 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -32076,36 +32120,36 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 32082 "parsing/parser.ml" +# 32126 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined2 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 32090 "parsing/parser.ml" +# 32134 "parsing/parser.ml" in let override = -# 3961 "parsing/parser.mly" +# 3965 "parsing/parser.mly" ( Override ) -# 32096 "parsing/parser.ml" +# 32140 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1667 "parsing/parser.mly" +# 1671 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Opn.mk id ~override ~attrs ~loc ~docs, ext ) -# 32109 "parsing/parser.ml" +# 32153 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32124,17 +32168,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 798 "parsing/parser.mly" +# 802 "parsing/parser.mly" (string) -# 32130 "parsing/parser.ml" +# 32174 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3752 "parsing/parser.mly" +# 3756 "parsing/parser.mly" ( _1 ) -# 32138 "parsing/parser.ml" +# 32182 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32153,17 +32197,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 756 "parsing/parser.mly" +# 760 "parsing/parser.mly" (string) -# 32159 "parsing/parser.ml" +# 32203 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3753 "parsing/parser.mly" +# 3757 "parsing/parser.mly" ( _1 ) -# 32167 "parsing/parser.ml" +# 32211 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32182,17 +32226,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 757 "parsing/parser.mly" +# 761 "parsing/parser.mly" (string) -# 32188 "parsing/parser.ml" +# 32232 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3754 "parsing/parser.mly" +# 3758 "parsing/parser.mly" ( _1 ) -# 32196 "parsing/parser.ml" +# 32240 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32232,17 +32276,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 32238 "parsing/parser.ml" +# 32282 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Asttypes.label) = -# 3755 "parsing/parser.mly" +# 3759 "parsing/parser.mly" ( "."^ _1 ^"(" ^ _3 ^ ")" ) -# 32246 "parsing/parser.ml" +# 32290 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32289,17 +32333,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 32295 "parsing/parser.ml" +# 32339 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Asttypes.label) = -# 3756 "parsing/parser.mly" +# 3760 "parsing/parser.mly" ( "."^ _1 ^ "(" ^ _3 ^ ")<-" ) -# 32303 "parsing/parser.ml" +# 32347 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32339,17 +32383,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 32345 "parsing/parser.ml" +# 32389 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Asttypes.label) = -# 3757 "parsing/parser.mly" +# 3761 "parsing/parser.mly" ( "."^ _1 ^"[" ^ _3 ^ "]" ) -# 32353 "parsing/parser.ml" +# 32397 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32396,17 +32440,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 32402 "parsing/parser.ml" +# 32446 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Asttypes.label) = -# 3758 "parsing/parser.mly" +# 3762 "parsing/parser.mly" ( "."^ _1 ^ "[" ^ _3 ^ "]<-" ) -# 32410 "parsing/parser.ml" +# 32454 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32446,17 +32490,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 32452 "parsing/parser.ml" +# 32496 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Asttypes.label) = -# 3759 "parsing/parser.mly" +# 3763 "parsing/parser.mly" ( "."^ _1 ^"{" ^ _3 ^ "}" ) -# 32460 "parsing/parser.ml" +# 32504 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32503,17 +32547,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 32509 "parsing/parser.ml" +# 32553 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Asttypes.label) = -# 3760 "parsing/parser.mly" +# 3764 "parsing/parser.mly" ( "."^ _1 ^ "{" ^ _3 ^ "}<-" ) -# 32517 "parsing/parser.ml" +# 32561 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32532,17 +32576,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 809 "parsing/parser.mly" +# 813 "parsing/parser.mly" (string) -# 32538 "parsing/parser.ml" +# 32582 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3761 "parsing/parser.mly" +# 3765 "parsing/parser.mly" ( _1 ) -# 32546 "parsing/parser.ml" +# 32590 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32565,9 +32609,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3762 "parsing/parser.mly" +# 3766 "parsing/parser.mly" ( "!" ) -# 32571 "parsing/parser.ml" +# 32615 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32586,22 +32630,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 750 "parsing/parser.mly" +# 754 "parsing/parser.mly" (string) -# 32592 "parsing/parser.ml" +# 32636 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3766 "parsing/parser.mly" +# 3770 "parsing/parser.mly" ( op ) -# 32600 "parsing/parser.ml" +# 32644 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32605 "parsing/parser.ml" +# 32649 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32620,22 +32664,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 751 "parsing/parser.mly" +# 755 "parsing/parser.mly" (string) -# 32626 "parsing/parser.ml" +# 32670 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3767 "parsing/parser.mly" +# 3771 "parsing/parser.mly" ( op ) -# 32634 "parsing/parser.ml" +# 32678 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32639 "parsing/parser.ml" +# 32683 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32654,22 +32698,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 752 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 32660 "parsing/parser.ml" +# 32704 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3768 "parsing/parser.mly" +# 3772 "parsing/parser.mly" ( op ) -# 32668 "parsing/parser.ml" +# 32712 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32673 "parsing/parser.ml" +# 32717 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32688,22 +32732,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 753 "parsing/parser.mly" +# 757 "parsing/parser.mly" (string) -# 32694 "parsing/parser.ml" +# 32738 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3769 "parsing/parser.mly" +# 3773 "parsing/parser.mly" ( op ) -# 32702 "parsing/parser.ml" +# 32746 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32707 "parsing/parser.ml" +# 32751 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32722,22 +32766,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 754 "parsing/parser.mly" +# 758 "parsing/parser.mly" (string) -# 32728 "parsing/parser.ml" +# 32772 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3770 "parsing/parser.mly" +# 3774 "parsing/parser.mly" ( op ) -# 32736 "parsing/parser.ml" +# 32780 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32741 "parsing/parser.ml" +# 32785 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32760,14 +32804,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3771 "parsing/parser.mly" +# 3775 "parsing/parser.mly" ("+") -# 32766 "parsing/parser.ml" +# 32810 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32771 "parsing/parser.ml" +# 32815 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32790,14 +32834,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3772 "parsing/parser.mly" +# 3776 "parsing/parser.mly" ("+.") -# 32796 "parsing/parser.ml" +# 32840 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32801 "parsing/parser.ml" +# 32845 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32820,14 +32864,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3773 "parsing/parser.mly" +# 3777 "parsing/parser.mly" ("+=") -# 32826 "parsing/parser.ml" +# 32870 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32831 "parsing/parser.ml" +# 32875 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32850,14 +32894,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3774 "parsing/parser.mly" +# 3778 "parsing/parser.mly" ("-") -# 32856 "parsing/parser.ml" +# 32900 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32861 "parsing/parser.ml" +# 32905 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32880,14 +32924,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3775 "parsing/parser.mly" +# 3779 "parsing/parser.mly" ("-.") -# 32886 "parsing/parser.ml" +# 32930 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32891 "parsing/parser.ml" +# 32935 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32910,14 +32954,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3776 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ("*") -# 32916 "parsing/parser.ml" +# 32960 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32921 "parsing/parser.ml" +# 32965 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32940,14 +32984,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3777 "parsing/parser.mly" +# 3781 "parsing/parser.mly" ("%") -# 32946 "parsing/parser.ml" +# 32990 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32951 "parsing/parser.ml" +# 32995 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32970,14 +33014,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3778 "parsing/parser.mly" +# 3782 "parsing/parser.mly" ("=") -# 32976 "parsing/parser.ml" +# 33020 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 32981 "parsing/parser.ml" +# 33025 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33000,14 +33044,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3779 "parsing/parser.mly" +# 3783 "parsing/parser.mly" ("<") -# 33006 "parsing/parser.ml" +# 33050 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 33011 "parsing/parser.ml" +# 33055 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33030,14 +33074,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3780 "parsing/parser.mly" +# 3784 "parsing/parser.mly" (">") -# 33036 "parsing/parser.ml" +# 33080 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 33041 "parsing/parser.ml" +# 33085 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33060,14 +33104,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3781 "parsing/parser.mly" +# 3785 "parsing/parser.mly" ("or") -# 33066 "parsing/parser.ml" +# 33110 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 33071 "parsing/parser.ml" +# 33115 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33090,14 +33134,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3782 "parsing/parser.mly" +# 3786 "parsing/parser.mly" ("||") -# 33096 "parsing/parser.ml" +# 33140 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 33101 "parsing/parser.ml" +# 33145 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33120,14 +33164,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3783 "parsing/parser.mly" +# 3787 "parsing/parser.mly" ("&") -# 33126 "parsing/parser.ml" +# 33170 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 33131 "parsing/parser.ml" +# 33175 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33150,14 +33194,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3784 "parsing/parser.mly" +# 3788 "parsing/parser.mly" ("&&") -# 33156 "parsing/parser.ml" +# 33200 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 33161 "parsing/parser.ml" +# 33205 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33180,14 +33224,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3785 "parsing/parser.mly" +# 3789 "parsing/parser.mly" (":=") -# 33186 "parsing/parser.ml" +# 33230 "parsing/parser.ml" in -# 3763 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( _1 ) -# 33191 "parsing/parser.ml" +# 33235 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33210,9 +33254,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (bool) = -# 3667 "parsing/parser.mly" +# 3671 "parsing/parser.mly" ( true ) -# 33216 "parsing/parser.ml" +# 33260 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33228,9 +33272,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (bool) = -# 3668 "parsing/parser.mly" +# 3672 "parsing/parser.mly" ( false ) -# 33234 "parsing/parser.ml" +# 33278 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33248,7 +33292,7 @@ module Tables = struct let _v : (unit option) = # 114 "" ( None ) -# 33252 "parsing/parser.ml" +# 33296 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33273,7 +33317,7 @@ module Tables = struct let _v : (unit option) = # 116 "" ( Some x ) -# 33277 "parsing/parser.ml" +# 33321 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33291,7 +33335,7 @@ module Tables = struct let _v : (unit option) = # 114 "" ( None ) -# 33295 "parsing/parser.ml" +# 33339 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33316,7 +33360,7 @@ module Tables = struct let _v : (unit option) = # 116 "" ( Some x ) -# 33320 "parsing/parser.ml" +# 33364 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33334,7 +33378,7 @@ module Tables = struct let _v : (string Asttypes.loc option) = # 114 "" ( None ) -# 33338 "parsing/parser.ml" +# 33382 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33359,9 +33403,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 33365 "parsing/parser.ml" +# 33409 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -33374,21 +33418,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 33380 "parsing/parser.ml" +# 33424 "parsing/parser.ml" in # 183 "" ( x ) -# 33386 "parsing/parser.ml" +# 33430 "parsing/parser.ml" in # 116 "" ( Some x ) -# 33392 "parsing/parser.ml" +# 33436 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33406,7 +33450,7 @@ module Tables = struct let _v : (Parsetree.core_type option) = # 114 "" ( None ) -# 33410 "parsing/parser.ml" +# 33454 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33438,12 +33482,12 @@ module Tables = struct let _v : (Parsetree.core_type option) = let x = # 183 "" ( x ) -# 33442 "parsing/parser.ml" +# 33486 "parsing/parser.ml" in # 116 "" ( Some x ) -# 33447 "parsing/parser.ml" +# 33491 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33461,7 +33505,7 @@ module Tables = struct let _v : (Parsetree.core_type option) = # 114 "" ( None ) -# 33465 "parsing/parser.ml" +# 33509 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33493,12 +33537,12 @@ module Tables = struct let _v : (Parsetree.core_type option) = let x = # 183 "" ( x ) -# 33497 "parsing/parser.ml" +# 33541 "parsing/parser.ml" in # 116 "" ( Some x ) -# 33502 "parsing/parser.ml" +# 33546 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33516,7 +33560,7 @@ module Tables = struct let _v : (Parsetree.expression option) = # 114 "" ( None ) -# 33520 "parsing/parser.ml" +# 33564 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33549,26 +33593,26 @@ module Tables = struct let x = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 33555 "parsing/parser.ml" +# 33599 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 33560 "parsing/parser.ml" +# 33604 "parsing/parser.ml" in # 183 "" ( x ) -# 33566 "parsing/parser.ml" +# 33610 "parsing/parser.ml" in # 116 "" ( Some x ) -# 33572 "parsing/parser.ml" +# 33616 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33627,18 +33671,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 33631 "parsing/parser.ml" +# 33675 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 33636 "parsing/parser.ml" +# 33680 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 33642 "parsing/parser.ml" +# 33686 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -33647,22 +33691,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 33653 "parsing/parser.ml" +# 33697 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 33659 "parsing/parser.ml" +# 33703 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -33675,25 +33719,25 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 33679 "parsing/parser.ml" +# 33723 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 33685 "parsing/parser.ml" +# 33729 "parsing/parser.ml" in # 183 "" ( x ) -# 33691 "parsing/parser.ml" +# 33735 "parsing/parser.ml" in # 116 "" ( Some x ) -# 33697 "parsing/parser.ml" +# 33741 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33711,7 +33755,7 @@ module Tables = struct let _v : (Parsetree.module_type option) = # 114 "" ( None ) -# 33715 "parsing/parser.ml" +# 33759 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33743,12 +33787,12 @@ module Tables = struct let _v : (Parsetree.module_type option) = let x = # 183 "" ( x ) -# 33747 "parsing/parser.ml" +# 33791 "parsing/parser.ml" in # 116 "" ( Some x ) -# 33752 "parsing/parser.ml" +# 33796 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33766,7 +33810,7 @@ module Tables = struct let _v : (Parsetree.pattern option) = # 114 "" ( None ) -# 33770 "parsing/parser.ml" +# 33814 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33798,12 +33842,12 @@ module Tables = struct let _v : (Parsetree.pattern option) = let x = # 183 "" ( x ) -# 33802 "parsing/parser.ml" +# 33846 "parsing/parser.ml" in # 116 "" ( Some x ) -# 33807 "parsing/parser.ml" +# 33851 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33821,7 +33865,7 @@ module Tables = struct let _v : (Parsetree.expression option) = # 114 "" ( None ) -# 33825 "parsing/parser.ml" +# 33869 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33853,12 +33897,12 @@ module Tables = struct let _v : (Parsetree.expression option) = let x = # 183 "" ( x ) -# 33857 "parsing/parser.ml" +# 33901 "parsing/parser.ml" in # 116 "" ( Some x ) -# 33862 "parsing/parser.ml" +# 33906 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33876,7 +33920,7 @@ module Tables = struct let _v : (Parsetree.type_constraint option) = # 114 "" ( None ) -# 33880 "parsing/parser.ml" +# 33924 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33901,7 +33945,7 @@ module Tables = struct let _v : (Parsetree.type_constraint option) = # 116 "" ( Some x ) -# 33905 "parsing/parser.ml" +# 33949 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33920,17 +33964,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 791 "parsing/parser.mly" +# 795 "parsing/parser.mly" (string) -# 33926 "parsing/parser.ml" +# 33970 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3972 "parsing/parser.mly" +# 3976 "parsing/parser.mly" ( _1 ) -# 33934 "parsing/parser.ml" +# 33978 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33962,18 +34006,18 @@ module Tables = struct } = _menhir_stack in let _3 : unit = Obj.magic _3 in let _2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 33968 "parsing/parser.ml" +# 34012 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (string) = -# 3973 "parsing/parser.mly" +# 3977 "parsing/parser.mly" ( _2 ) -# 33977 "parsing/parser.ml" +# 34021 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34027,9 +34071,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1429 "parsing/parser.mly" +# 1433 "parsing/parser.mly" ( mkmod ~loc:_sloc (Pmod_constraint(me, mty)) ) -# 34033 "parsing/parser.ml" +# 34077 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34082,9 +34126,9 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1431 "parsing/parser.mly" +# 1435 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 34088 "parsing/parser.ml" +# 34132 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34121,9 +34165,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.module_expr) = -# 1434 "parsing/parser.mly" +# 1438 "parsing/parser.mly" ( me (* TODO consider reloc *) ) -# 34127 "parsing/parser.ml" +# 34171 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34162,9 +34206,9 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1436 "parsing/parser.mly" +# 1440 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 34168 "parsing/parser.ml" +# 34212 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34218,37 +34262,37 @@ module Tables = struct let _1 = _1_inlined2 in let e = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 34224 "parsing/parser.ml" +# 34268 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 34229 "parsing/parser.ml" +# 34273 "parsing/parser.ml" in -# 1453 "parsing/parser.mly" +# 1457 "parsing/parser.mly" ( e ) -# 34235 "parsing/parser.ml" +# 34279 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 34243 "parsing/parser.ml" +# 34287 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1440 "parsing/parser.mly" +# 1444 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 34252 "parsing/parser.ml" +# 34296 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34328,18 +34372,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 34332 "parsing/parser.ml" +# 34376 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 34337 "parsing/parser.ml" +# 34381 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 34343 "parsing/parser.ml" +# 34387 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -34348,22 +34392,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 34354 "parsing/parser.ml" +# 34398 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 34360 "parsing/parser.ml" +# 34404 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -34376,36 +34420,36 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 34380 "parsing/parser.ml" +# 34424 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 34386 "parsing/parser.ml" +# 34430 "parsing/parser.ml" in -# 1453 "parsing/parser.mly" +# 1457 "parsing/parser.mly" ( e ) -# 34392 "parsing/parser.ml" +# 34436 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 34400 "parsing/parser.ml" +# 34444 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1440 "parsing/parser.mly" +# 1444 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 34409 "parsing/parser.ml" +# 34453 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34477,24 +34521,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 34485 "parsing/parser.ml" +# 34529 "parsing/parser.ml" in let _endpos_ty_ = _endpos__1_inlined1_ in let e = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 34493 "parsing/parser.ml" +# 34537 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 34498 "parsing/parser.ml" +# 34542 "parsing/parser.ml" in let _startpos_e_ = _startpos__1_ in @@ -34502,26 +34546,26 @@ module Tables = struct let _startpos = _startpos_e_ in let _loc = (_startpos, _endpos) in -# 1455 "parsing/parser.mly" +# 1459 "parsing/parser.mly" ( ghexp ~loc:_loc (Pexp_constraint (e, ty)) ) -# 34508 "parsing/parser.ml" +# 34552 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 34516 "parsing/parser.ml" +# 34560 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1440 "parsing/parser.mly" +# 1444 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 34525 "parsing/parser.ml" +# 34569 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34614,11 +34658,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 34622 "parsing/parser.ml" +# 34666 "parsing/parser.ml" in let _endpos_ty_ = _endpos__1_inlined3_ in @@ -34629,18 +34673,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 34633 "parsing/parser.ml" +# 34677 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 34638 "parsing/parser.ml" +# 34682 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 34644 "parsing/parser.ml" +# 34688 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -34649,22 +34693,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 34655 "parsing/parser.ml" +# 34699 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 34661 "parsing/parser.ml" +# 34705 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -34677,13 +34721,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 34681 "parsing/parser.ml" +# 34725 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 34687 "parsing/parser.ml" +# 34731 "parsing/parser.ml" in let _startpos_e_ = _startpos__1_ in @@ -34691,26 +34735,26 @@ module Tables = struct let _startpos = _startpos_e_ in let _loc = (_startpos, _endpos) in -# 1455 "parsing/parser.mly" +# 1459 "parsing/parser.mly" ( ghexp ~loc:_loc (Pexp_constraint (e, ty)) ) -# 34697 "parsing/parser.ml" +# 34741 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 34705 "parsing/parser.ml" +# 34749 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1440 "parsing/parser.mly" +# 1444 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 34714 "parsing/parser.ml" +# 34758 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34796,11 +34840,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 34804 "parsing/parser.ml" +# 34848 "parsing/parser.ml" in let _endpos_ty2_ = _endpos__1_inlined2_ in @@ -34810,23 +34854,23 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 34818 "parsing/parser.ml" +# 34862 "parsing/parser.ml" in let e = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 34825 "parsing/parser.ml" +# 34869 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 34830 "parsing/parser.ml" +# 34874 "parsing/parser.ml" in let _startpos_e_ = _startpos__1_ in @@ -34834,26 +34878,26 @@ module Tables = struct let _startpos = _startpos_e_ in let _loc = (_startpos, _endpos) in -# 1457 "parsing/parser.mly" +# 1461 "parsing/parser.mly" ( ghexp ~loc:_loc (Pexp_coerce (e, Some ty1, ty2)) ) -# 34840 "parsing/parser.ml" +# 34884 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 34848 "parsing/parser.ml" +# 34892 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1440 "parsing/parser.mly" +# 1444 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 34857 "parsing/parser.ml" +# 34901 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34960,11 +35004,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 34968 "parsing/parser.ml" +# 35012 "parsing/parser.ml" in let _endpos_ty2_ = _endpos__1_inlined4_ in @@ -34974,11 +35018,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 34982 "parsing/parser.ml" +# 35026 "parsing/parser.ml" in let e = @@ -34988,18 +35032,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 34992 "parsing/parser.ml" +# 35036 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 34997 "parsing/parser.ml" +# 35041 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 35003 "parsing/parser.ml" +# 35047 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -35008,22 +35052,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 35014 "parsing/parser.ml" +# 35058 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 35020 "parsing/parser.ml" +# 35064 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -35036,13 +35080,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 35040 "parsing/parser.ml" +# 35084 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 35046 "parsing/parser.ml" +# 35090 "parsing/parser.ml" in let _startpos_e_ = _startpos__1_ in @@ -35050,26 +35094,26 @@ module Tables = struct let _startpos = _startpos_e_ in let _loc = (_startpos, _endpos) in -# 1457 "parsing/parser.mly" +# 1461 "parsing/parser.mly" ( ghexp ~loc:_loc (Pexp_coerce (e, Some ty1, ty2)) ) -# 35056 "parsing/parser.ml" +# 35100 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 35064 "parsing/parser.ml" +# 35108 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1440 "parsing/parser.mly" +# 1444 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 35073 "parsing/parser.ml" +# 35117 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35141,24 +35185,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 35149 "parsing/parser.ml" +# 35193 "parsing/parser.ml" in let _endpos_ty2_ = _endpos__1_inlined1_ in let e = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 35157 "parsing/parser.ml" +# 35201 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 35162 "parsing/parser.ml" +# 35206 "parsing/parser.ml" in let _startpos_e_ = _startpos__1_ in @@ -35166,26 +35210,26 @@ module Tables = struct let _startpos = _startpos_e_ in let _loc = (_startpos, _endpos) in -# 1459 "parsing/parser.mly" +# 1463 "parsing/parser.mly" ( ghexp ~loc:_loc (Pexp_coerce (e, None, ty2)) ) -# 35172 "parsing/parser.ml" +# 35216 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 35180 "parsing/parser.ml" +# 35224 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1440 "parsing/parser.mly" +# 1444 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 35189 "parsing/parser.ml" +# 35233 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35278,11 +35322,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 35286 "parsing/parser.ml" +# 35330 "parsing/parser.ml" in let _endpos_ty2_ = _endpos__1_inlined3_ in @@ -35293,18 +35337,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 35297 "parsing/parser.ml" +# 35341 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 35302 "parsing/parser.ml" +# 35346 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 35308 "parsing/parser.ml" +# 35352 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -35313,22 +35357,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 35319 "parsing/parser.ml" +# 35363 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 35325 "parsing/parser.ml" +# 35369 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -35341,13 +35385,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 35345 "parsing/parser.ml" +# 35389 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 35351 "parsing/parser.ml" +# 35395 "parsing/parser.ml" in let _startpos_e_ = _startpos__1_ in @@ -35355,26 +35399,26 @@ module Tables = struct let _startpos = _startpos_e_ in let _loc = (_startpos, _endpos) in -# 1459 "parsing/parser.mly" +# 1463 "parsing/parser.mly" ( ghexp ~loc:_loc (Pexp_coerce (e, None, ty2)) ) -# 35361 "parsing/parser.ml" +# 35405 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 35369 "parsing/parser.ml" +# 35413 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1440 "parsing/parser.mly" +# 1444 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 35378 "parsing/parser.ml" +# 35422 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35434,30 +35478,30 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _4 = let _1 = _1_inlined2 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 35440 "parsing/parser.ml" +# 35484 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 35445 "parsing/parser.ml" +# 35489 "parsing/parser.ml" in let _3 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 35453 "parsing/parser.ml" +# 35497 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1442 "parsing/parser.mly" +# 1446 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 35461 "parsing/parser.ml" +# 35505 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35543,18 +35587,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 35547 "parsing/parser.ml" +# 35591 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 35552 "parsing/parser.ml" +# 35596 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 35558 "parsing/parser.ml" +# 35602 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -35563,22 +35607,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 35569 "parsing/parser.ml" +# 35613 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 35575 "parsing/parser.ml" +# 35619 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -35591,29 +35635,29 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 35595 "parsing/parser.ml" +# 35639 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 35601 "parsing/parser.ml" +# 35645 "parsing/parser.ml" in let _3 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 35609 "parsing/parser.ml" +# 35653 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1442 "parsing/parser.mly" +# 1446 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 35617 "parsing/parser.ml" +# 35661 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35673,30 +35717,30 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _4 = let _1 = _1_inlined2 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 35679 "parsing/parser.ml" +# 35723 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 35684 "parsing/parser.ml" +# 35728 "parsing/parser.ml" in let _3 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 35692 "parsing/parser.ml" +# 35736 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1444 "parsing/parser.mly" +# 1448 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 35700 "parsing/parser.ml" +# 35744 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35782,18 +35826,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 35786 "parsing/parser.ml" +# 35830 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 35791 "parsing/parser.ml" +# 35835 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 35797 "parsing/parser.ml" +# 35841 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -35802,22 +35846,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 35808 "parsing/parser.ml" +# 35852 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 35814 "parsing/parser.ml" +# 35858 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -35830,29 +35874,29 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 35834 "parsing/parser.ml" +# 35878 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 35840 "parsing/parser.ml" +# 35884 "parsing/parser.ml" in let _3 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 35848 "parsing/parser.ml" +# 35892 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1444 "parsing/parser.mly" +# 1448 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 35856 "parsing/parser.ml" +# 35900 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35905,30 +35949,30 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _4 = let _1 = _1_inlined2 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 35911 "parsing/parser.ml" +# 35955 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 35916 "parsing/parser.ml" +# 35960 "parsing/parser.ml" in let _3 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 35924 "parsing/parser.ml" +# 35968 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1446 "parsing/parser.mly" +# 1450 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 35932 "parsing/parser.ml" +# 35976 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36007,18 +36051,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 36011 "parsing/parser.ml" +# 36055 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 36016 "parsing/parser.ml" +# 36060 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 36022 "parsing/parser.ml" +# 36066 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -36027,22 +36071,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 36033 "parsing/parser.ml" +# 36077 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 36039 "parsing/parser.ml" +# 36083 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -36055,29 +36099,29 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 36059 "parsing/parser.ml" +# 36103 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 36065 "parsing/parser.ml" +# 36109 "parsing/parser.ml" in let _3 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 36073 "parsing/parser.ml" +# 36117 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1446 "parsing/parser.mly" +# 1450 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 36081 "parsing/parser.ml" +# 36125 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36107,9 +36151,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Longident.t) = -# 1347 "parsing/parser.mly" +# 1351 "parsing/parser.mly" ( _1 ) -# 36113 "parsing/parser.ml" +# 36157 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36139,9 +36183,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Longident.t) = -# 1332 "parsing/parser.mly" +# 1336 "parsing/parser.mly" ( _1 ) -# 36145 "parsing/parser.ml" +# 36189 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36171,9 +36215,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = -# 1307 "parsing/parser.mly" +# 1311 "parsing/parser.mly" ( _1 ) -# 36177 "parsing/parser.ml" +# 36221 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36203,9 +36247,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 1312 "parsing/parser.mly" +# 1316 "parsing/parser.mly" ( _1 ) -# 36209 "parsing/parser.ml" +# 36253 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36235,9 +36279,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Longident.t) = -# 1337 "parsing/parser.mly" +# 1341 "parsing/parser.mly" ( _1 ) -# 36241 "parsing/parser.ml" +# 36285 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36267,9 +36311,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Longident.t) = -# 1342 "parsing/parser.mly" +# 1346 "parsing/parser.mly" ( _1 ) -# 36273 "parsing/parser.ml" +# 36317 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36299,9 +36343,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.module_expr) = -# 1302 "parsing/parser.mly" +# 1306 "parsing/parser.mly" ( _1 ) -# 36305 "parsing/parser.ml" +# 36349 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36331,9 +36375,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.module_type) = -# 1297 "parsing/parser.mly" +# 1301 "parsing/parser.mly" ( _1 ) -# 36337 "parsing/parser.ml" +# 36381 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36363,9 +36407,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Longident.t) = -# 1322 "parsing/parser.mly" +# 1326 "parsing/parser.mly" ( _1 ) -# 36369 "parsing/parser.ml" +# 36413 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36395,9 +36439,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = -# 1317 "parsing/parser.mly" +# 1321 "parsing/parser.mly" ( _1 ) -# 36401 "parsing/parser.ml" +# 36445 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36427,9 +36471,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Longident.t) = -# 1327 "parsing/parser.mly" +# 1331 "parsing/parser.mly" ( _1 ) -# 36433 "parsing/parser.ml" +# 36477 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36471,15 +36515,15 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in -# 2872 "parsing/parser.mly" +# 2876 "parsing/parser.mly" ( mkpat_cons ~loc:_sloc _loc__2_ (ghpat ~loc:_sloc (Ppat_tuple[_1;_3])) ) -# 36477 "parsing/parser.ml" +# 36521 "parsing/parser.ml" in -# 2860 "parsing/parser.mly" +# 2864 "parsing/parser.mly" ( _1 ) -# 36483 "parsing/parser.ml" +# 36527 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36509,14 +36553,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = let _1 = -# 2874 "parsing/parser.mly" +# 2878 "parsing/parser.mly" ( Pat.attr _1 _2 ) -# 36515 "parsing/parser.ml" +# 36559 "parsing/parser.ml" in -# 2860 "parsing/parser.mly" +# 2864 "parsing/parser.mly" ( _1 ) -# 36520 "parsing/parser.ml" +# 36564 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36539,14 +36583,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = -# 2876 "parsing/parser.mly" +# 2880 "parsing/parser.mly" ( _1 ) -# 36545 "parsing/parser.ml" +# 36589 "parsing/parser.ml" in -# 2860 "parsing/parser.mly" +# 2864 "parsing/parser.mly" ( _1 ) -# 36550 "parsing/parser.ml" +# 36594 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36591,15 +36635,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 36597 "parsing/parser.ml" +# 36641 "parsing/parser.ml" in -# 2879 "parsing/parser.mly" +# 2883 "parsing/parser.mly" ( Ppat_alias(_1, _3) ) -# 36603 "parsing/parser.ml" +# 36647 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -36607,21 +36651,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 36613 "parsing/parser.ml" +# 36657 "parsing/parser.ml" in -# 2890 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _1 ) -# 36619 "parsing/parser.ml" +# 36663 "parsing/parser.ml" in -# 2860 "parsing/parser.mly" +# 2864 "parsing/parser.mly" ( _1 ) -# 36625 "parsing/parser.ml" +# 36669 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36662,9 +36706,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2881 "parsing/parser.mly" +# 2885 "parsing/parser.mly" ( expecting _loc__3_ "identifier" ) -# 36668 "parsing/parser.ml" +# 36712 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -36672,21 +36716,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 36678 "parsing/parser.ml" +# 36722 "parsing/parser.ml" in -# 2890 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _1 ) -# 36684 "parsing/parser.ml" +# 36728 "parsing/parser.ml" in -# 2860 "parsing/parser.mly" +# 2864 "parsing/parser.mly" ( _1 ) -# 36690 "parsing/parser.ml" +# 36734 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36711,29 +36755,29 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _1 = -# 2883 "parsing/parser.mly" +# 2887 "parsing/parser.mly" ( Ppat_tuple(List.rev _1) ) -# 36717 "parsing/parser.ml" +# 36761 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 36725 "parsing/parser.ml" +# 36769 "parsing/parser.ml" in -# 2890 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _1 ) -# 36731 "parsing/parser.ml" +# 36775 "parsing/parser.ml" in -# 2860 "parsing/parser.mly" +# 2864 "parsing/parser.mly" ( _1 ) -# 36737 "parsing/parser.ml" +# 36781 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36774,9 +36818,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2885 "parsing/parser.mly" +# 2889 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 36780 "parsing/parser.ml" +# 36824 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -36784,21 +36828,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 36790 "parsing/parser.ml" +# 36834 "parsing/parser.ml" in -# 2890 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _1 ) -# 36796 "parsing/parser.ml" +# 36840 "parsing/parser.ml" in -# 2860 "parsing/parser.mly" +# 2864 "parsing/parser.mly" ( _1 ) -# 36802 "parsing/parser.ml" +# 36846 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36837,30 +36881,30 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _1 = -# 2887 "parsing/parser.mly" +# 2891 "parsing/parser.mly" ( Ppat_or(_1, _3) ) -# 36843 "parsing/parser.ml" +# 36887 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 36852 "parsing/parser.ml" +# 36896 "parsing/parser.ml" in -# 2890 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _1 ) -# 36858 "parsing/parser.ml" +# 36902 "parsing/parser.ml" in -# 2860 "parsing/parser.mly" +# 2864 "parsing/parser.mly" ( _1 ) -# 36864 "parsing/parser.ml" +# 36908 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36901,9 +36945,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2889 "parsing/parser.mly" +# 2893 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 36907 "parsing/parser.ml" +# 36951 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -36911,21 +36955,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 36917 "parsing/parser.ml" +# 36961 "parsing/parser.ml" in -# 2890 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _1 ) -# 36923 "parsing/parser.ml" +# 36967 "parsing/parser.ml" in -# 2860 "parsing/parser.mly" +# 2864 "parsing/parser.mly" ( _1 ) -# 36929 "parsing/parser.ml" +# 36973 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36973,24 +37017,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 36979 "parsing/parser.ml" +# 37023 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 36985 "parsing/parser.ml" +# 37029 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2862 "parsing/parser.mly" +# 2866 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_exception _3) _2) -# 36994 "parsing/parser.ml" +# 37038 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37027,9 +37071,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = -# 2989 "parsing/parser.mly" +# 2993 "parsing/parser.mly" ( _3 :: _1 ) -# 37033 "parsing/parser.ml" +# 37077 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37066,9 +37110,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = -# 2990 "parsing/parser.mly" +# 2994 "parsing/parser.mly" ( [_3; _1] ) -# 37072 "parsing/parser.ml" +# 37116 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37106,9 +37150,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2991 "parsing/parser.mly" +# 2995 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 37112 "parsing/parser.ml" +# 37156 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37145,9 +37189,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = -# 2989 "parsing/parser.mly" +# 2993 "parsing/parser.mly" ( _3 :: _1 ) -# 37151 "parsing/parser.ml" +# 37195 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37184,9 +37228,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = -# 2990 "parsing/parser.mly" +# 2994 "parsing/parser.mly" ( [_3; _1] ) -# 37190 "parsing/parser.ml" +# 37234 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37224,9 +37268,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2991 "parsing/parser.mly" +# 2995 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 37230 "parsing/parser.ml" +# 37274 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37249,9 +37293,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2895 "parsing/parser.mly" +# 2899 "parsing/parser.mly" ( _1 ) -# 37255 "parsing/parser.ml" +# 37299 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37287,15 +37331,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37293 "parsing/parser.ml" +# 37337 "parsing/parser.ml" in -# 2898 "parsing/parser.mly" +# 2902 "parsing/parser.mly" ( Ppat_construct(_1, Some ([], _2)) ) -# 37299 "parsing/parser.ml" +# 37343 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -37303,15 +37347,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 37309 "parsing/parser.ml" +# 37353 "parsing/parser.ml" in -# 2904 "parsing/parser.mly" +# 2908 "parsing/parser.mly" ( _1 ) -# 37315 "parsing/parser.ml" +# 37359 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37371,24 +37415,24 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let newtypes = -# 2633 "parsing/parser.mly" +# 2637 "parsing/parser.mly" ( xs ) -# 37377 "parsing/parser.ml" +# 37421 "parsing/parser.ml" in let constr = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37386 "parsing/parser.ml" +# 37430 "parsing/parser.ml" in -# 2901 "parsing/parser.mly" +# 2905 "parsing/parser.mly" ( Ppat_construct(constr, Some (newtypes, pat)) ) -# 37392 "parsing/parser.ml" +# 37436 "parsing/parser.ml" in let _endpos__1_ = _endpos_pat_ in @@ -37396,15 +37440,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 37402 "parsing/parser.ml" +# 37446 "parsing/parser.ml" in -# 2904 "parsing/parser.mly" +# 2908 "parsing/parser.mly" ( _1 ) -# 37408 "parsing/parser.ml" +# 37452 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37435,24 +37479,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2903 "parsing/parser.mly" +# 2907 "parsing/parser.mly" ( Ppat_variant(_1, Some _2) ) -# 37441 "parsing/parser.ml" +# 37485 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 37450 "parsing/parser.ml" +# 37494 "parsing/parser.ml" in -# 2904 "parsing/parser.mly" +# 2908 "parsing/parser.mly" ( _1 ) -# 37456 "parsing/parser.ml" +# 37500 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37500,24 +37544,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 37506 "parsing/parser.ml" +# 37550 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 37512 "parsing/parser.ml" +# 37556 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2906 "parsing/parser.mly" +# 2910 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_lazy _3) _2) -# 37521 "parsing/parser.ml" +# 37565 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37559,15 +37603,15 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in -# 2872 "parsing/parser.mly" +# 2876 "parsing/parser.mly" ( mkpat_cons ~loc:_sloc _loc__2_ (ghpat ~loc:_sloc (Ppat_tuple[_1;_3])) ) -# 37565 "parsing/parser.ml" +# 37609 "parsing/parser.ml" in -# 2867 "parsing/parser.mly" +# 2871 "parsing/parser.mly" ( _1 ) -# 37571 "parsing/parser.ml" +# 37615 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37597,14 +37641,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = let _1 = -# 2874 "parsing/parser.mly" +# 2878 "parsing/parser.mly" ( Pat.attr _1 _2 ) -# 37603 "parsing/parser.ml" +# 37647 "parsing/parser.ml" in -# 2867 "parsing/parser.mly" +# 2871 "parsing/parser.mly" ( _1 ) -# 37608 "parsing/parser.ml" +# 37652 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37627,14 +37671,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = -# 2876 "parsing/parser.mly" +# 2880 "parsing/parser.mly" ( _1 ) -# 37633 "parsing/parser.ml" +# 37677 "parsing/parser.ml" in -# 2867 "parsing/parser.mly" +# 2871 "parsing/parser.mly" ( _1 ) -# 37638 "parsing/parser.ml" +# 37682 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37679,15 +37723,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37685 "parsing/parser.ml" +# 37729 "parsing/parser.ml" in -# 2879 "parsing/parser.mly" +# 2883 "parsing/parser.mly" ( Ppat_alias(_1, _3) ) -# 37691 "parsing/parser.ml" +# 37735 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -37695,21 +37739,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 37701 "parsing/parser.ml" +# 37745 "parsing/parser.ml" in -# 2890 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _1 ) -# 37707 "parsing/parser.ml" +# 37751 "parsing/parser.ml" in -# 2867 "parsing/parser.mly" +# 2871 "parsing/parser.mly" ( _1 ) -# 37713 "parsing/parser.ml" +# 37757 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37750,9 +37794,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2881 "parsing/parser.mly" +# 2885 "parsing/parser.mly" ( expecting _loc__3_ "identifier" ) -# 37756 "parsing/parser.ml" +# 37800 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -37760,21 +37804,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 37766 "parsing/parser.ml" +# 37810 "parsing/parser.ml" in -# 2890 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _1 ) -# 37772 "parsing/parser.ml" +# 37816 "parsing/parser.ml" in -# 2867 "parsing/parser.mly" +# 2871 "parsing/parser.mly" ( _1 ) -# 37778 "parsing/parser.ml" +# 37822 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37799,29 +37843,29 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _1 = -# 2883 "parsing/parser.mly" +# 2887 "parsing/parser.mly" ( Ppat_tuple(List.rev _1) ) -# 37805 "parsing/parser.ml" +# 37849 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 37813 "parsing/parser.ml" +# 37857 "parsing/parser.ml" in -# 2890 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _1 ) -# 37819 "parsing/parser.ml" +# 37863 "parsing/parser.ml" in -# 2867 "parsing/parser.mly" +# 2871 "parsing/parser.mly" ( _1 ) -# 37825 "parsing/parser.ml" +# 37869 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37862,9 +37906,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2885 "parsing/parser.mly" +# 2889 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 37868 "parsing/parser.ml" +# 37912 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -37872,21 +37916,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 37878 "parsing/parser.ml" +# 37922 "parsing/parser.ml" in -# 2890 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _1 ) -# 37884 "parsing/parser.ml" +# 37928 "parsing/parser.ml" in -# 2867 "parsing/parser.mly" +# 2871 "parsing/parser.mly" ( _1 ) -# 37890 "parsing/parser.ml" +# 37934 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37925,30 +37969,30 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _1 = -# 2887 "parsing/parser.mly" +# 2891 "parsing/parser.mly" ( Ppat_or(_1, _3) ) -# 37931 "parsing/parser.ml" +# 37975 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 37940 "parsing/parser.ml" +# 37984 "parsing/parser.ml" in -# 2890 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _1 ) -# 37946 "parsing/parser.ml" +# 37990 "parsing/parser.ml" in -# 2867 "parsing/parser.mly" +# 2871 "parsing/parser.mly" ( _1 ) -# 37952 "parsing/parser.ml" +# 37996 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37989,9 +38033,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2889 "parsing/parser.mly" +# 2893 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 37995 "parsing/parser.ml" +# 38039 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -37999,21 +38043,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 38005 "parsing/parser.ml" +# 38049 "parsing/parser.ml" in -# 2890 "parsing/parser.mly" +# 2894 "parsing/parser.mly" ( _1 ) -# 38011 "parsing/parser.ml" +# 38055 "parsing/parser.ml" in -# 2867 "parsing/parser.mly" +# 2871 "parsing/parser.mly" ( _1 ) -# 38017 "parsing/parser.ml" +# 38061 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38032,9 +38076,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 38038 "parsing/parser.ml" +# 38082 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -38046,30 +38090,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 38052 "parsing/parser.ml" +# 38096 "parsing/parser.ml" in -# 2344 "parsing/parser.mly" +# 2348 "parsing/parser.mly" ( Ppat_var _1 ) -# 38058 "parsing/parser.ml" +# 38102 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 38067 "parsing/parser.ml" +# 38111 "parsing/parser.ml" in -# 2346 "parsing/parser.mly" +# 2350 "parsing/parser.mly" ( _1 ) -# 38073 "parsing/parser.ml" +# 38117 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38093,23 +38137,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2345 "parsing/parser.mly" +# 2349 "parsing/parser.mly" ( Ppat_any ) -# 38099 "parsing/parser.ml" +# 38143 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 38107 "parsing/parser.ml" +# 38151 "parsing/parser.ml" in -# 2346 "parsing/parser.mly" +# 2350 "parsing/parser.mly" ( _1 ) -# 38113 "parsing/parser.ml" +# 38157 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38132,9 +38176,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.payload) = -# 4084 "parsing/parser.mly" +# 4088 "parsing/parser.mly" ( PStr _1 ) -# 38138 "parsing/parser.ml" +# 38182 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38164,9 +38208,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.payload) = -# 4085 "parsing/parser.mly" +# 4089 "parsing/parser.mly" ( PSig _2 ) -# 38170 "parsing/parser.ml" +# 38214 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38196,9 +38240,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.payload) = -# 4086 "parsing/parser.mly" +# 4090 "parsing/parser.mly" ( PTyp _2 ) -# 38202 "parsing/parser.ml" +# 38246 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38228,9 +38272,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.payload) = -# 4087 "parsing/parser.mly" +# 4091 "parsing/parser.mly" ( PPat (_2, None) ) -# 38234 "parsing/parser.ml" +# 38278 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38274,9 +38318,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.payload) = -# 4088 "parsing/parser.mly" +# 4092 "parsing/parser.mly" ( PPat (_2, Some _4) ) -# 38280 "parsing/parser.ml" +# 38324 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38299,9 +38343,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3425 "parsing/parser.mly" +# 3429 "parsing/parser.mly" ( _1 ) -# 38305 "parsing/parser.ml" +# 38349 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38344,24 +38388,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 38348 "parsing/parser.ml" +# 38392 "parsing/parser.ml" in -# 1058 "parsing/parser.mly" +# 1062 "parsing/parser.mly" ( xs ) -# 38353 "parsing/parser.ml" +# 38397 "parsing/parser.ml" in -# 3417 "parsing/parser.mly" +# 3421 "parsing/parser.mly" ( _1 ) -# 38359 "parsing/parser.ml" +# 38403 "parsing/parser.ml" in -# 3421 "parsing/parser.mly" +# 3425 "parsing/parser.mly" ( Ptyp_poly(_1, _3) ) -# 38365 "parsing/parser.ml" +# 38409 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_xs_) in @@ -38369,15 +38413,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 38375 "parsing/parser.ml" +# 38419 "parsing/parser.ml" in -# 3427 "parsing/parser.mly" +# 3431 "parsing/parser.mly" ( _1 ) -# 38381 "parsing/parser.ml" +# 38425 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38400,14 +38444,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = -# 3456 "parsing/parser.mly" +# 3460 "parsing/parser.mly" ( _1 ) -# 38406 "parsing/parser.ml" +# 38450 "parsing/parser.ml" in -# 3425 "parsing/parser.mly" +# 3429 "parsing/parser.mly" ( _1 ) -# 38411 "parsing/parser.ml" +# 38455 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38446,33 +38490,33 @@ module Tables = struct let _v : (Parsetree.core_type) = let _1 = let _1 = let _3 = -# 3456 "parsing/parser.mly" +# 3460 "parsing/parser.mly" ( _1 ) -# 38452 "parsing/parser.ml" +# 38496 "parsing/parser.ml" in let _1 = let _1 = let xs = # 253 "" ( List.rev xs ) -# 38459 "parsing/parser.ml" +# 38503 "parsing/parser.ml" in -# 1058 "parsing/parser.mly" +# 1062 "parsing/parser.mly" ( xs ) -# 38464 "parsing/parser.ml" +# 38508 "parsing/parser.ml" in -# 3417 "parsing/parser.mly" +# 3421 "parsing/parser.mly" ( _1 ) -# 38470 "parsing/parser.ml" +# 38514 "parsing/parser.ml" in -# 3421 "parsing/parser.mly" +# 3425 "parsing/parser.mly" ( Ptyp_poly(_1, _3) ) -# 38476 "parsing/parser.ml" +# 38520 "parsing/parser.ml" in let _startpos__1_ = _startpos_xs_ in @@ -38480,15 +38524,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 38486 "parsing/parser.ml" +# 38530 "parsing/parser.ml" in -# 3427 "parsing/parser.mly" +# 3431 "parsing/parser.mly" ( _1 ) -# 38492 "parsing/parser.ml" +# 38536 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38535,9 +38579,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 4045 "parsing/parser.mly" - ( Attr.mk ~loc:(make_loc _sloc) _2 _3 ) -# 38541 "parsing/parser.ml" +# 4049 "parsing/parser.mly" + ( mk_attr ~loc:(make_loc _sloc) _2 _3 ) +# 38585 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38618,9 +38662,9 @@ module Tables = struct let _v : (Parsetree.value_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 38624 "parsing/parser.ml" +# 38668 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -38630,30 +38674,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 38636 "parsing/parser.ml" +# 38680 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 38644 "parsing/parser.ml" +# 38688 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3053 "parsing/parser.mly" +# 3057 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Val.mk id ty ~prim ~attrs ~loc ~docs, ext ) -# 38657 "parsing/parser.ml" +# 38701 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38669,14 +38713,14 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.private_flag) = let _1 = -# 3913 "parsing/parser.mly" +# 3917 "parsing/parser.mly" ( Public ) -# 38675 "parsing/parser.ml" +# 38719 "parsing/parser.ml" in -# 3910 "parsing/parser.mly" +# 3914 "parsing/parser.mly" ( _1 ) -# 38680 "parsing/parser.ml" +# 38724 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38699,14 +38743,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = let _1 = -# 3914 "parsing/parser.mly" +# 3918 "parsing/parser.mly" ( Private ) -# 38705 "parsing/parser.ml" +# 38749 "parsing/parser.ml" in -# 3910 "parsing/parser.mly" +# 3914 "parsing/parser.mly" ( _1 ) -# 38710 "parsing/parser.ml" +# 38754 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38722,9 +38766,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3936 "parsing/parser.mly" +# 3940 "parsing/parser.mly" ( Public, Concrete ) -# 38728 "parsing/parser.ml" +# 38772 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38747,9 +38791,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3937 "parsing/parser.mly" +# 3941 "parsing/parser.mly" ( Private, Concrete ) -# 38753 "parsing/parser.ml" +# 38797 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38772,9 +38816,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3938 "parsing/parser.mly" +# 3942 "parsing/parser.mly" ( Public, Virtual ) -# 38778 "parsing/parser.ml" +# 38822 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38804,9 +38848,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3939 "parsing/parser.mly" +# 3943 "parsing/parser.mly" ( Private, Virtual ) -# 38810 "parsing/parser.ml" +# 38854 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38836,9 +38880,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3940 "parsing/parser.mly" +# 3944 "parsing/parser.mly" ( Private, Virtual ) -# 38842 "parsing/parser.ml" +# 38886 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38854,9 +38898,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.rec_flag) = -# 3891 "parsing/parser.mly" +# 3895 "parsing/parser.mly" ( Nonrecursive ) -# 38860 "parsing/parser.ml" +# 38904 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38879,9 +38923,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.rec_flag) = -# 3892 "parsing/parser.mly" +# 3896 "parsing/parser.mly" ( Recursive ) -# 38885 "parsing/parser.ml" +# 38929 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38907,12 +38951,12 @@ module Tables = struct (Longident.t Asttypes.loc * Parsetree.expression) list) = let eo = # 124 "" ( None ) -# 38911 "parsing/parser.ml" +# 38955 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2796 "parsing/parser.mly" ( eo, fields ) -# 38916 "parsing/parser.ml" +# 38960 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38953,18 +38997,18 @@ module Tables = struct let x = # 191 "" ( x ) -# 38957 "parsing/parser.ml" +# 39001 "parsing/parser.ml" in # 126 "" ( Some x ) -# 38962 "parsing/parser.ml" +# 39006 "parsing/parser.ml" in -# 2792 "parsing/parser.mly" +# 2796 "parsing/parser.mly" ( eo, fields ) -# 38968 "parsing/parser.ml" +# 39012 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38989,17 +39033,17 @@ module Tables = struct let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : (Parsetree.constructor_declaration list) = let x = -# 3238 "parsing/parser.mly" +# 3242 "parsing/parser.mly" ( let cid, vars, args, res, attrs, loc, info = d in Type.constructor cid ~vars ~args ?res ~attrs ~loc ~info ) -# 38998 "parsing/parser.ml" +# 39042 "parsing/parser.ml" in -# 1189 "parsing/parser.mly" +# 1193 "parsing/parser.mly" ( [x] ) -# 39003 "parsing/parser.ml" +# 39047 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39024,17 +39068,17 @@ module Tables = struct let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : (Parsetree.constructor_declaration list) = let x = -# 3238 "parsing/parser.mly" +# 3242 "parsing/parser.mly" ( let cid, vars, args, res, attrs, loc, info = d in Type.constructor cid ~vars ~args ?res ~attrs ~loc ~info ) -# 39033 "parsing/parser.ml" +# 39077 "parsing/parser.ml" in -# 1192 "parsing/parser.mly" +# 1196 "parsing/parser.mly" ( [x] ) -# 39038 "parsing/parser.ml" +# 39082 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39066,17 +39110,17 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_d_ in let _v : (Parsetree.constructor_declaration list) = let x = -# 3238 "parsing/parser.mly" +# 3242 "parsing/parser.mly" ( let cid, vars, args, res, attrs, loc, info = d in Type.constructor cid ~vars ~args ?res ~attrs ~loc ~info ) -# 39075 "parsing/parser.ml" +# 39119 "parsing/parser.ml" in -# 1196 "parsing/parser.mly" +# 1200 "parsing/parser.mly" ( x :: xs ) -# 39080 "parsing/parser.ml" +# 39124 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39102,23 +39146,23 @@ module Tables = struct let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = let _1 = -# 3355 "parsing/parser.mly" +# 3359 "parsing/parser.mly" ( let cid, vars, args, res, attrs, loc, info = d in Te.decl cid ~vars ~args ?res ~attrs ~loc ~info ) -# 39111 "parsing/parser.ml" +# 39155 "parsing/parser.ml" in -# 3349 "parsing/parser.mly" +# 3353 "parsing/parser.mly" ( _1 ) -# 39116 "parsing/parser.ml" +# 39160 "parsing/parser.ml" in -# 1189 "parsing/parser.mly" +# 1193 "parsing/parser.mly" ( [x] ) -# 39122 "parsing/parser.ml" +# 39166 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39141,14 +39185,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3351 "parsing/parser.mly" +# 3355 "parsing/parser.mly" ( _1 ) -# 39147 "parsing/parser.ml" +# 39191 "parsing/parser.ml" in -# 1189 "parsing/parser.mly" +# 1193 "parsing/parser.mly" ( [x] ) -# 39152 "parsing/parser.ml" +# 39196 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39174,23 +39218,23 @@ module Tables = struct let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = let _1 = -# 3355 "parsing/parser.mly" +# 3359 "parsing/parser.mly" ( let cid, vars, args, res, attrs, loc, info = d in Te.decl cid ~vars ~args ?res ~attrs ~loc ~info ) -# 39183 "parsing/parser.ml" +# 39227 "parsing/parser.ml" in -# 3349 "parsing/parser.mly" +# 3353 "parsing/parser.mly" ( _1 ) -# 39188 "parsing/parser.ml" +# 39232 "parsing/parser.ml" in -# 1192 "parsing/parser.mly" +# 1196 "parsing/parser.mly" ( [x] ) -# 39194 "parsing/parser.ml" +# 39238 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39213,14 +39257,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3351 "parsing/parser.mly" +# 3355 "parsing/parser.mly" ( _1 ) -# 39219 "parsing/parser.ml" +# 39263 "parsing/parser.ml" in -# 1192 "parsing/parser.mly" +# 1196 "parsing/parser.mly" ( [x] ) -# 39224 "parsing/parser.ml" +# 39268 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39253,23 +39297,23 @@ module Tables = struct let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = let _1 = -# 3355 "parsing/parser.mly" +# 3359 "parsing/parser.mly" ( let cid, vars, args, res, attrs, loc, info = d in Te.decl cid ~vars ~args ?res ~attrs ~loc ~info ) -# 39262 "parsing/parser.ml" +# 39306 "parsing/parser.ml" in -# 3349 "parsing/parser.mly" +# 3353 "parsing/parser.mly" ( _1 ) -# 39267 "parsing/parser.ml" +# 39311 "parsing/parser.ml" in -# 1196 "parsing/parser.mly" +# 1200 "parsing/parser.mly" ( x :: xs ) -# 39273 "parsing/parser.ml" +# 39317 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39299,14 +39343,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos__1_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3351 "parsing/parser.mly" +# 3355 "parsing/parser.mly" ( _1 ) -# 39305 "parsing/parser.ml" +# 39349 "parsing/parser.ml" in -# 1196 "parsing/parser.mly" +# 1200 "parsing/parser.mly" ( x :: xs ) -# 39310 "parsing/parser.ml" +# 39354 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39331,17 +39375,17 @@ module Tables = struct let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3355 "parsing/parser.mly" +# 3359 "parsing/parser.mly" ( let cid, vars, args, res, attrs, loc, info = d in Te.decl cid ~vars ~args ?res ~attrs ~loc ~info ) -# 39340 "parsing/parser.ml" +# 39384 "parsing/parser.ml" in -# 1189 "parsing/parser.mly" +# 1193 "parsing/parser.mly" ( [x] ) -# 39345 "parsing/parser.ml" +# 39389 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39366,17 +39410,17 @@ module Tables = struct let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3355 "parsing/parser.mly" +# 3359 "parsing/parser.mly" ( let cid, vars, args, res, attrs, loc, info = d in Te.decl cid ~vars ~args ?res ~attrs ~loc ~info ) -# 39375 "parsing/parser.ml" +# 39419 "parsing/parser.ml" in -# 1192 "parsing/parser.mly" +# 1196 "parsing/parser.mly" ( [x] ) -# 39380 "parsing/parser.ml" +# 39424 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39408,17 +39452,17 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3355 "parsing/parser.mly" +# 3359 "parsing/parser.mly" ( let cid, vars, args, res, attrs, loc, info = d in Te.decl cid ~vars ~args ?res ~attrs ~loc ~info ) -# 39417 "parsing/parser.ml" +# 39461 "parsing/parser.ml" in -# 1196 "parsing/parser.mly" +# 1200 "parsing/parser.mly" ( x :: xs ) -# 39422 "parsing/parser.ml" +# 39466 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39434,9 +39478,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = -# 1034 "parsing/parser.mly" +# 1038 "parsing/parser.mly" ( [] ) -# 39440 "parsing/parser.ml" +# 39484 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39493,21 +39537,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2193 "parsing/parser.mly" +# 2197 "parsing/parser.mly" ( _1, _3, make_loc _sloc ) -# 39499 "parsing/parser.ml" +# 39543 "parsing/parser.ml" in # 183 "" ( x ) -# 39505 "parsing/parser.ml" +# 39549 "parsing/parser.ml" in -# 1036 "parsing/parser.mly" +# 1040 "parsing/parser.mly" ( x :: xs ) -# 39511 "parsing/parser.ml" +# 39555 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39530,9 +39574,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.function_param list) = -# 1067 "parsing/parser.mly" +# 1071 "parsing/parser.mly" ( List.rev x ) -# 39536 "parsing/parser.ml" +# 39580 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39562,9 +39606,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.function_param list) = -# 1069 "parsing/parser.mly" +# 1073 "parsing/parser.mly" ( List.rev_append x xs ) -# 39568 "parsing/parser.ml" +# 39612 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39587,9 +39631,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : ((Lexing.position * Parsetree.functor_parameter) list) = -# 1048 "parsing/parser.mly" +# 1052 "parsing/parser.mly" ( [ x ] ) -# 39593 "parsing/parser.ml" +# 39637 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39619,9 +39663,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : ((Lexing.position * Parsetree.functor_parameter) list) = -# 1050 "parsing/parser.mly" +# 1054 "parsing/parser.mly" ( x :: xs ) -# 39625 "parsing/parser.ml" +# 39669 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39644,9 +39688,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : ((Asttypes.arg_label * Parsetree.expression) list) = -# 1048 "parsing/parser.mly" +# 1052 "parsing/parser.mly" ( [ x ] ) -# 39650 "parsing/parser.ml" +# 39694 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39676,9 +39720,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : ((Asttypes.arg_label * Parsetree.expression) list) = -# 1050 "parsing/parser.mly" +# 1054 "parsing/parser.mly" ( x :: xs ) -# 39682 "parsing/parser.ml" +# 39726 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39701,9 +39745,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Asttypes.label list) = -# 1048 "parsing/parser.mly" +# 1052 "parsing/parser.mly" ( [ x ] ) -# 39707 "parsing/parser.ml" +# 39751 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39733,9 +39777,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Asttypes.label list) = -# 1050 "parsing/parser.mly" +# 1054 "parsing/parser.mly" ( x :: xs ) -# 39739 "parsing/parser.ml" +# 39783 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39748,9 +39792,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -39759,33 +39803,25 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; }; } = _menhir_stack in - let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _2 : (Asttypes.label) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__1_inlined1_ in + let _endpos = _endpos__2_ in let _v : (Asttypes.label Asttypes.loc list) = let x = - let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 956 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 39777 "parsing/parser.ml" - - in + let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3413 "parsing/parser.mly" - ( _2 ) -# 39783 "parsing/parser.ml" +# 3417 "parsing/parser.mly" + ( mkrhs _2 _sloc ) +# 39819 "parsing/parser.ml" in -# 1048 "parsing/parser.mly" +# 1052 "parsing/parser.mly" ( [ x ] ) -# 39789 "parsing/parser.ml" +# 39825 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39798,9 +39834,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _1_inlined1; - MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; - MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _1; @@ -39815,34 +39851,26 @@ module Tables = struct }; }; } = _menhir_stack in - let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in + let _2 : (Asttypes.label) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let xs : (Asttypes.label Asttypes.loc list) = Obj.magic xs in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_xs_ in - let _endpos = _endpos__1_inlined1_ in + let _endpos = _endpos__2_ in let _v : (Asttypes.label Asttypes.loc list) = let x = - let _2 = - let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in - let _endpos = _endpos__1_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 956 "parsing/parser.mly" - ( mkrhs _1 _sloc ) -# 39834 "parsing/parser.ml" - - in + let _endpos = _endpos__2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 3413 "parsing/parser.mly" - ( _2 ) -# 39840 "parsing/parser.ml" +# 3417 "parsing/parser.mly" + ( mkrhs _2 _sloc ) +# 39868 "parsing/parser.ml" in -# 1050 "parsing/parser.mly" +# 1054 "parsing/parser.mly" ( x :: xs ) -# 39846 "parsing/parser.ml" +# 39874 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39867,12 +39895,12 @@ module Tables = struct let _v : (Parsetree.case list) = let _1 = # 124 "" ( None ) -# 39871 "parsing/parser.ml" +# 39899 "parsing/parser.ml" in -# 1160 "parsing/parser.mly" +# 1164 "parsing/parser.mly" ( [x] ) -# 39876 "parsing/parser.ml" +# 39904 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39906,13 +39934,13 @@ module Tables = struct # 126 "" ( Some x ) -# 39910 "parsing/parser.ml" +# 39938 "parsing/parser.ml" in -# 1160 "parsing/parser.mly" +# 1164 "parsing/parser.mly" ( [x] ) -# 39916 "parsing/parser.ml" +# 39944 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39949,9 +39977,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.case list) = -# 1164 "parsing/parser.mly" +# 1168 "parsing/parser.mly" ( x :: xs ) -# 39955 "parsing/parser.ml" +# 39983 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39975,20 +40003,20 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type list) = let xs = let x = -# 3456 "parsing/parser.mly" +# 3460 "parsing/parser.mly" ( _1 ) -# 39981 "parsing/parser.ml" +# 40009 "parsing/parser.ml" in -# 1095 "parsing/parser.mly" +# 1099 "parsing/parser.mly" ( [ x ] ) -# 39986 "parsing/parser.ml" +# 40014 "parsing/parser.ml" in -# 1103 "parsing/parser.mly" +# 1107 "parsing/parser.mly" ( xs ) -# 39992 "parsing/parser.ml" +# 40020 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40026,20 +40054,20 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type list) = let xs = let x = -# 3456 "parsing/parser.mly" +# 3460 "parsing/parser.mly" ( _1 ) -# 40032 "parsing/parser.ml" +# 40060 "parsing/parser.ml" in -# 1099 "parsing/parser.mly" +# 1103 "parsing/parser.mly" ( x :: xs ) -# 40037 "parsing/parser.ml" +# 40065 "parsing/parser.ml" in -# 1103 "parsing/parser.mly" +# 1107 "parsing/parser.mly" ( xs ) -# 40043 "parsing/parser.ml" +# 40071 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40062,14 +40090,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.with_constraint list) = let xs = -# 1095 "parsing/parser.mly" +# 1099 "parsing/parser.mly" ( [ x ] ) -# 40068 "parsing/parser.ml" +# 40096 "parsing/parser.ml" in -# 1103 "parsing/parser.mly" +# 1107 "parsing/parser.mly" ( xs ) -# 40073 "parsing/parser.ml" +# 40101 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40106,14 +40134,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.with_constraint list) = let xs = -# 1099 "parsing/parser.mly" +# 1103 "parsing/parser.mly" ( x :: xs ) -# 40112 "parsing/parser.ml" +# 40140 "parsing/parser.ml" in -# 1103 "parsing/parser.mly" +# 1107 "parsing/parser.mly" ( xs ) -# 40117 "parsing/parser.ml" +# 40145 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40136,14 +40164,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.row_field list) = let xs = -# 1095 "parsing/parser.mly" +# 1099 "parsing/parser.mly" ( [ x ] ) -# 40142 "parsing/parser.ml" +# 40170 "parsing/parser.ml" in -# 1103 "parsing/parser.mly" +# 1107 "parsing/parser.mly" ( xs ) -# 40147 "parsing/parser.ml" +# 40175 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40180,162 +40208,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.row_field list) = let xs = -# 1099 "parsing/parser.mly" - ( x :: xs ) -# 40186 "parsing/parser.ml" - in - # 1103 "parsing/parser.mly" - ( xs ) -# 40191 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let x : (Parsetree.core_type) = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.core_type list) = let xs = -# 1095 "parsing/parser.mly" - ( [ x ] ) -# 40216 "parsing/parser.ml" - in - -# 1103 "parsing/parser.mly" - ( xs ) -# 40221 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let x : (Parsetree.core_type) = Obj.magic x in - let _2 : unit = Obj.magic _2 in - let xs : (Parsetree.core_type list) = Obj.magic xs in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : (Parsetree.core_type list) = let xs = -# 1099 "parsing/parser.mly" - ( x :: xs ) -# 40260 "parsing/parser.ml" - in - -# 1103 "parsing/parser.mly" - ( xs ) -# 40265 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = _menhir_stack; - } = _menhir_stack in - let x : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic x in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_x_ in - let _endpos = _endpos_x_ in - let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = -# 1095 "parsing/parser.mly" - ( [ x ] ) -# 40290 "parsing/parser.ml" - in - -# 1103 "parsing/parser.mly" - ( xs ) -# 40295 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = x; - MenhirLib.EngineTypes.startp = _startpos_x_; - MenhirLib.EngineTypes.endp = _endpos_x_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = xs; - MenhirLib.EngineTypes.startp = _startpos_xs_; - MenhirLib.EngineTypes.endp = _endpos_xs_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - } = _menhir_stack in - let x : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic x in - let _2 : unit = Obj.magic _2 in - let xs : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic xs in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos_xs_ in - let _endpos = _endpos_x_ in - let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = -# 1099 "parsing/parser.mly" ( x :: xs ) -# 40334 "parsing/parser.ml" +# 40214 "parsing/parser.ml" in -# 1103 "parsing/parser.mly" +# 1107 "parsing/parser.mly" ( xs ) -# 40339 "parsing/parser.ml" +# 40219 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40358,14 +40238,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = let xs = -# 1095 "parsing/parser.mly" +# 1099 "parsing/parser.mly" ( [ x ] ) -# 40364 "parsing/parser.ml" +# 40244 "parsing/parser.ml" in -# 1103 "parsing/parser.mly" +# 1107 "parsing/parser.mly" ( xs ) -# 40369 "parsing/parser.ml" +# 40249 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40402,14 +40282,162 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = let xs = +# 1103 "parsing/parser.mly" + ( x :: xs ) +# 40288 "parsing/parser.ml" + in + +# 1107 "parsing/parser.mly" + ( xs ) +# 40293 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = # 1099 "parsing/parser.mly" + ( [ x ] ) +# 40318 "parsing/parser.ml" + in + +# 1107 "parsing/parser.mly" + ( xs ) +# 40323 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let x : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = Obj.magic x in + let _2 : unit = Obj.magic _2 in + let xs : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = +# 1103 "parsing/parser.mly" ( x :: xs ) -# 40408 "parsing/parser.ml" +# 40362 "parsing/parser.ml" + in + +# 1107 "parsing/parser.mly" + ( xs ) +# 40367 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let x : (Parsetree.core_type) = Obj.magic x in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_x_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.core_type list) = let xs = +# 1099 "parsing/parser.mly" + ( [ x ] ) +# 40392 "parsing/parser.ml" in +# 1107 "parsing/parser.mly" + ( xs ) +# 40397 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = x; + MenhirLib.EngineTypes.startp = _startpos_x_; + MenhirLib.EngineTypes.endp = _endpos_x_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + } = _menhir_stack in + let x : (Parsetree.core_type) = Obj.magic x in + let _2 : unit = Obj.magic _2 in + let xs : (Parsetree.core_type list) = Obj.magic xs in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_xs_ in + let _endpos = _endpos_x_ in + let _v : (Parsetree.core_type list) = let xs = # 1103 "parsing/parser.mly" + ( x :: xs ) +# 40436 "parsing/parser.ml" + in + +# 1107 "parsing/parser.mly" ( xs ) -# 40413 "parsing/parser.ml" +# 40441 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40446,9 +40474,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = -# 1126 "parsing/parser.mly" +# 1130 "parsing/parser.mly" ( x :: xs ) -# 40452 "parsing/parser.ml" +# 40480 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40485,9 +40513,9 @@ module Tables = struct let _startpos = _startpos_x1_ in let _endpos = _endpos_x2_ in let _v : (Parsetree.core_type list) = -# 1130 "parsing/parser.mly" +# 1134 "parsing/parser.mly" ( [ x2; x1 ] ) -# 40491 "parsing/parser.ml" +# 40519 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40525,20 +40553,20 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression list) = let x = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 40531 "parsing/parser.ml" +# 40559 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 40536 "parsing/parser.ml" +# 40564 "parsing/parser.ml" in -# 1126 "parsing/parser.mly" +# 1130 "parsing/parser.mly" ( x :: xs ) -# 40542 "parsing/parser.ml" +# 40570 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40603,18 +40631,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 40607 "parsing/parser.ml" +# 40635 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 40612 "parsing/parser.ml" +# 40640 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 40618 "parsing/parser.ml" +# 40646 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -40623,22 +40651,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 40629 "parsing/parser.ml" +# 40657 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 40635 "parsing/parser.ml" +# 40663 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -40651,19 +40679,19 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 40655 "parsing/parser.ml" +# 40683 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 40661 "parsing/parser.ml" +# 40689 "parsing/parser.ml" in -# 1126 "parsing/parser.mly" +# 1130 "parsing/parser.mly" ( x :: xs ) -# 40667 "parsing/parser.ml" +# 40695 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40702,32 +40730,32 @@ module Tables = struct let _v : (Parsetree.expression list) = let x2 = let _1 = _1_inlined1 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 40708 "parsing/parser.ml" +# 40736 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 40713 "parsing/parser.ml" +# 40741 "parsing/parser.ml" in let x1 = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 40720 "parsing/parser.ml" +# 40748 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 40725 "parsing/parser.ml" +# 40753 "parsing/parser.ml" in -# 1130 "parsing/parser.mly" +# 1134 "parsing/parser.mly" ( [ x2; x1 ] ) -# 40731 "parsing/parser.ml" +# 40759 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40792,18 +40820,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 40796 "parsing/parser.ml" +# 40824 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 40801 "parsing/parser.ml" +# 40829 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 40807 "parsing/parser.ml" +# 40835 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -40812,22 +40840,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 40818 "parsing/parser.ml" +# 40846 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 40824 "parsing/parser.ml" +# 40852 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -40840,31 +40868,31 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 40844 "parsing/parser.ml" +# 40872 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 40850 "parsing/parser.ml" +# 40878 "parsing/parser.ml" in let x1 = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 40857 "parsing/parser.ml" +# 40885 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 40862 "parsing/parser.ml" +# 40890 "parsing/parser.ml" in -# 1130 "parsing/parser.mly" +# 1134 "parsing/parser.mly" ( [ x2; x1 ] ) -# 40868 "parsing/parser.ml" +# 40896 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40924,14 +40952,14 @@ module Tables = struct let _v : (Parsetree.expression list) = let x2 = let _1 = _1_inlined3 in let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 40930 "parsing/parser.ml" +# 40958 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 40935 "parsing/parser.ml" +# 40963 "parsing/parser.ml" in let x1 = @@ -40941,18 +40969,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 40945 "parsing/parser.ml" +# 40973 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 40950 "parsing/parser.ml" +# 40978 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 40956 "parsing/parser.ml" +# 40984 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -40961,22 +40989,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 40967 "parsing/parser.ml" +# 40995 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 40973 "parsing/parser.ml" +# 41001 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -40989,19 +41017,19 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 40993 "parsing/parser.ml" +# 41021 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 40999 "parsing/parser.ml" +# 41027 "parsing/parser.ml" in -# 1130 "parsing/parser.mly" +# 1134 "parsing/parser.mly" ( [ x2; x1 ] ) -# 41005 "parsing/parser.ml" +# 41033 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41087,18 +41115,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 41091 "parsing/parser.ml" +# 41119 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 41096 "parsing/parser.ml" +# 41124 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 41102 "parsing/parser.ml" +# 41130 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -41107,22 +41135,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 41113 "parsing/parser.ml" +# 41141 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 41119 "parsing/parser.ml" +# 41147 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -41135,13 +41163,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 41139 "parsing/parser.ml" +# 41167 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 41145 "parsing/parser.ml" +# 41173 "parsing/parser.ml" in let x1 = @@ -41151,18 +41179,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 41155 "parsing/parser.ml" +# 41183 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 41160 "parsing/parser.ml" +# 41188 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 41166 "parsing/parser.ml" +# 41194 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -41171,22 +41199,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 41177 "parsing/parser.ml" +# 41205 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 41183 "parsing/parser.ml" +# 41211 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -41199,19 +41227,19 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 41203 "parsing/parser.ml" +# 41231 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 41209 "parsing/parser.ml" +# 41237 "parsing/parser.ml" in -# 1130 "parsing/parser.mly" +# 1134 "parsing/parser.mly" ( [ x2; x1 ] ) -# 41215 "parsing/parser.ml" +# 41243 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41248,9 +41276,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = -# 1126 "parsing/parser.mly" +# 1130 "parsing/parser.mly" ( x :: xs ) -# 41254 "parsing/parser.ml" +# 41282 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41287,9 +41315,9 @@ module Tables = struct let _startpos = _startpos_x1_ in let _endpos = _endpos_x2_ in let _v : (Parsetree.core_type list) = -# 1130 "parsing/parser.mly" +# 1134 "parsing/parser.mly" ( [ x2; x1 ] ) -# 41293 "parsing/parser.ml" +# 41321 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41312,9 +41340,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.row_field) = -# 3652 "parsing/parser.mly" +# 3656 "parsing/parser.mly" ( _1 ) -# 41318 "parsing/parser.ml" +# 41346 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41340,9 +41368,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3654 "parsing/parser.mly" +# 3658 "parsing/parser.mly" ( Rf.inherit_ ~loc:(make_loc _sloc) _1 ) -# 41346 "parsing/parser.ml" +# 41374 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41367,24 +41395,24 @@ module Tables = struct let _v : (Parsetree.expression list) = let _2 = # 124 "" ( None ) -# 41371 "parsing/parser.ml" +# 41399 "parsing/parser.ml" in let x = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 41377 "parsing/parser.ml" +# 41405 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 41382 "parsing/parser.ml" +# 41410 "parsing/parser.ml" in -# 1147 "parsing/parser.mly" +# 1151 "parsing/parser.mly" ( [x] ) -# 41388 "parsing/parser.ml" +# 41416 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41416,24 +41444,24 @@ module Tables = struct let _v : (Parsetree.expression list) = let _2 = # 126 "" ( Some x ) -# 41420 "parsing/parser.ml" +# 41448 "parsing/parser.ml" in let x = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 41426 "parsing/parser.ml" +# 41454 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 41431 "parsing/parser.ml" +# 41459 "parsing/parser.ml" in -# 1147 "parsing/parser.mly" +# 1151 "parsing/parser.mly" ( [x] ) -# 41437 "parsing/parser.ml" +# 41465 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41479,7 +41507,7 @@ module Tables = struct let _v : (Parsetree.expression list) = let _2 = # 124 "" ( None ) -# 41483 "parsing/parser.ml" +# 41511 "parsing/parser.ml" in let x = let _1 = @@ -41488,18 +41516,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 41492 "parsing/parser.ml" +# 41520 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 41497 "parsing/parser.ml" +# 41525 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 41503 "parsing/parser.ml" +# 41531 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -41508,22 +41536,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 41514 "parsing/parser.ml" +# 41542 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 41520 "parsing/parser.ml" +# 41548 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -41536,19 +41564,19 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 41540 "parsing/parser.ml" +# 41568 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 41546 "parsing/parser.ml" +# 41574 "parsing/parser.ml" in -# 1147 "parsing/parser.mly" +# 1151 "parsing/parser.mly" ( [x] ) -# 41552 "parsing/parser.ml" +# 41580 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41601,7 +41629,7 @@ module Tables = struct let _v : (Parsetree.expression list) = let _2 = # 126 "" ( Some x ) -# 41605 "parsing/parser.ml" +# 41633 "parsing/parser.ml" in let x = let _1 = @@ -41610,18 +41638,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 41614 "parsing/parser.ml" +# 41642 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 41619 "parsing/parser.ml" +# 41647 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 41625 "parsing/parser.ml" +# 41653 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -41630,22 +41658,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 41636 "parsing/parser.ml" +# 41664 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 41642 "parsing/parser.ml" +# 41670 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -41658,19 +41686,19 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 41662 "parsing/parser.ml" +# 41690 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 41668 "parsing/parser.ml" +# 41696 "parsing/parser.ml" in -# 1147 "parsing/parser.mly" +# 1151 "parsing/parser.mly" ( [x] ) -# 41674 "parsing/parser.ml" +# 41702 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41708,20 +41736,20 @@ module Tables = struct let _endpos = _endpos_xs_ in let _v : (Parsetree.expression list) = let x = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 41714 "parsing/parser.ml" +# 41742 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 41719 "parsing/parser.ml" +# 41747 "parsing/parser.ml" in -# 1151 "parsing/parser.mly" +# 1155 "parsing/parser.mly" ( x :: xs ) -# 41725 "parsing/parser.ml" +# 41753 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41786,18 +41814,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 41790 "parsing/parser.ml" +# 41818 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 41795 "parsing/parser.ml" +# 41823 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 41801 "parsing/parser.ml" +# 41829 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -41806,22 +41834,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 41812 "parsing/parser.ml" +# 41840 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 41818 "parsing/parser.ml" +# 41846 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -41834,19 +41862,19 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 41838 "parsing/parser.ml" +# 41866 "parsing/parser.ml" in -# 2427 "parsing/parser.mly" +# 2431 "parsing/parser.mly" ( _1 ) -# 41844 "parsing/parser.ml" +# 41872 "parsing/parser.ml" in -# 1151 "parsing/parser.mly" +# 1155 "parsing/parser.mly" ( x :: xs ) -# 41850 "parsing/parser.ml" +# 41878 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41872,9 +41900,9 @@ module Tables = struct } = _menhir_stack in let oe : (Parsetree.expression option) = Obj.magic oe in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 41878 "parsing/parser.ml" +# 41906 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -41882,26 +41910,26 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = let _2 = # 124 "" ( None ) -# 41886 "parsing/parser.ml" +# 41914 "parsing/parser.ml" in let x = let label = let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 41893 "parsing/parser.ml" +# 41921 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 41901 "parsing/parser.ml" +# 41929 "parsing/parser.ml" in -# 2815 "parsing/parser.mly" +# 2819 "parsing/parser.mly" ( let label, e = match oe with | None -> @@ -41911,13 +41939,13 @@ module Tables = struct label, e in label, e ) -# 41915 "parsing/parser.ml" +# 41943 "parsing/parser.ml" in -# 1147 "parsing/parser.mly" +# 1151 "parsing/parser.mly" ( [x] ) -# 41921 "parsing/parser.ml" +# 41949 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41950,9 +41978,9 @@ module Tables = struct let x : unit = Obj.magic x in let oe : (Parsetree.expression option) = Obj.magic oe in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 41956 "parsing/parser.ml" +# 41984 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -41960,26 +41988,26 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = let _2 = # 126 "" ( Some x ) -# 41964 "parsing/parser.ml" +# 41992 "parsing/parser.ml" in let x = let label = let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 41971 "parsing/parser.ml" +# 41999 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 41979 "parsing/parser.ml" +# 42007 "parsing/parser.ml" in -# 2815 "parsing/parser.mly" +# 2819 "parsing/parser.mly" ( let label, e = match oe with | None -> @@ -41989,13 +42017,13 @@ module Tables = struct label, e in label, e ) -# 41993 "parsing/parser.ml" +# 42021 "parsing/parser.ml" in -# 1147 "parsing/parser.mly" +# 1151 "parsing/parser.mly" ( [x] ) -# 41999 "parsing/parser.ml" +# 42027 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42035,9 +42063,9 @@ module Tables = struct let _2 : unit = Obj.magic _2 in let oe : (Parsetree.expression option) = Obj.magic oe in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 42041 "parsing/parser.ml" +# 42069 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -42045,21 +42073,21 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = let x = let label = let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 42051 "parsing/parser.ml" +# 42079 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 42059 "parsing/parser.ml" +# 42087 "parsing/parser.ml" in -# 2815 "parsing/parser.mly" +# 2819 "parsing/parser.mly" ( let label, e = match oe with | None -> @@ -42069,13 +42097,13 @@ module Tables = struct label, e in label, e ) -# 42073 "parsing/parser.ml" +# 42101 "parsing/parser.ml" in -# 1151 "parsing/parser.mly" +# 1155 "parsing/parser.mly" ( x :: xs ) -# 42079 "parsing/parser.ml" +# 42107 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42100,12 +42128,12 @@ module Tables = struct let _v : (Parsetree.pattern list) = let _2 = # 124 "" ( None ) -# 42104 "parsing/parser.ml" +# 42132 "parsing/parser.ml" in -# 1147 "parsing/parser.mly" +# 1151 "parsing/parser.mly" ( [x] ) -# 42109 "parsing/parser.ml" +# 42137 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42139,13 +42167,13 @@ module Tables = struct # 126 "" ( Some x ) -# 42143 "parsing/parser.ml" +# 42171 "parsing/parser.ml" in -# 1147 "parsing/parser.mly" +# 1151 "parsing/parser.mly" ( [x] ) -# 42149 "parsing/parser.ml" +# 42177 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42182,9 +42210,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.pattern list) = -# 1151 "parsing/parser.mly" +# 1155 "parsing/parser.mly" ( x :: xs ) -# 42188 "parsing/parser.ml" +# 42216 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42223,7 +42251,7 @@ module Tables = struct let _v : ((Longident.t Asttypes.loc * Parsetree.expression) list) = let _2 = # 124 "" ( None ) -# 42227 "parsing/parser.ml" +# 42255 "parsing/parser.ml" in let x = let label = @@ -42231,9 +42259,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 42237 "parsing/parser.ml" +# 42265 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -42241,7 +42269,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2798 "parsing/parser.mly" +# 2802 "parsing/parser.mly" ( let constraint_loc, label, e = match eo with | None -> @@ -42251,13 +42279,13 @@ module Tables = struct (_startpos_c_, _endpos), label, e in label, mkexp_opt_constraint ~loc:constraint_loc e c ) -# 42255 "parsing/parser.ml" +# 42283 "parsing/parser.ml" in -# 1147 "parsing/parser.mly" +# 1151 "parsing/parser.mly" ( [x] ) -# 42261 "parsing/parser.ml" +# 42289 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42303,7 +42331,7 @@ module Tables = struct let _v : ((Longident.t Asttypes.loc * Parsetree.expression) list) = let _2 = # 126 "" ( Some x ) -# 42307 "parsing/parser.ml" +# 42335 "parsing/parser.ml" in let x = let label = @@ -42311,9 +42339,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 42317 "parsing/parser.ml" +# 42345 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -42321,7 +42349,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2798 "parsing/parser.mly" +# 2802 "parsing/parser.mly" ( let constraint_loc, label, e = match eo with | None -> @@ -42331,13 +42359,13 @@ module Tables = struct (_startpos_c_, _endpos), label, e in label, mkexp_opt_constraint ~loc:constraint_loc e c ) -# 42335 "parsing/parser.ml" +# 42363 "parsing/parser.ml" in -# 1147 "parsing/parser.mly" +# 1151 "parsing/parser.mly" ( [x] ) -# 42341 "parsing/parser.ml" +# 42369 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42393,9 +42421,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 42399 "parsing/parser.ml" +# 42427 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -42403,7 +42431,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2798 "parsing/parser.mly" +# 2802 "parsing/parser.mly" ( let constraint_loc, label, e = match eo with | None -> @@ -42413,13 +42441,13 @@ module Tables = struct (_startpos_c_, _endpos), label, e in label, mkexp_opt_constraint ~loc:constraint_loc e c ) -# 42417 "parsing/parser.ml" +# 42445 "parsing/parser.ml" in -# 1151 "parsing/parser.mly" +# 1155 "parsing/parser.mly" ( x :: xs ) -# 42423 "parsing/parser.ml" +# 42451 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42442,14 +42470,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = -# 2283 "parsing/parser.mly" +# 2287 "parsing/parser.mly" ( _1 ) -# 42448 "parsing/parser.ml" +# 42476 "parsing/parser.ml" in -# 2321 "parsing/parser.mly" +# 2325 "parsing/parser.mly" ( _1 ) -# 42453 "parsing/parser.ml" +# 42481 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42498,18 +42526,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 42502 "parsing/parser.ml" +# 42530 "parsing/parser.ml" in -# 1172 "parsing/parser.mly" +# 1176 "parsing/parser.mly" ( xs ) -# 42507 "parsing/parser.ml" +# 42535 "parsing/parser.ml" in -# 2752 "parsing/parser.mly" +# 2756 "parsing/parser.mly" ( xs ) -# 42513 "parsing/parser.ml" +# 42541 "parsing/parser.ml" in let _endpos__3_ = _endpos_xs_ in @@ -42518,22 +42546,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 42524 "parsing/parser.ml" +# 42552 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 42530 "parsing/parser.ml" +# 42558 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2285 "parsing/parser.mly" +# 2289 "parsing/parser.mly" ( let loc = make_loc _sloc in let cases = _3 in (* There are two choices of where to put attributes: on the @@ -42546,13 +42574,13 @@ module Tables = struct let desc = mkfunction [] None (Pfunction_cases (cases, loc, [])) in mkexp_attrs ~loc:_sloc desc _2 ) -# 42550 "parsing/parser.ml" +# 42578 "parsing/parser.ml" in -# 2321 "parsing/parser.mly" +# 2325 "parsing/parser.mly" ( _1 ) -# 42556 "parsing/parser.ml" +# 42584 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42620,18 +42648,18 @@ module Tables = struct let _v : (Parsetree.type_exception * string Asttypes.loc option) = let attrs = let _1 = _1_inlined4 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 42626 "parsing/parser.ml" +# 42654 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined4_ in let attrs2 = let _1 = _1_inlined3 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 42635 "parsing/parser.ml" +# 42663 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -42641,17 +42669,17 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 42647 "parsing/parser.ml" +# 42675 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 42655 "parsing/parser.ml" +# 42683 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in @@ -42659,14 +42687,14 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3268 "parsing/parser.mly" +# 3272 "parsing/parser.mly" ( let vars, args, res = vars_args_res in let loc = make_loc (_startpos, _endpos_attrs2_) in let docs = symbol_docs _sloc in Te.mk_exception ~attrs (Te.decl id ~vars ~args ?res ~attrs:(attrs1 @ attrs2) ~loc ~docs) , ext ) -# 42670 "parsing/parser.ml" +# 42698 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42692,21 +42720,21 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 42696 "parsing/parser.ml" +# 42724 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 949 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( extra_sig _startpos _endpos _1 ) -# 42704 "parsing/parser.ml" +# 42732 "parsing/parser.ml" in -# 1729 "parsing/parser.mly" +# 1733 "parsing/parser.mly" ( _1 ) -# 42710 "parsing/parser.ml" +# 42738 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42738,9 +42766,9 @@ module Tables = struct let _v : (Parsetree.signature_item) = let _2 = let _1 = _1_inlined1 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 42744 "parsing/parser.ml" +# 42772 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -42748,10 +42776,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1744 "parsing/parser.mly" +# 1748 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mksig ~loc:_sloc (Psig_extension (_1, (add_docs_attrs docs _2))) ) -# 42755 "parsing/parser.ml" +# 42783 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42775,23 +42803,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1748 "parsing/parser.mly" +# 1752 "parsing/parser.mly" ( Psig_attribute _1 ) -# 42781 "parsing/parser.ml" +# 42809 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 997 "parsing/parser.mly" +# 1001 "parsing/parser.mly" ( mksig ~loc:_sloc _1 ) -# 42789 "parsing/parser.ml" +# 42817 "parsing/parser.ml" in -# 1750 "parsing/parser.mly" +# 1754 "parsing/parser.mly" ( _1 ) -# 42795 "parsing/parser.ml" +# 42823 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42815,23 +42843,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1753 "parsing/parser.mly" +# 1757 "parsing/parser.mly" ( psig_value _1 ) -# 42821 "parsing/parser.ml" +# 42849 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 42829 "parsing/parser.ml" +# 42857 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 42835 "parsing/parser.ml" +# 42863 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42855,23 +42883,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1755 "parsing/parser.mly" +# 1759 "parsing/parser.mly" ( psig_value _1 ) -# 42861 "parsing/parser.ml" +# 42889 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 42869 "parsing/parser.ml" +# 42897 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 42875 "parsing/parser.ml" +# 42903 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42906,26 +42934,26 @@ module Tables = struct let _1 = let _1 = let _1 = -# 1208 "parsing/parser.mly" +# 1212 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 42912 "parsing/parser.ml" +# 42940 "parsing/parser.ml" in -# 3089 "parsing/parser.mly" +# 3093 "parsing/parser.mly" ( _1 ) -# 42917 "parsing/parser.ml" +# 42945 "parsing/parser.ml" in -# 3072 "parsing/parser.mly" +# 3076 "parsing/parser.mly" ( _1 ) -# 42923 "parsing/parser.ml" +# 42951 "parsing/parser.ml" in -# 1757 "parsing/parser.mly" +# 1761 "parsing/parser.mly" ( psig_type _1 ) -# 42929 "parsing/parser.ml" +# 42957 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in @@ -42933,15 +42961,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 42939 "parsing/parser.ml" +# 42967 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 42945 "parsing/parser.ml" +# 42973 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42976,26 +43004,26 @@ module Tables = struct let _1 = let _1 = let _1 = -# 1208 "parsing/parser.mly" +# 1212 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 42982 "parsing/parser.ml" +# 43010 "parsing/parser.ml" in -# 3089 "parsing/parser.mly" +# 3093 "parsing/parser.mly" ( _1 ) -# 42987 "parsing/parser.ml" +# 43015 "parsing/parser.ml" in -# 3077 "parsing/parser.mly" +# 3081 "parsing/parser.mly" ( _1 ) -# 42993 "parsing/parser.ml" +# 43021 "parsing/parser.ml" in -# 1759 "parsing/parser.mly" +# 1763 "parsing/parser.mly" ( psig_typesubst _1 ) -# 42999 "parsing/parser.ml" +# 43027 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in @@ -43003,15 +43031,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43009 "parsing/parser.ml" +# 43037 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 43015 "parsing/parser.ml" +# 43043 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43096,16 +43124,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 43102 "parsing/parser.ml" +# 43130 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let cs = -# 1200 "parsing/parser.mly" +# 1204 "parsing/parser.mly" ( List.rev xs ) -# 43109 "parsing/parser.ml" +# 43137 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -43113,46 +43141,46 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43119 "parsing/parser.ml" +# 43147 "parsing/parser.ml" in let _4 = -# 3899 "parsing/parser.mly" +# 3903 "parsing/parser.mly" ( Recursive ) -# 43125 "parsing/parser.ml" +# 43153 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 43132 "parsing/parser.ml" +# 43160 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3342 "parsing/parser.mly" +# 3346 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in Te.mk tid cs ~params ~priv ~attrs ~docs, ext ) -# 43144 "parsing/parser.ml" +# 43172 "parsing/parser.ml" in -# 3329 "parsing/parser.mly" +# 3333 "parsing/parser.mly" ( _1 ) -# 43150 "parsing/parser.ml" +# 43178 "parsing/parser.ml" in -# 1761 "parsing/parser.mly" +# 1765 "parsing/parser.mly" ( psig_typext _1 ) -# 43156 "parsing/parser.ml" +# 43184 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -43160,15 +43188,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43166 "parsing/parser.ml" +# 43194 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 43172 "parsing/parser.ml" +# 43200 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43260,16 +43288,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 43266 "parsing/parser.ml" +# 43294 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in let cs = -# 1200 "parsing/parser.mly" +# 1204 "parsing/parser.mly" ( List.rev xs ) -# 43273 "parsing/parser.ml" +# 43301 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in @@ -43277,9 +43305,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43283 "parsing/parser.ml" +# 43311 "parsing/parser.ml" in let _4 = @@ -43288,41 +43316,41 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3901 "parsing/parser.mly" +# 3905 "parsing/parser.mly" ( not_expecting _loc "nonrec flag" ) -# 43294 "parsing/parser.ml" +# 43322 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 43302 "parsing/parser.ml" +# 43330 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3342 "parsing/parser.mly" +# 3346 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in Te.mk tid cs ~params ~priv ~attrs ~docs, ext ) -# 43314 "parsing/parser.ml" +# 43342 "parsing/parser.ml" in -# 3329 "parsing/parser.mly" +# 3333 "parsing/parser.mly" ( _1 ) -# 43320 "parsing/parser.ml" +# 43348 "parsing/parser.ml" in -# 1761 "parsing/parser.mly" +# 1765 "parsing/parser.mly" ( psig_typext _1 ) -# 43326 "parsing/parser.ml" +# 43354 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -43330,15 +43358,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43336 "parsing/parser.ml" +# 43364 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 43342 "parsing/parser.ml" +# 43370 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43362,23 +43390,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1763 "parsing/parser.mly" +# 1767 "parsing/parser.mly" ( psig_exception _1 ) -# 43368 "parsing/parser.ml" +# 43396 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43376 "parsing/parser.ml" +# 43404 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 43382 "parsing/parser.ml" +# 43410 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43441,9 +43469,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 43447 "parsing/parser.ml" +# 43475 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -43453,37 +43481,37 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43459 "parsing/parser.ml" +# 43487 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 43467 "parsing/parser.ml" +# 43495 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1794 "parsing/parser.mly" +# 1798 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Md.mk name body ~attrs ~loc ~docs, ext ) -# 43481 "parsing/parser.ml" +# 43509 "parsing/parser.ml" in -# 1765 "parsing/parser.mly" +# 1769 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_module body, ext) ) -# 43487 "parsing/parser.ml" +# 43515 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -43491,15 +43519,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43497 "parsing/parser.ml" +# 43525 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 43503 "parsing/parser.ml" +# 43531 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43569,9 +43597,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 43575 "parsing/parser.ml" +# 43603 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -43582,9 +43610,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43588 "parsing/parser.ml" +# 43616 "parsing/parser.ml" in let (_endpos_id_, _startpos_id_) = (_endpos__1_, _startpos__1_) in @@ -43592,9 +43620,9 @@ module Tables = struct let _symbolstartpos = _startpos_id_ in let _sloc = (_symbolstartpos, _endpos) in -# 1833 "parsing/parser.mly" +# 1837 "parsing/parser.mly" ( Mty.alias ~loc:(make_loc _sloc) id ) -# 43598 "parsing/parser.ml" +# 43626 "parsing/parser.ml" in let name = @@ -43603,37 +43631,37 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43609 "parsing/parser.ml" +# 43637 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 43617 "parsing/parser.ml" +# 43645 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1824 "parsing/parser.mly" +# 1828 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Md.mk name body ~attrs ~loc ~docs, ext ) -# 43631 "parsing/parser.ml" +# 43659 "parsing/parser.ml" in -# 1767 "parsing/parser.mly" +# 1771 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_module body, ext) ) -# 43637 "parsing/parser.ml" +# 43665 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -43641,15 +43669,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43647 "parsing/parser.ml" +# 43675 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 43653 "parsing/parser.ml" +# 43681 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43673,23 +43701,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1769 "parsing/parser.mly" +# 1773 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_modsubst body, ext) ) -# 43679 "parsing/parser.ml" +# 43707 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43687 "parsing/parser.ml" +# 43715 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 43693 "parsing/parser.ml" +# 43721 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43775,9 +43803,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 43781 "parsing/parser.ml" +# 43809 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -43787,49 +43815,49 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43793 "parsing/parser.ml" +# 43821 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 43801 "parsing/parser.ml" +# 43829 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1867 "parsing/parser.mly" +# 1871 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in ext, Md.mk name mty ~attrs ~loc ~docs ) -# 43815 "parsing/parser.ml" +# 43843 "parsing/parser.ml" in -# 1208 "parsing/parser.mly" +# 1212 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 43821 "parsing/parser.ml" +# 43849 "parsing/parser.ml" in -# 1856 "parsing/parser.mly" +# 1860 "parsing/parser.mly" ( _1 ) -# 43827 "parsing/parser.ml" +# 43855 "parsing/parser.ml" in -# 1771 "parsing/parser.mly" +# 1775 "parsing/parser.mly" ( let (ext, l) = _1 in (Psig_recmodule l, ext) ) -# 43833 "parsing/parser.ml" +# 43861 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -43837,15 +43865,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43843 "parsing/parser.ml" +# 43871 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 43849 "parsing/parser.ml" +# 43877 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43869,23 +43897,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1773 "parsing/parser.mly" +# 1777 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_modtype body, ext) ) -# 43875 "parsing/parser.ml" +# 43903 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43883 "parsing/parser.ml" +# 43911 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 43889 "parsing/parser.ml" +# 43917 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43909,23 +43937,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1775 "parsing/parser.mly" +# 1779 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_modtypesubst body, ext) ) -# 43915 "parsing/parser.ml" +# 43943 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43923 "parsing/parser.ml" +# 43951 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 43929 "parsing/parser.ml" +# 43957 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43949,23 +43977,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1777 "parsing/parser.mly" +# 1781 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_open body, ext) ) -# 43955 "parsing/parser.ml" +# 43983 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 43963 "parsing/parser.ml" +# 43991 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 43969 "parsing/parser.ml" +# 43997 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44021,38 +44049,38 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 44027 "parsing/parser.ml" +# 44055 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 44036 "parsing/parser.ml" +# 44064 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1617 "parsing/parser.mly" +# 1621 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Incl.mk thing ~attrs ~loc ~docs, ext ) -# 44050 "parsing/parser.ml" +# 44078 "parsing/parser.ml" in -# 1779 "parsing/parser.mly" +# 1783 "parsing/parser.mly" ( psig_include _1 ) -# 44056 "parsing/parser.ml" +# 44084 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined2_ in @@ -44060,15 +44088,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44066 "parsing/parser.ml" +# 44094 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 44072 "parsing/parser.ml" +# 44100 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44145,9 +44173,9 @@ module Tables = struct let cty : (Parsetree.class_type) = Obj.magic cty in let _7 : unit = Obj.magic _7 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 44151 "parsing/parser.ml" +# 44179 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -44165,9 +44193,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 44171 "parsing/parser.ml" +# 44199 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -44177,24 +44205,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44183 "parsing/parser.ml" +# 44211 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 44191 "parsing/parser.ml" +# 44219 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2214 "parsing/parser.mly" +# 2218 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -44202,25 +44230,25 @@ module Tables = struct ext, Ci.mk id cty ~virt ~params ~attrs ~loc ~docs ) -# 44206 "parsing/parser.ml" +# 44234 "parsing/parser.ml" in -# 1208 "parsing/parser.mly" +# 1212 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 44212 "parsing/parser.ml" +# 44240 "parsing/parser.ml" in -# 2202 "parsing/parser.mly" +# 2206 "parsing/parser.mly" ( _1 ) -# 44218 "parsing/parser.ml" +# 44246 "parsing/parser.ml" in -# 1781 "parsing/parser.mly" +# 1785 "parsing/parser.mly" ( let (ext, l) = _1 in (Psig_class l, ext) ) -# 44224 "parsing/parser.ml" +# 44252 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -44228,15 +44256,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44234 "parsing/parser.ml" +# 44262 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 44240 "parsing/parser.ml" +# 44268 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44260,23 +44288,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1783 "parsing/parser.mly" +# 1787 "parsing/parser.mly" ( let (ext, l) = _1 in (Psig_class_type l, ext) ) -# 44266 "parsing/parser.ml" +# 44294 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1014 "parsing/parser.mly" +# 1018 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 44274 "parsing/parser.ml" +# 44302 "parsing/parser.ml" in -# 1785 "parsing/parser.mly" +# 1789 "parsing/parser.mly" ( _1 ) -# 44280 "parsing/parser.ml" +# 44308 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44299,9 +44327,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 3728 "parsing/parser.mly" +# 3732 "parsing/parser.mly" ( _1 ) -# 44305 "parsing/parser.ml" +# 44333 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44326,18 +44354,18 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 760 "parsing/parser.mly" +# 764 "parsing/parser.mly" (string * char option) -# 44332 "parsing/parser.ml" +# 44360 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.constant) = -# 3729 "parsing/parser.mly" +# 3733 "parsing/parser.mly" ( let (n, m) = _2 in Pconst_integer("-" ^ n, m) ) -# 44341 "parsing/parser.ml" +# 44369 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44362,18 +44390,18 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 739 "parsing/parser.mly" +# 743 "parsing/parser.mly" (string * char option) -# 44368 "parsing/parser.ml" +# 44396 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.constant) = -# 3730 "parsing/parser.mly" +# 3734 "parsing/parser.mly" ( let (f, m) = _2 in Pconst_float("-" ^ f, m) ) -# 44377 "parsing/parser.ml" +# 44405 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44398,18 +44426,18 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 760 "parsing/parser.mly" +# 764 "parsing/parser.mly" (string * char option) -# 44404 "parsing/parser.ml" +# 44432 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.constant) = -# 3731 "parsing/parser.mly" +# 3735 "parsing/parser.mly" ( let (n, m) = _2 in Pconst_integer (n, m) ) -# 44413 "parsing/parser.ml" +# 44441 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44434,18 +44462,18 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 739 "parsing/parser.mly" +# 743 "parsing/parser.mly" (string * char option) -# 44440 "parsing/parser.ml" +# 44468 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.constant) = -# 3732 "parsing/parser.mly" +# 3736 "parsing/parser.mly" ( let (f, m) = _2 in Pconst_float(f, m) ) -# 44449 "parsing/parser.ml" +# 44477 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44486,18 +44514,18 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3001 "parsing/parser.mly" +# 3005 "parsing/parser.mly" ( let fields, closed = _1 in let closed = match closed with Some () -> Open | None -> Closed in fields, closed ) -# 44494 "parsing/parser.ml" +# 44522 "parsing/parser.ml" in -# 2972 "parsing/parser.mly" +# 2976 "parsing/parser.mly" ( let (fields, closed) = _2 in Ppat_record(fields, closed) ) -# 44501 "parsing/parser.ml" +# 44529 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -44505,15 +44533,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 44511 "parsing/parser.ml" +# 44539 "parsing/parser.ml" in -# 2986 "parsing/parser.mly" +# 2990 "parsing/parser.mly" ( _1 ) -# 44517 "parsing/parser.ml" +# 44545 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44554,19 +44582,19 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3001 "parsing/parser.mly" +# 3005 "parsing/parser.mly" ( let fields, closed = _1 in let closed = match closed with Some () -> Open | None -> Closed in fields, closed ) -# 44562 "parsing/parser.ml" +# 44590 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2975 "parsing/parser.mly" +# 2979 "parsing/parser.mly" ( unclosed "{" _loc__1_ "}" _loc__3_ ) -# 44570 "parsing/parser.ml" +# 44598 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -44574,15 +44602,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 44580 "parsing/parser.ml" +# 44608 "parsing/parser.ml" in -# 2986 "parsing/parser.mly" +# 2990 "parsing/parser.mly" ( _1 ) -# 44586 "parsing/parser.ml" +# 44614 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44621,15 +44649,15 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _2 = -# 2995 "parsing/parser.mly" +# 2999 "parsing/parser.mly" ( ps ) -# 44627 "parsing/parser.ml" +# 44655 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2977 "parsing/parser.mly" +# 2981 "parsing/parser.mly" ( fst (mktailpat _loc__3_ _2) ) -# 44633 "parsing/parser.ml" +# 44661 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -44637,15 +44665,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 44643 "parsing/parser.ml" +# 44671 "parsing/parser.ml" in -# 2986 "parsing/parser.mly" +# 2990 "parsing/parser.mly" ( _1 ) -# 44649 "parsing/parser.ml" +# 44677 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44684,16 +44712,16 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _2 = -# 2995 "parsing/parser.mly" +# 2999 "parsing/parser.mly" ( ps ) -# 44690 "parsing/parser.ml" +# 44718 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2979 "parsing/parser.mly" +# 2983 "parsing/parser.mly" ( unclosed "[" _loc__1_ "]" _loc__3_ ) -# 44697 "parsing/parser.ml" +# 44725 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -44701,15 +44729,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 44707 "parsing/parser.ml" +# 44735 "parsing/parser.ml" in -# 2986 "parsing/parser.mly" +# 2990 "parsing/parser.mly" ( _1 ) -# 44713 "parsing/parser.ml" +# 44741 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44748,14 +44776,14 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _2 = -# 2995 "parsing/parser.mly" +# 2999 "parsing/parser.mly" ( ps ) -# 44754 "parsing/parser.ml" +# 44782 "parsing/parser.ml" in -# 2981 "parsing/parser.mly" +# 2985 "parsing/parser.mly" ( Ppat_array _2 ) -# 44759 "parsing/parser.ml" +# 44787 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -44763,15 +44791,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 44769 "parsing/parser.ml" +# 44797 "parsing/parser.ml" in -# 2986 "parsing/parser.mly" +# 2990 "parsing/parser.mly" ( _1 ) -# 44775 "parsing/parser.ml" +# 44803 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44802,24 +44830,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2983 "parsing/parser.mly" +# 2987 "parsing/parser.mly" ( Ppat_array [] ) -# 44808 "parsing/parser.ml" +# 44836 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 44817 "parsing/parser.ml" +# 44845 "parsing/parser.ml" in -# 2986 "parsing/parser.mly" +# 2990 "parsing/parser.mly" ( _1 ) -# 44823 "parsing/parser.ml" +# 44851 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44858,16 +44886,16 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _2 = -# 2995 "parsing/parser.mly" +# 2999 "parsing/parser.mly" ( ps ) -# 44864 "parsing/parser.ml" +# 44892 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2985 "parsing/parser.mly" +# 2989 "parsing/parser.mly" ( unclosed "[|" _loc__1_ "|]" _loc__3_ ) -# 44871 "parsing/parser.ml" +# 44899 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -44875,15 +44903,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 44881 "parsing/parser.ml" +# 44909 "parsing/parser.ml" in -# 2986 "parsing/parser.mly" +# 2990 "parsing/parser.mly" ( _1 ) -# 44887 "parsing/parser.ml" +# 44915 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44923,9 +44951,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2489 "parsing/parser.mly" +# 2493 "parsing/parser.mly" ( reloc_exp ~loc:_sloc _2 ) -# 44929 "parsing/parser.ml" +# 44957 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44964,9 +44992,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2491 "parsing/parser.mly" +# 2495 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 44970 "parsing/parser.ml" +# 44998 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45013,9 +45041,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2493 "parsing/parser.mly" +# 2497 "parsing/parser.mly" ( mkexp_constraint ~loc:_sloc _2 _3 ) -# 45019 "parsing/parser.ml" +# 45047 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45067,14 +45095,14 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.expression) = let _1 = let r = -# 2494 "parsing/parser.mly" +# 2498 "parsing/parser.mly" ( None ) -# 45073 "parsing/parser.ml" +# 45101 "parsing/parser.ml" in -# 2375 "parsing/parser.mly" +# 2379 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 45078 "parsing/parser.ml" +# 45106 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -45082,9 +45110,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2495 "parsing/parser.mly" +# 2499 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 45088 "parsing/parser.ml" +# 45116 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45136,14 +45164,14 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.expression) = let _1 = let r = -# 2494 "parsing/parser.mly" +# 2498 "parsing/parser.mly" ( None ) -# 45142 "parsing/parser.ml" +# 45170 "parsing/parser.ml" in -# 2377 "parsing/parser.mly" +# 2381 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 45147 "parsing/parser.ml" +# 45175 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -45151,9 +45179,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2495 "parsing/parser.mly" +# 2499 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 45157 "parsing/parser.ml" +# 45185 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45205,14 +45233,14 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.expression) = let _1 = let r = -# 2494 "parsing/parser.mly" +# 2498 "parsing/parser.mly" ( None ) -# 45211 "parsing/parser.ml" +# 45239 "parsing/parser.ml" in -# 2379 "parsing/parser.mly" +# 2383 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 45216 "parsing/parser.ml" +# 45244 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -45220,9 +45248,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2495 "parsing/parser.mly" +# 2499 "parsing/parser.mly" ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) -# 45226 "parsing/parser.ml" +# 45254 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45268,9 +45296,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 45274 "parsing/parser.ml" +# 45302 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -45278,31 +45306,31 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.expression) = let _1 = let r = -# 2496 "parsing/parser.mly" +# 2500 "parsing/parser.mly" ( None ) -# 45284 "parsing/parser.ml" +# 45312 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 45289 "parsing/parser.ml" +# 45317 "parsing/parser.ml" in let d = let _1 = # 124 "" ( None ) -# 45295 "parsing/parser.ml" +# 45323 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 45300 "parsing/parser.ml" +# 45328 "parsing/parser.ml" in -# 2375 "parsing/parser.mly" +# 2379 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 45306 "parsing/parser.ml" +# 45334 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -45310,9 +45338,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2497 "parsing/parser.mly" +# 2501 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 45316 "parsing/parser.ml" +# 45344 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45370,9 +45398,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 45376 "parsing/parser.ml" +# 45404 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -45382,39 +45410,39 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.expression) = let _1 = let r = -# 2496 "parsing/parser.mly" +# 2500 "parsing/parser.mly" ( None ) -# 45388 "parsing/parser.ml" +# 45416 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 45393 "parsing/parser.ml" +# 45421 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" (_2) -# 45401 "parsing/parser.ml" +# 45429 "parsing/parser.ml" in # 126 "" ( Some x ) -# 45406 "parsing/parser.ml" +# 45434 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 45412 "parsing/parser.ml" +# 45440 "parsing/parser.ml" in -# 2375 "parsing/parser.mly" +# 2379 "parsing/parser.mly" ( array, d, Paren, i, r ) -# 45418 "parsing/parser.ml" +# 45446 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -45422,9 +45450,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2497 "parsing/parser.mly" +# 2501 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 45428 "parsing/parser.ml" +# 45456 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45470,9 +45498,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 45476 "parsing/parser.ml" +# 45504 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -45480,31 +45508,31 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.expression) = let _1 = let r = -# 2496 "parsing/parser.mly" +# 2500 "parsing/parser.mly" ( None ) -# 45486 "parsing/parser.ml" +# 45514 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 45491 "parsing/parser.ml" +# 45519 "parsing/parser.ml" in let d = let _1 = # 124 "" ( None ) -# 45497 "parsing/parser.ml" +# 45525 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 45502 "parsing/parser.ml" +# 45530 "parsing/parser.ml" in -# 2377 "parsing/parser.mly" +# 2381 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 45508 "parsing/parser.ml" +# 45536 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -45512,9 +45540,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2497 "parsing/parser.mly" +# 2501 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 45518 "parsing/parser.ml" +# 45546 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45572,9 +45600,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 45578 "parsing/parser.ml" +# 45606 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -45584,39 +45612,39 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.expression) = let _1 = let r = -# 2496 "parsing/parser.mly" +# 2500 "parsing/parser.mly" ( None ) -# 45590 "parsing/parser.ml" +# 45618 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 45595 "parsing/parser.ml" +# 45623 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" (_2) -# 45603 "parsing/parser.ml" +# 45631 "parsing/parser.ml" in # 126 "" ( Some x ) -# 45608 "parsing/parser.ml" +# 45636 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 45614 "parsing/parser.ml" +# 45642 "parsing/parser.ml" in -# 2377 "parsing/parser.mly" +# 2381 "parsing/parser.mly" ( array, d, Brace, i, r ) -# 45620 "parsing/parser.ml" +# 45648 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -45624,9 +45652,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2497 "parsing/parser.mly" +# 2501 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 45630 "parsing/parser.ml" +# 45658 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45672,9 +45700,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 45678 "parsing/parser.ml" +# 45706 "parsing/parser.ml" ) = Obj.magic _2 in let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -45682,31 +45710,31 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.expression) = let _1 = let r = -# 2496 "parsing/parser.mly" +# 2500 "parsing/parser.mly" ( None ) -# 45688 "parsing/parser.ml" +# 45716 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 45693 "parsing/parser.ml" +# 45721 "parsing/parser.ml" in let d = let _1 = # 124 "" ( None ) -# 45699 "parsing/parser.ml" +# 45727 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 45704 "parsing/parser.ml" +# 45732 "parsing/parser.ml" in -# 2379 "parsing/parser.mly" +# 2383 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 45710 "parsing/parser.ml" +# 45738 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -45714,9 +45742,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2497 "parsing/parser.mly" +# 2501 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 45720 "parsing/parser.ml" +# 45748 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45774,9 +45802,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 45780 "parsing/parser.ml" +# 45808 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1 : unit = Obj.magic _1 in @@ -45786,39 +45814,39 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.expression) = let _1 = let r = -# 2496 "parsing/parser.mly" +# 2500 "parsing/parser.mly" ( None ) -# 45792 "parsing/parser.ml" +# 45820 "parsing/parser.ml" in let i = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 45797 "parsing/parser.ml" +# 45825 "parsing/parser.ml" in let d = let _1 = let _2 = _2_inlined1 in let x = -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" (_2) -# 45805 "parsing/parser.ml" +# 45833 "parsing/parser.ml" in # 126 "" ( Some x ) -# 45810 "parsing/parser.ml" +# 45838 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 45816 "parsing/parser.ml" +# 45844 "parsing/parser.ml" in -# 2379 "parsing/parser.mly" +# 2383 "parsing/parser.mly" ( array, d, Bracket, i, r ) -# 45822 "parsing/parser.ml" +# 45850 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in @@ -45826,9 +45854,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2497 "parsing/parser.mly" +# 2501 "parsing/parser.mly" ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) -# 45832 "parsing/parser.ml" +# 45860 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45882,15 +45910,15 @@ module Tables = struct let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2384 "parsing/parser.mly" +# 2388 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) -# 45888 "parsing/parser.ml" +# 45916 "parsing/parser.ml" in -# 2498 "parsing/parser.mly" +# 2502 "parsing/parser.mly" ( _1 ) -# 45894 "parsing/parser.ml" +# 45922 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45944,15 +45972,15 @@ module Tables = struct let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2386 "parsing/parser.mly" +# 2390 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) -# 45950 "parsing/parser.ml" +# 45978 "parsing/parser.ml" in -# 2498 "parsing/parser.mly" +# 2502 "parsing/parser.mly" ( _1 ) -# 45956 "parsing/parser.ml" +# 45984 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46006,15 +46034,15 @@ module Tables = struct let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2388 "parsing/parser.mly" +# 2392 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) -# 46012 "parsing/parser.ml" +# 46040 "parsing/parser.ml" in -# 2498 "parsing/parser.mly" +# 2502 "parsing/parser.mly" ( _1 ) -# 46018 "parsing/parser.ml" +# 46046 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46060,9 +46088,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _p : unit = Obj.magic _p in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 46066 "parsing/parser.ml" +# 46094 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -46070,34 +46098,34 @@ module Tables = struct let _endpos = _endpos__e_ in let _v : (Parsetree.expression) = let _1 = let _4 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 46076 "parsing/parser.ml" +# 46104 "parsing/parser.ml" in let _2 = let _1 = # 124 "" ( None ) -# 46082 "parsing/parser.ml" +# 46110 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 46087 "parsing/parser.ml" +# 46115 "parsing/parser.ml" in let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2384 "parsing/parser.mly" +# 2388 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) -# 46095 "parsing/parser.ml" +# 46123 "parsing/parser.ml" in -# 2499 "parsing/parser.mly" +# 2503 "parsing/parser.mly" ( _1 ) -# 46101 "parsing/parser.ml" +# 46129 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46155,9 +46183,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _p : unit = Obj.magic _p in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 46161 "parsing/parser.ml" +# 46189 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in @@ -46167,42 +46195,42 @@ module Tables = struct let _endpos = _endpos__e_ in let _v : (Parsetree.expression) = let _1 = let _4 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 46173 "parsing/parser.ml" +# 46201 "parsing/parser.ml" in let _2 = let _1 = let _2 = _2_inlined1 in let x = -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" (_2) -# 46181 "parsing/parser.ml" +# 46209 "parsing/parser.ml" in # 126 "" ( Some x ) -# 46186 "parsing/parser.ml" +# 46214 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 46192 "parsing/parser.ml" +# 46220 "parsing/parser.ml" in let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2384 "parsing/parser.mly" +# 2388 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) -# 46200 "parsing/parser.ml" +# 46228 "parsing/parser.ml" in -# 2499 "parsing/parser.mly" +# 2503 "parsing/parser.mly" ( _1 ) -# 46206 "parsing/parser.ml" +# 46234 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46248,9 +46276,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _p : unit = Obj.magic _p in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 46254 "parsing/parser.ml" +# 46282 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -46258,34 +46286,34 @@ module Tables = struct let _endpos = _endpos__e_ in let _v : (Parsetree.expression) = let _1 = let _4 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 46264 "parsing/parser.ml" +# 46292 "parsing/parser.ml" in let _2 = let _1 = # 124 "" ( None ) -# 46270 "parsing/parser.ml" +# 46298 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 46275 "parsing/parser.ml" +# 46303 "parsing/parser.ml" in let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2386 "parsing/parser.mly" +# 2390 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) -# 46283 "parsing/parser.ml" +# 46311 "parsing/parser.ml" in -# 2499 "parsing/parser.mly" +# 2503 "parsing/parser.mly" ( _1 ) -# 46289 "parsing/parser.ml" +# 46317 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46343,9 +46371,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _p : unit = Obj.magic _p in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 46349 "parsing/parser.ml" +# 46377 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in @@ -46355,42 +46383,42 @@ module Tables = struct let _endpos = _endpos__e_ in let _v : (Parsetree.expression) = let _1 = let _4 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 46361 "parsing/parser.ml" +# 46389 "parsing/parser.ml" in let _2 = let _1 = let _2 = _2_inlined1 in let x = -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" (_2) -# 46369 "parsing/parser.ml" +# 46397 "parsing/parser.ml" in # 126 "" ( Some x ) -# 46374 "parsing/parser.ml" +# 46402 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 46380 "parsing/parser.ml" +# 46408 "parsing/parser.ml" in let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2386 "parsing/parser.mly" +# 2390 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) -# 46388 "parsing/parser.ml" +# 46416 "parsing/parser.ml" in -# 2499 "parsing/parser.mly" +# 2503 "parsing/parser.mly" ( _1 ) -# 46394 "parsing/parser.ml" +# 46422 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46436,9 +46464,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _p : unit = Obj.magic _p in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 46442 "parsing/parser.ml" +# 46470 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -46446,34 +46474,34 @@ module Tables = struct let _endpos = _endpos__e_ in let _v : (Parsetree.expression) = let _1 = let _4 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 46452 "parsing/parser.ml" +# 46480 "parsing/parser.ml" in let _2 = let _1 = # 124 "" ( None ) -# 46458 "parsing/parser.ml" +# 46486 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 46463 "parsing/parser.ml" +# 46491 "parsing/parser.ml" in let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2388 "parsing/parser.mly" +# 2392 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) -# 46471 "parsing/parser.ml" +# 46499 "parsing/parser.ml" in -# 2499 "parsing/parser.mly" +# 2503 "parsing/parser.mly" ( _1 ) -# 46477 "parsing/parser.ml" +# 46505 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46531,9 +46559,9 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _p : unit = Obj.magic _p in let _2 : ( -# 755 "parsing/parser.mly" +# 759 "parsing/parser.mly" (string) -# 46537 "parsing/parser.ml" +# 46565 "parsing/parser.ml" ) = Obj.magic _2 in let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in let _1_inlined1 : unit = Obj.magic _1_inlined1 in @@ -46543,42 +46571,42 @@ module Tables = struct let _endpos = _endpos__e_ in let _v : (Parsetree.expression) = let _1 = let _4 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 46549 "parsing/parser.ml" +# 46577 "parsing/parser.ml" in let _2 = let _1 = let _2 = _2_inlined1 in let x = -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" (_2) -# 46557 "parsing/parser.ml" +# 46585 "parsing/parser.ml" in # 126 "" ( Some x ) -# 46562 "parsing/parser.ml" +# 46590 "parsing/parser.ml" in -# 2391 "parsing/parser.mly" +# 2395 "parsing/parser.mly" ( _1, _2 ) -# 46568 "parsing/parser.ml" +# 46596 "parsing/parser.ml" in let _loc__p_ = (_startpos__p_, _endpos__p_) in let _loc__e_ = (_startpos__e_, _endpos__e_) in -# 2388 "parsing/parser.mly" +# 2392 "parsing/parser.mly" ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) -# 46576 "parsing/parser.ml" +# 46604 "parsing/parser.ml" in -# 2499 "parsing/parser.mly" +# 2503 "parsing/parser.mly" ( _1 ) -# 46582 "parsing/parser.ml" +# 46610 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46632,15 +46660,15 @@ module Tables = struct let attrs = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 46638 "parsing/parser.ml" +# 46666 "parsing/parser.ml" in -# 2508 "parsing/parser.mly" +# 2512 "parsing/parser.mly" ( e.pexp_desc, (ext, attrs @ e.pexp_attributes) ) -# 46644 "parsing/parser.ml" +# 46672 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -46648,10 +46676,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2501 "parsing/parser.mly" +# 2505 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 46655 "parsing/parser.ml" +# 46683 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46700,24 +46728,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 46706 "parsing/parser.ml" +# 46734 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 46712 "parsing/parser.ml" +# 46740 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2510 "parsing/parser.mly" +# 2514 "parsing/parser.mly" ( Pexp_construct (mkloc (Lident "()") (make_loc _sloc), None), _2 ) -# 46721 "parsing/parser.ml" +# 46749 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -46725,10 +46753,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2501 "parsing/parser.mly" +# 2505 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 46732 "parsing/parser.ml" +# 46760 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46784,23 +46812,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 46790 "parsing/parser.ml" +# 46818 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 46796 "parsing/parser.ml" +# 46824 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2512 "parsing/parser.mly" +# 2516 "parsing/parser.mly" ( unclosed "begin" _loc__1_ "end" _loc__4_ ) -# 46804 "parsing/parser.ml" +# 46832 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -46808,10 +46836,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2501 "parsing/parser.mly" +# 2505 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 46815 "parsing/parser.ml" +# 46843 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46861,9 +46889,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46867 "parsing/parser.ml" +# 46895 "parsing/parser.ml" in let _2 = @@ -46871,21 +46899,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 46877 "parsing/parser.ml" +# 46905 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 46883 "parsing/parser.ml" +# 46911 "parsing/parser.ml" in -# 2514 "parsing/parser.mly" +# 2518 "parsing/parser.mly" ( Pexp_new(_3), _2 ) -# 46889 "parsing/parser.ml" +# 46917 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -46893,10 +46921,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2501 "parsing/parser.mly" +# 2505 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 46900 "parsing/parser.ml" +# 46928 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46959,21 +46987,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 46965 "parsing/parser.ml" +# 46993 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 46971 "parsing/parser.ml" +# 46999 "parsing/parser.ml" in -# 2516 "parsing/parser.mly" +# 2520 "parsing/parser.mly" ( Pexp_pack _4, _3 ) -# 46977 "parsing/parser.ml" +# 47005 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -46981,10 +47009,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2501 "parsing/parser.mly" +# 2505 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 46988 "parsing/parser.ml" +# 47016 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47062,11 +47090,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 47070 "parsing/parser.ml" +# 47098 "parsing/parser.ml" in let _3 = @@ -47074,24 +47102,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 47080 "parsing/parser.ml" +# 47108 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 47086 "parsing/parser.ml" +# 47114 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2518 "parsing/parser.mly" +# 2522 "parsing/parser.mly" ( Pexp_constraint (ghexp ~loc:_sloc (Pexp_pack _4), _6), _3 ) -# 47095 "parsing/parser.ml" +# 47123 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -47099,10 +47127,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2501 "parsing/parser.mly" +# 2505 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 47106 "parsing/parser.ml" +# 47134 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47172,23 +47200,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 47178 "parsing/parser.ml" +# 47206 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 47184 "parsing/parser.ml" +# 47212 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2520 "parsing/parser.mly" +# 2524 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 47192 "parsing/parser.ml" +# 47220 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -47196,10 +47224,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2501 "parsing/parser.mly" +# 2505 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 47203 "parsing/parser.ml" +# 47231 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47264,27 +47292,27 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 47268 "parsing/parser.ml" +# 47296 "parsing/parser.ml" in -# 2030 "parsing/parser.mly" +# 2034 "parsing/parser.mly" ( _1 ) -# 47273 "parsing/parser.ml" +# 47301 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 950 "parsing/parser.mly" +# 954 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 47282 "parsing/parser.ml" +# 47310 "parsing/parser.ml" in -# 2017 "parsing/parser.mly" +# 2021 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 47288 "parsing/parser.ml" +# 47316 "parsing/parser.ml" in let _2 = @@ -47292,21 +47320,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 47298 "parsing/parser.ml" +# 47326 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 47304 "parsing/parser.ml" +# 47332 "parsing/parser.ml" in -# 2522 "parsing/parser.mly" +# 2526 "parsing/parser.mly" ( Pexp_object _3, _2 ) -# 47310 "parsing/parser.ml" +# 47338 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -47314,10 +47342,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2501 "parsing/parser.mly" +# 2505 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 47321 "parsing/parser.ml" +# 47349 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47382,27 +47410,27 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 47386 "parsing/parser.ml" +# 47414 "parsing/parser.ml" in -# 2030 "parsing/parser.mly" +# 2034 "parsing/parser.mly" ( _1 ) -# 47391 "parsing/parser.ml" +# 47419 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 950 "parsing/parser.mly" +# 954 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 47400 "parsing/parser.ml" +# 47428 "parsing/parser.ml" in -# 2017 "parsing/parser.mly" +# 2021 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 47406 "parsing/parser.ml" +# 47434 "parsing/parser.ml" in let _2 = @@ -47410,23 +47438,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 47416 "parsing/parser.ml" +# 47444 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 47422 "parsing/parser.ml" +# 47450 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2524 "parsing/parser.mly" +# 2528 "parsing/parser.mly" ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 47430 "parsing/parser.ml" +# 47458 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -47434,10 +47462,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2501 "parsing/parser.mly" +# 2505 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 47441 "parsing/parser.ml" +# 47469 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47466,30 +47494,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 47472 "parsing/parser.ml" +# 47500 "parsing/parser.ml" in -# 2528 "parsing/parser.mly" +# 2532 "parsing/parser.mly" ( Pexp_ident (_1) ) -# 47478 "parsing/parser.ml" +# 47506 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 47487 "parsing/parser.ml" +# 47515 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 47493 "parsing/parser.ml" +# 47521 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47513,23 +47541,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2530 "parsing/parser.mly" +# 2534 "parsing/parser.mly" ( Pexp_constant _1 ) -# 47519 "parsing/parser.ml" +# 47547 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 47527 "parsing/parser.ml" +# 47555 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 47533 "parsing/parser.ml" +# 47561 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47558,30 +47586,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 47564 "parsing/parser.ml" +# 47592 "parsing/parser.ml" in -# 2532 "parsing/parser.mly" +# 2536 "parsing/parser.mly" ( Pexp_construct(_1, None) ) -# 47570 "parsing/parser.ml" +# 47598 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 47579 "parsing/parser.ml" +# 47607 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 47585 "parsing/parser.ml" +# 47613 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47605,23 +47633,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2534 "parsing/parser.mly" +# 2538 "parsing/parser.mly" ( Pexp_variant(_1, None) ) -# 47611 "parsing/parser.ml" +# 47639 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 47619 "parsing/parser.ml" +# 47647 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 47625 "parsing/parser.ml" +# 47653 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47647,9 +47675,9 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : ( -# 798 "parsing/parser.mly" +# 802 "parsing/parser.mly" (string) -# 47653 "parsing/parser.ml" +# 47681 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -47661,15 +47689,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 47667 "parsing/parser.ml" +# 47695 "parsing/parser.ml" in -# 2536 "parsing/parser.mly" +# 2540 "parsing/parser.mly" ( Pexp_apply(_1, [Nolabel,_2]) ) -# 47673 "parsing/parser.ml" +# 47701 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -47677,15 +47705,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 47683 "parsing/parser.ml" +# 47711 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 47689 "parsing/parser.ml" +# 47717 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47718,23 +47746,23 @@ module Tables = struct let _1 = let _1 = let _1 = -# 2537 "parsing/parser.mly" +# 2541 "parsing/parser.mly" ("!") -# 47724 "parsing/parser.ml" +# 47752 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 47732 "parsing/parser.ml" +# 47760 "parsing/parser.ml" in -# 2538 "parsing/parser.mly" +# 2542 "parsing/parser.mly" ( Pexp_apply(_1, [Nolabel,_2]) ) -# 47738 "parsing/parser.ml" +# 47766 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -47742,15 +47770,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 47748 "parsing/parser.ml" +# 47776 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 47754 "parsing/parser.ml" +# 47782 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47789,14 +47817,14 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2810 "parsing/parser.mly" +# 2814 "parsing/parser.mly" ( xs ) -# 47795 "parsing/parser.ml" +# 47823 "parsing/parser.ml" in -# 2540 "parsing/parser.mly" +# 2544 "parsing/parser.mly" ( Pexp_override _2 ) -# 47800 "parsing/parser.ml" +# 47828 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -47804,15 +47832,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 47810 "parsing/parser.ml" +# 47838 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 47816 "parsing/parser.ml" +# 47844 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47851,16 +47879,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2810 "parsing/parser.mly" +# 2814 "parsing/parser.mly" ( xs ) -# 47857 "parsing/parser.ml" +# 47885 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2542 "parsing/parser.mly" +# 2546 "parsing/parser.mly" ( unclosed "{<" _loc__1_ ">}" _loc__3_ ) -# 47864 "parsing/parser.ml" +# 47892 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -47868,15 +47896,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 47874 "parsing/parser.ml" +# 47902 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 47880 "parsing/parser.ml" +# 47908 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47907,24 +47935,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2544 "parsing/parser.mly" +# 2548 "parsing/parser.mly" ( Pexp_override [] ) -# 47913 "parsing/parser.ml" +# 47941 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 47922 "parsing/parser.ml" +# 47950 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 47928 "parsing/parser.ml" +# 47956 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -47968,15 +47996,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 47974 "parsing/parser.ml" +# 48002 "parsing/parser.ml" in -# 2546 "parsing/parser.mly" +# 2550 "parsing/parser.mly" ( Pexp_field(_1, _3) ) -# 47980 "parsing/parser.ml" +# 48008 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -47984,15 +48012,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 47990 "parsing/parser.ml" +# 48018 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 47996 "parsing/parser.ml" +# 48024 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48050,24 +48078,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 48056 "parsing/parser.ml" +# 48084 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1676 "parsing/parser.mly" +# 1680 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 48065 "parsing/parser.ml" +# 48093 "parsing/parser.ml" in -# 2548 "parsing/parser.mly" +# 2552 "parsing/parser.mly" ( Pexp_open(od, _4) ) -# 48071 "parsing/parser.ml" +# 48099 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -48075,15 +48103,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48081 "parsing/parser.ml" +# 48109 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48087 "parsing/parser.ml" +# 48115 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48136,9 +48164,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2810 "parsing/parser.mly" +# 2814 "parsing/parser.mly" ( xs ) -# 48142 "parsing/parser.ml" +# 48170 "parsing/parser.ml" in let od = let _1 = @@ -48146,18 +48174,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 48152 "parsing/parser.ml" +# 48180 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1676 "parsing/parser.mly" +# 1680 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 48161 "parsing/parser.ml" +# 48189 "parsing/parser.ml" in let _startpos_od_ = _startpos__1_ in @@ -48165,10 +48193,10 @@ module Tables = struct let _symbolstartpos = _startpos_od_ in let _sloc = (_symbolstartpos, _endpos) in -# 2550 "parsing/parser.mly" +# 2554 "parsing/parser.mly" ( (* TODO: review the location of Pexp_override *) Pexp_open(od, mkexp ~loc:_sloc (Pexp_override _4)) ) -# 48172 "parsing/parser.ml" +# 48200 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -48176,15 +48204,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48182 "parsing/parser.ml" +# 48210 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48188 "parsing/parser.ml" +# 48216 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48237,16 +48265,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2810 "parsing/parser.mly" +# 2814 "parsing/parser.mly" ( xs ) -# 48243 "parsing/parser.ml" +# 48271 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2553 "parsing/parser.mly" +# 2557 "parsing/parser.mly" ( unclosed "{<" _loc__3_ ">}" _loc__5_ ) -# 48250 "parsing/parser.ml" +# 48278 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -48254,15 +48282,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48260 "parsing/parser.ml" +# 48288 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48266 "parsing/parser.ml" +# 48294 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48293,9 +48321,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 48299 "parsing/parser.ml" +# 48327 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in @@ -48307,23 +48335,23 @@ module Tables = struct let _3 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 48313 "parsing/parser.ml" +# 48341 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 48321 "parsing/parser.ml" +# 48349 "parsing/parser.ml" in -# 2555 "parsing/parser.mly" +# 2559 "parsing/parser.mly" ( Pexp_send(_1, _3) ) -# 48327 "parsing/parser.ml" +# 48355 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -48331,15 +48359,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48337 "parsing/parser.ml" +# 48365 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48343 "parsing/parser.ml" +# 48371 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48371,9 +48399,9 @@ module Tables = struct } = _menhir_stack in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined1 : ( -# 809 "parsing/parser.mly" +# 813 "parsing/parser.mly" (string) -# 48377 "parsing/parser.ml" +# 48405 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -48387,15 +48415,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 983 "parsing/parser.mly" +# 987 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 48393 "parsing/parser.ml" +# 48421 "parsing/parser.ml" in -# 2557 "parsing/parser.mly" +# 2561 "parsing/parser.mly" ( mkinfix _1 _2 _3 ) -# 48399 "parsing/parser.ml" +# 48427 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -48403,15 +48431,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48409 "parsing/parser.ml" +# 48437 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48415 "parsing/parser.ml" +# 48443 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48435,23 +48463,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2559 "parsing/parser.mly" +# 2563 "parsing/parser.mly" ( Pexp_extension _1 ) -# 48441 "parsing/parser.ml" +# 48469 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48449 "parsing/parser.ml" +# 48477 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48455 "parsing/parser.ml" +# 48483 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48499,18 +48527,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in let _1 = -# 2560 "parsing/parser.mly" +# 2564 "parsing/parser.mly" (Lident "()") -# 48505 "parsing/parser.ml" +# 48533 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 48514 "parsing/parser.ml" +# 48542 "parsing/parser.ml" in let (_endpos__3_, _startpos__3_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in @@ -48520,25 +48548,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 48526 "parsing/parser.ml" +# 48554 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1676 "parsing/parser.mly" +# 1680 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 48535 "parsing/parser.ml" +# 48563 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2561 "parsing/parser.mly" +# 2565 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:(_loc__3_) (Pexp_construct(_3, None))) ) -# 48542 "parsing/parser.ml" +# 48570 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -48546,15 +48574,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48552 "parsing/parser.ml" +# 48580 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48558 "parsing/parser.ml" +# 48586 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48609,9 +48637,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2563 "parsing/parser.mly" +# 2567 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 48615 "parsing/parser.ml" +# 48643 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -48619,15 +48647,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48625 "parsing/parser.ml" +# 48653 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48631 "parsing/parser.ml" +# 48659 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48666,25 +48694,25 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2565 "parsing/parser.mly" +# 2569 "parsing/parser.mly" ( let (exten, fields) = _2 in Pexp_record(fields, exten) ) -# 48673 "parsing/parser.ml" +# 48701 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48682 "parsing/parser.ml" +# 48710 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48688 "parsing/parser.ml" +# 48716 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48726,9 +48754,9 @@ module Tables = struct let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2568 "parsing/parser.mly" +# 2572 "parsing/parser.mly" ( unclosed "{" _loc__1_ "}" _loc__3_ ) -# 48732 "parsing/parser.ml" +# 48760 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -48736,15 +48764,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48742 "parsing/parser.ml" +# 48770 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48748 "parsing/parser.ml" +# 48776 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48803,27 +48831,27 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 48809 "parsing/parser.ml" +# 48837 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1676 "parsing/parser.mly" +# 1680 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 48818 "parsing/parser.ml" +# 48846 "parsing/parser.ml" in let _endpos = _endpos__5_ in -# 2570 "parsing/parser.mly" +# 2574 "parsing/parser.mly" ( let (exten, fields) = _4 in Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) (Pexp_record(fields, exten))) ) -# 48827 "parsing/parser.ml" +# 48855 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -48831,15 +48859,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48837 "parsing/parser.ml" +# 48865 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48843 "parsing/parser.ml" +# 48871 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48895,9 +48923,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2574 "parsing/parser.mly" +# 2578 "parsing/parser.mly" ( unclosed "{" _loc__3_ "}" _loc__5_ ) -# 48901 "parsing/parser.ml" +# 48929 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -48905,15 +48933,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48911 "parsing/parser.ml" +# 48939 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48917 "parsing/parser.ml" +# 48945 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -48952,14 +48980,14 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 48958 "parsing/parser.ml" +# 48986 "parsing/parser.ml" in -# 2576 "parsing/parser.mly" +# 2580 "parsing/parser.mly" ( Pexp_array(_2) ) -# 48963 "parsing/parser.ml" +# 48991 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -48967,15 +48995,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 48973 "parsing/parser.ml" +# 49001 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 48979 "parsing/parser.ml" +# 49007 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49014,16 +49042,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 49020 "parsing/parser.ml" +# 49048 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2578 "parsing/parser.mly" +# 2582 "parsing/parser.mly" ( unclosed "[|" _loc__1_ "|]" _loc__3_ ) -# 49027 "parsing/parser.ml" +# 49055 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -49031,15 +49059,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49037 "parsing/parser.ml" +# 49065 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 49043 "parsing/parser.ml" +# 49071 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49070,24 +49098,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2580 "parsing/parser.mly" +# 2584 "parsing/parser.mly" ( Pexp_array [] ) -# 49076 "parsing/parser.ml" +# 49104 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49085 "parsing/parser.ml" +# 49113 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 49091 "parsing/parser.ml" +# 49119 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49140,9 +49168,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 49146 "parsing/parser.ml" +# 49174 "parsing/parser.ml" in let od = let _1 = @@ -49150,25 +49178,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 49156 "parsing/parser.ml" +# 49184 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1676 "parsing/parser.mly" +# 1680 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 49165 "parsing/parser.ml" +# 49193 "parsing/parser.ml" in let _endpos = _endpos__5_ in -# 2582 "parsing/parser.mly" +# 2586 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) (Pexp_array(_4))) ) -# 49172 "parsing/parser.ml" +# 49200 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -49176,15 +49204,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49182 "parsing/parser.ml" +# 49210 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 49188 "parsing/parser.ml" +# 49216 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49235,26 +49263,26 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 49241 "parsing/parser.ml" +# 49269 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1676 "parsing/parser.mly" +# 1680 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 49250 "parsing/parser.ml" +# 49278 "parsing/parser.ml" in let _endpos = _endpos__4_ in -# 2584 "parsing/parser.mly" +# 2588 "parsing/parser.mly" ( (* TODO: review the location of Pexp_array *) Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) (Pexp_array [])) ) -# 49258 "parsing/parser.ml" +# 49286 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -49262,15 +49290,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49268 "parsing/parser.ml" +# 49296 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 49274 "parsing/parser.ml" +# 49302 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49323,16 +49351,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 49329 "parsing/parser.ml" +# 49357 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2588 "parsing/parser.mly" +# 2592 "parsing/parser.mly" ( unclosed "[|" _loc__3_ "|]" _loc__5_ ) -# 49336 "parsing/parser.ml" +# 49364 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -49340,15 +49368,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49346 "parsing/parser.ml" +# 49374 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 49352 "parsing/parser.ml" +# 49380 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49387,15 +49415,15 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 49393 "parsing/parser.ml" +# 49421 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2590 "parsing/parser.mly" +# 2594 "parsing/parser.mly" ( fst (mktailexp _loc__3_ _2) ) -# 49399 "parsing/parser.ml" +# 49427 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -49403,15 +49431,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49409 "parsing/parser.ml" +# 49437 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 49415 "parsing/parser.ml" +# 49443 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49450,16 +49478,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 49456 "parsing/parser.ml" +# 49484 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2592 "parsing/parser.mly" +# 2596 "parsing/parser.mly" ( unclosed "[" _loc__1_ "]" _loc__3_ ) -# 49463 "parsing/parser.ml" +# 49491 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -49467,15 +49495,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49473 "parsing/parser.ml" +# 49501 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 49479 "parsing/parser.ml" +# 49507 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49528,9 +49556,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 49534 "parsing/parser.ml" +# 49562 "parsing/parser.ml" in let od = let _1 = @@ -49538,30 +49566,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 49544 "parsing/parser.ml" +# 49572 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1676 "parsing/parser.mly" +# 1680 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 49553 "parsing/parser.ml" +# 49581 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _loc__5_ = (_startpos__5_, _endpos__5_) in -# 2594 "parsing/parser.mly" +# 2598 "parsing/parser.mly" ( let list_exp = (* TODO: review the location of list_exp *) let tail_exp, _tail_loc = mktailexp _loc__5_ _4 in mkexp ~loc:(_startpos__3_, _endpos) tail_exp in Pexp_open(od, list_exp) ) -# 49565 "parsing/parser.ml" +# 49593 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -49569,15 +49597,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49575 "parsing/parser.ml" +# 49603 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 49581 "parsing/parser.ml" +# 49609 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49625,18 +49653,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in let _1 = -# 2599 "parsing/parser.mly" +# 2603 "parsing/parser.mly" (Lident "[]") -# 49631 "parsing/parser.ml" +# 49659 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 49640 "parsing/parser.ml" +# 49668 "parsing/parser.ml" in let (_endpos__3_, _startpos__3_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in @@ -49646,25 +49674,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 49652 "parsing/parser.ml" +# 49680 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1676 "parsing/parser.mly" +# 1680 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 49661 "parsing/parser.ml" +# 49689 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2600 "parsing/parser.mly" +# 2604 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:_loc__3_ (Pexp_construct(_3, None))) ) -# 49668 "parsing/parser.ml" +# 49696 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -49672,15 +49700,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49678 "parsing/parser.ml" +# 49706 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 49684 "parsing/parser.ml" +# 49712 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49733,16 +49761,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2827 "parsing/parser.mly" +# 2831 "parsing/parser.mly" ( es ) -# 49739 "parsing/parser.ml" +# 49767 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2603 "parsing/parser.mly" +# 2607 "parsing/parser.mly" ( unclosed "[" _loc__3_ "]" _loc__5_ ) -# 49746 "parsing/parser.ml" +# 49774 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -49750,15 +49778,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49756 "parsing/parser.ml" +# 49784 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 49762 "parsing/parser.ml" +# 49790 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -49851,11 +49879,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 49859 "parsing/parser.ml" +# 49887 "parsing/parser.ml" in let _5 = @@ -49863,15 +49891,15 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 49869 "parsing/parser.ml" +# 49897 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 49875 "parsing/parser.ml" +# 49903 "parsing/parser.ml" in let od = @@ -49880,18 +49908,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 49886 "parsing/parser.ml" +# 49914 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1676 "parsing/parser.mly" +# 1680 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 49895 "parsing/parser.ml" +# 49923 "parsing/parser.ml" in let _startpos_od_ = _startpos__1_ in @@ -49899,12 +49927,12 @@ module Tables = struct let _symbolstartpos = _startpos_od_ in let _sloc = (_symbolstartpos, _endpos) in -# 2606 "parsing/parser.mly" +# 2610 "parsing/parser.mly" ( let modexp = mkexp_attrs ~loc:(_startpos__3_, _endpos) (Pexp_constraint (ghexp ~loc:_sloc (Pexp_pack _6), _8)) _5 in Pexp_open(od, modexp) ) -# 49908 "parsing/parser.ml" +# 49936 "parsing/parser.ml" in let _endpos__1_ = _endpos__9_ in @@ -49912,15 +49940,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 49918 "parsing/parser.ml" +# 49946 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 49924 "parsing/parser.ml" +# 49952 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50005,23 +50033,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 50011 "parsing/parser.ml" +# 50039 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 50017 "parsing/parser.ml" +# 50045 "parsing/parser.ml" in let _loc__8_ = (_startpos__8_, _endpos__8_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2612 "parsing/parser.mly" +# 2616 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__8_ ) -# 50025 "parsing/parser.ml" +# 50053 "parsing/parser.ml" in let _endpos__1_ = _endpos__8_ in @@ -50029,15 +50057,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 989 "parsing/parser.mly" +# 993 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 50035 "parsing/parser.ml" +# 50063 "parsing/parser.ml" in -# 2504 "parsing/parser.mly" +# 2508 "parsing/parser.mly" ( _1 ) -# 50041 "parsing/parser.ml" +# 50069 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50066,30 +50094,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50072 "parsing/parser.ml" +# 50100 "parsing/parser.ml" in -# 2910 "parsing/parser.mly" +# 2914 "parsing/parser.mly" ( Ppat_var (_1) ) -# 50078 "parsing/parser.ml" +# 50106 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 50087 "parsing/parser.ml" +# 50115 "parsing/parser.ml" in -# 2911 "parsing/parser.mly" +# 2915 "parsing/parser.mly" ( _1 ) -# 50093 "parsing/parser.ml" +# 50121 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50112,9 +50140,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2912 "parsing/parser.mly" +# 2916 "parsing/parser.mly" ( _1 ) -# 50118 "parsing/parser.ml" +# 50146 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50154,9 +50182,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2917 "parsing/parser.mly" +# 2921 "parsing/parser.mly" ( reloc_pat ~loc:_sloc _2 ) -# 50160 "parsing/parser.ml" +# 50188 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50179,9 +50207,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2919 "parsing/parser.mly" +# 2923 "parsing/parser.mly" ( _1 ) -# 50185 "parsing/parser.ml" +# 50213 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50244,9 +50272,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50250 "parsing/parser.ml" +# 50278 "parsing/parser.ml" in let _3 = @@ -50254,24 +50282,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 50260 "parsing/parser.ml" +# 50288 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 50266 "parsing/parser.ml" +# 50294 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2921 "parsing/parser.mly" +# 2925 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_unpack _4) _3 ) -# 50275 "parsing/parser.ml" +# 50303 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50348,11 +50376,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 50356 "parsing/parser.ml" +# 50384 "parsing/parser.ml" in let _4 = @@ -50361,9 +50389,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50367 "parsing/parser.ml" +# 50395 "parsing/parser.ml" in let (_endpos__4_, _startpos__4_) = (_endpos__1_inlined3_, _startpos__1_inlined3_) in @@ -50372,15 +50400,15 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 50378 "parsing/parser.ml" +# 50406 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 50384 "parsing/parser.ml" +# 50412 "parsing/parser.ml" in let _endpos = _endpos__7_ in @@ -50388,11 +50416,11 @@ module Tables = struct let _loc__4_ = (_startpos__4_, _endpos__4_) in let _sloc = (_symbolstartpos, _endpos) in -# 2923 "parsing/parser.mly" +# 2927 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_constraint(mkpat ~loc:_loc__4_ (Ppat_unpack _4), _6)) _3 ) -# 50396 "parsing/parser.ml" +# 50424 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50416,23 +50444,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2931 "parsing/parser.mly" +# 2935 "parsing/parser.mly" ( Ppat_any ) -# 50422 "parsing/parser.ml" +# 50450 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 50430 "parsing/parser.ml" +# 50458 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 50436 "parsing/parser.ml" +# 50464 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50456,23 +50484,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2933 "parsing/parser.mly" +# 2937 "parsing/parser.mly" ( Ppat_constant _1 ) -# 50462 "parsing/parser.ml" +# 50490 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 50470 "parsing/parser.ml" +# 50498 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 50476 "parsing/parser.ml" +# 50504 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50510,24 +50538,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2935 "parsing/parser.mly" +# 2939 "parsing/parser.mly" ( Ppat_interval (_1, _3) ) -# 50516 "parsing/parser.ml" +# 50544 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 50525 "parsing/parser.ml" +# 50553 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 50531 "parsing/parser.ml" +# 50559 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50556,30 +50584,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50562 "parsing/parser.ml" +# 50590 "parsing/parser.ml" in -# 2937 "parsing/parser.mly" +# 2941 "parsing/parser.mly" ( Ppat_construct(_1, None) ) -# 50568 "parsing/parser.ml" +# 50596 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 50577 "parsing/parser.ml" +# 50605 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 50583 "parsing/parser.ml" +# 50611 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50603,23 +50631,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2939 "parsing/parser.mly" +# 2943 "parsing/parser.mly" ( Ppat_variant(_1, None) ) -# 50609 "parsing/parser.ml" +# 50637 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 50617 "parsing/parser.ml" +# 50645 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 50623 "parsing/parser.ml" +# 50651 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50656,15 +50684,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50662 "parsing/parser.ml" +# 50690 "parsing/parser.ml" in -# 2941 "parsing/parser.mly" +# 2945 "parsing/parser.mly" ( Ppat_type (_2) ) -# 50668 "parsing/parser.ml" +# 50696 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -50672,15 +50700,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 50678 "parsing/parser.ml" +# 50706 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 50684 "parsing/parser.ml" +# 50712 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50723,15 +50751,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50729 "parsing/parser.ml" +# 50757 "parsing/parser.ml" in -# 2943 "parsing/parser.mly" +# 2947 "parsing/parser.mly" ( Ppat_open(_1, _3) ) -# 50735 "parsing/parser.ml" +# 50763 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -50739,15 +50767,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 50745 "parsing/parser.ml" +# 50773 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 50751 "parsing/parser.ml" +# 50779 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50795,18 +50823,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in let _1 = -# 2944 "parsing/parser.mly" +# 2948 "parsing/parser.mly" (Lident "[]") -# 50801 "parsing/parser.ml" +# 50829 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50810 "parsing/parser.ml" +# 50838 "parsing/parser.ml" in let _endpos__3_ = _endpos__2_inlined1_ in @@ -50815,18 +50843,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50821 "parsing/parser.ml" +# 50849 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2945 "parsing/parser.mly" +# 2949 "parsing/parser.mly" ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) -# 50830 "parsing/parser.ml" +# 50858 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -50834,15 +50862,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 50840 "parsing/parser.ml" +# 50868 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 50846 "parsing/parser.ml" +# 50874 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50890,18 +50918,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in let _1 = -# 2946 "parsing/parser.mly" +# 2950 "parsing/parser.mly" (Lident "()") -# 50896 "parsing/parser.ml" +# 50924 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50905 "parsing/parser.ml" +# 50933 "parsing/parser.ml" in let _endpos__3_ = _endpos__2_inlined1_ in @@ -50910,18 +50938,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 50916 "parsing/parser.ml" +# 50944 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2947 "parsing/parser.mly" +# 2951 "parsing/parser.mly" ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) -# 50925 "parsing/parser.ml" +# 50953 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -50929,15 +50957,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 50935 "parsing/parser.ml" +# 50963 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 50941 "parsing/parser.ml" +# 50969 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -50994,15 +51022,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 51000 "parsing/parser.ml" +# 51028 "parsing/parser.ml" in -# 2949 "parsing/parser.mly" +# 2953 "parsing/parser.mly" ( Ppat_open (_1, _4) ) -# 51006 "parsing/parser.ml" +# 51034 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -51010,15 +51038,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51016 "parsing/parser.ml" +# 51044 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 51022 "parsing/parser.ml" +# 51050 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51073,9 +51101,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2951 "parsing/parser.mly" +# 2955 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 51079 "parsing/parser.ml" +# 51107 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -51083,15 +51111,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51089 "parsing/parser.ml" +# 51117 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 51095 "parsing/parser.ml" +# 51123 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51138,9 +51166,9 @@ module Tables = struct let _1 = let _loc__4_ = (_startpos__4_, _endpos__4_) in -# 2953 "parsing/parser.mly" +# 2957 "parsing/parser.mly" ( expecting _loc__4_ "pattern" ) -# 51144 "parsing/parser.ml" +# 51172 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -51148,15 +51176,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51154 "parsing/parser.ml" +# 51182 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 51160 "parsing/parser.ml" +# 51188 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51197,9 +51225,9 @@ module Tables = struct let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2955 "parsing/parser.mly" +# 2959 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 51203 "parsing/parser.ml" +# 51231 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -51207,15 +51235,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51213 "parsing/parser.ml" +# 51241 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 51219 "parsing/parser.ml" +# 51247 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51267,24 +51295,24 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2957 "parsing/parser.mly" +# 2961 "parsing/parser.mly" ( Ppat_constraint(_2, _4) ) -# 51273 "parsing/parser.ml" +# 51301 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51282 "parsing/parser.ml" +# 51310 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 51288 "parsing/parser.ml" +# 51316 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51339,9 +51367,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2959 "parsing/parser.mly" +# 2963 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 51345 "parsing/parser.ml" +# 51373 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -51349,15 +51377,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51355 "parsing/parser.ml" +# 51383 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 51361 "parsing/parser.ml" +# 51389 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51404,9 +51432,9 @@ module Tables = struct let _1 = let _loc__4_ = (_startpos__4_, _endpos__4_) in -# 2961 "parsing/parser.mly" +# 2965 "parsing/parser.mly" ( expecting _loc__4_ "type" ) -# 51410 "parsing/parser.ml" +# 51438 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -51414,15 +51442,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51420 "parsing/parser.ml" +# 51448 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 51426 "parsing/parser.ml" +# 51454 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51501,11 +51529,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3642 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 51509 "parsing/parser.ml" +# 51537 "parsing/parser.ml" in let _3 = @@ -51513,23 +51541,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 51519 "parsing/parser.ml" +# 51547 "parsing/parser.ml" in -# 4071 "parsing/parser.mly" +# 4075 "parsing/parser.mly" ( _1, _2 ) -# 51525 "parsing/parser.ml" +# 51553 "parsing/parser.ml" in let _loc__7_ = (_startpos__7_, _endpos__7_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2964 "parsing/parser.mly" +# 2968 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__7_ ) -# 51533 "parsing/parser.ml" +# 51561 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -51537,15 +51565,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51543 "parsing/parser.ml" +# 51571 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 51549 "parsing/parser.ml" +# 51577 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51569,23 +51597,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2966 "parsing/parser.mly" +# 2970 "parsing/parser.mly" ( Ppat_extension _1 ) -# 51575 "parsing/parser.ml" +# 51603 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 991 "parsing/parser.mly" +# 995 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 51583 "parsing/parser.ml" +# 51611 "parsing/parser.ml" in -# 2927 "parsing/parser.mly" +# 2931 "parsing/parser.mly" ( _1 ) -# 51589 "parsing/parser.ml" +# 51617 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51604,17 +51632,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 51610 "parsing/parser.ml" +# 51638 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3979 "parsing/parser.mly" +# 3983 "parsing/parser.mly" ( _1 ) -# 51618 "parsing/parser.ml" +# 51646 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51633,17 +51661,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 825 "parsing/parser.mly" +# 829 "parsing/parser.mly" (string) -# 51639 "parsing/parser.ml" +# 51667 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3980 "parsing/parser.mly" +# 3984 "parsing/parser.mly" ( _1 ) -# 51647 "parsing/parser.ml" +# 51675 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51666,9 +51694,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3981 "parsing/parser.mly" +# 3985 "parsing/parser.mly" ( "and" ) -# 51672 "parsing/parser.ml" +# 51700 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51691,9 +51719,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3982 "parsing/parser.mly" +# 3986 "parsing/parser.mly" ( "as" ) -# 51697 "parsing/parser.ml" +# 51725 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51716,9 +51744,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3983 "parsing/parser.mly" +# 3987 "parsing/parser.mly" ( "assert" ) -# 51722 "parsing/parser.ml" +# 51750 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51741,9 +51769,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3984 "parsing/parser.mly" +# 3988 "parsing/parser.mly" ( "begin" ) -# 51747 "parsing/parser.ml" +# 51775 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51766,9 +51794,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3985 "parsing/parser.mly" +# 3989 "parsing/parser.mly" ( "class" ) -# 51772 "parsing/parser.ml" +# 51800 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51791,9 +51819,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3986 "parsing/parser.mly" +# 3990 "parsing/parser.mly" ( "constraint" ) -# 51797 "parsing/parser.ml" +# 51825 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51816,9 +51844,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3987 "parsing/parser.mly" +# 3991 "parsing/parser.mly" ( "do" ) -# 51822 "parsing/parser.ml" +# 51850 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51841,9 +51869,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3988 "parsing/parser.mly" +# 3992 "parsing/parser.mly" ( "done" ) -# 51847 "parsing/parser.ml" +# 51875 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51866,9 +51894,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3989 "parsing/parser.mly" +# 3993 "parsing/parser.mly" ( "downto" ) -# 51872 "parsing/parser.ml" +# 51900 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51891,9 +51919,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3990 "parsing/parser.mly" +# 3994 "parsing/parser.mly" ( "else" ) -# 51897 "parsing/parser.ml" +# 51925 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51916,9 +51944,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3991 "parsing/parser.mly" +# 3995 "parsing/parser.mly" ( "end" ) -# 51922 "parsing/parser.ml" +# 51950 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51941,9 +51969,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3992 "parsing/parser.mly" +# 3996 "parsing/parser.mly" ( "exception" ) -# 51947 "parsing/parser.ml" +# 51975 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51966,9 +51994,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3993 "parsing/parser.mly" +# 3997 "parsing/parser.mly" ( "external" ) -# 51972 "parsing/parser.ml" +# 52000 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -51991,9 +52019,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3994 "parsing/parser.mly" +# 3998 "parsing/parser.mly" ( "false" ) -# 51997 "parsing/parser.ml" +# 52025 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52016,9 +52044,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3995 "parsing/parser.mly" +# 3999 "parsing/parser.mly" ( "for" ) -# 52022 "parsing/parser.ml" +# 52050 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52041,9 +52069,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3996 "parsing/parser.mly" +# 4000 "parsing/parser.mly" ( "fun" ) -# 52047 "parsing/parser.ml" +# 52075 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52066,9 +52094,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3997 "parsing/parser.mly" +# 4001 "parsing/parser.mly" ( "function" ) -# 52072 "parsing/parser.ml" +# 52100 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52091,9 +52119,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3998 "parsing/parser.mly" +# 4002 "parsing/parser.mly" ( "functor" ) -# 52097 "parsing/parser.ml" +# 52125 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52116,9 +52144,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3999 "parsing/parser.mly" +# 4003 "parsing/parser.mly" ( "if" ) -# 52122 "parsing/parser.ml" +# 52150 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52141,9 +52169,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4000 "parsing/parser.mly" +# 4004 "parsing/parser.mly" ( "in" ) -# 52147 "parsing/parser.ml" +# 52175 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52166,9 +52194,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4001 "parsing/parser.mly" +# 4005 "parsing/parser.mly" ( "include" ) -# 52172 "parsing/parser.ml" +# 52200 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52191,9 +52219,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4002 "parsing/parser.mly" +# 4006 "parsing/parser.mly" ( "inherit" ) -# 52197 "parsing/parser.ml" +# 52225 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52216,9 +52244,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4003 "parsing/parser.mly" +# 4007 "parsing/parser.mly" ( "initializer" ) -# 52222 "parsing/parser.ml" +# 52250 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52241,9 +52269,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4004 "parsing/parser.mly" +# 4008 "parsing/parser.mly" ( "lazy" ) -# 52247 "parsing/parser.ml" +# 52275 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52266,9 +52294,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4005 "parsing/parser.mly" +# 4009 "parsing/parser.mly" ( "let" ) -# 52272 "parsing/parser.ml" +# 52300 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52291,9 +52319,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4006 "parsing/parser.mly" +# 4010 "parsing/parser.mly" ( "match" ) -# 52297 "parsing/parser.ml" +# 52325 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52316,9 +52344,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4007 "parsing/parser.mly" +# 4011 "parsing/parser.mly" ( "method" ) -# 52322 "parsing/parser.ml" +# 52350 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52341,9 +52369,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4008 "parsing/parser.mly" +# 4012 "parsing/parser.mly" ( "module" ) -# 52347 "parsing/parser.ml" +# 52375 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52366,9 +52394,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4009 "parsing/parser.mly" +# 4013 "parsing/parser.mly" ( "mutable" ) -# 52372 "parsing/parser.ml" +# 52400 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52391,9 +52419,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4010 "parsing/parser.mly" +# 4014 "parsing/parser.mly" ( "new" ) -# 52397 "parsing/parser.ml" +# 52425 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52416,9 +52444,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4011 "parsing/parser.mly" +# 4015 "parsing/parser.mly" ( "nonrec" ) -# 52422 "parsing/parser.ml" +# 52450 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52441,9 +52469,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4012 "parsing/parser.mly" +# 4016 "parsing/parser.mly" ( "object" ) -# 52447 "parsing/parser.ml" +# 52475 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52466,9 +52494,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4013 "parsing/parser.mly" +# 4017 "parsing/parser.mly" ( "of" ) -# 52472 "parsing/parser.ml" +# 52500 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52491,9 +52519,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4014 "parsing/parser.mly" +# 4018 "parsing/parser.mly" ( "open" ) -# 52497 "parsing/parser.ml" +# 52525 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52516,9 +52544,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4015 "parsing/parser.mly" +# 4019 "parsing/parser.mly" ( "or" ) -# 52522 "parsing/parser.ml" +# 52550 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52541,9 +52569,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4016 "parsing/parser.mly" +# 4020 "parsing/parser.mly" ( "private" ) -# 52547 "parsing/parser.ml" +# 52575 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52566,9 +52594,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4017 "parsing/parser.mly" +# 4021 "parsing/parser.mly" ( "rec" ) -# 52572 "parsing/parser.ml" +# 52600 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52591,9 +52619,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4018 "parsing/parser.mly" +# 4022 "parsing/parser.mly" ( "sig" ) -# 52597 "parsing/parser.ml" +# 52625 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52616,9 +52644,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4019 "parsing/parser.mly" +# 4023 "parsing/parser.mly" ( "struct" ) -# 52622 "parsing/parser.ml" +# 52650 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52641,9 +52669,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4020 "parsing/parser.mly" +# 4024 "parsing/parser.mly" ( "then" ) -# 52647 "parsing/parser.ml" +# 52675 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52666,9 +52694,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4021 "parsing/parser.mly" +# 4025 "parsing/parser.mly" ( "to" ) -# 52672 "parsing/parser.ml" +# 52700 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52691,9 +52719,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4022 "parsing/parser.mly" +# 4026 "parsing/parser.mly" ( "true" ) -# 52697 "parsing/parser.ml" +# 52725 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52716,9 +52744,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4023 "parsing/parser.mly" +# 4027 "parsing/parser.mly" ( "try" ) -# 52722 "parsing/parser.ml" +# 52750 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52741,9 +52769,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4024 "parsing/parser.mly" +# 4028 "parsing/parser.mly" ( "type" ) -# 52747 "parsing/parser.ml" +# 52775 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52766,9 +52794,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4025 "parsing/parser.mly" +# 4029 "parsing/parser.mly" ( "val" ) -# 52772 "parsing/parser.ml" +# 52800 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52791,9 +52819,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4026 "parsing/parser.mly" +# 4030 "parsing/parser.mly" ( "virtual" ) -# 52797 "parsing/parser.ml" +# 52825 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52816,9 +52844,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4027 "parsing/parser.mly" +# 4031 "parsing/parser.mly" ( "when" ) -# 52822 "parsing/parser.ml" +# 52850 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52841,9 +52869,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4028 "parsing/parser.mly" +# 4032 "parsing/parser.mly" ( "while" ) -# 52847 "parsing/parser.ml" +# 52875 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52866,9 +52894,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 4029 "parsing/parser.mly" +# 4033 "parsing/parser.mly" ( "with" ) -# 52872 "parsing/parser.ml" +# 52900 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52891,9 +52919,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.type_exception * string Asttypes.loc option) = -# 3245 "parsing/parser.mly" +# 3249 "parsing/parser.mly" ( _1 ) -# 52897 "parsing/parser.ml" +# 52925 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -52967,18 +52995,18 @@ module Tables = struct let _v : (Parsetree.type_exception * string Asttypes.loc option) = let attrs = let _1 = _1_inlined5 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 52973 "parsing/parser.ml" +# 53001 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined5_ in let attrs2 = let _1 = _1_inlined4 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 52982 "parsing/parser.ml" +# 53010 "parsing/parser.ml" in let lid = @@ -52987,9 +53015,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 52993 "parsing/parser.ml" +# 53021 "parsing/parser.ml" in let id = @@ -52998,30 +53026,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 53004 "parsing/parser.ml" +# 53032 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 53012 "parsing/parser.ml" +# 53040 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3254 "parsing/parser.mly" +# 3258 "parsing/parser.mly" ( let loc = make_loc _sloc in let docs = symbol_docs _sloc in Te.mk_exception ~attrs (Te.rebind id lid ~attrs:(attrs1 @ attrs2) ~loc ~docs) , ext ) -# 53025 "parsing/parser.ml" +# 53053 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53051,9 +53079,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2731 "parsing/parser.mly" +# 2735 "parsing/parser.mly" ( _2 ) -# 53057 "parsing/parser.ml" +# 53085 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53100,10 +53128,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2733 "parsing/parser.mly" +# 2737 "parsing/parser.mly" ( ghexp ~loc:_sloc (mkfunction _1 _2 _4) ) -# 53107 "parsing/parser.ml" +# 53135 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53130,39 +53158,39 @@ module Tables = struct let ys = # 260 "" ( List.flatten xss ) -# 53134 "parsing/parser.ml" +# 53162 "parsing/parser.ml" in let xs = let items = -# 1026 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( [] ) -# 53140 "parsing/parser.ml" +# 53168 "parsing/parser.ml" in -# 1477 "parsing/parser.mly" +# 1481 "parsing/parser.mly" ( items ) -# 53145 "parsing/parser.ml" +# 53173 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 53151 "parsing/parser.ml" +# 53179 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 948 "parsing/parser.mly" +# 952 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 53160 "parsing/parser.ml" +# 53188 "parsing/parser.ml" in -# 1470 "parsing/parser.mly" +# 1474 "parsing/parser.mly" ( _1 ) -# 53166 "parsing/parser.ml" +# 53194 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53203,7 +53231,7 @@ module Tables = struct let ys = # 260 "" ( List.flatten xss ) -# 53207 "parsing/parser.ml" +# 53235 "parsing/parser.ml" in let xs = let items = @@ -53211,65 +53239,65 @@ module Tables = struct let _1 = let _1 = let attrs = -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 53217 "parsing/parser.ml" +# 53245 "parsing/parser.ml" in -# 1484 "parsing/parser.mly" +# 1488 "parsing/parser.mly" ( mkstrexp e attrs ) -# 53222 "parsing/parser.ml" +# 53250 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 960 "parsing/parser.mly" +# 964 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 53230 "parsing/parser.ml" +# 53258 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 979 "parsing/parser.mly" +# 983 "parsing/parser.mly" ( mark_rhs_docs _startpos _endpos; _1 ) -# 53240 "parsing/parser.ml" +# 53268 "parsing/parser.ml" in -# 1028 "parsing/parser.mly" +# 1032 "parsing/parser.mly" ( x ) -# 53246 "parsing/parser.ml" +# 53274 "parsing/parser.ml" in -# 1477 "parsing/parser.mly" +# 1481 "parsing/parser.mly" ( items ) -# 53252 "parsing/parser.ml" +# 53280 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 53258 "parsing/parser.ml" +# 53286 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_e_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 948 "parsing/parser.mly" +# 952 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 53267 "parsing/parser.ml" +# 53295 "parsing/parser.ml" in -# 1470 "parsing/parser.mly" +# 1474 "parsing/parser.mly" ( _1 ) -# 53273 "parsing/parser.ml" +# 53301 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53295,9 +53323,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1499 "parsing/parser.mly" +# 1503 "parsing/parser.mly" ( val_of_let_bindings ~loc:_sloc _1 ) -# 53301 "parsing/parser.ml" +# 53329 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53331,9 +53359,9 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 53337 "parsing/parser.ml" +# 53365 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -53341,10 +53369,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1502 "parsing/parser.mly" +# 1506 "parsing/parser.mly" ( let docs = symbol_docs _sloc in Pstr_extension (_1, add_docs_attrs docs _2) ) -# 53348 "parsing/parser.ml" +# 53376 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -53352,15 +53380,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 995 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkstr ~loc:_sloc _1 ) -# 53358 "parsing/parser.ml" +# 53386 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 53364 "parsing/parser.ml" +# 53392 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53384,23 +53412,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1505 "parsing/parser.mly" +# 1509 "parsing/parser.mly" ( Pstr_attribute _1 ) -# 53390 "parsing/parser.ml" +# 53418 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 995 "parsing/parser.mly" +# 999 "parsing/parser.mly" ( mkstr ~loc:_sloc _1 ) -# 53398 "parsing/parser.ml" +# 53426 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 53404 "parsing/parser.ml" +# 53432 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53424,23 +53452,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1509 "parsing/parser.mly" +# 1513 "parsing/parser.mly" ( pstr_primitive _1 ) -# 53430 "parsing/parser.ml" +# 53458 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 53438 "parsing/parser.ml" +# 53466 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 53444 "parsing/parser.ml" +# 53472 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53464,23 +53492,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1511 "parsing/parser.mly" +# 1515 "parsing/parser.mly" ( pstr_primitive _1 ) -# 53470 "parsing/parser.ml" +# 53498 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 53478 "parsing/parser.ml" +# 53506 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 53484 "parsing/parser.ml" +# 53512 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53515,26 +53543,26 @@ module Tables = struct let _1 = let _1 = let _1 = -# 1208 "parsing/parser.mly" +# 1212 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 53521 "parsing/parser.ml" +# 53549 "parsing/parser.ml" in -# 3089 "parsing/parser.mly" +# 3093 "parsing/parser.mly" ( _1 ) -# 53526 "parsing/parser.ml" +# 53554 "parsing/parser.ml" in -# 3072 "parsing/parser.mly" +# 3076 "parsing/parser.mly" ( _1 ) -# 53532 "parsing/parser.ml" +# 53560 "parsing/parser.ml" in -# 1513 "parsing/parser.mly" +# 1517 "parsing/parser.mly" ( pstr_type _1 ) -# 53538 "parsing/parser.ml" +# 53566 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in @@ -53542,15 +53570,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 53548 "parsing/parser.ml" +# 53576 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 53554 "parsing/parser.ml" +# 53582 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53635,16 +53663,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 53641 "parsing/parser.ml" +# 53669 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let cs = -# 1200 "parsing/parser.mly" +# 1204 "parsing/parser.mly" ( List.rev xs ) -# 53648 "parsing/parser.ml" +# 53676 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -53652,46 +53680,46 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 53658 "parsing/parser.ml" +# 53686 "parsing/parser.ml" in let _4 = -# 3899 "parsing/parser.mly" +# 3903 "parsing/parser.mly" ( Recursive ) -# 53664 "parsing/parser.ml" +# 53692 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 53671 "parsing/parser.ml" +# 53699 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3342 "parsing/parser.mly" +# 3346 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in Te.mk tid cs ~params ~priv ~attrs ~docs, ext ) -# 53683 "parsing/parser.ml" +# 53711 "parsing/parser.ml" in -# 3325 "parsing/parser.mly" +# 3329 "parsing/parser.mly" ( _1 ) -# 53689 "parsing/parser.ml" +# 53717 "parsing/parser.ml" in -# 1515 "parsing/parser.mly" +# 1519 "parsing/parser.mly" ( pstr_typext _1 ) -# 53695 "parsing/parser.ml" +# 53723 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -53699,15 +53727,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 53705 "parsing/parser.ml" +# 53733 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 53711 "parsing/parser.ml" +# 53739 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53799,16 +53827,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 53805 "parsing/parser.ml" +# 53833 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in let cs = -# 1200 "parsing/parser.mly" +# 1204 "parsing/parser.mly" ( List.rev xs ) -# 53812 "parsing/parser.ml" +# 53840 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in @@ -53816,9 +53844,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 53822 "parsing/parser.ml" +# 53850 "parsing/parser.ml" in let _4 = @@ -53827,41 +53855,41 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3901 "parsing/parser.mly" +# 3905 "parsing/parser.mly" ( not_expecting _loc "nonrec flag" ) -# 53833 "parsing/parser.ml" +# 53861 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 53841 "parsing/parser.ml" +# 53869 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3342 "parsing/parser.mly" +# 3346 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in Te.mk tid cs ~params ~priv ~attrs ~docs, ext ) -# 53853 "parsing/parser.ml" +# 53881 "parsing/parser.ml" in -# 3325 "parsing/parser.mly" +# 3329 "parsing/parser.mly" ( _1 ) -# 53859 "parsing/parser.ml" +# 53887 "parsing/parser.ml" in -# 1515 "parsing/parser.mly" +# 1519 "parsing/parser.mly" ( pstr_typext _1 ) -# 53865 "parsing/parser.ml" +# 53893 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -53869,15 +53897,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 53875 "parsing/parser.ml" +# 53903 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 53881 "parsing/parser.ml" +# 53909 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53901,23 +53929,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1517 "parsing/parser.mly" +# 1521 "parsing/parser.mly" ( pstr_exception _1 ) -# 53907 "parsing/parser.ml" +# 53935 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 53915 "parsing/parser.ml" +# 53943 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 53921 "parsing/parser.ml" +# 53949 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -53980,9 +54008,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 53986 "parsing/parser.ml" +# 54014 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -53992,36 +54020,36 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 53998 "parsing/parser.ml" +# 54026 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 54006 "parsing/parser.ml" +# 54034 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1543 "parsing/parser.mly" +# 1547 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let loc = make_loc _sloc in let attrs = attrs1 @ attrs2 in let body = Mb.mk name body ~attrs ~loc ~docs in Pstr_module body, ext ) -# 54019 "parsing/parser.ml" +# 54047 "parsing/parser.ml" in -# 1519 "parsing/parser.mly" +# 1523 "parsing/parser.mly" ( _1 ) -# 54025 "parsing/parser.ml" +# 54053 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -54029,15 +54057,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 54035 "parsing/parser.ml" +# 54063 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 54041 "parsing/parser.ml" +# 54069 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54116,9 +54144,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 54122 "parsing/parser.ml" +# 54150 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -54128,24 +54156,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 54134 "parsing/parser.ml" +# 54162 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 54142 "parsing/parser.ml" +# 54170 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1580 "parsing/parser.mly" +# 1584 "parsing/parser.mly" ( let loc = make_loc _sloc in let attrs = attrs1 @ attrs2 in @@ -54153,25 +54181,25 @@ module Tables = struct ext, Mb.mk name body ~attrs ~loc ~docs ) -# 54157 "parsing/parser.ml" +# 54185 "parsing/parser.ml" in -# 1208 "parsing/parser.mly" +# 1212 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 54163 "parsing/parser.ml" +# 54191 "parsing/parser.ml" in -# 1568 "parsing/parser.mly" +# 1572 "parsing/parser.mly" ( _1 ) -# 54169 "parsing/parser.ml" +# 54197 "parsing/parser.ml" in -# 1521 "parsing/parser.mly" +# 1525 "parsing/parser.mly" ( pstr_recmodule _1 ) -# 54175 "parsing/parser.ml" +# 54203 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -54179,15 +54207,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 54185 "parsing/parser.ml" +# 54213 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 54191 "parsing/parser.ml" +# 54219 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54211,23 +54239,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1523 "parsing/parser.mly" +# 1527 "parsing/parser.mly" ( let (body, ext) = _1 in (Pstr_modtype body, ext) ) -# 54217 "parsing/parser.ml" +# 54245 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 54225 "parsing/parser.ml" +# 54253 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 54231 "parsing/parser.ml" +# 54259 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54251,23 +54279,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1525 "parsing/parser.mly" +# 1529 "parsing/parser.mly" ( let (body, ext) = _1 in (Pstr_open body, ext) ) -# 54257 "parsing/parser.ml" +# 54285 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 54265 "parsing/parser.ml" +# 54293 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 54271 "parsing/parser.ml" +# 54299 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54337,9 +54365,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in let body : (Parsetree.class_expr) = Obj.magic body in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 54343 "parsing/parser.ml" +# 54371 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -54357,9 +54385,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 54363 "parsing/parser.ml" +# 54391 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -54369,24 +54397,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 54375 "parsing/parser.ml" +# 54403 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 54383 "parsing/parser.ml" +# 54411 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1924 "parsing/parser.mly" +# 1928 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -54394,25 +54422,25 @@ module Tables = struct ext, Ci.mk id body ~virt ~params ~attrs ~loc ~docs ) -# 54398 "parsing/parser.ml" +# 54426 "parsing/parser.ml" in -# 1208 "parsing/parser.mly" +# 1212 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 54404 "parsing/parser.ml" +# 54432 "parsing/parser.ml" in -# 1913 "parsing/parser.mly" +# 1917 "parsing/parser.mly" ( _1 ) -# 54410 "parsing/parser.ml" +# 54438 "parsing/parser.ml" in -# 1527 "parsing/parser.mly" +# 1531 "parsing/parser.mly" ( let (ext, l) = _1 in (Pstr_class l, ext) ) -# 54416 "parsing/parser.ml" +# 54444 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -54420,15 +54448,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 54426 "parsing/parser.ml" +# 54454 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 54432 "parsing/parser.ml" +# 54460 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54452,23 +54480,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1529 "parsing/parser.mly" +# 1533 "parsing/parser.mly" ( let (ext, l) = _1 in (Pstr_class_type l, ext) ) -# 54458 "parsing/parser.ml" +# 54486 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 54466 "parsing/parser.ml" +# 54494 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 54472 "parsing/parser.ml" +# 54500 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54524,38 +54552,38 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 54530 "parsing/parser.ml" +# 54558 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 54539 "parsing/parser.ml" +# 54567 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1617 "parsing/parser.mly" +# 1621 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Incl.mk thing ~attrs ~loc ~docs, ext ) -# 54553 "parsing/parser.ml" +# 54581 "parsing/parser.ml" in -# 1531 "parsing/parser.mly" +# 1535 "parsing/parser.mly" ( pstr_include _1 ) -# 54559 "parsing/parser.ml" +# 54587 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined2_ in @@ -54563,15 +54591,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1012 "parsing/parser.mly" +# 1016 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 54569 "parsing/parser.ml" +# 54597 "parsing/parser.ml" in -# 1533 "parsing/parser.mly" +# 1537 "parsing/parser.mly" ( _1 ) -# 54575 "parsing/parser.ml" +# 54603 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54594,9 +54622,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3964 "parsing/parser.mly" +# 3968 "parsing/parser.mly" ( "-" ) -# 54600 "parsing/parser.ml" +# 54628 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54619,9 +54647,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3965 "parsing/parser.mly" +# 3969 "parsing/parser.mly" ( "-." ) -# 54625 "parsing/parser.ml" +# 54653 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54674,9 +54702,9 @@ module Tables = struct let _v : (Parsetree.row_field) = let _5 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 54680 "parsing/parser.ml" +# 54708 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined1_ in @@ -54685,18 +54713,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 54689 "parsing/parser.ml" +# 54717 "parsing/parser.ml" in -# 1111 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( xs ) -# 54694 "parsing/parser.ml" +# 54722 "parsing/parser.ml" in -# 3672 "parsing/parser.mly" +# 3676 "parsing/parser.mly" ( _1 ) -# 54700 "parsing/parser.ml" +# 54728 "parsing/parser.ml" in let _1 = @@ -54704,20 +54732,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 54710 "parsing/parser.ml" +# 54738 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3658 "parsing/parser.mly" +# 3662 "parsing/parser.mly" ( let info = symbol_info _endpos in let attrs = add_info_attrs info _5 in Rf.tag ~loc:(make_loc _sloc) ~attrs _1 _3 _4 ) -# 54721 "parsing/parser.ml" +# 54749 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54749,9 +54777,9 @@ module Tables = struct let _v : (Parsetree.row_field) = let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 54755 "parsing/parser.ml" +# 54783 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -54760,20 +54788,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 54766 "parsing/parser.ml" +# 54794 "parsing/parser.ml" in let _endpos = _endpos__2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3662 "parsing/parser.mly" +# 3666 "parsing/parser.mly" ( let info = symbol_info _endpos in let attrs = add_info_attrs info _2 in Rf.tag ~loc:(make_loc _sloc) ~attrs _1 true [] ) -# 54777 "parsing/parser.ml" +# 54805 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54805,7 +54833,7 @@ module Tables = struct let _v : (Parsetree.toplevel_phrase) = let arg = # 124 "" ( None ) -# 54809 "parsing/parser.ml" +# 54837 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined1_ in let dir = @@ -54814,18 +54842,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 54820 "parsing/parser.ml" +# 54848 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3862 "parsing/parser.mly" +# 3866 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 54829 "parsing/parser.ml" +# 54857 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54856,9 +54884,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : ( -# 812 "parsing/parser.mly" +# 816 "parsing/parser.mly" (string * Location.t * string option) -# 54862 "parsing/parser.ml" +# 54890 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in @@ -54869,23 +54897,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3866 "parsing/parser.mly" +# 3870 "parsing/parser.mly" ( let (s, _, _) = _1 in Pdir_string s ) -# 54875 "parsing/parser.ml" +# 54903 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1021 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 54883 "parsing/parser.ml" +# 54911 "parsing/parser.ml" in # 126 "" ( Some x ) -# 54889 "parsing/parser.ml" +# 54917 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -54895,18 +54923,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 54901 "parsing/parser.ml" +# 54929 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3862 "parsing/parser.mly" +# 3866 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 54910 "parsing/parser.ml" +# 54938 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -54937,9 +54965,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : ( -# 760 "parsing/parser.mly" +# 764 "parsing/parser.mly" (string * char option) -# 54943 "parsing/parser.ml" +# 54971 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in @@ -54950,23 +54978,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3867 "parsing/parser.mly" +# 3871 "parsing/parser.mly" ( let (n, m) = _1 in Pdir_int (n ,m) ) -# 54956 "parsing/parser.ml" +# 54984 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1021 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 54964 "parsing/parser.ml" +# 54992 "parsing/parser.ml" in # 126 "" ( Some x ) -# 54970 "parsing/parser.ml" +# 54998 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -54976,18 +55004,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 54982 "parsing/parser.ml" +# 55010 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3862 "parsing/parser.mly" +# 3866 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 54991 "parsing/parser.ml" +# 55019 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55027,23 +55055,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3868 "parsing/parser.mly" +# 3872 "parsing/parser.mly" ( Pdir_ident _1 ) -# 55033 "parsing/parser.ml" +# 55061 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1021 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 55041 "parsing/parser.ml" +# 55069 "parsing/parser.ml" in # 126 "" ( Some x ) -# 55047 "parsing/parser.ml" +# 55075 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -55053,18 +55081,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 55059 "parsing/parser.ml" +# 55087 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3862 "parsing/parser.mly" +# 3866 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 55068 "parsing/parser.ml" +# 55096 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55104,23 +55132,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3869 "parsing/parser.mly" +# 3873 "parsing/parser.mly" ( Pdir_ident _1 ) -# 55110 "parsing/parser.ml" +# 55138 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1021 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 55118 "parsing/parser.ml" +# 55146 "parsing/parser.ml" in # 126 "" ( Some x ) -# 55124 "parsing/parser.ml" +# 55152 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -55130,18 +55158,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 55136 "parsing/parser.ml" +# 55164 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3862 "parsing/parser.mly" +# 3866 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 55145 "parsing/parser.ml" +# 55173 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55181,23 +55209,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in let x = let _1 = -# 3870 "parsing/parser.mly" +# 3874 "parsing/parser.mly" ( Pdir_bool false ) -# 55187 "parsing/parser.ml" +# 55215 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1021 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 55195 "parsing/parser.ml" +# 55223 "parsing/parser.ml" in # 126 "" ( Some x ) -# 55201 "parsing/parser.ml" +# 55229 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -55207,18 +55235,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 55213 "parsing/parser.ml" +# 55241 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3862 "parsing/parser.mly" +# 3866 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 55222 "parsing/parser.ml" +# 55250 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55258,23 +55286,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined2_, _startpos__1_inlined2_) in let x = let _1 = -# 3871 "parsing/parser.mly" +# 3875 "parsing/parser.mly" ( Pdir_bool true ) -# 55264 "parsing/parser.ml" +# 55292 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1017 "parsing/parser.mly" +# 1021 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 55272 "parsing/parser.ml" +# 55300 "parsing/parser.ml" in # 126 "" ( Some x ) -# 55278 "parsing/parser.ml" +# 55306 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -55284,18 +55312,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 55290 "parsing/parser.ml" +# 55318 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3862 "parsing/parser.mly" +# 3866 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 55299 "parsing/parser.ml" +# 55327 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55335,37 +55363,37 @@ module Tables = struct let _1 = let _1 = let attrs = -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 55341 "parsing/parser.ml" +# 55369 "parsing/parser.ml" in -# 1484 "parsing/parser.mly" +# 1488 "parsing/parser.mly" ( mkstrexp e attrs ) -# 55346 "parsing/parser.ml" +# 55374 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 960 "parsing/parser.mly" +# 964 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 55354 "parsing/parser.ml" +# 55382 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 948 "parsing/parser.mly" +# 952 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 55363 "parsing/parser.ml" +# 55391 "parsing/parser.ml" in -# 1248 "parsing/parser.mly" +# 1252 "parsing/parser.mly" ( Ptop_def _1 ) -# 55369 "parsing/parser.ml" +# 55397 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55398,21 +55426,21 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 55402 "parsing/parser.ml" +# 55430 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 948 "parsing/parser.mly" +# 952 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 55410 "parsing/parser.ml" +# 55438 "parsing/parser.ml" in -# 1252 "parsing/parser.mly" +# 1256 "parsing/parser.mly" ( Ptop_def _1 ) -# 55416 "parsing/parser.ml" +# 55444 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55442,9 +55470,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.toplevel_phrase) = -# 1256 "parsing/parser.mly" +# 1260 "parsing/parser.mly" ( _1 ) -# 55448 "parsing/parser.ml" +# 55476 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55467,9 +55495,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.toplevel_phrase) = -# 1259 "parsing/parser.mly" +# 1263 "parsing/parser.mly" ( raise End_of_file ) -# 55473 "parsing/parser.ml" +# 55501 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55492,9 +55520,9 @@ module Tables = struct let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.core_type) = -# 3508 "parsing/parser.mly" +# 3512 "parsing/parser.mly" ( ty ) -# 55498 "parsing/parser.ml" +# 55526 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55522,18 +55550,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 55526 "parsing/parser.ml" +# 55554 "parsing/parser.ml" in -# 1139 "parsing/parser.mly" +# 1143 "parsing/parser.mly" ( xs ) -# 55531 "parsing/parser.ml" +# 55559 "parsing/parser.ml" in -# 3511 "parsing/parser.mly" +# 3515 "parsing/parser.mly" ( Ptyp_tuple tys ) -# 55537 "parsing/parser.ml" +# 55565 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_xs_) in @@ -55541,15 +55569,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 55547 "parsing/parser.ml" +# 55575 "parsing/parser.ml" in -# 3513 "parsing/parser.mly" +# 3517 "parsing/parser.mly" ( _1 ) -# 55553 "parsing/parser.ml" +# 55581 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55579,9 +55607,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_constraint) = -# 2830 "parsing/parser.mly" +# 2834 "parsing/parser.mly" ( Pconstraint _2 ) -# 55585 "parsing/parser.ml" +# 55613 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55625,9 +55653,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.type_constraint) = -# 2831 "parsing/parser.mly" +# 2835 "parsing/parser.mly" ( Pcoerce (Some _2, _4) ) -# 55631 "parsing/parser.ml" +# 55659 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55657,9 +55685,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_constraint) = -# 2832 "parsing/parser.mly" +# 2836 "parsing/parser.mly" ( Pcoerce (None, _2) ) -# 55663 "parsing/parser.ml" +# 55691 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55689,9 +55717,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_constraint) = -# 2833 "parsing/parser.mly" +# 2837 "parsing/parser.mly" ( syntax_error() ) -# 55695 "parsing/parser.ml" +# 55723 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55721,9 +55749,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_constraint) = -# 2834 "parsing/parser.mly" +# 2838 "parsing/parser.mly" ( syntax_error() ) -# 55727 "parsing/parser.ml" +# 55755 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55739,9 +55767,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = -# 3163 "parsing/parser.mly" +# 3167 "parsing/parser.mly" ( (Ptype_abstract, Public, None) ) -# 55745 "parsing/parser.ml" +# 55773 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55771,9 +55799,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = -# 3165 "parsing/parser.mly" +# 3169 "parsing/parser.mly" ( _2 ) -# 55777 "parsing/parser.ml" +# 55805 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55796,9 +55824,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3823 "parsing/parser.mly" +# 3827 "parsing/parser.mly" ( _1 ) -# 55802 "parsing/parser.ml" +# 55830 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55828,9 +55856,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = -# 3180 "parsing/parser.mly" +# 3184 "parsing/parser.mly" ( _2, _1 ) -# 55834 "parsing/parser.ml" +# 55862 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55846,9 +55874,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = -# 3173 "parsing/parser.mly" +# 3177 "parsing/parser.mly" ( [] ) -# 55852 "parsing/parser.ml" +# 55880 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55871,9 +55899,9 @@ module Tables = struct let _startpos = _startpos_p_ in let _endpos = _endpos_p_ in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = -# 3175 "parsing/parser.mly" +# 3179 "parsing/parser.mly" ( [p] ) -# 55877 "parsing/parser.ml" +# 55905 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55913,18 +55941,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 55917 "parsing/parser.ml" +# 55945 "parsing/parser.ml" in -# 1111 "parsing/parser.mly" +# 1115 "parsing/parser.mly" ( xs ) -# 55922 "parsing/parser.ml" +# 55950 "parsing/parser.ml" in -# 3177 "parsing/parser.mly" +# 3181 "parsing/parser.mly" ( ps ) -# 55928 "parsing/parser.ml" +# 55956 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55955,24 +55983,24 @@ module Tables = struct let _endpos = _endpos_tyvar_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3185 "parsing/parser.mly" +# 3189 "parsing/parser.mly" ( Ptyp_var tyvar ) -# 55961 "parsing/parser.ml" +# 55989 "parsing/parser.ml" in let _endpos__1_ = _endpos_tyvar_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 55970 "parsing/parser.ml" +# 55998 "parsing/parser.ml" in -# 3188 "parsing/parser.mly" +# 3192 "parsing/parser.mly" ( _1 ) -# 55976 "parsing/parser.ml" +# 56004 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -55996,23 +56024,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3187 "parsing/parser.mly" +# 3191 "parsing/parser.mly" ( Ptyp_any ) -# 56002 "parsing/parser.ml" +# 56030 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 993 "parsing/parser.mly" +# 997 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 56010 "parsing/parser.ml" +# 56038 "parsing/parser.ml" in -# 3188 "parsing/parser.mly" +# 3192 "parsing/parser.mly" ( _1 ) -# 56016 "parsing/parser.ml" +# 56044 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56028,9 +56056,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3192 "parsing/parser.mly" +# 3196 "parsing/parser.mly" ( NoVariance, NoInjectivity ) -# 56034 "parsing/parser.ml" +# 56062 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56053,9 +56081,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3193 "parsing/parser.mly" +# 3197 "parsing/parser.mly" ( Covariant, NoInjectivity ) -# 56059 "parsing/parser.ml" +# 56087 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56078,9 +56106,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3194 "parsing/parser.mly" +# 3198 "parsing/parser.mly" ( Contravariant, NoInjectivity ) -# 56084 "parsing/parser.ml" +# 56112 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56103,9 +56131,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3195 "parsing/parser.mly" +# 3199 "parsing/parser.mly" ( NoVariance, Injective ) -# 56109 "parsing/parser.ml" +# 56137 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56135,9 +56163,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3196 "parsing/parser.mly" +# 3200 "parsing/parser.mly" ( Covariant, Injective ) -# 56141 "parsing/parser.ml" +# 56169 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56167,9 +56195,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3196 "parsing/parser.mly" +# 3200 "parsing/parser.mly" ( Covariant, Injective ) -# 56173 "parsing/parser.ml" +# 56201 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56199,9 +56227,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3197 "parsing/parser.mly" +# 3201 "parsing/parser.mly" ( Contravariant, Injective ) -# 56205 "parsing/parser.ml" +# 56233 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56231,9 +56259,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 3197 "parsing/parser.mly" +# 3201 "parsing/parser.mly" ( Contravariant, Injective ) -# 56237 "parsing/parser.ml" +# 56265 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56252,20 +56280,20 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 752 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 56258 "parsing/parser.ml" +# 56286 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3199 "parsing/parser.mly" +# 3203 "parsing/parser.mly" ( if _1 = "+!" then Covariant, Injective else if _1 = "-!" then Contravariant, Injective else expecting _loc__1_ "type_variance" ) -# 56269 "parsing/parser.ml" +# 56297 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56284,20 +56312,20 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 798 "parsing/parser.mly" +# 802 "parsing/parser.mly" (string) -# 56290 "parsing/parser.ml" +# 56318 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3203 "parsing/parser.mly" +# 3207 "parsing/parser.mly" ( if _1 = "!+" then Covariant, Injective else if _1 = "!-" then Contravariant, Injective else expecting _loc__1_ "type_variance" ) -# 56301 "parsing/parser.ml" +# 56329 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56331,39 +56359,39 @@ module Tables = struct let ys = # 260 "" ( List.flatten xss ) -# 56335 "parsing/parser.ml" +# 56363 "parsing/parser.ml" in let xs = let _1 = -# 1026 "parsing/parser.mly" +# 1030 "parsing/parser.mly" ( [] ) -# 56341 "parsing/parser.ml" +# 56369 "parsing/parser.ml" in -# 1279 "parsing/parser.mly" +# 1283 "parsing/parser.mly" ( _1 ) -# 56346 "parsing/parser.ml" +# 56374 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 56352 "parsing/parser.ml" +# 56380 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 952 "parsing/parser.mly" +# 956 "parsing/parser.mly" ( extra_def _startpos _endpos _1 ) -# 56361 "parsing/parser.ml" +# 56389 "parsing/parser.ml" in -# 1272 "parsing/parser.mly" +# 1276 "parsing/parser.mly" ( _1 ) -# 56367 "parsing/parser.ml" +# 56395 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56411,7 +56439,7 @@ module Tables = struct let ys = # 260 "" ( List.flatten xss ) -# 56415 "parsing/parser.ml" +# 56443 "parsing/parser.ml" in let xs = let _1 = @@ -56419,61 +56447,61 @@ module Tables = struct let _1 = let _1 = let attrs = -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 56425 "parsing/parser.ml" +# 56453 "parsing/parser.ml" in -# 1484 "parsing/parser.mly" +# 1488 "parsing/parser.mly" ( mkstrexp e attrs ) -# 56430 "parsing/parser.ml" +# 56458 "parsing/parser.ml" in -# 970 "parsing/parser.mly" +# 974 "parsing/parser.mly" ( Ptop_def [_1] ) -# 56436 "parsing/parser.ml" +# 56464 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 968 "parsing/parser.mly" +# 972 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 56444 "parsing/parser.ml" +# 56472 "parsing/parser.ml" in -# 1028 "parsing/parser.mly" +# 1032 "parsing/parser.mly" ( x ) -# 56450 "parsing/parser.ml" +# 56478 "parsing/parser.ml" in -# 1279 "parsing/parser.mly" +# 1283 "parsing/parser.mly" ( _1 ) -# 56456 "parsing/parser.ml" +# 56484 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 56462 "parsing/parser.ml" +# 56490 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_e_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 952 "parsing/parser.mly" +# 956 "parsing/parser.mly" ( extra_def _startpos _endpos _1 ) -# 56471 "parsing/parser.ml" +# 56499 "parsing/parser.ml" in -# 1272 "parsing/parser.mly" +# 1276 "parsing/parser.mly" ( _1 ) -# 56477 "parsing/parser.ml" +# 56505 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56510,9 +56538,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Asttypes.label) = -# 3742 "parsing/parser.mly" +# 3746 "parsing/parser.mly" ( _2 ) -# 56516 "parsing/parser.ml" +# 56544 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56551,9 +56579,9 @@ module Tables = struct let _v : (Asttypes.label) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3743 "parsing/parser.mly" +# 3747 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 56557 "parsing/parser.ml" +# 56585 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56584,9 +56612,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Asttypes.label) = let _loc__2_ = (_startpos__2_, _endpos__2_) in -# 3744 "parsing/parser.mly" +# 3748 "parsing/parser.mly" ( expecting _loc__2_ "operator" ) -# 56590 "parsing/parser.ml" +# 56618 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56624,9 +56652,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Asttypes.label) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 3745 "parsing/parser.mly" +# 3749 "parsing/parser.mly" ( expecting _loc__3_ "module-expr" ) -# 56630 "parsing/parser.ml" +# 56658 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56645,17 +56673,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 56651 "parsing/parser.ml" +# 56679 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3748 "parsing/parser.mly" +# 3752 "parsing/parser.mly" ( _1 ) -# 56659 "parsing/parser.ml" +# 56687 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56678,9 +56706,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3749 "parsing/parser.mly" +# 3753 "parsing/parser.mly" ( _1 ) -# 56684 "parsing/parser.ml" +# 56712 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56703,9 +56731,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3817 "parsing/parser.mly" +# 3821 "parsing/parser.mly" ( _1 ) -# 56709 "parsing/parser.ml" +# 56737 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56750,9 +56778,9 @@ module Tables = struct let ty : (Parsetree.core_type) = Obj.magic ty in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 56756 "parsing/parser.ml" +# 56784 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let mutable_ : (Asttypes.mutable_flag) = Obj.magic mutable_ in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -56764,33 +56792,33 @@ module Tables = struct Parsetree.attributes) = let label = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 56770 "parsing/parser.ml" +# 56798 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 56778 "parsing/parser.ml" +# 56806 "parsing/parser.ml" in let attrs = -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 56784 "parsing/parser.ml" +# 56812 "parsing/parser.ml" in let _1 = -# 3957 "parsing/parser.mly" +# 3961 "parsing/parser.mly" ( Fresh ) -# 56789 "parsing/parser.ml" +# 56817 "parsing/parser.ml" in -# 2064 "parsing/parser.mly" +# 2068 "parsing/parser.mly" ( (label, mutable_, Cfk_virtual ty), attrs ) -# 56794 "parsing/parser.ml" +# 56822 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56835,9 +56863,9 @@ module Tables = struct let _6 : (Parsetree.expression) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 56841 "parsing/parser.ml" +# 56869 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -56849,33 +56877,33 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 56855 "parsing/parser.ml" +# 56883 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 56863 "parsing/parser.ml" +# 56891 "parsing/parser.ml" in let _2 = -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 56869 "parsing/parser.ml" +# 56897 "parsing/parser.ml" in let _1 = -# 3960 "parsing/parser.mly" +# 3964 "parsing/parser.mly" ( Fresh ) -# 56874 "parsing/parser.ml" +# 56902 "parsing/parser.ml" in -# 2066 "parsing/parser.mly" +# 2070 "parsing/parser.mly" ( (_4, _3, Cfk_concrete (_1, _6)), _2 ) -# 56879 "parsing/parser.ml" +# 56907 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -56926,9 +56954,9 @@ module Tables = struct let _6 : (Parsetree.expression) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 56932 "parsing/parser.ml" +# 56960 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -56941,36 +56969,36 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 56947 "parsing/parser.ml" +# 56975 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 56955 "parsing/parser.ml" +# 56983 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 56963 "parsing/parser.ml" +# 56991 "parsing/parser.ml" in let _1 = -# 3961 "parsing/parser.mly" +# 3965 "parsing/parser.mly" ( Override ) -# 56969 "parsing/parser.ml" +# 56997 "parsing/parser.ml" in -# 2066 "parsing/parser.mly" +# 2070 "parsing/parser.mly" ( (_4, _3, Cfk_concrete (_1, _6)), _2 ) -# 56974 "parsing/parser.ml" +# 57002 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57022,9 +57050,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : (Parsetree.type_constraint) = Obj.magic _5 in let _1_inlined1 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 57028 "parsing/parser.ml" +# 57056 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -57036,30 +57064,30 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 57042 "parsing/parser.ml" +# 57070 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 57050 "parsing/parser.ml" +# 57078 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined1_ in let _2 = -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 57057 "parsing/parser.ml" +# 57085 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in let _1 = -# 3960 "parsing/parser.mly" +# 3964 "parsing/parser.mly" ( Fresh ) -# 57063 "parsing/parser.ml" +# 57091 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in let _endpos = _endpos__7_ in @@ -57075,11 +57103,11 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 2069 "parsing/parser.mly" +# 2073 "parsing/parser.mly" ( let e = mkexp_constraint ~loc:_sloc _7 _5 in (_4, _3, Cfk_concrete (_1, e)), _2 ) -# 57083 "parsing/parser.ml" +# 57111 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57137,9 +57165,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : (Parsetree.type_constraint) = Obj.magic _5 in let _1_inlined2 : ( -# 774 "parsing/parser.mly" +# 778 "parsing/parser.mly" (string) -# 57143 "parsing/parser.ml" +# 57171 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -57152,33 +57180,33 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3716 "parsing/parser.mly" +# 3720 "parsing/parser.mly" ( _1 ) -# 57158 "parsing/parser.ml" +# 57186 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 57166 "parsing/parser.ml" +# 57194 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 57175 "parsing/parser.ml" +# 57203 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in let _1 = -# 3961 "parsing/parser.mly" +# 3965 "parsing/parser.mly" ( Override ) -# 57182 "parsing/parser.ml" +# 57210 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = if _startpos__1_ != _endpos__1_ then @@ -57193,11 +57221,11 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 2069 "parsing/parser.mly" +# 2073 "parsing/parser.mly" ( let e = mkexp_constraint ~loc:_sloc _7 _5 in (_4, _3, Cfk_concrete (_1, e)), _2 ) -# 57201 "parsing/parser.ml" +# 57229 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57264,9 +57292,9 @@ module Tables = struct let _v : (Parsetree.value_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 4054 "parsing/parser.mly" +# 4058 "parsing/parser.mly" ( _1 ) -# 57270 "parsing/parser.ml" +# 57298 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -57276,30 +57304,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 57282 "parsing/parser.ml" +# 57310 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 4058 "parsing/parser.mly" +# 4062 "parsing/parser.mly" ( _1 ) -# 57290 "parsing/parser.ml" +# 57318 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3034 "parsing/parser.mly" +# 3038 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Val.mk id ty ~attrs ~loc ~docs, ext ) -# 57303 "parsing/parser.ml" +# 57331 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57315,9 +57343,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.virtual_flag) = -# 3921 "parsing/parser.mly" +# 3925 "parsing/parser.mly" ( Concrete ) -# 57321 "parsing/parser.ml" +# 57349 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57340,9 +57368,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.virtual_flag) = -# 3922 "parsing/parser.mly" +# 3926 "parsing/parser.mly" ( Virtual ) -# 57346 "parsing/parser.ml" +# 57374 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57365,9 +57393,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag) = -# 3945 "parsing/parser.mly" +# 3949 "parsing/parser.mly" ( Immutable ) -# 57371 "parsing/parser.ml" +# 57399 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57397,9 +57425,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag) = -# 3946 "parsing/parser.mly" +# 3950 "parsing/parser.mly" ( Mutable ) -# 57403 "parsing/parser.ml" +# 57431 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57429,9 +57457,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag) = -# 3947 "parsing/parser.mly" +# 3951 "parsing/parser.mly" ( Mutable ) -# 57435 "parsing/parser.ml" +# 57463 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57454,9 +57482,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = -# 3952 "parsing/parser.mly" +# 3956 "parsing/parser.mly" ( Public ) -# 57460 "parsing/parser.ml" +# 57488 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57486,9 +57514,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 3953 "parsing/parser.mly" +# 3957 "parsing/parser.mly" ( Private ) -# 57492 "parsing/parser.ml" +# 57520 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57518,9 +57546,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 3954 "parsing/parser.mly" +# 3958 "parsing/parser.mly" ( Private ) -# 57524 "parsing/parser.ml" +# 57552 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57582,27 +57610,27 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 57586 "parsing/parser.ml" +# 57614 "parsing/parser.ml" in -# 1040 "parsing/parser.mly" +# 1044 "parsing/parser.mly" ( xs ) -# 57591 "parsing/parser.ml" +# 57619 "parsing/parser.ml" in -# 3134 "parsing/parser.mly" +# 3138 "parsing/parser.mly" ( _1 ) -# 57597 "parsing/parser.ml" +# 57625 "parsing/parser.ml" in let _endpos__6_ = _endpos_xs_ in let _5 = let _1 = _1_inlined2 in -# 3456 "parsing/parser.mly" +# 3460 "parsing/parser.mly" ( _1 ) -# 57606 "parsing/parser.ml" +# 57634 "parsing/parser.ml" in let _3 = @@ -57611,16 +57639,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 57617 "parsing/parser.ml" +# 57645 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3375 "parsing/parser.mly" +# 3379 "parsing/parser.mly" ( let lident = loc_last _3 in Pwith_type (_3, @@ -57630,7 +57658,7 @@ module Tables = struct ~manifest:_5 ~priv:_4 ~loc:(make_loc _sloc))) ) -# 57634 "parsing/parser.ml" +# 57662 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57683,9 +57711,9 @@ module Tables = struct let _v : (Parsetree.with_constraint) = let _5 = let _1 = _1_inlined2 in -# 3456 "parsing/parser.mly" +# 3460 "parsing/parser.mly" ( _1 ) -# 57689 "parsing/parser.ml" +# 57717 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in @@ -57695,16 +57723,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 57701 "parsing/parser.ml" +# 57729 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3388 "parsing/parser.mly" +# 3392 "parsing/parser.mly" ( let lident = loc_last _3 in Pwith_typesubst (_3, @@ -57712,7 +57740,7 @@ module Tables = struct ~params:_2 ~manifest:_5 ~loc:(make_loc _sloc))) ) -# 57716 "parsing/parser.ml" +# 57744 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57761,9 +57789,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 57767 "parsing/parser.ml" +# 57795 "parsing/parser.ml" in let _2 = @@ -57772,15 +57800,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 57778 "parsing/parser.ml" +# 57806 "parsing/parser.ml" in -# 3396 "parsing/parser.mly" +# 3400 "parsing/parser.mly" ( Pwith_module (_2, _4) ) -# 57784 "parsing/parser.ml" +# 57812 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57829,9 +57857,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 57835 "parsing/parser.ml" +# 57863 "parsing/parser.ml" in let _2 = @@ -57840,15 +57868,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 57846 "parsing/parser.ml" +# 57874 "parsing/parser.ml" in -# 3398 "parsing/parser.mly" +# 3402 "parsing/parser.mly" ( Pwith_modsubst (_2, _4) ) -# 57852 "parsing/parser.ml" +# 57880 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57904,15 +57932,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 57910 "parsing/parser.ml" +# 57938 "parsing/parser.ml" in -# 3400 "parsing/parser.mly" +# 3404 "parsing/parser.mly" ( Pwith_modtype (l, rhs) ) -# 57916 "parsing/parser.ml" +# 57944 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57968,15 +57996,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 956 "parsing/parser.mly" +# 960 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 57974 "parsing/parser.ml" +# 58002 "parsing/parser.ml" in -# 3402 "parsing/parser.mly" +# 3406 "parsing/parser.mly" ( Pwith_modtypesubst (l, rhs) ) -# 57980 "parsing/parser.ml" +# 58008 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -57999,9 +58027,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = -# 3405 "parsing/parser.mly" +# 3409 "parsing/parser.mly" ( Public ) -# 58005 "parsing/parser.ml" +# 58033 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58031,9 +58059,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 3406 "parsing/parser.mly" +# 3410 "parsing/parser.mly" ( Private ) -# 58037 "parsing/parser.ml" +# 58065 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -58061,59 +58089,59 @@ end let use_file = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2051 lexer lexbuf) : (Parsetree.toplevel_phrase list)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2052 lexer lexbuf) : (Parsetree.toplevel_phrase list)) and toplevel_phrase = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2031 lexer lexbuf) : (Parsetree.toplevel_phrase)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2032 lexer lexbuf) : (Parsetree.toplevel_phrase)) and parse_val_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2025 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2026 lexer lexbuf) : (Longident.t)) and parse_pattern = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2021 lexer lexbuf) : (Parsetree.pattern)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2022 lexer lexbuf) : (Parsetree.pattern)) and parse_mty_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2017 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2018 lexer lexbuf) : (Longident.t)) and parse_module_type = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2013 lexer lexbuf) : (Parsetree.module_type)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2014 lexer lexbuf) : (Parsetree.module_type)) and parse_module_expr = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2009 lexer lexbuf) : (Parsetree.module_expr)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2010 lexer lexbuf) : (Parsetree.module_expr)) and parse_mod_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2005 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2006 lexer lexbuf) : (Longident.t)) and parse_mod_ext_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 2001 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Simplified 2002 lexer lexbuf) : (Longident.t)) and parse_expression = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 1997 lexer lexbuf) : (Parsetree.expression)) + (Obj.magic (MenhirInterpreter.entry `Simplified 1998 lexer lexbuf) : (Parsetree.expression)) and parse_core_type = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 1993 lexer lexbuf) : (Parsetree.core_type)) + (Obj.magic (MenhirInterpreter.entry `Simplified 1994 lexer lexbuf) : (Parsetree.core_type)) and parse_constr_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 1989 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Simplified 1990 lexer lexbuf) : (Longident.t)) and parse_any_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 1971 lexer lexbuf) : (Longident.t)) + (Obj.magic (MenhirInterpreter.entry `Simplified 1972 lexer lexbuf) : (Longident.t)) and interface = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry `Simplified 1967 lexer lexbuf) : (Parsetree.signature)) + (Obj.magic (MenhirInterpreter.entry `Simplified 1968 lexer lexbuf) : (Parsetree.signature)) and implementation = fun lexer lexbuf -> @@ -58123,59 +58151,59 @@ module Incremental = struct let use_file = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2051 initial_position) : (Parsetree.toplevel_phrase list) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2052 initial_position) : (Parsetree.toplevel_phrase list) MenhirInterpreter.checkpoint) and toplevel_phrase = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2031 initial_position) : (Parsetree.toplevel_phrase) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2032 initial_position) : (Parsetree.toplevel_phrase) MenhirInterpreter.checkpoint) and parse_val_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2025 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2026 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_pattern = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2021 initial_position) : (Parsetree.pattern) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2022 initial_position) : (Parsetree.pattern) MenhirInterpreter.checkpoint) and parse_mty_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2017 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2018 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_module_type = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2013 initial_position) : (Parsetree.module_type) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2014 initial_position) : (Parsetree.module_type) MenhirInterpreter.checkpoint) and parse_module_expr = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2009 initial_position) : (Parsetree.module_expr) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2010 initial_position) : (Parsetree.module_expr) MenhirInterpreter.checkpoint) and parse_mod_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2005 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2006 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_mod_ext_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 2001 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 2002 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_expression = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1997 initial_position) : (Parsetree.expression) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1998 initial_position) : (Parsetree.expression) MenhirInterpreter.checkpoint) and parse_core_type = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1993 initial_position) : (Parsetree.core_type) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1994 initial_position) : (Parsetree.core_type) MenhirInterpreter.checkpoint) and parse_constr_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1989 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1990 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_any_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1971 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1972 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and interface = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1967 initial_position) : (Parsetree.signature) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1968 initial_position) : (Parsetree.signature) MenhirInterpreter.checkpoint) and implementation = fun initial_position -> @@ -58183,12 +58211,12 @@ module Incremental = struct end -# 4090 "parsing/parser.mly" +# 4100 "parsing/parser.mly" -# 58190 "parsing/parser.ml" +# 58218 "parsing/parser.ml" # 269 "" -# 58195 "parsing/parser.ml" +# 58223 "parsing/parser.ml" diff --git a/boot/ocamlc b/boot/ocamlc index 644f7e1b83c..05d8d55525f 100755 Binary files a/boot/ocamlc and b/boot/ocamlc differ diff --git a/boot/ocamllex b/boot/ocamllex index 9471acb6b18..5ad9e2ff516 100755 Binary files a/boot/ocamllex and b/boot/ocamllex differ diff --git a/build-aux/ax_check_compile_flag.m4 b/build-aux/ax_check_compile_flag.m4 new file mode 100644 index 00000000000..bd753b34d7d --- /dev/null +++ b/build-aux/ax_check_compile_flag.m4 @@ -0,0 +1,53 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 6 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS diff --git a/build-aux/ocaml_version.m4 b/build-aux/ocaml_version.m4 index abae7773fc9..f04d702bde7 100644 --- a/build-aux/ocaml_version.m4 +++ b/build-aux/ocaml_version.m4 @@ -88,3 +88,38 @@ m4_define([OCAML__RELEASE_EXTRA], m4_if(OCAML__VERSION_EXTRA,[],[None], ['Some (]m4_if(OCAML__VERSION_EXTRA_PREFIX,+,[Plus], [Tilde])[, "]OCAML__VERSION_EXTRA[")']))])) + +# Magic numbers for the different file formats + +# The magic numbers are made of three components: +# - An 8-bytes prefix, common to all of them +# - A 1-byte kind, specifying the file type (exeecutable, cmi, cmo, etc.) +# - A 3-bytes version number + +m4_define([MAGIC_NUMBER__PREFIX], [Caml1999]) +m4_define([MAGIC_NUMBER__VERSION], [033]) + +# The following macro is used to define all our magic numbers +# Its first argument is the name of the file type described by that +# magic number and its second argument is the character used to +# characterize that file type + +AC_DEFUN([DEFINE_MAGIC_NUMBER], + [m4_define([$1__MAGIC_NUMBER], + [MAGIC_NUMBER__PREFIX[]$2[]MAGIC_NUMBER__VERSION])]) + +m4_define(EXEC__FORMAT, [X]) +DEFINE_MAGIC_NUMBER([EXEC], EXEC__FORMAT) +DEFINE_MAGIC_NUMBER([CMI], [I]) +DEFINE_MAGIC_NUMBER([CMO], [O]) +DEFINE_MAGIC_NUMBER([CMA], [A]) +DEFINE_MAGIC_NUMBER([CMX_CLAMBDA], [Y]) +DEFINE_MAGIC_NUMBER([CMX_FLAMBDA], [y]) +DEFINE_MAGIC_NUMBER([CMXA_CLAMBDA], [Z]) +DEFINE_MAGIC_NUMBER([CMXA_FLAMBDA], [z]) +DEFINE_MAGIC_NUMBER([AST_IMPL], [M]) +DEFINE_MAGIC_NUMBER([AST_INTF], [N]) +DEFINE_MAGIC_NUMBER([CMXS], [D]) +DEFINE_MAGIC_NUMBER([CMT], [T]) +DEFINE_MAGIC_NUMBER([LINEAR], [L]) +m4_define([MAGIC_NUMBER__LENGTH], m4_len(EXEC__MAGIC_NUMBER)) diff --git a/bytecomp/bytegen.ml b/bytecomp/bytegen.ml index 0af08b7112f..0328dff60a9 100644 --- a/bytecomp/bytegen.ml +++ b/bytecomp/bytegen.ml @@ -240,19 +240,22 @@ let rec size_of_lambda env = function size_of_lambda env body (* See the Lletrec case of comp_expr *) | Lletrec(bindings, body) when - List.for_all (function (_, Lfunction _) -> true | _ -> false) bindings -> + List.for_all + (function { def = Lfunction _ } -> true | _ -> false) + bindings -> (* let rec of functions *) let fv = Ident.Set.elements (free_variables (Lletrec(bindings, lambda_unit))) in (* See Instruct(CLOSUREREC) in interp.c *) let blocksize = List.length bindings * 3 - 1 + List.length fv in - let offsets = List.mapi (fun i (id, _e) -> (id, i * 3)) bindings in + let offsets = List.mapi (fun i { id } -> (id, i * 3)) bindings in let env = List.fold_right (fun (id, offset) env -> Ident.add id (RHS_infix { blocksize; offset }) env) offsets env in size_of_lambda env body | Lletrec(bindings, body) -> let env = List.fold_right - (fun (id, e) env -> Ident.add id (size_of_lambda env e) env) + (fun { id; rkind=_; def } env -> + Ident.add id (size_of_lambda env def) env) bindings env in size_of_lambda env body @@ -308,6 +311,20 @@ let rec size_of_lambda env = function | Lmutvar _ | Lapply _ | Lwhile _ | Lfor _ | Lassign _ | Lsend _ | Lifused _ -> RHS_nonrec +let size_of_rec_binding clas expr = + match (clas : Value_rec_types.recursive_binding_kind) with + | Not_recursive | Constant -> RHS_nonrec + | Class -> + (* Actual size is always 4, but [transl_class] only generates + explicit allocations when the classes are actually recursive. + Computing the size means that we don't go through pre-allocation + when the classes are not recursive. *) + size_of_lambda Ident.empty expr + | Static -> + let result = size_of_lambda Ident.empty expr in + assert (result <> RHS_nonrec); + result + (**** Merging consecutive events ****) let copy_event ev kind info repr = @@ -724,18 +741,18 @@ let rec comp_expr stack_info env exp sz cont = (add_pop 1 cont)) | Lletrec(decl, body) -> let ndecl = List.length decl in - if List.for_all (function (_, Lfunction _) -> true | _ -> false) + if List.for_all (function { def = Lfunction _ } -> true | _ -> false) decl then begin (* let rec of functions *) let fv = Ident.Set.elements (free_variables (Lletrec(decl, lambda_unit))) in - let rec_idents = List.map (fun (id, _lam) -> id) decl in + let rec_idents = List.map (fun { id } -> id) decl in let entries = closure_entries (Multiple_recursive rec_idents) fv in let rec comp_fun pos = function [] -> [] - | (_id, Lfunction{params; body}) :: rem -> + | { def = Lfunction{params; body} } :: rem -> let lbl = new_label() in let to_compile = { params = List.map fst params; body = body; label = lbl; @@ -751,8 +768,10 @@ let rec comp_expr stack_info env exp sz cont = (add_pop ndecl cont))) end else begin let decl_size = - List.map (fun (id, exp) -> (id, exp, size_of_lambda Ident.empty exp)) - decl in + List.map (fun { id; rkind; def } -> + (id, def, size_of_rec_binding rkind def)) + decl + in let rec comp_init new_env sz = function | [] -> comp_nonrec new_env sz ndecl decl_size | (id, _exp, RHS_floatblock blocksize) :: rem -> diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index 1fb2d085351..2d2f5b98914 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -226,7 +226,14 @@ let debug_info = ref ([] : (int * Instruct.debug_event list * string list) list) let link_compunit output_fun currpos_fun inchan file_name compunit = check_consistency file_name compunit; seek_in inchan compunit.cu_pos; - let code_block = LongString.input_bytes inchan compunit.cu_codesize in + let code_block = + Bigarray.Array1.create Bigarray.Char Bigarray.c_layout compunit.cu_codesize + in + match + In_channel.really_input_bigarray inchan code_block 0 compunit.cu_codesize + with + | None -> raise End_of_file + | Some () -> (); Symtable.patch_object code_block compunit.cu_reloc; if !Clflags.debug && compunit.cu_debug > 0 then begin seek_in inchan compunit.cu_debug; @@ -239,7 +246,7 @@ let link_compunit output_fun currpos_fun inchan file_name compunit = else file_path :: debug_dirs in debug_info := (currpos_fun(), debug_event_list, debug_dirs) :: !debug_info end; - Array.iter output_fun code_block; + output_fun code_block; if !Clflags.link_everything then List.iter Symtable.require_primitive compunit.cu_primitives @@ -368,11 +375,12 @@ let link_bytecode ?final_name tolink exec_name standalone = if check_dlls then begin (* Initialize the DLL machinery *) Dll.init_compile !Clflags.no_std_include; - Dll.add_path (Load_path.get_paths ()); + Dll.add_path (Load_path.get_path_list ()); try Dll.open_dlls Dll.For_checking sharedobjs with Failure reason -> raise(Error(Cannot_open_dll reason)) end; - let output_fun = output_bytes outchan + let output_fun buf = + Out_channel.output_bigarray outchan buf 0 (Bigarray.Array1.dim buf) and currpos_fun () = pos_out outchan - start_code in List.iter (link_file output_fun currpos_fun) tolink; if check_dlls then Dll.close_all_dlls(); @@ -418,12 +426,12 @@ let output_code_string_counter = ref 0 let output_code_string outchan code = let pos = ref 0 in - let len = Bytes.length code in + let len = Bigarray.Array1.dim code in while !pos < len do - let c1 = Char.code(Bytes.get code !pos) in - let c2 = Char.code(Bytes.get code (!pos + 1)) in - let c3 = Char.code(Bytes.get code (!pos + 2)) in - let c4 = Char.code(Bytes.get code (!pos + 3)) in + let c1 = Char.code(Bigarray.Array1.get code !pos) in + let c2 = Char.code(Bigarray.Array1.get code (!pos + 1)) in + let c3 = Char.code(Bigarray.Array1.get code (!pos + 2)) in + let c4 = Char.code(Bigarray.Array1.get code (!pos + 3)) in pos := !pos + 4; Printf.fprintf outchan "0x%02x%02x%02x%02x, " c4 c3 c2 c1; incr output_code_string_counter; @@ -506,7 +514,7 @@ let link_bytecode_as_c tolink outfile with_main = let currpos = ref 0 in let output_fun code = output_code_string outchan code; - currpos := !currpos + Bytes.length code + currpos := !currpos + (Bigarray.Array1.dim code) and currpos_fun () = !currpos in List.iter (link_file output_fun currpos_fun) tolink; (* The final STOP instruction *) diff --git a/bytecomp/emitcode.ml b/bytecomp/emitcode.ml index 3ac5b9707c4..091e2bbbe36 100644 --- a/bytecomp/emitcode.ml +++ b/bytecomp/emitcode.ml @@ -50,24 +50,30 @@ let () = ) (* Buffering of bytecode *) -let out_buffer = ref(LongString.create 0) +let create_bigarray = Bigarray.Array1.create Bigarray.Char Bigarray.c_layout + +let copy_bigarray src dst size = + Bigarray.Array1.(blit (sub src 0 size) (sub dst 0 size)) + +let out_buffer = ref(create_bigarray 0) and out_position = ref 0 let extend_buffer needed = - let size = LongString.length !out_buffer in + let size = Bigarray.Array1.dim !out_buffer in let new_size = ref(max size 16) (* we need new_size > 0 *) in while needed >= !new_size do new_size := 2 * !new_size done; - let new_buffer = LongString.create !new_size in - LongString.blit !out_buffer 0 new_buffer 0 (LongString.length !out_buffer); + let new_buffer = create_bigarray !new_size in + copy_bigarray !out_buffer new_buffer size; out_buffer := new_buffer let out_word b1 b2 b3 b4 = let p = !out_position in - if p+3 >= LongString.length !out_buffer then extend_buffer (p+3); - LongString.set !out_buffer p (Char.unsafe_chr b1); - LongString.set !out_buffer (p+1) (Char.unsafe_chr b2); - LongString.set !out_buffer (p+2) (Char.unsafe_chr b3); - LongString.set !out_buffer (p+3) (Char.unsafe_chr b4); + let open Bigarray.Array1 in + if p+3 >= dim !out_buffer then extend_buffer (p+3); + set !out_buffer p (Char.unsafe_chr b1); + set !out_buffer (p+1) (Char.unsafe_chr b2); + set !out_buffer (p+2) (Char.unsafe_chr b3); + set !out_buffer (p+3) (Char.unsafe_chr b4); out_position := p + 4 let out opcode = @@ -117,10 +123,11 @@ let extend_label_table needed = let backpatch (pos, orig) = let displ = (!out_position - orig) asr 2 in - LongString.set !out_buffer pos (Char.unsafe_chr displ); - LongString.set !out_buffer (pos+1) (Char.unsafe_chr (displ asr 8)); - LongString.set !out_buffer (pos+2) (Char.unsafe_chr (displ asr 16)); - LongString.set !out_buffer (pos+3) (Char.unsafe_chr (displ asr 24)) + let open Bigarray.Array1 in + set !out_buffer pos (Char.unsafe_chr displ); + set !out_buffer (pos+1) (Char.unsafe_chr (displ asr 8)); + set !out_buffer (pos+2) (Char.unsafe_chr (displ asr 16)); + set !out_buffer (pos+3) (Char.unsafe_chr (displ asr 24)) let define_label lbl = if lbl >= Array.length !label_table then extend_label_table lbl; @@ -198,12 +205,12 @@ let clear() = reloc_info := []; debug_dirs := String.Set.empty; events := []; - out_buffer := LongString.create 0 + out_buffer := create_bigarray 0 let init () = clear (); label_table := Array.make 16 (Label_undefined []); - out_buffer := LongString.create 1024 + out_buffer := create_bigarray 1024 (* Emission of one instruction *) @@ -420,7 +427,7 @@ let to_file outchan artifact_info ~required_globals code = output_binary_int outchan 0; let pos_code = pos_out outchan in emit code; - LongString.output outchan !out_buffer 0 !out_position; + Out_channel.output_bigarray outchan !out_buffer 0 !out_position; let (pos_debug, size_debug) = if !Clflags.debug then begin let filename = Unit_info.Artifact.filename artifact_info in @@ -466,8 +473,8 @@ let to_memory instrs = init(); Fun.protect ~finally:clear (fun () -> emit instrs; - let code = LongString.create !out_position in - LongString.blit !out_buffer 0 code 0 !out_position; + let code = create_bigarray !out_position in + copy_bigarray !out_buffer code !out_position; let reloc = List.rev !reloc_info in let events = !events in (code, reloc, events)) @@ -478,7 +485,7 @@ let to_packed_file outchan code = init (); Fun.protect ~finally:clear (fun () -> emit code; - LongString.output outchan !out_buffer 0 !out_position; + Out_channel.output_bigarray outchan !out_buffer 0 !out_position; let reloc = List.rev !reloc_info in let events = !events in let debug_dirs = !debug_dirs in diff --git a/bytecomp/emitcode.mli b/bytecomp/emitcode.mli index f7420c0b624..45dec1de8bd 100644 --- a/bytecomp/emitcode.mli +++ b/bytecomp/emitcode.mli @@ -29,7 +29,8 @@ val to_file: out_channel -> Unit_info.Artifact.t -> list of instructions to emit *) val to_memory: instruction list -> - Misc.LongString.t * (reloc_info * int) list * debug_event list + (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t * + (reloc_info * int) list * debug_event list (* Arguments: initialization code (terminated by STOP) function code diff --git a/bytecomp/meta.ml b/bytecomp/meta.ml index db2ba1557c9..0009be19039 100644 --- a/bytecomp/meta.ml +++ b/bytecomp/meta.ml @@ -18,7 +18,8 @@ external realloc_global_data : int -> unit = "caml_realloc_global" type closure = unit -> Obj.t type bytecode external reify_bytecode : - bytes array -> Instruct.debug_event list array -> string option -> + (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t -> + Instruct.debug_event list array -> string option -> bytecode * closure = "caml_reify_bytecode" external release_bytecode : bytecode -> unit diff --git a/bytecomp/meta.mli b/bytecomp/meta.mli index 6ce6ea0316c..cc051f68cf4 100644 --- a/bytecomp/meta.mli +++ b/bytecomp/meta.mli @@ -20,7 +20,8 @@ external realloc_global_data : int -> unit = "caml_realloc_global" type closure = unit -> Obj.t type bytecode external reify_bytecode : - bytes array -> Instruct.debug_event list array -> string option -> + (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t -> + Instruct.debug_event list array -> string option -> bytecode * closure = "caml_reify_bytecode" external release_bytecode : bytecode -> unit diff --git a/bytecomp/symtable.ml b/bytecomp/symtable.ml index 5d68dc40c26..89a016540e4 100644 --- a/bytecomp/symtable.ml +++ b/bytecomp/symtable.ml @@ -13,12 +13,9 @@ (* *) (**************************************************************************) -[@@@ocaml.warning "-40"] - (* To assign numbers to globals and primitives *) open Misc -open Asttypes open Lambda open Cmo_format @@ -259,6 +256,8 @@ let init () = ~stdout:primfile ["-p"] in + if !Clflags.verbose then + Printf.eprintf "+ %s\n%!" cmd; if Sys.command cmd <> 0 then raise(Error(Wrong_vm !Clflags.use_runtime)); set_prim_table_from_file primfile @@ -270,10 +269,11 @@ let init () = (* Relocate a block of object bytecode *) let patch_int buff pos n = - LongString.set buff pos (Char.unsafe_chr n); - LongString.set buff (pos + 1) (Char.unsafe_chr (n asr 8)); - LongString.set buff (pos + 2) (Char.unsafe_chr (n asr 16)); - LongString.set buff (pos + 3) (Char.unsafe_chr (n asr 24)) + let open Bigarray.Array1 in + set buff pos (Char.unsafe_chr n); + set buff (pos + 1) (Char.unsafe_chr (n asr 8)); + set buff (pos + 2) (Char.unsafe_chr (n asr 16)); + set buff (pos + 3) (Char.unsafe_chr (n asr 24)) let patch_object buff patchlist = List.iter diff --git a/bytecomp/symtable.mli b/bytecomp/symtable.mli index 4b98f487224..9bf63384aa6 100644 --- a/bytecomp/symtable.mli +++ b/bytecomp/symtable.mli @@ -46,7 +46,9 @@ end (* Functions for batch linking *) val init: unit -> unit -val patch_object: Misc.LongString.t -> (reloc_info * int) list -> unit +val patch_object: + (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t -> + (reloc_info * int) list -> unit val require_primitive: string -> unit val initial_global_table: unit -> Obj.t array val output_global_map: out_channel -> unit diff --git a/compilerlibs/Makefile.compilerlibs b/compilerlibs/Makefile.compilerlibs deleted file mode 100644 index c31802a5da6..00000000000 --- a/compilerlibs/Makefile.compilerlibs +++ /dev/null @@ -1,488 +0,0 @@ -#************************************************************************** -#* * -#* OCaml * -#* * -#* Xavier Leroy, projet Cristal, INRIA Rocquencourt * -#* * -#* Copyright 1999 Institut National de Recherche en Informatique et * -#* en Automatique. * -#* * -#* All rights reserved. This file is distributed under the terms of * -#* the GNU Lesser General Public License version 2.1, with the * -#* special exception on linking described in the file LICENSE. * -#* * -#************************************************************************** - -# Targets and dependencies for compilerlibs archives - -# This file is meant to be included from the root Makefile, not to be -# executed directly (this is why it is not simply named Makefile). - -# For each group of compilation units, we have a variable GROUP with -# only .cmo files, and a separate variable GROUP_CMI for .cmi files -# corresponding to the .mli-only modules only. These .cmi are not -# linked in the archive, but they are marked as dependencies to ensure -# that they are consistent with the interface digests in the archives. - -UTILS = \ - utils/config.cmo \ - utils/build_path_prefix_map.cmo \ - utils/misc.cmo \ - utils/identifiable.cmo \ - utils/numbers.cmo \ - utils/arg_helper.cmo \ - utils/local_store.cmo \ - utils/load_path.cmo \ - utils/clflags.cmo \ - utils/profile.cmo \ - utils/terminfo.cmo \ - utils/ccomp.cmo \ - utils/warnings.cmo \ - utils/consistbl.cmo \ - utils/strongly_connected_components.cmo \ - utils/targetint.cmo \ - utils/int_replace_polymorphic_compare.cmo \ - utils/domainstate.cmo \ - utils/binutils.cmo \ - utils/lazy_backtrack.cmo \ - utils/diffing.cmo \ - utils/diffing_with_keys.cmo -UTILS_CMI = - -PARSING = \ - parsing/location.cmo \ - parsing/unit_info.cmo \ - parsing/longident.cmo \ - parsing/docstrings.cmo \ - parsing/syntaxerr.cmo \ - parsing/ast_helper.cmo \ - parsing/camlinternalMenhirLib.cmo \ - parsing/parser.cmo \ - parsing/lexer.cmo \ - parsing/pprintast.cmo \ - parsing/parse.cmo \ - parsing/printast.cmo \ - parsing/ast_mapper.cmo \ - parsing/ast_iterator.cmo \ - parsing/attr_helper.cmo \ - parsing/builtin_attributes.cmo \ - parsing/ast_invariants.cmo \ - parsing/depend.cmo -PARSING_CMI = \ - parsing/asttypes.cmi \ - parsing/parsetree.cmi - -TYPING = \ - typing/ident.cmo \ - typing/path.cmo \ - typing/primitive.cmo \ - typing/type_immediacy.cmo \ - typing/shape.cmo \ - typing/types.cmo \ - typing/btype.cmo \ - typing/oprint.cmo \ - typing/subst.cmo \ - typing/predef.cmo \ - typing/datarepr.cmo \ - file_formats/cmi_format.cmo \ - typing/persistent_env.cmo \ - typing/env.cmo \ - typing/errortrace.cmo \ - typing/typedtree.cmo \ - typing/signature_group.cmo \ - typing/printtyped.cmo \ - typing/ctype.cmo \ - typing/printtyp.cmo \ - typing/includeclass.cmo \ - typing/mtype.cmo \ - typing/envaux.cmo \ - typing/includecore.cmo \ - typing/tast_iterator.cmo \ - typing/tast_mapper.cmo \ - typing/stypes.cmo \ - file_formats/cmt_format.cmo \ - typing/cmt2annot.cmo \ - typing/untypeast.cmo \ - typing/includemod.cmo \ - typing/includemod_errorprinter.cmo \ - typing/typetexp.cmo \ - typing/printpat.cmo \ - typing/patterns.cmo \ - typing/parmatch.cmo \ - typing/typedecl_properties.cmo \ - typing/typedecl_variance.cmo \ - typing/typedecl_unboxed.cmo \ - typing/typedecl_immediacy.cmo \ - typing/typedecl_separability.cmo \ - typing/typeopt.cmo \ - typing/typedecl.cmo \ - typing/rec_check.cmo \ - typing/typecore.cmo \ - typing/typeclass.cmo \ - typing/typemod.cmo -TYPING_CMI = \ - typing/annot.cmi \ - typing/outcometree.cmi - -LAMBDA = \ - lambda/debuginfo.cmo \ - lambda/lambda.cmo \ - lambda/printlambda.cmo \ - lambda/switch.cmo \ - lambda/matching.cmo \ - lambda/translobj.cmo \ - lambda/translattribute.cmo \ - lambda/translprim.cmo \ - lambda/translcore.cmo \ - lambda/translclass.cmo \ - lambda/translmod.cmo \ - lambda/tmc.cmo \ - lambda/simplif.cmo \ - lambda/runtimedef.cmo -LAMBDA_CMI = - -COMP = \ - bytecomp/meta.cmo \ - bytecomp/opcodes.cmo \ - bytecomp/bytesections.cmo \ - bytecomp/dll.cmo \ - bytecomp/symtable.cmo \ - driver/pparse.cmo \ - driver/compenv.cmo \ - driver/main_args.cmo \ - driver/compmisc.cmo \ - driver/makedepend.cmo \ - driver/compile_common.cmo -COMP_CMI = \ - file_formats/cmo_format.cmi \ - file_formats/cmx_format.cmi \ - file_formats/cmxs_format.cmi -# All file format descriptions (including cmx{,s}) are in the -# ocamlcommon library so that ocamlobjinfo can depend on them. - -COMMON_CMI = $(UTILS_CMI) $(PARSING_CMI) $(TYPING_CMI) $(LAMBDA_CMI) $(COMP_CMI) - -COMMON = $(UTILS) $(PARSING) $(TYPING) $(LAMBDA) $(COMP) - -BYTECOMP = \ - bytecomp/instruct.cmo \ - bytecomp/bytegen.cmo \ - bytecomp/printinstr.cmo \ - bytecomp/emitcode.cmo \ - bytecomp/bytelink.cmo \ - bytecomp/bytelibrarian.cmo \ - bytecomp/bytepackager.cmo \ - driver/errors.cmo \ - driver/compile.cmo \ - driver/maindriver.cmo -BYTECOMP_CMI = - -INTEL_ASM = \ - asmcomp/x86_proc.cmo \ - asmcomp/x86_dsl.cmo \ - asmcomp/x86_gas.cmo \ - asmcomp/x86_masm.cmo -INTEL_ASM_CMI = \ - asmcomp/x86_ast.cmi - -ARCH_SPECIFIC_ASMCOMP = -ARCH_SPECIFIC_ASMCOMP_CMI = -ifeq ($(ARCH),i386) -ARCH_SPECIFIC_ASMCOMP = $(INTEL_ASM) -ARCH_SPECIFIC_ASMCOMP_CMI = $(INTEL_ASM_CMI) -endif -ifeq ($(ARCH),amd64) -ARCH_SPECIFIC_ASMCOMP = $(INTEL_ASM) -ARCH_SPECIFIC_ASMCOMP_CMI = $(INTEL_ASM_CMI) -endif - -ASMCOMP = \ - $(ARCH_SPECIFIC_ASMCOMP) \ - asmcomp/arch.cmo \ - asmcomp/cmm.cmo \ - asmcomp/printcmm.cmo \ - asmcomp/reg.cmo \ - asmcomp/mach.cmo \ - asmcomp/proc.cmo \ - asmcomp/strmatch.cmo \ - asmcomp/cmmgen_state.cmo \ - asmcomp/cmm_helpers.cmo \ - asmcomp/afl_instrument.cmo \ - asmcomp/thread_sanitizer.cmo \ - asmcomp/cmmgen.cmo \ - asmcomp/cmm_invariants.cmo \ - asmcomp/interval.cmo \ - asmcomp/printmach.cmo \ - asmcomp/dataflow.cmo \ - asmcomp/polling.cmo \ - asmcomp/selectgen.cmo \ - asmcomp/selection.cmo \ - asmcomp/comballoc.cmo \ - asmcomp/CSEgen.cmo \ - asmcomp/CSE.cmo \ - asmcomp/liveness.cmo \ - asmcomp/spill.cmo \ - asmcomp/split.cmo \ - asmcomp/interf.cmo \ - asmcomp/coloring.cmo \ - asmcomp/linscan.cmo \ - asmcomp/reloadgen.cmo \ - asmcomp/reload.cmo \ - asmcomp/deadcode.cmo \ - asmcomp/stackframegen.cmo \ - asmcomp/stackframe.cmo \ - asmcomp/linear.cmo \ - asmcomp/printlinear.cmo \ - asmcomp/linearize.cmo \ - file_formats/linear_format.cmo \ - asmcomp/schedgen.cmo \ - asmcomp/scheduling.cmo \ - asmcomp/branch_relaxation.cmo \ - asmcomp/emitaux.cmo \ - asmcomp/emit.cmo \ - asmcomp/asmgen.cmo \ - asmcomp/asmlink.cmo \ - asmcomp/asmlibrarian.cmo \ - asmcomp/asmpackager.cmo \ - driver/opterrors.cmo \ - driver/optcompile.cmo \ - driver/optmaindriver.cmo -ASMCOMP_CMI = $(ARCH_SPECIFIC_ASMCOMP_CMI) - -# Files under middle_end/ are not to reference files under asmcomp/. -# This ensures that the middle end can be linked (e.g. for objinfo) even when -# the native code compiler is not present for some particular target. - -MIDDLE_END_CLOSURE = \ - middle_end/closure/closure.cmo \ - middle_end/closure/closure_middle_end.cmo -MIDDLE_END_CLOSURE_CMI = - -# Owing to dependencies through [Compilenv], which would be -# difficult to remove, some of the lower parts of Flambda (anything that is -# saved in a .cmx file) have to be included in the [MIDDLE_END] stanza, below. -MIDDLE_END_FLAMBDA = \ - middle_end/flambda/import_approx.cmo \ - middle_end/flambda/lift_code.cmo \ - middle_end/flambda/closure_conversion_aux.cmo \ - middle_end/flambda/closure_conversion.cmo \ - middle_end/flambda/initialize_symbol_to_let_symbol.cmo \ - middle_end/flambda/lift_let_to_initialize_symbol.cmo \ - middle_end/flambda/find_recursive_functions.cmo \ - middle_end/flambda/invariant_params.cmo \ - middle_end/flambda/inconstant_idents.cmo \ - middle_end/flambda/alias_analysis.cmo \ - middle_end/flambda/lift_constants.cmo \ - middle_end/flambda/share_constants.cmo \ - middle_end/flambda/simplify_common.cmo \ - middle_end/flambda/remove_unused_arguments.cmo \ - middle_end/flambda/remove_unused_closure_vars.cmo \ - middle_end/flambda/remove_unused_program_constructs.cmo \ - middle_end/flambda/simplify_boxed_integer_ops.cmo \ - middle_end/flambda/simplify_primitives.cmo \ - middle_end/flambda/inlining_stats_types.cmo \ - middle_end/flambda/inlining_stats.cmo \ - middle_end/flambda/inline_and_simplify_aux.cmo \ - middle_end/flambda/remove_free_vars_equal_to_args.cmo \ - middle_end/flambda/extract_projections.cmo \ - middle_end/flambda/augment_specialised_args.cmo \ - middle_end/flambda/unbox_free_vars_of_closures.cmo \ - middle_end/flambda/unbox_specialised_args.cmo \ - middle_end/flambda/unbox_closures.cmo \ - middle_end/flambda/inlining_transforms.cmo \ - middle_end/flambda/inlining_decision.cmo \ - middle_end/flambda/inline_and_simplify.cmo \ - middle_end/flambda/ref_to_variables.cmo \ - middle_end/flambda/flambda_invariants.cmo \ - middle_end/flambda/traverse_for_exported_symbols.cmo \ - middle_end/flambda/build_export_info.cmo \ - middle_end/flambda/closure_offsets.cmo \ - middle_end/flambda/un_anf.cmo \ - middle_end/flambda/flambda_to_clambda.cmo \ - middle_end/flambda/flambda_middle_end.cmo -MIDDLE_END_FLAMBDA_CMI = \ - middle_end/flambda/inlining_decision_intf.cmi \ - middle_end/flambda/simplify_boxed_integer_ops_intf.cmi - -MIDDLE_END = \ - middle_end/internal_variable_names.cmo \ - middle_end/linkage_name.cmo \ - middle_end/compilation_unit.cmo \ - middle_end/variable.cmo \ - middle_end/flambda/base_types/closure_element.cmo \ - middle_end/flambda/base_types/closure_id.cmo \ - middle_end/symbol.cmo \ - middle_end/backend_var.cmo \ - middle_end/clambda_primitives.cmo \ - middle_end/printclambda_primitives.cmo \ - middle_end/clambda.cmo \ - middle_end/printclambda.cmo \ - middle_end/semantics_of_primitives.cmo \ - middle_end/convert_primitives.cmo \ - middle_end/flambda/base_types/id_types.cmo \ - middle_end/flambda/base_types/export_id.cmo \ - middle_end/flambda/base_types/tag.cmo \ - middle_end/flambda/base_types/mutable_variable.cmo \ - middle_end/flambda/base_types/set_of_closures_id.cmo \ - middle_end/flambda/base_types/set_of_closures_origin.cmo \ - middle_end/flambda/base_types/closure_origin.cmo \ - middle_end/flambda/base_types/var_within_closure.cmo \ - middle_end/flambda/base_types/static_exception.cmo \ - middle_end/flambda/pass_wrapper.cmo \ - middle_end/flambda/allocated_const.cmo \ - middle_end/flambda/parameter.cmo \ - middle_end/flambda/projection.cmo \ - middle_end/flambda/flambda.cmo \ - middle_end/flambda/flambda_iterators.cmo \ - middle_end/flambda/flambda_utils.cmo \ - middle_end/flambda/freshening.cmo \ - middle_end/flambda/effect_analysis.cmo \ - middle_end/flambda/inlining_cost.cmo \ - middle_end/flambda/simple_value_approx.cmo \ - middle_end/flambda/export_info.cmo \ - middle_end/flambda/export_info_for_pack.cmo \ - middle_end/compilenv.cmo \ - $(MIDDLE_END_CLOSURE) \ - $(MIDDLE_END_FLAMBDA) -MIDDLE_END_CMI = \ - middle_end/backend_intf.cmi \ - $(MIDDLE_END_CLOSURE_CMI) \ - $(MIDDLE_END_FLAMBDA_CMI) - -OPTCOMP = $(MIDDLE_END) $(ASMCOMP) -OPTCOMP_CMI = $(MIDDLE_END_CMI) $(ASMCOMP_CMI) - -TOPLEVEL = \ - toplevel/genprintval.cmo \ - toplevel/topcommon.cmo \ - toplevel/byte/topeval.cmo \ - toplevel/byte/trace.cmo \ - toplevel/toploop.cmo \ - toplevel/topprinters.cmo \ - toplevel/topdirs.cmo \ - toplevel/byte/topmain.cmo -TOPLEVEL_CMI = \ - toplevel/topcommon.cmi \ - toplevel/byte/topeval.cmi \ - toplevel/byte/trace.cmi \ - toplevel/toploop.cmi \ - toplevel/topprinters.cmi \ - toplevel/topdirs.cmi \ - toplevel/byte/topmain.cmi - -OPTTOPLEVEL = \ - toplevel/genprintval.cmo \ - toplevel/topcommon.cmo \ - toplevel/native/tophooks.cmo \ - toplevel/native/topeval.cmo \ - toplevel/native/trace.cmo \ - toplevel/toploop.cmo \ - toplevel/topprinters.cmo \ - toplevel/topdirs.cmo \ - toplevel/native/topmain.cmo -OPTTOPLEVEL_CMI = \ - toplevel/topcommon.cmi \ - toplevel/native/tophooks.cmi \ - toplevel/native/topeval.cmi \ - toplevel/native/trace.cmi \ - toplevel/toploop.cmi \ - toplevel/topprinters.cmi \ - toplevel/topdirs.cmi \ - toplevel/native/topmain.cmi - -TOPLEVEL_SHARED_MLIS = topeval.mli trace.mli topmain.mli -TOPLEVEL_SHARED_CMIS = $(TOPLEVEL_SHARED_MLIS:%.mli=%.cmi) -TOPLEVEL_SHARED_ARTEFACTS = $(TOPLEVEL_SHARED_MLIS) $(TOPLEVEL_SHARED_CMIS) - -$(addprefix toplevel/byte/, $(TOPLEVEL_SHARED_CMIS)):\ -toplevel/byte/%.cmi: toplevel/%.cmi - cp $< toplevel/$*.mli $(@D) - -$(addprefix toplevel/native/, $(TOPLEVEL_SHARED_CMIS)):\ -toplevel/native/%.cmi: toplevel/%.cmi - cp $< toplevel/$*.mli $(@D) - -beforedepend:: - cd toplevel ; cp $(TOPLEVEL_SHARED_MLIS) byte/ - cd toplevel ; cp $(TOPLEVEL_SHARED_MLIS) native/ - -partialclean:: - cd toplevel/byte ; rm -f $(TOPLEVEL_SHARED_ARTEFACTS) - cd toplevel/native ; rm -f $(TOPLEVEL_SHARED_ARTEFACTS) - -$(COMMON:.cmo=.cmx) $(BYTECOMP:.cmo=.cmx) $(OPTCOMP:.cmo=.cmx): ocamlopt$(EXE) -$(OPTTOPLEVEL:.cmo=.cmx): ocamlopt$(EXE) - -ALL_CONFIG_CMO = utils/config_main.cmo utils/config_boot.cmo - -utils/config_%.mli: utils/config.mli - cp $^ $@ - -beforedepend:: utils/config_main.mli utils/config_boot.mli - -# Since the compiler libraries are necessarily compiled with boot/ocamlc, -# make sure they *always are*, even when rebuilding a program compiled -# with ./ocamlc (e.g. ocamltex) - -$(addprefix compilerlibs/,\ - ocamlcommon.cma ocamlbytecomp.cma ocamloptcomp.cma ocamlmiddleend.cma \ - ocamltoplevel.cma): \ - CAMLC = $(BOOT_OCAMLC) $(BOOT_STDLIBFLAGS) -use-prims runtime/primitives - -compilerlibs/ocamlcommon.cma: $(COMMON_CMI) $(ALL_CONFIG_CMO) $(COMMON) - $(V_LINKC)$(CAMLC) -a -linkall -o $@ $(COMMON) -partialclean:: - rm -f compilerlibs/ocamlcommon.cma - -compilerlibs/ocamlcommon.cmxa: $(COMMON_CMI) $(COMMON:.cmo=.cmx) - $(V_LINKOPT)$(CAMLOPT) -a -linkall -o $@ $(COMMON:.cmo=.cmx) -partialclean:: - rm -f compilerlibs/ocamlcommon.cmxa \ - compilerlibs/ocamlcommon.a compilerlibs/ocamlcommon.lib - - -compilerlibs/ocamlbytecomp.cma: $(BYTECOMP_CMI) $(BYTECOMP) - $(V_LINKC)$(CAMLC) -a -o $@ $(BYTECOMP) -partialclean:: - rm -f compilerlibs/ocamlbytecomp.cma - -compilerlibs/ocamlbytecomp.cmxa: $(BYTECOMP_CMI) $(BYTECOMP:.cmo=.cmx) - $(V_LINKOPT)$(CAMLOPT) -a $(OCAML_NATDYNLINKOPTS) -o $@ $(BYTECOMP:.cmo=.cmx) -partialclean:: - rm -f compilerlibs/ocamlbytecomp.cmxa \ - compilerlibs/ocamlbytecomp.a compilerlibs/ocamlbytecomp.lib - - -compilerlibs/ocamlmiddleend.cma: $(MIDDLE_END_CMI) $(MIDDLE_END) - $(V_LINKC)$(CAMLC) -a -o $@ $(MIDDLE_END) -compilerlibs/ocamlmiddleend.cmxa: $(MIDDLE_END_CMI) $(MIDDLE_END:%.cmo=%.cmx) - $(V_LINKOPT)$(CAMLOPT) -a -o $@ $(MIDDLE_END:%.cmo=%.cmx) -partialclean:: - rm -f compilerlibs/ocamlmiddleend.cma \ - compilerlibs/ocamlmiddleend.cmxa \ - compilerlibs/ocamlmiddleend.a \ - compilerlibs/ocamlmiddleend.lib - - -compilerlibs/ocamloptcomp.cma: $(OPTCOMP_CMI) $(OPTCOMP) - $(V_LINKC)$(CAMLC) -a -o $@ $(OPTCOMP) -partialclean:: - rm -f compilerlibs/ocamloptcomp.cma - -compilerlibs/ocamloptcomp.cmxa: $(OPTCOMP_CMI) $(OPTCOMP:.cmo=.cmx) - $(V_LINKOPT)$(CAMLOPT) -a -o $@ $(OPTCOMP:.cmo=.cmx) -partialclean:: - rm -f compilerlibs/ocamloptcomp.cmxa \ - compilerlibs/ocamloptcomp.a compilerlibs/ocamloptcomp.lib - - -compilerlibs/ocamltoplevel.cma: $(TOPLEVEL_CMI) $(TOPLEVEL) - $(V_LINKC)$(CAMLC) -a -o $@ -I toplevel/byte $(TOPLEVEL) -partialclean:: - rm -f compilerlibs/ocamltoplevel.cma - -compilerlibs/ocamltoplevel.cmxa: $(OPTTOPLEVEL_CMI) $(OPTTOPLEVEL:.cmo=.cmx) - $(V_LINKOPT)$(CAMLOPT) -a -o $@ -I toplevel/native $(OPTTOPLEVEL:.cmo=.cmx) -partialclean:: - rm -f compilerlibs/ocamltoplevel.cmxa \ - compilerlibs/ocamltoplevel.a compilerlibs/ocamltoplevel.lib diff --git a/configure b/configure index da48d8f472a..3cf3172a486 100755 --- a/configure +++ b/configure @@ -785,7 +785,7 @@ QS ocaml_libdir ocaml_bindir compute_deps -stdlib_manpages +build_libraries_manpages PACKLD mkexe_ldflags_exp mkdll_ldflags_exp @@ -817,8 +817,10 @@ ASPP ocamltest documentation_tool_cmd documentation_tool +with_ocamldoc +ocamldoc_opt_target +ocamldoc_target build_ocamldoc -ocamldoc build_ocamltex build_ocamldebug with_debugger @@ -883,6 +885,7 @@ native_cflags system model arch64 +arch_specific_SOURCES arch SO runtime_asm_objects @@ -895,6 +898,18 @@ CSCFLAGS CSC DIFF_FLAGS CC +LINEAR_MAGIC_NUMBER +CMT_MAGIC_NUMBER +CMXS_MAGIC_NUMBER +AST_INTF_MAGIC_NUMBER +AST_IMPL_MAGIC_NUMBER +CMXA_MAGIC_NUMBER +CMX_MAGIC_NUMBER +CMA_MAGIC_NUMBER +CMO_MAGIC_NUMBER +CMI_MAGIC_NUMBER +EXEC_MAGIC_NUMBER +MAGIC_NUMBER_LENGTH OCAML_VERSION_SHORT OCAML_VERSION_EXTRA OCAML_VERSION_PATCHLEVEL @@ -3244,11 +3259,10 @@ oc_dll_ldflags="" oc_exe_ldflags="" tsan=false -oc_tsan_cflags="-fsanitize=thread" - # Passed to the linker by ocamlopt when tsan is enabled - +oc_tsan_cflags="-fsanitize=thread" oc_tsan_cppflags="-DWITH_THREAD_SANITIZER" +tsan_distinguish_volatile_cflags="" # The C# compiler and its flags CSC="" @@ -3300,6 +3314,36 @@ OCAML_VERSION_EXTRA=dev0-2023-04-11 OCAML_VERSION_SHORT=5.2 +printf "%s\n" "#define MAGIC_NUMBER_PREFIX \"Caml1999\"" >>confdefs.h + +printf "%s\n" "#define MAGIC_NUMBER_VERSION \"033\"" >>confdefs.h + +MAGIC_NUMBER_LENGTH=12 + +printf "%s\n" "#define EXEC_MAGIC_LENGTH 12" >>confdefs.h + +printf "%s\n" "#define EXEC_FORMAT \"X\"" >>confdefs.h + +EXEC_MAGIC_NUMBER=Caml1999X033 + +CMI_MAGIC_NUMBER=Caml1999I033 + +CMO_MAGIC_NUMBER=Caml1999O033 + +CMA_MAGIC_NUMBER=Caml1999A033 + + + +AST_IMPL_MAGIC_NUMBER=Caml1999M033 + +AST_INTF_MAGIC_NUMBER=Caml1999N033 + +CMXS_MAGIC_NUMBER=Caml1999D033 + +CMT_MAGIC_NUMBER=Caml1999T033 + +LINEAR_MAGIC_NUMBER=Caml1999L033 + @@ -3374,6 +3418,7 @@ OCAML_VERSION_SHORT=5.2 + # TODO: rename this variable @@ -3416,6 +3461,8 @@ OCAML_VERSION_SHORT=5.2 + + @@ -3433,8 +3480,12 @@ ac_config_files="$ac_config_files manual/src/html_processing/src/common.ml" ac_config_files="$ac_config_files ocamltest/ocamltest_config.ml" +ac_config_files="$ac_config_files utils/config.common.ml" + ac_config_files="$ac_config_files utils/config.generated.ml" +ac_config_headers="$ac_config_headers runtime/caml/exec.h" + ac_config_headers="$ac_config_headers runtime/caml/m.h" ac_config_headers="$ac_config_headers runtime/caml/s.h" @@ -3768,7 +3819,7 @@ if test ${enable_ocamldoc+y} then : enableval=$enable_ocamldoc; else $as_nop - ocamldoc=auto + enable_ocamldoc='auto' fi @@ -3911,6 +3962,8 @@ fi if test ${enable_stdlib_manpages+y} then : enableval=$enable_stdlib_manpages; +else $as_nop + enable_stdlib_manpages='auto' fi @@ -4012,6 +4065,26 @@ else $as_nop build_ocamltex=true fi +if test x"$enable_ocamldoc" = "xno" +then : + if test x"$enable_stdlib_manpages" = "xyes" +then : + as_fn_error $? "--enable-stdlib-manpages requires ocamldoc" "$LINENO" 5 +fi + ocamldoc_target="" + ocamldoc_opt_target="" + with_ocamldoc="" + enable_stdlib_manpages=no + build_ocamldoc=false +else $as_nop + ocamldoc_target=ocamldoc + ocamldoc_opt_target=ocamldoc.opt + with_ocamldoc=ocamldoc + build_ocamldoc=true + ac_config_files="$ac_config_files ocamldoc/META" + +fi + # Initialization of libtool # Allow the MSVC linker to be found even if ld isn't installed. # User-specified LD still takes precedence. @@ -13729,9 +13802,51 @@ case $ocaml_cv_cc_vendor in #( outputobj='-o ' warn_error_flag='-Werror' cc_warnings="-Wall -Wint-conversion -Wstrict-prototypes \ --Wold-style-definition" ;; +-Wold-style-definition -Wundef" ;; esac +# Use -Wold-style-declaration if supported +as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_$warn_error_flag_-Wold-style-declaration" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wold-style-declaration" >&5 +printf %s "checking whether C compiler accepts -Wold-style-declaration... " >&6; } +if eval test \${$as_CACHEVAR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS $warn_error_flag -Wold-style-declaration" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : + cc_warnings="$cc_warnings -Wold-style-declaration" +else $as_nop + : +fi + + case $enable_warn_error,true in #( yes,*|,true) : cc_warnings="$cc_warnings $warn_error_flag" ;; #( @@ -14453,13 +14568,12 @@ fi # Checks for header files -ac_fn_c_check_header_compile "$LINENO" "math.h" "ac_cv_header_math_h" "$ac_includes_default" -if test "x$ac_cv_header_math_h" = xyes -then : - -fi - - for ac_header in unistd.h +# Don't check for unistd.h on Windows +case $host in #( + *-*-mingw32*|*-pc-windows) : + ;; #( + *) : + for ac_header in unistd.h do : ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" if test "x$ac_cv_header_unistd_h" = xyes @@ -14469,7 +14583,15 @@ then : fi -done +done ;; +esac + +ac_fn_c_check_header_compile "$LINENO" "math.h" "ac_cv_header_math_h" "$ac_includes_default" +if test "x$ac_cv_header_math_h" = xyes +then : + +fi + ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = xyes then : @@ -15452,6 +15574,8 @@ case $host in #( arch=amd64; system=win64 ;; #( powerpc64le*-*-linux*) : has_native_backend=yes; arch=power; model=ppc64le; system=linux ;; #( + powerpc64*-*-linux-musl*) : + has_native_backend=yes; arch=power; model=ppc64; system=linux ;; #( s390x*-*-linux*) : has_native_backend=yes; arch=s390x; model=z10; system=linux ;; #( # expected to match "gnueabihf" as well as "musleabihf" @@ -15533,6 +15657,13 @@ fi ;; #( ;; esac +case $arch in #( + amd64) : + arch_specific_SOURCES='$(intel_SOURCES)' ;; #( + *) : + arch_specific_SOURCES='' ;; +esac + native_cflags='' native_cppflags="-DTARGET_${arch} -DMODEL_${model} -DSYS_${system}" @@ -16525,12 +16656,53 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam \ esac case $ocaml_cv_cc_vendor in #( gcc*) : - oc_tsan_cflags="$oc_tsan_cflags --param=tsan-distinguish-volatile=1" ;; #( + tsan_distinguish_volatile_cflags="--param=tsan-distinguish-volatile=1" ;; #( clang*) : - oc_tsan_cflags="$oc_tsan_cflags -mllvm -tsan-distinguish-volatile" ;; #( + tsan_distinguish_volatile_cflags="-mllvm -tsan-distinguish-volatile" ;; #( *) : ;; esac + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_$warn_error_flag_-fsanitize=thread $tsan_distinguish_volatile_cflags" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fsanitize=thread $tsan_distinguish_volatile_cflags" >&5 +printf %s "checking whether C compiler accepts -fsanitize=thread $tsan_distinguish_volatile_cflags... " >&6; } +if eval test \${$as_CACHEVAR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS $warn_error_flag -fsanitize=thread $tsan_distinguish_volatile_cflags" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : + : +else $as_nop + as_fn_error $? "The C compiler does not support the \`$tsan_distinguish_volatile_cflags' flag. Try upgrading to GCC >= 11, or to Clang >= 11." "$LINENO" 5 +fi + + oc_tsan_cflags="$oc_tsan_cflags $tsan_distinguish_volatile_cflags" common_cppflags="$common_cppflags $oc_tsan_cppflags" native_cflags="$native_cflags $oc_tsan_cflags" ocamlc_cflags="$ocamlc_cflags $oc_tsan_cflags" @@ -18243,82 +18415,6 @@ fi fi -## ffs or _BitScanForward - -ac_fn_c_check_func "$LINENO" "ffs" "ac_cv_func_ffs" -if test "x$ac_cv_func_ffs" = xyes -then : - printf "%s\n" "#define HAS_FFS 1" >>confdefs.h - -fi - -ac_fn_c_check_func "$LINENO" "_BitScanForward" "ac_cv_func__BitScanForward" -if test "x$ac_cv_func__BitScanForward" = xyes -then : - printf "%s\n" "#define HAS_BITSCANFORWARD 1" >>confdefs.h - -fi - - -## pthread_getaffinity_np, args differ from GNU and BSD -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking arguments for pthread_getaffinity_np" >&5 -printf %s "checking arguments for pthread_getaffinity_np... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#define _GNU_SOURCE - #include - #include -int -main (void) -{ -cpu_set_t cs; - CPU_ZERO(&cs); - CPU_COUNT(&cs); - pthread_getaffinity_np(pthread_self(), sizeof(cs), &cs); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: gnu" >&5 -printf "%s\n" "gnu" >&6; } - printf "%s\n" "#define HAS_GNU_GETAFFINITY_NP 1" >>confdefs.h - -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - #include - #include -int -main (void) -{ -cpuset_t cs; - /* Not every BSD has CPU_ZERO and CPU_COUNT (NetBSD) */ - CPU_ZERO(&cs); - CPU_COUNT(&cs); - pthread_getaffinity_np(pthread_self(), sizeof(cs), &cs); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: BSD" >&5 -printf "%s\n" "BSD" >&6; } - printf "%s\n" "#define HAS_BSD_GETAFFINITY_NP 1" >>confdefs.h - -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: pthread_getaffinity_np not found" >&5 -printf "%s\n" "pthread_getaffinity_np not found" >&6; } -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext - if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 @@ -19313,8 +19409,9 @@ test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test "x$ax_pthread_ok" = "xyes"; then common_cflags="$common_cflags $PTHREAD_CFLAGS" - saved_CFLAGS="$CFLAGS" - saved_LIBS="$LIBS" + # The two following lines add flags and libraries for pthread to the + # global CFLAGS and LIBS variables. This means that all the subsequent + # tests can rely on the assumption that pthread is enabled. CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$LIBS $PTHREAD_LIBS" ac_fn_c_check_func "$LINENO" "sigwait" "ac_cv_func_sigwait" @@ -19324,8 +19421,6 @@ then : fi - LIBS="$saved_LIBS" - CFLAGS="$saved_CFLAGS" : else ax_pthread_ok=no @@ -19340,6 +19435,68 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu ;; esac +## pthread_getaffinity_np, args differ from GNU and BSD +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking arguments for pthread_getaffinity_np" >&5 +printf %s "checking arguments for pthread_getaffinity_np... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _GNU_SOURCE + #include + #ifdef HAS_PTHREAD_NP_H + #include + #endif + #include +int +main (void) +{ +cpu_set_t cs; + CPU_ZERO(&cs); + CPU_COUNT(&cs); + pthread_getaffinity_np(pthread_self(), sizeof(cs), &cs); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: GNU" >&5 +printf "%s\n" "GNU" >&6; } + printf "%s\n" "#define HAS_GNU_GETAFFINITY_NP 1" >>confdefs.h + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + #include +int +main (void) +{ +cpuset_t cs; + /* Not every BSD has CPU_ZERO and CPU_COUNT (NetBSD) */ + CPU_ZERO(&cs); + CPU_COUNT(&cs); + pthread_getaffinity_np(pthread_self(), sizeof(cs), &cs); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: BSD" >&5 +printf "%s\n" "BSD" >&6; } + printf "%s\n" "#define HAS_BSD_GETAFFINITY_NP 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: pthread_getaffinity_np not found" >&5 +printf "%s\n" "pthread_getaffinity_np not found" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ## Activate the systhread library case $enable_systhreads,$enable_unix_lib in #( @@ -19641,15 +19798,11 @@ else $as_nop install_source_artifacts=true fi -if test x"$enable_ocamldoc" = "xno" +if test x"$enable_stdlib_manpages" != "xno" then : - ocamldoc="" - build_ocamldoc=false + build_libraries_manpages=true else $as_nop - ocamldoc=ocamldoc - build_ocamldoc=true - ac_config_files="$ac_config_files ocamldoc/META" - + build_libraries_manpages=false fi documentation_tool_cmd='' @@ -19777,6 +19930,15 @@ else $as_nop flambda_invariants=false fi +if $flambda +then : + CMX_MAGIC_NUMBER=Caml1999y033 + CMXA_MAGIC_NUMBER=Caml1999z033 +else $as_nop + CMX_MAGIC_NUMBER=Caml1999Y033 + CMXA_MAGIC_NUMBER=Caml1999Z033 +fi + if test x"$enable_cmm_invariants" = "xyes" then : cmm_invariants=true @@ -20049,13 +20211,6 @@ case $host in #( ;; esac -if test x"$enable_stdlib_manpages" != "xno" -then : - stdlib_manpages=true -else $as_nop - stdlib_manpages=false -fi - # Do not permanently cache the result of flexdll.h unset ac_cv_header_flexdll_h @@ -21202,7 +21357,9 @@ do "manual/src/version.tex") CONFIG_FILES="$CONFIG_FILES manual/src/version.tex" ;; "manual/src/html_processing/src/common.ml") CONFIG_FILES="$CONFIG_FILES manual/src/html_processing/src/common.ml" ;; "ocamltest/ocamltest_config.ml") CONFIG_FILES="$CONFIG_FILES ocamltest/ocamltest_config.ml" ;; + "utils/config.common.ml") CONFIG_FILES="$CONFIG_FILES utils/config.common.ml" ;; "utils/config.generated.ml") CONFIG_FILES="$CONFIG_FILES utils/config.generated.ml" ;; + "runtime/caml/exec.h") CONFIG_HEADERS="$CONFIG_HEADERS runtime/caml/exec.h" ;; "runtime/caml/m.h") CONFIG_HEADERS="$CONFIG_HEADERS runtime/caml/m.h" ;; "runtime/caml/s.h") CONFIG_HEADERS="$CONFIG_HEADERS runtime/caml/s.h" ;; "runtime/caml/version.h") CONFIG_HEADERS="$CONFIG_HEADERS runtime/caml/version.h" ;; @@ -21211,12 +21368,12 @@ do "otherlibs/runtime_events/META") CONFIG_FILES="$CONFIG_FILES otherlibs/runtime_events/META" ;; "stdlib/META") CONFIG_FILES="$CONFIG_FILES stdlib/META" ;; "native-symlinks") CONFIG_COMMANDS="$CONFIG_COMMANDS native-symlinks" ;; + "ocamldoc/META") CONFIG_FILES="$CONFIG_FILES ocamldoc/META" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "otherlibs/unix/META") CONFIG_FILES="$CONFIG_FILES otherlibs/unix/META" ;; "otherlibs/unix/unix.ml") CONFIG_LINKS="$CONFIG_LINKS otherlibs/unix/unix.ml:otherlibs/unix/unix_${unix_or_win32}.ml" ;; "otherlibs/str/META") CONFIG_FILES="$CONFIG_FILES otherlibs/str/META" ;; "otherlibs/systhreads/META") CONFIG_FILES="$CONFIG_FILES otherlibs/systhreads/META" ;; - "ocamldoc/META") CONFIG_FILES="$CONFIG_FILES ocamldoc/META" ;; "ocamltest/ocamltest_unix.ml") CONFIG_LINKS="$CONFIG_LINKS ocamltest/ocamltest_unix.ml:${ocamltest_unix_mod}" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; diff --git a/configure.ac b/configure.ac index 2f1cb8bba4a..01283b805f2 100644 --- a/configure.ac +++ b/configure.ac @@ -55,11 +55,10 @@ oc_dll_ldflags="" oc_exe_ldflags="" tsan=false -oc_tsan_cflags="-fsanitize=thread" - # Passed to the linker by ocamlopt when tsan is enabled - +oc_tsan_cflags="-fsanitize=thread" oc_tsan_cppflags="-DWITH_THREAD_SANITIZER" +tsan_distinguish_volatile_cflags="" # The C# compiler and its flags CSC="" @@ -103,6 +102,22 @@ AC_SUBST([OCAML_VERSION_MINOR], [OCAML__VERSION_MINOR]) AC_SUBST([OCAML_VERSION_PATCHLEVEL], [OCAML__VERSION_PATCHLEVEL]) AC_SUBST([OCAML_VERSION_EXTRA], [OCAML__VERSION_EXTRA]) AC_SUBST([OCAML_VERSION_SHORT], [OCAML__VERSION_SHORT]) +AC_DEFINE([MAGIC_NUMBER_PREFIX], ["][MAGIC_NUMBER__PREFIX]["]) +AC_DEFINE([MAGIC_NUMBER_VERSION], ["][MAGIC_NUMBER__VERSION]["]) +AC_SUBST([MAGIC_NUMBER_LENGTH], [MAGIC_NUMBER__LENGTH]) +AC_DEFINE([EXEC_MAGIC_LENGTH], [MAGIC_NUMBER__LENGTH]) +AC_DEFINE([EXEC_FORMAT], ["][EXEC__FORMAT]["]) +AC_SUBST([EXEC_MAGIC_NUMBER], [EXEC__MAGIC_NUMBER]) +AC_SUBST([CMI_MAGIC_NUMBER], [CMI__MAGIC_NUMBER]) +AC_SUBST([CMO_MAGIC_NUMBER], [CMO__MAGIC_NUMBER]) +AC_SUBST([CMA_MAGIC_NUMBER], [CMA__MAGIC_NUMBER]) +AC_SUBST([CMX_MAGIC_NUMBER]) +AC_SUBST([CMXA_MAGIC_NUMBER]) +AC_SUBST([AST_IMPL_MAGIC_NUMBER], [AST_IMPL__MAGIC_NUMBER]) +AC_SUBST([AST_INTF_MAGIC_NUMBER], [AST_INTF__MAGIC_NUMBER]) +AC_SUBST([CMXS_MAGIC_NUMBER], [CMXS__MAGIC_NUMBER]) +AC_SUBST([CMT_MAGIC_NUMBER], [CMT__MAGIC_NUMBER]) +AC_SUBST([LINEAR_MAGIC_NUMBER], [LINEAR__MAGIC_NUMBER]) AC_SUBST([CC]) AC_SUBST([DIFF_FLAGS]) AC_SUBST([CSC]) @@ -118,6 +133,7 @@ AC_SUBST([S]) AC_SUBST([runtime_asm_objects]) AC_SUBST([SO]) AC_SUBST([arch]) +AC_SUBST([arch_specific_SOURCES]) AC_SUBST([arch64]) AC_SUBST([model]) AC_SUBST([system]) @@ -182,8 +198,10 @@ AC_SUBST([as_has_debug_prefix_map]) AC_SUBST([with_debugger]) # TODO: rename this variable AC_SUBST([build_ocamldebug]) AC_SUBST([build_ocamltex]) -AC_SUBST([ocamldoc]) AC_SUBST([build_ocamldoc]) +AC_SUBST([ocamldoc_target]) +AC_SUBST([ocamldoc_opt_target]) +AC_SUBST([with_ocamldoc]) AC_SUBST([documentation_tool]) AC_SUBST([documentation_tool_cmd]) AC_SUBST([ocamltest]) @@ -215,7 +233,7 @@ AC_SUBST([flexdll_chain]) AC_SUBST([mkdll_ldflags_exp]) AC_SUBST([mkexe_ldflags_exp]) AC_SUBST([PACKLD]) -AC_SUBST([stdlib_manpages]) +AC_SUBST([build_libraries_manpages]) AC_SUBST([compute_deps]) AC_SUBST([ocaml_bindir]) AC_SUBST([ocaml_libdir]) @@ -230,7 +248,9 @@ AC_CONFIG_FILES([stdlib/sys.ml]) AC_CONFIG_FILES([manual/src/version.tex]) AC_CONFIG_FILES([manual/src/html_processing/src/common.ml]) AC_CONFIG_FILES([ocamltest/ocamltest_config.ml]) +AC_CONFIG_FILES([utils/config.common.ml]) AC_CONFIG_FILES([utils/config.generated.ml]) +AC_CONFIG_HEADERS([runtime/caml/exec.h]) AC_CONFIG_HEADERS([runtime/caml/m.h]) AC_CONFIG_HEADERS([runtime/caml/s.h]) AC_CONFIG_HEADERS([runtime/caml/version.h]) @@ -389,7 +409,7 @@ AC_ARG_ENABLE([ocamldoc], [AS_HELP_STRING([--disable-ocamldoc], [do not build the ocamldoc documentation system])], [], - [ocamldoc=auto]) + [enable_ocamldoc='auto']) AC_ARG_WITH([odoc], [AS_HELP_STRING([--with-odoc], @@ -469,7 +489,9 @@ AC_ARG_ENABLE([reserved-header-bits], AC_ARG_ENABLE([stdlib-manpages], [AS_HELP_STRING([--disable-stdlib-manpages], - [do not build or install the library man pages])]) + [do not build or install the library man pages])], + [], + [enable_stdlib_manpages='auto']) AC_ARG_ENABLE([warn-error], [AS_HELP_STRING([--enable-warn-error], @@ -526,6 +548,20 @@ AS_IF([test x"$enable_unix_lib" = "xno" || test x"$enable_str_lib" = "xno"], build_ocamltex=false])], [build_ocamltex=true]) +AS_IF([test x"$enable_ocamldoc" = "xno"], + [AS_IF([test x"$enable_stdlib_manpages" = "xyes"], + [AC_MSG_ERROR([--enable-stdlib-manpages requires ocamldoc])]) + ocamldoc_target="" + ocamldoc_opt_target="" + with_ocamldoc="" + enable_stdlib_manpages=no + build_ocamldoc=false], + [ocamldoc_target=ocamldoc + ocamldoc_opt_target=ocamldoc.opt + with_ocamldoc=ocamldoc + build_ocamldoc=true + AC_CONFIG_FILES([ocamldoc/META])]) + # Initialization of libtool # Allow the MSVC linker to be found even if ld isn't installed. # User-specified LD still takes precedence. @@ -734,7 +770,12 @@ AS_CASE([$ocaml_cv_cc_vendor], [outputobj='-o ' warn_error_flag='-Werror' cc_warnings="-Wall -Wint-conversion -Wstrict-prototypes \ --Wold-style-definition"]) +-Wold-style-definition -Wundef"]) + +# Use -Wold-style-declaration if supported +AX_CHECK_COMPILE_FLAG([-Wold-style-declaration], + [cc_warnings="$cc_warnings -Wold-style-declaration"], [], + [$warn_error_flag]) AS_CASE([$enable_warn_error,OCAML__DEVELOPMENT_VERSION], [yes,*|,true], @@ -994,8 +1035,12 @@ AC_SEARCH_LIBS([cos], [m], # Checks for header files +# Don't check for unistd.h on Windows +AS_CASE([$host], + [*-*-mingw32*|*-pc-windows], [], + [AC_CHECK_HEADERS([unistd.h],[AC_DEFINE([HAS_UNISTD])])]) + AC_CHECK_HEADER([math.h]) -AC_CHECK_HEADERS([unistd.h],[AC_DEFINE([HAS_UNISTD])]) AC_CHECK_HEADER([stdint.h],[AC_DEFINE([HAS_STDINT_H])]) AC_CHECK_HEADER([pthread_np.h],[AC_DEFINE([HAS_PTHREAD_NP_H])]) AC_CHECK_HEADER([dirent.h], [AC_DEFINE([HAS_DIRENT])], [], @@ -1258,6 +1303,8 @@ AS_CASE([$host], [arch=amd64; system=win64], [[powerpc64le*-*-linux*]], [has_native_backend=yes; arch=power; model=ppc64le; system=linux], + [[powerpc64*-*-linux-musl*]], + [has_native_backend=yes; arch=power; model=ppc64; system=linux], [[s390x*-*-linux*]], [has_native_backend=yes; arch=s390x; model=z10; system=linux], # expected to match "gnueabihf" as well as "musleabihf" @@ -1333,6 +1380,11 @@ AS_CASE([$host], [has_native_backend=yes; arch=riscv; model=riscv64; system=linux] ) +AS_CASE([$arch], + [amd64], + [arch_specific_SOURCES='$(intel_SOURCES)'], + [arch_specific_SOURCES='']) + native_cflags='' native_cppflags="-DTARGET_${arch} -DMODEL_${model} -DSYS_${system}" @@ -1657,9 +1709,15 @@ AS_IF([$tsan], [oc_tsan_cflags="$oc_tsan_cflags -Wno-tsan"]) AS_CASE([$ocaml_cv_cc_vendor], [gcc*], - [oc_tsan_cflags="$oc_tsan_cflags --param=tsan-distinguish-volatile=1"], + [tsan_distinguish_volatile_cflags="--param=tsan-distinguish-volatile=1"], [clang*], - [oc_tsan_cflags="$oc_tsan_cflags -mllvm -tsan-distinguish-volatile"]) + [tsan_distinguish_volatile_cflags="-mllvm -tsan-distinguish-volatile"]) + AX_CHECK_COMPILE_FLAG([-fsanitize=thread $tsan_distinguish_volatile_cflags], + [], + [AC_MSG_ERROR(m4_normalize([The C compiler does not support the + `$tsan_distinguish_volatile_cflags' flag. Try upgrading to GCC >= 11, or + to Clang >= 11.]))], [$warn_error_flag]) + oc_tsan_cflags="$oc_tsan_cflags $tsan_distinguish_volatile_cflags" common_cppflags="$common_cppflags $oc_tsan_cppflags" native_cflags="$native_cflags $oc_tsan_cflags" ocamlc_cflags="$ocamlc_cflags $oc_tsan_cflags" @@ -2073,38 +2131,6 @@ AC_CHECK_HEADER([spawn.h], [AC_CHECK_FUNC([posix_spawn], [AC_CHECK_FUNC([posix_spawnp], [AC_DEFINE([HAS_POSIX_SPAWN])])])]) -## ffs or _BitScanForward - -AC_CHECK_FUNC([ffs], [AC_DEFINE([HAS_FFS])]) -AC_CHECK_FUNC([_BitScanForward], [AC_DEFINE([HAS_BITSCANFORWARD])]) - -## pthread_getaffinity_np, args differ from GNU and BSD -AC_MSG_CHECKING([arguments for pthread_getaffinity_np]) -AC_LINK_IFELSE( - [AC_LANG_PROGRAM( - [[#define _GNU_SOURCE - #include - #include ]], - [[cpu_set_t cs; - CPU_ZERO(&cs); - CPU_COUNT(&cs); - pthread_getaffinity_np(pthread_self(), sizeof(cs), &cs);]])], - [AC_MSG_RESULT([gnu]) - AC_DEFINE([HAS_GNU_GETAFFINITY_NP])], - [AC_LINK_IFELSE( - [AC_LANG_PROGRAM( - [[#include - #include - #include ]], - [[cpuset_t cs; - /* Not every BSD has CPU_ZERO and CPU_COUNT (NetBSD) */ - CPU_ZERO(&cs); - CPU_COUNT(&cs); - pthread_getaffinity_np(pthread_self(), sizeof(cs), &cs);]])], - [AC_MSG_RESULT([BSD]) - AC_DEFINE([HAS_BSD_GETAFFINITY_NP])], - [AC_MSG_RESULT([pthread_getaffinity_np not found])])]) - AC_PATH_TOOL([PKG_CONFIG], [pkg-config], [false]) ## ZSTD compression library @@ -2173,16 +2199,45 @@ AS_CASE([$host], [PTHREAD_LIBS="-l:libpthread.lib"], [AX_PTHREAD( [common_cflags="$common_cflags $PTHREAD_CFLAGS" - saved_CFLAGS="$CFLAGS" - saved_LIBS="$LIBS" + # The two following lines add flags and libraries for pthread to the + # global CFLAGS and LIBS variables. This means that all the subsequent + # tests can rely on the assumption that pthread is enabled. CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$LIBS $PTHREAD_LIBS" - AC_CHECK_FUNC([sigwait], [AC_DEFINE([HAS_SIGWAIT])]) - LIBS="$saved_LIBS" - CFLAGS="$saved_CFLAGS"], + AC_CHECK_FUNC([sigwait], [AC_DEFINE([HAS_SIGWAIT])])], [AC_MSG_ERROR(m4_normalize([POSIX threads are required but not supported on this platform]))])]) +## pthread_getaffinity_np, args differ from GNU and BSD +AC_MSG_CHECKING([arguments for pthread_getaffinity_np]) +AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#define _GNU_SOURCE + #include + #ifdef HAS_PTHREAD_NP_H + #include + #endif + #include ]], + [[cpu_set_t cs; + CPU_ZERO(&cs); + CPU_COUNT(&cs); + pthread_getaffinity_np(pthread_self(), sizeof(cs), &cs);]])], + [AC_MSG_RESULT([GNU]) + AC_DEFINE([HAS_GNU_GETAFFINITY_NP])], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include + #include + #include ]], + [[cpuset_t cs; + /* Not every BSD has CPU_ZERO and CPU_COUNT (NetBSD) */ + CPU_ZERO(&cs); + CPU_COUNT(&cs); + pthread_getaffinity_np(pthread_self(), sizeof(cs), &cs);]])], + [AC_MSG_RESULT([BSD]) + AC_DEFINE([HAS_BSD_GETAFFINITY_NP])], + [AC_MSG_RESULT([pthread_getaffinity_np not found])])]) + ## Activate the systhread library AS_CASE([$enable_systhreads,$enable_unix_lib], @@ -2234,12 +2289,8 @@ AS_IF([test x"$enable_installing_source_artifacts" = "xno"], [install_source_artifacts=false], [install_source_artifacts=true]) -AS_IF([test x"$enable_ocamldoc" = "xno"], - [ocamldoc="" - build_ocamldoc=false], - [ocamldoc=ocamldoc - build_ocamldoc=true - AC_CONFIG_FILES([ocamldoc/META])]) +AS_IF([test x"$enable_stdlib_manpages" != "xno"], + [build_libraries_manpages=true],[build_libraries_manpages=false]) documentation_tool_cmd='' AC_ARG_WITH([odoc], @@ -2287,6 +2338,12 @@ AS_IF([test x"$enable_flambda" = "xyes"], [flambda=false flambda_invariants=false]) +AS_IF([$flambda], + [CMX_MAGIC_NUMBER=CMX_FLAMBDA__MAGIC_NUMBER + CMXA_MAGIC_NUMBER=CMXA_FLAMBDA__MAGIC_NUMBER], + [CMX_MAGIC_NUMBER=CMX_CLAMBDA__MAGIC_NUMBER + CMXA_MAGIC_NUMBER=CMXA_CLAMBDA__MAGIC_NUMBER]) + AS_IF([test x"$enable_cmm_invariants" = "xyes"], [cmm_invariants=true], [cmm_invariants=false]) @@ -2426,9 +2483,6 @@ AS_CASE([$host], # as "Infinity" and "Inf" instead of the expected "inf" [AC_DEFINE([HAS_BROKEN_PRINTF])]) -AS_IF([test x"$enable_stdlib_manpages" != "xno"], - [stdlib_manpages=true],[stdlib_manpages=false]) - # Do not permanently cache the result of flexdll.h unset ac_cv_header_flexdll_h diff --git a/debugger/command_line.ml b/debugger/command_line.ml index ef50b7c9881..6e4669567df 100644 --- a/debugger/command_line.ml +++ b/debugger/command_line.ml @@ -264,7 +264,8 @@ let instr_dir ppf lexbuf = let new_directory = argument_list_eol argument lexbuf in if new_directory = [] then begin if yes_or_no "Reinitialize directory list" then begin - Load_path.init ~auto_include:Compmisc.auto_include !default_load_path; + Load_path.init ~auto_include:Compmisc.auto_include + ~visible:!default_load_path ~hidden:[]; Envaux.reset_cache (); Hashtbl.clear Debugger_config.load_path_for; flush_buffer_list () @@ -280,7 +281,8 @@ let instr_dir ppf lexbuf = List.iter (function x -> add_path (expand_path x)) new_directory' end; let print_dirs ppf l = List.iter (function x -> fprintf ppf "@ %s" x) l in - fprintf ppf "@[<2>Directories: %a@]@." print_dirs (Load_path.get_paths ()); + fprintf ppf "@[<2>Directories: %a@]@." print_dirs + (Load_path.get_path_list ()); Hashtbl.iter (fun mdl dirs -> fprintf ppf "@[<2>Source directories for %s: %a@]@." mdl print_dirs diff --git a/debugger/loadprinter.ml b/debugger/loadprinter.ml index e7e42dee6be..15ac6c325c7 100644 --- a/debugger/loadprinter.ml +++ b/debugger/loadprinter.ml @@ -40,8 +40,8 @@ let rec loadfiles ppf name = Dynlink.loadfile filename; let d = Filename.dirname name in if d <> Filename.current_dir_name then begin - if not (List.mem d (Load_path.get_paths ())) then - Load_path.add_dir d; + if not (List.mem d (Load_path.get_path_list ())) then + Load_path.add_dir ~hidden:false d; end; fprintf ppf "File %s loaded@." (if d <> Filename.current_dir_name then diff --git a/debugger/main.ml b/debugger/main.ml index b504ebeee61..006e8fd5bb7 100644 --- a/debugger/main.ml +++ b/debugger/main.ml @@ -224,7 +224,8 @@ let main () = end; if !Parameters.version then printf "\tOCaml Debugger version %s@.@." Config.version; - Load_path.init ~auto_include:Compmisc.auto_include !default_load_path; + Load_path.init ~auto_include:Compmisc.auto_include + ~visible:!default_load_path ~hidden:[]; Clflags.recursive_types := true; (* Allow recursive types. *) toplevel_loop (); (* Toplevel. *) kill_program (); diff --git a/debugger/parameters.ml b/debugger/parameters.ml index 815fab8c84c..cee4ad774e5 100644 --- a/debugger/parameters.ml +++ b/debugger/parameters.ml @@ -31,7 +31,7 @@ let time = ref true let version = ref true let add_path dir = - Load_path.add_dir dir; + Load_path.add_dir ~hidden:false dir; Envaux.reset_cache() let add_path_for mdl dir = diff --git a/debugger/program_management.ml b/debugger/program_management.ml index 160a2191f5e..ea315589d20 100644 --- a/debugger/program_management.ml +++ b/debugger/program_management.ml @@ -128,8 +128,9 @@ let initialize_loading () = end; Symbols.clear_symbols (); Symbols.read_symbols Debugcom.main_frag !program_name; - let dirs = Load_path.get_paths () @ !Symbols.program_source_dirs in - Load_path.init ~auto_include:Compmisc.auto_include dirs; + let Load_path.{visible; hidden} = Load_path.get_paths () in + let visible = visible @ !Symbols.program_source_dirs in + Load_path.init ~auto_include:Compmisc.auto_include ~visible ~hidden; Envaux.reset_cache (); if !debug_loading then prerr_endline "Opening a socket..."; diff --git a/debugger/source.ml b/debugger/source.ml index 093a431916c..5f659d2319e 100644 --- a/debugger/source.ml +++ b/debugger/source.ml @@ -40,7 +40,7 @@ let source_of_module pos mdle = else acc) Debugger_config.load_path_for - (Load_path.get_paths ()) in + (Load_path.get_path_list ()) in let fname = pos.Lexing.pos_fname in if fname = "" then let innermost_module = diff --git a/driver/compenv.ml b/driver/compenv.ml index 866cc2360da..921c0565500 100644 --- a/driver/compenv.ml +++ b/driver/compenv.ml @@ -647,7 +647,7 @@ let process_action | Some start_from -> Location.input_name := name; impl ~start_from name - | None -> raise(Arg.Bad("don't know what to do with " ^ name)) + | None -> raise(Arg.Bad("Don't know what to do with " ^ name)) let action_of_file name = @@ -687,10 +687,14 @@ let process_deferred_actions env = fatal "Options -c -o are incompatible with compiling multiple files" end; end; - if !make_archive && List.exists (function - | ProcessOtherFile name -> Filename.check_suffix name ".cmxa" - | _ -> false) !deferred_actions then - fatal "Option -a cannot be used with .cmxa input files."; + if !make_archive then begin + if List.exists (function + | ProcessOtherFile name -> Filename.check_suffix name ".cmxa" + | _ -> false) !deferred_actions then + fatal "Option -a cannot be used with .cmxa input files." + end + else if !deferred_actions = [] then + fatal "No input files"; List.iter (process_action env) (List.rev !deferred_actions); output_name := final_output_name; stop_early := diff --git a/driver/compile_common.ml b/driver/compile_common.ml index 860755bac42..a57f81933e2 100644 --- a/driver/compile_common.ml +++ b/driver/compile_common.ml @@ -60,6 +60,7 @@ let typecheck_intf info ast = sg); ignore (Includemod.signatures info.env ~mark:Mark_both sg sg); Typecore.force_delayed_checks (); + Builtin_attributes.warn_unused (); Warnings.check_fatal (); tsg @@ -117,5 +118,6 @@ let implementation info ~backend = backend info typed end; end; + Builtin_attributes.warn_unused (); Warnings.check_fatal (); ) diff --git a/driver/compmisc.ml b/driver/compmisc.ml index 355ad262eaa..dea87b479a9 100644 --- a/driver/compmisc.ml +++ b/driver/compmisc.ml @@ -23,28 +23,36 @@ let auto_include find_in_dir fn = (* Initialize the search path. [dir] (default: the current directory) is always searched first unless -nocwd is specified, - then the directories specified with the -I option (in command-line order), - then the standard library directory (unless the -nostdlib option is given). + then the directories specified with the -I option (in command line order), + then the standard library directory (unless the -nostdlib option is given), + then the directories specified with the -H option (in command line order). *) let init_path ?(auto_include=auto_include) ?(dir="") () = - let dirs = + let visible = if !Clflags.use_threads then "+threads" :: !Clflags.include_dirs else !Clflags.include_dirs in - let dirs = - !Compenv.last_include_dirs @ dirs @ Config.flexdll_dirs @ - !Compenv.first_include_dirs + let visible = + List.concat + [!Compenv.last_include_dirs; + visible; + Config.flexdll_dirs; + !Compenv.first_include_dirs] in - let exp_dirs = - List.map (Misc.expand_directory Config.standard_library) dirs + let visible = + List.map (Misc.expand_directory Config.standard_library) visible in - let dirs = + let visible = (if !Clflags.no_cwd then [] else [dir]) - @ List.rev_append exp_dirs (Clflags.std_include_dir ()) + @ List.rev_append visible (Clflags.std_include_dir ()) in - Load_path.init ~auto_include dirs; + let hidden = + List.rev_map (Misc.expand_directory Config.standard_library) + !Clflags.hidden_include_dirs + in + Load_path.init ~auto_include ~visible ~hidden; Env.reset_cache () (* Return the initial environment in which compilation proceeds. *) @@ -80,10 +88,12 @@ let set_from_env flag Clflags.{ parse; usage; env_var } = let read_clflags_from_env () = set_from_env Clflags.color Clflags.color_reader; - if - Option.is_none !Clflags.color && - Option.is_some (Sys.getenv_opt "NO_COLOR") - then + let no_color () = (* See https://no-color.org/ *) + match Sys.getenv_opt "NO_COLOR" with + | None | Some "" -> false + | _ -> true + in + if Option.is_none !Clflags.color && no_color () then Clflags.color := Some Misc.Color.Never; set_from_env Clflags.error_style Clflags.error_style_reader; () diff --git a/driver/main_args.ml b/driver/main_args.ml index c3f74735b9d..13e8fbb650f 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -148,6 +148,11 @@ let mk_i f = let mk_I f = "-I", Arg.String f, " Add to the list of include directories" +let mk_H f = + "-H", Arg.String f, + " Add to the list of \"hidden\" include directories\n\ + \ (Like -I, but the program can not directly reference these dependencies)" + let mk_impl f = "-impl", Arg.String f, " Compile as a .ml file" @@ -336,6 +341,9 @@ let mk_noinit f = let mk_nolabels f = "-nolabels", Arg.Unit f, " Ignore non-optional labels in types" +let mk_prompt f = + "-prompt", Arg.Unit f, " Output prompts (default)" + let mk_noprompt f = "-noprompt", Arg.Unit f, " Suppress all prompts" @@ -755,6 +763,7 @@ module type Common_options = sig val _no_absname : unit -> unit val _alert : string -> unit val _I : string -> unit + val _H : string -> unit val _labels : unit -> unit val _alias_deps : unit -> unit val _no_alias_deps : unit -> unit @@ -867,6 +876,7 @@ module type Toplevel_options = sig val _init : string -> unit val _noinit : unit -> unit val _no_version : unit -> unit + val _prompt : unit -> unit val _noprompt : unit -> unit val _nopromptcont : unit -> unit val _stdin : unit -> unit @@ -1025,6 +1035,7 @@ struct mk_stop_after ~native:false F._stop_after; mk_i F._i; mk_I F._I; + mk_H F._H; mk_impl F._impl; mk_intf F._intf; mk_intf_suffix F._intf_suffix; @@ -1123,6 +1134,7 @@ struct mk_no_absname F._no_absname; mk_alert F._alert; mk_I F._I; + mk_H F._H; mk_init F._init; mk_labels F._labels; mk_alias_deps F._alias_deps; @@ -1132,6 +1144,7 @@ struct mk_noassert F._noassert; mk_noinit F._noinit; mk_nolabels F._nolabels; + mk_prompt F._prompt; mk_noprompt F._noprompt; mk_nopromptcont F._nopromptcont; mk_nostdlib F._nostdlib; @@ -1217,6 +1230,7 @@ struct mk_save_ir_after ~native:true F._save_ir_after; mk_i F._i; mk_I F._I; + mk_H F._H; mk_impl F._impl; mk_inline F._inline; mk_inline_toplevel F._inline_toplevel; @@ -1355,6 +1369,7 @@ module Make_opttop_options (F : Opttop_options) = struct mk_alert F._alert; mk_compact F._compact; mk_I F._I; + mk_H F._H; mk_init F._init; mk_inline F._inline; mk_inline_toplevel F._inline_toplevel; @@ -1379,6 +1394,7 @@ module Make_opttop_options (F : Opttop_options) = struct mk_noassert F._noassert; mk_noinit F._noinit; mk_nolabels F._nolabels; + mk_prompt F._prompt; mk_noprompt F._noprompt; mk_nopromptcont F._nopromptcont; mk_nostdlib F._nostdlib; @@ -1460,6 +1476,7 @@ struct mk_no_absname F._no_absname; mk_alert F._alert; mk_I F._I; + mk_H F._H; mk_impl F._impl; mk_intf F._intf; mk_intf_suffix F._intf_suffix; @@ -1587,7 +1604,8 @@ module Default = struct module Core = struct include Common - let _I dir = include_dirs := (dir :: (!include_dirs)) + let _I dir = include_dirs := dir :: (!include_dirs) + let _H dir = hidden_include_dirs := dir :: (!hidden_include_dirs) let _color = Misc.set_or_ignore color_reader.parse color let _dlambda = set dump_lambda let _dparsetree = set dump_parsetree @@ -1791,6 +1809,7 @@ module Default = struct let _init s = init_file := (Some s) let _no_version = set noversion let _noinit = set noinit + let _prompt = clear noprompt let _noprompt = set noprompt let _nopromptcont = set nopromptcont let _stdin () = (* placeholder: file_argument ""*) () @@ -1839,6 +1858,11 @@ module Default = struct (* placeholder: Odoc_global.include_dirs := (s :: (!Odoc_global.include_dirs)) *) () + let _H(_:string) = + (* placeholder: + Odoc_global.hidden_include_dirs := + (s :: (!Odoc_global.hidden_include_dirs)) + *) () let _impl (_:string) = (* placeholder: Odoc_global.files := ((!Odoc_global.files) @ [Odoc_global.Impl_file s]) diff --git a/driver/main_args.mli b/driver/main_args.mli index e7427d2838d..e28b8fbed7b 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -21,6 +21,7 @@ module type Common_options = sig val _no_absname : unit -> unit val _alert : string -> unit val _I : string -> unit + val _H : string -> unit val _labels : unit -> unit val _alias_deps : unit -> unit val _no_alias_deps : unit -> unit @@ -133,6 +134,7 @@ module type Toplevel_options = sig val _init : string -> unit val _noinit : unit -> unit val _no_version : unit -> unit + val _prompt : unit -> unit val _noprompt : unit -> unit val _nopromptcont : unit -> unit val _stdin : unit -> unit diff --git a/driver/makedepend.ml b/driver/makedepend.ml index a0b86d03a29..c90a22036fd 100644 --- a/driver/makedepend.ml +++ b/driver/makedepend.ml @@ -13,15 +13,15 @@ (* *) (**************************************************************************) +(** Print the dependencies *) + open Parsetree module String = Misc.Stdlib.String -let ppf = Format.err_formatter -(* Print the dependencies *) +let stderr = Format.err_formatter type file_kind = ML | MLI -let load_path = ref ([] : (string * string array) list) let ml_synonyms = ref [".ml"] let mli_synonyms = ref [".mli"] let shared = ref false @@ -32,12 +32,14 @@ let sort_files = ref false let all_dependencies = ref false let nocwd = ref false let one_line = ref false +let allow_approximation = ref false +let debug = ref false + +(* [(dir, contents)] where [contents] is returned by [Sys.readdir dir]. *) +let load_path = ref ([] : (string * string array) list) let files = ref ([] : (string * file_kind * String.Set.t * string list) list) -let allow_approximation = ref false -let map_files = ref [] let module_map = ref String.Map.empty -let debug = ref false module Error_occurred : sig val set : unit -> unit @@ -50,9 +52,10 @@ end = struct let set () = error_occurred := true end +let prepend_to_list l e = l := e :: !l + (* Fix path to use '/' as directory separator instead of '\'. Only under Windows. *) - let fix_slash s = if Sys.os_type = "Unix" then s else begin String.map (function '\\' -> '/' | c -> c) s @@ -69,30 +72,27 @@ let readdir dir = try Sys.readdir dir with Sys_error msg -> - Format.fprintf Format.err_formatter "@[Bad -I option: %s@]@." msg; + Format.eprintf "@[Bad -I option: %s@]@." msg; Error_occurred.set (); [||] in dirs := String.Map.add dir contents !dirs; contents -let add_to_list li s = - li := s :: !li - let add_to_load_path dir = try let dir = Misc.expand_directory Config.standard_library dir in let contents = readdir dir in - add_to_list load_path (dir, contents) + prepend_to_list load_path (dir, contents) with Sys_error msg -> - Format.fprintf Format.err_formatter "@[Bad -I option: %s@]@." msg; + Format.eprintf "@[Bad -I option: %s@]@." msg; Error_occurred.set () let add_to_synonym_list synonyms suffix = if (String.length suffix) > 1 && suffix.[0] = '.' then - add_to_list synonyms suffix + prepend_to_list synonyms suffix else begin - Format.fprintf Format.err_formatter "@[Bad suffix: '%s'@]@." suffix; + Format.eprintf "@[Bad suffix: '%s'@]@." suffix; Error_occurred.set () end @@ -103,26 +103,21 @@ let find_module_in_load_path name = let uname = Unit_info.normalize name in List.map (fun ext -> uname ^ ext) (!mli_synonyms @ !ml_synonyms) in - let rec find_in_array a pos = - if pos >= Array.length a then None else begin - let s = a.(pos) in - if List.mem s names || List.mem s unames then - Some s - else - find_in_array a (pos + 1) - end in let rec find_in_path = function - [] -> raise Not_found - | (dir, contents) :: rem -> - match find_in_array contents 0 with - Some truename -> - if dir = "." then truename else Filename.concat dir truename - | None -> find_in_path rem in + | [] -> raise Not_found + | (dir, contents) :: rem -> + let mem s = List.mem s names || List.mem s unames in + match Array.find_opt mem contents with + | Some truename -> + if dir = Filename.current_dir_name then truename + else Filename.concat dir truename + | None -> find_in_path rem in find_in_path !load_path let find_dependency target_kind modname (byt_deps, opt_deps) = - try - let filename = find_module_in_load_path modname in + match find_module_in_load_path modname with + | exception Not_found -> (byt_deps, opt_deps) + | filename -> let basename = Filename.chop_extension filename in let cmi_file = basename ^ ".cmi" in let cmx_file = basename ^ ".cmx" in @@ -163,8 +158,6 @@ let find_dependency target_kind modname (byt_deps, opt_deps) = else [ cmx_file ] in (bytenames @ byt_deps, optnames @ opt_deps) - with Not_found -> - (byt_deps, opt_deps) let (depends_on, escaped_eol) = (":", " \\\n ") @@ -243,7 +236,7 @@ let print_raw_dependencies source_file deps = (* Process one file *) let print_exception exn = - Location.report_exception Format.err_formatter exn + Location.report_exception stderr exn let report_err exn = Error_occurred.set (); @@ -260,43 +253,40 @@ let rec lexical_approximation lexbuf = lower-case identifier - always skip the token after a backquote *) - try - let rec process after_lident lexbuf = - match Lexer.token lexbuf with - | Parser.UIDENT name -> - Depend.free_structure_names := - String.Set.add name !Depend.free_structure_names; - process false lexbuf - | Parser.LIDENT _ -> process true lexbuf - | Parser.DOT when after_lident -> process false lexbuf - | Parser.DOT | Parser.BACKQUOTE -> skip_one lexbuf - | Parser.EOF -> () - | _ -> process false lexbuf - and skip_one lexbuf = - match Lexer.token lexbuf with - | Parser.DOT | Parser.BACKQUOTE -> skip_one lexbuf - | Parser.EOF -> () - | _ -> process false lexbuf + let rec process ~after_lident lexbuf = + match Lexer.token lexbuf with + | Parser.UIDENT name -> + Depend.free_structure_names := + String.Set.add name !Depend.free_structure_names; + process ~after_lident:false lexbuf + | Parser.LIDENT _ -> process ~after_lident:true lexbuf + | Parser.DOT when after_lident -> process ~after_lident:false lexbuf + | Parser.DOT | Parser.BACKQUOTE -> skip_one lexbuf + | Parser.EOF -> () + | _ -> process ~after_lident:false lexbuf + and skip_one lexbuf = + match Lexer.token lexbuf with + | Parser.DOT | Parser.BACKQUOTE -> skip_one lexbuf + | Parser.EOF -> () + | _ -> process ~after_lident:false lexbuf - in - process false lexbuf + in + try process ~after_lident:false lexbuf with Lexer.Error _ -> lexical_approximation lexbuf let read_and_approximate inputfile = Depend.free_structure_names := String.Set.empty; - let ic = open_in_bin inputfile in - try + begin try + In_channel.with_open_bin inputfile @@ fun ic -> seek_in ic 0; Location.input_name := inputfile; let lexbuf = Lexing.from_channel ic in Location.init lexbuf inputfile; - lexical_approximation lexbuf; - close_in ic; - !Depend.free_structure_names + lexical_approximation lexbuf with exn -> - close_in ic; - report_err exn; - !Depend.free_structure_names + report_err exn + end; + !Depend.free_structure_names let read_parse_and_extract parse_function extract_function def ast_kind source_file = @@ -304,7 +294,8 @@ let read_parse_and_extract parse_function extract_function def ast_kind Depend.free_structure_names := String.Set.empty; try let input_file = Pparse.preprocess source_file in - begin try + Fun.protect ~finally:(fun () -> Pparse.remove_preprocessed input_file) + @@ fun () -> let ast = Pparse.file ~tool_name input_file parse_function ast_kind in let bound_vars = List.fold_left @@ -318,12 +309,7 @@ let read_parse_and_extract parse_function extract_function def ast_kind !module_map ((* PR#7248 *) List.rev !Clflags.open_modules) in let r = extract_function bound_vars ast in - Pparse.remove_preprocessed input_file; (!Depend.free_structure_names, r) - with x -> - Pparse.remove_preprocessed input_file; - raise x - end with x -> begin print_exception x; if not !allow_approximation then begin @@ -387,27 +373,28 @@ let ml_file_dependencies source_file = | Ptop_def s -> s | Ptop_dir _ -> [] in - List.flatten (List.map f (Parse.use_file lexbuf)) + List.concat_map f (Parse.use_file lexbuf) in let (extracted_deps, ()) = read_parse_and_extract parse_use_file_as_impl Depend.add_implementation () Pparse.Structure source_file in - files := (source_file, ML, extracted_deps, !Depend.pp_deps) :: !files + prepend_to_list files (source_file, ML, extracted_deps, !Depend.pp_deps) let mli_file_dependencies source_file = let (extracted_deps, ()) = read_parse_and_extract Parse.interface Depend.add_signature () Pparse.Signature source_file in - files := (source_file, MLI, extracted_deps, !Depend.pp_deps) :: !files + prepend_to_list files (source_file, MLI, extracted_deps, !Depend.pp_deps) let process_file_as process_fun def source_file = - Compenv.readenv ppf (Before_compile source_file); + Compenv.readenv stderr (Before_compile source_file); load_path := []; let cwd = if !nocwd then [] else [Filename.current_dir_name] in List.iter add_to_load_path ( - (!Compenv.last_include_dirs @ + (!Clflags.hidden_include_dirs @ + !Compenv.last_include_dirs @ !Clflags.include_dirs @ !Compenv.first_include_dirs @ cwd @@ -444,15 +431,13 @@ let sort_files_by_dependencies files = let key = (modname, file_kind) in let new_deps = ref [] in Hashtbl.add h key (file, new_deps); - worklist := key :: !worklist; + prepend_to_list worklist key; (modname, file_kind, deps, new_deps, pp_deps) ) files in (* Keep only dependencies to defined modules *) List.iter (fun (modname, file_kind, deps, new_deps, _pp_deps) -> - let add_dep modname kind = - new_deps := (modname, kind) :: !new_deps; - in + let add_dep modname kind = prepend_to_list new_deps (modname, kind) in String.Set.iter (fun modname -> match file_kind with ML -> (* ML depends both on ML and MLI *) @@ -479,32 +464,31 @@ let sort_files_by_dependencies files = let set = !deps in deps := []; List.iter (fun key -> - if Hashtbl.mem h key then deps := key :: !deps + if Hashtbl.mem h key then prepend_to_list deps key ) set; if !deps = [] then begin printed := true; Printf.printf "%s " file; Hashtbl.remove h key; end else - worklist := key :: !worklist + prepend_to_list worklist key ) files done; if !worklist <> [] then begin Location.error "cycle in dependencies. End of list is not sorted." - |> Location.print_report Format.err_formatter; + |> Location.print_report stderr; let sorted_deps = let li = ref [] in - Hashtbl.iter (fun _ file_deps -> li := file_deps :: !li) h; + Hashtbl.iter (fun _ file_deps -> prepend_to_list li file_deps) h; List.sort (fun (file1, _) (file2, _) -> String.compare file1 file2) !li in List.iter (fun (file, deps) -> - Format.fprintf Format.err_formatter "\t@[%s: " file; + Format.eprintf "\t@[%s: " file; List.iter (fun (modname, kind) -> - Format.fprintf Format.err_formatter "%s.%s " modname - (if kind=ML then "ml" else "mli"); + Format.eprintf "%s.%s " modname (if kind=ML then "ml" else "mli") ) !deps; - Format.fprintf Format.err_formatter "@]@."; + Format.eprintf "@]@."; Printf.printf "%s " file) sorted_deps; Error_occurred.set () end; @@ -534,7 +518,6 @@ let process_mli_map = String.Map.empty Pparse.Signature let parse_map fname = - map_files := fname :: !map_files ; let old_transp = !Clflags.transparent_modules in Clflags.transparent_modules := true; let (deps, m) = @@ -552,7 +535,7 @@ let parse_map fname = (fun ppf -> String.Set.iter (Format.fprintf ppf " %s") deps) (dump_map deps) (String.Map.add modname mm String.Map.empty) end; - let mm = Depend.(weaken_map (String.Set.singleton modname) mm) in + let mm = Depend.weaken_map (String.Set.singleton modname) mm in module_map := String.Map.add modname mm !module_map (* Dependency processing *) @@ -581,10 +564,10 @@ let print_version_num () = let run_main argv = let dep_args_rev : dep_arg list ref = ref [] in - let add_dep_arg f s = dep_args_rev := (f s) :: !dep_args_rev in + let add_dep_arg f s = prepend_to_list dep_args_rev (f s) in Clflags.classic := false; try - Compenv.readenv ppf Before_args; + Compenv.readenv stderr Before_args; Clflags.reset_arguments (); (* reset arguments from ocamlc/ocamlopt *) Clflags.add_arguments __LOC__ [ "-absname", Arg.Set Clflags.absname, @@ -600,7 +583,9 @@ let run_main argv = (* "compiler uses -no-alias-deps, and no module is coerced"; *) "-debug-map", Arg.Set debug, " Dump the delayed dependency map for each map file"; - "-I", Arg.String (add_to_list Clflags.include_dirs), + "-I", Arg.String (prepend_to_list Clflags.include_dirs), + " Add to the list of include directories"; + "-H", Arg.String (prepend_to_list Clflags.hidden_include_dirs), " Add to the list of include directories"; "-nocwd", Arg.Set nocwd, " Do not add current working directory to \ @@ -623,13 +608,13 @@ let run_main argv = " Generate dependencies for bytecode-code only (no .cmx files)"; "-one-line", Arg.Set one_line, " Output one line per file, regardless of the length"; - "-open", Arg.String (add_to_list Clflags.open_modules), + "-open", Arg.String (prepend_to_list Clflags.open_modules), " Opens the module before typing"; "-plugin", Arg.String(fun _p -> Clflags.plugin := true), " (no longer supported)"; "-pp", Arg.String(fun s -> Clflags.preprocessor := Some s), " Pipe sources through preprocessor "; - "-ppx", Arg.String (add_to_list Compenv.first_ppx), + "-ppx", Arg.String (prepend_to_list Compenv.first_ppx), " Pipe abstract syntax trees through preprocessor "; "-shared", Arg.Set shared, " Generate dependencies for native plugin files (.cmxs targets)"; @@ -654,7 +639,7 @@ let run_main argv = Compenv.parse_arguments (ref argv) (add_dep_arg (fun f -> Src (f, None))) program; process_dep_args (List.rev !dep_args_rev); - Compenv.readenv ppf Before_link; + Compenv.readenv stderr Before_link; if !sort_files then sort_files_by_dependencies !files else List.iter print_file_dependencies (List.sort compare !files); (if Error_occurred.get () then 2 else 0) @@ -662,7 +647,7 @@ let run_main argv = | Compenv.Exit_with_status n -> n | exn -> - Location.report_exception ppf exn; + Location.report_exception stderr exn; 2 diff --git a/driver/pparse.ml b/driver/pparse.ml index 2fa6e5eca87..f2b5e412a7e 100644 --- a/driver/pparse.ml +++ b/driver/pparse.ml @@ -165,7 +165,19 @@ let parse (type a) (kind : a ast_kind) lexbuf : a = | Structure -> Parse.implementation lexbuf | Signature -> Parse.interface lexbuf -let file_aux ~tool_name inputfile (type a) parse_fun invariant_fun +let set_input_lexbuf ic = + let source = + (* We read the whole source file at once. This guarantees that all + input is in the lexing buffer and can be reused by error printers + to quote source code at specific locations -- see #12238 and the + Location.lines_around* functions. *) + In_channel.input_all ic + in + let lexbuf = Lexing.from_string source in + Location.input_lexbuf := Some lexbuf; + lexbuf + +let file_aux ~tool_name ~sourcefile inputfile (type a) parse_fun invariant_fun (kind : a ast_kind) : a = let ast = let ast_magic = magic_of_kind kind in @@ -175,6 +187,12 @@ let file_aux ~tool_name inputfile (type a) parse_fun invariant_fun let ast = Fun.protect ~finally:close_ic @@ fun () -> Location.input_name := (input_value ic : string); + begin match + In_channel.with_open_bin !Location.input_name set_input_lexbuf + with + | (_ : Lexing.lexbuf) -> () + | exception Sys_error _ -> () + end; if !Clflags.unsafe then Location.prerr_warning (Location.in_file !Location.input_name) Warnings.Unsafe_array_syntax_without_parsing; @@ -184,18 +202,12 @@ let file_aux ~tool_name inputfile (type a) parse_fun invariant_fun (* if all_ppx <> [], invariant_fun will be called by apply_rewriters *) ast end else begin - let source = - (* We read the whole source file at once. This guarantees that all - input is in the lexing buffer and can be reused by error printers - to quote source code at specific locations -- see #12238 and the - Location.lines_around* functions. *) + let lexbuf = Fun.protect ~finally:close_ic @@ fun () -> seek_in ic 0; - In_channel.input_all ic + set_input_lexbuf ic in - let lexbuf = Lexing.from_string source in - Location.init lexbuf inputfile; - Location.input_lexbuf := Some lexbuf; + Location.init lexbuf sourcefile; Profile.record_call "parser" (fun () -> parse_fun lexbuf) end in @@ -204,7 +216,7 @@ let file_aux ~tool_name inputfile (type a) parse_fun invariant_fun ) let file ~tool_name inputfile parse_fun ast_kind = - file_aux ~tool_name inputfile parse_fun ignore ast_kind + file_aux ~tool_name ~sourcefile:inputfile inputfile parse_fun ignore ast_kind let report_error ppf = function | CannotRun cmd -> @@ -227,7 +239,7 @@ let parse_file ~tool_name invariant_fun parse kind sourcefile = Misc.try_finally (fun () -> Profile.record_call "parsing" @@ fun () -> - file_aux ~tool_name inputfile parse invariant_fun kind) + file_aux ~tool_name ~sourcefile inputfile parse invariant_fun kind) ~always:(fun () -> remove_preprocessed inputfile) let parse_implementation ~tool_name sourcefile = diff --git a/dune b/dune index 73f46a501d7..d1657f7382a 100644 --- a/dune +++ b/dune @@ -49,8 +49,8 @@ ;; PARSING location longident docstrings syntaxerr ast_helper camlinternalMenhirLib - parser lexer parse printast pprintast ast_mapper ast_iterator attr_helper - builtin_attributes ast_invariants depend + ast_iterator builtin_attributes parser lexer parse printast pprintast + ast_mapper attr_helper ast_invariants depend ; manual update: mli only files asttypes parsetree diff --git a/file_formats/cmo_format.mli b/file_formats/cmo_format.mli index cf0d0dadbb7..a4dbfce082e 100644 --- a/file_formats/cmo_format.mli +++ b/file_formats/cmo_format.mli @@ -15,7 +15,8 @@ (* Symbol table information for .cmo and .cma files *) -open Misc +type modname = string +type crcs = (modname * Digest.t option) list (* Names of compilation units as represented in CMO files *) type compunit = Compunit of string [@@unboxed] diff --git a/file_formats/cmt_format.ml b/file_formats/cmt_format.ml index a046eb2d952..54e7f216ec3 100644 --- a/file_formats/cmt_format.ml +++ b/file_formats/cmt_format.ml @@ -54,7 +54,7 @@ type cmt_infos = { cmt_args : string array; cmt_sourcefile : string option; cmt_builddir : string; - cmt_loadpath : string list; + cmt_loadpath : Load_path.paths; cmt_source_digest : Digest.t option; cmt_initial_env : Env.t; cmt_imports : (string * Digest.t option) list; diff --git a/file_formats/cmt_format.mli b/file_formats/cmt_format.mli index 34864091dc5..3cca22b0205 100644 --- a/file_formats/cmt_format.mli +++ b/file_formats/cmt_format.mli @@ -59,7 +59,7 @@ type cmt_infos = { cmt_args : string array; cmt_sourcefile : string option; cmt_builddir : string; - cmt_loadpath : string list; + cmt_loadpath : Load_path.paths; cmt_source_digest : string option; cmt_initial_env : Env.t; cmt_imports : crcs; diff --git a/file_formats/cmx_format.mli b/file_formats/cmx_format.mli index a9139358760..7a167d0cd4d 100644 --- a/file_formats/cmx_format.mli +++ b/file_formats/cmx_format.mli @@ -17,7 +17,7 @@ (* *) (**************************************************************************) -(* Format of .cmx, .cmxa and .cmxs files *) +(* Format of .cmx and .cmxa files *) open Misc diff --git a/file_formats/cmxs_format.mli b/file_formats/cmxs_format.mli index c670024f928..52ff0ffb55f 100644 --- a/file_formats/cmxs_format.mli +++ b/file_formats/cmxs_format.mli @@ -15,7 +15,8 @@ (* Format of .cmxs files *) -open Misc +type modname = string +type crcs = (modname * Digest.t option) list (* Each .cmxs dynamically-loaded plugin contains a symbol "caml_plugin_header" containing the following info diff --git a/lambda/lambda.ml b/lambda/lambda.ml index a7cebcc49f3..5597dbc8128 100644 --- a/lambda/lambda.ml +++ b/lambda/lambda.ml @@ -285,6 +285,7 @@ type function_attribute = { is_a_functor: bool; stub: bool; tmc_candidate: bool; + may_fuse_arity: bool; } type scoped_location = Debuginfo.Scoped_location.t @@ -297,7 +298,7 @@ type lambda = | Lfunction of lfunction | Llet of let_kind * value_kind * Ident.t * lambda * lambda | Lmutlet of value_kind * Ident.t * lambda * lambda - | Lletrec of (Ident.t * lambda) list * lambda + | Lletrec of rec_binding list * lambda | Lprim of primitive * lambda list * scoped_location | Lswitch of lambda * lambda_switch * scoped_location | Lstringswitch of @@ -314,6 +315,12 @@ type lambda = | Levent of lambda * lambda_event | Lifused of Ident.t * lambda +and rec_binding = { + id : Ident.t; + rkind : Value_rec_types.recursive_binding_kind; + def : lambda; +} + and lfunction = { kind: function_kind; params: (Ident.t * value_kind) list; @@ -378,6 +385,15 @@ let default_function_attribute = { is_a_functor = false; stub = false; tmc_candidate = false; + (* Plain functions ([fun] and [function]) set [may_fuse_arity] to [false] so + that runtime arity matches syntactic arity in more situations. + + Many things compile to functions without having a notion of syntactic arity + that survives typechecking, e.g. functors. Multi-arg functors are compiled + as nested unary functions, and rely on the arity fusion in simplif to make + them multi-argument. So, we keep arity fusion turned on by default for now. + *) + may_fuse_arity = true; } let default_stub_attribute = @@ -513,7 +529,7 @@ let shallow_iter ~tail ~non_tail:f = function f arg; tail body | Lletrec(decl, body) -> tail body; - List.iter (fun (_id, exp) -> f exp) decl + List.iter (fun { def } -> f def) decl | Lprim (Psequand, [l1; l2], _) | Lprim (Psequor, [l1; l2], _) -> f l1; @@ -570,8 +586,12 @@ let rec free_variables = function (free_variables arg) (Ident.Set.remove id (free_variables body)) | Lletrec(decl, body) -> - let set = free_variables_list (free_variables body) (List.map snd decl) in - Ident.Set.diff set (Ident.Set.of_list (List.map fst decl)) + let set = + free_variables_list (free_variables body) + (List.map (fun { def } -> def) decl) + in + Ident.Set.diff set + (Ident.Set.of_list (List.map (fun { id } -> id) decl)) | Lprim(_p, args, _loc) -> free_variables_list Ident.Set.empty args | Lswitch(arg, sw,_) -> @@ -730,6 +750,12 @@ let subst update_env ?(freshen_bound_variables = false) s input_lam = ((id', rhs) :: ids' , l) ) ids ([], l) in + let bind_rec ids l = + List.fold_right (fun rb (ids', l) -> + let id', l = bind rb.id l in + ({ rb with id = id' } :: ids' , l) + ) ids ([], l) + in let rec subst s l lam = match lam with | Lvar id as lam -> @@ -763,7 +789,7 @@ let subst update_env ?(freshen_bound_variables = false) s input_lam = let id, l' = bind id l in Lmutlet(k, id, subst s l arg, subst s l' body) | Lletrec(decl, body) -> - let decl, l' = bind_many decl l in + let decl, l' = bind_rec decl l in Lletrec(List.map (subst_decl s l') decl, subst s l' body) | Lprim(p, args, loc) -> Lprim(p, subst_list s l args, loc) | Lswitch(arg, sw, loc) -> @@ -829,7 +855,7 @@ let subst update_env ?(freshen_bound_variables = false) s input_lam = let id = try Ident.Map.find id l with Not_found -> id in Lifused (id, subst s l e) and subst_list s l li = List.map (subst s l) li - and subst_decl s l (id, exp) = (id, subst s l exp) + and subst_decl s l decl = { decl with def = subst s l decl.def } and subst_case s l (key, case) = (key, subst s l case) and subst_strcase s l (key, case) = (key, subst s l case) and subst_opt s l = function @@ -874,7 +900,7 @@ let shallow_map f = function | Lmutlet (k, v, e1, e2) -> Lmutlet (k, v, f e1, f e2) | Lletrec (idel, e2) -> - Lletrec (List.map (fun (v, e) -> (v, f e)) idel, f e2) + Lletrec (List.map (fun rb -> { rb with def = f rb.def }) idel, f e2) | Lprim (p, el, loc) -> Lprim (p, List.map f el, loc) | Lswitch (e, sw, loc) -> diff --git a/lambda/lambda.mli b/lambda/lambda.mli index d1488e30638..66eaf0b8645 100644 --- a/lambda/lambda.mli +++ b/lambda/lambda.mli @@ -272,6 +272,11 @@ type function_attribute = { is_a_functor: bool; stub: bool; tmc_candidate: bool; + (* [simplif.ml] (in the `simplif` function within `simplify_lets`) attempts to + fuse nested functions, rewriting e.g. [fun x -> fun y -> e] to + [fun x y -> e]. This fusion is allowed only when the [may_fuse_arity] field + on *both* functions involved is [true]. *) + may_fuse_arity: bool; } type scoped_location = Debuginfo.Scoped_location.t @@ -284,7 +289,7 @@ type lambda = | Lfunction of lfunction | Llet of let_kind * value_kind * Ident.t * lambda * lambda | Lmutlet of value_kind * Ident.t * lambda * lambda - | Lletrec of (Ident.t * lambda) list * lambda + | Lletrec of rec_binding list * lambda | Lprim of primitive * lambda list * scoped_location | Lswitch of lambda * lambda_switch * scoped_location (* switch on strings, clauses are sorted by string order, @@ -305,6 +310,12 @@ type lambda = | Levent of lambda * lambda_event | Lifused of Ident.t * lambda +and rec_binding = { + id : Ident.t; + rkind : Value_rec_types.recursive_binding_kind; + def : lambda; +} + and lfunction = private { kind: function_kind; params: (Ident.t * value_kind) list; diff --git a/lambda/matching.ml b/lambda/matching.ml index 0a929ad0b4d..f74450342a8 100644 --- a/lambda/matching.ml +++ b/lambda/matching.ml @@ -93,13 +93,21 @@ open Types open Typedtree open Lambda open Parmatch -open Printf open Printpat module Scoped_location = Debuginfo.Scoped_location let dbg = false +let debugf fmt = + if dbg + then Format.eprintf fmt + else Format.ifprintf Format.err_formatter fmt + +let pp_partial ppf = function + | Total -> Format.fprintf ppf "Total" + | Partial -> Format.fprintf ppf "Partial" + (* Compatibility predicate that considers potential rebindings of constructors of an extension type. @@ -126,10 +134,6 @@ and may_compats = MayCompat.compats - Jump summaries: mapping from exit numbers to contexts *) -let string_of_lam lam = - Printlambda.lambda Format.str_formatter lam; - Format.flush_str_formatter () - let all_record_args lbls = match lbls with | [] -> fatal_error "Matching.all_record_args" @@ -473,7 +477,7 @@ module Context : sig val start : int -> t - val eprintf : t -> unit + val pp : Format.formatter -> t -> unit val specialize : Patterns.Head.t -> t -> t @@ -500,8 +504,11 @@ end = struct Right: what we know about whas is below us, towards the leaves. *) - let eprintf { left; right } = - Format.eprintf "LEFT:%a RIGHT:%a\n" pretty_line left pretty_line right + let pp ppf { left; right } = + Format.fprintf ppf + "@[LEFT@ %aRIGHT@ %a@]" + pretty_line left + pretty_line right let le c1 c2 = le_pats c1.left c2.left && le_pats c1.right c2.right @@ -547,7 +554,9 @@ end = struct | [] -> true | _ -> false - let eprintf ctx = List.iter Row.eprintf ctx + let pp ppf ctx = + Format.pp_print_list ~pp_sep:Format.pp_print_cut + Row.pp ppf ctx let lshift ctx = if List.length ctx < !Clflags.match_context_rows then @@ -680,7 +689,7 @@ module Default_environment : sig val flatten : int -> t -> t - val pp : t -> unit + val pp : Format.formatter -> t -> unit end = struct type t = (int * matrix) list (** All matrices in the list should have the same arity -- their rows should @@ -820,12 +829,22 @@ end = struct | [] -> None | def :: defs -> Some (def, defs) - let pp def = - Format.eprintf "+++++ Defaults +++++\n"; - List.iter - (fun (i, pss) -> Format.eprintf "Matrix for %d\n%a" i pretty_matrix pss) - def; - Format.eprintf "+++++++++++++++++++++\n" + let pp ppf def = + Format.fprintf ppf + "@[Default environment:@,\ + %a@]" + (fun ppf li -> + if li = [] then Format.fprintf ppf "empty" + else + Format.pp_print_list ~pp_sep:Format.pp_print_cut + (fun ppf (i, pss) -> + Format.fprintf ppf + "Matrix for %d:@,\ + %a" + i + pretty_matrix pss + ) ppf li + ) def let flatten size def = List.map (fun (i, pss) -> (i, flatten_matrix size pss)) def @@ -861,16 +880,19 @@ module Jumps : sig and the rest of the jump summary. *) val extract : int -> t -> Context.t * t - val eprintf : t -> unit + val pp : Format.formatter -> t -> unit end = struct type t = (int * Context.t) list - let eprintf (env : t) = - List.iter - (fun (i, ctx) -> - Printf.eprintf "jump for %d\n" i; - Context.eprintf ctx) - env + let pp ppf (env : t) = + if env = [] then Format.fprintf ppf "empty" else + Format.pp_print_list ~pp_sep:Format.pp_print_cut (fun ppf (i, ctx) -> + Format.fprintf ppf + "jump for %d@,\ + %a" + i + Context.pp ctx + ) ppf env let rec extract i = function | [] -> (Context.empty, []) @@ -992,42 +1014,72 @@ let erase_cases f cases = let erase_pm pm = { pm with cases = erase_cases General.erase pm.cases } -let pretty_cases cases = - List.iter - (fun (ps, _l) -> - List.iter (fun p -> Format.eprintf " %a%!" top_pretty p) ps; - Format.eprintf "\n") +let pretty_cases ppf cases = + Format.fprintf ppf "@[ %a@]" + (Format.pp_print_list ~pp_sep:Format.pp_print_cut + (fun ppf (ps, _l) -> + Format.fprintf ppf "@["; + List.iter (fun p -> Format.fprintf ppf "%a@ " pretty_pat p) ps; + Format.fprintf ppf "@]"; + )) cases -let pretty_pm pm = - pretty_cases pm.cases; - if not (Default_environment.is_empty pm.default) then - Default_environment.pp pm.default +let pretty_pm_ ~print_default ppf pm = + pretty_cases ppf pm.cases; + if print_default && not (Default_environment.is_empty pm.default) then + Format.fprintf ppf "@,%a" + Default_environment.pp pm.default -let rec pretty_precompiled = function +let rec pretty_precompiled_ ~print_default ppf = function | Pm pm -> - Format.eprintf "++++ PM ++++\n"; - pretty_pm (erase_pm pm) + Format.fprintf ppf + "PM:@,\ + %a" + (pretty_pm_ ~print_default) (erase_pm pm) | PmVar x -> - Format.eprintf "++++ VAR ++++\n"; - pretty_precompiled x.inside + Format.fprintf ppf + "PM Var:@,\ + %a" + (pretty_precompiled_ ~print_default) x.inside | PmOr x -> - Format.eprintf "++++ OR ++++\n"; - pretty_pm (erase_pm x.body); - pretty_matrix Format.err_formatter x.or_matrix; - List.iter - (fun { exit = i; pm; _ } -> - eprintf "++ Handler %d ++\n" i; - pretty_pm pm) - x.handlers - -let pretty_precompiled_res first nexts = - pretty_precompiled first; - List.iter - (fun (e, pmh) -> - eprintf "** DEFAULT %d **\n" e; - pretty_precompiled pmh) - nexts + let pretty_handlers ppf handlers = + List.iter (fun { exit = i; pm; _ } -> + Format.fprintf ppf + "++ Handler %d ++@,\ + %a" + i + (pretty_pm_ ~print_default) pm + ) handlers + in + Format.fprintf ppf "PM Or:@,\ + %a@,\ + %a@,\ + %a" + (pretty_pm_ ~print_default) (erase_pm x.body) + pretty_matrix x.or_matrix + pretty_handlers x.handlers + +let pretty_pm = + pretty_pm_ ~print_default:true +let pretty_precompiled = + pretty_precompiled_ ~print_default:true +let pretty_precompiled_without_default = + pretty_precompiled_ ~print_default:false + +let pretty_precompiled_res ppf (first, nexts) = + Format.fprintf ppf + "@[First matrix:@,\ + %a@]@,\ + %a" + pretty_precompiled_without_default first + (Format.pp_print_list ~pp_sep:Format.pp_print_cut + (fun ppf (e, pmh) -> + Format.fprintf ppf + "@[Default matrix %d:@,\ + %a@]" + e + pretty_precompiled_without_default pmh) + ) nexts (* Identifying some semantically equivalent lambda-expressions, Our goal here is also to @@ -1072,8 +1124,8 @@ let make_catch_delayed handler = | None -> ( let i = next_raise_count () in (* - Printf.eprintf "SHARE LAMBDA: %i\n%s\n" i (string_of_lam handler); -*) + debugf "SHARE LAMBDA: %i@,%a@," i Printlambda.lambda handler; + *) ( i, fun body -> match body with @@ -1631,6 +1683,28 @@ and precompile_or ~arg (cls : Simple.clause list) ors args def k = }, k ) +let separate_debug_output () = + (* This function should be called when a debug-producing function + has just been called, and another debug-producing function is + about to be called. + + The format boxes used for debug pretty-printing must use @, as + *separator* between two non-empty outputs. (We use vertical boxes + with indentation, where extraneous cuts give ugly output, so we + do not want to place a cut before each item or after each item.) + + Each debug-outputting function can assume that it starts on a new + line, and is expected to *not* include a cut the end of its + output. The glue code that calls those functions is responsible + for placing separator cut @, between them. + + In most cases we know statically that some output was produced + and some other output will follow, and place a cut separator @, + at the right places in the debug format strings. But sometimes it + is not obvious in the code that a separator is needed. This + function is meant to be used in those less obvious cases. *) + debugf "@," + let dbg_split_and_precompile pm next nexts = if dbg @@ -1641,9 +1715,16 @@ let dbg_split_and_precompile pm next nexts = | _ -> false ) then ( - Format.eprintf "** SPLIT **\n"; - pretty_pm (erase_pm pm); - pretty_precompiled_res next nexts + debugf + "SPLIT@,\ + %a@,\ + @[INTO:@,\ + %a@]" + pretty_pm (erase_pm pm) + pretty_precompiled_res (next, nexts); + separate_debug_output + (* split_and_precompile is always followed by a compile_* function. *) + (); ) let split_and_precompile_simplified pm = @@ -1748,9 +1829,9 @@ let drop_expr_arg _head _arg rem = rem let get_key_constant caller = function | { pat_desc = Tpat_constant cst } -> cst | p -> - Format.eprintf "BAD: %s" caller; - pretty_pat p; - assert false + fatal_errorf "BAD(%s): %a" + caller + pretty_pat p let get_pat_args_constant = drop_pat_arg let get_expr_args_constant = drop_expr_arg @@ -1886,11 +1967,11 @@ let get_mod_field modname field = in match Env.open_pers_signature modname env with | Error `Not_found -> - fatal_error ("Module " ^ modname ^ " unavailable.") + fatal_errorf "Module %s unavailable." modname | Ok env -> ( match Env.find_value_by_name (Longident.Lident field) env with | exception Not_found -> - fatal_error ("Primitive " ^ modname ^ "." ^ field ^ " not found.") + fatal_errorf "Primitive %s.%s not found." modname field | path, _ -> transl_value_path Loc_unknown env path )) @@ -2522,8 +2603,8 @@ let as_interval_canfail fail low high l = let do_store _tag act = let i = store.act_store () act in (* - eprintf "STORE [%s] %i %s\n" tag i (string_of_lam act) ; -*) + debugf "@,STORE [%s] %i %a" tag i Printlambda.lambda act; + *) i in let rec nofail_rec cur_low cur_high cur_act = function @@ -2654,6 +2735,10 @@ let complete_pats_constrs = function *) let mk_failaction_neg partial ctx def = + debugf + "@,@[COMBINE (mk_failaction_neg %a)@]" + pp_partial partial + ; match partial with | Partial -> ( match Default_environment.pop def with @@ -2669,11 +2754,6 @@ let mk_failaction_neg partial ctx def = (* In line with the article and simpler than before *) let mk_failaction_pos partial seen ctx defs = - if dbg then ( - Format.eprintf "**POS**\n"; - Default_environment.pp defs; - () - ); let rec scan_def env to_test defs = match (to_test, Default_environment.pop defs) with | [], _ @@ -2706,21 +2786,36 @@ let mk_failaction_pos partial seen ctx defs = (List.map (fun pat -> (pat, Context.lub pat ctx)) fail_pats) defs in - if dbg then ( - eprintf "POSITIVE JUMPS [%i]:\n" (List.length fail_pats); - Jumps.eprintf jmps - ); + debugf + "@,@[COMBINE (mk_failaction_pos %a)@,\ + %a@,\ + @[FAIL PATTERNS:@,\ + %a@]@,\ + @[POSITIVE JUMPS:@,\ + %a@]\ + @]" + pp_partial partial + Default_environment.pp defs + (Format.pp_print_list ~pp_sep:Format.pp_print_cut + Printpat.pretty_pat) fail_pats + Jumps.pp jmps + ; (None, fail, jmps) ) else ( (* Too many non-matched constructors -> reduced information *) - if dbg then eprintf "POS->NEG!!!\n%!"; let fail, jumps = mk_failaction_neg partial ctx defs in - if dbg then - eprintf "FAIL: %s\n" - ( match fail with - | None -> "" - | Some lam -> string_of_lam lam - ); + debugf + "@,@[COMBINE (mk_failaction_pos)@,\ + %a@,\ + @[FAIL:@,\ + %t@]\ + @]" + Default_environment.pp defs + ( fun ppf -> match fail with + | None -> Format.fprintf ppf "" + | Some lam -> Printlambda.lambda ppf lam + ) + ; (fail, [], jumps) ) @@ -3082,8 +3177,7 @@ let rec event_branch repr lam = Llet (str, k, id, lam, event_branch repr body) | Lstaticraise _, _ -> lam | _, Some _ -> - Printlambda.lambda Format.str_formatter lam; - fatal_error ("Matching.event_branch: " ^ Format.flush_str_formatter ()) + fatal_errorf "Matching.event_branch: %a" Printlambda.lambda lam (* This exception is raised when the compiler cannot produce code @@ -3109,8 +3203,11 @@ let compile_list compile_fun division = c_rec totals rem else begin match compile_fun cell.ctx cell.pm with - | exception Unused -> c_rec totals rem + | exception Unused -> + if rem <> [] then separate_debug_output (); + c_rec totals rem | lambda1, total1 -> + if rem <> [] then separate_debug_output (); let c_rem, total, new_discrs = c_rec (Jumps.map Context.combine total1 :: totals) rem in @@ -3129,8 +3226,10 @@ let compile_orhandlers compile_fun lambda1 total1 ctx to_catch = let ctx = Context.select_columns mat ctx in match compile_fun ctx pm with | exception Unused -> + if rem <> [] then separate_debug_output (); do_rec (Lstaticcatch (r, (i, vars), lambda_unit)) total_r rem | handler_i, total_i -> + if rem <> [] then separate_debug_output (); begin match raw_action r with | Lstaticraise (j, args) -> if i = j then @@ -3217,6 +3316,7 @@ let rec comp_match_handlers comp_fun partial ctx first_match next_matches = let rec c_rec body jumps_body = function | [] -> (body, jumps_body) | (i, pm_i) :: rem -> ( + separate_debug_output (); let ctx_i, jumps_rem = Jumps.extract i jumps_body in if Context.is_empty ctx_i then c_rec body jumps_body rem @@ -3242,6 +3342,7 @@ let rec comp_match_handlers comp_fun partial ctx first_match next_matches = | first_lam, jumps -> c_rec first_lam jumps next_matches | exception Unused -> + separate_debug_output (); comp_match_handlers comp_fun partial ctx second_match next_next_matches ) @@ -3278,13 +3379,18 @@ let rec compile_match ~scopes repr partial ctx (m : initial_clause pattern_matching) = match m.cases with | ([], action) :: rem -> - if is_guarded action then - let lambda, total = - compile_match ~scopes None partial ctx { m with cases = rem } - in - (event_branch repr (patch_guarded lambda action), total) - else - (event_branch repr action, Jumps.empty) + let res = + if is_guarded action then + let lambda, total = + compile_match ~scopes None partial ctx { m with cases = rem } + in + (event_branch repr (patch_guarded lambda action), total) + else + (event_branch repr action, Jumps.empty) + in + debugf "empty matrix%t" + (fun ppf -> if is_guarded action then Format.fprintf ppf " (guarded)"); + res | nonempty_cases -> compile_match_nonempty ~scopes repr partial ctx { m with cases = map_on_rows Non_empty_row.of_initial nonempty_cases } @@ -3329,17 +3435,27 @@ and combine_handlers ~scopes repr partial ctx (v, str, arg) first_match rem = (* verbose version of do_compile_matching, for debug *) and do_compile_matching_pr ~scopes repr partial ctx x = - Format.eprintf "COMPILE: %s\nMATCH\n" - ( match partial with - | Partial -> "Partial" - | Total -> "Total" - ); - pretty_precompiled x; - Format.eprintf "CTX\n"; - Context.eprintf ctx; - let ((_, jumps) as r) = do_compile_matching ~scopes repr partial ctx x in - Format.eprintf "JUMPS\n"; - Jumps.eprintf jumps; + debugf + "@[MATCH %a\ + @,%a" + pp_partial partial + pretty_precompiled x; + debugf "@,@[CTX:@,%a@]" + Context.pp ctx; + debugf "@,@[COMPILE:@,"; + let ((_, jumps) as r) = + try do_compile_matching ~scopes repr partial ctx x with + | exn -> + debugf "EXN (%s)@]@]" (Printexc.to_string exn); + raise exn + in + debugf "@]"; + if Jumps.is_empty jumps then + debugf "@,NO JUMPS" + else + debugf "@,@[JUMPS:@,%a@]" + Jumps.pp jumps; + debugf "@]"; r and do_compile_matching ~scopes repr partial ctx pmh = @@ -3552,6 +3668,12 @@ let check_total ~scopes loc ~failer total lambda i = failure_handler ~scopes loc ~failer ()) let toplevel_handler ~scopes loc ~failer partial args cases compile_fun = + let compile_fun partial pm = + debugf "@[MATCHING@,"; + let result = compile_fun partial pm in + debugf "@]@."; + result + in match partial with | Total when not !Clflags.safer_matching -> let default = Default_environment.empty in @@ -3797,12 +3919,8 @@ let flatten_simple_pattern size (p : Simple.pattern) = where we know that the scrutinee is a tuple literal. Since the PM is well typed, none of these cases are possible. *) - let msg = - Format.fprintf Format.str_formatter - "Matching.flatten_pattern: got '%a'" top_pretty (General.erase p); - Format.flush_str_formatter () - in - fatal_error msg + fatal_errorf + "Matching.flatten_pattern: got '%a'" pretty_pat (General.erase p) let flatten_cases size cases = List.map diff --git a/lambda/printlambda.ml b/lambda/printlambda.ml index fff85d7ba8d..455ee8bcaf3 100644 --- a/lambda/printlambda.ml +++ b/lambda/printlambda.ml @@ -581,9 +581,16 @@ let rec lam ppf = function let bindings ppf id_arg_list = let spc = ref false in List.iter - (fun (id, l) -> + (fun { id; rkind; def } -> if !spc then fprintf ppf "@ " else spc := true; - fprintf ppf "@[<2>%a@ %a@]" Ident.print id lam l) + let rec_annot = + match rkind with + | Static -> "" + | Not_recursive -> "[Nonrec]" + | Constant -> "[Cst]" + | Class -> "[Class]" + in + fprintf ppf "@[<2>%a%s@ %a@]" Ident.print id rec_annot lam def) id_arg_list in fprintf ppf "@[<2>(letrec@ (@[%a@])@ %a)@]" bindings id_arg_list lam body diff --git a/lambda/simplif.ml b/lambda/simplif.ml index f84737844b8..8d01fcc2912 100644 --- a/lambda/simplif.ml +++ b/lambda/simplif.ml @@ -40,8 +40,11 @@ let rec eliminate_ref id = function | Lmutlet(kind, v, e1, e2) -> Lmutlet(kind, v, eliminate_ref id e1, eliminate_ref id e2) | Lletrec(idel, e2) -> - Lletrec(List.map (fun (v, e) -> (v, eliminate_ref id e)) idel, - eliminate_ref id e2) + let bindings = + List.map (fun rb -> { rb with def = eliminate_ref id rb.def }) + idel + in + Lletrec(bindings, eliminate_ref id e2) | Lprim(Pfield (0, _, _), [Lvar v], _) when Ident.same v id -> Lmutvar id | Lprim(Psetfield(0, _, _), [Lvar v; e], _) when Ident.same v id -> @@ -129,7 +132,7 @@ let simplify_exits lam = | Lmutlet(_kind, _v, l1, l2) -> count ~try_depth l2; count ~try_depth l1 | Lletrec(bindings, body) -> - List.iter (fun (_v, l) -> count ~try_depth l) bindings; + List.iter (fun { def } -> count ~try_depth def) bindings; count ~try_depth body | Lprim(_p, ll, _) -> List.iter (count ~try_depth) ll | Lswitch(l, sw, _loc) -> @@ -226,8 +229,11 @@ let simplify_exits lam = | Lmutlet(kind, v, l1, l2) -> Lmutlet(kind, v, simplif ~try_depth l1, simplif ~try_depth l2) | Lletrec(bindings, body) -> - Lletrec(List.map (fun (v, l) -> (v, simplif ~try_depth l)) bindings, - simplif ~try_depth body) + let bindings = + List.map (fun rb -> { rb with def = simplif ~try_depth rb.def }) + bindings + in + Lletrec(bindings, simplif ~try_depth body) | Lprim(p, ll, loc) -> begin let ll = List.map (simplif ~try_depth) ll in match p, ll with @@ -417,7 +423,7 @@ let simplify_lets lam = count bv l1; count bv l2 | Lletrec(bindings, body) -> - List.iter (fun (_v, l) -> count bv l) bindings; + List.iter (fun { def } -> count bv def) bindings; count bv body | Lprim(_p, ll, _) -> List.iter (count bv) ll | Lswitch(l, sw, _loc) -> @@ -510,19 +516,23 @@ let simplify_lets lam = end | _ -> no_opt () end - | Lfunction{kind; params; return=return1; body = l; attr; loc} -> + | Lfunction{kind; params; return=return1; body = l; attr=attr1; loc} + -> begin match simplif l with - Lfunction{kind=Curried; params=params'; return=return2; body; attr; loc} + Lfunction{kind=Curried; params=params'; return=return2; body; + attr=attr2; loc} when kind = Curried && optimize && + attr1.may_fuse_arity && attr2.may_fuse_arity && List.length params + List.length params' <= Lambda.max_arity() -> (* The return type is the type of the value returned after applying all the parameters to the function. The return type of the merged function taking [params @ params'] as parameters is the type returned after applying [params']. *) let return = return2 in - lfunction ~kind ~params:(params @ params') ~return ~body ~attr ~loc + lfunction ~kind ~params:(params @ params') ~return ~body ~attr:attr2 + ~loc | body -> - lfunction ~kind ~params ~return:return1 ~body ~attr ~loc + lfunction ~kind ~params ~return:return1 ~body ~attr:attr1 ~loc end | Llet(_str, _k, v, Lvar w, l2) when optimize -> Hashtbl.add subst v (simplif (Lvar w)); @@ -556,7 +566,11 @@ let simplify_lets lam = | Llet(str, kind, v, l1, l2) -> mklet str kind v (simplif l1) (simplif l2) | Lmutlet(kind, v, l1, l2) -> mkmutlet kind v (simplif l1) (simplif l2) | Lletrec(bindings, body) -> - Lletrec(List.map (fun (v, l) -> (v, simplif l)) bindings, simplif body) + let bindings = + List.map (fun rb -> { rb with def = simplif rb.def }) + bindings + in + Lletrec(bindings, simplif body) | Lprim(p, ll, loc) -> Lprim(p, List.map simplif ll, loc) | Lswitch(l, sw, loc) -> let new_l = simplif l @@ -629,7 +643,7 @@ let rec emit_tail_infos is_tail lambda = emit_tail_infos false lam; emit_tail_infos is_tail body | Lletrec (bindings, body) -> - List.iter (fun (_, lam) -> emit_tail_infos false lam) bindings; + List.iter (fun { def } -> emit_tail_infos false def) bindings; emit_tail_infos is_tail body | Lprim ((Pbytes_to_string | Pbytes_of_string), [arg], _) -> emit_tail_infos is_tail arg @@ -753,14 +767,17 @@ let split_default_wrapper ~id:fun_id ~kind ~params ~return ~body ~attr ~loc = ~params:(List.map (fun id -> id, Pgenval) new_ids) ~return ~body ~attr ~loc in - (wrapper_body, (inner_id, inner_fun)) + (wrapper_body, { id = inner_id; rkind = Static; def = inner_fun }) in try let body, inner = aux [] body in let attr = default_stub_attribute in - [(fun_id, lfunction ~kind ~params ~return ~body ~attr ~loc); inner] + [{ id = fun_id; rkind = Static; + def = lfunction ~kind ~params ~return ~body ~attr ~loc }; + inner] with Exit -> - [(fun_id, lfunction ~kind ~params ~return ~body ~attr ~loc)] + [{ id = fun_id; rkind = Static; + def = lfunction ~kind ~params ~return ~body ~attr ~loc }] (* Simplify local let-bound functions: if all occurrences are fully-applied function calls in the same "tail scope", replace the diff --git a/lambda/simplif.mli b/lambda/simplif.mli index 2e5be0acca1..8161579abc8 100644 --- a/lambda/simplif.mli +++ b/lambda/simplif.mli @@ -37,4 +37,4 @@ val split_default_wrapper -> body:lambda -> attr:function_attribute -> loc:Lambda.scoped_location - -> (Ident.t * lambda) list + -> rec_binding list diff --git a/lambda/tmc.ml b/lambda/tmc.ml index 18c489cd2f8..899a01b9eca 100644 --- a/lambda/tmc.ml +++ b/lambda/tmc.ml @@ -551,6 +551,10 @@ and specialized = { direct_kind: function_kind; } +type _ binding_kind = + | Recursive : rec_binding binding_kind + | Non_recursive : (Ident.t * lambda) binding_kind + let llets lk vk bindings body = List.fold_right (fun (var, def) body -> Llet (lk, vk, var, def, body) @@ -928,17 +932,41 @@ and traverse ctx = function and traverse_let outer_ctx var def = let inner_ctx = declare_binding outer_ctx (var, def) in - let bindings = traverse_binding outer_ctx inner_ctx (var, def) in + let bindings = + traverse_binding Non_recursive outer_ctx inner_ctx (var, def) + in inner_ctx, bindings and traverse_letrec ctx bindings = - let ctx = List.fold_left declare_binding ctx bindings in - let bindings = List.concat_map (traverse_binding ctx ctx) bindings in + let ctx = + List.fold_left declare_binding ctx + (List.map (fun { id; rkind=_; def } -> id, def) bindings) + in + let bindings = + List.concat_map (traverse_binding Recursive ctx ctx) bindings + in ctx, bindings -and traverse_binding outer_ctx inner_ctx (var, def) = +and traverse_binding : + type a. a binding_kind -> context -> context -> a -> a list = + fun binding_kind outer_ctx inner_ctx binding -> + let (var, def) : Ident.t * lambda = + match binding_kind, binding with + | Recursive, { id; rkind=_; def } -> id, def + | Non_recursive, (var, def) -> var, def + in + let mk_same_binding (var : Ident.t) (def : lambda) : a = + match binding_kind, binding with + | Recursive, { id=_; rkind; def=_ } -> { id = var; rkind; def } + | Non_recursive, _ -> var, def + in + let mk_static_binding (var : Ident.t) (def : lambda) : a = + match binding_kind, binding with + | Recursive, _ -> { id = var; rkind = Static; def } + | Non_recursive, _ -> var, def + in match find_candidate def with - | None -> [(var, traverse outer_ctx def)] + | None -> [mk_same_binding var (traverse outer_ctx def)] | Some lfun -> let special = Ident.Map.find var inner_ctx.specialized in let fun_choice = choice outer_ctx ~tail:true lfun.body in @@ -968,7 +996,7 @@ and traverse_binding outer_ctx inner_ctx (var, def) = ~loc:lfun.loc in let dps_var = special.dps_id in - [(var, direct); (dps_var, dps)] + [mk_static_binding var direct; mk_static_binding dps_var dps] and traverse_list ctx terms = List.map (traverse ctx) terms diff --git a/lambda/translattribute.ml b/lambda/translattribute.ml index b0d2018c50f..aa889e1f7d3 100644 --- a/lambda/translattribute.ml +++ b/lambda/translattribute.ml @@ -16,54 +16,48 @@ open Typedtree open Lambda open Location +open Builtin_attributes -let is_inline_attribute = function - | {txt=("inline"|"ocaml.inline")} -> true - | _ -> false +let return_if_flambda = + if Config.flambda then Return else Mark_used_only -let is_inlined_attribute = function - | {txt=("inlined"|"ocaml.inlined")} -> true - | {txt=("unrolled"|"ocaml.unrolled")} when Config.flambda -> true - | _ -> false +let is_inline_attribute = + [ "inline", Return ] -let is_specialise_attribute = function - | {txt=("specialise"|"ocaml.specialise")} when Config.flambda -> true - | _ -> false +let is_inlined_attribute = + [ "inlined", Return + ; "unrolled", return_if_flambda + ] -let is_specialised_attribute = function - | {txt=("specialised"|"ocaml.specialised")} when Config.flambda -> true - | _ -> false +let is_specialise_attribute = + [ "specialise", return_if_flambda ] -let is_local_attribute = function - | {txt=("local"|"ocaml.local")} -> true - | _ -> false +let is_specialised_attribute = + [ "specialised", return_if_flambda ] -let is_tmc_attribute = function - | {txt=("tail_mod_cons"|"ocaml.tail_mod_cons")} -> true - | _ -> false +let is_local_attribute = + [ "local", Return ] -let is_poll_attribute = function - | {txt=("poll")} -> true - | _ -> false +let is_tailcall_attribute = + [ "tailcall", Return ] + +let is_tmc_attribute = + [ "tail_mod_cons", Return ] + +let is_poll_attribute = + [ "poll", Return ] let find_attribute p attributes = - let inline_attribute, other_attributes = - List.partition (fun a -> p a.Parsetree.attr_name) attributes - in + let inline_attribute = select_attributes p attributes in let attr = match inline_attribute with | [] -> None | [attr] -> Some attr - | _ :: {Parsetree.attr_name = {txt;loc}; _} :: _ -> + | attr :: {Parsetree.attr_name = {txt;loc}; _} :: _ -> Location.prerr_warning loc (Warnings.Duplicated_attribute txt); - None + Some attr in - attr, other_attributes - -let is_unrolled = function - | {txt="unrolled"|"ocaml.unrolled"} -> true - | {txt="inline"|"ocaml.inline"|"inlined"|"ocaml.inlined"} -> false - | _ -> assert false + attr let get_payload get_from_exp = let open Parsetree in @@ -131,8 +125,8 @@ let parse_id_payload txt loc ~default ~empty cases payload = let parse_inline_attribute attr = match attr with | None -> Default_inline - | Some {Parsetree.attr_name = {txt;loc} as id; attr_payload = payload} -> - if is_unrolled id then begin + | Some ({Parsetree.attr_name = {txt;loc}; attr_payload = payload} as attr) -> + if attr_equals_builtin attr "unrolled" then begin (* the 'unrolled' attributes must be used as [@unrolled n]. *) let warning txt = Warnings.Attribute_payload (txt, "It must be an integer literal") @@ -193,19 +187,19 @@ let parse_poll_attribute attr = payload let get_inline_attribute l = - let attr, _ = find_attribute is_inline_attribute l in + let attr = find_attribute is_inline_attribute l in parse_inline_attribute attr let get_specialise_attribute l = - let attr, _ = find_attribute is_specialise_attribute l in + let attr = find_attribute is_specialise_attribute l in parse_specialise_attribute attr let get_local_attribute l = - let attr, _ = find_attribute is_local_attribute l in + let attr = find_attribute is_local_attribute l in parse_local_attribute attr let get_poll_attribute l = - let attr, _ = find_attribute is_poll_attribute l in + let attr = find_attribute is_poll_attribute l in parse_poll_attribute attr let check_local_inline loc attr = @@ -238,28 +232,31 @@ let lfunction_with_attr ~attr { kind; params; return; body; attr=_; loc } = lfunction ~kind ~params ~return ~body ~attr ~loc let add_inline_attribute expr loc attributes = - match expr, get_inline_attribute attributes with - | expr, Default_inline -> expr - | Lfunction({ attr = { stub = false } as attr } as funct), inline -> - begin match attr.inline with - | Default_inline -> () - | Always_inline | Hint_inline | Never_inline | Unroll _ -> - Location.prerr_warning loc - (Warnings.Duplicated_attribute "inline") - end; - let attr = { attr with inline } in - check_local_inline loc attr; - check_poll_inline loc attr; + match expr with + | Lfunction({ attr = { stub = false } as attr } as funct) -> + begin match get_inline_attribute attributes with + | Default_inline -> expr + | (Always_inline | Hint_inline | Never_inline | Unroll _) + as inline -> + begin match attr.inline with + | Default_inline -> () + | Always_inline | Hint_inline | Never_inline | Unroll _ -> + Location.prerr_warning loc + (Warnings.Duplicated_attribute "inline") + end; + let attr = { attr with inline } in + check_local_inline loc attr; + check_poll_inline loc attr; lfunction_with_attr ~attr funct - | expr, (Always_inline | Hint_inline | Never_inline | Unroll _) -> - Location.prerr_warning loc - (Warnings.Misplaced_attribute "inline"); - expr + end + | _ -> expr let add_specialise_attribute expr loc attributes = - match expr, get_specialise_attribute attributes with - | expr, Default_specialise -> expr - | Lfunction({ attr = { stub = false } as attr } as funct), specialise -> + match expr with + | Lfunction({ attr = { stub = false } as attr } as funct) -> + begin match get_specialise_attribute attributes with + | Default_specialise -> expr + | (Always_specialise | Never_specialise) as specialise -> begin match attr.specialise with | Default_specialise -> () | Always_specialise | Never_specialise -> @@ -268,15 +265,15 @@ let add_specialise_attribute expr loc attributes = end; let attr = { attr with specialise } in lfunction_with_attr ~attr funct - | expr, (Always_specialise | Never_specialise) -> - Location.prerr_warning loc - (Warnings.Misplaced_attribute "specialise"); - expr + end + | _ -> expr let add_local_attribute expr loc attributes = - match expr, get_local_attribute attributes with - | expr, Default_local -> expr - | Lfunction({ attr = { stub = false } as attr } as funct), local -> + match expr with + | Lfunction({ attr = { stub = false } as attr } as funct) -> + begin match get_local_attribute attributes with + | Default_local -> expr + | (Always_local | Never_local) as local -> begin match attr.local with | Default_local -> () | Always_local | Never_local -> @@ -287,150 +284,83 @@ let add_local_attribute expr loc attributes = check_local_inline loc attr; check_poll_local loc attr; lfunction_with_attr ~attr funct - | expr, (Always_local | Never_local) -> - Location.prerr_warning loc - (Warnings.Misplaced_attribute "local"); - expr + end + | _ -> expr let add_tmc_attribute expr loc attributes = - let is_tmc_attribute a = is_tmc_attribute a.Parsetree.attr_name in - if List.exists is_tmc_attribute attributes then - match expr with - | Lfunction funct -> + match expr with + | Lfunction funct -> + let attr = find_attribute is_tmc_attribute attributes in + begin match attr with + | None -> expr + | Some _ -> if funct.attr.tmc_candidate then Location.prerr_warning loc (Warnings.Duplicated_attribute "tail_mod_cons"); let attr = { funct.attr with tmc_candidate = true } in lfunction_with_attr ~attr funct - | expr -> - Location.prerr_warning loc - (Warnings.Misplaced_attribute "tail_mod_cons"); - expr - else - expr + end + | _ -> expr let add_poll_attribute expr loc attributes = - match expr, get_poll_attribute attributes with - | expr, Default_poll -> expr - | Lfunction({ attr = { stub = false } as attr } as funct), poll -> + match expr with + | Lfunction({ attr = { stub = false } as attr } as funct) -> + begin match get_poll_attribute attributes with + | Default_poll -> expr + | Error_poll as poll -> begin match attr.poll with | Default_poll -> () | Error_poll -> Location.prerr_warning loc - (Warnings.Duplicated_attribute "error_poll") + (Warnings.Duplicated_attribute "poll error") end; let attr = { attr with poll } in check_poll_inline loc attr; check_poll_local loc attr; let attr = { attr with inline = Never_inline; local = Never_local } in lfunction_with_attr ~attr funct - | expr, Error_poll -> - Location.prerr_warning loc - (Warnings.Misplaced_attribute "error_poll"); - expr - -(* Get the [@inlined] attribute payload (or default if not present). - It also returns the expression without this attribute. This is - used to ensure that this attribute is not misplaced: If it - appears on any expression, it is an error, otherwise it would - have been removed by this function *) -let get_and_remove_inlined_attribute e = - let attr, exp_attributes = - find_attribute is_inlined_attribute e.exp_attributes - in - let inlined = parse_inline_attribute attr in - inlined, { e with exp_attributes } + end + | expr -> expr -let get_and_remove_inlined_attribute_on_module e = - let rec get_and_remove mod_expr = - let attr, mod_attributes = - find_attribute is_inlined_attribute mod_expr.mod_attributes - in +(* Get the [@inlined] attribute payload (or default if not present). *) +let get_inlined_attribute e = + let attr = find_attribute is_inlined_attribute e.exp_attributes in + parse_inline_attribute attr + +let get_inlined_attribute_on_module e = + let rec get mod_expr = + let attr = find_attribute is_inlined_attribute mod_expr.mod_attributes in let attr = parse_inline_attribute attr in - let attr, mod_desc = + let attr = match mod_expr.Typedtree.mod_desc with - | Tmod_constraint (me, mt, mtc, mc) -> - let inner_attr, me = get_and_remove me in - let attr = - match attr with - | Always_inline | Hint_inline | Never_inline | Unroll _ -> attr - | Default_inline -> inner_attr - in - attr, Tmod_constraint (me, mt, mtc, mc) - | md -> attr, md + | Tmod_constraint (me, _, _, _) -> + let inner_attr = get me in + begin match attr with + | Always_inline | Hint_inline | Never_inline | Unroll _ -> attr + | Default_inline -> inner_attr + end + | _ -> attr in - attr, { mod_expr with mod_desc; mod_attributes } + attr in - get_and_remove e + get e -let get_and_remove_specialised_attribute e = - let attr, exp_attributes = - find_attribute is_specialised_attribute e.exp_attributes - in - let specialised = parse_specialise_attribute attr in - specialised, { e with exp_attributes } +let get_specialised_attribute e = + let attr = find_attribute is_specialised_attribute e.exp_attributes in + parse_specialise_attribute attr -(* It also removes the attribute from the expression, like - get_inlined_attribute *) let get_tailcall_attribute e = - let is_tailcall_attribute = function - | {Parsetree.attr_name = {txt=("tailcall"|"ocaml.tailcall")}; _} -> true - | _ -> false - in - let tailcalls, other_attributes = - List.partition is_tailcall_attribute e.exp_attributes - in - let tailcall_attribute = match tailcalls with - | [] -> Default_tailcall - | {Parsetree.attr_name = {txt; loc}; attr_payload = payload} :: r -> - begin match r with - | [] -> () - | {Parsetree.attr_name = {txt;loc}; _} :: _ -> - Location.prerr_warning loc (Warnings.Duplicated_attribute txt) - end; - match get_optional_payload get_bool_from_exp payload with - | Ok (None | Some true) -> Tailcall_expectation true - | Ok (Some false) -> Tailcall_expectation false - | Error () -> - let msg = "Only an optional boolean literal is supported." in - Location.prerr_warning loc (Warnings.Attribute_payload (txt, msg)); - Default_tailcall - in - tailcall_attribute, { e with exp_attributes = other_attributes } - -let check_attribute e {Parsetree.attr_name = { txt; loc }; _} = - match txt with - | "inline" | "ocaml.inline" - | "specialise" | "ocaml.specialise" - | "poll" -> begin - match e.exp_desc with - | Texp_function _ -> () - | _ -> - Location.prerr_warning loc - (Warnings.Misplaced_attribute txt) - end - | "inlined" | "ocaml.inlined" - | "specialised" | "ocaml.specialised" - | "tailcall" | "ocaml.tailcall" -> - (* Removed by the Texp_apply cases *) - Location.prerr_warning loc - (Warnings.Misplaced_attribute txt) - | _ -> () - -let check_attribute_on_module e {Parsetree.attr_name = { txt; loc }; _} = - match txt with - | "inline" | "ocaml.inline" -> begin - match e.mod_desc with - | Tmod_functor _ -> () - | _ -> - Location.prerr_warning loc - (Warnings.Misplaced_attribute txt) - end - | "inlined" | "ocaml.inlined" -> - (* Removed by the Texp_apply cases *) - Location.prerr_warning loc - (Warnings.Misplaced_attribute txt) - | _ -> () + let attr = find_attribute is_tailcall_attribute e.exp_attributes in + match attr with + | None -> Default_tailcall + | Some {Parsetree.attr_name = {txt; loc}; attr_payload = payload} -> + match get_optional_payload get_bool_from_exp payload with + | Ok (None | Some true) -> Tailcall_expectation true + | Ok (Some false) -> Tailcall_expectation false + | Error () -> + let msg = "Only an optional boolean literal is supported." in + Location.prerr_warning loc (Warnings.Attribute_payload (txt, msg)); + Default_tailcall let add_function_attributes lam loc attr = let lam = diff --git a/lambda/translattribute.mli b/lambda/translattribute.mli index 6047ab5207c..8edc346517a 100644 --- a/lambda/translattribute.mli +++ b/lambda/translattribute.mli @@ -13,16 +13,6 @@ (* *) (**************************************************************************) -val check_attribute - : Typedtree.expression - -> Parsetree.attribute - -> unit - -val check_attribute_on_module - : Typedtree.module_expr - -> Parsetree.attribute - -> unit - val add_inline_attribute : Lambda.lambda -> Location.t @@ -53,21 +43,21 @@ val get_local_attribute : Parsetree.attributes -> Lambda.local_attribute -val get_and_remove_inlined_attribute +val get_inlined_attribute : Typedtree.expression - -> Lambda.inline_attribute * Typedtree.expression + -> Lambda.inline_attribute -val get_and_remove_inlined_attribute_on_module +val get_inlined_attribute_on_module : Typedtree.module_expr - -> Lambda.inline_attribute * Typedtree.module_expr + -> Lambda.inline_attribute -val get_and_remove_specialised_attribute +val get_specialised_attribute : Typedtree.expression - -> Lambda.specialise_attribute * Typedtree.expression + -> Lambda.specialise_attribute val get_tailcall_attribute : Typedtree.expression - -> Lambda.tailcall_attribute * Typedtree.expression + -> Lambda.tailcall_attribute val add_function_attributes : Lambda.lambda diff --git a/lambda/translclass.ml b/lambda/translclass.ml index b3c5278a079..12915737706 100644 --- a/lambda/translclass.ml +++ b/lambda/translclass.ml @@ -31,7 +31,8 @@ let lfunction params body = if params = [] then body else match body with | Lfunction {kind = Curried; params = params'; body = body'; attr; loc} - when List.length params + List.length params' <= Lambda.max_arity() -> + when attr.may_fuse_arity && + List.length params + List.length params' <= Lambda.max_arity() -> lfunction ~kind:Curried ~params:(params @ params') ~return:Pgenval ~body:body' @@ -666,7 +667,7 @@ let free_methods l = | Lmutlet(_k, id, _arg, _body) -> fv := Ident.Set.remove id !fv | Lletrec(decl, _body) -> - List.iter (fun (id, _exp) -> fv := Ident.Set.remove id !fv) decl + List.iter (fun { id } -> fv := Ident.Set.remove id !fv) decl | Lstaticcatch(_e1, (_,vars), _e2) -> List.iter (fun (id, _) -> fv := Ident.Set.remove id !fv) vars | Ltrywith(_e1, exn, _e2) -> diff --git a/lambda/translcore.ml b/lambda/translcore.ml index 659a08ab8e3..764af455df9 100644 --- a/lambda/translcore.ml +++ b/lambda/translcore.ml @@ -120,6 +120,11 @@ let assert_failed loc ~scopes exp = Const_base(Const_int line); Const_base(Const_int char)]))], loc))], loc) +(* In cases where we're careful to preserve syntactic arity, we disable + the arity fusion attempted by simplif.ml *) +let function_attribute_disallowing_arity_fusion = + { default_function_attribute with may_fuse_arity = false } + let rec cut n l = if n = 0 then ([],l) else match l with [] -> failwith "Translcore.cut" @@ -179,7 +184,6 @@ let rec transl_exp ~scopes e = We give it f's scope. *) and transl_exp1 ~scopes ~in_new_scope e = - List.iter (Translattribute.check_attribute e) e.exp_attributes; let eval_once = (* Whether classes for immediate objects must be cached *) match e.exp_desc with @@ -222,30 +226,18 @@ and transl_exp0 ~in_new_scope ~scopes e = in if extra_args = [] then lam else begin - let tailcall, funct = - Translattribute.get_tailcall_attribute funct - in - let inlined, funct = - Translattribute.get_and_remove_inlined_attribute funct - in - let specialised, funct = - Translattribute.get_and_remove_specialised_attribute funct - in + let tailcall = Translattribute.get_tailcall_attribute funct in + let inlined = Translattribute.get_inlined_attribute funct in + let specialised = Translattribute.get_specialised_attribute funct in let e = { e with exp_desc = Texp_apply(funct, oargs) } in event_after ~scopes e (transl_apply ~scopes ~tailcall ~inlined ~specialised lam extra_args (of_location ~scopes e.exp_loc)) end | Texp_apply(funct, oargs) -> - let tailcall, funct = - Translattribute.get_tailcall_attribute funct - in - let inlined, funct = - Translattribute.get_and_remove_inlined_attribute funct - in - let specialised, funct = - Translattribute.get_and_remove_specialised_attribute funct - in + let tailcall = Translattribute.get_tailcall_attribute funct in + let inlined = Translattribute.get_inlined_attribute funct in + let specialised = Translattribute.get_specialised_attribute funct in let e = { e with exp_desc = Texp_apply(funct, oargs) } in event_after ~scopes e (transl_apply ~scopes ~tailcall ~inlined ~specialised @@ -524,7 +516,11 @@ and transl_exp0 ~in_new_scope ~scopes e = let fn = lfunction ~kind:Curried ~params:[Ident.create_local "param", Pgenval] ~return:Pgenval - ~attr:default_function_attribute + (* The translation of [e] may be a function, in + which case disallowing arity fusion gives a very + small performance improvement. + *) + ~attr:function_attribute_disallowing_arity_fusion ~loc:(of_location ~scopes e.exp_loc) ~body:(transl_exp ~scopes e) in Lprim(Pmakeblock(Config.lazy_tag, Mutable, None), [fn], @@ -643,8 +639,21 @@ and transl_apply ~scopes ap_specialised=specialised; } in + (* Build a function application. + Particular care is required for out-of-order partial applications. + The following code guarantees that: + * arguments are evaluated right-to-left according to their order in + the type of the function, before the function is called; + * side-effects occurring after receiving a non-optional parameter + will occur exactly when all the arguments up to this parameter + have been received; + * side-effects occurring after receiving an optional parameter + will occur at the latest when all the arguments up to the first + non-optional parameter that follows it have been received. + *) let rec build_apply lam args = function (None, optional) :: l -> + (* Out-of-order partial application; we will need to build a closure *) let defs = ref [] in let protect name lam = match lam with @@ -654,6 +663,8 @@ and transl_apply ~scopes defs := (id, lam) :: !defs; Lvar id in + (* If all arguments in [args] were optional, delay their application + until after this one is received *) let args, args' = if List.for_all (fun (_,opt) -> opt) args then [], args else args, [] @@ -661,29 +672,36 @@ and transl_apply ~scopes let lam = if args = [] then lam else lapply lam (List.rev_map fst args) in + (* Evaluate the function, applied to the arguments in [args] *) let handle = protect "func" lam in + (* Evaluate the arguments whose applications was delayed; + if we already passed here this is a no-op. *) + let args' = + List.map (fun (arg, opt) -> protect "arg" arg, opt) args' + in + (* Evaluate the remaining arguments; + if we already passed here this is a no-op. *) let l = List.map (fun (arg, opt) -> Option.map (protect "arg") arg, opt) l in let id_arg = Ident.create_local "param" in + (* Process remaining arguments and build closure *) let body = match build_apply handle ((Lvar id_arg, optional)::args') l with - Lfunction{kind = Curried; params = ids; return; - body = lam; attr; loc} - when List.length ids < Lambda.max_arity () -> - lfunction ~kind:Curried - ~params:((id_arg, Pgenval)::ids) - ~return - ~body:lam ~attr - ~loc - | lam -> + Lfunction{kind = Curried; params = ids; return; body; attr; loc} + when List.length ids < Lambda.max_arity () -> + lfunction ~kind:Curried ~params:((id_arg, Pgenval)::ids) + ~return ~body ~attr ~loc + | body -> lfunction ~kind:Curried ~params:[id_arg, Pgenval] - ~return:Pgenval ~body:lam + ~return:Pgenval ~body ~attr:default_stub_attribute ~loc in - List.fold_left - (fun body (id, lam) -> Llet(Strict, Pgenval, id, lam, body)) - body !defs + (* Wrap "protected" definitions, starting from the left, + so that evaluation is right-to-left. *) + List.fold_right + (fun (id, lam) body -> Llet(Strict, Pgenval, id, lam, body)) + !defs body | (Some arg, optional) :: l -> build_apply lam ((arg, optional) :: args) l | [] -> @@ -831,7 +849,7 @@ and transl_curried_function ~scopes loc return repr params body = let body, return = List.fold_right (fun chunk (body, return) -> - let attr = default_function_attribute in + let attr = function_attribute_disallowing_arity_fusion in let loc = of_location ~scopes loc in let body = lfunction ~kind:Curried ~params:chunk ~return ~body ~attr ~loc @@ -852,7 +870,7 @@ and transl_function ~scopes e params body = let params, body = fuse_method_arity params body in transl_function_without_attributes ~scopes e.exp_loc repr params body) in - let attr = default_function_attribute in + let attr = function_attribute_disallowing_arity_fusion in let loc = of_location ~scopes e.exp_loc in let lam = lfunction ~kind ~params ~return ~body ~attr ~loc in let attrs = @@ -897,7 +915,8 @@ and transl_let ~scopes ?(in_structure=false) rec_flag pat_expr_list = let rec transl = function [] -> fun body -> body - | {vb_pat=pat; vb_expr=expr; vb_attributes=attr; vb_loc} :: rem -> + | {vb_pat=pat; vb_expr=expr; vb_rec_kind=_; vb_attributes=attr; vb_loc} + :: rem -> let lam = transl_bound_exp ~scopes ~in_structure pat expr in let lam = Translattribute.add_function_attributes lam vb_loc attr in let mk_body = transl rem in @@ -912,12 +931,13 @@ and transl_let ~scopes ?(in_structure=false) rec_flag pat_expr_list = | Tpat_alias ({pat_desc=Tpat_any}, id,_) -> id | _ -> assert false) pat_expr_list in - let transl_case {vb_expr=expr; vb_attributes; vb_loc; vb_pat} id = - let lam = transl_bound_exp ~scopes ~in_structure vb_pat expr in - let lam = - Translattribute.add_function_attributes lam vb_loc vb_attributes + let transl_case {vb_expr=expr; vb_attributes; vb_rec_kind = rkind; + vb_loc; vb_pat} id = + let def = transl_bound_exp ~scopes ~in_structure vb_pat expr in + let def = + Translattribute.add_function_attributes def vb_loc vb_attributes in - (id, lam) in + { id; rkind; def } in let lam_bds = List.map2 transl_case pat_expr_list idlist in fun body -> Lletrec(lam_bds, body) @@ -1173,7 +1193,7 @@ and transl_letop ~scopes loc env let_ ands param case partial = { cases = [case]; param; partial; loc = ghost_loc; exp_extra = None; attributes = []; })) in - let attr = default_function_attribute in + let attr = function_attribute_disallowing_arity_fusion in let loc = of_location ~scopes case.c_rhs.exp_loc in lfunction ~kind ~params ~return ~body ~attr ~loc in diff --git a/lambda/translmod.ml b/lambda/translmod.ml index bb39711885f..d5fd7e5a267 100644 --- a/lambda/translmod.ml +++ b/lambda/translmod.ml @@ -121,7 +121,8 @@ and apply_coercion_result loc strict funct params args cc_res = ~return:Pgenval ~attr:{ default_function_attribute with is_a_functor = true; - stub = true; } + stub = true; + may_fuse_arity = true; } ~loc ~body:(apply_coercion loc Strict cc_res @@ -425,7 +426,8 @@ let transl_class_bindings ~scopes cl_list = (ids, List.map (fun ({ci_id_class=id; ci_expr=cl; ci_virt=vf}, meths) -> - (id, transl_class ~scopes ids id meths cl vf)) + let def = transl_class ~scopes ids id meths cl vf in + { id; rkind = Class; def}) cl_list) (* Compile one or more functors, merging curried functors to produce @@ -499,6 +501,7 @@ let rec compile_functor ~scopes mexp coercion root_path loc = is_a_functor = true; stub = false; tmc_candidate = false; + may_fuse_arity = true; } ~loc ~body @@ -506,8 +509,6 @@ let rec compile_functor ~scopes mexp coercion root_path loc = (* Compile a module expression *) and transl_module ~scopes cc rootpath mexp = - List.iter (Translattribute.check_attribute_on_module mexp) - mexp.mod_attributes; let loc = of_location ~scopes mexp.mod_loc in match mexp.mod_desc with | Tmod_ident (path,_) -> @@ -529,8 +530,8 @@ and transl_module ~scopes cc rootpath mexp = apply_coercion loc Strict cc (Translcore.transl_exp ~scopes arg) and transl_apply ~scopes ~loc ~cc mod_env funct translated_arg = - let inlined_attribute, funct = - Translattribute.get_and_remove_inlined_attribute_on_module funct + let inlined_attribute = + Translattribute.get_inlined_attribute_on_module funct in oo_wrap mod_env true (apply_coercion loc Strict cc) @@ -669,11 +670,7 @@ and transl_structure ~scopes loc fields cc rootpath final_env = function | Some id -> Llet(pure_module mb.mb_expr, Pgenval, id, module_body, body), size end - | Tstr_module ({mb_presence=Mp_absent} as mb) -> - List.iter (Translattribute.check_attribute_on_module mb.mb_expr) - mb.mb_attributes; - List.iter (Translattribute.check_attribute_on_module mb.mb_expr) - mb.mb_expr.mod_attributes; + | Tstr_module ({mb_presence=Mp_absent}) -> transl_structure ~scopes loc fields cc rootpath final_env rem | Tstr_recmodule bindings -> let ext_fields = @@ -1048,10 +1045,7 @@ let transl_store_structure ~scopes glob map prims aliases str = transl_store ~scopes rootpath subst cont rem ) | Tstr_module{mb_id=Some id;mb_loc=loc;mb_presence=Mp_present; - mb_expr={mod_desc = Tmod_structure str} as mexp; - mb_attributes} -> - List.iter (Translattribute.check_attribute_on_module mexp) - mb_attributes; + mb_expr={mod_desc = Tmod_structure str}} -> let loc = of_location ~scopes loc in let lam = transl_store @@ -1075,14 +1069,11 @@ let transl_store_structure ~scopes glob map prims aliases str = mb_id=Some id;mb_loc=loc;mb_presence=Mp_present; mb_expr= { mod_desc = Tmod_constraint ( - {mod_desc = Tmod_structure str} as mexp, _, _, - (Tcoerce_structure (map, _) as _cc))}; - mb_attributes + {mod_desc = Tmod_structure str}, _, _, + (Tcoerce_structure (map, _) as _cc))} } -> (* Format.printf "coerc id %s: %a@." (Ident.unique_name id) Includemod.print_coercion cc; *) - List.iter (Translattribute.check_attribute_on_module mexp) - mb_attributes; let loc = of_location ~scopes loc in let lam = transl_store @@ -1123,11 +1114,7 @@ let transl_store_structure ~scopes glob map prims aliases str = transl_store ~scopes rootpath (add_ident true id subst) cont rem)) - | Tstr_module ({mb_presence=Mp_absent} as mb) -> - List.iter (Translattribute.check_attribute_on_module mb.mb_expr) - mb.mb_attributes; - List.iter (Translattribute.check_attribute_on_module mb.mb_expr) - mb.mb_expr.mod_attributes; + | Tstr_module ({mb_presence=Mp_absent}) -> transl_store ~scopes rootpath subst cont rem | Tstr_recmodule bindings -> let ids = List.filter_map (fun mb -> mb.mb_id) bindings in @@ -1158,16 +1145,11 @@ let transl_store_structure ~scopes glob map prims aliases str = incl_loc=loc; incl_mod= { mod_desc = Tmod_constraint ( - ({mod_desc = Tmod_structure str} as mexp), _, _, + ({mod_desc = Tmod_structure str}), _, _, (Tcoerce_structure _ | Tcoerce_none))} - | ({ mod_desc = Tmod_structure str} as mexp); - incl_attributes; + | ({ mod_desc = Tmod_structure str}); incl_type; } as incl) -> - List.iter (Translattribute.check_attribute_on_module mexp) - incl_attributes; - (* Shouldn't we use mod_attributes instead of incl_attributes? - Same question for the Tstr_module cases above, btw. *) let lam = transl_store ~scopes None subst lambda_unit str.str_items (* It is tempting to pass rootpath instead of None @@ -1562,11 +1544,7 @@ let transl_toplevel_item ~scopes item = transl_module ~scopes Tcoerce_none None od.open_expr, set_idents 0 ids) end - | Tstr_module ({mb_presence=Mp_absent} as mb) -> - List.iter (Translattribute.check_attribute_on_module mb.mb_expr) - mb.mb_attributes; - List.iter (Translattribute.check_attribute_on_module mb.mb_expr) - mb.mb_expr.mod_attributes; + | Tstr_module ({mb_presence=Mp_absent}) -> lambda_unit | Tstr_modtype _ | Tstr_type _ diff --git a/man/ocaml.1 b/man/ocaml.1 index 3bc2f6e8f68..9bf9de1da6e 100644 --- a/man/ocaml.1 +++ b/man/ocaml.1 @@ -36,24 +36,20 @@ The command is the toplevel system for OCaml, that permits interactive use of the OCaml system through a read-eval-print loop. In this mode, the system repeatedly reads OCaml -phrases from the input, then typechecks, compiles and evaluates -them, then prints the inferred type and result value, if any. The -system prints a # (hash) prompt before reading each phrase. - -A toplevel phrase can span several lines. It is terminated by ;; (a -double-semicolon). The syntax of toplevel phrases is as follows. - -The toplevel system is started by the command -.BR ocaml (1). -Phrases are read on standard input, results are printed on standard -output, errors on standard error. End-of-file on standard input -terminates +phrases from standard input, then typechecks, compiles and evaluates +them, then prints the inferred type and result value, if any. +End-of-file on standard input terminates .BR ocaml (1). +Input to the toplevel can span several lines. It begins after the # +(sharp) prompt printed by the system and is terminated by ;; (a +double-semicolon) followed by optional white space and an end of line. +The toplevel input consists in one or several toplevel phrases. + If one or more .I object-files -(ending in .cmo or .cma) are given, they are loaded silently before -starting the toplevel. +(ending in .cmo or .cma) are given on the command line, they are +loaded silently before starting the toplevel. If a .I script-file diff --git a/man/ocamldep.1 b/man/ocamldep.1 index c774b48c20e..166936b7315 100644 --- a/man/ocamldep.1 +++ b/man/ocamldep.1 @@ -177,6 +177,11 @@ Generate dependencies for native plugin files (.cmxs) in addition to native compiled files (.cmx). .TP .B \-slash +(Windows) Use forward slash / instead of backslash \\ in file paths. +Under Unix, this option does nothing. +.TP +.B \-no\-slash +(Windows) Preserve any backslash \\ in file paths. Under Unix, this option does nothing. .TP .B \-sort @@ -188,6 +193,14 @@ Print version string and exit. .B \-vnum Print short version number and exit. .TP +.BI \-args " file" +Read additional newline separated command line arguments from +.IR file . +.TP +.BI \-args0 " file" +Read additional NUL separated command line arguments from +.IR file . +.TP .BR \-help " or " \-\-help Display a short usage summary and exit. diff --git a/manual/src/cmds/intf-c.etex b/manual/src/cmds/intf-c.etex index 7d80f9cd86d..ebb240bf378 100644 --- a/manual/src/cmds/intf-c.etex +++ b/manual/src/cmds/intf-c.etex @@ -616,7 +616,8 @@ contains "h", second field "t".} \end{tableau} As a convenience, "caml/mlvalues.h" defines the macros "Val_unit", -"Val_false" and "Val_true" to refer to "()", "false" and "true". +"Val_false", "Val_true" and "Val_emptylist" to refer to "()", +"false", "true" and "[]". The following example illustrates the assignment of integers and block tags to constructors: @@ -710,6 +711,7 @@ truth value of the C integer \var{x}. \item "Bool_val("\var{v}")" returns 0 if \var{v} is the OCaml boolean "false", 1 if \var{v} is "true". \item "Val_true", "Val_false" represent the OCaml booleans "true" and "false". +\item "Val_emptylist", "Val_emptylist" represents the empty list. \item "Val_none" represents the OCaml value "None". \end{itemize} @@ -1210,7 +1212,7 @@ value alloc_list_int(int i1, int i2) r = caml_alloc(2, 0); /* Allocate a cons cell */ Store_field(r, 0, Val_int(i2)); /* car = the integer i2 */ - Store_field(r, 1, Val_int(0)); /* cdr = the empty list [] */ + Store_field(r, 1, Val_emptylist); /* cdr = the empty list [] */ result = caml_alloc(2, 0); /* Allocate the other cons cell */ Store_field(result, 0, Val_int(i1)); /* car = the integer i1 */ Store_field(result, 1, r); /* cdr = the first cons cell */ @@ -1233,7 +1235,7 @@ value alloc_list_int(int i1, int i2) r = caml_alloc_small(2, 0); /* Allocate a cons cell */ Field(r, 0) = Val_int(i2); /* car = the integer i2 */ - Field(r, 1) = Val_int(0); /* cdr = the empty list [] */ + Field(r, 1) = Val_emptylist; /* cdr = the empty list [] */ result = caml_alloc_small(2, 0); /* Allocate the other cons cell */ Field(result, 0) = Val_int(i1); /* car = the integer i1 */ Field(result, 1) = r; /* cdr = the first cons cell */ @@ -1254,7 +1256,7 @@ value alloc_list_int(int i1, int i2) Field(r, 1) = Val_int(0); /* A dummy value tail = caml_alloc_small(2, 0); /* Allocate the other cons cell */ Field(tail, 0) = Val_int(i2); /* car = the integer i2 */ - Field(tail, 1) = Val_int(0); /* cdr = the empty list [] */ + Field(tail, 1) = Val_emptylist; /* cdr = the empty list [] */ caml_modify(&Field(r, 1), tail); /* cdr of the result = tail */ CAMLreturn (r); } diff --git a/manual/src/cmds/ocamldep.etex b/manual/src/cmds/ocamldep.etex index 93d6741d02b..1213cb9b1b2 100644 --- a/manual/src/cmds/ocamldep.etex +++ b/manual/src/cmds/ocamldep.etex @@ -65,6 +65,12 @@ and no dependencies are generated. For programs that span multiple directories, it is recommended to pass "ocamldep" the same "-I" options that are passed to the compiler. +\item["-H" \var{directory}] +Behaves identically to "-I", except that the "-H" directories are searched +last. This flag is included to make it easier to invoke "ocamldep" with +the same options as the compiler, where "-H" is used for transitive +dependencies that the program should not directly mention. + \item["-nocwd"] Do not add current working directory to the list of include directories. diff --git a/manual/src/cmds/ocamldoc.etex b/manual/src/cmds/ocamldoc.etex index e2488f6f0a3..51022fd571c 100644 --- a/manual/src/cmds/ocamldoc.etex +++ b/manual/src/cmds/ocamldoc.etex @@ -207,6 +207,10 @@ They have the same meaning as for the "ocamlc" and "ocamlopt" commands. Add \var{directory} to the list of directories search for compiled interface files (".cmi" files). +\item["-H" \var{directory}] +Like "-I", but the "-H" directories are searched last and the program may +not directly refer to the modules added to the search path this way. + \item["-nolabels"] Ignore non-optional labels in types. diff --git a/manual/src/cmds/top.etex b/manual/src/cmds/top.etex index e237443c704..8b91f47c2f3 100644 --- a/manual/src/cmds/top.etex +++ b/manual/src/cmds/top.etex @@ -1,21 +1,22 @@ \chapter{The toplevel system or REPL (ocaml)} \label{c:camllight} %HEVEA\cutname{toplevel.html} -This chapter describes the toplevel system for OCaml, that permits +This chapter describes "ocaml", the toplevel system for OCaml, that permits interactive use of the OCaml system through a read-eval-print loop (REPL). In this mode, the system repeatedly reads OCaml phrases from the input, then typechecks, compile and evaluate them, then prints the inferred type and result value, if -any. The system prints a "#" (sharp) prompt before reading each -phrase. +any. End-of-file on standard input terminates "ocaml". -Input to the toplevel can span several lines. It is terminated by @";;"@ (a -double-semicolon). The toplevel input consists in one or several +Input to the toplevel can span several lines. It begins after the "#" +(sharp) prompt printed by the system and is terminated by @";;"@ (a +double-semicolon) followed by optional white space and comments and an +end of line. The toplevel input consists in one or several toplevel phrases, with the following syntax: \begin{syntax} toplevel-input: - {{ definition }} ';;' + { definition } ';;' | expr ';;' | '#' ident [ directive-argument ] ';;' ; @@ -26,10 +27,10 @@ directive-argument: | 'true' || 'false' \end{syntax} -A phrase can consist of a definition, like those found in +A phrase can consist of a sequence of definitions, like those found in implementations of compilation units or in @'struct' \ldots 'end'@ -module expressions. The definition can bind value names, type names, -an exception, a module name, or a module type name. The toplevel +module expressions. The definitions can bind value names, type names, +exceptions, module names, or module type names. The toplevel system performs the bindings, then prints the types and values (if any) for the names thus defined. diff --git a/manual/src/cmds/unified-options.etex b/manual/src/cmds/unified-options.etex index ec161dedd9f..a409557f671 100644 --- a/manual/src/cmds/unified-options.etex +++ b/manual/src/cmds/unified-options.etex @@ -300,6 +300,16 @@ the toplevel is running with the "#directory" directive (section~\ref{s:toplevel-directives}). }%top +\notop{% +\item["-H" \var{directory}] +Behaves identically to "-I", except that (a) programs may not directly refer to +modules added to the search path this way, and (b) these directories are +searched after any "-I" directories. This makes it possible to provide the +compiler with compiled interface and object code files for the current program's +transitive dependencies (the dependencies of its dependencies) without allowing +them to silently become direct dependencies. +}%notop + \top{% \item["-init" \var{file}] Load the given file instead of the default initialization file. diff --git a/manual/src/library/stdlib-blurb.etex b/manual/src/library/stdlib-blurb.etex index 7c90119eb42..41cf39f0737 100644 --- a/manual/src/library/stdlib-blurb.etex +++ b/manual/src/library/stdlib-blurb.etex @@ -59,6 +59,7 @@ the above 4 modules \\ "Stack" & p.~\stdpageref{Stack} & last-in first-out stacks \\ "Queue" & p.~\stdpageref{Queue} & first-in first-out queues \\ "Buffer" & p.~\stdpageref{Buffer} & buffers that grow on demand \\ +"Dynarray" & p.~\stdpageref{Dynarray} & dynamic arrays: arrays that grow on demand \\ "Seq" & p.~\stdpageref{Seq} & functional iterators \\ "Lazy" & p.~\stdpageref{Lazy} & delayed evaluation \\ "Weak" & p.~\stdpageref{Weak} & references that don't prevent objects @@ -133,6 +134,7 @@ be called from C \\ \stddocitem{Condition}{condition variables to synchronize between threads} \stddocitem{Domain}{Domain spawn/join and domain local variables} \stddocitem{Digest}{MD5 message digest} +\stddocitem{Dynarray}{Dynamic arrays} \stddocitem{Effect}{deep and shallow effect handlers} \stddocitem{Either}{either values} \stddocitem{Ephemeron}{Ephemerons and weak hash table} diff --git a/manual/src/refman/extensions/signaturesubstitution.etex b/manual/src/refman/extensions/signaturesubstitution.etex index 29df6a84117..1b7d6d3c093 100644 --- a/manual/src/refman/extensions/signaturesubstitution.etex +++ b/manual/src/refman/extensions/signaturesubstitution.etex @@ -56,7 +56,7 @@ module type CompareInt = ComparableInt with type t := int \subsection{ss:local-substitution}{Local substitution declarations} -(Introduced in OCaml 4.08) +(Introduced in OCaml 4.08, module type substitution introduced in 4.13) \begin{syntax} specification: @@ -100,6 +100,29 @@ module type S = sig end [@@expect error];; \end{caml_example} + +Local substitutions can also be used to give a local name to a type or +a module type introduced by a functor application: + +\begin{caml_example}{toplevel} +module type F = sig + type set := Set.Make(Int).t + + module type Type = sig type t end + module Nest : Type -> sig module type T = Type end + + module type T := Nest(Int).T + + val set: set + val m : (module T) +end;; +\end{caml_example} + + +Local module type substitutions are subject to the same limitations as module +type substitutions, see section \ref{ss:module-type-substitution}. + + \subsection{ss:module-type-substitution}{Module type substitutions} (Introduced in OCaml 4.13) @@ -151,11 +174,20 @@ from the signature \begin{caml_example}{toplevel} module type ENDO' = ENDO with module type T := ENDO;; \end{caml_example} -If the right hand side of the substitution is not a path, then the destructive -substitution is only valid if the left-hand side of the substitution is never -used as the type of a first-class module in the original module type. + +\subsubsection*{ss:module-type-substitution-limitations}{Limitations} + +If the right hand side of a module type substitution or a local module +type substitution is not a @modtype-path@, +then the destructive substitution is only valid if the left-hand side of the +substitution is never used as the type of a first-class module in the original +module type. \begin{caml_example}{verbatim}[error] module type T = sig module type S val x: (module S) end module type Error = T with module type S := sig end \end{caml_example} + +\begin{caml_example}{verbatim}[error] +module type T = sig module type S := sig end val x: (module S) end +\end{caml_example} diff --git a/manual/src/refman/lex.etex b/manual/src/refman/lex.etex index 2d95099af47..7972a9b5fbf 100644 --- a/manual/src/refman/lex.etex +++ b/manual/src/refman/lex.etex @@ -183,7 +183,7 @@ let copyright = '\xA9';; \begin{syntax} string-literal: '"' { string-character } '"' - | '{' quoted-string-id '|' { any-char } '|' quoted-string-id '}' + | '{' quoted-string-id '|' { newline | any-char } '|' quoted-string-id '}' ; quoted-string-id: { 'a'...'z' || '_' } @@ -192,6 +192,7 @@ string-character: regular-string-char | escape-sequence | "\u{" {{ "0"\ldots"9" || "A"\ldots"F" || "a"\ldots"f" }} "}" + | newline | '\' newline { space || tab } \end{syntax} @@ -211,6 +212,10 @@ let greeting = "Hello, World!\n" let superscript_plus = "\u{207A}";; \end{caml_example} +A newline sequence is a line feed optionally preceded by a carriage +return. Since OCaml 5.2, a newline sequence occurring in a string +literal is normalized into a single line feed character. + To allow splitting long string literals across lines, the sequence "\\"\var{newline}~\var{spaces-or-tabs} (a backslash at the end of a line followed by any number of spaces and horizontal tabulations at the @@ -225,16 +230,31 @@ let longstr = he world.";; \end{caml_example} +Escaped newlines provide more convenient behavior than non-escaped +newlines, as the indentation is not considered part of the string +literal. + +\begin{caml_example}{toplevel} +let contains_unexpected_spaces = + "This multiline literal + contains three consecutive spaces." + +let no_unexpected_spaces = + "This multiline literal \n\ + uses a single space between all words.";; +\end{caml_example} + Quoted string literals provide an alternative lexical syntax for -string literals. They are useful to represent strings of arbitrary content -without escaping. Quoted strings are delimited by a matching pair -of @'{' quoted-string-id '|'@ and @'|' quoted-string-id '}'@ with -the same @quoted-string-id@ on both sides. Quoted strings do not interpret -any character in a special way but requires that the -sequence @'|' quoted-string-id '}'@ does not occur in the string itself. -The identifier @quoted-string-id@ is a (possibly empty) sequence of -lowercase letters and underscores that can be freely chosen to avoid -such issue. +string literals. They are useful to represent strings of arbitrary +content without escaping. Quoted strings are delimited by a matching +pair of @'{' quoted-string-id '|'@ and @'|' quoted-string-id '}'@ with +the same @quoted-string-id@ on both sides. Quoted strings do not +interpret any character in a special way\footnote{Except for the + normalization of newline sequences into a single line feed mentioned + earlier.} but requires that the sequence @'|' quoted-string-id '}'@ +does not occur in the string itself. The identifier +@quoted-string-id@ is a (possibly empty) sequence of lowercase letters +and underscores that can be freely chosen to avoid such issue. \begin{caml_example}{toplevel} let quoted_greeting = {|"Hello, World!"|} diff --git a/manual/src/tutorials/gadtexamples.etex b/manual/src/tutorials/gadtexamples.etex index bc93d15cfd0..44726845177 100644 --- a/manual/src/tutorials/gadtexamples.etex +++ b/manual/src/tutorials/gadtexamples.etex @@ -237,18 +237,12 @@ existential types using compiler-generated names. Currently, the compiler generates these names according to the following nomenclature: \begin{itemize} \item First, types whose name starts with a "$" are existentials. -\item "$Constr_'a" denotes an existential type introduced for the type -variable "'a" of the GADT constructor "Constr": +\item "$a" denotes an existential type introduced for the type +variable "'a" of a GADT constructor: \begin{caml_example}{verbatim}[error] type any = Any : 'name -> any let escape (Any x) = x \end{caml_example} -\item "$Constr" denotes an existential type introduced for an anonymous %$ -type variable in the GADT constructor "Constr": -\begin{caml_example}{verbatim}[error] -type any = Any : _ -> any -let escape (Any x) = x -\end{caml_example} \item "$'a" if the existential variable was unified with the type %$ variable "'a" during typing: \begin{caml_example}{verbatim}[error] diff --git a/middle_end/clambda.ml b/middle_end/clambda.ml index bea11899579..ab2a5e3126d 100644 --- a/middle_end/clambda.ml +++ b/middle_end/clambda.ml @@ -54,7 +54,11 @@ and ulambda = * ulambda * ulambda | Uphantom_let of Backend_var.With_provenance.t * uphantom_defining_expr option * ulambda - | Uletrec of (Backend_var.With_provenance.t * ulambda) list * ulambda + | Uletrec of + (Backend_var.With_provenance.t * + Value_rec_types.recursive_binding_kind * + ulambda) list + * ulambda | Uprim of Clambda_primitives.primitive * ulambda list * Debuginfo.t | Uswitch of ulambda * ulambda_switch * Debuginfo.t | Ustringswitch of ulambda * (string * ulambda) list * ulambda option diff --git a/middle_end/clambda.mli b/middle_end/clambda.mli index bc944148e5d..825461a04bd 100644 --- a/middle_end/clambda.mli +++ b/middle_end/clambda.mli @@ -65,7 +65,11 @@ and ulambda = * ulambda * ulambda | Uphantom_let of Backend_var.With_provenance.t * uphantom_defining_expr option * ulambda - | Uletrec of (Backend_var.With_provenance.t * ulambda) list * ulambda + | Uletrec of + (Backend_var.With_provenance.t * + Value_rec_types.recursive_binding_kind * + ulambda) list + * ulambda | Uprim of Clambda_primitives.primitive * ulambda list * Debuginfo.t | Uswitch of ulambda * ulambda_switch * Debuginfo.t | Ustringswitch of ulambda * (string * ulambda) list * ulambda option diff --git a/middle_end/closure/closure.ml b/middle_end/closure/closure.ml index 9d98ec334f8..87d0c144b1f 100644 --- a/middle_end/closure/closure.ml +++ b/middle_end/closure/closure.ml @@ -71,7 +71,7 @@ let occurs_var var u = | Ulet(_str, _kind, _id, def, body) -> occurs def || occurs body | Uphantom_let _ -> no_phantom_lets () | Uletrec(decls, body) -> - List.exists (fun (_id, u) -> occurs u) decls || occurs body + List.exists (fun (_id, _clas, u) -> occurs u) decls || occurs body | Uprim(_p, args, _) -> List.exists occurs args | Uswitch(arg, s, _dbg) -> occurs arg || @@ -576,18 +576,18 @@ let rec substitute loc ((backend, fpc) as st) sb rn ulam = | Uphantom_let _ -> no_phantom_lets () | Uletrec(bindings, body) -> let bindings1 = - List.map (fun (id, rhs) -> - (VP.var id, VP.rename id, rhs)) bindings + List.map (fun (id, clas, rhs) -> + (VP.var id, VP.rename id, clas, rhs)) bindings in let sb' = - List.fold_right (fun (id, id', _) s -> + List.fold_right (fun (id, id', _, _) s -> V.Map.add id (Uvar (VP.var id')) s) bindings1 sb in Uletrec( - List.map - (fun (_id, id', rhs) -> (id', substitute loc st sb' rn rhs)) - bindings1, + List.map (fun (_id, id', clas, rhs) -> + (id', clas, substitute loc st sb' rn rhs)) + bindings1, substitute loc st sb' rn body) | Uprim(p, args, dbg) -> let sargs = List.map (substitute loc st sb rn) args in @@ -1053,7 +1053,7 @@ let rec close ({ backend; fenv; cenv ; mutable_vars } as env) lam = (Ulet(Mutable, kind, VP.create id, ulam, ubody), abody) | Lletrec(defs, body) -> if List.for_all - (function (_id, Lfunction _) -> true | _ -> false) + (function { def = Lfunction _ } -> true | _ -> false) defs then begin (* Simple case: only function definitions *) @@ -1078,10 +1078,12 @@ let rec close ({ backend; fenv; cenv ; mutable_vars } as env) lam = (* General case: recursive definition of values *) let rec clos_defs = function [] -> ([], fenv) - | (id, lam) :: rem -> + | { id; rkind; def } :: rem -> let (udefs, fenv_body) = clos_defs rem in - let (ulam, approx) = close_named env id lam in - ((VP.create id, ulam) :: udefs, V.Map.add id approx fenv_body) in + let (ulam, approx) = close_named env id def in + ((VP.create id, rkind, ulam) :: udefs, + V.Map.add id approx fenv_body) + in let (udefs, fenv_body) = clos_defs defs in let (ubody, approx) = close { backend; fenv = fenv_body; cenv; mutable_vars } body in @@ -1257,12 +1259,13 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs = is forced. Cf #12526 *) match fun_defs with - | [_, Lfunction{attr = { inline = Always_inline; }}] -> + | [{ def = Lfunction{attr = { inline = Always_inline; }}}] -> fun_defs | _ -> List.concat_map (function - | (id, Lfunction{kind; params; return; body; attr; loc}) -> + | { id; rkind=_; + def = Lfunction{kind; params; return; body; attr; loc} } -> Simplif.split_default_wrapper ~id ~kind ~params ~body ~attr ~loc ~return | _ -> assert false @@ -1270,7 +1273,7 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs = fun_defs in let inline_attribute = match fun_defs with - | [_, Lfunction{attr = { inline; }}] -> inline + | [{ def = Lfunction{attr = { inline; }}}] -> inline | _ -> Default_inline (* recursive functions can't be inlined *) in (* Update and check nesting depth *) @@ -1286,7 +1289,8 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs = let uncurried_defs = List.map (function - (id, Lfunction{kind; params; return; body; loc; attr}) -> + { id; rkind=_; + def = Lfunction{kind; params; return; body; loc; attr} } -> let label = Compilenv.make_symbol (Some (V.unique_name id)) in let arity = List.length params in let fundesc = @@ -1298,7 +1302,7 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs = fun_poll = attr.poll } in let dbg = Debuginfo.from_location loc in (id, params, return, body, fundesc, dbg) - | (_, _) -> fatal_error "Closure.close_functions") + | _ -> fatal_error "Closure.close_functions") fun_defs in (* Build an approximate fenv for compiling the functions *) let fenv_rec = @@ -1423,7 +1427,7 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs = (* Same, for one non-recursive function *) and close_one_function env id funct = - match close_functions env [id, funct] with + match close_functions env [{ id; rkind = Static; def = funct }] with | (clos, (i, _, approx) :: _) when id = i -> (clos, approx) | _ -> fatal_error "Closure.close_one_function" @@ -1514,7 +1518,7 @@ let collect_exported_structured_constants a = | Uoffset(u, _) -> ulam u | Ulet (_str, _kind, _, u1, u2) -> ulam u1; ulam u2 | Uphantom_let _ -> no_phantom_lets () - | Uletrec (l, u) -> List.iter (fun (_, u) -> ulam u) l; ulam u + | Uletrec (l, u) -> List.iter (fun (_, _, u) -> ulam u) l; ulam u | Uprim (_, ul, _) -> List.iter ulam ul | Uswitch (u, sl, _dbg) -> ulam u; diff --git a/middle_end/compilenv.ml b/middle_end/compilenv.ml index 0d5554ea330..dff617f505a 100644 --- a/middle_end/compilenv.ml +++ b/middle_end/compilenv.ml @@ -90,8 +90,13 @@ let current_unit = ui_export_info = default_ui_export_info; ui_for_pack = None } +let symbol_separator = + match Config.ccomp_type with + | "msvc" -> '$' (* MASM does not allow for dots in symbol names *) + | _ -> '.' + let concat_symbol unitname id = - unitname ^ "." ^ id + Printf.sprintf "%s%c%s" unitname symbol_separator id let symbolname_for_pack pack name = match pack with @@ -178,6 +183,12 @@ let read_library_info filename = (* Read and cache info on global identifiers *) +(* Referring to a packed unit is only allowed from a unit that will + ultimately end up in the same pack, including through nested packs. *) +let is_import_from_same_pack ~imported ~current = + String.equal imported current + || String.starts_with ~prefix:(imported ^ ".") current + let get_global_info global_ident = ( let modname = Ident.name global_ident in if modname = current_unit.ui_name then @@ -201,7 +212,9 @@ let get_global_info global_ident = ( an unit outside of the pack. *) (match ui.ui_for_pack, current_unit.ui_for_pack with | None, _ -> () - | Some p1, Some p2 when String.equal p1 p2 -> () + | Some p1, Some p2 when + is_import_from_same_pack ~imported:p1 ~current:p2 -> + () | Some p1, p2 -> raise (Error (Mismatching_for_pack (filename, p1, current_unit.ui_name, p2)))); diff --git a/middle_end/compilenv.mli b/middle_end/compilenv.mli index 63f62fca8c6..941a8d40d08 100644 --- a/middle_end/compilenv.mli +++ b/middle_end/compilenv.mli @@ -53,6 +53,9 @@ val current_unit: unit -> Compilation_unit.t val current_unit_symbol: unit -> Symbol.t (* flambda-only *) +val symbol_separator: char + (* Return the module separator used when building symbol names. *) + val make_symbol: ?unitname:string -> string option -> string (* [make_symbol ~unitname:u None] returns the asm symbol that corresponds to the compilation unit [u] (default: the current unit). diff --git a/middle_end/flambda/build_export_info.ml b/middle_end/flambda/build_export_info.ml index a3cb96d2519..c4540678a7f 100644 --- a/middle_end/flambda/build_export_info.ml +++ b/middle_end/flambda/build_export_info.ml @@ -240,7 +240,7 @@ let rec approx_of_expr (env : Env.t) (flam : Flambda.t) : Export_info.approx = approx_of_expr env body | Let_rec (defs, body) -> let env = - List.fold_left (fun env (var, defining_expr) -> + List.fold_left (fun env (var, _rkind, defining_expr) -> let approx = descr_of_named env defining_expr in Env.add_approx env var approx) env defs diff --git a/middle_end/flambda/closure_conversion.ml b/middle_end/flambda/closure_conversion.ml index 4bfb622d9b6..24393745cd6 100644 --- a/middle_end/flambda/closure_conversion.ml +++ b/middle_end/flambda/closure_conversion.ml @@ -34,8 +34,9 @@ type t = { } let add_default_argument_wrappers lam = - let defs_are_all_functions (defs : (_ * Lambda.lambda) list) = - List.for_all (function (_, Lambda.Lfunction _) -> true | _ -> false) defs + let defs_are_all_functions (defs : Lambda.rec_binding list) = + List.for_all (function Lambda.{ def = Lfunction _ } -> true | _ -> false) + defs in let f (lam : Lambda.lambda) : Lambda.lambda = match lam with @@ -45,8 +46,10 @@ let add_default_argument_wrappers lam = Simplif.split_default_wrapper ~id ~kind ~params ~body:fbody ~return:Pgenval ~attr ~loc with - | [fun_id, def] -> Llet (Alias, Pgenval, fun_id, def, body) - | [fun_id, def; inner_fun_id, def_inner] -> + | [{ id = fun_id; rkind=_; def }] -> + Llet (Alias, Pgenval, fun_id, def, body) + | [{ id = fun_id;rkind=_; def }; + { id = inner_fun_id; rkind=_; def = def_inner }] -> Llet (Alias, Pgenval, inner_fun_id, def_inner, Llet (Alias, Pgenval, fun_id, def, body)) | _ -> assert false @@ -57,7 +60,8 @@ let add_default_argument_wrappers lam = List.flatten (List.map (function - | (id, Lambda.Lfunction {kind; params; body; attr; loc}) -> + | Lambda.{ id; rkind = _; + def = Lambda.Lfunction {kind; params; body; attr; loc} } -> Simplif.split_default_wrapper ~id ~kind ~params ~body ~return:Pgenval ~attr ~loc | _ -> assert false) @@ -246,7 +250,7 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = }))) | Lletrec (defs, body) -> let env = - List.fold_right (fun (id, _) env -> + List.fold_right (fun { Lambda.id } env -> Env.add_var env id (Variable.create_with_same_name_as_ident id)) defs env in @@ -254,8 +258,8 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = (* Identify any bindings in the [let rec] that are functions. These will be named after the corresponding identifier in the [let rec]. *) List.map (function - | (let_rec_ident, - Lambda.Lfunction { kind; params; body; attr; loc }) -> + | Lambda.{ id = let_rec_ident; rkind = _; + def = Lambda.Lfunction { kind; params; body; attr; loc }} -> let closure_bound_var = Variable.create_with_same_name_as_ident let_rec_ident in @@ -305,9 +309,10 @@ let rec close t env (lam : Lambda.lambda) : Flambda.t = expression; any functions bound by it will have their own individual closures. *) let defs = - List.map (fun (id, def) -> + List.map (fun Lambda.{ id; rkind; def } -> let var = Env.find_var env id in - var, close_let_bound_expression t ~let_rec_ident:id var env def) + var, rkind, + close_let_bound_expression t ~let_rec_ident:id var env def) defs in Let_rec (defs, close t env body) diff --git a/middle_end/flambda/effect_analysis.ml b/middle_end/flambda/effect_analysis.ml index 2ddba764bc5..98ff726767b 100644 --- a/middle_end/flambda/effect_analysis.ml +++ b/middle_end/flambda/effect_analysis.ml @@ -31,7 +31,7 @@ let rec no_effects (flam : Flambda.t) = | Let_mutable { body } -> no_effects body | Let_rec (defs, body) -> no_effects body - && List.for_all (fun (_, def) -> no_effects_named def) defs + && List.for_all (fun (_, _, def) -> no_effects_named def) defs | If_then_else (_, ifso, ifnot) -> no_effects ifso && no_effects ifnot | Switch (_, sw) -> let aux (_, flam) = no_effects flam in diff --git a/middle_end/flambda/flambda.ml b/middle_end/flambda/flambda.ml index 0d1a1f946ca..dbc9e57dfbd 100644 --- a/middle_end/flambda/flambda.ml +++ b/middle_end/flambda/flambda.ml @@ -60,7 +60,8 @@ type t = | Var of Variable.t | Let of let_expr | Let_mutable of let_mutable - | Let_rec of (Variable.t * named) list * t + | Let_rec of + (Variable.t * Value_rec_types.recursive_binding_kind * named) list * t | Apply of apply | Send of send | Assign of assign @@ -255,9 +256,17 @@ let rec lam ppf (flam : t) = let bindings ppf id_arg_list = let spc = ref false in List.iter - (fun (id, l) -> + (fun (id, rkind, l) -> if !spc then fprintf ppf "@ " else spc := true; - fprintf ppf "@[<2>%a@ %a@]" Variable.print id print_named l) + let rec_annot = + match (rkind : Value_rec_types.recursive_binding_kind) with + | Static -> "" + | Not_recursive -> "[Nonrec]" + | Constant -> "[Cst]" + | Class -> "[Class]" + in + fprintf ppf "@[<2>%a%s@ %a@]" + Variable.print id rec_annot print_named l) id_arg_list in fprintf ppf "@[<2>(letrec@ (@[%a@])@ %a)@]" bindings id_arg_list lam body @@ -554,7 +563,7 @@ let rec variables_usage ?ignore_uses_as_callee ?ignore_uses_as_argument free_variable var; aux body | Let_rec (bindings, body) -> - List.iter (fun (var, defining_expr) -> + List.iter (fun (var, _rkind, defining_expr) -> bound_variable var; free_variables (variables_usage_named ?ignore_uses_in_project_var @@ -777,7 +786,7 @@ let iter_general ~toplevel f f_named maybe_named = | Let_mutable { body; _ } -> aux body | Let_rec (defs, body) -> - List.iter (fun (_,l) -> aux_named l) defs; + List.iter (fun (_,_,l) -> aux_named l) defs; aux body | Try_with (f1,_,f2) | While (f1,f2) diff --git a/middle_end/flambda/flambda.mli b/middle_end/flambda/flambda.mli index d673ac49e51..25fce5b6f40 100644 --- a/middle_end/flambda/flambda.mli +++ b/middle_end/flambda/flambda.mli @@ -93,7 +93,8 @@ type t = | Var of Variable.t | Let of let_expr | Let_mutable of let_mutable - | Let_rec of (Variable.t * named) list * t + | Let_rec of + (Variable.t * Value_rec_types.recursive_binding_kind * named) list * t (** CR-someday lwhite: give Let_rec the same fields as Let. *) | Apply of apply | Send of send diff --git a/middle_end/flambda/flambda_invariants.ml b/middle_end/flambda/flambda_invariants.ml index 6c2b572d96f..cdfc97b53f2 100644 --- a/middle_end/flambda/flambda_invariants.ml +++ b/middle_end/flambda/flambda_invariants.ml @@ -162,12 +162,12 @@ let variable_and_symbol_invariants (program : Flambda.program) = loop (add_mutable_binding_occurrence env mut_var) body | Let_rec (defs, body) -> let env = - List.fold_left (fun env (var, def) -> + List.fold_left (fun env (var, _rkind, def) -> will_traverse_named_expression_later def; add_binding_occurrence env var) env defs in - List.iter (fun (var, def) -> + List.iter (fun (var, _rkind, def) -> already_added_bound_variable_to_env var; loop_named env def) defs; loop env body diff --git a/middle_end/flambda/flambda_iterators.ml b/middle_end/flambda/flambda_iterators.ml index 6edc4bba3b4..2bb9d61c037 100644 --- a/middle_end/flambda/flambda_iterators.ml +++ b/middle_end/flambda/flambda_iterators.ml @@ -27,7 +27,7 @@ let apply_on_subexpressions f f_named (flam : Flambda.t) = | Let_mutable { body; _ } -> f body | Let_rec (defs, body) -> - List.iter (fun (_,l) -> f_named l) defs; + List.iter (fun (_,_,l) -> f_named l) defs; f body | Switch (_, sw) -> List.iter (fun (_,l) -> f l) sw.consts; @@ -74,6 +74,25 @@ let map_snd_sharing f ((a, b) as cpl) = else (a, new_b) +let map_rec_binding_sharing f ((v, rkind, named) as binding) = + let new_named = f v named in + if named == new_named then + binding + else + let rkind = + (* We could be replacing an expression with arbitrary recursive kind + by a constant, in which case we need to change the kind. + Mode conditions for the [Constant] kind are not stricter + than any other kind, so we do not need to re-check the + modes. *) + match (new_named : Flambda.named) with + | Symbol _ | Const _ | Allocated_const _-> Value_rec_types.Constant + | Read_mutable _ | Read_symbol_field _ | Set_of_closures _ + | Project_closure _ | Move_within_set_of_closures _ | Project_var _ + | Prim _ | Expr _ -> rkind + in + (v, rkind, new_named) + let map_subexpressions f f_named (tree:Flambda.t) : Flambda.t = match tree with | Var _ | Apply _ | Assign _ | Send _ | Proved_unreachable @@ -87,7 +106,7 @@ let map_subexpressions f f_named (tree:Flambda.t) : Flambda.t = Flambda.create_let var new_named new_body | Let_rec (defs, body) -> let new_defs = - list_map_sharing (map_snd_sharing f_named) defs + list_map_sharing (map_rec_binding_sharing f_named) defs in let new_body = f body in if new_defs == defs && new_body == body then @@ -179,7 +198,8 @@ let iter_named_toplevel f f_named named = let iter_all_immutable_let_and_let_rec_bindings t ~f = iter_expr (function | Let { var; defining_expr; _ } -> f var defining_expr - | Let_rec (defs, _) -> List.iter (fun (var, named) -> f var named) defs + | Let_rec (defs, _) -> + List.iter (fun (var, _rkind, named) -> f var named) defs | _ -> ()) t @@ -187,7 +207,8 @@ let iter_all_toplevel_immutable_let_and_let_rec_bindings t ~f = iter_general ~toplevel:true (function | Let { var; defining_expr; _ } -> f var defining_expr - | Let_rec (defs, _) -> List.iter (fun (var, named) -> f var named) defs + | Let_rec (defs, _) -> + List.iter (fun (var, _rkind, named) -> f var named) defs | _ -> ()) (fun _ -> ()) (Is_expr t) @@ -302,8 +323,25 @@ let map_general ~toplevel f f_named tree = | Let_rec (defs, body) -> let done_something = ref false in let defs = - List.map (fun (id, lam) -> - id, aux_named_done_something id lam done_something) + List.map (fun (id, rkind, lam) -> + let new_named = + aux_named_done_something id lam done_something + in + let open Value_rec_types in + (* See comment in [map_rec_binding_sharing] *) + let new_rkind = + match (new_named : Flambda.named) with + | Symbol _ | Const _ | Allocated_const _-> + begin match rkind with + | Constant -> () + | Static | Not_recursive | Class -> done_something := true + end; + Constant + | Read_mutable _ | Read_symbol_field _ | Set_of_closures _ + | Project_closure _ | Move_within_set_of_closures _ + | Project_var _ | Prim _ | Expr _ -> rkind + in + id, new_rkind, new_named) defs in let body = aux_done_something body done_something in diff --git a/middle_end/flambda/flambda_to_clambda.ml b/middle_end/flambda/flambda_to_clambda.ml index 70d0f72ee4c..4cfea9fea14 100644 --- a/middle_end/flambda/flambda_to_clambda.ml +++ b/middle_end/flambda/flambda_to_clambda.ml @@ -246,14 +246,14 @@ let rec to_clambda t env (flam : Flambda.t) : Clambda.ulambda = Ulet (Mutable, contents_kind, VP.create id, def, to_clambda t env_body body) | Let_rec (defs, body) -> let env, defs = - List.fold_right (fun (var, def) (env, defs) -> + List.fold_right (fun (var, rkind, def) (env, defs) -> let id, env = Env.add_fresh_ident env var in - env, (id, var, def) :: defs) + env, (id, var, rkind, def) :: defs) defs (env, []) in let defs = - List.map (fun (id, var, def) -> - VP.create id, to_clambda_named t env var def) + List.map (fun (id, var, rkind, def) -> + VP.create id, rkind, to_clambda_named t env var def) defs in Uletrec (defs, to_clambda t env body) diff --git a/middle_end/flambda/flambda_utils.ml b/middle_end/flambda/flambda_utils.ml index 01172ecb604..93347454888 100644 --- a/middle_end/flambda/flambda_utils.ml +++ b/middle_end/flambda/flambda_utils.ml @@ -221,8 +221,22 @@ and same_move_within_set_of_closures (m1 : Flambda.move_within_set_of_closures) && Closure_id.equal m1.start_from m2.start_from && Closure_id.equal m1.move_to m2.move_to -and samebinding (v1, n1) (v2, n2) = - Variable.equal v1 v2 && same_named n1 n2 +and samebinding (v1, rkind1, n1) (v2, rkind2, n2) = + let equal_rkind rkind1 rkind2 = + match (rkind1 : Value_rec_types.recursive_binding_kind), + (rkind2 : Value_rec_types.recursive_binding_kind) with + | Not_recursive, Not_recursive + | Static, Static + | Constant, Constant + | Class, Class -> + true + | Not_recursive, (Static | Constant | Class) + | Static, (Not_recursive | Constant | Class) + | Constant, (Not_recursive | Static | Class) + | Class, (Not_recursive | Static | Constant) -> + false + in + Variable.equal v1 v2 && equal_rkind rkind1 rkind2 && same_named n1 n2 and sameswitch (fs1 : Flambda.switch) (fs2 : Flambda.switch) = let samecase (n1, a1) (n2, a2) = n1 = n2 && same a1 a2 in @@ -638,7 +652,7 @@ let substitute_read_symbol_field_for_variables expr | Let_rec (defs, body) -> let free_variables_of_defs = - List.fold_left (fun set (_, named) -> + List.fold_left (fun set (_, _, named) -> Variable.Set.union set (Flambda.free_variables_named named)) Variable.Set.empty defs in @@ -654,8 +668,8 @@ let substitute_read_symbol_field_for_variables Variable.Map.of_set (fun var -> Variable.rename var) to_substitute in let defs = - List.map (fun (var, named) -> - var, substitute_named bindings named) + List.map (fun (var, rkind, named) -> + var, rkind, substitute_named bindings named) defs in let expr = diff --git a/middle_end/flambda/freshening.ml b/middle_end/flambda/freshening.ml index 78169bfcd8f..68f9483bc6f 100644 --- a/middle_end/flambda/freshening.ml +++ b/middle_end/flambda/freshening.ml @@ -158,6 +158,11 @@ let add_variables t defs = let id', t = add_variable t id in (id', data) :: defs, t) defs ([], t) +let add_variables3 t defs = + List.fold_right (fun (id, data1, data2) (defs, t) -> + let id', t = add_variable t id in + (id', data1, data2) :: defs, t) defs ([], t) + let add_variables' t ids = List.fold_right (fun id (ids, t) -> let id', t = add_variable t id in diff --git a/middle_end/flambda/freshening.mli b/middle_end/flambda/freshening.mli index 1550797ac1c..a45c2b98f49 100644 --- a/middle_end/flambda/freshening.mli +++ b/middle_end/flambda/freshening.mli @@ -62,6 +62,13 @@ val add_variables -> (Variable.t * 'a) list -> (Variable.t * 'a) list * t +(** Like [add_variables'], but passes through the other components of the + input list unchanged. *) +val add_variables3 + : t + -> (Variable.t * 'a * 'b) list + -> (Variable.t * 'a * 'b) list * t + (** Like [add_variable], but for mutable variables. *) val add_mutable_variable : t -> Mutable_variable.t -> Mutable_variable.t * t diff --git a/middle_end/flambda/inconstant_idents.ml b/middle_end/flambda/inconstant_idents.ml index 156a2fa70ff..9c091be8d77 100644 --- a/middle_end/flambda/inconstant_idents.ml +++ b/middle_end/flambda/inconstant_idents.ml @@ -236,7 +236,7 @@ module Inconstants (P:Param) (Backend:Backend_intf.S) = struct mark_var var curr; mark_loop ~toplevel curr body | Let_rec(defs, body) -> - List.iter (fun (var, def) -> + List.iter (fun (var, _rkind, def) -> mark_named ~toplevel [Var var] def; (* adds 'var in NC => curr in NC' same remark as let case *) mark_var var curr) diff --git a/middle_end/flambda/inline_and_simplify.ml b/middle_end/flambda/inline_and_simplify.ml index c5c51bf8af0..383a2818bf5 100644 --- a/middle_end/flambda/inline_and_simplify.ml +++ b/middle_end/flambda/inline_and_simplify.ml @@ -1135,17 +1135,17 @@ and simplify env r (tree : Flambda.t) : Flambda.t * R.t = contents_kind }, r) | Let_rec (defs, body) -> - let defs, sb = Freshening.add_variables (E.freshening env) defs in + let defs, sb = Freshening.add_variables3 (E.freshening env) defs in let env = E.set_freshening env sb in let def_env = - List.fold_left (fun env_acc (id, _lam) -> + List.fold_left (fun env_acc (id, _rkind, _lam) -> E.add env_acc id (A.value_unknown Other)) env defs in let defs, body_env, r = - List.fold_right (fun (id, lam) (defs, env_acc, r) -> + List.fold_right (fun (id, rkind, lam) (defs, env_acc, r) -> let lam, r = simplify_named def_env r lam in - let defs = (id, lam) :: defs in + let defs = (id, rkind, lam) :: defs in let env_acc = E.add env_acc id (R.approx r) in defs, env_acc, r) defs ([], env, r) diff --git a/middle_end/flambda/inlining_cost.ml b/middle_end/flambda/inlining_cost.ml index 1e503e3b671..3c61b62db47 100644 --- a/middle_end/flambda/inlining_cost.ml +++ b/middle_end/flambda/inlining_cost.ml @@ -86,7 +86,7 @@ let lambda_smaller' lam ~than:threshold = lambda_size body | Let_mutable { body } -> lambda_size body | Let_rec (bindings, body) -> - List.iter (fun (_, lam) -> lambda_named_size lam) bindings; + List.iter (fun (_, _, lam) -> lambda_named_size lam) bindings; lambda_size body | Switch (_, sw) -> let cost cases = diff --git a/middle_end/flambda/lift_code.ml b/middle_end/flambda/lift_code.ml index 3474b06ba56..9f072d78ad7 100644 --- a/middle_end/flambda/lift_code.ml +++ b/middle_end/flambda/lift_code.ml @@ -120,11 +120,15 @@ and lift_lets_named _var (named:Flambda.named) ~toplevel : Flambda.named = module Sort_lets = Strongly_connected_components.Make (Variable) -let rebuild_let_rec (defs:(Variable.t * Flambda.named) list) body = - let map = Variable.Map.of_list defs in +let rebuild_let_rec (defs:(Variable.t * _ * Flambda.named) list) body = + let map = + List.fold_left (fun map (var, rkind, def) -> + Variable.Map.add var (rkind, def) map) + Variable.Map.empty defs + in let graph = Variable.Map.map - (fun named -> + (fun (_rkind, named) -> Variable.Set.filter (fun v -> Variable.Map.mem v map) (Flambda.free_variables_named named)) map @@ -135,11 +139,15 @@ let rebuild_let_rec (defs:(Variable.t * Flambda.named) list) body = Array.fold_left (fun body (component:Sort_lets.component) -> match component with | No_loop v -> - let def = Variable.Map.find v map in + let (_rkind, def) = Variable.Map.find v map in Flambda.create_let v def body | Has_loop l -> Flambda.Let_rec - (List.map (fun v -> v, Variable.Map.find v map) l, + (List.map + (fun v -> + let rkind, def = Variable.Map.find v map in + v, rkind, def) + l, body)) body components diff --git a/middle_end/flambda/lift_let_to_initialize_symbol.ml b/middle_end/flambda/lift_let_to_initialize_symbol.ml index ccef0d8a1f3..b5720409091 100644 --- a/middle_end/flambda/lift_let_to_initialize_symbol.ml +++ b/middle_end/flambda/lift_let_to_initialize_symbol.ml @@ -40,7 +40,7 @@ type accumulated = { let rec accumulate ~substitution ~copied_lets ~extracted_lets (expr : Flambda.t) = match expr with - | Let { var; body = Var var'; _ } | Let_rec ([var, _], Var var') + | Let { var; body = Var var'; _ } | Let_rec ([var, _, _], Var var') when Variable.equal var var' -> { copied_lets; extracted_lets; terminator = Flambda_utils.toplevel_substitution substitution expr; @@ -53,13 +53,14 @@ let rec accumulate ~substitution ~copied_lets ~extracted_lets when Variable.equal var var' && List.for_all (fun field -> - List.exists (fun (def_var, _) -> Variable.equal def_var field) defs) + List.exists (fun (def_var, _, _) -> + Variable.equal def_var field) defs) fields -> { copied_lets; extracted_lets; terminator = Flambda_utils.toplevel_substitution substitution expr; } | Let { var; defining_expr = Expr (Var alias); body; _ } - | Let_rec ([var, Expr (Var alias)], body) -> + | Let_rec ([var, _, Expr (Var alias)], body) -> let alias = match Variable.Map.find alias substitution with | exception Not_found -> alias @@ -71,7 +72,7 @@ let rec accumulate ~substitution ~copied_lets ~extracted_lets ~extracted_lets body | Let { var; defining_expr = named; body; _ } - | Let_rec ([var, named], body) + | Let_rec ([var, _, named], body) when should_copy named -> accumulate body ~substitution @@ -101,12 +102,12 @@ let rec accumulate ~substitution ~copied_lets ~extracted_lets ~substitution ~copied_lets ~extracted_lets:(extracted::extracted_lets) - | Let_rec ([var, named], body) -> + | Let_rec ([var, rkind, named], body) -> let renamed = Variable.rename var in let def_substitution = Variable.Map.add var renamed substitution in let expr = Flambda_utils.toplevel_substitution def_substitution - (Let_rec ([renamed, named], Var renamed)) + (Let_rec ([renamed, rkind, named], Var renamed)) in let extracted = Expr (var, expr) in accumulate body @@ -115,23 +116,24 @@ let rec accumulate ~substitution ~copied_lets ~extracted_lets ~extracted_lets:(extracted::extracted_lets) | Let_rec (defs, body) -> let renamed_defs, def_substitution = - List.fold_right (fun (var, def) (acc, substitution) -> + List.fold_right (fun (var, rkind, def) (acc, substitution) -> let new_var = Variable.rename var in - (new_var, def) :: acc, + (new_var, rkind, def) :: acc, Variable.Map.add var new_var substitution) defs ([], substitution) in let extracted = + let fst3 (v, _, _) = v in let expr = let name = Internal_variable_names.lifted_let_rec_block in Flambda_utils.toplevel_substitution def_substitution (Let_rec (renamed_defs, Flambda_utils.name_expr ~name (Prim (Pmakeblock (0, Immutable, None), - List.map fst renamed_defs, + List.map fst3 renamed_defs, Debuginfo.none)))) in - Exprs (List.map fst defs, expr) + Exprs (List.map fst3 defs, expr) in accumulate body ~substitution diff --git a/middle_end/flambda/ref_to_variables.ml b/middle_end/flambda/ref_to_variables.ml index 746374e8852..e300c8ed8bb 100644 --- a/middle_end/flambda/ref_to_variables.ml +++ b/middle_end/flambda/ref_to_variables.ml @@ -45,7 +45,7 @@ let variables_not_used_as_local_reference (tree:Flambda.t) = loop_named defining_expr; loop body | Let_rec (defs, body) -> - List.iter (fun (_var, named) -> loop_named named) defs; + List.iter (fun (_var, _rkind, named) -> loop_named named) defs; loop body | Var v -> set := Variable.Set.add v !set diff --git a/middle_end/flambda/un_anf.ml b/middle_end/flambda/un_anf.ml index 33f0a140a5a..966d4df010a 100644 --- a/middle_end/flambda/un_anf.ml +++ b/middle_end/flambda/un_anf.ml @@ -57,6 +57,7 @@ let ignore_params_with_value_kind (_ : (VP.t * Lambda.value_kind) list) = () let ignore_direction_flag (_ : Asttypes.direction_flag) = () let ignore_meth_kind (_ : Lambda.meth_kind) = () let ignore_value_kind (_ : Lambda.value_kind) = () +let ignore_rec_kind (_ : Value_rec_types.recursive_binding_kind) = () (* CR-soon mshinwell: check we aren't traversing function bodies more than once (need to analyse exactly what the calls are from Cmmgen into this @@ -167,8 +168,9 @@ let make_var_info (clam : Clambda.ulambda) : var_info = ignore_uphantom_defining_expr_option defining_expr_opt; loop ~depth body | Uletrec (defs, body) -> - List.iter (fun (var, def) -> + List.iter (fun (var, rkind, def) -> ignore_var_with_provenance var; + ignore_rec_kind rkind; loop ~depth def) defs; loop ~depth body @@ -352,8 +354,9 @@ let let_bound_vars_that_can_be_moved var_info (clam : Clambda.ulambda) = (* Evaluation order for [defs] is not defined, and this case probably isn't important for [Cmmgen] anyway. *) let_stack := []; - List.iter (fun (var, def) -> + List.iter (fun (var, rkind, def) -> ignore_var_with_provenance var; + ignore_rec_kind rkind; loop def; let_stack := []) defs; @@ -517,8 +520,8 @@ let rec substitute_let_moveable is_let_moveable env (clam : Clambda.ulambda) Uphantom_let (var, defining_expr, body) | Uletrec (defs, body) -> let defs = - List.map (fun (var, def) -> - var, substitute_let_moveable is_let_moveable env def) + List.map (fun (var, rkind, def) -> + var, rkind, substitute_let_moveable is_let_moveable env def) defs in let body = substitute_let_moveable is_let_moveable env body in @@ -743,7 +746,7 @@ let rec un_anf_and_moveable var_info env (clam : Clambda.ulambda) Uphantom_let (var, defining_expr, body), body_moveable | Uletrec (defs, body) -> let defs = - List.map (fun (var, def) -> var, un_anf var_info env def) defs + List.map (fun (var, rk, def) -> var, rk, un_anf var_info env def) defs in let body = un_anf var_info env body in Uletrec (defs, body), Fixed diff --git a/middle_end/printclambda.ml b/middle_end/printclambda.ml index 3b8ffab0966..19554fa99ea 100644 --- a/middle_end/printclambda.ml +++ b/middle_end/printclambda.ml @@ -145,10 +145,18 @@ and lam ppf = function let bindings ppf id_arg_list = let spc = ref false in List.iter - (fun (id, l) -> + (fun (id, rkind, l) -> if !spc then fprintf ppf "@ " else spc := true; - fprintf ppf "@[<2>%a@ %a@]" + let rec_annot = + match (rkind : Value_rec_types.recursive_binding_kind) with + | Static -> "" + | Not_recursive -> "[Nonrec]" + | Constant -> "[Cst]" + | Class -> "[Class]" + in + fprintf ppf "@[<2>%a%s@ %a@]" VP.print id + rec_annot lam l) id_arg_list in fprintf ppf diff --git a/ocamldoc/.depend b/ocamldoc/.depend deleted file mode 100644 index 31634207ed1..00000000000 --- a/ocamldoc/.depend +++ /dev/null @@ -1,1010 +0,0 @@ -odoc.cmo : \ - odoc_messages.cmi \ - odoc_info.cmi \ - odoc_global.cmi \ - odoc_gen.cmi \ - odoc_config.cmi \ - odoc_args.cmi \ - odoc_analyse.cmi \ - odoc.cmi -odoc.cmx : \ - odoc_messages.cmx \ - odoc_info.cmx \ - odoc_global.cmx \ - odoc_gen.cmx \ - odoc_config.cmx \ - odoc_args.cmx \ - odoc_analyse.cmx \ - odoc.cmi -odoc.cmi : -odoc_analyse.cmo : \ - ../utils/warnings.cmi \ - ../parsing/unit_info.cmi \ - ../typing/types.cmi \ - ../typing/typemod.cmi \ - ../typing/typedtree.cmi \ - ../parsing/syntaxerr.cmi \ - ../driver/pparse.cmi \ - ../parsing/parse.cmi \ - odoc_types.cmi \ - odoc_text.cmi \ - odoc_sig.cmi \ - odoc_module.cmi \ - odoc_misc.cmi \ - odoc_messages.cmi \ - odoc_merge.cmi \ - odoc_global.cmi \ - odoc_dep.cmi \ - odoc_cross.cmi \ - odoc_comments.cmi \ - odoc_class.cmi \ - odoc_ast.cmi \ - ../parsing/location.cmi \ - ../parsing/lexer.cmi \ - ../typing/env.cmi \ - ../driver/compmisc.cmi \ - ../utils/clflags.cmi \ - odoc_analyse.cmi -odoc_analyse.cmx : \ - ../utils/warnings.cmx \ - ../parsing/unit_info.cmx \ - ../typing/types.cmx \ - ../typing/typemod.cmx \ - ../typing/typedtree.cmx \ - ../parsing/syntaxerr.cmx \ - ../driver/pparse.cmx \ - ../parsing/parse.cmx \ - odoc_types.cmx \ - odoc_text.cmx \ - odoc_sig.cmx \ - odoc_module.cmx \ - odoc_misc.cmx \ - odoc_messages.cmx \ - odoc_merge.cmx \ - odoc_global.cmx \ - odoc_dep.cmx \ - odoc_cross.cmx \ - odoc_comments.cmx \ - odoc_class.cmx \ - odoc_ast.cmx \ - ../parsing/location.cmx \ - ../parsing/lexer.cmx \ - ../typing/env.cmx \ - ../driver/compmisc.cmx \ - ../utils/clflags.cmx \ - odoc_analyse.cmi -odoc_analyse.cmi : \ - odoc_module.cmi \ - odoc_global.cmi -odoc_args.cmo : \ - odoc_types.cmi \ - odoc_texi.cmi \ - odoc_messages.cmi \ - odoc_man.cmi \ - odoc_latex.cmi \ - odoc_html.cmi \ - odoc_global.cmi \ - odoc_gen.cmi \ - odoc_dot.cmi \ - odoc_config.cmi \ - ../driver/main_args.cmi \ - ../utils/config.cmi \ - ../driver/compenv.cmi \ - odoc_args.cmi -odoc_args.cmx : \ - odoc_types.cmx \ - odoc_texi.cmx \ - odoc_messages.cmx \ - odoc_man.cmx \ - odoc_latex.cmx \ - odoc_html.cmx \ - odoc_global.cmx \ - odoc_gen.cmx \ - odoc_dot.cmx \ - odoc_config.cmx \ - ../driver/main_args.cmx \ - ../utils/config.cmx \ - ../driver/compenv.cmx \ - odoc_args.cmi -odoc_args.cmi : \ - odoc_gen.cmi -odoc_ast.cmo : \ - ../parsing/unit_info.cmi \ - ../typing/types.cmi \ - ../typing/typedtree.cmi \ - ../typing/predef.cmi \ - ../typing/path.cmi \ - ../parsing/parsetree.cmi \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_sig.cmi \ - odoc_parameter.cmi \ - odoc_module.cmi \ - odoc_messages.cmi \ - odoc_global.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_env.cmi \ - odoc_class.cmi \ - ../parsing/location.cmi \ - ../typing/ident.cmi \ - ../typing/btype.cmi \ - ../parsing/asttypes.cmi \ - odoc_ast.cmi -odoc_ast.cmx : \ - ../parsing/unit_info.cmx \ - ../typing/types.cmx \ - ../typing/typedtree.cmx \ - ../typing/predef.cmx \ - ../typing/path.cmx \ - ../parsing/parsetree.cmi \ - odoc_value.cmx \ - odoc_types.cmx \ - odoc_type.cmx \ - odoc_sig.cmx \ - odoc_parameter.cmx \ - odoc_module.cmx \ - odoc_messages.cmx \ - odoc_global.cmx \ - odoc_extension.cmx \ - odoc_exception.cmx \ - odoc_env.cmx \ - odoc_class.cmx \ - ../parsing/location.cmx \ - ../typing/ident.cmx \ - ../typing/btype.cmx \ - ../parsing/asttypes.cmi \ - odoc_ast.cmi -odoc_ast.cmi : \ - ../typing/types.cmi \ - ../typing/typedtree.cmi \ - ../parsing/parsetree.cmi \ - odoc_sig.cmi \ - odoc_name.cmi \ - odoc_module.cmi -odoc_class.cmo : \ - ../typing/types.cmi \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_parameter.cmi \ - odoc_name.cmi \ - odoc_class.cmi -odoc_class.cmx : \ - ../typing/types.cmx \ - odoc_value.cmx \ - odoc_types.cmx \ - odoc_parameter.cmx \ - odoc_name.cmx \ - odoc_class.cmi -odoc_class.cmi : \ - ../typing/types.cmi \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_parameter.cmi \ - odoc_name.cmi -odoc_comments.cmo : \ - odoc_types.cmi \ - odoc_text.cmi \ - odoc_see_lexer.cmi \ - odoc_parser.cmi \ - odoc_misc.cmi \ - odoc_messages.cmi \ - odoc_merge.cmi \ - odoc_lexer.cmi \ - odoc_global.cmi \ - odoc_cross.cmi \ - odoc_comments_global.cmi \ - odoc_comments.cmi -odoc_comments.cmx : \ - odoc_types.cmx \ - odoc_text.cmx \ - odoc_see_lexer.cmx \ - odoc_parser.cmx \ - odoc_misc.cmx \ - odoc_messages.cmx \ - odoc_merge.cmx \ - odoc_lexer.cmx \ - odoc_global.cmx \ - odoc_cross.cmx \ - odoc_comments_global.cmx \ - odoc_comments.cmi -odoc_comments.cmi : \ - odoc_types.cmi \ - odoc_module.cmi -odoc_comments_global.cmo : \ - odoc_comments_global.cmi -odoc_comments_global.cmx : \ - odoc_comments_global.cmi -odoc_comments_global.cmi : -odoc_config.cmo : \ - ../utils/config.cmi \ - odoc_config.cmi -odoc_config.cmx : \ - ../utils/config.cmx \ - odoc_config.cmi -odoc_config.cmi : -odoc_cross.cmo : \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_search.cmi \ - odoc_scan.cmi \ - odoc_parameter.cmi \ - odoc_name.cmi \ - odoc_module.cmi \ - odoc_misc.cmi \ - odoc_messages.cmi \ - odoc_global.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_class.cmi \ - ../utils/misc.cmi \ - odoc_cross.cmi -odoc_cross.cmx : \ - odoc_value.cmx \ - odoc_types.cmx \ - odoc_type.cmx \ - odoc_search.cmx \ - odoc_scan.cmx \ - odoc_parameter.cmx \ - odoc_name.cmx \ - odoc_module.cmx \ - odoc_misc.cmx \ - odoc_messages.cmx \ - odoc_global.cmx \ - odoc_extension.cmx \ - odoc_exception.cmx \ - odoc_class.cmx \ - ../utils/misc.cmx \ - odoc_cross.cmi -odoc_cross.cmi : \ - odoc_types.cmi \ - odoc_module.cmi -odoc_dag2html.cmo : \ - odoc_info.cmi \ - odoc_dag2html.cmi -odoc_dag2html.cmx : \ - odoc_info.cmx \ - odoc_dag2html.cmi -odoc_dag2html.cmi : \ - odoc_info.cmi -odoc_dep.cmo : \ - ../parsing/parsetree.cmi \ - odoc_type.cmi \ - odoc_print.cmi \ - odoc_module.cmi \ - ../utils/misc.cmi \ - ../parsing/depend.cmi \ - odoc_dep.cmi -odoc_dep.cmx : \ - ../parsing/parsetree.cmi \ - odoc_type.cmx \ - odoc_print.cmx \ - odoc_module.cmx \ - ../utils/misc.cmx \ - ../parsing/depend.cmx \ - odoc_dep.cmi -odoc_dep.cmi : \ - ../parsing/parsetree.cmi \ - odoc_type.cmi \ - odoc_module.cmi \ - ../utils/misc.cmi -odoc_dot.cmo : \ - odoc_messages.cmi \ - odoc_info.cmi \ - odoc_dot.cmi -odoc_dot.cmx : \ - odoc_messages.cmx \ - odoc_info.cmx \ - odoc_dot.cmi -odoc_dot.cmi : \ - odoc_info.cmi -odoc_env.cmo : \ - ../typing/types.cmi \ - ../typing/predef.cmi \ - ../typing/path.cmi \ - odoc_name.cmi \ - ../typing/btype.cmi \ - odoc_env.cmi -odoc_env.cmx : \ - ../typing/types.cmx \ - ../typing/predef.cmx \ - ../typing/path.cmx \ - odoc_name.cmx \ - ../typing/btype.cmx \ - odoc_env.cmi -odoc_env.cmi : \ - ../typing/types.cmi \ - odoc_name.cmi -odoc_exception.cmo : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_name.cmi \ - odoc_exception.cmi -odoc_exception.cmx : \ - ../typing/types.cmx \ - odoc_types.cmx \ - odoc_type.cmx \ - odoc_name.cmx \ - odoc_exception.cmi -odoc_exception.cmi : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_name.cmi -odoc_extension.cmo : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_name.cmi \ - ../parsing/asttypes.cmi \ - odoc_extension.cmi -odoc_extension.cmx : \ - ../typing/types.cmx \ - odoc_types.cmx \ - odoc_type.cmx \ - odoc_name.cmx \ - ../parsing/asttypes.cmi \ - odoc_extension.cmi -odoc_extension.cmi : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_name.cmi \ - ../parsing/asttypes.cmi -odoc_gen.cmo : \ - odoc_texi.cmi \ - odoc_module.cmi \ - odoc_man.cmi \ - odoc_latex.cmi \ - odoc_html.cmi \ - odoc_dot.cmi \ - odoc_gen.cmi -odoc_gen.cmx : \ - odoc_texi.cmx \ - odoc_module.cmx \ - odoc_man.cmx \ - odoc_latex.cmx \ - odoc_html.cmx \ - odoc_dot.cmx \ - odoc_gen.cmi -odoc_gen.cmi : \ - odoc_texi.cmi \ - odoc_module.cmi \ - odoc_man.cmi \ - odoc_latex.cmi \ - odoc_html.cmi \ - odoc_dot.cmi -odoc_global.cmo : \ - odoc_types.cmi \ - odoc_messages.cmi \ - odoc_config.cmi \ - ../utils/clflags.cmi \ - odoc_global.cmi -odoc_global.cmx : \ - odoc_types.cmx \ - odoc_messages.cmx \ - odoc_config.cmx \ - ../utils/clflags.cmx \ - odoc_global.cmi -odoc_global.cmi : \ - odoc_types.cmi -odoc_html.cmo : \ - odoc_text.cmi \ - odoc_ocamlhtml.cmi \ - odoc_messages.cmi \ - odoc_info.cmi \ - odoc_global.cmi \ - odoc_dag2html.cmi \ - ../utils/misc.cmi \ - ../parsing/asttypes.cmi \ - odoc_html.cmi -odoc_html.cmx : \ - odoc_text.cmx \ - odoc_ocamlhtml.cmx \ - odoc_messages.cmx \ - odoc_info.cmx \ - odoc_global.cmx \ - odoc_dag2html.cmx \ - ../utils/misc.cmx \ - ../parsing/asttypes.cmi \ - odoc_html.cmi -odoc_html.cmi : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_parameter.cmi \ - odoc_info.cmi \ - odoc_dag2html.cmi \ - ../utils/misc.cmi -odoc_info.cmo : \ - ../typing/printtyp.cmi \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_text.cmi \ - odoc_str.cmi \ - odoc_search.cmi \ - odoc_scan.cmi \ - odoc_print.cmi \ - odoc_parameter.cmi \ - odoc_name.cmi \ - odoc_module.cmi \ - odoc_misc.cmi \ - odoc_global.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_dep.cmi \ - odoc_config.cmi \ - odoc_comments.cmi \ - odoc_class.cmi \ - odoc_analyse.cmi \ - ../parsing/location.cmi \ - odoc_info.cmi -odoc_info.cmx : \ - ../typing/printtyp.cmx \ - odoc_value.cmx \ - odoc_types.cmx \ - odoc_type.cmx \ - odoc_text.cmx \ - odoc_str.cmx \ - odoc_search.cmx \ - odoc_scan.cmx \ - odoc_print.cmx \ - odoc_parameter.cmx \ - odoc_name.cmx \ - odoc_module.cmx \ - odoc_misc.cmx \ - odoc_global.cmx \ - odoc_extension.cmx \ - odoc_exception.cmx \ - odoc_dep.cmx \ - odoc_config.cmx \ - odoc_comments.cmx \ - odoc_class.cmx \ - odoc_analyse.cmx \ - ../parsing/location.cmx \ - odoc_info.cmi -odoc_info.cmi : \ - ../typing/types.cmi \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_search.cmi \ - odoc_parameter.cmi \ - odoc_module.cmi \ - odoc_global.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_class.cmi \ - ../parsing/location.cmi \ - ../parsing/asttypes.cmi -odoc_latex.cmo : \ - odoc_to_text.cmi \ - odoc_messages.cmi \ - odoc_latex_style.cmi \ - odoc_info.cmi \ - ../parsing/asttypes.cmi \ - odoc_latex.cmi -odoc_latex.cmx : \ - odoc_to_text.cmx \ - odoc_messages.cmx \ - odoc_latex_style.cmx \ - odoc_info.cmx \ - ../parsing/asttypes.cmi \ - odoc_latex.cmi -odoc_latex.cmi : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_info.cmi -odoc_latex_style.cmo : \ - odoc_latex_style.cmi -odoc_latex_style.cmx : \ - odoc_latex_style.cmi -odoc_latex_style.cmi : -odoc_lexer.cmo : \ - odoc_parser.cmi \ - odoc_messages.cmi \ - odoc_global.cmi \ - odoc_comments_global.cmi \ - odoc_lexer.cmi -odoc_lexer.cmx : \ - odoc_parser.cmx \ - odoc_messages.cmx \ - odoc_global.cmx \ - odoc_comments_global.cmx \ - odoc_lexer.cmi -odoc_lexer.cmi : \ - odoc_parser.cmi -odoc_man.cmo : \ - odoc_str.cmi \ - odoc_print.cmi \ - odoc_misc.cmi \ - odoc_messages.cmi \ - odoc_info.cmi \ - ../parsing/asttypes.cmi \ - odoc_man.cmi -odoc_man.cmx : \ - odoc_str.cmx \ - odoc_print.cmx \ - odoc_misc.cmx \ - odoc_messages.cmx \ - odoc_info.cmx \ - ../parsing/asttypes.cmi \ - odoc_man.cmi -odoc_man.cmi : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_info.cmi -odoc_merge.cmo : \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_parameter.cmi \ - odoc_module.cmi \ - odoc_messages.cmi \ - odoc_global.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_class.cmi \ - odoc_merge.cmi -odoc_merge.cmx : \ - odoc_value.cmx \ - odoc_types.cmx \ - odoc_type.cmx \ - odoc_parameter.cmx \ - odoc_module.cmx \ - odoc_messages.cmx \ - odoc_global.cmx \ - odoc_extension.cmx \ - odoc_exception.cmx \ - odoc_class.cmx \ - odoc_merge.cmi -odoc_merge.cmi : \ - odoc_types.cmi \ - odoc_module.cmi -odoc_messages.cmo : \ - ../utils/config.cmi \ - odoc_messages.cmi -odoc_messages.cmx : \ - ../utils/config.cmx \ - odoc_messages.cmi -odoc_messages.cmi : -odoc_misc.cmo : \ - ../typing/types.cmi \ - ../typing/predef.cmi \ - ../typing/path.cmi \ - odoc_types.cmi \ - odoc_messages.cmi \ - ../parsing/longident.cmi \ - ../typing/btype.cmi \ - odoc_misc.cmi -odoc_misc.cmx : \ - ../typing/types.cmx \ - ../typing/predef.cmx \ - ../typing/path.cmx \ - odoc_types.cmx \ - odoc_messages.cmx \ - ../parsing/longident.cmx \ - ../typing/btype.cmx \ - odoc_misc.cmi -odoc_misc.cmi : \ - ../typing/types.cmi \ - odoc_types.cmi \ - ../parsing/longident.cmi \ - ../parsing/asttypes.cmi -odoc_module.cmo : \ - ../typing/types.cmi \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_name.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_class.cmi \ - ../utils/misc.cmi \ - odoc_module.cmi -odoc_module.cmx : \ - ../typing/types.cmx \ - odoc_value.cmx \ - odoc_types.cmx \ - odoc_type.cmx \ - odoc_name.cmx \ - odoc_extension.cmx \ - odoc_exception.cmx \ - odoc_class.cmx \ - ../utils/misc.cmx \ - odoc_module.cmi -odoc_module.cmi : \ - ../typing/types.cmi \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_name.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_class.cmi \ - ../utils/misc.cmi -odoc_name.cmo : \ - ../parsing/unit_info.cmi \ - ../typing/path.cmi \ - odoc_misc.cmi \ - ../typing/ident.cmi \ - odoc_name.cmi -odoc_name.cmx : \ - ../parsing/unit_info.cmx \ - ../typing/path.cmx \ - odoc_misc.cmx \ - ../typing/ident.cmx \ - odoc_name.cmi -odoc_name.cmi : \ - ../typing/path.cmi \ - ../parsing/longident.cmi \ - ../typing/ident.cmi -odoc_ocamlhtml.cmo : \ - odoc_ocamlhtml.cmi -odoc_ocamlhtml.cmx : \ - odoc_ocamlhtml.cmi -odoc_ocamlhtml.cmi : -odoc_parameter.cmo : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_parameter.cmi -odoc_parameter.cmx : \ - ../typing/types.cmx \ - odoc_types.cmx \ - odoc_parameter.cmi -odoc_parameter.cmi : \ - ../typing/types.cmi \ - odoc_types.cmi -odoc_parser.cmo : \ - odoc_types.cmi \ - odoc_comments_global.cmi \ - odoc_parser.cmi -odoc_parser.cmx : \ - odoc_types.cmx \ - odoc_comments_global.cmx \ - odoc_parser.cmi -odoc_parser.cmi : \ - odoc_types.cmi -odoc_print.cmo : \ - ../typing/types.cmi \ - ../typing/printtyp.cmi \ - ../typing/btype.cmi \ - odoc_print.cmi -odoc_print.cmx : \ - ../typing/types.cmx \ - ../typing/printtyp.cmx \ - ../typing/btype.cmx \ - odoc_print.cmi -odoc_print.cmi : \ - ../typing/types.cmi -odoc_scan.cmo : \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_module.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_class.cmi \ - odoc_scan.cmi -odoc_scan.cmx : \ - odoc_value.cmx \ - odoc_types.cmx \ - odoc_type.cmx \ - odoc_module.cmx \ - odoc_extension.cmx \ - odoc_exception.cmx \ - odoc_class.cmx \ - odoc_scan.cmi -odoc_scan.cmi : \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_module.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_class.cmi -odoc_search.cmo : \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_module.cmi \ - odoc_misc.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_class.cmi \ - odoc_search.cmi -odoc_search.cmx : \ - odoc_value.cmx \ - odoc_types.cmx \ - odoc_type.cmx \ - odoc_module.cmx \ - odoc_misc.cmx \ - odoc_extension.cmx \ - odoc_exception.cmx \ - odoc_class.cmx \ - odoc_search.cmi -odoc_search.cmi : \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_module.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_class.cmi -odoc_see_lexer.cmo : \ - odoc_parser.cmi \ - odoc_see_lexer.cmi -odoc_see_lexer.cmx : \ - odoc_parser.cmx \ - odoc_see_lexer.cmi -odoc_see_lexer.cmi : \ - odoc_parser.cmi -odoc_sig.cmo : \ - ../parsing/unit_info.cmi \ - ../typing/types.cmi \ - ../typing/typedtree.cmi \ - ../parsing/parsetree.cmi \ - odoc_value.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_parameter.cmi \ - odoc_module.cmi \ - odoc_misc.cmi \ - odoc_messages.cmi \ - odoc_merge.cmi \ - odoc_global.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_env.cmi \ - odoc_class.cmi \ - ../parsing/longident.cmi \ - ../parsing/location.cmi \ - ../typing/ident.cmi \ - ../typing/ctype.cmi \ - ../typing/btype.cmi \ - ../parsing/asttypes.cmi \ - odoc_sig.cmi -odoc_sig.cmx : \ - ../parsing/unit_info.cmx \ - ../typing/types.cmx \ - ../typing/typedtree.cmx \ - ../parsing/parsetree.cmi \ - odoc_value.cmx \ - odoc_types.cmx \ - odoc_type.cmx \ - odoc_parameter.cmx \ - odoc_module.cmx \ - odoc_misc.cmx \ - odoc_messages.cmx \ - odoc_merge.cmx \ - odoc_global.cmx \ - odoc_extension.cmx \ - odoc_exception.cmx \ - odoc_env.cmx \ - odoc_class.cmx \ - ../parsing/longident.cmx \ - ../parsing/location.cmx \ - ../typing/ident.cmx \ - ../typing/ctype.cmx \ - ../typing/btype.cmx \ - ../parsing/asttypes.cmi \ - odoc_sig.cmi -odoc_sig.cmi : \ - ../typing/types.cmi \ - ../typing/typedtree.cmi \ - ../parsing/parsetree.cmi \ - odoc_types.cmi \ - odoc_type.cmi \ - odoc_name.cmi \ - odoc_module.cmi \ - odoc_env.cmi \ - odoc_class.cmi \ - ../parsing/location.cmi -odoc_str.cmo : \ - ../typing/types.cmi \ - ../typing/printtyp.cmi \ - odoc_value.cmi \ - odoc_type.cmi \ - odoc_print.cmi \ - odoc_name.cmi \ - odoc_misc.cmi \ - odoc_messages.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_class.cmi \ - ../parsing/asttypes.cmi \ - odoc_str.cmi -odoc_str.cmx : \ - ../typing/types.cmx \ - ../typing/printtyp.cmx \ - odoc_value.cmx \ - odoc_type.cmx \ - odoc_print.cmx \ - odoc_name.cmx \ - odoc_misc.cmx \ - odoc_messages.cmx \ - odoc_extension.cmx \ - odoc_exception.cmx \ - odoc_class.cmx \ - ../parsing/asttypes.cmi \ - odoc_str.cmi -odoc_str.cmi : \ - ../typing/types.cmi \ - odoc_value.cmi \ - odoc_type.cmi \ - odoc_extension.cmi \ - odoc_exception.cmi \ - odoc_class.cmi -odoc_test.cmo : \ - odoc_info.cmi \ - odoc_gen.cmi \ - odoc_args.cmi \ - odoc_test.cmi -odoc_test.cmx : \ - odoc_info.cmx \ - odoc_gen.cmx \ - odoc_args.cmx \ - odoc_test.cmi -odoc_test.cmi : -odoc_texi.cmo : \ - ../typing/types.cmi \ - odoc_to_text.cmi \ - odoc_messages.cmi \ - odoc_info.cmi \ - ../parsing/asttypes.cmi \ - odoc_texi.cmi -odoc_texi.cmx : \ - ../typing/types.cmx \ - odoc_to_text.cmx \ - odoc_messages.cmx \ - odoc_info.cmx \ - ../parsing/asttypes.cmi \ - odoc_texi.cmi -odoc_texi.cmi : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_info.cmi -odoc_text.cmo : \ - odoc_types.cmi \ - odoc_text_parser.cmi \ - odoc_text_lexer.cmi \ - odoc_text.cmi -odoc_text.cmx : \ - odoc_types.cmx \ - odoc_text_parser.cmx \ - odoc_text_lexer.cmx \ - odoc_text.cmi -odoc_text.cmi : \ - odoc_types.cmi -odoc_text_lexer.cmo : \ - odoc_text_parser.cmi \ - odoc_misc.cmi \ - odoc_text_lexer.cmi -odoc_text_lexer.cmx : \ - odoc_text_parser.cmx \ - odoc_misc.cmx \ - odoc_text_lexer.cmi -odoc_text_lexer.cmi : \ - odoc_text_parser.cmi -odoc_text_parser.cmo : \ - odoc_types.cmi \ - odoc_misc.cmi \ - odoc_text_parser.cmi -odoc_text_parser.cmx : \ - odoc_types.cmx \ - odoc_misc.cmx \ - odoc_text_parser.cmi -odoc_text_parser.cmi : \ - odoc_types.cmi -odoc_to_text.cmo : \ - odoc_str.cmi \ - odoc_module.cmi \ - odoc_messages.cmi \ - odoc_info.cmi \ - odoc_to_text.cmi -odoc_to_text.cmx : \ - odoc_str.cmx \ - odoc_module.cmx \ - odoc_messages.cmx \ - odoc_info.cmx \ - odoc_to_text.cmi -odoc_to_text.cmi : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_info.cmi -odoc_type.cmo : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_name.cmi \ - ../parsing/asttypes.cmi \ - odoc_type.cmi -odoc_type.cmx : \ - ../typing/types.cmx \ - odoc_types.cmx \ - odoc_name.cmx \ - ../parsing/asttypes.cmi \ - odoc_type.cmi -odoc_type.cmi : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_name.cmi \ - ../parsing/asttypes.cmi -odoc_types.cmo : \ - odoc_messages.cmi \ - ../parsing/location.cmi \ - odoc_types.cmi -odoc_types.cmx : \ - odoc_messages.cmx \ - ../parsing/location.cmx \ - odoc_types.cmi -odoc_types.cmi : \ - ../parsing/location.cmi -odoc_value.cmo : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_parameter.cmi \ - odoc_name.cmi \ - odoc_misc.cmi \ - ../parsing/asttypes.cmi \ - odoc_value.cmi -odoc_value.cmx : \ - ../typing/types.cmx \ - odoc_types.cmx \ - odoc_parameter.cmx \ - odoc_name.cmx \ - odoc_misc.cmx \ - ../parsing/asttypes.cmi \ - odoc_value.cmi -odoc_value.cmi : \ - ../typing/types.cmi \ - odoc_types.cmi \ - odoc_parameter.cmi \ - odoc_name.cmi -generators/odoc_literate.cmo : \ - odoc_info.cmi \ - odoc_html.cmi \ - odoc_gen.cmi \ - odoc_args.cmi \ - generators/odoc_literate.cmi -generators/odoc_literate.cmx : \ - odoc_info.cmx \ - odoc_html.cmx \ - odoc_gen.cmx \ - odoc_args.cmx \ - generators/odoc_literate.cmi -generators/odoc_literate.cmxs : \ - odoc_info.cmx \ - odoc_html.cmx \ - odoc_gen.cmx \ - odoc_args.cmx \ - generators/odoc_literate.cmi -generators/odoc_literate.cmi : \ - odoc_html.cmi -generators/odoc_todo.cmo : \ - odoc_module.cmi \ - odoc_info.cmi \ - odoc_html.cmi \ - odoc_gen.cmi \ - odoc_args.cmi \ - generators/odoc_todo.cmi -generators/odoc_todo.cmx : \ - odoc_module.cmx \ - odoc_info.cmx \ - odoc_html.cmx \ - odoc_gen.cmx \ - odoc_args.cmx \ - generators/odoc_todo.cmi -generators/odoc_todo.cmxs : \ - odoc_module.cmx \ - odoc_info.cmx \ - odoc_html.cmx \ - odoc_gen.cmx \ - odoc_args.cmx \ - generators/odoc_todo.cmi -generators/odoc_todo.cmi : \ - odoc_scan.cmi \ - odoc_info.cmi \ - odoc_html.cmi diff --git a/ocamldoc/Makefile b/ocamldoc/Makefile deleted file mode 100644 index 861889f13e6..00000000000 --- a/ocamldoc/Makefile +++ /dev/null @@ -1,347 +0,0 @@ -#************************************************************************** -#* * -#* OCaml * -#* * -#* Maxence Guesdon, projet Cristal, INRIA Rocquencourt * -#* * -#* Copyright 2001 Institut National de Recherche en Informatique et * -#* en Automatique. * -#* * -#* All rights reserved. This file is distributed under the terms of * -#* the GNU Lesser General Public License version 2.1, with the * -#* special exception on linking described in the file LICENSE. * -#* * -#************************************************************************** - -ROOTDIR = .. - -include $(ROOTDIR)/Makefile.common -include $(ROOTDIR)/Makefile.best_binaries - -OCAMLC = $(BEST_OCAMLC) $(STDLIBFLAGS) -OCAMLOPT = $(BEST_OCAMLOPT) $(STDLIBFLAGS) - -# For installation -############## - -programs := ocamldoc ocamldoc.opt -include Makefile.best_ocamldoc - -OCAMLDOC_LIBCMA=odoc_info.cma -OCAMLDOC_LIBCMI=odoc_info.cmi -OCAMLDOC_LIBCMXA=odoc_info.cmxa -OCAMLDOC_LIBA=odoc_info.$(A) - -OCAMLDOC_LIBMLIS=$(addsuffix .mli,\ - odoc_dep odoc_dot odoc_extension odoc_html odoc_info odoc_latex \ - odoc_latex_style odoc_man odoc_messages odoc_ocamlhtml odoc_parameter \ - odoc_texi odoc_text_lexer odoc_to_text odoc_type odoc_value) -OCAMLDOC_LIBCMIS=$(OCAMLDOC_LIBMLIS:.mli=.cmi) -OCAMLDOC_LIBCMTS=$(OCAMLDOC_LIBMLIS:.mli=.cmt) $(OCAMLDOC_LIBMLIS:.mli=.cmti) - -ODOC_TEST=odoc_test.cmo -GENERATORS_CMOS= \ - generators/odoc_todo.cmo \ - generators/odoc_literate.cmo -ifeq "$(NATDYNLINK)" "true" -GENERATORS_CMXS = $(GENERATORS_CMOS:.cmo=.cmxs) -else -GENERATORS_CMXS = -endif - -# Compilation -############# - - -INCLUDE_DIRS = $(addprefix $(ROOTDIR)/,\ - utils parsing typing driver bytecomp toplevel) generators -INCLUDES_DEP = $(addprefix -I ,$(INCLUDE_DIRS)) -INCLUDES_NODEP = $(addprefix -I $(ROOTDIR)/,\ - compilerlibs otherlibs/str otherlibs/dynlink \ - otherlibs/dynlink/native otherlibs/unix) - -OC_OCAMLDEPDIRS = $(INCLUDE_DIRS) -INCLUDES=$(INCLUDES_DEP) $(INCLUDES_NODEP) - -COMPFLAGS = \ - -g $(INCLUDES) -absname -w +a-4-9-41-42-44-45-48 -warn-error +A \ - -strict-sequence -strict-formats -bin-annot -principal - -LINKFLAGS = $(INCLUDES) - -CMOFILES=\ - odoc_config.cmo \ - odoc_messages.cmo \ - odoc_global.cmo \ - odoc_types.cmo \ - odoc_misc.cmo \ - odoc_text_parser.cmo \ - odoc_text_lexer.cmo \ - odoc_text.cmo \ - odoc_name.cmo \ - odoc_parameter.cmo \ - odoc_value.cmo \ - odoc_type.cmo \ - odoc_extension.cmo \ - odoc_exception.cmo \ - odoc_class.cmo \ - odoc_module.cmo \ - odoc_print.cmo \ - odoc_str.cmo \ - odoc_comments_global.cmo \ - odoc_parser.cmo \ - odoc_lexer.cmo \ - odoc_see_lexer.cmo \ - odoc_env.cmo \ - odoc_merge.cmo \ - odoc_sig.cmo \ - odoc_ast.cmo \ - odoc_search.cmo \ - odoc_scan.cmo \ - odoc_cross.cmo \ - odoc_comments.cmo \ - odoc_dep.cmo \ - odoc_analyse.cmo \ - odoc_info.cmo - -CMXFILES = $(CMOFILES:.cmo=.cmx) -CMIFILES = $(CMOFILES:.cmo=.cmi) - -EXECMOFILES=\ - $(CMOFILES) \ - odoc_dag2html.cmo \ - odoc_to_text.cmo \ - odoc_ocamlhtml.cmo \ - odoc_html.cmo \ - odoc_man.cmo \ - odoc_latex_style.cmo \ - odoc_latex.cmo \ - odoc_texi.cmo \ - odoc_dot.cmo \ - odoc_gen.cmo \ - odoc_args.cmo \ - odoc.cmo - -EXECMXFILES = $(EXECMOFILES:.cmo=.cmx) -EXECMIFILES = $(EXECMOFILES:.cmo=.cmi) - -LIBCMOFILES = $(CMOFILES) -LIBCMXFILES = $(LIBCMOFILES:.cmo=.cmx) -LIBCMIFILES = $(LIBCMOFILES:.cmo=.cmi) - -.PHONY: all -all: lib exe generators - -.PHONY: exe -exe: $(OCAMLDOC) - -.PHONY: lib -lib: $(OCAMLDOC_LIBCMA) $(OCAMLDOC_LIBCMI) $(ODOC_TEST) - -.PHONY: generators -generators: $(GENERATORS_CMOS) - -.PHONY: opt.opt allopt # allopt and opt.opt are synonyms -opt.opt: exeopt libopt generatorsopt -allopt: opt.opt - -.PHONY: exeopt -exeopt: $(OCAMLDOC_OPT) - -.PHONY: libopt -libopt: $(OCAMLDOC_LIBCMXA) $(OCAMLDOC_LIBCMI) - -.PHONY: generatorsopt -generatorsopt: $(GENERATORS_CMXS) - -OCAMLDOC_LIBRARIES = ocamlcommon unix str dynlink - -OCAMLDOC_BCLIBRARIES = $(OCAMLDOC_LIBRARIES:%=%.cma) -OCAMLDOC_NCLIBRARIES = $(OCAMLDOC_LIBRARIES:%=%.cmxa) - -$(eval $(call PROGRAM_SYNONYM,ocamldoc)) - -$(OCAMLDOC): $(EXECMOFILES) - $(V_LINKC)$(OCAMLC) -o $@ -linkall $(LINKFLAGS) $(OCAMLDOC_BCLIBRARIES) $^ - -$(eval $(call PROGRAM_SYNONYM,ocamldoc.opt)) - -$(OCAMLDOC_OPT): $(EXECMXFILES) - $(V_LINKOPT)$(OCAMLOPT) -o $@ -linkall $(LINKFLAGS) $(OCAMLDOC_NCLIBRARIES) $^ - -$(OCAMLDOC_LIBCMA): $(LIBCMOFILES) - $(V_LINKC)$(OCAMLC) -a -o $@ $(LINKFLAGS) $^ - -$(OCAMLDOC_LIBCMXA): $(LIBCMXFILES) - $(V_LINKOPT)$(OCAMLOPT) -a -o $@ $(LINKFLAGS) $^ - -.PHONY: dot -dot: ocamldoc.dot - -ocamldoc.dot: $(EXECMOFILES) - $(OCAMLDOC_RUN) -dot -dot-reduce -o $@ $(INCLUDES) odoc*.ml - -# Lexers and parsers - -LEXERS = $(addsuffix .mll,\ - odoc_text_lexer odoc_lexer odoc_ocamlhtml odoc_see_lexer) - -PARSERS = $(addsuffix .mly,odoc_parser odoc_text_parser) - -DEPEND_PREREQS = $(LEXERS:.mll=.ml) \ - $(PARSERS:.mly=.mli) $(PARSERS:.mly=.ml) - -# generic rules : -################# - -%.cmo: %.ml - $(V_OCAMLC)$(OCAMLC) $(COMPFLAGS) -c $< - -%.cmi: %.mli - $(V_OCAMLC)$(OCAMLC) $(COMPFLAGS) -c $< - -%.cmx: %.ml - $(V_OCAMLOPT)$(OCAMLOPT) $(COMPFLAGS) -c $< - -%.cmxs: %.ml - $(V_OCAMLOPT)$(OCAMLOPT) -shared -o $@ $(COMPFLAGS) $< - -# Installation targets -###################### - -# TODO: it may be good to split the following rule in several ones, e.g. -# install-programs, install-doc, install-libs - -.PHONY: install -install: - $(MKDIR) "$(INSTALL_BINDIR)" - $(MKDIR) "$(INSTALL_LIBDIR)/ocamldoc" - $(INSTALL_PROG) $(OCAMLDOC) "$(INSTALL_BINDIR)" - $(INSTALL_DATA) \ - ocamldoc.hva *.cmi $(OCAMLDOC_LIBCMA) META \ - "$(INSTALL_LIBDIR)/ocamldoc" - $(INSTALL_DATA) \ - $(OCAMLDOC_LIBCMIS) \ - "$(INSTALL_LIBDIR)/ocamldoc" -ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" - $(INSTALL_DATA) \ - $(OCAMLDOC_LIBMLIS) $(OCAMLDOC_LIBCMTS) \ - "$(INSTALL_LIBDIR)/ocamldoc" -endif - -# Note: at the moment, $(INSTALL_MANODIR) is created even if the doc has -# not been built. This is not clean and should be changed. - -.PHONY: installopt -installopt: - if test -f $(OCAMLDOC_OPT); then $(MAKE) installopt_really ; fi - -.PHONY: installopt_really -installopt_really: - $(MKDIR) "$(INSTALL_BINDIR)" - $(MKDIR) "$(INSTALL_LIBDIR)/ocamldoc" - $(INSTALL_PROG) $(OCAMLDOC_OPT) "$(INSTALL_BINDIR)" - $(INSTALL_DATA) \ - $(OCAMLDOC_LIBCMIS) \ - "$(INSTALL_LIBDIR)/ocamldoc" -ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" - $(INSTALL_DATA) \ - $(OCAMLDOC_LIBMLIS) $(OCAMLDOC_LIBCMTS) \ - "$(INSTALL_LIBDIR)/ocamldoc" -endif - $(INSTALL_DATA) \ - ocamldoc.hva *.cmx $(OCAMLDOC_LIBA) $(OCAMLDOC_LIBCMXA) \ - "$(INSTALL_LIBDIR)/ocamldoc" - -# TODO: also split into several rules - -# Testing : -########### - -.PHONY: test -test: - $(MKDIR) $@ - $(OCAMLDOC_RUN) -html -colorize-code -sort -d $@ $(INCLUDES) -dump $@/ocamldoc.odoc odoc*.ml odoc*.mli -v - $(MKDIR) $@-custom - $(OCAMLDOC_RUN_PLUGINS) -colorize-code -sort -d $@-custom $(INCLUDES) \ - -g generators/odoc_literate.cmo -g generators/odoc_todo.cmo \ - -load $@/ocamldoc.odoc -v - -.PHONY: test_stdlib -test_stdlib: - $(MKDIR) $@ - $(OCAMLDOC_RUN) -html -colorize-code -sort -d $@ $(INCLUDES) -dump $@/stdlib.odoc -keep-code \ - $(ROOTDIR)/stdlib/*.mli \ - $(ROOTDIR)/otherlibs/unix/unix.mli \ - $(ROOTDIR)/otherlibs/str/str.mli - -.PHONY: test_stdlib_code -test_stdlib_code: - $(MKDIR) $@ - $(OCAMLDOC_RUN) -html -colorize-code -sort -d $@ $(INCLUDES) -dump $@/stdlib.odoc -keep-code \ - `ls $(ROOTDIR)/stdlib/*.ml | grep -v Labels` \ - $(ROOTDIR)/otherlibs/unix/unix.ml \ - $(ROOTDIR)/otherlibs/str/str.ml - -.PHONY: test_latex -test_latex: - $(MKDIR) $@ - $(OCAMLDOC_RUN) -latex -sort -o $@/test.tex -d $@ $(INCLUDES) odoc*.ml \ - odoc*.mli test2.txt $(ROOTDIR)/stdlib/*.mli $(ROOTDIR)/otherlibs/unix/unix.mli - -.PHONY: test_latex_simple -test_latex_simple: - $(MKDIR) $@ - $(OCAMLDOC_RUN) -latex -sort -o $@/test.tex -d $@ $(INCLUDES) \ - -latextitle 6,subsection -latextitle 7,subsubection \ - $(ROOTDIR)/stdlib/hashtbl.mli \ - $(ROOTDIR)/stdlib/arg.mli \ - $(ROOTDIR)/otherlibs/unix/unix.mli \ - $(ROOTDIR)/stdlib/map.mli - -.PHONY: test_man -test_man: - $(MKDIR) $@ - $(OCAMLDOC_RUN) -man -sort -d $@ $(INCLUDES) odoc*.ml odoc*.mli - -.PHONY: test_texi -test_texi: - $(MKDIR) $@ - $(OCAMLDOC_RUN) -texi -sort -d $@ $(INCLUDES) odoc*.ml odoc*.mli - -# stdlib non-prefixed : -####################### - -.PHONY: autotest_stdlib -autotest_stdlib: - $(MKDIR) $@ - $(OCAMLDOC_RUN_PLUGINS) -g autotest/odoc_test.cmo\ - $(INCLUDES) -keep-code \ - $(ROOTDIR)/stdlib/*.mli \ - $(ROOTDIR)/otherlibs/unix/unix.mli \ - $(ROOTDIR)/otherlibs/str/str.mli - -# backup, clean and depend : -############################ - -.PHONY: clean -clean: - rm -f \#*\# - rm -f $(programs) $(programs:=.exe) - rm -f *.cma *.cmxa *.cmo *.cmi *.cmx *.cmt *.cmti *.a *.lib *.o *.obj - rm -f odoc_parser.output odoc_text_parser.output - rm -f odoc_lexer.ml odoc_text_lexer.ml odoc_see_lexer.ml odoc_ocamlhtml.ml - rm -f odoc_parser.ml odoc_parser.mli odoc_text_parser.ml odoc_text_parser.mli - rm -f generators/*.cm[taiox] generators/*.a generators/*.lib generators/*.o generators/*.obj \ - generators/*.cmx[as] generators/*.cmti - -.PHONY: distclean -distclean: clean - rm -f META - -.PHONY: depend -depend: $(DEPEND_PREREQS) - $(OCAMLDEP_CMD) *.mll *.mly *.ml *.mli > .depend - $(OCAMLDEP_CMD) -shared generators/*.ml generators/*.mli >> .depend - -include .depend diff --git a/ocamldoc/Makefile.best_ocamldoc b/ocamldoc/Makefile.best_ocamldoc deleted file mode 100644 index 87010270166..00000000000 --- a/ocamldoc/Makefile.best_ocamldoc +++ /dev/null @@ -1,41 +0,0 @@ -#************************************************************************** -#* * -#* OCaml * -#* * -#* Florian Angeletti, projet Cambium, Inria Paris * -#* * -#* Copyright 2020 Institut National de Recherche en Informatique et * -#* en Automatique. * -#* * -#* All rights reserved. This file is distributed under the terms of * -#* the GNU Lesser General Public License version 2.1, with the * -#* special exception on linking described in the file LICENSE. * -#* * -#************************************************************************** - -OCAMLDOC = $(ROOTDIR)/ocamldoc/ocamldoc$(EXE) -OCAMLDOC_OPT = $(ROOTDIR)/ocamldoc/ocamldoc.opt$(EXE) - -ifeq "$(TARGET)" "$(HOST)" - ifeq "$(SUPPORTS_SHARED_LIBRARIES)" "true" - OCAMLDOC_RUN_BYTE = $(NEW_OCAMLRUN) -I $(ROOTDIR)/otherlibs/unix \ - -I $(ROOTDIR)/otherlibs/str ./$(OCAMLDOC) - else - # if shared-libraries are not supported, unix.cma and str.cma - # are compiled with -custom, so ocamldoc also uses -custom, - # and (ocamlrun ocamldoc) does not work. - OCAMLDOC_RUN_BYTE = ./$(OCAMLDOC) - endif -else - OCAMLDOC_RUN_BYTE = $(NEW_OCAMLRUN) ./$(OCAMLDOC) -endif - -OCAMLDOC_RUN_OPT = ./$(OCAMLDOC_OPT) - -OCAMLDOC_RUN_PLUGINS = $(OCAMLDOC_RUN_BYTE) - -ifeq "$(wildcard $(OCAMLDOC_OPT))" "" - OCAMLDOC_RUN = $(OCAMLDOC_RUN_BYTE) -else - OCAMLDOC_RUN = $(OCAMLDOC_RUN_OPT) -endif diff --git a/ocamldoc/generators/odoc_literate.ml b/ocamldoc/generators/odoc_literate.ml deleted file mode 100644 index 6761873ddbd..00000000000 --- a/ocamldoc/generators/odoc_literate.ml +++ /dev/null @@ -1,213 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Maxence Guesdon, projet Cristal, INRIA Rocquencourt *) -(* *) -(* Copyright 2001 Institut National de Recherche en Informatique et *) -(* en Automatique. *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -open Odoc_info -module Naming = Odoc_html.Naming -open Odoc_info.Value - -let p = Printf.bprintf -let bp = Printf.bprintf -let bs = Buffer.add_string - -module Html = - (val - ( - match !Odoc_args.current_generator with - None -> (module Odoc_html.Generator : Odoc_html.Html_generator) - | Some (Odoc_gen.Html m) -> m - | _ -> - failwith - "A non-html generator is already set. Cannot install the Todo-list html generator" - ) : Odoc_html.Html_generator) - -module Generator = -struct -class html = - object (self) - inherit Html.html - - method! private html_of_module_comment b text = - let br1, br2 = - match text with - [(Odoc_info.Title _)] -> false, false - | (Odoc_info.Title _) :: _ -> false, true - | _ -> true, true - in - if br1 then p b "
"; - self#html_of_text b text; - if br2 then p b "

\n" - - method! private html_of_Title b n l_opt t = - let label1 = self#create_title_label (n, l_opt, t) in - p b "\n" (Naming.label_target label1); - p b "" n; - self#html_of_text b t; - p b "" n - - val mutable code_id = 0 - method private code_block b code = - code_id <- code_id + 1; - Printf.bprintf b - "\ - \"+/-\"/" - code_id code_id code_id; - Printf.bprintf b "
" code_id; - self#html_of_code b code; - Printf.bprintf b "
" - - (** Print html code for a value. *) - method! private html_of_value b v = - Odoc_info.reset_type_names (); - self#html_of_info b v.val_info; - bs b "
";
-      bs b (self#keyword "val");
-      bs b " ";
-      (* html mark *)
-      bp b "" (Naming.value_target v);
-      bs b (self#escape (Name.simple v.val_name));
-      bs b " : ";
-      self#html_of_type_expr b (Name.father v.val_name) v.val_type;
-      bs b "
"; - ( - if !Odoc_html.with_parameter_list then - self#html_of_parameter_list b (Name.father v.val_name) v.val_parameters - else - self#html_of_described_parameter_list b (Name.father v.val_name) v.val_parameters - ); - ( - match v.val_code with - None -> () - | Some code -> - self#code_block b code - ) -(* - (** Print html code for a module. *) - method private html_of_module b ?(info=true) ?(complete=true) ?(with_link=true) m = - let (html_file, _) = Naming.html_files m.m_name in - let father = Name.father m.m_name in - bs b "
";
-      bs b ((self#keyword "module")^" ");
-      (
-       if with_link then
-         bp b "%s" html_file (Name.simple m.m_name)
-       else
-         bs b (Name.simple m.m_name)
-      );
-(*      A remettre quand on compilera avec ocaml 3.10
-         (
-       match m.m_kind with
-         Module_functor _ when !Odoc_info.Args.html_short_functors  ->
-           ()
-
-       | _ -> *) bs b ": ";
-      (*
-      );
-      *)
-      self#html_of_module_kind b father ~modu: m m.m_kind;
-      bs b "
"; - if info && complete then - self#html_of_info ~indent: false b m.m_info - -*) - initializer - default_style_options <- - ["a:visited {color : #416DFF; text-decoration : none; }" ; - "a:link {color : #416DFF; text-decoration : none;}" ; - "a:hover {color : Red; text-decoration : none; background-color: #5FFF88}" ; - "a:active {color : Red; text-decoration : underline; }" ; - ".keyword { font-weight : bold ; color : Red }" ; - ".keywordsign { color : #C04600 }" ; - ".superscript { font-size : 0.6em }" ; - ".subscript { font-size : 0.6em }" ; - ".comment { color : Green }" ; - ".constructor { color : Blue }" ; - ".type { color : #5C6585 }" ; - ".string { color : Maroon }" ; - ".warning { color : Red ; font-weight : bold }" ; - ".info { margin-top: 8px; }"; - ".param_info { margin-top: 4px; margin-left : 3em; margin-right : 3em }" ; - ".code { color : #465F91 ; }" ; - "h1 { font-size : 20pt ; text-align: center; }" ; - - "h2 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #90BDFF ;"^ - "padding: 2px; }" ; - - "h3 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #90DDFF ;"^ - "padding: 2px; }" ; - - "h4 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #90EDFF ;"^ - "padding: 2px; }" ; - - "h5 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #90FDFF ;"^ - "padding: 2px; }" ; - - "h6 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #C0FFFF ; "^ - "padding: 2px; }" ; - - "div.h7 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #E0FFFF ; "^ - "padding: 2px; }" ; - - "div.h8 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #F0FFFF ; "^ - "padding: 2px; }" ; - - "div.h9 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #FFFFFF ; "^ - "padding: 2px; }" ; - - ".typetable { border-style : hidden }" ; - ".indextable { border-style : hidden }" ; - ".paramstable { border-style : hidden ; padding: 5pt 5pt}" ; - "body { background-color : White }" ; - "tr { background-color : White }" ; - "td.typefieldcomment { background-color : #FFFFFF ; font-size: smaller ;}" ; - "pre { margin-bottom: 4px ; margin-left: 1em; "^ - "border-color: #27408b; border-style: solid; "^ - "border-width: 1px 1px 1px 3px; "^ - "padding: 4px; }" ; - "div.sig_block {margin-left: 2em}" ; - - "div.codeblock { "^ - "margin-left: 2em; margin-right: 1em; padding: 6px; "^ - "margin-bottom: 8px; display: none; "^ - "border-width: 1px 1px 1px 3px; border-style: solid; border-color: grey; }" ; - - "span.code_expand { color: blue; text-decoration: underline; cursor: pointer; "^ - "margin-left: 1em ; } "; - ]; - end -end - -let _ = Odoc_args.set_generator - (Odoc_gen.Html (module Generator : Odoc_html.Html_generator)) diff --git a/ocamldoc/generators/odoc_literate.mli b/ocamldoc/generators/odoc_literate.mli deleted file mode 100644 index eaf38ba8f28..00000000000 --- a/ocamldoc/generators/odoc_literate.mli +++ /dev/null @@ -1,23 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Sebastien Hinderer, projet Cambium, INRIA Paris *) -(* *) -(* Copyright 2022 Institut National de Recherche en Informatique et *) -(* en Automatique. *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -module Naming = Odoc_html.Naming - -module Html : Odoc_html.Html_generator - -module Generator : - sig - class html : Odoc_html.Generator.html - end diff --git a/ocamldoc/generators/odoc_todo.ml b/ocamldoc/generators/odoc_todo.ml deleted file mode 100644 index ce3c2c12802..00000000000 --- a/ocamldoc/generators/odoc_todo.ml +++ /dev/null @@ -1,233 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Maxence Guesdon, projet Cristal, INRIA Rocquencourt *) -(* *) -(* Copyright 2010 Institut National de Recherche en Informatique et *) -(* en Automatique. *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -(** An OCamldoc generator to retrieve information in "todo" tags and - generate an html page with all todo items. *) - -open Odoc_info -module Naming = Odoc_html.Naming -open Odoc_info.Value -open Odoc_info.Module -open Odoc_info.Type -open Odoc_info.Extension -open Odoc_info.Exception -open Odoc_info.Class - -let p = Printf.bprintf - -module Html = - (val - ( - match !Odoc_args.current_generator with - None -> (module Odoc_html.Generator : Odoc_html.Html_generator) - | Some (Odoc_gen.Html m) -> m - | _ -> - failwith - "A non-html generator is already set. Cannot install the Todo-list html generator" - ) : Odoc_html.Html_generator) - -module Generator = -struct - class scanner html = - object (self) - inherit Odoc_info.Scan.scanner - - val b = Buffer.create 256 - method buffer = b - - method private gen_if_tag name target info_opt = - match info_opt with - None -> () - | Some i -> - let l = - List.fold_left - (fun acc (t, text) -> - match t with - "todo" -> - begin - match text with - (Odoc_info.Code s) :: q -> - ( - try - let n = int_of_string s in - let head = - Odoc_info.Code (Printf.sprintf "[%d] " n) - in - (Some n, head::q) :: acc - with _ -> (None, text) :: acc - ) - | _ -> (None, text) :: acc - - end - | _ -> acc - ) - [] - i.i_custom - in - match l with - [] -> () - | _ -> - let l = List.sort - (fun a b -> - match a, b with - (None, _), _ -> -1 - | _, (None, _) -> 1 - | (Some n1, _), (Some n2, _) -> compare n1 n2 - ) - l - in - p b "
%s
" - target name; - let col = function - None -> "#000000" - | Some 1 -> "#FF0000" - | Some 2 -> "#AA5555" - | Some 3 -> "#44BB00" - | Some n -> Printf.sprintf "#%2x0000" (0xAA - (n * 0x10)) - in - List.iter - (fun (n, e) -> - Printf.bprintf b "" (col n); - html#html_of_text ?with_p:(Some false) b e; - p b "
\n"; - ) - l; - p b "
" - - method! scan_value v = - self#gen_if_tag - v.val_name - (Odoc_html.Naming.complete_value_target v) - v.val_info - - method! scan_type t = - self#gen_if_tag - t.ty_name - (Odoc_html.Naming.complete_type_target t) - t.ty_info - - method! scan_extension_constructor x = - self#gen_if_tag - x.xt_name - (Odoc_html.Naming.complete_extension_target x) - x.xt_type_extension.te_info - - method! scan_exception e = - self#gen_if_tag - e.ex_name - (Odoc_html.Naming.complete_exception_target e) - e.ex_info - - method! scan_attribute a = - self#gen_if_tag - a.att_value.val_name - (Odoc_html.Naming.complete_attribute_target a) - a.att_value.val_info - - method! scan_method m = - self#gen_if_tag - m.met_value.val_name - (Odoc_html.Naming.complete_method_target m) - m.met_value.val_info - - (** This method scans the elements of the given module. *) - method! scan_module_elements m = - List.iter - (fun ele -> - match ele with - Odoc_module.Element_module m -> self#scan_module m - | Odoc_module.Element_module_type mt -> self#scan_module_type mt - | Odoc_module.Element_included_module im -> self#scan_included_module im - | Odoc_module.Element_class c -> self#scan_class c - | Odoc_module.Element_class_type ct -> self#scan_class_type ct - | Odoc_module.Element_value v -> self#scan_value v - | Odoc_module.Element_type_extension te -> self#scan_type_extension te - | Odoc_module.Element_exception e -> self#scan_exception e - | Odoc_module.Element_type t -> self#scan_type t - | Odoc_module.Element_module_comment t -> self#scan_module_comment t - ) - (Odoc_module.module_elements ~trans: false m) - - method! scan_included_module _ = () - - method! scan_class_pre c = - self#gen_if_tag - c.cl_name - (fst (Odoc_html.Naming.html_files c.cl_name)) - c.cl_info; - true - - method! scan_class_type_pre ct = - self#gen_if_tag - ct.clt_name - (fst (Odoc_html.Naming.html_files ct.clt_name)) - ct.clt_info; - true - - method! scan_module_pre m = - self#gen_if_tag - m.m_name - (fst (Odoc_html.Naming.html_files m.m_name)) - m.m_info; - true - - method! scan_module_type_pre mt = - self#gen_if_tag - mt.mt_name - (fst (Odoc_html.Naming.html_files mt.mt_name)) - mt.mt_info; - true - end - - class html : Html.html = - object (self) - inherit Html.html as html - - (** we have to hack a little because we cannot inherit from - scanner, since public method cannot be hidden and - our html class must respect the type of the default - html generator class *) - val mutable scanner = new scanner (new Html.html ) - - method! generate modules = - (* prevent having the 'todo' tag signaled as not handled *) - tag_functions <- ("todo", (fun _ -> "")) :: tag_functions; - (* generate doc as usual *) - html#generate modules; - (* then retrieve the todo tags and generate the todo.html page *) - let title = - match !Odoc_info.Global.title with - None -> "" - | Some s -> s - in - let b = Buffer.create 512 in - p b ""; - self#print_header b title ; - p b "

%s

" title; - scanner#scan_module_list modules; - Buffer.add_buffer b scanner#buffer; - let oc = open_out - (Filename.concat !Odoc_info.Global.target_dir "todo.html") - in - Buffer.output_buffer oc b; - close_out oc - - initializer - scanner <- new scanner self - end -end - -let _ = Odoc_args.set_generator - (Odoc_gen.Html (module Generator : Odoc_html.Html_generator)) diff --git a/ocamldoc/generators/odoc_todo.mli b/ocamldoc/generators/odoc_todo.mli deleted file mode 100644 index fce85d6600c..00000000000 --- a/ocamldoc/generators/odoc_todo.mli +++ /dev/null @@ -1,32 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Sebastien Hinderer, projet Cambium, INRIA Paris *) -(* *) -(* Copyright 2022 Institut National de Recherche en Informatique et *) -(* en Automatique. *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -(** An OCamldoc generator to retrieve information in "todo" tags and - generate an html page with all todo items. *) - -module Naming = Odoc_html.Naming -module Html : Odoc_html.Html_generator - -module Generator : - sig - class scanner : - < html_of_text : ?with_p:bool -> Buffer.t -> Odoc_info.text -> unit; - .. > -> - object - inherit Odoc_scan.scanner - method buffer : Buffer.t - end - class html : Html.html - end diff --git a/ocamldoc/odoc_args.ml b/ocamldoc/odoc_args.ml index cad9ae4a13e..8d61505931d 100644 --- a/ocamldoc/odoc_args.ml +++ b/ocamldoc/odoc_args.ml @@ -187,6 +187,7 @@ let anonymous f = module Options = Main_args.Make_ocamldoc_options(struct include Main_args.Default.Odoc_args let _I s = Odoc_global.include_dirs := s :: !Odoc_global.include_dirs + let _H s = Odoc_global.hidden_include_dirs := s :: !Odoc_global.hidden_include_dirs let _impl s = Odoc_global.files := !Odoc_global.files @ [Odoc_global.Impl_file s] let _intf s = Odoc_global.files := !Odoc_global.files @ [Odoc_global.Intf_file s] end) diff --git a/ocamldoc/odoc_global.ml b/ocamldoc/odoc_global.ml index 3bb1a67cd4a..221745438a0 100644 --- a/ocamldoc/odoc_global.ml +++ b/ocamldoc/odoc_global.ml @@ -24,6 +24,7 @@ type source_file = | Text_file of string let include_dirs = Clflags.include_dirs +let hidden_include_dirs = Clflags.hidden_include_dirs let errors = ref 0 diff --git a/ocamldoc/odoc_global.mli b/ocamldoc/odoc_global.mli index c85b453453b..1e3df3ec2ae 100644 --- a/ocamldoc/odoc_global.mli +++ b/ocamldoc/odoc_global.mli @@ -24,6 +24,9 @@ type source_file = (** The include_dirs in the OCaml compiler. *) val include_dirs : string list ref +(** The hidden_include_dirs in the OCaml compiler. *) +val hidden_include_dirs : string list ref + (** The merge options to be used. *) val merge_options : Odoc_types.merge_option list ref diff --git a/ocamldoc/odoc_info.ml b/ocamldoc/odoc_info.ml index d4a73fe1ed9..8a80224452f 100644 --- a/ocamldoc/odoc_info.ml +++ b/ocamldoc/odoc_info.ml @@ -111,6 +111,7 @@ module Module = Odoc_module let analyse_files ?(merge_options=([] : Odoc_types.merge_option list)) ?(include_dirs=([] : string list)) + ?(hidden_include_dirs=([] : string list)) ?(labels=false) ?(sort_modules=false) ?(no_stop=false) @@ -118,6 +119,7 @@ let analyse_files files = Odoc_global.merge_options := merge_options; Odoc_global.include_dirs := include_dirs; + Odoc_global.hidden_include_dirs := hidden_include_dirs; Odoc_global.classic := not labels; Odoc_global.sort_modules := sort_modules; Odoc_global.no_stop := no_stop; diff --git a/ocamldoc/odoc_info.mli b/ocamldoc/odoc_info.mli index da53554f892..bb4aa1d89e3 100644 --- a/ocamldoc/odoc_info.mli +++ b/ocamldoc/odoc_info.mli @@ -1082,12 +1082,13 @@ end val analyse_files : ?merge_options:Odoc_types.merge_option list -> ?include_dirs:string list -> - ?labels:bool -> - ?sort_modules:bool -> - ?no_stop:bool -> - ?init: Odoc_module.t_module list -> - Odoc_global.source_file list -> - Module.t_module list + ?hidden_include_dirs:string list -> + ?labels:bool -> + ?sort_modules:bool -> + ?no_stop:bool -> + ?init: Odoc_module.t_module list -> + Odoc_global.source_file list -> + Module.t_module list (** Dump of a list of modules into a file. @raise Failure if an error occurs.*) diff --git a/ocamldoc/odoc_lexer.mll b/ocamldoc/odoc_lexer.mll index bb41cb928b6..1055e465932 100644 --- a/ocamldoc/odoc_lexer.mll +++ b/ocamldoc/odoc_lexer.mll @@ -89,11 +89,16 @@ let remove_stars s = Str.global_replace (Str.regexp ("^"^blank^"*\\*")) "" s } +let blank = [ ' ' '\013' '\009' '\012'] +let nl_blank = blank | '\010' +let notblank = [^ ' ' '\010' '\013' '\009' '\012'] let lowercase = ['a'-'z' '\223'-'\246' '\248'-'\255' '_'] let uppercase = ['A'-'Z' '\192'-'\214' '\216'-'\222'] let identchar = ['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '\'' '0'-'9'] +let modident = uppercase identchar* ('.' uppercase identchar* )* + rule main = parse [' ' '\013' '\009' '\012'] + { @@ -280,7 +285,7 @@ and special_comment_part2 = parse } and elements = parse - | [' ' '\013' '\009' '\012'] + + | blank+ { Odoc_comments_global.nb_chars := !Odoc_comments_global.nb_chars + (String.length (Lexing.lexeme lexbuf)); elements lexbuf @@ -295,14 +300,18 @@ and elements = parse raise (Failure (Odoc_messages.should_escape_at_sign)) } + | "@param" nl_blank+ (identchar+ as id) nl_blank+ { T_PARAM id } + | "@param" { failwith "usage: @param id description"} + | "@before" nl_blank+ (notblank+ as v) nl_blank+ { T_BEFORE v } + | "@before" { failwith "usage: @before version description"} + | "@raise" nl_blank+ (modident as id) nl_blank+ { T_RAISES id } + | "@raise" { failwith "usage: @raise Exception description"} | "@"lowercase+ { let s = Lexing.lexeme lexbuf in Odoc_comments_global.nb_chars := !Odoc_comments_global.nb_chars + (String.length s); let s2 = String.sub s 1 ((String.length s) - 1) in match s2 with - "param" -> - T_PARAM | "author" -> T_AUTHOR | "version" -> @@ -311,12 +320,8 @@ and elements = parse T_SEE | "since" -> T_SINCE - | "before" -> - T_BEFORE | "deprecated" -> T_DEPRECATED - | "raise" -> - T_RAISES | "return" -> T_RETURN | s -> diff --git a/ocamldoc/odoc_parser.mly b/ocamldoc/odoc_parser.mly index da3280bad48..87ba19b8504 100644 --- a/ocamldoc/odoc_parser.mly +++ b/ocamldoc/odoc_parser.mly @@ -16,10 +16,6 @@ open Odoc_comments_global -let uppercase = "[A-Z\192-\214\216-\222]" -let identchar = - "[A-Za-z_\192-\214\216-\246\248-\255'0-9]" -let blank = "[ \010\013\009\012]" %} %token Description @@ -28,14 +24,14 @@ let blank = "[ \010\013\009\012]" %token See_file %token See_doc -%token T_PARAM +%token T_PARAM %token T_AUTHOR %token T_VERSION %token T_SEE %token T_SINCE -%token T_BEFORE +%token T_BEFORE %token T_DEPRECATED -%token T_RAISES +%token T_RAISES %token T_RETURN %token T_CUSTOM @@ -89,24 +85,7 @@ element: ; param: - T_PARAM Desc - { - (* isolate the identificator *) - (* we only look for simple id, no pattern nor tuples *) - let s = $2 in - match Str.split (Str.regexp (blank^"+")) s with - [] - | _ :: [] -> - raise (Failure "usage: @param id description") - | id :: _ -> - let reg = identchar^"+" in - if Str.string_match (Str.regexp reg) id 0 then - let remain = String.sub s (String.length id) ((String.length s) - (String.length id)) in - let remain2 = Str.replace_first (Str.regexp ("^"^blank^"+")) "" remain in - params := !params @ [(id, remain2)] - else - raise (Failure (id^" is not a valid parameter identificator in \"@param "^s^"\"")) - } + T_PARAM Desc { params := !params @ [($1, $2)] } ; author: T_AUTHOR Desc { authors := !authors @ [ $2 ] } @@ -121,41 +100,14 @@ since: T_SINCE Desc { since := Some $2 } ; before: - T_BEFORE Desc - { - (* isolate the version name *) - let s = $2 in - match Str.split (Str.regexp (blank^"+")) s with - [] - | _ :: [] -> - raise (Failure "usage: @before version description") - | id :: _ -> - let remain = String.sub s (String.length id) ((String.length s) - (String.length id)) in - let remain2 = Str.replace_first (Str.regexp ("^"^blank^"+")) "" remain in - before := !before @ [(id, remain2)] - } + T_BEFORE Desc { before := !before @ [($1, $2)] } ; deprecated: T_DEPRECATED Desc { deprecated := Some $2 } ; raise_exc: T_RAISES Desc - { - (* isolate the exception constructor name *) - let s = $2 in - match Str.split (Str.regexp (blank^"+")) s with - [] - | _ :: [] -> - raise (Failure "usage: @raise Exception description") - | id :: _ -> - let reg = uppercase^identchar^"*"^"\\(\\."^uppercase^identchar^"*\\)*" in - if Str.string_match (Str.regexp reg) id 0 then - let remain = String.sub s (String.length id) ((String.length s) - (String.length id)) in - let remain2 = Str.replace_first (Str.regexp ("^"^blank^"+")) "" remain in - raised_exceptions := !raised_exceptions @ [(id, remain2)] - else - raise (Failure (id^" is not a valid exception constructor in \"@raise "^s^"\"")) - } + { raised_exceptions := !raised_exceptions @ [($1, $2)] } ; return: T_RETURN Desc { return_value := Some $2 } diff --git a/ocamltest/main.ml b/ocamltest/main.ml index f0643e56b68..bc2a2c34adf 100644 --- a/ocamltest/main.ml +++ b/ocamltest/main.ml @@ -16,11 +16,12 @@ (* Main program of the ocamltest test driver *) open Ocamltest_stdlib +open Tsl_ast open Tsl_semantics type behavior = - | Skip_all_tests - | Run of Environments.t + | Skip_all + | Run (* this primitive announce should be used for tests that were aborted on system error before ocamltest @@ -29,6 +30,32 @@ let announce_test_error test_filename error = Printf.printf " ... testing '%s' => unexpected error (%s)\n%!" (Filename.basename test_filename) error +let print_exn loc e = + let open Printf in + let locstring = + if loc = Location.none then "" else begin + let file = loc.Location.loc_start.Lexing.pos_fname in + let line = loc.Location.loc_start.Lexing.pos_lnum in + sprintf "%s:%d: " file line + end + in + let msg = + match e with + | Variables.Variable_already_registered v -> + sprintf "Variable \"%s\" is already in the environment." v + | Variables.No_such_variable v -> + sprintf "Variable \"%s\" is not in the environment." v + | Environments.Modifiers_name_not_found name -> + sprintf "Environment modifier \"%s\" does not exist." name + | Tsl_semantics.No_such_test_or_action name -> + sprintf "This is not the name of a test or an action: \"%s\"." name + | Ocaml_actions.Cannot_compile_file_type t -> + sprintf "Cannot compile files of type %s." t + | _ -> + sprintf "Unexpected exception: %s" (Printexc.to_string e) + in + eprintf "\n%s%s\n%!" locstring msg + exception Syntax_error of Lexing.position let tsl_parse_file test_filename = @@ -57,6 +84,10 @@ let tsl_parse_file_safe test_filename = let print_usage () = Printf.printf "%s\n%!" Options.usage +let report_error loc e = + print_exn loc e; + "=> error in test script" + type result_summary = No_failure | Some_failure | All_skipped let join_result summary result = let open Result in @@ -73,31 +104,47 @@ let join_summaries sa sb = | All_skipped, All_skipped -> All_skipped | _ -> No_failure -let rec run_test log common_prefix path behavior = function - Node (testenvspec, test, env_modifiers, subtrees) -> - Printf.printf "%s %s (%s) %!" common_prefix path test.Tests.test_name; - let (msg, children_behavior, result) = match behavior with - | Skip_all_tests -> "=> n/a", Skip_all_tests, Result.skip - | Run env -> - let testenv0 = interpret_environment_statements env testenvspec in - let testenv = List.fold_left apply_modifiers testenv0 env_modifiers in - let (result, newenv) = Tests.run log testenv test in - let msg = Result.string_of_result result in - let children_behavior = - if Result.is_pass result then Run newenv else Skip_all_tests in - (msg, children_behavior, result) in - Printf.printf "%s\n%!" msg; - join_result - (run_test_trees log common_prefix path children_behavior subtrees) result - -and run_test_trees log common_prefix path behavior trees = - List.fold_left join_summaries All_skipped - (List.mapi (run_test_i log common_prefix path behavior) trees) - -and run_test_i log common_prefix path behavior i test_tree = - let path_prefix = if path="" then "" else path ^ "." in - let new_path = Printf.sprintf "%s%d" path_prefix (i+1) in - run_test log common_prefix new_path behavior test_tree +let rec run_test_tree log common_prefix behavior env summ ast = + match ast with + | Ast (Environment_statement s :: stmts, subs) -> + begin match interpret_environment_statement env s with + | env -> + run_test_tree log common_prefix behavior env summ (Ast (stmts, subs)) + | exception e -> + let line = s.loc.Location.loc_start.Lexing.pos_lnum in + Printf.printf "%s line %d %!" common_prefix line; + Printf.printf "%s\n%!" (report_error s.loc e); + Some_failure + end + | Ast (Test (_, name, mods) :: stmts, subs) -> + let locstr = + if name.loc = Location.none then + "default" + else + Printf.sprintf "line %d" name.loc.Location.loc_start.Lexing.pos_lnum + in + Printf.printf "%s %s (%s) %!" common_prefix locstr name.node; + let (msg, children_behavior, newenv, result) = + match behavior with + | Skip_all -> ("=> n/a", Skip_all, env, Result.skip) + | Run -> + begin try + let testenv = List.fold_left apply_modifiers env mods in + let test = lookup_test name in + let (result, newenv) = Tests.run log testenv test in + let msg = Result.string_of_result result in + let sub_behavior = if Result.is_pass result then Run else Skip_all in + (msg, sub_behavior, newenv, result) + with e -> (report_error name.loc e, Skip_all, env, Result.fail) + end + in + Printf.printf "%s\n%!" msg; + let newsumm = join_result summ result in + let newast = Ast (stmts, subs) in + run_test_tree log common_prefix children_behavior newenv newsumm newast + | Ast ([], subs) -> + List.fold_left join_summaries summ + (List.map (run_test_tree log common_prefix behavior env All_skipped) subs) let get_test_source_directory test_dirname = if (Filename.is_relative test_dirname) then @@ -118,18 +165,26 @@ let tests_to_skip = ref [] let init_tests_to_skip () = tests_to_skip := String.words (Sys.safe_getenv "OCAMLTEST_SKIP_TESTS") +let extract_rootenv (Ast (stmts, subs)) = + let (env, stmts) = split_env stmts in + (env, Ast (stmts, subs)) + let test_file test_filename = let start = if Options.show_timings then Unix.gettimeofday () else 0.0 in let skip_test = List.mem test_filename !tests_to_skip in let tsl_ast = tsl_parse_file_safe test_filename in - let (rootenv_statements, test_trees) = test_trees_of_tsl_ast tsl_ast in - let test_trees = match test_trees with - | [] -> + let (rootenv_statements, tsl_ast) = extract_rootenv tsl_ast in + let tsl_ast = match tsl_ast with + | Ast ([], []) -> let default_tests = Tests.default_tests() in - let make_tree test = Node ([], test, [], []) in - List.map make_tree default_tests - | _ -> test_trees in - let used_tests = tests_in_trees test_trees in + let make_tree test = + let id = make_identifier test.Tests.test_name in + Ast ([Test (0, id, [])], []) + in + Ast ([], List.map make_tree default_tests) + | _ -> tsl_ast + in + let used_tests = tests_in_tree tsl_ast in let used_actions = actions_in_tests used_tests in let action_names = let f act names = String.Set.add (Actions.name act) names in @@ -183,17 +238,32 @@ let test_file test_filename = Builtin_variables.promote, promote; Builtin_variables.timeout, default_timeout; ] in - let rootenv = - Environments.initialize Environments.Pre log initial_environment in - let rootenv = - interpret_environment_statements rootenv rootenv_statements in - let rootenv = Environments.initialize Environments.Post log rootenv in let common_prefix = " ... testing '" ^ test_basename ^ "' with" in - let initial_status = - if skip_test then Skip_all_tests else Run rootenv + let initial_status = if skip_test then Skip_all else Run in + let rootenv = + Environments.initialize Environments.Pre log initial_environment + in + let rootenv, initial_status = + let rec loop env stmts = + match stmts with + | [] -> (env, initial_status) + | s :: t -> + begin match interpret_environment_statement env s with + | env -> loop env t + | exception e -> + let line = s.loc.Location.loc_start.Lexing.pos_lnum in + Printf.printf "%s line %d %!" common_prefix line; + Printf.printf "%s\n%!" (report_error s.loc e); + (env, Skip_all) + end + in + loop rootenv rootenv_statements in + let rootenv = Environments.initialize Environments.Post log rootenv in let summary = - run_test_trees log common_prefix "" initial_status test_trees in + run_test_tree log common_prefix initial_status rootenv All_skipped + tsl_ast + in Actions.clear_all_hooks(); summary ) in diff --git a/ocamltest/ocaml_actions.ml b/ocamltest/ocaml_actions.ml index 714d9a5eed7..05262bcd89f 100644 --- a/ocamltest/ocaml_actions.ml +++ b/ocamltest/ocaml_actions.ml @@ -158,6 +158,8 @@ let generate_lexer = generate_module ocamllex let generate_parser = generate_module ocamlyacc +exception Cannot_compile_file_type of string + let prepare_module output_variable log env input = let input_type = snd input in let open Ocaml_filetypes in @@ -165,12 +167,12 @@ let prepare_module output_variable log env input = | Implementation | Interface | C | Obj -> [input] | Binary_interface -> [input] | Backend_specific _ -> [input] - | C_minus_minus -> assert false | Lexer -> generate_lexer output_variable input log env | Grammar -> generate_parser output_variable input log env - | Text -> assert false + | Text | C_minus_minus | Other _ -> + raise (Cannot_compile_file_type (string_of_filetype input_type)) let get_program_file backend env = let testfile = Actions_helpers.testfile env in diff --git a/ocamltest/ocaml_actions.mli b/ocamltest/ocaml_actions.mli index f392fe002b6..b28ea972f13 100644 --- a/ocamltest/ocaml_actions.mli +++ b/ocamltest/ocaml_actions.mli @@ -15,6 +15,8 @@ (* Actions specific to the OCaml compilers *) +exception Cannot_compile_file_type of string + val setup_ocamlc_byte_build_env : Actions.t val ocamlc_byte : Actions.t val check_ocamlc_byte_output : Actions.t diff --git a/ocamltest/ocaml_filetypes.ml b/ocamltest/ocaml_filetypes.ml index c399cf7cfd1..c4c75ec55a0 100644 --- a/ocamltest/ocaml_filetypes.ml +++ b/ocamltest/ocaml_filetypes.ml @@ -28,6 +28,7 @@ type t = | Obj | Backend_specific of Ocaml_backends.t * backend_specific | Text (* used by ocamldoc for text only documentation *) + | Other of string let string_of_backend_specific = function | Object -> "object" @@ -38,7 +39,7 @@ let string_of_filetype = function | Implementation -> "implementation" | Interface -> "interface" | C -> "C source file" - | C_minus_minus -> "C minus minus source file" + | C_minus_minus -> "C minus minus source" | Lexer -> "lexer" | Grammar -> "grammar" | Binary_interface -> "binary interface" @@ -47,6 +48,7 @@ let string_of_filetype = function ((Ocaml_backends.string_of_backend backend) ^ " " ^ (string_of_backend_specific filetype)) | Text -> "text" + | Other s -> Printf.sprintf "unknown (%s)" s let extension_of_filetype = function | Implementation -> "ml" @@ -67,6 +69,7 @@ let extension_of_filetype = function | (Ocaml_backends.Bytecode, Program) -> "byte" end | Text -> "txt" + | Other s -> s let filetype_of_extension = function | "ml" -> Implementation @@ -85,7 +88,7 @@ let filetype_of_extension = function | "cma" -> Backend_specific (Ocaml_backends.Bytecode, Library) | "byte" -> Backend_specific (Ocaml_backends.Bytecode, Program) | "txt" -> Text - | _ as e -> Printf.eprintf "Unknown file extension %s\n%!" e; exit 2 + | e -> Other e let split_filename name = let l = String.length name in diff --git a/ocamltest/ocaml_filetypes.mli b/ocamltest/ocaml_filetypes.mli index 542d13ae0c2..b8711cbdd03 100644 --- a/ocamltest/ocaml_filetypes.mli +++ b/ocamltest/ocaml_filetypes.mli @@ -28,6 +28,7 @@ type t = | Obj | Backend_specific of Ocaml_backends.t * backend_specific | Text (** text-only documentation file *) + | Other of string val string_of_filetype : t -> string diff --git a/ocamltest/tsl_ast.ml b/ocamltest/tsl_ast.ml index a3082828651..5ace9690112 100644 --- a/ocamltest/tsl_ast.ml +++ b/ocamltest/tsl_ast.ml @@ -37,6 +37,12 @@ type tsl_block = tsl_item list type t = Ast of tsl_item list * t list +let rec split_env l = + match l with + | Environment_statement env :: tl -> + let (env2, rest) = split_env tl in (env :: env2, rest) + | _ -> ([], l) + let make ?(loc = Location.none) foo = { node = foo; loc = loc } let make_identifier = make diff --git a/ocamltest/tsl_ast.mli b/ocamltest/tsl_ast.mli index 9b77255309e..a5c9602657d 100644 --- a/ocamltest/tsl_ast.mli +++ b/ocamltest/tsl_ast.mli @@ -38,6 +38,8 @@ type tsl_block = tsl_item list (* New syntax *) type t = Ast of tsl_item list * t list +val split_env : + tsl_item list -> environment_statement located list * tsl_item list val make_identifier : ?loc:Location.t -> string -> string located val make_string : ?loc:Location.t -> string -> string located diff --git a/ocamltest/tsl_semantics.ml b/ocamltest/tsl_semantics.ml index ee71bf47261..19522320a21 100644 --- a/ocamltest/tsl_semantics.ml +++ b/ocamltest/tsl_semantics.ml @@ -24,22 +24,10 @@ let string_of_location loc = Format.pp_print_flush fmt (); Buffer.contents buf -let no_such_variable loc name = - let locstr = string_of_location loc in - Printf.eprintf "%s\nNo such variable %s\n%!" locstr name; - exit 2 - -let no_such_modifiers loc name = - let locstr = string_of_location loc in - Printf.eprintf "%s\nNo such modifiers %s\n%!" locstr name; - exit 2 - let apply_modifiers env modifiers_name = let name = modifiers_name.node in let modifier = Environments.Include name in - try Environments.apply_modifier env modifier with - | Environments.Modifiers_name_not_found name -> - no_such_modifiers modifiers_name.loc name + Environments.apply_modifier env modifier let rec add_to_env decl loc variable_name value env = match (Variables.find_variable variable_name, decl) with @@ -54,7 +42,7 @@ let rec add_to_env decl loc variable_name value env = | (Some _, true) -> raise (Variables.Variable_already_registered variable_name) -let append_to_env loc variable_name value env = +let append_to_env variable_name value env = let variable = match Variables.find_variable variable_name with | None -> @@ -62,16 +50,13 @@ let append_to_env loc variable_name value env = | Some variable -> variable in - try - Environments.append variable value env - with Variables.No_such_variable name -> - no_such_variable loc name + Environments.append variable value env let interpret_environment_statement env statement = match statement.node with | Assignment (decl, var, value) -> add_to_env decl statement.loc var.node value.node env | Append (var, value) -> - append_to_env statement.loc var.node value.node env + append_to_env var.node value.node env | Include modifiers_name -> apply_modifiers env modifiers_name | Unset var -> @@ -82,9 +67,6 @@ let interpret_environment_statement env statement = match statement.node with in Environments.unsetenv var env -let interpret_environment_statements env l = - List.fold_left interpret_environment_statement env l - type test_tree = | Node of (Tsl_ast.environment_statement located list) * @@ -102,17 +84,14 @@ let unexpected_environment_statement s = Printf.eprintf "%s\nUnexpected environment statement\n%!" locstr; exit 2 -let no_such_test_or_action t = - let locstr = string_of_location t.loc in - Printf.eprintf "%s\nNo such test or action: %s\n%!" locstr t.node; - exit 2 +exception No_such_test_or_action of string let lookup_test located_name = let name = located_name.node in match Tests.lookup name with | None -> begin match Actions.lookup name with - | None -> no_such_test_or_action located_name + | None -> raise (No_such_test_or_action name) | Some action -> Tests.test_of_action action end @@ -161,14 +140,20 @@ let test_trees_of_tsl_block tsl_block = | (Environment_statement s)::_ -> unexpected_environment_statement s | _ -> assert false -let rec tests_in_tree_aux set = function Node (_, test, _, subtrees) -> - let set' = List.fold_left tests_in_tree_aux set subtrees in - Tests.TestSet.add test set' +let tests_in_stmt set stmt = + match stmt with + | Environment_statement _ -> set + | Test (_, name, _) -> + begin match lookup_test name with + | t -> Tests.TestSet.add t set + | exception No_such_test_or_action _ -> set + end -let tests_in_tree t = tests_in_tree_aux Tests.TestSet.empty t +let rec tests_in_tree_aux set (Tsl_ast.Ast (stmts, subs)) = + let set1 = List.fold_left tests_in_stmt set stmts in + List.fold_left tests_in_tree_aux set1 subs -let tests_in_trees subtrees = - List.fold_left tests_in_tree_aux Tests.TestSet.empty subtrees +let tests_in_tree t = tests_in_tree_aux Tests.TestSet.empty t let actions_in_test test = let add action_set action = Actions.ActionSet.add action action_set in @@ -179,30 +164,6 @@ let actions_in_tests tests = Actions.ActionSet.union (actions_in_test test) action_set in Tests.TestSet.fold f tests Actions.ActionSet.empty -let rec split_env l = - match l with - | Environment_statement env :: tl -> - let (env2, rest) = split_env tl in (env :: env2, rest) - | _ -> ([], l) - -let rec test_trees_of_tsl_ast (Ast (seq, subs)) = - let (env, rest) = split_env seq in - let trees = - match rest with - | [] -> List.map test_tree_of_tsl_ast subs - | [ Test (_, name, mods) ] -> - [Node ([], lookup_test name, mods, List.map test_tree_of_tsl_ast subs)] - | Test (_, name, mods) :: seq1 -> - let sub = test_tree_of_tsl_ast (Ast (seq1, subs)) in - [Node ([], lookup_test name, mods, [sub])] - | Environment_statement _ :: _ -> assert false - in (env, trees) - -and test_tree_of_tsl_ast ast = - match test_trees_of_tsl_ast ast with - | (env, [Node (env1, t, m, s)]) -> Node (env @ env1, t, m, s) - | (env, trees) -> Node (env, Tests.null, [], trees) - let rec ast_of_tree (Node (env, test, mods, subs)) = let tst = [Test (0, Tsl_ast.make_identifier test.Tests.test_name, mods)] in ast_of_tree_aux env tst subs diff --git a/ocamltest/tsl_semantics.mli b/ocamltest/tsl_semantics.mli index 385692f0a7f..be755e7feae 100644 --- a/ocamltest/tsl_semantics.mli +++ b/ocamltest/tsl_semantics.mli @@ -23,9 +23,8 @@ val interpret_environment_statement : Environments.t -> Tsl_ast.environment_statement Tsl_ast.located -> Environments.t -val interpret_environment_statements : - Environments.t -> Tsl_ast.environment_statement Tsl_ast.located list -> - Environments.t +exception No_such_test_or_action of string +val lookup_test : string located -> Tests.t type test_tree = | Node of @@ -38,21 +37,14 @@ val test_trees_of_tsl_block : Tsl_ast.tsl_item list -> Tsl_ast.environment_statement located list * test_tree list -val test_trees_of_tsl_ast : - Tsl_ast.t -> - Tsl_ast.environment_statement located list * test_tree list - val tsl_ast_of_test_trees : Tsl_ast.environment_statement located list * test_tree list -> Tsl_ast.t -val tests_in_tree : test_tree -> Tests.TestSet.t - -val tests_in_trees : test_tree list -> Tests.TestSet.t +val tests_in_tree : Tsl_ast.t -> Tests.TestSet.t val actions_in_test : Tests.t -> Actions.ActionSet.t val actions_in_tests : Tests.TestSet.t -> Actions.ActionSet.t - val print_tsl_ast : compact:bool -> out_channel -> Tsl_ast.t -> unit diff --git a/otherlibs/dynlink/Makefile b/otherlibs/dynlink/Makefile index cbd856dd752..ef8fc05d7a8 100644 --- a/otherlibs/dynlink/Makefile +++ b/otherlibs/dynlink/Makefile @@ -66,6 +66,7 @@ COMPILERLIBS_INTFS=\ parsing/asttypes.mli \ parsing/parsetree.mli \ typing/outcometree.mli \ + typing/value_rec_types.mli \ file_formats/cmo_format.mli \ file_formats/cmxs_format.mli @@ -93,12 +94,13 @@ COMPILERLIBS_SOURCES=\ parsing/docstrings.ml \ parsing/syntaxerr.ml \ parsing/ast_helper.ml \ + parsing/ast_iterator.ml \ + parsing/builtin_attributes.ml \ parsing/ast_mapper.ml \ parsing/camlinternalMenhirLib.ml \ parsing/parser.ml \ parsing/lexer.ml \ parsing/attr_helper.ml \ - parsing/builtin_attributes.ml \ typing/ident.ml \ typing/path.ml \ typing/primitive.ml \ @@ -112,6 +114,7 @@ COMPILERLIBS_SOURCES=\ file_formats/cmi_format.ml \ typing/persistent_env.ml \ typing/env.ml \ + typing/typedtree.ml \ lambda/debuginfo.ml \ lambda/lambda.ml \ lambda/runtimedef.ml \ diff --git a/otherlibs/dynlink/byte/dynlink.ml b/otherlibs/dynlink/byte/dynlink.ml index 2bac5d796b9..2efe38130f5 100644 --- a/otherlibs/dynlink/byte/dynlink.ml +++ b/otherlibs/dynlink/byte/dynlink.ml @@ -15,8 +15,6 @@ (* *) (**************************************************************************) -[@@@ocaml.warning "+a-4-30-40-41-42"] - open! Dynlink_compilerlibs module DC = Dynlink_common @@ -70,7 +68,7 @@ module Bytecode = struct let adapt_filename f = f let num_globals_inited () = - Misc.fatal_error "Should never be called for bytecode dynlink" + failwith "Should never be called for bytecode dynlink" let fold_initial_units ~init ~f = List.fold_left (fun acc (compunit, interface) -> @@ -99,13 +97,21 @@ module Bytecode = struct Fun.protect f ~finally:(fun () -> Mutex.unlock lock) + let really_input_bigarray ic ar st n = + match In_channel.really_input_bigarray ic ar st n with + | None -> raise End_of_file + | Some () -> () + let run lock (ic, file_name, file_digest) ~unit_header ~priv = - let open Misc in let clos = with_lock lock (fun () -> let old_state = Symtable.current_state () in let compunit : Cmo_format.compilation_unit = unit_header in seek_in ic compunit.cu_pos; - let code = LongString.input_bytes ic compunit.cu_codesize in + let code = + Bigarray.Array1.create Bigarray.Char Bigarray.c_layout + compunit.cu_codesize + in + really_input_bigarray ic code 0 compunit.cu_codesize; begin try Symtable.patch_object code compunit.cu_reloc; Symtable.check_global_initialized compunit.cu_reloc; diff --git a/otherlibs/dynlink/dynlink.mli b/otherlibs/dynlink/dynlink.mli index a9770a25ac4..a88c9190db1 100644 --- a/otherlibs/dynlink/dynlink.mli +++ b/otherlibs/dynlink/dynlink.mli @@ -17,8 +17,6 @@ (** Dynamic loading of .cmo, .cma and .cmxs files. *) -[@@@ocaml.warning "+a-4-30-40-41-42"] - val is_native : bool (** [true] if the program is native, [false] if the program is bytecode. *) diff --git a/otherlibs/dynlink/dynlink_common.ml b/otherlibs/dynlink/dynlink_common.ml index 85c4fb86806..a37a386345a 100644 --- a/otherlibs/dynlink/dynlink_common.ml +++ b/otherlibs/dynlink/dynlink_common.ml @@ -15,8 +15,6 @@ (* *) (**************************************************************************) -[@@@ocaml.warning "+a-4-30-40-41-42"] - open! Dynlink_compilerlibs module String = struct diff --git a/otherlibs/dynlink/dynlink_common.mli b/otherlibs/dynlink/dynlink_common.mli index c6f92d05cd1..c0b7d3ed120 100644 --- a/otherlibs/dynlink/dynlink_common.mli +++ b/otherlibs/dynlink/dynlink_common.mli @@ -15,8 +15,6 @@ (* *) (**************************************************************************) -[@@@ocaml.warning "+a-4-30-40-41-42"] - (** Construction of dynlink functionality given the platform-specific code. *) module Make (_ : Dynlink_platform_intf.S) : sig diff --git a/otherlibs/dynlink/dynlink_platform_intf.ml b/otherlibs/dynlink/dynlink_platform_intf.ml index 31189c35f21..6e63c2d0d1e 100644 --- a/otherlibs/dynlink/dynlink_platform_intf.ml +++ b/otherlibs/dynlink/dynlink_platform_intf.ml @@ -18,8 +18,6 @@ (** Interface for platform-specific dynlink providers. Note that this file needs to be a valid .mli file. *) -[@@@ocaml.warning "+a-4-30-40-41-42"] - module type S = sig type handle diff --git a/otherlibs/dynlink/dynlink_types.ml b/otherlibs/dynlink/dynlink_types.ml index 2a13ecefc60..9b690dcdc39 100644 --- a/otherlibs/dynlink/dynlink_types.ml +++ b/otherlibs/dynlink/dynlink_types.ml @@ -17,8 +17,6 @@ (** Types shared amongst the various parts of the dynlink code. *) -[@@@ocaml.warning "+a-4-30-40-41-42"] - type implem_state = | Loaded | Not_initialized diff --git a/otherlibs/dynlink/dynlink_types.mli b/otherlibs/dynlink/dynlink_types.mli index 6adf9b896d0..84276ced28e 100644 --- a/otherlibs/dynlink/dynlink_types.mli +++ b/otherlibs/dynlink/dynlink_types.mli @@ -17,8 +17,6 @@ (** Types shared amongst the various parts of the dynlink code. *) -[@@@ocaml.warning "+a-4-30-40-41-42"] - type implem_state = | Loaded | Not_initialized diff --git a/otherlibs/dynlink/native/dynlink.ml b/otherlibs/dynlink/native/dynlink.ml index ae902951ce3..050bb69e550 100644 --- a/otherlibs/dynlink/native/dynlink.ml +++ b/otherlibs/dynlink/native/dynlink.ml @@ -17,8 +17,6 @@ (* Dynamic loading of .cmx files *) -[@@@ocaml.warning "+a-4-30-40-41-42"] - open! Dynlink_compilerlibs module DC = Dynlink_common diff --git a/otherlibs/runtime_events/runtime_events.ml b/otherlibs/runtime_events/runtime_events.ml index b07b0c206ff..aae8c909947 100644 --- a/otherlibs/runtime_events/runtime_events.ml +++ b/otherlibs/runtime_events/runtime_events.ml @@ -72,6 +72,10 @@ type runtime_phase = | EV_MINOR_LOCAL_ROOTS_PROMOTE | EV_DOMAIN_CONDITION_WAIT | EV_DOMAIN_RESIZE_HEAP_RESERVATION +| EV_COMPACT +| EV_COMPACT_EVACUATE +| EV_COMPACT_FORWARD +| EV_COMPACT_RELEASE type lifecycle = EV_RING_START @@ -153,6 +157,10 @@ let runtime_phase_name phase = | EV_DOMAIN_CONDITION_WAIT -> "domain_condition_wait" | EV_MAJOR_FINISH_CYCLE -> "major_finish_cycle" | EV_DOMAIN_RESIZE_HEAP_RESERVATION -> "domain_resize_heap_reservation" + | EV_COMPACT -> "compaction" + | EV_COMPACT_EVACUATE -> "compaction_evacuate" + | EV_COMPACT_FORWARD -> "compaction_forward" + | EV_COMPACT_RELEASE -> "compaction_release" let lifecycle_name lifecycle = match lifecycle with @@ -297,9 +305,9 @@ module Callbacks = struct end -external start : unit -> unit = "caml_runtime_events_start" -external pause : unit -> unit = "caml_runtime_events_pause" -external resume : unit -> unit = "caml_runtime_events_resume" +external start : unit -> unit = "caml_ml_runtime_events_start" +external pause : unit -> unit = "caml_ml_runtime_events_pause" +external resume : unit -> unit = "caml_ml_runtime_events_resume" external create_cursor : (string * int) option -> cursor = "caml_ml_runtime_events_create_cursor" diff --git a/otherlibs/runtime_events/runtime_events.mli b/otherlibs/runtime_events/runtime_events.mli index dc13257907e..2e2c67a30b9 100644 --- a/otherlibs/runtime_events/runtime_events.mli +++ b/otherlibs/runtime_events/runtime_events.mli @@ -130,6 +130,10 @@ type runtime_phase = | EV_MINOR_LOCAL_ROOTS_PROMOTE | EV_DOMAIN_CONDITION_WAIT | EV_DOMAIN_RESIZE_HEAP_RESERVATION +| EV_COMPACT +| EV_COMPACT_EVACUATE +| EV_COMPACT_FORWARD +| EV_COMPACT_RELEASE (** Lifecycle events for the ring itself *) type lifecycle = diff --git a/otherlibs/systhreads/st_pthreads.h b/otherlibs/systhreads/st_pthreads.h index f5e8d44900f..f461988b541 100644 --- a/otherlibs/systhreads/st_pthreads.h +++ b/otherlibs/systhreads/st_pthreads.h @@ -22,7 +22,6 @@ #include #include #include -#include #ifdef HAS_UNISTD #include #endif diff --git a/otherlibs/systhreads/st_stubs.c b/otherlibs/systhreads/st_stubs.c index 1ed505645cd..430c2fe7d08 100644 --- a/otherlibs/systhreads/st_stubs.c +++ b/otherlibs/systhreads/st_stubs.c @@ -95,10 +95,6 @@ struct caml_thread_struct { struct caml_exception_context* external_raise; /* saved value of Caml_state->external_raise */ #endif - -#ifdef POSIX_SIGNALS - sigset_t init_mask; -#endif }; typedef struct caml_thread_struct* caml_thread_t; @@ -575,12 +571,6 @@ static void * caml_thread_start(void * v) restore_runtime_state(th); signal_stack = caml_init_signal_stack(); -#ifdef POSIX_SIGNALS - /* restore the signal mask from the spawning thread, now it is safe for the - signal handler to run (as Caml_state is initialised) */ - pthread_sigmask(SIG_SETMASK, &th->init_mask, NULL); -#endif - clos = Start_closure(Active_thread->descr); caml_modify(&(Start_closure(Active_thread->descr)), Val_unit); caml_callback_exn(clos, Val_unit); @@ -595,8 +585,8 @@ static int create_tick_thread(void) #ifdef POSIX_SIGNALS sigset_t mask, old_mask; - /* Block all signals so that we don't try to execute an OCaml signal - handler in the new tick thread */ + /* Block all signals, so that we do not try to execute a C signal + handler in the new tick thread. */ sigfillset(&mask); pthread_sigmask(SIG_BLOCK, &mask, &old_mask); #endif @@ -630,12 +620,6 @@ CAMLprim value caml_thread_new(value clos) Tick_thread_running = 1; } -#ifdef POSIX_SIGNALS - sigset_t mask, old_mask; - - sigfillset(&mask); - pthread_sigmask(SIG_BLOCK, &mask, &old_mask); -#endif /* Create a thread info block */ caml_thread_t th = caml_thread_new_info(); @@ -645,10 +629,6 @@ CAMLprim value caml_thread_new(value clos) th->descr = caml_thread_new_descriptor(clos); -#ifdef POSIX_SIGNALS - th->init_mask = old_mask; -#endif - th->next = Active_thread->next; th->prev = Active_thread; @@ -657,11 +637,6 @@ CAMLprim value caml_thread_new(value clos) err = st_thread_create(NULL, caml_thread_start, (void *) th); -#ifdef POSIX_SIGNALS - /* regardless of error, return our sigmask to the original state */ - pthread_sigmask(SIG_SETMASK, &old_mask, NULL); -#endif - if (err != 0) { /* Creation failed, remove thread info block from list of threads */ caml_thread_remove_and_free(th); @@ -771,17 +746,19 @@ CAMLprim value caml_thread_yield(value unit) if (st_masterlock_waiters(m) == 0) return Val_unit; - /* Do all the parts of a blocking section enter/leave except lock - manipulation, which we'll do more efficiently in st_thread_yield. (Since - our blocking section doesn't contain anything interesting, don't bother - with saving errno.) + /* Do all the parts of a blocking section enter&leave except lock + manipulation, which we will do more efficiently in + st_thread_yield, and asynchronous actions (since + [caml_thread_yield] must not raise). (Since our blocking section + does not contain anything interesting, do not bother saving + errno.) */ - caml_raise_if_exception(caml_process_pending_signals_exn()); save_runtime_state(); st_thread_yield(m); restore_runtime_state(This_thread); - caml_raise_if_exception(caml_process_pending_signals_exn()); + if (caml_check_pending_signals()) + caml_set_action_pending(Caml_state); return Val_unit; } diff --git a/otherlibs/unix/getcwd.c b/otherlibs/unix/getcwd.c index 1e93d119e38..32f8a60e00b 100644 --- a/otherlibs/unix/getcwd.c +++ b/otherlibs/unix/getcwd.c @@ -21,7 +21,7 @@ #include #include "unixsupport.h" -#if !defined (_WIN32) && !macintosh +#if !defined(_WIN32) #include #endif diff --git a/otherlibs/unix/gethost.c b/otherlibs/unix/gethost.c index 509abfa806f..e69a0a463b2 100644 --- a/otherlibs/unix/gethost.c +++ b/otherlibs/unix/gethost.c @@ -31,11 +31,6 @@ #define NETDB_BUFFER_SIZE 10000 -#ifdef _WIN32 -#define GETHOSTBYADDR_IS_REENTRANT 1 -#define GETHOSTBYNAME_IS_REENTRANT 1 -#endif - static value alloc_one_addr_4(char const *a) { return caml_alloc_initialized_string(4, a); @@ -101,7 +96,15 @@ CAMLprim value caml_unix_gethostbyaddr(value a) #if HAS_IPV6 } #endif -#if HAS_GETHOSTBYADDR_R == 7 +#if !defined(HAS_GETHOSTBYADDR_R) +#ifdef _WIN32 + caml_enter_blocking_section(); +#endif + hp = gethostbyaddr(adr, addr_len, addr_type); +#ifdef _WIN32 + caml_leave_blocking_section(); +#endif +#elif HAS_GETHOSTBYADDR_R == 7 struct hostent h; char buffer[NETDB_BUFFER_SIZE]; int h_errnop; @@ -118,14 +121,6 @@ CAMLprim value caml_unix_gethostbyaddr(value a) &h, buffer, sizeof(buffer), &hp, &h_errnop); caml_leave_blocking_section(); if (rc != 0) hp = NULL; -#else -#ifdef GETHOSTBYADDR_IS_REENTRANT - caml_enter_blocking_section(); -#endif - hp = gethostbyaddr(adr, addr_len, addr_type); -#ifdef GETHOSTBYADDR_IS_REENTRANT - caml_leave_blocking_section(); -#endif #endif if (hp == (struct hostent *) NULL) caml_raise_not_found(); return alloc_host_entry(hp); @@ -135,7 +130,7 @@ CAMLprim value caml_unix_gethostbyname(value name) { struct hostent * hp; char * hostname; -#if HAS_GETHOSTBYNAME_R +#ifdef HAS_GETHOSTBYNAME_R struct hostent h; char buffer[NETDB_BUFFER_SIZE]; int err; @@ -145,7 +140,15 @@ CAMLprim value caml_unix_gethostbyname(value name) hostname = caml_stat_strdup(String_val(name)); -#if HAS_GETHOSTBYNAME_R == 5 +#if !defined(HAS_GETHOSTBYNAME_R) +#ifdef _WIN32 + caml_enter_blocking_section(); +#endif + hp = gethostbyname(hostname); +#ifdef _WIN32 + caml_leave_blocking_section(); +#endif +#elif HAS_GETHOSTBYNAME_R == 5 { caml_enter_blocking_section(); hp = gethostbyname_r(hostname, &h, buffer, sizeof(buffer), &err); @@ -159,14 +162,6 @@ CAMLprim value caml_unix_gethostbyname(value name) caml_leave_blocking_section(); if (rc != 0) hp = NULL; } -#else -#ifdef GETHOSTBYNAME_IS_REENTRANT - caml_enter_blocking_section(); -#endif - hp = gethostbyname(hostname); -#ifdef GETHOSTBYNAME_IS_REENTRANT - caml_leave_blocking_section(); -#endif #endif caml_stat_free(hostname); diff --git a/otherlibs/unix/read_unix.c b/otherlibs/unix/read_unix.c index f1f3e9058a4..d4ec6e08880 100644 --- a/otherlibs/unix/read_unix.c +++ b/otherlibs/unix/read_unix.c @@ -48,7 +48,7 @@ CAMLprim value caml_unix_read_bigarray(value fd, value vbuf, ofs = Long_val(vofs); len = Long_val(vlen); caml_enter_blocking_section(); - ret = read(Int_val(fd), buf + ofs, len); + ret = read(Int_val(fd), (char *) buf + ofs, len); caml_leave_blocking_section(); if (ret == -1) caml_uerror("read_bigarray", Nothing); CAMLreturn(Val_long(ret)); diff --git a/otherlibs/unix/read_win32.c b/otherlibs/unix/read_win32.c index 981a6824031..ad26f1e76e1 100644 --- a/otherlibs/unix/read_win32.c +++ b/otherlibs/unix/read_win32.c @@ -78,7 +78,7 @@ CAMLprim value caml_unix_read_bigarray(value fd, value vbuf, SOCKET s = Socket_val(fd); if (len > INT_MAX) len = INT_MAX; caml_enter_blocking_section(); - ret = recv(s, buf + ofs, len, 0); + ret = recv(s, (char *)buf + ofs, len, 0); if (ret == SOCKET_ERROR) err = WSAGetLastError(); caml_leave_blocking_section(); numread = ret; @@ -86,7 +86,7 @@ CAMLprim value caml_unix_read_bigarray(value fd, value vbuf, HANDLE h = Handle_val(fd); if (len > 0xFFFFFFFF) len = 0xFFFFFFFF; caml_enter_blocking_section(); - if (! ReadFile(h, buf + ofs, len, &numread, NULL)) + if (! ReadFile(h, (char *)buf + ofs, len, &numread, NULL)) err = GetLastError(); caml_leave_blocking_section(); } diff --git a/otherlibs/unix/signals.c b/otherlibs/unix/signals.c index b9cc32040ec..a062a89651a 100644 --- a/otherlibs/unix/signals.c +++ b/otherlibs/unix/signals.c @@ -63,7 +63,7 @@ CAMLprim value caml_unix_sigprocmask(value vaction, value vset) how = sigprocmask_cmd[Int_val(vaction)]; decode_sigset(vset, &set); caml_enter_blocking_section(); - retcode = sigprocmask(how, &set, &oldset); + retcode = pthread_sigmask(how, &set, &oldset); caml_leave_blocking_section(); /* Run any handlers for just-unmasked pending signals */ caml_process_pending_actions(); diff --git a/otherlibs/unix/unixsupport.h b/otherlibs/unix/unixsupport.h index 575266284b1..5270f39271e 100644 --- a/otherlibs/unix/unixsupport.h +++ b/otherlibs/unix/unixsupport.h @@ -100,10 +100,10 @@ extern void caml_win32_maperr(DWORD errcode); extern value caml_unix_error_of_code (int errcode); extern int caml_unix_code_of_unix_error (value error); -extern CAMLnoret +CAMLnoret extern void caml_unix_error (int errcode, const char * cmdname, value arg); -extern CAMLnoret void caml_uerror (const char * cmdname, value arg); +CAMLnoret extern void caml_uerror (const char * cmdname, value arg); extern void caml_unix_check_path(value path, const char * cmdname); diff --git a/otherlibs/unix/write_unix.c b/otherlibs/unix/write_unix.c index ac9b91f1ee9..063f3422304 100644 --- a/otherlibs/unix/write_unix.c +++ b/otherlibs/unix/write_unix.c @@ -68,7 +68,7 @@ CAMLprim value caml_unix_write_bigarray(value fd, value vbuf, written = 0; caml_enter_blocking_section(); while (len > 0) { - ret = write(Int_val(fd), buf + ofs, len); + ret = write(Int_val(fd), (char *) buf + ofs, len); if (ret == -1) { if ((errno == EAGAIN || errno == EWOULDBLOCK) && written > 0) break; caml_leave_blocking_section(); diff --git a/otherlibs/unix/write_win32.c b/otherlibs/unix/write_win32.c index ce0f9a347ea..029ec233e8d 100644 --- a/otherlibs/unix/write_win32.c +++ b/otherlibs/unix/write_win32.c @@ -82,7 +82,7 @@ CAMLprim value caml_unix_write_bigarray(value fd, value vbuf, SOCKET s = Socket_val(fd); numbytes = len > INT_MAX ? INT_MAX : len; caml_enter_blocking_section(); - ret = send(s, buf + ofs, numbytes, 0); + ret = send(s, (char *)buf + ofs, numbytes, 0); if (ret == SOCKET_ERROR) err = WSAGetLastError(); caml_leave_blocking_section(); if (ret == SOCKET_ERROR && err == WSAEWOULDBLOCK && written > 0) break; @@ -91,7 +91,7 @@ CAMLprim value caml_unix_write_bigarray(value fd, value vbuf, HANDLE h = Handle_val(fd); DWORD numbytes = len > 0xFFFFFFFF ? 0xFFFFFFFF : len; caml_enter_blocking_section(); - if (! WriteFile(h, buf + ofs, numbytes, &numwritten, NULL)) + if (! WriteFile(h, (char *)buf + ofs, numbytes, &numwritten, NULL)) err = GetLastError(); caml_leave_blocking_section(); } diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index c51cb4fc1f6..bc18f41be4c 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -103,9 +103,9 @@ module Typ = struct Ptyp_object (List.map loop_object_field lst, o) | Ptyp_class (longident, lst) -> Ptyp_class (longident, List.map loop lst) - | Ptyp_alias(core_type, string) -> - check_variable var_names t.ptyp_loc string; - Ptyp_alias(loop core_type, string) + | Ptyp_alias(core_type, alias) -> + check_variable var_names alias.loc alias.txt; + Ptyp_alias(loop core_type, alias) | Ptyp_variant(row_field_list, flag, lbl_lst_option) -> Ptyp_variant(List.map loop_row_field row_field_list, flag, lbl_lst_option) diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 1a27d158def..7004144cbcd 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -77,7 +77,8 @@ module Typ : val object_: ?loc:loc -> ?attrs:attrs -> object_field list -> closed_flag -> core_type val class_: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type - val alias: ?loc:loc -> ?attrs:attrs -> core_type -> string -> core_type + val alias: ?loc:loc -> ?attrs:attrs -> core_type -> string with_loc + -> core_type val variant: ?loc:loc -> ?attrs:attrs -> row_field list -> closed_flag -> label list option -> core_type val poly: ?loc:loc -> ?attrs:attrs -> str list -> core_type -> core_type diff --git a/parsing/ast_invariants.ml b/parsing/ast_invariants.ml index 78ae2c73780..f69b6a45bb8 100644 --- a/parsing/ast_invariants.ml +++ b/parsing/ast_invariants.ml @@ -180,6 +180,14 @@ let iterator = "In object types, attaching attributes to inherited \ subtypes is not allowed." in + let attribute self attr = + (* The change to `self` here avoids registering attributes within attributes + for the purposes of warning 53, while keeping all the other invariant + checks for attribute payloads. See comment on [current_phase] in + [builtin_attributes.mli]. *) + super.attribute { self with attribute = super.attribute } attr; + Builtin_attributes.(register_attr Invariant_check attr.attr_name) + in { super with type_declaration ; typ @@ -195,6 +203,7 @@ let iterator = ; signature_item ; row_field ; object_field + ; attribute } let structure st = iterator.structure iterator st diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index 1076969953d..077c83ab1ca 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -147,7 +147,9 @@ module T = struct object_ ~loc ~attrs (List.map (object_field sub) l) o | Ptyp_class (lid, tl) -> class_ ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tl) - | Ptyp_alias (t, s) -> alias ~loc ~attrs (sub.typ sub t) s + | Ptyp_alias (t, s) -> + let s = map_loc sub s in + alias ~loc ~attrs (sub.typ sub t) s | Ptyp_variant (rl, b, ll) -> variant ~loc ~attrs (List.map (row_field sub) rl) b ll | Ptyp_poly (sl, t) -> poly ~loc ~attrs @@ -879,11 +881,16 @@ module PpxContext = struct } let make ~tool_name () = + let Load_path.{ visible; hidden } = Load_path.get_paths () in let fields = [ lid "tool_name", make_string tool_name; - lid "include_dirs", make_list make_string !Clflags.include_dirs; - lid "load_path", make_list make_string (Load_path.get_paths ()); + lid "include_dirs", make_list make_string (!Clflags.include_dirs); + lid "hidden_include_dirs", + make_list make_string (!Clflags.hidden_include_dirs); + lid "load_path", + make_pair (make_list make_string) (make_list make_string) + (visible, hidden); lid "open_modules", make_list make_string !Clflags.open_modules; lid "for_package", make_option make_string !Clflags.for_package; lid "debug", make_bool !Clflags.debug; @@ -952,6 +959,8 @@ module PpxContext = struct tool_name_ref := get_string payload | "include_dirs" -> Clflags.include_dirs := get_list get_string payload + | "hidden_include_dirs" -> + Clflags.hidden_include_dirs := get_list get_string payload | "load_path" -> (* Duplicates Compmisc.auto_include, since we can't reference Compmisc from this module. *) @@ -962,7 +971,10 @@ module PpxContext = struct let alert = Location.auto_include_alert in Load_path.auto_include_otherlibs alert find_in_dir fn in - Load_path.init ~auto_include (get_list get_string payload) + let visible, hidden = + get_pair (get_list get_string) (get_list get_string) payload + in + Load_path.init ~auto_include ~visible ~hidden | "open_modules" -> Clflags.open_modules := get_list get_string payload | "for_package" -> diff --git a/parsing/ast_mapper.mli b/parsing/ast_mapper.mli index 56e3349f843..7c74ef41061 100644 --- a/parsing/ast_mapper.mli +++ b/parsing/ast_mapper.mli @@ -122,8 +122,8 @@ val tool_name: unit -> string ["ocaml"], ... Some global variables that reflect command-line options are automatically synchronized between the calling tool and the ppx preprocessor: {!Clflags.include_dirs}, - {!Load_path}, {!Clflags.open_modules}, {!Clflags.for_package}, - {!Clflags.debug}. *) + {!Clflags.hidden_include_dirs}, {!Load_path}, {!Clflags.open_modules}, + {!Clflags.for_package}, {!Clflags.debug}. *) val apply: source:string -> target:string -> mapper -> unit diff --git a/parsing/attr_helper.ml b/parsing/attr_helper.ml index 8bb682a8750..390124199bc 100644 --- a/parsing/attr_helper.ml +++ b/parsing/attr_helper.ml @@ -24,8 +24,9 @@ type error = exception Error of Location.t * error -let get_no_payload_attribute alt_names attrs = - match List.filter (fun a -> List.mem a.attr_name.txt alt_names) attrs with +let get_no_payload_attribute nm attrs = + let actions = [(nm, Builtin_attributes.Return)] in + match Builtin_attributes.select_attributes actions attrs with | [] -> None | [ {attr_name = name; attr_payload = PStr []; attr_loc = _} ] -> Some name | [ {attr_name = name; _} ] -> diff --git a/parsing/attr_helper.mli b/parsing/attr_helper.mli index a3ddc0c9cbd..a94042a2900 100644 --- a/parsing/attr_helper.mli +++ b/parsing/attr_helper.mli @@ -27,14 +27,11 @@ type error = | Multiple_attributes of string | No_payload_expected of string -(** The [string list] argument of the following functions is a list of - alternative names for the attribute we are looking for. For instance: - - {[ - ["foo"; "ocaml.foo"] - ]} *) -val get_no_payload_attribute : string list -> attributes -> string loc option -val has_no_payload_attribute : string list -> attributes -> bool +(** The [string] argument of the following functions is the name of the + attribute we are looking for. If the argument is ["foo"], these functions + will find attributes with the name ["foo"] or ["ocaml.foo"] *) +val get_no_payload_attribute : string -> attributes -> string loc option +val has_no_payload_attribute : string -> attributes -> bool exception Error of Location.t * error diff --git a/parsing/builtin_attributes.ml b/parsing/builtin_attributes.ml index c90542567ad..9863d8a5693 100644 --- a/parsing/builtin_attributes.ml +++ b/parsing/builtin_attributes.ml @@ -15,6 +15,83 @@ open Asttypes open Parsetree +open Ast_helper + + +module Attribute_table = Hashtbl.Make (struct + type t = string with_loc + + let hash : t -> int = Hashtbl.hash + let equal : t -> t -> bool = (=) +end) +let unused_attrs = Attribute_table.create 128 +let mark_used t = Attribute_table.remove unused_attrs t + +(* [attr_order] is used to issue unused attribute warnings in the order the + attributes occur in the file rather than the random order of the hash table +*) +let attr_order a1 a2 = + match String.compare a1.loc.loc_start.pos_fname a2.loc.loc_start.pos_fname + with + | 0 -> Int.compare a1.loc.loc_start.pos_cnum a2.loc.loc_start.pos_cnum + | n -> n + +let warn_unused () = + let keys = List.of_seq (Attribute_table.to_seq_keys unused_attrs) in + let keys = List.sort attr_order keys in + List.iter (fun sloc -> + Location.prerr_warning sloc.loc (Warnings.Misplaced_attribute sloc.txt)) + keys + +(* These are the attributes that are tracked in the builtin_attrs table for + misplaced attribute warnings. *) +let builtin_attrs = + [ "alert" + ; "boxed" + ; "deprecated" + ; "deprecated_mutable" + ; "explicit_arity" + ; "immediate" + ; "immediate64" + ; "inline" + ; "inlined" + ; "noalloc" + ; "poll" + ; "ppwarning" + ; "specialise" + ; "specialised" + ; "tailcall" + ; "tail_mod_cons" + ; "unboxed" + ; "untagged" + ; "unrolled" + ; "warnerror" + ; "warning" + ; "warn_on_literal_pattern" + ] + +let builtin_attrs = + let tbl = Hashtbl.create 128 in + List.iter (fun attr -> Hashtbl.add tbl attr ()) builtin_attrs; + tbl + +let drop_ocaml_attr_prefix s = + let len = String.length s in + if String.starts_with ~prefix:"ocaml." s && len > 6 then + String.sub s 6 (len - 6) + else + s + +let is_builtin_attr s = Hashtbl.mem builtin_attrs (drop_ocaml_attr_prefix s) + +type current_phase = Parser | Invariant_check + +let register_attr current_phase name = + match current_phase with + | Parser when !Clflags.all_ppx <> [] -> () + | Parser | Invariant_check -> + if is_builtin_attr name.txt then + Attribute_table.replace unused_attrs name () let string_of_cst = function | Pconst_string(s, _, _) -> Some s @@ -67,6 +144,41 @@ let error_of_extension ext = | ({txt; loc}, _) -> Location.errorf ~loc "Uninterpreted extension '%s'." txt +let attr_equals_builtin {attr_name = {txt; _}; _} s = + (* Check for attribute s or ocaml.s. Avoid allocating a fresh string. *) + txt = s || + ( String.length txt = 6 + String.length s + && String.starts_with ~prefix:"ocaml." txt + && String.ends_with ~suffix:s txt) + +let mark_alert_used a = + if attr_equals_builtin a "deprecated" || attr_equals_builtin a "alert" + then mark_used a.attr_name + +let mark_alerts_used l = List.iter mark_alert_used l + +let mark_warn_on_literal_pattern_used l = + List.iter (fun a -> + if attr_equals_builtin a "warn_on_literal_pattern" + then mark_used a.attr_name) + l + +let mark_deprecated_mutable_used l = + List.iter (fun a -> + if attr_equals_builtin a "deprecated_mutable" + then mark_used a.attr_name) + l + +let mark_payload_attrs_used payload = + let iter = + { Ast_iterator.default_iterator + with attribute = fun self a -> + mark_used a.attr_name; + Ast_iterator.default_iterator.attribute self a + } + in + iter.payload iter payload + let kind_and_message = function | PStr[ {pstr_desc= @@ -87,15 +199,14 @@ let cat s1 s2 = if s2 = "" then s1 else s1 ^ "\n" ^ s2 let alert_attr x = - match x.attr_name.txt with - | "ocaml.deprecated"|"deprecated" -> - Some (x, "deprecated", string_of_opt_payload x.attr_payload) - | "ocaml.alert"|"alert" -> - begin match kind_and_message x.attr_payload with - | Some (kind, message) -> Some (x, kind, message) - | None -> None (* note: bad payloads detected by warning_attribute *) - end - | _ -> None + if attr_equals_builtin x "deprecated" then + Some (x, "deprecated", string_of_opt_payload x.attr_payload) + else if attr_equals_builtin x "alert" then + begin match kind_and_message x.attr_payload with + | Some (kind, message) -> Some (x, kind, message) + | None -> None (* note: bad payloads detected by warning_attribute *) + end + else None let alert_attrs l = List.filter_map alert_attr l @@ -128,9 +239,8 @@ let check_alerts_inclusion ~def ~use loc attrs1 attrs2 s = let rec deprecated_mutable_of_attrs = function | [] -> None - | {attr_name = {txt = "ocaml.deprecated_mutable"|"deprecated_mutable"; _}; - attr_payload = p} :: _ -> - Some (string_of_opt_payload p) + | attr :: _ when attr_equals_builtin attr "deprecated_mutable" -> + Some (string_of_opt_payload attr.attr_payload) | _ :: tl -> deprecated_mutable_of_attrs tl let check_deprecated_mutable loc attrs s = @@ -164,73 +274,67 @@ let rec attrs_of_str = function let alerts_of_str str = alerts_of_attrs (attrs_of_str str) -let check_no_alert attrs = - List.iter - (fun (a, _, _) -> - Location.prerr_warning a.attr_loc - (Warnings.Misplaced_attribute a.attr_name.txt) - ) - (alert_attrs attrs) - let warn_payload loc txt msg = Location.prerr_warning loc (Warnings.Attribute_payload (txt, msg)) let warning_attribute ?(ppwarning = true) = - let process loc txt errflag payload = + let process loc name errflag payload = + mark_used name; match string_of_payload payload with | Some s -> begin try Option.iter (Location.prerr_alert loc) (Warnings.parse_options errflag s) - with Arg.Bad msg -> warn_payload loc txt msg + with Arg.Bad msg -> warn_payload loc name.txt msg end | None -> - warn_payload loc txt "A single string literal is expected" + warn_payload loc name.txt "A single string literal is expected" in - let process_alert loc txt = function + let process_alert loc name = function | PStr[{pstr_desc= Pstr_eval( {pexp_desc=Pexp_constant(Pconst_string(s,_,_))}, _) }] -> - begin try Warnings.parse_alert_option s - with Arg.Bad msg -> warn_payload loc txt msg + begin + mark_used name; + try Warnings.parse_alert_option s + with Arg.Bad msg -> warn_payload loc name.txt msg end | k -> + (* Don't [mark_used] in the [Some] cases - that happens in [Env] or + [type_mod] if they are in a valid place. Do [mark_used] in the + [None] case, which is just malformed and covered by the "Invalid + payload" warning. *) match kind_and_message k with | Some ("all", _) -> - warn_payload loc txt "The alert name 'all' is reserved" + warn_payload loc name.txt "The alert name 'all' is reserved" | Some _ -> () - | None -> warn_payload loc txt "Invalid payload" + | None -> begin + mark_used name; + warn_payload loc name.txt "Invalid payload" + end in - function - | {attr_name = {txt = ("ocaml.warning"|"warning") as txt; _}; - attr_loc; - attr_payload; - } -> - process attr_loc txt false attr_payload - | {attr_name = {txt = ("ocaml.warnerror"|"warnerror") as txt; _}; - attr_loc; - attr_payload - } -> - process attr_loc txt true attr_payload - | {attr_name = {txt="ocaml.ppwarning"|"ppwarning"; _}; - attr_loc = _; - attr_payload = - PStr [ - { pstr_desc= - Pstr_eval({pexp_desc=Pexp_constant (Pconst_string (s, _, _))},_); - pstr_loc } - ]; - } when ppwarning -> - Location.prerr_warning pstr_loc (Warnings.Preprocessor s) - | {attr_name = {txt = ("ocaml.alert"|"alert") as txt; _}; - attr_loc; - attr_payload; - } -> - process_alert attr_loc txt attr_payload - | _ -> - () + fun ({attr_name; attr_loc; attr_payload} as attr) -> + if attr_equals_builtin attr "warning" then + process attr_loc attr_name false attr_payload + else if attr_equals_builtin attr "warnerror" then + process attr_loc attr_name true attr_payload + else if attr_equals_builtin attr "alert" then + process_alert attr_loc attr_name attr_payload + else if ppwarning && attr_equals_builtin attr "ppwarning" then + begin match attr_payload with + | PStr [{ pstr_desc= + Pstr_eval({pexp_desc=Pexp_constant + (Pconst_string (s, _, _))},_); + pstr_loc }] -> + (mark_used attr_name; + Location.prerr_warning pstr_loc (Warnings.Preprocessor s)) + | _ -> + (mark_used attr_name; + warn_payload attr_loc attr_name.txt + "A single string literal is expected") + end let warning_scope ?ppwarning attrs f = let prev = Warnings.backup () in @@ -243,34 +347,34 @@ let warning_scope ?ppwarning attrs f = Warnings.restore prev; raise exn - -let warn_on_literal_pattern = +let has_attribute nm attrs = List.exists - (fun a -> match a.attr_name.txt with - | "ocaml.warn_on_literal_pattern"|"warn_on_literal_pattern" -> true - | _ -> false - ) + (fun a -> + if attr_equals_builtin a nm + then (mark_used a.attr_name; true) + else false) + attrs -let explicit_arity = - List.exists - (fun a -> match a.attr_name.txt with - | "ocaml.explicit_arity"|"explicit_arity" -> true - | _ -> false - ) +type attr_action = Mark_used_only | Return +let select_attributes actions attrs = + List.filter (fun a -> + List.exists (fun (nm, action) -> + attr_equals_builtin a nm && + begin + mark_used a.attr_name; + action = Return + end) + actions + ) attrs -let immediate = - List.exists - (fun a -> match a.attr_name.txt with - | "ocaml.immediate"|"immediate" -> true - | _ -> false - ) +let warn_on_literal_pattern attrs = + has_attribute "warn_on_literal_pattern" attrs -let immediate64 = - List.exists - (fun a -> match a.attr_name.txt with - | "ocaml.immediate64"|"immediate64" -> true - | _ -> false - ) +let explicit_arity attrs = has_attribute "explicit_arity" attrs + +let immediate attrs = has_attribute "immediate" attrs + +let immediate64 attrs = has_attribute "immediate64" attrs (* The "ocaml.boxed (default)" and "ocaml.unboxed (default)" attributes cannot be input by the user, they are added by the @@ -279,11 +383,6 @@ let immediate64 = source file because the default can change between compiler invocations. *) -let check l a = List.mem a.attr_name.txt l - -let has_unboxed attr = - List.exists (check ["ocaml.unboxed"; "unboxed"]) - attr +let has_unboxed attrs = has_attribute "unboxed" attrs -let has_boxed attr = - List.exists (check ["ocaml.boxed"; "boxed"]) attr +let has_boxed attrs = has_attribute "boxed" attrs diff --git a/parsing/builtin_attributes.mli b/parsing/builtin_attributes.mli index 6200fd74ec5..e1d1de3654f 100644 --- a/parsing/builtin_attributes.mli +++ b/parsing/builtin_attributes.mli @@ -13,26 +13,103 @@ (* *) (**************************************************************************) -(** Support for some of the builtin attributes +(** Support for the builtin attributes: - - ocaml.deprecated - ocaml.alert - - ocaml.error - - ocaml.ppwarning - - ocaml.warning - - ocaml.warnerror - - ocaml.explicit_arity (for camlp4/camlp5) - - ocaml.warn_on_literal_pattern + - ocaml.boxed + - ocaml.deprecated - ocaml.deprecated_mutable + - ocaml.explicit_arity - ocaml.immediate - ocaml.immediate64 - - ocaml.boxed / ocaml.unboxed + - ocaml.inline + - ocaml.inlined + - ocaml.noalloc + - ocaml.poll + - ocaml.ppwarning + - ocaml.specialise + - ocaml.specialised + - ocaml.tailcall + - ocaml.tail_mod_cons + - ocaml.unboxed + - ocaml.untagged + - ocaml.unrolled + - ocaml.warnerror + - ocaml.warning + - ocaml.warn_on_literal_pattern {b Warning:} this module is unstable and part of {{!Compiler_libs}compiler-libs}. *) +(** {2 Attribute tracking for warning 53} *) + +(** [register_attr] must be called on the locations of all attributes that + should be tracked for the purpose of misplaced attribute warnings. In + particular, it should be called on all attributes that are present in the + source program except those that are contained in the payload of another + attribute (because these may be left behind by a ppx and intentionally + ignored by the compiler). + + The [current_phase] argument indicates when this function is being called + - either when an attribute is created in the parser or when we see an + attribute while running the check in the [Ast_invariants] module. This is + used to ensure that we track only attributes from the final version of the + parse tree: we skip adding attributes seen at parse time if we can see that + a ppx will be run later, because the [Ast_invariants] check is always run on + the result of a ppx. + + Note that the [Ast_invariants] check is also run on parse trees created from + marshalled ast files if no ppx is being used, ensuring we don't miss + attributes in that case. +*) +type current_phase = Parser | Invariant_check +val register_attr : current_phase -> string Location.loc -> unit + +(** Marks the attributes hiding in the payload of another attribute used, for + the purposes of misplaced attribute warnings (see comment on + [current_phase] above). In the parser, it's simplest to add these to + the table and remove them later, rather than threading through state + tracking whether we're in an attribute payload. *) +val mark_payload_attrs_used : Parsetree.payload -> unit + +(** Issue misplaced attribute warnings for all attributes created with + [mk_internal] but not yet marked used. *) +val warn_unused : unit -> unit + +(** {3 Warning 53 helpers for environment attributes} + + Some attributes, like deprecation markers, do not affect the compilation of + the definition on which they appear, but rather result in warnings on future + uses of that definition. This is implemented by moving the raw attributes + into the environment, where they will be noticed on future accesses. + + To make misplaced attribute warnings work appropriately for these + attributes, we mark them "used" when they are moved into the environment. + This is done with the helper functions in this section. +*) + +(** Marks the attribute used for the purposes of misplaced attribute warnings if + it is an alert. Call this when moving things allowed to have alert + attributes into the environment. *) +val mark_alert_used : Parsetree.attribute -> unit + +(** The same as [List.iter mark_alert_used]. *) +val mark_alerts_used : Parsetree.attributes -> unit + +(** Marks "warn_on_literal_pattern" attributes used for the purposes of + misplaced attribute warnings. Call this when moving constructors into the + environment. *) +val mark_warn_on_literal_pattern_used : Parsetree.attributes -> unit + +(** Marks "deprecated_mutable" attributes used for the purposes of misplaced + attribute warnings. Call this when moving labels of mutable fields into the + environment. *) +val mark_deprecated_mutable_used : Parsetree.attributes -> unit + +(** {2 Helpers for alert and warning attributes} *) + val check_alerts: Location.t -> Parsetree.attributes -> string -> unit val check_alerts_inclusion: def:Location.t -> use:Location.t -> Location.t -> Parsetree.attributes -> @@ -47,14 +124,12 @@ val check_deprecated_mutable_inclusion: def:Location.t -> use:Location.t -> Location.t -> Parsetree.attributes -> Parsetree.attributes -> string -> unit -val check_no_alert: Parsetree.attributes -> unit - val error_of_extension: Parsetree.extension -> Location.error val warning_attribute: ?ppwarning:bool -> Parsetree.attribute -> unit (** Apply warning settings from the specified attribute. - "ocaml.warning"/"ocaml.warnerror" (and variants without the prefix) - are processed and other attributes are ignored. + "ocaml.warning"/"ocaml.warnerror" (and variants without the prefix) are + processed and marked used for warning 53. Other attributes are ignored. Also implement ocaml.ppwarning (unless ~ppwarning:false is passed). @@ -73,10 +148,37 @@ val warning_scope: is executed. *) +(** {2 Helpers for searching for particular attributes} *) + +(** [has_attribute name attrs] is true if an attribute with name [name] or + ["ocaml." ^ name] is present in [attrs]. It marks that attribute used for + the purposes of misplaced attribute warnings. *) +val has_attribute : string -> Parsetree.attributes -> bool + +(** [select_attributes actions attrs] finds the elements of [attrs] that appear + in [actions] and either returns them or just marks them used, according to + the corresponding [attr_action]. + + Each element [(nm, action)] of the [actions] list is an attribute along with + an [attr_action] specifying what to do with that attribute. The action is + used to accomodate different compiler configurations. If an attribute is + used only in some compiler configurations, it's important that we still look + for it and mark it used when compiling with other configurations. + Otherwise, we would issue spurious misplaced attribute warnings. *) +type attr_action = Mark_used_only | Return +val select_attributes : + (string * attr_action) list -> Parsetree.attributes -> Parsetree.attributes + +(** [attr_equals_builtin attr s] is true if the name of the attribute is [s] or + ["ocaml." ^ s]. This is useful for manually inspecting attribute names, but + note that doing so will not result in marking the attribute used for the + purpose of warning 53, so it is usually preferrable to use [has_attribute] + or [select_attributes]. *) +val attr_equals_builtin : Parsetree.attribute -> string -> bool + val warn_on_literal_pattern: Parsetree.attributes -> bool val explicit_arity: Parsetree.attributes -> bool - val immediate: Parsetree.attributes -> bool val immediate64: Parsetree.attributes -> bool diff --git a/parsing/depend.ml b/parsing/depend.ml index c054f513423..7d76e6fc92a 100644 --- a/parsing/depend.ml +++ b/parsing/depend.ml @@ -52,8 +52,6 @@ let rec lookup_map lid m = | Ldot (l, s) -> String.Map.find s (get_map (lookup_map l m)) | Lapply _ -> raise Not_found -(* Collect free module identifiers in the a.s.t. *) - let free_structure_names = ref String.Set.empty let add_names s = diff --git a/parsing/depend.mli b/parsing/depend.mli index 74c095f969e..745cc722c7b 100644 --- a/parsing/depend.mli +++ b/parsing/depend.mli @@ -28,9 +28,10 @@ val make_leaf : string -> map_tree val make_node : bound_map -> map_tree val weaken_map : String.Set.t -> map_tree -> map_tree +(** Collect free module identifiers in the a.s.t. *) val free_structure_names : String.Set.t ref -(** dependencies found by preprocessing tools *) +(** Dependencies found by preprocessing tools. *) val pp_deps : string list ref val open_module : bound_map -> Longident.t -> bound_map diff --git a/parsing/lexer.mll b/parsing/lexer.mll index 9b248b368d5..df87f9a3c37 100644 --- a/parsing/lexer.mll +++ b/parsing/lexer.mll @@ -107,7 +107,34 @@ let get_stored_string () = Buffer.contents string_buffer let store_string_char c = Buffer.add_char string_buffer c let store_string_utf_8_uchar u = Buffer.add_utf_8_uchar string_buffer u let store_string s = Buffer.add_string string_buffer s +let store_substring s ~pos ~len = Buffer.add_substring string_buffer s pos len + let store_lexeme lexbuf = store_string (Lexing.lexeme lexbuf) +let store_normalized_newline newline = + (* #12502: we normalize "\r\n" to "\n" at lexing time, + to avoid behavior difference due to OS-specific + newline characters in string literals. + + (For example, Git for Windows will translate \n in versioned + files into \r\n sequences when checking out files on Windows. If + your code contains multiline quoted string literals, the raw + content of the string literal would be different between Git for + Windows users and all other users. Thanks to newline + normalization, the value of the literal as a string constant will + be the same no matter which programming tools are used.) + + Many programming languages use the same approach, for example + Java, Javascript, Kotlin, Python, Swift and C++. + *) + (* Our 'newline' regexp accepts \r*\n, but we only wish + to normalize \r?\n into \n -- see the discussion in #12502. + All carriage returns except for the (optional) last one + are reproduced in the output. We implement this by skipping + the first carriage return, if any. *) + let len = String.length newline in + if len = 1 + then store_string_char '\n' + else store_substring newline ~pos:1 ~len:(len - 1) (* To store the position of the beginning of a string and comment *) let string_start_loc = ref Location.none @@ -659,9 +686,11 @@ and comment = parse comment lexbuf } | "\'\'" { store_lexeme lexbuf; comment lexbuf } - | "\'" newline "\'" + | "\'" (newline as nl) "\'" { update_loc lexbuf None 1 false 1; - store_lexeme lexbuf; + store_string_char '\''; + store_normalized_newline nl; + store_string_char '\''; comment lexbuf } | "\'" [^ '\\' '\'' '\010' '\013' ] "\'" @@ -682,9 +711,9 @@ and comment = parse comment_start_loc := []; error_loc loc (Unterminated_comment start) } - | newline + | newline as nl { update_loc lexbuf None 1 false 0; - store_lexeme lexbuf; + store_normalized_newline nl; comment lexbuf } | ident @@ -695,9 +724,13 @@ and comment = parse and string = parse '\"' { lexbuf.lex_start_p } - | '\\' newline ([' ' '\t'] * as space) + | '\\' (newline as nl) ([' ' '\t'] * as space) { update_loc lexbuf None 1 false (String.length space); - if in_comment () then store_lexeme lexbuf; + if in_comment () then begin + store_string_char '\\'; + store_normalized_newline nl; + store_string space; + end; string lexbuf } | '\\' (['\\' '\'' '\"' 'n' 't' 'b' 'r' ' '] as c) @@ -726,11 +759,9 @@ and string = parse store_lexeme lexbuf; string lexbuf } - | newline - { if not (in_comment ()) then - Location.prerr_warning (Location.curr lexbuf) Warnings.Eol_in_string; - update_loc lexbuf None 1 false 0; - store_lexeme lexbuf; + | newline as nl + { update_loc lexbuf None 1 false 0; + store_normalized_newline nl; string lexbuf } | eof @@ -741,9 +772,9 @@ and string = parse string lexbuf } and quoted_string delim = parse - | newline + | newline as nl { update_loc lexbuf None 1 false 0; - store_lexeme lexbuf; + store_normalized_newline nl; quoted_string delim lexbuf } | eof diff --git a/parsing/parser.mly b/parsing/parser.mly index 8f9bb6870ea..f5908b2ebd5 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -167,6 +167,10 @@ let mkuplus ~oploc name arg = | _ -> Pexp_apply(mkoperator ~loc:oploc ("~" ^ name), [Nolabel, arg]) +let mk_attr ~loc name payload = + Builtin_attributes.(register_attr Parser name); + Attr.mk ~loc name payload + (* TODO define an abstraction boundary between locations-as-pairs and locations-as-Location.t; it should be clear when we move from one world to the other *) @@ -3409,8 +3413,8 @@ with_type_binder: /* Polymorphic types */ %inline typevar: - QUOTE mkrhs(ident) - { $2 } + QUOTE ident + { mkrhs $2 $sloc } ; %inline typevar_list: nonempty_llist(typevar) @@ -3464,7 +3468,7 @@ alias_type: function_type { $1 } | mktyp( - ty = alias_type AS QUOTE tyvar = ident + ty = alias_type AS tyvar = typevar { Ptyp_alias(ty, tyvar) } ) { $1 } @@ -4037,17 +4041,17 @@ attr_id: ) { $1 } ; attribute: - LBRACKETAT attr_id payload RBRACKET - { Attr.mk ~loc:(make_loc $sloc) $2 $3 } + LBRACKETAT attr_id attr_payload RBRACKET + { mk_attr ~loc:(make_loc $sloc) $2 $3 } ; post_item_attribute: - LBRACKETATAT attr_id payload RBRACKET - { Attr.mk ~loc:(make_loc $sloc) $2 $3 } + LBRACKETATAT attr_id attr_payload RBRACKET + { mk_attr ~loc:(make_loc $sloc) $2 $3 } ; floating_attribute: - LBRACKETATATAT attr_id payload RBRACKET + LBRACKETATATAT attr_id attr_payload RBRACKET { mark_symbol_docs $sloc; - Attr.mk ~loc:(make_loc $sloc) $2 $3 } + mk_attr ~loc:(make_loc $sloc) $2 $3 } ; %inline post_item_attributes: post_item_attribute* @@ -4087,4 +4091,10 @@ payload: | QUESTION pattern { PPat ($2, None) } | QUESTION pattern WHEN seq_expr { PPat ($2, Some $4) } ; +attr_payload: + payload + { Builtin_attributes.mark_payload_attrs_used $1; + $1 + } +; %% diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 7d372a230cb..2f0a40c26c5 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -121,7 +121,7 @@ and core_type_desc = - [T #tconstr] when [l=[T]], - [(T1, ..., Tn) #tconstr] when [l=[T1 ; ... ; Tn]]. *) - | Ptyp_alias of core_type * string (** [T as 'a]. *) + | Ptyp_alias of core_type * string loc (** [T as 'a]. *) | Ptyp_variant of row_field list * closed_flag * label list option (** [Ptyp_variant([`A;`B], flag, labels)] represents: - [[ `A|`B ]] diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 5edc0710dee..d7fea80a7c8 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -317,7 +317,7 @@ and core_type ctxt f x = pp f "@[<2>%a@;->@;%a@]" (* FIXME remove parens later *) (type_with_label ctxt) (l,ct1) (core_type ctxt) ct2 | Ptyp_alias (ct, s) -> - pp f "@[<2>%a@;as@;%a@]" (core_type1 ctxt) ct tyvar s + pp f "@[<2>%a@;as@;%a@]" (core_type1 ctxt) ct tyvar s.txt | Ptyp_poly ([], ct) -> core_type ctxt f ct | Ptyp_poly (sl, ct) -> diff --git a/parsing/printast.ml b/parsing/printast.ml index 597677cc01b..2f5702e7d28 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -172,7 +172,7 @@ let rec core_type i ppf x = line i ppf "Ptyp_class %a\n" fmt_longident_loc li; list i core_type ppf l | Ptyp_alias (ct, s) -> - line i ppf "Ptyp_alias \"%s\"\n" s; + line i ppf "Ptyp_alias \"%s\"\n" s.txt; core_type i ppf ct; | Ptyp_poly (sl, ct) -> line i ppf "Ptyp_poly%a\n" typevars sl; diff --git a/parsing/unit_info.ml b/parsing/unit_info.ml index 70d5cf363b3..b2e081a221d 100644 --- a/parsing/unit_info.ml +++ b/parsing/unit_info.ml @@ -114,6 +114,6 @@ let mli_from_source u = let is_cmi f = Filename.check_suffix (Artifact.filename f) ".cmi" let find_normalized_cmi f = - let filename = prefix f ^ ".cmi" in + let filename = modname f ^ ".cmi" in let filename = Load_path.find_normalized filename in { Artifact.filename; modname = modname f; source_file = Some f.source_file } diff --git a/runtime/amd64.S b/runtime/amd64.S index 38731b19cab..e0bcffbb54a 100644 --- a/runtime/amd64.S +++ b/runtime/amd64.S @@ -569,7 +569,8 @@ G(caml_system__code_begin): #define TSAN_SAVE_CALLER_REGS #endif -/* Undo TSAN_SAVE_CALLER_REGS. Expects gc_regs bucket in %r15 */ +/* Restore registers saved by TSAN_SAVE_CALLER_REGS. Expects gc_regs bucket in + %r15 */ #ifdef WITH_THREAD_SANITIZER #define TSAN_RESTORE_CALLER_REGS \ /* Restore %rax, freeing up the next ptr slot */ \ @@ -684,6 +685,31 @@ ENDFUNCTION(G(caml_allocN)) /* Call a C function from OCaml */ /******************************************************************************/ +/* Update [young_limit] when returning from non-noalloc extern calls. + Here is C code that can be used to generate RET_FROM_C_CALL for a + new back-end. + + #include + #include + + typedef struct { _Atomic(uint64_t) young_limit; + _Bool action_pending; } caml_domain_state; + + void ret_from_c_call(caml_domain_state *dom_st) + { + if (__builtin_expect(dom_st->action_pending, 0)) + atomic_store_explicit(&dom_st->young_limit, (uint64_t)-1, + memory_order_relaxed); + } + +*/ +#define RET_FROM_C_CALL \ + cmpb $0, Caml_state(action_pending); \ + jne 1f; \ + ret; \ +1: movq $-1, Caml_state(young_limit); \ + ret + FUNCTION(G(caml_c_call)) CFI_STARTPROC CFI_SIGNAL_FRAME @@ -706,6 +732,7 @@ LBL(caml_c_call): /* Load ocaml stack and restore global variables */ SWITCH_C_TO_OCAML #ifdef WITH_THREAD_SANITIZER + /* Save non-callee-saved registers %rax and %xmm0 before C call */ pushq %rax; CFI_ADJUST(8); subq $16, %rsp; CFI_ADJUST(16); movupd %xmm0, (%rsp) @@ -716,7 +743,7 @@ LBL(caml_c_call): #endif LEAVE_FUNCTION /* Return to OCaml caller */ - ret + RET_FROM_C_CALL CFI_ENDPROC ENDFUNCTION(G(caml_c_call)) @@ -764,7 +791,7 @@ LBL(106): SWITCH_C_TO_OCAML /* Return to OCaml caller */ LEAVE_FUNCTION - ret + RET_FROM_C_CALL CFI_ENDPROC ENDFUNCTION(G(caml_c_call_stack_args)) @@ -778,9 +805,10 @@ CFI_STARTPROC /* Save callee-save registers */ PUSH_CALLEE_SAVE_REGS #if defined(WITH_THREAD_SANITIZER) - /* TSan enter function from C */ - pushq C_ARG_1 - movq 56(%rsp), C_ARG_1 + /* We can't use the TSAN_ENTER_FUNCTION macro as it assumes an OCaml stack, + and we are on a C stack. */ + pushq C_ARG_1 /* Save C_ARG_1 before C call */ + movq 56(%rsp), C_ARG_1 /* Read return address */ C_call (GCALL(__tsan_func_entry)) popq C_ARG_1 #endif @@ -857,8 +885,9 @@ LBL(108): movq %r10, Caml_state(c_stack) addq $SIZEOF_C_STACK_LINK, %rsp; CFI_ADJUST(-SIZEOF_C_STACK_LINK) #if defined(WITH_THREAD_SANITIZER) - /* TSan exit function from C */ - pushq %rax + /* We can't use the TSAN_EXIT_FUNCTION macro as it assumes an OCaml stack, + and we are on a C stack. */ + pushq %rax /* Save %rax before C call */ movq $0, C_ARG_1 C_call (GCALL(__tsan_func_exit)) popq %rax @@ -887,74 +916,55 @@ FUNCTION(G(caml_raise_exn)) CFI_STARTPROC ENTER_FUNCTION LBL(caml_raise_exn): -#if !defined(WITH_THREAD_SANITIZER) testq $1, Caml_state(backtrace_active) jne LBL(116) RESTORE_EXN_HANDLER_OCAML ret -#endif LBL(116): movq $0, Caml_state(backtrace_pos) LBL(117): movq %rsp, %r13 /* Save OCaml stack pointer */ movq %rax, %r12 /* Save exception bucket */ movq Caml_state(c_stack), %rsp -#if defined(WITH_THREAD_SANITIZER) - testq $1, Caml_state(backtrace_active) - je LBL(118) -#endif - movq %rax, C_ARG_1 /* arg 1: exception bucket */ -#ifdef WITH_FRAME_POINTERS - movq 8(%r13), C_ARG_2 /* arg 2: pc of raise */ - leaq 16(%r13), C_ARG_3 /* arg 3: sp at raise */ -#else - movq (%r13), C_ARG_2 /* arg 2: pc of raise */ - leaq 8(%r13), C_ARG_3 /* arg 3: sp at raise */ -#endif - movq Caml_state(exn_handler), C_ARG_4 - /* arg 4: sp of handler */ + movq %rax, C_ARG_1 /* arg 1: exception bucket */ + movq STACK_RETADDR(%r13), C_ARG_2 /* arg 2: pc of raise */ + leaq STACK_ARG_1(%r13), C_ARG_3 /* arg 3: sp at raise */ + movq Caml_state(exn_handler), C_ARG_4 /* arg 4: sp of handler */ C_call (GCALL(caml_stash_backtrace)) -#if defined(WITH_THREAD_SANITIZER) -LBL(118): - movq STACK_RETADDR(%r13), C_ARG_1 /* arg 1: pc of raise */ - leaq STACK_ARG_1(%r13), C_ARG_2 /* arg 2: sp at raise */ - movq Caml_state(exn_handler), C_ARG_3 /* arg 3: sp of handler */ - C_call (GCALL(caml_tsan_exit_on_raise)) -#endif movq %r12, %rax /* Recover exception bucket */ RESTORE_EXN_HANDLER_OCAML ret CFI_ENDPROC ENDFUNCTION(G(caml_raise_exn)) -/* Exception raising routine called in case of Raise_notrace when TSan - is enabled. Does not store a backtrace but still signals function - exits to TSan. */ #if defined(WITH_THREAD_SANITIZER) -FUNCTION(G(caml_tsan_raise_notrace_exn)) +/* When TSan support is enabled, this routine should be called just before + raising an exception. It calls __tsan_func_exit for every OCaml frame about + to be exited due to the exception. + Takes no arguments, clobbers C_ARG_1, C_ARG_2, C_ARG_3 and potentially all + caller-saved registers of the C calling convention. */ +FUNCTION(G(caml_tsan_exit_on_raise_asm)) CFI_STARTPROC ENTER_FUNCTION - movq %rsp, %r13 /* Save OCaml stack pointer */ - movq %rax, %r12 /* Save exception bucket */ - movq Caml_state(c_stack), %rsp - jmp LBL(118) + movq STACK_RETADDR(%rsp), C_ARG_1 /* arg 1: pc of raise */ + leaq STACK_ARG_1(%rsp), C_ARG_2 /* arg 2: sp at raise */ + movq Caml_state(exn_handler), C_ARG_3 /* arg 3: sp of handler */ + SWITCH_OCAML_TO_C + C_call (GCALL(caml_tsan_exit_on_raise)) + SWITCH_C_TO_OCAML + LEAVE_FUNCTION + ret CFI_ENDPROC -ENDFUNCTION(G(caml_tsan_raise_notrace_exn)) +ENDFUNCTION(G(caml_tsan_exit_on_raise_asm)) #endif FUNCTION(G(caml_reraise_exn)) CFI_STARTPROC ENTER_FUNCTION -#if defined(WITH_THREAD_SANITIZER) - /* Signals function exits to TSan (implemented in caml_raise_exn) even - if backtraces are not enabled */ - jmp LBL(117) -#else testq $1, Caml_state(backtrace_active) jne LBL(117) RESTORE_EXN_HANDLER_OCAML ret -#endif CFI_ENDPROC ENDFUNCTION(G(caml_reraise_exn)) @@ -970,6 +980,18 @@ CFI_STARTPROC /* Discard the C stack pointer and reset to ocaml stack */ movq Caml_state(current_stack), %r10 movq Stack_sp(%r10), %rsp /* FIXME: CFI */ +#if defined(WITH_THREAD_SANITIZER) + /* Call __tsan_func_exit for every OCaml stack frame exited due to the + exception */ + movq STACK_RETADDR(%rsp), C_ARG_1 /* arg 1: pc of raise */ + leaq STACK_ARG_1(%rsp), C_ARG_2 /* arg 2: sp at raise */ + movq Caml_state(exn_handler), C_ARG_3 /* arg 3: sp of handler */ + pushq %rax + SWITCH_OCAML_TO_C + C_call (GCALL(caml_tsan_exit_on_raise)) + SWITCH_C_TO_OCAML + popq %rax +#endif jmp LBL(caml_raise_exn) CFI_ENDPROC ENDFUNCTION(G(caml_raise_exception)) @@ -981,11 +1003,12 @@ ENDFUNCTION(G(caml_raise_exception)) FUNCTION(G(caml_callback_asm)) CFI_STARTPROC #if defined(WITH_THREAD_SANITIZER) - /* TSan enter function from C */ + /* Save non-callee-saved registers C_ARG_1, C_ARG_2, C_ARG_3 before C call + */ pushq C_ARG_1 pushq C_ARG_2 pushq C_ARG_3 - movq 24(%rsp), C_ARG_1 + movq 24(%rsp), C_ARG_1 /* Read return address */ C_call (GCALL(__tsan_func_entry)) popq C_ARG_3 popq C_ARG_2 @@ -1007,11 +1030,12 @@ ENDFUNCTION(G(caml_callback_asm)) FUNCTION(G(caml_callback2_asm)) CFI_STARTPROC #if defined(WITH_THREAD_SANITIZER) - /* TSan enter function from C */ + /* Save non-callee-saved registers C_ARG_1, C_ARG_2, C_ARG_3 before C call + */ pushq C_ARG_1 pushq C_ARG_2 pushq C_ARG_3 - movq 24(%rsp), C_ARG_1 + movq 24(%rsp), C_ARG_1 /* Read return address */ C_call (GCALL(__tsan_func_entry)) popq C_ARG_3 popq C_ARG_2 @@ -1033,11 +1057,12 @@ ENDFUNCTION(G(caml_callback2_asm)) FUNCTION(G(caml_callback3_asm)) CFI_STARTPROC #if defined(WITH_THREAD_SANITIZER) - /* TSan enter function from C */ + /* Save non-callee-saved registers C_ARG_1, C_ARG_2, C_ARG_3 before C call + */ pushq C_ARG_1 pushq C_ARG_2 pushq C_ARG_3 - movq 24(%rsp), C_ARG_1 + movq 24(%rsp), C_ARG_1 /* Read return address */ C_call (GCALL(__tsan_func_entry)) popq C_ARG_3 popq C_ARG_2 @@ -1074,19 +1099,39 @@ CFI_STARTPROC leaq 1(%rsi), %rdi /* %rdi (last_fiber) := Val_ptr(old stack) */ movq %rdi, 0(%rbx) /* Initialise continuation */ LBL(do_perform): - /* %rsi: old stack */ - movq Stack_handler(%rsi), %r11 /* %r11 := old stack -> handler */ - movq Handler_parent(%r11), %r10 /* %r10 := parent stack */ - cmpq $0, %r10 /* parent is NULL? */ - je LBL(112) + /* %rdi: last_fiber + %rsi: old stack */ #if defined(WITH_THREAD_SANITIZER) + /* Signal to TSan all stack frames exited by the perform. */ + ENTER_FUNCTION TSAN_SAVE_CALLER_REGS - movq (%rsp), C_ARG_1 /* arg 1: pc of perform */ - leaq 8(%rsp), C_ARG_2 /* arg 2: sp at perform */ + movq STACK_RETADDR(%rsp), C_ARG_1 /* arg 1: pc of perform */ + leaq STACK_ARG_1(%rsp), C_ARG_2 /* arg 2: sp at perform */ SWITCH_OCAML_TO_C C_call (GCALL(caml_tsan_exit_on_perform)) SWITCH_C_TO_OCAML TSAN_RESTORE_CALLER_REGS + LEAVE_FUNCTION +#endif + movq Stack_handler(%rsi), %r11 /* %r11 := old stack -> handler */ + movq Handler_parent(%r11), %r10 /* %r10 := parent stack */ + cmpq $0, %r10 /* parent is NULL? */ + je LBL(112) +#if defined(WITH_THREAD_SANITIZER) + /* Save non-callee-saved registers %rax, %rdi, %rsi, %r10, %r11 before C + call */ + pushq %rax; CFI_ADJUST(8); + pushq %rdi; CFI_ADJUST(8); + pushq %rsi; CFI_ADJUST(8); + pushq %r10; CFI_ADJUST(8); + pushq %r11; CFI_ADJUST(8); + /* Match the TSan-enter made from caml_runstack */ + TSAN_EXIT_FUNCTION + popq %r11; CFI_ADJUST(-8); + popq %r10; CFI_ADJUST(-8); + popq %rsi; CFI_ADJUST(-8); + popq %rdi; CFI_ADJUST(-8); + popq %rax; CFI_ADJUST(-8); #endif SWITCH_OCAML_STACKS /* preserves r11 and rsi */ /* We have to null the Handler_parent after the switch because the @@ -1102,15 +1147,18 @@ LBL(112): movq Caml_state(current_stack), %rsi SWITCH_OCAML_STACKS /* No parent stack. Raise Effect.Unhandled. */ + ENTER_FUNCTION #if defined(WITH_THREAD_SANITIZER) /* We must let the TSan runtime know that we switched back to the original performer stack. For that, we perform the necessary calls - to __tsan_func_entry via caml_tsan_entry_on_resume. */ + to __tsan_func_entry via caml_tsan_entry_on_resume. + Note that from TSan's point of view, we just exited all stack + frames, including those of the main fiber. This is ok, because we + re-enter them immediately via caml_tsan_entry_on_resume below. */ TSAN_SAVE_CALLER_REGS - movq Stack_sp(%r10), %r11 - movq (%r11), C_ARG_1 /* arg 1: pc of perform */ - leaq 8(%r11), C_ARG_2 /* arg 2: sp at perform */ - movq %r10, C_ARG_3 /* arg 3: fiber */ + movq STACK_RETADDR(%rsp), C_ARG_1 /* arg 1: pc of perform */ + leaq STACK_ARG_1(%rsp), C_ARG_2 /* arg 2: sp at perform */ + movq %r10, C_ARG_3 /* arg 3: performer stack */ SWITCH_OCAML_TO_C C_call (GCALL(caml_tsan_entry_on_resume)) SWITCH_C_TO_OCAML @@ -1148,20 +1196,25 @@ CFI_STARTPROC testq %r10, %r10 jz 2f #if defined(WITH_THREAD_SANITIZER) + /* Save non-callee-saved registers %rax and %r10 before C call */ + ENTER_FUNCTION pushq %rax; CFI_ADJUST(8); pushq %r10; CFI_ADJUST(8); + /* Necessary to include the caller of caml_resume in the TSan backtrace */ TSAN_ENTER_FUNCTION(16) popq %r10; CFI_ADJUST(-8); popq %rax; CFI_ADJUST(-8); TSAN_SAVE_CALLER_REGS + /* Signal to TSan all stack frames exited by the perform. */ movq Stack_sp(%r10), %r11 - movq (%r11), C_ARG_1 /* arg 1: pc of perform */ - leaq 8(%r11), C_ARG_2 /* arg 2: sp at perform */ - movq %r10, C_ARG_3 /* arg 3: fiber */ + movq STACK_RETADDR(%r11), C_ARG_1 /* arg 1: pc of perform */ + leaq STACK_ARG_1(%r11), C_ARG_2 /* arg 2: sp at perform */ + movq %r10, C_ARG_3 /* arg 3: fiber */ SWITCH_OCAML_TO_C C_call (GCALL(caml_tsan_entry_on_resume)) SWITCH_C_TO_OCAML TSAN_RESTORE_CALLER_REGS + LEAVE_FUNCTION #endif /* Find end of list of stacks and add current */ movq %r10, %rsi @@ -1177,7 +1230,9 @@ CFI_STARTPROC UPDATE_BASE_POINTER(%rcx) SWITCH_OCAML_STACKS jmp *(%rbx) -2: TSAN_ENTER_FUNCTION(0) +2: ENTER_FUNCTION + TSAN_ENTER_FUNCTION(0) /* Necessary to include the caller of caml_resume + in the TSan backtrace */ LEA_VAR(caml_raise_continuation_already_resumed, %rax) jmp LBL(caml_c_call) CFI_ENDPROC @@ -1190,8 +1245,10 @@ CFI_STARTPROC CFI_SIGNAL_FRAME ENTER_FUNCTION #ifdef WITH_THREAD_SANITIZER + /* Save non-callee-saved registers %rax and %rdi before C call */ pushq %rax; CFI_ADJUST(8); pushq %rdi; CFI_ADJUST(8); + /* Necessary to include the caller of caml_runstack in TSan backtrace */ TSAN_ENTER_FUNCTION(16) popq %rdi; CFI_ADJUST(-8); popq %rax; CFI_ADJUST(-8); @@ -1252,6 +1309,7 @@ LBL(frame_runstack): /* switch directly to parent stack with correct return */ movq %r13, %rsp CFI_RESTORE_STATE + /* signal to TSan that we exit caml_runstack (no registers to save here) */ TSAN_EXIT_FUNCTION movq %r12, %rax /* Invoke handle_value (or handle_exn) */ @@ -1267,6 +1325,7 @@ ENDFUNCTION(G(caml_runstack)) FUNCTION(G(caml_ml_array_bound_error)) CFI_STARTPROC ENTER_FUNCTION + /* No registers require saving before C call to TSan */ TSAN_ENTER_FUNCTION(0) LEA_VAR(caml_array_bound_error_asm, %rax) jmp LBL(caml_c_call) diff --git a/runtime/amd64nt.asm b/runtime/amd64nt.asm index fea922e8a98..f7ac3082188 100644 --- a/runtime/amd64nt.asm +++ b/runtime/amd64nt.asm @@ -25,9 +25,27 @@ EXTRN caml_apply3: NEAR EXTRN caml_program: NEAR EXTRN caml_array_bound_error_asm: NEAR - EXTRN caml_stash_backtrace: NEAR + EXTRN caml_stash_backtrace: NEAR -INCLUDE domain_state64.inc +; Load caml/domain_state.tbl (via domain_state.inc, to remove C-style comments) + domain_curr_field = 0 +DOMAIN_STATE MACRO _type:REQ, name:REQ + domain_field_caml_&name EQU domain_curr_field + domain_curr_field = domain_curr_field + 1 + ; Returning a value turns DOMAIN_STATE into a macro function, which + ; causes the bracketed parameters to be both required and correctly + ; parsed. Returning an empty string allows this to be used as though + ; it were a macro procedure. + EXITM <> +ENDM + +INCLUDE domain_state.inc + +; Caml_state(field) expands to the address of field in Caml_state, which is +; always stored in r14. +Caml_state MACRO field:REQ + EXITM @CatStr(<[r14+>, %(domain_field_caml_&field), <*8]>) +ENDM .CODE @@ -43,16 +61,16 @@ caml_system__code_begin: caml_call_gc: ; Record lowest stack address and return address mov r11, [rsp] - Store_last_return_address r11 + mov Caml_state(last_return_address), r11 lea r11, [rsp+8] - Store_bottom_of_stack r11 + mov Caml_state(bottom_of_stack), r11 ; Touch the stack to trigger a recoverable segfault ; if insufficient space remains sub rsp, 01000h mov [rsp], r11 add rsp, 01000h ; Save young_ptr - Store_young_ptr r15 + mov Caml_state(young_ptr), r15 ; Build array of registers, save it into Caml_state(gc_regs) push rbp push r11 @@ -67,7 +85,7 @@ caml_call_gc: push rdi push rbx push rax - Store_gc_regs rsp + mov Caml_state(gc_regs), rsp ; Save floating-point registers sub rsp, 16*8 movsd QWORD PTR [rsp + 0*8], xmm0 @@ -122,7 +140,7 @@ caml_call_gc: pop r11 pop rbp ; Restore Caml_state(young_ptr) - Load_young_ptr r15 + mov r15, Caml_state(young_ptr) ; Return to caller ret @@ -130,7 +148,7 @@ caml_call_gc: ALIGN 16 caml_alloc1: sub r15, 16 - Cmp_young_limit r15 + cmp r15, Caml_state(young_limit) jb caml_call_gc ret @@ -138,7 +156,7 @@ caml_alloc1: ALIGN 16 caml_alloc2: sub r15, 24 - Cmp_young_limit r15 + cmp r15, Caml_state(young_limit) jb caml_call_gc ret @@ -146,14 +164,14 @@ caml_alloc2: ALIGN 16 caml_alloc3: sub r15, 32 - Cmp_young_limit r15 + cmp r15, Caml_state(young_limit) jb caml_call_gc ret PUBLIC caml_allocN ALIGN 16 caml_allocN: - Cmp_young_limit r15 + cmp r15, Caml_state(young_limit) jb caml_call_gc ret @@ -164,19 +182,19 @@ caml_allocN: caml_c_call: ; Record lowest stack address and return address pop r12 - Store_last_return_address r12 - Store_bottom_of_stack rsp + mov Caml_state(last_return_address), r12 + mov Caml_state(bottom_of_stack), rsp ; Touch the stack to trigger a recoverable segfault ; if insufficient space remains sub rsp, 01000h mov [rsp], rax add rsp, 01000h ; Make the alloc ptr available to the C code - Store_young_ptr r15 + mov Caml_state(young_ptr), r15 ; Call the function (address in rax) call rax ; Reload alloc ptr - Load_young_ptr r15 + mov r15, Caml_state(young_ptr) ; Return to caller push r12 ret @@ -214,29 +232,29 @@ caml_start_program: L106: ; Build a callback link sub rsp, 8 ; stack 16-aligned - Push_gc_regs - Push_last_return_address - Push_bottom_of_stack + push Caml_state(gc_regs) + push Caml_state(last_return_address) + push Caml_state(bottom_of_stack) ; Setup alloc ptr - Load_young_ptr r15 + mov r15, Caml_state(young_ptr) ; Build an exception handler lea r13, L108 push r13 - Push_exception_pointer - Store_exception_pointer rsp + push Caml_state(exception_pointer) + mov Caml_state(exception_pointer), rsp ; Call the OCaml code call r12 L107: ; Pop the exception handler - Pop_exception_pointer + pop Caml_state(exception_pointer) pop r12 ; dummy register L109: ; Update alloc ptr - Store_young_ptr r15 + mov Caml_state(young_ptr), r15 ; Pop the callback restoring, link the global variables - Pop_bottom_of_stack - Pop_last_return_address - Pop_gc_regs + pop Caml_state(bottom_of_stack) + pop Caml_state(last_return_address) + pop Caml_state(gc_regs) add rsp, 8 ; Restore callee-save registers. movapd xmm6, OWORD PTR [rsp + 0*16] @@ -271,55 +289,55 @@ L108: PUBLIC caml_raise_exn ALIGN 16 caml_raise_exn: - Load_backtrace_active r11 + mov r11, Caml_state(backtrace_active) test r11, 1 jne L110 - Load_exception_pointer rsp ; Cut stack + mov rsp, Caml_state(exception_pointer) ; Cut stack ; Recover previous exception handler - Pop_exception_pointer + pop Caml_state(exception_pointer) ret ; Branch to handler L110: - mov r12, rax ; Save exception bucket in r12 - mov rcx, rax ; Arg 1: exception bucket - mov rdx, [rsp] ; Arg 2: PC of raise - lea r8, [rsp+8] ; Arg 3: SP of raise - Load_exception_pointer r9 ; Arg 4: SP of handler - sub rsp, 32 ; Reserve 32 bytes on stack + mov r12, rax ; Save exception bucket + mov rcx, rax ; Arg 1: exception bucket + mov rdx, [rsp] ; Arg 2: PC of raise + lea r8, [rsp+8] ; Arg 3: SP of raise + mov r9, Caml_state(exception_pointer) ; Arg 4: SP of handler + sub rsp, 32 ; Reserve 32 bytes on stack call caml_stash_backtrace - mov rax, r12 ; Recover exception bucket - Load_exception_pointer rsp ; Cut stack + mov rax, r12 ; Recover exception bucket + mov rsp, Caml_state(exception_pointer) ; Cut stack ; Recover previous exception handler - Pop_exception_pointer - ret ; Branch to handler + pop Caml_state(exception_pointer) + ret ; Branch to handler ; Raise an exception from C PUBLIC caml_raise_exception ALIGN 16 caml_raise_exception: - mov r14, rcx ; First argument is Caml_state - Load_backtrace_active r11 + mov r14, rcx ; First arg is Caml_state + mov r11, Caml_state(backtrace_active) test r11, 1 jne L112 - mov rax, rdx ; Second argument is exn bucket - Load_exception_pointer rsp + mov rax, rdx ; Second arg is exn bucket + mov rsp, Caml_state(exception_pointer) ; Recover previous exception handler - Pop_exception_pointer - Load_young_ptr r15 ; Reload alloc ptr + pop Caml_state(exception_pointer) + mov r15, Caml_state(young_ptr) ; Reload alloc ptr ret L112: - mov r12, rdx ; Save exception bucket in r12 - mov rcx, rdx ; Arg 1: exception bucket - Load_last_return_address rdx ; Arg 2: PC of raise - Load_bottom_of_stack r8 ; Arg 3: SP of raise - Load_exception_pointer r9 ; Arg 4: SP of handler - sub rsp, 32 ; Reserve 32 bytes on stack + mov r12, rdx ; Save exception bucket + mov rcx, rdx ; Arg 1: exception bucket + mov rdx, Caml_state(last_return_address) ; Arg 2: PC of raise + mov r8, Caml_state(bottom_of_stack) ; Arg 3: SP of raise + mov r9, Caml_state(exception_pointer) ; Arg 4: SP of handler + sub rsp, 32 ; Reserve 32 bytes on stack call caml_stash_backtrace - mov rax, r12 ; Recover exception bucket - Load_exception_pointer rsp + mov rax, r12 ; Recover exception bucket + mov rsp, Caml_state(exception_pointer) ; Recover previous exception handler - Pop_exception_pointer - Load_young_ptr r15; Reload alloc ptr + pop Caml_state(exception_pointer) + mov r15, Caml_state(young_ptr) ; Reload alloc ptr ret ; Callback from C to OCaml diff --git a/runtime/arm64.S b/runtime/arm64.S index 20d866846e9..0c4cf501765 100644 --- a/runtime/arm64.S +++ b/runtime/arm64.S @@ -417,6 +417,15 @@ FUNCTION(caml_allocN) /* Call a C function from OCaml */ /* Function to call is in ADDITIONAL_ARG */ +.macro RET_FROM_C_CALL + ldrb w16, Caml_state(action_pending) + cbnz w16, 1f + ret +1: mov TMP, #-1 + str TMP, Caml_state(young_limit) + ret +.endm + FUNCTION(caml_c_call) CFI_STARTPROC CFI_OFFSET(29, -16) @@ -437,9 +446,9 @@ FUNCTION(caml_c_call) SWITCH_C_TO_OCAML /* Return */ ldp x29, x30, [sp], 16 - ret + RET_FROM_C_CALL CFI_ENDPROC - END_FUNCTION(caml_c_call) +END_FUNCTION(caml_c_call) FUNCTION(caml_c_call_stack_args) CFI_STARTPROC @@ -478,8 +487,9 @@ FUNCTION(caml_c_call_stack_args) SWITCH_C_TO_OCAML /* Return */ ldp x29, x30, [sp], 16 - ret -CFI_ENDPROC + RET_FROM_C_CALL + CFI_ENDPROC +END_FUNCTION(caml_c_call_stack_args) /* Start the OCaml program */ diff --git a/runtime/bigarray.c b/runtime/bigarray.c index ffea5947feb..948f212f215 100644 --- a/runtime/bigarray.c +++ b/runtime/bigarray.c @@ -225,7 +225,7 @@ CAMLexport value caml_ba_alloc(int flags, int num_dims, void * data, intnat * dim) { uintnat num_elts, asize, size; - int i, is_managed; + int i, uses_resources; value res; struct caml_ba_array * b; intnat dimcopy[CAML_BA_MAX_NUM_DIMS]; @@ -248,8 +248,10 @@ caml_ba_alloc(int flags, int num_dims, void * data, intnat * dim) flags |= CAML_BA_MANAGED; } asize = SIZEOF_BA_ARRAY + num_dims * sizeof(intnat); - is_managed = ((flags & CAML_BA_MANAGED_MASK) == CAML_BA_MANAGED); - res = caml_alloc_custom_mem(&caml_ba_ops, asize, is_managed ? size : 0); + uses_resources = + ((flags & CAML_BA_MANAGED_MASK) == CAML_BA_MANAGED) + && !(flags & CAML_BA_SUBARRAY); + res = caml_alloc_custom_mem(&caml_ba_ops, asize, uses_resources ? size : 0); b = Caml_ba_array_val(res); b->data = data; b->num_dims = num_dims; @@ -1133,7 +1135,8 @@ CAMLprim value caml_ba_slice(value vb, value vind) (char *) b->data + offset * caml_ba_element_size[b->flags & CAML_BA_KIND_MASK]; /* Allocate an OCaml bigarray to hold the result */ - res = caml_ba_alloc(b->flags, b->num_dims - num_inds, sub_data, sub_dims); + res = caml_ba_alloc(b->flags | CAML_BA_SUBARRAY, + b->num_dims - num_inds, sub_data, sub_dims); /* Copy the finalization function from the original array (PR#8568) */ Custom_ops_val(res) = Custom_ops_val(vb); /* Create or update proxy in case of managed bigarray */ @@ -1160,7 +1163,8 @@ CAMLprim value caml_ba_change_layout(value vb, value vlayout) intnat new_dim[CAML_BA_MAX_NUM_DIMS]; unsigned int i; for(i = 0; i < b->num_dims; i++) new_dim[i] = b->dim[b->num_dims - i - 1]; - res = caml_ba_alloc(flags, b->num_dims, b->data, new_dim); + res = caml_ba_alloc(flags | CAML_BA_SUBARRAY, + b->num_dims, b->data, new_dim); /* Copy the finalization function from the original array (PR#8568) */ Custom_ops_val(res) = Custom_ops_val(vb); caml_ba_update_proxy(b, Caml_ba_array_val(res)); @@ -1205,7 +1209,8 @@ CAMLprim value caml_ba_sub(value vb, value vofs, value vlen) (char *) b->data + ofs * mul * caml_ba_element_size[b->flags & CAML_BA_KIND_MASK]; /* Allocate an OCaml bigarray to hold the result */ - res = caml_ba_alloc(b->flags, b->num_dims, sub_data, b->dim); + res = caml_ba_alloc(b->flags | CAML_BA_SUBARRAY, + b->num_dims, sub_data, b->dim); /* Copy the finalization function from the original array (PR#8568) */ Custom_ops_val(res) = Custom_ops_val(vb); /* Doctor the changed dimension */ @@ -1388,7 +1393,7 @@ CAMLprim value caml_ba_reshape(value vb, value vdim) if (num_elts != caml_ba_num_elts(b)) caml_invalid_argument("Bigarray.reshape: size mismatch"); /* Create bigarray with same data and new dimensions */ - res = caml_ba_alloc(b->flags, num_dims, b->data, dim); + res = caml_ba_alloc(b->flags | CAML_BA_SUBARRAY, num_dims, b->data, dim); /* Copy the finalization function from the original array (PR#8568) */ Custom_ops_val(res) = Custom_ops_val(vb); /* Create or update proxy in case of managed bigarray */ diff --git a/runtime/callback.c b/runtime/callback.c index 68df624aab8..d39264da634 100644 --- a/runtime/callback.c +++ b/runtime/callback.c @@ -122,6 +122,7 @@ CAMLexport value caml_callbackN_exn(value closure, int narg, value args[]) However, they are never used afterwards, as they were copied into the root [domain_state->current_stack]. */ + caml_update_young_limit_after_c_call(domain_state); res = caml_interprete(callback_code, sizeof(callback_code)); if (Is_exception_result(res)) domain_state->current_stack->sp += narg + 4; /* PR#3419 */ @@ -187,6 +188,7 @@ CAMLexport value caml_callback_exn(value closure, value arg) End_roots(); Begin_roots1(cont); + caml_update_young_limit_after_c_call(domain_state); res = caml_callback_asm(domain_state, closure, &arg); End_roots(); @@ -194,6 +196,7 @@ CAMLexport value caml_callback_exn(value closure, value arg) return res; } else { + caml_update_young_limit_after_c_call(domain_state); return caml_callback_asm(domain_state, closure, &arg); } } @@ -214,6 +217,7 @@ CAMLexport value caml_callback2_exn(value closure, value arg1, value arg2) Begin_roots1(cont); value args[] = {arg1, arg2}; + caml_update_young_limit_after_c_call(domain_state); res = caml_callback2_asm(domain_state, closure, args); End_roots(); @@ -222,6 +226,7 @@ CAMLexport value caml_callback2_exn(value closure, value arg1, value arg2) return res; } else { value args[] = {arg1, arg2}; + caml_update_young_limit_after_c_call(domain_state); return caml_callback2_asm(domain_state, closure, args); } } @@ -243,6 +248,7 @@ CAMLexport value caml_callback3_exn(value closure, Begin_root(cont); value args[] = {arg1, arg2, arg3}; + caml_update_young_limit_after_c_call(domain_state); res = caml_callback3_asm(domain_state, closure, args); End_roots(); @@ -251,6 +257,7 @@ CAMLexport value caml_callback3_exn(value closure, return res; } else { value args[] = {arg1, arg2, arg3}; + caml_update_young_limit_after_c_call(domain_state); return caml_callback3_asm(domain_state, closure, args); } } diff --git a/runtime/caml/bigarray.h b/runtime/caml/bigarray.h index 104b8869dd6..5489433e8d6 100644 --- a/runtime/caml/bigarray.h +++ b/runtime/caml/bigarray.h @@ -74,6 +74,10 @@ enum caml_ba_managed { CAML_BA_MANAGED_MASK = 0x600 /* Mask for "managed" bits in flags field */ }; +enum caml_ba_subarray { + CAML_BA_SUBARRAY = 0x800 /* Data is shared with another bigarray */ +}; + struct caml_ba_proxy { atomic_uintnat refcount; /* Reference count */ void * data; /* Pointer to base of actual data */ @@ -85,20 +89,11 @@ struct caml_ba_array { intnat num_dims; /* Number of dimensions */ intnat flags; /* Kind of element array + memory layout + allocation status */ struct caml_ba_proxy * proxy; /* The proxy for sub-arrays, or NULL */ - /* PR#5516: use C99's flexible array types if possible */ -#if (__STDC_VERSION__ >= 199901L) intnat dim[] /*[num_dims]*/; /* Size in each dimension */ -#else - intnat dim[1] /*[num_dims]*/; /* Size in each dimension */ -#endif }; -/* Size of struct caml_ba_array, in bytes, without dummy first dimension */ -#if (__STDC_VERSION__ >= 199901L) +/* Size of struct caml_ba_array, in bytes, without [dim] array */ #define SIZEOF_BA_ARRAY sizeof(struct caml_ba_array) -#else -#define SIZEOF_BA_ARRAY (sizeof(struct caml_ba_array) - sizeof(intnat)) -#endif #define Caml_ba_array_val(v) ((struct caml_ba_array *) Data_custom_val(v)) diff --git a/runtime/caml/codefrag.h b/runtime/caml/codefrag.h index fc6fac1edd9..d0f9a629cf0 100644 --- a/runtime/caml/codefrag.h +++ b/runtime/caml/codefrag.h @@ -87,9 +87,8 @@ extern struct code_fragment * Returns NULL if the code fragment was registered with [DIGEST_IGNORE]. */ extern unsigned char * caml_digest_of_code_fragment(struct code_fragment *); -/* Cleans up (and frees) removed code fragments. Must be called from a stop the - world pause by only a single thread. */ -extern void caml_code_fragment_cleanup(void); +/* Cleans up (and frees) removed code fragments. */ +extern void caml_code_fragment_cleanup_from_stw_single(void); #endif diff --git a/runtime/caml/compact.h b/runtime/caml/compact.h deleted file mode 100644 index c2022c9020c..00000000000 --- a/runtime/caml/compact.h +++ /dev/null @@ -1,36 +0,0 @@ -/**************************************************************************/ -/* */ -/* OCaml */ -/* */ -/* Damien Doligez, projet Para, INRIA Rocquencourt */ -/* */ -/* Copyright 1996 Institut National de Recherche en Informatique et */ -/* en Automatique. */ -/* */ -/* All rights reserved. This file is distributed under the terms of */ -/* the GNU Lesser General Public License version 2.1, with the */ -/* special exception on linking described in the file LICENSE. */ -/* */ -/**************************************************************************/ - -#ifndef CAML_COMPACT_H -#define CAML_COMPACT_H - -#ifdef CAML_INTERNALS - -#include "config.h" -#include "misc.h" -#include "mlvalues.h" - -/* [caml_compact_heap] compacts the heap and optionally changes the - allocation policy. - if [new_allocation_policy] is -1, the policy is not changed. -*/ -void caml_compact_heap (intnat new_allocation_policy); - -void caml_compact_heap_maybe (double previous_overhead); -void caml_invert_root (value v, value *p); - -#endif /* CAML_INTERNALS */ - -#endif /* CAML_COMPACT_H */ diff --git a/runtime/caml/config.h b/runtime/caml/config.h index 30df2c574b7..3fea87d8ebf 100644 --- a/runtime/caml/config.h +++ b/runtime/caml/config.h @@ -258,7 +258,7 @@ typedef uint64_t uintnat; /* Default setting for maximum size of custom objects counted as garbage in the minor heap. Documented in gc.mli */ -#define Custom_minor_max_bsz_def 8192 +#define Custom_minor_max_bsz_def 70000 /* Minimum amount of work to do in a major GC slice. */ #define Major_slice_work_min 512 diff --git a/runtime/caml/custom.h b/runtime/caml/custom.h index e4b162c9bd8..78549298bc2 100644 --- a/runtime/caml/custom.h +++ b/runtime/caml/custom.h @@ -52,11 +52,17 @@ extern "C" { #endif +CAMLextern uintnat caml_custom_major_ratio; + CAMLextern value caml_alloc_custom(const struct custom_operations * ops, uintnat size, /*size in bytes*/ mlsize_t mem, /*resources consumed*/ mlsize_t max /*max resources*/); +/* [caml_alloc_custom_mem] allocates a custom block with dependent memory + (memory outside the heap that will be reclaimed when the block is + finalized). If [mem] is greater than [custom_minor_max_size] (see gc.mli) + the block is allocated directly in the major heap. */ CAMLextern value caml_alloc_custom_mem(const struct custom_operations * ops, uintnat size, /*size in bytes*/ mlsize_t mem /*memory consumed*/); @@ -64,6 +70,9 @@ CAMLextern value caml_alloc_custom_mem(const struct custom_operations * ops, CAMLextern void caml_register_custom_operations(const struct custom_operations * ops); +/* Return the current [max] factor for [caml_alloc_custom_mem] allocations. */ +CAMLextern mlsize_t caml_custom_get_max_major (void); + /* Global variable moved to Caml_state in 4.10 */ #define caml_compare_unordered (Caml_state_field(compare_unordered)) diff --git a/runtime/caml/domain.h b/runtime/caml/domain.h index 2edfae09c00..e2e234ab2c7 100644 --- a/runtime/caml/domain.h +++ b/runtime/caml/domain.h @@ -66,7 +66,9 @@ void caml_handle_gc_interrupt(void); void caml_handle_incoming_interrupts(void); CAMLextern void caml_interrupt_self(void); +void caml_interrupt_all_signal_safe(void); void caml_reset_young_limit(caml_domain_state *); +void caml_update_young_limit_after_c_call(caml_domain_state *); CAMLextern void caml_reset_domain_lock(void); CAMLextern int caml_bt_is_in_blocking_section(void); @@ -111,6 +113,60 @@ int caml_try_run_on_all_domains( void*, void (*leader_setup)(caml_domain_state*)); +/* Function naming conventions for STW callbacks and STW critical sections. + + A "STW callback" is a callback passed to one of the + [caml_try_run_on_all_domains*] runners, it will + run on all participant domains in parallel. + + The "STW critical section" is the runtime interval betweeen the + start of the execution of the STW callback and the last barrier in + the callback. During this interval, mutator code from registered + participants cannot be running in parallel. + + Note: + + - Some parts of a STW callback are *not* inside the STW critical + section: all the code after the last barrier, or all the callback + if it does not contain a barrier. + + - Program initialization can be considered as a STW critical + section as well, when no mutators or domains are running yet. + + Some functions must be called within a STW critical section only, + calling then in a less-synchronized context introduces races with + mutators. To avoid these mistakes we use naming conventions as + a barebones effect system. + + 1. [stw_*] prefix for STW callbacks. + + A function that defines a STW callback starts with [stw_] or + [caml_stw_]. It is passed to the [caml_try_run_on_all_domains*] + runner. + + Examples: + - [caml_stw_empty_minor_heap] is a STW callback that empties the + minor heap + - [stw_resize_minor_heap_reservation] is a STW callback that + resizes the memory reservation for the minor heap + + 2. [*_from_stw] suffix for auxiliary functions that may only be + called within a STW critical section. + + 3. [*_from_stw_single] suffix for auxiliary functions that may only + be called within a STW critical section, and only by a single + domain at a time -- typically the last one entering a barrier. + + 5. No [stw] in the name for functions that are not called in a STW + callback, in particular functions that themselves start a STW + context by calling a [caml_try_run_on_all_domains*]. + + We could consider a [*_outside_stw] suffix for functions that must + not be called inside a STW callback, but it is generally not + necessary to enforce this discipline in the function name. +*/ + + /* barriers */ typedef uintnat barrier_status; void caml_global_barrier(void); @@ -119,6 +175,7 @@ int caml_global_barrier_is_final(barrier_status); void caml_global_barrier_end(barrier_status); int caml_global_barrier_num_domains(void); +int caml_domain_terminating(caml_domain_state *); int caml_domain_is_terminating(void); #endif /* CAML_INTERNALS */ diff --git a/runtime/caml/domain_state.h b/runtime/caml/domain_state.h index 06401a4a175..ac20ea27d4e 100644 --- a/runtime/caml/domain_state.h +++ b/runtime/caml/domain_state.h @@ -42,12 +42,6 @@ enum { #define LAST_DOMAIN_STATE_MEMBER extra_params -/* Check that the structure was laid out without padding, - since the runtime assumes this in computing offsets */ -CAML_STATIC_ASSERT( - offsetof(caml_domain_state, LAST_DOMAIN_STATE_MEMBER) == - (Domain_state_num_fields - 1) * 8); - #if defined(HAS_FULL_THREAD_VARIABLES) || defined(IN_CAML_RUNTIME) CAMLextern __thread caml_domain_state* caml_state; #define Caml_state_opt caml_state @@ -61,7 +55,7 @@ CAML_STATIC_ASSERT( #define Caml_state (CAMLassert(Caml_state_opt != NULL), Caml_state_opt) -CAMLextern CAMLnoret void caml_bad_caml_state(void); +CAMLnoret CAMLextern void caml_bad_caml_state(void); /* This check is performed regardless of debug mode. It is placed once at every code path starting from entry points of the public C API, diff --git a/runtime/caml/domain_state.tbl b/runtime/caml/domain_state.tbl index 3c1760fa3ac..6378cf39d29 100644 --- a/runtime/caml/domain_state.tbl +++ b/runtime/caml/domain_state.tbl @@ -15,9 +15,14 @@ /**************************************************************************/ DOMAIN_STATE(atomic_uintnat, young_limit) -/* Minor heap limit. Typically young_limit == young_start, but this field is set - * by other domains to signal this domain by causing a spurious allocation - * failure. */ +/* Minor heap limit. Typically [young_start] <= [young_limit] <= + * [young_end], but this field can be set atomically to UINTNAT_MAX by + * another thread (typically from another domain) in order to + * interrupt this domain (by causing an allocation failure). Setting + * [young_limit] to UINTNAT_MAX can be done safely at any time + * whatsoever by any thread. To avoid races, setting [young_limit] to + * anything else than UINTNAT_MAX should only be done via + * [caml_reset_young_limit] by the domain itself. */ DOMAIN_STATE(value*, young_ptr) /* Minor heap pointer */ @@ -37,7 +42,7 @@ DOMAIN_STATE(struct stack_info*, current_stack) DOMAIN_STATE(void*, exn_handler) /* Pointer into the current stack */ -DOMAIN_STATE(int, action_pending) +DOMAIN_STATE(_Bool, action_pending) /* Whether we are due to start the processing of delayable pending actions. See runtime/signal.c. */ diff --git a/runtime/caml/exec.h b/runtime/caml/exec.h.in similarity index 93% rename from runtime/caml/exec.h rename to runtime/caml/exec.h.in index 6d5ed7d7858..333af64dded 100644 --- a/runtime/caml/exec.h +++ b/runtime/caml/exec.h.in @@ -46,7 +46,7 @@ struct section_descriptor { uint32_t len; /* Length of data in bytes */ }; -#define EXEC_MAGIC_LENGTH 12 +#undef EXEC_MAGIC_LENGTH /* Structure of the trailer. */ @@ -60,7 +60,13 @@ struct exec_trailer { /* Magic number for this release */ -#define EXEC_MAGIC "Caml1999X033" +#undef MAGIC_NUMBER_PREFIX + +#undef EXEC_FORMAT + +#undef MAGIC_NUMBER_VERSION + +#define EXEC_MAGIC MAGIC_NUMBER_PREFIX EXEC_FORMAT MAGIC_NUMBER_VERSION #endif /* CAML_INTERNALS */ diff --git a/runtime/caml/fail.h b/runtime/caml/fail.h index a9ac4b55113..4652bb89692 100644 --- a/runtime/caml/fail.h +++ b/runtime/caml/fail.h @@ -81,40 +81,40 @@ CAMLextern value caml_raise_if_exception(value res); extern "C" { #endif -CAMLextern CAMLnoret void caml_raise (value bucket); +CAMLnoret CAMLextern void caml_raise (value bucket); -CAMLextern CAMLnoret void caml_raise_constant (value tag); +CAMLnoret CAMLextern void caml_raise_constant (value tag); -CAMLextern CAMLnoret void caml_raise_with_arg (value tag, value arg); +CAMLnoret CAMLextern void caml_raise_with_arg (value tag, value arg); -CAMLextern CAMLnoret +CAMLnoret CAMLextern void caml_raise_with_args (value tag, int nargs, value arg[]); -CAMLextern CAMLnoret void caml_raise_with_string (value tag, char const * msg); +CAMLnoret CAMLextern void caml_raise_with_string (value tag, char const * msg); -CAMLextern CAMLnoret void caml_failwith (char const *msg); +CAMLnoret CAMLextern void caml_failwith (char const *msg); -CAMLextern CAMLnoret void caml_failwith_value (value msg); +CAMLnoret CAMLextern void caml_failwith_value (value msg); -CAMLextern CAMLnoret void caml_invalid_argument (char const *msg); +CAMLnoret CAMLextern void caml_invalid_argument (char const *msg); -CAMLextern CAMLnoret void caml_invalid_argument_value (value msg); +CAMLnoret CAMLextern void caml_invalid_argument_value (value msg); -CAMLextern CAMLnoret void caml_raise_out_of_memory (void); +CAMLnoret CAMLextern void caml_raise_out_of_memory (void); -CAMLextern CAMLnoret void caml_raise_stack_overflow (void); +CAMLnoret CAMLextern void caml_raise_stack_overflow (void); -CAMLextern CAMLnoret void caml_raise_sys_error (value); +CAMLnoret CAMLextern void caml_raise_sys_error (value); -CAMLextern CAMLnoret void caml_raise_end_of_file (void); +CAMLnoret CAMLextern void caml_raise_end_of_file (void); -CAMLextern CAMLnoret void caml_raise_zero_divide (void); +CAMLnoret CAMLextern void caml_raise_zero_divide (void); -CAMLextern CAMLnoret void caml_raise_not_found (void); +CAMLnoret CAMLextern void caml_raise_not_found (void); -CAMLextern CAMLnoret void caml_array_bound_error (void); +CAMLnoret CAMLextern void caml_array_bound_error (void); -CAMLextern CAMLnoret void caml_raise_sys_blocked_io (void); +CAMLnoret CAMLextern void caml_raise_sys_blocked_io (void); #ifdef __cplusplus } diff --git a/runtime/caml/fiber.h b/runtime/caml/fiber.h index 480412b69f7..b01d1cde49c 100644 --- a/runtime/caml/fiber.h +++ b/runtime/caml/fiber.h @@ -61,8 +61,6 @@ struct stack_info { int64_t id; }; -CAML_STATIC_ASSERT(sizeof(struct stack_info) == - Stack_ctx_words * sizeof(value)); #define Stack_base(stk) ((value*)(stk + 1)) #define Stack_threshold_ptr(stk) \ (Stack_base(stk) + Stack_threshold / sizeof(value)) @@ -103,6 +101,8 @@ CAML_STATIC_ASSERT(sizeof(struct stack_info) == #elif defined(TARGET_power) /* ELF ABI: 4 reserved words at bottom of C stack */ #define Reserved_space_c_stack_link 4 * 8 +#else + #define Reserved_space_c_stack_link 0 #endif /* This structure is used for storing the OCaml return pointer when @@ -281,9 +281,9 @@ value caml_continuation_use (value cont); Used for cloning continuations and continuation backtraces. */ void caml_continuation_replace(value cont, struct stack_info* stack); -CAMLextern CAMLnoret void caml_raise_continuation_already_resumed (void); +CAMLnoret CAMLextern void caml_raise_continuation_already_resumed (void); -CAMLextern CAMLnoret void caml_raise_unhandled_effect (value effect); +CAMLnoret CAMLextern void caml_raise_unhandled_effect (value effect); value caml_make_unhandled_effect_exn (value effect); diff --git a/runtime/caml/gc_stats.h b/runtime/caml/gc_stats.h index 80227b33c24..4cded2c8bec 100644 --- a/runtime/caml/gc_stats.h +++ b/runtime/caml/gc_stats.h @@ -72,11 +72,10 @@ struct gc_stats { void caml_orphan_alloc_stats(caml_domain_state *); -/* Update the sampled stats of a domain from its live stats. */ -void caml_collect_gc_stats_sample(caml_domain_state *domain); - -/* Clear the sampled stats on domain termination. */ -void caml_clear_gc_stats_sample(caml_domain_state *domain); +/* Update the sampled stats of a domain from its live stats. + May only be called during STW, so that it does not race + with mutators calling [caml_compute_gc_stats]. */ +void caml_collect_gc_stats_sample_stw(caml_domain_state *domain); /* Compute global runtime stats. diff --git a/runtime/caml/intext.h b/runtime/caml/intext.h index e19b4e6d210..e93d37a400f 100644 --- a/runtime/caml/intext.h +++ b/runtime/caml/intext.h @@ -195,7 +195,7 @@ CAMLextern void caml_deserialize_block_4(void * data, intnat len); CAMLextern void caml_deserialize_block_8(void * data, intnat len); CAMLextern void caml_deserialize_block_float_8(void * data, intnat len); -CAMLextern CAMLnoret void caml_deserialize_error(char * msg); +CAMLnoret CAMLextern void caml_deserialize_error(char * msg); #ifdef __cplusplus } diff --git a/runtime/caml/lf_skiplist.h b/runtime/caml/lf_skiplist.h index db6544c8671..1ba106158af 100644 --- a/runtime/caml/lf_skiplist.h +++ b/runtime/caml/lf_skiplist.h @@ -48,11 +48,7 @@ struct lf_skipcell { uintnat top_level; void *stat_block; struct lf_skipcell *_Atomic garbage_next; -#if (__STDC_VERSION__ >= 199901L) - struct lf_skipcell *_Atomic forward[]; /* variable-length array */ -#else - struct lf_skipcell *_Atomic forward[1]; /* variable-length array */ -#endif + struct lf_skipcell *_Atomic forward[]; /* flexible array member */ }; /* Initialize a skip list */ diff --git a/runtime/caml/major_gc.h b/runtime/caml/major_gc.h index 54cddc1b36b..a4b36bff556 100644 --- a/runtime/caml/major_gc.h +++ b/runtime/caml/major_gc.h @@ -41,13 +41,12 @@ void caml_darken(void*, value, volatile value* ignored); void caml_darken_cont(value); void caml_mark_root(value, value*); void caml_empty_mark_stack(void); -void caml_finish_major_cycle(void); - -/* Ephemerons and finalisers */ -void caml_orphan_allocated_words(void); -void caml_add_to_orphaned_ephe_list(struct caml_ephe_info* ephe_info); -void caml_add_orphaned_finalisers (struct caml_final_info*); -void caml_final_domain_terminate (caml_domain_state *domain_state); +void caml_finish_major_cycle(int force_compaction); +#ifdef DEBUG +int caml_mark_stack_is_empty(void); +#endif +void caml_orphan_ephemerons(caml_domain_state*); +void caml_orphan_finalisers(caml_domain_state*); /* Forces finalisation of all heap-allocated values, disregarding both local and global roots. diff --git a/runtime/caml/memory.h b/runtime/caml/memory.h index 92afc722239..ed87224520b 100644 --- a/runtime/caml/memory.h +++ b/runtime/caml/memory.h @@ -38,6 +38,7 @@ CAMLextern value caml_alloc_shr_noexc(mlsize_t wosize, tag_t); CAMLextern value caml_alloc_shr_reserved (mlsize_t, tag_t, reserved_t); CAMLextern void caml_adjust_gc_speed (mlsize_t, mlsize_t); +CAMLextern void caml_adjust_minor_gc_speed (mlsize_t, mlsize_t); CAMLextern void caml_alloc_dependent_memory (mlsize_t bsz); CAMLextern void caml_free_dependent_memory (mlsize_t bsz); CAMLextern void caml_modify (volatile value *, value); diff --git a/runtime/caml/minor_gc.h b/runtime/caml/minor_gc.h index 5c691b84671..1c85af63c26 100644 --- a/runtime/caml/minor_gc.h +++ b/runtime/caml/minor_gc.h @@ -74,7 +74,7 @@ extern void caml_set_minor_heap_size (asize_t); /* size in bytes */ extern void caml_empty_minor_heap_no_major_slice_from_stw (caml_domain_state* domain, void* unused, int participating_count, caml_domain_state** participating); /* in STW */ -extern int caml_try_stw_empty_minor_heap_on_all_domains(void); /* out STW */ +extern int caml_try_empty_minor_heap_on_all_domains(void); /* out STW */ extern void caml_empty_minor_heaps_once(void); /* out STW */ void caml_alloc_small_dispatch (caml_domain_state* domain, intnat wosize, int flags, diff --git a/runtime/caml/misc.h b/runtime/caml/misc.h index dc52382fc66..75e29942678 100644 --- a/runtime/caml/misc.h +++ b/runtime/caml/misc.h @@ -42,8 +42,9 @@ #define CAMLdeprecated_typedef(name, type) typedef type name #endif -#if defined(__GNUC__) && __STDC_VERSION__ >= 199901L \ - || defined(_MSC_VER) && _MSC_VER >= 1925 +#if defined(__GNUC__) \ + && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L \ + || defined(_MSC_VER) && _MSC_VER >= 1925 #define CAML_STRINGIFY(x) #x #ifdef _MSC_VER @@ -78,14 +79,16 @@ CAMLdeprecated_typedef(addr, char *); /* Noreturn, CAMLnoreturn_start and CAMLnoreturn_end are preserved for compatibility reasons. Instead, we recommend using the CAMLnoret macro, to be added as a modifier at the beginning of the - function definition or declaration. + function definition or declaration. It must occur first, before + "static", "extern", "CAMLexport", "CAMLextern". Note: CAMLnoreturn is a different macro defined in memory.h, to be used in function bodies rather than as a function attribute. */ -#if __STDC_VERSION__ >= 202300L || __cplusplus >= 201103L +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202300L \ + || defined(__cplusplus) && __cplusplus >= 201103L #define CAMLnoret [[noreturn]] -#elif __STDC_VERSION__ >= 201112L +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #define CAMLnoret _Noreturn #elif defined(__GNUC__) #define CAMLnoret __attribute__ ((noreturn)) @@ -215,14 +218,6 @@ Caml_inline void call_timing_hook(_Atomic caml_timing_hook * a) #endif /* CAML_INTERNALS */ -#define CAML_STATIC_ASSERT_3(b, l) \ - CAMLunused_start \ - CAMLextern char static_assertion_failure_line_##l[(b) ? 1 : -1] \ - CAMLunused_end - -#define CAML_STATIC_ASSERT_2(b, l) CAML_STATIC_ASSERT_3(b, l) -#define CAML_STATIC_ASSERT(b) CAML_STATIC_ASSERT_2(b, __LINE__) - /* Windows Unicode support (rest below - char_os is needed earlier) */ #ifdef _WIN32 @@ -248,7 +243,7 @@ typedef char char_os; #define CAMLassert(x) \ (CAMLlikely(x) ? (void) 0 : caml_failed_assert ( #x , __OSFILE__, __LINE__)) -CAMLextern CAMLnoret void caml_failed_assert (char *, char_os *, int); +CAMLnoret CAMLextern void caml_failed_assert (char *, char_os *, int); #else #define CAMLassert(x) ((void) 0) #endif @@ -299,7 +294,7 @@ typedef void (*fatal_error_hook) (char *msg, va_list args); extern _Atomic fatal_error_hook caml_fatal_error_hook; #endif -CAMLextern CAMLnoret void caml_fatal_error (char *, ...) +CAMLnoret CAMLextern void caml_fatal_error (char *, ...) #ifdef __GNUC__ __attribute__ ((format (printf, 1, 2))) #endif @@ -568,7 +563,7 @@ CAMLextern int caml_snwprintf(wchar_t * buf, # define CAMLno_asan __attribute__((no_sanitize("address"))) # endif #else -# if __SANITIZE_ADDRESS__ +# if defined(__SANITIZE_ADDRESS__) # undef CAMLno_asan # define CAMLno_asan __attribute__((no_sanitize_address)) # endif diff --git a/runtime/caml/mlvalues.h b/runtime/caml/mlvalues.h index 7c3898a4af8..dfd85635cab 100644 --- a/runtime/caml/mlvalues.h +++ b/runtime/caml/mlvalues.h @@ -205,7 +205,7 @@ Caml_inline header_t Hd_val(value val) #define Tag_hp(hp) (((volatile unsigned char *) (hp)) [sizeof(value)-1]) /* Also an l-value. */ #else -#define Tag_val(val) (((volatile unsigned char *) (val)) [-sizeof(value)]) +#define Tag_val(val) (((volatile unsigned char *) (val)) [- (int)sizeof(value)]) /* Also an l-value. */ #define Tag_hp(hp) (((volatile unsigned char *) (hp)) [0]) /* Also an l-value. */ @@ -233,7 +233,7 @@ Caml_inline header_t Hd_val(value val) /* NOTE: [Forward_tag] and [Infix_tag] must be just under [No_scan_tag], with [Infix_tag] the lower one. - See [caml_oldify_one] in minor_gc.c for more details. + See [oldify_one] in minor_gc.c for more details. NOTE: Update stdlib/obj.ml whenever you change the tags. */ @@ -425,7 +425,11 @@ CAMLextern value caml_atom(tag_t); /* Booleans are integers 0 or 1 */ #define Val_bool(x) Val_int((x) != 0) +#ifdef __cplusplus +#define Bool_val(x) ((bool) Int_val(x)) +#else #define Bool_val(x) Int_val(x) +#endif #define Val_false Val_int(0) #define Val_true Val_int(1) #define Val_not(x) (Val_false + Val_true - (x)) diff --git a/runtime/caml/osdeps.h b/runtime/caml/osdeps.h index 92366bfcbea..10385221908 100644 --- a/runtime/caml/osdeps.h +++ b/runtime/caml/osdeps.h @@ -99,7 +99,7 @@ extern int caml_num_rows_fd(int fd); /* Memory management platform-specific operations */ -void *caml_plat_mem_map(uintnat, uintnat, int); +void *caml_plat_mem_map(uintnat, int); void *caml_plat_mem_commit(void *, uintnat); void caml_plat_mem_decommit(void *, uintnat); void caml_plat_mem_unmap(void *, uintnat); diff --git a/runtime/caml/platform.h b/runtime/caml/platform.h index b473e081547..cb34d64d2f6 100644 --- a/runtime/caml/platform.h +++ b/runtime/caml/platform.h @@ -126,13 +126,8 @@ uintnat caml_mem_round_up_pages(uintnat size); /* The size given to caml_mem_map and caml_mem_commit must be a multiple of caml_plat_pagesize. The size given to caml_mem_unmap and caml_mem_decommit must match the size given to caml_mem_map/caml_mem_commit for mem. - - The Windows and Cygwin implementations do not support arbitrary alignment - and will fail for alignment values greater than caml_plat_mmap_alignment. - Luckily, this value is rather large on those platforms: 64KiB. This is enough - for all alignments used in the runtime system so far, the larger being the - major heap pools aligned on 32KiB boundaries. */ -void* caml_mem_map(uintnat size, uintnat alignment, int reserve_only); +*/ +void* caml_mem_map(uintnat size, int reserve_only); void* caml_mem_commit(void* mem, uintnat size); void caml_mem_decommit(void* mem, uintnat size); void caml_mem_unmap(void* mem, uintnat size); diff --git a/runtime/caml/prims.h b/runtime/caml/prims.h index cb26f4012a2..8c26e547fcc 100644 --- a/runtime/caml/prims.h +++ b/runtime/caml/prims.h @@ -22,8 +22,8 @@ typedef value (*c_primitive)(void); -extern c_primitive caml_builtin_cprim[]; -extern char * caml_names_of_builtin_cprim[]; +extern const c_primitive caml_builtin_cprim[]; +extern const char * const caml_names_of_builtin_cprim[]; extern struct ext_table caml_prim_table; #ifdef DEBUG diff --git a/runtime/caml/runtime_events.h b/runtime/caml/runtime_events.h index b842f40592a..2885677da27 100644 --- a/runtime/caml/runtime_events.h +++ b/runtime/caml/runtime_events.h @@ -110,7 +110,11 @@ typedef enum { EV_MINOR_REMEMBERED_SET_PROMOTE, EV_MINOR_LOCAL_ROOTS_PROMOTE, EV_DOMAIN_CONDITION_WAIT, - EV_DOMAIN_RESIZE_HEAP_RESERVATION + EV_DOMAIN_RESIZE_HEAP_RESERVATION, + EV_COMPACT, + EV_COMPACT_EVACUATE, + EV_COMPACT_FORWARD, + EV_COMPACT_RELEASE } ev_runtime_phase; typedef enum { @@ -155,21 +159,20 @@ typedef enum { /* Starts runtime_events. Needs to be called before [caml_runtime_events_create_cursor]. Needs the runtime lock held to call and - will trigger a stop-the-world pause. Returns Val_unit. */ -CAMLextern value caml_runtime_events_start(void); + will trigger a stop-the-world pause. */ +CAMLextern void caml_runtime_events_start(void); /* Pauses runtime_events if not currently paused otherwise does nothing. No new events (other than the pause itself) will be written to the ring buffer by this domain immediately and all other domains soon. Needs the - runtime lock held to call as a pause event is written during this call. - Returns Val_unit. */ -CAMLextern value caml_runtime_events_pause(void); + runtime lock held to call as a pause event is written during this call. */ +CAMLextern void caml_runtime_events_pause(void); /* Resumes runtime_events if currently paused otherwise does nothing. New events (as well as a resume event) will be written to this domain immediately and all other domains soon. Needs the runtime lock held to call as a resume event - is written during this call. Returns Val_unit. */ -CAMLextern value caml_runtime_events_resume(void); + is written during this call. */ +CAMLextern void caml_runtime_events_resume(void); #ifdef CAML_INTERNALS diff --git a/runtime/caml/s.h.in b/runtime/caml/s.h.in index ce859c1354b..307fa8d633c 100644 --- a/runtime/caml/s.h.in +++ b/runtime/caml/s.h.in @@ -289,9 +289,6 @@ #undef HAS_POSIX_SPAWN -#undef HAS_FFS -#undef HAS_BITSCANFORWARD - #undef HAS_SIGWAIT #undef HAS_HUGE_PAGES diff --git a/runtime/caml/shared_heap.h b/runtime/caml/shared_heap.h index 768415c586f..e9423052a9e 100644 --- a/runtime/caml/shared_heap.h +++ b/runtime/caml/shared_heap.h @@ -24,6 +24,8 @@ #include "misc.h" #include "gc_stats.h" +CAMLextern atomic_uintnat caml_compactions_count; + struct caml_heap_state; struct pool; @@ -31,7 +33,7 @@ struct caml_heap_state* caml_init_shared_heap(void); void caml_teardown_shared_heap(struct caml_heap_state* heap); value* caml_shared_try_alloc(struct caml_heap_state*, - mlsize_t, tag_t, reserved_t, int); + mlsize_t, tag_t, reserved_t); /* Copy the domain-local heap stats into a heap stats sample. */ void caml_collect_heap_stats_sample( @@ -45,7 +47,9 @@ uintnat caml_heap_size(struct caml_heap_state*); uintnat caml_top_heap_words(struct caml_heap_state*); uintnat caml_heap_blocks(struct caml_heap_state*); -struct pool* caml_pool_of_shared_block(value v); +void caml_compact_heap(caml_domain_state* domain_state, + int participating_count, + caml_domain_state** participants); void caml_shared_unpin(value v); @@ -88,18 +92,14 @@ void caml_redarken_pool(struct pool*, scanning_action, void*); intnat caml_sweep(struct caml_heap_state*, intnat); - -/* must be called during STW */ -void caml_cycle_heap_stw(void); +void caml_cycle_heap_from_stw_single(void); /* must be called on each domain - (after caml_cycle_heap_stw) */ + (after caml_cycle_heap_from_stw_single) */ void caml_cycle_heap(struct caml_heap_state*); /* Heap invariant verification (for debugging) */ - -/* caml_verify_heap must only be called while all domains are paused */ -void caml_verify_heap(caml_domain_state *domain); +void caml_verify_heap_from_stw(caml_domain_state *domain); #ifdef DEBUG /* [is_garbage(v)] returns true if [v] is a garbage value */ diff --git a/runtime/caml/signals.h b/runtime/caml/signals.h index cccce2eee55..2a340cf2ee8 100644 --- a/runtime/caml/signals.h +++ b/runtime/caml/signals.h @@ -60,15 +60,15 @@ CAMLextern atomic_uintnat caml_pending_signals[NSIG_WORDS]; #define caml_requested_major_slice (Caml_state_field(requested_major_slice)) #define caml_requested_minor_gc (Caml_state_field(requested_minor_gc)) -int caml_check_pending_signals(void); +CAMLextern int caml_check_pending_signals(void); void caml_request_major_slice (int global); void caml_request_minor_gc (void); CAMLextern int caml_convert_signal_number (int); CAMLextern int caml_rev_convert_signal_number (int); -value caml_execute_signal_exn(int signal_number, int in_signal_handler); +value caml_execute_signal_exn(int signal_number); CAMLextern void caml_record_signal(int signal_number); CAMLextern value caml_process_pending_signals_exn(void); -void caml_set_action_pending(caml_domain_state *); +CAMLextern void caml_set_action_pending(caml_domain_state *); value caml_do_pending_actions_exn(void); value caml_process_pending_actions_with_root (value extra_root); // raises value caml_process_pending_actions_with_root_exn (value extra_root); @@ -79,10 +79,6 @@ void caml_terminate_signals(void); CAMLextern void * caml_init_signal_stack(void); CAMLextern void caml_free_signal_stack(void *); -#if defined(NATIVE_CODE) && defined(TARGET_power) -void caml_sigtrap_handler(int, siginfo_t *, void *); -#endif - /* These hooks are not modified after other threads are spawned. */ CAMLextern void (*caml_enter_blocking_section_hook)(void); CAMLextern void (*caml_leave_blocking_section_hook)(void); diff --git a/runtime/caml/sizeclasses.h b/runtime/caml/sizeclasses.h index 75fab656b0a..d26039217d3 100644 --- a/runtime/caml/sizeclasses.h +++ b/runtime/caml/sizeclasses.h @@ -3,13 +3,13 @@ #define POOL_HEADER_WSIZE 4 #define SIZECLASS_MAX 128 #define NUM_SIZECLASSES 32 -static const unsigned int wsize_sizeclass[NUM_SIZECLASSES] = +static const unsigned int wsize_sizeclass[NUM_SIZECLASSES] = { 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 17, 19, 22, 25, 28, 32, 33, 37, 42, 47, 53, 59, 65, 73, 81, 89, 99, 108, 118, 128 }; -static const unsigned char wastage_sizeclass[NUM_SIZECLASSES] = +static const unsigned char wastage_sizeclass[NUM_SIZECLASSES] = { 0, 0, 0, 0, 2, 0, 4, 4, 2, 0, 4, 12, 12, 7, 0, 17, 4, 28, 0, 22, 18, 3, 11, 21, 62, 4, 42, 87, 33, 96, 80, 124 }; -static const unsigned char sizeclass_wsize[SIZECLASS_MAX + 1] = +static const unsigned char sizeclass_wsize[SIZECLASS_MAX + 1] = { 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, diff --git a/runtime/caml/skiplist.h b/runtime/caml/skiplist.h index 1e8284dd7ee..b022d09c2db 100644 --- a/runtime/caml/skiplist.h +++ b/runtime/caml/skiplist.h @@ -39,11 +39,7 @@ struct skiplist { struct skipcell { uintnat key; uintnat data; -#if (__STDC_VERSION__ >= 199901L) - struct skipcell * forward[]; /* variable-length array */ -#else - struct skipcell * forward[1]; /* variable-length array */ -#endif + struct skipcell * forward[]; /* flexible array member */ }; /* Initialize a skip list, statically */ diff --git a/runtime/caml/sys.h b/runtime/caml/sys.h index 5ee508bb7e6..b6e6af87031 100644 --- a/runtime/caml/sys.h +++ b/runtime/caml/sys.h @@ -28,14 +28,14 @@ CAMLextern char * caml_strerror(int errnum, char * buf, size_t buflen); #define NO_ARG Val_int(0) -CAMLextern CAMLnoret void caml_sys_error (value); +CAMLnoret CAMLextern void caml_sys_error (value); -CAMLextern CAMLnoret void caml_sys_io_error (value); +CAMLnoret CAMLextern void caml_sys_io_error (value); CAMLextern double caml_sys_time_unboxed(value); CAMLextern void caml_sys_init (char_os * exe_name, char_os ** argv); -CAMLextern CAMLnoret void caml_do_exit (int); +CAMLnoret CAMLextern void caml_do_exit (int); #ifdef __cplusplus } diff --git a/runtime/caml/tsan.h b/runtime/caml/tsan.h index 8b7a8606e72..7fe40ad9e4e 100644 --- a/runtime/caml/tsan.h +++ b/runtime/caml/tsan.h @@ -34,7 +34,7 @@ # endif # endif #else -# if __SANITIZE_THREAD__ +# if defined(__SANITIZE_THREAD__) # undef CAMLreally_no_tsan # define CAMLreally_no_tsan __attribute__((no_sanitize_thread)) # endif @@ -61,6 +61,7 @@ struct stack_info; +CAMLextern void caml_tsan_exit_on_raise(uintnat pc, char* sp, char* trapsp); CAMLextern void caml_tsan_exit_on_raise_c(char* limit); CAMLextern void caml_tsan_exit_on_perform(uintnat pc, char* sp); diff --git a/runtime/codefrag.c b/runtime/codefrag.c index 9237995fa26..27e1459c04a 100644 --- a/runtime/codefrag.c +++ b/runtime/codefrag.c @@ -160,7 +160,7 @@ caml_find_code_fragment_by_digest(unsigned char digest[16]) { } /* This is only ever called from a stw by one domain */ -void caml_code_fragment_cleanup (void) +void caml_code_fragment_cleanup_from_stw_single (void) { struct code_fragment_garbage *curr; diff --git a/runtime/compare.c b/runtime/compare.c index 06d372b296e..fd90087a40a 100644 --- a/runtime/compare.c +++ b/runtime/compare.c @@ -49,7 +49,7 @@ static void compare_free_stack(struct compare_stack* stk) } /* Same, then raise Out_of_memory */ -static CAMLnoret void compare_stack_overflow(struct compare_stack* stk) +CAMLnoret static void compare_stack_overflow(struct compare_stack* stk) { caml_gc_message (0x04, "Stack overflow in structural comparison\n"); compare_free_stack(stk); diff --git a/runtime/custom.c b/runtime/custom.c index 7204454dd7a..3af218915f7 100644 --- a/runtime/custom.c +++ b/runtime/custom.c @@ -32,42 +32,55 @@ uintnat caml_custom_major_ratio = Custom_major_ratio_def; uintnat caml_custom_minor_ratio = Custom_minor_ratio_def; uintnat caml_custom_minor_max_bsz = Custom_minor_max_bsz_def; +mlsize_t caml_custom_get_max_major (void) +{ + /* The major ratio is a percentage relative to the major heap size. + A complete GC cycle will be done every time 2/3 of that much + memory is allocated for blocks in the major heap. Assuming + constant allocation and deallocation rates, this means there are + at most [M/100 * major-heap-size] bytes of floating garbage at + any time. The reason for a factor of 2/3 (or 1.5) is, roughly + speaking, because the major GC takes 1.5 cycles (previous cycle + + marking phase) before it starts to deallocate dead blocks + allocated during the previous cycle. [heap_size / 150] is really + [heap_size * (2/3) / 100] (but faster). */ + return caml_heap_size(Caml_state->shared_heap) / 150 + * caml_custom_major_ratio; +} + +/* [mem] is an amount of out-of-heap resources, in the same units as + [max_major] and [max_minor]. When the cumulated amount of such + resources reaches [max_minor] (for resources held by the minor + heap) we do a minor collection; when it reaches [max_major] (for + resources held by the major heap), we guarantee that a major cycle + is done. + + If [max_major] is 0, then [mem] is a number of bytes and the actual + limit is [caml_custom_get_max_major ()] computed at the + time when the custom block is promoted to the major heap. +*/ static value alloc_custom_gen (const struct custom_operations * ops, uintnat bsz, mlsize_t mem, mlsize_t max_major, - mlsize_t mem_minor, mlsize_t max_minor) { mlsize_t wosize; CAMLparam0(); CAMLlocal1(result); - /* [mem] is the total amount of out-of-heap memory, [mem_minor] is how much - of it should be counted against [max_minor]. */ - CAMLassert (mem_minor <= mem); - wosize = 1 + (bsz + sizeof(value) - 1) / sizeof(value); - if (wosize <= Max_young_wosize) { + if (wosize <= Max_young_wosize && mem <= caml_custom_minor_max_bsz) { result = caml_alloc_small(wosize, Custom_tag); Custom_ops_val(result) = ops; if (ops->finalize != NULL || mem != 0) { - if (mem > mem_minor) { - caml_adjust_gc_speed (mem - mem_minor, max_major); - } - /* The remaining [mem_minor] will be counted if the block survives a - minor GC */ + /* Record the extra resources in case the block gets promoted. */ add_to_custom_table (&Caml_state->minor_tables->custom, result, mem, max_major); /* Keep track of extra resources held by custom block in minor heap. */ - if (mem_minor != 0) { - if (max_minor == 0) max_minor = 1; - Caml_state->extra_heap_resources_minor += - (double) mem_minor / (double) max_minor; - if (Caml_state->extra_heap_resources_minor > 1.0) { - caml_request_minor_gc (); - } + if (mem != 0) { + caml_adjust_minor_gc_speed (mem, max_minor); } } } else { @@ -79,36 +92,27 @@ static value alloc_custom_gen (const struct custom_operations * ops, CAMLreturn(result); } +Caml_inline mlsize_t get_max_minor (void) +{ + return + Bsize_wsize (Caml_state->minor_heap_wsz) / 100 * caml_custom_minor_ratio; +} + CAMLexport value caml_alloc_custom(const struct custom_operations * ops, uintnat bsz, mlsize_t mem, mlsize_t max) { - return alloc_custom_gen (ops, bsz, mem, max, mem, max); + mlsize_t max_major = max; + mlsize_t max_minor = max == 0 ? get_max_minor() : max; + return alloc_custom_gen (ops, bsz, mem, max_major, max_minor); } CAMLexport value caml_alloc_custom_mem(const struct custom_operations * ops, uintnat bsz, mlsize_t mem) { - - mlsize_t mem_minor = - mem < caml_custom_minor_max_bsz ? mem : caml_custom_minor_max_bsz; - mlsize_t max_major = - /* The major ratio is a percentage relative to the major heap size. - A complete GC cycle will be done every time 2/3 of that much memory - is allocated for blocks in the major heap. Assuming constant - allocation and deallocation rates, this means there are at most - [M/100 * major-heap-size] bytes of floating garbage at any time. - The reason for a factor of 2/3 (or 1.5) is, roughly speaking, because - the major GC takes 1.5 cycles (previous cycle + marking phase) before - it starts to deallocate dead blocks allocated during the previous cycle. - [heap_size / 150] is really [heap_size * (2/3) / 100] (but faster). */ - caml_heap_size(Caml_state->shared_heap) / 150 * caml_custom_major_ratio; - mlsize_t max_minor = - Bsize_wsize (Caml_state->minor_heap_wsz) / 100 * caml_custom_minor_ratio; - value v = alloc_custom_gen (ops, bsz, mem, max_major, mem_minor, max_minor); - return v; + return alloc_custom_gen (ops, bsz, mem, 0, get_max_minor()); } struct custom_operations_list { diff --git a/runtime/domain.c b/runtime/domain.c index 0c5b4963613..2009a131f3d 100644 --- a/runtime/domain.c +++ b/runtime/domain.c @@ -20,10 +20,14 @@ #define _GNU_SOURCE /* For sched.h CPU_ZERO(3) and CPU_COUNT(3) */ #include "caml/config.h" +#include #include +#ifdef HAS_UNISTD #include +#endif #include #include +#include #ifdef HAS_GNU_GETAFFINITY_NP #include #ifdef HAS_PTHREAD_NP_H @@ -64,6 +68,13 @@ typedef cpuset_t cpu_set_t; #include "caml/sync.h" #include "caml/weak.h" +/* Check that the domain_state structure was laid out without padding, + since the runtime assumes this in computing offsets */ +static_assert( + offsetof(caml_domain_state, LAST_DOMAIN_STATE_MEMBER) == + (Domain_state_num_fields - 1) * 8, + ""); + /* The runtime can run stop-the-world (STW) sections, during which all active domains run the same callback in parallel (with a barrier mechanism to synchronize within the callback). @@ -141,7 +152,10 @@ typedef cpuset_t cpu_set_t; /* control of STW interrupts */ struct interruptor { - atomic_uintnat* interrupt_word; + /* The outermost atomic is for synchronization with + caml_interrupt_all_signal_safe. The innermost atomic is also for + cross-domain communication.*/ + _Atomic(atomic_uintnat *) interrupt_word; caml_plat_mutex lock; caml_plat_cond cond; @@ -205,7 +219,7 @@ static caml_plat_mutex all_domains_lock = CAML_PLAT_MUTEX_INITIALIZER; static caml_plat_cond all_domains_cond = CAML_PLAT_COND_INITIALIZER(&all_domains_lock); static atomic_uintnat /* dom_internal* */ stw_leader = 0; -static struct dom_internal all_domains[Max_domains]; +static dom_internal all_domains[Max_domains]; CAMLexport atomic_uintnat caml_num_domains_running; @@ -245,19 +259,22 @@ static struct { { 0 } }; -static void add_to_stw_domains(dom_internal* dom) { - int i; +static void add_next_to_stw_domains(void) +{ CAMLassert(stw_domains.participating_domains < Max_domains); - for(i=stw_domains.participating_domains; stw_domains.domains[i]!=dom; ++i) { - CAMLassert(iinterrupt_word, (uintnat)(-1)); + atomic_uintnat * interrupt_word = atomic_load_relaxed(&s->interrupt_word); + atomic_store_release(interrupt_word, UINTNAT_MAX); +} + +Caml_inline void interrupt_domain_local(caml_domain_state* dom_st) +{ + atomic_store_relaxed(&dom_st->young_limit, UINTNAT_MAX); } int caml_incoming_interrupts_queued(void) @@ -585,8 +608,14 @@ static void domain_create(uintnat initial_minor_heap_wsize) { caml_state = domain_state; + domain_state->young_limit = 0; + /* Synchronized with [caml_interrupt_all_signal_safe], so that the + initializing write of young_limit happens before any + interrupt. */ + atomic_store_explicit(&s->interrupt_word, &domain_state->young_limit, + memory_order_release); + s->unique_id = fresh_domain_unique_id(); - s->interrupt_word = &domain_state->young_limit; s->running = 1; atomic_fetch_add(&caml_num_domains_running, 1); @@ -650,7 +679,7 @@ static void domain_create(uintnat initial_minor_heap_wsize) { domain_state->c_stack = NULL; domain_state->exn_handler = NULL; - domain_state->action_pending = 0; + domain_state->action_pending = false; domain_state->gc_regs_buckets = NULL; domain_state->gc_regs = NULL; @@ -687,7 +716,7 @@ static void domain_create(uintnat initial_minor_heap_wsize) { #endif caml_reset_young_limit(domain_state); - add_to_stw_domains(domain_self); + add_next_to_stw_domains(); goto domain_init_complete; alloc_main_stack_failure: @@ -734,7 +763,7 @@ CAMLexport void caml_reset_domain_lock(void) /* minor heap initialization and resizing */ -static void reserve_minor_heaps(void) { +static void reserve_minor_heaps_from_stw_single(void) { void* heaps_base; uintnat minor_heap_reservation_bsize; uintnat minor_heap_max_bsz; @@ -746,8 +775,7 @@ static void reserve_minor_heaps(void) { minor_heap_reservation_bsize = minor_heap_max_bsz * Max_domains; /* reserve memory space for minor heaps */ - heaps_base = caml_mem_map(minor_heap_reservation_bsize, caml_plat_pagesize, - 1 /* reserve_only */); + heaps_base = caml_mem_map(minor_heap_reservation_bsize, 1 /* reserve_only */); if (heaps_base == NULL) caml_fatal_error("Not enough heap memory to reserve minor heaps"); @@ -771,7 +799,7 @@ static void reserve_minor_heaps(void) { } } -static void unreserve_minor_heaps(void) { +static void unreserve_minor_heaps_from_stw_single(void) { uintnat size; caml_gc_log("unreserve_minor_heaps"); @@ -823,16 +851,16 @@ static void stw_resize_minor_heap_reservation(caml_domain_state* domain, caml_gc_log("stw_resize_minor_heap_reservation: " "unreserve_minor_heaps"); - unreserve_minor_heaps(); + unreserve_minor_heaps_from_stw_single(); /* new_minor_wsz is page-aligned because caml_norm_minor_heap_size has been called to normalize it earlier. */ caml_minor_heap_max_wsz = new_minor_wsz; caml_gc_log("stw_resize_minor_heap_reservation: reserve_minor_heaps"); - reserve_minor_heaps(); - /* The call to [reserve_minor_heaps] makes a new reservation, - and it also updates the reservation boundaries of each domain - by mutating its [minor_heap_area_start{,_end}] variables. + reserve_minor_heaps_from_stw_single(); + /* The call to [reserve_minor_heaps_from_stw_single] makes a new + reservation, and it also updates the reservation boundaries of each + domain by mutating its [minor_heap_area_start{,_end}] variables. These variables are synchronized by the fact that we are inside a STW section: no other domains are running in parallel, and @@ -868,7 +896,9 @@ void caml_update_minor_heap_max(uintnat requested_wsz) { void caml_init_domains(uintnat minor_heap_wsz) { int i; - reserve_minor_heaps(); + reserve_minor_heaps_from_stw_single(); + /* stw_single: mutators and domains have not started yet. */ + for (i = 0; i < Max_domains; i++) { struct dom_internal* dom = &all_domains[i]; @@ -876,7 +906,7 @@ void caml_init_domains(uintnat minor_heap_wsz) { dom->id = i; - dom->interruptor.interrupt_word = 0; + dom->interruptor.interrupt_word = NULL; caml_plat_mutex_init(&dom->interruptor.lock); caml_plat_cond_init(&dom->interruptor.cond, &dom->interruptor.lock); @@ -944,10 +974,6 @@ struct domain_startup_params { struct domain_ml_values* ml_values; /* in */ dom_internal* newdom; /* out */ uintnat unique_id; /* out */ -#ifndef _WIN32 - /* signal mask to set after it is safe to do so */ - sigset_t* mask; /* in */ -#endif }; static void* backup_thread_func(void* v) @@ -1017,14 +1043,17 @@ static void install_backup_thread (dom_internal* di) #endif if (di->backup_thread_running == 0) { - CAMLassert (di->backup_thread_msg == BT_INIT || /* Using fresh domain */ - di->backup_thread_msg == BT_TERMINATE); /* Reusing domain */ + uintnat msg; + msg = atomic_load_acquire(&di->backup_thread_msg); + CAMLassert (msg == BT_INIT || /* Using fresh domain */ + msg == BT_TERMINATE); /* Reusing domain */ - while (atomic_load_acquire(&di->backup_thread_msg) != BT_INIT) { + while (msg != BT_INIT) { /* Give a chance for backup thread on this domain to terminate */ caml_plat_unlock (&di->domain_lock); cpu_relax (); caml_plat_lock (&di->domain_lock); + msg = atomic_load_acquire(&di->backup_thread_msg); } #ifndef _WIN32 @@ -1119,11 +1148,9 @@ static void* domain_thread_func(void* v) { struct domain_startup_params* p = v; struct domain_ml_values *ml_values = p->ml_values; -#ifndef _WIN32 - sigset_t mask = *(p->mask); - void * signal_stack; - signal_stack = caml_init_signal_stack(); +#ifndef _WIN32 + void * signal_stack = caml_init_signal_stack(); if (signal_stack == NULL) { caml_fatal_error("Failed to create domain: signal stack"); } @@ -1148,11 +1175,6 @@ static void* domain_thread_func(void* v) if (domain_self) { install_backup_thread(domain_self); -#ifndef _WIN32 - /* It is now safe for us to handle signals */ - pthread_sigmask(SIG_SETMASK, &mask, NULL); -#endif - caml_gc_log("Domain starting (unique_id = %"ARCH_INTNAT_PRINTF_FORMAT"u)", domain_self->interruptor.unique_id); CAML_EV_LIFECYCLE(EV_DOMAIN_SPAWN, getpid()); @@ -1201,9 +1223,6 @@ CAMLprim value caml_domain_spawn(value callback, value term_sync) struct domain_startup_params p; pthread_t th; int err; -#ifndef _WIN32 - sigset_t mask, old_mask; -#endif #ifndef NATIVE_CODE if (caml_debugger_in_use) @@ -1217,20 +1236,7 @@ CAMLprim value caml_domain_spawn(value callback, value term_sync) sizeof(struct domain_ml_values)); init_domain_ml_values(p.ml_values, callback, term_sync); -/* We block all signals while we spawn the new domain. This is because - pthread_create inherits the current signals set, and we want to avoid a - signal handler being triggered in the new domain before the domain_state is - fully populated. */ -#ifndef _WIN32 - sigfillset(&mask); - pthread_sigmask(SIG_BLOCK, &mask, &old_mask); - p.mask = &old_mask; -#endif err = pthread_create(&th, 0, domain_thread_func, (void*)&p); -#ifndef _WIN32 - /* We can restore the signal mask we had initially now. */ - pthread_sigmask(SIG_SETMASK, &old_mask, NULL); -#endif if (err) { caml_failwith("failed to create domain thread"); @@ -1586,26 +1592,61 @@ int caml_try_run_on_all_domains_async( leader_setup, 0, 0); } -void caml_interrupt_self(void) { - interrupt_domain(&domain_self->interruptor); +void caml_interrupt_self(void) +{ + interrupt_domain_local(Caml_state); } +/* async-signal-safe */ +void caml_interrupt_all_signal_safe(void) +{ + for (dom_internal *d = all_domains; d < &all_domains[Max_domains]; d++) { + /* [all_domains] is an array of values. So we can access + [interrupt_word] directly without synchronisation other than + with other people who access the same [interrupt_word].*/ + atomic_uintnat * interrupt_word = + atomic_load_acquire(&d->interruptor.interrupt_word); + /* Early exit: if the current domain was never initialized, then + neither have been any of the remaining ones. */ + if (interrupt_word == NULL) return; + interrupt_domain(&d->interruptor); + } +} + +/* To avoid any risk of forgetting an action through a race, + [caml_reset_young_limit] is the only way (apart from setting + young_limit to -1 for immediate interruption) through which + [young_limit] can be modified. We take care here of possible + races. */ void caml_reset_young_limit(caml_domain_state * dom_st) { - CAMLassert ((uintnat)dom_st->young_ptr > (uintnat)dom_st->young_trigger); - /* An interrupt might have been queued in the meanwhile; this - achieves the proper synchronisation. */ + CAMLassert ((uintnat)dom_st->young_ptr >= (uintnat)dom_st->young_trigger); + /* An interrupt might have been queued in the meanwhile; the + atomic_exchange achieves the proper synchronisation with the + reads that follow (an atomic_store is not enough). */ atomic_exchange(&dom_st->young_limit, (uintnat)dom_st->young_trigger); + /* In case of actions that we never delay, interrupt the domain + again immediately. */ dom_internal * d = &all_domains[dom_st->id]; if (atomic_load_relaxed(&d->interruptor.interrupt_pending) || dom_st->requested_minor_gc || dom_st->requested_major_slice || dom_st->major_slice_epoch < atomic_load (&caml_major_slice_epoch) - || atomic_load_relaxed(&dom_st->requested_external_interrupt) - || dom_st->action_pending) { - atomic_store_release(&dom_st->young_limit, (uintnat)-1); - CAMLassert(caml_check_gc_interrupt(dom_st)); + || atomic_load_relaxed(&dom_st->requested_external_interrupt)) { + interrupt_domain_local(dom_st); } + /* We might be here due to a recently-recorded signal, so we + need to remember that we must run signal handlers. In + addition, in the case of long-running C code (that may + regularly poll with caml_process_pending_actions), we want to + force a query of all callbacks at every minor collection or + major slice (similarly to the OCaml behaviour). */ + caml_set_action_pending(dom_st); +} + +void caml_update_young_limit_after_c_call(caml_domain_state * dom_st) +{ + if (CAMLunlikely(dom_st->action_pending)) interrupt_domain_local(dom_st); } Caml_inline void advance_global_major_slice_epoch (caml_domain_state* d) @@ -1621,34 +1662,15 @@ Caml_inline void advance_global_major_slice_epoch (caml_domain_state* d) if (old_value != atomic_load (&caml_minor_collections_count)) { /* This domain is the first one to use up half of its minor heap arena in this minor cycle. Trigger major slice on other domains. */ - if (caml_plat_try_lock(&all_domains_lock)) { - /* Note that this interrupt is best-effort. If we get the lock, - then interrupt all the domains. If not, either some other domain - is calling for a stop-the-world section interrupting all the - domains, or a domain is being created or terminated. All of these - actions also try to lock [all_domains_lock] mutex, and the above - lock acquisition may fail. - - If we don't get the lock, we don't interrupt other domains. This is - acceptable since it does not affect safety but only liveness -- the - speed of the major gc. The other domains may themselves fill half of - their minor heap triggering a major slice, or will certainly do a - major slice right after their next minor GC when they observe that - their domain-local [Caml_state->major_slice_epoch] is less than the - global one [caml_major_slice_epoch]. */ - for(int i = 0; i < stw_domains.participating_domains; i++) { - dom_internal * di = stw_domains.domains[i]; - if (di->state != d) interrupt_domain(&di->interruptor); - } - caml_plat_unlock (&all_domains_lock); - } + caml_interrupt_all_signal_safe(); } } -static void global_major_slice_callback (caml_domain_state *domain, - void *unused, - int participating_count, - caml_domain_state **participating) +static void stw_global_major_slice( + caml_domain_state *domain, + void *unused, + int participating_count, + caml_domain_state **participating) { domain->requested_major_slice = 1; /* Nothing else to do, as [stw_hander] will call [caml_poll_gc_work] @@ -1703,7 +1725,7 @@ void caml_poll_gc_work(void) if (d->requested_global_major_slice) { if (caml_try_run_on_all_domains_async( - &global_major_slice_callback, NULL, NULL)){ + &stw_global_major_slice, NULL, NULL)){ d->requested_global_major_slice = 0; } /* If caml_try_run_on_all_domains_async fails, we'll try again next time @@ -1797,41 +1819,18 @@ static void caml_atfork_default(void) CAMLexport void (*caml_atfork_hook)(void) = caml_atfork_default; -static void handover_ephemerons(caml_domain_state* domain_state) -{ - if (domain_state->ephe_info->todo == 0 && - domain_state->ephe_info->live == 0 && - domain_state->ephe_info->must_sweep_ephe == 0) - return; - - caml_add_to_orphaned_ephe_list(domain_state->ephe_info); - CAMLassert (domain_state->ephe_info->live == 0); - CAMLassert (domain_state->ephe_info->todo == 0); +static inline int domain_terminating(dom_internal *d) { + return d->interruptor.terminating; } -static void handover_finalisers(caml_domain_state* domain_state) +int caml_domain_terminating (caml_domain_state *dom_st) { - struct caml_final_info* f = domain_state->final_info; - - if (f->todo_head != NULL || f->first.size != 0 || f->last.size != 0) { - /* have some final structures */ - if (caml_gc_phase != Phase_sweep_and_mark_main) { - /* Force a major GC cycle to simplify constraints for - * handing over finalisers. */ - caml_finish_major_cycle(); - CAMLassert(caml_gc_phase == Phase_sweep_and_mark_main); - } - caml_add_orphaned_finalisers (f); - /* Create a dummy final info */ - domain_state->final_info = caml_alloc_final_info(); - } - caml_final_domain_terminate(domain_state); + return domain_terminating(&all_domains[dom_st->id]); } int caml_domain_is_terminating (void) { - struct interruptor* s = &domain_self->interruptor; - return s->terminating; + return domain_terminating(domain_self); } static void domain_terminate (void) @@ -1839,19 +1838,10 @@ static void domain_terminate (void) caml_domain_state* domain_state = domain_self->state; struct interruptor* s = &domain_self->interruptor; int finished = 0; -#ifndef _WIN32 - sigset_t mask; -#endif caml_gc_log("Domain terminating"); s->terminating = 1; -#ifndef _WIN32 - /* Block all signals so that signal handlers do not run on this thread */ - sigfillset(&mask); - pthread_sigmask(SIG_BLOCK, &mask, NULL); -#endif - /* Join ongoing systhreads, if necessary, and then run user-defined termination hooks. No OCaml code can run on this domain after this. */ @@ -1866,21 +1856,22 @@ static void domain_terminate (void) STW sections that has sent an interrupt to this domain. */ caml_finish_marking(); - handover_ephemerons(domain_state); - handover_finalisers(domain_state); + + caml_orphan_ephemerons(domain_state); + caml_orphan_finalisers(domain_state); /* take the all_domains_lock to try and exit the STW participant set without racing with a STW section being triggered */ caml_plat_lock(&all_domains_lock); /* The interaction of termination and major GC is quite subtle. - * - * At the end of the major GC, we decide the number of domains to mark and - * sweep for the next cycle. If a STW section has been started, it will - * require this domain to participate, which in turn could involve a - * major GC cycle. This would then require finish marking and sweeping - * again in order to decrement the globals [num_domains_to_mark] and - * [num_domains_to_sweep] (see major_gc.c). + + At the end of the major GC, we decide the number of domains to mark and + sweep for the next cycle. If a STW section has been started, it will + require this domain to participate, which in turn could involve a major + GC cycle. This would then require finish marking and sweeping again in + order to decrement the globals [num_domains_to_mark] and + [num_domains_to_sweep] (see major_gc.c). */ if (!caml_incoming_interrupts_queued() && @@ -1923,13 +1914,13 @@ static void domain_terminate (void) domain_state->minor_tables = 0; caml_orphan_alloc_stats(domain_state); - /* Heap stats were orphaned by caml_teardown_shared_heap above. - At this point, the stats of the domain must be empty; - we also clear the sampled copy. + /* Heap stats were orphaned by [caml_teardown_shared_heap] above. + At this point, the stats of the domain must be empty. - Note: We cannot call caml_collect_gc_stats_sample to clear the - sample at this point as the shared heap is gone. */ - caml_clear_gc_stats_sample(domain_state); + The sampled copy was also cleared by the minor collection(s) + performed above at [caml_empty_minor_heaps_once()], see the + termination-specific logic in [caml_collect_gc_stats_sample_stw]. + */ /* TODO: can this ever be NULL? can we remove this check? */ if(domain_state->current_stack != NULL) { diff --git a/runtime/dune b/runtime/dune index 9880c4fb4e3..a22d72dfc88 100644 --- a/runtime/dune +++ b/runtime/dune @@ -13,7 +13,7 @@ ;************************************************************************** (rule - (targets primitives) + (targets primitives prims.c) (mode fallback) (deps ; matches the line structure of files in gen_primitives.sh @@ -25,8 +25,9 @@ runtime_events.c sync.c dynlink.c backtrace_byt.c backtrace.c afl.c bigarray.c prng.c) (action - (chdir .. - (with-stdout-to %{targets} (run %{dep:gen_primitives.sh}))))) + (progn + (with-stdout-to primitives (run %{dep:gen_primitives.sh} %{deps})) + (with-stdout-to prims.c (run %{dep:gen_primsc.sh} primitives %{deps}))))) (rule (targets libcamlrun.a) diff --git a/runtime/dynlink_nat.c b/runtime/dynlink_nat.c index 54df6ff3484..5a5da9742aa 100644 --- a/runtime/dynlink_nat.c +++ b/runtime/dynlink_nat.c @@ -39,6 +39,13 @@ CAMLexport void (*caml_natdynlink_hook)(void* handle, const char* unit) = NULL; #include #include +/* This should match the value of Compilenv.symbol_separator */ +#ifdef _MSC_VER +#define CAML_SYM_SEPARATOR "$" +#else +#define CAML_SYM_SEPARATOR "." +#endif + #define Handle_val(v) (*((void **) Data_abstract_val(v))) static value Val_handle(void* handle) { value res = caml_alloc_small(1, Abstract_tag); @@ -47,7 +54,8 @@ static value Val_handle(void* handle) { } static void *getsym(void *handle, const char *module, const char *name){ - char *fullname = caml_stat_strconcat(4, "caml", module, ".", name); + char *fullname; + fullname = caml_stat_strconcat(4, "caml", module, CAML_SYM_SEPARATOR, name); void *sym; sym = caml_dlsym (handle, fullname); /* printf("%s => %lx\n", fullname, (uintnat) sym); */ @@ -166,7 +174,7 @@ CAMLprim value caml_natdynlink_run(value handle_v, value symbol) { CAMLprim value caml_natdynlink_run_toplevel(value filename, value symbol) { CAMLparam2 (filename, symbol); - CAMLlocal3 (res, v, handle_v); + CAMLlocal4 (res, v, handle_v, symbols); void *handle; char_os *p; @@ -184,10 +192,16 @@ CAMLprim value caml_natdynlink_run_toplevel(value filename, value symbol) Store_field(res, 0, v); } else { handle_v = Val_handle(handle); + + symbols = caml_alloc_small(1, 0); + Field(symbols, 0) = symbol; + (void) caml_natdynlink_register(handle_v, symbols); + res = caml_alloc(1,0); v = caml_natdynlink_run(handle_v, symbol); Store_field(res, 0, v); } + CAMLreturn(res); } diff --git a/runtime/extern.c b/runtime/extern.c index 6d85fca4c11..d7bf239b082 100644 --- a/runtime/extern.c +++ b/runtime/extern.c @@ -120,14 +120,14 @@ struct caml_extern_state { struct output_block * extern_output_block; }; -static void extern_init_stack(struct caml_extern_state* s) +static void init_extern_stack(struct caml_extern_state* s) { /* (Re)initialize the globals for next time around */ s->extern_stack = s->extern_stack_init; s->extern_stack_limit = s->extern_stack + EXTERN_STACK_INIT_SIZE; } -static struct caml_extern_state* prepare_extern_state (void) +static struct caml_extern_state* init_extern_state (void) { Caml_check_caml_state(); struct caml_extern_state* s; @@ -141,7 +141,7 @@ static struct caml_extern_state* prepare_extern_state (void) s->obj_counter = 0; s->size_32 = 0; s->size_64 = 0; - extern_init_stack(s); + init_extern_stack(s); Caml_state->extern_state = s; return s; @@ -153,8 +153,8 @@ static struct caml_extern_state* get_extern_state (void) if (Caml_state->extern_state == NULL) caml_fatal_error ( - "extern_state not initialized:" - "this function can only be called from a `caml_output_*` entrypoint." + "extern_state not initialized: it is likely that a caml_serialize_* " + "function was called without going through caml_output_*." ); return Caml_state->extern_state; @@ -170,14 +170,14 @@ void caml_free_extern_state (void) /* Forward declarations */ -static CAMLnoret void extern_out_of_memory(struct caml_extern_state* s); +CAMLnoret static void extern_out_of_memory(struct caml_extern_state* s); -static CAMLnoret +CAMLnoret static void extern_invalid_argument(struct caml_extern_state* s, char *msg); -static CAMLnoret void extern_failwith(struct caml_extern_state* s, char *msg); +CAMLnoret static void extern_failwith(struct caml_extern_state* s, char *msg); -static CAMLnoret void extern_stack_overflow(struct caml_extern_state* s); +CAMLnoret static void extern_stack_overflow(struct caml_extern_state* s); static void free_extern_output(struct caml_extern_state* s); @@ -186,9 +186,8 @@ static void extern_free_stack(struct caml_extern_state* s) /* Free the extern stack if needed */ if (s->extern_stack != s->extern_stack_init) { caml_stat_free(s->extern_stack); + init_extern_stack(s); } - - extern_init_stack(s); } static struct extern_item * extern_resize_stack(struct caml_extern_state* s, @@ -1077,7 +1076,7 @@ void caml_output_val(struct channel *chan, value v, value flags) char header[MAX_INTEXT_HEADER_SIZE]; int header_len; struct output_block * blk, * nextblk; - struct caml_extern_state* s = prepare_extern_state (); + struct caml_extern_state* s = init_extern_state (); if (! caml_channel_binary_mode(chan)) caml_failwith("output_value: not a binary channel"); @@ -1115,7 +1114,7 @@ CAMLprim value caml_output_value_to_bytes(value v, value flags) intnat data_len, ofs; value res; struct output_block * blk, * nextblk; - struct caml_extern_state* s = prepare_extern_state (); + struct caml_extern_state* s = init_extern_state (); init_extern_output(s); data_len = extern_value(s, v, flags, header, &header_len); @@ -1148,7 +1147,7 @@ CAMLexport intnat caml_output_value_to_block(value v, value flags, char header[MAX_INTEXT_HEADER_SIZE]; int header_len; intnat data_len; - struct caml_extern_state* s = prepare_extern_state (); + struct caml_extern_state* s = init_extern_state (); /* At this point we don't know the size of the header. Guess that it is small, and fix up later if not. */ @@ -1185,11 +1184,11 @@ CAMLexport void caml_output_value_to_malloc(value v, value flags, intnat data_len; char * res; struct output_block * blk, * nextblk; - struct caml_extern_state* s = prepare_extern_state (); + struct caml_extern_state* s = init_extern_state (); init_extern_output(s); data_len = extern_value(s, v, flags, header, &header_len); - res = caml_stat_alloc_noexc(header_len + data_len); + res = malloc(header_len + data_len); if (res == NULL) extern_out_of_memory(s); *buf = res; *len = header_len + data_len; @@ -1345,7 +1344,7 @@ CAMLprim value caml_obj_reachable_words(value v) struct extern_item * sp; uintnat h = 0; uintnat pos = 0; - struct caml_extern_state *s = prepare_extern_state (); + struct caml_extern_state *s = init_extern_state (); s->obj_counter = 0; s->extern_flags = 0; diff --git a/runtime/fail_nat.c b/runtime/fail_nat.c index 3e5dac3f73b..744934fb09b 100644 --- a/runtime/fail_nat.c +++ b/runtime/fail_nat.c @@ -53,7 +53,7 @@ extern caml_generated_constant /* Exception raising */ -extern CAMLnoret +CAMLnoret extern void caml_raise_exception (caml_domain_state* state, value bucket); void caml_raise(value v) diff --git a/runtime/fiber.c b/runtime/fiber.c index a6301f7c776..15734cd6bbe 100644 --- a/runtime/fiber.c +++ b/runtime/fiber.c @@ -18,8 +18,12 @@ #define CAML_INTERNALS +#include "caml/config.h" #include +#ifdef HAS_UNISTD #include +#endif +#include #include "caml/alloc.h" #include "caml/callback.h" #include "caml/codefrag.h" @@ -46,6 +50,8 @@ #define fiber_debug_log(...) #endif +static_assert(sizeof(struct stack_info) == Stack_ctx_words * sizeof(value), ""); + static _Atomic int64_t fiber_id = 0; uintnat caml_get_init_stack_wsize (void) @@ -143,8 +149,8 @@ alloc_size_class_stack_noexc(mlsize_t wosize, int cache_bucket, value hval, struct stack_handler* hand; struct stack_info **cache = Caml_state->stack_cache; - CAML_STATIC_ASSERT(sizeof(struct stack_info) % sizeof(value) == 0); - CAML_STATIC_ASSERT(sizeof(struct stack_handler) % sizeof(value) == 0); + static_assert(sizeof(struct stack_info) % sizeof(value) == 0, ""); + static_assert(sizeof(struct stack_handler) % sizeof(value) == 0, ""); CAMLassert(cache != NULL); diff --git a/runtime/floats.c b/runtime/floats.c index 2048fd31250..a174db132a2 100644 --- a/runtime/floats.c +++ b/runtime/floats.c @@ -1100,16 +1100,6 @@ CAMLprim value caml_signbit_float(value f) return caml_signbit(Double_val(f)); } -CAMLprim value caml_neq_float(value f, value g) -{ - return Val_bool(Double_val(f) != Double_val(g)); -} - -#define DEFINE_NAN_CMP(op) (value f, value g) \ -{ \ - return Val_bool(Double_val(f) op Double_val(g)); \ -} - intnat caml_float_compare_unboxed(double f, double g) { /* If one or both of f and g is NaN, order according to the convention @@ -1124,11 +1114,15 @@ intnat caml_float_compare_unboxed(double f, double g) return res; } -CAMLprim value caml_eq_float DEFINE_NAN_CMP(==) -CAMLprim value caml_le_float DEFINE_NAN_CMP(<=) -CAMLprim value caml_lt_float DEFINE_NAN_CMP(<) -CAMLprim value caml_ge_float DEFINE_NAN_CMP(>=) -CAMLprim value caml_gt_float DEFINE_NAN_CMP(>) +#define FLOAT_CMP(op, f, g) \ + return Val_bool(Double_val(f) op Double_val(g)); + +CAMLprim value caml_neq_float(value f, value g) { FLOAT_CMP(!=, f, g) } +CAMLprim value caml_eq_float(value f, value g) { FLOAT_CMP(==, f, g) } +CAMLprim value caml_le_float(value f, value g) { FLOAT_CMP(<=, f, g) } +CAMLprim value caml_lt_float(value f, value g) { FLOAT_CMP(<, f, g) } +CAMLprim value caml_ge_float(value f, value g) { FLOAT_CMP(>=, f, g) } +CAMLprim value caml_gt_float(value f, value g) { FLOAT_CMP(>, f, g) } CAMLprim value caml_float_compare(value vf, value vg) { diff --git a/runtime/frame_descriptors.c b/runtime/frame_descriptors.c index 1c2169c0f44..5fee51bb25e 100644 --- a/runtime/frame_descriptors.c +++ b/runtime/frame_descriptors.c @@ -180,7 +180,7 @@ typedef struct frametable_array { int ntables; } frametable_array; -static void register_frametables(frametable_array *array) +static void register_frametables_from_stw_single(frametable_array *array) { caml_frametable_list *new_frametables = NULL; for (int i = 0; i < array->ntables; i++) @@ -198,7 +198,7 @@ static void stw_register_frametables( barrier_status b = caml_global_barrier_begin (); if (caml_global_barrier_is_final(b)) { - register_frametables((frametable_array*) frametables); + register_frametables_from_stw_single((frametable_array*) frametables); } caml_global_barrier_end(b); diff --git a/runtime/gc_ctrl.c b/runtime/gc_ctrl.c index 1b43aca8c86..28b6107ad4b 100644 --- a/runtime/gc_ctrl.c +++ b/runtime/gc_ctrl.c @@ -56,11 +56,12 @@ CAMLprim value caml_gc_quick_stat(value v) CAMLlocal1 (res); /* get a copy of these before allocating anything... */ - intnat majcoll, mincoll; + intnat majcoll, mincoll, compactions; struct gc_stats s; caml_compute_gc_stats(&s); majcoll = caml_major_cycles_completed; mincoll = atomic_load(&caml_minor_collections_count); + compactions = atomic_load(&caml_compactions_count); res = caml_alloc_tuple (17); Store_field (res, 0, caml_copy_double ((double)s.alloc_stats.minor_words)); @@ -81,7 +82,7 @@ CAMLprim value caml_gc_quick_stat(value v) Store_field (res, 10, Val_long (0)); Store_field (res, 11, Val_long (0)); Store_field (res, 12, Val_long (s.heap_stats.pool_frag_words)); - Store_field (res, 13, Val_long (0)); + Store_field (res, 13, Val_long (compactions)); Store_field (res, 14, Val_long ( s.heap_stats.pool_max_words + s.heap_stats.large_max_words)); Store_field (res, 15, Val_long (0)); @@ -239,12 +240,12 @@ CAMLprim value caml_gc_minor(value v) return caml_raise_if_exception(exn); } -static value gc_major_exn(void) +static value gc_major_exn(int force_compaction) { CAML_EV_BEGIN(EV_EXPLICIT_GC_MAJOR); caml_gc_log ("Major GC cycle requested"); caml_empty_minor_heaps_once(); - caml_finish_major_cycle(); + caml_finish_major_cycle(force_compaction); value exn = caml_process_pending_actions_exn(); CAML_EV_END(EV_EXPLICIT_GC_MAJOR); return exn; @@ -254,7 +255,7 @@ CAMLprim value caml_gc_major(value v) { Caml_check_caml_state(); CAMLassert (v == Val_unit); - return caml_raise_if_exception(gc_major_exn()); + return caml_raise_if_exception(gc_major_exn(0)); } static value gc_full_major_exn(void) @@ -267,7 +268,7 @@ static value gc_full_major_exn(void) currently-unreachable object to be collected. */ for (i = 0; i < 3; i++) { caml_empty_minor_heaps_once(); - caml_finish_major_cycle(); + caml_finish_major_cycle(0); exn = caml_process_pending_actions_exn(); if (Is_exception_result(exn)) break; } @@ -296,13 +297,12 @@ CAMLprim value caml_gc_major_slice (value v) CAMLprim value caml_gc_compaction(value v) { Caml_check_caml_state(); - value exn = Val_unit; CAML_EV_BEGIN(EV_EXPLICIT_GC_COMPACT); CAMLassert (v == Val_unit); - exn = gc_major_exn(); + value exn = gc_major_exn(1); ++ Caml_state->stat_forced_major_collections; CAML_EV_END(EV_EXPLICIT_GC_COMPACT); - return exn; + return caml_raise_if_exception(exn); } CAMLprim value caml_gc_stat(value v) diff --git a/runtime/gc_stats.c b/runtime/gc_stats.c index f236476b9cf..f6011a81a9e 100644 --- a/runtime/gc_stats.c +++ b/runtime/gc_stats.c @@ -23,7 +23,6 @@ Caml_inline intnat intnat_max(intnat a, intnat b) { return (a > b ? a : b); } -CAMLno_tsan /* Disable TSan reports from this function (see #11040) */ void caml_accum_heap_stats(struct heap_stats* acc, const struct heap_stats* h) { acc->pool_words += h->pool_words; @@ -48,7 +47,6 @@ void caml_remove_heap_stats(struct heap_stats* acc, const struct heap_stats* h) acc->large_blocks -= h->large_blocks; } -CAMLno_tsan /* Disable TSan reports from this function (see #11040) */ void caml_accum_alloc_stats( struct alloc_stats* acc, const struct alloc_stats* s) @@ -106,23 +104,31 @@ void caml_orphan_alloc_stats(caml_domain_state *domain) { /* The "sampled stats" of a domain are a recent copy of its domain-local stats, accessed without synchronization and only updated ("sampled") during stop-the-world events -- each minor - collection, and on domain termination. */ + collection, including those happening during domain termination. */ static struct gc_stats sampled_gc_stats[Max_domains]; -/* Update the sampled stats for the given domain. */ -void caml_collect_gc_stats_sample(caml_domain_state* domain) +/* Update the sampled stats for the given domain during a STW section. */ +void caml_collect_gc_stats_sample_stw(caml_domain_state* domain) { struct gc_stats* stats = &sampled_gc_stats[domain->id]; - caml_collect_alloc_stats_sample(domain, &stats->alloc_stats); - caml_collect_heap_stats_sample(domain->shared_heap, &stats->heap_stats); -} - -void caml_clear_gc_stats_sample(caml_domain_state *domain) { - struct gc_stats* stats = &sampled_gc_stats[domain->id]; - memset(stats, 0, sizeof(*stats)); + if (caml_domain_terminating(domain)) { + /* If the domain is terminating, we should not update the sample + with accurate domain-local data, but instead clear the sample + so that a new domain spawning there in the future can start + with empty stats. + + The current stats will also be 'orphaned' during domain + termination, so they will remain accounted for in the global + statistics. (Orphaning right now would be correct but + insufficient as further stat updates may come after the current + STW section.) */ + memset(stats, 0, sizeof(*stats)); + } else { + caml_collect_alloc_stats_sample(domain, &stats->alloc_stats); + caml_collect_heap_stats_sample(domain->shared_heap, &stats->heap_stats); + } } -CAMLno_tsan /* Disable TSan reports from this function (see #11040) */ /* Compute global stats for the whole runtime. */ void caml_compute_gc_stats(struct gc_stats* buf) { diff --git a/runtime/gen_domain_state32_inc.awk b/runtime/gen_domain_state32_inc.awk deleted file mode 100644 index f84090232c5..00000000000 --- a/runtime/gen_domain_state32_inc.awk +++ /dev/null @@ -1,36 +0,0 @@ -#************************************************************************** -#* * -#* OCaml * -#* * -#* KC Sivaramakrishnan, Indian Institute of Technology, Madras * -#* * -#* Copyright 2019 Indian Institute of Technology, Madras * -#* * -#* All rights reserved. This file is distributed under the terms of * -#* the GNU Lesser General Public License version 2.1, with the * -#* special exception on linking described in the file LICENSE. * -#* * -#************************************************************************** - -BEGIN{FS="[,)] *";count=0}; -/DOMAIN_STATE/{ - print "Store_" $2 " MACRO reg1, reg2"; - print " mov [reg1+" count "], reg2"; - print "ENDM"; - print "Load_" $2 " MACRO reg1, reg2"; - print " mov reg2, [reg1+" count "]"; - print "ENDM"; - print "Push_" $2 " MACRO reg1"; - print " push [reg1+" count "]"; - print "ENDM"; - print "Pop_" $2 " MACRO reg1"; - print " pop [reg1+" count "]"; - print "ENDM"; - print "Cmp_" $2 " MACRO reg1, reg2"; - print " cmp reg2, [reg1+" count "]"; - print "ENDM"; - print "Sub_" $2 " MACRO reg1, reg2"; - print " sub reg2, [reg1+" count "]"; - print "ENDM"; - count+=8 -} diff --git a/runtime/gen_domain_state64_inc.awk b/runtime/gen_domain_state64_inc.awk deleted file mode 100644 index 8280d4d19f3..00000000000 --- a/runtime/gen_domain_state64_inc.awk +++ /dev/null @@ -1,33 +0,0 @@ -#************************************************************************** -#* * -#* OCaml * -#* * -#* KC Sivaramakrishnan, Indian Institute of Technology, Madras * -#* * -#* Copyright 2019 Indian Institute of Technology, Madras * -#* * -#* All rights reserved. This file is distributed under the terms of * -#* the GNU Lesser General Public License version 2.1, with the * -#* special exception on linking described in the file LICENSE. * -#* * -#************************************************************************** - -BEGIN{FS="[,)] *";count=0}; -/DOMAIN_STATE/{ - print "Store_" $2 " MACRO reg"; - print " mov [r14+" count "], reg"; - print "ENDM"; - print "Load_" $2 " MACRO reg"; - print " mov reg, [r14+" count "]"; - print "ENDM"; - print "Push_" $2 " MACRO"; - print " push [r14+" count "]"; - print "ENDM"; - print "Pop_" $2 " MACRO"; - print " pop [r14+" count "]"; - print "ENDM"; - print "Cmp_" $2 " MACRO reg"; - print " cmp reg, [r14+" count "]"; - print "ENDM"; - count+=8 -} diff --git a/runtime/gen_primitives.sh b/runtime/gen_primitives.sh index 767f27651c7..0fe676d496d 100755 --- a/runtime/gen_primitives.sh +++ b/runtime/gen_primitives.sh @@ -15,20 +15,29 @@ #* * #************************************************************************** -# #8985: the meaning of character range a-z depends on the locale, so force C -# locale throughout. +# If primitives contain duplicated lines (e.g. because the code is defined +# like +# #ifdef X +# CAMLprim value caml_foo() ... +# #else +# CAMLprim value caml_foo() ... +# #endif), horrible things will happen: duplicated entries in Runtimedef -> +# double registration in Symtable -> empty entry in the PRIM table -> +# the bytecode interpreter is confused. +# We sort the primitive file and remove duplicates to avoid this problem. + +# Warning: we use "sort | uniq" instead of "sort -u" because in the MSVC +# port, the "sort" program in the path is Microsoft's and not cygwin's + +# Warning: POSIX sort is locale dependent, that's why we set LC_ALL explicitly. +# Sort is unstable for "is_directory" and "isatty" +# see http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html: +# "using sort to process pathnames, it is recommended that LC_ALL .. set to C" + +# #8985: in sed, the meaning of character range a-z depends on the locale, +# so force C locale throughout. + export LC_ALL=C -( - for prim in \ - alloc array compare extern floats gc_ctrl hash intern interp ints io \ - lexing md5 meta memprof obj parsing signals str sys callback weak \ - finalise domain platform fiber memory startup_aux runtime_events sync \ - dynlink backtrace_byt backtrace afl \ - bigarray prng - do - sed -n -e 's/^CAMLprim value \([a-z0-9_][a-z0-9_]*\).*/\1/p' \ - "runtime/$prim.c" - done - sed -n -e 's/^CAMLprim_int64_[0-9](\([a-z0-9_][a-z0-9_]*\)).*/caml_int64_\1\ -caml_int64_\1_native/p' runtime/ints.c -) | sort | uniq + +sed -n -e 's/^CAMLprim value \([a-z][a-z0-9_]*\).*$/\1/p' "$@" | \ +sort | uniq diff --git a/runtime/gen_primsc.sh b/runtime/gen_primsc.sh new file mode 100755 index 00000000000..c18ab95a098 --- /dev/null +++ b/runtime/gen_primsc.sh @@ -0,0 +1,63 @@ +#!/bin/sh + +#************************************************************************** +#* * +#* OCaml * +#* * +#* Xavier Leroy, Collège de France and Inria * +#* * +#* Copyright 2023 Institut National de Recherche en Informatique et * +#* en Automatique. * +#* * +#* All rights reserved. This file is distributed under the terms of * +#* the GNU Lesser General Public License version 2.1, with the * +#* special exception on linking described in the file LICENSE. * +#* * +#************************************************************************** + +# Build the runtime/prims.c file, with proper C declarations of the primitives + +export LC_ALL=C + +case $# in + 0) echo "Usage: gen_primsc.sh <.c files>" 1>&2 + exit 2;; + *) primitives="$1"; shift;; +esac + +cat <<'EOF' +/* Generated file, do not edit */ + +#define CAML_INTERNALS +#include "caml/mlvalues.h" +#include "caml/prims.h" + +EOF + +# Extract the beginning of primitive definitions: +# from 'CAMLprim' at beginning of line to the first closing parenthesis. +# The first pattern below matches single-line definitions such as +# CAMLprim value foo(value x) { +# The second pattern matches multi-line definitions such as +# CAMLprim value foo(value x, +# value y) +sed -n \ + -e '/^CAMLprim value .*)/p' \ + -e '/^CAMLprim value [^)]*$/,/)/p' \ + "$@" | +# Transform these definitions into "CAMLextern" declarations +sed \ + -e 's/^CAMLprim /CAMLextern /' \ + -e 's/).*$/);/' + +# Generate the table of primitives +echo +echo 'const c_primitive caml_builtin_cprim[] = {' +sed -e 's/.*/ (c_primitive) &,/' "$primitives" +echo ' 0 };' + +# Generate the table of primitive names +echo +echo 'const char * const caml_names_of_builtin_cprim[] = {' +sed -e 's/.*/ "&",/' "$primitives" +echo ' 0 };' diff --git a/runtime/intern.c b/runtime/intern.c index db9cb4ac517..4d0f1c13440 100644 --- a/runtime/intern.c +++ b/runtime/intern.c @@ -67,7 +67,11 @@ struct caml_intern_state { unsigned char * intern_input; /* Pointer to beginning of block holding input data, - if non-NULL this pointer will be freed by the cleanup function. */ + if non-NULL this pointer will be freed by the cleanup function. + + Allocated using malloc/free instead of stat_alloc/stat_free to + satisfy the expectations of caml_input_value_from_malloc users. + */ asize_t obj_counter; /* Count how many objects seen so far */ @@ -91,8 +95,14 @@ struct caml_intern_state { /* 1 if the compressed format is in use, 0 otherwise */ }; -/* Allocates the domain local intern state if needed */ -static struct caml_intern_state* get_intern_state (void) +static void init_intern_stack(struct caml_intern_state* s) +{ + /* (Re)initialize the globals for next time around */ + s->intern_stack = s->intern_stack_init; + s->intern_stack_limit = s->intern_stack + INTERN_STACK_INIT_SIZE; +} + +static struct caml_intern_state* init_intern_state (void) { Caml_check_caml_state(); struct caml_intern_state* s; @@ -106,25 +116,38 @@ static struct caml_intern_state* get_intern_state (void) s->intern_input = NULL; s->obj_counter = 0; s->intern_obj_table = NULL; - s->intern_stack = s->intern_stack_init; - s->intern_stack_limit = s->intern_stack + INTERN_STACK_INIT_SIZE; s->intern_dest = NULL; + init_intern_stack(s); Caml_state->intern_state = s; return s; } +static struct caml_intern_state* get_intern_state (void) +{ + Caml_check_caml_state(); + + if (Caml_state->intern_state == NULL) + caml_fatal_error ( + "intern_state not initialized: it is likely that a caml_deserialize_* " + "function was called without going through caml_input_*." + ); + + return Caml_state->intern_state; +} + void caml_free_intern_state (void) { - if (Caml_state->intern_state != NULL) + if (Caml_state->intern_state != NULL) { caml_stat_free(Caml_state->intern_state); - Caml_state->intern_state = NULL; + Caml_state->intern_state = NULL; + } } static char * intern_resolve_code_pointer(unsigned char digest[16], asize_t offset); -static CAMLnoret void intern_bad_code_pointer(unsigned char digest[16]); +CAMLnoret static void intern_bad_code_pointer(unsigned char digest[16]); Caml_inline unsigned char read8u(struct caml_intern_state* s) { return *s->intern_src++; } @@ -220,16 +243,14 @@ static void intern_free_stack(struct caml_intern_state* s) { if (s->intern_stack != s->intern_stack_init) { caml_stat_free(s->intern_stack); - /* Reinitialize the globals for next time around */ - s->intern_stack = s->intern_stack_init; - s->intern_stack_limit = s->intern_stack + INTERN_STACK_INIT_SIZE; + init_intern_stack(s); } } static void intern_cleanup(struct caml_intern_state* s) { if (s->intern_input != NULL) { - caml_stat_free(s->intern_input); + free(s->intern_input); s->intern_input = NULL; } if (s->intern_obj_table != NULL) { @@ -259,7 +280,7 @@ static void readfloat(struct caml_intern_state* s, #else /* Host is neither big nor little; permute as appropriate */ if (code == CODE_DOUBLE_LITTLE) - Permute_64(dest, ARCH_FLOAT_ENDIANNESS, dest, 0x01234567) + Permute_64(dest, ARCH_FLOAT_ENDIANNESS, dest, 0x01234567); else Permute_64(dest, ARCH_FLOAT_ENDIANNESS, dest, 0x76543210); #endif @@ -301,7 +322,7 @@ static void readfloats(struct caml_intern_state* s, #endif } -static CAMLnoret void intern_stack_overflow(struct caml_intern_state* s) +CAMLnoret static void intern_stack_overflow(struct caml_intern_state* s) { caml_gc_message (0x04, "Stack overflow in un-marshaling value\n"); intern_cleanup(s); @@ -395,8 +416,7 @@ static value intern_alloc_obj(struct caml_intern_state* s, caml_domain_state* d, s->intern_dest += 1 + wosize; } else { p = caml_shared_try_alloc(d->shared_heap, wosize, tag, - 0, /* no reserved bits */ - 0 /* not pinned */); + 0 /* no reserved bits */); d->allocated_words += Whsize_wosize(wosize); if (p == NULL) { intern_cleanup (s); @@ -793,7 +813,7 @@ static void intern_decompress_input(struct caml_intern_state * s, s->compressed = h->compressed; if (! h->compressed) return; #ifdef HAS_ZSTD - unsigned char * blk = caml_stat_alloc_noexc(h->uncompressed_data_len); + unsigned char * blk = malloc(h->uncompressed_data_len); if (blk == NULL) { intern_cleanup(s); caml_raise_out_of_memory(); @@ -801,11 +821,11 @@ static void intern_decompress_input(struct caml_intern_state * s, size_t res = ZSTD_decompress(blk, h->uncompressed_data_len, s->intern_src, h->data_len); if (res != h->uncompressed_data_len) { - caml_stat_free(blk); + free(blk); intern_cleanup(s); intern_failwith2(fun_name, "decompression error"); } - if (s->intern_input != NULL) caml_stat_free(s->intern_input); + if (s->intern_input != NULL) free(s->intern_input); s->intern_input = blk; /* to be freed at end of demarshaling */ s->intern_src = blk; #else @@ -823,7 +843,7 @@ value caml_input_val(struct channel *chan) struct marshal_header h; char * block; value res; - struct caml_intern_state* s = get_intern_state (); + struct caml_intern_state* s = init_intern_state (); if (! caml_channel_binary_mode(chan)) caml_failwith("input_value: not a binary channel"); @@ -855,9 +875,12 @@ value caml_input_val(struct channel *chan) can take place (via context switching in systhreads), and the context [s] may change. So, wait until all I/O is over before using the context [s] again. */ - block = caml_stat_alloc(h.data_len); + block = malloc(h.data_len); + if (block == NULL) { + caml_raise_out_of_memory(); + } if (caml_really_getblock(chan, block, h.data_len) < h.data_len) { - caml_stat_free(block); + free(block); caml_failwith("input_value: truncated object"); } /* Initialize global state */ @@ -894,7 +917,7 @@ CAMLexport value caml_input_val_from_bytes(value str, intnat ofs) CAMLparam1 (str); CAMLlocal1 (obj); struct marshal_header h; - struct caml_intern_state* s = get_intern_state (); + struct caml_intern_state* s = init_intern_state (); /* Initialize global state */ intern_init(s, &Byte_u(str, ofs), NULL); @@ -932,7 +955,7 @@ static value input_val_from_block(struct caml_intern_state* s, CAMLexport value caml_input_value_from_malloc(char * data, intnat ofs) { struct marshal_header h; - struct caml_intern_state* s = get_intern_state (); + struct caml_intern_state* s = init_intern_state (); intern_init(s, data + ofs, data); caml_parse_header(s, "input_value_from_malloc", &h); @@ -943,7 +966,7 @@ CAMLexport value caml_input_value_from_malloc(char * data, intnat ofs) CAMLexport value caml_input_value_from_block(const char * data, intnat len) { struct marshal_header h; - struct caml_intern_state* s = get_intern_state (); + struct caml_intern_state* s = init_intern_state (); /* Initialize global state */ intern_init(s, data, NULL); @@ -973,7 +996,7 @@ CAMLprim value caml_marshal_data_size(value buff, value ofs) uint32_t magic; int header_len; uintnat data_len; - struct caml_intern_state *s = get_intern_state (); + struct caml_intern_state *s = init_intern_state (); s->intern_src = &Byte_u(buff, Long_val(ofs)); magic = read32u(s); diff --git a/runtime/interp.c b/runtime/interp.c index 257a0097d5c..27d8c3faf64 100644 --- a/runtime/interp.c +++ b/runtime/interp.c @@ -91,7 +91,9 @@ sp is a local copy of the global variable Caml_state->extern_sp. */ { sp -= 2; sp[0] = env; sp[1] = (value)(pc + 1); \ domain_state->current_stack->sp = sp; } #define Restore_after_c_call \ - { sp = domain_state->current_stack->sp; env = *sp; sp += 2; } + { sp = domain_state->current_stack->sp; env = *sp; sp += 2; \ + caml_update_young_limit_after_c_call(domain_state); \ + } /* For VM threads purposes, an event frame must look like accu + a C_CALL frame + a RETURN 1 frame. diff --git a/runtime/ints.c b/runtime/ints.c index 5c610abe666..3e853fff680 100644 --- a/runtime/ints.c +++ b/runtime/ints.c @@ -438,61 +438,52 @@ CAMLexport value caml_copy_int64(int64_t i) return res; } -#define CAMLprim_int64_1(name) \ - CAMLprim int64_t caml_int64_##name##_native(int64_t); \ - \ - CAMLprim value caml_int64_##name(value v) \ - { return caml_copy_int64(caml_int64_##name##_native(Int64_val(v))); } \ - \ - CAMLprim int64_t caml_int64_##name##_native +CAMLprim value caml_int64_neg(value v) +{ return caml_copy_int64(- Int64_val(v)); } -#define CAMLprim_int64_2(name) \ - CAMLprim int64_t caml_int64_##name##_native(int64_t, int64_t); \ - \ - CAMLprim value caml_int64_##name(value v1, value v2) \ - { return caml_copy_int64(caml_int64_##name##_native(Int64_val(v1), \ - Int64_val(v2))); } \ - \ - CAMLprim int64_t caml_int64_##name##_native +CAMLprim value caml_int64_add(value v1, value v2) +{ return caml_copy_int64(Int64_val(v1) + Int64_val(v2)); } -CAMLprim_int64_1(neg)(int64_t i) -{ return -i; } +CAMLprim value caml_int64_sub(value v1, value v2) +{ return caml_copy_int64(Int64_val(v1) - Int64_val(v2)); } -CAMLprim_int64_2(add)(int64_t i1, int64_t i2) -{ return i1 + i2; } +CAMLprim value caml_int64_mul(value v1, value v2) +{ return caml_copy_int64(Int64_val(v1) * Int64_val(v2)); } -CAMLprim_int64_2(sub)(int64_t i1, int64_t i2) -{ return i1 - i2; } +#define Int64_min_int ((intnat) 1 << (sizeof(intnat) * 8 - 1)) -CAMLprim_int64_2(mul)(int64_t i1, int64_t i2) -{ return i1 * i2; } - -CAMLprim_int64_2(div)(int64_t dividend, int64_t divisor) +CAMLprim value caml_int64_div(value v1, value v2) { + int64_t dividend = Int64_val(v1); + int64_t divisor = Int64_val(v2); if (divisor == 0) caml_raise_zero_divide(); /* PR#4740: on some processors, division crashes on overflow. Implement the same behavior as for type "int". */ - if (dividend == ((int64_t)1 << 63) && divisor == -1) return dividend; - return dividend / divisor; + if (dividend == ((int64_t)1 << 63) && divisor == -1) return v1; + return caml_copy_int64(dividend / divisor); } -CAMLprim_int64_2(mod)(int64_t dividend, int64_t divisor) +CAMLprim value caml_int64_mod(value v1, value v2) { + int64_t dividend = Int64_val(v1); + int64_t divisor = Int64_val(v2); if (divisor == 0) caml_raise_zero_divide(); /* PR#4740: on some processors, division crashes on overflow. Implement the same behavior as for type "int". */ - if (dividend == ((int64_t)1 << 63) && divisor == -1) return 0; - return dividend % divisor; + if (dividend == ((int64_t)1 << 63) && divisor == -1){ + return caml_copy_int64(0); + } + return caml_copy_int64(dividend % divisor); } -CAMLprim_int64_2(and)(int64_t i1, int64_t i2) -{ return i1 & i2; } +CAMLprim value caml_int64_and(value v1, value v2) +{ return caml_copy_int64(Int64_val(v1) & Int64_val(v2)); } -CAMLprim_int64_2(or)(int64_t i1, int64_t i2) -{ return i1 | i2; } +CAMLprim value caml_int64_or(value v1, value v2) +{ return caml_copy_int64(Int64_val(v1) | Int64_val(v2)); } -CAMLprim_int64_2(xor)(int64_t i1, int64_t i2) -{ return i1 ^ i2; } +CAMLprim value caml_int64_xor(value v1, value v2) +{ return caml_copy_int64(Int64_val(v1) ^ Int64_val(v2)); } CAMLprim value caml_int64_shift_left(value v1, value v2) { return caml_copy_int64(Int64_val(v1) << Int_val(v2)); } diff --git a/runtime/io.c b/runtime/io.c index ed14cc09240..0eceee6f965 100644 --- a/runtime/io.c +++ b/runtime/io.c @@ -885,7 +885,7 @@ CAMLprim value caml_ml_output_bigarray(value vchannel, value vbuf, intnat len = Long_val(vlen); caml_channel_lock(channel); - caml_really_putblock(channel, Caml_ba_data_val(vbuf) + pos, len); + caml_really_putblock(channel, (char *)Caml_ba_data_val(vbuf) + pos, len); caml_channel_unlock(channel); CAMLreturn (Val_unit); @@ -1013,7 +1013,7 @@ CAMLprim value caml_ml_input_bigarray(value vchannel, value vbuf, intnat n; caml_channel_lock(channel); - n = caml_getblock(channel, Caml_ba_data_val(vbuf) + pos, len); + n = caml_getblock(channel, (char *)Caml_ba_data_val(vbuf) + pos, len); caml_channel_unlock(channel); CAMLreturn (Val_long(n)); diff --git a/runtime/lexing.c b/runtime/lexing.c index f553ce8f1f3..6891fb97904 100644 --- a/runtime/lexing.c +++ b/runtime/lexing.c @@ -58,9 +58,10 @@ struct lexing_table { #define Short(tbl,n) (((short *)(tbl))[(n)]) #endif -CAMLprim value caml_lex_engine(struct lexing_table *tbl, value start_state, - struct lexer_buffer *lexbuf) +CAMLprim value caml_lex_engine(value vtbl, value start_state, value vlexbuf) { + struct lexing_table * tbl = (struct lexing_table *) vtbl; + struct lexer_buffer * lexbuf = (struct lexer_buffer *) vlexbuf; int state, base, backtrk, c; state = Int_val(start_state); @@ -156,9 +157,11 @@ static void run_tag(char *pc, value mem) { } } -CAMLprim value caml_new_lex_engine(struct lexing_table *tbl, value start_state, - struct lexer_buffer *lexbuf) +CAMLprim value caml_new_lex_engine(value vtbl, value start_state, + value vlexbuf) { + struct lexing_table * tbl = (struct lexing_table *) vtbl; + struct lexer_buffer * lexbuf = (struct lexer_buffer *) vlexbuf; int state, base, backtrk, c, pstate ; state = Int_val(start_state); if (state >= 0) { diff --git a/runtime/lf_skiplist.c b/runtime/lf_skiplist.c index 59434fee82d..5b65142aaf7 100644 --- a/runtime/lf_skiplist.c +++ b/runtime/lf_skiplist.c @@ -50,12 +50,7 @@ #include /* Size of struct lf_skipcell, in bytes, without the forward array */ -#if (__STDC_VERSION__ >= 199901L) #define SIZEOF_LF_SKIPCELL sizeof(struct lf_skipcell) -#else -#define SIZEOF_LF_SKIPCELL \ - (sizeof(struct lf_skipcell) - sizeof(struct lf_skipcell *)) -#endif /* Generate a random level for a new node: 0 with probability 3/4, 1 with probability 3/16, 2 with probability 3/64, etc. diff --git a/runtime/major_gc.c b/runtime/major_gc.c index 47036b70ddf..b00023c8ce3 100644 --- a/runtime/major_gc.c +++ b/runtime/major_gc.c @@ -73,16 +73,69 @@ struct mark_stack { uintnat caml_percent_free = Percent_free_def; -/* This variable is only written with the world stopped, - so it need not be atomic */ +/* This variable is only written with the world stopped, so it need not be + atomic */ uintnat caml_major_cycles_completed = 0; +/* [num_domains_to_sweep] records the number of domains to sweep in the current + major cycle. The number is set to the [num_domains_in_stw] at the start of + the cycle and _strictly decreases_ to 0. + + Domains created in a given cycle will not have any sweep work in that cycle. + Sweep changes GARBAGE coloured objects in the domain's own pools to FREE + (not a distinct colour; object header is set to 0) and adds them to the free + list. No object will have the GARBAGE colour in the domain's own pools since + the domain starts with an empty pool with no objects and new objects are + allocated with colour MARKED. Hence, they do not affect + [num_domains_to_sweep]. + + Terminating domains terminate after sweeping is complete for their domain. + */ static atomic_uintnat num_domains_to_sweep; + +/* [num_domains_to_mark] records the number of domains to mark in the current + major cycle. The number is set to the [num_domains_in_stw] at the start of + the cycle. The value of [num_domains_to_mark] may decrease or increase. + + [num_domains_to_mark] may grow larger than the value of [num_domains_in_stw] + at the start of the cycle. This is because [caml_modify] may push a block + into a potentially empty mark stack of the newly spawned domain. + + Terminating domains empty their mark stack before terminating. */ static atomic_uintnat num_domains_to_mark; + +/* [num_domains_to_ephe_sweep] is set to the [participating_count] at the start + of the [Phase_sweep_ephe] and strictly decreases. */ static atomic_uintnat num_domains_to_ephe_sweep; + +/* [num_domains_to_final_update_first] and [num_domains_to_final_update_last] + are initialised to [num_domains_in_stw] at the start of the cycle. Whenever + a domain finishes processing its first or last finalisers, it decrements the + appropriate counter. + + Newly created domains increment both the counters. Terminating domain + orphans its finalisers and then decrements the counters. See + [caml_final_domain_terminate]. */ static atomic_uintnat num_domains_to_final_update_first; static atomic_uintnat num_domains_to_final_update_last; +/* When domains terminate, they will orphan their finalisers. As mentioned in + the comment attached to [num_domains_to_final_update_*] counters, a domain + will decrement the counters when the corresponding finalisers are processed + for that domain. We would like to preserve this invariant when adopting + orphaned finalisers. To this end, we orphan and adopt finalisers only in + [Phase_sweep_and_mark_main] when [num_domains_to_final_update_*] counters + have not been decremented for the domain yet. + + [num_domains_orphaning_finalisers] keeps a count of the number of domains + currently orphaning finalisers. This counter is only used in the + [Phase_sweep_and_mark_main] to determine whether to proceed to + [Phase_mark_final]. If domains are currently orphaning finalisers, we remain + in [Phase_sweep_and_mark_main] so that the orphaned finalisers can be + adopted before moving onto [Phase_mark_final] where the [GC.finalise] + (finalise first) finalisers are processed. */ +static atomic_uintnat num_domains_orphaning_finalisers = 0; + /* These two counters keep track of how much work the GC is supposed to do in order to keep up with allocation. Both are in GC work units. `alloc_counter` increases when we allocate: the number of words allocated @@ -286,48 +339,26 @@ static void record_ephe_marking_done (uintnat ephe_cycle) caml_plat_unlock(&ephe_lock); } -/* These are biased data structures left over from terminating domains. */ -static struct { - value ephe_list_live; - struct caml_final_info *final_info; -} orph_structs = {0, 0}; - -static caml_plat_mutex orphaned_lock = CAML_PLAT_MUTEX_INITIALIZER; - -void caml_add_orphaned_finalisers (struct caml_final_info* f) -{ - CAMLassert (caml_gc_phase == Phase_sweep_and_mark_main); - CAMLassert (!f->updated_first); - CAMLassert (!f->updated_last); +/******************************************************************************* + * Orphaning and adoption + ******************************************************************************/ - caml_plat_lock(&orphaned_lock); - f->next = orph_structs.final_info; - orph_structs.final_info = f; - caml_plat_unlock(&orphaned_lock); +/* These are biased data structures left over from terminating domains. -} - -/* Called by terminating domain from handover_finalisers */ -void caml_final_domain_terminate (caml_domain_state *domain_state) -{ - struct caml_final_info *f = domain_state->final_info; - if(!f->updated_first) { - atomic_fetch_add_verify_ge0(&num_domains_to_final_update_first, -1); - f->updated_first = 1; - } - if(!f->updated_last) { - atomic_fetch_add_verify_ge0(&num_domains_to_final_update_last, -1); - f->updated_last = 1; - } -} + Synchronization: + - operations that mutate the structure + (adding new orphaned values or adopting orphans) + are protected from each other using [orphaned_lock]; + this is simpler than using atomic lists, and not performance-sensitive + - the read-only function [no_orphaned_work()] uses atomic accesses + to avoid taking a lock (it is called more often) + */ +static struct { + value _Atomic ephe_list_live; + struct caml_final_info * _Atomic final_info; +} orph_structs = {0, NULL}; -CAMLno_tsan /* Disable TSan reports from this function (see #11040) */ -static int no_orphaned_work (void) -{ - return - orph_structs.ephe_list_live == 0 && - orph_structs.final_info == NULL; -} +static caml_plat_mutex orphaned_lock = CAML_PLAT_MUTEX_INITIALIZER; Caml_inline value ephe_list_tail(value e) { @@ -345,16 +376,13 @@ static void orph_ephe_list_verify_status (int status) { value v; - caml_plat_lock(&orphaned_lock); - v = orph_structs.ephe_list_live; + while (v) { CAMLassert (Tag_val(v) == Abstract_tag); CAMLassert (Has_status_val(v, status)); v = Ephe_link(v); } - - caml_plat_unlock(&orphaned_lock); } #endif @@ -363,10 +391,13 @@ static void orph_ephe_list_verify_status (int status) static intnat ephe_mark (intnat budget, uintnat for_cycle, int force_alive); -CAMLno_tsan /* Disable TSan reports from this function (see #11040) */ -void caml_add_to_orphaned_ephe_list(struct caml_ephe_info* ephe_info) +void caml_orphan_ephemerons (caml_domain_state* domain_state) { - caml_plat_lock(&orphaned_lock); + struct caml_ephe_info* ephe_info = domain_state->ephe_info; + if (ephe_info->todo == 0 && + ephe_info->live == 0 && + ephe_info->must_sweep_ephe == 0) + return; /* Force all ephemerons and their data on todo list to be alive */ if (ephe_info->todo) { @@ -380,24 +411,75 @@ void caml_add_to_orphaned_ephe_list(struct caml_ephe_info* ephe_info) if (ephe_info->live) { value live_tail = ephe_list_tail(ephe_info->live); CAMLassert(Ephe_link(live_tail) == 0); + + caml_plat_lock(&orphaned_lock); Ephe_link(live_tail) = orph_structs.ephe_list_live; orph_structs.ephe_list_live = ephe_info->live; ephe_info->live = 0; + caml_plat_unlock(&orphaned_lock); } - caml_plat_unlock(&orphaned_lock); - if (ephe_info->must_sweep_ephe) { ephe_info->must_sweep_ephe = 0; atomic_fetch_add_verify_ge0(&num_domains_to_ephe_sweep, -1); } + CAMLassert (ephe_info->must_sweep_ephe == 0); + CAMLassert (ephe_info->live == 0); + CAMLassert (ephe_info->todo == 0); +} + +void caml_orphan_finalisers (caml_domain_state* domain_state) +{ + struct caml_final_info* f = domain_state->final_info; + + if (f->todo_head != NULL || f->first.size != 0 || f->last.size != 0) { + /* have some final structures */ + atomic_fetch_add(&num_domains_orphaning_finalisers, +1); + if (caml_gc_phase != Phase_sweep_and_mark_main) { + /* Force a major GC cycle to simplify constraints for orphaning + finalisers. See note attached to the declaration of + [num_domains_orphaning_finalisers] variable in major_gc.c */ + caml_finish_major_cycle(0); + } + CAMLassert(caml_gc_phase == Phase_sweep_and_mark_main); + CAMLassert (!f->updated_first); + CAMLassert (!f->updated_last); + + /* Add the finalisers to [orph_structs] */ + caml_plat_lock(&orphaned_lock); + f->next = orph_structs.final_info; + orph_structs.final_info = f; + caml_plat_unlock(&orphaned_lock); + + /* Create a dummy final info */ + f = domain_state->final_info = caml_alloc_final_info(); + atomic_fetch_add_verify_ge0(&num_domains_orphaning_finalisers, -1); + } + + /* [caml_orphan_finalisers] is called in a while loop in [domain_terminate]. + We take care to decrement the [num_domains_to_final_update*] counters only + if we have not already decremented it for the current cycle. */ + if(!f->updated_first) { + atomic_fetch_add_verify_ge0(&num_domains_to_final_update_first, -1); + f->updated_first = 1; + } + if(!f->updated_last) { + atomic_fetch_add_verify_ge0(&num_domains_to_final_update_last, -1); + f->updated_last = 1; + } +} + +static int no_orphaned_work (void) +{ + return + atomic_load_acquire(&orph_structs.ephe_list_live) == 0 && + atomic_load_acquire(&orph_structs.final_info) == NULL; } -CAMLno_tsan /* Disable TSan reports from this function (see #11040) */ -void caml_adopt_orphaned_work (void) +static void adopt_orphaned_work (void) { caml_domain_state* domain_state = Caml_state; - value last; + value orph_ephe_list_live, last; struct caml_final_info *f, *myf, *temp; if (no_orphaned_work() || caml_domain_is_terminating()) @@ -405,23 +487,31 @@ void caml_adopt_orphaned_work (void) caml_plat_lock(&orphaned_lock); - if (orph_structs.ephe_list_live) { - last = ephe_list_tail(orph_structs.ephe_list_live); + orph_ephe_list_live = orph_structs.ephe_list_live; + orph_structs.ephe_list_live = 0; + + f = orph_structs.final_info; + orph_structs.final_info = NULL; + + caml_plat_unlock(&orphaned_lock); + + if (orph_ephe_list_live) { + last = ephe_list_tail(orph_ephe_list_live); CAMLassert(Ephe_link(last) == 0); Ephe_link(last) = domain_state->ephe_info->live; - domain_state->ephe_info->live = orph_structs.ephe_list_live; - orph_structs.ephe_list_live = 0; + domain_state->ephe_info->live = orph_ephe_list_live; } - f = orph_structs.final_info; - myf = domain_state->final_info; while (f != NULL) { - CAMLassert (!f->updated_first); - CAMLassert (!f->updated_last); + myf = domain_state->final_info; + CAMLassert (caml_gc_phase == Phase_sweep_and_mark_main); + /* Since we are in [Phase_sweep_and_mark_main], the current domain has not + updated its finalisers. */ CAMLassert (!myf->updated_first); CAMLassert (!myf->updated_last); - CAMLassert (caml_gc_phase == Phase_sweep_and_mark_main); + if (f->todo_head) { + /* Adopt the finalising set. */ if (myf->todo_tail == NULL) { CAMLassert(myf->todo_head == NULL); myf->todo_head = f->todo_head; @@ -431,20 +521,23 @@ void caml_adopt_orphaned_work (void) myf->todo_tail = f->todo_tail; } } + + /* Adopt the finalisable set */ if (f->first.young > 0) { caml_final_merge_finalisable (&f->first, &myf->first); } if (f->last.young > 0) { caml_final_merge_finalisable (&f->last, &myf->last); } + temp = f; f = f->next; caml_stat_free (temp); } - orph_structs.final_info = NULL; - caml_plat_unlock(&orphaned_lock); } +/******************************************************************************/ + #define BUFFER_SIZE 64 struct buf_list_t { @@ -760,7 +853,6 @@ static void realloc_mark_stack (struct mark_stack* stk) mark_stack_prune(stk); } -CAMLno_tsan /* Disable TSan reports from this function (see #11040) */ Caml_inline void mark_stack_push_range(struct mark_stack* stk, value_ptr start, value_ptr end) { @@ -774,7 +866,6 @@ Caml_inline void mark_stack_push_range(struct mark_stack* stk, me->end = end; } -CAMLno_tsan /* Disable TSan reports from this function (see #11040) */ /* returns the work done by skipping unmarkable objects */ static intnat mark_stack_push_block(struct mark_stack* stk, value block) { @@ -845,7 +936,6 @@ void caml_shrink_mark_stack (void) void caml_darken_cont(value cont); -CAMLno_tsan /* Disable TSan reports from this function (see #11040) */ static void mark_slice_darken(struct mark_stack* stk, value child, intnat* work) { @@ -890,7 +980,9 @@ static void mark_slice_darken(struct mark_stack* stk, value child, } } -CAMLno_tsan /* Disable TSan reports from this function (see #11040) */ +CAMLno_tsan /* Loads from locations in the OCaml heap can cause false alarms in + TSan when these locations are concurrently written to by + caml_modify (see comment inside the function). */ Caml_noinline static intnat do_some_marking(struct mark_stack* stk, intnat budget) { prefetch_buffer_t pb = { .enqueued = 0, .dequeued = 0, @@ -985,7 +1077,12 @@ Caml_noinline static intnat do_some_marking(struct mark_stack* stk, for (; me.start < scan_end; me.start++) { CAMLassert(budget >= 0); + /* This load may race with a concurrent caml_modify. It does not + constitute a data race as this is a volatile load. However, TSan will + wrongly see a race here (see section 3.2 of comment in tsan.c). Hence + the TSan-silencing of the present function. */ value child = *me.start; + budget--; if (Is_markable(child)) { if (pb_full(&pb)) @@ -1231,11 +1328,18 @@ static intnat ephe_sweep (caml_domain_state* domain_state, intnat budget) return budget; } -static void cycle_all_domains_callback(caml_domain_state* domain, void* unused, +struct cycle_callback_params { + int force_compaction; +}; + +static void stw_cycle_all_domains(caml_domain_state* domain, void* args, int participating_count, caml_domain_state** participating) { uintnat num_domains_in_stw; + /* We copy params because the stw leader may leave early. No barrier needed + because there's one in the minor gc and after. */ + struct cycle_callback_params params = *((struct cycle_callback_params*)args); CAML_EV_BEGIN(EV_MAJOR_GC_CYCLE_DOMAINS); @@ -1253,10 +1357,11 @@ static void cycle_all_domains_callback(caml_domain_state* domain, void* unused, { /* Cycle major heap */ - // FIXME: delete caml_cycle_heap_stw and have per-domain copies of the data? + /* FIXME: delete caml_cycle_heap_from_stw_single + and have per-domain copies of the data? */ barrier_status b = caml_global_barrier_begin(); if (caml_global_barrier_is_final(b)) { - caml_cycle_heap_stw(); + caml_cycle_heap_from_stw_single(); caml_gc_log("GC cycle %lu completed (heap cycled)", (long unsigned int)caml_major_cycles_completed); @@ -1337,9 +1442,7 @@ static void cycle_all_domains_callback(caml_domain_state* domain, void* unused, atomic_store(&domain_global_roots_started, WORK_UNSTARTED); - /* Cleanups for various data structures that must be done in a STW by - only a single domain */ - caml_code_fragment_cleanup(); + caml_code_fragment_cleanup_from_stw_single(); } // should interrupts be processed here or not? // depends on whether marking above may need interrupts @@ -1349,13 +1452,22 @@ static void cycle_all_domains_callback(caml_domain_state* domain, void* unused, /* If the heap is to be verified, do it before the domains continue running OCaml code. */ if (caml_params->verify_heap) { - caml_verify_heap(domain); + caml_verify_heap_from_stw(domain); caml_gc_log("Heap verified"); + /* This global barrier avoids races between the verify_heap code + and the rest of the STW critical section, for example the parts + that mark global roots. */ caml_global_barrier(); } caml_cycle_heap(domain->shared_heap); + /* Compact here if requested (or, in some future version, if the heap overhead + is too high). */ + if (params.force_compaction) { + caml_compact_heap(domain, participating_count, participating); + } + /* Collect domain-local stats to emit to runtime events */ struct heap_stats local_stats; caml_collect_heap_stats_sample(Caml_state->shared_heap, &local_stats); @@ -1399,12 +1511,12 @@ static void cycle_all_domains_callback(caml_domain_state* domain, void* unused, } /* Ephemerons */ - // Adopt orphaned work from domains that were spawned and terminated in - // the previous cycle. #ifdef DEBUG orph_ephe_list_verify_status (caml_global_heap_state.UNMARKED); #endif - caml_adopt_orphaned_work (); + /* Adopt orphaned work from domains that were spawned and terminated in the + previous cycle. */ + adopt_orphaned_work (); CAMLassert(domain->ephe_info->todo == (value) NULL); domain->ephe_info->todo = domain->ephe_info->live; domain->ephe_info->live = (value) NULL; @@ -1436,47 +1548,58 @@ static void cycle_all_domains_callback(caml_domain_state* domain, void* unused, static int is_complete_phase_sweep_and_mark_main (void) { return + /* Marking is done */ caml_gc_phase == Phase_sweep_and_mark_main && atomic_load_acquire (&num_domains_to_sweep) == 0 && atomic_load_acquire (&num_domains_to_mark) == 0 && - /* Marking is done */ + + /* No domains are orphaning finalisers. */ + atomic_load_acquire (&num_domains_orphaning_finalisers) == 0 && + + /* Ephemeron marking is done */ atomic_load_acquire(&ephe_cycle_info.num_domains_todo) == atomic_load_acquire(&ephe_cycle_info.num_domains_done) && - /* Ephemeron marking is done */ - no_orphaned_work(); + /* All orphaned ephemerons have been adopted */ + no_orphaned_work(); } static int is_complete_phase_mark_final (void) { return + /* updated finalise first values */ caml_gc_phase == Phase_mark_final && atomic_load_acquire (&num_domains_to_final_update_first) == 0 && - /* updated finalise first values */ - atomic_load_acquire (&num_domains_to_mark) == 0 && + /* Marking is done */ + atomic_load_acquire (&num_domains_to_mark) == 0 && + + /* Ephemeron marking is done */ atomic_load_acquire(&ephe_cycle_info.num_domains_todo) == atomic_load_acquire(&ephe_cycle_info.num_domains_done) && - /* Ephemeron marking is done */ - no_orphaned_work(); + /* All orphaned ephemerons have been adopted */ + no_orphaned_work(); } static int is_complete_phase_sweep_ephe (void) { return + /* All domains have swept their ephemerons */ caml_gc_phase == Phase_sweep_ephe && atomic_load_acquire (&num_domains_to_ephe_sweep) == 0 && - /* All domains have swept their ephemerons */ - atomic_load_acquire (&num_domains_to_final_update_last) == 0 && + /* All domains have updated finalise last values */ - no_orphaned_work(); + atomic_load_acquire (&num_domains_to_final_update_last) == 0 && + /* All orphaned structures have been adopted */ + no_orphaned_work(); } -static void try_complete_gc_phase (caml_domain_state* domain, void* unused, - int participant_count, - caml_domain_state** participating) +static void stw_try_complete_gc_phase( + caml_domain_state* domain, void* unused, + int participant_count, + caml_domain_state** participating) { barrier_status b; CAML_EV_BEGIN(EV_MAJOR_GC_PHASE_CHANGE); @@ -1517,9 +1640,10 @@ static char collection_slice_mode_char(collection_slice_mode mode) } static void major_collection_slice(intnat howmuch, - int participant_count, - caml_domain_state** barrier_participants, - collection_slice_mode mode) + int participant_count, + caml_domain_state** barrier_participants, + collection_slice_mode mode, + int force_compaction) { caml_domain_state* domain_state = Caml_state; intnat sweep_work = 0, mark_work = 0; @@ -1609,7 +1733,7 @@ static void major_collection_slice(intnat howmuch, #ifdef DEBUG orph_ephe_list_verify_status (caml_global_heap_state.MARKED); #endif - caml_adopt_orphaned_work(); + adopt_orphaned_work(); /* Ephemerons */ if (caml_gc_phase != Phase_sweep_ephe) { @@ -1635,6 +1759,8 @@ static void major_collection_slice(intnat howmuch, } } + CAML_EV_END(EV_MAJOR_EPHE_MARK); + if (domain_state->ephe_info->todo == (value)NULL) { ephe_todo_list_emptied (); } @@ -1698,12 +1824,13 @@ static void major_collection_slice(intnat howmuch, is_complete_phase_mark_final ()) { CAMLassert (caml_gc_phase != Phase_sweep_ephe); if (barrier_participants) { - try_complete_gc_phase (domain_state, - (void*)0, - participant_count, - barrier_participants); + stw_try_complete_gc_phase( + domain_state, + (void*)0, + participant_count, + barrier_participants); } else { - caml_try_run_on_all_domains (&try_complete_gc_phase, 0, 0); + caml_try_run_on_all_domains (&stw_try_complete_gc_phase, 0, 0); } if (get_major_slice_work(mode) > 0) goto mark_again; } @@ -1722,18 +1849,22 @@ static void major_collection_slice(intnat howmuch, - blocks_marked_before)); if (mode != Slice_opportunistic && is_complete_phase_sweep_ephe()) { + /* To handle the case where multiple domains try to finish the major cycle + simultaneously, we loop until the current cycle has ended, ignoring + whether [caml_try_run_on_all_domains] succeeds. */ saved_major_cycle = caml_major_cycles_completed; - /* To handle the case where multiple domains try to finish the major - cycle simultaneously, we loop until the current cycle has ended, - ignoring whether caml_try_run_on_all_domains succeeds. */ + struct cycle_callback_params params; + params.force_compaction = force_compaction; while (saved_major_cycle == caml_major_cycles_completed) { if (barrier_participants) { - cycle_all_domains_callback - (domain_state, (void*)0, participant_count, barrier_participants); + stw_cycle_all_domains + (domain_state, (void*)¶ms, + participant_count, barrier_participants); } else { - caml_try_run_on_all_domains(&cycle_all_domains_callback, 0, 0); + caml_try_run_on_all_domains + (&stw_cycle_all_domains, (void*)¶ms, 0); } } } @@ -1741,7 +1872,7 @@ static void major_collection_slice(intnat howmuch, void caml_opportunistic_major_collection_slice(intnat howmuch) { - major_collection_slice(howmuch, 0, 0, Slice_opportunistic); + major_collection_slice(howmuch, 0, 0, Slice_opportunistic, 0); } void caml_major_collection_slice(intnat howmuch) @@ -1754,7 +1885,8 @@ void caml_major_collection_slice(intnat howmuch) AUTO_TRIGGERED_MAJOR_SLICE, 0, 0, - Slice_interruptible + Slice_interruptible, + 0 ); if (caml_incoming_interrupts_queued()) { caml_gc_log("Major slice interrupted, rescheduling major slice"); @@ -1763,41 +1895,67 @@ void caml_major_collection_slice(intnat howmuch) } else { /* TODO: could make forced API slices interruptible, but would need to do accounting or pass up interrupt */ - major_collection_slice(howmuch, 0, 0, Slice_uninterruptible); + major_collection_slice(howmuch, 0, 0, Slice_uninterruptible, 0); } /* Record that this domain has completed a major slice for this minor cycle. */ Caml_state->major_slice_epoch = major_slice_epoch; } -static void finish_major_cycle_callback (caml_domain_state* domain, void* arg, +struct finish_major_cycle_params { + uintnat saved_major_cycles; + int force_compaction; +}; + +static void stw_finish_major_cycle (caml_domain_state* domain, void* arg, int participating_count, caml_domain_state** participating) { - uintnat saved_major_cycles = (uintnat)arg; + /* We must copy params because the leader may exit this + before other domains do. There is at least one barrier somewhere + in the major cycle ending, so we don't need one immediately + after this. */ + struct finish_major_cycle_params params = + *((struct finish_major_cycle_params*)arg); + CAMLassert (domain == Caml_state); + /* We are in a STW critical section here. There is no obvious call + to a barrier at the end of the callback, but the [while] loop + will only terminate when [caml_major_cycles_completed] is + incremented, and this happens in [cycle_all_domains] inside + a barrier. */ caml_empty_minor_heap_no_major_slice_from_stw (domain, (void*)0, participating_count, participating); CAML_EV_BEGIN(EV_MAJOR_FINISH_CYCLE); - while (saved_major_cycles == caml_major_cycles_completed) { + while (params.saved_major_cycles == caml_major_cycles_completed) { major_collection_slice(10000000, participating_count, participating, - Slice_uninterruptible); + Slice_uninterruptible, params.force_compaction); } CAML_EV_END(EV_MAJOR_FINISH_CYCLE); } -void caml_finish_major_cycle (void) +void caml_finish_major_cycle (int force_compaction) { uintnat saved_major_cycles = caml_major_cycles_completed; while( saved_major_cycles == caml_major_cycles_completed ) { - caml_try_run_on_all_domains - (&finish_major_cycle_callback, (void*)caml_major_cycles_completed, 0); + struct finish_major_cycle_params params; + params.force_compaction = force_compaction; + params.saved_major_cycles = caml_major_cycles_completed; + + caml_try_run_on_all_domains(&stw_finish_major_cycle, (void*)¶ms, 0); } } +#ifdef DEBUG +int caml_mark_stack_is_empty(void) +{ + return Caml_state->mark_stack->count == 0; +} +#endif + void caml_empty_mark_stack (void) { while (!Caml_state->marking_done){ diff --git a/runtime/memory.c b/runtime/memory.c index dd9f83fc156..d608c4c6995 100644 --- a/runtime/memory.c +++ b/runtime/memory.c @@ -21,6 +21,7 @@ #include #include #include "caml/config.h" +#include "caml/custom.h" #include "caml/misc.h" #include "caml/fail.h" #include "caml/memory.h" @@ -254,10 +255,16 @@ CAMLexport void caml_free_dependent_memory (mlsize_t nbytes) this time. Note that only [res/max] is relevant. The units (and kind of resource) can change between calls to [caml_adjust_gc_speed]. + + If [max] = 0, then we use a number proportional to the major heap + size and [caml_custom_major_ratio]. In this case, [mem] should + be a number of bytes and the trade-off between GC work and space + overhead is under the control of the user through + [caml_custom_major_ratio]. */ CAMLexport void caml_adjust_gc_speed (mlsize_t res, mlsize_t max) { - if (max == 0) max = 1; + if (max == 0) max = caml_custom_get_max_major (); if (res > max) res = max; Caml_state->extra_heap_resources += (double) res / (double) max; if (Caml_state->extra_heap_resources > 0.2){ @@ -266,6 +273,19 @@ CAMLexport void caml_adjust_gc_speed (mlsize_t res, mlsize_t max) } } +/* This function is analogous to [caml_adjust_gc_speed]. When the + accumulated sum of [res/max] values reaches 1, a minor GC is + triggered. +*/ +CAMLexport void caml_adjust_minor_gc_speed (mlsize_t res, mlsize_t max) +{ + if (max == 0) max = 1; + Caml_state->extra_heap_resources_minor += (double) res / (double) max; + if (Caml_state->extra_heap_resources_minor > 1.0) { + caml_request_minor_gc (); + } +} + /* You must use [caml_intialize] to store the initial value in a field of a block, unless you are sure the value is not a young block, in which case a plain assignment would do. @@ -403,7 +423,7 @@ Caml_inline value alloc_shr(mlsize_t wosize, tag_t tag, reserved_t reserved, Caml_check_caml_state(); caml_domain_state *dom_st = Caml_state; value *v = caml_shared_try_alloc(dom_st->shared_heap, - wosize, tag, reserved, 0); + wosize, tag, reserved); if (v == NULL) { if (!noexc) caml_raise_out_of_memory(); @@ -479,19 +499,10 @@ struct pool_block { #endif struct pool_block *next; struct pool_block *prev; - /* Use C99's flexible array types if possible */ -#if (__STDC_VERSION__ >= 199901L) union max_align data[]; /* not allocated, used for alignment purposes */ -#else - union max_align data[1]; -#endif }; -#if (__STDC_VERSION__ >= 199901L) #define SIZEOF_POOL_BLOCK sizeof(struct pool_block) -#else -#define SIZEOF_POOL_BLOCK offsetof(struct pool_block, data) -#endif static struct pool_block *pool = NULL; static caml_plat_mutex pool_mutex = CAML_PLAT_MUTEX_INITIALIZER; diff --git a/runtime/memprof.c b/runtime/memprof.c index 788020bea0f..710c2b1bf8a 100644 --- a/runtime/memprof.c +++ b/runtime/memprof.c @@ -47,7 +47,6 @@ CAMLprim value caml_memprof_discard(value profile) #include "caml/weak.h" #include "caml/stack.h" #include "caml/misc.h" -#include "caml/compact.h" #include "caml/printexc.h" #include "caml/runtime_events.h" diff --git a/runtime/meta.c b/runtime/meta.c index 5bd1000b920..4dea22357aa 100644 --- a/runtime/meta.c +++ b/runtime/meta.c @@ -20,6 +20,7 @@ #include #include "caml/alloc.h" #include "caml/backtrace_prim.h" +#include "caml/bigarray.h" #include "caml/codefrag.h" #include "caml/config.h" #include "caml/debugger.h" @@ -64,28 +65,16 @@ CAMLprim value caml_reify_bytecode(value ls_prog, CAMLparam3(ls_prog, debuginfo, digest_opt); CAMLlocal3(clos, bytecode, retval); code_t prog; - asize_t len, off; /* in bytes */ + asize_t len; /* in bytes */ enum digest_status digest_kind; unsigned char * digest; - int fragnum, i; + int fragnum; - /* ls_prog is a bytes array (= LongString.t) */ - len = 0; - for (i = 0; i < Wosize_val(ls_prog); i++) { - value s = Field(ls_prog, i); - len += caml_string_length(s); - } - prog = caml_stat_alloc(len + sizeof(opcode_t) * 2 /* for 'RETURN 1' */); + len = caml_ba_byte_size(Caml_ba_array_val(ls_prog)); - off = 0; - for (i = 0; i < Wosize_val(ls_prog); i++) { - size_t s_len; - value s = Field(ls_prog, i); - s_len = caml_string_length(s); - memcpy((char*)prog + off, Bytes_val(s), s_len); - off += s_len; - } + prog = caml_stat_alloc(len + sizeof(opcode_t) * 2 /* for 'RETURN 1' */); + memcpy(prog, Caml_ba_data_val(ls_prog), len); #ifdef ARCH_BIG_ENDIAN caml_fixup_endianness(prog, len); #endif diff --git a/runtime/minor_gc.c b/runtime/minor_gc.c index 04a463c2c82..6ad6f474210 100644 --- a/runtime/minor_gc.c +++ b/runtime/minor_gc.c @@ -151,7 +151,7 @@ static value alloc_shared(caml_domain_state* d, mlsize_t wosize, tag_t tag, reserved_t reserved) { void* mem = caml_shared_try_alloc(d->shared_heap, wosize, tag, - reserved, 0 /* not pinned */); + reserved); d->allocated_words += Whsize_wosize(wosize); if (mem == NULL) { caml_fatal_error("allocation failure during minor GC"); @@ -459,12 +459,14 @@ void caml_empty_minor_heap_domain_clear(caml_domain_state* domain) domain->extra_heap_resources_minor = 0.0; } +void caml_do_opportunistic_major_slice + (caml_domain_state* domain_unused, void* unused); + void caml_empty_minor_heap_promote(caml_domain_state* domain, int participating_count, caml_domain_state** participating) { struct caml_minor_tables *self_minor_tables = domain->minor_tables; - struct caml_custom_elt *elt; value* young_ptr = domain->young_ptr; value* young_end = domain->young_end; uintnat minor_allocated_bytes = (uintnat)young_end - (uintnat)young_ptr; @@ -574,20 +576,6 @@ void caml_empty_minor_heap_promote(caml_domain_state* domain, } #endif - /* unconditionally promote custom blocks so accounting is correct */ - for (elt = self_minor_tables->custom.base; - elt < self_minor_tables->custom.ptr; elt++) { - value *v = &elt->block; - if (Is_block(*v) && Is_young(*v)) { - caml_adjust_gc_speed(elt->mem, elt->max); - if (get_header_val(*v) == 0) { /* value copied to major heap */ - *v = Field(*v, 0); - } else { - oldify_one(&st, *v, v); - } - } - } - CAML_EV_BEGIN(EV_MINOR_FINALIZERS_OLDIFY); /* promote the finalizers unconditionally as we want to avoid barriers */ caml_final_do_young_roots (&oldify_one, oldify_scanning_flags, &st, @@ -611,13 +599,6 @@ void caml_empty_minor_heap_promote(caml_domain_state* domain, CAMLassert (!Is_block(vnew) || (get_header_val(vnew) != 0 && !Is_young(vnew))); } - - for (elt = self_minor_tables->custom.base; - elt < self_minor_tables->custom.ptr; elt++) { - value vnew = elt->block; - CAMLassert (!Is_block(vnew) - || (get_header_val(vnew) != 0 && !Is_young(vnew))); - } #endif CAML_EV_BEGIN(EV_MINOR_LOCAL_ROOTS); @@ -641,13 +622,32 @@ void caml_empty_minor_heap_promote(caml_domain_state* domain, + (domain->young_end - domain->young_start) / 2; caml_reset_young_limit(domain); + domain->stat_minor_words += Wsize_bsize (minor_allocated_bytes); + domain->stat_promoted_words += domain->allocated_words - prev_alloc_words; + + /* Must be called during the STW section -- before any mutators + start running, so before arriving at the barrier. */ + caml_collect_gc_stats_sample_stw(domain); + + /* The code above is synchronised with other domains by the barrier below, + which is split into two steps, "arriving" and "leaving". When the final + domain arrives at the barrier, all other domains are free to leave, after + which they finish running the STW callback and may, depending on the + specific STW section, begin executing mutator code. + + Leaving the barrier synchronises (only) with the arrivals of other domains, + so that all writes performed by a domain before arrival "happen-before" any + domain leaves the barrier. However, any code after arrival, including the + code between the two steps, can potentially race with mutator code. + */ + + /* arrive at the barrier */ if( participating_count > 1 ) { atomic_fetch_add_explicit (&domains_finished_minor_gc, 1, memory_order_release); } - - domain->stat_minor_words += Wsize_bsize (minor_allocated_bytes); - domain->stat_promoted_words += domain->allocated_words - prev_alloc_words; + /* other domains may be executing mutator code from this point, but + not before */ call_timing_hook(&caml_minor_gc_end_hook); CAML_EV_COUNTER(EV_C_MINOR_PROMOTED, @@ -660,6 +660,44 @@ void caml_empty_minor_heap_promote(caml_domain_state* domain, domain->id, 100.0 * (double)st.live_bytes / (double)minor_allocated_bytes, (unsigned)(minor_allocated_bytes + 512)/1024); + + /* leave the barrier */ + if( participating_count > 1 ) { + CAML_EV_BEGIN(EV_MINOR_LEAVE_BARRIER); + { + SPIN_WAIT { + if (atomic_load_acquire(&domains_finished_minor_gc) == + participating_count) { + break; + } + + caml_do_opportunistic_major_slice(domain, 0); + } + } + CAML_EV_END(EV_MINOR_LEAVE_BARRIER); + } +} + +/* Finalize dead custom blocks and do the accounting for the live + ones. This must be done right after leaving the barrier. At this + point, all domains have finished minor GC, but this domain hasn't + resumed running OCaml code. Other domains may have resumed OCaml + code, but they cannot have any pointers into our minor heap. */ +static void custom_finalize_minor (caml_domain_state * domain) +{ + struct caml_custom_elt *elt; + for (elt = domain->minor_tables->custom.base; + elt < domain->minor_tables->custom.ptr; elt++) { + value *v = &elt->block; + if (Is_block(*v) && Is_young(*v)) { + if (get_header_val(*v) == 0) { /* value copied to major heap */ + caml_adjust_gc_speed(elt->mem, elt->max); + } else { + void (*final_fun)(value) = Custom_ops_val(*v)->finalize; + if (final_fun != NULL) final_fun(*v); + } + } + } } void caml_do_opportunistic_major_slice @@ -703,23 +741,10 @@ caml_stw_empty_minor_heap_no_major_slice(caml_domain_state* domain, caml_gc_log("running stw empty_minor_heap_promote"); caml_empty_minor_heap_promote(domain, participating_count, participating); - /* collect gc stats before leaving the barrier */ - caml_collect_gc_stats_sample(domain); - - if( participating_count > 1 ) { - CAML_EV_BEGIN(EV_MINOR_LEAVE_BARRIER); - { - SPIN_WAIT { - if (atomic_load_acquire(&domains_finished_minor_gc) == - participating_count) { - break; - } - - caml_do_opportunistic_major_slice(domain, 0); - } - } - CAML_EV_END(EV_MINOR_LEAVE_BARRIER); - } + CAML_EV_BEGIN(EV_MINOR_FINALIZED); + caml_gc_log("finalizing dead minor custom blocks"); + custom_finalize_minor(domain); + CAML_EV_END(EV_MINOR_FINALIZED); CAML_EV_BEGIN(EV_MINOR_FINALIZERS_ADMIN); caml_gc_log("running finalizer data structure book-keeping"); @@ -729,6 +754,7 @@ caml_stw_empty_minor_heap_no_major_slice(caml_domain_state* domain, CAML_EV_BEGIN(EV_MINOR_CLEAR); caml_gc_log("running stw empty_minor_heap_domain_clear"); caml_empty_minor_heap_domain_clear(domain); + #ifdef DEBUG { for (uintnat* p = initial_young_ptr; p < (uintnat*)domain->young_end; ++p) @@ -749,10 +775,11 @@ static void caml_stw_empty_minor_heap (caml_domain_state* domain, void* unused, } /* must be called within a STW section */ -void caml_empty_minor_heap_no_major_slice_from_stw(caml_domain_state* domain, - void* unused, - int participating_count, - caml_domain_state** participating) +void caml_empty_minor_heap_no_major_slice_from_stw( + caml_domain_state* domain, + void* unused, + int participating_count, + caml_domain_state** participating) { barrier_status b = caml_global_barrier_begin(); if( caml_global_barrier_is_final(b) ) { @@ -767,7 +794,7 @@ void caml_empty_minor_heap_no_major_slice_from_stw(caml_domain_state* domain, } /* must be called outside a STW section */ -int caml_try_stw_empty_minor_heap_on_all_domains (void) +int caml_try_empty_minor_heap_on_all_domains (void) { #ifdef DEBUG CAMLassert(!caml_domain_is_in_stw()); @@ -795,7 +822,7 @@ void caml_empty_minor_heaps_once (void) /* To handle the case where multiple domains try to execute a minor gc STW section */ do { - caml_try_stw_empty_minor_heap_on_all_domains(); + caml_try_empty_minor_heap_on_all_domains(); } while (saved_minor_cycle == atomic_load(&caml_minor_cycles_started)); } @@ -819,11 +846,9 @@ void caml_alloc_small_dispatch (caml_domain_state * dom_st, asynchronous callbacks. */ caml_raise_if_exception(caml_do_pending_actions_exn()); else { + /* In the case of allocations performed from C, only perform + non-delayable actions. */ caml_handle_gc_interrupt(); - /* In the case of long-running C code that regularly polls with - [caml_process_pending_actions], still force a query of all - callbacks at every minor collection or major slice. */ - dom_st->action_pending = 1; } /* Now, there might be enough room in the minor heap to do our diff --git a/runtime/misc.c b/runtime/misc.c index bd7330be4cc..6db9618b868 100644 --- a/runtime/misc.c +++ b/runtime/misc.c @@ -15,7 +15,7 @@ #define CAML_INTERNALS -#if _MSC_VER >= 1400 && _MSC_VER < 1700 +#if defined(_MSC_VER) && _MSC_VER >= 1400 && _MSC_VER < 1700 /* Microsoft introduced a regression in Visual Studio 2005 (technically it's not present in the Windows Server 2003 SDK which has a pre-release version) and the abort function ceased to be declared __declspec(noreturn). This was diff --git a/runtime/parsing.c b/runtime/parsing.c index ef5a9cb8f5a..11ae99f9bf9 100644 --- a/runtime/parsing.c +++ b/runtime/parsing.c @@ -157,9 +157,11 @@ static void print_trace (const char *template, ...){ /* The pushdown automata */ -CAMLprim value caml_parse_engine(struct parser_tables *tables, - struct parser_env *env, value cmd, value arg) +CAMLprim value caml_parse_engine(value vtables, value venv, + value cmd, value arg) { + struct parser_tables * tables = (struct parser_tables *) vtables; + struct parser_env * env = (struct parser_env *) venv; int state; mlsize_t sp, asp; int errflag; diff --git a/runtime/platform.c b/runtime/platform.c index b3bf88a7aaf..923d268676c 100644 --- a/runtime/platform.c +++ b/runtime/platform.c @@ -15,10 +15,12 @@ /**************************************************************************/ #define CAML_INTERNALS +#include "caml/config.h" #include +#ifdef HAS_UNISTD #include +#endif #include -#include #include "caml/osdeps.h" #include "caml/platform.h" #include "caml/fail.h" @@ -155,12 +157,8 @@ static struct lf_skiplist mmap_blocks = {NULL}; #ifndef _WIN32 #endif -void* caml_mem_map(uintnat size, uintnat alignment, int reserve_only) +void* caml_mem_map(uintnat size, int reserve_only) { - CAMLassert(Is_power_of_2(alignment)); - CAMLassert(Is_page_aligned(size)); - alignment = round_up(alignment, caml_plat_mmap_alignment); - #ifdef DEBUG if (mmap_blocks.head == NULL) { /* The first call to caml_mem_map should be during caml_init_domains, called @@ -170,7 +168,7 @@ void* caml_mem_map(uintnat size, uintnat alignment, int reserve_only) } #endif - void* mem = caml_plat_mem_map(size, alignment, reserve_only); + void* mem = caml_plat_mem_map(size, reserve_only); if (mem == 0) { caml_gc_message(0x1000, "mmap %" ARCH_INTNAT_PRINTF_FORMAT "d bytes failed", @@ -235,6 +233,10 @@ unsigned caml_plat_spin_wait(unsigned spins, if (spins < Slow_sleep_ns && Slow_sleep_ns <= next_spins) { caml_gc_log("Slow spin-wait loop in %s at %s:%d", function, file, line); } +#ifdef _WIN32 + Sleep(spins/1000000); +#else usleep(spins/1000); +#endif return next_spins; } diff --git a/runtime/power.S b/runtime/power.S index 957e9e90af8..7afefe8735b 100644 --- a/runtime/power.S +++ b/runtime/power.S @@ -15,6 +15,10 @@ .abiversion 2 +#if _CALL_ELF != 2 +#error "This POWER port requires the ELFv2 ABI" +#endif + /* Special registers */ #define SP 1 #define TMP 11 @@ -162,20 +166,20 @@ std 28, 0x0B0(TMP) /* Save caller-save floating-point registers */ /* (callee-saves are preserved by C functions) */ - stfd 1, 0x0B8(TMP) - stfd 2, 0x0C0(TMP) - stfd 3, 0x0C8(TMP) - stfd 4, 0x0D0(TMP) - stfd 5, 0x0D8(TMP) - stfd 6, 0x0E0(TMP) - stfd 7, 0x0E8(TMP) - stfd 8, 0x0F0(TMP) - stfd 9, 0x0F8(TMP) - stfd 10, 0x100(TMP) - stfd 11, 0x108(TMP) - stfd 12, 0x110(TMP) - stfd 13, 0x118(TMP) - stfd 14, 0x120(TMP) + stfd 0, 0x0B8(TMP) + stfd 1, 0x0C0(TMP) + stfd 2, 0x0C8(TMP) + stfd 3, 0x0D0(TMP) + stfd 4, 0x0D8(TMP) + stfd 5, 0x0E0(TMP) + stfd 6, 0x0E8(TMP) + stfd 7, 0x0F0(TMP) + stfd 8, 0x0F8(TMP) + stfd 9, 0x100(TMP) + stfd 10, 0x108(TMP) + stfd 11, 0x110(TMP) + stfd 12, 0x118(TMP) + stfd 13, 0x120(TMP) /* Save bucket to gc_regs */ std TMP, Caml_state(gc_regs) .endm @@ -210,20 +214,20 @@ ld 28, 0x0B0(TMP) /* Save caller-save floating-point registers (callee-saves are preserved by C functions) */ - lfd 1, 0x0B8(TMP) - lfd 2, 0x0C0(TMP) - lfd 3, 0x0C8(TMP) - lfd 4, 0x0D0(TMP) - lfd 5, 0x0D8(TMP) - lfd 6, 0x0E0(TMP) - lfd 7, 0x0E8(TMP) - lfd 8, 0x0F0(TMP) - lfd 9, 0x0F8(TMP) - lfd 10, 0x100(TMP) - lfd 11, 0x108(TMP) - lfd 12, 0x110(TMP) - lfd 13, 0x118(TMP) - lfd 14, 0x120(TMP) + lfd 0, 0x0B8(TMP) + lfd 1, 0x0C0(TMP) + lfd 2, 0x0C8(TMP) + lfd 3, 0x0D0(TMP) + lfd 4, 0x0D8(TMP) + lfd 5, 0x0E0(TMP) + lfd 6, 0x0E8(TMP) + lfd 7, 0x0F0(TMP) + lfd 8, 0x0F8(TMP) + lfd 9, 0x100(TMP) + lfd 10, 0x108(TMP) + lfd 11, 0x110(TMP) + lfd 12, 0x118(TMP) + lfd 13, 0x120(TMP) /* Put gc_regs struct back in bucket linked list */ ld TMP2, Caml_state(gc_regs_buckets) std TMP2, 0(TMP) /* next ptr */ @@ -288,6 +292,15 @@ ENDFUNCTION caml_call_gc /* Call a C function from OCaml. Function to call is in C_CALL_FUN */ +.macro RET_FROM_C_CALL + lbz TMP, Caml_state(action_pending) + cmplwi TMP, 0 + beqlr+ 0 + li TMP, -1 + std TMP, Caml_state(young_limit) + blr +.endm + FUNCTION caml_c_call .Lcaml_c_call: /* Save return address in caller's frame AND in a callee-save register */ @@ -311,7 +324,7 @@ FUNCTION caml_c_call /* Switch from C to OCaml */ SWITCH_C_TO_OCAML /* Return to caller */ - blr + RET_FROM_C_CALL ENDFUNCTION caml_c_call FUNCTION caml_c_call_stack_args @@ -351,7 +364,7 @@ FUNCTION caml_c_call_stack_args /* Switch from C to OCaml */ SWITCH_C_TO_OCAML /* Return to caller */ - blr + RET_FROM_C_CALL ENDFUNCTION caml_c_call_stack_args /* Raise an exception from OCaml */ @@ -806,6 +819,11 @@ FUNCTION caml_runstack b 1b ENDFUNCTION caml_runstack +FUNCTION caml_ml_array_bound_error + Addrglobal(C_CALL_FUN, caml_array_bound_error_asm) + b .Lcaml_c_call +ENDFUNCTION caml_resume + .section ".text" .globl caml_system__code_end caml_system__code_end: @@ -839,6 +857,7 @@ TOCENTRY(caml_program) TOCENTRY(caml_exn_Stack_overflow) TOCENTRY(caml_raise_unhandled_effect) TOCENTRY(caml_raise_continuation_already_resumed) +TOCENTRY(caml_array_bound_error_asm) TOCENTRYLABEL(fiber_exn_handler) TOCENTRYLABEL(trap_handler) diff --git a/runtime/riscv.S b/runtime/riscv.S index c17a7657975..8fc2b85563b 100644 --- a/runtime/riscv.S +++ b/runtime/riscv.S @@ -336,6 +336,15 @@ END_FUNCTION(caml_allocN) /* Call a C function from OCaml */ /* Function to call is in ADDITIONAL_ARG */ +.macro RET_FROM_C_CALL + lbu TMP, Caml_state(action_pending) + bnez TMP, 1f + ret +1: li TMP, -1 + sd TMP, Caml_state(young_limit) + ret +.endm + FUNCTION(caml_c_call) L(caml_c_call): CFI_OFFSET(ra, -8) @@ -356,7 +365,7 @@ L(caml_c_call): /* Return */ ld ra, 8(sp) addi sp, sp, 16 - ret + RET_FROM_C_CALL END_FUNCTION(caml_c_call) FUNCTION(caml_c_call_stack_args) @@ -398,7 +407,7 @@ FUNCTION(caml_c_call_stack_args) /* Return */ ld ra, 8(sp) addi sp, sp, 16 - ret + RET_FROM_C_CALL END_FUNCTION(caml_c_call_stack_args) /* Start the OCaml program */ diff --git a/runtime/runtime_events.c b/runtime/runtime_events.c index dedcb24d705..b92b45bac23 100644 --- a/runtime/runtime_events.c +++ b/runtime/runtime_events.c @@ -128,7 +128,7 @@ static void write_to_ring(ev_category category, ev_message_type type, int word_offset); static void events_register_write_buffer(int index, value event_name); -static void runtime_events_create_raw(void); +static void runtime_events_create_from_stw_single(void); void caml_runtime_events_init(void) { @@ -150,17 +150,15 @@ void caml_runtime_events_init(void) { caml_secure_getenv(T("OCAML_RUNTIME_EVENTS_PRESERVE")) ? 1 : 0; if (caml_secure_getenv(T("OCAML_RUNTIME_EVENTS_START"))) { - /* since [caml_runtime_events_init] can only be called from the startup code - and we can be sure there is only a single domain running, it is safe to call - [runtime_events_create_raw] outside of a stop-the-world section */ - runtime_events_create_raw(); + runtime_events_create_from_stw_single(); + /* stw_single: mutators and domains have not started yet. */ } } /* teardown the ring buffers. This must be called from a stop-the-world unless we are sure there is only a single domain running (e.g after a fork) */ -static void runtime_events_teardown_raw(int remove_file) { +static void runtime_events_teardown_from_stw_single(int remove_file) { #ifdef _WIN32 UnmapViewOfFile(current_metadata); CloseHandle(ring_file_handle); @@ -186,13 +184,15 @@ static void runtime_events_teardown_raw(int remove_file) { } /* Stop-the-world which calls the teardown code */ -static void stw_teardown_runtime_events(caml_domain_state *domain_state, - void *remove_file_data, int num_participating, - caml_domain_state **participating_domains) { +static void stw_teardown_runtime_events( + caml_domain_state *domain_state, + void *remove_file_data, int num_participating, + caml_domain_state **participating_domains) +{ caml_global_barrier(); if (participating_domains[0] == domain_state) { int remove_file = *(int*)remove_file_data; - runtime_events_teardown_raw(remove_file); + runtime_events_teardown_from_stw_single(remove_file); } caml_global_barrier(); } @@ -208,9 +208,9 @@ void caml_runtime_events_post_fork(void) { /* In the child we need to tear down the various structures used for the existing runtime_events from the parent. In doing so we need to make sure we don't remove the runtime_events file itself as that may still be used by - the parent. There is no need for a stop-the-world in this case as we are - certain there is only a single domain running. */ - runtime_events_teardown_raw(0 /* don't remove the file */); + the parent. */ + runtime_events_teardown_from_stw_single(0 /* don't remove the file */); + /* stw_single: mutators and domains have not started after the fork yet. */ /* We still have the path and ring size from our parent */ caml_runtime_events_start(); @@ -249,7 +249,7 @@ void caml_runtime_events_destroy(void) { /* Create the initial runtime_events ring buffers. This must be called from within a stop-the-world section if we cannot be sure there is only a single domain running. */ -static void runtime_events_create_raw(void) { +static void runtime_events_create_from_stw_single(void) { /* Don't initialise runtime_events twice */ if (!atomic_load_acquire(&runtime_events_enabled)) { int ret, ring_headers_length, ring_data_length; @@ -404,53 +404,60 @@ static void runtime_events_create_raw(void) { } } -/* Stop the world section which calls [runtime_events_create_raw], used when we - can't be sure there is only a single domain running. */ -static void -stw_create_runtime_events(caml_domain_state *domain_state, void *data, - int num_participating, - caml_domain_state **participating_domains) { - /* Everyone must be stopped for starting and stopping runtime_events */ +static void stw_create_runtime_events( + caml_domain_state *domain_state, void *unused, + int num_participating, + caml_domain_state **participating_domains) +{ caml_global_barrier(); /* Only do this on one domain */ if (participating_domains[0] == domain_state) { - runtime_events_create_raw(); + runtime_events_create_from_stw_single(); } caml_global_barrier(); } -CAMLprim value caml_runtime_events_start(void) { +CAMLexport void caml_runtime_events_start(void) { while (!atomic_load_acquire(&runtime_events_enabled)) { caml_try_run_on_all_domains(&stw_create_runtime_events, NULL, NULL); } - - return Val_unit; } -CAMLprim value caml_runtime_events_pause(void) { - if (!atomic_load_acquire(&runtime_events_enabled)) return Val_unit; +CAMLexport void caml_runtime_events_pause(void) { + if (!atomic_load_acquire(&runtime_events_enabled)) return; uintnat not_paused = 0; if( atomic_compare_exchange_strong(&runtime_events_paused, ¬_paused, 1) ) { caml_ev_lifecycle(EV_RING_PAUSE, 0); } - - return Val_unit; } -CAMLprim value caml_runtime_events_resume(void) { - if (!atomic_load_acquire(&runtime_events_enabled)) return Val_unit; +CAMLexport void caml_runtime_events_resume(void) { + if (!atomic_load_acquire(&runtime_events_enabled)) return; uintnat paused = 1; if( atomic_compare_exchange_strong(&runtime_events_paused, &paused, 0) ) { caml_ev_lifecycle(EV_RING_RESUME, 0); } +} + +/* Make the three functions above callable from OCaml */ - return Val_unit; +CAMLprim value caml_ml_runtime_events_start(value vunit) { + caml_runtime_events_start(); return Val_unit; } + +CAMLprim value caml_ml_runtime_events_pause(value vunit) { + caml_runtime_events_pause(); return Val_unit; +} + +CAMLprim value caml_ml_runtime_events_resume(value vunit) { + caml_runtime_events_resume(); return Val_unit; +} + static struct runtime_events_buffer_header *get_ring_buffer_by_domain_id (int domain_id) { return ( @@ -790,7 +797,7 @@ CAMLprim value caml_runtime_events_user_write(value event, value event_content) then it can be partially reconstructed, the only missing information being the associated tag. This function returns an event structure, except when the event is unknown and the event type id is EV_USER_ML_TYPE_CUSTOM. */ -CAMLprim value caml_runtime_events_user_resolve( +CAMLexport value caml_runtime_events_user_resolve( char* event_name, ev_user_ml_type event_type_id) { CAMLparam0(); diff --git a/runtime/s390x.S b/runtime/s390x.S index 76b70719270..a2f19a226e3 100644 --- a/runtime/s390x.S +++ b/runtime/s390x.S @@ -385,6 +385,13 @@ ENDFUNCTION(G(caml_allocN)) /* Call a C function from OCaml */ /******************************************************************************/ +#define RET_FROM_C_CALL \ + cli Caml_state(action_pending), 0; \ + ber %r14; \ + lghi TMP, -1; \ + stg TMP, Caml_state(young_limit); \ + br %r14 + FUNCTION(G(caml_c_call)) CFI_STARTPROC CFI_SIGNAL_FRAME @@ -418,7 +425,7 @@ LBL(caml_c_call): lg %r14, 0(%r15) CFI_RESTORE(14) la %r15, 8(%r15) - br %r14 + RET_FROM_C_CALL CFI_ENDPROC ENDFUNCTION(G(caml_c_call)) @@ -471,7 +478,7 @@ LBL(106): lg %r14, 0(%r15) CFI_RESTORE(14) la %r15, 8(%r15) - br %r14 + RET_FROM_C_CALL CFI_ENDPROC ENDFUNCTION(G(caml_c_call_stack_args)) diff --git a/runtime/shared_heap.c b/runtime/shared_heap.c index a8f426dbd71..376508b7563 100644 --- a/runtime/shared_heap.c +++ b/runtime/shared_heap.c @@ -17,7 +17,7 @@ #include #include - +#include #include "caml/addrmap.h" #include "caml/custom.h" #include "caml/runtime_events.h" @@ -25,6 +25,7 @@ #include "caml/fiber.h" /* for verification */ #include "caml/gc.h" #include "caml/globroots.h" +#include "caml/major_gc.h" #include "caml/memory.h" #include "caml/mlvalues.h" #include "caml/platform.h" @@ -32,6 +33,9 @@ #include "caml/shared_heap.h" #include "caml/sizeclasses.h" #include "caml/startup_aux.h" +#include "caml/weak.h" + +CAMLexport atomic_uintnat caml_compactions_count; typedef unsigned int sizeclass; @@ -48,14 +52,18 @@ typedef struct pool { caml_domain_state* owner; sizeclass sz; } pool; -CAML_STATIC_ASSERT(sizeof(pool) == Bsize_wsize(POOL_HEADER_WSIZE)); +static_assert(sizeof(pool) == Bsize_wsize(POOL_HEADER_WSIZE), ""); #define POOL_SLAB_WOFFSET(sz) (POOL_HEADER_WSIZE + wastage_sizeclass[sz]) +#define POOL_FIRST_BLOCK(p, sz) ((header_t*)(p) + POOL_SLAB_WOFFSET(sz)) +#define POOL_END(p) ((header_t*)(p) + POOL_WSIZE) +#define POOL_BLOCKS(p) ((POOL_WSIZE - POOL_HEADER_WSIZE) / \ + wsize_sizeclass[(p)->sz]) typedef struct large_alloc { caml_domain_state* owner; struct large_alloc* next; } large_alloc; -CAML_STATIC_ASSERT(sizeof(large_alloc) % sizeof(value) == 0); +static_assert(sizeof(large_alloc) % sizeof(value) == 0, ""); #define LARGE_ALLOC_HEADER_SZ sizeof(large_alloc) static struct { @@ -93,6 +101,10 @@ struct caml_heap_state { struct heap_stats stats; }; +struct compact_pool_stat { + int free_blocks; + int live_blocks; +}; /* You need to hold the [pool_freelist] lock to call these functions. */ static void orphan_heap_stats_with_lock(struct caml_heap_state *); @@ -113,6 +125,7 @@ struct caml_heap_state* caml_init_shared_heap (void) { heap->swept_large = NULL; heap->unswept_large = NULL; heap->owner = Caml_state; + memset(&heap->stats, 0, sizeof(heap->stats)); } return heap; @@ -166,23 +179,20 @@ void caml_teardown_shared_heap(struct caml_heap_state* heap) { /* Allocating and deallocating pools from the global freelist. */ -#define POOLS_PER_ALLOCATION 16 static pool* pool_acquire(struct caml_heap_state* local) { pool* r; caml_plat_lock(&pool_freelist.lock); if (!pool_freelist.free) { - void* mem = caml_mem_map(Bsize_wsize(POOL_WSIZE) * POOLS_PER_ALLOCATION, - Bsize_wsize(POOL_WSIZE), 0 /* allocate */); - int i; + void* mem = caml_mem_map(Bsize_wsize(POOL_WSIZE), 0); + if (mem) { CAMLassert(pool_freelist.free == NULL); - for (i=0; inext = pool_freelist.free; - r->owner = NULL; - pool_freelist.free = r; - } + + r = (pool*)mem; + r->next = pool_freelist.free; + r->owner = NULL; + pool_freelist.free = r; } } r = pool_freelist.free; @@ -194,23 +204,36 @@ static pool* pool_acquire(struct caml_heap_state* local) { return r; } +/* release [pool] to the current free list of pools */ static void pool_release(struct caml_heap_state* local, pool* pool, - sizeclass sz) { + sizeclass sz) +{ pool->owner = NULL; CAMLassert(pool->sz == sz); local->stats.pool_words -= POOL_WSIZE; local->stats.pool_frag_words -= POOL_HEADER_WSIZE + wastage_sizeclass[sz]; - /* TODO: give free pools back to the OS. Issue #698 */ caml_plat_lock(&pool_freelist.lock); pool->next = pool_freelist.free; pool_freelist.free = pool; caml_plat_unlock(&pool_freelist.lock); } -static void calc_pool_stats(pool* a, sizeclass sz, struct heap_stats* s) { - value* p = (value*)((char*)a + Bsize_wsize(POOL_SLAB_WOFFSET(sz))); - value* end = (value*)a + POOL_WSIZE; +/* free the memory of [pool], giving it back to the OS */ +static void pool_free(struct caml_heap_state* local, + pool* pool, + sizeclass sz) +{ + CAMLassert(pool->sz == sz); + local->stats.pool_words -= POOL_WSIZE; + local->stats.pool_frag_words -= POOL_HEADER_WSIZE + wastage_sizeclass[sz]; + caml_mem_unmap(pool, Bsize_wsize(POOL_WSIZE)); +} + +static void calc_pool_stats(pool* a, sizeclass sz, struct heap_stats* s) +{ + header_t* p = POOL_FIRST_BLOCK(a, sz); + header_t* end = POOL_END(a); mlsize_t wh = wsize_sizeclass[sz]; s->pool_frag_words += POOL_SLAB_WOFFSET(sz); @@ -234,8 +257,8 @@ Caml_inline void pool_initialize(pool* r, caml_domain_state* owner) { mlsize_t wh = wsize_sizeclass[sz]; - value* p = (value*)((char*)r + Bsize_wsize(POOL_SLAB_WOFFSET(sz))); - value* end = (value*)((char*)r + Bsize_wsize(POOL_WSIZE)); + header_t* p = POOL_FIRST_BLOCK(r, sz); + header_t* end = POOL_END(r); r->next = 0; r->owner = owner; @@ -249,11 +272,16 @@ Caml_inline void pool_initialize(pool* r, while (p + wh <= end) { p[0] = 0; /* zero header indicates free object */ p[1] = (value)(p - wh); + #ifdef DEBUG + for (int w = 2 ; w < wh; w++) { + p[w] = Debug_free_major; + } + #endif p += wh; } CAMLassert(p == end); CAMLassert((uintptr_t)end % Cache_line_bsize == 0); - r->next_obj = p - wh; + r->next_obj = (value*)(p - wh); } /* Allocating an object from a pool */ @@ -398,7 +426,7 @@ static void* large_allocate(struct caml_heap_state* local, mlsize_t sz) { } value* caml_shared_try_alloc(struct caml_heap_state* local, mlsize_t wosize, - tag_t tag, reserved_t reserved, int pinned) + tag_t tag, reserved_t reserved) { mlsize_t whsize = Whsize_wosize(wosize); value* p; @@ -423,7 +451,7 @@ value* caml_shared_try_alloc(struct caml_heap_state* local, mlsize_t wosize, p = large_allocate(local, Bsize_wsize(whsize)); if (!p) return 0; } - colour = pinned ? NOT_MARKABLE : caml_global_heap_state.MARKED; + colour = caml_global_heap_state.MARKED; Hd_hp (p) = Make_header_with_reserved(wosize, tag, colour, reserved); #ifdef DEBUG { @@ -436,18 +464,6 @@ value* caml_shared_try_alloc(struct caml_heap_state* local, mlsize_t wosize, return p; } -struct pool* caml_pool_of_shared_block(value v) -{ - mlsize_t whsize; - CAMLassert (Is_block(v) && !Is_young(v)); - whsize = Whsize_wosize(Wosize_val(v)); - if (whsize > 0 && whsize <= SIZECLASS_MAX) { - return (pool*)((uintnat)v &~(POOL_WSIZE * sizeof(value) - 1)); - } else { - return 0; - } -} - /* Sweeping */ static intnat pool_sweep(struct caml_heap_state* local, pool** plist, @@ -458,8 +474,8 @@ static intnat pool_sweep(struct caml_heap_state* local, pool** plist, *plist = a->next; { - value* p = (value*)((char*)a + Bsize_wsize(POOL_SLAB_WOFFSET(sz))); - value* end = (value*)a + POOL_WSIZE; + header_t* p = POOL_FIRST_BLOCK(a, sz); + header_t* end = POOL_END(a); mlsize_t wh = wsize_sizeclass[sz]; int all_used = 1; struct heap_stats* s = &local->stats; @@ -488,7 +504,7 @@ static intnat pool_sweep(struct caml_heap_state* local, pool** plist, } } #endif - a->next_obj = p; + a->next_obj = (value*)p; all_used = 0; /* update stats */ s->pool_live_blocks--; @@ -598,8 +614,8 @@ uintnat caml_heap_blocks(struct caml_heap_state* local) { void caml_redarken_pool(struct pool* r, scanning_action f, void* fdata) { mlsize_t wh = wsize_sizeclass[r->sz]; - value* p = (value*)((char*)r + Bsize_wsize(POOL_SLAB_WOFFSET(r->sz))); - value* end = (value*)((char*)r + Bsize_wsize(POOL_WSIZE)); + header_t* p = POOL_FIRST_BLOCK(r, r->sz); + header_t* end = POOL_END(r); while (p + wh <= end) { header_t hd = p[0]; @@ -777,7 +793,7 @@ static void verify_object(struct heap_verify_state* st, value v) { } } -void caml_verify_heap(caml_domain_state *domain) { +void caml_verify_heap_from_stw(caml_domain_state *domain) { struct heap_verify_state* st = caml_verify_begin(); caml_do_roots (&caml_verify_root, verify_scanning_flags, st, domain, 1); caml_scan_global_roots(&caml_verify_root, st); @@ -789,6 +805,492 @@ void caml_verify_heap(caml_domain_state *domain) { caml_stat_free(st); } +/* Compaction starts here. See [caml_compact_heap] for entry. */ + +/* Given a single value `v`, found at `p`, check if it points to an + evacuated block, and if so update it using the forwarding pointer + created by the compactor. */ +static inline void compact_update_value(void* ignored, + value v, + volatile value* p) +{ + if (Is_block(v)) { + CAMLassert(!Is_young(v)); + + tag_t tag = Tag_val(v); + + int infix_offset = 0; + if (tag == Infix_tag) { + infix_offset = Infix_offset_val(v); + /* v currently points to an Infix_tag inside of a Closure_tag. + The forwarding pointer we want is in the first field of the + Closure_tag. */ + v -= infix_offset; + CAMLassert(Tag_val(v) == Closure_tag); + } + + /* non-markable blocks can't move */ + if (Has_status_val(v, NOT_MARKABLE)) + return; + + if (Whsize_val(v) <= SIZECLASS_MAX) { + /* MARKED header status means the location `p` points to a block that + has been evacuated. Use the forwarding pointer in the first field + to update to the new location. */ + if (Has_status_val(v, caml_global_heap_state.MARKED)) { + value fwd = Field(v, 0) + infix_offset; + CAMLassert(Is_block(fwd)); + CAMLassert(Tag_val(fwd) == tag); + *p = fwd; + } + } + } +} + +/* Given a value found at `p` check if it points to an evacuated + block, and if so update it using the forwarding pointer created by + the compactor. */ +static inline void compact_update_value_at(volatile value* p) +{ + compact_update_value(NULL, *p, p); +} + +/* For each pointer in the block pointed to by `p`, check if it points + to an evacuated block and if so update it using the forwarding + pointer created by the compactor. */ +static void compact_update_block(header_t* p) +{ + header_t hd = Hd_hp(p); + + /* We should never be called with a block that has a zero header (this would + indicate a bug in traversing the shared pools). */ + CAMLassert(hd != 0); + + tag_t tag = Tag_hd(hd); + + /* We should never encounter an Infix tag iterating over the shared pools or + large allocations. We could find it in roots but those use + [compact_update_value]. */ + CAMLassert(tag != Infix_tag); + + if (tag == Cont_tag) { + value stk = Field(Val_hp(p), 0); + if (Ptr_val(stk)) { + caml_scan_stack(&compact_update_value, 0, NULL, Ptr_val(stk), 0); + } + } else { + uintnat offset = 0; + + if (tag == Closure_tag) { + offset = Start_env_closinfo(Closinfo_val(Val_hp(p))); + } + + if (tag < No_scan_tag) { + mlsize_t wosz = Wosize_hd(hd); + for (mlsize_t i = offset; i < wosz; i++) { + compact_update_value_at(&Field(Val_hp(p), i)); + } + } + } +} + +/* Update all the live blocks in a list of pools. */ + +static void compact_update_pools(pool *cur_pool) +{ + while (cur_pool) { + header_t* p = POOL_FIRST_BLOCK(cur_pool, cur_pool->sz); + header_t* end = POOL_END(cur_pool); + mlsize_t wh = wsize_sizeclass[cur_pool->sz]; + + while (p + wh <= end) { + if (*p && + Has_status_val(Val_hp(p), caml_global_heap_state.UNMARKED)) { + compact_update_block(p); + } + p += wh; + } + cur_pool = cur_pool->next; + } +} + +/* Update all the fields in the list of ephemerons found at `*ephe_p` */ + +static void compact_update_ephe_list(volatile value *ephe_p) +{ + while (*ephe_p) { + compact_update_value_at(ephe_p); + + value ephe = *ephe_p; + mlsize_t wosize = Wosize_val(ephe); + compact_update_value_at(&Field(ephe, CAML_EPHE_DATA_OFFSET)); + + for (int i = CAML_EPHE_FIRST_KEY ; i < wosize ; i++) { + compact_update_value_at(&Field(ephe, i)); + } + + ephe_p = &Field(ephe, CAML_EPHE_LINK_OFFSET); + } +} + +/* Compact the heap for the given domain. Run in parallel for all domains. */ + +void caml_compact_heap(caml_domain_state* domain_state, + int participating_count, + caml_domain_state** participants) +{ + caml_gc_log("Compacting heap start"); + CAML_EV_BEGIN(EV_COMPACT); + /* Warning: caml_compact_heap must only be called from + [cycle_all_domains_callback] in major_gc.c as there are + very specific conditions the compaction algorithm expects. + + The following code implements a compaction algorithm that is similar to + Edward's Two-Finger algorithm from the original 1974 LISP book (The + Programming Language LISP). At a high level the algorithm works as a series + of parallel (using all running domains) phases separated by global barriers: + + 1. For each size class + a. Compute the number of live blocks in partially filled pools + b. Keep enough pools to fully contain the number of live blocks and + set the rest to be evacuated + c. For each live block in each pool in the evacuation list, + allocate and copy into a non-evacuating pool. + 2. Proceed through the roots and the heap, updating pointers to evacuated + blocks to point to the new location of the block. Update finalisers and + ephemerons too. + 3. Go through pools evacuated and release them. Finally free all but + one pool in the freelist. + 4. One domain needs to release the pools in the freelist back to the OS. + + The algorithm requires one full pass through the whole heap (pools and large + allocations) to rewrite pointers, as well as two passes through the + partially-occupied pools in the heap to compute the number of live blocks + and evacuate them. + */ + + /* First phase. Here we compute the number of live blocks in partially + filled pools, determine pools to be evacuated and then evacuate from them. + For the first phase we need not consider full pools, they + cannot be evacuated to or from. */ + caml_global_barrier(); + CAML_EV_BEGIN(EV_COMPACT_EVACUATE); + + struct caml_heap_state* heap = Caml_state->shared_heap; + + #ifdef DEBUG + /* Check preconditions for the heap: */ + for (int sz_class = 1; sz_class < NUM_SIZECLASSES; sz_class++) { + /* No sweeping has happened yet */ + CAMLassert(heap->avail_pools[sz_class] == NULL); + CAMLassert(heap->full_pools[sz_class] == NULL); + CAMLassert(heap->swept_large == NULL); + /* No pools waiting for adoption */ + if (participants[0] == Caml_state) { + CAMLassert(pool_freelist.global_avail_pools[sz_class] == NULL); + CAMLassert(pool_freelist.global_full_pools[sz_class] == NULL); + } + /* The minor heap is empty */ + CAMLassert(Caml_state->young_ptr == Caml_state->young_end); + /* The mark stack is empty */ + CAMLassert(caml_mark_stack_is_empty()); + } + #endif + + /* All evacuated pools (of every size class) */ + pool *evacuated_pools = NULL; + + for (int sz_class = 1; sz_class < NUM_SIZECLASSES; sz_class++) { + /* We only care about moving things in pools that aren't full (we cannot + evacuate to or from a full pool) */ + pool* cur_pool = heap->unswept_avail_pools[sz_class]; + + if (!cur_pool) { + /* No partially filled pools for this size, nothing to do */ + continue; + } + + /* count the number of pools */ + int num_pools = 0; + + while (cur_pool) { + num_pools++; + cur_pool = cur_pool->next; + } + + struct compact_pool_stat* pool_stats = caml_stat_alloc_noexc( + sizeof(struct compact_pool_stat) * num_pools); + + /* if we're unable to allocate pool_stats here then we should avoid + evacuating this size class. It's unlikely but it may be that we had + better success with an earlier size class and that results in some + memory being freed up. */ + if( pool_stats == NULL ) { + caml_gc_log("Unable to allocate pool_stats for size class %d", sz_class); + + continue; + } + + cur_pool = heap->unswept_avail_pools[sz_class]; + + /* Count the number of free and live blocks in each pool. Note that a live + block here currently has the header status UNMARKED (because it was + MARKED in the previous cycle). After compaction the shared pools will + contain UNMARKED and GARBAGE from the "to" pools and UNMARKED from the + "from" pools which were evacuated. + + At the cost of some complexity or an additional pass we could compute the + exact amount of space needed or even sweep all pools in this counting + pass. + */ + int k = 0; + int total_live_blocks = 0; +#ifdef DEBUG + int total_free_blocks = 0; +#endif + while (cur_pool) { + header_t* p = POOL_FIRST_BLOCK(cur_pool, sz_class); + header_t* end = POOL_END(cur_pool); + mlsize_t wh = wsize_sizeclass[sz_class]; + + pool_stats[k].free_blocks = 0; + pool_stats[k].live_blocks = 0; + + while (p + wh <= end) { + header_t h = (header_t)atomic_load_relaxed((atomic_uintnat*)p); + + /* A zero header in a shared heap pool indicates an empty space */ + if (!h) { + pool_stats[k].free_blocks++; +#ifdef DEBUG + total_free_blocks++; +#endif + } else if (Has_status_hd(h, caml_global_heap_state.UNMARKED)) { + total_live_blocks++; + pool_stats[k].live_blocks++; + } + p += wh; + } + + cur_pool = cur_pool->next; + k++; + } + + /* Note that partially filled pools must have at least some free space*/ +#ifdef DEBUG + CAMLassert(total_free_blocks > 0); +#endif + + if (!total_live_blocks) { + /* No live (i.e unmarked) blocks in partially filled pools, nothing to do + for this size class */ + continue; + } + + /* Now we use the pool stats to calculate which pools will be evacuated. We + want to walk through the pools and check whether we have enough free + blocks in the pools behind us to accommodate all the remaining live + blocks. */ + int free_blocks = 0; + int j = 0; + int remaining_live_blocks = total_live_blocks; + + cur_pool = heap->unswept_avail_pools[sz_class]; + /* [last_pool_p] will be a pointer to the next field of the last + non-evacuating pool. We need this so we can snip the list of evacuating + pools from [unswept_avail_pools] and eventually attach them all to + [evacuated_pools]. */ + pool **last_pool_p = &heap->unswept_avail_pools[sz_class]; + while (cur_pool) { + if (free_blocks >= remaining_live_blocks) { + break; + } + + free_blocks += pool_stats[j].free_blocks; + remaining_live_blocks -= pool_stats[j].live_blocks; + last_pool_p = &cur_pool->next; + cur_pool = cur_pool->next; + j++; + } + + /* We're done with the pool stats. */ + caml_stat_free(pool_stats); + + /* `cur_pool` now points to the first pool we are evacuating, or NULL if + we could not compact this particular size class (for this domain) */ + + /* Snip the evacuating pools from list of pools we are retaining */ + *last_pool_p = NULL; + + /* Evacuate marked blocks from the evacuating pools into the + avail pools. */ + while (cur_pool) { + header_t* p = POOL_FIRST_BLOCK(cur_pool, sz_class); + header_t* end = POOL_END(cur_pool); + mlsize_t wh = wsize_sizeclass[sz_class]; + + while (p + wh <= end) { + header_t hd = (header_t)atomic_load_relaxed((atomic_uintnat*)p); + + /* A zero header in a shared heap pool indicates an empty space */ + if (hd) { + CAMLassert (!Has_status_hd(hd, caml_global_heap_state.MARKED)); + CAMLassert (!Has_status_hd(hd, NOT_MARKABLE)); + + /* Reminder: since colours have rotated, UNMARKED indicates a MARKED + (i.e live) block */ + if (Has_status_hd(hd, caml_global_heap_state.UNMARKED)) { + /* live block in an evacuating pool, so we evacuate it to + * the first available block */ + pool* to_pool = heap->unswept_avail_pools[sz_class]; + value* new_p = to_pool->next_obj; + CAMLassert(new_p); + value *next = (value*)new_p[1]; + to_pool->next_obj = next; + + if (!next) { + /* This pool is full. Move it to unswept_full_pools */ + heap->unswept_avail_pools[sz_class] = to_pool->next; + to_pool->next = heap->unswept_full_pools[sz_class]; + heap->unswept_full_pools[sz_class] = to_pool; + } + + /* Copy the block to the new location */ + memcpy(new_p, p, Whsize_hd(hd) * sizeof(value)); + + /* Set first field of p to a forwarding pointer */ + Field(Val_hp(p), 0) = Val_hp(new_p); + + /* Since there can be no blocks with the MARKED status, we use this + to indicate that a block has been evacuated and any pointers to + it should be updated. */ + *p = With_status_hd(hd, caml_global_heap_state.MARKED); + } else if (Has_status_hd(hd, caml_global_heap_state.GARBAGE)) { + /* We are implicitly sweeping pools in the evacuation set and thus + we must remember to call finalisers for Custom blocks that would + have been swept in a subsequent major cycle. */ + if (Tag_hd (hd) == Custom_tag) { + void (*final_fun)(value) = Custom_ops_val(Val_hp(p))->finalize; + if (final_fun) final_fun(Val_hp(p)); + } + + /* In the DEBUG runtime, we should overwrite the fields of swept + blocks. Note: this pool can't be allocated in to again and so + we overwrite the header and first fields too. */ + #ifdef DEBUG + for (int w = 0 ; w < wh ; w++) { + Field(p, w) = Debug_free_major; + } + #endif + } + } + + p += wh; + } + /* move pool to evacuated pools list, continue to next pool */ + pool *next = cur_pool->next; + cur_pool->next = evacuated_pools; + evacuated_pools = cur_pool; + cur_pool = next; + } + } + + CAML_EV_END(EV_COMPACT_EVACUATE); + caml_global_barrier(); + CAML_EV_BEGIN(EV_COMPACT_FORWARD); + + /* Second phase: at this point all live blocks in evacuated pools + have been moved and their old locations' first fields now point to + their new locations. We now go through all pools again (including + full ones this time) and for each field we check if the block the + field points to has the header status MARKED - if it does then the block + has been evacuated and we need to update the field to point to the new + location. We do this by using the forwarding pointer that is in the first + field of the evacuated block. */ + + /* First we do roots (locals and finalisers) */ + caml_do_roots(&compact_update_value, 0, NULL, Caml_state, 1); + + /* Next, one domain does the global roots */ + if (participants[0] == Caml_state) { + caml_scan_global_roots(&compact_update_value, NULL); + } + + /* Shared heap pools. */ + for (int sz_class = 1; sz_class < NUM_SIZECLASSES; sz_class++) { + compact_update_pools(heap->unswept_avail_pools[sz_class]); + compact_update_pools(heap->unswept_full_pools[sz_class]); + } + + /* Large allocations */ + for (large_alloc* la = heap->unswept_large; la != NULL; la = la->next) { + header_t* p = (header_t*)((char*)la + LARGE_ALLOC_HEADER_SZ); + if (Has_status_val(Val_hp(p), caml_global_heap_state.UNMARKED)) { + compact_update_block(p); + } + } + + /* Ephemerons */ + struct caml_ephe_info* ephe_info = Caml_state->ephe_info; + compact_update_ephe_list(&ephe_info->todo); + compact_update_ephe_list(&ephe_info->live); + + CAML_EV_END(EV_COMPACT_FORWARD); + caml_global_barrier(); + CAML_EV_BEGIN(EV_COMPACT_RELEASE); + + /* Third phase: free all evacuated pools and release the mappings back to + the OS. + + Note that we may have no "available" pools left, if all + remaining pools have been filled up by evacuated blocks. */ + + pool* cur_pool = evacuated_pools; + while (cur_pool) { + pool* next_pool = cur_pool->next; + + #ifdef DEBUG + for (header_t *p = POOL_FIRST_BLOCK(cur_pool, cur_pool->sz); + p < POOL_END(cur_pool); p++) { + *p = Debug_free_major; + } + #endif + + pool_free(heap, cur_pool, cur_pool->sz); + cur_pool = next_pool; + } + + CAML_EV_END(EV_COMPACT_RELEASE); + caml_global_barrier(); + + /* Fourth phase: one domain also needs to release the free list */ + if( participants[0] == Caml_state ) { + pool* cur_pool; + pool* next_pool; + + caml_plat_lock(&pool_freelist.lock); + cur_pool = pool_freelist.free; + + while( cur_pool ) { + next_pool = cur_pool->next; + /* No stats to update so just unmap */ + caml_mem_unmap(cur_pool, Bsize_wsize(POOL_WSIZE)); + cur_pool = next_pool; + } + + pool_freelist.free = NULL; + + caml_plat_unlock(&pool_freelist.lock); + + /* We are done, increment our compaction count */ + atomic_fetch_add(&caml_compactions_count, 1); + } + + caml_gc_log("Compacting heap complete"); + CAML_EV_END(EV_COMPACT); +} + +/* Compaction end */ struct mem_stats { /* unit is words */ @@ -807,8 +1309,8 @@ static void verify_pool(pool* a, sizeclass sz, struct mem_stats* s) { } { - value* p = (value*)((char*)a + Bsize_wsize(POOL_SLAB_WOFFSET(sz))); - value* end = (value*)a + POOL_WSIZE; + header_t* p = POOL_FIRST_BLOCK(a, sz); + header_t* end = POOL_END(a); mlsize_t wh = wsize_sizeclass[sz]; s->overhead += POOL_SLAB_WOFFSET(sz); @@ -882,7 +1384,7 @@ static void verify_swept (struct caml_heap_state* local) { CAMLassert(local->stats.large_blocks == large_stats.live_blocks); } -void caml_cycle_heap_stw (void) { +void caml_cycle_heap_from_stw_single (void) { struct global_heap_state oldg = caml_global_heap_state; struct global_heap_state newg; newg.UNMARKED = oldg.MARKED; diff --git a/runtime/signals.c b/runtime/signals.c index 6dc6c3b6de8..d8cfacf8d0d 100644 --- a/runtime/signals.c +++ b/runtime/signals.c @@ -19,6 +19,7 @@ #include #include +#include #include "caml/config.h" #ifdef USE_MMAP_MAP_STACK #include @@ -45,7 +46,7 @@ CAMLexport atomic_uintnat caml_pending_signals[NSIG_WORDS]; static caml_plat_mutex signal_install_mutex = CAML_PLAT_MUTEX_INITIALIZER; -int caml_check_pending_signals(void) +CAMLexport int caml_check_pending_signals(void) { int i; for (i = 0; i < NSIG_WORDS; i++) { @@ -92,7 +93,7 @@ CAMLexport value caml_process_pending_signals_exn(void) if (curr == 0) goto next_word; if ((curr & mask) == 0) goto next_bit; } - exn = caml_execute_signal_exn(signo, 0); + exn = caml_execute_signal_exn(signo); if (Is_exception_result(exn)) return exn; /* curr probably changed during the evaluation of the signal handler; refresh it from memory */ @@ -106,12 +107,8 @@ CAMLexport value caml_process_pending_signals_exn(void) } /* Record the delivery of a signal, and arrange for it to be processed - as soon as possible: - - via Caml_state->action_pending, processed in - caml_process_pending_actions. - - by playing with the allocation limit, processed in - caml_alloc_small_dispatch. -*/ + as soon as possible, by playing with the allocation limit, + processed in caml_alloc_small_dispatch. */ CAMLexport void caml_record_signal(int signal_number) { unsigned int i; @@ -119,8 +116,28 @@ CAMLexport void caml_record_signal(int signal_number) i = signal_number - 1; atomic_fetch_or(&caml_pending_signals[i / BITS_PER_WORD], (uintnat)1 << (i % BITS_PER_WORD)); - // FIXME: the TLS variable is not thread-safe - caml_interrupt_self(); + /* We interrupt all domains when a signal arrives. Signals (SIGINT, + SIGALRM...) arrive infrequently-enough that this is affordable. + This is a strategy that makes as little assumptions as possible + about signal-safety, threads, and domains. + + * In mixed C/OCaml applications there is no guarantee that the + POSIX signal handler runs in an OCaml thread, so Caml_state might + be unavailable. + + * While C11 mandates that atomic thread-local variables are + async-signal-safe for reading, gcc does not conform and can + allocate in corner cases involving dynamic linking. It is also + unclear whether the OSX implementation conforms, but this might + be a theoretical concern only. + + * The thread executing a POSIX signal handler is not necessarily + the most ready to execute the corresponding OCaml signal handler. + Examples: + - Ctrl-C in the toplevel when domain 0 is stuck inside [Domain.join]. + - a thread that has just spawned, before the appropriate mask is set. + */ + caml_interrupt_all_signal_safe(); } /* Management of blocking sections. */ @@ -142,12 +159,20 @@ CAMLexport void (*caml_enter_blocking_section_hook)(void) = CAMLexport void (*caml_leave_blocking_section_hook)(void) = caml_leave_blocking_section_default; +static int check_pending_actions(caml_domain_state * dom_st); + CAMLexport void caml_enter_blocking_section(void) { caml_domain_state * domain = Caml_state; - while (1){ + while (1) { /* Process all pending signals now */ - caml_process_pending_actions(); + if (check_pending_actions(domain)) { + /* First reset young_limit, and set action_pending in case there + are further async callbacks pending beyond OCaml signal + handlers. */ + caml_handle_gc_interrupt(); + caml_raise_if_exception(caml_process_pending_signals_exn()); + } caml_enter_blocking_section_hook (); /* Check again if a signal arrived in the meanwhile. If none, done; otherwise, try again. Since we do not hold the domain @@ -184,7 +209,7 @@ CAMLexport void caml_leave_blocking_section(void) So we force the examination of signals as soon as possible. */ - if (Caml_state->action_pending || caml_check_pending_signals()) + if (caml_check_pending_signals()) caml_set_action_pending(Caml_state); errno = saved_errno; @@ -203,10 +228,8 @@ void caml_init_signal_handling(void) { /* Execute a signal handler immediately */ -value caml_execute_signal_exn(int signal_number, int in_signal_handler) +value caml_execute_signal_exn(int signal_number) { - value res; - value handler; #ifdef POSIX_SIGNALS sigset_t nsigs, sigs; /* Block the signal before executing the handler, and record in sigs @@ -215,19 +238,12 @@ value caml_execute_signal_exn(int signal_number, int in_signal_handler) sigaddset(&nsigs, signal_number); pthread_sigmask(SIG_BLOCK, &nsigs, &sigs); #endif - handler = Field(caml_signal_handlers, signal_number); - res = caml_callback_exn( - handler, - Val_int(caml_rev_convert_signal_number(signal_number))); + value handler = Field(caml_signal_handlers, signal_number); + value signum = Val_int(caml_rev_convert_signal_number(signal_number)); + value res = caml_callback_exn(handler, signum); #ifdef POSIX_SIGNALS - if (! in_signal_handler) { - /* Restore the original signal mask */ - pthread_sigmask(SIG_SETMASK, &sigs, NULL); - } else if (Is_exception_result(res)) { - /* Restore the original signal mask and unblock the signal itself */ - sigdelset(&sigs, signal_number); - pthread_sigmask(SIG_SETMASK, &sigs, NULL); - } + /* Restore the original signal mask */ + pthread_sigmask(SIG_SETMASK, &sigs, NULL); #endif return res; } @@ -251,64 +267,84 @@ void caml_request_minor_gc (void) } -/* Pending asynchronous actions ([Caml_state->action_pending]) +/* Pending asynchronous actions (the flag [Caml_state->action_pending]) === - There are two kinds of asynchronous actions: - - - Those that cannot be delayed but never call OCaml code (STW - interrupts, requested minor or major GC, forced systhread yield). - - - Those that may raise OCaml exceptions but can be delayed - (asynchronous callbacks, finalisers, memprof callbacks). - - [Caml_state->action_pending] records whether an action of the - second kind is currently pending, and is reset _at the beginning_ - of processing all actions. + [Caml_state->action_pending] records that an asynchronous action + might have been delayed. - Hence, when a delayable action is pending, either - [Caml_state->action_pending] is 1, or there is a function currently - running which is executing all actions. + There are two kinds of asynchronous actions: - This is used to ensure [Caml_state->young_limit] is always set - appropriately. + - Those that we execute immediately in all circumstances (STW + interrupts, requested minor or major GC, forced systhread yield); + they must never call OCaml code. + + - Those that run OCaml code and may raise OCaml exceptions + (asynchronous callbacks, finalisers, memprof callbacks); those + can be delayed, and do not run during allocations from C. + + Queued asynchronous actions are notified to the domain by setting + [young_limit] to a high value, thereby making the next allocation + fail. When this happens, all non-delayable actions are performed + immediately. Then, the delayable actions are either all processed + immediately, if the context is ready to run OCaml code concurrently + and receive an asynchronous exception (in the case of an allocation + from OCaml), or [Caml_state->action_pending] is set in order to + record that an action of the delayable kind might be pending (in + the case of an allocation from C, typically). + + [Caml_state->action_pending] remains set until the program calls + [caml_process_pending_actions], [caml_leave_blocking_section], or + it returns to OCaml. When returning to OCaml, we set again + [Caml_state->young_limit] to a high value if + [Caml_state->action_pending] is set, to execute asynchronous + actions as soon as possible when back in OCaml code. + + [Caml_state->action_pending] is then reset _at the beginning_ of + processing all actions. Hence, when a delayable action is pending, + either [Caml_state->action_pending] is true, or there is a function + running which is in process of executing all actions. In case there are two different callbacks (say, a signal and a finaliser) arriving at the same time, then the processing of one awaits the return of the other. In case of long-running callbacks, we may want to run the second one without waiting the end of the first one. We do this by provoking an additional polling every - minor collection and every major slice. To guarantee a low latency - for signals, we avoid delaying signal handlers in that case by - calling them first. + minor collection and every major slice. In order to guarantee a low + latency for signals, we avoid delaying signal handlers in that case + by calling them first. */ -CAMLno_tsan /* When called from [caml_record_signal], these memory - accesses may not be synchronized. Otherwise we assume - that we have unique access to dom_st. */ -void caml_set_action_pending(caml_domain_state * dom_st) +/* We assume that we have unique access to dom_st. */ +CAMLexport void caml_set_action_pending(caml_domain_state * dom_st) { - dom_st->action_pending = 1; - atomic_store_release(&dom_st->young_limit, (uintnat)-1); + dom_st->action_pending = true; +} + +static int check_pending_actions(caml_domain_state * dom_st) +{ + return Caml_check_gc_interrupt(dom_st) || dom_st->action_pending; } CAMLexport int caml_check_pending_actions(void) { Caml_check_caml_state(); - return Caml_check_gc_interrupt(Caml_state) || Caml_state->action_pending; + return check_pending_actions(Caml_state); } value caml_do_pending_actions_exn(void) { - Caml_state->action_pending = 0; - /* 1. Non-delayable actions that do not run OCaml code. */ /* Do any pending STW interrupt, minor collection or major slice */ caml_handle_gc_interrupt(); /* [young_limit] has now been reset. */ - /* 2. Delayable actions that may raise OCaml exceptions. */ + /* 2. Delayable actions that may raise OCaml exceptions. + + We can now clear the action_pending flag since we are going to + execute all actions. */ + Caml_state->action_pending = false; /* Call signal handlers first */ value exn = caml_process_pending_signals_exn(); @@ -561,16 +597,6 @@ void caml_init_signals(void) } } } -#endif - /* Bound-check trap handling for Power */ -#if defined(NATIVE_CODE) && defined(TARGET_power) - { - struct sigaction act; - act.sa_sigaction = caml_sigtrap_handler; - sigemptyset(&act.sa_mask); - act.sa_flags = SA_SIGINFO | SA_NODEFER; - sigaction(SIGTRAP, &act, NULL); - } #endif } diff --git a/runtime/signals_nat.c b/runtime/signals_nat.c index 4d904c8edbd..3efb0580a6f 100644 --- a/runtime/signals_nat.c +++ b/runtime/signals_nat.c @@ -85,37 +85,3 @@ void caml_garbage_collection(void) nallocs, alloc_len); } } - -/* Trap handling for the POWER architecture. Convert the trap into - an out-of-bounds exception. */ - -#if defined(TARGET_power) - -extern void caml_array_bound_error_asm(void); - -void caml_sigtrap_handler(int signo, siginfo_t * info, void * context) -{ - /* The trap occurs in ocamlopt-generated code. */ - /* The purpose of this function is to simulate a [caml_c_call] - to [caml_array_bound_error_asm]. */ - - caml_domain_state * dom_st = Caml_state; - /* Recover the values of interesting registers. */ - ucontext_t * ctx = context; - uint64_t ctx_pc = ctx->uc_mcontext.gp_regs[32]; - uint64_t ctx_sp = ctx->uc_mcontext.gp_regs[1]; - uint64_t ctx_exn_ptr = ctx->uc_mcontext.gp_regs[29]; - uint64_t ctx_young_ptr = ctx->uc_mcontext.gp_regs[31]; - /* Save address of trap as the return address in the standard stack frame - location, so that it will be recorded in the stack backtrace. */ - ((uint64_t *) ctx_sp)[2] = ctx_pc; - /* Record the OCaml stack pointer (for backtraces) */ - /* Update the exception handler pointer and the allocation pointer */ - dom_st->current_stack-> sp = (void *) ctx_sp; - dom_st->young_ptr = (value *) ctx_young_ptr; - dom_st->exn_handler = (void *) ctx_exn_ptr; - /* Raise the exception */ - caml_array_bound_error_asm(); -} - -#endif diff --git a/runtime/skiplist.c b/runtime/skiplist.c index f81d520b31e..ad77c9f5a54 100644 --- a/runtime/skiplist.c +++ b/runtime/skiplist.c @@ -26,11 +26,7 @@ #include "caml/skiplist.h" /* Size of struct skipcell, in bytes, without the forward array */ -#if (__STDC_VERSION__ >= 199901L) #define SIZEOF_SKIPCELL sizeof(struct skipcell) -#else -#define SIZEOF_SKIPCELL (sizeof(struct skipcell) - sizeof(struct skipcell *)) -#endif /* Generate a random level for a new node: 0 with probability 3/4, 1 with probability 3/16, 2 with probability 3/64, etc. diff --git a/runtime/startup_byt.c b/runtime/startup_byt.c index 3cb74f27d2c..962307b0a67 100644 --- a/runtime/startup_byt.c +++ b/runtime/startup_byt.c @@ -404,7 +404,7 @@ static void do_print_config(void) "false"); #endif printf("windows_unicode: %s\n", -#if WINDOWS_UNICODE +#if defined(WINDOWS_UNICODE) && WINDOWS_UNICODE != 0 "true"); #else "false"); diff --git a/runtime/sys.c b/runtime/sys.c index 26c7246b00c..a90d1b2fa48 100644 --- a/runtime/sys.c +++ b/runtime/sys.c @@ -219,7 +219,7 @@ CAMLprim value caml_sys_exit(value retcode) #endif #endif -const static int sys_open_flags[] = { +static const int sys_open_flags[] = { O_RDONLY, O_WRONLY, O_APPEND | O_WRONLY, O_CREAT, O_TRUNC, O_EXCL, O_BINARY, O_TEXT, O_NONBLOCK }; diff --git a/runtime/tsan.c b/runtime/tsan.c index 391c619345c..9ff85246bfa 100644 --- a/runtime/tsan.c +++ b/runtime/tsan.c @@ -74,10 +74,10 @@ 1.1 From OCaml - Both `caml_raise_exn` and `caml_tsan_raise_notrace_exn` need to call - `caml_tsan_exit_on_raise` to issue calls to `__tsan_func_exit` for each - OCaml function exited by the exception. The process should be repeated - when re-raising until the appropriate exception handler is found. + Exception raising must be preceded by a call to `caml_tsan_exit_on_raise` + to issue calls to `__tsan_func_exit` for each OCaml function exited by the + exception. The process should be repeated when re-raising until the + appropriate exception handler is found. 1.2 From C @@ -98,7 +98,99 @@ effect handler. When `resume` is called, the runtime must call `__tsan_func_entry` for every function in every fiber between the effect handler and the actual - computation. */ + computation. + + 3. Memory model considerations + + TSan is designed to detect data races as defined by the C11 memory model. + Yet we are using it to detect data races in OCaml programs, and even in a + mix of OCaml and C code (e.g. between the program and the runtime). To + accomplish this, we use a carefully chosen mapping of OCaml memory accesses + to C11 accesses. + + For each type of OCaml memory access on the left, we signal to TSan the + operations on the right: + + OCaml access | C11 equivalent | TSan view + ------------------|-------------------------|-------------------------------- + Atomic load | fence(acquire) | __tsan_atomic64_load(seq_cst) + | atomic_load(seq_cst) | + ------------------|-------------------------|-------------------------------- + Atomic store | fence(acquire) | __tsan_atomic_exchange(seq_cst) + | atomic_exchange(seq_cst)| + | fence(release) | + ------------------|-------------------------|-------------------------------- + Non-atomic load | atomic_load(relaxed) | __tsan_read8() + ------------------|-------------------------|-------------------------------- + Non-atomic store | fence(acquire) | __tsan_write8() + (assignment, int) | atomic_store(release) | + ------------------|-------------------------|-------------------------------- + Non-atomic store | fence(acquire) | __tsan_write8() + (assignment, ptr) | atomic_store(release) | + | fence(release) | + ------------------|-------------------------|-------------------------------- + Non-atomic store | plain store | Not instrumented + (initialization) | | + ------------------|-------------------------|-------------------------------- + Non-atomic store | plain store | __tsan_writeN() + (unaligned size) | | + ------------------|-------------------------|-------------------------------- + + This mapping dictates which instrumentation calls are generated by the + compiler, but also how some functions of the runtime are instrumented: for + example, `caml_modify` is instrumented with a call to `__tsan_write8`, + whereas `caml_initialize` is purposefully not instrumented. + + 3.1. False negatives + + There should be no false negatives, i.e., all data races (in the OCaml + sense) on visited code paths should be detected (modulo TSan limitations + such as the finite history of memory accesses). + + 3.2. False positives + + The mapping that we use should not incur any false positives in pure OCaml + code, i.e., all data races reported between two accesses from OCaml are + true data races (in the OCaml sense of the term). + + In mixed C-OCaml code, rare false positives may occur in the following cases: + + - A value is initialized from C without using `caml_initialize` (allowed by + the FFI rules on the condition that the GC does not run between the + allocation and the end of initialization) and a conflicting access is made + from OCaml after publication to other threads. There should be no data + race thanks to data dependency (see [MMOC] coment in memory.c), but TSan + does not take data dependencies into account. + - A field is accessed from C with `Field`, or more generally using a + `volatile value *` or a relaxed atomic access, and that field is modified + concurrently by OCaml code. Because `caml_modify` is instrumented as a + plain write for proper detection of OCaml races, this case is seen as a + data race. + - An OCaml heap value is accessed from C by two unordered, volatile + accesses, at least one of which is a write. + + 3.3. volatile accesses + + We consider volatile accesses in C to behave like relaxed atomic accesses + from the point of view of data races (see [MMOC] comment in memory.c). It is + not trivial to explain that to TSan. Fortunately, both GCC and Clang have an + option to distinguish volatile writes in a custom way, by instrumenting them + with a call to a symbol that is left to us to implement. This option has been + introduced to support KCSan, the kernel concurrency sanitizer of the Linux + kernel. However, as KCSan is very different from TSan, volatile accesses are + instrumented in a way that makes it difficult to handle volatile writes the + way we would like. While gcc/clang replace atomic read/write operations with + TSan calls that update TSan's internal state and perform the actual memory + operation themselves, volatile read/write operations are merely decorated + with a TSan call, and then the actual operation is performed. + + More details and examples can be found in PR #12681. + + Our current make-do solution is that `__tsan_volatile_readN` performs a + dummy call to `__tsan_atomic64_load`, which is sufficient for TSan to view + them as relaxed loads; and `__tsan_volatile_writeN` performs a dummy + fetch_add of zero. */ + Caml_inline void caml_tsan_debug_log_pc(const char* msg, uintnat pc) { @@ -215,13 +307,13 @@ void caml_tsan_exit_on_perform(uintnat pc, char* sp) /* iterate on each frame */ while (1) { frame_descr* descr = caml_next_frame_descriptor(fds, &next_pc, &sp, stack); + if (descr == NULL) { + break; + } caml_tsan_debug_log_pc("forced__tsan_func_exit for", pc); __tsan_func_exit(NULL); - if (descr == NULL) { - break; - } pc = next_pc; } } @@ -250,13 +342,8 @@ CAMLreally_no_tsan void caml_tsan_entry_on_resume(uintnat pc, char* sp, return; } - char* p = (char*)stack->sp; -#ifdef WITH_FRAME_POINTERS - p += sizeof(value); /* Would not work on POWER (but POWER is not supported - by TSan anyway) */ -#endif - next_pc = *(uintnat*)p; - sp = p + sizeof(value); + sp = First_frame(stack->sp); + next_pc = Saved_return_address(sp); } caml_tsan_entry_on_resume(next_pc, sp, stack); @@ -277,26 +364,20 @@ Caml_inline bool is_aligned(void *ptr, size_t byte_count) #include -extern uint8_t __tsan_atomic8_load(void*, int); -extern uint16_t __tsan_atomic16_load(void*, int); -extern uint32_t __tsan_atomic32_load(void*, int); -extern uint64_t __tsan_atomic64_load(void*, int); -extern unsigned __int128 __tsan_atomic128_load(void*, int); - -/* In the OCaml runtime, volatile reads are used instead of relaxed atomic - loads on values that are shared with OCaml code, for backward compatibility - and performance reasons (see #10992). To avoid this practice causing false - positives with TSan, we make it so that TSan consider these reads as relaxed - atomic loads. Volatile stores are still seen as plain stores. */ +/* Make TSan see word-aligned volatile accesses as relaxed atomic accesses. + Refer to the detailed comments at the beginning of this file. */ #define DEFINE_TSAN_VOLATILE_READ_WRITE(size, bitsize) \ \ extern void __tsan_read##size(void*); \ extern void __tsan_write##size(void*); \ \ +extern uint##bitsize##_t __tsan_atomic##bitsize##_load(void*, int); \ +extern uint##bitsize##_t __tsan_atomic##bitsize##_fetch_add( \ + volatile void*, uint##bitsize##_t, memory_order); \ + \ CAMLreally_no_tsan void __tsan_volatile_read##size(void *ptr) \ { \ - const bool is_atomic = size <= sizeof(long long) && \ - is_aligned(ptr, 8); \ + const bool is_atomic = size <= sizeof(long long) && is_aligned(ptr, 8); \ if (is_atomic) \ __tsan_atomic##bitsize##_load(ptr, memory_order_relaxed); \ else \ @@ -308,7 +389,14 @@ CAMLreally_no_tsan void __tsan_unaligned_volatile_read##size(void *ptr) \ } \ CAMLreally_no_tsan void __tsan_volatile_write##size(void *ptr) \ { \ - __tsan_write##size(ptr); \ + const bool is_atomic = size <= sizeof(long long) && is_aligned(ptr, 8); \ + if (is_atomic) { \ + /* Signal a relaxed atomic store to TSan. We don't have access to the \ + actual value written so we do a fetch_add of 0 which has the effect of \ + signaling a relaxed store without changing the value. */ \ + __tsan_atomic##bitsize##_fetch_add(ptr, 0, memory_order_relaxed); \ + } else \ + __tsan_write##size(ptr); \ } \ CAMLreally_no_tsan void __tsan_unaligned_volatile_write##size(void *ptr) \ { \ @@ -319,4 +407,30 @@ DEFINE_TSAN_VOLATILE_READ_WRITE(1, 8); DEFINE_TSAN_VOLATILE_READ_WRITE(2, 16); DEFINE_TSAN_VOLATILE_READ_WRITE(4, 32); DEFINE_TSAN_VOLATILE_READ_WRITE(8, 64); -DEFINE_TSAN_VOLATILE_READ_WRITE(16, 128); + +/* We do not treat accesses to 128-bit (a.k.a. 16-byte) values as atomic, since + it is dubious that they can be treated as such. Still, the functions below + are needed because, without them, building a C library for OCaml with TSan + enabled will fail at the linking step with an unresolved symbol error if it + contains volatile accesses to 128-bit values. It is better to have 128-bit + volatiles behave silently like plain 128-bit values. */ + +extern void __tsan_read16(void*); +extern void __tsan_write16(void*); + +CAMLreally_no_tsan void __tsan_volatile_read16(void *ptr) +{ + __tsan_read16(ptr); +} +CAMLreally_no_tsan void __tsan_unaligned_volatile_read16(void *ptr) +{ + __tsan_read16(ptr); +} +CAMLreally_no_tsan void __tsan_volatile_write16(void *ptr) +{ + __tsan_write16(ptr); +} +CAMLreally_no_tsan void __tsan_unaligned_volatile_write16(void *ptr) +{ + __tsan_write16(ptr); +} diff --git a/runtime/unix.c b/runtime/unix.c index 863b305eae1..b5fd4de17b9 100644 --- a/runtime/unix.c +++ b/runtime/unix.c @@ -27,7 +27,9 @@ #include #include #include +#ifdef HAS_GETTIMEOFDAY #include +#endif #include #include #include @@ -470,23 +472,9 @@ void caml_init_os_params(void) #ifndef __CYGWIN__ -/* Standard Unix implementation: reserve with mmap (and trim to alignment) with - commit done using mmap as well. */ - -Caml_inline void safe_munmap(uintnat addr, uintnat size) -{ - if (size > 0) { - caml_gc_message(0x1000, "munmap %" ARCH_INTNAT_PRINTF_FORMAT "d" - " bytes at %" ARCH_INTNAT_PRINTF_FORMAT "x" - " for heaps\n", size, addr); - munmap((void*)addr, size); - } -} - -void *caml_plat_mem_map(uintnat size, uintnat alignment, int reserve_only) +void *caml_plat_mem_map(uintnat size, int reserve_only) { - uintnat alloc_sz = size + alignment; - uintnat base, aligned_start, aligned_end; + uintnat alloc_sz = size; void* mem; mem = mmap(0, alloc_sz, reserve_only ? PROT_NONE : (PROT_READ | PROT_WRITE), @@ -494,14 +482,6 @@ void *caml_plat_mem_map(uintnat size, uintnat alignment, int reserve_only) if (mem == MAP_FAILED) return 0; - /* trim to an aligned region */ - base = (uintnat)mem; - aligned_start = (base + alignment - 1) & ~(alignment - 1); - aligned_end = aligned_start + size; - safe_munmap(base, aligned_start - base); - safe_munmap(aligned_end, (base + alloc_sz) - aligned_end); - mem = (void*)aligned_start; - return mem; } @@ -523,13 +503,10 @@ static void* map_fixed(void* mem, uintnat size, int prot) done using mprotect, since Cygwin's mmap doesn't implement the required functions for committing using mmap. */ -void *caml_plat_mem_map(uintnat size, uintnat alignment, int reserve_only) +void *caml_plat_mem_map(uintnat size, int reserve_only) { void* mem; - if (alignment > caml_plat_mmap_alignment) - caml_fatal_error("Cannot align memory to %lx on this platform", alignment); - mem = mmap(0, size, reserve_only ? PROT_NONE : (PROT_READ | PROT_WRITE), MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (mem == MAP_FAILED) diff --git a/runtime/weak.c b/runtime/weak.c index e41fff4ab08..fbe160c9858 100644 --- a/runtime/weak.c +++ b/runtime/weak.c @@ -183,6 +183,11 @@ static void clean_field (value e, mlsize_t offset) CAMLreally_no_tsan /* This function performs volatile writes, which we consider to be non-racy, but TSan reports data races, so we never instrument it with TSan. */ +#if defined(WITH_THREAD_SANITIZER) +Caml_noinline /* Unfortunately, Clang disregards the no_tsan attribute on + inlined functions, so we prevent inlining of this one when + tsan is enabled. */ +#endif static void do_set (value e, mlsize_t offset, value v) { if (Is_block(v) && Is_young(v)) { diff --git a/runtime/win32.c b/runtime/win32.c index 7f1bcf97687..a6d4642fabd 100644 --- a/runtime/win32.c +++ b/runtime/win32.c @@ -1133,13 +1133,8 @@ uint64_t caml_time_counter(void) return (uint64_t)(now.QuadPart * clock_period); } -void *caml_plat_mem_map(uintnat size, uintnat alignment, int reserve_only) +void *caml_plat_mem_map(uintnat size, int reserve_only) { - /* VirtualAlloc returns an address aligned to caml_plat_mmap_alignment, so - trimming will not be required. VirtualAlloc returns 0 on error. */ - if (alignment > caml_plat_mmap_alignment) - caml_fatal_error("Cannot align memory to %" ARCH_INTNAT_PRINTF_FORMAT "x" - " on this platform", alignment); return VirtualAlloc(NULL, size, MEM_RESERVE | (reserve_only ? 0 : MEM_COMMIT), diff --git a/stdlib/.depend b/stdlib/.depend index 2ec28052e0e..6441fc1ba90 100644 --- a/stdlib/.depend +++ b/stdlib/.depend @@ -228,6 +228,22 @@ stdlib__Domain.cmx : domain.ml \ stdlib__Array.cmx \ stdlib__Domain.cmi stdlib__Domain.cmi : domain.mli +stdlib__Dynarray.cmo : dynarray.ml \ + stdlib__Sys.cmi \ + stdlib__Seq.cmi \ + stdlib__Printf.cmi \ + stdlib__List.cmi \ + stdlib__Array.cmi \ + stdlib__Dynarray.cmi +stdlib__Dynarray.cmx : dynarray.ml \ + stdlib__Sys.cmx \ + stdlib__Seq.cmx \ + stdlib__Printf.cmx \ + stdlib__List.cmx \ + stdlib__Array.cmx \ + stdlib__Dynarray.cmi +stdlib__Dynarray.cmi : dynarray.mli \ + stdlib__Seq.cmi stdlib__Effect.cmo : effect.ml \ stdlib__Printf.cmi \ stdlib__Printexc.cmi \ @@ -359,6 +375,7 @@ stdlib__Gc.cmo : gc.ml \ stdlib__Printf.cmi \ stdlib__Printexc.cmi \ stdlib__Fun.cmi \ + stdlib__Domain.cmi \ stdlib__Atomic.cmi \ stdlib__Gc.cmi stdlib__Gc.cmx : gc.ml \ @@ -367,6 +384,7 @@ stdlib__Gc.cmx : gc.ml \ stdlib__Printf.cmx \ stdlib__Printexc.cmx \ stdlib__Fun.cmx \ + stdlib__Domain.cmx \ stdlib__Atomic.cmx \ stdlib__Gc.cmi stdlib__Gc.cmi : gc.mli \ @@ -530,12 +548,10 @@ stdlib__Nativeint.cmx : nativeint.ml \ stdlib__Nativeint.cmi : nativeint.mli stdlib__Obj.cmo : obj.ml \ stdlib__Sys.cmi \ - stdlib__Nativeint.cmi \ stdlib__Int32.cmi \ stdlib__Obj.cmi stdlib__Obj.cmx : obj.ml \ stdlib__Sys.cmx \ - stdlib__Nativeint.cmx \ stdlib__Int32.cmx \ stdlib__Obj.cmi stdlib__Obj.cmi : obj.mli \ diff --git a/stdlib/StdlibModules b/stdlib/StdlibModules index 8e53530ea4b..efd654069e0 100644 --- a/stdlib/StdlibModules +++ b/stdlib/StdlibModules @@ -73,6 +73,7 @@ STDLIB_MODULE_BASENAMES = \ domain \ camlinternalFormat \ printf \ + dynarray \ arg \ printexc \ fun \ diff --git a/stdlib/array.ml b/stdlib/array.ml index c7b66ca6058..eac27d5fa28 100644 --- a/stdlib/array.ml +++ b/stdlib/array.ml @@ -47,7 +47,8 @@ end let init l f = if l = 0 then [||] else if l < 0 then invalid_arg "Array.init" - (* See #6575. We could also check for maximum array size, but this depends + (* See #6575. We must not evaluate [f 0] when [l <= 0]. + We could also check for maximum array size, but this depends on whether we create a float array or a regular one... *) else let res = create l (f 0) in @@ -57,10 +58,30 @@ let init l f = res let make_matrix sx sy init = + (* We raise even if [sx = 0 && sy < 0]: *) + if sy < 0 then invalid_arg "Array.make_matrix"; let res = create sx [||] in - for x = 0 to pred sx do - unsafe_set res x (create sy init) - done; + if sy > 0 then begin + for x = 0 to pred sx do + unsafe_set res x (create sy init) + done; + end; + res + +let init_matrix sx sy f = + (* We raise even if [sx = 0 && sy < 0]: *) + if sy < 0 then invalid_arg "Array.init_matrix"; + let res = create sx [||] in + (* We must not evaluate [f x 0] when [sy <= 0]: *) + if sy > 0 then begin + for x = 0 to pred sx do + let row = create sy (f x 0) in + for y = 1 to pred sy do + unsafe_set row y (f x y) + done; + unsafe_set res x row + done; + end; res let copy a = diff --git a/stdlib/array.mli b/stdlib/array.mli index 9d8b302ceb1..bba00c5a518 100644 --- a/stdlib/array.mli +++ b/stdlib/array.mli @@ -91,6 +91,21 @@ val make_matrix : int -> int -> 'a -> 'a array array If the value of [e] is a floating-point number, then the maximum size is only [Sys.max_array_length / 2]. *) +val init_matrix : int -> int -> (int -> int -> 'a) -> 'a array array +(** [init_matrix dimx dimy f] returns a two-dimensional array + (an array of arrays) + with first dimension [dimx] and second dimension [dimy], + where the element at index ([x,y]) is initialized with [f x y]. + The element ([x,y]) of a matrix [m] is accessed + with the notation [m.(x).(y)]. + + @raise Invalid_argument if [dimx] or [dimy] is negative or + greater than {!Sys.max_array_length}. + If the return type of [f] is [float], + then the maximum size is only [Sys.max_array_length / 2]. + + @since 5.2 *) + val append : 'a array -> 'a array -> 'a array (** [append v1 v2] returns a fresh array containing the concatenation of the arrays [v1] and [v2]. diff --git a/stdlib/arrayLabels.mli b/stdlib/arrayLabels.mli index b5751fc3820..84a413f05f7 100644 --- a/stdlib/arrayLabels.mli +++ b/stdlib/arrayLabels.mli @@ -91,6 +91,21 @@ val make_matrix : dimx:int -> dimy:int -> 'a -> 'a array array If the value of [e] is a floating-point number, then the maximum size is only [Sys.max_array_length / 2]. *) +val init_matrix : dimx:int -> dimy:int -> f:(int -> int -> 'a) -> 'a array array +(** [init_matrix ~dimx ~dimy ~f] returns a two-dimensional array + (an array of arrays) + with first dimension [dimx] and second dimension [dimy], + where the element at index ([x,y]) is initialized with [f x y]. + The element ([x,y]) of a matrix [m] is accessed + with the notation [m.(x).(y)]. + + @raise Invalid_argument if [dimx] or [dimy] is negative or + greater than {!Sys.max_array_length}. + If the return type of [f] is [float], + then the maximum size is only [Sys.max_array_length / 2]. + + @since 5.2 *) + val append : 'a array -> 'a array -> 'a array (** [append v1 v2] returns a fresh array containing the concatenation of the arrays [v1] and [v2]. diff --git a/stdlib/bytes.mli b/stdlib/bytes.mli index fc3ea21622f..98592b06b2b 100644 --- a/stdlib/bytes.mli +++ b/stdlib/bytes.mli @@ -460,6 +460,7 @@ let s = Bytes.of_string "hello" val split_on_char: char -> bytes -> bytes list (** [split_on_char sep s] returns the list of all (possibly empty) subsequences of [s] that are delimited by the [sep] character. + If [s] is empty, the result is the singleton list [[empty]]. The function's output is specified by the following invariants: diff --git a/stdlib/bytesLabels.mli b/stdlib/bytesLabels.mli index b44ecda5f31..d6ab19f9938 100644 --- a/stdlib/bytesLabels.mli +++ b/stdlib/bytesLabels.mli @@ -460,6 +460,7 @@ let s = Bytes.of_string "hello" val split_on_char: sep:char -> bytes -> bytes list (** [split_on_char sep s] returns the list of all (possibly empty) subsequences of [s] that are delimited by the [sep] character. + If [s] is empty, the result is the singleton list [[empty]]. The function's output is specified by the following invariants: diff --git a/stdlib/domain.ml b/stdlib/domain.ml index a1a923f890a..c39cb960123 100644 --- a/stdlib/domain.ml +++ b/stdlib/domain.ml @@ -37,7 +37,7 @@ module Raw = struct external spawn : (unit -> 'a) -> 'a term_sync -> t = "caml_domain_spawn" external self : unit -> t - = "caml_ml_domain_id" + = "caml_ml_domain_id" [@@noalloc] external cpu_relax : unit -> unit = "caml_ml_domain_cpu_relax" external get_recommended_domain_count: unit -> int @@ -177,10 +177,6 @@ let at_exit_key = DLS.new_key (fun () -> (fun () -> ())) let at_exit f = let old_exit : unit -> unit = DLS.get at_exit_key in let new_exit () = - (* The domain termination callbacks ([at_exit]) are run in - last-in-first-out (LIFO) order in order to be symmetric with the domain - creation callbacks ([at_each_spawn]) which run in first-in-fisrt-out - (FIFO) order. *) f (); old_exit () in DLS.set at_exit_key new_exit diff --git a/stdlib/dynarray.ml b/stdlib/dynarray.ml new file mode 100644 index 00000000000..eebd2a0bfa8 --- /dev/null +++ b/stdlib/dynarray.ml @@ -0,0 +1,791 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Gabriel Scherer, projet Partout, INRIA Paris-Saclay *) +(* *) +(* Copyright 2022 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +type 'a t = { + mutable length : int; + mutable arr : 'a slot array; +} +(* {2 The type ['a t]} + + A dynamic array is represented using a backing array [arr] and + a [length]. It behaves as an array of size [length] -- the indices + from [0] to [length - 1] included contain user-provided values and + can be [get] and [set] -- but the length may also change in the + future by adding or removing elements at the end. + + We use the following concepts; + - capacity: the length of the backing array: + [Array.length arr] + - live space: the portion of the backing array with + indices from [0] to [length - 1] included. + - empty space: the portion of the backing array + from [length] to the end of the backing array. + + {2 The type ['a slot]} + + We should not keep a user-provided value in the empty space, as + this could extend its lifetime and may result in memory leaks of + arbitrary size. Functions that remove elements from the dynamic + array, such as [pop_last] or [truncate], must really erase the + element from the backing array. + + This constraint makes it difficult to represent an dynamic array of + elements of type ['a] with a backing array of type ['a array]: what + valid value of type ['a] would we use in the empty space? Typical + choices include: + - accepting scenarios where we actually leak user-provided values + (but this can blowup memory usage in some cases, and is hard to debug) + - requiring a "dummy" value at creation of the dynamic array + or in the parts of the API that grow the empty space + (but users find this very inconvenient) + - using arcane Obj.magic tricks + (but experts don't agree on which tricks are safe to use and/or + should be used here) + - using a backing array of ['a option] values, using [None] + in the empty space + (but this gives a noticeably less efficient memory representation) + + In the present implementation, we use the ['a option] approach, + with a twist. With ['a option], calling [set a i x] must reallocate + a new [Some x] block: +{[ + let set a i x = + if i < 0 || i >= a.length then error "out of bounds"; + a.arr.(i) <- Some x +]} + Instead we use the type ['a slot] below, + which behaves as an option whose [Some] constructor + (called [Elem] here) has a _mutable_ argument. +*) +and 'a slot = +| Empty +| Elem of { mutable v: 'a } +(* + This gives an allocation-free implementation of [set] that calls + [Array.get] (instead of [Array.set]) on the backing array and then + mutates the [v] parameter. In pseudo-code: +{[ + let set a i x = + if i < 0 || i >= a.length then error "out of bounds"; + match a.arr.(i) with + | Empty -> error "invalid state: missing element" + | Elem s -> s.v <- x +]} + With this approach, accessing an element still pays the cost of an + extra indirection (compared to approaches that do not box elements + in the backing array), but only operations that add new elements at + the end of the array pay extra allocations. + + There are some situations where ['a option] is better: it makes + [pop_last_opt] more efficient as the underlying option can be + returned directly, and it also lets us use [Array.blit] to + implement [append]. We believe that optimizing [get] and [set] is + more important for dynamic arrays. + + {2 Invariants and valid states} + + We enforce the invariant that [length >= 0] at all times. + we rely on this invariant for optimization. + + The following conditions define what we call a "valid" dynarray: + - valid length: [length <= Array.length arr] + - no missing element in the live space: + forall i, [0 <= i < length] implies [arr.(i) <> Empty] + - no element in the empty space: + forall i, [length <= i < Array.length arr] implies [arr.(i) = Empty] + + Unfortunately, we cannot easily enforce validity as an invariant in + presence of concurrent updates. We can thus observe dynarrays in + "invalid states". Our implementation may raise exceptions or return + incorrect results on observing invalid states, but of course it + must preserve memory safety. +*) + +module Error = struct + let[@inline never] index_out_of_bounds f ~i ~length = + if length = 0 then + Printf.ksprintf invalid_arg + "Dynarray.%s: index %d out of bounds (empty dynarray)" + f i + else + Printf.ksprintf invalid_arg + "Dynarray.%s: index %d out of bounds (0..%d)" + f i (length - 1) + + let[@inline never] negative_length_requested f n = + Printf.ksprintf invalid_arg + "Dynarray.%s: negative length %d requested" + f n + + let[@inline never] negative_capacity_requested f n = + Printf.ksprintf invalid_arg + "Dynarray.%s: negative capacity %d requested" + f n + + let[@inline never] requested_length_out_of_bounds f requested_length = + Printf.ksprintf invalid_arg + "Dynarray.%s: cannot grow to requested length %d (max_array_length is %d)" + f requested_length Sys.max_array_length + + (* When observing an invalid state ([missing_element], + [invalid_length]), we do not give the name of the calling function + in the error message, as the error is related to invalid operations + performed earlier, and not to the callsite of the function + itself. *) + + let invalid_state_description = + "Invalid dynarray (unsynchronized concurrent length change)" + + let[@inline never] missing_element ~i ~length = + Printf.ksprintf invalid_arg + "%s: missing element at position %d < length %d" + invalid_state_description + i length + + let[@inline never] invalid_length ~length ~capacity = + Printf.ksprintf invalid_arg + "%s: length %d > capacity %d" + invalid_state_description + length capacity + + let[@inline never] length_change_during_iteration f ~expected ~observed = + Printf.ksprintf invalid_arg + "Dynarray.%s: a length change from %d to %d occurred during iteration" + f expected observed + + (* When an [Empty] element is observed unexpectedly at index [i], + it may be either an out-of-bounds access or an invalid-state situation + depending on whether [i <= length]. *) + let[@inline never] unexpected_empty_element f ~i ~length = + if i < length then + missing_element ~i ~length + else + index_out_of_bounds f ~i ~length + + let[@inline never] empty_dynarray f = + Printf.ksprintf invalid_arg + "Dynarray.%s: empty array" f +end + +(* Detecting iterator invalidation. + + See {!iter} below for a detailed usage example. +*) +let check_same_length f a ~length = + let length_a = a.length in + if length <> length_a then + Error.length_change_during_iteration f + ~expected:length ~observed:length_a + +(** Careful unsafe access. *) + +(* Postcondition on non-exceptional return: + [length <= Array.length arr] *) +let[@inline always] check_valid_length length arr = + let capacity = Array.length arr in + if length > capacity then + Error.invalid_length ~length ~capacity + +(* Precondition: [0 <= i < length <= Array.length arr] + + This precondition is typically guaranteed by knowing + [0 <= i < length] and calling [check_valid_length length arr].*) +let[@inline always] unsafe_get arr ~i ~length = + match Array.unsafe_get arr i with + | Empty -> Error.missing_element ~i ~length + | Elem {v} -> v + + +(** {1:dynarrays Dynamic arrays} *) + +let create () = { + length = 0; + arr = [| |]; +} + +let make n x = + if n < 0 then Error.negative_length_requested "make" n; + { + length = n; + arr = Array.init n (fun _ -> Elem {v = x}); + } + +let init n f = + if n < 0 then Error.negative_length_requested "init" n; + { + length = n; + arr = Array.init n (fun i -> Elem {v = f i}); + } + +let get a i = + (* This implementation will propagate an [Invalid_argument] exception + from array lookup if the index is out of the backing array, + instead of using our own [Error.index_out_of_bounds]. This is + allowed by our specification, and more efficient -- no need to + check that [length a <= capacity a] in the fast path. *) + match a.arr.(i) with + | Elem s -> s.v + | Empty -> + Error.unexpected_empty_element "get" ~i ~length:a.length + +let set a i x = + (* See {!get} comment on the use of checked array + access without our own bound checking. *) + match a.arr.(i) with + | Elem s -> s.v <- x + | Empty -> + Error.unexpected_empty_element "set" ~i ~length:a.length + +let length a = a.length + +let is_empty a = (a.length = 0) + +let copy {length; arr} = + check_valid_length length arr; + (* use [length] as the new capacity to make + this an O(length) operation. *) + { + length; + arr = Array.init length (fun i -> + let v = unsafe_get arr ~i ~length in + Elem {v} + ); + } + +let get_last a = + let {arr; length} = a in + check_valid_length length arr; + (* We know [length <= capacity a]. *) + if length = 0 then Error.empty_dynarray "get_last"; + (* We know [length > 0]. *) + unsafe_get arr ~i:(length - 1) ~length + +let find_last a = + let {arr; length} = a in + check_valid_length length arr; + (* We know [length <= capacity a]. *) + if length = 0 then None + else + (* We know [length > 0]. *) + Some (unsafe_get arr ~i:(length - 1) ~length) + +(** {1:removing Removing elements} *) + +let pop_last a = + let {arr; length} = a in + check_valid_length length arr; + (* We know [length <= capacity a]. *) + if length = 0 then raise Not_found; + let last = length - 1 in + (* We know [length > 0] so [last >= 0]. *) + match Array.unsafe_get arr last with + (* At this point we know that [last] is a valid index in [arr]. *) + | Empty -> + Error.missing_element ~i:last ~length + | Elem s -> + Array.unsafe_set arr last Empty; + a.length <- last; + s.v + +let pop_last_opt a = + match pop_last a with + | exception Not_found -> None + | x -> Some x + +let remove_last a = + let last = length a - 1 in + if last >= 0 then begin + a.length <- last; + a.arr.(last) <- Empty; + end + +let truncate a n = + if n < 0 then Error.negative_length_requested "truncate" n; + let {arr; length} = a in + if length <= n then () + else begin + a.length <- n; + Array.fill arr n (length - n) Empty; + end + +let clear a = truncate a 0 + + +(** {1:capacity Backing array and capacity} *) + +let capacity a = Array.length a.arr + +let next_capacity n = + let n' = + (* For large values of n, we use 1.5 as our growth factor. + + For smaller values of n, we grow more aggressively to avoid + reallocating too much when accumulating elements into an empty + array. + + The constants "512 words" and "8 words" below are taken from + https://github.com/facebook/folly/blob/ + c06c0f41d91daf1a6a5f3fc1cd465302ac260459/folly/FBVector.h#L1128-L1157 + *) + if n <= 512 then n * 2 + else n + n / 2 + in + (* jump directly from 0 to 8 *) + min (max 8 n') Sys.max_array_length + +let ensure_capacity a capacity_request = + let arr = a.arr in + let cur_capacity = Array.length arr in + if capacity_request < 0 then + Error.negative_capacity_requested "ensure_capacity" capacity_request + else if cur_capacity >= capacity_request then + (* This is the fast path, the code up to here must do as little as + possible. (This is why we don't use [let {arr; length} = a] as + usual, the length is not needed in the fast path.)*) + () + else begin + if capacity_request > Sys.max_array_length then + Error.requested_length_out_of_bounds "ensure_capacity" capacity_request; + let new_capacity = + (* We use either the next exponential-growth strategy, + or the requested strategy, whichever is bigger. + + Compared to only using the exponential-growth strategy, this + lets us use less memory by avoiding any overshoot whenever + the capacity request is noticeably larger than the current + capacity. + + Compared to only using the requested capacity, this avoids + losing the amortized guarantee: we allocated "exponentially + or more", so the amortization holds. In particular, notice + that repeated calls to [ensure_capacity a (length a + 1)] + will have amortized-linear rather than quadratic complexity. + *) + max (next_capacity cur_capacity) capacity_request in + let new_arr = Array.make new_capacity Empty in + Array.blit arr 0 new_arr 0 a.length; + a.arr <- new_arr; + (* postcondition: *) + assert (0 <= capacity_request); + assert (capacity_request <= Array.length new_arr); + end + +let ensure_extra_capacity a extra_capacity_request = + ensure_capacity a (length a + extra_capacity_request) + +let fit_capacity a = + if capacity a = a.length + then () + else a.arr <- Array.sub a.arr 0 a.length + +let set_capacity a n = + if n < 0 then + Error.negative_capacity_requested "set_capacity" n; + let arr = a.arr in + let cur_capacity = Array.length arr in + if n < cur_capacity then begin + a.length <- min a.length n; + a.arr <- Array.sub arr 0 n; + end + else if n > cur_capacity then begin + let new_arr = Array.make n Empty in + Array.blit arr 0 new_arr 0 a.length; + a.arr <- new_arr; + end + +let reset a = + a.length <- 0; + a.arr <- [||] + +(** {1:adding Adding elements} *) + +(* We chose an implementation of [add_last a x] that behaves correctly + in presence of asynchronous / re-entrant code execution around + allocations and poll points: if another thread or a callback gets + executed on allocation, we add the element at the new end of the + dynamic array. + + (We do not give the same guarantees in presence of concurrent + parallel updates, which are much more expensive to protect + against.) +*) + +(* [add_last_if_room a elem] only writes the slot if there is room, and + returns [false] otherwise. *) +let[@inline] add_last_if_room a elem = + let {arr; length} = a in + (* we know [0 <= length] *) + if length >= Array.length arr then false + else begin + (* we know [0 <= length < Array.length arr] *) + a.length <- length + 1; + Array.unsafe_set arr length elem; + true + end + +let add_last a x = + let elem = Elem {v = x} in + if add_last_if_room a elem then () + else begin + (* slow path *) + let rec grow_and_add a elem = + ensure_extra_capacity a 1; + if not (add_last_if_room a elem) + then grow_and_add a elem + in grow_and_add a elem + end + +let rec append_list a li = + match li with + | [] -> () + | x :: xs -> add_last a x; append_list a xs + +let append_iter a iter b = + iter (fun x -> add_last a x) b + +let append_seq a seq = + Seq.iter (fun x -> add_last a x) seq + +(* append_array: same [..._if_room] and loop logic as [add_last]. *) + +let append_array_if_room a b = + let {arr; length = length_a} = a in + let length_b = Array.length b in + if length_a + length_b > Array.length arr then false + else begin + a.length <- length_a + length_b; + (* Note: we intentionally update the length *before* filling the + elements. This "reserve before fill" approach provides better + behavior than "fill then notify" in presence of reentrant + modifications (which may occur below, on a poll point in the loop or + the [Elem] allocation): + + - If some code asynchronously adds new elements after this + length update, they will go after the space we just reserved, + and in particular no addition will be lost. If instead we + updated the length after the loop, any asynchronous addition + during the loop could be erased or erase one of our additions, + silently, without warning the user. + + - If some code asynchronously iterates on the dynarray, or + removes elements, or otherwise tries to access the + reserved-but-not-yet-filled space, it will get a clean "missing + element" error. This is worse than with the fill-then-notify + approach where the new elements would only become visible + (to iterators, for removal, etc.) alltogether at the end of + loop. + + To summarise, "reserve before fill" is better on add-add races, + and "fill then notify" is better on add-remove or add-iterate + races. But the key difference is the failure mode: + reserve-before fails on add-remove or add-iterate races with + a clean error, while notify-after fails on add-add races with + silently disappearing data. *) + for i = 0 to length_b - 1 do + let x = Array.unsafe_get b i in + Array.unsafe_set arr (length_a + i) (Elem {v = x}) + done; + true + end + +let append_array a b = + if append_array_if_room a b then () + else begin + (* slow path *) + let rec grow_and_append a b = + ensure_extra_capacity a (Array.length b); + if not (append_array_if_room a b) + then grow_and_append a b + in grow_and_append a b end + +(* append: same [..._if_room] and loop logic as [add_last], + same reserve-before-fill logic as [append_array]. *) + +(* It is a programming error to mutate the length of [b] during a call + to [append a b]. To detect this mistake we keep track of the length + of [b] throughout the computation and check it that does not + change. +*) +let append_if_room a b ~length_b = + let {arr = arr_a; length = length_a} = a in + if length_a + length_b > Array.length arr_a then false + else begin + a.length <- length_a + length_b; + let arr_b = b.arr in + check_valid_length length_b arr_b; + for i = 0 to length_b - 1 do + let x = unsafe_get arr_b ~i ~length:length_b in + Array.unsafe_set arr_a (length_a + i) (Elem {v = x}) + done; + check_same_length "append" b ~length:length_b; + true + end + +let append a b = + let length_b = length b in + if append_if_room a b ~length_b then () + else begin + (* slow path *) + let rec grow_and_append a b ~length_b = + ensure_extra_capacity a length_b; + (* Eliding the [check_same_length] call below would be wrong in + the case where [a] and [b] are aliases of each other, we + would get into an infinite loop instead of failing. + + We could push the call to [append_if_room] itself, but we + prefer to keep it in the slow path. *) + check_same_length "append" b ~length:length_b; + if not (append_if_room a b ~length_b) + then grow_and_append a b ~length_b + in grow_and_append a b ~length_b + end + + + +(** {1:iteration Iteration} *) + +(* The implementation choice that we made for iterators is the one + that maximizes efficiency by avoiding repeated bound checking: we + check the length of the dynamic array once at the beginning, and + then only operate on that portion of the dynarray, ignoring + elements added in the meantime. + + The specification states that it is a programming error to mutate + the length of the array during iteration. We check for this and + raise an error on size change. + Note that we may still miss some transient state changes that cancel + each other and leave the length unchanged at the next check. +*) + +let iter_ f k a = + let {arr; length} = a in + (* [check_valid_length length arr] is used for memory safety, it + guarantees that the backing array has capacity at least [length], + allowing unsafe array access. + + [check_same_length] is used for correctness, it lets the function + fail more often if we discover the programming error of mutating + the length during iteration. + + We could, naively, call [check_same_length] at each iteration of + the loop (before or after, or both). However, notice that this is + not necessary to detect the removal of elements from [a]: if + elements have been removed by the time the [for] loop reaches + them, then [unsafe_get] will itself fail with an [Invalid_argument] + exception. We only need to detect the addition of new elements to + [a] during iteration, and for this it is enough to call + [check_same_length] once at the end. + + Calling [check_same_length] more often could catch more + programming errors, but the only errors that we miss with this + optimization are those that keep the array size constant -- + additions and deletions that cancel each other. We consider this + an acceptable tradeoff. + *) + check_valid_length length arr; + for i = 0 to length - 1 do + k (unsafe_get arr ~i ~length); + done; + check_same_length f a ~length + +let iter k a = + iter_ "iter" k a + +let iteri k a = + let {arr; length} = a in + check_valid_length length arr; + for i = 0 to length - 1 do + k i (unsafe_get arr ~i ~length); + done; + check_same_length "iteri" a ~length + +let map f a = + let {arr; length} = a in + check_valid_length length arr; + let res = { + length; + arr = Array.init length (fun i -> + Elem {v = f (unsafe_get arr ~i ~length)}); + } in + check_same_length "map" a ~length; + res + + +let mapi f a = + let {arr; length} = a in + check_valid_length length arr; + let res = { + length; + arr = Array.init length (fun i -> + Elem {v = f i (unsafe_get arr ~i ~length)}); + } in + check_same_length "mapi" a ~length; + res + +let fold_left f acc a = + let {arr; length} = a in + check_valid_length length arr; + let r = ref acc in + for i = 0 to length - 1 do + let v = unsafe_get arr ~i ~length in + r := f !r v; + done; + check_same_length "fold_left" a ~length; + !r + +let fold_right f a acc = + let {arr; length} = a in + check_valid_length length arr; + let r = ref acc in + for i = length - 1 downto 0 do + let v = unsafe_get arr ~i ~length in + r := f v !r; + done; + check_same_length "fold_right" a ~length; + !r + +let exists p a = + let {arr; length} = a in + check_valid_length length arr; + let rec loop p arr i length = + if i = length then false + else + p (unsafe_get arr ~i ~length) + || loop p arr (i + 1) length + in + let res = loop p arr 0 length in + check_same_length "exists" a ~length; + res + +let for_all p a = + let {arr; length} = a in + check_valid_length length arr; + let rec loop p arr i length = + if i = length then true + else + p (unsafe_get arr ~i ~length) + && loop p arr (i + 1) length + in + let res = loop p arr 0 length in + check_same_length "for_all" a ~length; + res + +let filter f a = + let b = create () in + iter_ "filter" (fun x -> if f x then add_last b x) a; + b + +let filter_map f a = + let b = create () in + iter_ "filter_map" (fun x -> + match f x with + | None -> () + | Some y -> add_last b y + ) a; + b + + +(** {1:conversions Conversions to other data structures} *) + +(* The eager [to_*] conversion functions behave similarly to iterators + in presence of updates during computation. The [*_reentrant] + functions obey their more permissive specification, which tolerates + any concurrent update. *) + +let of_array a = + let length = Array.length a in + { + length; + arr = Array.init length (fun i -> Elem {v = Array.unsafe_get a i}); + } + +let to_array a = + let {arr; length} = a in + check_valid_length length arr; + let res = Array.init length (fun i -> + unsafe_get arr ~i ~length) + in + check_same_length "to_array" a ~length; + res + +let of_list li = + let a = create () in + List.iter (fun x -> add_last a x) li; + a + +let to_list a = + let {arr; length} = a in + check_valid_length length arr; + let l = ref [] in + for i = length - 1 downto 0 do + l := unsafe_get arr ~i ~length :: !l + done; + check_same_length "to_list" a ~length; + !l + +let of_seq seq = + let init = create() in + append_seq init seq; + init + +let to_seq a = + let {arr; length} = a in + check_valid_length length arr; + let rec aux i = fun () -> + check_same_length "to_seq" a ~length; + if i >= length then Seq.Nil + else begin + let v = unsafe_get arr ~i ~length in + Seq.Cons (v, aux (i + 1)) + end + in + aux 0 + +let to_seq_reentrant a = + let rec aux i = fun () -> + if i >= length a then Seq.Nil + else begin + let v = get a i in + Seq.Cons (v, aux (i + 1)) + end + in + aux 0 + +let to_seq_rev a = + let {arr; length} = a in + check_valid_length length arr; + let rec aux i = fun () -> + check_same_length "to_seq_rev" a ~length; + if i < 0 then Seq.Nil + else begin + let v = unsafe_get arr ~i ~length in + Seq.Cons (v, aux (i - 1)) + end + in + aux (length - 1) + +let to_seq_rev_reentrant a = + let rec aux i = fun () -> + if i < 0 then Seq.Nil + else if i >= length a then + (* If some elements have been removed in the meantime, we skip + those elements and continue with the new end of the array. *) + aux (length a - 1) () + else begin + let v = get a i in + Seq.Cons (v, aux (i - 1)) + end + in + aux (length a - 1) diff --git a/stdlib/dynarray.mli b/stdlib/dynarray.mli new file mode 100644 index 00000000000..cf0d326651e --- /dev/null +++ b/stdlib/dynarray.mli @@ -0,0 +1,641 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Simon Cruanes *) +(* Gabriel Scherer, projet Partout, INRIA Paris-Saclay *) +(* *) +(* Copyright 2022 Simon Cruanes. *) +(* Copyright 2022 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(** Dynamic arrays. + + The {!Array} module provide arrays of fixed length. {!Dynarray} + provides arrays whose length can change over time, by adding or + removing elements at the end of the array. + + This is typically used to accumulate elements whose number is not + known in advance or changes during computation, while also + providing fast access to elements at arbitrary positions. + +{[ + let dynarray_of_list li = + let arr = Dynarray.create () in + List.iter (fun v -> Dynarray.add_last arr v) li; + arr +]} + + The {!Buffer} module provides similar features, but it is + specialized for accumulating characters into a dynamically-resized + string. + + The {!Stack} module provides a last-in first-out data structure + that can be easily implemented on top of dynamic arrays. + + {b Warning.} In their current implementation, the memory layout + of dynamic arrays differs from the one of {!Array}s. See the + {{!section:memory_layout} Memory Layout} section for more information. + + @since 5.2 +*) + +(** {b Unsynchronized accesses} *) + +[@@@alert unsynchronized_access + "Unsynchronized accesses to dynamic arrays are a programming error." +] + +(** + Concurrent accesses to dynamic arrays must be synchronized + (for instance with a {!Mutex.t}). Unsynchronized accesses to + a dynamic array are a programming error that may lead to an invalid + dynamic array state, on which some operations would fail with an + [Invalid_argument] exception. +*) + +(** {1:dynarrays Dynamic arrays} *) + +type 'a t +(** A dynamic array containing values of type ['a]. + + A dynamic array [a] provides constant-time [get] and [set] + operations on indices between [0] and [Dynarray.length a - 1] + included. Its {!length} may change over time by adding or removing + elements to the end of the array. + + We say that an index into a dynarray [a] is valid if it is in + [0 .. length a - 1] and invalid otherwise. +*) + +val create : unit -> 'a t +(** [create ()] is a new, empty array. *) + +val make : int -> 'a -> 'a t +(** [make n x] is a new array of length [n], filled with [x]. + + @raise Invalid_argument if [n < 0] or [n > Sys.max_array_length]. +*) + +val init : int -> (int -> 'a) -> 'a t +(** [init n f] is a new array [a] of length [n], + such that [get a i] is [f i]. In other words, + the elements of [a] are [f 0], then [f 1], + then [f 2]... and [f (n - 1)] last, evaluated + in that order. + + This is similar to {!Array.init}. + + @raise Invalid_argument if [n < 0] or [n > Sys.max_array_length]. +*) + +val get : 'a t -> int -> 'a +(** [get a i] is the [i]-th element of [a], starting with index [0]. + + @raise Invalid_argument if the index is invalid *) + +val set : 'a t -> int -> 'a -> unit +(** [set a i x] sets the [i]-th element of [a] to be [x]. + + [i] must be a valid index. [set] does not add new elements to the + array -- see {!add_last} to add an element. + + @raise Invalid_argument if the index is invalid. *) + +val length : 'a t -> int +(** [length a] is the number of elements in the array. *) + +val is_empty : 'a t -> bool +(** [is_empty a] is [true] if [a] is empty, that is, if [length a = 0]. *) + +val get_last : 'a t -> 'a +(** [get_last a] is the element of [a] at index [length a - 1]. + + @raise Invalid_argument if [a] is empty. +*) + +val find_last : 'a t -> 'a option +(** [find_last a] is [None] if [a] is empty + and [Some (get_last a)] otherwise. *) + +val copy : 'a t -> 'a t +(** [copy a] is a shallow copy of [a], a new array + containing the same elements as [a]. *) + +(** {1:adding Adding elements} + + Note: all operations adding elements raise [Invalid_argument] if the + length needs to grow beyond {!Sys.max_array_length}. *) + +val add_last : 'a t -> 'a -> unit +(** [add_last a x] adds the element [x] at the end of the array [a]. *) + +val append_array : 'a t -> 'a array -> unit +(** [append_array a b] adds all elements of [b] at the end of [a], + in the order they appear in [b]. + + For example: + {[ + let a = Dynarray.of_list [1;2] in + Dynarray.append_array a [|3; 4|]; + assert (Dynarray.to_list a = [1; 2; 3; 4]) + ]} +*) + +val append_list : 'a t -> 'a list -> unit +(** Like {!append_array} but with a list. *) + +val append : 'a t -> 'a t -> unit +(** [append a b] is like [append_array a b], + but [b] is itself a dynamic array instead of a fixed-size array. + + Warning: [append a a] is a programming error because it iterates + on [a] and adds elements to it at the same time -- see the + {{!section:iteration} Iteration} section below. It fails with + [Invalid_argument]. + If you really want to append a copy of [a] to itself, you can use + [Dynarray.append_array a (Dynarray.to_array a)] which copies [a] + into a temporary array. +*) + +val append_seq : 'a t -> 'a Seq.t -> unit +(** Like {!append_array} but with a sequence. + + Warning: [append_seq a (to_seq_reentrant a)] simultaneously + traverses [a] and adds element to it; the ordering of those + operations is unspecified, and may result in an infinite loop -- + the new elements may in turn be produced by [to_seq_reentrant a] + and get added again and again. +*) + +val append_iter : + 'a t -> + (('a -> unit) -> 'x -> unit) -> + 'x -> unit +(** [append_iter a iter x] adds each element of [x] to the end of [a]. + This is [iter (add_last a) x]. + + For example, [append_iter a List.iter [1;2;3]] would add elements + [1], [2], and then [3] at the end of [a]. + [append_iter a Queue.iter q] adds elements from the queue [q]. *) + + +(** {1:removing Removing elements} *) + +val pop_last_opt : 'a t -> 'a option +(** [pop_last_opt a] removes and returns the last element of [a], + or [None] if the array is empty. *) + +val pop_last : 'a t -> 'a +(** [pop_last a] removes and returns the last element of [a]. + + @raise Not_found on an empty array. *) + +val remove_last : 'a t -> unit +(** [remove_last a] removes the last element of [a], if any. + It does nothing if [a] is empty. *) + +val truncate : 'a t -> int -> unit +(** [truncate a n] truncates [a] to have at most [n] elements. + + It removes elements whose index is greater or equal to [n]. + It does nothing if [n >= length a]. + + [truncate a n] is equivalent to: + {[ + if n < 0 then invalid_argument "..."; + while length a > n do + remove_last a + done + ]} + + @raise Invalid_argument if [n < 0]. +*) + +val clear : 'a t -> unit +(** [clear a] is [truncate a 0], it removes all the elements of [a]. *) + +(** {1:iteration Iteration} + + The iteration functions traverse the elements of a dynamic array. + Traversals of [a] are computed in increasing index order: from + the element of index [0] to the element of index [length a - 1]. + + It is a programming error to change the length of an array + (by adding or removing elements) during an iteration on the + array. Any iteration function will fail with [Invalid_argument] + if it detects such a length change. +*) + +val iter : ('a -> unit) -> 'a t -> unit +(** [iter f a] calls [f] on each element of [a]. *) + +val iteri : (int -> 'a -> unit) -> 'a t -> unit +(** [iteri f a] calls [f i x] for each [x] at index [i] in [a]. *) + +val map : ('a -> 'b) -> 'a t -> 'b t +(** [map f a] is a new array of elements of the form [f x] + for each element [x] of [a]. + + For example, if the elements of [a] are [x0], [x1], [x2], + then the elements of [b] are [f x0], [f x1], [f x2]. +*) + +val mapi : (int -> 'a -> 'b) -> 'a t -> 'b t +(** [mapi f a] is a new array of elements of the form [f i x] + for each element [x] of [a] at index [i]. + + For example, if the elements of [a] are [x0], [x1], [x2], + then the elements of [b] are [f 0 x0], [f 1 x1], [f 2 x2]. +*) + +val fold_left : ('acc -> 'a -> 'acc) -> 'acc -> 'a t -> 'acc +(** [fold_left f acc a] folds [f] over [a] in order, + starting with accumulator [acc]. + + For example, if the elements of [a] are [x0], [x1], + then [fold f acc a] is + {[ + let acc = f acc x0 in + let acc = f acc x1 in + acc + ]} +*) + +val fold_right : ('a -> 'acc -> 'acc) -> 'a t -> 'acc -> 'acc +(** [fold_right f a acc] computes + [f x0 (f x1 (... (f xn acc) ...))] + where [x0], [x1], ..., [xn] are the elements of [a]. +*) + +val exists : ('a -> bool) -> 'a t -> bool +(** [exists f a] is [true] if some element of [a] satisfies [f]. + + For example, if the elements of [a] are [x0], [x1], [x2], then + [exists f a] is [f x0 || f x1 || f x2]. +*) + +val for_all : ('a -> bool) -> 'a t -> bool +(** [for_all f a] is [true] if all elements of [a] satisfy [f]. + This includes the case where [a] is empty. + + For example, if the elements of [a] are [x0], [x1], then + [exists f a] is [f x0 && f x1 && f x2]. +*) + +val filter : ('a -> bool) -> 'a t -> 'a t +(** [filter f a] is a new array of all the elements of [a] that satisfy [f]. + In other words, it is an array [b] such that, for each element [x] + in [a] in order, [x] is added to [b] if [f x] is [true]. + + For example, [filter (fun x -> x >= 0) a] is a new array + of all non-negative elements of [a], in order. +*) + +val filter_map : ('a -> 'b option) -> 'a t -> 'b t +(** [filter_map f a] is a new array of elements [y] + such that [f x] is [Some y] for an element [x] of [a]. + In others words, it is an array [b] such that, for each element + [x] of [a] in order: + {ul + {- if [f x = Some y], then [y] is added to [b],} + {- if [f x = None], then no element is added to [b].}} + + For example, [filter_map int_of_string_opt inputs] returns + a new array of integers read from the strings in [inputs], + ignoring strings that cannot be converted to integers. +*) + +(** {1:conversions Conversions to other data structures} + + Note: the [of_*] functions raise [Invalid_argument] if the + length needs to grow beyond {!Sys.max_array_length}. + + The [to_*] functions, except those specifically marked + "reentrant", iterate on their dynarray argument. In particular it + is a programming error if the length of the dynarray changes + during their execution, and the conversion functions raise + [Invalid_argument] if they observe such a change. +*) + +val of_array : 'a array -> 'a t +(** [of_array arr] returns a dynamic array corresponding to the + fixed-sized array [a]. Operates in [O(n)] time by making a copy. *) + +val to_array : 'a t -> 'a array +(** [to_array a] returns a fixed-sized array corresponding to the + dynamic array [a]. This always allocate a new array and copies + elements into it. *) + +val of_list : 'a list -> 'a t +(** [of_list l] is the array containing the elements of [l] in + the same order. *) + +val to_list : 'a t -> 'a list +(** [to_list a] is a list with the elements contained in the array [a]. *) + +val of_seq : 'a Seq.t -> 'a t +(** [of_seq seq] is an array containing the same elements as [seq]. + + It traverses [seq] once and will terminate only if [seq] is finite. *) + +val to_seq : 'a t -> 'a Seq.t +(** [to_seq a] is the sequence of elements + [get a 0], [get a 1]... [get a (length a - 1)]. *) + +val to_seq_reentrant : 'a t -> 'a Seq.t +(** [to_seq_reentrant a] is a reentrant variant of {!to_seq}, in the + sense that one may still access its elements after the length of + [a] has changed. + + Demanding the [i]-th element of the resulting sequence (which can + happen zero, one or several times) will access the [i]-th element + of [a] at the time of the demand. The sequence stops if [a] has + less than [i] elements at this point. +*) + +val to_seq_rev : 'a t -> 'a Seq.t +(** [to_seq_rev a] is the sequence of elements + [get a (l - 1)], [get a (l - 2)]... [get a 0], + where [l] is [length a] at the time [to_seq_rev] is invoked. *) + +val to_seq_rev_reentrant : 'a t -> 'a Seq.t +(** [to_seq_rev_reentrant a] is a reentrant variant of {!to_seq_rev}, + in the sense that one may still access its elements after the + length of [a] has changed. + + Elements that have been removed from the array by the time they + are demanded in the sequence are skipped. +*) + + +(** {1:advanced Advanced topics for performance} *) + +(** {2:capacity Backing array, capacity} + + Internally, a dynamic array uses a {b backing array} (a fixed-size + array as provided by the {!Array} module) whose length is greater + or equal to the length of the dynamic array. We define the {b + capacity} of a dynamic array as the length of its backing array. + + The capacity of a dynamic array is relevant in advanced scenarios, + when reasoning about the performance of dynamic array programs: + {ul + {- The memory usage of a dynamic array is proportional to its capacity, + rather than its length.} + {- When there is no empty space left at the end of the backing array, + adding elements requires allocating a new, larger backing array.}} + + The implementation uses a standard exponential reallocation + strategy which guarantees amortized constant-time operation; in + particular, the total capacity of all backing arrays allocated + over the lifetime of a dynamic array is at worst proportional to + the total number of elements added. + + In other words, users need not care about capacity and reallocations, + and they will get reasonable behavior by default. However, in some + performance-sensitive scenarios the functions below can help control + memory usage or guarantee an optimal number of reallocations. +*) + +val capacity : 'a t -> int +(** [capacity a] is the length of [a]'s backing array. *) + +val ensure_capacity : 'a t -> int -> unit +(** [ensure_capacity a n] makes sure that the capacity of [a] + is at least [n]. + + @raise Invalid_argument if the requested capacity is + outside the range [0 .. Sys.max_array_length]. + + An example would be to reimplement {!of_array} without using {!init}: + {[ + let of_array arr = + let a = Dynarray.create () in + Dynarray.ensure_capacity a (Array.length arr); + Array.iter (fun v -> add_last a v) arr + ]} + + Using [ensure_capacity] guarantees that at most one reallocation + will take place, instead of possibly several. + + Without this [ensure_capacity] hint, the number of resizes would + be logarithmic in the length of [arr], creating a constant-factor + slowdown noticeable when [arr] is large. +*) + +val ensure_extra_capacity : 'a t -> int -> unit +(** [ensure_extra_capacity a n] is [ensure_capacity a (length a + n)], + it makes sure that [a] has room for [n] extra items. + + @raise Invalid_argument if the total requested capacity is + outside the range [0 .. Sys.max_array_length]. + + A use case would be to implement {!append_array}: + {[ + let append_array a arr = + ensure_extra_capacity a (Array.length arr); + Array.iter (fun v -> add_last a v) arr + ]} +*) + +val fit_capacity : 'a t -> unit +(** [fit_capacity a] reallocates a backing array if necessary, so that + the resulting capacity is exactly [length a], with no additional + empty space at the end. This can be useful to make sure there is + no memory wasted on a long-lived array. + + Note that calling [fit_capacity] breaks the amortized complexity + guarantees provided by the default reallocation strategy. Calling + it repeatedly on an array may have quadratic complexity, both in + time and in total number of words allocated. + + If you know that a dynamic array has reached its final length, + which will remain fixed in the future, it is sufficient to call + [to_array] and only keep the resulting fixed-size + array. [fit_capacity] is useful when you need to keep a dynamic + array for eventual future resizes. +*) + +val set_capacity : 'a t -> int -> unit +(** [set_capacity a n] reallocates a backing array if necessary, + so that the resulting capacity is exactly [n]. In particular, + all elements of index [n] or greater are removed. + + Like {!fit_capacity}, this function breaks the amortized + complexity guarantees provided by the reallocation + strategy. Calling it repeatedly on an array may have quadratic + complexity, both in time and in total number of words allocated. + + This is an advanced function; in particular, {!ensure_capacity} + should be preferred to increase the capacity, as it preserves + those amortized guarantees. + + @raise Invalid_argument if [n < 0]. +*) + +val reset : 'a t -> unit +(** [reset a] clears [a] and replaces its backing array by an empty array. + + It is equivalent to [set_capacity a 0] or [clear a; fit_capacity a]. +*) + +(** {2:noleaks No leaks: preservation of memory liveness} + + The user-provided values reachable from a dynamic array [a] are + exactly the elements in the positions [0] to [length a - 1]. In + particular, no user-provided values are "leaked" by being present + in the backing array in position [length a] or later. +*) + +(** {2:memory_layout Memory layout of dynarrays} + + In the current implementation, the backing array of an + ['a Dynarray.t] is not an ['a array], but something with the same + representation as an ['a option array] or ['a ref array]. + Each element is in a "box", allocated when the element is first + added to the array -- see the implementation for more details. + + Using an ['a array] would be delicate, as there is no obvious + type-correct way to represent the empty space at the end of the + backing array -- using user-provided values would either + complicate the API or violate the {{!section:noleaks}no leaks} + guarantee. The constraint of remaining memory-safe under + unsynchronized concurrent usage makes it even more + difficult. Various unsafe ways to do this have been discussed, + with no consensus on a standard implementation so far. + + On a realistic automated-theorem-proving program that relies + heavily on dynamic arrays, we measured the overhead of this extra + "boxing" as at most 25%. We believe that the overhead for most + uses of dynarray is much smaller, negligible in many cases, but + you may still prefer to use your own specialized implementation + for performance. (If you know that you do not need the + {{:noleaks}no leaks} guarantee, you can also speed up deleting + elements.) +*) + + + +(** {1:examples Code examples} + +{2:example_min_heap Min-heaps for mutable priority queues} + +We can use dynamic arrays to implement a mutable priority +queue. A priority queue provides a function to add elements, and +a function to extract the minimum element -- according to some +comparison function. + +{[ +(* We present our priority queues as a functor + parametrized on the comparison function. *) +module Heap (Elem : Map.OrderedType) : sig + type t + val create : unit -> t + val add : t -> Elem.t -> unit + val pop_min : t -> Elem.t option +end = struct + + (* Our priority queues are implemented using the standard "min heap" + data structure, a dynamic array representing a binary tree. *) + type t = Elem.t Dynarray.t + let create = Dynarray.create + + (* The node of index [i] has as children the nodes of index [2 * i + 1] + and [2 * i + 2] -- if they are valid indices in the dynarray. *) + let left_child i = 2 * i + 1 + let right_child i = 2 * i + 2 + let parent_node i = (i - 1) / 2 + + (* We use indexing operators for convenient notations. *) + let ( .!() ) = Dynarray.get + let ( .!()<- ) = Dynarray.set + + (* Auxiliary functions to compare and swap two elements + in the dynamic array. *) + let order h i j = + Elem.compare h.!(i) h.!(j) + + let swap h i j = + let v = h.!(i) in + h.!(i) <- h.!(j); + h.!(j) <- v + + (* We say that a heap respects the "heap ordering" if the value of + each node is smaller than the value of its children. The + algorithm manipulates arrays that respect the heap algorithm, + except for one node whose value may be too small or too large. + + The auxiliary functions [heap_up] and [heap_down] take + such a misplaced value, and move it "up" (respectively: "down") + the tree by permuting it with its parent value (respectively: + a child value) until the heap ordering is restored. *) + + let rec heap_up h i = + if i = 0 then () else + let parent = parent_node i in + if order h i parent < 0 then + (swap h i parent; heap_up h parent) + + and heap_down h ~len i = + let left, right = left_child i, right_child i in + if left >= len then () (* no child, stop *) else + let smallest = + if right >= len then left (* no right child *) else + if order h left right < 0 then left else right + in + if order h i smallest > 0 then + (swap h i smallest; heap_down h ~len smallest) + + let add h s = + let i = Dynarray.length h in + Dynarray.add_last h s; + heap_up h i + + let pop_min h = + if Dynarray.is_empty h then None + else begin + (* Standard trick: swap the 'best' value at index 0 + with the last value of the array. *) + let last = Dynarray.length h - 1 in + swap h 0 last; + (* At this point [pop_last] returns the 'best' value, + and leaves a heap with one misplaced element at position 0. *) + let best = Dynarray.pop_last h in + (* Restore the heap ordering -- does nothing if the heap is empty. *) + heap_down h ~len:last 0; + Some best + end +end +]} + +The production code from which this example was inspired includes +logic to free the backing array when the heap becomes empty, only in +the case where the capacity is above a certain threshold. This can be +done by calling the following function from [pop]: + +{[ +let shrink h = + if Dynarray.length h = 0 && Dynarray.capacity h > 1 lsl 18 then + Dynarray.reset h +]} + +The [Heap] functor can be used to implement a sorting function, by +adding all elements into a priority queue and then extracting them in +order. + +{[ +let heap_sort (type a) cmp li = + let module Heap = Heap(struct type t = a let compare = cmp end) in + let heap = Heap.create () in + List.iter (Heap.add heap) li; + List.map (fun _ -> Heap.pop_min heap |> Option.get) li +]} + +*) diff --git a/stdlib/float.ml b/stdlib/float.ml index 266641f65d3..9d40f0c214d 100644 --- a/stdlib/float.ml +++ b/stdlib/float.ml @@ -204,6 +204,32 @@ module Array = struct done; res + let make_matrix sx sy v = + (* We raise even if [sx = 0 && sy < 0]: *) + if sy < 0 then invalid_arg "Float.Array.make_matrix"; + let res = Array.make sx (create 0) in + if sy > 0 then begin + for x = 0 to sx - 1 do + Array.unsafe_set res x (make sy v) + done; + end; + res + + let init_matrix sx sy f = + (* We raise even if [sx = 0 && sy < 0]: *) + if sy < 0 then invalid_arg "Float.Array.init_matrix"; + let res = Array.make sx (create 0) in + if sy > 0 then begin + for x = 0 to sx - 1 do + let row = create sy in + for y = 0 to sy - 1 do + unsafe_set row y (f x y) + done; + Array.unsafe_set res x row + done; + end; + res + let append a1 a2 = let l1 = length a1 in let l2 = length a2 in diff --git a/stdlib/float.mli b/stdlib/float.mli index d8dc86cb84a..239f1bd982e 100644 --- a/stdlib/float.mli +++ b/stdlib/float.mli @@ -533,6 +533,27 @@ module Array : sig applied to the integers [0] to [n-1]. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. *) + val make_matrix : int -> int -> float -> t array + (** [make_matrix dimx dimy e] returns a two-dimensional array + (an array of arrays) with first dimension [dimx] and + second dimension [dimy], where all elements are initialized with [e]. + + @raise Invalid_argument if [dimx] or [dimy] is negative or + greater than {!Sys.max_floatarray_length}. + + @since 5.2 *) + + val init_matrix : int -> int -> (int -> int -> float) -> t array + (** [init_matrix dimx dimy f] returns a two-dimensional array + (an array of arrays) + with first dimension [dimx] and second dimension [dimy], + where the element at index ([x,y]) is initialized with [f x y]. + + @raise Invalid_argument if [dimx] or [dimy] is negative or + greater than {!Sys.max_floatarray_length}. + + @since 5.2 *) + val append : t -> t -> t (** [append v1 v2] returns a fresh floatarray containing the concatenation of the floatarrays [v1] and [v2]. @@ -879,6 +900,27 @@ module ArrayLabels : sig applied to the integers [0] to [n-1]. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. *) + val make_matrix : dimx:int -> dimy:int -> float -> t array + (** [make_matrix ~dimx ~dimy e] returns a two-dimensional array + (an array of arrays) with first dimension [dimx] and + second dimension [dimy], where all elements are initialized with [e]. + + @raise Invalid_argument if [dimx] or [dimy] is negative or + greater than {!Sys.max_floatarray_length}. + + @since 5.2 *) + + val init_matrix : dimx:int -> dimy:int -> f:(int -> int -> float) -> t array + (** [init_matrix ~dimx ~dimy ~f] returns a two-dimensional array + (an array of arrays) + with first dimension [dimx] and second dimension [dimy], + where the element at index ([x,y]) is initialized with [f x y]. + + @raise Invalid_argument if [dimx] or [dimy] is negative or + greater than {!Sys.max_floatarray_length}. + + @since 5.2 *) + val append : t -> t -> t (** [append v1 v2] returns a fresh floatarray containing the concatenation of the floatarrays [v1] and [v2]. diff --git a/stdlib/format.ml b/stdlib/format.ml index b7c53a77035..ee099610de2 100644 --- a/stdlib/format.ml +++ b/stdlib/format.ml @@ -649,6 +649,8 @@ let pp_print_bool state b = pp_print_string state (string_of_bool b) let pp_print_char state c = pp_print_as state 1 (String.make 1 c) +let pp_print_nothing _state () = () + (* Opening boxes. *) let pp_open_hbox state () = pp_open_box_gen state 0 Pp_hbox @@ -819,6 +821,8 @@ let validate_geometry {margin; max_indent} = Error "max_indent < 2" else if margin <= max_indent then Error "margin <= max_indent" + else if margin >= pp_infinity then + Error "margin >= pp_infinity" else Ok () let check_geometry geometry = diff --git a/stdlib/format.mli b/stdlib/format.mli index aba1303f4f9..698669407dc 100644 --- a/stdlib/format.mli +++ b/stdlib/format.mli @@ -263,6 +263,11 @@ val pp_print_bool : formatter -> bool -> unit val print_bool : bool -> unit (** Print a boolean in the current pretty-printing box. *) +val pp_print_nothing : formatter -> unit -> unit +(** Print nothing. + @since 5.2 +*) + (** {1:breaks Break hints} *) (** A 'break hint' tells the pretty-printer to output some space or split the @@ -418,6 +423,13 @@ val print_newline : unit -> unit (** {1 Margin} *) +val pp_infinity : int +(** [pp_infinity] is the maximal size of the margin. + Its exact value is implementation dependent but is guaranteed to be greater + than 10{^9}. + + @since 5.2*) + val pp_set_margin : formatter -> int -> unit val set_margin : int -> unit (** [pp_set_margin ppf d] sets the right margin to [d] (in characters): @@ -426,8 +438,7 @@ val set_margin : int -> unit Setting the margin to [d] means that the formatting engine aims at printing at most [d-1] characters per line. Nothing happens if [d] is smaller than 2. - If [d] is too large, the right margin is set to the maximum - admissible value (which is greater than [10 ^ 9]). + If [d >= ]{!pp_infinity}, the right margin is set to {!pp_infinity}[ - 1]. If [d] is less than the current maximum indentation limit, the maximum indentation limit is decreased while trying to preserve a minimal ratio [max_indent/margin>=50%] and if possible @@ -473,11 +484,8 @@ val set_max_indent : int -> unit Nothing happens if [d] is smaller than 2. - If [d] is too large, the limit is set to the maximum - admissible value (which is greater than [10 ^ 9]). - - If [d] is greater or equal than the current margin, it is ignored, - and the current maximum indentation limit is kept. + If [d] is greater than the current margin, it is ignored, and the current + maximum indentation limit is kept. See also {!pp_set_geometry}. *) @@ -497,8 +505,10 @@ type geometry = { max_indent:int; margin: int} (** @since 4.08 *) val check_geometry: geometry -> bool -(** Check if the formatter geometry is valid: [1 < max_indent < margin] - @since 4.08 *) +(** Check if the formatter geometry is valid: + [1 < max_indent < margin < ]{!pp_infinity} + + @since 4.08 *) val pp_set_geometry : formatter -> max_indent:int -> margin:int -> unit val set_geometry : max_indent:int -> margin:int -> unit @@ -508,7 +518,7 @@ val safe_set_geometry : max_indent:int -> margin:int -> unit [pp_set_geometry ppf ~max_indent ~margin] sets both the margin and maximum indentation limit for [ppf]. - When [1 < max_indent < margin], + When [1 < max_indent < margin < ]{!pp_infinity}, [pp_set_geometry ppf ~max_indent ~margin] is equivalent to [pp_set_margin ppf margin; pp_set_max_indent ppf max_indent]; @@ -1041,7 +1051,7 @@ val make_formatter : For instance, {[ make_formatter - (Stdlib.output oc) + (Stdlib.output_substring oc) (fun () -> Stdlib.flush oc) ]} returns a formatter to the {!Stdlib.out_channel} [oc]. @@ -1482,7 +1492,7 @@ val kasprintf : (string -> 'a) -> ('b, formatter, unit, 'a) format4 -> 'b - [Format.printf "l = [@[%a@]]@." ... l] is like [printf], but with additional formatting instructions (denoted with "@"). The pair - "@[" and "@]" is a "horizontal-or-vertical box". + "[@\[]" and "[@\]]" is a "horizontal-or-vertical box". - "@." ends formatting with a newline. It is similar to "\n" but is also aware of the [Format.formatter]'s state. Do not use "\n" with [Format]. diff --git a/stdlib/gc.ml b/stdlib/gc.ml index 4826131c674..a6de55c8f12 100644 --- a/stdlib/gc.ml +++ b/stdlib/gc.ml @@ -112,15 +112,15 @@ let rec call_alarm arec = Fun.protect ~finally arec.f end +let delete_alarm a = Atomic.set a false let create_alarm f = let arec = { active = Atomic.make true; f = f } in + Domain.at_exit (fun () -> delete_alarm arec.active); finalise call_alarm arec; arec.active -let delete_alarm a = Atomic.set a false - module Memprof = struct type t diff --git a/stdlib/gc.mli b/stdlib/gc.mli index 3d13958c341..9cef53775b8 100644 --- a/stdlib/gc.mli +++ b/stdlib/gc.mli @@ -210,13 +210,11 @@ type control = custom_minor_max_size : int; (** Maximum amount of out-of-heap memory for each custom value - allocated in the minor heap. When a custom value is allocated - on the minor heap and holds more than this many bytes, only - this value is counted against [custom_minor_ratio] and the - rest is directly counted against [custom_major_ratio]. + allocated in the minor heap. Custom values that hold more + than this many bytes are allocated on the major heap. Note: this only applies to values allocated with [caml_alloc_custom_mem] (e.g. bigarrays). - Default: 8192 bytes. + Default: 70000 bytes. @since 4.08 *) } (** The GC parameters are given as a [control] record. Note that @@ -391,15 +389,36 @@ val finalise_release : unit -> unit type alarm (** An alarm is a piece of data that calls a user function at the end of - each major GC cycle. The following functions are provided to create + major GC cycle. The following functions are provided to create and delete alarms. *) val create_alarm : (unit -> unit) -> alarm -(** [create_alarm f] will arrange for [f] to be called at the end of each - major GC cycle, not caused by [f] itself, starting with the current - cycle or the next one. - A value of type [alarm] is returned that you can - use to call [delete_alarm]. *) +(** [create_alarm f] will arrange for [f] to be called at the end of + major GC cycles, not caused by [f] itself, starting with the + current cycle or the next one. [f] will run on the same domain that + created the alarm, until the domain exits or [delete_alarm] is + called. A value of type [alarm] is returned that you can use to + call [delete_alarm]. + + It is not guaranteed that the Gc alarm runs at the end of every major + GC cycle, but it is guaranteed that it will run eventually. + + As an example, here is a crude way to interrupt a function if the + memory consumption of the program exceeds a given [limit] in MB, + suitable for use in the toplevel: + + {[ +let run_with_memory_limit (limit : int) (f : unit -> 'a) : 'a = + let limit_memory () = + let mem = Gc.(quick_stat ()).heap_words in + if mem / (1024 * 1024) > limit / (Sys.word_size / 8) then + raise Out_of_memory + in + let alarm = Gc.create_alarm limit_memory in + Fun.protect f ~finally:(fun () -> Gc.delete_alarm alarm ; Gc.compact ()) + ]} + +*) val delete_alarm : alarm -> unit (** [delete_alarm a] will stop the calls to the function associated diff --git a/stdlib/hashtbl.mli b/stdlib/hashtbl.mli index a256758356d..c771ef86b00 100644 --- a/stdlib/hashtbl.mli +++ b/stdlib/hashtbl.mli @@ -43,9 +43,11 @@ (** {b Unsynchronized accesses} *) +[@@@warning "-53"] [@@@alert unsynchronized_access "Unsynchronized accesses to hash tables are a programming error." ] +[@@@warning "+53"] (** Unsynchronized accesses to a hash table may lead to an invalid hash table diff --git a/stdlib/headernt.c b/stdlib/headernt.c index 4543ed7a94f..40800690a7b 100644 --- a/stdlib/headernt.c +++ b/stdlib/headernt.c @@ -123,7 +123,7 @@ static __inline void __declspec(noreturn) run_runtime(wchar_t * runtime, PROCESS_INFORMATION procinfo; DWORD retcode; if (SearchPath(NULL, runtime, L".exe", sizeof(path)/sizeof(wchar_t), - path, &runtime) == 0) { + path, NULL) == 0) { HANDLE errh; errh = GetStdHandle(STD_ERROR_HANDLE); write_console(errh, L"Cannot exec "); diff --git a/stdlib/lazy.mli b/stdlib/lazy.mli index b9f3059adfc..0dbdadbd30e 100644 --- a/stdlib/lazy.mli +++ b/stdlib/lazy.mli @@ -116,7 +116,7 @@ val map_val : ('a -> 'b) -> 'a t -> 'b t (** {1 Advanced} The following definitions are for advanced uses only; they require - familiary with the lazy compilation scheme to be used appropriately. *) + familiarity with the lazy compilation scheme to be used appropriately. *) val from_fun : (unit -> 'a) -> 'a t (** [from_fun f] is the same as [lazy (f ())] but slightly more efficient. diff --git a/stdlib/moreLabels.mli b/stdlib/moreLabels.mli index 7731ad66023..4199815cffd 100644 --- a/stdlib/moreLabels.mli +++ b/stdlib/moreLabels.mli @@ -60,9 +60,11 @@ module Hashtbl : sig (** {b Unsynchronized accesses} *) + [@@@warning "-53"] [@@@alert unsynchronized_access "Unsynchronized accesses to hash tables are a programming error." ] + [@@@warning "+53"] (** Unsynchronized accesses to a hash table may lead to an invalid hash table diff --git a/stdlib/obj.ml b/stdlib/obj.ml index f2a7e3fa052..0393fc58858 100644 --- a/stdlib/obj.ml +++ b/stdlib/obj.ml @@ -68,33 +68,6 @@ let int_tag = 1000 let out_of_heap_tag = 1001 let unaligned_tag = 1002 -module Closure = struct - type info = { - arity: int; - start_env: int; - } - - let info_of_raw (info : nativeint) = - let open Nativeint in - let arity = - (* signed: negative for tupled functions *) - if Sys.word_size = 64 then - to_int (shift_right info 56) - else - to_int (shift_right info 24) - in - let start_env = - (* start_env is unsigned, but we know it can always fit an OCaml - integer so we use [to_int] instead of [unsigned_to_int]. *) - to_int (shift_right_logical (shift_left info 8) 9) in - { arity; start_env } - - (* note: we expect a closure, not an infix pointer *) - let info (obj : t) = - assert (tag obj = closure_tag); - info_of_raw (raw_field obj 1) -end - module Extension_constructor = struct type t = extension_constructor diff --git a/stdlib/obj.mli b/stdlib/obj.mli index 4e3bad8b66e..98088bcdfd4 100644 --- a/stdlib/obj.mli +++ b/stdlib/obj.mli @@ -25,7 +25,7 @@ type raw_data = nativeint (* @since 4.12 *) external repr : 'a -> t = "%identity" external obj : t -> 'a = "%identity" external magic : 'a -> 'b = "%identity" -val [@inline always] is_block : t -> bool +val is_block : t -> bool external is_int : t -> bool = "%obj_is_int" external tag : t -> int = "caml_obj_tag" [@@noalloc] external size : t -> int = "%obj_size" @@ -54,8 +54,8 @@ external field : t -> int -> t = "%obj_field" *) external set_field : t -> int -> t -> unit = "%obj_set_field" -val [@inline always] double_field : t -> int -> float (* @since 3.11.2 *) -val [@inline always] set_double_field : t -> int -> float -> unit +val double_field : t -> int -> float (* @since 3.11.2 *) +val set_double_field : t -> int -> float -> unit (* @since 3.11.2 *) external raw_field : t -> int -> raw_data = "caml_obj_raw_field" @@ -92,20 +92,12 @@ val int_tag : int val out_of_heap_tag : int val unaligned_tag : int (* should never happen @since 3.11 *) -module Closure : sig - type info = { - arity: int; - start_env: int; - } - val info : t -> info -end - module Extension_constructor : sig type t = extension_constructor val of_val : 'a -> t - val [@inline always] name : t -> string - val [@inline always] id : t -> int + val name : t -> string + val id : t -> int end module Ephemeron: sig diff --git a/stdlib/random.ml b/stdlib/random.ml index 64cc8e3c5cb..70b0a018902 100644 --- a/stdlib/random.ml +++ b/stdlib/random.ml @@ -114,35 +114,109 @@ module State = struct let make_self_init () = make (random_seed ()) - (* Return 30 random bits as an integer 0 <= x < 1073741824 *) + let min_int31 = -0x4000_0000 + (* = -2{^30}, which is [min_int] for 31-bit integers *) + let max_int31 = 0x3FFF_FFFF + (* = 2{^30}-1, which is [max_int] for 31-bit integers *) + (* avoid integer literals for these, 32-bit OCaml would reject them: *) + let min_int32 = -(1 lsl 31) + (* = -0x8000_0000 on platforms where [Sys.int_size >= 32] *) + let max_int32 = (1 lsl 31) - 1 + (* = 0x7FFF_FFFF on platforms where [Sys.int_size >= 32] *) + + (* Return 30 random bits as an integer 0 <= x < 2^30 *) let bits s = - Int64.to_int (next s) land 0x3FFF_FFFF - - (* Return an integer between 0 (included) and [bound] (excluded) *) - let rec intaux s n = - let r = bits s in + Int64.to_int (next s) land max_int31 + + (* Return an integer between 0 (included) and [n] (excluded). + [bound] may be any positive [int]. [mask] must be of the form [2{^i}-1] + and greater or equal to [n]. Larger values of [mask] make the function + run faster (fewer samples are rejected). Smaller values of [mask] + are usable on a wider range of OCaml implementations. *) + let rec int_aux s n mask = + (* We start by drawing a non-negative integer in the [ [0, mask] ] range *) + let r = Int64.to_int (next s) land mask in let v = r mod n in - if r - v > 0x3FFFFFFF - n + 1 then intaux s n else v + (* For uniform distribution of the result between 0 included and [n] + * excluded, the random number [r] must have been drawn uniformly in + * an interval whose length is a multiple of [n]. To achieve this, + * we use rejection sampling on the greatest interval [ [0, k*n-1] ] + * that fits in [ [0, mask] ]. That is, we reject the + * sample if it falls outside of this interval, and draw again. + * This is what the test below does, while carefuly avoiding + * overflows and sparing a division [mask / n]. *) + if r - v > mask - n + 1 then int_aux s n mask else v + (* Return an integer between 0 (included) and [bound] (excluded). + The bound must fit in 31-bit signed integers. + This function yields the same output regardless of the integer size. *) let int s bound = - if bound > 0x3FFFFFFF || bound <= 0 + if bound > max_int31 || bound <= 0 then invalid_arg "Random.int" - else intaux s bound + else int_aux s bound max_int31 (* Return an integer between 0 (included) and [bound] (excluded). [bound] may be any positive [int]. *) - let rec int63aux s n = - let r = Int64.to_int (next s) land max_int in - let v = r mod n in - if r - v > max_int - n + 1 then int63aux s n else v - let full_int s bound = if bound <= 0 then invalid_arg "Random.full_int" - else if bound > 0x3FFFFFFF then - int63aux s bound + (* When the bound fits in 31-bit signed integers, we use the same mask + as in function [int] so as to yield the same output on all platforms + supported by OCaml (32-bit OCaml, 64-bit OCaml, and JavaScript). + When the bound fits in 32-bit signed integers, we use [max_int32] + as the mask so as to yield the same output on all platforms where + [Sys.int_size >= 32] (i.e. JavaScript and 64-bit OCaml). *) else - intaux s bound + int_aux s bound + (if bound <= max_int31 then max_int31 + else if bound <= max_int32 then max_int32 + else max_int) + + (* Return an integer between [min] (included) and [max] (included). + The [nbits] parameter is the size in bits of the signed integers + we draw from [s]. + We must have [-2{^nbits - 1} <= min <= max < 2{^nbits - 1}]. + Moreover, for the iteration to converge quickly, the interval + [[min, max]] should have width at least [2{^nbits - 1}]. + As the width approaches this lower limit, the average number of + draws approaches 2, with a quite high standard deviation (2 + epsilon). *) + let rec int_in_large_range s ~min ~max ~nbits = + let drop = Sys.int_size - nbits in + (* The bitshifts replicate the [nbits]-th bit (sign bit) to higher bits: *) + let r = ((Int64.to_int (next s)) lsl drop) asr drop in + if r < min || r > max then int_in_large_range s ~min ~max ~nbits else r + + (* Return an integer between [min] (included) and [max] (included). + [mask] is as described for [int_aux]. + [nbits] is as described for [int_in_large_range]. *) + let int_in_range_aux s ~min ~max ~mask ~nbits = + let span = max - min + 1 in + if span <= mask (* [span] is small enough *) + && span > 0 (* no overflow occurred when computing [span] *) + then + (* Just draw a number in [[0, span)] and shift it by [min]. *) + min + int_aux s span mask + else + (* Span too large, use the alternative drawing method. *) + int_in_large_range s ~min ~max ~nbits + + (* Return an integer between [min] (included) and [max] (included). + We must have [min <= max]. *) + let int_in_range s ~min ~max = + if min > max then + invalid_arg "Random.int_in_range"; + (* When both bounds fit in 31-bit signed integers, we use parameters + [mask] and [nbits] appropriate for 31-bit integers, so as to + yield the same output on all platforms supported by OCaml. + When both bounds fit in 32-bit signed integers, we use parameters + [mask] and [nbits] appropriate for 32-bit integers, so as to + yield the same output on JavaScript and on 64-bit OCaml. *) + if min >= min_int31 && max <= max_int31 then + int_in_range_aux s ~min ~max ~mask:max_int31 ~nbits:31 + else if min >= min_int32 && max <= max_int32 then + int_in_range_aux s ~min ~max ~mask:max_int32 ~nbits:32 + else + int_in_range_aux s ~min ~max ~mask:max_int ~nbits:Sys.int_size (* Return 32 random bits as an [int32] *) let bits32 s = @@ -152,6 +226,7 @@ module State = struct let rec int32aux s n = let r = Int32.shift_right_logical (bits32 s) 1 in let v = Int32.rem r n in + (* Explanation of this test: see comment in [int_aux]. *) if Int32.(sub r v > add (sub max_int n) 1l) then int32aux s n else v @@ -161,6 +236,23 @@ module State = struct then invalid_arg "Random.int32" else int32aux s bound + (* Return an [int32] between [min] (included) and [max] (included). + We must have [min <= max]. *) + let rec int32_in_range_aux s ~min ~max = + let r = Int64.to_int32 (next s) in + if r < min || r > max then int32_in_range_aux s ~min ~max else r + + let int32_in_range s ~min ~max = + if min > max then + invalid_arg "Random.int32_in_range" + else + let span = Int32.succ (Int32.sub max min) in + (* Explanation of this test: see comment in [int_in_range_aux]. *) + if span <= Int32.zero then + int32_in_range_aux s ~min ~max + else + Int32.add min (int32aux s span) + (* Return 64 random bits as an [int64] *) let bits64 s = next s @@ -169,6 +261,7 @@ module State = struct let rec int64aux s n = let r = Int64.shift_right_logical (bits64 s) 1 in let v = Int64.rem r n in + (* Explanation of this test: see comment in [int_aux]. *) if Int64.(sub r v > add (sub max_int n) 1L) then int64aux s n else v @@ -178,6 +271,23 @@ module State = struct then invalid_arg "Random.int64" else int64aux s bound + (* Return an [int64] between [min] (included) and [max] (included). + We must have [min <= max]. *) + let rec int64_in_range_aux s ~min ~max = + let r = next s in + if r < min || r > max then int64_in_range_aux s ~min ~max else r + + let int64_in_range s ~min ~max = + if min > max then + invalid_arg "Random.int64_in_range" + else + let span = Int64.succ (Int64.sub max min) in + (* Explanation of this test: see comment in [int_in_range_aux]. *) + if span <= Int64.zero then + int64_in_range_aux s ~min ~max + else + Int64.add min (int64aux s span) + (* Return 32 or 64 random bits as a [nativeint] *) let nativebits = if Nativeint.size = 32 @@ -190,6 +300,16 @@ module State = struct then fun s bound -> Nativeint.of_int32 (int32 s (Nativeint.to_int32 bound)) else fun s bound -> Int64.to_nativeint (int64 s (Int64.of_nativeint bound)) + (* Return a [nativeint] between [min] (included) and [max] (included). *) + let nativeint_in_range = + if Nativeint.size = 32 + then fun s ~min ~max -> + Nativeint.of_int32 (int32_in_range s + ~min:(Nativeint.to_int32 min) ~max:(Nativeint.to_int32 max)) + else fun s ~min ~max -> + Int64.to_nativeint (int64_in_range s + ~min:(Int64.of_nativeint min) ~max:(Int64.of_nativeint max)) + (* Return a float 0 < x < 1 uniformly distributed among the multiples of 2^-53 *) let rec rawfloat s = @@ -223,9 +343,17 @@ let random_key = let bits () = State.bits (Domain.DLS.get random_key) let int bound = State.int (Domain.DLS.get random_key) bound let full_int bound = State.full_int (Domain.DLS.get random_key) bound +let int_in_range ~min ~max = + State.int_in_range (Domain.DLS.get random_key) ~min ~max let int32 bound = State.int32 (Domain.DLS.get random_key) bound +let int32_in_range ~min ~max = + State.int32_in_range (Domain.DLS.get random_key) ~min ~max let nativeint bound = State.nativeint (Domain.DLS.get random_key) bound +let nativeint_in_range ~min ~max = + State.nativeint_in_range (Domain.DLS.get random_key) ~min ~max let int64 bound = State.int64 (Domain.DLS.get random_key) bound +let int64_in_range ~min ~max = + State.int64_in_range (Domain.DLS.get random_key) ~min ~max let float scale = State.float (Domain.DLS.get random_key) scale let bool () = State.bool (Domain.DLS.get random_key) let bits32 () = State.bits32 (Domain.DLS.get random_key) diff --git a/stdlib/random.mli b/stdlib/random.mli index 4254aa20ded..27f6e242764 100644 --- a/stdlib/random.mli +++ b/stdlib/random.mli @@ -24,6 +24,9 @@ In contrast, all threads within a domain share the same domain-local generator. Independent generators can be created with the {!Random.split} function and used with the functions from the {!Random.State} module. + + @before 5.0 Random value generation used a different algorithm. + This affects all the functions in this module which return random values. *) (** {1 Basic functions} *) @@ -44,36 +47,101 @@ val self_init : unit -> unit val bits : unit -> int (** Return 30 random bits in a nonnegative integer. - @before 5.0 used a different algorithm (affects all the following functions) *) val int : int -> int (** [Random.int bound] returns a random integer between 0 (inclusive) and [bound] (exclusive). [bound] must be greater than 0 and less - than 2{^30}. *) + than 2{^30}. + + @raise Invalid_argument if [bound] <= 0 or [bound] >= 2{^30}. +*) val full_int : int -> int (** [Random.full_int bound] returns a random integer between 0 (inclusive) and [bound] (exclusive). [bound] may be any positive integer. - If [bound] is less than 2{^30}, [Random.full_int bound] is equal to - {!Random.int}[ bound]. If [bound] is greater than 2{^30} (on 64-bit systems - or non-standard environments, such as JavaScript), [Random.full_int] - returns a value, where {!Random.int} raises {!Stdlib.Invalid_argument}. + If [bound] is less than 2{^31}, + then [Random.full_int bound] yields identical output + across systems with varying [int] sizes. + + If [bound] is less than 2{^30}, + then [Random.full_int bound] is equal to {!Random.int}[ bound]. + + If [bound] is at least 2{^30} + (on 64-bit systems, or non-standard environments such as JavaScript), + then [Random.full_int] returns a value + whereas {!Random.int} raises {!Stdlib.Invalid_argument}. + + @raise Invalid_argument if [bound] <= 0. @since 4.13 *) +val int_in_range : min:int -> max:int -> int +(** [Random.int_in_range ~min ~max] returns a random integer + between [min] (inclusive) and [max] (inclusive). + Both [min] and [max] are allowed to be negative; + [min] must be less than or equal to [max]. + + If both bounds fit in 32-bit signed integers + (that is, if -2{^31} <= [min] and [max] < 2{^31}), + then [int_in_range] yields identical output + across systems with varying [int] sizes. + + @raise Invalid_argument if [min > max]. + + @since 5.2 *) + val int32 : Int32.t -> Int32.t (** [Random.int32 bound] returns a random integer between 0 (inclusive) - and [bound] (exclusive). [bound] must be greater than 0. *) + and [bound] (exclusive). [bound] must be greater than 0. + + @raise Invalid_argument if [bound] <= 0. +*) + +val int32_in_range : min:int32 -> max:int32 -> int32 +(** [Random.int32_in_range ~min ~max] returns a random integer + between [min] (inclusive) and [max] (inclusive). + Both [min] and [max] are allowed to be negative; + [min] must be less than or equal to [max]. + + @raise Invalid_argument if [min > max]. + + @since 5.2 *) val nativeint : Nativeint.t -> Nativeint.t (** [Random.nativeint bound] returns a random integer between 0 (inclusive) - and [bound] (exclusive). [bound] must be greater than 0. *) + and [bound] (exclusive). [bound] must be greater than 0. + + @raise Invalid_argument if [bound] <= 0. +*) + +val nativeint_in_range : min:nativeint -> max:nativeint -> nativeint +(** [Random.nativeint_in_range ~min ~max] returns a random integer + between [min] (inclusive) and [max] (inclusive). + Both [min] and [max] are allowed to be negative; + [min] must be less than or equal to [max]. + + @raise Invalid_argument if [min > max]. + + @since 5.2 *) val int64 : Int64.t -> Int64.t (** [Random.int64 bound] returns a random integer between 0 (inclusive) - and [bound] (exclusive). [bound] must be greater than 0. *) + and [bound] (exclusive). [bound] must be greater than 0. + + @raise Invalid_argument if [bound] <= 0. +*) + +val int64_in_range : min:int64 -> max:int64 -> int64 +(** [Random.int64_in_range ~min ~max] returns a random integer + between [min] (inclusive) and [max] (inclusive). + Both [min] and [max] are allowed to be negative; + [min] must be less than or equal to [max]. + + @raise Invalid_argument if [min > max]. + + @since 5.2 *) val float : float -> float (** [Random.float bound] returns a random floating-point number @@ -127,9 +195,13 @@ module State : sig val bits : t -> int val int : t -> int -> int val full_int : t -> int -> int + val int_in_range : t -> min:int -> max:int -> int val int32 : t -> Int32.t -> Int32.t + val int32_in_range : t -> min:int32 -> max:int32 -> int32 val nativeint : t -> Nativeint.t -> Nativeint.t + val nativeint_in_range : t -> min:nativeint -> max:nativeint -> nativeint val int64 : t -> Int64.t -> Int64.t + val int64_in_range : t -> min:int64 -> max:int64 -> int64 val float : t -> float -> float val bool : t -> bool val bits32 : t -> Int32.t diff --git a/stdlib/stdlib.ml b/stdlib/stdlib.ml index e24e5a28201..636a90420e9 100644 --- a/stdlib/stdlib.ml +++ b/stdlib/stdlib.ml @@ -597,6 +597,7 @@ module Complex = Complex module Condition = Condition module Digest = Digest module Domain = Domain +module Dynarray = Dynarray module Effect = Effect module Either = Either module Ephemeron = Ephemeron diff --git a/stdlib/stdlib.mli b/stdlib/stdlib.mli index 3d2ffe10e88..81af56ce61d 100644 --- a/stdlib/stdlib.mli +++ b/stdlib/stdlib.mli @@ -1406,6 +1406,7 @@ module Domain = Domain [@@alert unstable "The Domain interface may change in incompatible ways in the future." ] +module Dynarray = Dynarray module Effect = Effect [@@alert "-unstable"] [@@alert unstable diff --git a/stdlib/string.mli b/stdlib/string.mli index d17441ac267..e61638380f6 100644 --- a/stdlib/string.mli +++ b/stdlib/string.mli @@ -195,6 +195,7 @@ val sub : string -> int -> int -> string val split_on_char : char -> string -> string list (** [split_on_char sep s] is the list of all (possibly empty) substrings of [s] that are delimited by the character [sep]. + If [s] is empty, the result is the singleton list [[""]]. The function's result is specified by the following invariants: {ul diff --git a/stdlib/stringLabels.mli b/stdlib/stringLabels.mli index 28b3efe35fd..14868cbc957 100644 --- a/stdlib/stringLabels.mli +++ b/stdlib/stringLabels.mli @@ -195,6 +195,7 @@ val sub : string -> pos:int -> len:int -> string val split_on_char : sep:char -> string -> string list (** [split_on_char ~sep s] is the list of all (possibly empty) substrings of [s] that are delimited by the character [sep]. + If [s] is empty, the result is the singleton list [[""]]. The function's result is specified by the following invariants: {ul diff --git a/stdlib/sys.mli b/stdlib/sys.mli index b7d44865292..5fdd8c5c418 100644 --- a/stdlib/sys.mli +++ b/stdlib/sys.mli @@ -331,7 +331,7 @@ val sigxfsz : int exception Break (** Exception raised on interactive interrupt if {!Sys.catch_break} - is on. *) + is enabled. *) val catch_break : bool -> unit @@ -339,7 +339,13 @@ val catch_break : bool -> unit terminates the program or raises the [Break] exception. Call [catch_break true] to enable raising [Break], and [catch_break false] to let the system - terminate the program on user interrupt. *) + terminate the program on user interrupt. + + Inside multi-threaded programs, the [Break] exception will arise in + any one of the active threads, and will keep arising on further + interactive interrupt until all threads are terminated. Use + signal masks from [Thread.sigmask] to direct the interrupt towards a + specific thread. *) val ocaml_version : string diff --git a/stdlib/templates/floatarraylabeled.template.mli b/stdlib/templates/floatarraylabeled.template.mli index a615ffc2208..a691538367f 100644 --- a/stdlib/templates/floatarraylabeled.template.mli +++ b/stdlib/templates/floatarraylabeled.template.mli @@ -49,6 +49,27 @@ val init : int -> f:(int -> float) -> t applied to the integers [0] to [n-1]. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. *) +val make_matrix : dimx:int -> dimy:int -> float -> t array +(** [make_matrix ~dimx ~dimy e] returns a two-dimensional array + (an array of arrays) with first dimension [dimx] and + second dimension [dimy], where all elements are initialized with [e]. + + @raise Invalid_argument if [dimx] or [dimy] is negative or + greater than {!Sys.max_floatarray_length}. + + @since 5.2 *) + +val init_matrix : dimx:int -> dimy:int -> f:(int -> int -> float) -> t array +(** [init_matrix ~dimx ~dimy ~f] returns a two-dimensional array + (an array of arrays) + with first dimension [dimx] and second dimension [dimy], + where the element at index ([x,y]) is initialized with [f x y]. + + @raise Invalid_argument if [dimx] or [dimy] is negative or + greater than {!Sys.max_floatarray_length}. + + @since 5.2 *) + val append : t -> t -> t (** [append v1 v2] returns a fresh floatarray containing the concatenation of the floatarrays [v1] and [v2]. diff --git a/stdlib/templates/hashtbl.template.mli b/stdlib/templates/hashtbl.template.mli index 5a3dd46a025..2782c87dde5 100644 --- a/stdlib/templates/hashtbl.template.mli +++ b/stdlib/templates/hashtbl.template.mli @@ -43,9 +43,11 @@ (** {b Unsynchronized accesses} *) +[@@@warning "-53"] [@@@alert unsynchronized_access "Unsynchronized accesses to hash tables are a programming error." ] +[@@@warning "+53"] (** Unsynchronized accesses to a hash table may lead to an invalid hash table diff --git a/testsuite/Makefile b/testsuite/Makefile index 6384f463423..eb0c67e23e9 100644 --- a/testsuite/Makefile +++ b/testsuite/Makefile @@ -55,8 +55,18 @@ ifeq "$(UNIX_OR_WIN32)" "unix" else # Non-cygwin Unix find := find endif + # $(IFS_LINE) for Unix simply clears IFS, so entire lines are read + IFS_LINE = IFS='' else # Windows find := /usr/bin/find + # On Windows, ocamltest will produce Windows line-endings (\r\n) and the final + # \r is kept by the shell. This can either be stripped with tr -d '\r' but we + # can avoid the additional process by instead setting IFS in the while loop to + # be the CR character (i.e. treat \r as a field delimiter). + # The dance with $(CR_CHAR) is because POSIX doesn't provide a way to write \r + # in a string. + export CR_CHAR := $(shell printf "\r") + IFS_LINE = IFS="$$CR_CHAR" endif ifeq "$(ocamltest_program)" "" @@ -151,10 +161,9 @@ all: .PHONY: new-without-report new-without-report: lib tools @rm -f $(failstamp) - @(IFS=$$(printf "\r\n"); \ - $(ocamltest) -find-test-dirs tests | while IFS='' read -r dir; do \ + @($(ocamltest) -find-test-dirs tests | while $(IFS_LINE) read -r dir; do \ echo Running tests from \'$$dir\' ... ; \ - $(MAKE) exec-ocamltest DIR=$$dir \ + $(MAKE) exec-ocamltest DIR="$$dir" \ OCAMLTESTENV=""; \ done || echo outer loop >> $(failstamp)) 2>&1 | tee $(TESTLOG) @$(MAKE) check-failstamp @@ -266,26 +275,19 @@ one: lib tools .PHONY: exec-one exec-one: - @if $(ocamltest) -list-tests $(DIR) >/dev/null 2>&1; then \ - echo "Running tests from '$$DIR' ..."; \ - $(MAKE) exec-ocamltest DIR=$(DIR) \ + @$(ocamltest) -find-test-dirs $(DIR) | while $(IFS_LINE) read -r dir; do \ + echo "Running tests from '$$dir' ..."; \ + $(MAKE) exec-ocamltest DIR="$$dir" \ OCAMLTESTENV="OCAMLTESTDIR=$(OCAMLTESTDIR)"; \ - else \ - for dir in $(DIR)/*; do \ - if [ -d $$dir ]; then \ - $(MAKE) exec-one DIR=$$dir; \ - fi; \ - done; \ - fi + done .PHONY: exec-ocamltest exec-ocamltest: @if [ -z "$(DIR)" ]; then exit 1; fi @if [ ! -d "$(DIR)" ]; then exit 1; fi - @(IFS=$$(printf "\r\n"); \ - $(ocamltest) -list-tests $(DIR) | while IFS='' read -r testfile; do \ + @($(ocamltest) -list-tests $(DIR) | while $(IFS_LINE) read -r testfile; do \ TERM=dumb $(OCAMLTESTENV) \ - $(ocamltest) $(OCAMLTESTFLAGS) $(DIR)/$$testfile || \ + $(ocamltest) $(OCAMLTESTFLAGS) "$(DIR)/$$testfile" || \ echo " ... testing '$$testfile' => unexpected error"; \ done) || echo directory "$(DIR)" >>$(failstamp) diff --git a/testsuite/summarize.awk b/testsuite/summarize.awk index 35999896737..e7c5b24af2b 100644 --- a/testsuite/summarize.awk +++ b/testsuite/summarize.awk @@ -134,6 +134,10 @@ function record_unexp() { record_unexp(); } +/make[^:]*: \*\*\* \[[^]]*\] Error/ { + errored = 1; +} + END { if (in_test) record_unexp(); diff --git a/testsuite/tests/backtrace/backtrace_dynlink.flambda.reference b/testsuite/tests/backtrace/backtrace_dynlink.flambda.reference index e344d01f1ee..f8df384eeb7 100644 --- a/testsuite/tests/backtrace/backtrace_dynlink.flambda.reference +++ b/testsuite/tests/backtrace/backtrace_dynlink.flambda.reference @@ -1,25 +1,25 @@ Raised by primitive operation at Backtrace_dynlink_plugin in file "backtrace_dynlink_plugin.ml", line 6, characters 13-38 -Called from Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 85, characters 12-29 +Called from Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 83, characters 12-29 Called from Stdlib__List.iter in file "list.ml" (inlined), line 112, characters 12-15 -Called from Dynlink.Native.run in file "native/dynlink.ml", line 84, characters 4-273 -Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml", line 360, characters 11-54 +Called from Dynlink.Native.run in file "native/dynlink.ml", line 82, characters 4-273 +Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml", line 358, characters 11-54 Called from Stdlib__List.iter in file "list.ml" (inlined), line 112, characters 12-15 -Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml" (inlined), line 356, characters 6-372 +Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml" (inlined), line 354, characters 6-372 Called from Stdlib__Fun.protect in file "fun.ml" (inlined), line 33, characters 8-15 -Called from Dynlink_common.Make.load in file "dynlink_common.ml", line 349, characters 4-662 -Called from Dynlink_common.Make.loadfile in file "dynlink_common.ml" (inlined), line 368, characters 26-45 +Called from Dynlink_common.Make.load in file "dynlink_common.ml", line 347, characters 4-662 +Called from Dynlink_common.Make.loadfile in file "dynlink_common.ml" (inlined), line 366, characters 26-45 Called from Backtrace_dynlink in file "backtrace_dynlink.ml", line 39, characters 4-52 execution of module initializers in the shared library failed: Failure("SUCCESS") -Raised by primitive operation at Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 85, characters 12-29 -Re-raised at Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 87, characters 10-149 +Raised by primitive operation at Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 83, characters 12-29 +Re-raised at Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 85, characters 10-149 Called from Stdlib__List.iter in file "list.ml" (inlined), line 112, characters 12-15 -Called from Dynlink.Native.run in file "native/dynlink.ml", line 84, characters 4-273 -Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml", line 360, characters 11-54 +Called from Dynlink.Native.run in file "native/dynlink.ml", line 82, characters 4-273 +Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml", line 358, characters 11-54 Called from Stdlib__List.iter in file "list.ml" (inlined), line 112, characters 12-15 -Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml" (inlined), line 356, characters 6-372 +Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml" (inlined), line 354, characters 6-372 Called from Stdlib__Fun.protect in file "fun.ml" (inlined), line 33, characters 8-15 -Called from Dynlink_common.Make.load in file "dynlink_common.ml", line 349, characters 4-662 +Called from Dynlink_common.Make.load in file "dynlink_common.ml", line 347, characters 4-662 Re-raised at Stdlib__Fun.protect in file "fun.ml" (inlined), line 38, characters 6-52 -Called from Dynlink_common.Make.load in file "dynlink_common.ml", line 349, characters 4-662 -Called from Dynlink_common.Make.loadfile in file "dynlink_common.ml" (inlined), line 368, characters 26-45 +Called from Dynlink_common.Make.load in file "dynlink_common.ml", line 347, characters 4-662 +Called from Dynlink_common.Make.loadfile in file "dynlink_common.ml" (inlined), line 366, characters 26-45 Called from Backtrace_dynlink in file "backtrace_dynlink.ml", line 39, characters 4-52 diff --git a/testsuite/tests/backtrace/backtrace_dynlink.reference b/testsuite/tests/backtrace/backtrace_dynlink.reference index 8edaaa0774e..cc3265a38c3 100644 --- a/testsuite/tests/backtrace/backtrace_dynlink.reference +++ b/testsuite/tests/backtrace/backtrace_dynlink.reference @@ -1,18 +1,18 @@ Raised by primitive operation at Backtrace_dynlink_plugin in file "backtrace_dynlink_plugin.ml", line 6, characters 13-38 -Called from Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 85, characters 12-29 +Called from Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 83, characters 12-29 Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 -Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml", line 360, characters 11-54 +Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml", line 358, characters 11-54 Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 Called from Stdlib__Fun.protect in file "fun.ml", line 33, characters 8-15 -Called from Dynlink_common.Make.loadfile in file "dynlink_common.ml" (inlined), line 368, characters 26-45 +Called from Dynlink_common.Make.loadfile in file "dynlink_common.ml" (inlined), line 366, characters 26-45 Called from Backtrace_dynlink in file "backtrace_dynlink.ml", line 39, characters 4-52 execution of module initializers in the shared library failed: Failure("SUCCESS") -Raised by primitive operation at Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 85, characters 12-29 -Re-raised at Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 87, characters 10-149 +Raised by primitive operation at Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 83, characters 12-29 +Re-raised at Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 85, characters 10-149 Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 -Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml", line 360, characters 11-54 +Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml", line 358, characters 11-54 Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 Called from Stdlib__Fun.protect in file "fun.ml", line 33, characters 8-15 Re-raised at Stdlib__Fun.protect in file "fun.ml", line 38, characters 6-52 -Called from Dynlink_common.Make.loadfile in file "dynlink_common.ml" (inlined), line 368, characters 26-45 +Called from Dynlink_common.Make.loadfile in file "dynlink_common.ml" (inlined), line 366, characters 26-45 Called from Backtrace_dynlink in file "backtrace_dynlink.ml", line 39, characters 4-52 diff --git a/testsuite/tests/basic-more/labels_evaluation_order.ml b/testsuite/tests/basic-more/labels_evaluation_order.ml new file mode 100644 index 00000000000..8c89577f963 --- /dev/null +++ b/testsuite/tests/basic-more/labels_evaluation_order.ml @@ -0,0 +1,16 @@ +(* TEST +*) + +[@@@warning "-unerasable-optional-argument"] +let foo ?a = + print_endline "a parameter"; + fun ~b -> + print_endline "b parameter"; + fun ~c -> + print_endline "c parameter" + +let f = foo ~a:(print_endline "a argument") ~c:(print_endline "c argument") + +let _ = print_endline "f defined" + +let _ = f ~b:(print_endline "b argument") diff --git a/testsuite/tests/basic-more/labels_evaluation_order.reference b/testsuite/tests/basic-more/labels_evaluation_order.reference new file mode 100644 index 00000000000..3714141bf6d --- /dev/null +++ b/testsuite/tests/basic-more/labels_evaluation_order.reference @@ -0,0 +1,7 @@ +c argument +a argument +f defined +b argument +a parameter +b parameter +c parameter diff --git a/testsuite/tests/basic/patmatch_for_multiple.ml b/testsuite/tests/basic/patmatch_for_multiple.ml index d3f3f1409ef..219afb611e6 100644 --- a/testsuite/tests/basic/patmatch_for_multiple.ml +++ b/testsuite/tests/basic/patmatch_for_multiple.ml @@ -26,15 +26,15 @@ match (3, 2, 1) with | _ -> false ;; [%%expect{| -(let (*match*/276 = 3 *match*/277 = 2 *match*/278 = 1) +(let (*match*/277 = 3 *match*/278 = 2 *match*/279 = 1) (catch (catch - (catch (if (!= *match*/277 3) (exit 3) (exit 1)) with (3) - (if (!= *match*/276 1) (exit 2) (exit 1))) + (catch (if (!= *match*/278 3) (exit 3) (exit 1)) with (3) + (if (!= *match*/277 1) (exit 2) (exit 1))) with (2) 0) with (1) 1)) -(let (*match*/276 = 3 *match*/277 = 2 *match*/278 = 1) - (catch (if (!= *match*/277 3) (if (!= *match*/276 1) 0 (exit 1)) (exit 1)) +(let (*match*/277 = 3 *match*/278 = 2 *match*/279 = 1) + (catch (if (!= *match*/278 3) (if (!= *match*/277 1) 0 (exit 1)) (exit 1)) with (1) 1)) - : bool = false |}];; @@ -47,26 +47,26 @@ match (3, 2, 1) with | _ -> false ;; [%%expect{| -(let (*match*/281 = 3 *match*/282 = 2 *match*/283 = 1) +(let (*match*/282 = 3 *match*/283 = 2 *match*/284 = 1) (catch (catch (catch - (if (!= *match*/282 3) (exit 6) - (let (x/285 =a (makeblock 0 *match*/281 *match*/282 *match*/283)) - (exit 4 x/285))) + (if (!= *match*/283 3) (exit 6) + (let (x/286 =a (makeblock 0 *match*/282 *match*/283 *match*/284)) + (exit 4 x/286))) with (6) - (if (!= *match*/281 1) (exit 5) - (let (x/284 =a (makeblock 0 *match*/281 *match*/282 *match*/283)) - (exit 4 x/284)))) + (if (!= *match*/282 1) (exit 5) + (let (x/285 =a (makeblock 0 *match*/282 *match*/283 *match*/284)) + (exit 4 x/285)))) with (5) 0) - with (4 x/279) (seq (ignore x/279) 1))) -(let (*match*/281 = 3 *match*/282 = 2 *match*/283 = 1) + with (4 x/280) (seq (ignore x/280) 1))) +(let (*match*/282 = 3 *match*/283 = 2 *match*/284 = 1) (catch - (if (!= *match*/282 3) - (if (!= *match*/281 1) 0 - (exit 4 (makeblock 0 *match*/281 *match*/282 *match*/283))) - (exit 4 (makeblock 0 *match*/281 *match*/282 *match*/283))) - with (4 x/279) (seq (ignore x/279) 1))) + (if (!= *match*/283 3) + (if (!= *match*/282 1) 0 + (exit 4 (makeblock 0 *match*/282 *match*/283 *match*/284))) + (exit 4 (makeblock 0 *match*/282 *match*/283 *match*/284))) + with (4 x/280) (seq (ignore x/280) 1))) - : bool = false |}];; @@ -76,8 +76,8 @@ let _ = fun a b -> | ((true, _) as _g) | ((false, _) as _g) -> () [%%expect{| -(function a/286[int] b/287 : int 0) -(function a/286[int] b/287 : int 0) +(function a/287[int] b/288 : int 0) +(function a/287[int] b/288 : int 0) - : bool -> 'a -> unit = |}];; @@ -96,8 +96,8 @@ let _ = fun a b -> match a, b with | (false, _) as p -> p (* outside, trivial *) [%%expect {| -(function a/290[int] b/291 (let (p/292 =a (makeblock 0 a/290 b/291)) p/292)) -(function a/290[int] b/291 (makeblock 0 a/290 b/291)) +(function a/291[int] b/292 (let (p/293 =a (makeblock 0 a/291 b/292)) p/293)) +(function a/291[int] b/292 (makeblock 0 a/291 b/292)) - : bool -> 'a -> bool * 'a = |}] @@ -106,8 +106,8 @@ let _ = fun a b -> match a, b with | ((false, _) as p) -> p (* inside, trivial *) [%%expect{| -(function a/294[int] b/295 (let (p/296 =a (makeblock 0 a/294 b/295)) p/296)) -(function a/294[int] b/295 (makeblock 0 a/294 b/295)) +(function a/295[int] b/296 (let (p/297 =a (makeblock 0 a/295 b/296)) p/297)) +(function a/295[int] b/296 (makeblock 0 a/295 b/296)) - : bool -> 'a -> bool * 'a = |}];; @@ -116,11 +116,11 @@ let _ = fun a b -> match a, b with | (false as x, _) as p -> x, p (* outside, simple *) [%%expect {| -(function a/300[int] b/301 - (let (x/302 =a[int] a/300 p/303 =a (makeblock 0 a/300 b/301)) - (makeblock 0 (int,*) x/302 p/303))) -(function a/300[int] b/301 - (makeblock 0 (int,*) a/300 (makeblock 0 a/300 b/301))) +(function a/301[int] b/302 + (let (x/303 =a[int] a/301 p/304 =a (makeblock 0 a/301 b/302)) + (makeblock 0 (int,*) x/303 p/304))) +(function a/301[int] b/302 + (makeblock 0 (int,*) a/301 (makeblock 0 a/301 b/302))) - : bool -> 'a -> bool * (bool * 'a) = |}] @@ -129,11 +129,11 @@ let _ = fun a b -> match a, b with | ((false as x, _) as p) -> x, p (* inside, simple *) [%%expect {| -(function a/306[int] b/307 - (let (x/308 =a[int] a/306 p/309 =a (makeblock 0 a/306 b/307)) - (makeblock 0 (int,*) x/308 p/309))) -(function a/306[int] b/307 - (makeblock 0 (int,*) a/306 (makeblock 0 a/306 b/307))) +(function a/307[int] b/308 + (let (x/309 =a[int] a/307 p/310 =a (makeblock 0 a/307 b/308)) + (makeblock 0 (int,*) x/309 p/310))) +(function a/307[int] b/308 + (makeblock 0 (int,*) a/307 (makeblock 0 a/307 b/308))) - : bool -> 'a -> bool * (bool * 'a) = |}] @@ -142,15 +142,15 @@ let _ = fun a b -> match a, b with | (false, x) as p -> x, p (* outside, complex *) [%%expect{| -(function a/316[int] b/317[int] - (if a/316 - (let (x/318 =a[int] a/316 p/319 =a (makeblock 0 a/316 b/317)) - (makeblock 0 (int,*) x/318 p/319)) - (let (x/320 =a b/317 p/321 =a (makeblock 0 a/316 b/317)) - (makeblock 0 (int,*) x/320 p/321)))) -(function a/316[int] b/317[int] - (if a/316 (makeblock 0 (int,*) a/316 (makeblock 0 a/316 b/317)) - (makeblock 0 (int,*) b/317 (makeblock 0 a/316 b/317)))) +(function a/317[int] b/318[int] + (if a/317 + (let (x/319 =a[int] a/317 p/320 =a (makeblock 0 a/317 b/318)) + (makeblock 0 (int,*) x/319 p/320)) + (let (x/321 =a b/318 p/322 =a (makeblock 0 a/317 b/318)) + (makeblock 0 (int,*) x/321 p/322)))) +(function a/317[int] b/318[int] + (if a/317 (makeblock 0 (int,*) a/317 (makeblock 0 a/317 b/318)) + (makeblock 0 (int,*) b/318 (makeblock 0 a/317 b/318)))) - : bool -> bool -> bool * (bool * bool) = |}] @@ -160,19 +160,19 @@ let _ = fun a b -> match a, b with -> x, p (* inside, complex *) [%%expect{| -(function a/322[int] b/323[int] +(function a/323[int] b/324[int] (catch - (if a/322 - (let (x/330 =a[int] a/322 p/331 =a (makeblock 0 a/322 b/323)) - (exit 10 x/330 p/331)) - (let (x/328 =a b/323 p/329 =a (makeblock 0 a/322 b/323)) - (exit 10 x/328 p/329))) - with (10 x/324[int] p/325) (makeblock 0 (int,*) x/324 p/325))) -(function a/322[int] b/323[int] + (if a/323 + (let (x/331 =a[int] a/323 p/332 =a (makeblock 0 a/323 b/324)) + (exit 10 x/331 p/332)) + (let (x/329 =a b/324 p/330 =a (makeblock 0 a/323 b/324)) + (exit 10 x/329 p/330))) + with (10 x/325[int] p/326) (makeblock 0 (int,*) x/325 p/326))) +(function a/323[int] b/324[int] (catch - (if a/322 (exit 10 a/322 (makeblock 0 a/322 b/323)) - (exit 10 b/323 (makeblock 0 a/322 b/323))) - with (10 x/324[int] p/325) (makeblock 0 (int,*) x/324 p/325))) + (if a/323 (exit 10 a/323 (makeblock 0 a/323 b/324)) + (exit 10 b/324 (makeblock 0 a/323 b/324))) + with (10 x/325[int] p/326) (makeblock 0 (int,*) x/325 p/326))) - : bool -> bool -> bool * (bool * bool) = |}] @@ -185,15 +185,15 @@ let _ = fun a b -> match a, b with | (false as x, _) as p -> x, p (* outside, onecase *) [%%expect {| -(function a/332[int] b/333[int] - (if a/332 - (let (x/334 =a[int] a/332 _p/335 =a (makeblock 0 a/332 b/333)) - (makeblock 0 (int,*) x/334 [0: 1 1])) - (let (x/336 =a[int] a/332 p/337 =a (makeblock 0 a/332 b/333)) - (makeblock 0 (int,*) x/336 p/337)))) -(function a/332[int] b/333[int] - (if a/332 (makeblock 0 (int,*) a/332 [0: 1 1]) - (makeblock 0 (int,*) a/332 (makeblock 0 a/332 b/333)))) +(function a/333[int] b/334[int] + (if a/333 + (let (x/335 =a[int] a/333 _p/336 =a (makeblock 0 a/333 b/334)) + (makeblock 0 (int,*) x/335 [0: 1 1])) + (let (x/337 =a[int] a/333 p/338 =a (makeblock 0 a/333 b/334)) + (makeblock 0 (int,*) x/337 p/338)))) +(function a/333[int] b/334[int] + (if a/333 (makeblock 0 (int,*) a/333 [0: 1 1]) + (makeblock 0 (int,*) a/333 (makeblock 0 a/333 b/334)))) - : bool -> bool -> bool * (bool * bool) = |}] @@ -202,11 +202,11 @@ let _ = fun a b -> match a, b with | ((false as x, _) as p) -> x, p (* inside, onecase *) [%%expect{| -(function a/338[int] b/339 - (let (x/340 =a[int] a/338 p/341 =a (makeblock 0 a/338 b/339)) - (makeblock 0 (int,*) x/340 p/341))) -(function a/338[int] b/339 - (makeblock 0 (int,*) a/338 (makeblock 0 a/338 b/339))) +(function a/339[int] b/340 + (let (x/341 =a[int] a/339 p/342 =a (makeblock 0 a/339 b/340)) + (makeblock 0 (int,*) x/341 p/342))) +(function a/339[int] b/340 + (makeblock 0 (int,*) a/339 (makeblock 0 a/339 b/340))) - : bool -> 'a -> bool * (bool * 'a) = |}] @@ -223,14 +223,14 @@ let _ =fun a b -> match a, b with | (_, _) as p -> p (* outside, tuplist *) [%%expect {| -(function a/351[int] b/352 +(function a/352[int] b/353 (catch - (if a/351 (if b/352 (let (p/353 =a (field_imm 0 b/352)) p/353) (exit 12)) + (if a/352 (if b/353 (let (p/354 =a (field_imm 0 b/353)) p/354) (exit 12)) (exit 12)) - with (12) (let (p/354 =a (makeblock 0 a/351 b/352)) p/354))) -(function a/351[int] b/352 - (catch (if a/351 (if b/352 (field_imm 0 b/352) (exit 12)) (exit 12)) - with (12) (makeblock 0 a/351 b/352))) + with (12) (let (p/355 =a (makeblock 0 a/352 b/353)) p/355))) +(function a/352[int] b/353 + (catch (if a/352 (if b/353 (field_imm 0 b/353) (exit 12)) (exit 12)) + with (12) (makeblock 0 a/352 b/353))) - : bool -> bool tuplist -> bool * bool tuplist = |}] @@ -239,20 +239,20 @@ let _ = fun a b -> match a, b with | ((_, _) as p) -> p (* inside, tuplist *) [%%expect{| -(function a/355[int] b/356 +(function a/356[int] b/357 (catch (catch - (if a/355 - (if b/356 (let (p/360 =a (field_imm 0 b/356)) (exit 13 p/360)) + (if a/356 + (if b/357 (let (p/361 =a (field_imm 0 b/357)) (exit 13 p/361)) (exit 14)) (exit 14)) - with (14) (let (p/359 =a (makeblock 0 a/355 b/356)) (exit 13 p/359))) - with (13 p/357) p/357)) -(function a/355[int] b/356 + with (14) (let (p/360 =a (makeblock 0 a/356 b/357)) (exit 13 p/360))) + with (13 p/358) p/358)) +(function a/356[int] b/357 (catch (catch - (if a/355 (if b/356 (exit 13 (field_imm 0 b/356)) (exit 14)) (exit 14)) - with (14) (exit 13 (makeblock 0 a/355 b/356))) - with (13 p/357) p/357)) + (if a/356 (if b/357 (exit 13 (field_imm 0 b/357)) (exit 14)) (exit 14)) + with (14) (exit 13 (makeblock 0 a/356 b/357))) + with (13 p/358) p/358)) - : bool -> bool tuplist -> bool * bool tuplist = |}] diff --git a/testsuite/tests/c-api/alloc_async.ml b/testsuite/tests/c-api/alloc_async.ml index abbf729bd66..b3093e5ba86 100644 --- a/testsuite/tests/c-api/alloc_async.ml +++ b/testsuite/tests/c-api/alloc_async.ml @@ -1,19 +1,25 @@ (* TEST modules = "alloc_async_stubs.c"; - reason = "alloc async changes: https://github.com/ocaml/ocaml/pull/8897"; - skip; *) external test : int ref -> unit = "stub" +external print_status : string -> int -> unit = "print_status_caml" [@@noalloc] + +(* This tests checks that the finaliser does not run during various + allocations from C, but runs at the first polling location in OCaml + code after that. For native backends, something like + RET_FROM_C_CALL from runtime/amd64.S is necessary, see its + description there and the documentation of + [Caml_state->action_pending] in runtime.signals.c. *) let f () = let r = ref 42 in Gc.finalise (fun s -> r := !s) (ref 17); - Printf.printf "OCaml, before: %d\n%!" !r; + print_status "OCaml, before" !r; test r; - Printf.printf "OCaml, after: %d\n%!" !r; + print_status "OCaml, after" !r; ignore (Sys.opaque_identity (ref 100)); - Printf.printf "OCaml, after alloc: %d\n%!" !r; + print_status "OCaml, after alloc" !r; () let () = (f [@inlined never]) () diff --git a/testsuite/tests/c-api/alloc_async_stubs.c b/testsuite/tests/c-api/alloc_async_stubs.c index a90b6d7f8f4..506da37601e 100644 --- a/testsuite/tests/c-api/alloc_async_stubs.c +++ b/testsuite/tests/c-api/alloc_async_stubs.c @@ -5,6 +5,19 @@ #define CAML_INTERNALS #include "caml/gc_ctrl.h" + +void print_status(const char *str, int n) +{ + printf("%s: %d\n", str, n); + fflush(stdout); +} + +value print_status_caml(value str, value n) +{ + print_status(String_val(str), Int_val(n)); + return Val_unit; +} + const char* strs[] = { "foo", "bar", 0 }; value stub(value ref) { @@ -12,7 +25,7 @@ value stub(value ref) CAMLlocal2(x, y); char* s; intnat coll_before; - printf("C, before: %d\n", Int_val(Field(ref, 0))); + print_status("C, before", Int_val(Field(ref, 0))); /* First, do enough major allocations to do a full major collection cycle */ coll_before = caml_stat_major_collections; @@ -50,7 +63,6 @@ value stub(value ref) free(s); - printf("C, after: %d\n", Int_val(Field(ref, 0))); - fflush(stdout); + print_status("C, after", Int_val(Field(ref, 0))); CAMLreturn (Val_unit); } diff --git a/testsuite/tests/compaction/test_freelist_free.ml b/testsuite/tests/compaction/test_freelist_free.ml new file mode 100644 index 00000000000..4162452eafb --- /dev/null +++ b/testsuite/tests/compaction/test_freelist_free.ml @@ -0,0 +1,19 @@ +(* TEST +*) + +(* tests that we correctly empty the shared pool's freelist. This requires a + bunch of garbage to be generated, a major cycle and two compactions to + test. If we can do that without segfault, we're good. *) + +let () = + let arr = ref (Some (Array.init 1000000 (fun x -> (Some x)))) in + Gc.minor (); + (* Now arr should be promoted to the major heap *) + arr := None; + Gc.full_major (); + (* Now arr should be garbage and the pools in the shared heap allocated + for it should be on the free list *) + Gc.compact (); + (* Now the pools should be compacted but also the freelist should have + been reset correctly *) + Gc.compact () diff --git a/testsuite/tests/effects/unhandled_effects.ml b/testsuite/tests/effects/unhandled_effects.ml new file mode 100644 index 00000000000..bf776457c47 --- /dev/null +++ b/testsuite/tests/effects/unhandled_effects.ml @@ -0,0 +1,36 @@ +(* TEST + set OCAMLRUNPARAM = "s32"; + native; +*) + +(* This test verifies that stack frames are correct when raising unhandled + effect exceptions. This used not to be the case on some platforms, + causing assertions when the garbage collector would fire. + + By using a very small initial heap (s32), this test guarantees the GC + will get triggered. + + Refer to https://github.com/ocaml/ocaml/issues/12486 for more + information. +*) + +open Effect + +type _ t += Yield : unit t + +let rec burn l = + if List.hd l > 12 then () + else + burn (l @ l |> List.map (fun x -> x + 1)) + +let foo l = + burn l; + perform Yield + +let bar i = foo [i] + +let () = + for _ = 1 to 10_000 do + try bar 8 + with Unhandled _ -> () + done diff --git a/testsuite/tests/frame-pointers/c_call.ml b/testsuite/tests/frame-pointers/c_call.ml index 7d48b4947da..f552b0df8f4 100644 --- a/testsuite/tests/frame-pointers/c_call.ml +++ b/testsuite/tests/frame-pointers/c_call.ml @@ -5,20 +5,20 @@ native; *) -external fp_backtrace : unit -> unit = "fp_backtrace" -external fp_backtrace_no_alloc : unit -> unit = "fp_backtrace" [@@noalloc] -external fp_backtrace_many_args : int -> int -> int -> int -> int -> int -> int - -> int -> int -> int -> int -> unit = +external fp_backtrace : string -> unit = "fp_backtrace" +external fp_backtrace_no_alloc : string -> unit = "fp_backtrace" [@@noalloc] +external fp_backtrace_many_args : string -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> unit = "fp_backtrace_many_args_argv" "fp_backtrace_many_args" let[@inline never] f () = (* Check backtrace through caml_c_call_stack_args *) - fp_backtrace_many_args 1 2 3 4 5 6 7 8 9 10 11; + fp_backtrace_many_args Sys.argv.(0) 1 2 3 4 5 6 7 8 9 10 11; (* Check backtrace through caml_c_call. * Also check that caml_c_call_stack_args correctly restores rbp register *) - fp_backtrace (); + fp_backtrace Sys.argv.(0); (* Check caml_c_call correctly restores rbp register *) - fp_backtrace_no_alloc (); + fp_backtrace_no_alloc Sys.argv.(0); 42 let () = ignore (f ()) diff --git a/testsuite/tests/frame-pointers/c_call.reference b/testsuite/tests/frame-pointers/c_call.reference index 92fb40a2389..23095e7431c 100644 --- a/testsuite/tests/frame-pointers/c_call.reference +++ b/testsuite/tests/frame-pointers/c_call.reference @@ -3,19 +3,10 @@ caml_c_call_stack_args camlC_call.f camlC_call.entry caml_program -caml_start_program -caml_main/caml_startup -main caml_c_call camlC_call.f camlC_call.entry caml_program -caml_start_program -caml_main/caml_startup -main camlC_call.f camlC_call.entry caml_program -caml_start_program -caml_main/caml_startup -main diff --git a/testsuite/tests/frame-pointers/c_call_.c b/testsuite/tests/frame-pointers/c_call_.c index 634c4dd9371..a75100b2137 100644 --- a/testsuite/tests/frame-pointers/c_call_.c +++ b/testsuite/tests/frame-pointers/c_call_.c @@ -16,10 +16,10 @@ #include #include "caml/mlvalues.h" -void fp_backtrace(void); +void fp_backtrace(value); -value fp_backtrace_many_args(value a, value b, value c, value d, value e, - value f, value g, value h, value i, value j, value k) +value fp_backtrace_many_args(value argv0, value a, value b, value c, + value d, value e, value f, value g, value h, value i, value j, value k) { assert(Int_val(a) == 1); assert(Int_val(b) == 2); @@ -33,15 +33,15 @@ value fp_backtrace_many_args(value a, value b, value c, value d, value e, assert(Int_val(j) == 10); assert(Int_val(k) == 11); - fp_backtrace(); + fp_backtrace(argv0); return Val_unit; } -value fp_bactrace_many_args_argv(value *argv, int argc) +value fp_bactrace_many_args_argv(value argv0, value *argv, int argc) { assert(argc == 11); - return fp_backtrace_many_args(argv[0], argv[1], argv[2], argv[3], argv[4], - argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]); + return fp_backtrace_many_args(argv0, argv[0], argv[1], argv[2], argv[3], + argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]); } diff --git a/testsuite/tests/frame-pointers/effects.ml b/testsuite/tests/frame-pointers/effects.ml index 2aa70126065..ac304683fee 100644 --- a/testsuite/tests/frame-pointers/effects.ml +++ b/testsuite/tests/frame-pointers/effects.ml @@ -9,26 +9,26 @@ open Printf open Effect open Effect.Deep -external fp_backtrace : unit -> unit = "fp_backtrace" [@@noalloc] +external fp_backtrace : string -> unit = "fp_backtrace" [@@noalloc] type _ t += E : int -> int t let[@inline never] f () = printf "# computation f\n%!"; - fp_backtrace (); + fp_backtrace Sys.argv.(0); printf "# perform effect (E 0)\n%!"; let v = perform (E 0) in printf "# perform returns %d\n%!" v; - fp_backtrace (); + fp_backtrace Sys.argv.(0); v + 1 let h (type a) (eff : a t) : ((a, 'b) continuation -> 'b) option = let[@inline never] h_effect_e v k = printf "# caught effect (E %d). continuing...\n%!" v; - fp_backtrace (); + fp_backtrace Sys.argv.(0); let v = continue k (v + 1) in printf "# continue returns %d\n%!" v; - fp_backtrace (); + fp_backtrace Sys.argv.(0); v + 1 in match eff with @@ -39,7 +39,7 @@ let h (type a) (eff : a t) : ((a, 'b) continuation -> 'b) option = let v = let[@inline never] v_retc v = printf "# done %d\n%!" v; - fp_backtrace (); + fp_backtrace Sys.argv.(0); v + 1 in match_with f () diff --git a/testsuite/tests/frame-pointers/effects.reference b/testsuite/tests/frame-pointers/effects.reference index c8bd0a391a5..8ae3fc26dfb 100644 --- a/testsuite/tests/frame-pointers/effects.reference +++ b/testsuite/tests/frame-pointers/effects.reference @@ -3,39 +3,24 @@ camlEffects.f caml_runstack camlEffects.entry caml_program -caml_start_program -caml_main/caml_startup -main # perform effect (E 0) # caught effect (E 0). continuing... camlEffects.h_effect_e camlEffects.entry caml_program -caml_start_program -caml_main/caml_startup -main # perform returns 1 camlEffects.f caml_runstack camlEffects.h_effect_e camlEffects.entry caml_program -caml_start_program -caml_main/caml_startup -main # done 2 camlEffects.v_retc camlEffects.h_effect_e camlEffects.entry caml_program -caml_start_program -caml_main/caml_startup -main # continue returns 3 camlEffects.h_effect_e camlEffects.entry caml_program -caml_start_program -caml_main/caml_startup -main # result=4 diff --git a/testsuite/tests/frame-pointers/effects.run b/testsuite/tests/frame-pointers/effects.run deleted file mode 100644 index e96b5ea13a1..00000000000 --- a/testsuite/tests/frame-pointers/effects.run +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -${program} 2>&1 \ - | ${test_source_directory}/filter-locations.sh ${program} >${output} diff --git a/testsuite/tests/frame-pointers/exception_handler.ml b/testsuite/tests/frame-pointers/exception_handler.ml index 6bf5bf470dd..19773f78de8 100644 --- a/testsuite/tests/frame-pointers/exception_handler.ml +++ b/testsuite/tests/frame-pointers/exception_handler.ml @@ -6,7 +6,7 @@ *) (* https://github.com/ocaml/ocaml/pull/11031 *) -external fp_backtrace : unit -> unit = "fp_backtrace" [@@noalloc] +external fp_backtrace : string -> unit = "fp_backtrace" [@@noalloc] exception Exn1 exception Exn2 @@ -36,7 +36,7 @@ let[@inline never] handler () = let _ = Sys.opaque_identity x0 in let _ = Sys.opaque_identity x1 in let _ = Sys.opaque_identity x2 in - fp_backtrace () + fp_backtrace Sys.argv.(0) let[@inline never] nested i = begin diff --git a/testsuite/tests/frame-pointers/exception_handler.reference b/testsuite/tests/frame-pointers/exception_handler.reference index 513ca488b92..e012fb6d4ff 100644 --- a/testsuite/tests/frame-pointers/exception_handler.reference +++ b/testsuite/tests/frame-pointers/exception_handler.reference @@ -2,27 +2,15 @@ camlException_handler.handler camlException_handler.bare camlException_handler.entry caml_program -caml_start_program -caml_main/caml_startup -main camlException_handler.handler camlException_handler.bare camlException_handler.entry caml_program -caml_start_program -caml_main/caml_startup -main camlException_handler.handler camlException_handler.nested camlException_handler.entry caml_program -caml_start_program -caml_main/caml_startup -main camlException_handler.handler camlException_handler.nested camlException_handler.entry caml_program -caml_start_program -caml_main/caml_startup -main diff --git a/testsuite/tests/frame-pointers/exception_handler.run b/testsuite/tests/frame-pointers/exception_handler.run deleted file mode 100644 index e96b5ea13a1..00000000000 --- a/testsuite/tests/frame-pointers/exception_handler.run +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -${program} 2>&1 \ - | ${test_source_directory}/filter-locations.sh ${program} >${output} diff --git a/testsuite/tests/frame-pointers/filter-locations.sh b/testsuite/tests/frame-pointers/filter-locations.sh deleted file mode 100755 index 31c7fc3189d..00000000000 --- a/testsuite/tests/frame-pointers/filter-locations.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -set -eu - -program="${1}" -# https://stackoverflow.com/questions/29613304/is-it-possible-to-escape-regex-metacharacters-reliably-with-sed/29626460#29626460 -program_escaped=$(echo ${program} | sed 's/[^^\\]/[&]/g; s/\^/\\^/g; s/\\/\\\\/g') -regex_backtrace='^.*(\(.*\)+0x[[:xdigit:]]*)[0x[[:xdigit:]]*]$' -regex_trim_fun='^\(caml.*\)_[[:digit:]]*$' - -# - Ignore backtrace not coming from the program binary -# - Discard the number suffix from OCaml function name -# - Remove strange '[0x.....]' entries inserted by some implementation -# of backtrace_symbols_fd -# - Keep the other lines -sed -e \ - "/${regex_backtrace}/ { - /^${program_escaped}/ ! d - s/${regex_backtrace}/\1/ - s/${regex_trim_fun}/\1/ - s;caml_\(main\|startup\);caml_main/caml_startup; - }" \ - -e '/^\[0x/d' diff --git a/testsuite/tests/frame-pointers/fp_backtrace.c b/testsuite/tests/frame-pointers/fp_backtrace.c index a521218a387..693e3ea7d5b 100644 --- a/testsuite/tests/frame-pointers/fp_backtrace.c +++ b/testsuite/tests/frame-pointers/fp_backtrace.c @@ -1,10 +1,17 @@ #include -#include -#include -#include +#include +#include #include +#include +#include -#define ARRSIZE(a) (sizeof(a) / sizeof(*(a))) +#include "caml/mlvalues.h" + +#define ARR_SIZE(a) (sizeof(a) / sizeof(*(a))) + +#define RE_FUNC_NAME "^.*\\((.+)\\+0x[[:xdigit:]]+\\) \\[0x[[:xdigit:]]+\\]$" +#define RE_TRIM_FUNC "(caml.*)_[[:digit:]]+" +#define CAML_ENTRY "caml_program" typedef struct frame_info { @@ -12,99 +19,137 @@ typedef struct frame_info void* retaddr; /* rip */ } frame_info; -jmp_buf resume_buf; +/* + * A backtrace symbol looks like: + * ./path/to/binary(camlModule_fn_123+0xAABBCC) [0xAABBCCDDEE] + */ +static const char* backtrace_symbol(const struct frame_info* fi) +{ + char** symbols = backtrace_symbols(&fi->retaddr, 1); + if (!symbols) { + perror("backtrace_symbols"); + return NULL; + } + + const char* symbol = strdup(symbols[0]); + free(symbols); + return symbol; +} -static void signal_handler(int signum) +static bool is_from_executable(const char* symbol, const char* execname) { - /* Should be safe to be called from a signal handler. - * See 21.2.1 "Performing a nonlocal goto from a signal handler" from - * The Linux Programming Interface, Michael Kerrisk */ - siglongjmp(resume_buf, 1); + return strncmp(symbol, execname, strlen(execname)) == 0; } -static int install_signal_handlers(const int signals[], struct sigaction - handlers[], int count) +static regmatch_t func_name_from_symbol(const char* symbol) { - for (int i = 0; i < count; i++) { - struct sigaction action = { 0 }; - action.sa_handler = signal_handler; - sigemptyset(&action.sa_mask); - action.sa_flags = 0; - - if (sigaction(signals[i], &action, &handlers[i]) != 0) { - perror("sigaction"); - return -1; - } + regex_t regex; + regmatch_t match[2] = { {-1, -1}, {-1, -1}}; + char errbuf[128]; + int err; + + err = regcomp(®ex, RE_FUNC_NAME, REG_EXTENDED); + if (err) { + regerror(err, ®ex, errbuf, ARR_SIZE(errbuf)); + fprintf(stderr, "regcomp: %s\n", errbuf); + return match[0]; } - return 0; + + err = regexec(®ex, symbol, ARR_SIZE(match), match, 0); + if (err == REG_NOMATCH) + return match[0]; + + return match[1]; } -static int restore_signal_handlers(const int signals[], struct sigaction - handlers[], int count) +static bool is_caml_entry(const char* symbol, const regmatch_t* funcname) { - for (int i = 0; i < count; i++) { - if (sigaction(signals[i], &handlers[i], NULL) != 0) { - perror("sigaction"); - return -1; - } - } - return 0; + size_t len = funcname->rm_eo - funcname->rm_so; + return strncmp(symbol + funcname->rm_so, CAML_ENTRY, len) == 0; } -static int safe_read(const struct frame_info* fi, struct frame_info** prev, - void** retaddr) +static regmatch_t trim_func_name(const char* symbol, const regmatch_t* funcname) { - /* Signals to ignore while attempting to read frame_info members */ - const int signals[] = { SIGSEGV, SIGBUS }; - /* Store original signal handers */ - struct sigaction handlers[ARRSIZE(signals)] = { 0 }; - int ret = 0; - - if (install_signal_handlers(signals, handlers, ARRSIZE(signals)) != 0) - return -1; - - if (!sigsetjmp(resume_buf, 1)) { - *prev = fi->prev; - *retaddr = fi->retaddr; - } else { - ret = -1; + regex_t regex; + regmatch_t match[2] = { {-1, -1}, {-1, -1}}; + char errbuf[128]; + int err; + + err = regcomp(®ex, RE_TRIM_FUNC, REG_EXTENDED); + if (err) { + regerror(err, ®ex, errbuf, ARR_SIZE(errbuf)); + fprintf(stderr, "regcomp: %s\n", errbuf); + return match[0]; } - if (restore_signal_handlers(signals, handlers, ARRSIZE(signals)) != 0) - return -1; + match[0] = *funcname; + err = regexec(®ex, symbol, ARR_SIZE(match), match, REG_STARTEND); + if (err == REG_NOMATCH) { + /* match[0] has already been overwritten to hold the function full name for + regexec */ + return match[1]; + } - return ret; + return match[1]; } -static void print_location(void* addr) +static void print_symbol(const char* symbol, const regmatch_t* match) { - if (!addr) - return; + regoff_t off = match->rm_so; + regoff_t len = match->rm_eo - match->rm_so; - /* This requires the binary to be linked with '-rdynamic' */ - backtrace_symbols_fd(&addr, 1, STDOUT_FILENO); + fprintf(stdout, "%.*s\n", len, symbol + off); + fflush(stdout); } -void fp_backtrace(void) +void fp_backtrace(value argv0) { - struct frame_info *fi; - struct frame_info* next; - void* retaddr; + const char* execname = String_val(argv0); + struct frame_info* next = NULL; + const char* symbol = NULL; - fi = __builtin_frame_address(0); - retaddr = __builtin_extract_return_addr(__builtin_return_address(0)); - - for (; fi; fi = next) { - if (safe_read(fi, &next, &retaddr) != 0) - return; - - print_location(retaddr); + for (struct frame_info* fi = __builtin_frame_address(0); fi; fi = next) { + next = fi->prev; /* Detect the simplest kind of infinite loop */ if (fi == next) { - printf("fp_backtrace: loop detected\n"); - return; + fprintf(stderr, "fp_backtrace: loop detected\n"); + break; } + + symbol = backtrace_symbol(fi); + if (!symbol) + continue; + + /* Skip entries not from the test */ + if (!is_from_executable(symbol, execname)) + goto skip; + + /* Exctract the full function name */ + regmatch_t funcname = func_name_from_symbol(symbol); + if (funcname.rm_so == -1) + goto skip; + + /* Trim numeric suffix from caml functions */ + regmatch_t functrimmed = trim_func_name(symbol, &funcname); + + /* Use the trimmed caml name if available, otherwise use the full function + name */ + const regmatch_t* match = (functrimmed.rm_so != -1) ? + &functrimmed : &funcname; + + print_symbol(symbol, match); + + /* Stop the backtrace at caml_program */ + if (is_caml_entry(symbol, &funcname)) + break; + +skip: + free((void*)symbol); + symbol = NULL; } + + if (symbol) + free((void*)symbol); } diff --git a/testsuite/tests/frame-pointers/reperform.ml b/testsuite/tests/frame-pointers/reperform.ml index ec5393907c0..7a3b09162b5 100644 --- a/testsuite/tests/frame-pointers/reperform.ml +++ b/testsuite/tests/frame-pointers/reperform.ml @@ -8,7 +8,7 @@ open Effect open Effect.Deep -external fp_backtrace : unit -> unit = "fp_backtrace" [@@noalloc] +external fp_backtrace : string -> unit = "fp_backtrace" [@@noalloc] type _ Effect.t += E : unit t | F : unit t @@ -19,7 +19,7 @@ let rec foo n = if n = 5 then begin perform E; print_endline "# resumed..."; - fp_backtrace () + fp_backtrace Sys.argv.(0) end; foo (n + 1) + n end diff --git a/testsuite/tests/frame-pointers/reperform.reference b/testsuite/tests/frame-pointers/reperform.reference index 9ac6681d4b1..e215f771692 100644 --- a/testsuite/tests/frame-pointers/reperform.reference +++ b/testsuite/tests/frame-pointers/reperform.reference @@ -15,6 +15,3 @@ camlReperform.bar caml_runstack camlReperform.entry caml_program -caml_start_program -caml_main/caml_startup -main diff --git a/testsuite/tests/frame-pointers/reperform.run b/testsuite/tests/frame-pointers/reperform.run deleted file mode 100644 index e96b5ea13a1..00000000000 --- a/testsuite/tests/frame-pointers/reperform.run +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -${program} 2>&1 \ - | ${test_source_directory}/filter-locations.sh ${program} >${output} diff --git a/testsuite/tests/frame-pointers/stack_realloc.ml b/testsuite/tests/frame-pointers/stack_realloc.ml index fc4e9e9d3b2..cacc43c2165 100644 --- a/testsuite/tests/frame-pointers/stack_realloc.ml +++ b/testsuite/tests/frame-pointers/stack_realloc.ml @@ -10,7 +10,7 @@ open Effect.Deep type _ t += E : int -> int t -external fp_backtrace : unit -> unit = "fp_backtrace" [@@noalloc] +external fp_backtrace : string -> unit = "fp_backtrace" [@@noalloc] external c_fun : unit -> int = "c_fun" let[@inline never][@local never] f x = x @@ -39,7 +39,7 @@ let[@inline never] consume_stack () = let[@inline never] callback () = consume_stack (); - fp_backtrace (); + fp_backtrace Sys.argv.(0); 0 let _ = Callback.register "callback" callback diff --git a/testsuite/tests/frame-pointers/stack_realloc.reference b/testsuite/tests/frame-pointers/stack_realloc.reference index 016a03550a3..e61d4104e0d 100644 --- a/testsuite/tests/frame-pointers/stack_realloc.reference +++ b/testsuite/tests/frame-pointers/stack_realloc.reference @@ -7,6 +7,3 @@ camlStack_realloc.f_comp caml_runstack camlStack_realloc.entry caml_program -caml_start_program -caml_main/caml_startup -main diff --git a/testsuite/tests/frame-pointers/stack_realloc.run b/testsuite/tests/frame-pointers/stack_realloc.run deleted file mode 100644 index e96b5ea13a1..00000000000 --- a/testsuite/tests/frame-pointers/stack_realloc.run +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -${program} 2>&1 \ - | ${test_source_directory}/filter-locations.sh ${program} >${output} diff --git a/testsuite/tests/frame-pointers/stack_realloc2.ml b/testsuite/tests/frame-pointers/stack_realloc2.ml index a4aea249ea1..b2a602fa4a5 100644 --- a/testsuite/tests/frame-pointers/stack_realloc2.ml +++ b/testsuite/tests/frame-pointers/stack_realloc2.ml @@ -10,7 +10,7 @@ open Effect.Deep type _ t += E : int -> int t -external fp_backtrace : unit -> unit = "fp_backtrace" [@@noalloc] +external fp_backtrace : string -> unit = "fp_backtrace" [@@noalloc] external c_fun : unit -> int = "c_fun" let[@inline never][@local never] f x = x @@ -38,7 +38,7 @@ let[@inline never] consume_stack () = ignore (gobbler count) let[@inline never] callback () = - fp_backtrace (); + fp_backtrace Sys.argv.(0); 0 let _ = Callback.register "callback" callback diff --git a/testsuite/tests/frame-pointers/stack_realloc2.reference b/testsuite/tests/frame-pointers/stack_realloc2.reference index ae492abd882..0051f3bad06 100644 --- a/testsuite/tests/frame-pointers/stack_realloc2.reference +++ b/testsuite/tests/frame-pointers/stack_realloc2.reference @@ -7,6 +7,3 @@ camlStack_realloc2.f_comp caml_runstack camlStack_realloc2.entry caml_program -caml_start_program -caml_main/caml_startup -main diff --git a/testsuite/tests/frame-pointers/stack_realloc2.run b/testsuite/tests/frame-pointers/stack_realloc2.run deleted file mode 100644 index e96b5ea13a1..00000000000 --- a/testsuite/tests/frame-pointers/stack_realloc2.run +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -${program} 2>&1 \ - | ${test_source_directory}/filter-locations.sh ${program} >${output} diff --git a/testsuite/tests/hidden_includes/cant_reference_hidden.ocamlc.reference b/testsuite/tests/hidden_includes/cant_reference_hidden.ocamlc.reference new file mode 100644 index 00000000000..caae6f73442 --- /dev/null +++ b/testsuite/tests/hidden_includes/cant_reference_hidden.ocamlc.reference @@ -0,0 +1,4 @@ +File "libc/c3.ml", line 1, characters 8-11: +1 | let x = A.x + 1 + ^^^ +Error: Unbound module "A" diff --git a/testsuite/tests/hidden_includes/hidden_stays_hidden.ocamlc.reference b/testsuite/tests/hidden_includes/hidden_stays_hidden.ocamlc.reference new file mode 100644 index 00000000000..8ba62b877af --- /dev/null +++ b/testsuite/tests/hidden_includes/hidden_stays_hidden.ocamlc.reference @@ -0,0 +1,4 @@ +File "libc/c4.ml", line 2, characters 8-11: +2 | let y = A.x + 1 + ^^^ +Error: Unbound module "A" diff --git a/testsuite/tests/hidden_includes/liba/a.ml b/testsuite/tests/hidden_includes/liba/a.ml new file mode 100644 index 00000000000..22b40309256 --- /dev/null +++ b/testsuite/tests/hidden_includes/liba/a.ml @@ -0,0 +1,5 @@ +type t = int + +let x = 1 + +type s = Baz diff --git a/testsuite/tests/hidden_includes/liba_alt/a.ml b/testsuite/tests/hidden_includes/liba_alt/a.ml new file mode 100644 index 00000000000..e907a667ba2 --- /dev/null +++ b/testsuite/tests/hidden_includes/liba_alt/a.ml @@ -0,0 +1,3 @@ +type t = string + +let x = "hi" diff --git a/testsuite/tests/hidden_includes/libb/b.ml b/testsuite/tests/hidden_includes/libb/b.ml new file mode 100644 index 00000000000..7e41643e960 --- /dev/null +++ b/testsuite/tests/hidden_includes/libb/b.ml @@ -0,0 +1,7 @@ +type t = A.t + +let x : A.t = A.x + +let f : A.t -> A.t = fun x -> x + +let g : A.s -> unit = fun _ -> () diff --git a/testsuite/tests/hidden_includes/libc/c1.ml b/testsuite/tests/hidden_includes/libc/c1.ml new file mode 100644 index 00000000000..e0e5a1fd8d9 --- /dev/null +++ b/testsuite/tests/hidden_includes/libc/c1.ml @@ -0,0 +1,3 @@ +let x = B.x + 1 + +let () = Printf.printf "%d\n" x diff --git a/testsuite/tests/hidden_includes/libc/c2.ml b/testsuite/tests/hidden_includes/libc/c2.ml new file mode 100644 index 00000000000..dee5a2e74b9 --- /dev/null +++ b/testsuite/tests/hidden_includes/libc/c2.ml @@ -0,0 +1 @@ +let x = B.f B.x diff --git a/testsuite/tests/hidden_includes/libc/c3.ml b/testsuite/tests/hidden_includes/libc/c3.ml new file mode 100644 index 00000000000..88c0aa8d0d6 --- /dev/null +++ b/testsuite/tests/hidden_includes/libc/c3.ml @@ -0,0 +1 @@ +let x = A.x + 1 diff --git a/testsuite/tests/hidden_includes/libc/c4.ml b/testsuite/tests/hidden_includes/libc/c4.ml new file mode 100644 index 00000000000..7c14a26c835 --- /dev/null +++ b/testsuite/tests/hidden_includes/libc/c4.ml @@ -0,0 +1,6 @@ +let x = B.x + 1 +let y = A.x + 1 + +(* Typing x requires loading A's cmi. When it is made available with -H, y + should fail to typecheck because direct references to A are not allowed, even + though it has been loaded. *) diff --git a/testsuite/tests/hidden_includes/libc/c5.ml b/testsuite/tests/hidden_includes/libc/c5.ml new file mode 100644 index 00000000000..bd0715ec1e8 --- /dev/null +++ b/testsuite/tests/hidden_includes/libc/c5.ml @@ -0,0 +1,7 @@ +let _ = B.g Baz + +(* Type-directed disambiguation: Baz is defined in A, and even when a.cmi is + provided with -H this still typechecks. It's not obvious that this is + necessary (rejecting this program also seems fine, in that case), but this + test is here to record the current behavior so any change will be + intentional. *) diff --git a/testsuite/tests/hidden_includes/not_included.ocamlc.reference b/testsuite/tests/hidden_includes/not_included.ocamlc.reference new file mode 100644 index 00000000000..a3c0d1055eb --- /dev/null +++ b/testsuite/tests/hidden_includes/not_included.ocamlc.reference @@ -0,0 +1,7 @@ +File "libc/c1.ml", line 1, characters 8-11: +1 | let x = B.x + 1 + ^^^ +Error: This expression has type "A.t" but an expression was expected of type + "int" + Type "A.t" is abstract because no corresponding cmi file was found + in path. diff --git a/testsuite/tests/hidden_includes/test.ml b/testsuite/tests/hidden_includes/test.ml new file mode 100644 index 00000000000..4ea735dfba6 --- /dev/null +++ b/testsuite/tests/hidden_includes/test.ml @@ -0,0 +1,159 @@ +(* TEST +(* This tests the -H flag. + + The basic structure is that libc depends on libb, which depends on liba. We + want to test a few things: + + - Compiling libc with -I liba allows the compiler to see the type definitions + in liba and allows c.ml to reference it directly. + + - Compiling libc with -H liba allows the compiler to see the type definitions + in liba, but doesn't allow c.ml to reference it directly. + + - If -H and -I are are passed for two different versions of liba, the -I one + takes priority. + + - If -H is passed twice with two different versions of liba, the first takes + priority. + + The liba_alt directory has an alternate versions of liba used for testing the + precedence order of the includes. +*) + +subdirectories = "liba liba_alt libb libc"; +setup-ocamlc.byte-build-env; + +flags = "-I liba -nocwd"; +module = "liba/a.ml"; +ocamlc.byte; + +flags = "-I liba_alt -nocwd"; +module = "liba_alt/a.ml"; +ocamlc.byte; + +flags = "-I liba -I libb -nocwd"; +module = "libb/b.ml"; +ocamlc.byte; +{ + (* Test hiding A completely *) + flags = "-I libb -nocwd"; + module = "libc/c2.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} +{ + (* Test hiding A completely, but using it *) + flags = "-I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = "${test_source_directory}/not_included.ocamlc.reference"; + check-ocamlc.byte-output; +} +{ + (* Test transitive use of A's cmi with -I. *) + flags = "-I liba -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} +{ + (* Test transitive use of A's cmi with -H. *) + flags = "-H liba -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} +{ + (* Test direct use of A cmi with -H. *) + flags = "-H liba -I libb -nocwd"; + module = "libc/c3.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = + "${test_source_directory}/cant_reference_hidden.ocamlc.reference"; + check-ocamlc.byte-output; +} + +(* The next four tests check that -I takes priority over -H regardless of the + order on the command line. +*) +{ + flags = "-H liba_alt -I liba -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} +{ + flags = "-I liba -H liba_alt -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} +{ + not-windows; + flags = "-H liba -I liba_alt -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = + "${test_source_directory}/wrong_include_order.ocamlc.reference"; + check-ocamlc.byte-output; +} +{ + not-windows; + flags = "-I liba_alt -H liba -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = + "${test_source_directory}/wrong_include_order.ocamlc.reference"; + check-ocamlc.byte-output; +} + +(* The next two tests show that earlier -Hs take priority over later -Hs *) +{ + not-windows; + flags = "-H liba_alt -H liba -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = + "${test_source_directory}/wrong_include_order.ocamlc.reference"; + check-ocamlc.byte-output; +} +{ + flags = "-H liba -H liba_alt -I libb -nocwd"; + module = "libc/c1.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} + +(* Test that a hidden `A` doesn't become visible as a result of the typechecker + using it. *) +{ + flags = "-H liba -I libb -nocwd"; + module = "libc/c4.ml"; + setup-ocamlc.byte-build-env; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + compiler_reference = + "${test_source_directory}/hidden_stays_hidden.ocamlc.reference"; + check-ocamlc.byte-output; +} + +(* Test that type-directed constructor disambiguation works through -H (at + least, for now). *) +{ + flags = "-H liba -I libb -nocwd"; + module = "libc/c5.ml"; + setup-ocamlc.byte-build-env; + ocamlc.byte; +} + +*) diff --git a/testsuite/tests/hidden_includes/wrong_include_order.ocamlc.reference b/testsuite/tests/hidden_includes/wrong_include_order.ocamlc.reference new file mode 100644 index 00000000000..6863dffdf5e --- /dev/null +++ b/testsuite/tests/hidden_includes/wrong_include_order.ocamlc.reference @@ -0,0 +1,3 @@ +File "libc/c1.ml", line 1: +Error: The files "libb/b.cmi" and "liba_alt/a.cmi" make inconsistent assumptions + over interface "A" diff --git a/testsuite/tests/letrec-check/partial_application.ml b/testsuite/tests/letrec-check/partial_application.ml new file mode 100644 index 00000000000..b3768cd2195 --- /dev/null +++ b/testsuite/tests/letrec-check/partial_application.ml @@ -0,0 +1,54 @@ +(* TEST + expect; +*) + +let f ~x:_ ~y:_ ~z:_ = ();; +[%%expect{| +val f : x:'a -> y:'b -> z:'c -> unit = +|}];; + +(* Passing self immediately: forbidden *) +let rec x = f ~x;; +[%%expect{| +Line 1, characters 12-16: +1 | let rec x = f ~x;; + ^^^^ +Error: This kind of expression is not allowed as right-hand side of "let rec" +|}];; + +(* Passing self after an omitted argument: allowed *) +let rec y = f ~y;; +[%%expect{| +val y : x:'a -> z:'b -> unit = +|}];; + +(* Passing self immediately: forbidden even if other arguments are omitted *) +let rec x = f ~x ~z:0;; +[%%expect{| +Line 1, characters 12-21: +1 | let rec x = f ~x ~z:0;; + ^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of "let rec" +|}];; + +(* Calling self: allowed if the first argument is omitted *) +let g ~omitted ~given = fun ~given:_ -> given ~omitted +let rec f : omitted:_ -> given:_ -> _ = g ~given:(f ~given:0);; +[%%expect{| +val g : omitted:'a -> given:(omitted:'a -> 'b) -> given:'c -> 'b = +val f : omitted:'a -> given:int -> 'b = +|}];; + +(* Calling self: forbidden if the first argument is passed *) +let g ~omitted_g ~given = fun ~omitted_f:_ ~given:_ -> given ~omitted_f:() +let rec f : omitted_g:_ -> omitted_f:_ -> given:_ -> _ = + g ~given:(f ~omitted_g:() ~given:0);; +[%%expect{| +val g : + omitted_g:'a -> + given:(omitted_f:unit -> 'b) -> omitted_f:'c -> given:'d -> 'b = +Line 3, characters 2-37: +3 | g ~given:(f ~omitted_g:() ~given:0);; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: This kind of expression is not allowed as right-hand side of "let rec" +|}];; diff --git a/testsuite/tests/lexing/newlines.ml b/testsuite/tests/lexing/newlines.ml new file mode 100644 index 00000000000..c940b04faa5 --- /dev/null +++ b/testsuite/tests/lexing/newlines.ml @@ -0,0 +1,23 @@ +(* TEST *) + +let check ~kind ~input ~result = + if input <> result then + Printf.printf "FAIL: %s %S should normalize to %S +" + kind input result +;; + +check ~kind:"string literal" ~input:" +" ~result:"\n"; +check ~kind:"quoted string literal" ~input:{| +|} ~result:"\n"; + +check ~kind:"string literal" ~input:" +" ~result:"\n"; +check ~kind:"quoted string literal" ~input:{| +|} ~result:"\n"; + +check ~kind:"string literal" ~input:" +" ~result:"\r\n"; +check ~kind:"quoted string literal" ~input:{| +|} ~result:"\r\n"; diff --git a/testsuite/tests/lib-array/test_array.ml b/testsuite/tests/lib-array/test_array.ml index c5b6143db69..09817baa6f6 100644 --- a/testsuite/tests/lib-array/test_array.ml +++ b/testsuite/tests/lib-array/test_array.ml @@ -177,3 +177,21 @@ let a : int array = [%%expect{| val a : int array = [|2; 4; 6; 8|] |}] + +let a = Array.make_matrix 2 3 "placeholder";; +a.(0).(0) <- "hello";; +a (* other rows are unchanged *);; +[%%expect{| +val a : string array array = + [|[|"placeholder"; "placeholder"; "placeholder"|]; + [|"placeholder"; "placeholder"; "placeholder"|]|] +- : unit = () +- : string array array = +[|[|"hello"; "placeholder"; "placeholder"|]; + [|"placeholder"; "placeholder"; "placeholder"|]|] +|}] + +let a = Array.init_matrix 2 3 (fun i j -> 10 * i + j);; +[%%expect{| +val a : int array array = [|[|0; 1; 2|]; [|10; 11; 12|]|] +|}] diff --git a/testsuite/tests/lib-dynarray/heap_sort.ml b/testsuite/tests/lib-dynarray/heap_sort.ml new file mode 100644 index 00000000000..8fb1939b406 --- /dev/null +++ b/testsuite/tests/lib-dynarray/heap_sort.ml @@ -0,0 +1,98 @@ +(* TEST *) + +(* We present our priority queues as a functor + parametrized on the comparison function. *) +module Heap (Elem : Map.OrderedType) : sig + type t + val create : unit -> t + val add : t -> Elem.t -> unit + val pop_min : t -> Elem.t option +end = struct + + (* Our priority queues are implemented using the standard "min heap" + data structure, a dynamic array representing a binary tree. *) + type t = Elem.t Dynarray.t + let create = Dynarray.create + + (* The node of index [i] has as children the nodes of index [2 * i + 1] + and [2 * i + 2] -- if they are valid indices in the dynarray. *) + let left_child i = 2 * i + 1 + let right_child i = 2 * i + 2 + let parent_node i = (i - 1) / 2 + + (* We use indexing operators for convenient notations. *) + let ( .!() ) = Dynarray.get + let ( .!()<- ) = Dynarray.set + + (* Auxiliary functions to compare and swap two elements + in the dynamic array. *) + let order h i j = + Elem.compare h.!(i) h.!(j) + + let swap h i j = + let v = h.!(i) in + h.!(i) <- h.!(j); + h.!(j) <- v + + (* We say that a heap respects the "heap ordering" if the value of + each node is smaller than the value of its children. The + algorithm manipulates arrays that respect the heap algorithm, + except for one node whose value may be too small or too large. + + The auxiliary functions [heap_up] and [heap_down] take + such a misplaced value, and move it "up" (respectively: "down") + the tree by permuting it with its parent value (respectively: + a children's value) until the heap ordering is restored. *) + + let rec heap_up h i = + if i = 0 then () else + let parent = parent_node i in + if order h i parent < 0 then + (swap h i parent; heap_up h parent) + + and heap_down h ~len i = + let left, right = left_child i, right_child i in + if left >= len then () (* no child, stop *) else + let smallest = + if right >= len then left (* no right child *) else + if order h left right < 0 then left else right + in + if order h i smallest > 0 then + (swap h i smallest; heap_down h ~len smallest) + + let add h s = + let i = Dynarray.length h in + Dynarray.add_last h s; + heap_up h i + + let pop_min h = + if Dynarray.is_empty h then None + else begin + (* Standard trick: swap the 'best' value at index 0 + with the last value of the array. *) + let last = Dynarray.length h - 1 in + swap h 0 last; + (* At this point [pop_last] returns the 'best' value, + and leaves a heap with one misplaced element at position 0. *) + let best = Dynarray.pop_last h in + (* Restore the heap ordering -- does nothing if the heap is empty. *) + heap_down h ~len:last 0; + Some best + end +end + +let heap_sort (type a) cmp li = + let module Heap = Heap(struct type t = a let compare = cmp end) in + let heap = Heap.create () in + List.iter (Heap.add heap) li; + List.map (fun _ -> Heap.pop_min heap |> Option.get) li + +let () = + let rev cmp x y = cmp y x in + assert (heap_sort compare [3; 1; 2; 7; 2; 5] = [1; 2; 2; 3; 5; 7]); + assert (heap_sort (rev compare) [3; 1; 2; 7; 2; 5] = [7; 5; 3; 2; 2; 1]); + for i = 1 to 1_000 do + let li = List.init 10 (fun _ -> Random.int 10) in + assert (heap_sort compare li = List.sort compare li); + assert (heap_sort (rev compare) li = List.sort (rev compare) li); + done diff --git a/testsuite/tests/lib-dynarray/test.ml b/testsuite/tests/lib-dynarray/test.ml new file mode 100644 index 00000000000..4e1205b99fb --- /dev/null +++ b/testsuite/tests/lib-dynarray/test.ml @@ -0,0 +1,377 @@ +(* TEST *) + +let list_range start len : _ list = + Seq.ints start |> Seq.take len |> List.of_seq + +module A = Dynarray + +(** {1:dynarrays Dynamic arrays} *) + +(** create, add_last *) + +let () = + let a = A.create() in + A.add_last a 1; + A.add_last a 2; + assert (A.length a = 2); + assert (A.to_list a = [1;2]);; + + +(** make *) + +let () = + let a = A.make 3 5 in + A.add_last a 6; + assert (A.to_list a = [5; 5; 5; 6]);; + + +(** init *) + +let () = + let test_init n f = + assert (A.init n f |> A.to_array = Array.init n f) in + for i = 0 to 1024 do + test_init i Fun.id + done;; + + +(** is_empty *) + +let () = + let a = A.create () in + assert (A.is_empty a); + A.ensure_capacity a 256; + assert (A.is_empty a);; + +(** length is tested below *) + +(** get_last, find_last *) +let () = + let a = A.of_list [1; 2] in + assert (A.get_last a = 2); + assert (A.find_last a = Some 2); + + A.remove_last a; + assert (A.to_list a = [1]); + assert (A.get_last a = 1); + assert (A.find_last a = Some 1); + + A.remove_last a; + assert (A.to_list a = []); + assert (match A.get_last a with exception _ -> true | _ -> false); + assert (A.find_last a = None) + +(** copy, add_last *) + +let () = + assert (A.of_list [1;2;3] |> A.copy |> A.to_list = [1;2;3]);; + +let () = + let a = A.create() in + for i=0 to 20 do A.add_last a i; done; + assert (A.to_list (A.copy a) = list_range 0 21);; + +let () = + assert (A.create() |> A.copy |> A.is_empty);; + +let () = + let a = A.of_list [1; 2; 3] in + let b = A.copy a in + for i = 4 to 1024 do + A.add_last b i + done; + assert (A.fold_left (+) 0 a = (1 + 2 + 3)); + assert (A.fold_left (+) 0 b = (1024 * 1025) / 2);; + +let () = + let a = A.of_list [1; 2; 3] in + assert (A.fold_right List.cons a [] = [1; 2; 3]);; + +(** {1:adding Adding elements} *) + +(** add_last was tested above *) + +(** append *) + +let () = + let a1 = A.init 5 (fun i->i) + and a2 = A.init 5 (fun i->i+5) in + A.append a1 a2; + assert (A.to_list a1 = list_range 0 10);; + +let () = + let empty = A.create () + and a2 = A.init 5 (fun i->i) in + A.append empty a2; + assert (A.to_list empty = list_range 0 5);; + +let () = + let a1 = A.init 5 (fun i->i) and empty = A.create () in + A.append a1 empty; + assert (A.to_list a1 = list_range 0 5);; + +let () = + let a = A.init 3 (fun i->i) in + A.append a (A.copy a); + (** Note: [A.append a a] is unspecified, and in particular it + loops infinitely with the following natural implementation: +{[ + let append a b = + append_iter a iter b + + let iter f a = + let i = ref 0 in + while !i < length a do + f (get a !i); + incr i + done +]} + *) + assert (A.to_list a = [0; 1; 2; 0; 1; 2]);; + +let() = + let empty = A.create () in + A.append empty empty; + assert (A.to_list empty = []);; + + +(** dynarrays with floats *) + +let () = + let a = A.create() in + A.add_last a 0.; A.add_last a 1.; + assert (0. = A.get a 0); + assert (1. = A.get a 1); + assert (1. = A.fold_left (+.) 0. a); + A.clear a; + A.add_last a 0.; A.add_last a 1.; A.add_last a 7.; A.add_last a 10.; A.add_last a 12.; + A.truncate a 2; + assert (1. = A.fold_left (+.) 0. a); + A.clear a; + assert (0 = A.length a); + A.add_last a 0.; A.add_last a 1.; A.add_last a 7.; A.add_last a 10.; A.add_last a 12.; + A.set a 2 8.; + assert (0. +. 1. +. 8. +. 10. +. 12. = A.fold_left (+.) 0. a);; + + +(** {1:removing Removing elements} *) + + +(** pop_last_opt, length *) + +let () = + let seq = Seq.(ints 0 |> take 10_000) in + let a = A.of_seq seq in + assert (Some 9999 = A.pop_last_opt a); + assert (Some 9998 = A.pop_last_opt a); + assert (Some 9997 = A.pop_last_opt a); + assert (9997 = A.length a); + ();; + +let () = + let a = A.of_list [1;2] in + assert (Some 2 = A.pop_last_opt a); + assert (Some 1 = A.pop_last_opt a); + assert (None = A.pop_last_opt a); + assert (None = A.pop_last_opt a); + ();; + + +(** truncate *) + +let () = + let a = A.create() in + let max_length = 20_000 in + for i = 0 to max_length - 1 do A.add_last a i; done; + List.iter + (fun size -> + A.truncate a size; + let result_size = min max_length size in + assert (A.to_list a = list_range 0 result_size)) + [ 30_000; 20_000; 19_999; 2000; 100; 50; 4; 4; 3; 2; 1; 0];; + + + +(** {1:iteration Iteration} *) + +(** map *) + +let () = + let a = A.of_list [1;2;3] in + assert (A.to_list @@ A.map string_of_int a = ["1"; "2"; "3"]);; + + +(** mapi *) + +let () = + let a = A.of_list [1;2;3] in + let a = A.mapi (fun i e -> Printf.sprintf "%i %i" i e) a in + assert (A.to_list a = ["0 1"; "1 2"; "2 3"]);; + + +(** Iterator invalidation *) + +let raises_invalid_argument f = + match f () with + | exception Invalid_argument _ -> true + | exception _ | _ -> false + +let () = + let a = A.of_list [1; 2; 3] in + assert (raises_invalid_argument (fun () -> + A.append a a + )) + +let () = + let a = A.of_list [1; 2; 3] in + assert (raises_invalid_argument (fun () -> + a |> A.iter (fun i -> + A.add_last a (10 + i) + ) + )) + +let () = + let a = A.of_list [1; 2; 3] in + assert (raises_invalid_argument (fun () -> + a |> A.iter (fun i -> + if i >= 2 then A.remove_last a + ) + )) + +let does_not_raise_invalid_argument f = + not (raises_invalid_argument f) + +(* The spec says that this is a programming error, but currently we accept + the following without an error. *) +let () = + let a = A.of_list [1; 2; 3] in + A.ensure_capacity a 10; + assert (does_not_raise_invalid_argument (fun () -> + a |> A.iter (fun i -> + A.add_last a i; + A.remove_last a + ) + )) + +(* Even with a capacity increase in the middle, + we still accept this although the spec would let us reject. *) +let () = + let a = A.of_list [1; 2; 3] in + A.fit_capacity a; + assert (does_not_raise_invalid_argument (fun () -> + a |> A.iter (fun i -> + A.add_last a i; + A.remove_last a + ) + )) + + +(** {1:conversions Conversions to other data structures} *) + +(** {of,to}_{list,array,seq{,_rev}{,_rentrant}} *) + +let () = + for i = 0 to 1024 do + let ints = List.init i Fun.id in + assert ((ints |> A.of_list |> A.to_list) = ints); + let arr = Array.of_list ints in + assert ((arr |> A.of_array |> A.to_array) = arr); + let seq = Array.to_seq arr in + [A.to_seq; A.to_seq_reentrant] |> List.iter (fun dynarray_to_seq -> + assert ((seq |> A.of_seq |> dynarray_to_seq) |> Array.of_seq = arr) + ); + [A.to_seq_rev; A.to_seq_rev_reentrant] |> List.iter (fun dynarray_to_seq_rev -> + assert ((seq |> A.of_seq |> dynarray_to_seq_rev) + |> List.of_seq |> List.rev + = ints) + ); + done;; + +(** reentrancy for to_seq{,_rev}_reentrant *) +let () = + let a = A.of_list [1; 2; 3; 4] in + let seq = A.to_seq a in + let srq = A.to_seq_reentrant a in + let elems_a = A.to_seq_reentrant a in + + let (i, seq) = Option.get (Seq.uncons seq) in assert (i = 1); + let (i, srq) = Option.get (Seq.uncons srq) in assert (i = 1); + + (* setting an element in the middle is observed by both versions *) + A.set a 1 12; + assert (List.of_seq elems_a = [1; 12; 3; 4]); + let (i, seq) = Option.get (Seq.uncons seq) in assert (i = 12); + let (i, srq) = Option.get (Seq.uncons srq) in assert (i = 12); + + (* adding or removing elements invalidates [seq] but works with [srq] *) + A.remove_last a; + assert (List.of_seq elems_a = [1; 12; 3]); + assert (match Seq.uncons seq with + | exception (Invalid_argument _) -> true + | _ -> false + ); + let (i, srq) = Option.get (Seq.uncons srq) in assert (i = 3); + + A.add_last a 4; + assert (List.of_seq elems_a = [1; 12; 3; 4]); + let (i, srq) = Option.get (Seq.uncons srq) in assert (i = 4); + assert (Seq.is_empty srq) + +let () = + let a = A.of_list [1; 2; 3; 4; 5] in + let seq = A.to_seq_rev a in + let srq = A.to_seq_rev_reentrant a in + + let (i, seq) = Option.get (Seq.uncons seq) in assert (i = 5); + let (i, srq) = Option.get (Seq.uncons srq) in assert (i = 5); + + (* setting an element in the middle is observed by both versions *) + A.set a 3 14; + assert (A.to_list a = [1; 2; 3; 14; 5]); + let (i, seq) = Option.get (Seq.uncons seq) in assert (i = 14); + let (i, srq) = Option.get (Seq.uncons srq) in assert (i = 14); + + (* adding elements invalidates [seq] but is ignored by [srq] *) + A.add_last a 6; + assert (A.to_list a = [1; 2; 3; 14; 5; 6]); + assert (match Seq.uncons seq with + | exception (Invalid_argument _) -> true + | _ -> false + ); + (* just check the head, no popping *) + let (i, _) = Option.get (Seq.uncons srq) in assert (i = 3); + let (i, _) = Option.get (Seq.uncons srq) in assert (i = 3); + + (* [srq] skips removed elements *) + A.truncate a 1; + assert (A.to_list a = [1]); + let (i, srq) = Option.get (Seq.uncons srq) in assert (i = 1); + assert (Seq.is_empty srq) + + +(** {1:advanced Advanced topics for performance} *) + +(** set_capacity *) + +let () = + let a = A.create() in + let max_length = 20_000 in + for i = 0 to max_length - 1 do A.add_last a i; done; + List.iter + (fun size -> + A.set_capacity a size; + let result_size = min max_length size in + assert (A.to_list a = list_range 0 result_size)) + [ 30_000; 20_000; 19_999; 2000; 100; 50; 4; 4; 3; 2; 1; 0];; + + +(** fit_capacity, capacity *) + +let () = + let a = A.create() in + for i = 0 to 200 do + A.add_last a i; + done; + A.fit_capacity a; + assert (A.length a = 201); + assert (A.length a = A.capacity a); diff --git a/testsuite/tests/lib-dynlink-initializers/test10_main.byte.reference b/testsuite/tests/lib-dynlink-initializers/test10_main.byte.reference index 1457b960859..9bbb5a25c98 100644 --- a/testsuite/tests/lib-dynlink-initializers/test10_main.byte.reference +++ b/testsuite/tests/lib-dynlink-initializers/test10_main.byte.reference @@ -3,9 +3,9 @@ Raised at Stdlib.failwith in file "stdlib.ml", line 29, characters 17-33 Called from Test10_plugin.g in file "test10_plugin.ml", line 3, characters 2-21 Called from Test10_plugin.f in file "test10_plugin.ml", line 6, characters 2-6 Called from Test10_plugin in file "test10_plugin.ml", line 10, characters 2-6 -Called from Dynlink.Bytecode.run in file "byte/dynlink.ml", line 146, characters 16-25 -Re-raised at Dynlink.Bytecode.run in file "byte/dynlink.ml", line 148, characters 6-137 -Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml", line 360, characters 11-54 +Called from Dynlink.Bytecode.run in file "byte/dynlink.ml", line 152, characters 16-25 +Re-raised at Dynlink.Bytecode.run in file "byte/dynlink.ml", line 154, characters 6-137 +Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml", line 358, characters 11-54 Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 Called from Stdlib__Fun.protect in file "fun.ml", line 33, characters 8-15 Re-raised at Stdlib__Fun.protect in file "fun.ml", line 38, characters 6-52 diff --git a/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference b/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference index 9c7b2de2238..4da7d537af0 100755 --- a/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference +++ b/testsuite/tests/lib-dynlink-initializers/test10_main.native.reference @@ -1,10 +1,10 @@ Error: Failure("Plugin error") -Raised by primitive operation at Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 85, characters 12-29 -Re-raised at Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 87, characters 10-149 +Raised by primitive operation at Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 83, characters 12-29 +Re-raised at Dynlink.Native.run.(fun) in file "native/dynlink.ml", line 85, characters 10-149 Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 -Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml", line 360, characters 11-54 +Called from Dynlink_common.Make.load.(fun) in file "dynlink_common.ml", line 358, characters 11-54 Called from Stdlib__List.iter in file "list.ml", line 112, characters 12-15 Called from Stdlib__Fun.protect in file "fun.ml", line 33, characters 8-15 Re-raised at Stdlib__Fun.protect in file "fun.ml", line 38, characters 6-52 -Called from Dynlink_common.Make.loadfile in file "dynlink_common.ml" (inlined), line 368, characters 26-45 +Called from Dynlink_common.Make.loadfile in file "dynlink_common.ml" (inlined), line 366, characters 26-45 Called from Test10_main in file "test10_main.ml", line 49, characters 30-87 diff --git a/testsuite/tests/lib-floatarray/floatarray.ml b/testsuite/tests/lib-floatarray/floatarray.ml index 564c325d7c6..654e15b6465 100644 --- a/testsuite/tests/lib-floatarray/floatarray.ml +++ b/testsuite/tests/lib-floatarray/floatarray.ml @@ -11,6 +11,8 @@ module type S = sig val make : int -> float -> t val create : int -> t val init : int -> (int -> float) -> t + val make_matrix : int -> int -> float -> t array + val init_matrix : int -> int -> (int -> int -> float) -> t array val append : t -> t -> t val concat : t list -> t val sub : t -> int -> int -> t @@ -125,6 +127,47 @@ module Test (A : S) : sig end = struct check_inval (fun i -> A.init i Float.of_int) (-1); check_inval (fun i -> A.init i Float.of_int) (A.max_length + 1); + (* [make_matrix] *) + let check_make_matrix m n = + let a = A.make_matrix m n 42. in + assert (Array.length a = m); + for i = 0 to m-1 do + let row = Array.get a i in + assert (A.length row = n); + for j = 0 to n-1 do + assert (A.get row j = 42.); + A.set row j (Float.of_int (i*n + j)); + done; + done; + (* check absence of sharing: *) + if n > 0 then begin + for i = 0 to m-1 do + assert (A.get (Array.get a i) 0 = Float.of_int (i*n)); + done + end + in + check_make_matrix 0 0; + check_make_matrix 0 3; + check_make_matrix 5 0; + check_make_matrix 5 3; + + (* [init_matrix] *) + let check_init_matrix m n = + let a = A.init_matrix m n (fun i j -> Float.of_int (i*n + j)) in + assert (Array.length a = m); + for i = 0 to m-1 do + let row = Array.get a i in + assert (A.length row = n); + for j = 0 to n-1 do + assert (A.get row j = Float.of_int (i*n + j)); + done; + done; + in + check_init_matrix 0 0; + check_init_matrix 0 3; + check_init_matrix 5 0; + check_init_matrix 5 3; + (* [append] *) let check m n = let a = A.init m Float.of_int in diff --git a/testsuite/tests/lib-random/chi2.ml b/testsuite/tests/lib-random/chi2.ml index 3804f6511c3..52e02d464f0 100644 --- a/testsuite/tests/lib-random/chi2.ml +++ b/testsuite/tests/lib-random/chi2.ml @@ -30,27 +30,47 @@ let test name f = if not (chisquare 100_000 f) then Printf.printf "%s: suspicious result\n%!" name +(* Division of [x] by [y] where [x] is interpreted as an unsigned integer. + * This code assumes [y >= 0]. *) +let udiv x y = + if x >= 0 then x / y + else + let x' = x + min_int in + let q = (x' / y) - (min_int / y) + and r = (x' mod y) - (min_int mod y) in + if r < y then q else q + 1 + let _ = + + (* [bits] *) test "Random.bits (bits 0-7)" Random.bits; test "Random.bits (bits 12-19)" (fun () -> Random.bits() lsr 12); test "Random.bits (bits 22-29)" (fun () -> Random.bits() lsr 22); + + (* [int] *) test "Random.int 2^26 (bits 0-7)" (fun () -> Random.int (1 lsl 26)); test "Random.int 2^26 (bits 18-25)" (fun () -> Random.int (1 lsl 26) lsr 18); test "Random.int (256 * p) / p" (fun () -> Random.int (256 * 853187) / 853187); + + (* [float] *) test "Random.float 1.0 (first 8 bits)" (fun () -> int_of_float (Random.float 1.0 *. 256.0)); test "Random.float 1.0 (next 8 bits)" (fun () -> int_of_float (Random.float 1.0 *. 65536.0)); + + (* [bits32] *) test "Random.bits32 (bits 0-7)" (fun () -> Int32.to_int (Random.bits32())); test "Random.bits32 (bits 20-27)" (fun () -> Int32.(to_int (shift_right (Random.bits32()) 20))); + + (* [int32] *) test "Random.int32 2^30 (bits 0-7)" (fun () -> Int32.to_int (Random.int32 0x40000000l)); test "Random.int32 2^30 (bits 20-27)" @@ -58,12 +78,16 @@ let _ = test "Random.int32 (256 * p) / p" (let p = 7048673l in fun () -> Int32.(to_int (div (Random.int32 (mul 256l p)) p))); + + (* [bits64] *) test "Random.bits64 (bits 0-7)" (fun () -> Int64.to_int (Random.bits64())); test "Random.bits64 (bits 30-37)" (fun () -> Int64.(to_int (shift_right (Random.bits64()) 30))); test "Random.bits64 (bits 52-59)" (fun () -> Int64.(to_int (shift_right (Random.bits64()) 52))); + + (* [int64] *) test "Random.int64 2^60 (bits 0-7)" (fun () -> Int64.to_int (Random.int64 0x1000000000000000L)); test "Random.int64 2^60 (bits 30-37)" @@ -75,6 +99,8 @@ let _ = test "Random.int64 (256 * p) / p" (let p = 16430454264262693L in fun () -> Int64.(to_int (div (Random.int64 (mul 256L p)) p))); + + (* [full_int] *) if Sys.int_size >= 32 then begin test "Random.full_int 2^30 (bits 0-7)" (fun () -> Random.full_int (1 lsl 30)); @@ -95,6 +121,178 @@ let _ = (let p = Int64.to_int 17766642568158577L in fun () -> Random.full_int (256 * p) / p) end; + + (* [int_in_range] *) + + let min_ = -214748364 in + let max_ = min_ + 0x1FFF_FFFF in + test "Random.int_in_range, range of length 2^29 (bits 0-7)" + (fun () -> Random.int_in_range ~min:min_ ~max:max_ - min_); + test "Random.int_in_range, range of length 2^29 (bits 21-28)" + (fun () -> (Random.int_in_range ~min:min_ ~max:max_ - min_) lsr 21); + let min_ = -214748364 in + let max_ = min_ + 0x3FFF_FFFF in + test "Random.int_in_range, range of length 2^30 (bits 0-7)" + (fun () -> Random.int_in_range ~min:min_ ~max:max_ - min_); + test "Random.int_in_range, range of length 2^30 (bits 22-29)" + (fun () -> (Random.int_in_range ~min:min_ ~max:max_ - min_) lsr 22); + let min_int31 = -0x4000_0000 in + let max_int31 = 0x3FFF_FFFF in + test "Random.int_in_range, full int31 range (bits 0-7)" + (fun () -> Random.int_in_range ~min:min_int31 ~max:max_int31); + test "Random.int_in_range, full int31 range (bits 23-30)" + (fun () -> (Random.int_in_range ~min:min_int31 ~max:max_int31) lsr 23); + test "Random.int_in_range, range of length 256*p < 2^30 (bits 0-7)" + (let p = 2_097_169 in (* prime < 2^22 *) + let min_ = -214748364 in + let max_ = min_ + (256 * p) - 1 in + fun () -> (Random.int_in_range ~min:min_ ~max:max_ - min_) / p); + test "Random.int_in_range, range of length 2^30 < 256*p < 2^31 (bits 0-7)" + (let p = 6_291_469 in (* prime > 2^22 and < 2^23 *) + let min_ = min_int in + let max_ = min_ + (256 * p) - 1 in + fun () -> udiv (Random.int_in_range ~min:min_ ~max:max_ - min_) p); + if Sys.int_size >= 32 then begin + let min_int32 = Int64.to_int (-0x8000_0000L) in + let max_int32 = Int64.to_int 0x7FFF_FFFFL in + test "Random.int_in_range, full int32 range (bits 0-7)" + (fun () -> Random.int_in_range ~min:min_int32 ~max:max_int32); + test "Random.int_in_range, full int32 range (bits 24-31)" + (fun () -> (Random.int_in_range ~min:min_int32 ~max:max_int32) lsr 24); + test "Random.int_in_range, range of length 2^31 < 256*p < 2^32 (bits 0-7)" + (let p = 12_582_917 in (* prime > 2^23 and < 2^24 *) + let min_ = min_int in + let max_ = min_ + (256 * p) - 1 in + fun () -> udiv (Random.int_in_range ~min:min_ ~max:max_ - min_) p); + end; + if Sys.int_size >= 63 then begin + let min_ = Int64.to_int (-1844674407370955197L) in + let max_ = min_ + Int64.to_int 0x1FFF_FFFF_FFFF_FFFFL in + test "Random.int_in_range, range of length 2^61 (bits 0-7)" + (fun () -> Random.int_in_range ~min:min_ ~max:max_ - min_); + test "Random.int_in_range, range of length 2^61 (bits 30-37)" + (fun () -> (Random.int_in_range ~min:min_ ~max:max_ - min_) lsr 30); + test "Random.int_in_range, range of length 2^61 (bits 53-60)" + (fun () -> (Random.int_in_range ~min:min_ ~max:max_ - min_) lsr 53); + let min_ = Int64.to_int (-1844674407370955197L) in + let max_ = min_ + Int64.to_int 0x3FFF_FFFF_FFFF_FFFFL in + test "Random.int_in_range, range of length 2^62 (bits 0-7)" + (fun () -> Random.int_in_range ~min:min_ ~max:max_ - min_); + test "Random.int_in_range, range of length 2^62 (bits 30-37)" + (fun () -> (Random.int_in_range ~min:min_ ~max:max_ - min_) lsr 30); + test "Random.int_in_range, range of length 2^62 (bits 54-61)" + (fun () -> (Random.int_in_range ~min:min_ ~max:max_ - min_) lsr 54); + test "Random.int_in_range, full int range (bits 0-7)" + (fun () -> Random.int_in_range ~min:min_int ~max:max_int); + test "Random.int_in_range, full int range (bits 30-37)" + (fun () -> (Random.int_in_range ~min:min_int ~max:max_int) lsr 30); + test "Random.int_in_range, full int range (bits 55-62)" + (fun () -> (Random.int_in_range ~min:min_int ~max:max_int) lsr 55); + test "Random.int_in_range, range of length 2^61 < 256*p < 2^62 (bits 0-7)" + (let p = Int64.to_int 13510798882111519L in (*prime > 2^53 and < 2^54 *) + let min_ = min_int in + let max_ = min_ + (256 * p) - 1 in + fun () -> (Random.int_in_range ~min:min_ ~max:max_ - min_) / p); + test "Random.int_in_range, range of length 256*p > 2^62 (bits 0-7)" + (let p = Int64.to_int 27021597764223071L in (*prime > 2^54 and < 2^55 *) + let min_ = min_int in + let max_ = min_ + (256 * p) - 1 in + fun () -> udiv (Random.int_in_range ~min:min_ ~max:max_ - min_) p); + end; + + (* [int32_in_range] *) + let min_ = -429496751l in + let max_ = Int32.add min_ 0x3FFF_FFFFl in + test "Random.int32_in_range, range of length 2^30 (bits 0-7)" + (fun () -> Int32.(to_int + (sub (Random.int32_in_range ~min:min_ ~max:max_) min_))); + test "Random.int32_in_range, range of length 2^30 (bits 22-29)" + (fun () -> Int32.(to_int (shift_right + (sub (Random.int32_in_range ~min:min_ ~max:max_) min_) + 22))); + let min_ = -429496751l in + let max_ = Int32.add min_ 0x7FFF_FFFFl in + test "Random.int32_in_range, range of length 2^31 (bits 0-7)" + (fun () -> Int32.(to_int + (sub (Random.int32_in_range ~min:min_ ~max:max_) min_))); + test "Random.int32_in_range, range of length 2^31 (bits 23-30)" + (fun () -> Int32.(to_int (shift_right + (sub (Random.int32_in_range ~min:min_ ~max:max_) min_) + 23))); + test "Random.int32_in_range, full int32 range (bits 0-7)" + (fun () -> Int32.(to_int + (Random.int32_in_range ~min:min_int ~max:max_int))); + test "Random.int32_in_range, full int32 range (bits 24-31)" + (fun () -> Int32.(to_int (shift_right + (Random.int32_in_range ~min:min_int ~max:max_int) + 24))); + test "Random.int32_in_range, range of length 256*p < 2^31 (bits 0-7)" + (let p = 6_291_469l in (* prime < 2^23 *) + let min_ = -429496751l in + let max_ = Int32.(pred (add min_ (mul 256l p))) in + fun () -> Int32.(to_int + (div (sub (Random.int32_in_range ~min:min_ ~max:max_) min_) p))); + test "Random.int32_in_range, range of length 256*p > 2^31 (bits 0-7)" + (let p = 12_582_917l in (* prime > 2^23 and < 2^24 *) + let min_ = Int32.min_int in + let max_ = Int32.(pred (add min_ (mul 256l p))) in + fun () -> Int32.(to_int + (unsigned_div (sub (Random.int32_in_range ~min:min_ ~max:max_) min_) + p))); + + (* [int64_in_range] *) + let min_ = -1844674407370955197L in + let max_ = Int64.add min_ 0x3FFF_FFFF_FFFF_FFFFL in + test "Random.int64_in_range, range of length 2^62 (bits 0-7)" + (fun () -> Int64.(to_int + (sub (Random.int64_in_range ~min:min_ ~max:max_) min_))); + test "Random.int64_in_range, range of length 2^62 (bits 30-37)" + (fun () -> Int64.(to_int (shift_right + (sub (Random.int64_in_range ~min:min_ ~max:max_) min_) + 30))); + test "Random.int64_in_range, range of length 2^62 (bits 54-61)" + (fun () -> Int64.(to_int (shift_right + (sub (Random.int64_in_range ~min:min_ ~max:max_) min_) + 54))); + let min_ = -1844674407370955197L in + let max_ = Int64.add min_ 0x7FFF_FFFF_FFFF_FFFFL in + test "Random.int64_in_range, range of length 2^63 (bits 0-7)" + (fun () -> Int64.(to_int + (sub (Random.int64_in_range ~min:min_ ~max:max_) min_))); + test "Random.int64_in_range, range of length 2^63 (bits 30-37)" + (fun () -> Int64.(to_int (shift_right + (sub (Random.int64_in_range ~min:min_ ~max:max_) min_) + 30))); + test "Random.int64_in_range, range of length 2^63 (bits 55-62)" + (fun () -> Int64.(to_int (shift_right + (sub (Random.int64_in_range ~min:min_ ~max:max_) min_) + 55))); + test "Random.int64_in_range, full int64 range (bits 0-7)" + (fun () -> Int64.(to_int + (Random.int64_in_range ~min:min_int ~max:max_int))); + test "Random.int64_in_range, full int64 range (bits 30-37)" + (fun () -> Int64.(to_int (shift_right + (Random.int64_in_range ~min:min_int ~max:max_int) + 30))); + test "Random.int64_in_range, full int64 range (bits 56-63)" + (fun () -> Int64.(to_int (shift_right + (Random.int64_in_range ~min:min_int ~max:max_int) + 56))); + test "Random.int64_in_range, range of length 256*p < 2^63 (bits 0-7)" + (let p = 27021597764223071L in (* prime < 2^55 *) + let min_ = -1844674407370955197L in + let max_ = Int64.(pred (add min_ (mul 256L p))) in + fun () -> Int64.(to_int + (div (sub (Random.int64_in_range ~min:min_ ~max:max_) min_) p))); + test "Random.int64_in_range, range of length 256*p > 2^63 (bits 0-7)" + (let p = 54043195528445957L in (* prime > 2^55 and < 2^56 *) + let min_ = Int64.min_int in + let max_ = Int64.(pred (add min_ (mul 256L p))) in + fun () -> Int64.(to_int + (unsigned_div (sub (Random.int64_in_range ~min:min_ ~max:max_) min_) + p))); + + (* [split] *) let r1 = Random.split() in let r2 = Random.split() in let r3 = Random.State.split r1 in diff --git a/testsuite/tests/lib-random/compat_32_64.ml b/testsuite/tests/lib-random/compat_32_64.ml new file mode 100644 index 00000000000..cb0d8d62845 --- /dev/null +++ b/testsuite/tests/lib-random/compat_32_64.ml @@ -0,0 +1,123 @@ +(* TEST *) + +(* Check that [full_int] and [int_in_range] yield the same outputs + * - for 31-bit input on every tested platform; + * - for 32-bit input on every tested platform where [Sys.int_size >= 32]. *) + +let min_int31 = -0x4000_0000 (* = -2^30 *) +let max_int31 = 0x3FFF_FFFF (* = 2^30-1 *) +let min_int32 = -(1 lsl 31) + (* = -0x8000_0000 on platforms where [Sys.int_size >= 32] *) +let max_int32 = (1 lsl 31) - 1 + (* = 0x7FFF_FFFF on platforms where [Sys.int_size >= 32] *) + +let expected__full_int__int32 = + List.map Int64.to_int + [ + 451177519L; 819244110L; 1569039028L; 1898166382L; 382924821L; + 369901015L; 352113804L; 405163262L; 1999817968L; 626859825L; + 1606096148L; 768468192L; 2112068721L; 360408220L; 1086772984L; + 155961157L; 407238554L; 422041964L; 315222802L; 2141327316L; + 927599929L; 307430453L; 1936714909L; 1017363199L; 2125175059L; + 1311994963L; 759137410L; 212550723L; 1706544910L; 810893211L; + 2056429253L; 1079086093L; 1713675986L; 753193678L; 276572642L; + 530348252L; 617726581L; 944299189L; 674895562L; 32787006L; + 1830016271L; 1067904883L; 589173623L; 950337835L; 2078987417L; + 1487106135L; 569957530L; 2015304950L; 885035468L; 234722862L; + ] + +let expected__int_in_range__int32 = + List.map Int64.to_int + [ + -2147483542L; -2147483052L; -2147483634L; -2147483498L; -2147483224L; + -2147482666L; -2147483631L; -2147483278L; -2147483612L; -2147482799L; + -2147483421L; -2147482825L; -2147483593L; -2147483470L; -2147483177L; + -2147482829L; -2147483463L; -2147482933L; -2147483591L; -2147482786L; + -2147483446L; -2147483415L; -2147482710L; -2147482883L; -2147483199L; + -2147482957L; -2147482912L; -2147483195L; -2147483513L; -2147482887L; + -2147483394L; -2147483434L; -2147483251L; -2147483597L; -2147482693L; + -2147483453L; -2147482724L; -2147483596L; -2147482822L; -2147482813L; + -2147483565L; -2147482939L; -2147483428L; -2147483274L; -2147483612L; + -2147483279L; -2147482698L; -2147483617L; -2147483301L; -2147483082L; + ] + +let expected__int_in_range__full_int32_range = + List.map Int64.to_int + [ + 316667342L; -295023111L; 1894765368L; 185794834L; -981816301L; + 740994304L; -680489891L; 278403874L; -2032365355L; -71571733L; + -313777328L; -689756819L; -980386453L; 82099031L; 1573778309L; + -760895485L; 511322260L; 1825182001L; 954732521L; -1492321820L; + 773383493L; -1681170167L; 2067003710L; -1742733312L; 1195851762L; + 1602173427L; -357434044L; -1334661233L; -128246722L; -2094933952L; + -431878364L; 1978816493L; 808773565L; -1454547995L; 364583207L; + 2002713488L; -786979985L; 964103855L; -1430475164L; 1303482935L; + -356009461L; -111417631L; 1106019824L; -1988580373L; 1586895675L; + -1580402270L; 2061313798L; -1676201176L; 975189254L; -361726938L; + ] + +let _ = + + (* Test outputs for 31-bit input: *) + if Sys.int_size >= 31 then begin + + (* [full_int], range that fits in 30 bits: *) + for i = 0 to 49 do + Printf.printf "%i\n" (Random.full_int max_int31) + done; + print_newline (); + + (* [int_in_range], all-negative range whose length fits in 30 bits: *) + for i = 0 to 49 do + Printf.printf "%i\n" + (Random.int_in_range ~min:min_int31 ~max:(min_int31 + 996)) + done; + print_newline (); + + (* [int_in_range], full 31-bit range: *) + for i = 0 to 49 do + Printf.printf "%i\n" + (Random.int_in_range ~min:min_int31 ~max:max_int31) + done; + print_newline (); + + end; + + (* Test outputs for 32-bit input: *) + if Sys.int_size >= 32 then begin + + (* [full_int], range that fits in 31 bits: *) + let ok = ref true in + expected__full_int__int32 |> + List.iter begin fun expected -> + ok := !ok && expected = + (Random.full_int max_int32) + end ; + Printf.printf "%b\n" !ok; + + (* [int_in_range], all-negative range whose length fits in 31 bits: *) + let ok = ref true in + expected__int_in_range__int32 |> + List.iter begin fun expected -> + ok := !ok && expected = + (Random.int_in_range ~min:min_int32 ~max:(min_int32 + 996)) + end ; + Printf.printf "%b\n" !ok; + + (* [int_in_range], full 32-bit range: *) + let ok = ref true in + expected__int_in_range__full_int32_range |> + List.iter begin fun expected -> + ok := !ok && expected = + (Random.int_in_range ~min:min_int32 ~max:max_int32) + end ; + Printf.printf "%b\n" !ok; + + end + else begin + Printf.printf "true\ntrue\ntrue\n" ; + end; + + () + +let _ = exit 0 diff --git a/testsuite/tests/lib-random/compat_32_64.reference b/testsuite/tests/lib-random/compat_32_64.reference new file mode 100644 index 00000000000..32026cd6253 --- /dev/null +++ b/testsuite/tests/lib-random/compat_32_64.reference @@ -0,0 +1,156 @@ +691769754 +1061553262 +344373510 +616584865 +2616996 +582111861 +403737495 +786655037 +234874283 +861395434 +772162098 +917958495 +53725144 +862765034 +568000806 +978003028 +879053180 +588214058 +54672416 +802084138 +884612654 +268599649 +714738946 +899342876 +50068887 +378318794 +495447764 +227504342 +610800572 +328600136 +333963177 +956808855 +916073717 +324922837 +271778746 +12481130 +855825287 +90864420 +508292232 +27636216 +1029983911 +291793467 +689728247 +229322728 +45172927 +107738202 +292122103 +618814194 +711332398 +554972104 + +-1073741530 +-1073740888 +-1073741782 +-1073741019 +-1073740859 +-1073740865 +-1073741534 +-1073741577 +-1073741282 +-1073741163 +-1073741513 +-1073741034 +-1073741500 +-1073741368 +-1073741290 +-1073741244 +-1073741270 +-1073741269 +-1073741439 +-1073741377 +-1073741692 +-1073741341 +-1073741140 +-1073740989 +-1073741504 +-1073741276 +-1073741273 +-1073740998 +-1073741366 +-1073741750 +-1073741279 +-1073741219 +-1073741771 +-1073741731 +-1073741608 +-1073740877 +-1073741738 +-1073741048 +-1073741059 +-1073741346 +-1073741209 +-1073741593 +-1073741116 +-1073741048 +-1073741793 +-1073741416 +-1073741431 +-1073740978 +-1073740848 +-1073741504 + +838038025 +1060073484 +-555975041 +-825987583 +975134752 +831716180 +330110777 +-119695492 +929643271 +52572337 +464726704 +136828399 +-978275585 +-518656455 +723340377 +-551292710 +980383878 +-736276577 +75010286 +-992468772 +-1022581416 +-810312547 +-813307923 +461161247 +-437494086 +-308452031 +856020781 +-90096979 +426279563 +-292766912 +-487493925 +570776330 +-470717058 +-447203604 +70094832 +794730351 +741719169 +-167883286 +70654065 +79129735 +315532303 +746624829 +992716426 +477281232 +558865877 +103841147 +966710857 +-304632204 +-539866915 +-558915649 + +true +true +true diff --git a/testsuite/tests/lib-runtime-events/test.ml b/testsuite/tests/lib-runtime-events/test.ml index 2e7e1b90abc..4eb61ae717f 100644 --- a/testsuite/tests/lib-runtime-events/test.ml +++ b/testsuite/tests/lib-runtime-events/test.ml @@ -7,6 +7,7 @@ external start_runtime_events : unit -> unit = "start_runtime_events" external get_event_counts : unit -> (int * int) = "get_event_counts" let () = + Gc.full_major (); start_runtime_events (); for a = 0 to 2 do ignore(Sys.opaque_identity(ref 42)); @@ -21,4 +22,5 @@ let () = Gc.compact (); Runtime_events.pause () done; + let (minors, majors) = get_event_counts () in Printf.printf "minors: %d, majors: %d\n" minors majors diff --git a/testsuite/tests/lib-runtime-events/test.reference b/testsuite/tests/lib-runtime-events/test.reference index 1b81e9aba25..185f0174fed 100644 --- a/testsuite/tests/lib-runtime-events/test.reference +++ b/testsuite/tests/lib-runtime-events/test.reference @@ -1,2 +1,2 @@ minors: 9, majors: 0 -minors: 9, majors: 0 +minors: 18, majors: 0 diff --git a/testsuite/tests/lib-runtime-events/test_caml.ml b/testsuite/tests/lib-runtime-events/test_caml.ml index 518c7134ae0..f25013b3b15 100644 --- a/testsuite/tests/lib-runtime-events/test_caml.ml +++ b/testsuite/tests/lib-runtime-events/test_caml.ml @@ -78,6 +78,7 @@ let majors_per_epoch = 50 let conses_per_major = 10 let () = + Gc.full_major (); let list_ref = ref [] in start (); let cursor = create_cursor None in diff --git a/testsuite/tests/lib-runtime-events/test_compact.ml b/testsuite/tests/lib-runtime-events/test_compact.ml new file mode 100644 index 00000000000..890a28901ec --- /dev/null +++ b/testsuite/tests/lib-runtime-events/test_compact.ml @@ -0,0 +1,75 @@ +(* TEST + include runtime_events; +*) +open Runtime_events + +type state = + | INIT + | BEGIN + | EVACUATING_BEGIN + | EVACUATING_END + | FORWARDING_BEGIN + | FORWARDING_END + | RELEASING_BEGIN + | RELEASING_END + | END + +let compact_state = ref INIT + +let () = + start (); + let cursor = create_cursor None in + let runtime_begin domain_id ts phase = + match phase with + | EV_COMPACT -> + begin + match !compact_state with + | INIT -> compact_state := BEGIN + | _ -> assert(false) + end + | EV_COMPACT_EVACUATE -> begin + match !compact_state with + | BEGIN -> compact_state := EVACUATING_BEGIN + | _ -> assert(false) + end + | EV_COMPACT_FORWARD -> begin + match !compact_state with + | EVACUATING_END -> compact_state := FORWARDING_BEGIN + | _ -> assert(false) + end + | EV_COMPACT_RELEASE -> begin + match !compact_state with + | FORWARDING_END -> compact_state := RELEASING_BEGIN + | _ -> assert(false) + end + | _ -> () in + let runtime_end domain_id ts phase = + match phase with + | EV_COMPACT -> + begin + match !compact_state with + | RELEASING_END -> compact_state := END + | _ -> assert(false) + end + | EV_COMPACT_EVACUATE -> begin + match !compact_state with + | EVACUATING_BEGIN -> compact_state := EVACUATING_END + | _ -> assert(false) + end + | EV_COMPACT_FORWARD -> begin + match !compact_state with + | FORWARDING_BEGIN -> compact_state := FORWARDING_END + | _ -> assert(false) + end + | EV_COMPACT_RELEASE -> begin + match !compact_state with + | RELEASING_BEGIN -> compact_state := RELEASING_END + | _ -> assert(false) + end + | _ -> () + in + let callbacks = Callbacks.create ~runtime_begin ~runtime_end () + in + Gc.compact (); + ignore(read_poll cursor callbacks (Some 1_000)); + assert(!compact_state = END) diff --git a/testsuite/tests/lib-runtime-events/test_instrumented.ml b/testsuite/tests/lib-runtime-events/test_instrumented.ml index 5c49db90af2..b82217df0d6 100644 --- a/testsuite/tests/lib-runtime-events/test_instrumented.ml +++ b/testsuite/tests/lib-runtime-events/test_instrumented.ml @@ -8,13 +8,12 @@ open Runtime_events let list_ref = ref [] -let total_sizes = ref 0 +let total_blocks = ref 0 let total_minors = ref 0 let lost_event_words = ref 0 -let alloc domain_id ts sizes = - let size_accum = Array.fold_left (fun x y -> x + y) 0 sizes in - total_sizes := !total_sizes + size_accum +let alloc domain_id ts counts = + total_blocks := Array.fold_left ( + ) !total_blocks counts let runtime_end domain_id ts phase = match phase with @@ -26,15 +25,34 @@ let runtime_end domain_id ts phase = let lost_events domain_id words = lost_event_words := !lost_event_words + words +let callbacks = Callbacks.create ~runtime_end ~alloc ~lost_events () + +let reset cursor = + ignore (read_poll cursor callbacks None); + total_blocks := 0; + total_minors := 0 + +let loop n cursor = + Gc.full_major (); + reset cursor; + let minors_before = Gc.((quick_stat ()).minor_collections) in + for a = 1 to n do + list_ref := (Sys.opaque_identity(ref 42)) :: !list_ref + done; + Gc.full_major (); + ignore(read_poll cursor callbacks None); + let minors_after = Gc.((quick_stat ()).minor_collections) in + minors_after - minors_before + let () = - Gc.full_major (); - start (); - let cursor = create_cursor None in - for a = 0 to 1_000_000 do - list_ref := (Sys.opaque_identity(ref 42)) :: !list_ref - done; - Gc.full_major (); - let callbacks = Callbacks.create ~runtime_end ~alloc ~lost_events () in - ignore(read_poll cursor callbacks None); - Printf.printf "lost_event_words: %d, total_sizes: %d, total_minors: %d\n" - !lost_event_words !total_sizes !total_minors + start (); + let cursor = create_cursor None in + let self_minors_base = loop 0 cursor in + let blocks_base = !total_blocks in + let minors_base = !total_minors in + let self_minors = loop 1_000_000 cursor - self_minors_base in + let blocks = !total_blocks in + let minors = !total_minors in + Printf.printf "lost_event_words: %d, total_blocks: %d, diff_minors: %d\n" + !lost_event_words (blocks - blocks_base) + (minors - minors_base - self_minors) diff --git a/testsuite/tests/lib-runtime-events/test_instrumented.reference b/testsuite/tests/lib-runtime-events/test_instrumented.reference index 2d9ac36c99b..dfba60c1348 100644 --- a/testsuite/tests/lib-runtime-events/test_instrumented.reference +++ b/testsuite/tests/lib-runtime-events/test_instrumented.reference @@ -1 +1 @@ -lost_event_words: 0, total_sizes: 2000004, total_minors: 31 +lost_event_words: 0, total_blocks: 2000000, diff_minors: 0 diff --git a/testsuite/tests/match-side-effects/contexts_1.ml b/testsuite/tests/match-side-effects/contexts_1.ml new file mode 100644 index 00000000000..e0fce8a8f3d --- /dev/null +++ b/testsuite/tests/match-side-effects/contexts_1.ml @@ -0,0 +1,43 @@ +(* Example where a side-effect invalidates static knowledge about + a sub-value at the "toplevel" of the current matching context + -- on the current arguments of the pattern matrix. + + This example is adapted from the main example of #7241, showing + that mutable state combined with context optimization could be + unsound. + + The example of #7241 was adapted to return type-unsound result + (on non-fixed systems) instead of segfaulting. Segfaults are + painful to record and test reliably in a testsuite. *) + +type u = {a: bool; mutable b: (bool, int) Either.t} + +let example_1 () = + let input = { a = true; b = Either.Left true } in + match input with + | {a = false; b = _} -> Result.Error 1 + | {a = _; b = Either.Right _} -> Result.Error 2 + + (* evil trick: mutate the scrutinee from a guard *) + | {a = _; b = _} when (input.b <- Either.Right 3; false) -> Result.Error 3 + + (* At this point, field [b] has been mutated to hold a [Right] + constructor, but the pattern-matching compiler has already + checked read the field in the past and checked that the + constructor was not [Right] -- otherwise the action [Error 2] + would have been taken. + + The following behaviors would be reasonable on the input [f_input]: + + - read the field again, observe [Right], and fail with a match + failure -- there is no clause left to match it. + + - reuse the previously read subvalue [Left true], and return [Ok true]. + + For many years the OCaml compiler behaved incorrectly here: it + would read the mutated value [Right 3], but assume from static + context information that the head constructor is [Left]. and + dereference its field without checking the constructor + again. This returns the unsound result [Ok (3 : bool)]. *) + | {a = true; b = Either.Left y} -> Result.Ok y +;; diff --git a/testsuite/tests/match-side-effects/contexts_2.ml b/testsuite/tests/match-side-effects/contexts_2.ml new file mode 100644 index 00000000000..cf422a2da78 --- /dev/null +++ b/testsuite/tests/match-side-effects/contexts_2.ml @@ -0,0 +1,15 @@ +(* Example where a side-effect invalidates static knowledge about + a sub-value below the "toplevel" of the current matching context + -- a sub-value of the current arguments of the pattern matrix. + *) + +type 'a myref = { mutable mut : 'a } +type u = {a: bool; b: (bool, int) Either.t myref } + +let example_2 () = + let input = { a = true; b = { mut = Either.Left true } } in + match input with + | {a = false; b = _} -> Result.Error 1 + | {a = _; b = { mut = Either.Right _ }} -> Result.Error 2 + | {a = _; b = _} when (input.b.mut <- Either.Right 3; false) -> Result.Error 3 + | {a = true; b = { mut = Either.Left y }} -> Result.Ok y diff --git a/testsuite/tests/match-side-effects/contexts_3.ml b/testsuite/tests/match-side-effects/contexts_3.ml new file mode 100644 index 00000000000..25d8e70aff5 --- /dev/null +++ b/testsuite/tests/match-side-effects/contexts_3.ml @@ -0,0 +1,13 @@ +(* Example where a side-effect invalidates static knowledge about + a sub-value above the current matching context. *) + +type 'a myref = { mutable mut : 'a } +type u = (bool * (bool, int) Either.t) myref + +let example_3 () = + let input = { mut = (true, Either.Left true) } in + match input with + | { mut = (false, _) } -> Result.Error 1 + | { mut = (_, Either.Right _) } -> Result.Error 2 + | { mut = (_, _) } when (input.mut <- (true, Either.Right 3); false) -> Result.Error 3 + | { mut = (true, Either.Left y) } -> Result.Ok y diff --git a/testsuite/tests/match-side-effects/partiality.ml b/testsuite/tests/match-side-effects/partiality.ml new file mode 100644 index 00000000000..916524c4184 --- /dev/null +++ b/testsuite/tests/match-side-effects/partiality.ml @@ -0,0 +1,181 @@ +(* TEST + flags = "-dlambda"; + expect; +*) + +(* The original example of unsoundness in #7421. *) +type t = {a: bool; mutable b: int option} + +let f x = + match x with + | {a = false; b = _} -> 0 + | {a = _; b = None} -> 1 + | {a = _; b = _} when (x.b <- None; false) -> 2 + | {a = true; b = Some y} -> y +;; +(* Correctness condition: there should either be a single + (field_mut 1) access, or the second access should include + a Match_failure case. + + FAIL: the second occurrence of (field_mut 1) is used with a direct + (field_imm 0) access without a constructor check. The compiler is + unsound here. *) +[%%expect {| +0 +type t = { a : bool; mutable b : int option; } +(let + (f/280 = + (function x/282 : int + (if (field_int 0 x/282) + (let (*match*/286 =o (field_mut 1 x/282)) + (if *match*/286 + (if (seq (setfield_ptr 1 x/282 0) 0) 2 + (let (*match*/287 =o (field_mut 1 x/282)) + (field_imm 0 *match*/287))) + 1)) + 0))) + (apply (field_mut 1 (global Toploop!)) "f" f/280)) +val f : t -> int = +|}] + + + +(* A simple example of a complete switch + inside a mutable position. *) +type t = {a: bool; mutable b: int option} + +let f x = + match x with + | {a = false; b = _} -> 0 + | {a = _; b = None} -> 1 + | {a = true; b = Some y} -> y +;; +(* Performance expectation: there should not be a Match_failure case. *) +[%%expect {| +0 +type t = { a : bool; mutable b : int option; } +(let + (f/291 = + (function x/292 : int + (if (field_int 0 x/292) + (let (*match*/296 =o (field_mut 1 x/292)) + (if *match*/296 (field_imm 0 *match*/296) 1)) + 0))) + (apply (field_mut 1 (global Toploop!)) "f" f/291)) +val f : t -> int = +|}] + + + +(* A variant of the #7421 example. *) +let f r = + match Some r with + | Some { contents = None } -> 0 + | _ when (r := None; false) -> 1 + | Some { contents = Some n } -> n + | None -> 3 +;; +(* Correctness condition: there should either be a single + (field_mut 1) access, or the second access should include + a Match_failure case. + + FAIL: the second occurrence of (field_mut 0) is used with a direct + (field_imm 0) access without a constructor check. The compiler is + unsound here. *) +[%%expect {| +(let + (f/298 = + (function r/299 : int + (let (*match*/301 = (makeblock 0 r/299)) + (catch + (if *match*/301 + (let (*match*/303 =o (field_mut 0 (field_imm 0 *match*/301))) + (if *match*/303 (exit 7) 0)) + (exit 7)) + with (7) + (if (seq (setfield_ptr 0 r/299 0) 0) 1 + (if *match*/301 + (let (*match*/305 =o (field_mut 0 (field_imm 0 *match*/301))) + (field_imm 0 *match*/305)) + 3)))))) + (apply (field_mut 1 (global Toploop!)) "f" f/298)) +val f : int option ref -> int = +|}] + + + +(* This example has an ill-typed counter-example: the type-checker + finds it Total, but the pattern-matching compiler cannot see that + (Some (Some (Bool b))) cannot occur. *) +type _ t = Int : int -> int t | Bool : bool -> bool t + +let test = function + | None -> 0 + | Some (Int n) -> n +;; +(* Performance expectation: there should not be a Match_failure case. *) +[%%expect {| +0 +type _ t = Int : int -> int t | Bool : bool -> bool t +(let + (test/309 = + (function param/312 : int + (if param/312 (field_imm 0 (field_imm 0 param/312)) 0))) + (apply (field_mut 1 (global Toploop!)) "test" test/309)) +val test : int t option -> int = +|}] + + +(* This example has an ill-typed counter-example, inside + a mutable position. *) +type _ t = Int : int -> int t | Bool : bool -> bool t + +let test = function + | { contents = None } -> 0 + | { contents = Some (Int n) } -> n +;; +(* Performance expectation: there should not be a Match_failure case. *) +[%%expect {| +0 +type _ t = Int : int -> int t | Bool : bool -> bool t +(let + (test/317 = + (function param/319 : int + (let (*match*/320 =o (field_mut 0 param/319)) + (if *match*/320 (field_imm 0 (field_imm 0 *match*/320)) 0)))) + (apply (field_mut 1 (global Toploop!)) "test" test/317)) +val test : int t option ref -> int = +|}] + + + +(* This example has a ill-typed counter-example, + and also mutable sub-patterns, but in different places. *) +type _ t = Int : int -> int t | Bool : bool -> bool t + +let test n = + match Some (ref true, Int 42) with + | Some ({ contents = true }, Int n) -> n + | Some ({ contents = false }, Int n) -> -n + | None -> 3 +;; +(* Performance expectation: there should not be a Match_failure case. *) +[%%expect {| +0 +type _ t = Int : int -> int t | Bool : bool -> bool t +(let + (test/325 = + (function n/326 : int + (let + (*match*/329 = + (makeblock 0 (makeblock 0 (makemutable 0 (int) 1) [0: 42]))) + (if *match*/329 + (let + (*match*/330 =a (field_imm 0 *match*/329) + *match*/332 =o (field_mut 0 (field_imm 0 *match*/330))) + (if *match*/332 (field_imm 0 (field_imm 1 *match*/330)) + (~ (field_imm 0 (field_imm 1 *match*/330))))) + 3)))) + (apply (field_mut 1 (global Toploop!)) "test" test/325)) +val test : 'a -> int = +|}] diff --git a/testsuite/tests/match-side-effects/test_contexts_code.ml b/testsuite/tests/match-side-effects/test_contexts_code.ml new file mode 100644 index 00000000000..c2c679de02a --- /dev/null +++ b/testsuite/tests/match-side-effects/test_contexts_code.ml @@ -0,0 +1,126 @@ +(* TEST + readonly_files = "contexts_1.ml contexts_2.ml contexts_3.ml"; + flags = "-dsource -dlambda"; + expect; +*) + +#use "contexts_1.ml";; +(* Notice that (field_mut 1 input) occurs twice, it + is evaluated once in the 'false' branch and once in the 'true' + branch. The compiler assumes that its static knowledge about the + first read (it cannot be a [Right] as we already matched against it + and failed) also applies to the second read, which is unsound. +*) +[%%expect {| + +#use "contexts_1.ml";; + +type u = { + a: bool ; + mutable b: (bool, int) Either.t };; +0 +type u = { a : bool; mutable b : (bool, int) Either.t; } + +let example_1 () = + let input = { a = true; b = (Either.Left true) } in + match input with + | { a = false; b = _ } -> Result.Error 1 + | { a = _; b = Either.Right _ } -> Result.Error 2 + | { a = _; b = _ } when input.b <- (Either.Right 3); false -> + Result.Error 3 + | { a = true; b = Either.Left y } -> Result.Ok y;; +(let + (example_1/310 = + (function param/334[int] + (let (input/312 = (makemutable 0 (int,*) 1 [0: 1])) + (if (field_int 0 input/312) + (let (*match*/337 =o (field_mut 1 input/312)) + (switch* *match*/337 + case tag 0: + (if (seq (setfield_ptr 1 input/312 [1: 3]) 0) [1: 3] + (let (*match*/339 =o (field_mut 1 input/312)) + (makeblock 0 (int) (field_imm 0 *match*/339)))) + case tag 1: [1: 2])) + [1: 1])))) + (apply (field_mut 1 (global Toploop!)) "example_1" example_1/310)) +val example_1 : unit -> (bool, int) Result.t = +|}] + +#use "contexts_2.ml";; +[%%expect {| + +#use "contexts_2.ml";; + +type 'a myref = { + mutable mut: 'a };; +0 +type 'a myref = { mutable mut : 'a; } + +type u = { + a: bool ; + b: (bool, int) Either.t myref };; +0 +type u = { a : bool; b : (bool, int) Either.t myref; } + +let example_2 () = + let input = { a = true; b = { mut = (Either.Left true) } } in + match input with + | { a = false; b = _ } -> Result.Error 1 + | { a = _; b = { mut = Either.Right _ } } -> Result.Error 2 + | { a = _; b = _ } when (input.b).mut <- (Either.Right 3); false -> + Result.Error 3 + | { a = true; b = { mut = Either.Left y } } -> Result.Ok y;; +(let + (example_2/346 = + (function param/350[int] + (let (input/348 = (makeblock 0 (int,*) 1 (makemutable 0 [0: 1]))) + (if (field_int 0 input/348) + (let (*match*/354 =o (field_mut 0 (field_imm 1 input/348))) + (switch* *match*/354 + case tag 0: + (if (seq (setfield_ptr 0 (field_imm 1 input/348) [1: 3]) 0) + [1: 3] + (let (*match*/357 =o (field_mut 0 (field_imm 1 input/348))) + (makeblock 0 (int) (field_imm 0 *match*/357)))) + case tag 1: [1: 2])) + [1: 1])))) + (apply (field_mut 1 (global Toploop!)) "example_2" example_2/346)) +val example_2 : unit -> (bool, int) Result.t = +|}] + +#use "contexts_3.ml";; +[%%expect {| + +#use "contexts_3.ml";; + +type 'a myref = { + mutable mut: 'a };; +0 +type 'a myref = { mutable mut : 'a; } + +type u = (bool * (bool, int) Either.t) myref;; +0 +type u = (bool * (bool, int) Either.t) myref + +let example_3 () = + let input = { mut = (true, (Either.Left true)) } in + match input with + | { mut = (false, _) } -> Result.Error 1 + | { mut = (_, Either.Right _) } -> Result.Error 2 + | { mut = (_, _) } when input.mut <- (true, (Either.Right 3)); false -> + Result.Error 3 + | { mut = (true, Either.Left y) } -> Result.Ok y;; +(let + (example_3/363 = + (function param/367[int] + (let (input/365 =mut [0: 1 [0: 1]] *match*/368 =o *input/365) + (if (field_imm 0 *match*/368) + (switch* (field_imm 1 *match*/368) + case tag 0: + (if (seq (assign input/365 [0: 1 [1: 3]]) 0) [1: 3] + (makeblock 0 (int) (field_imm 0 (field_imm 1 *match*/368)))) + case tag 1: [1: 2]) + [1: 1])))) + (apply (field_mut 1 (global Toploop!)) "example_3" example_3/363)) +val example_3 : unit -> (bool, int) Result.t = +|}] diff --git a/testsuite/tests/match-side-effects/test_contexts_results.ml b/testsuite/tests/match-side-effects/test_contexts_results.ml new file mode 100644 index 00000000000..a4126366cbd --- /dev/null +++ b/testsuite/tests/match-side-effects/test_contexts_results.ml @@ -0,0 +1,43 @@ +(* TEST + readonly_files = "contexts_1.ml contexts_2.ml contexts_3.ml"; + expect; +*) + +#use "contexts_1.ml";; +[%%expect {| +type u = { a : bool; mutable b : (bool, int) Either.t; } +val example_1 : unit -> (bool, int) Result.t = +|}] + +let _ = example_1 ();; +(* means that we got an 'unsound boolean', + which is neither 'true' nor 'false'. There was a bug here! *) +[%%expect {| +- : (bool, int) Result.t = Result.Ok +|}] + +#use "contexts_2.ml";; +[%%expect {| +type 'a myref = { mutable mut : 'a; } +type u = { a : bool; b : (bool, int) Either.t myref; } +val example_2 : unit -> (bool, int) Result.t = +|}];; + +let _ = example_2 ();; +(* Also a bug! *) +[%%expect {| +- : (bool, int) Result.t = Result.Ok +|}] + +#use "contexts_3.ml";; +[%%expect {| +type 'a myref = { mutable mut : 'a; } +type u = (bool * (bool, int) Either.t) myref +val example_3 : unit -> (bool, int) Result.t = +|}];; + +let _ = example_3 ();; +(* This one works correctly. *) +[%%expect {| +- : (bool, int) Result.t = Result.Ok true +|}] diff --git a/testsuite/tests/output-complete-obj/test.ml b/testsuite/tests/output-complete-obj/test.ml index 9e140558a71..57e01d13a33 100644 --- a/testsuite/tests/output-complete-obj/test.ml +++ b/testsuite/tests/output-complete-obj/test.ml @@ -6,7 +6,7 @@ flags = "-w -a -output-complete-obj"; program = "test.ml.bc.${objext}"; ocamlc.byte; - script = "${mkexe} -I${ocamlsrcdir}/runtime -o test.ml_bc_stub.exe test.ml.bc.${objext} ${nativecc_libs} test.ml_stub.c"; + script = "${mkexe} -I${ocamlsrcdir}/runtime -o test.ml_bc_stub.exe test.ml.bc.${objext} ${bytecc_libs} test.ml_stub.c"; output = "${compiler_output}"; script; program = "./test.ml_bc_stub.exe"; @@ -18,7 +18,7 @@ flags = "-w -a -output-complete-obj"; program = "test.ml.exe.${objext}"; ocamlopt.byte; - script = "${mkexe} -I${ocamlsrcdir}/runtime -o test.ml_stub.exe test.ml.exe.${objext} ${bytecc_libs} test.ml_stub.c"; + script = "${mkexe} -I${ocamlsrcdir}/runtime -o test.ml_stub.exe test.ml.exe.${objext} ${nativecc_libs} test.ml_stub.c"; output = "${compiler_output}"; script; program = "./test.ml_stub.exe"; diff --git a/testsuite/tests/parallel/catch_break.ml b/testsuite/tests/parallel/catch_break.ml new file mode 100644 index 00000000000..7febd0454c2 --- /dev/null +++ b/testsuite/tests/parallel/catch_break.ml @@ -0,0 +1,114 @@ +(* TEST +hassysthreads; +include systhreads; +not-windows; +no-tsan; +{ + bytecode; +}{ + native; +} +*) + +(* PR #11307. The following program deadlocks when input in the + toplevel and interrupted by the user with Ctrl-C, by busy-waiting + on signals to be processed. + + {[ +let break_trap s = + (try while true do () done + with Sys.Break -> print_endline "[Sys.Break caught]" ) ; + print_endline s + +let () = + Sys.catch_break true ; + let d = Domain.spawn (fun () -> break_trap "Domain 1") in + break_trap "Domain 0 - 1" ; + Domain.join d ; + break_trap "Domain 0 - 2"; + print_endline "Success." + ]} + +*) + +let verbose = false + +(* Expected when verbose (depending on scheduling and platform): + +[Sys.Break caught] +Domain 1 +[Sys.Break caught] +Domain 0 - 1 +[Sys.Break caught] +Domain 0 - 2 +Success. + +*) + +let delay = 0.001 (* 1 ms *) +let fuel = Atomic.make 1000 (* = 1s max retry duration *) + +let print = if verbose then print_endline else fun _ -> () + +(* start sending interrupts when reaches 1 or 2 *) +let ready_count = Atomic.make 0 + +(* Does not poll *) + +let sleep () = + if Atomic.get fuel <= 0 then ( + print "[Reached max attempts without succeeding]"; + Unix._exit 1 + ); + Atomic.decr fuel; + Unix.sleepf delay + +let rec wait n = + if Atomic.get ready_count <> n then ( + sleep (); + wait n + ) + +(* We busy-wait because other synchronisation mechanisms involve + blocking calls, which may exercise other parts of the async + callback implementation than we want.*) +let break_trap s = + begin + try Atomic.incr ready_count; while true do () done + with Sys.Break -> print "[Sys.Break caught]" + end; + print s; + Atomic.decr ready_count + +(* Simulate repeated Ctrl-C from a parallel thread *) +let interruptor_domain () = + Domain.spawn @@ fun () -> + ignore (Thread.sigmask Unix.SIG_BLOCK [Sys.sigint]); + let kill () = sleep () ; Unix.kill (Unix.getpid ()) Sys.sigint in + wait 2; + kill (); (* interrupt Domain 1 or Domain 0-1 *) + wait 1; + kill (); (* interrupt the other one of Domain 1 or Domain 0-1 *) + wait 2; + kill () (* interrupt Domain 0-2 *) + +let run () = + (* We simulate the user pressing Ctrl-C repeatedly. Goal: joining + the domain [d] must be achievable by Ctrl-C. This tests proper + reception of SIGINT. *) + let d = Domain.spawn (fun () -> break_trap "Domain 1") in + let d2 = interruptor_domain () in + break_trap "Domain 0 - 1"; + Domain.join d; + assert (Atomic.get ready_count = 0); + Atomic.incr ready_count; (* Make sure it reaches 2 *) + break_trap "Domain 0 - 2"; + Domain.join d2 + +let () = + Sys.catch_break true; + (try run () with Sys.Break -> + print ("Test could not complete due to scheduling hazard" + ^ " (possible false positive).")); + print "Success."; + exit 0 diff --git a/testsuite/tests/parallel/domain_parallel_spawn_burn.ml b/testsuite/tests/parallel/domain_parallel_spawn_burn.ml index 85f09bd98bf..5801f3afdbb 100644 --- a/testsuite/tests/parallel/domain_parallel_spawn_burn.ml +++ b/testsuite/tests/parallel/domain_parallel_spawn_burn.ml @@ -29,9 +29,9 @@ let test_parallel_spawn () = done let () = - let running = ref true in + let running = Atomic.make true in let rec run_until_stop fn () = - while !running do + while Atomic.get running do fn (); done in @@ -41,7 +41,7 @@ let () = test_parallel_spawn (); - running := false; + Atomic.set running false; join domain_minor_gc; join domain_major_gc; diff --git a/testsuite/tests/parallel/domain_serial_spawn_burn.ml b/testsuite/tests/parallel/domain_serial_spawn_burn.ml index 7355b2550a7..fb931e298a6 100644 --- a/testsuite/tests/parallel/domain_serial_spawn_burn.ml +++ b/testsuite/tests/parallel/domain_serial_spawn_burn.ml @@ -37,9 +37,9 @@ let test_serial_domain_spawn () = done let () = - let running = ref true in + let running = Atomic.make true in let rec run_until_stop fn () = - while !running do + while Atomic.get running do fn (); done in @@ -49,7 +49,7 @@ let () = test_serial_domain_spawn (); - running := false; + Atomic.set running false; join domain_minor_gc; join domain_major_gc; diff --git a/testsuite/tests/printing-types/existentials.ml b/testsuite/tests/printing-types/existentials.ml new file mode 100644 index 00000000000..464881f6d7c --- /dev/null +++ b/testsuite/tests/printing-types/existentials.ml @@ -0,0 +1,112 @@ +(* TEST + expect; +*) + +type foo1 = + | Foo : ('a * 'b * 'c * 'd * 'e * 'f) -> foo1 + +let bar1 x = + match x with + | Foo a -> a + 1 + | _ -> 0 +;; +[%%expect {| +type foo1 = Foo : ('a * 'b * 'c * 'd * 'e * 'f) -> foo1 +Line 6, characters 13-14: +6 | | Foo a -> a + 1 + ^ +Error: This expression has type "$a * $b * $c * $d * $e * $f" + but an expression was expected of type "int" + Hint: "$a", "$b", "$c", "$d", "$e" and "$f" are existential types + bound by the constructor "Foo". +|}] + +type foo2 = + | Foo1 : 'a -> foo2 + | Foo2 : 'a -> foo2 + | Foo3 : 'a -> foo2 + | Foo4 : 'a -> foo2 + | Foo5 : 'a -> foo2 + | Foo6 : 'a -> foo2 + | Foo7 : 'a -> foo2 + +let bar2 x = + match x with + | Foo1 a1, Foo2 a2, Foo3 a3, Foo4 a4, Foo5 a5, Foo6 a6, Foo7 a7 -> + let x = (a1, a2, a3, a4, a5, a6, a7) in x + 1 + | _ -> 0 +;; +[%%expect {| +type foo2 = + Foo1 : 'a -> foo2 + | Foo2 : 'a -> foo2 + | Foo3 : 'a -> foo2 + | Foo4 : 'a -> foo2 + | Foo5 : 'a -> foo2 + | Foo6 : 'a -> foo2 + | Foo7 : 'a -> foo2 +Line 13, characters 46-47: +13 | let x = (a1, a2, a3, a4, a5, a6, a7) in x + 1 + ^ +Error: This expression has type "$a * $a1 * $a2 * $a3 * $a4 * $a5 * $a6" + but an expression was expected of type "int" + Hint: "$a" is an existential type bound by the constructor "Foo1". + Hint: "$a1" is an existential type bound by the constructor "Foo2". + Hint: "$a2" is an existential type bound by the constructor "Foo3". + Hint: "$a3" is an existential type bound by the constructor "Foo4". + Hint: "$a4" is an existential type bound by the constructor "Foo5". + Hint: "$a5" is an existential type bound by the constructor "Foo6". + Hint: "$a6" is an existential type bound by the constructor "Foo7". +|}] + +type foo3 = + | Foo1 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + | Foo2 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + | Foo3 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + | Foo4 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + | Foo5 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + | Foo6 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + | Foo7 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + +let bar2 x = + match x with + | Foo1 a1, Foo2 a2, Foo3 a3, Foo4 a4, Foo5 a5, Foo6 a6, Foo7 a7 -> + let x = (a1, a2, a3, a4, a5, a6, a7) in x + 1 + | _ -> 0 +;; +[%%expect {| +type foo3 = + Foo1 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + | Foo2 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + | Foo3 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + | Foo4 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + | Foo5 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + | Foo6 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 + | Foo7 : ('a * 'b * 'c * 'd * 'e * 'f) -> foo3 +Line 13, characters 46-47: +13 | let x = (a1, a2, a3, a4, a5, a6, a7) in x + 1 + ^ +Error: This expression has type + "($a * $b * $c * $d * $e * $f) * + ($a1 * $b1 * $c1 * $d1 * $e1 * $f1) * + ($a2 * $b2 * $c2 * $d2 * $e2 * $f2) * + ($a3 * $b3 * $c3 * $d3 * $e3 * $f3) * + ($a4 * $b4 * $c4 * $d4 * $e4 * $f4) * + ($a5 * $b5 * $c5 * $d5 * $e5 * $f5) * + ($a6 * $b6 * $c6 * $d6 * $e6 * $f6)" + but an expression was expected of type "int" + Hint: "$a", "$b", "$c", "$d", "$e" and "$f" are existential types + bound by the constructor "Foo1". + Hint: "$a1", "$b1", "$c1", "$d1", "$e1" and "$f1" are existential types + bound by the constructor "Foo2". + Hint: "$a2", "$b2", "$c2", "$d2", "$e2" and "$f2" are existential types + bound by the constructor "Foo3". + Hint: "$a3", "$b3", "$c3", "$d3", "$e3" and "$f3" are existential types + bound by the constructor "Foo4". + Hint: "$a4", "$b4", "$c4", "$d4", "$e4" and "$f4" are existential types + bound by the constructor "Foo5". + Hint: "$a5", "$b5", "$c5", "$d5", "$e5" and "$f5" are existential types + bound by the constructor "Foo6". + Hint: "$a6", "$b6", "$c6", "$d6", "$e6" and "$f6" are existential types + bound by the constructor "Foo7". +|}] diff --git a/testsuite/tests/self-contained-toplevel/main.ml b/testsuite/tests/self-contained-toplevel/main.ml index c3342b6b405..06643df5b1b 100644 --- a/testsuite/tests/self-contained-toplevel/main.ml +++ b/testsuite/tests/self-contained-toplevel/main.ml @@ -23,14 +23,15 @@ let () = if Sys.file_exists "foo.cmi" then Sys.remove "foo.cmi"; let module Persistent_signature = Persistent_env.Persistent_signature in let old_loader = !Persistent_signature.load in - Persistent_signature.load := (fun ~unit_name -> + Persistent_signature.load := (fun ~allow_hidden ~unit_name -> match unit_name with | "Foo" -> Some { Persistent_signature. - filename = Sys.executable_name - ; cmi = Marshal.from_string Cached_cmi.foo 0 + filename = Sys.executable_name + ; cmi = Marshal.from_string Cached_cmi.foo 0 + ; visibility = Visible } - | _ -> old_loader unit_name); + | _ -> old_loader ~allow_hidden ~unit_name); Toploop.add_hook (function | Toploop.After_setup -> Toploop.toplevel_env := diff --git a/testsuite/tests/shapes/comp_units.ml b/testsuite/tests/shapes/comp_units.ml index c4da2e8b85e..b3ed56c0b40 100644 --- a/testsuite/tests/shapes/comp_units.ml +++ b/testsuite/tests/shapes/comp_units.ml @@ -25,7 +25,7 @@ module Mproj = Unit module F (X : sig type t end) = X [%%expect{| { - "F"[module] -> Abs<.4>(X/279, X/279<.3>); + "F"[module] -> Abs<.4>(X/280, X/280<.3>); } module F : functor (X : sig type t end) -> sig type t = X.t end |}] diff --git a/testsuite/tests/shapes/functors.ml b/testsuite/tests/shapes/functors.ml index fee5c96244e..a42beb1c4dc 100644 --- a/testsuite/tests/shapes/functors.ml +++ b/testsuite/tests/shapes/functors.ml @@ -17,7 +17,7 @@ module type S = sig type t val x : t end module Falias (X : S) = X [%%expect{| { - "Falias"[module] -> Abs<.4>(X/281, X/281<.3>); + "Falias"[module] -> Abs<.4>(X/282, X/282<.3>); } module Falias : functor (X : S) -> sig type t = X.t val x : t end |}] @@ -29,10 +29,10 @@ end { "Finclude"[module] -> Abs<.6> - (X/285, + (X/286, { - "t"[type] -> X/285<.5> . "t"[type]; - "x"[value] -> X/285<.5> . "x"[value]; + "t"[type] -> X/286<.5> . "t"[type]; + "x"[value] -> X/286<.5> . "x"[value]; }); } module Finclude : functor (X : S) -> sig type t = X.t val x : t end @@ -45,7 +45,7 @@ end [%%expect{| { "Fredef"[module] -> - Abs<.10>(X/292, { + Abs<.10>(X/293, { "t"[type] -> <.8>; "x"[value] -> <.9>; }); @@ -223,8 +223,8 @@ module Big_to_small1 : B2S = functor (X : Big) -> X [%%expect{| { "Big_to_small1"[module] -> - Abs<.40>(X/387, {<.39> - "t"[type] -> X/387<.39> . "t"[type]; + Abs<.40>(X/388, {<.39> + "t"[type] -> X/388<.39> . "t"[type]; }); } module Big_to_small1 : B2S @@ -234,8 +234,8 @@ module Big_to_small2 : B2S = functor (X : Big) -> struct include X end [%%expect{| { "Big_to_small2"[module] -> - Abs<.42>(X/390, { - "t"[type] -> X/390<.41> . "t"[type]; + Abs<.42>(X/391, { + "t"[type] -> X/391<.41> . "t"[type]; }); } module Big_to_small2 : B2S diff --git a/testsuite/tests/shapes/open_arg.ml b/testsuite/tests/shapes/open_arg.ml index ef98e68cf83..a66c190d31d 100644 --- a/testsuite/tests/shapes/open_arg.ml +++ b/testsuite/tests/shapes/open_arg.ml @@ -22,7 +22,7 @@ end = struct end [%%expect{| { - "Make"[module] -> Abs<.3>(I/281, { + "Make"[module] -> Abs<.3>(I/282, { }); } module Make : functor (I : sig end) -> sig end diff --git a/testsuite/tests/shapes/recmodules.ml b/testsuite/tests/shapes/recmodules.ml index f8523584367..bd2239c6ccf 100644 --- a/testsuite/tests/shapes/recmodules.ml +++ b/testsuite/tests/shapes/recmodules.ml @@ -43,8 +43,8 @@ and B : sig end = B [%%expect{| { - "A"[module] -> A/304<.11>; - "B"[module] -> B/305<.12>; + "A"[module] -> A/305<.11>; + "B"[module] -> B/306<.12>; } module rec A : sig type t = Leaf of B.t end and B : sig type t = int end @@ -82,12 +82,12 @@ end = Set.Make(A) "ASet"[module] -> { "compare"[value] -> - CU Stdlib . "Set"[module] . "Make"[module](A/326<.19>) . + CU Stdlib . "Set"[module] . "Make"[module](A/327<.19>) . "compare"[value]; "elt"[type] -> - CU Stdlib . "Set"[module] . "Make"[module](A/326<.19>) . "elt"[type]; + CU Stdlib . "Set"[module] . "Make"[module](A/327<.19>) . "elt"[type]; "t"[type] -> - CU Stdlib . "Set"[module] . "Make"[module](A/326<.19>) . "t"[type]; + CU Stdlib . "Set"[module] . "Make"[module](A/327<.19>) . "t"[type]; }; } module rec A : diff --git a/testsuite/tests/shapes/rotor_example.ml b/testsuite/tests/shapes/rotor_example.ml index 924d63b553c..f57824a7bb2 100644 --- a/testsuite/tests/shapes/rotor_example.ml +++ b/testsuite/tests/shapes/rotor_example.ml @@ -25,7 +25,7 @@ end [%%expect{| { "Pair"[module] -> - Abs<.9>(X/281, Y/282, { + Abs<.9>(X/282, Y/283, { "t"[type] -> <.5>; "to_string"[value] -> <.6>; }); diff --git a/testsuite/tests/syntactic-arity/measure_runtime_arity.ml b/testsuite/tests/syntactic-arity/measure_runtime_arity.ml new file mode 100644 index 00000000000..a9203c7213b --- /dev/null +++ b/testsuite/tests/syntactic-arity/measure_runtime_arity.ml @@ -0,0 +1,128 @@ +(* TEST + flags = "-w +A-70"; + setup-ocamlopt.byte-build-env; + ocamlopt.byte; + run; + check-program-output; +*) + +(* Check that the runtime arity of a function (i.e., its 'fast path' for + runtime application) matches its syntactic arity (i.e., the number + of arguments appearing directly following [fun]). +*) + +(* This function will need to change if the runtime representation of closures + changes. Currently, the arity is the first 8 bits of the second field of + a closure. +*) +let extract_arity_from_closure (closure : Obj.t) : int = + assert (Obj.closure_tag = Obj.tag closure); + let clos_info = Obj.raw_field (Obj.repr closure) 1 in + Nativeint.(to_int (shift_right clos_info (Sys.word_size - 8))) + +type (_, _) raw_arity = + | One : (int -> 'ret, 'ret) raw_arity + | Succ : ('f, 'ret) raw_arity -> (int -> 'f, 'ret) raw_arity + +let rec numeric_arity : type f ret. (f, ret) raw_arity -> int = + fun arity -> + match arity with + | One -> 1 + | Succ arity -> numeric_arity arity + 1 + +let rec apply : type f ret. (f, ret) raw_arity -> f -> int -> ret = + fun arity f arg -> + match arity with + | One -> f arg + | Succ arity -> apply arity (f arg) arg + +type 'a arity = + | Tupled + | Curried : ('a, _) raw_arity -> 'a arity + +type packed_raw_arity = Packed_raw_arity : _ raw_arity -> packed_raw_arity +type packed_arity = Packed_arity : _ arity -> packed_arity + +let arity_description (type a) (arity : a arity) = + match arity with + | Tupled -> "tupled fun" + | Curried arity -> Printf.sprintf "%d-ary fun" (numeric_arity arity) + +(* [runtime_arity] depends on representation details of functions and + is subject to change. +*) +let runtime_arity (f : 'a -> 'b) : ('a -> 'b) arity = + let raw_arity = extract_arity_from_closure (Obj.repr f) in + if raw_arity < 0 then Tupled else + let rec build_arity n = + if n = 1 then Packed_raw_arity One + else + let Packed_raw_arity pred = build_arity (n-1) in + Packed_raw_arity (Succ pred) + in + let Packed_raw_arity arity = build_arity raw_arity in + (* Obj.magic is claiming that [f]'s arity matches the arity + we've constructed here. + *) + Curried (Obj.magic arity : ('a -> 'b, _) raw_arity) + +let maybe_runtime_arity (type a) (x : a) : a arity option = + let open struct + type _ is_function = + | Not_function : _ is_function + | Is_function : (_ -> _) is_function + + let is_function (type a) (x : a) = + if Obj.tag (Obj.repr x) = Obj.closure_tag + then (Obj.magic Is_function : a is_function) + else Not_function + end + in + match is_function x with + | Is_function -> Some (runtime_arity x) + | Not_function -> None + +(* The "nested arity" of a value is either: + - the empty list, if the value isn't a function + - x :: xs if the value is a function [f], where [x] is [f]'s arity, and + [xs] is the nested arity of the result of applying [f] to [x] many + values. + + "nested arity" isn't well-defined for a function that, say, returns a 2-ary + function for some inputs and a 3-ary for others. None of the functions in + this test do that. +*) +let rec nested_arity : type a. a -> packed_arity list = + fun f -> + match maybe_runtime_arity f with + | None -> [] + | Some x -> + let rest = + match x with + | Tupled -> [] + | Curried arity -> nested_arity (apply arity f 1_234) + in + Packed_arity x :: rest + +let run ~name f = + Printf.printf "%s: %s\n" name + (nested_arity f + |> List.map (fun (Packed_arity arity) -> arity_description arity) + |> String.concat " returning ") + +let () = + print_endline "Key:"; + print_endline " : "; + print_newline (); + run (fun _ _ _ -> ()) ~name:"3 params"; + run (fun _ _ -> fun _ -> ()) ~name:"2 params then 1 param"; + run (fun _ -> fun _ _ -> ()) ~name:"1 param then 2 params"; + run (fun _ -> fun _ -> fun _ -> ()) + ~name:"1 param, then 1 param, then 1 param"; + run (fun _ -> let g _ _ = () in g) + ~name:"1 param then let-bound 2 params"; + run (fun _ _ -> let g _ = () in g) + ~name:"2 params then let-bound 1 param"; + run (fun _ -> let g _ = let h _ = () in h in g) + ~name:"1 param, then let-bound 1 param, then let-bound 1 param"; +;; diff --git a/testsuite/tests/syntactic-arity/measure_runtime_arity.reference b/testsuite/tests/syntactic-arity/measure_runtime_arity.reference new file mode 100644 index 00000000000..9f1e7c56c3e --- /dev/null +++ b/testsuite/tests/syntactic-arity/measure_runtime_arity.reference @@ -0,0 +1,10 @@ +Key: + : + +3 params: 3-ary fun +2 params then 1 param: 2-ary fun returning 1-ary fun +1 param then 2 params: 1-ary fun returning 2-ary fun +1 param, then 1 param, then 1 param: 1-ary fun returning 1-ary fun returning 1-ary fun +1 param then let-bound 2 params: 1-ary fun returning 2-ary fun +2 params then let-bound 1 param: 2-ary fun returning 1-ary fun +1 param, then let-bound 1 param, then let-bound 1 param: 1-ary fun returning 1-ary fun returning 1-ary fun diff --git a/testsuite/tests/tool-command-line/test-no-input-file.compilers.reference b/testsuite/tests/tool-command-line/test-no-input-file.compilers.reference new file mode 100644 index 00000000000..ad3071c5dfb --- /dev/null +++ b/testsuite/tests/tool-command-line/test-no-input-file.compilers.reference @@ -0,0 +1,2 @@ +No input files +No input files diff --git a/testsuite/tests/tool-command-line/test-no-input-file.ml b/testsuite/tests/tool-command-line/test-no-input-file.ml new file mode 100644 index 00000000000..b3279496496 --- /dev/null +++ b/testsuite/tests/tool-command-line/test-no-input-file.ml @@ -0,0 +1,16 @@ +(* TEST + setup-ocamlopt.opt-build-env; + all_modules = ""; + compile_only = "true"; + ocamlopt_opt_exit_status = "2"; + flags = ""; + ocamlopt.opt; + flags = "-o test.exe"; + ocamlopt.opt; + check-ocamlopt.opt-output; +*) + +(* + This file is just a test driver, the test does not contain any + real OCaml code + *) diff --git a/testsuite/tests/tool-command-line/test-unknown-file.compilers.reference b/testsuite/tests/tool-command-line/test-unknown-file.compilers.reference index 9182c8a7201..9099e9e4ae2 100644 --- a/testsuite/tests/tool-command-line/test-unknown-file.compilers.reference +++ b/testsuite/tests/tool-command-line/test-unknown-file.compilers.reference @@ -1 +1 @@ -don't know what to do with unknown-file +Don't know what to do with unknown-file diff --git a/testsuite/tests/tool-ocamlc-locations/foo.ml b/testsuite/tests/tool-ocamlc-locations/foo.ml new file mode 100644 index 00000000000..3f07fb9a9e4 --- /dev/null +++ b/testsuite/tests/tool-ocamlc-locations/foo.ml @@ -0,0 +1 @@ +let x : int = true diff --git a/testsuite/tests/tool-ocamlc-locations/marshalled.compilers.reference b/testsuite/tests/tool-ocamlc-locations/marshalled.compilers.reference new file mode 100644 index 00000000000..770d3bfc37c --- /dev/null +++ b/testsuite/tests/tool-ocamlc-locations/marshalled.compilers.reference @@ -0,0 +1,5 @@ +File "foo.ml", line 1, characters 14-18: +1 | let x : int = true + ^^^^ +Error: This expression has type "bool" but an expression was expected of type + "int" diff --git a/testsuite/tests/tool-ocamlc-locations/marshalled.ml b/testsuite/tests/tool-ocamlc-locations/marshalled.ml new file mode 100644 index 00000000000..ca1c7065615 --- /dev/null +++ b/testsuite/tests/tool-ocamlc-locations/marshalled.ml @@ -0,0 +1,24 @@ +(* TEST + readonly_files="foo.ml"; + setup-ocamlc.byte-build-env; + { + include ocamlcommon; + program = "marshalled.byte"; + all_modules = "marshalled.ml"; + ocamlc.byte; + script = "./marshalled.byte"; + script; + } + { + all_modules = "foo.marshalled.ml"; + ocamlc_byte_exit_status = "2"; + ocamlc.byte; + check-ocamlc.byte-output; + } +*) + +(* This is a repro case for #12697 *) + +let () = + let ast = Pparse.parse_implementation ~tool_name:"test" "foo.ml" in + Pparse.write_ast Pparse.Structure "foo.marshalled.ml" ast diff --git a/testsuite/tests/tool-toplevel/multi_phrase_line.compilers.reference b/testsuite/tests/tool-toplevel/multi_phrase_line.compilers.reference new file mode 100644 index 00000000000..d02a6629bb4 --- /dev/null +++ b/testsuite/tests/tool-toplevel/multi_phrase_line.compilers.reference @@ -0,0 +1,70 @@ +# - : unit = () +# - : int = 1 +- : int = 2 +# - : int = 3 +- : unit = () +# - : int = 5 +- : unit = () +# * - : int = 7 +# * Line 2, characters 6-9: +2 | 750;; (*) comment-start warning after semicolon must be displayed once + ^^^ +Warning 1 [comment-start]: this `(*' is the start of a comment. +Hint: Did you forget spaces when writing the infix operator `( * )'? + +- : int = 750 +# Line 2, characters 9-11: +2 | 8;; let 9;; 10;; (* Syntax error in second phrase. *) + ^^ +Error: Syntax error +# - : int = 11 +Line 2, characters 16-20: +2 | 11;; let x = 12+true;; 13;; (* Type error in second phrase. *) + ^^^^ +Error: This expression has type "bool" but an expression was expected of type + "int" +# Line 2, characters 0-22: +2 | match 14 with 15 -> ();; 16;; 17;; (* Warning + run-time error in 1st phrase. *) + ^^^^^^^^^^^^^^^^^^^^^^ +Warning 8 [partial-match]: this pattern-matching is not exhaustive. +Here is an example of a case that is not matched: +0 + +Exception: Match_failure ("//toplevel//", 2, 0). +- : int = 16 +- : int = 17 +# - : int = 18 +Line 2, characters 5-27: +2 | 18;; match 19 with 20 -> ();; 21;; (* Warning + run-time error in 2nd phrase. *) + ^^^^^^^^^^^^^^^^^^^^^^ +Warning 8 [partial-match]: this pattern-matching is not exhaustive. +Here is an example of a case that is not matched: +0 + +Exception: Match_failure ("//toplevel//", 2, 5). +- : int = 21 +# Line 2, characters 6-8: +2 | let f 22 = ();; let f 23 = ();; let f 24 = ();; (* Several warnings. *) + ^^ +Warning 8 [partial-match]: this pattern-matching is not exhaustive. +Here is an example of a case that is not matched: +0 + +val f : int -> unit = +Line 2, characters 22-24: +2 | let f 22 = ();; let f 23 = ();; let f 24 = ();; (* Several warnings. *) + ^^ +Warning 8 [partial-match]: this pattern-matching is not exhaustive. +Here is an example of a case that is not matched: +0 + +val f : int -> unit = +Line 2, characters 38-40: +2 | let f 22 = ();; let f 23 = ();; let f 24 = ();; (* Several warnings. *) + ^^ +Warning 8 [partial-match]: this pattern-matching is not exhaustive. +Here is an example of a case that is not matched: +0 + +val f : int -> unit = +# * * * diff --git a/testsuite/tests/tool-toplevel/multi_phrase_line.ml b/testsuite/tests/tool-toplevel/multi_phrase_line.ml new file mode 100644 index 00000000000..939913047e4 --- /dev/null +++ b/testsuite/tests/tool-toplevel/multi_phrase_line.ml @@ -0,0 +1,32 @@ +(* TEST_BELOW *) + +Printexc.record_backtrace false;; + +1;; 2;; (* Two phrases on the same line *) + +3;; ignore +4;; (* Wait for ;; at end of line before evaluating anything. *) + +5;; ignore +6;; (* Very long line needs buffer refills. *) + +7;; (* linefeed in a comment after double-semi +*) + +750;; (*) comment-start warning after semicolon must be displayed once +*) + +8;; let 9;; 10;; (* Syntax error in second phrase. *) + +11;; let x = 12+true;; 13;; (* Type error in second phrase. *) + +match 14 with 15 -> ();; 16;; 17;; (* Warning + run-time error in 1st phrase. *) + +18;; match 19 with 20 -> ();; 21;; (* Warning + run-time error in 2nd phrase. *) + +let f 22 = ();; let f 23 = ();; let f 24 = ();; (* Several warnings. *) + +(* TEST + flags = "-prompt"; + toplevel; +*) diff --git a/testsuite/tests/tool-toplevel/topeval.ml b/testsuite/tests/tool-toplevel/topeval.ml index 71db9d80a94..a9888c62c51 100644 --- a/testsuite/tests/tool-toplevel/topeval.ml +++ b/testsuite/tests/tool-toplevel/topeval.ml @@ -55,3 +55,13 @@ external foo : int -> int -> int = "%addint" module S = String let x = 42 ;; + +(* Check that frametables are correctly loaded by triggering GC *) +let () = + Gc.minor (); + let r = List.init 1000 Sys.opaque_identity in + Gc.minor (); + let _ = Sys.opaque_identity (List.init 1000 (fun _ -> "!")) in + List.iteri (fun i j -> assert (i = j)) r; + () +;; diff --git a/testsuite/tests/translprim/comparison_optim.ml b/testsuite/tests/translprim/comparison_optim.ml new file mode 100644 index 00000000000..ebadbe8b4b1 --- /dev/null +++ b/testsuite/tests/translprim/comparison_optim.ml @@ -0,0 +1,103 @@ +(* TEST *) + +let check_list name list = + Printf.printf "testing %S...\n" name; + List.iteri + (fun i (x, y) -> + Printf.printf " #%d: %s\n" + i + (if x = y then "OK" else "KO")) + list; + Printf.printf "\n%!" + +let check_int () = check_list "int" [ + compare (Sys.opaque_identity 1) 2 <= 0, true; + compare (Sys.opaque_identity 3) 3 <= 0, true; + compare (Sys.opaque_identity 1) min_int <= 0, false; + compare (Sys.opaque_identity 1) 2 < 0, true; + compare (Sys.opaque_identity 3) 3 < 0, false; + compare (Sys.opaque_identity 1) min_int < 0, false; + compare (Sys.opaque_identity max_int) (-1) >= 0, true; + compare (Sys.opaque_identity 3) 3 >= 0, true; + compare (Sys.opaque_identity 2) min_int >= 0, true; + compare (Sys.opaque_identity max_int) (-1) > 0, true; + compare (Sys.opaque_identity 3) 3 > 0, false; + compare (Sys.opaque_identity 2) min_int > 0, true; + compare (Sys.opaque_identity min_int) min_int = 0, true; + compare (Sys.opaque_identity max_int) max_int = 0, true; + compare (Sys.opaque_identity 1) 2 = 0, false; + compare (Sys.opaque_identity min_int) min_int <> 0, false; + compare (Sys.opaque_identity max_int) max_int <> 0, false; + compare (Sys.opaque_identity 1) 2 <> 0, true; +] + +let () = check_int () + +let check_int32 () = check_list "int32" [ + compare (Sys.opaque_identity 1l) 2l <= 0, true; + compare (Sys.opaque_identity 3l) 3l <= 0, true; + compare (Sys.opaque_identity 1l) Int32.min_int <= 0, false; + compare (Sys.opaque_identity 1l) 2l < 0, true; + compare (Sys.opaque_identity 3l) 3l < 0, false; + compare (Sys.opaque_identity 1l) Int32.min_int < 0, false; + compare (Sys.opaque_identity Int32.max_int) (-1l) >= 0, true; + compare (Sys.opaque_identity 3l) 3l >= 0, true; + compare (Sys.opaque_identity 2l) Int32.min_int >= 0, true; + compare (Sys.opaque_identity Int32.max_int) (-1l) > 0, true; + compare (Sys.opaque_identity 3l) 3l > 0, false; + compare (Sys.opaque_identity 2l) Int32.min_int > 0, true; + compare (Sys.opaque_identity Int32.min_int) Int32.min_int = 0, true; + compare (Sys.opaque_identity Int32.max_int) Int32.max_int = 0, true; + compare (Sys.opaque_identity 1l) 2l = 0, false; + compare (Sys.opaque_identity Int32.min_int) Int32.min_int <> 0, false; + compare (Sys.opaque_identity Int32.max_int) Int32.max_int <> 0, false; + compare (Sys.opaque_identity 1l) 2l <> 0, true; +] + +let () = check_int32 () + +let check_int64 () = check_list "int64" [ + compare (Sys.opaque_identity 1L) 2L <= 0, true; + compare (Sys.opaque_identity 3L) 3L <= 0, true; + compare (Sys.opaque_identity 1L) Int64.min_int <= 0, false; + compare (Sys.opaque_identity 1L) 2L < 0, true; + compare (Sys.opaque_identity 3L) 3L < 0, false; + compare (Sys.opaque_identity 1L) Int64.min_int < 0, false; + compare (Sys.opaque_identity Int64.max_int) (-1L) >= 0, true; + compare (Sys.opaque_identity 3L) 3L >= 0, true; + compare (Sys.opaque_identity 2L) Int64.min_int >= 0, true; + compare (Sys.opaque_identity Int64.max_int) (-1L) > 0, true; + compare (Sys.opaque_identity 3L) 3L > 0, false; + compare (Sys.opaque_identity 2L) Int64.min_int > 0, true; + compare (Sys.opaque_identity Int64.min_int) Int64.min_int = 0, true; + compare (Sys.opaque_identity Int64.max_int) Int64.max_int = 0, true; + compare (Sys.opaque_identity 1L) 2L = 0, false; + compare (Sys.opaque_identity Int64.min_int) Int64.min_int <> 0, false; + compare (Sys.opaque_identity Int64.max_int) Int64.max_int <> 0, false; + compare (Sys.opaque_identity 1L) 2L <> 0, true; +] + +let () = check_int64 () + +let check_nativeint () = check_list "nativeint" [ + compare (Sys.opaque_identity 1n) 2n <= 0, true; + compare (Sys.opaque_identity 3n) 3n <= 0, true; + compare (Sys.opaque_identity 1n) Nativeint.min_int <= 0, false; + compare (Sys.opaque_identity 1n) 2n < 0, true; + compare (Sys.opaque_identity 3n) 3n < 0, false; + compare (Sys.opaque_identity 1n) Nativeint.min_int < 0, false; + compare (Sys.opaque_identity Nativeint.max_int) (-1n) >= 0, true; + compare (Sys.opaque_identity 3n) 3n >= 0, true; + compare (Sys.opaque_identity 2n) Nativeint.min_int >= 0, true; + compare (Sys.opaque_identity Nativeint.max_int) (-1n) > 0, true; + compare (Sys.opaque_identity 3n) 3n > 0, false; + compare (Sys.opaque_identity 2n) Nativeint.min_int > 0, true; + compare (Sys.opaque_identity Nativeint.min_int) Nativeint.min_int = 0, true; + compare (Sys.opaque_identity Nativeint.max_int) Nativeint.max_int = 0, true; + compare (Sys.opaque_identity 1n) 2n = 0, false; + compare (Sys.opaque_identity Nativeint.min_int) Nativeint.min_int <> 0, false; + compare (Sys.opaque_identity Nativeint.max_int) Nativeint.max_int <> 0, false; + compare (Sys.opaque_identity 1n) 2n <> 0, true; +] + +let () = check_nativeint () diff --git a/testsuite/tests/translprim/comparison_optim.reference b/testsuite/tests/translprim/comparison_optim.reference new file mode 100644 index 00000000000..d1a54215e02 --- /dev/null +++ b/testsuite/tests/translprim/comparison_optim.reference @@ -0,0 +1,80 @@ +testing "int"... + #0: OK + #1: OK + #2: OK + #3: OK + #4: OK + #5: OK + #6: OK + #7: OK + #8: OK + #9: OK + #10: OK + #11: OK + #12: OK + #13: OK + #14: OK + #15: OK + #16: OK + #17: OK + +testing "int32"... + #0: OK + #1: OK + #2: OK + #3: OK + #4: OK + #5: OK + #6: OK + #7: OK + #8: OK + #9: OK + #10: OK + #11: OK + #12: OK + #13: OK + #14: OK + #15: OK + #16: OK + #17: OK + +testing "int64"... + #0: OK + #1: OK + #2: OK + #3: OK + #4: OK + #5: OK + #6: OK + #7: OK + #8: OK + #9: OK + #10: OK + #11: OK + #12: OK + #13: OK + #14: OK + #15: OK + #16: OK + #17: OK + +testing "nativeint"... + #0: OK + #1: OK + #2: OK + #3: OK + #4: OK + #5: OK + #6: OK + #7: OK + #8: OK + #9: OK + #10: OK + #11: OK + #12: OK + #13: OK + #14: OK + #15: OK + #16: OK + #17: OK + diff --git a/testsuite/tests/tsan/array_elt.ml b/testsuite/tests/tsan/array_elt.ml index 52b7b92b76d..dd0a9eb0a2f 100644 --- a/testsuite/tests/tsan/array_elt.ml +++ b/testsuite/tests/tsan/array_elt.ml @@ -4,12 +4,23 @@ set TSAN_OPTIONS="detect_deadlocks=0"; tsan; + readonly_files = "waitgroup_stubs.c"; + all_modules = "${readonly_files} waitgroup.ml array_elt.ml"; native; *) +let wg = Waitgroup.create 2 + +let [@inline never] writer v () = + Waitgroup.join wg; + Array.set v 3 0 + +let [@inline never] reader v = + ignore (Sys.opaque_identity (Array.get v 3)); + Waitgroup.join wg + let () = let v = Array.make 4 0 in - let t1 = Domain.spawn (fun () -> Array.set v 3 0; Unix.sleepf 0.1) in - let t2 = Domain.spawn (fun () -> ignore (Sys.opaque_identity (Array.get v 3)); Unix.sleepf 0.1) in - Domain.join t1; - Domain.join t2; + let d = Domain.spawn (writer v) in + reader v; + Domain.join d diff --git a/testsuite/tests/tsan/array_elt.reference b/testsuite/tests/tsan/array_elt.reference index 716e76937d2..549cfd4c0d1 100644 --- a/testsuite/tests/tsan/array_elt.reference +++ b/testsuite/tests/tsan/array_elt.reference @@ -1,12 +1,19 @@ ================== WARNING: ThreadSanitizer: data race (pid=) - Read of size 8 at by thread T4 (mutexes: write M): - #0 camlArray_elt.fun_ () + Write of size 8 at by thread T1 (mutexes: write M): + #0 camlArray_elt.writer_ () #1 camlStdlib__Domain.body_ () - Previous write of size 8 at by thread T1 (mutexes: write M): - #0 camlArray_elt.fun_ () - #1 camlStdlib__Domain.body_ () + Previous read of size 8 at by main thread (mutexes: write M): + #0 camlArray_elt.reader_ () + #1 camlArray_elt.entry () + #2 caml_program () + + As if synchronized via sleep: + #0 usleep () + #1 wg_wait () + #2 camlArray_elt.writer_ () + #3 camlStdlib__Domain.body_ () Mutex M () created at: #0 pthread_mutex_init () @@ -20,14 +27,6 @@ WARNING: ThreadSanitizer: data race (pid=) #2 caml_init_domains () #3 caml_init_gc () - Thread T4 (tid=, running) created by main thread at: - #0 pthread_create () - #1 caml_domain_spawn () - #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlArray_elt.entry () - #5 caml_program () - Thread T1 (tid=, running) created by main thread at: #0 pthread_create () #1 caml_domain_spawn () @@ -36,6 +35,6 @@ WARNING: ThreadSanitizer: data race (pid=) #4 camlArray_elt.entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlArray_elt.fun_ +SUMMARY: ThreadSanitizer: data race (:) in camlArray_elt.writer_ ================== ThreadSanitizer: reported 1 warnings diff --git a/testsuite/tests/tsan/exn_from_c.ml b/testsuite/tests/tsan/exn_from_c.ml index 2e79ef71dec..335cd03623c 100644 --- a/testsuite/tests/tsan/exn_from_c.ml +++ b/testsuite/tests/tsan/exn_from_c.ml @@ -1,12 +1,12 @@ (* TEST - modules = "callbacks.c"; - ocamlopt_flags = "-g -ccopt -fsanitize=thread -ccopt -O1 -ccopt -fno-omit-frame-pointer -ccopt -g"; include unix; set TSAN_OPTIONS="detect_deadlocks=0"; tsan; + readonly_files = "callbacks.c waitgroup_stubs.c"; + all_modules = "${readonly_files} waitgroup.ml exn_from_c.ml"; native; *) @@ -15,37 +15,44 @@ external print_and_raise : unit -> unit = "print_and_raise" open Printf +let wg = Waitgroup.create 2 let r = ref 0 -let [@inline never] race () = ignore @@ !r +let [@inline never] race () = + ignore @@ !r; + Waitgroup.join wg let [@inline never] i () = - printf "entering i\n%!"; - printf "calling print_and_raise...\n%!"; + printf "Entering i\n%!"; + printf "Calling print_and_raise...\n%!"; print_and_raise (); - printf "leaving i\n%!" + printf "Leaving i\n%!" let [@inline never] h () = - printf "entering h\n%!"; + printf "Entering h\n%!"; i (); - printf "leaving h\n%!" + printf "Leaving h\n%!" let [@inline never] g () = - printf "entering g\n%!"; + printf "Entering g\n%!"; h (); - printf "leaving g\n%!" + printf "Leaving g\n%!" let [@inline never] f () = - printf "entering f\n%!"; + printf "Entering f\n%!"; (try g () with Failure msg -> - printf "caught Failure \"%s\"\n%!" msg; + printf "Caught Failure \"%s\"\n%!" msg; Printexc.print_backtrace stdout; race ()); - printf "leaving f\n%!" + printf "Leaving f\n%!" + +let [@inline never] writer () = + Waitgroup.join wg; + r := 1 let () = Printexc.record_backtrace true; - let d = Domain.spawn (fun () -> Unix.sleep 1; r := 1) in - f (); Unix.sleep 1; + let d = Domain.spawn writer in + f (); Domain.join d diff --git a/testsuite/tests/tsan/exn_from_c.reference b/testsuite/tests/tsan/exn_from_c.reference index f29fdf2f91b..0c0007b7b3c 100644 --- a/testsuite/tests/tsan/exn_from_c.reference +++ b/testsuite/tests/tsan/exn_from_c.reference @@ -1,19 +1,19 @@ -entering f -entering g -entering h -entering i -calling print_and_raise... +Entering f +Entering g +Entering h +Entering i +Calling print_and_raise... Hello from print_and_raise -caught Failure "test" -Raised by primitive operation at Exn_from_c.i in file "exn_from_c.ml", line 25, characters 2-20 -Called from Exn_from_c.h in file "exn_from_c.ml", line 30, characters 2-6 -Called from Exn_from_c.g in file "exn_from_c.ml", line 35, characters 2-6 -Called from Exn_from_c.f in file "exn_from_c.ml", line 40, characters 7-11 -leaving f +Caught Failure "test" +Raised by primitive operation at Exn_from_c.i in file "exn_from_c.ml", line 28, characters 2-20 +Called from Exn_from_c.h in file "exn_from_c.ml", line 33, characters 2-6 +Called from Exn_from_c.g in file "exn_from_c.ml", line 38, characters 2-6 +Called from Exn_from_c.f in file "exn_from_c.ml", line 43, characters 7-11 +Leaving f ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by thread T1 (mutexes: write M): - #0 camlExn_from_c.fun_ () + #0 camlExn_from_c.writer_ () #1 camlStdlib__Domain.body_ () Previous read of size 8 at by main thread (mutexes: write M): @@ -23,12 +23,10 @@ WARNING: ThreadSanitizer: data race (pid=) #3 caml_program () As if synchronized via sleep: - #0 nanosleep () - #1 caml_unix_sleep () - #2 caml_c_call () - #3 camlUnix.sleep_ () - #4 camlExn_from_c.fun_ () - #5 camlStdlib__Domain.body_ () + #0 usleep () + #1 wg_wait () + #2 camlExn_from_c.writer_ () + #3 camlStdlib__Domain.body_ () Mutex M () created at: #0 pthread_mutex_init () @@ -50,6 +48,6 @@ WARNING: ThreadSanitizer: data race (pid=) #4 camlExn_from_c.entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlExn_from_c.fun_ +SUMMARY: ThreadSanitizer: data race (:) in camlExn_from_c.writer_ ================== ThreadSanitizer: reported 1 warnings diff --git a/testsuite/tests/tsan/exn_in_callback.ml b/testsuite/tests/tsan/exn_in_callback.ml index a136e6db359..c4d327cef9a 100644 --- a/testsuite/tests/tsan/exn_in_callback.ml +++ b/testsuite/tests/tsan/exn_in_callback.ml @@ -1,12 +1,12 @@ (* TEST - modules = "callbacks.c"; - ocamlopt_flags = "-g -ccopt -fsanitize=thread -ccopt -O1 -ccopt -fno-omit-frame-pointer -ccopt -g"; include unix; set TSAN_OPTIONS="detect_deadlocks=0"; tsan; + readonly_files = "callbacks.c waitgroup_stubs.c"; + all_modules = "${readonly_files} waitgroup.ml exn_in_callback.ml"; native; *) @@ -17,45 +17,48 @@ external print_and_call_ocaml_h : unit -> unit = "print_and_call_ocaml_h" open Printf +let wg = Waitgroup.create 2 let r = ref 0 -let [@inline never] race () = ignore @@ !r +let [@inline never] race () = + ignore @@ !r; + Waitgroup.join wg let [@inline never] i () = - printf "entering i\n%!"; - printf "throwing Exn...\n%!"; - (*race ();*) + printf "Entering i\n%!"; + printf "Throwing ExnB...\n%!"; ignore (raise ExnB); - printf "leaving i\n%!" + printf "Leaving i\n%!" let [@inline never] h () = - printf "entering h\n%!"; + printf "Entering h\n%!"; i (); - (* try i () with - | ExnA -> printf "caught an ExnA\n%!"; - *) - printf "leaving h\n%!" + printf "Leaving h\n%!" let _ = Callback.register "ocaml_h" h let [@inline never] g () = - printf "entering g\n%!"; - printf "calling C code\n%!"; + printf "Entering g\n%!"; + printf "Calling C code\n%!"; print_and_call_ocaml_h (); - printf "back from C code\n%!"; - printf "leaving g\n%!" + printf "Back from C code\n%!"; + printf "Leaving g\n%!" let [@inline never] f () = - printf "entering f\n%!"; + printf "Entering f\n%!"; (try g () with | ExnB -> - printf "caught an ExnB\n%!"; + printf "Caught an ExnB\n%!"; Printexc.print_backtrace stdout; race ()); - printf "leaving f\n%!" + printf "Leaving f\n%!" + +let [@inline never] writer () = + Waitgroup.join wg; + r := 1 let () = Printexc.record_backtrace true; - let d = Domain.spawn (fun () -> Unix.sleep 1; r := 1) in - f (); Unix.sleep 1; + let d = Domain.spawn writer in + f (); Domain.join d diff --git a/testsuite/tests/tsan/exn_in_callback.reference b/testsuite/tests/tsan/exn_in_callback.reference index bea150c90f0..b882a9ba82f 100644 --- a/testsuite/tests/tsan/exn_in_callback.reference +++ b/testsuite/tests/tsan/exn_in_callback.reference @@ -1,18 +1,18 @@ -entering f -entering g -calling C code +Entering f +Entering g +Calling C code Hello from print_and_call_ocaml_h -entering h -entering i -throwing Exn... -caught an ExnB -Raised by primitive operation at Exn_in_callback.g in file "exn_in_callback.ml", line 44, characters 2-27 -Called from Exn_in_callback.f in file "exn_in_callback.ml", line 50, characters 7-11 -leaving f +Entering h +Entering i +Throwing ExnB... +Caught an ExnB +Raised by primitive operation at Exn_in_callback.g in file "exn_in_callback.ml", line 43, characters 2-27 +Called from Exn_in_callback.f in file "exn_in_callback.ml", line 49, characters 7-11 +Leaving f ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by thread T1 (mutexes: write M): - #0 camlExn_in_callback.fun_ () + #0 camlExn_in_callback.writer_ () #1 camlStdlib__Domain.body_ () Previous read of size 8 at by main thread (mutexes: write M): @@ -22,12 +22,10 @@ WARNING: ThreadSanitizer: data race (pid=) #3 caml_program () As if synchronized via sleep: - #0 nanosleep () - #1 caml_unix_sleep () - #2 caml_c_call () - #3 camlUnix.sleep_ () - #4 camlExn_in_callback.fun_ () - #5 camlStdlib__Domain.body_ () + #0 usleep () + #1 wg_wait () + #2 camlExn_in_callback.writer_ () + #3 camlStdlib__Domain.body_ () Mutex M () created at: #0 pthread_mutex_init () @@ -49,6 +47,6 @@ WARNING: ThreadSanitizer: data race (pid=) #4 camlExn_in_callback.entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlExn_in_callback.fun_ +SUMMARY: ThreadSanitizer: data race (:) in camlExn_in_callback.writer_ ================== ThreadSanitizer: reported 1 warnings diff --git a/testsuite/tests/tsan/exn_reraise.ml b/testsuite/tests/tsan/exn_reraise.ml index 9ad6fb9193d..444e7b0da77 100644 --- a/testsuite/tests/tsan/exn_reraise.ml +++ b/testsuite/tests/tsan/exn_reraise.ml @@ -5,6 +5,8 @@ set TSAN_OPTIONS="detect_deadlocks=0"; tsan; + readonly_files = "waitgroup_stubs.c"; + all_modules = "${readonly_files} waitgroup.ml exn_reraise.ml"; native; *) @@ -13,38 +15,45 @@ exception ExnB open Printf +let wg = Waitgroup.create 2 let r = ref 0 -let [@inline never] race () = ignore @@ !r +let [@inline never] race () = + ignore @@ !r; + Waitgroup.join wg let [@inline never] i () = - printf "entering i\n%!"; - printf "throwing Exn...\n%!"; + printf "Entering i\n%!"; + printf "Throwing ExnA...\n%!"; ignore (raise ExnA); - printf "leaving i\n%!" + printf "Leaving i\n%!" let [@inline never] h () = - printf "entering h\n%!"; + printf "Entering h\n%!"; try i () with - | ExnB -> printf "caught an ExnB\n%!"; - printf "leaving h\n%!" + | ExnB -> printf "Caught an ExnB\n%!"; + printf "Leaving h\n%!" let [@inline never] g () = - printf "entering g\n%!"; + printf "Entering g\n%!"; h (); - printf "leaving g\n%!" + printf "Leaving g\n%!" let [@inline never] f () = - printf "entering f\n%!"; + printf "Entering f\n%!"; (try g () with | ExnA -> - printf "caught an ExnA\n%!"; + printf "Caught an ExnA\n%!"; Printexc.print_backtrace stdout; race ()); - printf "leaving f\n%!" + printf "Leaving f\n%!" + +let [@inline never] writer () = + Waitgroup.join wg; + r := 1 let () = Printexc.record_backtrace true; - let d = Domain.spawn (fun () -> Unix.sleep 1; r := 1) in - f (); Unix.sleep 1; + let d = Domain.spawn writer in + f (); Domain.join d diff --git a/testsuite/tests/tsan/exn_reraise.reference b/testsuite/tests/tsan/exn_reraise.reference index 27342e6b8fe..fd562f316c7 100644 --- a/testsuite/tests/tsan/exn_reraise.reference +++ b/testsuite/tests/tsan/exn_reraise.reference @@ -1,18 +1,18 @@ -entering f -entering g -entering h -entering i -throwing Exn... -caught an ExnA -Raised at Exn_reraise.i in file "exn_reraise.ml", line 23, characters 9-21 -Called from Exn_reraise.h in file "exn_reraise.ml", line 28, characters 6-10 -Called from Exn_reraise.g in file "exn_reraise.ml", line 34, characters 2-6 -Called from Exn_reraise.f in file "exn_reraise.ml", line 39, characters 7-11 -leaving f +Entering f +Entering g +Entering h +Entering i +Throwing ExnA... +Caught an ExnA +Raised at Exn_reraise.i in file "exn_reraise.ml", line 28, characters 9-21 +Called from Exn_reraise.h in file "exn_reraise.ml", line 33, characters 6-10 +Called from Exn_reraise.g in file "exn_reraise.ml", line 39, characters 2-6 +Called from Exn_reraise.f in file "exn_reraise.ml", line 44, characters 7-11 +Leaving f ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by thread T1 (mutexes: write M): - #0 camlExn_reraise.fun_ () + #0 camlExn_reraise.writer_ () #1 camlStdlib__Domain.body_ () Previous read of size 8 at by main thread (mutexes: write M): @@ -22,12 +22,10 @@ WARNING: ThreadSanitizer: data race (pid=) #3 caml_program () As if synchronized via sleep: - #0 nanosleep () - #1 caml_unix_sleep () - #2 caml_c_call () - #3 camlUnix.sleep_ () - #4 camlExn_reraise.fun_ () - #5 camlStdlib__Domain.body_ () + #0 usleep () + #1 wg_wait () + #2 camlExn_reraise.writer_ () + #3 camlStdlib__Domain.body_ () Mutex M () created at: #0 pthread_mutex_init () @@ -49,6 +47,6 @@ WARNING: ThreadSanitizer: data race (pid=) #4 camlExn_reraise.entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlExn_reraise.fun_ +SUMMARY: ThreadSanitizer: data race (:) in camlExn_reraise.writer_ ================== ThreadSanitizer: reported 1 warnings diff --git a/testsuite/tests/tsan/norace_atomics.ml b/testsuite/tests/tsan/norace_atomics.ml index 1bd42299941..1b6363e6802 100644 --- a/testsuite/tests/tsan/norace_atomics.ml +++ b/testsuite/tests/tsan/norace_atomics.ml @@ -4,15 +4,24 @@ set TSAN_OPTIONS="detect_deadlocks=0"; tsan; + readonly_files = "waitgroup_stubs.c"; + all_modules = "${readonly_files} waitgroup.ml norace_atomics.ml"; native; *) +let wg = Waitgroup.create 2 let v = Atomic.make 0 +let [@inline never] writer () = + Waitgroup.join wg; + Atomic.set v 10 + +let [@inline never] reader () = + ignore (Sys.opaque_identity (Atomic.get v)); + Waitgroup.join wg + let () = - let t1 = Domain.spawn (fun () -> Atomic.set v 10; Unix.sleep 1) in - let t2 = Domain.spawn (fun () -> - ignore (Sys.opaque_identity (Atomic.get v)); Unix.sleep 1) in - Domain.join t1; - Domain.join t2 + let d = Domain.spawn writer in + reader (); + Domain.join d diff --git a/testsuite/tests/tsan/perform.ml b/testsuite/tests/tsan/perform.ml index 0b0ad24b937..7512ab2e9bf 100644 --- a/testsuite/tests/tsan/perform.ml +++ b/testsuite/tests/tsan/perform.ml @@ -5,6 +5,8 @@ set TSAN_OPTIONS="detect_deadlocks=0"; tsan; + readonly_files = "waitgroup_stubs.c"; + all_modules = "${readonly_files} waitgroup.ml perform.ml"; native; *) @@ -20,42 +22,47 @@ open Effect.Deep type _ Effect.t += E : int -> int t -let g_ref1 = ref 0 -let g_ref2 = ref 0 -let g_ref3 = ref 0 +let wg1 = Waitgroup.create 2 +let wg2 = Waitgroup.create 2 +let r1 = ref 0 +let r2 = ref 0 +let r3 = ref 0 + +(* Force synchronisation of test output with TSan output to stderr *) +let print_endline s = Stdlib.print_endline s; flush stdout let [@inline never] race = function - | 0 -> g_ref1 := 42 - | 1 -> g_ref2 := 42 - | _ -> g_ref3 := 42 + | 0 -> r1 := 42 + | 1 -> r2 := 42 + | _ -> r3 := 42 let [@inline never] h () = - print_endline "entering h and perform-ing"; + print_endline "Entering h and perform-ing"; let v = perform (E 0) in - print_endline "resuming h"; + print_endline "Resuming h"; race 0; - print_endline "leaving h"; + print_endline "Leaving h"; v let [@inline never] g () = - print_endline "entering g"; + print_endline "Entering g"; let v = h () in - print_endline "leaving g"; + print_endline "Leaving g"; v let [@inline never] f () = - print_endline "computation, entering f"; + print_endline "Computation, entering f"; let v = g () in - print_endline "computation, leaving f"; + print_endline "Computation, leaving f"; v + 1 let effh : type a. a t -> ((a, 'b) continuation -> 'b) option = function | E v -> Some (fun k -> - print_endline "in the effect handler"; + print_endline "In the effect handler"; race 1; let v = continue k (v + 1) in - print_endline "handler after continue"; + print_endline "Handler after continue"; v + 1 ) | e -> None @@ -65,22 +72,24 @@ let[@inline never] main () = ignore ( match_with f () { retc = (fun v -> - print_endline "value handler"; + print_endline "Value handler"; race 2; v + 1 ); exnc = (fun e -> raise e); effc = effh } ); - 44 + 42 let[@inline never] other_domain () = - ignore (Sys.opaque_identity (!g_ref1, !g_ref2, !g_ref3)); - Unix.sleepf 0.66 + ignore (Sys.opaque_identity (!r1, !r2, !r3)); + Waitgroup.join wg1; + Waitgroup.join wg2 let () = let d = Domain.spawn other_domain in - Unix.sleepf 0.33; + Waitgroup.join wg1; let v = main () in - printf "result = %d\n" v; + Waitgroup.join wg2; + eprintf "Result = %d\n" v; Domain.join d diff --git a/testsuite/tests/tsan/perform.reference b/testsuite/tests/tsan/perform.reference index b06777fb25d..362f0507ce8 100644 --- a/testsuite/tests/tsan/perform.reference +++ b/testsuite/tests/tsan/perform.reference @@ -1,8 +1,8 @@ Let's work! -computation, entering f -entering g -entering h and perform-ing -in the effect handler +Computation, entering f +Entering g +Entering h and perform-ing +In the effect handler ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by main thread (mutexes: write M): @@ -17,11 +17,10 @@ WARNING: ThreadSanitizer: data race (pid=) #1 camlStdlib__Domain.body_ () As if synchronized via sleep: - #0 nanosleep () - #1 caml_unix_sleep () - #2 caml_c_call () - #3 camlPerform.entry () - #4 caml_program () + #0 usleep () + #1 wg_wait () + #2 camlPerform.entry () + #3 caml_program () Mutex M () created at: #0 pthread_mutex_init () @@ -45,7 +44,7 @@ WARNING: ThreadSanitizer: data race (pid=) SUMMARY: ThreadSanitizer: data race (:) in camlPerform.race_ ================== -resuming h +Resuming h ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by main thread (mutexes: write M): @@ -64,11 +63,10 @@ WARNING: ThreadSanitizer: data race (pid=) #1 camlStdlib__Domain.body_ () As if synchronized via sleep: - #0 nanosleep () - #1 caml_unix_sleep () - #2 caml_c_call () - #3 camlPerform.entry () - #4 caml_program () + #0 usleep () + #1 wg_wait () + #2 camlPerform.entry () + #3 caml_program () Mutex M () created at: #0 pthread_mutex_init () @@ -92,10 +90,10 @@ WARNING: ThreadSanitizer: data race (pid=) SUMMARY: ThreadSanitizer: data race (:) in camlPerform.race_ ================== -leaving h -leaving g -computation, leaving f -value handler +Leaving h +Leaving g +Computation, leaving f +Value handler ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by main thread (mutexes: write M): @@ -111,11 +109,10 @@ WARNING: ThreadSanitizer: data race (pid=) #1 camlStdlib__Domain.body_ () As if synchronized via sleep: - #0 nanosleep () - #1 caml_unix_sleep () - #2 caml_c_call () - #3 camlPerform.entry () - #4 caml_program () + #0 usleep () + #1 wg_wait () + #2 camlPerform.entry () + #3 caml_program () Mutex M () created at: #0 pthread_mutex_init () @@ -139,6 +136,6 @@ WARNING: ThreadSanitizer: data race (pid=) SUMMARY: ThreadSanitizer: data race (:) in camlPerform.race_ ================== -handler after continue -result = 44 +Handler after continue +Result = 42 ThreadSanitizer: reported 3 warnings diff --git a/testsuite/tests/tsan/raise_through_handler.ml b/testsuite/tests/tsan/raise_through_handler.ml index d72b6ba1a6e..d656c66e801 100644 --- a/testsuite/tests/tsan/raise_through_handler.ml +++ b/testsuite/tests/tsan/raise_through_handler.ml @@ -5,6 +5,8 @@ set TSAN_OPTIONS="detect_deadlocks=0"; tsan; + readonly_files = "waitgroup_stubs.c"; + all_modules = "${readonly_files} waitgroup.ml raise_through_handler.ml"; native; *) @@ -13,21 +15,23 @@ open Printf open Effect open Effect.Deep -let g_ref = ref 0 +let wg = Waitgroup.create 2 +let r = ref 0 let [@inline never] race () = - g_ref := 42 + r := 42; + Waitgroup.join wg let [@inline never] g () = - print_endline "entering g"; + print_endline "Entering g"; ignore @@ raise Exit; - print_endline "leaving g"; + print_endline "Leaving g"; 12 let [@inline never] f () = - print_endline "computation, entering f"; + print_endline "Computation, entering f"; let v = g () in - print_endline "computation, leaving f"; + print_endline "Computation, leaving f"; v + 1 let effh : type a. a t -> ((a, 'b) continuation -> 'b) option = fun _ -> None @@ -47,13 +51,12 @@ let[@inline never] main () = ); 44 -let[@inline never] other_domain () = - ignore (Sys.opaque_identity !g_ref); - Unix.sleepf 0.66 +let [@inline never] reader () = + Waitgroup.join wg; + ignore (Sys.opaque_identity !r) let () = - let d = Domain.spawn other_domain in - Unix.sleepf 0.33; + let d = Domain.spawn reader in let v = main () in - printf "result = %d\n" v; + printf "Result = %d\n" v; Domain.join d diff --git a/testsuite/tests/tsan/raise_through_handler.reference b/testsuite/tests/tsan/raise_through_handler.reference index e7841fbaa72..eefa5475c0e 100644 --- a/testsuite/tests/tsan/raise_through_handler.reference +++ b/testsuite/tests/tsan/raise_through_handler.reference @@ -1,25 +1,24 @@ Let's work! -computation, entering f -entering g +Computation, entering f +Entering g In exception handler ================== WARNING: ThreadSanitizer: data race (pid=) - Write of size 8 at by main thread (mutexes: write M): + Read of size 8 at by thread T1 (mutexes: write M): + #0 camlRaise_through_handler.reader_ () + #1 camlStdlib__Domain.body_ () + + Previous write of size 8 at by main thread (mutexes: write M): #0 camlRaise_through_handler.race_ () #1 camlRaise_through_handler.main_ () #2 camlRaise_through_handler.entry () #3 caml_program () - Previous read of size 8 at by thread T1 (mutexes: write M): - #0 camlRaise_through_handler.other_domain_ () - #1 camlStdlib__Domain.body_ () - As if synchronized via sleep: - #0 nanosleep () - #1 caml_unix_sleep () - #2 caml_c_call () - #3 camlRaise_through_handler.entry () - #4 caml_program () + #0 usleep () + #1 wg_wait () + #2 camlRaise_through_handler.reader_ () + #3 camlStdlib__Domain.body_ () Mutex M () created at: #0 pthread_mutex_init () @@ -41,7 +40,7 @@ WARNING: ThreadSanitizer: data race (pid=) #4 camlRaise_through_handler.entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlRaise_through_handler.race_ +SUMMARY: ThreadSanitizer: data race (:) in camlRaise_through_handler.reader_ ================== -result = 44 +Result = 44 ThreadSanitizer: reported 1 warnings diff --git a/testsuite/tests/tsan/record_field.ml b/testsuite/tests/tsan/record_field.ml index e35947e0697..0029073f776 100644 --- a/testsuite/tests/tsan/record_field.ml +++ b/testsuite/tests/tsan/record_field.ml @@ -4,15 +4,28 @@ set TSAN_OPTIONS="detect_deadlocks=0"; tsan; + readonly_files = "waitgroup_stubs.c"; + all_modules = "${readonly_files} waitgroup.ml record_field.ml"; native; *) type t = { mutable x : int } +let wg1 = Waitgroup.create 2 +let wg2 = Waitgroup.create 2 let v = { x = 0 } +let writer () = + v.x <- 10; + Waitgroup.join wg1; + Waitgroup.join wg2 + +let reader () = + Waitgroup.join wg1; + ignore (Sys.opaque_identity v.x); + Waitgroup.join wg2 + let () = - let t1 = Domain.spawn (fun () -> v.x <- 10; Unix.sleepf 0.1) in - let t2 = Domain.spawn (fun () -> ignore (Sys.opaque_identity v.x); Unix.sleepf 0.1) in - Domain.join t1; - Domain.join t2 + let d = Domain.spawn writer in + reader (); + Domain.join d diff --git a/testsuite/tests/tsan/record_field.reference b/testsuite/tests/tsan/record_field.reference index 8fac57ab4d0..aff9f632673 100644 --- a/testsuite/tests/tsan/record_field.reference +++ b/testsuite/tests/tsan/record_field.reference @@ -1,13 +1,21 @@ ================== WARNING: ThreadSanitizer: data race (pid=) - Read of size 8 at by thread T4 (mutexes: write M): - #0 camlRecord_field.fun_ () - #1 camlStdlib__Domain.body_ () + Read of size 8 at by main thread (mutexes: write M): + #0 camlRecord_field.reader_ () + #1 camlRecord_field.entry () + #2 caml_program () Previous write of size 8 at by thread T1 (mutexes: write M): - #0 camlRecord_field.fun_ () + #0 camlRecord_field.writer_ () #1 camlStdlib__Domain.body_ () + As if synchronized via sleep: + #0 usleep () + #1 wg_wait () + #2 camlRecord_field.reader_ () + #3 camlRecord_field.entry () + #4 caml_program () + Mutex M () created at: #0 pthread_mutex_init () #1 caml_plat_mutex_init () @@ -20,14 +28,6 @@ WARNING: ThreadSanitizer: data race (pid=) #2 caml_init_domains () #3 caml_init_gc () - Thread T4 (tid=, running) created by main thread at: - #0 pthread_create () - #1 caml_domain_spawn () - #2 caml_c_call () - #3 camlStdlib__Domain.spawn_ () - #4 camlRecord_field.entry () - #5 caml_program () - Thread T1 (tid=, running) created by main thread at: #0 pthread_create () #1 caml_domain_spawn () @@ -36,6 +36,6 @@ WARNING: ThreadSanitizer: data race (pid=) #4 camlRecord_field.entry () #5 caml_program () -SUMMARY: ThreadSanitizer: data race (:) in camlRecord_field.fun_ +SUMMARY: ThreadSanitizer: data race (:) in camlRecord_field.reader_ ================== ThreadSanitizer: reported 1 warnings diff --git a/testsuite/tests/tsan/reperform.ml b/testsuite/tests/tsan/reperform.ml index 4d008e43f22..a2610b1b164 100644 --- a/testsuite/tests/tsan/reperform.ml +++ b/testsuite/tests/tsan/reperform.ml @@ -5,6 +5,8 @@ set TSAN_OPTIONS="detect_deadlocks=0"; tsan; + readonly_files = "waitgroup_stubs.c"; + all_modules = "${readonly_files} waitgroup.ml reperform.ml"; native; *) @@ -23,6 +25,8 @@ let print_endline s = Stdlib.print_endline s; flush stdout type _ t += E1 : int -> int t type _ t += E2 : int -> int t +let wg1 = Waitgroup.create 2 +let wg2 = Waitgroup.create 2 let g_ref1 = ref 0 let g_ref2 = ref 0 let g_ref3 = ref 0 @@ -34,22 +38,22 @@ let [@inline never] race = | _ -> g_ref3 := 1 let [@inline never] h () = - print_endline "entering h"; + print_endline "Entering h"; let v = perform (E1 0) in race 1; - print_endline "leaving h"; + print_endline "Leaving h"; v let [@inline never] g () = - print_endline "entering g"; + print_endline "Entering g"; let v = h () in - print_endline "leaving g"; + print_endline "Leaving g"; v let f () = - print_endline "entering f"; + print_endline "Entering f"; let v = g () in - print_endline "leaving f"; + print_endline "Leaving f"; v + 1 let [@inline never] fiber2 () = @@ -79,10 +83,10 @@ let effh : type a. a t -> ((a, 'b) continuation -> 'b) option = function let [@inline never] fiber1 () = ignore @@ match_with fiber2 () { retc = (fun v -> - print_endline "value handler"; v + 1); + print_endline "Value handler"; v + 1); exnc = (fun e -> raise e); effc = effh }; - 1338 + 41 let[@inline never] main () = let v = fiber1 () in @@ -90,12 +94,14 @@ let[@inline never] main () = let[@inline never] other_domain () = ignore @@ (!g_ref1, !g_ref2, !g_ref3); - Unix.sleepf 0.66 + Waitgroup.join wg1; + Waitgroup.join wg2 let () = let d = Domain.spawn other_domain in - Unix.sleepf 0.33; + Waitgroup.join wg1; let v = main () in - printf "result=%d\n%!" v; + printf "Result=%d\n%!" v; race 2; + Waitgroup.join wg2; Domain.join d diff --git a/testsuite/tests/tsan/reperform.reference b/testsuite/tests/tsan/reperform.reference index 6ed33a7162b..0f91dcc7a61 100644 --- a/testsuite/tests/tsan/reperform.reference +++ b/testsuite/tests/tsan/reperform.reference @@ -1,6 +1,6 @@ -entering f -entering g -entering h +Entering f +Entering g +Entering h E1 handler before continue ================== WARNING: ThreadSanitizer: data race (pid=) @@ -17,11 +17,10 @@ WARNING: ThreadSanitizer: data race (pid=) #1 camlStdlib__Domain.body_ () As if synchronized via sleep: - #0 nanosleep () - #1 caml_unix_sleep () - #2 caml_c_call () - #3 camlReperform.entry () - #4 caml_program () + #0 usleep () + #1 wg_wait () + #2 camlReperform.entry () + #3 caml_program () Mutex M () created at: #0 pthread_mutex_init () @@ -66,11 +65,10 @@ WARNING: ThreadSanitizer: data race (pid=) #1 camlStdlib__Domain.body_ () As if synchronized via sleep: - #0 nanosleep () - #1 caml_unix_sleep () - #2 caml_c_call () - #3 camlReperform.entry () - #4 caml_program () + #0 usleep () + #1 wg_wait () + #2 camlReperform.entry () + #3 caml_program () Mutex M () created at: #0 pthread_mutex_init () @@ -94,12 +92,12 @@ WARNING: ThreadSanitizer: data race (pid=) SUMMARY: ThreadSanitizer: data race (:) in camlReperform.race_ ================== -leaving h -leaving g -leaving f -value handler +Leaving h +Leaving g +Leaving f +Value handler E1 handler after continue -result=1339 +Result=42 ================== WARNING: ThreadSanitizer: data race (pid=) Write of size 8 at by main thread (mutexes: write M): @@ -112,11 +110,10 @@ WARNING: ThreadSanitizer: data race (pid=) #1 camlStdlib__Domain.body_ () As if synchronized via sleep: - #0 nanosleep () - #1 caml_unix_sleep () - #2 caml_c_call () - #3 camlReperform.entry () - #4 caml_program () + #0 usleep () + #1 wg_wait () + #2 camlReperform.entry () + #3 caml_program () Mutex M () created at: #0 pthread_mutex_init () diff --git a/testsuite/tests/tsan/unhandled.ml b/testsuite/tests/tsan/unhandled.ml new file mode 100644 index 00000000000..52f2c3b51e5 --- /dev/null +++ b/testsuite/tests/tsan/unhandled.ml @@ -0,0 +1,89 @@ +(* TEST + + ocamlopt_flags = "-g"; + include unix; + set TSAN_OPTIONS="detect_deadlocks=0"; + + tsan; + readonly_files = "waitgroup_stubs.c"; + all_modules = "${readonly_files} waitgroup.ml unhandled.ml"; + native; + +*) + +open Printf +open Effect +open Effect.Deep + +let print_endline s = Stdlib.print_endline s; flush stdout + +type _ t += E : int -> int t + +let wg1 = Waitgroup.create 2 +let wg2 = Waitgroup.create 2 +let r1 = ref 0 +let r2 = ref 0 + +let [@inline never] race = function + | 0 -> r1 := 42 + | 1 -> r2 := 42 + | _ -> assert false + +let [@inline never] h () = + print_endline "Entering h"; + let v = + try perform (E 0) + with Unhandled _ -> race 1; 1 + in + print_endline "Leaving h"; + v + +let [@inline never] g () = + print_endline "Entering g"; + let v = h () in + print_endline "Leaving g"; + v + +let f () = + print_endline "Entering f"; + let v = g () in + print_endline "Leaving f"; + v + 1 + +let [@inline never] fiber2 () = + ignore @@ match_with f () + { retc = Fun.id; + exnc = raise; + effc = (fun (type a) (e : a t) -> None) }; + 42 + +let effh : type a. a t -> ((a, 'b) continuation -> 'b) option = fun _ -> None + +let [@inline never] fiber1 () = + ignore @@ match_with fiber2 () + { retc = (fun v -> + print_endline "Value handler"; v + 1); + exnc = (fun e -> raise e); + effc = effh }; + 41 + +let[@inline never] main () = + print_endline "Performing an unhandled effect from the main fiber"; + try perform (E 42) with + | Effect.Unhandled _ -> race 0; + print_endline "Performing an unhandled effect from another fiber"; + let v = fiber1 () in + v + 1 + +let[@inline never] other_domain () = + ignore @@ (Sys.opaque_identity !r1, !r2); + Waitgroup.join wg1; + Waitgroup.join wg2 + +let () = + let d = Domain.spawn other_domain in + Waitgroup.join wg1; + let v = main () in + Waitgroup.join wg2; + printf "Result=%d\n%!" v; + Domain.join d diff --git a/testsuite/tests/tsan/unhandled.reference b/testsuite/tests/tsan/unhandled.reference new file mode 100644 index 00000000000..3d0af2d7cf0 --- /dev/null +++ b/testsuite/tests/tsan/unhandled.reference @@ -0,0 +1,98 @@ +Performing an unhandled effect from the main fiber +================== +WARNING: ThreadSanitizer: data race (pid=) + Write of size 8 at by main thread (mutexes: write M): + #0 camlUnhandled.race_ () + #1 camlUnhandled.main_ () + #2 camlUnhandled.entry () + #3 caml_program () + + Previous read of size 8 at by thread T1 (mutexes: write M): + #0 camlUnhandled.other_domain_ () + #1 camlStdlib__Domain.body_ () + + As if synchronized via sleep: + #0 usleep () + #1 wg_wait () + #2 camlUnhandled.entry () + #3 caml_program () + + Mutex M () created at: + #0 pthread_mutex_init () + #1 caml_plat_mutex_init () + #2 caml_init_domains () + #3 caml_init_gc () + + Mutex M () created at: + #0 pthread_mutex_init () + #1 caml_plat_mutex_init () + #2 caml_init_domains () + #3 caml_init_gc () + + Thread T1 (tid=, running) created by main thread at: + #0 pthread_create () + #1 caml_domain_spawn () + #2 caml_c_call () + #3 camlStdlib__Domain.spawn_ () + #4 camlUnhandled.entry () + #5 caml_program () + +SUMMARY: ThreadSanitizer: data race (:) in camlUnhandled.race_ +================== +Performing an unhandled effect from another fiber +Entering f +Entering g +Entering h +================== +WARNING: ThreadSanitizer: data race (pid=) + Write of size 8 at by main thread (mutexes: write M): + #0 camlUnhandled.race_ () + #1 camlUnhandled.h_ () + #2 camlUnhandled.g_ () + #3 camlUnhandled.f_ () + #4 caml_runstack () + #5 camlUnhandled.fiber2_ () + #6 caml_runstack () + #7 camlUnhandled.fiber1_ () + #8 camlUnhandled.main_ () + #9 camlUnhandled.entry () + #10 caml_program () + + Previous read of size 8 at by thread T1 (mutexes: write M): + #0 camlUnhandled.other_domain_ () + #1 camlStdlib__Domain.body_ () + + As if synchronized via sleep: + #0 usleep () + #1 wg_wait () + #2 camlUnhandled.entry () + #3 caml_program () + + Mutex M () created at: + #0 pthread_mutex_init () + #1 caml_plat_mutex_init () + #2 caml_init_domains () + #3 caml_init_gc () + + Mutex M () created at: + #0 pthread_mutex_init () + #1 caml_plat_mutex_init () + #2 caml_init_domains () + #3 caml_init_gc () + + Thread T1 (tid=, running) created by main thread at: + #0 pthread_create () + #1 caml_domain_spawn () + #2 caml_c_call () + #3 camlStdlib__Domain.spawn_ () + #4 camlUnhandled.entry () + #5 caml_program () + +SUMMARY: ThreadSanitizer: data race (:) in camlUnhandled.race_ +================== +Leaving h +Leaving g +Leaving f +Value handler +Result=42 +ThreadSanitizer: reported 2 warnings diff --git a/testsuite/tests/frame-pointers/c_call.run b/testsuite/tests/tsan/unhandled.run similarity index 100% rename from testsuite/tests/frame-pointers/c_call.run rename to testsuite/tests/tsan/unhandled.run diff --git a/testsuite/tests/tsan/waitgroup.ml b/testsuite/tests/tsan/waitgroup.ml new file mode 100644 index 00000000000..098b9dd078e --- /dev/null +++ b/testsuite/tests/tsan/waitgroup.ml @@ -0,0 +1,7 @@ +type t + +external create : int -> t = "wg_create" [@@noalloc] +external finish : t -> unit = "wg_finish" [@@noalloc] +external wait : t -> unit = "wg_wait" [@@noalloc] + +let [@inline never] join t = finish t; wait t diff --git a/testsuite/tests/tsan/waitgroup_stubs.c b/testsuite/tests/tsan/waitgroup_stubs.c new file mode 100644 index 00000000000..bdaf76b3ede --- /dev/null +++ b/testsuite/tests/tsan/waitgroup_stubs.c @@ -0,0 +1,59 @@ +#include +#include +#include + +#include +#include + +#define MAX_WAITGROUP 8 +#define SPIN_WAIT_MS 10 + +/* waitgroup inspired by Golang's `sync.WaitGroup`. This version does *not* + * allow to restart a waitgroup. */ +typedef struct { + unsigned limit; /* Number of threads participating in the checkpoint */ + atomic_uint count; /* Number of threads that have reached the checkpoint */ +} waitgroup; + +static waitgroup waitgroups[MAX_WAITGROUP] = { 0 }; + +static atomic_uint index = 0; + +CAMLno_tsan static waitgroup* wg_get(unsigned idx) +{ + assert(idx < MAX_WAITGROUP); + + waitgroup* wg = &waitgroups[idx]; + return wg; +} + +CAMLno_tsan value wg_create(value n) +{ + waitgroup* wg = wg_get(index); + + wg->limit = Int_val(n); + wg->count = 0; + return Val_int(index++); +} + +CAMLno_tsan value wg_finish(value t) +{ + waitgroup* wg = wg_get(Int_val(t)); + + wg->count += 1; + return Val_unit; +} + +CAMLno_tsan value wg_wait(value t) +{ + waitgroup* wg = wg_get(Int_val(t)); + + /* Always sleep at least once, even for the last thread to reach the + * checkpoint. This allows TSan to always generate a report with a + * 'As if synchronized via sleep' section. */ + do { + usleep(SPIN_WAIT_MS); + } + while (wg->count != wg->limit); + return Val_unit; +} diff --git a/testsuite/tests/typing-extensions/disambiguation.ml b/testsuite/tests/typing-extensions/disambiguation.ml index 65040ee0cb4..f74935ff105 100644 --- a/testsuite/tests/typing-extensions/disambiguation.ml +++ b/testsuite/tests/typing-extensions/disambiguation.ml @@ -247,3 +247,19 @@ The first one was selected. Please disambiguate if this is wrong. val x : b = Unique |}] + +(* Optional argument defaults *) +module M = struct + type t = A | B +end;; + +let f1 ?(x : M.t = A) () = ();; +let f2 ?x:(_ : M.t = A) () = ();; +let f3 ?x:((_ : M.t) = A) () = ();; + +[%%expect {| +module M : sig type t = A | B end +val f1 : ?x:M.t -> unit -> unit = +val f2 : ?x:M.t -> unit -> unit = +val f3 : ?x:M.t -> unit -> unit = +|}] diff --git a/testsuite/tests/typing-external/pr11392.ml b/testsuite/tests/typing-external/pr11392.ml index 8dd88740dc1..ef2043e532d 100644 --- a/testsuite/tests/typing-external/pr11392.ml +++ b/testsuite/tests/typing-external/pr11392.ml @@ -16,9 +16,9 @@ type 'self nat = Z | S of 'self external cast : int -> 'self nat as 'self = "%identity" ;; [%%expect{| -Line 1, characters 16-41: +Line 1, characters 36-41: 1 | external cast : int -> 'self nat as 'self = "%identity" - ^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^ Error: This alias is bound to type "int -> 'a nat" but is used as an instance of type "'a" The type variable "'a" occurs inside "int -> 'a nat" diff --git a/testsuite/tests/typing-gadts/dynamic_frisch.ml b/testsuite/tests/typing-gadts/dynamic_frisch.ml index f24cd9ada31..c77b2043c59 100644 --- a/testsuite/tests/typing-gadts/dynamic_frisch.ml +++ b/testsuite/tests/typing-gadts/dynamic_frisch.ml @@ -605,9 +605,9 @@ Line 7, characters 41-58: 7 | | "Cons", Some (Tdyn (Pair (_, Var), (p : a * a vlist))) -> `Cons p))) ^^^^^^^^^^^^^^^^^ Error: This pattern matches values of type "a * a vlist" - but a pattern was expected which matches values of type - "$Tdyn_'a" = "$0 * $1" + but a pattern was expected which matches values of type "$a" = "$0 * $1" Type "a" is not compatible with type "$0" + Hint: "$a" is an existential type bound by the constructor "Tdyn". |}];; (* Define Sum using object instead of record for first-class polymorphism *) diff --git a/testsuite/tests/typing-gadts/or_patterns.ml b/testsuite/tests/typing-gadts/or_patterns.ml index 0ff5a8c863a..fda50eb1834 100644 --- a/testsuite/tests/typing-gadts/or_patterns.ml +++ b/testsuite/tests/typing-gadts/or_patterns.ml @@ -217,9 +217,9 @@ let simple_merged_annotated_return (type a) (t : a t) (a : a) = ;; [%%expect{| -Line 3, characters 12-20: +Line 3, characters 18-19: 3 | | IntLit, (3 as x) - ^^^^^^^^ + ^ Error: This pattern matches values of type "int" This instance of "int" is ambiguous: it would escape the scope of its equation @@ -761,6 +761,7 @@ let f = function Line 2, characters 6-7: 2 | | A x ^ -Error: This pattern matches values of type "$A_'a" - The type constructor "$A_'a" would escape its scope +Error: This pattern matches values of type "$a" + The type constructor "$a" would escape its scope + Hint: "$a" is an existential type bound by the constructor "A". |}] diff --git a/testsuite/tests/typing-gadts/pr6980.ml b/testsuite/tests/typing-gadts/pr6980.ml index 127cc2a17ec..d04db3dff10 100644 --- a/testsuite/tests/typing-gadts/pr6980.ml +++ b/testsuite/tests/typing-gadts/pr6980.ml @@ -26,6 +26,7 @@ Line 11, characters 27-29: ^^ Error: This expression has type "[< `Bar | `Foo > `Bar ]" but an expression was expected of type "[< `Bar | `Foo ]" - The second variant type is bound to "$Aux_'a", + The second variant type is bound to "$a", it may not allow the tag(s) "`Bar" + Hint: "$a" is an existential type bound by the constructor "Aux". |}];; diff --git a/testsuite/tests/typing-gadts/pr7222.ml b/testsuite/tests/typing-gadts/pr7222.ml index 5b356a0ccf4..b27ca51e9ab 100644 --- a/testsuite/tests/typing-gadts/pr7222.ml +++ b/testsuite/tests/typing-gadts/pr7222.ml @@ -23,8 +23,9 @@ type _ t = Nil : nil t | Cons : ('x, 'fx) elt * 'x t -> 'fx t Line 9, characters 11-18: 9 | let Cons(Elt dim, _) = sh in () ^^^^^^^ -Error: This pattern matches values of type "($Cons_'x, 'a -> $Cons_'x) elt" +Error: This pattern matches values of type "($x, 'a -> $x) elt" but a pattern was expected which matches values of type - "($Cons_'x, 'a -> $'b -> nil) elt" + "($x, 'a -> $'b -> nil) elt" The type constructor "$'b" would escape its scope + Hint: "$x" is an existential type bound by the constructor "Cons". |}];; diff --git a/testsuite/tests/typing-gadts/test.ml b/testsuite/tests/typing-gadts/test.ml index bd38fafd945..adc0faabf4a 100644 --- a/testsuite/tests/typing-gadts/test.ml +++ b/testsuite/tests/typing-gadts/test.ml @@ -293,9 +293,10 @@ module Existential_escape = Line 5, characters 21-22: 5 | let eval (D x) = x ^ -Error: This expression has type "$D_'a t" - but an expression was expected of type "'a" - The type constructor "$D_'a" would escape its scope +Error: This expression has type "$a t" but an expression was expected of type + "'a" + The type constructor "$a" would escape its scope + Hint: "$a" is an existential type bound by the constructor "D". |}];; module Rectype = @@ -1353,10 +1354,11 @@ module M : Line 9, characters 4-5: 9 | z#b ^ -Error: This expression has type "$C_'a" = "< b : bool >" +Error: This expression has type "$a" = "< b : bool >" but an expression was expected of type "< b : 'a; .. >" This instance of "< b : bool >" is ambiguous: it would escape the scope of its equation + Hint: "$a" is an existential type bound by the constructor "C". |}] (* Check got/expected when the order changes *) @@ -1380,8 +1382,9 @@ module M : Line 9, characters 4-5: 9 | z#b ^ -Error: This expression has type "$C_'a" = "< b : bool >" +Error: This expression has type "$a" = "< b : bool >" but an expression was expected of type "< b : 'a; .. >" This instance of "< b : bool >" is ambiguous: it would escape the scope of its equation + Hint: "$a" is an existential type bound by the constructor "C". |}] diff --git a/testsuite/tests/typing-gadts/unexpected_existentials.ml b/testsuite/tests/typing-gadts/unexpected_existentials.ml index b764d9d38a7..e176cc92359 100644 --- a/testsuite/tests/typing-gadts/unexpected_existentials.ml +++ b/testsuite/tests/typing-gadts/unexpected_existentials.ml @@ -14,7 +14,7 @@ Line 1, characters 4-9: 1 | let Any x = Any () ^^^^^ Error: Existential types are not allowed in toplevel bindings, - but this pattern introduces the existential type "$Any_'a". + but the constructor "Any" introduces existential types. |}] let () = @@ -25,7 +25,7 @@ Line 2, characters 6-11: 2 | let Any x = Any () and () = () in ^^^^^ Error: Existential types are not allowed in "let ... and ..." bindings, - but this pattern introduces the existential type "$Any_'a". + but the constructor "Any" introduces existential types. |}] @@ -37,7 +37,7 @@ Line 2, characters 10-15: 2 | let rec Any x = Any () in ^^^^^ Error: Existential types are not allowed in recursive bindings, - but this pattern introduces the existential type "$Any_'a". + but the constructor "Any" introduces existential types. |}] @@ -49,7 +49,7 @@ Line 2, characters 18-23: 2 | let[@attribute] Any x = Any () in ^^^^^ Error: Existential types are not allowed in presence of attributes, - but this pattern introduces the existential type "$Any_'a". + but the constructor "Any" introduces existential types. |}] @@ -59,7 +59,7 @@ Line 1, characters 8-15: 1 | class c (Any x) = object end ^^^^^^^ Error: Existential types are not allowed in class arguments, - but this pattern introduces the existential type "$Any_'a". + but the constructor "Any" introduces existential types. |}] class c = object(Any x)end @@ -68,7 +68,7 @@ Line 1, characters 16-23: 1 | class c = object(Any x)end ^^^^^^^ Error: Existential types are not allowed in self patterns, - but this pattern introduces the existential type "$Any_'a". + but the constructor "Any" introduces existential types. |}] type other = Any: _ -> other diff --git a/testsuite/tests/typing-misc/includeclass_errors.ml b/testsuite/tests/typing-misc/includeclass_errors.ml index 37948347eb5..0e234874f51 100644 --- a/testsuite/tests/typing-misc/includeclass_errors.ml +++ b/testsuite/tests/typing-misc/includeclass_errors.ml @@ -87,6 +87,33 @@ Error: Signature mismatch: The classes do not have the same number of type parameters |}] +module Confusing: sig + class ['x, 'y] c: object end +end = struct + class ['y, 'x] c = object method private id (x : 'y) = x + 1 end +end +;; +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | class ['y, 'x] c = object method private id (x : 'y) = x + 1 end +5 | end +Error: Signature mismatch: + Modules do not match: + sig + class ['a, 'x] c : + object constraint 'a = int method private id : 'a -> int end + end + is not included in + sig class ['x, 'y] c : object end end + Class declarations do not match: + class ['a, 'x] c : + object constraint 'a = int method private id : 'a -> int end + does not match + class ['x, 'y] c : object end + The 1st type parameter has type "int" but is expected to have type "'x" +|}] + module M: sig class ['a] c: object constraint 'a = int end end = struct @@ -107,7 +134,30 @@ Error: Signature mismatch: class ['a] c : object end does not match class ['a] c : object constraint 'a = int end - A type parameter has type "'a" but is expected to have type "int" + The 1st type parameter has type "'a" but is expected to have type "int" +|}] + +module M: sig + class ['a, 'b] c: object constraint 'b = int end +end = struct + class ['a, 'b] c = object end +end +;; +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | class ['a, 'b] c = object end +5 | end +Error: Signature mismatch: + Modules do not match: + sig class ['a, 'b] c : object end end + is not included in + sig class ['a, 'b] c : object constraint 'b = int end end + Class declarations do not match: + class ['a, 'b] c : object end + does not match + class ['a, 'b] c : object constraint 'b = int end + The 2nd type parameter has type "'b" but is expected to have type "int" |}] module M: sig @@ -130,7 +180,30 @@ Error: Signature mismatch: class c : float -> object end does not match class c : int -> object end - A parameter has type "float" but is expected to have type "int" + The 1st parameter has type "float" but is expected to have type "int" +|}] + +module M: sig + class c : int -> int -> object end +end = struct + class c (_ : int) (x : float) = object end +end +;; +[%%expect{| +Lines 3-5, characters 6-3: +3 | ......struct +4 | class c (_ : int) (x : float) = object end +5 | end +Error: Signature mismatch: + Modules do not match: + sig class c : int -> float -> object end end + is not included in + sig class c : int -> int -> object end end + Class declarations do not match: + class c : int -> float -> object end + does not match + class c : int -> int -> object end + The 2nd parameter has type "float" but is expected to have type "int" |}] class virtual foo: foo_t = diff --git a/testsuite/tests/typing-misc/polyvars.ml b/testsuite/tests/typing-misc/polyvars.ml index 148fd294fcd..7510f338a3b 100644 --- a/testsuite/tests/typing-misc/polyvars.ml +++ b/testsuite/tests/typing-misc/polyvars.ml @@ -165,9 +165,9 @@ val f : [> `AnyOtherTag ] * [> `AnyOtherTag | `AnyOtherTag' ] -> int = let x:(([`A] as 'a)* ([`B] as 'a)) = [`A] [%%expect {| -Line 1, characters 22-32: +Line 1, characters 30-32: 1 | let x:(([`A] as 'a)* ([`B] as 'a)) = [`A] - ^^^^^^^^^^ + ^^ Error: This alias is bound to type "[ `B ]" but is used as an instance of type "[ `A ]" These two variant types have no intersection diff --git a/testsuite/tests/typing-misc/variance.ml b/testsuite/tests/typing-misc/variance.ml index d95282886f6..a41db4f27a0 100644 --- a/testsuite/tests/typing-misc/variance.ml +++ b/testsuite/tests/typing-misc/variance.ml @@ -36,3 +36,90 @@ type !'a t = (module s with type t = 'a);; module type s = sig type t end type 'a t = (module s with type t = 'a) |}] + +(* Composition *) +type -'a n +type +'a p +type !'a i + +type +'a error_np = 'a n p;; +[%%expect{| +type -'a n +type +'a p +type !'a i +Line 5, characters 0-26: +5 | type +'a error_np = 'a n p;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In this definition, expected parameter variances are not satisfied. + The 1st type parameter was expected to be covariant, + but it is contravariant. +|}] + + +type +'a error_pn = 'a p n;; +[%%expect{| +Line 1, characters 0-26: +1 | type +'a error_pn = 'a p n;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In this definition, expected parameter variances are not satisfied. + The 1st type parameter was expected to be covariant, + but it is contravariant. +|}] + +type -'a error_pp = 'a p p;; +[%%expect{| +Line 1, characters 0-26: +1 | type -'a error_pp = 'a p p;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In this definition, expected parameter variances are not satisfied. + The 1st type parameter was expected to be contravariant, + but it is covariant. +|}] + +type -'a error_nn = 'a n n;; +[%%expect{| +Line 1, characters 0-26: +1 | type -'a error_nn = 'a n n;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In this definition, expected parameter variances are not satisfied. + The 1st type parameter was expected to be contravariant, + but it is covariant. +|}] + +type !'a inj_in = 'a i n +[%%expect{| +Line 1, characters 0-24: +1 | type !'a inj_in = 'a i n + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In this definition, expected parameter variances are not satisfied. + The 1st type parameter was expected to be injective invariant, + but it is invariant. +|}] + +type !'a inj_in = 'a n i +[%%expect{| +Line 1, characters 0-24: +1 | type !'a inj_in = 'a n i + ^^^^^^^^^^^^^^^^^^^^^^^^ +Error: In this definition, expected parameter variances are not satisfied. + The 1st type parameter was expected to be injective invariant, + but it is invariant. +|}] + +module Make_covariant(M: sig type 'a t end): sig + type 'a i = 'a + type +'a t = 'a i M.t +end = struct + type 'a i = 'a + type +'a t = 'a i M.t +end + +module Positive_ref = Make_covariant(struct type 'a t = 'a ref end) +[%%expect {| +Line 6, characters 2-23: +6 | type +'a t = 'a i M.t + ^^^^^^^^^^^^^^^^^^^^^ +Error: In this definition, expected parameter variances are not satisfied. + The 1st type parameter was expected to be covariant, + but it is invariant. +|}] diff --git a/testsuite/tests/typing-modules/module_type_substitution.ml b/testsuite/tests/typing-modules/module_type_substitution.ml index 2ba51928889..3eb6561cd42 100644 --- a/testsuite/tests/typing-modules/module_type_substitution.ml +++ b/testsuite/tests/typing-modules/module_type_substitution.ml @@ -184,6 +184,7 @@ Line 1, characters 25-58: 1 | module type fst_erased = fst with module type t := sig end ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: This "with" constraint "t := sig end" makes a packed module ill-formed. + (see manual section 12.7.3) |}] module type fst_ok = fst with module type t = sig end @@ -205,6 +206,7 @@ Line 8, characters 16-49: 8 | module type R = S with module type M.T := sig end ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: This "with" constraint "M.T := sig end" makes a packed module ill-formed. + (see manual section 12.7.3) |}] @@ -222,6 +224,7 @@ Line 8, characters 16-49: 8 | module type R = S with module type M.T := sig end ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: This "with" constraint "T := sig end" makes a packed module ill-formed. + (see manual section 12.7.3) |}] @@ -253,7 +256,51 @@ Error: Multiple definition of the type name "a". Names must be unique in a given structure or signature. |}] -module type fst = sig +(* Only local module type substitutions resulting in paths may + be used in first class modules. *) + +module X = struct + module type s = sig type t end + module Y(Z : s) = struct + module type Ys = sig end + end +end + +module type fcm_path = sig + module type t_s := X.s + module Z : sig type t end + module type t_Ys := X.Y(Z).Ys + + module F : functor (Z : module type of Z) -> sig + module type t_F = sig type ff end + end + + module type t_FF := F(Z).t_F + + val x_s: (module t_s) + val x_sY: (module t_Ys) + val x_sFF : (module t_FF) +end + +[%%expect {| +module X : + sig + module type s = sig type t end + module Y : functor (Z : s) -> sig module type Ys = sig end end + end +module type fcm_path = + sig + module Z : sig type t end + module F : + functor (Z : sig type t end) -> + sig module type t_F = sig type ff end end + val x_s : (module X.s) + val x_sY : (module X.Y(Z).Ys) + val x_sFF : (module F(Z).t_F) + end +|}] + +module type fcm_signature = sig module type t := sig end val x: (module t) end @@ -262,7 +309,8 @@ Line 3, characters 2-19: 3 | val x: (module t) ^^^^^^^^^^^^^^^^^ Error: The module type "t" is not a valid type for a packed module: - it is defined as a local substitution for a non-path module type. + it is defined as a local substitution (temporary name) + for an anonymous module type. (see manual section 12.7.3) |}] diff --git a/testsuite/tests/typing-objects/Tests.ml b/testsuite/tests/typing-objects/Tests.ml index 01a47f485b7..3d917da45a7 100644 --- a/testsuite/tests/typing-objects/Tests.ml +++ b/testsuite/tests/typing-objects/Tests.ml @@ -778,9 +778,9 @@ type 'a t |}];; fun (x : 'a t as 'a) -> ();; [%%expect{| -Line 1, characters 9-19: +Line 1, characters 17-19: 1 | fun (x : 'a t as 'a) -> ();; - ^^^^^^^^^^ + ^^ Error: This alias is bound to type "'a t" but is used as an instance of type "'a" The type variable "'a" occurs inside "'a t" |}];; diff --git a/testsuite/tests/typing-objects/errors.ml b/testsuite/tests/typing-objects/errors.ml index 148db20715d..fffab9c670e 100644 --- a/testsuite/tests/typing-objects/errors.ml +++ b/testsuite/tests/typing-objects/errors.ml @@ -50,3 +50,14 @@ Line 1, characters 37-41: ^^^^ Error: This expression has no method "bar" |}] + +class empty = object end +class also_empty = object inherit! empty end +[%%expect{| +class empty : object end +Line 2, characters 26-40: +2 | class also_empty = object inherit! empty end + ^^^^^^^^^^^^^^ +Error: This inheritance does not override any methods or instance variables + but is explicitly marked as overriding with "!". +|}] diff --git a/testsuite/tests/typing-rectypes-bugs/pr6870_bad.compilers.reference b/testsuite/tests/typing-rectypes-bugs/pr6870_bad.compilers.reference index 9980a0ee27b..2a2b2da14af 100644 --- a/testsuite/tests/typing-rectypes-bugs/pr6870_bad.compilers.reference +++ b/testsuite/tests/typing-rectypes-bugs/pr6870_bad.compilers.reference @@ -1,6 +1,6 @@ -File "pr6870_bad.ml", line 10, characters 38-50: +File "pr6870_bad.ml", line 10, characters 48-50: 10 | module Fix (T : T) = struct type r = ('r T.t as 'r) end - ^^^^^^^^^^^^ + ^^ Error: This alias is bound to type "'a T.t" but is used as an instance of type "'a" The type variable "'a" occurs inside "'a T.t" diff --git a/testsuite/tests/typing-short-paths/errors.ml b/testsuite/tests/typing-short-paths/errors.ml index 67c5ae70bbf..a9929570bfa 100644 --- a/testsuite/tests/typing-short-paths/errors.ml +++ b/testsuite/tests/typing-short-paths/errors.ml @@ -51,8 +51,8 @@ type pair = Pair : 'a ty * 'a -> pair Line 9, characters 22-23: 9 | | Pair (Char, x) -> x + 1 ^ -Error: This expression has type "$Pair_'a" - but an expression was expected of type "int" +Error: This expression has type "$a" but an expression was expected of type "int" + Hint: "$a" is an existential type bound by the constructor "Pair". |}] type _ ty = Char : char ty @@ -68,8 +68,66 @@ type pair = Pair : 'a ty * 'a -> pair Line 7, characters 35-36: 7 | | Pair (Char, x) -> if true then x else 'd' ^ -Error: This expression has type "$Pair_'a" - but an expression was expected of type "'a" - This instance of "$Pair_'a" is ambiguous: +Error: This expression has type "$a" but an expression was expected of type "'a" + This instance of "$a" is ambiguous: it would escape the scope of its equation + Hint: "$a" is an existential type bound by the constructor "Pair". +|}] + +(** Cycle type definitions *) + +type 'a t = 'a t +[%%expect {| +Line 3, characters 0-16: +3 | type 'a t = 'a t + ^^^^^^^^^^^^^^^^ +Error: The type abbreviation "t" is cyclic: + "'a t" = "'a t" +|}] + +type 'a t = 'a u +and 'a u = 'a v * 'a +and 'a v = 'a w list +and 'a w = 'a option z +and 'a z = 'a t +[%%expect {| +Line 1, characters 0-16: +1 | type 'a t = 'a u + ^^^^^^^^^^^^^^^^ +Error: The type abbreviation "t" is cyclic: + "'a t" = "'a u", + "'a u" = "'a v * 'a", + "'a v * 'a" contains "'a v", + "'a v" = "'a w list", + "'a w list" contains "'a w", + "'a w" = "'a option z", + "'a option z" = "'a option t" +|}] + + +type 'a u = < x : 'a> +and 'a t = 'a t u;; +[%%expect{| +Line 2, characters 0-17: +2 | and 'a t = 'a t u;; + ^^^^^^^^^^^^^^^^^ +Error: The type abbreviation "t" is cyclic: + "'a t u" contains "'a t", + "'a t" = "'a t u", + "'a t u" contains "'a t" +|}];; (* fails since 4.04 *) + + +module rec A : sig type t = B.t -> int end = struct type t = B.t -> int end + and B : sig type t = A.t end = struct type t = A.t end;; +[%%expect {| +Line 1, characters 0-75: +1 | module rec A : sig type t = B.t -> int end = struct type t = B.t -> int end + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: The definition of "A.t" contains a cycle: + "B.t -> int" contains "B.t", + "B.t" = "B.t", + "B.t" = "B.t -> int", + "B.t -> int" contains "B.t", + "B.t" = "B.t" |}] diff --git a/testsuite/tests/typing-warnings/exhaustiveness.ml b/testsuite/tests/typing-warnings/exhaustiveness.ml index 63fc4f2cf8f..fe2c232667d 100644 --- a/testsuite/tests/typing-warnings/exhaustiveness.ml +++ b/testsuite/tests/typing-warnings/exhaustiveness.ml @@ -333,7 +333,7 @@ Line 1, characters 8-37: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 8 [partial-match]: this pattern-matching is not exhaustive. Here is an example of a case that is not matched: -(_, 1) +({ _ }, 1) val f : 'a ref * int -> int = |}] diff --git a/testsuite/tests/typing-warnings/never_returns.ml b/testsuite/tests/typing-warnings/never_returns.ml index feb8c040d12..b77354771bc 100644 --- a/testsuite/tests/typing-warnings/never_returns.ml +++ b/testsuite/tests/typing-warnings/never_returns.ml @@ -10,6 +10,13 @@ fun () -> while true do () done; 3;; - : unit -> int = |}];; +(** For now, we don't warn for non-terminating while loops, for backwards compatibility. *) +fun () -> (if true then while true do () done else while true do () done); 3;; + +[%%expect{| +- : unit -> int = +|}];; + let () = (let module L = List in raise Exit); () ;; [%%expect {| Line 1, characters 33-43: diff --git a/testsuite/tests/unwind/stack_walker.c b/testsuite/tests/unwind/stack_walker.c index 6d30dbe915f..c0323ddb43b 100644 --- a/testsuite/tests/unwind/stack_walker.c +++ b/testsuite/tests/unwind/stack_walker.c @@ -50,7 +50,7 @@ value ml_perform_stack_walk(value unused) { } else { printf("%s\n", procname); } - if (!strcmp(procname, "main")) break; + if (!strcmp(procname, "caml_program")) break; } { diff --git a/testsuite/tests/unwind/unwind_test.reference b/testsuite/tests/unwind/unwind_test.reference index b3804d00e51..e9d7ddd39fd 100644 --- a/testsuite/tests/unwind/unwind_test.reference +++ b/testsuite/tests/unwind/unwind_test.reference @@ -3,16 +3,8 @@ caml_c_call Mylib.baz Driver.entry caml_program -caml_start_program -caml_startup_common -caml_main -main ml_perform_stack_walk ml_do_no_alloc Mylib.bob Driver.entry caml_program -caml_start_program -caml_startup_common -caml_main -main diff --git a/testsuite/tests/warnings/marshall_for_w53.ml b/testsuite/tests/warnings/marshall_for_w53.ml new file mode 100644 index 00000000000..6c24e98c8a8 --- /dev/null +++ b/testsuite/tests/warnings/marshall_for_w53.ml @@ -0,0 +1,4 @@ +let w53_ast = + Pparse.parse_implementation ~tool_name:"w53_test" "w53.ml" + +let () = Pparse.write_ast Pparse.Structure "w53.marshalled.ml" w53_ast diff --git a/testsuite/tests/warnings/w03.compilers.reference b/testsuite/tests/warnings/w03.compilers.reference index f5a24886ce6..14ab9740a90 100644 --- a/testsuite/tests/warnings/w03.compilers.reference +++ b/testsuite/tests/warnings/w03.compilers.reference @@ -3,7 +3,7 @@ File "w03.ml", line 14, characters 8-9: ^ Alert deprecated: A -File "w03.ml", line 17, characters 12-26: +File "w03.ml", line 17, characters 15-25: 17 | exception B [@@deprecated] - ^^^^^^^^^^^^^^ + ^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context diff --git a/testsuite/tests/warnings/w26_alias.ml b/testsuite/tests/warnings/w26_alias.ml new file mode 100644 index 00000000000..0cc291b8b09 --- /dev/null +++ b/testsuite/tests/warnings/w26_alias.ml @@ -0,0 +1,19 @@ +(* TEST + expect; +*) +type t = + { x : int + ; y : int + } + +let sum ({ x; y } as t) = x + y + +[%%expect{| +type t = { x : int; y : int; } +Line 6, characters 21-22: +6 | let sum ({ x; y } as t) = x + y + ^ +Warning 26 [unused-var]: unused variable t. + +val sum : t -> int = +|}] diff --git a/testsuite/tests/warnings/w47_ppwarning.compilers.reference b/testsuite/tests/warnings/w47_ppwarning.compilers.reference new file mode 100644 index 00000000000..9b6f417dcbf --- /dev/null +++ b/testsuite/tests/warnings/w47_ppwarning.compilers.reference @@ -0,0 +1,22 @@ +File "w47_ppwarning.ml", line 10, characters 12-25: +10 | let x1 = 42 [@@ppwarning] + ^^^^^^^^^^^^^ +Warning 47 [attribute-payload]: illegal payload for attribute 'ppwarning'. +A single string literal is expected + +File "w47_ppwarning.ml", line 13, characters 12-37: +13 | let x2 = 42 [@@ppwarning "foo" "bar"] + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 47 [attribute-payload]: illegal payload for attribute 'ppwarning'. +A single string literal is expected + +File "w47_ppwarning.ml", line 16, characters 12-28: +16 | let x3 = 42 [@@ppwarning 84] + ^^^^^^^^^^^^^^^^ +Warning 47 [attribute-payload]: illegal payload for attribute 'ppwarning'. +A single string literal is expected + +File "w47_ppwarning.ml", line 19, characters 25-30: +19 | let x4 = 42 [@@ppwarning "foo"] + ^^^^^ +Warning 22 [preprocessor]: foo diff --git a/testsuite/tests/warnings/w47_ppwarning.ml b/testsuite/tests/warnings/w47_ppwarning.ml new file mode 100644 index 00000000000..fc0285ef566 --- /dev/null +++ b/testsuite/tests/warnings/w47_ppwarning.ml @@ -0,0 +1,19 @@ +(* TEST + flags = "-w +A-70"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) + +(* Warning 47 triggers on too few arguments *) +let x1 = 42 [@@ppwarning] + +(* Warning 47 triggers on too many arguments *) +let x2 = 42 [@@ppwarning "foo" "bar"] + +(* Warning 47 triggers on the wrong sort of argument *) +let x3 = 42 [@@ppwarning 84] + +(* Warning 47 doesn't trigger on a single string argument *) +let x4 = 42 [@@ppwarning "foo"] diff --git a/testsuite/tests/warnings/w53.compilers.reference b/testsuite/tests/warnings/w53.compilers.reference index 4bd621e7527..fec632304b2 100644 --- a/testsuite/tests/warnings/w53.compilers.reference +++ b/testsuite/tests/warnings/w53.compilers.reference @@ -1,84 +1,904 @@ -File "w53.ml", line 12, characters 4-5: -12 | let h x = x [@inline] (* rejected *) - ^ -Warning 32 [unused-value-declaration]: unused value h. - -File "w53.ml", line 12, characters 14-20: -12 | let h x = x [@inline] (* rejected *) - ^^^^^^ +File "w53.ml", line 12, characters 16-21: +12 | val x : int [@alert foo "foo"] (* rejected *) + ^^^^^ +Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context + +File "w53.ml", line 18, characters 6-11: +18 | [@@@alert foo "foo"] (* rejected *) + ^^^^^ +Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context + +File "w53.ml", line 22, characters 14-19: +22 | let x = 5 [@alert foo "foo"] (* rejected *) + ^^^^^ +Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context + +File "w53.ml", line 24, characters 16-21: +24 | let y = 10 [@@alert foo "foo"] (* rejected *) + ^^^^^ +Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context + +File "w53.ml", line 26, characters 6-11: +26 | [@@@alert foo "foo"] (* rejected *) + ^^^^^ +Warning 53 [misplaced-attribute]: the "alert" attribute cannot appear in this context + +File "w53.ml", line 31, characters 24-29: +31 | type t1 = { x : int [@boxed] } (* rejected *) + ^^^^^ +Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context + +File "w53.ml", line 33, characters 16-21: +33 | val x : int [@boxed] (* rejected *) + ^^^^^ +Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context + +File "w53.ml", line 37, characters 17-22: +37 | val y : int [@@boxed] (* rejected *) + ^^^^^ +Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context + +File "w53.ml", line 39, characters 6-11: +39 | [@@@boxed] (* rejected *) + ^^^^^ +Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context + +File "w53.ml", line 43, characters 16-21: +43 | let x = (42 [@boxed], 84) (* rejected *) + ^^^^^ +Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context + +File "w53.ml", line 45, characters 16-21: +45 | let y = 10 [@@boxed] (* rejected *) + ^^^^^ +Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context + +File "w53.ml", line 47, characters 6-11: +47 | [@@@boxed] (* rejected *) + ^^^^^ +Warning 53 [misplaced-attribute]: the "boxed" attribute cannot appear in this context + +File "w53.ml", line 54, characters 16-26: +54 | val x : int [@deprecated] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context + +File "w53.ml", line 60, characters 6-16: +60 | [@@@deprecated] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context + +File "w53.ml", line 64, characters 14-24: +64 | let x = 5 [@deprecated] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context + +File "w53.ml", line 66, characters 16-26: +66 | let y = 10 [@@deprecated] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context + +File "w53.ml", line 68, characters 6-16: +68 | [@@@deprecated] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated" attribute cannot appear in this context + +File "w53.ml", line 73, characters 19-37: +73 | type t1 = Foo1 [@deprecated_mutable] (* rejected *) + ^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context + +File "w53.ml", line 75, characters 16-34: +75 | val x : int [@deprecated_mutable] (* rejected *) + ^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context + +File "w53.ml", line 77, characters 21-39: +77 | type 'a t2 = 'a [@@deprecated_mutable] (* rejected *) + ^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context + +File "w53.ml", line 81, characters 24-42: +81 | type t4 = { x : int [@deprecated_mutable] } (* rejected *) + ^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context + +File "w53.ml", line 83, characters 17-35: +83 | val y : int [@@deprecated_mutable] (* rejected *) + ^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context + +File "w53.ml", line 85, characters 6-24: +85 | [@@@deprecated_mutable] (* rejected *) + ^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context + +File "w53.ml", line 89, characters 14-32: +89 | let x = 5 [@deprecated_mutable] (* rejected *) + ^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context + +File "w53.ml", line 91, characters 16-34: +91 | let y = 10 [@@deprecated_mutable] (* rejected *) + ^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context + +File "w53.ml", line 93, characters 6-24: +93 | [@@@deprecated_mutable] (* rejected *) + ^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "deprecated_mutable" attribute cannot appear in this context + +File "w53.ml", line 98, characters 32-46: +98 | type t1 = Foo1 of int * int [@explicit_arity] (* rejected *) + ^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context + +File "w53.ml", line 100, characters 16-30: +100 | val x : int [@explicit_arity] (* rejected *) + ^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context + +File "w53.ml", line 102, characters 20-34: +102 | type 'a t2 = 'a [@explicit_arity] (* rejected *) + ^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context + +File "w53.ml", line 104, characters 17-31: +104 | val y : int [@@explicit_arity] (* rejected *) + ^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context + +File "w53.ml", line 106, characters 6-20: +106 | [@@@explicit_arity] (* rejected *) + ^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context + +File "w53.ml", line 110, characters 14-28: +110 | let x = 5 [@explicit_arity] (* rejected *) + ^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context + +File "w53.ml", line 112, characters 16-30: +112 | let y = 10 [@@explicit_arity] (* rejected *) + ^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context + +File "w53.ml", line 114, characters 6-20: +114 | [@@@explicit_arity] (* rejected *) + ^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "explicit_arity" attribute cannot appear in this context + +File "w53.ml", line 119, characters 18-27: +119 | type t1 = int [@immediate] (* rejected *) + ^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context + +File "w53.ml", line 123, characters 16-25: +123 | val x : int [@immediate] (* rejected *) + ^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context + +File "w53.ml", line 124, characters 17-26: +124 | val x : int [@@immediate] (* rejected *) + ^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context + +File "w53.ml", line 126, characters 6-15: +126 | [@@@immediate] (* rejected *) + ^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context + +File "w53.ml", line 127, characters 6-17: +127 | [@@@immediate64] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "immediate64" attribute cannot appear in this context + +File "w53.ml", line 131, characters 15-24: +131 | let x = (4 [@immediate], 42 [@immediate64]) (* rejected *) + ^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context + +File "w53.ml", line 131, characters 32-43: +131 | let x = (4 [@immediate], 42 [@immediate64]) (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "immediate64" attribute cannot appear in this context + +File "w53.ml", line 132, characters 21-30: +132 | let y = (4, 42) [@@immediate] (* rejected *) + ^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context + +File "w53.ml", line 133, characters 21-32: +133 | let z = (4, 42) [@@immediate64] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "immediate64" attribute cannot appear in this context + +File "w53.ml", line 135, characters 18-27: +135 | type t1 = int [@immediate] (* rejected *) + ^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context + +File "w53.ml", line 139, characters 6-15: +139 | [@@@immediate] (* rejected *) + ^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "immediate" attribute cannot appear in this context + +File "w53.ml", line 140, characters 6-17: +140 | [@@@immediate64] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "immediate64" attribute cannot appear in this context + +File "w53.ml", line 145, characters 25-31: +145 | type t1 = int -> int [@inline] (* rejected *) + ^^^^^^ Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context -File "w53.ml", line 13, characters 14-26: -13 | let h x = x [@ocaml.inline] (* rejected *) - ^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inline" attribute cannot appear in this context +File "w53.ml", line 146, characters 26-32: +146 | type t2 = int -> int [@@inline] (* rejected *) + ^^^^^^ +Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context -File "w53.ml", line 15, characters 14-21: -15 | let i x = x [@inlined] (* rejected *) - ^^^^^^^ +File "w53.ml", line 147, characters 25-32: +147 | type t3 = int -> int [@inlined] (* rejected *) + ^^^^^^^ Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context -File "w53.ml", line 16, characters 14-27: -16 | let j x = x [@ocaml.inlined] (* rejected *) - ^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context - -File "w53.ml", line 19, characters 16-23: -19 | let l x = h x [@inlined] (* rejected *) - ^^^^^^^ +File "w53.ml", line 148, characters 26-33: +148 | type t4 = int -> int [@@inlined] (* rejected *) + ^^^^^^^ Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context -File "w53.ml", line 21, characters 14-22: -21 | let m x = x [@tailcall] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +File "w53.ml", line 150, characters 24-30: +150 | val f1 : int -> int [@inline] (* rejected *) + ^^^^^^ +Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context -File "w53.ml", line 22, characters 14-28: -22 | let n x = x [@ocaml.tailcall] (* rejected *) - ^^^^^^^^^^^^^^ -Warning 53 [misplaced-attribute]: the "ocaml.tailcall" attribute cannot appear in this context +File "w53.ml", line 151, characters 25-31: +151 | val f2 : int -> int [@@inline] (* rejected *) + ^^^^^^ +Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context -File "w53.ml", line 25, characters 16-24: -25 | let q x = h x [@tailcall] (* rejected *) - ^^^^^^^^ -Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context +File "w53.ml", line 152, characters 24-31: +152 | val f3 : int -> int [@inlined] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context + +File "w53.ml", line 153, characters 25-32: +153 | val f4 : int -> int [@@inlined] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context -File "w53.ml", line 33, characters 0-32: -33 | module C = struct end [@@inline] (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +File "w53.ml", line 155, characters 53-59: +155 | module type F = functor (X : sig end) -> sig end [@inline] (* rejected *) + ^^^^^^ Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context -File "w53.ml", line 34, characters 0-39: -34 | module C' = struct end [@@ocaml.inline] (* rejected *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +File "w53.ml", line 156, characters 54-60: +156 | module type G = functor (X : sig end) -> sig end [@@inline] (* rejected *) + ^^^^^^ Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context -File "w53.ml", line 40, characters 16-22: -40 | module G = (A [@inline])(struct end) (* rejected *) - ^^^^^^ +File "w53.ml", line 158, characters 6-12: +158 | [@@@inline] (* rejected *) + ^^^^^^ Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context -File "w53.ml", line 41, characters 17-29: -41 | module G' = (A [@ocaml.inline])(struct end) (* rejected *) +File "w53.ml", line 159, characters 6-13: +159 | [@@@inlined] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context + +File "w53.ml", line 163, characters 16-22: +163 | let h x = x [@inline] (* rejected *) + ^^^^^^ +Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context + +File "w53.ml", line 164, characters 16-28: +164 | let h x = x [@ocaml.inline] (* rejected *) ^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "ocaml.inline" attribute cannot appear in this context -File "w53.ml", line 45, characters 22-29: -45 | module I = Set.Make [@inlined] - ^^^^^^^ +File "w53.ml", line 166, characters 16-23: +166 | let i x = x [@inlined] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context + +File "w53.ml", line 167, characters 16-29: +167 | let j x = x [@ocaml.inlined] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context + +File "w53.ml", line 170, characters 18-25: +170 | let l x = h x [@inlined] (* rejected *) + ^^^^^^^ Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context -File "w53.ml", line 46, characters 23-36: -46 | module I' = Set.Make [@ocaml.inlined] - ^^^^^^^^^^^^^ +File "w53.ml", line 178, characters 27-33: +178 | module C = struct end [@@inline] (* rejected *) + ^^^^^^ +Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context + +File "w53.ml", line 179, characters 28-40: +179 | module C' = struct end [@@ocaml.inline] (* rejected *) + ^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "ocaml.inline" attribute cannot appear in this context + +File "w53.ml", line 180, characters 27-34: +180 | module D = struct end [@@inlined] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context + +File "w53.ml", line 181, characters 28-41: +181 | module D' = struct end [@@ocaml.inlined] (* rejected *) + ^^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context -File "w53.ml", line 48, characters 23-30: -48 | module J = Set.Make [@@inlined] - ^^^^^^^ +File "w53.ml", line 185, characters 18-24: +185 | module G = (A [@inline])(struct end) (* rejected *) + ^^^^^^ +Warning 53 [misplaced-attribute]: the "inline" attribute cannot appear in this context + +File "w53.ml", line 186, characters 19-31: +186 | module G' = (A [@ocaml.inline])(struct end) (* rejected *) + ^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "ocaml.inline" attribute cannot appear in this context + +File "w53.ml", line 190, characters 24-31: +190 | module I = Set.Make [@inlined] (* rejected *) + ^^^^^^^ Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context -File "w53.ml", line 49, characters 24-37: -49 | module J' = Set.Make [@@ocaml.inlined] - ^^^^^^^^^^^^^ +File "w53.ml", line 191, characters 25-38: +191 | module I' = Set.Make [@ocaml.inlined] (* rejected *) + ^^^^^^^^^^^^^ Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context + +File "w53.ml", line 193, characters 25-32: +193 | module J = Set.Make [@@inlined] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "inlined" attribute cannot appear in this context + +File "w53.ml", line 194, characters 26-39: +194 | module J' = Set.Make [@@ocaml.inlined] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "ocaml.inlined" attribute cannot appear in this context + +File "w53.ml", line 199, characters 21-28: +199 | type 'a t1 = 'a [@@noalloc] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context + +File "w53.ml", line 200, characters 19-26: +200 | type s1 = Foo1 [@noalloc] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context + +File "w53.ml", line 201, characters 19-26: +201 | val x : int64 [@@noalloc] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context + +File "w53.ml", line 203, characters 24-31: +203 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context + +File "w53.ml", line 203, characters 46-53: +203 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context + +File "w53.ml", line 208, characters 21-28: +208 | type 'a t1 = 'a [@@noalloc] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context + +File "w53.ml", line 209, characters 19-26: +209 | type s1 = Foo1 [@noalloc] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context + +File "w53.ml", line 210, characters 25-32: +210 | let x : int64 = 42L [@@noalloc] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context + +File "w53.ml", line 212, characters 24-31: +212 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context + +File "w53.ml", line 212, characters 46-53: +212 | external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "noalloc" attribute cannot appear in this context + +File "w53.ml", line 241, characters 21-29: +241 | type 'a t1 = 'a [@@tailcall] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context + +File "w53.ml", line 242, characters 19-27: +242 | type s1 = Foo1 [@tailcall] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context + +File "w53.ml", line 243, characters 16-24: +243 | val x : int [@tailcall] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context + +File "w53.ml", line 245, characters 35-43: +245 | external z : int -> int = "x" [@@tailcall] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context + +File "w53.ml", line 247, characters 6-14: +247 | [@@@tailcall] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context + +File "w53.ml", line 251, characters 21-29: +251 | type 'a t1 = 'a [@@tailcall] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context + +File "w53.ml", line 252, characters 19-27: +252 | type s1 = Foo1 [@tailcall] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context + +File "w53.ml", line 254, characters 16-24: +254 | let m x = x [@tailcall] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context + +File "w53.ml", line 255, characters 16-30: +255 | let n x = x [@ocaml.tailcall] (* rejected *) + ^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "ocaml.tailcall" attribute cannot appear in this context + +File "w53.ml", line 258, characters 18-26: +258 | let q x = m x [@tailcall] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context + +File "w53.ml", line 260, characters 35-43: +260 | external z : int -> int = "x" [@@tailcall] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context + +File "w53.ml", line 262, characters 6-14: +262 | [@@@tailcall] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tailcall" attribute cannot appear in this context + +File "w53.ml", line 267, characters 24-31: +267 | type t1 = { x : int [@unboxed] } (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context + +File "w53.ml", line 269, characters 16-23: +269 | val x : int [@unboxed] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context + +File "w53.ml", line 273, characters 17-24: +273 | val y : int [@@unboxed] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context + +File "w53.ml", line 277, characters 6-13: +277 | [@@@unboxed] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context + +File "w53.ml", line 281, characters 16-23: +281 | let x = (42 [@unboxed], 84) (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context + +File "w53.ml", line 283, characters 16-23: +283 | let y = 10 [@@unboxed] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context + +File "w53.ml", line 287, characters 6-13: +287 | [@@@unboxed] (* rejected *) + ^^^^^^^ +Warning 53 [misplaced-attribute]: the "unboxed" attribute cannot appear in this context + +File "w53.ml", line 292, characters 21-29: +292 | type 'a t1 = 'a [@@untagged] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context + +File "w53.ml", line 293, characters 19-27: +293 | type s1 = Foo1 [@untagged] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context + +File "w53.ml", line 294, characters 17-25: +294 | val x : int [@@untagged] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context + +File "w53.ml", line 301, characters 21-29: +301 | type 'a t1 = 'a [@@untagged] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context + +File "w53.ml", line 302, characters 19-27: +302 | type s1 = Foo1 [@untagged] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context + +File "w53.ml", line 303, characters 22-30: +303 | let x : int = 42 [@@untagged] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "untagged" attribute cannot appear in this context + +File "w53.ml", line 311, characters 24-32: +311 | type t1 = { x : int [@unrolled 42] } (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 312, characters 27-35: +312 | type t2 = { x : int } [@@unrolled 42] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 314, characters 23-31: +314 | val f : int -> int [@unrolled 42] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 315, characters 24-32: +315 | val g : int -> int [@@unrolled 42] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 317, characters 39-47: +317 | external z : float -> float = "x" [@@unrolled 42] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 319, characters 6-14: +319 | [@@@unrolled 42] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 323, characters 8-16: +323 | let [@unrolled 42] rec test_unrolled x = (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 330, characters 24-32: +330 | type t1 = { x : int [@unrolled 42] } (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 331, characters 27-35: +331 | type t2 = { x : int } [@@unrolled 42] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 333, characters 22-30: +333 | let rec f x = f x [@unrolled 42] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 334, characters 23-31: +334 | let rec f x = f x [@@unrolled 42] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 336, characters 39-47: +336 | external z : int -> int = "x" "y" [@@unrolled 42] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 338, characters 6-14: +338 | [@@@unrolled 42] (* rejected *) + ^^^^^^^^ +Warning 53 [misplaced-attribute]: the "unrolled" attribute cannot appear in this context + +File "w53.ml", line 387, characters 25-48: +387 | | Lit_pat2 of int [@@warn_on_literal_pattern] (* rejected *) + ^^^^^^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context + +File "w53.ml", line 391, characters 16-39: +391 | val x : int [@warn_on_literal_pattern] (* rejected *) + ^^^^^^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context + +File "w53.ml", line 393, characters 21-44: +393 | type 'a t2 = 'a [@@warn_on_literal_pattern] (* rejected *) + ^^^^^^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context + +File "w53.ml", line 395, characters 17-40: +395 | val y : int [@@warn_on_literal_pattern] (* rejected *) + ^^^^^^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context + +File "w53.ml", line 397, characters 6-29: +397 | [@@@warn_on_literal_pattern] (* rejected *) + ^^^^^^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context + +File "w53.ml", line 403, characters 25-48: +403 | | Lit_pat2 of int [@@warn_on_literal_pattern] (* rejected *) + ^^^^^^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context + +File "w53.ml", line 405, characters 14-37: +405 | let x = 5 [@warn_on_literal_pattern] (* rejected *) + ^^^^^^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context + +File "w53.ml", line 407, characters 16-39: +407 | let y = 10 [@@warn_on_literal_pattern] (* rejected *) + ^^^^^^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context + +File "w53.ml", line 409, characters 6-29: +409 | [@@@warn_on_literal_pattern] (* rejected *) + ^^^^^^^^^^^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "warn_on_literal_pattern" attribute cannot appear in this context + +File "w53.ml", line 418, characters 21-25: +418 | type 'a t1 = 'a [@@poll error] (* rejected *) + ^^^^ +Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context + +File "w53.ml", line 419, characters 19-23: +419 | type s1 = Foo1 [@poll error] (* rejected *) + ^^^^ +Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context + +File "w53.ml", line 420, characters 19-23: +420 | val x : int64 [@@poll error] (* rejected *) + ^^^^ +Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context + +File "w53.ml", line 422, characters 24-28: +422 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) + ^^^^ +Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context + +File "w53.ml", line 422, characters 49-53: +422 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) + ^^^^ +Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context + +File "w53.ml", line 424, characters 39-43: +424 | external z : int64 -> int64 = "x" [@@poll error] (* rejected *) + ^^^^ +Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context + +File "w53.ml", line 428, characters 21-25: +428 | type 'a t1 = 'a [@@poll error] (* rejected *) + ^^^^ +Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context + +File "w53.ml", line 429, characters 19-23: +429 | type s1 = Foo1 [@poll error] (* rejected *) + ^^^^ +Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context + +File "w53.ml", line 430, characters 25-29: +430 | let x : int64 = 42L [@@poll error] (* rejected *) + ^^^^ +Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context + +File "w53.ml", line 433, characters 24-28: +433 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) + ^^^^ +Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context + +File "w53.ml", line 433, characters 49-53: +433 | external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) + ^^^^ +Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context + +File "w53.ml", line 435, characters 39-43: +435 | external z : int64 -> int64 = "x" [@@poll error] (* rejected *) + ^^^^ +Warning 53 [misplaced-attribute]: the "poll" attribute cannot appear in this context + +File "w53.ml", line 440, characters 21-31: +440 | type 'a t1 = 'a [@@specialise] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 441, characters 19-29: +441 | type s1 = Foo1 [@specialise] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 442, characters 19-29: +442 | val x : int64 [@@specialise] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 444, characters 24-34: +444 | external y : (int64 [@specialise]) -> (int64 [@specialise]) = (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 444, characters 49-59: +444 | external y : (int64 [@specialise]) -> (int64 [@specialise]) = (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 446, characters 39-49: +446 | external z : int64 -> int64 = "x" [@@specialise] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 450, characters 21-31: +450 | type 'a t1 = 'a [@@specialise] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 451, characters 19-29: +451 | type s1 = Foo1 [@specialise] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 452, characters 25-35: +452 | let x : int64 = 42L [@@specialise] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 454, characters 16-26: +454 | let g x = (f[@specialise]) x (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 456, characters 24-34: +456 | external y : (int64 [@specialise]) -> (int64 [@specialise]) = (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 456, characters 49-59: +456 | external y : (int64 [@specialise]) -> (int64 [@specialise]) = (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 458, characters 39-49: +458 | external z : int64 -> int64 = "x" [@@specialise] (* rejected *) + ^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialise" attribute cannot appear in this context + +File "w53.ml", line 463, characters 21-32: +463 | type 'a t1 = 'a [@@specialised] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 464, characters 19-30: +464 | type s1 = Foo1 [@specialised] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 465, characters 19-30: +465 | val x : int64 [@@specialised] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 467, characters 24-35: +467 | external y : (int64 [@specialised]) -> (int64 [@specialised]) = (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 467, characters 50-61: +467 | external y : (int64 [@specialised]) -> (int64 [@specialised]) = (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 469, characters 39-50: +469 | external z : int64 -> int64 = "x" [@@specialised] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 473, characters 21-32: +473 | type 'a t1 = 'a [@@specialised] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 474, characters 19-30: +474 | type s1 = Foo1 [@specialised] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 475, characters 25-36: +475 | let x : int64 = 42L [@@specialised] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 476, characters 8-19: +476 | let [@specialised] f x = x (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 479, characters 24-35: +479 | external y : (int64 [@specialised]) -> (int64 [@specialised]) = (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 479, characters 50-61: +479 | external y : (int64 [@specialised]) -> (int64 [@specialised]) = (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 481, characters 39-50: +481 | external z : int64 -> int64 = "x" [@@specialised] (* rejected *) + ^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "specialised" attribute cannot appear in this context + +File "w53.ml", line 486, characters 21-34: +486 | type 'a t1 = 'a [@@tail_mod_cons] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context + +File "w53.ml", line 487, characters 19-32: +487 | type s1 = Foo1 [@tail_mod_cons] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context + +File "w53.ml", line 488, characters 19-32: +488 | val x : int64 [@@tail_mod_cons] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context + +File "w53.ml", line 490, characters 24-37: +490 | external y : (int64 [@tail_mod_cons]) -> (int64 [@tail_mod_cons]) = + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context + +File "w53.ml", line 490, characters 52-65: +490 | external y : (int64 [@tail_mod_cons]) -> (int64 [@tail_mod_cons]) = + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context + +File "w53.ml", line 493, characters 39-52: +493 | external z : int64 -> int64 = "x" [@@tail_mod_cons] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context + +File "w53.ml", line 497, characters 21-34: +497 | type 'a t1 = 'a [@@tail_mod_cons] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context + +File "w53.ml", line 498, characters 19-32: +498 | type s1 = Foo1 [@tail_mod_cons] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context + +File "w53.ml", line 499, characters 25-38: +499 | let x : int64 = 42L [@@tail_mod_cons] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context + +File "w53.ml", line 501, characters 16-29: +501 | let g x = (f[@tail_mod_cons]) x (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context + +File "w53.ml", line 503, characters 24-37: +503 | external y : (int64 [@tail_mod_cons]) -> (int64 [@tail_mod_cons]) = + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context + +File "w53.ml", line 503, characters 52-65: +503 | external y : (int64 [@tail_mod_cons]) -> (int64 [@tail_mod_cons]) = + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context + +File "w53.ml", line 506, characters 39-52: +506 | external z : int64 -> int64 = "x" [@@tail_mod_cons] (* rejected *) + ^^^^^^^^^^^^^ +Warning 53 [misplaced-attribute]: the "tail_mod_cons" attribute cannot appear in this context diff --git a/testsuite/tests/warnings/w53.ml b/testsuite/tests/warnings/w53.ml index 545fec18b15..dbfe3e3d45a 100644 --- a/testsuite/tests/warnings/w53.ml +++ b/testsuite/tests/warnings/w53.ml @@ -1,57 +1,507 @@ -(* TEST_BELOW -(* Blank lines added here to preserve locations. *) +(* TEST + flags = "-w +A-22-27-32-60-67-70-71-72"; + setup-ocamlc.byte-build-env; + compile_only = "true"; + ocamlc.byte; + check-ocamlc.byte-output; +*) +module type TestAlertSig = sig + type t1 = Foo1 [@alert foo "foo"] (* accepted *) + val x : int [@alert foo "foo"] (* rejected *) + type 'a t2 = 'a [@@alert foo "foo"] (* accepted *) + val y : int [@@alert foo "foo"] (* accepted *) + [@@@alert foo "foo"] (* rejected *) +end +module TestAlertStruct = struct + let x = 5 [@alert foo "foo"] (* rejected *) -*) + let y = 10 [@@alert foo "foo"] (* rejected *) -let h x = x [@inline] (* rejected *) -let h x = x [@ocaml.inline] (* rejected *) + [@@@alert foo "foo"] (* rejected *) +end -let i x = x [@inlined] (* rejected *) -let j x = x [@ocaml.inlined] (* rejected *) -let k x = (h [@inlined]) x (* accepted *) -let k' x = (h [@ocaml.inlined]) x (* accepted *) -let l x = h x [@inlined] (* rejected *) -let m x = x [@tailcall] (* rejected *) -let n x = x [@ocaml.tailcall] (* rejected *) -let o x = (h [@tailcall]) x (* accepted *) -let p x = (h [@ocaml.tailcall]) x (* accepted *) -let q x = h x [@tailcall] (* rejected *) +module type TestBoxedSig = sig + type t1 = { x : int [@boxed] } (* rejected *) -module type E = sig end + val x : int [@boxed] (* rejected *) -module A(E:E) = struct end [@@inline] (* accepted *) -module A'(E:E) = struct end [@@ocaml.inline] (* accepted *) -module B = ((functor (E:E) -> struct end) [@inline]) (* accepted *) -module B' = ((functor (E:E) -> struct end) [@ocaml.inline]) (* accepted *) -module C = struct end [@@inline] (* rejected *) -module C' = struct end [@@ocaml.inline] (* rejected *) -module D = struct end [@@inlined] (* rejected *) -module D' = struct end [@@ocaml.inlined] (* rejected *) + type t2 = { x : int } [@@boxed] (* accepted *) -module F = (A [@inlined])(struct end) (* accepted *) -module F' = (A [@ocaml.inlined])(struct end) (* accepted *) -module G = (A [@inline])(struct end) (* rejected *) -module G' = (A [@ocaml.inline])(struct end) (* rejected *) + val y : int [@@boxed] (* rejected *) -module H = Set.Make [@inlined] (Int32) (* GPR#1808 *) + [@@@boxed] (* rejected *) +end -module I = Set.Make [@inlined] -module I' = Set.Make [@ocaml.inlined] +module TestBoxedStruct = struct + let x = (42 [@boxed], 84) (* rejected *) -module J = Set.Make [@@inlined] -module J' = Set.Make [@@ocaml.inlined] + let y = 10 [@@boxed] (* rejected *) -(* TEST - flags = "-w +A-60-70"; - setup-ocamlc.byte-build-env; - compile_only = "true"; - ocamlc.byte; - check-ocamlc.byte-output; -*) + [@@@boxed] (* rejected *) +end + + +module type TestDeprecatedSig = sig + type t1 = Foo1 [@deprecated] (* accepted *) + + val x : int [@deprecated] (* rejected *) + + type 'a t2 = 'a [@@deprecated] (* accepted *) + + val y : int [@@deprecated] (* accepted *) + + [@@@deprecated] (* rejected *) +end + +module TestDeprecatedStruct = struct + let x = 5 [@deprecated] (* rejected *) + + let y = 10 [@@deprecated] (* rejected *) + + [@@@deprecated] (* rejected *) +end + + +module type TestDeprecatedMutableSig = sig + type t1 = Foo1 [@deprecated_mutable] (* rejected *) + + val x : int [@deprecated_mutable] (* rejected *) + + type 'a t2 = 'a [@@deprecated_mutable] (* rejected *) + + type t3 = { mutable x : int [@deprecated_mutable] } (* accepted *) + + type t4 = { x : int [@deprecated_mutable] } (* rejected *) + + val y : int [@@deprecated_mutable] (* rejected *) + + [@@@deprecated_mutable] (* rejected *) +end + +module TestDeprecatedMutableStruct = struct + let x = 5 [@deprecated_mutable] (* rejected *) + + let y = 10 [@@deprecated_mutable] (* rejected *) + + [@@@deprecated_mutable] (* rejected *) +end + + +module type TestExplicitAritySig = sig + type t1 = Foo1 of int * int [@explicit_arity] (* rejected *) + + val x : int [@explicit_arity] (* rejected *) + + type 'a t2 = 'a [@explicit_arity] (* rejected *) + + val y : int [@@explicit_arity] (* rejected *) + + [@@@explicit_arity] (* rejected *) +end + +module TestExplicitArityStruct = struct + let x = 5 [@explicit_arity] (* rejected *) + + let y = 10 [@@explicit_arity] (* rejected *) + + [@@@explicit_arity] (* rejected *) +end + + +module type TestImmediateSig = sig + type t1 = int [@immediate] (* rejected *) + type t2 = int [@@immediate] (* accepted *) + type t3 [@@immediate64] (* accepted *) + + val x : int [@immediate] (* rejected *) + val x : int [@@immediate] (* rejected *) + + [@@@immediate] (* rejected *) + [@@@immediate64] (* rejected *) +end + +module TestImmediateStruct = struct + let x = (4 [@immediate], 42 [@immediate64]) (* rejected *) + let y = (4, 42) [@@immediate] (* rejected *) + let z = (4, 42) [@@immediate64] (* rejected *) + + type t1 = int [@immediate] (* rejected *) + type t2 = int [@@immediate] (* accepted *) + type t3 [@@immediate64] (* accepted *) + + [@@@immediate] (* rejected *) + [@@@immediate64] (* rejected *) +end + + +module type TestInlineSig = sig + type t1 = int -> int [@inline] (* rejected *) + type t2 = int -> int [@@inline] (* rejected *) + type t3 = int -> int [@inlined] (* rejected *) + type t4 = int -> int [@@inlined] (* rejected *) + + val f1 : int -> int [@inline] (* rejected *) + val f2 : int -> int [@@inline] (* rejected *) + val f3 : int -> int [@inlined] (* rejected *) + val f4 : int -> int [@@inlined] (* rejected *) + + module type F = functor (X : sig end) -> sig end [@inline] (* rejected *) + module type G = functor (X : sig end) -> sig end [@@inline] (* rejected *) + + [@@@inline] (* rejected *) + [@@@inlined] (* rejected *) +end + +module TestInlineStruct = struct + let h x = x [@inline] (* rejected *) + let h x = x [@ocaml.inline] (* rejected *) + + let i x = x [@inlined] (* rejected *) + let j x = x [@ocaml.inlined] (* rejected *) + let k x = (h [@inlined]) x (* accepted *) + let k' x = (h [@ocaml.inlined]) x (* accepted *) + let l x = h x [@inlined] (* rejected *) + + module type E = sig end + + module A(E:E) = struct end [@@inline] (* accepted *) + module A'(E:E) = struct end [@@ocaml.inline] (* accepted *) + module B = ((functor (E:E) -> struct end) [@inline]) (* accepted *) + module B' = ((functor (E:E) -> struct end) [@ocaml.inline]) (* accepted *) + module C = struct end [@@inline] (* rejected *) + module C' = struct end [@@ocaml.inline] (* rejected *) + module D = struct end [@@inlined] (* rejected *) + module D' = struct end [@@ocaml.inlined] (* rejected *) + + module F = (A [@inlined])(struct end) (* accepted *) + module F' = (A [@ocaml.inlined])(struct end) (* accepted *) + module G = (A [@inline])(struct end) (* rejected *) + module G' = (A [@ocaml.inline])(struct end) (* rejected *) + + module H = Set.Make [@inlined] (Int32) (* accepted *) (* GPR#1808 *) + + module I = Set.Make [@inlined] (* rejected *) + module I' = Set.Make [@ocaml.inlined] (* rejected *) + + module J = Set.Make [@@inlined] (* rejected *) + module J' = Set.Make [@@ocaml.inlined] (* rejected *) +end + + +module type TestNoallocSig = sig + type 'a t1 = 'a [@@noalloc] (* rejected *) + type s1 = Foo1 [@noalloc] (* rejected *) + val x : int64 [@@noalloc] (* rejected *) + + external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) + external z : int64 -> int64 = "x" [@@noalloc] (* accepted *) +end + +module TestNoallocStruct = struct + type 'a t1 = 'a [@@noalloc] (* rejected *) + type s1 = Foo1 [@noalloc] (* rejected *) + let x : int64 = 42L [@@noalloc] (* rejected *) + + external y : (int64 [@noalloc]) -> (int64 [@noalloc]) = "x" (* rejected *) + external z : int64 -> int64 = "x" [@@noalloc] (* accepted *) +end + + +module type TestPpwarningSig = sig + type 'a t1 = 'a [@@ppwarning "foo01"] (* accepted *) + type s1 = Foo1 [@ppwarning "foo02"] (* accepted *) + val x : int [@@ppwarning "foo03"] (* accepted *) + + external z : int -> int = "x" [@@ppwarning "foo04"] (* accepted *) + + [@@@ppwarning "foo05"] (* accepted *) +end + +module TestPpwarningStruct = struct + type 'a t1 = 'a [@@ppwarning "foo06"] (* accepted *) + type s1 = Foo1 [@ppwarning "foo07"] (* accepted *) + let x = 42 [@@ppwarning "foo08"] (* accepted *) + + let f x = (25 [@ppwarning "foo09"]) + 17 (* accepted *) + + external z : int -> int = "x" [@@ppwarning "foo10"] (* accepted *) + + [@@@ppwarning "foo11"] (* accepted *) +end + + +module type TestTailcallSig = sig + type 'a t1 = 'a [@@tailcall] (* rejected *) + type s1 = Foo1 [@tailcall] (* rejected *) + val x : int [@tailcall] (* rejected *) + + external z : int -> int = "x" [@@tailcall] (* rejected *) + + [@@@tailcall] (* rejected *) +end + +module TestTailcallStruct = struct + type 'a t1 = 'a [@@tailcall] (* rejected *) + type s1 = Foo1 [@tailcall] (* rejected *) + + let m x = x [@tailcall] (* rejected *) + let n x = x [@ocaml.tailcall] (* rejected *) + let o x = (m [@tailcall]) x (* accepted *) + let p x = (m [@ocaml.tailcall]) x (* accepted *) + let q x = m x [@tailcall] (* rejected *) + + external z : int -> int = "x" [@@tailcall] (* rejected *) + + [@@@tailcall] (* rejected *) +end + + +module type TestUnboxedSig = sig + type t1 = { x : int [@unboxed] } (* rejected *) + + val x : int [@unboxed] (* rejected *) + + type t2 = { x : int } [@@unboxed] (* accepted *) + + val y : int [@@unboxed] (* rejected *) + + external z : float -> float = "x" "y" [@@unboxed] (* accepted *) + + [@@@unboxed] (* rejected *) +end + +module TestUnboxedStruct = struct + let x = (42 [@unboxed], 84) (* rejected *) + + let y = 10 [@@unboxed] (* rejected *) + + external z : float -> float = "x" "y" [@@unboxed] (* accepted *) + + [@@@unboxed] (* rejected *) +end + + +module type TestUntaggedSig = sig + type 'a t1 = 'a [@@untagged] (* rejected *) + type s1 = Foo1 [@untagged] (* rejected *) + val x : int [@@untagged] (* rejected *) + + external y : (int [@untagged]) -> (int [@untagged]) = "x" "y" (* accepted *) + external z : int -> int = "x" "y" [@@untagged] (* accepted *) +end + +module TestUntaggedStruct = struct + type 'a t1 = 'a [@@untagged] (* rejected *) + type s1 = Foo1 [@untagged] (* rejected *) + let x : int = 42 [@@untagged] (* rejected *) + + external y : (int [@untagged]) -> (int [@untagged]) = "x" "y" (* accepted *) + external z : int -> int = "x" "y" [@@untagged] (* accepted *) +end + + +module type TestUnrolledSig = sig + type t1 = { x : int [@unrolled 42] } (* rejected *) + type t2 = { x : int } [@@unrolled 42] (* rejected *) + + val f : int -> int [@unrolled 42] (* rejected *) + val g : int -> int [@@unrolled 42] (* rejected *) + + external z : float -> float = "x" [@@unrolled 42] (* rejected *) + + [@@@unrolled 42] (* rejected *) +end + +module TestUnrolledStruct = struct + let [@unrolled 42] rec test_unrolled x = (* rejected *) + match x with + | 0 -> () + | n -> test_unrolled (n - 1) + + let () = (test_unrolled [@unrolled 42]) 10 (* accepted *) + + type t1 = { x : int [@unrolled 42] } (* rejected *) + type t2 = { x : int } [@@unrolled 42] (* rejected *) + + let rec f x = f x [@unrolled 42] (* rejected *) + let rec f x = f x [@@unrolled 42] (* rejected *) + + external z : int -> int = "x" "y" [@@unrolled 42] (* rejected *) + + [@@@unrolled 42] (* rejected *) +end + + +module type TestWarnErrorSig = sig + type t1 = Foo1 [@warnerror "-a+31"] (* accepted *) + + val x : int [@warnerror "-a+31"] (* accepted *) + + type 'a t2 = 'a [@@warnerror "-a+31"] (* accepted *) + + val y : int [@@warnerror "-a+31"] (* accepted *) + + [@@@warnerror "-a+31"] (* accepted *) +end + +module TestWarnErrorStruct = struct + let x = 5 [@warnerror "-a+31"] (* accepted *) + + let y = 10 [@@warnerror "-a+31"] (* accepted *) + + [@@@warnerror "-a+31"] (* accepted *) +end + + +module type TestWarningSig = sig + type t1 = Foo1 [@warning "-a+31"] (* accepted *) + + val x : int [@warning "-a+31"] (* accepted *) + + type 'a t2 = 'a [@@warning "-a+31"] (* accepted *) + + val y : int [@@warning "-a+31"] (* accepted *) + + [@@@warning "-a+31"] (* accepted *) +end + +module TestWarningStruct = struct + let x = 5 [@warning "-a+31"] (* accepted *) + + let y = 10 [@@warning "-a+31"] (* accepted *) + + [@@@warning "-a+31"] (* accepted *) +end + + +module type TestWarnOnLiteralPatternSig = sig + type test_literal_pattern = + | Lit_pat1 of int [@warn_on_literal_pattern] (* accepted *) + | Lit_pat2 of int [@@warn_on_literal_pattern] (* rejected *) + + type t1 = Foo1 [@warn_on_literal_pattern] (* accepted *) + + val x : int [@warn_on_literal_pattern] (* rejected *) + + type 'a t2 = 'a [@@warn_on_literal_pattern] (* rejected *) + + val y : int [@@warn_on_literal_pattern] (* rejected *) + + [@@@warn_on_literal_pattern] (* rejected *) +end + +module TestWarnOnLiteralPatternStruct = struct + type test_literal_pattern = + | Lit_pat1 of int [@warn_on_literal_pattern] (* accepted *) + | Lit_pat2 of int [@@warn_on_literal_pattern] (* rejected *) + + let x = 5 [@warn_on_literal_pattern] (* rejected *) + + let y = 10 [@@warn_on_literal_pattern] (* rejected *) + + [@@@warn_on_literal_pattern] (* rejected *) +end + + +(* Attributes in attributes shouldn't be tracked for w53 *) +[@@@foo [@@@deprecated]] + + +module type TestPollSig = sig + type 'a t1 = 'a [@@poll error] (* rejected *) + type s1 = Foo1 [@poll error] (* rejected *) + val x : int64 [@@poll error] (* rejected *) + + external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) + "x" + external z : int64 -> int64 = "x" [@@poll error] (* rejected *) +end + +module TestPollStruct = struct + type 'a t1 = 'a [@@poll error] (* rejected *) + type s1 = Foo1 [@poll error] (* rejected *) + let x : int64 = 42L [@@poll error] (* rejected *) + let [@poll error] f x = x (* accepted *) + + external y : (int64 [@poll error]) -> (int64 [@poll error]) = (* rejected *) + "x" + external z : int64 -> int64 = "x" [@@poll error] (* rejected *) +end + + +module type TestSpecialiseSig = sig + type 'a t1 = 'a [@@specialise] (* rejected *) + type s1 = Foo1 [@specialise] (* rejected *) + val x : int64 [@@specialise] (* rejected *) + + external y : (int64 [@specialise]) -> (int64 [@specialise]) = (* rejected *) + "x" + external z : int64 -> int64 = "x" [@@specialise] (* rejected *) +end + +module TestSpecialiseStruct = struct + type 'a t1 = 'a [@@specialise] (* rejected *) + type s1 = Foo1 [@specialise] (* rejected *) + let x : int64 = 42L [@@specialise] (* rejected *) + let [@specialise] f x = x (* accepted *) + let g x = (f[@specialise]) x (* rejected *) + + external y : (int64 [@specialise]) -> (int64 [@specialise]) = (* rejected *) + "x" + external z : int64 -> int64 = "x" [@@specialise] (* rejected *) +end + + +module type TestSpecialisedSig = sig + type 'a t1 = 'a [@@specialised] (* rejected *) + type s1 = Foo1 [@specialised] (* rejected *) + val x : int64 [@@specialised] (* rejected *) + + external y : (int64 [@specialised]) -> (int64 [@specialised]) = (* rejected *) + "x" + external z : int64 -> int64 = "x" [@@specialised] (* rejected *) +end + +module TestSpecialisedStruct = struct + type 'a t1 = 'a [@@specialised] (* rejected *) + type s1 = Foo1 [@specialised] (* rejected *) + let x : int64 = 42L [@@specialised] (* rejected *) + let [@specialised] f x = x (* rejected *) + let g x = (f[@specialised]) x (* accepted *) + + external y : (int64 [@specialised]) -> (int64 [@specialised]) = (* rejected *) + "x" + external z : int64 -> int64 = "x" [@@specialised] (* rejected *) +end + + +module type TestTailModConsSig = sig + type 'a t1 = 'a [@@tail_mod_cons] (* rejected *) + type s1 = Foo1 [@tail_mod_cons] (* rejected *) + val x : int64 [@@tail_mod_cons] (* rejected *) + + external y : (int64 [@tail_mod_cons]) -> (int64 [@tail_mod_cons]) = + (* rejected *) + "x" + external z : int64 -> int64 = "x" [@@tail_mod_cons] (* rejected *) +end + +module TestTailModConsStruct = struct + type 'a t1 = 'a [@@tail_mod_cons] (* rejected *) + type s1 = Foo1 [@tail_mod_cons] (* rejected *) + let x : int64 = 42L [@@tail_mod_cons] (* rejected *) + let [@tail_mod_cons] f x = x (* accepted *) + let g x = (f[@tail_mod_cons]) x (* rejected *) + + external y : (int64 [@tail_mod_cons]) -> (int64 [@tail_mod_cons]) = + (* rejected *) + "x" + external z : int64 -> int64 = "x" [@@tail_mod_cons] (* rejected *) +end diff --git a/testsuite/tests/warnings/w53_marshalled.ml b/testsuite/tests/warnings/w53_marshalled.ml new file mode 100644 index 00000000000..b2b16ac4b53 --- /dev/null +++ b/testsuite/tests/warnings/w53_marshalled.ml @@ -0,0 +1,17 @@ +(* TEST + readonly_files = "marshall_for_w53.ml w53.ml"; + setup-ocamlc.byte-build-env; + all_modules = "marshall_for_w53.ml"; + program = "${test_build_directory}/marshall_for_w53.exe"; + flags = "-w +A-22-27-32-60-67-70-71-72"; + ocamlc.byte with ocamlcommon; + run; + all_modules = "w53.marshalled.ml"; + ocamlc.byte; + compiler_reference = "${test_source_directory}/w53.compilers.reference"; + check-ocamlc.byte-output; +*) + +(* This tests that warning 53 happen appropriately when dealing with marshalled + ASTs. It does that by marshalling `w53.ml` to disk and then passing the + marshalled ast to the compiler. *) diff --git a/testsuite/tools/asmgen_power.S b/testsuite/tools/asmgen_power.S index 71c692f97bf..b3323484172 100644 --- a/testsuite/tools/asmgen_power.S +++ b/testsuite/tools/asmgen_power.S @@ -10,55 +10,11 @@ /* */ /*********************************************************************/ -#if defined(MODEL_ppc64) || defined(MODEL_ppc64le) -#define EITHER(a,b) b -#else -#define EITHER(a,b) a -#endif - -#define WORD EITHER(4,8) -#define lg EITHER(lwz,ld) -#define lgu EITHER(lwzu,ldu) -#define stg EITHER(stw,std) -#define stgu EITHER(stwu,stdu) - -#if defined(MODEL_ppc) -#define RESERVED_STACK 16 -#define LR_SAVE_AREA 4 -#endif -#if defined(MODEL_ppc64) -#define RESERVED_STACK 48 -#define LR_SAVE_AREA 16 -#endif -#if defined(MODEL_ppc64le) #define RESERVED_STACK 32 #define LR_SAVE_AREA 16 -#endif /* Function definitions */ -#if defined(MODEL_ppc) -#define FUNCTION(name) \ - .section ".text"; \ - .globl name; \ - .type name, @function; \ - .align 2; \ - name: -#endif - -#if defined(MODEL_ppc64) -#define FUNCTION(name) \ - .section ".opd","aw"; \ - .align 3; \ - .globl name; \ - .type name, @function; \ - name: .quad .L.name,.TOC.@tocbase; \ - .text; \ - .align 2; \ - .L.name: -#endif - -#if defined(MODEL_ppc64le) #define FUNCTION(name) \ .section ".text"; \ .globl name; \ @@ -68,35 +24,34 @@ 0: addis 2, 12, (.TOC. - 0b)@ha; \ addi 2, 2, (.TOC. - 0b)@l; \ .localentry name, . - 0b -#endif FUNCTION(call_gen_code) /* Allocate and link stack frame */ - stgu 1, -(WORD*18 + 8*18 + RESERVED_STACK)(1) + stdu 1, -(8*18 + 8*18 + RESERVED_STACK)(1) /* 18 saved GPRs, 18 saved FPRs */ /* Save return address */ mflr 0 - stg 0, (WORD*18 + 8*18 + RESERVED_STACK + LR_SAVE_AREA)(1) + std 0, (8*18 + 8*18 + RESERVED_STACK + LR_SAVE_AREA)(1) /* Save all callee-save registers, starting at RESERVED_STACK */ - addi 11, 1, RESERVED_STACK - WORD - stgu 14, WORD(11) - stgu 15, WORD(11) - stgu 16, WORD(11) - stgu 17, WORD(11) - stgu 18, WORD(11) - stgu 19, WORD(11) - stgu 20, WORD(11) - stgu 21, WORD(11) - stgu 22, WORD(11) - stgu 23, WORD(11) - stgu 24, WORD(11) - stgu 25, WORD(11) - stgu 26, WORD(11) - stgu 27, WORD(11) - stgu 28, WORD(11) - stgu 29, WORD(11) - stgu 30, WORD(11) - stgu 31, WORD(11) + addi 11, 1, RESERVED_STACK - 8 + stdu 14, 8(11) + stdu 15, 8(11) + stdu 16, 8(11) + stdu 17, 8(11) + stdu 18, 8(11) + stdu 19, 8(11) + stdu 20, 8(11) + stdu 21, 8(11) + stdu 22, 8(11) + stdu 23, 8(11) + stdu 24, 8(11) + stdu 25, 8(11) + stdu 26, 8(11) + stdu 27, 8(11) + stdu 28, 8(11) + stdu 29, 8(11) + stdu 30, 8(11) + stdu 31, 8(11) stfdu 14, 8(11) stfdu 15, 8(11) stfdu 16, 8(11) @@ -116,18 +71,8 @@ FUNCTION(call_gen_code) stfdu 30, 8(11) stfdu 31, 8(11) /* Get function pointer in CTR */ -#if defined(MODEL_ppc) - mtctr 3 -#elif defined(MODEL_ppc64) - ld 0, 0(3) - mtctr 0 - ld 2, 8(3) -#elif defined(MODEL_ppc64le) mtctr 3 mr 12, 3 -#else -#error "wrong MODEL" -#endif /* Shuffle arguments */ mr 3, 4 mr 4, 5 @@ -136,25 +81,25 @@ FUNCTION(call_gen_code) /* Call the function */ bctrl /* Restore callee-save registers */ - addi 11, 1, RESERVED_STACK - WORD - lgu 14, WORD(11) - lgu 15, WORD(11) - lgu 16, WORD(11) - lgu 17, WORD(11) - lgu 18, WORD(11) - lgu 19, WORD(11) - lgu 20, WORD(11) - lgu 21, WORD(11) - lgu 22, WORD(11) - lgu 23, WORD(11) - lgu 24, WORD(11) - lgu 25, WORD(11) - lgu 26, WORD(11) - lgu 27, WORD(11) - lgu 28, WORD(11) - lgu 29, WORD(11) - lgu 30, WORD(11) - lgu 31, WORD(11) + addi 11, 1, RESERVED_STACK - 8 + ldu 14, 8(11) + ldu 15, 8(11) + ldu 16, 8(11) + ldu 17, 8(11) + ldu 18, 8(11) + ldu 19, 8(11) + ldu 20, 8(11) + ldu 21, 8(11) + ldu 22, 8(11) + ldu 23, 8(11) + ldu 24, 8(11) + ldu 25, 8(11) + ldu 26, 8(11) + ldu 27, 8(11) + ldu 28, 8(11) + ldu 29, 8(11) + ldu 30, 8(11) + ldu 31, 8(11) lfdu 14, 8(11) lfdu 15, 8(11) lfdu 16, 8(11) @@ -174,26 +119,16 @@ FUNCTION(call_gen_code) lfdu 30, 8(11) lfdu 31, 8(11) /* Reload return address */ - lg 0, (WORD*18 + 8*18 + RESERVED_STACK + LR_SAVE_AREA)(1) + ld 0, (8*18 + 8*18 + RESERVED_STACK + LR_SAVE_AREA)(1) mtlr 0 /* Return */ - addi 1, 1, (WORD*18 + 8*18 + RESERVED_STACK) + addi 1, 1, (8*18 + 8*18 + RESERVED_STACK) blr FUNCTION(caml_c_call) /* Jump to C function (address in r28) */ -#if defined(MODEL_ppc) - mtctr 28 -#elif defined(MODEL_ppc64) - ld 0, 0(28) - mtctr 0 - ld 2, 8(28) -#elif defined(MODEL_ppc64le) mtctr 28 mr 12, 28 -#else -#error "wrong MODEL" -#endif bctr /* Mark stack as non-executable */ diff --git a/tools/bump-magic-numbers b/tools/bump-magic-numbers new file mode 100755 index 00000000000..e4d5de9336e --- /dev/null +++ b/tools/bump-magic-numbers @@ -0,0 +1,62 @@ +#!/bin/sh +#************************************************************************** +#* * +#* OCaml * +#* * +#* Sebastien Hinderer, Tarides, Paris * +#* * +#* Copyright 2023 Institut National de Recherche en Informatique et * +#* en Automatique. * +#* * +#* All rights reserved. This file is distributed under the terms of * +#* the GNU Lesser General Public License version 2.1, with the * +#* special exception on linking described in the file LICENSE. * +#* * +#************************************************************************** + +# Bump magic numbers of the OCaml compiler +# The script takes only one argument, the version part of the magic numbers +# This version is a 3-digits string, e.g. 034 +# The script makes sure all the necessary files are updated and fails +# if a file that it needs to update does not exist, leaving the repository +# in a partially updated (likely inconsistent) state. + +# Also, the script updates both build-aux/ocaml_version.m4 (whose update +# is intended to be committed) and a few other *generated* files which are +# ignored by git but which need to be updated here so that the script +# can be used as part of the bootstrap procedure. +# So the update of build-aux/ocaml_version.m4 (as well as the one this +# implies to configure) are not strictly speaking needed for the +# on-going bootstrap, but rather for future builds. The update of +# generated files, in contrast, *is* required by the on-going bootstrap. + +# Fail on error +set -e + +if [ ${#1} != 3 ]; then + echo 'Version number must be 3 bytes' + exit 2 +fi + +new_num=$1 + +# Bump magic numbers in runtime/caml/exec.h + +sed -e s/'define MAGIC_NUMBER_VERSION "..."'/"define MAGIC_NUMBER_VERSION \"$new_num\""/ \ + runtime/caml/exec.h > runtime/caml/exec.h.tmp +mv runtime/caml/exec.h.tmp runtime/caml/exec.h + +# Bump magic numbers in utils/config.common.ml + +sed -e s/'...|magic}'/"$new_num|magic}"/ \ + utils/config.common.ml > utils/config.common.ml.tmp +mv utils/config.common.ml.tmp utils/config.common.ml + +# Bump magic numbers in build-aux/ocaml_version.m4 + +sed -e s/'m4_define(\[MAGIC_NUMBER__VERSION\], \[...\])'/"m4_define([MAGIC_NUMBER__VERSION], [$new_num])"/ \ + build-aux/ocaml_version.m4 > build-aux/ocaml_version.m4.tmp +mv build-aux/ocaml_version.m4.tmp build-aux/ocaml_version.m4 + +# Regenerate the configure script + +tools/autogen diff --git a/tools/ci/actions/check-parsetree-modified.sh b/tools/ci/actions/check-parsetree-modified.sh new file mode 100755 index 00000000000..3438bb9c8ac --- /dev/null +++ b/tools/ci/actions/check-parsetree-modified.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +#************************************************************************** +#* * +#* OCaml * +#* * +#* Paul-Elliot Anglès d'Auriac, Tarides * +#* * +#* Copyright 2023 Tarides * +#* * +#* All rights reserved. This file is distributed under the terms of * +#* the GNU Lesser General Public License version 2.1, with the * +#* special exception on linking described in the file LICENSE. * +#* * +#************************************************************************** + +set -e + +# Hygiene Checks: check that whenever the parsetree.mli file has been modified, +# the parsetree-change label has been applied to the PR + +# Exactly of the following must be true: +# - No commit in the PR alters the parsetree.mli file +# - The parsetree-change label is applied to the PR + +API_URL="$1" +shift 1 + +AUTH="authorization: Bearer $GITHUB_TOKEN" + +# We need all the commits in the PR to be available +. tools/ci/actions/deepen-fetch.sh + +COMMIT_RANGE="$MERGE_BASE..$PR_HEAD" + +LABEL='parsetree-change' + +if ! git diff "$COMMIT_RANGE" --name-only --exit-code parsing/parsetree.mli \ + > /dev/null; then + echo -e "The parsetree has been modified." + if curl --silent --header "$AUTH" "$API_URL/labels" | grep -q "$LABEL"; then + echo -e "Label $LABEL is assigned to the PR." + else + echo -e "Please assign the label $LABEL to the PR" + exit 1 + fi +else + echo -e "The parsetree has not been modified." + if curl --silent --header "$AUTH" "$API_URL/labels" | grep -q "$LABEL"; then + echo -e "Please remove the label $LABEL to the PR" + exit 1 + else + echo -e "Label $LABEL is not assigned to the PR" + fi +fi diff --git a/tools/ci/appveyor/appveyor_build.cmd b/tools/ci/appveyor/appveyor_build.cmd index 2f1fab6afa3..ee8e7976ef4 100644 --- a/tools/ci/appveyor/appveyor_build.cmd +++ b/tools/ci/appveyor/appveyor_build.cmd @@ -71,14 +71,20 @@ if %CYGWIN_UPGRADE_REQUIRED% equ 1 ( ) goto :EOF -:install - +:SetDefaultSDK if defined SDK set SDK=call %SDK% if not defined SDK ( - if "%PORT%" equ "msvc64" set SDK=call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat" - if "%PORT%" equ "msvc32" set SDK=call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat" + if "%PORT%" equ "msvc64" set SDK=call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" + if "%PORT%" equ "msvc32" set SDK=call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars32.bat" + if "%PORT%" equ "mingw64" set SDK=call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" + if "%PORT%" equ "mingw32" set SDK=call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars32.bat" ) %SDK% +goto :EOF + +:install + +call :SetDefaultSDK git worktree add "..\%BUILD_PREFIX%-%PORT%" -b appveyor-build-%PORT% @@ -88,8 +94,8 @@ if "%BOOTSTRAP_FLEXDLL%" equ "true" ( ) cd "%APPVEYOR_BUILD_FOLDER%" -appveyor DownloadFile "https://github.com/alainfrisch/flexdll/archive/%FLEXDLL_VERSION%.tar.gz" -FileName "flexdll.tar.gz" || exit /b 1 -appveyor DownloadFile "https://github.com/alainfrisch/flexdll/releases/download/%FLEXDLL_VERSION%/flexdll-bin-%FLEXDLL_VERSION%.zip" -FileName "flexdll.zip" || exit /b 1 +appveyor DownloadFile "https://github.com/ocaml/flexdll/archive/%FLEXDLL_VERSION%.tar.gz" -FileName "flexdll.tar.gz" || exit /b 1 +appveyor DownloadFile "https://github.com/ocaml/flexdll/releases/download/%FLEXDLL_VERSION%/flexdll-bin-%FLEXDLL_VERSION%.zip" -FileName "flexdll.zip" || exit /b 1 rem flexdll.zip is processed here, rather than in appveyor_build.sh because the rem unzip command comes from MSYS2 (via Git for Windows) and it has to be rem invoked via cmd /c in a bash script which is weird(er). @@ -142,7 +148,6 @@ goto :EOF rem No tests run in the "C" build mode if "%BUILD_MODE%" equ "C" goto :EOF rem Add a C# compiler in PATH for the testsuite for mingw -if "%PORT%" equ "mingw64" call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat" -if "%PORT%" equ "mingw32" call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat" +call :SetDefaultSDK "%CYG_ROOT%\bin\bash.exe" -lc "$APPVEYOR_BUILD_FOLDER/tools/ci/appveyor/appveyor_build.sh test" || exit /b 1 goto :EOF diff --git a/tools/ci/appveyor/appveyor_build.sh b/tools/ci/appveyor/appveyor_build.sh old mode 100644 new mode 100755 index c35092e914d..6891c169a2c --- a/tools/ci/appveyor/appveyor_build.sh +++ b/tools/ci/appveyor/appveyor_build.sh @@ -26,6 +26,8 @@ else MAKE=make fi +git config --global --add safe.directory '*' + function run { if [[ $1 = "--show" ]] ; then SHOW_CMD='true'; shift; else SHOW_CMD=''; fi NAME=$1 @@ -56,25 +58,21 @@ function set_configuration { man='' ;; mingw32) - build='--build=i686-pc-cygwin' host='--host=i686-w64-mingw32' dep='--disable-dependency-generation' man='' ;; mingw64) - build='--build=i686-pc-cygwin' host='--host=x86_64-w64-mingw32' dep='--disable-dependency-generation' man='--disable-stdlib-manpages' ;; msvc32) - build='--build=i686-pc-cygwin' host='--host=i686-pc-windows' dep='--disable-dependency-generation' man='' ;; msvc64) - build='--build=x86_64-pc-cygwin' host='--host=x86_64-pc-windows' # Explicitly test dependency generation on msvc64 dep='--enable-dependency-generation' @@ -83,11 +81,25 @@ function set_configuration { esac mkdir -p "$CACHE_DIRECTORY" - ./configure --cache-file="$CACHE_DIRECTORY/config.cache-$1" \ - $dep $build $man $host --prefix="$2" --enable-ocamltest || ( \ - rm -f "$CACHE_DIRECTORY/config.cache-$1" ; \ - ./configure --cache-file="$CACHE_DIRECTORY/config.cache-$1" \ - $dep $build $man $host --prefix="$2" --enable-ocamltest ) + + local CACHE_KEY CACHE_FILE_PREFIX CACHE_FILE + CACHE_KEY=$({ cat configure; uname; } | shasum | cut -c 1-7) + CACHE_FILE_PREFIX="$CACHE_DIRECTORY/config.cache-$1" + CACHE_FILE="$CACHE_FILE_PREFIX-$CACHE_KEY" + + # Remove old configure cache if the configure script or the OS + # have changed + if [[ ! -f "$CACHE_FILE" ]] ; then + rm -f -- "$CACHE_FILE_PREFIX"* + fi + + # Remove configure cache if the script has failed + if ! ./configure --cache-file="$CACHE_FILE" $dep $build $man $host \ + --prefix="$2" --enable-ocamltest ; then + rm -f -- "$CACHE_FILE" + ./configure --cache-file="$CACHE_FILE" $dep $build $man $host \ + --prefix="$2" --enable-ocamltest + fi # FILE=$(pwd | cygpath -f - -m)/Makefile.config # run "Content of $FILE" cat Makefile.config diff --git a/tools/ci/inria/bootstrap/script b/tools/ci/inria/bootstrap/script index 8984ab4784f..db2ee09c6ec 100755 --- a/tools/ci/inria/bootstrap/script +++ b/tools/ci/inria/bootstrap/script @@ -57,22 +57,6 @@ quote1 () { printf "'%s'" "`printf %s "$1" | sed -e "s/'/'\\\\\\\\''/g"`"; } -# Functions used to modify the source code - -change_exe_magic_number() { - old=`./runtime/ocamlrun -M` - new="$1" - echo Changing executable magic number from ${old} to ${new} - # Change magic number in runtime/caml/exec.h - sed -i.tmp 's/\x23define \+EXEC_MAGIC \+\x22'${old}\ -'\x22/#define EXEC_MAGIC "'${new}'"/' runtime/caml/exec.h - rm -f runtime/caml/exec.h.tmp - # Change magic number in utils/config.common.ml - sed -i.tmp 's/let \+exec_magic_number \+= \+\x22'${old}\ -'\x22/let exec_magic_number = "'${new}'"/' utils/config.common.ml - rm -f utils/config.common.ml.tmp -} - remove_primitive() { echo Removing the \'sinh\' primitive @@ -240,7 +224,7 @@ eval "./configure $build $host --prefix='$instdir' $confoptions" $make world -change_exe_magic_number "CI-bootstrap" +tools/bump-magic-numbers ZZZ remove_primitive diff --git a/tools/ci/inria/other-configs/script b/tools/ci/inria/other-configs/script index 6536c4db7ad..ba47e39e41f 100755 --- a/tools/ci/inria/other-configs/script +++ b/tools/ci/inria/other-configs/script @@ -16,12 +16,13 @@ # Commands to run for the 'other-configs' job on Inria's CI -# Stop on error and be verbose -set -e -x +# Stop on error +set -e mainjob=./tools/ci/inria/main main="${mainjob} -j8" +echo "============== minimal build =================" # The "MIN_BUILD" (formerly on Travis) builds with everything disabled (apart # from ocamltest). Its goals: # - Ensure that the system builds correctly without native compilation @@ -37,8 +38,20 @@ ${main} -conf --disable-native-compiler \ -conf --disable-ocamldoc \ -conf --disable-dependency-generation \ -no-native -${main} -conf --disable-flat-float-array + +echo "============== no flat float arrays, clang, C23 =================" +${main} -conf --disable-flat-float-array \ + -conf CC=clang-18 \ + -conf CFLAGS=-std=gnu2x + +echo "============== flambda =================" ${main} -conf --enable-flambda + +echo "============== frame pointers, reserved header bits =================" ${main} -conf --enable-frame-pointers -conf --enable-reserved-header-bits=27 + +echo "============== bootstrap, pic =================" ${main} -with-bootstrap -conf --with-pic -OCAMLRUNPARAM="c=1" ${main} + +echo "============== cleanup at exit, clang =================" +OCAMLRUNPARAM="c=1" ${main} -conf CC=clang-18 diff --git a/tools/ci/inria/sanitizers/script b/tools/ci/inria/sanitizers/script index 8d849579d90..9c69f92fa50 100755 --- a/tools/ci/inria/sanitizers/script +++ b/tools/ci/inria/sanitizers/script @@ -48,18 +48,18 @@ else fi # A tool that makes error backtraces nicer -# Need to pick the one that matches clang-13 and is named "llvm-symbolizer" -# (/usr/bin/llvm-symbolizer-13 doesn't work, that would be too easy) -export ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-13/bin/llvm-symbolizer +# Need to pick the one that matches clang-14 and is named "llvm-symbolizer" +# (/usr/bin/llvm-symbolizer-14 doesn't work, that would be too easy) +export ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-14/bin/llvm-symbolizer export TSAN_SYMBOLIZER_PATH="$ASAN_SYMBOLIZER_PATH" ######################################################################### -echo "======== clang 13, address sanitizer, UB sanitizer ==========" +echo "======== clang 14, address sanitizer, UB sanitizer ==========" git clean -q -f -d -x -# # Use clang 13 +# # Use clang 14 # These are the undefined behaviors we want to check # Others occur on purpose e.g. signed arithmetic overflow @@ -82,7 +82,7 @@ sanitizers="-fsanitize=address -fsanitize-trap=$ubsan" # Don't optimize too much to get better backtraces of errors ./configure \ - CC=clang-13 \ + CC=clang-14 \ CFLAGS="-O1 -fno-omit-frame-pointer $sanitizers" \ --disable-stdlib-manpages --enable-dependency-generation @@ -110,34 +110,24 @@ ASAN_OPTIONS="detect_leaks=0,use_sigaltstack=0" $run_testsuite ######################################################################### -# Thread sanitizer is not working in OCaml 5: too many alarms that are -# probably benign races in the GC (#11040). Turn it off. +# Run the testsuite with ThreadSanitizer support (--enable-tsan) enabled. +# Initially intended to detect data races in OCaml programs and C stubs, it has +# proved effective at also detecting races in the runtime (see #11040). -# echo "======== clang 13, thread sanitizer ==========" +echo "======== clang 14, thread sanitizer ==========" -# git clean -q -f -d -x +git clean -q -f -d -x -# # Select thread sanitizer -# # Don't optimize too much to get better backtraces of errors +./configure \ + CC=clang-14 \ + --enable-tsan \ + --disable-stdlib-manpages --enable-dependency-generation -# ./configure \ -# CC=clang-13 \ -# CFLAGS="-O1 -fno-omit-frame-pointer -fsanitize=thread" \ -# --disable-stdlib-manpages --enable-dependency-generation - -# # Build the system -# TSAN_OPTIONS="detect_deadlocks=0" make $jobs - -# # ThreadSanitizer reports errors for the error case of unlocking an -# # error-checking mutex. -# # Exclude the corresponding test -# export OCAMLTEST_SKIP_TESTS="$OCAMLTEST_SKIP_TESTS \ -# tests/lib-threads/mutex_errors.ml" - -# # Run the testsuite. -# # ThreadSanitizer complains about fork() in threaded programs, -# # we ask it to just continue in this case. -# TSAN_OPTIONS="detect_deadlocks=0,die_after_fork=0" $run_testsuite +# Build the system +make $jobs + +# Run the testsuite. +TSAN_OPTIONS="" $run_testsuite ######################################################################### diff --git a/tools/eqparsetree.ml b/tools/eqparsetree.ml index 9630fcd827f..819d49f70e0 100644 --- a/tools/eqparsetree.ml +++ b/tools/eqparsetree.ml @@ -175,7 +175,7 @@ and eq_core_type_desc : (eq_list eq_core_type (a1, b1))) && (eq_list Asttypes.eq_label (a2, b2)) | (Ptyp_alias (a0, a1), Ptyp_alias (b0, b1)) -> - (eq_core_type (a0, b0)) && (eq_string (a1, b1)) + (eq_core_type (a0, b0)) && (eq_string (a1.txt, b1.txt)) | (Ptyp_variant (a0, a1, a2), Ptyp_variant (b0, b1, b2)) -> ((eq_list eq_row_field (a0, b0)) && (eq_bool (a1, b1))) && (eq_option (eq_list Asttypes.eq_label) (a2, b2)) diff --git a/tools/gen_sizeclasses.ml b/tools/gen_sizeclasses.ml index b6a80b587aa..2e6c0604596 100644 --- a/tools/gen_sizeclasses.ml +++ b/tools/gen_sizeclasses.ml @@ -89,9 +89,9 @@ let _ = printf "#define SIZECLASS_MAX %d\n" max_slot; printf "#define NUM_SIZECLASSES %d\n" (List.length sizes); printf "static const unsigned int \ -wsize_sizeclass[NUM_SIZECLASSES] = @[<2>{ %a };@]\n" print_list sizes; +wsize_sizeclass[NUM_SIZECLASSES] =@[<2>{ %a };@]\n" print_list sizes; printf "static const unsigned char \ -wastage_sizeclass[NUM_SIZECLASSES] = @[<2>{ %a };@]\n" print_list wastage; +wastage_sizeclass[NUM_SIZECLASSES] =@[<2>{ %a };@]\n" print_list wastage; printf "static const unsigned char \ -sizeclass_wsize[SIZECLASS_MAX + 1] = @[<2>{ %a };@]\n" +sizeclass_wsize[SIZECLASS_MAX + 1] =@[<2>{ %a };@]\n" print_list (255 :: size_slots 1); diff --git a/tools/msvs-promote-path b/tools/msvs-promote-path index b4f4f9d7e44..50d0f47f7d4 100755 --- a/tools/msvs-promote-path +++ b/tools/msvs-promote-path @@ -4,6 +4,7 @@ #* OCaml * #* * #* David Allsopp, MetaStack Solutions Ltd. * +#* Samuel Hym, Tarides * #* * #* Copyright 2015 MetaStack Solutions Ltd. * #* * @@ -13,39 +14,34 @@ #* * #************************************************************************** -# Ensure that the Microsoft Linker isn't being messed up by /usr/bin/link -if [ "`link --version | head -1 | \ - fgrep "Microsoft (R) Incremental Linker"`" != "" ] ; then +# Ensure that the Microsoft Linker isn't being shadowed by /usr/bin/link +# We expect the Microsoft Linker to be in the same directory as the C compiler + +if ! clpath="$(command -v cl)" ; then + echo "The Microsoft C compiler was not found in any of the PATH entries!">&2 + exit 1 +fi +clpath="${clpath%/*}" + +if ! linkpath="$(command -v link)" ; then + echo "The Microsoft Linker was not found in any of the PATH entries!">&2 + exit 1 +fi + +if [ "${linkpath%/*}" = "$clpath" ]; then echo "link already refers to the Microsoft Linker">&2 exit 0 fi +NEWPATH="$clpath" IFS=: -T= -FOUND=0 -FIRST=1 for i in $PATH do - if [ $FIRST -eq 1 ] ; then - T="$i" - FIRST=0 - else - if [ $FOUND -eq 0 -a -x $i/link ] && [ "`$i/link --version | head -1 | \ - fgrep "Microsoft (R) Incremental Linker"`" != "" ] ; then - FOUND=1 - T="$i:$T" - PROM=$i - else - T="$T:$i" - fi + if [[ $i != $clpath ]]; then + NEWPATH="$NEWPATH:$i" fi done unset IFS -if [ $FOUND -eq 0 ] ; then - echo The Microsoft Linker was not found in any of the PATH entries!>&2 - exit 1 -else - echo "$PROM moved to the front of \$PATH">&2 - echo export PATH=\"$T\" -fi +echo "$clpath moved to the front of \$PATH">&2 +echo "export PATH='"${NEWPATH//\'/\'\"\'\"\'}"'" diff --git a/tools/objinfo.ml b/tools/objinfo.ml index 7e911017157..81e6e7afd2a 100644 --- a/tools/objinfo.ml +++ b/tools/objinfo.ml @@ -95,8 +95,10 @@ let print_cmt_infos cmt = (match cmt.cmt_sourcefile with None -> "(none)" | Some f -> f); printf "Compilation flags:"; Array.iter print_spaced_string cmt.cmt_args; - printf "\nLoad path:"; - List.iter print_spaced_string cmt.cmt_loadpath; + printf "\nLoad path:\n Visible:"; + List.iter print_spaced_string cmt.cmt_loadpath.visible; + printf "\n Hidden:"; + List.iter print_spaced_string cmt.cmt_loadpath.hidden; printf "\n"; printf "cmt interface digest: %s\n" (match cmt.cmt_interface_digest with diff --git a/tools/ocamlcmt.ml b/tools/ocamlcmt.ml index 399a2232dd6..92014a2336e 100644 --- a/tools/ocamlcmt.ml +++ b/tools/ocamlcmt.ml @@ -69,7 +69,10 @@ let print_info cmt = Printf.fprintf oc "sourcefile: %s\n" name; end; Printf.fprintf oc "build directory: %s\n" cmt.cmt_builddir; - List.iter (Printf.fprintf oc "load path: %s\n%!") cmt.cmt_loadpath; + List.iter (Printf.fprintf oc "load path (visible): %s\n%!") + cmt.cmt_loadpath.visible; + List.iter (Printf.fprintf oc "load path (hidden): %s\n%!") + cmt.cmt_loadpath.hidden; begin match cmt.cmt_source_digest with None -> () @@ -149,7 +152,8 @@ let record_cmt_info cmt = Annot.Idef (location_file value))) in let open Cmt_format in - List.iter (fun dir -> record_info "include" dir) cmt.cmt_loadpath; + List.iter (fun dir -> record_info "include" dir) cmt.cmt_loadpath.visible; + List.iter (fun dir -> record_info "include" dir) cmt.cmt_loadpath.hidden; record_info "chdir" cmt.cmt_builddir; (match cmt.cmt_sourcefile with None -> () | Some file -> record_info "source" file) @@ -174,7 +178,8 @@ let main () = | Some _ as x -> x in Envaux.reset_cache (); - List.iter Load_path.add_dir cmt.cmt_loadpath; + List.iter (Load_path.add_dir ~hidden:false) cmt.cmt_loadpath.visible; + List.iter (Load_path.add_dir ~hidden:true) cmt.cmt_loadpath.hidden; Cmt2annot.gen_annot target_filename ~sourcefile:cmt.cmt_sourcefile ~use_summaries:cmt.cmt_use_summaries diff --git a/toplevel/byte/topeval.ml b/toplevel/byte/topeval.ml index b831602a310..dd94366b572 100644 --- a/toplevel/byte/topeval.ml +++ b/toplevel/byte/topeval.ml @@ -218,7 +218,12 @@ let check_consistency ppf filename cu = let load_compunit ic filename ppf compunit = check_consistency ppf filename compunit; seek_in ic compunit.cu_pos; - let code = LongString.input_bytes ic compunit.cu_codesize in + let code = + Bigarray.Array1.create Bigarray.Char Bigarray.c_layout compunit.cu_codesize + in + match In_channel.really_input_bigarray ic code 0 compunit.cu_codesize with + | None -> raise End_of_file + | Some () -> (); let initial_symtable = Symtable.current_state() in Symtable.patch_object code compunit.cu_reloc; Symtable.update_global_table(); diff --git a/toplevel/native/topeval.ml b/toplevel/native/topeval.ml index 7cc0a896de3..241849bd607 100644 --- a/toplevel/native/topeval.ml +++ b/toplevel/native/topeval.ml @@ -139,6 +139,7 @@ let name_expression ~loc ~attrs exp = let vb = { vb_pat = pat; vb_expr = exp; + vb_rec_kind = Not_recursive; vb_attributes = attrs; vb_loc = loc; } in diff --git a/toplevel/native/tophooks.ml b/toplevel/native/tophooks.ml index c23772e42cc..0cc344088df 100644 --- a/toplevel/native/tophooks.ml +++ b/toplevel/native/tophooks.ml @@ -31,14 +31,10 @@ let need_symbol sym = Option.is_none (Dynlink.unsafe_get_global_value ~bytecode_or_asm_symbol:sym) let dll_run dll entry = - match (try Result (Obj.magic (ndl_run_toplevel dll entry)) - with exn -> Exception exn) - with - | Exception _ as r -> r - | Result r -> - match Obj.magic r with - | Ok x -> Result x - | Err s -> fatal_error ("Toploop.dll_run " ^ s) + match ndl_run_toplevel dll entry with + | Ok x -> Result x + | Err s -> fatal_error ("Toploop.dll_run " ^ s) + | exception exn -> Exception exn (* CR-soon trefis for mshinwell: copy/pasted from Optmain. Should it be shared or? diff --git a/toplevel/topcommon.ml b/toplevel/topcommon.ml index 88360734409..d281b3ad68f 100644 --- a/toplevel/topcommon.ml +++ b/toplevel/topcommon.ml @@ -239,13 +239,15 @@ let read_input_default prompt buffer len = let read_interactive_input = ref read_input_default +let comment_prompt_override = ref false + let refill_lexbuf buffer len = if !got_eof then (got_eof := false; 0) else begin let prompt = if !Clflags.noprompt then "" else if !first_line then "# " else if !Clflags.nopromptcont then "" - else if Lexer.in_comment () then "* " + else if Lexer.in_comment () || !comment_prompt_override then "* " else " " in first_line := false; @@ -263,18 +265,23 @@ let set_paths ?(auto_include=Compmisc.auto_include) () = but keep the directories that user code linked in with ocamlmktop may have added to load_path. *) let expand = Misc.expand_directory Config.standard_library in - let current_load_path = Load_path.get_paths () in - let load_path = List.concat [ + let Load_path.{ visible; hidden } = Load_path.get_paths () in + let visible = List.concat [ [ "" ]; List.map expand (List.rev !Compenv.first_include_dirs); List.map expand (List.rev !Clflags.include_dirs); List.map expand (List.rev !Compenv.last_include_dirs); - current_load_path; + visible; [expand "+camlp4"]; ] in - Load_path.init ~auto_include load_path; - Dll.add_path load_path + let hidden = List.concat [ + List.map expand (List.rev !Clflags.hidden_include_dirs); + hidden + ] + in + Load_path.init ~auto_include ~visible ~hidden; + Dll.add_path (visible @ hidden) let update_search_path_from_env () = let extra_paths = diff --git a/toplevel/topcommon.mli b/toplevel/topcommon.mli index f71304bd4f3..bcbe1a80f97 100644 --- a/toplevel/topcommon.mli +++ b/toplevel/topcommon.mli @@ -230,4 +230,6 @@ val backtrace: string option ref val parse_mod_use_file: string -> Lexing.lexbuf -> Parsetree.toplevel_phrase list +val comment_prompt_override : bool ref + val refill_lexbuf: bytes -> int -> int diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index 140aaa77b7c..9113c059d9c 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -75,7 +75,7 @@ let _ = add_directive "quit" (Directive_none dir_quit) let dir_directory s = let d = expand_directory Config.standard_library s in Dll.add_path [d]; - let dir = Load_path.Dir.create d in + let dir = Load_path.Dir.create ~hidden:false d in Load_path.prepend_dir dir; toplevel_env := Stdlib.String.Set.fold @@ -110,7 +110,7 @@ let _ = add_directive "remove_directory" (Directive_string dir_remove_directory) } let dir_show_dirs () = - List.iter print_endline (Load_path.get_paths ()) + List.iter print_endline (Load_path.get_path_list ()) let _ = add_directive "show_dirs" (Directive_none dir_show_dirs) { diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index b2f1d2f82ec..c4692860be0 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -187,6 +187,110 @@ let load_ocamlinit ppf = exception PPerror +let ends_with_lf lb = + let open Lexing in + Bytes.get lb.lex_buffer (lb.lex_buffer_len - 1) = '\n' + +(* Without changing the state of [lb], try to see if it contains a token. + Return [EOF] if there is no token in [lb], a token if there is one, + or raise a lexer error as appropriate. + Print lexer warnings or not according to [print_warnings]. +*) +let look_ahead ~print_warnings lb = + let shadow = + Lexing.{ lb with + refill_buff = (fun newlb -> newlb.lex_eof_reached <- true); + lex_buffer = Bytes.copy lb.lex_buffer; + lex_mem = Array.copy lb.lex_mem; + } + in + Misc.protect_refs [ + R (Lexer.print_warnings, print_warnings); + Location.(R (report_printer, fun () -> batch_mode_printer)); + ] (fun () -> Lexer.token shadow) +;; + +(* Refill the buffer until the next linefeed or end-of-file that is not + inside a comment and check that its contents can be ignored. + We do this by adding whole lines to the lexbuf until one of these + occurs: + - it contains no tokens and no unterminated comments + - it contains some token or unterminated string + - it contains a lexical error +*) +let is_blank_with_linefeed lb = + let open Lexing in + if Bytes.get lb.lex_buffer lb.lex_curr_pos = '\n' then + (* shortcut for the most usual case *) + true + else begin + let rec loop () = + if not (lb.lex_eof_reached || ends_with_lf lb) then begin + (* Make sure the buffer does not contain a truncated line. *) + lb.refill_buff lb; + loop () + end else begin + (* Check for tokens in the lexbuf. We may have to + repeat this step, so don't print any warnings yet. *) + match look_ahead ~print_warnings:false lb with + | EOF -> true (* no tokens *) + | _ -> false (* some token *) + | exception Lexer.(Error ((Unterminated_comment _ + | Unterminated_string_in_comment _), _)) -> + (* In this case we don't know whether there will be a token + before the next linefeed, so get more chars and continue. *) + Misc.protect_refs [ R (comment_prompt_override, true) ] + (fun () -> lb.refill_buff lb); + loop () + | exception _ -> false (* syntax error *) + end + in + loop () + end + +(* Read and parse toplevel phrases, stop when a complete phrase has been + parsed and the lexbuf contains and end of line with optional whitespace + and comments. *) +let rec get_phrases ppf lb phrs = + match !parse_toplevel_phrase lb with + | phr -> + if is_blank_with_linefeed lb then begin + (* The lexbuf does not contain any tokens. We know it will be + flushed after the phrases are evaluated, so print warnings now. *) + ignore (look_ahead ~print_warnings:true lb); + List.rev (phr :: phrs) + end else + get_phrases ppf lb (phr :: phrs) + | exception Exit -> raise PPerror + | exception e -> Location.report_exception ppf e; [] + +(* Type, compile and execute a phrase. *) +let process_phrase ppf snap phr = + snap := Btype.snapshot (); + Warnings.reset_fatal (); + let phr = preprocess_phrase ppf phr in + Env.reset_cache_toplevel (); + ignore(execute_phrase true ppf phr) + +(* Type, compile and execute a list of phrases, setting the report printer + to batch mode for all but the first one. + We have to use batch mode for reporting for two reasons: + 1. we can't underline several parts of the input line(s) in place + 2. the execution of the first phrase may mess up the line count so we + can't move the cursor back to the correct line + *) +let process_phrases ppf snap phrs = + match phrs with + | [] -> () + | phr :: rest -> + process_phrase ppf snap phr; + if rest <> [] then begin + let process ph = Location.reset (); process_phrase ppf snap ph in + Misc.protect_refs + Location.[R (report_printer, fun () -> batch_mode_printer)] + (fun () -> List.iter process rest) + end + let loop ppf = Clflags.debug := true; Location.formatter_for_warnings := ppf; @@ -209,21 +313,18 @@ let loop ppf = run_hooks After_setup; load_ocamlinit ppf; while true do - let snap = Btype.snapshot () in + let snap = ref (Btype.snapshot ()) in try Lexing.flush_input lb; (* Reset the phrase buffer when we flush the lexing buffer. *) Buffer.reset phrase_buffer; Location.reset(); - Warnings.reset_fatal (); first_line := true; - let phr = try !parse_toplevel_phrase lb with Exit -> raise PPerror in - let phr = preprocess_phrase ppf phr in - Env.reset_cache_toplevel (); - ignore(execute_phrase true ppf phr) + let phrs = get_phrases ppf lb [] in + process_phrases ppf snap phrs with | End_of_file -> raise (Compenv.Exit_with_status 0) - | Sys.Break -> fprintf ppf "Interrupted.@."; Btype.backtrack snap + | Sys.Break -> fprintf ppf "Interrupted.@."; Btype.backtrack !snap | PPerror -> () - | x -> Location.report_exception ppf x; Btype.backtrack snap + | x -> Location.report_exception ppf x; Btype.backtrack !snap done diff --git a/typing/btype.ml b/typing/btype.ml index 89e71f622cb..f3b9594088c 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -127,6 +127,10 @@ let is_Tunivar ty = match get_desc ty with Tunivar _ -> true | _ -> false let is_Tconstr ty = match get_desc ty with Tconstr _ -> true | _ -> false let type_kind_is_abstract decl = match decl.type_kind with Type_abstract _ -> true | _ -> false +let type_origin decl = + match decl.type_kind with + | Type_abstract origin -> origin + | Type_variant _ | Type_record _ | Type_open -> Definition let dummy_method = "*dummy method*" diff --git a/typing/btype.mli b/typing/btype.mli index d3720957ca0..fb8676a867a 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -79,6 +79,7 @@ val is_Tunivar: type_expr -> bool val is_Tconstr: type_expr -> bool val dummy_method: label val type_kind_is_abstract: type_declaration -> bool +val type_origin : type_declaration -> type_origin (**** polymorphic variants ****) diff --git a/typing/ctype.ml b/typing/ctype.ml index fa2e6117fc3..67f500c385c 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -1272,7 +1272,7 @@ let get_new_abstract_name env s = let index = Misc.find_first_mono check in name index -let new_local_type ?(loc = Location.none) ?manifest_and_scope () = +let new_local_type ?(loc = Location.none) ?manifest_and_scope origin = let manifest, expansion_scope = match manifest_and_scope with None -> None, Btype.lowest_level @@ -1281,7 +1281,7 @@ let new_local_type ?(loc = Location.none) ?manifest_and_scope () = { type_params = []; type_arity = 0; - type_kind = Type_abstract Abstract_def; + type_kind = Type_abstract origin; type_private = Public; type_manifest = manifest; type_variance = []; @@ -1295,10 +1295,16 @@ let new_local_type ?(loc = Location.none) ?manifest_and_scope () = type_uid = Uid.mk ~current_unit:(Env.get_unit_name ()); } -let existential_name cstr ty = - match get_desc ty with - | Tvar (Some name) -> "$" ^ cstr.cstr_name ^ "_'" ^ name - | _ -> "$" ^ cstr.cstr_name +let existential_name name_counter ty = + let name = + match get_desc ty with + | Tvar (Some name) -> name + | _ -> + let name = Misc.letter_of_int !name_counter in + incr name_counter; + name + in + "$" ^ name type existential_treatment = | Keep_existentials_flexible @@ -1306,6 +1312,7 @@ type existential_treatment = let instance_constructor existential_treatment cstr = For_copy.with_scope (fun copy_scope -> + let name_counter = ref 0 in let copy_existential = match existential_treatment with | Keep_existentials_flexible -> copy copy_scope @@ -1313,8 +1320,8 @@ let instance_constructor existential_treatment cstr = fun existential -> let env = penv.env in let fresh_constr_scope = penv.equations_scope in - let decl = new_local_type () in - let name = existential_name cstr existential in + let decl = new_local_type (Existential cstr.cstr_name) in + let name = existential_name name_counter existential in let (id, new_env) = Env.enter_type (get_new_abstract_name env name) decl env ~scope:fresh_constr_scope in @@ -1472,7 +1479,7 @@ let copy_sep ~copy_scope ~fixed ~(visited : type_expr TypeHash.t) sch = List.iter Lazy.force !delayed_copies; ty -let instance_poly' copy_scope ~keep_names fixed univars sch = +let instance_poly' copy_scope ~keep_names ~fixed univars sch = (* In order to compute univars below, [sch] should not contain [Tsubst] *) let copy_var ty = match get_desc ty with @@ -1485,17 +1492,17 @@ let instance_poly' copy_scope ~keep_names fixed univars sch = let ty = copy_sep ~copy_scope ~fixed ~visited sch in vars, ty -let instance_poly ?(keep_names=false) fixed univars sch = +let instance_poly ?(keep_names=false) ~fixed univars sch = For_copy.with_scope (fun copy_scope -> - instance_poly' copy_scope ~keep_names fixed univars sch + instance_poly' copy_scope ~keep_names ~fixed univars sch ) -let instance_label fixed lbl = +let instance_label ~fixed lbl = For_copy.with_scope (fun copy_scope -> let vars, ty_arg = match get_desc lbl.lbl_arg with Tpoly (ty, tl) -> - instance_poly' copy_scope ~keep_names:false fixed tl ty + instance_poly' copy_scope ~keep_names:false ~fixed tl ty | _ -> [], copy copy_scope lbl.lbl_arg in @@ -1560,14 +1567,14 @@ let apply ?(use_current_level = false) env params body args = (* If the environment has changed, memorized expansions might not - be correct anymore, and so we flush the cache. This is safe but - quite pessimistic: it would be enough to flush the cache when a - type or module definition is overridden in the environment. + be correct anymore, and so we flush the cache. The test used + checks whether any of types, modules, or local constraints have + been changed. *) let previous_env = ref Env.empty (*let string_of_kind = function Public -> "public" | Private -> "private"*) let check_abbrev_env env = - if env != !previous_env then begin + if not (Env.same_type_declarations env !previous_env) then begin (* prerr_endline "cleanup expansion cache"; *) cleanup_abbrev (); previous_env := env @@ -1593,59 +1600,55 @@ let check_abbrev_env env = and this other expansion fails. *) let expand_abbrev_gen kind find_type_expansion env ty = + let path, args, abbrev = match get_desc ty with + | Tconstr (path,args,abbrev) -> path, args, abbrev + | _ -> assert false + in check_abbrev_env env; - match get_desc ty with - Tconstr (path, args, abbrev) -> - let level = get_level ty in - let scope = get_scope ty in - let lookup_abbrev = proper_abbrevs args abbrev in - begin match find_expans kind path !lookup_abbrev with - Some ty' -> + let level = get_level ty in + let scope = get_scope ty in + let lookup_abbrev = proper_abbrevs args abbrev in + let expansion = + (* first look for an existing expansion *) + match find_expans kind path !lookup_abbrev with + | None -> None + | Some ty' -> try + (* prerr_endline + ("found a "^string_of_kind kind^" expansion for "^Path.name path);*) + if level <> generic_level then update_level env level ty'; + update_scope scope ty'; + Some ty' + with Escape _ -> + (* in case of Escape, discard the stale expansion and re-expand *) + forget_abbrev lookup_abbrev path; + None + in + begin match expansion with + | Some ty' -> ty' + | None -> + (* attempt to (re-)expand *) + match find_type_expansion path env with + | exception Not_found -> + (* another way to expand is to normalize the path itself *) + let path' = Env.normalize_type_path None env path in + if Path.same path path' then raise Cannot_expand + else newty2 ~level (Tconstr (path', args, abbrev)) + | (params, body, lv) -> (* prerr_endline - ("found a "^string_of_kind kind^" expansion for "^Path.name path);*) - if level <> generic_level then - begin try - update_level env level ty' - with Escape _ -> - (* XXX This should not happen. - However, levels are not correctly restored after a - typing error *) - () - end; - begin try - update_scope scope ty'; - with Escape _ -> - (* XXX This should not happen. - However, levels are not correctly restored after a - typing error *) - () - end; + ("add a "^string_of_kind kind^" expansion for "^Path.name path);*) + let ty' = + try + subst env level kind abbrev (Some ty) params args body + with Cannot_subst -> raise_escape_exn Constraint + in + (* For gadts, remember type as non exportable *) + (* The ambiguous level registered for ty' should be the highest *) + (* if !trace_gadt_instances then begin *) + let scope = Int.max lv (get_scope ty) in + update_scope scope ty; + update_scope scope ty'; ty' - | None -> - match find_type_expansion path env with - | exception Not_found -> - (* another way to expand is to normalize the path itself *) - let path' = Env.normalize_type_path None env path in - if Path.same path path' then raise Cannot_expand - else newty2 ~level (Tconstr (path', args, abbrev)) - | (params, body, lv) -> - (* prerr_endline - ("add a "^string_of_kind kind^" expansion for "^Path.name path);*) - let ty' = - try - subst env level kind abbrev (Some ty) params args body - with Cannot_subst -> raise_escape_exn Constraint - in - (* For gadts, remember type as non exportable *) - (* The ambiguous level registered for ty' should be the highest *) - (* if !trace_gadt_instances then begin *) - let scope = Int.max lv (get_scope ty) in - update_scope scope ty; - update_scope scope ty'; - ty' - end - | _ -> - assert false + end (* Expand respecting privacy *) let expand_abbrev env ty = @@ -1938,14 +1941,12 @@ let local_non_recursive_abbrev uenv p ty = (* Since we cannot duplicate universal variables, unification must be done at meta-level, using bindings in univar_pairs *) -(* TODO: use find_opt *) let rec unify_univar t1 t2 = function (cl1, cl2) :: rem -> let find_univ t cl = - try - let (_, r) = List.find (fun (t',_) -> eq_type t t') cl in - Some r - with Not_found -> None + List.find_map (fun (t', r) -> + if eq_type t t' then Some r else None + ) cl in begin match find_univ t1 cl1, find_univ t2 cl2 with Some {contents=Some t'2}, Some _ when eq_type t2 t'2 -> @@ -2202,7 +2203,7 @@ let reify uenv t = let fresh_constr_scope = get_equations_scope uenv in let create_fresh_constr lev name = let name = match name with Some s -> "$'"^s | _ -> "$" in - let decl = new_local_type () in + let decl = new_local_type Definition in let env = get_env uenv in let new_name = (* unique names are needed only for error messages *) @@ -2523,9 +2524,17 @@ let add_gadt_equation uenv source destination = let expansion_scope = Int.max (Path.scope source) (get_equations_scope uenv) in + let type_origin = + match Env.find_type source env with + | decl -> type_origin decl + | exception Not_found -> assert false + in let decl = - new_local_type ~manifest_and_scope:(destination, expansion_scope) () in - set_env uenv (Env.add_local_type source decl env); + new_local_type + ~manifest_and_scope:(destination, expansion_scope) + type_origin + in + set_env uenv (Env.add_local_constraint source decl env); cleanup_abbrev () end @@ -4302,9 +4311,9 @@ let rec equal_private env params1 ty1 params2 ty2 = type class_match_failure = CM_Virtual_class | CM_Parameter_arity_mismatch of int * int - | CM_Type_parameter_mismatch of Env.t * equality_error + | CM_Type_parameter_mismatch of int * Env.t * equality_error | CM_Class_type_mismatch of Env.t * class_type * class_type - | CM_Parameter_mismatch of Env.t * moregen_error + | CM_Parameter_mismatch of int * Env.t * moregen_error | CM_Val_type_mismatch of string * Env.t * comparison_error | CM_Meth_type_mismatch of string * Env.t * comparison_error | CM_Non_mutable_value of string @@ -4372,20 +4381,24 @@ let match_class_sig_shape ~strict sign1 sign2 = else err) sign1.csig_vars errors -let rec moregen_clty trace type_pairs env cty1 cty2 = +(* [arrow_index] is the number of [Cty_arrow] + constructors we've seen so far. *) +let rec moregen_clty ~arrow_index trace type_pairs env cty1 cty2 = try match cty1, cty2 with | Cty_constr (_, _, cty1), _ -> - moregen_clty true type_pairs env cty1 cty2 + moregen_clty ~arrow_index true type_pairs env cty1 cty2 | _, Cty_constr (_, _, cty2) -> - moregen_clty true type_pairs env cty1 cty2 + moregen_clty ~arrow_index true type_pairs env cty1 cty2 | Cty_arrow (l1, ty1, cty1'), Cty_arrow (l2, ty2, cty2') when l1 = l2 -> + let arrow_index = arrow_index + 1 in begin try moregen true type_pairs env ty1 ty2 with Moregen_trace trace -> raise (Failure [ - CM_Parameter_mismatch (env, expand_to_moregen_error env trace)]) + CM_Parameter_mismatch + (arrow_index, env, expand_to_moregen_error env trace)]) end; - moregen_clty false type_pairs env cty1' cty2' + moregen_clty ~arrow_index false type_pairs env cty1' cty2' | Cty_signature sign1, Cty_signature sign2 -> Meths.iter (fun lab (_, _, ty) -> @@ -4429,6 +4442,9 @@ let rec moregen_clty trace type_pairs env cty1 cty2 = Failure error when trace || error = [] -> raise (Failure (CM_Class_type_mismatch (env, cty1, cty2)::error)) +let moregen_clty trace type_pairs env cty1 cty2 = + moregen_clty ~arrow_index:0 trace type_pairs env cty1 cty2 + let match_class_types ?(trace=true) env pat_sch subj_sch = let sign1 = signature_of_class_type pat_sch in let sign2 = signature_of_class_type subj_sch in @@ -4543,11 +4559,11 @@ let match_class_declarations env patt_params patt_type subj_params subj_type = let ls = List.length subj_params in if lp <> ls then raise (Failure [CM_Parameter_arity_mismatch (lp, ls)]); - List.iter2 (fun p s -> + Stdlib.List.iteri2 (fun n p s -> try eqtype true type_pairs subst env p s with Equality_trace trace -> raise (Failure [CM_Type_parameter_mismatch - (env, expand_to_equality_error env trace !subst)])) + (n+1, env, expand_to_equality_error env trace !subst)])) patt_params subj_params; (* old code: equal_clty false type_pairs subst env patt_type subj_type; *) equal_clsig false type_pairs subst env sign1 sign2; @@ -4894,7 +4910,7 @@ let rec subtype_rec env trace t1 t2 cstrs = | (Tpoly (u1, []), Tpoly (u2, [])) -> subtype_rec env trace u1 u2 cstrs | (Tpoly (u1, tl1), Tpoly (u2, [])) -> - let _, u1' = instance_poly false tl1 u1 in + let _, u1' = instance_poly ~fixed:false tl1 u1 in subtype_rec env trace u1' u2 cstrs | (Tpoly (u1, tl1), Tpoly (u2,tl2)) -> begin try @@ -5387,7 +5403,7 @@ let nondep_type_decl env mid is_covariant decl = let params = List.map (nondep_type_rec env mid) decl.type_params in let tk = try map_kind (nondep_type_rec env mid) decl.type_kind - with Nondep_cannot_erase _ when is_covariant -> Type_abstract Abstract_def + with Nondep_cannot_erase _ when is_covariant -> Type_abstract Definition and tm, priv = match decl.type_manifest with | None -> None, decl.type_private diff --git a/typing/ctype.mli b/typing/ctype.mli index 4ba26faefe1..78d991facfc 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -173,8 +173,8 @@ val instance_list: type_expr list -> type_expr list (* Take an instance of a list of type schemes *) val new_local_type: ?loc:Location.t -> - ?manifest_and_scope:(type_expr * int) -> unit -> type_declaration -val existential_name: constructor_description -> type_expr -> string + ?manifest_and_scope:(type_expr * int) -> + type_origin -> type_declaration module Pattern_env : sig type t = private @@ -206,12 +206,13 @@ val instance_class: type_expr list -> class_type -> type_expr list * class_type val instance_poly: - ?keep_names:bool -> - bool -> type_expr list -> type_expr -> type_expr list * type_expr + ?keep_names:bool -> fixed:bool -> + type_expr list -> type_expr -> type_expr list * type_expr (* Take an instance of a type scheme containing free univars *) val polyfy: Env.t -> type_expr -> type_expr list -> type_expr * bool val instance_label: - bool -> label_description -> type_expr list * type_expr * type_expr + fixed:bool -> + label_description -> type_expr list * type_expr * type_expr (* Same, for a label *) val apply: ?use_current_level:bool -> @@ -319,9 +320,9 @@ exception Filter_method_failed of filter_method_failure type class_match_failure = CM_Virtual_class | CM_Parameter_arity_mismatch of int * int - | CM_Type_parameter_mismatch of Env.t * Errortrace.equality_error + | CM_Type_parameter_mismatch of int * Env.t * Errortrace.equality_error | CM_Class_type_mismatch of Env.t * class_type * class_type - | CM_Parameter_mismatch of Env.t * Errortrace.moregen_error + | CM_Parameter_mismatch of int * Env.t * Errortrace.moregen_error | CM_Val_type_mismatch of string * Env.t * Errortrace.comparison_error | CM_Meth_type_mismatch of string * Env.t * Errortrace.comparison_error | CM_Non_mutable_value of string diff --git a/typing/env.ml b/typing/env.ml index 2eeca2231ac..fe21970bae4 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -674,6 +674,11 @@ let error err = raise (Error err) let lookup_error loc env err = error (Lookup_error(loc, env, err)) +let same_type_declarations e1 e2 = + e1.types == e2.types && + e1.modules == e2.modules && + e1.local_constraints == e2.local_constraints + let same_constr = ref (fun _ _ _ -> assert false) let check_well_formed_module = ref (fun _ -> assert false) @@ -1028,7 +1033,7 @@ let find_ident_module id env = match find_same_module id env.modules with | Mod_local data -> data | Mod_unbound _ -> raise Not_found - | Mod_persistent -> find_pers_mod (Ident.name id) + | Mod_persistent -> find_pers_mod ~allow_hidden:true (Ident.name id) let rec find_module_components path env = match path with @@ -1136,7 +1141,7 @@ let rec find_type_data path env = | decl -> { tda_declaration = decl; - tda_descriptions = Type_abstract Abstract_def; + tda_descriptions = Type_abstract (Btype.type_origin decl); tda_shape = Shape.leaf decl.type_uid; } | exception Not_found -> begin @@ -1904,6 +1909,7 @@ and check_value_name name loc = and store_value ?check id addr decl shape env = check_value_name (Ident.name id) decl.val_loc; + Builtin_attributes.mark_alerts_used decl.val_attributes; Option.iter (fun f -> check_usage decl.val_loc id decl.val_uid f !value_declarations) check; @@ -1942,6 +1948,8 @@ and store_constructor ~check type_decl type_id cstr_id cstr env = (constructor_usage_complaint ~rebind:false priv used)); end; end); + Builtin_attributes.mark_alerts_used cstr.cstr_attributes; + Builtin_attributes.mark_warn_on_literal_pattern_used cstr.cstr_attributes; let cda_shape = Shape.leaf cstr.cstr_uid in { env with constrs = @@ -1974,6 +1982,9 @@ and store_label ~check type_decl type_id lbl_id lbl env = loc (Warnings.Unused_field(name, complaint))) (label_usage_complaint priv mut used)) end); + Builtin_attributes.mark_alerts_used lbl.lbl_attributes; + if lbl.lbl_mut = Mutable then + Builtin_attributes.mark_deprecated_mutable_used lbl.lbl_attributes; { env with labels = TycompTbl.add lbl_id lbl env.labels; } @@ -2011,6 +2022,7 @@ and store_type ~check id info shape env = tda_descriptions = descrs; tda_shape = shape } in + Builtin_attributes.mark_alerts_used info.type_attributes; { env with types = IdTbl.add id tda env.types; summary = Env_type(env.summary, id, info) } @@ -2024,7 +2036,7 @@ and store_type_infos ~tda_shape id info env = let tda = { tda_declaration = info; - tda_descriptions = Type_abstract Abstract_def; + tda_descriptions = Type_abstract (Btype.type_origin info); tda_shape } in @@ -2042,6 +2054,8 @@ and store_extension ~check ~rebind id addr ext shape env = cda_address = Some addr; cda_shape = shape } in + Builtin_attributes.mark_alerts_used ext.ext_attributes; + Builtin_attributes.mark_warn_on_literal_pattern_used ext.ext_attributes; Builtin_attributes.warning_scope ext.ext_attributes (fun () -> if check && not loc.Location.loc_ghost && Warnings.is_active (Warnings.Unused_extension ("", false, Unused)) @@ -2075,6 +2089,7 @@ and store_module ?(update_summary=true) ~check let loc = md.mdl_loc in Option.iter (fun f -> check_usage loc id md.mdl_uid f !module_declarations) check; + Builtin_attributes.mark_alerts_used md.mdl_attributes; let alerts = Builtin_attributes.alerts_of_attrs md.mdl_attributes in let comps = components_of_module ~alerts ~uid:md.mdl_uid @@ -2094,6 +2109,7 @@ and store_module ?(update_summary=true) ~check summary } and store_modtype ?(update_summary=true) id info shape env = + Builtin_attributes.mark_alerts_used info.Subst.Lazy.mtdl_attributes; let mtda = { mtda_declaration = info; mtda_shape = shape } in let summary = if not update_summary then env.summary @@ -2103,6 +2119,7 @@ and store_modtype ?(update_summary=true) id info shape env = summary } and store_class id addr desc shape env = + Builtin_attributes.mark_alerts_used desc.cty_attributes; let clda = { clda_declaration = desc; clda_address = addr; @@ -2113,6 +2130,7 @@ and store_class id addr desc shape env = summary = Env_class(env.summary, id, desc) } and store_cltype id desc shape env = + Builtin_attributes.mark_alerts_used desc.clty_attributes; let cltda = { cltda_declaration = desc; cltda_shape = shape } in { env with cltypes = IdTbl.add id cltda env.cltypes; @@ -2231,7 +2249,7 @@ let add_module_lazy ~update_summary id presence mty env = in add_module_declaration_lazy ~update_summary id presence md env -let add_local_type path info env = +let add_local_constraint path info env = { env with local_constraints = Path.Map.add path info env.local_constraints } @@ -2541,10 +2559,11 @@ let save_signature_with_transform cmi_transform ~alerts sg cmi_info = (Unit_info.Artifact.modname cmi_info) sg alerts |> cmi_transform in let filename = Unit_info.Artifact.filename cmi_info in - let pm = save_sign_of_cmi - { Persistent_env.Persistent_signature.cmi; filename } in - Persistent_env.save_cmi !persistent_env - { Persistent_env.Persistent_signature.filename; cmi } pm; + let pers_sig = + Persistent_env.Persistent_signature.{ cmi; filename; visibility = Visible } + in + let pm = save_sign_of_cmi pers_sig in + Persistent_env.save_cmi !persistent_env pers_sig pm; cmi let save_signature ~alerts sg cmi = @@ -2764,10 +2783,10 @@ let lookup_ident_module (type a) (load : a load) ~errors ~use ~loc s env = | Mod_persistent -> begin match load with | Don't_load -> - check_pers_mod ~loc s; + check_pers_mod ~allow_hidden:false ~loc s; path, (() : a) | Load -> begin - match find_pers_mod s with + match find_pers_mod ~allow_hidden:false s with | mda -> use_module ~use ~loc path mda; path, (mda : a) @@ -3272,7 +3291,7 @@ let bound_module name env = | exception Not_found -> if Current_unit_name.is name then false else begin - match find_pers_mod name with + match find_pers_mod ~allow_hidden:false name with | _ -> true | exception Not_found -> false end diff --git a/typing/env.mli b/typing/env.mli index 9ba3e425ce4..74d5565273c 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -60,6 +60,9 @@ val empty: t val initial: t val diff: t -> t -> Ident.t list +(* approximation to the preimage equivalence class of [find_type] *) +val same_type_declarations: t -> t -> bool + type type_descr_kind = (label_description, constructor_description) type_kind @@ -313,7 +316,7 @@ val add_modtype_lazy: update_summary:bool -> Ident.t -> Subst.Lazy.modtype_declaration -> t -> t val add_class: Ident.t -> class_declaration -> t -> t val add_cltype: Ident.t -> class_type_declaration -> t -> t -val add_local_type: Path.t -> type_declaration -> t -> t +val add_local_constraint: Path.t -> type_declaration -> t -> t (* Insertion of persistent signatures *) diff --git a/typing/envaux.ml b/typing/envaux.ml index f7f1ef042fa..90e0da92c42 100644 --- a/typing/envaux.ml +++ b/typing/envaux.ml @@ -77,7 +77,7 @@ let rec env_from_summary sum subst = | Env_constraints(s, map) -> Path.Map.fold (fun path info -> - Env.add_local_type (Subst.type_path subst path) + Env.add_local_constraint (Subst.type_path subst path) (Subst.type_declaration subst info)) map (env_from_summary s subst) | Env_copy_types s -> diff --git a/typing/includeclass.ml b/typing/includeclass.ml index 3a2cd57694f..39f00f9cf54 100644 --- a/typing/includeclass.ml +++ b/typing/includeclass.ml @@ -56,12 +56,13 @@ let include_err mode ppf = | CM_Parameter_arity_mismatch _ -> fprintf ppf "The classes do not have the same number of type parameters" - | CM_Type_parameter_mismatch (env, err) -> + | CM_Type_parameter_mismatch (n, env, err) -> Printtyp.report_equality_error ppf mode env err (function ppf -> - fprintf ppf "A type parameter has type") + fprintf ppf "The %d%s type parameter has type" + n (Misc.ordinal_suffix n)) (function ppf -> - fprintf ppf "but is expected to have type") + fprintf ppf "but is expected to have type") | CM_Class_type_mismatch (env, cty1, cty2) -> Printtyp.wrap_printing_env ~error:true env (fun () -> fprintf ppf @@ -69,10 +70,11 @@ let include_err mode ppf = Printtyp.class_type cty1 "is not matched by the class type" Printtyp.class_type cty2) - | CM_Parameter_mismatch (env, err) -> + | CM_Parameter_mismatch (n, env, err) -> Printtyp.report_moregen_error ppf mode env err (function ppf -> - fprintf ppf "A parameter has type") + fprintf ppf "The %d%s parameter has type" + n (Misc.ordinal_suffix n)) (function ppf -> fprintf ppf "but is expected to have type") | CM_Val_type_mismatch (lab, env, err) -> diff --git a/typing/parmatch.ml b/typing/parmatch.ml index d646b2d5cd3..30faed66cce 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -1900,7 +1900,7 @@ let do_check_partial ~pred loc casel pss = match pss with try let buf = Buffer.create 16 in let fmt = Format.formatter_of_buffer buf in - Printpat.top_pretty fmt v; + Format.fprintf fmt "%a@?" Printpat.pretty_pat v; if do_match (initial_only_guarded casel) [v] then Buffer.add_string buf "\n(However, some guarded clause may match this value.)"; diff --git a/typing/persistent_env.ml b/typing/persistent_env.ml index 41ac7aeff44..5e59b995d5e 100644 --- a/typing/persistent_env.ml +++ b/typing/persistent_env.ml @@ -34,12 +34,17 @@ let error err = raise (Error err) module Persistent_signature = struct type t = { filename : string; - cmi : Cmi_format.cmi_infos } - - let load = ref (fun ~unit_name -> - match Load_path.find_normalized (unit_name ^ ".cmi") with - | filename -> Some { filename; cmi = read_cmi filename } - | exception Not_found -> None) + cmi : Cmi_format.cmi_infos; + visibility : Load_path.visibility } + + let load = ref (fun ~allow_hidden ~unit_name -> + match Load_path.find_normalized_with_visibility (unit_name ^ ".cmi") with + | filename, visibility when allow_hidden -> + Some { filename; cmi = read_cmi filename; visibility} + | filename, Visible -> + Some { filename; cmi = read_cmi filename; visibility = Visible} + | _, Hidden + | exception Not_found -> None) end type can_load_cmis = @@ -51,6 +56,7 @@ type pers_struct = { ps_crcs: (string * Digest.t option) list; ps_filename: string; ps_flags: pers_flags list; + ps_visibility: Load_path.visibility; } module String = Misc.Stdlib.String @@ -168,7 +174,7 @@ let save_pers_struct penv crc ps pm = add_import penv modname let acknowledge_pers_struct penv check modname pers_sig pm = - let { Persistent_signature.filename; cmi } = pers_sig in + let { Persistent_signature.filename; cmi; visibility } = pers_sig in let name = cmi.cmi_name in let crcs = cmi.cmi_crcs in let flags = cmi.cmi_flags in @@ -176,6 +182,7 @@ let acknowledge_pers_struct penv check modname pers_sig pm = ps_crcs = crcs; ps_filename = filename; ps_flags = flags; + ps_visibility = visibility; } in if ps.ps_name <> modname then error (Illegal_renaming(modname, ps.ps_name, filename)); @@ -197,26 +204,28 @@ let read_pers_struct penv val_of_pers_sig check cmi = let filename = Unit_info.Artifact.filename cmi in add_import penv modname; let cmi = read_cmi filename in - let pers_sig = { Persistent_signature.filename; cmi } in + let pers_sig = { Persistent_signature.filename; cmi; visibility = Visible } in let pm = val_of_pers_sig pers_sig in let ps = acknowledge_pers_struct penv check modname pers_sig pm in (ps, pm) -let find_pers_struct penv val_of_pers_sig check name = +let find_pers_struct ~allow_hidden penv val_of_pers_sig check name = let {persistent_structures; _} = penv in if name = "*predef*" then raise Not_found; match Hashtbl.find persistent_structures name with - | Found (ps, pm) -> (ps, pm) + | Found (ps, pm) when allow_hidden || ps.ps_visibility = Load_path.Visible -> + (ps, pm) + | Found _ -> raise Not_found | Missing -> raise Not_found | exception Not_found -> match can_load_cmis penv with | Cannot_load_cmis _ -> raise Not_found | Can_load_cmis -> let psig = - match !Persistent_signature.load ~unit_name:name with + match !Persistent_signature.load ~allow_hidden ~unit_name:name with | Some psig -> psig | None -> - Hashtbl.add persistent_structures name Missing; + if allow_hidden then Hashtbl.add persistent_structures name Missing; raise Not_found in add_import penv name; @@ -226,9 +235,9 @@ let find_pers_struct penv val_of_pers_sig check name = module Style = Misc.Style (* Emits a warning if there is no valid cmi for name *) -let check_pers_struct penv f ~loc name = +let check_pers_struct ~allow_hidden penv f ~loc name = try - ignore (find_pers_struct penv f false name) + ignore (find_pers_struct ~allow_hidden penv f false name) with | Not_found -> let warn = Warnings.No_cmi_file(name, None) in @@ -259,10 +268,10 @@ let check_pers_struct penv f ~loc name = let read penv f a = snd (read_pers_struct penv f true a) -let find penv f name = - snd (find_pers_struct penv f true name) +let find ~allow_hidden penv f name = + snd (find_pers_struct ~allow_hidden penv f true name) -let check penv f ~loc name = +let check ~allow_hidden penv f ~loc name = let {persistent_structures; _} = penv in if not (Hashtbl.mem persistent_structures name) then begin (* PR#6843: record the weak dependency ([add_import]) regardless of @@ -271,11 +280,11 @@ let check penv f ~loc name = add_import penv name; if (Warnings.is_active (Warnings.No_cmi_file("", None))) then !add_delayed_check_forward - (fun () -> check_pers_struct penv f ~loc name) + (fun () -> check_pers_struct ~allow_hidden penv f ~loc name) end let crc_of_unit penv f name = - let (ps, _pm) = find_pers_struct penv f true name in + let (ps, _pm) = find_pers_struct ~allow_hidden:true penv f true name in let crco = try List.assoc name ps.ps_crcs @@ -315,7 +324,7 @@ let make_cmi penv modname sign alerts = } let save_cmi penv psig pm = - let { Persistent_signature.filename; cmi } = psig in + let { Persistent_signature.filename; cmi; visibility } = psig in Misc.try_finally (fun () -> let { cmi_name = modname; @@ -334,6 +343,7 @@ let save_cmi penv psig pm = ps_crcs = (cmi.cmi_name, Some crc) :: imports; ps_filename = filename; ps_flags = flags; + ps_visibility = visibility } in save_pers_struct penv crc ps pm ) diff --git a/typing/persistent_env.mli b/typing/persistent_env.mli index 2a9420a8c44..136da7f8810 100644 --- a/typing/persistent_env.mli +++ b/typing/persistent_env.mli @@ -32,12 +32,14 @@ val report_error: Format.formatter -> error -> unit module Persistent_signature : sig type t = { filename : string; (** Name of the file containing the signature. *) - cmi : Cmi_format.cmi_infos } + cmi : Cmi_format.cmi_infos; + visibility : Load_path.visibility + } (** Function used to load a persistent signature. The default is to look for the .cmi file in the load path. This function can be overridden to load it from memory, for instance to build a self-contained toplevel. *) - val load : (unit_name:string -> t option) ref + val load : (allow_hidden:bool -> unit_name:string -> t option) ref end type can_load_cmis = @@ -54,11 +56,12 @@ val clear_missing : 'a t -> unit val fold : 'a t -> (modname -> 'a -> 'b -> 'b) -> 'b -> 'b val read : 'a t -> (Persistent_signature.t -> 'a) -> Unit_info.Artifact.t -> 'a -val find : 'a t -> (Persistent_signature.t -> 'a) -> modname -> 'a +val find : allow_hidden:bool -> 'a t -> (Persistent_signature.t -> 'a) + -> modname -> 'a val find_in_cache : 'a t -> modname -> 'a option -val check : 'a t -> (Persistent_signature.t -> 'a) +val check : allow_hidden:bool -> 'a t -> (Persistent_signature.t -> 'a) -> loc:Location.t -> modname -> unit (* [looked_up penv md] checks if one has already tried diff --git a/typing/predef.ml b/typing/predef.ml index 453f61a4472..7344be15fc2 100644 --- a/typing/predef.ml +++ b/typing/predef.ml @@ -135,7 +135,7 @@ and ident_none = ident_create "None" and ident_some = ident_create "Some" let mk_add_type add_type type_ident ?manifest - ?(immediate=Type_immediacy.Unknown) ?(kind=Type_abstract Abstract_def) env = + ?(immediate=Type_immediacy.Unknown) ?(kind=Type_abstract Definition) env = let decl = {type_params = []; type_arity = 0; @@ -158,7 +158,7 @@ let mk_add_type add_type type_ident ?manifest let build_initial_env add_type add_extension empty_env = let add_type = mk_add_type add_type and add_type1 type_ident - ~variance ~separability ?(kind=fun _ -> Type_abstract Abstract_def) env = + ~variance ~separability ?(kind=fun _ -> Type_abstract Definition) env = let param = newgenvar () in let decl = {type_params = [param]; diff --git a/typing/primitive.ml b/typing/primitive.ml index 0b3b4895921..f8e964cce1c 100644 --- a/typing/primitive.ml +++ b/typing/primitive.ml @@ -95,8 +95,7 @@ let parse_declaration valdecl ~native_repr_args ~native_repr_res = fatal_error "Primitive.parse_declaration" in let noalloc_attribute = - Attr_helper.has_no_payload_attribute ["noalloc"; "ocaml.noalloc"] - valdecl.pval_attributes + Attr_helper.has_no_payload_attribute "noalloc" valdecl.pval_attributes in if old_style_float && not (List.for_all is_ocaml_repr native_repr_args && diff --git a/typing/printpat.ml b/typing/printpat.ml index 64094b63ec3..38524529f6a 100644 --- a/typing/printpat.ml +++ b/typing/printpat.ml @@ -84,7 +84,7 @@ let rec pretty_val : type k . _ -> k general_pattern -> _ = fun ppf v -> | (_,_,{pat_desc=Tpat_any}) -> false (* do not show lbl=_ *) | _ -> true) lvs in begin match filtered_lvs with - | [] -> fprintf ppf "_" + | [] -> fprintf ppf "{ _ }" | (_, lbl, _) :: q -> let elision_mark ppf = (* we assume that there is no label repetitions here *) @@ -144,26 +144,20 @@ and pretty_lvals ppf = function fprintf ppf "%s=%a;@ %a" lbl.lbl_name pretty_val v pretty_lvals rest -let top_pretty ppf v = - fprintf ppf "@[%a@]@?" pretty_val v - -let pretty_pat p = - top_pretty Format.str_formatter p ; - prerr_string (Format.flush_str_formatter ()) +let pretty_pat ppf p = + fprintf ppf "@[%a@]" pretty_val p type 'k matrix = 'k general_pattern list list -let pretty_line fmt = +let pretty_line ppf line = + Format.fprintf ppf "@["; List.iter (fun p -> - Format.fprintf fmt " <"; - top_pretty fmt p; - Format.fprintf fmt ">"; - ) - -let pretty_matrix fmt (pss : 'k matrix) = - Format.fprintf fmt "begin matrix\n" ; - List.iter (fun ps -> - pretty_line fmt ps ; - Format.fprintf fmt "\n" - ) pss; - Format.fprintf fmt "end matrix\n%!" + Format.fprintf ppf "<%a>@ " + pretty_val p + ) line; + Format.fprintf ppf "@]" + +let pretty_matrix ppf (pss : 'k matrix) = + Format.fprintf ppf "@[ %a@]" + (Format.pp_print_list ~pp_sep:Format.pp_print_cut pretty_line) + pss diff --git a/typing/printpat.mli b/typing/printpat.mli index de47939099a..1f03508c2d2 100644 --- a/typing/printpat.mli +++ b/typing/printpat.mli @@ -18,10 +18,9 @@ val pretty_const : Asttypes.constant -> string val pretty_val : Format.formatter -> 'k Typedtree.general_pattern -> unit -val top_pretty - : Format.formatter -> 'k Typedtree.general_pattern -> unit + val pretty_pat - : 'k Typedtree.general_pattern -> unit + : Format.formatter -> 'k Typedtree.general_pattern -> unit val pretty_line : Format.formatter -> 'k Typedtree.general_pattern list -> unit val pretty_matrix diff --git a/typing/printtyp.ml b/typing/printtyp.ml index ed511fb5d46..3cb5f616fc4 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -829,6 +829,70 @@ let printer_iter_type_expr f ty = | _ -> Btype.iter_type_expr f ty +module Internal_names : sig + + val reset : unit -> unit + + val add : Path.t -> unit + + val print_explanations : Env.t -> Format.formatter -> unit + +end = struct + + let names = ref Ident.Set.empty + + let reset () = + names := Ident.Set.empty + + let add p = + match p with + | Pident id -> + let name = Ident.name id in + if String.length name > 0 && name.[0] = '$' then begin + names := Ident.Set.add id !names + end + | Pdot _ | Papply _ | Pextra_ty _ -> () + + let print_explanations env ppf = + let constrs = + Ident.Set.fold + (fun id acc -> + let p = Pident id in + match Env.find_type p env with + | exception Not_found -> acc + | decl -> + match type_origin decl with + | Existential constr -> + let prev = String.Map.find_opt constr acc in + let prev = Option.value ~default:[] prev in + String.Map.add constr (tree_of_path None p :: prev) acc + | Definition | Rec_check_regularity -> acc) + !names String.Map.empty + in + String.Map.iter + (fun constr out_idents -> + match out_idents with + | [] -> () + | [out_ident] -> + fprintf ppf + "@ @[<2>@{Hint@}:@ %a@ is an existential type@ \ + bound by the constructor@ %a.@]" + (Style.as_inline_code !Oprint.out_ident) out_ident + Style.inline_code constr + | out_ident :: out_idents -> + fprintf ppf + "@ @[<2>@{Hint@}:@ %a@ and %a@ are existential types@ \ + bound by the constructor@ %a.@]" + (Format.pp_print_list + ~pp_sep:(fun ppf () -> fprintf ppf ",@ ") + (Style.as_inline_code !Oprint.out_ident)) + (List.rev out_idents) + (Style.as_inline_code !Oprint.out_ident) out_ident + Style.inline_code constr) + constrs + +end + module Names : sig val reset_names : unit -> unit @@ -906,11 +970,7 @@ end = struct || String.Set.mem name !named_weak_vars let rec new_name () = - let name = - if !name_counter < 26 - then String.make 1 (Char.chr(97 + !name_counter)) - else String.make 1 (Char.chr(97 + !name_counter mod 26)) ^ - Int.to_string(!name_counter / 26) in + let name = Misc.letter_of_int !name_counter in incr name_counter; if name_is_already_used name then new_name () else name @@ -1063,7 +1123,7 @@ let reset_loop_marks () = visited_objects := []; aliased := []; delayed := []; printed_aliases := [] let reset_except_context () = - Names.reset_names (); reset_loop_marks () + Names.reset_names (); reset_loop_marks (); Internal_names.reset () let reset () = Conflicts.reset (); @@ -1119,9 +1179,10 @@ let rec tree_of_typexp mode ty = let tyl' = apply_subst s tyl in if is_nth s && not (tyl'=[]) then tree_of_typexp mode (List.hd tyl') - else - let tpath = tree_of_best_type_path p p' in - Otyp_constr (tpath, tree_of_typlist mode tyl') + else begin + Internal_names.add p'; + Otyp_constr (tree_of_best_type_path p p', tree_of_typlist mode tyl') + end | Tvariant row -> let Row {fields; name; closed; _} = row_repr row in let fields = @@ -1867,7 +1928,7 @@ let dummy = { type_params = []; type_arity = 0; - type_kind = Type_abstract Abstract_def; + type_kind = Type_abstract Definition; type_private = Public; type_manifest = None; type_variance = []; @@ -2285,7 +2346,11 @@ let explain_fixed_row pos expl = match expl with | Reified p -> dprintf "The %a variant type is bound to %a" Errortrace.print_pos pos - (Style.as_inline_code (fun ppf p -> print_path p ppf)) p + (Style.as_inline_code + (fun ppf p -> + Internal_names.add p; + print_path p ppf)) + p | Rigid -> ignore let explain_variant (type variety) : variety Errortrace.variant -> _ = function @@ -2436,19 +2501,20 @@ let warn_on_missing_def env ppf t = match get_desc t with | Tconstr (p,_,_) -> begin match Env.find_type p env with - | { type_kind = Type_abstract Abstract_rec_check_regularity; _ } -> - fprintf ppf - "@,@[Type %a was considered abstract@ when checking\ - @ constraints@ in this@ recursive type definition.@]" - (Style.as_inline_code path) p | exception Not_found -> fprintf ppf "@,@[Type %a is abstract because@ no corresponding\ @ cmi file@ was found@ in path.@]" (Style.as_inline_code path) p - | {type_kind = - Type_abstract Abstract_def | Type_record _ | Type_variant _ | Type_open } - -> () - end + | { type_manifest = Some _; _ } -> () + | { type_manifest = None; _ } as decl -> + match type_origin decl with + | Rec_check_regularity -> + fprintf ppf + "@,@[Type %a was considered abstract@ when checking\ + @ constraints@ in this@ recursive type definition.@]" + (Style.as_inline_code path) p + | Definition | Existential _ -> () + end | _ -> () let prepare_expansion_head empty_tr = function @@ -2503,6 +2569,7 @@ let error trace_format mode subst env tr txt1 ppf txt2 ty_expect_explanation = (explain mis); if env <> Env.empty then warn_on_missing_defs env ppf head; + Internal_names.print_explanations env ppf; Conflicts.print_explanations ppf; print_labels := true with exn -> diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 2e76ae838a0..2f285bfc37a 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -106,6 +106,11 @@ let fmt_private_flag f x = | Public -> fprintf f "Public" | Private -> fprintf f "Private" +let fmt_partiality f x = + match x with + | Total -> () + | Partial -> fprintf f " (Partial)" + let line i f s (*...*) = fprintf f "%s" (String.make (2*i) ' '); fprintf f s (*...*) @@ -201,7 +206,7 @@ let rec core_type i ppf x = line i ppf "Ttyp_class %a\n" fmt_path li; list i core_type ppf l; | Ttyp_alias (ct, s) -> - line i ppf "Ttyp_alias \"%s\"\n" s; + line i ppf "Ttyp_alias \"%s\"\n" s.txt; core_type i ppf ct; | Ttyp_poly (sl, ct) -> line i ppf "Ttyp_poly%a\n" @@ -292,9 +297,11 @@ and function_body i ppf (body : function_body) = line i ppf "Tfunction_body\n"; expression (i+1) ppf e | Tfunction_cases - { cases; loc; exp_extra; attributes = attrs; param = _; partial = _ } + { cases; loc; exp_extra; attributes = attrs; param = _; partial } -> - line i ppf "Tfunction_cases %a\n" fmt_location loc; + line i ppf "Tfunction_cases%a %a\n" + fmt_partiality partial + fmt_location loc; attributes (i+1) ppf attrs; Option.iter (fun e -> expression_extra (i+1) ppf e []) exp_extra; list (i+1) case ppf cases @@ -344,8 +351,9 @@ and expression i ppf x = line i ppf "Texp_apply\n"; expression i ppf e; list i label_x_expression ppf l; - | Texp_match (e, l, _partial) -> - line i ppf "Texp_match\n"; + | Texp_match (e, l, partial) -> + line i ppf "Texp_match%a\n" + fmt_partiality partial; expression i ppf e; list i case ppf l; | Texp_try (e, l) -> @@ -436,8 +444,9 @@ and expression i ppf x = | Texp_pack me -> line i ppf "Texp_pack"; module_expr i ppf me - | Texp_letop {let_; ands; param = _; body; partial = _} -> - line i ppf "Texp_letop"; + | Texp_letop {let_; ands; param = _; body; partial } -> + line i ppf "Texp_letop%a" + fmt_partiality partial; binding_op (i+1) ppf let_; list (i+1) binding_op ppf ands; case i ppf body @@ -469,10 +478,12 @@ and function_param i ppf x = arg_label i ppf p; match x.fp_kind with | Tparam_pat pat -> - line i ppf "Param_pat\n"; + line i ppf "Param_pat%a\n" + fmt_partiality x.fp_partial; pattern (i+1) ppf pat | Tparam_optional_default (pat, expr) -> - line i ppf "Param_optional_default\n"; + line i ppf "Param_optional_default%a\n" + fmt_partiality x.fp_partial; pattern (i+1) ppf pat; expression (i+1) ppf expr diff --git a/typing/tast_mapper.ml b/typing/tast_mapper.ml index 791f2582238..f8ad6834b9d 100644 --- a/typing/tast_mapper.ml +++ b/typing/tast_mapper.ml @@ -854,7 +854,8 @@ let value_binding sub x = let vb_pat = sub.pat sub x.vb_pat in let vb_expr = sub.expr sub x.vb_expr in let vb_attributes = sub.attributes sub x.vb_attributes in - {vb_loc; vb_pat; vb_expr; vb_attributes} + let vb_rec_kind = x.vb_rec_kind in + {vb_loc; vb_pat; vb_expr; vb_attributes; vb_rec_kind} let env _sub x = x diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 6a288ffea9e..618d05e548c 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -779,7 +779,7 @@ let rec class_field_first_pass self_loc cl_num sign self_scope acc cf = Ctype.unify val_env (Ctype.newty (Tpoly (ty', []))) ty; Ctype.unify val_env (type_approx val_env sbody) ty' | Tpoly (ty1, tl) -> - let _, ty1' = Ctype.instance_poly false tl ty1 in + let _, ty1' = Ctype.instance_poly ~fixed:false tl ty1 in let ty2 = type_approx val_env sbody in Ctype.unify val_env ty2 ty1' | _ -> assert false @@ -1342,8 +1342,9 @@ and class_expr_aux cl_num val_env met_env virt self_scope scl = ([], met_env) in let cl = class_expr cl_num val_env met_env virt self_scope scl' in - let () = if rec_flag = Recursive then - check_recursive_bindings val_env defs + let defs = match rec_flag with + | Recursive -> annotate_recursive_bindings val_env defs + | Nonrecursive -> defs in rc {cl_desc = Tcl_let (rec_flag, defs, vals, cl); cl_loc = scl.pcl_loc; @@ -1447,7 +1448,7 @@ let temp_abbrev loc arity uid = let ty_td = {type_params = !params; type_arity = arity; - type_kind = Type_abstract Abstract_def; + type_kind = Type_abstract Definition; type_private = Public; type_manifest = Some ty; type_variance = Variance.unknown_signature ~injective:false ~arity; @@ -1671,7 +1672,7 @@ let class_infos define_class kind { type_params = obj_params; type_arity = arity; - type_kind = Type_abstract Abstract_def; + type_kind = Type_abstract Definition; type_private = Public; type_manifest = Some obj_ty; type_variance = Variance.unknown_signature ~injective:false ~arity; @@ -1981,7 +1982,7 @@ let approx_class_declarations env sdecls = open Format -let non_virtual_string_of_kind = function +let non_virtual_string_of_kind : kind -> string = function | Object -> "object" | Class -> "non-virtual class" | Class_type -> "non-virtual class type" @@ -2173,8 +2174,11 @@ let report_error env ppf = "@[The instance variable is %s;@ it cannot be redefined as %s@]" mut1 mut2 | No_overriding (_, "") -> - fprintf ppf "@[This inheritance does not override any methods@ %s@]" - "or instance variables" + fprintf ppf + "@[This inheritance does not override any methods@ \ + or instance variables@ but is explicitly marked as@ \ + overriding with %a.@]" + Style.inline_code "!" | No_overriding (kind, name) -> fprintf ppf "@[The %s %a@ has no previous definition@]" kind Style.inline_code name diff --git a/typing/typecore.ml b/typing/typecore.ml index ea009fc174f..ea5aa0cb892 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -169,7 +169,7 @@ type error = | Modules_not_allowed | Cannot_infer_signature | Not_a_packed_module of type_expr - | Unexpected_existential of existential_restriction * string * string list + | Unexpected_existential of existential_restriction * string | Invalid_interval | Invalid_for_loop_index | No_value_clauses @@ -692,7 +692,7 @@ and build_as_type_aux (env : Env.t) p = let ty = newvar () in let ppl = List.map (fun (_, l, p) -> l.lbl_pos, p) lpl in let do_label lbl = - let _, ty_arg, ty_res = instance_label false lbl in + let _, ty_arg, ty_res = instance_label ~fixed:false lbl in unify_pat env {p with pat_type = ty} ty_res; let refinable = lbl.lbl_mut = Immutable && List.mem_assoc lbl.lbl_pos ppl && @@ -701,7 +701,7 @@ and build_as_type_aux (env : Env.t) p = let arg = List.assoc lbl.lbl_pos ppl in unify_pat env {arg with pat_type = build_as_type env arg} ty_arg end else begin - let _, ty_arg', ty_res' = instance_label false lbl in + let _, ty_arg', ty_res' = instance_label ~fixed:false lbl in unify_pat_types p.pat_loc env ty_arg ty_arg'; unify_pat env p ty_res' end in @@ -731,7 +731,7 @@ let solve_Ppat_poly_constraint tps env loc sty expected_ty = | Tpoly (body, tyl) -> let _, ty' = with_level ~level:generic_level - (fun () -> instance_poly ~keep_names:true false tyl body) + (fun () -> instance_poly ~keep_names:true ~fixed:false tyl body) in (cty, ty, ty') | _ -> assert false @@ -752,7 +752,7 @@ let solve_constructor_annotation let ids = List.map (fun name -> - let decl = new_local_type ~loc:name.loc () in + let decl = new_local_type ~loc:name.loc Definition in let (id, new_env) = Env.enter_type ~scope:expansion_scope name.txt decl !!penv in Pattern_env.set_env penv new_env; @@ -870,7 +870,7 @@ let solve_Ppat_construct ~refine tps penv loc constr no_existentials let solve_Ppat_record_field ~refine loc penv label label_lid record_ty = with_local_level_iter ~post:generalize_structure begin fun () -> - let (_, ty_arg, ty_res) = instance_label false label in + let (_, ty_arg, ty_res) = instance_label ~fixed:false label in begin try unify_pat_types_refine ~refine loc penv ty_res (instance record_ty) with Error(_loc, _env, Pattern_type_clash(err, _)) -> @@ -1640,7 +1640,7 @@ and type_pat_aux let ty_var = solve_Ppat_alias !!penv q in let id = enter_variable - ~is_as_variable:true tps loc name ty_var sp.ppat_attributes + ~is_as_variable:true tps name.loc name ty_var sp.ppat_attributes in rvp { pat_desc = Tpat_alias(q, id, name); pat_loc = loc; pat_extra=[]; @@ -1703,10 +1703,9 @@ and type_pat_aux in begin match no_existentials, constr.cstr_existentials with | None, _ | _, [] -> () - | Some r, (_ :: _ as exs) -> - let exs = List.map (Ctype.existential_name constr) exs in + | Some r, (_ :: _) -> let name = constr.cstr_name in - raise (Error (loc, !!penv, Unexpected_existential (r, name, exs))) + raise (Error (loc, !!penv, Unexpected_existential (r, name))) end; let sarg', existential_styp = match sarg with @@ -2605,19 +2604,21 @@ and is_nonexpansive_opt = function let maybe_expansive e = not (is_nonexpansive e) -let check_recursive_bindings env valbinds = +let annotate_recursive_bindings env valbinds = let ids = let_bound_idents valbinds in - List.iter - (fun {vb_expr} -> - if not (Rec_check.is_valid_recursive_expression ids vb_expr) then + List.map + (fun {vb_pat; vb_expr; vb_rec_kind = _; vb_attributes; vb_loc} -> + match (Value_rec_check.is_valid_recursive_expression ids vb_expr) with + | None -> raise(Error(vb_expr.exp_loc, env, Illegal_letrec_expr)) - ) + | Some vb_rec_kind -> + { vb_pat; vb_expr; vb_rec_kind; vb_attributes; vb_loc}) valbinds let check_recursive_class_bindings env ids exprs = List.iter (fun expr -> - if not (Rec_check.is_valid_class_expr ids expr) then + if not (Value_rec_check.is_valid_class_expr ids expr) then raise(Error(expr.cl_loc, env, Illegal_class_expr))) exprs @@ -2755,7 +2756,7 @@ let check_univars env kind exp ty_expected vars = (* Enforce scoping for type_let: since body is not generic, instance_poly only makes copies of nodes that have a Tunivar as descendant *) - let _, ty' = instance_poly true tl body in + let _, ty' = instance_poly ~fixed:true tl body in let vars, exp_ty = instance_parameterized_type vars exp.exp_type in unify_exp_types exp.exp_loc env exp_ty ty'; ((exp_ty, vars), exp_ty::vars) @@ -3311,9 +3312,9 @@ and type_expect_ allow_modules in let body = type_expect new_env sbody ty_expected_explained in - let () = - if rec_flag = Recursive then - check_recursive_bindings env pat_exp_list + let pat_exp_list = match rec_flag with + | Recursive -> annotate_recursive_bindings env pat_exp_list + | Nonrecursive -> pat_exp_list in (* The "bound expressions" component of the scope escape check. @@ -3463,7 +3464,8 @@ and type_expect_ in let cases, partial = type_cases Computation env - arg.exp_type ty_expected_explained true loc caselist in + arg.exp_type ty_expected_explained + ~check_if_total:true loc caselist in if List.for_all (fun c -> pattern_needs_partial_application_check c.c_lhs) cases @@ -3478,7 +3480,8 @@ and type_expect_ let body = type_expect env sbody ty_expected_explained in let cases, _ = type_cases Value env - Predef.type_exn ty_expected_explained false loc caselist in + Predef.type_exn ty_expected_explained + ~check_if_total:false loc caselist in re { exp_desc = Texp_try(body, cases); exp_loc = loc; exp_extra = []; @@ -3649,14 +3652,14 @@ and type_expect_ | Some exp -> let ty_exp = instance exp.exp_type in let unify_kept lbl = - let _, ty_arg1, ty_res1 = instance_label false lbl in + let _, ty_arg1, ty_res1 = instance_label ~fixed:false lbl in unify_exp_types exp.exp_loc env ty_exp ty_res1; match matching_label lbl with | lid, _lbl, lbl_exp -> (* do not connect result types for overridden labels *) Overridden (lid, lbl_exp) | exception Not_found -> begin - let _, ty_arg2, ty_res2 = instance_label false lbl in + let _, ty_arg2, ty_res2 = instance_label ~fixed:false lbl in unify_exp_types loc env ty_arg1 ty_arg2; with_explanation (fun () -> unify_exp_types loc env (instance ty_expected) ty_res2); @@ -3692,7 +3695,7 @@ and type_expect_ let (record, label, _) = type_label_access env srecord Env.Projection lid in - let (_, ty_arg, ty_res) = instance_label false label in + let (_, ty_arg, ty_res) = instance_label ~fixed:false label in unify_exp env record ty_res; rue { exp_desc = Texp_field(record, lid, label); @@ -3807,12 +3810,12 @@ and type_expect_ exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_constraint (sarg, sty) -> - let (ty', exp_extra) = type_constraint env sty in - let arg = type_argument env sarg ty' (instance ty') in + let (ty, exp_extra) = type_constraint env sty in + let arg = type_argument env sarg ty (instance ty) in rue { exp_desc = arg.exp_desc; exp_loc = arg.exp_loc; - exp_type = ty'; + exp_type = instance ty; exp_attributes = arg.exp_attributes; exp_env = env; exp_extra = (exp_extra, loc, sexp.pexp_attributes) :: arg.exp_extra; @@ -3844,7 +3847,7 @@ and type_expect_ if !Clflags.principal && get_level typ <> generic_level then Location.prerr_warning loc (Warnings.Not_principal "this use of a polymorphic method"); - snd (instance_poly false tl ty) + snd (instance_poly ~fixed:false tl ty) | Tvar _ -> let ty' = newvar () in unify env (instance typ) (newty(Tpoly(ty',[]))); @@ -4068,7 +4071,7 @@ and type_expect_ with_local_level begin fun () -> let vars, ty'' = with_local_level_if_principal - (fun () -> instance_poly true tl ty') + (fun () -> instance_poly ~fixed:true tl ty') ~post:(fun (_,ty'') -> generalize_structure ty'') in let exp = type_expect env sbody (mk_expected ty'') in @@ -4179,7 +4182,8 @@ and type_expect_ let scase = Ast_helper.Exp.case spat_params sbody in let cases, partial = type_cases Value env - ty_params (mk_expected ty_func_result) true loc [scase] + ty_params (mk_expected ty_func_result) + ~check_if_total:true loc [scase] in let body = match cases with @@ -4388,7 +4392,7 @@ and type_newtype (* Use [with_local_level] just for scoping *) with_local_level begin fun () -> (* Create a fake abstract type declaration for [name]. *) - let decl = new_local_type ~loc () in + let decl = new_local_type ~loc Definition in let scope = create_scope () in let (id, new_env) = Env.enter_type ~scope name decl env in @@ -4560,13 +4564,23 @@ and type_function try unify env (type_option ty_default) ty_arg with Unify _ -> assert false; end; + (* Issue#12668: Retain type-directed disambiguation of + ?x:(y : Variant.t = Constr) + *) + let default = + match pat.ppat_desc with + | Ppat_constraint (_, sty) -> + let gloc = { default.pexp_loc with loc_ghost = true } in + Ast_helper.Exp.constraint_ default sty ~loc:gloc + | _ -> default + in let default = type_expect env default (mk_expected ty_default) in ty_default, Some default in let (pat, params, body, newtypes, contains_gadt), partial = (* Check everything else in the scope of the parameter. *) map_half_typed_cases Value env ty_arg_internal ty_res pat.ppat_loc - ~partial_flag:true + ~check_if_total:true (* We don't make use of [case_data] here so we pass unit. *) [ { pattern = pat; has_guard = false; needs_refute = false }, () ] ~type_body:begin @@ -4986,7 +5000,8 @@ and type_label_exp create env loc ty_expected let (vars, ty_arg, ty_res) = with_local_level_iter_if separate ~post:generalize_structure begin fun () -> - let ((_, ty_arg, ty_res) as r) = instance_label true label in + let ((_, ty_arg, ty_res) as r) = + instance_label ~fixed:true label in (r, [ty_arg; ty_res]) end in @@ -5150,7 +5165,7 @@ and type_argument ?explanation ?recarg env sarg ty_expected' ty_expected = re { texp with exp_type = ty_fun; exp_desc = Texp_let (Nonrecursive, [{vb_pat=let_pat; vb_expr=texp; vb_attributes=[]; - vb_loc=Location.none; + vb_loc=Location.none; vb_rec_kind = Not_recursive; }], func let_var) } end @@ -5473,18 +5488,19 @@ and type_statement ?explanation env sexp = To avoid this issue, we disable the warning in this particular case. We might consider re-enabling it at a point when most users have migrated to OCaml 5.2.0 or later. *) - let allow_polymorphic e = match e.pexp_desc with - | Pexp_while _ -> true + let allow_polymorphic e = match e.exp_desc with + | Texp_while _ -> true | _ -> false in (* Raise the current level to detect non-returning functions *) let exp = with_local_level (fun () -> type_exp env sexp) in + let subexp = final_subexpression exp in let ty = expand_head env exp.exp_type in if is_Tvar ty && get_level ty > get_current_level () - && not (allow_polymorphic sexp) then + && not (allow_polymorphic subexp) then Location.prerr_warning - (final_subexpression exp).exp_loc + subexp.exp_loc Warnings.Nonreturning_statement; if !Clflags.strict_sequence then let expected_ty = instance Predef.type_unit in @@ -5522,10 +5538,10 @@ and map_half_typed_cases -> ty_infer:_ (* type to infer for body *) -> contains_gadt:_ (* whether the pattern contains a GADT *) -> ret) - -> partial_flag:bool + -> check_if_total:bool (* if false, assume Partial right away *) -> ret list * partial = fun ?additional_checks_for_split_cases - category env ty_arg ty_res loc caselist ~type_body ~partial_flag -> + category env ty_arg ty_res loc caselist ~type_body ~check_if_total -> (* ty_arg is _fully_ generalized *) let patterns = List.map (fun ((x : untyped_case), _) -> x.pattern) caselist in let contains_polyvars = List.exists contains_polymorphic_variant patterns in @@ -5716,7 +5732,7 @@ and map_half_typed_cases if val_cases = [] && exn_cases <> [] then raise (Error (loc, env, No_value_clauses)); let partial = - if partial_flag then + if check_if_total then check_partial ~lev env ty_arg_check loc val_cases else Partial @@ -5750,10 +5766,10 @@ and map_half_typed_cases (* Typing of match cases *) and type_cases : type k . k pattern_category -> - _ -> _ -> _ -> _ -> _ -> Parsetree.case list -> + _ -> _ -> _ -> check_if_total:bool -> _ -> Parsetree.case list -> k case list * partial = fun category env - ty_arg ty_res_explained partial_flag loc caselist -> + ty_arg ty_res_explained ~check_if_total loc caselist -> let { ty = ty_res; explanation } = ty_res_explained in let caselist = List.map (fun case -> Parmatch.untyped_case case, case) caselist @@ -5762,7 +5778,7 @@ and type_cases is to typecheck the guards and the cases, and then to check for some warnings that can fire in the presence of guards. *) - map_half_typed_cases category env ty_arg ty_res loc caselist ~partial_flag + map_half_typed_cases category env ty_arg ty_res loc caselist ~check_if_total ~type_body:begin fun { pc_guard; pc_rhs } pat ~ext_env ~ty_expected ~ty_infer ~contains_gadt:_ -> @@ -5806,7 +5822,8 @@ and type_function_cases_expect split_function_ty env ty_expected ~arg_label:Nolabel ~first ~in_function in let cases, partial = - type_cases Value env ty_arg (mk_expected ty_res) true loc cases + type_cases Value env ty_arg (mk_expected ty_res) + ~check_if_total:true loc cases in let ty_fun = instance (newgenty (Tarrow (Nolabel, ty_arg, ty_res, commu_ok))) @@ -5841,7 +5858,7 @@ and type_let ?check ?check_strict match get_desc pat.pat_type with | Tpoly (ty, tl) -> {pat with pat_type = - snd (instance_poly ~keep_names:true false tl ty)} + snd (instance_poly ~keep_names:true ~fixed:false tl ty)} | _ -> pat in let bound_expr = vb_exp_constraint binding in @@ -5900,7 +5917,7 @@ and type_let ?check ?check_strict let vars, ty' = with_local_level_if_principal ~post:(fun (_,ty') -> generalize_structure ty') - (fun () -> instance_poly ~keep_names:true true tl ty) + (fun () -> instance_poly ~keep_names:true ~fixed:true tl ty) in let exp = Builtin_attributes.warning_scope pvb_attributes (fun () -> @@ -5960,8 +5977,9 @@ and type_let ?check ?check_strict let l = List.map2 (fun (p, (e, _)) pvb -> + (* vb_rec_kind will be computed later for recursive bindings *) {vb_pat=p; vb_expr=e; vb_attributes=pvb.pvb_attributes; - vb_loc=pvb.pvb_loc; + vb_loc=pvb.pvb_loc; vb_rec_kind = Not_recursive; }) l spat_sexp_list in @@ -6735,7 +6753,7 @@ let report_error ~loc env = function Location.errorf ~loc "This expression is packed module, but the expected type is@ %a" (Style.as_inline_code Printtyp.type_expr) ty - | Unexpected_existential (reason, name, types) -> + | Unexpected_existential (reason, name) -> let reason_str = match reason with | In_class_args -> @@ -6756,16 +6774,9 @@ let report_error ~loc env = function dprintf "Existential types are not allowed in presence of attributes" in - begin match List.find (fun ty -> ty <> "$" ^ name) types with - | example -> - Location.errorf ~loc - "%t,@ but this pattern introduces the existential type %a." - reason_str Style.inline_code example - | exception Not_found -> - Location.errorf ~loc - "%t,@ but the constructor %a introduces existential types." - reason_str Style.inline_code name - end + Location.errorf ~loc + "%t,@ but the constructor %a introduces existential types." + reason_str Style.inline_code name | Invalid_interval -> Location.errorf ~loc "@[Only character intervals are supported in patterns.@]" diff --git a/typing/typecore.mli b/typing/typecore.mli index 88f85de9bd0..3c0c7a78a5c 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -203,7 +203,7 @@ type error = | Modules_not_allowed | Cannot_infer_signature | Not_a_packed_module of type_expr - | Unexpected_existential of existential_restriction * string * string list + | Unexpected_existential of existential_restriction * string | Invalid_interval | Invalid_for_loop_index | No_value_clauses @@ -256,6 +256,7 @@ val type_package: val constant: Parsetree.constant -> (Asttypes.constant, error) result -val check_recursive_bindings : Env.t -> Typedtree.value_binding list -> unit +val annotate_recursive_bindings : + Env.t -> Typedtree.value_binding list -> Typedtree.value_binding list val check_recursive_class_bindings : Env.t -> Ident.t list -> Typedtree.class_expr list -> unit diff --git a/typing/typedecl.ml b/typing/typedecl.ml index 58e23ed8e8f..528794147cd 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -116,17 +116,17 @@ let enter_type ?abstract_abbrevs rec_flag env sdecl (id, uid) = in let arity = List.length sdecl.ptype_params in if not needed then env else - let abstract_reason, type_manifest = + let abstract_source, type_manifest = match sdecl.ptype_manifest, abstract_abbrevs with - | None, _ -> Abstract_def, None - | Some _, None -> Abstract_def, Some (Btype.newgenvar ()) + | None, _ -> Definition, None + | Some _, None -> Definition, Some (Btype.newgenvar ()) | Some _, Some reason -> reason, None in let decl = { type_params = List.map (fun _ -> Btype.newgenvar ()) sdecl.ptype_params; type_arity = arity; - type_kind = Type_abstract abstract_reason; + type_kind = Type_abstract abstract_source; type_private = sdecl.ptype_private; type_manifest = type_manifest; type_variance = Variance.unknown_signature ~injective:false ~arity; @@ -374,7 +374,7 @@ let transl_declaration env sdecl (id, uid) = in let (tkind, kind) = match sdecl.ptype_kind with - | Ptype_abstract -> Ttype_abstract, Type_abstract Abstract_def + | Ptype_abstract -> Ttype_abstract, Type_abstract Definition | Ptype_variant scstrs -> if List.exists (fun cstr -> cstr.pcd_res <> None) scstrs then begin match cstrs with @@ -528,7 +528,7 @@ let rec check_constraints_rec env loc visited ty = end; List.iter (check_constraints_rec env loc visited) args | Tpoly (ty, tl) -> - let _, ty = Ctype.instance_poly false tl ty in + let _, ty = Ctype.instance_poly ~fixed:false tl ty in check_constraints_rec env loc visited ty | _ -> Btype.iter_type_expr (check_constraints_rec env loc visited) ty @@ -781,7 +781,7 @@ let check_abbrev env sdecl (id, decl) = - if -rectypes is not used, we only allow cycles in the type graph if they go through an object or polymorphic variant type *) -let check_well_founded env loc path to_check visited ty0 = +let check_well_founded ~abs_env env loc path to_check visited ty0 = let rec check parents trace ty = if TypeSet.mem ty parents then begin (*Format.eprintf "@[%a@]@." Printtyp.raw_type_expr ty;*) @@ -797,8 +797,8 @@ let check_well_founded env loc path to_check visited ty0 = | trace -> List.rev trace, false in if rec_abbrev - then Recursive_abbrev (Path.name path, env, reaching_path) - else Cycle_in_def (Path.name path, env, reaching_path) + then Recursive_abbrev (Path.name path, abs_env, reaching_path) + else Cycle_in_def (Path.name path, abs_env, reaching_path) in raise (Error (loc, err)) end; let (fini, parents) = @@ -843,11 +843,11 @@ let check_well_founded env loc path to_check visited ty0 = (* Will be detected by check_regularity *) Btype.backtrack snap -let check_well_founded_manifest env loc path decl = +let check_well_founded_manifest ~abs_env env loc path decl = if decl.type_manifest = None then () else let args = List.map (fun _ -> Ctype.newvar()) decl.type_params in let visited = ref TypeMap.empty in - check_well_founded env loc path (Path.same path) visited + check_well_founded ~abs_env env loc path (Path.same path) visited (Ctype.newconstr path args) (* Given a new type declaration [type t = ...] (potentially mutually-recursive), @@ -865,7 +865,7 @@ let check_well_founded_manifest env loc path decl = (we don't have an example at hand where it is necessary), but we are doing it anyway out of caution. *) -let check_well_founded_decl env loc path decl to_check = +let check_well_founded_decl ~abs_env env loc path decl to_check = let open Btype in (* We iterate on all subexpressions of the declaration to check "in depth" that no ill-founded type exists. *) @@ -884,7 +884,7 @@ let check_well_founded_decl env loc path decl to_check = {type_iterators with it_type_expr = (fun self ty -> if TypeSet.mem ty !checked then () else begin - check_well_founded env loc path to_check visited ty; + check_well_founded ~abs_env env loc path to_check visited ty; checked := TypeSet.add ty !checked; self.it_do_type_expr self ty end)} in @@ -946,7 +946,8 @@ let check_regularity ~abs_env env loc path decl to_check = end; List.iter (check_subtype cpath args prev_exp trace ty) args' | Tpoly (ty, tl) -> - let (_, ty) = Ctype.instance_poly ~keep_names:true false tl ty in + let (_, ty) = + Ctype.instance_poly ~keep_names:true ~fixed:false tl ty in check_regular cpath args prev_exp trace ty | _ -> Btype.iter_type_expr @@ -1123,24 +1124,25 @@ let transl_type_decl env rec_flag sdecl_list = List.map2 (fun (id, _) sdecl -> (id, sdecl.ptype_loc)) ids_list sdecl_list in + (* [check_abbrev_regularity] and error messages cannot use the new + environment, as this might result in non-termination. Instead we use a + completely abstract version of the temporary environment, giving a reason + for why abbreviations cannot be expanded (#12334, #12368) *) + let abs_env = + List.fold_left2 + (enter_type ~abstract_abbrevs:Rec_check_regularity rec_flag) + env sdecl_list ids_list in List.iter (fun (id, decl) -> - check_well_founded_manifest new_env (List.assoc id id_loc_list) + check_well_founded_manifest ~abs_env new_env (List.assoc id id_loc_list) (Path.Pident id) decl) decls; let to_check = function Path.Pident id -> List.mem_assoc id id_loc_list | _ -> false in List.iter (fun (id, decl) -> - check_well_founded_decl new_env (List.assoc id id_loc_list) (Path.Pident id) + check_well_founded_decl ~abs_env new_env (List.assoc id id_loc_list) + (Path.Pident id) decl to_check) decls; - (* [check_abbrev_regularity] cannot use the new environment, as this might - result in non-termination. Instead we use a completely abstract version - of the temporary environment, giving a reason for why abbreviations - cannot be expanded (#12334, #12368) *) - let abs_env = - List.fold_left2 - (enter_type ~abstract_abbrevs:Abstract_rec_check_regularity rec_flag) - env sdecl_list ids_list in List.iter (check_abbrev_regularity ~abs_env new_env id_loc_list to_check) tdecls; @@ -1453,7 +1455,6 @@ let transl_exception env sext = ext, newenv let transl_type_exception env t = - Builtin_attributes.check_no_alert t.ptyexn_attributes; let contructor, newenv = Builtin_attributes.warning_scope t.ptyexn_attributes (fun () -> @@ -1471,8 +1472,8 @@ type native_repr_attribute = let get_native_repr_attribute attrs ~global_repr = match - Attr_helper.get_no_payload_attribute ["unboxed"; "ocaml.unboxed"] attrs, - Attr_helper.get_no_payload_attribute ["untagged"; "ocaml.untagged"] attrs, + Attr_helper.get_no_payload_attribute "unboxed" attrs, + Attr_helper.get_no_payload_attribute "untagged" attrs, global_repr with | None, None, None -> Native_repr_attr_absent @@ -1708,7 +1709,7 @@ let transl_with_constraint id ?fixed_row_path ~sig_env ~sig_decl ~outer_env if arity_ok && man <> None then sig_decl.type_kind, sig_decl.type_unboxed_default else - Type_abstract Abstract_def, false + Type_abstract Definition, false in let new_sig_decl = { type_params = params; @@ -1791,7 +1792,7 @@ let abstract_type_decl ~injective arity = Ctype.with_local_level ~post:generalize_decl begin fun () -> { type_params = make_params arity; type_arity = arity; - type_kind = Type_abstract Abstract_def; + type_kind = Type_abstract Definition; type_private = Public; type_manifest = None; type_variance = Variance.unknown_signature ~injective ~arity; @@ -1822,7 +1823,7 @@ let check_recmod_typedecl env loc recmod_ids path decl = (* recmod_ids is the list of recursively-defined module idents. (path, decl) is the type declaration to be checked. *) let to_check path = Path.exists_free recmod_ids path in - check_well_founded_decl env loc path decl to_check; + check_well_founded_decl ~abs_env:env env loc path decl to_check; check_regularity ~abs_env:env env loc path decl to_check; (* additional coherence check, as one might build an incoherent signature, and use it to build an incoherent module, cf. #7851 *) diff --git a/typing/typedtree.ml b/typing/typedtree.ml index eec3e2605c3..855f694510c 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -323,6 +323,7 @@ and value_binding = { vb_pat: pattern; vb_expr: expression; + vb_rec_kind: Value_rec_types.recursive_binding_kind; vb_attributes: attributes; vb_loc: Location.t; } @@ -469,7 +470,7 @@ and core_type_desc = | Ttyp_constr of Path.t * Longident.t loc * core_type list | Ttyp_object of object_field list * closed_flag | Ttyp_class of Path.t * Longident.t loc * core_type list - | Ttyp_alias of core_type * string + | Ttyp_alias of core_type * string loc | Ttyp_variant of row_field list * closed_flag * label list option | Ttyp_poly of string list * core_type | Ttyp_package of package_type diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 11e400e1b96..c582cc082b2 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -489,6 +489,7 @@ and value_binding = { vb_pat: pattern; vb_expr: expression; + vb_rec_kind: Value_rec_types.recursive_binding_kind; vb_attributes: attributes; vb_loc: Location.t; } @@ -635,7 +636,7 @@ and core_type_desc = | Ttyp_constr of Path.t * Longident.t loc * core_type list | Ttyp_object of object_field list * closed_flag | Ttyp_class of Path.t * Longident.t loc * core_type list - | Ttyp_alias of core_type * string + | Ttyp_alias of core_type * string loc | Ttyp_variant of row_field list * closed_flag * label list option | Ttyp_poly of string list * core_type | Ttyp_package of package_type diff --git a/typing/typemod.ml b/typing/typemod.ml index 433945673f4..727ee89cfba 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -136,7 +136,7 @@ let initial_env ~loc ~initially_opened_module env in let units = - List.map Env.persistent_structures_of_dir (Load_path.get ()) + List.map Env.persistent_structures_of_dir (Load_path.get_visible ()) in let env, units = match initially_opened_module with @@ -499,7 +499,7 @@ let merge_constraint initial_env loc sg lid constr = type_params = List.map (fun _ -> Btype.newgenvar()) sdecl.ptype_params; type_arity = arity; - type_kind = Type_abstract Abstract_def; + type_kind = Type_abstract Definition; type_private = Private; type_manifest = None; type_variance = @@ -1236,8 +1236,7 @@ end let has_remove_aliases_attribute attr = let remove_aliases = - Attr_helper.get_no_payload_attribute - ["remove_aliases"; "ocaml.remove_aliases"] attr + Attr_helper.get_no_payload_attribute "remove_aliases" attr in match remove_aliases with | None -> false @@ -1362,7 +1361,7 @@ and transl_with ~loc env remove_aliases (rev_tcstrs,sg) constr = -and transl_signature env sg = +and transl_signature ?(toplevel = false) env sg = let names = Signature_names.create () in let rec transl_sig env sg = match sg with @@ -1678,6 +1677,8 @@ and transl_signature env sg = typedtree, sg, final_env | Psig_attribute x -> Builtin_attributes.warning_attribute x; + if toplevel || not (Warnings.is_active (Misplaced_attribute "")) + then Builtin_attributes.mark_alert_used x; let (trem,rem, final_env) = transl_sig env srem in mksig (Tsig_attribute x) env loc :: trem, rem, final_env | Psig_extension (ext, _attrs) -> @@ -2509,8 +2510,9 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr = | Pstr_value(rec_flag, sdefs) -> let (defs, newenv) = Typecore.type_binding env rec_flag sdefs in - let () = if rec_flag = Recursive then - Typecore.check_recursive_bindings env defs + let defs = match rec_flag with + | Recursive -> Typecore.annotate_recursive_bindings env defs + | Nonrecursive -> defs in (* Note: Env.find_value does not trigger the value_used event. Values will be marked as being used during the signature inclusion test. *) @@ -2833,6 +2835,8 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr = raise (Error_forward (Builtin_attributes.error_of_extension ext)) | Pstr_attribute x -> Builtin_attributes.warning_attribute x; + if toplevel || not (Warnings.is_active (Misplaced_attribute "")) then + Builtin_attributes.mark_alert_used x; Tstr_attribute x, [], shape_map, env in let rec type_struct env shape_map sstr = @@ -3149,7 +3153,10 @@ let save_signature target tsg initial_env cmi = (Cmt_format.Interface tsg) initial_env (Some cmi) None let type_interface env ast = - transl_signature env ast + transl_signature ~toplevel:true env ast + +let transl_signature env ast = + transl_signature ~toplevel:false env ast (* "Packaging" of several compilation units into one unit having them as sub-modules. *) @@ -3313,14 +3320,18 @@ let report_error ~loc _env = function types (other than when replacing a type constructor with @ \ a type constructor with the same arguments).@]" | With_cannot_remove_packed_modtype (p,mty) -> + let[@manual.ref "ss:module-type-substitution"] manual_ref = + [ 12; 7; 3 ] + in let pp_constraint ppf () = Format.fprintf ppf "%s := %a" (Path.name p) Printtyp.modtype mty in Location.errorf ~loc - "This %a constraint@ %a@ makes a packed module ill-formed." + "This %a constraint@ %a@ makes a packed module ill-formed.@ %a" Style.inline_code "with" (Style.as_inline_code pp_constraint) () + Misc.print_see_manual manual_ref | Repeated_name(kind, name) -> Location.errorf ~loc "@[Multiple definition of the %s name %a.@ \ @@ -3446,10 +3457,15 @@ let report_error ~loc _env = function Location.errorf ~loc "Only type synonyms are allowed on the right of %a" Style.inline_code ":=" | Unpackable_local_modtype_subst p -> + let[@manual.ref "ss:module-type-substitution"] manual_ref = + [ 12; 7; 3 ] + in Location.errorf ~loc "The module type@ %a@ is not a valid type for a packed module:@ \ - it is defined as a local substitution for a non-path module type." + it is defined as a local substitution (temporary name)@ \ + for an anonymous module type.@ %a" Style.inline_code (Path.name p) + Misc.print_see_manual manual_ref let report_error env ~loc err = Printtyp.wrap_printing_env ~error:true env diff --git a/typing/types.ml b/typing/types.ml index 3fa389dac19..997e78d4923 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -186,7 +186,7 @@ module Variance = struct let mp = mem May_pos v1 && mem May_pos v2 || mem May_neg v1 && mem May_neg v2 and mn = - mem May_pos v1 && mem May_neg v2 || mem May_pos v1 && mem May_neg v2 + mem May_pos v1 && mem May_neg v2 || mem May_neg v1 && mem May_pos v2 and mw = mem May_weak v1 && v2 <> null || v1 <> null && mem May_weak v2 and inj = mem Inj v1 && mem Inj v2 and pos = mem Pos v1 && mem Pos v2 || mem Neg v1 && mem Neg v2 @@ -250,14 +250,15 @@ type type_declaration = and type_decl_kind = (label_declaration, constructor_declaration) type_kind and ('lbl, 'cstr) type_kind = - Type_abstract of abstract_reason + Type_abstract of type_origin | Type_record of 'lbl list * record_representation | Type_variant of 'cstr list * variant_representation | Type_open -and abstract_reason = - Abstract_def - | Abstract_rec_check_regularity +and type_origin = + Definition + | Rec_check_regularity + | Existential of string and record_representation = Record_regular (* All fields are boxed / tagged *) diff --git a/typing/types.mli b/typing/types.mli index 209c059eb9e..7ed7fc971ee 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -486,14 +486,15 @@ type type_declaration = and type_decl_kind = (label_declaration, constructor_declaration) type_kind and ('lbl, 'cstr) type_kind = - Type_abstract of abstract_reason + Type_abstract of type_origin | Type_record of 'lbl list * record_representation | Type_variant of 'cstr list * variant_representation | Type_open -and abstract_reason = - Abstract_def - | Abstract_rec_check_regularity (* See Typedecl.transl_type_decl *) +and type_origin = + Definition + | Rec_check_regularity (* See Typedecl.transl_type_decl *) + | Existential of string and record_representation = Record_regular (* All fields are boxed / tagged *) diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 363c6a3f5e1..24cbf515d4b 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -526,22 +526,23 @@ and transl_type_aux env ~row_context ~aliased ~policy styp = | Ptyp_alias(st, alias) -> let cty = try - let t = TyVarEnv.lookup_local ~row_context alias in + let t = TyVarEnv.lookup_local ~row_context alias.txt in let ty = transl_type env ~policy ~aliased:true ~row_context st in begin try unify_var env t ty.ctyp_type with Unify err -> let err = Errortrace.swap_unification_error err in - raise(Error(styp.ptyp_loc, env, Alias_type_mismatch err)) + raise(Error(alias.loc, env, Alias_type_mismatch err)) end; ty with Not_found -> let t, ty = with_local_level_if_principal begin fun () -> let t = newvar () in - TyVarEnv.remember_used alias t styp.ptyp_loc; + (* Use the whole location, which is used by [Type_mismatch]. *) + TyVarEnv.remember_used alias.txt t styp.ptyp_loc; let ty = transl_type env ~policy ~row_context st in begin try unify_var env t ty.ctyp_type with Unify err -> let err = Errortrace.swap_unification_error err in - raise(Error(styp.ptyp_loc, env, Alias_type_mismatch err)) + raise(Error(alias.loc, env, Alias_type_mismatch err)) end; (t, ty) end @@ -550,8 +551,8 @@ and transl_type_aux env ~row_context ~aliased ~policy styp = let t = instance t in let px = Btype.proxy t in begin match get_desc px with - | Tvar None -> set_type_desc px (Tvar (Some alias)) - | Tunivar None -> set_type_desc px (Tunivar (Some alias)) + | Tvar None -> set_type_desc px (Tvar (Some alias.txt)) + | Tunivar None -> set_type_desc px (Tunivar (Some alias.txt)) | _ -> () end; { ty with ctyp_type = t } diff --git a/typing/rec_check.ml b/typing/value_rec_check.ml similarity index 92% rename from typing/rec_check.ml rename to typing/value_rec_check.ml index 2d1b9922a93..81981c65377 100644 --- a/typing/rec_check.ml +++ b/typing/value_rec_check.ml @@ -16,7 +16,11 @@ (* *) (**************************************************************************) -(** Static checking of recursive declarations +(** Static checking of recursive declarations, as described in + + A practical mode system for recursive definitions + Alban Reynaud, Gabriel Scherer and Jeremy Yallop + POPL 2021 Some recursive definitions are meaningful {[ @@ -106,7 +110,7 @@ exception Illegal_expr (** {1 Static or dynamic size} *) -type sd = Static | Dynamic +type sd = Value_rec_types.recursive_binding_kind let is_ref : Types.value_description -> bool = function | { Types.val_kind = @@ -142,7 +146,13 @@ let classify_expression : Typedtree.expression -> sd = The first definition can be allowed (`y` has a statically-known size) but the second one is unsound (`y` has no statically-known size). *) - let rec classify_expression env e = match e.exp_desc with + let rec classify_expression env e : sd = + let is_constant expr = + match classify_expression env expr with + | Constant -> true + | _ -> false + in + match e.exp_desc with (* binding and variable cases *) | Texp_let (rec_flag, vb, e) -> let env = classify_value_bindings rec_flag env vb in @@ -159,14 +169,29 @@ let classify_expression : Typedtree.expression -> sd = | Texp_construct (_, {cstr_tag = Cstr_unboxed}, [e]) -> classify_expression env e - | Texp_construct _ -> - Static + | Texp_construct (_, _, exprs) -> + if List.for_all is_constant exprs then Constant else Static + + | Texp_variant (_, Some expr) -> + if is_constant expr then Constant else Static + | Texp_variant (_, None) -> + Constant | Texp_record { representation = Record_unboxed _; fields = [| _, Overridden (_,e) |] } -> classify_expression env e - | Texp_record _ -> - Static + | Texp_record { fields; _ } -> + (* We ignore the [extended_expression] field. + As long as all fields are Overridden rather than Kept, the value + can be constant. *) + let is_constant_field (_label, def) = + match def with + | Kept _ -> false + | Overridden (_loc, expr) -> is_constant expr + in + if Array.for_all is_constant_field fields then Constant else Static + | Texp_tuple exprs -> + if List.for_all is_constant exprs then Constant else Static | Texp_apply ({exp_desc = Texp_ident (_, _, vd)}, _) when is_ref vd -> @@ -175,26 +200,31 @@ let classify_expression : Typedtree.expression -> sd = when List.exists is_abstracted_arg args -> Static | Texp_apply _ -> - Dynamic + Not_recursive - | Texp_for _ - | Texp_constant _ | Texp_new _ | Texp_instvar _ - | Texp_tuple _ | Texp_array _ - | Texp_variant _ - | Texp_setfield _ - | Texp_while _ - | Texp_setinstvar _ | Texp_pack _ | Texp_object _ | Texp_function _ | Texp_lazy _ - | Texp_unreachable | Texp_extension_constructor _ -> Static + | Texp_constant _ -> + Constant + + | Texp_for _ + | Texp_setfield _ + | Texp_while _ + | Texp_setinstvar _ -> + (* Unit-returning expressions *) + Constant + + | Texp_unreachable -> + Constant + | Texp_match _ | Texp_ifthenelse _ | Texp_send _ @@ -203,7 +233,7 @@ let classify_expression : Typedtree.expression -> sd = | Texp_try _ | Texp_override _ | Texp_letop _ -> - Dynamic + Not_recursive and classify_value_bindings rec_flag env bindings = (* We use a non-recursive classification, classifying each binding with respect to the old environment @@ -228,7 +258,7 @@ let classify_expression : Typedtree.expression -> sd = env in List.fold_left add_value_binding env bindings - and classify_path env = function + and classify_path env : _ -> Value_rec_types.recursive_binding_kind = function | Path.Pident x -> begin try Ident.find_same x env @@ -243,17 +273,17 @@ let classify_expression : Typedtree.expression -> sd = For non-local identifiers it might be reasonable (although not completely clear) to consider them Static (they have already been evaluated), but for the others we must - under-approximate with Dynamic. + under-approximate with Not_recursive. This could be fixed by a more complete implementation. *) - Dynamic + Not_recursive end | Path.Pdot _ | Path.Papply _ | Path.Pextra_ty _ -> (* local modules could have such paths to local definitions; classify_expression could be extend to compute module shapes more precisely *) - Dynamic + Not_recursive in classify_expression Ident.empty @@ -573,15 +603,33 @@ let rec expression : Typedtree.expression -> term_judg = *) expression arg << Guard | Texp_apply (e, args) -> - let arg (_, eo) = option expression eo in - let app_mode = if List.exists is_abstracted_arg args - then (* see the comment on Texp_apply in typedtree.mli; - the non-abstracted arguments are bound to local - variables, which corresponds to a Guard mode. *) - Guard - else Dereference + (* [args] may contain omitted arguments, corresponding to labels in + the function's type that were not passed in the actual application. + The arguments before the first omitted argument are passed to the + function immediately, so they are dereferenced. The arguments after + the first omitted one are stored in a closure, so guarded. + The function itself is called immediately (dereferenced) if there + is at least one argument before the first omitted one. + On the other hand, if the first argument is omitted then the + function is stored in the closure without being called. *) + let rec split_args ~has_omitted_arg = function + | [] -> [], [] + | (_, None) :: rest -> split_args ~has_omitted_arg:true rest + | (_, Some arg) :: rest -> + let applied, delayed = split_args ~has_omitted_arg rest in + if has_omitted_arg + then applied, arg :: delayed + else arg :: applied, delayed + in + let applied, delayed = split_args ~has_omitted_arg:false args in + let function_mode = + match applied with + | [] -> Guard + | _ :: _ -> Dereference in - join [expression e; list arg args] << app_mode + join [expression e << function_mode; + list expression applied << Dereference; + list expression delayed << Guard] | Texp_tuple exprs -> list expression exprs << Guard | Texp_array exprs -> @@ -1271,21 +1319,23 @@ and is_destructuring_pattern : type k . k general_pattern -> bool = | Tpat_or (l,r,_) -> is_destructuring_pattern l || is_destructuring_pattern r -let is_valid_recursive_expression idlist expr = +let is_valid_recursive_expression idlist expr : sd option = match expr.exp_desc with | Texp_function _ -> (* Fast path: functions can never have invalid recursive references *) - true + Some Static | _ -> match classify_expression expr with - | Static -> - (* The expression has known size *) + | (Static | Constant) as recursive -> let ty = expression expr Return in - Env.unguarded ty idlist = [] - | Dynamic -> - (* The expression has unknown size *) + if Env.unguarded ty idlist = [] then Some recursive else None + | Not_recursive -> let ty = expression expr Return in - Env.unguarded ty idlist = [] && Env.dependent ty idlist = [] + if Env.unguarded ty idlist = [] && Env.dependent ty idlist = [] + then Some Not_recursive + else None + | Class -> + assert false (* Not generated by [classify_expression] *) (* A class declaration may contain let-bindings. If they are recursive, their validity will already be checked by [is_valid_recursive_expression] diff --git a/typing/rec_check.mli b/typing/value_rec_check.mli similarity index 89% rename from typing/rec_check.mli rename to typing/value_rec_check.mli index aa5c1ca3c1a..71cf745c509 100644 --- a/typing/rec_check.mli +++ b/typing/value_rec_check.mli @@ -14,6 +14,9 @@ exception Illegal_expr -val is_valid_recursive_expression : Ident.t list -> Typedtree.expression -> bool +val is_valid_recursive_expression : + Ident.t list -> + Typedtree.expression -> + Value_rec_types.recursive_binding_kind option val is_valid_class_expr : Ident.t list -> Typedtree.class_expr -> bool diff --git a/typing/value_rec_types.mli b/typing/value_rec_types.mli new file mode 100644 index 00000000000..93be6ee9ba9 --- /dev/null +++ b/typing/value_rec_types.mli @@ -0,0 +1,42 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Vincent Laviron, OCamlPro *) +(* *) +(* Copyright 2023 OCamlPro, SAS *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(** Types related to the compilation of value let-recs (non-functional + recursive definitions) *) + +(** The kind of recursive bindings, as computed by + [Rec_check.classify_expression] *) +type recursive_binding_kind = +| Static + (** The expression evaluates to a function or block of a + statically known size. + It will be pre-allocated and back-patched later. + The expression can refer to recursive variables as long as it + does not inspect them during its evaluation. *) +| Constant + (** The expression evaluates to a value that does not contain any + occurrence of a recursive variable. + Combined with the invariant that recursive variables must never be + examined during the definitions, this special case allow using the + same rules as Static bindings (i.e. allow guarded occurrences of + recursive variables in the expression) for values that cannot be + back-patched (unit, integers, empty arrays, ...). *) +| Not_recursive + (** Non recursive bindings. Arbitrary expressions, that are not allowed to + refer to any recursive variable. *) +| Class + (** Bindings generated by the compilation of objects and classes. + These bindings are generated in Lambda form directly and never go through + [Rec_check], so to avoid re-implementing the classification pass on Lambda + we simply identify this special case with a dedicated constructor. *) diff --git a/utils/HACKING.adoc b/utils/HACKING.adoc index c4cb3b65035..6e46af090f1 100644 --- a/utils/HACKING.adoc +++ b/utils/HACKING.adoc @@ -1,6 +1,6 @@ == Magic numbers -The magic numbers in `config.common.ml` are included in the header of +The magic numbers in `config.common.ml.in` are included in the header of compiled files produced by the OCaml compiler. Different kind of files (cmi, cmo, cmx, cma, executables, etc.) get different magic numbers, and we also change the magic number whenever we change the format of @@ -15,8 +15,8 @@ that are not at all valid compiled files, or because they come from a different compiler version with an incompatible file format. We say that we "bump" a magic number when we update its version part -in config.common.ml. To bump all magic numbers is to increment the version -of every kind of magic number. +in build-aux/ocaml_version.m4. To bump all magic numbers is to +increment the version of every kind of magic number. The process for bootstrapping the compiler is covered in link:../BOOTSTRAP.adoc[BOOTSTRAP.adoc]. There is also a test script in CI which @@ -51,5 +51,11 @@ tested on a large scale: this is when tool authors may update their tools to test the new release, and if you update *after* that you risk breaking them again without them noticing. -For example, the magic numbers for 4.13 were updated in - dd7927e156b7cb2f9 +Since https://github.com/ocaml/ocaml/pull/12652/[PR #12652], simply run +the following command to bump the magic numbers to version xyz: + + tools/bump-magic-numbers xyz + +Once the bootstrap during which the magic numbers have been bumped +has been completed, the following files need to be committed: +boot/{ocamlc,ocamllex}, build-aux/ocaml_version.m4 and configure. diff --git a/utils/ccomp.ml b/utils/ccomp.ml index 33a4c9d0b41..afde5a6567c 100644 --- a/utils/ccomp.ml +++ b/utils/ccomp.ml @@ -115,7 +115,8 @@ let compile_file ?output ?(opt="") ?stable_name name = (String.concat " " (List.rev !Clflags.all_ccopts)) (quote_prefixed ~response_files:true "-I" (List.map (Misc.expand_directory Config.standard_library) - (List.rev !Clflags.include_dirs))) + (List.rev ( !Clflags.hidden_include_dirs + @ !Clflags.include_dirs)))) (Clflags.std_include_flag "-I") (Filename.quote name) (* cl tediously includes the name of the C file as the first thing it @@ -185,7 +186,7 @@ let call_linker mode output_name files extra = Config.native_pack_linker (Filename.quote output_name) (quote_prefixed ~response_files:true - l_prefix (Load_path.get_paths ())) + l_prefix (Load_path.get_path_list ())) (quote_files ~response_files:true (remove_Wl files)) extra else @@ -199,7 +200,8 @@ let call_linker mode output_name files extra = ) (Filename.quote output_name) "" (*(Clflags.std_include_flag "-I")*) - (quote_prefixed ~response_files:true "-L" (Load_path.get_paths ())) + (quote_prefixed ~response_files:true "-L" + (Load_path.get_path_list ())) (String.concat " " (List.rev !Clflags.all_ccopts)) (quote_files ~response_files:true files) extra diff --git a/utils/clflags.ml b/utils/clflags.ml index 5ba6e04688a..b7ac07204b3 100644 --- a/utils/clflags.ml +++ b/utils/clflags.ml @@ -46,7 +46,8 @@ let cmi_file = ref None let compile_only = ref false (* -c *) and output_name = ref (None : string option) (* -o *) -and include_dirs = ref ([] : string list)(* -I *) +and include_dirs = ref ([] : string list) (* -I *) +and hidden_include_dirs = ref ([] : string list) (* -H *) and no_std_include = ref false (* -nostdlib *) and no_cwd = ref false (* -nocwd *) and print_types = ref false (* -i *) diff --git a/utils/clflags.mli b/utils/clflags.mli index 0fc0c56e4f3..72a0053236a 100644 --- a/utils/clflags.mli +++ b/utils/clflags.mli @@ -75,6 +75,7 @@ val cmi_file : string option ref val compile_only : bool ref val output_name : string option ref val include_dirs : string list ref +val hidden_include_dirs : string list ref val no_std_include : bool ref val no_cwd : bool ref val print_types : bool ref diff --git a/utils/config.common.ml b/utils/config.common.ml.in similarity index 87% rename from utils/config.common.ml rename to utils/config.common.ml.in index 224ab2d95b6..05f63ff9381 100644 --- a/utils/config.common.ml +++ b/utils/config.common.ml.in @@ -1,4 +1,5 @@ -#2 "utils/config.common.ml" +(* @configure_input@ *) +#3 "utils/config.common.ml.in" (**************************************************************************) (* *) (* OCaml *) @@ -28,26 +29,18 @@ let standard_library = with Not_found -> standard_library_default -let exec_magic_number = "Caml1999X033" +let exec_magic_number = {magic|@EXEC_MAGIC_NUMBER@|magic} (* exec_magic_number is duplicated in runtime/caml/exec.h *) -and cmi_magic_number = "Caml1999I033" -and cmo_magic_number = "Caml1999O033" -and cma_magic_number = "Caml1999A033" -and cmx_magic_number = - if flambda then - "Caml1999y033" - else - "Caml1999Y033" -and cmxa_magic_number = - if flambda then - "Caml1999z033" - else - "Caml1999Z033" -and ast_impl_magic_number = "Caml1999M033" -and ast_intf_magic_number = "Caml1999N033" -and cmxs_magic_number = "Caml1999D033" -and cmt_magic_number = "Caml1999T033" -and linear_magic_number = "Caml1999L033" +and cmi_magic_number = {magic|@CMI_MAGIC_NUMBER@|magic} +and cmo_magic_number = {magic|@CMO_MAGIC_NUMBER@|magic} +and cma_magic_number = {magic|@CMA_MAGIC_NUMBER@|magic} +and cmx_magic_number = {magic|@CMX_MAGIC_NUMBER@|magic} +and cmxa_magic_number = {magic|@CMXA_MAGIC_NUMBER@|magic} +and ast_impl_magic_number = {magic|@AST_IMPL_MAGIC_NUMBER@|magic} +and ast_intf_magic_number = {magic|@AST_INTF_MAGIC_NUMBER@|magic} +and cmxs_magic_number = {magic|@CMXS_MAGIC_NUMBER@|magic} +and cmt_magic_number = {magic|@CMT_MAGIC_NUMBER@|magic} +and linear_magic_number = {magic|@LINEAR_MAGIC_NUMBER@|magic} let safe_string = true let default_safe_string = true diff --git a/utils/load_path.ml b/utils/load_path.ml index 4042fb8e7cc..08b94c83437 100644 --- a/utils/load_path.ml +++ b/utils/load_path.ml @@ -19,17 +19,22 @@ module STbl = Misc.Stdlib.String.Tbl (* Mapping from basenames to full filenames *) type registry = string STbl.t -let files : registry ref = s_table STbl.create 42 -let files_uncap : registry ref = s_table STbl.create 42 +let visible_files : registry ref = s_table STbl.create 42 +let visible_files_uncap : registry ref = s_table STbl.create 42 + +let hidden_files : registry ref = s_table STbl.create 42 +let hidden_files_uncap : registry ref = s_table STbl.create 42 module Dir = struct type t = { path : string; files : string list; + hidden : bool; } let path t = t.path let files t = t.files + let hidden t = t.hidden let find t fn = if List.mem fn t.files then @@ -56,26 +61,43 @@ module Dir = struct with Sys_error _ -> [||] - let create path = - { path; files = Array.to_list (readdir_compat path) } + let create ~hidden path = + { path; files = Array.to_list (readdir_compat path); hidden } end type auto_include_callback = (Dir.t -> string -> string option) -> string -> string -let dirs = s_ref [] +let visible_dirs = s_ref [] +let hidden_dirs = s_ref [] let no_auto_include _ _ = raise Not_found let auto_include_callback = ref no_auto_include let reset () = assert (not Config.merlin || Local_store.is_bound ()); - STbl.clear !files; - STbl.clear !files_uncap; - dirs := []; + STbl.clear !hidden_files; + STbl.clear !hidden_files_uncap; + STbl.clear !visible_files; + STbl.clear !visible_files_uncap; + hidden_dirs := []; + visible_dirs := []; auto_include_callback := no_auto_include -let get () = List.rev !dirs -let get_paths () = List.rev_map Dir.path !dirs +let get_visible () = List.rev !visible_dirs + +let get_path_list () = + Misc.rev_map_end Dir.path !visible_dirs (List.rev_map Dir.path !hidden_dirs) + +type paths = + { visible : string list; + hidden : string list } + +let get_paths () = + { visible = List.rev_map Dir.path !visible_dirs; + hidden = List.rev_map Dir.path !hidden_dirs } + +let get_visible_path_list () = List.rev_map Dir.path !visible_dirs +let get_hidden_path_list () = List.rev_map Dir.path !hidden_dirs (* Optimized version of [add] below, for use in [init] and [remove_dir]: since we are starting from an empty cache, we can avoid checking whether a unit @@ -84,51 +106,73 @@ let get_paths () = List.rev_map Dir.path !dirs let prepend_add dir = List.iter (fun base -> let fn = Filename.concat dir.Dir.path base in - STbl.replace !files base fn; - STbl.replace !files_uncap (Misc.normalized_unit_filename base) fn + let filename = Misc.normalized_unit_filename base in + if dir.Dir.hidden then begin + STbl.replace !hidden_files base fn; + STbl.replace !hidden_files_uncap filename fn + end else begin + STbl.replace !visible_files base fn; + STbl.replace !visible_files_uncap filename fn + end ) dir.Dir.files -let init ~auto_include l = +let init ~auto_include ~visible ~hidden = reset (); - dirs := List.rev_map Dir.create l; - List.iter prepend_add !dirs; + visible_dirs := List.rev_map (Dir.create ~hidden:false) visible; + hidden_dirs := List.rev_map (Dir.create ~hidden:true) hidden; + List.iter prepend_add !hidden_dirs; + List.iter prepend_add !visible_dirs; auto_include_callback := auto_include let remove_dir dir = assert (not Config.merlin || Local_store.is_bound ()); - let new_dirs = List.filter (fun d -> Dir.path d <> dir) !dirs in - if List.compare_lengths new_dirs !dirs <> 0 then begin + let visible = List.filter (fun d -> Dir.path d <> dir) !visible_dirs in + let hidden = List.filter (fun d -> Dir.path d <> dir) !hidden_dirs in + if List.compare_lengths visible !visible_dirs <> 0 + || List.compare_lengths hidden !hidden_dirs <> 0 then begin reset (); - List.iter prepend_add new_dirs; - dirs := new_dirs + visible_dirs := visible; + hidden_dirs := hidden; + List.iter prepend_add hidden; + List.iter prepend_add visible end (* General purpose version of function to add a new entry to load path: We only - add a basename to the cache if it is not already present in the cache, in - order to enforce left-to-right precedence. *) -let add dir = + add a basename to the cache if it is not already present, in order to enforce + left-to-right precedence. *) +let add (dir : Dir.t) = assert (not Config.merlin || Local_store.is_bound ()); + let update base fn visible_files hidden_files = + if dir.hidden && not (STbl.mem !hidden_files base) then + STbl.replace !hidden_files base fn + else if not (STbl.mem !visible_files base) then + STbl.replace !visible_files base fn + in List.iter (fun base -> let fn = Filename.concat dir.Dir.path base in - if not (STbl.mem !files base) then - STbl.replace !files base fn; + update base fn visible_files hidden_files; let ubase = Misc.normalized_unit_filename base in - if not (STbl.mem !files_uncap ubase) then - STbl.replace !files_uncap ubase fn) - dir.Dir.files; - dirs := dir :: !dirs + update ubase fn visible_files_uncap hidden_files_uncap) + dir.files; + if dir.hidden then + hidden_dirs := dir :: !hidden_dirs + else + visible_dirs := dir :: !visible_dirs let append_dir = add -let add_dir dir = add (Dir.create dir) +let add_dir ~hidden dir = add (Dir.create ~hidden dir) (* Add the directory at the start of load path - so basenames are unconditionally added. *) -let prepend_dir dir = +let prepend_dir (dir : Dir.t) = assert (not Config.merlin || Local_store.is_bound ()); prepend_add dir; - dirs := !dirs @ [dir] + if dir.hidden then + hidden_dirs := !hidden_dirs @ [dir] + else + visible_dirs := !visible_dirs @ [dir] let is_basename fn = Filename.basename fn = fn @@ -150,27 +194,40 @@ let auto_include_otherlibs = (* Ensure directories are only ever scanned once *) let expand = Misc.expand_directory Config.standard_library in let otherlibs = - let read_lib lib = lazy (Dir.create (expand ("+" ^ lib))) in + let read_lib lib = lazy (Dir.create ~hidden:false (expand ("+" ^ lib))) in List.map (fun lib -> (lib, read_lib lib)) ["dynlink"; "str"; "unix"] in auto_include_libs otherlibs +type visibility = Visible | Hidden + +let find_file_in_cache fn visible_files hidden_files = + try (STbl.find !visible_files fn, Visible) with + | Not_found -> (STbl.find !hidden_files fn, Hidden) + let find fn = assert (not Config.merlin || Local_store.is_bound ()); try if is_basename fn && not !Sys.interactive then - STbl.find !files fn + fst (find_file_in_cache fn visible_files hidden_files) else - Misc.find_in_path (get_paths ()) fn + Misc.find_in_path (get_path_list ()) fn with Not_found -> !auto_include_callback Dir.find fn -let find_normalized fn = +let find_normalized_with_visibility fn = assert (not Config.merlin || Local_store.is_bound ()); try if is_basename fn && not !Sys.interactive then - STbl.find !files_uncap (Misc.normalized_unit_filename fn) + find_file_in_cache (Misc.normalized_unit_filename fn) + visible_files_uncap hidden_files_uncap else - Misc.find_in_path_normalized (get_paths ()) fn + try + (Misc.find_in_path_normalized (get_visible_path_list ()) fn, Visible) + with + | Not_found -> + (Misc.find_in_path_normalized (get_hidden_path_list ()) fn, Hidden) with Not_found -> let fn_uncap = Misc.normalized_unit_filename fn in - !auto_include_callback Dir.find_normalized fn_uncap + (!auto_include_callback Dir.find_normalized fn_uncap, Visible) + +let find_normalized fn = fst (find_normalized_with_visibility fn) diff --git a/utils/load_path.mli b/utils/load_path.mli index 636ce23c6e5..488b75f760d 100644 --- a/utils/load_path.mli +++ b/utils/load_path.mli @@ -14,15 +14,15 @@ (** Management of include directories. - This module offers a high level interface to locating files in the - load path, which is constructed from [-I] command line flags and a few + This module offers a high level interface to locating files in the load + path, which is constructed from [-I] and [-H] command line flags and a few other parameters. It makes the assumption that the contents of include directories doesn't change during the execution of the compiler. *) -val add_dir : string -> unit +val add_dir : hidden:bool -> string -> unit (** Add a directory to the end of the load path (i.e. at lowest priority.) *) val remove_dir : string -> unit @@ -35,7 +35,7 @@ module Dir : sig type t (** Represent one directory in the load path. *) - val create : string -> t + val create : hidden:bool -> string -> t val path : t -> string @@ -43,6 +43,10 @@ module Dir : sig (** All the files in that directory. This doesn't include files in sub-directories of this directory. *) + val hidden : t -> bool + (** If the modules in this directory should not be bound in the initial + scope *) + val find : t -> string -> string option (** [find dir fn] returns the full path to [fn] in [dir]. *) @@ -59,8 +63,13 @@ val no_auto_include : auto_include_callback (** No automatic directory inclusion: misses in the load path raise [Not_found] as normal. *) -val init : auto_include:auto_include_callback -> string list -> unit -(** [init l] is the same as [reset (); List.iter add_dir (List.rev l)] *) +val init : + auto_include:auto_include_callback -> visible:string list -> + hidden:string list -> unit +(** [init ~visible ~hidden] is the same as + [reset (); + List.iter add_dir (List.rev hidden); + List.iter add_dir (List.rev visible)] *) val auto_include_otherlibs : (string -> unit) -> auto_include_callback @@ -68,9 +77,16 @@ val auto_include_otherlibs : {!Load_path.init} and automatically adds [-I +lib] to the load path after calling [alert lib]. *) -val get_paths : unit -> string list +val get_path_list : unit -> string list (** Return the list of directories passed to [add_dir] so far. *) +type paths = + { visible : string list; + hidden : string list } + +val get_paths : unit -> paths +(** Return the directories passed to [add_dir] so far. *) + val find : string -> string (** Locate a file in the load path. Raise [Not_found] if the file cannot be found. This function is optimized for the case where the @@ -82,6 +98,12 @@ val find_normalized : string -> string {!Misc.normalized_unit_filename}), i.e. if name is [Foo.ml], allow [/path/Foo.ml] and [/path/foo.ml] to match. *) +type visibility = Visible | Hidden + +val find_normalized_with_visibility : string -> string * visibility +(** Same as [find_normalized], but also reports whether the cmi was found in a + -I directory (Visible) or a -H directory (Hidden) *) + val[@deprecated] add : Dir.t -> unit (** Old name for {!append_dir} *) @@ -93,5 +115,6 @@ val prepend_dir : Dir.t -> unit (** [prepend_dir d] adds [d] to the start of the load path (i.e. at highest priority. *) -val get : unit -> Dir.t list -(** Same as [get_paths ()], except that it returns a [Dir.t list]. *) +val get_visible : unit -> Dir.t list +(** Same as [get_paths ()], except that it returns a [Dir.t list], and doesn't + include the -H paths. *) diff --git a/utils/misc.ml b/utils/misc.ml index a5639a7cccf..8a7883b4276 100644 --- a/utils/misc.ml +++ b/utils/misc.ml @@ -70,6 +70,13 @@ let rec map_end f l1 l2 = [] -> l2 | hd::tl -> f hd :: map_end f tl l2 +let rev_map_end f l1 l2 = + let rec rmap_f accu = function + | [] -> accu + | hd::tl -> rmap_f (f hd :: accu) tl + in + rmap_f l2 l1 + let rec map_left_right f = function [] -> [] | hd::tl -> let res = f hd in res :: map_left_right f tl @@ -126,6 +133,14 @@ module Stdlib = struct in aux [] l1 l2 + let rec iteri2 i f l1 l2 = + match (l1, l2) with + ([], []) -> () + | (a1::l1, a2::l2) -> f i a1 a2; iteri2 (i + 1) f l1 l2 + | (_, _) -> raise (Invalid_argument "iteri2") + + let iteri2 f l1 l2 = iteri2 0 f l1 l2 + let some_if_all_elements_are_some l = let rec aux acc l = match l with @@ -398,6 +413,12 @@ let no_overflow_mul a b = let no_overflow_lsl a k = 0 <= k && k < Sys.word_size - 1 && min_int asr k <= a && a <= max_int asr k +let letter_of_int n = + let letter = String.make 1 (Char.chr (Char.code 'a' + n mod 26)) in + let num = n / 26 in + if num = 0 then letter + else letter ^ Int.to_string num + module Int_literal_converter = struct (* To convert integer literals, allowing max_int + 1 (PR#4210) *) let cvt_int_aux str neg of_string = @@ -513,53 +534,6 @@ let thd4 (_,_,x,_) = x let for4 (_,_,_,x) = x -module LongString = struct - type t = bytes array - - let create str_size = - let tbl_size = str_size / Sys.max_string_length + 1 in - let tbl = Array.make tbl_size Bytes.empty in - for i = 0 to tbl_size - 2 do - tbl.(i) <- Bytes.create Sys.max_string_length; - done; - tbl.(tbl_size - 1) <- Bytes.create (str_size mod Sys.max_string_length); - tbl - - let length tbl = - let tbl_size = Array.length tbl in - Sys.max_string_length * (tbl_size - 1) + Bytes.length tbl.(tbl_size - 1) - - let get tbl ind = - Bytes.get tbl.(ind / Sys.max_string_length) (ind mod Sys.max_string_length) - - let set tbl ind c = - Bytes.set tbl.(ind / Sys.max_string_length) (ind mod Sys.max_string_length) - c - - let blit src srcoff dst dstoff len = - for i = 0 to len - 1 do - set dst (dstoff + i) (get src (srcoff + i)) - done - - let output oc tbl pos len = - for i = pos to pos + len - 1 do - output_char oc (get tbl i) - done - - let input_bytes_into tbl ic len = - let count = ref len in - Array.iter (fun str -> - let chunk = Int.min !count (Bytes.length str) in - really_input ic str 0 chunk; - count := !count - chunk) tbl - - let input_bytes ic len = - let tbl = create len in - input_bytes_into tbl ic len; - tbl -end - - let cut_at s c = let pos = String.index s c in String.sub s 0 pos, String.sub s (pos+1) (String.length s - pos - 1) diff --git a/utils/misc.mli b/utils/misc.mli index d10396fcb45..6deedc49349 100644 --- a/utils/misc.mli +++ b/utils/misc.mli @@ -77,6 +77,9 @@ val reraise_preserving_backtrace : exn -> (unit -> unit) -> 'a val map_end: ('a -> 'b) -> 'a list -> 'b list -> 'b list (** [map_end f l t] is [map f l @ t], just more efficient. *) +val rev_map_end: ('a -> 'b) -> 'a list -> 'b list -> 'b list + (** [map_end f l t] is [map f (rev l) @ t], just more efficient. *) + val map_left_right: ('a -> 'b) -> 'a list -> 'b list (** Like [List.map], with guaranteed left-to-right evaluation order *) @@ -128,6 +131,10 @@ module Stdlib : sig If [l1] is of length n and [l2 = h2 @ t2] with h2 of length n, r1 is [List.map2 f l1 h1] and r2 is t2. *) + val iteri2 : (int -> 'a -> 'b -> unit) -> 'a list -> 'b list -> unit + (** Same as {!List.iter2}, but the function is applied to the index of + the element as first argument (counting from 0) *) + val split_at : int -> 'a t -> 'a t * 'a t (** [split_at n l] returns the pair [before, after] where [before] is the [n] first elements of [l] and [after] the remaining ones. @@ -307,6 +314,8 @@ val no_overflow_lsl: int -> int -> bool (** [no_overflow_lsl n k] returns [true] if the computation of [n lsl k] does not overflow. *) +val letter_of_int : int -> string + module Int_literal_converter : sig val int : string -> int (** Convert a string to an integer. Unlike {!Stdlib.int_of_string}, @@ -416,23 +425,6 @@ val snd4: 'a * 'b * 'c * 'd -> 'b val thd4: 'a * 'b * 'c * 'd -> 'c val for4: 'a * 'b * 'c * 'd -> 'd -(** {1 Long strings} *) - -(** ``Long strings'' are mutable arrays of characters that are not limited - in length to {!Sys.max_string_length}. *) - -module LongString : - sig - type t = bytes array - val create : int -> t - val length : t -> int - val get : t -> int -> char - val set : t -> int -> char -> unit - val blit : t -> int -> t -> int -> int -> unit - val output : out_channel -> t -> int -> int -> unit - val input_bytes : in_channel -> int -> t - end - (** {1 Spell checking and ``did you mean'' suggestions} *) val edit_distance : string -> string -> int -> int option diff --git a/utils/warnings.ml b/utils/warnings.ml index 65721fe1b09..1812e0a3412 100644 --- a/utils/warnings.ml +++ b/utils/warnings.ml @@ -944,7 +944,8 @@ let message = function | Wildcard_arg_to_constant_constr -> "wildcard pattern given as argument to a constant constructor" | Eol_in_string -> - "unescaped end-of-line in a string constant (non-portable code)" + "unescaped end-of-line in a string constant\n\ + (non-portable behavior before OCaml 5.2)" | Duplicate_definitions (kind, cname, tc1, tc2) -> Printf.sprintf "the %s %s is defined in both types %s and %s." kind cname tc1 tc2 diff --git a/utils/warnings.mli b/utils/warnings.mli index 8af3d53b437..f0a4b1c9239 100644 --- a/utils/warnings.mli +++ b/utils/warnings.mli @@ -68,7 +68,11 @@ type t = | Unused_var of string (* 26 *) | Unused_var_strict of string (* 27 *) | Wildcard_arg_to_constant_constr (* 28 *) - | Eol_in_string (* 29 *) + | Eol_in_string (* 29 + Note: since OCaml 5.2, the lexer normalizes \r\n sequences in + the source file to a single \n character, so the behavior of + newlines in string literals is portable. This warning is + never emitted anymore. *) | Duplicate_definitions of string * string * string * string (* 30 *) | Unused_value_declaration of string (* 32 *) | Unused_open of string (* 33 *) diff --git a/yacc/defs.h b/yacc/defs.h index 355588abcb2..0089b70bcb6 100644 --- a/yacc/defs.h +++ b/yacc/defs.h @@ -320,25 +320,25 @@ extern action *add_reductions(int stateno, action *actions); extern action *add_reduce(action *actions, int ruleno, int symbol); extern void closure (short int *nucleus, int n); extern void create_symbol_table (void); -extern CAMLnoret void default_action_error (void); -extern CAMLnoret void done (int k); -extern CAMLnoret void entry_without_type (char *s); -extern CAMLnoret void fatal (char *msg); +CAMLnoret extern void default_action_error (void); +CAMLnoret extern void done (int k); +CAMLnoret extern void entry_without_type (char *s); +CAMLnoret extern void fatal (char *msg); extern void finalize_closure (void); extern void free_parser (void); extern void free_symbol_table (void); extern void free_symbols (void); -extern CAMLnoret void illegal_character (char *c_cptr); -extern CAMLnoret void illegal_token_ref (int i, char *name); +CAMLnoret extern void illegal_character (char *c_cptr); +CAMLnoret extern void illegal_token_ref (int i, char *name); extern void lalr (void); extern void lr0 (void); extern void make_parser (void); -extern CAMLnoret void no_grammar (void); -extern CAMLnoret void no_space (void); -extern CAMLnoret void open_error (char_os *filename); +CAMLnoret extern void no_grammar (void); +CAMLnoret extern void no_space (void); +CAMLnoret extern void open_error (char_os *filename); extern void output (void); extern void prec_redeclared (void); -extern CAMLnoret void polymorphic_entry_point(char *s); +CAMLnoret extern void polymorphic_entry_point(char *s); extern void forbidden_conflicts (void); extern void reader (void); extern void reflexive_transitive_closure (unsigned int *R, int n); @@ -346,20 +346,20 @@ extern void reprec_warning (char *s); extern void retyped_warning (char *s); extern void revalued_warning (char *s); extern void set_first_derives (void); -extern CAMLnoret void syntax_error (int st_lineno, char *st_line, char *st_cptr); -extern CAMLnoret void terminal_lhs (int s_lineno); -extern CAMLnoret void terminal_start (char *s); -extern CAMLnoret void tokenized_start (char *s); -extern CAMLnoret void too_many_entries (void); +CAMLnoret extern void syntax_error (int st_lineno, char *st_line, char *st_cptr); +CAMLnoret extern void terminal_lhs (int s_lineno); +CAMLnoret extern void terminal_start (char *s); +CAMLnoret extern void tokenized_start (char *s); +CAMLnoret extern void too_many_entries (void); extern void undefined_goal (char *s); extern void undefined_symbol (char *s); -extern CAMLnoret void unexpected_EOF (void); -extern CAMLnoret void unknown_rhs (int i); -extern CAMLnoret void unterminated_action (int a_lineno, char *a_line, char *a_cptr); -extern CAMLnoret void unterminated_comment (int c_lineno, char *c_line, char *c_cptr, char start_char); -extern CAMLnoret void unterminated_string (int s_lineno, char *s_line, char *s_cptr); -extern CAMLnoret void unterminated_text (int t_lineno, char *t_line, char *t_cptr); -extern CAMLnoret void used_reserved (char *s); +CAMLnoret extern void unexpected_EOF (void); +CAMLnoret extern void unknown_rhs (int i); +CAMLnoret extern void unterminated_action (int a_lineno, char *a_line, char *a_cptr); +CAMLnoret extern void unterminated_comment (int c_lineno, char *c_line, char *c_cptr, char start_char); +CAMLnoret extern void unterminated_string (int s_lineno, char *s_line, char *s_cptr); +CAMLnoret extern void unterminated_text (int t_lineno, char *t_line, char *t_cptr); +CAMLnoret extern void used_reserved (char *s); extern void verbose (void); extern void write_section (char **section); -extern CAMLnoret void invalid_literal(int s_lineno, char *s_line, char *s_cptr); +CAMLnoret extern void invalid_literal(int s_lineno, char *s_line, char *s_cptr); diff --git a/yacc/main.c b/yacc/main.c index d15b5cc527d..d2c16513776 100644 --- a/yacc/main.c +++ b/yacc/main.c @@ -21,6 +21,9 @@ #ifdef HAS_UNISTD #include #endif +#ifdef _WIN32 +#include +#endif #include "caml/version.h"